From 3af0951f9a11677240efa6228683dd4fcea13eaf Mon Sep 17 00:00:00 2001 From: "Dr. Tobias Quathamer" Date: Mon, 18 Jul 2016 17:11:33 +0200 Subject: [PATCH] Imported Upstream version 2.19.45 --- .gitfilelist | 407 +- .gitignore | 3 +- .mailmap | 5 +- AUTHORS.txt | 110 +- Documentation/ca/GNUmakefile | 6 + Documentation/ca/included/.gitignore | 0 Documentation/ca/learning.tely | 84 + .../ca/learning/common-notation.itely | 1611 +++ Documentation/ca/learning/fundamental.itely | 3319 +++++ Documentation/ca/learning/templates.itely | 245 + Documentation/ca/learning/tutorial.itely | 849 ++ Documentation/ca/learning/tweaks.itely | 4851 +++++++ Documentation/ca/macros.itexi | 823 ++ Documentation/ca/search-box.ihtml | 26 + Documentation/ca/translations.itexi | 541 + Documentation/ca/usage.tely | 88 + Documentation/ca/usage/running.itely | 1201 ++ Documentation/ca/usage/suggestions.itely | 634 + Documentation/ca/usage/updating.itely | 331 + Documentation/ca/web.texi | 347 + Documentation/ca/web/community.itexi | 1284 ++ Documentation/ca/web/download.itexi | 624 + Documentation/ca/web/introduction.itexi | 1452 ++ Documentation/ca/web/manuals.itexi | 628 + Documentation/ca/web/news-front.itexi | 280 + Documentation/changes.tely | 1082 +- Documentation/common-macros.itexi | 9 +- Documentation/contributor.texi | 11 +- .../contributor/administration.itexi | 480 +- Documentation/contributor/build-notes.itexi | 64 - .../contributor/doc-translation-list.itexi | 78 +- Documentation/contributor/doc-work.itexi | 116 +- Documentation/contributor/introduction.itexi | 121 +- Documentation/contributor/issues.itexi | 475 +- Documentation/contributor/lsr-work.itexi | 88 +- .../contributor/programming-work.itexi | 224 +- Documentation/contributor/quick-start.itexi | 537 +- Documentation/contributor/release-work.itexi | 56 +- Documentation/contributor/source-code.itexi | 553 +- Documentation/contributor/website-work.itexi | 41 +- Documentation/cs/learning.tely | 2 +- .../cs/learning/common-notation.itely | 266 +- Documentation/cs/learning/fundamental.itely | 413 +- Documentation/cs/learning/templates.itely | 2 +- Documentation/cs/learning/tutorial.itely | 58 +- Documentation/cs/learning/tweaks.itely | 425 +- Documentation/cs/translations.itexi | 60 +- Documentation/cs/usage/lilypond-book.itely | 26 +- Documentation/cs/usage/running.itely | 14 +- Documentation/cs/usage/suggestions.itely | 16 +- Documentation/cs/web.texi | 2 +- Documentation/cs/web/community.itexi | 6 +- Documentation/cs/web/introduction.itexi | 6 +- Documentation/cs/web/manuals.itexi | 2 +- ...ixes.css => lilypond-manuals-ie-fixes.css} | 1 - Documentation/css/lilypond-manuals.css | 133 +- .../css/lilypond-website-ie-fixes.css | 56 + Documentation/css/lilypond-website.css | 479 +- Documentation/de/essay.tely | 4 +- Documentation/de/essay/engraving.itely | 105 +- Documentation/de/extending.tely | 6 +- .../de/extending/programming-interface.itely | 62 +- .../de/extending/scheme-tutorial.itely | 30 +- .../de/included/generating-output.itexi | 4 +- Documentation/de/included/helpus.itexi | 6 +- Documentation/de/learning.tely | 21 +- .../de/learning/common-notation.itely | 827 +- Documentation/de/learning/fundamental.itely | 939 +- Documentation/de/learning/templates.itely | 466 +- Documentation/de/learning/tutorial.itely | 279 +- Documentation/de/learning/tweaks.itely | 2057 +-- Documentation/de/macros.itexi | 2 +- Documentation/de/notation.tely | 2 +- Documentation/de/notation/ancient.itely | 102 +- .../de/notation/changing-defaults.itely | 500 +- Documentation/de/notation/cheatsheet.itely | 32 +- Documentation/de/notation/chords.itely | 28 +- Documentation/de/notation/contemporary.itely | 3 +- Documentation/de/notation/editorial.itely | 158 +- Documentation/de/notation/expressive.itely | 477 +- .../de/notation/fretted-strings.itely | 98 +- Documentation/de/notation/input.itely | 139 +- Documentation/de/notation/keyboards.itely | 73 +- .../de/notation/notation-appendices.itely | 8 +- Documentation/de/notation/percussion.itely | 4 +- Documentation/de/notation/pitches.itely | 492 +- Documentation/de/notation/repeats.itely | 315 +- Documentation/de/notation/rhythms.itely | 801 +- Documentation/de/notation/simultaneous.itely | 278 +- Documentation/de/notation/spacing.itely | 184 +- Documentation/de/notation/staff.itely | 336 +- Documentation/de/notation/text.itely | 380 +- .../de/notation/unfretted-strings.itely | 49 +- Documentation/de/notation/vocal.itely | 358 +- Documentation/de/notation/wind.itely | 43 +- Documentation/de/notation/world.itely | 16 +- Documentation/de/search-box.ihtml | 6 +- .../alternative-bar-numbering.texidoc | 2 +- .../texidocs/glissandi-can-skip-grobs.texidoc | 2 +- .../de/texidocs/strict-beat-beaming.texidoc | 2 +- Documentation/de/translations.itexi | 260 +- Documentation/de/usage.tely | 2 +- Documentation/de/usage/external.itely | 20 +- Documentation/de/usage/lilypond-book.itely | 30 +- Documentation/de/usage/running.itely | 48 +- Documentation/de/usage/suggestions.itely | 23 +- Documentation/de/usage/updating.itely | 2 +- Documentation/de/web.texi | 125 +- Documentation/de/web/community.itexi | 394 +- Documentation/de/web/download.itexi | 151 +- Documentation/de/web/introduction.itexi | 667 +- Documentation/de/web/manuals.itexi | 119 +- Documentation/es/changes.tely | 1197 +- Documentation/es/essay.tely | 11 +- Documentation/es/essay/engraving.itely | 113 +- Documentation/es/essay/literature.itely | 15 +- Documentation/es/extending.tely | 11 +- .../es/extending/programming-interface.itely | 1124 +- .../es/extending/scheme-tutorial.itely | 1005 +- .../es/included/generating-output.itexi | 11 +- Documentation/es/learning.tely | 11 +- .../es/learning/common-notation.itely | 937 +- Documentation/es/learning/fundamental.itely | 2415 ++-- Documentation/es/learning/templates.itely | 360 +- Documentation/es/learning/tutorial.itely | 458 +- Documentation/es/learning/tweaks.itely | 3381 ++--- Documentation/es/notation.tely | 39 +- Documentation/es/notation/ancient.itely | 1396 +- .../es/notation/changing-defaults.itely | 3184 +++-- Documentation/es/notation/cheatsheet.itely | 36 +- Documentation/es/notation/chords.itely | 447 +- Documentation/es/notation/editorial.itely | 633 +- Documentation/es/notation/expressive.itely | 836 +- .../es/notation/fretted-strings.itely | 813 +- Documentation/es/notation/input.itely | 2920 ++-- Documentation/es/notation/keyboards.itely | 341 +- .../es/notation/notation-appendices.itely | 1394 +- Documentation/es/notation/percussion.itely | 204 +- Documentation/es/notation/pitches.itely | 1627 ++- Documentation/es/notation/repeats.itely | 684 +- Documentation/es/notation/rhythms.itely | 2723 ++-- Documentation/es/notation/simultaneous.itely | 848 +- Documentation/es/notation/spacing.itely | 2854 ++-- Documentation/es/notation/staff.itely | 966 +- Documentation/es/notation/text.itely | 913 +- .../es/notation/unfretted-strings.itely | 147 +- Documentation/es/notation/vocal.itely | 1661 +-- Documentation/es/notation/wind.itely | 186 +- Documentation/es/notation/world.itely | 18 +- Documentation/es/search-box.ihtml | 10 +- Documentation/es/translations.itexi | 88 +- Documentation/es/usage.tely | 11 +- Documentation/es/usage/external.itely | 459 +- Documentation/es/usage/lilypond-book.itely | 857 +- Documentation/es/usage/running.itely | 363 +- Documentation/es/usage/suggestions.itely | 467 +- Documentation/es/usage/updating.itely | 305 +- Documentation/es/web.texi | 94 +- Documentation/es/web/community.itexi | 594 +- Documentation/es/web/download.itexi | 71 +- Documentation/es/web/introduction.itexi | 1305 +- Documentation/es/web/manuals.itexi | 8 +- Documentation/es/web/news-front.itexi | 171 +- Documentation/es/web/news.itexi | 1747 ++- Documentation/essay.tely | 9 +- Documentation/essay/engraving.itely | 112 +- Documentation/essay/engravingbib.bib | 23 + Documentation/essay/literature.itely | 15 +- Documentation/extending.tely | 9 +- .../extending/programming-interface.itely | 346 +- Documentation/extending/scheme-tutorial.itely | 135 +- Documentation/fr/essay.tely | 13 +- Documentation/fr/essay/engraving.itely | 123 +- Documentation/fr/essay/literature.itely | 24 +- Documentation/fr/extending.tely | 11 +- .../fr/extending/programming-interface.itely | 473 +- .../fr/extending/scheme-tutorial.itely | 167 +- .../fr/included/generating-output.itexi | 12 +- Documentation/fr/learning.tely | 11 +- .../fr/learning/common-notation.itely | 516 +- Documentation/fr/learning/fundamental.itely | 545 +- Documentation/fr/learning/templates.itely | 350 +- Documentation/fr/learning/tutorial.itely | 124 +- Documentation/fr/learning/tweaks.itely | 1289 +- Documentation/fr/notation.tely | 13 +- Documentation/fr/notation/ancient.itely | 525 +- .../fr/notation/changing-defaults.itely | 1592 ++- Documentation/fr/notation/cheatsheet.itely | 38 +- Documentation/fr/notation/chords.itely | 90 +- Documentation/fr/notation/contemporary.itely | 9 +- Documentation/fr/notation/editorial.itely | 528 +- Documentation/fr/notation/expressive.itely | 611 +- .../fr/notation/fretted-strings.itely | 397 +- Documentation/fr/notation/input.itely | 1691 ++- Documentation/fr/notation/keyboards.itely | 139 +- .../fr/notation/notation-appendices.itely | 1078 +- Documentation/fr/notation/percussion.itely | 114 +- Documentation/fr/notation/pitches.itely | 929 +- Documentation/fr/notation/repeats.itely | 436 +- Documentation/fr/notation/rhythms.itely | 1658 +-- Documentation/fr/notation/simultaneous.itely | 455 +- Documentation/fr/notation/spacing.itely | 972 +- Documentation/fr/notation/staff.itely | 599 +- Documentation/fr/notation/text.itely | 574 +- .../fr/notation/unfretted-strings.itely | 79 +- Documentation/fr/notation/vocal.itely | 616 +- Documentation/fr/notation/wind.itely | 61 +- Documentation/fr/notation/world.itely | 18 +- Documentation/fr/search-box.ihtml | 8 +- .../accordion-discant-symbols.texidoc | 2 +- .../fr/texidocs/accordion-registers.texidoc | 11 - ...ured-bass-above-or-below-the-notes.texidoc | 4 +- .../texidocs/adding-ambitus-per-voice.texidoc | 2 +- ...ing-an-extra-staff-at-a-line-break.texidoc | 2 +- .../fr/texidocs/adding-an-extra-staff.texidoc | 2 +- ...n-ottava-marking-to-a-single-voice.texidoc | 2 +- ...ng-bar-lines-to-chordnames-context.texidoc | 2 +- ...sing-tuplet-and-non-tuplet-rhythms.texidoc | 8 +- .../fr/texidocs/adding-drum-parts.texidoc | 2 +- ...adding-extra-fingering-with-scheme.texidoc | 2 +- .../adding-fingerings-to-a-score.texidoc | 2 +- .../adding-fingerings-to-tablatures.texidoc | 2 +- ...aves-which-get-split-after-a-break.texidoc | 7 +- .../texidocs/adding-links-to-objects.texidoc | 2 +- ...g-orchestral-cues-to-a-vocal-score.texidoc | 3 +- ...an-expressive-mark-or-chordal-note.texidoc | 2 +- ...adding-the-current-date-to-a-score.texidoc | 3 +- ...ing-timing-marks-to-long-glissandi.texidoc | 2 +- ...olta-brackets-to-additional-staves.texidoc | 5 +- ...itional-voices-to-avoid-collisions.texidoc | 2 +- .../adjusting-grace-note-spacing.texidoc | 2 +- .../adjusting-lyrics-vertical-spacing.texidoc | 2 +- ...sting-the-shape-of-falls-and-doits.texidoc | 2 +- ...ing-and-centering-instrument-names.texidoc | 2 +- .../fr/texidocs/aligning-bar-numbers.texidoc | 2 +- ...cts-created-with-the--mark-command.texidoc | 2 +- .../aligning-syllables-with-melisma.texidoc | 6 +- ...ngs-to-be-printed-inside-the-staff.texidoc | 4 +- ...ltering-the-length-of-beamed-stems.texidoc | 2 +- .../alternative-bar-numbering.texidoc | 2 +- .../texidocs/alternative-breve-notes.texidoc | 2 +- .../ambitus-with-multiple-voices.texidoc | 3 +- Documentation/fr/texidocs/ambitus.texidoc | 2 +- .../analysis-brackets-above-the-staff.texidoc | 2 +- .../fr/texidocs/ancient-fonts.texidoc | 6 +- ...n-transcription-of-gregorian-music.texidoc | 2 +- ...rn-transcription-of-mensural-music.texidoc | 12 - .../texidocs/ancient-time-signatures.texidoc | 2 +- .../texidocs/anglican-psalm-template.texidoc | 3 +- ...depending-on-the-step-of-the-scale.texidoc | 2 +- .../fr/texidocs/arabic-improvisation.texidoc | 2 +- .../fr/texidocs/asymmetric-slurs.texidoc | 2 +- .../automatic-beam-subdivisions.texidoc | 2 +- .../automatically-change-durations.texidoc | 4 +- ...he-middle-note-based-on-the-melody.texidoc | 2 +- ...g-collisions-with-chord-fingerings.texidoc | 2 +- ...tion-for-guitar--with-text-spanner.texidoc | 9 - .../beam-endings-in-score-context.texidoc | 2 +- .../beam-grouping-in-7-8-time.texidoc | 9 - .../texidocs/beams-across-line-breaks.texidoc | 2 +- ...-lines-using-the--whiteout-command.texidoc | 10 +- Documentation/fr/texidocs/book-parts.texidoc | 2 +- .../fr/texidocs/breathing-signs.texidoc | 2 +- .../texidocs/broken-crescendo-hairpin.texidoc | 5 +- .../caesura-railtracks-with-fermata.texidoc | 2 +- ...center-text-below-hairpin-dynamics.texidoc | 2 +- ...markup-on-note-heads-automatically.texidoc | 13 - .../changing--flageolet-mark-size.texidoc | 3 +- ...ing-a-single-notes-size-in-a-chord.texidoc | 3 +- .../texidocs/changing-beam-knee-gap.texidoc | 2 +- .../texidocs/changing-chord-separator.texidoc | 2 +- ...anging-form-of-multi-measure-rests.texidoc | 2 +- .../changing-fret-orientations.texidoc | 2 +- ...di-output-to-one-channel-per-voice.texidoc | 4 +- .../changing-partcombine-texts.texidoc | 5 +- ...ng-properties-for-individual-grobs.texidoc | 2 +- .../fr/texidocs/changing-stanza-fonts.texidoc | 2 +- ...d-spanner-styles-for-text-dynamics.texidoc | 2 +- .../texidocs/changing-the-ambitus-gap.texidoc | 2 +- ...lur-from-solid-to-dotted-or-dashed.texidoc | 2 +- .../changing-the-breath-mark-symbol.texidoc | 2 +- ...-to-german-or-semi-german-notation.texidoc | 2 +- ...nging-the-default-text-font-family.texidoc | 2 +- ...the-interval-of-lines-on-the-stave.texidoc | 2 +- ...mber-of-augmentation-dots-per-note.texidoc | 2 +- ...ing-the-number-of-lines-in-a-staff.texidoc | 2 +- ...itions-of-figured-bass-alterations.texidoc | 2 +- ...ging-the-size-of-woodwind-diagrams.texidoc | 3 +- .../texidocs/changing-the-staff-size.texidoc | 2 +- ...the-tempo-without-a-metronome-mark.texidoc | 5 +- ...ging-the-text-for-sustain-markings.texidoc | 2 +- .../changing-the-tuplet-number.texidoc | 14 +- ...tric-section-using--scaledurations.texidoc | 14 +- .../texidocs/chant-or-psalms-notation.texidoc | 2 +- .../chord-glissando-in-tablature.texidoc | 3 +- .../fr/texidocs/chord-name-exceptions.texidoc | 6 +- .../fr/texidocs/chord-name-major7.texidoc | 2 +- .../chordchanges-for-fretboards.texidoc | 3 +- ...be-transposed-by-arbitrary-amounts.texidoc | 2 +- .../fr/texidocs/clip-systems.texidoc | 2 +- Documentation/fr/texidocs/clusters.texidoc | 6 +- ...ing-notes-depending-on-their-pitch.texidoc | 2 +- ...mbining-dynamics-with-markup-texts.texidoc | 4 +- ...bining-two-parts-on-the-same-staff.texidoc | 2 +- .../texidocs/compound-time-signatures.texidoc | 2 +- ...ting-signs,-measure-grouping-signs.texidoc | 15 +- ...sistently-left-aligned-bar-numbers.texidoc | 2 +- .../texidocs/contemporary-glissando.texidoc | 2 +- ...nner-visibility-after-a-line-break.texidoc | 2 +- ...-the-placement-of-chord-fingerings.texidoc | 6 +- ...g-the-vertical-ordering-of-scripts.texidoc | 2 +- ...trolling-tuplet-bracket-visibility.texidoc | 8 +- .../texidocs/creating-a-delayed-turn.texidoc | 2 +- ...quence-of-notes-on-various-pitches.texidoc | 2 +- ...s-across-notes-in-different-voices.texidoc | 5 +- .../fr/texidocs/creating-blank-staves.texidoc | 2 +- ...s-staff-arpeggios-in-a-piano-staff.texidoc | 3 +- ...-staff-arpeggios-in-other-contexts.texidoc | 3 +- ...ing-custom-dynamics-in-midi-output.texidoc | 12 + .../creating-custom-key-signatures.texidoc | 7 + .../creating-double-digit-fingerings.texidoc | 2 +- ...ing-metronome-marks-in-markup-mode.texidoc | 3 +- ...eating-real-parenthesized-dynamics.texidoc | 6 +- ...ating-simultaneous-rehearsal-marks.texidoc | 4 +- .../creating-slurs-across-voices.texidoc | 2 +- .../texidocs/creating-text-spanners.texidoc | 2 +- ...ords---beaming-problems-workaround.texidoc | 2 +- .../fr/texidocs/cross-staff-stems.texidoc | 11 +- .../fr/texidocs/cross-staff-tremolos.texidoc | 3 +- Documentation/fr/texidocs/custodes.texidoc | 2 +- ...ustomizing-fretboard-fret-diagrams.texidoc | 2 +- .../customizing-markup-fret-diagrams.texidoc | 2 +- ...ms-on-the-center-line-of-the-staff.texidoc | 2 +- ...graver-in-scheme--ambitus-engraver.texidoc | 4 +- ...d-fretboards-for-other-instruments.texidoc | 2 +- .../fr/texidocs/demo-midiinstruments.texidoc | 2 +- .../demonstrating-all-headers.texidoc | 2 +- ...et-with-only-one-staff-in-a-system.texidoc | 2 +- ...if-only-one-of-its-staves-is-alive.texidoc | 2 +- .../displaying-complex-chords.texidoc | 2 +- .../texidocs/displaying-grob-ancestry.texidoc | 45 +- .../fr/texidocs/dotted-harmonics.texidoc | 2 +- .../fr/texidocs/double-glissando.texidoc | 2 +- .../drawing-boxes-around-grobs.texidoc | 2 +- .../drawing-circles-around-note-heads.texidoc | 2 +- ...ing-circles-around-various-objects.texidoc | 2 +- ...namics-custom-text-spanner-postfix.texidoc | 3 +- .../dynamics-text-spanner-postfix.texidoc | 5 +- ...tive-postscript-in-a--markup-block.texidoc | 2 +- .../fr/texidocs/engravers-one-by-one.texidoc | 2 +- .../texidocs/engraving-ties-manually.texidoc | 2 +- ...aving-tremolos-with-floating-beams.texidoc | 2 +- ...ts-using-only-one--tuplet-command.texidoc} | 4 +- ...extending-glissandi-across-repeats.texidoc | 3 +- .../faking-a-hammer-in-tablatures.texidoc | 2 +- .../fine-tuning-pedal-brackets.texidoc | 2 +- ...ering-symbols-for-wind-instruments.texidoc | 2 +- ...cations,-and-right-hand-fingerings.texidoc | 3 +- .../fr/texidocs/flamenco-notation.texidoc | 2 +- .../texidocs/flat-flags-and-beam-nibs.texidoc | 4 +- .../fr/texidocs/flute-slap-notation.texidoc | 2 +- ...cing-a-clef-symbol-to-be-displayed.texidoc | 9 - .../forcing-horizontal-shift-of-notes.texidoc | 2 +- .../forcing-hyphens-to-be-shown.texidoc | 2 +- ...h-to-adapt-to-metronomemarks-width.texidoc | 9 +- ...tart-from-a-given-letter-or-number.texidoc | 2 +- .../formatting-lyrics-syllables.texidoc | 2 +- ...t-diagrams-explained-and-developed.texidoc | 2 +- .../fretboards-alternate-tables.texidoc | 3 +- ...tted-string-harmonics-in-tablature.texidoc | 3 +- .../texidocs/generating-custom-flags.texidoc | 2 +- .../texidocs/generating-random-notes.texidoc | 2 +- ...in-scheme-without-using-the-parser.texidoc | 19 +- .../texidocs/glissandi-can-skip-grobs.texidoc | 2 +- ...aphical-and-text-woodwind-diagrams.texidoc | 3 +- ...d-lines--changing-their-appearance.texidoc | 2 +- ...-rhythms-and-notes-synchronization.texidoc | 2 +- .../fr/texidocs/guitar-slides.texidoc | 2 +- .../fr/texidocs/guitar-strum-rhythms.texidoc | 4 +- ...airpins-with-different-line-styles.texidoc | 2 +- ...ammer-on-and-pull-off-using-chords.texidoc | 4 +- ...ammer-on-and-pull-off-using-voices.texidoc | 2 +- .../texidocs/hammer-on-and-pull-off.texidoc | 2 +- ...tomized-polymetric-time-signatures.texidoc | 4 +- ...notes-at-the-start-of-a-new-system.texidoc | 2 +- ...he-extender-line-for-text-dynamics.texidoc | 2 +- ...cs-e.g.-sempre-pp,-piu-f,-subito-p.texidoc | 8 +- ...ow-to-change-fret-diagram-position.texidoc | 2 +- ...nd-below-the-same-barline-method-1.texidoc | 4 +- ...nd-below-the-same-barline-method-2.texidoc | 2 +- ...t-ties-between-syllables-in-lyrics.texidoc | 2 +- .../fr/texidocs/hymn-template.texidoc | 2 +- Documentation/fr/texidocs/incipit.texidoc | 12 +- ...staff-chords-with-arpeggio-bracket.texidoc | 2 +- .../fr/texidocs/inserting-a-caesura.texidoc | 2 +- ...ragments-above-a-staff,-as-markups.texidoc | 2 +- .../texidocs/isolated-percent-repeats.texidoc | 5 +- .../fr/texidocs/jazz-combo-template.texidoc | 4 +- .../keep-change-clefs-full-sized.texidoc | 8 - .../fr/texidocs/laissez-vibrer-ties.texidoc | 2 +- .../letter-tablature-formatting.texidoc | 2 +- Documentation/fr/texidocs/line-arrows.texidoc | 2 +- .../fr/texidocs/lyrics-alignment.texidoc | 2 +- .../fr/texidocs/makam-example.texidoc | 6 +- ...ible-with-the-transparent-property.texidoc | 2 +- .../making-glissandi-breakable.texidoc | 2 +- ...-slurs-with-complex-dash-structure.texidoc | 2 +- ...taff-lines-thicker-than-the-others.texidoc | 2 +- ...ss-extenders-for-only-some-numbers.texidoc | 2 +- ...anually-controlling-beam-positions.texidoc | 2 +- ...ken-parts-with-a-cross-on-the-stem.texidoc | 2 +- .../fr/texidocs/markup-lines.texidoc | 4 +- .../fr/texidocs/measure-counter.texidoc | 2 +- ...ayout-bar-lines-between-the-staves.texidoc | 6 +- ...measure-rests-in-a-polyphonic-part.texidoc | 2 +- ...or-articulation-shorthand-notation.texidoc | 5 +- .../modifying-tuplet-bracket-length.texidoc | 8 +- .../moving-dotted-notes-in-polyphony.texidoc | 2 +- .../moving-slur-positions-vertically.texidoc | 2 +- .../multi-measure-rest-markup.texidoc | 4 +- .../fr/texidocs/nesting-staves.texidoc | 5 +- .../non-default-tuplet-numbers.texidoc | 6 +- .../non-traditional-key-signatures.texidoc | 20 +- .../numbers-as-easy-note-heads.texidoc | 2 +- ...2-lyrics-spacing-in-newer-versions.texidoc | 12 +- ...open-string-harmonics-in-tablature.texidoc | 6 +- ...rchestra,-choir-and-piano-template.texidoc | 2 +- Documentation/fr/texidocs/ottava-text.texidoc | 3 +- .../outputting-the-version-number.texidoc | 2 +- Documentation/fr/texidocs/page-label.texidoc | 5 +- .../partcombine-and-autobeamoff.texidoc | 9 +- .../percent-repeat-count-visibility.texidoc | 2 +- .../texidocs/percent-repeat-counter.texidoc | 2 +- .../fr/texidocs/percussion-beaters.texidoc | 2 +- ...-line-breaks-within-beamed-tuplets.texidoc | 6 +- .../fr/texidocs/piano-template-simple.texidoc | 2 +- ...iano-template-with-centered-lyrics.texidoc | 2 +- ...no-template-with-melody-and-lyrics.texidoc | 4 +- ...placement-of-right-hand-fingerings.texidoc | 2 +- .../texidocs/polyphony-in-tablature.texidoc | 4 +- .../fr/texidocs/positioning-arpeggios.texidoc | 2 +- ...ng-fingering-indications-precisely.texidoc | 2 +- ...at-the-height-of-normal-note-beams.texidoc | 2 +- ...ng-grace-notes-with-floating-space.texidoc | 4 +- .../positioning-multi-measure-rests.texidoc | 2 +- ...ing-segno-and-coda-with-line-break.texidoc | 2 +- ...itioning-text-markups-inside-slurs.texidoc | 2 +- ...als-from-being-automatically-added.texidoc | 3 +- ...al-mark-from-removing-final-tuplet.texidoc | 8 +- ...ted-when-the-key-signature-changes.texidoc | 2 +- ...t-sign-at-the-beginning-of-a-piece.texidoc | 8 - ...g-bar-numbers-at-regular-intervals.texidoc | 2 +- ...ar-numbers-inside-boxes-or-circles.texidoc | 2 +- ...rs-with-changing-regular-intervals.texidoc | 7 + ...rinting-hairpins-in-various-styles.texidoc | 2 +- ...-hairpins-using-al-niente-notation.texidoc | 4 +- ...rinting-marks-at-the-end-of-a-line.texidoc | 2 +- .../printing-marks-on-every-staff.texidoc | 2 +- ...nd-rehearsal-marks-below-the-staff.texidoc | 2 +- ...sic-with-different-time-signatures.texidoc | 2 +- ...-with-and-without-an-octave-marker.texidoc | 2 +- .../printing-text-from-right-to-left.texidoc | 2 +- ...e-bar-number-for-the-first-measure.texidoc | 4 +- .../proportional-strict-notespacing.texidoc | 2 +- .../putting-lyrics-inside-the-staff.texidoc | 4 +- ...g-another-voice-with-transposition.texidoc | 5 +- .../fr/texidocs/quoting-another-voice.texidoc | 4 +- .../texidocs/recorder-fingering-chart.texidoc | 2 +- ...efining-grace-note-global-defaults.texidoc | 2 +- .../removing-bar-numbers-from-a-score.texidoc | 2 +- ...ffgroup,-pianostaff,-or-grandstaff.texidoc | 4 +- .../removing-the-first-empty-line.texidoc | 2 +- ...fault-midi-instrument-equalization.texidoc | 14 + Documentation/fr/texidocs/rest-styles.texidoc | 2 +- .../reverting-default-beam-endings.texidoc | 2 +- .../fr/texidocs/rhythmic-slashes.texidoc | 4 +- .../satb-choir-template---four-staves.texidoc | 2 +- .../fr/texidocs/screech-and-boink.texidoc | 2 +- ...lations-from-key-signature-changes.texidoc | 8 +- ...ting-hairpin-behavior-at-bar-lines.texidoc | 2 +- .../setting-system-separators.texidoc | 2 +- ...he-double-repeat-default-for-volte.texidoc | 2 +- ...ing-the-minimum-length-of-hairpins.texidoc | 2 +- .../shortening-volta-brackets.texidoc | 2 +- .../showing-chords-at-changes.texidoc | 2 +- ...on-above-and-below-a-note-or-chord.texidoc | 2 +- .../fr/texidocs/simple-lead-sheet.texidoc | 4 +- ...ate-with-notes,-lyrics,-and-chords.texidoc | 2 +- ...th-notes,-lyrics,-chords-and-frets.texidoc | 2 +- ...aff-template-with-notes-and-chords.texidoc | 6 +- ...aff-template-with-notes-and-lyrics.texidoc | 2 +- ...gle-staff-template-with-only-notes.texidoc | 2 +- .../fr/texidocs/skips-in-lyric-mode-2.texidoc | 6 +- .../fr/texidocs/skips-in-lyric-mode.texidoc | 2 +- .../fr/texidocs/slides-in-tablature.texidoc | 4 +- ...snap-pizzicato-or-bartok-pizzicato.texidoc | 8 +- .../stand-alone-two-column-markup.texidoc | 2 +- ...tem-and-beam-behavior-in-tablature.texidoc | 2 +- Documentation/fr/texidocs/stemlets.texidoc | 2 +- .../fr/texidocs/strict-beat-beaming.texidoc | 2 +- .../string-number-extender-lines.texidoc | 2 +- .../string-quartet-template-simple.texidoc | 2 +- ...artet-template-with-separate-parts.texidoc | 2 +- .../fr/texidocs/subdividing-beams.texidoc | 19 +- ...warnings-for-clashing-note-columns.texidoc | 18 +- .../fr/texidocs/table-of-contents.texidoc | 4 +- .../fr/texidocs/three-sided-box.texidoc | 2 +- .../fr/texidocs/tick-bar-lines.texidoc | 2 +- ...ignature-in-parentheses---method-3.texidoc | 2 +- .../time-signature-in-parentheses.texidoc | 2 +- ...s-a-number-instead-of-the-fraction.texidoc | 2 +- ...tion-of-ancient-music-with-incipit.texidoc | 11 - ...inimum-accidentals-smart-transpose.texidoc | 2 +- .../texidocs/tweaking-clef-properties.texidoc | 26 +- ...tweaking-grace-layout-within-music.texidoc | 2 +- ...cket-at-the-start-of-a-staff-group.texidoc | 2 +- ...g-a-tick-as-the-breath-mark-symbol.texidoc | 2 +- .../using-alternative-flag-styles.texidoc | 5 +- .../using-an-extra-voice-for-breaks.texidoc | 14 + ...racket-to-make-divisi-more-visible.texidoc | 2 +- ...utochange-with-more-than-one-voice.texidoc | 2 +- ...ing-double-slurs-for-legato-chords.texidoc | 2 +- ...ace-note-slashes-with-normal-heads.texidoc | 6 +- ...object-to-access-grobs-with--tweak.texidoc | 2 +- ...-generate-special-note-head-shapes.texidoc | 8 +- ...-modern-music-from-the-same-source.texidoc | 16 + ...-command-to-tweak-individual-grobs.texidoc | 2 +- .../using-the-whiteout-property.texidoc | 2 +- .../using-ties-with-arpeggios.texidoc | 2 +- Documentation/fr/texidocs/utf-8.texidoc | 2 +- ...ine-as-a-baroque-articulation-mark.texidoc | 4 +- ...y-aligned-dynamics-and-textscripts.texidoc | 2 +- ...ing-dynamics-across-multiple-notes.texidoc | 2 +- ...tically-aligning-ossias-and-lyrics.texidoc | 2 +- .../vertically-centered-common-lyrics.texidoc | 2 +- ...ring-paired-figured-bass-extenders.texidoc | 4 +- ...ate-with-automatic-piano-reduction.texidoc | 2 +- ...aligned-below-and-above-the-staves.texidoc | 2 +- ...le-template-with-verse-and-refrain.texidoc | 4 +- .../texidocs/vocal-ensemble-template.texidoc | 2 +- .../fr/texidocs/volta-below-chords.texidoc | 2 +- .../fr/texidocs/volta-multi-staff.texidoc | 2 +- ...a-text-markup-using-repeatcommands.texidoc | 2 +- .../woodwind-diagrams-key-lists.texidoc | 4 +- .../woodwind-diagrams-listing.texidoc | 2 +- Documentation/fr/translations.itexi | 86 +- Documentation/fr/usage.tely | 15 +- Documentation/fr/usage/external.itely | 190 +- Documentation/fr/usage/lilypond-book.itely | 50 +- Documentation/fr/usage/running.itely | 327 +- Documentation/fr/usage/suggestions.itely | 140 +- Documentation/fr/usage/updating.itely | 162 +- Documentation/fr/web.texi | 77 +- Documentation/fr/web/community.itexi | 454 +- Documentation/fr/web/download.itexi | 84 +- Documentation/fr/web/introduction.itexi | 655 +- Documentation/fr/web/manuals.itexi | 13 +- Documentation/hu/essay.tely | 76 + Documentation/hu/essay/engraving.itely | 1638 +++ Documentation/hu/essay/literature.itely | 106 + .../hu/included/generating-output.itexi | 220 + Documentation/hu/included/helpus.itexi | 138 + Documentation/hu/learning.tely | 3 +- .../hu/learning/common-notation.itely | 513 +- Documentation/hu/learning/fundamental.itely | 1010 +- Documentation/hu/learning/preface.itely | 98 +- Documentation/hu/learning/tutorial.itely | 367 +- Documentation/hu/search-box.ihtml | 6 +- Documentation/hu/translations.itexi | 212 +- Documentation/hu/usage.tely | 4 +- Documentation/hu/usage/lilypond-book.itely | 26 +- Documentation/hu/usage/running.itely | 8 +- Documentation/hu/web.texi | 48 +- Documentation/hu/web/community.itexi | 10 +- Documentation/hu/web/introduction.itexi | 6 +- Documentation/hu/web/manuals.itexi | 2 +- Documentation/included/authors.itexi | 128 +- Documentation/included/compile.itexi | 620 +- .../display-predefined-string-tunings.ly | 4 +- Documentation/included/engraver-example.ily | 16 +- .../included/generating-output.itexi | 15 +- Documentation/included/gonville.ly | 10 +- Documentation/included/note-head-style.ly | 6 +- Documentation/included/script-chart.ly | 7 +- Documentation/included/simple.ly | 6 +- Documentation/it/changes.tely | 1116 +- .../it/included/generating-output.itexi | 4 +- Documentation/it/learning.tely | 5 +- .../it/learning/common-notation.itely | 501 +- Documentation/it/learning/fundamental.itely | 611 +- Documentation/it/learning/templates.itely | 334 +- Documentation/it/learning/tutorial.itely | 124 +- Documentation/it/learning/tweaks.itely | 1066 +- Documentation/it/notation.tely | 20 +- .../it/notation/changing-defaults.itely | 4658 ++++++ Documentation/it/notation/cheatsheet.itely | 298 + Documentation/it/notation/editorial.itely | 482 +- Documentation/it/notation/expressive.itely | 572 +- Documentation/it/notation/input.itely | 3770 +++++ .../it/notation/notation-appendices.itely | 2781 ++++ Documentation/it/notation/pitches.itely | 920 +- Documentation/it/notation/repeats.itely | 481 +- Documentation/it/notation/rhythms.itely | 1545 +- Documentation/it/notation/simultaneous.itely | 369 +- Documentation/it/notation/spacing.itely | 3666 +++++ Documentation/it/notation/specialist.itely | 41 + Documentation/it/notation/staff.itely | 564 +- Documentation/it/notation/text.itely | 535 +- Documentation/it/notation/vocal.itely | 3415 +++++ Documentation/it/notation/world.itely | 595 + Documentation/it/search-box.ihtml | 15 +- .../texidocs/adding-ambitus-per-voice.texidoc | 2 +- ...n-ottava-marking-to-a-single-voice.texidoc | 2 +- ...g-orchestral-cues-to-a-vocal-score.texidoc | 15 + ...ing-timing-marks-to-long-glissandi.texidoc | 2 +- ...olta-brackets-to-additional-staves.texidoc | 2 +- ...itional-voices-to-avoid-collisions.texidoc | 2 +- ...sting-the-shape-of-falls-and-doits.texidoc | 2 +- .../it/texidocs/aligning-bar-numbers.texidoc | 2 +- ...ngs-to-be-printed-inside-the-staff.texidoc | 2 +- .../alternative-bar-numbering.texidoc | 2 +- .../texidocs/alternative-breve-notes.texidoc | 2 +- .../ambitus-with-multiple-voices.texidoc | 2 +- ...n-transcription-of-gregorian-music.texidoc | 2 +- ...rn-transcription-of-mensural-music.texidoc | 12 - .../texidocs/anglican-psalm-template.texidoc | 2 +- ...depending-on-the-step-of-the-scale.texidoc | 2 +- .../it/texidocs/arabic-improvisation.texidoc | 10 + ...he-middle-note-based-on-the-melody.texidoc | 2 +- ...g-collisions-with-chord-fingerings.texidoc | 2 +- .../beam-endings-in-score-context.texidoc | 2 +- .../texidocs/beams-across-line-breaks.texidoc | 2 +- .../texidocs/changing-beam-knee-gap.texidoc | 2 +- ...anging-form-of-multi-measure-rests.texidoc | 2 +- ...di-output-to-one-channel-per-voice.texidoc | 16 + .../changing-partcombine-texts.texidoc | 2 +- ...d-spanner-styles-for-text-dynamics.texidoc | 2 +- .../texidocs/changing-the-ambitus-gap.texidoc | 2 +- .../changing-the-breath-mark-symbol.texidoc | 2 +- ...mber-of-augmentation-dots-per-note.texidoc | 2 +- ...the-tempo-without-a-metronome-mark.texidoc | 2 +- .../changing-the-tuplet-number.texidoc | 5 +- .../texidocs/chant-or-psalms-notation.texidoc | 7 + ...bining-two-parts-on-the-same-staff.texidoc | 2 +- ...ting-signs,-measure-grouping-signs.texidoc | 8 +- .../texidocs/contemporary-glissando.texidoc | 2 +- ...-the-placement-of-chord-fingerings.texidoc | 2 +- ...g-the-vertical-ordering-of-scripts.texidoc | 2 +- ...trolling-tuplet-bracket-visibility.texidoc | 2 +- .../texidocs/creating-a-delayed-turn.texidoc | 2 +- ...s-across-notes-in-different-voices.texidoc | 2 +- ...s-staff-arpeggios-in-a-piano-staff.texidoc | 2 +- ...-staff-arpeggios-in-other-contexts.texidoc | 2 +- ...ing-custom-dynamics-in-midi-output.texidoc | 11 + ...ing-metronome-marks-in-markup-mode.texidoc | 2 +- .../it/texidocs/cross-staff-tremolos.texidoc | 2 +- ...ms-on-the-center-line-of-the-staff.texidoc | 2 +- ...et-with-only-one-staff-in-a-system.texidoc | 2 +- ...namics-custom-text-spanner-postfix.texidoc | 2 +- .../dynamics-text-spanner-postfix.texidoc | 2 +- .../texidocs/engraving-ties-manually.texidoc | 2 +- ...ts-using-only-one--tuplet-command.texidoc} | 2 +- ...extending-glissandi-across-repeats.texidoc | 2 +- .../texidocs/flat-flags-and-beam-nibs.texidoc | 13 +- .../forcing-horizontal-shift-of-notes.texidoc | 2 +- .../formatting-lyrics-syllables.texidoc | 7 + ...d-lines--changing-their-appearance.texidoc | 2 +- .../it/texidocs/guitar-strum-rhythms.texidoc | 2 +- ...notes-at-the-start-of-a-new-system.texidoc | 2 +- ...he-extender-line-for-text-dynamics.texidoc | 2 +- .../it/texidocs/hymn-template.texidoc | 2 +- Documentation/it/texidocs/incipit.texidoc | 10 + .../it/texidocs/inserting-a-caesura.texidoc | 2 +- .../texidocs/isolated-percent-repeats.texidoc | 2 +- .../it/texidocs/jazz-combo-template.texidoc | 2 +- .../it/texidocs/lyrics-alignment.texidoc | 10 + .../it/texidocs/makam-example.texidoc | 7 + .../making-glissandi-breakable.texidoc | 2 +- ...-slurs-with-complex-dash-structure.texidoc | 2 +- ...taff-lines-thicker-than-the-others.texidoc | 2 +- ...ayout-bar-lines-between-the-staves.texidoc | 6 +- ...or-articulation-shorthand-notation.texidoc | 2 +- ...modifying-the-ottava-spanner-slope.texidoc | 6 + .../multi-measure-rest-markup.texidoc | 2 +- .../it/texidocs/nesting-staves.texidoc | 2 +- .../non-default-tuplet-numbers.texidoc | 2 +- .../non-traditional-key-signatures.texidoc | 6 +- .../numbers-as-easy-note-heads.texidoc | 2 +- ...2-lyrics-spacing-in-newer-versions.texidoc | 12 + ...rchestra,-choir-and-piano-template.texidoc | 2 +- Documentation/it/texidocs/ottava-text.texidoc | 2 +- .../partcombine-and-autobeamoff.texidoc | 2 +- .../percent-repeat-count-visibility.texidoc | 2 +- .../texidocs/percent-repeat-counter.texidoc | 2 +- ...-line-breaks-within-beamed-tuplets.texidoc | 2 +- .../it/texidocs/piano-template-simple.texidoc | 2 +- ...iano-template-with-centered-lyrics.texidoc | 2 +- ...no-template-with-melody-and-lyrics.texidoc | 2 +- ...ng-grace-notes-with-floating-space.texidoc | 2 +- .../positioning-multi-measure-rests.texidoc | 2 +- ...itioning-text-markups-inside-slurs.texidoc | 2 +- ...als-from-being-automatically-added.texidoc | 2 +- ...ted-when-the-key-signature-changes.texidoc | 2 +- ...t-sign-at-the-beginning-of-a-piece.texidoc | 7 - ...g-bar-numbers-at-regular-intervals.texidoc | 2 +- ...ar-numbers-inside-boxes-or-circles.texidoc | 2 +- ...rs-with-changing-regular-intervals.texidoc | 8 + ...rinting-hairpins-in-various-styles.texidoc | 2 +- ...-hairpins-using-al-niente-notation.texidoc | 2 +- ...rinting-marks-at-the-end-of-a-line.texidoc | 2 +- .../printing-marks-on-every-staff.texidoc | 2 +- ...nd-rehearsal-marks-below-the-staff.texidoc | 2 +- ...e-bar-number-for-the-first-measure.texidoc | 2 +- ...efining-grace-note-global-defaults.texidoc | 2 +- .../removing-bar-numbers-from-a-score.texidoc | 2 +- .../removing-the-first-empty-line.texidoc | 2 +- ...fault-midi-instrument-equalization.texidoc | 14 + Documentation/it/texidocs/rest-styles.texidoc | 2 +- .../satb-choir-template---four-staves.texidoc | 2 +- ...ting-hairpin-behavior-at-bar-lines.texidoc | 2 +- ...he-double-repeat-default-for-volte.texidoc | 2 +- ...ing-the-minimum-length-of-hairpins.texidoc | 2 +- .../shortening-volta-brackets.texidoc | 2 +- .../it/texidocs/simple-lead-sheet.texidoc | 7 + ...ate-with-notes,-lyrics,-and-chords.texidoc | 2 +- ...aff-template-with-notes-and-chords.texidoc | 2 +- ...aff-template-with-notes-and-lyrics.texidoc | 2 +- ...gle-staff-template-with-only-notes.texidoc | 2 +- .../stand-alone-two-column-markup.texidoc | 2 +- .../it/texidocs/strict-beat-beaming.texidoc | 2 +- .../string-quartet-template-simple.texidoc | 2 +- ...artet-template-with-separate-parts.texidoc | 2 +- .../it/texidocs/subdividing-beams.texidoc | 37 +- ...s-a-number-instead-of-the-fraction.texidoc | 2 +- ...inimum-accidentals-smart-transpose.texidoc | 2 +- .../texidocs/tweaking-clef-properties.texidoc | 32 +- ...tweaking-grace-layout-within-music.texidoc | 2 +- ...cket-at-the-start-of-a-staff-group.texidoc | 2 +- ...g-a-tick-as-the-breath-mark-symbol.texidoc | 2 +- .../using-an-extra-voice-for-breaks.texidoc | 14 + ...racket-to-make-divisi-more-visible.texidoc | 8 + ...ing-double-slurs-for-legato-chords.texidoc | 2 +- ...ace-note-slashes-with-normal-heads.texidoc | 2 +- .../using-ties-with-arpeggios.texidoc | 2 +- ...y-aligned-dynamics-and-textscripts.texidoc | 2 +- ...tically-aligning-ossias-and-lyrics.texidoc | 2 +- ...ate-with-automatic-piano-reduction.texidoc | 2 +- ...aligned-below-and-above-the-staves.texidoc | 2 +- ...le-template-with-verse-and-refrain.texidoc | 2 +- .../texidocs/vocal-ensemble-template.texidoc | 2 +- Documentation/it/translations.itexi | 270 +- Documentation/it/usage.tely | 4 +- Documentation/it/usage/external.itely | 189 +- Documentation/it/usage/lilypond-book.itely | 55 +- Documentation/it/usage/running.itely | 330 +- Documentation/it/usage/suggestions.itely | 140 +- Documentation/it/usage/updating.itely | 211 +- Documentation/it/web.texi | 53 +- Documentation/it/web/community.itexi | 367 +- Documentation/it/web/download.itexi | 67 +- Documentation/it/web/introduction.itexi | 583 +- Documentation/it/web/manuals.itexi | 9 +- .../ja/included/generating-output.itexi | 62 +- Documentation/ja/learning.tely | 13 +- .../ja/learning/common-notation.itely | 719 +- Documentation/ja/learning/fundamental.itely | 428 +- Documentation/ja/learning/templates.itely | 3 +- Documentation/ja/learning/tutorial.itely | 205 +- Documentation/ja/learning/tweaks.itely | 711 +- Documentation/ja/macros.itexi | 15 +- Documentation/ja/notation.tely | 2 +- .../ja/notation/changing-defaults.itely | 804 +- Documentation/ja/notation/cheatsheet.itely | 32 +- Documentation/ja/notation/chords.itely | 30 +- Documentation/ja/notation/editorial.itely | 169 +- Documentation/ja/notation/expressive.itely | 507 +- .../ja/notation/fretted-strings.itely | 97 +- Documentation/ja/notation/input.itely | 125 +- Documentation/ja/notation/keyboards.itely | 69 +- Documentation/ja/notation/percussion.itely | 4 +- Documentation/ja/notation/pitches.itely | 619 +- Documentation/ja/notation/repeats.itely | 351 +- Documentation/ja/notation/rhythms.itely | 854 +- Documentation/ja/notation/simultaneous.itely | 280 +- Documentation/ja/notation/spacing.itely | 108 +- Documentation/ja/notation/staff.itely | 335 +- Documentation/ja/notation/text.itely | 536 +- .../ja/notation/unfretted-strings.itely | 48 +- Documentation/ja/notation/vocal.itely | 356 +- Documentation/ja/notation/wind.itely | 41 +- Documentation/ja/notation/world.itely | 14 +- Documentation/ja/translations.itexi | 254 +- Documentation/ja/usage.tely | 17 +- Documentation/ja/usage/external.itely | 20 +- Documentation/ja/usage/lilypond-book.itely | 30 +- Documentation/ja/usage/running.itely | 375 +- Documentation/ja/usage/suggestions.itely | 14 +- Documentation/ja/web.texi | 83 +- Documentation/ja/web/community.itexi | 419 +- Documentation/ja/web/download.itexi | 159 +- Documentation/ja/web/introduction.itexi | 697 +- Documentation/ja/web/manuals.itexi | 126 +- Documentation/learning.tely | 9 +- Documentation/learning/common-notation.itely | 500 +- Documentation/learning/fundamental.itely | 531 +- Documentation/learning/templates.itely | 331 +- Documentation/learning/tutorial.itely | 108 +- Documentation/learning/tweaks.itely | 1039 +- Documentation/lilypond-texi2html-lang.init | 18 + Documentation/lilypond-texi2html.init | 192 +- .../ly-examples/Stockhausen_Klavierstueck2.ly | 189 + Documentation/ly-examples/aucun-snippet.ly | 18 +- Documentation/ly-examples/bach-bwv610.ly | 52 +- Documentation/ly-examples/bach-schenker.ly | 6 +- Documentation/ly-examples/cary-layout.ily | 26 +- Documentation/ly-examples/cary.ly | 2 +- Documentation/ly-examples/chart.ly | 6 +- Documentation/ly-examples/granados.ly | 30 +- Documentation/ly-examples/orchestra.ly | 56 +- Documentation/ly-examples/sesto-full.ly | 4 +- Documentation/ly-examples/sesto-piano.ly | 4 +- Documentation/ly-examples/sesto.ily | 32 +- Documentation/ly-examples/tab-example.ly | 8 +- Documentation/ly-examples/theory.ly | 4 +- Documentation/misc/announce-v2.0.html | 2 +- Documentation/music-glossary.tely | 72 +- Documentation/nl/learning.tely | 2 +- .../nl/learning/common-notation.itely | 250 +- Documentation/nl/learning/fundamental.itely | 448 +- Documentation/nl/learning/templates.itely | 8 +- Documentation/nl/learning/tutorial.itely | 58 +- Documentation/nl/learning/tweaks.itely | 689 +- Documentation/nl/search-box.ihtml | 6 +- Documentation/nl/translations.itexi | 62 +- Documentation/nl/web.texi | 2 +- Documentation/nl/web/introduction.itexi | 10 +- Documentation/nl/web/manuals.itexi | 4 +- Documentation/notation.tely | 9 +- Documentation/notation/ancient.itely | 479 +- .../notation/changing-defaults.itely | 1388 +- Documentation/notation/cheatsheet.itely | 34 +- Documentation/notation/chords.itely | 77 +- Documentation/notation/editorial.itely | 470 +- Documentation/notation/expressive.itely | 570 +- Documentation/notation/fretted-strings.itely | 249 +- Documentation/notation/input.itely | 1574 ++- Documentation/notation/keyboards.itely | 86 +- .../notation/notation-appendices.itely | 1097 +- Documentation/notation/percussion.itely | 76 +- Documentation/notation/pitches.itely | 915 +- Documentation/notation/repeats.itely | 467 +- Documentation/notation/rhythms.itely | 1578 ++- Documentation/notation/simultaneous.itely | 351 +- Documentation/notation/spacing.itely | 1065 +- Documentation/notation/staff.itely | 560 +- Documentation/notation/text.itely | 525 +- .../notation/unfretted-strings.itely | 73 +- Documentation/notation/vocal.itely | 522 +- Documentation/notation/wind.itely | 41 +- Documentation/notation/world.itely | 16 +- Documentation/pictures/GNUmakefile | 4 +- Documentation/pictures/background-image.png | Bin 57877 -> 0 bytes .../pictures/background-top-left.png | Bin 0 -> 64211 bytes .../pictures/background-top-right.png | Bin 0 -> 8367 bytes Documentation/pictures/color1-active.png | Bin 241 -> 0 bytes Documentation/pictures/color1-hover.png | Bin 230 -> 0 bytes Documentation/pictures/color2-active.png | Bin 164 -> 0 bytes Documentation/pictures/color2-hover.png | Bin 226 -> 0 bytes Documentation/pictures/color3-active.png | Bin 159 -> 0 bytes Documentation/pictures/color3-hover.png | Bin 232 -> 0 bytes Documentation/pictures/color4-active.png | Bin 170 -> 0 bytes Documentation/pictures/color4-hover.png | Bin 231 -> 0 bytes Documentation/pictures/lily-home-32x32.png | 0 .../pictures/lily-home-nav-active.png | Bin 2704 -> 0 bytes Documentation/pictures/lily-home-nav-bg.png | Bin 2626 -> 0 bytes .../pictures/lily-home-nav-hover.png | Bin 2652 -> 0 bytes Documentation/pictures/logo-debian.png | Bin 3099 -> 865 bytes Documentation/pictures/nav-active-2.png | Bin 223 -> 0 bytes Documentation/pictures/nav-active.png | Bin 242 -> 0 bytes Documentation/pictures/nav-bg-2.png | Bin 229 -> 0 bytes Documentation/pictures/nav-bg.png | Bin 234 -> 0 bytes Documentation/pictures/nav-hover-2.png | Bin 244 -> 0 bytes Documentation/pictures/nav-hover.png | Bin 250 -> 0 bytes Documentation/pictures/nav1-active.png | 0 Documentation/pictures/nav1-bg.png | 0 Documentation/pictures/nav1-hover.png | 0 Documentation/pictures/nav2-active.png | 0 Documentation/pictures/nav2-bg.png | 0 Documentation/pictures/nav2-hover.png | 0 Documentation/pictures/squiggle.jpg | Bin 3052 -> 0 bytes Documentation/pictures/summary-gradient.png | Bin 504 -> 0 bytes .../pictures/text-input-1-annotate-ca.png | Bin 0 -> 22852 bytes .../pictures/text-input-2-annotate-ca.png | Bin 0 -> 43206 bytes .../text-input-parts-both-annotate-ca.png | Bin 0 -> 37624 bytes .../text-input-parts-single-annotate-ca.png | Bin 0 -> 27010 bytes .../pictures/text-input-pop-annotate-ca.png | Bin 0 -> 43667 bytes .../pictures/text-input-score-annotate-ca.png | Bin 0 -> 19046 bytes Documentation/po/ca.po | 11795 ++++++++++++++++ Documentation/po/cs.po | 2 +- Documentation/po/de.po | 2 +- Documentation/po/it.po | 2 +- Documentation/po/lilypond-doc.pot | 11502 +-------------- Documentation/search-box.ihtml | 6 +- Documentation/snippets.tely | 2 +- Documentation/snippets/README | 2 +- .../snippets/accordion-discant-symbols.ly | 29 +- .../snippets/accordion-register-symbols.ly | 46 + Documentation/snippets/accordion-registers.ly | 40 - ...a-figured-bass-above-or-below-the-notes.ly | 23 +- .../snippets/adding-ambitus-per-voice.ly | 5 +- .../adding-an-extra-staff-at-a-line-break.ly | 5 +- .../snippets/adding-an-extra-staff.ly | 5 +- ...ing-an-ottava-marking-to-a-single-voice.ly | 4 +- .../adding-bar-lines-to-chordnames-context.ly | 6 +- ...hen-using-tuplet-and-non-tuplet-rhythms.ly | 5 +- Documentation/snippets/adding-drum-parts.ly | 20 +- .../adding-extra-fingering-with-scheme.ly | 23 +- .../snippets/adding-fingerings-to-a-score.ly | 5 +- .../adding-fingerings-to-tablatures.ly | 6 +- ...to-staves-which-get-split-after-a-break.ly | 195 +- .../snippets/adding-links-to-objects.ly | 11 +- .../snippets/adding-markups-in-a-tablature.ly | 48 + ...adding-orchestral-cues-to-a-vocal-score.ly | 18 +- ...ound-an-expressive-mark-or-chordal-note.ly | 5 +- .../adding-the-current-date-to-a-score.ly | 5 +- .../adding-timing-marks-to-long-glissandi.ly | 28 +- ...ing-volta-brackets-to-additional-staves.ly | 5 +- .../additional-voices-to-avoid-collisions.ly | 4 +- .../snippets/adjusting-grace-note-spacing.ly | 5 +- .../adjusting-lyrics-vertical-spacing.ly | 9 +- .../adjusting-the-shape-of-falls-and-doits.ly | 4 +- ...aligning-and-centering-instrument-names.ly | 5 +- .../snippets/aligning-bar-numbers.ly | 5 +- ...-objects-created-with-the--mark-command.ly | 5 +- .../aligning-syllables-with-melisma.ly | 6 +- ...ngerings-to-be-printed-inside-the-staff.ly | 5 +- .../altering-the-length-of-beamed-stems.ly | 5 +- .../snippets/alternative-bar-numbering.ly | 24 +- .../snippets/alternative-breve-notes.ly | 4 +- .../snippets/ambitus-with-multiple-voices.ly | 5 +- Documentation/snippets/ambitus.ly | 5 +- .../analysis-brackets-above-the-staff.ly | 6 +- Documentation/snippets/ancient-fonts.ly | 56 +- Documentation/snippets/ancient-headword.ly | 4 +- ...modern-transcription-of-gregorian-music.ly | 18 +- ...-modern-transcription-of-mensural-music.ly | 251 - .../snippets/ancient-notation.snippet-list | 3 +- .../snippets/ancient-time-signatures.ly | 5 +- .../snippets/anglican-psalm-template.ly | 5 +- ...yles-depending-on-the-step-of-the-scale.ly | 4 +- .../snippets/arabic-improvisation.ly | 5 +- ...anging-separate-lyrics-on-a-single-line.ly | 71 + Documentation/snippets/asymmetric-slurs.ly | 5 +- .../snippets/automatic-beam-subdivisions.ly | 8 +- .../automatically-change-durations.ly | 11 +- ...-of-the-middle-note-based-on-the-melody.ly | 8 +- ...oiding-collisions-with-chord-fingerings.ly | 10 +- ...-notation-for-guitar-with-text-spanner.ly} | 31 +- .../snippets/beam-endings-in-score-context.ly | 11 +- .../snippets/beam-grouping-in-7-8-time.ly | 28 - .../snippets/beams-across-line-breaks.ly | 5 +- ...staff-lines-using-the--whiteout-command.ly | 8 +- Documentation/snippets/book-parts.ly | 5 +- Documentation/snippets/breathing-signs.ly | 11 +- .../snippets/broken-crescendo-hairpin.ly | 33 +- .../caesura-railtracks-with-fermata.ly | 15 +- .../center-text-below-hairpin-dynamics.ly | 75 +- .../snippets/centered-measure-numbers.ly | 27 +- ...ring-markup-on-note-heads-automatically.ly | 65 - .../snippets/changing--flageolet-mark-size.ly | 5 +- ...changing-a-single-notes-size-in-a-chord.ly | 9 +- .../snippets/changing-beam-knee-gap.ly | 5 +- .../changing-beam-thickness-and-spacing.ly | 32 + .../snippets/changing-chord-separator.ly | 5 +- .../changing-form-of-multi-measure-rests.ly | 25 +- .../snippets/changing-fret-orientations.ly | 5 +- ...ng-midi-output-to-one-channel-per-voice.ly | 8 +- .../snippets/changing-ottava-text.ly | 34 + .../snippets/changing-partcombine-texts.ly | 5 +- ...hanging-properties-for-individual-grobs.ly | 39 +- .../snippets/changing-stanza-fonts.ly | 8 +- ...xt-and-spanner-styles-for-text-dynamics.ly | 5 +- .../snippets/changing-the-ambitus-gap.ly | 4 +- ...f-a-slur-from-solid-to-dotted-or-dashed.ly | 5 +- .../changing-the-breath-mark-symbol.ly | 4 +- ...names-to-german-or-semi-german-notation.ly | 35 +- .../changing-the-default-bar-lines.ly | 48 + .../changing-the-default-text-font-family.ly | 7 +- ...ging-the-interval-of-lines-on-the-stave.ly | 5 +- ...he-number-of-augmentation-dots-per-note.ly | 4 +- ...changing-the-number-of-lines-in-a-staff.ly | 5 +- ...e-positions-of-figured-bass-alterations.ly | 5 +- .../changing-the-size-of-woodwind-diagrams.ly | 4 +- .../snippets/changing-the-staff-size.ly | 5 +- ...ging-the-tempo-without-a-metronome-mark.ly | 5 +- .../changing-the-text-for-sustain-markings.ly | 5 +- .../snippets/changing-the-tuplet-number.ly | 24 +- ...olymetric-section-using--scaledurations.ly | 29 +- .../snippets/chant-or-psalms-notation.ly | 22 +- .../snippets/chord-glissando-in-tablature.ly | 20 +- .../snippets/chord-name-exceptions.ly | 5 +- Documentation/snippets/chord-name-major7.ly | 5 +- .../snippets/chordchanges-for-fretboards.ly | 4 +- Documentation/snippets/chords-headword.ly | 24 +- Documentation/snippets/chords.snippet-list | 2 +- ...-can-be-transposed-by-arbitrary-amounts.ly | 5 +- Documentation/snippets/clip-systems.ly | 7 +- Documentation/snippets/clusters.ly | 5 +- ...coloring-notes-depending-on-their-pitch.ly | 4 +- .../combining-dynamics-with-markup-texts.ly | 7 +- .../combining-two-parts-on-the-same-staff.ly | 5 +- .../snippets/compound-time-signatures.ly | 28 +- ...onducting-signs,-measure-grouping-signs.ly | 51 +- .../consistently-left-aligned-bar-numbers.ly | 6 +- .../snippets/contemporary-glissando.ly | 5 +- .../contemporary-notation.snippet-list | 1 + .../contexts-and-engravers.snippet-list | 2 +- ...g-spanner-visibility-after-a-line-break.ly | 4 +- ...lling-the-placement-of-chord-fingerings.ly | 5 +- ...olling-the-vertical-ordering-of-scripts.ly | 5 +- .../controlling-tuplet-bracket-visibility.ly | 8 +- .../snippets/correction-wanted.snippet-list | 2 - .../snippets/creating-a-delayed-turn.ly | 30 +- ...-a-sequence-of-notes-on-various-pitches.ly | 8 +- ...eggios-across-notes-in-different-voices.ly | 5 +- .../snippets/creating-blank-staves.ly | 20 +- ...-cross-staff-arpeggios-in-a-piano-staff.ly | 5 +- ...cross-staff-arpeggios-in-other-contexts.ly | 5 +- ...creating-custom-dynamics-in-midi-output.ly | 41 + .../creating-custom-key-signatures.ly | 43 + .../creating-double-digit-fingerings.ly | 17 +- ...creating-metronome-marks-in-markup-mode.ly | 5 +- .../creating-real-parenthesized-dynamics.ly | 18 +- .../creating-simultaneous-rehearsal-marks.ly | 6 +- .../snippets/creating-slurs-across-voices.ly | 5 +- .../snippets/creating-text-spanners.ly | 5 +- ...ff-chords---beaming-problems-workaround.ly | 9 +- Documentation/snippets/cross-staff-stems.ly | 29 +- .../snippets/cross-staff-tremolos.ly | 5 +- Documentation/snippets/custodes.ly | 5 +- ...e-and-drumpitchtable-in-layout-and-midi.ly | 151 + .../customizing-fretboard-fret-diagrams.ly | 5 +- .../customizing-markup-fret-diagrams.ly | 5 +- ...number-of-dots-in-repeat-sign-bar-lines.ly | 76 + ...f-stems-on-the-center-line-of-the-staff.ly | 5 +- ...an-engraver-in-scheme--ambitus-engraver.ly | 52 +- ...efined-fretboards-for-other-instruments.ly | 7 +- .../snippets/demo-midiinstruments.ly | 5 +- .../snippets/demonstrating-all-headers.ly | 5 +- ...bracket-with-only-one-staff-in-a-system.ly | 4 +- ...stem-if-only-one-of-its-staves-is-alive.ly | 12 +- .../snippets/displaying-complex-chords.ly | 13 +- .../snippets/displaying-grob-ancestry.ly | 81 +- Documentation/snippets/dotted-harmonics.ly | 5 +- Documentation/snippets/double-glissando.ly | 5 +- .../snippets/drawing-boxes-around-grobs.ly | 6 +- .../drawing-circles-around-note-heads.ly | 6 +- .../drawing-circles-around-various-objects.ly | 4 +- .../dynamics-custom-text-spanner-postfix.ly | 8 +- .../snippets/dynamics-text-spanner-postfix.ly | 4 +- .../editorial-annotations.snippet-list | 1 + Documentation/snippets/editorial-headword.ly | 6 +- ...ng-native-postscript-in-a--markup-block.ly | 5 +- .../snippets/engravers-one-by-one.ly | 9 +- .../snippets/engraving-ties-manually.ly | 5 +- .../engraving-tremolos-with-floating-beams.ly | 5 +- ...tuplets-using-only-one--tuplet-command.ly} | 30 +- Documentation/snippets/expressive-headword.ly | 26 +- .../snippets/extending-a-trillspanner.ly | 33 + .../extending-glissandi-across-repeats.ly | 36 +- .../snippets/faking-a-hammer-in-tablatures.ly | 5 +- .../snippets/figured-bass-headword.ly | 4 +- .../snippets/fine-tuning-pedal-brackets.ly | 5 +- .../fingering-symbols-for-wind-instruments.ly | 37 +- ...-indications,-and-right-hand-fingerings.ly | 5 +- Documentation/snippets/flamenco-notation.ly | 183 +- .../snippets/flat-flags-and-beam-nibs.ly | 33 +- Documentation/snippets/flat-ties.ly | 117 + Documentation/snippets/flute-slap-notation.ly | 24 +- .../forcing-a-clef-symbol-to-be-displayed.ly | 5 +- .../forcing-horizontal-shift-of-notes.ly | 5 +- .../snippets/forcing-hyphens-to-be-shown.ly | 5 +- ...-width-to-adapt-to-metronomemarks-width.ly | 40 +- ...-to-start-from-a-given-letter-or-number.ly | 9 +- .../snippets/formatting-lyrics-syllables.ly | 4 +- .../fret-diagrams-explained-and-developed.ly | 5 +- .../snippets/fretboards-alternate-tables.ly | 4 +- Documentation/snippets/fretted-headword.ly | 39 +- .../fretted-string-harmonics-in-tablature.ly | 7 +- .../snippets/fretted-strings.snippet-list | 4 +- .../snippets/generating-custom-flags.ly | 25 +- .../snippets/generating-random-notes.ly | 5 +- ...arts-in-scheme-without-using-the-parser.ly | 53 +- .../snippets/glissandi-can-skip-grobs.ly | 22 +- .../graphical-and-text-woodwind-diagrams.ly | 4 +- .../grid-lines--changing-their-appearance.ly | 5 +- ...izing-rhythms-and-notes-synchronization.ly | 5 +- Documentation/snippets/guitar-slides.ly | 23 +- .../snippets/guitar-strum-rhythms.ly | 5 +- .../hairpins-with-different-line-styles.ly | 5 +- .../hammer-on-and-pull-off-using-chords.ly | 18 +- .../hammer-on-and-pull-off-using-voices.ly | 20 +- .../snippets/hammer-on-and-pull-off.ly | 16 +- ...y-customized-polymetric-time-signatures.ly | 16 +- ...tied-notes-at-the-start-of-a-new-system.ly | 4 +- ...ing-the-extender-line-for-text-dynamics.ly | 5 +- ...ynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly | 50 +- .../how-to-change-fret-diagram-position.ly | 9 +- ...ove-and-below-the-same-barline-method-1.ly | 44 +- ...ove-and-below-the-same-barline-method-2.ly | 5 +- ...to-put-ties-between-syllables-in-lyrics.ly | 5 +- Documentation/snippets/hymn-template.ly | 5 +- Documentation/snippets/incipit.ly | 179 +- ...ross-staff-chords-with-arpeggio-bracket.ly | 5 +- Documentation/snippets/inserting-a-caesura.ly | 5 +- ...ore-fragments-above-a-staff,-as-markups.ly | 16 +- .../snippets/isolated-percent-repeats.ly | 7 +- Documentation/snippets/jazz-combo-template.ly | 23 +- .../snippets/keep-change-clefs-full-sized.ly | 5 +- Documentation/snippets/keyboard-headword.ly | 15 +- Documentation/snippets/keyboards.snippet-list | 3 +- Documentation/snippets/laissez-vibrer-ties.ly | 5 +- ...taff-print-the-topmost-string-at-bottom.ly | 49 + .../snippets/letter-tablature-formatting.ly | 5 +- Documentation/snippets/line-arrows.ly | 5 +- Documentation/snippets/lyrics-alignment.ly | 4 +- Documentation/snippets/makam-example.ly | 7 +- ...invisible-with-the-transparent-property.ly | 10 +- .../snippets/making-glissandi-breakable.ly | 22 +- ...aking-slurs-with-complex-dash-structure.ly | 4 +- ...ome-staff-lines-thicker-than-the-others.ly | 4 +- ...ed-bass-extenders-for-only-some-numbers.ly | 5 +- .../manually-controlling-beam-positions.ly | 5 +- ...f-spoken-parts-with-a-cross-on-the-stem.ly | 5 +- Documentation/snippets/markup-lines.ly | 18 +- Documentation/snippets/measure-counter.ly | 4 +- ...che-layout-bar-lines-between-the-staves.ly | 10 +- ...ulti-measure-rests-in-a-polyphonic-part.ly | 16 +- Documentation/snippets/midi.snippet-list | 3 + ...ues-for-articulation-shorthand-notation.ly | 7 +- .../modifying-the-ottava-spanner-slope.ly | 37 + .../modifying-tuplet-bracket-length.ly | 21 +- .../moving-dotted-notes-in-polyphony.ly | 10 +- .../moving-slur-positions-vertically.ly | 5 +- .../snippets/multi-measure-rest-markup.ly | 36 +- Documentation/snippets/nesting-staves.ly | 5 +- .../snippets/new/accordion-discant-symbols.ly | 176 - .../snippets/new/accordion-registers.ly | 32 - ...a-figured-bass-above-or-below-the-notes.ly | 42 - .../new/adding-extra-fingering-with-scheme.ly | 39 - ...adding-orchestral-cues-to-a-vocal-score.ly | 80 - .../adding-timing-marks-to-long-glissandi.ly | 48 - .../snippets/new/alternative-bar-numbering.ly | 27 - Documentation/snippets/new/ancient-fonts.ly | 225 - ...modern-transcription-of-gregorian-music.ly | 51 - ...-notation-for-guitar--with-text-spanner.ly | 63 - .../snippets/new/broken-crescendo-hairpin.ly | 42 - .../snippets/new/centered-measure-numbers.ly | 48 - ...ring-markup-on-note-heads-automatically.ly | 57 - .../changing-form-of-multi-measure-rests.ly | 24 + ...hanging-properties-for-individual-grobs.ly | 30 + .../new/changing-the-tuplet-number.ly | 23 - ...olymetric-section-using--scaledurations.ly | 39 - .../snippets/new/chant-or-psalms-notation.ly | 30 - Documentation/snippets/new/chords-headword.ly | 95 - .../snippets/new/compound-time-signatures.ly | 22 - ...onducting-signs,-measure-grouping-signs.ly | 49 - .../snippets/new/creating-a-delayed-turn.ly | 38 - ...-a-sequence-of-notes-on-various-pitches.ly | 6 +- .../new/creating-double-digit-fingerings.ly | 17 - .../creating-real-parenthesized-dynamics.ly | 35 - .../snippets/new/cross-staff-stems.ly | 36 - ...an-engraver-in-scheme--ambitus-engraver.ly | 50 +- ...l-tuplets-using-only-one--times-command.ly | 28 - .../snippets/new/expressive-headword.ly | 268 - .../new/extending-glissandi-across-repeats.ly | 62 - .../snippets/new/flat-flags-and-beam-nibs.ly | 86 + .../snippets/new/flute-slap-notation.ly | 38 + ...-width-to-adapt-to-metronomemarks-width.ly | 33 + .../snippets/new/fretted-headword.ly | 142 - .../snippets/new/generating-custom-flags.ly | 62 - .../snippets/new/glissandi-can-skip-grobs.ly | 13 - Documentation/snippets/new/guitar-slides.ly | 45 - .../hammer-on-and-pull-off-using-chords.ly | 21 - .../hammer-on-and-pull-off-using-voices.ly | 20 - .../snippets/new/hammer-on-and-pull-off.ly | 18 - ...y-customized-polymetric-time-signatures.ly | 35 - ...ynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly | 168 - ...ove-and-below-the-same-barline-method-1.ly | 47 - Documentation/snippets/new/incipit.ly | 177 +- ...ore-fragments-above-a-staff,-as-markups.ly | 39 - .../snippets/new/jazz-combo-template.ly | 272 - .../snippets/new/keyboard-headword.ly | 242 - ...invisible-with-the-transparent-property.ly | 8 +- .../new/making-glissandi-breakable.ly | 31 - ...ulti-measure-rests-in-a-polyphonic-part.ly | 35 - .../new/modifying-tuplet-bracket-length.ly | 33 + .../snippets/new/multi-measure-rest-markup.ly | 34 + .../new/non-traditional-key-signatures.ly | 44 + .../new/numbering-groups-of-measures.ly | 53 - .../new/numbers-as-easy-note-heads.ly | 54 - .../snippets/new/pitches-headword.ly | 137 - .../new/positioning-multi-measure-rests.ly | 5 +- ...repeat-sign-at-the-beginning-of-a-piece.ly | 36 - .../printing-hairpins-in-various-styles.ly | 30 - ...uoting-another-voice-with-transposition.ly | 42 - .../redefining-grace-note-global-defaults.ly | 33 - ...ng-default-midi-instrument-equalization.ly | 59 + Documentation/snippets/new/rest-styles.ly | 43 + .../new/score-for-diatonic-accordion.ly | 240 - ...le-staff-template-with-notes-and-chords.ly | 37 + Documentation/snippets/new/staff-headword.ly | 26 +- .../snippets/new/strict-beat-beaming.ly | 21 - .../new/string-number-extender-lines.ly | 34 - .../snippets/new/subdividing-beams.ly | 54 + .../snippets/new/unfretted-headword.ly | 12 +- .../new/user-defined-time-signatures.ly | 27 + .../using-a-tick-as-the-breath-mark-symbol.ly | 25 - .../new/using-alternative-flag-styles.ly | 33 - ...ng-grace-note-slashes-with-normal-heads.ly | 18 - .../new/using-the-whiteout-property.ly | 33 + Documentation/snippets/new/utf-8.ly | 78 + ...ically-aligned-dynamics-and-textscripts.ly | 34 - Documentation/snippets/new/wind-headword.ly | 49 + .../new/woodwind-diagrams-key-lists.ly | 30 - .../snippets/non-default-tuplet-numbers.ly | 6 +- .../non-traditional-key-signatures.ly | 33 +- .../snippets/numbering-groups-of-measures.ly | 40 +- .../snippets/numbers-as-easy-note-heads.ly | 30 +- ...g-2.12-lyrics-spacing-in-newer-versions.ly | 16 +- .../open-string-harmonics-in-tablature.ly | 59 +- .../orchestra,-choir-and-piano-template.ly | 6 +- Documentation/snippets/ottava-text.ly | 5 +- .../snippets/outputting-the-version-number.ly | 5 +- ...erriding-articulations-of-destinct-type.ly | 6 +- Documentation/snippets/page-label.ly | 5 +- .../snippets/paper-and-layout.snippet-list | 1 + .../snippets/partcombine-and-autobeamoff.ly | 5 +- .../percent-repeat-count-visibility.ly | 5 +- .../snippets/percent-repeat-counter.ly | 5 +- Documentation/snippets/percussion-beaters.ly | 13 +- .../snippets/percussion.snippet-list | 1 + ...tting-line-breaks-within-beamed-tuplets.ly | 5 +- .../snippets/piano-template-simple.ly | 5 +- .../piano-template-with-centered-lyrics.ly | 18 +- .../piano-template-with-melody-and-lyrics.ly | 5 +- Documentation/snippets/pitches-headword.ly | 18 +- Documentation/snippets/pitches.snippet-list | 4 + .../placement-of-right-hand-fingerings.ly | 5 +- .../snippets/polyphony-in-tablature.ly | 5 +- .../snippets/positioning-arpeggios.ly | 5 +- ...tioning-fingering-indications-precisely.ly | 18 +- ...eams-at-the-height-of-normal-note-beams.ly | 5 +- ...tioning-grace-notes-with-floating-space.ly | 5 +- .../positioning-multi-measure-rests.ly | 7 +- ...itioning-segno-and-coda-with-line-break.ly | 60 +- .../positioning-text-markups-inside-slurs.ly | 5 +- ...naturals-from-being-automatically-added.ly | 4 +- ...g-final-mark-from-removing-final-tuplet.ly | 6 +- ...-printed-when-the-key-signature-changes.ly | 5 +- ...repeat-sign-at-the-beginning-of-a-piece.ly | 44 - ...inting-bar-numbers-at-regular-intervals.ly | 5 +- ...ing-bar-numbers-inside-boxes-or-circles.ly | 5 +- ...numbers-with-changing-regular-intervals.ly | 26 + .../printing-hairpins-in-various-styles.ly | 18 +- ...nting-hairpins-using-al-niente-notation.ly | 5 +- .../printing-marks-at-the-end-of-a-line.ly | 5 +- .../snippets/printing-marks-on-every-staff.ly | 5 +- ...ome-and-rehearsal-marks-below-the-staff.ly | 10 +- ...ng-music-with-different-time-signatures.ly | 4 +- ...names-with-and-without-an-octave-marker.ly | 5 +- .../printing-text-from-right-to-left.ly | 5 +- ...ng-the-bar-number-for-the-first-measure.ly | 8 +- .../proportional-strict-notespacing.ly | 7 +- .../putting-lyrics-inside-the-staff.ly | 10 +- ...uoting-another-voice-with-transposition.ly | 21 +- .../snippets/quoting-another-voice.ly | 5 +- .../snippets/real-music.snippet-list | 1 - .../snippets/really-cool.snippet-list | 2 - .../snippets/recorder-fingering-chart.ly | 13 +- .../redefining-grace-note-global-defaults.ly | 16 +- .../removing-bar-numbers-from-a-score.ly | 9 +- ...ving-brace-on-first-line-of-piano-score.ly | 44 + ...n-staffgroup,-pianostaff,-or-grandstaff.ly | 5 +- .../snippets/removing-the-first-empty-line.ly | 5 +- Documentation/snippets/repeats-headword.ly | 7 +- Documentation/snippets/repeats.snippet-list | 2 +- ...ng-default-midi-instrument-equalization.ly | 67 + Documentation/snippets/rest-styles.ly | 38 +- .../reverting-default-beam-endings.ly | 7 +- Documentation/snippets/rhythmic-slashes.ly | 7 +- Documentation/snippets/rhythms-headword.ly | 8 +- Documentation/snippets/rhythms.snippet-list | 7 +- .../satb-choir-template---four-staves.ly | 13 +- .../snippets/scheme-language.snippet-list | 4 + .../snippets/score-for-diatonic-accordion.ly | 63 +- Documentation/snippets/screech-and-boink.ly | 4 +- ...ancellations-from-key-signature-changes.ly | 4 +- .../setting-hairpin-behavior-at-bar-lines.ly | 5 +- .../snippets/setting-system-separators.ly | 6 +- ...ing-the-double-repeat-default-for-volte.ly | 4 +- .../setting-the-minimum-length-of-hairpins.ly | 6 +- .../snippets/shortening-volta-brackets.ly | 5 +- .../snippets/showing-chords-at-changes.ly | 6 +- ...ulation-above-and-below-a-note-or-chord.ly | 5 +- Documentation/snippets/simple-lead-sheet.ly | 5 +- .../snippets/simultaneous-headword.ly | 7 +- .../snippets/simultaneous-notes.snippet-list | 1 + ...template-with-notes,-lyrics,-and-chords.ly | 5 +- ...te-with-notes,-lyrics,-chords-and-frets.ly | 5 +- ...le-staff-template-with-notes-and-chords.ly | 18 +- ...le-staff-template-with-notes-and-lyrics.ly | 5 +- .../single-staff-template-with-only-notes.ly | 5 +- .../snippets/skips-in-lyric-mode-2.ly | 5 +- Documentation/snippets/skips-in-lyric-mode.ly | 5 +- Documentation/snippets/slides-in-tablature.ly | 7 +- .../snap-pizzicato-or-bartok-pizzicato.ly | 4 +- .../snippets/specific-notation.snippet-list | 5 +- Documentation/snippets/staff-headword.ly | 27 +- .../snippets/staff-notation.snippet-list | 8 + .../snippets/stand-alone-two-column-markup.ly | 4 +- .../stem-and-beam-behavior-in-tablature.ly | 5 +- Documentation/snippets/stemlets.ly | 5 +- Documentation/snippets/strict-beat-beaming.ly | 27 +- .../snippets/string-number-extender-lines.ly | 33 +- .../string-quartet-template-simple.ly | 5 +- ...ng-quartet-template-with-separate-parts.ly | 5 +- Documentation/snippets/subdividing-beams.ly | 49 +- ...sing-warnings-for-clashing-note-columns.ly | 13 +- .../snippets/symbols-and-glyphs.snippet-list | 3 +- .../syntax-and-expressions.snippet-list | 3 +- Documentation/snippets/table-of-contents.ly | 7 +- Documentation/snippets/template.snippet-list | 1 - Documentation/snippets/text-headword.ly | 9 +- Documentation/snippets/text.snippet-list | 4 +- Documentation/snippets/three-sided-box.ly | 5 +- Documentation/snippets/tick-bar-lines.ly | 5 +- ...ime-signature-in-parentheses---method-3.ly | 7 +- .../snippets/time-signature-in-parentheses.ly | 7 +- ...tor-as-a-number-instead-of-the-fraction.ly | 9 +- ...scription-of-ancient-music-with-incipit.ly | 288 - ...ith-minimum-accidentals-smart-transpose.ly | 7 +- .../tuplet-bracket-and-change-staff.ly | 50 + .../snippets/tweaking-clef-properties.ly | 38 +- .../tweaking-grace-layout-within-music.ly | 5 +- .../tweaks-and-overrides.snippet-list | 12 +- .../two--partcombine-pairs-on-one-staff.ly | 101 + Documentation/snippets/unfretted-headword.ly | 14 +- ...e-bracket-at-the-start-of-a-staff-group.ly | 5 +- .../snippets/user-defined-time-signatures.ly | 35 + .../using-a-tick-as-the-breath-mark-symbol.ly | 26 +- .../snippets/using-alternative-flag-styles.ly | 55 +- .../using-an-extra-voice-for-breaks.ly | 43 + ...ggiobracket-to-make-divisi-more-visible.ly | 5 +- ...ing-autochange-with-more-than-one-voice.ly | 4 +- .../using-double-slurs-for-legato-chords.ly | 5 +- ...ng-grace-note-slashes-with-normal-heads.ly | 16 +- ...grob-object-to-access-grobs-with--tweak.ly | 14 +- ...pt-to-generate-special-note-head-shapes.ly | 5 +- ...l-and-modern-music-from-the-same-source.ly | 92 + ...tweak-command-to-tweak-individual-grobs.ly | 5 +- .../snippets/using-the-whiteout-property.ly | 16 +- .../snippets/using-ties-with-arpeggios.ly | 5 +- Documentation/snippets/utf-8.ly | 41 +- ...roups-without-connecting-systemstartbar.ly | 14 +- ...cal-line-as-a-baroque-articulation-mark.ly | 5 +- ...ically-aligned-dynamics-and-textscripts.ly | 22 +- ...aligning-dynamics-across-multiple-notes.ly | 5 +- .../vertically-aligning-ossias-and-lyrics.ly | 5 +- .../vertically-centered-common-lyrics.ly | 76 +- ...centering-paired-figured-bass-extenders.ly | 5 +- ...template-with-automatic-piano-reduction.ly | 25 +- ...rics-aligned-below-and-above-the-staves.ly | 5 +- ...nsemble-template-with-verse-and-refrain.ly | 5 +- .../snippets/vocal-ensemble-template.ly | 25 +- Documentation/snippets/vocal-headword.ly | 15 +- .../snippets/vocal-music.snippet-list | 2 + Documentation/snippets/volta-below-chords.ly | 5 +- Documentation/snippets/volta-multi-staff.ly | 5 +- .../volta-text-markup-using-repeatcommands.ly | 5 +- Documentation/snippets/wind-headword.ly | 26 +- .../snippets/woodwind-diagrams-key-lists.ly | 31 +- .../snippets/woodwind-diagrams-listing.ly | 8 +- .../snippets/workaround.snippet-list | 2 +- Documentation/topdocs/AUTHORS.texi | 2 +- Documentation/topdocs/INSTALL.texi | 3 +- Documentation/topdocs/README.texi | 9 +- Documentation/translations.itexi | 1470 +- Documentation/usage.tely | 9 +- Documentation/usage/external.itely | 255 +- Documentation/usage/lilypond-book.itely | 60 +- Documentation/usage/running.itely | 309 +- Documentation/usage/suggestions.itely | 141 +- Documentation/usage/updating.itely | 213 +- Documentation/web.texi | 68 +- Documentation/web/community.itexi | 345 +- Documentation/web/download.itexi | 67 +- Documentation/web/introduction.itexi | 554 +- Documentation/web/manuals.itexi | 6 +- Documentation/web/news-front.itexi | 171 +- Documentation/web/news.itexi | 1707 ++- .../web/server/lilypond.org.htaccess | 50 +- Documentation/web/server/robots.txt | 4 + Documentation/web/server/tweets.xml | 19 +- Documentation/zh/macros.itexi | 2 +- Documentation/zh/search-box.ihtml | 6 +- Documentation/zh/translations.itexi | 34 +- Documentation/zh/web.texi | 4 +- Documentation/zh/web/community.itexi | 8 +- Documentation/zh/web/download.itexi | 2 +- Documentation/zh/web/introduction.itexi | 12 +- Documentation/zh/web/manuals.itexi | 4 +- Documentation/zh/web/news-front.itexi | 2 +- GNUmakefile.in | 10 +- INSTALL.txt | 464 +- LICENSE.OFL | 2 +- NEWS.txt | 945 +- README.txt | 8 +- ROADMAP | 12 +- VERSION | 6 +- aclocal.m4 | 27 +- config.make.in | 8 +- configure | 1000 +- configure.ac | 91 +- elisp/lilypond-font-lock.el | 4 +- elisp/lilypond-indent.el | 31 +- elisp/lilypond-mode.el | 61 +- elisp/lilypond-what-beat.el | 68 +- flower/cpu-timer.cc | 2 +- flower/file-name.cc | 27 +- flower/file-path.cc | 5 +- flower/getopt-long.cc | 6 +- flower/include/arithmetic-operator.hh | 2 +- flower/include/axis.hh | 2 +- flower/include/compare.hh | 6 +- flower/include/cpu-timer.hh | 2 +- flower/include/direction.hh | 26 +- flower/include/drul-array.hh | 2 +- flower/include/file-name.hh | 2 +- flower/include/file-path.hh | 2 +- flower/include/flower-proto.hh | 4 +- flower/include/guile-compatibility.hh | 2 +- flower/include/international.hh | 2 +- flower/include/interval-set.hh | 2 +- flower/include/interval.hh | 3 +- flower/include/interval.tcc | 2 +- flower/include/libc-extension.hh | 2 +- flower/include/matrix.hh | 2 +- flower/include/memory-stream.hh | 2 +- flower/include/offset.hh | 10 +- flower/include/parray.hh | 2 +- flower/include/polynomial.hh | 3 +- flower/include/pqueue.hh | 4 +- flower/include/rational.hh | 3 +- flower/include/real.hh | 2 +- flower/include/std-string.hh | 9 +- flower/include/std-vector.hh | 53 +- flower/include/string-convert.hh | 1 + flower/include/tuple.hh | 2 +- flower/include/virtual-methods.hh | 2 +- flower/include/warn.hh | 2 +- flower/include/yaffut.hh | 2 - flower/international.cc | 2 +- flower/interval-set.cc | 2 +- flower/interval.cc | 2 +- flower/libc-extension.cc | 2 +- flower/memory-stream.cc | 2 +- flower/offset.cc | 16 +- flower/polynomial.cc | 2 +- flower/rational.cc | 8 +- flower/std-string.cc | 11 +- flower/string-convert.cc | 2 - flower/test-std.cc | 25 - flower/test-string.cc | 6 - flower/warn.cc | 2 +- input/regression/abc2ly/GNUmakefile | 4 +- input/regression/accidental-ancient.ly | 6 +- input/regression/accidental-clef-change.ly | 6 +- input/regression/accidental-collision.ly | 4 +- input/regression/accidental-contemporary.ly | 10 +- .../accidental-fingering-collision.ly | 4 +- input/regression/accidental-forced-tie.ly | 6 +- input/regression/accidental-grouping.ly | 6 +- input/regression/accidental-ledger.ly | 4 +- input/regression/accidental-piano.ly | 4 +- .../accidental-placement-padding.ly | 6 +- .../accidental-placement-samepitch.ly | 6 +- input/regression/accidental-placement.ly | 6 +- input/regression/accidental-quarter.ly | 6 +- input/regression/accidental-single-double.ly | 4 +- input/regression/accidental-suggestions.ly | 6 +- input/regression/accidental-tie.ly | 10 +- .../accidental-unbroken-tie-spacing.ly | 20 +- input/regression/accidental.ly | 4 +- input/regression/add-stem-support.ly | 6 +- .../regression/addlyrics-existing-context.ly | 25 + .../regression/addlyrics-to-staff-context.ly | 22 + input/regression/alignment-order.ly | 6 +- .../alignment-vertical-manual-setting.ly | 6 +- input/regression/alter-broken.ly | 6 +- input/regression/ambitus-cue.ly | 9 +- input/regression/ambitus.ly | 10 +- input/regression/apply-context.ly | 6 +- input/regression/apply-output.ly | 35 +- input/regression/arpeggio-no-overshoot.ly | 6 +- input/regression/arpeggio-no-staff-symbol.ly | 6 +- .../arpeggio-span-one-staff-collision.ly | 6 +- input/regression/arpeggio-span-one-staff.ly | 6 +- .../regression/articulation-snappizzicato.ly | 4 +- input/regression/auto-beam-breathe.ly | 6 +- input/regression/auto-beam-exceptions.ly | 38 +- input/regression/auto-beam-no-beam.ly | 4 +- input/regression/auto-beam-partial.ly | 6 +- input/regression/auto-beam-recheck.ly | 6 +- input/regression/auto-beam.ly | 6 +- input/regression/auto-change.ly | 4 +- input/regression/autobeam-3-4-rules.ly | 4 +- input/regression/autobeam-tuplet-recheck.ly | 6 +- input/regression/autochange-clefs.ly | 22 + input/regression/autochange-inside-grace.ly | 18 + input/regression/autochange-relative.ly | 17 + input/regression/autochange-turning-pitch.ly | 19 + input/regression/autochange-with-grace.ly | 17 + .../automatic-polyphony-context-id.ly | 4 +- input/regression/backend-svg.ly | 4 +- input/regression/baerenreiter-sarabande.ly | 15 +- input/regression/bar-line-define-bar-glyph.ly | 6 +- input/regression/bar-line-define-bar-line.ly | 6 +- input/regression/bar-line-segno.ly | 6 +- input/regression/bar-lines.ly | 6 +- input/regression/bar-number-check-warning.ly | 6 +- input/regression/bar-number-check.ly | 19 + input/regression/bar-number-visibility.ly | 6 +- input/regression/bar-number-volta-repeat.ly | 8 +- input/regression/bar-number.ly | 6 +- input/regression/beam-beamlet-break.ly | 6 +- input/regression/beam-beamlet-grace.ly | 6 +- input/regression/beam-beat-grouping.ly | 10 +- input/regression/beam-break.ly | 6 +- input/regression/beam-broken-classic.ly | 6 +- input/regression/beam-collision-basic.ly | 28 +- input/regression/beam-collision-beamcount.ly | 14 +- input/regression/beam-collision-classic.ly | 22 +- .../regression/beam-collision-cross-staff.ly | 10 +- .../regression/beam-collision-cross-staff2.ly | 4 +- input/regression/beam-collision-flag.ly | 6 +- input/regression/beam-collision-grace.ly | 6 +- input/regression/beam-collision-off.ly | 6 +- .../beam-collision-opposite-stem.ly | 34 +- .../beam-collision-prefatory-matter.ly | 6 +- .../regression/beam-collision-scaled-staff.ly | 6 +- input/regression/beam-collision-voice-only.ly | 6 +- input/regression/beam-concave-chord.ly | 10 +- input/regression/beam-concave-damped.ly | 6 +- input/regression/beam-concave.ly | 10 +- input/regression/beam-cross-staff-rest.ly | 6 +- input/regression/beam-cross-staff-slope.ly | 6 +- input/regression/beam-default-lengths.ly | 6 +- input/regression/beam-extreme.ly | 6 +- .../beam-feather-knee-stem-length.ly | 6 +- input/regression/beam-feather.ly | 6 +- input/regression/beam-forced-direction.ly | 6 +- input/regression/beam-french.ly | 6 +- input/regression/beam-funky-beamlet.ly | 6 +- input/regression/beam-funky.ly | 8 +- input/regression/beam-length.ly | 4 +- input/regression/beam-manual-beaming.ly | 6 +- input/regression/beam-multiple-cross-staff.ly | 14 +- .../beam-multiplicity-over-rests.ly | 8 +- input/regression/beam-over-barline.ly | 4 +- input/regression/beam-position.ly | 4 +- input/regression/beam-quanting-horizontal.ly | 6 +- input/regression/beam-quarter.ly | 6 +- input/regression/beam-rest-extreme.ly | 8 +- input/regression/beam-rest.ly | 6 +- input/regression/beam-single-stem.ly | 6 +- .../beam-subdivide-quarter-notes.ly | 17 + .../beam-subdivide-shortened-beam.ly | 28 + .../beam-subdivide-trailing-stem.ly | 22 + input/regression/beam-subdivision.ly | 24 + input/regression/beam-unconnected-beamlets.ly | 6 +- input/regression/beaming-ternary-metrum.ly | 6 +- input/regression/beaming.ly | 6 +- input/regression/beamlet-point-toward-beat.ly | 6 +- input/regression/beamlet-test.ly | 6 +- input/regression/beams.ly | 6 +- input/regression/bend-after.ly | 6 +- input/regression/bend-bound.ly | 23 + input/regression/bend-dot.ly | 4 +- input/regression/book-identifier-markup.ly | 4 +- input/regression/bookpart-variable.ly | 6 +- input/regression/bookparts.ly | 17 +- input/regression/breathing-sign-ancient.ly | 10 +- .../regression/breathing-sign-custom-staff.ly | 4 +- input/regression/breathing-sign.ly | 6 +- input/regression/cadenza-grace-autobeam.ly | 6 +- input/regression/chord-changes-alternative.ly | 22 + input/regression/chord-changes.ly | 6 +- input/regression/chord-dots.ly | 17 + input/regression/chord-name-major7.ly | 7 +- input/regression/chord-name-override-text.ly | 2 +- .../regression/chord-names-in-grand-staff.ly | 10 +- .../chord-repetition-accidentals.ly | 11 + input/regression/chord-repetition-relative.ly | 4 +- .../chord-repetition-script-stack.ly | 6 +- input/regression/chord-repetition-times.ly | 6 +- input/regression/chord-repetition.ly | 6 +- input/regression/chord-scripts.ly | 6 +- .../chord-tremolo-other-commands.ly | 6 +- .../chord-tremolo-stem-direction.ly | 4 +- input/regression/chords-funky-ignatzek.ly | 6 +- input/regression/chromatic-scales.ly | 4 +- input/regression/clef-ottava.ly | 6 +- .../clef-transposition-placement.ly | 48 +- .../clef-transposition-visibility.ly | 6 +- input/regression/clef-transposition.ly | 6 +- input/regression/clefs.ly | 43 +- input/regression/clip-systems.ly | 8 +- input/regression/cluster-break.ly | 6 +- input/regression/cluster-cross-staff.ly | 4 +- input/regression/cluster-style.ly | 6 +- input/regression/cluster.ly | 6 +- input/regression/collision-alignment.ly | 21 - input/regression/collision-dots-invert.ly | 6 +- input/regression/collision-dots-move.ly | 6 +- .../collision-dots-up-space-dotted.ly | 6 +- .../regression/collision-harmonic-no-dots.ly | 6 +- input/regression/collision-head-chords.ly | 6 +- input/regression/collision-heads.ly | 6 +- input/regression/collision-manual.ly | 37 +- .../collision-merge-differently-dotted.ly | 6 +- .../collision-merge-differently-headed.ly | 6 +- input/regression/collision-merge-dots.ly | 6 +- input/regression/collision-seconds.ly | 4 +- input/regression/collision-whole.ly | 6 +- input/regression/collisions.ly | 37 +- input/regression/color.ly | 6 +- input/regression/completion-heads-factor.ly | 16 +- input/regression/completion-heads-lyrics.ly | 6 +- .../completion-heads-polyphony-2.ly | 6 +- .../regression/completion-heads-polyphony.ly | 6 +- input/regression/completion-heads-tie.ly | 4 +- input/regression/completion-heads-unit.ly | 4 +- input/regression/completion-rest.ly | 14 +- input/regression/complex-once.ly | 6 +- .../compound-time-signature-style.ly | 14 + input/regression/compound-time-signatures.ly | 6 +- input/regression/context-mod-context.ly | 4 +- input/regression/context-mod-with.ly | 4 +- input/regression/context-nested-staffgroup.ly | 6 +- input/regression/cue-clef-after-barline.ly | 10 +- input/regression/cue-clef-begin-of-score.ly | 4 +- input/regression/cue-clef-keysignature.ly | 4 +- input/regression/cue-clef-manually.ly | 6 +- input/regression/cue-clef-new-line.ly | 6 +- .../cue-clef-transposition-optional.ly | 8 +- input/regression/cue-clef-transposition.ly | 8 +- input/regression/cue-clef.ly | 6 +- input/regression/define-event-function.ly | 8 +- input/regression/display-lily-tests.ly | 196 +- input/regression/divisi-staves.ly | 54 + input/regression/dot-column-engraver.ly | 6 +- input/regression/dot-dot-count-override.ly | 6 +- input/regression/dot-flag-collision.ly | 6 +- input/regression/dot-rest-beam-trigger.ly | 6 +- input/regression/dot-up-voice-collision.ly | 6 +- input/regression/dots.ly | 6 +- .../regression/double-repeat-default-volta.ly | 6 +- input/regression/double-repeat.ly | 10 +- .../duration-identifier-compressed.ly | 6 +- .../dynamics-alignment-autobreak.ly | 6 +- .../dynamics-alignment-breaker-linebreak.ly | 6 +- .../dynamics-alignment-breaker-order.ly | 4 +- ...cs-alignment-breaker-subsequent-spanner.ly | 6 +- .../regression/dynamics-alignment-breaker.ly | 6 +- .../dynamics-alignment-no-line-linebreak.ly | 6 +- .../regression/dynamics-alignment-no-line.ly | 6 +- .../dynamics-avoid-cross-staff-stem-3.ly | 6 +- .../dynamics-avoid-cross-staff-stem.ly | 19 - input/regression/dynamics-broken-hairpin.ly | 14 +- input/regression/dynamics-context-textspan.ly | 10 +- .../dynamics-custom-text-spanner-postfix.ly | 10 +- input/regression/dynamics-empty.ly | 4 +- input/regression/dynamics-glyphs.ly | 6 +- input/regression/dynamics-hairpin-length.ly | 6 +- input/regression/dynamics-rest-positioning.ly | 6 +- .../dynamics-text-dynamics-context.ly | 6 +- .../dynamics-text-spanner-postfix.ly | 6 +- input/regression/empty-chord.ly | 6 +- input/regression/event-listener-output.ly | 6 +- input/regression/ferneyhough-hairpins.ly | 14 +- input/regression/figured-bass-alteration.ly | 6 +- .../figured-bass-continuation-center.ly | 6 +- .../figured-bass-continuation-modifiers.ly | 6 +- input/regression/figured-bass-continuation.ly | 6 +- input/regression/figured-bass-implicit.ly | 6 +- .../figured-bass-slashed-numbers.ly | 4 +- input/regression/figured-bass-staff.ly | 6 +- input/regression/finger-chords-dot.ly | 6 +- input/regression/finger-chords-order.ly | 10 +- .../fingering-column-snap-radius.ly | 6 +- input/regression/fingering-column.ly | 6 +- input/regression/fingering-directions.ly | 6 +- input/regression/fingering.ly | 6 +- .../flags-straight-stockhausen-boulez.ly | 7 +- input/regression/flip-stencil.ly | 32 + input/regression/follow-voice-consecutive.ly | 6 +- input/regression/font-family-override.ly | 8 +- input/regression/font-name.ly | 13 +- input/regression/font-postscript.ly | 4 +- .../footnote-auto-numbering-page-reset.ly | 8 +- .../footnote-auto-numbering-vertical-order.ly | 10 +- input/regression/footnote-auto-numbering.ly | 8 +- input/regression/footnote-break-visibility.ly | 6 +- input/regression/footnote-spanner.ly | 6 +- input/regression/footnote.ly | 8 +- input/regression/fret-boards.ly | 4 +- input/regression/fret-diagrams-dots.ly | 40 +- input/regression/fret-diagrams-fingering.ly | 23 +- input/regression/fret-diagrams-fret-label.ly | 13 +- .../regression/fretdiagram-markup-in-dots.ly | 31 + input/regression/full-measure-rest-fermata.ly | 6 +- input/regression/general-scheme-bindings.ly | 4 +- input/regression/generic-output-property.ly | 6 +- input/regression/glissando-accidental.ly | 6 +- input/regression/glissando-broken-multiple.ly | 6 +- input/regression/glissando-broken-unkilled.ly | 10 +- input/regression/glissando-broken.ly | 6 +- input/regression/glissando-chord.ly | 6 +- input/regression/glissando-consecutive.ly | 6 +- input/regression/glissando-dots.ly | 24 + input/regression/glissando-index.ly | 6 +- input/regression/glissando-no-break.ly | 6 +- input/regression/glissando-skip.ly | 4 +- input/regression/grace-bar-line.ly | 6 +- input/regression/grace-bar-number.ly | 4 +- input/regression/grace-beam.ly | 6 +- input/regression/grace-direction-polyphony.ly | 6 +- input/regression/grace-end.ly | 6 +- input/regression/grace-nest3.ly | 6 +- input/regression/grace-nest5.ly | 6 +- input/regression/grace-part-combine.ly | 10 +- input/regression/grace-slashed-no-slur.ly | 4 +- input/regression/grace-stem-length.ly | 6 +- input/regression/grace-sync.ly | 6 +- input/regression/grace-types.ly | 6 +- input/regression/grace-volta-repeat-2.ly | 6 +- input/regression/hairpin-barline-break.ly | 6 +- input/regression/hairpin-circled.ly | 6 +- input/regression/hairpin-clef.ly | 6 +- input/regression/hairpin-dashed.ly | 6 +- input/regression/hairpin-ending.ly | 6 +- input/regression/hairpin-key-signature.ly | 6 +- .../hairpin-neighboring-span-dynamics.ly | 6 +- input/regression/hairpin-span-bar.ly | 14 +- input/regression/hairpin-to-barline-mark.ly | 6 +- input/regression/hairpin-to-barline.ly | 6 +- input/regression/hairpin-to-rest.ly | 6 +- input/regression/halfopenvertical.ly | 19 + .../hara-kiri-keep-previous-settings.ly | 14 +- input/regression/hara-kiri-stanza-number.ly | 4 +- input/regression/harp-pedals-sanity-checks.ly | 6 +- input/regression/harp-pedals-tweaking.ly | 6 +- input/regression/harp-pedals.ly | 6 +- .../regression/header-book-multiplescores.ly | 4 +- input/regression/header-score-reordered.ly | 2 +- input/regression/horizontal-bracket-tweak.ly | 6 +- input/regression/horizontal-bracket.ly | 6 +- input/regression/identifier-alists.ly | 20 + .../identifier-following-chordmode.ly | 6 +- input/regression/identifiers.ly | 10 +- input/regression/incipit.ly | 29 +- input/regression/include-string.ly | 4 +- input/regression/inherit-acceptability.ly | 22 + input/regression/input-order-alignment.ly | 25 + input/regression/instrument-cue-name.ly | 6 +- input/regression/instrument-name-dynamic.ly | 6 +- input/regression/instrument-name-partial.ly | 4 +- .../instrument-name-pedal-lyrics.ly | 10 +- input/regression/instrument-name-volta.ly | 10 +- .../instrument-switch-invalid-warning.ly | 6 +- input/regression/instrument-switch.ly | 6 +- input/regression/key-clefs.ly | 6 +- input/regression/key-signature-left-edge.ly | 4 +- input/regression/key-signature-padding.ly | 4 +- .../key-signature-scordatura-persist.ly | 10 +- input/regression/key-signature-scordatura.ly | 12 +- input/regression/keys.ly | 8 +- input/regression/kievan-notation.ly | 13 +- input/regression/laissez-vibrer-chords.ly | 6 +- .../laissez-vibrer-tie-head-direction.ly | 6 +- input/regression/laissez-vibrer-ties.ly | 6 +- input/regression/landscape.ly | 4 +- input/regression/layout-from.ly | 4 +- input/regression/ledger-extra.ly | 28 + input/regression/ledger-line-minimum.ly | 6 +- input/regression/ledger-line-shorten.ly | 6 +- input/regression/ledger-lines-dynamics.ly | 6 +- .../regression/ledger-lines-varying-staves.ly | 6 +- .../ledger-positions-customization.ly | 27 + input/regression/les-nereides.ly | 7 +- input/regression/lily-in-scheme.ly | 8 +- input/regression/lilypond-book/GNUmakefile | 5 +- input/regression/lilypond-book/include.ly | 3 +- .../lilypond-book/include/example.ly | 4 +- input/regression/lilypond-book/include2.ly | 4 +- input/regression/lilypond-book/include3.ily | 6 +- input/regression/lilypond-book/melody.ly | 3 + .../lilypond-book/tex-include-file.lytex | 5 + .../lilypond-book/tex-include-options.lytex | 5 + .../lilypond-book/texinfo-include-file.tely | 4 + input/regression/line-arrows.ly | 6 +- input/regression/line-style-zigzag-spacing.ly | 6 +- input/regression/line-style.ly | 6 +- input/regression/loglevels.ly | 6 +- .../regression/lyric-combine-derived-voice.ly | 6 +- .../regression/lyric-combine-empty-warning.ly | 8 +- input/regression/lyric-combine-new.ly | 12 +- input/regression/lyric-combine-nullvoice.ly | 15 + input/regression/lyric-combine-polyphonic.ly | 6 +- .../lyric-combine-switch-voice-2.ly | 6 +- .../regression/lyric-combine-switch-voice.ly | 6 +- input/regression/lyric-combine.ly | 8 +- input/regression/lyric-extender-broken.ly | 4 +- input/regression/lyric-extender-completion.ly | 6 +- .../lyric-extender-includegraces.ly | 6 +- input/regression/lyric-extender-no-heads.ly | 6 +- input/regression/lyric-extender-rest.ly | 6 +- .../regression/lyric-extender-right-margin.ly | 6 +- input/regression/lyric-hyphen-break.ly | 6 +- input/regression/lyric-hyphen-retain.ly | 6 +- input/regression/lyric-melisma-alignment.ly | 6 +- input/regression/lyric-melisma-manual.ly | 6 +- input/regression/lyric-melisma-melisma.ly | 6 +- .../regression/lyric-no-association-rhythm.ly | 6 +- input/regression/lyric-phrasing.ly | 8 +- input/regression/lyric-tweak.ly | 12 +- input/regression/lyrics-after-grace.ly | 4 +- ...yrics-aligned-above-stay-close-to-staff.ly | 4 +- input/regression/lyrics-includegraces.ly | 6 +- input/regression/lyrics-melisma-beam.ly | 8 +- input/regression/lyrics-no-notes.ly | 13 +- input/regression/lyrics-pass-under-bar.ly | 4 +- input/regression/lyrics-tenor-clef.ly | 4 +- .../regression/magnifyMusic-dots-beamlets.ly | 30 + .../magnifyMusic-laissez-vibrer-ties.ly | 38 + .../regression/magnifyMusic-phrasing-slurs.ly | 31 + input/regression/magnifyMusic-repeat-ties.ly | 38 + input/regression/magnifyMusic-slurs.ly | 27 + .../magnifyMusic-stem-beam-spacing.ly | 32 + .../magnifyMusic-tablature-double-stems.ly | 20 + .../regression/magnifyMusic-text-interface.ly | 22 + input/regression/magnifyMusic-ties.ly | 47 + input/regression/magnifyStaff-bar-lines.ly | 33 + .../regression/magnifyStaff-dots-beamlets.ly | 21 + input/regression/magnifyStaff-space-alist.ly | 38 + .../magnifyStaff-staff-line-thickness.ly | 21 + .../magnifyStaff-tablature-double-stems.ly | 20 + .../regression/magnifyStaff-text-interface.ly | 37 + input/regression/make-relative-copies.ly | 4 +- input/regression/make-relative-music.ly | 4 +- input/regression/make-relative.ly | 20 +- input/regression/markup-compound-meter.ly | 28 + input/regression/markup-cyclic-reference.ly | 6 +- input/regression/markup-first-visible.ly | 87 + input/regression/markup-line-styles.ly | 79 +- input/regression/markup-map.ly | 19 + input/regression/markup-music-glyph.ly | 2 +- input/regression/markup-note-dot.ly | 6 +- input/regression/markup-note-styles.ly | 18 +- input/regression/markup-note.ly | 6 +- input/regression/markup-partial.ly | 19 + input/regression/markup-rest-styles.ly | 4 +- input/regression/markup-rest.ly | 6 +- input/regression/markup-score-multi-system.ly | 6 +- input/regression/markup-score.ly | 6 +- input/regression/markup-syntax.ly | 2 +- input/regression/measure-grouping.ly | 10 +- input/regression/metronome-mark-formatter.ly | 113 + .../regression/metronome-mark-loose-column.ly | 10 +- .../metronome-marking-align-order.ly | 6 +- .../metronome-marking-break-align.ly | 6 +- input/regression/metronome-parenthesized.ly | 6 +- input/regression/metronome-text.ly | 6 +- input/regression/midi-dynamics.ly | 6 +- input/regression/midi-grace-after-rest.ly | 14 + input/regression/midi-grace-after-tie.ly | 4 +- input/regression/midi-grace.ly | 6 +- input/regression/midi-key-signature.ly | 6 +- input/regression/midi-lyric-barcheck.ly | 6 +- input/regression/midi-microtone-off.ly | 4 +- input/regression/midi-pedal.ly | 6 +- input/regression/midi-scales.ly | 4 +- input/regression/midi-tuplets.ly | 4 +- input/regression/midi-volume-equaliser.ly | 46 +- input/regression/midi/GNUmakefile | 4 +- input/regression/midi/crescendo-abutting.ly | 10 + input/regression/midi/dynamic-initial.ly | 15 + input/regression/midi/key-initial.ly | 4 +- .../regression/midi/key-option-all-staves.ly | 8 +- input/regression/midi/key-option.ly | 4 +- input/regression/midi/lyrics-addlyrics.ly | 6 +- input/regression/midi/partcombine.ly | 10 +- input/regression/midi/quantize-duration-2.ly | 4 +- input/regression/midi/rest-dynamic.ly | 6 +- input/regression/midi/rest.ly | 6 +- .../regression/midi/sequence-name-scoping.ly | 82 + input/regression/midi/sequence-name.ly | 63 + input/regression/midi/staff-map-instrument.ly | 14 +- input/regression/midi/staff-map-voice.ly | 14 +- input/regression/midi/voice-2.ly | 6 +- input/regression/midi/voice-4.ly | 10 +- input/regression/midi/voice-5.ly | 12 +- .../regression/minimum-length-after-break.ly | 45 + .../regression/minimum-length-broken-ties.ly | 39 + input/regression/modal-transforms.ly | 4 +- input/regression/modern-tab-clef-scaled.ly | 4 +- input/regression/modern-tab-clef.ly | 8 +- input/regression/monochords.ly | 16 + input/regression/morgenlied.ly | 10 +- input/regression/mozart-hrn-3.ly | 6 +- input/regression/mozart-hrn3-allegro.ily | 22 +- input/regression/mozart-hrn3-romanze.ily | 12 +- input/regression/mozart-hrn3-rondo.ily | 36 +- .../regression/multiple-time-sig-settings.ly | 6 +- .../regression/music-function-direct-call.ly | 18 + .../regression/music-function-end-spanners.ly | 6 +- input/regression/music-function-incomplete.ly | 15 + input/regression/music-function-post-event.ly | 8 +- .../music-function-string-markup.ly | 4 +- input/regression/music-function.ly | 4 +- .../musicxml/01b-Pitches-Intervals.xml | 136 +- .../musicxml/02a-Rests-Durations.xml | 55 +- .../musicxml/41f-StaffGroups-Overlapping.xml | 4 +- ...42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml | 2 +- .../newaddlyrics-music-identifiers.ly | 4 +- input/regression/newaddlyrics.ly | 10 +- input/regression/no-staff.ly | 6 +- input/regression/note-collision-threshold.ly | 46 + input/regression/note-head-chord.ly | 6 +- input/regression/note-head-harmonic-dotted.ly | 6 +- input/regression/note-head-harmonic-whole.ly | 6 +- input/regression/note-head-style.ly | 6 +- input/regression/note-names-context.ly | 7 +- input/regression/note-names.ly | 13 +- input/regression/notehead-height.ly | 15 + input/regression/number-staff-lines.ly | 4 +- input/regression/offsets.ly | 6 +- .../one-line-auto-height-breaking.ly | 11 + input/regression/one-staff.ly | 25 + input/regression/optional-args-backup.ly | 8 +- input/regression/optional-args-predicate.ly | 8 +- input/regression/optional-args.ly | 19 +- input/regression/ottava-broken.ly | 6 +- input/regression/ottava.ly | 6 +- input/regression/override-nest-scheme.ly | 6 +- input/regression/override-nest.ly | 8 +- .../page-breaking-good-estimation.ly | 6 +- .../regression/page-breaking-min-distance.ly | 4 +- input/regression/page-breaks.ly | 4 +- input/regression/page-headers-and-footers.ly | 4 +- input/regression/page-label-loose-column.ly | 6 +- input/regression/page-layout.ly | 10 +- .../page-spacing-nonstaff-lines-and-markup.ly | 4 +- .../page-spacing-nonstaff-lines-between.ly | 6 +- .../page-spacing-nonstaff-lines-bottom.ly | 6 +- ...page-spacing-nonstaff-lines-independent.ly | 8 +- .../page-spacing-nonstaff-lines-top.ly | 6 +- input/regression/page-spacing-system-count.ly | 8 +- input/regression/page-spacing.ly | 10 +- input/regression/page-top-space.ly | 8 +- ...page-turn-page-breaking-auto-first-page.ly | 4 +- .../page-turn-page-breaking-badturns.ly | 4 +- .../page-turn-page-breaking-repeats.ly | 4 +- input/regression/page-turn-page-breaking.ly | 4 +- input/regression/paper-margins-consistency.ly | 4 +- input/regression/paper-margins-left-margin.ly | 4 +- input/regression/paper-margins-line-width.ly | 4 +- input/regression/paper-margins-no-checks.ly | 4 +- input/regression/paper-margins-overrun.ly | 4 +- .../regression/paper-margins-right-margin.ly | 4 +- input/regression/paper-margins.ly | 4 +- input/regression/paper-nested-override.ly | 4 +- input/regression/paper-nested-override2.ly | 6 +- input/regression/paper-twosided-bcorr.ly | 4 +- input/regression/paper-twosided.ly | 4 +- input/regression/parallelmusic-partial.ly | 34 + ...gnment-synchronized-with-self-alignment.ly | 36 + input/regression/parenthesize-markup.ly | 4 +- .../parenthesize-notes-accidentals.ly | 13 + input/regression/parenthesize.ly | 6 +- input/regression/part-combine-a2.ly | 6 +- input/regression/part-combine-chord-range.ly | 23 + input/regression/part-combine-cross.ly | 6 +- .../part-combine-force-mmrest-position.ly | 6 +- input/regression/part-combine-force-once.ly | 22 +- input/regression/part-combine-force.ly | 16 +- input/regression/part-combine-global.ly | 10 +- input/regression/part-combine-inside-grace.ly | 15 + input/regression/part-combine-markup.ly | 6 +- ...part-combine-mmrest-after-apart-silence.ly | 18 + .../part-combine-mmrest-after-solo.ly | 4 +- .../regression/part-combine-mmrest-shared.ly | 26 + input/regression/part-combine-relative.ly | 17 + .../regression/part-combine-silence-mixed.ly | 18 + input/regression/part-combine-silence.ly | 31 + input/regression/part-combine-solo-global.ly | 10 +- input/regression/part-combine-solo.ly | 6 +- input/regression/part-combine-strings.ly | 26 + input/regression/part-combine-text-wait.ly | 10 +- input/regression/part-combine-text.ly | 6 +- input/regression/part-combine-tuplet-end.ly | 8 +- .../regression/part-combine-tuplet-single.ly | 10 +- .../part-combine-unequal-lengths.ly | 14 + input/regression/part-combine-with-grace.ly | 14 + input/regression/part-combine.ly | 12 +- input/regression/partial-in-mid-piece.ly | 32 + input/regression/partial-polymetric.ly | 6 +- input/regression/pdfmark-metadata.ly | 4 +- input/regression/pedal-bracket.ly | 6 +- input/regression/phrasing-slur-multiple.ly | 12 +- input/regression/phrasing-slur-tuplet.ly | 6 +- input/regression/point-and-click-types.ly | 6 +- input/regression/prefatory-separation.ly | 10 +- input/regression/property-nested-override.ly | 10 +- input/regression/property-nested-revert.ly | 6 +- input/regression/property-once.ly | 6 +- input/regression/quote-cue-during.ly | 8 +- input/regression/quote-cue-event-types.ly | 10 +- input/regression/quote-cyclic.ly | 4 +- input/regression/quote-during-subvoice.ly | 38 +- input/regression/quote-during.ly | 6 +- input/regression/quote-kill-cues.ly | 8 +- input/regression/quote-overrides.ly | 6 +- input/regression/quote-tie.ly | 10 +- input/regression/quote-tuplet.ly | 6 +- input/regression/quote.ly | 6 +- .../rehearsal-mark-align-priority.ly | 6 +- .../rehearsal-mark-align-staff-context.ly | 6 +- input/regression/rehearsal-mark-align.ly | 6 +- .../regression/rehearsal-mark-final-score.ly | 6 +- input/regression/rehearsal-mark-letter.ly | 6 +- input/regression/relative-repeat.ly | 10 +- input/regression/relative.ly | 12 + .../remove-empty-staves-auto-knee.ly | 8 +- .../repeat-percent-count-visibility.ly | 6 +- input/regression/repeat-percent-grace.ly | 6 +- input/regression/repeat-percent.ly | 4 +- .../regression/repeat-sign-global-size-10.ly | 12 +- .../regression/repeat-sign-global-size-30.ly | 14 +- input/regression/repeat-sign-global-size-5.ly | 11 +- input/regression/repeat-sign-layout-size.ly | 6 +- input/regression/repeat-sign.ly | 4 +- input/regression/repeat-slash-mixed.ly | 6 +- input/regression/repeat-slash-multi.ly | 6 +- input/regression/repeat-tie-parenthesize.ly | 11 + input/regression/repeat-tie.ly | 6 +- input/regression/repeat-tremolo-chord-rep.ly | 6 +- input/regression/repeat-tremolo-dots.ly | 6 +- .../repeat-tremolo-one-note-articulation.ly | 6 +- .../regression/repeat-tremolo-three-notes.ly | 4 +- input/regression/repeat-unfold-all.ly | 6 +- input/regression/repeat-unfold.ly | 6 +- input/regression/repeat-volta-segno.ly | 6 +- .../repeat-volta-skip-alternatives.ly | 6 +- input/regression/repeat-volta.ly | 6 +- input/regression/rest-collision-beam-note.ly | 6 +- .../rest-collision-beam-quantized.ly | 4 +- .../regression/rest-collision-beam-restdir.ly | 6 +- input/regression/rest-collision-beam.ly | 6 +- .../rest-collision-note-duration.ly | 4 +- input/regression/rest-collision.ly | 10 +- input/regression/rest-dot-position.ly | 29 +- input/regression/rest-ledger.ly | 4 +- input/regression/rest-note-collision.ly | 24 +- input/regression/rest-pitch.ly | 6 +- input/regression/rest-polyphonic-2.ly | 10 +- input/regression/rest-polyphonic.ly | 9 +- input/regression/rest-positioning.ly | 4 +- input/regression/revert-once.ly | 30 + input/regression/rhythmic-sequence.ly | 11 + ...satb-template-on-two-staves-with-verses.ly | 28 + ...mplate-soprano-and-tenor-may-be-omitted.ly | 19 + ...-template-with-changed-instrument-names.ly | 38 + ...atb-template-with-men-women-and-descant.ly | 34 + input/regression/scheme-book-scores.ly | 14 +- input/regression/scheme-engraver-instance.ly | 6 +- input/regression/scheme-engraver.ly | 81 +- input/regression/scheme-text-spanner.ly | 21 +- input/regression/score-lines.ly | 40 + input/regression/score-text.ly | 4 +- input/regression/script-collision.ly | 6 +- input/regression/script-horizontal-slur.ly | 6 +- input/regression/script-shift-staccato.ly | 29 + input/regression/script-shift.ly | 12 +- input/regression/script-stack-horizontal.ly | 6 +- input/regression/script-stack-order.ly | 6 +- input/regression/script-tie-collision.ly | 10 +- .../self-alignment-and-parent-alignment.ly | 49 + input/regression/semi-tie-cross-staff.ly | 6 +- input/regression/set-once.ly | 6 +- input/regression/shape-other-curves.ly | 6 +- input/regression/shape-slurs.ly | 6 +- input/regression/shorthands.ly | 6 +- input/regression/skip-of-length.ly | 6 +- input/regression/skiptypesetting-bar-check.ly | 6 +- input/regression/skiptypesetting-tuplet.ly | 6 +- input/regression/skyline-point-extent.ly | 6 +- .../regression/skyline-vertical-placement.ly | 6 +- input/regression/slur-broken-trend.ly | 16 +- input/regression/slur-cross-staff-beam.ly | 4 +- input/regression/slur-dot-collision.ly | 4 +- input/regression/slur-dots.ly | 6 +- input/regression/slur-double.ly | 6 +- input/regression/slur-dynamics.ly | 4 +- input/regression/slur-extreme.ly | 4 +- input/regression/slur-flag.ly | 6 +- input/regression/slur-grace.ly | 6 +- input/regression/slur-height-capping.ly | 4 +- input/regression/slur-manual.ly | 6 +- input/regression/slur-multiple-linebreak.ly | 10 +- input/regression/slur-multiple.ly | 12 +- input/regression/slur-rest.ly | 6 +- input/regression/slur-scoring.ly | 4 +- input/regression/slur-script.ly | 4 +- input/regression/slur-shift-region.ly | 6 +- input/regression/slur-tie-control-points.ly | 6 +- input/regression/slur-tilt.ly | 6 +- input/regression/slur-tuplet.ly | 6 +- input/regression/slur-vertical-skylines.ly | 6 +- .../slur-vestigial-outside-staff-callback.ly | 6 +- input/regression/song-basic-nonenglish.ly | 4 +- input/regression/song-basic.ly | 4 +- input/regression/song-breathe.ly | 4 +- input/regression/song-melisma.ly | 8 +- input/regression/song-reordering.ly | 6 +- input/regression/song-reordering2.ly | 6 +- input/regression/song-repetition.ly | 12 +- input/regression/song-skip-noword.ly | 4 +- input/regression/song-skip.ly | 4 +- input/regression/song-slurs.ly | 6 +- input/regression/song-splitpart.ly | 6 +- input/regression/song-stanzas.ly | 4 +- input/regression/song-tempo.ly | 4 +- input/regression/spacing-accidental-staffs.ly | 6 +- .../regression/spacing-accidental-stretch.ly | 6 +- input/regression/spacing-accidental-tie.ly | 6 +- input/regression/spacing-accidental.ly | 6 +- input/regression/spacing-bar-accidental.ly | 6 +- input/regression/spacing-bar-stem.ly | 6 +- input/regression/spacing-bar-whole-measure.ly | 6 +- .../spacing-correction-accidentals.ly | 6 +- input/regression/spacing-end-of-line.ly | 6 +- input/regression/spacing-ended-voice.ly | 6 +- .../spacing-folded-clef-cross-staff.ly | 6 +- input/regression/spacing-folded-clef.ly | 6 +- input/regression/spacing-folded-clef2.ly | 6 +- input/regression/spacing-folded-clef3.ly | 10 +- input/regression/spacing-grace-duration.ly | 6 +- input/regression/spacing-grace.ly | 6 +- .../spacing-horizontal-skyline-grace.ly | 4 +- .../regression/spacing-horizontal-skyline.ly | 6 +- input/regression/spacing-loose-polyphony.ly | 8 +- input/regression/spacing-mark-width.ly | 6 +- input/regression/spacing-multi-tuplet.ly | 22 +- .../spacing-non-adjacent-columns1.ly | 8 +- .../spacing-non-adjacent-columns2.ly | 8 +- input/regression/spacing-note-flags.ly | 6 +- input/regression/spacing-packed.ly | 6 +- input/regression/spacing-proportional.ly | 6 +- input/regression/spacing-ragged-last.ly | 4 +- input/regression/spacing-rest.ly | 6 +- input/regression/spacing-section.ly | 6 +- input/regression/spacing-short-notes.ly | 6 +- input/regression/spacing-stem-bar.ly | 6 +- input/regression/spacing-stem-direction.ly | 4 +- .../regression/spacing-stem-same-direction.ly | 6 +- input/regression/spacing-stick-out.ly | 6 +- .../regression/spacing-strict-notespacing.ly | 6 +- input/regression/spacing-to-grace.ly | 6 +- .../regression/spacing-uniform-stretching.ly | 6 +- input/regression/span-bar-allow-span-bar.ly | 20 +- input/regression/span-bar-partial.ly | 6 +- input/regression/span-bar-spacing.ly | 6 +- input/regression/span-bar.ly | 4 +- .../regression/spanner-after-line-breaking.ly | 6 +- input/regression/spanner-alignment.ly | 2 +- input/regression/spanner-break-overshoot.ly | 6 +- .../ssaattbb-template-with-all-staves.ly | 51 + ...b-template-with-all-voices-on-one-staff.ly | 53 + ...-template-with-changed-instrument-names.ly | 38 + ...tbb-template-with-men-women-and-descant.ly | 49 + input/regression/staccato-pos.ly | 14 +- input/regression/staff-halfway.ly | 6 +- .../staff-ledger-positions-dotted-notes.ly | 16 + input/regression/staff-ledger-positions.ly | 4 +- input/regression/staff-line-positions.ly | 4 +- .../regression/staff-online-symbol-absence.ly | 6 +- input/regression/staff-tweak.ly | 4 +- input/regression/stanza-number.ly | 4 +- input/regression/stem-direction-context.ly | 6 +- input/regression/stem-direction.ly | 6 +- input/regression/stem-length.ly | 4 +- input/regression/stem-shorten.ly | 6 +- input/regression/stem-stemlet.ly | 6 +- input/regression/stem-tremolo-forced-dir.ly | 4 +- .../regression/stem-tremolo-note-collision.ly | 4 +- input/regression/stem-tremolo-note-column.ly | 6 +- input/regression/stem-tremolo-position.ly | 6 +- input/regression/stem-tremolo-staff-space.ly | 6 +- input/regression/stem-tremolo-style.ly | 56 + input/regression/stencil-hacking.ly | 6 +- input/regression/string-number-styles.ly | 20 + input/regression/string-number.ly | 6 +- input/regression/system-separator.ly | 6 +- input/regression/system-start-heavy-bar.ly | 6 +- input/regression/system-start-nesting.ly | 8 +- .../tablature-additional-bass-strings.ly | 38 + .../tablature-chord-repetition-finger.ly | 6 +- .../regression/tablature-chord-repetition.ly | 6 +- input/regression/tablature-default-strings.ly | 4 +- input/regression/tablature-dot-placement.ly | 6 +- input/regression/tablature-full-notation.ly | 37 +- input/regression/tablature-glissando.ly | 4 +- input/regression/tablature-grace-notes.ly | 4 +- input/regression/tablature-harmonic-tie.ly | 6 +- input/regression/tablature-harmonic.ly | 6 +- input/regression/tablature-letter.ly | 6 +- input/regression/tablature-micro-tone.ly | 43 + input/regression/tablature-negative-fret.ly | 6 +- input/regression/tablature-slide.ly | 6 +- .../regression/tablature-slurs-with-beams.ly | 5 +- input/regression/tablature-string-tunings.ly | 4 +- input/regression/tablature-tie-behaviour.ly | 16 +- input/regression/tablature-tie-spanner.ly | 8 +- input/regression/tablature-zero-finger.ly | 4 +- input/regression/tag-filter.ly | 6 +- input/regression/tag-group.ly | 78 + input/regression/tag-multiple.ly | 6 +- input/regression/test-output-distance.ly | 4 +- .../text-spanner-attachment-alignment.ly | 22 +- input/regression/text-spanner-full-rest.ly | 6 +- .../regression/text-spanner-override-order.ly | 6 +- input/regression/text-spanner.ly | 6 +- input/regression/tie-accidental.ly | 6 +- input/regression/tie-arpeggio-collision.ly | 6 +- input/regression/tie-arpeggio.ly | 6 +- input/regression/tie-broken-minimum-length.ly | 6 +- input/regression/tie-broken.ly | 4 +- input/regression/tie-chord-broken-extremal.ly | 6 +- input/regression/tie-chord-debug.ly | 6 +- input/regression/tie-chord-partial.ly | 6 +- input/regression/tie-chord.ly | 8 +- input/regression/tie-dash.ly | 18 +- input/regression/tie-direction-broken.ly | 6 +- input/regression/tie-direction-manual.ly | 6 +- input/regression/tie-dot.ly | 8 +- input/regression/tie-enharmonic.ly | 18 + input/regression/tie-grace.ly | 6 +- input/regression/tie-manual-vertical-tune.ly | 6 +- input/regression/tie-manual.ly | 6 +- input/regression/tie-single-chord.ly | 6 +- input/regression/tie-single-manual.ly | 10 +- input/regression/tie-single.ly | 8 +- input/regression/tie-unterminated.ly | 6 +- input/regression/tie-whole.ly | 6 +- input/regression/time-signature-mensural.ly | 35 + .../time-signature-midmeasure-warning.ly | 15 + input/regression/time-signature-midmeasure.ly | 47 + input/regression/time-signature-numbered.ly | 17 + .../time-signature-settings-by-staff.ly | 6 +- .../regression/time-signature-single-digit.ly | 15 + input/regression/trill-spanner-auto-stop.ly | 6 +- input/regression/trill-spanner-chained.ly | 6 +- input/regression/trill-spanner-grace.ly | 6 +- input/regression/trill-spanner-scaled.ly | 10 +- input/regression/trill-spanner.ly | 6 +- input/regression/tuplet-beam.ly | 6 +- .../tuplet-bracket-avoid-fingering.ly | 6 +- .../tuplet-bracket-avoid-scripts.ly | 6 +- .../tuplet-bracket-avoid-string-number.ly | 6 +- .../tuplet-bracket-outside-staff-priority.ly | 6 +- .../tuplet-bracket-vertical-skylines.ly | 4 +- input/regression/tuplet-bracket-visibility.ly | 6 +- input/regression/tuplet-broken.ly | 6 +- input/regression/tuplet-full-length.ly | 6 +- input/regression/tuplet-gap.ly | 6 +- input/regression/tuplet-long-spanner.ly | 21 + input/regression/tuplet-nest-broken.ly | 6 +- input/regression/tuplet-nest.ly | 6 +- .../tuplet-number-french-kneed-beams.ly | 42 + ...uplet-number-kneed-beam-even-stem-count.ly | 31 + ...tuplet-number-kneed-beam-horizontal-fit.ly | 33 + .../tuplet-number-kneed-beam-ledger-lines.ly | 25 + .../tuplet-number-kneed-beam-positions.ly | 39 + ...tuplet-number-outside-staff-positioning.ly | 6 +- .../tuplet-number-outside-staff-priority.ly | 6 +- .../tuplet-number-shift-along-kneed-beam.ly | 23 + .../tuplet-numbers-kneed-beams-accidentals.ly | 38 + .../regression/tuplet-numbers-kneed-beams.ly | 39 + input/regression/tuplet-properties.ly | 6 +- input/regression/tuplet-rest.ly | 6 +- input/regression/tuplet-single-note.ly | 6 +- input/regression/tuplet-slope.ly | 8 +- .../regression/tuplet-staffline-collision.ly | 6 +- input/regression/tuplet-subdivision.ly | 8 +- .../tuplet-text-different-numbers.ly | 6 +- .../tuplet-text-fraction-with-notes.ly | 6 +- input/regression/tuplet-text-note-appended.ly | 6 +- input/regression/tuplets.ly | 6 +- input/regression/tweaks-as-overrides.ly | 18 + input/regression/typography-demo.ly | 22 +- .../unassociated-lyrics-alignment.ly | 44 + input/regression/unpure-pure-container.ly | 6 +- input/regression/unset-once.ly | 37 + input/regression/utf-8-mixed-text.ly | 11 + input/regression/utf-8.ly | 29 +- input/regression/voice-follower.ly | 6 +- input/regression/volta-markup-text.ly | 6 +- .../warn-expected-warning-missing.ly | 4 +- input/regression/whiteout-lower-layers.ly | 41 +- input/regression/whiteout.ly | 31 +- input/regression/woodwind-diagrams-empty.ly | 34 +- input/regression/zero-staff-space.ly | 6 +- lily/accidental-engraver.cc | 93 +- lily/accidental-placement.cc | 29 +- lily/accidental.cc | 97 +- lily/align-interface.cc | 184 +- lily/all-font-metrics-scheme.cc | 8 +- lily/all-font-metrics.cc | 38 +- lily/ambitus-engraver.cc | 26 +- lily/apply-context-iterator.cc | 6 +- lily/arpeggio-engraver.cc | 17 +- lily/arpeggio.cc | 16 +- lily/articulations.cc | 4 +- lily/audio-column.cc | 2 +- lily/audio-element-info.cc | 2 +- lily/audio-element.cc | 4 +- lily/audio-item.cc | 7 +- lily/audio-staff.cc | 6 +- lily/auto-beam-engraver.cc | 85 +- lily/auto-change-iterator.cc | 144 +- lily/axis-group-engraver.cc | 30 +- lily/axis-group-interface-scheme.cc | 24 +- lily/axis-group-interface.cc | 95 +- lily/balloon-engraver.cc | 17 +- lily/balloon.cc | 13 +- lily/bar-check-iterator.cc | 8 +- lily/bar-engraver.cc | 13 +- lily/bar-line.cc | 2 +- lily/bar-number-engraver.cc | 23 +- lily/beam-collision-engraver.cc | 53 +- lily/beam-engraver.cc | 48 +- lily/beam-performer.cc | 11 +- lily/beam-quanting.cc | 60 +- lily/beam.cc | 143 +- lily/beaming-pattern.cc | 47 +- lily/bend-engraver.cc | 19 +- lily/bezier-bow.cc | 2 +- lily/bezier.cc | 12 +- lily/book-scheme.cc | 34 +- lily/book.cc | 70 +- lily/box.cc | 20 +- lily/break-align-engraver.cc | 21 +- lily/break-alignment-interface.cc | 101 +- lily/break-substitution.cc | 61 +- lily/breathing-sign-engraver.cc | 11 +- lily/breathing-sign.cc | 16 +- lily/change-iterator.cc | 96 +- lily/change-sequence-iterator.cc | 67 + lily/chord-name-engraver.cc | 151 +- lily/chord-name.cc | 4 +- lily/chord-tremolo-engraver.cc | 15 +- lily/chord-tremolo-iterator.cc | 41 +- lily/clef-engraver.cc | 27 +- lily/clef-modifier.cc | 66 + lily/clef.cc | 6 +- lily/cluster-engraver.cc | 19 +- lily/cluster.cc | 9 +- lily/coherent-ligature-engraver.cc | 4 +- lily/collision-engraver.cc | 15 +- lily/column-x-positions.cc | 2 +- lily/completion-note-heads-engraver.cc | 51 +- lily/completion-rest-engraver.cc | 39 +- lily/concurrent-hairpin-engraver.cc | 15 +- lily/constrained-breaking.cc | 12 +- lily/context-def.cc | 96 +- lily/context-handle.cc | 2 +- lily/context-mod-scheme.cc | 12 +- lily/context-mod.cc | 22 +- lily/context-property.cc | 461 +- lily/context-scheme.cc | 52 +- lily/context-specced-music-iterator.cc | 2 +- lily/context.cc | 288 +- lily/control-track-performer.cc | 12 +- lily/cue-clef-engraver.cc | 19 +- lily/custos-engraver.cc | 17 +- lily/custos.cc | 4 +- lily/default-bar-line-engraver.cc | 8 +- lily/dimension-cache.cc | 2 +- lily/dimensions-scheme.cc | 2 +- lily/directional-element-interface.cc | 4 +- lily/dispatcher-scheme.cc | 44 +- lily/dispatcher.cc | 74 +- lily/dot-column-engraver.cc | 13 +- lily/dot-column.cc | 68 +- lily/dot-configuration.cc | 2 +- lily/dot-formatting-problem.cc | 2 +- lily/dots-engraver.cc | 15 +- lily/dots.cc | 4 +- lily/double-percent-repeat-engraver.cc | 13 +- lily/drum-note-engraver.cc | 23 +- lily/drum-note-performer.cc | 33 +- lily/duration-scheme.cc | 24 +- lily/duration.cc | 17 +- lily/dynamic-align-engraver.cc | 42 +- lily/dynamic-engraver.cc | 58 +- lily/dynamic-performer.cc | 60 +- lily/enclosing-bracket.cc | 7 +- lily/engraver-group.cc | 116 +- lily/engraver-scheme.cc | 13 +- lily/engraver.cc | 76 +- lily/episema-engraver.cc | 23 +- lily/event-chord-iterator.cc | 6 +- lily/event-iterator.cc | 2 +- lily/extender-engraver.cc | 24 +- lily/figured-bass-continuation.cc | 7 +- lily/figured-bass-engraver.cc | 23 +- lily/figured-bass-position-engraver.cc | 31 +- lily/file-name-map.cc | 2 +- lily/fingering-column-engraver.cc | 9 +- lily/fingering-column.cc | 2 +- lily/fingering-engraver.cc | 28 +- lily/flag.cc | 17 +- lily/font-config-scheme.cc | 4 +- lily/font-config.cc | 50 +- lily/font-interface.cc | 8 +- lily/font-metric-scheme.cc | 18 +- lily/font-metric.cc | 23 +- lily/font-select.cc | 12 +- lily/font-size-engraver.cc | 11 +- lily/footnote-engraver.cc | 21 +- lily/forbid-break-engraver.cc | 10 +- lily/freetype-error.cc | 2 +- lily/freetype.cc | 36 +- lily/fretboard-engraver.cc | 19 +- lily/function-documentation.cc | 48 +- lily/general-scheme.cc | 60 +- lily/glissando-engraver.cc | 17 +- lily/global-context-scheme.cc | 22 +- lily/global-context.cc | 25 +- lily/global-ctor.cc | 2 +- lily/global-vars.cc | 5 +- lily/grace-engraver.cc | 103 +- lily/grace-iterator.cc | 13 +- lily/grace-music.cc | 4 +- lily/grace-spacing-engraver.cc | 10 +- lily/gregorian-ligature-engraver.cc | 4 +- lily/gregorian-ligature.cc | 2 +- lily/grid-line-interface.cc | 6 +- lily/grid-line-span-engraver.cc | 14 +- lily/grid-point-engraver.cc | 10 +- lily/grob-array-scheme.cc | 8 +- lily/grob-array.cc | 83 +- lily/grob-closure.cc | 46 +- lily/grob-info.cc | 14 +- lily/grob-interface-scheme.cc | 4 +- lily/grob-interface.cc | 10 +- lily/grob-pq-engraver.cc | 22 +- lily/grob-property.cc | 137 +- lily/grob-scheme.cc | 111 +- lily/grob-smob.cc | 32 +- lily/grob.cc | 135 +- lily/guile-init.cc | 26 +- lily/hairpin.cc | 16 +- lily/hara-kiri-group-spanner.cc | 24 +- lily/horizontal-bracket-engraver.cc | 15 +- lily/horizontal-bracket.cc | 4 +- lily/hyphen-engraver.cc | 15 +- lily/includable-lexer.cc | 2 +- lily/include/accidental-interface.hh | 8 +- lily/include/accidental-placement.hh | 3 +- lily/include/align-interface.hh | 4 +- lily/include/all-font-metrics.hh | 5 +- lily/include/arpeggio.hh | 3 +- lily/include/articulations.hh | 2 +- lily/include/audio-column.hh | 2 +- lily/include/audio-element-info.hh | 2 +- lily/include/audio-element.hh | 2 +- lily/include/audio-item.hh | 7 +- lily/include/audio-staff.hh | 10 +- lily/include/axis-group-interface.hh | 5 +- lily/include/bar-line.hh | 3 +- lily/include/beam-scoring-problem.hh | 2 +- lily/include/beam.hh | 4 +- lily/include/beaming-pattern.hh | 5 +- lily/include/bezier.hh | 4 +- lily/include/book.hh | 10 +- lily/include/box.hh | 7 +- lily/include/break-align-interface.hh | 6 +- lily/include/breathing-sign.hh | 5 +- lily/include/callback.hh | 186 + lily/include/change-iterator.hh | 6 +- ...terator.hh => change-sequence-iterator.hh} | 33 +- lily/include/chord-name.hh | 3 +- lily/include/chord-tremolo-iterator.hh | 2 +- lily/include/clef.hh | 3 +- lily/include/cluster.hh | 3 +- lily/include/coherent-ligature-engraver.hh | 4 +- lily/include/column-x-positions.hh | 2 +- lily/include/constrained-breaking.hh | 2 +- lily/include/context-def.hh | 11 +- lily/include/context-handle.hh | 2 +- lily/include/context-mod.hh | 10 +- lily/include/context.hh | 81 +- lily/include/custos.hh | 3 +- lily/include/dimension-cache.hh | 2 +- lily/include/directional-element-interface.hh | 2 +- lily/include/dispatcher.hh | 17 +- lily/include/dot-column.hh | 3 +- lily/include/dot-configuration.hh | 2 +- lily/include/dots.hh | 3 +- lily/include/duration.hh | 12 +- lily/include/engraver-group.hh | 26 +- lily/include/engraver.hh | 39 +- lily/include/event-chord-iterator.hh | 2 +- lily/include/event-iterator.hh | 2 +- lily/include/file-name-map.hh | 2 +- lily/include/fingering-column.hh | 3 +- lily/include/fluid.hh | 65 + lily/include/font-interface.hh | 3 +- lily/include/font-metric.hh | 12 +- lily/include/freetype.hh | 2 +- lily/include/global-context.hh | 5 +- lily/include/global-ctor.hh | 2 +- lily/include/grace-fixup.hh | 2 +- lily/include/grace-iterator.hh | 4 +- lily/include/gregorian-ligature-engraver.hh | 6 +- lily/include/gregorian-ligature.hh | 3 +- lily/include/grid-line-interface.hh | 4 +- lily/include/grob-array.hh | 37 +- lily/include/grob-info.hh | 19 +- lily/include/grob-interface.hh | 53 +- lily/include/grob-properties.hh | 62 + lily/include/grob.hh | 22 +- lily/include/group-interface.hh | 41 - lily/include/hairpin.hh | 3 +- lily/include/hara-kiri-group-spanner.hh | 4 +- lily/include/horizontal-bracket.hh | 3 +- lily/include/includable-lexer.hh | 2 +- lily/include/input.hh | 22 +- lily/include/interval-minefield.hh | 2 +- lily/include/item.hh | 5 +- lily/include/keyword.hh | 2 +- lily/include/kievan-ligature.hh | 3 +- lily/include/least-squares.hh | 2 +- lily/include/ligature-engraver.hh | 9 +- lily/include/lily-guile-macros.hh | 92 +- lily/include/lily-guile.hh | 23 +- lily/include/lily-imports.hh | 146 + lily/include/lily-lexer.hh | 16 +- lily/include/lily-modules.hh | 99 + lily/include/lily-parser.hh | 26 +- lily/include/lily-proto.hh | 39 +- lily/include/lily-version.hh | 2 +- lily/include/lilypond-version.hh | 8 +- lily/include/line-interface.hh | 3 +- lily/include/listener.hh | 153 +- lily/include/lookup.hh | 34 +- lily/include/ly-module.hh | 10 +- lily/include/ly-smobs.icc | 139 - lily/include/lyric-extender.hh | 3 +- lily/include/lyric-hyphen.hh | 3 +- lily/include/main.hh | 3 +- lily/include/measure-grouping-spanner.hh | 3 +- lily/include/melody-spanner.hh | 3 +- lily/include/mensural-ligature.hh | 3 +- lily/include/midi-chunk.hh | 2 +- lily/include/midi-item.hh | 2 +- lily/include/midi-stream.hh | 2 +- lily/include/midi-walker.hh | 4 +- lily/include/mingw-compatibility.hh | 2 +- lily/include/minimal-page-breaking.hh | 2 +- lily/include/misc.hh | 24 +- lily/include/modified-font-metric.hh | 2 +- lily/include/moment.hh | 10 +- lily/include/multi-measure-rest.hh | 4 +- lily/include/music-function.hh | 20 +- lily/include/music-iterator.hh | 23 +- lily/include/music-output.hh | 14 +- lily/include/music-sequence.hh | 2 +- lily/include/music-wrapper-iterator.hh | 2 +- lily/include/music-wrapper.hh | 2 +- lily/include/music.hh | 13 +- lily/include/note-collision.hh | 3 +- lily/include/note-column.hh | 4 +- lily/include/note-head.hh | 4 +- lily/include/note-spacing.hh | 7 +- ...er.hh => one-line-auto-height-breaking.hh} | 28 +- lily/include/open-type-font.hh | 4 +- lily/include/optimal-page-breaking.hh | 2 +- lily/include/output-def.hh | 12 +- lily/include/page-breaking.hh | 2 +- lily/include/page-layout-problem.hh | 2 +- lily/include/page-marker.hh | 12 +- lily/include/page-spacing-result.hh | 2 +- lily/include/page-spacing.hh | 2 +- lily/include/page-turn-page-breaking.hh | 2 +- lily/include/pango-font.hh | 2 +- lily/include/paper-book.hh | 12 +- lily/include/paper-column-engraver.hh | 12 +- lily/include/paper-column.hh | 4 +- lily/include/paper-outputter.hh | 12 +- lily/include/paper-score.hh | 4 +- lily/include/paper-system.hh | 2 +- lily/include/parse-scm.hh | 2 +- lily/include/percent-repeat-item.hh | 3 +- lily/include/performance.hh | 12 +- lily/include/performer-group.hh | 4 +- lily/include/performer.hh | 6 +- lily/include/pitch-interval.hh | 2 +- lily/include/pitch.hh | 14 +- lily/include/pointer-group-interface.hh | 2 +- lily/include/prob.hh | 20 +- lily/include/profile.hh | 2 +- lily/include/program-option.hh | 2 +- lily/include/property-iterator.hh | 6 +- lily/include/protected-scm.hh | 27 +- lily/include/pure-from-neighbor-interface.hh | 3 +- lily/include/relocate.hh | 2 +- lily/include/repeated-music.hh | 3 +- lily/include/rest-collision.hh | 3 +- lily/include/rest.hh | 4 +- lily/include/rhythmic-head.hh | 3 +- lily/include/rod.hh | 2 +- lily/include/scale.hh | 8 +- lily/include/scheme-engraver.hh | 45 +- lily/include/scm-hash.hh | 15 +- lily/include/score-engraver.hh | 10 +- lily/include/score-performer.hh | 10 +- lily/include/score.hh | 12 +- lily/include/script-column.hh | 3 +- lily/include/script-interface.hh | 3 +- lily/include/self-alignment-interface.hh | 8 +- lily/include/semi-tie-column.hh | 3 +- lily/include/semi-tie.hh | 11 +- lily/include/separation-item.hh | 3 +- lily/include/sequential-iterator.hh | 2 +- lily/include/side-position-interface.hh | 5 +- lily/include/simple-closure.hh | 30 - lily/include/simple-music-iterator.hh | 2 +- lily/include/simple-spacer.hh | 6 +- lily/include/simultaneous-music-iterator.hh | 2 +- lily/include/skyline-pair.hh | 8 +- lily/include/skyline.hh | 12 +- lily/include/slur-configuration.hh | 2 +- lily/include/slur-engraver.hh | 75 + lily/include/slur-proto-engraver.hh | 73 - lily/include/slur-score-parameters.hh | 4 +- lily/include/slur-scoring.hh | 3 +- lily/include/slur.hh | 3 +- lily/include/small-smobs.hh | 94 + lily/include/smobs.hh | 295 +- lily/include/smobs.tcc | 157 + lily/include/source-file.hh | 13 +- lily/include/sources.hh | 4 +- lily/include/spaceable-grob.hh | 3 +- lily/include/spacing-interface.hh | 3 +- lily/include/spacing-options.hh | 2 +- lily/include/spacing-spanner.hh | 5 +- lily/include/spanner.hh | 3 +- lily/include/spring.hh | 11 +- lily/include/staff-grouper-interface.hh | 3 +- lily/include/staff-spacing.hh | 3 +- lily/include/staff-symbol-referencer.hh | 3 +- lily/include/staff-symbol.hh | 5 +- lily/include/stem-info.hh | 2 +- lily/include/stem-tremolo.hh | 5 +- lily/include/stem.hh | 4 +- lily/include/stencil.hh | 12 +- lily/include/stream-event.hh | 3 +- lily/include/system-start-delimiter.hh | 3 +- lily/include/system.hh | 3 +- lily/include/text-interface.hh | 3 +- lily/include/tie-column.hh | 5 +- lily/include/tie-configuration.hh | 2 +- lily/include/tie-details.hh | 2 +- lily/include/tie-formatting-problem.hh | 2 +- lily/include/tie-specification.hh | 2 +- lily/include/tie.hh | 19 +- lily/include/timing-translator.hh | 2 +- lily/include/translator-dispatch-list.hh | 15 +- lily/include/translator-group.hh | 53 +- lily/include/translator.hh | 156 +- lily/include/translator.icc | 130 +- lily/include/tuplet-bracket.hh | 3 +- .../{time-signature.hh => tuplet-number.hh} | 33 +- lily/include/unpure-pure-container.hh | 27 +- lily/include/vaticana-ligature.hh | 3 +- lily/include/volta-bracket.hh | 3 +- lily/input-scheme.cc | 27 +- lily/input-smob.cc | 68 +- lily/input.cc | 109 +- lily/instrument-name-engraver.cc | 23 +- lily/instrument-switch-engraver.cc | 8 +- lily/interval-minefield.cc | 2 +- lily/item-scheme.cc | 23 +- lily/item.cc | 13 +- lily/keep-alive-together-engraver.cc | 53 +- lily/key-engraver.cc | 53 +- lily/key-performer.cc | 17 +- lily/key-signature-interface.cc | 12 +- lily/kievan-ligature-engraver.cc | 25 +- lily/kievan-ligature.cc | 2 +- lily/laissez-vibrer-engraver.cc | 23 +- lily/least-squares.cc | 2 +- lily/ledger-line-engraver.cc | 21 +- lily/ledger-line-spanner.cc | 234 +- lily/lexer.ll | 207 +- lily/ligature-bracket-engraver.cc | 19 +- lily/ligature-engraver.cc | 8 +- lily/lily-guile.cc | 56 +- lily/lily-imports.cc | 136 + lily/lily-lexer-scheme.cc | 4 +- lily/lily-lexer.cc | 51 +- lily/lily-modules.cc | 129 + lily/lily-parser-scheme.cc | 144 +- lily/lily-parser.cc | 61 +- lily/lily-version.cc | 2 +- lily/lilypond-version.cc | 54 +- lily/lilypond.rc.in | 2 +- lily/line-interface-scheme.cc | 44 + lily/line-interface.cc | 23 +- lily/line-spanner.cc | 33 +- lily/listener.cc | 53 +- lily/lookup.cc | 169 +- lily/ly-module.cc | 43 +- lily/lyric-combine-music-iterator.cc | 59 +- lily/lyric-combine-music.cc | 6 +- lily/lyric-engraver.cc | 79 +- lily/lyric-extender.cc | 6 +- lily/lyric-hyphen.cc | 6 +- lily/lyric-performer.cc | 11 +- lily/main.cc | 33 +- lily/mark-engraver.cc | 27 +- lily/measure-grouping-engraver.cc | 21 +- lily/measure-grouping-spanner.cc | 8 +- lily/melody-engraver.cc | 15 +- lily/melody-spanner.cc | 6 +- lily/mensural-ligature-engraver.cc | 27 +- lily/mensural-ligature.cc | 6 +- lily/metronome-engraver.cc | 34 +- lily/midi-chunk.cc | 2 +- lily/midi-control-function-performer.cc | 21 +- lily/midi-item.cc | 17 +- lily/midi-stream.cc | 4 +- lily/midi-walker.cc | 8 +- lily/minimal-page-breaking.cc | 2 +- lily/misc.cc | 39 +- lily/modified-font-metric.cc | 2 +- lily/module-scheme.cc | 14 +- lily/moment-scheme.cc | 38 +- lily/moment.cc | 26 +- lily/multi-measure-rest-engraver.cc | 285 +- lily/multi-measure-rest.cc | 71 +- lily/music-function-scheme.cc | 17 +- lily/music-function.cc | 166 +- lily/music-iterator.cc | 44 +- lily/music-output.cc | 18 +- lily/music-scheme.cc | 142 +- lily/music-sequence.cc | 37 +- lily/music-wrapper-iterator.cc | 6 +- lily/music-wrapper.cc | 10 +- lily/music.cc | 127 +- lily/nested-property.cc | 323 +- lily/new-fingering-engraver.cc | 53 +- lily/note-collision.cc | 172 +- lily/note-column-scheme.cc | 6 +- lily/note-column.cc | 58 +- lily/note-head-line-engraver.cc | 25 +- lily/note-head-scheme.cc | 4 +- lily/note-head.cc | 21 +- lily/note-heads-engraver.cc | 19 +- lily/note-name-engraver.cc | 13 +- lily/note-performer.cc | 94 +- lily/note-spacing-engraver.cc | 21 +- lily/note-spacing.cc | 49 +- lily/one-line-auto-height-breaking.cc | 103 + lily/one-line-page-breaking.cc | 7 +- lily/open-type-font-scheme.cc | 288 +- lily/open-type-font.cc | 141 +- lily/optimal-page-breaking.cc | 2 +- lily/ottava-bracket.cc | 37 +- lily/ottava-engraver.cc | 15 +- lily/output-def-scheme.cc | 51 +- lily/output-def.cc | 50 +- lily/output-property-engraver.cc | 19 +- lily/page-breaking-scheme.cc | 26 +- lily/page-breaking.cc | 32 +- lily/page-layout-problem-scheme.cc | 6 +- lily/page-layout-problem.cc | 82 +- lily/page-marker-scheme.cc | 2 +- lily/page-marker.cc | 26 +- lily/page-spacing-result.cc | 2 +- lily/page-spacing.cc | 5 +- lily/page-turn-engraver.cc | 32 +- lily/page-turn-page-breaking.cc | 5 +- lily/pango-font-scheme.cc | 6 +- lily/pango-font.cc | 18 +- lily/pango-select-scheme.cc | 2 +- lily/pango-select.cc | 20 +- lily/paper-book-scheme.cc | 15 +- lily/paper-book.cc | 176 +- lily/paper-column-engraver.cc | 57 +- lily/paper-column.cc | 118 +- lily/paper-def.cc | 20 +- lily/paper-outputter-scheme.cc | 16 +- lily/paper-outputter.cc | 30 +- lily/paper-score-scheme.cc | 6 +- lily/paper-score.cc | 16 +- lily/paper-system-scheme.cc | 14 +- lily/paper-system.cc | 12 +- lily/parenthesis-engraver.cc | 14 +- lily/parse-scm.cc | 30 +- lily/parser.yy | 2355 +-- lily/part-combine-engraver.cc | 29 +- lily/part-combine-iterator.cc | 462 +- lily/part-combine-part-iterator.cc | 60 + lily/partial-iterator.cc | 70 +- lily/pdf-scheme.cc | 2 +- lily/percent-repeat-engraver.cc | 16 +- lily/percent-repeat-item.cc | 8 +- lily/percent-repeat-iterator.cc | 72 +- lily/performance-scheme.cc | 36 +- lily/performance.cc | 62 +- lily/performer-group.cc | 8 +- lily/performer.cc | 8 +- lily/pfb-scheme.cc | 70 +- lily/pfb.cc | 2 +- lily/phrasing-slur-engraver.cc | 80 +- lily/piano-pedal-align-engraver.cc | 27 +- lily/piano-pedal-bracket.cc | 7 +- lily/piano-pedal-engraver.cc | 45 +- lily/piano-pedal-performer.cc | 19 +- lily/pitch-interval.cc | 10 +- lily/pitch-scheme.cc | 36 +- lily/pitch-squash-engraver.cc | 11 +- lily/pitch.cc | 21 +- lily/pitched-trill-engraver.cc | 45 +- lily/pointer-group-interface-scheme.cc | 10 +- lily/pointer-group-interface.cc | 14 +- lily/prob-scheme.cc | 18 +- lily/prob.cc | 53 +- lily/profile.cc | 10 +- lily/program-option-scheme.cc | 10 +- lily/program-option.cc | 2 +- lily/property-iterator.cc | 107 +- lily/protected-scm.cc | 60 +- lily/pure-from-neighbor-engraver.cc | 19 +- lily/pure-from-neighbor-interface.cc | 17 +- lily/quote-iterator.cc | 17 +- lily/relative-octave-check.cc | 8 +- lily/relative-octave-music.cc | 2 +- lily/relocate.cc | 14 +- lily/repeat-acknowledge-engraver.cc | 17 +- lily/repeat-tie-engraver.cc | 21 +- lily/repeated-music.cc | 22 +- lily/rest-collision-engraver.cc | 21 +- lily/rest-collision.cc | 32 +- lily/rest-engraver.cc | 13 +- lily/rest.cc | 44 +- lily/rhythmic-column-engraver.cc | 19 +- lily/rhythmic-head.cc | 6 +- lily/rhythmic-music-iterator.cc | 4 +- lily/rod.cc | 2 +- lily/scale.cc | 48 +- lily/scheme-engraver.cc | 226 +- lily/scheme-listener-scheme.cc | 34 - lily/scheme-listener.cc | 59 - lily/scm-hash.cc | 87 +- lily/score-engraver.cc | 34 +- lily/score-performer.cc | 33 +- lily/score-scheme.cc | 29 +- lily/score.cc | 68 +- lily/script-column-engraver.cc | 11 +- lily/script-column.cc | 21 +- lily/script-engraver.cc | 49 +- lily/script-interface.cc | 23 +- lily/script-row-engraver.cc | 17 +- lily/self-alignment-interface.cc | 137 +- lily/semi-tie-column.cc | 7 +- lily/semi-tie.cc | 72 +- lily/separating-line-group-engraver.cc | 25 +- lily/separation-item.cc | 32 +- lily/sequential-iterator.cc | 12 +- lily/side-position-interface.cc | 35 +- lily/simple-closure.cc | 154 - lily/simple-music-iterator.cc | 2 +- lily/simple-spacer-scheme.cc | 4 +- lily/simple-spacer.cc | 38 +- lily/simultaneous-music-iterator.cc | 55 +- lily/skyline-pair.cc | 31 +- lily/skyline.cc | 238 +- lily/slash-repeat-engraver.cc | 11 +- lily/slur-configuration.cc | 42 +- lily/slur-engraver.cc | 337 +- lily/slur-performer.cc | 11 +- lily/slur-proto-engraver.cc | 297 - lily/slur-score-parameters.cc | 6 +- lily/slur-scoring.cc | 64 +- lily/slur.cc | 79 +- lily/smobs.cc | 25 +- lily/source-file.cc | 26 +- lily/sources.cc | 32 +- lily/spaceable-grob.cc | 10 +- lily/spacing-basic.cc | 48 +- lily/spacing-determine-loose-columns.cc | 27 +- lily/spacing-engraver.cc | 37 +- lily/spacing-interface.cc | 12 +- lily/spacing-loose-columns.cc | 31 +- lily/spacing-options.cc | 13 +- lily/spacing-spanner.cc | 48 +- lily/span-arpeggio-engraver.cc | 17 +- lily/span-bar-engraver.cc | 23 +- lily/span-bar-stub-engraver.cc | 33 +- lily/spanner-break-forbid-engraver.cc | 15 +- lily/spanner-scheme.cc | 18 +- lily/spanner.cc | 53 +- lily/spring-smob.cc | 21 +- lily/spring.cc | 22 +- lily/staff-collecting-engraver.cc | 15 +- lily/staff-grouper-interface.cc | 4 +- lily/staff-performer.cc | 35 +- lily/staff-spacing.cc | 16 +- lily/staff-symbol-engraver.cc | 19 +- lily/staff-symbol-referencer-scheme.cc | 23 +- lily/staff-symbol-referencer.cc | 8 +- lily/staff-symbol.cc | 127 +- lily/stanza-number-align-engraver.cc | 15 +- lily/stanza-number-engraver.cc | 11 +- lily/stem-engraver.cc | 45 +- lily/stem-tremolo.cc | 74 +- lily/stem.cc | 118 +- lily/stencil-expression.cc | 5 +- lily/stencil-integral.cc | 333 +- lily/stencil-interpret.cc | 28 +- lily/stencil-scheme.cc | 84 +- lily/stencil.cc | 33 +- lily/stream-event-scheme.cc | 14 +- lily/stream-event.cc | 27 +- lily/sustain-pedal.cc | 4 +- lily/system-start-delimiter-engraver.cc | 29 +- lily/system-start-delimiter.cc | 12 +- lily/system.cc | 96 +- lily/tab-note-heads-engraver.cc | 23 +- lily/tab-staff-symbol-engraver.cc | 11 +- lily/tab-tie-follow-engraver.cc | 21 +- lily/template5.cc | 2 +- lily/tempo-performer.cc | 12 +- lily/text-engraver.cc | 55 +- lily/text-interface.cc | 50 +- lily/text-spanner-engraver.cc | 21 +- lily/tie-column.cc | 12 +- lily/tie-configuration.cc | 4 +- lily/tie-details.cc | 2 +- lily/tie-engraver.cc | 86 +- lily/tie-formatting-problem.cc | 35 +- lily/tie-performer.cc | 36 +- lily/tie-specification.cc | 18 +- lily/tie.cc | 217 +- lily/time-signature-engraver.cc | 64 +- lily/time-signature-performer.cc | 8 +- lily/time-signature.cc | 156 - lily/timing-translator.cc | 50 +- lily/translator-ctors.cc | 30 +- lily/translator-dispatch-list.cc | 53 +- lily/translator-group-ctors.cc | 10 +- lily/translator-group.cc | 112 +- lily/translator-scheme.cc | 8 +- lily/translator.cc | 123 +- lily/trill-spanner-engraver.cc | 21 +- lily/ttf.cc | 13 +- lily/tuplet-bracket.cc | 65 +- lily/tuplet-engraver.cc | 31 +- lily/tuplet-iterator.cc | 26 +- lily/tuplet-number.cc | 445 +- lily/tweak-engraver.cc | 13 +- lily/undead.cc | 27 +- lily/unfolded-repeat-iterator.cc | 63 - lily/unpure-pure-container.cc | 143 +- lily/vaticana-ligature-engraver.cc | 41 +- lily/vaticana-ligature.cc | 10 +- lily/vertical-align-engraver.cc | 25 +- lily/volta-bracket.cc | 11 +- lily/volta-engraver.cc | 23 +- lily/volta-repeat-iterator.cc | 57 +- lily/warn-scheme.cc | 2 +- ly/Welcome-to-LilyPond-MacOS.ly | 6 +- ly/Welcome_to_LilyPond.ly | 6 +- ly/arabic.ly | 26 +- ly/articulate.ly | 957 +- ly/bagpipe.ly | 105 +- ly/base-tkit.ly | 117 + ly/catalan.ly | 2 +- ly/chord-modifiers-init.ly | 4 +- ly/chord-repetition-init.ly | 12 +- ly/context-mods-init.ly | 33 +- ly/declarations-init.ly | 6 +- ly/deutsch.ly | 2 +- ly/drumpitch-init.ly | 194 +- ly/dynamic-scripts-init.ly | 1 - ly/english.ly | 2 +- ly/engraver-init.ly | 348 +- ly/espanol.ly | 2 +- ly/event-listener.ly | 32 +- ly/festival.ly | 6 +- ly/graphviz-init.ly | 31 +- ly/gregorian.ly | 158 +- ly/guile-debugger.ly | 2 +- ly/init.ly | 27 +- ly/italiano.ly | 2 +- ly/lyrics-tkit.ly | 50 + ly/makam.ly | 27 +- ly/midi-init.ly | 3 +- ly/music-functions-init.ly | 1504 +- ly/nederlands.ly | 2 +- ly/norsk.ly | 2 +- ly/paper-defaults-init.ly | 37 +- ly/performer-init.ly | 207 +- ly/piano-tkit.ly | 43 + ly/portugues.ly | 2 +- ly/predefined-fretboards-init.ly | 8 +- ly/predefined-guitar-fretboards.ly | 2 +- ly/predefined-guitar-ninth-fretboards.ly | 36 +- ly/predefined-mandolin-fretboards.ly | 2 +- ly/predefined-ukulele-fretboards.ly | 2 +- ly/property-init.ly | 190 +- ly/satb.ly | 195 + ly/scale-definitions-init.ly | 11 +- ly/script-init.ly | 43 +- ly/spanners-init.ly | 35 +- ly/ssaattbb.ly | 318 + ly/staff-tkit.ly | 164 + ly/string-tunings-init.ly | 12 +- ly/suomi.ly | 2 +- ly/svenska.ly | 2 +- ly/text-replacements.ly | 14 +- ly/titling-init.ly | 17 +- ly/toc-init.ly | 58 +- ly/vlaams.ly | 2 +- ly/vocal-tkit.ly | 85 + ly/voice-tkit.ly | 16 + make/doc-i18n-root-vars.make | 10 +- make/lilypond-book-rules.make | 2 +- make/lilypond-book-vars.make | 6 + make/ly-rules.make | 6 +- mf/00-lilypond-fonts.conf.in | 44 + mf/99-lilypond-fonts.conf.in | 19 + mf/GNUmakefile | 121 +- mf/README | 109 +- mf/common-modules-and-initialization.mf | 7 + mf/debugging-settings.mf | 14 + mf/declare-autometric-parameters.mf | 9 + mf/feta-accidentals.mf | 1284 +- mf/feta-accordion.mf | 2 +- mf/feta-alphabet-generic.mf | 19 + mf/feta-alphabet.mf | 19 - mf/feta-alphabet11.mf | 4 +- mf/feta-alphabet13.mf | 4 +- mf/feta-alphabet14.mf | 4 +- mf/feta-alphabet16.mf | 4 +- mf/feta-alphabet18.mf | 4 +- mf/feta-alphabet20.mf | 5 +- mf/feta-alphabet23.mf | 5 +- mf/feta-alphabet26.mf | 4 +- mf/feta-arrow.mf | 82 + mf/feta-arrowheads.mf | 2 +- mf/feta-autometric.mf | 2 +- mf/feta-braces-a.mf | 19 +- mf/feta-braces-b.mf | 19 +- mf/feta-braces-c.mf | 19 +- mf/feta-braces-d.mf | 19 +- mf/feta-braces-e.mf | 19 +- mf/feta-braces-f.mf | 19 +- mf/feta-braces-g.mf | 19 +- mf/feta-braces-generic.mf | 47 + mf/feta-braces-h.mf | 19 +- mf/feta-braces-i.mf | 19 +- mf/feta-braces.mf | 42 +- mf/feta-brackettips.mf | 2 +- mf/feta-clefs.mf | 373 +- mf/feta-dots.mf | 2 +- mf/feta-dynamics.mf | 2 +- mf/feta-flags-generic.mf | 35 +- mf/feta-flags.mf | 4 +- mf/feta-flags11.mf | 10 +- mf/feta-flags13.mf | 10 +- mf/feta-flags14.mf | 10 +- mf/feta-flags16.mf | 10 +- mf/feta-flags18.mf | 10 +- mf/feta-flags20.mf | 10 +- mf/feta-flags23.mf | 10 +- mf/feta-flags26.mf | 10 +- mf/feta-flats.mf | 535 + mf/feta-generic.mf | 60 - mf/feta-macros.mf | 9 +- mf/feta-naturals.mf | 163 + mf/feta-noteheads-generic.mf | 35 +- mf/feta-noteheads.mf | 275 +- mf/feta-noteheads11.mf | 10 +- mf/feta-noteheads13.mf | 10 +- mf/feta-noteheads14.mf | 10 +- mf/feta-noteheads16.mf | 10 +- mf/feta-noteheads18.mf | 10 +- mf/feta-noteheads20.mf | 10 +- mf/feta-noteheads23.mf | 10 +- mf/feta-noteheads26.mf | 10 +- mf/feta-numbers.mf | 2 +- mf/feta-other-generic.mf | 29 + mf/feta-params.mf | 16 +- mf/feta-parenthesis.mf | 44 + mf/feta-pedals.mf | 2 +- mf/feta-rests.mf | 96 +- mf/feta-scripts.mf | 5 +- mf/feta-sharps.mf | 339 + mf/feta-test-generic.mf | 17 - mf/feta-test11.mf | 15 - mf/feta-test13.mf | 16 - mf/feta-test16.mf | 16 - mf/feta-test20.mf | 16 - mf/feta-test23.mf | 16 - mf/feta-test26.mf | 15 - mf/feta-ties.mf | 2 +- mf/feta-timesignatures.mf | 4 +- mf/feta-trills.mf | 2 +- mf/feta11.mf | 11 +- mf/feta13.mf | 11 +- mf/feta14.mf | 12 +- mf/feta16.mf | 11 +- mf/feta18.mf | 12 +- mf/feta20.mf | 11 +- mf/feta23.mf | 13 +- mf/feta26.mf | 13 +- mf/parmesan-accidentals.mf | 2 +- mf/parmesan-clefs.mf | 78 +- mf/parmesan-custodes.mf | 2 +- mf/parmesan-dots.mf | 2 +- mf/parmesan-flags.mf | 2 +- mf/parmesan-generic.mf | 50 - mf/parmesan-macros.mf | 2 +- mf/parmesan-noteheads-generic.mf | 24 +- mf/parmesan-noteheads.mf | 2 +- mf/parmesan-noteheads11.mf | 10 +- mf/parmesan-noteheads13.mf | 10 +- mf/parmesan-noteheads14.mf | 10 +- mf/parmesan-noteheads16.mf | 10 +- mf/parmesan-noteheads18.mf | 10 +- mf/parmesan-noteheads20.mf | 10 +- mf/parmesan-noteheads23.mf | 10 +- mf/parmesan-noteheads26.mf | 10 +- mf/parmesan-other-generic.mf | 26 + mf/parmesan-rests.mf | 2 +- mf/parmesan-scripts.mf | 2 +- mf/parmesan-timesignatures.mf | 4 +- mf/parmesan11.mf | 11 +- mf/parmesan13.mf | 12 +- mf/parmesan14.mf | 13 +- mf/parmesan16.mf | 12 +- mf/parmesan18.mf | 12 +- mf/parmesan20.mf | 12 +- mf/parmesan23.mf | 12 +- mf/parmesan26.mf | 12 +- out/ChangeLog | 2 +- out/RELEASE-COMMIT | 114 +- po/ca.po | 998 +- po/cs.po | 8 +- po/da.po | 4676 ++++-- po/de.po | 992 +- po/el.po | 8 +- po/eo.po | 717 +- po/es.po | 964 +- po/fr.po | 882 +- po/it.po | 1724 +-- po/ja.po | 4369 +++--- po/lilypond.pot | 1382 +- po/nl.po | 2198 +-- po/sv.po | 10 +- ps/encodingdefs.ps | 1848 +++ python/GNUmakefile | 3 +- python/book_latex.py | 7 +- python/book_snippets.py | 18 +- python/book_texinfo.py | 2 + python/convertrules.py | 212 +- python/langdefs.py | 5 +- python/lilylib.py | 2 +- python/midi.c | 2 +- python/musicexp.py | 796 +- python/musicxml.py | 1892 ++- python/musicxml2ly_conversion.py | 53 + python/utilities.py | 268 + scm/accreg.scm | 4 +- scm/auto-beam.scm | 155 +- scm/autochange.scm | 51 +- scm/backend-library.scm | 150 +- scm/bar-line.scm | 62 +- scm/bezier-tools.scm | 2 +- scm/c++.scm | 28 +- scm/chord-entry.scm | 87 +- scm/chord-generic-names.scm | 2 +- scm/chord-ignatzek-names.scm | 12 +- scm/chord-name.scm | 5 +- scm/clip-region.scm | 2 +- scm/define-context-properties.scm | 83 +- scm/define-event-classes.scm | 15 +- scm/define-grob-interfaces.scm | 39 +- scm/define-grob-properties.scm | 320 +- scm/define-grobs.scm | 273 +- scm/define-markup-commands.scm | 954 +- scm/define-music-callbacks.scm | 61 +- scm/define-music-display-methods.scm | 541 +- scm/define-music-properties.scm | 19 +- scm/define-music-types.scm | 253 +- scm/define-note-names.scm | 320 +- scm/define-stencil-commands.scm | 2 +- scm/define-woodwind-diagrams.scm | 2 +- scm/display-lily.scm | 25 +- scm/display-woodwind-diagrams.scm | 2 +- scm/document-backend.scm | 51 +- scm/document-context-mods.scm | 39 +- scm/document-functions.scm | 2 +- scm/document-identifiers.scm | 14 +- scm/document-markup.scm | 19 +- scm/document-music.scm | 2 +- scm/document-translation.scm | 30 +- scm/document-type-predicates.scm | 2 +- scm/documentation-generate.scm | 10 +- scm/documentation-lib.scm | 42 +- scm/editor.scm | 2 +- scm/encoding.scm | 2 +- scm/file-cache.scm | 2 +- scm/flag-styles.scm | 20 +- scm/font.scm | 62 +- scm/framework-eps.scm | 12 +- scm/framework-ps.scm | 272 +- scm/framework-svg.scm | 2 +- scm/fret-diagrams.scm | 319 +- scm/graphviz.scm | 2 +- scm/guile-debugger.scm | 2 +- scm/harp-pedals.scm | 5 +- scm/layout-beam.scm | 2 +- scm/layout-slur.scm | 4 +- scm/lily-library.scm | 288 +- scm/lily-sort.scm | 2 +- scm/lily.scm | 98 +- scm/ly-syntax-constructors.scm | 355 +- scm/markup-macros.scm | 26 +- scm/markup.scm | 103 +- scm/midi.scm | 20 +- scm/modal-transforms.scm | 10 +- scm/music-functions.scm | 1375 +- scm/output-lib.scm | 436 +- scm/output-ps.scm | 81 +- scm/output-svg.scm | 10 +- scm/page.scm | 17 +- scm/paper-system.scm | 42 +- scm/paper.scm | 11 +- scm/parser-clef.scm | 74 +- scm/parser-ly-from-scheme.scm | 14 +- scm/part-combiner.scm | 588 +- scm/predefined-fretboards.scm | 31 +- scm/ps-to-png.scm | 190 +- scm/safe-lily.scm | 2 +- scm/safe-utility-defs.scm | 9 +- scm/scheme-engravers.scm | 109 +- scm/script.scm | 16 +- scm/skyline.scm | 2 +- scm/standalone.scm | 2 +- scm/stencil.scm | 519 +- scm/tablature.scm | 71 +- scm/text.scm | 2 +- scm/time-signature-settings.scm | 132 +- scm/time-signature.scm | 35 + scm/titling.scm | 11 +- scm/to-xml.scm | 2 +- scm/translation-functions.scm | 236 +- scm/x11-color.scm | 2 +- scripts/abc2ly.py | 3 + scripts/auxiliar/fixcc.py | 27 +- scripts/auxiliar/lily-git.tcl | 2 +- .../auxiliar/make-countdown-announcement.sh | 280 + scripts/auxiliar/makelsr.py | 3 +- scripts/auxiliar/pfx2ttf.fontforge | 29 - scripts/auxiliar/update-with-convert-ly.sh | 14 +- scripts/build/create-weblinks-itexi.py | 33 +- scripts/build/gen-emmentaler-scripts.py | 56 +- scripts/build/grand-replace.py | 7 +- scripts/build/lys-to-tely.py | 10 +- scripts/build/mf-to-table.py | 2 +- scripts/build/output-distance.py | 8 +- scripts/build/pytt.py | 2 +- scripts/build/website_post.py | 20 +- scripts/build/xetex-with-options.sh | 9 + scripts/convert-ly.py | 20 +- scripts/etf2ly.py | 6 +- scripts/lilymidi.py | 2 +- scripts/lilypond-book.py | 39 +- scripts/lilypond-invoke-editor.scm | 11 +- scripts/lilysong.py | 2 +- scripts/midi2ly.py | 8 +- scripts/musicxml2ly.py | 2981 ++-- stepmake/stepmake/executable-rules.make | 6 +- stepmake/stepmake/generic-vars.make | 14 +- stepmake/stepmake/help2man-rules.make | 1 + stepmake/stepmake/library-rules.make | 4 +- stepmake/stepmake/metafont-rules.make | 12 +- stepmake/stepmake/metafont-vars.make | 5 +- stepmake/stepmake/po-targets.make | 2 +- stepmake/stepmake/shared-library-rules.make | 3 +- stepmake/stepmake/test-rules.make | 4 +- stepmake/stepmake/texinfo-rules.make | 4 +- stepmake/stepmake/texinfo-vars.make | 2 +- tex/GNUmakefile | 2 - tex/lilypond.map.in | 4 - tex/texinfo.tex | 4510 ++++-- tex/txi-ca.tex | 62 + tex/txi-de.tex | 2 +- tex/txi-en.tex | 3 +- tex/txi-es.tex | 5 +- tex/txi-fr.tex | 2 +- tex/txi-hu.tex | 3 + tex/txi-it.tex | 2 +- tex/txi-nl.tex | 2 +- vim/lilypond-ftplugin.vim | 12 +- 3333 files changed, 185777 insertions(+), 107989 deletions(-) create mode 100644 Documentation/ca/GNUmakefile create mode 100644 Documentation/ca/included/.gitignore create mode 100644 Documentation/ca/learning.tely create mode 100644 Documentation/ca/learning/common-notation.itely create mode 100644 Documentation/ca/learning/fundamental.itely create mode 100644 Documentation/ca/learning/templates.itely create mode 100644 Documentation/ca/learning/tutorial.itely create mode 100644 Documentation/ca/learning/tweaks.itely create mode 100644 Documentation/ca/macros.itexi create mode 100644 Documentation/ca/search-box.ihtml create mode 100644 Documentation/ca/translations.itexi create mode 100644 Documentation/ca/usage.tely create mode 100644 Documentation/ca/usage/running.itely create mode 100644 Documentation/ca/usage/suggestions.itely create mode 100644 Documentation/ca/usage/updating.itely create mode 100644 Documentation/ca/web.texi create mode 100644 Documentation/ca/web/community.itexi create mode 100644 Documentation/ca/web/download.itexi create mode 100644 Documentation/ca/web/introduction.itexi create mode 100644 Documentation/ca/web/manuals.itexi create mode 100644 Documentation/ca/web/news-front.itexi rename Documentation/css/{lilypond-ie-fixes.css => lilypond-manuals-ie-fixes.css} (99%) create mode 100644 Documentation/css/lilypond-website-ie-fixes.css delete mode 100644 Documentation/fr/texidocs/accordion-registers.texidoc delete mode 100644 Documentation/fr/texidocs/ancient-notation-template----modern-transcription-of-mensural-music.texidoc delete mode 100644 Documentation/fr/texidocs/bar-chords-notation-for-guitar--with-text-spanner.texidoc delete mode 100644 Documentation/fr/texidocs/beam-grouping-in-7-8-time.texidoc delete mode 100644 Documentation/fr/texidocs/centering-markup-on-note-heads-automatically.texidoc create mode 100644 Documentation/fr/texidocs/creating-custom-dynamics-in-midi-output.texidoc create mode 100644 Documentation/fr/texidocs/creating-custom-key-signatures.texidoc rename Documentation/fr/texidocs/{entering-several-tuplets-using-only-one--times-command.texidoc => entering-several-tuplets-using-only-one--tuplet-command.texidoc} (79%) delete mode 100644 Documentation/fr/texidocs/forcing-a-clef-symbol-to-be-displayed.texidoc delete mode 100644 Documentation/fr/texidocs/keep-change-clefs-full-sized.texidoc delete mode 100644 Documentation/fr/texidocs/printing-a-repeat-sign-at-the-beginning-of-a-piece.texidoc create mode 100644 Documentation/fr/texidocs/printing-bar-numbers-with-changing-regular-intervals.texidoc create mode 100644 Documentation/fr/texidocs/replacing-default-midi-instrument-equalization.texidoc delete mode 100644 Documentation/fr/texidocs/transcription-of-ancient-music-with-incipit.texidoc create mode 100644 Documentation/fr/texidocs/using-an-extra-voice-for-breaks.texidoc create mode 100644 Documentation/fr/texidocs/using-tags-to-produce-mensural-and-modern-music-from-the-same-source.texidoc create mode 100644 Documentation/hu/essay.tely create mode 100644 Documentation/hu/essay/engraving.itely create mode 100644 Documentation/hu/essay/literature.itely create mode 100644 Documentation/hu/included/generating-output.itexi create mode 100644 Documentation/hu/included/helpus.itexi create mode 100644 Documentation/it/notation/changing-defaults.itely create mode 100644 Documentation/it/notation/cheatsheet.itely create mode 100644 Documentation/it/notation/input.itely create mode 100644 Documentation/it/notation/notation-appendices.itely create mode 100644 Documentation/it/notation/spacing.itely create mode 100644 Documentation/it/notation/specialist.itely create mode 100644 Documentation/it/notation/vocal.itely create mode 100644 Documentation/it/notation/world.itely create mode 100644 Documentation/it/texidocs/adding-orchestral-cues-to-a-vocal-score.texidoc delete mode 100644 Documentation/it/texidocs/ancient-notation-template----modern-transcription-of-mensural-music.texidoc create mode 100644 Documentation/it/texidocs/arabic-improvisation.texidoc create mode 100644 Documentation/it/texidocs/changing-midi-output-to-one-channel-per-voice.texidoc create mode 100644 Documentation/it/texidocs/chant-or-psalms-notation.texidoc create mode 100644 Documentation/it/texidocs/creating-custom-dynamics-in-midi-output.texidoc rename Documentation/it/texidocs/{entering-several-tuplets-using-only-one--times-command.texidoc => entering-several-tuplets-using-only-one--tuplet-command.texidoc} (90%) create mode 100644 Documentation/it/texidocs/formatting-lyrics-syllables.texidoc create mode 100644 Documentation/it/texidocs/incipit.texidoc create mode 100644 Documentation/it/texidocs/lyrics-alignment.texidoc create mode 100644 Documentation/it/texidocs/makam-example.texidoc create mode 100644 Documentation/it/texidocs/modifying-the-ottava-spanner-slope.texidoc create mode 100644 Documentation/it/texidocs/obtaining-2.12-lyrics-spacing-in-newer-versions.texidoc delete mode 100644 Documentation/it/texidocs/printing-a-repeat-sign-at-the-beginning-of-a-piece.texidoc create mode 100644 Documentation/it/texidocs/printing-bar-numbers-with-changing-regular-intervals.texidoc create mode 100644 Documentation/it/texidocs/replacing-default-midi-instrument-equalization.texidoc create mode 100644 Documentation/it/texidocs/simple-lead-sheet.texidoc create mode 100644 Documentation/it/texidocs/using-an-extra-voice-for-breaks.texidoc create mode 100644 Documentation/it/texidocs/using-arpeggiobracket-to-make-divisi-more-visible.texidoc create mode 100644 Documentation/lilypond-texi2html-lang.init create mode 100644 Documentation/ly-examples/Stockhausen_Klavierstueck2.ly delete mode 100644 Documentation/pictures/background-image.png create mode 100644 Documentation/pictures/background-top-left.png create mode 100644 Documentation/pictures/background-top-right.png delete mode 100644 Documentation/pictures/color1-active.png delete mode 100644 Documentation/pictures/color1-hover.png delete mode 100644 Documentation/pictures/color2-active.png delete mode 100644 Documentation/pictures/color2-hover.png delete mode 100644 Documentation/pictures/color3-active.png delete mode 100644 Documentation/pictures/color3-hover.png delete mode 100644 Documentation/pictures/color4-active.png delete mode 100644 Documentation/pictures/color4-hover.png create mode 100644 Documentation/pictures/lily-home-32x32.png delete mode 100644 Documentation/pictures/lily-home-nav-active.png delete mode 100644 Documentation/pictures/lily-home-nav-bg.png delete mode 100644 Documentation/pictures/lily-home-nav-hover.png delete mode 100644 Documentation/pictures/nav-active-2.png delete mode 100644 Documentation/pictures/nav-active.png delete mode 100644 Documentation/pictures/nav-bg-2.png delete mode 100644 Documentation/pictures/nav-bg.png delete mode 100644 Documentation/pictures/nav-hover-2.png delete mode 100644 Documentation/pictures/nav-hover.png create mode 100644 Documentation/pictures/nav1-active.png create mode 100644 Documentation/pictures/nav1-bg.png create mode 100644 Documentation/pictures/nav1-hover.png create mode 100644 Documentation/pictures/nav2-active.png create mode 100644 Documentation/pictures/nav2-bg.png create mode 100644 Documentation/pictures/nav2-hover.png delete mode 100644 Documentation/pictures/squiggle.jpg delete mode 100644 Documentation/pictures/summary-gradient.png create mode 100644 Documentation/pictures/text-input-1-annotate-ca.png create mode 100644 Documentation/pictures/text-input-2-annotate-ca.png create mode 100644 Documentation/pictures/text-input-parts-both-annotate-ca.png create mode 100644 Documentation/pictures/text-input-parts-single-annotate-ca.png create mode 100644 Documentation/pictures/text-input-pop-annotate-ca.png create mode 100644 Documentation/pictures/text-input-score-annotate-ca.png create mode 100644 Documentation/po/ca.po create mode 100644 Documentation/snippets/accordion-register-symbols.ly delete mode 100644 Documentation/snippets/accordion-registers.ly create mode 100644 Documentation/snippets/adding-markups-in-a-tablature.ly delete mode 100644 Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly create mode 100644 Documentation/snippets/arranging-separate-lyrics-on-a-single-line.ly rename Documentation/snippets/{bar-chords-notation-for-guitar--with-text-spanner.ly => bar-chords-notation-for-guitar-with-text-spanner.ly} (79%) delete mode 100644 Documentation/snippets/beam-grouping-in-7-8-time.ly delete mode 100644 Documentation/snippets/centering-markup-on-note-heads-automatically.ly create mode 100644 Documentation/snippets/changing-beam-thickness-and-spacing.ly create mode 100644 Documentation/snippets/changing-ottava-text.ly create mode 100644 Documentation/snippets/changing-the-default-bar-lines.ly delete mode 100644 Documentation/snippets/correction-wanted.snippet-list create mode 100644 Documentation/snippets/creating-custom-dynamics-in-midi-output.ly create mode 100644 Documentation/snippets/creating-custom-key-signatures.ly create mode 100644 Documentation/snippets/customize-drumpitchnames,-drumstyletable-and-drumpitchtable-in-layout-and-midi.ly create mode 100644 Documentation/snippets/customizing-the-position-and-number-of-dots-in-repeat-sign-bar-lines.ly rename Documentation/snippets/{entering-several-tuplets-using-only-one--times-command.ly => entering-several-tuplets-using-only-one--tuplet-command.ly} (53%) create mode 100644 Documentation/snippets/extending-a-trillspanner.ly create mode 100644 Documentation/snippets/flat-ties.ly create mode 100644 Documentation/snippets/let-tabstaff-print-the-topmost-string-at-bottom.ly create mode 100644 Documentation/snippets/modifying-the-ottava-spanner-slope.ly delete mode 100644 Documentation/snippets/new/accordion-discant-symbols.ly delete mode 100644 Documentation/snippets/new/accordion-registers.ly delete mode 100644 Documentation/snippets/new/adding-a-figured-bass-above-or-below-the-notes.ly delete mode 100644 Documentation/snippets/new/adding-extra-fingering-with-scheme.ly delete mode 100644 Documentation/snippets/new/adding-orchestral-cues-to-a-vocal-score.ly delete mode 100644 Documentation/snippets/new/adding-timing-marks-to-long-glissandi.ly delete mode 100644 Documentation/snippets/new/alternative-bar-numbering.ly delete mode 100644 Documentation/snippets/new/ancient-fonts.ly delete mode 100644 Documentation/snippets/new/ancient-notation-template----modern-transcription-of-gregorian-music.ly delete mode 100644 Documentation/snippets/new/bar-chords-notation-for-guitar--with-text-spanner.ly delete mode 100644 Documentation/snippets/new/broken-crescendo-hairpin.ly delete mode 100644 Documentation/snippets/new/centered-measure-numbers.ly delete mode 100644 Documentation/snippets/new/centering-markup-on-note-heads-automatically.ly create mode 100644 Documentation/snippets/new/changing-form-of-multi-measure-rests.ly create mode 100644 Documentation/snippets/new/changing-properties-for-individual-grobs.ly delete mode 100644 Documentation/snippets/new/changing-the-tuplet-number.ly delete mode 100644 Documentation/snippets/new/changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly delete mode 100644 Documentation/snippets/new/chant-or-psalms-notation.ly delete mode 100644 Documentation/snippets/new/chords-headword.ly delete mode 100644 Documentation/snippets/new/compound-time-signatures.ly delete mode 100644 Documentation/snippets/new/conducting-signs,-measure-grouping-signs.ly delete mode 100644 Documentation/snippets/new/creating-a-delayed-turn.ly delete mode 100644 Documentation/snippets/new/creating-double-digit-fingerings.ly delete mode 100644 Documentation/snippets/new/creating-real-parenthesized-dynamics.ly delete mode 100644 Documentation/snippets/new/cross-staff-stems.ly delete mode 100644 Documentation/snippets/new/entering-several-tuplets-using-only-one--times-command.ly delete mode 100644 Documentation/snippets/new/expressive-headword.ly delete mode 100644 Documentation/snippets/new/extending-glissandi-across-repeats.ly create mode 100644 Documentation/snippets/new/flat-flags-and-beam-nibs.ly create mode 100644 Documentation/snippets/new/flute-slap-notation.ly create mode 100644 Documentation/snippets/new/forcing-measure-width-to-adapt-to-metronomemarks-width.ly delete mode 100644 Documentation/snippets/new/fretted-headword.ly delete mode 100644 Documentation/snippets/new/generating-custom-flags.ly delete mode 100644 Documentation/snippets/new/glissandi-can-skip-grobs.ly delete mode 100644 Documentation/snippets/new/guitar-slides.ly delete mode 100644 Documentation/snippets/new/hammer-on-and-pull-off-using-chords.ly delete mode 100644 Documentation/snippets/new/hammer-on-and-pull-off-using-voices.ly delete mode 100644 Documentation/snippets/new/hammer-on-and-pull-off.ly delete mode 100644 Documentation/snippets/new/heavily-customized-polymetric-time-signatures.ly delete mode 100644 Documentation/snippets/new/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly delete mode 100644 Documentation/snippets/new/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-1.ly delete mode 100644 Documentation/snippets/new/inserting-score-fragments-above-a-staff,-as-markups.ly delete mode 100644 Documentation/snippets/new/jazz-combo-template.ly delete mode 100644 Documentation/snippets/new/keyboard-headword.ly delete mode 100644 Documentation/snippets/new/making-glissandi-breakable.ly delete mode 100644 Documentation/snippets/new/merging-multi-measure-rests-in-a-polyphonic-part.ly create mode 100644 Documentation/snippets/new/modifying-tuplet-bracket-length.ly create mode 100644 Documentation/snippets/new/multi-measure-rest-markup.ly create mode 100644 Documentation/snippets/new/non-traditional-key-signatures.ly delete mode 100644 Documentation/snippets/new/numbering-groups-of-measures.ly delete mode 100644 Documentation/snippets/new/numbers-as-easy-note-heads.ly delete mode 100644 Documentation/snippets/new/pitches-headword.ly delete mode 100644 Documentation/snippets/new/printing-a-repeat-sign-at-the-beginning-of-a-piece.ly delete mode 100644 Documentation/snippets/new/printing-hairpins-in-various-styles.ly delete mode 100644 Documentation/snippets/new/quoting-another-voice-with-transposition.ly delete mode 100644 Documentation/snippets/new/redefining-grace-note-global-defaults.ly create mode 100644 Documentation/snippets/new/replacing-default-midi-instrument-equalization.ly create mode 100644 Documentation/snippets/new/rest-styles.ly delete mode 100644 Documentation/snippets/new/score-for-diatonic-accordion.ly create mode 100644 Documentation/snippets/new/single-staff-template-with-notes-and-chords.ly delete mode 100644 Documentation/snippets/new/strict-beat-beaming.ly delete mode 100644 Documentation/snippets/new/string-number-extender-lines.ly create mode 100644 Documentation/snippets/new/subdividing-beams.ly create mode 100644 Documentation/snippets/new/user-defined-time-signatures.ly delete mode 100644 Documentation/snippets/new/using-a-tick-as-the-breath-mark-symbol.ly delete mode 100644 Documentation/snippets/new/using-alternative-flag-styles.ly delete mode 100644 Documentation/snippets/new/using-grace-note-slashes-with-normal-heads.ly create mode 100644 Documentation/snippets/new/using-the-whiteout-property.ly create mode 100644 Documentation/snippets/new/utf-8.ly delete mode 100644 Documentation/snippets/new/vertically-aligned-dynamics-and-textscripts.ly create mode 100644 Documentation/snippets/new/wind-headword.ly delete mode 100644 Documentation/snippets/new/woodwind-diagrams-key-lists.ly delete mode 100644 Documentation/snippets/printing-a-repeat-sign-at-the-beginning-of-a-piece.ly create mode 100644 Documentation/snippets/printing-bar-numbers-with-changing-regular-intervals.ly create mode 100644 Documentation/snippets/removing-brace-on-first-line-of-piano-score.ly create mode 100644 Documentation/snippets/replacing-default-midi-instrument-equalization.ly delete mode 100644 Documentation/snippets/transcription-of-ancient-music-with-incipit.ly create mode 100644 Documentation/snippets/tuplet-bracket-and-change-staff.ly create mode 100644 Documentation/snippets/two--partcombine-pairs-on-one-staff.ly create mode 100644 Documentation/snippets/user-defined-time-signatures.ly create mode 100644 Documentation/snippets/using-an-extra-voice-for-breaks.ly create mode 100644 Documentation/snippets/using-tags-to-produce-mensural-and-modern-music-from-the-same-source.ly create mode 100644 input/regression/addlyrics-existing-context.ly create mode 100644 input/regression/addlyrics-to-staff-context.ly create mode 100644 input/regression/autochange-clefs.ly create mode 100644 input/regression/autochange-inside-grace.ly create mode 100644 input/regression/autochange-relative.ly create mode 100644 input/regression/autochange-turning-pitch.ly create mode 100644 input/regression/autochange-with-grace.ly create mode 100644 input/regression/bar-number-check.ly create mode 100644 input/regression/beam-subdivide-quarter-notes.ly create mode 100644 input/regression/beam-subdivide-shortened-beam.ly create mode 100644 input/regression/beam-subdivide-trailing-stem.ly create mode 100644 input/regression/beam-subdivision.ly create mode 100644 input/regression/bend-bound.ly create mode 100644 input/regression/chord-changes-alternative.ly create mode 100644 input/regression/chord-dots.ly create mode 100644 input/regression/chord-repetition-accidentals.ly delete mode 100644 input/regression/collision-alignment.ly create mode 100644 input/regression/compound-time-signature-style.ly create mode 100644 input/regression/divisi-staves.ly delete mode 100644 input/regression/dynamics-avoid-cross-staff-stem.ly create mode 100644 input/regression/flip-stencil.ly create mode 100644 input/regression/fretdiagram-markup-in-dots.ly create mode 100644 input/regression/glissando-dots.ly create mode 100644 input/regression/halfopenvertical.ly create mode 100644 input/regression/identifier-alists.ly create mode 100644 input/regression/inherit-acceptability.ly create mode 100644 input/regression/input-order-alignment.ly create mode 100644 input/regression/ledger-extra.ly create mode 100644 input/regression/ledger-positions-customization.ly create mode 100644 input/regression/lilypond-book/melody.ly create mode 100644 input/regression/lyric-combine-nullvoice.ly create mode 100644 input/regression/magnifyMusic-dots-beamlets.ly create mode 100644 input/regression/magnifyMusic-laissez-vibrer-ties.ly create mode 100644 input/regression/magnifyMusic-phrasing-slurs.ly create mode 100644 input/regression/magnifyMusic-repeat-ties.ly create mode 100644 input/regression/magnifyMusic-slurs.ly create mode 100644 input/regression/magnifyMusic-stem-beam-spacing.ly create mode 100644 input/regression/magnifyMusic-tablature-double-stems.ly create mode 100644 input/regression/magnifyMusic-text-interface.ly create mode 100644 input/regression/magnifyMusic-ties.ly create mode 100644 input/regression/magnifyStaff-bar-lines.ly create mode 100644 input/regression/magnifyStaff-dots-beamlets.ly create mode 100644 input/regression/magnifyStaff-space-alist.ly create mode 100644 input/regression/magnifyStaff-staff-line-thickness.ly create mode 100644 input/regression/magnifyStaff-tablature-double-stems.ly create mode 100644 input/regression/magnifyStaff-text-interface.ly create mode 100644 input/regression/markup-compound-meter.ly create mode 100644 input/regression/markup-first-visible.ly create mode 100644 input/regression/markup-map.ly create mode 100644 input/regression/markup-partial.ly create mode 100644 input/regression/metronome-mark-formatter.ly create mode 100644 input/regression/midi-grace-after-rest.ly create mode 100644 input/regression/midi/crescendo-abutting.ly create mode 100644 input/regression/midi/dynamic-initial.ly create mode 100644 input/regression/midi/sequence-name-scoping.ly create mode 100644 input/regression/midi/sequence-name.ly create mode 100644 input/regression/minimum-length-after-break.ly create mode 100644 input/regression/minimum-length-broken-ties.ly create mode 100644 input/regression/monochords.ly create mode 100644 input/regression/music-function-direct-call.ly create mode 100644 input/regression/music-function-incomplete.ly create mode 100644 input/regression/note-collision-threshold.ly create mode 100644 input/regression/notehead-height.ly create mode 100644 input/regression/one-line-auto-height-breaking.ly create mode 100644 input/regression/one-staff.ly create mode 100644 input/regression/parallelmusic-partial.ly create mode 100644 input/regression/parent-alignment-synchronized-with-self-alignment.ly create mode 100644 input/regression/parenthesize-notes-accidentals.ly create mode 100644 input/regression/part-combine-chord-range.ly create mode 100644 input/regression/part-combine-inside-grace.ly create mode 100644 input/regression/part-combine-mmrest-after-apart-silence.ly create mode 100644 input/regression/part-combine-mmrest-shared.ly create mode 100644 input/regression/part-combine-relative.ly create mode 100644 input/regression/part-combine-silence-mixed.ly create mode 100644 input/regression/part-combine-silence.ly create mode 100644 input/regression/part-combine-strings.ly create mode 100644 input/regression/part-combine-unequal-lengths.ly create mode 100644 input/regression/part-combine-with-grace.ly create mode 100644 input/regression/partial-in-mid-piece.ly create mode 100644 input/regression/relative.ly create mode 100644 input/regression/repeat-tie-parenthesize.ly create mode 100644 input/regression/revert-once.ly create mode 100644 input/regression/rhythmic-sequence.ly create mode 100644 input/regression/satb-template-on-two-staves-with-verses.ly create mode 100644 input/regression/satb-template-soprano-and-tenor-may-be-omitted.ly create mode 100644 input/regression/satb-template-with-changed-instrument-names.ly create mode 100644 input/regression/satb-template-with-men-women-and-descant.ly create mode 100644 input/regression/score-lines.ly create mode 100644 input/regression/script-shift-staccato.ly create mode 100644 input/regression/self-alignment-and-parent-alignment.ly create mode 100644 input/regression/ssaattbb-template-with-all-staves.ly create mode 100644 input/regression/ssaattbb-template-with-all-voices-on-one-staff.ly create mode 100644 input/regression/ssaattbb-template-with-changed-instrument-names.ly create mode 100644 input/regression/ssaattbb-template-with-men-women-and-descant.ly create mode 100644 input/regression/staff-ledger-positions-dotted-notes.ly create mode 100644 input/regression/stem-tremolo-style.ly create mode 100644 input/regression/string-number-styles.ly create mode 100644 input/regression/tablature-additional-bass-strings.ly create mode 100644 input/regression/tablature-micro-tone.ly create mode 100644 input/regression/tag-group.ly create mode 100644 input/regression/tie-enharmonic.ly create mode 100644 input/regression/time-signature-mensural.ly create mode 100644 input/regression/time-signature-midmeasure-warning.ly create mode 100644 input/regression/time-signature-midmeasure.ly create mode 100644 input/regression/time-signature-numbered.ly create mode 100644 input/regression/time-signature-single-digit.ly create mode 100644 input/regression/tuplet-long-spanner.ly create mode 100644 input/regression/tuplet-number-french-kneed-beams.ly create mode 100644 input/regression/tuplet-number-kneed-beam-even-stem-count.ly create mode 100644 input/regression/tuplet-number-kneed-beam-horizontal-fit.ly create mode 100644 input/regression/tuplet-number-kneed-beam-ledger-lines.ly create mode 100644 input/regression/tuplet-number-kneed-beam-positions.ly create mode 100644 input/regression/tuplet-number-shift-along-kneed-beam.ly create mode 100644 input/regression/tuplet-numbers-kneed-beams-accidentals.ly create mode 100644 input/regression/tuplet-numbers-kneed-beams.ly create mode 100644 input/regression/tweaks-as-overrides.ly create mode 100644 input/regression/unassociated-lyrics-alignment.ly create mode 100644 input/regression/unset-once.ly create mode 100644 lily/change-sequence-iterator.cc create mode 100644 lily/clef-modifier.cc create mode 100644 lily/include/callback.hh rename lily/include/{time-scaled-music-iterator.hh => change-sequence-iterator.hh} (50%) create mode 100644 lily/include/fluid.hh create mode 100644 lily/include/grob-properties.hh delete mode 100644 lily/include/group-interface.hh create mode 100644 lily/include/lily-imports.hh create mode 100644 lily/include/lily-modules.hh delete mode 100644 lily/include/ly-smobs.icc rename lily/include/{scheme-listener.hh => one-line-auto-height-breaking.hh} (62%) delete mode 100644 lily/include/simple-closure.hh create mode 100644 lily/include/slur-engraver.hh delete mode 100644 lily/include/slur-proto-engraver.hh create mode 100644 lily/include/small-smobs.hh create mode 100644 lily/include/smobs.tcc rename lily/include/{time-signature.hh => tuplet-number.hh} (56%) create mode 100644 lily/lily-imports.cc create mode 100644 lily/lily-modules.cc create mode 100644 lily/line-interface-scheme.cc create mode 100644 lily/one-line-auto-height-breaking.cc create mode 100644 lily/part-combine-part-iterator.cc delete mode 100644 lily/scheme-listener-scheme.cc delete mode 100644 lily/scheme-listener.cc delete mode 100644 lily/simple-closure.cc delete mode 100644 lily/slur-proto-engraver.cc delete mode 100644 lily/time-signature.cc delete mode 100644 lily/unfolded-repeat-iterator.cc create mode 100644 ly/base-tkit.ly create mode 100644 ly/lyrics-tkit.ly create mode 100644 ly/piano-tkit.ly create mode 100644 ly/satb.ly create mode 100644 ly/ssaattbb.ly create mode 100644 ly/staff-tkit.ly create mode 100644 ly/vocal-tkit.ly create mode 100644 ly/voice-tkit.ly create mode 100644 mf/00-lilypond-fonts.conf.in create mode 100644 mf/99-lilypond-fonts.conf.in create mode 100644 mf/common-modules-and-initialization.mf create mode 100644 mf/debugging-settings.mf create mode 100644 mf/declare-autometric-parameters.mf create mode 100644 mf/feta-alphabet-generic.mf delete mode 100644 mf/feta-alphabet.mf create mode 100644 mf/feta-arrow.mf create mode 100644 mf/feta-braces-generic.mf create mode 100644 mf/feta-flats.mf delete mode 100644 mf/feta-generic.mf create mode 100644 mf/feta-naturals.mf create mode 100644 mf/feta-other-generic.mf create mode 100644 mf/feta-parenthesis.mf create mode 100644 mf/feta-sharps.mf delete mode 100644 mf/feta-test-generic.mf delete mode 100644 mf/feta-test11.mf delete mode 100644 mf/feta-test13.mf delete mode 100644 mf/feta-test16.mf delete mode 100644 mf/feta-test20.mf delete mode 100644 mf/feta-test23.mf delete mode 100644 mf/feta-test26.mf delete mode 100644 mf/parmesan-generic.mf create mode 100644 mf/parmesan-other-generic.mf create mode 100644 ps/encodingdefs.ps create mode 100644 python/musicxml2ly_conversion.py create mode 100644 python/utilities.py create mode 100644 scm/time-signature.scm create mode 100755 scripts/auxiliar/make-countdown-announcement.sh delete mode 100644 scripts/auxiliar/pfx2ttf.fontforge create mode 100755 scripts/build/xetex-with-options.sh delete mode 100644 tex/lilypond.map.in create mode 100644 tex/txi-ca.tex diff --git a/.gitfilelist b/.gitfilelist index a91a489c8a..ea8f1441ba 100644 --- a/.gitfilelist +++ b/.gitfilelist @@ -5,6 +5,27 @@ COPYING COPYING.FDL DEDICATION Documentation/GNUmakefile +Documentation/ca/GNUmakefile +Documentation/ca/included/.gitignore +Documentation/ca/learning.tely +Documentation/ca/learning/common-notation.itely +Documentation/ca/learning/fundamental.itely +Documentation/ca/learning/templates.itely +Documentation/ca/learning/tutorial.itely +Documentation/ca/learning/tweaks.itely +Documentation/ca/macros.itexi +Documentation/ca/search-box.ihtml +Documentation/ca/translations.itexi +Documentation/ca/usage.tely +Documentation/ca/usage/running.itely +Documentation/ca/usage/suggestions.itely +Documentation/ca/usage/updating.itely +Documentation/ca/web.texi +Documentation/ca/web/community.itexi +Documentation/ca/web/download.itexi +Documentation/ca/web/introduction.itexi +Documentation/ca/web/manuals.itexi +Documentation/ca/web/news-front.itexi Documentation/changes.tely Documentation/common-macros.itexi Documentation/contributor.texi @@ -48,8 +69,9 @@ Documentation/cs/web/download.itexi Documentation/cs/web/introduction.itexi Documentation/cs/web/manuals.itexi Documentation/css/GNUmakefile -Documentation/css/lilypond-ie-fixes.css +Documentation/css/lilypond-manuals-ie-fixes.css Documentation/css/lilypond-manuals.css +Documentation/css/lilypond-website-ie-fixes.css Documentation/css/lilypond-website.css Documentation/cyrillic.itexi Documentation/de/GNUmakefile @@ -712,7 +734,6 @@ Documentation/fr/notation/wind.itely Documentation/fr/notation/world.itely Documentation/fr/search-box.ihtml Documentation/fr/texidocs/accordion-discant-symbols.texidoc -Documentation/fr/texidocs/accordion-registers.texidoc Documentation/fr/texidocs/adding-a-figured-bass-above-or-below-the-notes.texidoc Documentation/fr/texidocs/adding-ambitus-per-voice.texidoc Documentation/fr/texidocs/adding-an-extra-staff-at-a-line-break.texidoc @@ -748,7 +769,6 @@ Documentation/fr/texidocs/ambitus.texidoc Documentation/fr/texidocs/analysis-brackets-above-the-staff.texidoc Documentation/fr/texidocs/ancient-fonts.texidoc Documentation/fr/texidocs/ancient-notation-template----modern-transcription-of-gregorian-music.texidoc -Documentation/fr/texidocs/ancient-notation-template----modern-transcription-of-mensural-music.texidoc Documentation/fr/texidocs/ancient-time-signatures.texidoc Documentation/fr/texidocs/anglican-psalm-template.texidoc Documentation/fr/texidocs/applying-note-head-styles-depending-on-the-step-of-the-scale.texidoc @@ -758,9 +778,7 @@ Documentation/fr/texidocs/automatic-beam-subdivisions.texidoc Documentation/fr/texidocs/automatically-change-durations.texidoc Documentation/fr/texidocs/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.texidoc Documentation/fr/texidocs/avoiding-collisions-with-chord-fingerings.texidoc -Documentation/fr/texidocs/bar-chords-notation-for-guitar--with-text-spanner.texidoc Documentation/fr/texidocs/beam-endings-in-score-context.texidoc -Documentation/fr/texidocs/beam-grouping-in-7-8-time.texidoc Documentation/fr/texidocs/beams-across-line-breaks.texidoc Documentation/fr/texidocs/blanking-staff-lines-using-the--whiteout-command.texidoc Documentation/fr/texidocs/book-parts.texidoc @@ -768,7 +786,6 @@ Documentation/fr/texidocs/breathing-signs.texidoc Documentation/fr/texidocs/broken-crescendo-hairpin.texidoc Documentation/fr/texidocs/caesura-railtracks-with-fermata.texidoc Documentation/fr/texidocs/center-text-below-hairpin-dynamics.texidoc -Documentation/fr/texidocs/centering-markup-on-note-heads-automatically.texidoc Documentation/fr/texidocs/changing--flageolet-mark-size.texidoc Documentation/fr/texidocs/changing-a-single-notes-size-in-a-chord.texidoc Documentation/fr/texidocs/changing-beam-knee-gap.texidoc @@ -820,6 +837,8 @@ Documentation/fr/texidocs/creating-arpeggios-across-notes-in-different-voices.te Documentation/fr/texidocs/creating-blank-staves.texidoc Documentation/fr/texidocs/creating-cross-staff-arpeggios-in-a-piano-staff.texidoc Documentation/fr/texidocs/creating-cross-staff-arpeggios-in-other-contexts.texidoc +Documentation/fr/texidocs/creating-custom-dynamics-in-midi-output.texidoc +Documentation/fr/texidocs/creating-custom-key-signatures.texidoc Documentation/fr/texidocs/creating-double-digit-fingerings.texidoc Documentation/fr/texidocs/creating-metronome-marks-in-markup-mode.texidoc Documentation/fr/texidocs/creating-real-parenthesized-dynamics.texidoc @@ -852,7 +871,7 @@ Documentation/fr/texidocs/embedding-native-postscript-in-a--markup-block.texidoc Documentation/fr/texidocs/engravers-one-by-one.texidoc Documentation/fr/texidocs/engraving-ties-manually.texidoc Documentation/fr/texidocs/engraving-tremolos-with-floating-beams.texidoc -Documentation/fr/texidocs/entering-several-tuplets-using-only-one--times-command.texidoc +Documentation/fr/texidocs/entering-several-tuplets-using-only-one--tuplet-command.texidoc Documentation/fr/texidocs/extending-glissandi-across-repeats.texidoc Documentation/fr/texidocs/faking-a-hammer-in-tablatures.texidoc Documentation/fr/texidocs/fine-tuning-pedal-brackets.texidoc @@ -861,7 +880,6 @@ Documentation/fr/texidocs/fingerings,-string-indications,-and-right-hand-fingeri Documentation/fr/texidocs/flamenco-notation.texidoc Documentation/fr/texidocs/flat-flags-and-beam-nibs.texidoc Documentation/fr/texidocs/flute-slap-notation.texidoc -Documentation/fr/texidocs/forcing-a-clef-symbol-to-be-displayed.texidoc Documentation/fr/texidocs/forcing-horizontal-shift-of-notes.texidoc Documentation/fr/texidocs/forcing-hyphens-to-be-shown.texidoc Documentation/fr/texidocs/forcing-measure-width-to-adapt-to-metronomemarks-width.texidoc @@ -898,7 +916,6 @@ Documentation/fr/texidocs/inserting-a-caesura.texidoc Documentation/fr/texidocs/inserting-score-fragments-above-a-staff,-as-markups.texidoc Documentation/fr/texidocs/isolated-percent-repeats.texidoc Documentation/fr/texidocs/jazz-combo-template.texidoc -Documentation/fr/texidocs/keep-change-clefs-full-sized.texidoc Documentation/fr/texidocs/laissez-vibrer-ties.texidoc Documentation/fr/texidocs/letter-tablature-formatting.texidoc Documentation/fr/texidocs/line-arrows.texidoc @@ -950,9 +967,9 @@ Documentation/fr/texidocs/positioning-text-markups-inside-slurs.texidoc Documentation/fr/texidocs/preventing-extra-naturals-from-being-automatically-added.texidoc Documentation/fr/texidocs/preventing-final-mark-from-removing-final-tuplet.texidoc Documentation/fr/texidocs/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.texidoc -Documentation/fr/texidocs/printing-a-repeat-sign-at-the-beginning-of-a-piece.texidoc Documentation/fr/texidocs/printing-bar-numbers-at-regular-intervals.texidoc Documentation/fr/texidocs/printing-bar-numbers-inside-boxes-or-circles.texidoc +Documentation/fr/texidocs/printing-bar-numbers-with-changing-regular-intervals.texidoc Documentation/fr/texidocs/printing-hairpins-in-various-styles.texidoc Documentation/fr/texidocs/printing-hairpins-using-al-niente-notation.texidoc Documentation/fr/texidocs/printing-marks-at-the-end-of-a-line.texidoc @@ -971,6 +988,7 @@ Documentation/fr/texidocs/redefining-grace-note-global-defaults.texidoc Documentation/fr/texidocs/removing-bar-numbers-from-a-score.texidoc Documentation/fr/texidocs/removing-connecting-bar-lines-on-staffgroup,-pianostaff,-or-grandstaff.texidoc Documentation/fr/texidocs/removing-the-first-empty-line.texidoc +Documentation/fr/texidocs/replacing-default-midi-instrument-equalization.texidoc Documentation/fr/texidocs/rest-styles.texidoc Documentation/fr/texidocs/reverting-default-beam-endings.texidoc Documentation/fr/texidocs/rhythmic-slashes.texidoc @@ -1011,19 +1029,20 @@ Documentation/fr/texidocs/tick-bar-lines.texidoc Documentation/fr/texidocs/time-signature-in-parentheses---method-3.texidoc Documentation/fr/texidocs/time-signature-in-parentheses.texidoc Documentation/fr/texidocs/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.texidoc -Documentation/fr/texidocs/transcription-of-ancient-music-with-incipit.texidoc Documentation/fr/texidocs/transposing-pitches-with-minimum-accidentals-smart-transpose.texidoc Documentation/fr/texidocs/tweaking-clef-properties.texidoc Documentation/fr/texidocs/tweaking-grace-layout-within-music.texidoc Documentation/fr/texidocs/use-square-bracket-at-the-start-of-a-staff-group.texidoc Documentation/fr/texidocs/using-a-tick-as-the-breath-mark-symbol.texidoc Documentation/fr/texidocs/using-alternative-flag-styles.texidoc +Documentation/fr/texidocs/using-an-extra-voice-for-breaks.texidoc Documentation/fr/texidocs/using-arpeggiobracket-to-make-divisi-more-visible.texidoc Documentation/fr/texidocs/using-autochange-with-more-than-one-voice.texidoc Documentation/fr/texidocs/using-double-slurs-for-legato-chords.texidoc Documentation/fr/texidocs/using-grace-note-slashes-with-normal-heads.texidoc Documentation/fr/texidocs/using-ly-grob-object-to-access-grobs-with--tweak.texidoc Documentation/fr/texidocs/using-postscript-to-generate-special-note-head-shapes.texidoc +Documentation/fr/texidocs/using-tags-to-produce-mensural-and-modern-music-from-the-same-source.texidoc Documentation/fr/texidocs/using-the--tweak-command-to-tweak-individual-grobs.texidoc Documentation/fr/texidocs/using-the-whiteout-property.texidoc Documentation/fr/texidocs/using-ties-with-arpeggios.texidoc @@ -1057,7 +1076,12 @@ Documentation/fr/web/introduction.itexi Documentation/fr/web/manuals.itexi Documentation/gpl.itexi Documentation/hu/GNUmakefile +Documentation/hu/essay.tely +Documentation/hu/essay/engraving.itely +Documentation/hu/essay/literature.itely Documentation/hu/included/.gitignore +Documentation/hu/included/generating-output.itexi +Documentation/hu/included/helpus.itexi Documentation/hu/learning.tely Documentation/hu/learning/common-notation.itely Documentation/hu/learning/fundamental.itely @@ -1110,18 +1134,27 @@ Documentation/it/learning/tutorial.itely Documentation/it/learning/tweaks.itely Documentation/it/macros.itexi Documentation/it/notation.tely +Documentation/it/notation/changing-defaults.itely +Documentation/it/notation/cheatsheet.itely Documentation/it/notation/editorial.itely Documentation/it/notation/expressive.itely +Documentation/it/notation/input.itely +Documentation/it/notation/notation-appendices.itely Documentation/it/notation/notation.itely Documentation/it/notation/pitches.itely Documentation/it/notation/repeats.itely Documentation/it/notation/rhythms.itely Documentation/it/notation/simultaneous.itely +Documentation/it/notation/spacing.itely +Documentation/it/notation/specialist.itely Documentation/it/notation/staff.itely Documentation/it/notation/text.itely +Documentation/it/notation/vocal.itely +Documentation/it/notation/world.itely Documentation/it/search-box.ihtml Documentation/it/texidocs/adding-ambitus-per-voice.texidoc Documentation/it/texidocs/adding-an-ottava-marking-to-a-single-voice.texidoc +Documentation/it/texidocs/adding-orchestral-cues-to-a-vocal-score.texidoc Documentation/it/texidocs/adding-timing-marks-to-long-glissandi.texidoc Documentation/it/texidocs/adding-volta-brackets-to-additional-staves.texidoc Documentation/it/texidocs/additional-voices-to-avoid-collisions.texidoc @@ -1132,15 +1165,16 @@ Documentation/it/texidocs/alternative-bar-numbering.texidoc Documentation/it/texidocs/alternative-breve-notes.texidoc Documentation/it/texidocs/ambitus-with-multiple-voices.texidoc Documentation/it/texidocs/ancient-notation-template----modern-transcription-of-gregorian-music.texidoc -Documentation/it/texidocs/ancient-notation-template----modern-transcription-of-mensural-music.texidoc Documentation/it/texidocs/anglican-psalm-template.texidoc Documentation/it/texidocs/applying-note-head-styles-depending-on-the-step-of-the-scale.texidoc +Documentation/it/texidocs/arabic-improvisation.texidoc Documentation/it/texidocs/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.texidoc Documentation/it/texidocs/avoiding-collisions-with-chord-fingerings.texidoc Documentation/it/texidocs/beam-endings-in-score-context.texidoc Documentation/it/texidocs/beams-across-line-breaks.texidoc Documentation/it/texidocs/changing-beam-knee-gap.texidoc Documentation/it/texidocs/changing-form-of-multi-measure-rests.texidoc +Documentation/it/texidocs/changing-midi-output-to-one-channel-per-voice.texidoc Documentation/it/texidocs/changing-partcombine-texts.texidoc Documentation/it/texidocs/changing-text-and-spanner-styles-for-text-dynamics.texidoc Documentation/it/texidocs/changing-the-ambitus-gap.texidoc @@ -1148,6 +1182,7 @@ Documentation/it/texidocs/changing-the-breath-mark-symbol.texidoc Documentation/it/texidocs/changing-the-number-of-augmentation-dots-per-note.texidoc Documentation/it/texidocs/changing-the-tempo-without-a-metronome-mark.texidoc Documentation/it/texidocs/changing-the-tuplet-number.texidoc +Documentation/it/texidocs/chant-or-psalms-notation.texidoc Documentation/it/texidocs/combining-two-parts-on-the-same-staff.texidoc Documentation/it/texidocs/conducting-signs,-measure-grouping-signs.texidoc Documentation/it/texidocs/contemporary-glissando.texidoc @@ -1158,6 +1193,7 @@ Documentation/it/texidocs/creating-a-delayed-turn.texidoc Documentation/it/texidocs/creating-arpeggios-across-notes-in-different-voices.texidoc Documentation/it/texidocs/creating-cross-staff-arpeggios-in-a-piano-staff.texidoc Documentation/it/texidocs/creating-cross-staff-arpeggios-in-other-contexts.texidoc +Documentation/it/texidocs/creating-custom-dynamics-in-midi-output.texidoc Documentation/it/texidocs/creating-metronome-marks-in-markup-mode.texidoc Documentation/it/texidocs/cross-staff-tremolos.texidoc Documentation/it/texidocs/default-direction-of-stems-on-the-center-line-of-the-staff.texidoc @@ -1165,28 +1201,34 @@ Documentation/it/texidocs/display-bracket-with-only-one-staff-in-a-system.texido Documentation/it/texidocs/dynamics-custom-text-spanner-postfix.texidoc Documentation/it/texidocs/dynamics-text-spanner-postfix.texidoc Documentation/it/texidocs/engraving-ties-manually.texidoc -Documentation/it/texidocs/entering-several-tuplets-using-only-one--times-command.texidoc +Documentation/it/texidocs/entering-several-tuplets-using-only-one--tuplet-command.texidoc Documentation/it/texidocs/extending-glissandi-across-repeats.texidoc Documentation/it/texidocs/flat-flags-and-beam-nibs.texidoc Documentation/it/texidocs/forcing-horizontal-shift-of-notes.texidoc +Documentation/it/texidocs/formatting-lyrics-syllables.texidoc Documentation/it/texidocs/grid-lines--changing-their-appearance.texidoc Documentation/it/texidocs/guitar-strum-rhythms.texidoc Documentation/it/texidocs/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.texidoc Documentation/it/texidocs/hiding-the-extender-line-for-text-dynamics.texidoc Documentation/it/texidocs/hymn-template.texidoc +Documentation/it/texidocs/incipit.texidoc Documentation/it/texidocs/inserting-a-caesura.texidoc Documentation/it/texidocs/isolated-percent-repeats.texidoc Documentation/it/texidocs/jazz-combo-template.texidoc +Documentation/it/texidocs/lyrics-alignment.texidoc +Documentation/it/texidocs/makam-example.texidoc Documentation/it/texidocs/making-glissandi-breakable.texidoc Documentation/it/texidocs/making-slurs-with-complex-dash-structure.texidoc Documentation/it/texidocs/making-some-staff-lines-thicker-than-the-others.texidoc Documentation/it/texidocs/mensurstriche-layout-bar-lines-between-the-staves.texidoc Documentation/it/texidocs/modifying-default-values-for-articulation-shorthand-notation.texidoc +Documentation/it/texidocs/modifying-the-ottava-spanner-slope.texidoc Documentation/it/texidocs/multi-measure-rest-markup.texidoc Documentation/it/texidocs/nesting-staves.texidoc Documentation/it/texidocs/non-default-tuplet-numbers.texidoc Documentation/it/texidocs/non-traditional-key-signatures.texidoc Documentation/it/texidocs/numbers-as-easy-note-heads.texidoc +Documentation/it/texidocs/obtaining-2.12-lyrics-spacing-in-newer-versions.texidoc Documentation/it/texidocs/orchestra,-choir-and-piano-template.texidoc Documentation/it/texidocs/ottava-text.texidoc Documentation/it/texidocs/partcombine-and-autobeamoff.texidoc @@ -1201,9 +1243,9 @@ Documentation/it/texidocs/positioning-multi-measure-rests.texidoc Documentation/it/texidocs/positioning-text-markups-inside-slurs.texidoc Documentation/it/texidocs/preventing-extra-naturals-from-being-automatically-added.texidoc Documentation/it/texidocs/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.texidoc -Documentation/it/texidocs/printing-a-repeat-sign-at-the-beginning-of-a-piece.texidoc Documentation/it/texidocs/printing-bar-numbers-at-regular-intervals.texidoc Documentation/it/texidocs/printing-bar-numbers-inside-boxes-or-circles.texidoc +Documentation/it/texidocs/printing-bar-numbers-with-changing-regular-intervals.texidoc Documentation/it/texidocs/printing-hairpins-in-various-styles.texidoc Documentation/it/texidocs/printing-hairpins-using-al-niente-notation.texidoc Documentation/it/texidocs/printing-marks-at-the-end-of-a-line.texidoc @@ -1213,12 +1255,14 @@ Documentation/it/texidocs/printing-the-bar-number-for-the-first-measure.texidoc Documentation/it/texidocs/redefining-grace-note-global-defaults.texidoc Documentation/it/texidocs/removing-bar-numbers-from-a-score.texidoc Documentation/it/texidocs/removing-the-first-empty-line.texidoc +Documentation/it/texidocs/replacing-default-midi-instrument-equalization.texidoc Documentation/it/texidocs/rest-styles.texidoc Documentation/it/texidocs/satb-choir-template---four-staves.texidoc Documentation/it/texidocs/setting-hairpin-behavior-at-bar-lines.texidoc Documentation/it/texidocs/setting-the-double-repeat-default-for-volte.texidoc Documentation/it/texidocs/setting-the-minimum-length-of-hairpins.texidoc Documentation/it/texidocs/shortening-volta-brackets.texidoc +Documentation/it/texidocs/simple-lead-sheet.texidoc Documentation/it/texidocs/single-staff-template-with-notes,-lyrics,-and-chords.texidoc Documentation/it/texidocs/single-staff-template-with-notes-and-chords.texidoc Documentation/it/texidocs/single-staff-template-with-notes-and-lyrics.texidoc @@ -1234,6 +1278,8 @@ Documentation/it/texidocs/tweaking-clef-properties.texidoc Documentation/it/texidocs/tweaking-grace-layout-within-music.texidoc Documentation/it/texidocs/use-square-bracket-at-the-start-of-a-staff-group.texidoc Documentation/it/texidocs/using-a-tick-as-the-breath-mark-symbol.texidoc +Documentation/it/texidocs/using-an-extra-voice-for-breaks.texidoc +Documentation/it/texidocs/using-arpeggiobracket-to-make-divisi-more-visible.texidoc Documentation/it/texidocs/using-double-slurs-for-legato-chords.texidoc Documentation/it/texidocs/using-grace-note-slashes-with-normal-heads.texidoc Documentation/it/texidocs/using-ties-with-arpeggios.texidoc @@ -1324,12 +1370,14 @@ Documentation/learning/tweaks.itely Documentation/lily-bib.bst Documentation/lily_index_search.php Documentation/lily_search.js +Documentation/lilypond-texi2html-lang.init Documentation/lilypond-texi2html.init Documentation/logo/GNUmakefile Documentation/logo/lelie-logo.xpm Documentation/logo/lilypond.xpm Documentation/logo/ly.xpm Documentation/ly-examples/GNUmakefile +Documentation/ly-examples/Stockhausen_Klavierstueck2.ly Documentation/ly-examples/ancient-headword.ly Documentation/ly-examples/aucun-snippet.ly Documentation/ly-examples/bach-bwv610.ly @@ -1460,7 +1508,8 @@ Documentation/pictures/PDFRead.png Documentation/pictures/SaveAs.png Documentation/pictures/VTlogo_ITF.png Documentation/pictures/architecture-diagram.png -Documentation/pictures/background-image.png +Documentation/pictures/background-top-left.png +Documentation/pictures/background-top-right.png Documentation/pictures/baer-flat-bw.png Documentation/pictures/baer-flat-gray.png Documentation/pictures/baer-ledger.png @@ -1486,18 +1535,10 @@ Documentation/pictures/bwv861mm33-34-annotate.png Documentation/pictures/bwv861mm33-34-annotate.svg Documentation/pictures/bwv861mm33-34.png Documentation/pictures/carter-brey.jpg -Documentation/pictures/color1-active.png Documentation/pictures/color1-bg.png -Documentation/pictures/color1-hover.png -Documentation/pictures/color2-active.png Documentation/pictures/color2-bg.png -Documentation/pictures/color2-hover.png -Documentation/pictures/color3-active.png Documentation/pictures/color3-bg.png -Documentation/pictures/color3-hover.png -Documentation/pictures/color4-active.png Documentation/pictures/color4-bg.png -Documentation/pictures/color4-hover.png Documentation/pictures/context-example.eps Documentation/pictures/darius-blasband.jpg Documentation/pictures/directions-updown.png @@ -1530,9 +1571,7 @@ Documentation/pictures/henle-suite1-line.png Documentation/pictures/lao_banner_06_on_white_demo.png Documentation/pictures/lelie.png Documentation/pictures/lily-flat-bw.png -Documentation/pictures/lily-home-nav-active.png -Documentation/pictures/lily-home-nav-bg.png -Documentation/pictures/lily-home-nav-hover.png +Documentation/pictures/lily-home-32x32.png Documentation/pictures/lily-home.png Documentation/pictures/lily-ledger.png Documentation/pictures/lily14-sarabande-annotated-hires.png @@ -1562,12 +1601,12 @@ Documentation/pictures/morgenlied-crop-2.png Documentation/pictures/morgenlied-ly-crop2.png Documentation/pictures/naive-notation-uml.png Documentation/pictures/naive-notation.png -Documentation/pictures/nav-active-2.png -Documentation/pictures/nav-active.png -Documentation/pictures/nav-bg-2.png -Documentation/pictures/nav-bg.png -Documentation/pictures/nav-hover-2.png -Documentation/pictures/nav-hover.png +Documentation/pictures/nav1-active.png +Documentation/pictures/nav1-bg.png +Documentation/pictures/nav1-hover.png +Documentation/pictures/nav2-active.png +Documentation/pictures/nav2-bg.png +Documentation/pictures/nav2-hover.png Documentation/pictures/nereid-shot-small.png Documentation/pictures/nereid-shot.png Documentation/pictures/nestedboxes.png @@ -1602,9 +1641,8 @@ Documentation/pictures/slur-esthetics-annotate-3.png Documentation/pictures/slur-esthetics.png Documentation/pictures/spacing-no-corr.png Documentation/pictures/spacing-with-corr.png -Documentation/pictures/squiggle.jpg Documentation/pictures/stone-distance.png -Documentation/pictures/summary-gradient.png +Documentation/pictures/text-input-1-annotate-ca.png Documentation/pictures/text-input-1-annotate-de.png Documentation/pictures/text-input-1-annotate-de.svg Documentation/pictures/text-input-1-annotate-es.png @@ -1619,6 +1657,7 @@ Documentation/pictures/text-input-1-annotate-nl.png Documentation/pictures/text-input-1-annotate.png Documentation/pictures/text-input-1-annotate.svg Documentation/pictures/text-input-1-output.png +Documentation/pictures/text-input-2-annotate-ca.png Documentation/pictures/text-input-2-annotate-de.png Documentation/pictures/text-input-2-annotate-de.svg Documentation/pictures/text-input-2-annotate-es.png @@ -1633,6 +1672,7 @@ Documentation/pictures/text-input-2-annotate-nl.png Documentation/pictures/text-input-2-annotate.png Documentation/pictures/text-input-2-annotate.svg Documentation/pictures/text-input-2-output.png +Documentation/pictures/text-input-parts-both-annotate-ca.png Documentation/pictures/text-input-parts-both-annotate-de.png Documentation/pictures/text-input-parts-both-annotate-de.svg Documentation/pictures/text-input-parts-both-annotate-es.png @@ -1646,6 +1686,7 @@ Documentation/pictures/text-input-parts-both-annotate-it.svg Documentation/pictures/text-input-parts-both-annotate-nl.png Documentation/pictures/text-input-parts-both-annotate.png Documentation/pictures/text-input-parts-both-annotate.svg +Documentation/pictures/text-input-parts-single-annotate-ca.png Documentation/pictures/text-input-parts-single-annotate-de.png Documentation/pictures/text-input-parts-single-annotate-de.svg Documentation/pictures/text-input-parts-single-annotate-es.png @@ -1660,6 +1701,7 @@ Documentation/pictures/text-input-parts-single-annotate-nl.png Documentation/pictures/text-input-parts-single-annotate.png Documentation/pictures/text-input-parts-single-annotate.svg Documentation/pictures/text-input-parts-single-output.png +Documentation/pictures/text-input-pop-annotate-ca.png Documentation/pictures/text-input-pop-annotate-de.png Documentation/pictures/text-input-pop-annotate-de.svg Documentation/pictures/text-input-pop-annotate-es.png @@ -1674,6 +1716,7 @@ Documentation/pictures/text-input-pop-annotate-nl.png Documentation/pictures/text-input-pop-annotate.png Documentation/pictures/text-input-pop-annotate.svg Documentation/pictures/text-input-pop-output.png +Documentation/pictures/text-input-score-annotate-ca.png Documentation/pictures/text-input-score-annotate-de.png Documentation/pictures/text-input-score-annotate-de.svg Documentation/pictures/text-input-score-annotate-es.png @@ -1691,6 +1734,7 @@ Documentation/pictures/text-input-score-output.png Documentation/pictures/thickness-tweaks.png Documentation/pictures/ties-scoring-example.png Documentation/po/GNUmakefile +Documentation/po/ca.po Documentation/po/cs.po Documentation/po/de.po Documentation/po/es.po @@ -1706,7 +1750,7 @@ Documentation/search-box.ihtml Documentation/snippets.tely Documentation/snippets/README Documentation/snippets/accordion-discant-symbols.ly -Documentation/snippets/accordion-registers.ly +Documentation/snippets/accordion-register-symbols.ly Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly Documentation/snippets/adding-ambitus-per-voice.ly Documentation/snippets/adding-an-extra-staff-at-a-line-break.ly @@ -1720,6 +1764,7 @@ Documentation/snippets/adding-fingerings-to-a-score.ly Documentation/snippets/adding-fingerings-to-tablatures.ly Documentation/snippets/adding-indicators-to-staves-which-get-split-after-a-break.ly Documentation/snippets/adding-links-to-objects.ly +Documentation/snippets/adding-markups-in-a-tablature.ly Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly Documentation/snippets/adding-parentheses-around-an-expressive-mark-or-chordal-note.ly Documentation/snippets/adding-the-current-date-to-a-score.ly @@ -1744,21 +1789,20 @@ Documentation/snippets/ancient-fonts.ly Documentation/snippets/ancient-headword.ly Documentation/snippets/ancient-notation-intro.itely Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly -Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly Documentation/snippets/ancient-notation.snippet-list Documentation/snippets/ancient-time-signatures.ly Documentation/snippets/anglican-psalm-template.ly Documentation/snippets/applying-note-head-styles-depending-on-the-step-of-the-scale.ly Documentation/snippets/arabic-improvisation.ly +Documentation/snippets/arranging-separate-lyrics-on-a-single-line.ly Documentation/snippets/asymmetric-slurs.ly Documentation/snippets/automatic-beam-subdivisions.ly Documentation/snippets/automatic-notation.snippet-list Documentation/snippets/automatically-change-durations.ly Documentation/snippets/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.ly Documentation/snippets/avoiding-collisions-with-chord-fingerings.ly -Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly +Documentation/snippets/bar-chords-notation-for-guitar-with-text-spanner.ly Documentation/snippets/beam-endings-in-score-context.ly -Documentation/snippets/beam-grouping-in-7-8-time.ly Documentation/snippets/beams-across-line-breaks.ly Documentation/snippets/blanking-staff-lines-using-the--whiteout-command.ly Documentation/snippets/book-parts.ly @@ -1768,14 +1812,15 @@ Documentation/snippets/broken-crescendo-hairpin.ly Documentation/snippets/caesura-railtracks-with-fermata.ly Documentation/snippets/center-text-below-hairpin-dynamics.ly Documentation/snippets/centered-measure-numbers.ly -Documentation/snippets/centering-markup-on-note-heads-automatically.ly Documentation/snippets/changing--flageolet-mark-size.ly Documentation/snippets/changing-a-single-notes-size-in-a-chord.ly Documentation/snippets/changing-beam-knee-gap.ly +Documentation/snippets/changing-beam-thickness-and-spacing.ly Documentation/snippets/changing-chord-separator.ly Documentation/snippets/changing-form-of-multi-measure-rests.ly Documentation/snippets/changing-fret-orientations.ly Documentation/snippets/changing-midi-output-to-one-channel-per-voice.ly +Documentation/snippets/changing-ottava-text.ly Documentation/snippets/changing-partcombine-texts.ly Documentation/snippets/changing-properties-for-individual-grobs.ly Documentation/snippets/changing-stanza-fonts.ly @@ -1784,6 +1829,7 @@ Documentation/snippets/changing-the-ambitus-gap.ly Documentation/snippets/changing-the-appearance-of-a-slur-from-solid-to-dotted-or-dashed.ly Documentation/snippets/changing-the-breath-mark-symbol.ly Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly +Documentation/snippets/changing-the-default-bar-lines.ly Documentation/snippets/changing-the-default-text-font-family.ly Documentation/snippets/changing-the-interval-of-lines-on-the-stave.ly Documentation/snippets/changing-the-number-of-augmentation-dots-per-note.ly @@ -1821,13 +1867,14 @@ Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly Documentation/snippets/controlling-the-placement-of-chord-fingerings.ly Documentation/snippets/controlling-the-vertical-ordering-of-scripts.ly Documentation/snippets/controlling-tuplet-bracket-visibility.ly -Documentation/snippets/correction-wanted.snippet-list Documentation/snippets/creating-a-delayed-turn.ly Documentation/snippets/creating-a-sequence-of-notes-on-various-pitches.ly Documentation/snippets/creating-arpeggios-across-notes-in-different-voices.ly Documentation/snippets/creating-blank-staves.ly Documentation/snippets/creating-cross-staff-arpeggios-in-a-piano-staff.ly Documentation/snippets/creating-cross-staff-arpeggios-in-other-contexts.ly +Documentation/snippets/creating-custom-dynamics-in-midi-output.ly +Documentation/snippets/creating-custom-key-signatures.ly Documentation/snippets/creating-double-digit-fingerings.ly Documentation/snippets/creating-metronome-marks-in-markup-mode.ly Documentation/snippets/creating-real-parenthesized-dynamics.ly @@ -1838,8 +1885,10 @@ Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly Documentation/snippets/cross-staff-stems.ly Documentation/snippets/cross-staff-tremolos.ly Documentation/snippets/custodes.ly +Documentation/snippets/customize-drumpitchnames,-drumstyletable-and-drumpitchtable-in-layout-and-midi.ly Documentation/snippets/customizing-fretboard-fret-diagrams.ly Documentation/snippets/customizing-markup-fret-diagrams.ly +Documentation/snippets/customizing-the-position-and-number-of-dots-in-repeat-sign-bar-lines.ly Documentation/snippets/default-direction-of-stems-on-the-center-line-of-the-staff.ly Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly @@ -1864,10 +1913,11 @@ Documentation/snippets/embedding-native-postscript-in-a--markup-block.ly Documentation/snippets/engravers-one-by-one.ly Documentation/snippets/engraving-ties-manually.ly Documentation/snippets/engraving-tremolos-with-floating-beams.ly -Documentation/snippets/entering-several-tuplets-using-only-one--times-command.ly +Documentation/snippets/entering-several-tuplets-using-only-one--tuplet-command.ly Documentation/snippets/expressive-headword.ly Documentation/snippets/expressive-marks-intro.itely Documentation/snippets/expressive-marks.snippet-list +Documentation/snippets/extending-a-trillspanner.ly Documentation/snippets/extending-glissandi-across-repeats.ly Documentation/snippets/faking-a-hammer-in-tablatures.ly Documentation/snippets/figured-bass-headword.ly @@ -1876,6 +1926,7 @@ Documentation/snippets/fingering-symbols-for-wind-instruments.ly Documentation/snippets/fingerings,-string-indications,-and-right-hand-fingerings.ly Documentation/snippets/flamenco-notation.ly Documentation/snippets/flat-flags-and-beam-nibs.ly +Documentation/snippets/flat-ties.ly Documentation/snippets/flute-slap-notation.ly Documentation/snippets/forcing-a-clef-symbol-to-be-displayed.ly Documentation/snippets/forcing-horizontal-shift-of-notes.ly @@ -1923,6 +1974,7 @@ Documentation/snippets/keyboard-headword.ly Documentation/snippets/keyboards-intro.itely Documentation/snippets/keyboards.snippet-list Documentation/snippets/laissez-vibrer-ties.ly +Documentation/snippets/let-tabstaff-print-the-topmost-string-at-bottom.ly Documentation/snippets/letter-tablature-formatting.ly Documentation/snippets/line-arrows.ly Documentation/snippets/lyrics-alignment.ly @@ -1941,75 +1993,36 @@ Documentation/snippets/merging-multi-measure-rests-in-a-polyphonic-part.ly Documentation/snippets/midi-intro.itely Documentation/snippets/midi.snippet-list Documentation/snippets/modifying-default-values-for-articulation-shorthand-notation.ly +Documentation/snippets/modifying-the-ottava-spanner-slope.ly Documentation/snippets/modifying-tuplet-bracket-length.ly Documentation/snippets/moving-dotted-notes-in-polyphony.ly Documentation/snippets/moving-slur-positions-vertically.ly Documentation/snippets/multi-measure-rest-markup.ly Documentation/snippets/nesting-staves.ly Documentation/snippets/new/README -Documentation/snippets/new/accordion-discant-symbols.ly -Documentation/snippets/new/accordion-registers.ly -Documentation/snippets/new/adding-a-figured-bass-above-or-below-the-notes.ly -Documentation/snippets/new/adding-extra-fingering-with-scheme.ly -Documentation/snippets/new/adding-orchestral-cues-to-a-vocal-score.ly -Documentation/snippets/new/adding-timing-marks-to-long-glissandi.ly -Documentation/snippets/new/alternative-bar-numbering.ly -Documentation/snippets/new/ancient-fonts.ly -Documentation/snippets/new/ancient-notation-template----modern-transcription-of-gregorian-music.ly -Documentation/snippets/new/bar-chords-notation-for-guitar--with-text-spanner.ly -Documentation/snippets/new/broken-crescendo-hairpin.ly -Documentation/snippets/new/centered-measure-numbers.ly -Documentation/snippets/new/centering-markup-on-note-heads-automatically.ly -Documentation/snippets/new/changing-the-tuplet-number.ly -Documentation/snippets/new/changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly -Documentation/snippets/new/chant-or-psalms-notation.ly -Documentation/snippets/new/chords-headword.ly -Documentation/snippets/new/compound-time-signatures.ly -Documentation/snippets/new/conducting-signs,-measure-grouping-signs.ly -Documentation/snippets/new/creating-a-delayed-turn.ly +Documentation/snippets/new/changing-form-of-multi-measure-rests.ly +Documentation/snippets/new/changing-properties-for-individual-grobs.ly Documentation/snippets/new/creating-a-sequence-of-notes-on-various-pitches.ly -Documentation/snippets/new/creating-double-digit-fingerings.ly -Documentation/snippets/new/creating-real-parenthesized-dynamics.ly -Documentation/snippets/new/cross-staff-stems.ly Documentation/snippets/new/defining-an-engraver-in-scheme--ambitus-engraver.ly -Documentation/snippets/new/entering-several-tuplets-using-only-one--times-command.ly -Documentation/snippets/new/expressive-headword.ly -Documentation/snippets/new/extending-glissandi-across-repeats.ly -Documentation/snippets/new/fretted-headword.ly -Documentation/snippets/new/generating-custom-flags.ly -Documentation/snippets/new/glissandi-can-skip-grobs.ly -Documentation/snippets/new/guitar-slides.ly -Documentation/snippets/new/hammer-on-and-pull-off-using-chords.ly -Documentation/snippets/new/hammer-on-and-pull-off-using-voices.ly -Documentation/snippets/new/hammer-on-and-pull-off.ly -Documentation/snippets/new/heavily-customized-polymetric-time-signatures.ly -Documentation/snippets/new/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly -Documentation/snippets/new/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-1.ly +Documentation/snippets/new/flat-flags-and-beam-nibs.ly +Documentation/snippets/new/flute-slap-notation.ly +Documentation/snippets/new/forcing-measure-width-to-adapt-to-metronomemarks-width.ly Documentation/snippets/new/incipit.ly -Documentation/snippets/new/inserting-score-fragments-above-a-staff,-as-markups.ly -Documentation/snippets/new/jazz-combo-template.ly -Documentation/snippets/new/keyboard-headword.ly Documentation/snippets/new/making-an-object-invisible-with-the-transparent-property.ly -Documentation/snippets/new/making-glissandi-breakable.ly -Documentation/snippets/new/merging-multi-measure-rests-in-a-polyphonic-part.ly -Documentation/snippets/new/numbering-groups-of-measures.ly -Documentation/snippets/new/numbers-as-easy-note-heads.ly -Documentation/snippets/new/pitches-headword.ly +Documentation/snippets/new/modifying-tuplet-bracket-length.ly +Documentation/snippets/new/multi-measure-rest-markup.ly +Documentation/snippets/new/non-traditional-key-signatures.ly Documentation/snippets/new/positioning-multi-measure-rests.ly -Documentation/snippets/new/printing-a-repeat-sign-at-the-beginning-of-a-piece.ly -Documentation/snippets/new/printing-hairpins-in-various-styles.ly -Documentation/snippets/new/quoting-another-voice-with-transposition.ly -Documentation/snippets/new/redefining-grace-note-global-defaults.ly -Documentation/snippets/new/score-for-diatonic-accordion.ly +Documentation/snippets/new/replacing-default-midi-instrument-equalization.ly +Documentation/snippets/new/rest-styles.ly +Documentation/snippets/new/single-staff-template-with-notes-and-chords.ly Documentation/snippets/new/staff-headword.ly -Documentation/snippets/new/strict-beat-beaming.ly -Documentation/snippets/new/string-number-extender-lines.ly +Documentation/snippets/new/subdividing-beams.ly Documentation/snippets/new/unfretted-headword.ly -Documentation/snippets/new/using-a-tick-as-the-breath-mark-symbol.ly -Documentation/snippets/new/using-alternative-flag-styles.ly -Documentation/snippets/new/using-grace-note-slashes-with-normal-heads.ly -Documentation/snippets/new/vertically-aligned-dynamics-and-textscripts.ly -Documentation/snippets/new/woodwind-diagrams-key-lists.ly +Documentation/snippets/new/user-defined-time-signatures.ly +Documentation/snippets/new/using-the-whiteout-property.ly +Documentation/snippets/new/utf-8.ly +Documentation/snippets/new/wind-headword.ly Documentation/snippets/non-default-tuplet-numbers.ly Documentation/snippets/non-traditional-key-signatures.ly Documentation/snippets/numbering-groups-of-measures.ly @@ -2049,9 +2062,9 @@ Documentation/snippets/preparing-parts.snippet-list Documentation/snippets/preventing-extra-naturals-from-being-automatically-added.ly Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly Documentation/snippets/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.ly -Documentation/snippets/printing-a-repeat-sign-at-the-beginning-of-a-piece.ly Documentation/snippets/printing-bar-numbers-at-regular-intervals.ly Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly +Documentation/snippets/printing-bar-numbers-with-changing-regular-intervals.ly Documentation/snippets/printing-hairpins-in-various-styles.ly Documentation/snippets/printing-hairpins-using-al-niente-notation.ly Documentation/snippets/printing-marks-at-the-end-of-a-line.ly @@ -2071,11 +2084,13 @@ Documentation/snippets/really-simple.snippet-list Documentation/snippets/recorder-fingering-chart.ly Documentation/snippets/redefining-grace-note-global-defaults.ly Documentation/snippets/removing-bar-numbers-from-a-score.ly +Documentation/snippets/removing-brace-on-first-line-of-piano-score.ly Documentation/snippets/removing-connecting-bar-lines-on-staffgroup,-pianostaff,-or-grandstaff.ly Documentation/snippets/removing-the-first-empty-line.ly Documentation/snippets/repeats-headword.ly Documentation/snippets/repeats-intro.itely Documentation/snippets/repeats.snippet-list +Documentation/snippets/replacing-default-midi-instrument-equalization.ly Documentation/snippets/rest-styles.ly Documentation/snippets/reverting-default-beam-endings.ly Documentation/snippets/rhythmic-slashes.ly @@ -2138,24 +2153,28 @@ Documentation/snippets/time-signature-in-parentheses.ly Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly Documentation/snippets/titles-intro.itely Documentation/snippets/titles.snippet-list -Documentation/snippets/transcription-of-ancient-music-with-incipit.ly Documentation/snippets/transposing-pitches-with-minimum-accidentals-smart-transpose.ly +Documentation/snippets/tuplet-bracket-and-change-staff.ly Documentation/snippets/tweaking-clef-properties.ly Documentation/snippets/tweaking-grace-layout-within-music.ly Documentation/snippets/tweaks-and-overrides-intro.itely Documentation/snippets/tweaks-and-overrides.snippet-list +Documentation/snippets/two--partcombine-pairs-on-one-staff.ly Documentation/snippets/unfretted-headword.ly Documentation/snippets/unfretted-strings-intro.itely Documentation/snippets/unfretted-strings.snippet-list Documentation/snippets/use-square-bracket-at-the-start-of-a-staff-group.ly +Documentation/snippets/user-defined-time-signatures.ly Documentation/snippets/using-a-tick-as-the-breath-mark-symbol.ly Documentation/snippets/using-alternative-flag-styles.ly +Documentation/snippets/using-an-extra-voice-for-breaks.ly Documentation/snippets/using-arpeggiobracket-to-make-divisi-more-visible.ly Documentation/snippets/using-autochange-with-more-than-one-voice.ly Documentation/snippets/using-double-slurs-for-legato-chords.ly Documentation/snippets/using-grace-note-slashes-with-normal-heads.ly Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly +Documentation/snippets/using-tags-to-produce-mensural-and-modern-music-from-the-same-source.ly Documentation/snippets/using-the--tweak-command-to-tweak-individual-grobs.ly Documentation/snippets/using-the-whiteout-property.ly Documentation/snippets/using-ties-with-arpeggios.ly @@ -2341,6 +2360,8 @@ input/regression/accidental-voice.ly input/regression/accidental.ly input/regression/add-grace-property.ly input/regression/add-stem-support.ly +input/regression/addlyrics-existing-context.ly +input/regression/addlyrics-to-staff-context.ly input/regression/alignment-order.ly input/regression/alignment-vertical-manual-setting.ly input/regression/allfontstyle.ily @@ -2381,6 +2402,11 @@ input/regression/autobeam-3-4-rules.ly input/regression/autobeam-nobeam.ly input/regression/autobeam-show-defaults.ly input/regression/autobeam-tuplet-recheck.ly +input/regression/autochange-clefs.ly +input/regression/autochange-inside-grace.ly +input/regression/autochange-relative.ly +input/regression/autochange-turning-pitch.ly +input/regression/autochange-with-grace.ly input/regression/automatic-polyphony-context-id.ly input/regression/automatic-polyphony-drumstaff.ly input/regression/automatic-polyphony-tabstaff.ly @@ -2395,6 +2421,7 @@ input/regression/bar-line-define-bar-line.ly input/regression/bar-line-segno.ly input/regression/bar-lines.ly input/regression/bar-number-check-warning.ly +input/regression/bar-number-check.ly input/regression/bar-number-visibility.ly input/regression/bar-number-volta-repeat.ly input/regression/bar-number.ly @@ -2464,7 +2491,11 @@ input/regression/beam-shortened-lengths.ly input/regression/beam-single-stem.ly input/regression/beam-skip.ly input/regression/beam-slope-stemlet.ly +input/regression/beam-subdivide-quarter-notes.ly +input/regression/beam-subdivide-shortened-beam.ly +input/regression/beam-subdivide-trailing-stem.ly input/regression/beam-subdivide-tuplets.ly +input/regression/beam-subdivision.ly input/regression/beam-unconnected-beamlets.ly input/regression/beaming-ternary-metrum.ly input/regression/beaming-tuplet-regular.ly @@ -2473,6 +2504,7 @@ input/regression/beamlet-point-toward-beat.ly input/regression/beamlet-test.ly input/regression/beams.ly input/regression/bend-after.ly +input/regression/bend-bound.ly input/regression/bend-dot.ly input/regression/bom-mark.ly input/regression/book-identifier-markup.ly @@ -2489,7 +2521,9 @@ input/regression/breve-extent.ly input/regression/cadenza-grace-autobeam.ly input/regression/center-title.ly input/regression/chord-additional-pitch-prefix.ly +input/regression/chord-changes-alternative.ly input/regression/chord-changes.ly +input/regression/chord-dots.ly input/regression/chord-name-entry-11.ly input/regression/chord-name-entry.ly input/regression/chord-name-exceptions.ly @@ -2500,6 +2534,7 @@ input/regression/chord-names-bass.ly input/regression/chord-names-in-grand-staff.ly input/regression/chord-names-languages.ly input/regression/chord-names-lower-case-minor.ly +input/regression/chord-repetition-accidentals.ly input/regression/chord-repetition-relative.ly input/regression/chord-repetition-script-stack.ly input/regression/chord-repetition-times.ly @@ -2532,7 +2567,6 @@ input/regression/cluster-single-note.ly input/regression/cluster-style.ly input/regression/cluster.ly input/regression/collision-2.ly -input/regression/collision-alignment.ly input/regression/collision-dots-invert.ly input/regression/collision-dots-move.ly input/regression/collision-dots-up-space-dotted.ly @@ -2561,6 +2595,7 @@ input/regression/completion-heads-unit.ly input/regression/completion-heads.ly input/regression/completion-rest.ly input/regression/complex-once.ly +input/regression/compound-time-signature-style.ly input/regression/compound-time-signatures.ly input/regression/context-die-staff.ly input/regression/context-mod-context.ly @@ -2580,6 +2615,7 @@ input/regression/custos.ly input/regression/dead-notes.ly input/regression/define-event-function.ly input/regression/display-lily-tests.ly +input/regression/divisi-staves.ly input/regression/dot-column-engraver.ly input/regression/dot-column-note-collision.ly input/regression/dot-column-rest-collision.ly @@ -2602,7 +2638,6 @@ input/regression/dynamics-alignment-breaker.ly input/regression/dynamics-alignment-no-line-linebreak.ly input/regression/dynamics-alignment-no-line.ly input/regression/dynamics-avoid-cross-staff-stem-3.ly -input/regression/dynamics-avoid-cross-staff-stem.ly input/regression/dynamics-broken-hairpin.ly input/regression/dynamics-context-textspan.ly input/regression/dynamics-custom-text-spanner-postfix.ly @@ -2656,6 +2691,7 @@ input/regression/flags-default.ly input/regression/flags-in-scheme.ly input/regression/flags-straight-stockhausen-boulez.ly input/regression/flags-straight.ly +input/regression/flip-stencil.ly input/regression/follow-voice-break.ly input/regression/follow-voice-consecutive.ly input/regression/font-bogus-ligature.ly @@ -2685,6 +2721,7 @@ input/regression/fret-diagrams-string-frets.ly input/regression/fret-diagrams-string-thickness.ly input/regression/fret-diagrams-xo-label.ly input/regression/fretboard-chordchanges.ly +input/regression/fretdiagram-markup-in-dots.ly input/regression/full-measure-rest-fermata.ly input/regression/general-scheme-bindings.ly input/regression/generic-output-property.ly @@ -2696,6 +2733,7 @@ input/regression/glissando-chord-linebreak.ly input/regression/glissando-chord.ly input/regression/glissando-consecutive.ly input/regression/glissando-cross-staff.ly +input/regression/glissando-dots.ly input/regression/glissando-index.ly input/regression/glissando-no-break.ly input/regression/glissando-skip.ly @@ -2742,6 +2780,7 @@ input/regression/hairpin-span-bar.ly input/regression/hairpin-to-barline-mark.ly input/regression/hairpin-to-barline.ly input/regression/hairpin-to-rest.ly +input/regression/halfopenvertical.ly input/regression/hara-kiri-alive-with.ly input/regression/hara-kiri-drumstaff.ly input/regression/hara-kiri-keep-previous-settings.ly @@ -2764,6 +2803,7 @@ input/regression/horizontal-bracket-break.ly input/regression/horizontal-bracket-tweak.ly input/regression/horizontal-bracket.ly input/regression/id.ly +input/regression/identifier-alists.ly input/regression/identifier-following-chordmode.ly input/regression/identifier-quoted.ly input/regression/identifiers.ly @@ -2771,6 +2811,8 @@ input/regression/in-note.ly input/regression/incipit.ly input/regression/include-string.ly input/regression/incompatible-stem-warning.ly +input/regression/inherit-acceptability.ly +input/regression/input-order-alignment.ly input/regression/instrument-cue-name.ly input/regression/instrument-name-dynamic.ly input/regression/instrument-name-groups.ly @@ -2800,10 +2842,12 @@ input/regression/laissez-vibrer-tie-head-direction.ly input/regression/laissez-vibrer-ties.ly input/regression/landscape.ly input/regression/layout-from.ly +input/regression/ledger-extra.ly input/regression/ledger-line-minimum.ly input/regression/ledger-line-shorten.ly input/regression/ledger-lines-dynamics.ly input/regression/ledger-lines-varying-staves.ly +input/regression/ledger-positions-customization.ly input/regression/les-nereides.ly input/regression/ligature-bracket.ly input/regression/lily-in-scheme.ly @@ -2828,6 +2872,7 @@ input/regression/lilypond-book/include/example.ly input/regression/lilypond-book/include/myvar.ily input/regression/lilypond-book/include2.ly input/regression/lilypond-book/include3.ily +input/regression/lilypond-book/melody.ly input/regression/lilypond-book/suffix-html.html input/regression/lilypond-book/suffix-htmly.htmly input/regression/lilypond-book/suffix-itely.itely @@ -2877,6 +2922,7 @@ input/regression/loglevels.ly input/regression/lyric-combine-derived-voice.ly input/regression/lyric-combine-empty-warning.ly input/regression/lyric-combine-new.ly +input/regression/lyric-combine-nullvoice.ly input/regression/lyric-combine-polyphonic.ly input/regression/lyric-combine-switch-voice-2.ly input/regression/lyric-combine-switch-voice.ly @@ -2910,6 +2956,21 @@ input/regression/lyrics-no-notes.ly input/regression/lyrics-pass-under-bar.ly input/regression/lyrics-spanbar.ly input/regression/lyrics-tenor-clef.ly +input/regression/magnifyMusic-dots-beamlets.ly +input/regression/magnifyMusic-laissez-vibrer-ties.ly +input/regression/magnifyMusic-phrasing-slurs.ly +input/regression/magnifyMusic-repeat-ties.ly +input/regression/magnifyMusic-slurs.ly +input/regression/magnifyMusic-stem-beam-spacing.ly +input/regression/magnifyMusic-tablature-double-stems.ly +input/regression/magnifyMusic-text-interface.ly +input/regression/magnifyMusic-ties.ly +input/regression/magnifyStaff-bar-lines.ly +input/regression/magnifyStaff-dots-beamlets.ly +input/regression/magnifyStaff-space-alist.ly +input/regression/magnifyStaff-staff-line-thickness.ly +input/regression/magnifyStaff-tablature-double-stems.ly +input/regression/magnifyStaff-text-interface.ly input/regression/make-relative-copies.ly input/regression/make-relative-music.ly input/regression/make-relative.ly @@ -2923,21 +2984,25 @@ input/regression/markup-braces.ly input/regression/markup-center-align-nocollision.ly input/regression/markup-column-align.ly input/regression/markup-commands.ly +input/regression/markup-compound-meter.ly input/regression/markup-cyclic-reference.ly input/regression/markup-depth-non-terminating.ly input/regression/markup-diacritic-marks.ly input/regression/markup-eps.ly input/regression/markup-eyeglasses.ly +input/regression/markup-first-visible.ly input/regression/markup-frame-text.ly input/regression/markup-line-styles.ly input/regression/markup-line-thickness.ly input/regression/markup-lines-identifier.ly input/regression/markup-lines.ly +input/regression/markup-map.ly input/regression/markup-music-glyph.ly input/regression/markup-note-dot.ly input/regression/markup-note-grob-style.ly input/regression/markup-note-styles.ly input/regression/markup-note.ly +input/regression/markup-partial.ly input/regression/markup-path-fill.ly input/regression/markup-path-linecap.ly input/regression/markup-path-linejoin.ly @@ -2958,6 +3023,7 @@ input/regression/measure-grouping.ly input/regression/mensural-ligatures.ly input/regression/mensural.ly input/regression/metronome-mark-broken-bound.ly +input/regression/metronome-mark-formatter.ly input/regression/metronome-mark-loose-column.ly input/regression/metronome-marking-align-order.ly input/regression/metronome-marking-break-align.ly @@ -2968,6 +3034,7 @@ input/regression/metronome-range.ly input/regression/metronome-text.ly input/regression/midi-drums.ly input/regression/midi-dynamics.ly +input/regression/midi-grace-after-rest.ly input/regression/midi-grace-after-tie.ly input/regression/midi-grace.ly input/regression/midi-key-signature.ly @@ -2983,6 +3050,8 @@ input/regression/midi-tuplets.ly input/regression/midi-unisons.ly input/regression/midi-volume-equaliser.ly input/regression/midi/GNUmakefile +input/regression/midi/crescendo-abutting.ly +input/regression/midi/dynamic-initial.ly input/regression/midi/key-initial.ly input/regression/midi/key-option-all-staves.ly input/regression/midi/key-option.ly @@ -2993,16 +3062,21 @@ input/regression/midi/quantize-duration.ly input/regression/midi/quantize-start.ly input/regression/midi/rest-dynamic.ly input/regression/midi/rest.ly +input/regression/midi/sequence-name-scoping.ly +input/regression/midi/sequence-name.ly input/regression/midi/staff-map-instrument.ly input/regression/midi/staff-map-voice.ly input/regression/midi/voice-2.ly input/regression/midi/voice-4.ly input/regression/midi/voice-5.ly +input/regression/minimum-length-after-break.ly +input/regression/minimum-length-broken-ties.ly input/regression/minimum-length-end-line.ly input/regression/mm-rests2.ly input/regression/modal-transforms.ly input/regression/modern-tab-clef-scaled.ly input/regression/modern-tab-clef.ly +input/regression/monochords.ly input/regression/morgenlied.ly input/regression/mozart-hrn-3.ly input/regression/mozart-hrn3-allegro.ily @@ -3021,7 +3095,9 @@ input/regression/multi-measure-rest-text.ly input/regression/multi-measure-rest-tweaks.ly input/regression/multi-measure-rest.ly input/regression/multiple-time-sig-settings.ly +input/regression/music-function-direct-call.ly input/regression/music-function-end-spanners.ly +input/regression/music-function-incomplete.ly input/regression/music-function-post-event.ly input/regression/music-function-string-markup.ly input/regression/music-function.ly @@ -3195,6 +3271,7 @@ input/regression/no-header.ly input/regression/no-staff.ly input/regression/non-centered-bar-lines.ly input/regression/non-empty-text.ly +input/regression/note-collision-threshold.ly input/regression/note-head-aiken.ly input/regression/note-head-chord.ly input/regression/note-head-funk.ly @@ -3210,9 +3287,12 @@ input/regression/note-head-walker.ly input/regression/note-line.ly input/regression/note-names-context.ly input/regression/note-names.ly +input/regression/notehead-height.ly input/regression/number-staff-lines.ly input/regression/offsets.ly +input/regression/one-line-auto-height-breaking.ly input/regression/one-line-breaking.ly +input/regression/one-staff.ly input/regression/optimal-page-breaking-hstretch.ly input/regression/option-help.ly input/regression/optional-args-backup.ly @@ -3301,27 +3381,41 @@ input/regression/paper-nested-override.ly input/regression/paper-nested-override2.ly input/regression/paper-twosided-bcorr.ly input/regression/paper-twosided.ly +input/regression/parallelmusic-partial.ly +input/regression/parent-alignment-synchronized-with-self-alignment.ly input/regression/parenthesize-markup.ly +input/regression/parenthesize-notes-accidentals.ly input/regression/parenthesize-singlenotes-chords-rests.ly input/regression/parenthesize.ly input/regression/part-combine-3voices.ly input/regression/part-combine-a2.ly +input/regression/part-combine-chord-range.ly input/regression/part-combine-cross.ly input/regression/part-combine-force-mmrest-position.ly input/regression/part-combine-force-once.ly input/regression/part-combine-force.ly input/regression/part-combine-global.ly +input/regression/part-combine-inside-grace.ly input/regression/part-combine-markup.ly +input/regression/part-combine-mmrest-after-apart-silence.ly input/regression/part-combine-mmrest-after-solo.ly input/regression/part-combine-mmrest-apart.ly +input/regression/part-combine-mmrest-shared.ly +input/regression/part-combine-relative.ly +input/regression/part-combine-silence-mixed.ly +input/regression/part-combine-silence.ly input/regression/part-combine-solo-end.ly input/regression/part-combine-solo-global.ly input/regression/part-combine-solo.ly +input/regression/part-combine-strings.ly input/regression/part-combine-text-wait.ly input/regression/part-combine-text.ly input/regression/part-combine-tuplet-end.ly input/regression/part-combine-tuplet-single.ly +input/regression/part-combine-unequal-lengths.ly +input/regression/part-combine-with-grace.ly input/regression/part-combine.ly +input/regression/partial-in-mid-piece.ly input/regression/partial-polymetric.ly input/regression/pdfmark-metadata-unicode.ly input/regression/pdfmark-metadata.ly @@ -3370,6 +3464,7 @@ input/regression/rehearsal-mark-final-score.ly input/regression/rehearsal-mark-letter.ly input/regression/rehearsal-mark-number.ly input/regression/relative-repeat.ly +input/regression/relative.ly input/regression/remove-empty-context-mod.ly input/regression/remove-empty-staves-auto-knee.ly input/regression/remove-empty-staves-with-rests.ly @@ -3388,6 +3483,7 @@ input/regression/repeat-sign.ly input/regression/repeat-slash-mixed.ly input/regression/repeat-slash-multi.ly input/regression/repeat-slash.ly +input/regression/repeat-tie-parenthesize.ly input/regression/repeat-tie.ly input/regression/repeat-tremolo-beams.ly input/regression/repeat-tremolo-chord-rep.ly @@ -3416,23 +3512,32 @@ input/regression/rest-polyphonic-2.ly input/regression/rest-polyphonic.ly input/regression/rest-positioning.ly input/regression/rest.ly +input/regression/revert-once.ly +input/regression/rhythmic-sequence.ly input/regression/rhythmic-staff.ly input/regression/safe.ly +input/regression/satb-template-on-two-staves-with-verses.ly +input/regression/satb-template-soprano-and-tenor-may-be-omitted.ly +input/regression/satb-template-with-changed-instrument-names.ly +input/regression/satb-template-with-men-women-and-descant.ly input/regression/scheme-book-scores.ly input/regression/scheme-engraver-instance.ly input/regression/scheme-engraver.ly input/regression/scheme-text-spanner.ly +input/regression/score-lines.ly input/regression/score-text.ly input/regression/script-accidental-collision.ly input/regression/script-center-seconds.ly input/regression/script-collision.ly input/regression/script-horizontal-slur.ly +input/regression/script-shift-staccato.ly input/regression/script-shift.ly input/regression/script-stack-horizontal.ly input/regression/script-stack-order.ly input/regression/script-stacked.ly input/regression/script-stem-tremolo.ly input/regression/script-tie-collision.ly +input/regression/self-alignment-and-parent-alignment.ly input/regression/semi-tie-cross-staff.ly input/regression/semi-tie-manual-direction.ly input/regression/set-once.ly @@ -3566,9 +3671,14 @@ input/regression/spanner-after-line-breaking.ly input/regression/spanner-alignment.ly input/regression/spanner-break-beyond-parent.ly input/regression/spanner-break-overshoot.ly +input/regression/ssaattbb-template-with-all-staves.ly +input/regression/ssaattbb-template-with-all-voices-on-one-staff.ly +input/regression/ssaattbb-template-with-changed-instrument-names.ly +input/regression/ssaattbb-template-with-men-women-and-descant.ly input/regression/staccato-pos.ly input/regression/staff-change-autobeam.ly input/regression/staff-halfway.ly +input/regression/staff-ledger-positions-dotted-notes.ly input/regression/staff-ledger-positions.ly input/regression/staff-line-positions.ly input/regression/staff-mixed-size.ly @@ -3590,11 +3700,13 @@ input/regression/stem-tremolo-note-collision.ly input/regression/stem-tremolo-note-column.ly input/regression/stem-tremolo-position.ly input/regression/stem-tremolo-staff-space.ly +input/regression/stem-tremolo-style.ly input/regression/stem-tremolo.ly input/regression/stencil-color-rotation.ly input/regression/stencil-hacking.ly input/regression/stencil-scale.ly input/regression/string-number-around-slur.ly +input/regression/string-number-styles.ly input/regression/string-number.ly input/regression/system-extents.ly input/regression/system-overstrike.ly @@ -3604,6 +3716,7 @@ input/regression/system-start-bar-collapse-staffspace.ly input/regression/system-start-bracket.ly input/regression/system-start-heavy-bar.ly input/regression/system-start-nesting.ly +input/regression/tablature-additional-bass-strings.ly input/regression/tablature-banjo.ly input/regression/tablature-chord-repetition-finger.ly input/regression/tablature-chord-repetition.ly @@ -3618,6 +3731,7 @@ input/regression/tablature-harmonic-functions.ly input/regression/tablature-harmonic-tie.ly input/regression/tablature-harmonic.ly input/regression/tablature-letter.ly +input/regression/tablature-micro-tone.ly input/regression/tablature-negative-fret.ly input/regression/tablature-open-string-chord.ly input/regression/tablature-open-string-handling.ly @@ -3631,6 +3745,7 @@ input/regression/tablature-tremolo.ly input/regression/tablature-zero-finger.ly input/regression/tablature.ly input/regression/tag-filter.ly +input/regression/tag-group.ly input/regression/tag-multiple.ly input/regression/test-output-distance.ly input/regression/text-script-vertical-skylines.ly @@ -3652,6 +3767,7 @@ input/regression/tie-dash.ly input/regression/tie-direction-broken.ly input/regression/tie-direction-manual.ly input/regression/tie-dot.ly +input/regression/tie-enharmonic.ly input/regression/tie-grace.ly input/regression/tie-manual-vertical-tune.ly input/regression/tie-manual.ly @@ -3662,7 +3778,12 @@ input/regression/tie-single-manual.ly input/regression/tie-single.ly input/regression/tie-unterminated.ly input/regression/tie-whole.ly +input/regression/time-signature-mensural.ly +input/regression/time-signature-midmeasure-warning.ly +input/regression/time-signature-midmeasure.ly +input/regression/time-signature-numbered.ly input/regression/time-signature-settings-by-staff.ly +input/regression/time-signature-single-digit.ly input/regression/to-xml.ly input/regression/toc.ly input/regression/trill-spanner-auto-stop.ly @@ -3688,13 +3809,22 @@ input/regression/tuplet-full-length-extent.ly input/regression/tuplet-full-length-note.ly input/regression/tuplet-full-length.ly input/regression/tuplet-gap.ly +input/regression/tuplet-long-spanner.ly input/regression/tuplet-nest-beam.ly input/regression/tuplet-nest-broken.ly input/regression/tuplet-nest.ly input/regression/tuplet-no-stems.ly +input/regression/tuplet-number-french-kneed-beams.ly +input/regression/tuplet-number-kneed-beam-even-stem-count.ly +input/regression/tuplet-number-kneed-beam-horizontal-fit.ly +input/regression/tuplet-number-kneed-beam-ledger-lines.ly +input/regression/tuplet-number-kneed-beam-positions.ly input/regression/tuplet-number-outside-staff-positioning.ly input/regression/tuplet-number-outside-staff-priority.ly +input/regression/tuplet-number-shift-along-kneed-beam.ly input/regression/tuplet-number-slur-script.ly +input/regression/tuplet-numbers-kneed-beams-accidentals.ly +input/regression/tuplet-numbers-kneed-beams.ly input/regression/tuplet-properties.ly input/regression/tuplet-rest.ly input/regression/tuplet-single-note.ly @@ -3705,8 +3835,11 @@ input/regression/tuplet-text-different-numbers.ly input/regression/tuplet-text-fraction-with-notes.ly input/regression/tuplet-text-note-appended.ly input/regression/tuplets.ly +input/regression/tweaks-as-overrides.ly input/regression/typography-demo.ly +input/regression/unassociated-lyrics-alignment.ly input/regression/unpure-pure-container.ly +input/regression/unset-once.ly input/regression/utf-8-mixed-text.ly input/regression/utf-8.ly input/regression/voice-follower.ly @@ -3770,11 +3903,13 @@ lily/break-substitution.cc lily/breathing-sign-engraver.cc lily/breathing-sign.cc lily/change-iterator.cc +lily/change-sequence-iterator.cc lily/chord-name-engraver.cc lily/chord-name.cc lily/chord-tremolo-engraver.cc lily/chord-tremolo-iterator.cc lily/clef-engraver.cc +lily/clef-modifier.cc lily/clef.cc lily/cluster-engraver.cc lily/cluster.cc @@ -3901,7 +4036,9 @@ lily/include/book.hh lily/include/box.hh lily/include/break-align-interface.hh lily/include/breathing-sign.hh +lily/include/callback.hh lily/include/change-iterator.hh +lily/include/change-sequence-iterator.hh lily/include/chord-name.hh lily/include/chord-tremolo-iterator.hh lily/include/clef.hh @@ -3929,6 +4066,7 @@ lily/include/event-chord-iterator.hh lily/include/event-iterator.hh lily/include/file-name-map.hh lily/include/fingering-column.hh +lily/include/fluid.hh lily/include/font-interface.hh lily/include/font-metric.hh lily/include/freetype.hh @@ -3942,8 +4080,8 @@ lily/include/grid-line-interface.hh lily/include/grob-array.hh lily/include/grob-info.hh lily/include/grob-interface.hh +lily/include/grob-properties.hh lily/include/grob.hh -lily/include/group-interface.hh lily/include/hairpin.hh lily/include/hara-kiri-group-spanner.hh lily/include/horizontal-bracket.hh @@ -3957,7 +4095,9 @@ lily/include/least-squares.hh lily/include/ligature-engraver.hh lily/include/lily-guile-macros.hh lily/include/lily-guile.hh +lily/include/lily-imports.hh lily/include/lily-lexer.hh +lily/include/lily-modules.hh lily/include/lily-parser.hh lily/include/lily-proto.hh lily/include/lily-version.hh @@ -3966,7 +4106,6 @@ lily/include/line-interface.hh lily/include/listener.hh lily/include/lookup.hh lily/include/ly-module.hh -lily/include/ly-smobs.icc lily/include/lyric-extender.hh lily/include/lyric-hyphen.hh lily/include/main.hh @@ -3994,6 +4133,7 @@ lily/include/note-collision.hh lily/include/note-column.hh lily/include/note-head.hh lily/include/note-spacing.hh +lily/include/one-line-auto-height-breaking.hh lily/include/one-line-page-breaking.hh lily/include/open-type-font.hh lily/include/optimal-page-breaking.hh @@ -4034,7 +4174,6 @@ lily/include/rhythmic-music-iterator.hh lily/include/rod.hh lily/include/scale.hh lily/include/scheme-engraver.hh -lily/include/scheme-listener.hh lily/include/scm-hash.hh lily/include/score-engraver.hh lily/include/score-performer.hh @@ -4047,18 +4186,19 @@ lily/include/semi-tie.hh lily/include/separation-item.hh lily/include/sequential-iterator.hh lily/include/side-position-interface.hh -lily/include/simple-closure.hh lily/include/simple-music-iterator.hh lily/include/simple-spacer.hh lily/include/simultaneous-music-iterator.hh lily/include/skyline-pair.hh lily/include/skyline.hh lily/include/slur-configuration.hh -lily/include/slur-proto-engraver.hh +lily/include/slur-engraver.hh lily/include/slur-score-parameters.hh lily/include/slur-scoring.hh lily/include/slur.hh +lily/include/small-smobs.hh lily/include/smobs.hh +lily/include/smobs.tcc lily/include/source-file.hh lily/include/sources.hh lily/include/spaceable-grob.hh @@ -4085,14 +4225,13 @@ lily/include/tie-details.hh lily/include/tie-formatting-problem.hh lily/include/tie-specification.hh lily/include/tie.hh -lily/include/time-scaled-music-iterator.hh -lily/include/time-signature.hh lily/include/timing-translator.hh lily/include/translator-dispatch-list.hh lily/include/translator-group.hh lily/include/translator.hh lily/include/translator.icc lily/include/tuplet-bracket.hh +lily/include/tuplet-number.hh lily/include/unpure-pure-container.hh lily/include/vaticana-ligature.hh lily/include/volta-bracket.hh @@ -4119,13 +4258,16 @@ lily/lexer.ll lily/ligature-bracket-engraver.cc lily/ligature-engraver.cc lily/lily-guile.cc +lily/lily-imports.cc lily/lily-lexer-scheme.cc lily/lily-lexer.cc +lily/lily-modules.cc lily/lily-parser-scheme.cc lily/lily-parser.cc lily/lily-version.cc lily/lilypond-version.cc lily/lilypond.rc.in +lily/line-interface-scheme.cc lily/line-interface.cc lily/line-spanner.cc lily/listener.cc @@ -4181,6 +4323,7 @@ lily/note-name-engraver.cc lily/note-performer.cc lily/note-spacing-engraver.cc lily/note-spacing.cc +lily/one-line-auto-height-breaking.cc lily/one-line-page-breaking.cc lily/open-type-font-scheme.cc lily/open-type-font.cc @@ -4220,6 +4363,7 @@ lily/parse-scm.cc lily/parser.yy lily/part-combine-engraver.cc lily/part-combine-iterator.cc +lily/part-combine-part-iterator.cc lily/partial-iterator.cc lily/pdf-scheme.cc lily/percent-repeat-engraver.cc @@ -4269,8 +4413,6 @@ lily/rhythmic-music-iterator.cc lily/rod.cc lily/scale.cc lily/scheme-engraver.cc -lily/scheme-listener-scheme.cc -lily/scheme-listener.cc lily/scm-hash.cc lily/score-engraver.cc lily/score-performer.cc @@ -4288,7 +4430,6 @@ lily/separating-line-group-engraver.cc lily/separation-item.cc lily/sequential-iterator.cc lily/side-position-interface.cc -lily/simple-closure.cc lily/simple-music-iterator.cc lily/simple-spacer-scheme.cc lily/simple-spacer.cc @@ -4299,7 +4440,6 @@ lily/slash-repeat-engraver.cc lily/slur-configuration.cc lily/slur-engraver.cc lily/slur-performer.cc -lily/slur-proto-engraver.cc lily/slur-score-parameters.cc lily/slur-scoring.cc lily/slur.cc @@ -4364,7 +4504,6 @@ lily/tie-specification.cc lily/tie.cc lily/time-signature-engraver.cc lily/time-signature-performer.cc -lily/time-signature.cc lily/timing-translator.cc lily/translator-ctors.cc lily/translator-dispatch-list.cc @@ -4380,7 +4519,6 @@ lily/tuplet-iterator.cc lily/tuplet-number.cc lily/tweak-engraver.cc lily/undead.cc -lily/unfolded-repeat-iterator.cc lily/unpure-pure-container.cc lily/vaticana-ligature-engraver.cc lily/vaticana-ligature.cc @@ -4395,6 +4533,7 @@ ly/Welcome_to_LilyPond.ly ly/arabic.ly ly/articulate.ly ly/bagpipe.ly +ly/base-tkit.ly ly/catalan.ly ly/chord-modifiers-init.ly ly/chord-repetition-init.ly @@ -4417,6 +4556,7 @@ ly/guile-debugger.ly ly/init.ly ly/italiano.ly ly/lilypond-book-preamble.ly +ly/lyrics-tkit.ly ly/makam.ly ly/midi-init.ly ly/music-functions-init.ly @@ -4424,6 +4564,7 @@ ly/nederlands.ly ly/norsk.ly ly/paper-defaults-init.ly ly/performer-init.ly +ly/piano-tkit.ly ly/portugues.ly ly/predefined-fretboards-init.ly ly/predefined-guitar-fretboards.ly @@ -4431,10 +4572,13 @@ ly/predefined-guitar-ninth-fretboards.ly ly/predefined-mandolin-fretboards.ly ly/predefined-ukulele-fretboards.ly ly/property-init.ly +ly/satb.ly ly/scale-definitions-init.ly ly/scheme-sandbox.ly ly/script-init.ly ly/spanners-init.ly +ly/ssaattbb.ly +ly/staff-tkit.ly ly/string-tunings-init.ly ly/suomi.ly ly/svenska.ly @@ -4442,6 +4586,8 @@ ly/text-replacements.ly ly/titling-init.ly ly/toc-init.ly ly/vlaams.ly +ly/vocal-tkit.ly +ly/voice-tkit.ly make/abc-rules.make make/abc-targets.make make/abc-vars.make @@ -4478,12 +4624,17 @@ make/stepmake.make make/substitute.make make/toplevel-version.make make/website.make +mf/00-lilypond-fonts.conf.in +mf/99-lilypond-fonts.conf.in mf/GNUmakefile mf/README +mf/common-modules-and-initialization.mf +mf/debugging-settings.mf +mf/declare-autometric-parameters.mf mf/emmentaler-brace.pe.in mf/feta-accidentals.mf mf/feta-accordion.mf -mf/feta-alphabet.mf +mf/feta-alphabet-generic.mf mf/feta-alphabet11.mf mf/feta-alphabet13.mf mf/feta-alphabet14.mf @@ -4492,6 +4643,7 @@ mf/feta-alphabet18.mf mf/feta-alphabet20.mf mf/feta-alphabet23.mf mf/feta-alphabet26.mf +mf/feta-arrow.mf mf/feta-arrowheads.mf mf/feta-autometric.mf mf/feta-braces-a.mf @@ -4501,6 +4653,7 @@ mf/feta-braces-d.mf mf/feta-braces-e.mf mf/feta-braces-f.mf mf/feta-braces-g.mf +mf/feta-braces-generic.mf mf/feta-braces-h.mf mf/feta-braces-i.mf mf/feta-braces.mf @@ -4518,8 +4671,9 @@ mf/feta-flags18.mf mf/feta-flags20.mf mf/feta-flags23.mf mf/feta-flags26.mf -mf/feta-generic.mf +mf/feta-flats.mf mf/feta-macros.mf +mf/feta-naturals.mf mf/feta-noteheads-generic.mf mf/feta-noteheads.mf mf/feta-noteheads11.mf @@ -4531,17 +4685,13 @@ mf/feta-noteheads20.mf mf/feta-noteheads23.mf mf/feta-noteheads26.mf mf/feta-numbers.mf +mf/feta-other-generic.mf mf/feta-params.mf +mf/feta-parenthesis.mf mf/feta-pedals.mf mf/feta-rests.mf mf/feta-scripts.mf -mf/feta-test-generic.mf -mf/feta-test11.mf -mf/feta-test13.mf -mf/feta-test16.mf -mf/feta-test20.mf -mf/feta-test23.mf -mf/feta-test26.mf +mf/feta-sharps.mf mf/feta-ties.mf mf/feta-timesignatures.mf mf/feta-trills.mf @@ -4559,7 +4709,6 @@ mf/parmesan-clefs.mf mf/parmesan-custodes.mf mf/parmesan-dots.mf mf/parmesan-flags.mf -mf/parmesan-generic.mf mf/parmesan-macros.mf mf/parmesan-noteheads-generic.mf mf/parmesan-noteheads.mf @@ -4571,6 +4720,7 @@ mf/parmesan-noteheads18.mf mf/parmesan-noteheads20.mf mf/parmesan-noteheads23.mf mf/parmesan-noteheads26.mf +mf/parmesan-other-generic.mf mf/parmesan-rests.mf mf/parmesan-scripts.mf mf/parmesan-timesignatures.mf @@ -4605,6 +4755,7 @@ po/uk.po po/vi.po po/zh_TW.po ps/GNUmakefile +ps/encodingdefs.ps ps/lilyponddefs.ps ps/music-drawing-routines.ps python/GNUmakefile @@ -4626,9 +4777,11 @@ python/lilylib.py python/midi.c python/musicexp.py python/musicxml.py +python/musicxml2ly_conversion.py python/rational.py python/relocate-preamble.py.in python/safeeval.py +python/utilities.py scm/GNUmakefile scm/accreg.scm scm/auto-beam.scm @@ -4719,6 +4872,7 @@ scm/stencil.scm scm/tablature.scm scm/text.scm scm/time-signature-settings.scm +scm/time-signature.scm scm/titling.scm scm/to-xml.scm scm/translation-functions.scm @@ -4737,13 +4891,13 @@ scripts/auxiliar/find-superfluous-includes.py scripts/auxiliar/fixcc.py scripts/auxiliar/fixscm.sh scripts/auxiliar/lily-git.tcl +scripts/auxiliar/make-countdown-announcement.sh scripts/auxiliar/make-regtest-pngs.sh scripts/auxiliar/makelsr.py scripts/auxiliar/musicxml_generate_intervals.py scripts/auxiliar/musicxml_generate_keys.py scripts/auxiliar/musicxml_generate_timesignatures.py scripts/auxiliar/node-menuify.py -scripts/auxiliar/pfx2ttf.fontforge scripts/auxiliar/prepare-web-media.py scripts/auxiliar/readlink.py scripts/auxiliar/ref_check.py @@ -4788,6 +4942,7 @@ scripts/build/text2html.py scripts/build/website-known-missing-files.txt scripts/build/website_post.py scripts/build/www_post.py +scripts/build/xetex-with-options.sh scripts/build/yyout2grammar.py scripts/convert-ly.py scripts/etf2ly.py @@ -4885,8 +5040,8 @@ stepmake/stepmake/toplevel-targets.make stepmake/stepmake/toplevel-vars.make tex/GNUmakefile tex/lilypond-tex-metrics.tex -tex/lilypond.map.in tex/texinfo.tex +tex/txi-ca.tex tex/txi-de.tex tex/txi-en.tex tex/txi-es.tex diff --git a/.gitignore b/.gitignore index 3097acfe26..96f90af558 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,7 @@ config.status.lineno configure gcstat*.scm lily-[0-9a-f][0-9a-f][0-9a-f]* +lilypond-issues.csv lsr-unsafe.txt nohup.out out @@ -76,5 +77,5 @@ RELEASE-COMMIT Documentation/lilypond semantic.cache .lock-wscript -build/ +/build/ .gitfilelist diff --git a/.mailmap b/.mailmap index 78d92e31a2..29cc670935 100644 --- a/.mailmap +++ b/.mailmap @@ -133,8 +133,9 @@ John Mandereau Jonathan Kulp Jonathan Kulp Joseph Wakeling -Jürgen Reuter -Jürgen Reuter +Jürgen Reuter +Jürgen Reuter +Jürgen Reuter Keith OHara Kevin Dalley Kieren MacMillan diff --git a/AUTHORS.txt b/AUTHORS.txt index f7fcb0c7db..55af69db64 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -14,9 +14,6 @@ contributed over 100 lines of code or the equivalent. Current Development Team ------------------------ - * Bertrand Bordage: , Core developer, - font designer - * Trevor Daniels: , Assistant documentation editor @@ -25,47 +22,24 @@ Current Development Team * Phil Holmes: `http://www.philholmes.net' Build unentangler, Bug squad member - * Ian Hulin: Core developer - - * Reinhold Kainhofer: , - `http://reinhold.kainhofer.com', Core developer, Music2xml wrangler - * David Kastrup: , hard core developer, user and programming interfaces, bug squashing and swamp drainage. - * Jonathan Kulp: Assistant documentation editor - * Werner Lemberg, , Fonts, bug squasher - * John Mandereau: , Translations - - * Patrick McCarty: SVG guru, bug squad member, bug squasher, text - handling - - * Joe Neeman: Core developer - * Han-Wen Nienhuys: , `http://www.xs4all.nl/~hanwen/', Main author * Jan Nieuwenhuizen: , `http://JoyofSource.com', `http://AvatarAcademy.nl', Main author - * Graham Percival: `http://percival-music.ca', Project manager, - Documentation Editor - - * Mark Polesky: Assistant documentation editor, Code cleanup - - * Neil Puttock: Core developer - - * Mike Solomon: , Core developer, Frog meister + * Mark Polesky: Documentation, Code cleanup * Carl Sorensen: , Core developer * Francisco Vila: Translation Meister - * Valentin Villenave: LSR editor and Bug squad member - - * Janek Warchoł: happy nitpicker + * Janek Warchoł: , Core developer Previous Development Team @@ -74,20 +48,41 @@ Previous Development Team * Mats Bengtsson: , `https://www.kth.se/profile/matben/', Support guru + * Bertrand Bordage: , Core developer, + font designer + + * Ian Hulin: Core developer + + * Reinhold Kainhofer: , + `http://reinhold.kainhofer.com', Core developer, Music2xml wrangler + * Pedro Kroeger: Build meister + * Jonathan Kulp: Assistant documentation editor + + * Joe Neeman: Core developer + * John Mandereau: , Translation meister + * Patrick McCarty: SVG guru, bug squad member, bug squasher, text + handling + * Graham Percival: `http://percival-music.ca', Bug meister, Grand Documentation Project leader + * Neil Puttock: Core developer + * Jürgen Reuter: , `http://www.juergen-reuter.de', Ancient notation + * Mike Solomon: , Core developer, Frog meister + * Erik Sandberg: Bug meister * Nicolas Sceaux: Core developer, Schemer extraordinaire + * Valentin Villenave: LSR editor and Bug squad member + Current Contributors -------------------- @@ -95,37 +90,41 @@ Current Contributors Programming ........... -Aleksandr Andreev, Frédéric Bron, Torsten Hämmerle , Marc Hohl, -James Lowe, Andrew Main, Thomas Morley, David Nalesnik, Keith OHara, -Benkő Pál, Anders Pilegaard, Julien Rioux, Johannes Rohrer, Adam -Spiers, Heikki Tauriainen +Federico Bruni, Dan Eble, Marc Hohl, Masamichi Hosoda, James Lowe, +Thomas Morley, Paul Morris, David Nalesnik, Keith OHara, Benkő Pál, +Julien Rioux, Devon Schudy, Heikki Tauriainen Font .... +Masamichi Hosoda, Abraham Lee + Documentation ............. Frédéric Bron, Federico Bruni, Colin Campbell, Urs Liska, James Lowe, -Thomas Morley, Jean-Charles Malahieude, Guy Stalnaker, Martin -Tarenskeen, Arnold Theresius, Rodolfo Zitellini +Thomas Morley, Jean-Charles Malahieude, Pierre Perol-Schneider, Martin +Tarenskeen Bug squad ......... -Colin Campbell, Eluze, Marc Hohl, Phil Holmes, Marek Klein, Ralph Palmer +Simon Albrecht, Federico Bruni, Colin Campbell, Phil Holmes, Ralph +Palmer Support ....... -Colin Campbell, Eluze, Marc Hohl, Marek Klein, Kieren MacMillan, Urs -Liska, Ralph Palmer +Simon Albrecht, Colin Campbell, Eluze, Marc Hohl, Phil Holmes, Marek +Klein, Alex Loomis, Kieren MacMillan, Thomas Morley, Tim McNamara, Paul +Morris, David Nalesnik, Urs Liska, Ralph Palmer, Pierre Perol-Schneider, +Neil Puttock, Tao Translation ........... -Federico Bruni, Luca Rossetto Casel, Felipe Castro, Pavel Fric, -Jean-Charles Malahieude, Till Paala, Yoshiki Sawada +Federico Bruni, Luca Rossetto Casel, Felipe Castro, Pavel Fric, Walter +Garcia-Fontes, Jean-Charles Malahieude, Till Paala, Yoshiki Sawada Past Contributors ----------------- @@ -137,25 +136,27 @@ Erlend Aasland, Maximilian Albert, Aleksandr Andreev, Guido Amoruso, Sven Axelsson, Kristof Bastiaensen, Pál Benkő, Frédéric Bron, Juliusz Chroboczek, Peter Chubb, Angelo Contardi, Vicente Solsona Della, Hajo Dezelski, Michael Welsh Duggan, David Feuer, Bertalan Fodor, -Richard Gay, Mathieu Giraud, Lisa Opus Goldstein, Yuval Harel, Andrew -Hawryluk, Christian Hitz, Karin Hoethker, Marc Hohl, Bernard Hurley, -Yoshinobu Ishizaki, Chris Jackson, David Jedlinsky, Heikki Junes, -Michael Käppler, Marek Klein, Michael Krause, Jean-Baptiste Lamy, -Jonatan Liljedahl, Peter Lutek, Kieren MacMillan, Hendrik Maryns, +Richard Gay, Mathieu Giraud, Lisa Opus Goldstein, Torsten Hämmerle, +Yuval Harel, Andrew Hawryluk, Christian Hitz, Karin Hoethker, Rutger +Hofmann, Marc Hohl, Bernard Hurley, Yoshinobu Ishizaki, Chris Jackson, +Felix Janda, David Jedlinsky, Heikki Junes, Michael Käppler, Thomas +Klausner, Marek Klein, Michael Krause, Jean-Baptiste Lamy, Jonatan +Liljedahl, Peter Lutek, Andrew Main, Kieren MacMillan, Hendrik Maryns, Thomas Morgan, David Nalesnik, Matthias Neeracher, Keith OHara, Justin Ohmie, Tatsuya Ono, Benkő Pál, Benjamin Peterson, Guy -Gascoigne-Piggford, Henning Hraban Ramm, Nathan Reed, Julien Rioux, -Stan Sanderson, Andreas Scherer, Johannes Schindelin, Patrick Schmidt, -Boris Shingarov, Kim Shrier, Edward Sanford Sutton, Adam Spiers, David -Svoboda, Heikki Taurainen, Piers Titus van der Torren, Owen Tuz, -Sebastiano Vigna, Jan-Peter Voigt, Arno Waschk, John Williams, Andrew -Wilson, Milan Zamazal, Rune Zedeler, Rodolfo Zitellini +Gascoigne-Piggford, Anders Pilegaard, Henning Hraban Ramm, Nathan Reed, +Julien Rioux, Johannes Rohrer, Stan Sanderson, Andreas Scherer, +Johannes Schindelin, Patrick Schmidt, Boris Shingarov, Kim Shrier, +Edward Sanford Sutton, Adam Spiers, David Svoboda, Heikki Taurainen, +Piers Titus van der Torren, Owen Tuz, Sebastiano Vigna, Jan-Peter Voigt, +Arno Waschk, John Williams, Andrew Wilson, Milan Zamazal, Rune Zedeler, +Rodolfo Zitellini Font .... -Tom Cato Amundsen, Marc Hohl, Chris Jackson, Alexander Kobel, Keith -OHara, Carsten Steger, Arno Waschk, Rune Zedeler +Tom Cato Amundsen, Marc Hohl, Chris Jackson, Alexander Kobel, Abraham +Lee, Keith OHara, Carsten Steger, Arno Waschk, Rune Zedeler Documentation ............. @@ -165,8 +166,9 @@ Hamilton, Joseph Harfouch, Andrew Hawryluk, Cameron Horsburgh, Geoff Horton, Heikki Junes, Kurtis Kroon, James Lowe, Dave Luttinen, Kieren MacMillan, Christian Mondrup, Mike Moral, Eyolf Østrem, Ralph Palmer, François Pinard, David Pounder, Michael Rasmussen, Till Rettig, Pavel -Roskin, Patrick Schmidt, Alberto Simoes, Anh Hai Trinh, Eduardo Vieira, -Stefan Weil, Rune Zedeler +Roskin, Patrick Schmidt, Alberto Simoes, Guy Stalnaker, Arnold +Theresius, Anh Hai Trinh, Eduardo Vieira, Stefan Weil, Rune Zedeler, +Rodolfo Zitellini Support ....... diff --git a/Documentation/ca/GNUmakefile b/Documentation/ca/GNUmakefile new file mode 100644 index 0000000000..d225764264 --- /dev/null +++ b/Documentation/ca/GNUmakefile @@ -0,0 +1,6 @@ +ISOLANG = ca +depth = ../.. +STEPMAKE_TEMPLATES = documentation texinfo +LOCALSTEPMAKE_TEMPLATES = lilypond ly doc-i18n-root + +include $(depth)/make/stepmake.make diff --git a/Documentation/ca/included/.gitignore b/Documentation/ca/included/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Documentation/ca/learning.tely b/Documentation/ca/learning.tely new file mode 100644 index 0000000000..4ee987f7ef --- /dev/null +++ b/Documentation/ca/learning.tely @@ -0,0 +1,84 @@ +\input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- +@ignore + Translation of GIT committish: 08560a1b8076630c4fc6cb9b902614d8b74fd6fc + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@setfilename lilypond-learning.info +@settitle Manual d'aprenentatge del GNU LilyPond +@documentencoding UTF-8 +@documentlanguage ca +@afourpaper + +@macro manualIntro +Aquest fitxer ofereix una introducció al programa LilyPond versió +@version{}. +@end macro + +@c `Learning Manual' was born 1999-10-10 with git commit b9abaac... +@macro copyrightDeclare +Copyright @copyright{} 1999--2015 pels autors. +@end macro + +@set FDL +@include macros.itexi + + +@c don't remove this comment. +@ignore +@omfcreator Han-Wen Nienhuys, Jan Nieuwenhuizen and Graham Percival +@omfdescription Learning Manual of the LilyPond music engraving system +@omftype program usage +@omfcategory Applications|Publishing +@omflanguage Spanish +@end ignore + +@c Translators: Walter Garcia-Fontes + +@lilyTitlePage{Manual d'aprenentatge} + +@c TOC -- non-tex +@ifnottex + +@menu +* Tutorial:: Fonaments de la tipografia musical amb el LilyPond. +* Notació corrent:: Escriptura de la notació molt comú. +* Conceptes fonamentals:: Conceptes bàsics per llegir la resta dels manuals. +* Ajustament de la sortida:: Introducció a la modificació de la sortida. + +Annexos + +* Plantilles:: Plantilles a punt per usar. +* GNU Free Documentation License:: Llicència d'aquest document. +* Índex del LilyPond:: +@end menu + +@docMain +@end ifnottex + + +@c TOC - tex +@contents + +@allowcodebreaks false + +@c INCLUDES + +@include learning/tutorial.itely +@include learning/common-notation.itely +@include learning/fundamental.itely +@include learning/tweaks.itely + +@include learning/templates.itely +@include fdl.itexi + +@node Índex del LilyPond +@appendix Índex del LilyPond +@translationof LilyPond index + +@printindex cp + +@bye diff --git a/Documentation/ca/learning/common-notation.itely b/Documentation/ca/learning/common-notation.itely new file mode 100644 index 0000000000..286ceba6f2 --- /dev/null +++ b/Documentation/ca/learning/common-notation.itely @@ -0,0 +1,1611 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- + +@ignore + Translation of GIT committish: 45dd19546e9b75b3e1e977732f0962f35dd3290e + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + +@c \version "2.19.21" + +@ignore +Tutorial guidelines: (different from policy.txt!) +- unless you have a really good reason, use + @lilypond[verbatim,quote] + +- use "aes" and "ees" instead of "as" and "es". I know it's not + correct Dutch naming, but let's not confuse people with this + until we get to the Basic notation chapter. + +- Add "Music Glossary: @rglos{foo}" to the *top* of the relevant + portions of the tutorial. + +@end ignore + + +@node Notació corrent +@chapter Notació corrent +@translationof Common notation + +Aquest capítol explica com crear boniques partitures que +continguin notació musical comú, com a continuació al material que +està al @ref{Tutorial}. + +@menu +* Notació en un sol pentagrama:: +* Diverses notes a la vegada:: +* Cançons:: +* Retocs finals:: +@end menu + + +@node Notació en un sol pentagrama +@section Notació en un sol pentagrama +@translationof Single staff notation + +Aquesta secció presenta la notació comú que s'utilitza per a +música a una veu sobre un pentagrama únic. + +@menu +* Línies divisòries i comprovacions de compàs:: +* Alteracions accidentals i armadures:: +* Lligadures d'unió i d'expressió:: +* Articulacions i matisos dinàmics:: +* Addició de text:: +* Barres automàtiques i manuals:: +* Instruccions rítmiques avançades:: +@end menu + + +@node Línies divisòries i comprovacions de compàs +@subsection Línies divisòries i comprovacions de compàs +@translationof Bar lines and bar checks + +@menu +* Línies divisòries:: +* Comprovacions de compàs:: +@end menu + +@node Línies divisòries +@unnumberedsubsubsec Línies divisòries +@translationof Bar lines + +Les línies de compàs senzilles es dibuixen automàticament a la +música, per la qual cosa no s'han d'afegir de forma manual. +Altres tipus de barres de compàs s'afegeixen usant @code{\bar}, per +exemple @code{\bar "||"} per a una doble barra, o @code{\bar "|."} +per a la doble barra final. Per veure una llista completa de les +línies divisòries, consulteu @rusernamed{Bar lines,Línies divisòries}. + +@lilypond[verbatim,quote] +\relative { g'1 e1 \bar "||" c2. c'4 \bar "|." } +@end lilypond + +@node Comprovacions de compàs +@unnumberedsubsubsec Comprovacions de compàs +@translationof Bar checks + +Tot i que no es estrictament necessari, és convenient utilitzar +@emph{comprovacions de compàs} dins del codi d'entrada per a +indicar on se suposa que van les línies divisòries. +S'introdueixen mitjançant el caràcter de barra vertical, @code{|} +(AltGr -1 al teclat català). Amb les comprovacions de compàs, el +programa pot verificar que hem introduït les duracions que +completen els compassos correctament. Les comprovacions de compàs +també fan que el codi d'entrada sigui més fàcil de llegir, perquè +ajuden a organitzar el material. + +@lilypond[verbatim,quote,relative=2] +g1 | e1 | c2. c'4 | g4 c g e | c4 r r2 | +@end lilypond + +@seealso +Referència de la notació: +@ruser{Bar and bar number checks}. + + +@node Alteracions accidentals i armadures +@subsection Alteracions accidentals i armadures +@translationof Accidentals and key signatures + +@menu +* Alteracions accidentals:: +* Armadures:: +* Advertiment armadures i altures:: +@end menu + +@warning{Freqüentment els nous usuaris es confonen amb les +alteracions accidentals: us preguem que llegeixi l'advertiment que +apareix al final d'aquesta secció, especialment si no teniu +familiaritat amb la teoria musical!} + +@node Alteracions accidentals +@unnumberedsubsubsec Alteracions accidentals +@translationof Accidentals + +@cindex accidentals, alteracions +@cindex alteracions +@cindex alteracions i armadures +@cindex sostingut +@cindex doble sostingut +@cindex sostingut, doble +@cindex bemoll +@cindex doble bemoll +@cindex bemoll, doble + +@funindex es +@funindex is +@funindex eses +@funindex isis + +Glossari musical: +@rglos{sharp}, +@rglos{flat}, +@rglos{double sharp}, +@rglos{double flat}, +@rglos{accidental}. + +Una nota amb @notation{sostingut} es fa afegint @code{is} al nom, +i una nota @notation{bemoll} afegint @code{es}. Como heu pogut +endevinar, un @notation{doble sostingut} o @notation{doble +bemol} es fa afegint @code{isis} o @code{eses}. Aquesta sintaxi +deriva de les convencions de nomenclatura de les notes en les +llengües nòrdiques i germàniques com l'alemany i l'holandès. Per +utilitzar altres noms per a les @notation{alteracions +accidentals}, vegeu @ruser{Note names in other languages}. + +@lilypond[verbatim,quote] +\relative { cis''4 ees fisis, aeses } +@end lilypond + +@cindex tonalitat, armadura de la, establir + +@node Armadures +@unnumberedsubsubsec Armadures +@translationof Key signatures + +@cindex tonalitat, armadura de +@cindex armadura +@cindex major +@cindex menor +@cindex alteracions y armadura +@cindex contingut en front a presentació +@cindex presentació en front a contingut + +@funindex \key +@funindex \major +@funindex \minor + +Glossari musical: +@rglos{key signature}, +@rglos{major}, +@rglos{minor}. + +La @notation{armadura de la tonalitat} se estableix mitjançant la +instrucció @code{\key} seguit d'una nota i @code{\major} o +@code{\minor}. + +@lilypond[verbatim,quote,relative=2] +\key d \major +a1 | +\key c \minor +a1 | +@end lilypond + +@smallspace + +@node Advertiment armadures i altures +@unnumberedsubsubsec Advertiment: armadures i altures +@translationof Warning key signatures and pitches + +Glossari musical: +@rglos{accidental}, +@rglos{key signature}, +@rglos{pitch}, +@rglos{flat}, +@rglos{natural}, +@rglos{sharp}, +@rglos{transposition}, +@rglos{Pitch names}. + +Per determinar si s'ha d'imprimir una notació @notation{alteració +accidental}, el LilyPond examina les notes i la @notation{armadura +de la tonalitat}. L'armadura solament afecta a les alteracions +@emph{impreses}, no a les pròpies notes! Aquesta funcionalitat +sol confondre als que estan començant amb el programa, per això +deixeu-nos explicar-la en detall. + +El LilyPond fa una clara distinció entre el contingut musical i la +presentació. L'alteració (@notation{bemol}, @notation{becaire} o +@notation{sostingut}) d'una nota és part de l'altura, i per tant +és contingut musical. Si una alteració (un signe @emph{imprès} de +bemoll, becaire o sostingut) s'imprimeix o no davant de la nota +corresponent, és una qüestió de presentació. La presentació és +quelcom que segueix unes regles, de manera que les alteracions +accidentals s'imprimeixen automàticament segons aquestes regles. +Les altures de les notes de la seva música són obres d'art, per +tant no s'afegiran automàticament, i haureu d'introduir allò que +vulgueu escoltar. + +Al següent exemple: + +@lilypond[verbatim,quote] +\relative { + \key d \major + cis''4 d e fis +} +@end lilypond + +@noindent +Cap nota porta una alteració impresa, però de totes maneres heu +d'escriure l' @code{is} a @code{cis} i a @code{fis} al fitxers +d'entrada. + +El text @code{b} no significa @qq{imprimir una boleta negra a la +tercera línia del pentagrama.} El que significa en realitat: +@qq{hi ha una nota Si natural.} A la tonalitat de La bemoll +major, @emph{porta} una alteració accidental: + +@lilypond[verbatim,quote] +\relative { + \key aes \major + aes'4 c b c +} +@end lilypond + +Si l'anterior us causa confusió, penseu sobre el següent: si +estiguéssiu tocant el piano, quina tecla polsaríeu? Si es tractés +d'una tecla negra, aleshores @emph{heu} d'afegir @w{@code{-is}} o +@w{@code{-es}} al nom de la nota! + +Posar totes les alteracions de forma explícita pot requerir una +mica més de treball d'escriure, però l'avantatge és que la +@notation{transposició} és més fàcil, i les alteracions es poden +imprimir seguint diverses convencions diferents. Consulteu +@ruser{Automatic accidentals} per veure exemples de +com es poden imprimir alteracions d'acord amb regles diferents. + + +@seealso +Referència de la notació: +@ruser{Note names in other languages}, +@rusernamed{Accidentals,Alteracions accidentals}, +@ruser{Automatic accidentals}, +@ruser{Key signature}. + +@node Lligadures d'unió i d'expressió +@subsection Lligadures d'unió i d'expressió +@translationof Ties and slurs + +@cindex lligadura d'unió +@cindex lligadura d'expressió +@cindex lligadura de fraseig +@cindex fraseig, lligadura de + +@funindex ~ +@funindex ( ... ) +@funindex \( ... \) + +@menu +* Lligadures d'unió:: +* Lligadures d'expressió:: +* Lligadures de fraseig:: +* Advertiments lligadures d'expressió en front a lligadures d'unió:: +@end menu + +@node Lligadures d'unió +@unnumberedsubsubsec Lligadures d'unió +@translationof Ties + +Glossari musical: +@rglos{tie}. + +Una @notation{lligadura d'unió} es crea adjuntant un caràcter +d'accent @code{~} a la primera nota lligada: + +@lilypond[verbatim,quote] +\relative { g'4~ 4 c2~ | 4~ 8 a~ 2 | } +@end lilypond + +@node Lligadures d'expressió +@unnumberedsubsubsec Lligadures d'expressió +@translationof Slurs + +Glossari musical: +@rglos{slur}. + +Una @notation{lligadura d'expressió} és una corba que es traça +abastant diverses notes. Les notes inicial i final es marquen +mitjançant @code{(} y @code{)} respectivament. + +@lilypond[verbatim,quote] +\relative { d''4( c16) cis( d e c cis d) e( d4) } +@end lilypond + +@node Lligadures de fraseig +@unnumberedsubsubsec Lligadures de fraseig +@translationof Phrasing slurs + +Glossari musical: +@rglos{slur}, +@rglos{phrasing}. + +Les lligadures que s'utilitzen per indicar @notation{fraseigs} més +llargs es poden introduir mitjançant @code{\(} i @code{\)}. Poden +haver-hi a l'hora lligadures de legato i lligadures de fraseig, +però no és possible tenir legatos simultanis o lligadures +d'expressió simultànies. + +@lilypond[verbatim,quote] +\relative { g'4\( g8( a) b( c) b4\) } +@end lilypond + +@smallspace + +@cindex lligadures d'expressió en front a lligadures d'unió + +@node Advertiments lligadures d'expressió en front a lligadures d'unió +@unnumberedsubsubsec Advertiments: lligadures d'expressió en front a lligadures d'unió +@translationof Warnings slurs vs. ties + +Glossari musical: +@rglos{articulation}, +@rglos{slur}, +@rglos{tie}. + +Una @notation{lligadura d'expressió} sembla una +@notation{lligadura d'unió}, però té un significat diferent. Una +lligadura (d'unió) senzillament feu que la primera nota sigui més +llarga, i sols es pot utilitzar sobre parelles de notes iguals. +Les lligadures d'expressió indiquen la @notation{articulació} de +les notes, i es poden utilitzar sobre grups majors de notes. Les +lligadures d'unió i d'expressió es poden niuar unes a dins de les +altres. + +@lilypond[verbatim,quote] +\relative { c''4(~ c8 d~ 4 e) } +@end lilypond + + +@seealso +Referència de la notació: +@rusernamed{Ties,Lligadures d'unió}, +@rusernamed{Slurs,Lligadures d'expressió}, +@rusernamed{Phrasing slurs,Lligadures de fraseig}. + +@node Articulacions i matisos dinàmics +@subsection Articulacions i matisos dinàmics +@translationof Articulation and dynamics + +@menu +* Articulacions:: +* Indicacions de digitació:: +* Matisos dinàmics:: +@end menu + +@node Articulacions +@unnumberedsubsubsec Articulacions +@translationof Articulations + +@cindex articulació +@cindex accent +@cindex staccato + +Glossari musical: +@rglos{articulation}. + +Les @notation{articulacions} més corrents es poden afegir a les +notes utilitzant un guió @code{-} seguit d'un caràcter únic: + +@lilypond[verbatim,quote] +\relative { + c''4-^ c-+ c-- c-! + c4-> c-. c2-_ +} +@end lilypond + +@node Indicacions de digitació +@unnumberedsubsubsec Indicacions de digitació +@translationof Fingerings + +@cindex digitacions + +@funindex ^ +@funindex _ + +Glossari musical: +@rglos{fingering}. + +De manera similar, les @notation{digitacions} es poden afegir a +una nota utilitzant un guió (@code{-}) seguit del dígit desitjat: + +@lilypond[verbatim,quote] +\relative { c''4-3 e-5 b-2 a-1 } +@end lilypond + +Les articulacions i digitacions normalment es col·loquen de forma +automàtica, però podeu especificar una direcció mitjançant +@code{^} (a sobre) o @code{_} (a sota). També podeu usar diverses +articulacions sobre la mateixa nota. No obstant, gairebé sempre és +millor deixar que el LilyPond determini la direcció de les +articulacions. + +@lilypond[verbatim,quote] +\relative { c''4_-^1 d^. f^4_2-> e^-_+ } +@end lilypond + +@node Matisos dinàmics +@unnumberedsubsubsec Matisos dinàmics +@translationof Dynamics + +@cindex dinàmica, indicacions de +@cindex matisos +@cindex decrescendo +@cindex crescendo + +@funindex \f +@funindex \ff +@funindex \mp +@funindex \p +@funindex \mf +@funindex \pp +@funindex \< +@funindex \> +@funindex \! + +Glossari musical: +@rglos{dynamics}, +@rglos{crescendo}, +@rglos{decrescendo}. + +Les expressions de @notation{matís} o signes dinàmics es fan +afegint les marques (amb una barra invertida) a la nota: + +@lilypond[verbatim,quote] +\relative { c''4\ff c\mf c\p c\pp } +@end lilypond + +Els @notation{crescendi} i @notation{decrescendi} comencen amb les +ordres @code{\<} i @code{\>}. La següent indicació de matís, com +per exemple @code{\f}, acabarà el (de)crescendo, o bé es pot usar +la instrucció @code{\!}: + +@lilypond[verbatim,quote] +\relative { c''4\< c\ff\> c c\! } +@end lilypond + + +@seealso +Referència de la notació: +@ruser{Articulations and ornamentations}, +@ruser{Fingering instructions}, +@rusernamed{Dynamics,Matisos dinàmics}. + +@node Addició de text +@subsection Addició de text +@translationof Adding text + +@cindex text, addició +@cindex addició de text +@cindex marcat + +@funindex \markup + +És possible afegir text a la partitura: + +@lilypond[verbatim,quote,fragment] +c''2^"espr" a'_"legato" +@end lilypond + +Es pot aplicar un format addicional mitjançant la instrucció +@code{\markup}: + +@lilypond[verbatim,quote,fragment] +c''2^\markup { \bold espr } +a'2_\markup { + \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p +} +@end lilypond + + +@seealso +Referència de la notació: +@ruser{Writing text}. + + +@node Barres automàtiques i manuals +@subsection Barres automàtiques i manuals +@translationof Automatic and manual beams + +@cindex barres de corxera +@cindex barrat +@cindex automàtiques, barres +@cindex manuals, barres +@cindex barres automàtiques +@cindex barres manuals + +@funindex [ ... ] +@funindex [ +@funindex ] +@funindex \autoBeamOff +@funindex \autoBeamOn + +Glossari musical: +@rglos{beam}. + +Totes les @notation{barres} de les figures es dibuixen +automàticament: + +@lilypond[verbatim,quote] +\relative { a'8 ais d ees r d c16 b a8 } +@end lilypond + +Si no us agraden les barres automàtiques, poden forçar-se +manualment. Marqueu la primera nota que comprèn la barra amb +@code{[} i la última amb @code{]}. + +@lilypond[verbatim,quote] +\relative { a'8[ ais] d[ ees r d] c16 b a8 } +@end lilypond + +Si voleu desactivar completament el barrat automàtic o per a una +secció extensa de música, utilitzeu l'ordre @code{\autoBeamOff} +per desactivar-lo i @code{\autoBeamOn} para activar-lo un altre +cop. + +@lilypond[verbatim,quote] +\relative { + \autoBeamOff + a'8 c b4 d8. c16 b4 | + \autoBeamOn + a8 c b4 d8. c16 b4 | +} +@end lilypond + + +@seealso +Referència de la notació: +@ruser{Automatic beams}, +@ruser{Manual beams}. + +@node Instruccions rítmiques avançades +@subsection Instruccions rítmiques avançades +@translationof Advanced rhythmic commands + +@menu +* Compàs parcial:: +* Grups especials:: +* Notes d'adorn:: +@end menu + +@node Compàs parcial +@unnumberedsubsubsec Compàs parcial +@translationof Partial measure + +@cindex anacrusi +@cindex compàs parcial + +@funindex \partial + +Glossari musical: +@rglos{anacrusis}. + +Una @notation{anacrusi} s'introdueix amb la paraula clau +@code{\partial}. Va seguida d'una duració: @code{\partial 4} és +una anacrusi de negra i @code{\partial 8} de corxera. + +@lilypond[verbatim,quote] +\relative { + \partial 8 f''8 | + c2 d | +} +@end lilypond + +@node Grups especials +@unnumberedsubsubsec Grups especials +@translationof Tuplets + +@cindex grups especials +@cindex tresets + +@funindex \tuplet + +Glossari musical: +@rglosnamed{note value,valor de la nota}, +@rglosnamed{triplet,treset}. + +Els grups especials com ara els tresets es fan amb la paraula clau +@code{\tuplet}. Requereix dos arguments: una fracció i un +fragment de música. La fracció és el nombre de notes del grup +partit pel nombre de notes que normalment ocupen la mateixa +duració. Per als tresets hi ha tres notes a l'espai de dues, de +manera que els @notation{tresets} es fan amb una fracció de 3/2. + +@lilypond[verbatim,quote] +\relative { + \tuplet 3/2 { f''8 g a } + \tuplet 3/2 { c8 r c } + \tuplet 3/2 { f,8 g16[ a g a] } + \tuplet 3/2 { d4 a8 } +} +@end lilypond + +@node Notes d'adorn +@unnumberedsubsubsec Notes d'adorn +@translationof Grace notes + +@cindex notes d'adorn +@cindex acciaccatura +@cindex appoggiatura + +@funindex \grace +@funindex \acciaccatura +@funindex \appoggiatura +@funindex acciaccatura + +Glossari musical: +@rglos{grace notes}, +@rglos{acciaccatura}, +@rglos{appoggiatura}. + +Les @notation{notes d'adorn} es creen amb l'ordre +@code{\grace}, tot i que també es poden aconseguir precedint una +expressió musical amb la paraula clau @code{\appoggiatura} o +@code{\acciaccatura}. + +@lilypond[verbatim,quote] +\relative { + c''2 \grace { a32 b } c2 | + c2 \appoggiatura b16 c2 | + c2 \acciaccatura b16 c2 | +} +@end lilypond + + +@seealso +Referència de la notació: +@rusernamed{Grace notes,Notes d'adorn}, +@rusernamed{Tuplets,Grups especials}, +@ruser{Upbeats}. + +@node Diverses notes a la vegada +@section Diverses notes a la vegada +@translationof Multiple notes at once + +Aquesta secció és una introducció a les notes simultànies: +diversos instruments, diversos pentagrames per a un sol instrument +(per exemple piano) i acords. + +La paraula @qq{polifonia} en música fa referència al fet de tenir +més d'una veu en un moment determinat dins d'una peça musical. La +paraula @qq{polifonia} al LilyPond es refereix al fet de tenir més +d'una veu al mateix pentagrama. + +@menu +* Explicació de les expressions musicals:: +* Diversos pentagrames:: +* Grups de pentagrames:: +* Combinar notes per formar acords:: +* Polifonia a un sol pentagrama:: +@end menu + + +@node Explicació de les expressions musicals +@subsection Explicació de les expressions musicals +@translationof Music expressions explained + +@cindex musical, expressió +@cindex expressió musical +@cindex composta, expressió musical +@cindex musical, expressió, composta + +@menu +* Analogia expressions matemàtiques:: +* Expressions musicals simultànies diversos pentagrames:: +* Expressions musicals simultànies un sol pentagrama:: +@end menu + +Als fitxers d'entrada del LilyPond, la música es representa +mitjançant @emph{expressions musicals}. Una sola nota és una +expressió musical: + +@lilypond[verbatim,quote,fragment] +a'4 +@end lilypond + +En tancar un grup de notes dins de claudàtors creem una +@emph{expressió musical composta}. Aquí hem creat una expressió +musical composta amb dues notes: + +@lilypond[verbatim,quote] +\relative { a'4 g4 } +@end lilypond + +Si col·loquem un grup d'expressions musicals (per exemple: notes) +dins de claudàtors, això significa que es troben en seqüència (és +a dir, cada una segueix a l'anterior). El resultat és una altra +expressió musical: + +@lilypond[verbatim,quote] +\relative { { a'4 g } f4 g } +@end lilypond + +@node Analogia expressions matemàtiques +@unnumberedsubsubsec Analogia: expressions matemàtiques +@translationof Analogy mathematical expressions + +Aquest mecanisme és semblant a les fórmules matemàtiques: una +fórmula gran es construeix combinant fórmules petites. Aquestes +fórmules es diuen expressions, i la seva definició és recursiva de +tal manera que es poden construir expressions d'una mida i +complexitat arbitràries. Per exemple: + +@example +1 + +1 + 2 + +(1 + 2) * 3 + +((1 + 2) * 3) / (4 * 5) +@end example + +Això és una seqüència d'expressions on cada expressió es troba +continguda dins de la següent, més gran. Les expressions més +simples són números, i les majors es fan combinant expressions +mitjançant operadors (coma ara @code{+}, @code{*} i @code{/}) i +parèntesis. De la mateixa manera es pot niuar a una profunditat +arbitrària, el que es fa necessari per a músiques complexes com ara +les partitures polifòniques. + +@node Expressions musicals simultànies diversos pentagrames +@unnumberedsubsubsec Expressions musicals simultànies: diversos pentagrames +@translationof Simultaneous music expressions multiple staves + +@cindex diversos pentagrames +@cindex pentagrames, diversos +@cindex polifonia +@cindex combinar expressions en paral·lel +@cindex paral·leles, expressions +@cindex expressions paral·leles +@cindex relatiu, mode, música simultània i +@cindex relatiu, mode, expressions paral·leles i +@cindex simultània, música, mode relatiu i +@cindex paral·leles, expressions, mode relatiu i + +@funindex << +@funindex >> +@funindex << ... >> + +Glossari musical: +@rglos{polyphony}. + +Aquesta tècnica és molt útil per a la música +@notation{polifònica}. Per introduir música amb més veus o amb +més pentagrames, el que fem és combinar diverses expressions en +paral·lel. Per indicar que dues veus s'han d'interpretar al +mateix temps, senzillament introduïu una combinació simultània +d'expressions musicals. Una expressió musical @q{simultània} es +forma tancant les expressions dins de @code{<<} y @code{>>}. A +l'exemple que segueix, tres seqüències (cadascuna de les quals +conté dues notes diferents) es combinen de forma simultània: + +@lilypond[verbatim,quote] +<< + \relative { a'2 g } + \relative { f'2 e } + \relative { d'2 b } +>> +@end lilypond + +Tingueu en compte que hem sagnat cada nivell jeràrquic de +l'entrada amb un marge diferent. Al LilyPond no li importa quant +(o que poc) espai hi hagi al començament d'una línia però +l'establiment de marges diferents dins del codi del LilyPond, +d'aquesta forma, el fa molt més fàcil de llegir per a nosaltres +els éssers humans. + +@warning{Cada nota s'entén relativa a la nota anterior de +l'entrada, solament la primera és relativa a la @code{c''} dins de +la instrucció inicial @code{@bs{}\relative}.} + +@node Expressions musicals simultànies un sol pentagrama +@unnumberedsubsubsec Expressions musicals simultànies: un sol pentagrama +@translationof Simultaneous music expressions single staff + +Per determinar el nombre de pentagrames a una peça, el LilyPond +examina el començament de la primera expressió. Si hi ha una sola +nota, hi ha un sol pentagrama; si hi ha una expressió simultània, +hi ha més d'un pentagrama. El següent exemple presenta una +expressió complexa, però com comença amb una sola nota, es +disposa sobre un sols pentagrama. + +@lilypond[verbatim,quote] +\relative { + c''2 <> | + << { e2 f } { c2 <> } >> | +} +@end lilypond + +@node Diversos pentagrames +@subsection Diversos pentagrames +@translationof Multiple staves + +@cindex diversos pentagrames +@cindex pentagrames, diversos +@cindex context +@cindex context de notació +@cindex notació, context de + +@funindex \new Staff +@funindex Staff +@funindex \new +@funindex Score +@funindex Voice +@funindex Lyrics +@funindex ChordNames + +Com ja hem vist a @ref{Explicació de les expressions musicals}, +els fitxers d'entrada per al LilyPond es construeixen a base +d'expressions musicals. Si la partitura comença amb expressions +musicals simultànies, el LilyPond crea diversos pentagrames. És +més fàcil, no obstant, veure el que passa si creem cada u dels +pentagrames de forma explícita. + +Per imprimir més d'un pentagrama, cada fragment de música que +constitueix un pentagrama es marca escrivint @code{\new Staff} +abans d'ell. Aquests elements @code{Staff} es combinen després en +paral·lel amb @code{<<} y @code{>>}: + +@lilypond[verbatim,quote] +<< + \new Staff { \clef "treble" c''4 } + \new Staff { \clef "bass" c4 } +>> +@end lilypond + +L'ordre @code{\new} inaugura un @q{context de notació}. Un +context de notació és un entorn dins del què s'interpreten els +esdeveniments musicals (com les notes o les ordres @code{\clef}). +Per peces senzilles, els contextos d'aquest tipus es creen +automàticament. Per a peces més complicades, és millor marcar els +contextos de forma explícita. + +Hi ha diverses classes de contextos. @code{Score}, @code{Staff} i +@code{Voice} gestionen la notació melòdica, mentre que +@code{Lyrics} s'ocupa dels textos cantats i @code{ChordNames} +imprimeix els noms dels acords. + +En termes de sintaxi, l'anteposició de @code{\new} a una expressió +musical crea una expressió musical major. És semblant al signe +menys de les matemàtiques. La fórmula @math{(4+5)} és una +expressió, per tant @math{-(4+5)} és una expressió més àmplia. + +Les indicacions de compàs escrites a un pentagrama afecten la +resta d'ells, de forma predeterminada. En canvi, l'armadura de la +tonalitat d'un pentagrama @emph{no} afecta als altres +pentagrames. Aquest comportament predeterminat diferent és a causa +de què les partitures amb instruments transpositors són més +comunes que les partitures polirítmiques. + +@lilypond[verbatim,quote] +<< + \new Staff { \clef "treble" \key d \major \time 3/4 c''4 } + \new Staff { \clef "bass" c4 } +>> +@end lilypond + + +@node Grups de pentagrames +@subsection Grups de pentagrames +@translationof Staff groups + +@cindex sistema de piano +@cindex piano, sistema de +@cindex sistema de cor +@cindex cor, sistema de +@cindex grup de pentagrames +@cindex pentagrames, grup de + +@funindex PianoStaff +@funindex GrandStaff +@funindex ChoirStaff + +Glossari musical: +@rglos{brace}, +@rglos{staff}, +@rglos{system}. + +La música per a piano es composa tipogràficament en forma de dos +pentagrames units mitjançant un @notation{claudàtor}. L'aspecte +imprès d'aquest sistema de pentagrames se sembla a l'exemple +polifònic que apareix a @ref{Diversos pentagrames}, però en aquest +cas l'expressió completa es col·loca dins d'un @code{PianoStaff}: + +@example +\new PianoStaff << + \new Staff @dots{} + \new Staff @dots{} +>> +@end example + +Heus aquí un petit exemple: + +@lilypond[verbatim,quote] +\new PianoStaff << + \new Staff \relative { \time 2/4 c''4 e | g g, | } + \new Staff \relative { \clef "bass" c4 c' | e c | } +>> +@end lilypond + +Altres grups de pentagrames es declaren mitjançant @code{\new +GrandStaff}, que és apropiat per a partitures orquestrals, i +@code{\new ChoirStaff}, que és apropiat per a partitures +vocals. Cadascú d'aquests grups de pautes forma un tipus de +context diferent, que produeix el claudàtor a l'esquerra i que +també controla l'abast de les línies divisòries. + +@seealso +Referència de la notació: +@ruser{Keyboard and other multi-staff instruments}, +@ruser{Displaying staves}. + +@node Combinar notes per formar acords +@subsection Combinar notes per formar acords +@translationof Combining notes into chords + +Glossari musical: +@rglos{chord}. + +@cindex acords +@cindex duracions de notes en acords + +@funindex < +@funindex > +@funindex < ... > + +Hem vist amb anterioritat com es poden combinar les notes formant +@notation{acordes} que indiquen que són simultànies, tancant-les +entre dobles angles. La forma normal d'indicar un acord, però, és +tancar les notes entre angles @emph{senzills}. Observeu que totes +les notes d'un acord han de tenir la mateixa duració, i que la +duració s'escriu després de l'angle de tancament. + +@lilypond[verbatim,quote] +\relative { r4 2 } +@end lilypond + +Hem de pensar que els acords són quelcom gairebé equivalent a les +notes senzilles: gairebé tot el es pot adjuntar a una nota es pot +adjuntar també a un acord, i tot ha d'anar @emph{per fora} dels +angles. Per exemple, podeu combinar marques com ara barres i +lligadures, amb acords. Tan sols heu de recordar que s'escriuen +per fora dels angles. + +@lilypond[verbatim,quote] +\relative { + r4 ~ 2 | + 8[ ] + 8\>[ ]\! | + r4 8.\p 16( 4-. ) | +} +@end lilypond + +@seealso +Referència de la notació: +@ruser{Chorded notes}. + + +@node Polifonia a un sol pentagrama +@subsection Polifonia a un sol pentagrama +@translationof Single staff polyphony + +@cindex polifonia +@cindex diverses veus +@cindex veus, més, en un sol pentagrama +@cindex únic, polifonia en pentagrama +@cindex separador, silenci +@cindex silenci separador + +@funindex << ... \\ ... >> +@funindex << +@funindex \\ +@funindex >> + +La música polifònica al LilyPond, tot i que no és difícil, utilitza +conceptes que encara no hem tractat, per la qual cosa no les +presentarem en aquest moment. En comptes d'això, les seccions +següents presenten aquests conceptes i els expliquen en +profunditat. + +@seealso +Manual d'aprenentatge: +@ref{Les veus contenen música}. + +Referència de la notació: +@ruser{Simultaneous notes}. + + +@node Cançons +@section Cançons +@translationof Songs + +En aquesta secció presentem com elaborar música vocal i fulls +senzilles de cançó. + +@menu +* Elaborar cançons senzilles:: +* Alineació de la lletra a una melodia:: +* Lletra en diversos pentagrames:: +@end menu + + +@node Elaborar cançons senzilles +@subsection Elaborar cançons senzilles +@translationof Setting simple songs + +@cindex lletra +@cindex cançons + +@funindex \addlyrics + +Glossari musical: +@rglos{lyrics}. + +Presentem a continuació l'inici de la melodia d'una cançó +infantil, @qq{Girls and boys come out to play}: + +@lilypond[verbatim,quote] +\relative { + \key g \major + \time 6/8 + d''4 b8 c4 a8 | d4 b8 g4 +} +@end lilypond + +Es pot assignar la @notation{lletra} a aquestes notes combinant +ambdues amb la paraula clau @code{\addlyrics}. La lletra s'escriu +separant cada síl·laba mitjançant un espai. + +@lilypond[verbatim,quote] +<< + \relative { + \key g \major + \time 6/8 + d''4 b8 c4 a8 | d4 b8 g4 + } + \addlyrics { + Girls and boys come | out to play, + } +>> +@end lilypond + +Observeu els angles dobles @w{@code{<<@dots{}>>}} al voltant del +fragment sencer per expressar que la música i la lletra han de +succeir al mateix temps. + +@node Alineació de la lletra a una melodia +@subsection Alineació de la lletra a una melodia +@translationof Aligning lyrics to a melody + +@cindex melisma +@cindex línia de extensió +@cindex guió +@cindex guió baix +@cindex lletra, alineació de +@cindex alineació de la lletra +@cindex lletra, paraules polisíl·labes +@cindex paraules polisíl·labes en la lletra + +Glossari musical: +@rglos{melisma}, +@rglos{extender line}. + +La següent línia de la cançó infantil és @notation{The moon doth +shine as bright as day}. A continuació l'ampliarem: + +@lilypond[verbatim,quote] +<< + \relative { + \key g \major + \time 6/8 + d''4 b8 c4 a8 | d4 b8 g4 g8 | + a4 b8 c b a | d4 b8 g4. | + } + \addlyrics { + Girls and boys come | out to play, + The | moon doth shine as | bright as day; | + } +>> +@end lilypond + +Si compilem el codi de l'exemple anterior, veurem alguns missatges +d'advertiment sobre la consola: + +@example +song.ly:12:29: warning: la comprovació de compàs ha fallat a: 5/8 + The | moon doth shine as + | bright as day; | +song.ly:12:46: warning: la comprovació de compàs ha fallat a: 3/8 + The | moon doth shine as | bright as day; + | +@end example + +Aquest és un bon exemple de la utilitat de les comprovacions de +compàs. Ara bé, si mirem la música, podem observar que la lletra +addicional no s'alinea correctament amb les notes. La paraula +@q{shine} s'ha de cantar sobre dues notes, no una. Això es coneix +com @notation{melisma}, una síl·laba única que es canta sobre més +d'una nota. Existeixen diverses formes de fer que una síl·laba +recaigui sobre diverses notes, sent la més senzilla escriure una +lligadura d'expressió sobre elles (vegeu @ref{Lligadures d'unió i d'expressió}): + +@lilypond[verbatim,quote] +<< + \relative { + \key g \major + \time 6/8 + d''4 b8 c4 a8 | d4 b8 g4 g8 | + a4 b8 c( b) a | d4 b8 g4. | + } + \addlyrics { + Girls and boys come | out to play, + The | moon doth shine as | bright as day; | + } +>> +@end lilypond + +Ara la lletra s'alinea correctament amb les notes, però el barrat +automàtic de les notes que corresponen a @notation{shine as} no +sembla correcte. Podem remeiar-lo inserint instruccions de +barrat manual per sobreescriure el barrat automàtic; per veure més +detalls consulteu @ref{Barres automàtiques i manuals}. + +@lilypond[verbatim,quote] +<< + \relative { + \key g \major + \time 6/8 + d''4 b8 c4 a8 | d4 b8 g4 g8 | + a4 b8 c([ b]) a | d4 b8 g4. | + } + \addlyrics { + Girls and boys come | out to play, + The | moon doth shine as | bright as day; | + } +>> +@end lilypond + +Com alternativa a la utilització de lligadures d'expressió, els +melismes es poden indicar solament a la lletra utilitzant un guió +baix, @code{_}, per a cada nota que volem incloure dins del +melisma: + +@lilypond[verbatim,quote] +<< + \relative { + \key g \major + \time 6/8 + d''4 b8 c4 a8 | d4 b8 g4 g8 | + a4 b8 c[ b] a | d4 b8 g4. | + } + \addlyrics { + Girls and boys come | out to play, + The | moon doth shine _ as | bright as day; | + } +>> +@end lilypond + +Si una síl·laba s'estén sobre diverses notes o una sola nota molt +llarga, normalment es traça una @notation{línia extensora} des de +la síl·laba que s'estén i per sota de totes les notes que +corresponen a aquesta síl·laba. S'escriu com dos guions baixos +@code{__}. Heus aquí un exemple extret dels primers tres +compassos del @notation{Lament de Dido}, de @notation{Dido i +Enees} de Purcell: + +@lilypond[verbatim,quote] +<< + \relative { + \key g \minor + \time 3/2 + g'2 a bes | bes2( a) b2 | + c4.( bes8 a4. g8 fis4.) g8 | fis1 + } + \addlyrics { + When I am | laid, + am | laid __ in | earth, + } +>> +@end lilypond + +Fins al moment, cap dels exemples implicaven paraules que +tinguessin més d'una síl·laba. Aquestes paraules es reparteixen +en general a raó d'una nota per cada síl·laba, amb guions curts +entre les síl·labes. Aquests guions separadors es teclegen com +dos guions, amb el resultat d'un guió curt centrat entre les +síl·labes. Presentem a continuació un exemple que demostra això i +tot el que hem après fins aquest moment sobre l'alineació de la +lletra a les notes. + +@c no ragged-right here because otherwise the hyphens get lost, +@c but the example is long enough to avoid looking strange. +@lilypond[verbatim,quote,noragged-right] +<< + \relative { + \key g \major + \time 3/4 + \partial 4 + d'4 | g4 g a8( b) | g4 g b8( c) | + d4 d e | c2 + } + \addlyrics { + A -- | way in a __ | man -- ger, + no __ | crib for a | bed, __ + } +>> +@end lilypond + +Alguns textos (especialment els que estan en italià o català) +requereixen el contrari: col·locar més d'una síl·laba a una única +nota. Això s'aconsegueix enllaçant les síl·labes entre sí +mitjançant un guió baix simple @code{_} (sense cap espai), o bé +envoltant-les entre claudàtors. Aquí apareix un exemple procedent +del @notation{Barber de Sevilla} de Rossini, on la síl·laba +@notation{al} es canta sobre la mateixa nota que la síl·laba +@notation{go} de la paraula @q{Largo} a l'ària de Fígaro +@notation{Largo al factotum}: + +@c no ragged-right here because otherwise the hyphens get lost, +@c but the example is long enough to avoid looking strange. +@lilypond[verbatim,quote,noragged-right] +<< + \relative { + \clef "bass" + \key c \major + \time 6/8 + c'4.~ 8 d b | c8([ d]) b c d b | c8 + } + \addlyrics { + Lar -- go_al fac -- | to -- tum del -- la cit -- | tà + } +>> +@end lilypond + + +@seealso +Referència de la notació: +@ruser{Vocal music}. + + +@node Lletra en diversos pentagrames +@subsection Lletra en diversos pentagrames +@translationof Lyrics to multiple staves + +@cindex lletra i diversos pentagrames +@cindex diversos pentagrames i lletra + +La solució senzilla que utilitza @code{\addlyrics} es pot usar per +posar lletra a més d'un pentagrama. Aquí apareix un exemple tret +del @notation{Judas Macabeu} de Haendel: + +@lilypond[verbatim,quote] +<< + \relative { + \key f \major + \time 6/8 + \partial 8 + c''8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ 4 + } + \addlyrics { + Let | flee -- cy flocks the | hills a -- | dorn, __ + } + \relative { + \key f \major + \time 6/8 + \partial 8 + r8 | r4. r4 c'8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 + } + \addlyrics { + Let | flee -- cy flocks the | hills a -- dorn, + } +>> +@end lilypond + +Qualsevol partitura d'una complexitat més gran que la d'aquest +senzill exemple es fa millor separant la lletra de l'estructura de +pentagrames mitjançant variables (expressions amb nom). Les +variables es tracten a @ref{Organitzar les peces mitjançant +variables}. + +@seealso +Referència de la notació: +@ruser{Vocal music}. + + +@node Retocs finals +@section Retocs finals +@translationof Final touches + +Aquest és l'últim apartat del tutorial; mostra la forma de donar +els retocs finals a peces senzilles, i ofereix una introducció a +la resta del manual. + +@menu +* Organitzar les peces mitjançant variables:: +* Afegir títols:: +* Noms de nota absoluts:: +* Més enllà del tutorial:: +@end menu + + +@node Organitzar les peces mitjançant variables +@subsection Organitzar les peces mitjançant variables +@translationof Organizing pieces with variables + +@cindex variables +@cindex variables, definir +@cindex identificadors +@cindex macros +@cindex assignació de variables +@cindex ús de les variables +@cindex variables, ús de +@cindex variables, caràcters permesos en +@cindex caràcters permesos en variables + +Quan els elements que hem discutit anteriorment es combinen per +produir fitxers més grans, les expressions musicals es fan +enormes. A la música polifònica amb molts pentagrames, els +fitxers d'entrada poden tornar-se molt propensos a la confusió, +Podem reduir aquesta confusió utilitzant les @emph{variables}. + +Amb les variables (també conegudes com identificadors o macros), +podem trossejar les expressions musicals complexes. Una variable +s'assigna de la manera següent: + +@example +musicaAmbNom = @{ @dots{} @} +@end example + +El contingut de l'expressió musical @code{musicaAmbNom} es pot +usar posteriorment col·locant una barra invertida davant del nom +(@code{\musicaAmbNom}, igual que una ordre normal del LilyPond). + +@lilypond[verbatim,quote] +violin = \new Staff { + \relative { + a'4 b c b + } +} + +cello = \new Staff { + \relative { + \clef "bass" + e2 d + } +} + +{ + << + \violin + \cello + >> +} +@end lilypond + +@noindent +El nom d'una variable ha de consistir enterament de caràcters +alfabètics, és a dir sense números, guions, ni guions baixos. + +Les variables s'han de definir @emph{abans} de l'expressió musical +principal, però es poden usar tantes vegades com es vulgui, en +qualsevol lloc, un cop que han estat definides. Fins i tot es +poden usar dins de la definició d'una altra variable, +proporcionant una via per escurçar el codi si una secció musical +es repeteix moltes vegades. + +@c KEEP LY +@lilypond[verbatim,quote,ragged-right] +tresilloA = \tuplet 3/2 { c,8 e g } +compasA = { \tresilloA \tresilloA \tresilloA \tresilloA } + +\relative c'' { + \compasA \compasA +} +@end lilypond + +Les variables es poden usar per a molts altres tipus d'objectes +dins del codi d'entrada. Per exemple, + +@example +ancho = 4.5\cm +nombre = "Wendy" +papelAcinco = \paper @{ paperheight = 21.0 \cm @} +@end example + +Depenent del seu contingut, la variable es pot usar en diferents +llocs. El següent exemple utilitza les variables anteriors: + +@example +\paper @{ + \papelAcinc + line-width = \ample +@} + +@{ + c4^\nom +@} +@end example + + +@node Afegir títols +@subsection Afegir títols +@translationof Adding titles + +@cindex títol +@cindex encapçalaments +@cindex bloc d'encapçalaments + +@funindex \header + +La informació sobre el títol, autor, número d'Opus i altres +elements similars s'escriuen al bloc @code{\header}. Aquest bloc +es troba fora de l'expressió musical principal: el bloc +@code{\header} normalment s'ubica per sota del número de versió. + +@example +\version @w{"@version{}"} + +\header @{ + title = "Sinfonia" + composer = "Jo" + opus = "Op. 9" +@} + +@{ + @dots{} música @dots{} +@} +@end example + +Quan es processa el fitxer, el títol i l'autor s'imprimeixen a +sobre de la música. Podeu obtenir més informació sobre els títols +a @ruser{Creating titles headers and footers}. + +@node Noms de nota absoluts +@subsection Noms de nota absoluts +@translationof Absolute note names + +@cindex notes, noms de +@cindex notes, noms absoluts de +@cindex absolut, mode +@cindex absoluts, valors d'altura +@cindex altures, valors absoluts d' +@cindex absoluts, noms de nota + +Fins al moment sempre hem utilitzat @code{\relative} per definir +les altures. Aquesta és normalment la forma més ràpida d'escriure +la major part de la música. Sense @code{\relative}, les altures +s'interpreten en mode absolut. + +En aquest mode, el LilyPond tractarà totes les altures com valors +absoluts. Una @code{c'} significarà sempre un Do central, +una @code{b} significarà sempre la nota immediatament per sota del +Do central i una @code{g,} significarà sempre la nota que es +col·loca a la primera línia del pentagrama en clau de Fa. + +@lilypond[verbatim,quote] +{ + \clef "bass" + c'4 b g, g, | + g,4 f, f c' | +} +@end lilypond + +Heus aquí una escala que abasta quatre octaves: + +@lilypond[verbatim,quote] +{ + \clef "bass" + c,4 d, e, f, | + g,4 a, b, c | + d4 e f g | + a4 b c' d' | + \clef "treble" + e'4 f' g' a' | + b'4 c'' d'' e'' | + f''4 g'' a'' b'' | + c'''1 | +} +@end lilypond + +Com podeu veure, escriure una melodia en clau de Sol implica +escriure una gran quantitat d'apòstrofs @q{'} . Considerem aquest +fragment de Mozart: + +@lilypond[verbatim,quote] +{ + \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 + +Tots aquests apòstrofs fan gairebé illegible el codi d'entrada i +serà origen de nombrosos errors. Amb @code{\relative}, l'exemple +anterior és molt més fàcil de llegir: + +@lilypond[verbatim,quote] +\relative { + \key a \major + \time 6/8 + cis''8. d16 cis8 e4 e8 | + b8. cis16 b8 d4 d8 | +} +@end lilypond + +Si feu un error amb una marca d'octava (@code{'} o @code{,}) +mentre treballeu al mode @code{\relative}, serà molt obvi (moltes +notes estaran a l'octava equivocada). Mentre treballeu en mode +absolut, una sola fallada no serà tan visible, i tampoc no serà +tan fàcil de localitzar. + +El mode absolut és útil però per escriure música que contingui +intervals grans, i serà extremadament útil per fer fitxers del +LilyPond generats per ordinador. Quan es copien i peguen +fragments melòdics, el mode absolut preserva l'octava del material +original. + +A vegades la música es disposa en formes més complexes. Si esteu +usant @code{\relative} dins de @code{\relative}, les seccions +relatives externa i interna són independents: + +@lilypond[verbatim,quote] +\relative { c'4 \relative { f'' g } c } +@end lilypond + +@funindex \absolute +Si esteu usant música absoluta dins d'un bloc de música relativa, +tindreu que marcar la música absoluta explícitament amb la +instrucció @code{\absolute} per evitar que s'incorpori a la música +relativa: + +@lilypond[verbatim,quote] +\relative { c'4 \absolute { f'' g'' } c } +@end lilypond + +@node Més enllà del tutorial +@subsection Més enllà del tutorial +@translationof After the tutorial + +Després d'acabar el tutorial, potser hauríeu de provar a escriure +una o dues peces. Comenceu amb una de les plantilles que +apareixen a @rlearningnamed{Templates,Plantilles} i afegiu algunes +notes. Si necessiteu un tipus de notació que no ha estat tractat +en aquest tutorial, doneu una ullada a la Referència de Notació, +començant per @ruser{Musical notation}. Si voleu escriure música +per a un conjunt instrumental que no estigui cobert per cap +plantilla, consulteu @ref{Extensió de les plantilles}. + +Un cop que heu escrit algunes peces curtes, llegiu la resta del +Manual d'aprenentatge (capítols 3 al 5). Per suposat no passa res +per llegir-lo ara mateix! La resta del Manual d'Aprenentatge, +però, dona per suposat que teniu familiaritat amb l'entrada del +LilyPond. Podeu saltar-vos aquests capítols ara i tornar a ells +quan hagueu adquirit més experiència. + +En aquest tutorial i a la resta del Manual d'Aprenentatge, hi ha +un apartat @strong{Vegeu també} al final de cada una de les +seccions, que conté referències creuades a altres seccions: no +seguiu aquestes referències durant la primera lectura: quan hagueu +llegit el Manual d'Aprenentatge complet, potser desitgeu rellegir +certes seccions i seguir les referències creuades per obtenir més +informació. + +Si no ho heu fet ja, us @emph{preguem} que llegiu @ref{Panoràmica +dels manuals}. Hi ha una gran quantitat d'informació sobre el +LilyPond, de manera que els nouvinguts amb freqüència no saben +exactament on han de buscar l'ajuda. Si dediqueu cinc minuts a +llegir curosament aquesta secció us estalviareu hores de +frustració buscant al lloc equivocat! diff --git a/Documentation/ca/learning/fundamental.itely b/Documentation/ca/learning/fundamental.itely new file mode 100644 index 0000000000..53bc51d22d --- /dev/null +++ b/Documentation/ca/learning/fundamental.itely @@ -0,0 +1,3319 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- + +@ignore + Translation of GIT committish: 7fdce4f39834cc8c83f176480cc1d20900eb09f8 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c \version "2.19.22" + +@node Conceptes fonamentals +@chapter Conceptes fonamentals +@translationof Fundamental concepts + +Heu pogut veure al tutorial com produir música impresa amb bellesa +a partir d'un simple fitxer de text. Aquesta secció presenta els +conceptes i tècniques que es requereixen per produir partitures +igualment belles però més complexes. + +@menu +* Com funcionen els fitxers d'entrada del LilyPond:: +* Les veus contenen música:: +* Contextos i gravadors:: +* Extensió de les plantilles:: +@end menu + + +@node Com funcionen els fitxers d'entrada del LilyPond +@section Com funcionen els fitxers d'entrada del LilyPond +@translationof How LilyPond input files work + +El format d'entrada del LilyPond és força lliure en la seva forma +i concedeix els usuaris amb experiència molta flexibilitat per +estructurar els seus fitxers de la forma desitjada. Nogensmenys, +tota aquesta flexibilitat pot fer que les coses es tornin confuses +per als nous usuaris. Aquesta secció us explicarà part d'aquesta +estructura, però pot obviar certs detalls per simplificar. Per +veure una descripció més completa del format d'entrada, consulteu +@ruser{File structure}. + + +@menu +* Introducció a l'estructura dels fitxers del LilyPond:: +* La partitura és una (única) expressió musical composta:: +* Niuat d'expressions musicals:: +* Quant a la impossibilitat de niuar claudàtors i lligadures:: +@end menu + +@node Introducció a l'estructura dels fitxers del LilyPond +@subsection Introducció a l'estructura dels fitxers del LilyPond +@translationof Introduction to the LilyPond file structure + +@cindex entrada, format de l' +@cindex fitxer, estructura del + +Un exemple bàsic de fitxer d'entrada del LilyPond és el següent: + +@example +\version @w{"@version{}"} + +\header @{ @} + +\score @{ + @var{ @dots{} expressió musical composta @dots{} } % tota la música va aquí + \layout @{ @} + \midi @{ @} +@} +@end example + +@noindent +Hi ha moltes variacions d'aquest esquema bàsic, però l'exemple +constitueix un punt de partida útil. + +@funindex \book +@funindex \score +@cindex book (llibre) +@cindex score (partitura) +@cindex llibre +@cindex partitura + +Fins al moment, cap dels exemples que heu pogut veure utilitza la +instrucció @code{\score@{@}}. Això és així perquè el LilyPond +afegeix automàticament les ordres addicionals que es requereixen +quan li proporcionem una entrada senzilla. El LilyPond tracta una +entrada com aquesta: + +@example +\relative @{ + c''4 a d c +@} +@end example + +@noindent +com una abreviatura d'aquesta altra: + +@example +\book @{ + \score @{ + \new Staff @{ + \new Voice @{ + \relative @{ + c''4 a b c + @} + @} + @} + \layout @{ @} + @} +@} +@end example + +En altres paraules, si l'entrada consta d'una única expressió +musical, el LilyPond interpreta el fitxers com si l'expressió +musical estigués rodejada per un embolcall fet per les +instruccions que acabem de veure. + +@cindex contextos implícits +v@cindex implícits, contextos + +@strong{¡Advertiment!} Molts dels exemples que apareixen a la +documentació del LilyPond ometen les instruccions @code{\new +Staff} i @code{\new Voice}, deixant que es creïn de forma +implícita. Això funciona bé per a exemples senzills, però per a +exemples més complicats, especialment quan s'usen instruccions +addicionals, la creació implícita dels contextos poden donar lloc +a resultats inesperats, fins i tot en ocasions crear pentagrames +no desitjats. La forma de crear contextos de forma explícita +s'explica a @ref{Contextos i gravadors}. + +@warning{Quan s'escriuen més d'unes poques línies de música, es +recomana crear sempre els pentagrames i les veus de forma +explícita.} + +En tot cas, per ara anem a tornar al primer exemple per examinar +l'ordre @code{\score}, deixant les altres en la seva forma +predeterminada. + +Un bloc @code{\score} sempre ha de contenir una expressió musical +única, que ha d'aparèixer immediatament després de la instrucció +@code{\score}. Recordeu que una expressió musical pot ser +qualsevol cosa, des d'una sola nota fina una enorme expressió +composta com ara + +@example +@{ + \new StaffGroup << + @var{ @dots{} inseriu aquí la partitura completa d'una òpera + de Wagner @dots{} } + >> +@} +@end example + +@noindent +A causa que tot es troba dins de @code{@{ @dots{} @}}, compta com +una expressió musical. + +Com hem vist anteriorment, el bloc @code{\score} pot contenir +altres coses, com ara + +@example +\score @{ + @{ c'4 a b c' @} + \header @{ @} + \layout @{ @} + \midi @{ @} +@} +@end example + +@funindex \header +@funindex \layout +@funindex \midi +@cindex midi +@cindex capçalera +@cindex disposició + +@noindent +Observeu que aquestes tres instruccions (@code{\header}, +@code{\layout} i @code{\midi}) són especials: a diferència de la +resta de les instruccions que comencen amb una barra invertida +(@code{\}), @emph{no} són expressions musicals i no formen part de +cap expressió musical. Per tant, es poden posar dins d'un bloc +@code{\score} o a fora d'ell. De fet, aquestes instruccions se +situen en general fora del bloc @code{\score} (per exemple, +@code{\header} se sol col·locar abans de la instrucció +@code{\score}, com mostra l'exemple que apareix al principi de la +secció.) + +Dues instruccions més que no hem vist són @code{\layout @{ @}} +i @code{\midi @{ @}}. Si apareixen tal i com es mostren aquí, fan +que el LilyPond produeixi una sortida impresa i una sortida MIDI, +respectivament. Es descriuen amb tot detall al manual de +Referència de la notació, a @ruser{Score layout} i a +@ruser{Creating MIDI files}. + +@cindex partitures, diverses +@cindex book, bloc implícit +@cindex implícit, bloc book +@funindex \book + +Podem escriure diversos blocs @code{\score}. Cada un d'ells rebrà +el mateix tractament que una partitura independent, però es +combinaran tots junts a un fitxer de sortida únic. No fa falta +cap instrucció @code{\book}, es crearà un implícitament. No +obstant, si voleu fitxers de sortida separats a partir d'un únic +fitxer @file{.ly}, aleshores cal utilitzar l'ordre +@code{\book} per separar les diferents seccions: cada bloc +@code{\book} produeix un fitxer de sortida diferent. + +En resum: + +Cada bloc @code{\book} crea un fitxer de sortida diferent (per +exemple, un fitxer PDF). Si no hem escrit un de forma explícita, +el LilyPond envolta tot el nostre codi d'entrada dins d'un bloc +@code{\book} de forma implícita. + +Cada bloc @code{\score} és un tros de música separat dins d'un +bloc @code{\book}. + +@cindex layout, efecte de la situació del bloc + +Cada bloc @code{\layout} afecta el bloc @code{\score} o +@code{\book} dins del qual apareix (és a dir, un bloc +@code{\layout} dins d'un bloc @code{\score}) afecta solament a +aquest bloc @code{\score}, però un bloc @code{\layout} fora d'un +bloc @code{\score} (que per això està dins d'un bloc +@code{\book}, ja sigui explícit o implícitament) afecta als blocs +@code{\score} que estan dins d'aquest @code{\book}. + +Per veure més detalls, consulteu @ruser{Multiple scores in a book}. + +@cindex variables + +Una altra magnifica drecera és la possibilitat de definir +variables com es mostra a @ref{Organitzar les peces mitjançant +variables}. Totes les plantilles fan servir el següent: + +@example +melodia = \relative @{ + c'4 a b c +@} + +\score @{ + \melodia +@} +@end example + +Quan el LilyPond examina aquest fitxer, agafa el valor de +@code{melodia} (tot el que hi ha després del signe igual) i +l'insereix a tot arreu que veu @code{\melodia}. No es requereix +una cura especial amb el nom (pot ser @code{melodia}, +@code{global}, @code{CompasArmadura}, @code{madretadelpiano} o +@code{fulanet} o qualsevol altre). Recordeu que pot ser gairebé +qualsevol nom que se us acudeixi, sempre i quan contingui sols +caràcters alfabètics i sigui diferent a qualsevol dels noms +d'instrucció del LilyPond. Per veure més detalls, consulteu +@ref{Estalvi de tecleig mitjançant variables i funcions}. Les +limitacions exactes que afecten els noms de variable es detallen a +@ruser{File structure}. + + +@seealso +Per veure una definició completa del format del codi d'entrada, +consulteu @ruser{File structure} + +@node La partitura és una (única) expressió musical composta +@subsection La partitura és una (única) expressió musical composta +@translationof Score is a (single) compound musical expression + +@cindex score +@cindex partitura +@cindex contingut del bloc score +@cindex score, contingut del bloc +@cindex composta, expressió musical +@cindex musical, expressió, composta +@cindex expressió musical composta +@funindex \score + +En la secció anterior, @ref{Introducció a l'estructura dels +fitxers del LilyPond}, hem pogut veure l'organització general dels +fitxers d'entrada del LilyPond. Però sembla que ens hem salta la +part més important: com esbrinem què escriure després de +@code{\score}? + +No ens hem salta res de res. El gran misteri és, senzillament, +que no hi ha @emph{cap} misteri. La línia següent ho explica tot: + +@quotation +@emph{Un bloc @code{\score} ha de començar amb una expressió +musical composta.} +@end quotation + +@noindent +Per comprendre el que s'entén per expressió musical i expressió +musical composta, potser trobeu útil fer un repàs al tutorial, +@ref{Explicació de les expressions musicals}. En aquesta secció +vam veure com elaborar grans expressions musicals a partir de +petites peces (començàvem amb notes, després acords, etc.). Ara +partirem d'una gran expressió musical i recorrerem el camí invers +cap avall. Per simplicitat, farem sols un cantant i un piano. +No necessitem un @code{StaffGroup} (que simplement agrupa un cert +nombre de pautes amb un claudàtor a l'esquerra) per a aquest +conjunt, i aleshores el retirem. Tot i així, @emph{sí} necessitem +pentagrames per a un cantant i un piano. + +@example +\score @{ + << + \new Staff = "cantant" << + >> + \new PianoStaff = "piano" << + >> + >> + \layout @{ @} +@} +@end example + +Aquí hem assignat noms als pentagrames: @qq{cantant} i +@qq{piano}. Això no és essencial en aquest moment, però és un +hàbit que resulta útil cultivar de manera que podem saber d'una +ullada per a què és cada pentagrama. + +Recordeu que utilitzem @code{<< @dots{} >>} en comptes de @code{ @dots{} @}} +per presentar la música simultània. Això fa que les parts vocals +i del piano apareguin una sobre l'altra a la partitura. La +construcció @code{<< @dots{} >>} no seria necessària per al +pentagrama del cantant a l'exemple de dalt si conté solament una +expressió musical seqüencial, però es necessitarien els @code{<< +@dots{} >>} en comptes de les claus si la música d'aquest +pentagrama anés a contenir dues o més expressions simultànies, per +exemple dues veus simultànies, o una veu amb lletra. Tindrem una +veu amb lletra, per la qual cosa es requereixen els angles +dobles. Després afegirem quelcom de música real; per ara +limitem-nos a posar unes quantes notes i text de farciment. Si +heu oblidat com afegir la lletra, podeu rellegir la secció +@code{\addlyrics} de @ref{Elaborar cançons senzilles}. + +@lilypond[verbatim,quote,ragged-right] +\score { + << + \new Staff = "singer" << + \new Voice = "vocal" { c'1 } + \addlyrics { And } + >> + \new PianoStaff = "piano" << + \new Staff = "upper" { c'1 } + \new Staff = "lower" { c'1 } + >> + >> + \layout { } +} +@end lilypond + +Ara tenim molts més detalls. Tenim la pauta del cantant: conté +una @code{Voice} o veu (al LilyPond, aquest terme fa referència a +un conjunt de notes, no necessàriament notes vocals -- per +exemple, un violí generalment toca una veu --) i el text de la +cançó. També tenim una pauta de piano: conté un pentagrama +superior (mà dreta) i un pentagrama inferior (mà esquerra), tot i +que el pentagrama inferior encara no té la clau de Fa. + +En aquest moment podríem començar a ficar les notes. Dins dels +claudàtors que segueixen a @code{\new Voice = "vocal"}, podríem +començar escrivint + +@example +\relative @{ + r4 d''8\noBeam g, c4 r +@} +@end example + +Però si ho féssim, la secció @code{\score} es faria força llarga i +seria més difícil comprendre el que passa. En comptes d'això +utilitzarem identificadors o variables. Recordareu que les vam +veure per primer cop a la secció anterior. + +Per assegurar-nos que el contingut de la variable @code{text} +s'interpreta com a lletra, el precedim amb @code{\lyricmode}. +Igual que @code{\addlyrics}, això activa el mode d'entrada de +lletra. Sense això, el LilyPond intentaria interpretar el +contingut com a notes, cosa que generaria errors (Hi ha d'altres +modes, vegeu @ruser{Input modes}). + +Així doncs, tot escrivint algunes notes, i una clau de Fa per a la +mà esquerra, ara tenim un fragment musical de debò: + +@lilypond[verbatim,quote,ragged-right] +melody = \relative { r4 d''8\noBeam g, c4 r } +text = \lyricmode { And God said, } +upper = \relative { 2~ } +lower = \relative { b,2 e } + +\score { + << + \new Staff = "singer" << + \new Voice = "vocal" { \melody } + \addlyrics { \text } + >> + \new PianoStaff = "piano" << + \new Staff = "upper" { \upper } + \new Staff = "lower" { + \clef "bass" + \lower + } + >> + >> + \layout { } +} +@end lilypond + +Quan escriviu una secció @code{\score} o quan l'esteu llegint, +feu-lo a poc a poc i amb cura. Comenceu pel nivell exterior i +després treballeu sobre cadascú dels nivells interiors. També és +d'una gran ajuda ser molt estricte amb els marges (assegureu-vos +que al seu editor de text cada element del mateix nivell comença a +la mateixa posició horitzontal). + +@seealso +Referència de la notació: +@ruser{Estructura d'una partitura}. + + +@node Niuat d'expressions musicals +@subsection Niuat d'expressions musicals +@translationof Nesting music expressions + +@cindex pentagrames temporals +@cindex temporals, pentagrames +@cindex ossias + +No és essencial declarar tots els pentagrames al començament; es +poden crear temporalment en qualsevol moment. Això és d'especial +utilitat per crear seccions d'ossia (vegeu @rglos{ossia}). A +continuació presentem un exemple senzill que mostra com introduir +temporalment un pentagrama nou mentre dura un fragment de tres +notes: + +@lilypond[verbatim,quote,ragged-right] +\new Staff { + \relative { + r4 g'8 g c4 c8 d | + e4 r8 + << + { f8 c c } + \new Staff { + f8 f c + } + >> + r4 | + } +} +@end lilypond + +@noindent +Noteu que la mida de la clau és igual a la que s'imprimeix en un +canvi de clau (lleugerament més petita que la clau al principi +d'una línia). Això és normal per a qualsevol clau que +s'imprimeixi a la meitat d'una línia. + +@cindex pentagrama, posicionat del + +La secció ossia es pot col·locar a sobre del pentagrama de la +manera següent: + +@lilypond[verbatim,quote,ragged-right] +\new Staff = "main" { + \relative { + r4 g'8 g c4 c8 d | + e4 r8 + << + { f8 c c } + \new Staff \with { + alignAboveContext = #"main" + } { f8 f c } + >> + r4 | + } +} +@end lilypond + +Aquest exemple utilitza @code{\with}, que s'explica en tot detall +més endavant. És un mitjà per modificar el comportament +predeterminat d'un sol pentagrama. En aquest exemple, diu que el +pentagrama nou s'ha de col·locar per sobre del pentagrama anomenat +@qq{main} en comptes de la posició predeterminada que seria per sota. + +@seealso +Els fragments d'ossia s'escriuen sovint sense clau i sense +indicació de compàs, i generalment amb una lletra més petita. Per +fer això caldrien més ordres que encara no s'han vist. Vegeu +@rlearningnamed{Size of objects,Mida dels objectes} i +@ruser{Ossia staves}. + +@node Quant a la impossibilitat de niuar claudàtors i lligadures +@subsection Quant a la impossibilitat de niuar claudàtors i lligadures +@translationof On the un-nestedness of brackets and ties + +@cindex claudàtors i parèntesis, niuat de +@cindex claudàtors i parèntesis, tipus de +@cindex claudàtors i parèntesis, tancar en front a marcar + +A l'escriptura del fitxer d'entrada del LilyPond hem pogut veure +alguns tipus de parèntesis, claudàtors i angles de diversos +tipus. Obeeixen a diverses regles que el principi poden semblar +confuses. Abans d'explicar aquestes regles, fem un repàs a les +diverses classes de claudàtors, claus i parèntesis. + +@c attempt to force this onto a new page +@need 50 +@multitable @columnfractions .3 .7 +@headitem Tipus de parèntesis + @tab Funció +@item @code{@{ @dots{} @}} + @tab Tanca un fragment seqüencial de música +@item @code{< @dots{} >} + @tab Tanca les notes d'un acord +@item @code{<< @dots{} >>} + @tab Tanca expressions musicals simultànies +@item @code{( @dots{} )} + @tab Marca el començament i el final d'una lligadura d'expressió +@item @code{\( @dots{} \)} + @tab Marca el començament d'una lligadura de frasseig +@item @code{[ @dots{} ]} + @tab Marca el començament i el final d'un barrat manual +@end multitable + +A les anteriors hem d'afegir d'altres construccions que generen +línies entre o a través de ls notes: les lligadures d'unió +(marcades amb un accent corb, @code{~}), els grups especials que +s'escriuen amb @code{\tuplet x/y @{ @dots{} @}}, i les notes +d'adorn, que s'escriuen amb @code{\grace @{ @dots{} @}}. + +Fora del LilyPond, l'ús convencional dels parèntesis i d'altres +claudàtors requereix que els diversos tipus es trobin niuats +correctament, com a: @code{<< [ @{ ( @dots{} ) @} ] >>}, de manera +que els parèntesis que es tanquen han de trobar-se a l'ordre +exactament oposat als dels parèntesis que s'obren. Això +@strong{és} un requisit per als tres tipus de parèntesis que es +descriuen mitjançant la paraula @q{Tanca} a la taula anterior: +s'han de niuar correctament. Tanmateix, la resta de claus i +claudàtors, que estan descrits per la paraula @q{Marca} a la +mateixa taula anterior, @strong{no} han de niuar-se estrictament +per cap raó amb cap dels altres parèntesis. De fet, aquests +parèntesis no són parèntesis en el sentit que tanquen quelcom: +simplement són marcadors que indiquen on comença o finalitza +quelcom. + +Així doncs, per exemple, una lligadura de fraseig pot començar +abans d'una barra inserida manualment, i acabar abans que acabi +la barra (una cosa que potser no sigui molt musical, però és +possible): + +@lilypond[quote,verbatim,ragged-right] +\relative { g'8\( a b[ c b\) a] g4 } +@end lilypond + +En general, els diversos tipus de claudàtors, i els que es fan +servir per grups especials, lligadures d'unió i notes d'adorn, es +poden barrejar amb total llibertat. Aquest exemple mostra una +barra que s'estén cap a l'interior d'un grup de valoració especial +(línia 1), una lligadura d'expressió que es perllonga cap a +l'interior d'un grup excedent, una lligadura d'unió que travessa +dos grups especials, i una lligadura de fraseig que surt de +l'interior d'un grup excedent (línies 3 i 4). + +@lilypond[quote,verbatim,ragged-right] +\relative { + r16[ g' \tuplet 3/2 { r16 e'8] } + g,16( a \tuplet 3/2 { b16 d) e } + g,8[( a \tuplet 3/2 { b8 d) e~] } | + \tuplet 5/4 { e32\( a, b d e } a4.\) +} +@end lilypond + + +@node Les veus contenen música +@section Les veus contenen música +@translationof Voices contain music + +Igual que els cantants, al LilyPond li calen veus per cantar. En +realitat, la música per a qualsevol instrument d'una partitura +està sempre continguda dins d'una veu --el concepte del LilyPond +més fonamental de tots--. + +@menu +* Sento veus:: +* Veus explícites:: +* Veus i música vocal:: +@end menu + +@node Sento veus +@subsection Sento veus +@translationof I'm hearing Voices + +@cindex polifonia +@cindex capes +@cindex diverses veus +@cindex veus, diverses +@cindex Voice (veu), context de +@cindex context Voice (de veu) +@cindex simultània, música +@cindex concorrent, música +@cindex veus en front a acords +@cindex acords en front a veus + +De les capes més fondes d'una partitura del LilyPond, les més +baixes i més fonamental reben el nom de @q{Voice contexts} +(«contextos de veu») o, abreujadament, @q{Voices} («veus»). Les +veus s'anomenen a vegades @q{layers} («capes») a d'altres +programes d'edició de partitures. + +De fet, una capa o context de veu és l'única que pot contenir +música. Si un context de veu no es declara explícitament, es crea +un de forma automàtica, com vam veure al principi d'aquest capítol. +Certs instruments com l'oboè sols poden tocar una nota cada +cop. La música escrita per a aquests instruments sols requereix +una veu. Els instruments que poden tocar més d'una nota a la +vegada, com el piano, amb freqüència necessitaran diverses veus +per codificar les diverses notes i ritmes concurrents que són +capaces de tocar. + +Una sola veu pot contenir moltes notes dins d'un acord, per +suposat; aleshores, quan, exactament, es necessiten diverses veus? +En primer lloc observeu aquest exemple de quatre acords: + +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + 4 +} +@end lilypond + +Això es pot expressar utilitzant sols símbols d'acord amb angles +simples, @code{< @dots{} >}, i per això tan sols es necessita una +veu. Però suposeu que el Fa sostingut fos realment una corxera +seguida d'un Sol corxera, una nota de pas que condueix al La. Ara +tenim duen notes que comencen el mateix moment però tenen +diferents duracions: la negra Re, i la corxera Fa sostingut. Com +es codifica això? No es poden escriure amb un acord perquè totes +les notes d'un acord han de tenir la mateixa duració. I no es +poden escriure com dues notes en seqüència perquè han de començar +al mateix moment. Aquí és on necessiten dues veus. + +Vegem com es fa això dins de la sintaxi d'entrada del LilyPond. + +@funindex << \\ >> +@funindex \\ + +La forma més fàcil d'introduir fragments amb més d'una veu a un +sol pentagrama és escriure cada veu com una seqüència (amb +@code{@{ @dots{} @}}), i combinar-les simultàniament amb angles +dobles, @code{<< @dots{} >>}. Els fragments també s'han de +separar mitjançant una doble barra invertida, @code{\\}, per +situar-los a veus separades. +Sense això, les notes anirien a una sola veu, el que normalment +produeix errors. Aquesta tècnica s'adapta especialment bé a peces +de música que són majorment homofòniques però ocasionalment tenen +seccions curtes de polifonia. + +Heus ací com dividim els acords anteriors en dues veus i afegim la +nota de pas i la lligadura: + +@lilypond[quote,verbatim,ragged-right,relative=2] +\key g \major +% Veu "1" Veu "2" +<< { g4 fis8( g) a4 g } \\ { d4 d d d } >> +@end lilypond + +Observe com les pliques de la segona veu ara es dirigeixen cap +avall. + +A continuació vegem un altre exemple senzill: + +@lilypond[quote,verbatim,ragged-right,relative=2] +\key d \minor +% Veu "1" Veu "2" +<< { r4 g g4. a8 } \\ { d,2 d4 g } >> | +<< { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> | +<< { a2. r4 } \\ { fis2. s4 } >> | +@end lilypond + +No és necessari usar una construcció @code{<< \\ >>} diferent per +a cada compàs. Per a música que tingui unes poques notes a cada +compàs, aquesta disposició podria facilitar la llegibilitat del +codi, però si hi ha moltes notes a cada compàs podria ser millor +dividir-lo en dues veus separades de la següent manera: + +@lilypond[quote,verbatim,ragged-right,relative=2] +\key d \minor +<< { + % Veu "1" + r4 g g4. a8 | + bes4 bes c bes | + a2. r4 | +} \\ { + % Veu "2" + d,2 d4 g | + g4 g g8( a) g4 | + fis2. s4 | +} >> +@end lilypond + +@cindex veus, nomenament de +@cindex veus que creuen claudàtors +@cindex lligadures que creuen claudàtors + +Aquest exemple té sols dues veus, però la mateixa construcció es +pot usar per codificar tres o més veus mitjançant l'addició de més +separadors de barra invertida. + +Els contextos de veu porten els noms de @code{"1"}, @code{"2"}, +etc. Els primers contextos estableixen les veus @emph{externes}, +la veu aguda del context @code{"1"} i la veu greu del context +@code{"2"}. Les veus interiors van als contextos @code{"3"} i +@code{"4"}. A cada un d'aquests contextos, la direcció vertical +de les lligadures, pliques, matisos dinàmics, etc., s'ajusta de +forma correcta. + +@lilypond[quote,verbatim] +\new Staff \relative { + % Veu principal + c'16 d e f + % Veu "1" Veu "2" Veu "3" + << { g4 f e } \\ { r8 e4 d c8~ } >> | + << { d2 e } \\ { c8 b16 a b8 g~ 2 } \\ { s4 b c2 } >> | +} +@end lilypond + +Totes aquestes veus estan separades de la veu principal que conté +les notes just per fora de la construcció @code{<< @dots{} >>}. +Anomenarem això la @emph{construcció simultània}. Les lligadures +(de prolongació i d'expressió) solament poden connectar notes +que estiguin dins de la mateixa veu, en conseqüència les +lligadures no poden entrar o sortir d'una construcció +simultània. A la inversa, les veus paral·leles de construccions +simultànies diferents sobre el mateix pentagrama són la mateixa +veu. Hi ha altres propietats relatives a les veus que també +impliquen construccions simultànies. A continuació veiem el mateix +exemple, amb colors i caps diferents per a cada veu. Observeu que +els canvis a una veu no afecten a d'altres veus, però persisteixen +més tard dins de la mateixa veu. Observeu també que les notes +lligades es poden dividir entre les mateixes veus de dues +construccions, com s'indica aquí a la veu de triangles blaus. + +@lilypond[quote,verbatim] +\new Staff \relative { + % Veu principal + c'16 d e f + << % Bar 1 + { + \voiceOneStyle + g4 f e + } + \\ + { + \voiceTwoStyle + r8 e4 d c8~ + } + >> | + << % Bar 2 + % Continua la Veu 1 + { d2 e } + \\ + % Continua la Veu 2 + { c8 b16 a b8 g~ 2 } + \\ + { + \voiceThreeStyle + s4 b c2 + } + >> | +} +@end lilypond + +@funindex \voiceOneStyle +@funindex \voiceTwoStyle +@funindex \voiceThreeStyle +@funindex \voiceFourStyle +@funindex \voiceNeutralStyle + +Les instruccions @code{\voiceXXXStyle} estan pensades +principalment per usar-les en documents educatius com el que +presentem aquí. Modifiquen el color del cap, la plica i les +barres, i l'estil del cap, de manera que les veus es poden +distingir fàcilment. La veu u està establerta a rombes vermells, +la veu dos a triangles blaus, la veu tres a cercles verdes amb +aspes, i la veu quatre (que no es fa servir aquí) a aspes color +magenta. @code{\voiceNeutralStyle} (que tampoc no es fa servir +aquí) retorna tot a l'estil predeterminat. Veurem més endavant +com l'usuari pot crear instruccions com aquestes. Vegeu +@rlearningnamed{Visibility and color of objects,Visibilitat i +color dels objectes} i +@rlearningnamed{Using variables for layout adjustments,Ús de +variables per als ajustos de disposició}. + +@cindex polifonia i mode relatiu +@cindex relatiu, mode, polifonia i + +La polifonia no canvia la relació de les notes dins d'un bloc +@code{\relative}. L'alçada de cada nota encara es calcula amb +relació a la nota que la precedeix immediatament, o a la primera +nota de l'acord precedent. Així, en + +@example +\relative c' @{ notaA << < notaB notaC > \\ notaD >> notaE @} +@end example + +@noindent +@code{notaB} és relativa a @code{notaA} @* +@code{notaC} és relativa a @code{notaB}, no a @code{notaA}; @* +@code{notaD} és relativa a @code{notaB}, no a @code{notaA} ni a +@code{notaC}; @* +@code{notaE} és relativa a @code{notaD}, no a @code{notaA}. + +Una forma alternativa, que podria ser més clara si les notes a les +veus estan molt separades, és col·locar una instrucció +@code{\relative} al principi de cada veu: + +@example +\relative c' @{ notaA @dots{} @} +<< + \relative c'' @{ < notaB notaC > @dots{} @} +\\ + \relative g' @{ notaD @dots{} @} +>> +\relative c' @{ notaE @dots{} @} +@end example + +Finalment, analitzem les veus en una peça de música més +complexa. Heus aquí les notes dels dos primers compassos del segon +dels Dos Nocturns de Chopin, Op 32. Aquest exemple s'utilitzarà +en fases posteriors dins del present capítol i el següent, per +il·lustrar diverses tècniques per produir notació, i per tant us +demanem que ignoreu per ara qualsevol cosa al codi subjacent que +li sembli misteriós i tan sols es concentri a la música i les veus +(totes les complicacions s'explicaran a seccions posteriors). + +@c The following should appear as music without code +@lilypond[quote,ragged-right] +\new Staff \relative { + \key aes \major + << % Veu u + { c''2 aes4. bes8 } + \\ % Voice two + { + % Ignoreu aquestes expressions per ara, s'explicaran al Cap. 4 + \once \override NoteColumn.ignore-collision = ##t + 2 + \once \override NoteColumn.force-hshift = #0.5 + des2 + } + \\ % Sense veu tres + \\ % Veu quatre + { + \override NoteColumn.force-hshift = #0 + aes'2 f4 fes + } + >> | + 1 | +} +@end lilypond + +Amb freqüència, la direcció de les pliques s'utilitza per indicar +la continuïtat de dues línies melòdiques simultànies. En aquest +cas, totes les pliques de les notes agudes es dirigeixen cap amunt +i les de la notes greus cap avall. Aquesta és la primera +indicació que es requereix més d'una veu. + +Però la necessitat real de diverses veus apareix quan hi ha notes +que comencen al mateix temps però tenen duracions +diferents. Observeu les notes que comencen a la tercera part del +primer compàs. El La bemoll és una negra amb puntet, el Fa és una +negra i el Re bemoll és una blanca. Aquestes notes no es poden +escriure com un acord perquè totes les notes d'un acord han de +tenir la mateixa duració. Tampoc es poden escriure com notes +seqüencials, ja que han de començar al mateix temps. Aquesta +secció del compas requereix tres veus, i la pràctica comuna seria +escriure tot el compàs com tres veus com es mostra a sota, on hem +usat diferents caps i colors per a la tres veus. Un cop més, el +codi que hi ha a aquest exemple s'explicarà més tard, així que +ignoreu tot el que no entengueu. + +@c The following should appear as music without code +@c The three voice styles should be defined in -init +@lilypond[quote,ragged-right] +\new Staff \relative { + \key aes \major + << + { % Veu u + \voiceOneStyle + c''2 aes4. bes8 + } + \\ % Veu dos + { \voiceTwoStyle + % Ignoreu això per ara - s'explicarà al Cap 4 + \once \override NoteColumn.ignore-collision = ##t + 2 + \once \override NoteColumn.force-hshift = #0.5 + des2 + } + \\ % No hi ha veu tres (volem les pliques cap avall) + \\ % Veu quatre + { \voiceThreeStyle + \override NoteColumn.force-hshift = #0 + aes'2 f4 fes + } + >> | + 1 | +} +@end lilypond + +Intentarem codificar aquesta música partint de zero. Com veurem, +això s'enfronta a certes dificultats. Començarem tal com hem +après, usant la construcció @code{<< \\ >>} per introduir la +música del primer compàs a tres veus: + +@lilypond[quote,verbatim,ragged-right] +\new Staff \relative { + \key aes \major + << + { c''2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } + >> | + 1 | +} +@end lilypond + +@cindex plica avall +@cindex veus i direcció de ls pliques +@cindex pliques, veus i direcció de les +@cindex plica amunt + +Les direccions de les pliques s'assignen automàticament de forma +que les veus de numeració imparell reben les pliques cap amunt i les +de numeració parell cap avall. Les pliques de les veus 1 i 2 +són correctes, però les pliques de la veu 3 haurien d'anar cap +avall en aquest fragment en particular. Podem corregir això +simplement oblidant-nos de la veu tres i situant la música a la +veu quatre. Això es fa escrivint un altre parell de barres +invertides (@code{\\}). + +@lilypond[quote,verbatim,ragged-right] +\new Staff \relative { + \key aes \major + << % Veu u + { c''2 aes4. bes8 } + \\ % Veu dos + { 2 des } + \\ % Omet Veu tres + \\ % Veu quatre + { aes'2 f4 fes } + >> | + 1 | +} +@end lilypond + +@noindent +Veiem que això arregla la direcció de la plica, però la +col·locació horitzontal de les notes no és la desitjada. El +LilyPond desplaça les notes interiors quan elles o les seves +pliques d'una altra manera col·lisionarien amb les veus exteriors, +però això no és el més adequat per a música de piano. En altres +situacions, els desplaçaments que el LilyPond aplica poden no +eliminar les col·lisions. El LilyPond aporta diverses formes +d'ajustar la col·locació horitzontal de les notes. Encara no +estem preparats per veure com es corregeix això, per la qual cosa +deixarem el problema per a una secció posterior (vegeu la +propietat @code{force-hshift} a +@rlearningnamed{Fixing overlapping notation,Arreglar notació amb +superposicions}). + +@warning{No es poden crear lletres ni objectes d'extensió +(com ara lligadures, reguladors, etc.) @q{entre} veus diferents.} + +@seealso +Referència de la notació: +@ruser{Multiple voices}. + + +@node Veus explícites +@subsection Veus explícites +@translationof Explicitly instantiating voices + + +@funindex \voiceOne +@funindex \voiceTwo +@funindex \voiceThree +@funindex \voiceFour +@funindex \oneVoice +@funindex \new Voice +@cindex contextos de veu, creació de + +Els contextos de veu també es poden crear manualment dins d'un +bloc @code{<< >>} per crear música polifònica, utilitzant +@code{\voiceOne} @dots{} @code{\voiceFour} per indicar les +direccions requerides de pliques, lligadures, etc. A partitures +més llargues, aquest mètode és més clar perquè permet que les veus +estiguin separades i rebin noms més descriptius. + +Concretament, la construcció @code{<< \\ >>} que usem a la secció +prèvia: + +@example +\new Staff @{ + \relative @{ + << @{ e'4 f g a @} \\ @{ c,4 d e f @} >> + @} +@} +@end example + +@noindent +equival a + +@example +\new Staff << + \new Voice = "1" @{ \voiceOne \relative @{ e'4 f g a @} @} + \new Voice = "2" @{ \voiceTwo \relative @{ c'4 d e f @} @} +>> +@end example + +Els dos exemples anteriors produeixen: + +@c The following example should not display the code +@lilypond[ragged-right,quote] +\new Staff << + \new Voice = "1" { \voiceOne \relative { e'4 f g a } } + \new Voice = "2" { \voiceTwo \relative { c'4 d e f } } +>> +@end lilypond + +@cindex veus, retorn a única +@cindex retorn a veu única + +Les instruccions @code{\voiceXXX} estableixen la direcció de les +pliques, lligadures d'expressió, lligadures de prolongació, +articulacions, anotacions de text, puntets i digitacions. +@code{\voiceOne} i @code{\voiceThree} fan que aquests objectes +apuntin cap amunt, mentre que @code{\voiceTwo} i @code{\voiceFour} +els fan apuntar cap avall. Aquestes instruccions també produeixen +un desplaçament horitzontal per a cada veu quan és necessari per +evitar xocs entre els caps. La instrucció @code{\oneVoice} +retorna els ajustos de nou als valors normals per a una sola veu. + +Vegem a alguns exemples senzills exactament quin efecte tenen +@code{\oneVoice}, @code{\voiceOne} i @code{voiceTwo} sobre +l'escriptura, les lligadures d'unió i d'expressió i les +indicacions de dinàmica: + +@lilypond[quote,ragged-right,verbatim] +\relative { + % Comportament predeterminat o comportament després de \oneVoice + c'4 d8~ 8 e4( f | g4 a) b-> c | +} +@end lilypond + +@lilypond[quote,ragged-right,verbatim] +\relative { + \voiceOne + c'4 d8~ 8 e4( f | g4 a) b-> c | + \oneVoice + c,4 d8~ 8 e4( f | g4 a) b-> c | +} +@end lilypond + +@lilypond[quote,ragged-right,verbatim] +\relative { + \voiceTwo + c'4 d8~ 8 e4( f | g4 a) b-> c | + \oneVoice + c,4 d8~ 8 e4( f | g4 a) b-> c | +} +@end lilypond + +A continuació veurem tres formes diferents de composar la notació +del mateix passatge polifònic, cada una de les quals té els seus +avantatges segons la circumstància, utilitzant l'exemple de la +secció anterior. + +Una expressió que apareix directament dins de @code{<< >>} pertany +a la veu principal (però, observeu, @strong{no} dins d'una +construcció @code{<< \\ >>}). Això és útil quan apareixen veus +noves mentre la veu principal està sonant. A continuació podem +veure una realització més correcte de l'exemple de la secció +anterior. Les notes vermelles en forma de rombe mostren que la +melodia principal està ara dins d'un context d'una sola veu, fent +que es pugui traçar una lligadura per sobre d'elles. + +@lilypond[quote,ragged-right,verbatim] +\new Staff \relative { + \voiceOneStyle + % Aquesta secció és homofònica + c'16^( d e f + % Comença una secció simultània de tres veus + << + % Continua la veu principal en paral·lel + { g4 f e | d2 e) | } + % Inicia la segona veu + \new Voice { + % Estableix les pliques, etc., cap avall + \voiceTwo + r8 e4 d c8~ | 8 b16 a b8 g~ 2 | + } + % Inicia la tercera veu + \new Voice { + % Set stems, etc, up + \voiceThree + s2. | s4 b c2 | + } + >> +} +@end lilypond + +@cindex aniuat d'expressions musicals +@cindex aniuat de construccions simultànies +@cindex aniuat de veus +@cindex veus temporals +@cindex veus, aniuat de + +Les construccions polifòniques niuades més profundament són +possibles, i si hi ha una veu que apareix sols breument podria +haver-hi una forma més natural d'escriure la música. + +@lilypond[quote,ragged-right,verbatim] +\new Staff \relative { + c'16^( d e f + << + { g4 f e | d2 e) | } + \new Voice { + \voiceTwo + r8 e4 d c8~ | + << + { c8 b16 a b8 g~ 2 | } + \new Voice { + \voiceThree + s4 b c2 | + } + >> + } + >> +} +@end lilypond + +@cindex espaiadores, notes + +Aquest mètode de niuar veus noves breument és útil quan sols hi ha +seccions polifòniques petites, però quan tot el pentagrama és molt +polifònic podria ser més clar usar sempre diverses veus, usant +notes espaiadores per passar per sobre de les seccions on una veu +està en silenci, com per exemple: + +@lilypond[quote,ragged-right,verbatim] +\new Staff \relative << + % Inicia la primera veu + \new Voice { + \voiceOne + c'16^( d e f g4 f e | d2 e) | + } + % Inicia la segona veu + \new Voice { + % Estableix les pliques, etc., cap avall + \voiceTwo + s4 r8 e4 d c8~ | 8 b16 a b8 g~ 2 | + } + % Inicia la tercera veu + \new Voice { + % Estableix les pliques, etc., cap amunt + \voiceThree + s1 | s4 b c2 | + } +>> +@end lilypond + +@subsubheading Columnes de notes + +@cindex columna de notes +@cindex col·lisions de notes +@cindex notes, col·lisions de +@cindex desplaçament, instruccions de +@funindex \shiftOff +@funindex \shiftOn +@funindex \shiftOnn +@funindex \shiftOnnn + +Les notes properes a un acord, o les notes que es produeixen al +mateix temps en diferents veus, es disposen en dos (i +ocasionalment més) columnes per evitar el solapament dels caps. +Reben el nom de columnes de notes. Hi ha columnes diferents per a +cada veu, i el desplaçament especificat en curs depenent de la veu +s'aplica a la columna de la nota si en cas contrari es produís una +col·lisió. Això es pot veure a l'exemple anterior. Al compàs 2 el +Do a la veu dos està desplaçat a la dreta respecte del Re de la +veu u, i a l'últim acord el Do de la veu tres també està desplaçat +a la dreta respecte de les altres notes. + +Les instruccions @code{\shiftOn}, @code{\shiftOnn}, +@code{\shiftOnnn} i @code{\shiftOff} especifiquen el grau que +s'han de desplaçar les notes i acords de la veu si en cas contrari +es produís una col·lisió. De forma predeterminada, les veus +exteriors (normalment les veus u i dos) tenen com a especificació +@code{\shiftOff}, mentre que les veus interiors (tres i quatre) +tenen especificat @code{\shiftOn}. Quan s'aplica un desplaçament, +les veus u i tres es desplacen cap a la dreta i les veus dos i +quatre es desplacen cap a l'esquerra. + +@code{\shiftOnn} i @code{\shiftOnnn} defineixen nivells +addicionals de desplaçament que es poden especificar temporalment +per resoldre col·lisions en situacions complexes (vegeu +@rlearningnamed{Real music example,Exemples reals de música}). + +Una columna de notes pot contenir sols una nota (o acord) d'una +veu amb les pliques cap amunt i una nota (o acord) d'una veu amb +les pliques cap avall. Si les notes de dues veus que tenen les +pliques a la mateixa direcció se situen en la mateixa posició i +les dues veus no tenen cap desplaçament o porten especificat el +mateix desplaçament, es produirà el missatge d'error @qq{Xoquen +massa columnes de notes}. + +@seealso +Manual d'aprenentatge: +@rlearningnamed{Moving objects,Moure objectes}. + +Referència de la notació: +@ruser{Multiple voices}. + + +@node Veus i música vocal +@subsection Veus i música vocal +@translationof Voices and vocals + +La música vocal presenta una dificultat especial: hem de combinar +dues expressions, és a dir, les notes i la lletra. + +@funindex \new Lyrics +@funindex \lyricsto +@funindex Lyrics +@cindex Lyrics, creació d'un context +@cindex lletra, creació d'un context de +@cindex lletra, enllaçar amb una veu + +Ja heu vist la instrucció @code{\addlyrics@{@}}, que funciona bé +per a partitures senzilles. Tot i així, aquesta tècnica és una +mica limitada. Per a música de complexitat més gran, hem +d'introduir la lletra en un context @code{Lyrics} utilitzant +@code{\new Lyrics} i enllaçar explícitament la lletra i les notes +mitjançant @code{\lyricsto@{@}}, usant el nom assignat a la veu. + +@lilypond[quote,verbatim] +<< + \new Voice = "una" { + \relative { + \autoBeamOff + \time 2/4 + c''4 b8. a16 | g4. f8 | e4 d | c2 | + } + } + \new Lyrics \lyricsto "una" { + No more let | sins and | sor -- rows | grow. | + } +>> +@end lilypond + +Observeu que la lletra s'ha d'enllaçar a un context de +@code{Voice}, @emph{no} a un context de @code{Staff}. Aquest és +un cas on és necessari crear contextos de @code{Staff} i de +@code{Voice} explícitament. + +@cindex lletra i barrat +@cindex barrat i lletra +@funindex \autoBeamOff + +El barrat automàtic que el LilyPond usa de forma predeterminada +funciona bé per a la música instrumental, però no tan bé per a +música sense lletra, on o bé el barrat no es necessita en absolut, +o bé s'utilitza per indicar els melismes de la lletra. A +l'exemple anterior hem utilitzat la instrucció @code{\autoBeamOff} +per desactivar el barrat automàtic. + +@funindex \new ChoirStaff +@funindex ChoirStaff +@funindex \lyricmode +@cindex vocal, estructura d'una partitura +@cindex cor, sistema de + +Ara reutilitzarem l'exemple anterior de «Judes Macabeu» per a +il·lustrar aquesta tècnica més flexible. Primer la reescriurem +per que faci servir variables, de manera que la música i la lletra +es puguin separar de l'estructura de pentagrames. També +introduirem una clau de grup de ChoirStaff. La lletra pròpiament +dita s'ha de introduir amb @code{\lyricmode} perquè tenir seguretat +que s'interpreti com a lletra i no com a música. + +@lilypond[quote,verbatim] +global = { \key f \major \time 6/8 \partial 8 } + +SopOneMusic = \relative { + c''8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ 4 +} +SopOneLyrics = \lyricmode { + Let | flee -- cy flocks the | hills a -- dorn, __ +} +SopTwoMusic = \relative { + r8 | r4. r4 c'8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' +} +SopTwoLyrics = \lyricmode { + Let | flee -- cy flocks the | hills a -- dorn, +} + +\score { + \new ChoirStaff << + \new Staff << + \new Voice = "SopOne" { + \global + \SopOneMusic + } + \new Lyrics \lyricsto "SopOne" { + \SopOneLyrics + } + >> + \new Staff << + \new Voice = "SopTwo" { + \global + \SopTwoMusic + } + \new Lyrics \lyricsto "SopTwo" { + \SopTwoLyrics + } + >> + >> +} +@end lilypond + +Aquesta és l'estructura bàsica de totes les partitures vocals. Es +poden afegir més pentagrames segons es necessiti, es poden afegir +més veus als pentagrames i més estrofes a la lletra, i les +variables que contenen la música es poden col·locar fàcilment en +fitxers separats quan es facin massa llargs. + +@cindex himne, estructura de +@cindex SATB, estructura de +@cindex vocal, partitura, diverses estrofes +@cindex diverses estrofes vocals +@cindex estrofes, diverses, vocals + +A continuació podem veure un exemple final de la primera línia +d'un himne amb quatre estrofes, per a cor SATB. En aquest cas la +lletra de les quatre parts és la mateixa. Observeu com utilitzem +variables per a separar la notació musical de l'estructura de +pentagrames. Observeu també com s'utilitza una variable, per a la +qual hem escollit el nom @q{TimeKey} («compàs i tonalitat»), per a +que contingui diverses instruccions que s'usaran dins dels dos +pentagrames. A d'altres exemples se li sol donar el nom de @q{global}. + +@lilypond[quote,verbatim] +keyTime = { \key c \major \time 4/4 \partial 4 } + +SopMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } + +VerseOne = + \lyricmode { E -- | ter -- nal fa -- ther, | strong to save, } +VerseTwo = + \lyricmode { O | Christ, whose voice the | wa -- ters heard, } +VerseThree = + \lyricmode { O | Ho -- ly Spi -- rit, | who didst brood } +VerseFour = + \lyricmode { O | Tri -- ni -- ty of | love and pow'r } + +\score { + \new ChoirStaff << + \new Staff << + \clef "treble" + \new Voice = "Sop" { \voiceOne \keyTime \SopMusic } + \new Voice = "Alto" { \voiceTwo \AltoMusic } + \new Lyrics \lyricsto "Sop" { \VerseOne } + \new Lyrics \lyricsto "Sop" { \VerseTwo } + \new Lyrics \lyricsto "Sop" { \VerseThree } + \new Lyrics \lyricsto "Sop" { \VerseFour } + >> + \new Staff << + \clef "bass" + \new Voice = "Tenor" { \voiceOne \keyTime \TenorMusic } + \new Voice = "Bass" { \voiceTwo \BassMusic } + >> + >> +} +@end lilypond + + +@seealso +Referència de la notació: +@ruser{Vocal music}. + + +@node Contextos i gravadors +@section Contextos i gravadors +@translationof Contexts and engravers + +Els contextos i els gravadors s'han mencionat de manera informal a +seccions anteriors; ara tan sols veurem aquests conceptes amb més +detall, ja que són importants a l'ajust fi de la sortida del +LilyPond. + +@menu +* Explicació dels contextos:: +* Creació de contextos:: +* Explicació dels gravadors:: +* Modificar les propietats dels contextos:: +* Afegir i eliminar gravadors:: +@end menu + +@node Explicació dels contextos +@subsection Explicació dels contextos +@translationof Contexts explained + +@cindex contextos, explicació dels + +Quan s'imprimeix la música, s'han de afegir a la sortida una gran +quantitat d'elements de notació que no apareixen explícitament al +fitxer d'entrada. Per exemple, compareu l'entrada i la sortida +del següent exemple: + +@lilypond[quote,verbatim] +\relative { cis''4 cis2. | a4 a2. | } +@end lilypond + +L'entrada és força greu, però a la sortida s'han afegit línies +divisòries, les alteracions, la clau i l'armadura de la +tonalitat. Quan el LilyPond @emph{interpreta} l'entrada, la +informació musical s'analitza d'esquerra a dreta de la mateixa +manera que un intèrpret llegeix la partitura. Mentre es llegeix +el codi d'entrada, el programa recorda on estan els límits dels +compassos, i quines alçades requereixen alteracions accidentals +explícites. Aquesta informació s'ha de conservar a diversos +nivells. Per exemple, una alteració accidental afecta solament a +un pentagrama, mentre que una línia divisòria ha d'estar +sincronitzada al llarg de tot els sistema. + +Dins del LilyPond, aquestes regles i petites porcions d'informació +s'agrupen en @emph{Contexts}. Ja hem vist el context de veu, +@code{Voice}. Altres exemples de contextos són @code{Staff} +(Pauta o pentagrama) i @code{Score} (Partitura). Els contextos +són jeràrquics, de forma que reflecteixen la naturalesa jeràrquica +d'una partitura musical. Per exemple: un context de @code{Staff} +pot contenir molts contextos de @code{Voice}, i un context de +@code{Score} pot contenir molts contextos de @code{Staff}. + +@quotation +@sourceimage{context-example,5cm,,} +@end quotation + +Cada context assumeix la responsabilitat d'imposar algunes regles +de notació, creant certs objectes de notació i mantenint les +propietats associades. Per exemple, el context @code{Voice} pot +introduir una alteració accidental i llavors el context +@code{Staff} manté la regla de mostrar o suprimir l'alteració per +a la resta del compàs. + +Un altre exemple el constitueix el fet que la sincronització de les +línies divisòries es gestiona dins del context de la partitura, +@code{Score}, de forma predeterminada. Nogensmenys, a algunes +músiques és possible que vulguem que les línies divisòries +estiguin sincronitzades (pensem en una partitura polimètrica en +compassos de 4/4 i de 3/4). En aquests casos hem de modificar els +ajustos per omissió dels contextos @code{Score} i @code{Staff}. + +Per a partitures molt senzilles, els contextos es creen +implícitament i no hem de preocupar-nos per ells. Per a peces més +grans, com per exemple qualsevol que tingui més d'un pentagrama, +els contextos s'han de crear explícitament per assegurar-nos que +no tindrem la quantitat exacta de pentagrames que necessitem, i +que estan a l'ordre correcte. Per escriure peces amb notació +especialitzada, és freqüent la modificació de contextos existents +o fins i tot definir d'uns completament nous. + +A més dels contextos @code{Score,} @code{Staff} i @code{Voice}, hi +ha contextos que se situen entre els nivells de partitura i de +pentagrama per controlar els grups de pentagrames , com els +contextos alternatius de pentagrama i de veu, i contextos per a la +lletra, la percussió, diagrames de trasts, baix xifrat, etc. + +Els noms de tots els tipus de contextos es composen d'una o més +paraules que comencen amb majúscula i que estan unides unes a les +altres sense guió ni barra baixa, per exemple: +@code{PartituraDeTranscripcióGregoriana} + +@seealso +Referencia de la notació: +@rusernamed{Contexts explained,Explicació dels contextos}. + + +@node Creació de contextos +@subsection Creació de contextos +@translationof Creating contexts + +@funindex \new +@cindex nous contextos +@cindex creació de contextos +@cindex contextos, creació de + +A un fitxer d'entrada, el bloc de partitura, que es presenta +precedit per la instrucció @code{\score}, conté una sola expressió +musical i una definició de sortida associada (o bé un bloc +@code{\layout} o bé un bloc @code{\midi}). El context +@code{Score} se sol deixar que es creï automàticament quan +comença la interpretació d'aquesta expressió musical. + +Per a partitures que solament tenen una veu i un pentagrama, podem +també deixar que els contextos @code{Voice} i @code{Staff} se +creïn automàticament, però per a partitures més complexes és +necessari crear-los a mà. La instrucció més simple que fa això és +@code{\new}. S'anteposa a una expressió musical, per exemple + +@example +\new @var{tipus} @var{expressió_musical} +@end example + +@noindent +on @var{tipus} és el nom d'un context (com @code{Staff} o +@code{Voice}). Aquesta instrucció crea un context nou, i comença +a interpretar la @var{expressió_musical} que està dins d'aquest +context. + +@warning{No s'ha d'usar @bs{}@code{new Score} perquè el context +@code{Score} essencial del nivell superior ja es crea +automàticament al interpretar-se l'expressió musical que està +dins del bloc @bs{}@code{score}. Els valors predeterminats de +propietats de context vàlids per a tota la partitura es poden +canviar dins del bloc @bs{}@code{layout}. Vegeu @ref{Modificar +les propietats dels contextos}.} + +En les seccions anteriors heu pogut veure molts exemples pràctics +que creaven nous contextos de @code{Staff} i de @code{Voice}, +però per a recordar-vos com s'usen aquestes instruccions en la +pràctica, heus aquí un exemple anotat de música real: + +@lilypond[quote,verbatim,ragged-right] +\score { % inici de l'expressió única de música composta + << % inici d'una secció pentagrames simultanis + \time 2/4 + \new Staff { % crea el pentagrama de la mà dreta + \clef "treble" + \key g \minor + \new Voice { % crea la veu per a les notes de la mà dreta + \relative { % inici de les notes de la mà dreta + d''4 ees16 c8. | + d4 ees16 c8. | + } % fi de les notes de la mà dreta + } % fi de la veu de la mà dreta + } % fi del pentagrama de la mà dreta + \new Staff << % crea el pentagrama de la mà esquerra + \clef "bass" + \key g \minor + \new Voice { % crea la veu de la mà esquerra + \voiceOne + \relative { % inicia les notes de la veu u de la mà esquerra + g8 ees, | + g8 ees, | + } % fi de les notes de la veu u de la mà esquerra + } % fi de la veu u de la mà esquerra + \new Voice { % crea la veu dos de la mà esquerra + \voiceTwo + \relative { % inici de les notes de la veu dos de la mà esquerra + g4 ees | + g4 ees | + } % fi de les notes de la veu dos de la mà esquerra + } % fi de la veu dos de la mà esquerra + >> % fi del pentagrama de la mà esquerra + >> % fi de la secció de pentagrames simultanis +} % fi de l'expressió única de música composta +@end lilypond + +(Observeu com totes les instruccions que obren un bloc amb un +claudàtor corb, @code{@{}, o amb angles dobles, @code{<<}, estan +sagnades (tenen un marge addicional) amb dos espais addicionals, +i el claudàtor de tancament corresponent té un marge exactament +igual. Tot i no ser necessari, observar aquesta pràctica reduirà +considerablement el nombre d'errors de @q{parèntesis +descompensats}, i es recomana especialment. Permet apreciar d'una +sola ullada l'estructura de la música, i qualsevol parèntesis +descompensat apareixerà molt clarament. Observeu també com el +pentagrama de la mà esquerra es crea usant dobles angles perquè +requereix dues veus, mentre que el pentagrama de la mà dreta es +crea amb una expressió musical única tancada entre claudàtors +perquè sols requereix una veu.) + +@cindex contextos, nomenament +@cindex anomenar contextos + +La instrucció @code{\new} també pot atorgar un nom identificatiu +al context per distingir-lo d'altres contextos del mateix tipus: + +@example +\new @var{tipus} = @var{identificador} @var{expressió_musical} +@end example + +Observeu la distinció entre el nom del tipus de context, +@code{Staff}, @code{Voice}, etc., i el nom identificatiu d'una +instància en particular d'aquest tipus, que pot ser qualsevol +seqüència de lletres inventada per l'usuari. En el nom +identificatiu també es poden utilitzar dígits i espais, però en +aquest cas aquest nom ha d'anar entre cometes, per exemple +@code{\new Staff = "ElMeuPentagrama 1" @var{expressió_musical}}. +El nom identificatiu s'utilitza per referir-nos més tard a +aquesta instància en particular d'un context. Hem vist això a la +secció sobre la lletra, a @ref{Veus i música vocal}. + +@seealso +Referència de la notació: +@ruser{Creating contexts}. + + +@node Explicació dels gravadors +@subsection Explicació dels gravadors +@translationof Engravers explained + +@cindex gravadors + +Totes i cadascuna de les marques de la sortida impresa d'una +partitura feta amb el LilyPond està produïda per un +@code{Engraver} (gravador). Així, tenim un gravador per imprimir +pentagrames, un altre per imprimir els caps de les notes, un altre +per a les pliques, un altre per a les barres, i molts més. En +total hi ha més de 120 gravadors! Afortunadament, per a la major +part de les partitures no és necessari conèixer més que alguns, +per a partitures senzilles no hem de saber res de cap d'ells. + +Els gravadores resideixen i operen dins de Contextos. Els +gravadors com ara el gravador de la indicació de metrònom, +@code{Metronome_mark_engraver}, l'acció i resultat del qual +s'apliquen a la partitura com un tot, operen en el context més +alt: el context de partitura @code{Score}. + +El gravador de la clau @code{Clef_engraver} i el de l'armadura +@code{Key_engraver} es troben probablement a tots els contextos de +pentagrama (@code{Staff}), ja que els diferents pentagrames +podrien requerir diferents claus i armadures. + +El gravador dels caps de nota @code{Note_heads_engraver} i el de +les pliques @code{Stem_engraver} viuen en cada u dels contextos de +veu @code{Voice}, el context de nivell més baix de tots. + +Cada gravador processa els objectes particulars associats amb la +seva funció, i manté les propietats que estan relacionades amb +aquesta funció. Aquestes propietats, com les que estan +associades amb els contextos, es poden modificar per canviar el +funcionament del gravador o l'aspecte d'aquests elements de la +partitura impresa. + +Tots els gravadors tenen noms compostos de diverses paraules que +descriuen la seva funció. Sols està en majúscules la inicial de +la primera paraula, i la resta se li uneix mitjançant guionets +baixos. D'aquesta manera el gravador @code{Staff_symbol_engraver} +és responsable de la creació de les línies del pentagrama, i el +@code{Clef_engraver} determina i estableix l'alçada o el punt de +referència sobre el pentagrama dibuixant un símbol de clau. + +A continuació presentem alguns del gravadors més comuns, junt amb +la seva funció. Podreu comprovar que és fàcil endevinar la funció +a partir del nom (en anglès), i a l'inrevés. + +@multitable @columnfractions .3 .7 +@headitem Gravador + @tab Funció +@item Accidental_engraver + @tab Fa les alteracions accidentals, de precaució i de suggeriment. +@item Beam_engraver + @tab Grava les barres +@item Clef_engraver + @tab Grava les claus +@item Completion_heads_engraver + @tab Divideix les notes que travessen una línia divisòria +@item Dynamic_engraver + @tab Crea reguladors i indicacions dinàmiques textuals +@item Forbid_line_break_engraver + @tab Evita els salts de línia si queda algun element musical actiu +@item Key_engraver + @tab Crea l'armadura de la tonalitat +@item Metronome_mark_engraver + @tab Grava la indicació de metrònom +@item Note_heads_engraver + @tab Grava el cap de les notes +@item Rest_engraver + @tab Grava els silencis +@item Staff_symbol_engraver + @tab Grava les cinc línies (de forma predeterminada) del pentagrama +@item Stem_engraver + @tab Crea les pliques i els trèmolos d'una sola plica +@item Time_signature_engraver + @tab Crea les indicacions de compàs +@end multitable + +@smallspace + +Més endavant veurem es pot canviar com la sortida del LilyPond +mitjançant la modificació del funcionament dels Gravadors. + +@seealso +Referència de funcionament intern: +@rinternals{Engravers and Performers}. + + +@node Modificar les propietats dels contextos +@subsection Modificar les propietats dels contextos +@translationof Modifying context properties + +@cindex context, propietats de +@cindex context, propietats de, modificació +@cindex modificar les propietats de context +@funindex \set +@funindex \unset + +Els contextos es responsabilitzen de mantenir els valors d'un cert +nombre de @emph{properties} de context. Moltes d'elles es poden +canviar per influir en la interpretació del codi d'entrada i +canviar així l'aparença de la sortida impresa. Es modifiquen +mitjançant la instrucció @code{\set}. Aquesta instrucció pren la +forma següent: + +@example +\set @emph{NomDelContext}.@emph{nomDeLaPropietat} = #@emph{valor} +@end example + +On el @emph{NomDelContext} és normalment @code{Score}, +@code{Staff} o @code{Voice}. Es pot ometre, i en aquest cas se +suposa que és el context en curs (normalment @code{Voice}). + +Els noms de les propietats de context consisteixen en paraules +unides sense cap guió o barra fixa, i on totes les paraules +excepte la primera comencen en majúscula. A continuació podem +veure alguns exemples de noms de propietats utilitzades amb +freqüència. Hi ha moltes més que les que es mostren aquí. + +@c attempt to force this onto a new page +@need 50 +@multitable @columnfractions .25 .15 .45 .15 +@headitem nomDeLaPropietat + @tab Tipus + @tab Funció + @tab Valor d'exemple +@item extraNatural + @tab Booleà + @tab Si és vertader, posa becaires addicionals abans de les alteracions + @tab @code{#t}, @code{#f} +@item currentBarNumber + @tab Enter + @tab Ajustar el número del compàs actual + @tab @code{50} +@item doubleSlurs + @tab Booleà + @tab Si és vertader, imprimir lligadures d'expressió per sobre i per sota de les notes + @tab @code{#t}, @code{#f} +@item instrumentName + @tab Text + @tab Establir el nom del pentagrama, situat a l'esquerra + @tab @code{"Cello I"} +@item fontSize + @tab Real + @tab Augmentar o disminuir la mida de la font tipogràfica + @tab @code{2.4} +@item stanza + @tab Text + @tab Establir el text que s'imprimeix abans del començament d'una estrofa + @tab @code{"2"} +@end multitable + +@noindent +on un valor Booleà es vertader (@code{#t}, True) o fals +(@code{#f}, False), un Enter és un nombre enter positiu, un nombre +real és un nombre decimal positiu o negatiu, i el text es tanca +entre cometes dobles. Observeu l'aparició de signes de coixinet +(@code{#}), en dos llocs diferents: com a part del valor Booleà +abans de la @code{t} o la @code{f}, i abans del @emph{valor} dins +de la instrucció @code{\set}. Així doncs, quan s'està escrivint +un valor Booleà, s'han d'escriure dos signes de coixinet, per +exemple: @code{##t}. + +@cindex propietats que funcionen en contextos +@cindex establir propietats en contextos + +Abans de poder establir qualsevol d'aquestes propietats, hem de +saber en quin context operen. A vegades és quelcom obvi, però en +ocasions pot ser quelcom complicat. Si especifiquem un context +equivocat, no es produeix cap missatge d'error, però el +funcionament esperat no tindrà lloc. Per exemple, la propietat +@code{instrumentName} (nom de l'instrument) viu clarament dins del +context de @code{Staff}, ja que és el pentagrama el que ha de ser +anomenat. En aquest exemple, el primer pentagrama resulta +etiquetat, però no el segon, perquè hem omès el nom del context. + +@lilypond[quote,verbatim,ragged-right] +<< + \new Staff \relative { + \set Staff.instrumentName = #"Soprano" + c''2 c + } + \new Staff \relative { + \set instrumentName = #"Alto" % Incorrecte! + d'2 d + } +>> +@end lilypond + +Recordeu que el nom del context predeterminat és @code{Voice}, +així que la segona instrucció @code{\set} estableix la propietat +@code{instrumentName} del context @code{Voice} a @qq{Alto}, pero com +el LilyPond no busca aquesta propietat al context @code{Voice}, no +es realitza cap acció. Això no és un error, i no es registra cap +missatge al fitxer Log del registre d'errors. + +De forma semblant, si el nom de la propietat s'escriu amb alguna +falta, no es produeix cap missatge d'error, i clarament l'acció +esperada no pot tenir lloc. De fet, es pot establir qualsevol +@q{property} (fictícia) usant qualsevol nom que volem en qualsevol +context que existeixi, mitjançant l'ús de la instrucció +@code{\set}. Però si el nom no és conegut per al LilyPond, no +produirà cap acció. Alguns editors de text que donen suport als +fitxers d'entrada del LilyPond de manera especial, documenten els +noms de propietats amb vinyetes quan passem sobre ells el punter +del ratolí, com ara JEdit amb l'extensió LilyPondTool, o destaquen +els noms de propietats desconegudes de manera diferent, com ara +ConTEXT. Si no s'utilitza un editor amb aquesta possibilitats, es +recomana comprovar la correcció del nom de la propietat al manual +de Referència de funcionament intern: vegeu +@rinternals{Tunable context properties} o @rinternals{Contexts}. + +La propietat @code{instrumentName} tindrà efecte solament si +s'estableix dins del context @code{Staff}, però algunes propietats +es poden establir a més d'un context. Per exemple, la propietat +@code{extraNatural} està establerta de forma predeterminada al +valor @code{##t} (vertader) per a tots els pentagrames. Si +s'estableix a @code{##f} (fals) en un context de @code{Staff} +determinat s'aplicarà solament a les alteracions d'aquest +pentagrama. Si s'estableix a fals en el context de la partitura, +@code{Score}, s'aplicarà a tots els pentagrames. + +Així, això desactivarà els bequadres addicionals a un pentagrama: + +@lilypond[quote,verbatim,ragged-right] +<< + \new Staff \relative { + aeses'2 aes + } + \new Staff \relative { + \set Staff.extraNatural = ##f + aeses'2 aes + } +>> +@end lilypond + +@noindent +i això els desactivarà a tots els pentagrames: + +@lilypond[quote,verbatim,ragged-right] +<< + \new Staff \relative { + aeses'2 aes + } + \new Staff \relative { + \set Score.extraNatural = ##f + aeses'2 aes + } +>> +@end lilypond + +Com un exemple més, si s'estableix @code{clefTransposition} dins +del context de @code{Score}, aquesta instrucció canvia +immediatament el valor de la transposició en tots els pentagrames +en curs i estableix un nou valor predeterminat que s'aplicarà a +tots els pentagrames. + +La instrucció oposada, @code{\unset}, té l'efecte de suprimir la +propietat del context, el que ocasiona que la major part de les +propietats tornin al seu valor predeterminat. Normalment no és +necessari l'ús de @code{\unset}, atès que una nova instrucció +@code{\set} farà l'ajust desitjat. + +Les instruccions @code{\set} i @code{\unset} poden aparèixer en +qualsevol lloc del fitxer d'entrada i tindran un efecte a partir +del temps on es troben i fins al final de la partitura o fins que la +propietat es torni a establir mitjançant @code{\set} o +@code{\unset}. Provem a modificar la mida de la font tipogràfica, +el que afecta la mida dels caps de les notes (entre altres coses) +diverses vegades. El canvi s'agafa a partir del valor +predeterminat, no el valor en curs. + +@lilypond[quote,verbatim,ragged-right,relative=1] +c4 d +% fes que els caps de nota siguin més petits +\set fontSize = #-4 +e4 f | +% fes que els caps de nota siguin més grans +\set fontSize = #2.5 +g4 a +% torna a la mida predeterminada +\unset fontSize +b4 c | +@end lilypond + +Hem pogut veure com establir els valors de diversos tipus de +propietat diferents. Observeu que els nombres enters i reals van +sempre precedits d'un símbol de coixinet, @code{#}, mentre que un +valor booleà vertader o fals s'especifica mitjançant +@code{##t} i @code{##f}, amb dos coixinets. Una propietat de +test s'ha de tancar entre cometes dobles, com abans, tot i que +veurem més endavant que el text realment es pot especificar d'una +forma molt més general utilitzant la molt potent instrucció +@code{markup}. + +@subsubheading Canviar les propietats d'un context amb @code{\with} + +@funindex \with +@cindex context, propietats de, establiment amb \with + +El valor predeterminat de les propietats de context es pot +establir en el moment que es crea el context. A vegades aquesta +forma d'establir el valor d'una propietat és molt més clara, si ha +de quedar fix durant tot el temps que duri el context. Quan es +crea un context amb una instrucció @code{\new} pot anar +immediatament seguit d'un bloc @code{\with @{ @dots{} @}} en el +que s'estableix els valors predeterminats de les propietats. Per +exemple, si volem suprimir la impressió de bequadres addicionals per +a tota la duració d'un pentagrama, podem escriure: + +@example +\new Staff \with @{ extraNatural = ##f @} +@end example + +@noindent +de la forma següent: + +@lilypond[quote,verbatim,ragged-right] +<< + \new Staff { + \relative { + gisis'4 gis aeses aes + } + } + \new Staff \with { extraNatural = ##f } { + \relative { + gisis'4 gis aeses aes + } + } +>> +@end lilypond + +Les propietats ajustades d'aquesta manera encara poden canviar-se +dinàmicament utilitzant @code{\set} i tornar-se al valor +predeterminat que es va establir al bloc @code{\with} mitjançant +@code{\unset}. + +@cindex fontSize (mida de la tipografia) +@cindex font, mida de la +@cindex mida de la font + +Així doncs, si la propietat @code{fontSize} s'ajusta dins d'una +instrucció @code{\with}, té l'efecte de reiniciar el valor +predeterminat de la mida de la font tipogràfica. Si més tard es +modifica amb @code{\set}, aquest nou valor predeterminat pot +restablir-se amb la instrucció @code{\unset fontSize}. + +@subsubheading Canviar las propietats d'un context amb @code{\context} + +@cindex contextos, establir propietats de, amb \context +@funindex \context + +Els valors de propietat dels contextos es poden establir per a +@emph{tots} els contextos d'un tipus determinat, com per exemple +tots els contextos de @code{Staff}, amb una única instrucció. El +tipus de context s'identifica mitjançant la utilització del nom +del seu tipus, com @code{Staff}, precedit d'una barra invertida: +@code{\Staff}. L'enunciat que estableix el valor de la propietat +és el mateix que el que està en un bloc @code{\with}, presentat +anteriorment. Es col·loca en un bloc @code{\context} dins d'un +bloc @code{\layout}. Cada bloc @code{\context} afecta a tots els +contextos del tipus especificat al llarg del bloc @code{\score} o +@code{\book} en el que apareix el bloc @code{\layout}. A +continuació presentem un exemple que mostra el format: + +@lilypond[verbatim,quote] +\score { + \new Staff { + \relative { + cisis''4 e d cis + } + } + \layout { + \context { + \Staff + extraNatural = ##t + } + } +} +@end lilypond + +Si es vol aplicar la sobreescriptura de propietats a tos els +pentagrames de la partitura: + +@lilypond[quote,verbatim] +\score { + << + \new Staff { + \relative { + gisis'4 gis aeses aes + } + } + \new Staff { + \relative { + gisis'4 gis aeses aes + } + } + >> + \layout { + \context { + \Score extraNatural = ##f + } + } +} +@end lilypond + +@noindent +Les propietats de context establertes d'aquesta forma es poden +sobreescriure per a exemples concrets de contextos mitjançant +enunciats dins d'un bloc @code{\with}, i mitjançant instruccions +@code{\set} intercalades dins d'enunciats musicals. + +@seealso +Referència de la notació: +@ruser{Changing context default settings}. +@c FIXME +@c uncomment when backslash-node-name issue is resolved -pm +@ruser{The set command} + +Referència de funcionament intern: +@rinternals{Contexts}, +@rinternals{Tunable context properties}. + + +@node Afegir i eliminar gravadors +@subsection Afegir i eliminar gravadors +@translationof Adding and removing engravers + +@cindex gravadors, addició +@cindex gravadors, eliminació +@cindex addició de gravadors +@cindex eliminació de gravadors + +@funindex \consists +@funindex \remove + +Hem vist que cada un dels contextos conté diversos gravadors, cada +u dels quals és al seu cop responsable de la producció d'una +fracció particular del resultat imprès, com ara línies divisòries, +pentagrames, caps, pliques, etc. Si un gravador és eliminat d'un +context, ja no podrà produir la seva sortida impresa. És una +forma una mica radical de modificar la sortida, pero algunes +vegades pot ser útil. + +@subsubheading Canviar un sol context + +Per eliminar un gravador d'un context únic, usem la instrucció +@code{\with} situada immediatament després de la instrucció que +crea el context, com a la secció anterior. + +Com a il·lustració, repetim un exemple estret de la secció +anterior amb les línies del pentagrama eliminades. Recordeu que +les línies del pentagrama estan dibuixades pel gravador +@code{Staff_symbol_engraver}. + +@lilypond[quote,verbatim,ragged-right] +\new Staff \with { + \remove "Staff_symbol_engraver" +} +\relative { + c'4 d + \set fontSize = #-4 % fes més petits els caps de les notes + e4 f | + \set fontSize = #2.5 % fes més grans els caps de les notes + g4 a + \unset fontSize % retorna a la mida predeterminada + b4 c | +} +@end lilypond + +@cindex àmbit, gravador del + +Els gravadors també es poden afegir als contextos individuals. La +instrucció que ho fa és + +@code{\consists @var{Nom_del_gravador}}, + +situada dins d'un bloc @code{\with}. Certes partitures vocals +tenen una indicació d'àmbit o tessitura situada al principi del +pentagrama per indicar l'àmbit de notes en aquest pentagrama, vegeu +@rglos{ambitus}. L'ambitus es produeix per part del gravador +@code{Ambitus_engraver}, que normalment no està inclòs en cap +context. Si l'afegim al context @code{Voice}, calcula el rang a +partir d'aquesta única veu: + +@lilypond[quote,verbatim,ragged-right] +\new Staff << + \new Voice \with { + \consists "Ambitus_engraver" + } { + \relative { + \voiceOne + c''4 a b g + } + } + \new Voice { + \relative { + \voiceTwo + c'4 e d f + } + } +>> +@end lilypond + +@noindent +però si afegim el gravador d'àmbit al context de @code{Staff}, +calcula el rang de totes les notes en totes les veus d'aquest +pentagrama: + +@lilypond[quote,verbatim,ragged-right] +\new Staff \with { + \consists "Ambitus_engraver" +} +<< + \new Voice { + \relative { + \voiceOne + c''4 a b g + } + } + \new Voice { + \relative { + \voiceTwo + c'4 e d f + } + } +>> +@end lilypond + +@subsubheading Canviar tots els contextos del mateix tipus + +@funindex \layout + +Els exemples anteriors mostren la manera d'eliminar o afegir +gravadors als contextos individuals. També és possible eliminar o +afegir gravadors a tots els contextos d'un tipus específic, +situant les instruccions al context corresponent dins d'un bloc +@code{\layout}. Per exemple, si volem mostrar els rangs de +tessitura per a tots els pentagrames d'una partitura de quatre +pautes, podem escriure + +@lilypond[quote,verbatim,ragged-right] +\score { + << + \new Staff { + \relative { + c''4 a b g + } + } + \new Staff { + \relative { + c'4 a b g + } + } + \new Staff { + \clef "G_8" + \relative { + c'4 a b g + } + } + \new Staff { + \clef "bass" + \relative { + c4 a b g + } + } + >> + \layout { + \context { + \Staff + \consists "Ambitus_engraver" + } + } +} +@end lilypond + +@noindent +Els valors predeterminats de les propietats dels contextos també +es poden establir per a tots els contextos d'un tipus en +particular incloent-hi la instrucció @code{\set} dins d'un bloc +@code{\context} de la mateixa forma. + + +@seealso +Referència de la notació: +@ruser{Modifying context plug-ins}, +@ruser{Changing context default settings}. + +@knownissues +Els gravadors @code{Stem_engraver} i @code{Beam_engraver} +(de plica i de barra) adjunten al cap de les notes els objectes +que creen. Si es suprimeix el gravador de caps de nota +@code{Note_heads_engraver}, no es produeix cap cap i per tant no +es creen tampoc pliques ni barres. + +@node Extensió de les plantilles +@section Extensió de les plantilles +@translationof Extending the templates + +Heu llegit el tutorial i ara sabeu escriure música. Però, com +podeu posar els pentagrames que voleu? Les plantilles estan molt +bé, però què passa si voleu alguna cosa que està en cap plantilla? +Bé, podeu trobar muntanyes de plantilles (vegeu +@rlearningnamed{Templates,Plantilles}) +que us poden servir com a punt de partida. Però i si voleu +quelcom que no està contemplat aquí? Continueu llegint. + +@menu +* Soprano i violoncel:: +* Partitura vocal a quatre veus SATB:: +* Crear una partitura partint de zero:: +* Estalvi de tecleig mitjançant variables i funcions:: +* Partitures i particel·les:: +@end menu + +@node Soprano i violoncel +@subsection Soprano i violoncel +@translationof Soprano and cello + +@cindex plantilla, modificar +@cindex modificar plantilles + +Per començar, agafeu la plantilla que us sembli més semblant a +allò que voleu aconseguir. Diguem-ne que voleu escriure alguna +cosa per a soprano i violoncel. En aquest cas començaríem amb la +plantilla @q{Notes i lletra} (per a la part de soprano). + +@example +\version @w{"@version{}"} +melodia = \relative @{ + \clef "treble" + \key c \major + \time 4/4 + a4 b c d +@} + +text = \lyricmode @{ + Aaa Bee Cee Dee +@} + +\score @{ + << + \new Voice = "u" @{ + \autoBeamOff + \melodia + @} + \new Lyrics \lyricsto "u" \text + >> + \layout @{ @} + \midi @{ @} +@} +@end example + +Ara volem afegir una part de violoncel. Vegem l'exemple +@q{Sols notes}: + +@example +\version @w{"@version{}"} +melodia = \relative @{ + \clef "treble" + \key c \major + \time 4/4 + a4 b c d +@} + +\score @{ + \new Staff \melodia + \layout @{ @} + \midi @{ @} +@} +@end example + +No necessitem dues instruccions @code{\version}. Ens caldrà la +secció @code{melodia}. No volem dues seccions @code{\score} (si +tinguéssim dues @code{\score}s, acabaríem amb dues particel·les +per separat.) Volem les dues juntes, com un duo. Dins de la secció +@code{\score}, no ens fan falta dos @code{\layout} ni dos +@code{\midi}. + +Si ens limitéssim a copiar i enganxar la secció @code{melodia}, +acabaríem amb dues seccions @code{melodia} separades, així que +anem a canviar-los el nom. Anomenarem @code{musicaSoprano} a la +secció de la soprano i @code{musicaVioloncel} a la secció de +violoncel. Al mateix temps canviarem el nom de @code{text} a +@code{lletraSoprano}. Recordeu canviar el nom a les dues +aparicions de totes aquests noms -- tant la definició inicial (la +part @code{melodia = relative c' @{ }) -- com l'ús d'aquest nom +(en la secció @code{\score}). + +També aprofitarem per canviar el pentagrama de la part del +violoncel (els violoncels s'escriuen normalment en clau de +Fa). Així mateix, canviarem algunes del violoncel. + +@example +\version @w{"@version{}"} +musicaSoprano = \relative @{ + \clef "treble" + \key c \major + \time 4/4 + a4 b c d +@} + +lletraSoprano = \lyricmode @{ + Aaa Bee Cee Dee +@} + +musicaVioloncel = \relative @{ + \clef "bass" + \key c \major + \time 4/4 + d4 g fis8 e d4 +@} + +\score@{ + << + \new Voice = "u" @{ + \autoBeamOff + \musicaSoprano + @} + \new Lyrics \lyricsto "u" \lletraSoprano + >> + \layout @{ @} + \midi @{ @} +@} +@end example + +Això té una aparença prometedora, però la part del violoncel no +surt a la partitura (no l'hem posada a la secció @code{\score}). +Si volem que la part del violoncel aparegui a sota de la de +soprano, hem d'afegir + +@example +\new Staff \musicaVioloncel +@end example + +@noindent +just a sota de tot el codi de la soprano. També hem de posar +@code{<<} i @code{>>} abans i després de la música -- el que +indica al LilyPond que hi ha més d'una cosa (en aquest cas, +@code{Staff}) succeint al mateix moment --. La @code{\score} +s'assemblarà ara a això: + +@c Indentation in this example is deliberately poor +@example +\score @{ + << + << + \new Voice = "u" @{ + \autoBeamOff + \musicaSoprano + @} + \new Lyrics \lyricsto "u" \lletraSoprano + >> + \new Staff \musicaVioloncel + >> + \layout @{ @} + \midi @{ @} +@} +@end example + +@noindent +Això sembla una mica enrevessat; el marges estan desquadrats. Això té +fàcil solució. Presentem aquí la plantilla completa per a +soprano i violoncel. + +@lilypond[quote,verbatim,ragged-right,addversion] +musicaSoprano = \relative { + \clef "treble" + \key c \major + \time 4/4 + a4 b c d +} + +lletraSoprano = \lyricmode { + Aaa Bee Cee Dee +} + +musicaVioloncel = \relative { + \clef "bass" + \key c \major + \time 4/4 + d4 g fis8 e d4 +} + +\score { + << + << + \new Voice = "u" { + \autoBeamOff + \musicaSoprano + } + \new Lyrics \lyricsto "u" \lletraSoprano + >> + \new Staff \musicaVioloncel + >> + \layout { } + \midi { } +} +@end lilypond + + +@seealso +Les plantilles d'inici es poden trobar a l'apèndix +@q{Plantilles}, vegeu +@rlearningnamed{Single staff templates,Plantilles de pentagrama únic}. + +@node Partitura vocal a quatre veus SATB +@subsection Partitura vocal a quatre veus SATB +@translationof Four-part SATB vocal score + +La major part de les partitures vocals escrites per a cor mixt a +quatre veus amb acompanyament orquestral, com l'«Elies» de +Mendelssohn o el «Messies» de Haendel, tenen la música coral i la +lletra en quatre pentagrames S, A, T i B, respectivament, amb una +reducció de piano de l'acompanyament d'orquestra, per sota. Heus +aquí un exemple del «Messies» de Haendel: + +@c The following should appear as music without code +@lilypond[quote,ragged-right] +global = { \key d \major \time 4/4 } + +musicaSoprano = \relative { + \clef "treble" + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | +} +lletraSoprano = \lyricmode { + Wor -- thy | is the lamb | that was slain | +} + +musicaAlto = \relative { + \clef "treble" + r4 a'2 a4 | fis4. fis8 a2 | g4 fis e2 | +} + +lletraAlto = \lletraSoprano + +musicaTenor = \relative { + \clef "G_8" + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | +} + +lletraTenor = \lletraSoprano + +musicaBaix = \relative { + \clef "bass" + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | +} + +lletraBaix = \lletraSoprano + +upper = \relative { + \clef "treble" + \global + r4 2 4 | + 4. 8 2 | + 4 2 | +} + +lower = \relative { + \clef "bass" + \global + 4 2 4 | + 4. 8 2 | + 4 2 | +} + +\score { + << % combina el pentagrama del cor i del piano en paral·lel + \new ChoirStaff << + \new Staff = "sopranos" << + \set Staff.instrumentName = #"Soprano" + \new Voice = "sopranos" { + \global + \musicaSoprano + } + >> + \new Lyrics \lyricsto "sopranos" { + \lletraSoprano + } + \new Staff = "altos" << + \set Staff.instrumentName = #"Alto" + \new Voice = "altos" { + \global + \musicaAlto + } + >> + \new Lyrics \lyricsto "altos" { \lletraAlto } + \new Staff = "tenors" << + \set Staff.instrumentName = #"Tenor" + \new Voice = "tenors" { + \global + \musicaTenor + } + >> + \new Lyrics \lyricsto "tenors" { \lletraTenor } + \new Staff = "baixos" << + \set Staff.instrumentName = #"Baix" + \new Voice = "baixos" { + \global + \musicaBaix + } + >> + \new Lyrics \lyricsto "baixos" { + \lletraBaix + } + >> % final del pentagrama del cor + \new PianoStaff << + \set PianoStaff.instrumentName = #"Piano" + \new Staff = "upper" \upper + \new Staff = "lower" \lower + >> + >> +} +@end lilypond + +Cap de les plantilles proporciona aquesta disposició amb +exactitud. La més semblant és +@rlearningnamed{SATB vocal score and automatic piano reduction, +Partitura vocal SATB i reducció per a piano automàtica}, +però necessitem canviar la disposició i afegir un acompanyament de +piano que no estigui derivat automàticament de les parts vocals. +Les variables que contenen la música i la lletra de les parts +vocals és adequat, però haurem d'afegir variables per a la +reducció de piano. + +L'ordre en què apareixen els contextos al ChoirStaff de la +plantilla no es correspon amb l'ordre de la partitura vocal que +hem mostrat més amunt. Hem de reordenar-los perquè hi hagi quatre +pentagrames amb la lletra escrita directament a sota de les notes +de cada part. Totes les veus han de ser @code{\voiceOne}, que és +la predeterminada, perquè les instruccions @code{\voiceXXX} es +puguin eliminar. També hem d'especificar la clau de tenor (clau +de sol octava baixa) a les parts de tenor. Encara no hem trobat +la forma que la lletra s'especifica a la plantilla, així que hem +d'utilitzar el mètode que ens resulta familiar. També hem +d'escriure els noms de cada pentagrama. + +En fer-lo així obtenim el ChoirStaff següent: + +@example +\new ChoirStaff << + \new Staff = "sopranos" << + \set Staff.instrumentName = #"Soprano" + \new Voice = "sopranos" @{ + \global + \musicaSoprano + @} + >> + \new Lyrics \lyricsto "sopranos" @{ + \lletraSoprano + @} + \new Staff = "altos" << + \set Staff.instrumentName = #"Alto" + \new Voice = "altos" @{ + \global + \musicaAlto + @} + >> + \new Lyrics \lyricsto "altos" @{ + \lletraAlto + @} + \new Staff = "tenors" << + \set Staff.instrumentName = #"Tenor" + \new Voice = "tenors" @{ + \global + \musicaTenor + @} + >> + \new Lyrics \lyricsto "tenors" @{ + \lletraTenor + @} + \new Staff = "baixos" << + \set Staff.instrumentName = #"Baix" + \new Voice = "baixos" @{ + \global + \musicaBaix + @} + >> + \new Lyrics \lyricsto "baixos" @{ + \lletraBaix + @} +>> % fi del ChoirStaff +@end example + +A continuació podem treballar sobre la part de piano. És fàcil: +tan sols s'ha de treure la part de piano de la plantilla de +@q{Piano solista}: + +@example +\new PianoStaff << + \set PianoStaff.instrumentName = #"Piano" + \new Staff = "superior" \superior + \new Staff = "inferior" \inferior +>> +@end example + +i escriure les definicions de variable per a @code{superior} i +@code{inferior}. + +Els grups ChoirStaff i PianoStaff s'han de combinar utilitzant +angles dobles, atès que els volem apilar l'un sobre l'altre + +@example +<< % combina els grups ChoirStaff i PianoStaff l'un sobre l'altre + \new ChoirStaff << + \new Staff = "sopranos" << + \new Voice = "sopranos" @{ + \global + \musicaSoprano + @} + >> + \new Lyrics \lyricsto "sopranos" @{ + \lletraSoprano + @} + \new Staff = "altos" << + \new Voice = "altos" @{ + \global + \musicaAlto + @} + >> + \new Lyrics \lyricsto "altos" @{ + \lletraAlto + @} + \new Staff = "tenores" << + \clef "G_8" % clave de tenor + \new Voice = "tenores" @{ + \global + \musicaTenor + @} + >> + \new Lyrics \lyricsto "tenores" @{ + \lletraTenor + @} + \new Staff = "baixos" << + \clef "bass" + \new Voice = "baixos" @{ + \global + \musicaBaix + @} + >> + \new Lyrics \lyricsto "baixos" @{ + \lletraBaix + @} + >> % fi del ChoirStaff + + \new PianoStaff << + \set PianoStaff.instrumentName = #"Piano" + \new Staff = "upper" \upper + \new Staff = "lower" \lower + >> +>> +@end example + +En combinar tot això junt i escriure la música dels tres compassos +de l'exemple anterior, obtenim: + +@lilypond[quote,verbatim,ragged-right,addversion] +global = { \key d \major \time 4/4 } +musicaSoprano = \relative { + \clef "treble" + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | +} +lletraSoprano = \lyricmode { + Wor -- thy | is the lamb | that was slain | +} +musicaAlto = \relative { + \clef "treble" + r4 a'2 a4 | fis4. fis8 a2 | g4 fis fis2 | +} +lletraAlto = \lletraSoprano +musicaTenor = \relative { + \clef "G_8" + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | +} +lletraTenor = \lletraSoprano +musicaBaix = \relative { + \clef "bass" + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | +} +lletraBaix = \lletraSoprano +upper = \relative { + \clef "treble" + \global + r4 2 4 | + 4. 8 2 | + 4 2 | +} +lower = \relative { + \clef "bass" + \global + 4 2 4 | + 4. 8 2 | + 4 2 | +} + +\score { + << % combina el ChoirStaff i PianoStaff en paral·lel + \new ChoirStaff << + \new Staff = "sopranos" << + \set Staff.instrumentName = #"Soprano" + \new Voice = "sopranos" { + \global + \musicaSoprano + } + >> + \new Lyrics \lyricsto "sopranos" { + \lletraSoprano + } + \new Staff = "altos" << + \set Staff.instrumentName = #"Alto" + \new Voice = "altos" { + \global + \musicaAlto + } + >> + \new Lyrics \lyricsto "altos" { + \lletraAlto + } + \new Staff = "tenors" << + \set Staff.instrumentName = #"Tenor" + \new Voice = "tenors" { + \global + \musicaTenor + } + >> + \new Lyrics \lyricsto "tenors" { + \lletraTenor + } + \new Staff = "baixos" << + \set Staff.instrumentName = #"Baix" + \new Voice = "baixos" { + \global + \musicaBaix + } + >> + \new Lyrics \lyricsto "baixos" { + \lletraBaix + } + >> % fi ChoirStaff + + \new PianoStaff << + \set PianoStaff.instrumentName = #"Piano " + \new Staff = "upper" \upper + \new Staff = "lower" \lower + >> + >> +} +@end lilypond + + +@node Crear una partitura partint de zero +@subsection Crear una partitura partint de zero +@translationof Building a score from scratch + +@cindex plnantilla, escriure la vostra pròpia +@cindex exemple d'escriptura d'una partitura +@cindex escriure una partitura, exemple +@cindex partitura, exemple d'escriptura + +Després d'adquirir una mica de soltesa en l'escriptura del codi +del LilyPond, us adonareu que és més fàcil construir completament +una partitura partint de zero, que modificar una plantilla. També +podeu desenvolupar el vostre propi estil de forma que s'adapti al +tipus de música que us agradi. Vegem a continuació com +confeccionar una partitura per a un preludi d'òrgan, com a exemple. + +Comencem amb una secció per al encapçalament. Aquí és on van el +títol, nom del compositor, etc., després van les definicions de +les variables, i finalment el bloc de partitura. Comencem a +veure-les per sobre i més tard completarem els detalls. + +Utilitzarem els dos primers compassos del preludi de Bach basat en +@emph{Jesu, meine Freude}, que està escrit per a òrgan amb dos +manuals i pedal. Conté els dos compassos següents de música al +final de la secció. La part del manual superior té dues veus, i +l'inferior i el pedal, una veu cada u. Així doncs, necessitem +quatre definicions per a la música i una més per definir el compàs +i la tonalitat: + +@example +\version @w{"@version{}"} +\header @{ + title = "Jesu, meine Freude" + composer = "J S Bach" +@} +keyTime = @{ \key c \minor \time 4/4 @} +MusicaManualUVeuU = @{ s1 @} +MusicaManualUVeuDos = @{ s1 @} +MusicaManualDos = @{ s1 @} +MusicaOrganPedal = @{ s1 @} + +\score @{ +@} +@end example + +De moment hem escrit tan sols una nota espaiadora, @code{s1}, en +lloc de la música de veritat. Li afegirem més endavant. + +A continuació vegem què va al bloc de partitura. Senzillament, +reflectirem l'estructura de pentagrames que desitgem. La música +d'òrgan s'escriu s'escriu en general en tres pentagrames, un per +cada un dels manuals i l'altre pel pedal. Els pentagrames dels +manuals s'abasten amb una clau, així que els inclourem en un grup +PianoStaff. La primera part de manual té dues veus, i la segona +una sola. + +@example +\new PianoStaff << + \new Staff = "ManualU" << + \new Voice @{ + \MusicaManualUVeuU + @} + \new Voice @{ + \MusicaManualUVeuDos + @} + >> % fi del context de Staff ManualU + \new Staff = "ManualDos" << + \new Voice @{ + \MusicaManualDos + @} + >> % fi del context de Staff ManualDos +>> % fi del context de PianoStaff +@end example + +Després, hem d'afegir un pentagrama per a l'òrgan de pedal. Això +va per sota del PianoStaff, però ha de ser simultani amb ell, per +la qual cosa escrivim angles dobles rodejant als dos. Si ens +oblidem d'això, es produirà un error al fitxer log de registre. +És un error molt comú que cometrà abans o després! Intenteu +copiar l'exemple final que apareix al final de la secció, esborreu +els dobles angles i processeu el fitxer per veure quin error +produeix. + +@example +<< % el grup PianoStaff i el pentagrama de Pedal son simultanis + \new PianoStaff << + \new Staff = "ManualU" << + \new Voice @{ + \MusicaManualUVeuU + @} + \new Voice @{ + \MusicaManualUVeuDos + @} + >> % fi del context de Staff ManualU + \new Staff = "ManualDos" << + \new Voice @{ + \MusicaManualDos + @} + >> % fi del context de Staff ManualDos + >> % fi del context de PianoStaff + \new Staff = "OrganPedal" << + \new Voice @{ + \MusicaOrganPedal + @} + >> +>> +@end example + +No és necessari utilitzar la construcció simultània @code{<< +@dots{} >>} per al pentagrama del manual dos i el pentagrama del +òrgan de pedal, atès que contenen una única expressió, però no fa +mal, i és un bon costum utilitzar sempre dobles angles després de +@code{\new Staff} quan hi diverses veus. El contrari és cert per +a les veus: normalment han d'anar seguides de claudàtors @code{@{ +@dots{} @}} en cas que tinguem música codificada com a variables +diferents que s'han de situar consecutivament. + +Afegim aquesta estructura al bloc de partitura, i ajustem el +sagnat dels marges. També escrivim els claudàtors +corresponents, ens assegurem que les pliques i lligadures d'unió +i expressió en cada una de les veus del pentagrama superior +apunten en la direcció adequada amb @code{\voiceOne} i +@code{\voiceTwo} i escrivim el compàs i la tonalitat en cadascú +dels pentagrames usant la nostra variable prèviament definida +@code{\TimeKey}. + +@example +\score @{ + << % el grup PianoStaff i el pentagrama de Pedal són simultanis + \new PianoStaff << + \new Staff = "ManualU" << + \keyTime % establir compàs i tonalitat + \clef "treble" + \new Voice @{ + \voiceOne + \MusicaManualUVeuU + @} + \new Voice @{ + \voiceTwo + \MusicaManualUVeuDos + @} + >> % fi del context de Staff ManualU + \new Staff = "ManualDos" << + \keyTime + \clef "bass" + \new Voice @{ + \MusicaManualDos + @} + >> % fi del context de Staff ManualDos + >> % fi del context de PianoStaff + \new Staff = "OrganPedal" << + \keyTime + \clef "bass" + \new Voice @{ + \MusicaOrganPedal + @} + >> % fi del pentagrama de OrganPedal + >> +@} % fi del context Score +@end example + +@cindex ampliabilitat de las pautes +@cindex pautes, ampliabilitat + +La disposició anterior dels pentagrames d'òrgan és gairebé +perfecta; tanmateix, hi ha un lleuger defecte que no és +visible quan s'observa un sol sistema: la distància entre el +pentagrama de pedal i el de la mà esquerra hauria de ser +aproximadament la mateixa que la que hi ha entre els pentagrames +de les mans esquerra i dreta. Concretament, la ampliabilitat dels +pentagrames dins d'un context @code{PianoStaff} és limitada (de +forme que la distància entre els pentagrames de les mans esquerra +i dreta mai no creixin excessivament), i el pentagrama dels pedals +hauria de comportar-se de una manera semblant. + +@cindex sub-propietats +@cindex propietats, sub-propietats +@cindex objectes gràfics +@cindex gràfics, objectes +@cindex grobs + +El grau d'ampliabilitat i separabilitat dels pentagrames es pot +controlar amb la propietat @code{staff-staff-spacing} de +l'@q{objecte gràfic} @code{VerticalAxisGroup} (els objectes gràfics +reben en general el nom de @q{grob}s a la documentació del +LilyPond); no us preocupeu de moment dels detalls, ja que això +s'explica més tard de forma exhaustiva. Els més curiosos podeu +donar una ullada a @ruser{Overview of modifying properties}. +En aquest cas volem modificar solament la sub-propietat +@code{stretchability}. Un altre cop, els curiosos trobareu els +valors predeterminats per a la propietat staff-staff-spacing al +fitxer @file{scm/define-grobs.scm} examinant la definició del grob +@code{VerticalAxisGroup}. El valor de @code{stretchability} +s'agafa de la definició del context @code{PianoStaff} (al fitxer +@file{ly/engraver-init.ly}) de forma que els valors siguin idèntics. + +@example +\score @{ + << % el grup PianoStaff i el pentagrama de Pedal son simultanis + \new PianoStaff << + \new Staff = "ManualU" << + \keyTime % establir compàs y tonalitat + \clef "treble" + \new Voice @{ + \voiceOne + \MusicaManualUVeuU + @} + \new Voice @{ + \voiceTwo + \MusicaManualUVeuDos + @} + >> % % fi del context de Staff ManualU + \new Staff = "ManualDos" \with @{ + \override VerticalAxisGroup.staff-staff-spacing.stretchability = 5 + @} << + \keyTime + \clef "bass" + \new Voice @{ + \MusicaManualDos + @} + >> % fi del context de Staff ManualDos + >> % fi del context de PianoStaff + \new Staff = "OrganPedal" << + \keyTime + \clef "bass" + \new Voice @{ + \MusicaOrganPedal + @} + >> % fi del pentagrama de OrganPedal + >> +@} % fi del context Score +@end example + +Amb això es completa l'estructura. Tota música per a òrgan de +tres pentagrames tindrà una estructura semblant, tot i que el +nombre de veus pot variar. Tot el que ens queda és afegir la +música, i combinar totes les parts. + +@lilypond[quote,verbatim,ragged-right,addversion] +\header { + title = "Jesu, meine Freude" + composer = "J S Bach" +} +keyTime = { \key c \minor \time 4/4 } +MusicaManualUVeuU = \relative { + g'4 g f ees | + d2 c | +} +MusicaManualUVeuDos = \relative { + ees'16 d ees8~ 16 f ees d c8 d~ d c~ | + 8 c4 b8 c8. g16 c b c d | +} +MusicaManualDos= \relative { + c'16 b c8~ 16 b c g a8 g~ 16 g aes ees | + f16 ees f d g aes g f ees d ees8~ 16 f ees d | +} +MusicaOrganPedal = \relative { + r8 c16 d ees d ees8~ 16 a, b g c b c8 | + r16 g ees f g f g8 c,2 | +} + +\score { + << % PianoStaff i Pedal Staff han de ser simultanis + \new PianoStaff << + \new Staff = "ManualU" << + \keyTime % establir la clau i l'armadura + \clef "treble" + \new Voice { + \voiceOne + \MusicaManualUVeuU + } + \new Voice { + \voiceTwo + \MusicaManualUVeuDos + } + >> % fi del context Staff ManualU + \new Staff = "ManualDos" \with { + \override VerticalAxisGroup.staff-staff-spacing.stretchability = 5 + } << + \keyTime + \clef "bass" + \new Voice { + \MusicaManualDos + } + >> % fi del context Staff ManualDos + >> % fi del context PianoStaff + \new Staff = "PedalOrgan" << + \keyTime + \clef "bass" + \new Voice { + \MusicaOrganPedal + } + >> % fi del context Staff PedalOrgan + >> +} % fi del context Score +@end lilypond + +@seealso +Glossari musical: +@rglos{system}. + +@node Estalvi de tecleig mitjançant variables i funcions +@subsection Estalvi de tecleig mitjançant variables i funcions +@translationof Saving typing with variables and functions + +@cindex variables +@cindex identificadors + +Arribats a aquest punt, heu vist coses d'aquest tipus: + +@lilypond[quote,verbatim,ragged-right] +hornNotes = \relative { c''4 b dis c } + +\score { + { + \hornNotes + } +} +@end lilypond + +Fins i tot us adonareu que això pot ser útil en música +minimalista: + +@lilypond[quote,verbatim,ragged-right] +fragmentA = \relative { a'4 a8. b16 } +fragmentB = \relative { a'8. gis16 ees4 } + +violí = \new Staff { + \fragmentA \fragmentA | + \fragmentB \fragmentA | +} + +\score { + { + \violí + } +} +@end lilypond + +Tot i així també es pot fer servir aquests identificadors (que +també es coneixen com a variables, macros o instruccions +definides per l'usuari) per fer trucs: + +@c TODO Avoid padtext - not needed with skylining +@lilypond[quote,verbatim,ragged-right] +dolce = \markup { \italic \bold dolce } + +padText = { \once \override TextScript.padding = #5.0 } +fthenp =_\markup { + \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p +} + +violí = \relative { + \repeat volta 2 { + c''4._\dolce b8 a8 g a b | + \padText + c4.^"hi there!" d8 e' f g d | + c,4.\fthenp b8 c4 c-. | + } +} + +\score { + { + \violí + } + \layout { ragged-right = ##t } +} +@end lilypond + +Òbviament aquests identificadors són útils per estalviar tecleig. +Però són dignes de tenir en compte fins i tot si s'utilitzaran un +sol cop: redueixen la complexitat. Examinem l'exemple anterior +reescrit sense cap identificador. Trobareu que és molt més +difícil de llegir, sobretot l'última línia. + +@example +violí = \relative @{ + \repeat volta 2 @{ + c''4._\markup @{ \italic \bold dolce @} b8 a8 g a b | + \once \override TextScript.padding = #5.0 + c4.^"hi there!" d8 e' f g d | + c,4.\markup @{ + \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p + @} + b8 c4 c-. | + @} +@} +@end example + +@c TODO Replace the following with a better example -td +@c Skylining handles this correctly without padText + +Fins ara hem contemplat la substitució estàtica: quan el LilyPonod +es troba amb @code{\padText}, el substitueix amb allò que hem +definit que sigui (és a dir, tot el que està a la dreta de +@code{padtext=}). + +El LilyPond també pot gestionar substitucions no estàtiques +(penseu en elles com funcions). + +@lilypond[quote,verbatim,ragged-right] +padText = +#(define-music-function + (padding) + (number?) + #{ + \once \override TextScript.padding = #padding + #}) + +\relative { + c'''4^"piu mosso" b a b | + \padText #1.8 + c4^"piu mosso" d e f | + \padText #2.6 + c4^"piu mosso" fis a g | +} +@end lilypond + +La utilització d'identificadors també és una bona forma de reduir +el treball si la sintaxis d'entrada del LilyPonod canvia (vegeu +@rprogram{Actualització de fitxers amb convert-ly}). Si teniu una sola +definició (com ara @code{\dolce}) per a tots els fitxers (vegeu +@rlearningnamed{Style sheets,Fulls d'estil}), i després la sintaxis es +modifica, sols haurà d'actualitzar la seva definició @code{\dolce} +única, enlloc de haver de fer canvis a cadascú dels fitxers +@file{.ly}. + +@node Partitures i particel·les +@subsection Partitures i particel·les +@translationof Scores and parts + +En música orquestral, totes les notes s'imprimeixen dues vegades. +Un cop en les particel·les per a tots els músics, i una altra per +a la partitura del director. Els identificadors es poden usar per +evitar la duplicació del treball. La música s'escriu un cop +s'emmagatzema en una variable. El contingut d'aquesta variable +s'usa després per generar tant la particel·la com la partitura del +director. + +És molt convenient definir les notes en un fitxer especial. Per +exemple, suposem que el fitxer @file{trompa.ly} conté la següent +part d'un duo per a trompa i fagot: + +@example +notesTrompa = \relative @{ + \time 2/4 + r4 f8 a | cis4 f | e4 d | +@} +@end example + +@noindent +Després es fa una particel·la escrivint en un fitxer el següent: + +@example +\include "trompa.ly" + +\header @{ + instrument = "Trompa en Fa" +@} + +@{ + \transpose f c' \notesTrompa +@} +@end example + +La línia + +@example +\include "trompa.ly" +@end example + +@noindent +substitueix el contingut de @file{trompa.ly} en aquesta posició +dins del fitxer, així que @code{notesTrompa} es defineix amb +posterioritat. La instrucció @code{\transpose f@tie{}c'} indica +que l'argument constituït per @code{\notesTrompa} s'ha de +transposar una quina cap amunt. El que sona com @code{f} s'escriu +com @code{c'}, el que correspon amb el to d'afinació d'una trompa +normal en@tie{}Fa. La transposició es pot veure a la següent +sortida + +@lilypond[quote,ragged-right] +\transpose f c' \relative { + \time 2/4 + r4 f8 a | cis4 f | e4 d | +} +@end lilypond + +A peces per a conjunt, amb freqüència una de les veus no sona +durant molts compasso. Això queda denotat per un silenci +especial, el silenci multicompàs. S'introdueix amb una @code{R} +majúscula seguida d'una duració (@code{1}@tie{}en el cas de la +rodona, @code{2}@tie{}en el caso de una blanca, +etc.). Multiplicant la duració es poden construir silencis més +llargs. Per exemple, aquest silenci ocupa 3@tie{}compassos de 2/4 + +@example +R2*3 +@end example + +Quan s'imprimeix la particel·la s'han de comprimir els silencis +multicompàs. Això es fa establint una variable de temps de execució + +@example +\set Score.skipBars = ##t +@end example + +@noindent +Aquesta instrucció estableix el valor de la propietat +@code{skipBars} al context de @code{Score} a vertader +(@code{##t}). Anteposant el silenci i aquesta opció a la música +anterior, arribem al següent resultat + +@lilypond[quote,ragged-right] +\transpose f c' \relative { + \time 2/4 + \set Score.skipBars = ##t + R2*3 | + r4 f8 a | cis4 f | e4 d | +} +@end lilypond + +Aquesta partitura es fa combinant tota la música junta. Suposant +que l'altra veu es troba dins de @code{notesFagot} al fitxer +@file{fagot.ly}, la partitura es fa amb + +@example +\include "fagot.ly" +\include "trompa.ly" + +<< + \new Staff \notesTrompa + \new Staff \notesFagot +>> +@end example + +@noindent +el que ens porta a + +@lilypond[quote,ragged-right] +\relative << + \new Staff { + \clef "treble" + \time 2/4 + R2*3 | + r4 f8 a | cis4 f | e4 d | + } + \new Staff { + \clef "bass" + \time 2/4 + r4 d,8 f | gis4 c | b4 bes | + a8 e f4 | g4 d | gis4 f | + } +>> +@end lilypond diff --git a/Documentation/ca/learning/templates.itely b/Documentation/ca/learning/templates.itely new file mode 100644 index 0000000000..e6c0e56542 --- /dev/null +++ b/Documentation/ca/learning/templates.itely @@ -0,0 +1,245 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- + +@ignore + Translation of GIT committish: 67a345f965d169bc1acd23ff4160914fb2142f38 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c \version "2.16.0" + +@node Plantilles +@appendix Plantilles +@translationof Templates + +Aquesta secció del manual conté plantilles amb la partitura del +LilyPond ja preparada. Sols heu d'escriure les notes, llençar el +LilyPond i gaudir d'unes belles partitures impreses! + +@menu +* Plantilles de pentagrama únic:: +* Plantilles de piano:: +* Plantilles de quartet de corda:: +* Plantilles de conjunts vocals:: +* Plantilles orquestrals:: +* Plantilles per a notació antiga:: +* Altres plantilles:: +@end menu + + +@node Plantilles de pentagrama únic +@appendixsec Plantilles de pentagrama únic +@translationof Single staff templates + +@menu +* Sols notes:: +* Notes i lletra:: +* Notes i acords:: +* Notes lletra i acords:: +@end menu + +@node Sols notes +@appendixsubsec Sols notes +@translationof Notes only + +@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion] +{single-staff-template-with-only-notes.ly} + +@node Notes i lletra +@appendixsubsec Notes i lletra +@translationof Notes and lyrics + +@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion] +{single-staff-template-with-notes-and-lyrics.ly} + +@node Notes i acords +@appendixsubsec Notes i acords +@translationof Notes and chords + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{single-staff-template-with-notes-and-chords.ly} + +@node Notes lletra i acords +@appendixsubsec Notes, lletra i acords +@translationof Notes lyrics and chords + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{single-staff-template-with-notes,-lyrics,-and-chords.ly} + + +@node Plantilles de piano +@appendixsec Plantilles de piano +@translationof Piano templates + +@menu +* Piano sol:: +* Piano i melodia amb lletra:: +* Piano amb lletra centrada:: +@end menu + +@node Piano sol +@appendixsubsec Piano sol +@translationof Solo piano + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{piano-template-simple.ly} + +@node Piano i melodia amb lletra +@appendixsubsec Piano i melodia amb lletra +@translationof Piano and melody with lyrics + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{piano-template-with-melody-and-lyrics.ly} + +@node Piano amb lletra centrada +@appendixsubsec Piano amb lletra centrada +@translationof Piano and melody with lyrics + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{piano-template-with-centered-lyrics.ly} + + +@node Plantilles de quartet de corda +@appendixsec Plantilles de quartet de corda +@translationof String quartet templates + +@menu +* Quartet de corda simple:: +* Particel·les de quartet de corda:: +@end menu + +@node Quartet de corda simple +@appendixsubsec Quartet de corda simple +@translationof String quartet + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{string-quartet-template-simple.ly} + +@node Particel·les de quartet de corda +@appendixsubsec Particel·les de quartet de corda +@translationof String quartet parts + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{string-quartet-template-with-separate-parts.ly} + + +@node Plantilles de conjunts vocals +@appendixsec Plantilles de conjunts vocals +@translationof Vocal ensembles templates + +@menu +* Partitura vocal SATB:: +* Partitura vocal SATB i reducció per a piano automàtica:: +* SATB amb contextos alineats:: +* SATB sobre quatre pentagrames:: +* Estrofes a sol y tornada a dues veus:: +* Melodies d'himnes:: +* Salms:: +@end menu + +@node Partitura vocal SATB +@appendixsubsec Partitura vocal SATB +@translationof SATB vocal score + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{vocal-ensemble-template.ly} + +@node Partitura vocal SATB i reducció per a piano automàtica +@appendixsubsec Partitura vocal SATB i reducció per a piano automàtica +@translationof SATB vocal score and automatic piano reduction + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{vocal-ensemble-template-with-automatic-piano-reduction.ly} + +@node SATB amb contextos alineats +@appendixsubsec SATB amb contextos alineats +@translationof SATB with aligned contexts + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly} + +@node SATB sobre quatre pentagrames +@appendixsubsec SATB sobre quatre pentagrames +@translationof SATB on four staves + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{satb-choir-template---four-staves.ly} + +@node Estrofes a sol y tornada a dues veus +@appendixsubsec Estrofes a sol y tornada a dues veus +@translationof Solo verse and two-part refrain + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{vocal-ensemble-template-with-verse-and-refrain.ly} + +@node Melodies d'himnes +@appendixsubsec Melodies d'himnes +@translationof Hymn tunes + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{hymn-template.ly} + +@node Salms +@appendixsubsec Salms +@translationof Psalms + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{anglican-psalm-template.ly} + + +@node Plantilles orquestrals +@appendixsec Plantilles orquestrals +@translationof Orchestral templates + +@menu +* Orquestra cor i piano:: +@end menu + +@node Orquestra cor i piano +@appendixsubsec Orquestra, cor i piano +@translationof Orchestra choir and piano + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{orchestra,-choir-and-piano-template.ly} + + +@node Plantilles per a notació antiga +@appendixsec Plantilles per a notació antiga +@translationof Ancient notation templates + +@menu +* Transcripció de música mensural:: +* Plantilla per a transcripció de cant gregorià:: +@end menu + +@node Transcripció de música mensural +@appendixsubsec Transcripció dfe música mensural +@translationof Transcription of mensural music + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{incipit.ly} + +@node Plantilla per a transcripció de cant gregorià +@appendixsubsec Plantilla per a transcripció de cant gregorià +@translationof Gregorian transcription template + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{ancient-notation-template----modern-transcription-of-gregorian-music.ly} + + +@node Altres plantilles +@appendixsec Altres plantilles +@translationof Other templates + +@menu +* Combo de jazz:: +@end menu + +@node Combo de jazz +@appendixsubsec Combo de jazz +@translationof Jazz combo + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{jazz-combo-template.ly} diff --git a/Documentation/ca/learning/tutorial.itely b/Documentation/ca/learning/tutorial.itely new file mode 100644 index 0000000000..32e37b6b89 --- /dev/null +++ b/Documentation/ca/learning/tutorial.itely @@ -0,0 +1,849 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- + +@ignore + Translation of GIT committish: d378daa101069ce6497292b0f4a7f6ce2e9b51f0 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@include included/generating-output.itexi + +@c \version "2.19.21" + +@node Tutorial +@chapter Tutorial +@translationof Tutorial + +Aquest capítol ofereix una introducció bàsica al treball amb el Lilypond. + +@menu +* Compilació d'un fitxer:: +* Com escriure fitxers d'entrada:: +* Gestió dels errors:: +* Com llegir els manuals:: +@end menu + +@node Compilació d'un fitxer +@section Compilació d'un fitxer +@translationof Compiling a file + +Aquesta secció presenta el concepte de @qq{compilació}: el +processament dels documents d'entrada del LilyPond (escrits per +vos mateix) per produir fitxers de sortida. + +@menu +* Escriptura del codi d'entrada:: +* MacOS X:: +* Windows:: +* Línia d'ordres:: +@end menu + +@node Escriptura del codi d'entrada +@subsection Escriptura del codi d'entrada +@translationof Entering input + +@cindex compilació +@cindex exemple inicial +@cindex inicial, exemple +@cindex majúscules, sensible a + +@menu +* Generació del resultat:: +@end menu + +@qq{Compilació} és una paraula que significa processar un text +d'entrada en format del LilyPond per produir un fitxers que es pot +imprimir i (de manera opcional) un fitxer MIDI que es pot +reproduir. El primer exemple mostra l'aspecte d'un senzill fitxer +de text d'entrada. + +Aquest exemple mostra un fitxer d'entrada senzill: + +@example +\version "@w{@version{}}" +@{ + c' e' g' e' +@} +@end example + +El resultat té aquest aspecte: + +@c in this case we don't want verbatim +@lilypond[quote] +{ + c' e' g' e' +} +@end lilypond + +@warning{la música i la lletra escrita al codi d'entrada del +Lilypond ha d'anar sempre entre @w{@strong{@{ claudàtors @}}}. +Els claudàtors haurien també d'estar rodejats per espais a no ser +que es trobin al principi o al final d'una línia, per evitar +ambigüitats. És possible que s'ometen en alguns exemples del +manual actual, però eviteu d'ometre-les a la vostra pròpia música! +Per veure més informació sobre la presentació dels exemples del +manual, consulteu +@ref{Com llegir els manuals}.} + +A més, l'entrada del Lilypond és @strong{sensible a les majúscules}. +@w{@samp{ @{ c d e @}}} és una entrada vàlida; @w{@samp{@{ C D E @}}} produeix +un missatge d'error. + +@smallspace + +@node Generació del resultat +@unnumberedsubsubsec Generació del resultat +@translationof Producing output + +@cindex PDF, fitxer +@cindex veure la música +@cindex editors de text + +El mètode per produir un resultat imprès depèn del nostre sistema +operatiu i del programa o programes que utilitzem. + +@itemize + +@item +@ref{MacOS X, @sourceimage{logo-macosx,,,}} +@ref{MacOS X, MacOS X} (gràfic) + +@item +@ref{Windows, @sourceimage{logo-windows,,,}} +@ref{Windows, Microsoft Windows} (gràfic) + +@item +@ref{Línia d'ordres, @sourceimage{logo-linux,,,} +@sourceimage{logo-freebsd,,,} +@sourceimage{logo-macosx,,,} +@sourceimage{logo-windows,,,} +} +@ref{Línia d'ordres, Tots els sistemes operatius} (consola) + +@end itemize + +Hi ha diversos altres editors de text amb un suport específic a +l'edició de text del LilyPond. Per veure més informació, consulteu +@rweb{Entorns millorats}. + +@warning{El primer cop que executeu el LilyPond, trigarà un minut +o dos perquè totes les tipografies del sistema han de ser +analitzades prèviament. Després d'això, el LilyPond serà molt més ràpid!} + +@node MacOS X +@subsection MacOS X + +@cindex execució del LilyPond sota el MacOS X +@cindex MacOS X, execució del LilyPond + +@lilypadOSX + + +@node Windows +@subsection Windows + +@cindex execució del LilyPond sota el Windows +@cindex Windows, execució del LilyPond + +@lilypadWindows + + +@node Línia d'ordres +@subsection Línia d'ordres +@translationof Command-line + +@cindex execució del LilyPond sota l'Unix +@cindex Unix, execució del LilyPond + +@lilypadCommandLine + +@node Com escriure fitxers d'entrada +@section Com escriure fitxers d'entrada +@translationof How to write input files + +Aquesta secció presenta una part de la sintaxi bàsica del LilyPond +com ajuda perquè us inicieu a l'escriptura de fitxers d'entrada. + +@menu +* Notació senzilla:: +* Treball sobre els fitxers d'entrada:: +@end menu + + +@node Notació senzilla +@subsection Notació senzilla +@translationof Simple notation + +@cindex senzilla, notació +@cindex notació senzilla + +@menu +* Altures:: +* Duracions (valors rítmics):: +* Silencis:: +* Indicació de compàs:: +* Indicacions de tempo:: +* Clau:: +* Tot a l'hora:: +@end menu + +El LilyPond afegirà certs elements de notació de manera +automàtica. A l'exemple següent hem especificat solament quatre +altures, però el LilyPond ha afegit la clau, el compàs i les +duracions. + +@lilypond[verbatim,quote] +{ + c' e' g' e' +} +@end lilypond + +@noindent +Aquest comportament es pot modificar, però en general aquests +valors automàtics són adequats. + +@node Altures +@unnumberedsubsubsec Altures +@translationof Pitches + +@cindex altures +@cindex notes +@cindex relatiu, mode +@cindex apòstrof +@cindex cometa simple +@cindex coma +@cindex alteracions i mode relatiu +@cindex relatiu, mode, alteracions i + +@funindex \relative +@funindex ' +@funindex , + +Glossari musical: +@rglos{pitch}, +@rglos{interval}, +@rglos{scale}, +@rglos{middle C}, +@rglos{octave}, +@rglos{accidental}. + +La manera més senzilla d'introduir les notes és mitjançant la +utilització del model @code{\relative} (relatiu). En aquest mode, +s'escull l'octava automàticament sota el supòsit que la següent +nota es col·locarà sempre el més a prop de la nota actual, és a +dir, es col·locarà a l'octava compresa dins de fins a tres espais +de pentagrama a partir de la nota anterior. Començarem per +introduir el fragment musical més elemental: una +@notation{escala}, on cada nota està compresa dins de tans sols un +espai de pentagrama des de la nota anterior. + +@lilypond[verbatim,quote] +% set the starting point to middle C +\relative { + c' d e f + g a b c +} +@end lilypond + +La nota inicial és el @notation{Do central}. Cada nota successiva +es col·loca el més a prop possible de la nota prèvia (en altres +paraules: la primera @samp{c} és el Do més proper al Do central; a +aquesta nota la segueix el Re més a prop a la nota prèvia, i així +successivament). Podem crear melodies amb intervals més grans, +fins i tot sense deixar d'utilitzar el mode relatiu: + +@lilypond[verbatim,quote] +\relative { + d' f a g + c b f d +} +@end lilypond + +@noindent +No és necessari que la primera nota de la melodia comenci +exactament a la nota que especifica l'altura d'inici. A l'exemple +anterior, la primera nota (@code{d}) és el Re més proper al Do central. + +Afegint (o eliminant) cometes simples @code{'} o comes @code{,} a +l'ordre @q{@w{@code{@bs{}\relative c'}}}, podem canviar l'octava d'inici: + +@c KEEP LY +@lilypond[verbatim,quote] +% una octava per sobre del Do central +\relative { + e'' c a c +} +@end lilypond + +Al principi, el mode relatiu pot resultar una mica confús, però és +la forma més senzilla d'introduir la major par de les melodies. +Vegem com funciona en la pràctica aquest càlcul relatiu. +Començant per Si, que està situat a la línia central en clau de +Sol, podem arribar Do, Re i Mi dins dels tres espais de pentagrama +cap amunt, i La, Sol i Fa dins del tres espais cap a baix. Per +tant, si la nota següent a Si és Do, Re o Mi se suposarà que està +per sobre del Si, mentre que La, Sol o Fa s'entendran situats per +sota. + +@c KEEP LY +@lilypond[verbatim,quote] +\relative { + b' c % el Do està 1 espai per sobre, és el Do de dalt + b d % el Re està 2 espais per sobre o 5 per sota, és el Re de dalt + b e % el Mi està 3 espais per sobre o 4 per sota, és el Mi de dalt + b a % el La està 6 espais per sobre o 1 per sota, és el La de sota + b g % el Sol està 5 espais per sobre o 2 per sota, és el Sol de sota + b f % el Fa està 4 espais per sobre o 3 per sota, és el F de sota +} +@end lilypond + +El mateix exactament passa quan qualssevol d'aquestes notes porten +un sostingut o un bemoll. Les @notation{Alteracions accidentals} +s' @strong{ignoren totalment} al càlcul de la posició +relativa. Exactament el mateix compte d'espais de pentagrama es fa +a partir d'una nota situada en qualsevol altre lloc del mateix pentagrama. + +Per afegir intervals més grans que tres espais de pentagrama, podem +elevar una @notation{octava} afegint una cometa simple @code{'} (o +apòstrof) a continuació del nom de la nota. També podem baixar +una octava escrivint una coma @code{,} a continuació del nom de la +nota. + +@lilypond[verbatim,quote] +\relative { + a' a, c' f, + g g'' a,, f' +} +@end lilypond + +@noindent +Per pujar o baixar una nota en dos (o més!) octaves, utilitzem +diverses @code{''} o @code{,,} (però teniu cura d'utilitzar dos +cometes simples @code{''} i no una cometa doble @code{"}@tie{}!) +@c " - keeps quotes in order for context-sensitive editor -td + +@node Duracions (valors rítmics) +@unnumberedsubsubsec Duracions (valors rítmics) +@translationof Durations (rhythms) + +@cindex duracions de les notes +@cindex notes, duracions de +@cindex ritmes +@cindex rodona +@cindex blanca +@cindex negra +@cindex figura amb puntet +@cindex puntet +@cindex notació de las duracions + +Glossari musical: +@rglos{beam}, +@rglos{duration}, +@rglos{whole note}, +@rglos{half note}, +@rglos{quarter note}, +@rglos{dotted note}. + +La @notation{duració} d'una nota s'especifica mitjançant un número +després del nom de la nota: @code{1} significa @notation{rodona}, +@code{2} significa @notation{blanca}, @code{4} significa +@notation{negra} i així successivament. Les @notation{barres de +corxera} s'afegeixen automàticament. + +Si no especifiqueu una duració, s'utilitza la duració prèvia per +a la nota següent. La figura per omissió de la primera nota és +una negra. + +@lilypond[verbatim,quote] +\relative { + a'1 + a2 a4 a8 a + a16 a a a a32 a a a a64 a a a a a a a a2 +} +@end lilypond + +Per crear @notation{notes amb puntet}, afegiu un punt @code{.} al +número de la duració. La duració d'una nota amb puntet s'ha +d'especificar de forma explícita (és a dir: mitjançant un número). + +@lilypond[verbatim,quote] +\relative { + a'4 a a4. a8 + a8. a16 a a8. a8 a4. +} +@end lilypond + +@node Silencis +@unnumberedsubsubsec Silencis +@translationof Rests + +@cindex silenci +@cindex notació dels silencis + +Glossari musical: +@rglos{rest}. + +Un @notation{silenci} s'introdueix igual que si fos un anota amb +el nom @code{r}@tie{}: + +@lilypond[verbatim,quote] +\relative { + a'4 r r2 + r8 a r4 r4. r8 +} +@end lilypond + + +@node Indicació de compàs +@unnumberedsubsubsec Indicació de compàs +@translationof Time signature + +@cindex compàs, indicació de + +@funindex \time + +Glossari musical: +@rglos{time signature}. + +La @notation{indicació de compàs} es pot establir amb l'ordre +@code{\time} : + +@lilypond[verbatim,quote] +\relative { + \time 3/4 + a'4 a a + \time 6/8 + a4. a + \time 4/4 + a4 a a a +} +@end lilypond + +@node Indicacions de tempo +@unnumberedsubsubsec Indicacions de tempo +@translationof Tempo marks + +@cindex tempo, indicacions de +@cindex metrònom, indicacions + +@funindex \tempo + +Glossari musical: +@rglos{tempo indication}, +@rglos{metronome}. + +La @notation{indicació de tempo} i la @notation{indicació +de metrònom} poden establir-se amb l'ordre @code{\tempo}: + +@lilypond[verbatim,quote] +\relative { + \time 3/4 + \tempo "Andante" + a'4 a a + \time 6/8 + \tempo 4. = 96 + a4. a + \time 4/4 + \tempo "Presto" 4 = 120 + a4 a a a +} +@end lilypond + + +@node Clau +@unnumberedsubsubsec Clau +@translationof Clef + +@cindex clau +@cindex sol, clau de +@cindex do en tercera, clau de +@cindex do en quarta, clau de +@cindex fa, clau de +@cindex soprano +@cindex alto +@cindex tenor +@cindex baix + +@funindex \clef + +Glossari musical: +@rglos{clef}. + +La @notation{clau} es pot establir utilitzant l'ordre +@code{\clef} : + +@lilypond[verbatim,quote] +\relative { + \clef "treble" + c'1 + \clef "alto" + c1 + \clef "tenor" + c1 + \clef "bass" + c1 +} +@end lilypond + + +@node Tot a l'hora +@unnumberedsubsubsec Tot a l'hora +@translationof All together + +Aquí teniu un petit exemple que mostra tots els elements anteriors +a l'hora: + +@lilypond[verbatim,quote] +\relative { + \clef "bass" + \time 3/4 + \tempo "Andante" 4 = 120 + c,2 e8 c' + g'2. + f4 e d + c4 c, r +} +@end lilypond + + +@seealso +Referència de la notació: +@rusernamed{Writing pitches,Escriptura de les notes}, +@rusernamed{Writing rhythms,Escriptura dels ritmes}, +@rusernamed{Writing rests,Escriptura de silencis}, +@rusernamed{Time signature,Indicació de compàs}, +@rusernamed{Clef,Clau}. + +@node Treball sobre els fitxers d'entrada +@subsection Treball sobre els fitxers d'entrada +@translationof Working on input files + +@cindex claudàtors +@cindex comentaris +@cindex línia, comentari de +@cindex comentari de línia +@cindex bloc, comentari de +@cindex majúscules, sensible a +@cindex espais, insensible a +@cindex expressions +@cindex versions +@cindex versió +@cindex número de versió + + +@funindex \version +@funindex { ... } +@funindex % +@funindex %@{ ... %@} + +Els fitxers d'entrada del LilyPond són com els fitxers font de +molts llenguatges de programació corrents. Contenen un enunciat +de versió, són sensibles a les majúscules i generalment els espais +s'ignoren. Les expressions es formen amb claudàtors +@w{@code{@{ @}}} i els comentaris es denoten per un signe de +percentatge (@code{%}) o per @w{@code{%@{ @dots{} %@}}}@tie{}. + +Si no enteneu res de la frase anterior, no us preocupeu! A +continuació explicarem el significat de tots aquests termes: + +@itemize + +@item +@strong{Enunciat de la versió}: Tot fitxer del LilyPond ha de +contenir un enunciat de versió. Un enunciat de versió és una +línia que descriu la versió del LilyPond per a la es va escriure +aquest fitxer, com a l'exemple següent: + +@example +\version "@w{@version{}}" +@end example + +Per conveni, l'enunciat de versió es col·loca al principi del +fitxer del LilyPond. + +L'enunciat de versió és important per dos motius com a mínim. En +primer lloc, permet l'actualització automàtica del codi d'entrada +conforme es va modificant la sintaxi del LilyPond. En segon lloc, +indica la versió del LilyPond que es necessita per compilar el +fitxer. + +Si no s'escriu cap enunciat de versió al fitxer d'entrada, el +LilyPond imprimeix un advertiment durant la compilació del fitxer. + +@item +@strong{Sensible a les majúscules}: el fet que s'introdueixi una +lletra en minúscules (per exemple @w{@code{a, b, s, t}}) o en +majúscules (per exemple @w{@code{A, B, S, T}}) té importància. +Les notes són minúscules: @w{@samp{@{ c d e @}}} és una entrada +vàlida; @w{@samp{@{ C D E @}}} produiria un missatge d'error. + +@item +@strong{Insensible al nombre d'espais}: no importa quants espais +(o salts de línia o de tabulació) afegiu. +@w{@samp{@{ c4 d e @}}} significa el mateix que +@w{@samp{@{ c4 @tie{} @tie{} @tie{} d e @}}} i que + +@example +@{ c4 d + e @} +@end example + +@noindent +Per suposat, l'exemple anterior és difícil de llegir. Una regla +pràctica és sagnar els blocs de codi amb un caràcter de +tabulació, o bé amb dos espais: + +@example +@{ + c4 d e +@} +@end example + +No obstant, @emph{sí} es necessiten espais per separar molts +elements sintàctics els uns dels altres. En altres paraules, els +espais es poden sempre @emph{afegir}, però no sempre @emph{eliminar}. +Degut a què la manca d'espais pot donar lloc a errors estranys, +recomanem inserir espais sempre abans i després de qualsevol +element sintàctic, per exemple, abans i després dels claudàtors. + +@item +@strong{Expressions:} Tot fragment de codi d'entrada per al +LilyPond ha de portar @strong{@{@tie{}claudàtors@tie{}@}} abans i +després de l'entrada. Aquests claudàtors li diuen al LilyPond que +l'entrada és una expressió musical unitària, igual que els +parèntesis @samp{()} de les matemàtiques. Els claudàtors han +d'anar rodejats d'un espai a no ser que es trobin al començament o +al final d'una línia, per evitar qualsevol ambigüitat. + +Una instrucció del LilyPond seguida d'una expressió simple entre +claudàtors (com per exemple +@q{@w{@code{@bs{}relative c' @{@dots{} @}}}}) +també és una expressió musical unitària. + +@cindex comentaris +@cindex comentari de línia +@cindex comentari de bloc +@item +@strong{Comentaris}: Un comentari és una nota per al lector humà +de l'entrada musical; s'ignora quan s'analitza aquesta entrada, de +manera que no té cap efecte sobre la sortida impresa. Hi ha dos +tipus de comentaris. El símbol de percentatge @samp{%} introdueix +un comentari de línia; s'ignora tot el que es troba després de +@samp{%} a aquesta línia. Per conveni, una línia de comentari es +col·loca @emph{per sobre} del codi a què es refereix el comentari. + +@example +a4 a a a +% aquest comentari es refereix a les notes Si +b2 b +@end example + +Un comentari de bloc marca una secció sencera d'entrada musical +com a comentari. Tot el que esta envoltat dins de @code{%@{} i +@code{%@}} s'ignora (però els comentaris no poden niuar-se, cosa +que significa que un comentari de bloc no pot incloure altres +comentaris de bloc). Si ho fes, el primer @code{%@}} donaria per +acabat @emph{els dos} comentaris de bloc. El següent fragment +mostra alguns possibles usos per als comentaris: + +@example +% a continuació van les notes de twinkle twinkle + c4 c g' g a a g2 + +%@{ + Aquesta línia i les notes que apareixen a sota + s'ignoren, per estar dins d'un + comentari de bloc. + + f4 f e e d d c2 +%@} +@end example + +@end itemize + + +@node Gestió dels errors +@section Gestió dels errors +@translationof Dealing with errors + +@cindex depuració d'errors + +A vegades el LilyPond no produeix el resultat esperat. Aquesta +secció aporta alguns enllaços per ajudar-vos a resoldre els +problemes que pugueu trobar. + +@menu +* Consells generals de solució de problemes:: +* Alguns errors comuns:: +@end menu + +@node Consells generals de solució de problemes +@subsection Consells generals de solució de problemes +@translationof General troubleshooting tips + +La solució de problemes al LilyPond pot ser un desafiament per a +les persones acostumades als interfícies gràfics, perquè és +possible crear fitxers d'entrada invàlids. Quan passa això, la +millor manera d'identificar i resoldre el problema és aplicar un +enfocament lògic. A @rprogramnamed{Troubleshooting, +Solució de problemes} es donen +algunes guies per ajudar-vos a aprendre a fer-lo. + +@node Alguns errors comuns +@subsection Alguns errors comuns +@translationof Some common errors + +@cindex comuns, errors +@cindex errors comuns + +Hi ha alguns errors comuns que són difícils de solucionar si ens +basem solament als missatges d'errors que se'ns presenten. +Aquests errors es descriuen a @rprogram{Errors comuns}. + +@node Com llegir els manuals +@section Com llegir els manuals +@translationof How to read the manuals + +Aquesta secció mostra com llegir la documentació de forma +eficient, i presenta algunes funcionalitats interactives de la +versió en línia. + +@menu +* Material omès:: +* Exemples amb enllaç:: +* Panoràmica dels manuals:: +@end menu + + +@node Material omès +@subsection Material omès +@translationof Omitted material + + +@cindex com llegir el manual +@cindex manual, lectura del +@cindex llegir el manual +@cindex exemples, clicar +@cindex clicar sobre els exemples +@cindex consells per construir fitxers +@cindex plantilles +@cindex construir fitxers, consells +@cindex fitxers, consells per construir + +Com ja hem vist a @ref{Treball sobre els fitxers d'entrada} +codi d'entrada del LilyPond ha d'estar rodejat de claudàtors +@code{@{ @}} o de +@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}}. Durant la resta +del manual actual, la major part dels exemple ometran els +claudàtors. Per a reproduir els exemples, haureu de copiar i +enganxar l'entrada que es mostra, però @strong{haureu} d'escriure +el @q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}}, de la forma següent: + +@example +\relative c'' @{ + @dots{}aquí va l'exemple@dots{} +@} +@end example + +Perquè ometre els claudàtors? Gairebé tots els exemples del manual +actual es poden inserir al mig d'un fragment més gran de +música. Per a aquests exemple no té cap sentit afegir +@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} +(no hauríeu de posar un @code{\relative} dins d'altre +@code{\relative}!); si haguéssim inclòs +@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} +envoltant a cadascú dels exemples, no podríeu copiar un exemple +petit procedent de la documentació i enganxar-lo dins de la seva +pròpia partitura. La major part de la gent voldrà inserir el codi +dins d'una partitura més gran, és per això que hem formatat el +manual d'aquesta manera. + +Recordeu també que tot fitxer del LilyPond ha de portar un +enunciat @code{\version}. Considerant que els exemple dels +manuals són fragments de codi i no fitxers complets, l'enunciat +@code{\version} s'omet. Tot i així, ens hem d'acostumar a +incloure'ls als nostres documents. + +@node Exemples amb enllaç +@subsection Exemples amb enllaç +@translationof Clickable examples + +@warning{Aquesta funcionalitat sols està disponible al manuals en HTML.} + +Moltes persones aprendran a utilitzar programes provant i +trastejant amb ells. Això també es pot fer amb el LilyPond. Si +cliqueu sobre una imatge a la versió en HTML d'aquest manual, +podreu veure l'entrada exacta del LilyPond que es va fer servir +per generar aquesta imatge. Proveu-lo sobre aquesta imatge: + +@c no verbatim here +@c KEEP LY +@lilypond[quote] +\relative { + c''4-\markup { \bold \huge { Cliqueu aquí. } } +} +@end lilypond + +Tallent i enganxant tot el que es troba dins de la secció +@qq{ly snippet} (fragment de tipus ly), tindreu una plantilla +inicial per als vostres experiments. Per poder veure exactament +el mateix resultat (amb la mateixa amplada i tot), copieu tot el +que hi ha des de @qq{Start cut-&-pastable section} fins al final +del fitxer. + +@ignore +This is item 825 + +@n ode Navegació amb el teclat +@s ubsection Navegació amb el teclat +@t ranslationof Keyboard navigation + +@warning{Aquesta possibilitat sols està disponible als manuals en +HTML.} + +@c TODO: once this is figured out, insert it here. + +Estem treballant per proveir aquesta funcionalitat. +@end ignore + +@node Panoràmica dels manuals +@subsection Panoràmica dels manuals +@translationof Overview of manuals + +Hi ha molt abundant documentació sobre el LilyPond. Els nous +usuaris es troben desorientats amb freqüència en quant a quina +part o quines parts han de llegir, i ocasionalment passen per alt +la lectura de parts d'importància vital. + +@warning{Si us plau: no us salteu les parts importants de la +documentació. Us resultarà molt més difícil comprendre les +seccions subsegüents.} + +@itemize + +@item +@strong{Abans d'intentar fer @emph{qualsevol cosa}}: llegiu el +@ref{Tutorial} del manual d'Aprenentatge, i la secció +@ref{Notació corrent}. Si trobeu termes musicals que no +reconeixeu, busqueu-los al @rglosnamed{Top, Glossari}. + +@item +@strong{Abans d'intentar escriure una peça completa de música}: +llegiu la secció @ref{Conceptes fonamentals} del manual +d'Aprenentatge . Després us vindrà bé consultar les seccions +corresponents de la @rusernamed{Top, Referència de la notació}. + +@item +@strong{Abans d'intentar de modificar els resultats predeterminats}: +llegiu la secció @ref{Ajustament de la sortida} +del manual d'Aprenentatge. + +@item +@strong{Abans d'afrontar un projecte gran}: llegiu la secció +@rprogramnamed{Suggestions for writing files,Suggeriments per +escriure fitxers d'entrada del LilyPond} del manual d'utilització +del programa. + +@end itemize diff --git a/Documentation/ca/learning/tweaks.itely b/Documentation/ca/learning/tweaks.itely new file mode 100644 index 0000000000..90fe3e351e --- /dev/null +++ b/Documentation/ca/learning/tweaks.itely @@ -0,0 +1,4851 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- + +@ignore + Translation of GIT committish: 5ae5c88bdb1a478263ed874cb823ec58dafc93f9 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c \version "2.19.22" + +@node Ajustament de la sortida +@chapter Ajustament de la sortida +@translationof Tweaking output + +Aquest capítol tracta de com modificar la sortida. El LilyPond és +extremadament configurable; pràcticament tots els fragments de la +sortida es poden canviar. + + +@menu +* Elements d'ajustament:: +* Manual de referència de funcionament intern:: +* Aparença dels objectes:: +* Col·locació dels objectes:: +* Espaiat vertical:: +* Col·lisions d'objectes:: +* Ajustaments addicionals:: +@end menu + +@node Elements d'ajustament +@section Elements d'ajustament +@translationof Tweaking basics + +@menu +* Introducció a l'ajustament:: +* Objectes i interfícies:: +* Convencions de noms d'objectes i propietats:: +* Mètodes d'ajustament:: +@end menu + +@node Introducció a l'ajustament +@subsection Introducció a l'ajustament +@translationof Introduction to tweaks + +L'@q{ajustament} és un terme del LilyPond que s'usa pels diversos +mètodes que l'usuari té a la seva disposició per modificar el +procés d'interpretació del fitxer d'entrada i canviar l'aparença +de la sortida impresa. Alguns ajustos són mols fàcils d'usar; +d'altres són complexos. Però en conjunt, els mètodes d'ajustament +disponibles possibiliten aconseguir gairebé qualsevol aparença +que desitgem a la música impresa. + +En aquesta secció estudiarem els conceptes bàsics que calen per +entendre l'ajustament. Més tard donarem un ampli ventall d'ordres +llistes per usar, que podreu simplement copiar per obtenir el +mateix efecte a les vostres partitures, i al mateix temps +mostrarem la forma de construir aquestes ordres perquè pugueu +aprendre com desenvolupar els vostres propis ajustaments. + +Abans de començar aquest capítol, potser vulgueu donar una ullada +a la secció @ref{Contextos i gravadors}, atès que els contextos, +els gravadors i les propietats que es contenen en aquests elements +són fonamentals per comprendre i construir els ajustaments. + +@node Objectes i interfícies +@subsection Objectes i interfícies +@translationof Objects and interfaces + +@cindex objecte +@cindex grob (objecte gràfic) +@cindex objecte d'extensió +@cindex interfície +@cindex propietats d'objectes +@cindex objecte, propietats de +@cindex disposició, objecte de +@cindex objecte de disposició + +L'ajustament consisteix en modificar el funcionament i estructure +interna del programa Lilypond, per la qual cosa en primer lloc +introduirem alguns termes que es fan servir per descriure aquestes +operacions i estructures internes. + +El terme @q{Objecte} és un terme genèric que s'usa per referir-se +A les múltiples estructures que el LilyPond construeix durant el +processat d'un fitxer d'entrada. D'aquesta manera, quan es troba +una instrucció com ara @code{\new Staff}, es construeix un objecte +nou de tipus @code{Staff}. Aleshores, aquest objecte @code{Staff} +conté totes les propietats associades amb aquest pentagrama en +particular, per exemple, el seu nom i armadura, a més d'altres +detalls dels gravadors que s'han assignat perquè operin dins del +context del pentagrama. De forma semblant, hi ha objectes que +emmagatzemen les propietats de tota la resta de contextos, com ara +objectes de @code{Voice}, objectes de @code{Score}, objectes de +@code{Lyrics}, així com objectes que representen tots els elements +de notació com ara línies divisòries, caps de les notes, +lligadures, indicacions dinàmiques, etc. Cada objecte té el seu +propi conjunt de valors de propietat. + +Certs tipus d'objectes reben noms especials. Els objectes que +representen elements de notació sobre la sortida impresa com ara +caps de notes, pliques, lligadures d'expressió i d'unió, +digitacions, claus, etc., reben el nom de @q{Objectes de +presentació}, sovint coneguts com @q{Objectes gràfics}, o +abreujadament @q{Grobs}. Encara són objectes, en el sentit genèric +que hem mencionat, i també tots ells tenen propietats associades, +com la seva posició, mida, color, etc. + +Certs objectes de presentació són encara més especialitzats, Les +lligadures de fraseig, els reguladores, les indicacions d'octava +alta i baixa, i mols altres objectes gràfics no estan situats en +un sol lloc: tenen un punt d'inici, un punt final, i un potser +altres propietats relacionades amb la seva forma. Els objectes amb +una forma estesa com aquests, reben el nom d'«objectes d'extensió» +o @q{Spanners}. + +Els «spanners» no es poden ajustar després d'haver-se creat. Això +inclou tant a @code{StaffSymbol} com a @code{LedgerLineSpanner}, +que continuen al llarg de tota la partitura (excepte si si se'ls +dóna fi amb l'ordre @code{\stopStaff} i es tornen a crear amb +l'ordre @code{\startStaff}. + +Encara més, hi ha objectes gràfics @q{abstractes} que no +imprimeixen res per sí mateixos, sinó que en realitat el que fan +és que recopilen, posicionen i gestionen a altres objectes +gràfics. El exemples habituals són @code{DynamicLineSpanner}, +@code{BreakAlignment}, @code{NoteColumn}, +@code{VerticalAxisGroup}, @code{NonMusicalPaperColumn} i +semblants. Més tard veurem com s'usen alguns d'ells. + +Encara falta explicar què són les @q{Interfícies}. Molts +objectes, tot i que són força diferents, comparteixen +funcionalitats que s'han de processar de la mateixa manera. Per +exemple, tots els objectes gràfics tenen un color, una mida, una +posició, etc., i totes aquestes propietats es processen de la +mateixa forma durant la interpretació del fitxer d'entrada per +part del LilyPond. Per simplificar aquestes operacions internes, +aquestes accions i propietats comunes s'agrupen a un objecte +anomenat @code{grob-interface}, interfície d'objecte gràfic. Hi ha +moltes altres agrupacions de propietats comunes com aquesta, i +cadascuna rep un nom que acaba en @code{interface}. En total hi +ha més de 100 interfícies d'aquestes. Veurem més endavant perquè +és interessant i d'utilitat per a l'usuari. + +Aquests són, en definitiva, els termes principals relatius als +objectes que utilitzarem a aquest capítol. + +@node Convencions de noms d'objectes i propietats +@subsection Convencions de noms d'objectes i propietats +@translationof Naming conventions of objects and properties + +@cindex nomenclatura, convencions de, per a objectes +@cindex nomenclatura, convencions de, per a propietats +@cindex objectes, convencions de nomenclatura +@cindex propietats, convencions de nomenclatura + +Ja hem vist certes convencions de nomenclatura d'objectes, a la +secció @ref{Contextos i gravadors}. Aquí, per a una referència +més fàcil, presentem una llista dels tipus d'objectes i propietats +més comuns, junt amb les convencions segons les quals reben el seu +nom, i un parell d'exemples de noms reals. Hem fet servir una +@q{A} majúscula per denotar qualsevol caràcter alfabètic en +majúscules, i @q{aaa} per qualsevol nombre de caràcters alfabètics +en minúscula. Altres caràcters es fan servir literalment com estan. + +@multitable @columnfractions .33 .33 .33 +@headitem Objecte o tipus de propietat + @tab Convenció de nomenclatura + @tab Exemples +@item Contextos + @tab Aaaa o AaaaAaaaAaaa + @tab Staff, GrandStaff +@item Objecte de presentació + @tab Aaaa o AaaaAaaaAaaa + @tab Slur, NoteHead +@item Gravadors + @tab Aaaa_aaa_engraver + @tab Clef_engraver, Note_heads_engraver +@item Interfícies + @tab aaa-aaa-interface + @tab grob-interface, break-aligned-interface +@item Propietats de contextos + @tab aaa o aaaAaaaAaaa + @tab alignAboveContext, skipBars +@item Propietats d'objectes de presentació + @tab aaa o aaa-aaa-aaa + @tab direction, beam-thickness +@end multitable + +Com podrem veure a la brevetat, les propietats dels diferents +tipus d'objecte es poden modificar mitjançant diferents ordres; +així doncs, és útil poder reconèixer els tipus d'objectes i +propietats a partir dels seus noms. + +@seealso +Referencia de la notació: +@rusernamed{Modifying properties,Modificació de les propietats} + +@node Mètodes d'ajustament +@subsection Mètodes d'ajustament +@translationof Tweaking methods + +@cindex ajustament, mètodes de + +@strong{L'ordre \override} + +@menu +* L'ordre override:: +* L'ordre revert:: +* El prefix once:: +* L'ordre overrideProperty:: +* L'ordre tweak:: +* El prefix single:: +@end menu + +@node L'ordre override +@unnumberedsubsubsec L'ordre @code{@bs{}override} +@translationof The override command + +@cindex override, instrucció +@cindex override (sobreescriptura), sintaxi de + +@funindex \override + +Ja hem vist les ordres @code{\set} i @code{\with}, que s'usen per +canviar les propietats dels @strong{contextos} i per treure i +posar @strong{gravadors}, a @ref{Modificar les propietats dels +contextos} i @ref{Afegir i eliminar gravadors}. Ara hem +d'examinar algunes altres ordres importants. + +L'ordre que canvia les propietats dels @strong{objectes +de presentació} és @code{\override}. Atès que aquesta ordre ha de +modificar propietats internes que es troben a un lloc profund dins +del LilyPond, la seva sintaxi no és tan simple com la de la resta +de les ordres que hem fet servir fins ara. Heu de saber +exactament quina propietat de quin objecte i a quin context s'ha +de modificar, i quin ha de ser el seu nou valor. Anem a veure com +es fa. + +La sintaxi genèrica d'aquesta ordre és: + +@example +\override @var{Context}.@var{ObjecteDePresentació}.@var{propietat-de-presentació} = +#@var{valor} +@end example + +@noindent +Això establirà la propietat de nom +@var{propietat-de-presentació} de l'objecte de presentació amb el +nom @var{ObjecteDePresentació}, que es membre del context +@var{Context}, al valor @var{valor}. + +El @var{Context} es pot ometre (i normalment és així) quan el +context requerit es troba implicat sense ambigüitat i és un dels +contextos del nivell més baix, és a dir: @code{Voice}, +@code{ChordNames} o @code{Lyrics}, i l'ometrem en molts dels +exemples següents. Més endavant veurem quan cal especificar-lo + +Les últimes seccions tracten de forma exhaustiva les propietats i +els seus valors, vegeu @ref{Tipus de propietats}. Però en aquesta +secció usarem sols unes quantes propietats i valors senzills que +siguin fàcils d'entendre, per il·lustrar el format i la +utilització d'aquestes instruccions. + +Les expressions principals del LilyPond són elements musicals com +notes, duracions, i elements marcatge. Les expressions més +bàsiques com ara números, cadenes de caràcters i llistes, es +processen al @q{mode de l'Scheme}, que s'invoca mitjançant del +prefix @samp{#} escrit abans del valor. Tot i que els valors +poden tenir a vegades una representació vàlida al mode de música +del Lilypond, aquest manual utilitza sempre @samp{#} per a +l'escriptura, per coherència. Per obtenir més informació sobre el +mode de l'Scheme, consulteu +@rextendnamed{LilyPond Scheme-Syntax,Sintaxi de l'Scheme del LilyPond}. + +@code{\override} és l'ordre d'ús més comú dins de l'ajustament, i +durant la major part de la resta d'aquest capítol presentarem +exemples sobre el seu ús. A continuació hi ha un exemple senzill +per canviar el color d'un cap: + +@cindex color, propietat, exemple +@cindex NoteHead, exemple de sobreescriptura + +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a b c | +} +@end lilypond + + +@node L'ordre revert +@unnumberedsubsubsec L'ordre @code{@bs{}revert} +@translationof The revert command + +@cindex revert, instrucción + +@funindex \revert + +Un cop sobreescrita, la propietat reté el seu nou valor fins que +se sobreescriu de o es troba una ordre @code{\revert}. L'ordre té +la sintaxi següent i causa que el valor de la propietat torni al +seu valor predeterminat original; observeu que no és al seu valor +previ si s'han fet servir diverses ordres @code{\override}. + +@example +\revert @var{Context}.@var{ObjecteDePresentació}.@var{propietat-de-presentació} +@end example + +Un cop més, igual que @var{Context} dins de l'ordre +@code{\override}, freqüentment no és necessari especificar el +@var{Context}. S'ometrà en molts dels exemples següents. Aquí +retornem el color del cap al valor predeterminat per a les últimes +dues notes: + +@cindex color, propietat, exemple +@cindex NoteHead, exemple de sobreescriptura + +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a + \revert NoteHead.color + b4 c | +} +@end lilypond + + +@node El prefix once +@unnumberedsubsubsec El prefix @code{@bs{}once} +@translationof The once prefix + +@funindex \once + +@code{\override}, @code{\revert}, @code{\set} i @code{\unset} es +poden fer precedir per @code{\once}. Això fa que l'ordre sigui +efectiva sols durant el temps musical en curs i abans que la +propietat torni a tenir un altre cop el seu valor anterior (que +pot ser diferent al seu valor predeterminat i encara s'està +aplicant una altra ordre @code{\override} de +sobreescriptura). Utilitzant el mateix exemple, podem canviar el +color d'una sola nota de la manera següent: + +@cindex color, propietat, exemple +@cindex NoteHead, exemple de sobreescriptura + +@lilypond[quote,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \once \override NoteHead.color = #green + g4 a + \once \revert NoteHead.color + b c | + \revert NoteHead.color + f2 c | +} +@end lilypond + +El prefix @code{\once} també es pot usar davant de moltes ordres +predefinides per limitar el seu efecte a un sol moment musical: + +@lilypond[quote,verbatim] +\relative { + c'4( d) + \once \slurDashed + e4( f) | + g4( a) + \once \hideNotes + b( c) | +} +@end lilypond + +@node L'ordre overrideProperty +@unnumberedsubsubsec L'ordre @code{@bs{}overrideProperty} +@translationof The overrideProperty command + +@cindex overrideProperty, ordre + +@funindex \overrideProperty + +Hi ha una altra forma per a l'ordre de sobreescriptura, +@code{\overrideProperty}, que ocasionalment és necessària. La +mencionem aquí amb un propòsit d'exhaustivitat, però per veure més +detalls consulteu @rextendnamed{Difficult tweaks,Ajustaments difícils}. +@c Maybe explain in a later iteration -td + + +@node L'ordre tweak +@unnumberedsubsubsec L'ordre @code{@bs{}tweak} +@translationof The tweak command + +@cindex tweak, ordre + +@funindex \tweak + +L'última ordre d'ajustament que està disponible és @code{\tweak}. +S'ha de fer servir quan diversos objectes s'usen en el mateix +moment musical, però sols volem canviar les propietats d'alguns +d'ells, per exemple una sola nota dins d'un acord. L'ús de +@code{\override} per a la sobreescriptura afectaria a totes les +notes de l'acord, mentre que @code{\tweak} sols afecta a l'element +següent del flux d'entrada. + +Vet aquí un exemple. Suposeu que volem canviar la mida del cap de +la nota intermèdia (el Mi) a un acord de Do major. En primer +lloc, vejam el fa faria @code{\once \override}: + +@cindex font-size, propietat, exemple +@cindex NoteHead, exemple de sobreescriptura + +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + \once \override NoteHead.font-size = #-3 + 4 + 4 +} +@end lilypond + +Veiem que la sobreescriptura amb override afecta a @emph{totes} +els caps de les notes de l'acord. Això és així perquè totes les +notes d'un acord tenen lloc en el mateix @emph{moment musical}, i +l'acció de @code{\once} és aplicar la sobreescriptura a tots els +objectes de presentació del tipus especificat que tenen lloc en el +mateix moment musical que la pròpia ordre de sobreescriptura @code{\override}. + +L'ordre @code{\tweak} pera de una manera diferent. Actua sobre +l'element immediatament següent dins del flux d'entrada. En la +seva forma més senzilla és efectiu sols sobre objectes que es +creen directament a partir de l'element següent, en essència els +caps i les articulacions. + +Així doncs, tornant al nostre exemple, la mida de la nota +intermèdia es canviaria de la forma següent: + +@cindex font-size, propietat, exemple +@cindex @code{\tweak}, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + 4 +} +@end lilypond + +Observeu que la sintaxi de @code{\tweak} no és igual que la de +@code{\override}. El context no s'ha d'especificar; de fet, +generaria un error fer-lo. Tant el context com l'objecte de +presentació estan implícits per l'element següent del flux +d'entrada. Observeu també que no ha d'haver un signe d'igual. +Així que la sintaxi de l'ordre @code{\tweak} en la seva forma +senzilla és: + +@example +\tweak @var{propietat-de-presentació} #@var{valor} +@end example + +Una ordre @code{\tweak} també es pot usar per modificar sols una +d'una sèrie d'articulacions, com es mostra aquí: + +@cindex color, propietat, exemple +@cindex @code{\tweak}, exemple + +@lilypond[quote,fragment,ragged-right,verbatim] +a'4^"Black" + -\tweak color #red ^"Red" + -\tweak color #green _"Green" +@end lilypond + +@noindent +Observeu que l'ordre @code{\tweak} ha de venir precedida d'una +marca d'articulació perquè la pròpia expressió ajustada ha +d'aplicar-se com una articulació. En el cas de més d'una +sobreescriptura de direcció (@code{^} o @code{_}), guanya la +sobreescriptura situada més a l'esquerra perquè s'aplica a l'últim +lloc. + +@cindex @code{\tweak}, Accidental +@cindex @code{\tweak}, specific layout object + +Els objectes com ara pliques i alteracions accidentals es creen +més tard, i no directament a partir de l'esdeveniment que ve a +continuació. Encara és possible utilitzar @code{\tweak} sobre +aquests objectes creats indirectament mitjançant el nomenat +explícit de l'objecte de presentació, sempre i quan el LilyPond +pugui rastrejar el seu origen fins l'esdeveniment original: + +@lilypond[quote,fragment,ragged-right,verbatim] +<\tweak Accidental.color #red cis''4 + \tweak Accidental.color #green es'' + g''> +@end lilypond + +Aquesta forma extensa de l'ordre @code{\tweak} es pot descriure com +@example +\tweak @var{LayoutObject}.@var{layout-property} #@var{value} +"ABANS" \tweak @var{objecte-de-presentació}.@var{propietat-de-presentació} @var{valor} +@end example + +@cindex grups especials niuats +@cindex tresets niuats +@cindex claudàtor de grup especial +@cindex claudàtor de treset +@cindex grup especial, claudàtor de +@cindex treset, claudàtor de + +@funindex TupletBracket + +L'ordre @code{\tweak} també s'ha d'usar per canviar l'aparença +d'un sol d'un conjunt de grups especials niuats que comencin al +mateix instant musical. A l'exemple següent, el claudàtor de +treset llarg i el primer dels tres claudàtors curts comencen al +mateix moment musical, i per això qualsevol ordre @code{\override} +s'aplicaria als dos. A l'exemple s'usa @code{\tweak} per +distingir entre ells. La primera ordre @code{\tweak} especifica +que el claudàtor del treset llarg s'ha de col·locar per sobre de +les notes i el segon especifica que el nombre del treset s'ha +d'imprimir en vermell sobre el claudàtor del primer treset curt. + +@cindex @code{\tweak}, exemple +@cindex direction, propietat, exemple +@cindex color, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \tweak direction #up + \tuplet 3/4 { + \tweak color #red + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } +} +@end lilypond + +Si els grups niuats no comencen al mateix moment, la seva aparença +es pot modificar de la forma usual mitjançant ordres @code{\override}: + +@cindex text, propietat, exemple +@cindex tuplet-number, funció, exemple +@cindex transparent, propietat, exemple +@cindex TupletNumber, exemple de sobreescriptura + +@lilypond[quote,ragged-right,verbatim] +\relative { + \tuplet 3/2 { c'8[ c c] } + \once \override TupletNumber.text = #tuplet-number::calc-fraction-text + \tuplet 3/2 { + c8[ c] + c8[ c] + \once \override TupletNumber.transparent = ##t + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } +} +@end lilypond + + +@seealso +Referència de la notació: +@rusernamed{The tweak command,L'ordre tweak}. + +@node El prefix single +@unnumberedsubsubsec El prefix @code{@bs{}single} +@translationof The single prefix + +@funindex \single +@cindex ajustament, generat a partir d'una sobreescriptura + +Suposem que volem emfatitzar el cap d'algunes notes dibuixant-les +amb color i incrementant la seva mida, i suposem també que hem +programat una funció per fer la tasca més còmoda: + +@lilypond[quote,verbatim] +emphNoteHead = { + \override NoteHead.color = #red + \override NoteHead.font-size = 2 +} +\relative { + c''4 a \once \emphNoteHead f d | +} +@end lilypond + +El @code{\once} previ funciona perfectament per emfatitzar notes +úniques o acords complets, però no es pot usar per emfatitzar una +sola nota @emph{dins} d'un acord. Anteriorment vam veure com es +pot usar l'ordre @code{\tweak} per fer-lo, vegeu +@ref{L'ordre tweak,,L'ordre @code{@bs{}tweak}}. Però +@code{\tweak} no es pot fer servir amb una funció; aquí és on +entra l'ordre @code{\single}: + +@lilypond[quote,verbatim] +emphNoteHead = { + \override NoteHead.color = #red + \override NoteHead.font-size = 2 +} +\relative { + 4 +} +@end lilypond + +En resum, @code{\single} converteix les característiques fetes amb +@code{\override} en ajustaments fets amb @code{\tweak} de tal +manera que quan hi ha diversos objectes al mateix instant de temps +musical (com ara les notes d'un acord), @code{\single} afecta a +una única nota, la que es genera per l'expressió que afecta a una +única nota, la que es genera per l'expressió que segueix +immediatament, a diferencia de @code{\once} que afecta a tots +aquests objectes. + +L'ús de @code{\single} d'aquesta forma amb una funció qualsevol +que contingui sols sobreescriptures, pot aplicar-se a les notes +individuals d'un acord. Malgrat això, @code{\single} no converteix +@code{\revert}, @code{\set} ni @code{\unset} en ajustaments de @code{\tweak}. + +@seealso +Manual de aprenentatge: +@ref{L'ordre tweak,,L'ordre @code{@bs{}tweak}}, +@ref{Ús de variables per als ajustaments de disposició}. + +@node Manual de referència de funcionament intern +@section Manual de referència de funcionament intern +@translationof The Internals Reference manual + +@cindex Referència de funcionament intern + +@menu +* Propietats dels objectes de presentació:: +* Propietats de les interfícies:: +* Tipus de propietats:: +@end menu + +@node Propietats dels objectes de presentació +@subsection Propietats dels objectes de presentació +@translationof Properties of layout objects + +@cindex propietats dels objectes presentació +@cindex propietats dels grobs +@cindex grobs, propietats de +@cindex presentació, propietats dels objectes de +@cindex Referència de funcionament intern + +Suposeu que teniu una partitura amb una lligadura d'expressió que +al seu gust és massa fina i voleu dibuixar-la una mica més +gruixuda. Com heu de procedir? Ja sabeu, per les afirmacions +anteriors sobre la flexibilitat del LilyPond, que hi ha aquesta +possibilitat, i segurament penseu que caldrà alguna ordre de +sobreescriptura @code{\override}. Però, hi ha una propietat de +gruix per a les lligadures? I si hi ha, com es pot modificar? +Aquí es on intervé el Manual de Funcionament Intern. Conte tota +la informació que podeu necessitar per construir aquesta i la +resta d'ordres @code{\override}, de sobreescriptura. + +Un advertiment abans de dirigir la nostra mirada a la referència +de funcionament intern. Aquest és un document de +@strong{referència}, cosa que significa que es proveeixen poques +explicacions o cap: el seu propòsit és presentar la informació de +forma precisa i concisa. Per tant, us podrà sembla +desencoratjador a primera ullada. No us amoïneu! La guia i les +explicacions que presentem aquí us permetran extraure la +informació de la referència de funcionament intern a vós mateix, +sols us cal una mica de pràctica. + +@cindex sobreescriptura, exemple de +@cindex Referència de Funcionament Intern, exemple d'utilització +@cindex @code{\addlyrics}, ejemplo + +Anem a fer servir un exemple concret amb un senzill fragment de +música real: + +@c Mozart, duo, núm. 7 de La Flauta Màgica + +@lilypond[quote,verbatim] +{ + \key es \major + \time 6/8 + \relative { + r4 bes'8 bes[( g]) g | + g8[( es]) es d[( f]) as | + as8 g + } + \addlyrics { + The man who | feels love's sweet e -- | mo -- tion + } +} +@end lilypond + +Suposeu ara que decidim que ens agrades les lligadures una mica +més gruixudes. És possible? La lligadura és, certament, un +objecte de presentació, de manera que la qüestió és @q{Hi ha una +propietat pertanyent a les lligadures d'expressió que controli el +seu gruix?} Per respondre a aquesta pregunta hem de mirar el +manual de Referència de Funcionament Intern, abreujadament +RFI@footnote{@strong{IR} (Internals Reference) en anglès}. + +L'RFI és la versió del LilyPond que esteu usant es pot trobar a la +pàgina web del LilyPond a @uref{http://lilypond.org}. Aneu a la +pàgina de la documentació i seguiu l'enllaç Manual de Referència +de Funcionament Intern (RFI). Per als nostres propòsits +pedagògics seria millor que utilitzéssiu la versió en HTML, no la +@q{en una sola pàgina} ni el PDF. Perquè els següents paràgrafs +tinguin algun sentit haureu de consultar-lo realment al temps que +llegiu. + +@c Link names in English as those pages are not yet translated. WG +Sota l'encapçalament @strong{Top} podreu veure cinc +enllaços. Seleccioneu l'enllaç @emph{Backend}, que és on es troba +la informació sobre els objectes de presentació. Un cop allí, +sota l'encapçalament @strong{Backend}, seguiu l'enllaç @emph{All +layout objects}. La pàgina que apareix relaciona totes els +objectes de presentació que s'usen a la vostra versió del +LilyPond, en ordre alfabètic. Segui l'enllaç Slur (lligadura +d'expressió), i apareixeran relacionades les propietats de les +lligadures d'expressió o Slurs. + +Una forma alternativa de trobar aquesta pàgina és a partir de la +Referencia de la Notació. En una de les pàgines que tracten de +les lligadures d'expressió podreu trobar un enllaç al manual de +referència del funcionament intern. Aquest enllaç us portarà +directament a aquesta pàgina, tot i que si teniu una idea del nom +de l'objecte de presentació que preteneu ajustar, li resultarà més +fàcil anar directament al RFI i buscar allí. + +Aquesta pàgina sobre les lligadures d'expressió dins del manual +RFI ens diu en primer lloc que els objectes Slur es creen pel +gravador Slur_engraver. A continuació relaciona els ajustos +estàndard. Navegueu per ells buscant una propietat que pogués +controlar el gruix de les lligadures, i trobarà + +@example +@code{thickness} (number) + @code{1.2} + Line thickness, generally measured in @code{line-thickness} +@end example + +Això promet ser una bona opció per canviar el gruix. Ens diu que +el valor de @code{thickness} és un simple @emph{número}, que el +valor predeterminat és 1.2, i que les unitats estan dins d'una +altra propietat anomenada @code{line-thickness}. + +Com havíem dit amb anterioritat, hi ha entre poques i cap +explicació al RFI, però ja tenim informació suficient per provar +de canviar el gruix de la lligadura. Vejam que el nom de +l'objecte de presentació és @code{Slur}, que el nom de la +propietat que hem de canviar és @code{thickness} i que el nou +valor ha de ser un número una mica més gran que 1.2 si volem fer +les lligadures més gruixudes. + +Ara podem construir la instrucció de sobreescriptura +@code{\override} simplement mitjançant la substitució dels valores +que hem trobar per als noms, ometent el context. Usarem un valor +molt gran per al gruix al començament, per estar segurs que +l'ordre estigui funcionant. Obtenim el següent: + +@example +\override Slur.thickness = #5.0 +@end example + +No oblideu el @code{#'} abans del nom de la propietat +i@tie{}@code{#} abans del valor nou! + +La pregunta final és @q{On s'ha de col·locar aquesta ordre?} Tot i +que ens falta seguretat i estem aprenent encara, la millor +resposta és: @q{Dins de la música, abans de la primera lligadura i +a prop d'ella.} Fem-lo així: + +@cindex Slur, exemple de sobreescriptura +@cindex thickness, propietat, exemple + +@lilypond[quote,verbatim] +{ + \key es \major + \time 6/8 + \relative { + % Increase thickness of all following slurs from 1.2 to 5.0 + \override Slur.thickness = #5.0 + r4 bes'8 bes[( g]) g | + g8[( es]) es d[( f]) as | + as8 g + } + \addlyrics { + The man who | feels love's sweet e -- | mo -- tion + } +} +@end lilypond + +@noindent +i podem veure que la lligadura és, sense dubte, més gruixuda. + +Així doncs, aquesta és la forma bàsica de construir ordres +@code{\override} o de sobreescriptura. Hi ha unes quantes +complicacions més amb les quals ens trobarem a seccions +posteriors, però ara coneixeu totes els principis essencials que +us calen per fer-lo per vós mateix (tot i que encara us fa falta +una mica de pràctica). Els següents exemples us donaran més +pràctica. + +@subsubsubheading Cerca del context + +@cindex context, trobar +@cindex context, buscar el, correcte + +Però en primer lloc, que hauria passat si haguéssim hagut +d'especificar el context? Quin seria? Podem suposar que les +lligadures estan al context Voice, per estar clarament associats +de manera estreta amb les línies individuals de música, però podem +tenir seguretat? Per esbrinar-lo, anem de nou a l'inici de la +pàgina del RFI que descriu les lligadures (Slur), con diu +@q{Slur objects are created by: Slur engraver} +(«Els objectes de lligadura d'expressió es creen per: el gravador +Slur»). Així doncs, les lligadures d'expressió es creen en +qualsevol context en el que es trobi el gravador +@code{Slur_engraver}. Seguiu l'enllaç a la pàgina del gravador +@code{Slur_engraver}. Al final de tot, diu que el gravador +@code{Slur_engraver} és part de set contextos de veu, inclòs el +context de veu estàndard, @code{Voice}, per la qual cosa la nostra +suposició és encertada. I a causa que @code{Voice} és un dels +contextos de més baix nivell que es troba implícit sense +ambigüitat pel fet que estem escrivint notes, podem ometre'l en +aquest lloc concret. + +@subsubsubheading Sobreescriptura per un sol cop + +@cindex sobreescriptura per un sol cop +@cindex once override + +@funindex \once + +Com podeu veure, @emph{totes} les lligadures són més gruixudes a +l'últim exemple. Però, i si volguéssim que sols la primera +lligadura fos més gruixuda? Això s'aconsegueix amb la instrucció +o prefix @code{\once}. Col·locat immediatament abans de la +instrucció @code{\override} ocasiona que sols canviï la lligadura +que comença a la nota @strong{immediata següent}. Si la nota +immediata següent no inicia una lligadura, l'ordre no té cap +efecte en absolut: no es recorda fins que es trobi alguna +lligadura, sinó que simplement s'ignora. Així doncs, l'ordre que +porta @code{\once} s'ha de tornar a posicionar de la forma següent: + +@cindex Slur, exemple de sobreescriptura +@cindex thickness, propietat, exemple + +@lilypond[quote,verbatim] +{ + \key es \major + \time 6/8 + \relative { + r4 bes'8 + % Increase thickness of immediately following slur only + \once \override Slur.thickness = #5.0 + bes8[( g]) g | + g8[( es]) es d[( f]) as | + as8 g + } + \addlyrics { + The man who | feels love's sweet e -- | mo -- tion + } +} +@end lilypond + +@noindent +Hem fet que ara sols la primera lligadura sigui més gruixuda. + +L'ordre o prefix @code{\once} també es pot fer servir abans de +l'ordre @code{\set}. + +@subsubsubheading Recuperació de l'ajustament + +@cindex revertir +@cindex predeterminades, recuperar las propietats + +@funindex \revert + +Finalment, i si volguéssim que sols les dues primeres lligadures +fossin més gruixudes? Per acabar; podríem usar dues ordres, +cadascuna d'elles precedida pel prefix @code{\once}, situades +immediatament abans de cada una de les notes on comencen les lligadures: + +@cindex Slur, exemple de sobreescriptura +@cindex thickness, propietat, exemple + +@lilypond[quote,verbatim] +{ + \key es \major + \time 6/8 + \relative { + r4 bes'8 + % Increase thickness of immediately following slur only + \once \override Slur.thickness = #5.0 + bes[( g]) g | + % Increase thickness of immediately following slur only + \once \override Slur.thickness = #5.0 + g8[( es]) es d[( f]) as | + as8 g + } + \addlyrics { + The man who | feels love's sweet e -- | mo -- tion + } +} +@end lilypond + +@noindent +o podríem ometre l'ordre prefix @code{\once} i utilitzar l'ordre +@code{\revert} (restableix) per retornar la propietat del gruix, +@code{thickness}, al seu valor predeterminat després de la segona +lligadura: + +@cindex Slur, exemple de sobreescriptura +@cindex thickness, propietat, exemple + +@lilypond[quote,verbatim] +{ + \key es \major + \time 6/8 + \relative { + r4 bes'8 + % Increase thickness of all following slurs from 1.2 to 5.0 + \override Slur.thickness = #5.0 + bes[( g]) g | + g8[( es]) es + % Revert thickness of all following slurs to default of 1.2 + \revert Slur.thickness + d8[( f]) as | + as8 g + } + \addlyrics { + The man who | feels love's sweet e -- | mo -- tion + } +} +@end lilypond + +@noindent +L'ordre @code{\revert} es pot utilitzar per retornar qualsevol +propietat que s'hagi canviat amb @code{\override} al seu valor +predeterminat. Podeu utilitzar el mètode que millor s'adapti a +allò que voleu fer. + +D'aquesta manera finalitza la nostra introducció al manual de RFI, +i el mètode bàsic d'ajustament. A continuació, en les últimes +seccions d'aquest capítol trobareu diversos exemples, en par par +introduir-vos a algunes de les possibilitats addicionals del +manual RFI, i en part per proporcionar-vos més pràctica sobre com +extraure informació d'ell. Aquests exemples aniran contenint cada +cop menys paraules de guia i explicació. + +@node Propietats de les interfícies +@subsection Propietats de les interfícies +@translationof Properties found in interfaces + +@cindex interface +@cindex propietats de les interfícies +@cindex interfaces, propietats + +Suposeu ara que volem imprimir la lletra de la cançó en +cursiva. Quina forma d'instrucció @code{\override} necessitem per +fer-lo? En primer lloc mirem a la pàgina de RFI que fa una +relació de tots els objectes, @q{All layout objects}, com abans, i +busquem un objecte que pugui controlar la lletra de la cançó. +Trobem @code{LyricText}, que sembla adequat. En seguir aquest +enllaç es presenten les propietats ajustables per al text de la +lletra. Aquests inclouen @code{font-series} i @code{font-size}, +però res que pogués genera una forma cursiva. Això és perquè la +propietat de la forma és comuna a tots els objectes de font +tipogràfica, i per tant, en comptes d'incloure'l en cada u dels +objectes de presentació, s'agrupa junt amb altres propietats +comunes semblants i es deposita a un @strong{Interface}, la +interfície dels tipus de lletra @code{font-interface}. + +Per tant, ara necessitem aprendre com trobar les propietats de les +interfícies, i descobrir quins objectes usen aquestes propietats +d'interfície. + +Mireu un altre cop la pàgina del RFI que descriu a LyricText. Al +final de la pàgina hi ha una llista d'enllaços a les interfícies +que LyricText contempla. La llista té set elements, entre ells +@code{font-interface}. En seguir aquest enllaç arribem a les +propietats associades amb aquesta interfície, que també són +propietats de tots els objectes que la porten, entre ells LyricText. + +Ara veiem totes les propietats ajustables per l'usuari que +controles els tipus de lletra, entre elles +@code{font-shape(symbol)}, on @code{symbol} es pot establir a +@code{upright} (recta), @code{italics} (cursiva) o @code{caps} +(majúscules petites). + +Observareu que @code{font-series} i @code{font-size} també es +troben aquí relacionats. Això fa que de seguida se'ns plantegi la +pregunta: Perquè estan les propietats comunes de tipografia +@code{font-series} i @code{font-size} relacionades sota +@code{LyricText} així com sota la interfície @code{font-interface} +però @code{font-shape} no ho està? La resposta és que +@code{font-series} i @code{font-size} es canvie a partir dels seus +valors predeterminats globals quan es crea un objecte +@code{LyricText}, però @code{font-shape} no ho fa. Aleshores els +elements de la llista @code{LyricText} els diuen els valors per +aquestes dues propietats que són d'aplicació per a +@code{LyricText}. D'altres objectes que tenen en compte +@code{font-interface} establiran aquestes propietats de forma +diferent quan es creen. + +Vejam ara si podem construir la instrucció @code{\override} per +canviar la lletra a cursiva. L'objecte és @code{LyrcText}, la +propietat és @code{font-shape} i el valor és @code{italic}. Igual +que abans, ometrem el context. + +Com a nota a part, tot i que és important, observeu que certes +propietats prenen valors que són símbols, com ara @code{italic}, i +han d'anar precedits per un apòstrof, @code{'}. Els símbols es +llegeixen a continuació internament per part del LilyPond. +Tingueu en compte la diferència amb les cadenes de text +arbitràries, que apareixeran com @code{«una cadena de text»}; per +veure més detalls sobre els símbols i les cadenes, consulteu +@rextendnamed{Scheme tutorial,Tutorial de l'Scheme}. + +Així doncs, l'ordre @code{\override} necessària per imprimir la +lletra en cursiva és: + +@example +\override LyricText.font-shape = #'italic +@end example + +@noindent +Això s'ha d'escriure just davant de la lletra que ha d'afectar, +d'aquesta forma: + +@cindex font-shape, propietat, exemple +@cindex italic, exemple +@cindex LyricText, exemple de sobreescriptura +@cindex @code{\addlyrics}, exemple + +@lilypond[quote,ragged-right,verbatim] +{ + \key es \major + \time 6/8 + \relative { + r4 bes'8 bes[( g]) g | + g8[( es]) es d[( f]) as | + as8 g + } + \addlyrics { + \override LyricText.font-shape = #'italic + The man who | feels love's sweet e -- | mo -- tion + } +} +@end lilypond + +@noindent +i tota la lletra s'escriu en cursiva. + +@warning{Dins de la lletra, deixeu sempre espais entre la síl·laba +final i el claudàtor de tancament.} + +@seealso +Manual de Extensió: +@rextendnamed{Scheme tutorial,Tutorial de l'Scheme}. + + +@node Tipus de propietats +@subsection Tipus de propietats +@translationof Types of properties + +@cindex propietats, tipus de + +Fins aquí hem vis dos tipus de propietats: @code{número} i +@code{símbol}. Perquè sigui vàlid, el valor que es dóna a una +propietat ha de ser del tipus correcte i obeir les regles d'aquest +tipus. El tipus de la propietat es mostra sempre entre parèntesis +després del nom de la propietat al RFI. Vet aquí una llista dels +tipus que us podrà caldre, junt amb les regles d'aquest tipus, i +alguns exemples. Heu d'escriure sempre un símbol d'encoixinat, +@code{#}, per suposat, endavant d'aquests valors quan +s'introdueixen a l'ordre @code{\override}, fins i tot si el propi +valor ja comença per@tie{}@code{#}. Sols oferim aquí exemple per +a constants; si voleu calcular un valor usant l'Scheme, consulteu +@rextendnamed{Calculations in Scheme,Càlculs a l'Scheme}. + +@multitable @columnfractions .2 .45 .35 +@headitem Tipus propietat + @tab Regles + @tab Exemples de propietat +@item Booleà + @tab Vertader o fals, representat per #t o #f + @tab @code{#t}, @code{#f} +@item Dimensió (en espais de pentagrama) + @tab Un nombre decimal (en unitats de espais de pentagrama) + @tab @code{2.5}, @code{0.34} +@item Direcció + @tab Una constant vàlida de direcció o el seu equivalent numèric + (@code{0} o @code{CENTER} indiquen una direcció neutra) + @tab @code{LEFT}, @code{CENTER}, @code{UP}, + @code{1}, @w{@code{-1}} +@item Enter + @tab Un número enter positiu + @tab @code{3}, @code{-1} +@item Llista + @tab Una seqüència de constants o símbols separats per espais, + envoltat per parèntesis + i precedit per un apòstrof o cometa simple + @tab @code{'(left-edge staff-bar)}, @code{'(1)}, @code{'()}, + @code{'(1.0 0.25 0.5)} +@item Marcatge + @tab Qualsevol element vàlid de marcatge de text + @tab @code{\markup @{ \italic "cresc." @}}, @code{"gaita"} +@item Moment + @tab Una fracció de rodona construïda amb la funció make-moment + @tab @code{(ly:make-moment 1/4)}, + @code{(ly:make-moment 3/8)} +@item Nombre + @tab Qualsevol valor positiu, possiblement decimal + @tab @code{3}, @w{@code{-2.45}} +@item Parella (de números) + @tab Dos números separats per un @q{espai . espai}, envoltat entre parèntesis i precedir per un apòstrof + @tab @code{'(2 . 3.5)}, @code{'(0.1 . -3.2)} +@item Símbol + @tab Qualsevol del conjunt de símbols permesos per a aquesta propietat, precedir per un apòstrof + @tab @code{'italic}, @code{'inside} +@item Desconegut + @tab Un procediment o @code{#f} per no produir cap acció + @tab @code{bend::pr +int}, @code{ly:text-interface::print}, + @code{#f} +@item Vector + @tab Constants + envoltades per @code{#(}@dots{}@code{)}. + @tab @code{#(#t #t #f)} +@end multitable + + +@seealso +Manual de Extensió: +@rextendnamed{Scheme tutorial,Tutorial de l'Scheme}. + + +@node Aparença dels objectes +@section Aparença dels objectes +@translationof Appearance of objects + +Ara posarem en practica el que hem après amb uns quants exemples +que mostren com es poden usar els ajustament per canviar l'aspecte +de la música impresa. + +@menu +* Visibilitat i color dels objectes:: +* Mida dels objectes:: +* Longitud i gruix dels objectes:: +@end menu + +@node Visibilitat i color dels objectes +@subsection Visibilitat i color dels objectes +@translationof Visibility and color of objects + +Dins d'una ús educatiu de la música, podríem desitjar imprimir una +partitura amb certs elements omesos com a exercici per a l'alumne, +a qui es demana que els completi. Com a exemple senzill, suposem +que l'exercici és escriure les línies divisòries que falten en un +fragment musical. Però les línies divisòries que normalment +s'insereixen automàticament, com fem perquè no s'imprimeixin? + +Abans d'embolicar-nos amb això, recordem que les propietats dels +objectes s'agrupen en el que hem anomenat @emph{interfaces} (vegeu +@ref{Propietats de les interfícies}). Això implica simplement +agrupar les propietats que es poden usar juntes per ajustar un +objecte gràfic: si una d'elles es necessita per a un objecte, +també les altres. Així, certs objectes usen les propietats +d'alguns interfícies, altres usen les d'altres interfícies. Les +interfícies que contenen les propietats que un determinat grob +necessita es troben relacionades al manual RFI al final de la +pàgina que descriu aquest grob, i aquestes propietats es poden +veure mirant aquestes interfícies. + +Hem explicat com trobar informació sobre els grobs a +@ref{Propietats dels objectes de presentació}. Usant el mateix +enfocament, anem al RFI per buscar l'objecte de presentació que +imprimeix les línies divisòries. Mitjançant l'enllaç +@emph{Backend} i @emph{All layout objects} trobem que hi ha un +objecte de presentació anomenat @code{Barline}. Entre les seves +propietats es troben dues que controlen la visibilitat: +@code{break-visibility} i @code{stencil}. Les línies divisòries +també contemplen una sèrie d'interfícies, entre ells el +@code{grob-interface}, on podem trobar les propietats +@code{transparent} i @code{color}. Totes poden afectar la +visibilitat de les barres de compàs (i, per suposat, per extensió, +també la de molts altres objectes de presentació). Considerarem +cada un d'ells per ordre. + +@menu +* La propietat stencil (segell):: +* La propietat break-visibility (visibilitat del salt):: +* La propietat transparent (transparent):: +* La propietat color:: +@end menu + +@node La propietat stencil (segell) +@unnumberedsubsubsec La propietat @code{stencil} (segell) +@translationof The stencil property + +@cindex stencil (segell), propietat + +Aquesta propietat controla l'aparença de les barres de compàs +mitjançant l'especificació del símbol (o «glif») que s'ha +d'imprimir. Igual que com altres moltes propietats, es pot +establir de forma que no imprimeixi res ajustant el seu valor a +@code{#f}. El provarem, com abans, ometent el Context implícit, +p@code{Voice}: + +@cindex BarLine, exemple de sobreescriptura +@cindex stencil, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \override BarLine.stencil = ##f + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +Les barres de compàs encara s'imprimeixen. Què és el que està +malament? Torneu al RFI i mireu un altre cop la pàgina que +ofereix les propietats de l'objecte Barline. Al principi de la +pàgina diu @qq{Barline objects are created by: Bar_engraver} (els +objectes Barline es creen pel gravador Bar_engraver). Aneu a la +pàgina del gravador @code{Bar_engraver} seguint l'enllaç. Al +final dóna una llista de contextos en els quals el gravador de +línies divisòries opera. Tots ells són del tipus @code{Staff}, i +així la raó que l'ordre @code{\override} no funcionés com +esperàvem, és perquè @code{Barline} no es troba en el context +predeterminat @code{Voice}. Si el context no s'especifica +correctament, l'ordre simplement no funciona. No es produeix cap +missatge d'error, i no es registra res al fitxer log de registre. +Intentarem corregir-lo escrivint el context correcte: + +@cindex BarLine, exemple de sobreescriptura +@cindex stencil, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \override Staff.BarLine.stencil = ##f + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +Ara les barres de compàs han desaparegut. L'operació d'establir la +propietat @code{stencil} al valor @code{#f} és tan freqüent que hi +ha una abreviatura per a ella, anomenada @code{\omit} (ometre): +@funindex \omit + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \omit Staff.BarLine + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +Malgrat això, observeu que l'establiment de la propietat +@code{stencil} al valor @code{#f} produeix error quan es +requereixen les dimensions de l'objecte per un processament +correcte. Per exemple, es generen errors si la propietat +@code{stencil} de l'objecte @code{NoteHead} s'estableix al valor +@code{#f}. Si és el cas, podem en comptes d'això utilitzar la +funció @code{point-stencil}, que estableix el segell a un objecte +amb mida nul·la: + +@lilypond[quote,verbatim] +\relative { + c''4 c + \once \override NoteHead.stencil = #point-stencil + c4 c +} +@end lilypond + +@node La propietat break-visibility (visibilitat del salt) +@unnumberedsubsubsec La propietat @code{break-visibility} (visibilitat del salt) +@translationof The break-visibility property + +@cindex break-visibility, propietat + +Veiem a les propietats de @code{BarLine} que apareixen al RFI que +la propietat @code{break-visibility} requereix un vector de tres +valors booleans. Controlen respectivament si les barres de +compàs s'imprimeixen al final d'una línia, a meitat d'una línia, i +al principi de les línies. Per al nostre exemple, volem que totes +les barres de compàs es suprimeixin, per la qual cosa el valor que +ens cal és @code{#(#f #f #f)} (disponible també sota el nom +@code{all-invisible}, totes invisibles). Anem a provar-lo, +recordant incloure el context de @code{Staff}. Observeu també en +escriure aquest valor tenim @code{##} abans del parèntesis +d'obertura. Cal un @code{#} com a part de la sintaxi de les +constants vectorials, i el primer símbol +d'encoixinat@tie{}@code{#} cal, com sempre, per precedir el valor +mateix dins de l'ordre @code{\override}. + +@cindex BarLine, exemple de sobreescriptura +@cindex break-visibility, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \override Staff.BarLine.break-visibility = ##(#f #f #f) + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +I podem veure que això també treu totes les línies divisòries. + +@node La propietat transparent (transparent) +@unnumberedsubsubsec La propietat @code{transparent} (transparent) +@translationof The transparent property + +@cindex transparent, propietat +@cindex transparència + +En la relació de propietats que s'especifiquen a la pàgina del +@code{grob-interface} del RFI podem veure que la propietat +@code{transparent} és un valor booleà. Això s'ha d'establir a +@code{#t} per fer que el grob sigui transparent. A l'exemple +següent farem que la indicació de compàs, i no les línies +divisòries, siguin transparents. Per fer-lo hem de buscar el nom +del grob de la indicació de compàs. Tornat a la pàgina +@q{All layout objects} del RFI, busquem les propietats de +l'objecte de presentació @code{TimeSignature}. El produeix el +gravador @code{Time_signature_engraver} que com podeu comprovar +viu dins del context @code{Staff} i també contempla la interfície +@code{grob-interface}. Així doncs, l'ordre que fa transparent a +la indicació de compàs és: + +@cindex TimeSignature, exemple de sobreescriptura +@cindex transparent, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \override Staff.TimeSignature.transparent = ##t + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +Un cop més, l'establiment de la propietat @code{transparent} és +una operació força freqüent, de manera que tenim una abreviatura +anomenada @code{\hide} (ocultar): +@funindex \hide + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \hide Staff.TimeSignature + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +En cap dels dos casos apareix ja la indicació de compàs, però +aquesta ordre deixa una separació en el lloc on abans hi havia la +indicació de compàs. Potser això és el que volem per a un +exercici on l'alumne hagi d'escriure'l, però en altres +circumstàncies aquesta separació podria no ser desitjable. En +comptes d'això, per treure-la, el stencil o «segell» de la +indicació de compàs s'ha d'establir al valor @code{#f}: + +@cindex TimeSignature, exemple de sobreescriptura +@cindex stencil, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \omit Staff.TimeSignature + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +i la diferència és òbvia: en establir el segell al valor +@code{#f} (possiblement per mitjà de @code{\omit} traiem l'objecte +per complet; en fer l'objecte @code{transparent} (cosa que es pot +fer utilitzant @code{\hide}) el deixen on és, però el fem invisible. + +@node La propietat color +@unnumberedsubsubsec La propietat @code{color} +@translationof The color property + +@cindex color, propietat + +Per finalitzar, intentem fer invisibles les barres de compàs +pintant-les de color blanc (hi ha un problema relacionat, que +consisteix en què la línia divisòria blanca pot tapar o no tapar +les línies del pentagrama amb les quals es creua. Podreu observar +en alguns dels exemples que apareixen a continuació, que això +succeeix de forma impredictible. Els detalls sobre perquè això passa +així, i com controlar-lo, s'estudien a +@rusernamed{Painting objects white,Pintar els objectes de blanc}; +de moment estem estudiant el color, per la qual cosa us preguem +que accepteu aquesta limitació per ara). + +La interfície @code{grob-interface} especifica que la propietat +del color és una llista, però no hi ha cap explicació sobre el que +ha d'anar a aquesta llista. La llista que requereix és realment +una llista de valors en unitats internes, però per evitar haver de +saber quines són, s'ofereixen diverses vies per a l'especificació +dels colors. La primera forma és utilitzar un dels colors +@q{normals} dels quals es fa una relació a la primera taula de la +@rusernamed{List of colors,Llista de colors}. Per posar les +línies divisòries de color blanc, escrivim: + +@cindex BarLine, exemple de sobreescriptura +@cindex color, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \override Staff.BarLine.color = #white + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +i un altre cop podem comprovar que les barres de compàs no són +visibles. Observeu que @emph{white} no ve precedit d'un apòstrof: +no és un símbol, sinó una @emph{variable}. Quan s'avalua, +proporciona la llista de valors interns que es requereixen per +establir el color a blanc. Els altres colores de la llista normal +també són variables. Per convèncer-vos que això funciona, potser +voleu canviar el color a una de les altres variables de la llista. + +@cindex colors d'X11 +@cindex X11, colors de + +@funindex x11-color + +La segona forma de canviar el color és utilitzar la llista de noms +de colores d'X11 que apareix a la segona llista de +@rusernamed{List of colors,Llista de colors}. De totes maneres, +es fan correspondre als valors real per mitjà de la funció +@code{x11-color} que converteix els símbols de color d'X11 a la +llista de valors interns d'aquests colors: + +@cindex BarLine, exemple de sobreescriptura +@cindex color, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \override Staff.BarLine.color = #(x11-color 'white) + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +Observeu que en aquest cas la funció @code{x11-color} agafa un +símbol com a argument, de manera que el símbol ha d'anar precedit +d'un apòstrof per evitar que resulti avaluat com si fos una +variable, i tota la crida a la funció s'ha de envoltar entre parèntesis. + +@cindex rgb, colors +@cindex color, rgb + +@funindex rgb-color + +Encara hi ha una altra funció, que converteix valors RGB en colors +interns: la funció @code{rgb-color}. Agafa tres arguments que +donen les intensitats de vermell, verd i blau. Cadascú d'ells pot +agafar valors entre 0 i 1. Per tant, per establir el color a +vermell, el valor ha de ser @code{(rgb-color 1 0 0)} i per a +blanc ha de ser @code{(rgb-color 1 1 1)}: + +@cindex BarLine, exemple de sobreescriptura +@cindex color, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \override Staff.BarLine.color = #(rgb-color 1 1 1) + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +Finalment, hi ha també una escala de grisos com a part del conjunt +de colors d'X11. Varien des del negre, @code{'grey0}, fins al +blanc, @code{'grey100}, en passos de 1. Il·lustrarem això +establint tots els objectes de presentació del nostre exemple a +diverses gradacions de gris: + +@cindex StaffSymbol, exemple de sobreescriptura +@cindex TimeSignature, exemple de sobreescriptura +@cindex Clef, exemple de sobreescriptura +@cindex NoteHead, exemple de sobreescriptura +@cindex Stem, exemple de sobreescriptura +@cindex BarLine, exemple de sobreescriptura +@cindex color property, exemple +@cindex x11-color, exemple d'utilització + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \override Staff.StaffSymbol.color = #(x11-color 'grey30) + \override Staff.TimeSignature.color = #(x11-color 'grey60) + \override Staff.Clef.color = #(x11-color 'grey60) + \override Voice.NoteHead.color = #(x11-color 'grey85) + \override Voice.Stem.color = #(x11-color 'grey85) + \override Staff.BarLine.color = #(x11-color 'grey10) + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +Observeu els contextos associats amb cadascú dels objectes de +presentació. És important que estiguin correctament escrits, o +les ordres no funcionaran. Recordeu que el context és aquell en +el qual es troba el gravador corresponent. El context +predeterminat per als gravadors pot trobar-se començant per +l'objecte de presentació, d'aquí al gravador que el produeix, i a +la pàgina del gravador del RFI apareix en quin context es pot +trobar normalment el gravador. + +@node Mida dels objectes +@subsection Mida dels objectes +@translationof Size of objects + +@cindex canvi de la mida dels objectes +@cindex mida dels objectes +@cindex objectes, mida de +@cindex objectes, canvi de la mida de + +Començarem examinant un altre cop un exemple anterior (vegeu +@ref{Niuat d'expressions musicals}) que ens mostrava com introduir +un pentagrama temporal, com a un @rglos{ossia}. + +@cindex alignAboveContext, propietat, exemple +@cindex @code{\with}, ejemplo + +@lilypond[quote,ragged-right,verbatim] +\new Staff ="main" { + \relative { + r4 g'8 g c4 c8 d | + e4 r8 + << + { f8 c c } + \new Staff \with { + alignAboveContext = #"main" } + { f8 f c } + >> + r4 | + } +} +@end lilypond + +Els fragments d'Ossia s'escriuen normalment sense clau ni compàs, +i en general s'imprimeixen més petits que el pentagrama +principal. Ja sabem com treure la clau i el compàs: simplement +establim el segell de cadascú d'ells a @code{#f}, como segueix: + +@cindex alignAboveContext, propietat, exemple +@cindex @code{\with}, exemple +@funindex \omit +@cindex Clef, exemple de sobreescriptura +@cindex TimeSignature, exemple de sobreescriptura + +@lilypond[quote,ragged-right,verbatim] +\new Staff ="main" { + \relative { + r4 g'8 g c4 c8 d | + e4 r8 + << + { f8 c c } + \new Staff \with { + alignAboveContext = #"main" + } + { + \omit Staff.Clef + \omit Staff.TimeSignature + { f8 f c } + } + >> + r4 | + } +} +@end lilypond + +@noindent +on el parell de claus addicionals després de l'ordre +@code{\with} són necessàries per assegurar que la sobreescriptura +envoltada i la música s'apliquen al pentagrama d'ossia. + +Però, quina és la diferència entre modificar el context de +pentagrama usant @code{\with} i modificar els segells de clau i de +compàs amb \override, o en aquest cas @code{\omit}? La diferència +principal és que els canvis que es realitzen a una ordre +@code{\with} es fan en el moment que es crea el context, i romanen +actiu com a valors @strong{predeterminats} durant tota la duració +d'aquest context, mentre que les ordres @code{\set} o +@code{\override} incloses dins de la música són dinàmiques: fan +canvis sincronitzats amb un punt concret de la música. Si els +canvis es desfan o es reverteixen mitjançant @code{\unset} o +@code{\revert} tornaran al seu valor predeterminat que serà +l'establert a l'ordre @code{\with}, o si no s'ha establert cap +valor en aquest lloc, els valors predeterminats normals. + +Certes propietats de context es poden modificar sols dins de les +ordres @code{\with}. Són aquelles propietats que no es poden +canviar després que el context s'hagi +creat. @code{alignAboveContext} i el seu company, +@code{alignBelowContext}, són dos d'aquestes propietats: un cop +que el pentagrama s'ha creat, la seva alineació està decidida i no +tindria sentit intentar canviar-la més tard. + +Els valors predeterminats de les propietats dels objectes de +presentació també es poden establir dins d'ordres +@code{\with}. Simplement utilitzeu l'ordre @code{\override} normal +deixant a part el nom del context, ja que està definit sense +ambigüitat com el context que l'ordre @code{\with} està +modificant. De fet, es produirà un error si s'especifica un +context en aquest lloc. + +Així doncs, podem reemplaçar l'exemple anterior amb + +@cindex alignAboveContext, propietat, exemple +@cindex @code{\with}, exemple +@cindex Clef, exemple de sobreescriptura +@cindex TimeSignature, exemple de sobreescriptura + +@lilypond[quote,ragged-right,verbatim] +\new Staff ="main" { + \relative { + r4 g'8 g c4 c8 d | + e4 r8 + << + { f8 c c } + \new Staff \with { + alignAboveContext = #"main" + % Don't print clefs in this staff + \override Clef.stencil = ##f + % Don't print time signatures in this staff + \override TimeSignature.stencil = ##f + } + { f8 f c } + >> + r4 | + } +} +@end lilypond + +Resulta que també podem usar aquí les abreviatures @code{\hide} i +@code{\omit} per fixar la propietat @code{transparent} i esborrar +el @code{stencil}, el que condueix al resultat següent: + +@lilypond[quote,ragged-right,verbatim] +\new Staff ="principal" { + \relative { + r4 g'8 g c4 c8 d | + e4 r8 + << + { f8 c c } + \new Staff \with { + alignAboveContext = #"principal" + % No imprimeixis claus en aquest pentagrama + \omit Clef + % No imprimeixis indicacions de compàs en aquest pentagrama + \omit TimeSignature + } + { f8 f c } + >> + r4 | + } +} +@end lilypond + +Finalment arribem a la forma de canviar la mida dels objectes de +presentació. + +Certs objectes de presentació es creen com glifs trets d'un tipus +de lletra. Entre ells es troben els caps, alteracions, elements +de marcatge, claus, indicacions de compàs, indicacions dinàmiques +i la lletra de les cançons. La seva mida es canvia mitjançant la +modificació de la propietat @code{font-size}, com veurem en breu. +Altres objectes de presentació, com ara lligadures d'unió i +d'expressió (en general, objectes d'extensió) es dibuixen +individualment, per la qual cosa no hi ha una mida de tipus de +lletra @code{font-size} associat amb ells. Aquests objectes +generalment deriven la seva mida dels objectes als quals estan +adjuntats, i per això normalment no hi ha necessitat de +canviar-los la mida manualment. A més a més, altres propietats +com la longitud de les pliques i les barres de compàs, el gruix de +les barres de corxera i altres línies, i la separació de les +línies del pentagrama, s'han de modificar d'altres maneres especials. + +Tornant a l'exemple de l'ossia, canviarem en primer lloc la mida +del tipus de lletra. Podem fer-lo de dues formes. Podem canviar +la mida dels tipus de lletra de cadascú dels tipus d'objecte com +els caps (@code{NoteHead}s) amb instruccions com ara: + +@example +\override NoteHead.font-size = #-2 +@end example + +o podem canviar la mida de tots els tipus de lletra establint una +propietat especial, @code{fontSize}, utilitzant @code{\set}, o +mitjançant la seva inclusió dins d'una ordre @code{\with} (però +sense el @code{\set}). + +@example +\set fontSize = #-2 +@end example + +Els dos enunciats produirien una reducció de la mida del tipus de +lletra en dos passos a partir del seu valor previ, on cada pas +redueix o augmenta la mida aproximadament en un 12%. + +Ho provarem al nostre exemple de l'ossia: + +@cindex alignAboveContext, propietat, exemple +@cindex @code{\with}, exemple +@cindex Clef, exemple de sobreescriptura +@cindex TimeSignature, exemple de sobreescriptura +@cindex fontSize, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\new Staff ="main" { + \relative { + r4 g'8 g c4 c8 d | + e4 r8 + << + { f8 c c } + \new Staff \with { + alignAboveContext = #"main" + \omit Clef + \omit TimeSignature + % Reduce all font sizes by ~24% + fontSize = #-2 + } + { f8 f c } + >> + r4 | + } +} +@end lilypond + +Encara no està massa bé. Els caps i els claudàtors de les notes +són més petits, però les pliques són massa llargues en proporció, +i les línies del pentagrama estan massa separades entre sí. S'ha +de reduir la seva escala en proporció a la reducció del tipus de +lletra. El següents apartat tracta sobre com es fa això. + +@node Longitud i gruix dels objectes +@subsection Longitud i gruix dels objectes +@translationof Length and thickness of objects + +@cindex distàncies +@cindex gruix +@cindex longitud +@cindex magstep +@cindex mida, canviar +@cindex plica, canviar la longitud +@cindex pentagrama, canviar la separació de les línies + +Les distàncies i longituds al LilyPond es mesuren generalment en +espais de pentagrama, la distància entre línies adjacents de la +pauta (o de manera ocasional mig espais), mentre que la major part +de les propietats de @code{thickness} (gruix) es mesuren en +unitats d'una propietat interna anomenada @code{line-thickness.} +Per exemple, de forma predeterminada, a les línies dels reguladors +se'ls dóna un gruix d'una unitat de @code{line-thickness}, mentre +que el @code{thickness} d'una plica és 1.3. Observeu tanmateix +que certes propietats de gruix són diferents; per exemple, el +gruix de les barres de corxera es controla per mitjà del valor de +@code{beam-thickness}, que es mesura en espais de pentagrama. + +Aleshores, com s'han d'escalar les longituds en proporció a la +mida del tipus de lletra? Es pot fer amb l'ajuda d'una funció +espacial que s'anomena @code{magstep}, pensada especialment per a +aquest propòsit. Agafa un argument, el canvi de mida de la +tipografia (#-2 al nostre exemple) i retorna un factor d'escalat +adequat per reduir altres objectes en la mateixa proporció. S'una +de la forma següent: + +@cindex alignAboveContext, propietat, exemple +@cindex @code{\with}, exemple +@cindex Clef, exemple de sobreescriptura +@cindex TimeSignature, exemple de sobreescriptura +@cindex fontSize, propietat, exemple +@cindex StaffSymbol, exemple de sobreescriptura +@cindex magstep, funció, exemple d'utilització +@cindex staff-space, propietat, exemple +@cindex stencil, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\new Staff ="main" { + \relative { + r4 g'8 g c4 c8 d | + e4 r8 + << + { f8 c c } + \new Staff \with { + alignAboveContext = #"main" + \omit Clef + \omit TimeSignature + fontSize = #-2 + % Redueix la longitud de la plica i l'espaiat entre línies per concordar + \override StaffSymbol.staff-space = #(magstep -2) + } + { f8 f c } + >> + r4 | + } +} +@end lilypond + +@noindent +Atès que la longitud de les pliques i moltes altres propietats +relacionades amb les longituds es calculen sempre en relació al +valor de la propietat @code{staff-space}, la seva longitud també +veu reduïda la seva escala automàticament. Observeu que això +afecta sols a l'escala vertical de l'ossia: l'escala horitzontal +es determina per mitjà de la disposició de la música principal amb +l'objectiu de mantenir-se en sincronia amb ella, de forma que no +resulti afectada per cap d'aquests canvis de mida. Per suposat, +si l'escala de tota la música principal es canviés d'aquesta +forma, aleshores l'espaiat horitzontal es veuria afectat. +Tractarem d'això més tard, en la secció sobre la disposició. + +Això, finalment, completa la creació d'un ossia. Les mides i +longituds de la resta dels objectes es poden modificar de manera +semblant. + +Per a canvis d'escala petits, com a l'exemple de dalt, el gruix de +les diverses línies dibuixades com ara divisòries, barres de +corxera, reguladors, lligadures, etc., no requereixen normalment +cap ajust global. Si cal ajustar el gruix de qualsevol objecte de +presentació en particular, es pot fer millor mitjançant la +sobreescriptura de la seva propietat +@code{thickness}. Anteriorment vam mostrar un exemple de canvi de +gruix en les lligadures, a @ref{Propietats dels objectes de +presentació}. El gruix de tots els objectes dibuixats (és a dir, +aquells que no es produeixen a partir d'un tipus de lletra) es +poden canviar de la mateixa forma. + +@node Col·locació dels objectes +@section Col·locació dels objectes +@translationof Placement of objects + +@menu +* Comportament automàtic:: +* Objectes interiors al pentagrama:: +* Objectes fora del pentagrama:: +@end menu + + +@node Comportament automàtic +@subsection Comportament automàtic +@translationof Automatic behavior + +@cindex dins del pentagrama, objectes +@cindex fora del pentagrama, objectes +@cindex objectes dins del pentagrama +@cindex objectes fora del pentagrama + +Hi ha certs objectes a la notació musical que pertanyen al +pentagrama i d'altres amb un lloc fora del pentagrama. Reben el +nom d'objectes dins-del-pentagrama i objectes fora-del-pentagrama, +respectivament. + +Els objectes dins-del-pentagrama són els que se situen sobre la +pauta: caps, pliques, alteracions, etc. Les seves posicions +normalment es fixen per la pròpia música; es posicionen +verticalment sobre línies específiques del pentagrama o estan +units a d'altres objectes posicionats d'aquesta forma. Les +col·lisions entre caps, pliques i alteracions en acords de notes +molt juntes, normalment s'eviten automàticament. Hi ha +instruccions i sobreescriptures que poden modificar aquest +comportament automàtic, com veurem en breu. + +Entre els objectes que pertanyen a l'exterior de la pauta es +troben coses com les marques d'assaig, les marques de text i les +de dinàmica. La regla del LilyPond per a la col·locació vertical +dels objectes fora-de-pentagrama és col·locar-los tan a prop del +pentagrama com sigui possible, però no tan a prop com perquè +puguin xocar amb algun altre objecte. El LilyPond utilitza la +propietat @code{outside-staff-priority} per determinar l'ordre en +el qual s'han de situar els objectes, com veurem ara. + +En primer lloc, el LilyPond situa tots els objecte +dins-del-pentagrama. Després ordena els objectes +fora-del-pentagrama d'acord amb la seva prioritat +@code{outside-staff-priority}. Els objectes fora-del-pentagrama +s'agafen d'un en un, començant pel que té la prioritat +@code{outside-staff-priority} més baixa, i se situen de forme que +no col·lisionin amb cap objecte que s'hagi col·locat ja. O sigui, +si dos grobs fora-del-pentagrama competeixen pel mateix espai, el +que té la prioritat @code{outside-staff-priority} més baixa es +col·locarà més a prop del pentagrama. Si dos objectes tenen la +mateixa @code{outside-staff-priority}, el que s'ha trobat primer +se situarà més a prop de la pauta. + +A l'exemple següent tots els textos de marcatge tenen la mateixa +prioritat (atès que no s'ha establert explícitament). Observeu +que @q{Text3} es posiciona de nou automàticament a prop del +pentagrama, acomodat per sota de @q{Text2}. + +@cindex markup, exemple + +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | +@end lilypond + +Els pentagrames també es posicionen, de forma predeterminada, tan +a prop els uns dels altre com sigui possible (subjecte a una +separació mínima). Si les notes es projecten molt lluny en +direcció a un pentagrama adjacent, forçaran a allunyar-se als +pentagrames sols si en cas contrari anés a ocórrer un solapament +de la notació. L'exemple següent mostra aquesta acomodació +@q{nestling} de les notes sobre pentagrames adjacents: + +@lilypond[quote,ragged-right,verbatim] +<< + \new Staff { + \relative { c'4 a, } + } + \new Staff { + \relative { c''''4 a, } + } +>> +@end lilypond + + +@node Objectes interiors al pentagrama +@subsection Objectes interiors al pentagrama +@translationof Within-staff objects + +Ja hem vist com les instruccions @code{\voiceXXX} afecten a la +direcció de les lligadures d'expressió i d'unió, digitacions i +tots els altres elements que depenen de la direcció de les pliques +(vegeu @ref{Veus explícites}). Quan s'escriu música polifònica, +aquestes ordres són essencials perquè puguin distingir-se diverses +línies melòdiques entrellaçades. Però ocasionalment pot caldre +sobreescriure aquest comportament automàtic. Es pot fer seccions +de música completes o fins i tot per a una nota individual. La +propietat que controla aquest comportament és la propietat de +@code{direction} (direcció) de cada objecte de presentació. En +primer lloc explicarem que fa això, i després introduirem algunes +instruccions llestes per usar que us evitaran haver de codificar +sobreescriptures explícites per a les modificacions més comunes. + +Alguns objectes de presentació com les lligadures es corben cap +amunt o cap avall; d'altres com les pliques els claudàtors també +es mouen a la dreta o a l'esquerra quan apunten cap amunt o cap +avall. Això es controla automàticament quan està establerta la +propietat @code{direction}. + +@menu +* La propietat direction (direcció):: +* Digitacions:: +@end menu + +@node La propietat direction (direcció) +@unnumberedsubsubsec La propietat @code{direction} (direcció) +@translationof The direction property + +@cindex amunt +@cindex avall +@cindex centre +@cindex neutre +@cindex down +@cindex up +@cindex center +@cindex neutral + +L'exemple següent mostra al primer compàs la col·locació +predeterminada de les lligadures d'expressió, estant per sobre les +que comencen en notes agudes i per sota les que comencen en notes +greus, seguit d'un compàs amb ambdues lligadures forçades cap +avall, un altre compàs amb les dues forçades cap amunt i per últim +un compàs amb les lligadures retornades al seu comportament +predeterminat. + +@cindex Slur, exemple de sobreescriptura +@cindex direction, propietat, exemple + +@lilypond[quote,fragment,verbatim] +a'4( g') c''( a') | +\override Slur.direction = #DOWN +a'4( g') c''( a') | +\override Slur.direction = #UP +a'4( g') c''( a') | +\revert Slur.direction +a'4( g') c''( a') | +@end lilypond + +Aquí hem usat les constants @code{DOWN} (avall) i @code{UP} +(amunt). Aquestes constants tenen els valors @w{@code{-1}} i +@code{+1}, respectivament, i aquests valors numèrics també es +poden usar directament. El valor @code{0} també es pot usar en +alguns casos. Per a les lligadures d'expressió el significat +simplement és @code{up} (cap amunt), però per a alguns objectes té +el significat de @q{centrat}. Hi ha una constant @code{CENTER} +que té el valor de @code{0}. + +Tanmateix, aquestes sobreescriptures no s'usen massa sovint perquè +hi ha disponibles algunes ordres predefinides equivalents més +senzilles. Aquí podem veure una taula de les més comunes. Es +menciona el significat de cadascuna allí on no és obvi. + +@multitable @columnfractions .2 .2 .25 .35 +@headitem Avall o Esquerra + @tab Amunt o Dreta + @tab Anul·lar + @tab Efecte +@item @code{\arpeggioArrowDown} + @tab @code{\arpeggioArrowUp} + @tab @code{\arpeggioNormal} + @tab La fletxa està a sota, a dalt o no hi ha fletxa +@item @code{\dotsDown} + @tab @code{\dotsUp} + @tab @code{\dotsNeutral} + @tab Direcció del desplaçament per evitar les línies del pentagrama +@item @code{\dynamicDown} + @tab @code{\dynamicUp} + @tab @code{\dynamicNeutral} + @tab +@item @code{\phrasingSlurDown} + @tab @code{\phrasingSlurUp} + @tab @code{\phrasingSlurNeutral} + @tab Nota: diferent de les ordres de lligadures d'expressió +@item @code{\slurDown} + @tab @code{\slurUp} + @tab @code{\slurNeutral} + @tab +@item @code{\stemDown} + @tab @code{\stemUp} + @tab @code{\stemNeutral} + @tab +@item @code{\textSpannerDown} + @tab @code{\textSpannerUp} + @tab @code{\textSpannerNeutral} + @tab El text introduït com a objecte d'extensió està a sota o a sobre del pentagrama +@item @code{\tieDown} + @tab @code{\tieUp} + @tab @code{\tieNeutral} + @tab +@item @code{\tupletDown} + @tab @code{\tupletUp} + @tab @code{\tupletNeutral} + @tab Els grups especials estan a sota a sobre de les notes +@end multitable + +Les variants neutres o normals d'aquests ordres estan +implementades usant @code{\revert} i aquestes ordres @strong{no} +poden anar precedides de @code{\once}. Si voleu limitar l'efecte +de les altres ordres (que estan implementades usant +@code{\override}) a un sol pas de temps, podeu precedir-la de +@code{\once} de la mateixa forma que ho faríeu amb les +sobreescriptures explícites. + +O be, si cap forçar un únic objecte de presentació cap amunt o cap +avall, es poden usar els indicadors de direcció, @code{^} o +@code{_}: + +@lilypond[quote,fragment,verbatim] +a'4( g') c''( a') | +a'4^( g') c''_( a') | +@end lilypond + +@node Digitacions +@unnumberedsubsubsec Digitacions +@translationof Fingering + +@cindex digitació, col·locació +@cindex digitació d'acords + +La col·locació de les digitacions sobre notes soltes també es pot +controlar mitjançant la propietat @code{direction}, però els +canvis sobre @code{direction} no tenen cap efecte sobre les notes +dels acords. Com veurem, hi ha ordres especials que permeten +controlar les digitacions de notes individuals, situant la +digitació a sobre, a sota, a l'esquerra o a la dreta de cada nota. + +En primer lloc, vet aquí l'efecte de @code{direction} sobre les +digitacions aplicades a notes soltes. Es mostra en el primer +compàs el comportament predeterminat, i en els dos compassos +següents l'efecte d'especificat @code{DOWN} i @code{UP}: + +@cindex Fingering, exemple de sobreescriptura +@cindex direction, propietat, exemple + +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #DOWN + c4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #UP + c4-5 a-3 f-1 c'-5 | +} +@end lilypond + +Tanmateix, la sobreescriptura de la propietat @code{direction} no +és la forma més senzilla d'especificar manualment la digitació per +sobre o per sot de les notes; sol ser preferible usar +@code{_} o @code{^} en lloc de @code{-}, abans del número de la +digitació. Aquest és l'exemple anterior utilitzant aquest mètode: + +@cindex fingering, exemple +@cindex digitación, exemple + +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + c4_5 a_3 f_1 c'_5 | + c4^5 a^3 f^1 c'^5 | +} +@end lilypond + +La propietat @code{direction} s'ignora per als acords, però els +prefixos direccionals @code{_} i @code{^} sí funcionen. De forma +sí funcionen. De forma predeterminada, les digitacions es +col·loquen automàticament a sobre i a sota de les notes d'un +acord, com es mostra aquí: + +@cindex fingering, exemple +@cindex digitación, exemple + +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} +@end lilypond + +@noindent +però es pot forçar de manera que tots o alguns dels números de +digitació estan per sobre o per sota: + +@cindex fingering, exemple +@cindex digitación, exemple + +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} +@end lilypond + +És possible exercir un control encara més gran sobre la +col·locació de les digitacions mitjançant la utilització de +l'ordre @code{\set fingeringOrientations}. El format d'aquesta +ordre és: + +@example +@code{\set fingeringOrientations = #'([up] [left/right] [down])} +@end example + +@noindent +s'utilitza @code{\set} perquè @code{fingeringOrientations} és una +propietat del context @code{Voice}, creat i usat pel gravador +@code{New_fingering_engraver}. + +La propietat es pot establir al valor d'una llista d'entre u i +tres valors. Controla si les digitacions es poden col·locar per +sobre (si @code{up} apareix a la llista), per sota (si apareix +@code{down}), a l'esquerra (si apareix @code{left}) o a la dreta +(si apareix @code{right}). A la inversa, si una col·locació no +està a la llista, no se situa cap digitació en aquest lloc. El +LilyPond agafa aquestes restriccions i calcula la millor +col·locació per a la digitació de les notes dels acords que +segueixen. Observeu que @code{left} i @code{right} són mútuament +excloents: les digitacions poden situar-se a un costat o l'altre, +no als dos. + +@warning{Per controlar la col·locació de la digitació d'una sola +nota usant aquesta instrucció és necessari escriure-la com un +acord d'una sola nota envoltant-la entre angles simples.} + +Aquí podem veure alguns exemples: + +@cindex fingering, exemple +@cindex digitación, exemple +@cindex @code{\set}, exemple d'utilització +@cindex fingeringOrientations, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} +@end lilypond + +@noindent +Si la digitació sembla una mica superpoblada, es pot reduir la +mida @code{font-size}. El valor predeterminat pot veure's a +l'objecte @code{Fingering} del RFI que és @w{@code{-5}}, així que +provarem @w{@code{-7}}: + +@lilypond[quote,ragged-right,verbatim] +\relative { + \override Fingering.font-size = #-7 + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} +@end lilypond + + +@node Objectes fora del pentagrama +@subsection Objectes fora del pentagrama +@translationof Outside-staff objects + +Els objectes fora del pentagrama se situen automàticament per +evitar les col·lisions. Hi ha diverses formes de sobreescriure la +col·locació automàtica si el posicionat no resulta òptim. + +@menu +* La propietat outside-staff-priority (prioritat fora del pentagrama):: +* L'ordre textLengthOn:: +* Posicionament dels matisos dinàmics:: +* Escalat d'un «Grob»:: +@end menu + + +@node La propietat outside-staff-priority (prioritat fora del pentagrama) +@unnumberedsubsubsec La propietat @code{outside-staff-priority} (prioritat fora del pentagrama) +@translationof The outside-staff-priority property + +Els objectes fora-del-pentagrama es col·loquen automàticament per +evitar les col·lisions. Els objectes que tenen el valor més bais +de la propietat @code{outside-staff-priority} se situen més a prop +del pentagrama, i llavors altres objectes fora-del-pentagrama +s'aixequen tant com sigui necessari per evitar la col·lisió. La +prioritat @code{outside-staff-priority} es defineix al +@code{grob-interface} i així és una propietat de totes els +objectes de presentació. De forma predeterminada s'estableix a +@code{#f} per a tots els objectes dins-del-pentagrama, i a un +valor numèric adequat a cada objecte fora-del-pentagrama quan es +crea l'objecte. La taula següent presenta els valors numèrics +predeterminats per a alguns dels objectes fora-del-pentagrama més comuns. + +@cindex objectes d'extensió + +Observeu els noms una mica inusuals d'alguns dels objectes: els +objectes d'extensió es creen automàticament per controlar el +posicionament vertical dels grobs que (potser) comencen i acaben +en diferents moments musicals, de manera que qualsevol modificació +a la prioritat @code{outside-staff-priority} del grob subjacent no +té cap efecte. Per exemple, canviar la +@code{outside-staff-priority} de l'objecte de regulador +@code{Hairpin} no té efecte sobre la posició vertical dels +reguladors: en comptes d'això, hem de canviar la +@code{outside-staff-priority} de l'objecte associat +@code{DynamicLineSpanner}. Aquesta sobreescriptura s'ha de fer al +començament de l'objecte d'extensió, que podria incloure diversos +reguladors o matisos dinàmics encadenats. + +@multitable @columnfractions .3 .3 .3 +@headitem Objecte de presentació + @tab Prioritat + @tab Controla la posició de: +@item @code{RehearsalMark} + @tab @code{1500} + @tab Lletres d'assaig +@item @code{MetronomeMark} + @tab @code{1000} + @tab Indicacions metronòmiques +@item @code{VoltaBracketSpanner} + @tab @code{600} + @tab Caixetes de primer i segona vegada +@item @code{TextScript} + @tab @code{450} + @tab Text en elements de marcatge +@item @code{MultiMeasureRestText} + @tab @code{450} + @tab Text sobre silencis de compàs complet +@item @code{OttavaBracket} + @tab @code{400} + @tab Claudàtors d'octava alta i baixa +@item @code{TextSpanner} + @tab @code{350} + @tab Objectes d'extensió de text +@item @code{DynamicLineSpanner} + @tab @code{250} + @tab Totes les indicacions dinàmiques +@item @code{VoltaBracketSpanner} + @tab @code{100} + @tab Números de compàs +@item @code{TrillSpanner} + @tab @code{50} + @tab Trins mantinguts +@end multitable + +Vet aquí un exemple que mostra la situació predeterminada d'alguns +d'ells. + +@cindex text, extensions de +@cindex octava alta y baixa, claudàtor de + +@funindex \startTextSpan +@funindex \stopTextSpan + +@cindex TextSpanner, exemple de sobreescriptura +@cindex bound-details, propietat, exemple + +@lilypond[quote,fragment,ragged-right,verbatim] +% Estableix els detalls per a un Text Spanner posterior +\override TextSpanner.bound-details.left.text + = \markup { \small \bold Slower } +% Col·loca la indicació dinàmica a sobre del pentagrama +\dynamicUp +% Inicia el claudàtor d'octava +\ottava #1 +c''4 \startTextSpan +% Afegeix el text de la indicació dinàmica i el símbol +c''4\pp\< +c''4 +% Afegeix el fragment de text +c''4^Text | +c''4 c'' +% Afegeix el text de la dinàmica i finalitza el símbol +c''4\ff c'' \stopTextSpan | +% Stop Ottava Bracket +\ottava #0 +c'4 c' c' c' | +@end lilypond + +Aquest exemple també mostra com crear textos amb extensió (Text +Spanners): textos amb línies extensores per sobre d'una secció de +música. L'extensor abasta des de l'ordre@code{\startTextSpan} +fins l'ordre @code{\stopTextSpan}, i el format del text es +defineix per mitjà de l'ordre @code{\override TextSpanner}. Per +veure més detalls, consulteu@rusernamed{Text spanners,Extensions de text}. + +També mostra la manera de crear claudàtors d'octava alta i baixa. + +@cindex ajustar la ubicació dels números de compàs +@cindex números de compàs, ajustar posició +@cindex ajustar la situació de marques metronòmiques +@cindex metrònom, situació de les indicacions de +@cindex ajustar la situació de les lletres d'assaig +@cindex assaig, lletres, ajustar la col·locació + +Si els valors predeterminats de @code{outside-staff-priority} no +us ofereixen les col·locacions desitjades es pot sobreescriure la +prioritat de qualssevol dels objectes. Suposeu que volguéssim que +el claudàtor d'octava estigués situat per sota de l'element +extensor de text a l'exemple de dalt. Tot el que hem de fer és +localitzar la prioritat de @code{OttavaBracket} al RFI o en les +taules anteriors, i reduir-lo a un valor inferior al de +@code{TextSpanner}, recordant que @code{OttavaBracket} es crea +dins del context @code{Staff}: + +@cindex TextSpanner, exemple de sobreescriptura +@cindex bound-details, propietat, exemple + +@lilypond[quote,fragment,ragged-right,verbatim] +% Estableix els detalls per a un Text Spanner posterior +\override TextSpanner.bound-details.left.text + = \markup { \small \bold Slower } +% Ubica els indicadors de dinàmica a sobre del pentagrama +\dynamicUp +% Posa els següent claudàtor d'octava a sota dels Text Spanners +\once \override Staff.OttavaBracket.outside-staff-priority = #340 +% Start Ottava Bracket +\ottava #1 +c''4 \startTextSpan +% Afegeix el text de la dinàmica +c''4\pp +% Afegeix l'extensor de la línia de dinàmica +c''4\< +% Afegeix el fragment de text +c''4^Text | +c''4 c'' +% Afegeix el text de la dinàmica +c''4\ff c'' \stopTextSpan | +% Atura el claudàtor d'octava +\ottava #0 +c'4 c' c' c' | +@end lilypond + +Observeu que alguns d'aquests objectes, concretament els números de +compàs, les indicacions metronòmiques i les lletres d'assaig, es +fiquen de forma predeterminada dins del context @code{Score}; així +doncs, us heu d'assegurar que utilitzeu el context adequat quan se +sobreescriuen les propietats. + +@cindex lligadures i outside-staff-priority +@cindex lligadures i articulacions +@cindex articulacions i lligadures + +De forma predeterminada, les lligadures d'expressió estan +classificades com objectes dins-del-pentagrama, però amb +freqüència apareixen a sobre del pentagrama si les notes que +uneixen són molt agudes. Això pot empènyer els objectes +fora-del-pentagrama com les articulacions a una posició molt +elevada, atès que la lligadura es col·locarà en primer lloc. La +propietat @code{avoid-slur} de l'articulació es pot establir al valor +@code{'inside} (per dins) per portar-la a l'interior de la +lligadura, però la propietat @code{avoid-slur} és efectiva sols si +la prioritat @code{outside-staff-priority} està també establerta +al valor @code{#f}. De forma alternativa, la prioritat +@code{outside-staff-priority} de la lligadura es pot fixar en un +valor numèrica per fer que se situï en línia amb altres objectes +fora del pentagrama d'acord amb aquest valor. Vet aquí un exemple +que mostra l'efecte dels dos mètodes: + +@lilypond[quote,verbatim] +\relative c'' { + c4( c^\markup { \tiny \sharp } d4.) c8 | + c4( + \once \override TextScript.avoid-slur = #'inside + \once \override TextScript.outside-staff-priority = ##f + c4^\markup { \tiny \sharp } d4.) c8 | + \once \override Slur.outside-staff-priority = #500 + c4( c^\markup { \tiny \sharp } d4.) c8 | +} +@end lilypond + +Els canvis a @code{outside-staff-priority} també es poden usar per +controlar la ubicació vertical dels objectes individuals, tot i +que els resultats poden no ser sempre desitjables. Suposeu que +voleu que @qq{Text3} se situï per sobre de @qq{Text4} a l'exemple +sota l'epígraf Comportament Automàtic de més a dalt (vegeu +@ref{Comportament automàtic}). Tot el que estem fer és localitzar +la prioritat de @code{TextScript} en el RFI o en les taules de +dalt, i augmentar la prioritat de @qq{Text3} fins un valor superior: + +@cindex TextScript, exemple de sobreescriptura +@cindex outside-staff-priority, propietat, exemple + +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | +\once \override TextScript.outside-staff-priority = #500 +c''2^"Text3" +c''2^"Text4" | +@end lilypond + +Això, certament, aixeca a @qq{Text3} per sobre de @qq{Text4}, però +també l'aixeca per sobre de @qq{Text2}, i @qq{Text4} ara cau cap a +baix. Potser no sigui tan bona idea. I si el que realment volem +fer és posicionar totes les anotacions a la mateixa distància per +sobre del pentagrama? Per fer-lo, ens caldrà clarament espaiar +les notes en sentit horitzontal per fer lloc per al text Això es +fa usant l'ordre @code{textLengthOn}. + +@node L'ordre textLengthOn +@unnumberedsubsubsec L'ordre @code{@bs{}textLengthOn} +@translationof The textLengthOn command + +@cindex notes, espaiar amb el text + +@funindex \textLengthOn +@funindex \textLengthOff + +De forma predeterminada, el text produït mitjançant marcatge no +ocupa cap espai horitzontal en quant es refereix a la disposició +de la música. L'ordre @code{\textLengthOn} inverteix aquest +comportament, fent que les notes resultin tan espaiades com sigui +necessari per encabir el text: + +@lilypond[quote,fragment,ragged-right,verbatim] +\textLengthOn % Fa que hi hagi més espai entre les notes per encabir el text +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | +@end lilypond + +L'ordre per tornar al comportament predeterminat és +@code{\textLengthOff}. De forma alternativa es pot usar +@code{\once} amb @code{\textLengthOn} si l'efecte s'ha de limitar +a un sol moment musical. El comportament d'espaiat corresponent +per a les indicacions d'assaig i les indicacions de tempo es +controla independentment amb les ordres @code{\markLengthOn} y +@code{\markLengthOff}. + +@cindex marcatge, text de, permetre les col·lisions en + +El text de marcatge també evita les notes que es projecten per +sobre del pentagrama. Si això no és el que desitgem, el +desplaçament automàtic cap a dalt es pot desactivar mitjançant +l'establiment de la prioritat a @code{#f}. Vet aquí un exemple +que mostra com el text de marcatge interactua amb aquestes notes. + +@cindex TextScript, exemple de sobreescriptura +@cindex outside-staff-priority, propietat, exemple + +@lilypond[quote,ragged-right,verbatim] +\relative { + % Aquest marcatge és suficientment curt per encabir sense col·lisió + c''2^"Tex" c'' | + R1 | + + % Això és massa llarg per encabir, per això és mou cap amunt + c,,2^"Text" c'' | + R1 | + + % Desactiva l'evitament de col·lisions + \once \override TextScript.outside-staff-priority = ##f + c,,2^"Long Text " c'' | + R1 | + + % Desactiva l'evitament de col·lisions + \once \override TextScript.outside-staff-priority = ##f + \textLengthOn % i activa textLengthOn + c,,2^"Long Text " % Es respecten els espais al final + c''2 | +} +@end lilypond + +@node Posicionament dels matisos dinàmics +@unnumberedsubsubsec Posicionament dels matisos dinàmics +@translationof Dynamics placement + +@cindex ajustament de la col·locació dels matisos +@cindex dinàmica, ajustament de la col·locació de les indicacions de +@cindex matisos, ajustament de la col·locació + +Les indicacions de matís dinàmic normalment es col·locaran per +sota del pentagrama, però es poden posicionar per sobre amb +l'ordre @code{\dynamicUp}. Se situaran verticalment respecte a la +nota a la que van adossades, i flotaran per sota (o per sobre) de +tots els objectes dins-del-pentagrama com ara les lligadures de +fraseig i números de compàs. Això pot oferir resultats força +acceptables, com mostra aquest exemple: + +@lilypond[quote,ragged-right,verbatim] +\relative { + \clef "bass" + \key aes \major + \time 9/8 + \dynamicUp + bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | + ees,2.~\)\mf ees4 r8 | +} +@end lilypond + +Malgrat això, si les notes i les seves indicacions dinàmiques +adossades estan massa a prop, la col·locació automàtica evitarà +les col·lisions desplaçant les marques dinàmiques posteriors més +lluny, tot i que aquest pot no ser el lloc òptim, com mostra el +següent exemple més bé artificial: + +@lilypond[quote,ragged-right,verbatim,fragment] +\dynamicUp +\relative { a'4\f b\mf a\mp b\p } +@end lilypond + +@noindent +Si es presentés una situació semblant en música @q{real}, podria +ser preferible espaiar les notes una mica més entre sí, de forma +que totes les marques dinàmiques poden cabre a la mateixa +distància vertical des del pentagrama. Hem estat capaços de fer +això per al text de marcatge utilitzant l'ordre +@code{\textLengthOn}, però no existeix una ordre equivalent per a +les indicacions de matís dinàmic. Per tant, hem d'esbrinar com +fer-ho utilitzant ordres @code{\override}. + +@node Escalat d'un «Grob» +@unnumberedsubsubsec Escalat d'un «Grob» +@translationof Grob sizing + +@cindex grob, canvi de mida d'un +@cindex escala dels grobs + +En primer lloc hem d'aprendre com s'especifica la mida dels +grobs. Tots els grobs tenen un punt de referència definit dins +d'ells que s'usa per col·locar-los respecte al seu objecte pare. +Aleshores, aquest punt del grob es posiciona a una distància +horitzontal, @code{X-offset}, i una distancia vertical, +@code{Y-offset}, a partir del seu pare. La dimensió horitzontal +de l'objecte ve donada per una parella de números, +@code{X-extent}, que diu on estan els límits esquerre i dret +respecte del punt de referència. L'amplitud vertical es defineix +de forma semblant mitjançant una parella de números, +@code{Y-extent}. Aquestes són propietats de tots els grobs que +contemplen @code{grob-interface}. + +@cindex @code{extra-spacing-width} + +De forma predeterminada, els objectes fora-del-pentagrama reben +una amplitud zero, de manera que poden solapar-se a la direcció +horitzontal. Això es fa mitjançant el truc de fer que la dimensió +més a l'esquerra sigui igual a menys infinit, establint el valor +de @code{extra-spacing-width} a @code{'(+inf.0 . -inf.0)}. Així, +per assegurar que no se superposen en la direcció horitzontal hem +de sobreescriure aquest valor de @code{extra-spacing-width} per +donar-los una mica de espai addicional. Les unitats són l'espai +entre dues línies del pentagrama, de forma que hauria de ser +suficient moure el límit esquerre mitja unitat a l'esquerra i el +límit dret mitja unitat a la dreta: + +@example +\override DynamicText.extra-spacing-width = #'(-0.5 . 0.5) +@end example + +@noindent +Vejam si funciona al nostre exemple anterior: + +@cindex DynamicText, exemple de sobreescritura +@cindex extra-spacing-width, propietat, exemple + +@lilypond[quote,ragged-right,verbatim,fragment] +\dynamicUp +% Estén l'amplitud amb 1 espai de pentagrama +\override DynamicText.extra-spacing-width = #'(-0.5 . 0.5) +\relative { a'4\f b\mf a\mp b\p } +@end lilypond + +@noindent +Això té un aspecte millor, però potser hauríem preferit que les +indicacions de dinàmica estiguessin alineades sobre la mateixa +línia de base en lloc d'anar cap amunt i cap avall amb les notes. +La propietat que ho fa és @code{staff-padding} (farciment de +pentagrama) que s'estudia a la secció dedicada a les col·lisions +(vegeu @ref{Col·lisions d'objectes}). + +@node Espaiat vertical +@section Espaiat vertical +@translationof Vertical spacing + +En general, l'espaiat vertical dels objectes musicals que fa el +LilyPond és força bo. Vejam com es comporta amb una cançó +senzilla, amb dues veus i acompanyament de piano: + +@lilypond[quote,fragment,ragged-right] +<< + \new ChoirStaff + << + \new Staff { + \new Voice = "music" { + b'2 c' c' c' + } + } + \new Lyrics + \lyricsto "music" { + Here are some lyrics + } + \new Staff { + \clef bass e'2 f e c + } + >> + \new PianoStaff + << + \new Staff { + g''2 c'' c'' a'' + } + \new Staff { + \clef bass e2 f c e + } + >> +>> +@end lilypond + +No hi ha cap problema amb l'espaiat vertical predeterminat. +Suposem tanmateix que estem treballant amb un editor que té certs +requisits específics per a l'espaiat vertical dels pentagrames i +la lletra: voleu que la lletra estigui més separada de les notes, +que l'acompanyament de piano estigui més separat de la línia vocal +i que els dos pentagrames de piano estiguin més junts entre sí. +Començarem amb la lletra. + +La lletra es troba a l'interior d'un sistema, i per tant les +ordres per aplicar-li l'espaiat estaran en +@rusernamed{Flexible vertical spacing within systems,Espaiat vertical flexible dins dels sistemes}. +Aquí es diu que el text són línies del tipus @qq{no-pauta} i per +tant l'ordre per canviar el seu espaiat farà referència a la propietat +@code{nonstaff}. Per separar-les del pentagrama al que pertanyen +(la pauta superior) usarem la propietat @code{relatedstaff}. Per +separar-les de la línia inferior usarem la propietat +@code{unrelatedstaff}. Les parts vocals pertanyen a un grup +vertical @code{unrelatedstaff}. Les parts vocals pertanyen a un +grup vertical @code{VerticalAxisGroup}, per la qual cosa hem +d'ajustar les seves propietats. Provem-lo i vejam si funciona. + +@lilypond[quote,fragment,ragged-right,verbatim] +<< + \new ChoirStaff + << + \new Staff { + \new Voice = "music" { + b'2 c' c' c' + } + } + \new Lyrics \with { + \override VerticalAxisGroup. + nonstaff-relatedstaff-spacing.padding = #5 + \override VerticalAxisGroup. + nonstaff-unrelatedstaff-spacing.padding = #5 + } + \lyricsto "music" { + Here are some lyrics + } + \new Staff { + \clef bass e'2 f e c + } + >> + \new PianoStaff + << + \new Staff { + g''2 c'' c'' a'' + } + \new Staff { + \clef bass e2 f c e + } + >> +>> +@end lilypond + +Bé: sí, funciona, però potser massa bé. Quan establim el +@code{padding} (farciment) a 5, el LilyPond afegeix 5 espais de +pentagrama a l'espai entre els objectes, cosa que és excessiva per +a nosaltres en aquest cas. Usarem un valor de 2. + +A continuació, desplaçarem la música de piano per separar-la de +les parts vocals. La música vocal és una @code{Choirstaff} (un +context de sistema coral), i per tant hem d'augmentar l'espaiat +entre aquest grup de pentagrama i el sistema de piano que es troba +a sota. Ho farem canviant la@code{basic-distance} (distància +bàsica) del @code{StaffGrouper} del @code{staffgroup-staff-spacing}. + +@lilypond[quote,fragment,ragged-right,verbatim] +<< + \new ChoirStaff \with { + \override StaffGrouper. + staffgroup-staff-spacing.basic-distance = #15 + } + << + \new Staff { + \new Voice = "music" { + b'2 c' c' c' + } + } + \new Lyrics \with { + \override VerticalAxisGroup. + nonstaff-relatedstaff-spacing.padding = #2 + \override VerticalAxisGroup. + nonstaff-unrelatedstaff-spacing.padding = #2 + } + \lyricsto "music" { + Here are some lyrics + } + \new Staff { + \clef bass e'2 f e c + } + >> + \new PianoStaff + << + \new Staff { + g''2 c'' c'' a'' + } + \new Staff { + \clef bass e2 f c e + } + >> +>> +@end lilypond + +Molt bé. Ara sols ens queda l'últim requisit de fer que els +pentagrames de piano estiguin més junts. Per aconseguir-lo, un +altre cop alterem les propietats del @code{StaffGrouper}, però +aquest cop reduirem tant la @code{basic-distance} (distància +bàsica) com el @code{padding} (farciment). Podem fer-lo com es +mostra a continuació. + +@lilypond[quote,fragment,ragged-right,verbatim] +<< + \new ChoirStaff \with { + \override StaffGrouper. + staffgroup-staff-spacing.basic-distance = #15 + } + << + \new Staff { + \new Voice = "music" { + b'2 c' c' c' + } + } + \new Lyrics \with { + \override VerticalAxisGroup. + nonstaff-relatedstaff-spacing.padding = #2 + \override VerticalAxisGroup. + nonstaff-unrelatedstaff-spacing.padding = #2 + } + \lyricsto "music" { + Here are some lyrics + } + \new Staff { + \clef bass e'2 f e c + } + >> + \new PianoStaff \with { + \override StaffGrouper.staff-staff-spacing = #'( + (basic-distance . 0) + (padding . 0)) + } + << + \new Staff { + g''2 c'' c'' a'' + } + \new Staff { + \clef bass e2 f c e + } + >> +>> +@end lilypond + +Amb això els hem col·locat molt junts entre sí (però és el que +l'editor volia). Es podrien haver separat més alterant el +farciment, @code{padding}, o la distància bàsica, +@code{basic-distance}, si volguéssim. + +Hi ha moltes formes d'alterar l'espaiat vertical. Un punt clau +que hem de recordar és que l'espaiat entre objectes dins d'un +@code{StaffGroup} (com els grups @code{GrandStaff} o +@code{PianoStaff}) es controla amb les variables d'espaiat del +@code{StaffGrouper}. L'espaiat dels pentagrames no agrupats (com +@code{Lyrics} i @code{Staff}) es controla amb les variables +del @code{VerticalAxisGroup}. Per veure més detalls, consulteu +@rusernamed{Flexible vertical spacing paper variables,Variables de espaiat de paper verticals flexibles} i +@rusernamed{Flexible vertical spacing within systems,Espaiat vertical flexible dins dels sistemes}. + + +@node Col·lisions d'objectes +@section Col·lisions d'objectes +@translationof Col·lisions of objects + +@menu +* Moviment d'objectes:: +* Ajustament de la notació amb superposicions:: +* Exemples reals de música:: +@end menu + +@node Moviment d'objectes +@subsection Moviment d'objectes +@translationof Moving objects + +@cindex moviment d'objectes superposats +@cindex moviments d'objectes superposats +@cindex moviments de grobs que col·lisionen +@cindex objectes que col·lisionen, moure +@cindex grobs que col·lisionen, moure + +Tot i que us pugui sorprendre, el LilyPond no és perfecte. Certs +elements de notació es poden superposar, cosa que és una llàstima, +però en realitat és força poc freqüent. Normalment la necessitat +de moure objectes és fa per claredat o per raons estètiques: +l'aspecte és millor amb una mica més o una mica menys d'espai de +separació. + +Hi ha tres enfocaments principals que porten a la resolució de +superposicions en la notació. S'han de considerar a l'ordre següent: + +@enumerate +@item +La @strong{direcció} d'un dels objectes que se superposen es pot +canviar usant les ordres predefinides que es relacionen a dalt per +als objectes dins-del-pentagrama (vegeu +@ref{Objectes interiors al pentagrama}). Es poden recol·locar +fàcilment les pliques, lligadures d'expressió i d'unió, barres de +corxera, indicacions dinàmiques, text i grups de valoració +especial d'aquesta forma. La limitació és que sols teniu la +possibilitat d'escollir entre dues posicions, i podria ser que cap +d'elles sigui l'adequada. + +@item +Les @strong{propietats de l'objecte}, que el LilyPond fa servir +quan està col·locant els objectes de presentació, es poden +modificar usant l'ordre de sobreescriptura @code{\override}. Els +avantatges de fer canvis a aquest tipus de propietat són: a) que +algun altre objecte es mourà automàticament si és necessari, per +deixar-li lloc, i b) una única sobreescriptura es pot aplicar a +totes les instàncies del mateix tipus d'objecte. Entre aquestes +propietats es troben: + +@itemize + +@item +@code{direction} (direcció) + +Ja s'ha estudiat amb cert detall: vegeu @ref{Objectes interiors al pentagrama}. + +@item +@code{padding} (farciment), +@code{right-padding} (farciment per la dreta), +@code{staff-padding} (farciment de pentagrama) + +@cindex farciment +@cindex padding, propietat +@cindex right-padding, propietat +@cindex staff-padding, propietat + +Segons quin objecte s'està col·locant, el valor de la seva +propietat de farciment @code{padding} especifica l'espai intermedi +que s'ha de deixar entre l'objecte i el límit més pròxim de +l'objecte contra el qual s'esta col·locant. Observeu que +és el valor de @code{padding} de l'objecte @strong{que s'està +col·locant} el que s'ignora. Els espais intermedis especificats +mitjançant @code{padding} es poden aplicar a tots els objectes que +contemplen la interfície @code{side-position-interface}. + +En comptes de fer-lo amb @code{padding}, la col·locació dels grups +d'alteracions es controla amb @code{right-padding}. Aquest +propietat es troba a l'objecte @code{AccidentalPlacement} que, +observeu, viu dins el context de @strong{Staff}. Durant el procés +tipogràfic, els caps de les notes es componen tipogràficament en +primer lloc, i després les alteracions, si hi ha, s'afegeixen a +l'esquerre dels caps utilitzant la propietat de farciment per la +dreta @code{right-padding} per determinar la separació entre +l'alteració i el cap, i de les alteracions entre sí. Així doncs, +sols la propietat de farciment per la dreta @code{right-padding} +de l'objecte @code{AccidentalPlacement} té efecte sobre les +col·locacions de les alteracions. + +La propietat @code{staff-padding} està estretament relacionada amb +la propietat @code{padding}: @code{padding} controla la separació +mínima entre qualsevol objecte que contempli la interfície +@code{side-position-interface} i l'objecte més proper (generalment +la nota o les línies del pentagrama); @code{staff-padding} +s'aplica sols als objecte que sempre se situen fora del +pentagrama: controla la separació mínima entre aquest objecte i el +pentagrama. Observeu que @code{staff-padding} no té cap efecte +sobre objectes que se posicionen respecte a la nota en comptes de +fer-lo respecte al pentagrama, fins i tot malgrat pot ser +sobreescrit sense error per aquests objectes: simplement s'ignora. + +Per descobrir quina propietat de farciment cal per a l'objecte que +es vol recol·locar, heu de tornar al manual de RFI i buscar les +propietats de l'objecte. Aneu amb cura perquè les propietats de +farciment podrien no estar a l'objecte més obvi, així que busqueu +als objectes que puguin tenir alguna relació amb ell. + +Tots els valors de farciment es mesuren en espais del pentagrama. +Per a la major part dels objectes el valor s'estableix de forma +predeterminada en aproximadament 1.0 o menys (varia amb cada +objecte). Es pot sobreescriure si cal una separació intermèdia +més gran (o més petita). + +@item +@code{self-alignment-X} (Auto-alineament a l'eix X) + +@cindex self-alignment-X, propietat + +Aquesta propietat es pot usar per alinear l'objecte a l'esquerra, +a l adreta, o centrar-lo amb respecte al punt de referència de +l'objecte «pare». Es pot usar amb tot els objectes que respecten +la interfície @code{self-alignment-interface}. En general són +objectes que contenen text. Els valors són @code{LEFT}, +@code{RIGHT} o @code{CENTER}. De forma alternativa es pot +especificar un valor numèric entre @w{@code{-1}} i @code{+1}, no +@w{@code{-1}} s'alinea per l'esquerra, @code{+1} s'alinea per la +dreta, i els números intermedis mouen el text progressivament des +d'alineat per l'esquerra fins a alineat per la dreta. Es poden +especificar valors numèrics majors de @code{1} per moure el text +fins i tot més lluny cap a l'esquerra, o menys de +@w{@code{-1}} per allunyar-lo més cap a la dreta. Un canvi a +@code{1} en el valor correspon a un moviment de la meitat de la +longitud total del propi text. + +@item +@code{extra-spacing-width} (amplitud de separació addicional) + +@cindex extra-spacing-width, propietat + +Aquesta propietat està disponible per a tots els objectes que +respecten la interfície @code{item-interface}. Agafa dos +números, el primer se suma al límit esquerre i el segon se suma al +limit dret. Els números negatius desplacen el límit a l'esquerre +i els positius a la dreta, per la qual cosa per eixamplar un +objecte el primer número ha de ser negatiu i el segon positiu. +Observeu que no tots els objectes ostenten els dos números. Per +exemple, l'objecte @code{Accidental} (alteració) sols té en compte +el primer número (la vora esquerra). + +@item +@code{staff-position} (posició de pentagrama) + +@cindex staff-position, propietat + +@code{staff-position} és una propietat de la interfície +@code{staff-symbol-referencer-interface}, que respecten els +objectes que es col·loquen amb relació al pentagrama. Especifica +la posició vertical de l'objecte amb relació a la tercera línia +del pentagrama en mitjos espais de pentagrama. És útil a la +resolució de col·lisions entre objectes de presentació com +silencis multi-compàs, lligadures d'unió i notes a veus +diferents. + +@item +@code{horizontal-shift} + +@cindex horizontal-shift, propietat +@cindex nota, columna de +@cindex nota, col·lisions +@cindex col·lisions de notes +@cindex desplaçament, ordres de +@funindex \shiftOff +@funindex \shiftOn +@funindex \shiftOnn +@funindex \shiftOnnn + +Dins d'una veu, totes les notes que es produeixen al mateix moment +s'agrupen a una columna de notes, i es crea un objecte +@code{NoteColumn} per controlar el posicionament horitzontal +d'aquest grup de notes (vegeu @qq{Columnes de nota} a @ref{Veus +explícites}). Si @emph{i sols si} dos o més columnes de nota dins +d'un sol context de pauta, les dues amb pliques en la mateixa +direcció, apareixen al mateix moment musical, els valors de les +seves propietats @code{horizontal-shift} s'usen per assignar-los +una puntuació i les columnes amb puntuacions més altes es +desplacen progressivament per evitar les col·lisions entre els +caps de les notes. Aquesta propietat s'estableix amb les ordres +@code{\voiceXXX} i es poden sobreescriure directament amb una +ordre @code{\override} o, de forma més comuna amb les ordres +@code{\shiftOn}. Observeu que aquesta propietat s'usa per +@emph{qualificar} les columnes de nota o per aplicar +desplaçaments: no especifica la magnitud del desplaçament, que es +va incrementant progressivament en passos basant-se en l'amplitud +dels caps de nota per a cada puntuació. Els passos són +normalment de la meitat de l'amplitud d'un cap de nota, però pot +ser l'amplitud completa del cap d'una nota quan està implicat un +grup de notes molt atapeït. + +@item +@code{force-hshift} (forçar desplaçament horitzontal) + +@cindex force-hshift, propietat + +La propietat @code{force-hshift} és una propietat d'una +@code{NoteColumn} (realment ho és de la interfície +@code{note-column-interface}). Modificar-lo permet moure una +columna de notes en situacions on les columnes de notes se +superposen. Observeu que no té efecte sobre les columnes de nota +que no se superposen. S'especifica en unitats adequades a una +columna de notes, per exemple l'amplitud del cap de la nota de la +primera veu. S'ha d'usar en situacions complexes on les ordres +@code{\shiftOn} normals (véase @ref{Veus explícites}) no resolen +el conflicte entre les notes de forma satisfactòria. És +preferible a la propietat @code{extra-offset} per a aquest +propòsit, perquè no cal esbrinar la distància en espais de +pentagrama, i moure les notes dins o fora d'una @code{NoteColumn} +afecta a d'altres accions, com ara a la fusió entre caps de nota. + +@end itemize + +@item +Finalment, quant tota la resta falla, els objectes es poden +tornar a posicionar manualment amb relació a la tercera línia del +pentagrama verticalment, o desplaçant-los una certa distància a +una nova posició. Els desavantatges són que els valors correctes +per al nou posicionament s'han d'esbrinar, sovint per prova i +error, per a cada objecte individual i, atès que el moviment es fa +després que el LilyPond ha col·locat tota la resta d'objectes, +l'usuari és responsable d'evitar cap col·lisió que pogués +produir-se. Però la dificultat principal podria haver de tornar a +calcular la posició si la música es modifica més tard. Les +propietats que es poden suar per a aquest tipus de posicionament +manual són: + +@table @code +@item extra-offset (desplaçament addicional) + +@cindex extra-offset, propietat + +Aquesta propietat s'aplica a qualsevol objecte de presentació que +respecti el @code{grob-interface}. Agafa una parella de números +que especifiquen el desplaçament addicional a les direccions +horitzontal i vertical. Els nombres negatius mouen l'objecte a +l'esquerra o cap avall. Les unitats són espais de pentagrama. El +desplaçament addicional es fa després que la composició +tipogràfica dels objectes ha acabat, així que un objecte pot ser +tornat a posicionar a qualsevol lloc sense afectar cap altra cosa. + +@item positions (posicions) + +@cindex positions, propietat + +Aquesta propietat és de la major utilitat per ajustar manualment +la inclinació i l'alçada de les barres de corxera, lligadures +d'expressió i claudàtors de grups de valoració especial. Agafa +una parella de números que donen la posició dels extrems esquerre +i dret de la barra, lligadura, etc. amb relació a la tercera línia +del pentagrama. Les unitats són espais de pentagrama. Observeu, +però, que les lligadures d'expressió i de fraseig no es poden +tornar a posicionar en quantitats arbitràriament grans. El +LilyPond en primer lloc genera una llista de posicions possibles +per a la lligadura i de forma predeterminada troba la lligadura +que té @qq{millor aspecte}. Si la propietat @code{positions} s'ha +sobreescrit, la lligadura que està més a prop de les posicions que +s'han sol·licitat se selecciona de la llista. +@end table + +@end enumerate + +Un objecte en particular podria no tenir totes aquestes +propietats. Cal anar al manual RFI per buscar quines propietats +estan disponibles per a l'objecte en qüestió. + +Aquí presentem una llista dels objectes que és més probable que +estiguin implicats en col·lisions, amb el nom de l'objecte que +s'hauria de buscar al RFI per descobrir quines propietats s'han +d'usar per a moure'ls. + +@multitable @columnfractions .5 .5 +@headitem Tipus d'objecte @tab Nom de l'objecte +@item Articulacions @tab @code{Script} +@item Barres @tab @code{Beam} +@item Dinàmica (verticalment) @tab @code{DynamicLineSpanner} +@item Dinàmica (horitzontalment) @tab @code{DynamicText} +@item Digitacions @tab @code{Fingering} +@item Marques d'assaig i textuals @tab @code{RehearsalMark} +@item Lligadures de expressió @tab @code{Slur} +@item Text, per exemple @code{^"text"} @tab @code{TextScript} +@item Lligadures d'unió @tab @code{Tie} +@item Grups de valoració especial @tab @code{TupletBracket} +@end multitable + + +@node Ajustament de la notació amb superposicions +@subsection Ajustament de la notació amb superposicions +@translationof Fixing overlapping notation + +Vejam ara com poden ser d'ajuda les propietats que hem vist a la +secció anterior, per resoldre problemes de notació que se superposa. + +@menu +* La propietat padding (farciment):: +* La propietat right-padding (farciment per la dreta):: +* La propietat staff-padding (farciment de pentagrama):: +* La propietat self-alignment-X (auto-alineació en X):: +* La propietat staff-position (posició al pentagrama):: +* La propietat extra-offset (desplaçament addicional):: +* La propietat positions (posicions):: +* La propietat force-hshift (forçar desplaçament horitzontal):: +@end menu + +@node La propietat padding (farciment) +@unnumberedsubsubsec La propietat @code{padding} (farciment)) +@translationof The padding property + +@cindex farciment +@cindex ajustar notació que se superposa +@cindex superposada, notació + +La propietat @code{padding} es pot ajustar per augmentar (o +disminuir) la distància entre símbols impresos a sobre o a sota de +les notes + +@cindex Script, exemple de sobreescriptura +@cindex padding, propietat, exemple + +@lilypond[quote,fragment,verbatim] +c'2\fermata +\override Script.padding = #3 +b2\fermata +@end lilypond + +@cindex MetronomeMark, exemple de sobreescriptura +@cindex padding, propietat, exemple + +@lilypond[quote,fragment,verbatim] +% Això no funcionarà, mireu a sota +\override MetronomeMark.padding = #3 +\tempo 4 = 120 +c'1 | +% Això funciona +\override Score.MetronomeMark.padding = #3 +\tempo 4 = 80 +d'1 | +@end lilypond + +Observeu al segon exemple la gran importància que té saber quin +context respecta un determinat objecte. Atès que l'objecte +@code{MetronomeMark} respecta el context @code{Score}, els canvis +de propietats al context @code{Voice} passaran inadvertits. Per +veure més detalls consulteu +@rusernamed{Modifying properties,Modificació de las propietats}. + +Si la propietat de farciment @code{padding} d'un objecte +s'incrementa quan aquest objecte es troba a una pila d'objectes +que s'estan col·locant d'acord a la seva prioritat +@code{outside-staff-priority}, llavors aquest objecte es mourà, i +també tots els que estan per fora d'ell. + +@node La propietat right-padding (farciment per la dreta) +@unnumberedsubsubsec La propietat @code{right-padding} (farciment per la dreta) +@translationof The right-padding property + +@cindex right-padding, propietat + +La propietat @code{right-padding} afecta l'espaiat entre la +alteració i la nota a la qual s'aplica. Normalment no és +necessària, però l'espaiat predeterminat pot estar malament per +certes glifs d'alteracions o combinacions de glifs que s'usen a la +música microtonal. Aquests glifs han d'introduir-se +sobreescrivint el segell de l'alteració amb un element de marcatge +que contingui els símbols desitjats, així: + +@cindex Accidental, exemple de sobreescriptura +@cindex text, propietat, exemple +@cindex stencil, propietat, exemple +@cindex AccidentalPlacement, exemple de sobreescriptura +@cindex right-padding, propietat, exemple + + +@lilypond[quote,ragged-right,verbatim] +sesquisharp = \markup { \sesquisharp } +\relative { + c''4 + % Això imprimeix un sesquisostingut però l'espaiat és massa petit + \once \override Accidental.stencil = #ly:text-interface::print + \once \override Accidental.text = #sesquisharp + cis4 c + % Això millora l'espaiat + \once \override Score.AccidentalPlacement.right-padding = #0.6 + \once \override Accidental.stencil = #ly:text-interface::print + \once \override Accidental.text = #sesquisharp + cis4 | +} +@end lilypond + +@noindent +Aixo utilitza necessàriament una sobreescriptura per al segell de +l'alteració que s'estudiarà fin més endavant. El tipus de segell +ha de ser un procediment, aquí modificat perquè imprimeixi el +contingut de la propietat @code{text} de l'objecte +@code{Accidental}, que al seu cop està establert com un signe de +sesquisostingut. Aleshores el signe es pot separar de la cap de +la nota sobreescrivint @code{right-padding}. + +@noindent + +@node La propietat staff-padding (farciment de pentagrama) +@unnumberedsubsubsec La propietat @code{staff-padding} (farciment de pentagrama) +@translationof The staff-padding property + +@cindex alineació d'objectes sobre la línia base +@cindex objectes, alineació sobre la línia base + +@code{staff-padding} es pot usar per alinear objectes com matisos +dinàmics al llarg d'una línia de base a una distància fixa del +pentagrama, sempre que no existeixi cap altre element de notació +que forci una distància major al pentagrama. No és una propietat +de @code{DynamicText} sinó de @code{DynamicLineSpanner}. +Això és així perquè la línia de base s'ha d'aplicar per igual a +@strong{totes} las dinàmiques, entre elles las que s'han creat +com objectes de extensió. Així que aquesta és la forma d'alinear +les indicacions de matís a l'exemple de la secció anterior: + +@cindex DynamicText, exemple de sobreescriptura +@cindex extra-spacing-width, propietat, exemple +@cindex DynamicLineSpanner, exemple de sobreescriptura +@cindex staff-padding, propietat, exemple + +@lilypond[quote,fragment,ragged-right,verbatim] +\override DynamicLineSpanner.staff-padding = #3 +\relative { a'4\f b\mf a\p b\mp } +@end lilypond + + +@node La propietat self-alignment-X (auto-alineació en X) +@unnumberedsubsubsec La propietat @code{self-alignment-X} (auto-alineació en X) +@translationof The self-alignment-X property + +L'exemple següent mostra com ajustar la posició d'un objecte de +digitació de corda en relació a la plica d'una nota mitjançant +l'alineament del límit dret amb el punt de referència de la nota +«pare»: + +@cindex StringNumber, exemple de sobreescriptura +@cindex self-alignment-X, propietat, exemple + +@lilypond[quote,fragment,ragged-right,verbatim] +\voiceOne + +\once \override StringNumber.self-alignment-X = #RIGHT + +@end lilypond + +@node La propietat staff-position (posició al pentagrama) +@unnumberedsubsubsec La propietat @code{staff-position} (posició al pentagrama) +@translationof The staff-position property + +@cindex objecte, col·lisió dins del pentagrama + +Els silencis multi-compàs en una veu poden xocar amb les notes a +una altra veu. Atès que aquests silencis es graven centrats entre +les barres de compàs, es necessitaria força esforç perquè el +LilyPond esbrinés quines altres notes podrien xocar amb ell, ja +que actualment tota la gestió de col·lisions entre notes i +silencis es fa sols per a notes i silencis que ocorren al mateix +temps. Vet aquí un exemple de col·lisió d'aquest tipus: + +@lilypond[quote,verbatim,ragged-right] +<< \relative { c'4 c c c } \\ { R1 } >> +@end lilypond + +La millor solució aquí és moure el silenci multi-compàs cap avall, +ja que el silencia està a la veu dos. L'ajust predeterminat per a +@code{\voiceTwo} (és a dir, a la segona veu d'una construcció +@code{<<@{@dots{}@} \\ @{@dots{}@}>>}) és que +@code{staff-position} tingui el valor -4 per MultiMeasureRest, +així que l'hem de baixar, diguem-ne, quatre semiespais de +pentagrama, al valor @w{@code{-8}}. + +@cindex MultiMeasureRest, exemple de sobreescriptura +@cindex staff-position, propietat, exemple + +@lilypond[quote,verbatim,ragged-right] +<< + \relative { c'4 c c c } + \\ + \override MultiMeasureRest.staff-position = #-8 + { R1 } +>> +@end lilypond + +Això és millor que utilitzar, per exemple, @code{extra-offset}, +perquè la línia addicional per sobre del silenci s'insereix +automàticament. + +@node La propietat extra-offset (desplaçament addicional) +@unnumberedsubsubsec La propietat @code{extra-offset} (desplaçament addicional) +@translationof The extra-offset property + +@cindex posicionar objectes +@cindex posicionar grobs +@cindex objectes, posicionar +@cindex grobs, posicionar + +La propietat @code{extra-offset} dóna un complet control sobre el +posicionament d'un objecte tan vertical com horitzontalment. + +A l'exemple següent, la segona digitació es desplaça lleugerament +a l'esquerra, i 1.8 espais de pentagrama cap avall: + +@cindex fingering (digitació), exemple de sobreescriptura +@cindex extra-offset, propietat, exemple + +@lilypond[quote,fragment,verbatim] +f'4-5 +\once \override Fingering.extra-offset = #'(-0.3 . -1.8) +f'4-5 +@end lilypond + + +@node La propietat positions (posicions) +@unnumberedsubsubsec La propietat @code{positions} (posicions) +@translationof The positions property + +@cindex controlar manualment grups especials, lligadures i barres +@cindex manual, control, de grups especials, lligadures i barres +@cindex grups especials, barres de, control manual +@cindex lligadures d'expressió, control manual +@cindex lligadures de fraseig, control manual +@cindex barres de corxera, control manual + +La propietat @code{positions} permet controlar manualment la +posició vertical i des d'aquí també la inclinació dels tresets, +lligadures d'expressió i de fraseig, i barres de corxera. + +Vet aquí un exemple en el qual les lligadures de fraseig i +d'expressió xoquen entre sí: + +@lilypond[quote,verbatim,ragged-right] +\relative { a'8 \( ( a'16 ) a \) } +@end lilypond + +@cindex PhrasingSlur, exemple de sobreescriptura +@cindex positions, propietat, exemple + +@noindent +Una possibilitat seria moure els dos extrems de la lligadura de +fraseig cap a dalt. Podem intentar establir l'extrem esquerre a +2.5 espais de pentagrama per sobre de la tercera línia i l'extrem +dret a 4.5 també cap amunt, i el LilyPond seleccionaria la +lligadura de fraseig d'entre les candidates que ha trobat amb els +seus extrems més propers a ells: + +@lilypond[quote,verbatim,fragment,ragged-right] +\once \override PhrasingSlur.positions = #'(2.5 . 4.5) +a'8 \( ( a''16 ) a'' \) +@end lilypond + +Això suposa una millora, però, perquè no baixar una mica l'extrem +dret de la lligadura d'expressió? Si ho provem, veurem que no es +pot fer així. Això és a causa que no existeixen lligadures +d'expressió candidates que estiguin més baixes que la que ja s'ha +seleccionat, i en aquest cas la propietat @code{positions} no té +cap efecte. Malgrat això, les lligadures d'unió, expressió i +fraseig @emph{es poden} col·locar i ajustar de manera molt exacta +quan cal. Per aprendre la manera de fer-lo, consulteu +@rusernamed{Modifying ties and slurs,Modificació de lligadures d'unió i d'expressió}. + +Presentem un altre exemple. Veiem que la barra xoca amb les lligadures: + +@lilypond[quote,verbatim,ragged-right] +{ + \time 4/2 + << + \relative { c'1~ 2. e8 f } + \\ + \relative { + e''8 e e e + e e e e + f2 g + } + >> + << + \relative { c'1~ 2. e8 f } + \\ + \relative { + e''8 e e e + e e e e + f2 g + } + >> +} +@end lilypond + +@noindent +Això es pot resoldre manualment elevant els dos extrems de la +barra des de la seva posició a 1.81 espais de pentagrama sota la +línia central fins, diguem-ne, 1 espai: + + +@cindex Beam, exemple de sobreescriptura +@cindex positions, propietat, exemple + +@lilypond[quote,verbatim,ragged-right] +{ + \time 4/2 + << + \relative { c'1~ 2. e8 f } + \\ + \relative { + \override Beam.positions = #'(-1 . -1) + e''8 e e e + e e e e + f2 g + } + >> + << + \relative { c'1~ 2. e8 f } + \\ + \relative { + e''8 e e e + e e e e + f2 g + \revert Beam.positions + } + >> +} +@end lilypond + +@noindent +Observeu que la sobreescriptura segueix aplicant-se a la segona +veu del segon compàs de corxeres, però no a cap de les barres de +la primera veu, ni tan sols a les que estan al segon compàs, que +és posterior. Tan aviat com la sobreescriptura no pugui tenir cap +efecte, hauria de ser revertida com es mostra. + +@node La propietat force-hshift (forçar desplaçament horitzontal) +@unnumberedsubsubsec La propietat @code{force-hshift} (forçar desplaçament horitzontal) +@translationof The force-hshift property + +Ara podem veure com aplicar les correccions finals a l'exemple de +Chopin que vam present al final de @ref{Sento veus}, que deixem +amb aquest aspecte: + +@lilypond[quote,verbatim,fragment,ragged-right] +\new Staff \relative { + \key aes \major + << + { c''2 aes4. bes8 } + \\ + { 2 des } + \\ + \\ + { aes'2 f4 fes } + >> | + 1 | +} +@end lilypond + +@noindent +És necessari que la nota interior del primer acord (el La bemoll +de la quarta veu) no s'aparti de la columna vertical de la nota +aguda, per la qual cosa usem @code{\shiftOff}. + +En el segon acord preferim que el Fa estigui alineat amb el La +bemoll i que la nota greu es col·loqui lleugerament a la dreta per +evitar una col·lisió de les pliques. Ho aconseguim ajustant el +valor de @code{force-hshift} a la @code{NoteColumn} del Re bemoll +greu per moure'l a la dreta mig espai de pentagrama, i fixant +@code{force-hshift} per al Fa al valor zero. Observeu que usem +@code{\once} per evitar que els ajustament es propaguin més enllà +del moment musical immediat, tot i que a aquest petit exemple es +podria ometre el @code{\once} y el segon @code{\override} de la +quarta veu. Això no suposaria una bona pràctica. + +Presentem a continuació el resultat final: + +@cindex NoteColumn, exemple de sobreescriptura +@cindex force-hshift, propietat, exemple + +@lilypond[quote,verbatim,fragment,ragged-right] +\new Staff \relative { + \key aes \major + << + { c''2 aes4. bes8 } + \\ + { 2 \once \override NoteColumn.force-hshift = 0.5 des } + \\ + \\ + { \once \shiftOff aes'2 \once \shiftOff f4 fes } + >> | + 1 | +} +@end lilypond + + +@node Exemples reals de música +@subsection Exemples reals de música +@translationof Real music example + +Finalitzarem aquesta secció sobre els ajustaments mostrant els +passos que s'han de prendre per tractar amb un exemple complicat +al que li calen diversos ajustaments per produir el resultat +desitjat. L'exemple s'ha escollit deliberadament per il·lustrar +l'ús de la Referència de la Notació per resoldre problemes de +notació poc comuns. No és representatiu del procés de gravat més +usual, per la qual cosa, us recomanem que no deixeu que aquestes +dificultats us desanimin! Afortunadament, les dificultats com +aquestes no són massa comunes! + +L'exemple està extret de la Primera Balada de Chopin, Op. 23, +compassos 6 al 9, la transició entre el Lent inicial i el +Moderato. Presentem en primer lloc l'aspecte que volem que tingui +el resultat, però per evitar complicar massa l'exemple hem tret +les indicacions dinàmiques, les digitacions i el pedal. + +@c The following should appear as music without code +@c This example should not be indexed +@c line-width ensures no break +@lilypond[quote,ragged-right,line-width=6\in] +rhMusic = \relative { + \new Voice { + r2 c''4.\( g8 | + \once \override Tie.staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + \mergeDifferentlyHeadedOn + \mergeDifferentlyDottedOn + bes2.\tempo "Moderato" r8 + << + { c,8 d fis bes a } + \new Voice { + \voiceTwo + c,8~ + % Reposition the c2 to the right of the merged note + \once \override NoteColumn.force-hshift = #1.0 + % Move the c2 out of the main note column + % so the merge will work + \shiftOnn + c2 + } + \new Voice { + \voiceThree + s8 + % Stem on the d2 must be down to permit merging + \stemDown + % Stem on the d2 should be invisible + \tweak Stem.transparent ##t + d2 + } + \new Voice { + \voiceFour + s4 fis4. + } + >> | + \mergeDifferentlyHeadedOff + \mergeDifferentlyDottedOff + g2.\) + } +} + +lhMusic = \relative { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +Observem en primer lloc que la part de la ma dreta del tercer +compàs requereix quatre veus. Són les cinc corxeres unides per +una barra, la nota Do lligada, el Re blanca que es fusiona amb el +Re corxera, i el Fa sostingut negra amb puntet, que també està +fusionada amb la corxera de la seva mateixa alçada. Tota la resta +està en una sola veu, així que el més fàcil és introduir aquestes +tres veus addicionals, en el moment que facin falta i de forma +temporal. Si us heu oblidat de com fer-ho, llegiu les seccions +@ref{Sento veus} i @ref{Veus explícites}. Aquí prenem la decisió +d'utilitzar veus instanciades explícitament per al passatge +polifònic, atès que el LilyPond és més probable que pugui evitar +les col·lisions si totes les veus s'instancien explícitament +d'aquesta manera. + +Començarem introduint les notes com dues variables i disposant +l'estructura de pentagrames a un bloc Score, i veurem què produeix +el LilyPond de forma predeterminada: + +@c line-width ensures no break +@lilypond[quote,verbatim,ragged-right,line-width=6\in] +rhMusic = \relative { + \new Voice { + r2 c''4. g8 | + bes1~ | + \time 6/4 + bes2. r8 + % Inicia la secció polifònica de quatre veus + << + { c,8 d fis bes a } % continuació de la veu principal + \new Voice { + \voiceTwo + c,8~ 2 + } + \new Voice { + \voiceThree + s8 d2 + } + \new Voice { + \voiceFour + s4 fis4. + } + >> | + g2. % continuació de la veu principal + } +} + +lhMusic = \relative { + r2 2 | + 1 | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +Totes les notes són correctes, però l'aspecte està lluny de ser +satisfactori. La lligadura d'unió xoca amb el canvi de compàs, +certes notes no es fusionen correctament, i falten alguns elements +de notació. En primer lloc tractarem amb el més senzill. Podem +afegir fàcilment la lligadura d'expressió de la mà esquerra i la +lligadura de fraseig de la ma dreta, atès que tot això es va +estudiar al Tutorial. En fer-ho així obtenim: + +@c line-width ensures no break +@lilypond[quote,verbatim,ragged-right,line-width=6\in] +rhMusic = \relative { + \new Voice { + r2 c''4.\( g8 | + bes1~ | + \time 6/4 + bes2. r8 + % Inicia la secció polifònica de quatre veus + << + { c,8 d fis bes a } % continuació de la veu principal + \new Voice { + \voiceTwo + c,8~ 2 + } + \new Voice { + \voiceThree + s8 d2 + } + \new Voice { + \voiceFour + s4 fis4. + } + >> | + g2.\) % continuació de la veu principal + } +} + +lhMusic = \relative { + r2 2( | + 1) | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +El primer compàs ara és correcte. El segon compàs conté un +arpegi i acaba amb una barra doble. Com es fan, ja que no han +estat mencionats en aquest Manual d'Aprenentatge? Aquí és on hem +de tornar a la Referència de Notació. Buscant la paraula +@q{arpegi} i @q{línia divisòria} a l'índex ens mostra ràpidament +que un arpegi es fa afegint @code{\arpeggio} a un acord, i la +doble barra es produeix per mitjà de la instrucció +@code{\bar "||"}. Això ho podem fer fàcilment. A continuació hem +de corregir la col·lisió entre la lligadura d'unió i la indicació +de compàs. Això es fa millor movent la lligadura cap amunt. Vam +estudiar com moure objectes anteriorment a @ref{Moviment d'objectes}, +on diu que els objectes estan situats de forma relativa al +pentagrama es poden moure verticalment sobreescrivint la seva +propietat @code{staff-position}, que s'especifica en unitats de +mig espai de pentagrama respecte de la línia central del +pentagrama. Així doncs, la sobreescriptura següent col·locada +just abans de la primera nota lligada pujarà la lligadura 3.5 mig +espais de pentagrama per sobre de la línia central: + +@code{\once \override Tie.staff-position = #3.5} + +Amb això és completa el compàs dos, donant com a resultat: + +@c line-width ensures no break +@lilypond[quote,verbatim,ragged-right,line-width=6\in] +rhMusic = \relative { + \new Voice { + r2 c''4.\( g8 | + \once \override Tie.staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2. r8 + % Inicia la secció polifònica amb quatre veus + << + { c,8 d fis bes a } % continuació de la veu principal + \new Voice { + \voiceTwo + c,8~ 2 + } + \new Voice { + \voiceThree + s8 d2 + } + \new Voice { + \voiceFour + s4 fis4. + } + >> | + g2.\) % continuació de la veu principal + } +} + +lhMusic = \relative { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +Anem ara al tercer compàs i començament de la secció Moderato. El +tutorial ens va ensenyar com escriure una indicació de tempo +mitjançant l'ordre @code{\tempo}, por lo qual cosa afegir +@qq{Moderato} és fàcil. Pero ara, com fusionem notes estan a +diferents veus? Aquí és on hem de tornar a buscar ajuda al manual +de Referència de la notació. En cuscar la paraula @qq{merge} +(fusiona) a l'índex de la Referència de la notació arribem +ràpidament a les ordres per barrejar notes amb diferent cap i amb +o sense puntet, a +@rusernamed{Collision resolution, Resolució de les col·lisions}. +Al nostre exemple hem de fusionar ambdós tipus de notes al +transcurs de la secció polifònica del compàs 3; per tant, gràcies +a la informació que apareix a la Referència de la Notació, escrivim + +@example +\mergeDifferentlyHeadedOn +\mergeDifferentlyDottedOn +@end example + +@noindent +al principi de la secció, i + +@example +\mergeDifferentlyHeadedOff +\mergeDifferentlyDottedOff +@end example + +@noindent +al final, obtenint com a resultat: + +@c line-width ensures no break +@lilypond[quote,ragged-right,line-width=6\in] +rhMusic = \relative { + \new Voice { + r2 c''4.\( g8 | + \once \override Tie.staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2.\tempo "Moderato" r8 + \mergeDifferentlyHeadedOn + \mergeDifferentlyDottedOn + % Inicia la secció polifònica de quatre veus + << + { c,8 d fis bes a } % continuació de la veu principal + \new Voice { + \voiceTwo + c,8~ 2 + } + \new Voice { + \voiceThree + s8 d2 + } + \new Voice { + \voiceFour + s4 fis4. + } + >> | + \mergeDifferentlyHeadedOff + \mergeDifferentlyDottedOff + g2.\) % continuació de la veu principal + } +} + +lhMusic = \relative { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +Aquestes sobreescriptures han fusionat els dos Fa sostingut, però +no els dos Re. Perquè no? La resposta està a la mateixa secció +de la Referència de la Notació: les notes que es fusionen han de +tenir les pliques en direccions oposades i dues notes no es poden +fusionar bé si hi ha una tercera nota a la mateixa columna. Aquí +els dos Re tenen les pliques cap amunt i hi ha una tercera nota: +el Do. Sabem com canviar la direcció de la plica usant +@code{\stemDown}, i la Referència de la notació també explica com +moure el Do: aplicar un desplaçament usant una de les ordres +@code{\shift}. Però, quin? El Do està a la veu dos que té +desactivat el desplaçament, i els dos Re estan a les veus u i +tres, que tenen el desplaçament desactivat i activat, +respectivament. Per això hem de desplaçar el Do un nivell més +encara, usant @code{\shiftOnn} per evitar que interfereixi amb els +dos Re. En aplicar aquests canvis obtenim: + +@cindex Tie, exemple de sobreescriptura +@cindex staff-position, propietat, exemple + +@c line-width ensures no break +@lilypond[quote,verbatim,ragged-right,line-width=6\in] +rhMusic = \relative { + \new Voice { + r2 c''4.\( g8 | + \once \override Tie.staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2.\tempo "Moderato" r8 + \mergeDifferentlyHeadedOn + \mergeDifferentlyDottedOn + % Inicia la secció polifònica de quatre veus + << + { c,8 d fis bes a } % continuació de la veu principal + \new Voice { + \voiceTwo + % Mou el c2 fora de la columna de la nota principal + % perquè la fusió funcioni + c,8~ \shiftOnn c2 + } + \new Voice { + \voiceThree + % La plica al d2 ha de ser cap avall per permetre la fusió + s8 \stemDown d2 + } + \new Voice { + \voiceFour + s4 fis4. + } + >> | + \mergeDifferentlyHeadedOff + \mergeDifferentlyDottedOff + g2.\) % continuació de la veu principal + } +} + +lhMusic = \relative { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + +Ja gairebé està. Sols queden dos problemes: la plica cap avall +sobre el Re fusionat no hauria d'estar aquí, i el Do estaria +millor col·locat a la dreta dels Re. Sabem com fer les dues coses +a partir d'ajustaments anteriors: fem la plica transparent, i +movem el Do amb la propietat @code{force-hshift}. Aquí tenim el +resultat final: + +@cindex NoteColumn, exemple de sobreescriptura +@cindex force-hshift, propietat, exemple +@cindex Stem, exemple de sobreescriptura +@cindex transparent, propietat, exemple + +@c line-width ensures no break +@lilypond[quote,verbatim,ragged-right,line-width=6\in] +rhMusic = \relative { + \new Voice { + r2 c''4.\( g8 | + \once \override Tie.staff-position = #3.5 + bes1~ | + \bar "||" + \time 6/4 + bes2.\tempo "Moderato" r8 + \mergeDifferentlyHeadedOn + \mergeDifferentlyDottedOn + % Inicia la secció polifònica de quatre veus + << + { c,8 d fis bes a } % continuació de la veu principal + \new Voice { + \voiceTwo + c,8~ + % Torna a posicionar el C2 a la dreta de la nota fucionada + \once \override NoteColumn.force-hshift = #1.0 + % Mou el c2 for de la columna de la nota principal + % perquè funcioni la fusió + \shiftOnn + c2 + } + \new Voice { + \voiceThree + s8 + % La plica sobre la d2 ha de ser cap avall per permetre la fusió + \stemDown + % La plica sobre la d2 ha de ser invisible + \tweak Stem.transparent ##t + d2 + } + \new Voice { + \voiceFour + s4 fis4. + } + >> | + \mergeDifferentlyHeadedOff + \mergeDifferentlyDottedOff + g2.\) % continuació de la veu principal + } +} + +lhMusic = \relative { + r2 2( | + 1)\arpeggio | + r2. d,,4 r4 r | + r4 +} + +\score { + \new PianoStaff << + \new Staff = "RH" << + \key g \minor + \rhMusic + >> + \new Staff = "LH" << + \key g \minor + \clef "bass" + \lhMusic + >> + >> +} +@end lilypond + + +@node Ajustaments addicionals +@section Ajustaments addicionals +@translationof Further tweaking + +@menu +* Altres aplicacions dels ajustaments:: +* Ús de variables per als ajustaments de disposició:: +* Fulls d'estil:: +* Altres fonts d'informació:: +* Ajustaments avançats amb l'Scheme:: +@end menu + +@node Altres aplicacions dels ajustaments +@subsection Altres aplicacions dels ajustaments +@translationof Other uses for tweaks + +@menu +* Unió de notes entre veus diferents:: +* Simulació de un calderó al MIDI:: +@end menu + +@cindex eliminar objectes +@cindex objectes, eliminar + +@node Unió de notes entre veus diferents +@unnumberedsubsubsec Unió de notes entre veus diferents +@translationof Tying notes across voices + +@cindex lligar notes entre veus diferents + +El següent exemple mostra com connectar notes que estan a +diferents veus utilitzant lligadures d'unió. Normalment sols es +poden connectar mitjançant lligadures d'unió notes que estiguin a +la mateixa veu. Usant dues veus, amb les notes lligades a una +d'elles: + +@lilypond[quote] +<< { b'8~ 8\noBeam } \\ { b'8[ g'] } >> +@end lilypond + +@noindent +i esborrant la primera plica (amb el seu claudàtor) cap amunt a +aquesta veu, dóna la impressió que la lligadura es creua entres +les veus: + +@funindex \omit +@cindex Stem, exemple de remoció +@cindex Flag, exemple de remoció +@cindex @code{\omit}, exemple +@cindex exemple de @code{\omit} + +@lilypond[quote,verbatim] +<< + { + \once \omit Stem + \once \omit Flag + b'8~ 8\noBeam + } +\\ + { b'8[ g'] } +>> +@end lilypond + +@seealso +Manual de aprenentatge: +@ref{El prefix once,,El prefix @code{@bs{}once}}, +@ref{La propietat stencil (segell)}. + + +@node Simulació de un calderó al MIDI +@unnumberedsubsubsec Simulació de un calderó al MIDI +@translationof Simulating a fermata in MIDI + +@cindex segell, ús de la propietat +@cindex fermata, realització a MIDI + +Per als objectes fora-del-pentagrama, normalment és millor +sobreescriure la propietat @code{stencil} («segell») de l'objecte +que la seva propietat @code{transparent} quan vulgueu treure'ls de +la sortida impresa. Mitjançant l'establiment de la propietat +@code{stencil} d'un objecte al valor @code{#f} podem treure +l'objecte per complet de la sortida impresa. Això significa que +no té efecte sobre la col·locació d'altres objectes que poguessin +col·locar-se en relació a ell. + +Per exemple, si volguéssim canviar la indicació metronòmica amb el +propòsit de simular un calderó a la sortida MIDI, segurament no +voldríem que la indicació metronòmica aparegués a la sortida +impresa, i no voldríem influir sobre la separació entre els dos +sistemes ni sobre la col·locació de les anotacions adjacents sobre +el pentagrama. Per tant, establir la seva propietat +@code{stencil} al valor @code{#f} seria la millor manera. Mostrem +aquí l'efecte dels dos mètodes: + +@cindex MetronomeMark, exemple de sobreescriptura +@cindex transparent, propietat, exemple + +@lilypond[quote,verbatim,ragged-right] +\score { + \relative { + % Visible tempo marking + \tempo 4=120 + a'4 a a + \once \hide Score.MetronomeMark + % Tempo invisible que marca que s'allargui el fermata al MIDI + \tempo 4=80 + a4\fermata | + % Tempo nou per a la propera secció + \tempo 4=100 + a4 a a a | + } + \layout { } + \midi { } +} +@end lilypond + +@cindex MetronomeMark, exemple de sobreescriptura +@cindex stencil, propietat, exemple + +@lilypond[quote,verbatim,ragged-right] +\score { + \relative { + % Marcatge Visible del tempo + \tempo 4=120 + a'4 a a + \once \omit Score.MetronomeMark + % Marcatge invisible del tempo per allargar el fermata al MIDI + \tempo 4=80 + a4\fermata | + % Tempo nou per a la propera secció + \tempo 4=100 + a4 a a a | + } + \layout { } + \midi { } +} +@end lilypond + +@noindent +Els dos mètodes treuen de la sortida impresa la indicació +metronòmica que allarga el calderó, i els dos afecten al temps del +MIDI tal i com volíem, però la indicació metronòmica transparent +de la primera línia força una col·locació molt alta de la +indicació de tempo que segueix, mentre que la segona (amb el +segell suprimit) no ho fa. + +@seealso +Glossari musical: +@rglos{system}. + +@node Ús de variables per als ajustaments de disposició +@subsection Ús de variables per als ajustaments de disposició +@translationof Using variables for layout adjustments + +@cindex variables, usar per a sobreescriptures +@cindex sobreescriptures, usar variables per a +@cindex ajustaments, usar variables per a +@cindex ajustaments de disposició, usar variables per fer + +Les ordres de sobreescriptura són sovint llargues i tedioses +d'escriure, i s'han d'escriure de forma absolutament correcta. Si +les mateixes sobreescriptures s'han d'utilitzar molts cops, podria +valdre la pena definir variables per desar-les. + +Suposem que volem realçar certes paraules de la lletra d'una cançó +imprimint-les en cursiva i negreta. Les ordres @code{\italic} i +@code{\bold} sols funcionen dins de la lletra de la cançó si estan +incloses, junt amb la paraula o paraules que es pretenen +modificar, dins d'un @code{\markup}, cosa que les fa tedioses +d'escriure. La necessitat d'incloure les pròpies paraules +impedeix que es puguin usar a variables simples. Podríem, com a +alternativa, utilitzar les ordres @code{\override} y +@code{\revert}? + +@example +@code{\override Lyrics.LyricText.font-shape = #'italic} +@code{\override Lyrics.LyricText.font-series = #'bold} + +@code{\revert Lyrics.LyricText.font-shape} +@code{\revert Lyrics.LyricText.font-series} +@end example + +Aquestes ordres també serien extremadament tedioses d'escriure si +hi haguessin moltes paraules que volguéssim subratllar. Peró sí +@emph{podem} definir-les com dues variables i usar-les per +delimitar les paraules a destacar. Un altre avantatge de la +utilització de variables per a aquestes sobreescriptures és que ja +no són necessaris els espais que rodegen el punt, atès que no +s'interpreten directament al mode @code{\lyricmode}. Vet aquí un +exemple d'això, tot i que a la pràctica potser escolliríem uns +noms de variables més curts perquè fossin més ràpids de teclejar: + +@cindex LyricText, exemple de sobreescriptura +@cindex font-shape, propietat, exemple +@cindex font-series, propietat, exemple + +@lilypond[quote,verbatim] +emphasize = { + \override Lyrics.LyricText.font-shape = #'italic + \override Lyrics.LyricText.font-series = #'bold +} + +normal = { + \revert Lyrics.LyricText.font-shape + \revert Lyrics.LyricText.font-series +} + +global = { \key c \major \time 4/4 \partial 4 } + +SopranoMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } + +VerseOne = \lyrics { + E -- | ter -- nal \emphasize Fa -- ther, | \normal strong to save, +} + +VerseTwo = \lyricmode { + O | \once \emphasize Christ, whose voice the | wa -- ters heard, +} + +VerseThree = \lyricmode { + O | \emphasize Ho -- ly Spi -- rit, | \normal who didst brood +} + +VerseFour = \lyricmode { + O | \emphasize Tri -- ni -- ty \normal of | love and pow'r +} + +\score { + \new ChoirStaff << + \new Staff << + \clef "treble" + \new Voice = "Soprano" { \voiceOne \global \SopranoMusic } + \new Voice = "Alto" { \voiceTwo \AltoMusic } + \new Lyrics \lyricsto "Soprano" { \VerseOne } + \new Lyrics \lyricsto "Soprano" { \VerseTwo } + \new Lyrics \lyricsto "Soprano" { \VerseThree } + \new Lyrics \lyricsto "Soprano" { \VerseFour } + >> + \new Staff << + \clef "bass" + \new Voice = "Tenor" { \voiceOne \TenorMusic } + \new Voice = "Baix" { \voiceTwo \BassMusic } + >> + >> +} +@end lilypond + + +@node Fulls d'estil +@subsection Fulls d'estil +@translationof Style sheets + +La sortida que produeix el LilyPond es pot modificar profundament; +consulteu @ref{Ajustament de la sortida} per llegir detalls sobre +aquest tema. Però, que passa si teniu molts fitxers als quals +voleu aplicar els vostres propis ajustaments? O què passa si, +senzillament, voleu separar els ajustaments de la pròpia música? +Tot això és força fàcil d'aconseguir. + +Vejam un exemple. No us preocupeu si no enteneu les parts que +tenen tots els @code{#()}. Això s'explicarà a +@ref{Ajustaments avançats amb l'Scheme}. + +@lilypond[quote,verbatim,ragged-right] +mpdolce = + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #}) + +inst = +#(define-music-function + (string) + (string?) + #{ <>^\markup \bold \box #string #}) + +\relative { + \tempo 4=50 + a'4.\mpdolce d8 cis4--\glissando a | + b4 bes a2 | + \inst "Clarinet" + cis4.\< d8 e4 fis | + g8(\! fis)-. e( d)-. cis2 | +} +@end lilypond + +Fem alguna cosa respecte a les definicions @code{mpdolce} i +@code{inst}. Aquestes definicions produeixen la sortida que +volem, però potser les voldríem utilitzar a una altra peça. +Podríem simplement copiar-les i enganxar-les al principi de cada +fitxer, però seria força molest. També fa que es quedin les +definicions a la vista dins dels nostres fitxers de música, i jo +personalment trobo tots els @code{#()} molt pocs estètics. Els +amagarem dins d'un altre fitxer: + +@example +%%% desar això a un fitxer amb el nom «definicions.ily» +mpdolce = + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #@{ \markup @{ \dynamic mp \normal-text \italic \bold dolce @} #@}) + +inst = +#(define-music-function + (string) + (string?) + #@{ <>^\markup \bold \box #string #@}) +@end example + +Farem referència a aquest fitxer utilitzant l'ordre +@code{\include} al principi del fitxer de música (l'extensió +@code{.ily} s'utilitza per distingir aquest fitxer d'inclusió +--que se suposa que no ha de ser processat de forma independent-- +del fitxer principal). Ara modificarem la música (desem aquest +fitxer com @file{musica.ly}). + +@c We have to do this awkward example/lilypond-non-verbatim +@c because we can't do the \include stuff in the manual. + +@example +\include "definicions.ily" + +\relative @{ + \tempo 4=50 + a'4.\mpdolce d8 cis4--\glissando a | + b4 bes a2 | + \inst "Clarinete" + cis4.\< d8 e4 fis | + g8(\! fis)-. e( d)-. cis2 | +@} +@end example + +@lilypond[quote,ragged-right] +mpdolce = + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #}) + +inst = +#(define-music-function + (string) + (string?) + #{ <>^\markup \bold \box #string #}) + +\relative { + \tempo 4=50 + a'4.\mpdolce d8 cis4--\glissando a | + b4 bes a2 | + \inst "Clarinet" + cis4.\< d8 e4 fis | + g8(\! fis)-. e( d)-. cis2 | +} +@end lilypond + +Això té millor aspecte, però farem alguns canvis més. El +glissando és difícil de veure, així que el farem més gruixut i +l'aproparem als caps de les notes. Posarem la indicació +metronòmica a sobre de la clau, en lloc d'anar a sobre de la +primera nota. I per últim, el meu professor de composició odia +les indicacions de compàs @q{C}, així que la convertirem en @q{4/4}. + +Malgrat això, no hem de canviar el fitxer @file{musica.ly}. Anem +a substituir el nostre fitxer @file{definicions.ily} amb el següent: + +@example +%%% definicions.ily +mpdolce = + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #@{ \markup @{ \dynamic mp \normal-text \italic \bold dolce @} #@}) + +inst = +#(define-music-function + (string) + (string?) + #@{ <>^\markup \bold \box #string #@}) + +\layout@{ + \context @{ + \Score + \override MetronomeMark.extra-offset = #'(-5 . 0) + \override MetronomeMark.padding = #'3 + @} + \context @{ + \Staff + \override TimeSignature.style = #'numbered + @} + \context @{ + \Voice + \override Glissando.thickness = #3 + \override Glissando.gap = #0.1 + @} +@} +@end example + +@lilypond[quote,ragged-right] +mpdolce = + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #}) + +inst = +#(define-music-function + (string) + (string?) + #{ <>^\markup \bold \box #string #}) + +\layout{ + \context { + \Score + \override MetronomeMark.extra-offset = #'(-5 . 0) + \override MetronomeMark.padding = #'3 + } + \context { + \Staff + \override TimeSignature.style = #'numbered + } + \context { + \Voice + \override Glissando.thickness = #3 + \override Glissando.gap = #0.1 + } +} + +\relative { + \tempo 4=50 + a'4.\mpdolce d8 cis4--\glissando a | + b4 bes a2 | + \inst "Clarinet" + cis4.\< d8 e4 fis | + g8(\! fis)-. e( d)-. cis2 | +} +@end lilypond + +Això té un aspecte molt millor! Ara suposeu que voleu publicar +aquesta peça. Al meu professor de composició no li agraden les +indicacions de compàs, però jo els tinc un cert apreci. Copiarem +el fitxer actual + +¡Eso tiene un aspecto mucho mejor! Ahora suponga que quiere +publicar esta pieza. A mi profesor de composición no le gustan +las indicaciones de compás @q{C}, pero yo les tengo cierto cariño. +Copiaremos el archivo actual @file{definicions.ily} a +@file{publicar-web.ily} i modificarem aquest últim fitxer. Com el +propòsit d'aquesta música és produir un PDF que es mostrarà a la +pantalla, també augmentarem la mida general de la sortida. + +@example +%%% publicar-web.ily +mpdolce = + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #@{ \markup @{ \dynamic mp \normal-text \italic \bold dolce @} #@}) + +inst = +#(define-music-function + (string) + (string?) + #@{ <>^\markup \bold \box #string #@}) + +#(set-global-staff-size 23) + +\layout@{ + \context @{ + \Score + \override MetronomeMark.extra-offset = #'(-5 . 0) + \override MetronomeMark.padding = #'3 + @} + \context @{ + \Staff + @} + \context @{ + \Voice + \override Glissando.thickness = #3 + \override Glissando.gap = #0.1 + @} +@} +@end example + +@lilypond[quote,ragged-right] +mpdolce = + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #}) + +inst = +#(define-music-function + (string) + (string?) + #{ <>^\markup \bold \box #string #}) + +#(set-global-staff-size 23) + +\layout{ + \context { \Score + \override MetronomeMark.extra-offset = #'(-5 . 0) + \override MetronomeMark.padding = #'3 + } + \context { \Voice + \override Glissando.thickness = #3 + \override Glissando.gap = #0.1 + } +} + +\relative { + \tempo 4=50 + a'4.\mpdolce d8 cis4--\glissando a | + b4 bes a2 | + \inst "Clarinet" + cis4.\< d8 e4 fis | + g8(\! fis)-. e( d)-. cis2 | +} +@end lilypond + +Ara, a la música, simplement substitueixo +@code{\include "definicions.ily"} per @code{\include "publicar-web.ily"}. Per +suposat, podríem fer això encara més pràctic. Podríem fer un +fitxer @file{definiciones.ily} que contingués sols les definicions de +@code{mpdolce} i de @code{inst}, un fitxer +@file{publicar-web.ily} que contingués sols la secció +@code{\layout} que es va mostrar a l'exemple, i un fitxer +@file{universitat.ily} que contindria sols els ajustament per +introduir la sortida que agrada al meu professor. El començament de +@file{musica.ly} tindria ara aquest aspecte: + +@example +\include "definiciones.ily" + +%%% Treure el comentari d'una sola d'aquestes línies! +\include "publicar-web.ily" +%\include "universitat.ily" +@end example + +Aquest enfocament pot ser útil fins i tot si aneu a produir sols +un conjunt de particel·les. Jo utilitzo mitja dotzena de fitxers +de @q{fulls d'estil} per als meus projectes. Començo tots els +fitxers de música amb un @code{\include "../global.ily"}, que conté + +@example +%%% global.ily +\version @w{"@version{}"} + +#(ly:set-option 'point-and-click #f) + +\include "../iniciar/iniciar-definicions.ily" +\include "../iniciar/iniciar-disposicio.ily" +\include "../iniciar/iniciar-capçaleres.ily" +\include "../iniciar/iniciar-paper.ily" +@end example + + +@node Altres fonts d'informació +@subsection Altres fonts d'informació +@translationof Other sources of information + +La documentació del manual de Referència de Funcionament Intern +conté muntanyes d'informació sobre el Lilypond, però es pot +obtenir més informació encara llegint els fitxers interns del +LilyPond. Per donar-los una ullada, en primer lloc heu de buscar +la carpeta corresponent al seu sistema. La ubicació d'aquesta +carpeta depèn (a) de si heu aconseguit el programa LilyPond +descarregant un binari precompilat des del lloc web lilypond.org o +i l'heu instal·lat mitjançant un gestor de paquets (és a dir, +distribuït per GNU/Linux, o instal·lat sota fink o cygwin) o si va +ser compilat a partir de la font, i (b) de quin sistema operatiu +esteu utilitzant: + +@subsubsubheading Descàrrega des de lilypond.org + +@itemize @bullet +@item GNU/Linux + +Dirigiu-vos a +@example +@file{@var{CARPETA_DE_INSTAL·LACIÓ}/lilypond/usr/@/share/lilypond/current/} +@end example + +@item MacOS X + +Diríjase a +@example +@file{@var{CARPETA_DE_INSTAL·LACIÓ}/LilyPond.app/Contents/@/Resources/share/lilypond/current/} +@end example + +o bé fent @code{cd} cap a aquest directori des del terminal, o bé +mantenint polsada la tecla de Control i fent clic sobre +l'aplicació del LilyPond, i escollint aquí +@q{Mostrar el contingut del paquet}. + +@item Windows + +Mitjançant el Explorador del Windows, dirigiu-vos a +@example +@file{@var{CARPETA_DE_INSTAL·LACIÓ}/LilyPond/usr/@/share/lilypond/current/} +@end example + +@end itemize + +@subsubsubheading Instal·lant mitjançant un gestor de paquets o +compilat a partir de la font + +Dirigiu-vos a @file{@var{PREFIX}/share/lilypond/@var{X.Y.Z}/}, on +@var{PREFIX} s'ha establert pel vostre administrador de paquets o +guió @code{configure}, i @var{X.Y.Z} es el número de la versió del +Lilypond. + +@smallspace + +Dins d'aquesta carpeta, les dues subcarpetes interessats són + +@itemize +@item @file{ly/} - conté fitxers en format LilyPond +@item @file{scm/} - conté fitxers en format Scheme +@end itemize + +Començarem observant alguns fitxers que estan a +@file{ly/}. Obriu @file{ly/property-init.ly} amb un editor de +textos. El mateix que usaria normalment per al fitxers +@file{.ly} servirà perfectament. Aquest fitxer conté les +definicions de totes les instruccions estàndard predefinides del +LilyPond, com per exemple @code{\tieUp} i @code{\slurDotted}. +Podreu veure que no són res més que definicions de variables que +contenen una o diverses ordres @code{\override}. Per exemple, +@code{\tieDotted} està definit de tal forma que el valor és: + +@example +tieDotted = @{ + \override Tie.dash-period = #0.75 + \override Tie.dash-fraction = #0.1 +@} +@end example + +Si no us agraden els valors predeterminats, aquestes ordres +predefinides es poden redefinir amb facilitat com qualsevol altra +variable, al principi del seu fitxer de codi d'entrada. + +Els següents són els fitxers més útils que es troben a +@file{ly/}: + +@multitable @columnfractions .4 .6 +@headitem Fitxer + @tab Contingut +@item @file{ly/engraver-init.ly} + @tab Definicions de Contextos de gravadors +@item @file{ly/paper-defaults-init.ly} + @tab especificacions de valors predeterminats relacionats amb el document +@item @file{ly/performer-init.ly} + @tab Definicions de Contextos de interpretació +@item @file{ly/property-init.ly} + @tab Definicions de totes las instruccions predefinides que són comunes +@item @file{ly/spanner-init.ly} + @tab Definicions de les ordres predefinides relacionades amb els objectes d'extensió +@end multitable + +Altres ajustos (com les definicions de les ordres de marcatge) +s'emmagatzemen com fitxers @file{.scm} (de l'Scheme). El +llenguatge de programació Scheme es fa servir per proporcoinar una +interfície programable en el funcionament intern del LilyPond. +Qualsevol explicació addicional sobre aquests fitxers es troba de +moment fora de l'àmbit d'aquest manual, perquè es requereixen +coneixements del llenguatge Scheme. S'adverteix als usuaris que +cal una important quantitat de coneixements tècnics o de temps per +comprendre el llenguatge Scheme i aquests fitxers +(vegeu @rextendnamed{Scheme tutorial,Tutorial de l'Scheme}). + +Si ja teniu aquests coneixements, els fitxers de l'Scheme que +poden interessar-vos són: + +@multitable @columnfractions .4 .6 +@headitem Fitxer + @tab Contingut +@item @file{scm/auto-beam.scm} + @tab Valors predeterminats de sub-barrat +@item @file{scm/define-grobs.scm} + @tab valors predeterminats de les propietats de grobs +@item @file{scm/define-markup-commands.scm} + @tab Especificar totes les ordres de marcatge +@item @file{scm/midi.scm} + @tab Ajustaments predeterminats per a la sortida MIDI +@item @file{scm/output-lib.scm} + @tab Ajustaments que afecten l'aspecte dels trastos, colors, alteracions, línies divisòries, etc. +@item @file{scm/parser-clef.scm} + @tab Definicions de les claus contemplades +@item @file{scm/script.scm} + @tab Ajustaments predeterminats per a les articulacions +@end multitable + + +@node Ajustaments avançats amb l'Scheme +@subsection Ajustaments avançats amb l'Scheme +@translationof Advanced tweaks with Scheme + +Tot i que és possible fer moltes coses amb les ordres +@code{\override} i @code{\tweak} , tenim una forma encara més +poderosa de modificar el funcionament del LilyPond, mitjançant una +interfície programable cap a les operacions internes del +LilyPond. Es pot incorporar codi escrit en el llenguatge de +programació Scheme, directament en el mecanisme de funcionament +del LilyPond. Per descomptat, per fer això calen almenys uns +coneixements bàsics de programació de l'Scheme, i proveïm una +introducció al @rextendnamed{Scheme tutorial,Tutorial de l'Scheme}. + +Com exemple que il·lustra una de les moltes possibilitats, en lloc +de donar a una propietat un valor constant, es pot establir al +resultat d'una procediment de l'Scheme que s'invoca cada cop que +el LilyPond accedeix a aquesta propietat. La propietat es pot +establir dinàmicament a un valor determinat pel procediment al +moment que s'invoca. En aquest exemple donem als caps de les +notes un color que depèn de la seva posició dins del pentagrama. + +@cindex x11-color, funció, exemple de utilització +@cindex NoteHead, exemple de sobreescriptura +@cindex color, propietat, establir a procediment de l'Scheme + +@lilypond[quote,verbatim,ragged-right] +#(define (color-notehead grob) + "Pinta el cap de la nota d'acord amb la seva posició a la partitura." + (let ((mod-position (modulo (ly:grob-property grob 'staff-position) + 7))) + (case mod-position + ;; Retorna els colors de l'arc de Sant Martí + ((1) (x11-color 'red )) ; for C + ((2) (x11-color 'orange )) ; for D + ((3) (x11-color 'yellow )) ; for E + ((4) (x11-color 'green )) ; for F + ((5) (x11-color 'blue )) ; for G + ((6) (x11-color 'purple )) ; for A + ((0) (x11-color 'violet )) ; for B + ))) + +\relative { + % Disposa per obtenir el color del procediment color-notehead + \override NoteHead.color = #color-notehead + a2 b | c2 d | e2 f | g2 a | +} +@end lilypond + +Es poden trobar exemples addicionals que mostren la utilització +d'aquestes interfícies programables, a +@rextendnamed{Callback functions,Funcions de callback}. diff --git a/Documentation/ca/macros.itexi b/Documentation/ca/macros.itexi new file mode 100644 index 0000000000..6e14cb3b0b --- /dev/null +++ b/Documentation/ca/macros.itexi @@ -0,0 +1,823 @@ +@c -*- coding: utf-8; mode: texinfo; -*- +@ignore + Translation of GIT committish: 0dab09bcbd2046e1dc38fb264ae8f7d2097d3d71 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@documentencoding UTF-8 + +@include version.itexi +@include common-macros.itexi + +@ignore +**************************** +MACRO DEFINITIONS GUIDELINES +**************************** + +This file should contain macro definitions which are common to all +languages, i.e. all macro definitions which do not contain text that +should be translated (namely text visible in the output). + +Macro definitions which contain text that should be translated in +translations should be in macros.itexi. +@end ignore + +@c ***** Displaying text ***** + +@c To get decent quotes in `foo' and ``foo''. + +@macro q{TEXT} +@quoteleft{}\TEXT\@quoteright{} +@end macro + +@macro qq{TEXT} +@quotedblleft{}\TEXT\@quotedblright{} +@end macro + + +@ifhtml + +@macro warning{TEXT} +@html +
+@end html +@strong{Nota:} \TEXT\ +@c keep the space for proper nesting of

+ +@html +
+@end html +@end macro + +@end ifhtml + +@ifnothtml + +@macro warning{TEXT} +@quotation +@quotation +@cartouche +@b{Nota:} \TEXT\ +@end cartouche +@end quotation +@end quotation +@end macro + +@end ifnothtml + +@c do not translate the following macro -- it is used in +@c an untranslated manual. + +@ifhtml + +@macro advanced{TEXT} +@html +
+@end html +@strong{Advanced note:} \TEXT\ +@c keep the space for proper nesting of

+ +@html +
+@end html +@end macro + +@end ifhtml + +@ifnothtml + +@macro advanced{TEXT} +@quotation +@b{Advanced note:} \TEXT\ +@end quotation +@end macro + +@end ifnothtml + + +@macro docMain +@cartouche +Per a més informació sobre la forma en la qual aquest manual es +relaciona amb la resta de la documentació, o per llegir aquest +manual en altres formats, consulteu @rweb{Manuals}. + +Si us falta algun manual, trobareu tota la documentació a +@w{@uref{http://@/www@/.lilypond@/.org/}}. +@end cartouche +@end macro + + +@macro lilyTitlePage{TITLE} +@c This produces the unified index +@syncodeindex fn cp +@syncodeindex vr cp + + +@c ***** Copyright stuff ***** +@ifset FDL +@copying +@copyrightDeclare + +@emph{La traducció de la següent nota de copyright s'ofereix com a +cortesia per a les persones de parla no anglesa, però únicament la +nota en anglès té validesa legal.} + +@emph{The translation of the following copyright notice is provided +for courtesy to non-English speakers, but only the notice in English +legally counts.} + +@quotation +S'atorga permís per copiar, distribuir i/o modificar aquest +document sota els termes de la Llicència de Documentació Lliure de +GNU, versió 1.1 o qualsevol posterior publicada per la Free +Software Foundation; sense cap de les seccions invariants. +S'inclou una còpia d'aquesta llicència dins de la secció titulada +``Llicència de Documentació Lliure de GNU''. +@end quotation + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.1 +or any later version published by the Free Software Foundation; +with no Invariant Sections. +A copy of the license is included in the section entitled ``GNU +Free Documentation License''. +@end quotation +@end copying +@end ifset + +@ifclear FDL +@copying +Aquest document s'ha posat sota el domini públic. +@end copying +@end ifclear + + + +@c ***** Title page ***** +@ifnottex +@node Top +@top LilyPond --- \TITLE\ + +@cartouche +@manualIntro{} +@end cartouche +@end ifnottex + +@finalout + +@titlepage +@title LilyPond +@subtitle El gravador de música +@titlefont{\TITLE\} +@author L'equip de desenvolupadors del LilyPond + +@vskip 60pt + +@cartouche +@manualIntro{} +@end cartouche + +@vskip 40pt + +@docMain{} + +@vskip 0pt plus 1filll + +@insertcopying + +Per a la versió del LilyPond @version{} +@end titlepage + +@end macro + + +@c ***** Headings in a doc subsection ***** + +@c The next macro is a dummy currently since texinfo doesn't +@c provide a real ragged-right environment yet. +@c +@c Don't insert an empty line after @predefined! Right now +@c it doesn't matter, but a future implementation will probably +@c add some code which needs this restriction. + +@macro predefined +@noindent +@subsubheading Instruccions predefinides +@end macro + +@c Due to a bug in texi2html (texi2html.pl CVS versions <= 1.245) +@c the next macro must not be empty. + +@macro endpredefined +@c +@end macro + + +@macro snippets +@noindent +@subsubheading Fragments de codi seleccionats +@end macro + + +@c Don't insert an empty line after @seealso! Otherwise we get +@c unwanted extra vertical space in the PDF output. + +@macro seealso +@noindent +@subsubheading Vegeu també +@indent +@end macro + + +@macro knownissues +@noindent +@subsubheading Advertiments i problemes coneguts +@end macro + + +@c ***** Links and references ***** + +@c Definitions for references: +@c +@c @rweb +@c @ressay +@c @rglos +@c @rinternals +@c @rlearning +@c @rlsr +@c @rprogram +@c @ruser +@c @rchanges +@c @rextend +@c @rcontrib +@c +@c All these also have a @...named version which allows to specify the +@c displayed text for the reference as second argument. +@c +@c ***** HTML + bigpage is a special case (other manual names); all other +@c formats are treated similarly. + + +@c *** not TeX *** + +@ifnottex + +@c ** bigpage ** + +@ifset bigpage + +@macro rglos{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,music-glossary-big-page,Glossari musical} +@end macro + +@macro rglosnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,music-glossary-big-page,Glossari musical} +@end macro + +@macro rlearning{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,learning-big-page,Manual d'aprenentatge} +@end macro + +@macro rlearningnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,learning-big-page,Manual d'aprenentatge} +@end macro + +@macro ruser{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,notation-big-page,Referència de la notació} +@end macro + +@macro rusernamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,notation-big-page,Referència de la notació} +@end macro + +@macro rextend{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,extending-big-page,Extensions} +@end macro + +@macro rextendnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,extending-big-page,Extensions} +@end macro + +@macro rchanges{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,changes-big-page,Canvis} +@end macro + +@macro rchangesnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,changes-big-page,Canvis} +@end macro + +@macro rcontrib{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,contributor-big-page,Guia del col·laborador} +@end macro + +@macro rcontribnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,contributor-big-page,Guia del col·laborador} +@end macro + +@macro rweb{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,web-big-page,Informació general} +@end macro + +@macro rwebnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,web-big-page,Informació general} +@end macro + +@macro ressay{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,essay-big-page,Monografia} +@end macro + +@macro ressaynamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,essay-big-page,Monografia} +@end macro + +@macro rprogram{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,usage-big-page,Utilització del programa} +@end macro + +@macro rprogramnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,usage-big-page,Utilització del programa} +@end macro + +@macro rlsr{TEXT} +@ref{\TEXT\,,,snippets-big-page,Fragments de codi} +@end macro + +@macro rlsrnamed{TEXT,DISPLAY} +@ref{\TEXT\,,\DISPLAY\,snippets-big-page,Fragments de codi} +@end macro + +@macro rinternals{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,internals-big-page,Referència de funcionament intern} +@end macro + +@macro rinternalsnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,internals-big-page,Referència de funcionament intern} +@end macro + +@end ifset + + +@c ** not bigpage ** + +@ifclear bigpage + +@ifnotinfo + +@macro rglos{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,music-glossary,Glossari musical} +@end macro + +@macro rglosnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,music-glossary,Glossari musical} +@end macro + +@macro rlearning{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,learning,Manual d'aprenentatge} +@end macro + +@macro rlearningnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,learning,Manual d'aprenentatge} +@end macro + +@macro ruser{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,notation,Referència de la notació} +@end macro + +@macro rusernamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,notation,Referència de la notació} +@end macro + +@macro rchanges{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,changes,Canvis} +@end macro + +@macro rchangesnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,changes,Canvis} +@end macro + +@macro rextend{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,extending,Extensions} +@end macro + +@macro rextendnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,extending,Extensions} +@end macro + +@macro rcontrib{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,contributor,Guia del col·laborador} +@end macro + +@macro rcontribnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,contributor,Guia del col·laborador} +@end macro + +@macro rweb{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,web,Informació general} +@end macro + +@macro rwebnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,web,Informació general} +@end macro + +@macro ressay{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,essay,Monografia} +@end macro + +@macro ressaynamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,essay,Monografia} +@end macro + +@macro rprogram{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,usage,Utilització del programa} +@end macro + +@macro rprogramnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,usage,Utilització del programa} +@end macro + +@macro rlsr{TEXT} +@ref{\TEXT\,,,snippets,Fragments de codi} +@end macro + +@macro rlsrnamed{TEXT,DISPLAY} +@ref{\TEXT\,,\DISPLAY\,snippets,Fragments de codi} +@end macro + +@macro rinternals{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,internals,Referència de funcionament intern} +@end macro + +@macro rinternalsnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,internals,Referència de funcionament intern} +@end macro + +@end ifnotinfo + +@ifinfo + +@macro rglos{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,music-glossary,Glossari musical} +@end macro + +@macro rglosnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,music-glossary,Glossari musical} +@end macro + +@macro rlearning{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,lilypond-learning,Manual d'aprenentatge} +@end macro + +@macro rlearningnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,,lilypond-learning,Manual d'aprenentatge} +@end macro + +@macro ruser{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,lilypond-notation,Referència de la notació} +@end macro + +@macro rusernamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,lilypond-notation,Referència de la notació} +@end macro + +@macro rchanges{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,lilypond-changes,Canvis} +@end macro + +@macro rchangesnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,lilypond-changes,Canvis} +@end macro + +@macro rextend{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,lilypond-extending,Extensions} +@end macro + +@macro rextendnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,lilypond-extending,Extensions} +@end macro + +@macro rcontrib{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,lilypond-contributor,Guia del col·laborador} +@end macro + +@macro rcontribnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,lilypond-contributor,Guia del col·laborador} +@end macro + +@macro rweb{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,lilypond-web,Informació general} +@end macro + +@macro rwebnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,lilypond-web,Informació general} +@end macro + +@macro ressay{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,lilypond-essay,Monografia} +@end macro + +@macro ressaynamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,lilypond-essay,Monografia} +@end macro + +@macro rprogram{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,lilypond-usage,Utilització del programa} +@end macro + +@macro rprogramnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,lilypond-usage,Utilització del programa} +@end macro + +@macro rlsr{TEXT} +@ref{\TEXT\,,,lilypond-snippets,Fragments de codi} +@end macro + +@macro rlsrnamed{TEXT,DISPLAY} +@ref{\TEXT\,,\DISPLAY\,lilypond-snippets,Fragments de codi} +@end macro + +@macro rinternals{TEXT} +@vindex \TEXT\ +@ref{\TEXT\,,,lilypond-internals,Referència de funcionament intern} +@end macro + +@macro rinternalsnamed{TEXT,DISPLAY} +@vindex \TEXT\ +@ref{\TEXT\,,\DISPLAY\,lilypond-internals,Referència de funcionament intern} +@end macro + +@end ifinfo + +@end ifclear + +@end ifnottex + + +@c *** TeX *** + +@iftex + +@c All commands below should work in the middle of the line; +@c we thus must not use @vindex directly since it works only if placed +@c on a line of its own. To overcome this problem, we define a +@c replacement macro using the internal definition of @vindex which +@c delimits arguments in the standard way (i.e., with braces). + +@tex +\gdef\lilyvindex#1{\doind{vr}{\code{#1}}\ignorespaces} +@end tex + +@macro rglos{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,music-glossary,Glossari musical} +@end macro + +@macro rglosnamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,music-glossary,Glossari musical} +@end macro + +@macro rlearning{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,learning.es,Manual d'aprenentatge} +@end macro + +@macro rlearningnamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,learning.es,Manual d'aprenentatge} +@end macro + +@macro ruser{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,notation.es,Referència de la notació} +@end macro + +@macro rusernamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,notation.es,Referència de la notació} +@end macro + +@macro rchanges{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,changes,Canvis} +@end macro + +@macro rchangesnamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,changes,Canvis} +@end macro + +@macro rextend{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,extending,Extendre} +@end macro + +@macro rextendnamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,extending,Extensions} +@end macro + +@macro rcontrib{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,contributor,Guia del col·laborador} +@end macro + +@macro rcontribnamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,contributor,Guia del col·laborador} +@end macro + +@macro rweb{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,web,Informació general} +@end macro + +@macro rwebnamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,web,Informació general} +@end macro + +@macro ressay{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,essay,Monografia} +@end macro + +@macro ressaynamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,essay,Monografia} +@end macro + +@macro rprogram{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,usage.es,Utilització del programa} +@end macro + +@macro rprogramnamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,usage.es,Utilització del programa} +@end macro + +@macro rlsr{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,snippets,Fragments de codi} +@end macro + +@macro rlsrnamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,snippets,Fragments de codi} +@end macro + +@macro rinternals{TEXT} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,,internals,Referència de funcionament intern} +@end macro + +@macro rinternalsnamed{TEXT,DISPLAY} +@lilyvindex{\TEXT\} +@ref{\TEXT\,,\DISPLAY\,internals,Referència de funcionament intern} +@end macro + +@end iftex + + +@c ***** Macros specific to the web site ***** + +@ifset web + +@macro exampleImage{IMAGE-FILE} +@html +
+@end html +@iftex +@image{ly-examples/\IMAGE-FILE\,6in,,\IMAGE-FILE\,png} +@end iftex +@ifinfo +@image{lilypond/ly-examples/\IMAGE-FILE\,,,\IMAGE-FILE\,png} +@end ifinfo +@end macro + +@macro help{TEXT} +@html +
+ + Necessitem ajuda: + \TEXT\ +
+@end html +@end macro + +@c LEGALESE + +@macro logoLegalLinux +Tux, el pingüí del Linux, és obra de +@uref{mailto:lewing@@isc.tamu.edu, lewing@@isc.tamu.edu} feta amb +@uref{http://www.isc.tamu.edu/~lewing/gimp/, el Programa de +Manipulació de Imatges del GNU}. + +@end macro + +@macro logoLegalFreeBSD +El logotip del FreeBSD és una marca registrada de +@uref{http://www.freebsd.org/, The FreeBSD Foundation}. + +@end macro + +@macro logoLegalMacOSX +La @qq{imatge de la X} no és una marca registrada. És obra de +@uref{http://en.wikipedia.org/wiki/User:Nihonjoe, Nihonjoe} i +@uref{http://en.wikipedia.org/wiki/User:CyberSkull, CyberSkull}, i es +va posar sota la llicència de Documentació Lliure del GNU versió +1.2 o posterior. Trobem aquesta imatge a +@uref{http://commons.wikimedia.org/wiki/File:Mac_OS_X_Userbox_X.png, +aquesta pàgina de la Wikimedia Commons}. + +@end macro + +@macro logoLegalWindows +La @qq{imatge dels quatre rectangles de colors} no és una marca +registrada. És obra de +@uref{http://en.wikipedia.org/wiki/User:Rohitbd, Rohitbd} i està +posada sota la llicència de Documentació Lliure del GNU, versió 1.2. +Trobem aquesta imatge a +@uref{http://commons.wikimedia.org/wiki/Category:Microsoft_Windows_logos, +aquesta pàgina de la Wikimedia Commons}. + +@end macro + +@end ifset + + +@c ***** Macros specific to translated docs ***** + + +@macro englishref +Aquesta secció encara no està traduïda; consulteu el manual en anglès. +@end macro diff --git a/Documentation/ca/search-box.ihtml b/Documentation/ca/search-box.ihtml new file mode 100644 index 0000000000..2dd0b5379c --- /dev/null +++ b/Documentation/ca/search-box.ihtml @@ -0,0 +1,26 @@ + + +
+ + + +
diff --git a/Documentation/ca/translations.itexi b/Documentation/ca/translations.itexi new file mode 100644 index 0000000000..e84c9e619b --- /dev/null +++ b/Documentation/ca/translations.itexi @@ -0,0 +1,541 @@ +@c -*- coding: utf-8; mode: texinfo; -*- +@c This file was generated by translation-status.py -- DO NOT EDIT! +@ignore + Translation of GIT committish: 0 +@end ignore + + +@ifhtml + +@html + + + +@end html +@end ifhtml +@emph{Actualitzat el Sat Jul 2 15:06:05 UTC 2016 +} +@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 + +@headitem +Manual d'aprenentatge del GNU LilyPond +@tab Traductors +@tab Revisors +@tab Traduït +@tab Actualitzat +@tab Més inf. +@item +Títols de secció +@* +124 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@item +LilyPond --- \TITLE\ +@* +1139 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab pre-GDP +@item +1 Tutorial +@* +2499 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@item +2 Notació corrent +@* +4402 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@item +3 Conceptes fonamentals +@* +11119 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@item +4 Ajustament de la sortida +@* +16592 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab pre-GDP +@item +A Plantilles +@* +1236 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +parcialment (97 %) +@end html +@end ifhtml +@ifnothtml +parcialment (97 %) +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@end multitable + + +@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 + +@headitem +LilyPond: manual d'utilització del programa +@tab Traductors +@tab Revisors +@tab Traduït +@tab Actualitzat +@tab Més inf. +@item +Títols de secció +@* +135 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@item +LilyPond --- \TITLE\ +@* +1139 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab pre-GDP +@item +1 Execució del LilyPond +@* +5440 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +parcialment (95 %) +@end html +@end ifhtml +@ifnothtml +parcialment (95 %) +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@item +2 Actualització de fitxers amb @command{convert-ly} +@* +1866 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@item +3 Suggeriments per escriure fitxers d'entrada +@* +2793 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@end multitable + + +@multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 + +@headitem +LilyPond: notació musical per a tots +@tab Traductors +@tab Revisors +@tab Traduït +@tab Actualitzat +@tab Més inf. +@item +Títols de secció +@* +629 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab pre-GDP +@item +LilyPond --- \TITLE\ +@* +1139 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab pre-GDP +@item +Introducció +@* +5815 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@item +Descàrrega +@* +1158 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@item +Manuals +@* +1314 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@item +Comunitat +@* +3524 +@tab Walter Garcia-Fontes +@tab +@tab +@ifhtml + +@html +si +@end html +@end ifhtml +@ifnothtml +si +@end ifnothtml +@tab +@ifhtml + +@html +parcialment +@end html +@end ifhtml +@ifnothtml +parcialment +@end ifnothtml +@tab pre-GDP +@end multitable + diff --git a/Documentation/ca/usage.tely b/Documentation/ca/usage.tely new file mode 100644 index 0000000000..e595bbe308 --- /dev/null +++ b/Documentation/ca/usage.tely @@ -0,0 +1,88 @@ +\input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- +@ignore + Translation of GIT committish: 08560a1b8076630c4fc6cb9b902614d8b74fd6fc + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@setfilename lilypond-usage.info +@settitle LilyPond: manual d'utilització del programa +@documentencoding UTF-8 +@documentlanguage ca +@afourpaper + +@c Translators: Walter Garcia-Fontes + +@macro manualIntro +Aquest fitxer explica com executar els programes que es +distribueixen amb el LilyPond versió @version{}. A més a més +suggereix certes @qq{bones pràctiques} per a una utilització eficient. +@end macro + +@c `Usage' was born 1999-10-10 with git commit c82c30c... +@macro copyrightDeclare +Copyright @copyright{} 1999--2014 pels autors. +@end macro + +@set FDL +@include macros.itexi + + +@c don't remove this comment. +@ignore +@omfcreator Han-Wen Nienhuys, Jan Nieuwenhuizen and Graham Percival +@omfdescription Application Usage of the LilyPond music engraving system +@omftype program usage +@omfcategory Applications|Publishing +@omflanguage English +@end ignore + + +@lilyTitlePage{Utilització} + + +@c TOC -- non-tex +@ifnottex + +@c maybe add a "Tasks" or "Specific tasks" or something like +@c that, after Suggestions -gp +@menu +* Execució del LilyPond:: Operació. +* Actualització de fitxers amb convert-ly:: Actualitzar els fitxers d'entrada. +* lilypond-book:: Integrar text i música. +* External programs:: Barrejar el LilyPond amb altres programes. +* Suggeriments per escriure fitxers d'entrada:: Bones pràctiques i depuració eficient d'errors. + + +Annexos + +* GNU Free Documentation License:: Llicència d'aquest document. +* Índex del LilyPond:: +@end menu + +@docMain +@end ifnottex + + +@contents + +@allowcodebreaks false + +@include usage/running.itely +@include usage/updating.itely +@include usage/lilypond-book.itely +@include usage/external.itely +@include usage/suggestions.itely + +@include fdl.itexi + + +@node Índex del LilyPond +@appendix Índex del LilyPond +@translationof LilyPond index + +@printindex cp + +@bye diff --git a/Documentation/ca/usage/running.itely b/Documentation/ca/usage/running.itely new file mode 100644 index 0000000000..7d4f3b9abe --- /dev/null +++ b/Documentation/ca/usage/running.itely @@ -0,0 +1,1201 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- + +@ignore + Translation of GIT committish: 93d725094ee629b2d5200ab5a75b609579a62973 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c \version "2.19.21" + + +@node Execució del LilyPond +@chapter Execució del LilyPond +@translationof Running LilyPond + +Aquest capítol detalla els aspectes tècnics de l'execució del +LilyPond. + +@menu +* Utilització normal:: +* Utilització des de la línia d'ordres:: +* Missatges d'error:: +* Errors comuns:: +@end menu + + +@node Utilització normal +@section Utilització normal +@translationof Normal usage + +Gairebé tots els usuaris executen el LilyPond per mitjà d'una +interfície gràfica; consulteu @rlearning{Tutorial} si encara +no l'heu llegit. + +@node Utilització des de la línia d'ordres +@section Utilització des de la línia d'ordres +@translationof Command-line usage + +Aquesta secció conté informació addicional sobre l'ús del +LilyPond a la línia d'ordres. Aquesta forma pot ser preferible +per passar-li al programa algunes opcions addicionals. A més a +més, existeixen alguns programes complementaris @q{de suport} (com +ara @code{midi2ly}) que sols estan disponibles a la línia d'ordres. + +En parlar de la @q{línia d'ordres}, ens referim a la consola del +sistema operatiu. Els usuaris del Windows possiblement estiguin +més familiaritzats amb els termes @q{finestra del MS-DOS} o +@q{línia de comandes}; Els usuaris del MacOS@tie{}X potser que +estiguin més familiaritzats amb els termes @q{terminal} o +@q{consola}. Aquests podrien requerir algunes configuracions +addicionals i haurien de consultar també l'apartat @rweb{MacOS X}. + +La descripció de l'ús d'aquesta part dels sistemes operatius +excedeix l'àmbit d'aquest manual; us preguem que consulteu altres +documents sobre aquest tema si no us resulta familiar la línia +d'ordres. + +@menu +* Invocació del LilyPond:: +* Opcions bàsiques de la línia d'ordres per al LilyPond:: +* Opcions avançades de la línia d'ordres per al LilyPond:: +* Variables d'entorn:: +* El LilyPond a una gàbia de chroot:: +@end menu + +@node Invocació del LilyPond +@unnumberedsubsec Invocació del @command{lilypond} +@translationof Invoking lilypond + +L'executable @command{lilypond} es pot cridar des d'una línia +d'ordres de la manera següent: + +@example +lilypond [@var{opció}]@dots{} @var{fitxer}@dots{} +@end example + +Quan s'invoca amb un nom de fitxer sense extensió, es prova en +primer lloc amb la extensió @file{.ly}. Per llegir l'entrada des +de stdin, utilitzeu un guió (@code{-}) en substitució de @var{fitxer}. + +Quan es processa @file{archivo.ly}, la sortida resultant són els +fitxers @file{fitxer.ps} i @file{fitxer.pdf}. Es poden +especificar diversos fitxers; cadascú d'ells es processarà de +forma independent@footnote{L'estat del GUILE no es restableix +després de processar un fitxer @code{.ly}, per la qual cosa heu de +tenir cura de no modificar cap valor predeterminat des de dins del +Scheme.}. + +Si @file{fitxer.ly} conté més d'un bloc @code{\score}, la resta de +les partitures s'obtindran com a sortida en fitxers numerats, +començant per @file{fitxer-1.pdf}. A més, el valor de +@code{output-suffix} (sufix de sortida) s'inserirà entre el nom +base i el número. Un fitxer de sortida que contingui + +@example +#(define output-suffix "violí") +\score @{ @dots{} @} +#(define output-suffix "violoncel") +\score @{ @dots{} @} +@end example + +@noindent +produirà com a sortida @var{base}@file{-violí.pdf} i +@var{base}@file{-violoncel-1.pdf}. + + +@unnumberedsubsubsec Instruccions estàndard de la línia d'ordres + +Si la vostra terminal (o finestra d'ordres) contempla les +redireccions normals, potser us siguin d'utilitat les següents +instruccions per redirigir la sortida de la consola d'un fitxer: + +@itemize + +@item +@code{lilypond fitxer.ly 1>sortidaestandard.log} per redirigir la sortida normal + +@item +@code{lilypond fitxer.ly 2>sortidaderror.log} per redirigir els missatges d'error + +@item +@code{lilypond fitxer.ly &>tot.log} per redirigir tota la sortida + +@end itemize + +Consulteu la documentació del vostre intèrpret d'ordres per veure +si contempla aquestes opcions, o si la sintaxi és diferent. +Observeu que són instruccions de l'intèrpret d'ordres i que no +tenen res a veure amb el LilyPond. + +@node Opcions bàsiques de la línia d'ordres per al LilyPond +@unnumberedsubsec Opcions bàsiques de la línia d'ordres per al LilyPond +@translationof Basic command line options for LilyPond + +@cindex invocació de @command{lilypond} +@cindex opcions de la línia d'ordres per a @command{lilypond} +@cindex línia d'ordres, opcions de +@cindex modificadors + +Estan contemplades les opcions següents: + +@table @code + +@item -d, --define-default=@var{variable}=@var{valor} +Vegeu @ref{Opcions avançades de la línia d'ordres per al LilyPond}. + +@cindex Scheme, avaluació d'expressions +@cindex expressions del Scheme, avaluació + +@item -e, --evaluate=@var{expressió} +Avalua l'@var{expressió} del Scheme abans d'analitzar els fitxers +@file{.ly}. Es poden passar diverses opcions @option{-e}, que +s'avaluaran en seqüència. + +L'expressió s'avaluarà al mòdul @code{guile-user}, de manera que +si voleu usar definicions dins d'@var{expressió}, heu d'utilitzar + +@example +lilypond -e '(define-public a 42)' +@end example + +@noindent +a la línia d'ordres, i incloure + +@example +#(use-modules (guile-user)) +@end example + +@noindent +al principi del fitxer @file{.ly}. + +@warning{Els usuaris de Windows han d'utilitzar cometes dobles en +comptes de cometes simples.} + +@cindex sortida, format +@cindex format, sortida + +@item -f, --format=@var{format} +quins formats s'han d'escriure. Les opcions per a @code{format} són +@code{ps}, @code{pdf}, i @code{png}. + +Exemple: @code{lilypond -fpng @var{fitxer}.ly} + +@item -h, --help +Mostra un resum de les formes de utilització. + +@item -H, --header=@var{CAMP} +Bolca un camp de capçalera al fitxer @file{NOMBASE.@var{CAMP}} + +@item -i, --init=@var{archivo} +Establir el fitxer d'inici a @var{fitxer} (predeterminat: +@file{init.ly}). + +@cindex fitxers, cerca de +@cindex cerca, ruta de + +@item -I, --include=@var{directori} +Afegir el @var{directori} a la ruta de cerca de fitxers +d'entrada. + +Es poden escriure diverses opcions -I. La cerca s'inicia al +primer directori definit, i si el fitxer que s'ha d'incloure no es +troba, la cerca continua als directoris següents. + +@cindex chroot, executar dins d'una gàbia + +@item -j, --jail=@var{usuari},@var{grup},@var{gàbia},@var{directori} +Executar @command{lilypond} a una gàbia de chroot. + +L'opció @option{--jail} (gàbia) proporciona una alternativa més +flexible a l'opció @option{-dsafe} quan el procés de tipografia +del LilyPond està disponible a un servidor web o quan el LilyPond +executa instruccions enviades per fonts externes +(vegeu @ref{Opcions avançades de la línia d'ordres per al LilyPond}). + +L'opció @option{--jail} funciona canviant l'arrel de +@command{lilypond} a @var{gàbia} just o abans de començar el +procés de compilació en sí. Si es fa això es canvien l'usuari i +el grup als que s'han donat a l'opció, i el directori actual es +canvia a @var{directori}. Aquesta instal·lació garanteix que no +és possible, al menys en teoria, escapar a la gàbia. Observeu que +perquè funcioni @option{--jail}, s'ha d'executar +@command{lilypond} com root, cosa que normalment es pot fer d'una +forma segura utilitzant @command{sudo}. + +La instal·lació d'una gàbia pot ser un assumpte relativament +complex, atès que hem d'assegurar-nos que el LilyPond pot trobar +@emph{dins} de la pròpia gàbia tot el que necessita per poder +compilar la font. Una típica configuració de gàbia de chroot +consta dels següents elements: + +@table @asis + +@item Preparació d'un sistema de fitxers separat +S'ha de crear un sistema de fitxers separat per al LilyPond, de +forma que es pugui muntar amb opcions segures com @code{noexec}, +@code{nodev} i @code{nosuid}. D'aquesta forma, és impossible +executar programes o escriure directament a un dispositiu des del +LilyPond. Si no voleu crear una partició separada, tan sols té +que crear un fitxer d'una mida raonable i usar-lo per muntar un +dispositiu loop. El sistema de fitxers separat garanteix també +que el LilyPond mai no pugui escriure en un espai major del què se +li permeti. + +@item Preparar un usuari separat +Es pot usar un usuari i grup separats (diguem-ne +@code{lily}/@code{lily}) amb pocs privilegis per executar el +LilyPond dins d'una gàbia. Hauria d'existir un sols directori amb +permisos d'escriptura per a aquest usuari, i s'ha de passar el valor +@var{directori}. + +@item Preparació de la gàbia +El LilyPond necessita llegir alguns fitxers mentre s'executa, +Tots aquests fitxers s'han de copiar dins de la gàbia, sota la +mateixa ruta en la qual apareixen al sistema de fitxers real de +root. Tot el contingut de la instal·lació del LilyPond (per exemple +@file{/usr/share/lilypond}) s'ha de copiar. + +Si sorgeixen problemes, la forma més senzilla de rastrejar-los és +executar el LilyPond usant @command{strace}, cosa que li permetrà +determinar quins fitxers falten. + +@item Execució del LilyPond +Dins d'una gàbia muntada amb @code{noexec} és impossible executar +cap programa extern. Per tant, el LilyPond s'ha d'executar amb un +backend que no necessiti un programa extern. Com ja hem +mencionat, s'ha d'executar amb privilegis del superusuari (que per +suposat perdrà immediatament), possiblement usant @command{sudo}. +També de CPU que el LilyPond pot usar (per exemple usant +@command{ulimit@tie{}-t}), i, si el vostre sistema operatiu ho +contempla, la mida de la memòria que es pot reservar. Vegeu també +@ref{El LilyPond a una gàbia de chroot}. + +@end table + +@cindex loglevel +@cindex registre, nivell de +@cindex sortida neta, fixar el nivell + +@item -l, --loglevel=@var{NIVELL} +Fixa el grau en el qual la sortida de consola és neta al nivell +@var{NIVELL}. Els valors possibles són: + +@table @code + +@item NONE +Cap sortida en absolut, ni tan sols missatges d'error. + +@item ERROR +Sols missatges d'error, cap advertiment o indicacions de progrés. + +@item WARN +Advertiments i missatges d'error, no de progrés. + +@item BASIC_PROGRESS +Missatges de progrés bàsics (èxit), advertiment i errors. + +@item PROGRESS +Tots els missatges de progrés, advertiments i errors. + +@item INFO (predeterminat) +Missatges de progrés, advertiments, errors i informació d'execució +addicional. + +@item DEBUG +Tots els missatges possibles, fins i tot la informació detallada de +depuració. +@end table + +@cindex carpeta, dirigir la sortida cap a +@cindex sortida, establir el nom del fitxer de + +@item -o, --output=@var{FITXER} o @var{CARPETA} +Estableix el nom del fitxer de sortida predeterminat a +@var{FITXER} o, si hi ha una carpeta amb aquest nom, dirigeix la +sortida cap a @var{CARPETA}, agafant el nom de fitxer del +document d'entrada. S'afegeix el sufix corresponent (per exemple, +@code{.pdf} per a PDF) als dos casos. + +@cindex PS (Postscript), sortida +@cindex Postscript (PS), sortida +@cindex sortida, PS (Postscript) + +@item --ps +Generar PostScript. + +@cindex PNG (Portable Network Graphics), sortida +@cindex sortida, PNG (Portable Network Graphics) + +@item --png +Genera imatges de les pàgines en format PNG. Això implica +@option{--ps}. La resolució en PPP de la imatge es pot establir +amb +@example +-dresolution=110 +@end example + +@cindex PDF (format de document portàtil), sortida de +@cindex sortida, PDF (format de document portàtil) + +@item --pdf +Genera PDF. Implica @option{--ps}. + +@item -v, --version +Mostra la informació de la versió. + +@item -V, --verbose +Sigues detallat: mostra les rutes completes de tots els fitxers +que se llegeixen, i dóna informació cronomètrica. + +@item -w, --warranty +Mostra la garantia del GNU LilyPond (no ve amb +@strong{CAP GARANTIA}!). + +@end table + + +@node Opcions avançades de la línia d'ordres per al LilyPond +@unnumberedsubsec Opcions avançades de la línia d'ordres per al LilyPond +@translationof Advanced command line options for LilyPond + +@table @code + +@item -d@var{[nom-de-opció]}=@var{[valor]}, --define-default=@var{[nom-de-opció]}=@var{[valor]} +Estableix la funció del Scheme interna equivalent a @var{valor}. + +@example +-dbackend=svg +@end example + +Si no es proporciona cap @var{valor}, s'usa el valor predeterminat +Per desactivar una opció es pot anteposar @code{no-} a la +@var{variable}, per exemple: + +@cindex apuntar i clicar, línia d'ordres + +@example +-dno-point-and-click +@end example + +@noindent +és el mateix que +@example +-dpoint-and-click=#f +@end example +@end table + +@noindent Estan contemplades les següents opcions junt als seus +respectius valors predeterminats: + +@multitable @columnfractions .33 .16 .51 +@item @strong{Símbol} +@tab @strong{Valor} +@tab @strong{Explicació/Opcions} + +@item @code{anti-alias-factor} (factor d'antiàlies) +@tab @code{1} +@tab Renderitza a una major resolució (utilitzant el factor +donat) i redueix l'escala del resultat per així evitar +@q{escales} a les imatges @code{PNG}. + +@item @code{aux-files} (fitxers auxiliars) +@tab @code{#t} +@tab Crea fitxeres @code{.tex}, @code{.texi}, @code{.count} al +@q{back-end} @code{EPS}. + +@item @code{backend} +@tab @code{ps} +@tab Selecciona un @q{rerefons}. Els fitxers (l'opció +predeterminada) inclouen els tipus tipogràfics de lletra @code{TTF}, +@code{Type1} i @code{OTF}. No es fa cap subconjunt d'aquests tipus +de lletra. L'ús de conjunts de caràcters @q{orientals} pot +produir fitxers molts grans. + +@item +@tab @code{eps} +@tab PostScript encapsulat. Bolca cada pàgina o sistema com un +fitxer @file{EPS} diferent, sense tipus tipogràfics de lletra, i +com un fitxer @file{EPS} enquadernat amb totes les pàgines o +sistemes que inclouen els tipus de lletra. Utilitzat com a opció +predeterminada per part de @command{lilypond-book}. + +@item +@tab @code{null} +@tab No produeixes cap partitura impresa a la sortida; té el +mateix efecte que @code{-dno-print-pages}. + +@item +@tab @code{svg} +@tab Gràfics vectorials escalables. Crea un únic fitxer +@code{SVG}, sense tipus tipogràfics de lletra incrustats, per a +cada pàgina de sortida. Es recomana instal·lar el tipus de lletra +Century Schoolbook, que està inclòs a la instal·lació del +LilyPond, per a un renderitzat òptim. Sota l'UNIX, bastarà amb +que copieu aquests fitxers de tipus de lletra del directori del +Lilypond (normalment @file{/usr/share/lilypond/VERSION/fonts/otf/}) +al directori @file{~/.fonts/}. La sortida @code{SVG} hauria de +ser compatible amb qualsevol editor o client de SVG. També hi ha +una opció @code{svg-woff} (vegeu més avall) per usar els fitxers +de tipus de lletra woff al @q{rerefons} SVG. + +@item +@tab @code{scm} +@tab Bolcat de les instruccions de dibuix internes basades en +Scheme, en brut. + +@item @code{check-internal-types} +n@tab @code{#f} +@tab Comprova el tipus de cada assignació de propietats. + +@item @code{clip-systems} (retalla els sistemes de pentagrames) +@tab @code{#f} +@tab Genera framents d'imatge retallats d'una partitura. + +@item @code{datadir} (directori de dades) +@tab +@tab Prefix dels fitxers de dades (sols lectura). + +@item @code{debug-gc} +@tab @code{#f} +@tab Bolca estadístiques de depuració de memòria. + +@item @code{debug-gc-assert-parsed-dead} +@tab @code{#f} +@tab Per a la depuració de memòria: assegura't que totes les +referències a objectes analitzats estiguin mortes. És una opció +interna, i s'activa automàticament per a @code{`-ddebug-gc'}. + +@item @code{debug-lexer} +@tab @code{#f} +@tab Depuració de l'analitzador lèxic flex. + +@item @code{debug-page-breaking-scoring} +@tab @code{#f} +@tab Bolca les partitures per a moltes configuracions de salts de +pàgina diferents. + +@item @code{debug-parser} +@tab @code{#f} +f@tab Depuració de l'analitzador sintàctic bison. + +@item @code{debug-property-callbacks} +@tab @code{#f} +@tab Depuració de les cadenes cícliues de funcions de callback. + +@item @code{debug-skylines} +@tab @code{#f} +@tab Depuració de les línies de horitzó. + +@item @code{delete-intermediate-files} +@tab @code{#t} +@tab Elimina els fitxers intermedis @code{.ps} inútils que es +creen durant la compilació. + +@item @code{dump-cpu-profile} +@tab @code{#f} +@tab Bolcar informació de comptabilització del temps (dependent +del sistema). + +@item @code{dump-profile} +@tab @code{#f} +@tab Bolca la informació de memòria i de temps de cada fitxer. + +@item @code{dump-signatures} +@tab @code{#f} +@tab Bolca les signatures de sortida de cada sistema. Usat per a +les proves de regressió. + +@item @code{eps-box-padding} +@tab @code{#f} +@tab Omple la vora esquerra de la capsa contenidora de l'EPS de +sortida en la quantitat donada (en mm). + +@item @code{gs-load-fonts} +@tab @code{#f} +@tab Carrega els tipus tipogràfics de lletra a través del Ghostscript. + +@item @code{gs-load-lily-fonts} +@tab @code{#f} +@tab Carrega sols els tipus de lletra del LilyPond per mitjà del +Ghostscript. + +@item @code{gui} +@tab @code{#f} +@tab S'executa silenciosament i es redirigeix tota la sortida a un +fitxer de registre. +@end multitable + +@noindent +@strong{Nota per als usuaris del Windows:} De manera predeterminada, +@code{lilypond.exe} dirigeix tota la sortida de la informació +d'avenç cap a la finestra de consola, @code{lilypond-windows.exe} +no ho fa i retorna un indicador del sistema, sense cap indicació +d'avenç, immediatament en la línia d'ordres. L'opció +@option{-dgui} es pot usar en aquest cas per redirigir la sortida +a un fitxer de registre. + +@multitable @columnfractions .33 .16 .51 +@item @code{help} +@tab @code{#f} +@tab Mostra aquesta ajuda + +@item @code{include-book-title-preview} +@tab @code{#t} +@tab Inclou els títols de llibre a les imatges de vista prèvia. + +@item @code{include-eps-fonts} +@tab @code{#t} +@tab Incloure els tipus tipogràfics de fonts als fitxers EPS de +cadascú dels sistemes. + +@item @code{include-settings} +@tab @code{#f} +@tab Inclou el fitxer dels ajustos globals, s'inclou abans que la +partitura es processi. + +@item @code{job-count} +@tab @code{#f} +@tab Processa en paral·lel, usant el nombre de tasques donat. + +@item @code{log-file} +@tab @code{#f [fitxer]} +@tab Si es dóna a una cadena @code{fitxer} como a segon argument, +redirigeix la sortida al fitxer de registre @code{fitxer.log}. + +@item @code{max-markup-depth} +@tab @code{1024} +@tab Profunditat màxima de l'arbre de l'etiquetatge. Si un +etiquetatge té més nivells, suposa que no acabarà per sí mateix, +imprimint un advertiment i retornant en el seu lloc un element +d'etiquetatge nul. + +@item @code{midi-extension} +@tab @code{"midi"} +@tab Fixa l'extensió de fitxer predeterminat per al fitxer de +sortida MIDI a la cadena donada. + +@item @code{music-strings-to-paths} +@tab @code{#f} +@tab Converteix les cadenes de text a rutes quan els glifs +pertanyen a un tipus de lletra de tipografia musical. + +@item @code{paper-size} +@tab @code{\"a4\"} +@tab Estableix la mida predeterminada del paper. Observeu que la +cadena ha d'anar tancada entre cometes dobles. + +@item @code{pixmap-format} +@tab @code{png16m} +@tab Fixa el format de sortida del Ghostsript per a les imatges de píxels. + +@item @code{point-and-click} +@tab @code{#f} +@tab Afegeix enllaços d'@q{apuntar i +clicar} a la sortida @code{PDF}. Vegeu +@ref{Point and click}. + +@item @code{preview} +@tab @code{#f} +@tab Crea imatges de vista prèvia a més de la sortida normal. +@end multitable + +@noindent +Aquesta opció està contemplada per tots els @q{rerefons}: @code{pdf}, +@code{png}, @code{ps}, @code{eps} i @code{svg}, però no per +@code{scm}. Genera un fitxer de sortida, en la forma +@code{elmeuFitxer.preview.extensió}, que conté els títols i el +primer sistema de la música. Si s'estan utilitzant blocs +@code{\book} o @code{\bookpart}, apareixen a la sortida els títols de +@code{\book}, @code{\bookpart} o @code{\score}, inclòs el primer +sistema de cada bloc @code{\score} si la variable de @code{\paper} +@code{print-all-headers} està fixada al valor @code{#t}. + +Per suprimir la sortida actual, utilitzeu les opcions +@option{-dprint-pages} o @option{-dno-print-pages} segons les +vostres necessitats. + +@multitable @columnfractions .33 .16 .51 +@item @code{print-pages} +@tab @code{#t} +@tab Genera pàgines completes (és l'opció predeterminada). És útil +@option{-dno-print-pages} en combinació amb @option{-dpreview}. + +@item @code{profile-property-accesses} +@tab @code{#f} +@tab Conserva les estadístiques de les crides de funció +@code{get_property()}. + +@item @code{protected-scheme-parsing} +@tab @code{#t} +@tab Continua quan es capten a l'analitzador sintàctic errors del +Scheme encastat. Si es fixa a @code{#f}, detenir-se quan hi hagi +errors i imprimir un registre de traça de pila. + +@item @code{read-file-list} +@tab @code{#f [fitxer]} +@tab Especifica el nom d'un fitxer que conté una llista de fitxers +d'entrada per processar. + +@item @code{relative-includes} +@tab @code{#f} +@tab Quan es processa una instrucció @code{\include}, cerca el +fitxer inclòs de forma relativa al fitxer actual (enlloc del +fitxer principal). + +@item @code{resolution} +@tab @code{101} +@tab Fixa la resolució per generar imatges de píxels @code{PNG} al +valor donat (en ppp). + +@item @code{safe} +@tab @code{#f} +@tab No confiïs en l'entrada @code{.ly}. +@end multitable + +@noindent +Quan el servei de tipografia està disponible a través d'un +servidor web, @b{S'HAN DE} passar les opcions @option{--safe} o +@option{--jail}. L'opció @option{--safe} evita que el codi del +Scheme faci un desastre, per exemple: + +@quotation +@verbatim +#(system "rm -rf /") +{ + c4^$(ly:gulp-file "/etc/passwd") +} +@end verbatim +@end quotation + +L'opció @option{-dsafe} funciona avaluant les expressions del +Scheme en línia dins d'un mòdul segur especial. Deriva del mòdul +@file{safe-r5rs} del GUILE, però a més afegeix unes quantes +funcions de l'API del LilyPond que estan relacionades en +@file{scm/safe-lily.scm}. + +A més, el mode segur prohibeix les directives @code{\include} i +desactiva la utilització de barres invertides a les cadene de +@TeX{}. A més, no és possible importar variables del LilyPond +dins del Scheme quan s'està em mode segur. + +@option{-dsafe} @emph{no} detecta la sobreutilitizació de +recursos, per la qual cosa encara és possible fer que el programa +es pengi indefinidament, per exemple subministrant estructures de +dades cícliques en el rerefons. Per això, si esteu usant el +LilyPond en un servidor web accessible públicament, el procés s'ha +de limitar tant en l'ús de memòria com de CPU. + +El mode segur evita que es puguin compilar molts fragments de codi +útils. + +L'opció @option{--jail} és una alternativa encara més segura, però +requereix més feina per a la seva configuració. Vegeu +@ref{Opcions bàsiques de la línia d'ordres per al LilyPond}. + +@multitable @columnfractions .33 .16 .51 +@item @code{separate-log-files} +@tab @code{#f} +@tab Per als fitxers d'entrada @code{FITXER1.ly}, +@code{FITXER2.ly}, etc., treu les dades de registre cap als +fitxers @code{FITXER1.log}, @code{FITXER2.log}@dots{} + +@item @code{show-available-fonts} +@tab @code{#f} +@tab Llista tots els noms dels tipus tipogràfics de lletra +disponibles. + +@item @code{strict-infinity-checking} +@tab @code{#f} +@tab Força una terminació abrupta si es troben les excepcions de +punt flotant @code{Inf} i @code{NaN}. + +@item @code{strip-output-dir} +@tab @code{#t} +@tab No usis els directoris dels fitxers d'entrada en construir +els noms dels fitxers de sortida. + +@item @code{strokeadjust} +@tab @code{#f} +@tab Força l'ajust dels traços de PostScript. Aquesta opció és +rellevant principalment quan es genera un @code{PDF} a partir de +la sortida de PostScript (l'ajust del traç està en general activat +automàticament per a dispositius de mapa de punts de baixa +resolució). Sense aquesta opció, els visors de @code{PDF} +tendeixen a produir amplades de plica molt poc consistents a les +resolucions típiques de les pantalles d'ordinador. L'opció no +afecta de forma molt significativa a la qualitat de la impressió i +causa grans increments a la mida del fitxer @code{PDF}. + +@item @code{svg-woff} +@tab @code{#f} +@tab Usar fitxers de tipus tipogràfic de lletra de woff al +rerefons SVG. + +@item @code{trace-memory-frequency} +@tab @code{#f} +@tab Registra l'ús de cèl·lules del Scheme aquesta quantitat de +vegades per segon. Bolca els resultats en @code{FITXER.stacks} i +en @code{FITXER.graph}. + +@item @code{trace-scheme-coverage} +@tab @code{#f} +@tab Registra la cobertura dels fitxers del Scheme a @code{FITXER.cov}. + +@item @code{verbose} +@tab @code{#f} +@tab Sortida detallada, és a dir el nivell de registre en DEBUT +(sols lectura). + +@item @code{warning-as-error} +@tab @code{#f} +@tab Canvia tots els missatges d'advertiment i de @q{error de +programació} a errors. +@end multitable + + +@node Variables d'entorn +@unnumberedsubsec Variables d'entorn +@translationof Environment variables + +@cindex LANG +@cindex LILYPOND_DATADIR + +@command{lilypond} reconeix les següents variables d'entorn: +@table @code +@item LILYPOND_DATADIR +Especifica un directori en el qual els missatges de localització i +de dades es buscaran de forma predeterminada. El directori ha de +contenir subdirectoris anomenats @file{ly/}, @file{ps/}, +@file{tex/}, etc. + +@item LANG +Selecciona l'idioma dels missatges d'advertiment. + +@item LILYPOND_LOGLEVEL +Nivell de registre predeterminat. Si el LilyPond es crida sense +cap nivell de registre explícit (és a dir, sense opció de línia d'ordres +@option{--loglevel}), s'usa aquest valor. + +@item LILYPOND_GC_YIELD +Una variable, com a percentatge, que ajusta el comportament de +l'administració de memòria. Amb valors més alts, el programa usa +més memòria; amb valors més baixos, usa més temps de CPU. El +valor predeterminat és @code{70}. + +@end table + + +@node El LilyPond a una gàbia de chroot +@unnumberedsubsec El LilyPond a una gàbia de chroot +@translationof LilyPond in chroot jail + +La preparació del servidor perquè executi el LilyPond a una gàbia +de chroot és una tasca molt complicada. Els passos estan +relacionats més avall. Els exemples que apareixen en cadascú dels +passos son vàlids per a Ubuntu GNU/Linux, i poden requerir l'ús de +@code{sudo} segons correspongui. + +@itemize + +@item Instal·leu els paquets necessaris: el LilyPond, el Ghostscript i l'ImageMagick. + +@item Creeu un usuari nou amb el nom de @code{lily}: + +@example +adduser lily +@end example + +@noindent +Això també crearà un nou grup per a l'usuari @code{lily}, i una +carpeta personal, @code{/home/lily} + +@item A la carpeta personal de l'usuari @code{lily}, creeu un fitxer per usar-lo com a sistema de fitxers separat: + +@example +dd if=/dev/zero of=/home/lily/loopfile bs=1k count= 200000 +@end example + +@noindent +Aquest exemple crea un fitxer de 200MB per al seu ús com el +sistema de fitxers de la gàbia. + +@item Creeu un dispositiu loop, feu un sistema de fitxers i munteu-lo, +després creeu una carpeta que es pugui escriure per l'usuari +@code{lily}: + +@example +mkdir /mnt/lilyloop +losetup /dev/loop0 /home/lily/loopfile +mkfs -t ext3 /dev/loop0 200000 +mount -t ext3 /dev/loop0 /mnt/lilyloop +mkdir /mnt/lilyloop/lilyhome +chown lily /mnt/lilyloop/lilyhome +@end example + +@item En la configuració dels servidors, JAIL serà @code{/mnt/lilyloop} +i DIR serà @code{/lilyhome}. + +@item Creeu un gran arbre de directoris dins de la gàbia copiant els +fitxers necessaris, com es mostra en el guió d'exemple que apareix +més avall. + +Podeu usar @code{sed} per crear els fitxeres de còpia necessaris per a +un executable donat: + +@example +for i in "/usr/local/lilypond/usr/bin/lilypond" "/bin/sh" "/usr/bin/; \ + do ldd $i | sed 's/.*=> \/\(.*\/\)\([^(]*\).*/mkdir -p \1 \&\& \ + cp -L \/\1\2 \1\2/' | sed 's/\t\/\(.*\/\)\(.*\) (.*)$/mkdir -p \ + \1 \&\& cp -L \/\1\2 \1\2/' | sed '/.*=>.*/d'; done +@end example + +@end itemize + +@subheading Guió d'exemple per a l'Ubuntu 8.04 de 32 bits + +@example +#!/bin/sh +## aquí es fixen els valors predeterminats + +username=lily +home=/home +loopdevice=/dev/loop0 +jaildir=/mnt/lilyloop +# prefix (sense la barra inicial!) +lilyprefix=usr/local +# el directori en el qual el LilyPond es troba instal·lat en el sistema +lilydir=/$lilyprefix/lilypond/ + +userhome=$home/$username +loopfile=$userhome/loopfile +adduser $username +dd if=/dev/zero of=$loopfile bs=1k count=200000 +mkdir $jaildir +losetup $loopdevice $loopfile +mkfs -t ext3 $loopdevice 200000 +mount -t ext3 $loopdevice $jaildir +mkdir $jaildir/lilyhome +chown $username $jaildir/lilyhome +cd $jaildir + +mkdir -p bin usr/bin usr/share usr/lib usr/share/fonts $lilyprefix tmp +chmod a+w tmp + +cp -r -L $lilydir $lilyprefix +cp -L /bin/sh /bin/rm bin +cp -L /usr/bin/convert /usr/bin/gs usr/bin +cp -L /usr/share/fonts/truetype usr/share/fonts + +# Ara la màgia de copiar les biblioteques +for i in "$lilydir/usr/bin/lilypond" "$lilydir/usr/bin/guile" "/bin/sh" \ + "/bin/rm" "/usr/bin/gs" "/usr/bin/convert"; do ldd $i | sed 's/.*=> \ + \/\(.*\/\)\([^(]*\).*/mkdir -p \1 \&\& cp -L \/\1\2 \1\2/' | sed \ + 's/\t\/\(.*\/\)\(.*\) (.*)$/mkdir -p \1 \&\& cp -L \/\1\2 \1\2/' \ + | sed '/.*=>.*/d'; done | sh -s + +# Els fitxers compartits per al ghostcript... + cp -L -r /usr/share/ghostscript usr/share +# Els fitxers compartits per a l'ImageMagick + cp -L -r /usr/lib/ImageMagick* usr/lib + +### Ara, suposant que tenim test.ly a /mnt/lilyloop/lilyhome, +### hauríem de poder executar: +### Observeu que /$lilyprefix/bin/lilypond és un guió, que estableix +### un valor per a LD_LIBRARY_PATH : això és crucial + /$lilyprefix/bin/lilypond -jlily,lily,/mnt/lilyloop,/lilyhome test.ly +@end example + +@c " keep quote signs balanced for context-sensitive editors + +@node Missatges d'error +@section Missatges d'error +@translationof Error messages + +@cindex error, missatges d'error +@cindex missatges d'error + +Poden aparèixer diferents missatges d'error en compilar un fitxer: + +@table @emph + +@item Advertiment +@cindex advertiment +Alguna cosa té un aspecte sospitós. Si estem demanant quelcom +fora del comú, entendrem el missatge i podrem ignorar-lo. Tot i +així, els advertiments solen indicar que alguna cosa va mal amb el +fitxer d'entrada. + +@item Error +@cindex error +És clar que alguna cosa va malament. El pas actual del +processament (anàlisi, interpretació o format visual) es donarà +per acabat, però el pas següent se saltarà. + +@item Error fatal +@cindex error fatal +@cindex fatal, error +És clar que alguna cosa va malament, i el LilyPond no pot +continuar. Poques vegades passa això. La causa més freqüent són +els tipus de lletra mal instal·lats. + +@item Error del Scheme +@cindex traça del Scheme +@cindex crides, traça de +@cindex Scheme, error de +@cindex error del Scheme +Els errors que ocorren en executar el codi del Scheme +s'intercepten per part de l'intèrpret del Scheme. Si s'està +executant amb les opcions @option{-V} o @option{--verbose} +(detallat) aleshores s'imprimeix una traça de crides de la funció +ofensiva. + +@item Error de programació +@cindex error de programació +@cindex programació, error de +Hi ha hagut algun tipus d'inconsistència interna. Aquests +missatges d'error estan orientats a ajudar als programadors i als +depuradors. Normalment es poden ignorar. En ocasions apareixen +en quantitats tan grans que poden entorpir la visió d'altres +missatges de sortida. + +@item Abort (bolcat de core) +Això senyala un error de programació seriós que ha causat la +interrupció abrupta del programa. Aquests errors es consideren +crítics. Si es topa amb un, envieu un informe de fallada. +@end table + +@cindex error, format dels missatges de + +Si els errors i advertiments es poden lligar a un punt del fitxer +d'entrada, els missatges tenen la forma següent: + +@example +@var{fitxer}:@var{línia}:@var{columna}: @var{missatge} +@var{línia d'entrada problemàtica} +@end example + +S'insereix un salt de línia a la línia problemàtica per indicar la +columna on es va trobar l'error. Per exemple, + +@example +prova.ly:2:19: error: no és una duració: 5 + @{ c'4 e' + 5 g' @} +@end example + +Aquestes posicions són la millor suposició del LilyPond sobre on +s'ha produït el missatge d'error, però (per la seva pròpia +naturalesa) els advertiment i errors es produeixen quan passa +quelcom inesperat. Si no veieu un error a la línia que s'indica +del fitxer d'entrada, intenteu comprovar una o dues línies per +sobre de la posició indicada. + +S'ofereix més informació sobre els errors a la secció @ref{Errors +comuns}. + +@node Errors comuns +@section Errors comuns +@translationof Common errors + +Les condicions d'error que es descriuen més a sota es produeixen +amb freqüència, tot i que la causa no és òbvia o fàcil de trobar. +Un cop se han vist i comprès, es gestionen sense problema. + +@menu +* La música se surt de la pàgina:: +* Apareix un pentagrama de més:: +* Missatge d'error Unbound variable %:: +* Missatge d'error FT_Get_Glyph_Name:: +* Advertiment sobre que les afinitats del pentagrama sols han de decrèixer:: +* Missatge d'error Unexpected new:: +@end menu + +@node La música se surt de la pàgina +@unnumberedsubsec La música se surt de la pàgina +@translationof Music runs off the page + +La música que se surt de la pàgina pel marge dret o que apareix +exageradament comprimida està causada gairebé sempre per haver +introduït una duració incorrecta per a una nota, produint que la +nota final d'un compàs s'estengui més enllà de la línia +divisòria. Això no és invàlid si la nota final d'un compàs no +acaba sobre la línia divisòria introduïda automàticament, atès que +simplement se suposa que la nota se solapa a sobre del compàs +següent. Però si es produeix una seqüència llarga d'aquestes +notes solapades, la música pot aparèixer comprimida o sortir-se +de la pàgina perquè els salts de línia automàtiques solament se +poden inserir al final dels compassos complets, és a dir, els +compassos en els quals totes les notes acaben abans o just al +final del compàs. + +@warning{Una duració incorrecta pot fer que s'inhibeixin els salts +de línia, el que portaria a una sola línia de música molt +comprimida o que se surti de la pàgina.} + +La duració incorrecta es pot trobar fàcilment si s'utilitzen +comprovacions de compàs, vegeu +@rusernamed{Bar and bar number checks,Comprovació de compàs i de número de compàs}. + +Si realment volem tenir una sèrie d'aquests compassos amb notes +solapades, hem d'inserir una línia divisòria invisible on volem +el salt de línia. Per veure més detalls, consulteu +@rusernamed{Bar lines,Barres de compàs}. + + +@node Apareix un pentagrama de més +@unnumberedsubsec Apareix un pentagrama de més +@translationof An extra staff appears + +Si no es creen els contextos explícitament amb @code{\new} o amb +@code{\context}, es crearan discretament tan aviat com es trobi +una instrucció que no es pot aplicar a un context existent. A +partitures senzilles, la creació automàtica dels contextos és +útil, i gairebé tots els exemples dels manuals del LilyPond +s'aprofiten d'aquesta simplificació. Però ocasionalment la +creació discreta de contextos pot fer aflorar pentagrames o +partitures nous o inesperats. Per exemple, podria esperar-se que +el codi següent fet que totes les notes dins del pentagrama +següent estiguessin acolorides de vermell, però de fet el +resultat són dos pentagrames, romanent el de sota amb les +notes amb el color negre predeterminat. + +@lilypond[quote,verbatim,fragment] +\override Staff.NoteHead.color = #red +\new Staff { a' } +@end lilypond + +Això és així perquè no hi ha cap context @code{Staff} quan es +processa la instrucció override de sobreescriptura, es crea un +implícitament i la sobreescriptura s'aplica a aquest context, però +aleshores la instrucció @code{\new Staff} crea un pentagrama nou i +diferent, en el qual es col·loquen les notes. El codi correcte +per acolorir totes les notes de vermell és + +@lilypond[quote,verbatim] +\new Staff { + \override Staff.NoteHead.color = #red + a' +} +@end lilypond + +Com a segon exemple, si una instrucció @code{\relative} s'escriu +dins d'una instrucció @code{\repeat}, el resultat són dos +pentagrames, el segon desplaçat respecte al primer, perquè la +instrucció @code{\repeat} genera dos blocs @code{\relative}, cada +un dels quals crea implícitament blocs @code{Staff} i @code{Voice}. + +@lilypond[quote,verbatim] +\repeat unfold 2 { + \relative { c'4 d e f } +} +@end lilypond + +El problema es resol instanciant el context @code{Voice} +explícitament: + +@lilypond[quote,verbatim] +\new Voice { + \repeat unfold 2 { + \relative { c'4 d e f } + } +} +@end lilypond + + +@node Missatge d'error Unbound variable % +@unnumberedsubsec Missatge d'error Unbound variable % +@translationof Error message Unbound variable % + +Aquest missatge d'error apareix al final dels missatges de la +consola o del fitxer de registre junt a un missatge @qq{GUILE +ha senyalat un error @dots{}} cada cop que es cridi a una rutina +del Scheme que (incorrectament) contingui un comentari @emph{del +LilyPond} enlloc d'un comentari @emph{del Scheme}. + +Els comentaris del LilyPond comencen amb un símbol de +percentatge, (@code{%}), i no s'han d'utilitzar dins de les +rutines del Scheme. Els comentaris del Scheme comencen amb punt i +coma, (@code{;}). + +@node Missatge d'error FT_Get_Glyph_Name +@unnumberedsubsec Missatge d'error FT_Get_Glyph_Name +@translationof Error message FT_Get_Glyph_Name + +Aquest missatge d'error apareix a la sortida de la consola o al +fitxer log de registre si un fitxer d'entrada conté un caràcter que +no és ASCII i no s'ha desat en la codificació de caràcters +UTF-8. Per veure més detalls, consulteu +@rusernamed{Text encoding,Codificació del text}. + +@node Advertiment sobre que les afinitats del pentagrama sols han de decrèixer +@unnumberedsubsec Advertiment sobre que les afinitats del pentagrama sols han de decrèixer +@translationof Warning staff affinities should only decrease + +Aquest advertiment pot aparèixer si no hi ha cap pentagrama a la +sortida impresa, per exemple si sols hi ha un context +@code{ChordName} i un context @code{Lyrics} com a un full guia +d'acords. Els missatges d'advertiment es poden evitar fent que un +dels contextos es comporti com un pentagrama, inserint + +@example +\override VerticalAxisGroup.staff-affinity = ##f +@end example + +@noindent +al començament. Per veure més detalls, consulteu @qq{Espaiat de +les línies que no són pautes} a +@rusernamed{Flexible vertical spacing within systems,Espaiat vertical flexible dins dels sistemes}. + +@node Missatge d'error Unexpected new +@unnumberedsubsec Missatge d'error Unexpected new @code{@bs{}new} +@translationof Error message unexpected new + +Un bloc @code{\score} ha de contenir una @emph{única} expressió +musical. Si en comptes d'això conté diverses instruccions +@code{\new Staff}, @code{\new StaffGroup} o contextos semblants +introduïts amb @code{\new} sense que s'hagin tancat entre +claudàtors corbs, @code{@{ @dots{} @}}, o dobles parèntesis en +angle, @code{<< @dots{} >>}, així: + +@example +\score @{ + % Invàlid! Genera error: error de sintaxi, \new inesperat + \new Staff @{ @dots{} @} + \new Staff @{ @dots{} @} +@} +@end example + +@noindent +aleshores es produirà un missatge d'error. + +Per evitar l'error, tanqueu totes les instruccions @code{\new} +dins dels claudàtors corbs o dobles parèntesis d'angle. + +L'ús de claudàtors corbs introdueix les instruccions @code{\new} +de forma seqüencial: + +@lilypond[quote,verbatim] +\score { + { + \new Staff { a' a' a' a' } + \new Staff { g' g' g' g' } + } +} +@end lilypond + +@noindent +però és més probable que us trobeu utilitzant angles dobles de +manera que els pentagrames nous s'insereixin en paral·lel, és a +dir, simultàniament: + +@lilypond[quote,verbatim] +\score { + << + \new Staff { a' a' a' a' } + \new Staff { g' g' g' g' } + >> +} +@end lilypond diff --git a/Documentation/ca/usage/suggestions.itely b/Documentation/ca/usage/suggestions.itely new file mode 100644 index 0000000000..0e4dc47cd5 --- /dev/null +++ b/Documentation/ca/usage/suggestions.itely @@ -0,0 +1,634 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- + +@ignore + Translation of GIT committish: 45d0e015edc53abebada17a0fdb1d665f7edf900 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c \version "2.19.21" + +@node Suggeriments per escriure fitxers d'entrada +@chapter Suggeriments per escriure fitxers d'entrada +@translationof Suggestions for writing files + +En aquest moment teniu la preparació per començar a escriure +fitxers del LilyPond més grans -- no sols els petits exemples que +apareixen en el tutorial, sinó peces completes --. Però, com heu +de procedir per fer-lo? + +En la mesura que el LilyPond entengui els seus fitxers i produeixi +la sortida que preteníeu, realment no importa massa quin aspecte +tinguin els vostres fitxers. Tot i així existeixen algunes altres +coses a tenir en compte quan s'escriuen fitxers del LilyPond. + +@itemize +@item Què passa si feu un error? L'estructura d'un fitxers del +LilyPond pot fer que certs errors es facin més fàcils (o més +difícils) de trobar. + +@item Què passa si voleu compartir els vostres fitxers amb altres +persones? De fet, i si voleu alterar els vostres propis fitxers +després d'alguns anys? Alguns fitxers del LilyPond s'entenen a +primera vista; d'altres poden portar-vos una hora d'entendre. + +@item Què passa si voleu actualitzar el vostre fitxers del +LilyPond per poder-lo usar amb una versió més recent del programa? + +La sintaxi de l'entrada es modifica de forma ocasional segons el +LilyPond es va perfeccionant. Gairebé tots els canvis es poden +fer de forma automàtica amb @code{convert-ly}, però a alguns +altres els caldria una ajuda manual. Els fitxers del LilyPond es +poden estructura perquè siguin més fàcils (o més difícils) +d'actualitzar. + +@end itemize + +@menu +* Suggeriments de tipus general:: +* Gravació de música existent:: +* Projectes grans:: +* Solució de problemes:: +* Make i els Makefiles:: +@end menu + + +@node Suggeriments de tipus general +@section Suggeriments de tipus general +@translationof General suggestions + +Us presentem alguns suggeriments que us poden servir d'ajuda per +evitar o corregir problemes: + +@itemize +@item @strong{Incloeu els números de @code{\version} a tots els fitxers}. +Adoneu-vos que totes les plantilles contenen informació sobre la +versió (@code{\version}). Us recomanem molt que sempre incloeu la +versió, tot i que els vostre fitxer pugui ser molt petit. Des de +l'experiència personal us podem dir que força frustrant intentar +recordar el número de versió del LilyPond que estàveu fent servir +fa uns anys. @code{convert-ly} requereix que declareu quina +versió del LilyPond fèieu servir. + +@item @strong{Incloeu comprovacions}: +@rusernamed{Bar and bar number checks,Comprovació de compàs i de número de compàs}, +@rusernamed{Octave checks,Comprovació d'octava}. +Si incloeu comprovacions de tant en tant, en cas que cometeu un +error podreu localitzar-lo molt més ràpidament. Amb quina +freqüència és @q{de tant en tant}? Depèn de la complexitat de la +música. Per a una música molt senzilla, potser tan sols una o +dues vegades. Per a una música molt complexa, potser a cada +compàs. + +@item @strong{Un compàs per cada línia de text}. Si hi ha quelcom +molt complicat, ja sigui a la pròpia música o a la sortida que +desitgeu produir, sovint convé escriure un sol compàs per a cada +línia. L'estalvi en espai de pantalla que s'obté acumulant nou +compassos per línia no paga la pena si després heu de @q{depurar} +els fitxers. + +@item @strong{Comenteu els fitxers}. Utilitzeu o bé números de +compàs (de tant en tant), o referències a temes musicals (@q{segon +tema dels violins,} @q{quarta variació,} etc.). Potser que no us +calguin comentaris quan introduïu una peça per primer cop, però si +voleu tornar a ella o modificar quelcom al cap de dos o tres anys, +i també si li passeu la font a un amic, serà tot un desafiament +determinar les seves intencions o de quina menara estava +estructurat el fitxer si no li heu afegit els comentaris. + +@item @strong{Apliqueu marges als claudàtors}. Molts problemes +estan casat per una falta d'equilibri en el nombre de @code{@{} i +@code{@}}. + +@item @strong{Escriviu les duracions explícitament} al començament +de les seccions i identificadors. Si especifiqueu @code{c4 d e} +al principi d'una frase (en lloc de sols @code{c d e}) us podeu +estalviar problemes si reelaboreu la música més tard. + +@item @strong{Separeu els ajustaments} de les definicions +musicals. Consulteu +@rlearning{Estalvi de tecleig mitjançant variables i funcions} i +@rlearning{Fulls d'estil} + +@end itemize + +@node Gravació de música existent +@section Gravació de música existent +@translationof Typesetting existing music + +Si esteu introduint música a partir d'una partitura existent (és a +dir, gravant un full de música ja imprès), + +@itemize + +@item Introduïu al LilyPond cada sistema del manuscrit, o còpia +física, per separat (però manteniu la pràctica d'escriure un +compàs per línia de text), i comproveu cada sistema quan l'hàgiu +acabat. Podeu usar les propietats @code{showLastLength} o +@code{showFirstLength} per accelerar el procés (vegeu +@rusernamed{Skipping corrected music,Omissió de la música corregida}). + +@item Definiu @code{mBreak = @{ \break @}} i inseriu +@code{\mBreak} dins del fitxer d'entrada on el manuscrit tingui un +salt de línia. D'aquesta forma us resultarà molt més fàcil +comparar la música del LilyPond amb l'original. Quan hageu acabat +de revisar la vostra partitura podreu definir +@code{mBreak = @{ @}} per treure tots aquests salts de línia. +Així permetreu el LilyPond col·locar els salts on el LilyPond el +consideri més oportú. + +@item En escriure una part per a un instrument transpositor dins +d'una variable, es recomana que les notes estiguin envoltades dins de + +@example +\transpose c altura-natural @{@dots{}@} +@end example + +@noindent +(on @code{altura-natural} és l'afinació natural de l'instrument) +de forma que la música dins de la variable estigui realment en Do +major. Després podem tornar a transportar-les en sentit invers +quan s'utilitza la variable, si és necessari, però potser no +vulguem fer-lo (per exemple en imprimir una partitura en afinació +de concert, en convertir una part de trombó de clau de Sol a clau +de Fa, etc.). És menys probable cometre errors als transports si +tota la música que està dins de les variables es troba en un to +coherent. + +A més a més, feu els transport exclusivament cap o des de Do +major. Això significa que a part de Do major, les úniques +tonalitats que usarem seran els tons d'afinació dels instruments +transpositors: bes per a una trompeta en Si bemoll, aes per a un +clarinet en La bemoll, etc. + +@end itemize + +@node Projectes grans +@section Projectes grans +@translationof Large projects + +En treballar en projectes grans es fa essencial tenir una +estructura clara als fitxers dels LilyPond: + +@itemize + +@item @strong{Utilitzeu un identificador per a cada veu}, amb un +mínim d'estructura dins de la definició. L'estructura de la +secció @code{\score} és la que canviarà amb major probabilitat: +per contra, és extremadament improbable que canviï la definició de +@code{violí} a versions noves del LilyPond. + + +@example +violí = \relative @{ +g'4 c'8. e16 +@} +@dots{} +\score @{ + \new GrandStaff @{ + \new Staff @{ + \violí + @} + @} +@} +@end example + +@item @strong{Separeu els ajustaments de les definicions +musicals}. Ja s'ha mencionat amb anterioritat, però per a +projectes grans és vital. Potser haurem de canviar la definició +de @code{fdesprésp}, però en aquest cas sols ho haurem de fer un +cop, i encara podrem evitar tocar res dins de @code{violí}. + +@example +fdesprésp = _\markup@{ + \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} +violí = \relative @{ +g'4\fluegop c'8. e16 +@} +@end example + +@end itemize + + +@node Solució de problemes +@section Solució de problemes +@translationof Troubleshooting + +Abans o després escriureu un fitxer que el LilyPond no podrà +compilar. Els missatges que el LilyPond proporciona poden +ajudar-vos a trobar l'error, però en molts casos haureu de portar +endavant algun tipus d'investigació per determinar l'origen del +problema. Les eines més poderoses per a aquest propòsit son el +comentari d'una sola línia (indicat per @code{%}) i el comentari +de bloc (indicat per @code{%@{@dots{}%@}}). Si no sabeu on és el +problema, comenceu convertint seccions grans del fitxer d'entrada +en un comentari. Després d'eliminar una secció convertint-la en +un comentari, proveu a compilar un fitxer un altre cop. Si +funciona, aleshores el problema hauria d'estar a la porció que +havíeu eliminat. Si no funciona, continueu eliminant material +(transformant-lo en comentaris) fins que tingueu quelcom que +funcioni. + +En un cas extrem podríeu acabat amb sols + +@example +\score @{ + << + % \melodia + % \armonia + % \baix + >> + \layout@{@} +@} +@end example + +@noindent +(en altres paraules: un fitxer sense música) + +Si passa això, no abandoneu. Traieu el comentari d'una secció +petita -- diguem-ne la part del baix -- i observeu si funciona. +Si no és així, transformeu en comentaris tota la música del baix +(però deixeu el @code{\baix} de la secció @code{\score} no comentat. + +@example +bajo = \relative @{ +%@{ + c'4 c c c + d d d d +%@} +@} +@end example + +Ara comenceu poc a poc traient comentaris a cada cop més fraccions +de la part del @code{baix} fins que trobeu la línia del problema. + +Una altra tècnica de depuració molt útil és la construcció de +@rweb{Exemples mínims}. + +@node Make i els Makefiles +@section Make i els Makefiles +@translationof Make and Makefiles + +@cindex make, fitxers de +@cindex make + +Possiblement totes les plataformes on pot executar-se el LilyPond +contemplen una possibilitat de programari anomenada @code{make}. +Aquest programa llegeix un fitxer especial anomenat +@code{Makefile} que defineix les relacions de dependència entre +els fitxers i quines instruccions necessitem donar al sistema +operatiu per produir un fitxer a partir d'un altre. Per exemple, +el fitxer de make detallaria com obtenir +@file{balada.pdf} i @file{balada.midi} a partir de @file{balada.ly} +mitjançant l'execució del LilyPond. + +Hi ha ocasions en les quals és una bona idea crear un +@code{Makefile} per al nostre projecte, bé sigui per la nostra +pròpia comoditat o com a cortesia per a altres que possiblement +tinguin accés als nostres fitxers font. Això és cert per a +projectes molt grans amb molts fitxers d'inclusió i diferents +opcions de sortida (per exemple partitura completa, particel·les, +partitura del director, reducció per a piano, etc.), o per a +projectes que requereixen ordres difícils per muntar-los (com els +projectes de @code{lilypond-book}). La complexitat i flexibilitat +dels Mekfiles varia enormement segons les necessitats i +l'habilitat dels autors. El programa GNU Make ve instal·lat a les +distribucions del GNU/Linux i al MacOS X, i també existeix per al +Windows. + +Consulteu el @strong{Manual de GNU Make} per veure tots els +detalls sobre l'ús de @code{make}, atès que el segueix a +continuació ofereix sols una pinzellada de tot els és capaç de fer. + +Les instruccions que defineixen les regles a un fitxer de make +difereixen en funció de la plataforma; per exemple, les diferents +formes del GNU/Linux i del MacOS usen @code{bash}, mentre que el Windows +usa @code{cmd}. Observeu que al MacOS C, hem de configurar el +sistema perquè faci servir l'interpret d'ordres. A continuació +presentem alguns makefiles d'exemple, amb versions tant per al +GNU/Linux/MacOS com per al Windows. + +El primer exemple és per a una obra orquestral en quatre moviments +amb l'estructura de directoris següent: + +@example +Sinfonia/ +|-- MIDI/ +|-- Makefile +|-- Notes/ +| |-- cello.ily +| |-- xifres.ily +| |-- trompa.ily +| |-- oboe.ily +| |-- trioCordes.ily +| |-- viola.ily +| |-- violiU.ily +| `-- violiDos.ily +|-- PDF/ +|-- Particelles/ +| |-- sinfonia-cello.ly +| |-- sinfonia-trompa.ly +| |-- sinfonia-oboes.ly +| |-- sinfonia-viola.ly +| |-- sinfonia-violiU.ly +| `-- sinfonia-violiDos.ly +|-- Partitures/ +| |-- sinfonia.ly +| |-- sinfoniaI.ly +| |-- sinfoniaII.ly +| |-- sinfoniaIII.ly +| `-- sinfoniaIV.ly +`-- sinfoniaDefs.ily +@end example + +Els fitxers @file{.ly} dels directoris @code{Partitures} i +@code{Particelles} obtenen les notes de fitxers @file{.ily} que estan al +directori @code{Notes}: + +@example +%%% principi del fitxer "sinfonia-cello.ly" +\include ../definicionsSinf.ily +\include ../Notes/cello.ily +@end example + +El makefile tindrà els objectius de @code{partitura} (la peça +completa en tot el seu esplendor), @code{moviments} (partitura +completa dels moviments individuals) i @code{particel·les} (parts +individuals per als faristols). També hi ha un objectiu +@code{fitxer} que produeix un fitxer tar de distribució (tarball) +dels fitxers font, adequat per compartir-lo a través de la web o +per correu electrònic. A continuació presentem el makefile per a +GNU/Linux o MacOS C. S'ha de desar amb el nom exacte +@code{Makefile} al directori superior del projecte: + +@warning{Quan es defineix un objectiu o una regla de patró, les +línies següents han de començar amb tabuladors, no amb espais.} + +@example +# nom principal dels fitxers de sortida +nom = sinfonia +# determinació del nombre de processadors +CPU_CORES=`cat /proc/cpuinfo | grep -m1 "cpu cores" | sed s/".*: "//` +# L'ordre per executar el LilyPond +LILY_CMD = lilypond -ddelete-intermediate-files \ + -dno-point-and-click -djob-count=$(CPU_CORES) + +# Els sufixos utilitzats a aquest Makefile. +.SUFFIXES: .ly .ily .pdf .midi + +# Els fitxers d'entrada i de sortida es busquen dins dels directoris relacionats a +# la variable VPATH. Tots ells són subdirectoris del directori +# en curs (donat per la variable de GNU make `CURDIR'). +VPATH = \ + $(CURDIR)/Partitures \ + $(CURDIR)/PDF \ + $(CURDIR)/Particelles \ + $(CURDIR)/Notes + +# La regla de patró per crear fitxers PDF i MIDI a partir fitxers d'entrada LY +# Els fitxers de sortida .pdf es col·loquen al subdirectori `PDF', i els fitxers +# .midi van al subdirectori `MIDI'. +%.pdf %.midi: %.ly + $(LILY_CMD) $<; \ # Aquesta línia comença amb un salt de tabulació + if test -f "$*.pdf"; then \ + mv "$*.pdf" PDF/; \ + fi; \ + if test -f "$*.midi"; then \ + mv "$*.midi" MIDI/; \ + fi + +notes = \ + cello.ily \ + trompa.ily \ + oboe.ily \ + viola.ily \ + violiU.ily \ + violiDos.ily + +# Dependències dels moviments +$(nom)I.pdf: $(nom)I.ly $(notes) +$(nom)II.pdf: $(nom)II.ly $(notes) +$(nom)III.pdf: $(nom)III.ly $(notes) +$(nom)IV.pdf: $(nom)IV.ly $(notes) + +# Dependències de la partitura completa. +$(nom).pdf: $(nom).ly $(notes) + +# Dependències de les particel·les. +$(nom)-cello.pdf: $(nom)-cello.ly cello.ily +$(nom)-trompa.pdf: $(nom)-trompa.ly trompa.ily +$(nom)-oboes.pdf: $(nom)-oboes.ly oboe.ily +$(nom)-viola.pdf: $(nom)-viola.ly viola.ily +$(nom)-violiU.pdf: $(nom)-violiU.ly violiU.ily +$(nom)-violiDos.pdf: $(nom)-violiDos.ly violiDos.ily + +# Teclegeu `make partitura' per generar la partitura completa dels quatre +# moviments com un fitxer únic. +.PHONY: partitura +partitura: $(nom).pdf + +# Teclegeu `make particelles' per generar totes les particel·les +# Teclegeu `make pepet.pdf' per generar la particel·la de +# l'instrument `pepet'. + +# Exemple: `make sinfonia-cello.pdf'. +.PHONY: particellas +particellas: $(nom)-cello.pdf \ + $(nom)-violinUno.pdf \ + $(nom)-violinDos.pdf \ + $(nom)-viola.pdf \ + $(nom)-oboes.pdf \ + $(nom)-trompa.pdf + +# Teclegeu `make moviments' per generar els fitxers dels +# quatre moviments de forma separada. +.PHONY: moviments +moviments: $(nom)I.pdf \ + $(nom)II.pdf \ + $(nom)III.pdf \ + $(nom)IV.pdf + +all: partitura particelles moviments + +fitxer: + tar -cvvf stamitz.tar \ # aquesta línia comença amb un salt de tabulació + --exclude=*pdf --exclude=*~ \ + --exclude=*midi --exclude=*.tar \ + ../Stamitz/* +@end example + +A la plataforma Windows hi ha certes complicacions. Després de +descarregar i instal·lar el programa GNU Make per al Windows, +haurem de configurar la ruta adequada a las variables d'entorn del +sistema de que l'intèrpret d'ordres del DOS pugui trobar el +programa Make. Per fer-lo, polseu amb el botó dret sobre "El meu +ordinador", escolliu @code{Propietats} i @code{Avançades}. Polseu +sobre @code{Variables d'entorn}, i després a la pestanya +@code{Variables del sistema}, seleccioneu @code{Ruta}, polseu +sobre @code{edita} i afegiu la ruta al fitxer executable de GNU +Make, amb la qual cosa quedarà quelcom semblant al següent: + +@example +C:\Fitxers de programa\GnuWin32\bin +@end example + +El makefile en si s'ha de modificar perquè gestioni diverses +instruccions de l'intèrpret d'ordres i perquè pugui tractar amb +els espais que apareixen al nom d'alguns directoris del sistema +predeterminats. L'objectiu @code{fitxer} s'elimina perquè el +Windows no té l'ordre @code{tar}, i el Windows a més té una +extensió predeterminada diferent per als fitxers MIDI. + +@example +## VERSIÓ PER AL WINDOWS +## +nom = sinfonia +LILY_CMD = lilypond -ddelete-intermediate-files \ + -dno-point-and-click \ + -djob-count=$(NUMBER_OF_PROCESSORS) + +#obtenció del nom 8.3 de CURDIR (truc per als espais a PATH) +workdir = $(shell for /f "tokens=*" %%b in ("$(CURDIR)") \ + do @@echo %%~sb) + +.SUFFIXES: .ly .ily .pdf .mid + +VPATH = \ + $(workdir)/Partitures \ + $(workdir)/PDF \ + $(workdir)/Particelles \ + $(workdir)/Notes + +%.pdf %.mid: %.ly + $(LILY_CMD) $< # aquesta línia comença amb un salt de tabulació + if exist "$*.pdf" move /Y "$*.pdf" PDF/ # començament amb tab + if exist "$*.mid" move /Y "$*.mid" MIDI/ # començament amb tab + +notes = \ + cello.ily \ + xifres.ily \ + trompa.ily \ + oboe.ily \ + trioCordes.ily \ + viola.ily \ + violiU.ily \ + violiDos.ily + +$(nom)I.pdf: $(nom)I.ly $(notes) +$(nom)II.pdf: $(nom)II.ly $(notes) +$(nom)III.pdf: $(nom)III.ly $(notes) +$(nom)IV.pdf: $(nom)IV.ly $(notes) + +$(nom).pdf: $(nom).ly $(notes) + +$(nom)-cello.pdf: $(nom)-cello.ly cello.ily +$(nom)-trompa.pdf: $(nom)-trompa.ly trompa.ily +$(nom)-oboes.pdf: $(nom)-oboes.ly oboe.ily +$(nom)-viola.pdf: $(nom)-viola.ly viola.ily +$(nom)-violiU.pdf: $(nom)-violiU.ly violiU.ily +$(nom)-violiDos.pdf: $(nom)-violiDos.ly violiDos.ily + +.PHONY: partitura +partitura: $(nom).pdf + +.PHONY: particelles +particelles: $(nom)-cello.pdf \ + $(nom)-violiU.pdf \ + $(nom)-violiDos.pdf \ + $(nom)-viola.pdf \ + $(nom)-oboes.pdf \ + $(nom)-trompa.pdf + +.PHONY: moviments +moviments: $(nom)I.pdf \ + $(nom)II.pdf \ + $(nom)III.pdf \ + $(nom)IV.pdf + +all: partitura particelles moviments +@end example + +El Makefile següent és per a un document de +@command{lilypond-book} fet en LaTeX. Aquest projecte té un +índex, que requereix executar l'ordre @command{latex} dues vegades +per actualitzar els enllaços. Tots els fitxers de sortida +s'emmagatzemen al directori @code{sortida} per als documents .pdf +i al directori @code{sortidahtml} per a la sortida en format html. + +@example +SHELL=/bin/sh +NOM=elmeuprojecte +DIR_SORTIDA=sortida +DIR_WEB=sortidahtml +VISUALITZADOR=acroread +NAVEGADOR=firefox +LILYBOOK_PDF=lilypond-book --output=$(DIR_SORTIDA) --pdf $(NOM).lytex +LILYBOOK_HTML=lilypond-book --output=$(DIR_WEB) $(NOM).lytex +PDF=cd $(DIR_SORTIDA) && pdflatex $(NOM) +HTML=cd $(DIR_WEB) && latex2html $(NOM) +INDEX=cd $(DIR_SORTIDA) && makeindex $(NOM) +VISTA_PREVIA=$(VISUALITZADOR) $(DIR_SORTIDA)/$(NOM).pdf & + +all: pdf web desar + +pdf: + $(LILYBOOK_PDF) # comença amb un tab + $(PDF) # comença amb un tab + $(INDEX) # comença amb un tab + $(PDF) # comença amb un tab + $(VISTA_PREVIA) # comença amb un tab + +web: + $(LILYBOOK_HTML) # comença amb un tab + $(HTML) # comença amb un tab + cp -R $(DIR_WEB)/$(NOM)/ ./ # + $(NAVEGADOR) $(NOM)/$(NOM).html & # comença amb un tab + +desar: pdf + cp $(DIR_SORTIDA)/$(NOM).pdf $(NOM).pdf # comença amb un tab + +clean: + rm -rf $(DIR_SORTIDA) # comença amb un tab + +web-clean: + rm -rf $(DIR_WEB) # comença amb un tab + +fitxer: + tar -cvvf elmeuprojecte.tar \ # comença amb un tab + --exclude=sortida/* \ + --exclude=sortidahtml/* \ + --exclude=elmeuprojecte/* \ + --exclude=*midi \ + --exclude=*pdf \ + --exclude=*~ \ + ../ElMeuProjecte/* +@end example + +PERFER: aconseguir que funcioni a windows + +El makefile anterior no funciona al Windows. Una alternativa per +als usuaris del Windows seria crear un fitxer de lots senzill que +contingui les ordres de muntatge. Això no segueix les +dependències com ho fa un makefile, però almenys redueix el procés +de construcció a una sola instrucció. Deseu el codi següent com +@command{muntatge.bat} o @command{muntatge.cmd}. El fitxer de lots +es pot executar en la línia d'ordres del DOS o simplement fent +doble clic sobre la seva icona. + +@example +lilypond-book --output=sortida --pdf elmeuprojecte.lytex +cd sortida +pdflatex elmeuprojecte +makeindex elmeuprojecte +pdflatex elmeuprojecte +cd .. +copy sortida\elmeuprojecte.pdf ElMeuProjecte.pdf +@end example + + +@seealso +Manual d'utilització del programa: +@rprogram{Utilització des de la línia d'ordres}, +@rprogram{LilyPond-book} diff --git a/Documentation/ca/usage/updating.itely b/Documentation/ca/usage/updating.itely new file mode 100644 index 0000000000..15567a8799 --- /dev/null +++ b/Documentation/ca/usage/updating.itely @@ -0,0 +1,331 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- + +@ignore + Translation of GIT committish: b381556a3132e765159edc75107b31259dbf5988 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c \version "2.16.0" + + +@node Actualització de fitxers amb convert-ly +@chapter Actualització de fitxers amb @command{convert-ly} +@translationof Updating files with convert-ly + +@cindex actualització d'un fitxer del LilyPond +@cindex convert-ly + +La sintaxi del llenguatge d'entrada del LilyPond es modifica de +forma habitual per a simplificar-la o millorar-la de diferents +maneres. Com a efecte secundari, l'intèrpret del LilyPond sovint +ja no és compatible amb els fitxers d'entrada antics. Per posar +remei a això es pot utilitzar el programa @command{convert-ly} per +actualitzar fitxers a versions més noves del LilyPond. + +@menu +* Perquè canvia la sintaxi?:: +* Invocació de convert-ly:: +* Opcions de la línia d'ordres per a convert-ly:: +* Problemes amb convert-ly:: +* Conversions manuals:: +@end menu + + +@node Perquè canvia la sintaxi? +@section Perquè canvia la sintaxi? +@translationof Why does the syntax change? + +@cindex convert-ly +@cindex actualització de fitxers d'entrada antics + +La sintaxi de l'entrada del LilyPond canvia de manera ocasional. +A mesura que el propi LilyPond millora, la sintaxi (el llenguatge +de l'entrada) es modifica en consonància. A vegades aquests +canvis es fan per aconseguir que l'entrada sigui més fàcil de +llegir i escriure, i d'altres vegades aquests canvis són per +donar cabuda a noves funcionalitats del LilyPond. + +Per exemple, se suposa que tots els noms de les propietats de +@code{\paper} i de @code{\layout} estan escrits sota la norma +@code{primer-segon-tercer}. Tot i així, a la versió 2.11.60, +observem que la propietat @code{printallheaders} no seguia aquesta +convenció. Hauríem de deixar-la tal com està (confonent als nous +usuaris que han de tractar amb un format d'entrada inconsistent), +o canviar-la (empipant als usuaris amb experiència que tenen +partitures antigues)? En aquest cas, vam decidir canviar el nom a +@code{print-all-headers}. Afortunadament, aquest +canvi es pot automatitzar amb la nostra eina +@command{convert-ly}. + +Tanmateix, lamentablement @command{convert-ly} no pot tractar tots +els canvis d'entrada. Per exemple, a la versió 2.4 i anteriors de +LilyPond els accents i les lletres no angleses s'introdueixen +utilitzant el LaTeX: per exemple @code{No\"el} (que significa +@q{Nadal} en francès). Al LilyPond 2.6 i següents el caràcter +especial @code{ë} s'ha d'introduir directament al fitxer del +LilyPond com un caràcter UTF-8. @command{convert-ly} no pot +canviar tots els caràcters especials del LaTeX a caràcters de +UTF-8: haureu d'actualitzar manualment els vostres fitxers del +LilyPond antics. + +Les regles de conversió de @command{convert-ly} funcionen usant +correspondència i substitució de patrons de text enlloc d'una +comprensió profunda de la sintaxi del LilyPond. Això té diverses +conseqüències: +@itemize @bullet +@item +El bon funcionament de la conversió depèn de la qualitat de cada +conjunt de regles que s'apliquen i de la complexitat del canvi +corresponent. A vegades les conversions poden necessitar +correccions manuals, per la qual cosa la versió antiga hauria de +conservar-se a efectes de comparació. +@item +Solament són possibles les conversions de formats més nous: no hi +ha cap conjunt de regles per a la desactualització. Així doncs, +la còpia principal de treball d'un fitxer del LilyPond solament +s'ha d'actualitzar quan ja no hi ha necessitat de seguir mantenint +versions antigues del LilyPond. Els sistemes de control de +versions com ara el Git poden ser de gran ajuda per realitzar el +manteniment de diverses versions dels mateixos fitxers. +@item +Els propis programes del LilyPond i de l'Scheme són força robustos +enfront als espais afegits i suprimits de manera @qq{creativa}, +però les regles utilitzades per @command{convert-ly} tendeixen a +fer certes suposicions d'estil. El millor que pot fer-se és +seguir l'estil que s'usa als manuals per fer actualitzacions +indolores, especialment perquè els propis manuals s'actualitzen +usant @command{convert-ly}. +@end itemize + +@node Invocació de convert-ly +@section Invocació de @command{convert-ly} +@translationof Invoking convert-ly + +@command{convert-ly} utilitza el enunciats @code{\version} dels +fitxers d'entrada per detectar el número de versió antic. En +gairebé tots els casos, per actualitzar el fitxer d'entrada sols +cal executar + +@example +convert-ly -e elmeufitxer.ly +@end example + +@noindent +dins del directori que conté el fitxer. Amb això s'actualitza +@file{elmeufitxer.ly} @emph{in situ} i es preserva el fitxer +original @file{elmeufitxer.ly~}. + +@warning{@command{convert-ly} sempre converteix fins l'últim canvi +de sintaxi que és capaç de gestionar. Això significa que el +número de @code{\version} que apareix al fitxer convertit sol ser +inferior al número de versió del propi programa +@command{convert-ly}.} + +Per convertir d'un cop tots els fitxers d'entrada que hi ha a un +directori, useu + +@example +convert-ly -e *.ly +@end example + +De forma alternativa, si volem especificar un nom diferent per al +fitxer actualitzar, preservant el fitxer original amb el mateix +nom, feu + +@example +convert-ly elmeufitxer.ly > elmeunoufitxer.ly +@end example + +El programa imprimeix una relació dels números de versió per als +que s'han fet conversions. Si no s'imprimeix cap número de +versió, el fitxer ja està actualitzat. + +@noindent +Els usuaris del MacOS@tie{}X poden executar aquesta instrucció sota +el menú @code{Compilar > Actualitzar sintaxi}. + +Els usuaris del Windows han d'introduir aquesta instrucció a una +nova ventana del terminal del sistema, que es troba en general sota +@code{Inici > Accessoris > Símbol del sistema}. + +@node Opcions de la línia d'ordres per a convert-ly +@section Opcions de la línia d'ordres per a @command{convert-ly} +@translationof Command line options for convert-ly + +En general, el programa s'invoca de la manera següent: + +@example +convert-ly [@var{opció}]@dots{} @var{fitxer}@dots{} +@end example + +Es poden donar les opcions següents: + +@table @code +@item -d, --diff-version-update +Incrementa la cadena @code{\version} solament si el fitxer +efectivament ha canviat. En tal cas, la capçalera de versió +correspondrà a la versió següent a l'últim canvi efectiu. Sense +aquesta opció la versió reflecteix l'última conversió que es +@emph{va intentar} fer. + +@item -e, --edit +Aplica les conversions directament al fitxer d'entrada, +modificant-lo in situ. El fitxer original es canvia de nom a +@file{elmeufitxer.ly~}. Aquest fitxer de còpia de seguretat +podria ser un fitxer ocult en alguns sistemes operatius. + +@item -b, --backup-numbered +Quan s'usa amb l'opció @samp{-e}, numera els fitxers de còpia de +seguretat de forma que no se sobreescrigui cap versió anterior. +Els fitxers de còpia de seguretat podrien ser fitxer ocults en +alguns sistemes operatius. + +@item -f, --from=@var{versió_d_origen} +Estableix la versió des de la qual s'ha de convertir. Si no +apareix aquesta opció @command{convert-ly} intentarà endevinar-la, +bastant-se en la instrucció @code{\version} del fitxer. Exemple: +@option{--from=2.10.25} + +@item -h, --help +Imprimeix l'ajuda d'utilització. + +@item -l @var{nivellderegistre}, --loglevel=@var{nivellderegistre} +Fixa el grau en el qual la sortida és detallada a +@var{nivellderegistre}. Els valors possibles són @code{NONE} +(cap), @code{ERROR} (errors), @code{WARNING} (advertiments), +@code{PROGRESS} (avenç;predeterminat) i @code{DEBUG} (depuració). + +@item -n, --no-version +Normalment @command{convert-ly} afegeix un indicador +@code{\version} a la sortida. L'especificació d'aquesta opció el +suprimeix. + +@item -s, --show-rules +Mostra totes les conversions conegudes i surt. + +@item -t, --to=@var{versió_final} +Fixa explícitament a quina @code{\version} convertir, en cas +contrari el valor predeterminat és la versió més actual. Ha de +ser més alta que la versió de partida. + +@example +convert-ly --to=2.14.1 elmeufitxer.ly +@end example + +@end table + +Per actualitzar fragments del LilyPond en fitxer de texinfo, useu + +@example +convert-ly --from=@dots{} --to=@dots{} --no-version *.itely +@end example + +Per veure els canvis en la sintaxi del LilyPond entre dues +versions donades, useu + +@example +convert-ly --from=@dots{} --to=@dots{} -s +@end example + + +@node Problemes amb convert-ly +@section Problemes amb @code{convert-ly} +@translationof Problems running convert-ly + +En executar convert-ly a una finestra del Símbol de Sistema sota +el Windows sobre un fitxer que té espais al nom o la ruta, és +necessari tancar tot el nom del fitxer d'entrada amb tres (!) +parelles de cometes: + +@example +convert-ly """D:/Les meves partitures/Oda.ly""" > "D:/Les meves partitures/nova Oda.ly" +@end example + +Si l'ordre simple @command{convert-ly -e *.ly} no funciona perquè +la instrucció expandida es fa massa llarga, en comptes de fer això +l'ordre @command{convert-ly} es pot posar dins d'un bucle. Aquest +exemple per a UNIX actualitza tots els documents @file{.ly} del +directori actual + +@example +for f in *.ly; do convert-ly -e $f; done; +@end example + +A la finestra del terminal d'ordres del Windows, la instrucció +corresponent és + +@example +for %x in (*.ly) do convert-ly -e """%x""" +@end example + +No es gestionen tots els canvis al llenguatge. Sols es pot +especificar una opció de sortida. L'actualització automàtica del +Scheme i les interfícies Scheme del LilyPond és força improbable; +prepareu-vos per manipular el codi del Scheme a mà. + +@node Conversions manuals +@section Conversions manuals +@translationof Manual conversions + +En teoria, un programa com @command{convert-ly} hauria de poder +tractar qualsevol canvi de sintaxi. Després de tot, un programa +d'ordinador interpreta les versions antiga i nova, per la qual +cosa un altre programa d'ordinador podria traduir un fitxer a +l'altre@footnote{Almenys això és possible en qualsevol fitxer del +LilyPond que no contingui Scheme. Si hi ha Scheme dins del +fitxer, conté un llenguatge Turing-complet, i ens trobem amb el +famós @qq{Problema de l'aturada} informàtica.}. + +Tot i així, el projecte LilyPond compta amb uns recursos limitats: +no totes les conversions s'efectuen automàticament. A continuació +hi ha una llista de problemes coneguts. + +@verbatim +1.6->2.0: +No sempre converteix el baix xifrat correctament, específicament +coses com ara {< +>}. El comentari de Mats sobre com solucionar el +problema: + Per poder executar convert-ly + sobre ell, primer vaig sustituir totes les aparicions de '{<' a quelcom mut com ara '{#' + i de forma semblant vaig sustituir '>}' amb '&}'. Després de la conversió, vaig poder + tornar a canviar-los de '{ #' a '{ <' i de '& }' a '> }'. + No converteix tot l'etiquetatge de text correctament. En sintaxi antiga, + es podien agrupar diverses etiquetes entre parèntesis, per exemple + -#'((bold italic) "cadena") + Això es converteix incorrectament a + -\markup{{\bold italic} "cadena"} + en comptes del correcte + -\markup{\bold \italic "cadena"} +2.0->2.2: + No gestiona \partcombine + No va \addlyrics => \lyricsto, això trenca algunes partitures amb diverses estrofes +2.0->2.4: + \magnify no es canvia per \fontsize. + - \magnify #m => \fontsize #f, on f = 6ln(m)/ln(2) + remove-tag no es canvia. + - \applyMusic #(remove-tag '. . .) => \keepWithTag #'. . . + first-page-number no es canvia. + - first-page-number no => print-first-page-number = ##f + Els salts de línia a les cadenes de capçalera no es converteixen. + - \\\\ com salt de línia a les cadenes de \header => \markup \center-align < + "Primera línia" "Segona línia" > + Els terminadors de crescendo i descrecendo no es converteixen. + - \rced => \! + - \rc => \! +2.2->2.4: + \turnOff (usat a \set Staff.VoltaBracket = \turnOff) no es converteix +adequadament. +2.4.2->2.5.9 + \markup{ \center-align <{ ... }> } s'hauria de convertir a: + \markup{ \center-align {\line { ... }} } + però ara, falta el \line. +2.4->2.6 + Els caràcters especials del LaTeX com $~$ al text no es converteixen a UTF8. +2.8 + \score{} ara ha de començar amb una expressió musical. Qualsevol alta cosa + (en particular, \header{}) ha d'anar després de la música. +@end verbatim diff --git a/Documentation/ca/web.texi b/Documentation/ca/web.texi new file mode 100644 index 0000000000..e87dc7fb07 --- /dev/null +++ b/Documentation/ca/web.texi @@ -0,0 +1,347 @@ +\input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- +@c This file is part of web.texi +@ignore + Translation of GIT committish: 9af671bb61b95c9cb9740e92ddb6cd1a51c1aecf + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + +@setfilename web.info +@settitle LilyPond: notació musical per a tots +@documentencoding UTF-8 +@documentlanguage ca +@afourpaper + +@c @macro copyrightDeclare +@c Copyright @copyright{} 2009--2015 by the authors. +@c @end macro + +@set FDL +@set web +@include macros.itexi +@include weblinks.itexi + +@c don't remove this comment. +@ignore +@omfcreator Graham Percival and Patrick McCarty +@omfdescription General info about the LilyPond music engraving system +@omftype program usage +@omfcategory Applications|Publishing +@omflanguage Catalan +@end ignore + +@c Translators: Walter Garcia-Fontes + +@copying +Copyright @copyright{} 2009--2015 pels autors + +@c next line is necessary for broken pre-4.13 texinfo's +@c install-info, so leave it there until we officially +@c bump the required version. -gp +This file documents the LilyPond website. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.1 +or any later version published by the Free Software Foundation; +with no Invariant Sections. +A copy of the license is included in the section entitled ``GNU +Free Documentation License''. +@end quotation +@end copying + + +@c Info files are no longer installed in a subdirectory, images are +@c expected to be found in lilypond/ subdirectory. +@dircategory GNU LilyPond: el gravador de música +@direntry +* Manual d'aprenentatge del Lilypond:(lilypond-learning). Comenceu per aquí. +* Glosari musical: (music-glossary). Per a usuaris de parla no anglesa +* LilyPond: (lilypond-notation). Referència de la notació amb el Lilypond. +* Fragments de codi del LilyPond: (lilypond-snippets). Consells, trucs i exemples curts. +* Referència de funcionament intern: (lilypond-internals). Definicions pera a la construcció de trucs. +* Utilització del prrograma: (lilypond-usage). Instal·lació i execució de les aplicacions +* Pàgina web: (lilypond-web). Vista prèvia de la nova pàgina. +* lilypond: (lilypond-usage)Executar el Lilypond. Invocar el programa LilyPond. +* abc2ly: (lilypond-usage)Invocació d'abc2ly. Importació d'ABC. +* convert-ly: (lilypond-usage)Actualització de fitxers mitjançant convert-ly. Versions antigues del Lilypond. +* etf2ly: (lilypond-usage)Invocar etf2ly. Importació del Finale. +* lilypond-book: (lilypond-usage)LilyPond-book. Intergrar text i música. +* midi2ly: (lilypond-usage)Invocar midi2ly. Importació de MIDI. +* musicxml2ly: (lilypond-usage)Invocar musicxml2ly. Importació de MusicXML. +@end direntry + + +@c TITLE PAGE +@ifnottex +@node Top +@top LilyPond... notació musical per a tots +@translationof Top +@end ifnottex + + +@c hack for texi2html, bleh -gp +@ifnothtml + +@finalout + +@titlepage +@title LilyPond +@subtitle El gravador de música +@titlefont{Informació general} +@author L'equip de desenvolupament del LilyPond + +@vskip 0pt plus 1filll +@c @vskip 20pt + +@insertcopying + +Per al LilyPond versió @version{} +@end titlepage +@end ifnothtml +@c end hack for texi2html + + +@c ************************ WEBSITE START *************** + + +@divId{pageHeader} +@heading LilyPond + +... notació musical per a tots +@divEnd + +@c @imageId{cmws,web-clef-g-eight-alpha.png,Catchy Musical Web Snippet} +@imageId{lilylogo,double-lily-modified3,png,LilyPond logo} +@c @im ageId{cmws,web-snippet-alpha.png,Catchy Musical Web Snippet} + +@divId{quickSummary} +@subheading ¿Què és el LilyPond? + +El Lilypond és un programa de gravat musical +(tipografia musical o edició de partitures), +consagrat a la producció de partitures de la +qualitat més alta possible. Introdueix l'estètica +de la música gravada de la forma tradicional +a les partitures impreses mijtançant l'ordinador. +Lilypond és programari lliure i forma part del +@uref{http://gnu.org,Projecte GNU}. + + +@divClass{align-right} +Podeu llegir més a la nostra @ref{Introducció}! + +@divEnd +@divEnd + +@divClass{separator} +@divEnd + + +@divId{news} + +@c TODO: generate this automatically, including RSS feed. +@include web/news-front.itexi + +@divClass{float-right} +(@ref{Notícies antigues}) +@divEnd + +@divEnd + +@ifclear web_version + @c do nothing +@end ifclear +@ifset web_version + @c make the box: +@divId{wildCardBox} +@subheading Novetats +@divId{wildCardText} + +@divEnd +@divEnd +@end ifset + +@html + + + +@end html + +@ifset web_version + @c make the box: +@divId{latestVersion} +@subheading Enllaços ràpids + +@c TODO: javascript to detect OS and suggest download? + +@subsubheading Estable + +@ref{Descàrrega, Descàrrega de @versionStable} + +@ref{Manuals, Manuals de @versionStable} + +@subsubheading Desenvolupament + +@ref{Desenvolupament, Descàrrega de @versionDevel} + +@ref{Desenvolupament, Manuals de @versionDevel} + +@divEnd +@end ifset + +@ifnottex + +@divClass{hide} +@menu +* Introducció:: Comenceu aquí a crear partitures musicals. +* Descàrrega:: Obtenir el LilyPond. +* Manuals:: Llegiu els coi de manuals (RTFM). +* Comunitat:: Poseu-vos en contacte amb altres usuaris. +@end menu +@divEnd + +@end ifnottex + +@contents + +@allowcodebreaks false + +@c ****************** GENERAL STUFF FOR INFO ************ +@ignore +Distributions will want to install lilypond.info in postinstall, doing: + + install-info --info-dir=/usr/share/info out[-www]/lilypond-web.info + + * Prepend GNU for dir, must be unique. + + * Do not list the `lilypond' node at toplevel, so that `info lilypond' + goes to Top. + + * List all commands in direntry. + +@end ignore + +@c FIXME: this still doesn't solve the broken links in pdf and big +@c html; we'll need a bunch of @iftext and stuff in here. -gp +@c ****************** SPECIAL MACROS FOR WEB MANUAL ************ +@macro docLinks{name,base,refLink,split,big,bigsize,pdf,pdfsize} +@subheading Llegiu-lo + + +@docLinksBare{\name\,\base\,\refLink\,\split\,\big\,\bigsize\,\pdf\,\pdfsize\} + +@end macro + + +@macro docLinkSplit{name,base,webLink} + @docLink{\name\ (HTML seccionat),\base\/index.html,\webLink\} +@end macro + +@macro docLinkBig{name,base,webLink} + @docLink{\name\ (HTML monolític),\base\-big-page.html,\webLink\} +@end macro + +@macro docLinkPdf{name,base,webLink} + @docLink{\base\.es.pdf,\base\.es.pdf,\webLink\} +@end macro + + +@macro docLinksBare{name,base,refLink,split,big,bigsize,pdf,pdfsize} + +@divClass{keep-bullets} +@itemize + +@item @docLinkSplit{\name\,\base\,\split\} @minus{} + el manual està dividit en moltes pàgines HTML. + @*@ @ @emph{(una descàrrega petita per a cada pàgina)} + +@item @docLinkBig{\name\,\base\,\big\} @minus{} + llegiu aquest manual com una sola pàgina HTML enorme. + @*@ @ @emph{(una sola descàrrega gran, \bigsize\)} + +@item @docLinkPdf{\name\,\base\,\pdf\} @minus{} + descarregueu-lo com un fitxer en format PDF. + @*@ @ @emph{(una sola descàrrega gran, \pdfsize\)} + +@end itemize + +@divEnd + +@end macro + + +@c don't add any extra spaces in this macro -gp +@macro ifWebLinks{webLink,normalLink} +@ifclear web_version + \normalLink\: +@end ifclear +@ifset web_version + \webLink\: +@end ifset +@end macro + + +@ifhtml +@macro contactUsAbout{topic} + +@divClass{heading-center} +@divClass{contactBox} +Si teniu coneixement de qualssevol altres \topic\ que mereixin +aparèixer relacionats aquí, us preguem que ens ho feu saber escrivint un +missatge a la llista de correu bug-lilypond. Tot i que tingueu una +subscripció a la llista, ho podeu fer a la +@uref{https://lists.gnu.org/mailman/listinfo/bug-lilypond,pàgina +informativa} de la llista o escrivint directament mitjançant la +@uref{http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs, +interfície web de lilypond.bugs a gmane}. + + +@divEnd +@divEnd + +@end macro +@end ifhtml + +@ifnothtml +@macro contactUsAbout{topic} +@cartouche +Si teniu coneixement de qualsevol altre \topic\ que podria +aparèixer aquí, si us plau feu-nos-ho saber seguint les instruccions a +@ref{Bug reports}. + +@end cartouche + +@end macro +@end ifnothtml + +@include web/introduction.itexi +@include web/download.itexi +@include web/manuals.itexi +@include web/community.itexi + + +@bye diff --git a/Documentation/ca/web/community.itexi b/Documentation/ca/web/community.itexi new file mode 100644 index 0000000000..8264c97144 --- /dev/null +++ b/Documentation/ca/web/community.itexi @@ -0,0 +1,1284 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- +@ignore + Translation of GIT committish: b4a06339566ce7e7f17ba60745261fc26b32abb0 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@include included/acknowledge.itexi +@include included/authors.itexi +@include included/helpus.itexi + +@node Comunitat +@unnumbered Comunitat +@translationof Community + +@divClass{link-headings} + +@divClass{column-center-top} +@subheading Interactuar amb la comunitat + +@itemize + +@item +@ref{Contacte}: obtenir ajuda, xatejar i, mantenir-se en contacte! + +@item +@ref{Exemples mínims}: són @emph{molt} recomanables quan es parla del LilyPond. + +@item +@ref{Informes de fallades}: alguna cosa ha anat malament. + +@end itemize +@divEnd + +@divClass{column-left-bottom} +@subheading Millorar el LilyPond + +@itemize + +@item +@ref{Presteu la vostra ajuda}: se sol·licita la vostra col·laboració. + + +@item +@ref{Patrocini}: contribucions financeres. + +@item +@ref{Desenvolupament}: per a col·laboradors i pilots de prova. + +@item +@ref{GSoC 2012}: les nostres idees per a l'edició 2012 del «Google +Summer of Code» (Estiu de Codi del Google). + +@item +@ref{Autors}: les persones que han fet el LilyPond el que és. + +@item +@ref{Reconeixements}: projectes i institucions que recolzen el LilyPond + +@end itemize +@divEnd + +@divClass{column-right-bottom} +@subheading Miscel·lània + +@itemize + +@item +@ref{Publicacions}: què hem escrit, i que han escrit sobre nosaltres. + +@item +@ref{Notícies antigues}: l'arxiu. + +@item +@ref{Golfes}: anuncis i registres de canvis de versions antigues. + +@end itemize +@divEnd + +@divEnd + +@divClass{hide} +@menu +* Contacte:: +* Exemples mínims:: +* Informes de fallades:: +* Presteu la vostra ajuda:: +* Patrocini:: +* Desenvolupament:: +* GSoC 2012:: +* Autors:: +* Reconeixements:: +* Publicacions:: +* Notícies antigues:: +* Golfes:: +@end menu +@divEnd + + +@node Contacte +@unnumberedsec Contacte +@translationof Contact + +@divClass{column-left-bottom} +@subheading Discussió i ajuda entre persones usuàries + +@subsubheading Llista de distribució d'usuaris: @code{lilypond-user@@gnu.org} + +Aquesta llista de distribució de correu (en anglès) és el lloc principal que tenen els usuaris per discutir i prestar-se ajuda mútua. + +@quotation +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-user, +subscripció i informació sobre lilypond-user} + +@uref{http://lists.gnu.org/archive/html/lilypond-user/, +arxiu 1 de la llista de usuaris} +@uref{http://www.mail-archive.com/lilypond-user@@gnu.org/, +arxiu 2} +@uref{http://dir.gmane.org/gmane.comp.gnu.lilypond.general, +arxiu 3} + +@uref{http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.general, +escriure a la llista lilypond-user mitjançant el gmane} +@end quotation + +@warning{En formular preguntes, si us plau, utilitzeu @ref{Exemples mínims}!} + +@subsubheading El dipòsit de fragments de codi del LilyPond + +El dipòsit de fragments de codi del LilyPond és una gran +col·lecció d'exemple enviats pels usuaris, que es poden copiar i +usar lliurement en les seves pròpies obres. Vegeu les coses que +han escrit els altres, i afegiu les vostres pròpies! + +@example +@uref{http://lsr.di.unimi.it} +@end example + +Els exemples del LSR que són especialment instructius s'inclouen a +la nostra documentació oficial, a @ref{Snippets}. + +@subsubheading IRC + +Hi existeix un cert grau de suport mitjançant el nostre canal d'IRC, + +@example +@uref{irc://irc.freenode.net/lilypond, #lilypond@@irc.freenode.net} +@end example + +Aquest canal no té arxius públics, per la qual cosa qualsevol +qüestió que pogués ser d'utilitat per als altres usuaris s'hauria +d'enviar preferentment a una de les llistes de correu. + +@html +
nombre de IRC: + + + + +
+ + +@end html + +@subsubheading Altres idiomes + +@quotation +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-es, +llista de correu en espanyol} + +@uref{http://www.lilypondforum.de/, +fòrum alemany} + +@uref{http://groups.google.com/group/lilypond-brasil, +grup de portuguès} + +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-user-fr, +llista de correu en francès} + +@uref{http://www.lilypondforum.nl/, +fòrum d'holandès} +@end quotation + +@divEnd + + +@divClass{column-right-top} +@subheading Esteu sempre informat + +@subsubheading LilyPond Report (l'Informe Lilypond) + +La manera més fàcil d'estar en contacte és llegir el butlletí de +la nostra comunitat, l'Informe LilyPond: + +@example +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net} +@end example + +@subsubheading Llista de correu de llançaments: @code{info-lilypond@@gnu.org} + +Aquesta llista de distribució de correu és una llista de sols +lectura i baix tràfic, que envia notificacions dels últims llançaments. + +@quotation +@uref{http://lists.gnu.org/mailman/listinfo/info-lilypond, +subscripció i informació sobre info-lilypond} + +@uref{http://lists.gnu.org/archive/html/info-lilypond/, +arxiu 1 de la llista info} +@uref{http://www.mail-archive.com/info-lilypond@@gnu.org/, +arxiu 2} +@uref{http://dir.gmane.org/gmane.comp.gnu.lilypond.announce, +arxiu 3} + +@c don't include gmane posting here. -gp +@end quotation + + +@divEnd + + +@divClass{column-right-bottom} +@subheading Discussió entre desenvolupadors + +@subsubheading La llista de distribució de desenvolupadors: @code{lilypond-devel@@gnu.org} + +Quasi tota la discussió entre desenvolupadors té lloc en aquesta +llista. El pegats s'han d'enviar aquí. + +@quotation +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-devel, +subscripció i informació sobre lilypond-devel} + +@uref{http://lists.gnu.org/archive/html/lilypond-devel/, +arxiu 1 de la llista devel} +@uref{http://www.mail-archive.com/lilypond-devel@@gnu.org/, +arxiu 2} +@uref{http://dir.gmane.org/gmane.comp.gnu.lilypond.devel, +arxiu 3} + +@uref{http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.devel, +escriure a la llista lilypond-devel a través del gmane} +@end quotation + + +@subsubheading Llista de fallades: @code{bug-lilypond@@gnu.org} + +La discussió específica sobre fallades es produeix aquí. + +@quotation +@uref{http://lists.gnu.org/mailman/listinfo/bug-lilypond, +subscripció i informació sobre bug-lilypond} + +@uref{http://lists.gnu.org/archive/html/bug-lilypond/, +arxiu 1 de la llista bug} +@uref{http://www.mail-archive.com/bug-lilypond@@gnu.org/, +arxiu 2} +@uref{http://dir.gmane.org/gmane.comp.gnu.lilypond.bugs, +arxiu 3} + +@c don't include gmane posting here. -gp +@end quotation + +@warning{Abans d'enviar un missatge a la llista de fallades, +llegiu les nostres indicacions per elaborar @ref{Informes de fallades}.} + +@divEnd + +@divClass{column-right-bottom} +@subheading Correus delicats + +Els assumptes privats s'han d'enviar a Graham Percival (gestor del +projecte), que els discutirà amb les persones pertinents. + +@divEnd + +@node Exemples mínims +@unnumberedsec Exemples mínims +@translationof Tiny examples + +@divClass{column-center-top} +@subheading ¿Qué són els @qq{exemples mínims}? + +Un exemple mínim és un exemple del que no es pot eliminar @strong{res} +@divEnd + +@divClass{column-left-bottom} +@subheading ¿Perquè crear-los? + +@divClass{keep-bullets} +@itemize + +@item +Quant més simple és l'exemple, més ràpidament poden els +desenvolupadors entendre'l i ajudar-vos. + +@item +Un exemple mínim demostra que us heu esforçat en resoldre el +problema per vos mateix. Quan algú envia blocs grans de codi +d'entrada, dóna la impressió que no li importa que l'ajudem o que +no ho vol. + +@item +La creació d'un exemple mínim us ajuda a entendre el que esta +passant. Molts informes falsos de problemes es podrien evitar +intentant crear un exemple mínim; si no pot reproduir una +@qq{fallada} en un exemple mínim, probablement el problema era una +compressió insuficient sobre el LilyPond, no una veritable fallada! + +@end itemize +@divEnd + +@divEnd + + +@divClass{column-right-bottom} +@subheading Com es fan? + +@divClass{keep-bullets} +@itemize + +@item +Inclou el número de versió en una instrucció @code{\version}. + +@item +Feu-lo petit! Els exemples relacionats amb l'espaiat o la +disposició de les pàgines poden requerir molts compassos, però +gairebé tots els problemes es poden reproduir mitjançant un sols +compàs o menys. + +@item +Quan intenti crear un exemple, provi a convertir en comentaris +@w{(@code{%} o @code{%@{ @dots{} %@}})} diferents seccions del +fitxer. Si podeu convertir un bloc en un comentari i encara mostrar +la idea principal, aleshores elimineu aquest bloc. + +@item +Eviteu la utilització de notes, tonalitats o compassos molt +complicats, a no ser que la fallada estigui relacionada amb el +comportament d'aquests elements. + +@item +No utilitzeu instruccions @code{\override} ni @code{\set} a no ser +que la fallada es refereixi a aquestes instruccions en concret. + +@item +De forma opcional, adjunteu una imatge que mostri el resultat gràfic +que desitgeu. + +@end itemize +@divEnd + +@divEnd + +@divClass{column-center-bottom} +@subheading Quant de petit ha de ser? + +El codi que segueix, és un exemple mínim? + +@example +\version "2.14.1" +\include "catalan.ly" + +\score @{ + \new Staff @{ + \key re \major + \numericTimeSignature + \time 2/4 + 16 8. + %% Aquí: la lligadura d'unió sobre els Re tenen un aspecte graciós + %% Massa alta? El punt final de la mà esquerra no s'alinea + %% amb la lligadura del Si? + ~ + 8 [ ] + @} +@} +@end example + +Bé, no és molt gran, però vet ací un exemple veritablement mínim: + +@example +\version "2.14.1" +@{ + % la lligadura intermèdia té un aspecte graciós aquí: + 8. ~ 8 +@} +@end example + +Molts pocs exemples mínims superen les 10 línies de codi: el més +corrent és que hi hagi prou amb 4 línies per mostrar el problema! + +@divEnd + + +@node Informes de fallades +@unnumberedsec Informes de fallades +@translationof Bug reports + +@divClass{heading-center} +Si té un codi d'entrada que produeix una terminació abrupta o una +sortida defectuosa, això és una fallada. +@divEnd + +@divClass{column-center-top} +@subheading Pas 1: fallades conegudes + +Probablement ja coneixem aquesta fallada. Comproveu-ho aquí: + +@example +@uref{http://code.google.com/p/lilypond/issues/list} +@end example + +@warning{Us preguem que @strong{NO} afegeixi informes de fallades +directament al sistema de seguiment. Un cop que un problema s'ha +afegit al sistema, ja podeu afegir lliurement més informació a +aquest informe.} + +@divEnd + + +@divClass{column-left-bottom} +@subheading Pas 2: creació d'un informe de fallada + +Si heu descobert una fallada que no estigui a la llista, +ajudeu-nos elaborant un informe de fallada. + +@warning{Sols acceptem informes en forma de @ref{Exemples mínims}. +Disposem de recursos molt limitats, per la qual cosa qualsevol +exemple que no sigui mínim serà rebutjats. Gairebé totes les +fallades es poden demostrar amb quatre notes o menys!} + +Vet ací un exemple d'un bon informe de fallada: + +@example +% Accidentals should be printed for only +% the first note in a tie, but this version +% prints flats on both notes. +\version "2.10.1" + +\relative c'' @{ + bes1 ~ + bes1 +@} +@end example + +@divEnd + +@divClass{column-right-bottom} +@subheading Pas 3: enviar l'informe de fallada + +Un copo que heu verificat que el problema no és conegut ja, i heu +creat l'informe, podeu enviar-nos-el! + +@divClass{keep-bullets} +@itemize + +@item +Si esteu subscrit a la llista de correu +@uref{mailto:bug-lilypond@@gnu.org,bug-lilypond@@gnu.org}, +envieu un missatge de la forma habitual. + +@item +Si no esteu subscrit, encara podeu enviar un informe de fallada +amb la +@uref{http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs, +interfície web de gmane per a lilypond.bugs}. + +No obstant, hi ha una comprovació molt estricta que no hi ha +@qq{top-posting} (contestar per sobre) a la interfície de gmane, +que es dispara incorrectament amb freqüència a causa dels fitxers +del LilyPond. +Per evitar-lo, escriviu: + +@example +> I'm not top posting. +@end example + +@noindent +(@emph{heu de} escriure l'angle @code{>} ) al principi del vostre +informe. + +@end itemize +@divEnd +@divEnd + +@divClass{column-center-bottom} +@subheading Pas 4: Esperar resposta + +Un cop que el vostre informe de fallada s'ha enviat a la llista, +el nostre esquadró de fallades l'examinarà. Potser us demanin més +informació. Se us avisarà quen l'informe s'afegeixi al sistema de +seguiment de fallades. Doneu-los un temps de uns 4 dies, ja que +disposem d'un nombre limitat de voluntaris per a aquesta tasca. + +Un cop que la fallada s'ha afegit al sistema de seguiment, podeu +comentar-lo per afegir-li més informació. Podeu marcar la fallada +amb una estrella de forma que rebeu missatges automàticament quan +es produeix cap activitat sobre ella. Això requereix que disposeu +un compte del Google. +@divEnd + +@divClass{column-center-bottom} +@subheading Ajuda opcional: mostrar el resultat desitjat + +Un cop que el problema s'ha afegit al sistema de seguiment, pot +ser de molta ajuda que veiem la sortida desitjada. Amb tota +llibertat afegiu codi d'entrada i/o imatges (creades possiblement +amb altres eines) que mostrin l'aspecte que creieu que ha de tenir! + +@divEnd + + +@node Presteu la vostra ajuda +@unnumberedsec Presteu la vostra ajuda +@translationof Help us + +@divClass{column-center-top} +@helpusNeed + +@divEnd + +@divClass{column-left-top} +@divClass{keep-bullets} +@helpusSimple + +@divEnd +@divEnd + +@divClass{column-right-top} +@helpusAdvanced + +@divEnd + + +@node Patrocini +@unnumberedsec Patrocini +@translationof Sponsoring + +@divClass{keep-bullets} +@divClass{column-left-top} +@subheading Recompenses + +Anteriorment, + +@itemize +@item alguns usuaris han pagat a canvi de noves funcionalitats +@item alguns desenvolupadors han estat contractats per funcionalitats noves +@end itemize + +El projecte LilyPond no organitza aquesta tasques; ni ratifiquem +ni dissuadim acords d'aquest tipus. Tot contracte privat entre +persones individuals és un assumpte d'aquestes persones, no nostre. + +@divEnd + +@divClass{column-right-top} +@subheading Pautes + +Tot usuari que vulgui oferir diners a canvi d'una feina, hauria de +tenir en compte els següents punts: + +@itemize +@item +Els desenvolupadors del LilyPond poden anunciar els seus serveis a +les llistes de correu del LilyPond de tant en tant. + +@item +Tot acord entre persones individuals hauria d'incloure les +precaucions normals quen es fan negocis: qui paga, quant paga, +quin mètode s'utilitzarà per pagar, i sobre quin paquet de +condicions. Suggerim que cap ambigüitat o incertesa en aquest +tipus de qüestions es resolguin abans que comenci qualsevol feina. + +@end itemize + +@divEnd + +@divClass{column-center-bottom} +@subheading Desenvolupadors interessats + +A continuació apareix una llista de les persones que han expressat +interès en rebre recompenses. Observeu que la quantitat de feina +feta per persones individuals varia força al llarg dels anys. No +garantim que aquesta llista estigui actualitzada, ni que les +persones aquí relacionades tinguin qualsevol disponibilitat. +L'únic criteri és "Fulanet ha demanat aparèixer en aquesta pàgina". + +L'examen de la història del sistema de control de versions Git és +una bona manera de determinar quins són els desenvolupadores més +actius i experimentats. Les estadístiques estan al dia fins la +versió @versionDevel{}: + +@multitable @columnfractions .3 .3 .3 +@item @uref{http://lilypond.org/~graham/gitstats-all/, història general} +@tab @uref{http://lilypond.org/~graham/gitstats-1year/, últim any} +@tab @uref{http://lilypond.org/~graham/gitstats-3months/, últims tres mesos} +@end multitable + +Desenvolupadors interessats: +@table @asis +@item @email{dak@@gnu.org, David Kastrup} +Es necessiten donacions perquè pugui continuar la meva actual +feina a temps complet sobre el LilyPond. Em concentro en disseny +d'interfícies d'usuari i del programador, coherència, +implementació, simplificació, documentació i depuració. + +@c Format +@c @item @email{name@@adress.domain, Name} +@c area of interest (256 chars max) + +@end table + +@divEnd +@divEnd + +@node Desenvolupament +@unnumberedsec Desenvolupament +@translationof Development + +@divClass{heading-center} +@ifclear web_version + @heading Materials de desenvolupament per al LilyPond @version +@end ifclear +@ifset web_version + @heading Materials de desenvolupament per al LilyPond @versionDevel +@end ifset + + +@c we normally don't allow named references, but in this case +@c it's good to emphasize the "stable" part. -gp +@warning{Aquestes són les versionns @emph{inestables de +desenvolupment}. Si teniu el més lleuger dubte en torn a com usar +o instal·lar el LilyPond, us comminem a utilitzar la +@ref{Descàrrega, descàrrega estable}, i llegeixi els @ref{Manuals, +manuals estables}.} + +@divEnd + +@divClass{column-center-top} +@subheading Números de versió + +Hi ha dos conjunts de llançaments per al LilyPond: llançaments +estables, i llançament inestables de desenvolupament. Les +versions estables tenen un número de versió @q{menor} parell (per +exemple 2.8, 2.10, 2.12). Les versions de desenvolupament tenen +un número @q{menor} de versió imparell (per exemple 2.7, 2.9, 2.11). + +@divEnd + + +@divClass{column-left-top} +@subheading Descàrrega + +Les instruccions de Git i per a la compilació estan a la Guia del Col·laborador. + +@quotation +@uref{http://git.sv.gnu.org/gitweb/?p=lilypond.git, Dipòsit Git del LilyPond} +@end quotation + +En general els redactors de la documentació i els pilots de proves +voldran descarregar l'últim fitxer binari: + +@quotation + +@downloadDevelLinuxNormal + +@downloadDevelLinuxBig + +@downloadDevelLinuxPPC + +@downloadDevelFreeBSDNormal + +@downloadDevelFreeBSDBig + +@downloadDevelDarwinNormal + +@downloadDevelDarwinPPC + +@downloadDevelWindows + +@downloadDevelSource-ca + +@end quotation + +@divEnd + + +@divClass{column-right-top} +@subheading Guia del col·laborador + +El desenvolupament del LilyPond és un assumpte força complicat. +El LilyPond és un projecte gran i (més o menys) estable. Per +poder ajudar als nous col·laboradors, i per mantenir tot el +sistema (més o menys) estable, hem escrit un manual per als +col·laboradors. + +@docLinksBare{Guia del col·laborador, contribuïdor, + @rcontribnamed{Top,Guía del col·laborador}, + @manualDevelContributorSplit, + @manualDevelContributorBig, 500 kB, + @manualDevelContributorPdf, 2.8 MB} + +@divEnd + + +@divClass{column-center-top} +@subheading Proves de regressió + +@divClass{keep-bullets} + +@ifclear web_version + +@itemize +@item +@item @uref{../../input/regression/collated-files.html, Proves de regressió}: +Proves del llançament actual. +(@uref{../../input/regression/collated-files.pdf, versió PDF}) + +@item +@uref{../../input/regression/musicxml/collated-files.html, Proves de regressió del MusicXML}: +les proves del MusicXML de la versió actual. +(@uref{../input/regression/musicxml/collated-files.pdf, versió PDF}). + +@item +@uref{../../input/regression/abc2ly/collated-files.html, proves de l'abc2ly}: +Les proves de l'abc2ly d'aquesta versió. +(@uref{../../input/regression/abc2ly/collated-files.pdf, versió en PDF}) + +@item +@uref{../../input/regression/lilypond-book/collated-files.html, proves de lilypond-book}: +Les proves del lilpond-book d'aquesta versió. +(@uref{../../input/regression/lilypond-book/collated-files.pdf, versió en PDF}) +@end itemize + +@end ifclear + +@ifset web_version +@subsubheading Versió de desenvolupament + +@itemize +@item @regtestDevel-es (@regtestDevelPdf-ca{}) + +@item @regtestDevelXml-es (@regtestDevelXmlPdf-ca{}) + +@item @regtestDevelAbc (@regtestDevelAbcPdf{}) + +@item @regtestDevelLilypondBook (@regtestDevelLilypondBookPdf{}) +@end itemize + +@subsubheading Versió estable + +@itemize +@item @regtestStable (@regtestStablePdf{}) + +@item @regtestStableXml (@regtestStableXmlPdf{}) + +@item @regtestStableAbc (@regtestStableAbcPdf{}) + +@item @regtestStableLilypondBook (@regtestStableLilypondBookPdf{}) +@end itemize +@end ifset + + +@subsubheading Totes les versions + +@itemize +@item @uref{http://lilypond.org/test, Comparacions entre proves de regressió} + +@item @uref{http://lilypond.org/downloads/binaries/test-output/, +Arxiu de totes les proves de regressió} + +@end itemize + +@divEnd +@divEnd + + + +@divClass{column-center-bottom} +@subheading Manuals + +@ifclear web_version +@warning{Aquests manuals són per al LilyPond @version{}; els +manuals més recents estan a @url{http://lilypond.org}} +@end ifclear + +@divClass{normal-table} +@multitable @columnfractions .3 .3 .3 +@headitem Introducció + +@item +@docLinkSplit{Aprenentatge,learning,@manualDevelLearningSplit-ca} +@tab +@docLinkBig{Aprenentatge,learning,@manualDevelLearningBig-ca} +@tab +@docLinkPdf{Aprenentatge,learning,@manualDevelLearningPdf-ca} + +@item +@docLinkSplit{Glossari,music-glossary,@manualDevelGlossarySplit} +@tab +@docLinkBig{Glossari,music-glossary,@manualDevelGlossaryBig} +@tab +@docLinkPdf{Glossari,music-glossary,@manualDevelGlossaryPdf} + +@item +@docLinkSplit{Essay,essay,@manualDevelEssaySplit} +@tab +@docLinkBig{Essay,essay,@manualDevelEssayBig} +@tab +@docLinkPdf{Essay,essay,@manualDevelEssayPdf} +@end multitable + +@multitable @columnfractions .3 .3 .3 +@headitem Estàndard + +@item +@docLinkSplit{Notació,notation,@manualDevelNotationSplit-ca} +@tab +@docLinkBig{Notació,notation,@manualDevelNotationBig-ca} +@tab +@docLinkPdf{Notació,notation,@manualDevelNotationPdf-ca} + +@item +@docLinkSplit{Utilització,usage,@manualDevelUsageSplit-ca} +@tab +@docLinkBig{Utilització,usage,@manualDevelUsageBig-ca} +@tab +@docLinkPdf{Utilització,usage,@manualDevelUsagePdf-ca} + +@item +@docLinkSplit{Fragments,snippets,@manualDevelSnippetsSplit} +@tab +@docLinkBig{Fragments,snippets,@manualDevelSnippetsBig} +@tab +@docLinkPdf{Fragments,snippets,@manualDevelSnippetsPdf} +@end multitable + +@multitable @columnfractions .3 .3 .3 +@headitem Poc freqüents + +@item +@docLinkSplit{Web,web,@manualDevelWebSplit-ca} +@tab +@docLinkBig{Web,web,@manualDevelWebBig-ca} +@tab +@docLinkPdf{Web,web,@manualDevelWebPdf} + +@item +@docLinkSplit{Canvis,changes,@manualDevelChangesSplit} +@tab +@docLinkBig{Canvis,changes,@manualDevelChangesBig} +@tab +@docLinkPdf{Canvis,changes,@manualDevelChangesPdf-ca} + +@item +@docLinkSplit{Extensions,extending,@manualDevelExtendingSplit-ca} +@tab +@docLinkBig{Extensions,extending,@manualDevelExtendingBig-ca} +@tab +@docLinkPdf{Extensions,extending,@manualDevelExtendingPdf-ca} + +@item +@docLinkSplit{Funcionament intern,internals,@manualDevelInternalsSplit} +@tab +@docLinkBig{Funcionament intern,internals,@manualDevelInternalsBig} +@tab +@docLinkPdf{Funcionament intern,internals,@manualDevelInternalsPdf} +@end multitable + +@ifset web_version +@multitable @columnfractions .3 +@headitem Per descarregar + +@item +@doctarballDevel-ca +@end multitable +@end ifset + + +@divEnd +@divEnd + + + + +@node GSoC 2012 +@unnumberedsec GSoC 2012 +@translationof GSoC 2012 + +@divClass{column-center-top} +@subheading Què és el Google Summer of Code (Estiu del Codi del Google)? + +És un programa global portar a terme pel Google que ofereix a +estudiants una ajuda perquè treballin en projectes de programari +de codi obert durant les vacances d'estiu. + +L'equip del LilyPond va decidir que aquesta era una oportunitat +excel·lent per trobar col·laboradors nous i animar els estudiants +que ja participen en el desenvolupament del LilyPond a què +s'impliquin encara més. Un dels nostre col·laboradors ha estat +seleccionat per a l'edició del program com a part del +@uref{http://www.gnu.org/, project GNU}; esperem poder participar +també a edicions futures. + +@divEnd + +@divClass{column-center-bottom} +@subheading La nostra llista d'idees per al 2012 + +Més a baix hi apareix una llista dels projectes que hem suggerit +per als estudiants del GSoC 2012. Tot i que ha finalitzat el plaç +de sol·licituds, hem decidit mantenir visible aquesta pàgina com +inspiració per a qualsevol persona interessada en el +desenvolupament del LilyPond. Alguns membres de l'equip de +desenvolupament estan disposats a prestar la seva ajuda a aquells +que vulguin implicar-se en aquests projectes. + +Per descomptat, hi ha moltes més coses a millorar al LilyPond, +entre elles algunes de molt petites. Hi ha una llista completa +@uref{http://code.google.com/p/lilypond/issues/list, aquí}. + +@subheading Notes de adorn + +Arreglar problemes amb la sincronització de les notes d'adorn, +junt a tota l'arquitectura subjacent (vegeu +@uref{http://code.google.com/p/lilypond/issues/detail?id=34, el +problema número 34 del nostre sistema de seguiment}). +Les notes d'adorn confonen el sistema de comptabilització de temps +del LilyPond perquè són com anar cap a darrere en el temps. Això +causa efectes estranys, en especial quan un pentagrama té una nota +d'adorn que un altre no té. + +@strong{Dificultat:} mitjana + +@strong{Requisits:} C++, MIDI + +@strong{Recomanat:} familiaritat amb el funcionament intern del LilyPond + +@strong{Mentor(s):} Mike Solomon, Carl Sorensen + +@subheading MusicXML + +Afegir exportació completa del MusicXML i millora de la +importació, junt amb les proves de comprovació que funciona. +Depenent del temps disponible, implementar alguns a tots els següents: + +@divClass{keep-bullets} +@itemize + +@item +Manipulació de l'exportació del contingut musical bàsic com ara +l'exportació MIDI (és a dir, ús de classes exportadores dedicades, +derivades de la classe translator) + +@item +Construir l'arbre XMDL del contingut musical bàsic, i una connexió +des de l'esdeveniment musical a l'etiqueta XML + +@item +Fer que tots els gravadors del LilyPond facin la seva feina + +@item +Afegir la possibilitat d'enllaçar cada objecte de presentació +(bàsicament cada segell o grup de segells) a la causa musical +(així com a l'etiqueta XML dins de l'arbre XML) + +@item +Afegir un @q{rerefons} de sortida XML, que pot després afegir la +informació de disposició per a cadascú dels objectes de sortida a +les etiquetes del XML + +@end itemize +@divEnd + +L'objectiu es considerarà aconseguit quan una partitura +(prèviament seleccionada) pugui importar-se des del MusicXML i +exportada de nou sense cap pèrdua de dades no intencionada. + +@strong{Dificultat:} mitjana + +@strong{Requisits:} MusicXML, Python, coneixement bàsic del LilyPond + +@strong{Mentor(s):} Reinhold Kainhofer, Mike Solomon + +Seria un element al vostre favor la familiaritat amb altres editors +de partitures per poder fer proves creuades. + +@subheading Millora de les lligadures d'unió i d'expressió + +Sovint la forma predeterminada de les corbes de lligadura no és +satisfactòria. No estan contemplades les lligadures d'unió entre +notes enharmòniques @code{@{ dos' - reb' @}}, les lligadores +"trencades" per una clau o un canvi de pauta no estan ben +contemplades. El projecte inclou la recol·lecció i ordenació +d'exemples de sortida defectuosa, decidir sobre la sortida que es +desitja tenir i escriure el codi corresponent. + +@strong{Dificultat:} alta + +@strong{Requisits:} C++, experiència amb heurística de l'escriptura + +@strong{Coneixements recomanats:} LilyPond, sentit estètic + +@strong{Mentor(s):} Mike Solomon + +@subheading Afegir una variant especial dels caràcters gràfics de font tipogràfica +Afegir variants per a alguns caràcters gràfics, como ara els +signes d'alteració, per a línies sobre la pauta, entre pautes, +escurçades i estretes, així com una infraestructura genèrica per +incorporar-los. Un exemple és el cap de la breu d'una notació +antiga, que ve en dues variants, amb l'orifici petit i gran. + +@strong{Dificultat:} fàcil + +@strong{Requisits:} MetaFont, C++, bon ull per als detalls + +@strong{Coneixements recomanats:} coneixements bàsics del LilyPond + +@strong{Mentor(s):} Werner Lemberg + +@subheading Millora del barrat + +Hauria de millorar-se el posicionament predeterminat de les barres +de corxera (i figures menors) normals, de pentagrama creuat, +interrompudes i en angle. El barrat hauria de dependre del +context i de les notes veïnes (vegeu la +@uref{http://icking-music-archive.org/lists/sottisier/sottieng.pdf, +secció 2.2}). +Si és possible, reduir el temps de càlcul del barrat. + +@strong{Dificultat:} mitjana + +@strong{Requisits:} C++, experiència amb heurística de l'escriptura + +@strong{Coneixements recomanats:} sentit estètic + +@strong{Mentor(s):} Mike Solomon, Carl Sorensen + +@subheading Neteja de diversos advertiments de compilació + +Neteja dels advertiments de compilació, anàlisi estàtica del codi, +i advertiments del valgrind. Les eines d'anàlisi automàtica del +codi (advertiments de @code{g++} i @code{clang}) i eines d'anàlisi +com ara la detecció de filtracions de memòria dels perfiladors de +codi valgrind i callgrind aporten informació valuosa sobre +possibles problemes en el codi de C++. La neteja d'aquests +advertiments ens permetria rebutjar automàticament qualsevol pegat +que introduís més advertiments dels que hi ha actualment. + +@strong{Dificultat:} mitjana + +@strong{Requisits:} C++ + +@strong{Mentor(s):} Joe Neeman, Reinhold Kainhofer + +@divEnd + + +@node Autors +@unnumberedsec Autors +@translationof Authors + +@divClass{column-left-top} +@subheading Equip de desenvolupament actual + +@divClass{keep-bullets} +@developersCurrent +@divEnd +@divEnd + +@divClass{column-right-top} +@subheading Càrrecs de l'equip del desenvolupament anterior + +@divClass{keep-bullets} +@developersPrevious +@divEnd +@divEnd + + +@divClass{column-center-top} +@subheading Col·laboradors actuals + +@divClass{keep-bullets} +@subsubheading Programació + +@coreCurrent + +@subsubheading Font tipogràfica + +@fontCurrent + +@subsubheading Documentació + +@docCurrent + +@subsubheading Esquadró de fallades + +@bugsquadCurrent + +@subsubheading Suport + +@supportCurrent + +@subsubheading Traducció + +@translationsCurrent + +@divEnd +@divEnd + + +@divClass{column-center-bottom} +@subheading Col·laboradors anteriors + +@divClass{keep-bullets} +@subsubheading Programació + +@corePrevious + +@subsubheading Font tipogràfica + +@fontPrevious + +@subsubheading Documentació + +@docPrevious + +@c uncomment when we have any previous members -gp +@c @subsubheading Bug squad + +@c @bugsquadCurrent + +@subsubheading Suport + +@supportPrevious + +@subsubheading Traducció + +@translationsPrevious + +@divEnd +@divEnd + +@node Reconeixements +@unnumberedsec Reconeixements +@translationof Acknowledgements + +@divClass{column-center-top} +@subheading Reconeixements + +@divClass{keep-bullets} +@acknowledgementsCurrent +@divEnd +@divEnd + +@node Publicacions +@unnumberedsec Publicacions +@translationof Publications + +@divClass{column-center-top} +@subheading El que nosaltres hem escrit sobre el LilyPond + +@divClass{keep-bullets} + +@include we-wrote.itexi + +@divEnd +@divEnd + +@divClass{column-center-bottom} +@subheading El que uns altres han fet amb el LilyPond + +@divClass{keep-bullets} + +@include others-did.itexi + +@divEnd +@divEnd + +@contactUsAbout{articles acadèmics} + + +@node Notícies antigues +@unnumberedsec Notícies antigues +@translationof Old news + +@divClass{heading-center} +@warning{Hi ha molts anuncis i registres de canvi antics a les +@ref{Golfes}} +@divEnd + +@include web/news-front.itexi + +@include web/news.itexi + + +@node Golfes +@unnumberedsec Golfes +@translationof Attic + +@divClass{column-center-top} +@subheading Anuncis + +Anuncis i notícies per versió: +@uref{http://lilypond.org/doc/v2.16/Documentation/web/index#Lilypond-2_002e16_002e0-released_0021-August-24_002c-2012-1,v2.16}, +@uref{http://lilypond.org/doc/v2.14/Documentation/web/index#LilyPond-2_002e14_002e0-released_0021-June-6_002c-2011,v2.14}, +@miscLink{announce-v2.12,v2.12}, +@miscLink{announce-v2.10,v2.10}, +@miscLink{announce-v2.8,v2.8}, +@miscLink{announce-v2.6,v2.6}, +@miscLink{announce-v2.4,v2.4}, +@miscLink{announce-v2.2,v2.2}, +@miscLink{announce-v2.0,v2.0}, +@miscLink{ANNOUNCE-1.2,v1.2}, +@miscLink{ANNOUNCE-1.0,v1.0}, +@miscLink{ANNOUNCE-0.1,v0.1} + +Llista descriptiva dels canvis per versió: +@uref{http://lilypond.org/doc/v2.16/Documentation/changes/index.html,v2.16}, +@uref{http://lilypond.org/doc/v2.14/Documentation/changes/index.html,v2.14}, +@uref{http://lilypond.org/doc/v2.12/Documentation/topdocs/NEWS,v2.12}, +@uref{http://lilypond.org/doc/v2.10/Documentation/topdocs/NEWS,v2.10}, +@uref{http://lilypond.org/doc/v2.8/Documentation/topdocs/NEWS,v2.8}, +@uref{http://lilypond.org/doc/v2.6/Documentation/topdocs/NEWS,v2.6}, +@uref{http://lilypond.org/doc/v2.4/Documentation/topdocs/out-www/NEWS,v2.4}, +@uref{http://lilypond.org/doc/v2.2/Documentation/topdocs/out-www/NEWS,v2.2}, +@uref{http://lilypond.org/doc/v2.0/Documentation/topdocs/out-www/NEWS,v2.0}, +@uref{http://lilypond.org/doc/v1.8/Documentation/topdocs/out-www/NEWS,v1.8}, +@uref{http://lilypond.org/doc/v1.6/Documentation/out-www/NEWS,v1.6}, +@miscLink{NEWS-1.4,v1.4}, +@miscLink{NEWS-1.2,v1.2} + +@divEnd + +@divClass{column-center-bottom} +@subheading Agraïments + +Gràcies als desenvolupadors, col·laboradors, i caçadors de +fallades i aportadors de suggeriments per +@miscLink{THANKS-2.16,v2.16}, +@miscLink{THANKS-2.14,v2.14}, +@miscLink{THANKS-2.12,v2.12}, +@miscLink{THANKS-2.10,v2.10}, +@miscLink{THANKS-2.8,v2.8}, +@miscLink{THANKS-2.6,v2.6}, +@miscLink{THANKS-2.4,v2.4}, +@miscLink{THANKS-2.2,v2.2}, +@miscLink{THANKS-2.0,v2.0}, +@miscLink{THANKS-1.8,v1.8} + +@divEnd + +@divClass{column-center-bottom} +@subheading Registres de canvis + +Registres de canvis dels desenvolupadors, per versió: +@miscLink{ChangeLog-2.10,v2.10}, +@miscLink{ChangeLog-2.3,v2.3}, +@miscLink{ChangeLog-2.1,v2.1}, +@miscLink{ChangeLog-1.5,v1.5 (1)}, +@miscLink{CHANGES-1.5,v1.5 (2)}, +@miscLink{CHANGES-1.4,v1.4}, +@miscLink{CHANGES-1.3,v1.3}, +@miscLink{CHANGES-1.2,v1.2}, +@miscLink{CHANGES-1.1,v1.1}, +@miscLink{CHANGES-1.0,v1.0}, +@miscLink{CHANGES-0.1,v0.1}, +@miscLink{CHANGES-0.0,v0.0} + +@divEnd diff --git a/Documentation/ca/web/download.itexi b/Documentation/ca/web/download.itexi new file mode 100644 index 0000000000..aa3d94a2f9 --- /dev/null +++ b/Documentation/ca/web/download.itexi @@ -0,0 +1,624 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- +@ignore + Translation of GIT committish: feeca25b207bd510705974896d640ea292cd7fc4 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + +@include included/generating-output.itexi + +@macro warningTextBased +@warning{El LilyPond és un sistema de gravat musical @strong{basat en +text}; s'assembla més a un llenguatge de programació que a un +programa gràfic d'edició de partitures. Abans de descarregar el +LilyPond informeu-vos sobre la nostra @ref{Entrada de text}.} +@end macro + +@node Descàrrega +@unnumbered Descàrrega +@translationof Download + +@divClass{heading-center} +@ifclear web_version + @c yes, we want versionDevel here, since the online links + @c for @version won't be up yet! +@heading Descàrregues per al LilyPond @versionDevel + +@warning{Els enllaços per a la versió estable del LilyPond estan a +@uref{http://lilypond.org, lilypond.org}} +@end ifclear +@ifset web_version + @heading Descàrregues per al LilyPond @versionStable +@end ifset + +@warningTextBased + +@divEnd + +@divClass{link-headings} + +@divClass{column-left-top} +@subheading Per a usuaris + +@itemize + +@item +@c ref is duplicated to avoid underlining ref as image. +@ref{Unix, @sourceimage{logo-linux,,,} +@sourceimage{logo-freebsd,,,}} +@ref{Unix, Unix (GNU/Linux i FreeBSD)} + +@item +@ref{MacOS X, @sourceimage{logo-macosx,,,}} +@ref{MacOS X, MacOS X} + +@item +@ref{Windows, @sourceimage{logo-windows,,,}} +@ref{Windows, Microsoft Windows} + +@end itemize + +@divEnd + +@divClass{column-right-top} +@subheading Per a desenvolupadors + +@itemize + +@item +@ref{Codi font}: +per a mantenidors de paquets + +@item +@ref{Descàrregues antigues}: +versions anteriors + +@item @ref{Desenvolupament}: +última versió de desenvolupament + +@end itemize +@divEnd + +@divEnd + +@divClass{column-center-bottom} + +@subheading Llicència del programari + +El LilyPond està publicat sota la +@ref{GPL, Llicència General Pública del GNU}. +@divEnd + + +@divClass{color1} + +@subheading Patrocinadors + +El nostre agraïment a @uref{http://wwww.vt.edu/, Virginia Tech} i +a @uref{http://www.linuxaudio.org/, linuxaudio.org} per patrocinar +el nostre ample de banda. + +@sourceimage{VTlogo_ITF,,,} +@sourceimage{lao_banner_06_on_white_demo,,,} + +@subheading Legalismes + +@divClass{legal} +Es reconeix el copyright i la marca registrada de tots els +logotips i imatges de productes. + +@logoLegalLinux + +@logoLegalFreeBSD + +@logoLegalMacOSX + +@logoLegalWindows + +@divEnd +@divEnd + + +@divClass{hide} +@menu +* Unix:: +* MacOS X:: +* Windows:: +* Codi font:: +* Descàrregues antigues:: +* GPL:: +@end menu +@divEnd + + +@node Unix +@unnumberedsec Unix +@translationof Unix + +@divClass{heading-center} +@warningTextBased +@divEnd + +@divClass{column-center-top} +@subheading Paquets genèrics, o paquets específics de la distribució? + +Moltes distribucions ja inclouen al LilyPond dins dels seus +dipòsits normals de paquets i amb freqüència són molt més fàcils +d'instal·lar que els paquets genèrics que oferim aquí. Malgrat +això, la versió del LilyPond d'aquests dipòsits podria ser +@emph{significativament} més antiga que la versió estable actual. +Si voleu utilitzar els nostres paquets genèrics, comproveu que el +vostre editor del LilyPond està usant la versió correcta del +programa LilyPond. Vegeu @ref{Entorns millorats}. + +@divEnd + + +@divClass{column-left-top} +@subheading Paquets genèrics + +@subsubheading Descàrrega + +@itemize + +@item +@sourceimage{logo-linux,,,} +@ifclear web_version + @downloadDevelLinuxNormal +@end ifclear +@ifset web_version +@downloadStableLinuxNormal +@end ifset + +(si no teniu seguretat, utilitzeu aquest paquet) + +@item +@sourceimage{logo-linux,,,} +@downloadStableLinuxBig + +@item +@sourceimage{logo-linux,,,} +@downloadStableLinuxPPC + +@item +@sourceimage{logo-freebsd,,,} +@downloadStableFreeBSDNormal + +@item +@sourceimage{logo-freebsd,,,} +@downloadStableFreeBSDBig + +@end itemize + + +@subsubheading Instal·lació + +A la línia d'ordres, escriviu: + +@example +cd CAMÍ-DEL-DIRECTORI-DE-DESCÀRREGA +sh lilypond-@versionStable{}-SISTEMA-OPERATIU.sh +@end example + +@subsubheading Desinstal·lació + +A la línia d'ordres, escriviu: + +@example +uninstall-lilypond +@end example + +@subsubheading Ajuda + +Teclegeu el següent l'intèrpret d'ordres: + +@example +sh lilypond-@versionStable{}-SIST-OPERATIU.sh --help +@end example + +@divEnd + + + +@divClass{column-right-top} +@subheading Paquets específics de cada distribució + +Utilitzeu el gestor de paquets de la seva distribució per +instal·lar o actualitzar a aquestes versions. + +@itemize + +@item +@sourceimage{logo-fedora,,,} +@uref{http://koji.fedoraproject.org/koji/packageinfo?packageID=2447, +Fedora: LilyPond 2.14.2} + +@item +@sourceimage{logo-ubuntu,,,} +@uref{http://packages.ubuntu.com/search?keywords=lilypond, +Ubuntu: LilyPond 2.14.2} + +@item +@sourceimage{logo-slackware,,,} +@uref{http://www.johannes-schoepfer.de/lilypond/, +Slackware: LilyPond 2.14.2} + +@item +@sourceimage{logo-debian,,,} +@uref{http://packages.debian.org/search?keywords=lilypond, +Debian: LilyPond 2.12.3} + +@item +@sourceimage{logo-suse,,,} +@uref{http://software.opensuse.org/search?baseproject=openSUSE%3A11.2&p=1&q=lilypond, +openSUSE: LilyPond 2.12.3} + +@end itemize + +@divEnd + + +@divClass{column-center-top} +@subheading Compilació d'un fitxer + +@lilypadCommandLine + +@divEnd + + +@divClass{column-center-bottom} +@subheading Legalismes + +@divClass{legal} +Es reconeix el copyright i les marques registrades de tots els +logotips i imatges de producte. + +@logoLegalLinux + +@logoLegalFreeBSD + +@divEnd +@divEnd + + +@node MacOS X +@unnumberedsec MacOS X +@translationof MacOS X + +@divClass{heading-center} +@warningTextBased +@divEnd + +@divClass{column-left-top} +@subheading Paquets + +@subsubheading Descàrrega + +@itemize + +@item +@sourceimage{logo-macosx,,,} +@downloadStableDarwinNormal +Per a MacOS X 10.4 o superior sobre +CPU Intel (si no teniu seguretat, utilitzeu aquest paquet). + +@item +@sourceimage{logo-macosx,,,} +@downloadStableDarwinPPC +Per a MacOS X 10.4 o superior sobre +CPUs G3 i G4 (ordinadors Apple antics). + +@end itemize + +@subsubheading Instal·lació + +Feu doble clic sobre el fitxer descarregat. Després, +arrossegueu-lo a on voleu. + +@subsubheading Desinstal·lació + +Esborreu la carpeta LilyPond.app. + +@divEnd + + +@divClass{column-right-top} +@subheading Execució des de la línia d'ordres + +@warning{Si us satisfan les instruccions sobre +la interfície gràfica, ignoreu aquestes instruccions.} + +@subsubheading MacOS X sobre la línia d'ordres + +La forma més pràctica de processar projectes del LilyPond és +mitjançant la preparació de guions @qq{de suport} fets per vos mateix. + +@enumerate + +@item +Creeu un directori per desar aquests guions. + +@example +mkdir -p ~/bin +cd ~/bin +@end example + + +@item +Creu un fitxer anomenat @command{lilypond} que contingui + +@divClass{h-scroll-auto} +@example +#!/bin/bash +exec @var{DIRECTORIO}/LilyPond.app/Contents/Resources/bin/lilypond "$@@" +@end example +@divEnd + +@warning{en general, @var{DIRECTORIO} serà @code{/Applications/}} + + +@item +Creeu fitxers semblants @command{lilypond-book}, +@command{convert-ly}, i qualssevol d'altres que aneu a fer servir, +substituint la part @command{bin/lilypond} amb +@command{bin/convert-ly} (o un altre nom de programa). + + +@item +Feu executable el fitxers, + +@example +chmod u+x lilypond +@end example + + +@item +Ara, afegiu aquest directori a la ruta d'execució. Modifiqueu (o +creeu) un fitxer anomenat @code{.profile} a la vostra carpeta de +l'usuari de forma que contingui + +@example +export PATH=$PATH:~/bin +@end example + +Aquest fitxer ha d'acabar amb una línia buida. + +@end enumerate + + +@subsubheading Invocar els guions individuals + +Els guions (com @command{lilypond-book}, @command{convert-ly}, +@command{abc2ly} o fins i tot el propi @command{lilypond}) estan +inclosos dins del fitxer @code{.app} per a MacOS@tie{}X. + +Els guions també es poden llençar des de la línia d'ordres +mitjançant la seva invocació directa: + +@divClass{h-scroll-auto} +@example +@var{ruta/de}/LilyPond.app/Contents/Resources/bin/lilypond +@end example +@divEnd + +El mateix val per a la resta dels guions d'aquest directori, com +ara @command{lilypond-book} i @command{convert-ly}. + +@divEnd + + +@divClass{column-center-top} +@subheading Compilació d'un fitxer + +@lilypadOSX + +@divEnd + + +@divClass{column-center-bottom} +@subheading Legalismes + +@divClass{legal} +Es reconeix el copyright i la marca registrada de tots els +logotips i imatges de productes. + +@logoLegalMacOSX + +@divEnd +@divEnd + + + +@node Windows +@unnumberedsec Windows +@translationof Windows + +@divClass{heading-center} +@warningTextBased +@divEnd + +@divClass{column-left-top} +@subheading Paquets + +@subsubheading Descàrrega + +@itemize + +@item +@sourceimage{logo-windows,,,} +@downloadStableWindows +Per a Windows 2000, XP, Vista, Windows 7 i 8. + +@end itemize + +@subsubheading Instal·lació + +@enumerate + +@item +Ubiqueu el fitxer descarregat i feu doble clic sobre ell per a +iniciar l'instal·lador. Seguiu les instruccions que us indica +l'instal·lador; us recomanem que deixeu seleccionades totes les +opcions d'instal·lació i que utilitzeu el camí d'instal·lació +predeterminat. Cliqueu sobre el botó @q{finalitzar} quan +l'instal·lador acabi. El LilyPond està instal·lat. + +@end enumerate + +@subsubheading Desinstal·lació + +Per a la desintal·lació, escolliu entre: + +@enumerate + +@item +Ubicar l'apartat del LilyPond al menú Inici i escollir +@q{Desinstal·la}. Cliqueu el botó @q{Finalitza} quan acabi el +programa de desintal·lació. + +@end enumerate + +@divEnd + + +@divClass{column-right-top} +@subheading Execució des de la línia d'ordres + +@warning{Si us satisfan les instruccions sobre la interfície gràfica, ignoreu aquestes instruccions.} + +@subsubheading Windows sobre la línia d'ordres + +La forma més convenient d'executar el LilyPond és afegir la +carpeta que conté els fitxers executables del programa a la +variable d'entorn @qq{Path}. + +@enumerate +@item +Obriu l'apartat @qq{Sistema} al Panell de Control, escolliu la +pestanya Avançat i cliqueu sobre el botó Variables d'entorn. + +@item +Escolliu la variable @qq{Path} de la llista de variables d'entorn +i cliqueu el botó Edita. S'obrirà una finestra amb el títol +@qq{Edita una variable del sistema}: afegiu al final del @qq{Valor +de la variable} el nom de la carpeta que conté els fitxers +executables del LilyPond de la manera següent: + +@example +[@var{ruta preestablecida}];@var{CARPETA}\LilyPond\usr\bin +@end example + +@warning{@var{CARPETA} serà en general @code{C:@bs{}Fitxers de programa}.} + +@noindent +i cliqueu el botó @qq{Accepta} per tancar la finestra. + +@end enumerate + +@subsubheading Invocar fitxers executables individuals + +Els fitxers executables del LilyPond (com ara lilypond, +lilypond-book, convert-ly i així successivament) es poden executar +des de la línia d'ordres, invocant-los: + +@example +lilypond prova.ly +@end example + +@divEnd + + +@divClass{column-center-top} +@subheading Compilació d'un fitxer + +@lilypadWindows + +@divEnd + + +@divClass{column-center-bottom} +@subheading Legalismes + +@divClass{legal} +Es reconeix el copyright i la marca registrada de tots els +logotips i imatges de productes. + +@logoLegalWindows + +@divEnd +@divEnd + + + +@node Codi font +@unnumberedsec Codi font +@translationof Source + +@divClass{heading-center} +@warningTextBased +@divEnd + +@warning{@strong{No} recomanem que intenteu compilar el LilyPond +per vos mateix; gairebé totes les necessitats de l'usuari se +satisfan millor amb la versió precompilada.} + +@divClass{column-left-bottom} +@subheading Tarball del codi font + +@downloadStableSource-ca{} + +Per veure un ampli llistat de totes les versions (antigues i +modernes), consulteu la nostra +@uref{http://download.linuxaudio.org/lilypond/source/?C=N;O=D, pàgina +de descàrrega}. + +@divEnd + +@divClass{column-right-bottom} +@subheading Instruccions de compilació + +Les instruccions es troben desenvolupades dins de +@rcontribnamed{Compiling,Compilació del LilyPond}. + +@divEnd + + +@node Descàrregues antigues +@unnumberedsec Descàrregues antigues +@translationof Old downloads + +@divClass{heading-center} +@warningTextBased +@divEnd + +@divClass{column-center-top} +@subheading Totes les versions + +Per veure un ampli llistat amb totes les versions (antigues i +modernes), consulteu la nostra +@uref{http://download.linuxaudio.org/lilypond/binaries/, pàgina de +descàrrega}. + +@divEnd + + +@node GPL +@unnumberedsec GPL +@translationof GPL + +@divClass{column-center-top} +@subheading Llicència de programari + +El GNU LilyPond està publicat sota la Llicència General Pública de +GNU. S'ofereix una introducció a aquesta llicència i als nostres +motius per haver-la escollit, a @ref{Llibertat}. + +@divEnd + +@divClass{column-center-bottom} +@subheading Llicència General Pública de GNU + +@include gpl.itexi + +@divEnd diff --git a/Documentation/ca/web/introduction.itexi b/Documentation/ca/web/introduction.itexi new file mode 100644 index 0000000000..6348f98989 --- /dev/null +++ b/Documentation/ca/web/introduction.itexi @@ -0,0 +1,1452 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- +@ignore + Translation of GIT committish: feeca25b207bd510705974896d640ea292cd7fc4 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + + +@node Introducció +@unnumbered Introducció +@translationof Introduction + +@divClass{column-center-top} +@subheading Les nostres metes + +@imageFloat{flat-design,png,right} + +El LilyPond va aparèixer quan dos músics van voler anar més enllà +de la inexpressiva aparença de la música impresa mitjançant +ordinador. Els músics prefereixen llegir partitures boniques, així +que perquè no haurien de poder els programadors crear un programari +per produir partitures elegants? + +El resultat és un sistema que allibera els músics de preocupar-se +pels detalls de la disposició sobre el paper, cosa que els permet +centrar-se en la música. LilyPond treballa colze a colze amb ells +per crear partitures de qualitat editorial, realitzades dins de +les millors tradicions del gravat musical clàssic. + +@divEnd + +@divClass{link-headings} + +@divClass{column-left-top} +@subheading Què fa el Lilypond + +@itemize + +@item +@ref{Possibilitats}: ¿Què pot fer el LilyPond? + +@item +@ref{Exemples}: Vull veure alguna música! + +@item +@ref{Llibertat}: El LilyPond és programari lliure. + +@item +@ref{Rerefons}: La nostra estètica computacional. + +@end itemize +@divEnd + +@divClass{column-right-top} +@subheading El LilyPond a la pràctica + +@itemize + +@item +@ref{Produccions}: Usos del LilyPond a la vida real. + +@item +@ref{Ressenyes}: Què diu la gent? + +@end itemize +@divEnd + +@divClass{column-center-bottom} +@subheading Com funciona el LilyPond +@itemize + +@item +@ref{Entrada de text}: Escriviu música com si fos @emph{text}?! + +@item +@ref{Entorns millorats}: Altres formes de treballar amb el LilyPond. + +@end itemize +@divEnd + +@divEnd + +@c TRANSLATORS, translations are not yet compiled in Info format, so +@c it's not worth translating the right column of the following +@c menu. -JM +@divClass{hide} +@menu +* Possibilitats:: Què pot fer el Lilypond? +* Exemples:: Vull veure alguna música! +* Llibertat:: La llibertat i la GPL. +* Rerefons:: Estètica computacional. +* Produccions:: Ús del LilyPond a la vida real. +* Ressenyes:: Què diu la gent sobre el Lilypond? +* Entrada de text:: Escriviu música com si fos @emph{text}?! +* Entorns millorats:: Altres formes de treballar amb el Lilypond. +@end menu +@divEnd + + + +@node Possibilitats +@unnumberedsec Possibilitats +@translationof Features +@divClass{column-center-top} + + +@subheading Elegància +@subsubheading Excel·lència al gravat clàssic + +@imageFloat{flat-design,png,right} + +El LilyPond permet als músics produir partitures elegants que +siguin fàcils de llegir. La seva comunitat de desenvolupadors ha +empleat milers d'hores a desenvolupar un programa de gravat +musical que produeix com a resultat música impresa de forma +bella. Tots els ajustos d'estil del LilyPond, el disseny dels +tipus de lletra i els algoritmes s'han inspirat en la millor +música gravada a mà. La sortida del Lilypond té el mateix aspecte +robust, equilibrat i elegant que les partitures clàssiques millor +gravades. Tot això s'explica amb detall a la nostra @ressaynamed{Essay,Monografia}. + + +@subsubheading Opcions d'aspecte efectives + +Perdeu menys temps als ajustos de la sortida; el LilyPond +aconsegueix el format més correcte des del principi. Determina +l'espaiat per si sol i divideix les línies i les pàgines de forma +que ofereix una disposició compacta i uniforme. Els conflictes +entre la lletra de les cançons, les notes i els acords es resolen, +i les lligadures i les barres s'inclinen automàticament. + +@divEnd + +@divClass{color2} +@subheading Facilitat d'ús + +@imageFloat{lilypond-book,png,right} + +@subsubheading Entrada basada en text + +LilyPond agafa una entrada en text normal, que podem elaborar en +el nostre editor de text de preferència, de forma ràpida i +còmoda. L'entrada de text conté tota la informació, de manera que +no hi ha necessitat de recordar complexes seqüències +d'instruccions: tans sols deseu un codi d'entrada perquè serveixi +com a referència futura. + +@subsubheading Combinar música i text + +Col·loqueu fragments de música dins de textos sense retallar i +enganxeu imatges. Integreu música dins del @LaTeX{} i de l'HTML de forma +senzilla, o afegiu música a documents de l'OpenOffice o del +LibreOffice mitjançant OOoLilyPond. També hi ha connectors o +complements disponibles per permetre codi del LilyPond dins de +diversos blogs i wikis, fent possible la col·laboració en línia. + +@subsubheading Accessibilitat + +L'entrada basada en text també fa possible l'escriptura de +partitures per a usuaris amb deficiències físiques. Els usuaris +amb alguna dificultat manual que no poden teclejar o usar un ratolí +d'ordinador, poden usar programari de reconeixement de veu per +editar els fitxers del LilyPond. Fins i tot les persones totalment +cegues poden usar lectors de pantalla per escriure els fitxers del +Lilypond (una tasca impossible als programes d'edició de +partitures basats en gràfics). + +@subsubheading Disseny ampliable + +Tots els paràmetres de configuració es poden modificar perquè es +combinin amb el vostre gust tipogràfic personal. Si això no és +suficient, sempre ens queda el llenguatge de scripts Scheme +incorporat, un dialecte del potent llenguatge LISP. Tots els +paràmetres de configuració, variables i funcions estan documentats +al complet manual de referència del programa. + +@divEnd + +@divClass{color3} + +@subheading Entorn + +@imageFloat{frescobaldi-lilypond-editor-small,png,right} + +@subsubheading Programari lliure + +El LilyPond es pot descarregar sense cost! Sí: és +gratis. Obteniu-lo a la pàgina de descàrrega. + +També és programari lliure, com la llibertat +d'expressió. S'ofereix amb el codi font amb el permís de +modificar-lo i copiar-lo. Així doncs, esteu fart d'alguna fallada +o demaneu alguna funcionalitat determinada? Tan sols afegiu-la +personalment, o pagueu a algú que ho faci. + +@subsubheading Excel·lent suport + +El LilyPond funciona amb totes les plataformes populars: +GNU/Linux, MacOS X i Windows. El LilyPond ve amb una completa +documentació i centenars de fitxers d'exemple. Hi ha una activa +comunitat d'usuaris disposada a respondre dubtes i qüestions a la +llista de distribució de correu d'usuaris del LilyPond, +lilypond-user, a l'hora que l'equip de desenvolupament assegura +que els problemes es resolen amb rapidesa. + +@subsubheading Editors millorats + +Diversos desenvolupadors que són a l'hora usuaris actius del +Lilypond han escrit eines orientades específicament a fer més +fàcil i efectiu el procés d'editar fitxers del LilyPond. Per veure +alguns exemples, consulteu @ref{Entorns millorats}. + +@divEnd +@divClass{column-center-bottom} +@subheading Ara què? + +Encara no us convenç el LilyPond? Doneu una ullada a alguns +@ref{Exemples} concrets. Si ja heu decidit provar el LilyPond, en +primer lloc informeu-vos de la nostra @ref{Entrada de text}. +@divEnd + + + +@node Exemples +@unnumberedsec Exemples +@translationof Examples + +El LilyPond és una eina potent i flexible per a tasques de gravat +musical de tot tipus. Exploreu lliurement la nostra galeria +d'exemples i inspireu-vos! + +@newsItem +@subsubheading Música Clàssica + +Aquesta peça d'òrgan del J.S. Bach és un projecte força típic de +gravat amb el LilyPond. + +@exampleImage{bach-bwv610} +@newsEnd + +@newsItem +@subsubheading Notació complexa + +Aquest exemple procedent de les @emph{Goyescas} de l'Enric +Granados mostra algunes de les possibilitat més avançades de la +composició tipogràfica, com ara les barres en angle, vírgules de +pentagrama creuat i línies de seguiment de veus. + +@exampleImage{granados} +@newsEnd + +@newsItem +@subsubheading Música antiga + +El LilyPond també contempla diferents tipus de notació antiga, +com ara aquest passatge de cant gregorià. + +@exampleImage{ancient-headword} +@newsEnd + +@newsItem +@subsubheading Música moderna + +Els compositors contemporanis troben que el LilyPond és adequat +per a la impressió de notació inusual. Heus aquí un extracte de +l'obra @emph{Čáry}, del Trevor Bača, per a flauta baixa sola. + +@exampleImage{cary} +@newsEnd + + +@newsItem +@subsubheading Creació flexible i eficient de material d'interpretació + +Es poden crear diferents materials de lectura a partir del mateix +codi font. Heus aquí un extracte de la realització del +@uref{http://nicolas.sceaux.free.fr/, Nicolas Sceaux} de @emph{Giulio +Cesare} del Haendel, en partitura completa, reducció per a piano y +veu, i una particel·la de violí. + +@exampleImage{sesto-full} + +@exampleImage{sesto-piano} + +@exampleImage{sesto-violin} + +@newsEnd + +@newsItem +@subsubheading Tabulatura + +El LilyPond contempla la notació de xifra per a guitarra, que es +pot personalitzar per adaptar-la a qualsevol instrument que +llegeixi de tabulatura. La pauta de tabulatura es genera +automàticament a partir de les notes que s'escriuen al pentagrama +normal. + +@exampleImage{tab-example} +@newsEnd + +@newsItem +@subsubheading Gràfics de Schenker + +La sortida estàndard es pot modificar de forma molt +profunda. Heus aquí una impressionant anàlisi schenkeriana creada +pel Kris Schaffer, per a un article a la revista +@uref{http://www.linuxjournal.com/article/8364 , Linux +Journal}. S'han afegit alguns colors per millorar la visibilitat. + +@exampleImage{bach-schenker} +@newsEnd + +@newsItem +@subsubheading Música vocal + +El LilyPond és excel·lent per a tot tipus de música vocal, des +d'himnes de música sacra fins a òperes. A continuació presentem un +motet medieval amb uns requisits lleugerament inusuals. La veu de +tenor està escrita en un compàs diferent a les altres però s'ha +d'alinear com si estigués al mateix compàs. El LilyPond tracta +aquesta situació amb molta elegància. Observeu també els incípit +amb les claus a l'estil de l'edició vaticana, les vírgules +barrades que indiquen notes repetides, i els claudàtors de +lligadura per sobre de certs grups de notes. + +@exampleImage{aucun-snippet} +@newsEnd + +@newsItem +@subsubheading Aplicacions per a l'educació + +El LilyPond està molt indicat també per a aplicacions +educatives. Heus aquí un exemple d'un senzill exercici de +contrapunt. + +@exampleImage{theory} +@newsEnd + +@newsItem +@subsubheading Música pop + +És senzill crear fulls guia d'acords en xifrat americà per a +música pop amb melodia, lletra, noms d'acords i diagrames de +posicions d'acord. En aquest exemple veiem alguns dels diagrames +de posicions predefinides, però es poden personalitzar +profundament per complir amb gairebé qualsevol situació. + +@exampleImage{chart} +@newsEnd + +@newsItem +@subsubheading Projectes grans + +El LilyPond és excel·lent per a projectes grans com ara òperes o +també obres per a orquestra simfònica. A més a més, l'entrada +basada en text proporciona una major accessibilitat (aquest exemple +ha estat aportat per Hu Haipeng, un compositor cec). + +@exampleImage{orchestra} +@newsEnd + + +@divClass{column-center-bottom} +@subheading Ara què? + +Encara no us convenç el LilyPond? El LilyPond és programari +lliure, us concedeix, com a usuari, la @ref{Llibertat}. Si ja voleu +provar el LilyPond, llegiu primer el que tenim a dir-vos sobre la +@ref{Entrada de text}. +@divEnd + + +@node Llibertat +@unnumberedsec Llibertat +@translationof Freedom + +@divClass{column-center-top} +@subheading Software lliure + +@uref{http://www.gnu.org/, GNU} El LilyPond està escrit i +mantingut per una comunitat d'entusiastes. Està publicat sota la +@ref{GPL, Llicència General Pública de GNU} i la @ref{FDL, +Llicència de Documentació Lliure de GNU}, donant a tothom la +llibertat d'arreglar, modificar i ampliar el programa. La creació +de música bella no hauria de requerir centenars d'euros en programari! +@divEnd + + +@c @divClass{column-left-top} +@divClass{color2} +@divClass{keep-bullets} +@subheading Quins són els beneficis per als usuaris? + +@itemize + +@item +Sense cost: descarregueu-lo i proveu-lo! Que podeu perdre? + +@item +Compartir: si us agrada el programa passeu una còpia a les vostres +amistats, professors i professores, alumnes i col·legues! + +@item +Disponibilitat de la font: si teniu curiositat sobre com el +LilyPond crea algun tipus de notació musical, podeu veure +exactament com està feta. + +@item +Ampliable: podeu afegir possibilitat, corregir errors i canviar el +funcionament. Si no sabeu programar, podeu contractar a algú +programador perquè faci aquestes tasques. + +Això pot sembla poc atractiu per a músics ocasionals, però la +capacitat d'expandir el programari pot ser molt valuosa per als +compositors seriosos, empreses i acadèmics. + +@item +Seguretat per al futur: si una empresa comercial fa fallida, que +passa amb qualsevol música electrònica que depengui dels seus +productes? Això no és un problema amb el LilyPond; fins i tot si +tot l'equip de desenvolupament l'abandonés (cosa extremadament +improbable), el programa encara seguiria estant disponible de +forma legal per a la seva còpia, modificacions i distribució. + + +@end itemize + +@divEnd +@divEnd + + +@c @divClass{column-right-top} +@divClass{color3} +@divClass{keep-bullets} +@subheading Perquè @@{regalen} els desenvolupadors del LilyPond la +seva feina sense demanar res a canvi? + +Gairebé tots nosaltres veiem el desenvolupament del LilyPond com un +hobby o un treball voluntari. Això doncs, la pregunta és realment +@qq{perquè les persones es presten voluntàries?} + +@itemize + +@item +Per diversió: el treball a la recerca d'una meta pot ser divertit, +especialment quan treballes en equip! + +@item +Metes comuns: tots nosaltres volem partitures amb bon aspecte, +però són pocs els que tenen experiència (i cap té temps) per crear +un programa que pugui fer front a totes les situacions. Treballant +en equips (una persona millora el codi que traça les barres de +corxera, una altra millora la forma de les lligadures i una +tercera escriu documentació explicant com utilitzar aquestes +possibilitats) podem assolir la nostra meta amb tan sols una +fracció de l'esforç individual. + +@item +La @qq{cultura del regal}: el moviment del programari lliure ha +creat molts projectes genials de programari, com ara +@uref{http://kernel.org/, GNU/Linux}, +@uref{http://www.getfirefox.com/, Mozilla Firefox} i el joc +@uref{http://www.wesnoth.org/, Battle for Wesnoth}. Després +d'haver-se vist beneficiats per aquests projectes, alguns +desenvolupadores desitgen @qq{retornar} alguna cosa a la +comunitat. + +@item +Experiència laboral: les contribucions a projectes de programari +lliure són una magnífica forma de practicar la programació, +l'escripture de documentació, la traducció de documentació o el +disseny. Aquesta experiència ha ajudat a molts programadors a +trobar feina a empreses o a universitats. + +@end itemize + +@divEnd +@divEnd + + +@divClass{column-center-bottom} +@subheading I ara què? + +Encara no us convenç el LilyPond? Llegiu el nostre estens assaig +sobre la nostra filosofia del gravar a @ref{Rerefons}. Si ja voleu +provar el LilyPond, en primer lloca llegiu el que hem escrit sobre +la @ref{Entrada de text}. +@divEnd + + +@node Rerefons +@unnumberedsec Rerefons +@translationof Background + +@divClass{column-center-top} +@subheading Monografia sobre el rerefons + +Tenim una àmplia monografia que descriu l'estètica computacional: l'art +de crear bellesa amb un ordinador. + +Si tan sols voleu una introducció ràpida al LilyPond, llegir tot +el material que constitueix la monografia podria ser massa. Si voleu +llegir-lo ara, continueu cap a @ressaynamed{Essay,Monografia}. +@divEnd + +@divClass{column-center-bottom} +@subheading I ara què? + +Encara no us convenç el LilyPond? Llegiu quelcom sobre les +@ref{Produccions} i partitures d'alguns dels nostres usuaris. Si +ja voleu provar el LilyPond, en primer lloc llegiu alguna cosa +sobre la nostra @ref{Entrada de text}. +@divEnd + + +@node Produccions +@unnumberedsec Produccions +@translationof Productions + +@divClass{column-left-top} +@subheading Concerts + +La música tipografiada amb el LilyPond s'ha utilitzat en +interpretacions i actuacions per tot el mon. Alguns titulars: + +@divClass{keep-bullets} +@itemize + +@item +@uref{http://www.aurelienbello.com/,Aurélien Bello} ha +reorquestrat @emph{Der Ring des Nibelungen} del Richard Wagner a una +@uref{http://www.rsb-online.de/content/konzerte/wagnerzyklus-10-13/wagner-fuer-kinder/index_ger.html, per a nens} de 100 minuts de +durada. Està escrita per a orquestra simfònica estàndard però amb +una plantilla reduïda de cantants, i s'interpretarà per la +@emph{Radio-Sinfonieorchester Berlin} els dies 5 i 6 d'abril de +2014 a l'Atze Musiktheater de Berlín. El director és el Heiko +Matthias Förster. + +@item +El Joe Smeets va crear partitures per al llibre infantil @emph{Zing +Mee} (@emph{Canta amb mi}) de l'Annie M.G. publicat per Querido +(ISBN 9789045106205): +@uref{http://www.queridokinderenjeugdboeken.nl/web/Boek.htm?dbid=18954&typeofpage=134707, +www.queridokinderenjeugdboeken.nl}; partitures d'assaig de cor +per a la traducció holandesa del @emph{Saint Nicolas} del Benjamin +Britten realitzat per @emph{Muziektheater Hollands Diep} el 2011, +@uref{http://www.muziektheaterhollandsdiep.nl/nl/voorstellingen/sint_nicolaas_leeft, +www.muziektheaterhollandsdiep.nl}; i està treballant actualment en +la partitura general i particel·les d'un arranjament del +@emph{Boris Godounov} del Moussurgsky per a quartet de vent, +piano i percussió. S'interpretarà el 2014, de nou per part de +@emph{Muziektheater Hollands Diep}. + +@item +Una edició crítica de la sèrie d'òperes @emph{Enea nel Lazio (1760)}, +del Tommaso Traetta, amb llibret del Vittorio Amedeo Cigna-Santi, +en quatre parts: +@uref{http://www.academia.edu/1987651/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_1_4_, Primera part} +@uref{http://www.academia.edu/1994533/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_2_4_, Segona part} +@uref{http://www.academia.edu/1994558/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_3_4_, Tercera part} +@uref{http://www.academia.edu/1996242/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_4_4_, Quarta part} +Creada pel +@uref{http://unito.academia.edu/LucaRossettoCasel, Luca Rossetto Casel} +per a la seva tesi de doctorat. + +@item +Els @emph{Quadres d'una exposició} del Mussorgsky, reorquestrats i +dirigits per l'@uref{http://www.aurelienbello.com/,Aurélien Bello} +amb la orquestra +@uref{http://www.junge-philharmonie-brandenburg.de/, Junge +Philharmonie Brandenburg} el 10 d'octubre de 2011 i una altra +vegada els dies 15 i 16 d'abril de 2012. + +@item +@uref{http://www.kierenmacmillan.info/, Kieren MacMillan}, compositor +i director musical. Entre les seves nombroses recents estan +@emph{Go Thy Way}, interpretada pel cor +@uref{http://www.saltlakechoralartists.org/, Salt Lake Choral Artists} +al març de 2012; la @emph{Just Out of Reach Suite} interpretada pel +@uref{http://www.herald-dispatch.com/news/marshall/x1883873762/Music-duo-Chrysalis-to-perform-at-Marshall-University-on-Jan-19, +Duo Chrysalis} ; @emph{thrafsmata} interpretada el juliol de 2011 pel +@uref{http://www.pnme.org/CurrentSeason/PreviousSeasons.html, +Pittsburgh New Music Ensemble}. + +@item +@emph{Anonymous Student Compliment or Complaint}, del +@uref{http://www.mikesolomon.org, Mike Solomon}, guanyador d'entre 172 +participants procedents de 22 països del +@uref{http://leftcoastensemble.org, concurs de composició +Left Coast de 2011}. Entre altres obres estan: Norman (age 1) +per a clarinet sol, interpretada al festival de música electroacústica +(FEMF) de la @uref{http://emu.music.ufl.edu/fems_concerts.html, +Universitat de Florida} a l'octubre de 2010. + +@item +Una edició moderna de la @emph{Serenata Erminia} de l'Alessandro +Scarlatti, editada pel musicòleg Thomas Griffin, (Roma, Itàlia). +Interpretada el 22 d'octubre de 2010 a la Galleria del Palazzo +Zevallos Stigliano de Nàpols. @uref{http://www.ascarlatti2010.net, +Alessandro Scarlatti 2010}, durant les commemoracions dels 350 +anys del naixement del compositor. + +@item +La interpretació de +@uref{http://www.mercurybaroque.org, Mercury Baroque} de +@emph{Armide} de Lully, 15 i 16 de maig de 2009, a Houston, Texas +(tipografia del @uref{http://nicolas.sceaux.free.fr/, Nicolas Sceaux}). + +@item +Extractes instrumentals de @emph{Hippolyte et Aricie} del Rameau a +l'església de St. James a Manhattan, el 8 de maig de 2009, pel +Frederick Renz i el seu conjunt +@uref{http://www.earlymusicny.org/, Early Music New York} +(realització tipogràfica de +@uref{http://nicolas.sceaux.free.fr/, Nicolas Sceaux}). + +@item +@emph{Affaire Étrangère}, òpera del +@uref{http://valentin.villenave.net/,Valentin Villenave}, amb llibret +en francès del @uref{http://en.wikipedia.org/wiki/Lewis_Trondheim, +Lewis Trondheim}, estrenada l'1 de febrer de 2009 a +@uref{http://www.opera-montpellier.com/, L'Opéra National de +Montpellier}, a França. + +@end itemize +@divEnd + +@divEnd + + +@divClass{column-right-top} +@subheading Partitures publicades + +@divClass{keep-bullets} +@itemize + +@item +El @uref{http://www.mutopiaproject.org/index.html, Projecte Mutopia} +inclou més de 1500 partitures de música clàssica per a la seva +descàrrega lliure, i és el principal aparador de partitures del +Lilypond. + +@c don't make this "Mutopia" a link, since that looks silly. +@item +@uref{http://etudeapp.com, Etude}, @qq{partitures en versió extra} +és una aplicació per a l'iPhone que presenta en pantalla música per +a piano editada amb el LilyPond, entre elles moltes peces +procedents de Mutopia. L'aplicació inclou un teclat virtual de +piano que mostra les tecles que cal clicar per ajudar als +principiants que estan aprenent a llegir música. + +@item +@uref{https://twitter.com/adoromusic, Adoro Music Publishing}, +partitures de música sacra d'alta qualitat, disponible per a la +seva descàrrega immediata o en el format tradicional de paper. + +@item +@uref{http://www.shadylane.fr, The Shady Lane Publishing}, +una @qq{micro editorial musical} la meta de la qual és promoure +una nova forma d'economia més propera als músics i als amants de +la música. + +@end itemize + +@divEnd + +@divEnd + +@contactUsAbout{concerts o partitures} + +@divClass{column-center-bottom} +@subheading I ara què? + +Encara no us convenç el LilyPond? Llegiu algunes de les +@ref{Ressenyes} dels nostres usuaris. Si ja voleu provar el +LilyPond, en primer lloc informeu-vos sobre la nostra @ref{Entrada +de text}. +@divEnd + + +@node Ressenyes +@unnumberedsec Ressenyes +@translationof Reviews + +@divClass{column-left-top} +@subheading Articles publicats + +@divClass{keep-bullets} +@itemize + +@item +Abril de 2011 + +@uref{http://www.linux-magazine.com,Linux Magazine} publica un +article titulat +@uref{http://www.linux-magazine.com/content/download/61706/482546/version/1/file/088-090_projects.pdf, +Projects on the Move}. És un article introductori sobre el +MuseScore, el LilyPond i el Chordii. L'autora Carla Schroeder diu +que @qq{LilyPond es treballa des de la línia d'ordres, però que +la manca d'una interfície gràfica no ha d'atemorir l'usuari; el +LilyPond és amigable i fàcil d'aprendre}, i aporta un exemple +fàcil d'abordar. + +@item +Maig de 2010 + +Peter Kirn, al lloc web Create Digital Music website, publica una +@uref{http://createdigitalmusic.com/2010/05/14/lilypond-free-beautiful-music-notation-engraving-for-anyone/,revisió +del LilyPond}. Aporta una mirada equilibrada sobre la utilització, +lloa la notació d'alta qualitat del LilyPond i suggereix als +lectors que el provin. + +@item +Setembre de 2009 + +La revista LinuxUser alemanya va publicar un +@uref{http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2009/10/Digitaler-Notenschluessel, +article sobre el LilyPond}. + +@item +Agost de 2009 + +Ann Drinan, a la pàgina +@uref{http://www.polyphonic.org/article.php?id=188, Polyphonic.org}, +presenta alguns comentaris de dos arxivers d'orquestra que xerren +sobre l'ús de programari per al manteniment de les seves +biblioteques. + +@item +Juny de 2009 + +A un @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/Free-Music-Now, article} +publicat a la revista anual de la @emph{Associació Nacional de +Pares d'Alumnes de Conservatoris} de França, el compositor i +membre del projecte LilyPond, Valentin Villenave, explica com les +llicències lliures, i concretament les partitures escrites +amb el LilyPond, participen de l'objectiu d'aconseguir que la +música escrita sigui accessible per a tots. + +@item +Febrer de 2008 + +A @uref{http://www.musicbyandrew.ca/finale-lilypond-1.html, articles +en la seva pàgina personal}, l'Andrew Hawryluk compara al Finale +amb el LilyPond en termes generals, i avalua en detall les +possibilitats de gravat musical dels dos programes. El segon +article és una instructiva anàlisi de l'edició del Preludi per a +piano número 6 del Rachmaninoff, incloent-hi comparacions amb una +edició de referència gravada a mà. + +@item +Juny de 2006 + +@uref{http://distrowatch.com,DistroWatch} premia al LilyPond k +@uref{http://distrowatch.com/weekly.php?issue=20060605,escriu} +@qq{Dames i cavallers, ens complau anunciar que, basant-nos en la +demanda dels lectors, la donació de DistroWatch de maig de 2006 ha +estat concedida al LilyPond (190,00 @euro{}) i a Lua (US$250,00).} + +@item +Desembre de 2005 + +Linux Journal publica un article titulat +@uref{http://www.linuxjournal.com/article/8364, Elabori fantàstics +gràfics de Schenker amb el GNU LilyPond}. És un article destacat, +profund però pràctic amb atractius gràfics de LilyPond. L'autor, +Kris Shaffer, destaca: @qq{El Gnu LilyPond genera uns gràfics +preciosos que a les alternatives comercials semblar de segona fila.} + +@item +20 d'agost de 2005 + +El diari belga De Standaard investiga què empeny als autors de +programari lliure en un article titulat +@uref{http://www.standaard.be/Artikel/Detail.aspx?artikelId=G42H5GD6, +Delen van KENNIS zonder WINSTBEJAG} (Compartir el coneixement +sense ànim de lucre) al seu @q{DS2 bijlage}. El LilyPond s'usa +com a exemple i l'article està esquitxat de cites procedents d'una +entrevista per email amb Jan Nieuwenhuizen. Això marca la primera +aparició del LilyPond a la premsa escrita d'importància. + +@item +Juny de 2005 + +Un article en francès sobre el llançament del LilyPond 2.6 va +aparèixer en @uref{http://linuxfr.org/2005/06/27/19210.html, +linuxfr.org}. + +@item +Octubre de 2004 + +Els editor de Computer!Totaal, una revista holandesa +d'informàtica, +@uref{http://lilypond.org/website/pdf/computer-totaal.jpeg, +descriuen al LilyPond} en l'edició d'octubre de 2004 com: +@qq{Meravellós programari lliure (de codi obert) (@dots{}) Les +partitures produïdes pel LilyPond son excepcionalment boniques +(@dots{}) un sistema molt potent que pot fer gairebé qualsevol cosa.} + +@item +Juliol/agost de 2004 + +Dave Phillips va escriure un article introductori per a Linux +Journal At the Sounding edge: Lilypond, +@uref{http://www.linuxjournal.com/article/7657, primera} i +@uref{http://www.linuxjournal.com/article/7719, segona} part. + +@item +Març de 2004 + +Chris Cannam va entrevistar a Han-Wen Nienhuys i a Jan +Nieuwenhuizen a linuxmusician.com (una pàgina ara +desapareguda). Aquesta entrevistat es va ressenyar també a una +@uref{http://slashdot.org/article.pl?sid=04/03/13/2054227&tid=, +història de slashdot}. + +@item +Febrer de 2004 + +El cantant de jazz Gail Selkirk escriu sobre +@uref{http://www.songbirdofswing.com/editorial_page/lilypond/, +Submergir-se a l'estany dels nenúfars (Lily Pond)}. +@qq{@dots{} pot fer fulls guia d'acords o parts orquestrals +completes, i el resultat pot ser increïble.} +@uref{http://www.computermusic.co.uk/, Computer Music Special}, número +CMS06. + +@end itemize + +@divEnd +@divEnd + + +@divClass{column-right-top} +@subheading Ressenyes dels usuaris + +@divClass{testimonial-item} +@imageFloat{carter-brey,jpg, right} +@subsubheading @uref{http://nyphil.org/meet/orchestra/index.cfm?page=profile&personNum=7, Carter Brey}, primer violoncel de la Filharmònica de Nova York + +@qq{@dots{} He escrit un parell de peces per a violoncel solista +que he imprès amb el LilyPond i que enviaré a Schirmer per a la +seva publicació. Puc apostar que el seu gravat no serà ni la +meitat de bo que el meu!} +@divEnd + + +@divClass{testimonial-item} +@imageFloat{orm-finnendahl,jpg, left} +@subsubheading @uref{http://icem-www.folkwang-hochschule.de/~finnendahl/, Orm Finnendahl}, professor de composició, Conservatori Superior de Friburg + +@qq{Tot i que no domino el [LilyPond] encara, estic @strong{molt} +impressionat. Vaig usar el programa per digitalitzar un motet del +Josquin Desprez en notació mensural i no hi ha dubte que LilyPond +derrota a altres programes de notació en quant a velocitat, +facilitat d'ús i aparença dels resultats!} +@divEnd + + +@divClass{testimonial-item} +@imageFloat{darius-blasband,jpg, right} +@subsubheading Darius Blasband, compositor (Brussel·les, Bèlgica) + +@qq{[...després de primer assaig orquestral] vaig obtenir +nombrosos complits sobre la qualitat de les partitures. El que és +encara més important: mentre que el LilyPond proporciona nombroses +formes de millorar l'aparença de les partitures, el que vaig +lliurar a l'orquestra és bàsicament la impressió en brut, sense retocar.} +@divEnd + + +@divClass{testimonial-item} +@subsubheading Kieren MacMillan, compositor (Toronto, Canadà) + +@qq{Gràcies i enhorabona a l'equip de desenvolupament pel seu +increïble treball. Mai no he vist quelcom que s'apropi al resultat +que obtinc amb el LilyPond; confio plenament en què les meves +necessitats de publicació musical seran satisfetes més enllà de +tota expectativa usant aquesta genial aplicació. (@dots{}) +bàsicament, la impressió del LilyPond sense retocar (@dots{}) es +veu millor que la majoria de les publicacions "professionals" més +recents amb les quals l'he comparat (per exemple pràcticament +qualsevol partitura de Warner Bros, i fins i tot moltes de les més +recents de @q{les editores antigues}). (@dots{})} + +@qq{Supera això, Finale/Sibelius/Igor/el que sigui!!!} +@divEnd + + +@divClass{testimonial-item} +@subsubheading Chris Cannam, programador principal del projecte @uref{http://www.rosegardenmusic.com/, RoseGarden} + +@qq{LilyPond és, obviament, el King Kong [de la tipografia +musical] en gran.} +@divEnd + + +@divClass{testimonial-item} +@subsubheading Chris Snyder, @uref{https://twitter.com/adoromusic, Adoro Music Publishing} + +@qq{La forma en què s'introdueix la música per a LilyPond em fa +pensar d'una manera més musical -- hi ha hagut molts cops que m'he +bloquejat sobre com dir-li al Lily que imprimeixi alguna cosa, sols +per adonar-me que fins i tot si fes exactament el que el +compositor volia, la música seria confusa de llegir. El LilyPond +m'ho posa molt més fàcil en treballar en el meu doble paper +d'editor i copista.} + +@qq{Porto utilitzant exclusivament el LilyPond per al meu negoci +de publicació acabat d'inaugurar. Pràcticament sense excepció, +tots els compositors s'han quedat bocabadats per la qualitat del +gravat que se'l presentava amb les proves de la seva música prèvia +a la publicació. Em reservo part del mèrit d'això (ocupo molt +temps a alterar els resultats, especialment les lligadures, +sobretot als acords), però el LilyPond em dóna un excel·lent punt +de partida, una interfície molt intuïtiva, i la capacitat de +modificar absolutament qualsevol cosa si el vull dedicar el temps +necessari. Estic convençut que cap producte comercial se li apropa +ni de lluny.} +@divEnd + + +@divClass{testimonial-item} +@subsubheading David Bobroff, trombó baix, Orquestra Simfònica d'Islàndia + +@qq{Crec que el LilyPond és genial (@dots{}) quant més aprenc del LilyPond, +més m'agrada!} +@divEnd + + +@divClass{testimonial-item} +@subsubheading Vaylor Trucks, intèrpret de guitarra elèctrica (sí, @uref{http://www.allmanbrothersband.com/modules.php?op=modload&name=userpage&file=content&page_id=12, parent de...}) + +@qq{Estic súper-impressionat amb el LilyPond (@dots{})} + +@qq{¡¡¡EL MILLOR PROGRAMA DE LA HISTÒRIA!!!} + +@qq{Moltíssimes gràcies a tots pel vostre dur treball i dedicació!} +@divEnd + + +@divClass{testimonial-item} +@subsubheading @uref{http://nicolas.sceaux.free.fr/, Nicolas Sceaux}, col·laborador de @uref{http://www.mutopiaproject.org/, Mutopia} + +@qq{Tenia una espècie de relació passió-odi amb el +LilyPond. Passió perquè la primera partitura que vaig veure era +tan increïble! La descripció del LilyPond es fonamenta en la +bellesa. Això és massa modèstia! +(@dots{}) a mesura que el LilyPond millora contínuament i observo +com es fan les coses amb el Scheme, tinc cada cop menys +frustracions. De totes maneres el que vull dir és: gràcies per +donar-nos el Lilypond, és realment bo.} +@divEnd + + +@divClass{testimonial-item} +@subsubheading @uref{http://www.troff.org/whoswho.html#werner,Werner Lemberg}, director d'orquestra al Teatre de Koblenz, +Alemanya, i destacat hacker del GNU + +@qq{De qualsevol manera, el LilyPond fa un treball sensacional!} +@divEnd + + +@divClass{testimonial-item} +@subsubheading Paul Davis, desenvolupador del @uref{http://jackaudio.org/, JACK} i @uref{http://www.ardour.org/, Ardour} + +@qq{Crec que el [LilyPond] és un programa increïble, i produeix un +resultat realment meravellós. Després d'haver llegit una ressenya +sobre ell l'any passat, vaig estar donant la pallissa a diversos +amics meus parlant-los del seu potencial.} +@divEnd + + +@divClass{testimonial-item} +@subsubheading @uref{http://webusers.siba.fi/~mkuuskan/, El DrlMika Kuuskankare}, investigador de la @uref{http://siba.fi,Sibelius Academy de Finlàndia}, compositor i autor de l'Expressive Notation Package (ENP) + +@qq{Sento el més profund respecte cap al LilyPond i els seus +creadors i mantenidors degut a què sé per la meva experiència +personal el difícil que pot ser aquest tipus de programari.} +@divEnd + + +@divClass{testimonial-item} +@subsubheading @uref{http://camerondh.blogspot.com, DavidCameron}, Músic, tipògraf musical professional i usuari experimentat de SCORE + +@qq{EL meu agraïment de tot cor a tot aquell que contribueix a +aquest projecte. Jo vaig ser usuari intensiu del SCORE per a cases +grans d'edició musical, allà pels anys 90, però ara sento que el +LilyPond, per fi, em permet aconseguir exactament el que vull fer +sobre la pàgina, especialment quan no es tracta de la pràctica +"estàndard".} +@divEnd + +@divEnd + +@contactUsAbout{articles de notícies o testimonis} + +@divClass{column-center-bottom} +@subheading Y ara ¿què? + +Llegiu el que tenim que dir-vos sobre la nostra @ref{Entrada de text}. +@divEnd + + + +@node Entrada de text +@unnumberedsec Entrada de text +@translationof Text input + +@c TRANSLATORS, so far it's mostly from +@c http://lilypond.org/web/switch/howto + +@subheading @qq{Compilar} la música + +@imageClickable{nereid-shot-small,png, (cliqueu per veure imatge més gran +ereid-shot,png), right} + +El LilyPond és un sistema @emph{compilat}: s'executa sobre un +arxiu de text que descriu la música. El resultat es pot veure a la +pantalla o imprimir-se. De certa manera, el LilyPond se sembla més +a un llenguatge de programació que als programes d'edició gràfica +de partitures. + +No escrivim la música pel procediment d'agafar les notes d'una +barra d'eines gràfica i arrossegar-les a una partitura que es +refresca de forma dinàmica; escrivim la música teclejant un +text. Aquest text és interpretat (o @qq{compilat}) per part del +LilyPond, que al seu torn produeix una bella música impresa. + +És possible que les persones acostumades a interfícies gràfiques +d'usuari hagin d'aprendre una forma de treball nova, però els +resultats, sense cap mena de dubte, mereixen la pena! + +@warning{Presentem aquí una panoràmica del nostre paradigma +d'entrada de tex: no és tan complicat com sona! No us amoïneu ara +per comprendre tots i cadascú dels detalls d'aquests exemples; la +nostra documentació per a principiants s'ocupa de tot això a un +ritme molt més progressiu.} + +@subsubheading L'ela amb l'ela, "La" + +Les notes es codifiquen mitjançant lletres i números. Les +instruccions especials s'introdueixen mitjançant barres invertides. + +@imageFloat{text-input-1-annotate-ca,png,center} +@imageFloat{text-input-1-output,png,center} + +Les alteracions es fan amb noms diferents: afegiu @w{@code{-is}} +per obtenir un sostingut, i @w{@code{-es}} per a un bemoll (són els +noms de les notes en holandès, però estan disponibles en altres +idiomes). El LilyPond esbrina on s'han d'imprimir les alteracions. + +@imageFloat{text-input-2-annotate-ca,png,center} +@imageFloat{text-input-2-output,png,center} + + +@subsubheading Música pop + +Aplegui acords i lletra per obtenir un full guia d'acords: + +@imageFloat{text-input-pop-annotate-ca,png,center} +@imageFloat{text-input-pop-output,png,center} + + + +@subsubheading Particel·les d'orquestra + +El fitxer d'entrada conté les notes d'una peça musical La +partitura i les particel·les es poden fer a partir d'un sol fitxer +d'entrada, de manera que un canvi en una nota sempre afecta tant a +les particel·les com a la partitura general. Per poder incloure la +mateixa música en diversos llocs, assignem la música a una +@qq{variable} (un nom): + +@imageFloat{text-input-parts-both-annotate-ca,png,center} + +Aquesta variable s'usa aleshores a una sola part instrumental +(aquí transportada, amb els silencis de diversos compassos agrupats): + +@imageFloat{text-input-parts-single-annotate-ca,png,center} +@imageFloat{text-input-parts-single-output,png,center} + + +La mateixa variable s'utilitza a la partitura general (aquí en to +de concert): + +@imageFloat{text-input-score-annotate-es,png,center} +@imageFloat{text-input-score-output,png,center} + + +@subsubheading Documentació per al principiant + +Ens adonem que molts usuaris veuen una mica estranya aquesta forma +d'introduir la música. Per aquest motiu, hem escrit una àmplia +documentació d'ajuda als nous usuaris, començant amb +@ref{Learning}. El manual d'aprenentatge és el millor per +començar, perquè allí es responen moltes preguntes abans que es +formulin. + +Us preguem que llegeixi el Manual d'Aprenentatge abans de +queixar-vos de possibles fallades del programa! Amb freqüència, +els usuaris novells creuen que el LilyPond no funciona, quan de +fet està funcionant exactament tal i com està dissenyat per fer-lo. + +Teniu a la vostra disposició una documentació molt més profunda a +la secció @ref{Manuals}. + +Ben Lemon, usuari del LilyPond, ha creat i publicat una +col·lecció de +@uref{http://benlemon.me/blog/music/lilypond/operation-lilypond/,tutorials +en vídeo} al seu blog, dirigits a nous usuaris. + +@subsubheading Entorns d'edició facilitats + +@imageClickable{lilykde-screenshot-small,png, + (cliqueu per veure una imatge més gran),lilykde-screenshot,png,right} + +L'èmfasi del LilyPond està en primer lloc en la producció de +música escrita amb la màxima qualitat; la creació d'una +interfície gràfica d'usuari (un GUI) ens hauria distret d'aquesta +meta. Malgrat això, hi ha altres projectes els propòsits dels +quals és fer més fàcil la creació de fitxers d'entrada del LilyPond. + +Alguns entorns d'edició inclouen el acolorit sintàctic, compleció +automàtica d'instruccions i plantilles pre-elaborades. D'altres +programes ofereixen realment un GUI que permet la manipulació +directa d'una partitura gràfica. Per veure més informació, consulteu +@ref{Entorns millorats}. + + +@divClass{column-center-bottom} +@subheading I ara què? + +Ja està preparat per @ref{Descàrrega, Descarregar el LilyPond}. +Encara no esteu convençut? Llegiu quelcom sobre els entorns +d'edició a +@ref{Entorns millorats}. + +@divEnd + + +@node Entorns millorats +@unnumberedsec Entorns millorats +@translationof Easier editing + +@ignore +GNU policy forbids us from linking to non-Free software, so don't +add such links. + +In particular, don't link to: +- the LilyPond bundle for TextMate (a commercial editor for MacOS). + +@end ignore + +@divClass{column-center-top} +@subheading Tunefl + +@sourceimage{logo-linux,,,} +@sourceimage{logo-freebsd,,,} +@sourceimage{logo-macosx,,,} +@sourceimage{logo-windows,,,} + +@uref{http://www.tunefl.com} + +Amb el tunefl es poden gravar les partitures senzilles de +forma directa en línia sense necessitat d'instal·lar el LilyPond +localment. Permet provar totes les capacitats del programa usant +una interfície web còmoda. + +@divEnd + +@divClass{column-center-top} +@subheading LilyPondTool + +@imageClickable{lilypondtool-2.12-screenshot-400wide,png, (cliqueu +per veure una imatge més gran),lilypondtool-2.12-screenshot,png,right} + +@sourceimage{logo-linux,,,} +@sourceimage{logo-freebsd,,,} +@sourceimage{logo-macosx,,,} +@sourceimage{logo-windows,,,} + +@uref{http://lilypondtool.organum.hu} + +Creat com un @q{connector} o complement per a l'editor de text +@uref{http://www.jedit.org,jEdit}, el LilyPondTool és una de les +eines basades en text més riques en funcionament per a l'edició de +partitures del LilyPond. Entre les seves possibilitats es troben: +un assistent de documents que contempla la possibilitat de +introduir lletres de cançons per a la preparació fàcil de +documents, i un visor de PDF integrat que contempla la +possibilitat d'apuntar i clicar per mostrar el codi. + +@divEnd + +@divClass{column-center-top} +@subheading Frescobaldi + +@imageClickable{frescobaldi-lilypond-editor-small,png, (cliqueu +per veure una imatge més gran),frescobaldi-lilypond-editor,png,right} + +@sourceimage{logo-linux,,,} +@sourceimage{logo-freebsd,,,} +@sourceimage{logo-windows,,,} + +@uref{http://www.frescobaldi.org} + +El Frescobaldi és un editor lleuger i potent de text i música per +al LilyPond amb un visor de PDF incorporat. És molt fàcil +d'utilitzar i funciona en tots els principals sistemes operatius +(GNU/Linux, Mac OS X i Windows). + +@divEnd + +@divClass{column-center-top} +@subheading Entorn gràfic: Denemo + +@imageClickable{screenshot-denemo-small,png, + (cliqueu per veure una imatge més gran),screenshot-denemo,png,right} + +@sourceimage{logo-linux,,,} +@sourceimage{logo-windows,,,} + +@uref{http://denemo.org} + +El Denemo és un editor gràfic que genera codi font del LilyPond, +en la versió 2.8.7, i també permet la reproducció sonora de la +música. Permet els usuaris veure el codi d'entrada de LilyPond en +paral·lel amb la visualització gràfica. Es poden aplicar a les +notes, acords, etc., ajustament addicionals del LilyPond i es desen amb +el document del Denemo, de forma que els usuaris poden continuar +editant-lo de manera gràfica. + +En moure el cursor pel text del LilyPond es mou també a la +presentació gràfica, i els errors de sintaxi dels ajustaments al +LilyPond es destaquen a la finestra de text quan s'imprimeixen des +del programa. + +@divEnd + +@divClass{column-center-top} +@subheading Editors de text + +@sourceimage{logo-linux,,,} +@sourceimage{logo-freebsd,,,} +@sourceimage{logo-macosx,,,} +@sourceimage{logo-windows,,,} + +@uref{http://elysium.thsoft.hu} + +L'Elysium és un entorn integrat de desenvolupament per a Eclipse, +amb una vista integrada en dos panells enfrontats per a la font i +la partitura. Inclou realimentació visual ràpida i intuïtiva sense +haver d'alternar entre contextos, i porta moltes plantilles +conduïdes per assistents. + +@uref{http://www.gnu.org/software/emacs/} + +L'Emacs és un editor de text amb funcionalitats avançades per a +molts llenguatges de programació. L'Emacs és un editor que es pot +expandir àmpliament i es pot usar com un entorn integrat de +desenvolupament. Hi ha un @q{mode del LilyPond} que ofereix les +definicions del llenguatge per treballar amb fitxers font del +LilyPond. Un desenvolupador ha escrit +@uref{https://github.com/nsceaux/lyqi,lyqi}, un mode principal de +l'Emacs. + +@uref{http://www.vim.org} + +El Vim és un editor de text minimalista que és una estensió de +l'antic editor @command{vi} de l'Unix. També és es pot expandir i +configurar. + +Per regla general, si no esteu familiaritzat prèviament amb +l'Emacs o el Vim, probablement preferireu utilitzar un editor +diferent per escriure fitxers d'entrada del LilyPond. + +Hi ha més informació sobre la configuració de l'Emacs i del Vim a +@rprogram{Text editor support}. + +@sourceimage{logo-macosx,,,} +@uref{http://www.uoregon.edu/~koch/texshop} + +L'editor TexShop per a MacOS@tie{}X es pot estendre perquè executi +el LilyPond @command{lilypond-book} i @command{convert-ly} des de +dins de l'editor, utilitzant les extensions que estan disponibles a: + +@example +@uref{http://users.dimi.uniud.it/~nicola.vitacolonna/home/content/lilypond-scripts} +@end example + +@divEnd + +@divClass{column-center-top} +@subheading Programes capaços d'exportar codi del LilyPond + +@subsubheading Editors de partitura, tablatura i MIDI: + +@itemize + +@item +@uref{http://www.jezra.net/projects/bwwtolily,bwwtolily} intenta +convertir un fixer @code{.bww} o @code{.bmw} al LilyPond. Tot i +que no tots els ornaments es converteixen adequadament (el que és +cert especialment amb piobaireachd), el programa imprimeix una +llista d'ells. + +@item +@uref{http://www.canorus.org,Canorus}, un editor de partitures, +també pot exportar al LilyPond, però encara és un programa en fase +beta, s'agraeixen les provatures per part dels usuaris. + +@item +@uref{http://enc2ly.sourceforge.net/en/,Enc2ly} és un programa per +a GNU/Linux que converteix una partitura musical +d'@uref{http://www.gvox.com/,Encore} en una del LilyPond. + +@item +@uref{https://github.com/hanwen/go-enc2ly,go-enc2ly} és una eina +de GO que converteix fitxers de +@uref{http://www.gvox.com/,Encore} al LilyPond. Es va crear +utilitzant la recerca i la enginyeria inversa per mitjà de la +modificació puntual de fitxers .enc i carregant-los a la versió de +demostració 4.55. + +@item +@uref{http://www.musescore.org,MuseScore}, un editor de +partitures, té exportació incompleta del LilyPond però s'està +desenvolupant de forma activa. + +@item +@uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd}, +un editor de partitures basat en la biblioteca +@uref{http://www.cairographics.org,Cairo}, +contempla de forma experimental l'exportació al LilyPond. + +@item +@uref{http://www.holmessoft.co.uk/homepage/software/NWC2LY/index.htm,NW2LY} +és un programa en C# que converteix una cançó del NoteWorthy +Composer al LilyPond. + +@item +@uref{https://github.com/ciconia/ripple/blob/master/README.markdown,Ripple} +és un programa que ajuda en la creació de partitures i +particel·les, i que inclou un mode per barrejar diferents obres +musicals a una sola partitura o particel·la. + +@item +@uref{http://www.rosegardenmusic.com,Rosegarden}, un seqüenciador +MIDI i d'àudio, que té també un editor de partitura per a edició +d'un sol pentagrama. + +@item +@uref{https://launchpad.net/rumor/,Rumor}, un convertidor +monofònic de MIDI al LilyPond en temps real. + +@item +@uref{http://www.tuxguitar.com.ar/,TuxGuitar}, un editor i +reproductor de tabulatura multipista, té visor de partitura i és +capaç d'exportar cap al LilyPond. + +@end itemize + +@subsubheading Generadors de codi algorítmics + +@itemize + +@item +@uref{http://www.projectabjad.org/,Abjad}, una API de +@uref{http://www.python.org/,Python} per al control formalitzat de +partitures, dissenyat per ajudar als compositors a construir +fragments complexos de notació del LilyPond d'una forma iterativa i incremental. + +@item +@uref{http://common-lisp.net/project/fomus/,FOMUS}, (FOrmat MUSic) +és una eina de notació musical per a compositors de música per +ordinador. Està escrit en al llenguatge Lisp, i s'ha provat amb +diversos intèrprets. També hi ha disponible una versió traduïda +al llenguatge C++. + +@item +@uref{http://strasheela.sourceforge.net/strasheela/doc/index.html,Strasheela}, +un entorn construït sobre el llenguatge de restriccions +@uref{http://www.mozart-oz.org/, Mozart/Oz}. + + +@end itemize +@divEnd + +@divClass{column-center-top} + +@subheading Altres programes sense desenvolupament actiu actualment + +@itemize + +@item +@uref{http://lilykde.googlecode.com/,LilyKDE} s'ha substituït per +@uref{http://www.frescobaldi.org/,Frescobaldi}, i existeix com a +LilyKDE3 per a KDE 3.5 i com a lilypond-KDE4 per a KDE 4.1 solament. + +@item +@uref{https://sourceforge.net/projects/noteedit.berlios/,NoteEdit}, que importava +@uref{http://www.makemusic.com/musicxml,MusicXML}, s'ha escindit a +@uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd} +i @uref{http://canorus.org,Canorus}. + + +@item +@uref{http://lilycomp.sourceforge.net, LilyComp} és un programa +gràfic d'introducció de notes, que actua més o menys com un +teclat numèric que produeix notes del LilyPond. + +@end itemize + +@divEnd + + +@divClass{column-center-bottom} +@subheading I ara què? + +Ja esteu preparat per a @ref{Descàrrega, Descarregar el LilyPond}. + +Encara no esteu convençut? Molts compositors, músics i directors +d'orquestra han après a escriure música en el nostre format +d'entrada. Els usuaris amb experiència fins i tot que poden +introduir una partitura completa al LilyPond més ràpid que amb un +teclat de piano o amb el ratolí i un GUI! Possiblement us agradi +donar una ullada a les @ref{Possibilitats}, @ref{Exemples} o a la +@ref{Llibertat} i @ref{Ressenyes} dels nostres usuaris. A més a +més, el nostre enfoc de l'estètica computacional del gravat +musical clàssic ve explicat en el nostre tractat sobre el +@ref{Rerefons}. + +@subheading Formalitats legals + +@divClass{legal} + +Es reconeix el copyright de tots els logotips i imatges de marca +de productes. + +@logoLegalLinux + +@logoLegalFreeBSD + +@logoLegalMacOSX + +@logoLegalWindows + +@divEnd + +@divEnd diff --git a/Documentation/ca/web/manuals.itexi b/Documentation/ca/web/manuals.itexi new file mode 100644 index 0000000000..43b19032d6 --- /dev/null +++ b/Documentation/ca/web/manuals.itexi @@ -0,0 +1,628 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- +@c This file is part of web.texi +@ignore + Translation of GIT committish: feeca25b207bd510705974896d640ea292cd7fc4 + + When revising a translation, copy the HEAD committish of the + version that you are working on. See TRANSLATION for details. +@end ignore + + +@node Manuals +@unnumbered Manuals +@translationof Manuals + +@macro details{reference} +@spanClass{detail} +(@ref{\reference\, detalls de \reference\}) +@spanEnd +@end macro + +@divClass{heading-center} +@ifclear web_version +@heading Manuals de LilyPond @version +@end ifclear +@ifset web_version + @heading Manuals del LilyPond @versionStable +@end ifset + +@divEnd + +@divClass{link-headings} + +@divClass{column-center-top} +@subheading Introducció + +@itemize + +@item +@ref{Entrada de text}: +El LilyPond és un sistema de gravat musical @strong{basat en text}. +Llegiu això primer! + +@item +@ifWebLinks{@manualStableLearningSplitNoName-ca,@rlearningnamed{Top,Aprenentatge}} +una introducció al LilyPond amable i @qq{imprescindible}. +@details{Aprenentatge} + +@item +@ifWebLinks{@manualStableGlossarySplitNoName,@rglosnamed{Top,Glossari}} +@emph{(lectura opcional)} termes musicals i traduccions. +@details{Glossari} + +@item +@ifWebLinks{@manualStableEssaySplitNoName,@ressaynamed{Top,Essay}} +@emph{(lectura opcional)} la informació de rerefons sobre gravat musical +@details{Essay} + + +@end itemize + +@divEnd + +@divClass{column-left-top} +@subheading Ús freqüent + +@itemize + +@item +@ifWebLinks{@manualStableNotationSplitNoName-ca,@rusernamed{Top,Notació}} +referència de la sintaxi. +@details{Notació} + +@item +@ifWebLinks{@manualStableUsageSplitNoName-ca,@rprogramnamed{Top,Utilizació}} +com executar els programes. +@details{Utilització} + +@item +@ifWebLinks{@manualStableSnippetsSplitNoName,@rlsrnamed{Top,Fragments}} +trucs i consells curts. +@details{Fragments} + +@end itemize + +@divEnd + + +@divClass{column-right-top} +@subheading Ús infreqüent + +@itemize + +@item +@ref{FAQ}: +Preguntes més freqüents (Frequently Asked Questions). + +@item +@ref{Top,Web}: +aquest document. +@details{Web} + +@item +@ifWebLinks{@manualStableChangesSplitNoName-ca,@rchangesnamed{Top,Canvis}} +que hi ha de nou? +@details{Canvis} + +@item +@ifWebLinks{@manualStableExtendingSplitNoName-ca,@rextendnamed{Top,Extensió}} +trucs interessants. +@details{Extensió} + +@item +@ifWebLinks{@manualStableInternalsSplitNoName,@rinternalsnamed{Top,Funcionament intern}} +referències sobre com fer trucs. +@details{Funcionament intern} + +@end itemize + +@divEnd + + +@divClass{column-center-bottom} +@subheading Altres materials + +@itemize + +@item +@ref{Tots}: +Versions estables anteriors i versió actual com un fitxer comprimit. + +@item +@ref{Traduït}: +estat del procés de traducció per a lectors no anglòfons. + +@item +@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository (el magatzem de fragments de codi del Lilypond)}: +exemples, consells, i trucs creats pels usuaris. + +@item +@uref{http://benlemon.me/blog/music/lilypond/operation-lilypond/,Video +Tutorials}: Ben Lemon, usuari del LilyPond, ha creat i publicat un +cert nombre de tutorials de vídeo al seu blog que són adequats per +a usuaris nous. + +@item +@ref{Desenvolupament}: +manuals per a la versió de desenvolupament. + +@item +@ref{FDL}: +aquests manuals estan publicats sota la Llicència de Documentació +Lliure de GNU. + +@end itemize + +@divEnd + +@divClass{column-center-bottom} +@subheading Formats dels manuals + +En general, els manuals del LilyPond es presenten en tres formats: +HTML seccionat, HTML monolític i PDF. L'HTML seccionat és adequat +per a la lectura en línia. L'HTML monolític (alguns d'aquests +fitxers poden ser molt grans) conté tot el manual a una sola +pàgina. El PDF està disponible per a la seva descàrrega i per +usar-lo fora de línia. Per obtenir cada un dels tres formats, +seguiu els enllaços amb el text @code{detalls de} i a continuació +el nom del manual. + +@divEnd + +@divEnd + + +@divClass{hide} +@menu +* Aprenentatge:: Aprenentatge. +* Glossari:: Glossari. +* Monografia:: Monografia. +* Notació:: Referència. +* Utilització:: Utilització. +* Fragments:: Fragments de codi. +* FAQ:: Preguntes freqüents. +* Web:: Web. +* Canvis:: Notícies. +* Extensió:: Programació. +* Funcionament intern:: Funcionament intern. +* Traduït:: Estat de la traducció. +* Tots:: Tots els manuals. +* FDL:: Llicència. +@end menu + +@divEnd + + +@c TRANSLATORS, most of the text in this file came from +@c LM 1.1 About the documentation (before this section was +@c removed in July 2009). + +@node Aprenentatge +@unnumberedsec Aprenentage +@translationof Learning + +@divClass{column-left-top} +@subheading Manual d'aprenentatge + +Aquest llibre explica com començar a aprendre el LilyPond, així +com alguns conceptes clau en termes senzills. Hauríeu de llegir +aquests capítols en seqüència lineal. + +Al final de totes les seccions hi ha un paràgraf @strong{Vegeu +també} que conté referències creuades a altres seccions: no +hauríeu de seguir les referències creuades la primera vegada que +llegiu el manual. Quan hàgiu llegir tot el manual, us convindrà +llegir de nou algunes seccions i seguir aquestes referències +creuades per obtenir més informació. +@divEnd + +@divClass{column-right-bottom} + +@docLinks{Aprenentatge, learning, + @rlearningnamed{Top,Aprenentatge}, + @manualStableLearningSplit-ca, + @manualStableLearningBig-ca, 3 MB, + @manualStableLearningPdf-ca, 5 MB} + +@divEnd + + +@node Glossari +@unnumberedsec Glossari +@translationof Glossary + +@divClass{column-left-top} +@subheading Glossari + +El glossari explica termes musicals i inclou traduccions a +diversos idiomes. Si no teniu familiaritat amb la notació o a +terminologia musicals (en especial si no sou parlant nadiu de +l'anglès), es recomana ferventment que consulteu el glossari. + +@divEnd + +@divClass{column-right-bottom} + +@docLinks{Glossari musical, music-glossary, + @rglosnamed{Top,Glossari musical}, + @manualStableGlossarySplit, + @manualStableGlossaryBig, 1 MB, + @manualStableGlossaryPdf, 1.5 MB} + +@divEnd + + +@node Monografia +@unnumberedsec Monografia +@translationof Essay + +@divClass{column-left-top} +@subheading Monografia + +Aquest llibre ofereix una història breu de la tipografia musical, +seguida d'un examen de les tècniques de gravat musical del +LilyPond. Es fa una comparació entre el LilyPond i d'altres +sistemes de tipografia musical. + +@warning{Els exemples tipogràfics detallats s'analitzen millor a +la versió en format PDF a causa de la seva major resolució.} + +@divEnd + +@divClass{column-right-bottom} + +@docLinks{Essay, essay, + @ressaynamed{Top,Essay}, + @manualStableEssaySplit-ca, + @manualStableEssayBig-ca, 1 MB, + @manualStableEssayPdf-ca, 2 MB} + +@divEnd + + +@node Notació +@unnumberedsec Notació +@translationof Notation + +@divClass{column-left-top} +@subheading Referència de la notació + +Aquest llibre explica totes les instruccions del LilyPond que +produeixen notació musical. + +@warning{La Referència de la Notació suposa que el lector coneix +el material bàsica que apareix al Manual d'Aprenentatge i té +familiaritat amb els termes musicals anglesos que es presenten al +Glossari Musical.} + +@divEnd + +@divClass{column-right-bottom} + +@docLinks{Notació, notation, + @rusernamed{Top,Notació}, + @manualStableNotationSplit-ca, + @manualStableNotationBig-ca, 9 MB, + @manualStableNotationPdf-ca, 35 MB} + +@divEnd + + +@node Utilització +@unnumberedsec Utilització +@translationof Usage + +@divClass{column-left-top} +@subheading Manual d'utilització del programa + +Aquest llibre explica com executar els programes, com integrar la +notació del LilyPond amb altres programes, i suggereix @qq{bones +pràctiques} per a un ús eficient d'aquestes eines. Es recomana la +seva lectura abans d'afrontar projectes grans. + +@divEnd + +@divClass{column-right-bottom} + +@docLinks{Utilització, usage, + @rprogramnamed{Top,Utilització}, + @manualStableUsageSplit-ca, + @manualStableUsageBig-ca, 400 KB, + @manualStableUsagePdf-ca, 650 KB} + +@divEnd + + +@node Fragments +@unnumberedsec Fragments +@translationof Snippets + +@divClass{column-left-top} +@subheading Fragments + +Aquest manual presenta un conjunt seleccionat de fragmentes de +codi del LilyPond extrets del +@uref{http://lsr@/.dsi@/.unimi@/.it,Repositori de fragments de +codi del LilyPond} (LSR). Tots els fragments es troben al domini +públic. + +Observeu que aquest document no és un subconjunt estricte del +LSR. L'LSR executa una versió estable del LilyPond per la qual +cosa qualsevol fragment de codi que mostri funcionalitats noves +d'una versió de desenvolupament s'ha d'afegir per separat. Estan +emmagatzemats dins de @file{input/new/} a l'arbre de codi font del +LilyPond. + +La llista de fragments de codi per a cada subsecció del manual de +Notació estan enllaçats també a partir de la secció @strong{Vegeu +també}. +@divEnd + + +@divClass{column-right-bottom} + +@docLinks{Fragments, snippets, + @rlsrnamed{Top,Fragments}, + @manualStableSnippetsSplit, + @manualStableSnippetsBig, 1.5 MB, + @manualStableSnippetsPdf, 12.5 MB} + +@divEnd + + +@node FAQ +@unnumberedsec FAQ +@translationof FAQ + +@divClass{column-center-top} +@subheading Preguntes preliminars + +@subsubheading On és la interfície gràfica, els menús i les barres d'eines? + +El LilyPond requereix que escrivim la música coma +text. Informeu-vos d'això llegint la nostra @ref{Entrada de text}. + +@subsubheading Hi ha un munt de documentació! He de llegir-la? + +Heu de llegir el manual de @ref{Aprenentatge}. Respecte a la +resta de la documentació, sols heu de llegir les seccions que +tracten de la notació que vulgueu crear. + + +@subsubheading Això és encara molta cosa a llegir! Paga la pena? + +Decidiu per vos mateix; les raons per les quals voldríeu utilitzar +el LilyPond es poden trobar a la @ref{Introducció}. + +@divEnd + +@divClass{column-center-bottom} +@subheading Qüestions sobre la utilització + +@subsubheading Quelcom no funciona! Com ho arreglo? + +S'explica a @rprogramnamed{Troubleshooting,Solució de problemes}. + + +@subsubheading Perquè canvien la sintaxi i el llenguatge? + +S'explica a @rprogram{Perquè canvia la sintaxi?}. + +@divEnd + + +@node Web +@unnumberedsec Web +@translationof Web + +@divClass{column-left-top} +@subheading Web + +Aquest manual dóna una informació general sobre el LilyPond. +També conté informació sobre diversos fòrums de la comunitat, +maneres d'informar de les fallades, i desenvolupament. + +@divEnd + +@divClass{column-right-bottom} +@subheading Llegiu-lo + +@subsubheading Últims manuals + +@divClass{keep-bullets} +@itemize +@ref{Top,Web} +@end itemize +@divEnd + +@subsubheading Manual web en @versionDevel + +@docLinksBare{Web, web, + @ref{Amunt,Web}, + @manualDevelWebSplit-ca, + @manualDevelWebBig-ca, 2.5 MB, + @manualDevelWebPdf, 3.5 MB} + +@divEnd + + +@node Canvis +@unnumberedsec Canvis +@translationof Changes + +@divClass{column-left-top} +@subheading Canvis + +Això és un resum dels canvis més importants i noves funcionalitats +produïdes al LilyPond a partir de la versió estable anterior. + +@divEnd + +@divClass{column-right-bottom} + +@docLinks{Canvis, changes, + @rchangesnamed{Top,Canvis}, + @manualStableChangesSplit-ca, + @manualStableChangesBig-ca, 90 KB, + @manualStableChangesPdf-ca, 80 KB} + +@divEnd + + +@node Extensió +@unnumberedsec Extensió +@translationof Extending + +@divClass{column-left-top} +@subheading Extensió del LilyPond + +Aquest manual explica com escriure extensions del LilyPond. + +@divEnd + +@divClass{column-right-bottom} + +@docLinks{Extensió, extending, + @rextendnamed{Top,Extensió}, + @manualStableExtendingSplit-ca, + @manualStableExtendingBig-ca, 300 KB, + @manualStableExtendingPdf-ca, 500 KB} + +@divEnd + +@node Funcionament intern +@unnumberedsec Funcionament intern +@translationof Internals + +@divClass{column-left-top} +@subheading Referència del funcionament intern + +Aquest és un conjunt de pàgines ple de referències creuades que +constitueixen la documentació de tots els detalls de cada una de +les classes, objectes i funcions del LilyPond. Es produeix +directament a partir de les definicions de format del codi font. + +Gairebé tota la funcionalitat de format que s'utilitza internament +està disponible per a l'usuari directament. Per exemple, gairebé +totes les variables que controlen els valors de gruix, les +distàncies, etc., es poden modificar als fitxers d'entrada. Hi ha +un nombre molt gran d'opcions de format, i totes ells es descriuen +en aquest document. Cadascuna de les seccions de la Referència de +la Notació té una subsecció @b{Vegeu també}, que es refereix a la +documentació generada. + +@divEnd + +@divClass{column-right-bottom} + +@docLinks{Funcionament intern, internals, + @rinternalsnamed{Top,Funcionament intern}, + @manualStableInternalsSplit, + @manualStableInternalsBig, 3 MB, + @manualStableInternalsPdf, 4 MB} + +@divEnd + + +@node Traduït +@unnumberedsec Traduït +@translationof Translated + +@divClass{column-center-bottom} +@subheading Estat de la traducció + +@include translations.itexi + +@divEnd + + +@node Tots +@unnumberedsec Tots +@translationof All + +@divClass{column-left-top} +@subheading Versions per descarregar + +@ifclear web_version +Els @emph{tarballs} per descarregar +sols estan disponibles a @uref{http://lilypond.org} +@end ifclear +@ifset web_version + +@divClass{keep-bullets} +@itemize + +@item @doctarballStable-ca + +@end itemize + +@divEnd +@end ifset + +@divEnd + +@divClass{column-right-bottom} +@subheading Versions estables anteriors + +@divClass{keep-bullets} +@itemize + +@item @uref{http://lilypond.org/doc/v2.16/Documentation/, +Documentación de LilyPond 2.16} + +@item @uref{http://lilypond.org/doc/v2.14/Documentation/, +Documentación de LilyPond 2.14} + +@item @uref{http://lilypond.org/doc/v2.12/Documentation/, +Documentación de LilyPond 2.12} + +@item @uref{http://lilypond.org/doc/v2.10/Documentation/, +Documentación de LilyPond 2.10} + +@item @uref{http://lilypond.org/doc/v2.8/Documentation/, +Documentación de LilyPond 2.8} + +@item @uref{http://lilypond.org/doc/v2.6/Documentation/, +Documentación de LilyPond 2.6} + +@item @uref{http://lilypond.org/doc/v2.4/Documentation/out-www/, +Documentación de LilyPond 2.4} + +@item @uref{http://lilypond.org/doc/v2.2/Documentation/out-www/, +Documentación de LilyPond 2.2} + +@item @uref{http://lilypond.org/doc/v2.0/Documentation/out-www/, +Documentación de LilyPond 2.0} + +@item @uref{http://lilypond.org/doc/v1.8/Documentation/out-www/, +Documentación de LilyPond 1.8} + +@item @uref{http://lilypond.org/doc/v1.6/Documentation/out-www/, +Documentación de LilyPond 1.6} + +@end itemize + +@divEnd +@divEnd + + +@node FDL +@unnumberedsec FDL +@translationof FDL + +@divClass{column-center-top} +@subheading Llicència de la documentació + +La documentació del GNU LilyPond està publicada sota la Llicència +de Documentació Lliure de GNU. Hi ha una introducció a aquesta +llicència i a els nostres motius per haver-la escollit, a +@ref{Llibertat}. + +@divEnd + +@divClass{column-center-bottom} +@subheading GNU Free Documentation License 1.1 + +@include fdl.itexi + +@divEnd diff --git a/Documentation/ca/web/news-front.itexi b/Documentation/ca/web/news-front.itexi new file mode 100644 index 0000000000..8fe5d07c28 --- /dev/null +++ b/Documentation/ca/web/news-front.itexi @@ -0,0 +1,280 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: ca -*- +@ignore + Translation of GIT committish: 7e3df6b879dcd850a4e7645b1afc151111c77436 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c This file is part of lilypond-web.texi and community.itexi + +@c when you add a new item, consider moving the lowest item(s) +@c into news.itexi. + +@c Translators: Walter Garcia-Fontes +@c keep two blank lines between news entries + +@c used for news about the upcoming release; see CG 10.2 + +@newsItem +@subsubheading LilyPond 2.19.15 llençat el @emph{28 de setembre 28 de 2014}! + +Estem contents d'anunciar el llançament del LilyPond 2.19.15. +Aquest llançament inclou nombroses millores, i conté algun treball +en progrés. Tindreu accés a les funcionalitats més recents, però +algunes poden estar incompletes, i és possible que trobeu errors i +penjades. Si us cal una versió estable del LilyPond, recomanem +l'ús de la versió 2.18. + +@newsEnd + +@newsItem +@subsubheading Lilypond 2.18.2 llençat el @emph{23 de març de 2014}! + +Estem orgullosos d'anunciar el llançament del GNU LilyPond +2.18.2. El LilyPond és un programa de gravat musical dedicat a la +producció de les partitures musicals de la màxima qualitat +possible. Introdueix l'estètica de la música amb gravat +tradicional a les impressions d'ordinador. + +Aquesta versió proveeix nombroses actualitzacions a la versió +2.18.0, incloent-hi manuals actualitzats. Recomanem a tots els +usuaris actualitzar a aquesta versió. + +@newsEnd + + +@newsItem +@subsubheading Una producció amb el LilyPond anomenada MILLOR EDICIÓ DE 2014 @emph{11 de març de 2014} + +Estem encantats d'anunciar que la nova edició de les cançons +de l'Oskar Fried (1871-1941), publicada recentment pels nostres +col·laboradors Urs Liska i Janek Warchoł [1], rebrà la +"Musikeditionspreis MILLOR EDICIÓ 2014'' de l'Associació d'Editors +de Música Alemanya [2]! La cerimònia tindrà lloc en un parell de +dies a la Frankfurt Musikmesse [3]. + +Congratulem el Janek i l'Urs per guanyar un reconeixement així per +l'excel·lència tipogràfica i editorial del seu treball. També +estem encantats d'informar que tenen la intenció de posar a +disposició el seu treball sota una llicència lliure en quant es +cobreixin les despeses de l'editor. Si us plau suporteu aquesta +iniciativa comprant el volum imprès a través de l'editor [4] o +aportant una contribució a la campanya Indiegogo [5]! + +[1] @uref{http://lilypondblog.org/category/fried-songs}@* +[2] @uref{http://www.best-edition.de}@* +[3] @uref{https://musik.messefrankfurt.com/frankfurt/en/besucher/events/awards/best_edition.html}@* +[4] @uref{http://www.sound-rel.de}@* +[5] @uref{http://igg.me/at/free-fried} + +@newsEnd + + +@newsItem +@subsubheading Lilypond 2.18.0 llençat el @emph{29 de Desembre de 2013}! + +Estem orgullosos d'anunciar el llançament del GNU LilyPond +2.18.0. El LilyPond és un programa de gravat musical dedicat a la +producció de les partitures musicals de la màxima qualitat +possible. Introdueix l'estètica de la música amb gravat +tradicional a les impressions d'ordinador. + +Entre les nombroses millores i canvis, els següents poden ser el +més visibles: + +@itemize @bullet +@item +Molts elements es posicionen ara usant contorn real en comptes +d'una capsa contenidora rectangular. Això redueix en gran part +l'aparició de espais lletjos grans. + +@item +Els conjunts i les anul·lacions poden usar ara la sintaxi +@example +\override Voice.TextSpanner.bound-details.left.text = "rit." +@end example +en comptes de la notació prèvia +@example +\override Voice.TextSpanner #'(bound-details left text) = "rit." +@end example + +@item +Els tresets amb una longitud de grup donada es poden escriure ara com +@example +\tuplet 3/2 4 @{ c8 c c c c c @} +@end example +en comptes de +@example +\times 2/3 @{ c8 c c @} \times 2/3 @{ c8 c c @} +@end example +@end itemize + +Una llista completa de noves funcionalitats destacables es poden +trobar a: + +@example +@uref{http://lilypond.org/doc/v2.18/Documentation/changes/index.html} +@end example + +Moltes gràcies a un gran nombre d'entusiastes del LilyPond les +contribucions dels quals han permès que un desenvolupador del +nucli, el David Kastrup, es pugui enfocar exclusivament en el +LilyPond durant tot el cicle de desenvolupament. + +El LilyPond 2.18 us ha estat portat per + +@table @asis +@item Desenvolupadors principals: +Bertrand Bordage, Trevor Daniels, Colin Hall, Phil Holmes, Ian +Hulin, Reinhold Kainhofer, David Kastrup, Jonathan Kulp, Werner +Lemberg, John Mandereau, Patrick McCarty, Joe Neeman, Han-Wen +Nienhuys, Jan Nieuwenhuizen, Graham Percival, Mark Polesky, Neil +Puttock, Mike Solomon, Carl Sorensen, Francisco Vila, Valentin +Villenave, Janek Warchoł + +@item Col·laboradors bàsics: +Aleksandr Andreev, Frédéric Bron, Torsten Hämmerle, Marc Hohl, +James Lowe, Andrew Main, Thomas Morley, David Nalesnik, Keith +OHara, Benkő Pál, Anders Pilegaard, Julien Rioux, Johannes Rohrer, +Adam Spiers, Heikki Tauriainen + +@item Autors de documentació: +Frédéric Bron, Federico Bruni, Colin Campbell, Urs Liska, James +Lowe, Thomas Morley, Jean-Charles Malahieude, Guy Stalnaker, +Martin Tarenskeen, Arnold Theresius, Rodolfo Zitellini + +@item Esquadró d'errors: +Colin Campbell, Eluze, Marc Hohl, Phil Holmes, Marek Klein, Ralph +Palmer + +@item Equip de suport: +Colin Campbell, Eluze, Marc Hohl, Marek Klein, Kieren MacMillan, +Urs Liska, Ralph Palmer + +@item Traductors: +Federico Bruni, Luca Rossetto Casel, Felipe Castro, Pavel Fric, +Jean-Charles Malahieude, Till Paala, Yoshiki Sawada + +@end table +i nombrosos altres col·laboradors. + +@newsEnd + +@newsItem +@subsubheading Blog del LilyPond. @emph{2 de juny de 2013} + +Janek Warchoł ha creat un blog del LilyPond. El podeu trobar a +@uref{http://lilypondblog.org/, lilypondblog.org}! + +@newsEnd + +@newsItem +@subsubheading LilyPond 2.16.2 llençat el @emph{4 de gener de 2013}! + +Estem contents d'anunciar el llançament del LilyPond +2.16.2. Aquest llançament és principalment per corregir un +problema amb el lilypond-book executant-se al Windows. Recomanem +que sols les persones que necessiten aquesta funcionalitat +actualitzin a aquesta versió + +@newsEnd + +@newsItem +@subsubheading El LilyPond Report #28. @emph{12 de novembre de 2012} + +L'informe @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-28, +número d'octubre del @emph{LilyPond Report}} es focalitza en la +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?LilyPond-meeting-in-Waltrop, +reunió l'últim agost de desenvolupadors i usuaris del LilyPond} a +Waltrop, Alemanya. Òbviament, hi ha també alguns enraonaments +sobre el LilyPond causats pel llançament de les versions 2.16.0 i +2.17.0 que han passat des d'aquest lloc. + +També hi ha dos informes financers mensuals de David Kastrup, atès +que la seva feina sobre el LilyPond és +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-24#an_urgent_request_for_funding, +pagat exclusivament per} contribucions financeres d'altres +desenvolupadors i usuaris (gràcies!), i un informa sobre les +experiències de +@uref{http://scorio.com, un servei de gravat musical basat en la +web} que usa el LilyPond internament. + +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-28, Llegiu el +LilyPond Report 28} ara; els comentaris i les contribucions són +molt benvinguts! +@newsEnd + +@newsItem +@subsubheading LilyPond 2.16.1 llençat el @emph{9 de novembre de 2012}! + +Estem contents d'anunciar el llançament del LilyPond 2.16.1. Té +nombroses actualitzacions sobre la versió estable prèvia, i no +hauria de causar cap problema. Recomanem a tothom actualitzar a +aquesta versió. +@newsEnd + +@newsItem +@subsubheading Lilypond 2.16.0 llençat el @emph{24 d'agost de 2012}! + +Estem orgullosos d'anunciar el llançament del GNU LilyPond +2.16.1. El LilyPond és un programa de gravat musical, dedicat a +la producció de les partitures musicals de la màxima qualitat +possible. Introdueix l'estètica de la música amb gravat +tradicional a les impressions d'ordinador. + +S'han fet moltes millores a l'últim any des de la versió principal +estable prèvia. Algunes millores importants són: + +@itemize +@item +Suport per a la notació kievan de quadrats +@item +S'han millorat molt les interfícies d'usuari i de programació +@item +Les funcions musicals s'han fet molt més versàtils +@end itemize + +Es dóna una llista completa de noves funcionalitats a: + +@example +@uref{http://lilypond.org/doc/v2.16/Documentation/changes/index.html} +@end example + +Feliç gravat musical! LilyPond 2.16 us ha estat portat per... + +Principal equip de desenvolupament: + +Bertrand Bordage, Trevor Daniels, Colin Hall, Phil Holmes, Ian Hulin, +Reinhold Kainhofer, David Kastrup, Jonathan Kulp, Werner Lemberg, +John Mandereau, Patrick McCarty, Joe Neeman, Han-Wen Nienhuys, +Jan Nieuwenhuizen, Graham Percival, Mark Polesky, Neil Puttock, +Mike Solomon, Carl Sorensen, Francisco Vila, Valentin Villenave, +Jan Warchoł + +Col·laboradors en programació: + +Aleksandr Andreev, Sven Axelsson, Peter Chubb, Karin Hoethker, +Marc Hohl, David Nalesnik, Justin Ohmie, Benkő Pál, Julien Rioux, Patrick Schmidt, +Adam Spiers, Heikki Taurainen, Piers Titus van der Torren, +Jan-Peter Voigt, Janek Warchol + +Col·laboradors de documentació: + +James Lowe, Pavel Roskin, Alberto Simoes, Stefan Weil + +Esquadró d'errors: + +Colin Campbell, Eluze, Phil Holmes, Marek Klein, Ralph Palmer, +James Lowe + +Suport: + +Colin Campbell, Christian Hitz, Phil Holmes + +Col·laboradors de traducció: + +Jean-Charles Malahieude, Till Paala, Yoshiki Sawada + +@newsEnd diff --git a/Documentation/changes.tely b/Documentation/changes.tely index d985b534cd..fb1a77f633 100644 --- a/Documentation/changes.tely +++ b/Documentation/changes.tely @@ -29,14 +29,14 @@ See user manual, \NAME\ @end macro -@documentencoding utf-8 +@documentencoding UTF-8 @documentlanguage en @afourpaper @finalout @node Top -@top New features in 2.18 since 2.16 +@top New features in 2.20 since 2.18 @allowcodebreaks false @@ -62,461 +62,855 @@ which scares away people. @end ignore @item -The PostScript functionality of stroke adjustment is no longer -applied automatically but left to the discretion of the PostScript -device (by default, Ghostscript uses it for resolutions up to -150dpi when generating raster images). When it is enabled, a more -complex drawing algorithm designed to benefit from stroke -adjustment is employed mostly for stems and bar lines. +Blocks introduced with @code{\header} can be stored in variables +and used as arguments to music and scheme functions and as the +body of @code{#@{@dots{}#@}} constructs. They are represented as +a Guile module. -Stroke adjustment can be forced by specifying the command line -option @samp{-dstrokeadjust} to LilyPond. When generating -@code{PDF} files, this will usually result in markedly better -looking @code{PDF} previews but significantly larger file size. -Print quality at high resolutions will be unaffected. +While @code{\book}, @code{\bookpart}, @code{\score}, @code{\with}, +@code{\layout}, @code{\midi}, @code{\paper} blocks can be passed +around in similar manner, they are represented by different data +types. @item -There is now a new context type called @code{NullVoice} which, while not -appearing in the printed output, can be used to align lyrics. This can -be particularly convenient when used in parallel with a -@code{\partcombine} construct. +Dot-separated symbol lists like @code{FretBoard.stencil} were +already supported as of version@tie{}2.18. They may now also +contain unsigned integers, and may alternatively be separated by +commata. This allows usage such as +@lilypond[quote,verbatim] +{ \time 2,2,1 5/8 g'8 8 8 8 8 } +@end lilypond +and +@example +\tagGroup violin,oboe,bassoon +@end example -@lilypond[verbatim,quote] -soprano = \relative c' { c e g c } -alto = \relative c' { a c e g } -verse = \lyricmode { This is my song } +@item +Such lists may also be used in expressions for assignments, sets, +and overrides. This allows usage such as +@lilypond[quote,verbatim] +{ \unset Timing.beamExceptions + \set Timing.beatStructure = 1,2,1 + g'8 8 8 8 8 8 8 8 } +@end lilypond + +@item +Association list elements could previously be assigned values +individually (for example, paper variables like +@code{system-system-spacing.basic-distance}). They may now be +also referenced in this manner, as with +@example +\paper @{ + \void \displayScheme \system-system-spacing.basic-distance +@} +@end example + +In combination with the previously mentioned changes, this allows +setting and referencing pseudovariables like @code{violin.1}. + +@item +LilyPond source files may now be embedded inside the generated PDF files. +This experimental feature is disabled by default and may be regarded as unsafe, +as PDF documents with hidden content tend to present a security risk. +Please note that not all PDF viewers have the ability to handle embedded +documents (if not, the PDF output will appear normally and source files +will remain invisible). This feature only works with the PDF backend. + +@item +French note names are now defined specifically instead of +being aliased to Italian note names: in addition to the +generic Italian-derived syntax, the @var{d} pitch may be +entered as @code{ré}. Double sharps may also be +entered using the @code{-x} suffix. + +@item +Additional bass strings (for lute tablature) are supported. +@lilypond[quote,verbatim] +m = { f'4 d' a f d a, g, fis, e, d, c, \bar "|." } \score { - \new Staff << - \partcombine \soprano \alto - \new NullVoice = "aligner" \soprano - \new Lyrics \lyricsto "aligner" \verse - >> - \layout {} + \new TabStaff \m + \layout { + \context { + \Score + tablatureFormat = #fret-letter-tablature-format + } + \context { + \TabStaff + stringTunings = \stringTuning + additionalBassStrings = \stringTuning + fretLabels = #'("a" "b" "r" "d" "e" "f" "g" "h" "i" "k") + } + } } @end lilypond +@item +The markup-list-command @code{\table} is now available. +Each column may be aligned differently. +@lilypond[quote,verbatim] +\markuplist { + \override #'(padding . 2) + \table + #'(0 1 0 -1) + { + \underline { center-aligned right-aligned center-aligned left-aligned } + one "1" thousandth "0.001" + eleven "11" hundredth "0.01" + twenty "20" tenth "0.1" + thousand "1000" one "1.0" + } +} +@end lilypond @item -Several articulations can be put into a single variable or -returned from an event function: +A new markup-command, @code{\with-dimensions-from}, makes +@code{\with-dimensions} easier to use by taking the new +dimensions from a markup object, given as first argument. +@lilypond[quote,verbatim] +\markup { + \pattern #5 #Y #0 "x" + \pattern #5 #Y #0 \with-dimensions-from "x" "f" + \pattern #5 #Y #0 \with-dimensions-from "x" "g" + \override #'(baseline-skip . 2) + \column { + \pattern #5 #X #0 "n" + \pattern #5 #X #0 \with-dimensions-from "n" "m" + \pattern #5 #X #0 \with-dimensions-from "n" "!" + } +} +@end lilypond -@lilypond[verbatim,quote] -sempreStacc = -. ^\markup \italic sempre -\relative { c''4\sempreStacc c c c } +@item +A new page breaking function @code{ly:one-line-auto-height-breaking} +places a whole score on a single line and changes the page width +to match, just like @code{ly:one-line-breaking}. The difference is that +it also automatically modifies the height of the page to fit the height +of the music. + +@item +Markup-command @code{\draw-squiggle-line} is now available. +Customizing is possible with overrides of @code{thickness}, @code{angularity}, +@code{height} and @code{orientation} +@lilypond[quote,verbatim] +\markup + \overlay { + \draw-squiggle-line #0.5 #'(3 . 3) ##t + + \translate #'(3 . 3) + \override #'(thickness . 4) + \draw-squiggle-line #0.5 #'(3 . -3) ##t + + \translate #'(6 . 0) + \override #'(angularity . -5) + \draw-squiggle-line #0.5 #'(-3 . -3) ##t + + \translate #'(3 . -3) + \override #'(angularity . 2) + \override #'(height . 0.3) + \override #'(orientation . -1) + \draw-squiggle-line #0.2 #'(-3 . 3) ##t + } @end lilypond @item -The baseline of score markups is now taken from the reference -point (usually the middle of the staff) of the first bottom system -rather than the top of the bounding rectangle. The following -@lilypond[verbatim,quote] +A new command, @code{\RemoveAllEmptyStaves}, has been made available, which +acts exactly like @code{\RemoveEmptyStaves}, except for also removing empty +staves on the first system in a score. + +@item +Markup-commands @code{\undertie} and @code{\overtie} are now available, as well +as the generic markup-command @code{\tie}. +@lilypond[quote,verbatim] \markup { - violin: \score { \new Staff { 1 } - \layout { indent=0 } } , - cello: \score { \new Staff { \clef "bass" } - \layout { indent=0 } } + \undertie "undertied" + \overtie "overtied" +} + +m = { + c''1 \prall -\tweak text \markup \tie "131" -1 } + +{ \voiceOne \m \voiceTwo \m } @end lilypond -previously looked like -@lilypond[quote] + +@item +@code{TabStaff} is now able to print micro-tones for bendings etc. +@lilypond[quote,verbatim] +\layout { + \context { + \Score + supportNonIntegerFret = ##t + } +} + +mus = \relative { c'4 cih d dih } + +<< + \new Staff << \clef "G_8" \mus >> + \new TabStaff \mus +>> +@end lilypond + +@item +Two new styles of whiteout are now available. The @code{outline} style +approximates the contours of a glyph's outline, and its shape is +produced from multiple displaced copies of the glyph. The +@code{rounded-box} style produces a rounded rectangle shape. For all +three styles, including the default @code{box} style, the whiteout +shape's @code{thickness}, as a multiple of staff-line thickness, can be +customized. + +@lilypond[verbatim,quote] +\markup { + \combine + \filled-box #'(-1 . 15) #'(-3 . 4) #1 + \override #'(thickness . 3) + \whiteout whiteout-box +} +\markup { + \combine + \filled-box #'(-1 . 24) #'(-3 . 4) #1 + \override #'(style . rounded-box) + \override #'(thickness . 3) + \whiteout whiteout-rounded-box +} \markup { - violin: \general-align #Y #UP - \score { \new Staff { 1 } - \layout { indent=0 } } , - cello: \general-align #Y #UP - \score { \new Staff { \clef "bass" } - \layout { indent=0 } } + \combine + \filled-box #'(-1 . 18) #'(-3 . 4) #1 + \override #'(style . outline) + \override #'(thickness . 3) + \whiteout whiteout-outline +} +\relative { + \override Staff.Clef.whiteout-style = #'outline + \override Staff.Clef.whiteout = 3 + g'1 +} +@end lilypond + +@item +All of @code{\override}, @code{\revert}, @code{\set}, and +@code{\unset} now work with the @code{\once} prefix for making +one-time settings. +@lilypond[quote,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \once \override NoteHead.color = #green + g4 a + \once \revert NoteHead.color + b c | + \revert NoteHead.color + f2 c | } @end lilypond -without a reliable way to get both scores to line up. @item -LilyPond no longer automatically infers a @samp{\defaultchild} -context in a context definition with @samp{\accepts} clauses. Any -context definition without an explicit or inherited -@samp{\defaultchild} definition counts as a @samp{Bottom} context -and will be eligible for rhythmic events and overrides without -causing the implicit creation of other contexts. Be sure to -specify a @samp{\defaultchild} for non-@samp{Bottom} contexts when -defining them from scratch. +When outputting MIDI, LilyPond will now store the @code{title} +defined in a score's @code{\header} block (or, if there is no +such definition on the @code{\score} level, the first such +definition found in a @code{\header} block of the score's +enclosing @code{\bookpart}, @code{\book}, or top-level scope) +as the name of the MIDI sequence in the MIDI file. Optionally, +the name of the MIDI sequence can be overridden using the new +@code{midititle} @code{\header} field independently of +@code{title} (for example, in case @code{title} contains markup +code which does not render as plain text in a satisfactory way +automatically). @item -There is now extensive support for both discant and bass accordion -register symbols in the @samp{scm accreg} module, see -@ruser{Accordion Registers}. +Music (and scheme and void) functions and markup commands that +just supply the final parameters to a chain of overrides, music +function and markup command calls can now be defined in the form +of just writing the expression cut short with @code{\etc}. + @lilypond[verbatim,quote] -#(use-modules (scm accreg)) -\new PianoStaff -<< - \new Staff \relative - { \clef "treble" \discant "10" - r8 s32 f'[ bes f] s e[ a e] s d[ g d] s16 e32[ a] - \discant "121" - << { r16 r r } \\ - { d r a r bes r } >> | - 1 - } - \new Staff \relative - { \clef "treble" \freeBass "1" - r8 d'32 s16. c32 s16. bes32 s16. a32[ cis] s16 - \clef "bass" \stdBass "Master" - << { r16 ^"b" r ^"am" r ^"gm" | - 1^"a" } \\ - { d8_"D" c_"C" bes_"B" | a1_"A" } - >> - } ->> +bold-red-markup = \markup \bold \with-color #red \etc +highlight = \tweak font-size 3 \tweak color #red \etc + +\markup \bold-red "text" +\markuplist \column-lines \bold-red { One Two } + +{ c' \highlight d' e'2-\highlight -! } @end lilypond @item -New commands @code{markLengthOn} and @code{markLengthOff} control -the allowance of horizontal space for tempo and rehearsal marks. +LilyPond functions defined with @code{define-music-function}, +@code{define-event-function}, @code{define-scheme-function} and +@code{define-void-function} can now be directly called from Scheme +as if they were genuine Scheme procedures. Argument checking and +matching will still be performed in the same manner as when +calling the function through LilyPond input. This includes the +insertion of defaults for optional arguments not matching their +predicates. Instead of using @code{\default} in the actual +argument list for explicitly skipping a sequence of optional +arguments, @code{*unspecified*} can be employed. + +@item +Current input location and parser are now stored in GUILE fluids +and can be referenced via the function calls @code{(*location*)} +and @code{(*parser*)}. Consequently, a lot of functions +previously taking an explicit @code{parser} argument no longer do +so. + +Functions defined with @code{define-music-function}, +@code{define-event-function}, @code{define-scheme-function} and +@code{define-void-function} no longer use @code{parser} and +@code{location} arguments. + +With those particular definitions, LilyPond will try to recognize +legacy use of @code{parser} and @code{location} arguments, +providing backwards-compatible semantics for some time. + +@item +In the "english" notename language, the long notenames for pitches +with accidentals now contain a hyphen for better readability. You +now have to write +@example +\key a-flat \major +@end example +instead of the previous +@example +\key aflat \major +@end example + +Double accidentals do not get another hyphen, so the Dutch +@code{cisis} has the long English notename @code{c-sharpsharp}. +@item +The visual style of tremolo slashes (shape, style and slope) +is now more finely controlled. @lilypond[quote,relative=2] -\markLengthOn -\compressFullBarRests -\tempo "Molto vivace" c2 c' -\mark\default -\tempo "Meno mosso" R1*16 -\mark\default -g,2 g -\bar "||" -\markLengthOff -\tempo "Molto vivace" c2 c' -\mark#1 -\tempo "Meno mosso" R1*16 -\mark\default -g,2 g + a8:32 b: c: d: + \override StemTremolo.shape = #'beam-like + a: b: c: d: + \override StemTremolo.style = #'constant + a: b: c: d: + g,2 @end lilypond + @item -Rehearsal marks at the beginning of a line are now placed to the right -of the clef and key signature by default. As in previous versions, the -@code{break-alignable-interface} controls the behavior. +Multi-measure rests have length according to their total duration, +under the control of @code{MultiMeasureRest.space-increment}. +@lilypond[quote] +{ \compressFullBarRests + \override Staff.MultiMeasureRest.space-increment = 3.0 + R1*2 R1*12 R1*64 } +@end lilypond -@lilypond[quote,relative=2] -\set Score.barNumberVisibility = #all-bar-numbers-visible -\set Timing.currentBarNumber = #72 -\bar"||" \time 3/4 \key e\major \mark#10 \tempo "Adagio" b2. +@item +Page numbers may now be printed in roman numerals, by setting the +@code{page-number-type} paper variable. + +@item +It is now possible to use @code{\time} and @code{\partial} +together to change the time signature in mid measure. + +@lilypond[verbatim,quote,relative=1] +\override Score.BarNumber.break-visibility = #end-of-line-invisible +\partial 4 \time 3/4 f4 | 2 4 | 2 \bar "||" +\time 9/8 \partial 4. f8 8 8 | 2. 8 8 8 | +@end lilypond + +@item +It is now possible to override the @code{text} property of +chord names. + +@lilypond[verbatim,fragment,quote] +<< +\new ChordNames \chordmode { + a' b c:7 + \once \override ChordName.text = #"foo" + d +} +>> @end lilypond @item -Decimal numbers can now be written directly in music, -without a hash sign. Together with the previous change -in the way object properties are specified, the code to -change the length of stems has changed from this: +Improved horizontal alignment when using @code{TextScript}, +with @code{DynamicText} or @code{LyricText}. + +@item +A new command @code{\magnifyStaff} has been added which scales staff +sizes, staff lines, bar lines, beamlets and horizontal spacing generally +at the @code{Staff} context level. Staff lines are prevented from being +scaled smaller than the default since the thickness of stems, slurs, and +the like are all based on the staff line thickness. + +@item +@code{InstrumentName} now supports @code{text-interface}. + +@item +There is now support for controlling the @q{expression level} of +MIDI channels using the @code{Staff.midiExpression} context property. +This can be used to alter the perceived volume of even sustained notes +(albeit in a very @q{low-level} way) and accepts a number value between +@code{0.0} and @code{1.0}. + @example -\override Stem #'length = #5.6 -e' f' g' a' +\score @{ + \new Staff \with @{ + midiExpression = #0.6 + midiInstrument = #"clarinet" + @} + << + @{ a'1~ a'1 @} + @{ + \set Staff.midiExpression = #0.7 s4\f\< + \set Staff.midiExpression = #0.8 s4 + \set Staff.midiExpression = #0.9 s4 + \set Staff.midiExpression = #1.0 s4 + + \set Staff.midiExpression = #0.9 s4\> + \set Staff.midiExpression = #0.8 s4 + \set Staff.midiExpression = #0.7 s4 + \set Staff.midiExpression = #0.6 s4\! + @} + >> + \midi @{ @} +@} @end example -to this: + +@item +Support for making it easier to use alternative @q{music} fonts other +than the default Emmentaler in LilyPond has been added. See +@uref{http://fonts.openlilylib.org/} for more information. + +@item +Grobs and their parents can now be aligned separately allowing +more flexibility for grob positions. For example the @q{left} edge of a +grob can now be aligned on the @q{center} of its parent. + +@item +Improvements to the @code{\partial} command have been made to +avoid problems when using multiple, parallel contexts. + +@item @code{\chordmode} can now use @code{< >} and @code{<< >>} +constructs. + +@item +A new command @code{\tagGroup} has now been added. This complements +the existing @code{\keepWithTag} and @code{\removeWithTag} commands. +For Example: + +@example +\tagGroup #'(violinI violinII viola cello) +@end example + +declares a list of @q{tags} that belong to a single @q{tag group}. + @example -\override Stem.length = 5.6 -e' f' g' a' +\keepWithTag #'violinI @end example -One has to write a digit on both sides of the dot -- values like -@code{4.} or @code{-.3} are not allowed. +Is now only concerned with @q{tags} from @q{violinI}’s tag group. -Decimal fractions are also not accepted in @code{\chordmode}. +Any element of the included music tagged with one or more tags from the +group, but @emph{not} with @var{violinI}, will be removed. @item -A number of shorthands like @code{(}, @code{)}, @code{|}, -@code{[}, @code{]}, @code{~}, @code{\(}, @code{\)} and others can -now freely be redefined like normal commands. An example would be -@lilypond[verbatim,quote] -"\\{" = ( -"\\}" = ) -"(" = \melisma -")" = \melismaEnd +The @code{\addlyrics} function now works with arbitrary contexts +incuding @code{Staff}. -\new Staff << - \relative c' { - c8 \{ d e f \} % slurred - g ( a b c ) % no slur, but with melisma - c,1 \bar "|." - } - \addlyrics { Li -- ly -- pond. } ->> +@item +String numbers can now also be used to print roman numerals +(e.g. for unfretted string instruments). +@lilypond[verbatim,quote,relative=2] +c2\2 +\romanStringNumbers +c\2 +\arabicStringNumbers +c1\3 @end lilypond @item -The articulation shorthand for @code{\staccatissimo} has been -renamed from @code{-|} to@tie{}@code{-!}. +The @code{thin-kern} property of the @code{BarLine} grob has been +renamed to @code{segno-kern}. @item -Tempo change ranges are now written as @code{\tempo 4 = 60 - 68} -rather than @code{\tempo 4 = 60 ~ 68}. +@code{KeyCancellation} grobs now ignore cue clefs (like +@code{KeySignature} grobs do). @item -Grob @code{OctavateEight} was renamed to @code{ClefModifier}. -Related context properties were renamed from @code{xxxOctavationyyy} -to @code{xxxTranspositionyyy}. +Add support for @code{\once@tie{}\unset} @item -There is a new @code{\absolute} command explicitly marking music -as being entered in absolute pitch. While this has been the -default previously, an explicit @code{\absolute} also prevents -reinterpretation when the passage is placed inside of -@code{\relative}: -@lilypond[verbatim,quote] -\relative c { c'4 \absolute { f'' g'' } c } +It is now possible to individually color both the dots and parentheses +in fret diagrams when using the @code{\fret-diagram-verbose} markup +command. + +@lilypond[verbatim,quote,relative=1] +\new Voice { + c1^\markup { + \override #'(fret-diagram-details . ( + (finger-code . in-dot))) { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1 red) + (place-fret 4 5 2 inverted) + (place-fret 3 5 3 green) + (place-fret 2 5 4 blue inverted) + (place-fret 1 3 1 violet) + (barre 5 1 3 )) + } + } + c1^\markup { + \override #'(fret-diagram-details . ( + (finger-code . below-string))) { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1 red parenthesized) + (place-fret 4 5 2 yellow + default-paren-color + parenthesized) + (place-fret 3 5 3 green) + (place-fret 2 5 4 blue ) + (place-fret 1 3 1) + (barre 5 1 3)) + } + } +} @end lilypond @item -When @code{\relative} is used without an explicit reference pitch, -the reference pitch now is the middle of the first octave, making -the first entered pitch indistinguishable from absolute pitch. -Previously, omitting the reference pitch would have lead to a -default of @code{c'}. Since that choice was somewhat arbitrary, -recommended usage was to always specify the reference pitch. +Two new properties have been added for use in +@code{fret-diagram-details} when using the @code{\fret-diagram-verbose} +markup command; @code{fret-label-horizontal-offset} which affects the +@code{fret-label-indication} and @code{paren-padding} which controls the +space between the dot and the parentheses surrounding it. + +@lilypond[verbatim,quote,relative=1] +\new Voice { + c1^\markup { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1) + (place-fret 4 5 2) + (place-fret 3 5 3) + (place-fret 1 6 4 parenthesized) + (place-fret 2 3 1) + (barre 5 2 3)) + } + c1^\markup { + \override #'(fret-diagram-details . ( + (fret-label-horizontal-offset . 2) + (paren-padding . 0.25))) { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1) + (place-fret 4 5 2) + (place-fret 3 5 3) + (place-fret 1 6 4 parenthesized) + (place-fret 2 3 1) + (barre 5 2 3)) + } + } +} +@end lilypond @item -A new command @code{\single} can be used for converting a property -override into a tweak to be applied on a single music expression: +A new markup command @code{\justify-line} has been added. Similar to +the @code{\fill-line} markup command except that instead of setting +@emph{words} in columns, the @code{\justify-line} command balances the +whitespace between them ensuring that when there are three or more +words in a markup, the whitespace is always consistent. -@lilypond[quote,verbatim,relative=2] -1 +@lilypond[quote,verbatim,papersize=a6] +\markup \fill-line {oooooo oooooo oooooo oooooo} +\markup \fill-line {ooooooooo oooooooo oo ooo} +@end lilypond + +@lilypond[quote,verbatim,papersize=a6] +\markup \justify-line {oooooo oooooo oooooo oooooo} +\markup \justify-line {ooooooooo oooooooo oo ooo} @end lilypond @item -Two ways of letting graphical objects not appear in the output are -overriding its @code{transparent} property with @code{#t} -(retaining the original spacing) or overriding its @code{stencil} -property with @code{#f} (not using any space at all). Those two -operations now have the shorthands @code{\hide} and @code{\omit}, -respectively. They can either be given a music expression to -tweak, or the name of a graphical object for which an override -should be created (for specifying both, use @code{\single} on the -override form): +A new command @code{\magnifyMusic} has been added, which allows +the notation size to be changed without changing the staff size, +while automatically scaling stems, beams, and horizontal spacing. -@lilypond[quote,verbatim] -\new Staff \with { \omit Clef } -\relative c'' 1 +@lilypond[verbatim,quote] +\new Staff << + \new Voice \relative { + \voiceOne + 4 8. 16 8 4 r8 + } + \new Voice \relative { + \voiceTwo + \magnifyMusic 0.63 { + \override Score.SpacingSpanner.spacing-increment = #(* 1.2 0.63) + r32 c'' a c a c a c r c a c a c a c + r c a c a c a c a c a c a c a c + } + } +>> @end lilypond @item -A new command @code{\temporary} can be applied to overrides in -order to not have them replace previous property settings. If a -@code{\revert} is applied to the same property subsequently, the -previous setting reappears: +A new flexible template suitable for a range of choral music, is now +provided. This may be used to create simple choral music, with or +without piano accompaniment, in two or four staves. Unlike other +templates, this template is @q{built-in}, which means it does not +need to be copied and edited: instead it is simply @code{\include}'d +in the input file. For details, see @rlearning{Built-in templates}. + +@item +The positioning of tuplet numbers for kneed beams has been significantly +improved. Previously, tuplet numbers were placed according to the +position of the tuplet bracket, even if it was not printed. This could +lead to stranded tuplet numbers. Now they are now positioned +closer to the kneed-beam when an appropriate beam segment exists for its +placement and when the bracket is not drawn. + +Collision detection is also added, offsetting horizontally if too close +to an adjoining note column but preserving the number's vertical +distance from the kneed beam. If the number itself is too large to +fit in the available space the original, bracket-based, positioning +system is used instead; and in the event of a collision (e.g. with an +accidental) the tuplet number is moved vertically away instead. + +@lilypond[verbatim,fragment,quote,relative=1] +\time 3/4 +\override Beam.auto-knee-gap = 3 +\tuplet 3/2 4 { + g8 c'' e, + c'8 g,, e'' + g,,8 e''' c,, +} +@end lilypond -@lilypond[quote,verbatim,relative=2] -\override NoteHead.color = #red c4 -\override NoteHead.color = #green d -\revert NoteHead.color e2 -\override NoteHead.color = #red c4 -\temporary\override NoteHead.color = #green d -\revert NoteHead.color e -\revert NoteHead.color c +@noindent +The original kneed-beam tuplet behavior is still available through an +@code{\override} via a new, @code{knee-to-beam} property. + +@lilypond[verbatim,fragment,quote,relative=1] +\time 3/4 +\override Beam.auto-knee-gap = 3 +\override TupletNumber.knee-to-beam = ##f +\tuplet 3/2 4 { + g8 c'' e, + c'8 g,, e'' + g,,8 e''' c,, +} @end lilypond -This is mainly useful for writing music functions that need to -have some property changed just for the duration of the function. +@item +@code{\lyricsto} and @code{\addLyrics} have been @q{harmonized}. Both +now accept the same kind of delimited argument list that @code{\lyrics} +and @code{\chords} accept. Backward compatibility has been added so +music identifiers (i.e. @code{\mus}) are permitted as arguments. A +@code{convert-ly} rule has been added that removes redundant uses of +@code{\lyricmode} and rearranges combinations with context starters such +that @code{\lyricsto} in general is applied last (i.e. like +@code{\lyricmode} would be). @item -@code{\tag}, @code{\removeWithTag}, and @code{\keepWithTag} can -now accept a list of symbols rather than just a single symbol for -marking, removing, and keeping music with any of multiple tags. -This is particularly important for @code{\keepWithTag} since one -cannot achieve the same effect by using multiple consecutive -@code{\keepWithTag} commands. +Scheme functions and identifiers can now be used as output definitions. @item -The @samp{-d old-relative} option has been removed. Not actually -accessible from the command line any more, its remaining use was -for interpretating @code{\relative} in LilyPond files converted -automatically from version@tie{}1.8 or older. It is unclear how -much of this was actually still operative. +Scheme expressions can now be used as chord constituents. @item -The meaning of @code{instrumentTransposition} has been reversed. -After -@example -\set instrumentTransposition = #@{ b #@} -@end example -a written @code{c'} now sounds like @code{b}. Previously, this -would have been the other way round. This and the following change -should make dealing with transposing instruments more -straightforward. +Improved visual spacing of small and regular @q{MI} Funk and Walker +noteheads so they are now the same width as other shaped notes in +their respective sets. @code{SOL} noteheads are also now visually +improved when used with both the normal Aiken and Sacred Harp heads, as +well as with the thin variants. @item -The music generated by @code{\set} and @code{\override} commands -is no longer affected by @code{\transpose}. The main consequence -is that @code{\transpose} will transpose audible/@/concert pitch and -printed pitch by the same amount even when the transposed music -contains @code{\transposition}. Previously, -@example -\transpose c' f' \transposition bes' -@end example -was equivalent to @code{\transposition f'}. Now it stays -equivalent to @code{\transposition bes'}. +@code{LeftEdge} now has a definable @code{Y-extent} (i.e.vertical). See +@rinternals{LeftEdge}. @item -When checking for collisions, LilyPond no longer treats objects as -rectangles. Instead, the actual shape of objects is approximated -using an integral-like approach. This generally results in more -even and snug positioning of objects and systems: +Added a new @code{make-path-stencil} function that supports all +@code{path} commands both relative and absolute: -@lilypond[relative=1] -#(ly:set-option 'debug-skylines #t) -\dynamicUp -c'4\f a4\f d\f( f) -a,4\< c c c\! -d4-.\downbow a4^"r'venu..." c \tempo "T1" e +@code{lineto}, @code{rlineto}, @code{curveto}, @code{rcurveto}, +@code{moveto}, @code{rmoveto}, @code{closepath}. The function also +supports @q{single-letter} syntax used in standard SVG path commands: + +@code{L}, @code{l}, @code{C}, @code{c}, @code{M}, @code{m}, @code{Z} and +@code{z}. The new command is also backward-compatible with the original +@code{make-connected-path-stencil} function. Also see +@file{scm/stencil.scm}. + +@item +Context properties named in the @samp{alternativeRestores} property are +restored to their value at the start of the @emph{first} alternative in +all subsequent alternatives. + +Currently the default set restores @q{current meter}; + +@lilypond[verbatim,fragment,quote,relative=2] +\time 3/4 +\repeat volta 2 { c2 e4 | } +\alternative { + { \time 4/4 f2 d | } + { f2 d4 | } +} +g2. | @end lilypond -Previously, the above snippet looked like this: - -@lilypond[relative=1] -#(ly:set-option 'debug-skylines #t) -\override Hairpin #'vertical-skylines = #'() -\override DynamicText #'vertical-skylines = #'() -\override TextScript #'vertical-skylines = #'() -\override Score.MetronomeMark #'vertical-skylines = #'() -\override Staff.Clef #'vertical-skylines = #'() -\dynamicUp -c'4\f a4\f d\f( f) -a,4\< c c c\! -d4-.\downbow a4^"r'venu..." c \tempo "T1" e +@noindent +@q{measure position}; + +@lilypond[verbatim,fragment,quote,relative=2] +\time 3/4 +\repeat volta 2 { c2 e4 | } +\alternative { + { \time 4/4 + \set Timing.measurePosition = #(ly:make-moment -1/2) + f2 | } + { f2 d4 | } +} +g2. | @end lilypond -Affected objects include @code{Accidentals}, @code{Beams}, @code{Clefs}, -@code{Dynamics}, @code{FiguredBass}, @code{Flags}, @code{Glissandos}, -@code{Lyrics}, @code{MetronomeMarks}, @code{OttavaBrackets}, -@code{Pedals}, @code{RehearsalMarks}, @code{Rests}, @code{Scripts}, -@code{TextScripts}, @code{Ties}, @code{Tuplets} and @code{VoltaBrackets}. - -@item -Tuplets are now created with the @code{\tuplet} command, which -takes a fraction @code{@var{t}/@var{n}} to specify that @var{t} -notes are played in the time usually allowed for @var{n}. One -@code{\tuplet} command can create several tuplet groups if their -duration is typed after the fraction. -@lilypond[quote,verbatim,relative=2] -\tuplet 3/2 { c8 d e } \tuplet 3/2 { f e d } c2 -\tuplet 3/2 4 { c8 d e f e d } c2 +@noindent +and @q{chord changes}; + +@lilypond[verbatim,fragment,quote] +<< + \new ChordNames { + \set chordChanges = ##t + \chordmode { c1:m d:m c:m d:m } + } + \new Staff { + \repeat volta 2 { \chordmode { c1:m } } + \alternative { + { \chordmode { d:m } } + { \chordmode { c:m } } + } + \chordmode { d:m } +} +>> @end lilypond -The @code{\times} command with its inverted fraction order -@code{@var{n}/@var{t}} is still available. @item -Introducing two new markup-commands; @code{\draw-dashed-line} and -@code{\draw-dotted-line}. +Improved MIDI output for breathe marks. After tied notes, breaths take +time @emph{only} from the last note of the tie; e.g. +@code{@{ c4~ c8 \breathe @}} performs as @code{@{ c4~ c16 r @}} instead +of @code{@{ c4 r8 @}}. This is more consistent with articulations and +how humans interpret breaths after ties. It now also makes it easier to +align simultaneous breathe marks over multiple parts, all with different +note lengths. -@noindent -The dashed-line extends to the whole length given by @var{dest}, if -@code{full-length} is set to @code{#t} (this is the default) without any -space at the beginning or end. @code{off} will then be altered to fit. -To insist on the given (or default) values of @code{on}, @code{off} use -@code{\override #'(full-length . #f)}. Manual settings for @code{on}, -@code{off} and @code{phase} are possible. +@item +A new note head style for Tabulature has been added; +@code{TabNoteHead.style = #'slash}. -@noindent -The dotted-line always extends to the whole length given by @var{dest}, -without any space at the beginning or end. Manual settings for -@code{off} are possible to get larger or smaller space between the dots. -The given (or default) value of @code{off} will be altered to fit the -line-length. +@item +Four new Clef glyphs have been added @emph{Double G}, @emph{Tenor G}, +@emph{Varpercussion} and @emph{varC} and their related tessitura. +@lilypond[verbatim,quote,fragment] + \override Staff.Clef.full-size-change = ##t + + \clef "GG" c c c c + \clef "tenorG" c c c c + \clef "varC" c c c c + \clef "altovarC" c c c c + \clef "tenorvarC" c c c c + \clef "baritonevarC" c c c c + \clef "varpercussion" c c c c + + \break + \override Staff.Clef.full-size-change = ##f + + \clef "GG" c c c c + \clef "tenorG" c c c c + \clef "varC" c c c c + \clef "altovarC" c c c c + \clef "tenorvarC" c c c c + \clef "baritonevarC" c c c c + \clef "varpercussion" c c c c +@end lilypond + +@item +Isolated durations in music sequences now stand for unpitched +notes. This may be useful for specifying rhythms to music or +scheme functions. When encountered in the final score, the +pitches are provided by the preceding note or chord. Here are two +examples where this makes for readable input: @lilypond[verbatim,quote] -\markup { - \draw-dashed-line #'(5.1 . 2.3) - \override #'(on . 0.3) - \override #'(off . 0.5) - \draw-dashed-line #'(5.1 . 2.3) - \draw-dotted-line #'(5.1 . 2.3) - \override #'(thickness . 2) - \override #'(off . 0.2) - \draw-dotted-line #'(5.1 . 2.3) +\new DrumStaff \with { \override StaffSymbol.line-count = 1 } +\drummode { + \time 3/4 + tambourine 8 \tuplet 3/2 { 16 16 16 } + 8 \tuplet 3/2 { 16 16 16 } 8 8 | } @end lilypond +@lilypond[verbatim,quote] +\new Staff { r16 c'16 ~ 8 ~ 4 ~ 2 | } +@end lilypond + @item -Starting with version@tie{}2.17.10, error messages or the -@code{textedit} @acronym{URI} used for point-and-click -functionality specify column numbers starting with@tie{}1 rather -than@tie{}0. The byte offset (also part of @code{textedit} -@acronym{URI}s) still starts at@tie{}0. +@code{\displayLilyMusic} and its underlying Scheme functions no +longer omit redundant note durations. This makes it easier to +reliably recognize and format standalone durations in expressions +like +@example +@{ c4 d4 8 @} +@end example @item -The @code{\clef} command supports optional transposition: +Beaming exceptions can now be constructed using the +@code{\beamExceptions} scheme function. One can now write + @lilypond[verbatim,quote,relative=1] -\clef "treble_(8)" -c2 c -\clef "bass^[15]" -c2 c +\time #'(2 1) 3/16 +\set Timing.beamExceptions = + \beamExceptions { 32[ 32] 32[ 32] 32[ 32] } +c16 c c | +\repeat unfold 6 { c32 } | @end lilypond -@item -The LilyPond syntax of dot-separated words @code{Voice.Accidental} -has been made interchangeable with @code{#'(Voice Accidental)}, a -Scheme list of symbols. As one result, code like -@example -\override Voice.TextSpanner #'(bound-details left text) = "rit." -@end example -is now equivalent to -@example -\override Voice.TextSpanner bound-details.left.text = "rit." -@end example -or even +@noindent +with multiple exceptions separated with @code{|} bar checks +(writing the exception pattern without pitches is convenient but +not mandatory). Previously, setting the beam exceptions would +have required writing + @example -\override #'(Voice TextSpanner) bound-details.left.text = "rit." +\set Timing.beamExceptions = +#'( ;start of alist + (end . ;entry for end of beams + ( ;start of alist of end points + ((1 . 32) . (2 2 2)) ;rule for 1/32 beams -- end each 1/16 + ))) @end example @item -Grob and grob property path no longer need to be specified as two -separate arguments to commands like @samp{\override} and -@code{\revert}, allowing for the syntax -@example -\override Voice.TextSpanner.bound-details.left.text = "rit." -@end example -Since complementary music functions like @samp{\overrideProperty} -cannot support forms with and without separating space at the same -time, using a single dotted path is now the preferred form. -Specifying grob path and grob property path separately, currently -still supported with @samp{\override} and @samp{\revert} for -compatibility reasons, is deprecated. - -@item -Due to words now being accepted as symbol function arguments, the -interfaces of @samp{\accidentalStyle}, @samp{\alterBroken}, -@samp{\footnote} and @samp{\tweak} had to be redesigned where -optional symbol arguments were involved. Please check the -respective music function documentation for details. - -@item -Several commands now accept symbol lists (conveniently entered as -dot-separated words) for various kinds of arguments. These -include @samp{\accidentalStyle}, @samp{\alterBroken}, -@samp{\footnote}, @samp{\hide}, @samp{\omit}, -@samp{\overrideProperty}, @samp{\shape}, and @samp{\tweak}. - -@item -The bar line user interface has changed. Bar glyphs now resemble the -appearance of the bar line, so a left repeat sign has to be coded -as @code{.|:}. The command @code{\defineBarLine} provides an easy way -to define additional bar line styles. - -@item -Accidentals in the key signature may be printed in octaves other -than their traditional positions, or in multiple octaves. -@lilypond[quote,relative=0] -\override Staff.KeySignature #'flat-positions = #'((-5 . 5)) -\override Staff.KeyCancellation #'flat-positions = #'((-5 . 5)) -\clef bass \key es \major es g bes d -\clef treble \bar "||" \key es \major es g bes d -\override Staff.KeySignature #'sharp-positions = #'(2) -\bar "||" \key d \major b fis b2 -@end lilypond +The most common articulations are now reflected in MIDI output. +Accent and marcato make notes louder; staccato, staccatissimo and +portato make them shorter. Breath marks shorten the previous +note. + +This behavior is customizable through the @code{midiLength} and +@code{midiExtraVelocity} properties on @code{ArticulationEvent}. +See @file{script-init.ly} for examples. + +@item +The PostScript functionality of stroke adjustment is no longer +applied automatically but left to the discretion of the PostScript +device (by default, Ghostscript uses it for resolutions up to +150dpi when generating raster images). When it is enabled, a more +complex drawing algorithm designed to benefit from stroke +adjustment is employed mostly for stems and bar lines. + +Stroke adjustment can be forced by specifying the command line +option @samp{-dstrokeadjust} to LilyPond. When generating +@code{PDF} files, this will usually result in markedly better +looking @code{PDF} previews but significantly larger file size. +Print quality at high resolutions will be unaffected. @end itemize @ifhtml For older news, go to +@uref{http://lilypond.org/doc/v2.18/Documentation/changes/}, @uref{http://lilypond.org/doc/v2.16/Documentation/changes/}, -@uref{http://lilypond.org/doc/v2.14/Documentation/changes/}, or @uref{../,go back} to the Documentation index. diff --git a/Documentation/common-macros.itexi b/Documentation/common-macros.itexi index f3dac48c91..7ee978a076 100644 --- a/Documentation/common-macros.itexi +++ b/Documentation/common-macros.itexi @@ -9,14 +9,7 @@ @set txicodequoteundirected @set txicodequotebacktick - -@c Trick to use with proper font mappings the same NCSB fonts as -@c LilyPond instead of those provided by TeX distribution -@tex -\ifpdf - \pdfmapfile{=lilypond.map} -\fi -@end tex +@set txiindexbackslashignore @include cyrillic.itexi diff --git a/Documentation/contributor.texi b/Documentation/contributor.texi index 9541883b74..ed1a1df7f1 100644 --- a/Documentation/contributor.texi +++ b/Documentation/contributor.texi @@ -20,12 +20,17 @@ contributors should follow. This manual is not intended to be read sequentially; new contributors should only read the sections which are relevant to them. For more -information about different jobs, see @rweb{Help us}. +information about different jobs, see @rcontrib{Help us}. @end macro -@c `Contributor's Guide' was born 2007-09-15 with git commit 48f3356... +@c `Contributor’s Guide' was born 2007-09-15 with this commit: +@c Add developers resources page +@c author: John Mandereau +@c commit: 135a5beef5c4cf893d02947cdfcb5bb90c854486 +@c file: Documentation/devel.html.in + @macro copyrightDeclare -Copyright @copyright{} 2007--2012 by the authors. +Copyright @copyright{} 2007--2015 by the authors. @end macro @set FDL diff --git a/Documentation/contributor/administration.itexi b/Documentation/contributor/administration.itexi index 90fe795a0c..9af951ee8e 100644 --- a/Documentation/contributor/administration.itexi +++ b/Documentation/contributor/administration.itexi @@ -1,4 +1,3 @@ -@c -*- coding: utf-8; mode: texinfo; -*- @node Administrative policies @chapter Administrative policies @@ -9,7 +8,7 @@ don't fit anywhere else. * Meta-policy for this document:: * Environment variables:: * Meisters:: -* Patchy:: +* Managing Staging and Master branches with Patchy:: * Administrative mailing list:: * Grand Organization Project (GOP):: * Grand LilyPond Input Syntax Standardization (GLISS):: @@ -109,181 +108,428 @@ should be set to the repository lilypond-extra, see @node Meisters @section Meisters -We have four jobs for organizing a team of contributors: +We have four primary jobs to help organize all our contributors: + +@unnumberedsubsec The Bug Meister + +The Bug Meister's responsibilities are: @itemize @item -Bug Meister: trains new Bug Squad volunteers, organizes who works -on which part of their job, checks to make sure that everything is -running smoothly, and has final say on our policy for Issues. +To organize the individual Bug Squad volunteers, making sure that +each member is aware of their responsibilities. See +@ref{The Bug Squad}. -Currently: Colin H +@item +To train new Bug Squad volunteers in the Issue Tracker process. See +@ref{Issues}. @item -Doc Meister: trains new doc editors/writers, organizes who works -on which part of the job, checks to make sure that everything is -running smoothly, and has final say on our policy for -Documentation. Also includes LSR work. +To have the final say on our policies for Issues and their +classification. See @ref{Issue classification}. + +@end itemize -Currently: None +Current Bug Meister: Colin Hall @email{bug-lilypond@@gnu.org} + + +@unnumberedsubsec The Doc Meister + +The Doc Meister's responsibilities are: + +@itemize @item -Translation Meister: trains new translators, updates the -translation priority list, and handles merging branches (in both -directions). +To train new volunteers in our Documentation style and policy, +including organizing LilyPond Snippet Repository (LSR) work. -Currently: Francisco +@item +To organize the individual volunteers -- who does what on which job -- +and to check that everything is running smoothly. + +@item +To have final say on any Documentation policy. See +@ref{Documentation policy}. @end itemize -@node Patchy -@section Patchy +Current Doc Meister: None -@subheading Introduction -Patchy is a set of Python scripts to automate two administrative -tasks: +@unnumberedsubsec The Patch Meister + +The Patch Meister's responsibilities are: @itemize + @item -@code{lilypond-patchy-staging.py}: checks that new commits in -@code{staging} can compile the regtests and documentation before -merging @code{staging} into @code{master}. +To keep track of all patches submitted for testing and review. This +includes scanning the bug and dev email lists looking for any patches +submitted by @q{random} contributors and advising them on how to submit +a patch for testing and review. See @ref{Uploading a patch for review} +and @ref{The patch review cycle}. -(completely automatic) +@item +To makes sure that any patch submitted has a corresponding Issue Tracker +and Rietveld Issue created for it before it enters the testing and +review process. See @ref{Issues}. @item -@code{test-patches.py}: checks that patches apply to Git @code{master}, -compile, and lets a human check that there are no big unintended -changes to the regtests. +Updates all Issue statuses for all patches that are currently in the +testing and review process periodically -- currently every 3 - 4 days. +See @ref{Patch handling}. + +@end itemize + +@warning{The Patch Meister's role is a purely administrative one and no +programming skill or judgement is assumed or required.} -(requires some human input) +Currently: James Lowe @email{pkx@@gnu.org} + + +@unnumberedsubsec The Translation Meister + +The Translation Meister's responsibilities are: + +@itemize + +@item +To train new documentation translators in the translation process. See +@ref{Translating the documentation}. + +@item +To update the translation priority list and handle the merging of the +translation branches (in both directions). + +@item +To have final say on any Translation management policies. See +@ref{Translating the documentation}. @end itemize -@subheading Installing Patchy +Currently: Francisco Vila @email{translations@@lilynet.net} -To install Patchy, you should do the following: -@enumerate + +@node Managing Staging and Master branches with Patchy +@section Managing Staging and Master branches with Patchy + +@ignore +The script 'test-patches.py' does not currently work with Allura. +@end ignore + +@menu +* Overview of Patchy:: +* Patchy requirements:: +* Installing Patchy:: +* Configuring Patchy:: +* Running the script:: +* Automating Patchy:: +* Troubleshooting Patchy:: +@end menu + +@node Overview of Patchy +@subsection Overview of Patchy + +No programmatic skill is required to run Patchy; although knowledge of +compiling LilyPond and its documentation along with understanding how to +configure the @var{PATH} environment of your computer is required. See +@ref{Working with source code}. + +The script @code{lilypond-patchy-staging.py} checks for any new commits +in @code{remote/origin/staging}, makes sure that the new HEAD compiles +along with all the LilyPond documentation. Then finally pushing to +@code{remote/origin/master}. This script can be run and left +unattended, requiring no human intervention. + +Patchy can also be configured to send emails after each successful (or +unsuccessful) operation. This is not a requirement and is turned off +by default. + +@c Need to explain in more detail how to set up Patchy for email but +@c as I don't use myself it I have no experience - JL + + +@node Patchy requirements +@subsection Patchy requirements + +@itemize + +@item +A full local copy of the source code. See +@ref{Working with source code}. + @item -Create a new user on your box to run Patchy; this is a security -step for your own protection. It is recommended that this should -not be an administrator. New users are created from System; -Administration; Users and Groups. +All the software needed for compiling LilyPond @emph{and} the +documentation. Unlike testing patches, being able to build the full set +of LilyPond's documentation is required to be able to test & push new +commits. See @ref{Compiling}. @item -Get the Patchy scripts from +Commit access @emph{is} required to test and push new commits, but a +valid login to @uref{https://sourceforge.net} is @emph{not}. See +@ref{Commit access}. + +@end itemize + + +@node Installing Patchy +@subsection Installing Patchy + +The Patchy scripts are not part of the LilyPond code base, but can be +downloaded from @uref{https://github.com/gperciva/lilypond-extra/}. The +scripts and related Python libraries are all located in the +@file{patches/} directory. + +Alternatively, use @code{git clone}; + @example -@uref{https://github.com/gperciva/lilypond-extra/} +git clone https://github.com/gperciva/lilypond-extra/ @end example -Patchy is in the @file{patches/} directory. + +This makes it simpler to update the scripts if any changes are ever made +to them. Finally, add the location of the @file{patches/} directory to +your @var{PATH}. + + +@node Configuring Patchy +@subsection Configuring Patchy + +@warning{It is recommended to create a new user on your computer +specifically to run the Patchy scripts as a security precaution and that +this user should not have any administrative privileges. Also do not +set password protection for your ssh key else you will not be able to +run the scripts unattended.} + +@enumerate + +@item +Make sure the environment variables @var{LILYPOND_GIT} and +@var{LILYPOND_BUILD_DIR} are configured appropriately. See +@ref{Environment variables}. @item -Put the scripts and Python libraries contained in @file{patches} in a -sensible place on your system; this can be done by appending -@file{patches/} full path to the @var{PATH} of the user that runs -Patchy. +Manually run either the @code{lilypond-patchy-staging.py} script and +when prompted: + +@smallexample +Warning: using default config; please edit /home/joe/.lilypond-patchy-config +Are you sure that you want to continue with the default config? (y/[n]) +@end smallexample + +Answer @qq{@code{n}} and press enter. + +The next time either of the scripts are run they will use the +@code{.lilypond-patchy-config} settings copied to your @code{$HOME} +directory. @item -Create a new git repository with +Manually edit the @file{.lilypond-patchy-config} file, located in your +@code{$HOME} directory to change any of the default settings. + +@end enumerate + +These include: + +@itemize + +@item +All @code{make} operations are run with; @example -git clone git://git.sv.gnu.org/lilypond.git +extra_make_options = -j3 CPU_COUNT=3 @end example -This will create a directory called lilypond with the repo in it. -Make sure it's where you want it and name it lilypond-git -(assuming you want to follow the standard naming conventions). + +See @ref{Saving time with the -j option} @item -Create environment variables @var{LILYPOND_GIT} and -@var{LILYPOND_BUILD_DIR}, see @ref{Environment variables}. +A complete build of all the LilyPond documentation is @emph{not} +performed; +@example +patch_test_build_docs = no +@end example @item -Run Patchy once to set up config files, answer @q{@code{n}} when it -asks for going on, unless the default config file happens to suit your -setup: +Each instance of either a patch test or commit test & push is logged in; @example -lilypond-patchy-staging.py +auto_compile_results_dir = ~/lilypond-auto-compile-results/ @end example @item -Edit @file{$HOME/.lilypond-patchy-config} to provide the location of -your local lilypond Git repository, working directories for your build -directory, your results directory, compiler options and notification -method. If you don't want to use email notification, then delete -everything after @code{smtp_command:}. +Both scripts will perform their build operations in; +@example +build_dir = /tmp/lilypond-autobuild/ +@end example + +@end itemize + +The script creates a clones of @code{staging} and @code{master} +branches (prefixed with @code{test-}) with a third branch, called +@code{test-master-lock} used as a check to protect against two or more +instances of Patchy being run locally at the same time. + + +@node Running the script +@subsection Running the script + +@code{lilypond-patchy-staging.py} is run @emph{without} any arguments. +It then checks to see if @code{remote/origin/staging} is +@qq{further ahead} than @code{remote/origin/master}. + +@noindent +If there are no new differences between the two branches since the last +run check, the script will report something like this: + +@smallexample +(UTC) Begin LilyPond compile, previous commit at 4726764cb591f622e7893407db0e7d42bcde90d9 +Success: No new commits in staging +@end smallexample + +@noindent +If there are any differences between the two branches since the last +run check, (or if the script cannot for any reason, locate the last +instance of a commit that it checked) it will report something like +this: + +@smallexample +(UTC) Begin LilyPond compile, previous commit at 4726764cb591f622e7893407db0e7d42bcde90d9 +Merged staging, now at: 79e98a773b6570cfa28a15775a9dea3d3e54d6b5 + Success: ./autogen.sh --noconfigure + Success: /tmp/lilypond-autobuild/configure --disable-optimising +... +@end smallexample + +and proceed with running @code{make}, @code{make test} and a +@code{make doc}. Unlike @code{test-patches.py} if all the tests pass, +the script then pushes the changes to @code{remote/origin/master}. + +@smallexample +... +Success: nice make clean +Success: nice make -j7 CPU_COUNT=7 +Success: nice make test -j7 CPU_COUNT=7 +Success: nice make doc -j7 CPU_COUNT=7 +To ssh://joe@@git.sv.gnu.org/srv/git/lilypond.git + 79e98a7..4726764 test-staging -> master + Success: pushed to master +@end smallexample + +@warning{In the case where any of the @code{lilypond-patchy-staging.py} +tests fail, do not try to push your own fixes but report the failures to +the Developers List for advice.} + + +@node Automating Patchy +@subsection Automating Patchy + +To run as a cron job make sure you have; + +@example +[notification] +notify_non_action = no +@end example + +in @file{$HOME/.lilypond-patchy-config} to avoid any unintentional email +flooding: + +Assuming that Patchy run a user @qq{patchy}, create a file called +@file{$HOME/lilypond-patchy.cron}, adapting it as necessary (the +@code{/2} means @qq{run this every 2 hours}): + +@smallexample +02 0-23/2 * * * /home/patchy/lilypond-extra/patches/lilypond-patchy-staging.py +@end smallexample + +@warning{@code{cron} will not inherit environment variables so you must +re-define any variables inside @file{$HOME/lilypond-patchy.cron}. For +instance, @var{LILYPOND_GIT} may need to be defined if +@var{git_repository_dir} is not correctly set in +@file{$HOME/.lilypond-patchy-config}.} + +Finally, apply the cron job (you may need superuser privileges for +this): + +@example +crontab -u patchy /home/patchy/lilypond-patchy.cron +@end example + + +@node Troubleshooting Patchy +@subsection Troubleshooting Patchy + +The following is a list of the most common messages that the scripts +may report with explanations. + +@smallexample +this Git revision has already been pushed by an operator other than this Patchy. +@end smallexample + +@itemize @item -Ensure that your new user has git push access. Follow the -instructions in the CG at @ref{Commit access}. Do not set -password protection for the key --- if you do you will not be able -to run patchy unattended. +Another, remote, machine has already tested and pushed the new commits +in staging. -@end enumerate +@item +You may also see this if the auto-build files have been deleted and this +computer has previously already pushed the listed commit ID to +@code{master}. -@subheading lilypond-patchy-staging.py +@end itemize -@code{lilypond-patchy-staging.py} is run with @example -python lilypond-patchy-staging.py +test-master-lock and PID entry exist but previous Patchy +run (PID xxxxx) died, resetting test-master-lock anyway. @end example -Not much appears to happen except you can see a lot of CPU gets used -if you open System Monitor. There's not much point running -@code{lilypond-patchy-staging.py} unless there is something in -@code{staging} to be merged to @code{master}, however, if there's -nothing new in @code{staging} then the script won't waste resources by -compiling anything. - -The script fetches the current patches in staging and runs -@code{make}, @code{make test} and @code{make doc} to ensure that all of -these complete error-free. If you have set Patchy up to use email, -it emails its results to you. If you haven't, then you can view -them in a logfile. It also merges @code{staging} into @code{master}. - -@warning{in case the build fails, do not try to push fixes on top of -staging branch, for details see @ref{Pushing to staging}.} - -When you have run Patchy a few successful times with email sending, -you are ready for running it as a cron job. First, make sure you have -the following in @file{$HOME/.lilypond-patchy-config} to avoid -email flood: + +@noindent +A previous attempt was unsuccessful for some reason and the scripts were +not able to tidy up after themselves (for example if you manually halt +the process by killing it or closing the terminal you may have been +running the script in). The @code{test-master-lock} branch was +therefore not able to be deleted cleanly however, nothing needs to be +done the scripts will rebuild any tests it needs to. @example -[notification] -notify_non_action = no +fatal: A branch named 'test-master-lock' already exists. @end example -Then, assuming Patchy run with user account @code{patchy}, write the -following to @file{$HOME/lilypond-patchy.cron}, adapting it as -necessary (the @code{/2} means @qq{run this every 2 hours}): +@itemize + +@item +There is another instance of Patchy running on your computer that is +testing the same tracker issue. + +@item +A previous test attempt was unsuccessful for some reason and the scripts +were not able to tidy up after themselves (for example if you manually +halt the testing process by killing it or closing the terminal you may +have been running the script in). The @code{test-master-lock} branch +was therefore not able to be deleted cleanly, in this case you must +manually delete the @code{test-master-lock} branch in your +@code{$LILYPOND_GIT} directory. + @example -02 0-23/2 * * * /home/patchy/git/lilypond-extra/patches/lilypond-patchy-staging.py +git branch -d test-master-lock @end example -@warning{@code{cron} will not inherit environment variables from -your main setup, so you must re-define any variables inside -@file{$HOME/lilypond-patchy.cron}. For instance, @var{LILYPOND_GIT} -may need to be defined if @var{git_repository_dir} is not correctly -set in @file{$HOME/.lilypond-patchy-config}.} +@noindent +It may be wise to also manually delete @code{test-master} and +@code{test-staging} too, just to be safe. + +@end itemize -Finally, install the cron job (you may need superuser privileges for -this): @example -crontab -u patchy /home/patchy/lilypond-patchy.cron +*** FAILED STEP *** + merge from staging + Another instance (PID xxxxx) is already running. @end example -@subheading test-patches.py -@code{test-patches.py} prepares a regtest comparison for a human to -quickly glance at, to determine if the patch is ready for a review. -After looking at the comparison (or the lack of a comparison in the -case of problems), run @code{accept-patch.py} or -@code{reject-patch.py}. +@noindent +This occurs when trying to run @code{lilypond-patchy-staging.py} when +another instance of either script is already running locally. + -Once a patch has gotten a "LGTM" from Patchy, it should be -reviewed by relevant developers, and if it passes this, it can be -considered for countdown (see @ref{Commits and patches}) and -pushing to staging (see @ref{Pushing to staging}). @node Administrative mailing list @@ -545,7 +791,7 @@ savannah bug tracker? Reitveld is inconvenient in some respects: it requires a google account, and there's no way to see all patches relating to lilypond. Should we switch to something like gerritt? -@uref{http://code.google.com/p/lilypond/issues/detail?id=1184} +@uref{https://sourceforge.net/p/testlilyissues/issues/1184/} (prep: 5 hours. discuss: 15 hours) @@ -557,7 +803,7 @@ Should we change the "structure" / "framework" for bounties? (prep: 2 hours. discuss: 10 hours) @item @strong{code readability}: -"Our aim when producing source code for Lilypond in whatever +"Our aim when producing source code for LilyPond in whatever language is that it should be totally comprehensible to a relatively inexperienced developer at the second reading." @@ -906,7 +1152,7 @@ community: @example @uref{http://lists.gnu.org/archive/html/lilypond-devel/2010-09/msg00178.html} -@uref{http://news.lilynet.net/spip.php?article121} +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/spip.php?article121} @uref{http://lists.gnu.org/archive/html/lilypond-devel/2010-11/msg00076.html} @end example @@ -1502,13 +1748,13 @@ sequential-statement to the score." @item Discussion on -@uref{http://code.google.com/p/lilypond/issues/detail?id=1322} +@uref{https://sourceforge.net/p/testlilyissues/issues/1322/} about \new vs. \context. @item Let users add their own items to the parser? comment 11 on: -@uref{http://code.google.com/p/lilypond/issues/detail?id=1322} +@uref{https://sourceforge.net/p/testlilyissues/issues/1322/} @item should engravers be pluralized (note_heads_engraver) or not @@ -1516,7 +1762,7 @@ should engravers be pluralized (note_heads_engraver) or not @item should we allow numbers in identifier names? Issue: -@uref{http://code.google.com/p/lilypond/issues/detail?id=1670} +@uref{https://sourceforge.net/p/testlilyissues/issues/1670/} @item should we officially allow accented characters? in general, how diff --git a/Documentation/contributor/build-notes.itexi b/Documentation/contributor/build-notes.itexi index b8dff79c1f..a5f8c2ccc0 100644 --- a/Documentation/contributor/build-notes.itexi +++ b/Documentation/contributor/build-notes.itexi @@ -14,7 +14,6 @@ chapter.} * General build system notes:: * Doc build:: * Website build:: -* Building an Ubuntu distro:: @end menu @@ -1447,66 +1446,3 @@ website: runs website_post.py Then some file copying @end example - -@node Building an Ubuntu distro -@section Building an Ubuntu distro - - -Here's the short instruction on how to create lilybuntu iso image -(Jonathan Kulp did this on a spare drive, -but he supposes it can be done in a VM too): - -@enumerate - -@item -Install ubuntu, reboot. -@item -Run all updates, reboot if asked. -@item -Enable src repos, refresh package lists. -@item -Install LilyPond build deps: -@example -sudo apt-get build-dep lilypond -@end example -@item -Install git and autoconf: -@example -sudo apt-get install git-core gitk autoconf -@end example - -@item -Test to see whether everything works fine now: -@enumerate -@item -use @command{lily-git.tcl} to grab source files -@item -go to source dir and do -@example -"./autogen.sh" ; make ; make doc -@end example -@item -if all compiles, move on to iso creation... -@end enumerate - -@item -Download & install "remastersys": -@uref{http://sourceforge.net/projects/remastersys/, http://sourceforge.net/projects/remastersys/} -@item -Copy @command{lily-git.tcl} script file into @file{/etc/skel/}. -@item -Modify @file{/etc/remastersys.conf} as desired (change @code{.iso} name, -default live session username, etc). -@item -Remove non-essential desktop software as desired. -@item -Create iso: -@example -sudo remastersys dist -@end example -New iso is in @file{/home/remastersys/remastersys/}. -@item -Test iso by installing in VM and repeating steps above for -getting source files and building lp and docs. - -@end enumerate diff --git a/Documentation/contributor/doc-translation-list.itexi b/Documentation/contributor/doc-translation-list.itexi index 5f9a4c7f08..ff5ba338c4 100644 --- a/Documentation/contributor/doc-translation-list.itexi +++ b/Documentation/contributor/doc-translation-list.itexi @@ -25,72 +25,72 @@ procedures}. @example -1- Web site -616 web.texi -4937 web/introduction.itexi -1201 web/download.itexi +629 web.texi +5815 web/introduction.itexi +1158 web/download.itexi 1139 macros.itexi -7977 po/lilypond-doc.pot (translate to po/@var{MY_LANGUAGE}.po) +9 po/lilypond-doc.pot (translate to po/@var{MY_LANGUAGE}.po) 0 search-box.ihtml --- lilypond-texi2html.init (section TRANSLATIONS) -15870 total +8750 total -2- Tutorial -1284 web/manuals.itexi +1314 web/manuals.itexi 124 learning.tely -2578 learning/tutorial.itely -4396 learning/common-notation.itely -8382 total +2499 learning/tutorial.itely +4402 learning/common-notation.itely +8339 total -3- Fundamental Concepts, starting of Usage and Community -11144 learning/fundamental.itely -- Fundamental concepts +11119 learning/fundamental.itely -- Fundamental concepts 135 usage.tely -4537 usage/running.itely -1484 usage/updating.itely -3073 web/community.itexi -20373 total +5440 usage/running.itely +1866 usage/updating.itely +3524 web/community.itexi +22084 total -4- Rest of Learning manual and Suggestions on writing LilyPond files -16191 learning/tweaks.itely -- Tweaking output -372 learning/templates.itely -- Templates -2692 usage/suggestions.itely -- Suggestions on writing LilyPond files -19255 total +16592 learning/tweaks.itely -- Tweaking output +1236 learning/templates.itely -- Templates +2793 usage/suggestions.itely -- Suggestions on writing LilyPond files +20621 total -5- Notation reference 326 notation.tely 91 notation/notation.itely -- Musical notation -4990 notation/pitches.itely -6890 notation/rhythms.itely -1793 notation/expressive.itely -1050 notation/repeats.itely -2821 notation/simultaneous.itely -2476 notation/staff.itely -954 notation/editorial.itely -2816 notation/text.itely +5169 notation/pitches.itely +6795 notation/rhythms.itely +1798 notation/expressive.itely +1288 notation/repeats.itely +2919 notation/simultaneous.itely +2554 notation/staff.itely +1477 notation/editorial.itely +2754 notation/text.itely 81 notation/specialist.itely -- Specialist notation -5190 notation/vocal.itely -1972 notation/chords.itely +4975 notation/vocal.itely +1931 notation/chords.itely 702 notation/piano.itely -811 notation/percussion.itely +799 notation/percussion.itely 826 notation/guitar.itely 66 notation/strings.itely 242 notation/bagpipes.itely -5375 notation/ancient.itely -10392 notation/input.itely -- Input syntax +5516 notation/ancient.itely +12704 notation/input.itely -- Input syntax 2164 notation/non-music.itely -- Non-musical notation -12256 notation/spacing.itely -- Spacing issues -15289 notation/changing-defaults.itely -- Changing defaults +10911 notation/spacing.itely -- Spacing issues +15598 notation/changing-defaults.itely -- Changing defaults 5187 notation/programming-interface.itely -- Interfaces for programmers -2176 notation/notation-appendices.itely -- Notation manual tables +3077 notation/notation-appendices.itely -- Notation manual tables 252 notation/cheatsheet.itely -- Cheat sheet -87188 total +90202 total -6- Rest of Application Usage -4137 usage/lilypond-book.itely -- LilyPond-book +4211 usage/lilypond-book.itely -- LilyPond-book 1122 usage/converters.itely -- Converting from other formats -5259 total +5333 total -7- Appendices whose translation is optional -326 essay/literature.itely +382 essay/literature.itely 1222 learning/scheme-tutorial.itely (should be revised first) -1548 total +1604 total @end example diff --git a/Documentation/contributor/doc-work.itexi b/Documentation/contributor/doc-work.itexi index 680522cbc9..b9f1c7a77e 100644 --- a/Documentation/contributor/doc-work.itexi +++ b/Documentation/contributor/doc-work.itexi @@ -9,11 +9,12 @@ this allows us to generate different output formats from a single set of source files. To organize multiple authors working on the documentation, we use a -Version Control System (VCS) called git, previously discussed in +Version Control System (VCS) called Git, previously discussed in @ref{Starting with Git}. @menu * Introduction to documentation work:: +* version in documentation files:: * Documentation suggestions:: * Texinfo introduction and usage policy:: * Documentation policy:: @@ -66,6 +67,41 @@ Before undertaking any large documentation work, contributors are encouraged to contact the @ref{Meisters, Documentation Meister}. +@node version in documentation files +@section @code{\version} in documentation files + +Every documentation file which includes LilyPond code must begin +with a @code{\version} statement, since the build procedure +explicitly tests for its presence and will not continue otherwise. +The @code{\version} statement should reference a version of LilyPond +consistent with the syntax of the contained code. + +Since the @code{\version} statement is not valid Texinfo input it +must be commented out like this: + +@example +@@c \version "2.19.1" +@end example + +So, if you are adding LilyPond code which is not consistent with the +current version header, you should + +@enumerate + +@item +run convert-ly on the file using the latest version of LilyPond +(which should, if everybody has done proper maintenance, not change +anything); + +@item +add the new code; + +@item +modify the version number to match the new code. + +@end enumerate + + @node Documentation suggestions @section Documentation suggestions @@ -158,7 +194,7 @@ have the @qq{docs} tag can then be easily added as a @emph{selected snippet} in the documentation. It will also appear automatically in the Snippets lists. See @ref{Introduction to LSR}. -Snippets that @emph{don't} have the @qq{docs} tage will still be +Snippets that @emph{don't} have the @qq{docs} tag will still be searchable and viewable within the LSR, but will be not be included in the Snippets list or be able to be included as part of the main documentation. @@ -255,12 +291,12 @@ five, levels. @item Level 5: @@subsubsubheading @end itemize -The first three levels are numbered in html, the last two are not. -Numbered sections correspond to a single html page in the split html +The first three levels are numbered in HTML, the last two are not. +Numbered sections correspond to a single HTML page in the split HTML documents. The first four levels always have accompanying nodes so they can be -referenced and are also included in the ToC in html. +referenced and are also included in the ToC in HTML. Most of the manual is written at level 4 under headings created with @@ -365,23 +401,10 @@ Most LilyPond examples throughout the documentation can be produced with: @example -@@lilypond[verbatim,quote,relative=1] -@end example - -or - -@example -@@lilypond[verbatim,quote,relative=2] +@@lilypond[verbatim,quote] @end example -If using any combination of @code{\header@{@}}, @code{\score@{@}} or -@code{\layout@{@}} in your example, then you must omit the -@code{relative} variable and either use absolute entry mode or an -explicit @code{\relative@{@}} construction. - -If using @code{\book@{@}} in your example then you must also omit the -@code{relative} variable and either use absolute entry mode or an -explicit @code{\relative@{@}} construction. However, you must also +If using @code{\book@{@}} in your example then you must also include the @code{papersize=X} variable, where @code{X} is a defined paper size from within @file{scm/paper.scm}. This is to avoid the default @code{a4} paper size being used and leaving too much unnecessary @@ -424,8 +447,8 @@ Please avoid using extra spacing either after or within the @code{@@lilypond} parameters. @example -not: @@lilypond [verbatim, quote, relative=1] -but instead: @@lilypond[verbatim,quote,relative=1] +not: @@lilypond [verbatim, quote, fragment] +but instead: @@lilypond[verbatim,quote,fragment] @end example @item @@ -464,7 +487,7 @@ to get users accustomed to this scheme construct, i.e. @code{\set Staff.instrumentName = #"cello"} @item -Try to avoid using @code{#'} or @code{#`} within when describing +Try to avoid using @code{#'} or @code{#`} when describing context or layout properties outside of an @code{@@example} or @code{@@lilypond}, unless the description explicitly requires it. @@ -482,8 +505,8 @@ checks. @item Tweaks should, if possible, also occur on their own line. @example -not: \override TextScript #'padding = #3 c1^"hi" -but instead: \override TextScript #'padding = #3 +not: \override TextScript.padding = #3 c1^"hi" +but instead: \override TextScript.padding = #3 c1^"hi" @end example @@ -658,7 +681,7 @@ command ;) Enter the exact @code{@@node} name of the target reference between the brackets (eg.@tie{}@w{@samp{@@ref@{Syntax survey@}}}). Do not split a cross-reference across two lines -- this causes the -cross-reference to be rendered incorrectly in html documents. +cross-reference to be rendered incorrectly in HTML documents. @itemize @item @@ -909,6 +932,18 @@ the same format as @code{@@enumerate}. Do not use @node Special characters @unnumberedsubsubsec Special characters +@warning{In Texinfo, the backslash is an ordinary character, and +is entered without escaping (e.g. +@samp{The@tie{}@@code@{@bs{}foo@}@tie{}command}). However, within +double-quoted Scheme and/or LilyPond strings, backslashes +(including those ending up in Texinfo markup) need to be escaped +by doubling them: +@example +(define (foo x) + "The @@code@{@bs{}@bs{}foo@} command..." + ...) +@end example} + @itemize @item @code{--}, @code{---} --- Create an en dash (--) or an em dash @@ -1255,15 +1290,6 @@ Note that you have to find yourself the source files to fix cross-references in the generated documentation such as the Internals Reference; e.g. you can grep scm/ and lily/. -@c temporary? how long will kainhofer be used? -gp -Also of interest may be the linkdoc checks on kainhofer.com. Be -warned that these docs are not completely rebuilt every day, so it -might not accurately reflect the current state of the docs. - -@example -@uref{http://kainhofer.com/~lilypond/linkdoc/} -@end example - @node General writing @subsection General writing @@ -1445,7 +1471,7 @@ good example of this. On the other side of this, @example -\override Score.Hairpin #'after-line-breaking = ##t +\override Score.Hairpin.after-line-breaking = ##t @end example clearly belongs in LSR. @@ -1490,10 +1516,12 @@ the difficulty. @unnumberedsubsubsec Building only one section of the documentation In order to save build time, a script is available to build only -one section of the documentation in English with a default html +one section of the documentation in English with a default HTML appearance. -You can build a section of the documentation with: +If you do not yet have a @file{build/} subdirectory within the LilyPond +Git tree, you should create this first. You can then build a section of +the documentation with the following command: @example scripts/auxiliar/doc-section.sh MANUAL SECTION @@ -1512,12 +1540,12 @@ scripts/auxiliar/doc-section.sh notation pitches You can then see the generated document for the section at @example -tempdocs/pitches/out/pitches.html +build/tempdocs/pitches/out/pitches.html @end example According to -@uref{http://code.google.com/p/lilypond/issues/detail?id=1236,Lilypond issue 1236}, -the location of the lilypond git tree is taken from @code{$LILYPOND_GIT} +@uref{https://sourceforge.net/p/testlilyissues/issues/1236/,LilyPond issue 1236}, +the location of the LilyPond Git tree is taken from @code{$LILYPOND_GIT} if specified, otherwise it is auto-detected. It is assumed that compilation takes place in the @file{build/} @@ -1529,7 +1557,7 @@ overridden by setting the environment variable @code{LILYPOND_TEMPDOCS}. This script will not work for building sections of the -Contributors' guide. For building sections of the Contributors' +Contributors' Guide. For building sections of the Contributors' Guide, use: @example @@ -1538,7 +1566,7 @@ scripts/auxiliar/cg-section.sh SECTION @noindent where @code{SECTION} is the name of the file containing the sections -to be built. For example, to build section 4 of the Contributors' guide, +to be built. For example, to build section 4 of the Contributors' Guide, use: @example @@ -1829,7 +1857,7 @@ will be handled by someone who will translate it to English and send it on bug-lilypond or add an issue in the tracker, then translate back the reply from developers. -@item @rweb{Help us}: this page should be translated very freely, +@item @rcontrib{Help us}: this page should be translated very freely, and possibly not at all: ask help for contributing to LilyPond for tasks that LilyPond community in your language is able and going to handle. @end itemize diff --git a/Documentation/contributor/introduction.itexi b/Documentation/contributor/introduction.itexi index 12c62e5bfa..24abc03bf7 100644 --- a/Documentation/contributor/introduction.itexi +++ b/Documentation/contributor/introduction.itexi @@ -91,7 +91,7 @@ the developers' mailing list here: @uref{http://lists.gnu.org/mailman/listinfo/lilypond-devel}. @warning{Contributors on Windows or MacOS X wishing to compile -code or documentation are strongly advised to use our Ubuntu +code or documentation are strongly advised to use our Debian LilyPond Developer Remix, as discussed in @ref{Quick start}.} @@ -109,6 +109,20 @@ hosted by GNU savannah. @uref{http://git.savannah.gnu.org/gitweb/?p=lilypond.git} @end example +@item @strong{issue tracker}: +currently hosted by Sourceforge. + +@example +@uref{https://sourceforge.net/p/testlilyissues/issues/} +@end example + +@item @strong{patch review}: +Reitveld -- the collaborative code review tool. + +@example +@uref{https://codereview.appspot.com} +@end example + @item @strong{environment variables}: many maintenance scripts, and many instructions in this guide rely on predefined @ref{Environment variables}. @@ -116,17 +130,21 @@ predefined @ref{Environment variables}. @item @strong{mailing lists}: given on @rweb{Contact}. -@item @strong{branches}: +@item @strong{Git branches}: @itemize @item @code{master}: -base your work from this, but do @strong{not push} to it. +always base your work from this branch, but @strong{never push} directly +to it. Patches are always pushed directly to the @code{staging} branch +instead. @item @code{staging}: -after a successful review (see below), push here. +always push to this branch after a successful patch review cycle (see +below). @item @code{translation}: -translators should base their work from this, and also push to it. +Translators should base their work on this branch only and push any +translation patches directly to it as well. @item @code{dev/foo}: feel free to push any new branch name under @code{dev/}. @@ -134,74 +152,69 @@ feel free to push any new branch name under @code{dev/}. @end itemize @item @strong{regression tests}: -also known as @qq{regtests}; this is a collection of more than a -thousand .ly files. We track the output of those files between -versions. +also known as @qq{regtests}. A collection of more than a thousand +@code{.ly} files that are used to track LilyPond's engraving output +between released stable and unstable versions as well as checked for all +patches submitted for testing. -If a patch introduces any unintentional changes to the regtests, -we will likely reject it -- make sure that you are aware and can -explain any regtest changes. More info in @ref{Regression tests}. +If a patch introduces any unintentional changes to any of the regtests +it is very likely it will be rejected (to be fixed) -- always make sure +that, if you expect any regression test changes, that they are explained +clearly as part of the patch description when submitting for testing. +For more information see @ref{Regression tests}. @item @strong{reviews}: after finishing work on a patch or branch: @enumerate @item -upload it with our custom @code{git-cl}. In addition to uploading -it to the google rietveld code review tool, this adds a tracker -issue so that we don't lose your patch. The @qq{status} of your -patch is kept on the issue tracker; see @ref{Issues}. - -@example -@uref{https://github.com/gperciva/git-cl} -@end example +upload it with our custom @code{git-cl} @q{helper-script}; see +@ref{git-cl}. In addition to uploading patches to the Google's Rietveld +code review tool the script will also update the issue tracker (or add a +new issue as appropriate) so that any reference to the patch is not +lost. The current @qq{status} of any patch submitted is always managed +on the issue tracker; also see @ref{Issues}. -Your patch will be given @code{Patch-new} status. More info in -@ref{Uploading a patch for review}. +Once submitted the patch will be given a status of @code{Patch-new} and +will enter the @qq{Patch Countdown}. More information on this can be +found in the section @ref{Uploading a patch for review}. @item -If your patch passes some automatic tests, it will be given -@code{Patch-review} status. This generally happens within 24 -hours. +Patches are generally tested within 24 hours of submission. Once it has +passed the basic tests -- make, make doc and a make test-baseline/check +--, the tracker will be updated and the patch's status will change to +@code{Patch-review} for other developers to examine. @item -After that, the patch must wait for the next @qq{patch countdown}, -which occur 3 times a week. If there are a lot of patches waiting -for a countdown, a subset of patches are chosen randomly. When -your patch is put on a countdown, it will be given -@code{Patch-countdown} status. +Every third day, the @qq{Patch Meister} will examine the issue tracker +and the Rietveld code review tool for the submitted patch, looking for +any comments by other developers. Depending on what has been posted, +the patch will be either; @qq{moved on} to the next patch status +(@code{Patch-countdown}); set back to @code{Patch-needs_work}; or if +more discussion is needed, left at @code{Patch-review}. In all cases +the issue tracker (not the Rietveld code review tool) will be updated by +the Patch Meister accordingly. @item -The countdown is a 48-hour period which gives other developers one -last chance to review the patch. If no significant problems are -found, your patch will be given @code{Patch-push} status. +Once another three days have passed, any patch that has been given +@code{Patch-countdown} status will be changed to @code{Patch-push}, the +issue tracker is updated, and the developer can now push it directly to +the @code{staging} branch (or email the patch -- created with +@w{@code{git format-patch}} command -- to one of the other developers +who can push it for you). @item -You may now either push it to the @code{staging} branch, or email -your patch (created with @w{@code{git format-patch}}) to somebody -who will push it for you. +Automatic scripts run every few hours to merge the @code{staging} branch +with @code{master}. @end enumerate -@advanced{Yes, this process means that most patches wait between -60-120 hours before reaching @code{master}. This is unfortunate, but -given our limited resources for reviewing patches and a history of -unintended breakage in @code{master}, this is the best compromise -we have found.} - -@c I don't think this is important enough to list here, but I may -@c change my mind and/or leave a link to a later CG section. -@ignore -@item @strong{code style}: -C++ code should be formatted with -@file{scripts/auxiliar/fixcc.py}, which requires -@url{http://astyle.sourceforge.net/, astyle 2.02}. However, we -are not very strict about this requirement. - -At the moment, scheme code should be formatted @qq{like emacs does -it}. We are working on an automated tool to simplify this step. -However, we are not very strict about this requirement either. -@end ignore +@advanced{This process does means that most patches will take about a +week before finally being merged into @code{master}. With the limited +resources for reviewing patches available and a history of unintended +breakages in the @code{master} branch (from patches that have +not had time to be reviewed properly), this is the best compromise we +have found.} @end itemize diff --git a/Documentation/contributor/issues.itexi b/Documentation/contributor/issues.itexi index 01cce81411..434ead511a 100644 --- a/Documentation/contributor/issues.itexi +++ b/Documentation/contributor/issues.itexi @@ -1,4 +1,4 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +Elu@c -*- coding: utf-8; mode: texinfo; -*- @node Issues @chapter Issues @@ -7,9 +7,7 @@ miscellaneous development tasks. @menu * Introduction to issues:: -* Bug Squad overview:: -* Bug Squad setup:: -* Bug Squad checklists:: +* The Bug Squad:: * Issue classification:: * Adding issues to the tracker:: * Patch handling:: @@ -20,151 +18,137 @@ miscellaneous development tasks. @node Introduction to issues @section Introduction to issues -@warning{Unless otherwise specified, all the tasks in this chapter -are @qq{simple} tasks: they can be done by a normal user with -nothing more than a web browser, email, and lilypond.} - -@qq{Issues} isn't just a politically-correct term for @qq{bug}. -We use the same tracker for feature requests, code TODOs and -patches, so the term @qq{bug} wouldn't be accurate. Despite the -difference between @qq{issue} and @qq{bug}, we call our team of -contributors who organize issues the @emph{Bug Squad}. +@warning{All the tasks in this chapter require no programming skills and +can be done by anyone with a web browser, an email client and the +ability to run LilyPond.} -The Bug Squad is mainly composed of non-programmers -- their job -is to @emph{organize} issues, not solve them. Their duties -include removing false bug reports, ensuring that any real bug -report contains enough information for developers, and checking -that a developer's fix actually resolves the problem. +The term @q{issues} refers not just to software bugs but also includes +feature requests, documentation additions and corrections as well as any +other general code @q{TODOs} that need to be kept track of. -New volunteers for the Bug Squad should contact the -@ref{Meisters, Bug Meister}. -@node Bug Squad overview -@section Bug Squad overview +@node The Bug Squad +@section The Bug Squad -The Bug Squad are volunteers who progress issue tracking using the -Google Issue tracker at +@menu +* Bug Squad setup:: +* Bug Squad checklists:: +@end menu -@example -@uref{http://code.google.com/p/lilypond/issues/list} -@end example +To help keep track and organize all issues are a group of tireless +volunteers collectively known as the @emph{Bug Squad}. Composed mainly +of non-programmers, the Bug Squad's responsibilities include: -Bug Squad members have 2 primary responsiblities: +@itemize -@enumerate +@item +Monitoring the LilyPond Bugs mailing list looking for any issues +reported by other users ensuring that they are accurate and contain +enough information for the developers to work with, preferably with +@rweb{Tiny examples} and if applicable, screenshots. @item -Monitoring the LilyPond Bugs mailing list and adding to the -tracker any new issues reported there. +Adding new issues to the @emph{issue tracker} or updating existing +issues with new information. @item -Verifying issues that are claimed fixed by a developer, to ensure -that the fix works, and is actually in the code base. +Verifying issues in the @emph{issue tracker} that have been marked +as @q{fixed}; making sure either that the fix works or (in the case of +Documentation for example) has at least been commited to the code base. -@end enumerate +@end itemize + +The @ref{Meisters, Bug Meister} also helps check the current +@ref{Regression tests} and highlights any significant changes (or +problems) since the previous LilyPond release. -It's also part of the Bug Squad's responsibility to check that -the Regression Tests don't show up any problems in the latest -release. The Bug Meister currently does this. +If you would like to be part of the Bug Squad, please contact the +@ref{Meisters, Bug Meister}. -All of this is explained in more detail in the following sections. @node Bug Squad setup -@section Bug Squad setup +@subsection Bug Squad setup -We highly recommend that you configure your email to use effective -sorting; this can reduce your workload @emph{immensely}. The -email folders names were chosen specifically to make them work if -you sort your folders alphabetically. +We highly recommend that you configure your email client to use some +kind of sorting and filtering as this will significantly reduce and +simplify your workload. Suggested email folder names are mentioned +below to work when sorted alphabetically. @enumerate @item -Read every section of this chapter, @ref{Issues}. +Read every section of the @ref{Issues} chapter in this guide. @item -If you do not have one already, create a gmail account and send -the email address to the @ref{Meisters, Bug Meister}. +Subscribe your email account to @code{bug-lilypond}. See +@uref{https://lists.gnu.org/mailman/listinfo/bug-lilypond}. @item -Subscribe your gmail account to @code{bug-lilypond}. +Send your email address to the @ref{Meisters, Bug Meister}. @item -Configure your google code account: +Create your own Sourceforge login (required for the Allura issue +tracker): -@enumerate +@itemize @item -Wait until your gmail account is listed in: - -@example -@uref{http://code.google.com/p/lilypond/people/list} -@end example +Go to @uref{https://sourceforge.net/p/testlilyissues/issues/} @item -Sign in to google code by clicking in the top-right corner of: - -@example -@uref{http://code.google.com/p/lilypond/issues/list} -@end example - -You cannot log on if you have Google Sharing enabled -@uref{http://www.googlesharing.net/}. +Click on 'Join' in the top-right corner. @item -Go to your @qq{Profile}, and select @qq{Settings}. +Fill in your details as required and click the @emph{Register} button to +complete the registration. -@item -Scroll down to @qq{Issue change notification}, and make sure that -you have @emph{selected} @qq{If I starred the issue}. +@end itemize -@end enumerate +@item +Send your Sourceforge @emph{username} (not your email address) to +@email{bug-lilypond@@gnu.org} asking to be given appropriate permissions +to either create, edit and comment on tracker issues. @item Configure your email client: -@enumerate +@itemize @item -Any email sent with your gmail address in the @code{To:} or -@code{CC:} fields should go to a @code{bug-answers} folder. - -When setting up your filtering rules, be aware that Google Code -might use different versions of your email address, such as ones -ending in @code{@@googlemail.com} or @code{@@gmail.com}. +Any email sent with your address in the @code{To:} or @code{CC:} fields +should be configured to go into a @code{bug-answers} folder. @item -Any other email either from, or CC'd to, +Any email either @code{From:} or @code{CC:} to, @example -lilypond@@googlecode.com +testlilyissues-auto@@lists.sourceforge.net @end example @noindent -should go into a separate @code{bug-ignore} folder. Alternately, -you may automatically delete these emails. - -You will @strong{not read} these emails as part of your Bug Squad -duties. If you are curious, go ahead and read them later, but it -does @strong{not} count as Bug Squad work. +should be configured to go into a @code{bug-ignore} folder or, +alternately, configure your email client to delete these automatically. +You do @emph{not} need to read mails in the @code{bug-ignore} folder. +If you are curious (and have time) then read them, but they are not +necessary for Bug Squad work. @item -Any other email sent to (or CC'd to): +Any email sent @code{To:} or @code{CC:} to, @example bug-lilypond @end example @noindent -should go into a separate @code{bug-current} folder. +should be configured to go into a @code{bug-current} folder. -@end enumerate +@end itemize @end enumerate @node Bug Squad checklists -@section Bug Squad checklists +@subsection Bug Squad checklists When you do Bug Squad work, start at the top of this page and work your way down. Stop when you've done 20 minutes. @@ -183,16 +167,16 @@ please forward such emails to the @code{bug-lilypond} list so that the currently-active Bug Squad member(s) can handle the message. -@subsubheading Daily schedule +@subsubheading Daily schedule as of July 2015 @example -Monday: Eluze -Tuesday: Ralph -Wednesday: Marek -Thursday: Joe Wakeling (soon) -Friday: Colin H -Saturday: Colin H -Sunday: Federico +Monday: Federico Bruni +Tuesday: Simon Albrecht +Wednesday: Simon Albrecht +Thursday: Colin Campbell +Friday: Ralph Palmer +Saturday: Colin Campbell +Sunday: @end example @@ -344,21 +328,26 @@ After @strong{every release} (both stable and unstable): @item Issues to verify: go to -@example -@uref{http://code.google.com/p/lilypond/issues/list?can=7} -@end example +@smallexample +@uref{https://sourceforge.net/p/testlilyissues/issues/search/?q=status%3AFixed} +@end smallexample -(You can also generate this list by selecting -@qq{Issues to verify} from the drop-down list next to the search -box.) +(You can also generate this list by selecting the @qq{Open (Fixed)} +button down the left-hand frame) -You should see a list of Issues that have been claimed fixed by a +You should see a list of Issues that have been marked as 'Fixed' by a developer. If the developer has done their job properly, the -Issue should have a tag @qq{Fixed_mm_MM_ss}, where mm is -the major version, MM the minor version and ss the current -release. This will help you work out which you can verify - do -not verify any Issues where the claimed fixed build is not yet -released. Work your way through these as follows: +Issue should have the @qq{Labels} field filled in with @qq{Fixed_x_y_z}, +where X is the major version, y the minor version and z the current +release. + +@example +Fixed_2_19_39 +@end example + +This will help you work out which you can verify - do not verify any +Issues where the claimed fixed build is not yet released. Work your +way through these as follows: If the Issue refers to a bug, try to reproduce the bug with the latest officially released version (not one you've built yourself from @@ -820,7 +809,6 @@ email should contain a link to the issue you just added. @end enumerate - @node Patch handling @section Patch handling @@ -828,278 +816,87 @@ email should contain a link to the issue you just added. separate person handling this task.} For contributors/developers: follow the steps in -@ref{Commits and patches}, and @ref{Pushing to staging}. +@ref{Patches}, and @ref{Pushing to staging}. @ignore For people doing maintenance tasks: git-cl is adding issues, James -is testing them, Colin is selecting them for countdowns, and -Patchy is merging from staging to master. In the coming weeks, -these tasks will be more and more automated. +is testing patches and managing the Patch countdown. He also generally +runs the scripts that merging to Staging (although other developers are +available to do this task if required). @end ignore -@subheading Patch cycle -@itemize - -@item -Patches get added to the tracker and to Rietveld by the @qq{git-cl} tool, with -a status of @qq{patch-new}. +@node Summary of project status +@section Summary of project status -@item -The automated tester, Patchy, verifies that the patch can be applied -to current master. By default, it checks that the patch allows @code{make} -and @code{make test} to complete successfully. It can also be configured to -check that @code{make doc} is successful. If it passes, Patchy changes the -status to @qq{patch-review} and emails the developer list. If the patch -fails, Patchy sets it to @qq{patch-needs_work} and notifies the developer list. +@subsubheading Project overview -@item -The Patch Meister reviews the tracker periodically, to list patches -which have been on review for at least 24 hours. The list is found at +Project activity @smallexample -@uref{http://code.google.com/p/lilypond/issues/list?can=2&q=label:patch%20patch=review&sort=modified+patch&colspec=ID%20Type%20Status%20Priority%20Owner%20Patch%20Summary%20Modified} +@uref{https://sourceforge.net/projects/testlilyissues/} @end smallexample -@item -For each patch, the Handler reviews any discussion on the tracker -and on Rietveld, to determine whether the patch can go forward. If -there is any indication that a developer thinks the patch is not -ready, the Handler marks it @qq{patch-needs_work} and makes a comment -regarding the reason, referring to the Rietveld item if needed. - -@item -Patches with explicit approval, or at least no negative comment, can -be updated to @qq{patch-countdown}. When saving the tracker item, -clear the @qq{send email} box to prevent sending notification for -each patch. - -@item -The Patch Meister sends an email to the developer list, with a fixed -subject line, to enable filtering by email clients: - -@example -PATCH: Countdown to 20130113 -@end example - -The text of the email sets the deadline for this countdown batch. At -present, batches are done on Tuesday, Thursday and Sunday evenings. +@subsubheading Hindering development -The body of the email lists the patches grouped by patch type, and for -each patch, shows the tracker issue number and title, with a link to -the Rietveld item. Copying the information from the website and pasting -into the email gives a hyperlinked version of the information. +These issues stop or slow development work: @smallexample - -For 20:00 MST Tuesday January 8: - -Crash: - Issue 2990: \RemoveEmptyStaves in StaffGroup context crashes - R 7069044 - -Defect: - Issue 677: \score markup confuses paper settings - R 7028045 - Issue 3050: displayLilyMusic produced erroneous code for rightHandFinger arguments - R 7032045 - -Documentation: - Issue 2952: Upgrade documentation of \once - R 7031053 - Issue 3044: Dual license the files under mf/ using OFL. - R 6970046 - Issue 3084: [DOC]Add "Known issue" in NR 1.2.1 about Scaling durations with rational numbers - R 7071044 - -Enhancement: - Issue 3061: make \articulate handle colon-type tremolos - R 7033045 - Issue 3082: Patch: Let ChordNameVoice use the same performers as Voice - R 7054043 - Issue 3083: Patch: Chord change detection in fretboards should depend on placements, not notes - R 7062043 - Issue 2983: assertion failed with \glissando - R 6625078 - - -Cheers, -Colin - +@uref{https://sourceforge.net/p/testlilyissues/issues/search/?q=status:Accepted%20AND%20_type:Maintainability} @end smallexample -@item -On the scheduled countdown day, the Patch Meister reviews the -previous list of patches on countdown, with the same procedure and -criteria as before. Patches with no controversy can be set to -@qq{patch-push} with a courtesy message added to the comment block. - -@item -Roughly at six month intervals, the Patch Meister can list the -patches which have been set to @qq{patch-needs-work} and send the -results to the developer list for review. In most cases, these -patches should be marked @qq{patch-abandoned} but this should come -from the developer if possible. - -@item -As in most organisations of unpaid volunteers, fixed procedures are -useful in as much as they get the job done. In our community, there -is room for senior developers to bypass normal patch handling flows, -particularly now that the testing of patches is largely automated. -Similarly, the minimum age of 24 hours can reasonably be waived if -the patch is minor and from an experienced developer. - - -@end itemize - -@ignore -There is a single Patch Meister, and a number of Patch Helpers -(rename this?). The list of known patches awaiting review is: - -@example -@uref{http://code.google.com/p/lilypond/issues/list?can=2&q=label:patch&sort=patch} -@end example +@subsubheading Easy tasks +Issues tagged with @code{Frog} indicates a task suitable for a +relatively new contributor. The time given is a quick (and probably +inaccurate) estimate of the time required for somebody who is familiar +with material in this manual, but does not know anything else about +LilyPond development. -@subheading Helpers: adding patches +@smallexample +@uref{https://sourceforge.net/p/testlilyissues/issues/search/?q=status:Accepted%20AND%20labels:Frog} +@end smallexample -The primary duty is to add patches to the google tracker; we have -a bad track record of losing patches in email. Patches generally -come to the @code{lilypond-devel} mailing list, but are sometimes -sent to @code{bug-lilypond}, @code{lilypond-users}, or -@code{frogs} mailing list instead. +@subsubheading Patches currently in the Patch Review cycle -@itemize -@item -Unless a patch is clearly in response to an existing issue, add a -new issue with the @code{Patch-new} label and a link to the patch -(either on the mailing list archives or the codereview url). +Overview -Issue numbers are cheap; losing developers because they got fed up -with us losing their hard work is expensive. - -@end ignore -@c if we enter patches immediately, I don't think this is relevant. -@ignore -@item -Before adding a patch-reminder issue, do a quick check to see if -it was pushed without sending any email. This can be checked for -searching for relevant terms (from the patch subject or commit -message) on the webgit page: +@c The following URL is provided by one of the Developers giving a much +@c easier way to see all patches at all stages of the Review cycle in a +@c single place. @example -@uref{http://git.savannah.gnu.org/gitweb/?p=lilypond.git} +http://philholmes.net/lilypond/allura/ @end example -@end ignore -@ignore - -@item -If the patch is clearly in response to an existing issue, then -update that issue with the @code{Patch-new} label and a link to -the patch (either on the mailing list archives or the codereview -url). - -@item -After adding the issue, please send a response email to the same -group(s) that the initial patch was sent to. - -If the initial email was sent to multiple mailing lists (such as -both @code{bugs} and @code{devel}), then reply to all those -mailing lists as well. The email should contain a link to the -issue you just added. - -@end itemize - -@subheading Helpers: @code{Patch-review} label - -The secondary duty is to do make sure that every issue in the -tracker with a @code{Patch-review} label has passed these -@qq{obvious} tests: - -@itemize -@item -Applies automatically to git master. - -It's ok to have offsets, but not conflicts. - -@item -Regtest comparison looks ok; no unexpected changes. - -@item -Descriptive subject line. - -Avoid subjects like @qq{fixes 123}; instead write @qq{Doc: discuss -stacking-dir for BassFigureAlignment (fix 123)}. - -@item -Compiles docs from scratch. Only check this if you have reason to -suspect it might not work. - -@item -(maybe) -Check code indentation and style. This should be easier post-GOP -when we have a better-defined code style. -@end itemize - - -@subheading Patch Meister - -The Patch Meister will: - -@itemize - -@item -send @qq{countdown} emails to -@code{lilypond-devel} when patches appear to be ready. - -@item -send general requests to review patches, or even nasty requests to -review patches. - -@item -downgrade patches from @code{Patch-review} to -@code{Patch-needs_work} as appropriate. - -@item -downgrade patches from @code{Patch-needs_work} to -@code{Patch-abandoned} if no actions have been taken in four -weeks. - -@end itemize - -@end ignore - - -@node Summary of project status -@section Summary of project status - -@subsubheading Project overview - -Grid view provides the best overview: +@noindent +New patches @smallexample -@uref{http://code.google.com/p/lilypond/issues/list?mode=grid&y=Priority&x=Type&cells=ids} +@uref{https://sourceforge.net/p/testlilyissues/issues/search/?q=status%3AStarted+AND+_patch%3Anew} @end smallexample -@subsubheading Hindering development -These issues stop or slow development work: +@noindent +Patches under Review @smallexample -@uref{http://code.google.com/p/lilypond/issues/list?can=2&q=label:Maintainability} +@uref{https://sourceforge.net/p/testlilyissues/issues/search/?q=status%3AStarted+AND+_patch%3Areview} @end smallexample -@subsubheading Easy tasks -Issues tagged with @code{Frog} indicates a task suitable for a -relatively new contributor. The time given is a quick -(inaccurate) estimate of the time required for somebody who is -familiar with material in this manual, but does not know anything -else about LilyPond development. +@noindent +Patches on final Countdown @smallexample -@uref{http://code.google.com/p/lilypond/issues/list?can=2&q=label:Frog} +@uref{https://sourceforge.net/p/testlilyissues/issues/search/?q=status%3AStarted+AND+_patch%3Acountdown} @end smallexample -@subsubheading Patches to review - -Patches which have no @qq{obvious} problems: - -@example -@uref{http://code.google.com/p/lilypond/issues/list?can=2&q=label:patch-review} -@end example - +@noindent +Patches that can be pushed +@smallexample +@uref{https://sourceforge.net/p/testlilyissues/issues/search/?q=status%3AStarted+AND+_patch%3Apush} +@end smallexample diff --git a/Documentation/contributor/lsr-work.itexi b/Documentation/contributor/lsr-work.itexi index 6e134ea1eb..9f4c6dcdfe 100644 --- a/Documentation/contributor/lsr-work.itexi +++ b/Documentation/contributor/lsr-work.itexi @@ -17,7 +17,7 @@ @section Introduction to LSR The -@uref{http://lsr.dsi.unimi.it/, LilyPond Snippet Repository (LSR)} +@uref{http://lsr.di.unimi.it/, LilyPond Snippet Repository (LSR)} is a collection of lilypond examples. A subset of these examples are automatically imported into the documentation, making it easy for users to contribute to the docs without learning Git and @@ -31,7 +31,7 @@ Texinfo. When you create (or find!) a nice snippet, if it is supported by the LilyPond version running on the LSR, please add it to the LSR. -Go to @uref{http://lsr.dsi.unimi.it/, LSR} and log in -- if you haven't +Go to @uref{http://lsr.di.unimi.it/, LSR} and log in -- if you haven't already, create an account. Follow the instructions on the website. These instructions also explain how to modify existing snippets. @@ -108,7 +108,7 @@ filename. @section Approving snippets The main task of LSR editors is approving snippets. To find a list of -unapproved snippets, log into @uref{http://lsr.dsi.unimi.it/, LSR} and +unapproved snippets, log into @uref{http://lsr.di.unimi.it/, LSR} and select @qq{No} from the dropdown menu to the right of the word @qq{Approved} at the bottom of the interface, then click @qq{Enable filter}. @@ -198,7 +198,7 @@ Next, download the updated snippets and run @command{makelsr.py} against them. From the top source directory, run: @smallexample -wget http://lsr.dsi.unimi.it/download/lsr-snippets-docs-`date +%F`.tar.gz +wget http://lsr.di.unimi.it/download/lsr-snippets-docs-`date +%F`.tar.gz tar -xzf lsr-snippets-docs-`date +%F`.tar.gz make -C $LILYPOND_BUILD_DIR scripts/auxiliar/makelsr.py lsr-snippets-docs-`date +%F` @@ -360,7 +360,7 @@ updating the binary running the LSR. @item Download the latest snippet tarball from -@uref{http://lsr.dsi.unimi.it/download/} and extract it. +@uref{http://lsr.di.unimi.it/download/} and extract it. The relevant files can be found in the @file{all} subdirectory. Make sure your shell is using an English language version, for example @code{LANG=en_US}, then run @command{convert-ly} on all @@ -394,23 +394,8 @@ convert-ly -e -t2.14.2 *.ly @item There might be no conversion rule for some old commands. To make -an initial check for possible problems you can run the following -script on a copy of the @file{all} subdirectory: - -@example -#!/bin/bash - -for LILYFILE in *.ly -do - STEM=$(basename "$LILYFILE" .ly) - echo "running $LILYFILE..." - convert-ly -e -t "$LILYFILE" >& "$STEM".txt -done - -grep refer *.txt -grep smart *.txt -TODO: better script -@end example +an initial check for possible problems you can run the +script at the end of this list on a copy of the @file{all} subdirectory. @item Copy relevant snippets (i.e. snippets whose version is equal to @@ -475,29 +460,54 @@ step by step. @end enumerate -Below is a shell script to run all @file{.ly} files in a directory -and redirect terminal output to text files, which are then -searched for the word "failed" to see which snippets do not compile. +Below is a shell script to run LilyPond on all @file{.ly} files in a directory. +If the script is run with a -s parameter, it runs silently except for reporting +failed files. If run with -c it also runs @code{convert-ly} prior to running +LilyPond. @smallexample #!/bin/bash -for LILYFILE in *.ly +while getopts sc opt; do + case $opt in + s) + silent=true + ;; + c) + convert=true + ;; + esac +done +param=$@ +if [ $silent ]; then + param=$@{param:3@} +fi +if [ $convert ]; then + param=$@{param:3@} +fi +filter=$@{param:-"*.ly"@} + +for LILYFILE in $filter do - STEM=$(basename "$LILYFILE" .ly) - echo "running $LILYFILE..." - lilypond --format=png -ddelete-intermediate-files "$LILYFILE" >& "$STEM".txt + STEM=$(basename "$LILYFILE" .ly) + if [ $convert ]; then + if [ $silent ]; then + $LILYPOND_BUILD_DIR/out/bin/convert-ly -e "$LILYFILE" >& "$STEM".con.txt + else + $LILYPOND_BUILD_DIR/out/bin/convert-ly -e "$LILYFILE" + fi + fi + if [ ! $silent ]; then + echo "running $LILYFILE..." + fi + $LILYPOND_BUILD_DIR/out/bin/lilypond --format=png "$LILYFILE" >& "$STEM".txt + RetVal=$? + if [ $RetVal -gt 0 ]; then + echo "$LILYFILE failed" + fi done - -grep failed *.txt -TODO: better script @end smallexample -Sometimes @code{grep failed *.txt} will not discover all -problematic files. In addition you may want to use: +Output from LilyPond is in @file{filename.txt} and convert-ly in +@file{filename.con.txt}. -@example -grep ERROR *.txt -grep error *.txt -grep warning *.txt -@end example diff --git a/Documentation/contributor/programming-work.itexi b/Documentation/contributor/programming-work.itexi index 819534b4ad..66a792066c 100644 --- a/Documentation/contributor/programming-work.itexi +++ b/Documentation/contributor/programming-work.itexi @@ -771,8 +771,8 @@ The error functions come in three different flavors: fatal error messages, programming error messages and normal error messages. Errors written by the @code{error ()} function will cause LilyPond to exit immediately, errors by @code{Input::error ()} will continue the compilation, but -return a non-zero return value of the lilypond call (i.e. indicate an -unsuccessful program execution). All other errors will be printed on the +return a non-zero return value of the LilyPond call (i.e. indicate an +unsuccessful program execution). All other errors will be printed on the console, but not exit LilyPond or indicate an unsuccessful return code. Their only differences to a warnings are the displayed text and that they will be shown with loglevel @code{ERROR}. @@ -882,7 +882,7 @@ treated as if @code{Input::error} was called. The most commonly used tool for debugging LilyPond is the GNU debugger gdb. The gdb tool is used for investigating and debugging -core Lilypond code written in C++. Another tool is available for +core LilyPond code written in C++. Another tool is available for debugging Scheme code using the Guile debugger. This section describes how to use both gdb and the Guile Debugger. @@ -913,17 +913,21 @@ The GNU debugger, gdb, is the principal tool for debugging C++ code. @subheading Compiling LilyPond for use with gdb In order to use gdb with LilyPond, it is necessary to compile -LilyPond with debugging information. This is accomplished by running -the following commands in the main LilyPond source directory. +LilyPond with debugging information. This is the current default +mode of compilation. Often debugging becomes more complicated +when the compiler has optimised variables and function calls away. +In that case it may be helpful to run the following command in the +main LilyPond source directory: @example -./configure --disable-optimising +./configure --disable-optimising make @end example -This will create a version of LilyPond containing debugging -information that will allow the debugger to tie the source code -to the compiled code. +This will create a version of LilyPond with minimal optimization +which will allow the debugger to access all variables and step +through the source code in-order. It may not accurately reproduce +bugs encountered with the optimized version, however. You should not do @var{make install} if you want to use a debugger with LilyPond. The @var{make install} command will strip debugging @@ -931,7 +935,7 @@ information from the LilyPond binary. @subheading Typical gdb usage -Once you have compiled the Lilypond image with the necessary +Once you have compiled the LilyPond image with the necessary debugging information it will have been written to a location in a subfolder of your current working directory: @@ -1105,7 +1109,7 @@ commands. For a listing of these commands, type: debug> help @end example -Alternatively you may code the breakpoints in your Lilypond source +Alternatively you may code the breakpoints in your LilyPond source file using a command such as: @example @@ -1130,18 +1134,17 @@ in has been declared. For example, if you are working on routines called by @var{print-book-with} in @file{lily-library.scm}: @example -(define (print-book-with parser book process-procedure) - (let* ((paper (ly:parser-lookup parser '$defaultpaper)) - (layout (ly:parser-lookup parser '$defaultlayout)) - (outfile-name (get-outfile-name parser))) +(define (print-book-with book process-procedure) + (let* ((paper (ly:parser-lookup '$defaultpaper)) + (layout (ly:parser-lookup '$defaultlayout)) + (outfile-name (get-outfile-name book))) (process-procedure book paper layout outfile-name))) -(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)) +(define-public (print-book-with-defaults book) + (print-book-with book ly:book-process)) +(define-public (print-book-with-defaults-as-systems book) + (print-book-with book ly:book-process-to-systems)) @end example At this point in the code you could add this to set a breakpoint at @@ -1204,8 +1207,15 @@ number of different platforms: In order for the Graphviz tool to work, config.make must be modified. It is probably a good idea to first save a copy of config.make under -a different name. Then, edit config.make by removing every occurrence -of @option{-DNDEBUG}. +a different name. + +In order to have the required functionality available, LilyPond +needs to be compiled with the option @option{-DDEBUG}. You can +achieve this by configuring with + +@example +./configure --enable-checking +@end example @item Rebuilding LilyPond @@ -1222,9 +1232,9 @@ In order to use the graphviz utility, the @file{.ly} file must include grobs and symbols that should be tracked. An example of this is found in @file{input/regression/graphviz.ly}. -@item Run lilypond with output sent to a log file +@item Run LilyPond with output sent to a log file -The Graphviz data is sent to stderr by lilypond, so it is +The Graphviz data is sent to stderr by LilyPond, so it is necessary to redirect stderr to a logfile: @example @@ -1233,11 +1243,11 @@ lilypond graphviz.ly 2> graphviz.log @item Edit the logfile -The logfile has standard lilypond output, as well as the Graphviz +The logfile has standard LilyPond output, as well as the Graphviz output data. Delete everything from the beginning of the file up to but not including the first occurrence of @code{digraph}. -Also, delete the final lilypond message about success from the end +Also, delete the final LilyPond message about success from the end of the file. @item Process the logfile with @code{dot} @@ -1253,10 +1263,10 @@ dot -Tpdf graphviz.log > graphviz.pdf The pdf file can then be viewed with any pdf viewer. -When compiled without @option{-DNDEBUG}, lilypond may run slower -than normal. The original configuration can be restored by either -renaming the saved copy of @code{config.make} or rerunning -@code{configure}. Then rebuild lilypond with +When compiled with @option{-DDEBUG}, LilyPond may run slower +than normal. The original configuration can be restored by rerunning +@code{./configure} with @option{--disable-checking}. Then +rebuild LilyPond with @example make -C lily clean && make -C lily @@ -1365,7 +1375,7 @@ scripts/auxiliar/update-with-convert-ly.sh If you did an out-of-tree build, pass in the relative path: @example -BUILD_DIR=../build-lilypond/ scripts/auxiliar/update-with-convert-ly.sh +LILYPOND_BUILD_DIR=../build-lilypond/ scripts/auxiliar/update-with-convert-ly.sh @end example @@ -1373,7 +1383,7 @@ BUILD_DIR=../build-lilypond/ scripts/auxiliar/update-with-convert-ly.sh @subsection Manually update documentation Where the convert-ly rule is not able to automatically update the inline -lilypond code in the documentation (i.e. if a NOT_SMART rule is used), the +LilyPond code in the documentation (i.e. if a NOT_SMART rule is used), the documentation must be manually updated. The inline snippets that require changing must be changed in the English version of the docs and all translated versions. If the inline code is not changed in the @@ -1808,7 +1818,8 @@ time and to prevent you some major headaches. @node Purity in LilyPond @subsection Purity in LilyPond -Pure properties in LilyPond that do not have any @q{side effects}. +Pure properties in LilyPond are properties that do not have any +@q{side effects}. That is, looking up a pure property should never result in calls to the following functions: @itemize @@ -1888,55 +1899,8 @@ of a spanner broken at given starting and ending columns. @node How purity is defined and stored @subsection How purity is defined and stored -Purity can currently be defined two different ways in LilyPond that -correspond to two types of scenarios. In one scenario, we know that a -callback is pure, but we are not necessarily certain what properties -will use this callback. In another, we want a property to be pure, but -we don't want to guarantee that its callback function will be pure in -all circumstances. - -In the first scenario, we register the callback in define-grobs.scm in -one of four places depending on what the function does. - -@itemize -@item @code{pure-print-functions}: If finding a print function's vertical -extent does not have any @q{side effects} we register it here. We then -don't have to set the pure Y-extent property, which will be taken from the -stencil. - -@item @code{pure-print-to-height-conversions}: If a stencil can -eventually be used to glean a grob's Y-extent but is not pure (meaning -it will have a different height at different stages of the compilation -process), we add it to this list along with a function for the pure -Y-extent. - -@item @code{pure-conversions-alist}: This list contains pairs of -functions and their pure equivalents. It is onto but not one-to-one. - -@item @code{pure-functions}: Like pure-print-functions in that they work -for both pure and impure values, but they do not return a stencil. -@end itemize - -At all stages of the compilation process, when LilyPond wants the pure -version of a property, it will consult these lists and see if it can get -this property for a given Grob. Note that you do @emph{not} need to -register the pure property in the grob itself. For example, there is no -property @q{pure-Y-extent}. Rather, by registering these functions as -defined above, every time LilyPond needs a pure property, it will check -to see if a Grob contains one of these functions and, if so, will use -its value. If LilyPond cannot get a pure function, it will return a -value of @code{##f} for the property. - -LilyPond is smart enough to know if a series of chained functions are -pure. For example, if a Y-offset property has four chained functions -and all of them have pure equivalents, LilyPond will read the four pure -equivalents when calculating the pure property. However, if even one is -impure, LilyPond will not return a pure property for the offset (instead -returning something like @code{#f} or @code{'()}) and will likely wreak -havoc on your score. - -In the second scenario, we create an unpure-pure-container (unpure is -not a word, but hey, neither was Lilypond until the 90s). For example: +Purity is defined in LilyPond with the creation of an unpure-pure container +(unpure is not a word, but hey, neither was LilyPond until the 90s). For example: @example #(define (foo grob) @@ -1948,23 +1912,8 @@ not a word, but hey, neither was Lilypond until the 90s). For example: \override Stem #'length = #(ly:make-unpure-pure-container foo bar) @end example -This is useful if we want to: - -@itemize -@item create overrides that have pure alternatives (should not be used -in development, but useful for users) - -@item use return values that are not functions (i.e. pairs or booleans) -for either pure or unpure values. - -@item allow a function to be considered pure in a limited amount of -circumstances. This is useful if we are sure that, when associated with -one grob a function will be pure but not necessarily with another grob -that has different callbacks. -@end itemize - -Items can only ever have two pure heights: their actual pure height if -they are between @q{start} and @q{end}, or an empty interval if they are +Note that items can only ever have two pure heights: their actual pure height +if they are between @q{start} and @q{end}, or an empty interval if they are not. Thus, their pure property is cached to speed LilyPond up. Pure heights for spanners are generally not cached as they change depending on the start and end values. They are only cached in certain particular @@ -2074,7 +2023,7 @@ instead of pure height. @node LilyPond scoping @section LilyPond scoping -The Lilypond language has a concept of scoping, i.e. you can do: +The LilyPond language has a concept of scoping, i.e. you can do: @example foo = 1 @@ -2090,7 +2039,7 @@ is translated in to a scheme variable definition. This implemented using modules, with each scope being an anonymous module that imports its enclosing scope's module. -Lilypond's core, loaded from @file{.scm} files, is usually placed in the +LilyPond's core, loaded from @file{.scm} files, is usually placed in the @code{lily} module, outside the @file{.ly} level. In the case of @example @@ -2193,7 +2142,7 @@ but not @code{scm_is_equal}. Return @code{true} if @var{b} is @code{SCM_BOOL_T}, else return @code{false}. This should be used instead of @code{scm_is_true} and -@code{scm_is_false} for properties since in Lilypond, unset properties +@code{scm_is_false} for properties since in LilyPond, unset properties are read as an empty list, and by convention unset Boolean properties default to false. Since both @code{scm_is_true} and @code{scm_is_false} only compare with @code{##f} in line with what @@ -2208,10 +2157,10 @@ Behave the same as scm_is_[something] would do if it existed. Test whether the type of @var{s} is [type]. [type] is a LilyPond-only set of values (direction, axis...). More -often than not, the code checks Lilypond specific C++-implemented +often than not, the code checks LilyPond specific C++-implemented types using -@subsubheading [type *] unsmob_[type] (SCM s) +@subsubheading [Type *] unsmob (SCM s) This tries converting a Scheme object to a pointer of the desired kind. If the Scheme object is of the wrong type, a pointer value @@ -2609,22 +2558,24 @@ this will display OBJ through GUILE. @subsection Music functions and GUILE debugging Ian Hulin was trying to do some debugging in music functions, and -came up with the following question +came up with the following question (edited and adapted to current +versions): HI all, I'm working on the Guile Debugger Stuff, and would like to try debugging a music function definition such as: @example -conditionalMark = #(define-music-function (parser location) () -    #@{ \tag #'instrumental-part @{\mark \default@}  #@} ) +conditionalMark = +#(define-music-function () () + #@{ \tag instrumental-part @{\mark \default@} #@} ) @end example -It appears conditionalMark does not get set up as an +It appears @code{conditionalMark} does not get set up as an equivalent of a Scheme @example -(define conditionalMark = define-music-function(parser location () ... +(define conditionalMark = define-music-function () () ... @end example @noindent @@ -2638,25 +2589,54 @@ although something gets defined because Scheme apparently recognizes later on in the file without signalling any Guile errors. However the breakpoint trap is never encountered as -define-music-function passed things on to ly:make-music-function, -which is really C++ code ly_make_music_function, so Guile never -finds out about the breakpoint. +@code{define-music-function} passed things on to +@code{ly:make-music-function}, which is really C++ code +@code{ly_make_music_function}, so Guile never finds out about the +breakpoint. + + +The answer in the mailing list archive at that time was less than +helpful. The question already misidentifies the purpose of +@code{ly:make-music-function} which is only called once at the +time of @emph{defining} @code{conditionalMark} but is not involved +in its later @emph{execution}. -Han-Wen answered as follows: +Here is the real deal: -You can see the definition by doing +A music function is not the same as a GUILE function. It boxes +both a proper Scheme function (with argument list and body from +the @code{define-music-function} definition) along with a call +signature representing the @emph{types} of both function and +arguments. + +Those components can be reextracted using +@code{ly:music-function-extract} and +@code{ly:music-function-signature}, respectively. + +When LilyPond's parser encounters a music function call in its +input, it reads, interprets, and verifies the arguments +individually according to the call signature and @emph{then} calls +the proper Scheme function. + +While it is actually possible these days to call a music function +@emph{as if} it were a Scheme function itself, this pseudo-call +uses its own wrapping code matching the argument list @emph{as a +whole} to the call signature, substituting omitted optional +arguments with defaults and verifying the result type. + +So putting a breakpoint on the music function itself will still +not help with debugging uses of the function using LilyPond +syntax. + +However, either calling mechanism ultimately calls the proper +Scheme function stored as part of the music function, and that is +where the breakpoint belongs: @example -#(display conditionalMark) +#(set-break! (ly:music-function-extract conditionalMark)) @end example -noindent -inside the @file{.ly} file. - -The breakpoint failing may have to do with the call sequence. See -@file{parser.yy}, run_music_function(). The function is called directly from -C++, without going through the GUILE evaluator, so I think that is why -there is no debugger trap. +will work for either calling mechanism. @node Articulations on EventChord @subsection Articulations on EventChord diff --git a/Documentation/contributor/quick-start.itexi b/Documentation/contributor/quick-start.itexi index 2484b8e31a..e3ee9e9141 100644 --- a/Documentation/contributor/quick-start.itexi +++ b/Documentation/contributor/quick-start.itexi @@ -10,6 +10,7 @@ for you and will help you do this as quickly and easily as possible. @menu * LilyDev:: * lily-git:: +* git-cl:: * Compiling with LilyDev:: * Now start work!:: @end menu @@ -17,62 +18,52 @@ for you and will help you do this as quickly and easily as possible. @node LilyDev @section LilyDev -There is a disk image of a @q{remix} of Ubuntu GNU/Linux available for -download which includes all the necessary software and tools to compile -both LilyPond and the documentation. Called the -@qq{Ubuntu LilyPond Developer Remix}, but known simply as @qq{LilyDev} -for short. Although it is not possible to compile LilyPond on Windows -and extremely difficult on MacOS, LilyDev can be installed and run -inside a @q{virtual machine} on any of these operating systems without -disturbing your main operating system. The LilyDev disk image can also -be burnt to a DVD and installed like any other Ubuntu GNU/Linux -distribution. - -Most virtualization software can be used but we recommend VirtualBox as -it is available for all major operating systems and is easy to install -& configure. +@c This text was written based on LilyDev 4.0 - JL -If you are not familiar with GNU/Linux, it may be beneficial to read a -couple of @qq{introduction to Ubuntu} web pages. +There is a @q{remix} of Debian GNU/Linux -- known as @qq{LilyDev} for +short -- which includes all the necessary software and tools to compile +LilyPond, the documentation and the website (also see +@ref{Website work}). -For those interested, the LilyDev remix is currently based on a 32bit -version of 10.04 LTS Ubuntu (Lucid Lynx). +@warning{LilyDev does not include the software for the Grand Unified +Builder -- also see @ref{Grand Unified Builder (GUB)}.} -@warning{Apart from installing and configuring LilyDev in VirtualBox, -the rest of the chapter assumes that you are comfortable using the -command-line. While this chapter is intended for users who may have -never created a patch or compiled software before, experienced -developers (who prefer to use their own development environment) may -still find it instructive to skim over this section.} +While compiling LilyPond on Mac OS and Windows is possible, both +environments are complex to set up. LilyDev can be easily installed +and run inside a @q{virtual machine} on either of these operating +systems relatively easily using readily available virtualization +software. We recommend using VirtualBox as it is available for all +major operating systems and is very easy to install & configure. -@menu -* Where to get LilyDev:: -* Installing LilyDev in VirtualBox:: -* Configuring LilyDev in VirtualBox:: -@end menu +The LilyDev disk image can also be written to a USB device or @q{burnt} +to a DVD -- it is approximately 900 MB in size -- and installed just +like any standard GNU/Linux distribution. +The current image is based on a 32-bit version of Debian 8 (@q{Jessie}) +and the disk image was generated using Debian +@uref{http://live.debian.net/, live-build 4}. -@node Where to get LilyDev -@unnumberedsubsec Where to get LilyDev +@noindent +Download the LilyDev disk image file (a @code{.iso} file) from here: -Download the Ubuntu LilyPond Developer Remix CD image file -(approximately 1 GB) from here: +@example +@uref{https://github.com/fedelibre/LilyDev/releases/latest} +@end example -@smallexample -@uref{http://www.philholmes.net/lilypond/LilyDev/ubuntu-LilyDev-remix-2.6.iso} -@end smallexample +@warning{Apart from installing and configuring LilyDev in VirtualBox, +the rest of the chapter assumes that you are comfortable using the +command-line and is intended for users who may have never created a +patch or compiled software before. More experienced developers (who +prefer to use their own development environment) may still find it +instructive to skim over the following information.} -Some advanced users might want this file too: -@smallexample -@uref{http://www.philholmes.net/lilypond/LilyDev/ubuntu-LilyDev-remix-2.6.iso.md5} -@end smallexample -(If you don't recognize what this file is, then you don't need it.) +If you are not familiar with GNU/Linux, it may be beneficial to read a +few @qq{introduction to Linux} type web pages. -An alternate site for obtaining these files is available: -@smallexample -@uref{http://www.et.byu.edu/~sorensen/ubuntu-LilyDev-remix-2.6.iso} -@uref{http://www.et.byu.edu/~sorensen/ubuntu-LilyDev-remix-2.6.iso.md5} -@end smallexample +@menu +* Installing LilyDev in VirtualBox:: +* Configuring LilyDev in VirtualBox:: +@end menu @node Installing LilyDev in VirtualBox @@ -86,15 +77,15 @@ you can skip this section and go straight to @ref{lily-git}.} @enumerate @item -Download Virtualbox from here: +Download VirtualBox from here: @example -@uref{http://@/www.virtualbox.org/@/wiki/@/Downloads} +@uref{http://www.virtualbox.org/wiki/Downloads} @end example @warning{In virtualization terminology, the operating system where -Virtualbox is installed is known as the @strong{host}. LilyDev -will be installed @q{inside} Virtualbox as a @strong{guest}.} +VirtualBox is installed is known as the @strong{host}. LilyDev +will be installed @q{inside} VirtualBox as a @strong{guest}.} @item Start the VirtualBox software and click @q{New} to create a new @@ -103,7 +94,7 @@ Start the VirtualBox software and click @q{New} to create a new The @q{New Virtual Machine Wizard} will walk you through setting up your guest virtual machine. Choose an appropriate name for your LilyDev installation and select the @q{Linux} operating system. When selecting -the @q{version} use @q{Ubuntu} if available (but not the @q{64 bit} +the @q{version} choose @q{Debian (32 bit)} (don't use the @q{64 bit} option). If you do not have that specific option choose @q{Linux 2.6} (again do not choose any option that has 64 bit next to it). @@ -116,84 +107,58 @@ even if you are able to assign more. @item For your @q{Virtual Hard Disk}, leave the @q{Create new hard disk} -option checked, use the default @q{VDI} and -@qq{Dynamically allocated} options for the virtual hard drive. A -complete compile of everything (code, docs, regression tests) can reach -10 GB so size your virtual disk and its location accordingly. +option checked, use the default @q{VDI} and @qq{Dynamically allocated} +options for the virtual hard drive. A complete compile of everything +(code, docs, regression tests) can reach 10 GB so size your virtual disk +and its location accordingly. @item Verify the summary details and click @q{Create}, when you are satisfied. -Your new guest will be displayed in the Virtualbox window. Click the -@q{Start} button and the @q{First Run Wizard} will prompt you for -the installation media. Click the browse icon and locate the LilyDev -disk image and click through the wizard to start the installation -process. - -@item -When the LilyDev disk image boots, it shows a prompt: +Your new guest will be displayed in the VirtualBox window. -@example -ISOLINUX @code{boot:} -@end example - -Hit the Return key (or wait 30 seconds) and then when the installer -screen loads, using the arrow keys select -@q{Install - start the installer directly} to begin the install process -of LilyDev on your virtual hard disk. The Ubuntu software will walk you -through the complete installation process. +@warning{The image contains a @q{686-pae} kernel, so you must enable +@code{PAE} within the virtual machine's settings -- click on +@clicksequence{System @click{} Processor} and select +@q{Extended features: Enable PAE/NX}.} @item -At the @qq{Prepare disk space} stage, do not be afraid to select -@qq{Erase and use the entire disk}, since this refers to your -@strong{@emph{virtual disk}}, not your machine's actual hard -disk. +Click the @q{Start} button and the @q{First Run Wizard} will prompt you +for the installation media. Click the browse icon, locate the LilyDev +disk image file that you downloaded (the @code{.iso} file) and click +through the wizard to begin the installation process. @item -Click through the rest of the wizard, filling in any appropriate details -when asked and wait for the install to complete. - -@warning{This will take anywhere from 10 minutes to up to an hour -depending on the speed of your computer and if Ubuntu detects you are -connected to the internet and needs to download any additional -security updates or patches, although these updates are not required to -compile LilyPond and it is possible to skip the additional downloads to -speed up the install process.} +When the LilyDev disk image boots for the first time, choose either the +@q{Install} or the @q{Graphical install} menu item. The installer will +then walk you through the complete installation process. @item -When prompted by the Ubuntu installer wizard, restart the virtual -machine and then when prompted to @q{eject the CD} by virtual box, just -click inside the virtual machine window and hit the return key to -reboot the virtual machine. It will not try to restart the installer -but start the virtual machine proper. LilyDev is now installed and -running! +At the @qq{Partition disks} stage, do not be afraid to select +@qq{Guided - use entire disk}, since this refers to your +@strong{@emph{virtual disk}}, not your computer's own hard disk. @item -The current version of LilyPond requires the texlive-lang-cyrillic -package. This package is not part of LilyDev 2.6. Add the package -to LilyDev with: - -@example -sudo apt-get install texlive-lang-cyrillic -@end example +Continue to click through the rest of the wizard, filling in any +appropriate details when asked, and wait for the install to complete. +This will take about 10 minutes or so on a reasonably modern computer. +@item +When the installation is completed, just click on @q{Continue} (you +do not have to remove any media since you installed LilyDev from a Disk +image, which is just a file on your computer). The installer will +reboot the virtual machine. @end enumerate -@knownissues -Not all hardware is supported in all virtualization tools. In -particular, some contributors have reported problems with USB network -adapters. If you have problems with network connection (for example -Internet connection in the host system is lost when you launch virtual -system), try installing and running LilyDev with your computer's -built-in network adapter used to connect to the network. Refer to the -help documentation that comes with your virtualization software. +@noindent +LilyDev should now be installed and running! @node Configuring LilyDev in VirtualBox @unnumberedsubsec Configuring LilyDev in VirtualBox VirtualBox has extra @q{guest additions} which although are not -necessary to use LilyDev or compile Lilypond, do provide some additional +necessary to use LilyDev or compile LilyPond, do provide some additional features to your Virtual Machine to make it easier to work with. Such as being able to dynamically resize the LilyDev window, allow seamless interaction with your mouse pointer on both the host and guest and let @@ -209,14 +174,14 @@ recommended to reboot the guest when the installation is complete. Other virtualization software will also have their own @q{guest} additions, follow the normal procedures for your virtualization software -with Ubuntu as the client. +with LilyDev as the client. @item -Restart Ubuntu to complete the installation of the guest additions. +Restart LilyDev to complete the installation of the guest additions. -@advanced{If you do any kernel upgrades, you may need to reinstall -the additional software. Just follow the step above again and reboot -when the reinstallation is complete.} +@advanced{If you do any kernel upgrades, you may need to reinstall the +additional software. Just follow the step above again and reboot when +the reinstallation is complete.} @end enumerate @@ -232,9 +197,9 @@ hosts. @item Set up any additional features, such as @q{Shared Folders} between -your main operating system and Ubuntu. This is distinct from the -networked share folders in Windows. Consult the external -documentation for this. +your main operating system and LilyDev. This is distinct from the +networked share folders in Windows. Consult the external documentation +for this. Some longtime contributors have reported that @q{shared folders} are rarely useful and not worth the fuss, particularly since files @@ -244,22 +209,20 @@ can be shared over a network instead. Pasting into a terminal is done with @code{Ctrl+Shift+v}. @item -The @qq{Places} top-menu has shortcuts to a graphical -@qq{navigator} like Windows Explorer or the MacOS X Finder. - -@item -Right-click allows you to edit a file with gedit. We recommend -using gedit. - -@item -One particular change from Windows and MacOS X is that most -software should be installed with your @qq{package manager}; this -vastly simplifies the process of installing and configuring -software. Go to @clicksequence{Applications @click{} Ubuntu -Software Center}. +Right-click allows you to edit a file with the text editor (default +is Leafpad). @end itemize +@knownissues +Not all hardware is supported in all virtualization tools. In +particular, some contributors have reported problems with USB network +adapters. If you have problems with network connection (for example +Internet connection in the host system is lost when you launch virtual +system), try installing and running LilyDev with your computer's +built-in network adapter used to connect to the network. Refer to the +help documentation that comes with your virtualization software. + @node lily-git @section lily-git @@ -271,7 +234,7 @@ patches. @menu * Where to get lily-git:: -* Configuring lily-git and downloading the source code:: +* Using lily-git to download the source code:: * How to use lily-git:: @end menu @@ -283,54 +246,61 @@ installed on your computer. @itemize @item -If you are using LilyDev (see @ref{LilyDev}) then lily-git is already -installed and ready to run. +If you are using LilyDev (see @ref{LilyDev}) then lily-git should +already be installed and ready to run. If this is not the case you can +easily turn it on by adding the following line in @code{~/.bashrc}: + +@example +# add lily-git to the PATH +PATH=$LILYPOND_GIT/scripts/auxiliar:"$@{PATH@}" +@end example @item -For those not using LilyDev then lily-git can be obtained by downloading +For those not using LilyDev, lily-git can be obtained by downloading the software directly. See @ref{Manually installing lily-git.tcl}. @item -Finally, lily-git is always part of the LilyPond source code and is -located in @file{$LILYPOND_GIT/scripts/auxillar/lily-git.tcl}. +lily-git is part of the LilyPond source code and is located in +@file{$LILYPOND_GIT/scripts/auxillar/lily-git.tcl}. @end itemize -@node Configuring lily-git and downloading the source code -@unnumberedsubsec Configuring lily-git and downloading the source code - -@warning{The rest of this manual assumes that you are using the -command-line within a terminal.} +@node Using lily-git to download the source code +@unnumberedsubsec Using lily-git to download the source code @enumerate @item -Type (or copy&paste) into the Terminal: +Type the following command into a Terminal: @example lily-git.tcl @end example @noindent -You will be prompted to enter your name and your email address. This -information is used only to identify and label any patches you create. -This information can be edited if required later. See -@ref{Configuring Git}. Click on the @emph{Submit} button to update -lily-git with this information. +You will be prompted to enter a name and email address into the lily-git +UI. This information is used to label any patches you create (using the +lily-git UI or git via the command line) and can be changed later if +required. See @ref{Configuring Git}. + +@item +Click on the @emph{Submit} button to update lily-git with the +information. @item Click on the @qq{Get source} button. -A directory called @file{$LILYPOND_GIT} is now created within -your home directory and the complete source code will start to be -downloaded into it. +A directory called @file{lilypond-git} is created within your home +directory and the entire source code will start to be downloaded into +it. -@warning{Be patient! The complete source is around 150@tie{}Mb.} +@warning{Be patient! There is no progress bar in the lily-git UI but the +complete source is around 180@tie{}MB.} @noindent -When the source code has been downloaded, the @qq{Command output} window -in lily-git will update and display @qq{Done} on the very last line. -The button label will change to say @qq{Update source}. +When the source code has been downloaded, the @qq{command output} window +in the lily-git UI will update and display @qq{Done} on the very last +line and the button label will change to say @qq{Update source}. @warning{Some contributors have reported that occasionally nothing happens at this step at all. If this occurs, then try again in a few @@ -338,37 +308,43 @@ minutes -- it could be an intermittant network problem. If the problem persists, please ask for help.} @item -Close the lily-git GUI and navigate to the @file{$LILYPOND_GIT} +Close the lily-git GUI and navigate to the @file{lilypond-git} directory to view and edit the source files. @end enumerate @noindent -If this is the first time you have compiled LilyPond then please go -to @ref{Compiling with LilyDev} before reading on. +If this is the first time you will be attempting to compile LilyPond, +please see the section @ref{Compiling with LilyDev} before continuing. @node How to use lily-git @unnumberedsubsec How to use lily-git -@warning{Throughout the rest of this manual, most command-line -input should be entered from @file{~/lilypond-git/}. This is -known as the @emph{top source directory} and is often referred to as -@var{$LILYPOND_GIT}.} +Here is a brief description of what each button does in the lily-git UI. -@warning{Only work on one set of changes at once. Do not start -work on any new changes until your first set has been accepted.} +@advanced{Throughout the rest of this manual, most command-line +input should be entered from within the top level of the +@file{~/lilypond-git/} directory. This is known as the +@emph{top of the source directory} and is also referred to as +@var{$LILYPOND_GIT} as a convention for those users who may have +configured their own locations of the LilyPond source code.} + +@warning{For those less experienced contributors using lily-git, we +recommend that you only work on one set of changes at a time and not +start on any new changes until your first set has been accepted.} @subsubheading 1. Update source -At the beginning of each session of lilypond work, you should -click the @qq{Update source} button to get the latest changes to -the source code. +Click the @qq{Update source} button to get any recent changes to the +source code that have been added by other contributors since your last +session. -@warning{In some rare and unfortunate circumstances, this will -result in a @emph{merge conflict}. If this occurs, follow the -instructions for @qq{Abort changes}, below. Your work will not be -lost.} +@warning{If another contributor has updated files in the source code +that you had been working on then updating your own copy of the source +code may result in what is known as a @emph{merge conflict}. If this +occurs, follow the instructions to @qq{Abort changes}, below. Note that +your work will not be lost.} @subsubheading 2a. New local commit @@ -386,7 +362,7 @@ After entering a commit message, click @qq{OK} to finalize the commit. @advanced{for more information regarding commits and commit -messages, see @ref{Commits and patches}.} +messages, see @ref{Commits}.} @subsubheading 2b. Amend previous commit @@ -458,13 +434,215 @@ all changed files to a subdirectory of @file{$LILYPOND_GIT} named current state of the remote repository (at @code{git.sv.gnu.org}). +@node git-cl +@section git-cl + +@menu +* Installing git-cl:: +* Updating git-cl:: +* Configuring git-cl:: +@end menu + +Git-cl is a @q{helper script} that uploads patches to Google's Rietveld +Code Review Tool -- used by the developers for patch review -- and, at +the same time, updates LilyPond's issue tracker. + + +@node Installing git-cl +@unnumberedsubsec Installing @code{git-cl} + +@warning{LilyDev users can jump straight to the next section on updating +@command{git-cl} as it will already be installed in your home +directory.} + +@enumerate + +@item +Download @command{git-cl} by running the command: + +@example +git clone https://github.com/gperciva/git-cl.git +@end example + +@noindent +or, if that command fails for any reason, try: + +@example +git clone git://github.com/gperciva/git-cl.git +@end example + +@item +Add the @file{git-cl/} directory to your @var{PATH} or create a symbolic +link to the @command{git-cl} and @command{upload.py} scripts in one of +your @var{PATH} directories (e.g. @file{$HOME/bin}). + +In GNU/Linux you can add directories to @var{PATH} by adding this line +to your @file{.bashrc} file located in your home directory: + +@example +PATH=~/directory_containing_git-cl:"$@{PATH@}" +@end example + +@end enumerate + + +@node Updating git-cl +@unnumberedsubsec Updating @code{git-cl} + +LilyDev users should make sure that they always have the latest +version of git-cl installed. It is possible that changes have been +made to git-cl that are not (yet) included in the version of LilyDev +that you are using. + +@noindent +Using a terminal run the following commands: + +@example +cd ~/git-cl/ +git pull +@end example + +This will download and update you to the lastest version of git-cl. + + +@node Configuring git-cl +@unnumberedsubsec Configuring @code{git-cl} + +@subsubheading Set up login accounts + +Because @code{git-cl} updates two separate websites (Google's Rietveld +Code Review Tool and LilyPond's issue tracker) you @emph{must} have a +valid user account (login and password) for both sites. + +@noindent +For the Rietveld Code Review Tool you will need a Google account. Note +that a Google account does not require that you have or use a @q{Google} +email address. You can use @emph{any} email address for your Google +account. Just select the option @qq{I prefer to use my current email +address} when you sign up. + +@warning{In order for @code{git-cl} to work, your Google Account +Settings must have the @q{Access for less secure apps} set to +@q{Allowed}. This is normally the default setting.} + +@noindent +For the LilyPond issue tracker, please request a user account by sending +an email to the LilyPond Developer's mailing list +(@code{lilypond-devel@@gnu.org}), preferably using the same email +address that you want to use for your user login. + +@subsubheading Authorizing git-cl for the LilyPond issue tracker + +The @code{git-cl} command itself also needs to be @q{authorized} so that +it can access the LilyPond issue tracker. + +@enumerate +@item +Once you have been given a valid login for the LilyPond issue tracker, +go to the @q{Account settings} and select the @q{OAuth} tab. + +@item +Locate the @q{Register New Application} section and enter @code{git-cl} +in the @q{Application Name:} field. + +@item +Click on the @q{Register new application} button. You should now see +@q{git-cl} listed under the @q{My Applications} section. + +@item +Click on the @q{Generate Bearer Token} button. You should now see +@q{git-cl} listed under the @q{Authorized Applications} section along +with a value for the @q{Bearer Token} entry. This value is used, in the +next steps, to allow git-cl to access and update the LilyPond issue +tracker. + +@end enumerate + +@subsubheading Installing ca-certificates + +In order to have @code{git-cl} properly update issues on the SourceForge +Allura issue tracker, you must have the package @code{ca-certificates} +installed. You can check to see if the package is installed with + +@example +apt --installed list | grep ca-certificates +@end example + +If @code{ca-certificates} is installed, you will get a result that shows +the version that is installed. If it is not installed, there will be +no version displayed. + +Install @code{ca-certificates} with the following: + +@example +sudo apt-get install ca-certificates +@end example + + +@subsubheading Running git-cl for the first time + +@enumerate +@item +Using a terminal, move to the top level of the @code{$LILYPOND_GIT} +directory and then run @code{git-cl} with the @code{config} option: + +@example +cd $LILYPOND_GIT +git-cl config +@end example + +@noindent +You will see a series of prompts. For most of them you can simply +accept the default value by responding with a newline (i.e. by pressing +return or enter). + +@item +The prompt for the @code{Rietveld server} (the patch review tool), which +defaults to @code{codereview.appspot.com} + +@example +Rietveld server (host[:port]) [codereview.appspot.com]: +@end example + +@item +The prompt for the @code{Allura server} (the issue tracker), which +defaults to @code{https://sourceforge.net/p/testlilyissues/issues/} + +@example +Allura server [https://sourceforge.net/p/testlilyissues/issues/]: +@end example + +@item +When prompted for the @code{Allura bearer token} copy/paste the value +generated in the previous steps for +@emph{Authorising git-cl for the LilyPond issue tracker} + +@smallexample +Allura bearer token (see https://sourceforge.net/auth/oauth/): fdbfca60801533465480 +@end smallexample + +@warning{The above is a @q{fake} bearer token used just for +illustration. Do not use this value.} + +@item +Finally, the prompt for the @code{CC list}, which defaults to +@code{lilypond-devel@@gnu.org}, the LilyPond Developer's email list. + +@example +CC list ("x" to clear) [lilypond-devel@@gnu.org]: +@end example + +@end enumerate + +The @code{git-cl} script should now be correctly configured for use. + @node Compiling with LilyDev @section Compiling with LilyDev -LilyDev is our @q{remix} of Ubuntu which contains all the -necessary dependencies to do lilypond development; for more -information, see @rcontrib{LilyDev}. +LilyDev is our @q{remix} of Debian which contains all the +necessary dependencies to do LilyPond development; for more +information, see @ref{LilyDev}. @subsubheading Preparing the build @@ -483,17 +661,20 @@ cd build/ @subsubheading Building @code{lilypond} -Compiling lilypond will likely take between 5 and 60 minutes, -depending on your computer's speed and available RAM. We -recommend that you minimize the terminal window while it is -building; this can have a non-negligible effect on compilation -speed. +Compiling LilyPond will take anywhere between 1 and 15 minutes on most +@q{modern} computers -- depending on CPU and available RAM. We also +recommend that you minimize the terminal window while it is building; +this can help speed up on compilation times. @example cd $LILYPOND_GIT/build/ make @end example +@noindent +It is possible to run @code{make} with the @code{-j} option to help +speed up compilation times even more. See @ref{Compiling LilyPond} + You may run the compiled @code{lilypond} with: @example @@ -522,7 +703,7 @@ firefox $LILYPOND_GIT/build/out-www/offline-root/index.html @subsubheading Installing -Don't. There is no reason to install lilypond within LilyDev. +Don't. There is no reason to install LilyPond within LilyDev. All development work can (and should) stay within the @file{$LILYPOND_GIT} directory, and any personal composition or typesetting work should be done with an official GUB release. diff --git a/Documentation/contributor/release-work.itexi b/Documentation/contributor/release-work.itexi index 2bd0b68f8d..a2e3cb15d5 100644 --- a/Documentation/contributor/release-work.itexi +++ b/Documentation/contributor/release-work.itexi @@ -74,11 +74,46 @@ A @qq{minor release} means an update of @code{y} in @code{2.x.y}. @enumerate +@item +Don't forget to prepare the GUB build machine by deleting and moving unneeded +files: see @qq{Subsequent builds} in @ref{Notes on builds with GUB}. + @item Using any system with git pull access (not necessarily the GUB -build machine), use the commands below to switch to the release -branch, get changes and prepare the release -announcement. This requires a system which has the release/unstable +build machine), use the commands below to do the following: + +@itemize +@item +switch to the release branch + +@item +update the release branch from origin/master + +@item +update the translation files + +@item +create the release announcement + +@item +update the build versions. + +@itemize +@item +VERSION_DEVEL = the current development version (previous VERSION_DEVEL + 0.01) + +@item +VERSION_STABLE = the current stable version (probably no change here) + +@end itemize + +@item +update the @qq{Welcome to LilyPond} version numbers to the version about to be +released + +@end itemize + +This requires a system which has the release/unstable branch. If you get a warning saying you are in @code{detached HEAD} state, then you should create a release/unstable branch with @code{git checkout release/unstable}. @@ -98,17 +133,9 @@ make -C $LILYPOND_BUILD_DIR po-replace mv $LILYPOND_BUILD_DIR/po/lilypond.pot po/ gedit Documentation/web/news-front.itexi Documentation/web/news.itexi gedit VERSION +gedit ly/Wel*.ly @end example -@itemize -@item -VERSION_DEVEL = the current development version (previous VERSION_DEVEL + 0.01) - -@item -VERSION_STABLE = the current stable version (probably no change here) - -@end itemize - @item Commit, push, switch back to master (or wherever else): @@ -116,6 +143,7 @@ Commit, push, switch back to master (or wherever else): git commit -m "Release: bump VERSION_DEVEL." VERSION git commit -m "PO: update template." po/lilypond.pot git commit -m "Release: update news." Documentation/web/ +git commit -m "Release: bump Welcome versions." ly/Wel*.ly git push origin HEAD:release/unstable git checkout master @end example @@ -560,7 +588,7 @@ to continue uninterrupted. Download GUB and start the set up: @example -git clone git://github.com/gperciva/gub/gub.git +git clone git://github.com/gperciva/gub.git cd gub make bootstrap @end example @@ -584,7 +612,7 @@ Download the test output from lilypond.org (you will need to replace @code{2.15.33-1} with the latest build): @smallexample -@uref{http://lilypond.org/download/binaries/test-output/lilypond-2.15.33-1.test-output.tar.bz2} +@uref{http://lilypond.org/downloads/binaries/test-output/lilypond-2.15.33-1.test-output.tar.bz2} @end smallexample Copy the tarball into @file{gub/regtests/}, and tell the build diff --git a/Documentation/contributor/source-code.itexi b/Documentation/contributor/source-code.itexi index 6a957052da..8e07f9fb06 100644 --- a/Documentation/contributor/source-code.itexi +++ b/Documentation/contributor/source-code.itexi @@ -45,7 +45,7 @@ If you haven't already, download and install Git. @qq{Full installer for official Git} from: @example -@uref{http://code.google.com/p/msysgit/downloads/list} +@uref{https://git-for-windows.github.io/} @end example @item Other operating systems: either install @command{git} with @@ -216,9 +216,9 @@ this to your @file{~/.bashrc}: export PS1="\u@\h \w\$(__git_ps1)$ " @end verbatim -If you are not using LilyDev, you may need to install the -additional @code{git-completion} package, but it is definitely -worth it. +You may need to install the additional @code{bash-completion} +package, but it is definitely worth it. After installation +you must log out, and then log back in again to enable it. @subsubheading Technical details @@ -531,7 +531,7 @@ We have a few other code repositories. @menu * lilypond-extra:: * Grand Unified Builder (GUB):: -* lilypad:: +* LilyPad:: * yet more repositories:: @end menu @@ -587,16 +587,63 @@ and the original version by Jan Nieuwenhuizen, kept at @end example -@node lilypad -@unnumberedsubsubsec lilypad +@node LilyPad +@unnumberedsubsubsec LilyPad Our binary releases on MacOS X and Windows contain a lightweight -text editor. This code is here: +text editor. + +To make any modifications the Windows editor, you will need to do the +following: + +@enumerate +@item +Clone the git repository from @code{https://github.com/gperciva/lilypad} + +@item +Make changes to the source, and check it compiles. In a Windows environment +@code{MinGW} provides both a @code{Git} installation and a @code{gcc} +compiler. This can be obtained from @code{http://www.mingw.org/} + +@item +Update the version which is contained in the @file{rsrc.rc}. Check +this compiles, too. + +@item +Commit the changes with an informative commit message. + +@item +Push the changes to github. You will need to use syntax similiar to this: @example -https://github.com/gperciva/lilypad +git push https://UserName@@github.com/gperciva/lilypad.git @end example +You will need to have push access to the git repository for this to be +successful. + +@item +Make a tarball of the source code to be used by GUB by pulling the updated +repository from GitHub. Ensure that the tarball has the correct Version +number. + +@item +Copy the tarball to @code{http://lilypond.org/downloads/gub-sources/lilypad/}. +You will need to have SSH access to @code{lilypond.org}. If you do not, contact +the Release Manager via the lilypond-devel mailing list. + +@item +Update GUB to make it use the new tarball by editing +@file{gub/specs/lilypad.py} and changing the @code{source =} line to point to +the new source. + +@item +Push this updated @file{lilypad.py} version to the GUB repository on GitHub. + +@item +Test the changes with a new GUB compile. + +@end enumerate @node yet more repositories @unnumberedsubsubsec yet more repositories @@ -801,7 +848,10 @@ The branches are kept for archival reasons. * The Git contributor's cycle:: * Pulling and rebasing:: * Using local branches:: -* Commits and patches:: +* Commits:: +* Patches:: +* Uploading a patch for review:: +* The patch review cycle:: @end menu @@ -893,7 +943,7 @@ refusing to pull with rebase: your working tree is not up-to-date @noindent it means that you have modified some files in you working tree -without committing changes (see @ref{Commits and patches}); you +without committing changes (see @ref{Commits}); you can use the @command{git@tie{}stash} command to work around this: @example @@ -1041,16 +1091,13 @@ to merge @code{translation} into @code{staging} whenever he has checked that @code{translation} builds successfully. -@node Commits and patches -@subsection Commits and patches - +@node Commits +@subsection Commits @menu * Understanding commits:: -* Making commits:: +* How to make a commit:: * Commit messages:: -* Making patches:: -* Uploading a patch for review:: @end menu @@ -1082,8 +1129,8 @@ branch are available at @uref{http://git.sv.gnu.org/cgit/lilypond.git/log/}. -@node Making commits -@unnumberedsubsubsec Making commits +@node How to make a commit +@unnumberedsubsubsec How to make a commit Once you have modified some source files in your working @@ -1188,21 +1235,41 @@ high-res images, fixed cropping on Finale example. @end example Commit messages often start with a short prefix describing the -general location of the changes. If a commit affects the +general location of the changes. + +@itemize +@item +Doc: and Doc-@var{**}: If a commit affects the documentation in English (or in several languages simultaneously) -the commit message should be prefixed with @qq{Doc:@tie{}}. If -the commit affects only one of the translations, the commit +the commit message should be prefixed with @qq{Doc:@tie{}}. If the +commit affects only one of the translations, the commit message should be prefixed with @qq{Doc-@var{**}:@tie{}}, where -@var{**} is the two-letter language code. Commits that affect the +@var{**} is the two-letter language code. + +@item +Web: and Web-@var{**}: Commits that affect the website should use @qq{Web:@tie{}} for English, and -@qq{Web-@var{**}:@tie{}} for the other languages. Also, changes -to a single file are often prefixed with the name of the file -involved. Visit the links listed in @ref{Understanding commits} -for examples. +@qq{Web-@var{**}:@tie{}} for other languages. +@item +Changes to a single file are often prefixed with the name of the file +involved. +@end itemize + +Visit the links listed in @ref{Understanding commits} for examples. + + + +@node Patches +@subsection Patches + +@menu +* How to make a patch:: +* Emailing patches:: +@end menu -@node Making patches -@unnumberedsubsubsec Making patches +@node How to make a patch +@unnumberedsubsubsec How to make a patch If you want to share your changes with other contributors and developers, you need to generate @emph{patches} from your commits. @@ -1242,90 +1309,48 @@ reviewed, the developers may push one or more of them to the main repository or discuss them with you. -@node Uploading a patch for review -@unnumberedsubsubsec Uploading a patch for review - -Any non-trivial change should be uploaded to our @qq{Rietveld} -code review website: - -@example -@uref{http://codereview.appspot.com/} -@end example - -@subsubheading @command{git-cl} install - -LilyDev users should skip over these @q{install} instructions. - -@enumerate - -@item -Install @command{git-cl} by entering: - -@example -git clone https://github.com/gperciva/git-cl.git -@end example - -If that command fails for some reason, try this instead: - -@example -git clone git://github.com/gperciva/git-cl.git -@end example +@node Emailing patches +@unnumberedsubsubsec Emailing patches -@item -Add the @file{git-cl/} directory to your PATH, -or create a symbolic link to the @command{git-cl} -and @command{upload.py} scripts in one of your PATH -directories (such as @file{$HOME/bin}). +The default @code{x-diff} MIME type associated with patch files +(i.e., files whose name ends in @code{.patch}) means that the +encoding of line endings may be changed from UNIX to DOS format +when they are sent as attachments. Attempting to apply such an +inadvertently altered patch will cause git to fail with a message +about @q{whitespace errors}. -In Ubuntu (and LilyDev), you can add directories to PATH -by adding this line to a hidden file @file{.bashrc}, -located in your home directory: +The solution to such problems is surprisingly simple---just change +the default file extension of patches generated by git to end in +@code{.txt}, for example: @example -PATH=~/type-here-directory-containing-git-cl:"$@{PATH@}" +git config format.suffix '.patch.txt' @end example -@end enumerate - -@subsubheading @command{git-cl} configuration - -LilyDev users should perform these @q{configuration} instructions. - -@enumerate -@item -You must have a google account; please create one if you do not -have one already. +This should cause email programs to apply the correct base64 +encoding to attached patches. -Note that a google account does not need to be a gmail account; you can -use any email address for your google account when you sign up. +If you receive a patch with DOS instead of UNIX line-endings, it +can be converted back using the @code{dos2unix} utility. -@item -Move into the top source directory and then configure @command{git -cl} with the following commands: +Lots of useful information on email complications with patches is +provided on the Wine wiki at +@uref{http://wiki.winehq.org/GitWine}. -@example -cd $LILYPOND_GIT -git cl config -@end example -For the @qq{Rietveld server} question, the default value -(@qq{codereview.appspot.com}) should be accepted by -answering with a newline (CR). +@node Uploading a patch for review +@subsection Uploading a patch for review -The @qq{CC list} question should be answered with: +Any non-trivial change should be uploaded to our @qq{Rietveld} +code review website: @example -lilypond-devel@@gnu.org +@uref{http://codereview.appspot.com/} @end example -The @qq{Tree status URL} value should be left blank. So should -the @qq{ViewVC URL} value, since it is used by @command{git cl -dcommit} which is only for repositories which use @command{git -svn} (LilyPond doesn't). - -@end enumerate - -@subsubheading Uploading patch set +You can upload a patch for review by using our custom @code{git-cl} +@q{helper-script}. This section assumes you have already installed, +updated, and configured @code{git-cl}. See @ref{git-cl}. @warning{Unless you are familiar with branches, only work on one set of changes at once.} @@ -1334,13 +1359,13 @@ There are two methods, depending on your git setup. @itemize @item -@strong{Master branch}: (easy option, and used in @command{lily-git.tcl}) +@strong{Master branch}: (easy option) If you added your patch to @code{master}, then: @example git pull -r -git cl upload origin/master +git-cl upload origin/master @end example @c Mention staging here? @@ -1358,30 +1383,39 @@ option. @item @strong{Separate branch}: (complicated option) -Ensure your changes are committed in a separate branch, which -should differ from the reference branch to be used by just the -changes to be uploaded. If the reference branch is to be -origin/master, ensure this is up-to-date. If necessary, use git -rebase to rebase the branch containing the changes to the head of -origin/master. Finally, check out branch with the changes and -enter the command: +Ensure your changes are committed in a separate branch, which should +differ from the reference branch to be used (usually +@code{origin/master}) by just the changes to be uploaded. Checkout the +branch with the changes: + +@example +git checkout some-branch-with-changes +@end example + +If the reference branch is to be @code{origin/master}, ensure that the +branch containing the changes is up-to-date with it. Use +@command{git rebase} or @command{git pull -r} to rebase the branch to +the head of @code{origin/master}. For example: + +@example +git pull -r origin master +@end example + +Finally, start the upload by entering: @example -git cl upload +git-cl upload @end example @noindent where is the SHA1 ID of the commit to be used as a reference source for the patch. Generally, this will be the -SHA1 ID of origin/master, and in that case the command: +SHA1 ID of origin/master, and in that case you can just use the command: @example -git cl upload origin/master +git-cl upload origin/master @end example -@noindent -can be used. - @end itemize First you will see a terminal editor where you can edit the @@ -1420,23 +1454,25 @@ associate the new branch with an existing Rietveld issue, the following command can be used: @example -git cl issue issue-number +git-cl issue issue-number @end example @noindent where @code{issue-number} is the number of the existing Rietveld issue. -@subsubheading Resetting git cl +@subsubheading Resetting git-cl -If @command{git cl} becomes confused, you can @qq{reset} it by +If @command{git-cl} becomes confused, you can @qq{reset} it by running: @example -git cl issue 0 +git-cl issue 0 @end example -@subsubheading Wait for a countdown + +@node The patch review cycle +@subsection The patch review cycle Your patch will be available for reviews for the next few hours or days. Three times a week, patches with no known problems are @@ -1453,6 +1489,211 @@ Once a patch has @code{patch-push}, it should be sent to your mentor for uploading. If you have git push ability, look at @ref{Pushing to staging}. +@itemize + +@item +Patches get added to the tracker and to Rietveld by the @qq{git-cl} tool, with +a status of @qq{patch-new}. + +@item +The automated tester, Patchy, verifies that the patch can be applied +to current master. By default, it checks that the patch allows @code{make} +and @code{make test} to complete successfully. It can also be configured to +check that @code{make doc} is successful. If it passes, Patchy changes the +status to @qq{patch-review} and emails the developer list. If the patch +fails, Patchy sets it to @qq{patch-needs_work} and notifies the developer list. + +@item +The Patch Meister reviews the tracker periodically, to list patches +which have been on review for at least 24 hours. The list is found at + +@smallexample +@uref{http://code.google.com/p/lilypond/issues/list?can=2&q=label:patch%20patch=review&sort=modified+patch&colspec=ID%20Type%20Status%20Priority%20Owner%20Patch%20Summary%20Modified} +@end smallexample + +@item +For each patch, the Handler reviews any discussion on the tracker +and on Rietveld, to determine whether the patch can go forward. If +there is any indication that a developer thinks the patch is not +ready, the Handler marks it @qq{patch-needs_work} and makes a comment +regarding the reason, referring to the Rietveld item if needed. + +@item +Patches with explicit approval, or at least no negative comment, can +be updated to @qq{patch-countdown}. When saving the tracker item, +clear the @qq{send email} box to prevent sending notification for +each patch. + +@item +The Patch Meister sends an email to the developer list, with a fixed +subject line, to enable filtering by email clients: + +@example +PATCH: Countdown to 20130113 +@end example + +The text of the email sets the deadline for this countdown batch. At +present, batches are done on Tuesday, Thursday and Sunday evenings. + +To create the countdown announcement, use the +@code{make-countdown-announcement.sh} script, which takes the +deadline date, and optionally your name. Follow the instructions +provided: + +@example +cd $LILYPOND_GIT +scripts/auxiliar/make-countdown-announcement.sh "Jan 1, 2001" James +@end example + +The script produces an announcement that is easily readable in all +email clients. Also, whenever a new contributor submits a patch, +you will be prompted to add the new username and author name to +the script itself, and then commit those changes to the main git +repository. + + +@item +On the scheduled countdown day, the Patch Meister reviews the +previous list of patches on countdown, with the same procedure and +criteria as before. Patches with no controversy can be set to +@qq{patch-push} with a courtesy message added to the comment block. + +@item +Roughly at six month intervals, the Patch Meister can list the +patches which have been set to @qq{patch-needs-work} and send the +results to the developer list for review. In most cases, these +patches should be marked @qq{patch-abandoned} but this should come +from the developer if possible. + +@item +As in most organisations of unpaid volunteers, fixed procedures are +useful in as much as they get the job done. In our community, there +is room for senior developers to bypass normal patch handling flows, +particularly now that the testing of patches is largely automated. +Similarly, the minimum age of 24 hours can reasonably be waived if +the patch is minor and from an experienced developer. + + +@end itemize + +@ignore +There is a single Patch Meister, and a number of Patch Helpers +(rename this?). The list of known patches awaiting review is: + +@example +@uref{http://code.google.com/p/lilypond/issues/list?can=2&q=label:patch&sort=patch} +@end example + + +@subheading Helpers: adding patches + +The primary duty is to add patches to the google tracker; we have +a bad track record of losing patches in email. Patches generally +come to the @code{lilypond-devel} mailing list, but are sometimes +sent to @code{bug-lilypond}, @code{lilypond-users}, or +@code{frogs} mailing list instead. + +@itemize +@item +Unless a patch is clearly in response to an existing issue, add a +new issue with the @code{Patch-new} label and a link to the patch +(either on the mailing list archives or the codereview url). + +Issue numbers are cheap; losing developers because they got fed up +with us losing their hard work is expensive. + + +@c if we enter patches immediately, I don't think this is relevant. + +@item +Before adding a patch-reminder issue, do a quick check to see if +it was pushed without sending any email. This can be checked for +searching for relevant terms (from the patch subject or commit +message) on the webgit page: + +@example +@uref{http://git.savannah.gnu.org/gitweb/?p=lilypond.git} +@end example + + +@item +If the patch is clearly in response to an existing issue, then +update that issue with the @code{Patch-new} label and a link to +the patch (either on the mailing list archives or the codereview +url). + +@item +After adding the issue, please send a response email to the same +group(s) that the initial patch was sent to. + +If the initial email was sent to multiple mailing lists (such as +both @code{bugs} and @code{devel}), then reply to all those +mailing lists as well. The email should contain a link to the +issue you just added. + +@end itemize + +@subheading Helpers: @code{Patch-review} label + +The secondary duty is to do make sure that every issue in the +tracker with a @code{Patch-review} label has passed these +@qq{obvious} tests: + +@itemize +@item +Applies automatically to git master. + +It's ok to have offsets, but not conflicts. + +@item +Regtest comparison looks ok; no unexpected changes. + +@item +Descriptive subject line. + +Avoid subjects like @qq{fixes 123}; instead write @qq{Doc: discuss +stacking-dir for BassFigureAlignment (fix 123)}. + +@item +Compiles docs from scratch. Only check this if you have reason to +suspect it might not work. + +@item +(maybe) + +Check code indentation and style. This should be easier post-GOP +when we have a better-defined code style. + +@end itemize + + +@subheading Patch Meister + +The Patch Meister will: + +@itemize + +@item +send @qq{countdown} emails to +@code{lilypond-devel} when patches appear to be ready. + +@item +send general requests to review patches, or even nasty requests to +review patches. + +@item +downgrade patches from @code{Patch-review} to +@code{Patch-needs_work} as appropriate. + +@item +downgrade patches from @code{Patch-needs_work} to +@code{Patch-abandoned} if no actions have been taken in four +weeks. + +@end itemize + +@end ignore + @node Advanced Git procedures @section Advanced Git procedures @@ -1479,7 +1720,6 @@ several Git branches of LilyPond source code is presented. * Working with remote branches:: * Git log:: * Applying remote patches:: -* Sending and receiving patches via email:: * Cleaning up multiple patches:: * Commit access:: * Pushing to staging:: @@ -1733,34 +1973,6 @@ the patch actually @emph{adds}, like a regtest for a fixed bug, would get lost. For the same reason, you should not use the git-independent @samp{patch} program for applying patches. -@node Sending and receiving patches via email -@subsection Sending and receiving patches via email - - -The default @code{x-diff} MIME type associated with patch files -(i.e., files whose name ends in @code{.patch}) means that the -encoding of line endings may be changed from UNIX to DOS format -when they are sent as attachments. Attempting to apply such an -inadvertently altered patch will cause git to fail with a message -about @q{whitespace errors}. - -The solution to such problems is surprisingly simple---just change -the default file extension of patches generated by git to end in -@code{.txt}, for example: - -@example -git config format.suffix '.patch.txt' -@end example - -This should cause email programs to apply the correct base64 -encoding to attached patches. - -If you receive a patch with DOS instead of UNIX line-endings, it -can be converted back using the @code{dos2unix} utility. - -Lots of useful information on email complications with patches is -provided on the Wine wiki at -@uref{http://wiki.winehq.org/GitWine}. @node Cleaning up multiple patches @@ -2076,11 +2288,32 @@ end up in master after all, defeating the purpose of the system. The proper fix usually involves rewriting the staging branch and is best left to core developers after discussion on the developer list. +Before pushing to staging it is a good practice to check whether +staging is ahead of master, and if so, wait until master has caught up +with staging before pushing. This simplifies things if changes to +staging have to be backed out for some reason. To check whether +master has caught up with staging you can look at the git web interface +on savannah, or do: + +@example +git fetch +gitk +@end example + +and check that @code{origin/master} is at the same commit as +@code{origin/staging}. Another option is to see if any commits are +listed when you do: + +@example +git fetch +git log origin/master..origin/staging +@end example + @subsubheading If your work is in a patch file Assuming that your patch is in a file called -@file{0001-my-patch.patch}, and you are currently on git master, -do: +@file{0001-my-patch.patch} (see @ref{Patches}), and you are currently +on git master, do: @example git checkout staging @@ -2098,20 +2331,26 @@ commit ahead of @code{origin/staging}.} @subsubheading If your work is in a branch -If you are working on branches and your work in is +If you are working on branches and your work is in @code{my_branch_name}, then do: @example -git checkout staging -git pull -r -git merge my_branch_name +git checkout my_branch_name +git pull -r origin staging +@end example + +This will rebase your branch on @code{origin/staging}. At this point +git will let you know if there are any conflicts. If so, resolve them +before continuing: + +@example gitk -git push origin staging +git push origin HEAD:staging @end example @warning{Do not skip the @command{gitk} step; a quick 5-second check of the visual history can save a great deal of frustration -later on. You should see that @code{staging} is only ahead of +later on. You should see that @code{my_branch_name} is only ahead of @code{origin/staging} by the commits from your branch.} @@ -2156,9 +2395,7 @@ has, either as a complete file or as a @q{diff} or @q{patch} @subsection Installing git Obtain Git from -@uref{http://code.google.com/p/msysgit/downloads/list} (note, not -msysGit, which is for Git developers and not PortableGit, which is -not a full git installation) and install it. +@uref{https://git-for-windows.github.io/}. Note that most users will not need to install SSH. That is not required until you have been granted direct push permissions to diff --git a/Documentation/contributor/website-work.itexi b/Documentation/contributor/website-work.itexi index 3136c1b144..588d705f1b 100644 --- a/Documentation/contributor/website-work.itexi +++ b/Documentation/contributor/website-work.itexi @@ -291,9 +291,11 @@ shared with people without trusted access to the server. @itemize @item -Install apache2, or any other http server. These instructions +Install Apache (you can use version 2, but keep in mind that the server +hosting lilypond.org runs version 1.3). These instructions assume that you also enable @code{mod_userdir}, and use -@code{$HOME/public_html} as the location. +@code{$HOME/public_html} as DocumentRoot (i.e. the root directory of +the web server). @item Build the online docs and website: @@ -309,16 +311,33 @@ command @code{make WEB_LANGS='' website} or the English and (for example) the French with @code{make WEB_LANGS='fr' website}. @item -Move the built stuff into those directories. It's highly -recommended to have your build dir and www dir on the same -partition. (make @code{$HOME/public_html/} a symlink if -necessary) +Choose the web directory where to copy the built stuff. +If you already have other web projects in your DocumentRoot and don't +need to test the @file{.htaccess} file, you can copy to +@code{~/public_html/lilypond.org}. Otherwise you'd better copy +to @code{~/public_html}. +It's highly recommended to have your build dir and web dir on the +same partition. + +@item +Add the directory for the online documentation: + +@example +mkdir -p ~/public_html/doc/v2.19/ +@end example + +You may want to add also the stable documentation in +@code{~/public_html/doc/v2.18/}, extracting the contents of the html +directory present in the tarball available in @rweb{All}. Just in case +you want to test the redirects to the stable documentation. + +@item +Copy the files with rsync: @example -mv out-website/website/ $HOME/public_html -mv $HOME/public_html/website/pictures $HOME/public_html/ -mkdir -p $HOME/public_html/doc/v2.13/ -mv out-www/online-root/* $HOME/public_html/doc/v2.13/ +rsync -av --delete out-website/website ~/public_html/ +cp out-website/.htaccess ~/public_html +rsync -av --delete out-www/online-root/ ~/public_html/doc/v2.19/ @end example @end itemize @@ -374,5 +393,3 @@ es/Spanish translations, for example). @end itemize - - diff --git a/Documentation/cs/learning.tely b/Documentation/cs/learning.tely index 9d54eea0ae..a40230bf36 100644 --- a/Documentation/cs/learning.tely +++ b/Documentation/cs/learning.tely @@ -19,7 +19,7 @@ Tento soubor poskytuje úvod pro LilyPond verze @c `Learning Manual' was born 1999-10-10 with git commit b9abaac... @macro copyrightDeclare -Autorské právo @copyright{} 1999--2012 autoři. +Autorské právo @copyright{} 1999--2015 autoři. @end macro @set FDL diff --git a/Documentation/cs/learning/common-notation.itely b/Documentation/cs/learning/common-notation.itely index 258e2ce108..077a2b8f06 100644 --- a/Documentation/cs/learning/common-notation.itely +++ b/Documentation/cs/learning/common-notation.itely @@ -8,16 +8,13 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.28" +@c \version "2.19.21" @ignore Tutorial guidelines: -- unless you have a really good reason, use either - @l ilypond[quote,verbatim] - or - @l ilypond[quote,verbatim,fragment,relative=2] +- unless you have a really good reason, use + @lilypond[quote,verbatim] (without spaces) - Don't use any other relative=X commands. - 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 @@ -116,8 +113,8 @@ Je ovšem možné používat název pro @notation{předznamenání} v jiných jazycích. Podívejte se na @ruser{Označení not v jiných jazycích}. -@lilypond[verbatim,quote,relative=2] -cis4 ees fisis, aeses +@lilypond[verbatim,quote] +\relative { cis''4 ees fisis, aeses } @end lilypond @@ -132,11 +129,8 @@ cis4 ees fisis, aeses @cindex Zobrazení a obsah @funindex \key -@funindex key @funindex \major -@funindex major @funindex \minor -@funindex minor Slovníček: @rglos{key signature}, @rglos{major}, @rglos{minor}. @@ -182,9 +176,11 @@ který chcete @emph{slyšet}. V tomto příkladu -@lilypond[verbatim,quote,relative=2] -\key d \major -cis4 d e fis +@lilypond[verbatim,quote] +\relative { + \key d \major + cis''4 d e fis +} @end lilypond @noindent @@ -198,9 +194,11 @@ na prostřední linku notové osnovy.} Přesněji řečeno to znamená: V tónině As Dur @emph{dostane} předznamenání (posuvku): -@lilypond[verbatim,quote,relative=2] -\key aes \major -aes4 c b c +@lilypond[verbatim,quote] +\relative { + \key aes \major + aes'4 c b c +} @end lilypond Zapsat všechna tato předznamenání výslovně, možná znamená o něco @@ -243,7 +241,7 @@ Slovníček: @rglos{tie}. spojit, připojí vlnovka @code{~}. @lilypond[verbatim,quote,relative=2] -g4~ g c2~ | c4~ c8 a~ a2 +g4~ 4 c2~ | 4~ 8 a~ 2 @end lilypond @@ -255,8 +253,8 @@ Slovníček: @rglos{slur}. více not. Jeho počáteční a koncová nota se značí @q{(} popřípadě @q{)}. -@lilypond[verbatim,quote,relative=2] -d4( c16) cis( d e c cis d) e( d4) +@lilypond[verbatim,quote] +\relative { d''4( c16) cis( d e c cis d) e( d4) } @end lilypond @subheading Frázovací obloučky @@ -269,8 +267,8 @@ Obloučky, které označují delší jednotky frázování tak frázovací obloučky, ale nemůže se současně dát více než právě jeden legatový oblouček a jeden frázovací oblouček. -@lilypond[verbatim,quote,relative=2] -g4\( g8( a) b( c) b4\) +@lilypond[verbatim,quote] +\relative { g'4\( g8( a) b( c) b4\) } @end lilypond @sp 1 @@ -287,8 +285,8 @@ Legatové obloučky proti tomu ukazují artikulaci not a mohou být zapsány pro větší skupiny not. Ligatury a legatové obloučky mohou být naskládány do sebe. -@lilypond[verbatim,quote,relative=2] -c4~( c8 d~ d4 e) +@lilypond[verbatim,quote] +\relative { c''4(~ c8 d~ 4 e) } @end lilypond @@ -315,9 +313,11 @@ Slovníček: Běžná @notation{artikulační znaménka} mohou být zadána pomocí doplnění minus (@q{-}) a odpovídajícího znaménka: -@lilypond[verbatim,quote,relative=2] -c4-^ c-+ c-- c-! -c4-> c-. c2-_ +@lilypond[verbatim,quote] +\relative { + c''4-^ c-+ c-- c-! + c4-> c-. c2-_ +} @end lilypond @subheading Prstoklad @@ -332,8 +332,8 @@ Slovníček: @rglos{fingering}. Stejným způsobem lze přidat označení prstokladu tím, že se po minus (@q{-}) zapíše číslo: -@lilypond[verbatim,quote,relative=2] -c4-3 e-5 b-2 a-1 +@lilypond[verbatim,quote] +\relative { c''4-3 e-5 b-2 a-1 } @end lilypond Artikulační znaménka a prstoklady jsou obvykle umísťovány @@ -344,8 +344,8 @@ artikulačních znamének. Většinou ale najde LilyPond sám tu nejlepší možnost, jak se mají artikulační znaménka umístit. -@lilypond[verbatim,quote,relative=2] -c4_-^1 d^. f^4_2-> e^-_+ +@lilypond[verbatim,quote] +\relative { c''4_-^1 d^. f^4_2-> e^-_+ } @end lilypond @subheading Dynamika @@ -362,11 +362,8 @@ c4_-^1 d^. f^4_2-> e^-_+ @funindex \mf @funindex \pp @funindex \< -@funindex < @funindex \> -@funindex > @funindex \! -@funindex ! Slovníček: @rglos{dynamics}, @@ -376,8 +373,8 @@ Slovníček: Dynamika (značky určující hlasitost) se do díla zadává tím, že se k notě připojují značky (s obráceným lomítkem): -@lilypond[verbatim,quote,relative=2] -c4\ff c\mf c\p c\pp +@lilypond[verbatim,quote] +\relative { c''4\ff c\mf c\p c\pp } @end lilypond @notation{Crescendo} a @notation{decrescendo} začínají @@ -386,8 +383,8 @@ případně @code{\>}. Další absolutní značka určující hlasitost, například @code{\f}, (de)crescendo ukončuje. Může se přesně ukončit i příkazem @code{\!}. -@lilypond[verbatim,quote,relative=2] -c4\< c\ff\> c c\! +@lilypond[verbatim,quote] +\relative { c''4\< c\ff\> c c\! } @end lilypond @@ -413,16 +410,16 @@ Doporučení pro notový zápis: Text můžete do notového zápisu vložit následujícím způsobem: -@lilypond[verbatim,quote,relative=2] -c2^"espr" a_"legato" +@lilypond[verbatim,quote,fragment] +c''2^"espr" a'_"legato" @end lilypond Dodatečné formátování lze nasadit, když použijete příkaz @code{\markup}: -@lilypond[verbatim,quote,relative=2] -c2^\markup { \bold espr } -a2_\markup { +@lilypond[verbatim,quote,fragment] +c''2^\markup { \bold espr } +a'2_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } @end lilypond @@ -446,14 +443,12 @@ Doporučení pro notový zápis: @funindex [ @funindex ] @funindex \autoBeamOff -@funindex autoBeamOff @funindex \autoBeamOn -@funindex autoBeamOn Všechny @notation{trámce} se zapisují automaticky: -@lilypond[verbatim,quote,relative=2] -a8 ais d ees r d c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8 ais d ees r d c16 b a8 } @end lilypond @noindent @@ -463,8 +458,8 @@ jen jeden trámec, dostane nota, na níž trámec začíná @q{[} (AltGr+8), a ta, na níž má končit, dostane @q{]} (AltGr+9). -@lilypond[verbatim,quote,relative=2] -a8[ ais] d[ ees r d] c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8[ ais] d[ ees r d] c16 b a8 } @end lilypond Když chcete automatické trámce vypnout úplně nebo @@ -472,11 +467,13 @@ pro delší část, používáte příkaz @code{\autoBeamOff}, abyste trámce vypnul, a @code{\autoBeamOn}, abyste je opět zapnul. -@lilypond[verbatim,quote,relative=2] -\autoBeamOff -a8 c b4 d8. c16 b4 | -\autoBeamOn -a8 c b4 d8. c16 b4 | +@lilypond[verbatim,quote] +\relative { + \autoBeamOff + a'8 c b4 d8. c16 b4 | + \autoBeamOn + a8 c b4 d8. c16 b4 | +} @end lilypond @@ -494,15 +491,16 @@ Doporučení pro notový zápis: @cindex Předtaktí @funindex \partial -@funindex partial @notation{Předtaktí} se zadává příkazem @code{\partial}. Potom následuje délka předtaktí: @code{\partial 4} znamená jednu čtvrťovou notu předtaktí a @code{\partial 8} jednu osminovou notu. -@lilypond[verbatim,quote,relative=2] -\partial 8 f8 | -c2 d | +@lilypond[verbatim,quote] +\relative { + \partial 8 f''8 | + c2 d | +} @end lilypond @@ -513,7 +511,6 @@ c2 d | @cindex Rytmická rozdělení @funindex \times -@funindex times Slovníček: @rglos{note value}, @rglos{triplet}. @@ -524,11 +521,13 @@ Trvání not se zlomkem znásobuje. V jedné triole trvají noty 2/3 jejich zapsané délky, takže triola má 2/3 jako svůj zlomek: -@lilypond[verbatim,quote,relative=2] -\tuplet 3/2 { f8 g a } -\tuplet 3/2 { c8 r c } -\tuplet 3/2 { f,8 g16[ a g a] } -\tuplet 3/2 { d4 a8 } +@lilypond[verbatim,quote] +\relative { + \tuplet 3/2 { f''8 g a } + \tuplet 3/2 { c8 r c } + \tuplet 3/2 { f,8 g16[ a g a] } + \tuplet 3/2 { d4 a8 } +} @end lilypond @subheading Ozdoby @@ -538,9 +537,7 @@ takže triola má 2/3 jako svůj zlomek: @cindex Prodleva @funindex \grace -@funindex grace @funindex \acciaccatura -@funindex acciaccatura @funindex \appoggiatura @funindex acciaccatura @@ -549,12 +546,14 @@ Slovníček: @rglos{grace notes}, @rglos{acciaccatura}, Melodické ozdoby se zadávají příkazem @code{\grace}, ačkoli se také dají vytvářet uvozením hudebního výrazu příkazem @code{\appoggiatura} (dlouhý -příraz, prodleva) a @code{\acciaccatura} (příraz, krátká appogiatura). +příraz, prodleva) a @code{\acciaccatura} (příraz, krátká appoggiatura). -@lilypond[verbatim,quote,relative=2] -c2 \grace { a32 b } c2 | -c2 \appoggiatura b16 c2 | -c2 \acciaccatura b16 c2 | +@lilypond[verbatim,quote] +\relative { + c''2 \grace { a32 b } c2 | + c2 \appoggiatura b16 c2 | + c2 \acciaccatura b16 c2 | +} @end lilypond @@ -600,8 +599,8 @@ Ve zdrojových souborech LilyPondu se hudba znázorňuje pomocí @emph{hudebních výrazů}. Jedna nota je jedním hudebním výrazem. -@lilypond[verbatim,quote,relative=2] -a4 +@lilypond[verbatim,quote,fragment] +a'4 @end lilypond Skupina not uvnitř závorek tvoří nový výraz. @@ -609,8 +608,8 @@ Tento je nyní @emph{složeným hudebním výrazem}. Zde byl jeden takový složený hudební výraz se dvěmi notami vytvořen: -@lilypond[verbatim,quote,relative=2] -{ a4 g4 } +@lilypond[verbatim,quote] +\relative { a'4 g4 } @end lilypond Když je skupina hudebních výrazů (například not) @@ -618,8 +617,8 @@ zapsána do složených závorek, znamená to, že jsou seřazeny v řadě (tj. každý následuje po předchozím). Výsledkem je další hudební výraz. -@lilypond[verbatim,quote,relative=2] -{ { a4 g } f4 g } +@lilypond[verbatim,quote] +\relative { { a'4 g } f4 g } @end lilypond @@ -680,13 +679,11 @@ Souběžně jsou hudební výrazy spojeny tak, že jsou uzavřeny uvnitř tři výrazy (každý obsahuje dvě oddělené noty): @lilypond[verbatim,quote] -\relative c'' { - << - { a2 g } - { f2 e } - { d2 b } - >> -} +<< + \relative { a'2 g } + \relative { f'2 e } + \relative { d'2 b } +>> @end lilypond Ještě je třeba poznamenat, že jsme zde pro každou úroveň uvnitř @@ -711,8 +708,8 @@ příklad začíná jednou notou: @lilypond[verbatim,quote] -\relative c'' { - c2 <> | +\relative { + c''2 <> | << { e f } { c <> } >> | } @end lilypond @@ -728,10 +725,8 @@ příklad začíná jednou notou: @cindex Prostředí notového zápisu @funindex \new Staff -@funindex new Staff @funindex Staff @funindex \new -@funindex new @funindex Score @funindex Voice @funindex Lyrics @@ -750,12 +745,10 @@ osnovu) jsou potom uspořádány souběžně se znaky @code{<<} a @code{>>}: @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond Příkaz @code{\new} začíná nové @qq{prostředí notového zápisu}. @@ -787,12 +780,10 @@ notové zápisy s rozdílnými druhy taktů. @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" \key d \major \time 3/4 c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" \key d \major \time 3/4 c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond @@ -835,12 +826,10 @@ nyní vložen do prostředí @code{PianoStaff}. Zde je jeden malý příklad: @lilypond[verbatim,quote] -\relative c'' { - \new PianoStaff << - \new Staff { \time 2/4 c4 e | g g, | } - \new Staff { \clef "bass" c,,4 c' | e c | } - >> -} +\new PianoStaff << + \new Staff \relative { \time 2/4 c''4 e | g g, | } + \new Staff \relative { \clef "bass" c4 c' | e c | } +>> @end lilypond Jiné typické skupiny notových osnov je možné vytvořit příkazy @@ -881,8 +870,8 @@ Dávejte pozor si na to, že všechny noty jednoho akordu musejí mít stejnou dobu trvání a že tato doba trvání se zapisuje po uzavírajících závorkách. -@lilypond[verbatim,quote,relative=2] -r4 2 +@lilypond[verbatim,quote] +\relative { r4 2 } @end lilypond Akordy jsou v základě rovnocenné s jednoduchými notami: @@ -938,7 +927,6 @@ Doporučení pro notový zápis: @cindex Text písně, zápis @funindex \addlyrics -@funindex addlyrics V této kapitole je laskavý čtenář uveden do spojení not s textem a je ukázáno, jak se vytváří jednodušší listy s písničkami. @@ -959,7 +947,6 @@ a je ukázáno, jak se vytváří jednodušší listy s písničkami. @cindex Text písně @funindex \addlyrics -@funindex addlyrics Slovníček: @rglos{lyrics}. @@ -967,10 +954,10 @@ Zde je začátek jednoduché dětské písně, @notation{Dívky a chlapci jdou ven, aby si hráli}: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } @end lilypond @@ -981,10 +968,10 @@ se zadá tak, že každá slabika je oddělena prázdným znakem. @c KEEP LY @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } \addlyrics { Dívky a chlapci jdou | ven, aby si hráli, @@ -1026,10 +1013,10 @@ takto: @c KEEP LY @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c b a | d4 b8 g4. | } \addlyrics { @@ -1043,10 +1030,10 @@ V anglickém originále je to: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c[ b] a | d4 b8 g4. | } \addlyrics { @@ -1080,10 +1067,10 @@ podrobnosti se podívejte v části @ref{Ligatury a legatové obloučky}. @c KEEP LY @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c( b) a | d4 b8 g4. | } \addlyrics { @@ -1103,10 +1090,10 @@ Na podrobnosti se podívejte v části @ref{Automatické a ruční trámce}. @c KEEP LY @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c([ b]) a | d4 b8 g4. | } \addlyrics { @@ -1123,10 +1110,10 @@ podtržítko @code{_}: @c KEEP LY @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c[ b] a | d4 b8 g4. | } \addlyrics { @@ -1147,10 +1134,10 @@ jsem | položen __ na | zemi.}: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \minor \time 3/2 - g2 a bes | bes2( a) b2 | + g'2 a bes | bes2( a) b2 | c4.( bes8 a4. g8 fis4.) g8 | fis1 } \addlyrics { @@ -1173,11 +1160,11 @@ jimiž lze vyrovnat text s notami: @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \key g \major \time 3/4 \partial 4 - d4 | g4 g a8( b) | g4 g b8( c) | + d'4 | g4 g a8( b) | g4 g b8( c) | d4 d e | c2 } \addlyrics { @@ -1201,11 +1188,11 @@ ve Figarově árii @notation{Largo al factotum}. @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \clef "bass" \key c \major \time 6/8 - c4.~ c8 d b | c8([ d]) b c d b | c8 + c'4.~ 8 d b | c8([ d]) b c d b | c8 } \addlyrics { Lar -- go_al fac -- | to -- tum del -- la cit -- | tà @@ -1232,20 +1219,20 @@ Händelova díla @notation{Judas Maccabeus}: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key f \major \time 6/8 \partial 8 - c8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ c4 + c''8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ 4 } \addlyrics { Let | flee -- cy flocks the | hills a -- | dorn, __ } - \relative c' { + \relative { \key f \major \time 6/8 \partial 8 - r8 | r4. r4 c8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 + r8 | r4. r4 c'8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 } \addlyrics { Let | flee -- cy flocks the | hills a -- dorn, @@ -1312,13 +1299,13 @@ později tím, že se před ně zapíše obrácené lomítko @lilypond[verbatim,quote] violin = \new Staff { - \relative c'' { - a4 b c b + \relative { + a'4 b c b } } cello = \new Staff { - \relative c { + \relative { \clef "bass" e2 d } @@ -1387,7 +1374,6 @@ právě vymezené značky: @cindex Úvodní stránka @funindex \header -@funindex header Název, skladatel, číslo opusu a podobné údaje se vkládají do prostředí @code{\header}. Toto prostředí se nachází mimo @@ -1476,10 +1462,10 @@ možným zdrojem chyb. Pomocí příkazu @code{\relative} je tento příklad mnohem jednodušeji čitelný: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key a \major \time 6/8 - cis8. d16 cis8 e4 e8 | + cis''8. d16 cis8 e4 e8 | b8. cis16 b8 d4 d8 | } @end lilypond diff --git a/Documentation/cs/learning/fundamental.itely b/Documentation/cs/learning/fundamental.itely index 2f8cc035d2..4efdc777bc 100644 --- a/Documentation/cs/learning/fundamental.itely +++ b/Documentation/cs/learning/fundamental.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.29" +@c \version "2.19.22" @c Translators: Pavel Fric @node Základní pojmy @@ -63,8 +63,8 @@ tak notová sazba vypadá zřídka, když se tento příkaz vynechá. @lilypond[quote,fragment,ragged-right,verbatim] -\relative c'' { - c4 a b c +\relative { + c''4 a b c } @end lilypond @@ -119,8 +119,8 @@ stavbu. Podívejme se na jeden takový jednoduchý příklad: @example -\relative c'' @{ - c4 a d c +\relative @{ + c''4 a d c @} @end example @@ -135,8 +135,8 @@ takové soubory daly napsat a také správně zapsat, znamená \score @{ \new Staff @{ \new Voice @{ - \relative c'' @{ - c4 a b c + \relative @{ + c''4 a b c @} @} @} @@ -235,7 +235,6 @@ notace -- @ruser{Rozvržení notového zápisu} a @cindex Prostředí book, skryté @cindex Skryté prostředí book @funindex \book -@funindex book Váš LilyPondovský kód může obsahovat více bloků @code{\score}. Každý z nich je vykládán jako samostatný notový zápis, ovšem @@ -277,8 +276,8 @@ jak je to také ukázáno v @ref{Pořádání děl pomocí proměnných}. Všechny předlohy používají tuto možnost: @example -melodie = \relative c' @{ - c4 a b c +melodie = \relative @{ + c'4 a b c @} \score @{ @@ -310,7 +309,6 @@ tato omezení popsána v části @ruser{Stavba souboru}. @translationof Score is a (single) compound musical expression @funindex \score -@funindex score @cindex score @cindex Notový zápis @cindex Hudební kus @@ -410,8 +408,8 @@ složených závorek vedle @code{\new Voice = "Zpěvní hlas"} bychom mohli zapisovat @example -\relative c'' @{ - r4 d8\noBeam g, c4 r +\relative @{ + r4 d''8\noBeam g, c4 r @} @end example @@ -433,10 +431,10 @@ Takže nyní máme, když přidáme několik not a basový klíč pro levou ruku, následující příklad: @lilypond[verbatim,quote,ragged-right] -melody = \relative c'' { r4 d8\noBeam g, c4 r } +melody = \relative { r4 d''8\noBeam g, c4 r } text = \lyricmode { And God said, } -upper = \relative c'' { 2~ } -lower = \relative c { b2 e } +upper = \relative { 2~ } +lower = \relative { b,2 e } \score { << @@ -485,8 +483,8 @@ jen pro dobu trvání tří not: @lilypond[verbatim,quote,ragged-right] \new Staff { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -513,8 +511,8 @@ osnovu: @lilypond[verbatim,quote,ragged-right] \new Staff = "main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -678,9 +676,11 @@ Jeden hlas přirozeně může v jednom akordu obsahovat více not -- takže kdy přesně je potřeba více hlasů? Podívejme se nejprve na tento příklad se čtyřmi akordy: -@lilypond[quote,verbatim,ragged-right,relative=1] -\key g \major -4 +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + 4 +} @end lilypond To lze vyjádřit tak, že se pro ukázání akordů použijí jednoduché špičaté @@ -714,10 +714,12 @@ vícehlasá. Takto to vypadá, když jsou akordy rozděleny do dvou hlasů a k průchodnému tónu je ještě přidán legatový oblouček: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key g \major -% Voice "1" Voice "2" -<< { g4 fis8( g) a4 g } \\ { d4 d d d } >> +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + % Voice = "1" Voice = "2" + << { g'4 fis8( g) a4 g } \\ { d4 d d d } >> +} @end lilypond Všimněte si, že nožičky druhého hlasu nyní ukazují dolů. @@ -726,7 +728,7 @@ Tady je jiný jednoduchý příklad: @lilypond[quote,verbatim,ragged-right,relative=2] \key d \minor -% Voice "1" Voice "2" +% Voice = "1" Voice = "2" << { r4 g g4. a8 } \\ { d,2 d4 g } >> << { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> << { a2. r4 } \\ { fis2. s4 } >> @@ -738,19 +740,20 @@ zdrojový soubor udělat čitelnějším, ale když se v jednom taktu vyskytuje mnoho not, může být lepší napsat každý hlas odděleně, jako zde: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key d \minor -<< { - % Voice "1" - r4 g g4. a8 | - bes4 bes c bes | - a2. r4 | -} \\ { - % Voice "2" - d,2 d4 g | - g4 g g8( a) g4 | - fis2. s4 | -} >> +@lilypond[quote,verbatim,ragged-right] +<< + \key d \minor + \relative { % Voice = "1" + r4 g' g4. a8 | + bes4 bes c bes | + a2. r4 | + } \\ + \relative { % Voice = "2" + d'2 d4 g | + g4 g g8( a) g4 | + fis2. s4 | + } +>> @end lilypond Tento příklad má jen dva hlasy, ale stejné stavby lze použít, @@ -762,12 +765,12 @@ z těchto prostředí je nastaven svislý směr nožiček, legatových obloučk ligatur, značek pro dynamiku atd. tak, jak se patří. @lilypond[quote,verbatim] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f - % Voice "1" Voice "2" Voice "3" + c'16 d e f + % Voice = "1" Voice = "2" Voice = "3" << { g4 f e } \\ { r8 e4 d c8~ } >> | - << { d2 e } \\ { c8 b16 a b8 g~ g2 } \\ { s4 b c2 } >> | + << { d2 e } \\ { c8 b16 a b8 g~ 2 } \\ { s4 b c2 } >> | } @end lilypond @@ -786,9 +789,9 @@ Všimněte si také, že spojené noty mohou být rozděleny přes stejný hlas do dvou staveb, jak je to ukázáno zde na modrém trojúhelníkovém hlase. @lilypond[quote,verbatim] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f + c'16 d e f << % Bar 1 { \voiceOneStyle @@ -805,7 +808,7 @@ do dvou staveb, jak je to ukázáno zde na modrém trojúhelníkovém hlase. { d2 e } \\ % Voice 2 continues - { c8 b16 a b8 g~ g2 } + { c8 b16 a b8 g~ 2 } \\ { \voiceThreeStyle @@ -878,10 +881,10 @@ a hlasy. Složitější věci budou vysvětleny v pozdějších částech. @c The following should appear as music without code @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << % Voice one - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ % Voice two { aes2 f4 fes } \\ % No voice three @@ -922,12 +925,12 @@ porozumět. @c The following should appear as music without code @c The three voice styles should be defined in -init @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << { % Voice one \voiceOneStyle - c2 aes4. bes8 + c''2 aes4. bes8 } \\ % Voice two { \voiceTwoStyle @@ -953,10 +956,10 @@ se to naučili, pomocí konstrukcí @code{<< \\ >>}, kterou zapíšeme tři hlasy prvního taktu: @lilypond[quote,verbatim,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } \\ { aes2 f4 fes } \\ { 2 des } + { c''2 aes4. bes8 } \\ { aes2 f4 fes } \\ { 2 des } >> | 1 | } @@ -978,10 +981,10 @@ umístíme do čtvrtého hlasu. To se udělá jednoduše přidáním páru @code{\\}. @lilypond[quote,verbatim,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << % Voice one - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ % Voice two { aes2 f4 fes } \\ % Omit Voice three @@ -1017,15 +1020,10 @@ Notace: @ruser{Více hlasů}. @translationof Explicitly instantiating voices @funindex \voiceOne -@funindex voiceOne @funindex \voiceTwo -@funindex voiceTwo @funindex \voiceThree -@funindex voiceThree @funindex \voiceFour -@funindex voiceFour @funindex \oneVoice -@funindex oneVoice @funindex \new Voice @cindex Vytvoření prostředí hlasu @cindex Prostředí hlasu, vytvoření @@ -1043,8 +1041,8 @@ Stavba @code{<< \\ >>}, kterou jsme použili v předchozím @example \new Staff @{ - \relative c' @{ - << @{ e4 f g a @} \\ @{ c,4 d e f @} >> + \relative @{ + << @{ e'4 f g a @} \\ @{ c,4 d e f @} >> @} @} @end example @@ -1054,8 +1052,8 @@ ist identisch mit @example \new Staff << - \new Voice = "1" @{ \voiceOne \relative c' @{ e4 f g a @} @} - \new Voice = "2" @{ \voiceTwo \relative c' @{ c4 d e f @} @} + \new Voice = "1" @{ \voiceOne \relative @{ e'4 f g a @} @} + \new Voice = "2" @{ \voiceTwo \relative @{ c'4 d e f @} @} >> @end example @@ -1064,8 +1062,8 @@ Obojí výše by vytvořilo následující notový obraz: @c The following example should not display the code @lilypond[ragged-right,quote] \new Staff << - \new Voice = "1" { \voiceOne \relative c' { e4 f g a } } - \new Voice = "2" { \voiceTwo \relative c' { c4 d e f } } + \new Voice = "1" { \voiceOne \relative { e'4 f g a } } + \new Voice = "2" { \voiceTwo \relative { c'4 d e f } } >> @end lilypond @@ -1086,27 +1084,27 @@ mají příkazy @code{\oneVoice}, @code{\voiceOne} a @code{voiceTwo} účinek na text, obloučky a označení dynamiky: @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { % Default behavior or behavior after \oneVoice - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceOne - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceTwo - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @@ -1122,10 +1120,10 @@ tvaru červeného diamantu ukazují, že se hlavní hlas nachází v prostředí jednotlivého hlasu. Tím se může frázovací oblouček malovat nad ně. @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { +\new Staff \relative { \voiceOneStyle % The following notes are monophonic - c16^( d e f + c'16^( d e f % Start simultaneous section of three voices << % Continue the main voice in parallel @@ -1134,7 +1132,7 @@ jednotlivého hlasu. Tím se může frázovací oblouček malovat nad ně. \new Voice { % Set stems, etc., down \voiceTwo - r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1159,15 +1157,15 @@ hlas objeví jen krátce, může to být přirozenější způsob sázení not: @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { - c16^( d e f +\new Staff \relative { + c'16^( d e f << { g4 f e | d2 e2) | } \new Voice { \voiceTwo r8 e4 d c8~ << - { c8 b16 a b8 g~ g2 | } + { c8 b16 a b8 g~ 2 | } \new Voice { \voiceThree s4 b4 c2 | @@ -1189,17 +1187,17 @@ se dají místa, kde se hlas nevyskytuje, přeskočit pomocí neviditelných not jako je tomu zde: @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' << +\new Staff \relative << % Initiate first voice \new Voice { \voiceOne - c16^( d e f g4 f e | d2 e) | + c'16^( d e f g4 f e | d2 e) | } % Initiate second voice \new Voice { % Set stems, etc, down \voiceTwo - s4 r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + s4 r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1272,7 +1270,6 @@ Pozor: Textu písně se v angličtině říká @qq{lyrics}. @funindex \new Lyrics @funindex \lyricsto -@funindex lyricsto @funindex Lyrics @cindex Prostředí text písně, vytvoření @cindex Text písně, spojení s notami @@ -1287,10 +1284,10 @@ se použije označení přiřazené hlasu. @lilypond[quote,verbatim] << \new Voice = "one" { - \relative c'' { + \relative { \autoBeamOff \time 2/4 - c4 b8. a16 | g4. f8 | e4 d | c2 | + c''4 b8. a16 | g4. f8 | e4 d | c2 | } } \new Lyrics \lyricsto "one" { @@ -1308,7 +1305,6 @@ a hlasu @code{Voice}, aby všechno fungovalo. @cindex Text a trámce @cindex Trámce a text @funindex \autoBeamOff -@funindex autoBeamOff Automatické trámce, jež LilyPond používá ve výchozím nastavení, pracují dobře pro instrumentální hudbu, ale ne tak dobře v případě hudby s textem, @@ -1334,14 +1330,14 @@ ne jako noty. @lilypond[quote,verbatim] global = { \key f \major \time 6/8 \partial 8 } -SopOneMusic = \relative c'' { - c8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ c4 +SopOneMusic = \relative { + c''8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ 4 } SopOneLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, __ } -SopTwoMusic = \relative c' { - r8 | r4. r4 c8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' +SopTwoMusic = \relative { + r8 | r4. r4 c'8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' } SopTwoLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, @@ -1395,10 +1391,10 @@ tóninu. Taková proměnná se často označuje @qq{global}. @lilypond[quote,verbatim] keyTime = { \key c \major \time 4/4 \partial 4 } -SopMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyricmode { E -- | ter -- nal fa -- ther, | strong to save, } @@ -1463,8 +1459,8 @@ hinzugefügt werden, die im Quellcode gar nicht explizit vorkommen. Vergleichen Sie etwa den Quellcode und die Notenausgabe des folgenden Beispiels: -@lilypond[quote,verbatim,relative=2] -cis4 cis2. | a4 a2. | +@lilypond[quote,verbatim] +\relative { cis''4 cis2. | a4 a2. | } @end lilypond Der Quellcode ist sehr kurz und knapp, während in der @@ -1546,7 +1542,6 @@ Notationreferenz: @ruser{Vysvětlení prostředí}. @translationof Creating contexts @funindex \new -@funindex new @cindex Neue Kontexte @cindex Erstellen von Kontexten @cindex Kontexte, Erstellen @@ -1598,8 +1593,8 @@ werden, hier ein kommentiertes Beispiel aus dem richtigen Leben: \clef "treble" \key g \minor \new Voice { % create voice for RH notes - \relative c'' { % start of RH notes - d4 ees16 c8. + \relative { % start of RH notes + d''4 ees16 c8. d4 ees16 c8. } % end of RH notes } % end of RH voice @@ -1609,14 +1604,14 @@ werden, hier ein kommentiertes Beispiel aus dem richtigen Leben: \key g \minor \new Voice { % create LH voice one \voiceOne - \relative g { % start of LH voice one notes + \relative { % start of LH voice one notes g8 ees, g8 ees, } % end of LH voice one notes } % end of LH voice one \new Voice { % create LH voice two \voiceTwo - \relative g { % start of LH voice two notes + \relative { % start of LH voice two notes g4 ees g4 ees } % end of LH voice two notes @@ -1866,13 +1861,13 @@ nicht, weil der Kontext ausgelassen wurde. @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { + \new Staff \relative { \set Staff.instrumentName = #"Soprano" - c2 c + c''2 c } - \new Staff \relative c' { + \new Staff \relative { \set instrumentName = #"Alto" % Wrong! - d2 d + d'2 d } >> @end lilypond @@ -1914,12 +1909,12 @@ ausgeschaltet sind: @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - ais2 aes + \new Staff \relative { + ais'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Staff.extraNatural = ##f - ais2 aes + ais'2 aes } >> @end lilypond @@ -1929,12 +1924,12 @@ während das dazu dient, sie in allen Systemen auszuschalten: @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - ais2 aes + \new Staff \relative { + ais'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Score.extraNatural = ##f - ais2 aes + ais'2 aes } >> @end lilypond @@ -1958,17 +1953,19 @@ wir als Beispiel, die Schriftgröße mehrmals zu ändern, was sich unter anderem auf die Notenköpfe auswirkt. Die Änderung bezieht sich immer auf den Standard, nicht vom letzten gesetzten Wert. -@lilypond[quote,verbatim,ragged-right,relative=1] -c4 d -% make note heads smaller -\set fontSize = #-4 -e4 f | -% make note heads larger -\set fontSize = #2.5 -g4 a -% return to default size -\unset fontSize -b4 c | +@lilypond[quote,verbatim,ragged-right] +\relative { + c'4 d + % make note heads smaller + \set fontSize = #-4 + e4 f | + % make note heads larger + \set fontSize = #2.5 + g4 a + % return to default size + \unset fontSize + b4 c | +} @end lilypond Wir haben jetzt gesehen, wie sich die Werte von unterschiedlichen @@ -1984,7 +1981,6 @@ eingegeben werden kann. @subsubheading Kontexteigenschaften mit @code{\with} setzen @funindex \with -@funindex with @cindex Kontexteigenschaft, setzen mit \with Die Standardwerte von Kontexteigenschaften können zu dem Zeitpunkt @@ -2007,12 +2003,12 @@ etwa so: @lilypond[quote,verbatim,ragged-right] << \new Staff - \relative c'' { - gis4 ges aes ais + \relative { + gis'4 ges aes ais } \new Staff \with { extraNatural = ##f } { - \relative c'' { - gis ges aes ais + \relative { + gis' ges aes ais } } >> @@ -2037,7 +2033,6 @@ wird, kann dieser neue Standardwert mit dem Befehl @cindex Kontexteigenschaften, mit \context setzen @cindex Eigenschaften von Kontexten, mit \context setzen @funindex \context -@funindex context Die Werte von Kontext-Eigenschaften können in @emph{allen} Kontexten eines bestimmten Typs (etwa alle @code{Staff}-Kontexte) @@ -2056,8 +2051,8 @@ Funktion anwendet: @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - cis4 e d ces + \relative { + cis''4 e d ces } } \layout { @@ -2076,13 +2071,13 @@ Wenn die Veränderung der Eigenschaft sich auf alle Systeme einer \score { << \new Staff { - \relative c'' { - gis4 ges aes ais + \relative { + gis'4 ges aes ais } } \new Staff { - \relative c'' { - gis4 ges aes ais + \relative { + gis'4 ges aes ais } } >> @@ -2151,8 +2146,8 @@ erstellt werden. \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c' { - c4 d +\relative { + c'4 d \set fontSize = #-4 % make note heads smaller e4 f | \set fontSize = #2.5 % make note heads larger @@ -2187,15 +2182,15 @@ und zeigt ihn an: \new Voice \with { \consists "Ambitus_engraver" } { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @@ -2212,15 +2207,15 @@ Stimmen in diesem Notensystem errechnet: } << \new Voice { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @@ -2244,24 +2239,24 @@ mit vier Systemen anzeigen wollen, könnte das so aussehen: \score { << \new Staff { - \relative c'' { - c4 a b g + \relative { + c''4 a b g } } \new Staff { - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "G_8" - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "bass" - \relative c { + \relative { c4 a b g } } @@ -2331,7 +2326,7 @@ Fall könnten Sie mit der Vorlage @qq{Noten und Text} @example \version @w{"@version{}"} -melody = \relative c' @{ +melody = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2361,7 +2356,7 @@ Beispiel @qq{Nur Noten} an: @example \version @w{"@version{}"} -melody = \relative c' @{ +melody = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2405,7 +2400,7 @@ Wir ändern auch die Noten etwas ab. @example \version @w{"@version{}"} -SopranNoten = \relative c' @{ +SopranNoten = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2416,7 +2411,7 @@ SoprText = \lyricmode @{ Aaa Bee Cee Dee @} -CelloNoten = \relative c @{ +CelloNoten = \relative @{ \clef "bass" \key c \major \time 4/4 @@ -2478,7 +2473,7 @@ nicht mehr. Das können wir aber schnell in Ordnung bringen. Hier also die gesamte Vorlage für Soprán a violoncello: @lilypond[quote,verbatim,ragged-right,addversion] -sopranoMusic = \relative c' { +sopranoMusic = \relative { \clef "treble" \key c \major \time 4/4 @@ -2489,7 +2484,7 @@ sopranoLyrics = \lyricmode { Aaa Bee Cee Dee } -celloMusic = \relative c { +celloMusic = \relative { \clef "bass" \key c \major \time 4/4 @@ -2539,39 +2534,39 @@ notiert wird. Hier ein Beispiel aus Händels @notation{Messias}: @lilypond[quote,ragged-right] global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis e2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis e2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4 2 4 + r4 2 4 4. 8 2 4 2 } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 + 4 2 4 4. 8 2 4 2 } @@ -2777,39 +2772,39 @@ global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis fis2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis fis2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4 2 4 + r4 2 4 4. 8 2 4 2 } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 + 4 2 4 4. 8 2 4 2 } @@ -3132,20 +3127,20 @@ die Variablen mit einem Backslash in die Partitur einbauen. composer = "J S Bach" } keyTime = { \key c \minor \time 4/4 } -ManualOneVoiceOneMusic = \relative g' { - g4 g f ees | +ManualOneVoiceOneMusic = \relative { + g'4 g f ees | d2 c2 | } -ManualOneVoiceTwoMusic = \relative c' { - ees16 d ees8~ ees16 f ees d c8 d~ d c~ | - c8 c4 b8 c8. g16 c b c d | +ManualOneVoiceTwoMusic = \relative { + ees'16 d ees8~ 16 f ees d c8 d~ d c~ | + 8 c4 b8 c8. g16 c b c d | } -ManualTwoMusic = \relative c' { - c16 b c8~ c16 b c g a8 g~ g16 g aes ees | - f16 ees f d g aes g f ees d e8~ ees16 f ees d | +ManualTwoMusic = \relative { + c'16 b c8~ 16 b c g a8 g~ 16 g aes ees | + f16 ees f d g aes g f ees d e8~ 8es16 f ees d | } -PedalOrganMusic = \relative c { - r8 c16 d ees d ees8~ ees16 a, b g c b c8 | +PedalOrganMusic = \relative { + r8 c16 d ees d ees8~ 16 a, b g c b c8 | r16 g ees f g f g8 c,2 | } @@ -3199,7 +3194,7 @@ Glossar: Bis jetzt wurde immer derartige Notation vorgestellt: @lilypond[quote,verbatim,ragged-right] -hornNotes = \relative c'' { c4 b dis c } +hornNotes = \relative { c''4 b dis c } \score { { @@ -3212,8 +3207,8 @@ Sie können sich vorstellen, dass das etwa für minimalistische Musik sehr nützlich sein könnte: @lilypond[quote,verbatim,ragged-right] -fragmentA = \relative c'' { a4 a8. b16 } -fragmentB = \relative c'' { a8. gis16 ees4 } +fragmentA = \relative { a'4 a8. b16 } +fragmentB = \relative { a'8. gis16 ees4 } violin = \new Staff { \fragmentA \fragmentA | \fragmentB \fragmentA | @@ -3238,9 +3233,9 @@ fthenp=_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 dynamic p } -violin = \relative c'' { +violin = \relative { \repeat volta 2 { - c4._\dolce b8 a8 g a b + c''4._\dolce b8 a8 g a b \padText c4.^"hi there!" d8 e' f g d c,4.\fthenp b8 c4 c-. @@ -3262,9 +3257,9 @@ vorige Beispiel ohne jede Benutzung von Variablen. Es ist sehr viel schwerer lesbar, besonders die letzte Zeile. @example -violin = \relative c'' @{ +violin = \relative @{ \repeat volta 2 @{ - c4._\markup @{ \italic \bold dolce @} b8 a8 g a b + c''4._\markup @{ \italic \bold dolce @} b8 a8 g a b \once \override TextScript.padding = #5.0 c4.^"hi there!" d8 e' f g d c,4.\markup @{ @@ -3289,14 +3284,14 @@ kann sie sich als Funktionen vorstellen. @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function - (parser location padding) + (padding) (number?) #{ \once \override TextScript.padding = $padding #}) -\relative c''' { - c4^"piu mosso" b a b | +\relative { + c'''4^"piu mosso" b a b | \padText #1.8 c4^"piu mosso" d e f | \padText #2.6 @@ -3330,7 +3325,7 @@ Nehmen wir an, dass die Datei @file{horn-music.ly} folgende Noten eines Horn/@/Fagott-Duos enthält: @example -hornNotes = \relative c @{ +hornNotes = \relative @{ \time 2/4 r4 f8 a | cis4 f | e4 d | @} @@ -3368,7 +3363,7 @@ die Stimmung eines normalen F-Hornes verlangt. Die Transposition kann in folgender Notenausgabe gesehen werden: @lilypond[quote,ragged-right] -\transpose f c' \relative c { +\transpose f c' \relative { \time 2/4 r4 f8 a | cis4 f | e4 d | } @@ -3398,7 +3393,7 @@ Dieser Befehl setzt die Eigenschaft @code{skipBars} im Beispiel: @lilypond[quote,ragged-right] -\transpose f c' \relative c { +\transpose f c' \relative { \time 2/4 \set Score.skipBars = ##t R2*3 | @@ -3425,7 +3420,7 @@ Partitur erstellt mit: woraus sich ergibt: @lilypond[quote,ragged-right] -\relative c << +\relative << \new Staff { \clef "treble" \time 2/4 diff --git a/Documentation/cs/learning/templates.itely b/Documentation/cs/learning/templates.itely index 6e4c63b2f7..85ca4061f0 100644 --- a/Documentation/cs/learning/templates.itely +++ b/Documentation/cs/learning/templates.itely @@ -143,7 +143,7 @@ not! @appendixsubsec Přepis menzurální hudby @lilypondfile[verbatim,quote,ragged-right,texidoc] -{ancient-notation-template----modern-transcription-of-mensural-music.ly} +{incipit.ly} @appendixsubsec Předlohy pro přepis gregorianik diff --git a/Documentation/cs/learning/tutorial.itely b/Documentation/cs/learning/tutorial.itely index 7bef36f3b5..b0de130457 100644 --- a/Documentation/cs/learning/tutorial.itely +++ b/Documentation/cs/learning/tutorial.itely @@ -10,7 +10,7 @@ @include included/generating-output.itexi -@c \version "2.16.0" +@c \version "2.19.21" @c Translators: Pavel Fric @node Cvičení @@ -216,7 +216,6 @@ jsou automatické hodnoty v zásadě použitelné. @cindex Vztažný režim a předznamenání @funindex \relative -@funindex relative @funindex ' @funindex , @@ -248,8 +247,8 @@ vždy jen o jeden notový řádek nad předchozím. @c KEEP LY @lilypond[verbatim,quote] % Počáteční bod napsat na jednočárkovaném C -\relative c' { - c d e f +\relative { + c' d e f g a b c } @end lilypond @@ -263,8 +262,8 @@ režimu @code{\relative} zobrazit i melodie s většími intervaly: @lilypond[verbatim,quote] -\relative c' { - d f a g +\relative { + d' f a g c b f d } @end lilypond @@ -282,8 +281,8 @@ je odstraňuje, může být oktáva první výšky tónu změněna: @c KEEP LY @lilypond[verbatim,quote] % dvoučárkované C -\relative c'' { - e c a c +\relative { + e'' c a c } @end lilypond @@ -297,8 +296,8 @@ H, když je to A, G nebo F, je napsáno pod ním. @c KEEP LY @lilypond[verbatim,quote] -\relative c'' { - b c % c je 1 řádek nahoru, tedy c nad b +\relative { + b' c % c je 1 řádek nahoru, tedy c nad b b d % d je 2 řádky nahoru, nebo 5 dolů, tedy d nad b b e % e je 3 nahoru, nebo 4 dolů, tedy e pod b b a % a je 6 nahoru, nebo 1 dolů, tedy a pod b @@ -317,8 +316,8 @@ Aby se zapsaly intervaly, které jsou větší než tři notové řádky, lze ok posazeným přímo za název noty se oktáva zvýší o jednu, čárkou @code{,} se oktáva o jednu sníží. @lilypond[verbatim,quote] -\relative c'' { - a a, c' f, +\relative { + a' a, c' f, g g'' a,, f' } @end lilypond @@ -355,8 +354,8 @@ Není-li označena žádná délka, používá se délka předcházející noty. Pro první notu je jako výchozí určena čtvrťová nota. @lilypond[verbatim,quote] -\relative c'' { - a1 +\relative { + a'1 a2 a4 a8 a a16 a a a a32 a a a a64 a a a a a a a a2 } @@ -368,8 +367,8 @@ tečkované noty musí být udána výslovně, tudíž včetně čísla. @lilypond[verbatim,quote] -\relative c'' { - a4 a a4. a8 +\relative { + a'4 a a4. a8 a8. a16 a a8. a8 a4. } @end lilypond @@ -385,8 +384,8 @@ tečkované noty musí být udána výslovně, tudíž včetně označením je @code{r}@tie{}: @lilypond[verbatim,quote] -\relative c'' { - a4 r r2 +\relative { + a'4 r r2 r8 a r4 r4. r8 } @end lilypond @@ -397,7 +396,6 @@ označením je @code{r}@tie{}: @cindex Druh taktu @funindex \time -@funindex time Slovníček: @rglos{time signature}. @@ -405,9 +403,9 @@ Slovníček: @rglos{time signature}. @code{\time}: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 - a4 a a + a'4 a a \time 6/8 a4. a \time 4/4 @@ -422,7 +420,6 @@ Slovníček: @rglos{time signature}. @cindex Údaj metronomu @funindex \tempo -@funindex tempo Slovníček: @rglos{tempo indication}, @rglos{metronome}. @@ -430,10 +427,10 @@ Slovníček: @rglos{tempo indication}, @rglos{metronome}. zapsat příkazem @code{\tempo}: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 \tempo "Andante" - a4 a a + a'4 a a \time 6/8 \tempo 4. = 96 a4. a @@ -453,7 +450,6 @@ zapsat příkazem @code{\tempo}: @cindex Bas @funindex \clef -@funindex clef Slovníček: @rglos{clef}. @@ -461,9 +457,9 @@ Slovníček: @rglos{clef}. @code{\clef}: @lilypond[verbatim,quote] -\relative c' { +\relative { \clef "treble" - c1 + c'1 \clef "alto" c1 \clef "tenor" @@ -479,11 +475,11 @@ Slovníček: @rglos{clef}. Zde je malý příklad, který obsahuje všechna tato vymezení: @lilypond[verbatim,quote] -\relative c, { +\relative { \clef "bass" \time 3/4 \tempo "Andante" 4 = 120 - c2 e8 c' + c,2 e8 c' g'2. f4 e d c4 c, r4 @@ -765,8 +761,8 @@ vyobrazením: @c no verbatim here @c KEEP LY @lilypond[quote] -\relative c'' { - c4-\markup { \bold \huge { Klepněte sem! } } +\relative { + c''4-\markup { \bold \huge { Klepněte sem! } } } @end lilypond diff --git a/Documentation/cs/learning/tweaks.itely b/Documentation/cs/learning/tweaks.itely index de1f0e9aa7..a351690d71 100644 --- a/Documentation/cs/learning/tweaks.itely +++ b/Documentation/cs/learning/tweaks.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.20" +@c \version "2.19.22" @node Ladění výstupu @chapter Ladění výstupu @@ -198,7 +198,6 @@ Befehl einsetzen zu können. @cindex override-Befehl @funindex \override -@funindex override @strong{Der \override-Befehl} @@ -257,12 +256,14 @@ zu ändern: @cindex NoteHead, Beispiel für override @cindex Notenkopf, Beispiel für Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a b c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a b c | +} @end lilypond @@ -270,7 +271,6 @@ g4 a b c | @cindex revert-Befehl @funindex \revert -@funindex revert Wenn eine Eigenschaft einmal überschrieben wurde, wird ihr neuer Wert so lange bewahrt, bis er noch einmal überschrieben @@ -294,20 +294,21 @@ wieder auf den Standardwert für die letzten zwei Noten gesetzt. @cindex NoteHead, Beispiel für override @cindex Notenkopf, Beispiel für Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a -\revert NoteHead.color -b4 c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a + \revert NoteHead.color + b4 c | +} @end lilypond @strong{\once-Präfix} @funindex \once -@funindex once Sowohl der @code{\override}-Befehl als auch der @code{\set}-Befehl können mit dem Präfix @code{\once} (@emph{einmal}) versehen werden. Dadurch wird @@ -335,7 +336,6 @@ g4 a b c | @cindex overrideProperty-Befehl @funindex \overrideProperty -@funindex overrideProperty Es gibt eine andere Form des @code{override}-Befehls, @code{\overrideProperty} (überschreibe Eigenschaft), @@ -349,7 +349,6 @@ in @rextend{Schwierige Korrekturen}. @cindex tweak-Befehl @funindex \tweak -@funindex tweak Der letzte Optimierungsbefehl in LilyPond ist @code{\tweak} (engl. optimieren). Er wird eingesetzt um Eigenschaften @@ -368,11 +367,13 @@ werden. Schauen wir zuerst, was wir mit @cindex NoteHead, Beispiel für override @cindex Notenkopf, Beispiel für Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -\once \override NoteHead.font-size = #-3 -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + \once \override NoteHead.font-size = #-3 + 4 + 4 +} @end lilypond Wie man sehen kann, beeinflusst @code{override} @emph{alle} @@ -401,9 +402,11 @@ mittlere Note eines Akkordes auf diese Weise ändern: @cindex Schriftgröße, Beispiel @cindex @code{\tweak}-Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + 4 +} @end lilypond Beachten Sie, dass die Syntax des @code{\tweak}-Befehls sich @@ -425,8 +428,8 @@ Beispiel zu sehen ist. @cindex Farb-Eigenschaft, Beispiel @cindex @code{\tweak}-Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -a4^"Black" +@lilypond[quote,fragment,ragged-right,verbatim] +a'4^"Black" -\tweak color #red ^"Red" -\tweak color #green _"Green" @end lilypond @@ -463,13 +466,15 @@ gesetzt wird. @cindex color-Eigenschaft, Beispiel @cindex direction-Eigenschaft, Beispiel -@lilypond[quote,ragged-right,verbatim,fragment,relative=2] -\tweak direction #up -\tuplet 3/4 { - \tweak color #red - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \tweak direction #up + \tuplet 3/4 { + \tweak color #red + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -486,15 +491,17 @@ beginnen, kann ihr Aussehen auf die übliche Art mit dem @c NOTE Tuplet brackets collide if notes are high on staff @c See issue 509 -@lilypond[quote,ragged-right,verbatim,fragment,relative=1] -\tuplet 3/2 { c8[ c c] } -\once \override TupletNumber.text = #tuplet-number::calc-fraction-text -\tuplet 3/2 { - c8[ c] - c8[ c] - \once \override TupletNumber.transparent = ##t - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative { + \tuplet 3/2 { c'8[ c c] } + \once \override TupletNumber.text = #tuplet-number::calc-fraction-text + \tuplet 3/2 { + c8[ c] + c8[ c] + \once \override TupletNumber.transparent = ##t + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -568,12 +575,12 @@ Komposition demonstriert werden. Hier das Beispiel: @c Mozart, Die Zauberflöte Nr. 7 Duett -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -671,14 +678,14 @@ Legatobogen und nahe bei ihm.} Also etwa so: @cindex thickness-Eigenschaft, Beispiel @cindex Dicke-Eigenschaft, Beispiel -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { + \relative { % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 - r4 bes8 bes[( g]) g | + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -729,7 +736,6 @@ auch weggelassen werden. @cindex Override nur einmal @cindex once override @funindex \once -@funindex once Im Beispiel oben wurden @emph{alle} Legatobögen dicker gesetzt. Vielleicht wollen Sie aber nur den ersten Bogen @@ -777,7 +783,6 @@ eingesetzt werden. @cindex Wiederherstellen von Standardeinstellungen @cindex Standardeinstellungen, Wiederherstellen @funindex \revert -@funindex revert Eine weitere Möglichkeit: nur die beiden ersten Legatobögen sollen dicker gesetzt werden. Gut, wir könnten jetzt zwei Befehle benutzen, @@ -787,12 +792,12 @@ Note gestellt, an welcher der Bogen beginnt: @cindex Legatobogen, Beispiel zur Veränderung @cindex thickness-Eigenschaft, Beispiel -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes[( g]) g | @@ -815,12 +820,12 @@ dessen später den @code{\revert}-Befehl einsetzen, um die @cindex Legatobogen, Beispiel zur Veränderung @cindex thickness-Eigenschaft, Beispiel -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 bes[( g]) g | @@ -945,12 +950,12 @@ bezieht, etwa so: @cindex kursiv, Beispiel @cindex @code{\addlyrics}, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -1202,9 +1207,9 @@ die @code{stencil}-Eigenschaft des @code{NoteHead}-Objekts auf dessen die @code{point-stencil}-Funktion benutzt werden, welche den Stencil auf ein Objekt mit der Größe Null setzt: -@lilypond[quote,verbatim,relative=2] -{ - c4 c +@lilypond[quote,verbatim] +\relative { + c''4 c \once \override NoteHead.stencil = #point-stencil c4 c } @@ -1269,11 +1274,11 @@ machen, ist also: @cindex Taktart, Beispiel zur Veränderung @cindex transparent-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.TimeSignature.transparent = ##t - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1335,11 +1340,11 @@ weiß zu setzen, können Sie schreiben: @cindex Taktlinie, Beispiel zur Veränderung @cindex color-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #white - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1370,11 +1375,11 @@ in interne Werte konvertiert: @cindex Taktlinie, Beispiel zur Veränderung @cindex color-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(x11-color 'white) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1400,11 +1405,11 @@ würde sein: @code{(rgb-color 1 1 1)}. @cindex Taktlinie, Beispiel zur Veränderung @cindex color-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(rgb-color 1 1 1) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1430,8 +1435,8 @@ verschiede Grauschattierungen erhalten: @cindex NoteHead, Beispiel zur Veränderung @cindex Notenkopf, Beispiel zur Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.StaffSymbol.color = #(x11-color 'grey30) \override Staff.TimeSignature.color = #(x11-color 'grey60) @@ -1439,7 +1444,7 @@ verschiede Grauschattierungen erhalten: \override Voice.NoteHead.color = #(x11-color 'grey85) \override Voice.Stem.color = #(x11-color 'grey85) \override Staff.BarLine.color = #(x11-color 'grey10) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1476,8 +1481,8 @@ braucht. @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f c c } @@ -1504,8 +1509,8 @@ wir setzen den Stencil von beiden auf @code{#f}: @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d + \relative { + r4 g'8 g c4 c8 d e4 r8 << { f8 c c } @@ -1573,8 +1578,8 @@ Das obige Beispiel könnte also auch so aussehen: @lilypond[quote,fragment,ragged-right,verbatim,relative=2] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d + \relative { + r4 g'8 g c4 c8 d e4 r8 << { f8 c c } @@ -1644,8 +1649,8 @@ Setzen wir das also in unserem Ossia-Beispiel ein: @lilypond[quote,verbatim,fragment,ragged-right,relative=2] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d + \relative { + r4 g'8 g c4 c8 d e4 r8 << { f8 c c } @@ -1717,8 +1722,8 @@ sie benutzt: @lilypond[quote,verbatim,fragment,ragged-right,relative=2] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d + \relative { + r4 g'8 g c4 c8 d e4 r8 << { f8 c c } @@ -1846,10 +1851,10 @@ Im nächsten Beispiel sehen Sie, wie Noten auf zwei Systemen @lilypond[quote,ragged-right,verbatim] << \new Staff { - \relative c' { c4 a, } + \relative { c'4 a, } } \new Staff { - \relative c'''' { c4 a, } + \relative { c''''4 a, } } >> @end lilypond @@ -2022,10 +2027,12 @@ Standardmäßig wird der Fingersatz automatisch entweder @cindex Fingersatz-Beispiel -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond @noindent @@ -2034,10 +2041,12 @@ nach oben oder unten zu zwingen: @cindex Fingersatz-Beispiel -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond Noch bessere Kontrolle über die Positionierung von Fingersatz für @@ -2344,12 +2353,12 @@ Tabelle oben festgestellt werden und dann die Priorität für @cindex TextScript, Beispiel zur Veränderung @cindex outside-staff-priority-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" | +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | \once \override TextScript.outside-staff-priority = #500 -c2^"Text3" -c2^"Text4" | +c''2^"Text3" +c''2^"Text4" | @end lilypond Damit wird zwar @qq{Text3} ganz richtig über @qq{Text4} @@ -2364,9 +2373,7 @@ werden. Das kann erreicht werden mit dem @cindex Noten, durch Text gespreizt @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff Standardmäßig wird Text, der mit dem Beschriftungsbefehl @code{\markup} bzw. Äquivalenten erstellt wird, kein @@ -2375,12 +2382,12 @@ zugestanden. Der @code{\textLengthOn}-Befehl ändert dieses Verhalten, so dass die Noten gespreizt werden, wenn die Breite des Textes es erfordert: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,fragment,ragged-right,verbatim] \textLengthOn % Cause notes to space out to accommodate text -c2^"Text1" -c2^"Text2" | -c2^"Text3" -c2^"Text4" | +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond Dieses Verhalten wird mit dem @code{\textLengthOff}-Befehl @@ -2401,25 +2408,27 @@ eine Textbeschriftung mit diesen Noten reagiert: @cindex Textbeschriftung, Beispiel zur Veränderung @cindex outside-staff-priority-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -% This markup is short enough to fit without collision -c2^"Tex" c'' | -R1 | - -% This is too long to fit, so it is displaced upwards -c,,2^"Text" c'' | -R1 | - -% Turn off collision avoidance -\once \override TextScript.outside-staff-priority = ##f -c,,2^"Long Text " c'' | -R1 | - -% Turn off collision avoidance -\once \override TextScript.outside-staff-priority = ##f -\textLengthOn % and turn on textLengthOn -c,,2^"Long Text " % Spaces at end are honored -c''2 | +@lilypond[quote,ragged-right,verbatim] +\relative { + % This markup is short enough to fit without collision + c''2^"Tex" c'' | + R1 | + + % This is too long to fit, so it is displaced upwards + c,,2^"Text" c'' | + R1 | + + % Turn off collision avoidance + \once \override TextScript.outside-staff-priority = ##f + c,,2^"Long Text " c'' | + R1 | + + % Turn off collision avoidance + \once \override TextScript.outside-staff-priority = ##f + \textLengthOn % and turn on textLengthOn + c,,2^"Long Text " % Spaces at end are honored + c''2 | +} @end lilypond @@ -2848,8 +2857,8 @@ zu verkleinern), die über oder unter den Noten gesetzt werden. @cindex Verschiebungs-Eigenschaft, Beispiel @cindex padding (Verschiebuns-Eigenschaft), Beispiel -@lilypond[quote,fragment,relative=1,verbatim] -c2\fermata +@lilypond[quote,fragment,verbatim] +c'2\fermata \override Script.padding = #3 b2\fermata @end lilypond @@ -2858,15 +2867,15 @@ b2\fermata @cindex Verschiebungs-Eigenschaft, Beispiel @cindex padding (Verschiebuns-Eigenschaft), Beispiel -@lilypond[quote,fragment,relative=1,verbatim] +@lilypond[quote,fragment,verbatim] % This will not work, see below \override MetronomeMark.padding = #3 \tempo 4 = 120 -c1 | +c'1 | % This works \override Score.MetronomeMark.padding = #3 \tempo 4 = 80 -d1 | +d'1 | @end lilypond Im zweiten Beispiel können Sie sehen, wie wichtig es ist den richtigen @@ -2906,8 +2915,8 @@ wie im folgenden Beispiel: @lilypond[quote,ragged-right,verbatim] sesquisharp = \markup { \sesquisharp } - \relative c'' { - c4 + \relative { + c''4 % This prints a sesquisharp but the spacing is too small \once \override Accidental.stencil = #ly:text-interface::print \once \override Accidental.text = #sesquisharp @@ -2998,8 +3007,8 @@ für Noten und Pausen funktioniert nur für Noten bzw. Pausen, die zur selben Zeit auftreten. Hier ein typisches Beispiel für eine Kollision dieser Art: -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] -<< { c4 c c c } \\ { R1 } >> +@lilypond[quote,verbatim,ragged-right] +<< \relative { c'4 c c c } \\ { R1 } >> @end lilypond Die beste Lösung ist es, die Ganztaktpause nach unten zu @@ -3016,9 +3025,9 @@ d.h. vier halbe Notenlinienabstände weiter nach unten: @cindex Ganztaktpausen, Beispiel zur Veränderung @cindex staff-position-Eigenschaft, Beispiel -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] +@lilypond[quote,verbatim,ragged-right] << - { c4 c c c } + \relative { c'4 c c c } \\ \override MultiMeasureRest.staff-position = #-8 { R1 } @@ -3150,10 +3159,10 @@ Chopin-Beispiel vornehmen, das wir behandelt haben in gebracht: @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { aes2 f4 fes } \\ @@ -3186,10 +3195,10 @@ Hier das Endergebnis: @cindex vertikale Verschiebung, Beispiel @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { aes2 f4 fes } \\ @@ -3227,9 +3236,9 @@ zu kompliziert zu machen. @c This example should not be indexed @lilypond[quote,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3268,8 +3277,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3312,8 +3321,8 @@ erstellt: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { - \new Voice { r2 c4. g8 | +rhMusic = \relative { + \new Voice { r2 c''4. g8 | bes1~ | \time 6/4 bes2. r8 @@ -3322,7 +3331,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3337,8 +3346,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2 | +lhMusic = \relative { + r2 2 | 1 | r2. d,,4 r4 r | r4 @@ -3372,9 +3381,9 @@ sind schnell gesetzt, denn sie wurden schon in der @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | bes1~ | \time 6/4 bes2. r8 @@ -3383,7 +3392,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3398,8 +3407,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1) | r2. d,,4 r4 r | r4 @@ -3446,9 +3455,9 @@ den Bindebogen (@code{tie}) 3,5 halbe Notenlinienabstände Damit ist auch der zweite Takt vollständig: @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3459,7 +3468,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3474,8 +3483,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3530,9 +3539,9 @@ um das Verhalten wieder auszuschalten. Das sieht so aus: @cindex staff-position-Eigenschaft, Beispiel @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3545,7 +3554,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3562,8 +3571,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3604,9 +3613,9 @@ es die Verschmelzung der Ds nicht stört. Das sieht jetzt so aus: @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3638,8 +3647,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3674,9 +3683,9 @@ wir durchsichtig und das C verschieben wir mit der @cindex transparent-Eigenschaft, Beispiel @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3716,8 +3725,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3777,7 +3786,7 @@ man zwei Stimmen benutzt, wobei die überbundenen Noten sich in der selben befinden, @lilypond[quote,fragment,relative=2] -<< { b8~ b8\noBeam } \\ { b[ g8] } >> +<< { b8~ 8\noBeam } \\ { b[ g8] } >> @end lilypond @noindent @@ -3793,7 +3802,7 @@ den Stimmen stattfindet: << { \once \override Stem.transparent = ##t - b8~ b\noBeam + b8~ 8\noBeam } \\ { b8[ g] } @@ -3810,7 +3819,7 @@ gesetzt wird: { \once \override Stem.transparent = ##t \once \override Stem.length = #8 - b8~ b\noBeam + b8~ 8\noBeam } \\ { b[ g8] } @@ -3848,10 +3857,10 @@ einem entfernten Objekt gezeigt: @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a + a'4 a a \once \override Score.MetronomeMark.transparent = ##t % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 @@ -3867,10 +3876,10 @@ einem entfernten Objekt gezeigt: @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a + a'4 a a \once \override Score.MetronomeMark.stencil = ##f % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 @@ -3956,10 +3965,10 @@ normal = { global = { \key c \major \time 4/4 \partial 4 } -SopranoMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopranoMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyrics { E -- | ter -- nal \emphasize Fa -- ther, | \normal strong to save, @@ -4024,13 +4033,13 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4060,7 +4069,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @end example @@ -4077,9 +4086,9 @@ Noten (in der Datei @file{music.ly}). @example \include "definitions.ily" -\relative c'' @{ +\relative @{ \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4098,13 +4107,13 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4134,7 +4143,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -4167,7 +4176,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4188,9 +4197,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4217,7 +4226,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -4251,7 +4260,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4268,9 +4277,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4532,7 +4541,7 @@ zu ihrer Position innerhalb der Tonleiter gesetzt. ((0) (x11-color 'violet )) ; for B ))) -\relative c' { +\relative { % Arrange to obtain color from color-notehead procedure \override NoteHead.color = #color-notehead a2 b | c2 d | e2 f | g2 a | diff --git a/Documentation/cs/translations.itexi b/Documentation/cs/translations.itexi index fc2e13f51f..048eff0bfa 100644 --- a/Documentation/cs/translations.itexi +++ b/Documentation/cs/translations.itexi @@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; } @end html @end ifhtml -@emph{Naposledy obnoveno Wed Dec 18 12:23:14 UTC 2013 +@emph{Naposledy obnoveno Sat Jul 2 15:06:05 UTC 2016 } @multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 @@ -47,7 +47,7 @@ ano @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml @@ -84,24 +84,24 @@ ano @item 1 Cvičení @* -2578 +2499 @tab Pavel Fric @tab @tab @ifhtml @html -částečně (48 %) +částečně (50 %) @end html @end ifhtml @ifnothtml -částečně (48 %) +částečně (50 %) @end ifnothtml @tab @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml @@ -111,24 +111,24 @@ ano @item 2 Běžný notový zápis @* -4396 +4402 @tab Pavel Fric @tab @tab @ifhtml @html -částečně (35 %) +částečně (37 %) @end html @end ifhtml @ifnothtml -částečně (35 %) +částečně (37 %) @end ifnothtml @tab @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml @@ -138,7 +138,7 @@ ano @item 3 Základní pojmy @* -11144 +11119 @tab Pavel Fric @tab @tab @@ -155,7 +155,7 @@ ano @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml @@ -165,24 +165,24 @@ ano @item 4 Ladění výstupu @* -16191 +16592 @tab Pavel Fric @tab @tab @ifhtml @html -částečně (50 %) +částečně (51 %) @end html @end ifhtml @ifnothtml -částečně (50 %) +částečně (51 %) @end ifnothtml @tab @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml @@ -192,24 +192,24 @@ ano @item A Předlohy @* -372 +1236 @tab Pavel Fric @tab @tab @ifhtml @html -částečně (38 %) +částečně (75 %) @end html @end ifhtml @ifnothtml -částečně (38 %) +částečně (75 %) @end ifnothtml @tab @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml @@ -231,7 +231,7 @@ LilyPond -- Zápis not pro každého @item Nadpisy @* -616 +629 @tab Pavel Fric @tab @tab @@ -248,7 +248,7 @@ ano @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml @@ -285,7 +285,7 @@ ano @item Úvod @* -4937 +5815 @tab Pavel Fric @tab @tab @@ -302,7 +302,7 @@ ano @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml @@ -312,7 +312,7 @@ ano @item Stažení @* -1201 +1158 @tab Pavel Fric @tab @tab @@ -329,7 +329,7 @@ ano @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml @@ -339,7 +339,7 @@ ano @item Příručky @* -1284 +1314 @tab Pavel Fric @tab @tab @@ -356,7 +356,7 @@ ano @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml @@ -366,7 +366,7 @@ ano @item Společenství @* -3073 +3524 @tab  Pavel Fric @tab @tab @@ -383,7 +383,7 @@ Společenství @ifhtml @html -částečně +částečně @end html @end ifhtml @ifnothtml diff --git a/Documentation/cs/usage/lilypond-book.itely b/Documentation/cs/usage/lilypond-book.itely index d041f61620..b1f7c11e31 100644 --- a/Documentation/cs/usage/lilypond-book.itely +++ b/Documentation/cs/usage/lilypond-book.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.22" @c Translators: Pavel Fric @@ -94,8 +94,8 @@ Dokumente für \verb+lilypond-book+ können Musik und Text nach Belieben kombinieren. Zum Beispiel: \begin{lilypond} -\relative c' { - c2 e2 \tuplet 3/2 { f8 a b } a2 e4 +\relative { + c'2 e2 \tuplet 3/2 { f8 a b } a2 e4 } \end{lilypond} @@ -154,8 +154,8 @@ Dokumente für @command{lilypond-book} können Musik und Text nach Belieben kombinieren. Zum Beispiel: @lilypond -\relative c' { - c2 e2 \tuplet 3/2 { f8 a b } a2 e4 +\relative { + c'2 e2 \tuplet 3/2 { f8 a b } a2 e4 } @end lilypond @@ -706,8 +706,8 @@ Erzeugung der Grafik im relativen Oktavenmodus interpretiert, der wörtlich in das Dokument kopierte LilyPond-Code zeigt den @code{relative}-Befehl jedoch nicht. @example -\relative c' @{ % begin verbatim - c4 e2 g4 +\relative @{ % begin verbatim + c'4 e2 g4 f2 e % end verbatim @} @end example @@ -1067,8 +1067,8 @@ Sie können LilyPond-Fragmente in ein LaTeX-Dokument einfügen: Normaler LaTeX-Text. \begin@{lilypond@} -\relative c'' @{ - a4 b c d +\relative @{ + a'4 b c d @} \end@{lilypond@} @@ -1093,7 +1093,7 @@ Handbuch wurde in Texinfo geschrieben. Texinfo-Text @@lilypond -\relative c' @{ +\relative @{ a4 b c d @} @@end lilypond @@ -1120,8 +1120,8 @@ d4 c b a Dokumente für lilypond-book können Noten und Text frei kombinieren. Zum Beispiel -\relative c'' @{ - a4 b c d +\relative @{ + a'4 b c d @}

@@ -1221,7 +1221,7 @@ sich alle in der selben LilyPond-Datei befinden. (format #f "~a, section, 1, @{~a@}, ~a" page text label)))) (formatted-toc-items (map format-line (toc-items))) (whole-string (string-join formatted-toc-items ",\n")) - (output-name (ly:parser-output-name parser)) + (output-name (ly:parser-output-name)) (outfilename (format "~a.toc" output-name)) (outfile (open-output-file outfilename))) (if (output-port? outfile) diff --git a/Documentation/cs/usage/running.itely b/Documentation/cs/usage/running.itely index c0ab293214..a11801f05f 100644 --- a/Documentation/cs/usage/running.itely +++ b/Documentation/cs/usage/running.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.21" @c Translators: Pavel Fric @@ -765,9 +765,9 @@ annehmen, dass folgendes Beispiel alle Notenköpfe in dem Notensystem rot macht, aber als Resultat hat man zwei Systeme, während die Notenköpfe immernoch schwarz im unteren System erscheinen. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.NoteHead.color = #red -\new Staff { a } +\new Staff { a' } @end lilypond Das liegt daran, dass kein @code{Staff}-Kontext existiert, wenn @@ -776,10 +776,10 @@ für diesen Befehl erstellt wird. Dann aber erstellt @code{\new Staff} noch ein zusätzliches System, wo die Noten gesetzt werden. Die richtige Schreibweise wäre: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Staff { \override Staff.NoteHead.color = #red - a + a' } @end lilypond @@ -791,7 +791,7 @@ erstellen. @lilypond[quote,verbatim] \repeat unfold 2 { - \relative c' { c4 d e f } + \relative { c'4 d e f } } @end lilypond @@ -801,7 +801,7 @@ umgangen werden. @lilypond[quote,verbatim] \new Voice { \repeat unfold 2 { - \relative c' { c4 d e f } + \relative { c'4 d e f } } } @end lilypond diff --git a/Documentation/cs/usage/suggestions.itely b/Documentation/cs/usage/suggestions.itely index 96c0618531..b9afaa72b3 100644 --- a/Documentation/cs/usage/suggestions.itely +++ b/Documentation/cs/usage/suggestions.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @node Návrhy pro psaní vstupních souborů LilyPond @chapter Návrhy pro psaní vstupních souborů LilyPond @@ -60,7 +60,7 @@ Hier einige Vorschläge, wie Sie Probleme vermeiden oder lösen können: @item @strong{Schreiben Sie immer mit @code{\version} die Versionsnummer in jede Datei}. Beachten Sie, dass in allen Vorlagen die Versionsnummer -@code{\version "2.16.0"} eingetragen ist. Es empfiehlt sich, in alle +@code{\version "2.19.21"} eingetragen ist. Es empfiehlt sich, in alle Dateien, unabhängig von ihrer Größe, den @code{\version}-Befehl einzufügen. Persönliche Erfahrung hat gezeigt, dass es ziemlich frustrierend sein kann zu erinnern, welche Programmversion man etwa @@ -176,8 +176,8 @@ während die @code{violine}-Definition sich wahrscheinlich mit einer neuen Programmversion nicht verändern wird. @example -violine = \relative c'' @{ -g4 c'8. e16 +violine = \relative @{ +g'4 c'8. e16 @} ... \score @{ @@ -199,8 +199,8 @@ man es nur einmal vorzunehmen und die Noten in der Geigenstimme, @example fdannp = _\markup@{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} -violin = \relative c'' @{ -g4\fdannp c'8. e16 +violin = \relative @{ +g'4\fdannp c'8. e16 @} @end example @@ -254,9 +254,9 @@ aus, aber nicht den @code{\bass}-Befehl in dem @code{\score}-Abschnitt: @example -bass = \relative c' @{ +bass = \relative @{ %@{ - c4 c c c + c'4 c c c d d d d %@} @} diff --git a/Documentation/cs/web.texi b/Documentation/cs/web.texi index 6e32322872..255ade4032 100644 --- a/Documentation/cs/web.texi +++ b/Documentation/cs/web.texi @@ -17,7 +17,7 @@ @c `Web' was imported 2009-08-05 with git commit b938d71... @c @macro copyrightDeclare -@c Copyright @copyright{} 2009--2012 by the authors. +@c Copyright @copyright{} 2009--2015 by the authors. @c @end macro @set FDL diff --git a/Documentation/cs/web/community.itexi b/Documentation/cs/web/community.itexi index c4e37ed8d7..062f780c48 100644 --- a/Documentation/cs/web/community.itexi +++ b/Documentation/cs/web/community.itexi @@ -127,7 +127,7 @@ dílech. Podívejte se, co vytvořili jiní lidé a napište své vlastní příklady! @example -@uref{http://lsr.dsi.unimi.it} +@uref{http://lsr.di.unimi.it} @end example Obzvláště poučné příklady z LSR jsou zahrnuty v naší @@ -199,7 +199,7 @@ Nejjednodušší cestou, jak zůstat ve spojení, je četba zpravodaje našeho společenství: LilyPond Reportu (v angličtině). @example -@uref{http://news.lilynet.net} +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net} @end example @subsubheading Poštovní seznam pro nové verze: @code{info-lilypond@@gnu.org} @@ -620,7 +620,7 @@ lilypond-book-Zkoušky této verze. @itemize @item @uref{http://lilypond.org/test, Porovnání dvou verzí}: -@item @uref{http://lilypond.org/download/binaries/test-output/, +@item @uref{http://lilypond.org/downloads/binaries/test-output/, Archiv všech zkoušek regresí} @end itemize diff --git a/Documentation/cs/web/introduction.itexi b/Documentation/cs/web/introduction.itexi index 6558ecaca5..7aedbb9b1a 100644 --- a/Documentation/cs/web/introduction.itexi +++ b/Documentation/cs/web/introduction.itexi @@ -576,7 +576,7 @@ klaviaturu, která ukazuje, které klávesy se musí stisknout, aby při čtení not pomohl začátečníkům. @item -@uref{http://www.adoromusicpub.com/, Adoro Music Publishing}, +@uref{https://twitter.com/adoromusic, Adoro Music Publishing}, jakostně vysoce hodnotné notové zápisy církevní hudby, jak pro přímé stažení tak i k dostání na papíře. @@ -792,7 +792,7 @@ překvapit.} @divClass{testimonial-item} -@subsubheading Chris Snyder, @uref{http://www.adoromusicpub.com/, Adoro Music Publishing} +@subsubheading Chris Snyder, @uref{https://twitter.com/adoromusic, Adoro Music Publishing} @qq{Způsob, jakým jsou noty v LilyPondu zadávány, mi dovoluje myslet hudebně -- byly doby, kdy jsem se LilyPondu marně @@ -1202,7 +1202,7 @@ pro vytváření hudebního zápisu z programových prostředí pro počítačov LilyKDE3 pro KDE 3.5 a lilypond-KDE4 pro KDE 4.1. @item -@uref{http://noteedit.berlios.de,NoteEdit}, který zaváděl +@uref{https://sourceforge.net/projects/noteedit.berlios/,NoteEdit}, který zaváděl @uref{http://www.musicxml.com/xml.html,MusicXML}, se rozdělil a je dále vyvíjen jako @uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd} diff --git a/Documentation/cs/web/manuals.itexi b/Documentation/cs/web/manuals.itexi index 376a6996d2..021fb99b63 100644 --- a/Documentation/cs/web/manuals.itexi +++ b/Documentation/cs/web/manuals.itexi @@ -320,7 +320,7 @@ tento dokument přečíst, dříve než si člověk začne myslet na větší pr Zde jsou vybrané úryvky ukázány na kódu LilyPondu s vytvořeným notovým zápisem. Úryvky pocházejí z -@uref{http://lsr@/.dsi@/.unimi@/.it,Skladiště s úryvky LilyPondu} +@uref{http://lsr@/.di@/.unimi@/.it,Skladiště s úryvky LilyPondu} (LSR) a všechny se nacházejí pod Public Domain. Vezměte na vědomí, že tento dokument nepředstavuje žádnou určitou diff --git a/Documentation/css/lilypond-ie-fixes.css b/Documentation/css/lilypond-manuals-ie-fixes.css similarity index 99% rename from Documentation/css/lilypond-ie-fixes.css rename to Documentation/css/lilypond-manuals-ie-fixes.css index 274f7fdc0d..517f77b11b 100644 --- a/Documentation/css/lilypond-ie-fixes.css +++ b/Documentation/css/lilypond-manuals-ie-fixes.css @@ -68,4 +68,3 @@ p, h1, h2, ul, .footer, #languages { div.header h1, div.subheader p { text-align: center; } - diff --git a/Documentation/css/lilypond-manuals.css b/Documentation/css/lilypond-manuals.css index 995c2173c6..e0e8eca9b6 100644 --- a/Documentation/css/lilypond-manuals.css +++ b/Documentation/css/lilypond-manuals.css @@ -1,3 +1,27 @@ +/**********************************************************/ +/* GENERAL INFORMATION */ +/**********************************************************/ + +/* It has been requested that each web manual be styled using a + different color. To faciliate that, each manual is being + assigned a hue value on the HSB color chart. All specific + colors for a manual will be shades and tints of that hue. + + Manual Color Hue + learning green 120 + music-glossary + essay + + notation blue 205 + usage yellow 50 + snippets + + changes + extending red 0 + internals purple 280 + + contributor black doesn't matter - desat + /**********************************************************/ /* PAGE-WIDE SETTINGS */ /**********************************************************/ @@ -24,42 +48,52 @@ body { .appendix, .appendixsec, .appendixsubsec, .unnumbered, .unnumberedsec, .unnumberedsubsec, .unnumberedsubsubsec, .subheading, .subsubheading { - color: #204a87; - border-bottom: 1px dashed black; + color: rgb(32, 74, 135); padding-bottom: 0.15em; margin-top: 0.6em; - margin-bottom: 1em; + margin-bottom: 0.6em; } .settitle { - background: #b1d281; + background: #657f40; + color: white; font-size: 2em; text-align: center; padding: 0.4em 0.5em; - border: solid #7b925a; + border: solid black; border-width: 1px 0; - margin: 0; + margin: 0 0 10px 0; } -.chapter, .appendix, .unnumbered { - font-size: 1.8em; -} +body.learning .settitle { background-color: #407f40; } +body.notation .settitle { background-color: #40657f; } +body.usage .settitle { background-color: #7f7f33; } +body.extending .settitle { background-color: #7f4040; } +body.internals .settitle { background-color: #6a407f; } +body.contributor .settitle { background-color: #000000; } -.section, .appendixsec, .unnumberedsec { - font-size: 1.6em; +.chapter, .appendix, .unnumbered, +.section, .appendixsec, .unnumberedsec, +.subsection, .appendixsubsec, .unnumberedsubsec, +.subsubsection { + font-size: 1.7em; + margin-top: 0.9em; } -.subsection, .appendixsubsec, .unnumberedsubsec { - font-size: 1.4em; +.subheading, .unnumberedsubsubsec { + font-size: 1.5em; + margin-top: 0.9em; } -.subheading, .subsubsection, .unnumberedsubsubsec { - font-size: 1.25em; +.subheading { + border-top: 1px solid rgb(200, 200, 200); + padding-top: 0.8em; } .subsubheading { - font-size: 1em; + font-size: 1.15em; font-weight: bold; + margin-top: 1.6em; } .chapheading { @@ -99,8 +133,16 @@ blockquote, .smallexample { border: solid #b1d281; border-width: 1px 1px 1px 5px; margin: 1em auto; + background-color: white; } +body.learning blockquote, body.learning .smallexample { border-color: #00ff00; } +body.notation blockquote, body.notation .smallexample { border-color: #0095ff; } +body.usage blockquote, body.usage .smallexample { border-color: #ffff00; } +body.extending blockquote, body.extending .smallexample { border-color: #ff0000; } +body.internals blockquote, body.internals .smallexample { border-color: #aa00ff; } +body.contributor blockquote, body.contributor .smallexample { border-color: #000000; } + blockquote p, pre.smallexample { padding: 1em; margin: 0; @@ -133,6 +175,13 @@ table.cartouche { margin: 0 auto 1em; } +body.learning table.cartouche { background-color: #cfe5cf; border: 2px solid #7db27d; } +body.notation table.cartouche { background-color: #cfdce5; border: 2px solid #7d9cb2; } +body.usage table.cartouche { background-color: #e5e2b8; border: 2px solid #b2b27d; } +body.extending table.cartouche { background-color: #e5cfcf; border: 2px solid #b27d7d; } +body.internals table.cartouche { background-color: #decfe5; border: 2px solid #a17db2; } +body.contributor table.cartouche { background-color: #e5e5e5; border: 2px solid #b2b2b2; } + table.cartouche p { padding: 1em; margin: 0; @@ -167,8 +216,8 @@ div#main ul { } h1, h2, h3, h4, p, table, address, dt { - padding-left: 1em; - padding-right: 1em; + padding-left: 18px; + padding-right: 18px; } p { @@ -195,6 +244,11 @@ pre.menu-comment { margin-bottom: 1em; } +table td { + vertical-align: top; + padding-bottom: .5em; +} + /***********************************************************/ /* TOC SIDEBAR */ /***********************************************************/ @@ -208,13 +262,20 @@ div#tocframe { padding: 0; margin: 0; overflow: auto; - background: #f5f5dc; + background: #dce35cf; z-index: 100; list-style-type: none; font-size: 0.83em; line-height: 1.3; } +body.learning div#tocframe { background-color: #cfe5cf; } +body.notation div#tocframe { background-color: #cfdce5; } +body.usage div#tocframe { background-color: #e5e5b8; } +body.extending div#tocframe { background-color: #e5cfcf; } +body.internals div#tocframe { background-color: #decfe5; } +body.contributor div#tocframe { background-color: #e5e5e5; } + @media screen { body > div#tocframe { position: fixed @@ -222,12 +283,12 @@ div#tocframe { } div#tocframe a:link, div#tocframe a:visited { - color: #454532; + color: black; text-decoration: none; } div#tocframe a:hover { - color: #232b16; + color: #666666; text-decoration: underline; } @@ -236,7 +297,7 @@ div#tocframe p.toc_uplink { line-height: 1.125; background: #c9ccc4; padding: 0.25em 1em 0.25em 0.5em; - border-bottom: 1px solid #a0a087; + border-bottom: 1px solid black; margin: 0; } @@ -382,16 +443,24 @@ table .title { } .footer { - background: #e5f5ce; + background: #657f40; font-size: 0.8em; padding: 0.2em 0; - border: solid #b1d281; + border: solid white; border-width: 0 0 5px 0; margin: 0; + color: white; } +body.learning .footer { background-color: #407f40; } +body.notation .footer { background-color: #40657f; } +body.usage .footer { background-color: #7f7f33; } +body.extending .footer { background-color: #7f4040; } +body.internals .footer { background-color: #6a407f; } +body.contributor .footer { background-color: #000000; } + .footer a:link { - color: #0308fc; + color: white; } .footer p { @@ -451,18 +520,24 @@ div#search p, div#search form { padding: 0; border: 1px solid green; /* Experimental rounded corners */ - -moz-border-radius: 10px; - -webkit-border-radius: 10px; + border-radius: 10px; margin: 1em; } +body.learning .warning { border-color: #00ff00; } +body.notation .warning { border-color: #0095ff; } +body.usage .warning { border-color: #ffff00; } +body.extending .warning { border-color: #ff0000; } +body.internals .warning { border-color: #aa00ff; } +body.contributor .warning { border-color: #000000; } + + .advanced { background: #eeffcc; text-align: left; padding: 0; border: 1px solid green; /* Experimental rounded corners */ - -moz-border-radius: 10px; - -webkit-border-radius: 10px; + border-radius: 10px; margin: 0.5em 0.5em 2em 3em; } diff --git a/Documentation/css/lilypond-website-ie-fixes.css b/Documentation/css/lilypond-website-ie-fixes.css new file mode 100644 index 0000000000..9642c087ee --- /dev/null +++ b/Documentation/css/lilypond-website-ie-fixes.css @@ -0,0 +1,56 @@ +/* IE9 and IE8 lack support for CSS gradients so this file */ +/* supplies background images for them instead. */ + +/* Table of Contents */ +/* first level toc (unnumbered) */ + +div#tocframe { + background: url(../pictures/nav1-bg.png) repeat-x top left; +} + +#tocframe li a:hover { + background: url(../pictures/nav1-hover.png); +} + +#tocframe li.toc_current a, +#tocframe li.toc_current a:hover { + background: url(../pictures/nav1-active.png); +} + +/* second level toc (unnumberedsec) */ + +#tocframe .toc .toc li a { + background: url(../pictures/nav2-bg.png); +} + +#tocframe .toc .toc li a:hover { + background: url(../pictures/nav2-hover.png); +} + +#tocframe .toc .toc li.toc_current a, +#tocframe .toc .toc li.toc_current a:hover { + background: url(../pictures/nav2-active.png); +} + +/* Columns */ + +.column-center-top h3 { + background: #9ccc7c url(../pictures/color1-bg.png) repeat-x top left; +} + +.column-left-top h3, +.column-left-bottom h3, +.column-center-middle-color2 h3, +.news-item h3 { + background: #adce82 url(../pictures/color2-bg.png) repeat-x top left; +} + +.column-right-top h3, +.column-right-bottom h3, +.column-center-middle-color3 h3 { + background: #bdd088 url(../pictures/color3-bg.png) repeat-x top left; +} + +.column-center-bottom h3 { + background: #ccd38f url(../pictures/color4-bg.png) repeat-x top left; +} diff --git a/Documentation/css/lilypond-website.css b/Documentation/css/lilypond-website.css index 820cd5c5bf..46723fa47f 100644 --- a/Documentation/css/lilypond-website.css +++ b/Documentation/css/lilypond-website.css @@ -15,10 +15,16 @@ body { max-width: 70em; font-size: 95%; line-height: 1.5; - background: #fff url(../pictures/background-image.png) no-repeat 0 0; text-align: justify; padding: 0; margin: 0 auto; + /* fallback for IE8 which doesn't support multiple backgrounds */ + background: url(../pictures/background-top-left.png) no-repeat top left; + background-color: rgb(245, 252, 242); + background-image: url(../pictures/background-top-right.png), + url(../pictures/background-top-left.png); + background-position: top right, top left; + background-repeat: no-repeat, no-repeat; } hr { @@ -67,15 +73,14 @@ div#tocframe { top: 0; left: 0; right: 0; - background: #6aec7c url(../pictures/nav-bg.png) repeat-x top left; + background: rgb(35, 155, 80); + background: linear-gradient(to top, + rgb(25, 115, 50), + rgb(45, 205, 115)); max-width: 70em; font-size: 100%; line-height: 1; padding: 0; - -moz-border-radius-bottomleft: 7px; - -moz-border-radius-bottomright: 7px; - -webkit-border-bottom-left-radius: 7px; - -webkit-border-bottom-right-radius: 7px; border-bottom-left-radius: 7px; border-bottom-right-radius: 7px; margin: 0; @@ -93,35 +98,15 @@ div#tocframe { } #tocframe > ul:first-child > li:first-child a { - text-indent: -999em; - background: #6aec7c url(../pictures/lily-home-nav-bg.png) no-repeat 50% 50%; - width: 9%; - -moz-border-radius-bottomleft: 7px; - -webkit-border-bottom-left-radius: 7px; border-bottom-left-radius: 7px; } -#tocframe > ul:first-child > li:first-child a:hover { - background: #6aec7c url(../pictures/lily-home-nav-hover.png) no-repeat 50% 50%; - width: 9%; -} - -#tocframe > ul:first-child > li:first-child.toc_current a { - text-indent: -999em; - background: url(../pictures/lily-home-nav-active.png) no-repeat 50% 50%; - width: 9%; -} - -#tocframe > ul:first-child > li:first-child.toc_current a:hover { - text-indent: -999em; - background: url(../pictures/lily-home-nav-active.png) no-repeat 50% 50%; - width: 9%; +#tocframe > ul:first-child > li:first-child a span { + background: url(../pictures/lily-home-32x32.png) no-repeat scroll 0% 40% transparent; + padding: 16px 0px 16px 38px; } #tocframe > ul:first-child > li:last-child { - width: 9%; - -moz-border-radius-bottomright: 7px; - -webkit-border-bottom-right-radius: 7px; border-bottom-right-radius: 7px; } @@ -134,57 +119,57 @@ div#tocframe { /* search box */ #tocframe li form { float: left; - width: 17%; - background: #6aec7c url(../pictures/nav-bg.png); + width: 16%; font-size: 100%; - padding: 0.45em 0.8%; - margin: 0; + padding: 0.5em 0.8%; + margin: 0 0 0 1%; } #tocframe li form input { display: block; float: left; - width: 95%; - font-size: 100%; - padding: 0.1em; + width: 92%; + font-size: 90%; + color: rgb(85, 85, 85); + background: rgb(235, 242, 232); + padding: 0.1em 0.1em 0.1em 0.6em; border: 0; margin: 0; - -moz-border-radius-topright: 20px; - -moz-border-radius-bottomright: 20px; - -webkit-border-top-right-radius: 20px; - -webkit-border-bottom-right-radius: 20px; - border-top-right-radius: 20px; - border-bottom-right-radius: 20px; + border-radius: 7px; } #tocframe li form input[type="hidden"] { position: relative; height: 0; overflow: hidden; - text-indent: -999em; padding: 0; margin: 0; } #tocframe li a { - background: #6aec7c url(../pictures/nav-bg.png); float: left; - width: 18%; + width: 16%; text-align: center; font-weight: bold; padding: 0.68em 0; margin: 0; + border-right: 1px solid rgba(25, 100, 40, 0.25); } #tocframe li a:hover { - background: url(../pictures/nav-hover.png); + background: rgb(45, 165, 90); + background: linear-gradient(to top, + rgb(35, 125, 60), + rgb(55, 215, 125)); } #tocframe li.toc_current a, #tocframe li.toc_current a:hover { - background: url(../pictures/nav-active.png); + background: rgb(0, 120, 30); + background: linear-gradient(to top, + rgb(0, 85, 20), + rgb(15, 175, 85)); color: #fff; - text-decoration: underline; } /* second level toc (unnumberedsec) */ @@ -205,19 +190,12 @@ div#tocframe { } #tocframe .toc .toc li:first-child a { - -moz-border-radius-topleft: 7px; - -moz-border-radius-bottomleft: 7px; - -webkit-border-top-left-radius: 7px; - -webkit-border-bottom-left-radius: 7px; border-top-left-radius: 7px; border-bottom-left-radius: 7px; + border-left: 1px solid rgba(85, 130, 70, 0.25); } #tocframe .toc .toc li:last-child a { - -moz-border-radius-topright: 7px; - -moz-border-radius-bottomright: 7px; - -webkit-border-top-right-radius: 7px; - -webkit-border-bottom-right-radius: 7px; border-top-right-radius: 7px; border-bottom-right-radius: 7px; } @@ -225,7 +203,10 @@ div#tocframe { #tocframe .toc .toc li a { float: left; width: auto; - background: #ceffae; + background: rgb(165, 215, 150); + background: linear-gradient(to top, + rgb(130, 200, 110), + rgb(200, 230, 190)); line-height: 2; color: #000; text-decoration: none; @@ -233,86 +214,22 @@ div#tocframe { font-weight: normal; padding: 0 0.5em; margin: 0; + border-right: 1px solid rgba(85, 130, 70, 0.25); } #tocframe .toc .toc li a:hover { - background: #bdee9d; -} - -/* colored second-level TOC items */ -#tocframe .toc .toc li.color1 a { - background: #9ccc7c url(../pictures/color1-bg.png) repeat-x top left; -} - -#tocframe .toc .toc li.color2 a { - background: #bbcf81 url(../pictures/color2-bg.png) repeat-x top left; -} - -#tocframe .toc .toc li.color3 a { - background: #dbd286 url(../pictures/color3-bg.png) repeat-x top left; -} - -#tocframe .toc .toc li.color4 a { - background: #fad58c url(../pictures/color4-bg.png) repeat-x top left; -} - -#tocframe .toc .toc li.colorDefault a { - background: #8cbc6c url(../pictures/nav-bg-2.png) repeat-x top left; - color: #fff; -} - -#tocframe .toc .toc li.colorDefault a:hover { - background: #8cbc6c url(../pictures/nav-hover-2.png) repeat-x top left; - color: #fff; -} - -#tocframe .toc .toc li.color1 a:hover { - background: #addd8d url(../pictures/color1-hover.png) repeat-x top left; -} - -#tocframe .toc .toc li.color2 a:hover { - background: #ccdf92 url(../pictures/color2-hover.png) repeat-x top left; -} - -#tocframe .toc .toc li.color3 a:hover { - background: #ece297 url(../pictures/color3-hover.png) repeat-x top left; -} - -#tocframe .toc .toc li.color4 a:hover { - background: #fbe69d url(../pictures/color4-hover.png) repeat-x top left; + background: rgb(175, 225, 160); + background: linear-gradient(to top, + rgb(140, 210, 120), + rgb(210, 240, 200)); } #tocframe .toc .toc li.toc_current a, #tocframe .toc .toc li.toc_current a:hover { - color: #000; - text-decoration: underline; -} - -#tocframe .toc .toc li.colorDefault.toc_current a, -#tocframe .toc .toc li.colorDefault.toc_current a:hover { - background: #8cbc6c url(../pictures/nav-active-2.png) repeat-x top left; - color: #fff; - text-decoration: underline; -} - -#tocframe .toc .toc li.color1.toc_current a, -#tocframe .toc .toc li.color1.toc_current a:hover { - background: #beee9e url(../pictures/color1-active.png) repeat-x top left; -} - -#tocframe .toc .toc li.color2.toc_current a, -#tocframe .toc .toc li.color2.toc_current a:hover { - background: #ddefa3 url(../pictures/color2-active.png) repeat-x top left; -} - -#tocframe .toc .toc li.color3.toc_current a, -#tocframe .toc .toc li.color3.toc_current a:hover { - background: #fdf4a8 url(../pictures/color3-active.png) repeat-x top left; -} - -#tocframe .toc .toc li.color4.toc_current a, -#tocframe .toc .toc li.color4.toc_current a:hover { - background: #fcf7ae url(../pictures/color4-active.png) repeat-x top left; + background: rgb(135, 185, 120); + background: linear-gradient(to top, + rgb(100, 170, 80), + rgb(170, 200, 160)); } /* third level toc (unnumberedsubsec) */ @@ -371,7 +288,6 @@ div#main { overflow: auto; } -/* FIXME: does not work in IE<=6 */ #main > a:first-child { position: absolute; top: -10em; @@ -415,14 +331,8 @@ div#cmws { div#quickSummary { text-align: left; - margin: 4em 13em 0 0; -} - -#quickSummary .subheading { - background: #fff url(../pictures/summary-gradient.png) repeat-y 0 0; - color: #fff; - padding: 0 0.5em; - margin: 0; + margin: 3em 14em 25px 0; + font-size: 19px; } #quickSummary p { @@ -430,29 +340,12 @@ div#quickSummary { margin: 0; } -div.separator { - background: transparent url(../pictures/squiggle.jpg) no-repeat 50% 50%; - height: 36px; - padding: 10px; - margin: 0 13em 0 0; -} - div#news { padding: 0; - margin: 0 13em 1em 0; -} - -div.news-item { - padding: 1em 0; + margin: 0 14em 1em 0; } -.news-item .subsubheading { - text-align: left; - padding: 0 0 0 0.5em; - border-bottom: 1px solid #5b7f64; - margin: 0; - overflow: hidden; -} +/* .news-item is styled below with columns */ .testimonial-item { /* Not sure how to style the testimonials */ @@ -474,66 +367,33 @@ div.news-item { padding: 0 0.5em; } -.news-item p { - text-align: left; - padding: 0.5em; - margin: 0; -} - -div#latestVersion { +div#homePageSideBar { position: absolute; - top: 16em; - right: 0; - width: 12em; - text-align: center; - border-left: 1px solid #5b7f64; -} - -div#wildCardBox { - position: absolute; - top: 0.0em; + top: 0; right: 0; width: 12em; - text-align: center; - border-left: 1px solid #5b7f64; -} - -#latestVersion .subheading { - background: #5b7f64; - color: #fff; - text-align: center; - padding: 0 0.5em; - margin: 0; + text-align: left; } -#wildCardBox .subheading { +#homePageSideBar .subheading { + font-size: 15.2px; background: #5b7f64; color: #fff; - text-align: center; - padding: 0 0.5em; + padding: 0.2em 0.5em 0em 0.7em; margin: 0; + border-radius: 5px; } -/* this might not work in certain browsers */ -a[name="Stable"] + h4 { - background: #bdee9d url(../pictures/color1-bg.png) repeat-x top left; -} - -/* this might not work in certain browsers */ -a[name="Unstable"] + h4 { - background: #fad58c url(../pictures/color3-bg.png) repeat-x top left; -} - -#latestVersion .subsubheading { - padding: 0.08em 0.25em; - border-bottom: 1px solid #5b7f64; +#homePageSideBar p, +#pondingsText { + padding: 0.7em 0.5em; margin: 0; } -#latestVersion p { - font-size: 90%; - padding: 0.5em; - margin: 0; +/* for better spacing between "download" and "manuals" links */ +#homePageSideBar p:nth-of-type(2n) { + padding-top: 0; + margin-top: -3px; } div#footer { @@ -613,7 +473,7 @@ h1.unnumbered, h2.unnumberedsec, h3.unnumberedsubsec { table { text-align: left; padding: 0 0 0 0.5em; - border-left: 3px solid green; + border-left: 3px solid #5b7f64; margin: 1em 0 0 1em; } @@ -678,6 +538,8 @@ div.float-right a.clickable { } /* Columns */ + +/* color1 */ .column-center-top { float: left; width: 99.5%; @@ -686,11 +548,14 @@ div.float-right a.clickable { margin: 1em auto; } -/* color1 */ -.column-center-top h3 { - background: #9ccc7c url(../pictures/color1-bg.png) repeat-x top left; +.column-center-middle-color2, +.column-center-middle-color3, +.news-item { + clear: both; + float: left; + width: 99.5%; text-align: left; - border-bottom: 1px solid #9ccc7c; + margin: 1em auto; } .column-left-top { @@ -706,18 +571,6 @@ div.float-right a.clickable { margin: 1em 0; } -.column-left-top, -.column-left-bottom { - border: 1px solid #adce82; -} - -/* color2 */ -.column-left-top h3, -.column-left-bottom h3 { - background: #adce82 url(../pictures/color2-bg.png) repeat-x top left; - border-bottom: 1px solid #adce82; -} - .column-right-top { float: right; width: 49%; @@ -730,54 +583,110 @@ div.float-right a.clickable { margin: 1em 0; } -.column-right-top, -.column-right-bottom { - border: 1px solid #bdd088; +/* color2 */ +.column-left-top, +.column-left-bottom, +.column-center-middle-color2, +.news-item { + border: 1px solid #adce82; } /* color3 */ -.column-right-top h3, -.column-right-bottom h3 { - background: #bdd088 url(../pictures/color3-bg.png) repeat-x top left; - border-bottom: 1px solid #bdd088; +.column-right-top, +.column-right-bottom, +.column-center-middle-color3 { + border: 1px solid #bdd088; } +/* color4 */ .column-center-bottom { clear: both; + float: left; width: 99.5%; text-align: center; border: 1px solid #ccd38f; margin: 1em auto 0; } -/* color4 */ -.column-center-bottom h3 { - background: #ccd38f url(../pictures/color4-bg.png) repeat-x top left; - text-align: left; - border-bottom: 1px solid #ccd38f; -} - .column-center-top, +.column-center-middle-color2, +.column-center-middle-color3, .column-center-bottom, .column-left-top, .column-left-bottom, .column-right-top, -.column-right-bottom { - background: #f5fffa; +.column-right-bottom, +.news-item { + background: #fff; + border-radius: 5px; +} + +/* color1 */ +.column-center-top h3 { + background: #9ccc7c; + background: linear-gradient(to top, + rgb(140, 210, 118), + rgb(212, 242, 201)); + text-align: left; + border-bottom: 1px solid #9ccc7c; +} + +/* color2 */ +.column-left-top h3, +.column-left-bottom h3, +.column-center-middle-color2 h3, +.news-item h3 { + background: #adce82; + background: linear-gradient(to top, + rgb(173, 206, 130), + rgb(221, 243, 204)); + border-bottom: 1px solid #adce82; +} + +.news-item h3 { + font-size: 15.2px; +} + +/* color3 */ +.column-right-top h3, +.column-right-bottom h3, +.column-center-middle-color3 h3 { + background: #bdd088; + background: linear-gradient(to top, + rgb(189, 208, 136), + rgb(231, 243, 207)); + border-bottom: 1px solid #bdd088; +} + +/* color4 */ +.column-center-bottom h3 { + background: #ccd38f; + background: linear-gradient(to top, + rgb(204, 211, 143), + rgb(237, 244, 208)); + text-align: left; + border-bottom: 1px solid #ccd38f; } .column-center-top h3, +.column-center-middle-color2 h3, +.column-center-middle-color3 h3, .column-center-bottom h3, .column-left-top h3, .column-left-bottom h3, .column-right-top h3, -.column-right-bottom h3 { +.column-right-bottom h3, +.news-item h3 { text-align: left; - padding: 0 0.5em; + padding: 3px 0.5em 0; margin: 0; + border-top-left-radius: 5px; + border-top-right-radius: 5px; } .column-center-top h4, +.column-center-middle-color2 h4, +.column-center-middle-color3 h4, .column-center-bottom h4, .column-left-top h4, .column-left-bottom h4, @@ -789,6 +698,8 @@ div.float-right a.clickable { } .column-center-top ul, +.column-center-middle-color2 ul, +.column-center-middle-color3 ul, .column-center-bottom ul, .column-left-top ul, .column-left-bottom ul, @@ -800,6 +711,8 @@ div.float-right a.clickable { } .column-center-top li, +.column-center-middle-color2 li, +.column-center-middle-color3 li, .column-center-bottom li, .column-left-top li, .column-left-bottom li, @@ -811,6 +724,8 @@ div.float-right a.clickable { } .column-center-top p, +.column-center-middle-color2 p, +.column-center-middle-color3 p, .column-center-bottom p, .column-left-top p, .column-left-bottom p, @@ -821,6 +736,10 @@ div.float-right a.clickable { .column-center-top img.float-left, .column-center-top img.float-right, +.column-center-middle-color2 img.float-left, +.column-center-middle-color2 img.float-right, +.column-center-middle-color3 img.float-left, +.column-center-middle-color3 img.float-right, .column-center-bottom img.float-left, .column-center-bottom img.float-right, .column-left-top img.float-left, @@ -834,62 +753,6 @@ div.float-right a.clickable { margin: 0.5em; } -/* Centered divs by color */ -div.color1, -div.color2, -div.color3, -div.color4 { - clear: both; - width: 99.5%; - background: #f5fffa; - margin: 1em auto; -} - -div.color1 h3, -div.color2 h3, -div.color3 h3, -div.color4 h3 { - padding: 0 0.5em; - margin: 0; -} - -div.color1 { - border: 1px solid #9ccc7c; - margin: 1em auto; -} - -div.color1 h3 { - background: #9ccc7c; - border-bottom: 1px solid #9ccc7c; -} - -div.color2 { - border: 1px solid #adce82; -} - -div.color2 h3 { - background: #adce82; - border-bottom: 1px solid #adce82; -} - -div.color3 { - border: 1px solid #bdd088; -} - -div.color3 h3 { - background: #bdd088; - border-bottom: 1px solid #bdd088; -} - -div.color4 { - border: 1px solid #ccd38f; -} - -div.color4 h3 { - background: #ccd38f; - border-bottom: 1px solid #ccd38f; -} - .keep-bullets ul { list-style-type: disc; padding: 0; @@ -931,38 +794,26 @@ div.color4 h3 { overflow: auto; } -.warning { +.warning, +.contactBox { background: #eef; text-align: left; - padding: 0; - border: 1px solid green; - /* Experimental rounded corners */ - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - border-radius: 10px; margin: 1em; -} - -.warning p { - padding: 0.5em; - margin: 0; + padding: 0; + border: 1px solid rgb(160, 160, 175); + border-radius: 5px; } .contactBox { float: left; - background: #eef; - text-align: left; - border: 1px solid green; - padding: 0; - margin: 1em; } +.warning p, .contactBox p { padding: 0.5em; margin: 0; } - .hide { position: relative; text-indent: -999em; diff --git a/Documentation/de/essay.tely b/Documentation/de/essay.tely index adf0ff03e6..3162ff78e1 100644 --- a/Documentation/de/essay.tely +++ b/Documentation/de/essay.tely @@ -1,4 +1,4 @@ -\input texinfo @c -*- coding: utf-8; mode: texinfo; -*- +\input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore Translation of GIT committish: ebe492ca408fb0d9abf80b94c56197eef8dc2f09 @@ -23,7 +23,7 @@ LilyPond Version @version{}. @c `Essay' was born 2002-06-03 with git commit e38f5fc... @macro copyrightDeclare -Copyright @copyright{} 2002--2012 bei den Autoren. +Copyright @copyright{} 2002--2015 bei den Autoren. @end macro @set FDL diff --git a/Documentation/de/essay/engraving.itely b/Documentation/de/essay/engraving.itely index 0affa3b9e5..6588d3cb60 100644 --- a/Documentation/de/essay/engraving.itely +++ b/Documentation/de/essay/engraving.itely @@ -1,4 +1,4 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 @@ -9,7 +9,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.24" @c Translators: Till Paala @@ -481,7 +481,7 @@ friedlich nebeneinander auf der gleichen Seite erscheinen: @c line weights be scaled for small staves? @c Grieg's Violin Sonata Op. 45 -@lilypond[indent=1.5cm] +@lilypond[indent=1.5\cm] global = { \time 6/8 \key c \minor @@ -494,22 +494,22 @@ global = { \override StaffSymbol.staff-space = #(magstep -4) \override StaffSymbol.thickness = #(magstep -3) } - \relative c' { + \relative { \global \set Staff.instrumentName = #"Violin" - c8.(\f^> b16 c d) ees8.(^> d16 c b) + c'8.(\f^> b16 c d) ees8.(^> d16 c b) g8.(^> b16 c ees) g8-.^> r r R2. } \new PianoStaff << \set PianoStaff.instrumentName = #"Piano" - \new Staff \relative c' { + \new Staff \relative { \global s2. - s4. s8 r8 r16 + s4. s8 r8 r16 4.^> 8 r r } - \new Staff \relative c { + \new Staff \relative { \global \clef "bass" << @@ -601,7 +601,7 @@ Anders gesagt: welcher von den drei Konfigurationen sollte für den folgenden Bogen ausgewählt werden? @lilypond -\relative c { +\relative { \clef bass \once \override Slur.positions = #'(1.5 . 1) e8[( f] g[ a b d,)] r4 @@ -644,7 +644,7 @@ verliehen. Das erste Beispiel erhält 15.39 Punkte, weil einer der Notenköpfe angeschnitten wird: @lilypond -\relative c { +\relative { \clef bass \once \override Slur.positions = #'(1.5 . 1) e8[(_"15.39" f] g[ a b d,)] r4 @@ -658,7 +658,7 @@ und 9.37 Punkte auf der rechten Seite verliehen, plus weiteren Insgesamt also 13.08 Punkte: @lilypond -\relative c { +\relative { \clef bass \once \override Slur.positions = #'(2 . 3) e8[(_"13.08" f] g[ a b d,)] r4 @@ -670,7 +670,7 @@ Der letzte Bogen erhält 10.04 Punkte für die Lücke rechts und der drei Varianten, sodass LilyPond ihn auswählt: @lilypond -\relative c { +\relative { \clef bass e8[(_"12.04" f] g[ a b d,)] r4 } @@ -796,10 +796,10 @@ dem Wohltemperierten Clavier 1, BWV 861 von J. S. Bach entschieden, mit dem Hauptthema: @lilypond -\relative c' { +\relative { \key g \minor \clef "treble_8" - r8 d ees g, fis4 g + r8 d' ees g, fis4 g r8 a16 bes c8 bes16 a bes8 } @end lilypond @@ -833,24 +833,24 @@ Version von LilyPond: @lilypond[staffsize=19.5,line-width=14\cm] global = { \key g \minor } -partI = \relative c' { +partI = \relative { \voiceOne - fis8 d' ees g, fis4 g + fis'8 d' ees g, fis4 g r8 a16 bes c8 bes16 a d8 r r4 } -partII = \relative c' { +partII = \relative { \voiceTwo - d4 r4 r8 d'16 c bes8 c16 d + d'4 r4 r8 d'16 c bes8 c16 d ees8 d c ees a, r r4 } -partIII = \relative c' { +partIII = \relative { \voiceOne - r2 r8 d ees g, fis4 g r8 a16 bes c8 bes16 a + r2 r8 d' ees g, fis4 g r8 a16 bes c8 bes16 a } -partIV = \relative c { +partIV = \relative { \voiceTwo d4 r r2 r8 d ees g, fis4 a @@ -919,7 +919,7 @@ collide = \once \override NoteColumn.force-hshift = #0 \new Voice { \voiceTwo bes \collide bes } >> } - \new Lyrics \lyricsto "sample" \lyricmode { "good " " bad" } + \new Lyrics \lyricsto "sample" { "good " " bad" } >> } @end lilypond @@ -1046,8 +1046,8 @@ gewährleistet durch sog. @emph{music expressions} (Musikausdrücke): indem kleine Teile zu größeren kombiniert werden, kann komplexere Musik dargestellt werden. So etwa hier: -@lilypond[quote,verbatim,fragment,relative=1] -f4 +@lilypond[quote,verbatim,fragment] +f'4 @end lilypond @noindent @@ -1105,12 +1105,12 @@ Nehmen wir etwa die hierarchische Natur der Musiknotation: @lilypond[quote,fragment] << - \new Staff \relative c'' { + \new Staff \relative { \key g \major \time 3/4 - d4 g,8 a b c d4 g, g + d''4 g,8 a b c d4 g, g } - \new Staff \relative c' { + \new Staff \relative { \clef "bass" \key g \major 2 a4 b2. @@ -1151,16 +1151,16 @@ Beispiel heranzieht: \new PianoStaff << \new Staff = "RH" << - \new Voice = "I" \relative c''' { + \new Voice = "I" \relative { \time 3/4 \voiceOne - \tuplet 7/6 { g8 g g g g g g } + \tuplet 7/6 { g''8 g g g g g g } \oneVoice r4 r4\fermata } - \new Voice = "II" \relative c' { + \new Voice = "II" \relative { \voiceTwo - c4 + c'4 \tuplet 5/4 { 8 f g \change Staff = "LH" \oneVoice @@ -1172,7 +1172,7 @@ Beispiel heranzieht: } >> \new Staff = "LH" << - \new Voice = "III" \relative c' { + \new Voice = "III" \relative { \time 2/4 \clef "bass" g4 \stopStaff s @@ -1455,8 +1455,8 @@ ausgerichtet, beim zweiten nach oben (rechts). @lilypond[quote,ragged-right] \score { - \relative c' { - \stemDown 4_>-\arpeggio + \relative { + \stemDown 4_>-\arpeggio \override Arpeggio.direction = #RIGHT \stemUp 4^>-\arpeggio } @@ -1524,11 +1524,11 @@ die Notenköpfe gezeichnet werden, während des Ausschnitts verändert. ((-2) (make-smaller-markup (make-bold-markup "2"))) (else "bla"))))))))) -\new Voice \relative c' { +\new Voice \relative { \stemUp \set autoBeaming = ##f \time 2/4 - 4 + 4 \once \override NoteHead.stencil = #note-head::brew-ez-stencil \once \override NoteHead.font-size = #-7 \once \override NoteHead.font-family = #'sans @@ -1536,11 +1536,11 @@ die Notenköpfe gezeichnet werden, während des Ausschnitts verändert. 4 \once \override NoteHead.style = #'cross 4 - \applyOutput #'Voice #mc-squared + \applyOutput Voice #mc-squared 4 << { d8[ es-( fis^^ g] fis2-) } - \repeat unfold 5 { \applyOutput #'Voice #mc-squared s8 } + \repeat unfold 5 { \applyOutput Voice #mc-squared s8 } >> } @end lilypond @@ -1574,9 +1574,9 @@ ein Liedblatt. << \chords { c2 c f2 c } \new Staff - \relative c' { + \relative { \time 2/4 - c4 c g' g a a g2 + c'4 c g' g a a g2 } \addlyrics { twin -- kle twin -- kle lit -- tle star } >> @@ -1751,42 +1751,42 @@ LilyPond, version @version{}: @lilypond[staffsize=14.3,line-width=15.9\cm] global = {\key g \minor} -partI = \relative c' { +partI = \relative { \voiceOne - fis8 d' ees g, fis4 g + fis'8 d' ees g, fis4 g r8 a16 bes c8 bes16 a d8 r r4 r2 r8 d16 ees f8 ees16 d - ees4 ~ ees16 d c bes a4 r8 ees'16 d + ees4 ~ 16 d c bes a4 r8 ees'16 d c8 d16 ees d8 e16 fis g8 fis16 g a4 ~ - a8 d, g f ees d c bes + 8 d, g f ees d c bes a2 g\fermata \bar "|." } -partII = \relative c' { +partII = \relative { \voiceTwo - d4 r4 r8 d'16 c bes8 c16 d + d'4 r4 r8 d'16 c bes8 c16 d ees8 d c ees a, r r4 r8 fis16 g a8 g16 fis g2 ~ - g2 r8 d' ees g, + 2 r8 d' ees g, fis4 g r8 a16 bes c8 bes16 a bes4. 8
r r 4 d2 } -partIII = \relative c' { +partIII = \relative { \voiceOne - r2 r8 d ees g, fis4 g r8 a16 bes c8 bes16 a - bes2 ~ bes8 b16 a g8 a16 b + r2 r8 d' ees g, fis4 g r8 a16 bes c8 bes16 a + bes2 ~ 8 b16 a g8 a16 b c4 r r2 R1 r8 d ees g, fis4 g r8 a16 bes c8 bes16 a b2 } -partIV = \relative c { +partIV = \relative { \voiceTwo d4 r r2 r8 d ees g, fis4 a d,8 d'16 c bes8 c16 d ees2 ~ - ees8 ees16 d c8 d16 ees fis,8 a16 g fis8 g16 a + 8 ees16 d c8 d16 ees fis,8 a16 g fis8 g16 a d,8 d'16 c bes8 c16 d ees8 c a fis' g f ees d c bes a g c a d d, g2\fermata @@ -1825,4 +1825,3 @@ partIV = \relative c { } } @end lilypond - diff --git a/Documentation/de/extending.tely b/Documentation/de/extending.tely index b3f6f7c5f6..dfd922f4e2 100644 --- a/Documentation/de/extending.tely +++ b/Documentation/de/extending.tely @@ -1,4 +1,4 @@ -\input texinfo @c -*- coding: utf-8; mode: texinfo; -*- +\input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore Translation of GIT committish: ebe492ca408fb0d9abf80b94c56197eef8dc2f09 @@ -22,7 +22,7 @@ LilyPond Version @version{} erweitern kann. @c `Extending' was born 2003-04-23 with git commit c08f6e8... @macro copyrightDeclare -Copyright @copyright{} 2003--2012 bei den Autoren. +Copyright @copyright{} 2003--2015 bei den Autoren. @end macro @set FDL @@ -46,7 +46,7 @@ Copyright @copyright{} 2003--2012 bei den Autoren. @ifnottex @menu -* Scheme-Übung:: Programmieren innerhalb von LilyPond. +* Scheme-Tutorium:: Programmieren innerhalb von LilyPond. * Schnittstellen für Programmierer:: Wie man mit Scheme kommunizieren kann. * LilyPond Scheme-Schnittstellen:: Information in die Noten senden und aus den Noten erhalten. diff --git a/Documentation/de/extending/programming-interface.itely b/Documentation/de/extending/programming-interface.itely index 4b1b43a006..c5d0381bf2 100644 --- a/Documentation/de/extending/programming-interface.itely +++ b/Documentation/de/extending/programming-interface.itely @@ -1,4 +1,4 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.24" @c Translators: Till Paala @@ -19,7 +19,7 @@ Fortgeschrittene Anpassungen können mithilfe der Programmiersprache Scheme vorgenommen werden. Wenn Sie Scheme nicht kennen, gibt es eine grundlegende Einleitung in LilyPonds -@ref{Scheme-Übung}. +@ref{Scheme-Tutorium}. @menu * LilyPond-Codeabschnitte:: @@ -95,7 +95,7 @@ Die übliche Form zur Definition von Scheme-Funktionen ist: @example function = #(define-scheme-function - (parser location @var{Arg1} @var{Arg2} @dots{}) + (@var{Arg1} @var{Arg2} @dots{}) (@var{Typ1?} @var{Typ2?} @dots{}) @var{body}) @end example @@ -183,12 +183,12 @@ vermeiden sollte, wenn man eine bestimmmte Verwendung beabsichtigt und nicht nur eine Funktion für die allgemeine Verwendung schreibt. Eine Liste der möglichen vordefinierten Typenprädikte findet sich in -@ruser{Vordefinierte Typenprädikate}. +@ruser{Vordefinierte Typprädikate}. @seealso Notationsreferenz -@ruser{Vordefinierte Typenprädikate}. +@ruser{Vordefinierte Typprädikate}. Installierte Dateien: @file{lily/music-scheme.cc}, @@ -261,7 +261,7 @@ Prädikat @code{void?} erfüllt) wiedergegeben wird. @example noPointAndClick = #(define-void-function - (parser location) + () () (ly:set-option 'point-and-click #f)) ... @@ -311,7 +311,7 @@ Die allgemeine Form zur Definition musikalischer Funktionen ist: @example function = #(define-music-function - (parser location @var{Arg1} @var{Arg2} @dots{}) + (@var{Arg1} @var{Arg2} @dots{}) (@var{Typ1?} @var{Typ2?} @dots{}) @var{body}) @end example @@ -322,12 +322,12 @@ In der Mehrzahl der Fälle ist @var{body} ein LilyPond-Codeabschnitt (siehe @ref{LilyPond-Codeabschnitte}. Eine Liste der möglichen Typenprädikate findet sich in -@ruser{Vordefinierte Typenprädikate}. +@ruser{Vordefinierte Typprädikate}. @seealso Notationsreferenz: -@ruser{Vordefinierte Typenprädikate}. +@ruser{Vordefinierte Typprädikate}. Installierte Dateien: @file{lily/music-scheme.cc}, @@ -403,7 +403,7 @@ mit der Variable @code{pair?} weitergeleitet werden: @example manualBeam = #(define-music-function - (parser location beg-end) + (beg-end) (pair?) #@{ \once \override Beam.positions = #beg-end @@ -422,7 +422,7 @@ augenommen werden: @lilypond[quote,verbatim,ragged-right] manualBeam = #(define-music-function - (parser location beg end) + (beg end) (number? number?) #{ \once \override Beam.positions = #(cons beg end) @@ -444,7 +444,7 @@ auch Scheme-Programmcode enthalten: @lilypond[quote,verbatim,ragged-right] AltOn = #(define-music-function - (parser location mag) + (mag) (number?) #{ \override Stem.length = #(* 7.0 mag) @@ -457,8 +457,8 @@ AltOff = { \revert NoteHead.font-size } -\relative c' { - c2 \AltOn #0.5 c4 c +\relative { + c'2 \AltOn #0.5 c4 c \AltOn #1.5 c c \AltOff c2 } @end lilypond @@ -470,7 +470,7 @@ zu integrieren: @lilypond[quote,verbatim,ragged-right] withAlt = #(define-music-function - (parser location mag music) + (mag music) (number? ly:music?) #{ \override Stem.length = #(* 7.0 mag) @@ -481,8 +481,8 @@ withAlt = \revert NoteHead.font-size #}) -\relative c' { - c2 \withAlt #0.5 { c4 c } +\relative { + c'2 \withAlt #0.5 { c4 c } \withAlt #1.5 { c c } c2 } @end lilypond @@ -505,7 +505,7 @@ musikalische Funktion ohne Argumente zu erstellen: @example displayBarNum = #(define-music-function - (parser location) + () () (if (eq? #t (ly:get-option 'display-bar-numbers)) #@{ \once \override Score.BarNumber.break-visibility = ##f #@} @@ -552,9 +552,9 @@ angehängt, wie @code{c'\pp}. Das Folgende ist eine Möglichkeit, beliebige Dynamikbefehle zu schreiben: @lilypond[quote,verbatim,ragged-right] -dyn=#(define-event-function (parser location arg) (markup?) +dyn=#(define-event-function (arg) (markup?) (make-dynamic-script arg)) -\relative c' { c\dyn pfsss } +\relative { c'\dyn pfsss } @end lilypond Man kann das Gleiche auch mit einer musikalischen Funktion erreichen, aber dann @@ -1187,8 +1187,8 @@ werden kann; sie macht Notenköpfe auf und neben der Mittellinie unsichtbar: (< (abs (ly:grob-property grob 'staff-position)) 2)) (set! (ly:grob-property grob 'transparent) #t))) -\relative c' { - a'4 e8 <<\applyOutput #'Voice #blanker a c d>> b2 +\relative { + a'4 e8 <<\applyOutput Voice #blanker a c d>> b2 } @end lilypond @@ -1206,12 +1206,12 @@ usw.) können mit @code{\override} auf feste Werte gesetzt werden, etwa: Eigenschaften können auch auf eine Scheme-Prozedur gesetzt werden: -@lilypond[fragment,verbatim,quote,relative=2] +@lilypond[fragment,verbatim,quote] \override Stem.thickness = #(lambda (grob) (if (= UP (ly:grob-property grob 'direction)) 2.0 7.0)) -c b a g b a g b +\relative { c'' b a g b a g b } @end lilypond @noindent @@ -1300,8 +1300,8 @@ ergibt einen Syntaxfehler: @example F = \tweak font-size #-3 -\flageolet -\relative c'' @{ - c4^\F c4_\F +\relative @{ + c''4^\F c4_\F @} @end example @@ -1319,8 +1319,8 @@ F = #(let ((m (make-music 'ArticulationEvent (ly:music-property m 'tweaks))) m) -\relative c'' @{ - c4^\F c4_\F +\relative @{ + c''4^\F c4_\F @} @end example @@ -1396,10 +1396,10 @@ neu ausgerichtet wird. (eq? (car (last-pair siblings)) grob)) (ly:grob-set-property! grob 'extra-offset '(-2 . 5))))) -\relative c'' { +\relative { \override Tie.after-line-breaking = #my-callback - c1 ~ \break c2 ~ c + c''1 ~ \break c2 ~ 2 } @end lilypond diff --git a/Documentation/de/extending/scheme-tutorial.itely b/Documentation/de/extending/scheme-tutorial.itely index 954f1dce5c..6213ffdd29 100644 --- a/Documentation/de/extending/scheme-tutorial.itely +++ b/Documentation/de/extending/scheme-tutorial.itely @@ -8,10 +8,10 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.22" -@node Scheme-Übung -@chapter Scheme-Übung +@node Scheme-Tutorium +@chapter Scheme-Tutorium @translationof Scheme tutorial @@ -1106,7 +1106,6 @@ um komplizierte musikalische Funktionen zu erstellen. @cindex Musikausdrücke anzeigen @cindex Anzeigen von Musikausdrücken -@funindex displayMusic @funindex \displayMusic Wenn man eine musikalische Funktion erstellt, ist es oft @@ -1262,7 +1261,6 @@ Die Tonhöhe einer Note kann geändert werden, indem man diese @code{'pitch}-Eigenschaft umdefiniert: @funindex \displayLilyMusic -@funindex displayLilyMusic @example #(set! (ly:music-property (first (ly:music-property someNote 'elements)) @@ -1343,7 +1341,7 @@ keine speziellen Überprüfungen nötig sind, bevor ein anderes Element vor die @code{articulations}-Eigenschaft gesetzt wird. @example -doubleSlur = #(define-music-function (parser location note) (ly:music?) +doubleSlur = #(define-music-function (note) (ly:music?) "Return: @{ note ( note ) @}. `note' is supposed to be a single note." (let ((note2 (ly:music-deep-copy note))) @@ -1364,7 +1362,7 @@ doubleSlur = #(define-music-function (parser location note) (ly:music?) Am einfachsten können Artikulationszeichen zu Noten hinzugefügt werden, indem man zwei musikalische Funktionen in einen Kontext einfügt, wie erklärt in -@ruser{Kontexte erstellen}. Hier soll jetzt eine musikalische +@ruser{Kontexte erstellen und referenzieren}. Hier soll jetzt eine musikalische Funktion entwickelt werden, die das vornimmt. Daraus ergibt sich der zusätzliche Vorteil, dass diese musikalische Funktion eingesetzt werden kann, um eine Artikulation (wie etwa eine Fingersatzanweisung) @@ -1543,7 +1541,7 @@ Funktion umgewandelt (hierzu gehört etwas syntaktischer Zuckerguß und eine Deklaration des Typs ihres einzigen @qq{wirklichen} Arguments: @example -addAccent = #(define-music-function (parser location note-event) +addAccent = #(define-music-function (note-event) (ly:music?) "Add an accent ArticulationEvent to the articulations of `note-event', which is supposed to be a NoteEvent expression." @@ -1576,7 +1574,7 @@ Wir haben gesehen wie LilyPond-Eingabe massiv beeinflusst werden kann, indem Befehle wie etwa @code{\override TextScript.extra-offset = ( 1 . -1)} benutzt werden. Aber es wurde gezeigt, dass Scheme noch -mächtiger ist. Eine bessere Erklärung findet sich in der@ref{Scheme-Übung} und in +mächtiger ist. Eine bessere Erklärung findet sich in der@ref{Scheme-Tutorium} und in @ruser{Schnittstellen für Programmierer}. Scheme kann auch in einfachen @code{\override}-Befehlen @@ -1588,13 +1586,13 @@ TODO Find a simple example @lilypond[quote,verbatim,ragged-right] -padText = #(define-music-function (parser location padding) (number?) +padText = #(define-music-function (padding) (number?) #{ \once \override TextScript.padding = #padding #}) -\relative c''' { - c4^"piu mosso" b a b +\relative { + c'''4^"piu mosso" b a b \padText #1.8 c4^"piu mosso" d e f \padText #2.6 @@ -1609,16 +1607,16 @@ Es kann auch benutzt werden, um Befehle zu erstellen: @c It is - 'padding still works @lilypond[quote,verbatim,ragged-right] -tempoPadded = #(define-music-function (parser location padding tempotext) +tempoPadded = #(define-music-function (padding tempotext) (number? markup?) #{ \once \override Score.MetronomeMark.padding = #padding \tempo \markup { \bold #tempotext } #}) -\relative c'' { +\relative { \tempo \markup { "Low tempo" } - c4 d e f g1 + c''4 d e f g1 \tempoPadded #4.0 "High tempo" g4 f e d c1 } @@ -1627,7 +1625,7 @@ tempoPadded = #(define-music-function (parser location padding tempotext) Sogar ganze Musikausdrücke können eingefügt werden: @lilypond[quote,verbatim,ragged-right] -pattern = #(define-music-function (parser location x y) (ly:music? ly:music?) +pattern = #(define-music-function (x y) (ly:music? ly:music?) #{ #x e8 a b $y b a e #}) diff --git a/Documentation/de/included/generating-output.itexi b/Documentation/de/included/generating-output.itexi index c3b51cc8af..f94856d979 100644 --- a/Documentation/de/included/generating-output.itexi +++ b/Documentation/de/included/generating-output.itexi @@ -1,4 +1,4 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @c This file is part of web/download.itexi and @c learning/tutorial.itely @@ -234,5 +234,3 @@ Standardprogrammen Ihres Betriebssystemes anschauen können. @end macro - - diff --git a/Documentation/de/included/helpus.itexi b/Documentation/de/included/helpus.itexi index 07a07ae5ba..288efff45a 100644 --- a/Documentation/de/included/helpus.itexi +++ b/Documentation/de/included/helpus.itexi @@ -1,4 +1,4 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @c This file is part of web/community.itexi and @c contributor/introduction.itely @@ -29,7 +29,7 @@ oft schwierig zu entscheiden, wo man anfangen soll. Zusätzlich zu den Vorschlägen, die sich weiter unten finden, können Sie auch eine E-Mail (auf Englisch) an den @email{mike@@mikesolomon.org, Frog meister} schicken und Ihre Fähigkeiten mitteilen, sodass er Ihnen einen Einstieg -zeigen oder Ihnen bei ihren eigenen Projekten helfen kann. +zeigen oder Ihnen bei ihren eigenen Projekten helfen kann. @end macro @@ -185,5 +185,3 @@ bewerkstelligt werden können. @end macro @end ignore - - diff --git a/Documentation/de/learning.tely b/Documentation/de/learning.tely index ce9c6926b6..30ff306960 100644 --- a/Documentation/de/learning.tely +++ b/Documentation/de/learning.tely @@ -1,6 +1,6 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: ebe492ca408fb0d9abf80b94c56197eef8dc2f09 + Translation of GIT committish: 8819d7cb0ba2ab359e4aa2276695afb9c1957c42 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -17,11 +17,16 @@ Diese Datei stellt eine Einleitung für LilyPond Version @version{} zur Verfügung. @end macro -@c `Learning Manual' was born 1999-10-10 with git commit b9abaac... +@c `Learning Manual' was born 1998-08-14 with this commit: +@c release: 1.0.2 +@c author: Han-Wen Nienhuys +@c commit: a3a44f9f3c581b6824b3a65f9039656693e09bbf +@c file: Documentation/tex/tutorial.yo + @macro copyrightDeclare -Copyright @copyright{} 1999--2012 bei den Autoren. +Copyright @copyright{} 1999--2015 bei den Autoren. @end macro - + @set FDL @include macros.itexi @@ -36,7 +41,7 @@ Copyright @copyright{} 1999--2012 bei den Autoren. @omflanguage German @end ignore -@c Translators: Till Paala +@c Translators: Till Paala, Michael Gerdau @lilyTitlePage{Learning Manual} @@ -77,10 +82,10 @@ finden sich Kopien dieser und anderer Dokumentationsdateien. @ifnottex @menu @c * Vorwort:: Vorwort. -* Übung:: Eine Übung zur Einführung. -* Übliche Notation:: Die häufigsten Notationsfälle. +* Tutorium:: Eine Übung zur Einführung. +* Übliche Notation:: Die häufigsten Notationsfälle. * Grundbegriffe:: Grundlegende Konzepte, die benötigt werden, um den Rest dieses Handbuchs zu lesen. -* Die Ausgabe verändern:: Einleitung in die Beeinflussung des Notenbilds. +* Die Ausgabe verbessern:: Einleitung in die Beeinflussung des Notenbilds. Anhänge diff --git a/Documentation/de/learning/common-notation.itely b/Documentation/de/learning/common-notation.itely index e108d0b0c0..f74f53beb8 100644 --- a/Documentation/de/learning/common-notation.itely +++ b/Documentation/de/learning/common-notation.itely @@ -1,27 +1,29 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 + Translation of GIT committish: 8819d7cb0ba2ab359e4aa2276695afb9c1957c42 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes. @end ignore -@c \version "2.17.28" +@c \version "2.19.21" + +@c Translators: ???, Michael Gerdau @ignore -Tutorial guidelines: -- unless you have a really good reason, use either - @l ilypond[quote,verbatim] - or - @l ilypond[quote,verbatim,fragment,relative=2] - (without spaces) - Don't use any other relative=X commands. - -- 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. +Tutorial guidelines: (different from policy.txt!) +- unless you have a really good reason, use + @lilypond[verbatim,quote] + +- use "aes" and "ees" instead of "as" and "es". I know it's not + correct Dutch naming, but let's not confuse people with this + until we get to the Basic notation chapter. + +- Add "Music Glossary: @rglos{foo}" to the *top* of the relevant + portions of the tutorial. + - addition for German users to the pitches chapter about naming of pitches. @end ignore @@ -32,7 +34,7 @@ Tutorial guidelines: Dieser Abschnitt erklärt, wie wunderschöner Notensatz erstellt werden kann, der die am häufigsten vorkommenden Notationssymbole -enthält. Der Abschnitt baut auf der @ref{Übung} auf. +enthält. Der Abschnitt baut auf der @ref{Tutorium} auf. @menu @@ -51,8 +53,8 @@ Dieses Kapitel lehrt grundlegende Bestandteile der Notation, die für eine Stimme auf einem System gebraucht werden. @menu -* Taktüberprüfung -* Versetzungszeichen und Tonartbezeichnung (Vorzeichen):: +* Taktstriche und Taktüberprüfung:: +* Tonhöhen und Tonartbezeichnungen (Vorzeichen):: * Bindebögen und Legatobögen:: * Artikulationszeichen und Lautstärke:: * Text hinzufügen:: @@ -61,34 +63,88 @@ die für eine Stimme auf einem System gebraucht werden. @end menu -@node Taktüberprüfung -@subsection Taktüberprüfung +@node Taktstriche und Taktüberprüfung +@subsection Taktstriche und Taktüberprüfung +@translationof Bar lines and bar checks + +@menu +* Taktstriche:: +* Taktüberprüfungen:: +@end menu + +@node Taktstriche +@unnumberedsubsubsec Taktstriche +@translationof Bar lines + + +Normale (einfache) Taktstriche werden von LilyPond automatisch eingefügt und +müssen daher nicht extra angegeben werden. Andere Arten von Taktstrichen können +mittels @code{\bar} eingeben werden, z.B. @code{\bar "||"} für einen doppelten Taktstrich, +oder @code{\bar "|."} für einen Schlusstaktstrich. Eine vollständige Liste aller +möglichen Taktstriche findet sich unter @ruser{Taktstriche}. + +@lilypond[verbatim,quote] +\relative { g'1 e1 \bar "||" c2. c'4 \bar "|." } +@end lilypond + +@node Taktüberprüfungen +@unnumberedsubsubsec Taktüberprüfungen @translationof Bar checks + Wenn sie auch nicht zwingend vorgeschrieben sind, so sollten Taktüberprüfungen in der Eingabedatei benutzt werden, um zu zeigen, wo Taktstriche normalerweise sein sollten. Sie werden mit dem @qq{Pipe}-Symbol ( @code{|}) notiert (Taste AltGr + <). Mithilfe der Taktüberprüfungen -kann das Programm sicherstellen, dass die eingegebenen Notenlängen auch -volle Takte an den richtigen Stellen ergeben. Taktüberprüfungen erleichtern +kann das Programm sicherstellen, dass die eingegebenen Notenlängen jeweils +volle Takte ergeben. Taktüberprüfungen erleichtern auch das Lesen des Eingabetextes, weil sie Ordnung in den Text bringen. -@lilypond[verbatim,quote,relative=2] -g1 | e1 | c2. c'4 | g4 c g e | c4 r r2 | +@c This example deliberately produces a warning +@lilypond[verbatim,quote] +\relative { + g'1 | e1 | c2. c' | g4 c g e | c4 r r2 | +} @end lilypond +Wenn du den Code in obigem Beispiel übersetzt, dann sollte in der Konsole +die folgende Warnung erscheinen: + +@example +Warnung: Taktüberprüfung gescheitert bei: 1/2 + g'1 | e1 | c2. c' + | g4 c g e | c4 r r2 | +@end example + +In diesem einfachen Beispiel ist die fehlende Längenangabe offensichtlich +deutlich im erzeugten Notenbild zu erkennen, aber die Konsolenausgabe ist +ein noch direkter Hinweis auf das fehlende @code{4} in Takt 3. + @seealso Notationsreferenz: @ruser{Takt- und Taktzahlüberprüfung}. -@node Versetzungszeichen und Tonartbezeichnung (Vorzeichen) -@subsection Versetzungszeichen und Tonartbezeichnung (Vorzeichen) -@translationof Accidentals and key signatures +@node Tonhöhen und Tonartbezeichnungen (Vorzeichen) +@subsection Tonhöhen und Tonartbezeichnungen (Vorzeichen) +@translationof Pitches and key signatures + +@menu +* Tonhöhenveränderungen:: +* Tonartbezeichnungen (Vorzeichen):: +* Warnung bzgl. Tonartbezeichnungen und Tonhöhen:: +@end menu + +@warning{Neue Anwender missverstehen meist, wie LilyPond Tonartbezeichnungen +verwendet -- bitte lesen sie die entsprechende Warnung am Fuße dieser Seite.} + +@node Tonhöhenveränderungen +@unnumberedsubsubsec Tonhöhenveränderungen +@translationof Pitch alterations + -@subheading Versetzungszeichen @cindex Versetzungszeichen -@cindex Akzidentien +@cindex Auflösungszeichen @cindex Kreuz @cindex Doppelkreuz @cindex B @@ -99,10 +155,12 @@ Notationsreferenz: @funindex eses @funindex isis - Glossar: @rglos{sharp}, @rglos{flat}, @rglos{double sharp}, @rglos{double flat}, @rglos{accidental}. +Notennamen bezeichnen in LilyPond Tonhöhen. So bedeutet z.B. @code{c} +immer ein C ohne jedes Vorzeichen, unabhängig von der gerade eingestellten Tonart. + Ein @notation{Kreuz}-Versetzungszeichen@footnote{In der Umgangssprache werden die Versetzungszeichen häufig auch Vorzeichen genannt. In diesem Handbuch wird jedoch zwischen Vorzeichen zur generellen Angabe @@ -117,14 +175,17 @@ deutsche Benutzer kein Problem. Es ist aber möglich, die Namen für die @notation{Versetzungszeichen} in anderen Sprachen zu benutzen, siehe @ruser{Notenbezeichnungen in anderen Sprachen}. -@lilypond[verbatim,quote,relative=2] -cis4 ees fisis, aeses +@lilypond[verbatim,quote] +\relative { cis''4 ees fisis, aeses } @end lilypond +@cindex Tonart, Einstellen der + +@node Tonartbezeichnungen (Vorzeichen) +@unnumberedsubsubsec Tonartbezeichnungen (Vorzeichen) +@translationof Key signatures -@subheading Tonartbezeichnungen (Vorzeichen) -@cindex Tonart, Einstellung von @cindex Vorzeichen @cindex Dur @cindex Moll @@ -133,60 +194,55 @@ cis4 ees fisis, aeses @cindex Darstellung & Inhalt @funindex \key -@funindex key @funindex \major -@funindex major @funindex \minor -@funindex minor Glossar: @rglos{key signature}, @rglos{major}, @rglos{minor}. -Die @notation{Tonart} eines Stückes wird erstellt mit dem -Befehl @code{\key}, gefolgt von einer Notenbezeichnung und -@code{\major} (für Dur) oder @code{\minor} -(für Moll). +Die @notation{Tonart} eines Stückes wird mit dem Befehl +@code{\key}, gefolgt von einer Notenbezeichnung und +@code{\major} (für Dur) oder @code{\minor} (für Moll) eingestellt. -@lilypond[verbatim,quote,relative=2] -\key d \major -a1 | -\key c \minor -a1 | +@lilypond[verbatim,quote] +\relative { + \key d \major + d'4 fis a c | + \bar "||" \key c \minor + c,4 ees g b | +} @end lilypond @smallspace -@subheading Warnung: Tonartbezeichnungen und Tonhöhen +@node Warnung bzgl. Tonartbezeichnungen und Tonhöhen +@unnumberedsubsubsec Warnung bzgl. Tonartbezeichnungen und Tonhöhen +@translationof Warning key signatures and pitches Glossar: @rglos{accidental}, @rglos{key signature}, @rglos{pitch}, @rglos{flat}, @rglos{natural}, @rglos{sharp}, @rglos{transposition}, @rglos{Pitch names}. -Um zu bestimmen, ob vor einer bestimmten Note ein Versetzungszeichen -erscheinen soll, untersucht LilyPond die Notenhöhen und die -Tonart. Die Tonart beeinflusst nur die @emph{gedruckten} -Versetzungszeichen, nicht die wirklichen Tonhöhen! Diese Besonderheit -scheint am Anfang oft verwirrend, so dass sie hier etwas -genauer betrachtet wird. - -LilyPond unterscheidet strickt zwischen dem musikalischen Inhalt -und dem Satz (Layout). Die Alteration (@notation{B}, -@notation{Kreuz} oder @notation{Auflösungszeichen}) einer Note gehört -zur Tonhöhe dazu und ist deshalb musikalischer -Inhalt. Ob ein Versetzungszeichen (also ein @emph{gedrucktes} Kreuz, b -oder Auflösungszeichen) auch vor der Note erscheint, hängt vom Kontext, -also vom Layout ab. Das Layout gehorcht bestimmten Regeln, und -Versetzungszeichen -werden automatisch nach diesen Regeln gesetzt. Die Versetzungszeichen im -fertigen Notenbild sind nach den Regeln des Notensatzes gesetzt. Deshalb -wird automatisch entschieden, wo sie erscheinen, und man muss -den Ton eingeben, den man @emph{hören} will. +LilyPond unterscheidet zwischen dem musikalischen Inhalt +und dem Satz (Layout). Eine Eingabe wie @code{d4 e fis2} +bestimmt die Tonhöhen und Dauer von Noten, also den musikalischen +Inhalt.. Die @notation{Tonart} ist dagegen Teil der gedruckten +Darstellung. Die Tonart bestimmt die Regeln, nach denen die Noten +ausgedruckt werden. LilyPond vergleicht jede eingegebene Tonhöhe +mit der Tonart und entscheidet dann ob und ggf. welches +@notation{Versetzungszeichen} gedruckt werden muss. + +Der Befehl @code{\key} stellt die @notation{Tonart} ein. Diese +beeinflusst die gedruckte Darstellung der Noten, bewirkt jedoch +@emph{keine} Änderung der Tonhöhen von eingegebenen Noten wie etwa @code{c}. In diesem Beispiel -@lilypond[verbatim,quote,relative=2] -\key d \major -cis4 d e fis +@lilypond[verbatim,quote] +\relative { + \key d \major + cis''4 d e fis +} @end lilypond @noindent @@ -200,21 +256,21 @@ auf die Mittellinie des Systems.} Im Gegenteil, er heißt vielmehr: In der Tonart As-Dur @emph{bekommt} sie ein Versetzungszeichen: -@lilypond[verbatim,quote,relative=2] -\key aes \major -aes4 c b c +@lilypond[verbatim,quote] +\relative { + \key aes \major + aes'4 c b c +} @end lilypond -Wenn das alles sehr verwirrend erscheint, muss man sich nur vorstellen, -dass man auf einer Klaviatur spielt: Wenn man eine schwarze Taste drücken -würde, @emph{muss} man auch @w{@code{-is}} oder @w{@code{-es}} an die +Jedes mal wenn sie eine Tonhöhe eingeben, die auf dem Klavier zu einer schwarzen +Taste gehört, @emph{müssen} sie auch @w{@code{-is}} oder @w{@code{-es}} an die Note anhängen. Alle diese Versetzungszeichen ausdrücklich zu schreiben, bedeutet vielleicht etwas mehr Schreibarbeit, hat aber den großen Vorteil, dass -@notation{Transpositionen} sehr viel einfacher gemacht wird -und der Druck von Versetzungszeichen nach -unterschiedlichen Regeln erfolgen kann. Siehe +@notation{Transpositionen} sehr viel einfacher sind und der Ausdruck +von Versetzungszeichen nach unterschiedlichen Regeln erfolgen kann. Siehe @ruser{Automatische Versetzungszeichen} für einige Beispiele, wie Vorzeichen anhand von unterschiedlichen Regeln ausgegeben werden können. @@ -242,31 +298,63 @@ Notationsreferenz: @funindex \( ... \) -@subheading Bindebögen +@menu +* Bindebögen:: +* Legatobögen:: +* Phrasierungsbögen:: +* Achtung Bindebögen sind nicht Legatobögen:: +@end menu + +@node Bindebögen +@unnumberedsubsubsec Bindebögen +@translationof Ties Glossar: @rglos{tie}. -Ein @notation{Bindebogen} wird geschrieben, indem man eine Tilde @code{~} -an die erste der zu verbindenden Noten hängt. +Man schreibt einen @notation{Bindebogen}, indem man eine Tilde @code{~} +an die erste der beiden zu verbindenden Noten hängt. + +@lilypond[verbatim,quote] +\relative { g'4~ g c2~ | c4~ c8 a~ a2 | } +@end lilypond + +@cindex bloße Dauer +@cindex Dauer, bloße + +Wenn sich die Tonhöhe nicht ändert, was bei Noten, die mit Bindebögen +verbunden sind immer der Fall ist, kann für die folgenden Noten auf die +Angabe der Tonhöhe verzichtet werden. Es braucht lediglich die bloße Dauer +angegeben zu werden: -@lilypond[verbatim,quote,relative=2] -g4~ g c2~ | c4~ c8 a~ a2 +@lilypond[verbatim,quote] +\relative { g'4~ 4 c2~ | 4~ 8 a~ 2 | } @end lilypond +Diese verkürzte Schreibweise ist immer dann nützlich, wenn sich zwar der +Rhythmus, nicht jedoch die Tonhöhe ändert. Man sollte jedoch beachten, dass +eine bloße Tonhöhe gefolgt von einem Leerzeichen und dann einer bloßen Dauer +als eine einzige Note interpretiert wird. Mit anderen Worten, @code{c4 a 8 8} +würde als @code{c4 a8 a8} und nicht als @code{c4 a4 a8 a8} verstanden werden. +Schreiben sie stattdessen @code{c4 a4 8 8 }. + +@node Legatobögen +@unnumberedsubsubsec Legatobögen +@translationof Slurs -@subheading Legatobögen Glossar: @rglos{slur}. Ein @notation{Legatobogen} ist ein Bogen, der sich über mehrere Noten -erstreckt. Seine -Beginn- und Endnote werden mit @q{(} beziehungsweise @q{)} markiert. +erstreckt. Seine Beginn- und Endnote werden mit einem angehängten @q{(} +beziehungsweise @q{)} markiert. -@lilypond[verbatim,quote,relative=2] -d4( c16) cis( d e c cis d) e( d4) +@lilypond[verbatim,quote] +\relative { d''4( c16) cis( d e c cis d) e( d4) } @end lilypond -@subheading Phrasierungsbögen +@node Phrasierungsbögen +@unnumberedsubsubsec Phrasierungsbögen +@translationof Phrasing slurs Glossar: @rglos{slur}, @rglos{phrasing}. @@ -277,14 +365,17 @@ Phrasierungsbögen gleichzeitig vorkommen, aber es kann nicht mehr als jeweils einen Legato- und einen Phrasierungsbogen gleichzeitig geben. -@lilypond[verbatim,quote,relative=2] -g4\( g8( a) b( c) b4\) +@lilypond[verbatim,quote] +\relative { g'4\( g8( a) b( c) b4\) } @end lilypond -@sp 1 +@smallspace @cindex Binde- versus Legatobogen -@subheading Warnung: Bindebögen sind nicht Legatobögen + +@node Achtung Bindebögen sind nicht Legatobögen +@unnumberedsubsubsec Achtung Bindebögen sind nicht Legatobögen +@translationof Warnings slurs vs. ties Glossar: @rglos{articulation}, @rglos{slur}, @rglos{tie}. @@ -295,8 +386,8 @@ Legatobögen dagegen zeigen die Artikulation von Noten an und können für größere Notengruppen gesetzt werden. Binde- und Legatobögen können geschachtelt werden. -@lilypond[verbatim,quote,relative=2] -c4~( c8 d~ d4 e) +@lilypond[verbatim,quote] +\relative { c''4(~ c8 d~ 4 e) } @end lilypond @@ -311,7 +402,16 @@ Notationsreferenz: @subsection Artikulationszeichen und Lautstärke @translationof Articulation and dynamics -@subheading Artikulationszeichen +@menu +* Artikulationszeichen:: +* Fingersätze:: +* Dynamik:: +@end menu + +@node Artikulationszeichen +@unnumberedsubsubsec Artikulationszeichen +@translationof Articulations + @cindex Artikulation @cindex Akzente @@ -323,12 +423,17 @@ Glossar: Übliche @notation{Artikulationszeichen} können durch Anfügen von Minus (@q{-}) und einem entsprechenden Zeichen eingegeben werden: -@lilypond[verbatim,quote,relative=2] -c4-^ c-+ c-- c-! -c4-> c-. c2-_ +@lilypond[verbatim,quote] +\relative { + c''4-^ c-+ c-- c-! + c4-> c-. c2-_ +} @end lilypond -@subheading Fingersatz +@node Fingersätze +@unnumberedsubsubsec Fingersätze +@translationof Fingerings + @cindex Fingersatz @@ -340,8 +445,8 @@ Glossar: @rglos{fingering}. Auf gleiche Weise können Fingersatzbezeichnungen hinzugefügt werden, indem nach dem Minus (@q{-}) eine Zahl geschrieben wird: -@lilypond[verbatim,quote,relative=2] -c4-3 e-5 b-2 a-1 +@lilypond[verbatim,quote] +\relative { c''4-3 e-5 b-2 a-1 } @end lilypond Artikulationszeichen und Fingersätze werden normalerweise @@ -352,11 +457,14 @@ Artikulationszeichen gehängt werden. Meistens findet aber LilyPond alleine die beste Möglichkeit, wie die Artikulationen platziert werden sollen. -@lilypond[verbatim,quote,relative=2] -c4_-^1 d^. f^4_2-> e^-_+ +@lilypond[verbatim,quote] +\relative { c''4_-^1 d^. f^4_2-> e^-_+ } @end lilypond -@subheading Dynamik +@node Dynamik +@unnumberedsubsubsec Dynamik +@translationof Dynamics + @cindex Dynamik @cindex Crescendo @@ -370,11 +478,8 @@ c4_-^1 d^. f^4_2-> e^-_+ @funindex \mf @funindex \pp @funindex \< -@funindex < @funindex \> -@funindex > @funindex \! -@funindex ! Glossar: @rglos{dynamics}, @@ -385,18 +490,18 @@ Die Dynamik innerhalb eines Stückes wird eingegeben, indem man die Markierungen (mit einem Backslash) an die Note hängt: -@lilypond[verbatim,quote,relative=2] -c4\ff c\mf c\p c\pp +@lilypond[verbatim,quote] +\relative { c''4\ff c\mf c\p c\pp } @end lilypond @notation{Crescendi} und @notation{Decrescendi} werden mit dem Befehl @code{\<} beziehungsweise @code{\>} begonnen. Das nächste absolute Dynamik-Zeichen, etwa @code{\f}, beendet das (De)Crescendo. -Auch mit dem Befehl @code{\!} kann es explizit beendet werden. +Mit dem Befehl @code{\!} kann es explizit beendet werden. -@lilypond[verbatim,quote,relative=2] -c4\< c\ff\> c c\! +@lilypond[verbatim,quote] +\relative { c''4\< c\ff\> c c\! } @end lilypond @@ -417,21 +522,20 @@ Notationsreferenz: @cindex Textbeschriftung @cindex markup -@funindex \markup -@funindex markup +@funindex \markup Text können Sie auf folgende Art in die Partitur einfügen: -@lilypond[verbatim,quote,relative=2] -c2^"espr" a_"legato" +@lilypond[verbatim,quote,fragment] +c''2^"espr" a'_"legato" @end lilypond Zusätzliche Formatierung kann eingesetzt werden, wenn Sie den @code{\markup}-Befehl benutzen: -@lilypond[verbatim,quote,relative=2] -c2^\markup { \bold espr } -a2_\markup { +@lilypond[verbatim,quote,fragment] +c''2^\markup { \bold espr } +a'2_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } @end lilypond @@ -455,25 +559,22 @@ Notationsreferenz: @funindex [ @funindex ] @funindex \autoBeamOff -@funindex autoBeamOff @funindex \autoBeamOn -@funindex autoBeamOn Alle @notation{Balken} werden automatisch gesetzt: -@lilypond[verbatim,quote,relative=2] -a8 ais d ees r d c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8 ais d ees r d c16 b a8 } @end lilypond -@noindent Wenn diese automatisch gesetzten Balken nicht gewollt sind, können sie manuell geändert werden. Wenn nur ein Balken hier und da korrigiert werde muss, erhält die Note, an der der Balken anfängt, ein @q{[} (AltGr+8) und die, an der er enden soll, ein @q{]} (AltGr+9). -@lilypond[verbatim,quote,relative=2] -a8[ ais] d[ ees r d] c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8[ ais] d[ ees r d] c16 b a8 } @end lilypond Wenn Sie die automatischen Balken vollständig oder für @@ -481,11 +582,13 @@ einen längeren Abschnitt ausschalten wollen, benutzen Sie den Befehl @code{\autoBeamOff}, um die Balken abzuschalten, und @code{\autoBeamOn}, um sie wieder einzuschalten. -@lilypond[verbatim,quote,relative=2] -\autoBeamOff -a8 c b4 d8. c16 b4 | -\autoBeamOn -a8 c b4 d8. c16 b4 | +@lilypond[verbatim,quote] +\relative { + \autoBeamOff + a'8 c b4 d8. c16 b4 | + \autoBeamOn + a8 c b4 d8. c16 b4 | +} @end lilypond @@ -499,71 +602,89 @@ Notationsreferenz: @subsection Zusätzliche rhythmische Befehle @translationof Advanced rhythmic commands -@subheading Auftakt +@menu +* Auftakt:: +* N-tolen:: +* Verzierungen:: +@end menu + +@node Auftakt +@unnumberedsubsubsec Auftakt +@translationof Partial measure + @cindex Auftakt + @funindex \partial -@funindex partial Ein @notation{Auftakt} wird mit dem Befehl @code{\partial} eingegeben. Darauf folgt die Länge des Auftaktes: @code{\partial 4} heißt eine Viertelnote Auftakt und @code{\partial 8} eine Achtelnote. -@lilypond[verbatim,quote,relative=2] -\partial 8 f8 | -c2 d | +@lilypond[verbatim,quote] +\relative { + \partial 8 f''8 | + c2 d | +} @end lilypond +@node N-tolen +@unnumberedsubsubsec N-tolen +@translationof Tuplets -@subheading Andere rhythmische Aufteilungen @cindex N-tolen @cindex Triolen @cindex Rhythmische Aufteilungen -@funindex \times -@funindex times +@funindex \tuplet Glossar: @rglos{note value}, @rglos{triplet}. @notation{Triolen} und @notation{N-tolen} werden mit dem -@code{\times}-Befehl erzeugt. Er braucht -zwei Argumente: einen Bruch und die Noten, auf die er sich bezieht. -Die Dauer des Abschnittes wird mit dem Bruch multipliziert. -In einer Triole dauern die Noten 2/3 ihrer normalen Länge, -also hat eine Triole 2/3 als Bruch: - -@lilypond[verbatim,quote,relative=2] -\tuplet 3/2 { f8 g a } -\tuplet 3/2 { c8 r c } -\tuplet 3/2 { f,8 g16[ a g a] } -\tuplet 3/2 { d4 a8 } +@code{\tuplet}-Befehl erzeugt. Er braucht zwei Argumente: +einen Bruch und die Noten, auf die er sich bezieht. +Der Bruch ist die Anzahl der N-tolen Noten geteilt durch die Anzahl +der Noten, die normalerweise in der gleichen Zeit erklingen würden. +Für eine Triole wären das drei Noten statt zwei, also bekommen +@notation{Triolen} den Bruch 3/2: + +@lilypond[verbatim,quote] +\relative { + \tuplet 3/2 { f''8 g a } + \tuplet 3/2 { c8 r c } + \tuplet 3/2 { f,8 g16[ a g a] } + \tuplet 3/2 { d4 a8 } +} @end lilypond -@subheading Verzierungen +@node Verzierungen +@unnumberedsubsubsec Verzierungen +@translationof Grace notes + @cindex Verzierungen @cindex Vorschlag @cindex Vorhalt @funindex \grace -@funindex grace @funindex \acciaccatura -@funindex acciaccatura @funindex \appoggiatura @funindex acciaccatura Glossar: @rglos{grace notes}, @rglos{acciaccatura}, @rglos{appoggiatura}. -Verzierungen werden mit dem Befehl @code{\grace} +@notation{Verzierungen} werden mit dem Befehl @code{\grace} eingegeben, Vorhalte durch den Befehl @code{\appoggiatura} und Vorschläge mit @code{\acciaccatura}. -@lilypond[verbatim,quote,relative=2] -c2 \grace { a32 b } c2 | -c2 \appoggiatura b16 c2 | -c2 \acciaccatura b16 c2 | +@lilypond[verbatim,quote] +\relative { + c''2 \grace { a32 b } c2 | + c2 \appoggiatura b16 c2 | + c2 \acciaccatura b16 c2 | +} @end lilypond @@ -584,9 +705,8 @@ für verschiedene Instrumente oder für ein Instrument (z. B. Klavier) und in Akkorden. Polyphonie nennt man in der Musik das Vorkommen von mehr als einer -Stimme -in einem Stück. Polyphonie bzw. Mehrstimmigkeit heißt für LilyPond allerdings -das Vorkommen von mehr als einer Stimme pro System. +Stimme in einem Stück. Polyphonie bzw. Mehrstimmigkeit heißt für +LilyPond allerdings das Vorkommen von mehr als einer Stimme pro System. @menu * Musikalische Ausdrücke erklärt:: @@ -605,12 +725,18 @@ das Vorkommen von mehr als einer Stimme pro System. @cindex Ausdruck, musikalischer @cindex zusammengesetzter musikalischer Ausdruck -In LilyPond-Quelldateien wird Musik durch @emph{musikalische +@menu +* Analogie mathematische Ausdrücke:: +* Gleichzeitige musikalische Ausdrücke mehrere Notensysteme:: +* Gleichzeitige musikalische Ausdrücke ein Notensystem:: +@end menu + +In LilyPond-Quelldateien wird Musik durch @emph{musikalische Ausdrücke} dargestellt. Eine einzelne Note ist ein musikalischer Ausdruck. -@lilypond[verbatim,quote,relative=2] -a4 +@lilypond[verbatim,quote,fragment] +a'4 @end lilypond Eine Gruppe von Noten innerhalb von Klammern bildet einen neuen @@ -618,8 +744,8 @@ Ausdruck. Dieser ist nun ein @emph{zusammengesetzter musikalischer Ausdruck}. Hier wurde solch ein zusammengesetzter musikalischer Ausdruck mit zwei Noten erstellt: -@lilypond[verbatim,quote,relative=2] -{ a4 g4 } +@lilypond[verbatim,quote] +\relative { a'4 g4 } @end lilypond Wenn eine Gruppe von musikalischen Ausdrücken (also beispielsweise @@ -627,18 +753,20 @@ Noten) in geschweifte Klammern gesetzt wird, bedeutet das, dass eine Gruppe nach der anderen gesetzt wird. Das Resultat ist ein neuer musikalischer Ausdruck. -@lilypond[verbatim,quote,relative=2] -{ { a4 g } f4 g } +@lilypond[verbatim,quote] +\relative { { a'4 g } f4 g } @end lilypond -@subheading Analogie: mathematische Ausdrücke +@node Analogie mathematische Ausdrücke +@unnumberedsubsubsec Analogie mathematische Ausdrücke +@translationof Analogy mathematical expressions + Die Anordnung von Ausrücken funktioniert ähnlich wie mathematische -Gleichungen. Eine längere Gleichung entsteht durch die -Kombination kleinerer Gleichungen. Solche Gleichungen -werden auch Ausdruck genannt und ihre Definition ist -rekursiv, sodass beliebig komplexe und lange Ausdrücke +Formeln. Eine längere Formel entsteht durch die Kombination kleinerer +Formeln. Solche Formeln werden auch Ausdruck genannt und ihre +Definition ist rekursiv, sodass beliebig komplexe und lange Ausdrücke erstellt werden können. So etwa hier: @example @@ -660,7 +788,9 @@ Ausdrücke können auch musikalische Ausdrücke beliebig tief verschachtelt werden. Das wird benötigt für komplexe Musik mit vielen Stimmen. -@subheading Gleichzeitige musikalische Ausdrücke: mehrere Notensysteme +@node Gleichzeitige musikalische Ausdrücke mehrere Notensysteme +@unnumberedsubsubsec Gleichzeitige musikalische Ausdrücke mehrere Notensysteme +@translationof Simultaneous music expressions multiple staves @cindex mehrere Systeme @cindex Notensysteme, mehrere @@ -669,7 +799,9 @@ werden. Das wird benötigt für komplexe Musik mit vielen Stimmen. @cindex parallele Ausdrücke @cindex Ausdrücke, parallel @cindex relative Noten und simultane Musik +@cindex relative Noten und parallele Ausdrücke @cindex gleichzeitige Noten und relativer Modus +@cindex parallele Ausdrücke und relative Noten @funindex << @funindex >> @@ -689,13 +821,11 @@ musikalische Ausdrücke kombiniert, indem man sie mit @code{<<} und (jeder mit zwei Noten) parallel kombiniert: @lilypond[verbatim,quote] -\relative c'' { - << - { a2 g } - { f2 e } - { d2 b } - >> -} +<< + \relative { a'2 g } + \relative { f'2 e } + \relative { d'2 b } +>> @end lilypond Es ist noch zu bemerken, dass wir hier für jede Ebene innerhalb der @@ -704,13 +834,15 @@ spielt es keine Rolle, wie viele Leerzeichen am Anfang einer Zeile sind, aber für Menschen ist es eine große Hilfe, sofort zu sehen, welche Teile des Quelltextes zusammen gehören. -@warning{Jede Note ist relativ zu der vorhergehenden in der -Datei, nicht relativ zu dem zweigestrichenen C (@code{c''}), das im -@code{@bs{}relative}-Befehl angegeben ist. Die Klammern haben darauf -keinen Einfluss.} +@warning{Jede Note ist relativ zu der vorhergehenden in der Datei, +und nur die erste Note ist relativ zu dem zweigestrichenen C (@code{c''}), +das im @code{@bs{}relative}-Befehl angegeben ist.} + +@node Gleichzeitige musikalische Ausdrücke ein Notensystem +@unnumberedsubsubsec Gleichzeitige musikalische Ausdrücke ein Notensystem +@translationof Simultaneous music expressions single staff -@subheading Gleichzeitige musikalische Ausdrücke: ein Notensystem Um die Anzahl der Notensysteme zu bestimmen, analysiert LilyPond den Anfang des ersten Ausdrucks. Wenn sich hier @@ -721,13 +853,12 @@ folgende Beispiel beginnt mit einer Note: @lilypond[verbatim,quote] -\relative c'' { - c2 <> | - << { e f } { c <> } >> | +\relative { + c''2 <> | + << { e2 f } { c2 <> } >> | } @end lilypond - @node Mehrere Notensysteme @subsection Mehrere Notensysteme @translationof Multiple staves @@ -738,10 +869,8 @@ folgende Beispiel beginnt mit einer Note: @cindex Notationskontext @funindex \new Staff -@funindex new Staff @funindex Staff @funindex \new -@funindex new @funindex Score @funindex Voice @funindex Lyrics @@ -760,12 +889,10 @@ werden dann parallel angeordnet mit den @code{<<} und @code{>>}-Zeichen: @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond Der Befehl @code{\new} beginnt einen neuen @qq{Notationskontext}. Ein @@ -797,17 +924,13 @@ Tonart der anderen Systeme. Dieses Verhalten ist darin begründet, dass Partituren mit transponierenden Instrumenten häufiger sind als Partituren mit unterschiedlichen Taktarten. - @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" \key d \major \time 3/4 c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" \key d \major \time 3/4 c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond - @node Notensysteme gruppieren @subsection Notensysteme gruppieren @translationof Staff groups @@ -850,12 +973,10 @@ eine @code{PianoStaff}-Umgebung eingefügt wird. Hier ein kleines Beispiel: @lilypond[verbatim,quote] -\relative c'' { - \new PianoStaff << - \new Staff { \time 2/4 c4 e | g g, | } - \new Staff { \clef "bass" c,,4 c' | e c | } - >> -} +\new PianoStaff << + \new Staff \relative { \time 2/4 c''4 e | g g, | } + \new Staff \relative { \clef "bass" c4 c' | e c | } +>> @end lilypond Andere typische Gruppen von Notensystemen können mit den @@ -896,8 +1017,8 @@ einzuschließen. Beachten Sie, dass alle Noten eines Akkordes die gleiche Dauer haben müssen, und diese Dauer wird nach der schließenden Klammer geschrieben. -@lilypond[verbatim,quote,relative=2] -r4 2 +@lilypond[verbatim,quote] +\relative { r4 2 } @end lilypond Akkorde sind im Grunde gleichwertig mit einfachen Noten: @@ -907,11 +1028,13 @@ So können Markierungen wie Balken oder Bögen mit den Akkorden kombiniert werden. Sie müssen jedoch außerhalb der spitzen Klammern gesetzt werden. -@lilypond[verbatim,quote,relative=2] -r4 ~ 2 | -8[ ] -8\>[ ]\! | -r4 8.\p 16( 4-. ) | +@lilypond[verbatim,quote] +\relative { + r4 ~ 2 | + 8[ ] + 8\>[ ]\! | + r4 8.\p 16( 4-. ) | +} @end lilypond @seealso @@ -953,11 +1076,6 @@ Notationsreferenz: @section Lieder @translationof Songs -@cindex Gesangstext, schreiben - -@funindex \addlyrics -@funindex addlyrics - In diesem Kapitel wird in die Kombination von Musik mit Text eingeführt und die Erstellung einfacher Song-Blätter gezeigt. @@ -976,9 +1094,9 @@ gezeigt. @cindex Text @cindex Lieder @cindex Liedtext +@cindex Gesangstext, schreiben @funindex \addlyrics -@funindex addlyrics Glossar: @rglos{lyrics}. @@ -986,10 +1104,10 @@ Hier ist der Beginn eines einfachen Kinderliedes, @notation{Girls and boys come out to play}: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } @end lilypond @@ -999,29 +1117,22 @@ wird eingegeben, indem jede Silbe durch ein Leerzeichen getrennt wird. @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } \addlyrics { - Girls and boys come | out to play, + Girls and boys come out to play, } >> @end lilypond -@warning{Es ist sehr wichtig, dass die letzte Silbe duch ein Leerzeichen -oder eine neue Zeile von der abschließenden geschweiften Klammer -getrennt ist. Wenn dies nicht der Fall ist, wird die Klammer als Teil -der Silbe interpretiert, was zu einem seltsamen Fehler führt. Siehe auch -@rprogram{Apparent error in ../ly/init.ly}.} - Sowohl die Noten als auch der Text sind jeweils in geschweifte Klammern eingefasst, und der gesamte Ausdruck ist zwischen -@w{@code{<< ... >>}} positioniert. Damit wird garantiert, dass +@w{@code{<<@dots{}>>}} positioniert. Damit wird garantiert, dass Text und Noten gleichzeitig gesetzt werden. - @node Text an einer Melodie ausrichten @subsection Text an einer Melodie ausrichten @translationof Aligning lyrics to a melody @@ -1043,51 +1154,38 @@ notiert aus: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c b a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond -Wenn dieser Code des obrigen Beispiels kompiliert wird, sollten derartige -Warnungen in der Ausgabe auf der Konsole/in der Log-Datei auftauchen: - -@example -test.ly:10:29: Warnung: Taktüberprüfung gescheitert bei: 5/8 - The | moon doth shine as - | bright as day; | -test.ly:10:46: Warnung: Taktüberprüfung gescheitert bei: 3/8 - The | moon doth shine as | bright as day; - | -@end example - -Das ist ein gutes Beispiel für den Nutzen von Taktüberprüfungen. Wenn man -sich die Noten genauer anschaut, wird klar, dass die neue Textzeile nicht -korrekt an den Noten ausgerichtet ist. Das Wort @notation{shine} sollte -zu zwei Noten gesungen werden, nicht nur zu einer. Das nennt man ein -@notation{Melisma}, eine Silbe Text zu mehreren Noten. Es gibt mehrere -Möglichkeiten, eine Silbe über mehrere Noten zu verlängern. Die einfachste -ist es, einen Legatobogen um die betroffenen Noten zu setzen, zu -Einzelheiten siehe @ref{Bindebögen und Legatobögen}. +Wenn man sich die Noten genauer anschaut, wird klar, dass die neue +Textzeile nicht korrekt an den Noten ausgerichtet ist. Das Wort +@notation{shine} sollte zu zwei Noten gesungen werden, nicht nur zu einer. +Das nennt man ein @notation{Melisma}, eine Silbe Text zu mehreren Noten. +Es gibt mehrere Möglichkeiten, eine Silbe über mehrere Noten zu verlängern. +Die einfachste ist es, einen Legatobogen um die betroffenen Noten zu setzen, +zu Einzelheiten siehe @ref{Bindebögen und Legatobögen}. @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c( b) a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond @@ -1102,15 +1200,15 @@ für Gesang entspricht. Für Einzelheiten siehe @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c([ b]) a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond @@ -1121,15 +1219,15 @@ für jede Note, die übersprungen werden soll, ein Unterstrich @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c[ b] a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine _ as | bright as day; | + Girls and boys come out to play, + The moon doth shine _ as bright as day; } >> @end lilypond @@ -1144,15 +1242,15 @@ aus Purcells @notation{Dido and Æneas}: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \minor \time 3/2 - g2 a bes | bes2( a) b2 | + g'2 a bes | bes2( a) b2 | c4.( bes8 a4. g8 fis4.) g8 | fis1 } \addlyrics { - When I am | laid, - am | laid __ in | earth, + When I am laid, + am laid __ in earth, } >> @end lilypond @@ -1169,16 +1267,16 @@ zeigt, mit denen Text an den Noten ausgerichtet werden kann: @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \key g \major \time 3/4 \partial 4 - d4 | g4 g a8( b) | g4 g b8( c) | + d'4 | g4 g a8( b) | g4 g b8( c) | d4 d e | c2 } \addlyrics { - A -- | way in a __ | man -- ger, - no __ | crib for a | bed, __ + A -- way in a __ man -- ger, + no __ crib for a bed, } >> @end lilypond @@ -1197,14 +1295,14 @@ in Figaros Arie @notation{Largo al factotum} gesungen werden muss. @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \clef "bass" \key c \major \time 6/8 - c4.~ c8 d b | c8([ d]) b c d b | c8 + c'4.~ 8 d b | c8([ d]) b c d b | c8 } \addlyrics { - Lar -- go_al fac -- | to -- tum del -- la cit -- | tà + Lar -- go_al fac -- to -- tum del -- la cit -- tà } >> @end lilypond @@ -1228,23 +1326,23 @@ aus Händels @notation{Judas Maccabäus}: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key f \major \time 6/8 \partial 8 - c8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ c4 + c''8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ 4 } \addlyrics { - Let | flee -- cy flocks the | hills a -- | dorn, __ + Let flee -- cy flocks the hills a -- dorn, __ } - \relative c' { + \relative { \key f \major \time 6/8 \partial 8 - r8 | r4. r4 c8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 + r8 | r4. r4 c'8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 } \addlyrics { - Let | flee -- cy flocks the | hills a -- dorn, + Let flee -- cy flocks the hills a -- dorn, } >> @end lilypond @@ -1252,7 +1350,7 @@ aus Händels @notation{Judas Maccabäus}: Aber Partituren, die komplizierter als dieses Beispiel sind, werden besser notiert, indem man die Systemstruktur von den Noten und dem Gesangstext durch Variablen trennt. Die Benutzung -von Variablen wird erklärt im Abschnitt @ref{Stücke durch Bezeichner organisieren}. +von Variablen wird erklärt im Abschnitt @ref{Stücke durch Variablen organisieren}. @seealso @@ -1264,20 +1362,20 @@ Notationsreferenz: @section Letzter Schliff @translationof Final touches -Das ist das letzte Kapitel der Übung. Hier soll demonstriert werden, +Das ist das letzte Kapitel des Tutoriums. Hier soll demonstriert werden, wie man den letzten Schliff an einfachen Stücken anbringen kann. Gleichzeitig dient es als Einleitung zum Rest des Handbuches. @menu -* Stücke durch Bezeichner organisieren:: +* Stücke durch Variablen organisieren:: * Titel hinzufügen:: * Absolute Notenbezeichnungen:: -* Nach der Übung:: +* Nach dem Tutorium:: @end menu -@node Stücke durch Bezeichner organisieren -@subsection Stücke durch Bezeichner organisieren +@node Stücke durch Variablen organisieren +@subsection Stücke durch Variablen organisieren @translationof Organizing pieces with variables @cindex Variable @@ -1306,23 +1404,24 @@ Der Inhalt des musikalischen Ausdrucks @code{bezeichneteMusik} kann dann später wieder benutzt werden, indem man einen Backslash davor setzt (@code{\bezeichneteMusik}), genau wie bei jedem LilyPond-Befehl. -@c KEEP LY @lilypond[quote,verbatim] -Geige = \new Staff - { \relative c'' { - a4 b c b +violin = \new Staff { + \relative { + a'4 b c b } } -Cello = \new Staff - { \relative c { + +cello = \new Staff { + \relative { \clef "bass" e2 d } } + { << - \Geige - \Cello + \violin + \cello >> } @end lilypond @@ -1338,23 +1437,20 @@ können sogar eingesetzt werden, um später in der Datei eine neue Variable zu erstellen. Damit kann die Schreibarbeit erleichtert werden, wenn Notengruppen sich oft wiederholen. -@c KEEP LY @lilypond[verbatim,quote] -trioleA = \tuplet 3/2 { c,8 e g } -TaktA = { \trioleA \trioleA \trioleA \trioleA } +tripletA = \relative { \tuplet 3/2 { c'8 e g } } +barA = { \tripletA \tripletA \tripletA \tripletA } -\relative c'' { - \TaktA \TaktA -} +{ \barA \barA } @end lilypond Man kann diese Variablen auch für viele andere Objekte verwenden, etwa: @example -Breite = 4.5\cm -Name = "Tim" -aFünfPapier = \paper @{ paperheight = 21.0 \cm @} +width = 4.5\cm +name = "Wendy" +aFivePaper = \paper @{ paperheight = 21.0 \cm @} @end example Abhängig vom Kontext kann solch ein Bezeichner in verschiedenen @@ -1363,17 +1459,16 @@ Benutzung der eben definierten Bezeichner: @example \paper @{ - \aFünfPapier - line-width = \Breite + \aFivePaper + line-width = \width @} @{ - c4^\Name + c4^\name @} @end example - @node Titel hinzufügen @subsection Titel hinzufügen @translationof Adding titles @@ -1381,10 +1476,8 @@ Benutzung der eben definierten Bezeichner: @cindex Titel @cindex header @cindex Kopf -@cindex Titelei @funindex \header -@funindex header Titel, Komponist, Opusnummern und ähnliche Information werden in einer @code{\header}-Umgebung eingefügt. Diese Umgebung befindet sich @@ -1407,7 +1500,7 @@ außerhalb der musikalischen Ausdrücke, meistens wird die Wenn die Datei übersetzt wird, werden Titel- und Komponisteneinträge über der Musik ausgegeben. Mehr Information über die Titelei findet -sich im Abschnitt @ruser{Titel erstellen}. +sich im Abschnitt @ruser{Titel Kopf und Fußzeilen erstellen}. @node Absolute Notenbezeichnungen @@ -1419,16 +1512,15 @@ sich im Abschnitt @ruser{Titel erstellen}. @cindex absolute Werte für Tonhöhen @cindex Tonhöhen, absolute Werte -Bis jetzt haben wir immer @code{\relative} benutzt, um Tonhöhen zu -bestimmen. Das ist die einfachste Eingabeweise für die meiste Musik. -Es gibt aber noch eine andere Möglichkeit, Tonhöhen darzustellen: durch -absolute Bezeichnung. +Bis jetzt haben wir @code{\relative} benutzt, um Tonhöhen zu +bestimmen. Für gewöhnlich ist das die schnellste Methode, Musik einzugeben. +Ohne @code{\relative} werden Tonhöhen als absolute Angaben interpretiert. -Wenn man das @code{\relative} weglässt, werden alle Tonhöhen von LilyPond -als absolute Werte interpretiert. Ein @code{c'} ist dann also immer das -eingestrichene C, ein @code{b} ist immer das kleine h unter dem -eingestrichenen C, und ein @code{g,} ist immer das große G -- also die -Note auf der letzten Linie im Bass-Schlüssel. +In diesem Modus werden alle Tonhöhen von LilyPond als absolute Werte +interpretiert. Ein @code{c'} ist dann also immer das eingestrichene C, ein +@code{b} ist immer das kleine h unter dem eingestrichenen C, und ein +@code{g,} ist immer das große G -- also die Note auf der unteren Linie +im Bass-Schlüssel. @lilypond[verbatim,quote] { @@ -1438,45 +1530,40 @@ Note auf der letzten Linie im Bass-Schlüssel. } @end lilypond -Hier eine Tonleiter über vier Oktaven: +Das Schreiben einer Melodie im Violinschlüssel erfordert eine Vielzahl +von Apostrophen @code{'}, wie z.B. in diesem Fragment von Mozart: @lilypond[verbatim,quote] { - \clef "bass" - c,4 d, e, f, | - g,4 a, b, c | - d4 e f g | - a4 b c' d' | - \clef "treble" - e'4 f' g' a' | - b'4 c'' d'' e'' | - f''4 g'' a'' b'' | - c'''1 | + \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 -Wie leicht zu sehen ist, muss man sehr viele Apostrophe schreiben, -wenn die Melodie im Sopranschlüssel notiert ist. Siehe etwa dieses -Fragment von Mozart: +@funindex \fixed +Gemeinsame Oktavierungsmarkierungen können einmalig mit dem Befehl +@code{\fixed}, gefolgt von einer Bezugstonhöhe, bestimmt werden: @lilypond[verbatim,quote] -{ +\fixed c'' { \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 | + cis8. d16 cis8 e4 e8 | + b,8. cis16 b,8 d4 d8 | } @end lilypond -Alle diese Apostrophe machen den Quelltext schlecht lesbar und sind -eine mögliche Fehlerquelle. Mit dem @code{\relative}-Befehl ist das Beispiel -sehr viel einfacher zu lesen: +Im Modus @code{\relative} benötigt das vorherige Beispiel überhaupt keine +Oktavierungsmarkierungen, denn die Melodie enthält keine Intervalle, die +größer wären als eine Quarte: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key a \major \time 6/8 - cis8. d16 cis8 e4 e8 | + cis''8. d16 cis8 e4 e8 | b8. cis16 b8 d4 d8 | } @end lilypond @@ -1489,21 +1576,42 @@ nicht so deutlich und deshalb auch nicht so einfach zu finden. Trotz allem ist der absolute Modus gut für Musik mit sehr großen Sprüngen und vor allem für computergenerierte LilyPond-Dateien. +Wenn man Melodiefragmente kopiert und einfügt, dann behält sie im +absoluten Modus die originale Oktavlage. +Bisweilen ist Musik komplexer aufgebaut. Schachtelt man @code{\relative} +ineinander, dann sind der innere und äußere Bereich unabhängig voneinander: -@node Nach der Übung -@subsection Nach der Übung +@lilypond[verbatim,quote] +\relative { c'4 \relative { f'' g } c } +@end lilypond + +Möchte man den absoluten Modus innerhalb von @code{\relative} verwenden, +dann gehört die absolute Musik innerhalb @code{\fixed c @{ @dots{} @}} +gepackt und deren Tonhöhen beeinflussen dann nicht die Oktavlage der +relativen Musik: + +@lilypond[verbatim,quote] +\relative { + c'4 \fixed c { f'' g'' } c | + c4 \fixed c'' { f g } c +} +@end lilypond + + +@node Nach dem Tutorium +@subsection Nach dem Tutorium @translationof After the tutorial -Wenn Sie diese Übung absolviert haben, sollten Sie am +Wenn Sie dieses Tutorium absolviert haben, sollten Sie am besten ein paar Stücke selber notieren. Beginnen Sie mit den @ref{Vorlagen} und fügen Sie einfach Ihre Noten -dazu. Wenn Sie irgendetwas brauchen, das nicht in der -Übung besprochen wurde, schauen Sie sich den Abschnitt Alles - über die Notation an, angefangen mit @ruser{Musikalische Notation}. +dazu. Wenn Sie irgendetwas brauchen, das nicht im +Tutorium besprochen wurde, schauen Sie sich den Abschnitt Alles +über die Notation an, angefangen mit @ruser{Musikalische Notation}. Wenn Sie für ein Instrument oder Ensemble Noten schreiben wollen, für das es keine Vorlage gibt, schauen Sie -sich @ref{Erweiterung der Beispiele} an. +sich @ref{Erweiterung der Vorlagen} an. Wenn Sie ein paar kurze Stücke notiert haben, lesen Sie den Rest des Handbuchs zum Lernen (Kapitel 3--5). Natürlich können @@ -1513,7 +1621,7 @@ von LilyPond beherrschen. Sie können die weiteren Kapitel auch überfliegen und dann darauf wieder zurückkommen, wenn Sie einige Erfahrungen im Notieren gewonnen haben. -In dieser Übung, genauso wie im gesamten Handbuch zum Lernen, +In diesem Tutorium, genauso wie im gesamten Handbuch zum Lernen, befindet sich ein Abschnitt @strong{Siehe auch} am Ende jedes Abschnittes, wo sich Verweise auf andere Abschnitte befinden. Diesen Verweisen sollten Sie nicht beim ersten Durchlesen @@ -1528,4 +1636,3 @@ Information über LilyPond, so dass Neulinge sich nicht sofort zurecht finden. Wenn Sie auch nur ein paar Minuten in diesem Abschnitt lesen, können Sie sich Stunden frustrierendes Suchen an der falschen Stelle ersparen! - diff --git a/Documentation/de/learning/fundamental.itely b/Documentation/de/learning/fundamental.itely index 77e3112483..13bcf2ccc8 100644 --- a/Documentation/de/learning/fundamental.itely +++ b/Documentation/de/learning/fundamental.itely @@ -1,21 +1,21 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 + Translation of GIT committish: 8819d7cb0ba2ab359e4aa2276695afb9c1957c42 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes. @end ignore -@c \version "2.17.29" -@c Translators: Till Paala, Reinhold Kainhofer +@c \version "2.19.22" +@c Translators: Till Paala, Reinhold Kainhofer, Michael Gerdau @node Grundbegriffe @chapter Grundbegriffe @translationof Fundamental concepts -Nachdem im Tutorial gezeigt wurde, wie aus einfachen Text-Dateien +Nachdem im Tutorium gezeigt wurde, wie aus einfachen Text-Dateien wunderschön formatierte Musiknoten erzeugt werden können, stellt dieses Kapitel die Konzepte und Techniken vor, wie auch komplexere Partituren erstellt werden können. @@ -24,7 +24,7 @@ Partituren erstellt werden können. * Wie eine LilyPond-Eingabe-Datei funktioniert:: * Voice enthält Noten:: * Kontexte und Engraver:: -* Erweiterung der Beispiele:: +* Erweiterung der Vorlagen:: @end menu @node Wie eine LilyPond-Eingabe-Datei funktioniert @@ -39,41 +39,9 @@ dieser Strukturen dargestellt werden, vieles aber zur Vereinfachung auch weggelassen werden. Für eine komplette Beschreibung des Eingabeformats siehe @ruser{Die Dateistruktur}. -Die meisten Beispiele in diesem Handbuch sind kleine Schnipsel, wie -etwa dieser: - -@example -c4 a b c -@end example - -Wie hoffentlich bekannt ist, lässt sich solch ein Schnipsel nicht -in dieser Form übersetzen. Diese Beispiele sind also nur Kurzformen -von wirklichen Beispielen. Sie müssen wenigstens zusätzlich in -geschweifte Klammern gesetzt werden. - -@example -@{ - c4 a b c -@} -@end example - -Die meisten Beispiele benutzen auch den @code{\relative c'}-Befehl. -Der ist nicht nötig, um die Dateien zu übersetzen, aber in den meisten -Fällen sieht der Notensatz seltsam aus, wenn man den Befehl -weglässt. - -@lilypond[quote,fragment,ragged-right,verbatim] -\relative c'' { - c4 a b c -} -@end lilypond - -Eine komplette Definition des Eingabeformats findet sich -im Kapitel @ruser{Die Dateistruktur}. - @menu * Einführung in die Dateistruktur von LilyPond:: -* Score ist ein (einziger) zusammengesetzter musikalischer Ausdruck:: +* Score ist ein (einziger) zusammengesetzter musikalischer Ausdruck:: * Musikalische Ausdrücke ineinander verschachteln:: * Über die Nicht-Schachtelung von Klammern und Bindebögen:: @end menu @@ -94,15 +62,15 @@ Ein grundlegendes Beispiel einer Eingabedatei für LilyPond lautet: \header @{ @} \score @{ - @var{...zusammengesetzter Musik-Ausdruck...} % Die gesamten Noten kommen hier hin! + @var{ @dots{} zusammengesetzter Musik-Ausdruck @dots{} } % Die gesamten Noten kommen hier hin! \layout @{ @} \midi @{ @} @} @end example @noindent -Aufgrund der Flexibilität von LilyPond gibt es viele Variationen dieses -Schemas, aber dieses Beispiel dient als einfacher Ausgangspunkt. +Zu diesem Muster gibt es viele Variationen, aber obiges Beispiel stellt +eine hilfreiche Ausgangsbasis dar. @funindex \book @funindex \score @@ -111,32 +79,27 @@ Schemas, aber dieses Beispiel dient als einfacher Ausgangspunkt. @cindex book @cindex score -Bisher hat noch keines der Beispiele den @code{\score@{@}}-Befehl -benutzt, da Lilypond derartige zusätzliche Befehle automatisch -bei Bedarf einfügt, wenn die Eingabedatei eine einfache Struktur -hat. - -Sehen wir uns als ein solches einfaches Beispiel an: +Bis jetzt hat keines der verwendeten Beispiele den @code{\score@{@}} +Befehl gebraucht. Das liegt daran, dass LilyPond automatisch fehlende +Befehle hinzufügt, sollten sie fehlen. Konkret betrachtet LilyPond eine +Eingabe in der Form @example -\relative c'' @{ - c4 a d c +\relative @{ + c''4 a d c @} @end example @noindent -Im Hintergrund kommen hier noch einige Ebenen dazu: LilyPond-Code -in der obigen Form ist in Wirklichkeit eine Abkürzung. Auch wenn man so -Dateien schreiben kann und sie auch korrekt gesetzt werden, heißt -der vollständige Code, der hier gemeint ist, eigentlich: +als eine abgekürzte Form von @example \book @{ \score @{ \new Staff @{ \new Voice @{ - \relative c'' @{ - c4 a b c + \relative @{ + c''4 a b c @} @} @} @@ -173,33 +136,32 @@ mit @code{\new Staff} und @code{\new Voice} zu erzeugen.} Im Moment wollen wir aber zu unserem ersten Beispiel zurückkehren und nur den @code{\score}-Befehl näher betrachten. -Eine Partitur (@code{\score}) muss immer mit einem musikalischen Ausdruck -beginnen. Das ist letztendlich alle Musik, angefangen bei einer -einzelnen -Note bis hin zu einer riesigen Partitur mit vielen Notensystemen -(bezeichnet hier durch @code{GrandStaff}): +Eine Partitur (@code{\score}) muss immer genau einen musikalischen Ausdruck +enthalten. Es sei daran erinnert, dass ein musikalischer alles mögliche sein +kann. Angefangen bei einer einzelnen Note bis hin zu riesigen zusammengesetzten +Ausdrücken wie @example @{ - \new GrandStaff << - @var{...hier die gesamte Partitur...} + \new StaffGroup << + @var{ @dots{} füge hier die gesamte Partitur einer Wagner Oper ein @dots{} } >> @} @end example @noindent -Da sich alles innerhalb der geschweiften Klammern @code{@{ ... @}} +Da sich alles innerhalb der geschweiften Klammern @code{@{ @dots{} @}} befindet, wird es wie ein einziger musikalischer Ausdruck behandelt. - -Ein @code{\score} auch andere Dinge enthalten, wie etwa +Wie wir oben schon gesehen haben kann der @code{\score} Block auch andere +Dinge enthalten, wie etwa @example \score @{ @{ c'4 a b c' @} + \header @{ @} \layout @{ @} \midi @{ @} - \header @{ @} @} @end example @@ -216,19 +178,19 @@ Ein @code{\score} auch andere Dinge enthalten, wie etwa @noindent Wie man sieht, sind die drei Befehle @code{\header}, @code{\layout} und -@code{\midi} von spezieller Natur: Im Gegensatz zu vielen Anderen Befehlen, +@code{\midi} von spezieller Natur: Im Gegensatz zu vielen anderen Befehlen, die auch mit einem @code{\} beginnen, liefern sie @emph{keinen} Musikausdruck und sind auch nicht Teil eines musikalischen Ausdrucks. Daher können sie -sowohl innerhalb eines @code{\score}-Blocks als auch außerhalb plaziert +sowohl innerhalb eines @code{\score}-Blocks als auch außerhalb platziert werden. Tatsächlich werden einige dieser Befehle meist außerhalb des -@code{\score}-Blocksgesetzt, zum Beispiel findet sich der @code{\header} +@code{\score}-Blocks gesetzt, z.B. findet sich der @code{\header} sehr oft oberhalb der @code{\score}-Umgebung. Das funktioniert genauso gut. Zwei bisher noch nicht aufgetauchte Befehle sind @code{\layout @{ @}} und @code{\midi @{@}}. Wenn sie in einer -Datei vorkommen, führt dies dazu, dass Lilypond eine druckfähige PDF-Datei -bzw. eine MIDI-Datei erzeugt. Genauer beschrieben werden sie im +Datei vorkommen, führt dies dazu, dass LilyPond eine druckfähige PDF-Datei +bzw. eine MIDI-Ausgabe erzeugt. Genauer beschrieben werden sie im Benutzerhandbuch -- @ruser{Partiturlayout} und @ruser{MIDI-Dateien erstellen}. @@ -236,11 +198,10 @@ Benutzerhandbuch -- @ruser{Partiturlayout} und @cindex book-Abschnitte, implizit @cindex implizite book-Umgebung @funindex \book -@funindex book Ihr LilyPond Code kann auch mehrere @code{\score}-Blöcke enthalten. Jeder davon wird als eigenständige Partitur interpretiert, die -allerdings alle in dieselbe Ausgabedatei plaziert werden. +allerdings alle in dieselbe Ausgabedatei platziert werden. Ein @code{\book}-Befehl ist nicht explizit notwendig -- er wird implizit erzeugt. Wenn jedoch für jeden @code{\score}-Block in einer einzigen @file{.ly}-Datei eine eigene Ausgabe-Datei erzeugt werden soll, @@ -274,16 +235,17 @@ Nähere Details finden sich im Abschnitt @ruser{Mehrere Partituren in einem Buch @cindex Variablen @cindex Bezeichner -Eine gute Möglichkeit zur Vereinfachung sind selbst definierte Variablen, wie auch gezeigt in @ref{Stücke durch Bezeichner organisieren}. +Eine gute Möglichkeit zur Vereinfachung sind selbst definierte Variablen, wie +auch in @ref{Stücke durch Variablen organisieren} gezeigt. Alle Vorlagen verwenden diese Möglichkeit: @example -melodie = \relative c' @{ - c4 a b c +melodie = \relative @{ + c'4 a b c @} \score @{ - @{ \melodie @} + \melodie @} @end example @@ -297,7 +259,7 @@ Als Variablenname kann fast jeder beliebige Name benutzt werden, allerdings dürfen nur Buchstaben vorkommen (also keine Zahlen, Unterstriche, Sonderzeichen, etc.) und er darf nicht wie ein LilyPond-Befehl lauten. Für mehr Information siehe -@ref{Tipparbeit durch Variablen und Funktionen ersparen}. Die genauen +@ref{Tipparbeit durch Variablen und Funktionen einsparen}. Die genauen Einschränkungen sind beschrieben in @ruser{Die Dateistruktur}. @@ -306,12 +268,11 @@ Eine vollständige Definition des Eingabeformats findet sich in @ruser{Die Dateistruktur}. -@node Score ist ein (einziger) zusammengesetzter musikalischer Ausdruck -@subsection Score ist ein (einziger) zusammengesetzter musikalischer Ausdruck +@node Score ist ein (einziger) zusammengesetzter musikalischer Ausdruck +@subsection Score ist ein (einziger) zusammengesetzter musikalischer Ausdruck @translationof Score is a (single) compound musical expression @funindex \score -@funindex score @cindex score @cindex Partitur @cindex Musikstück @@ -329,8 +290,7 @@ In Wirklichkeit ist das aber gar kein Geheimnis. Diese Zeile ist die Antwort: @quotation -@emph{Eine Partitur fängt immer mit @code{\score} an, gefolgt -von einem einzelnen musikalischen Ausdruck.} +@emph{Ein @code{\score} Block enthält immer genau einen musikalischen Ausdruck.} @end quotation @noindent @@ -348,34 +308,33 @@ wird also entfernt. Wir @emph{brauchen} aber einen Sänger und ein Klavier. @example \score @{ - @{ - << - \new Staff = "Sänger" << - >> - \new PianoStaff = "Klavier" << - >> + << + \new Staff = "Sänger" << >> - @} + \new PianoStaff = "Klavier" << + >> + >> \layout @{ @} @} @end example Hier wurden die Systeme (Staff) benannt: @qq{Sänger} und -@qq{Klavier}. Das ist nicht direkt notwendig in diesem Fall, +@qq{Klavier}. Das ist zwar nicht direkt notwendig, aber es ist gut, sich diese Schreibweise anzugewöhnen, damit man immer sofort erkennt, um welches System es sich handelt. -Zur Erinnerung: mit @code{<<} und @code{>>} werden Noten gleichzeitig -gesetzt. Dadurch werden Vokalstimme und Klaviersysteme übereinander -ausgegeben. Die @code{<< ... >>}-Konstruktion ist für das +Zur Erinnerung: mit @code{<< @dots{} >>} (an Stelle von @code{@{ @dots{} @}}) +werden Noten gleichzeitig gesetzt. +Dadurch werden Vokalstimme und Klaviersystem übereinander +ausgegeben. Die @code{<< @dots{} >>}-Konstruktion ist für das Sänger-System nicht notwendig, wenn hier nur die Noten einer -einzigen Stimme eingefügt werden sollen, aber @code{<< ... >>} +einzigen Stimme eingefügt werden sollen, aber @code{<< @dots{} >>} anstelle von geschwungenen Klammern sind notwendig, sobald mehr als eine Stimme oder etwa eine Notenstimme und Gesangstext eingefügt werden sollen. In unserem Fall soll eine Stimme mit Gesangstext notiert werden, sodass die spitzen Klammern benötigt werden. Die Noten sollen erst später hinzugefügt werden, -hier also erstmal nur ein paar Platzhalternoten und Text. Wenn +hier also erst mal nur ein paar Platzhalternoten und Text. Wenn Sie sich nicht erinnern, wie man Gesangstext notiert, lesen Sie noch einmal @code{\addlyrics} in @ref{Setting simple songs}. @@ -388,8 +347,8 @@ Sie noch einmal @code{\addlyrics} in @ref{Setting simple songs}. \addlyrics { And } >> \new PianoStaff = "Klavier" << - \new Staff = "oben" { } - \new Staff = "unten" { } + \new Staff = "oben" { c'1 } + \new Staff = "unten" { c'1 } >> >> \layout { } @@ -413,8 +372,8 @@ geschweiften Klammern neben @code{\new Voice = "Singstimme"} könnte man @example -\relative c'' @{ - r4 d8\noBeam g, c4 r +\relative @{ + r4 d''8\noBeam g, c4 r @} @end example @@ -425,7 +384,7 @@ verstehen, wie alles zusammenhängt. Darum bietet es sich an, Bezeichner (oder Variablen) zu verwenden. Sie wurden zu Beginn des vorigen Abschnitts erklärt, erinnern Sie sich? Damit wir sicher gehen können, dass der Inhalt der @code{text}-Variable als Gesangstext -interpretiert wird, wird ihm @code{\lyricmode} vorangesetzt. Wie +interpretiert wird, wird ihm @code{\lyricmode} voran gesetzt. Wie @code{\addlyrics} wird hiermit in den Eingabemodus für Gesangstext gewechselt. Ohne diesen Befehl würde LilyPond versuchen, den Inhalt der Variable als Noten zu interpretieren und dabei eine Menge @@ -437,10 +396,10 @@ für die linke Hand hinzufügen, folgendes Beispiel: @c KEEP LY @lilypond[verbatim,quote,ragged-right] -melodie = \relative c'' { r4 d8\noBeam g, c4 r } +melodie = \relative { r4 d''8\noBeam g, c4 r } text = \lyricmode { And God said, } -oben = \relative c'' { 2~ } -unten = \relative c { b2 e } +oben = \relative { 2~ } +unten = \relative { b,2 e } \score { << @@ -483,15 +442,15 @@ Benutzerhandbuch: @ruser{Struktur einer Partitur}. Notenzeilen (die @q{Staff}-Kontexte) müssen nicht unbedingt gleich zu Beginn erzeugt werden -- sie können auch zu einem späteren -Zeitpunkt eingeführt weden. Das ist vor allem nützlich, um +Zeitpunkt eingeführt werden. Das ist vor allem nützlich, um @rglosnamed{ossia,Ossias} zu erzeugen. Hier folgt ein kurzes Beispiel, wie eine zusätzliche temporäre Notenzeile für nur drei Noten erzeugt werden kann: @lilypond[verbatim,quote,ragged-right] \new Staff { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -519,14 +478,14 @@ gesetzt werden: @c KEEP LY @lilypond[verbatim,quote,ragged-right] \new Staff = "Hauptzeile" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = #"Hauptzeile" - }{ f8 f c } + } { f8 f c } >> r4 | } @@ -569,29 +528,29 @@ von Klammer-artigen Konstrukten kurz rekapitulieren: @multitable @columnfractions .3 .7 @headitem Klammerart @tab Funktion -@item @code{@{ .. @}} +@item @code{@{ @dots{} @}} @tab Umschließt ein sequenzielles Musiksegment -@item @code{< .. >} +@item @code{< @dots{} >} @tab Umschließt die Noten eines Akkords -@item @code{<< .. >>} +@item @code{<< @dots{} >>} @tab Umschließt parallele Musikausdrücke -@item @code{( .. )} +@item @code{( @dots{} )} @tab Markiert den Beginn und das Ende eines Haltebogens -@item @code{\( .. \)} +@item @code{\( @dots{} \)} @tab Markiert den Beginn und das Ende eines Phasierungsbogens -@item @code{[ .. ]} +@item @code{[ @dots{} ]} @tab Markiert den Beginn und das Ende eines manuell erzeugten Balkens @end multitable Zusätzlich sollten vielleicht noch einige weiter Konstruktionen erwähnt werden, die Noten auf irgendeine Art und Weise verbinden: Haltebögen (durch eine Tilde @code{~} markiert), -Triolen (als @code{\times x/y @{..@}} geschrieben) und -Vorschlagnoten (als @code{\grace@{..@}} notiert). +N-tolen (als @code{\tuplet x/y @{ @dots{} @}} geschrieben) und +Vorschlagnoten (als @code{\grace@{ @dots{} @}} notiert). Außerhalb von LilyPond fordert die übliche Benutzung von Klammern, dass die entsprechenden Arten korrekt verschachtelt -werden, wie z.B. in @code{<< [ @{ ( .. ) @} ] >>}. Die +werden, wie z.B. in @code{<< [ @{ ( @dots{} ) @} ] >>}. Die schließenden Klammern kommen dabei in der umgekehrten Reihenfolge wie die öffnenden Klammern vor. Dies ist auch in LilyPond ein @strong{Muss} für die drei Klammerarten, die in obiger @@ -611,8 +570,8 @@ Balken beginn, jedoch schon vor dem Ende des Balkens enden. Dies mag zwar musikalisch wenig Sinn ergeben, ist aber in LilyPond auch möglich: -@lilypond[quote,verbatim,ragged-right,relative=2] -{ g8\( a b[ c b\) a] g4 } +@lilypond[quote,verbatim,ragged-right] +\relative { g'8\( a b[ c b\) a] g4 } @end lilypond Im Allgemeinen können die verschiedenen Klammerarten, @@ -620,16 +579,16 @@ Klammer-artigen Konstruktionen, Haltebögen, Triolen und Vorschlagnoten beliebig kombiniert werden. Das folgende Beispiel zeigt einen Balken, der in eine Triole reicht (Zeile 1), eine Bindebogen, der ebenfalls in eine Triole -reicht (Zeile 2), einen Balken und einen Bindeboden in eine Triole, +reicht (Zeile 2), einen Balken und einen Bindebogen in eine Triole, ein Haltebogen, der über zwei Triolen läuft, sowie einen Phrasierungsbogen, der in einer Triole beginnt (Zeilen 3 und 4). @lilypond[quote,verbatim,ragged-right] -{ -r16[ g \tuplet 3/2 { r16 e'8] } -g16( a \tuplet 3/2 { b16 d) e' } -g8[( a \tuplet 3/2 { b8 d') e'~] } | -\tuplet 5/4 { e'32\( a b d' e' } a'4.\) +\relative { + r16[ g' \tuplet 3/2 { r16 e'8] } + g,16( a \tuplet 3/2 { b16 d) e } + g,8[( a \tuplet 3/2 { b8 d) e~] } | + \tuplet 5/4 { e32\( a, b d e } a4.\) } @end lilypond @@ -640,7 +599,7 @@ g8[( a \tuplet 3/2 { b8 d') e'~] } | Sänger brauchen Stimmen zum Singen, und LilyPond braucht sie auch: in der Tat sind alle Noten für alle Instrumente in einer Partitur -innerhalb von Stimmen gesetzt. Die Stimme ist das grundlegendste Prinzip +innerhalb von Stimmen gesetzt. Die Stimme ist das grundlegende Prinzip von LilyPond. @menu @@ -666,7 +625,7 @@ von LilyPond. @cindex Akkorde versus Stimmen @cindex Noten gleichzeitig -Die grundlegendsten und innersten Ebenen ein einer LilyPond-Partitur +Die grundlegenden und innersten Ebenen in einer LilyPond-Partitur werden @qq{Voice context} (Stimmenkontext) oder auch nur @qq{Voice} (Stimme) genannt. Stimmen werden in anderen Notationsprogrammen manchmal auch als @qq{layer} (Ebene) bezeichnet. @@ -686,20 +645,22 @@ Eine einzelne Stimme kann natürlich auch vielen Noten in einem Akkord enthalten -- wann also braucht man dann mehrere Stimmen? Schauen wir uns zuerst dieses Beispiel mit vier Akkorden an: -@lilypond[quote,verbatim,ragged-right,relative=1] -\key g \major -4 +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + 4 +} @end lilypond Das kann ausgedrückt werden, indem man die einfachen spitzen Klammern -@code{< ... >} benützt, um Akkorde anzuzeigen. Hierfür braucht man +@code{< @dots{} >} benützt, um Akkorde anzuzeigen. Hierfür braucht man nur eine Stimme. Aber gesetzt der Fall das Fis sollte eigentlich eine Achtelnote sein, gefolgt von einer Achtelnote G (als Durchgangsnote hin zum A)? Hier haben wir also zwei Noten, die zur gleichen Zeit beginnen, aber unterschiedliche Dauern haben: die Viertelnote D und die Achtelnote Fis. Wie können sie notiert werden? Als Akkord kann man sie nicht schreiben, weil alle Noten in einem Akkord die gleiche Länge besitzen -müssen. Sie können auch nicht als aufeinanderfolgende Noten geschrieben +müssen. Sie können auch nicht als aufeinander folgende Noten geschrieben werden, denn sie beginnen ja zur selben Zeit. In diesem Fall also brauchen wir zwei Stimmen. @@ -710,8 +671,8 @@ Wie aber wird das in der LilyPond-Syntax ausgedrückt? Die einfachste Art, Fragmente mit mehr als einer Stimme auf einem System zu notieren, ist, die Stimmen nacheinander (jeweils mit den Klammern -@code{@{ ... @}}) zu schreiben und dann mit den spitzen Klammern -(@code{<<...>>}) simultan zu kombinieren. Die beiden Fragmente müssen +@code{@{ @dots{} @}}) zu schreiben und dann mit den spitzen Klammern +(@code{<< @dots{} >>}) simultan zu kombinieren. Die beiden Fragmente müssen zusätzlich noch mit zwei Backslash-Zeichen (@code{\\}) voneinander getrennt werden, damit sie als zwei unterschiedliche Stimmen erkannt werden. Ohne diese Trenner würden sie als eine einzige Stimme notiert @@ -722,22 +683,26 @@ polyphone Stellen vorkommen. So sieht es aus, wenn die Akkorde in zwei Stimmen aufgeteilt werden und zur Durchgangsnote noch ein Bogen hinzugefügt wird: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key g \major -% Voice "1" Voice "2" -<< { g4 fis8( g) a4 g } \\ { d4 d d d } >> +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + % Voice = "1" Voice = "2" + << { g'4 fis8( g) a4 g } \\ { d4 d d d } >> +} @end lilypond Beachten Sie, dass die Hälse der zweiten Stimme nun nach unten zeigen. Hier ein anderes Beispiel: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key d \minor -% Voice "1" Voice "2" -<< { r4 g g4. a8 } \\ { d,2 d4 g } >> -<< { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> -<< { a2. r4 } \\ { fis2. s4 } >> +@lilypond[quote,verbatim,ragged-right] +\relative { + \key d \minor + % Voice = "1" Voice = "2" + << { r4 g' g4. a8 } \\ { d,2 d4 g } >> | + << { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> | + << { a2. r4 } \\ { fis2. s4 } >> | +} @end lilypond Es ist nicht notwendig, für jeden Takt eine eigene @@ -746,21 +711,28 @@ Noten pro Takt kann es die Quelldatei besser lesbar machen, aber wenn in einem Takt viele Noten vorkommen, kann man die gesamten Stimmen separat schreiben, wie hier: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key d \minor -<< { - % Voice "1" - r4 g g4. a8 | - bes4 bes c bes | - a2. r4 | -} \\ { - % Voice "2" - d,2 d4 g | - g4 g g8( a) g4 | - fis2. s4 | -} >> +@lilypond[quote,verbatim,ragged-right] +<< + \key d \minor + \relative { % Voice = "1" + r4 g' g4. a8 | + bes4 bes c bes | + a2. r4 | + } \\ + \relative { % Voice = "2" + d'2 d4 g | + g4 g g8( a) g4 | + fis2. s4 | + } +>> @end lilypond + +@cindex Voice, Benennung +@cindex Voices crossing brackets +@cindex Legatobögen crossing brackets +@cindex Bindebögen crossing brackets + Dieses Beispiel hat nur zwei Stimmen, aber die gleiche Konstruktion kann angewendet werden, wenn man drei oder mehr Stimmen hat, indem man weitere Backslash-Trenner hinzufügt. @@ -769,16 +741,16 @@ Die Stimmenkontexte tragen die Namen @code{"1"}, @code{"2"} usw. Der erste Kontext stellt die @qq{äußeren} Stimmen ein, die höchste Stimme im Kontext @code{"1"} und die tiefste Stimme im Kontext @code{"2"}. Die inneren Stimmen kommen in die Kontexte @code{"3"} und @code{"4"}. In -jeder dieser Kontexte wird die vertikale Ausrichtung von Bögen, Hälsen, +jedem dieser Kontexte wird die vertikale Ausrichtung von Bögen, Hälsen, Dynamik usw. entsprechend eingestellt. @lilypond[quote,verbatim] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f - % Voice "1" Voice "2" Voice "3" + c'16 d e f + % Voice = "1" Voice = "2" Voice = "3" << { g4 f e } \\ { r8 e4 d c8~ } >> | - << { d2 e } \\ { c8 b16 a b8 g~ g2 } \\ { s4 b c2 } >> | + << { d2 e } \\ { c8 b16 a b8 g~ 2 } \\ { s4 b c2 } >> | } @end lilypond @@ -798,10 +770,10 @@ auch noch später im Stück. Beachten Sie auch, dass übergebundene Noten hier an der blauen Dreieckstimme gezeigt. @lilypond[quote,verbatim] -\new Staff \relative c' { - % Main voice - c16 d e f - << % Bar 1 +\new Staff \relative { + % Hauptstimme + c'16 d e f + << % Takt 1 { \voiceOneStyle g4 f e @@ -812,12 +784,12 @@ hier an der blauen Dreieckstimme gezeigt. r8 e4 d c8~ } >> | - << % Bar 2 - % Voice 1 continues + << % Takt 2 + % Voice 1 wird fortgesetzt { d2 e } \\ - % Voice 2 continues - { c8 b16 a b8 g~ g2 } + % Voice 2 wird fortgesetzt + { c8 b16 a b8 g~ 2 } \\ { \voiceThreeStyle @@ -844,7 +816,7 @@ benutzt wird) hat dunkelrote Kreuze. @code{\voiceNeutralStyle} (hier auch nicht benutzt) macht diese Änderungen rückgängig. Später soll gezeigt werden, wie Befehle wie diese vom Benutzer selber erstellt werden können. Siehe auch @ref{Sichtbarkeit und Farbe von Objekten} und -@ref{Variablen für Optimierungen einsetzen}. +@ref{Variablen für Layout Anpassungen einsetzen}. @cindex Polyphonie und relativer Notationsmodus @cindex relativer Notationsmodus und Polyphonie @@ -855,7 +827,7 @@ der vorherigen Note errechnet, oder relativ zur ersten Note des vorigen Akkords. So ist etwa hier @example -\relative c' @{ NoteA << < NoteB NoteC > \\ NoteD >> NoteE @} +\relative @{ noteA << < noteB noteC > \\ noteD >> noteE @} @end example @noindent @@ -870,13 +842,13 @@ Stimme zu stellen. Das bietet sich an, wenn die Stimmen weit voneinander entfernt sind. @example -\relative c' @{ NoteA ... @} +\relative @{ NoteA @dots{} @} << - \relative c'' @{ < NoteB NoteC > ... @} + \relative @{ < NoteB NoteC > @dots{} @} \\ - \relative g' @{ NoteD ... @} + \relative @{ NoteD @dots{} @} >> -\relative c' @{ NoteE ... @} +\relative @{ NoteE @dots{} @} @end example Zum Schluss wollen wir die Stimmen in einem etwas komplizierteren Stück @@ -890,20 +862,20 @@ in späteren Abschnitten erklärt werden. @c The following should appear as music without code @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major - << % Voice one - { c2 aes4. bes8 } - \\ % Voice two + << % Voice 1 + { c''2 aes4. bes8 } + \\ % Voice 2 { - % Ignore these for now - they are explained in Ch 4 - \once \override NoteColumn.ignore-collision = ##t + % Ignoriere diese Befehle vorerst - sie werden in Kap. 4 erklärt + \once \override NoteColumn.force-hshift = #0 2 \once \override NoteColumn.force-hshift = #0.5 des2 } - \\ % No voice three - \\ % Voice four + \\ % Keine voice 3 + \\ % Voice 4 { \override NoteColumn.force-hshift = #0 aes'2 f4 fes @@ -937,23 +909,23 @@ verstehen können. @c The following should appear as music without code @c The three voice styles should be defined in -init @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { % Voice one + { % Voice 1 \voiceOneStyle - c2 aes4. bes8 + c''2 aes4. bes8 } - \\ % Voice two + \\ % Voice 2 { \voiceTwoStyle - % Ignore these for now - they are explained in Ch 4 - \once \override NoteColumn.ignore-collision = ##t + % Ignoriere diese Befehle vorerst - sie werden in Kap. 4 erklärt + \once \override NoteColumn.force-hshift = #0 2 \once \override NoteColumn.force-hshift = #0.5 des2 } - \\ % No Voice three (we want stems down) - \\ % Voice four + \\ % Keine Voice 3 (wir wollen Hälse nach unten) + \\ % Voice 4 { \voiceThreeStyle \override NoteColumn.force-hshift = #0 aes'2 f4 fes @@ -963,16 +935,17 @@ verstehen können. } @end lilypond + Versuchen wir also, diese Musik selber zu notieren. Wie wir sehen werden, beinhaltet das einige Schwierigkeiten. Fangen wir an, wie wir es gelernt haben, indem wir mit der @code{<< \\ >>}-Konstruktion die drei Stimmen des ersten Taktes notieren: @lilypond[quote,verbatim,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } + { c''2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } >> | 1 | } @@ -995,14 +968,14 @@ Noten in die vierte Stimme verschieben. Das wird einfach vorgenommen, indem noch ein Paar @code{\\}-Stimmen hinzugefügt wird. @lilypond[quote,verbatim,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major - << % Voice one - { c2 aes4. bes8 } - \\ % Voice two + << % Voice 1 + { c''2 aes4. bes8 } + \\ % Voice 2 { 2 des } - \\ % Omit Voice three - \\ % Voice four + \\ % Auslassen von Voice 3 + \\ % Voice 4 { aes'2 f4 fes } >> | 1 | @@ -1012,7 +985,7 @@ indem noch ein Paar @code{\\}-Stimmen hinzugefügt wird. @noindent Wie zu sehen ist, ändert das die Richtung der Hälse, aber die horizontale Ausrichtung der Noten ist nicht so, wie wir sie wollen. LilyPond -verschiebt die inneren NOten wenn sie oder ihre Hälse mit den äußeren +verschiebt die inneren Noten wenn sie oder ihre Hälse mit den äußeren Stimmen zusammenstoßen würden, aber das ist nicht richtig für Klaviermusik. In anderen Situationen können die Verschiebungen von LilyPond nicht ausreichend sein, um Überlappungen aufzulösen. LilyPond stellt verschiedene @@ -1025,6 +998,7 @@ auf; siehe @code{force-hshift}-Eigenschaft in @warning{Gesangstext und Strecker (wie etwa Bögen, Crescendo-Klammern usw.) können nicht von einer Stimme zur anderen erstellt werden.} + @seealso Notationsreferenz: @ruser{Mehrere Stimmen}. @@ -1034,15 +1008,10 @@ Notationsreferenz: @ruser{Mehrere Stimmen}. @translationof Explicitly instantiating voices @funindex \voiceOne -@funindex voiceOne @funindex \voiceTwo -@funindex voiceTwo @funindex \voiceThree -@funindex voiceThree @funindex \voiceFour -@funindex voiceFour @funindex \oneVoice -@funindex oneVoice @funindex \new Voice @cindex Voice context, erstellen von @cindex Stimmenkontexte, erstellen von @@ -1060,19 +1029,19 @@ verwendet haben: @example \new Staff @{ - \relative c' @{ - << @{ e4 f g a @} \\ @{ c,4 d e f @} >> + \relative @{ + << @{ e'4 f g a @} \\ @{ c,4 d e f @} >> @} @} @end example @noindent -ist identisch mit +ist identisch zu @example \new Staff << - \new Voice = "1" @{ \voiceOne \relative c' @{ e4 f g a @} @} - \new Voice = "2" @{ \voiceTwo \relative c' @{ c4 d e f @} @} + \new Voice = "1" @{ \voiceOne \relative @{ e'4 f g a @} @} + \new Voice = "2" @{ \voiceTwo \relative @{ c'4 d e f @} @} >> @end example @@ -1081,8 +1050,8 @@ Beide würden folgendes Notenbild erzeugen: @c The following example should not display the code @lilypond[ragged-right,quote] \new Staff << - \new Voice = "1" { \voiceOne \relative c' { e4 f g a } } - \new Voice = "2" { \voiceTwo \relative c' { c4 d e f } } + \new Voice = "1" { \voiceOne \relative { e'4 f g a } } + \new Voice = "2" { \voiceTwo \relative { c'4 d e f } } >> @end lilypond @@ -1103,27 +1072,27 @@ die Befehle @code{\oneVoice}, @code{\voiceOne} und @code{voiceTwo} mit Text, Bögen und Dynamikbezeichnung anstellen: @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { % Default behavior or behavior after \oneVoice - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceOne - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceTwo - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @@ -1141,10 +1110,10 @@ einem einzigen Stimmen (@code{voice})-Kontext befindet. Somit kann ein Phrasierungsbogen ober sie gesetzt werden. @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { +\new Staff \relative { \voiceOneStyle % This section is homophonic - c16^( d e f + c'16^( d e f % Start simultaneous section of three voices << % Continue the main voice in parallel @@ -1153,13 +1122,13 @@ Phrasierungsbogen ober sie gesetzt werden. \new Voice { % Set stems, etc., down \voiceTwo - r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { % Set stems, etc, up \voiceThree - s2. | s4 b4 c2 | + s2. | s4 b c2 | } >> } @@ -1178,18 +1147,18 @@ wenn eine Stimme nur kurz auftaucht, kann das der bessere Weg sein, Noten zu setzen: @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { - c16^( d e f +\new Staff \relative { + c'16^( d e f << - { g4 f e | d2 e2) | } + { g4 f e | d2 e) | } \new Voice { \voiceTwo - r8 e4 d c8~ + r8 e4 d c8~ | << - { c8 b16 a b8 g~ g2 | } + { c8 b16 a b8 g~ 2 | } \new Voice { \voiceThree - s4 b4 c2 | + s4 b c2 | } >> } @@ -1209,17 +1178,17 @@ Hierbei kann man mit unsichtbaren Noten dann die Stellen überspringen, an denen die Stimme nicht auftaucht, wie etwa hier: @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' << +\new Staff \relative << % Initiate first voice \new Voice { \voiceOne - c16^( d e f g4 f e | d2 e) | + c'16^( d e f g4 f e | d2 e) | } % Initiate second voice \new Voice { % Set stems, etc, down \voiceTwo - s4 r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + s4 r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1272,7 +1241,7 @@ nach links verschoben. @code{\shiftOnn} und @code{\shiftOnnn} definieren weitere Verschiebungsebenen, die man kurzzeitig anwählen kann, um Zusammenstöße in komplexen Situationen aufzulösen, siehe auch -@ref{Beispiele aus dem Leben}. +@ref{Beispiel aus dem Leben}. Eine Notenkolumne kann nur eine Note (oder einen Akkord) von einer Stimme mit Hälsen nach oben und eine Note (oder einen @@ -1281,12 +1250,17 @@ Noten von zwei Stimmen mit den Hälsen in die gleiche Richtung an der selben Stelle auftreten und in beiden Stimmen ist keine Verschiebung oder die gleiche Verschiebungsebene definiert, wird die Fehlermeldung -@qq{zu viele kollidierende Notenspalten werden ignoriert} +@qq{diese Stimme benötigt einen @code{@bs{}voiceXx} oder +@code{@bs{}shiftXx} Befehl} ausgegeben. @seealso -Notationsreferenz: @ruser{Mehrere Stimmen}. +Handbuch zum Lernen: +@ref{Verschieben von Objekten}. + +Notationsreferenz: +@ruser{Mehrere Stimmen}. @node Stimmen und Text @@ -1300,10 +1274,9 @@ Achtung: Der Gesangstext wird auf Englisch @qq{lyrics} genannt. @funindex \new Lyrics @funindex \lyricsto -@funindex lyricsto @funindex Lyrics @cindex Lyrics context, erstellen -@cindex Gesangtext, Verbindung mit Noten +@cindex Gesangstext, Verbindung mit Noten Wir haben schon den @code{\addlyrics@{@}}-Befehl betrachtet, mit dem einfache Partituren gut erstellt werden können. @@ -1317,10 +1290,10 @@ Bezeichnung der Stimme benutzt wird. @lilypond[quote,verbatim] << \new Voice = "one" { - \relative c'' { + \relative { \autoBeamOff \time 2/4 - c4 b8. a16 | g4. f8 | e4 d | c2 | + c''4 b8. a16 | g4. f8 | e4 d | c2 | } } \new Lyrics \lyricsto "one" { @@ -1339,7 +1312,6 @@ funktioniert. @cindex Text und Balken @cindex Balken und Text @funindex \autoBeamOff -@funindex autoBeamOff Die automatischen Balken, die LilyPond in der Standardeinstellung setzt, eignen sich sehr gut für instrumentale Musik, aber nicht @@ -1360,21 +1332,21 @@ benutzen, um diese flexiblere Technik für Gesangstexte zu illustrieren. Das Beispiel wurde so umgeformt, dass jetzt Variablen eingesetzt werden, um den Text und die Noten von der Partiturstruktur zu trennen. Es wurde zusätzlich -eine Chorpartiturklammer hinzugefügt. Der Gesangtext muss mit +eine Chorpartiturklammer hinzugefügt. Der Gesangstext muss mit @code{\lyricmode} eingegeben werden, damit er als Text und nicht als Noten interpretiert werden kann. @lilypond[quote,verbatim] global = { \key f \major \time 6/8 \partial 8 } -SopOneMusic = \relative c'' { - c8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ c4 +SopOneMusic = \relative { + c''8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ 4 } SopOneLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, __ } -SopTwoMusic = \relative c' { - r8 | r4. r4 c8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' +SopTwoMusic = \relative { + r8 | r4. r4 c'8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' } SopTwoLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, @@ -1430,10 +1402,10 @@ Variable wird oft auch mit @qq{global} bezeichnet. @lilypond[quote,verbatim] keyTime = { \key c \major \time 4/4 \partial 4 } -SopMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyricmode { E -- | ter -- nal fa -- ther, | strong to save, } @@ -1466,7 +1438,7 @@ VerseFour = @seealso -Notation Reference: @ruser{Notation von Gesang}. +Notationsreferenz: @ruser{Notation von Gesang}. @node Kontexte und Engraver @@ -1498,12 +1470,12 @@ hinzugefügt werden, die im Quellcode gar nicht explizit vorkommen. Vergleichen Sie etwa den Quellcode und die Notenausgabe des folgenden Beispiels: -@lilypond[quote,verbatim,relative=2] -cis4 cis2. | a4 a2. | +@lilypond[quote,verbatim] +\relative { cis''4 cis2. | a4 a2. | } @end lilypond Der Quellcode ist sehr kurz und knapp, während in der -Notenausgabe Taktlinien, Vorzeichen, ein Schlüssel und +Notenausgabe Taktstriche, Vorzeichen, ein Schlüssel und eine Taktart hinzugefügt wurden. Während LilyPond den Eingabetext @emph{interpretiert}, wird die musikalische Information von rechts nach links gelesen, @@ -1513,7 +1485,7 @@ merkt es sich, wo sich Taktgrenzen befinden und für welche Tonhöhen Versetzungszeichen gesetzt werden müssen. Diese Information muss auf mehreren Ebenen gehandhabt werden, denn Versetzungszeichen etwa -beziehen sich nur auf ein System, Taktlinien dagegen +beziehen sich nur auf ein System, Taktstriche dagegen üblicherweise auf die gesamte Partitur. Innerhalb von LilyPond sind diese Regeln und @@ -1540,7 +1512,7 @@ zum Beispiel kann eine Vorzeichenregel einführen und der einzuordnen, ob ein Versetzungszeichen gesetzt werden muss oder nicht. -Ein anderes Beispiel: die Synchronisation der Taktlinien ist +Ein anderes Beispiel: die Synchronisation der Taktstriche ist standardmäßig im @code{Score}-Kontext verankert. Manchmal sollen die Systeme einer Partitur aber unterschiedliche Taktarten enthalten, etwa in einer polymetrischen Partitur mit @@ -1573,7 +1545,7 @@ angeschlossen, etwa @seealso -Notationreferenz: @ruser{Was sind Kontexte?}. +Notationsreferenz: @ruser{Was sind Kontexte?}. @node Kontexte erstellen @@ -1581,7 +1553,6 @@ Notationreferenz: @ruser{Was sind Kontexte?}. @translationof Creating contexts @funindex \new -@funindex new @cindex Neue Kontexte @cindex Erstellen von Kontexten @cindex Kontexte, Erstellen @@ -1633,9 +1604,9 @@ werden, hier ein kommentiertes Beispiel aus dem richtigen Leben: \clef "treble" \key g \minor \new Voice { % create voice for RH notes - \relative c'' { % start of RH notes - d4 ees16 c8. - d4 ees16 c8. + \relative { % start of RH notes + d''4 ees16 c8. | + d4 ees16 c8. | } % end of RH notes } % end of RH voice } % end of RH staff @@ -1644,16 +1615,16 @@ werden, hier ein kommentiertes Beispiel aus dem richtigen Leben: \key g \minor \new Voice { % create LH voice one \voiceOne - \relative g { % start of LH voice one notes - g8 ees, - g8 ees, + \relative { % start of LH voice one notes + g8 ees, | + g8 ees, | } % end of LH voice one notes } % end of LH voice one \new Voice { % create LH voice two \voiceTwo - \relative g { % start of LH voice two notes - g4 ees - g4 ees + \relative { % start of LH voice two notes + g4 ees | + g4 ees | } % end of LH voice two notes } % end of LH voice two >> % end of LH staff @@ -1704,7 +1675,7 @@ zu Gesangstexten angewandt, siehe @ref{Stimmen und Text}. @seealso -Notationsreferenz: @ruser{Kontexte erstellen}. +Notationsreferenz: @ruser{Kontexte erstellen und referenzieren}. @node Was sind Engraver? @@ -1769,7 +1740,7 @@ abzuleiten. @item Clef_engraver @tab Erstellt Notenschlüssel. @item Completion_heads_engraver - @tab Teilt Noten in kleiner Werte, wenn sie über die Taktlinie reichen. + @tab Teilt Noten in kleiner Werte, wenn sie über den Taktstrich reichen. @item Dynamic_engraver @tab Erstellt Dynamik-Klammern und Dynamik-Texte. @item Forbid_line_break_engraver @@ -1821,15 +1792,15 @@ Kontexte werden mit dem @code{\set}-Befehl geändert. Er wird in Form @example -\set @var{KontextBezeichnung}.@var{eigenschaftsBezeichnung} = #@var{Wert} +\set @emph{KontextBezeichnung}.@emph{EigenschaftsBezeichnung} = #@emph{Wert} @end example @noindent -verwendet, wobei @var{KontextBezeichnung} üblicherweise +verwendet, wobei @emph{KontextBezeichnung} üblicherweise @code{Score}, @code{Staff} oder @code{Voice} ist. Der erste Teil kann auch ausgelassen werden; in diesem Fall wird der aktuelle -Kontext (üblicherweise @code{Voice}) eingesetzt. +Kontext (üblicherweise @code{Voice}) angenommen. Die Bezeichnung von Kontexten-Eigenschaften besteht aus zwei Wörtern, die ohne Unterstrich oder Bindestrich @@ -1840,7 +1811,7 @@ Kontext-Eigenschaften. Es gibt sehr viel mehr. @c attempt to force this onto a new page @need 50 @multitable @columnfractions .25 .15 .45 .15 -@headitem eigenschaftsBezeichnung +@headitem Eigenschaftsbezeichnung @tab Typ @tab Funktion @tab Beispiel-Wert @@ -1901,14 +1872,14 @@ nicht, weil der Kontext ausgelassen wurde. @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { + \new Staff \relative { \set Staff.instrumentName = #"Soprano" - c2 c - } - \new Staff \relative c' { + c''2 c + } + \new Staff \relative { \set instrumentName = #"Alto" % Wrong! - d2 d - } + d'2 d + } >> @end lilypond @@ -1937,46 +1908,46 @@ Bezeichnungen in der Interna-Referenz zu überprüfen: siehe Die Eigenschaft @code{instrumentName} wird erst aktiv, wenn sie in einem @code{Staff}-Kontext gesetzt wird, aber manche Eigenschaften können in mehr als einem Kontext benutzt werden. Als Beispiel mag die -@code{extraNatural}-Eigenschaft dienen, die zusätzliche Erniedrigungszeichen +@code{extraNatural}-Eigenschaft dienen, die zusätzliche Auflösungszeichen setzt. Die Standardeinstellung ist ##t (wahr) in allen Systemen. Wenn sie nur in einem @code{Staff} (Notensystem) auf ##f (falsch) gesetzt wird, wirkt sie sich auf alle Noten in diesem System aus. Wird sie dagegen in der @code{Score}-Umgebung gesetzt, wirkt sich das auf alle darin enthaltenen Systeme aus. -Das also bewirkt, dass die zusätzlichen Erniedrigungszeichen in einem System +Das also bewirkt, dass die zusätzlichen Auflösungszeichen in einem System ausgeschaltet sind: @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - aeses2 aes + \new Staff \relative { + aeses'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Staff.extraNatural = ##f - aeses2 aes + aeses'2 aes } >> @end lilypond @noindent -während das dazu dient, sie in allen Systemen auszuschalten: +während dies dazu dient, sie in allen Systemen auszuschalten: @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - aeses2 aes + \new Staff \relative { + aeses'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Score.extraNatural = ##f - aeses2 aes + aeses'2 aes } >> @end lilypond Ein anderes Beispiel ist die Eigenschaft @code{clefTransposition}: wenn sie im @code{Score}-Kontext gesetzt wird, ändert sich sofort -der Wert der Oktavierung in allen aktuellen Systemen und wird +der Wert der Tranponierung in allen aktuellen Systemen und wird auf einen neuen Wert gesetzt, der sich auf alle Systeme auswirkt. Der gegenteilige Befehl, @code{\unset}, entfernt die Eigenschaft @@ -1993,17 +1964,19 @@ wir als Beispiel, die Schriftgröße mehrmals zu ändern, was sich unter anderem auf die Notenköpfe auswirkt. Die Änderung bezieht sich immer auf den Standard, nicht vom letzten gesetzten Wert. -@lilypond[quote,verbatim,ragged-right,relative=1] -c4 d -% make note heads smaller -\set fontSize = #-4 -e4 f | -% make note heads larger -\set fontSize = #2.5 -g4 a -% return to default size -\unset fontSize -b4 c | +@lilypond[quote,verbatim,ragged-right] +\relative { + c'4 d + % make note heads smaller + \set fontSize = #-4 + e4 f | + % make note heads larger + \set fontSize = #2.5 + g4 a + % return to default size + \unset fontSize + b4 c | +} @end lilypond Wir haben jetzt gesehen, wie sich die Werte von unterschiedlichen @@ -2019,7 +1992,6 @@ eingegeben werden kann. @subsubheading Kontexteigenschaften mit @code{\with} setzen @funindex \with -@funindex with @cindex Kontexteigenschaft, setzen mit \with Die Standardwerte von Kontexteigenschaften können zu dem Zeitpunkt @@ -2027,7 +1999,7 @@ definiert werden, an welchem der Kontext erstellt wird. Manchmal ist das eine saubere Weise, eine Eigenschaft zu bestimmen, die für die gesamte Partitur erhalten bleiben soll. Wenn ein Kontext mit einem @code{\new}-Befehl erstellt wird, können in einer -direkt folgenden @code{\with @{ .. @}}-Umgebung die Eigenschaften +direkt folgenden @code{\with @{ @dots{} @}}-Umgebung die Eigenschaften bestimmt werden. Wenn also die zusätzlichen Auflösungszeichen für eine ganze Partitur gelten sollen, könnte man schreiben: @@ -2041,13 +2013,14 @@ etwa so: @lilypond[quote,verbatim,ragged-right] << - \new Staff - \relative c'' { - gisis4 gis aeses aes + \new Staff { + \relative { + gisis'4 gis aeses aes } + } \new Staff \with { extraNatural = ##f } { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } >> @@ -2072,7 +2045,6 @@ wird, kann dieser neue Standardwert mit dem Befehl @cindex Kontexteigenschaften, mit \context setzen @cindex Eigenschaften von Kontexten, mit \context setzen @funindex \context -@funindex context Die Werte von Kontext-Eigenschaften können in @emph{allen} Kontexten eines bestimmten Typs (etwa alle @code{Staff}-Kontexte) @@ -2083,7 +2055,7 @@ für die Eigenschaft ist der gleiche, wie er auch in der @code{\with}-Konstruktion benutzt wird, wie oben gezeigt. Er wird in eine @code{\context}-Umgebung eingebettet, welche wiederum innerhalb von einer @code{\layout}-Umgebung steht. Jede @code{\context}-Umgebung -wirkt sich auf alle Kontexte dieses Types aus, welche sich in der +wirkt sich auf alle Kontexte dieses Typs aus, welche sich in der aktuellen Partitur befinden (d. h. innerhalb einer @code{\score}- oder @code{\book}-Umgebung). Hier ist ein Beispiel, wie man diese Funktion anwendet: @@ -2091,8 +2063,8 @@ Funktion anwendet: @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - cisis4 e d cis + \relative { + cisis''4 e d cis } } \layout { @@ -2111,13 +2083,13 @@ Wenn die Veränderung der Eigenschaft sich auf alle Systeme einer \score { << \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } >> @@ -2162,14 +2134,13 @@ Referenz der Interna: Wir haben gesehen, dass jeder Kontext eine Anzahl an Engravern (Stempeln) beinhaltet, von denen ein jeder einen bestimmten -Teil des fertigen Notensatzes produziert, wie z. B. Taktlinien, +Teil des fertigen Notensatzes produziert, wie z. B. Taktstriche, Notenlinien, Notenköpfe, Hälse usw. Wenn ein Engraver aus einem Kontext entfernt wird, kann er seine Objekte nicht länger produzieren. Das ist eine eher grobe Methode, die Notenausgabe zu beeinflussen, aber es kann von großem Nutzen sein. - @subsubheading Einen einzelnen Kontext verändern Um einen Engraver von einem einzelnen Kontext zu entfernen, @@ -2186,8 +2157,8 @@ erstellt werden. \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c' { - c4 d +\relative { + c'4 d \set fontSize = #-4 % make note heads smaller e4 f | \set fontSize = #2.5 % make note heads larger @@ -2222,15 +2193,15 @@ und zeigt ihn an: \new Voice \with { \consists "Ambitus_engraver" } { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @@ -2247,21 +2218,20 @@ Stimmen in diesem Notensystem errechnet: } << \new Voice { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @end lilypond - @subsubheading Alle Kontexte des gleichen Typs verändern @funindex \layout @@ -2279,24 +2249,24 @@ mit vier Systemen anzeigen wollen, könnte das so aussehen: \score { << \new Staff { - \relative c'' { - c4 a b g + \relative { + c''4 a b g } } \new Staff { - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "G_8" - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "bass" - \relative c { + \relative { c4 a b g } } @@ -2328,11 +2298,11 @@ entfernt wird, werden keine Notenköpfe erstellt und demzufolge auch keine Hälse oder Bögen dargestellt. -@node Erweiterung der Beispiele -@section Erweiterung der Beispiele +@node Erweiterung der Vorlagen +@section Erweiterung der Vorlagen @translationof Extending the templates -Sie haben sich durch die Übung gearbeitet, Sie +Sie haben sich durch das Tutorium gearbeitet, Sie wissen jetzt, wie Sie Notensatz produzieren, und Sie haben die grundlegenden Konzepte verstanden. Aber wie erhalten Sie genau die Systeme, die Sie brauchen? Es @@ -2345,8 +2315,8 @@ was Sie brauchen? Lesen Sie weiter. * Sopran und Cello:: * Vierstimmige SATB-Partitur:: * Eine Partitur von Grund auf erstellen:: -* Tipparbeit durch Variablen und Funktionen ersparen:: -* Partitur und Stimmen:: +* Tipparbeit durch Variablen und Funktionen einsparen:: +* Partituren und Stimmen:: @end menu @@ -2366,7 +2336,8 @@ Fall könnten Sie mit der Vorlage @qq{Noten und Text} @example \version @w{"@version{}"} -melody = \relative c' @{ + +melody = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2396,7 +2367,7 @@ Beispiel @qq{Nur Noten} an: @example \version @w{"@version{}"} -melody = \relative c' @{ +melody = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2429,7 +2400,7 @@ für den Sopran und @code{CelloNoten} für die Cellostimme. Wenn wir schon dabei sind, können wir @code{text}auch nach @code{SoprText} umbenennen. Denken Sie daran, beide Vorkommen der Bezeichnung zu ändern: einmal die Definition -gleich am Anfang (@code{melody = \relative c' @{ }) und +gleich am Anfang (@code{melody = \relative @{ }) und dann auch noch die Benutzung der Variable innerhalb des @code{\score}-Abschnittes. @@ -2440,7 +2411,7 @@ Wir ändern auch die Noten etwas ab. @example \version @w{"@version{}"} -SopranNoten = \relative c' @{ +SopranNoten = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2451,7 +2422,7 @@ SoprText = \lyricmode @{ Aaa Bee Cee Dee @} -CelloNoten = \relative c @{ +CelloNoten = \relative @{ \clef "bass" \key c \major \time 4/4 @@ -2493,14 +2464,14 @@ sieht jetzt so aus: @example \score @{ << - << - \new Voice = "eins" @{ - \autoBeamOff - \SopranNoten - @} - \new Lyrics \lyricsto "eins" \SoprText - >> - \new Staff \CelloNoten + << + \new Voice = "eins" @{ + \autoBeamOff + \SopranNoten + @} + \new Lyrics \lyricsto "eins" \SoprText + >> + \new Staff \CelloNoten >> \layout @{ @} \midi @{ @} @@ -2513,7 +2484,7 @@ nicht mehr. Das können wir aber schnell in Ordnung bringen. Hier also die gesamte Vorlage für Sopran und Cello: @lilypond[quote,verbatim,ragged-right,addversion] -sopranoMusic = \relative c' { +sopranoMusic = \relative { \clef "treble" \key c \major \time 4/4 @@ -2524,7 +2495,7 @@ sopranoLyrics = \lyricmode { Aaa Bee Cee Dee } -celloMusic = \relative c { +celloMusic = \relative { \clef "bass" \key c \major \time 4/4 @@ -2551,7 +2522,7 @@ celloMusic = \relative c { @seealso Die Vorlagen, mit denen wir begonnen haben, können im Anhang @qq{Vorlagen} gefunden werden, siehe -@ref{Ein einzelnes System}. +@ref{Vorlagen für ein einzelnes System}. @node Vierstimmige SATB-Partitur @@ -2574,41 +2545,46 @@ notiert wird. Hier ein Beispiel aus Händels @notation{Messias}: @lilypond[quote,ragged-right] global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { + +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis e2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis e2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { + +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { + +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { + +upper = \relative { \clef "treble" \global - r4 2 4 - 4. 8 2 - 4 2 + r4 2 4 | + 4. 8 2 | + 4 2 | } -lower = \relative c, { + +lower = \relative { \clef "bass" \global - 4 2 4 - 4. 8 2 - 4 2 + 4 2 4 | + 4. 8 2 | + 4 2 | } \score { @@ -2631,9 +2607,7 @@ lower = \relative c, { \altoMusic } >> - \new Lyrics \lyricsto "altos" { - \altoWords - } + \new Lyrics \lyricsto "altos" { \altoWords } \new Staff = "tenors" << \set Staff.instrumentName = #"Tenor" \new Voice = "tenors" { @@ -2641,9 +2615,7 @@ lower = \relative c, { \tenorMusic } >> - \new Lyrics \lyricsto "tenors" { - \tenorWords - } + \new Lyrics \lyricsto "tenors" { \tenorWords } \new Staff = "basses" << \set Staff.instrumentName = #"Bass" \new Voice = "basses" { @@ -2655,7 +2627,6 @@ lower = \relative c, { \bassWords } >> % end ChoirStaff - \new PianoStaff << \set PianoStaff.instrumentName = #"Piano" \new Staff = "upper" \upper @@ -2665,9 +2636,17 @@ lower = \relative c, { } @end lilypond -Keine der Vorlage bietet diesen Aufbau direkt an. Die Vorlage, die -am nächsten daran liegt, ist @qq{SATB-Partitur und automatischer -Klavierauszug}, siehe @ref{Vokalensemble}. Wir müssen diese +@warning{Das vorliegende Layout kann sehr einfach erzeugt werden. Am Besten +verwenden sie dafür das vordefinierte Beispiel @code{satb.ly}, siehe auch +@ref{Built-in templates}. Zum Zweck der einfachen Handhabung wird der +verwendete Kontextaufbau bewusst versteckt und sich darauf verlassen, dass LilyPond +alles automatisch bereit stellt. Lassen sie uns zu Lehrzwecken probieren, +das alles von Grund auf selbst zu entwickeln. Irgendwann werden sie das sowieso machen +müssen, nämlich genau dann, wenn ein vorgegebenes Beispiel ihre +Anforderungen nicht angemessen erfüllt.} + +Dem gewünschten Ergebnis am nächsten kommt sicher das +@ref{SATB-Partitur und automatischer Klavierauszug} -- wir müssen diese Vorlage aber so anpassen, dass die Noten für das Klavier nicht automatisch aus dem Chorsatz generiert werden. Die Variablen für die Noten und den Text des Chores sind in Ordnung, wir @@ -2691,7 +2670,7 @@ Damit erhalten wir folgenden @code{ChoirStaff}: @example \new ChoirStaff << \new Staff = "sopranos" << - \set Staff.instrumentName = #"Sopran" + \set Staff.instrumentName = #"Soprano" \new Voice = "sopranos" @{ \global \sopranoMusic @@ -2701,7 +2680,7 @@ Damit erhalten wir folgenden @code{ChoirStaff}: \sopranoWords @} \new Staff = "altos" << - \set Staff.instrumentName = #"Alt" + \set Staff.instrumentName = #"Alto" \new Voice = "altos" @{ \global \altoMusic @@ -2740,14 +2719,14 @@ aus der @qq{Piano solo}-Vorlage: @example \new PianoStaff << \set PianoStaff.instrumentName = #"Piano " - \new Staff = "oben" \oben - \new Staff = "unten" \unten + \new Staff = "upper" \upper + \new Staff = "lower" \lower >> @end example @noindent -und fügen die Variablen @code{oben} -und @code{unten} hinzu. +und fügen die Variablen @code{upper} +und @code{lower} hinzu. Das Chorsystem und das Pianosystem müssen mit spitzen Klammern kombiniert werden, damit beide @@ -2808,45 +2787,42 @@ Alles miteinander kombiniert und mit den Noten für drei Takte sieht unser Beispiel nun so aus: @lilypond[quote,verbatim,ragged-right,addversion] -global = { - \key d \major - \time 4/4 -} -sopranoMusic = \relative c'' { +global = { \key d \major \time 4/4 } +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis fis2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis fis2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4 2 4 - 4. 8 2 - 4 2 + r4 2 4 | + 4. 8 2 | + 4 2 | } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 - 4. 8 2 - 4 2 + 4 2 4 | + 4. 8 2 | + 4 2 | } \score { @@ -2920,7 +2896,7 @@ manchmal einfacher ist, von Grund auf anzufangen, anstatt die fertigen Vorlagen zu verändern. Auf diese Art könne Sie auch Ihren eigenen Stil entwickeln, und ihn der Musik anpassen, die Sie notieren wollen. Als Beispiel wollen wir demonstrieren, -wie man die Partitur für ein Orgelpreludium von Grund auf +wie man die Partitur für ein Orgelpräludium von Grund auf konstruiert. Beginnen wir mit dem Kopf, dem @code{header}-Abschnitt. @@ -2931,7 +2907,7 @@ schließlich am Ende die eigentliche Partitur, den Struktur, in die wir dann die Einzelheiten nach und nach eintragen. -Als Beispiel benutzen wir zwei Takte aus dem Orgelpreludium +Als Beispiel benutzen wir zwei Takte aus dem Orgelpräludium @notation{Jesu, meine Freude} von J. S. Bach, notiert für zwei Manuale und Pedal. Sie können die Noten am Ende dieses Abschnittes sehen. Das obere Manual trägt zwei Stimmen, @@ -2943,7 +2919,7 @@ Taktart und Tonart zu definieren. \version @w{"@version{}"} \header @{ title = "Jesu, meine Freude" - composer = "J. S. Bach" + composer = "J S Bach" @} keyTime = @{ \key c \minor \time 4/4 @} ManualOneVoiceOneMusic = @{ s1 @} @@ -2999,7 +2975,7 @@ häufiger Fehler, der wohl auch Ihnen früher oder später unterläuft. Sie können das fertige Beispiel am Ende des Abschnittes kopieren und die Klammern entfernen, um zu sehen, wie die -Fehlermeldung aussehen kann, die Sie in solch +Fehlermeldungen aussehen könnten, die Sie in solch einem Fall erhalten würden. @example @@ -3028,7 +3004,7 @@ einem Fall erhalten würden. @end example Es ist nicht notwendig, die simultane Konstruktion -@code{<< .. >>} innerhalb des zweiten Manualsystems +@code{<< @dots{} >>} innerhalb des zweiten Manualsystems und des Pedalsystems zu benutzen, denn sie enthalten nur eine Stimme. Andererseits schadet es nichts, sie zu schreiben, und es ist eine gute Angewohnheit, immer @@ -3036,7 +3012,7 @@ die spitzen Klammern nach einem @code{\new Staff} zu schreiben, wenn mehr als eine Stimme vorkommen könnten. Für Stimmen (@code{Voice}) dagegen gilt genau das Gegenteil: eine neue Stimme sollte immer von -geschweiften Klammern (@code{@{ .. @}}) gefolgt +geschweiften Klammern (@code{@{ @dots{} @}}) gefolgt werden, falls Sie ihre Noten in mehrere Variable aufteilen, die nacheinander gesetzt werden sollen. @@ -3054,7 +3030,7 @@ Variable @code{\keyTime} eingefügt. << % PianoStaff and Pedal Staff must be simultaneous \new PianoStaff << \new Staff = "ManualOne" << - \keyTime % set time signature and key + \keyTime % set key and time signature \clef "treble" \new Voice @{ \voiceOne @@ -3154,7 +3130,6 @@ sind. >> @} % end Score context @end example - Damit ist das Grundgerüst fertig. Jede Orgelmusik mit drei Systemen hat die gleiche Struktur, auch wenn die Anzahl der Stimmen in einem System sich ändern kann. Jetzt müssen wir nur noch @@ -3167,20 +3142,20 @@ die Variablen mit einem Backslash in die Partitur einbauen. composer = "J S Bach" } keyTime = { \key c \minor \time 4/4 } -ManualOneVoiceOneMusic = \relative g' { - g4 g f ees | - d2 c2 | +ManualOneVoiceOneMusic = \relative { + g'4 g f ees | + d2 c | } -ManualOneVoiceTwoMusic = \relative c' { - ees16 d ees8~ ees16 f ees d c8 d~ d c~ | - c8 c4 b8 c8. g16 c b c d | +ManualOneVoiceTwoMusic = \relative { + ees'16 d ees8~ 16 f ees d c8 d~ d c~ | + 8 c4 b8 c8. g16 c b c d | } -ManualTwoMusic = \relative c' { - c16 b c8~ c16 b c g a8 g~ g16 g aes ees | - f16 ees f d g aes g f ees d e8~ ees16 f ees d | +ManualTwoMusic = \relative { + c'16 b c8~ 16 b c g a8 g~ 16 g aes ees | + f16 ees f d g aes g f ees d ees8~ 16 f ees d | } -PedalOrganMusic = \relative c { - r8 c16 d ees d ees8~ ees16 a, b g c b c8 | +PedalOrganMusic = \relative { + r8 c16 d ees d ees8~ 16 a, b g c b c8 | r16 g ees f g f g8 c,2 | } @@ -3188,7 +3163,7 @@ PedalOrganMusic = \relative c { << % PianoStaff and Pedal Staff must be simultaneous \new PianoStaff << \new Staff = "ManualOne" << - \keyTime % set time signature and key + \keyTime % set key and time signature \clef "treble" \new Voice { \voiceOne @@ -3225,8 +3200,8 @@ Glossar: @rglos{system}. -@node Tipparbeit durch Variablen und Funktionen ersparen -@subsection Tipparbeit durch Variablen und Funktionen ersparen +@node Tipparbeit durch Variablen und Funktionen einsparen +@subsection Tipparbeit durch Variablen und Funktionen einsparen @translationof Saving typing with variables and functions @cindex Variablen @@ -3234,7 +3209,7 @@ Glossar: Bis jetzt wurde immer derartige Notation vorgestellt: @lilypond[quote,verbatim,ragged-right] -hornNotes = \relative c'' { c4 b dis c } +hornNotes = \relative { c''4 b dis c } \score { { @@ -3247,8 +3222,9 @@ Sie können sich vorstellen, dass das etwa für minimalistische Musik sehr nützlich sein könnte: @lilypond[quote,verbatim,ragged-right] -fragmentA = \relative c'' { a4 a8. b16 } -fragmentB = \relative c'' { a8. gis16 ees4 } +fragmentA = \relative { a'4 a8. b16 } +fragmentB = \relative { a'8. gis16 ees4 } + violin = \new Staff { \fragmentA \fragmentA | \fragmentB \fragmentA | @@ -3265,20 +3241,21 @@ Diese Variablen (die man auch als Makros oder Benutzer-Befehl bezeichnet) können jedoch auch für eigene Anpassungen eingesetzt werden: -@c TODO Avoid padtext - not needed with skylining @lilypond[quote,verbatim,ragged-right] dolce = \markup { \italic \bold dolce } -padText = { \once \override TextScript.padding = #5.0 } -fthenp=_\markup { - \dynamic f \italic \small { 2nd } \hspace #0.1 dynamic p + +centreText = { \once \override TextScript.self-alignment-X = #CENTER } + +fthenp =_\markup { + \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } -violin = \relative c'' { +violin = \relative { \repeat volta 2 { - c4._\dolce b8 a8 g a b - \padText - c4.^"hi there!" d8 e' f g d - c,4.\fthenp b8 c4 c-. + c''4._\dolce b8 a8 g a b | + \centreText + c4.^"hi there!" d8 e f g d | + c4.\fthenp b8 c4 c-. | } } @@ -3286,23 +3263,23 @@ violin = \relative c'' { { \violin } - \layout{ragged-right=##t} } @end lilypond -Derartige Variablen sind offensichtlich sehr nützlich, zu Tipparbeit zu ersparen. Aber es lohnt sich schon, sie zu +Derartige Variablen sind offensichtlich sehr nützlich, sich +Tipparbeit zu ersparen. Aber es lohnt sich schon, sie zu benutzen, wenn man sie nur einmal benutzen will, denn sie vereinfachen die Struktur einer Datei sehr stark. Hier das vorige Beispiel ohne jede Benutzung von Variablen. Es ist sehr viel schwerer lesbar, besonders die letzte Zeile. @example -violin = \relative c'' @{ +violin = \relative @{ \repeat volta 2 @{ - c4._\markup @{ \italic \bold dolce @} b8 a8 g a b - \once \override TextScript.padding = #5.0 - c4.^"hi there!" d8 e' f g d - c,4.\markup @{ + c''4._\markup @{ \italic \bold dolce @} b8 a8 g a b | + \once \override TextScript.self-alignment-X = #CENTER + c4.^"hi there!" d8 e f g d | + c4._\markup @{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} b8 c4 c-. | @@ -3310,13 +3287,10 @@ violin = \relative c'' @{ @} @end example -@c TODO Replace the following with a better example -td -@c Skylining handles this correctly without padText - Bisher haben wir vor allem statische Ersetzungen betrachtet: -wenn LilyPond etwa @code{\padText} sieht, wird es ersetzt mit +wenn LilyPond etwa @code{\centreText} sieht, wird es ersetzt mit all dem Code, mit dem wir es definiert haben (also alles, -was sich rechts von @code{padtext=} befindet). +was sich rechts von @code{centreText=} befindet). LilyPond kann auch nicht-statische Ersetzungen bewältigen. Man kann sie sich als Funktionen vorstellen. @@ -3324,33 +3298,32 @@ kann sie sich als Funktionen vorstellen. @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function - (parser location padding) + (padding) (number?) #{ \once \override TextScript.padding = #padding #}) -\relative c''' { - c4^"piu mosso" b a b | +\relative { + c''4^"piu mosso" b a b \padText #1.8 - c4^"piu mosso" d e f | + c4^"piu mosso" b a b \padText #2.6 - c4^"piu mosso" fis a g | + c4^"piu mosso" b a b } @end lilypond Die Benutzung von Variablen ist auch eine gute Möglichkeit, Arbeit zu vermeiden, wenn sich einmal die Syntax von LilyPond -ändern sollte (siehe auch @rprogram{Updating old input files -with convert-ly}). +ändern sollte (siehe auch @rprogram{Dateien mit convert-ly aktualisieren}). Wenn man eine einzige Definition hat (wie etwa @code{\dolce}), die für alle Vorkommen in der Notation eingesetzt wird, muss man auch nur einmal diese Definition aktualisieren, anstatt dass man sie in jeder @file{.ly}-Datei einzeln ändern müsste. -@node Partitur und Stimmen -@subsection Partitur und Stimmen +@node Partituren und Stimmen +@subsection Partituren und Stimmen @translationof Scores and parts In Orchestermusik werden alle Noten zweimal gedruckt. Einmal @@ -3365,7 +3338,7 @@ Nehmen wir an, dass die Datei @file{horn-music.ly} folgende Noten eines Horn/@/Fagott-Duos enthält: @example -hornNotes = \relative c @{ +hornNotes = \relative @{ \time 2/4 r4 f8 a | cis4 f | e4 d | @} @@ -3403,7 +3376,7 @@ die Stimmung eines normalen F-Hornes verlangt. Die Transposition kann in folgender Notenausgabe gesehen werden: @lilypond[quote,ragged-right] -\transpose f c' \relative c { +\transpose f c' \relative { \time 2/4 r4 f8 a | cis4 f | e4 d | } @@ -3420,22 +3393,18 @@ in einem 2/4-Takt: R2*3 @end example -Wenn die Stimme gesetzt wird, werden Mehrtaktpausen komprimiert. Das geschieht, indem man folgendes in die Datei -schreibt: +Wenn die Stimme gesetzt wird, sollen Mehrtaktpausen zusammen gefasst werden. +Zu diesem Zweck gibt es eine Musik Funktion: @example -\set Score.skipBars = ##t +\compressMMRests @{ ... @} @end example -@noindent -Dieser Befehl setzt die Eigenschaft @code{skipBars} im -@code{Score}-Kontext auf wahr (@code{##t}). Die Pause und diese Option zu der Musik von oben hinzugefügt, ergibt folgendes -Beispiel: +Angewendet auf @code{hornNotes} erhält man: @lilypond[quote,ragged-right] -\transpose f c' \relative c { +\compressMMRests \transpose f c' \relative { \time 2/4 - \set Score.skipBars = ##t R2*3 | r4 f8 a | cis4 f | e4 d | } @@ -3460,7 +3429,7 @@ Partitur erstellt mit: woraus sich ergibt: @lilypond[quote,ragged-right] -\relative c << +\relative << \new Staff { \clef "treble" \time 2/4 @@ -3475,3 +3444,13 @@ woraus sich ergibt: } >> @end lilypond + +@seealso +Handbuch zum Lernen: +@ref{Stücke durch Variablen organisieren}. + +Notationsreferenz: +@ruser{Transponieren}, +@ruser{Orchesterstimmen erstellen}, +@ruser{Ganztaktpausen}, +@ruser{LilyPond-Dateien einfügen}. diff --git a/Documentation/de/learning/templates.itely b/Documentation/de/learning/templates.itely index d188635ef2..9d521b1736 100644 --- a/Documentation/de/learning/templates.itely +++ b/Documentation/de/learning/templates.itely @@ -1,16 +1,16 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 + Translation of GIT committish: 8819d7cb0ba2ab359e4aa2276695afb9c1957c42 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes. @end ignore -@c \version "2.16.0" +@c \version "2.19.25" -@c Translators: Till Paala +@c Translators: Till Paala, Michael Gerdau @node Vorlagen @appendix Vorlagen @@ -21,41 +21,365 @@ LilyPond-Partitur schon eingerichtet ist. Sie müssen nur noch Ihre Noten einfügen, die Datei mit LilyPond übersetzen und sich an dem schönen Notenbild erfreuen! -@c bad node name for ancient notation to avoid conflict @menu -* Ein einzelnes System:: +* Eingebaute Vorlagen:: +* Vorlagen für ein einzelnes System:: * Klaviervorlagen:: -* Streichquartett:: +* Vorlagen für Streichquartette:: * Vokalensemble:: -* Orchestervorlage:: +* Orchestervorlagen:: * Vorlagen für alte Notation:: * Andere Vorlagen:: @end menu -@node Ein einzelnes System -@appendixsec Ein einzelnes System -@translationof Single staff +@node Eingebaute Vorlagen +@appendixsec Eingebaute Vorlagen +@translationof Built-in templates + +LilyPond enthält ein paar eingebaute Vorlagen für Chormusik in einer ganzen +Reihe unterschiedlicher Ausprägungen. Die Palette umfasst Chormusik mit und +ohne Klavierbegleitung, in zwei, vier oder acht Systemen. Im Gegensatz zu +anderen Vorlagen sind diese Vorlagen in LilyPond @q{eingebaut}, d.h. sie +werden nicht kopiert und dann angepasst. Vielmehr werden sie einfach in der +Eingabedatei @code{@bs{}include}'d (eingefügt). + +@warning {Anders als die meisten anderen eingefügten Dateien werden diese +eingebauten Vorlagen am @emph{Ende} der Eingabedatei @code{@bs{}include}'d.} + +Die benötigten musikalischen Ausdrücke werden speziellen Variablen (oder Makros) +zugewiesen und müssen definiert sein, bevor die Vorlage @code{@bs{}include}'d wird. + +@menu +* SATB Vorlage:: +* SSAATTBB Vorlage:: +@end menu + +@node SATB Vorlage +@appendixsubsec SATB Vorlage +@translationof SATB template + +Die Musik kann wahlweise mit einer oder zwei Stimmen je System gesetzt werden. +Hierzu setzt man den Wert von @code{TwoVoicesPerStaff} auf @code{##f} oder @code{##t}. + +Hier folgt die vollständige Eingabedatei für ein komplettes vierstimmiges SATB +Arrangement mit verschiedenem Text je Stimme und einer Klavierbegleitung: + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a'4\f a8 a a4 a } + SopranoLyrics = \lyricmode { Sop -- ra -- no ly -- rics } + AltoMusic = \relative { d'4\f d d d } + AltoLyrics = \lyricmode { Al -- to ly -- rics } + TenorMusic = \relative { a4\p a a a } + TenorLyrics = \lyricmode { Te -- nor ly -- rics } + BassMusic = \relative { c2\p c4 c } + BassLyrics = \lyricmode { Bass ly -- rics } + PianoRHMusic = \relative { c' e g c } + PianoDynamics = { s2\mp s4 s4 } + PianoLHMusic = \relative { c e g c } + \include "satb.ly" +@end lilypond + +Mit der gleichen Eingabe kann man auch eine Partitur erzeugen, die zwei +Stimmen je System enthält. Hierzu wird lediglich @code{TwoVoicesPerStaff} +auf @code{##t} gesetzt. Beachten sie dass nach wie vor jede Stimme einen +eigenen Text hat. + + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a'4\f a8 a a4 a } + SopranoLyrics = \lyricmode { Sop -- ra -- no ly -- rics } + AltoMusic = \relative { d'4\f d d d } + AltoLyrics = \lyricmode { Al -- to ly -- rics } + TenorMusic = \relative { a4\p a a a } + TenorLyrics = \lyricmode { Te -- nor ly -- rics } + BassMusic = \relative { c2\p c4 c } + BassLyrics = \lyricmode { Bass ly -- rics } + PianoRHMusic = \relative { c' e g c } + PianoDynamics = { s2\mp s4 s4 } + PianoLHMusic = \relative { c e g c } + TwoVoicesPerStaff = ##t + \include "satb.ly" +@end lilypond + +Ist die Variable @code{TwoVoicesPerStaff} auf false oder auch gar nicht gesetzt, +dann kann jede der Variablen weg gelassen werden, um so ein Arrangement mit +weniger Stimmen zu erzeugen. So sähe z.B. ein Duett für Sopran und Bass +folgendermaßen aus: + +@lilypond[verbatim,quote] + SopranoMusic = \relative { c'' c c c } + SopranoLyrics = \lyricmode { High voice ly -- rics } + BassMusic = \relative { a a a a } + BassLyrics = \lyricmode { Low voice ly -- rics } + \include "satb.ly" +@end lilypond + +Eine zweite Strophe oder einen anderer Text könnte man so hinzufügen: + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a'4 a a a } + SopranoLyricsOne = \lyricmode { + \set stanza = "1." + Words to verse one + } + SopranoLyricsTwo = \lyricmode { + \set stanza = "2." + Words to verse two + } + \include "satb.ly" +@end lilypond + +Sind Text und Rhythmus für für alle Stimmen gleich, dann kann man die +Musik gut in zwei Systemen mit zwei Stimmen je System anordnen. Die +Vorlage sieht bis zu neun Strophen vor. Es folgt ein unbegleitetes +Beispiel mit drei Strophen. + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a' a a a } + AltoMusic = \relative { f' f f f } + VerseOne = \lyricmode { + \set stanza = "1." + Words to verse one + } + VerseTwo = \lyricmode { + \set stanza = "2." + Words to verse two + } + VerseThree = \lyricmode { + \set stanza = "3." + Words to verse three + } + TenorMusic = \relative { a a a a } + BassMusic = \relative { f f f f } + TwoVoicesPerStaff = ##t + \include "satb.ly" +@end lilypond + +Es gibt noch weitere Variablen, die man setzen kann. Die Tonart und +die Taktart können angepasst werden: + +@lilypond[verbatim, quote] + Key = \key a \major + Time = { + \time 5/4 + \tempo "Allegro" 4 = 144 + } + SopranoMusic = \relative { gis' gis gis gis gis } + AltoMusic = \relative { cis' cis cis cis cis } + VerseOne = \lyricmode { Words to this du -- et } + TwoVoicesPerStaff = ##t + \include "satb.ly" +@end lilypond + +Die Bezeichnung der Stimmen und/oder deren Kurzform können verändert werden: + +@lilypond[verbatim,quote] + SopranoMusic = \relative { c'' c c c } + SopranoLyrics = \lyricmode { High voice ly -- rics } + SopranoInstrumentName = "Soprano 1" + SopranoShortInstrumentName = "S1" + AltoMusic = \relative { a' a a a } + AltoLyrics = \lyricmode { Low voice ly -- rics } + AltoInstrumentName = "Soprano 2" + AltoShortInstrumentName = "S2" + \include "satb.ly" +@end lilypond + +Andererseits könnte es in diesem konkreten Fall besser sein die +@code{ssaattbb.ly} Vorlage zu verwenden, siehe @ref{SSAATTBB Vorlage}. + +Sie könnten auch einen Descant hinzufügen. Einfach die Variablen +@code{DescantMusic} und @code{DescantLyrics} mit Inhalt befüllen. +In gleicher Weise fügen sie eine Solostimme oberhalb der gruppierten +Chorstimmen hinzu, indem sie die Variablen @code{SoloMusic} und +@code{SoloLyrics} befüllen. + +@code{\header} und @code{\paper} Blöcke können ganz normal hinzu gefügt +werden. Auch einen @code{\layout} Block können sie wie gewöhnlich auf +oberster Ebene angeben. Dessen Inhalt wird zu den Voreinstellungen der +Vorlage hinzugefügt. Allerdings wird es sie nicht überschreiben. +Wollen sie alle Voreinstellungen der Vorlage löschen, so können sie +das tun, indem sie eine Variable @code{Layout} definieren, die @emph{alle} +benötigten Einstellungen enthält: + +@example +Layout = \layout @{ ... @} +@end example + +Für eine vollständige Liste aller Variablen, die gesetzt werden können, +schauen sie sich bitte direkt die Vorlagendatei @file{ly/satb.ly} an, +siehe auch @ref{Mehr Information}. + +@seealso +Handbuch zum Lernen: +@ref{Stücke durch Variablen organisieren}, +@ref{Vokalensemble}, +@ref{Erweiterung der Vorlagen}, +@ref{Mehr Information}. + +@knownissues +Das Setzen der Variablen @code{TwoVoicesPerStaff} gilt für die gesamte +Partitur. Es ist nicht möglich ihren Wert im Verlauf eines Stückes +zu verändern. + +Komplexere Arrangements von SATB Chorwerken sind mit dieser doch eher +einfachen eingebauten Vorlage nicht möglich. + + +@node SSAATTBB Vorlage +@appendixsubsec SSAATTBB Vorlage +@translationof SSAATTBB template + +Alle Variablen, die wir im Zusammenhang mit der SATB Vorlage kennen +gelernt haben, gibt es auch in der SSAATTBB Vorlage. Die einzige +Ausnahme sind die @code{VerseXxx} Variablen, siehe auch @ref{SATB Vorlage}. +Zusätzlich können Noten und Text für die erste und zweite Stimme jeder +Stimmgruppe unter Verwendung der Variablen @code{SopranoOneMusic}, @code{SopranoTwoMusic}, +etc, bzw. @code{SopranoOneLyrics} und @code{SopranoTwoLyrics}, +etc. Es können bis zu vier Strophen für jede Stimme definiert werden. +Für Sopran 1, Strophe 1 definiert man @code{SopranoOneLyricsOne}. Die +Variablen der anderen Stimmen und Strophen ergeben sich analog. + +Das Setzen von @code{TwoVoicesPerStaff} auf @code{##t} bewirkt, dass @emph{all} +Stimmgruppen auf einzelne Systeme als divisi Stimmen gesetzt werden. Ist +@code{TwoVoicesPerStaff} nicht oder auf @code{##f} gesetzt, dann werden +die einzelnen Stimmgruppen in Abhängigkeit der Variablen @code{SopranoTwoVoicesPerStaff}, +@code{MenTwoVoicesPerStaff}, etc. entweder als einzelne Stimmen in zwei +Systemen oder zweistimmig in einen System gesetzt. + +Das folgende Beispiel ist ein Stück für Sopran und Alt. Es beginnt mit +allen Stimmen unisono, gefolgt von einer zweistimmigen Sequenz für +Sopran und Alt, um dann schließlich vierstimmig zu enden. Das sieht +dann wie folgt aus: + +@lilypond[verbatim,quote] +Time = { s1 \break s1 \break } +WomenMusic = \relative { a'4 a a a } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoMusic = \relative { s1 | c''4 c c c8 c } +SopranoLyrics = \lyricmode{ So -- pra -- no ly -- rics } +AltoMusic = \relative { s1 | g'4 g g g } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +SopranoOneMusic = \relative { s1 | s1 |e''4 e e e } +SopranoOneLyrics = \lyricmode { Sop One ly -- rics } +SopranoTwoMusic = \relative { s1 | s1 | c''4 c c c } +SopranoTwoLyrics = \lyricmode { Sop Two ly -- rics } +AltoOneMusic = \relative { s1 | s1 | g'4 g g g8 g } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { s1 | s1 | e'4 e e e8 e } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +\layout { ragged-right = ##t } +\include "ssaattbb.ly" +@end lilypond + +Männerstimmen könnten in gleicher Weise hinzu gefügt werden. + +Wir können das Layout auch einfach dahingehende verändern, dass die +divisi Soprani in einem einzigen System notiert würden, indem wir +@code{SopranoTwoVoicesPerStaff} auf ##t setzen. Alle anderen +Variablen unverändert gelassen sähe es dann so aus: + +@lilypond[verbatim,quote] +SopranoTwoVoicesPerStaff = ##t +Time = { s1 \break s1 \break } +WomenMusic = \relative { a'4 a a a } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoMusic = \relative { s1 | c''4 c c c8 c } +SopranoLyrics = \lyricmode{ So -- pra -- no ly -- rics } +AltoMusic = \relative { s1 | g'4 g g g } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +SopranoOneMusic = \relative { s1 | s1 |e''4 e e e } +SopranoOneLyrics = \lyricmode { Sop One ly -- rics } +SopranoTwoMusic = \relative { s1 | s1 | c''4 c c c } +SopranoTwoLyrics = \lyricmode { Sop Two ly -- rics } +AltoOneMusic = \relative { s1 | s1 | g'4 g g g8 g } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { s1 | s1 | e'4 e e e8 e } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +\layout { ragged-right = ##t } +\include "ssaattbb.ly" +@end lilypond + +oder wir können alle Stimmgruppen jeweils in ein zweistimmiges +System setzen, indem wir @code{TwoVoicesPerStaff} auf ##t setzen: + +@lilypond[verbatim,quote] +TwoVoicesPerStaff = ##t +Time = { s1 \break s1 \break } +WomenMusic = \relative { a'4 a a a } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoMusic = \relative { s1 | c''4 c c c8 c } +SopranoLyrics = \lyricmode{ So -- pra -- no ly -- rics } +AltoMusic = \relative { s1 | g'4 g g g } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +SopranoOneMusic = \relative { s1 | s1 |e''4 e e e } +SopranoOneLyrics = \lyricmode { Sop One ly -- rics } +SopranoTwoMusic = \relative { s1 | s1 | c''4 c c c } +SopranoTwoLyrics = \lyricmode { Sop Two ly -- rics } +AltoOneMusic = \relative { s1 | s1 | g'4 g g g8 g } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { s1 | s1 | e'4 e e e8 e } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +\layout { ragged-right = ##t } +\include "ssaattbb.ly" +@end lilypond + +Für eine vollständige Liste aller Variablen, die gesetzt werden können, +schauen sie sich bitte direkt die Vorlagendatei @file{ly/ssaattbb.ly} an, +siehe auch @ref{Mehr Information}. + +@seealso +Handbuch zum Lernen: +@ref{Stücke durch Variablen organisieren}, +@ref{Vokalensemble}, +@ref{Erweiterung der Vorlagen}, +@ref{Mehr Information}. + +@knownissues +Das Setzen der diversen Variablen @code{...TwoVoicesPerStaff} gilt für die +gesamte Partitur. Es ist nicht möglich ihren Wert im Verlauf eines Stückes +zu verändern. + +Komplexere Arrangements von 8-stimmigen Chorwerken sind mit dieser doch eher +einfachen eingebauten Vorlage nicht möglich. + + +@node Vorlagen für ein einzelnes System +@appendixsec Vorlagen für ein einzelnes System +@translationof Single staff templates + +@menu +* Nur Noten:: +* Noten und Text:: +* Noten und Akkordbezeichnungen:: +* Noten Text und Akkordbezeichnungen:: +@end menu +@node Nur Noten @appendixsubsec Nur Noten +@translationof Notes only @lilypondfile[verbatim,quote,ragged-right,texidoc,addversion] {single-staff-template-with-only-notes.ly} - +@node Noten und Text @appendixsubsec Noten und Text +@translationof Notes and lyrics @lilypondfile[verbatim,quote,ragged-right,texidoc,addversion] {single-staff-template-with-notes-and-lyrics.ly} - +@node Noten und Akkordbezeichnungen @appendixsubsec Noten und Akkordbezeichnungen +@translationof Notes and chords @lilypondfile[verbatim,quote,ragged-right,texidoc] {single-staff-template-with-notes-and-chords.ly} - +@node Noten Text und Akkordbezeichnungen @appendixsubsec Noten, Text und Akkordbezeichnungen +@translationof Notes lyrics and chords @lilypondfile[verbatim,quote,ragged-right,texidoc] {single-staff-template-with-notes,-lyrics,-and-chords.ly} @@ -65,29 +389,53 @@ schönen Notenbild erfreuen! @appendixsec Klaviervorlagen @translationof Piano templates +@menu +* Piano Solo:: +* Klavier und Gesangsstimme:: +* Klavier mit eingeschobenem Gesangstext:: +@end menu + +@node Piano Solo @appendixsubsec Piano Solo +@translationof Solo piano @lilypondfile[verbatim,quote,ragged-right,texidoc] {piano-template-simple.ly} - -@appendixsubsec Klavier und Gesangstimme +@node Klavier und Gesangsstimme +@appendixsubsec Klavier und Gesangsstimme +@translationof Piano and melody with lyrics @lilypondfile[verbatim,quote,ragged-right,texidoc] {piano-template-with-melody-and-lyrics.ly} +@node Klavier mit eingeschobenem Gesangstext +@appendixsubsec Klavier mit eingeschobenem Gesangstext +@translationof Piano centered lyrics + +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{piano-template-with-centered-lyrics.ly} + + +@node Vorlagen für Streichquartette +@appendixsec Vorlagen für Streichquartette +@translationof String quartet templates + +@menu +* Streichquartett:: +* Streichquartettstimmen:: +@end menu @node Streichquartett -@appendixsec Streichquartett +@appendixsubsec Streichquartett @translationof String quartet -@appendixsubsec Einfaches Streichquartett - @lilypondfile[verbatim,quote,ragged-right,texidoc] {string-quartet-template-simple.ly} - +@node Streichquartettstimmen @appendixsubsec Streichquartettstimmen +@translationof String quartet parts @lilypondfile[verbatim,quote,ragged-right,texidoc] {string-quartet-template-with-separate-parts.ly} @@ -95,90 +443,133 @@ schönen Notenbild erfreuen! @node Vokalensemble @appendixsec Vokalensemble -@translationof Vocal ensembles +@translationof Vocal ensembles templates +Die im Folgenden gezeigten Vorlagen sind dafür gedacht in ihre Partitur +kopiert und dann nach ihren Bedürfnissen angepasst zu werden. Falls +sie ein eher einfaches SATB Layout benötigen, sollten sie erwägen eine +der eingebauten Vorlagen zu verwenden, die sie lediglich mit @code{\include} +einzufügen bräuchten, siehe auch @ref{Eingebaute Vorlagen}. + +@menu +* SATB-Partitur:: +* SATB-Partitur und automatischer Klavierauszug:: +* SATB mit daran ausgerichteten Kontexten:: +* SATB auf vier Systemen:: +* Sologesang und zweistimmiger Refrain:: +* Kirchenlieder:: +* Psalmengesang:: +@end menu + +@node SATB-Partitur @appendixsubsec SATB-Partitur +@translationof SATB vocal score @lilypondfile[verbatim,quote,ragged-right,texidoc] {vocal-ensemble-template.ly} - +@node SATB-Partitur und automatischer Klavierauszug @appendixsubsec SATB-Partitur und automatischer Klavierauszug +@translationof SATB vocal score and automatic piano reduction @lilypondfile[verbatim,quote,ragged-right,texidoc] {vocal-ensemble-template-with-automatic-piano-reduction.ly} - +@node SATB mit daran ausgerichteten Kontexten @appendixsubsec SATB mit daran ausgerichteten Kontexten +@translationof SATB with aligned contexts @lilypondfile[verbatim,quote,ragged-right,texidoc] {vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly} - +@node SATB auf vier Systemen @appendixsubsec SATB auf vier Systemen +@translationof SATB on four staves @lilypondfile[verbatim,quote,ragged-right,texidoc] {satb-choir-template---four-staves.ly} - +@node Sologesang und zweistimmiger Refrain @appendixsubsec Sologesang und zweistimmiger Refrain +@translationof Solo verse and two-part refrain @lilypondfile[verbatim,quote,ragged-right,texidoc] {vocal-ensemble-template-with-verse-and-refrain.ly} - -@appendixsubsec Hymnen +@node Kirchenlieder +@appendixsubsec Kirchenlieder +@translationof Hymn tunes @lilypondfile[verbatim,quote,ragged-right,texidoc] {hymn-template.ly} - +@node Psalmengesang @appendixsubsec Psalmengesang +@translationof Psalms @lilypondfile[verbatim,quote,ragged-right,texidoc] {anglican-psalm-template.ly} -@node Orchestervorlage -@appendixsec Orchestervorlage +@node Orchestervorlagen +@appendixsec Orchestervorlagen @translationof Orchestral templates +@menu +* Orchester Chor und Klavier:: +@end menu + +@node Orchester Chor und Klavier @appendixsubsec Orchester, Chor und Klavier +@translationof Orchestra choir and piano + @lilypondfile[verbatim,quote,ragged-right,texidoc] {orchestra,-choir-and-piano-template.ly} -@c bad node name to avoid node name conflict @node Vorlagen für alte Notation @appendixsec Vorlagen für alte Notation @translationof Ancient notation templates +@menu +* Transkription mensuraler Musik:: +* Vorlage zur Transkription von Gregorianik:: +@end menu + +@node Transkription mensuraler Musik @appendixsubsec Transkription mensuraler Musik -@c Line-width below is because of Issue 766. If that's fixed, it can be removed. -@lilypondfile[verbatim,quote,ragged-right,texidoc,line-width=140] -{ancient-notation-template----modern-transcription-of-mensural-music.ly} +@translationof Transcription of mensural music +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{incipit.ly} +@node Vorlage zur Transkription von Gregorianik @appendixsubsec Vorlage zur Transkription von Gregorianik +@translationof Gregorian transcription template @lilypondfile[verbatim,quote,ragged-right,texidoc] {ancient-notation-template----modern-transcription-of-gregorian-music.ly} + @node Andere Vorlagen @appendixsec Andere Vorlagen @translationof Other templates +@menu +* Jazz-Combo:: +@end menu +@node Jazz-Combo @appendixsubsec Jazz-Combo @translationof Jazz combo -@c Line-width below is because of Issue 766. If that's fixed, it can be removed. -@lilypondfile[verbatim,quote,ragged-right,texidoc,line-width=140] +@lilypondfile[verbatim,quote,ragged-right,texidoc] {jazz-combo-template.ly} -@ignore + +@ignore This isn't very useful, and only duplicates material in "global issues". And if this info changes, this section often gets forgotten. @@ -197,7 +588,7 @@ violin concerto as TchaikovskyPI, whereas perhaps you wish to print @ The `line-width' is for \header. @li lypond[quote,verbatim,ragged-right,line-width] -\version "2.16.0" +\version "2.19.25" \header { dedication = "dedication" title = "Title" @@ -243,5 +634,4 @@ violin concerto as TchaikovskyPI, whereas perhaps you wish to print } } @end lilypond - @end ignore diff --git a/Documentation/de/learning/tutorial.itely b/Documentation/de/learning/tutorial.itely index 2887e2affd..5a968f0dfb 100644 --- a/Documentation/de/learning/tutorial.itely +++ b/Documentation/de/learning/tutorial.itely @@ -1,7 +1,7 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 + Translation of GIT committish: 8819d7cb0ba2ab359e4aa2276695afb9c1957c42 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -10,12 +10,12 @@ @include included/generating-output.itexi -@c \version "2.16.0" -@c Translators: Till Paala, Reinhold Kainhofer +@c \version "2.19.21" +@c Translators: Till Paala, Reinhold Kainhofer, Michael Gerdau @c Translation checkers: Hajo Bäß -@node Übung -@chapter Übung +@node Tutorium +@chapter Tutorium @translationof Tutorial Dieses Kapitel stellt dem Leser das grundlegende Arbeiten mit LilyPond @@ -23,14 +23,13 @@ vor. @menu * Eine Quelldatei übersetzen:: -* Arbeiten an Eingabe-Dateien:: -* Mit Fehlern umgehen:: -* Wie die Handbücher gelesen werden sollen:: +* Wie werden Eingabe-Dateien geschrieben:: +* Fehlerbehandlung:: +* Wie die Handbücher gelesen werden sollten:: @end menu - @node Eine Quelldatei übersetzen -@subsection Eine Quelldatei übersetzen +@section Eine Quelldatei übersetzen @translationof Compiling a file Dieser Abschnitt führt in die @qq{Kompilation} ein -- den @@ -57,8 +56,12 @@ haben) um eine Ausgabedatei zu erstellen. @cindex Großbuchstaben @cindex Kleinbuchstaben +@menu +* Ausgabe erzeugen:: +@end menu + @qq{Kompilation} ist der Begriff, der benutzt wird, um eine -Lilypond-Eingabedatei mit dem Programm LilyPond in eine +LilyPond-Eingabedatei mit dem Programm LilyPond in eine Notenausgabe umzuwandeln. Ausgabedateien sind in erster Linie PDF-Dateien (zum Anschauen und Drucken), MIDI (zum Abspielen) und PNG (für die Benutzung auf Internetseiten). Die Eingabedateien @@ -93,7 +96,7 @@ weggelassen werden. Es kann sein, dass in diesem Handbuch die Klammern in manchen Beispielen fehlen, aber man sollte immer daran denken, sie in den eigenen Dateien zu benutzen! Mehr Informationen zu der Darstellung der Beispiele in diesem -Handbuch gibt der Abschnitt @ref{Wie die Handbücher gelesen werden sollen}.} +Handbuch gibt der Abschnitt @ref{Wie die Handbücher gelesen werden sollten}.} Zusätzlich unterscheidet LilyPond @strong{Groß- und Kleinschreibung}. @w{@samp{ @{ c d e @}}} ist zulässiger Code, @@ -101,7 +104,9 @@ Zusätzlich unterscheidet LilyPond @strong{Groß- und Kleinschreibung}. @smallspace -@subheading Ansicht des Ergebnisses +@node Ausgabe erzeugen +@unnumberedsubsubsec Ausgabe erzeugen +@translationof Producing output @cindex PDF-Datei @cindex Noten anzeigen @@ -146,9 +151,6 @@ die auf dem System zur Verfügung stehen, untersucht. Aber nach diesem ersten Mal läuft LilyPond sehr viel schneller.} - - - @node MacOS X @subsection MacOS X @translationof MacOS X @@ -177,7 +179,6 @@ diesem ersten Mal läuft LilyPond sehr viel schneller.} @lilypadCommandLine - @node Wie werden Eingabe-Dateien geschrieben @section Wie werden Eingabe-Dateien geschrieben @translationof How to write input files @@ -191,7 +192,6 @@ bei den ersten Anfängen, eine LilyPond-Eingabedatei zu schreiben. @end menu - @node Einfache Notation @subsection Einfache Notation @translationof Simple notation @@ -199,6 +199,16 @@ bei den ersten Anfängen, eine LilyPond-Eingabedatei zu schreiben. @cindex einfache Notation @cindex Notation, einfach +@menu +* Tonhöhen:: +* Tondauern (Rhythmen):: +* Pausen:: +* Taktartangabe:: +* Tempobezeichnung:: +* Notenschlüssel:: +* Alles zusammen:: +@end menu + LilyPond fügt einige Bestandteile des Notenbildes automatisch hinzu. Im nächsten Beispiel sind nur vier Tonhöhen angegeben, aber LilyPond setzt trotzdem einen Schlüssel, eine Taktangabe und Notendauern. @@ -213,7 +223,10 @@ trotzdem einen Schlüssel, eine Taktangabe und Notendauern. Diese Einstellungen können verändert werden, aber in den meisten Fällen sind die automatischen Werte durchaus brauchbar. -@subheading Tonhöhen + +@node Tonhöhen +@unnumberedsubsubsec Tonhöhen +@translationof Pitches @cindex Tonhöhen @cindex relativer Modus @@ -223,7 +236,6 @@ sind die automatischen Werte durchaus brauchbar. @cindex relativer Modus und Versetzungszeichen @funindex \relative -@funindex relative @funindex ' @funindex , @@ -232,16 +244,28 @@ Glossar: @rglos{pitch}, @rglos{interval}, @rglos{scale}, @rglos{middle C}, @rglos{octave}, @rglos{accidental}. +In LilyPond werden Tonhöhen generell mit Kleinbuchstaben eingegeben. +Die Buchstaben @code{c} bis@tie{}@code{b} bezeichnen Tonhöhen in der +@q{Oktave} unterhalb des @notation{mittleren C}. Das Anhängen von +@code{'} oder@tie{}@code{,} an die Noten markieren eine höhere oder +niedrigere Oktave. +Hier ist eine Tonleiter, beginnend auf dem @notation{mittleren C}, +gefolgt von einem Arpeggio: + +@lilypond[verbatim,quote] +{ c' d' e' f' g' a' b' c'' g c' e' g' c'' e'' g'' c''' } +@end lilypond + @c Addition for German users about pitch naming conventions -Die Tonhöhen werden mit Kleinbuchstaben eingegeben, die den Notennamen -entsprechen. Es ist jedoch wichtig zu wissen, dass LilyPond in seiner -Standardeinstellung die englischen Notennamen verwendet. Bis auf eine -Ausnahme entsprechen sie den deutschen, deshalb wird die Voreinstellung -von LilyPond für diese Übung beibehalten. Die @emph{Ausnahme} ist das h -- in -LilyPond muss man anstelle dessen b schreiben! Das deutsche b dagegen -wird als bes notiert, ein his dagegen würde bis geschrieben. Siehe auch -@ruser{Versetzungszeichen} und @ruser{Notenbezeichnungen in anderen Sprachen}, hier -wird beschrieben, +Wie oben beschrieben werden Tonhöhen werden mit Kleinbuchstaben eingegeben, +die den Notennamen entsprechen. Es ist jedoch wichtig zu wissen, dass +LilyPond in seiner Standardeinstellung die englischen Notennamen verwendet. +Bis auf eine Ausnahme entsprechen sie den deutschen, deshalb wird die +Voreinstellung von LilyPond für dieses Tutorium beibehalten. Die @emph{Ausnahme} +ist das h -- in LilyPond muss man anstelle dessen b schreiben! Das +deutsche b dagegen wird als bes notiert, ein his dagegen würde bis +geschrieben. Siehe auch @ruser{Versetzungszeichen} und +@ruser{Notenbezeichnungen in anderen Sprachen}, hier wird beschrieben, wie sich die deutschen Notennamen benutzen lassen. @c end addition @@ -254,11 +278,9 @@ Note gesetzt. Fangen wir unser erstes Notationsbeispiel mit einer @notation{Tonleiter} an, wo also die nächste Note immer nur eine Notenlinie über der vorherigen steht. -@c KEEP LY @lilypond[verbatim,quote] -% Beginnpunkt auf das mittlere C setzen -\relative c' { - c d e f +\relative { + c' d e f g a b c } @end lilypond @@ -272,27 +294,24 @@ auch Melodien mit größeren Intervallen im @code{\relative}-Modus gebildet werden: @lilypond[verbatim,quote] -\relative c' { - d f a g +\relative { + d' f a g c b f d } @end lilypond @noindent -Es ist nicht notwendig, dass die erste Note der Melodie mit der -Note beginnt, die die erste Tonhöhe angibt. -Die erste Note (das @q{D}) des vorigen Beispiels ist das nächste D -vom eingestrichenen C aus gerechnet. +Die erste Note des vorherigen Beispiels -- das @code{d'} mit einem +angehängten @code{'} -- ist das D in der Oktave beginnend beim mittleren +C bis hin zum darüber liegenden H. Indem man Apostrophe @code{'} (Taste Shift+#) oder Kommata @code{,} -zu dem @w{@code{\relative c' @{}} hinzufügt oder entfernt, kann die -Oktave der ersten Tonhöhe verändert werden: +zur ersten Note hinzufügt (oder entfernt), kann die Oktave der ersten +Note verändert werden: -@c KEEP LY @lilypond[verbatim,quote] -% zweigestrichenes C -\relative c'' { - e c a c +\relative { + e'' c a c } @end lilypond @@ -307,8 +326,8 @@ Hs, wenn es ein A, G oder F ist, wird es darunter gesetzt. @c KEEP LY @lilypond[verbatim,quote] -\relative c'' { - b c % c ist 1 Zeile aufwärts, also c über dem b +\relative { + b' c % c ist 1 Zeile aufwärts, also c über dem b b d % d ist 2 Zeilen aufwärts, oder 5 runter, also d über dem b b e % e ist 3 aufwärts oder 4 runter, also e über dem b b a % a ist 6 aufwärts oder 1 runter, also a unter dem b @@ -327,22 +346,24 @@ Um Intervalle zu notieren, die größer als drei Notenzeilen sind, kann man die direkt hinter dem Notennamen wird die Oktave um eins erhöht, mit einem Komma @code{,} um eins erniedrigt. @lilypond[verbatim,quote] -\relative c'' { - a a, c' f, +\relative { + a' a, c' f, g g'' a,, f' } @end lilypond @noindent -Um eine Notenhöhe um zwei (oder mehr!) Oktaven zu verändern, -werden sukzessive @code{''} oder @code{,,} benutzt -- es muss +Um eine Tonhöhe um zwei (oder mehr!) Oktaven zu verändern, +werden mehrfache @code{''} oder @code{,,} benutzt -- es muss sich dabei wirklich um zwei einzelne Apostrophen und nicht um das Anführungszeichen @code{"}@tie{} (Taste Shift+2) handeln! +@node Tondauern (Rhythmen) +@unnumberedsubsubsec Tondauern (Rhythmen) +@translationof Durations (rhythms) -@subheading Tondauern (Rhythmen) - -@cindex Notendauern +@cindex Tondauer +@cindex Notendauer @cindex Dauern @cindex Rhythmus @cindex Ganze Noten @@ -365,8 +386,8 @@ Wenn keine Dauer bezeichnet wird, wird die der vorhergehenden Note verwendet. Für die erste Note ist eine Viertel als Standard definiert. @lilypond[verbatim,quote] -\relative c'' { - a1 +\relative { + a'1 a2 a4 a8 a a16 a a a a32 a a a a64 a a a a a a a a2 } @@ -378,14 +399,15 @@ punktierten Note muss explizit, also inklusive der Nummer, angegeben werden. @lilypond[verbatim,quote] -\relative c'' { - a4 a a4. a8 +\relative { + a'4 a a4. a8 a8. a16 a a8. a8 a4. } @end lilypond - -@subheading Pausen +@node Pausen +@unnumberedsubsubsec Pausen +@translationof Rests @cindex Pausen @cindex schreiben von Pausen @@ -395,29 +417,30 @@ Eine @notation{Pause} wird genauso wie eine Noten eingegeben; ihre Bezeichnung ist @code{r}@tie{}: @lilypond[verbatim,quote] -\relative c'' { - a4 r r2 +\relative { + a'4 r r2 r8 a r4 r4. r8 } @end lilypond -@subheading Taktangabe +@node Taktartangabe +@unnumberedsubsubsec Taktartangabe +@translationof Time signature @cindex Taktart @funindex \time -@funindex time Glossar: @rglos{time signature}. -Die @notation{Taktart} kann mit dem -@code{\time}-Befehl definiert werden: +Die @notation{Taktart} wird mit dem +@code{\time}-Befehl gesetzt: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 - a4 a a + a'4 a a \time 6/8 a4. a \time 4/4 @@ -425,25 +448,25 @@ Die @notation{Taktart} kann mit dem } @end lilypond - -@subheading Tempobezeichnung +@node Tempobezeichnung +@unnumberedsubsubsec Tempobezeichnung +@translationof Tempo marks @cindex Tempobezeichnung @cindex Metronom-Angabe @funindex \tempo -@funindex tempo Glossar: @rglos{tempo indication}, @rglos{metronome}. -Die @notation{Tempobezeichnung} und die @notation{Metronom-Angabe} können -mit dem @code{\tempo}-Befehl gesetzt werden: +Die @notation{Tempobezeichnung} und die @notation{Metronom-Angabe} werden +mit dem @code{\tempo}-Befehl gesetzt: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 \tempo "Andante" - a4 a a + a'4 a a \time 6/8 \tempo 4. = 96 a4. a @@ -454,7 +477,9 @@ mit dem @code{\tempo}-Befehl gesetzt werden: @end lilypond -@subheading Notenschlüssel +@node Notenschlüssel +@unnumberedsubsubsec Notenschlüssel +@translationof Clef @cindex Schlüssel @cindex Alt @@ -463,17 +488,16 @@ mit dem @code{\tempo}-Befehl gesetzt werden: @cindex Bass @funindex \clef -@funindex clef Glossar: @rglos{clef}. -Der @notation{Notenschlüssel} kann mit dem @code{\clef}-Befehl -gesetzt werden: +Der @notation{Notenschlüssel} wird mit dem @code{\clef}-Befehl +gesetzt: @lilypond[verbatim,quote] -\relative c' { +\relative { \clef "treble" - c1 + c'1 \clef "alto" c1 \clef "tenor" @@ -484,16 +508,18 @@ gesetzt werden: @end lilypond -@subheading Alles zusammen +@node Alles zusammen +@unnumberedsubsubsec Alles zusammen +@translationof All together Hier ist ein kleines Beispiel, dass all diese Definitionen beinhaltet: @lilypond[verbatim,quote] -\relative c, { +\relative { \clef "bass" \time 3/4 \tempo "Andante" 4 = 120 - c2 e8 c' + c,2 e8 c' g'2. f4 e d c4 c, r4 @@ -520,21 +546,25 @@ Notationsreferenz: @ruser{Tonhöhen setzen}, @cindex Ausdrücke @cindex Großbuchstaben @cindex Kleinbuchstaben +@cindex Versionierung +@cindex Version +@cindex Versionsnummer +@funindex \version @funindex { ... } @funindex % @funindex %@{ ... %@} LilyPonds Quelldateien ähneln Dateien in den meisten -Programmiersprachen: Sie enthalten eine Versionsbezeichnung, +Programmiersprachen: Sie enthalten eine Versionsbezeichnung, es ist auf Groß- und Kleinschreibung -zu achten und Leerzeichen werden ignoriert. Ausdrücke werden -mit geschweiften Klammern @w{@code{@{ @}}} eingeklammert und Kommentare +zu achten und Leerzeichen werden ignoriert. Ausdrücke werden +mit geschweiften Klammern @w{@code{@{ @}}} eingeklammert und mit dem Prozentzeichen @code{%} auskommentiert oder mit @w{@code{%@{ @dots{} %@}}} umgeben. -Wenn das jetzt unverständlich erscheint, sind hier die Erklärungen: +Wenn das jetzt unverständlich erscheint, sind hier die Erklärungen: @itemize @item @@ -548,12 +578,12 @@ Beispiel: \version "@w{@version{}}" @end example -Üblicherweise wird die Versionsbezeichnung oben in die Datei +Üblicherweise wird die Versionsbezeichnung ganz oben in die Datei geschrieben. -Die Versionsbezeichnung ist aus zwei Gründen sehr wichtig: 1. kann +Die Versionsbezeichnung ist aus zwei Gründen wichtig: 1. kann man mit ihrer Hilfe automatische Aktualisierungen der Eingabedateien -vornehmen, wenn sich die LilyPond-Syntax ändern sollte. 2. wird +vornehmen, wenn sich die LilyPond-Syntax ändern sollte. 2. wird hier die Version von LilyPond beschrieben, die nötig ist, um die Datei zu kompilieren. @@ -591,7 +621,7 @@ Leerzeichen @emph{sind} jedoch nötig, um viele syntaktische Elemente voneinander zu trennen. Leerzeichen können also immer @emph{hinzugefügt} werden, aber sie dürfen nicht @emph{entfernt} werden. Da fehlende Leerzeichen sehr seltsame Fehlermeldungen hervorrufen können, wird -es nahe gelegt, immer ein Leerzeichen vor und nach jedem syntaktischen +es nahe gelegt, immer ein Leerzeichen vor und nach jedem syntaktischen Element, etwa vor und nach geschweiften Klammern, einzufügen. @item @strong{Ausdrücke:} @@ -654,31 +684,31 @@ mögliche Anwendung von Kommentaren: @end itemize -@node Mit Fehlern umgehen -@section Mit Fehlern umgehen +@node Fehlerbehandlung +@section Fehlerbehandlung @translationof Dealing with errors -@cindex Fehlerlösung +@cindex Fehlerbehandlung -Manchmal erstellt LlilyPond nicht das Notenbild, das Sie erwarten. Dieser +Manchmal erstellt LilyPond nicht das Notenbild, das Sie erwarten. Dieser Abschnitt stellt einige Links zur Verfügung, um Ihnen bei der Problemlösung möglicher Schwierigkeiten zu helfen. @menu -* Allgemeine Fehlerlösungstipps:: +* Allgemeine Fehlerbehandlungstipps:: * Einige häufige Fehler:: @end menu -@node Allgemeine Fehlerlösungstipps -@subsection Allgemeine Fehlerlösungstipps +@node Allgemeine Fehlerbehandlungstipps +@subsection Allgemeine Fehlerbehandlungstipps @translationof General troubleshooting tips -Fehlerlösung für LilyPond-Probleme kann eine große Herausforderung für Menschen +Fehlerbehandlung für LilyPond-Probleme kann eine große Herausforderung für Menschen darstellen, die an eine graphische Benutzeroberfläche gewohnt sind, weil ungültige Eingabedateien erstellt werden können. Wenn das geschieht, ist eine logische Herangehensweise der beste Weg, das Problem zu identifizieren -und zu lsöen. Einige Richtlinien, wie Sie diese Problemlösung erlernen +und zu Lösen. Einige Richtlinien, wie Sie diese Problemlösung erlernen können, finden sich in @rprogram{Troubleshooting}. @@ -695,12 +725,12 @@ Fehlermeldungen der Log-Datei hat. Sie werden näher erklärt in -@node Wie die Handbücher gelesen werden sollen -@section Wie die Handbücher gelesen werden sollen +@node Wie die Handbücher gelesen werden sollten +@section Wie die Handbücher gelesen werden sollten @translationof How to read the manuals -Dieser Abschnitt zeigt, wie die Dokumentation effizient gelesen -werden kann und erklärt auch einige nützliche Interaktionseigenschaften +Dieser Abschnitt erklärt, wie die Dokumentation effizient gelesen +werden kann und behandelt auch einige nützliche Interaktionseigenschaften der Online-Version. @menu @@ -714,6 +744,7 @@ der Online-Version. @subsection Ausgelassenes Material @translationof Omitted material + @cindex Handbuch, Lesen @cindex Wie soll das Handbuch gelesen werden @cindex Lesen des Handbuchs @@ -726,39 +757,23 @@ der Online-Version. @cindex Hinweise zur Konstruktion von Dateien LilyPond-Code muss immer von @code{@{ @}} Zeichen oder einem -@w{@code{@bs{}relative c'' @{ @dots{} @}}} umgeben sein, wie -gezeigt in @ref{Arbeiten an Eingabe-Dateien}. +@q{@w{@code{@bs{}relative @{ @dots{} @}}}} umgeben sein, wie +in @ref{Arbeiten an Eingabe-Dateien} gezeigt. Im Rest dieses Handbuchs werden die meisten Beispiel allerdings darauf verzichten. Um sie zu reproduzieren, können Sie den entsprechenden -Quellcode kopieren und in eine Textdatei einfügen, aber Sie -@strong{müssen} dabei -@w{@code{@bs{}relative c'' @{ @dots{} @}}} einfügen, wie hier gezeigt: +Quellcode kopieren und in eine Textdatei zwischen @code{@{} +und @code{@}} einfügen. @example -\relative c'' @{ +@{ @dots{}hier das Beispiel@dots{} @} @end example -Warum werden die Klammern hier meist weggelassen? Die meisten -der Beispiele können in ein längeres Musikstück hineinkopiert -werden, und dann ist es natürlich nicht sinnvoll, wenn auch noch -@w{@code{@bs{}relative c'' @{ @dots{} @}}} dazukommt; ein @code{\relative} darf -nicht innerhalb eines anderen @code{\relative} gesetzt werden, -deshalb wird es hier weggelassen, damit die Beispiele auch innerhalb -eines anderen Kontextes funktionieren. Wenn bei jedem -Beispiel @w{@code{@bs{}relative c'' @{ @dots{} @}}} eingesetzt würde, -könnten Sie die kleinen Beispiele der Dokumentation -nicht einfach zu Ihrem eigenen Notentext hinzufügen. -Die meisten Benutzer wollen -Noten zu einer schon bestehenden Datei irgendwo in der Mitte -hinzufügen, deshalb wurde der relative Modus für die Beispiele -im Handbuch weggelassen. - Denken Sie auch daran, dass jede LilyPond-Datei eine Versionsbezeichnung mit dem @code{\version}-Befehl haben sollte. Weil die Beispiele in den Handbüchern Schnipsel und keine vollständigen Dateien sind, fehlt hier -die Versionsbezeichnung. Sie sollten sie aber immer in Ihre eigenen +die Versionsbezeichnung. Sie sollten sie aber immer in Ihre eigenen Dateien einfügen. @@ -778,8 +793,8 @@ Abbildung: @c no verbatim here @c KEEP LY @lilypond[quote] -\relative c'' { - c4-\markup { \bold \huge { Hier klicken! } } +\relative { + c''4-\markup { \bold \huge { Hier klicken! } } } @end lilypond @@ -793,6 +808,7 @@ cut-&-pastable section} bis ganz zum Ende der Datei. @ignore +This is item 825 @n ode Navigation mit der Tastatur @s ubsection Navigation mit der Tastatur @@ -823,7 +839,7 @@ fallen, spätere Abschnitte zu verstehen.} @item @strong{Bevor Sie @emph{irgendetwas} ausprobieren}: Lesen Sie die -Abschnitte @ref{Übung} und @ref{Übliche Notation}. Wenn +Abschnitte @ref{Tutorium} und @ref{Übliche Notation}. Wenn Sie auf musikalische Fachbegriffen stoßen, die Sie nicht kennen, schauen Sie diese im @rglosnamed{Top, Glossar} nach. @@ -836,7 +852,7 @@ in der @item @strong{Bevor Sie versuchen, die Standardnotation zu verändern}: -Lesen Sie @ref{Die Ausgabe verändern} im Handbuch zum Lernen. +Lesen Sie @ref{Die Ausgabe verbessern} im Handbuch zum Lernen. @item @strong{Bevor Sie sich an ein größeres Projekt machen}: Lesen @@ -845,4 +861,3 @@ Sie den Abschnitt in der Programmbenutzung. @end itemize - diff --git a/Documentation/de/learning/tweaks.itely b/Documentation/de/learning/tweaks.itely index 0c64ba2469..57f5afc41c 100644 --- a/Documentation/de/learning/tweaks.itely +++ b/Documentation/de/learning/tweaks.itely @@ -1,17 +1,18 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 + Translation of GIT committish: 8819d7cb0ba2ab359e4aa2276695afb9c1957c42 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes. @end ignore -@c \version "2.17.20" +@c \version "2.19.22" +@c Translators: ???, Michael Gerdau -@node Die Ausgabe verändern -@chapter Die Ausgabe verändern +@node Die Ausgabe verbessern +@chapter Die Ausgabe verbessern @translationof Tweaking output In diesem Kapitel wird erklärt, wie man die Notenausgabe verändern @@ -24,11 +25,11 @@ Notenfragment kann geändert werden. * Die Referenz der Programminterna:: * Erscheinung von Objekten:: * Positionierung von Objekten:: +* Vertikale Abstände:: * Kollision von Objekten:: * Weitere Optimierungen:: @end menu - @node Grundlagen für die Optimierung @section Grundlagen für die Optimierung @translationof Tweaking basics @@ -84,7 +85,7 @@ von Optimierungen verstehen zu können. @cindex Eigenschaften von Objekten Optimierung bedeutet, die internen Operationen und Strukturen -des LilyPond-Programmes zu verändern, darum sollen hier +des LilyPond-Programms zu verändern, darum sollen hier zunächst die wichtigsten Begriffe erklärt werden, die zur Beschreibung dieser Operationen und Strukturen benutzt werden. @@ -99,7 +100,7 @@ spezifische Angaben über die Engraver, die innerhalb dieses Systems eingesetzt werden. Für alle anderen Kontexte gibt es genauso Objekte, die deren Eigenschaften beinhalten, beispielsweise für @code{Voice}-Objekte, @code{Score}-Objekte, @code{Lyrics}-Objekte, -aber auch für Objekte, die Notationselemente wie die Taktlinien, +aber auch für Objekte, die Notationselemente wie die Taktstriche, Notenköpfe, Bögen und Dynamikbezeichnung enthalten. Jedes Objekt hat eine eigene Gruppe an Eigenschaftswerten. @@ -114,12 +115,20 @@ Farbe usw. Einige Layout-Objekte sind etwas spezieller. Phrasierungsbögen, Crescendo-Klammern, Oktavierungszeichen und viele andere -Grobs sind nicht an einer Stelle plaziert -- sie haben vielmehr +Grobs sind nicht an einer Stelle platziert -- sie haben vielmehr einen Anfangspunkt, einen Endpunkt und eventuell noch andere Eigenschaften, die ihre Form bestimmen. Objekte mit solch einer erweiterten Gestalt werden als @qq{Strecker} (engl. Spanners) bezeichnet. +Darüber hinaus gibt es @q{abstrakte} Grobs, die selbst keinen Ausdruck +irgendwelcher Art erzeugen. Vielmehr sammeln sie, positionieren oder +verwalten andere Grobs. Typische Beispiele hierfür sind +@code{DynamicLineSpanner}, @code{BreakAlignment}, +@code{NoteColumn}, @code{VerticalAxisGroup}, +@code{NonMusicalPaperColumn} und Ähnliche. Wir werden uns später +mit einigen von ihnen noch näher befassen. + Es bleibt uns noch übrig zu erklären, was @qq{Schnittstellen} (engl. interface) sind. Wenn auch viele Objekte sehr unterschiedlich sind, haben sie doch oft gemeinsame Eigenschaften, die auf @@ -186,19 +195,31 @@ Zeichen werden explizit angegeben. Es wird bald ersichtlich werden, dass die Eigenschaften von unterschiedlichen Objekttypen mit unterschiedlichen Befehlen -geändert werden. Deshalb ist es nützlich, aus der -Schreibweise zu erkennen, um was -für ein Objekt es sich handelt, um den entsprechenden -Befehl einsetzen zu können. +geändert werden. Deshalb ist es nützlich, bereits am Namen +den Typ und die Eigenschaften eines Objekts zu erkennen. @node Optimierungsmethoden @subsection Optimierungsmethoden @translationof Tweaking methods +@cindex Optimierungsmethoden + +@menu +* Der override-Befehl:: +* Der revert-Befehl:: +* Der once-Präfix:: +* Der overrideProperty-Befehl:: +* Der tweak-Befehl:: +* Der single-Präfix:: +@end menu + +@node Der override-Befehl +@unnumberedsubsubsec Der @code{@bs{}override}-Befehl +@translationof The override command + @cindex override-Befehl @funindex \override -@funindex override @strong{Der \override-Befehl} @@ -222,8 +243,7 @@ uns an, wie das vor sich geht. Die allgemeine Syntax dieses Befehles ist: @example -\override @var{Kontext}.@var{LayoutObjekt} #'@var{layout-eigenschaft} = -#@var{Wert} +\override @var{Kontext}.@var{LayoutObjekt}.@var{layout-eigenschaft} = #@var{Wert} @end example @noindent @@ -235,43 +255,53 @@ Wert @var{value}. Der @var{Kontext} kann (und wird auch normalerweise) ausgelassen werden, wenn der benötigte Kontext eindeutig impliziert ist und einer der untersten Kontexte ist, also etwa @code{Voice}, @code{ChordNames} -oder @code{Lyrics}. Auch in diesem Text wird der Kontext oft ausgelassen -werden. Später soll gezeigt werden, in welchen Fällen er ausdrücklich +oder @code{Lyrics}. Auch in diesem Text wird der Kontext oft ausgelassen +werden. Später soll gezeigt werden, in welchen Fällen er ausdrücklich definiert werden muss. Spätere Abschnitte behandeln umfassend Eigenschaften und ihre -Werte, siehe @ref{Typen von Eigenschaften}. Aber um ihre Funktion und ihr +Werte, siehe @ref{Typen von Eigenschaften}. Aber um ihre Funktion und ihr Format zu demonstrieren, werden wir hier nur einige einfache Eigenschaften und Werte einsetzen, die einfach zu verstehen sind. -Für den Moment könne Sie die @code{#'}-Zeichen ignorieren, die vor jeder -Layout-Eigenschaft, und die @code{#}-Zeichen, die vor jedem Wert -stehen. Sie müssen immer in genau dieser Form geschrieben werden. -Das ist der am häufigsten gebrauchte Befehl für die Optimierung, -und der größte Teil dieses Abschnittes wird dazu benutzt, seine Benutzung -zu erläutern. Hier ein einfaches Beispiel, um die Farbe des Notenkopfes -zu ändern: +LilyPond's hauptsächliche Ausdrücke sind musikalische Dinge wie Noten, +Notendauern und Markierungen. Diesen zugrunde liegende Ausdrücke wie +Zahlen, Zeichenketten und Listen werden im @q{Scheme Modus} verarbeitet. +Der Präfix @samp{#} leitet diesen Modus ein. Einige dieser Werte haben +manchmal eine gültige Repräsentation in LilyPond's Musik Modus, in diesem +Handbuch werden wir aus Gründen der Einheitlichkeit immer das @samp{#} +für ihre Eingabe verwenden. Weiterführende Informationen zu LilyPond's +Scheme mode finden sie unter @rextend{LilyPond Scheme-Syntax}. + +@code{\override} ist der bei Optimierungen am häufigsten verwendete Befehl. +Daher wird der Rest dieses Kapitels im Wesentlichen aus Anwendungsbeispielen +dieses Befehls bestehen. Hier kommt gleich ein einfaches Beispiel +zur Änderung der Farbe von Notenköpfen: @cindex color-Eigenschaft, Beispiel @cindex Farb-Eigenschaft, Beispiel @cindex NoteHead, Beispiel für override @cindex Notenkopf, Beispiel für Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a b c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a b c | +} @end lilypond -@strong{Der \revert-Befehl} +@node Der revert-Befehl +@unnumberedsubsubsec Der @code{@bs{}revert}-Befehl +@translationof The revert command @cindex revert-Befehl + @funindex \revert -@funindex revert Wenn eine Eigenschaft einmal überschrieben wurde, wird ihr neuer Wert so lange bewahrt, bis er noch einmal überschrieben @@ -282,7 +312,7 @@ jedoch auf den vorigen Wert, wenn mehrere @code{\override}-Befehle benutzt wurden. @example -\revert @var{Kontext}.@var{LayoutObjekt} #'@var{layout-eigenschaft} +\revert @var{Kontext}.@var{LayoutObjekt}.@var{layout-eigenschaft} @end example Wiederum, genauso wie der @var{Kontext} bei dem @code{\override}-Befehl, @@ -295,20 +325,24 @@ wieder auf den Standardwert für die letzten zwei Noten gesetzt. @cindex NoteHead, Beispiel für override @cindex Notenkopf, Beispiel für Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a -\revert NoteHead.color -b4 c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a + \revert NoteHead.color + b4 c | +} @end lilypond -@strong{\once-Präfix} + +@node Der once-Präfix +@unnumberedsubsubsec Der @code{@bs{}once}-Präfix +@translationof The once prefix @funindex \once -@funindex once Sowohl der @code{\override}-Befehl als auch der @code{\set}-Befehl können mit dem Präfix @code{\once} (@emph{einmal}) versehen werden. Dadurch wird @@ -324,23 +358,46 @@ geändert werden: @cindex NoteHead, Beispiel für override @cindex Notenkopf, Beispiel für Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\once \override NoteHead.color = #green -g4 a -\revert NoteHead.color -b c | +@lilypond[quote,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \once \override NoteHead.color = #green + g4 a + \revert NoteHead.color + b c | +} +@end lilypond + +Der @code{\once} Präfix eignet sich also dazu, die Geltungsdauer eines +anderen vordefinierten Befehls, dem er vorangestellt ist, auf ein +einziges musikalisches Ereignis zu beschränken: + +@lilypond[quote,verbatim] +\relative { + c'4( d) + \once \slurDashed + e4( f) | + g4( a) + \once \hideNotes + b( c) | +} @end lilypond +Allerdings funktioniert das nicht bei vordefinierten Befehlen wie +@code{\@dots{}Neutral}, @code{\@dots{}Off} oder @code{\un@dots{}}, weil +diese intern @code{\revert} verwenden und nicht @code{\override}, sodass +ein @code{\once} Präfix hier keine Auswirkungen hat. -@strong{Der \overrideProperty-Befehl} + +@node Der overrideProperty-Befehl +@unnumberedsubsubsec Der @code{@bs{}overrideProperty}-Befehl +@translationof The overrideProperty command @cindex overrideProperty-Befehl @funindex \overrideProperty -@funindex overrideProperty Es gibt eine andere Form des @code{override}-Befehls, @code{\overrideProperty} (überschreibe Eigenschaft), @@ -350,16 +407,18 @@ in @rextend{Schwierige Korrekturen}. @c Maybe explain in a later iteration -td -@strong{Der \tweak-Befehl} +@node Der tweak-Befehl +@unnumberedsubsubsec Der @code{@bs{}tweak}-Befehl +@translationof The tweak command @cindex tweak-Befehl + @funindex \tweak -@funindex tweak Der letzte Optimierungsbefehl in LilyPond ist @code{\tweak} (engl. optimieren). Er wird eingesetzt um Eigenschaften nur eines Objektes von mehreren Objekten zu verändern, -die zum selben Musik-Moment +die zum selben Musik-Zeitpunkt auftreten, wie etwa die Noten eines Akkordes. Ein @code{\override} würde alle Noten des Akkords beeinflussen, während mit @code{\tweak} nur das nächste Objekt der @@ -374,11 +433,13 @@ werden. Schauen wir zuerst, was wir mit @cindex NoteHead, Beispiel für override @cindex Notenkopf, Beispiel für Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -\once \override NoteHead.font-size = #-3 -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + \once \override NoteHead.font-size = #-3 + 4 + 4 +} @end lilypond Wie man sehen kann, beeinflusst @code{override} @emph{alle} @@ -401,9 +462,11 @@ mittlere Note eines Akkordes auf diese Weise ändern: @cindex Schriftgröße, Beispiel @cindex @code{\tweak}-Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + 4 +} @end lilypond Beachten Sie, dass die Syntax des @code{\tweak}-Befehls sich @@ -415,7 +478,7 @@ kein Gleichheitszeichen vorhanden sein. Die verallgemeinerte Syntax des @code{\tweak}-Befehls ist also @example -\tweak #'@var{layout-eigenschaft} #@var{Wert} +\tweak @var{layout-eigenschaft} #@var{Wert} @end example Ein @code{\tweak}-Befehl kann auch benutzt werden, um nur @@ -425,8 +488,8 @@ Beispiel zu sehen ist. @cindex Farb-Eigenschaft, Beispiel @cindex @code{\tweak}-Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -a4^"Black" +@lilypond[quote,fragment,ragged-right,verbatim] +a'4^"Black" -\tweak color #red ^"Red" -\tweak color #green _"Green" @end lilypond @@ -447,16 +510,16 @@ mit solchen indirekt erstelltn Objekten zu verwenden, indem man die Layout-Objekte direkt benennt, vorausgesetzt dass LilyPond ihre Herkunft bis zu dem ursprünglichen Ereignis zurück verfolgen kann: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -<\tweak Accidental.color #red cis4 - \tweak Accidental.color #green es - g> +@lilypond[quote,fragment,ragged-right,verbatim] +<\tweak Accidental.color #red cis''4 + \tweak Accidental.color #green es'' + g''> @end lilypond Diese Langform des @code{\tweak}-Befehls kann wie folgend beschrieben werden: @example -\tweak @var{layout-object} #'@var{layout-property} @var{value} +\tweak @var{layout-object}.@var{layout-property} @var{value} @end example @cindex Triolen, geschachtelt @@ -465,6 +528,7 @@ Diese Langform des @code{\tweak}-Befehls kann wie folgend beschrieben werden: @cindex Triolenklammer @cindex N-tolenklammer @cindex Komplizierte Rhythmen, Schachtelung von + @funindex TupletBracket Der @code{\tweak}-Befehl muss auch benutzt werden, wenn das @@ -474,7 +538,7 @@ Im folgenden Beispiel beginnen die lange Klammer und die erste Triolenklammer zum selben Zeitpunkt, sodass ein @code{\override}-Befehl sich auf beide beziehen würde. In dem Beispiel wird @code{\tweak} benutzt, um zwischen -ihnen zu unterscheiden. Der erste @code{\tweak}Befehl +ihnen zu unterscheiden. Der erste @code{\tweak}Befehl gibt an, dass die lange Klammer über den Noten gesetzt werden soll, und der zweite, dass die Zahl der rhythmischen Aufteilung für die erste der kurzen Klammern in rot @@ -486,13 +550,15 @@ gesetzt wird. @cindex color-Eigenschaft, Beispiel @cindex direction-Eigenschaft, Beispiel -@lilypond[quote,ragged-right,verbatim,fragment,relative=2] -\tweak direction #up -\tuplet 3/4 { - \tweak color #red - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \tweak direction #up + \tuplet 3/4 { + \tweak color #red + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -509,15 +575,17 @@ beginnen, kann ihr Aussehen auf die übliche Art mit dem @c NOTE Tuplet brackets collide if notes are high on staff @c See issue 509 -@lilypond[quote,ragged-right,verbatim,fragment,relative=1] -\tuplet 3/2 { c8[ c c] } -\once \override TupletNumber.text = #tuplet-number::calc-fraction-text -\tuplet 3/2 { - c8[ c] - c8[ c] - \once \override TupletNumber.transparent = ##t - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative { + \tuplet 3/2 { c'8[ c c] } + \once \override TupletNumber.text = #tuplet-number::calc-fraction-text + \tuplet 3/2 { + c8[ c] + c8[ c] + \once \override TupletNumber.transparent = ##t + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -526,11 +594,70 @@ beginnen, kann ihr Aussehen auf die übliche Art mit dem Notationsreferenz: @ruser{Der tweak-Befehl}. +@node Der single-Präfix +@unnumberedsubsubsec Der @code{@bs{}single}-Präfix +@translationof The single prefix + +@funindex \single +@cindex tweak, von override erzeugt + +Nehmen wir einmal an, wir möchten bestimmte Noten betonen, indem wir ihre +Köpfe rot einfärben und sie außerdem vergrößern. Damit das einfach zu +machen ist nehmen wir ferner an, wir hätten dafür eine Funktion definiert: + +@lilypond[quote,verbatim] +emphNoteHead = { + \override NoteHead.color = #red + \override NoteHead.font-size = 2 +} +\relative { + c''4 a \once \emphNoteHead f d | +} +@end lilypond + +Der @code{\once} Präfix funktioniert wunderbar, wenn es darum geht einzelne +Noten oder ganze Akkorde zu betonen, jedoch versagt er, gilt es eine einzelne +Note @emph{innerhalb} eines Akkordes zu betonen. Wir haben schon gesehen, +wie @code{\tweak} dennoch dazu gebracht werden kann, siehe +@ref{Der tweak-Befehl,,Der @code{@bs{}tweak}-Befehl}. Aber +@code{\tweak} kann nicht auf eine Funktion angewandt werden; hier +kommt @code{\single} ins Spiel: + +@lilypond[quote,verbatim] +emphNoteHead = { + \override NoteHead.color = #red + \override NoteHead.font-size = 2 +} +\relative { + 4 +} +@end lilypond + +Zusammenfassend kann man sagen, @code{\single} wandelt overrides in tweaks +sodass bei mehreren zeitgleichen musiklaischen Objekten (wie die Notenköpfe +eines Akkords), man mit @code{\single} lediglich ein einzelnes Objekt +beeinflusst, nämlich dasjenige, was im direkt folgenden musikalischen +Ausdruck steckt. Das ist anders, als @code{\once}, welches alle diese +Objekte beträfe. + +Man kann so @code{\single} dafür verwenden, jede kleine Funktion, die +lediglich overrides enthält auf einzelne Noten innerhalb eines Akkords +anzuwenden. Es sei jedoch darauf hingewiesen, @code{\single} wandelt +weder @code{\revert}, noch noch @code{\set} oder @code{\unset} in tweaks. + +@seealso +Handbuch zum Lernen: +@ref{Der tweak-Befehl,,Der @code{@bs{}tweak}-Befehl}, +@ref{Variablen für Layout Anpassungen einsetzen}. + @node Die Referenz der Programminterna @section Die Referenz der Programminterna @translationof The Internals Reference manual +@cindex Referenz der Programminterna +@cindex Programminterna, Referenz + @menu * Eigenschaften von Layoutobjekten:: * Eigenschaften die Schnittstellen besitzen können:: @@ -591,12 +718,12 @@ Komposition demonstriert werden. Hier das Beispiel: @c Mozart, Die Zauberflöte Nr. 7 Duett -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -618,7 +745,7 @@ auf der LilyPond-Webseite unter der Adresse @uref{http://lilypond.org}. Gehen Sie zur Dokumentationsseite und klicken Sie auf den Link zur Referenz der Interna. @c Addition for German users -Die Sprache ändert sich ab hier nach englisch. Für diese Übung +Die Sprache ändert sich ab hier nach englisch. Für diese Übung sollten Sie die HTML-Version benutzen, nicht die @qq{auf einer großen Seite} oder die PDF-Version. Damit Sie die nächsten Absätze verstehen können, müssen Sie @@ -626,26 +753,25 @@ genauso vorgehen, während Sie weiterlesen. Unter der Überschrift @strong{Top} befinden sich fünf Links. Wählen Sie den Link zum @emph{Backend}, wo sich die Information -über Layout-Objekte befindet. Hier, unter der Überschrift +über Layout-Objekte befindet. Hier, unter der Überschrift @strong{Backend}, wählen Sie den Link @emph{All layout objects}. Die Seite, die sich öffnet, enthält ein Liste aller Layout-Objekte, -die in Ihrerer LilyPond-Version benutzt werden, in alphabetischer +die in Ihrer LilyPond-Version benutzt werden, in alphabetischer Ordnung. Wählen Sie den Link @emph{Slur} und die Eigenschaften der Legatobögen (engl. slur) werden aufgelistet. Eine alternative Methode, auf diese Seite zu gelangen, ist von -der Notationsreferenz aus. Auf einer der Seiten zu Legatobögen -findet sich ein Link zur Referenz der Interna. Dieser Link führt -Sie direkt auf diese Seite. Wenn Sie aber eine Ahnung haben, +der Notationsreferenz aus. Auf einer der Seiten zu Legatobögen +findet sich ein Link zur Referenz der Interna. Dieser Link führt +Sie direkt auf diese Seite. Wenn Sie aber eine Ahnung haben, wie die Bezeichnung des Layout-Objektes lauten könnte, das sie ändern wollen, ist es oft schneller, direkt zur IR zu gehen und dort nachzuschlagen. -Aus der Slur-Seite in der IR könne wir entnehmen, dass +Der Slur-Seite in der IR können wir entnehmen, dass Legatobögen (Slur-Objekte) durch den Slur_engraver erstellt -werden. Dann werden die Standardeinstellungen aufgelistet. -Beachten Sie, dass diese @strong{nicht} in alphabetischer Reihenfolge -geordnet sind. Schauen Sie sich die Liste an, ob sie eine Eigenschaft +werden. Dann werden die Standardeinstellungen aufgelistet. +Schauen Sie sich die Liste an, ob sie eine Eigenschaft enthält, mit der die Dicke von Legatobögen kontrolliert werden kann. Sie sollten folgendes finden: @@ -680,9 +806,7 @@ Befehl auch funktioniert. Also: \override Slur.thickness = #5.0 @end example -Vergessen Sie nicht das Rautenzeichen und Apostroph -(@code{#'}) vor der Eigenschaftsbezeichnung und das -Rautenzeichen vor dem neuen Wert! +Vergessen Sie nicht das@tie{}@code{#} vor dem neuen Wert! Die nächste Frage ist nun: @qq{Wohin soll dieser Befehl geschrieben werden?} Solange wir uns noch im Lernstadium befinden, ist @@ -693,14 +817,14 @@ Legatobogen und nahe bei ihm.} Also etwa so: @cindex thickness-Eigenschaft, Beispiel @cindex Dicke-Eigenschaft, Beispiel -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { + \relative { % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 - r4 bes8 bes[( g]) g | + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -721,8 +845,7 @@ eigenen Befehle zu konstruieren -- wenn Sie auch noch etwas Übung benötigen. Die sollen Sie durch die folgenden Übungen erhalten. - -@subheading Den Kontext finden +@subsubsubheading Den Kontext finden @cindex Kontext, Finden und identifizieren @@ -745,13 +868,12 @@ der untersten Ebene ist, welcher eindeutig schon dadurch definiert ist, dass wir Noten eingeben, kann er an dieser Stelle auch weggelassen werden. - -@subheading Nur einmal mit \override verändern +@subsubsubheading Nur einmal mit \override verändern @cindex Override nur einmal @cindex once override + @funindex \once -@funindex once Im Beispiel oben wurden @emph{alle} Legatobögen dicker gesetzt. Vielleicht wollen Sie aber nur den ersten Bogen @@ -767,12 +889,12 @@ muss also wie folgt positioniert werden: @cindex Legatobogen, Beispiel zur Veränderung @cindex thickness-Eigenschaft, Beispiel -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { + \key es \major \time 6/8 - { - \key es \major - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes8[( g]) g | @@ -791,15 +913,14 @@ Jetzt bezieht er sich nur noch auf den ersten Legatobogen. Der @code{\once}-Befehl kann übrigens auch vor einem @code{\set}-Befehl eingesetzt werden. - -@subheading Rückgängig machen +@subsubsubheading Rückgängig machen @cindex Revert @cindex Rückgängig machen @cindex Wiederherstellen von Standardeinstellungen @cindex Standardeinstellungen, Wiederherstellen + @funindex \revert -@funindex revert Eine weitere Möglichkeit: nur die beiden ersten Legatobögen sollen dicker gesetzt werden. Gut, wir könnten jetzt zwei Befehle benutzen, @@ -809,12 +930,12 @@ Note gestellt, an welcher der Bogen beginnt: @cindex Legatobogen, Beispiel zur Veränderung @cindex thickness-Eigenschaft, Beispiel -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes[( g]) g | @@ -837,12 +958,12 @@ dessen später den @code{\revert}-Befehl einsetzen, um die @cindex Legatobogen, Beispiel zur Veränderung @cindex thickness-Eigenschaft, Beispiel -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 bes[( g]) g | @@ -931,25 +1052,20 @@ die auch das @code{font-interface} unterstützen, setzen diese Eigenschaften anders, wenn sie erstellt werden. Versuchen wir nun einen @code{\override}-Befehl zu konstruieren, -der den Gesangstext kursiv setzt. Das Objekt hat die Bezeichnung +der den Gesangstext kursiv setzt. Das Objekt hat die Bezeichnung @code{LyricText}, die Eigenschaft ist @code{font-shape} -und der Wert @code{italic}. Wie vorher schon lassen wir den +und der Wert @code{italic}. Wie vorher schon lassen wir den Kontext aus. -Am Rande sei angemerkt, dass die Werte der @code{font-shape}-Eigenschaft -mit einem Apostroph (@code{'}) gekennzeichnet werden -müssen, weil es sich um Symbole handelt. Aus dem gleichen -Grund mussten auch für @code{thickness} weiter oben im -Text ein Apostroph gesetzt werden. Symbole sind besondere -Bezeichnungen, die LilyPond intern bekannt sind. Einige -sind Bezeichnungen von Eigenschaften, wie eben @code{thickness} -oder @code{font-shape}. Andere sind besondere Werte, -die an Eigenschaften übergeben werden können, wie -@code{italic}. Im Unterschied hierzu gibt es auch beliebige +Am Rande sei auf das wichtige Detail hingewiesen, dass die Werte für +manche Eigenschaften Symbole sind, wie z.B. @code{italic} und dass +diese mit einem Apostroph (@code{'}) gekennzeichnet werden müssen. +Symbole sind besondere Bezeichnungen, die LilyPond intern +bekannt sind. Im Unterschied hierzu gibt es auch beliebige Zeichenketten, die immer mit Anführungszeichen, also als @code{"Zeichenkette"} auftreten. Für weitere Einzelheiten zu Zeichenketten und Werten, siehe -@rextend{Scheme-Übung}. +@rextend{Scheme-Tutorium}. Gut, der @code{\override}-Befehl, mit dem der Gesangstext kursiv gesetzt wird, lautet: @@ -967,12 +1083,12 @@ bezieht, etwa so: @cindex kursiv, Beispiel @cindex @code{\addlyrics}, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -986,42 +1102,13 @@ bezieht, etwa so: @noindent Jetzt wird der Text kursiv gesetzt. - -@subheading Den Kontext im Liedtextmodus bestimmen - - -@cindex Kontext im Gesangstextmodus angeben -@cindex Gesangstextmodus, Kontext angeben - -Bei Gesangstexten funktioniert der @code{\override}-Befehl -nicht mehr, wenn Sie den Kontext im oben dargestellten -Format angeben. Eine Silbe wird im Gesangtextmodus -(lyricmode) entweder von einem Leerzeichen, einer -neuen Zeile oder einer Zahl beendet. Alle anderen -Zeichen werden als Teil der Silbe integriert. Aus diesem -Grund muss auch vor der schließenden Klammer -@code{@}} ein Leerzeichen gesetzt oder eine neue -Zeile begonnen werden. Genauso müssen Leerzeichen -vor und nach einem Punkt benutzt werden, um die -Kontext-Bezeichnung von der Objekt-Bezeichnung zu -trennen, denn sonst würden beide Bezeichnungen als -ein Begriff interpretiert und von LilyPond nicht verstanden -werden. Der Befehl muss also lauten: - -@example -\override Lyrics.LyricText.font-shape = #'italic -@end example - @warning{Innerhalb von Gesangstext muss immer ein Leerzeichen zwischen der letzten Silbe und der schließenden Klammer gesetzt werden.} -@warning{Innerhalb von @code{\override}-Befehlen in -Gesangstexten müssen Leerzeichen um Punkte zwischen -Kontext- und Objektbezeichnungen gesetzt werden.} @seealso -Erweitern: @rextend{Scheme-Übung}. +Erweitern: @rextend{Scheme-Tutorium}. @node Typen von Eigenschaften @@ -1040,33 +1127,38 @@ angegeben. Hier eine Liste der Typen, die Sie vielleicht benötigen werden, mit den Regeln, die für den jeweiligen Typ gelten und einigen Beispielen. Sie müssen immer ein Rautenzeichen (@code{#}) vor den Typeintrag setzen, -wenn sie in einem @code{\override}-Befehl benutzt werden. +wenn sie in einem @code{\override}-Befehl benutzt werden, +auch dann, wenn der Wert selbst bereits mit@tie{}@code{#} +anfängt. Alle Beispiele verwenden ausschließlich Konstanten. +Für die Verwendungen von mit Scheme berechneten Werten siehe +@rextend{Berechnungen in Scheme}. @multitable @columnfractions .2 .45 .35 @headitem Eigenschaftstyp @tab Regeln @tab Beispiele @item Boolesch - @tab Entweder wahr oder falsch, dargestellt als #t oder #f + @tab Entweder wahr oder falsch, dargestellt als @code{#t} oder @code{#f} @tab @code{#t}, @code{#f} @item Dimension (in Notenlinienabständen) - @tab Eine positive Dezimalzahl (in Notenlinienabstand-Einheiten) + @tab Eine Dezimalzahl (in Notenlinienabstand-Einheiten) @tab @code{2.5}, @code{0.34} @item Richtung @tab Eine gültige Richtungskonstante oder das numerische Äquivalent + (@code{0} or @code{CENTER} bezeichnen eine neutrale Richtung) @tab @code{LEFT}, @code{CENTER}, @code{UP}, @code{1}, @w{@code{-1}} @item Integer - @tab Eine positive ganze Zahl - @tab @code{3}, @code{1} + @tab Eine ganze Zahl + @tab @code{3}, @code{-1} @item Liste - @tab Eine eingeklammerte Anzahl von Einträgen, mit Klammern getrennt - und angeführt von einem Apostroph - @tab @code{'(left-edge staff-bar)}, @code{'(1)}, + @tab Eine Folge von Konstanten oder Symbolen in Klammern, angeführt von einem Apostroph; + Einträge durch Leerzeichen voneinander getrennt + @tab @code{'(left-edge staff-bar)}, @code{'(1)}, @code{'()}, @code{'(1.0 0.25 0.5)} @item Textbeschriftung (markup) @tab Beliebige gültige Beschriftung - @tab @code{\markup @{ \italic "cresc." @}} + @tab @code{\markup @{ \italic "cresc." @}}, @code{"bagpipe"} @item Moment @tab Ein Bruch einer ganzen Note, mit der make-moment-Funktion konstruiert @@ -1074,9 +1166,9 @@ wenn sie in einem @code{\override}-Befehl benutzt werden. @code{(ly:make-moment 3/8)} @item Zahl @tab Eine beliebige positive oder negative Dezimalzahl - @tab @code{3.5}, @w{@code{-2.45}} + @tab @code{3}, @w{@code{-2.45}} @item Paar (Zahlenpaar) - @tab Zwei Zahlen getrennt von @qq{Leerzeichen . Leerzeichen}, eingeklammert + @tab Zwei Zahlen getrennt durch @qq{Leerzeichen . Leerzeichen}, eingeklammert und angeführt von einem Apostroph @tab @code{'(2 . 3.5)}, @code{'(0.1 . -3.2)} @item Symbol @@ -1088,14 +1180,14 @@ wenn sie in einem @code{\override}-Befehl benutzt werden. @tab @code{bend::print}, @code{ly:text-interface::print}, @code{#f} @item Vektor - @tab Eine Liste mit drei Einträgen, eingeklammert und mit - Apostroph-Raute ( @code{'#}) angeführt. - @tab @code{'#(#t #t #f)} + @tab Konstanten, getrennt durch Leerzeichen, eingeschlossen in + @code{#(}@dots{}@code{)}. + @tab @code{#(#t #t #f)} @end multitable @seealso -Erweitern: @rextend{Scheme-Übung}. +Erweitern: @rextend{Scheme-Tutorium}. @node Erscheinung von Objekten @@ -1121,8 +1213,8 @@ In Unterrichtsmaterial für den Musikunterricht wird oft eine Partitur dargestellt, in der bestimmte Notationselemente fehlen, so dass der Schüler die Aufgabe bekommt, die nachzutragen. Ein einfaches Beispiel ist etwa, die -Taktlinien zu entfernen, damit der Schüler sie selber zeichnen -kann. Aber die Tatklinien werden normalerweise automatisch +Taktstriche zu entfernen, damit der Schüler sie selber zeichnen +kann. Aber die Taktstriche werden normalerweise automatisch eingefügt. Wie verhindern wir, dass sie ausgegeben werden? Bevor wir uns hieran machen, sei daran erinnert, dass @@ -1142,26 +1234,35 @@ Schnittstelle geöffnet wird. Zu Information, wie man Eigenschaften von Grobs findet, siehe @ref{Eigenschaften von Layoutobjekten}. Wir benutzen also jetzt die selbe Methode um in der IR das Layout-Objekt zu finden, -dass für die Tatklinien zuständig ist. Über die Überschriften +dass für die Taktstriche zuständig ist. Über die Überschriften @emph{Backend} und @emph{All layout objects} kommen wir zu einem Layout-Objekt mit der Bezeichnung -@code{BarLine} (engl. TaktLinie). Seine Eigenschaften +@code{BarLine} (engl. Taktstrich). Seine Eigenschaften beinhalten zwei, die über die Sichtbarkeit entscheiden: @code{break-visibility} und @code{stencil}. @code{BarLine} unterstützt auch einige Schnittstellen, unter anderem @code{grob-interface}, wo wir eine @code{transparent} und eine @code{color}-Eigenschaft -finden. Alle können die Sichtbarkeit von Taktlinien (und +finden. Alle können die Sichtbarkeit von Taktstriche (und natürlich auch die Sichtbarkeit von vielen anderen Objekten) beeinflussen. Schauen wir uns diese Eigenschaften eine nach der anderen an. -@subheading stencil (Matrize) +@menu +* Die stencil-Eigenschaft:: +* Die break-visibility-Eigenschaft:: +* Die transparent-Eigenschaft:: +* Die color-Eigenschaft:: +@end menu + +@node Die stencil-Eigenschaft +@unnumberedsubsubsec Die @code{stencil}-Eigenschaft (Matrize) +@translationof The stencil property @cindex Stencil-Eigenschaft @cindex Matrizen-Eigenschaft -Diese Eigenschaft kontrolliert die Erscheinung der Taktlinien, +Diese Eigenschaft kontrolliert die Erscheinung der Taktstriche, indem sie das Symbol bestimmt, das ausgegeben werden soll. Wie bei vielen anderen Eigenschaften auch, kann sie so eingestellt werden, dass sie nichts ausgibt, indem ihr Wert @@ -1169,20 +1270,20 @@ auf @code{#f} (falsch) gesetzt wird. Ein Versuch also, wie vorher, indem wir den impliziten Kontext (@code{Voice}) auslassen: -@cindex Taktlinie, Beispiel zur Veränderung +@cindex Taktstrich, Beispiel zur Veränderung @cindex stencil-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override BarLine.stencil = ##f - c4 b8 c d16 c d8 + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond -Die Taktlinien werden aber immer noch angezeigt. Was ist da +Die Taktstriche werden aber immer noch angezeigt. Was ist da falsch gelaufen? Gehen Sie zurück zur IR und schauen Sie auf die Seite, die die Eigenschaften für @code{BarLine} angibt. Oben auf der Seite steht: @qq{Barline objects are created @@ -1192,28 +1293,42 @@ eine Liste der Kontexte, in denen der Takt-Engraver funktioniert. Alle Kontexte sind @code{Staff}-Typen (also Notensystem-Typen). Der Grund, warum der @code{\override}-Befehl nicht funktioniert hat, liegt -also darin, dass das Taktlinie-Objekt (@code{BarLine}) sich nicht +also darin, dass das Taktstrich-Objekt (@code{BarLine}) sich nicht im @code{Voice}-Kontext befindet. Wenn der Kontext falsch angegeben wird, bewirkt der Befehl einfach gar nichts. Keine Fehlermeldung wird ausgegeben und auch nichts in die Log-Datei geschrieben. Versuchen wir also, den richtigen Kontext mit anzugeben: -@cindex Taktlinie, Beispiel zur Veränderung +@cindex Taktstrich, Beispiel zur Veränderung @cindex stencil-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.stencil = ##f - c4 b8 c d16 c d8 - g,8 a16 b8 c d4 e16 + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent -Jetzt sind die Taktlinien wirklich verschwunden. +Jetzt sind die Taktstriche wirklich verschwunden. Setzen der +@code{stencil}-Eigenschaft auf @code{#f} wird derart häufig verwendet, +dass es dafür einen eigenen Befehl gibt, @code{\omit}: +@funindex \omit + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \omit Staff.BarLine + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + Es sollte jedoch beachtet werden, dass das Setzen der @code{stencil}-Eigenschaft auf @code{#f} zu Fehlerhinweisen führen @@ -1224,16 +1339,17 @@ die @code{stencil}-Eigenschaft des @code{NoteHead}-Objekts auf dessen die @code{point-stencil}-Funktion benutzt werden, welche den Stencil auf ein Objekt mit der Größe Null setzt: -@lilypond[quote,verbatim,relative=2] -{ - c4 c +@lilypond[quote,verbatim] +\relative { + c''4 c \once \override NoteHead.stencil = #point-stencil c4 c } @end lilypond - -@subheading break-visibility (unsichtbar machen) +@node Die break-visibility-Eigenschaft +@unnumberedsubsubsec The @code{break-visibility}-Eigenschaft (unsichtbar machen) +@translationof The break-visibility property @cindex break-visibility-Eigenschaft @cindex Unsichtbar machen (break-visibility) @@ -1241,35 +1357,37 @@ den Stencil auf ein Objekt mit der Größe Null setzt: Aus der Beschreibung der Eigenschaften für @code{BarLine} in der IR geht hervor, dass die @code{break-visibility}-Eigenschaft einen Vektor mit drei Booleschen Werten benötigt. Diese -kontrollieren jeweils, ob die Taktlinien am Ende einer Zeile, +kontrollieren jeweils, ob die Taktstriche am Ende einer Zeile, in der Mitte einer Zeile und am Anfang einer Zeile ausgegeben -werden. Wenn also alle Taktlinien unsichtbar sein sollen, wie in -unserem Beispiel, brauchen wir den Wert @code{'#(#f #f #f)}. +werden. Wenn also alle Taktstriche unsichtbar sein sollen, wie in +unserem Beispiel, brauchen wir den Wert @code{#(#f #f #f)}, (den es auch +unter dem symbolischen Namen @code{all-invisible} gibt). Versuchen wir es also, und berücksichtigen wir auch den -@code{Staff}-Kontext. Beachten Sie auch, dass Sie @code{#'#} +@code{Staff}-Kontext. Beachten Sie auch, dass Sie @code{##} vor der öffnenden Klammer schreiben müssen: -@code{'#} wird benötigt als Teil des Wertes, um einen Vektor zu +@code{#} wird benötigt als Teil des Wertes, um einen Vektor zu signalisieren, und das erste@tie{}@code{#} wird benötigt, um den Wert in einem @code{\override}-Befehl anzuführen. -@cindex Taktlinie, Beispiel zur Veränderung +@cindex Taktstrich, Beispiel zur Veränderung @cindex break-visibility-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 - \override Staff.BarLine.break-visibility = #'#(#f #f #f) - c4 b8 c d16 c d8 | + \override Staff.BarLine.break-visibility = ##(#f #f #f) + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent -Auch auf diesem Weg gelingt es, die Taktlinien unsichtbar zu machen. - +Auch auf diesem Weg gelingt es, die Taktstriche unsichtbar zu machen. -@subheading transparent (durchsichtig) +@node Die transparent-Eigenschaft +@unnumberedsubsubsec Die @code{transparent}-Eigenschaft (durchsichtig) +@translationof The transparent property @cindex transparent-Eigenschaft @cindex Durchsichtig machen (transparent) @@ -1278,7 +1396,7 @@ Aus den Eigenschaftsdefinitionen auf der @code{grob-interface}-Seite in der IR geht hervor, dass die @code{transparent}-Eigenschaft boolesch ist. Mit @code{#t} (wahr) wird also ein Grob durchsichtig gemacht. Im unserem Beispiel soll jetzt die Taktart durchsichtig -gemacht werden, anstatt die Taktlinien durchsichtig zu machen. +gemacht werden, anstatt die Taktstriche durchsichtig zu machen. Wir brauchen also wieder die Grob-Bezeichnung für die Taktart. Auf der @qq{All layout objects}-Seite in der IR müssen wir die Eigenschaften des @code{TimeSignature}-Layout-Objekts suchen @@ -1291,23 +1409,38 @@ machen, ist also: @cindex Taktart, Beispiel zur Veränderung @cindex transparent-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.TimeSignature.transparent = ##t - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent -Die Taktangabe ist verschwunden, aber mit diesem Befehl wird ein -freier Platz gelassen, wo sich die Taktangabe eigentlich befinden +Auch das Setzen der @code{transparent}-Eigenschaft ist ein recht häufige +Operation und so gibt es auch hierfür eine Kurzform names @code{\hide}: +@funindex \hide + +@lilypond[quote,ragged-right,verbatim] +\relative { + \time 12/16 + \hide Staff.TimeSignature + c''4 b8 c d16 c d8 | + g,8 a16 b8 c d4 e16 | + e8 +} +@end lilypond + +@noindent +In beiden Fällen ist die Taktangabe ist verschwunden, aber mit diesem Befehl +bleibt freier Platz, wo sich die Taktangabe eigentlich befinden würde. Das braucht man vielleicht für eine Schulaufgabe, in der die richtige Taktangabe eingefügt werden soll, aber in anderen Fällen ist diese Lücke nicht schön. Um auch die Lücke zu entfernen, -muss die Matrize (stencil) der Taktangabe auf @code{#f} (falsch) +muss stattdessen die Matrize (stencil) der Taktangabe auf @code{#f} (falsch) gesetzt werden: @cindex Taktart, Beispiel zur Veränderung @@ -1324,19 +1457,21 @@ gesetzt werden: @end lilypond @noindent -Und der Unterschied wird deutlich: hiermit wird das gesamte Objekt -entfernt, während man mit @code{transparent} ein Objekt -unsichtbar machen kann, es aber an seinem Platz gelassen wird. +Und der Unterschied wird deutlich: Setzen des stencil auf @code{#f} (ggf. +mittels @code{\omit}) entfernt das gesamte Objekt, während man mit +@code{transparent} (was auch mittels @code{\hide} eingestellt werden kann) +ein Objekt unsichtbar machen kann, es aber an seinem Platz gelassen wird. - -@subheading color (Farbe) +@node Die color-Eigenschaft +@unnumberedsubsubsec Die @code{color}-Eigenschaft (Farbe) +@translationof The color property @cindex color-Eigenschaft @cindex Farb-Eigenschaft -Abschließend wollen wir die Taktlinien unsichtbar machen, indem +Abschließend wollen wir die Taktstriche unsichtbar machen, indem wir sie weiß einfärben. (Es gibt hier eine Schwierigkeit: die weiße -Taktlinie übermalt manchmal die Taktlinien, wo sie sie kreuzt, +Taktstrich übermalt manchmal die Taktstriche, wo sie sie kreuzt, manchmal aber auch nicht. Sie können in den Beispielen unten sehen, dass das nicht vorhersagbar ist. Die Einzelheiten dazu, warum das passiert und wie sie es kontrollieren können, werden dargestellt @@ -1351,52 +1486,52 @@ internen Einheiten, aber damit Sie nicht wissen müssen, wie diese aussehen, gibt es mehrere Wege, Farben anzugeben. Der erste Weg ist es, @qq{normale} Farben zu benutzen, wie sie in der Tabelle in @ruser{Liste der Farben} aufgelistet sind. Beachten Sie, -dass die Bezeichnungen auf Englisch sind. Um die Taktlinien auf +dass die Bezeichnungen auf Englisch sind. Um die Taktstriche auf weiß zu setzen, können Sie schreiben: -@cindex Taktlinie, Beispiel zur Veränderung +@cindex Taktstrich, Beispiel zur Veränderung @cindex color-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #white - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent -und die Taktlinien verschwinden in der Tat. Beachten Sie, +und die Taktstriche verschwinden in der Tat. Beachten Sie, dass @emph{white} nicht mit einem Apostroph angeführt -wird -- es ist kein Symbol, sondern eine @emph{Funktion}. -Wenn sie aufgerufen wird, stellt sie eine Liste mit internen +wird -- es ist kein Symbol, sondern eine @emph{Variable}. +Wird sie ausgewertet, stellt sie eine Liste mit internen Werten zu Verfügung, mit welcher die Farbe auf weiß gestellt wird. Die anderen Farben in der Liste sind auch Funktionen. Um sich zu überzeugen, dass der Befehl auch wirklich funktioniert, können Sie die Farbe auf eine der -anderen Funktionen dieser Liste abändern. +anderen Variablen dieser Liste abändern. @cindex Farben, X11 @cindex X11-Farben + @funindex x11-color Die zweite Art die Farbe zu ändern geschieht, indem die Liste der X11-Farbbezeichnungen einzusetzen, siehe die zweite Liste -in @ruser{Liste der Farben}. Diesen Farben muss jedoch eine -andere Funktion vorangestellt werden, die die X11-Farbbezeichnungen -in interne Werte konvertiert: -@code{x11-color}. Das geschieht wie folgt: +in @ruser{Liste der Farben}. Diese Namen werden durch die Funktion +@code{x11-color} durch die tatsächlichen internen Farbwerte ersetzt. +Das geschieht wie folgt: -@cindex Taktlinie, Beispiel zur Veränderung +@cindex Taktstrich, Beispiel zur Veränderung @cindex color-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(x11-color 'white) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1405,13 +1540,15 @@ in interne Werte konvertiert: @noindent In diesem Fall hat die Funktion @code{x11-color} ein Symbol als Argument, darum muss dem Symbol ein Apostroph vorangestellt -und beide zusammen in Klammern gesetzt werden. +werden, damit es nicht als Variable interpretiert wird. Beide +zusammen müssen in Klammern gesetzt werden. @cindex RGB-Farben @cindex Farben, RGB + @funindex rgb-color -Es gibt noch eine dritte Funktion, die RGB-Werte in die +Es gibt noch eine weitere Funktion, die RGB-Werte in die internen Werte übersetzt -- die @code{rgb-color}-Funktion. Sie braucht drei Argumente, um die Stärke von Rot, Grün und Blau darzustellen. Die Werte befinden sich zwischen @@ -1419,41 +1556,41 @@ Blau darzustellen. Die Werte befinden sich zwischen Wert der Funktion lauten: @code{(rgb-color 1 0 0)}, weiß würde sein: @code{(rgb-color 1 1 1)}. -@cindex Taktlinie, Beispiel zur Veränderung +@cindex Taktstrich, Beispiel zur Veränderung @cindex color-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(rgb-color 1 1 1) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond Schließlich gibt es noch eine Grauskala, die zu den X11-Farben -gehört. Sie reicht von schwarz (@code{'grey0'}) bis +gehört. Sie reicht von schwarz (@code{'grey0}) bis weiß (@code{'grey100}), in Einerschritten. Wir wollen das illustrieren, indem alle Layout-Objekte im Beispiel -verschiede Grauschattierungen erhalten: +verschiedene Grauschattierungen erhalten: @cindex StaffSymbol, Beispiel zur Veränderung @cindex TimeSignature, Beispiel zur Veränderung @cindex Schlüssel, Beispiel zur Veränderung @cindex Notenhals, Beispiel zur Veränderung -@cindex Taktlinie, Beispiel zur Veränderung +@cindex Taktstrich, Beispiel zur Veränderung @cindex Farbeigenschaft, Beispiel @cindex x11-Farben, Beispiel -@cindex Taktlinien, Beispiel zur Veränderung +@cindex Taktstriche, Beispiel zur Veränderung @cindex Taktart, Beispiel zur Veränderung @cindex Clef, Beispiel zur Veränderung @cindex Stem, Beispiel zur Veränderung @cindex NoteHead, Beispiel zur Veränderung @cindex Notenkopf, Beispiel zur Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.StaffSymbol.color = #(x11-color 'grey30) \override Staff.TimeSignature.color = #(x11-color 'grey60) @@ -1461,7 +1598,7 @@ verschiede Grauschattierungen erhalten: \override Voice.NoteHead.color = #(x11-color 'grey85) \override Voice.Stem.color = #(x11-color 'grey85) \override Staff.BarLine.color = #(x11-color 'grey10) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1496,13 +1633,13 @@ braucht. @cindex über dem System anordnen, Beispiel @cindex @code{\with}-Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << - { f c c } + { f8 c c } \new Staff \with { alignAboveContext = #"main" } { f8 f c } @@ -1520,14 +1657,14 @@ wir setzen den Stencil von beiden auf @code{#f}: @cindex alignAboveContext-Eigenschaft, Beispiel @cindex über dem System anordnen, Beispiel @cindex @code{\with}-Beispiel -@cindex stencil-Eigenschaft, Beispiel +@funindex \omit @cindex Schlüssel, Beispiel zur Veränderung @cindex Taktart, Beispiel zur Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1535,12 +1672,12 @@ wir setzen den Stencil von beiden auf @code{#f}: alignAboveContext = #"main" } { - \override Staff.Clef.stencil = ##f - \override Staff.TimeSignature.stencil = ##f + \omit Staff.Clef + \omit Staff.TimeSignature { f8 f c } } >> - r4 + r4 | } } @end lilypond @@ -1552,9 +1689,10 @@ die Noten sich auch auf das Ossia-System beziehen. Was für einen Unterschied macht es, ob man den @code{Staff}-Kontext mit @code{\with} verändert, oder ob man die Stencils mit -@code{\override} beeinflusst? Der größte Unterschied liegt +@code{\override} oder wie in diesem Fall mit @code{\omit} beeinflusst? +Der größte Unterschied liegt darin, dass Änderungen, die mit @code{\with} eingeführt werden, -während der Erstellung des Kontextes miterzeugt werden und +während der Erstellung des Kontextes mit erzeugt werden und als @strong{Standardeinstellungen} für diesen Kontext während seiner gesamten Dauer gelten, während @code{\set}- oder @code{\override}-Befehle dynamisch in die Noten eingebettet werden -- sie führen die @@ -1593,10 +1731,10 @@ Das obige Beispiel könnte also auch so aussehen: @cindex Schlüssel, Beispiel zur Veränderung @cindex Taktart, Beispiel zur Veränderung -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1609,7 +1747,33 @@ Das obige Beispiel könnte also auch so aussehen: } { f8 f c } >> - r4 + r4 | + } +} +@end lilypond + +Es zeigt sich, dass wir hier ebenso die Kurzformen @code{\hide} +und @code{\omit} zum Setzen der @code{transparent}-Eigenschaft und +zum Entfernen des @code{stencil} verwenden können, was zu folgender +Fassung führt + +@lilypond[quote,ragged-right,verbatim] +\new Staff ="main" { + \relative { + r4 g'8 g c4 c8 d | + e4 r8 + << + { f8 c c } + \new Staff \with { + alignAboveContext = #"main" + % Don't print clefs in this staff + \omit Clef + % Don't print time signatures in this staff + \omit TimeSignature + } + { f8 f c } + >> + r4 | } } @end lilypond @@ -1628,7 +1792,7 @@ Bögen -- oder allgemein Strecker-Objekte -- werden individuell gezeichnet, es gibt dazu also keine @code{font-size}, die mit ihnen verknüpft wäre. Weitere Eigenschaften wie die Länge von Hälsen und -Taktlinien, Dicke von Balken und anderen Linien und +Taktstriche, Dicke von Balken und anderen Linien und der Abstand der Notenlinien voneinander müssen auf spezielle Weise verändert werden. @@ -1664,23 +1828,23 @@ Setzen wir das also in unserem Ossia-Beispiel ein: @cindex Schlüssel, Beispiel zur Veränderung @cindex Taktart, Beispiel zur Veränderung -@lilypond[quote,verbatim,fragment,ragged-right,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = #"main" - \override Clef.stencil = ##f - \override TimeSignature.stencil = ##f - % Reduce all font sizes by ~24% + \omit Clef + \omit TimeSignature + % Verkleinere alle Fonts um ~24% fontSize = #-2 } { f8 f c } >> - r4 + r4 | } } @end lilypond @@ -1723,7 +1887,7 @@ zu entsprechen? Das kann mit einer besonderen Funktion diesen Zweck vorhanden ist. Sie nimmt ein Argument auf, die Änderung der Schriftgröße (#-2 im obigen Beispiel) und gibt einen Skalierungsfaktor aus, der dazu dient, -Objekte proportionell zueinander zu verändern. So wird +Objekte proportional zueinander zu verändern. So wird sie benutzt: @cindex alignAboveContext-Eigenschaft, Beispiel @@ -1737,24 +1901,24 @@ sie benutzt: @cindex magstep-Funktion, Beispiel @cindex Schriftart-Eigenschaft, Beispiel -@lilypond[quote,verbatim,fragment,ragged-right,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } \new Staff \with { alignAboveContext = #"main" - \override Clef.stencil = ##f - \override TimeSignature.stencil = ##f + \omit Clef + \omit TimeSignature fontSize = #-2 - % Reduce stem length and line spacing to match + % Reduziere Halslängen und Notenlinienabstände in gleicher Weise \override StaffSymbol.staff-space = #(magstep -2) } { f8 f c } >> - r4 + r4 | } } @end lilypond @@ -1775,7 +1939,7 @@ aller anderen Objekte können auf analoge Weise geändert werden. Für kleine Größenänderungen, wie in dem obigen Beispiel, -braucht die Dicke der verschiedenen Linien, wie Taktlinien, +braucht die Dicke der verschiedenen Linien, wie Taktstriche, Notenlinien, Balken, Dynamikklammern usw. normalerweise keine spezielle Anpassung. Wenn die Dicke eines bestimmten Layout-Objektes angepasst werden muss, kann man das erreichen, @@ -1851,11 +2015,11 @@ er unter @qq{Text2} passt. @cindex Textbeschriftungsbeispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" -c2^"Text3" -c2^"Text4" +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond Notensysteme werden in den Standardeinstellungen auch so dicht @@ -1868,10 +2032,10 @@ Im nächsten Beispiel sehen Sie, wie Noten auf zwei Systemen @lilypond[quote,ragged-right,verbatim] << \new Staff { - \relative c' { c4 a, } + \relative { c'4 a, } } \new Staff { - \relative c'''' { c4 a, } + \relative { c''''4 a, } } >> @end lilypond @@ -1883,13 +2047,14 @@ Im nächsten Beispiel sehen Sie, wie Noten auf zwei Systemen Es wurde schon gezeigt, wie die Befehle @code{\voiceXXX} die Richtung von Bögen, Fingersatz und allen anderen Objekten beeinflusst, -die von der Richtung der Notenhälsen abhängen. Diese Befehle +die von der Richtung der Notenhälsen abhängen -- siehe @ref{Stimmen explizit beginnen}. +Diese Befehle sind nötig, wenn polyphone Musik geschrieben wird, damit sich die einzelnen Melodielinien klar abzeichnen. Es kann aber von Zeit zu Zeit nötig sein, dieses automatische Verhalten zu verändern. Das kann entweder für ganze Abschnitte, aber genauso auch nur für eine einzelne Note vorgenommen werden. Die Eigenschaft, die die Richtung -bestimmt, ist die @code{direction}-Eigenschaft jedes Layout-Objekts. +bestimmt, ist die @code{direction}-Eigenschaft eines jeden Layout-Objekts. Es soll erst erklärt werden, was sie bewirkt und dann eine Anzahl an fertigen Befehlen für die üblicheren Situationen präsentiert werden, mit denen Sie gleich loslegen können. @@ -1901,6 +2066,15 @@ je nach der Richtung, in die sie zeigen. Das wird automatisch berücksichtigt, wenn die @code{direction}-Eigenschaft verändert wird. +@menu +* Die direction-Eigenschaft:: +* Fingersatz:: +@end menu + +@node Die direction-Eigenschaft +@unnumberedsubsubsec The @code{direction}-Eigenschaft (Richtung) +@translationof The direction property + @funindex down @funindex up @funindex center @@ -1911,29 +2085,29 @@ wird. @cindex neutral-Eigenschaft Das folgende Beispiel zeigt im ersten Takt die Standardeinstellung -für Hälse, die bei hohen Noten nach unten zeigen und bei tiefen -noten nach oben. Im nächsten Takt werden alle Hälse nach unten -gezwungen, im dritten Takt nach oben, und im vierten wird wieder -der Standard eingestellt. +für Legatobögen, die bei hohen Noten oberhalb, bei tiefen Noten indessen +unterhalb platziert werden. Im nächsten Takt werden beide Bögen nach +unten gezwungen, im darauf folgenden Takt nach oben, um schließlich +wieder auf den Standard eingestellt zu werden. -@cindex Notenhals, Beispiel zur Veränderung +@cindex Legatobogen, Beispiel zur Veränderung @cindex Richtungseigenschaft, Beispiel -@lilypond[quote,verbatim,relative=2] -a4 g c a -\override Stem.direction = #DOWN -a4 g c a -\override Stem.direction = #UP -a4 g c a -\revert Stem.direction -a4 g c a +@lilypond[quote,fragment,verbatim] +a'4( g') c''( a') | +\override Slur.direction = #DOWN +a'4( g') c''( a') | +\override Slur.direction = #UP +a'4( g') c''( a') | +\revert Slur.direction +a'4( g') c''( a') | @end lilypond -Hier werden die Konstanten @code{DOWN} und @code{UP} +Wir haben hier die Konstanten @code{DOWN} und @code{UP} eingesetzt. Sie haben die Werte @w{@code{-1}} bzw. @code{+1}, und diese numerischen Werte können ebenso benutzt werden. Auch der Wert @code{0} kann in manchen Fällen benutzt werden. Er -bedeutet für die Hälse das gleiche wie @code{UP}, für einige +bedeutet für die Legatobögen das gleiche wie @code{UP}, für einige andere Objekte jedoch @qq{zentriert}. Es gibt hierzu die Konstante @code{CENTER}, die den Wert @code{0} hat. @@ -1984,16 +2158,25 @@ erklärt, wenn sie nicht selbstverständlich ist. @tab Befehl für Richtung von Klammern/Zahlen der N-tolen @end multitable -Diese vordefinierten Befehl können allerdings @strong{nicht} -zusammen mit @code{\once} benutzt werden. Wenn Sie die -Wirkung eines Befehl auf eine einzige Noten begrenzen wollen, -müssen Sie den entsprechenden -@code{\once \override}-Befehl benutzen oder den definierten -Befehl, gefolgt von dem entsprechenden neutralisierenden -@code{xxxNeutral}-Befehl nach der Note. +Die neutralen/normalen Varianten dieser Befehle verwenden intern +@code{\revert} und können daher @strong{nicht} mit einem +vorangestellten @code{\once} benutzt werden. Wenn Sie die +Wirkung eines der anderen Befehle (die intern @code{\override} verwenden) +auf eine einzige Noten begrenzen wollen, müssen Sie ihm ein @code{\once} +voranstellen, genauso wie Sie es auch bei einem expliziten @code{\override} +machen würden. +Falls nur ein einziges Layout Objekt nach oben oder unten gezwungen werden +soll, können auch die Richtungsindikatoren @code{^} oder @code{_} verwendet werden: -@subheading Fingersatz +@lilypond[quote,fragment,verbatim] +a'4( g') c''( a') | +a'4^( g') c''_( a') | +@end lilypond + +@node Fingersatz +@unnumberedsubsubsec Fingersatz +@translationof Fingering @cindex Fingersatz, Positionierung @cindex Fingersatz, Akkorde @@ -2015,12 +2198,14 @@ die Wirkung von @code{DOWN} (runter) und @code{UP} @cindex Fingersatz, Beispiel zur Veränderung @cindex direction-Eigenschaft, Beispiel -@lilypond[quote,verbatim,relative=2] -c4-5 a-3 f-1 c'-5 -\override Fingering.direction = #DOWN -c4-5 a-3 f-1 c'-5 -\override Fingering.direction = #UP -c4-5 a-3 f-1 c'-5 +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #DOWN + c4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #UP + c4-5 a-3 f-1 c'-5 | +} @end lilypond Eine Beeinflussung der @code{direction}-Eigenschaft ist jedoch @@ -2031,10 +2216,12 @@ zu benutzen. Hier das vorherigen Beispiel mit dieser Methode: @cindex Fingersatz-Beispiel -@lilypond[quote,verbatim,relative=2] -c4-5 a-3 f-1 c'-5 -c4_5 a_3 f_1 c'_5 -c4^5 a^3 f^1 c'^5 +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + c4_5 a_3 f_1 c'_5 | + c4^5 a^3 f^1 c'^5 | +} @end lilypond Die @code{direction}-Eigenschaft wirkt sich nicht auf @@ -2044,10 +2231,12 @@ Standardmäßig wird der Fingersatz automatisch entweder @cindex Fingersatz-Beispiel -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond @noindent @@ -2056,10 +2245,12 @@ nach oben oder unten zu zwingen: @cindex Fingersatz-Beispiel -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond Noch bessere Kontrolle über die Positionierung von Fingersatz für @@ -2099,22 +2290,24 @@ Hier ein paar Beispiele: @cindex @code{\set}, Benutzungsbeispiel @cindex fingerOrientations-Eigenschaft, Beispiel -@lilypond[quote,verbatim,relative=1] -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(up left down) -4 -4 -\set fingeringOrientations = #'(up left) -4 -4 -\set fingeringOrientations = #'(right) -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} @end lilypond @noindent @@ -2124,33 +2317,49 @@ werden. Der Standardwert kann aus dem @code{Fingering}-Objekt in der IR entnommen werden, er ist @w{@code{-5}}, versuchen wir es also mit @w{@code{-7}}. -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\override Fingering.font-size = #-7 -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(up left down) -4 -4 -\set fingeringOrientations = #'(up left) -4 -4 -\set fingeringOrientations = #'(right) -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + \override Fingering.font-size = #-7 + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} @end lilypond - - @node Objekte außerhalb des Notensystems @subsection Objekte außerhalb des Notensystems @translationof Outside-staff objects Objekte außerhalb des Notensystems werden automatisch gesetzt, -um Kollisionen zu vermeiden. Objekten mit einem geringeren +um Kollisionen zu vermeiden. Es gibt eine ganze Reihe von Möglichkeiten +die Platzierung zu beeinflussen, sollte die Automatik kein optimales +Resultat produzieren. + +@menu +* Die outside-staff-priority-Eigenschaft:: +* Der textLengthOn-Befehl:: +* Positionierung von Dynamikzeichen:: +* Verändern der Größe von grobs:: +@end menu + + +@node Die outside-staff-priority-Eigenschaft +@unnumberedsubsubsec Die @code{outside-staff-priority}-Eigenschaft +@translationof The outside-staff-priority property + +Objekten mit einem geringeren Prioritätswert der Eigenschaft @code{outside-staff-priority} werden näher an das System gesetzt, und andere Objekte außerhalb des Systems werden dann soweit vom System entfernt gesetzt, dass @@ -2221,17 +2430,19 @@ Objekten zeigt. @cindex Text-Strecker @cindex Text-Spanner + @funindex \startTextSpan @funindex \stopTextSpan @funindex startTextSpan @funindex stopTextSpan + @cindex Ottava-Klammer @cindex Oktavierungsklammer @cindex TextSpanner, Beispiel zur Veränderung @cindex bound-details-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +@lilypond[quote,fragment,ragged-right,verbatim] % Set details for later Text Spanner \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } @@ -2239,18 +2450,18 @@ Objekten zeigt. \dynamicUp % Start Ottava Bracket \ottava #1 -c'4 \startTextSpan +c''4 \startTextSpan % Add Dynamic Text and hairpin -c4\pp\< -c4 +c''4\pp\< +c''4 % Add Text Script -c4^Text -c4 c +c''4^Text | +c''4 c'' % Add Dynamic Text and terminate hairpin -c4\ff c \stopTextSpan +c''4\ff c'' \stopTextSpan | % Stop Ottava Bracket \ottava #0 -c,4 c c c +c'4 c' c' c' | @end lilypond Dieses Beispiel zeigt auch, wie man Text-Strecker erstellt, d.h. @@ -2287,7 +2498,7 @@ erstellt wird: @cindex TextSpanner, Beispiel zur Veränderung @cindex bound-details-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +@lilypond[quote,fragment,ragged-right,verbatim] % Set details for later Text Spanner \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } @@ -2297,19 +2508,19 @@ erstellt wird: \once \override Staff.OttavaBracket.outside-staff-priority = #340 % Start Ottava Bracket \ottava #1 -c'4 \startTextSpan +c''4 \startTextSpan % Add Dynamic Text -c4\pp +c''4\pp % Add Dynamic Line Spanner -c4\< +c''4\< % Add Text Script -c4^Text -c4 c +c''4^Text | +c''4 c'' % Add Dynamic Text -c4\ff c \stopTextSpan +c''4\ff c'' \stopTextSpan | % Stop Ottava Bracket \ottava #0 -c,4 c c c +c'4 c' c' c' | @end lilypond Beachten Sie, dass einige dieser Objekte, insbesondere Taktzahlen, @@ -2333,18 +2544,20 @@ numerischen Wert gesetzt werden, sodass er mit anderen Außersystem-Objekten anhand dieses Wertes gesetzt wird. Hier ein Beispiel, das die beiden Möglichkeiten veranschaulicht: -@lilypond[quote,verbatim,relative=2] -c4( c^\markup { \tiny \sharp } d4.) c8 -c4( -\once \override TextScript.avoid-slur = #'inside -\once \override TextScript.outside-staff-priority = ##f -c4^\markup { \tiny \sharp } d4.) c8 -\once \override Slur.outside-staff-priority = #500 -c4( c^\markup { \tiny \sharp } d4.) c8 +@lilypond[quote,verbatim] +\relative c'' { + c4( c^\markup { \tiny \sharp } d4.) c8 | + c4( + \once \override TextScript.avoid-slur = #'inside + \once \override TextScript.outside-staff-priority = ##f + c4^\markup { \tiny \sharp } d4.) c8 | + \once \override Slur.outside-staff-priority = #500 + c4( c^\markup { \tiny \sharp } d4.) c8 | +} @end lilypond Eine Änderung der @code{outside-staff-priority} kann auch dazu -benutzt werden, die vertikale Plazierung von individuellen Objekten +benutzt werden, die vertikale Platzierung von individuellen Objekten zu kontrollieren, auch wenn das Ergebnis nicht immer optimal ist. Im nächsten Beispiel soll @qq{Text3} oberhalb von @qq{Text4} gesetzt werden, das Beispiel wurde behandelt in @@ -2356,29 +2569,30 @@ Tabelle oben festgestellt werden und dann die Priorität für @cindex TextScript, Beispiel zur Veränderung @cindex outside-staff-priority-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" | +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | \once \override TextScript.outside-staff-priority = #500 -c2^"Text3" -c2^"Text4" | +c''2^"Text3" +c''2^"Text4" | @end lilypond Damit wird zwar @qq{Text3} ganz richtig über @qq{Text4} platziert, aber auch über @qq{Text2}, und @qq{Text4} wird jetzt weiter unten gesetzt. Eigentlich sollten ja alle -diese Anmerkungen gleichweit vom System entfernt sein. +diese Anmerkungen gleich weit vom System entfernt sein. Dazu muss offensichtlich horizontal etwas Platz gemacht werden. Das kann erreicht werden mit dem @code{textLengthOn}-(Textlänge an)-Befehl. -@subheading \textLengthOn (Textlänge berücksichtigen) +@node Der textLengthOn-Befehl +@unnumberedsubsubsec Der @code{@bs{}textLengthOn}-Befehl (Textlänge berücksichtigen) +@translationof The textLengthOn command @cindex Noten, durch Text gespreizt + @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff Standardmäßig wird Text, der mit dem Beschriftungsbefehl @code{\markup} bzw. Äquivalenten erstellt wird, kein @@ -2387,19 +2601,21 @@ zugestanden. Der @code{\textLengthOn}-Befehl ändert dieses Verhalten, so dass die Noten gespreizt werden, wenn die Breite des Textes es erfordert: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,fragment,ragged-right,verbatim] \textLengthOn % Cause notes to space out to accommodate text -c2^"Text1" -c2^"Text2" | -c2^"Text3" -c2^"Text4" | +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond Dieses Verhalten wird mit dem @code{\textLengthOff}-Befehl -rückgängig gemacht. Erinnern Sie sich, dass @code{\once} nur mit -@code{\override}, @code{\set}, @code{\revert} oder @code{unset} -funktioniert, der Befehl kann also nicht zusammen mit -@code{\textLengthOn} benutzt werden. +rückgängig gemacht. Alternativ kann auch @code{\once} zusammen mit +@code{\textLengthOn} benutzt werden, um die Auswirkung auf einen +einzigen musikalisches Zeitpunkt zu begrenzen. Das entsprechende +Verhalten bzgl. des horizontalen Platzes für Übungzeichen und +Tempomarkierungen kann hiervon unabhängig durch die Befehle +@code{\markLengthOn} und @code{\markLengthOff} analog gesteuert werden. @cindex Textbeschriftung, Vermeidung von Zusammenstößen @cindex Zusammenstöße vermeiden mit Textbeschriftung @@ -2413,49 +2629,54 @@ eine Textbeschriftung mit diesen Noten reagiert: @cindex Textbeschriftung, Beispiel zur Veränderung @cindex outside-staff-priority-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -% This markup is short enough to fit without collision -c2^"Tex" c'' | -R1 | - -% This is too long to fit, so it is displaced upwards -c,,2^"Text" c'' | -R1 | - -% Turn off collision avoidance -\once \override TextScript.outside-staff-priority = ##f -c,,2^"Long Text " c'' | -R1 | - -% Turn off collision avoidance -\once \override TextScript.outside-staff-priority = ##f -\textLengthOn % and turn on textLengthOn -c,,2^"Long Text " % Spaces at end are honored -c''2 | +@lilypond[quote,ragged-right,verbatim] +\relative { + % This markup is short enough to fit without collision + c''2^"Tex" c'' | + R1 | + + % This is too long to fit, so it is displaced upwards + c,,2^"Text" c'' | + R1 | + + % Turn off collision avoidance + \once \override TextScript.outside-staff-priority = ##f + c,,2^"Long Text " c'' | + R1 | + + % Turn off collision avoidance + \once \override TextScript.outside-staff-priority = ##f + \textLengthOn % and turn on textLengthOn + c,,2^"Long Text " % Spaces at end are honored + c''2 | +} @end lilypond - -@subheading Dynamik +@node Positionierung von Dynamikzeichen +@unnumberedsubsubsec Positionierung von Dynamikzeichen +@translationof Dynamics placement @cindex Verändern der Positionierung von Dynamikzeichen @cindex Dynamikzeichen: Positionierung verändern Dynamikbezeichnung wird üblicherweise unter dem System gesetzt, kann aber auch nach oben mit dem Befehl -@code{dynamicUp} gezwungen werden. Die Bezeichnung +@code{\dynamicUp} gezwungen werden. Die Bezeichnung wird vertikal relativ zu der Note positioniert, an die sie angefügt wurde. Sie wird vertikal variabel gesetzt in Bezug zu Innersystemobjekten wie Bögen oder Taktnummern. Damit können oft recht gute Resultate erreicht werden, wie im folgenden Beispiel: -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\clef "bass" -\key aes \major -\time 9/8 -\dynamicUp -bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! -ees,2.~\)\mf ees4 r8 +@lilypond[quote,ragged-right,verbatim] +\relative { + \clef "bass" + \key aes \major + \time 9/8 + \dynamicUp + bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | + ees,2.~\)\mf ees4 r8 | +} @end lilypond Wenn aber Noten und Dynamikzeichen sehr dicht beieinander @@ -2464,9 +2685,9 @@ später kommende Dynamikzeichen weiter weg, was allerdings nicht immer die beste Möglichkeit ist, wie in dem folgenden, etwas gewollten Beispiel zu sehen ist: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim,fragment] \dynamicUp -a4\f b\mf c\mp b\p | +\relative { a'4\f b\mf a\mp b\p } @end lilypond @noindent @@ -2479,8 +2700,9 @@ aber es gibt keinen entsprechenden Befehl für Dynamik. Wir müssen also unsere eigenen Befehle mit @code{\override} konstruieren. - -@subheading Verändern der Größe von grobs +@node Verändern der Größe von grobs +@unnumberedsubsubsec Verändern der Größe von grobs +@translationof Grob sizing @cindex Grob, Größenveränderung @cindex Größenveränderung von grobs @@ -2504,17 +2726,17 @@ gehören zu allen Grobs, die das Standardmäßig haben Außersystemobjekte eine Länge von Null, so dass sie sich in horizontaler Richtung überlappen können. Das geschieht, indem dem linken Rand Unendlich zugewiesen wird -und dem rechten Rand minus Unendlich (der Code der +und dem rechten Rand minus Unendlich, d.h. die @code{extra-spacing-width}-(zusätzliche Positionierungslänge)-Eigenschaft -lautet: @code{'(+inf.0 . -inf.0)}). +wird auf den Wert @code{'(+inf.0 . -inf.0)} gesetzt. Damit sich diese Objekte also horizontal nicht überschneiden, muss -der Wert von @code{extra-spacing-width} auf -@code{'(0 . 0)} gesetzt werden, sodass die wirkliche Länge eines -Objektes zur Geltung kommt. Mit diesem Befehl wird das für -Dynamik-Zeichen erledigt: +der Wert von @code{extra-spacing-width} überschrieben werden um den +Objekten ein wenig zusätzlich Platz zuzuweisen. Die Einheit ist der +Abstand zwischen zwei Notenlinien, also sollte es reichen die linke +und rechte Kante je eine halbe Einheit nach links bzw. rechts zu verschieben: @example -\override DynamicText.extra-spacing-width = #'(0 . 0) +\override DynamicText.extra-spacing-width = #'(-0.5 . 0.5) @end example @noindent @@ -2523,31 +2745,12 @@ Schauen wir uns an, wie es mit dem vorigen Beispiel funktioniert: @cindex DynamicText, Beispiel zur Veränderung @cindex extra-spacing-width-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -\dynamicUp -\override DynamicText.extra-spacing-width = #'(0 . 0) -a4\f b\mf c\mp b\p -@end lilypond - -@noindent -Damit werden die Dynamik-Zeichen also wirklich nebeneinander -gesetzt, aber es gibt noch zwei Probleme. Die Zeichen sollten -etwas weiter außeinander stehen und es wäre gut, wenn sie alle -den gleichen Abstand zum System hätte. Das erste Problem ist -einfach behoben. Anstatt der @code{extra-spacing-width}-Eigenschaft -Null zuzuweisen, können wir auch einen etwas größeren Wert -wählen. Die Einheit wird gemessen in dem Abstand zwischen zwei -Notenlinien, es scheint also gut, den rechten und linken -Rand eine halbe Einheit zu vergrößern: - -@cindex DynamicText, Beispiel zur Veränderung -@cindex extra-spacing-width-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim,fragment] \dynamicUp % Extend width by 1 staff space \override DynamicText.extra-spacing-width = #'(-0.5 . 0.5) -a4\f b\mf c\mp b\p +\relative { a'4\f b\mf a\mp b\p } @end lilypond @noindent @@ -2558,6 +2761,205 @@ höher und tiefer zu sitzen. Das kann mit der die wir uns im folgenden Abschnitt genauer anschauen werden. +@node Vertikale Abstände +@section Vertikale Abstände +@translationof Vertical spacing + +In aller Regel ist die vertikale Platzierung von Objekten durch LilyPond +ziemlich gut. Schauen wir uns das an einem einfachen Lied mit zwei Stimmen +und Klavierbegleitung etwas näher an: + +@lilypond[quote,fragment,ragged-right] +<< + \new ChoirStaff + << + \new Staff { + \new Voice = "music" { + b'2 c' c' c' + } + } + \new Lyrics + \lyricsto "music" { + Here are some lyrics + } + \new Staff { + \clef bass e'2 f e c + } + >> + \new PianoStaff + << + \new Staff { + g''2 c'' c'' a'' + } + \new Staff { + \clef bass e2 f c e + } + >> +>> +@end lilypond + +An der vertikalen Platzierung ist nichts auszusetzen. Nehmen wir aber einmal +an, wir arbeiten mit einem Verleger zusammen, der spezielle Wünsche bzgl. +des Abstands von Systemen und Text hat: Der Text soll weit weg von allen +Noten und die Klavierbegleitung soll weit weg von den Gesangslinien. +Schließlich soll das Klaviersystem noch etwas enger zusammen geschoben +werden. Fangen wir mit dem Liedtext an. + +Gesangstext wird innerhalb eines Systems platziert. Daher finden sich die +Befehle zu seiner Platzierung in +@ruser{Flexible vertikale Abstände in Systemgruppen}. Dort erfahren wir, +das Gesangstext vom Typ @code{non-staff lines} ist und wir daher die +Eigenschaft @code{nonstaff} anpassen müssen. Den Text weiter weg vom +darüber liegenden System zu schieben verwendet die +@code{relatedstaff}-Eigenschaft. Für den Abstand nach unten greifen +wir auf die @code{unrelatedstaff}-Eigenschaft zurück. Gesangsstimmen +gehören zu einer @code{VerticalAxisGroup}, also setzen wir deren +Eigenschaften. Mal sehen, wie das klappt. + +@lilypond[quote,fragment,ragged-right,verbatim] +<< + \new ChoirStaff + << + \new Staff { + \new Voice = "music" { + b'2 c' c' c' + } + } + \new Lyrics \with { + \override VerticalAxisGroup. + nonstaff-relatedstaff-spacing.padding = #5 + \override VerticalAxisGroup. + nonstaff-unrelatedstaff-spacing.padding = #5 + } + \lyricsto "music" { + Here are some lyrics + } + \new Staff { + \clef bass e'2 f e c + } + >> + \new PianoStaff + << + \new Staff { + g''2 c'' c'' a'' + } + \new Staff { + \clef bass e2 f c e + } + >> +>> +@end lilypond + +Nun ja, es klappt. Aber vielleicht war das doch des Guten zu viel. +Wenn wir @code{padding} auf 5 setzen, dann fügt LilyPond 5 System Abstände +zum Abstand zwischen den Objekten hinzu, was im vorliegenden Fall +eindeutig zu viel ist. Wir werden 2 verwenden. + +Als nächstes verschieben wir die Klavierbegleitung weiter weg von den +Gesangsstimmen. Die Gesangsstimmen sind ein @code{ChoirStaff}, also werden +wir den Abstand zwischen diesem und dem darunter liegenden Klaviersystem +vergrößern. Das geschieht indem wir die @code{basic-distance} des +@code{StaffGrouper}'s @code{staffgroup-staff-spacing} anpassen. + +@lilypond[quote,fragment,ragged-right,verbatim] +<< + \new ChoirStaff \with { + \override StaffGrouper. + staffgroup-staff-spacing.basic-distance = #15 + } + << + \new Staff { + \new Voice = "music" { + b'2 c' c' c' + } + } + \new Lyrics \with { + \override VerticalAxisGroup. + nonstaff-relatedstaff-spacing.padding = #2 + \override VerticalAxisGroup. + nonstaff-unrelatedstaff-spacing.padding = #2 + } + \lyricsto "music" { + Here are some lyrics + } + \new Staff { + \clef bass e'2 f e c + } + >> + \new PianoStaff + << + \new Staff { + g''2 c'' c'' a'' + } + \new Staff { + \clef bass e2 f c e + } + >> +>> +@end lilypond + +Wunderbar. Jetzt kümmern wir uns noch um die letzte Anforderung, die +Klaviersysteme enger zusammen zu schieben. Auch hierfür passen wir +wieder die Eigenschaften des @code{StaffGrouper} an, aber dieses Mal +werden wir sowohl die @code{basic-distance} als auch das @code{padding} +reduzieren. Wie genau sehen Sie unten. + +@lilypond[quote,fragment,ragged-right,verbatim] +<< + \new ChoirStaff \with { + \override StaffGrouper. + staffgroup-staff-spacing.basic-distance = #15 + } + << + \new Staff { + \new Voice = "music" { + b'2 c' c' c' + } + } + \new Lyrics \with { + \override VerticalAxisGroup. + nonstaff-relatedstaff-spacing.padding = #2 + \override VerticalAxisGroup. + nonstaff-unrelatedstaff-spacing.padding = #2 + } + \lyricsto "music" { + Here are some lyrics + } + \new Staff { + \clef bass e'2 f e c + } + >> + \new PianoStaff \with { + \override StaffGrouper.staff-staff-spacing = #'( + (basic-distance . 0) + (padding . 0)) + } + << + \new Staff { + g''2 c'' c'' a'' + } + \new Staff { + \clef bass e2 f c e + } + >> +>> +@end lilypond + +Damit sind die echt eng beieinander -- aber das ist es, was der +Verleger wollte. Wir könnten sie bei Bedarf wieder ein wenig auseinander +schieben, indem wir @code{padding} oder @code{basic-distance} +ändern. + +Es gibt viele Arten die vertikalen Abstände zu verändern. Im Grunde +brauchen wir uns lediglich zu merken, dass der Abstand zwischen Objekten +in einer @code{StaffGroup} (wie @code{GrandStaff} oder @code{PianoStaff} +Gruppen) durch die Platzierungsvariablen des @code{StaffGrouper} +kontrolliert wird. Wohingegen die Abstände von nicht gruppierten +Systemen (wie @code{Lyrics} und @code{Staff}) von den Variablen der +@code{VerticalAxisGroup} kontrolliert werden. Siehe +@ruser{Flexible vertical spacing paper variables} und +@ruser{Flexible vertikale Abstände in Systemgruppen} für weitere +Details. @node Kollision von Objekten @section Kollision von Objekten @@ -2566,7 +2968,7 @@ die wir uns im folgenden Abschnitt genauer anschauen werden. @menu * Verschieben von Objekten:: * Überlappende Notation in Ordnung bringen:: -* Beispiele aus dem Leben:: +* Beispiel aus dem Leben:: @end menu @node Verschieben von Objekten @@ -2576,7 +2978,7 @@ die wir uns im folgenden Abschnitt genauer anschauen werden. @cindex Verschieben von überschneidenden Objekten @cindex Verschieben von Zusammenstößen @cindex Zusammenstöße vermeiden -@cindex Objekte, verschieben von Zusammestößen +@cindex Objekte, verschieben von Zusammenstößen @cindex Vermeiden von Zusammenstößen Es wird vielleicht eine Überraschung sein, aber LilyPond ist nicht @@ -2595,7 +2997,8 @@ anwenden: Die @strong{Richtung} eines der überlappenden Objekte kann geändert werden, indem die vordefinierten Befehle für Innersystemobjekte verwendet werden, wie beschrieben in -@ref{within-staff (Objekte innerhalb des Notensystems)}. Hälse, Bögen, Balken, Dynamik-Zeichen +@ref{within-staff (Objekte innerhalb des Notensystems)}. +Hälse, Bögen, Balken, Dynamik-Zeichen und Triolen können auf diese Weise einfach umgeordnet werden. Beschränkt ist diese Methode insofern, als es nur zwei Möglichkeiten zur Veränderung gibt: oben oder unten. @@ -2737,27 +3140,55 @@ wie Ganztaktpausen, Bögen und Noten in verschiedenen Stimmen zu lösen. @item -@code{force-hshift} (vertikale Verschiebung erzwingen) +@code{horizontal-shift} (horizontale Verschiebung) + +@cindex horizontal-shift-Eigenschaft +@cindex Notenkolumne +@cindex Notenkollisionen +@cindex Kollision, Noten +@cindex shift Befehl +@funindex \shiftOff +@funindex \shiftOn +@funindex \shiftOnn +@funindex \shiftOnnn + +Innerhalb einer Stimme werden alle Noten, die zeitgleich stattfinden, +zu einer Gruppe zusammen gefasst, einem sog. @code{NoteColumn} Objekt. +Dieses Objekt dient dem Zweck, diese Gruppe von Noten horizontal zu +positionieren (siehe auch @qq{Notenkolumnen} in @ref{Stimmen explizit beginnen}). +@emph{Genau dann, wenn} zwei oder mehr Notenkolumnen innerhalb eines +Systemkontexts, die beide jeweils die Hälse in die gleiche Richtung haben +und auch zur gleichen Zeit stattfinden, werden die Werte ihrer +@code{horizontal-shift}-Eigenschaften nach Größe sortiert und die Objekte +dann mit einer Ordnungsnummer versehen. Je größer diese Ordnungsnummer, +desto stärker wird ein Objekt verschoben um eine Kollision der Notenköpfe +zu vermeiden. Diese Eigenschaft wird mit den @code{\voiceXXX}-Befehlen +gesetzt und kann direkt durch einen @code{\override}-Befehl, oder was für +gewöhnlich häufiger vorkommt, durch einen @code{\shiftOn}-Befehl gesetzt +werden. Bedenken sie bitte, diese Eigenschaft dient lediglich dazu, den +Notenkolumnen eine @emph{Ordnungsnummer} zuzuweisen - sie bestimmt in +keinster Weise die Größe der jeweiligen Verschiebung. Die steigt mit +zunehmender Ordnungsnummer in festen Schritten. Die Schrittweite ist +für gewöhnlich eine halbe Notenkopfbreite. Bei sehr eng platzierten Notengruppen +kann sie aber auch mal eine ganze Notenkopfbreite betragen. -@cindex force-hshift-Eigenschaft +@item +@code{force-hshift} (horizontale Verschiebung erzwingen) -Eng beieinander stehende Noten in einem Akkord oder Noten, die zum -gleichen Zeitpunkt in unterschiedlichen Stimmen stehen, werden -in zwei oder manchmal auch mehr Kolumnen gesetzt, um Kollisionen -zu umgehen. Diese Kolumnen werden Notenkolumnen genannt; -ein @code{NoteColumn}-Objekt wird erstellt um die Noten in den -Kolumnen zu setzen. +@cindex force-hshift-Eigenschaft Die @code{force-hshift}-(erzwinge horizontale Verschiebung)-Eigenschaft ist eine Eigenschaft von @code{NoteColumn} (bzw. vom @code{note-column-interface}). Eine Veränderung dieser Eigenschaft -macht es möglich, eine Notenkolumne zu verschieben, dabei gilt als -Einheit die Breite einer Kolumne, also die Breite des Notenkopfes der -ersten Stimme. Diese Eigenschaft kann in Situationen benutzt werden, -in denen die normalen @code{\shiftOn}-Befehle (siehe auch -@ref{Stimmen explizit beginnen}) das Problem nicht beseitigen. -Diese Eigenschaft ist besser in solchen Fällen zu verwenden als die -@code{extra-offset}-Eigenschaft, weil man die richtige Entfernung nicht +macht es möglich, eine Notenkolumne zu verschieben, wenn sie mit anderen +überlappt. Diese Eigenschaft hat keinerlei Auswirkungen, wenn keine +Überlappung vorliegt. Veränderungen werden in einer Einheit angegeben, +die zu der Notenkolumne passt, d.h. der Breite des Notenkopfes der Note +der ersten Stimme. Diese Eigenschaft sollte in denjenigen komplexen +Fällen verwendet werden, die sich nicht mit dem normalen @code{\shiftOn}-Befehle +(siehe auch @ref{Stimmen explizit beginnen}) lösen lassen. +Sie ist auf jeden Fall der Verwendung der @code{extra-offset}-Eigenschaft +vorzuziehen, weil man die richtige Entfernung nicht in Notenlinienabständen ausrechnen muss. Wenn eine Note in eine Notenkolumne oder aus ihr heraus geschoben wird, werden auch andere Funktionen beeinflusst, wie etwa die Verschmelzung von Notenköpfen. @@ -2846,22 +3277,35 @@ vorigen Abschnitt vorgestellt wurden, bei der Problemlösung mit sich überschneidenden Notationselementen eingesetzt werden können. -@subheading padding (Fülleigenschafte) +@menu +* Die padding-Eigenschaft:: +* Die right-padding-Eigenschaft:: +* Die staff-padding-Eigenschaft:: +* Die self-alignment-X-Eigenschaft:: +* Die staff-position-Eigenschaft:: +* Die extra-offset-Eigenschaft:: +* Die positions-Eigenschaft:: +* Die force-hshift-Eigenschaft:: +@end menu + +@node Die padding-Eigenschaft +@unnumberedsubsubsec Die @code{padding}-Eigenschaft (auffüllen) +@translationof The padding property @cindex padding (Verschiebungs-Eigenschaft) @cindex Überschneidende Notation korrigieren @cindex Korrigieren von überschneidender Notation Die @code{padding}-(Verschiebungs-)Eigenschaft kann benutzt -werden, um den Abstand zwischen Symbolen zu vergößern (oder +werden, um den Abstand zwischen Symbolen zu vergrößern (oder zu verkleinern), die über oder unter den Noten gesetzt werden. @cindex Script, Beispiel zur Veränderung @cindex Verschiebungs-Eigenschaft, Beispiel @cindex padding (Verschiebuns-Eigenschaft), Beispiel -@lilypond[quote,fragment,relative=1,verbatim] -c2\fermata +@lilypond[quote,fragment,verbatim] +c'2\fermata \override Script.padding = #3 b2\fermata @end lilypond @@ -2870,15 +3314,15 @@ b2\fermata @cindex Verschiebungs-Eigenschaft, Beispiel @cindex padding (Verschiebuns-Eigenschaft), Beispiel -@lilypond[quote,fragment,relative=1,verbatim] +@lilypond[quote,fragment,verbatim] % This will not work, see below \override MetronomeMark.padding = #3 \tempo 4 = 120 -c1 | +c'1 | % This works \override Score.MetronomeMark.padding = #3 \tempo 4 = 80 -d1 | +d'1 | @end lilypond Im zweiten Beispiel können Sie sehen, wie wichtig es ist den richtigen @@ -2893,10 +3337,13 @@ Außersystempriorität (@code{outside-staff-priority}) positioniert werden, werden das Objekt und alle, die sich außerhalb davon befinden, entsprechend verschoben. -@subheading right-padding (Verschieben nach links) -@cindex Verschiebung nach rechts -@cindex right-padding-Eigenschaft (Verschiebung nach rechts) +@node Die right-padding-Eigenschaft +@unnumberedsubsubsec Die @code{right-padding}-Eigenschaft (rechts auffüllen) +@translationof The right-padding property + +@cindex Verschiebung nach links +@cindex right-padding-Eigenschaft (Verschiebung nach links) Die @code{right-padding}-Eigenschaft wirkt sich auf den Abstand zwischen einem Versetzungszeichen und der Note, auf das sie sich @@ -2918,8 +3365,8 @@ wie im folgenden Beispiel: @lilypond[quote,ragged-right,verbatim] sesquisharp = \markup { \sesquisharp } - \relative c'' { - c4 + \relative { + c''4 % This prints a sesquisharp but the spacing is too small \once \override Accidental.stencil = #ly:text-interface::print \once \override Accidental.text = #sesquisharp @@ -2943,17 +3390,19 @@ definiert. Dieser Glyph wird dann weiter vom Notenkopf entfernt durch die Veränderung von @code{right-padding} mit einem @code{\override}-Befehl. -@subheading staff-padding (Systemfüllungseigenschaft) +@node Die staff-padding-Eigenschaft +@unnumberedsubsubsec The @code{staff-padding}-Eigenschaft (Systemfüllungseigenschaft) +@translationof The staff-padding property @cindex staff-padding-Eigenschaft @cindex Objekte an der Grundlinie ausrichten @cindex Ausrichten von Objekten an der Grundlinie -@code{staff-padding} (Verschiebung zum Notensystem) kann +@code{staff-padding} kann verwendet werden um Objekte wie Dynamikzeichen an einer -Grundlinie auf einer bestimmten Höhe über dem System -auszurichten, sodass sie nicht von der Position der Note abhängen, -an die sie angehängt sind. Diese Verschiebung ist keine Eigenschaft +Grundlinie mit einem festen (Mindest-) Abstand zum System auszurichten, +wenn keine anderen Notationsobjekte einen noch weiteren Abstand erfordern. +Diese Verschiebung ist keine Eigenschaft von @code{DynamicText}, sondern von @code{DynamicLineSpanner}. Das liegt daran, dass die Grundlinie sich gleicherweise auf @strong{alle} Dynamikzeichen beziehen soll, also auch auf die, @@ -2965,60 +3414,59 @@ aus dem Beispiel des vorigen Abschnitts auszurichten: @cindex DynamicLineSpanner, Beispiel zur Veränderung @cindex staff-padding-Eigenschaft, Beispiel -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -\dynamicUp -% Extend width by 1 unit -\override DynamicText.extra-spacing-width = #'(-0.5 . 0.5) -% Align dynamics to a base line 2 units above staff -\override DynamicLineSpanner.staff-padding = #2 -a4\f b\mf c\mp b\p +@lilypond[quote,fragment,ragged-right,verbatim] +\override DynamicLineSpanner.staff-padding = #3 +\relative { a'4\f b\mf a\p b\mp } @end lilypond -@subheading self-alignment-X (Selbstausrichtung-X-Eigenschaft) - -@cindex self-alignment-X-Eigenschaft +@node Die self-alignment-X-Eigenschaft +@unnumberedsubsubsec Die @code{self-alignment-X}-Eigenschaft (Selbstausrichtung-X-Eigenschaft) +@translationof The self-alignment-X property -Das nächste Beispiel zeigt, wie man den Zusammenstoß -einer Fingersatzbezeichnung mit einem Notenhals -verhindern kann, indem die rechte Ecke an dem -Referenzpunkt der abhängigen Note angeordnet wird: +Das nächste Beispiel zeigt, wie man die Position einer +Fingersatzbezeichnung relativ zu einem Notenhals justieren kann, +indem dessen rechte Kante an dem Referenzpunkt der zugehörigen Note +ausgerichtet wird: @cindex StringNumber, Beispiel zur Veränderung +@cindex self-alignment-X-Eigenschaft +@cindex Selbstausrichtung-X-Eigenschaft -@lilypond[quote,fragment,ragged-right,verbatim,relative=3] +@lilypond[quote,fragment,ragged-right,verbatim] \voiceOne -< a\2 > + \once \override StringNumber.self-alignment-X = #RIGHT -< a\2 > + @end lilypond - -@subheading staff-position (Position innerhalb des Systems) +@node Die staff-position-Eigenschaft +@unnumberedsubsubsec Die @code{staff-position}-Eigenschaft (Position innerhalb des Systems) +@translationof The staff-position property @cindex staff-position-Eigenschaft @cindex Notensystem-Position-Eigenschaft @cindex Kollision von Objekten im System @cindex Zusammenstöße von Objekten im System -Vieltaktpausen in einer Stimmen können mit Noten in anderen +Mehrtaktpausen in einer Stimmen können mit Noten in anderen Stimmen kollidieren. Da diese Pausen zentriert zwischen den -Taktlinien gesetzt werden, würde es für LilyPond eine recht große +Taktstriche gesetzt werden, würde es für LilyPond eine recht große Anstrengung bedeuten herauszufinden, welche Noten mit ihnen zusammenstoßen könnten, denn alle Kollisionsvermeidung für Noten und Pausen funktioniert nur für Noten bzw. Pausen, die zur selben Zeit auftreten. Hier ein typisches Beispiel für eine Kollision dieser Art: -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] -<< { c4 c c c } \\ { R1 } >> +@lilypond[quote,verbatim,ragged-right] +<< \relative { c'4 c c c } \\ { R1 } >> @end lilypond -Die beste Lösung ist es, die Ganztaktpause nach unten zu +Die beste Lösung ist es hier, die Ganztaktpause nach unten zu schieben, denn die Pause ist in der zweiten Stimme. Per Standardeinstellung für die zweite Stimme (@code{\voiceTwo}, also die zweite Stimme in der -@code{<<@{...@} \\ @{...@}>>}-Konstruktion) wird die +@code{<<@{@dots{}@} \\ @{@dots{}@}>>}-Konstruktion) wird die Position auf dem System (@code{staff-position}) auf -4 für @code{MultiMeasureRest}, in unserem Beispiel muss es also bspw. auf die Position @w{@code{-8}} gesetzt werden, @@ -3028,9 +3476,9 @@ d.h. vier halbe Notenlinienabstände weiter nach unten: @cindex Ganztaktpausen, Beispiel zur Veränderung @cindex staff-position-Eigenschaft, Beispiel -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] +@lilypond[quote,verbatim,ragged-right] << - { c4 c c c } + \relative { c'4 c c c } \\ \override MultiMeasureRest.staff-position = #-8 { R1 } @@ -3040,8 +3488,9 @@ d.h. vier halbe Notenlinienabstände weiter nach unten: Das ist besser, als etwa @code{extra-offset} zu benutzen, denn in unserem Fall wird die Hilfslinie der Pause automatisch gesetzt. - -@subheading extra-offset (Genaues Positionieren) +@node Die extra-offset-Eigenschaft +@unnumberedsubsubsec Die @code{extra-offset}-Eigenschaft (Genaues Positionieren) +@translationof The extra-offset property @cindex extra-offset-Eigenschaft @cindex Zusätzlicher Abstand, Positionierung @@ -3058,15 +3507,16 @@ links und 1,8 Notenlinienabstände nach unten verschoben: @cindex Fingersatz, Beispiel zur Veränderung @cindex extra-offset-Eigenschaft, Beispiel -@lilypond[quote,fragment,relative=1,verbatim] -\stemUp -f4-5 +@lilypond[quote,fragment,verbatim] +f'4-5 \once \override Fingering.extra-offset = #'(-0.3 . -1.8) -f4-5 +f'4-5 @end lilypond -@subheading Ausrichtungseigenschaft +@node Die positions-Eigenschaft +@unnumberedsubsubsec Die @code{positions}-Eigenschaft (Ausrichtungseigenschaft) +@translationof The positions property @cindex positions-Eigenschaft @cindex Kontrolle über Triolen, Bögen und Balken manuell @@ -3075,58 +3525,67 @@ f4-5 @cindex Bögen, manuelle Kontrolle @cindex Legatobögen, manuelle Kontrolle @cindex Phrasierungsbögen, manuelle Kontrolle -@cindex Triollen-Klammer, manuelle Kontrolle +@cindex Triolen-Klammer, manuelle Kontrolle -Die @code{positions}-Eigenschaft erlaubt die Kontrolle von Position und -Steigung von Balken, Legato- und Phrasierungsbögen sowie Triolenklammern. -Hier ein Beispiel, in der ein unschöner Phrasierungsbogen auftritt, weil -er den Bogen des Vorschlags vermeidet: +Die @code{positions}-Eigenschaft ermöglicht es, die vertikale Position +und damit implizit die Neigung von N-tolen, Legato- und Phrasierungsbögen +sowie Balken manuell zu steuern. -@lilypond[quote,verbatim,fragment,ragged-right,relative=1] -r4 \acciaccatura e8\( d8 c~ c d c d\) -@end lilypond +Im folgenden Beispiel überlappen der Legato- und er Phrasierungsbogen: -@noindent -Man könnte einfach den Phrasierungsbogen oberhalb der Noten setzen, und -das wäre auch die beste Lösung: +@lilypond[quote,verbatim,ragged-right] +\relative { a'8 \( ( a'16 ) a \) } +@end lilypond @cindex Phrasierungsbogen, Beispiel zur Veränderung @cindex positions-Eigenschaft, Beispiel @cindex Positionierung, Beispiel -@lilypond[quote,verbatim,fragment,ragged-right,relative=1] -r4 -\phrasingSlurUp -\acciaccatura e8\( d8 c~ c d c d\) -@end lilypond - @noindent -aber wenn es einen Grund geben sollte, warum das nicht geht, könnte -man das linke Ende des Phrasierungsbogens etwas nach unten verschieben, -indem man die @code{positions}-Eigenschaft einsetzt. Damit -verschwindet auch die etwas unschöne Form: - -@lilypond[quote,verbatim,fragment,ragged-right,relative=1] -r4 -\once \override PhrasingSlur.positions = #'(-4 . -3) -\acciaccatura e8\( d8 c~ c d c d\) +Ein Möglichkeit wäre es, die beiden Endpunkte des Phrasierungsbogen +weiter nach oben zu verschieben. Wir probieren einmal das linke +Ende 2.5 Staff-Einheiten über die Mittellinie und das rechte Ende +4.5 Einheiten darüber zu fixieren und überlassen es LilyPond, einen +zu diesen Endpunkten passenden Phrasierungsbogen auszuwählen: + +@lilypond[quote,verbatim,fragment,ragged-right] +\once \override PhrasingSlur.positions = #'(2.5 . 4.5) +a'8 \( ( a''16 ) a'' \) @end lilypond +Auf jeden Fall eine Verbesserung, aber warum das rechte Ende des +Legatobogens nicht ein wenig nach unten verschieben? Wenn Sie es +versuchen werden sie feststellen, es ist auf diesem Wege nicht +möglich, und das liegt daran, dass LilyPond von sich aus keinen +Bogen erzeugt, der niedriger läge, als der, den es bereits auswählt. +In solch einem Fall hat eine Änderung der @code{positions}-Eigenschaft +keinerlei Auswirkung. Allerdings @emph{können} Binde-, Legato- und +Phrasierungsbögen bei Bedarf sehr exakt positioniert und auch geformt +werden. Unter @ruser{Bögen verändern} können sie lernen, wie. + Hier noch ein weiteres Beispiel. Wie zu sehen ist, stößt der Balken mit den oberen Bögen zusammen: -@lilypond[quote,verbatim,fragment,ragged-right] +@lilypond[quote,verbatim,ragged-right] { \time 4/2 << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } + \relative { + e''8 e e e + e e e e + f2 g + } >> << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } + \relative { + e''8 e e e + e e e e + f2 g + } >> } @end lilypond @@ -3134,37 +3593,48 @@ stößt der Balken mit den oberen Bögen zusammen: @noindent Das kann manuell gelöst werden, indem beide Enden des Balkens von ihrer Position 1.81 Notenlinienabstände unter der Mittellinie -hochgeschoben werden, etwa auf 1: +hoch geschoben werden, etwa auf 1: @cindex Balken, Beispiel zur Veränderung @cindex positions-Eigenschaft, Beispiel @cindex Positionierung, Beispiel -@lilypond[quote,verbatim,fragment,ragged-right] +@lilypond[quote,verbatim,ragged-right] { \time 4/2 << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { + \relative { \override Beam.positions = #'(-1 . -1) - e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' + e''8 e e e + e e e e + f2 g } >> << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } + \relative { + e''8 e e e + e e e e + f2 g + \revert Beam.positions + } >> } @end lilypond @noindent Hier ist zu beobachten, dass die Veränderung sich auch auf den -die erste Stimme des weiteren Taktes mit Achtelnoten auswirkt, während sie keine -Auswirkung auf die Balken der zweiten Stimme hat. +die zweite Stimme des weiteren Taktes mit Achtelnoten auswirkt, +während sie keine Auswirkung auf die Hälse der ersten Stimme hat. +Sobald das override nicht mehr benötigt wird, sollte es wie +zu sehen reverted werden. -@subheading force-hshift (vertikale Verschiebunseigenschaft) +@node Die force-hshift-Eigenschaft +@unnumberedsubsubsec Die @code{force-hshift}-Eigenschaft (horizontale Verschiebunseigenschaft) +@translationof The force-hshift property @cindex force-hshift-Eigenschaft @cindex Vertikale Verschiebung erzwingen @@ -3175,10 +3645,10 @@ Chopin-Beispiel vornehmen, das wir behandelt haben in gebracht: @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { 2 des } \\ @@ -3192,14 +3662,19 @@ gebracht: @noindent Die inneren Noten des ersten Akkordes (also das As in der vierten Stimme) müssen nicht mit shift verschoben aus der Noten-Kolumne der höheren Stimme -verschoben werden. Um das zu korrigieren, setzen wir den Wert von -@code{force-hshift}, einer Eigenschaft von @code{NoteColumn}, auf Null. +verschoben werden, daher verwenden wir @code{\shiftOff}. -Im zweiten Akkord wollen wir, dass das F sich am A orientiert und die +Im zweiten Akkord wollen wir, dass das F sich am As orientiert und die tiefste Note leicht nach rechts verschoben wird, damit ein Zusammenstoß der Hälse vermieden wird. Das erreicht man mit @code{force-hshift} in -@code{NoteColumn} des unteren Des, um es nach rechts um einen halben -Notenlinienzwischenraum zu verschieben. +@code{NoteColumn} des unteren Des, um es einen halben +Notenlinienzwischenraum nach rechts zu verschieben und gleichzeitig +@code{force-hshift} für das F auf Null. +Ihnen ist sicher aufgefallen, dass wir @code{\once} verwenden damit +die Veränderung nicht über den konkreten Fall hinaus wirkt, auch wenn +im konkreten kleinen Beispiel @code{\once} und das zweite @code{\override} +in der vierten Stimme weggelassen werden könnte. Das wäre aber +schlechter Stil. Hier das Endergebnis: @@ -3208,30 +3683,23 @@ Hier das Endergebnis: @cindex vertikale Verschiebung, Beispiel @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ - { - 2 - \once \override NoteColumn.force-hshift = #0.5 - des2 - } + { 2 \once \override NoteColumn.force-hshift = 0.5 des } \\ \\ - { - \override NoteColumn.force-hshift = #0 - aes'2 f4 fes - } + { \once \shiftOff aes'2 \once \shiftOff f4 fes } >> | 1 | } @end lilypond -@node Beispiele aus dem Leben -@subsection Beispiele aus dem Leben +@node Beispiel aus dem Leben +@subsection Beispiel aus dem Leben @translationof Real music example Das Kapitel zu Optimierungen soll mit einem komplizierten Beispiel @@ -3249,18 +3717,20 @@ Hier zunächst der Satz, wie er aussehen soll, allerdings ohne Dynamik, Fingersatz und Pedalbezeichnung, um das Beispiel nicht zu kompliziert zu machen. +@c The following should appear as music without code @c This example should not be indexed +@c line-width ensures no break @lilypond[quote,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 << { c,8 d fis bes a } \new Voice { @@ -3293,8 +3763,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3337,8 +3807,9 @@ erstellt: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { - \new Voice { r2 c4. g8 | +rhMusic = \relative { + \new Voice { + r2 c''4. g8 | bes1~ | \time 6/4 bes2. r8 @@ -3347,7 +3818,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3362,8 +3833,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2 | +lhMusic = \relative { + r2 2 | 1 | r2. d,,4 r4 r | r4 @@ -3397,9 +3868,9 @@ sind schnell gesetzt, denn sie wurden schon in der @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | bes1~ | \time 6/4 bes2. r8 @@ -3408,7 +3879,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3423,8 +3894,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1) | r2. d,,4 r4 r | r4 @@ -3446,13 +3917,13 @@ lhMusic = \relative c' { @end lilypond Der erste Takt stimmt jetzt schon. Der zweite Takt enthält ein -Arpeggio und wird mit einer doppelten Taktlinie beschlossen. +Arpeggio und wird mit einem doppelten Taktstrich beschlossen. Wie können wir diese notieren, denn sie sind im Handbuch zum Lernen nicht vorgekommen? Hier brauchen wir jetzt die Notationsreferenz. Ein Blick in den Index zeigt uns die -Einträge für @qq{Arpeggio} und @qq{Taktlinien}: ein +Einträge für @qq{Arpeggio} und @qq{Taktstriche}: ein Arpeggio also erstellt man mit dem Befehl @code{\arpeggio} -hinter einem Akkord und eine doppelte Taktlinie wird mit dem +hinter einem Akkord und einen doppelten Taktstrich wird mit dem Befehl @code{\bar "||"} erstellt. Das ist einfach. Als nächstes muss der Zusammenstoß des Bindebogens mit der Taktartbezeichnung gelöst werden. Das geht am besten, indem wir den Bogen nach @@ -3462,7 +3933,7 @@ die relativ zum System positioniert werden, vertikal verschoben werden können, indem ihre @code{staff-position}-Eigenschaft geändert wird, die in halben Notenlinienabständen relativ zur Mittellinie angegeben wird. Dieser @code{\override}-Befehl -also, direkt vor die erste übergebundene Note gestellt, verschiebt +also, direkt vor die erste über gebundene Note gestellt, verschiebt den Bindebogen (@code{tie}) 3,5 halbe Notenlinienabstände über die Mittellinie: @@ -3471,9 +3942,9 @@ den Bindebogen (@code{tie}) 3,5 halbe Notenlinienabstände Damit ist auch der zweite Takt vollständig: @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3484,7 +3955,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3499,8 +3970,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3522,9 +3993,9 @@ lhMusic = \relative c' { @end lilypond In Takt drei beginnt der Moderato-Abschnitt. In der -Übung wurde behandelt, wie man fetten Text mit dem -@code{\markup}-Befehl eingibt, es ist also einfach, das -@qq{Moderato} in fetter Schrift hinzuzufügen. Wie aber werden Noten +Übung wurde behandelt, wie man ein Tempobezeichnung mittels des +@code{\tempo}-Befehls eingibt. Damit ist das hinzufügen des +@qq{Moderato} einfach. Wie aber werden Noten verschmolzen? Hier nehmen wir wieder die Notationsreferenz zu Hilfe. Die Suche nach @qq{Verschmelzen} (engl. merge) im Index führt uns zu den Befehlen, um Noten mit @@ -3551,18 +4022,16 @@ Abschnittes stellen und @noindent um das Verhalten wieder auszuschalten. Das sieht so aus: -@cindex Bindebogen, Beispiel zur Veränderung -@cindex staff-position-Eigenschaft, Beispiel - -@lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +@c line-width ensures no break +@lilypond[quote,ragged-right,line-width=6\in] +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices @@ -3570,7 +4039,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3587,8 +4056,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3628,15 +4097,19 @@ Stufe weiter verschoben werden mit @code{\shiftOnn}, damit es die Verschmelzung der Ds nicht stört. Das sieht jetzt so aus: +@cindex Bindebogen, Beispiel zur Veränderung +@cindex staff-position-Eigenschaft, Beispiel + +@c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices @@ -3644,7 +4117,8 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - % Move the c2 out of the main note column so the merge will work + % Move the c2 out of the main note column + % so the merge will work c,8~ \shiftOnn c2 } \new Voice { @@ -3663,8 +4137,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3676,7 +4150,7 @@ lhMusic = \relative c' { \key g \minor \rhMusic >> - \new Staff = "LH" << + \new Staff = "LH" << \key g \minor \clef "bass" \lhMusic @@ -3698,15 +4172,16 @@ wir durchsichtig und das C verschieben wir mit der @cindex Notenhals, Beispiel zur Veränderung @cindex transparent-Eigenschaft, Beispiel +@c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices @@ -3742,8 +4217,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3771,8 +4246,8 @@ lhMusic = \relative c' { @menu * Andere Benutzung von Optimierungen:: -* Variablen für Optimierungen einsetzen:: -* Globale Formatierung:: +* Variablen für Layout Anpassungen einsetzen:: +* Formatvorlagen:: * Mehr Information:: * Fortgeschrittene Optimierungen mit Scheme:: @end menu @@ -3781,6 +4256,11 @@ lhMusic = \relative c' { @subsection Andere Benutzung von Optimierungen @translationof Other uses for tweaks +@menu +* Noten zwischen unterschiedlichen Stimmen überbinden:: +* Eine Fermate in MIDI simulieren:: +@end menu + @cindex Transparente Objekte @cindex Entfernen von Objekten @cindex Verstecken von Objekten @@ -3789,20 +4269,23 @@ lhMusic = \relative c' { @cindex Objekte unsichtbar machen @cindex Objekte entfernen @cindex Objekte verstecken -@cindex Noten zwischen Stimmen überbinden -@cindex Überbinden von Noten zwischen Stimmen -@subheading Noten zwischen unterschiedlichen Stimmen überbinden +@node Noten zwischen unterschiedlichen Stimmen überbinden +@unnumberedsubsubsec Noten zwischen unterschiedlichen Stimmen überbinden +@translationof Tying notes across voices + +@cindex Noten zwischen Stimmen über binden +@cindex Über binden von Noten zwischen Stimmen Das nächste Beispiel zeigt, wie man Noten von verschiedenen Stimmen miteinander verknüpfen kann, indem man Bindebögen für Überbindungen benutzt. Normalerweise können nur zwei -Noten der gleichen Stimme übergebunden werden. Wenn +Noten der gleichen Stimme über gebunden werden. Wenn man zwei Stimmen benutzt, wobei die überbundenen Noten sich in der selben befinden, -@lilypond[quote,fragment,relative=2] -<< { b8~ b8\noBeam } \\ { b[ g8] } >> +@lilypond[quote] +<< { b'8~ 8\noBeam } \\ { b'8[ g'] } >> @end lilypond @noindent @@ -3810,40 +4293,33 @@ und dann den ersten Hals nach oben unsichtbar macht, sieht es so aus, als ob die Überbindung zwischen den Stimmen stattfindet: -@cindex Hals, Beispiel zur Veränderung -@cindex Notenhals, Beispiel zur Veränderung +@cindex Hals, Beispiel zum Verstecken +@cindex Notenhals, Beispiel zum Verstecken +@cindex Fähnchen, Beispiel zum Verstecken @cindex transparent-Eigenschaft, Beispiel +@funindex \omit -@lilypond[quote,fragment,relative=2,verbatim] +@lilypond[quote,verbatim] << { - \tweak Stem.transparent ##t - b8~ b\noBeam + \once \omit Stem + \once \omit Flag + b'8~ 8\noBeam } \\ - { b8[ g] } + { b'8[ g'] } >> @end lilypond -Um sicherzugehen, dass der unsichtbare Hals den Bindebogen -nicht zu sehr verkleinert, kann er verlängert werden, indem -seine Länge (@code{length}) auf den Wert @code{8} -gesetzt wird: - -@lilypond[quote,fragment,relative=2,verbatim] -<< - { - \tweak Stem.transparent ##t - \tweak Stem.length #8 - b8~ b\noBeam - } -\\ - { b[ g8] } ->> -@end lilypond +@seealso +Handbuch zum Lernen: +@ref{Der once-Präfix,,Der @code{@bs{}once}-Präfix}, +@ref{Die stencil-Eigenschaft}. -@subheading Eine Fermate in MIDI simulieren +@node Eine Fermate in MIDI simulieren +@unnumberedsubsubsec Eine Fermate in MIDI simulieren +@translationof Simulating a fermata in MIDI @cindex stencil-Eigenschaft, Benutzung @cindex Fermate, Benutzung in MIDI @@ -3873,36 +4349,39 @@ einem entfernten Objekt gezeigt: @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a - \once \override Score.MetronomeMark.transparent = ##t + a'4 a a + \once \hide Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 - a4\fermata + a4\fermata | % New tempo for next section \tempo 4=100 - a4 a a a + a4 a a a | } \layout { } \midi { } } @end lilypond +@cindex Metronom-Bezeichnung, Beispiel zur Veränderung +@cindex transparent-Eigenschaft, Beispiel + @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a - \once \override Score.MetronomeMark.stencil = ##f + a'4 a a + \once \omit Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 - a4\fermata + a4\fermata | % New tempo for next section \tempo 4=100 - a4 a a a + a4 a a a | } \layout { } \midi { } @@ -3922,9 +4401,9 @@ Glossar: @rglos{system}. -@node Variablen für Optimierungen einsetzen -@subsection Variablen für Optimierungen einsetzen -@translationof Using variables for tweaks +@node Variablen für Layout Anpassungen einsetzen +@subsection Variablen für Layout Anpassungen einsetzen +@translationof Using variables for layout adjustments @cindex Variablen, Benutzung zur Optimierung @cindex Optimierung mit Variablen @@ -3981,10 +4460,10 @@ normal = { global = { \key c \major \time 4/4 \partial 4 } -SopranoMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopranoMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyrics { E -- | ter -- nal \emphasize Fa -- ther, | \normal strong to save, @@ -4023,12 +4502,12 @@ VerseFour = \lyricmode { @end lilypond -@node Globale Formatierung -@subsection Globale Formatierung +@node Formatvorlagen +@subsection Formatvorlagen @translationof Style sheets Die Ausgabe von LilyPond kann sehr stark verändert werden, siehe -zu Einzelheiten @ref{Die Ausgabe verändern}. Aber was ist, +zu Einzelheiten @ref{Die Ausgabe verbessern}. Aber was ist, wenn man mehrere Eingabedateien hat, die die gleichen Anpassungen erfahren sollen? Oder wenn Sie einfach nur die Anpassungen von der eigentlichen Musik trennen wollen? Das lässt sich recht einfach @@ -4036,26 +4515,23 @@ erreichen. Schauen wir uns ein Beispiel an. Sorgen Sie sich nicht, wenn Sie den Abschnitt mit den vielen @code{#()} nicht verstehen. Das wird -erklärt in @ref{Fortgeschrittene Optimierungen mit Scheme}. +in @ref{Fortgeschrittene Optimierungen mit Scheme} erklärt. @lilypond[quote,verbatim,ragged-right] mpdolce = - #(make-dynamic-script - #{ \markup { \hspace #0 - \translate #'(5 . 0) - \line { \dynamic "mp" - \text \italic "dolce" } } - #}) + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #}) inst = #(define-music-function - (parser location string) + (string) (string?) - #{ <>^\markup \bold \box #string #}) + #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4075,24 +4551,21 @@ wir sie also: @example %%% in Datei "definitions.ily" speichern mpdolce = - #(make-dynamic-script - #@{ \markup @{ \hspace #0 - \translate #'(5 . 0) - \line @{ \dynamic "mp" - \text \italic "dolce" @} @} - #@}) + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #@{ \markup @{ \dynamic mp \normal-text \italic \bold dolce @} #@}) inst = #(define-music-function - (parser location string) + (string) (string?) - #@{ <>^\markup \bold \box #string #@}) + #@{ <>^\markup \bold \box #string #@}) @end example Diese Datei wir mit dem @code{\include}-Befehl ziemlich weit oben in der Datei eingefügt. (Die Erweiterung @file{.ily} wird benutzt, um diese Datei als eine eingefügte, inkludierte zu kennzeichnen, die -man nicht alleinstehend kompilieren kann.) Jetzt ändern wir die +man nicht alleinstehend kompilieren kann). Jetzt ändern wir die Noten (in der Datei @file{music.ly}). @c We have to do this awkward example/lilypond-non-verbatim @@ -4101,9 +4574,9 @@ Noten (in der Datei @file{music.ly}). @example \include "definitions.ily" -\relative c'' @{ +\relative @{ \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4113,22 +4586,19 @@ Noten (in der Datei @file{music.ly}). @lilypond[quote,ragged-right] mpdolce = - #(make-dynamic-script - #{ \markup { \hspace #0 - \translate #'(5 . 0) - \line { \dynamic "mp" - \text \italic "dolce" } } - #}) + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #}) inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4149,23 +4619,20 @@ wir also in @qq{4/4}. @example %%% definitions.ily mpdolce = -#(make-dynamic-script - #@{ \markup @{ \hspace #0 - \translate #'(5 . 0) - \line @{ \dynamic "mp" - \text \italic "dolce" @} @} - #@}) + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #@{ \markup @{ \dynamic mp \normal-text \italic \bold dolce @} #@}) inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) \layout@{ \context @{ \Score - \override MetronomeMark.extra-offset = #'(-9 . 0) + \override MetronomeMark.extra-offset = #'(-5 . 0) \override MetronomeMark.padding = #'3 @} \context @{ @@ -4182,23 +4649,20 @@ inst = @lilypond[quote,ragged-right] mpdolce = -#(make-dynamic-script - #{ \markup { \hspace #0 - \translate #'(5 . 0) - \line { \dynamic "mp" - \text \italic "dolce" } } - #}) + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #}) inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) \layout{ \context { \Score - \override MetronomeMark.extra-offset = #'(-9 . 0) + \override MetronomeMark.extra-offset = #'(-5 . 0) \override MetronomeMark.padding = #'3 } \context { @@ -4212,9 +4676,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4230,18 +4694,15 @@ auf dem Monitor dargestellt werden sollen, wird auch die Notengröße global geändert. @example -%%% definitions.ily +%%% web-publish.ily mpdolce = -#(make-dynamic-script - #@{ \markup @{ \hspace #0 - \translate #'(5 . 0) - \line @{ \dynamic "mp" - \text \italic "dolce" @} @} - #@}) + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #@{ \markup @{ \dynamic mp \normal-text \italic \bold dolce @} #@}) inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -4250,7 +4711,7 @@ inst = \layout@{ \context @{ \Score - \override MetronomeMark.extra-offset = #'(-9 . 0) + \override MetronomeMark.extra-offset = #'(-5 . 0) \override MetronomeMark.padding = #'3 @} \context @{ @@ -4266,16 +4727,13 @@ inst = @lilypond[quote,ragged-right] mpdolce = -#(make-dynamic-script - #{ \markup { \hspace #0 - \translate #'(5 . 0) - \line { \dynamic "mp" - \text \italic "dolce" } } - #}) + \tweak self-alignment-X #-0.6 + #(make-dynamic-script + #{ \markup { \dynamic mp \normal-text \italic \bold dolce } #}) inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4283,7 +4741,7 @@ inst = \layout{ \context { \Score - \override MetronomeMark.extra-offset = #'(-9 . 0) + \override MetronomeMark.extra-offset = #'(-5 . 0) \override MetronomeMark.padding = #'3 } \context { \Voice @@ -4292,9 +4750,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4323,7 +4781,7 @@ Der Anfang von @file{music.ly} würde dann folgendermaßen aussehen: Diese Herangehensweise kann auch schon nützlich sein, wenn man nur ein paar Stimmen schreiben will. Ich habe eine ganze Anzahl -an @qq{Stylesheets} für meine Projekte. Ich fange jede Datei mit +an @qq{Formatvorlagen} (engl. Stylesheets) für meine Projekte. Ich fange jede Datei mit der Zeile @code{\include "../global.ily"} an, die etwa folgendes einbindet: @@ -4356,7 +4814,7 @@ z. B. in einer GNU/Linux-Distribution oder unter fink oder cygwin installiert), und b) auf welchem Betriebssystem Sie das Programm benutzen: -@strong{Von lilypond.org heruntergeladen} +@subsubsubheading Von lilypond.org heruntergeladen @itemize @bullet @item GNU/Linux @@ -4387,8 +4845,7 @@ Wechseln Sie mit dem Windows Explorer ins Verzeichnis @end itemize -@strong{Mit einem Paket-Manager installiert oder selber aus -den Quellen kompiliert} +@subsubsubheading Mit einem Paket-Manager installiert oder selber aus den Quellen kompiliert Wechseln Sie in das Verzeichnis @file{@var{PREFIX}/share/lilypond/@var{X.Y.Z}/}, wobei @@ -4413,7 +4870,7 @@ Befehle für LilyPond, wie etwa @code{\stemUp} und @code{\slurDotted}. Sie können sehen, dass es sich um nichts mehr handelt als Definitionen von Variablen, die eine oder mehrere @code{\override}-Befehle enthalten. Der -Befehl @code{/tieDotted} etwa wird folgendermaßen definiert: +Befehl @code{\tieDotted} etwa wird folgendermaßen definiert: @example tieDotted = @{ @@ -4454,7 +4911,7 @@ im Moment außerhalb des Rahmens dieses Handbuchs, denn sie erfordern einige Kenntnis der Scheme-Sprache. Die Warnung ist hier angebracht, dass des ein gutes technisches Verständnis oder sehr viel Zeit braucht, um Scheme und diese -Dateien zu verstehen (siehe auch @rextend{Scheme-Übung}). +Dateien zu verstehen (siehe auch @rextend{Scheme-Tutorium}). Wenn Sie sich mit Scheme auskennen, sind hier mögliche interessante Dateien: @@ -4490,7 +4947,7 @@ zu beeinflussen. Code, der in der Scheme-Programmiersprache geschrieben ist, kann direkt in die interne Satzmaschine von LilyPond eingefügt werden. Natürlich brauchen Sie dazu wenigstens ein grundlegendes Verständnis von Scheme. Eine Einleitung finden -Sie in der @rextend{Scheme-Übung}. +Sie in der @rextend{Scheme-Tutorium}. Zur Illustration der vielen Möglichkeiten soll gezeigt werden, dass eine Eigenschaft nicht nur auf eine Konstante, sondern auch auf eine @@ -4521,7 +4978,7 @@ zu ihrer Position innerhalb der Tonleiter gesetzt. ((0) (x11-color 'violet )) ; for B ))) -\relative c' { +\relative { % Arrange to obtain color from color-notehead procedure \override NoteHead.color = #color-notehead a2 b | c2 d | e2 f | g2 a | @@ -4529,4 +4986,4 @@ zu ihrer Position innerhalb der Tonleiter gesetzt. @end lilypond Weiter Beispiele, die die Benutzung dieser programmierbaren -Schnittstelle zeigen, finden sich in @rextend{Optimierungen mit Scheme}. +Schnittstelle zeigen, finden sich in @rextend{Callback-Funktionen}. diff --git a/Documentation/de/macros.itexi b/Documentation/de/macros.itexi index ca8c5d2239..1a41265bd4 100644 --- a/Documentation/de/macros.itexi +++ b/Documentation/de/macros.itexi @@ -7,6 +7,7 @@ Guide, node Updating translation committishes.. @end ignore +@documentencoding UTF-8 @include version.itexi @include common-macros.itexi @@ -816,4 +817,3 @@ this Wikipedia Commons page}. Dieser Abschnitt wurde noch nicht übersetzt. Bitte lesen Sie den Abschnitt im englischen Benutzerhandbuch. @end macro - diff --git a/Documentation/de/notation.tely b/Documentation/de/notation.tely index 966c0b6c6b..5b23f96908 100644 --- a/Documentation/de/notation.tely +++ b/Documentation/de/notation.tely @@ -24,7 +24,7 @@ dem @rlearningnamed{Top, Handbuch zum Lernen} vertraut ist. @c `Notation Reference' was born 1999-10-11 with git commit 940dda0... @macro copyrightDeclare -Copyright @copyright{} 1999--2012 bei den Autoren. +Copyright @copyright{} 1999--2015 bei den Autoren. @end macro diff --git a/Documentation/de/notation/ancient.itely b/Documentation/de/notation/ancient.itely index 813dcf4d5c..4d777e2b92 100644 --- a/Documentation/de/notation/ancient.itely +++ b/Documentation/de/notation/ancient.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @c Translators: Till Paala @@ -27,7 +27,7 @@ @menu * Überblick über die unterstützten Stile:: * Alte Notation -- Allgemeines:: -* Mesurale Musik setzen:: +* Mensurale Musik setzen:: * Gregorianischen Choral setzen:: * Kiever Quadratnotation setzen:: * Musiksatz Alter Musik in der Praxis -- Szenarien und Lösungen:: @@ -306,8 +306,8 @@ folgenden Beispiel gezeigt: @lilypond[quote,ragged-right] \score { - \relative c'' { - a1 + \relative { + a'1 \break g } @@ -376,8 +376,8 @@ Notationsreferenz: @c {{{1 Typesetting mensural music -@node Mesurale Musik setzen -@subsection Mesurale Musik setzen +@node Mensurale Musik setzen +@subsection Mensurale Musik setzen @translationof Typesetting mensural music @menu @@ -398,8 +398,8 @@ Notationsreferenz: @unnumberedsubsubsec Mensural-Kontexte @translationof Mensural contexts -@cindex MensuralVoiceContext -@cindex MensuralStaffContext +@cindex MensuralVoice +@cindex MensuralStaff @funindex MensuralVoice @funindex MensuralStaff @@ -628,8 +628,8 @@ können die Taktarten angewählt werden. Unterstützte Stile sind: neomensurale Stil verwendet. Im folgenden Beispiel sind die unterschiedlichen Stile dargestellt. -@lilypond[ragged-right,relative=1,quote] -{ +@lilypond[ragged-right,quote] +\relative c' { \textLengthOn \time 2/2 @@ -930,10 +930,10 @@ was man als Variable definieren kann: @lilypond[quote,verbatim] ficta = { \once \set suggestAccidentals = ##t } -\score { \relative c'' +\score { \relative \new MensuralVoice { \once \set suggestAccidentals = ##t - bes4 a2 g2 \ficta fis8 \ficta e! fis2 g1 + bes'4 a2 g2 \ficta fis8 \ficta e! fis2 g1 } } @end lilypond @@ -1097,8 +1097,8 @@ Notationreferenz: @unnumberedsubsubsec Gregorianische Gesangs-Kontexte @translationof Gregorian chant contexts -@cindex VaticanaVoiceContext -@cindex VaticanaStaffContext +@cindex VaticanaVoice +@cindex VaticanaStaff @funindex VaticanaVoice @funindex VaticanaStaff @@ -1164,14 +1164,14 @@ Do-Schlüssel der Editio Vaticana @code{vaticana-do1}, @code{vaticana-do2},@* @code{vaticana-do3} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'vaticana.punctum \clef "vaticana-do2" - c + c' @end lilypond @item @@ -1179,14 +1179,14 @@ Fa-Schlüssel der Editio Vaticana @tab @code{vaticana-fa1}, @code{vaticana-fa2} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'vaticana.punctum \clef "vaticana-fa2" - c + c' @end lilypond @item @@ -1195,14 +1195,14 @@ Do-Schlüssel der Editio Medicaea @code{medicaea-do1}, @code{medicaea-do2},@* @code{medicaea-do3} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'medicaea.punctum \clef "medicaea-do2" - c + c' @end lilypond @item @@ -1210,14 +1210,14 @@ Fa-Schlüssel der Editio Medicaea @tab @code{medicaea-fa1}, @code{medicaea-fa2} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'medicaea.punctum \clef "medicaea-fa2" - c + c' @end lilypond @item @@ -1226,14 +1226,14 @@ Hufnagel Do-Schlüssel für den historischen Stil @code{hufnagel-do1}, @code{hufnagel-do2},@* @code{hufnagel-do3} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'hufnagel.punctum \clef "hufnagel-do2" - c + c' @end lilypond @item @@ -1241,14 +1241,14 @@ Hufnagel Fa-Schlüssel für den historischen Stil @tab @code{hufnagel-fa1}, @code{hufnagel-fa2} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'hufnagel.punctum \clef "hufnagel-fa2" - c + c' @end lilypond @item @@ -1256,13 +1256,13 @@ Kombinierter Do/Fa-Hufnagelschlüssel für den historischen Stil @tab @code{hufnagel-do-fa} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'hufnagel.punctum \clef "hufnagel-do-fa" - c + c' @end lilypond @end multitable @@ -2526,8 +2526,8 @@ Präfixen in arbiträrer Reihenfolge notiert werden kann. @unnumberedsubsubsec Kiever Kontexte @translationof Kievan contexts -@funindex KievanVoiceContext -@funindex KievanStaffContext +@funindex KievanVoice +@funindex KievanStaff Wie auch für die Mensural- und Gregorianische Notation können die Kontexte @code{KievanVoice} and @code{KievanStaff} eingesetzt werdne, um @@ -2536,6 +2536,14 @@ die benötigten Kontexteigenschaften und Grob-Eigenschaften mit den richtigen Werten, sodass man sofort den Choral notieren kann: @lilypond[quote,ragged-right,verbatim] +% Font settings for Cyrillic +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + )) +} + \score { << \new KievanVoice = "melody" \transpose c c' { @@ -2572,10 +2580,10 @@ worden ist. Es gibt nur einen Schlüssel in der Kiever Notation (der Tse-fa-ut-Schlüssel). Er bezeichnet die Position von @code{c}: -@lilypond[quote,relative=1,notime,verbatim] +@lilypond[quote,fragment,notime,verbatim] \clef "kievan-do" - \override NoteHead.style = #'kievan - c + \kievanOn + c' @end lilypond @seealso @@ -2606,8 +2614,10 @@ Notenköpfe: @lilypond[quote,fragment,ragged-right,verbatim] \autoBeamOff \cadenzaOn -\override NoteHead.style = #'kievan +\kievanOn b'1 b'2 b'4 b'8 b'\breve b'\longa +\kievanOff +b'2 @end lilypond @seealso @@ -2639,12 +2649,11 @@ in der Kiever Notation. Das Kreuz wird in der Synodalen Musik nicht eingesetzt, kann aber in früheren Manuskripten auftreten. Es wurde vor allem der Vollständigkeit halber eingesetzt. -@lilypond[quote,relative=1,notime,verbatim] +@lilypond[quote,fragment,notime,verbatim] \clef "kievan-do" -\override NoteHead.style = #'kievan \override Accidental.glyph-name-alist = #alteration-kievan-glyph-name-alist -bes' dis, +bes' dis' @end lilypond @seealso @@ -2663,19 +2672,18 @@ Notationsreferenz: Eine dekorative Figur wird üblicherweise am Ende von eines Musikstückes der Kiever Notation gesetzt, was man als Kiever -Schlussstrich bezeichnen kann. Es wird gesetzt mit @code{\bar "kievan"}. +Schlussstrich bezeichnen kann. Es wird gesetzt mit @code{\bar "k"}. @lilypond[quote,relative=1,notime,verbatim] \clef "kievan-do" - \override NoteHead.style = #'kievan - c \bar "kievan" + \kievanOn + c \bar "k" @end lilypond @seealso @ref{Takte}, @ref{Die Feta-Schriftart} - @c Working with ancient music: scenarios and solutions:: {{{1 @node Musiksatz Alter Musik in der Praxis -- Szenarien und Lösungen @subsection Musiksatz Alter Musik in der Praxis -- Szenarien und Lösungen @@ -2804,9 +2812,9 @@ werden: entweder als einzelne, links ausgerichtete Silbe: @lilypond[verbatim,ragged-right] \include "gregorian.ly" -chant = \relative c' { +chant = \relative { \clef "G_8" - c\breve c4 b4 a c2 c4 \divisioMaior + c'\breve c4 b4 a c2 c4 \divisioMaior c\breve c4 c f, f \finalis } @@ -2839,10 +2847,10 @@ gemacht): @lilypond[verbatim,ragged-right] \include "gregorian.ly" -chant = \relative c' { +chant = \relative { \clef "G_8" \set Score.timing = ##f - c\breve \hide NoteHead c c c c c + c'\breve \hide NoteHead c c c c c \undo \hide NoteHead \override Stem.transparent = ##f \stemUp c4 b4 a \hide Stem c2 c4 \divisioMaior @@ -2895,10 +2903,10 @@ können sie mit unsichtbaren (@code{s})-Noten vorgenommen werden. @lilypond[verbatim,quote] -spiritus = \relative c' { +spiritus = \relative { \time 1/4 \override Lyrics.LyricText.X-extent = #'(0 . 3) - d4 \tuplet 3/2 { f8 a g } g a a4 g f8 e + d'4 \tuplet 3/2 { f8 a g } g a a4 g f8 e d4 f8 g g8 d f g a g f4 g8 a a4 s \tuplet 3/2 { g8 f d } e f g a g4 } diff --git a/Documentation/de/notation/changing-defaults.itely b/Documentation/de/notation/changing-defaults.itely index e528f8ae6a..205626f318 100644 --- a/Documentation/de/notation/changing-defaults.itely +++ b/Documentation/de/notation/changing-defaults.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.24" @c Translators: Till Paala @@ -23,7 +23,7 @@ großen Anzahl von @qq{Schaltern und Knöpfen} kontrolliert werden. Sie werden als @qq{Eigenschaften} (engl. properties) bezeichnet. Eine kurze Einführung und Übung, wie man auf diese Eigenschaften zugreifen kann und sie verändern kann, findet sich im Handbuch -zum Lernen, siehe @rlearning{Die Ausgabe verändern}. Das Kapitel +zum Lernen, siehe @rlearning{Die Ausgabe verbessern}. Das Kapitel sollte zuerst gelesen werden. In diesem Kapitel werden die gleichen Themen behandelt, aber der Schwerpunkt liegt eher auf einer technischen Darstellung. @@ -44,7 +44,7 @@ Intern benutzt LilyPond Scheme (ein LISP-Dialekt), um eine Infrastruktur zur Verfügung zu stellen. Wenn Layoutentscheidungen verändert werden sollen, müssen auf die programminternen Prozesse zugegriffen werden, wozu Scheme-Code benötigt wird. Scheme-Abschnitte werden in einer -LilyPond-Quelldatei mit einer Raute@tie{}@code{#} begonnen.@footnote{@rextend{Scheme-Übung} enthält eine kurze Übung, wie +LilyPond-Quelldatei mit einer Raute@tie{}@code{#} begonnen.@footnote{@rextend{Scheme-Tutorium} enthält eine kurze Übung, wie man Zahlen, Listen, Zeichenketten und Symbole in Scheme notiert.} @@ -67,7 +67,7 @@ verändern kann. @menu * Was sind Kontexte?:: -* Kontexte erstellen:: +* Kontexte erstellen und referenzieren:: * Kontexte am Leben halten:: * Umgebungs-Plugins verändern:: * Die Standardeinstellungen von Kontexten ändern:: @@ -247,9 +247,9 @@ wenn Stichnoten gesetzt werden. Ausgabe von Akkordsymbolen. -@node Kontexte erstellen -@subsection Kontexte erstellen -@translationof Creating contexts +@node Kontexte erstellen und referenzieren +@subsection Kontexte erstellen und referenzieren +@translationof Creating and referencing contexts In Partituren mit einer Stimme und einem System werden die Kontexte normalerweise automatisch erstellt. In komplizierteren Partituren @@ -396,8 +396,8 @@ Damit aber die Funktion auf @code{Score}- oder @code{Staff}-Ebene interpretiert wird, muss folgende Form benutzt werden: @example -\applyOutput #'Score #@var{Funktion} -\applyOutput #'Staff #@var{Funktion} +\applyOutput Score #@var{Funktion} +\applyOutput Staff #@var{Funktion} @end example @end itemize @@ -447,8 +447,8 @@ Im folgenden Beispiel werden sowohl Stimme A als auch B auf diese Weise für die gesamte Dauer des Stückes am Leben gehalten. @lilypond[quote,verbatim] -musicA = \relative c'' { d4 d d d } -musicB = \relative c'' { g4 g g g } +musicA = \relative { d''4 d d d } +musicB = \relative { g'4 g g g } keepVoicesAlive = { << \new Voice = "A" { s1*5 } % Keep Voice "A" alive for 5 bars @@ -486,8 +486,8 @@ kann, indem man die Stimme am Leben hält. In wirklichen Situationen würden Begleitung und Melodie natürlich aus mehreren Abschnitten bestehen. @lilypond[quote,verbatim] -melody = \relative c'' { a4 a a a } -accompaniment = \relative c' { d4 d d d } +melody = \relative { a'4 a a a } +accompaniment = \relative { d'4 d d d } words = \lyricmode { These words fol -- low the mel -- o -- dy } \score { << @@ -525,14 +525,14 @@ ist es, einfach unsichtbare Pausen einzufügen, um die Melodie mit der Begleitung passend auszurichten: @lilypond[quote,verbatim] -melody = \relative c'' { +melody = \relative { s1 % skip a bar - a4 a a a + a'4 a a a s1 % skip a bar a4 a a a } -accompaniment = \relative c' { - d4 d d d +accompaniment = \relative { + d'4 d d d d4 d d d d4 d d d d4 d d d @@ -594,7 +594,6 @@ geschieht, indem man einen neuen Kontext mit @code{\new} oder @code{\context} beginnt und ihn dann verändert: @funindex \with -@funindex with @example \new @var{context} \with @{ @@ -617,16 +616,16 @@ Es folgt ein einfaches Beispiel, in dem der @code{Clef_engraver} (Engraver für den Schlüssel) aus dem @code{Staff}-Kontext entfernt werden: -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << - \new Staff { - f2 g + \new Staff \relative { + f'2 g } \new Staff \with { \remove "Time_signature_engraver" \remove "Clef_engraver" - } { - f2 g2 + } \relative { + f'2 g2 } >> @end lilypond @@ -771,8 +770,8 @@ Ein @code{\override}-Befehl, aber ohne die Kontextbezeichnung: @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Thicker stems" a a a + \relative { + a'4^"Thicker stems" a a a a4 a a\ff a } \layout { @@ -789,8 +788,8 @@ Eine Kontexteigenschaft kann direkt gesetzt werden: @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a\ff a } \layout { @@ -808,8 +807,8 @@ musikalischer Ausdruck wie @code{\accidentalStyle dodecaphonic}: @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Dynamics above" a a a + \relative { + a'4^"Dynamics above" a a a a4 a a\ff a } \layout { @@ -837,8 +836,8 @@ StaffDefaults = \with { \score { \new Staff { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -865,8 +864,8 @@ ist die gleiche wie für den Befehl direkt zwischen den Noten geschrieben. @lilypond[quote,verbatim] \score { \new Staff { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -916,8 +915,8 @@ Ein @code{\override}-Befehl, dessen Kontextbezeichnung ausgelassen wird: \override Stem.thickness = #4.0 } { - \relative c'' { - a4^"Thick stems" a a a + \relative { + a'4^"Thick stems" a a a a4 a a a } } @@ -932,8 +931,8 @@ Eine Kontexeigenschaft direkt einstellen: \score { << \new Staff { - \relative c'' { - a4^"Default font" a a a + \relative { + a'4^"Default font" a a a a4 a a a } } @@ -941,8 +940,8 @@ Eine Kontexeigenschaft direkt einstellen: \with { fontSize = #-4 } { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -958,8 +957,8 @@ Ein vordefinierter Befehl wie etwa @code{\dynamicUp} << \new Staff { \new Voice { - \relative c'' { - a4^"Dynamics below" a a a + \relative { + a'4^"Dynamics below" a a a a4 a a\ff a } } @@ -970,8 +969,8 @@ Ein vordefinierter Befehl wie etwa @code{\dynamicUp} \new Voice \with { \dynamicUp } { - \relative c'' { - a4^"Dynamics above" a a a + \relative { + a'4^"Dynamics above" a a a a4 a a\ff a } } @@ -1016,7 +1015,7 @@ Notationsreferenz: @ref{Unterste Kontexte -- Stimmen}, @ref{Der set-Befehl}, @ref{Der override-Befehl}, -@ref{Die \layout-Umgebung}. +@ref{Die layout-Umgebung}. @node Neue Kontexte definieren @@ -1027,17 +1026,11 @@ Notationsreferenz: @cindex Engraver, in Kontexte einfügen @funindex \alias -@funindex alias @funindex \name -@funindex name @funindex \type -@funindex type @funindex \consists -@funindex consists @funindex \accepts -@funindex accepts @funindex \denies -@funindex denies Bestimme Kontexte, wie @code{Staff} oder @code{Voice}, werden erstellt, indem man sie mit einer Musikumgebung aufruft. Es ist @@ -1068,8 +1061,8 @@ in Jazzmusik anzuzeigen. \accepts "ImproVoice" }} -\relative c'' { - a4 d8 bes8 \new ImproVoice { c4^"ad lib" c +\relative { + a'4 d8 bes8 \new ImproVoice { c4^"ad lib" c c4 c^"ausziehen" c_"während des Spiels :)" c } a1 } @@ -1158,7 +1151,6 @@ Alles zusammen haben wir folgende Einstellungen: @end example @funindex \accepts -@funindex accepts Kontexte sind hierarchisch. Wie wollen, dass @code{ImproVoice} sich als Unterkontext von @code{Staff} erkennt, wie eine normale @@ -1173,7 +1165,6 @@ Stimme. Darum wird die Definition von @code{Staff} mit dem @end example @funindex \denies -@funindex denies Das Gegenteil von @code{\accepts} ist @code{\denies} (verbietet), was manchmal gebraucht werden kann, wenn schon existierende Kontext-Definitionen @@ -1199,8 +1190,8 @@ Jetzt kann die Notation zu Beginn des Abschnitts folgendermaßen notiert werden: @example -\relative c'' @{ - a4 d8 bes8 +\relative @{ + a'4 d8 bes8 \new ImproVoice @{ c4^"ad lib" c c4 c^"ausziehen" @@ -1703,12 +1694,12 @@ Befehl den Kontext @code{Staff} angibt, wirkt er sich nur auf das gerade aktuelle Notensystem aus. Andere Systeme behalten ihr normales Aussehen. Hier ein Beispiel mit diesem Befehl: -@lilypond[quote,verbatim,relative=2] -c4 +@lilypond[quote,fragment,verbatim] +c''4 \override Staff.Stem.thickness = #4.0 -c4 -c4 -c4 +c''4 +c''4 +c''4 @end lilypond Der @code{\override}-Befehl verändert die Definitionen von @@ -1721,11 +1712,11 @@ Kontext ausgelassen werden, wobei dann immer implizit der @code{Voice}-Kontext angenommen wird. Mit einem zusätzlichen @code{\once} wirkt sich die Änderung nur einmal aus: -@lilypond[quote,verbatim,relative=2] -c4 +@lilypond[quote,fragment,verbatim] +c''4 \once \override Stem.thickness = #4.0 -c4 -c4 +c''4 +c''4 @end lilypond Der @code{\override}-Befehl muss geschrieben sein, bevor das Objekt @@ -1734,11 +1725,11 @@ ein Bogen verändert werden soll, muss der @code{\override}-Befehl schon geschrieben werden, bevor das Objekt begonnen wird. In dem folgenden Beispiel -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \override Slur.thickness = #3.0 -c8[( c +c''8[( c'' \override Beam.beam-thickness = #0.6 -c8 c]) +c''8 c'']) @end lilypond @noindent @@ -1801,7 +1792,6 @@ oder einen Absturz des Programms hervorrufen. @cindex Verändern von Eigenschaften @funindex \set -@funindex set Jeder Kontext kann unterschiedliche @emph{Eigenschaften} besitzen, Variablen, die in diesem Kontext definiert sind. Sie können @@ -1817,7 +1807,7 @@ werden muss. Kontexteigenschaften werden üblicherweise mit @code{kleinGroßbuchstabe} benannt. Sie kontrollieren vor allem die Übersetzung von Musik in -Notation, wie etwa @code{localKeySignature}, welche bestimmt, wann +Notation, wie etwa @code{localAlterations}, welche bestimmt, wann ein Taktstrich gesetzt werden muss. Kontexteigenschaften können ihren Wert mit der Zeit ändern, während eine Notationsdatei interpretiert wird. Ein gutes Beispiel dafür ist @code{measurePosition}, was die @@ -1828,7 +1818,7 @@ Mehrtaktpausen etwa können in einen Takt zusammengefasst werden, wenn die Kontexteigenschaft @code{skipBars} (Takte überspringen) auf @code{#t} (wahr) gesetzt wird: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] R1*2 \set Score.skipBars = ##t R1*2 @@ -1839,17 +1829,16 @@ der Befehl auf den gerade aktiven unterstmöglichen Kontext, üblicherweise @code{ChordNames}, @code{Voice} oder @code{Lyrics}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \set Score.autoBeaming = ##f -<< - { - e8 e e e - \set autoBeaming = ##t - e8 e e e - } \\ { - c8 c c c c8 c c c - } ->> +\relative { + e''8 e e e + \set autoBeaming = ##t + e8 e e e +} \\ +\relative { + c''8 c c c c8 c c c +} @end lilypond Die Änderung wird zur Laufzeit während der Musik interpretiert, sodass @@ -1863,7 +1852,7 @@ keine Auswirkung, weil er sich auf den @code{Voice}-Kontext bezieht, die Eigenschaft sich aber im @code{Score}-Kontext befindet: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] R1*2 \set skipBars = ##t R1*2 @@ -1875,7 +1864,6 @@ die Änderungen auf alle Stimmen (@code{Voice}), die in diesem Kontext enthalten sind. @funindex \unset -@funindex unset Es gibt auch einen @code{\unset}-Befehl: @@ -1889,18 +1877,17 @@ entfernt werden. Dieser Befehl macht nur Einstellungen im richtigen Kontext rückgängig. Wenn also im @code{Staff}-Kontext die Bebalkung ausgeschaltet wird: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \set Score.autoBeaming = ##t -<< - { - \unset autoBeaming - e8 e e e - \unset Score.autoBeaming - e8 e e e - } \\ { - c8 c c c c8 c c c - } ->> +\relative { + \unset autoBeaming + e''8 e e e + \unset Score.autoBeaming + e8 e e e +} \\ +\relative { + c''8 c c c c8 c c c +} @end lilypond Wie für @code{\set} muss das @var{Kontext}-Argument für den untersten @@ -1915,16 +1902,15 @@ verhalten sich gleich, wenn die gegenwärtige Basis der @code{Voice}-Kontext ist. @funindex \once -@funindex once Einstellungen, die nur einmal vorgenommen werden sollen, können mit @code{\once} notiert werden, etwa: -@lilypond[quote,verbatim,relative=2] -c4 +@lilypond[quote,fragment,verbatim] +c''4 \once \set fontSize = #4.7 -c4 -c4 +c''4 +c''4 @end lilypond Eine vollständige Beschreibung aller vorhandenen Kontexteigenschaften @@ -1953,7 +1939,6 @@ Internals Reference: @cindex graphische Objekte, Eigenschaften @funindex \override -@funindex override Es gibt eine besondere Art von Kontexteigenschaft: die Grob-Beschreibung. Grob-Beschreibungen werden mit @code{GroßGroßbuchstabe} benannt. Sie @@ -2014,7 +1999,6 @@ benutzt: @cindex \override rückgängig machen @funindex \revert -@funindex revert Die Auswirkungen von @code{\override} können mit @code{\revert} wieder rückgängig gemacht werden: @@ -2052,7 +2036,6 @@ Grobs im entsprechenden Kontext aber der Stelle aus, an der sie gesetzt werden: @cindex \override, nur einmal @funindex \once -@funindex once @code{\once} kann zusammen mit @code{\override} benutzt werden, um nur den aktuellen Zeitwert zu verändern: @@ -2083,7 +2066,6 @@ um nur den aktuellen Zeitwert zu verändern: @cindex Veränderungen der Einstellungen @cindex Einstellungen verändern -@funindex override @funindex \override Viele Eigenschaften können unabhängig von der Art der Daten, die @@ -2105,7 +2087,6 @@ Referenz der Interna: @translationof The tweak command @funindex \tweak -@funindex tweak @cindex Optimieren @@ -2170,15 +2151,15 @@ sodass die Veränderung funktioniert. An einem Beispiel demonstriert: Das funktioniert: -@lilypond[relative=2,verbatim,quote] -<\tweak color #red c>4 +@lilypond[verbatim,fragment,quote] +<\tweak color #red c''>4 @end lilypond @noindent und das nicht: -@lilypond[relative=2,verbatim,quote] -\tweak color #red c4 +@lilypond[verbatim,fragment,quote] +\tweak color #red c''4 @end lilypond @end ignore @@ -2206,20 +2187,20 @@ gleichen musikalischen Moment auftreten können sind unter Anderem: In diesem Beispiel wird die Farbe eines Notenkopfes und die Art eines anderen Notenkopfes innerhalb eines Akkordes verändert: -@lilypond[relative=2,verbatim,quote] -< c +@lilypond[verbatim,fragment,quote] +< c'' \tweak color #red - d - g + d'' + g'' \tweak duration-log #1 - a + a'' > 4 @end lilypond @code{\tweak} kann auch benutzt werden, um Bögen zu verändern: -@lilypond[verbatim,quote,relative=1] -c-\tweak thickness #5 ( d e f) +@lilypond[verbatim,quote] +\relative { c'-\tweak thickness #5 ( d e f) } @end lilypond Damit der @code{\tweak}-Befehl funktioniert, muss er direkt vor dem @@ -2243,10 +2224,10 @@ den Quelltext. Derartige indirekt erstellt Layoutobjekte können mit @code{\tweak} verändert werden, indem man die ausführliche Form des Befehls einsetzt: -@lilypond[relative=2,verbatim,quote] +@lilypond[fragment,verbatim,quote] \tweak Stem.color #red -\tweak Beam.color #green c8 e -4 +\tweak Beam.color #green c''8 e'' +4 @end lilypond @code{\tweak} kann auch nicht verwendet werden, @@ -2257,14 +2238,14 @@ automatisches Einfügen von zusätzlichen Kontextelementen getrennt. Mehrere @code{\tweak}-Befehle können vor ein Notationselement gesetzt werden und alle werden interpretiert: -@lilypond[verbatim,quote,relative=1] -c --\tweak style #'dashed-line --\tweak dash-fraction #0.2 --\tweak thickness #3 --\tweak color #red - \glissando -f' +@lilypond[verbatim,fragment,quote] +c' + -\tweak style #'dashed-line + -\tweak dash-fraction #0.2 + -\tweak thickness #3 + -\tweak color #red + \glissando +f'' @end lilypond Der Strom der musikalischen Ereignisse (engl. music stream), der aus @@ -2306,7 +2287,7 @@ unterschiedliche Arten von Eigenschaften. Kontexte können Eigenschaften haben, deren Bezeichnungen üblicherweise dem Schema @code{kleinGroß} folgen. Derartige Eigenschaften sind vor allen Dingen für die Übersetzung der -Musik in Notation zuständig, beispielsweise @code{localKeySignature} +Musik in Notation zuständig, beispielsweise @code{localAlterations} (um zu bestimmen, ob Versetzungszeichen ausgegeben werden müssen), @code{measurePosition} (um zu bestimmen, ob eine Taktlinie gesetzt werden muss). Kontexteigenschaften können @@ -2467,7 +2448,7 @@ Es ist also sicherer, geschachtelte Aufrufe zu benutzen, wenn man nicht bewusst alle Werte zurücksetzen will. @warning{Geschachtelte Aufrufe funktionieren nicht mit -Kontexteigenschaften (wie etwa @code{beamExceptions}, @code{keySignature}, +Kontexteigenschaften (wie etwa @code{beamExceptions}, @code{keyAlterations}, @code{timeSignatureSettings}, usw.) Diese Eigenschaften können nur verändert werden, indem man sie vollständig als Alisten umdefiniert.} @@ -2637,11 +2618,13 @@ benutzen) normalerweise weggelassen werden. In diesem Fall wird Ausrichtungsmarkierer haben nur eine Auswirkung auf die nächste Note: -@lilypond[verbatim,quote,relative=2] -c2( c) -c2_( c) -c2( c) -c2^( c) +@lilypond[verbatim,quote] +\relative { + c''2( c) + c2_( c) + c2( c) + c2^( c) +} @end lilypond @@ -2681,13 +2664,15 @@ oder @code{CENTER} bedeutet @qq{benutze Standardausrichtung}. Diese Ausrichtungsanzeigen wirken sich auf alle Noten aus, bis sie rückgängig gemacht werden: -@lilypond[verbatim,quote,relative=2] -c2( c) -\slurDown -c2( c) -c2( c) -\slurNeutral -c2( c) +@lilypond[verbatim,quote] +\relative { + c''2( c) + \slurDown + c2( c) + c2( c) + \slurNeutral + c2( c) +} @end lilypond In polyphoner Musik ist es normalerweise besser, eine explizite @@ -2791,11 +2776,11 @@ Anzahl der Notenlinien wird implizit definiert durch die Anzahl der Elemente in der Liste der Werte von @code{'line-positions}.} -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.line-positions = #'(7 3 0 -4 -6 -7) } -{ a4 e' f b | d1 } +\relative { a4 e' f b | d1 } @end lilypond Die Breite eines Notensystems kann verändert werden. Die Einheit @@ -2803,11 +2788,11 @@ ist in Notenlinienabständen. Die Abstände von Objekten in diesem Notensystem wird durch diese Einstellung nicht beeinflusst. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.width = #23 } -{ a4 e' f b | d1 } +\relative { a4 e' f b | d1 } @end lilypond @@ -2897,31 +2882,31 @@ auf @code{ly:spanner::set-spacing-rods} gesetzt werden. Die Mindestlänge eines Glissandos etwa wird erst aktiv, wenn die @code{springs-and-rods}-Eigenschaft gesetzt ist: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,fragment,quote] % default -e \glissando c' +e' \glissando c'' % not effective alone \once \override Glissando.minimum-length = #20 -e, \glissando c' +e' \glissando c'' % effective only when both overrides are present \once \override Glissando.minimum-length = #20 \once \override Glissando.springs-and-rods = #ly:spanner::set-spacing-rods -e, \glissando c' +e' \glissando c'' @end lilypond Das gilt auch für das @code{Beam}-(Balken-)Objekt: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,fragment,quote] % not effective alone \once \override Beam.minimum-length = #20 -e8 e e e +e'8 e' e' e' % effective only when both overrides are present \once \override Beam.minimum-length = #20 \once \override Beam.springs-and-rods = #ly:spanner::set-spacing-rods -e8 e e e +e'8 e' e' e' @end lilypond @strong{@i{Die @code{to-barline}-Eigenschaft}} @@ -2935,10 +2920,12 @@ Taktstrich erstreckt. Wenn die Eigenschaft auf @qq{falsch} gesetzt wird, erstrecken sich die Strecker entsprechend über die Taktlinie hinüber und enden erst an der entsprechenden Note: -@lilypond[verbatim,quote,relative=2] -a \< a a a a \! a a a \break -\override Hairpin.to-barline = ##f -a \< a a a a \! a a a +@lilypond[verbatim,quote] +\relative { + a' \< a a a a \! a a a \break + \override Hairpin.to-barline = ##f + a \< a a a a \! a a a +} @end lilypond Diese Eigenschaft wirkt sich nicht auf alle Strecker aus. Im Falle @@ -2971,11 +2958,11 @@ werden müssen, sind zwei Ebenen in der Objekthierarchie tiefer angeordnet, aber die Syntax des @code{\override}-Befehls ist ziemlich einfach: -@lilypond[relative=2,quote,verbatim] -e2 \glissando b +@lilypond[quote,fragment,verbatim] +e''2 \glissando b' \once \override Glissando.bound-details.left.Y = #3 \once \override Glissando.bound-details.right.Y = #-2 -e2 \glissando b +e''2 \glissando b' @end lilypond Die Einheiten für die @code{Y}-Eigenschaft werden in @@ -2993,11 +2980,11 @@ Im Fall eines Zeilenumbruchs werden die Werte der Endpunkte in den Unterlisten @code{left-broken} bzw. @code{right-broken} von @code{bound-details} abgelegt. Zum Beispiel: -@lilypond[relative=2,ragged-right,verbatim,quote] +@lilypond[ragged-right,fragment,verbatim,quote] \override Glissando.breakable = ##t \override Glissando.bound-details.right-broken.Y = #-3 -c1 \glissando \break -f1 +c''1 \glissando \break +f''1 @end lilypond Eine Anzahl weitere Eigenschaft der @code{left}- und @@ -3038,10 +3025,10 @@ Das ist eine Textbeschriftung, die ausgewertet wird und die um @i{cresc.}, @i{tr} oder andere Texte an horizontale Strecker zu setzen. -@lilypond[quote,ragged-right,relative=2,verbatim] +@lilypond[quote,ragged-right,fragment,verbatim] \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } -c2\startTextSpan b c a\stopTextSpan +\relative { c''2\startTextSpan b c a\stopTextSpan } @end lilypond @item stencil-align-dir-y @@ -3054,13 +3041,14 @@ definiert) zentriert, ausgegeben. Wenn entweder gesetzt werden, wird das Symbol am Rand vertikal entsprechend des Endpunktes der Linie verschoben: -@lilypond[relative=1,quote,verbatim] +@lilypond[quote,fragment,verbatim] \override TextSpanner.bound-details.left.stencil-align-dir-y = #-2 \override TextSpanner.bound-details.right.stencil-align-dir-y = #UP \override TextSpanner.bound-details.left.text = #"ggg" \override TextSpanner.bound-details.right.text = #"hhh" -c4^\startTextSpan c c c \stopTextSpan + +\relative { c'4^\startTextSpan c c c \stopTextSpan } @end lilypond Dabei sollte beachtet werden, dass negative Werte das Objekt @@ -3089,11 +3077,13 @@ einer Note beendet, oder am nächsten Taktstrich, wenn @code{to-barline} auf wahr gesetzt ist und eine Taktlinie vor der nächsten Note erscheint. -@lilypond[verbatim,quote,ragged-right,relative=2] -\endSpanners -c2 \startTextSpan c2 c2 -\endSpanners -c2 \< c2 c2 +@lilypond[verbatim,quote,ragged-right] +\relative c'' { + \endSpanners + c2 \startTextSpan c2 c2 + \endSpanners + c2 \< c2 c2 +} @end lilypond Wenn man @code{\endSpanners} benutzt, ist es nicht @@ -3160,7 +3150,7 @@ Funktion aufgerufen und also auch kein Objekt gezeichnet. Das Standardverhalten kann mit dem Befehl @code{\revert} wieder hergestellt werden. -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,fragment,verbatim] a1 a \omit Score.BarLine a a @@ -3183,10 +3173,10 @@ die normalerweise auf den Wert @code{#f} gesetzt ist. Wenn sie auf @code{#t} gesetzt wird, nimmt das Objekt immer noch den entsprechenden Platz ein, ist aber unsichtbar. -@lilypond[quote,verbatim,relative=2] -a4 a +@lilypond[quote,fragment,verbatim] +a'4 a' \once \hide NoteHead -a a +a' a' @end lilypond @@ -3214,9 +3204,9 @@ in welcher die Objekte gesetzt werden. Es kann also vorkommen, dass man die Umrisse des weißen Objektes erahnen kann, wie in diesem Beispiel: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \override Staff.Clef.color = #white -a1 +a'1 @end lilypond Das kann man vermeiden, indem man die Satzreihenfolge der Objekte @@ -3238,10 +3228,10 @@ Im oberen Beispiel wird der weiße Schlüssel, der einen Wert von (Notenschlüssel) ein niedrigerer Wert, etwa @w{@code{-1}}, gegeben werden, sodass es früher gesetzt wird: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \override Staff.Clef.color = #white \override Staff.Clef.layer = #-1 -a1 +a'1 @end lilypond @@ -3396,16 +3386,18 @@ Zeile angezeigt werden. Im nächsten Beispiel ist die Tonartangabe nach dem expliziten Wechsel zu B-Dur immer noch sichtbar, obwohl @code{all-invisible} eingesetzt wurde: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -% Try to remove all key signatures -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b -\break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + % Try to remove all key signatures + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b + \break + f4 g a b + f4 g a b +} @end lilypond Die Sichtbarkeit derartiger expliziter Tonart- und Schlüsseländerungen @@ -3423,15 +3415,17 @@ die Sichtbarkeit von Tonarten bzw. Schlüssel, die von expliziten Schlüssel zu Beginn einer Zeile -- um diese zu beeinflussen, muss @code{break-visibility} benutzt werden. -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond @strong{@emph{Sichtbarkeit von erinnernden Versetzungszeichen}} @@ -3440,16 +3434,18 @@ Um erinnernde Versetzungszeichen zu entfernen, die nach einer expliziten Tonartänderung auftreten, muss die @code{Staff}-Eigenschaft @code{printKeyCancellation} auf @code{#f} gesetzt werden: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\set Staff.printKeyCancellation = ##f -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \set Staff.printKeyCancellation = ##f + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond Mit diesen Veränderungen bleiben nur noch die Versetzungszeichen @@ -3518,16 +3514,18 @@ im gewünschten Linienstil. Hier einige Beispiele, welche Linienstile möglich sind und wie sie verändert werden können: -@lilypond[relative=2,ragged-right,verbatim,quote] -d2 \glissando d'2 -\once \override Glissando.style = #'dashed-line -d,2 \glissando d'2 -\override Glissando.style = #'dotted-line -d,2 \glissando d'2 -\override Glissando.style = #'zigzag -d,2 \glissando d'2 -\override Glissando.style = #'trill -d,2 \glissando d'2 +@lilypond[ragged-right,verbatim,quote] +\relative { + d''2 \glissando d'2 + \once \override Glissando.style = #'dashed-line + d,2 \glissando d'2 + \override Glissando.style = #'dotted-line + d,2 \glissando d'2 + \override Glissando.style = #'zigzag + d,2 \glissando d'2 + \override Glissando.style = #'trill + d,2 \glissando d'2 +} @end lilypond Die Position der Endpunkte des Streckers werden in @@ -3535,10 +3533,12 @@ Realzeit für jedes graphische Objekt errechnet, aber es ist möglich, sie manuell vorzugeben: @c TODO Complete -@lilypond[relative=2,ragged-right,verbatim,quote] -e2 \glissando f -\once \override Glissando.bound-details.right.Y = #-2 -e2 \glissando f +@lilypond[ragged-right,verbatim,quote] +\relative { + e''2 \glissando f + \once \override Glissando.bound-details.right.Y = #-2 + e2 \glissando f +} @end lilypond Der Wert von @code{Y} wird für den rechten Endpunkt auf @@ -3595,10 +3595,10 @@ Es gibt nur wenige Situationen, in welchen die Drehung eines Layout-Objektes sinnvoll ist. Das folgende Beispiel zeigt eine sinnvolle Anwendung: -@lilypond[quote,verbatim,relative=1] -g4\< e' d' f\! +@lilypond[quote,fragment,verbatim] +g4\< e' d'' f''\! \override Hairpin.rotation = #'(20 -1 0) -g,,4\< e' d' f\! +g4\< e' d'' f''\! @end lilypond @@ -3617,12 +3617,12 @@ Beispiel wird die @code{outside-staff-priority}-Eigenschaft auf werden, wodurch andernfalls einige der Texte zu hoch geschoben werden würden. -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,fragment,verbatim] \override TextScript.outside-staff-priority = ##f g4^\markup { \rotate #30 "a G" } b^\markup { \rotate #30 "a B" } -des^\markup { \rotate #30 "a D-Flat" } -fis^\markup { \rotate #30 "an F-Sharp" } +des'^\markup { \rotate #30 "a D-Flat" } +fis'^\markup { \rotate #30 "an F-Sharp" } @end lilypond @@ -3644,7 +3644,7 @@ Aussehen des Notenbildes zu polieren. @seealso Handbuch zum Lernen: -@rlearning{Die Ausgabe verändern}, +@rlearning{Die Ausgabe verbessern}, @rlearning{Mehr Information}. Notationsreferenz: @@ -3735,13 +3735,13 @@ drei Noten mit der Standardposition von Fingersatzanweisungen und die Positionen, wenn @code{X-offset} und @code{Y-offset} verändert werden. -@lilypond[verbatim,quote,relative=2] -a-3 -a +@lilypond[verbatim,fragment,quote] +a'-3 +a' -\tweak X-offset #0 -\tweak Y-offset #0 -3 -a +a' -\tweak X-offset #-1 -\tweak Y-offset #1 -3 @@ -3823,7 +3823,7 @@ die Werte von @code{self-alignment-X} zu verändern, aber der @code{\tweak}-Befehl kann benutzen, um verschiedene Anmerkungen an einer einzigen Note auszurichten: -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim,fragment] a' -\tweak self-alignment-X #-1 ^"left-aligned" @@ -3866,8 +3866,8 @@ werden. Das folgende Beispiel zeigt, wie man eine Fingersatzanweisung so ausrichtet, dass sie nah am Notenkopf bleibt. -@lilypond[quote,verbatim,relative=2] -a +@lilypond[quote,verbatim,fragment] +a' -\tweak self-alignment-X #0.5 % move horizontally left -\tweak Y-offset #ly:self-alignment-interface::y-aligned-on-self -\tweak self-alignment-Y #-1 % move vertically up @@ -4055,8 +4055,8 @@ XinO = { \musicglyph #"noteheads.s2cross" } } -\relative c'' { - a a \XinO a a +\relative { + a' a \XinO a a } @end lilypond @@ -4113,11 +4113,11 @@ Hier ein Beispiel eines Falles, in dem der Bogen nicht optimal erscheint, und wo auch @code{\tieDown} das Problem nicht lösen würde. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] << - { e1~ e } + { e'1~ 1 } \\ - { r4 } + \relative { r4 } >> @end lilypond @@ -4151,7 +4151,7 @@ wird. << { \once \override Tie.control-points = #'((1 . -1) (3 . 0.6) (12.5 . 0.6) (14.5 . -1)) - e1~ e1 + e1~ 1 } \\ { r4 } @@ -4315,7 +4315,7 @@ Funktionen ist: @example Funktion = #(define-music-function - (parser location @var{Arg1} @var{Arg2} @dots{}) + (@var{Arg1} @var{Arg2} @dots{}) (@var{Typ1?} @var{Typ2?} @dots{}) #@{ @var{@dots{}Noten@dots{}} @@ -4398,14 +4398,14 @@ das Verschieben von @code{TextScript} erleichtert: @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function - (parser location padding) + (padding) (number?) #{ \once \override TextScript.padding = #padding #}) -\relative c''' { - c4^"piu mosso" b a b +\relative { + c'''4^"piu mosso" b a b \padText #1.8 c4^"piu mosso" d e f \padText #2.6 @@ -4419,7 +4419,7 @@ als Argumente für musikalische Funktionen eingesetzt werden: @lilypond[quote,verbatim,ragged-right] custosNote = #(define-music-function - (parser location note) + (note) (ly:music?) #{ \tweak NoteHead.stencil #ly:text-interface::print @@ -4429,7 +4429,7 @@ custosNote = #note #}) -\relative c' { c4 d e f \custosNote g } +\relative { c'4 d e f \custosNote g } @end lilypond Ersetzungsfunktionen mit mehrfachen Argumenten können definiert @@ -4438,16 +4438,16 @@ werden: @lilypond[quote,verbatim,ragged-right] tempoPadded = #(define-music-function - (parser location padding tempotext) + (padding tempotext) (number? markup?) #{ \once \override Score.MetronomeMark.padding = #padding \tempo \markup { \bold #tempotext } #}) -\relative c'' { +\relative { \tempo \markup { "Low tempo" } - c4 d e f g1 + c''4 d e f g1 \tempoPadded #4.0 "High tempo" g4 f e d c1 } diff --git a/Documentation/de/notation/cheatsheet.itely b/Documentation/de/notation/cheatsheet.itely index ebedb6c218..0c44e12323 100644 --- a/Documentation/de/notation/cheatsheet.itely +++ b/Documentation/de/notation/cheatsheet.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.16" @c Translators: Till Paala @@ -130,7 +130,7 @@ c c, @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f c( d e) @end lilypond @@ -141,7 +141,7 @@ c( d e) @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f c\( c( d) e\) @end lilypond @@ -152,7 +152,7 @@ c\( c( d) e\) @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a8-[ b-] @end lilypond @@ -163,11 +163,11 @@ a8-[ b-] @tab @lilypond[relative=1] << \new Staff { - \set Staff.implicitTimeSignatureVisibility = #all-invisible + \set Staff.initialTimeSignatureVisibility = #all-invisible c1 } \new Staff { - \set Staff.implicitTimeSignatureVisibility = #all-invisible + \set Staff.initialTimeSignatureVisibility = #all-invisible c1 } >> @end lilypond @@ -177,7 +177,7 @@ a8-[ b-] @tab Artikulationszeichen @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible c-> c-. @end lilypond @@ -186,7 +186,7 @@ c-> c-. @tab Dynamik @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible c2\mf c\sfz @end lilypond @@ -196,7 +196,7 @@ c2\mf c\sfz @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a\< a a\! @end lilypond @@ -206,7 +206,7 @@ a\< a a\! @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a\> a a\! @end lilypond @@ -216,7 +216,7 @@ a\> a a\! @tab Noten im Akkord @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible @end lilypond @@ -234,7 +234,7 @@ f8 c2 d e @tab Triolen @tab @lilypond[relative=1] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \tuplet 3/2 { f8 g a } @end lilypond @@ -243,7 +243,7 @@ f8 c2 d e @tab Verzierungen @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \context Voice { \grace b16 c4 } @end lilypond @@ -264,7 +264,7 @@ twinkle @tab Gesangstext-Trennstrich @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible << { g'1 g } \new Lyrics \lyricsto "" { twin -- kle } @@ -275,7 +275,7 @@ twinkle @tab Akkorde @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \chordmode { c:dim f:maj7 } @end lilypond @@ -290,7 +290,7 @@ twinkle @tab Mehrstimmigkeit @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \context Staff <<{e f} \\ {c d}>> @end lilypond diff --git a/Documentation/de/notation/chords.itely b/Documentation/de/notation/chords.itely index fb3336f998..224ce8f536 100644 --- a/Documentation/de/notation/chords.itely +++ b/Documentation/de/notation/chords.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.28" @c Translators: Till Paala @@ -77,11 +77,13 @@ als im Notationsmodus. Akkordmodus und Notenmodus können gemischt verwendet werden: -@lilypond[verbatim,quote,ragged-right,relative=1] -2 -\chordmode { c2 f } -2 -\chordmode { f2 g } +@lilypond[verbatim,quote,ragged-right] +\relative { + 2 + \chordmode { c2 f } + 2 + \chordmode { f2 g } +} @end lilypond @seealso @@ -324,7 +326,7 @@ die große. @lilypond[quote,verbatim] \chordmode { - c1:5.6 c:3.7.8 c:3.6.13 + c1:3.5.6 c:3.7.8 c:3.6.13 } @end lilypond @@ -333,7 +335,7 @@ Hinzugefügte Stufen können beliebig groß sein: @lilypond[quote,verbatim] \chordmode { - c4:5.15 c:5.20 c:5.25 c:5.30 + c4:3.5.15 c:3.5.20 c:3.5.25 c:3.5.30 } @end lilypond @@ -378,7 +380,7 @@ einer @code{4} die vierte Stufe hinzugefügt. @code{sus} entspricht @lilypond[quote,ragged-right,verbatim] \chordmode { - c1:sus c:sus2 c:sus4 c:5.4^3 + c1:5 c:sus2 c:sus4 c:5.4 } @end lilypond @@ -428,7 +430,7 @@ weil @code{5+} zuletzt gelesen wird. @cindex Cluster @lilypond[quote,ragged-right,verbatim] -\chordmode { c1:5.5-.5+ } +\chordmode { c1:3.5.5-.5+ } @end lilypond Nur die zweite Umkehrung kann erstellt werden, indem eine @@ -505,7 +507,7 @@ Basstöne werden notiert: Pausen, die in einem @code{ChordNames}-Kontext notiert werden, werden mit der @code{noChordSymbol}-Beschriftung darstellt. -@lilypond[verbatim, quote, relative=1] +@lilypond[verbatim,quote] << \new ChordNames \chordmode { c1 @@ -1105,8 +1107,8 @@ des parallelen Systems. @lilypond[verbatim,ragged-right,quote] << - \relative c'' { - c4 c'8 r8 c,4 c' + \relative { + c''4 c'8 r8 c,4 c' } \new FiguredBass { \figuremode { diff --git a/Documentation/de/notation/contemporary.itely b/Documentation/de/notation/contemporary.itely index d57c3e50b2..3d36d800d8 100644 --- a/Documentation/de/notation/contemporary.itely +++ b/Documentation/de/notation/contemporary.itely @@ -1,4 +1,4 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 @@ -252,4 +252,3 @@ von Kurt Stone [W. W. Norton, 1980] Krzysztof Penderecki (Threnody to the Victims of Hiroshima?) Karlheinz Stockhausen (Gruppen?) @end ignore - diff --git a/Documentation/de/notation/editorial.itely b/Documentation/de/notation/editorial.itely index f01a51d270..dc8a328cda 100644 --- a/Documentation/de/notation/editorial.itely +++ b/Documentation/de/notation/editorial.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.21" @c Translators: Till Paala @@ -120,7 +120,7 @@ Schriftgrößenänderungen werden erreicht, indem man die Design-Schriftgröße nimmt, die der gewünschten am nächsten kommt, und sie dann skaliert. Die Standard-Schriftgröße (für @code{font-size = #0}) hängt von der Standard-Systemhöhe ab. Für ein Notensystem von 20pt wird eine Schriftgröße -von 10pt ausgewählt. +von 11pt ausgewählt. Die @code{font-size}-Eigenschaft kann nur für die Layoutobjekte gesetzt werden, die Schrift-Dateien benutzen. Das sind die, welche die @@ -152,13 +152,12 @@ Referenz der Interna: @cindex Fingerwechsel @cindex Griff: Fingersatz @funindex \finger -@funindex finger Fingersatzanweisungen können folgenderweise notiert werden: @samp{Note}-@var{Zahl} -@lilypond[verbatim,quote,relative=2] -c4-1 d-2 f-4 e-3 +@lilypond[verbatim,quote] +\relative { c''4-1 d-2 f-4 e-3 } @end lilypond Für Fingerwechsel muss eine Textbeschriftung (markup) benutzt werden: @@ -170,14 +169,13 @@ c4-1 d-2 f-4 c^\markup { \finger "2 - 3" } @cindex thumb-script @cindex Fingersatz: Daumen-Zeichen @funindex \thumb -@funindex thumb Mit dem Daumen-Befehl (@code{\thumb}) können die Noten bezeichnet werden, die mit dem Daumen (etwa auf dem Cello) gespielt werden sollen. -@lilypond[verbatim,quote,relative=2] -2 +@lilypond[verbatim,quote] +\relative { 2 } @end lilypond @cindex Fingersatz: Akkorde @@ -187,8 +185,10 @@ Fingersätze für Akkorde können auch zu einzelnen Noten hinzugefügt werden, indem sie innerhalb der Akkord-Klammer direkt an die Noten angefügt werden. -@lilypond[verbatim,quote,relative=2] -2 +@lilypond[verbatim,quote] +\relative { + 2 +} @end lilypond Fingersatzanweisungen können manuell oberhalb des Systems gesetzt werden, siehe @@ -236,34 +236,36 @@ Schreibweise @code{@var{Note}-@var{Zahl}} einsetzt. @cindex Noten, durchsichtig @cindex transparent, Noten @funindex \hideNotes -@funindex hideNotes @funindex \unHideNotes -@funindex unHideNotes Versteckte (oder unsichtbare oder transparente) Noten können sinnvoll sein, wenn man Notation für den Theorieunterricht oder Kompositionsübungen erstellen will. -@lilypond[verbatim,quote,relative=2] -c4 d -\hideNotes -e4 f -\unHideNotes -g a -\hideNotes -b -\unHideNotes -c +@lilypond[verbatim,quote] +\relative { + c''4 d + \hideNotes + e4 f + \unHideNotes + g a + \hideNotes + b + \unHideNotes + c +} @end lilypond Notenköpfe, Hälse, Fähnchen und Pausen sind unsichtbar. Balken sind unsichtbar, wenn sie auf einer unsichtbaren Note beginnen. Objekte, die an unsichtbare Noten angehängt werden, sind trotzdem noch sichtbar. -@lilypond[verbatim,quote,relative=2] -e8(\p f g a)-- -\hideNotes -e8(\p f g a)-- +@lilypond[verbatim,quote] +\relative c'' { + e8(\p f g a)-- + \hideNotes + e8(\p f g a)-- +} @end lilypond @@ -302,19 +304,18 @@ Referenz der Interna: @cindex with-color @funindex color @funindex \with-color -@funindex with-color @funindex x11-color Einzelnen Objekten können einfach eigene Farben zugewiesen werden. Gültige Farben-Bezeichnungen sind aufgelistet in @ref{Liste der Farben}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \override NoteHead.color = #red -c4 c +c''4 c'' \override NoteHead.color = #(x11-color 'LimeGreen) -d +d'' \override Stem.color = #blue -e +e'' @end lilypond Die ganze Farbpalette, die für X11 definiert ist, kann mit der @@ -328,22 +329,24 @@ die aus mehr als einem Wort bestehen. Wenn @code{x11-color} die angegebene Farbbezeichnung nicht kennt, wird Schwarz eingesetzt. -@lilypond[verbatim,quote,relative=2] -\override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) -\set Staff.instrumentName = \markup { - \with-color #(x11-color 'navy) "Clarinet" -} +@lilypond[verbatim,quote] +\relative c'' { + \override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) + \set Staff.instrumentName = \markup { + \with-color #(x11-color 'navy) "Clarinet" + } -gis8 a -\override Beam.color = #(x11-color "medium turquoise") -gis a -\override Accidental.color = #(x11-color 'DarkRed) -gis a -\override NoteHead.color = #(x11-color "LimeGreen") -gis a -% this is deliberate nonsense; note that the stems remain black -\override Stem.color = #(x11-color 'Boggle) -b2 cis + gis8 a + \override Beam.color = #(x11-color "medium turquoise") + gis a + \override Accidental.color = #(x11-color 'DarkRed) + gis a + \override NoteHead.color = #(x11-color "LimeGreen") + gis a + % this is deliberate nonsense; note that the stems remain black + \override Stem.color = #(x11-color 'Boggle) + b2 cis +} @end lilypond @cindex RGB-Farbe @@ -353,18 +356,20 @@ b2 cis Exakte RGB-Farben können mit Hilfe der Scheme-Funktion @code{rgb-color} definiert werden. -@lilypond[verbatim,quote,relative=2] -\override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) -\set Staff.instrumentName = \markup { - \with-color #(x11-color 'navy) "Clarinet" -} +@lilypond[verbatim,quote] +\relative c'' { + \override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) + \set Staff.instrumentName = \markup { + \with-color #(x11-color 'navy) "Clarinet" + } -\override Stem.color = #(rgb-color 0 0 0) -gis8 a -\override Stem.color = #(rgb-color 1 1 1) -gis8 a -\override Stem.color = #(rgb-color 0 0 0.5) -gis4 a + \override Stem.color = #(rgb-color 0 0 0) + gis8 a + \override Stem.color = #(rgb-color 1 1 1) + gis8 a + \override Stem.color = #(rgb-color 0 0 0.5) + gis4 a +} @end lilypond @seealso @@ -404,26 +409,29 @@ dazu muss @code{\tweak} benutzt werden. Siehe auch @ref{Der tweak-Befehl}. @cindex Klammern um Noten @cindex editorische Noten @funindex \parenthesize -@funindex parenthesize Objekte können in Klammern gesetzt werden, indem vor ihnen der Befehl @code{\parenthesize} geschrieben wird. Wenn ein Akkord in Klammern gesetzt wird, wirkt sich das auf jede Noten im Akkord aus. Innerhalb von einem Akkord gesetzte Befehle wirken sich auf einzelne Noten aus. -@lilypond[verbatim,quote,relative=2] -c2 \parenthesize d -c2 \parenthesize -c2 +@lilypond[verbatim,quote] +\relative { + c''2 \parenthesize d + c2 \parenthesize + c2 +} @end lilypond Auch andere Objekte als Noten können in Klammern gesetzt werden. Wenn Artikulationszeichen in Klammern gesetzt werden sollen, braucht man ein Minuszeichen vor dem @code{\parenthesize}-Befehl. -@lilypond[verbatim,quote,relative=2] -c2-\parenthesize -. d -c2 \parenthesize r +@lilypond[verbatim,quote] +\relative { + c''2-\parenthesize -. d + c2 \parenthesize r +} @end lilypond @seealso @@ -539,9 +547,9 @@ Notationselemente können bezeichnet und markiert werden, indem um sie eine rechteckige Blase gezeichnet wird. Dies ist vor allem dazu da, Notation zu erklären. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Voice \with { \consists "Balloon_engraver" } -{ +\relative c'' { \balloonGrobText #'Stem #'(3 . 4) \markup { "I'm a Stem" } a8 \balloonGrobText #'Rest #'(-4 . -4) \markup { "I'm a rest" } @@ -627,11 +635,11 @@ den Linien festgesetzt. \score { \new ChoirStaff << - \new Staff \relative c'' { + \new Staff \relative { \stemUp - c4. d8 e8 f g4 + c''4. d8 e8 f g4 } - \new Staff \relative c { + \new Staff \relative { \clef bass \stemDown c4 g' f e @@ -673,9 +681,7 @@ Referenz der Interna: @cindex Musikanalyse @funindex Horizontal_bracket_engraver @funindex \startGroup -@funindex startGroup @funindex \stopGroup -@funindex stopGroup Klammern über dem System werden in der Musikanalyse benutzt, um strukturelle Einheiten der Musik zu markieren. Einfache @@ -688,8 +694,8 @@ horizontale Klammern werden von LilyPond unterstützt. \consists "Horizontal_bracket_engraver" } } -\relative c'' { - c2\startGroup +\relative { + c''2\startGroup d\stopGroup } @end lilypond @@ -703,8 +709,8 @@ Analyseklammern können verschachtelt sein. \consists "Horizontal_bracket_engraver" } } -\relative c'' { - c4\startGroup\startGroup +\relative { + c''4\startGroup\startGroup d4\stopGroup e4\startGroup d4\stopGroup\stopGroup diff --git a/Documentation/de/notation/expressive.itely b/Documentation/de/notation/expressive.itely index 4642922195..009ca0553b 100644 --- a/Documentation/de/notation/expressive.itely +++ b/Documentation/de/notation/expressive.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.25" +@c \version "2.19.21" @c Translators: Till Paala @@ -127,9 +127,11 @@ Hierzu wird folgende Syntax benutzt: Die möglichen Werte für @var{Bezeichnung} sind aufgelistet in @ref{Liste der Artikulationszeichen}. Ein Beispiel: -@lilypond[verbatim,quote,relative=2] -c4\staccato c\mordent b2\turn -c1\fermata +@lilypond[verbatim,quote] +\relative { + c''4\staccato c\mordent b2\turn + c1\fermata +} @end lilypond @cindex Akzent @@ -151,9 +153,11 @@ für @notation{marcato}, und @notation{portato}. Die ihnen entsprechenden Symbole werden also folgendermaßen notiert: -@lilypond[verbatim,quote,relative=2] -c4-^ c-+ c-- c-! -c4-> c-. c2-_ +@lilypond[verbatim,quote] +\relative { + c''4-^ c-+ c-- c-! + c4-> c-. c2-_ +} @end lilypond Die Regeln für die standardmäßige Platzierung von @@ -171,10 +175,10 @@ Befehl, @code{fermataMarkup}, wurde definiert, damit man eine Fermate an eine Mehrtaktpause anfügen kann (und nur hieran). Damit wird ein @code{MultiMeasureRestText}-Objekt erstellt. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \override Script.color = #red \override MultiMeasureRestText.color = #blue -a2\fermata r\fermata +a'2\fermata r\fermata R1\fermataMarkup @end lilypond @@ -233,43 +237,24 @@ Referenz der Interna: @cindex absolute Lautstärke @funindex \ppppp -@funindex ppppp @funindex \pppp -@funindex pppp @funindex \ppp -@funindex ppp @funindex \pp -@funindex pp @funindex \p -@funindex p @funindex \mp -@funindex mp @funindex \mf -@funindex mf @funindex \f -@funindex f @funindex \ff -@funindex ff @funindex \fff -@funindex fff @funindex \ffff -@funindex ffff @funindex \fffff -@funindex fffff @funindex \fp -@funindex fp @funindex \sf -@funindex sf @funindex \sff -@funindex sff @funindex \sp -@funindex sp @funindex \spp -@funindex spp @funindex \sfz -@funindex sfz @funindex \rfz -@funindex rfz Absolute Dynamikbezeichnung wird mit Befehlen nach den Noten angezeigt, etwa @code{c4\ff}. Die vordefinierten Befehle lauten: @@ -280,10 +265,12 @@ angezeigt, etwa @code{c4\ff}. Die vordefinierten Befehle lauten: Dynamikzeichen können manuell unter- oder oberhalb des Systems platziert werden, siehe @ref{Richtung und Platzierung}. -@lilypond[verbatim,quote,relative=2] -c2\ppp c\mp -c2\rfz c^\mf -c2_\spp c^\ff +@lilypond[verbatim,quote] +\relative c'' { + c2\ppp c\mp + c2\rfz c^\mf + c2_\spp c^\ff +} @end lilypond @cindex Crescendo-Klammer @@ -296,9 +283,7 @@ c2_\spp c^\ff @funindex \> @funindex \! @funindex \cr -@funindex cr @funindex \decr -@funindex decr Eine @notation{Crescendo}-Klammer wird mit dem Befehl @code{\<} begonnen und mit @code{\!}, einem absoluten Dynamikbefehl oder einer weiteren Crescendo- oder @@ -310,26 +295,30 @@ anstelle von @code{\<} und @code{\>} benutzt werden. Die Befehle ergeben standardmäßig Crescendo-Klammern. -@lilypond[verbatim,quote,relative=2] -c2\< c\! -d2\< d\f -e2\< e\> -f2\> f\! -e2\> e\mp -d2\> d\> -c1\! +@lilypond[verbatim,quote] +\relative c'' { + c2\< c\! + d2\< d\f + e2\< e\> + f2\> f\! + e2\> e\mp + d2\> d\> + c1\! +} @end lilypond Eine Crescendo-Klammer, die mit @code{\!} beendet wird, endet an der rechten Seite der Note, welcher @code{\!} zugeordnet ist. In dem Fall, dass es durch den Beginn eines anderen @notation{crescendo}- oder @notation{decrescendo}-Zeichens -beendet wird, endet es in der Mitt der Note, welche das nächste @code{\<} +beendet wird, endet es in der Mitte der Note, welche das nächste @code{\<} oder @code{\>} angehängt hat. Die nächste Klammer beginnt dann am rechten Rand der selben Note anstatt dem normalerweise linken Rand, wenn die vorherige Klammer mit @code{\!} beendet worden wäre. -@lilypond[verbatim,quote,relative=2] -c1\< | c4 a c\< a | c4 a c\! a\< | c4 a c a\! +@lilypond[verbatim,quote] +\relative { + c''1\< | c4 a c\< a | c4 a c\! a\< | c4 a c a\! +} @end lilypond @cindex mehre Dynamikzeichen an einer Note @@ -339,72 +328,70 @@ Leere Pausenzeichen werden benötigt, um mehrere Zeichen für eine Note zu notieren. Das ist insbesondere nützlich, wenn man @notation{crescendo} und @notation{decrescendo} zu der selben Note hinzufügen will: -@lilypond[verbatim,quote,relative=2] -c4\< c\! d\> e\! -<< f1 { s4 s4\< s4\> s4\! } >> +@lilypond[verbatim,quote] +\relative { + c''4\< c\! d\> e\! + << f1 { s4 s4\< s4\> s4\! } >> +} @end lilypond @cindex Espressivo-Artikulation @funindex \espressivo -@funindex espressivo Der @code{\espressivo}-Befehl kann eingesetzt werden, um crescendo und decrescendo für die selbe Note anzuzeigen. Dieser Befehl ist jedoch als Artikulation, nicht als Dynamikzeichen implementiert. -@lilypond[verbatim,quote,relative=2] -c2 b4 a -g1\espressivo +@lilypond[verbatim,quote] +\relative { + c''2 b4 a + g1\espressivo +} @end lilypond @funindex \cresc -@funindex cresc @funindex \decresc -@funindex decresc @funindex \dim -@funindex dim Mit Text gesetzte Crescendo-Bezeichnungen beginnen mit @code{\cresc}. Mit Text gesetzte Decrescendo-Bezeichnungen beginnen mit @code{\decresc} oder @code{\dim}. Fortsetzungslinien werden gesetzt, wenn sie benötigt werden. -@lilypond[verbatim,quote,relative=2] -g8\cresc a b c b c d e\mf | -f8\decresc e d c e\> d c b | -a1\dim ~ | -a2. r4\! | +@lilypond[verbatim,quote] +\relative { + g'8\cresc a b c b c d e\mf | + f8\decresc e d c e\> d c b | + a1\dim ~ | + a2. r4\! | +} @end lilypond @funindex \crescTextCresc -@funindex crescTextCresc @funindex \dimTextDecresc -@funindex dimTextDecresc @funindex \dimTextDecr -@funindex dimTextDecr @funindex \dimTextDim -@funindex dimTextDim @funindex \crescHairpin -@funindex crescHairpin @funindex \dimHairpin -@funindex dimHairpin Als Text gesetzte Dynamik-Bezeichnungen können auch die Crescendo-Klammern ersetzen: -@lilypond[verbatim,quote,relative=2] -\crescTextCresc -c4\< d e f\! | -\dimTextDecresc -g4\> e d c\! | -\dimTextDecr -e4\> d c b\! | -\dimTextDim -d4\> c b a\! | -\crescHairpin -\dimHairpin -c4\< d\! e\> d\! | +@lilypond[verbatim,quote] +\relative c'' { + \crescTextCresc + c4\< d e f\! | + \dimTextDecresc + g4\> e d c\! | + \dimTextDecr + e4\> d c b\! | + \dimTextDim + d4\> c b a\! | + \crescHairpin + \dimHairpin + c4\< d\! e\> d\! | +} @end lilypond Um neue absolute Dynamikzeichen oder Text, der mit ihnen @@ -416,11 +403,8 @@ angeordnet wird, zu erstellen, siehe @ref{Neue Lautstärkezeichen}. Vertikale Position der Zeichen wird von der Funktion @rinternals{DynamicLineSpanner} verwaltet. @funindex \dynamicUp -@funindex dynamicUp @funindex \dynamicDown -@funindex dynamicDown @funindex \dynamicNeutral -@funindex dynamicNeutral Es gibt einen besonderen @code{Dynamics}-Kontext, um Crescendi und Decrescendi auf einer eigenen Zeile zu notieren. Mit leeren Pausen (@code{s}) werden die @@ -431,8 +415,8 @@ aufzunehmen. @lilypond[verbatim,quote] << - \new Staff \relative c' { - c2 d4 e | + \new Staff \relative { + c'2 d4 e | c4 e e,2 | g'4 a g a | c1 | @@ -521,8 +505,8 @@ ist die Benutzung von @code{\markup}-(Textbeschriftungs)-Objekten. @lilypond[verbatim,quote] moltoF = \markup { molto \dynamic f } -\relative c' { - 16_\moltoF +\relative { + 16_\moltoF 2.. } @end lilypond @@ -531,9 +515,7 @@ moltoF = \markup { molto \dynamic f } @cindex Dynamikzeichen, Klammer @cindex editorische Dynamikzeichen @funindex \bracket -@funindex bracket @funindex \dynamic -@funindex dynamic Mit einer Textbeschriftung können editorische Dynamikzeichen (in runden oder eckigen Klammern) erstellt werden. Die Syntax @@ -545,8 +527,8 @@ roundF = \markup { \center-align \concat { \bold { \italic ( } \dynamic f \bold { \italic ) } } } boxF = \markup { \bracket { \dynamic f } } -\relative c' { - c1_\roundF +\relative { + c'1_\roundF c1_\boxF } @end lilypond @@ -559,8 +541,8 @@ Einfache, mittig gesetzte Dynamikzeichen können schnell mit der @lilypond[verbatim,quote] sfzp = #(make-dynamic-script "sfzp") -\relative c' { - c4 c c\sfzp c +\relative { + c'4 c c\sfzp c } @end lilypond @@ -588,8 +570,8 @@ mfEspress = \markup { \center-align \line { roundFdynamic = #(make-dynamic-script roundF) boxFdynamic = #(make-dynamic-script boxF) mfEspressDynamic = #(make-dynamic-script mfEspress) -\relative c' { - c4_\roundFdynamic\< d e f +\relative { + c'4_\roundFdynamic\< d e f g,1~_\boxFdynamic\> g1 g'1~\mfEspressDynamic @@ -605,8 +587,8 @@ verwendet werden. Seine Syntax ist erklärt in moltoF = #(make-dynamic-script (markup #:normal-text "molto" #:dynamic "f")) -\relative c' { - 16 +\relative { + 16 2..\moltoF } @end lilypond @@ -657,10 +639,12 @@ hinter den Notenwerten notiert. @warning{In polyphoner Musik muss ein Legatobogen in der gleichen Stimme beendet werden, in der er begonnen wurde.} -@lilypond[verbatim,quote,relative=2] -f4( g a) a8 b( -a4 g2 f4) -2( 2) +@lilypond[verbatim,quote] +\relative { + f''4( g a) a8 b( + a4 g2 f4) + 2( 2) +} @end lilypond @cindex Bögen, manuelle Platzierung @@ -668,9 +652,7 @@ a4 g2 f4) @cindex Bögen, unter Noten @cindex Bögen, über Noten @funindex \slurDown -@funindex slurDown @funindex \slurNeutral -@funindex slurNeutral Legatobögen können manuell ober- oder unterhalb des Notensystems @@ -699,29 +681,26 @@ können zwei Bögen gleichzeitig ausgegeben werden. Siehe auch @cindex Legatobogen, gestrichelt @cindex Stil von Legatobögen @funindex \slurDashed -@funindex slurDashed @funindex \slurDotted -@funindex slurDotted @funindex \slurSolid -@funindex slurSolid Legatobögen können durchgehend, gepunktet oder gestrichelt dargestellt werden. Standard ist der durchgehende Bogen: -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurDashed -g4( e c2) -\slurDotted -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurDashed + g4( e c2) + \slurDotted + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @funindex \slurHalfDashed -@funindex slurHalfDashed @funindex \slurHalfSolid -@funindex slurHalfSolid @cindex Bogen, halb gestrichelt, halb durchgehend Bögen können auch halb gestrichelt (die erste Hälfte gestrichelt, @@ -729,34 +708,36 @@ die zweite Hälfte durchgehend) erstellt werden, oder als halb durchgehend (die erste Hälfte durchgehend, die zweite Hälfte gestrichelt: -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurHalfDashed -g4( e c2) -\slurHalfSolid -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurHalfDashed + g4( e c2) + \slurHalfSolid + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @funindex \slurDashPattern -@funindex slurDashPattern @cindex Bogen, Strichelung definieren Eigene Muster für die Strichelung können definiert werden: -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurDashPattern #0.7 #0.75 -g4( e c2) -\slurDashPattern #0.5 #2.0 -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurDashPattern #0.7 #0.75 + g4( e c2) + \slurDashPattern #0.5 #2.0 + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @funindex \slurUp -@funindex slurUp @predefined @code{\slurUp}, @@ -816,17 +797,16 @@ Ein Phrasierungsbogen verbindet Noten und wird verwendet, um einen musikalischen Ausdruck anzuzeigen. Er wird mit den Befehlen @code{\(} und @code{\)} eingegeben. -@lilypond[verbatim,quote,relative=2] -c4\( d( e) f( -e2) d\) +@lilypond[verbatim,quote] +\relative { + c''4\( d( e) f( + e2) d\) +} @end lilypond @funindex \phrasingSlurUp -@funindex phrasingSlurUp @funindex \phrasingSlurDown -@funindex phrasingSlurDown @funindex \phrasingSlurNeutral -@funindex phrasingSlurNeutral Im typographischen Sinne verhalten sich Phrasierungsbögen genauso wie Legatobögen. Sie werden aber als eigene Objekte behandelt. Ein @@ -844,12 +824,9 @@ Notensystems gesetzt werden, siehe Simultane oder überlappende Phrasierungsbögen sind nicht erlaubt. -@funindex phrasingSlurDashed @funindex \phrasingSlurDashed @funindex \phrasingSlurDotted -@funindex phrasingSlurDotted @funindex \phrasingSlurSolid -@funindex phrasingSlurSolid @cindex Phrasierungsbögen, gestrichelt @cindex gestrichelter Phrasierungsbogen @cindex Phrasierungsbögen, gepunktet @@ -858,20 +835,21 @@ erlaubt. Phrasierungsbögen können durchgehend, gepunktet oder gestrichelt dargestellt werden. Standard ist der durchgehende Bogen: -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurDashed -g4\( e c2\) -\phrasingSlurDotted -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurDashed + g4\( e c2\) + \phrasingSlurDotted + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond funindex phrasingSlurHalfDashed @funindex \phrasingSlurHalfDashed @funindex \phrasingSlurHalfSolid -@funindex phrasingSlurHalfSolid @cindex Phrasierungsbogen, halb durchgehend, halb gestrichelt @cindex Bogen, halb durchgehend, halb gestrichelt @@ -881,30 +859,33 @@ werden (die erste Hälfte gestrichelt, die zweite Hälfte durchgehend, oder halb durchgehend (die erste Hälfte durchgehend, die zweite gestrichelt): -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurHalfDashed -g4\( e c2\) -\phrasingSlurHalfSolid -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurHalfDashed + g4\( e c2\) + \phrasingSlurHalfSolid + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond @funindex \phrasingSlurDashPattern -@funindex phrasingSlurDashPattern @cindex Phrasierungsbogen, Strichelmuster definieren Eigene Strichelmuster für Phrasierungsbögen können definiert werden: -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurDashPattern #0.7 #0.75 -g4\( e c2\) -\phrasingSlurDashPattern #0.5 #2.0 -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurDashPattern #0.7 #0.75 + g4\( e c2\) + \phrasingSlurDashPattern #0.5 #2.0 + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond Strichelmusterdefinitionen für Phrasierungsbögen haben die @@ -947,19 +928,18 @@ Referenz der Interna: @cindex Atemzeichen @cindex Pausenzeichen @funindex \breathe -@funindex breathe Atemzeichen werden mit dem Befehl @code{\breathe} eingegeben. -@lilypond[verbatim,quote,relative=2] -c2. \breathe d4 +@lilypond[verbatim,quote] +{ c''2. \breathe d''4 } @end lilypond Ein Atemzeichen bezeichnet gleichzeitig das Ende eines automatischen Balkens. Um das Verhalten zu verändern siehe @ref{Manuelle Balken}. -@lilypond[verbatim,quote,relative=2] -c8 \breathe d e f g2 +@lilypond[verbatim,quote] +\relative { c''8 \breathe d e f g2 } @end lilypond Musikalische Zeichen für Atemzeichen in Alter Notation, auch @@ -1005,7 +985,6 @@ Referenz der Interna: @cindex Glissando, nach unten @cindex Gleiten nach oben/unten @funindex \bendAfter -@funindex bendAfter Gleiten nach oben und unten kann mit dem Befehl @code{\bendAfter} @@ -1014,13 +993,15 @@ Plus oder Minus (nach oben bzw. nach unten) angezeigt. Die Zahl zeigt die Intervallgröße an, über die sich das Glissando @emph{nach} der Note erstreckt. -@lilypond[verbatim,quote,relative=2] -c2\bendAfter #+4 -c2\bendAfter #-4 -c2\bendAfter #+6.5 -c2\bendAfter #-6.5 -c2\bendAfter #+8 -c2\bendAfter #-8 +@lilypond[verbatim,quote] +\relative c'' { + c2\bendAfter #+4 + c2\bendAfter #-4 + c2\bendAfter #+6.5 + c2\bendAfter #-6.5 + c2\bendAfter #+8 + c2\bendAfter #-8 +} @end lilypond @snippets @@ -1057,7 +1038,6 @@ Triller. @cindex Glissando @funindex \glissando -@funindex glissando Ein @notation{Glissando} wird mit dem Befehl @code{\glissando} auf eine Note folgend notiert: @@ -1104,69 +1084,66 @@ supported. @cindex Gebrochene Akkorde @cindex Akkord, gebrochen @funindex \arpeggio -@funindex arpeggio @funindex \arpeggioArrowUp -@funindex arpeggioArrowUp @funindex \arpeggioArrowDown -@funindex arpeggioArrowDown @funindex \arpeggioNormal -@funindex arpeggioNormal Ein @notation{Arpeggio} als Zeichen, dass ein Akkord gebrochen gespielt werden soll, kann mit dem Befehl @code{\arpeggio} hinter der Akkord-Konstruktion erzeugt werden. -@lilypond[verbatim,quote,relative=1] -1\arpeggio +@lilypond[verbatim,quote] +\relative { 1\arpeggio } @end lilypond Unterschiedliche Arpeggio-Typen können benutzt werden. @code{\arpeggioNormal} stellt wieder das normale Verhalten her: -@lilypond[verbatim,quote,relative=1] -2\arpeggio +@lilypond[verbatim,quote] +\relative { + 2\arpeggio -\arpeggioArrowUp -2\arpeggio + \arpeggioArrowUp + 2\arpeggio -\arpeggioArrowDown -2\arpeggio + \arpeggioArrowDown + 2\arpeggio -\arpeggioNormal -2\arpeggio + \arpeggioNormal + 2\arpeggio +} @end lilypond @cindex Arpeggio-Symbole, besondere @cindex besondere Arpeggio-Symbole @funindex \arpeggioBracket -@funindex arpeggioBracket @funindex \arpeggioParenthesis -@funindex arpeggioParenthesis @funindex \arpeggioParenthesisDashed -@funindex arpeggioParenthesisDashed Besondere Arpeggios mit Klammern können erstellt werden: -@lilypond[verbatim,quote,relative=1] -2 +@lilypond[verbatim,quote] +\relative { + 2 -\arpeggioBracket -2\arpeggio + \arpeggioBracket + 2\arpeggio -\arpeggioParenthesis -2\arpeggio + \arpeggioParenthesis + 2\arpeggio -\arpeggioParenthesisDashed -2\arpeggio + \arpeggioParenthesisDashed + 2\arpeggio -\arpeggioNormal -2\arpeggio + \arpeggioNormal + 2\arpeggio +} @end lilypond Die @code{dash}-Eigenschaft der Arpeggioklammern werden von -der @code{'dash-details}-Eigenschaft kontrolliert, die +der @code{'dash-definition}-Eigenschaft kontrolliert, die beschrieben ist in @ref{Legatobögen}. Ein Arpeggio kann auch explizit ausgeschrieben werden, indem @@ -1230,11 +1207,8 @@ mehrere Notensysteme. @cindex Triller @funindex \trill -@funindex trill @funindex \startTrillSpan -@funindex startTrillSpan @funindex \stopTrillSpan -@funindex stopTrillSpan Kurze Triller ohne eine Dauer werden mit dem Befehl @code{\trill} notiert, siehe auch @@ -1244,22 +1218,26 @@ Längere Triller mit einer Dauer werden mit den Befehlen @code{\startTrillSpan} zu Beginn und @code{\stopTrillSpan} am Ende erstellt. -@lilypond[verbatim,quote,relative=2] -d1\startTrillSpan -d1 -c2\stopTrillSpan -r2 +@lilypond[verbatim,quote] +\relative { + d''1\startTrillSpan + d1 + c2\stopTrillSpan + r2 +} @end lilypond Ein Triller-Strekcer, der über einen Zeilenumbruch geht, beginnt genau über der ersten Note auf der neue Zeile erneut. -@lilypond[ragged-right,verbatim,quote,relative=2] -d1\startTrillSpan -\break -d1 -c2\stopTrillSpan -r2 +@lilypond[ragged-right,verbatim,quote] +\relative { + d''1\startTrillSpan + \break + d1 + c2\stopTrillSpan + r2 +} @end lilypond Aufeinanderfolgende Trillerstrecker funktieren ohne einen @@ -1278,28 +1256,31 @@ Triller können auch mit Vorschlägen kombiniert werden. Die Syntax für diese Konstruktion und die Methode, um die Position der Vorschläge präzise zu positionieren, wird gezeigt in @ref{Verzierungen}. -@lilypond[verbatim,quote,relative=2] -d1~\afterGrace -d1\startTrillSpan { c32[ d]\stopTrillSpan } -c2 r2 +@lilypond[verbatim,quote] +\relative { + d''1~\afterGrace + d1\startTrillSpan { c32[ d]\stopTrillSpan } + c2 r2 +} @end lilypond @cindex Triller mit Tonhöhe @funindex \pitchedTrill -@funindex pitchedTrill Triller, die auf einer bestimmten Note ausgeführt werden sollen, können mit dem Befehl @code{pitchedTrill} notiert werden. Das erste Argument ist die Hauptnote, das zweite die Note, auf der getrillert wird. Sie wird als Note ohne Hals in Klammern ausgegeben. -@lilypond[verbatim,quote,relative=2] -\pitchedTrill -d2\startTrillSpan fis -d2 -c2\stopTrillSpan -r2 +@lilypond[verbatim,quote] +\relative { + \pitchedTrill + d''2\startTrillSpan fis + d2 + c2\stopTrillSpan + r2 +} @end lilypond @cindex Triller mit Tonhöhe und Versetzungszeichen @@ -1309,19 +1290,21 @@ Aufeinanderfolgende Versetzungszeichen der selben Note im selben Takt müssen selbst hinzugefügt werden. Nur das Versetzungszeichen des ersten Trillers mit Tonhöhe innerhalb eines Taktes wird ausgegeben. -@lilypond[verbatim,quote,relative=2] -\pitchedTrill -eis4\startTrillSpan fis -eis4\stopTrillSpan -\pitchedTrill -eis4\startTrillSpan cis -eis4\stopTrillSpan -\pitchedTrill -eis4\startTrillSpan fis -eis4\stopTrillSpan -\pitchedTrill -eis4\startTrillSpan fis! -eis4\stopTrillSpan +@lilypond[verbatim,quote] +\relative { + \pitchedTrill + eis''4\startTrillSpan fis + eis4\stopTrillSpan + \pitchedTrill + eis4\startTrillSpan cis + eis4\stopTrillSpan + \pitchedTrill + eis4\startTrillSpan fis + eis4\stopTrillSpan + \pitchedTrill + eis4\startTrillSpan fis! + eis4\stopTrillSpan +} @end lilypond @predefined diff --git a/Documentation/de/notation/fretted-strings.itely b/Documentation/de/notation/fretted-strings.itely index 58e9539e72..e5120acb6a 100644 --- a/Documentation/de/notation/fretted-strings.itely +++ b/Documentation/de/notation/fretted-strings.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.30" +@c \version "2.19.28" @c Translators: Till Paala @@ -107,10 +107,10 @@ Die Nummer der Saite, auf der gespielt werden soll, kann angezeigt werden, indem @code{\@var{Zahl}} an eine Note gehängt wird: -@lilypond[verbatim,quote,relative=0] +@lilypond[verbatim,quote,fragment] \clef "treble_8" c4\5 e\4 g2\3 -1 +1 @end lilypond Wenn Fingersatz und Saitennummer zusammen benutzt werden, wird @@ -120,7 +120,7 @@ Akkord auftreten: Fingersatz, der außen an einen Akkord oder an einzelne Noten @emph{außerhalb} eines Akkords gehängt wird, wird nach anderen Regeln positioniert. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef "treble_8" g4\3-0 g-0\3 @@ -176,7 +176,7 @@ und darin den @code{TabVoice}-Kontext benutzt. Ein kalligraphischer Tabulaturschlüssel wird automatisch hinzugefügt. @lilypond[quote,ragged-right,verbatim] -\new TabStaff \relative c' { +\new TabStaff \relative { a,8 a' a d,8 a' a } @@ -191,7 +191,7 @@ symbols = { c4-.^"Allegro" d( e) f4-.\f g a^\fermata \mark \default - c8_.\<\( c16 c~ c2\! + c8_.\<\( c16 c~ 2\! c'2.\prall\) } @@ -204,7 +204,6 @@ symbols = { @end lilypond @funindex \tabFullNotation -@funindex tabFullNotation Wenn alle musikalischen Symbole, die in der traditionellen Notation eingesetzt werden, auch in der Tabulatur gedruckt werden sollen, muss @@ -218,7 +217,7 @@ symbols = { c4-.^"Allegro" d( e) f4-.\f g a^\fermata \mark \default - c8_.\<\( c16 c~ c2\! + c8_.\<\( c16 c~ 2\! c'2.\prall\) } @@ -251,14 +250,14 @@ indem @code{restrainOpenStrings} auf @code{#t} gesetzt wird. @lilypond[quote,ragged-right,verbatim] \layout { \omit Voice.StringNumber } \new StaffGroup << - \new Staff \relative c { + \new Staff \relative { \clef "treble_8" \time 2/4 c16 d e f g4 c,16\5 d\5 e\4 f\4 g4\4 c,16 d e f g4 } - \new TabStaff \relative c { + \new TabStaff \relative { c16 d e f g4 c,16\5 d\5 e\4 f\4 g4\4 \set TabStaff.minimumFret = #5 @@ -287,8 +286,8 @@ Akkordwiederholungen gewünscht sind. Der Befehl ist so wichtig, dass er durch @code{\tabChordRepeats} zur Verfügung gestellt wird. @lilypond[quote,verbatim] -guitar = \relative c' { - r8 ~ q4 q8~ q q4 +guitar = \relative { + r8 ~ q4 q8~ 8 q4 } \new StaffGroup << @@ -306,10 +305,10 @@ Bindestriche über einen Zeilenumbruch werden standardmäßig in Klammern gesetzt. Das gilt auch für die zweite Klammer einer Wiederholung. @lilypond[quote,ragged-right,verbatim] -ties = \relative c' { +ties = \relative { \repeat volta 2 { - e2. f4~ - f2 g2~ + e'2. f4~ + 2 g2~ } \alternative { { g4 f2. } @@ -346,10 +345,10 @@ Der Befehl @code{\hideSplitTiedTabNotes} hebt das Verhalten auf, dass Bundnummern in Klammern gesetzt werden: @lilypond[quote,ragged-right,verbatim] -ties = \relative c' { +ties = \relative { \repeat volta 2 { - e2. f4~ - f2 g2~ } + e'2. f4~ + 2 g2~ } \alternative { { g4 f2. } { g4\repeatTie c,2. } @@ -560,15 +559,15 @@ geschrieben ist: \omit StringNumber } { \clef "bass_8" - \relative c, { - c4 d e f + \relative { + c,4 d e f } } \new TabStaff \with { stringTunings = #bass-tuning } { - \relative c, { - c4 d e f + \relative { + c,4 d e f } } >> @@ -581,7 +580,6 @@ in der EADGHE-Stimmung. Andere vordefinierte Stimmung sind: @code{banjo-open-g-tuning}. Die vordefinierten Stimmungen finden sich in @file{ly/string-tunings-init.ly}. -@funindex stringTuning @funindex \stringTuning @cindex Tabulatur, eigene Saitenstimmung @cindex Eigene Saitenstimmung, Tabulatur @@ -794,7 +792,6 @@ Barré kann hinzugefügt werden: @cindex fret (Bunddiagramme) @cindex Ukulele -@funindex fret-diagram @funindex \fret-diagram Die Größe des Bunddiagrammes und die Anzahl der Bünde im Diagramm @@ -884,7 +881,6 @@ Die Größe und Position der Punkte kann geändert werden: @cindex fret-diagram-terse-Markup @cindex Bunddiagramme, knapper Stil -@funindex fret-diagram-terse @funindex \fret-diagram-terse Die Beschriftungsfunktion @code{fret-diagram-terse} (knappe Version) @@ -965,7 +961,6 @@ mit @code{\override}-Befehlen angegeben werden. @cindex Kapo @cindex Capo -@funindex fret-diagram-verbose @funindex \fret-diagram-verbose Die Beschriftungsfunktion @code{fret-diagram-verbose} @@ -1222,7 +1217,6 @@ oder im Akkordmodus notiert werden (siehe auch @cindex Bunddiagramme und Akkordbezeichnungen @funindex ChordNames -@funindex chordmode @funindex \chordmode Oft wird sowohl eine Akkordbezeichnung als ein Bunddiagramm @@ -1370,8 +1364,6 @@ mychords = \chordmode { @cindex Akkordformen für Bundinstrumente @funindex \addChordShape -@funindex addChordShape -@funindex storePredefinedDiagram @funindex \storePredefinedDiagram Zusätzlich zu Bunddiagrammen speichert LilyPond auch eine interne @@ -1493,9 +1485,7 @@ um die Noten zu spielen. >> @end lilypond -@funindex predefinedFretboardsOff @funindex \predefinedFretboardsOff -@funindex predefinedFretboardsOn @funindex \predefinedFretboardsOn Da in den Standardeinstellungen keine vordefinierten Diagramme @@ -1634,7 +1624,6 @@ cindex Fingersatz der rechten Hand, Bundinstrumente @cindex rechte Hand, Fingersatz für bundierte Saiteninstrumente @cindex rechte Hand, Fingersatz für Bundinstrumente -@funindex rightHandFinger @funindex \rightHandFinger Fingersatz für die rechte Hand @var{p-i-m-a} @@ -1643,14 +1632,14 @@ muss mit @code{\rightHandFinger}, gefolgt von einer Zahl, notiert werden. @warning{Wenn die Zahl in Scheme-Notation eingegeben wird, muss darauf geachtet werden, ein Leerzeichen anzuhängen vor dem schließenden @code{>} o. Ä.} -@lilypond[quote,verbatim,relative=0] +@lilypond[quote,verbatim,fragment] \clef "treble_8" c4\rightHandFinger #1 e\rightHandFinger #2 g\rightHandFinger #3 -c\rightHandFinger #4 -1 +c'\rightHandFinger #4 +1 @end lilypond Zur Erleichterung kann der Befehl @code{\rightHandFinger} zu ein paar @@ -1710,14 +1699,16 @@ werden. Das Beispiel zeigt, wie man Griff- und Barréposition notieren kann. -@lilypond[quote,ragged-right,verbatim,relative=0] -\clef "treble_8" -b16 d g b e -\textSpannerDown -\override TextSpanner.bound-details.left.text = #"XII " -g16\startTextSpan -b16 e g e b g\stopTextSpan -e16 b g d +@lilypond[quote,ragged-right,verbatim,fragment] +\relative { + \clef "treble_8" + b,16 d g b e + \textSpannerDown + \override TextSpanner.bound-details.left.text = #"XII " + g16\startTextSpan + b16 e g e b g\stopTextSpan + e16 b g d +} @end lilypond @@ -1750,10 +1741,10 @@ oder Flageoletttöne anzuzeigen. Flageoletttöne werden normalerweise mit einem Text erklärt. @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \clef "treble_8" \override Staff.NoteHead.style = #'harmonic-mixed - d^\markup { \italic { \fontsize #-2 { "harm. 12" }}} 1 + d'^\markup { \italic { \fontsize #-2 { "harm. 12" }}} 1 } @end lilypond @@ -1761,7 +1752,7 @@ Gedämpfte oder gestoppte Noten werden in normalen und Tabulatur-Systemen unterstützt: @lilypond[quote,ragged-right,verbatim] -music = \relative c' { +music = \relative { < a\3 \deadNote c\2 a'\1 >4 < b\3 \deadNote d\2 b'\1 > < c\3 \deadNote e\2 c'\1 > @@ -1818,7 +1809,6 @@ Schnipsel: @unnumberedsubsubsec Powerakkorde anzeigen @translationof Indicating power chords -@funindex powerChords @funindex \powerChords @cindex Powerakkorde @@ -1831,11 +1821,11 @@ gesetzt werden: ChordsAndSymbols = { \chordmode { \powerChords - e,,1:1.5 - a,,1:1.5.8 + e,,1:5 + a,,1:5.8 \set minimumFret = #8 - c,1:1.5 - f,1:1.5.8 + c,1:5 + f,1:5.8 } \set minimumFret = #5 1 @@ -1864,8 +1854,8 @@ normalen Akkord-Modifikatoren verwendet wird: mixedChords = \chordmode { c,1 \powerChords - b,,1:1.5 - fis,,1:1.5.8 + b,,1:5 + fis,,1:5.8 g,,1:m } \score { diff --git a/Documentation/de/notation/input.itely b/Documentation/de/notation/input.itely index 5b159b1a05..e4ed6b1483 100644 --- a/Documentation/de/notation/input.itely +++ b/Documentation/de/notation/input.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.6" +@c \version "2.19.22" @c Translators: Till Paala @@ -388,7 +388,7 @@ die globalen Einstellungen für das ganze @qq{Buch}. Wenn mehr als eine derartige Definition desselben Typs auf oberster Ebene angegeben wird, hat die spätere Vorrang. Für Einzelheiten, wie dadurch die @code{\layout}-Umgebung beeinflusst wird, siehe -@ref{Die \layout-Umgebung}. +@ref{Die layout-Umgebung}. @item Ein direkter Scheme-Ausdruck, wie etwa @@ -555,7 +555,7 @@ Handbuch zum Lernen: @rlearning{Wie eine LilyPond-Eingabe-Datei funktioniert}. Notationsreferenz: -@ref{The \layout block}. +@ref{Die layout-Umgebung}. @node Titel @@ -613,10 +613,10 @@ einer @bs{}@code{score}-Umgebung verwenden wollen.} } \score { - \new Staff \relative g, { + \new Staff \relative { \clef bass \key g \major - \repeat unfold 2 { g16( d' b') a b d, b' d, } | + \repeat unfold 2 { g,16( d' b') a b d, b' d, } | \repeat unfold 2 { g,16( e' c') b c e, c' e, } | } \header { @@ -625,7 +625,7 @@ einer @bs{}@code{score}-Umgebung verwenden wollen.} } \score { - \new Staff \relative b { + \new Staff \relative { \clef bass \key g \major \partial 16 b16 | @@ -850,8 +850,8 @@ handelt. @lilypond[papersize=a8landscape] \book { \score { - \relative c' { - c4 d e f + \relative { + c'4 d e f } } } @@ -867,8 +867,8 @@ höchster Ebene schreibt. tagline = "... music notation for Everyone" } \score { - \relative c' { - c4 d e f + \relative { + c'4 d e f } } } @@ -1325,7 +1325,7 @@ Tagline und Copyright gezeigt wird. @lilypond[verbatim,quote,ragged-right,papersize=a8] \book { \header { copyright = \markup { "Copyright 1970" } } - \relative c' { + \relative { a'4-\footnote #'(-3 . 0) \markup { \bold Forte } \f -\footnote #'(0 . 1.5) \markup { Ein Bogen } ( b8)-\footnote #'(0 . -2) \markup { Balken } [ e] @@ -1349,7 +1349,7 @@ den Befehl @code{\auto-footnote}: \book { \header { tagline = ##f } \markup { \auto-footnote "Eine einfache Melodie" \italic "Von mir" } - \relative c' { + \relative { a'4 b8 e c4 d } } @@ -1417,7 +1417,7 @@ Position der Fußnotentexte zu Tagline und Copyright anzeigen: @lilypond[verbatim,quote,ragged-right,papersize=a8] \book { \header { tagline = ##f } - \relative c' { + \relative { a'4-\footnote \markup { \teeny 1 } #'(-3 . 0) \markup { 1. \bold Forte } \f @@ -1455,7 +1455,7 @@ annotiert: \book { \header { tagline = ##f } \markup { "Eine einfache Melodie" \footnote "*" \italic "* Von mir" } - \relative c' { + \relative { a'4 b8 e c4 d4 } } @@ -1631,7 +1631,7 @@ einer Oper in das Inhaltsverzeichnis aufzunehmen: } tocAct = -#(define-music-function (parser location text) (markup?) +#(define-music-function (text) (markup?) (add-toc-item! 'tocActMarkup text)) @end verbatim @@ -1646,7 +1646,7 @@ tocAct = } tocAct = -#(define-music-function (parser location text) (markup?) +#(define-music-function (text) (markup?) (add-toc-item! 'tocActMarkup text)) \book { @@ -1857,7 +1857,7 @@ ohne dass man Änderungen an den Noten vornehmen muss. Wenn Notenabschnitt in Variablen definiert werden, können sie an unterschiedlichen Stellen in der Partitur eingesetzt werden, -siehe auch @rlearning{Stücke durch Bezeichner organisieren}. Zum +siehe auch @rlearning{Stücke durch Variablen organisieren}. Zum Beispiel enthält eine Vokalpartitur für ein @notation{a cappella} Stück oft einen Klavierauszug, der das Einüben einfacher macht. Der Klavierauszug enthält die gleichen Noten, sodass man sie nur @@ -1866,10 +1866,10 @@ System kombiniert werden, siehe @ref{Automatische Kombination von Stimmen}. Hier ein Beispiel: @lilypond[verbatim,quote] -sopranoMusic = \relative c'' { a4 b c b8( a) } -altoMusic = \relative g' { e4 e e f } -tenorMusic = \relative c' { c4 b e d8( c) } -bassMusic = \relative c' { a4 gis a d, } +sopranoMusic = \relative { a'4 b c b8( a) } +altoMusic = \relative { e'4 e e f } +tenorMusic = \relative { c'4 b e d8( c) } +bassMusic = \relative { a4 gis a d, } allLyrics = \lyricmode {King of glo -- ry } << \new Staff = "Soprano" \sopranoMusic @@ -1972,8 +1972,8 @@ Im folgenden Beispiel erscheinen zwei Versionen der Noten, eine zeigt Triller in normaler Notation, die andere zeigt sie ausgeschrieben: @lilypond[verbatim,quote] -music = \relative g' { - g8. c32 d +music = \relative { + g'8. c32 d \tag #'trills { d8.\trill } \tag #'expand { \repeat unfold 3 { e32 d } } c32 d @@ -1992,8 +1992,8 @@ Entsprechend können auch Abschnitte ausgeschlossen werden; das erfordert manchmal weniger Schreibarbeit: @lilypond[verbatim,quote] -music = \relative g' { - g8. c32 d +music = \relative { + g'8. c32 d \tag #'trills { d8.\trill } \tag #'expand {\repeat unfold 3 { e32 d } } c32 d @@ -2092,7 +2092,7 @@ das ursprüngliche @code{\test} seine Bedeutung behält. @seealso Handbuch zum Lernen: -@rlearning{Stücke durch Bezeichner organisieren}. +@rlearning{Stücke durch Variablen organisieren}. Notationsreferenz: @ref{Automatische Kombination von Stimmen}, @@ -2131,13 +2131,13 @@ Partitur unterschiedliche Editionen zu erstellen bzw. Standardeinstellungen für eine ganze Anzahl von Partituren wiederzuverwenden, indem man einfach die entsprechende Einstellungsdatei angibt. -Diese Technik funktioniert auch gut für globale Formatierungen, wie behandelt -in @rlearning{Globale Formatierung}. +Diese Technik funktioniert auch gut für Formatvorlagen, wie +in @rlearning{Formatvorlagen} behandelt. @seealso Handbuch zum Lernen: -@rlearning{Stücke durch Bezeichner organisieren}, -@rlearning{Globale Formatierung}. +@rlearning{Stücke durch Variablen organisieren}, +@rlearning{Formatvorlagen}. Notationsreferenz: @ref{LilyPond-Dateien einfügen}. @@ -2202,6 +2202,17 @@ Heir ein Beispiel mit Kyrilliza, hebräischem und portugiesischem Text: @lilypond[quote] %c No verbatim here as the code does not display correctly in PDF +% Font settings for Cyrillic and Hebrew +% Linux Libertine fonts contain Cyrillic and Hebrew glyphs. +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + #:sans "Linux Biolinum O,sans-serif" + #:typewriter "Linux Libertine Mono O,monospace" + )) +} + % Cyrillic bulgarian = \lyricmode { Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон. @@ -2217,8 +2228,8 @@ portuguese = \lyricmode { à vo -- cê uma can -- ção legal } -\relative c' { - c2 d e f g f e +\relative { + c'2 d e f g f e } \addlyrics { \bulgarian } \addlyrics { \hebrew } @@ -2260,13 +2271,13 @@ im Gesangstext und als normaler Text außerhalb der Partitur. @lilypond[quote,verbatim] \score { - \relative c'' { - c1 \mark \markup { \char ##x03EE } + \relative { + c''1 \mark \markup { \char ##x03EE } c1_\markup { \tiny { \char ##x03B1 " to " \char ##x03C9 } } } \addlyrics { O \markup { \concat { Ph \char ##x0153 be! } } } } -\markup { "Copyright 2008--2012" \char ##x00A9 } +\markup { "Copyright 2008--2015" \char ##x00A9 } @end lilypond @cindex Copyright-Zeichen @@ -2425,12 +2436,14 @@ kontrollieren. Hiermit werden alle Ereignisse, auch Tempo- und Instrumentenwechsel ausgelassen. Man muss also sehr genau darauf achten, dass nichts unerwartetes geschieht. -@lilypond[quote,relative=2,ragged-right,verbatim] -c8 d -\set Score.skipTypesetting = ##t -e8 e e e e e e e -\set Score.skipTypesetting = ##f -c8 d b bes a g c2 +@lilypond[quote,ragged-right,verbatim] +\relative { + c''8 d + \set Score.skipTypesetting = ##t + e8 e e e e e e e + \set Score.skipTypesetting = ##f + c8 d b bes a g c2 +} @end lilypond In polyphoner Notation wirkt sich @code{Score.skipTypesetting} auf @@ -2453,7 +2466,7 @@ Das Standardausgabeformat für gedruckte Partituren ist PDF (Portable Document Forma) und PS (PostScript). SVG (Scalable Vector Graphics), EPS (Encapsulated PostScript) und PNG (Portable Network Graphics) gibt es auch als Ausgabeformate über die -Kommandozeile. Siehe @rprogram{Optionen auf der Kommandozeile für lilypond}. +Kommandozeile. Siehe @rprogram{Grundlegende Optionen auf der Kommandozeile für LilyPond}. @node Die Notationsschriftart verändern @@ -2526,7 +2539,7 @@ realistischere MIDI-Ausgabe mit einem @ref{Artikuliere-Skript} erzeugt werden. Die MIDI-Ausgabe benötigt einen Kanal für jedes System und reserviert -Kanala 10 für Schlagzeug. Es gibt nur 16 MIDI-Kanäle pro Gerät, +Kanal 10 für Schlagzeug. Es gibt nur 16 MIDI-Kanäle pro Gerät, sodass MIDI-Kanäle mehrfach benutzt werden, wenn eine Partitur mehr als 15 Notensysteme hat. @@ -2873,8 +2886,8 @@ Standardanweisungen auf: \set Staff.midiInstrument = #"cello" \set Score.dynamicAbsoluteVolumeFunction = #myDynamics \new Voice { - \relative c'' { - a4\pp b c-\rfz + \relative { + a'4\pp b c-\rfz } } } @@ -2917,17 +2930,17 @@ auf den Bereich zwischen 0.2 und 0.5 eingeschränkt. \key g \major \time 2/2 \set Staff.midiInstrument = #"flute" - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 + \new Voice \relative { + r2 g''\mp g fis~ + 4 g8 fis e2~ + 4 d8 cis d2 } } \new Staff { \key g \major \set Staff.midiInstrument = #"clarinet" - \new Voice \relative c'' { - b1\p a2. b8 a + \new Voice \relative { + b'1\p a2. b8 a g2. fis8 e fis2 r } @@ -2968,10 +2981,10 @@ diese Einstellung korrekt funktioniert. \set Staff.midiInstrument = #"flute" \set Staff.midiMinimumVolume = #0.7 \set Staff.midiMaximumVolume = #0.9 - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 + \new Voice \relative { + r2 g''\mp g fis~ + 4 g8 fis e2~ + 4 d8 cis d2 } } \new Staff { @@ -2979,8 +2992,8 @@ diese Einstellung korrekt funktioniert. \set Staff.midiInstrument = #"clarinet" \set Staff.midiMinimumVolume = #0.3 \set Staff.midiMaximumVolume = #0.6 - \new Voice \relative c'' { - b1\p a2. b8 a + \new Voice \relative { + b'1\p a2. b8 a g2. fis8 e fis2 r } @@ -3041,17 +3054,17 @@ Lautstärkewerte, die denen des vorigen Beispiels entsprechen. \time 2/2 \set Score.instrumentEqualizer = #my-instrument-equalizer \set Staff.midiInstrument = #"flute" - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 + \new Voice \relative { + r2 g''\mp g fis~ + 4 g8 fis e2~ + 4 d8 cis d2 } } \new Staff { \key g \major \set Staff.midiInstrument = #"clarinet" - \new Voice \relative c'' { - b1\p a2. b8 a + \new Voice \relative { + b'1\p a2. b8 a g2. fis8 e fis2 r } diff --git a/Documentation/de/notation/keyboards.itely b/Documentation/de/notation/keyboards.itely index eb262ad221..253bfee083 100644 --- a/Documentation/de/notation/keyboards.itely +++ b/Documentation/de/notation/keyboards.itely @@ -10,7 +10,7 @@ @c Translators: Till Paala -@c \version "2.17.6" +@c \version "2.19.21" @node Tasteninstrumente und andere Instrumente mit mehreren Systemen @section Tasteninstrumente und andere Instrumente mit mehreren Systemen @@ -118,7 +118,7 @@ werden, siehe hierzu @item Viele der Optimierungen, die für Tastenmusik nötig sein können, sind demonstriert in -@rlearning{Beispiele aus dem Leben}. +@rlearning{Beispiel aus dem Leben}. @item Unsichtbare Noten können eingesetzt werden, um Überbindungen zwischen Stimmen zu setzen, siehe @@ -130,12 +130,12 @@ können, sind demonstriert in @c @snippets @c @lilypondfile[verbatim,quote,texidoc,doctitle] @c {forcing-visibility-of-systems-with-multi-bar-rests-when-using-\Staff \RemoveEmptyStaves.ly} -@c http://lsr.dsi.unimi.it/LSR/Item?u=1&id=312 +@c http://lsr.di.unimi.it/LSR/Item?u=1&id=312 @seealso Handbuch zum Lernen: -@rlearning{Beispiele aus dem Leben}, +@rlearning{Beispiel aus dem Leben}, @rlearning{Andere Benutzung von Optimierungen}. Notationsreferenz: @@ -169,7 +169,6 @@ Referenz der Interna: @cindex Balken zwischen Systemen @funindex \change -@funindex change Stimmen können mit dem Befehl @@ -289,7 +288,6 @@ Balken einsetzen. @cindex Wechsel des Systems, automatisch @funindex \autochange -@funindex autochange @funindex PianoStaff Stimmen können angewiesen werden, automatisch zwischen dem @@ -320,7 +318,6 @@ wird die Richtung auch über Pausen hinweg im Voraus bestimmt. @cindex automatischer Systemwechsel und relativer Modus @funindex \relative -@funindex relative Ein @code{\relative}-Abschnitt, der sich außerhalb des @code{\autochange}-Abschnittes befindet, hat keinen Einfluss auf die @@ -346,7 +343,7 @@ System gesetzt werden kann: \new Staff = "up" { \new Voice = "melodieEins" { \key g \major - \autochange \relative c' { + \autochange \relative { g8 b a c b d c e d8 r fis, g a2 } @@ -395,19 +392,17 @@ System zugewiesen, auf dem sich ihre erste Note befinden würde. @funindex followVoice @funindex \showStaffSwitch -@funindex showStaffSwitch @funindex \hideStaffSwitch -@funindex hideStaffSwitch Immer, wenn eine Stimme von einem Klaviersystem zu dem anderen wechselt, kann automatisch eine Linie zur Verdeutlichung des Stimmenverlaufs ausgegeben werden: -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim] \new PianoStaff << \new Staff = "one" { \showStaffSwitch - c1 + c'1 \change Staff = "two" b2 a } @@ -494,30 +489,26 @@ Dieser Abschnitt zeigt Eigenheiten der Notation von Klavermusik @cindex U.C. @funindex \sustainOn -@funindex sustainOn @funindex \sustainOff -@funindex sustainOff @funindex \sostenutoOn -@funindex sostenutoOn @funindex \sostenutoOff -@funindex sostenutoOff @funindex \unaCorda -@funindex unaCorda @funindex \treCorde -@funindex treCorde Klaviere (teilweise auch Vibraphone und Celesta) besitzen üblicherweise drei Pedale, das linke oder Haltepedal, das rechte oder Una-corda-Pedal und das Sostenuto-Pedal. Die englischen Begriff hierzu lauten: @notation{sustain}, @notation{sostenuto} und @notation{una corda}. -@lilypond[quote,verbatim,relative=2] -c4\sustainOn d e g -1\sustainOff -c4\sostenutoOn e g c, -1\sostenutoOff -c4\unaCorda d e g -1\treCorde +@lilypond[quote,verbatim] +\relative { + c''4\sustainOn d e g + 1\sustainOff + c4\sostenutoOn e g c, + 1\sostenutoOff + c4\unaCorda d e g + 1\treCorde +} @end lilypond @cindex Pedalbezeichnung, Stile @@ -535,15 +526,17 @@ Text, Klammern oder einer Mischung aus beidem. Das Haltepedal und das Una-corda-Pedal benutzen als Standard die Textdarstellung, während das Sostenuto-Pedal den gemischten Stil benutzt: -@lilypond[quote,verbatim,relative=2] -c4\sustainOn g c2\sustainOff -\set Staff.pedalSustainStyle = #'mixed -c4\sustainOn g c d -d\sustainOff\sustainOn g, c2\sustainOff -\set Staff.pedalSustainStyle = #'bracket -c4\sustainOn g c d -d\sustainOff\sustainOn g, c2 -\bar "|." +@lilypond[quote,verbatim] +\relative { + c''4\sustainOn g c2\sustainOff + \set Staff.pedalSustainStyle = #'mixed + c4\sustainOn g c d + d\sustainOff\sustainOn g, c2\sustainOff + \set Staff.pedalSustainStyle = #'bracket + c4\sustainOn g c d + d\sustainOff\sustainOn g, c2 + \bar "|." +} @end lilypond Die Platzierung der Befehle entspricht der Bewegung der Pedale @@ -671,21 +664,21 @@ Pedal kontrolliert. Vom Spieler aus gesehen von rechts nach links sind die Pedale: D, C und H für die linke und E, F, G und A für die rechte Seite. Die Position des Pedals kann mit Textbeschriftungselementen: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \textLengthOn -cis1_\markup \concat \vcenter { +cis''1_\markup \concat \vcenter { [D \flat C \sharp B|E \sharp F \sharp G A \flat] } -c!1_\markup \concat \vcenter { +c''!1_\markup \concat \vcenter { [ C \natural ] } @end lilypond @noindent oder Pedaldiagrammen angezeigt werden: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \textLengthOn -cis1_\markup { \harp-pedal #"^v-|vv-^" } -c!1_\markup { \harp-pedal #"^o--|vv-^" } +cis''1_\markup { \harp-pedal #"^v-|vv-^" } +c''!1_\markup { \harp-pedal #"^o--|vv-^" } @end lilypond Der @code{\harp-pedal}-Befehl braucht eine Anzahl an Zeichen, von diff --git a/Documentation/de/notation/notation-appendices.itely b/Documentation/de/notation/notation-appendices.itely index 1a14675ecb..a0e4c30173 100644 --- a/Documentation/de/notation/notation-appendices.itely +++ b/Documentation/de/notation/notation-appendices.itely @@ -10,7 +10,7 @@ @c Translators: Till Paala -@c \version "2.16.0" +@c \version "2.19.28" @node Notationsübersicht @appendix Notationsübersicht @@ -405,7 +405,7 @@ Perfekte Quinte @lilypond[line-width=3\cm,noragged-right, notime] \chordmode { \powerChords - c1:1.5 + c1:5 } @end lilypond @@ -419,7 +419,7 @@ Perfekte Quinte, Oktave @lilypond[line-width=3\cm,noragged-right, notime] \chordmode { \powerChords - c1:1.5.8 + c1:5.8 } @end lilypond @@ -1220,7 +1220,7 @@ benutzt werden: @node Liste der Sonderzeichen -+@appendixsec Liste der Sonderzeichen +@appendixsec Liste der Sonderzeichen @translationof List of special characters Folgende Sonderezeichen-Bezeichnungen können benutzt werden, diff --git a/Documentation/de/notation/percussion.itely b/Documentation/de/notation/percussion.itely index 786ba54c4f..02e265c921 100644 --- a/Documentation/de/notation/percussion.itely +++ b/Documentation/de/notation/percussion.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.30" +@c \version "2.19.2" @c Translators: Till Paala @@ -517,7 +517,7 @@ bellstaff = { \drummode { \time 2/4 rb8 rb cb cb16 rb-> ~ | - rb16 rb8 rb16 cb8 cb | + 16 rb8 rb16 cb8 cb | } } @end lilypond diff --git a/Documentation/de/notation/pitches.itely b/Documentation/de/notation/pitches.itely index 70129c81c7..50784f29ac 100644 --- a/Documentation/de/notation/pitches.itely +++ b/Documentation/de/notation/pitches.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.18" +@c \version "2.19.22" @c Translators: Till Paala @@ -63,7 +63,7 @@ für die Note @qq{H} steht. Die Benutzung deutscher Notenbezeichnungen mit der Unterscheidung von b und h ist auch möglich, siehe @ref{Notenbezeichnungen in anderen Sprachen}. Die Notenbezeichnungen @code{c} bis @code{b} -werden in der Oktave unter dem zweigestrichenen C +werden in der Oktave unter dem eingestrichenen C gesetzt. @c don't use c' here. @@ -118,7 +118,6 @@ Schnipsel: @cindex Noteneingabe: relative Oktavbestimmung @funindex \relative -@funindex relative Wenn Oktaven im absoluten Modus notiert, passiert es schnell, eine Note auf der falschen Oktave zu notieren. Mit @@ -166,7 +165,7 @@ Oktave von C zu nehmen. So funktioniert der relative Modus: @lilypond[verbatim,quote] -\relative c { +\relative { \clef bass c d e f g a b c @@ -178,8 +177,8 @@ Oktavversetzungen müssen für alle Intervalle angezeigt werden, die größer als eine Quarte sind. @lilypond[verbatim,quote] -\relative c'' { - c g c f, +\relative { + c'' g c f, c' a, e'' c } @end lilypond @@ -188,7 +187,7 @@ Eine Sequenz ohne ein einziges Oktavänderungszeichen kann aber trotzdem weite Intervalle umfassen: @lilypond[verbatim,quote] -\relative c { +\relative { c f b e a d g c } @@ -198,10 +197,10 @@ Wenn @code{\relative}-Umgebungen geschachtelt werden, gilt der innerste @code{\relative}-Abschnitt. @lilypond[verbatim,quote] -\relative c' { - c d e f - \relative c'' { - c d e f +\relative { + c' d e f + \relative { + c'' d e f } } @end lilypond @@ -224,12 +223,12 @@ Tonhöhen innerhalb eines @code{\transpose}-Abschnitts sind absolut, es sei denn ein @code{\relativ} wird eingefügt. @lilypond[verbatim,quote] -\relative c' { - d e +\relative { + d' e \transpose f g { d e - \relative c' { - d e + \relative { + d' e } } } @@ -246,8 +245,8 @@ relativ zur vorherigen. Betrachten Sie das folgende Beispiel aufmerksam, insbesondere die @code{c}-Noten. @lilypond[verbatim,quote] -\relative c' { - c +\relative { + c' @@ -264,8 +263,8 @@ Quinte, unabhängig von der Anzahl an Halbtönen, die jedes Intervall enthält. @lilypond[verbatim,quote] -\relative c'' { - c2 fis +\relative { + c''2 fis c2 ges b2 eisis b2 feses @@ -326,7 +325,7 @@ Tonhöhe dann im Notenbild dargestellt wird. Eine einfache Tonhöhe wie etwa@tie{}@code{c} bedeutet also immer das eingestrichene C ohne Versetzungszeichen, egal was für Vorzeichen/Tonart oder Schlüssel gesetzt sind. -Mehr Information dazu in @rlearning{Versetzungszeichen und Tonartbezeichnung (Vorzeichen)}.} +Mehr Information dazu in @rlearning{Tonhöhen und Tonartbezeichnungen (Vorzeichen)}.} @cindex Notenbezeichnungen, Deutsch @cindex Notenbezeichnungen, Holländisch @@ -349,8 +348,8 @@ Syntax leitet sich von den holländischen Notenbezeichnungen ab. Um andere Bezeichnungen für Versetzungszeichen zu benutzen, siehe @ref{Notenbezeichnungen in anderen Sprachen}. -@lilypond[verbatim,quote,relative=2] -ais1 aes aisis aeses +@lilypond[verbatim,quote,fragment] +\relative c'' { ais1 aes aisis aeses } @end lilypond Auch die deutschen Varianten @code{as} für @code{aes} und @@ -382,8 +381,8 @@ Versetzungszeichen für Vierteltöne werden durch Anhängen der Endungen Tonhöhenbuchstaben erstellt. Das Beispiel zeigt eine in Vierteltönen aufsteigende Serie vom eingestrichenen C. -@lilypond[verbatim,quote,relative=2] -ceseh1 ces ceh c cih cis cisih +@lilypond[verbatim,quote,fragment] +\relative c'' { ceseh1 ces ceh c cih cis cisih } @end lilypond @@ -417,7 +416,7 @@ Versetzungzeichen von übergebundenen Noten werden nur dann gesetzt, wenn ein neues System begonnen wird: @lilypond[verbatim,quote,relative=2] -cis1~ cis~ +cis1~ 1~ \break cis @end lilypond @@ -440,7 +439,7 @@ Glossar: @rglos{quarter tone}. Handbuch zum Lernen: -@rlearning{Versetzungszeichen und Tonartbezeichnung (Vorzeichen)}. +@rlearning{Tonhöhen und Tonartbezeichnungen (Vorzeichen)}. Notationsreferenz: @ref{Automatische Versetzungszeichen}, @@ -483,8 +482,8 @@ von italienischen Notenbezeichnungen: @lilypond[quote,verbatim] \language "italiano" -\relative do' { - do re mi sib +\relative { + do' re mi sib } @end lilypond @@ -562,8 +561,8 @@ Beide Formen werden jedoch akzeptiert. Genauso gelten auch @code{eeses}@tie{}/@tie{}@code{eses}. In manchen Sprachen sind nur diese Kurzformen definiert. -@lilypond[verbatim,quote,relative=2] -a2 as e es a ases e eses +@lilypond[verbatim,quote,fragment] +\relative c'' { a2 as e es a ases e eses } @end lilypond @@ -629,7 +628,7 @@ Dieser Abschnitt zeigt, wie man Tonhöhen beeinflusst. @menu * Oktavenüberprüfung:: -* Transposition:: +* Transponieren:: * Umkehrung:: * Krebs:: * Modale Transformierungen:: @@ -645,7 +644,6 @@ Dieser Abschnitt zeigt, wie man Tonhöhen beeinflusst. @funindex = @funindex \octaveCheck -@funindex octaveCheck @funindex controlpitch Im relativen Modus geschieht es recht häufig, dass ein @@ -663,8 +661,8 @@ ein @code{d''} anstelle von @code{d'} notiert ist, wie es die Oktavierungskorrektur markiert. @lilypond[verbatim,quote] -\relative c'' { - c2 d='4 d +\relative { + c''2 d='4 d e2 f } @end lilypond @@ -681,8 +679,8 @@ gemeldet, aber die vorigen Note wird nicht verändert. Folgende Noten sind dann relativ zur @var{Kontrolltonhöhe}. @lilypond[verbatim,quote] -\relative c'' { - c2 d +\relative { + c''2 d \octaveCheck c' e2 f } @@ -693,8 +691,8 @@ erste und dritte @code{\octaveCheck}-Überprüfung gibt einen Fehler aus, die zweite dagegen ist erfolgreich: @lilypond[verbatim,quote] -\relative c'' { - c4 f g f +\relative { + c''4 f g f c4 \octaveCheck c' @@ -714,8 +712,8 @@ Referenz der Interna: @rinternals{RelativeOctaveCheck}. -@node Transposition -@unnumberedsubsubsec Transposition +@node Transponieren +@unnumberedsubsubsec Transponieren @translationof Transpose @cindex Transposition @@ -724,7 +722,6 @@ Referenz der Interna: @cindex Tonhöhen, transponieren @funindex \transpose -@funindex transpose Ein musikalischer Ausdruck kann mit dem Befehl @code{\transpose} transponiert werden. Die Syntax lautet: @@ -750,9 +747,9 @@ werden auch die Vorzeichen entsprechend angepasst: @lilypond[verbatim,quote] \transpose d e { - \relative c' { + \relative { \key d \major - d4 fis a d + d'4 fis a d } } @end lilypond @@ -768,9 +765,9 @@ werden: @lilypond[verbatim,quote] \transpose a c' { - \relative c' { + \relative { \key c \major - c4 d e g + c'4 d e g } } @end lilypond @@ -787,7 +784,7 @@ die Musik einen Halbton nach oben. Aber die erste Version gibt als Versetzungszeichen Kreuze aus, die zweite dagegen B-Versetzungszeichen. @lilypond[verbatim,quote] -music = \relative c' { c d e f } +music = \relative { c' d e f } \new Staff { \transpose c cis { \music } \transpose c des { \music } @@ -871,7 +868,6 @@ Des anstelle von e-dreifach-b). @cindex Melodietransformation, Umkehrung @funindex \inversion -@funindex inversion Ein musikalischer Ausdruck kann in seine Umkehrung transformiert und gleichzeitig transponiert werden: @@ -885,7 +881,7 @@ Der @code{@var{mus. Ausdruck}} wird Intervall für Intervall um nach @code{@var{nachTonhöhe}} transponiert. @lilypond[verbatim,quote] -music = \relative c' { c d e f } +music = \relative { c' d e f } \new Staff { \music \inversion d' d' \music @@ -901,7 +897,7 @@ indem sie in eine @code{\relative}-Umgebung eingeschlossen werden.} Notationsreferenz: @ref{Modale Transformierungen}, @ref{Krebs}, -@ref{Transposition}. +@ref{Transponieren}. @node Krebs @@ -912,13 +908,12 @@ Notationsreferenz: @cindex Melodietransformation, Krebs @funindex \retrograde -@funindex retrograde Ein musikalischer Ausdruck kann umgekehrt werden, um im Krebsgang dargestellt zu werden: @lilypond[verbatim,quote] -music = \relative c' { c8. ees16( fis8. a16 b8.) gis16 f8. d16 } +music = \relative { c'8. ees16( fis8. a16 b8.) gis16 f8. d16 } \new Staff { \music @@ -935,7 +930,7 @@ ersetllt werden, indem man @ref{Automatic note splitting} aktiviert. Notationsreferenz: @ref{Modale Transformierungen}, @ref{Umkehrung}, -@ref{Transposition}. +@ref{Transponieren}. @@ -963,7 +958,6 @@ nicht transformiert.} @cindex Melodietransposition, modal @funindex \modalTranspose -@funindex modalTranspose Ein Motiv kann innerhalb einer Skala transponiert werden: @@ -976,8 +970,8 @@ um die Anzahl von Skalenstufen transponiert, die dem Intervall zwischen @code{@var{vonTonhöhe}} und @code{@var{nachTonhöhe}} entspricht. @lilypond[verbatim,quote] -diatonicScale = \relative c' { c d e f g a b } -motif = \relative c' { c8 d e f g a b c } +diatonicScale = \relative { c' d e f g a b } +motif = \relative { c'8 d e f g a b c } \new Staff { \motif @@ -990,8 +984,8 @@ Eine absteigende Skala beliebiger Länge und mit beliebigen Intervallen kann definiert werden: @lilypond[verbatim,quote] -pentatonicScale = \relative c' { ges aes bes des ees } -motif = \relative c' { ees8 des ges,4 } +pentatonicScale = \relative { ges aes bes des ees } +motif = \relative { ees'8 des ges,4 } \new Staff { \motif @@ -1004,8 +998,8 @@ entspricht es der Funktion von @code{\transpose} mit dem Unterschied, dass die Bezeichnungen der eingesetzten Noten definiert werden können: @lilypond[verbatim,quote] -chromaticScale = \relative c' { c cis d dis e f fis g gis a ais b } -motif = \relative c' { c8 d e f g a b c } +chromaticScale = \relative { c' cis d dis e f fis g gis a ais b } +motif = \relative { c'8 d e f g a b c } \new Staff { \motif @@ -1022,7 +1016,6 @@ motif = \relative c' { c8 d e f g a b c } @cindex Melodieumkehrung, modal @funindex \modalInversion -@funindex modalInversion Ein musikalischer Ausdruck kann innerhalb einer definierten Skala um eine Referenznote umgekehrt werden und transponiert werden: @@ -1043,8 +1036,8 @@ sollten @code{@var{Umkehrungstonhöhe}} und @code{@var{nachTonhöhe}} gleich sein. @lilypond[verbatim,quote] -octatonicScale = \relative c' { ees f fis gis a b c d } -motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } +octatonicScale = \relative { ees' f fis gis a b c d } +motif = \relative { c'8. ees16 fis8. a16 b8. gis16 f8. d16 } \new Staff { \motif @@ -1057,8 +1050,8 @@ wird um eine der Noten die Umkehrung vorgenommen und dann eine Skalenstufe transponiert. Die beiden Noten klammern sozusagen den Drehpunkt ein. @lilypond[verbatim,quote] -scale = \relative c' { c g' } -motive = \relative c' { c c g' c, } +scale = \relative { c' g' } +motive = \relative { c' c g' c, } \new Staff { \motive @@ -1070,8 +1063,8 @@ Die kombinierte Operation von Umkehrung und Krebs erzeugt die Krebsumkehrung: @lilypond[verbatim,quote] -octatonicScale = \relative c' { ees f fis gis a b c d } -motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } +octatonicScale = \relative { ees' f fis gis a b c d } +motif = \relative { c'8. ees16 fis8. a16 b8. gis16 f8. d16 } \new Staff { \motif @@ -1083,7 +1076,7 @@ motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } Notationsreferenz: @ref{Umkehrung}, @ref{Krebs}, -@ref{Transposition}. +@ref{Transponieren}. @node Tonhöhen anzeigen lassen @@ -1129,20 +1122,19 @@ verändern werden kann. @cindex Schlüssel, F @funindex \clef -@funindex clef Der Schlüssel kann verändert werden. Das eingestrichene C wird in jedem Beispiel gezeigt: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef treble -c2 c +c'2 c' \clef alto -c2 c +c'2 c' \clef tenor -c2 c +c'2 c' \clef bass -c2 c +c'2 c' @end lilypond Andere Schlüssel sind u. A.: @@ -1189,19 +1181,19 @@ andere Ganzzahlen können verwendet werden, wenn es gewünscht wird. Die Schlüsselbezeichnung muss in Anführungszeichen gesetzt werden, wenn nicht-alphabetische Zeichen enthält, siehe Beispiel: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef treble -c2 c +c'2 c' \clef "treble_8" -c2 c +c'2 c' \clef "bass^15" -c2 c +c'2 c' \clef "alto_2" -c2 c +c'2 c' \clef "G_8" -c2 c +c'2 c' \clef "F^5" -c2 c +c'2 c' @end lilypond Weitere unterstützte Schlüssel sind beschrieben in @ref{Mensurale Schlüssel}, @@ -1242,7 +1234,6 @@ Referenz der Interna: @cindex Vorzeichen @funindex \key -@funindex key @c duplicated in Key signature and Accidentals @warning{Neue Benutzer sind manchmal verwirrt, wie @@ -1253,7 +1244,7 @@ Tonhöhe dann im Notenbild dargestellt wird. Eine einfache Tonhöhe wie etwa@tie{}@code{c} bedeutet also immer das eingestrichene C ohne Versetzungszeichen, egal was für Vorzeichen/Tonart oder Schlüssel gesetzt sind. -Mehr Information dazu in @rlearning{Versetzungszeichen und Tonartbezeichnung (Vorzeichen)}.} +Mehr Information dazu in @rlearning{Tonhöhen und Tonartbezeichnungen (Vorzeichen)}.} Die Vorzeichen zeigen die Tonart an, in welcher ein Stück notiert ist. Es handelt sich um eine Anzahl von Alterationszeichen (Kreuzen oder @@ -1307,11 +1298,13 @@ Modusbezeichnungen für Kirchentonarten verwendet werden: @code{\ionian} @code{\mixolydian} (Mixolydisch), @code{\lydian} (Lydisch), @code{\phrygian} (Phrygisch) und @code{\dorian} (Dorisch). -@lilypond[verbatim,quote,relative=2] -\key g \major -fis1 -f -fis +@lilypond[verbatim,quote,fragment] +\relative { + \key g \major + fis''1 + f + fis +} @end lilypond @snippets @@ -1329,7 +1322,7 @@ Glossar: @rglos{scordatura}. Handbuch zum Lernen: -@rlearning{Versetzungszeichen und Tonartbezeichnung (Vorzeichen)}. +@rlearning{Tonhöhen und Tonartbezeichnungen (Vorzeichen)}. Schnipsel: @rlsr{Pitches}. @@ -1356,23 +1349,24 @@ Referenz der Interna: @funindex set-octavation @funindex \ottava -@funindex ottava @notation{Oktavierungsklammern} zeigen eine zusätzliche Transposition von einer Oktave an: -@lilypond[verbatim,quote,relative=2] -a2 b -\ottava #-2 -a2 b -\ottava #-1 -a2 b -\ottava #0 -a2 b -\ottava #1 -a2 b -\ottava #2 -a2 b +@lilypond[verbatim,quote] +\relative a' { + a2 b + \ottava #-2 + a2 b + \ottava #-1 + a2 b + \ottava #0 + a2 b + \ottava #1 + a2 b + \ottava #2 + a2 b +} @end lilypond @snippets @@ -1405,7 +1399,6 @@ Referenz der Interna: @cindex MIDI-Transposition @funindex \transposition -@funindex transposition Wenn man Noten setzt, die von transponierenden Instrumenten gespielt werden, sind oft einige Stimmen auf einer @@ -1467,18 +1460,20 @@ geändert werden. Ein Klarinettist zum Beispiel kann zwischen B- und A-Klarinette wechseln. @c KEEP LY -@lilypond[verbatim,quote,relative=2] -\set Staff.instrumentName = #"Cl (A)" -\key a \major -\transposition a -c d e f -\textLengthOn -<>^\markup { B-Klarinette benutzen } -R1 +@lilypond[verbatim,quote] +\relative c'' { + \set Staff.instrumentName = #"Cl (A)" + \key a \major + \transposition a + c d e f + \textLengthOn + <>^\markup { B-Klarinette benutzen } + R1 -\key bes \major -\transposition bes -c2 g + \key bes \major + \transposition bes + c2 g +} @end lilypond @@ -1489,7 +1484,7 @@ Glossar: Notationsreferenz: @ref{Andere Stimmen zitieren}, -@ref{Transposition}. +@ref{Transponieren}. Schnipsel: @rlsr{Pitches}. @@ -1542,12 +1537,12 @@ benützt: @lilypond[verbatim,quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1557,8 +1552,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1624,12 +1619,12 @@ Takt oder dem letzen@tie{}@code{c} gesetzt: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1639,8 +1634,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1701,12 +1696,12 @@ besser. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1716,8 +1711,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1768,12 +1763,12 @@ vor dem H und dem C im zweiten Takt des oberen Systems: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1783,8 +1778,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1830,12 +1825,12 @@ von @code{AccidentalSuggestion} definiert. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1845,8 +1840,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1897,12 +1892,12 @@ vorigen Takt: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1912,8 +1907,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1958,12 +1953,12 @@ auch mit diesem Stil gesetzt werden, sind manche Warnungsversetzungszeichen. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1973,8 +1968,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2022,12 +2017,12 @@ Akkolade (@code{GrandStaff} oder @code{PianoStaff}) aus. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2037,8 +2032,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2080,12 +2075,12 @@ Versetzungszeichen werden als Warnungen ausgegeben: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2095,8 +2090,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2139,12 +2134,12 @@ Takt auftritt -- außer die Note wird unmittelbar wiederholt. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2154,8 +2149,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2197,12 +2192,12 @@ Versetzungszeichen werden als Warnungen gesetzt. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2212,8 +2207,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2259,12 +2254,12 @@ Notensystems mit Auflösungszeichen versehen. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2274,8 +2269,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2317,12 +2312,12 @@ gesetzt. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2332,8 +2327,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2377,12 +2372,12 @@ auch Auflösungszeichen zählen. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2392,8 +2387,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2438,12 +2433,12 @@ gesetzt. Eine Ausnahme sind direkt wiederholte Noten. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2453,8 +2448,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2499,12 +2494,12 @@ dauern für @qq{immer} an, nicht nur im aktuellen Takt: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2514,8 +2509,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2559,12 +2554,12 @@ vom Kontext der Noten. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes'4 8 f bis4 | + \relative { + cis''8 fis, bes'4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2574,8 +2569,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2658,7 +2653,7 @@ Die folgende Notlösung kann benutzt werden: Man definiert eine Funktion, die den Versetzungszeichenstil kurzzeitig auf @code{forget} umschaltet: @lilypond[verbatim,quote] -forget = #(define-music-function (parser location music) (ly:music?) #{ +forget = #(define-music-function (music) (ly:music?) #{ \accidentalStyle forget #music \accidentalStyle modern @@ -2704,8 +2699,8 @@ Tonart definiert werden. } } -\relative c'' { - aes c e2 +\relative { + aes' c e2 cis,1 } @end lilypond @@ -2781,16 +2776,18 @@ Dieser Abschnitt zeigt, wie man Notenköpfe ändern kann. Notenköpfe können verändert werden: -@lilypond[verbatim,quote,relative=2] -c4 b -\override NoteHead.style = #'cross -c4 b -\revert NoteHead.style -a b -\override NoteHead.style = #'harmonic -a b -\revert NoteHead.style -c4 d e f +@lilypond[verbatim,quote] +\relative c'' { + c4 b + \override NoteHead.style = #'cross + c4 b + \revert NoteHead.style + a b + \override NoteHead.style = #'harmonic + a b + \revert NoteHead.style + c4 d e f +} @end lilypond Für alle Notenkopfstile siehe @ref{Notenkopfstile} @@ -2802,22 +2799,26 @@ in Notensystemen als auch in Tabulaturen und können benutzt werden, um alle musikalischen Bedeutungen zu notieren: -@lilypond[verbatim,quote,relative=2] -c4 b -\xNotesOn - a b c4 b -\xNotesOff -c4 d +@lilypond[verbatim,quote] +\relative { + c''4 b + \xNotesOn + a b c4 b + \xNotesOff + c4 d +} @end lilypond Die Form als musikalische Funktion dieses Befehls kann innerhalb und außerhalb von Akkorden benutzt werden, um Notenköpfe mit Kreuzen in normalen und Tabulatursystemen zu erstellen: -@lilypond[verbatim,quote,relative=2] -c4 b -\xNote { e f } -c b < g \xNote c f > b +@lilypond[verbatim,quote] +\relative { + c''4 b + \xNote { e f } + c b < g \xNote c f > b +} @end lilypond Als Synonym für @code{\xNote}, @code{\xNotesOn} und @code{\xNotesOff} @@ -2871,9 +2872,7 @@ Referenz der Interna: @cindex Notenköpfe für Anfänger @funindex \easyHeadsOn -@funindex easyHeadsOn @funindex \easyHeadsOff -@funindex easyHeadsOff Die @qq{einfachen Notenköpfe} haben die Bezeichnung der Note im Kopf gedruckt. Das wird eingesetzt, um die Notation beizubringen. @@ -2944,11 +2943,8 @@ Referenz der Interna: @funindex aikenHeads @funindex sacredHarpHeads @funindex \southernHarmonyHeads -@funindex southernHarmonyHeads @funindex \funkHeads -@funindex funkHeads @funindex \walkerHeads -@funindex walkerHeads In dieser Notation haben die Notenköpfe eine Form, die ihrer harmonischen Funktion innerhalb der Tonleiter entspricht. Die @@ -2957,31 +2953,27 @@ Notation war sehr beliebt in amerikanischen Liederbüchern des Sacred Harp, Southern Harmony, Funk (Harmonica Sacra), Walker und Aiken (Christian Harmony) benutzt werden: -@lilypond[verbatim,quote,relative=2] -\aikenHeads -c, d e f g2 a b1 c \break -\sacredHarpHeads -c,4 d e f g2 a b1 c \break -\southernHarmonyHeads -c,4 d e f g2 a b1 c \break -\funkHeads -c,4 d e f g2 a b1 c \break -\walkerHeads -c,4 d e f g2 a b1 c \break +@lilypond[verbatim,quote] +\relative c'' { + \aikenHeads + c, d e f g2 a b1 c \break + \sacredHarpHeads + c,4 d e f g2 a b1 c \break + \southernHarmonyHeads + c,4 d e f g2 a b1 c \break + \funkHeads + c,4 d e f g2 a b1 c \break + \walkerHeads + c,4 d e f g2 a b1 c \break +} @end lilypond @funindex \key -@funindex key @funindex \aikenHeadsMinor -@funindex aikenHeadsMinor @funindex \sacredHarpHeadsMinor -@funindex sacredHarpHeadsMinor @funindex \southernHarmonyHeadsMinor -@funindex southernHarmonyHeadsMinor @funindex \funkHeadsMinor -@funindex funkHeadsMinor @funindex \walkerHeadsMinor -@funindex walkerHeadsMinor Die unterschiedlichen Formen richten sich nach der Stufe in der Skala, wobei der Grundton der Skala aus dem @code{\key}-Befehl @@ -3050,24 +3042,22 @@ Referenz der Interna: @cindex Striche: Notenköpfe @funindex \improvisationOn -@funindex improvisationOn @funindex \improvisationOff -@funindex improvisationOff Improvisation wird manchmal angezeigt, indem schräge Notenköpfe gesetzt werden, wenn der Spieler eine beliebige Tonhöhe wählen kann aber den vorgegebenen Rhythmus spielen soll. Sie können wie folgt benutzt werden: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Voice \with { \consists "Pitch_squash_engraver" -} { - e8 e g a a16( bes) a8 g +} \relative { + e''8 e g a a16( bes) a8 g \improvisationOn e8 ~ - e2 ~ e8 f4 f8 ~ - f2 + 2 ~ 8 f4 f8 ~ + 2 \improvisationOff a16( bes) a8 g e } diff --git a/Documentation/de/notation/repeats.itely b/Documentation/de/notation/repeats.itely index 2e2d5198cf..fecc8cfeca 100644 --- a/Documentation/de/notation/repeats.itely +++ b/Documentation/de/notation/repeats.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.11" +@c \version "2.19.21" @c Translators: Till Paala @@ -91,10 +91,12 @@ wobei @code{@var{musikAusdr}} ein musikalischer Ausdruck ist. Wiederholung ohne alternativen Schluß: -@lilypond[verbatim,quote,relative=2] -\repeat volta 2 { c4 d e f } -c2 d -\repeat volta 2 { d4 e f g } +@lilypond[verbatim,quote] +\relative { + \repeat volta 2 { c''4 d e f } + c2 d + \repeat volta 2 { d4 e f g } +} @end lilypond Alternative @@ -118,36 +120,42 @@ die ersten Wiederholungen den ersten Schluss. Eine einfache Wiederholung mit einer Alternative: -@lilypond[verbatim,quote,relative=2] -\repeat volta 2 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 2 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + } + c1 } -c1 @end lilypond Eine einfache Wiederholung mit mehr als einer Alternative: -@lilypond[verbatim,quote,relative=2] -\repeat volta 4 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 4 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + } + c1 } -c1 @end lilypond Mehrfache Wiederholungen mit mehr als einer Alternative: -@lilypond[verbatim,quote,relative=2] -\repeat volta 3 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } - { a2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 3 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + { a2 g | } + } + c1 } -c1 @end lilypond @warning{Wenn es zwei oder mehr Alternativen gibt, darf nicht zwischen @@ -173,38 +181,41 @@ Wiederholungsstriche keine richtigen Taktstriche. Benutzen Sie nicht @code{\partial}-Befehle oder Taktüberprüfung, wo die Wiederholungslinien gesetzt werden: -@lilypond[verbatim,quote,relative=1] -% no \partial here -c4 e g % no bar check here -% no \partial here -\repeat volta 4 { - e4 | - c2 e | +@lilypond[verbatim,quote] +\relative { % no \partial here + c'4 e g % no bar check here + % no \partial here + \repeat volta 4 { + e4 | + c2 e | + % no \partial here + g4 g g % no bar check here + } % no \partial here - g4 g g % no bar check here + g4 | + a2 a | + g1 | } -% no \partial here -g4 | -a2 a | -g1 | @end lilypond Ähnlich ist es, wenn eine Wiederholung mit einem Auftakt beginnt und keine Alternativen hat. In diesem Fall muss man aber den @code{\partial}-Befehl zu Beginn der Partitur setzen: -@lilypond[verbatim,quote,relative=1] -\partial 4 % required -\repeat volta 4 { - e4 | - c2 e | +@lilypond[verbatim,quote] +\relative { + \partial 4 % required + \repeat volta 4 { + e'4 | + c2 e | + % no \partial here + g4 g g % no bar check here + } % no \partial here - g4 g g % no bar check here + g4 | + a2 a | + g1 | } -% no \partial here -g4 | -a2 a | -g1 | @end lilypond Wenn alternative Endungen zu einer Wiederholung hinzugefügt werden, @@ -270,12 +281,14 @@ c1_"D.S." \bar "|." Bindebögen können auch an eine zweite Klammer angefügt werden: -@lilypond[verbatim,quote,relative=2] -c1 -\repeat volta 2 { c4 d e f~ } -\alternative { - { f2 d } - { f2\repeatTie f, } +@lilypond[verbatim,quote] +\relative { + c''1 + \repeat volta 2 { c4 d e f~ } + \alternative { + { f2 d } + { f2\repeatTie f, } + } } @end lilypond @@ -387,11 +400,13 @@ Scheme-Liste an Wiederholungsbefehlen. @item start-repeat Setzt eine @code{|:} Taktlinie. -@lilypond[verbatim,quote,relative=2] -c1 -\set Score.repeatCommands = #'(start-repeat) -d4 e f g -c1 +@lilypond[verbatim,quote] +\relative { + c''1 + \set Score.repeatCommands = #'(start-repeat) + d4 e f g + c1 +} @end lilypond Der Notensatzpraxis folgend werden Wiederholungstaktstriche nicht zu @@ -400,11 +415,13 @@ Beginn eines Stückes gesetzt. @item end-repeat Setzt eine @code{:|} Taktlinie. -@lilypond[verbatim,quote,relative=2] -c1 -d4 e f g -\set Score.repeatCommands = #'(end-repeat) -c1 +@lilypond[verbatim,quote] +\relative { + c''1 + d4 e f g + \set Score.repeatCommands = #'(end-repeat) + c1 +} @end lilypond @item (volta @var{Zahl}) ... (volta #f) @@ -412,26 +429,30 @@ Setzt eine Volta-Klammer mit der Beschriftung @var{Nummer}. Die Volta-Klammer muss explizit beendet werden, sonst wird sie nicht ausgegeben. -@lilypond[verbatim,quote,relative=2] -f4 g a b -\set Score.repeatCommands = #'((volta "2")) -g4 a g a -\set Score.repeatCommands = #'((volta #f)) -c1 +@lilypond[verbatim,quote] +\relative { + f''4 g a b + \set Score.repeatCommands = #'((volta "2")) + g4 a g a + \set Score.repeatCommands = #'((volta #f)) + c1 +} @end lilypond @end table Mehrfache Wiederholungszeichen können an der selben Stelle vorkommen: -@lilypond[verbatim,quote,relative=2] -f4 g a b -\set Score.repeatCommands = #'((volta "2, 5") end-repeat) -g4 a g a -c1 -\set Score.repeatCommands = #'((volta #f) (volta "95") end-repeat) -b1 -\set Score.repeatCommands = #'((volta #f)) +@lilypond[verbatim,quote] +\relative { + f''4 g a b + \set Score.repeatCommands = #'((volta "2, 5") end-repeat) + g4 a g a + c1 + \set Score.repeatCommands = #'((volta #f) (volta "95") end-repeat) + b1 + \set Score.repeatCommands = #'((volta #f)) +} @end lilypond @cindex Volta-Klammer mit Text @@ -447,8 +468,8 @@ in einer Scheme-Liste einzufügen. @lilypond[verbatim,quote] voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } -\relative c'' { - c1 +\relative { + c''1 \set Score.repeatCommands = #(list(list 'volta voltaAdLib) 'start-repeat) c4 b d e @@ -459,12 +480,6 @@ voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } @end lilypond -@snippets - -@lilypondfile[verbatim,quote,texidoc,doctitle] -{printing-a-repeat-sign-at-the-beginning-of-a-piece.ly} - - @seealso Notationsreferenz: @ref{Taktstriche}, @@ -505,9 +520,11 @@ wobei @code{@var{musikAusdr}} ein musikalischer Ausdruck ist und @code{@var{Wiederholungszähler}} die Anzahl bezeichnet, mit der @code{@var{musikAusdr}} wiederholt wird. -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -c1 +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + c1 +} @end lilypond In einigen Fällen, insbesondere in einer @code{\relative}-Umgebung, @@ -528,13 +545,15 @@ a'4 b c | a'4 b c Repititive Wiederholungen können auch mit mehreren Alternativeklammern notiert werden: -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + } + c1 } -c1 @end lilypond Wenn es mehr Wiederholungen als Alternativen gibt, wird die erste @@ -542,42 +561,48 @@ Alternative so oft eingesetzt, bis sich zusammen mit den restlichen Alternativen die Gesamtanzahl der Wiederholungen ergeben. -@lilypond[verbatim,quote,relative=2] -\repeat unfold 4 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } - { e2 d } - } -c1 +@lilypond[verbatim,quote] +\relative { + \repeat unfold 4 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + { e2 d } + } + c1 +} @end lilypond Wenn es mehr Alternativen als Wiederholungen gibt, wird nur die ersten Alternativen ausgegeben und die restlichen Alternativen ignoriert und nicht gesetzt. -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } - { e2 d } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + { e2 d } + } + c1 } -c1 @end lilypond Es ist auch möglich, mehrere @code{unfold}-Wiederholungen (mit oder ohne Alternativen) ineinander zu verschachteln: -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { - \repeat unfold 2 { c4 d e f } - \alternative { - { c2 g' } - { c,2 b } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + } } + c1 } -c1 @end lilypond Akkordkonstruktionen können mit dem Akkordwiederholungssymbol @code{q} @@ -643,35 +668,43 @@ wobei @code{@var{musikAusdr}} ein musikalischer Ausdruck ist. Muster, die kürzer als ein Takt sind, werden mit Schrägstrichen ersetzt: -@lilypond[verbatim,quote,relative=2] -\repeat percent 4 { c128 d e f } -\repeat percent 4 { c64 d e f } -\repeat percent 5 { c32 d e f } -\repeat percent 4 { c16 d e f } -\repeat percent 4 { c8 d } -\repeat percent 4 { c4 } -\repeat percent 2 { c2 } +@lilypond[verbatim,quote] +\relative c'' { + \repeat percent 4 { c128 d e f } + \repeat percent 4 { c64 d e f } + \repeat percent 5 { c32 d e f } + \repeat percent 4 { c16 d e f } + \repeat percent 4 { c8 d } + \repeat percent 4 { c4 } + \repeat percent 2 { c2 } +} @end lilypond Muster von einem oder zwei Takten Dauer werden mit prozentartigen Symbolen ersetzt: -@lilypond[verbatim,quote,relative=2] -\repeat percent 2 { c4 d e f } -\repeat percent 2 { c2 d } -\repeat percent 2 { c1 } +@lilypond[verbatim,quote] +\relative c'' { + \repeat percent 2 { c4 d e f } + \repeat percent 2 { c2 d } + \repeat percent 2 { c1 } +} @end lilypond -@lilypond[verbatim,quote,relative=2] -\repeat percent 3 { c4 d e f | c2 g' } +@lilypond[verbatim,quote] +\relative { + \repeat percent 3 { c''4 d e f | c2 g' } +} @end lilypond Muster, die kürzer als ein Takt sind, aber unterschiedliche Dauern beinhalten, benützten ein doppeltes Prozent-Symbol. -@lilypond[verbatim,quote,relative=2] -\repeat percent 4 { c8. 16 } -\repeat percent 2 { \tuplet 3/2 { r8 c d } e4 } +@lilypond[verbatim,quote] +\relative { + \repeat percent 4 { c''8. 16 } + \repeat percent 2 { \tuplet 3/2 { r8 c d } e4 } +} @end lilypond @snippets @@ -728,10 +761,12 @@ am Hals einer einzigen Note. Um Tremolobalken zwischen Noten zu setzen, kann der @code{\repeat}-Befehl mit dem Tremolo-Stil benutzt werden: -@lilypond[quote,verbatim,relative=2] -\repeat tremolo 8 { c16 d } -\repeat tremolo 6 { c16 d } -\repeat tremolo 2 { c16 d } +@lilypond[quote,verbatim] +\relative c'' { + \repeat tremolo 8 { c16 d } + \repeat tremolo 6 { c16 d } + \repeat tremolo 2 { c16 d } +} @end lilypond Die @code{\repeat tremolo}-Syntax braucht genau zwei Noten innerhalb @@ -767,9 +802,11 @@ Wert 8 haben. Ein Wert von 8 ergibt einen Balken durch den Notenhals. Wenn die Zahl ausgelassen wird, wird der letzte benutzte Wert eingesetzt (gespeichert in @code{tremoloFlags}): -@lilypond[quote,verbatim,relative=2] -c2:8 c:32 -c: c: +@lilypond[quote,verbatim] +\relative { + c''2:8 c:32 + c: c: +} @end lilypond @snippets diff --git a/Documentation/de/notation/rhythms.itely b/Documentation/de/notation/rhythms.itely index 5a8bb1adc8..53ad92a27e 100644 --- a/Documentation/de/notation/rhythms.itely +++ b/Documentation/de/notation/rhythms.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.30" +@c \version "2.19.40" @c Translators: Till Paala @@ -69,21 +69,25 @@ Notendauern bis hin zu 128steln sind unterstützt. Kürzere Notenwerte können auch notiert werden, können allerdings nur als Noten mit Balken auftreten. @c Two 64th notes are needed to obtain beams -@lilypond[quote,verbatim,relative=2] -\time 8/1 -c\longa c\breve c1 c2 -c4 c8 c16 c32 c64 c128 c128 +@lilypond[quote,verbatim] +\relative { + \time 8/1 + c''\longa c\breve c1 c2 + c4 c8 c16 c32 c64 c128 c128 +} @end lilypond Hier die selben Notendauern ohne die Balken. @c not strictly "writing rhythms"; more of a "displaying" thing, @c but it's ok here. -gp -@lilypond[quote,verbatim,relative=2] -\time 8/1 -\autoBeamOff -c\longa c\breve c1 c2 -c4 c8 c16 c32 c64 c128 c128 +@lilypond[quote,verbatim] +\relative { + \time 8/1 + \autoBeamOff + c''\longa c\breve c1 c2 + c4 c8 c16 c32 c64 c128 c128 +} @end lilypond Eine Note mit der vierfachen Dauer einer Brevis kann mit dem @@ -99,8 +103,8 @@ Wenn die Dauer hinter einer Notenbezeichnung nicht angegeben ist, wird die Dauer der vorhergehenden Note eingesetzt. Der Standardwert für die erste Note ist eine Viertel. -@lilypond[quote,verbatim,relative=2] -a a a2 a a4 a a1 a +@lilypond[quote,verbatim] +\relative { a' a a2 a a4 a a1 a } @end lilypond @funindex . @@ -114,8 +118,8 @@ Um punktierte Notendauern zu erhalten, muss einfach nur ein Punkt (@code{.}) hinter die Zahl der Dauer gesetzt werden. Zwei Punkte ergeben eine doppelte Punktierung, usw. -@lilypond[quote,verbatim,relative=2] -a4 b c4. b8 a4. b4.. c8. +@lilypond[quote,verbatim] +\relative { a'4 b c4. b8 a4. b4.. c8. } @end lilypond Manche Notenlängen können nicht mit binären Dauern und Punkten @@ -202,7 +206,6 @@ Maxima (8 Ganze) gesetzt werden. @cindex Triolen @cindex Rhythmische Aufteilungen -@funindex times @funindex \times Triolen und andere rhythmische Aufteilungen werden aus einem musikalischen @@ -240,9 +243,11 @@ ausgegeben werden, siehe @ref{Richtung und Platzierung}. N-tolen können ineinander geschachtelt werden: -@lilypond[quote,verbatim,relative=2] -\autoBeamOff -c4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 +@lilypond[quote,verbatim] +\relative { + \autoBeamOff + c''4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 +} @end lilypond Wenn man die Eigenschaften von N-tolen verändern will, die zum @@ -268,7 +273,7 @@ zu setzen, siehe @ref{Tondauern skalieren}. @funindex tupletSpannerDuration @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] -{entering-several-tuplets-using-only-one--times-command.ly} +{entering-several-tuplets-using-only-one--tuplet-command.ly} @cindex Triolennummer, Änderung @@ -349,16 +354,18 @@ Skalierungsfaktoren übernommen. Im nächsten Beispiel nehmen die drei ersten Noten genau zwei Schläge ein, aber es wird keine Triolenklammer über ihnen ausgegeben. -@lilypond[quote,relative=2,verbatim] -\time 2/4 -% Alter durations to triplets -a4*2/3 gis a -% Normal durations -a4 a -% Double the duration of chord -4*2 -% Duration of quarter, appears like sixteenth -b16*4 c4 +@lilypond[quote,verbatim] +\relative { + \time 2/4 + % Alter durations to triplets + a'4*2/3 gis a + % Normal durations + a4 a + % Double the duration of chord + 4*2 + % Duration of quarter, appears like sixteenth + b16*4 c4 +} @end lilypond Die Dauer von unsichtbaren Pausen kann auch mit einem Faktor @@ -372,7 +379,6 @@ beeinflusst werden. Das ist sinnvoll, wenn man viele Takte @cindex Ausdehnen von Noten @cindex Dauern skalieren -@funindex scaleDurations @funindex \scaleDurations Längere Notenabschnitte können auf die gleiche Art durch Multiplikation @@ -434,7 +440,7 @@ Ein Bindebogen wird mit der Tilde @code{~} (AltGr++) notiert. @lilypond[quote,verbatim,relative=2] -a2 ~ a +a2 ~ 2 @end lilypond Bindebögen werden eingesetzt, wenn die Note entweder über eine @@ -444,9 +450,9 @@ sollten auch benutzt werden, wenn Notenwerte über die inneren Unterteilungen von Takten hinüberreichen: @lilypond[quote] -\relative c' { - r8 c8 ~ c2 r4 | - r8^"not" c2 ~ c8 r4 +\relative { + r8 c'8 ~ 2 r4 | + r8^"not" c2 ~ 8 r4 } @end lilypond @@ -478,7 +484,6 @@ geschrieben werden. @cindex Volta und Überbindung @funindex \repeatTie -@funindex repeatTie Wenn die zweite Variante einer Wiederholung mit einer übergebundenen Note anfängt, muss der Bindebogen wie folgt notiert werden: @@ -497,15 +502,14 @@ Note anfängt, muss der Bindebogen wie folgt notiert werden: @cindex Bögen, laissez vibrer @cindex Ausklingen lassen -@funindex laissezVibrer @funindex \laissezVibrer So genannte @notation{laissez vibrer}-Bögen werden verwendet um anzuzeigen, dass man die Musik ausklingen lassen soll. Sie werden in der Klavier-, Harfen-, anderer Saiteninstrument- und Schlagzeugnotation verwendet. Sie können folgendermaßen notiert werden: -@lilypond[quote,verbatim,relative=1] -1\laissezVibrer +@lilypond[quote,verbatim,fragment] +1\laissezVibrer @end lilypond @cindex ties, placement @@ -537,26 +541,26 @@ von Strichen und durchgehender Linie definiert werden. @lilypond[quote, verbatim, relative=1] \tieDotted -c2 ~ c +c2 ~ 2 \tieDashed -c2 ~ c +c2 ~ 2 \tieHalfDashed -c2 ~ c +c2 ~ 2 \tieHalfSolid -c2 ~ c +c2 ~ 2 \tieSolid -c2 ~ c +c2 ~ 2 @end lilypond Eigene Strichelungsmuster können definiert werden: @lilypond[quote, verbatim, relative=1] \tieDashPattern #0.3 #0.75 -c2 ~ c +c2 ~ 2 \tieDashPattern #0.7 #1.5 -c2 ~ c +c2 ~ 2 \tieSolid -c2 ~ c +c2 ~ 2 @end lilypond Die Definition von Muster für die Strichelung der Bindebögen hat @@ -568,16 +572,18 @@ Durch Veränderung der Eigenschaften @var{whiteout} (weiß malen) und @var{layer} (Ebene) kann verhindert werden, dass Bindebögen mit anderen Objekten im Notensystem zusammenstoßen. -@lilypond[verbatim,quote,ragged-right,relative=2] -\override Tie.layer = #-2 -\override Staff.TimeSignature.layer = #-1 -\override Staff.KeySignature.layer = #-1 -\override Staff.TimeSignature.whiteout = ##t -\override Staff.KeySignature.whiteout = ##t -b2 b~ -\time 3/4 -\key a \major -b r4 +@lilypond[verbatim,quote,ragged-right] +\relative { + \override Tie.layer = #-2 + \override Staff.TimeSignature.layer = #-1 + \override Staff.KeySignature.layer = #-1 + \override Staff.TimeSignature.whiteout = ##t + \override Staff.KeySignature.whiteout = ##t + b'2 b~ + \time 3/4 + \key a \major + b r4 +} @end lilypond @predefined @@ -667,7 +673,7 @@ vordefinierten Befehle: @c \time 16/1 is used to avoid spurious bar lines @c and long tracts of empty measures -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Staff { % These two lines are just to prettify this example \time 16/1 @@ -702,8 +708,8 @@ Note befinden würde. Damit wird die manuelle Formatierung von mehrstimmiger Mu sehr viel einfacher, da die Formatierungsfunktion zur automatischen Auflösung von Zusammenstößen diese Pausen nicht mit einbezieht. -@lilypond[quote,verbatim,relative=2] -a4\rest d4\rest +@lilypond[quote,verbatim] +\relative { a'4\rest d4\rest } @end lilypond @snippets @@ -747,7 +753,6 @@ Maxima (8 Ganze). @cindex Platzhalternoten @funindex \skip -@funindex skip @funindex s Eine unsichtbare Pause (auch als @qq{skip} oder Überspringung bezeichnet) @@ -764,10 +769,10 @@ anderen Situationen, z. B. innerhalb eines Liedtextes, muss der Befehl @code{\skip} benutzt werden. @code{\skip} benötigt eine explizite Dauerangabe. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << { - a2 \skip2 a2 a2 + a'2 \skip2 a'2 a'2 } \new Lyrics { \lyricmode { @@ -780,14 +785,14 @@ explizite Dauerangabe. Weil @code{\skip} ein Befehl ist, wirkt er sich nicht auf die Dauer der folgenden Noten aus, anders als@tie{}@code{s}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << { - \repeat unfold 8 { a4 } + \repeat unfold 8 { a'4 } } { - a4 \skip 2 a | - s2 a + a'4 \skip 2 a' | + s2 a' } >> @end lilypond @@ -795,16 +800,16 @@ der folgenden Noten aus, anders als@tie{}@code{s}. Die Platzhalterpause mit @code{s} erstellt @code{Staff}- und @code{Voice}-Kontext, wenn es erforderlich ist, genauso wie Noten und Pausen. -@lilypond[quote,verbatim,relative=2] -s1 s s +@lilypond[quote,verbatim] +{ s1 s s } @end lilypond Der Überspringungsbefehl (@code{\skip}) ist einfach ein leerer Platzhalter. Durch ihn wird überhaupt nichts gesetzt, auch keine transparenten Objekte. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % This is valid input, but does nothing -\skip 1 \skip1 \skip 1 +{ \skip 1 \skip1 \skip 1 } @end lilypond @seealso @@ -867,7 +872,7 @@ R4*5*4 | Eine Ganztaktpause wird abhängig von der Taktart entweder als Ganze oder Brevis-Pause gesetzt, zentriert im Takt. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 4/4 R1 | \time 6/4 @@ -916,7 +921,6 @@ R2.*2 | @cindex Mehrtaktpause mit Fermate @funindex \fermataMarkup -@funindex fermataMarkup @funindex MultiMeasureRestText Textbeschriftung kann Mehrtaktpausen mit @code{\markup} @@ -939,7 +943,7 @@ müssen auf das richtige Objekt gerichtet werden, damit sie nicht ignoriert werden. Siehe auch das folgende Beispiel. } -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] % This fails, as the wrong object name is specified \override TextScript.padding = #5 R1^"wrong" @@ -953,15 +957,10 @@ folgt, werden möglicherweise daraus resultierende Taktprüfungswarnungen nicht angezeigt. @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff @funindex \fermataMarkup -@funindex fermataMarkup @funindex \compressFullBarRests -@funindex compressFullBarRests @funindex \expandFullBarRests -@funindex expandFullBarRests @predefined @code{\textLengthOn}, @@ -1049,7 +1048,6 @@ berücksichtigt. @cindex Taktangabe @cindex Metrum -@funindex time @funindex \time Taktangaben werden wie folgt erstellt. @@ -1067,14 +1065,16 @@ Zeile geschieht, wird eine warnende Taktangabe am Ende der Zeile ausgegeben. Dieses Verhalten kann verändert werden, siehe @ref{Sichtbarkeit von Objekten}. -@lilypond[quote,verbatim,relative=2] -\time 2/4 -c2 c -\break -c c -\break -\time 4/4 -c c c c +@lilypond[quote,verbatim] +\relative c'' { + \time 2/4 + c2 c + \break + c c + \break + \time 4/4 + c c c c +} @end lilypond @funindex \numericTimeSignature @@ -1088,18 +1088,20 @@ c c c c Das Symbol für die Taktarten 2/2 und 4/4 kann in ein Zahlensymbol umgewandelt werden: -@lilypond[quote,verbatim,relative=2] -% Default style -\time 4/4 c1 -\time 2/2 c1 -% Change to numeric style -\numericTimeSignature -\time 4/4 c1 -\time 2/2 c1 -% Revert to default style -\defaultTimeSignature -\time 4/4 c1 -\time 2/2 c1 +@lilypond[quote,verbatim] +\relative c'' { + % Default style + \time 4/4 c1 + \time 2/2 c1 + % Change to numeric style + \numericTimeSignature + \time 4/4 c1 + \time 2/2 c1 + % Revert to default style + \defaultTimeSignature + \time 4/4 c1 + \time 2/2 c1 +} @end lilypond Symbole für Modus und Proprietas der mensuralen Notation @@ -1111,7 +1113,6 @@ werden behandelt unter @ref{Mensurale Taktartenbezeichnungen}. @cindex Balken, Taktartstandard @funindex \overrideTimeSignatureSettings -@funindex overrideTimeSignatureSettings Zusätzlich zu der gedruckten Taktart werden mit der Definition des Befehls @code{\time} auch die Standardwerte fürt die Eigenschaften @@ -1128,7 +1129,7 @@ werden. \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 { c8 } | @@ -1172,7 +1173,7 @@ Noten in dem Kontext befinen müssen, bevor \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 c8^\markup {"Beamed (2 2)"} @@ -1181,7 +1182,7 @@ Noten in dem Kontext befinen müssen, bevor \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 c8^\markup {"Beamed (3 1)"} @@ -1195,19 +1196,18 @@ Noten in dem Kontext befinen müssen, bevor @cindex Zurücksetzen von Taktart-Standardeigenschaften @funindex \revertTimeSignatureSettings -@funindex revertTimeSignatureSettings Veränderte Werte der Taktart-Eigenschaften können wieder auf den Standard zurückgesetzt werden: @lilypond[quote,verbatim] \score{ - \relative c' { - \repeat unfold 8 { c8 } | + \relative { + \repeat unfold 8 { c'8 } | \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 { c8 } | @@ -1230,7 +1230,7 @@ Notensysteme können eingerichtet werden, indem man den \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 {c''8} @@ -1239,7 +1239,7 @@ Notensysteme können eingerichtet werden, indem man den \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(1 3) % beatStructure + 1,3 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 {c''8} @@ -1296,55 +1296,66 @@ Referenz der Interna: @cindex Tempobezeichnung @cindex Aufführungsanweisung: Tempo -@funindex tempo @funindex \tempo Eine Metronomanweisung wird wie folgt erstellt: -@lilypond[verbatim,quote,relative=1] -\tempo 4 = 120 -c2 d -e4. d8 c2 +@lilypond[verbatim,quote] +\relative { + \tempo 4 = 120 + c'2 d + e4. d8 c2 +} @end lilypond Metronombezeichnungen können auch für einen Zahlenbereich notiert werden: -@lilypond[verbatim,quote,relative=1] -\tempo 4 = 40 - 46 -c4. e8 a4 g -b,2 d4 r +@lilypond[verbatim,quote] +\relative { + \tempo 4 = 40 - 46 + c'4. e8 a4 g + b,2 d4 r +} @end lilypond Anstelle dessen kann auch Text als Argument angegeben werden: -@lilypond[verbatim,quote,relative=2] -\tempo "Allegretto" -c4 e d c -b4. a16 b c4 r4 +@lilypond[verbatim,quote] +\relative { + \tempo "Allegretto" + c''4 e d c + b4. a16 b c4 r4 +} @end lilypond Wenn eine Metronombezeichnung und Text kombiniert wird, wird die Metronombezeichnung automatisch in Klammern gesetzt: -@lilypond[verbatim,quote,relative=2] -\tempo "Allegro" 4 = 160 -g4 c d e -d4 b g2 +@lilypond[verbatim,quote] +\relative { + \tempo "Allegro" 4 = 160 + g'4 c d e + d4 b g2 +} @end lilypond Der Text kann ein beliebiges Textbeschriftungsobjekt sein: -@lilypond[verbatim,quote,relative=2] -\tempo \markup { \italic Faster } 4 = 132 -a8-. r8 b-. r gis-. r a-. r +@lilypond[verbatim,quote] +\relative { + \tempo \markup { \italic Faster } 4 = 132 + a'8-. r8 b-. r gis-. r a-. r +} @end lilypond Eine Metronombezeichnung in Klammern ohne Text kann erstellt werden, indem eine leere Zeichenkette hinzugefügt wird: -@lilypond[verbatim,quote,relative=2] -\tempo "" 8 = 96 -d4 g e c +@lilypond[verbatim,quote] +\relative { + \tempo "" 8 = 96 + d''4 g e c +} @end lilypond @@ -1393,7 +1404,6 @@ Referenz der Interna: @funindex measurePosition @funindex \partial -@funindex partial Verkleinerte Takte, wie etwa ein Auftakt, werden mit dem Befehl @code{\partial} notiert, dessen Syntax lautet: @@ -1415,10 +1425,12 @@ e8 | a4 c8 b c4 | Die @var{Dauer} kan ein beliebiger Wert kleiner als der vollständige Takt sein. -@lilypond[quote,verbatim,relative=1] -\time 3/4 -\partial 4. -r4 e8 | a4 c8 b c4 | +@lilypond[quote,verbatim] +\relative { + \time 3/4 + \partial 4. + r4 e'8 | a4 c8 b c4 | +} @end lilypond @code{\partial @var{Dauer}} kann auch folgendermaßen geschrieben werden: @@ -1506,13 +1518,15 @@ das nicht gewollt und kann @qq{ausgeschaltet} werden mit dem Befehl @code{\cadenzaOn}, um dann wieder zum normalen Verhalten mit @code{\cadenzaOff} zurückzukehren. -@lilypond[verbatim,relative=2,quote] -c4 d e d -\cadenzaOn -c4 c d8[ d d] f4 g4. -\cadenzaOff -\bar "|" -d4 e d c +@lilypond[verbatim,quote] +\relative c'' { + c4 d e d + \cadenzaOn + c4 c d8[ d d] f4 g4. + \cadenzaOff + \bar "|" + d4 e d c +} @end lilypond Taktnummerierung wird am Ende der Kadenz wieder aufgenommen: @@ -1546,14 +1560,16 @@ cis4 d cis! d Automatische Bebalkung wird durch @code{\cadenzeOn} ausgestellt. Darum müssen alle Balken in Kadenzen manuell eingegeben werden (siehe @ref{Manuelle Balken}). -@lilypond[verbatim,relative=2,quote] -\repeat unfold 8 { c8 } -\cadenzaOn -cis8 c c c c -\bar"|" -c8 c c -\cadenzaOff -\repeat unfold 8 { c8 } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 8 { c''8 } + \cadenzaOn + cis8 c c c c + \bar"|" + c8 c c + \cadenzaOff + \repeat unfold 8 { c8 } +} @end lilypond Diese vordefinierten Befehle wirken sich auf alle Systeme in der @@ -1629,9 +1645,7 @@ ein seltsamer Fehler auftreten kann. @funindex timeSignatureFraction @funindex \scaleDurations -@funindex scaleDurations @funindex \times -@funindex times Polymetrische Notation ist direkt unterstützt, oder indem man das sichtbare Taktart-Symbol verändert und zusätzlich @@ -1658,10 +1672,10 @@ weil die Skalierung sich auch auf die automatische Bebalkung auswirkt. @lilypond[quote,verbatim] -\relative c' << +\relative << \new Staff { \time 3/4 - c4 c c | + c'4 c c | c4 c c | } \new Staff { @@ -1706,10 +1720,10 @@ verschoben werden. % Now each staff has its own time signature. -\relative c' << +\relative << \new Staff { \time 3/4 - c4 c c | + c'4 c c | c4 c c | } \new Staff { @@ -1746,9 +1760,9 @@ Zahl den Nenner des Bruches darstellt, während die vorherkommenden Zahlen die Zähler sind. @lilypond[quote,verbatim] -\relative c' { +\relative { \compoundMeter #'((2 2 2 8)) - \repeat unfold 6 c8 \repeat unfold 12 c16 + \repeat unfold 6 c'8 \repeat unfold 12 c16 } @end lilypond @@ -1757,14 +1771,14 @@ werden (von Klammern abgegrenzt). Automatische Balken werden entsprechend der Werte angepasst. @lilypond[quote,verbatim] -\relative c' { +\relative { \compoundMeter #'((1 4) (3 8)) - \repeat unfold 5 c8 \repeat unfold 10 c16 + \repeat unfold 5 c'8 \repeat unfold 10 c16 } -\relative c' { +\relative { \compoundMeter #'((1 2 3 8) (3 4)) - \repeat unfold 12 c8 + \repeat unfold 12 c'8 } @end lilypond @@ -1823,15 +1837,16 @@ aufgeteilt werden, indem man den @code{Rest_engraver}mit dem Noten und Pausen, die über die Taktlinie dauern, aufgeteilt; Noten werden auch übergebunden. -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim] \new Voice \with { \remove "Note_heads_engraver" \consists "Completion_heads_engraver" \remove "Rest_engraver" \consists "Completion_rest_engraver" } - -{ c2. c8 d4 e f g a b c8 c2 b4 a g16 f4 e d c8. c2 r1*2 } +\relative { + c'2. c8 d4 e f g a b c8 c2 b4 a g16 f4 e d c8. c2 r1*2 +} @end lilypond Dieser Engraver teilt alle Noten und Pausen @@ -1882,12 +1897,12 @@ erreicht man mit einem Rhythmus-Notensystem. Alle Tonhöhen werden auf eine Linie reduziert und das System hat auch nur eine einzige Linie. -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << \new RhythmicStaff { - \new Voice = "myRhythm" { + \new Voice = "myRhythm" \relative { \time 4/4 - c4 e8 f g2 + c'4 e8 f g2 r4 g g f g1 } @@ -1907,9 +1922,7 @@ Linie. @funindex Pitch_squash_engraver @funindex \improvisationOn -@funindex improvisationOn @funindex \improvisationOff -@funindex improvisationOff Akkordnotation für Gitarren bezeichnet auch oft zusätzlich den geschlagenen Rhythmus. Das kann notiert werden unter Verwendung @@ -1981,13 +1994,13 @@ LilyPond setzt Balken (engl. beam) automatisch. @cindex eigene Balkenregeln @funindex \autoBeamOn -@funindex autoBeamOn @funindex \autoBeamOff -@funindex autoBeamOff -@lilypond[quote,verbatim,relative=2] -\time 2/4 c8 c c c -\time 6/8 c8 c c c8. c16 c8 +@lilypond[quote,verbatim] +\relative c'' { + \time 2/4 c8 c c c + \time 6/8 c8 c c c8. c16 c8 +} @end lilypond Wenn diese automatischen Entscheidungen nicht gut genug sind, können @@ -1999,12 +2012,14 @@ Wenn automatische Bebalkung nicht benötigt wird, kann sie mit dem Befehl @code{ aufgehoben werden und mit dem Befehl @code{\autoBeamOn} wieder eingeschaltet werden. -@lilypond[quote,relative=1,verbatim] -c4 c8 c8. c16 c8. c16 c8 -\autoBeamOff -c4 c8 c8. c16 c8. -\autoBeamOn -c16 c8 +@lilypond[quote,verbatim] +\relative c' { + c4 c8 c8. c16 c8. c16 c8 + \autoBeamOff + c4 c8 c8. c16 c8. + \autoBeamOn + c16 c8 +} @end lilypond @cindex Melismen, Balken @@ -2090,9 +2105,7 @@ Balken beginnt. @funindex measureLength @funindex baseMoment @funindex \time -@funindex time @funindex \set -@funindex set Wenn die automatischen Balken angeschaltet sind, wird die Platzierung der automatischen Balken von drei Kontexteigenschaften bestimmt: @@ -2129,9 +2142,9 @@ einzelner Taktschlag. @lilypond[quote,relative=2,verbatim] \time 5/16 c16^"default" c c c c | -\set Timing.beatStructure = #'(2 3) +\set Timing.beatStructure = 2,3 c16^"(2+3)" c c c c | -\set Timing.beatStructure = #'(3 2) +\set Timing.beatStructure = 3,2 c16^"(3+2)" c c c c | @end lilypond @@ -2145,12 +2158,12 @@ werden, wenn die Bebalkung von @code{beatStructure} bestimmt werden soll. a8^"default" a a a a a a a \set Timing.baseMoment = #(ly:make-moment 1/4) -\set Timing.beatStructure = #'(1 1 1 1) +\set Timing.beatStructure = 1,1,1,1 a8^"no change" a a a a a a a \set Timing.beamExceptions = #'() \set Timing.baseMoment = #(ly:make-moment 1/4) -\set Timing.beatStructure = #'(1 1 1 1) +\set Timing.beatStructure = 1,1,1,1 a8^"changed" a a a a a a a @end lilypond @@ -2162,17 +2175,17 @@ niedrigere befindet. @lilypond[quote, verbatim,relative=1] \new Staff << \time 7/8 - \set Staff.beatStructure = #'(2 3 2) + \set Staff.beatStructure = 2,3,2 \new Voice = one { - \relative c'' { - a8 a a a a a a + \relative { + a'8 a a a a a a } } \new Voice = two { - \relative c' { + \relative { \voiceTwo - \set Voice.beatStructure = #'(1 3 3) - f8 f f f f f f + \set Voice.beatStructure = 1,3,3 + f'8 f f f f f f } } >> @@ -2188,11 +2201,11 @@ Systems angewendet werden sollen: % Context applied to Voice by dafault -- does not work correctly % Because of autogenerated voices, all beating will % be at baseMoment (1 . 8) -\set beatStructure = #'(3 1 1 2) +\set beatStructure = 3,1,1,2 << {a8 a a a16 a a a a8 a} \\ {f4. f8 f f f} >> % Works correctly with context Staff specified -\set Staff.beatStructure = #'(3 1 1 2) +\set Staff.beatStructure = 3,1,1,2 << {a8 a a a16 a a a a8 a} \\ {f4. f8 f f f} >> @end lilypond @@ -2204,7 +2217,7 @@ er kompatibel mit dem neuen Wert von @code{baseMoment} ist. @lilypond[quote,verbatim,relative=2] \time 5/8 \set Timing.baseMoment = #(ly:make-moment 1/16) -\set Timing.beatStructure = #'(7 3) +\set Timing.beatStructure = 7,3 \repeat unfold 10 { a16 } @end lilypond @@ -2225,7 +2238,7 @@ definiert. @lilypond[quote,relative=2,verbatim] \time 3/16 -\set Timing.beatStructure = #'(2 1) +\set Timing.beatStructure = 2,1 \set Timing.beamExceptions = #'( ;start of alist (end . ;entry for end of beams @@ -2272,15 +2285,17 @@ Wenn die Taktart geändert wird, werden neue Standardwerte für definiert wird, werden die automatischen Bebalkungsregeln für den @code{Timing}-Kontext auf den Standard zurückgesetzt. -@lilypond[quote,verbatim,relative=2] -\time 6/8 -\repeat unfold 6 { a8 } -% group (4 + 2) -\set Timing.beatStructure = #'(4 2) -\repeat unfold 6 { a8 } -% go back to default behavior -\time 6/8 -\repeat unfold 6 { a8 } +@lilypond[quote,verbatim] +\relative a' { + \time 6/8 + \repeat unfold 6 { a8 } + % group (4 + 2) + \set Timing.beatStructure = 4,2 + \repeat unfold 6 { a8 } + % go back to default behavior + \time 6/8 + \repeat unfold 6 { a8 } +} @end lilypond Die automatischen Standardeinstellungen für die Bebalkung einer @@ -2294,15 +2309,15 @@ versucht, den Takt in zwei Hälfen zu teilen, wenn nur Achtelnoten vorkommen. Die @code{beamExceptions}-Regel kann die @code{beatStructure}-Einstellung überschreiben, wenn @code{beamExceptions} nicht zurückgesetzt wird: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 4/4 \set Timing.baseMoment = #(ly:make-moment 1/8) -\set Timing.beatStructure = #'(3 3 2) +\set Timing.beatStructure = 3,3,2 % This won't beam (3 3 2) because of beamExceptions -\repeat unfold 8 {c8} | +\repeat unfold 8 {c''8} | % This will beam (3 3 2) because we clear beamExceptions \set Timing.beamExceptions = #'() -\repeat unfold 8 {c8} +\repeat unfold 8 {c''8} @end lilypond Auf gleiche Art werden Achtelnoten im 3/4-Takt über den ganzen Takt hin @@ -2326,11 +2341,13 @@ entsteht im 3/8-Takt. Dieses Verhalten wird durch die Eigenschaft @code{beamHalfMeasure} bestimmt, welche sich nur auf Takte mit einer 3 im Zähler auswirkt: -@lilypond[quote,verbatim,relative=2] -\time 3/4 -r4. a8 a a | -\set Timing.beamHalfMeasure = ##f -r4. a8 a a | +@lilypond[quote,verbatim] +\relative a' { + \time 3/4 + r4. a8 a a | + \set Timing.beamHalfMeasure = ##f + r4. a8 a a | +} @end lilypond @subsubheading @i{Wie die automatische Bebalkung funktioniert} @@ -2435,7 +2452,7 @@ vermeiden, ist es, die Taktart nur in einem System zu setzen. \new Staff { \time 3/4 \set Timing.baseMoment = #(ly:make-moment 1/8) - \set Timing.beatStructure = #'(1 5) + \set Timing.beatStructure = 1,5 \repeat unfold 6 { a8 } } \new Staff { @@ -2449,20 +2466,20 @@ werden, sodass die gewünschte Bebalkung immer benützt wird. Veränderungen der automatischen Bebalkungsregeln für eine Taktart sind in @ref{Taktangabe} beschrieben. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << \new Staff { \overrideTimeSignatureSettings 3/4 % timeSignatureFraction 1/8 % baseMomentFraction - #'(1 5) % beatStructure + 1,5 % beatStructure #'() % beamExceptions \time 3/4 - \repeat unfold 6 { a8 } + \repeat unfold 6 { a'8 } } \new Staff { \time 3/4 - \repeat unfold 6 { a8 } + \repeat unfold 6 { a'8 } } >> @end lilypond @@ -2486,8 +2503,8 @@ nicht dem der Musik gesetzt. Manuell definierte Balken werden mit den Zeichen @code{[} und @code{]} (AltGr+8 bzw. 9) markiert. -@lilypond[quote,relative=1,verbatim] -r4 r8[ g' a r] r g[ | a] r +@lilypond[quote,verbatim] +\relative { r4 r8[ g' a r] r g[ | a] r } @end lilypond @cindex manuelle Balken, Richtung zuweisen @@ -2496,12 +2513,11 @@ r4 r8[ g' a r] r g[ | a] r Die Richtung von Balken kann mit den Richtungszeichen verändert werden: -@lilypond[quote,relative=2,verbatim] -c8^[ d e] c,_[ d e f g] +@lilypond[quote,verbatim] +\relative { c''8^[ d e] c,_[ d e f g] } @end lilypond @funindex \noBeam -@funindex noBeam Einzelne Noten können mit dem Befehl @code{\noBeam} markiert werden, damit sie nicht mit einem Balken versehen werden. @@ -2514,12 +2530,14 @@ Balken von Verzierungsnoten und normale Balken können gleichzeitig gesetzt werden. Unbebalkte Verzierungen werden nicht innerhalb von normalen Balken gesetzt. -@lilypond[quote,verbatim,relative=2] -c4 d8[ -\grace { e32 d c d } -e8] e[ e -\grace { f16 } -e8 e] +@lilypond[quote,verbatim] +\relative { + c''4 d8[ + \grace { e32 d c d } + e8] e[ e + \grace { f16 } + e8 e] +} @end lilypond @funindex stemLeftBeamCount @@ -2535,14 +2553,16 @@ Im folgenden Beispiel hat das letzte @code{f} nur einen Balken an seiner linken Seite (der als Achtelbalken der gesamten Gruppe gewertet wird). -@lilypond[quote,relative=2,verbatim] -a8[ r16 f g a] -a8[ r16 -\set stemLeftBeamCount = #2 -\set stemRightBeamCount = #1 -f16 -\set stemLeftBeamCount = #1 -g16 a] +@lilypond[quote,verbatim] +\relative a' { + a8[ r16 f g a] + a8[ r16 + \set stemLeftBeamCount = #2 + \set stemRightBeamCount = #1 + f16 + \set stemLeftBeamCount = #1 + g16 a] +} @end lilypond @snippets @@ -2572,7 +2592,6 @@ Referenz der Interna: @cindex Balken, gespreizt @cindex gespreizte Balken -@funindex featherDurations @funindex \featherDurations @funindex grow-direction @@ -2604,16 +2623,18 @@ verlängert. Die ersten vier 32-Noten beschleunigen stufenweise das Tempo, während die darauffolgenden vier 32-Noten ein gleichmäßiges Tempo haben. -@lilypond[relative=1,verbatim,quote] -\override Beam.grow-direction = #LEFT -\featherDurations #(ly:make-moment 2/1) -{ c16[ c c c c c c c] } -\override Beam.grow-direction = #RIGHT -\featherDurations #(ly:make-moment 2/3) -{ c32[ d e f] } -% revert to non-feathered beams -\override Beam.grow-direction = #'() -{ g32[ a b c] } +@lilypond[verbatim,quote] +\relative c' { + \override Beam.grow-direction = #LEFT + \featherDurations #(ly:make-moment 2/1) + { c16[ c c c c c c c] } + \override Beam.grow-direction = #RIGHT + \featherDurations #(ly:make-moment 2/3) + { c32[ d e f] } + % revert to non-feathered beams + \override Beam.grow-direction = #'() + { g32[ a b c] } +} @end lilypond @noindent @@ -2660,7 +2681,6 @@ sind. @cindex Wiederholungszeichen @funindex \bar -@funindex bar Taktstriche trennen Takte voneinander, werden aber auch verwendet, um Wiederholungen anzuzeigen. Normalerweise werden sie automatisch @@ -2670,8 +2690,8 @@ Die einfachen, automatisch eingefügten Taktstriche können mit dem @code{\bar}-Befehl geändert werden. Eine doppelter Taktstrich etwa wird normalerweise am Ende eines Stückes gesetzt: -@lilypond[quote,relative=1,verbatim] -e4 d c2 \bar "|." +@lilypond[quote,verbatim] +\relative { e'4 d c2 \bar "|." } @end lilypond Es ist kein Fehler, wenn die letzte Note in einem Takt nicht @@ -2732,23 +2752,27 @@ des originalen Taktstriches nicht verändert. Manuell können zwei einfache Taktstriche und zusätzlich fünf Arten eines doppelten Taktstriches gesetzt werden: -@lilypond[quote,relative=1,verbatim] -f1 \bar "|" -f1 \bar "." -g1 \bar "||" -a1 \bar ".|" -b1 \bar ".." -c1 \bar "|.|" -d1 \bar "|." -e1 +@lilypond[quote,verbatim] +\relative { + f'1 \bar "|" + f1 \bar "." + g1 \bar "||" + a1 \bar ".|" + b1 \bar ".." + c1 \bar "|.|" + d1 \bar "|." + e1 +} @end lilypond Zusätzlich gibt es noch punktierte und gestrichelte Taktstriche: -@lilypond[quote,relative=1,verbatim] -f1 \bar ";" -g1 \bar "!" -a1 +@lilypond[quote,verbatim] +\relative { + f'1 \bar ";" + g1 \bar "!" + a1 +} @end lilypond @noindent @@ -2787,20 +2811,22 @@ Für @emph{segno}-Zeichen innerhalb des Systems gibt es drei Taktstricharten, die sich in ihrem Verhalten an Zeilenumbrüchen unterscheiden: -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar "S" -c4 c c c \break -\bar "S" -c4 c c c -\bar "S-|" -c4 c c c \break -\bar "S-|" -c4 c c c -\bar "S-S" -c4 c c c \break -\bar "S-S" -c1 +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar "S" + c4 c c c \break + \bar "S" + c4 c c c + \bar "S-|" + c4 c c c \break + \bar "S-|" + c4 c c c + \bar "S-S" + c4 c c c \break + \bar "S-S" + c1 +} @end lilypond @cindex Wiederholungen @@ -2816,43 +2842,47 @@ genauso wie @code{"|:"} verhält, außer bei Zeilenumbrüchen, wo ein doppelter Taktstrich am Ende der Zeile ausgegeben wird und ein öffnender Wiederholungsstrich am Anfang der nächsten Zeile. -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar ".|:-||" -c4 c c c \break -\bar ".|:-||" -c4 c c c +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar ".|:-||" + c4 c c c \break + \bar ".|:-||" + c4 c c c +} @end lilypond Für Kombinationen von Wiederholungen mit dem segno-Zeichen gibt es sechs verschiedene Variationen: -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar ":|.S" -c4 c c c \break -\bar ":|.S" -c4 c c c -\bar ":|.S-S" -c4 c c c \break -\bar ":|.S-S" -c4 c c c -\bar "S.|:-S" -c4 c c c \break -\bar "S.|:-S" -c4 c c c -\bar "S.|:" -c4 c c c \break -\bar "S.|:" -c4 c c c -\bar ":|.S.|:" -c4 c c c \break -\bar ":|.S.|:" -c4 c c c -\bar ":|.S.|:-S" -c4 c c c \break -\bar ":|.S.|:-S" -c1 +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar ":|.S" + c4 c c c \break + \bar ":|.S" + c4 c c c + \bar ":|.S-S" + c4 c c c \break + \bar ":|.S-S" + c4 c c c + \bar "S.|:-S" + c4 c c c \break + \bar "S.|:-S" + c4 c c c + \bar "S.|:" + c4 c c c \break + \bar "S.|:" + c4 c c c + \bar ":|.S.|:" + c4 c c c \break + \bar ":|.S.|:" + c4 c c c + \bar ":|.S.|:-S" + c4 c c c \break + \bar ":|.S.|:-S" + c1 +} @end lilypond Darüber hinaus wählt der @code{\inStaffSegno}-Befehl eines dieser @@ -2865,17 +2895,17 @@ Taktstriche sind miteinander verbunden innerhalb einer Gruppe (@code{StaffGroup}) oder einem Klaviersystem (@code{PianoStaff} bzw. (@code{GrandStaff}). -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << \new StaffGroup << - \new Staff { - e4 d + \new Staff \relative { + e'4 d \bar "||" f4 e } - \new Staff { \clef bass c4 g e g } + \new Staff \relative { \clef bass c'4 g e g } >> - \new Staff { \clef bass c2 c2 } + \new Staff \relative { \clef bass c'2 c2 } >> @end lilypond @@ -2888,7 +2918,6 @@ Taktstriche sind miteinander verbunden innerhalb einer Gruppe @funindex whichBar @funindex defaultBarType @funindex \bar -@funindex bar @funindex bartype Der Befehl @code{\bar }@var{Taktart} ist eine Kurzform von: @@ -3013,7 +3042,7 @@ Taktnummern können mit der oberen Ecke der Klammer zu Beginn des Systems zusammenstoßen. Um das zu verhindert, kann die @code{padding}-Eigenschaft von @code{BarNumer} verwendet werden, um die Zahl zu verschieben. Für mehr Information siehe -@rinternals{StaffgGroup} und @rinternals{BarNumber}. +@rinternals{StaffGroup} und @rinternals{BarNumber}. @node Takt- und Taktzahlüberprüfung @@ -3079,7 +3108,6 @@ als Taktüberprüfung zu funktionieren. @end lilypond @funindex \barNumberCheck -@funindex barNumberCheck Wenn man größere Musikstücke kopiert, kann es hilfreich sein, wenn LilyPond überprüft, ob die Taktnummer, in der Sie gerade kopieren, @@ -3108,7 +3136,6 @@ Schnipsel: @cindex Abschnitte markieren @cindex Markieren von Abschnitten -@funindex mark @funindex \mark Übungszeichen können mit dem @code{\mark}-Befehl ausgegeben werden: @@ -3128,12 +3155,14 @@ als Argument einsetzen, wenn man das Zeichen manuell setzen will. Der Wert, der eingesetzt werden soll, wird in der Eigenschaft @code{rehearsalMark} gespeichert. -@lilypond[quote,verbatim,relative=2] -c1 \mark \default -c1 \mark \default -c1 \mark #8 -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + c1 \mark \default + c1 \mark \default + c1 \mark #8 + c1 \mark \default + c1 \mark \default +} @end lilypond @noindent @@ -3149,13 +3178,15 @@ Buchstaben in einem Kasten, Buchstaben in einem Kreis). \set Score.markFormatter = #format-mark-circle-alphabet @end example -@lilypond[quote,verbatim,relative=2] -\set Score.markFormatter = #format-mark-box-alphabet -c1 \mark \default -c1 \mark \default -c1 \mark #8 -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + \set Score.markFormatter = #format-mark-box-alphabet + c1 \mark \default + c1 \mark \default + c1 \mark #8 + c1 \mark \default + c1 \mark \default +} @end lilypond @cindex Übungszeichen formatieren @@ -3173,16 +3204,18 @@ folgenden Beispiel ist @code{markFormatter} so definiert, dass eine Zahl ausgegeben wird. Dann wird ein Übungszeichen in einem Kasten produziert. -@lilypond[quote,verbatim,relative=2] -\set Score.markFormatter = #format-mark-numbers -c1 \mark \default -c1 \mark \default -\set Score.markFormatter = #format-mark-box-numbers -c1 \mark \default -\set Score.markFormatter = #format-mark-circle-numbers -c1 \mark \default -\set Score.markFormatter = #format-mark-circle-letters -c1 +@lilypond[quote,verbatim] +\relative c'' { + \set Score.markFormatter = #format-mark-numbers + c1 \mark \default + c1 \mark \default + \set Score.markFormatter = #format-mark-box-numbers + c1 \mark \default + \set Score.markFormatter = #format-mark-circle-numbers + c1 \mark \default + \set Score.markFormatter = #format-mark-circle-letters + c1 +} @end lilypond Die Datei @file{scm/translation-functions.scm} beinhaltet @@ -3224,17 +3257,18 @@ hinzufügen: @cindex Musikbuchstaben @funindex \musicglyph -@funindex musicglyph Musikbuchstaben (wie etwa das Segno-Zeichen) können mit dem Befehl @code{\musicglyph} als ein @code{\mark}-Zeichen definierte werden: -@lilypond[quote,verbatim,relative=1] -c1 \mark \markup { \musicglyph #"scripts.segno" } -c1 \mark \markup { \musicglyph #"scripts.coda" } -c1 \mark \markup { \musicglyph #"scripts.ufermata" } -c1 +@lilypond[quote,verbatim] +\relative c' { + c1 \mark \markup { \musicglyph #"scripts.segno" } + c1 \mark \markup { \musicglyph #"scripts.coda" } + c1 \mark \markup { \musicglyph #"scripts.ufermata" } + c1 +} @end lilypond @noindent @@ -3284,7 +3318,7 @@ Referenz der Interna: @funindex \grace @funindex \slashedGrace @funindex \acciaccatura -@funindex \appoggiature +@funindex \appoggiatura @cindex Verzierungen @cindex Ziernoten @@ -3296,27 +3330,31 @@ Verzierungen, mit dem Befehl @code{\grace} notiert, sind ausgeschriebene Ornamente. Sie werden in einer kleineren Schriftgröße gesetzt und nehmen keine logische Zeit im Takt ein. -@lilypond[quote,relative=2,verbatim] -c4 \grace b16 a4( -\grace { b16 c16 } a2) +@lilypond[quote,verbatim] +\relative { + c''4 \grace b16 a4( + \grace { b16 c16 } a2) +} @end lilypond Es gibt drei Arten von Verzierungen: den Vorschlag (engl. acciaccatura), eine angebundene Verzierungsnote -mit einem Schrägstrich durch den Hals, und den Vorhalt (engl. appogiatura), +mit einem Schrägstrich durch den Hals, und den Vorhalt (engl. appoggiatura), welcher den Wert der Hauptnote um seinen eigenen Wert verkürzt und ohne Schrägstrich notiert wird. Man kann einen Vorschlag auch mit Schrägstrich durch den Hals, aber ohne Legatobogen notieren. Diese Verzierung wird mit dem Befehl @code{\slashedGrace} notiert und wird zwischen Noten notiert, die selber einen Legatobogen haben. -@lilypond[quote,relative=2,verbatim] -\acciaccatura d8 c4 -\appoggiatura e8 d4 -\acciaccatura { g16 f } e2 -\slashedGrace a,8 g4 -\slashedGrace b16 a4( -\slashedGrace b8 a2) +@lilypond[quote,verbatim] +\relative { + \acciaccatura d''8 c4 + \appoggiatura e8 d4 + \acciaccatura { g16 f } e2 + \slashedGrace a,8 g4 + \slashedGrace b16 a4( + \slashedGrace b8 a2) +} @end lilypond Die Position von Verzierungen ist zwischen Notensystemen @@ -3329,7 +3367,6 @@ System zwei 16-Noten für jede 8-Note des zweiten Systems: @end lilypond @funindex \afterGrace -@funindex afterGrace @cindex Verzierung, danach @cindex Nachschlag @@ -3339,8 +3376,8 @@ Sie den @code{\afterGrace}-Befehl benutzen. Er benötigt zwei Argumente: die Hauptnote und die Verzierung, die nach der Hauptnote folgen soll: -@lilypond[quote,verbatim,relative=2] -c1 \afterGrace d1 { c16[ d] } c1 +@lilypond[quote,verbatim] +\relative { c''1 \afterGrace d1 { c16[ d] } c1 } @end lilypond Damit wird die Verzierung mit einem Abstand von der Hauptnote @@ -3350,18 +3387,18 @@ verändert werden. Das nächste Beispiel zeigt, wie sich der Abstand verändert, wenn der Wert 3/4, 15/16 und 1/2 der Hauptnote beträgt. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - \new Staff { - c1 \afterGrace d1 { c16[ d] } c1 + \new Staff \relative { + c''1 \afterGrace d1 { c16[ d] } c1 } - \new Staff { + \new Staff \relative { #(define afterGraceFraction (cons 15 16)) - c1 \afterGrace d1 { c16[ d] } c1 + c''1 \afterGrace d1 { c16[ d] } c1 } - \new Staff { + \new Staff \relative { #(define afterGraceFraction (cons 1 2)) - c1 \afterGrace d1 { c16[ d] } c1 + c''1 \afterGrace d1 { c16[ d] } c1 } >> @end lilypond @@ -3391,11 +3428,11 @@ Verzierungsausdrucks rückgängig gemacht werden. In diesem Fall wird die Richtung der Hälse geändert und dann wieder der Standard eingestellt: -@lilypond[quote,verbatim,relative=2] -\new Voice { +@lilypond[quote,verbatim] +\new Voice \relative { \acciaccatura { \stemDown - f16-> + f''16-> \stemNeutral } g4 e c2 @@ -3459,10 +3496,10 @@ Auch andere Symbole der Systeme, wie Vorzeichen, Taktlinien usw., werden synchronisiert. Vorsicht ist geboten, wenn nur in bestimmten Systemen Verzierungen vorkommen: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Staff { e4 \bar ".|:" \grace c16 d2. } - \new Staff { c4 \bar ".|:" d2. } + \new Staff \relative { e''4 \bar ".|:" \grace c16 d2. } + \new Staff \relative { c''4 \bar ".|:" d2. } >> @end lilypond @@ -3559,8 +3596,8 @@ als Argument und produzieren entweder Ganztaktpausen oder leere Takte, die genauso lang sind wie der Notenabschnitt. @lilypond[verbatim,quote] -MyCadenza = \relative c' { - c4 d8 e f g g4 +MyCadenza = \relative { + c'4 d8 e f g g4 f2 g4 g } diff --git a/Documentation/de/notation/simultaneous.itely b/Documentation/de/notation/simultaneous.itely index 1eb7afce45..982bac08e0 100644 --- a/Documentation/de/notation/simultaneous.itely +++ b/Documentation/de/notation/simultaneous.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.28" +@c \version "2.19.29" @c Translators: Till Paala @@ -59,32 +59,40 @@ zwischen spitze Klammern (@code{<} und @code{>}) gesetzt werden. Auf einen Akkord kann eine Dauer-Angabe folgen, genauso wie bei einfachen Noten. -@lilypond[verbatim,quote,relative=2] -1 2 4 8. 16 +@lilypond[verbatim,quote] +\relative { + 1 2 4 8. 16 +} @end lilypond Akkorde können auch von Artikulationen gefolgt werden, genau wie auch einfache Noten. -@lilypond[verbatim,quote,relative=2] -1\fermata 2-> 4\prall 8.^! 16-. +@lilypond[verbatim,quote] +\relative { + 1\fermata 2-> 4\prall 8.^! 16-. +} @end lilypond Die Noten innerhalb der Akkorde konnen auch von Artikulationen oder Ornamenten gefolgt werden. -@lilypond[verbatim,quote,relative=2] -1 c-^ e>2 4 -8. 16 +@lilypond[verbatim,quote] +\relative { + 1 c-^ e>2 4 + 8. 16 +} @end lilypond Manche Notationselemente, wie etwa Dynamik, Crescendo-Klammern und Legatobögen müssen an den gesamten Akkord gehängt werden und nicht an einzelne Noten, damit sie ausgegeben werden. -@lilypond[verbatim,quote,relative=2] -1 \f ( ) -\< \! +@lilypond[verbatim,quote] +\relative { + 1 \f ( ) + \< \! +} @end lilypond Ein Akkord ist sozusagen ein Container für die Noten, ihre Artikulationen @@ -95,10 +103,12 @@ Note oder der folgende Akkord und werden damit kombiniert (für komplexere Möglichkeiten, derartige Elemente zu kombinieren, siehe @ref{Gleichzeitige Ausdrücke}. -@lilypond[verbatim,quote,relative=2] -\grace { g8( a b } -<> ) \p \< -. -\markup \italic "sempre staccato" -\repeat unfold 4 { c4 e } c1\f +@lilypond[verbatim,quote] +\relative { + \grace { g'8( a b } + <> ) \p \< -. -\markup \italic "sempre staccato" + \repeat unfold 4 { c4 e } c1\f +} @end lilypond @cindex relative Tonhöhe, Akkorde @@ -110,8 +120,10 @@ vorherigen Akkordes, oder mit der Tonhöhe der letzten Note vor dem Akkord (wenn kein Akkord vorhergeht). Alle anderen Noten innerhalb des Akkordes sind relativ zu der Note vorher innerhalb des selben Akkordes. -@lilypond[verbatim,quote,relative=2] -1 +@lilypond[verbatim,quote] +\relative { + 1 +} @end lilypond Mehr Information über Akkorden findet sich in @ref{Notation von Akkorden}. @@ -163,8 +175,10 @@ Cluster, siehe @ref{Cluster}. Um Schreibarbeit zu ersparen, kann ein Zeichen benutzt werden, um den vorhergehenden Akkord zu wiederholen. Das Symbol hierzu ist @code{q}: -@lilypond[verbatim,quote,relative=2] -1 q 2 q +@lilypond[verbatim,quote] +\relative { + 1 q 2 q +} @end lilypond Genauso wie normale Akkorde kann auch das Akkord-Wiederholungssymbol @@ -172,8 +186,10 @@ in Verbindung mit Tondauern, Artikulationen, Beschriftungen, Legatobögen, Balken usw. benutzt werden, weil nur die Tonhöhen des vorangehenden Akkordes wiederholgt werden. -@lilypond[verbatim,quote,relative=2] -1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +@lilypond[verbatim,quote] +\relative { + 1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +} @end lilypond Das Akkordwiederholungssymbol erinnert sich an das letzte Vorkommen @@ -181,9 +197,11 @@ eines Akkordes, sodass man den letzten Akkord wiederholen kann, auch wenn in der Zwischenzeit nicht-Akkord-Noten oder -Pause auftetreten sind. -@lilypond[verbatim,quote,relative=2] -1 c'4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1 c'4 q2 r8 q8 | + q2 c, | +} @end lilypond Das Akkord-Wiederholungssymbol behält keine Dynamikzeichen, Artikulationen @@ -201,9 +219,9 @@ wiederholt werden, es sei denn, der gleiche Ereignistyp wird selber mit dem @code{q} verwendet: @lilypond[verbatim,quote] -\relative c'' { +\relative { \chordRepeats #'(articulation-event) - { 1\sfz c'4 q2 r8 q8-. } | + { 1\sfz c'4 q2 r8 q8-. } | q2 c, | } @end lilypond @@ -227,8 +245,8 @@ letzten Note in diesem Beispiel: \new Voice \relative c'' { \chordRepeats #'(articulation-event) - \relative c'' - { 1\sfz c'4 q2 r8 q8-. } | + \relative + { 1\sfz c'4 q2 r8 q8-. } | q2 c | } @end lilypond @@ -262,15 +280,19 @@ Systemen gesetzt. Das nächste Beispiel zeigt simultane Konstruktionen auf einem System: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Voice { % explicit single voice - << { a4 b g2 } { d4 g c,2 } >> + << \relative { a'4 b g2 } + \relative { d'4 g c,2 } >> } @end lilypond -@lilypond[quote,verbatim,relative=2] -% single first note -a << { a4 b g } { d4 g c, } >> +@lilypond[quote,verbatim] +\relative { + % single first note + a' << \relative { a'4 b g } + \relative { d'4 g c, } >> +} @end lilypond Dass kann benutzt werden, wenn die simultanen Abschnitte einen @@ -280,8 +302,10 @@ Fehlermeldungen. Noten, Artikulationen und Eigenschaftsänderungen in einer @emph{einzelnen} @samp{Voice} werden gesammelt und in musikalischer Reihenfolge gesetzt: -@lilypond[quote,verbatim,relative=2] -4-. <>-. << c a >> << { c-. } { a s-. } >> +@lilypond[quote,verbatim] +\relative { + 4-. <>-. << c a >> << { c-. } { a s-. } >> +} @end lilypond Mehrfache Hälse oder Balken oder unterschiedliche Notendauern @@ -291,9 +315,10 @@ Einsatz von mehreren Stimmen. Das nächste Beispiel zeigt, wie ein simultaner Ausdruck implizit mehrere Systeme erstellt: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % no single first note -<< { a4 b g2 } { d4 g2 c,4 } >> +<< \relative { a'4 b g2 } + \relative { d'4 g2 c,4 } >> @end lilypond In diesem Fall stellt der unterschiedliche Rhythmus kein Problem dar, @@ -331,7 +356,6 @@ Resultaten führen. (Siehe auch @ref{Auflösung von Zusammenstößen}.) @cindex Notencluster @funindex \makeClusters -@funindex makeClusters Ein Cluster zeigt an, dass alle Tonhöhen in einem Bereich gleichzeitig gespielt werden sollen. Cluster können gedeutet werden als eine @@ -339,8 +363,8 @@ Zusammenfassung einer ganzen Anzahl von Noten. Sie werden notiert, indem die Funktion @code{\makeClusters} auf eine Reihe von Akkorden angewendet wird: -@lilypond[quote,relative=2,verbatim] -\makeClusters { 2 } +@lilypond[quote,verbatim] +\relative \makeClusters { 2 } @end lilypond Normale Noten und Cluster können zusammen im selben System notiert @@ -401,11 +425,9 @@ oder mehreren Systemen. @cindex Mehrstimmigkeit @cindex Polyphonie @funindex \voiceOne -@funindex voiceOne @funindex \voiceOne ... \voiceFour @funindex Voice @funindex \oneVoice -@funindex oneVoice @strong{@i{Stimmen explicit beginnen}} @@ -413,12 +435,12 @@ Die grundlegende Struktur, die man benötigt, um mehrere unabhängige Stimmen in einem Notensystem zu setzen, ist im Beispiel unten dargestellt: -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] \new Staff << \new Voice = "first" - { \voiceOne r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { \voiceOne r8 r16 g'' e8. f16 g8[ c,] f e16 d } \new Voice= "second" - { \voiceTwo d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { \voiceTwo d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @@ -453,10 +475,10 @@ der eckigen Klammern werden anderen Stimmennummern zugewiesen. Damit lassen sich auch Gesangstexte einer durchgehenden Stimme vor, während und nach dem polyphonen Abschnitt zuweisen: -@lilypond[quote, verbatim, relative=2] -<< +@lilypond[quote,verbatim] +\relative << \new Voice = "melody" { - a4 + a'4 << { \voiceOne @@ -495,11 +517,11 @@ erstellt und haben die festen Bezeichnungen @code{"1"}, Das erste Beispiel könnte also auch wie folgt notiert werden: -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { r8 r16 g'' e8. f16 g8[ c,] f e16 d } \\ - { d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @@ -516,13 +538,13 @@ notiert, damit sie die Eigenschaften von @code{voiceThree} zugewiesen bekommt. Unsichtbare Pause werden eingesetzt, damit keine doppelten Pausen ausgegeben werden. -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 g g g g f16 ees f8 d } + \relative { r8 g'' g g g f16 ees f8 d } \\ - { ees,8 r ees r d r d r } + \relative { ees'8 r ees r d r d r } \\ - { d'8 s c s bes s a s } + \relative { d''8 s c s bes s a s } >> @end lilypond @@ -578,10 +600,10 @@ sich Akkorde ergeben. Um das zu erreichen, müssen sie einfach von spitzen Klammern innerhalb einer expliziten Stimme umgeben werden: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] \new Voice << - { e4 f8 d e16 f g8 d4 } - { c4 d8 b c16 d e8 b4 } + \relative { e''4 f8 d e16 f g8 d4 } + \relative { c''4 d8 b c16 d e8 b4 } >> @end lilypond @@ -629,15 +651,15 @@ Schnipsel: Stimmen können unterschiedliche Farben erhalten, um einfach erkennbar zu sein: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { \voiceOneStyle d4 c2 b4 } + \relative { \voiceOneStyle d''4 c2 b4 } \\ - { \voiceTwoStyle e,2 e } + \relative { \voiceTwoStyle e'2 e } \\ - { \voiceThreeStyle b2. c4 } + \relative { \voiceThreeStyle b2. c4 } \\ - { \voiceFourStyle g'2 g } + \relative { \voiceFourStyle g'2 g } >> @end lilypond @@ -679,21 +701,13 @@ Schnipsel: @cindex Pausen verschieben, automatisch @cindex Verschieben von Pausen, automatisch @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn @funindex \shiftOff -@funindex shiftOff @funindex \mergeDifferentlyDottedOn -@funindex mergeDifferentlyDottedOn @funindex \mergeDifferentlyDottedOff -@funindex mergeDifferentlyDottedOff @funindex \mergeDifferentlyHeadedOn -@funindex mergeDifferentlyHeadedOn @funindex \mergeDifferentlyHeadedOff -@funindex mergeDifferentlyHeadedOff Die Notenköpfe von Noten in unterschiedlichen Stimmen mit derselben Tonhöhe, demselben Notenkopf und den Hälsen in entgegengesetzte @@ -705,18 +719,20 @@ folgende Beispiel zeigt drei unterschiedliche Situationen, auf Taktposition 1 und 3 in Takt 1 und Taktposition 1 in Takt 2, wo das automatische Verschmelzen nicht funktioniert. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { - c8 d e d c d c4 + \relative { + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -726,19 +742,21 @@ werden, mit der Ausnahme von Halben- und Viertelnotenköpfen, wie im Beispiel unten gezeigt. Hier werden die Notenköpfe auf Taktposition 1 im ersten Takt verschmolzen: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -746,20 +764,22 @@ im Beispiel unten gezeigt. Hier werden die Notenköpfe auf Taktposition Auch Köpfe mit unterschiedlichen Punktierungen wie auf Taktposition 3 im ersten Takt können verschmolzen werden: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -777,21 +797,23 @@ Kolumne zu entfernen. Jetzt funktioniert @code{\mergeDifferentlyHeadedOn} (verschmelze Noten mit unterschiedlichen Köpfen) so wie es soll. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 \shiftOn g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -819,10 +841,10 @@ der Stimmen in der Eingabedatei nicht die gleiche sein wie die vertikale Anordnung der Stimmen im Notensystem!} @lilypond[quote,verbatim] -\new Staff \relative c'' { +\new Staff \relative { %% abbreviated entry << - { f2 } % 1: highest + { f''2 } % 1: highest \\ { g,2 } % 2: lowest \\ @@ -877,7 +899,7 @@ Musikglossar: Handbuch zum Lernen: @rlearning{Mehrere Noten auf einmal}, @rlearning{Voice enthält Noten}, -@rlearning{Beispiele aus dem Leben}. +@rlearning{Beispiel aus dem Leben}. Schnipsel: @rlsr{Simultaneous notes}. @@ -892,11 +914,11 @@ Die Benutzung von @code{\override NoteColumn.ignore-collision = ##t} führt dazu, dass Noten mit unterschiedlichen Köpfen in unterschiedlichen Stimmen falsch verschmolzen werden. -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim,fragment] \mergeDifferentlyHeadedOn -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> \override NoteColumn.ignore-collision = ##t -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> @end lilypond @ignore @@ -918,7 +940,6 @@ are at the same time differently dotted are not clear. @cindex a due-Stellen @cindex solo-Stellen @funindex \partcombine -@funindex partcombine Automatische Kombination von Stimmen wird verwendet, um zwei selbständige Stimmen auf einem Notensystem zu setzen. Es wird vor allem @@ -942,17 +963,17 @@ und dann kombiniert gesetzt. Die gleichen Variablen werden für die Stimmen und das kombinierte System benutzt. @lilypond[quote,verbatim] -instrumentOne = \relative c' { - c4 d e f | +instrumentOne = \relative { + c'4 d e f | R1 | d'4 c b a | b4 g2 f4 | e1 | } -instrumentTwo = \relative g' { +instrumentTwo = \relative { R1 | - g4 a b c | + g'4 a b c | d4 c b a | g4 f( e) d | e1 | @@ -992,17 +1013,11 @@ keinen Einfluss auf die Tonhöhen von @code{@var{musikAusdr1}} oder @code{@var{musikAusdr2}}. @funindex \partcombineChords -@funindex partcombineChords @funindex \partcombineApart -@funindex partcombineApart @funindex \partcombineUnisono -@funindex partcombineUnisono @funindex \partcombineSoloI -@funindex partcombineSoloI @funindex \partcombineSoloII -@funindex partcombineSoloII @funindex \partcombineAutomatic -@funindex partcombineAutomatic In professionellen Partituren werden Stimmen oft für lange Strecken auseinander gehalten, auch wenn eine oder mehrere Noten tatsälich aufeinander treffen und @@ -1012,33 +1027,33 @@ oder eine Stimme als Solo anzuzeigen ist darum nicht ideal, weil die Grund kann die @code{\partcombine}-Funktion mit folgenden Befehlen verändert werden: -Befehle, die auf @code{@dots Once} enden, gelten nur für die nächste +Befehle, die auf @code{@dots{} Once} enden, gelten nur für die nächste Note eines musikalischen Ausdrucks. @itemize @item -@code{\partcombineApart} und @code{\partcombineApartOnce} +@code{\partcombineApart} und @code{\once \partcombineApart} erhalten die Noten als zwei unterschiedliche Stimmen, auch wenn sie als Akkord oder Unisono kombiniert werden könnten. @item -@code{\partcombineChords} und @code{\partcombineChordsOnce} +@code{\partcombineChords} und @code{\once \partcombineChords} kombinieren die Noten als Akkord. @item -@code{\partcombineUnisono} und @code{\partcombineUnisonoOnce} +@code{\partcombineUnisono} und @code{\once \partcombineUnisono} kombinieren beide Stimmen als Unisono. @item -@code{\partcombineSoloI} und @code{\partcombineSoloIOnce} +@code{\partcombineSoloI} und @code{\once \partcombineSoloI} setzen nur Stimme eins und markieren sie als @qq{Solo}. @item -@code{\partcombineSoloII} und @code{\partcombineSoloIIOnce} +@code{\partcombineSoloII} und @code{\once \partcombineSoloII} setzen nur Stimme zwei und markieren sie als @qq{Solo}. @item -@code{\partcombineAutomatic} und @code{\partcombineAutomaticOnce} +@code{\partcombineAutomatic} und @code{\once \partcombineAutomatic} beenden die Wirkung der Befehle oben und stellt das normale Verhalten des Kombinationsmechanismus wieder her. @@ -1050,11 +1065,11 @@ instrumentOne = \relative c' { \partcombineAutomatic e2^"auto" e | \partcombineChords e'2^"chord" e | \partcombineAutomatic c2^"auto" c | - \partcombineApart c2^"apart" \partcombineChordsOnce e^"chord once" | + \partcombineApart c2^"apart" \once \partcombineChords e^"chord once" | c2 c | } -instrumentTwo = \relative c' { - c2 c | +instrumentTwo = \relative { + c'2 c | e2 e | a,2 c | c2 c' | @@ -1137,7 +1152,6 @@ wenn Sie @code{\partcombine} in Tabulaturen benutzen @cindex Eingabe von Noten parallel @cindex Verschachtelte Musik @funindex \parallelMusic -@funindex parallelMusic Noten für mehrere Stimmen können verschachtelt notiert werden. Die Funktion @code{\parallelMusic} akzeptiert eine Liste mit @@ -1154,12 +1168,12 @@ die Takte müssen die gleiche Länge haben.} \parallelMusic #'(voiceA voiceB voiceC) { % Bar 1 r8 g'16 c'' e'' g' c'' e'' r8 g'16 c'' e'' g' c'' e'' | - r16 e'8.~ e'4 r16 e'8.~ e'4 | + r16 e'8.~ 4 r16 e'8.~ 4 | c'2 c'2 | % Bar 2 r8 a'16 d'' f'' a' d'' f'' r8 a'16 d'' f'' a' d'' f'' | - r16 d'8.~ d'4 r16 d'8.~ d'4 | + r16 d'8.~ 4 r16 d'8.~ 4 | c'2 c'2 | } @@ -1180,12 +1194,12 @@ relative Noten von @code{voiceA} die Noten von @code{voiceB}. \parallelMusic #'(voiceA voiceB voiceC) { % Bar 1 r8 g16 c e g, c e r8 g,16 c e g, c e | - r16 e8.~ e4 r16 e8.~ e4 | + r16 e8.~ 4 r16 e8.~ 4 | c2 c | % Bar 2 r8 a,16 d f a, d f r8 a,16 d f a, d f | - r16 d8.~ d4 r16 d8.~ d4 | + r16 d8.~ 4 r16 d8.~ 4 | c2 c | } @@ -1244,7 +1258,7 @@ global = { @seealso Handbuch zum Lernen: -@rlearning{Stücke durch Bezeichner organisieren}. +@rlearning{Stücke durch Variablen organisieren}. Schnipsel: @rlsr{Simultaneous notes}. diff --git a/Documentation/de/notation/spacing.itely b/Documentation/de/notation/spacing.itely index 1b4d0ce673..67f8b0ab7d 100644 --- a/Documentation/de/notation/spacing.itely +++ b/Documentation/de/notation/spacing.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.30" +@c \version "2.19.22" @c Translators: Till Paala @@ -69,8 +69,8 @@ Dieser Abschnitt behandelt Seitenlayout-Optionen innerhalb der @code{\paper}-Umg @node Die paper-Umgebung -@subsection Die @code{\paper}-Umgebung -@translationof The \paper block +@subsection Die @code{@bs{}paper}-Umgebung +@translationof The paper block @cindex Papiergröße @cindex Größe, Papier @@ -105,7 +105,7 @@ in @ref{Eigene Kopf und Fußzeilen sowie Titel}. Die meisten @code{\paper}-Variablen funktionieren nur innerhalb der @code{\paper}-Umgebung. Die wenigen, die auch in der @code{\layout}-Umgebung -funktionieren, finden sich in @ref{Die \layout-Umgebung}. +funktionieren, finden sich in @ref{Die layout-Umgebung}. Außer wenn anders angegeben, werden alle @code{\paper}-Variablen, die Abständen auf der Seite antsprechen, in Millimetern gemessen, es sei denn, @@ -145,7 +145,7 @@ der obigen Definition ist: Notationsreferenz @ref{Papierformat und automatische Skalierung}, @ref{Eigene Kopf und Fußzeilen sowie Titel}, -@ref{Die \layout-Umgebung}. +@ref{Die layout-Umgebung,,Die @code{@bs{}layout}-Umgebung}. Installierte Dateien: @file{ly/paper-defaults-init.ly}. @@ -299,8 +299,8 @@ Installierte Dateien: @node Vertikale paper-Variablen mit festen Abständen -@unnumberedsubsubsec Vertikale @code{\paper}-Variablen mit festen Abständen -@translationof Fixed vertical spacing \paper variables +@subsection Vertikale @code{@bs{}paper}-Variablen mit festen Abständen +@translationof Fixed vertical spacing paper variables @warning{Einige @code{@bs{}paper}-Dimensionen werden automatisch nach Papierformat skaliert, was zu ungewolltem Verhalten führen kann. Siehe @@ -369,8 +369,8 @@ Randeinstellung für die Ränder oben und unten. @node Vertikale paper-Variablen mit flexiblen Abständen -@unnumberedsubsubsec Vertikale @code{\paper}-Variablen mit flexiblen Abständen -@translationof Flexible vertical spacing \paper variables +@subsection Vertikale @code{@bs{}paper}-Variablen mit flexiblen Abständen +@translationof Flexible vertical spacing paper variables In den meisten Fällen bietet es sich an, dass die vertikalen Abstände zwischen bestimmten Objekten (wie Ränder, Titel, @@ -391,7 +391,7 @@ werden, und nicht innerhalb der @code{\paper}-Umgebung. Siehe auch @menu * Struktur der Alisten für flexible vertikale Abstände:: -* Liste der flexiblen vertikalen Abstandsvariablen in \paper:: +* Liste der flexiblen vertikalen Abstandsvariablen in paper:: @end menu @@ -478,7 +478,7 @@ vollständig neu definiert: @example \paper @{ - system-system-spacing #'basic-distance = #8 + system-system-spacing.basic-distance = #8 score-system-spacing = #'((basic-distance . 12) (minimum-distance . 6) @@ -488,9 +488,9 @@ vollständig neu definiert: @end example -@node Liste der flexiblen vertikalen Abstandsvariablen in \paper -@unnumberedsubsubsec Liste der flexiblen vertikalen Abstandsvariablen in @code{\paper} -@translationof List of flexible vertical spacing \paper variables +@node Liste der flexiblen vertikalen Abstandsvariablen in paper +@unnumberedsubsubsec Liste der flexiblen vertikalen Abstandsvariablen in @code{@bs{}paper} +@translationof List of flexible vertical spacing paper variables Die Bezeichnungen dieser Variablen entsprechen dem Format @code{@var{obere}-@var{untere}-platzierung}, wobei @code{@var{obere}} @@ -572,8 +572,8 @@ Schnipsel: @node paper-Variablen für horizontale Abstände -@unnumberedsubsubsec \paper-Variablen für horizontale Abstände -@translationof Horizontal spacing \paper variables +@subsection @code{@bs{}paper}-Variablen für horizontale Abstände +@translationof Horizontal spacing paper variables @warning{Einige @code{@bs{}paper}-Dimensionen werden automatische entsprechend dem Papierformat skaliert und können deshalb ungewollte @@ -587,8 +587,8 @@ Resultate haben. Siehe @ref{Automatische Skalierung auf ein Papierformat}.} @node paper-Variablen für Breite und Ränder -@unnumberedsubsubsec \paper-Variablen für Breite und Ränder -@translationof \paper variables for widths and margins +@unnumberedsubsubsec @code{@bs{}paper}-Variablen für Breite und Ränder +@translationof paper variables for widths and margins Standardwerte (vor der Skalierung), die hier nicht aufgelistet sind, finden sich in @file{ly/paper-defaults-init.ly}. @@ -693,8 +693,8 @@ Randeinstellung für die Ränder oben und unten. @node paper-Variablen für zweiseitigen Satz -@unnumberedsubsubsec @code{\paper}-Variablen für zweiseitigen Satz -@translationof \paper variables for two-sided mode +@unnumberedsubsubsec @code{@bs{}paper}-Variablen für zweiseitigen Satz +@translationof paper variables for two-sided mode Standardwerte (vor der Skalierung) sind definiert in @file{ly/paper-defaults-init.ly}. @@ -748,8 +748,8 @@ Installierte Dateien: @node paper-Variablen für Verschiebungen und Einrückungen -@unnumberedsubsubsec @code{\paper}-Variablen für Verschiebungen und Einrückungen -@translationof \paper variables for shifts and indents +@unnumberedsubsubsec @code{@bs{}paper}-Variablen für Verschiebungen und Einrückungen +@translationof paper variables for shifts and indents Standardwerte (vor der Skalierung), die hier nicht aufgeführt sind, @@ -794,8 +794,8 @@ Schnipsel: @node Andere paper-Variablen -@subsection Andere @code{\paper}-Variablen -@translationof Other \paper variables +@subsection Andere @code{@bs{}paper}-Variablen +@translationof Other paper variables @menu * paper-Variablen für den Zeilenumbruch:: @@ -806,8 +806,8 @@ Schnipsel: @node paper-Variablen für den Zeilenumbruch -@unnumberedsubsubsec @code{\paper}-Variablen für den Zeilenumbruch -@translationof \paper variables for line breaking +@unnumberedsubsubsec @code{@bs{}paper}-Variablen für den Zeilenumbruch +@translationof paper variables for line breaking @c TODO: Mention that ly:optimal-breaking is on by default? -mp @table @code @@ -849,8 +849,8 @@ Notationsreferenz: @node paper-Variablen für den Seitenumbruch -@unnumberedsubsubsec @code{\paper}-Variablen für den Seitenumbruch -@translationof \paper variables for page breaking +@unnumberedsubsubsec @code{@bs{}paper}-Variablen für den Seitenumbruch +@translationof paper variables for page breaking Standardwerte, die hier nicht aufgelistet sind, finden sich in @file{ly/paper-defaults-init.ly} @@ -919,8 +919,8 @@ Installierte Dateien: @node paper-Variablen für Seitenzahlen -@unnumberedsubsubsec @code{\paper}-Variablen für Seitenzahlen -@translationof \paper variables for page numbering +@unnumberedsubsubsec @code{@bs{}paper}-Variablen für Seitenzahlen +@translationof paper variables for page numbering Standardwerte, die hier nicht aufgelistet sind, finden sich in @file{ly/paper-defaults-init.ly} @@ -970,8 +970,8 @@ auf der rechten Seite mit Seite 1 beginnen. @node Verschiedene paper-Variablen -@unnumberedsubsubsec Verschiedene @code{\paper}-Variablen -@translationof Miscellaneous \paper variables +@unnumberedsubsubsec Verschiedene @code{@bs{}paper}-Variablen +@translationof Miscellaneous paper variables @table @code @item page-spacing-weight @@ -1009,7 +1009,7 @@ benutzt werden, etwa so: tagline = ##f } \score { - \relative c'' { c1 \break c1 \break c1 } + \relative { c''1 \break c1 \break c1 } } } @end lilypond @@ -1038,14 +1038,14 @@ Zeile. @translationof Score layout @menu -* Die \layout-Umgebung +* Die layout-Umgebung:: * Die Notensystemgröße einstellen:: @end menu -@node Die \layout-Umgebung -@subsection Die @code{\layout}-Umgebung -@translationof The \layout block +@node Die layout-Umgebung +@subsection Die @code{@bs{}layout}-Umgebung +@translationof The layout block @cindex Partitur, Layout @cindex Layout, Partitur @@ -1185,11 +1185,11 @@ Das obige Beispiel, das den Einsatz von @code{\layoutVariable} zeigt, würde in seiner finalen Version folgende @code{\layout}-Umgebung haben: @example - TextScript #'padding = #1 - TextScript #'color = #magenta - Glissando #'thickness = #1.5 - NoteHead #' font-size = #4 - NoteHead #' color = #red + TextScript.padding = #1 + TextScript.color = #magenta + Glissando.thickness = #1.5 + NoteHead.font-size = #4 + NoteHead.color = #red @end example plus die Veränderungen an Einrückung (@code{indent}) und @code{StaffGrouper}. @@ -1198,8 +1198,8 @@ Aber wenn die Variable vor der ersten @code{\layout}-Umgebung definiert wird, würde die aktuelle Konfiguration nur enthalten: @example - NoteHead #' font-size= #4 % (written in the variable definition) - NoteHead #' color = #red % (added after the use of the variable) + NoteHead.font-size= #4 % (written in the variable definition) + NoteHead.color = #red % (added after the use of the variable) @end example Wenn man sorgfältig plant, können @code{\layout}-Variablen ein wertvolles @@ -1370,9 +1370,11 @@ weit gespreizt wirken und aufeinander folgende Seiten einen Einen manuellen Zeilenumbruch fügt man mit dem Befehl @code{\break} ein: -@lilypond[quote,ragged-right,relative=2,verbatim] -c4 c c c | \break -c4 c c c | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c c | \break + c4 c c c | +} @end lilypond Normalerweise wird ein @code{\break} in der Mitte eines Takes ignoriert @@ -1381,11 +1383,13 @@ Taktes zu erzwingen, können Sie mit @code{\bar ""} eine unsichtbare Taktlinie hinzufügen, die dann den Zeilenumbruch erlaubt. -@lilypond[quote,ragged-right,relative=2,verbatim] -c4 c c -\bar "" \break -c | -c4 c c c | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c + \bar "" \break + c | + c4 c c c | +} @end lilypond Ein @code{\break} an einem Taktstrich wird auch ignoriert, wenn der letzte @@ -1399,9 +1403,9 @@ müssen. @lilypond[quote,ragged-right,verbatim] \new Voice \with { \remove "Forbid_line_break_engraver" -} \relative c'' { +} \relative { << - { c2. \tuplet 3/2 { c4 c c } c2. | } + { c''2. \tuplet 3/2 { c4 c c } c2. | } { s1 | \break s1 | } >> } @@ -1411,10 +1415,12 @@ Genauso werden normalerweise Zeilenumbrüche auch verhindert, wenn Balken über die Taktenden hinausragen. Dieses Verhalten kann verändert werden, indem man @code{\override Beam.breakable = ##t} einstellt: -@lilypond[quote,ragged-right,relative=2,verbatim] -\override Beam.breakable = ##t -c2. c8[ c | \break -c8 c] c2. | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \override Beam.breakable = ##t + c2. c8[ c | \break + c8 c] c2. | +} @end lilypond Mit dem Befehl @code{\noBreak} wird ein Zeilenumbruch an dem @@ -1763,7 +1769,7 @@ Wenn @code{line-break-permission} die Einstellung falsch ragged-bottom = ##t } -music = \relative c'' { c8 c c c } +music = \relative { c''8 c c c } \score { \new Staff { @@ -1800,7 +1806,7 @@ Zeilen- und Seitenumbruchbefehle werden normalerweise direkt zusammen mit den Noten eingegeben. @example -music = \relative c'' @{ c4 c c c @} +music = \relative @{ c''4 c c c @} \score @{ \new Staff @{ @@ -1819,7 +1825,7 @@ Diese zusätzliche Stimme enthält nur unsichtbare Noten und die Umbruchbefehle: @lilypond[quote,verbatim] -music = \relative c'' { c4 c c c } +music = \relative { c''4 c c c } \score { \new Staff << @@ -1847,7 +1853,7 @@ anderer Eigenschaften von @ref{Vertikale Abstände}). @lilypond[quote,verbatim] -music = \relative c'' { c4 c c c } +music = \relative { c''4 c c c } \score { \new Staff << @@ -2024,7 +2030,7 @@ staffAffinityDown = \with { } labelContext = #(define-music-function - (parser location context) + (context) (string?) #{ s1*0^\markup { \typewriter #context } #}) @@ -2767,17 +2773,19 @@ des Systems um den gleichen Platz streiten, wird das mit dem geringeren Wert von @code{outside-staff-priority} näher an das entsprechende Notensystem gesetzt. -@lilypond[quote,ragged-right,relative=2,verbatim] -c4_"Text"\pp -r2. -\once \override TextScript.outside-staff-priority = #1 -c4_"Text"\pp % this time the text will be closer to the staff -r2. -% by setting outside-staff-priority to a non-number, -% we disable the automatic collision avoidance -\once \override TextScript.outside-staff-priority = ##f -\once \override DynamicLineSpanner.outside-staff-priority = ##f -c4_"Text"\pp % now they will collide +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4_"Text"\pp + r2. + \once \override TextScript.outside-staff-priority = #1 + c4_"Text"\pp % this time the text will be closer to the staff + r2. + % by setting outside-staff-priority to a non-number, + % we disable the automatic collision avoidance + \once \override TextScript.outside-staff-priority = ##f + \once \override DynamicLineSpanner.outside-staff-priority = ##f + c4_"Text"\pp % now they will collide +} @end lilypond Der Platz, der zwischen einem Objekt außerhalb des Systems und @@ -2921,13 +2929,13 @@ mit den Standardwerten und dann mit größeren Werten, damit man sie besser sieht: @lilypond[quote,ragged-right] -{ - c'4 e''4 e'4 b'4 | - b'4 e''4 b'4 e''4 | +\fixed c' { + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | \override Staff.NoteSpacing.stem-spacing-correction = #1.5 \override Staff.StaffSpacing.stem-spacing-correction = #1.5 - c'4 e''4 e'4 b'4 | - b'4 e''4 b'4 e''4 | + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | } @end lilypond @@ -2962,7 +2970,7 @@ Es gibt derzeit keine Möglichkeit, den Platz zu verringern. @node Eine neuer Bereich mit anderen Abständen @subsection Eine neuer Bereich mit anderen Abständen -@translationof New spacing area +@translationof New spacing section @cindex horizontale Notenabstände, Abschnitte definierten @cindex Notenabstände, Abschnitte definieren @@ -3021,8 +3029,8 @@ eine größere Dauer ist als @code{1 16}. @lilypond[verbatim,line-width=12\cm] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | @@ -3032,8 +3040,8 @@ eine größere Dauer ist als @code{1 16}. @lilypond[verbatim,line-width=12\cm] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | @@ -3713,8 +3721,8 @@ Beispiel zeigt die normalen Abstände: @lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | @@ -3732,8 +3740,8 @@ angegeben wird: @lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | diff --git a/Documentation/de/notation/staff.itely b/Documentation/de/notation/staff.itely index 1c694be3a4..47d22bb9b4 100644 --- a/Documentation/de/notation/staff.itely +++ b/Documentation/de/notation/staff.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @c Translators: Till Paala @@ -60,7 +60,6 @@ Gruppen von Systemen zu erstellen. @cindex neues Notensystem @funindex \drummode -@funindex drummode @funindex DrumStaff @funindex RhythmicStaff @funindex TabStaff @@ -71,12 +70,12 @@ Gruppen von Systemen zu erstellen. @notation{Notensysteme} (engl. @notation{staff}, Pl. @notation{staves}) werden mit dem @code{\new} oder @code{\context}-Befehl erstellt. Zu Einzelheiten siehe -@ref{Kontexte erstellen}. +@ref{Kontexte erstellen und referenzieren}. Der einfachste Notensystem-Kontext ist @code{Staff}: -@lilypond[verbatim,quote,relative=2] -\new Staff { c4 d e f } +@lilypond[verbatim,quote] +\new Staff \relative { c''4 d e f } @end lilypond @code{DrumStaff} (Perkussionsnotensystem) erstellt ein Notensystem @@ -99,7 +98,7 @@ eingegebenen Noten dargestellt werden. Die wirklichen Längen bleiben erhalten. Zu Einzelheiten, siehe @ref{Melodierhythmus anzeigen}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new RhythmicStaff { c4 d e f } @end lilypond @@ -107,8 +106,8 @@ erhalten. Zu Einzelheiten, siehe Saiten in der üblichen Gitarrenstimmung. Zu Einzelheiten siehe @ref{Standardtabulaturen}. -@lilypond[verbatim,quote,relative=2] -\new TabStaff { c4 d e f } +@lilypond[verbatim,quote] +\new TabStaff \relative { c''4 d e f } @end lilypond Es gibt zwei Notensysteme, die zur Notation von Alter Musik eingesetzt @@ -120,8 +119,8 @@ Das @code{GregorianTranscriptionStaff} (System zur Transkription des Gregorianischen Chorals) erstellt ein Notensystem, um modernen Gregorianischen Choral zu notieren. Es hat keine Notenlinien. -@lilypond[verbatim,quote,relative=2] -\new GregorianTranscriptionStaff { c4 d e f e d } +@lilypond[verbatim,quote] +\new GregorianTranscriptionStaff \relative { c''4 d e f e d } @end lilypond @@ -136,7 +135,7 @@ Glossar: @rglos{staves}. Notationsreferenz: -@ref{Kontexte erstellen}, +@ref{Kontexte erstellen und referenzieren}, @ref{Schlagzeugsysteme}, @ref{Melodierhythmus anzeigen}, @ref{Standardtabulaturen}, @@ -188,40 +187,40 @@ Wenn kein Kontext angegeben ist, wird die Standardeinstellung eingesetzt: die Gruppe beginnt mit einer vertikalen Linie und die Taktlinien sind nicht verbunden. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond Im @code{StaffGroup}-Kontext die Gruppe mit einer eckigen Klammer begonnen und die Taktlinien durch alle Systeme gezogen. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond In einem @code{ChoirStaff} (Chorsystem) beginnt die Gruppe mit einer eckigen Klammer, aber die Taktlinien sind nicht verbunden. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new ChoirStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond In einem @code{GrandStaff} (Akkolade) beginnt die Gruppe mit einer geschweiften Klammer und die Taktlinien sind durchgezogen. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new GrandStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond @@ -230,11 +229,11 @@ Der @code{PianoStaff}-(Klaviersystem)-Kontext ist identisch mit dem die Angabe einer Instrumentbezeichnung. Zu Einzelheiten siehe @ref{Instrumentenbezeichnungen}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new PianoStaff << \set PianoStaff.instrumentName = #"Piano" - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { \clef bass c1 c } >> @end lilypond @@ -314,17 +313,17 @@ diesem Fall erstellt jeder neue, innen liegende Kontext eine neue Klammer außerhalb der Klammer der Systemgruppe, in der er sich befindet. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c2 c | c2 c } + \new Staff \relative { c''2 c | c2 c } \new StaffGroup << - \new Staff { g2 g | g2 g } + \new Staff \relative { g'2 g | g2 g } \new StaffGroup \with { systemStartDelimiter = #'SystemStartSquare } << - \new Staff { e2 e | e2 e } - \new Staff { c2 c | c2 c } + \new Staff \relative { e'2 e | e2 e } + \new Staff \relative { c'2 c | c2 c } >> >> >> @@ -377,15 +376,15 @@ mit einer Option in der @code{\paper}-Umgebung angeschalten. \score { \new StaffGroup << \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } } \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } @@ -459,18 +458,18 @@ beenden sowie eine Methode, Ossia-Systeme zu erstellen. @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff Die Befehle @code{\stopStaff} und @code{\startStaff} können benutzt werden, um ein Notensystem zu stoppen oder (wieder) zu beginnen. -@lilypond[verbatim,quote,relative=2] -\stopStaff f4 d \startStaff g, e -f'4 d \stopStaff g, e -f'4 d \startStaff g, e +@lilypond[verbatim,quote] +\relative { + \stopStaff f''4 d \startStaff g, e + f'4 d \stopStaff g, e + f'4 d \startStaff g, e +} @end lilypond @predefined @@ -487,14 +486,16 @@ gesetzt werden, bevor das System erstellt wird. Die Anzahl der Notenlinien kann verändert werden: -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-count = #2 -\startStaff g, e | - -f'4 d \stopStaff -\revert Staff.StaffSymbol.line-count -\startStaff g, e | +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-count = #2 + \startStaff g, e | + + f'4 d \stopStaff + \revert Staff.StaffSymbol.line-count + \startStaff g, e | +} @end lilypond @@ -505,13 +506,15 @@ Eine einzelne Linie wird für jeden Wert ausgegeben, sodass die Anzahl der Linien sowie ihre Position im Notensystem mit einem Befehl geändert werden können. -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) -\startStaff g, e | -f'4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) -\startStaff g, e +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) + \startStaff g, e | + f'4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) + \startStaff g, e | +} @end lilypond die Position des Notenschlüssels und die Position von c' können geändert @@ -522,11 +525,12 @@ Die Liniendicke der Notenlinien kann verändert werden. Die Dicke der Hilfslinien und Notenhälse wird auch beeinflusst, weil sie von der Notenliniendicke abhängen. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #3 +} \relative { + f''4 d g, e } -{ f4 d g, e } @end lilypond Die Dicke der Hilfslinien (engl. ledger lines) kann allerdings auch unabhängig von der @@ -535,21 +539,23 @@ sind Faktoren, mit denen die Notenlinien-Dicke und der Notenlinienabstand multipliziert werden. Die Addition beider Werte ergibt die Dicke der Hilfslinien. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #2 \override StaffSymbol.ledger-line-thickness = #'(0.5 . 0.4) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond Die vertikale Position der Hilfslinien kann verändert werden: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-positions = #'(-3 -2 -1 2 5 6) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond Zusätzliche Hilfslinien können auch innerhalb des Systems gesetzt @@ -571,11 +577,12 @@ d4 e f g Der Abstand zwischen Notenlinien kann verändert werden. Diese Einstellung wirkt sich auch auf den Abstand der Hilfslinien aus. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.staff-space = #1.5 +} \relative { + f'''4 d, g, e, } -{ f'4 d, g, e, } @end lilypond @snippets @@ -620,8 +627,8 @@ gleichzeitige Notensysteme an der entsprechenden Position erstellt werden: @lilypond[verbatim,quote] -\new Staff \relative c'' { - c4 b d c +\new Staff \relative { + c''4 b d c << { c4 b d c } \new Staff { e4 d f e } @@ -645,8 +652,8 @@ ein, um den Ossia-Abschnitt auszurichten. Diese Methode bietet sich an, wenn nur einige Ossia-Systeme benötigt werden. @lilypond[verbatim,quote] -\new Staff = main \relative c'' { - c4 b d c +\new Staff = main \relative { + c''4 b d c << { c4 b d c } @@ -684,8 +691,8 @@ Stücke setzt. } { \stopStaff s1*6 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 << { e4 f e2 } \context Staff = ossia { @@ -719,12 +726,12 @@ Mehr Information zu @code{\Staff \RemoveEmptyStaves} findet sich in fontSize = #-3 \override StaffSymbol.staff-space = #(magstep -3) \override StaffSymbol.thickness = #(magstep -3) - } \relative c'' { + } \relative { R1*3 - c4 e8 d c2 + c''4 e8 d c2 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 e4 f e2 g4 a g2 \break c4 b c2 @@ -780,10 +787,8 @@ Referenz der Interna: @cindex Verschwinden von leeren Systemen @funindex \RemoveEmptyStaves -@funindex RemoveEmptyStaves @funindex Staff_symbol_engraver @funindex \stopStaff -@funindex stopStaff Die Notenlinien können entfernt werden, indem der @code{Staff_symbol_engraver} aus dem @code{Staff}-Kontext @@ -794,7 +799,7 @@ eingesetzt werden. \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c''' { a8 f e16 d c b a2 } +\relative { a''8 f e16 d c b a2 } @end lilypond Leere Systeme können versteckt werden, wenn der @@ -815,9 +820,9 @@ der drei enthält.} } } -\relative c' << +\relative << \new Staff { - e4 f g a \break + e'4 f g a \break b1 \break a4 b c2 } @@ -840,7 +845,6 @@ um Ossiaabschnitte zu erstellen. Zu Einzelheiten, siehe @cindex Verstecken von Rhythmus-Systemen @funindex \RemoveEmptyStaves -@funindex RemoveEmptyStaves Der @code{\VaticanaStaff \RemoveEmptyStaves}-Befehl kann benutzt werden, um leere Takte in Notation der Alten Musik @@ -930,12 +934,13 @@ werden. Der Wert von @code{instrumentName} wird für das erste System eingesetzt, der Wert von @code{shortInstrumentName} für alle weiteren Systeme. -@lilypond[verbatim,quote,ragged-right,relative=1] +@lilypond[verbatim,quote,ragged-right] \new Staff \with { instrumentName = #"Violin " shortInstrumentName = #"Vln. " +} \relative { + c'4.. g'16 c4.. g'16 \break | c1 | } -{ c4.. g'16 c4.. g'16 \break | c1 } @end lilypond @cindex Instrumentenbezeichnung, komplexe @@ -943,15 +948,16 @@ alle weiteren Systeme. Mit dem Textbeschriftungsmodus (@code{\markup}) können auch komplizierte Instrumentenbezeichnungen erstellt werden: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { instrumentName = \markup { \column { "Clarinetti" \line { "in B" \smaller \flat } } } +} \relative { + c''4 c,16 d e f g2 } -{ c4 c,16 d e f g2 } @end lilypond @cindex Instrumentenbezeichnung, zentriert @@ -989,26 +995,22 @@ Einzugs (@code{indent} und @code{short-indent}) vergrößert werden. Zu Einzelheiten siehe @ref{paper-Variablen für Verschiebungen und Einrückungen,,@code{@bs{}paper}-Variablen für Verschiebungen und Einrückungen}. @lilypond[verbatim,quote,ragged-right] -\relative c'' { - << - \new Staff \with { - instrumentName = #"Alto Flute in G" - shortInstrumentName = #"Flt." - } - { - f2 g4 f \break - g4 f g2 - } - \new Staff \with { - instrumentName = #"Clarinet" - shortInstrumentName = #"Clar." - } - { - c,4 b c2 \break - c2 b4 c - } - >> -} +<< + \new Staff \with { + instrumentName = #"Alto Flute in G" + shortInstrumentName = #"Flt." + } \relative { + f''2 g4 f \break + g4 f g2 + } + \new Staff \with { + instrumentName = #"Clarinet" + shortInstrumentName = #"Clar." + } \relative { + c''4 b c2 \break + c2 b4 c + } +>> \layout { indent = 3.0\cm @@ -1052,9 +1054,7 @@ und spätere Änderungen nicht berücksichtigt. @cindex Wechsel von Instrument @funindex \addInstrumentDefinition -@funindex addInstrumentDefinition @funindex \instrumentSwitch -@funindex instrumentSwitch Wenn das Instrument gewechselt werden soll, kann der Befehl @code{\addInstrumentDefinition} in Begleitung von @@ -1087,7 +1087,7 @@ wird dann benutzt, um den Wechsel vorzunehmen: R1*16 \instrumentSwitch "contrabassoon" c,,2 g \break - c,1 ~ | c1 + c,1 ~ | 1 } @end lilypond @@ -1116,11 +1116,8 @@ Referenz der Interna: @cindex Stimmen, zitieren @funindex \addQuote -@funindex addQuote @funindex \quoteDuring -@funindex quoteDuring @funindex \transposition -@funindex transposition Es kommt sehr oft vor, dass eine Orchesterstimme die gleichen Noten wie eine andere spielt. So können etwa die ersten und @@ -1139,12 +1136,12 @@ Argumente: die Bezeichnung der zitierten Stimme, wie vorher mit für die Dauer des Zitates. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { s1 } } \addQuote "flute" { \fluteNotes } @@ -1163,12 +1160,12 @@ unsichtbare Noten oder Ganztaktpausen etwa Noten enthält, wird eine polyphone Stelle begonnen, was meistens nicht erwünscht ist: @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } } \addQuote "flute" { \fluteNotes } @@ -1193,8 +1190,8 @@ clarinetNotes = \relative c'' { b4 ais a ais | cis4^"quoted" r8 bis\p b4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"clarinet" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"clarinet" { s1 } } \addQuote "clarinet" { \clarinetNotes } @@ -1223,13 +1220,13 @@ auszuwählen, welche Objekte der zitierten Noten dargestllt werden. Das geschieht mit der @code{quotedEventTypes}-Kontexteigenschaft. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a2 g2 | +fluteNotes = \relative { + a'2 g2 | b4\<^"quoted" r8 ais a4\f( c->) } -oboeNotes = \relative c'' { - c2. b4 | +oboeNotes = \relative { + c''2. b4 | \quoteDuring #"flute" { s1 } } @@ -1287,13 +1284,9 @@ werden, ist das Notenbild unter Umständen sehr schlecht. @cindex Zitieren von anderen Stimmen @funindex \cueDuring -@funindex cueDuring @funindex \cueClef -@funindex cueClef @funindex \cueDuringWithClef -@funindex cueDuringWithClef @funindex \quoteDuring -@funindex quoteDuring @cindex Noten, kleiner @cindex kleinere Noten @@ -1302,15 +1295,17 @@ werden, ist das Notenbild unter Umständen sehr schlecht. Die einfachste Art, Stichnoten zu erstellen, ist es, einen @code{CueVoice}-Kontext in der Stimme zu erstellen. -@lilypond[verbatim,relative=1] -R1 -<< - { e2\rest r4. e8 } - \new CueVoice { - \stemUp d'8^"flute" c d e fis2 - } ->> -d,4 r a r +@lilypond[verbatim] +\relative { + R1 + << + { e'2\rest r4. e8 } + \new CueVoice { + \stemUp d'8^"flute" c d e fis2 + } + >> + d,4 r a r +} @end lilypond Der Befehl @code{\cueClef} kann auch in einem expliziten @@ -1320,28 +1315,32 @@ Stichnoten ausgegeben. Der Befehl @code{\cueClefUnset} kann dann eingesetzt werden, um wieder zum ursprünglichen Schlüssel zurückzukehren, wiederum in der richtigen Größe: -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -<< - { e2\rest r4. \cueClefUnset e,8 } - \new CueVoice { - \cueClef "treble" \stemUp d''8^"flute" c d e fis2 - } ->> -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + << + { e'2\rest r4. \cueClefUnset e,8 } + \new CueVoice { + \cueClef "treble" \stemUp d''8^"flute" c d e fis2 + } + >> + d,,4 r a r +} @end lilypond Die Befehle @code{\cueClef} und @code{\cueClefUnset} können auch ohne eine @code{CueVoice}-Umgebung eingesetzt werden: -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -\cueClef "treble" -d'8^"flute" c d e fis2 -\cueClefUnset -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + \cueClef "treble" + d''8^"flute" c d e fis2 + \cueClefUnset + d,,4 r a r +} @end lilypond Für kompliziertere Stichnotenbehandlung, etwa mit Transposition, @@ -1370,8 +1369,8 @@ womit die zitierten Noten entweder als erste oder als zweite Stimme in einem System gesetzt werden. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 | d8 c d e fis2 | g2 d | +fluteNotes = \relative { + r2. c''4 | d8 c d e fis2 | g2 d | } oboeNotes = \relative c'' { @@ -1402,8 +1401,8 @@ erstellt werden, weil sonst der gesamte musikalische Ausdruck zum @code{CueVoice}-Kontext gehören würde.} @lilypond[verbatim,quote] -oboeNotes = \relative c'' { - r2 r8 d16(\f f e g f a) +oboeNotes = \relative { + r2 r8 d''16(\f f e g f a) g8 g16 g g2. } \addQuote "oboe" { \oboeNotes } @@ -1427,8 +1426,8 @@ aber der originale Schlüssel muss auch manuell am Ende der Stichnoten wieder hergestellt werden. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { @@ -1457,8 +1456,8 @@ Schlüsselwechsel anzeigt, den man für die Stichnoten braucht. Der originale Schlüssel wird automatisch wieder hergesetllt. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { @@ -1477,7 +1476,6 @@ bassoonNotes = \relative c { @end lilypond @funindex \transposedCueDuring -@funindex transposedCueDuring Genauso wie @code{\quoteDuring} berücksichtigt auch @code{\cueDuring} Transpositionen. Stichnoten werden auf den Tonhöhen erstellt, die für @@ -1487,15 +1485,15 @@ um die klingenden Töne des Quelleninstruments zu produzieren. Um Stichnoten anders zu transponieren, muss @code{\transposedCueDuring} benutzt werden. Dieser Befehl braucht ein zusätzliches Argument, um (in absolutem Modus) die gedruckte Tonhöhe vorzugeben, mit der das -das zweigestrichene C dargestellt werden soll. Das ist nützlich, wenn +das eingestrichene C dargestellt werden soll. Das ist nützlich, wenn man Stichnoten von einem Instrument mit einem vollständig anderen Register benutzt: @lilypond[verbatim,quote] -piccoloNotes = \relative c''' { +piccoloNotes = \relative { \clef "treble^8" R1 - c8 c c e g2 + c'''8 c c e g2 c4 g g2 } @@ -1519,9 +1517,7 @@ bassClarinetNotes = \relative c' { @cindex cue notes, removing @funindex \killCues -@funindex killCues @funindex \addInstrumentDefinition -@funindex addInstrumentDefinition Der @code{\killCues}-Befehl entfernt Stichnoten aus einem musikalischen Ausdruck, sodass derselbe musikalische Ausdruck @@ -1534,8 +1530,8 @@ können mit Marken versehen werden, um sie selektiv einzufügen, siehe @ref{Marken benutzen}. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { diff --git a/Documentation/de/notation/text.itely b/Documentation/de/notation/text.itely index fb2a9fce5c..ef12e4bb0d 100644 --- a/Documentation/de/notation/text.itely +++ b/Documentation/de/notation/text.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.6" +@c \version "2.19.21" @c Translators: Till Paala @@ -69,8 +69,8 @@ zeigt. Derartiger Text kann manuell über oder unter dem Notensystem platziert werden, die Syntax hierzu ist beschrieben in @ref{Richtung und Platzierung}. -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e a4-"scherz." f +@lilypond[quote,verbatim] +\relative { a'8^"pizz." g f e a4-"scherz." f } @end lilypond Diese Syntax ist eine Kurzform, komplexere Formatierungen @@ -79,9 +79,10 @@ explizit den @code{\markup}-Befehl mit darauf folgenden geschweiften Klammern einsetzt, wie beschrieben in @ref{Text formatieren}. -@lilypond[quote,verbatim,relative=2] -a8^\markup { \italic pizz. } g f e -a4_\markup { \tiny scherz. \bold molto } f +@lilypond[quote,verbatim] +\relative { + a'8^\markup { \italic pizz. } g f e + a4_\markup { \tiny scherz. \bold molto } f } @end lilypond Standardmäßig haben Textbeschriftungen keinen Einfluss auf die @@ -92,10 +93,12 @@ zweite die Note nach rechts verschiebt. Das Verhalten wird mit dem Befehl @code{\textLengthOn} (Textlänge an) erreicht, rückgängig kann es mit dem Befehl @code{\textLengthOff} gemacht werden. -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e -\textLengthOn -a4_"scherzando" f +@lilypond[quote,verbatim] +\relative { + a'8^"pizz." g f e + \textLengthOn + a4_"scherzando" f +} @end lilypond Neben Textbeschriftungen können auch Artikulationen an Noten angehängt @@ -162,10 +165,12 @@ auswirkt. Solche Objekte, @qq{Strecker} (engl. spanners) genannt, können von einer Note bis zu einer anderen mit folgender Anweisung erstellt werden: -@lilypond[verbatim,quote,relative=2] -\override TextSpanner.bound-details.left.text = "rit." -b1\startTextSpan -e,\stopTextSpan +@lilypond[verbatim,quote] +\relative { + \override TextSpanner.bound-details.left.text = "rit." + b'1\startTextSpan + e,\stopTextSpan +} @end lilypond @cindex Textstrecker, Formatierung @@ -178,11 +183,13 @@ Standardeinstellungen wird er kursiv ausgegeben, aber eine andere Formatierung kann erreicht werden, indem man @code{\markup}-Blöcke einsetzt, wie beschrieben in @ref{Text formatieren}. -@lilypond[quote,relative=2,verbatim] -\override TextSpanner.bound-details.left.text = - \markup { \upright "rit." } -b1\startTextSpan c -e,\stopTextSpan +@lilypond[quote,verbatim] +\relative { + \override TextSpanner.bound-details.left.text = + \markup { \upright "rit." } + b'1\startTextSpan c + e,\stopTextSpan +} @end lilypond Auch der Stil der Linie kann ähnlich wie der Text mit den Objekteigenschaften @@ -242,9 +249,7 @@ Referenz der Interna: @cindex Symbole auf der Taktstrich @funindex \mark -@funindex mark @funindex \markup -@funindex markup Verschiedene Textelemente können der Partitur hinzugefügt werden, indem man die Syntax für Zeichen einsetzen, wie beschrieben in @@ -253,10 +258,12 @@ indem man die Syntax für Zeichen einsetzen, wie beschrieben in @c \mark needs to be placed on a separate line (it's not @c attached to an object like \markup is). -vv -@lilypond[verbatim,quote,relative=2] -c4 -\mark "Allegro" -c c c +@lilypond[verbatim,quote] +\relative { + c''4 + \mark "Allegro" + c c c +} @end lilypond Diese Syntax ermöglicht es, beliebigen Text über eine Taktlinie @@ -264,11 +271,13 @@ zu platzieren, weitere Formatierungsmöglichkeiten sind mit dem @code{\markup}-Befehl gegeben, wie beschrieben in @ref{Text formatieren}: -@lilypond[quote,verbatim,relative=1] -1 -\mark \markup { \italic { colla parte } } -2 -1 +@lilypond[quote,verbatim] +\relative { + 1 + \mark \markup { \italic { colla parte } } + 2 + 1 +} @end lilypond @noindent @@ -278,10 +287,12 @@ Symbol mit dem Befehl @code{\musicglyph} angegeben wird, wie beschrieben in @ref{Musikalische Notation innerhalb einer Textbeschriftung}: -@lilypond[quote,verbatim,relative=2] -2 -\mark \markup { \musicglyph #"scripts.ufermata" } -1 +@lilypond[quote,verbatim] +\relative { + 2 + \mark \markup { \musicglyph #"scripts.ufermata" } + 1 +} @end lilypond @noindent @@ -340,7 +351,6 @@ ausgegeben. @cindex oberste Ebene, Text @funindex \markup -@funindex markup Eine @code{\markup}-Umgebung kann auch für sich alleine existieren, außerhalb einer @code{\score}-Umgebung, als ein Ausdruck auf der @@ -434,7 +444,6 @@ Formatierung von Text, wobei der Textbeschriftungsmodus @cindex Beschriftung, Text @cindex Setzen von Text -@funindex markup @funindex \markup Eine @code{\markup}-Umgebung wird benutzt, um Text mit einer @@ -458,14 +467,16 @@ oder weitere Textbefehle befinden, eingeführt mit einem Backslash@tie{}(@code{\}). Derartige Befehle beziehen sich nur auf den ersten der folgenden Ausdrücke. -@lilypond[quote,verbatim,relative=2] -a1-\markup intenso -a2^\markup { poco \italic più forte } -c e1 -d2_\markup { \italic "string. assai" } -e -b1^\markup { \bold { molto \italic agitato } } -c +@lilypond[quote,verbatim] +\relative { + a'1-\markup intenso + a2^\markup { poco \italic più forte } + c e1 + d2_\markup { \italic "string. assai" } + e + b1^\markup { \bold { molto \italic agitato } } + c +} @end lilypond @cindex Sonderzeichen in Textbeschriftungen @@ -485,10 +496,12 @@ ausgegeben, wie sie eingeben werden. Doppelte Anführungsstriche können gesetzt werden, indem man ihnen einen Backslash voranstellt. @c KEEP LY -@lilypond[quote,verbatim,relative=2] -a1^"\italic Text..." -a_\markup { \italic "... setzt \"kursive\" Buchstaben!" } -a a +@lilypond[quote,verbatim] +\relative { + a'1^"\italic Text..." + a_\markup { \italic "... setzt \"kursive\" Buchstaben!" } + a a +} @end lilypond Damit eine Anzahl von Wörtern als ein einziger Ausdruck behandelt @@ -499,11 +512,13 @@ sie übereinander gestapelt, mittig und aneinander ausgerichtet werden. Im folgenden Beispiel verhält sich der zweite @code{\markup}-Ausdruck genauso wie der erste: -@lilypond[quote,verbatim,relative=2] -c1^\markup { \center-column { a bbb c } } -c1^\markup { \center-column { a { bbb c } } } -c1^\markup { \center-column { a \line { bbb c } } } -c1^\markup { \center-column { a "bbb c" } } +@lilypond[quote,verbatim] +\relative c'' { + c1^\markup { \center-column { a bbb c } } + c1^\markup { \center-column { a { bbb c } } } + c1^\markup { \center-column { a \line { bbb c } } } + c1^\markup { \center-column { a "bbb c" } } +} @end lilypond Textbeschriftung kann auch durch Variablen definiert werden. Diese @@ -554,14 +569,16 @@ Syntaxfehler im Textbeschriftungsmodus können sehr verwirrend sein. Einfache Änderungen des Schriftartschnitts können im Textbeschriftungsmodus vorgenommen werden: -@lilypond[quote,verbatim,relative=2] -d1^\markup { - \bold { Più mosso } - \italic { non troppo \underline Vivo } +@lilypond[quote,verbatim] +\relative { + d''1^\markup { + \bold { Più mosso } + \italic { non troppo \underline Vivo } + } + r2 r4 r8 + d,_\markup { \italic quasi \smallCaps Tromba } + f1 d2 r } -r2 r4 r8 -d,_\markup { \italic quasi \smallCaps Tromba } -f1 d2 r @end lilypond @cindex Schriftgröße @@ -583,47 +600,52 @@ zur globalen Notensystemgröße: Sie kann auf eine vordefinierte Größe gesetzt werden: -@lilypond[quote,verbatim,relative=2] -b1_\markup { \huge Sinfonia } -b1^\markup { \teeny da } -b1-\markup { \normalsize camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \huge Sinfonia } + b1^\markup { \teeny da } + b1-\markup { \normalsize camera } +} @end lilypond Sie kann relativ zum vorherigen Wert gesetzt werden: -@lilypond[quote,verbatim,relative=2] -b1_\markup { \larger Sinfonia } -b1^\markup { \smaller da } -b1-\markup { \magnify #0.6 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \larger Sinfonia } + b1^\markup { \smaller da } + b1-\markup { \magnify #0.6 camera } +} @end lilypond Sie kann vergrößert oder verkleinert werden relativ zum Wert, der von der globalen Notensystemgröße vorgegeben wird: -@lilypond[quote,verbatim,relative=2] -b1_\markup { \fontsize #-2 Sinfonia } -b1^\markup { \fontsize #1 da } -b1-\markup { \fontsize #3 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \fontsize #-2 Sinfonia } + b1^\markup { \fontsize #1 da } + b1-\markup { \fontsize #3 camera } +} @end lilypond Sie kann auch auf eine bestimmte Punktegröße festgelegt werden, unabhängig von der globalen Notensystemgröße: -@lilypond[quote,verbatim,relative=2] -b1_\markup { \abs-fontsize #20 Sinfonia } -b1^\markup { \abs-fontsize #8 da } -b1-\markup { \abs-fontsize #14 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \abs-fontsize #20 Sinfonia } + b1^\markup { \abs-fontsize #8 da } + b1-\markup { \abs-fontsize #14 camera } +} @end lilypond @cindex hochgestellt @cindex tiefergestellt @funindex \super -@funindex super @funindex \sub -@funindex sub @funindex \normal-size-super -@funindex normal-size-super Text kann auch hoch- bzw. tiefgestellt gesetzt werden. Die so markierten Buchstaben werden automatisch in einer kleineren Schriftgröße gesetzt, @@ -777,30 +799,33 @@ werden. Standardmäßig wird ein Textobjekt an seiner linken Ecke ausgerichtet, darum wird das erste und zweite Objekt gleichermaßen an der linken Ecke ausgerichtet. -@lilypond[quote,verbatim,relative=2] -d1-\markup { poco } -f -d-\markup { \left-align poco } -f -d-\markup { \center-align { poco } } -f -d-\markup { \right-align poco } +@lilypond[quote,verbatim] +\relative { + d''1-\markup { poco } + f + d-\markup { \left-align poco } + f + d-\markup { \center-align { poco } } + f + d-\markup { \right-align poco } +} @end lilypond @funindex \halign -@funindex halign Die horizontale Ausrichtung kann mit einer Zahl auf einen exakten Wert festgelegt werden: -@lilypond[quote,verbatim,relative=2] -a1-\markup { \halign #-1 poco } -e' -a,-\markup { \halign #0 poco } -e' -a,-\markup { \halign #0.5 poco } -e' -a,-\markup { \halign #2 poco } +@lilypond[quote,verbatim] +\relative { + a'1-\markup { \halign #-1 poco } + e' + a,-\markup { \halign #0 poco } + e' + a,-\markup { \halign #0.5 poco } + e' + a,-\markup { \halign #2 poco } +} @end lilypond @noindent @@ -827,21 +852,23 @@ werden, welcher entweder ein anderes Textelement oder ein unsichtbares Objekt sein kann (im Beispiel mit @code{\null} erstellt). Der letzte Text im Beispiel hat keinen Anker und wird deshalb auch nicht verschoben. -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \raise #2 { Scène 1 } -} -a' -g_\markup { - \null - \lower #4 \bold { Très modéré } -} -a -d,^\markup { - \raise #4 \italic { Une forêt. } +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \raise #2 { Scène 1 } + } + a' + g_\markup { + \null + \lower #4 \bold { Très modéré } + } + a + d,^\markup { + \raise #4 \italic { Une forêt. } + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @funindex \general-align @@ -855,22 +882,24 @@ Einige Befehle können sowohl die horizontale als auch die vertikale Ausrichtung von Textobjekten beeinflussen. Jedes Objekt, das auf diese Weise verschoben wird, benötigt einen Anker: -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \translate #'(-1 . 2) "Scène 1" -} -a' -g_\markup { - \null - \general-align #Y #3.2 \bold "Très modéré" -} -a -d,^\markup { - \null - \translate-scaled #'(-1 . 2) \teeny "Une forêt." +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \translate #'(-1 . 2) "Scène 1" + } + a' + g_\markup { + \null + \general-align #Y #3.2 \bold "Très modéré" + } + a + d,^\markup { + \null + \translate-scaled #'(-1 . 2) \teeny "Une forêt." + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @cindex mehrzeiliger Text @@ -912,7 +941,6 @@ eigenen Zeile gesetzt, entweder linksbündig oder zentriert: @cindex Beschriftung, Zentrieren auf der Seite @funindex \fill-line -@funindex fill-line Eine Anzahl an Ausdrücken innerhalb von @code{\markup} kann auch gestreckt werden, so dass die gesamte Seitenbreite benutzt wird. Wenn @@ -1151,8 +1179,8 @@ aber Graphiken direkt in den Quelltext unter Verwendung von PostScript-Code notiert. In diesem Fall kann es nötig sein, die Größe der Zeichnung explizit anzugeben, wie im Beispiel unten gezeigt: -@lilypond[quote,verbatim,relative=1] -c1^\markup { +@lilypond[quote,verbatim,fragment] +c'1^\markup { \combine \epsfile #X #10 #"./context-example.eps" \with-dimensions #'(0 . 6) #'(0 . 10) @@ -1168,7 +1196,7 @@ c1^\markup { closepath stroke" } -c +c' @end lilypond Eine ausführliche Liste der Graphik-Befehle findet sich in @@ -1206,22 +1234,22 @@ werden. Noten und Versetzungszeichen lassen sich mit @code{\markup} einfügen: -@lilypond[quote,verbatim,relative=2] -a2 a^\markup { +@lilypond[quote,verbatim,fragment] +a'2 a'^\markup { \note #"4" #1 = \note-by-number #1 #1 #1.5 } -b1_\markup { +b'1_\markup { \natural \semiflat \flat \sesquiflat \doubleflat } \glissando -a1_\markup { +a'1_\markup { \natural \semisharp \sharp \sesquisharp \doublesharp } -\glissando b +\glissando b' @end lilypond Andere Notationsobjekte können auch eingefügt werden: @@ -1249,13 +1277,15 @@ von der Notation als ein Textbeschriftungsobjekt eingefügt werden, wie unten gezeigt. Eine vollständige Liste der verfügbaren Symbole findet sich in @ref{Die Feta-Schriftart}. -@lilypond[quote,verbatim,relative=2] -c2 -c'^\markup { \musicglyph #"eight" } -c,4 -c,8._\markup { \musicglyph #"clefs.G_change" } -c16 -c2^\markup { \musicglyph #"timesig.neomensural94" } +@lilypond[quote,verbatim] +\relative { + c''2 + c'^\markup { \musicglyph #"eight" } + c,4 + c,8._\markup { \musicglyph #"clefs.G_change" } + c16 + c2^\markup { \musicglyph #"timesig.neomensural94" } +} @end lilypond @noindent @@ -1266,20 +1296,22 @@ unterschiedlicher Größe zu setzen. Der Textbeschriftungsmodus unterstützt auch Diagramme für bestimmte Instrumente: -@lilypond[quote,verbatim,relative=2] -c1^\markup { - \fret-diagram-terse #"x;x;o;2;3;2;" -} -c^\markup { - \harp-pedal #"^-v|--ov^" -} -c -c^\markup { - \combine - \musicglyph #"accordion.discant" +@lilypond[quote,verbatim] +\relative { + c''1^\markup { + \fret-diagram-terse #"x;x;o;2;3;2;" + } + c^\markup { + \harp-pedal #"^-v|--ov^" + } + c + c^\markup { \combine - \raise #0.5 \musicglyph #"accordion.dot" - \raise #1.5 \musicglyph #"accordion.dot" + \musicglyph #"accordion.discant" + \combine + \raise #0.5 \musicglyph #"accordion.dot" + \raise #1.5 \musicglyph #"accordion.dot" + } } @end lilypond @@ -1298,15 +1330,17 @@ Sogar eine ganze Partitur kann in ein Textbeschriftungsobjekt eingefügt werden. In diesem Fall muss die eingefügte @code{\score}-Umgebung eine @code{\layout}-Umgebung haben, wie in diesem Beispiel: -@lilypond[quote,verbatim,relative=1] -c4 d^\markup { - \score { - \relative c' { c4 d e f } - \layout { } +@lilypond[quote,verbatim] +\relative { + c'4 d^\markup { + \score { + \relative { c'4 d e f } + \layout { } + } } + e f | + c d e f } -e f | -c d e f @end lilypond Eine vollständige Liste der Musiksymbol-Befehle findet sich in @ref{Music}. @@ -1340,11 +1374,8 @@ Referenz der Interna: @cindex mehrseitiger Text @funindex \markuplist -@funindex markuplist @funindex \justified-lines -@funindex justified-lines @funindex \wordwrap-lines -@funindex wordwrap-lines Normale Textbeschriftungsobjekte können nicht getrennt werden, aber mit einer spezifischen Umgebung ist es möglich, Text auch über mehrere Seiten @@ -1395,7 +1426,6 @@ Referenz der Interna: @rinternals{TextScript}. @funindex \markuplist -@funindex markuplist @predefined @code{\markuplist}. @@ -1438,8 +1468,8 @@ direkt auf verschiedene nicht textuelle Sonderzeichen der @code{feta}-Schriftart zuzugreifen. Das ist die Standardschriftart für Notationselemente in LilyPond. -@lilypond[quote,verbatim,relative=2] -a1^\markup { +@lilypond[quote,verbatim,fragment] +a'1^\markup { \vcenter { \override #'(font-encoding . fetaBraces) \lookup #"brace120" @@ -1484,14 +1514,14 @@ demonstriert, wie man die verschiedenen Eigenschaften auswählen kann. Der Wert, der @code{font-size} übergeben wird, entspricht der geforderten Änderung in Bezug auf die Standardschriftgröße. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Score.RehearsalMark.font-family = #'typewriter \mark \markup "Ouverture" \override Voice.TextScript.font-shape = #'italic \override Voice.TextScript.font-series = #'bold -d2.^\markup "Allegro" +d''2.^\markup "Allegro" \override Voice.TextScript.font-size = #-3 -c4^smaller +c''4^smaller @end lilypond @noindent @@ -1544,14 +1574,14 @@ Jede Schriftart, die über das Betriebssystem installiert ist und von FontConfig erkannt wird, kann in einer Partitur eingefügt werden. Dazu verwendet man folgende Syntax: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.TimeSignature.font-name = #"Bitstream Charter" \override Staff.TimeSignature.font-size = #2 \time 3/4 -a1_\markup { - \override #'(font-name . "Vera Bold") - { Vera Bold } +a'1_\markup { + \override #'(font-name . "Bitstream Vera Sans,sans-serif, Oblique Bold") + { Vera Oblique Bold } } @end lilypond @@ -1600,7 +1630,7 @@ Schriftarten in @ref{Was sind Schriftarten}. myStaffSize = #20 #(define fonts (make-pango-font-tree "Times New Roman" - "Nimbus Sans" + "Nimbus Sans,Nimbus Sans L" "Luxi Mono" (/ myStaffSize 20))) } diff --git a/Documentation/de/notation/unfretted-strings.itely b/Documentation/de/notation/unfretted-strings.itely index ee3aeed104..21d2149e9e 100644 --- a/Documentation/de/notation/unfretted-strings.itely +++ b/Documentation/de/notation/unfretted-strings.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.16.0" +@c \version "2.18.0" @c Translators: Till Paala @@ -105,8 +105,8 @@ beschrieben in Die Befehle @code{\upbow} und @code{\downbow} werden mit Legatobögen in folgender Weise eingesetzt: -@lilypond[verbatim,quote,relative=2] -c4(\downbow d) e(\upbow f) +@lilypond[verbatim,quote] +\relative { c''4(\downbow d) e(\upbow f) } @end lilypond @noindent @@ -143,28 +143,29 @@ Notation Reference: @cindex rautenförmige Notenköpfe @funindex \harmonic -@funindex harmonic Flageolett-Töne können auf verschiedene Arten notiert werden. Üblicherweise werden sie mit einem Rautenkopf notiert, wenn ein Ton angezeigt werde, bei dem die Saite berührt wird, wo sie sonst abgegriffen würde. -@lilypond[verbatim,quote,relative=2] -d4 e4. -\harmonicsOn -d8 e e -d4 e4. -\harmonicsOff -d8 e e +@lilypond[verbatim,quote] +\relative d'' { + d4 e4. + \harmonicsOn + d8 e e + d4 e4. + \harmonicsOff + d8 e e +} @end lilypond Alternativ kann auch eine normale Noten die Tonhöhe anzeigen, die erklingen soll, wobei ein kleiner Kreis angibt, dass es sich um einen Flageolett-Ton handelt: -@lilypond[verbatim,quote,relative=2] -d2^\flageolet d_\flageolet +@lilypond[verbatim,quote,fragment] +d''2^\flageolet d''_\flageolet @end lilypond @@ -178,10 +179,12 @@ einen einen normalen Notenkopf besitzt und die Griffposition des Fingers angibt, während die andere in Rautenform die Position des leicht aufgesetzten Fingers anzeigt. -@lilypond[verbatim,quote,relative=1] -2. 4 -\set harmonicDots = ##t -2. 4 +@lilypond[verbatim,quote] +\relative e' { + 2. 4 + \set harmonicDots = ##t + 2. 4 +} @end lilypond @warning{@code{@bs{}harmonic} @strong{muss} innerhalb einer Akkordkonstruktion @@ -212,9 +215,11 @@ Pizzicato, bei dem man die Saite nach oben (und nicht seitlich) zieht, sodass sie beim Schwingen das Griffbrett berührt. -@lilypond[verbatim,quote,relative=1] -c4\snappizzicato -4\snappizzicato -4^\snappizzicato -4_\snappizzicato +@lilypond[verbatim,quote] +\relative { + c'4\snappizzicato + 4\snappizzicato + 4^\snappizzicato + 4_\snappizzicato +} @end lilypond diff --git a/Documentation/de/notation/vocal.itely b/Documentation/de/notation/vocal.itely index 5e81851fe6..367223d7dd 100644 --- a/Documentation/de/notation/vocal.itely +++ b/Documentation/de/notation/vocal.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @c Translators: Till Paala @@ -183,7 +183,7 @@ die Datei in der UTF-8-Kodierung gespeichert wird. Zu mehr Information siehe @ref{Sonderzeichen}. @lilypond[quote,verbatim] -\relative c'' { d8 c16 a bes8 f e' d c4 } +\relative { d''8 c16 a bes8 f e' d c4 } \addlyrics { „Schad’ um das schö -- ne grü -- ne Band, } @end lilypond @@ -191,7 +191,7 @@ Normale Anführungszeichen können im Gesangstext auch benutzt werden, aber sie müssen mit einem Backslash und weiteren Anführungszeichen begleitet werden: @lilypond[quote,verbatim] -\relative c' { \time 3/4 e4 e4. e8 d4 e d c2. } +\relative { \time 3/4 e'4 e4. e8 d4 e d c2. } \addlyrics { "\"I" am so lone -- "ly,\"" said she } @end lilypond @@ -267,13 +267,13 @@ in @ref{Automatische Silbendauern}. << \new Staff << \time 2/4 - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \voiceOne - c4 b8. a16 g4. r8 a4 ( b ) c2 + c''4 b8. a16 g4. r8 a4 ( b ) c2 } - \new Voice = "two" \relative c' { + \new Voice = "two" \relative { \voiceTwo - s2 s4. f8 e4 d c2 + s2 s4. f'8 e4 d c2 } >> @@ -307,9 +307,9 @@ innerhalb von @code{\lyricmode} notiert: @lilypond[quote,ragged-right,verbatim] << - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \time 2/4 - c4 b8. a16 g4. f8 e4 d c2 + c''4 b8. a16 g4. f8 e4 d c2 } % uses previous explicit duration of 2; @@ -401,7 +401,6 @@ am Leben erhält, siehe @ref{Kontexte am Leben halten}. @cindex \lyricsto @funindex \lyricsto -@funindex lyricsto Gesangstext kann an einer Melodie automatisch ausgerichtet werdne, indem man den beannten @code{Voice}-Kontext mit der Melodie durch den Befehl @@ -431,7 +430,6 @@ angeordnet. Für andere Optionen siehe @ref{Gesangstext vertikal verschieben}. @subheading @code{\addlyrics} benutzen -@funindex addlyrics @funindex \addlyrics Der @code{\addlyrics}-Befehl ist eigentlich nur eine Abkürzung für eine @@ -456,7 +454,7 @@ Hier ein Beispiel: @lilypond[verbatim,quote] { \time 3/4 - \relative c' { c2 e4 g2. } + \relative { c'2 e4 g2. } \addlyrics { play the game } } @end lilypond @@ -467,7 +465,7 @@ hinzugefügt werden: @lilypond[ragged-right,verbatim,quote] { \time 3/4 - \relative c' { c2 e4 g2. } + \relative { c'2 e4 g2. } \addlyrics { play the game } \addlyrics { speel het spel } \addlyrics { joue le jeu } @@ -498,13 +496,13 @@ Ein Beispiel demonstiert das: << \new Staff << \time 2/4 - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \voiceOne - c4 b8. a16 g4. r8 a4 ( b ) c2 + c''4 b8. a16 g4. r8 a4 ( b ) c2 } - \new Voice = "two" \relative c' { + \new Voice = "two" \relative { \voiceTwo - s2 s4. f8 e8 d4. c2 + s2 s4. f'8 e8 d4. c2 } >> % takes durations and alignment from notes in "one" initially @@ -558,8 +556,8 @@ Hier zwei Beispiele: @lilypond[quote,verbatim,ragged-right] << \new Staff { - \relative c'' { - c2 c2 + \relative { + c''2 c2 d1 } } @@ -569,8 +567,8 @@ Hier zwei Beispiele: } } \new Staff { - \relative c' { - c8 c c c c c c c + \relative { + c'8 c c c c c c c c8 c c c c c c c } } @@ -627,8 +625,8 @@ gesetzt werden. @lilypond[quote,ragged-right,verbatim] { - \relative c'' { \autoBeamOff - r8 b c fis, fis c' b e, } + \relative { \autoBeamOff + r8 b' c fis, fis c' b e, } \addlyrics { Che_in ques -- ta_e_in quel -- l'al -- tr'on -- da } \addlyrics { "Che in" ques -- "ta e in" quel -- l'al -- tr'on -- da } \addlyrics { Che~in ques -- ta~e~in quel -- l'al -- tr'on -- da } @@ -672,13 +670,13 @@ Es gibt fünf Arten, auf die ein Melisma angezeigt werden kann: @item Melismen werden automatisch zu Noten erstellt, die übergebunden sind: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g2 ~ | - g4 e2 ~ | - e8 + f''4 g2 ~ | + 4 e2 ~ | + 8 } \new Lyrics \lyricsto "melody" { Ky -- ri -- e __ @@ -691,11 +689,11 @@ Melismen können automatisch aus den Noten erstellt werden, indem man Legatobög über den Noten eines Melismas notiert. Auf diese Weise wird Gesangstext üblicherweise notiert: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 ( f e f ) + f''4 g8 ( f e f ) e8 ( d e2 ) } \new Lyrics \lyricsto "melody" { @@ -712,12 +710,12 @@ Noten werden als ein Melisma betrachtet, wenn sie manuell mit einem Balken versehen werden, vorausgesetzt, dass die automatische Bebalkung ausgeschaltet ist. Siehe @ref{Einstellung von automatischen Balken}. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \autoBeamOff - f4 g8[ f e f] + f''4 g8[ f e f] e2. } \new Lyrics \lyricsto "melody" { @@ -734,11 +732,11 @@ Eine Gruppe von Noten ohne Legatobogen werden als Melisma betrachtet, wenn sie zwischen @code{\melisma} und @code{\melismaEnd} eingeschlossen sind: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 + f''4 g8 \melisma f e f \melismaEnd @@ -755,11 +753,11 @@ Ein Melisma kann auch ausschließlich im Gesangstext notiert werden, indem man einzlene Unterstriche (@code{_}) für jede Note eingibt, die zum Melisma hinzugefügt werden soll. -@lilypond[verbatim, quote, relative=2] +@lilypond[verbatim, quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 f e f + f''4 g8 f e f e8 d e2 } \new Lyrics \lyricsto "melody" { @@ -774,13 +772,13 @@ Man kann durchaus auch Binde- und Legatobögen sowie manuelle Balken benutzen, ohne dass sie Melismen bezeichnen, wenn @code{melismaBusyProperties} aufgerufen wird: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \set melismaBusyProperties = #'() - c4 d ( e ) - g8 [ f ] f4 ~ f + c'4 d ( e ) + g8 [ f ] f4 ~ 4 } \new Lyrics \lyricsto "melody" { Ky -- ri -- e e -- le -- i -- son @@ -802,13 +800,13 @@ Wenn ein Melisma während einer Passage benötigt wird, in der einzelnen Unterstrich im Gesangstext für jede Note des Melismas angegeben werden: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \set melismaBusyProperties = #'() - c4 d ( e ) - g8 [ f ] ~ f4 ~ f + c'4 d ( e ) + g8 [ f ] ~ 4 ~ f } \new Lyrics \lyricsto "melody" { Ky -- ri -- _ e __ _ _ _ @@ -913,8 +911,8 @@ Um Variablen zu definieren, die Gesangstext beinhalten, muss die @code{\lyricmode}-Umgebung benutzt werden. @lilypond[quote,verbatim] -musicOne = \relative c'' { - c4 b8. a16 g4. f8 e4 d c2 +musicOne = \relative { + c''4 b8. a16 g4. f8 e4 d c2 } verseOne = \lyricmode { Joy to the world, the Lord is come. @@ -943,8 +941,8 @@ aufzurufen. Das stellt sicher, dass die Stimmen, die durch @code{\lyricsto} angefordert werden, auch immer schon definiert sind. Beispielsweise: @lilypond[quote,verbatim] -sopranoMusic = \relative c'' { c4 c c c } -contraltoMusic = \relative c'' { a4 a a a } +sopranoMusic = \relative { c''4 c c c } +contraltoMusic = \relative { a'4 a a a } sopranoWords = \lyricmode { Sop -- ra -- no words } contraltoWords = \lyricmode { Con -- tral -- to words } @@ -1005,7 +1003,7 @@ System zu positionieren, was man erreicht, indem man den << \new Staff { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics { @@ -1027,7 +1025,7 @@ Position des Gesangstextes explizit anzugeben: << \new Staff = "staff" { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics \with { alignAboveContext = "staff" } { @@ -1054,7 +1052,7 @@ verweist, mit @code{\context} angegeben: } \new Staff { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \context Lyrics = "lyrics" { @@ -1075,7 +1073,7 @@ einesetzt werden können. Hier ein Beispiel für die zweite Methode: \new ChoirStaff << \new Staff { \new Voice = "sopranos" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics = "sopranos" @@ -1085,7 +1083,7 @@ einesetzt werden können. Hier ein Beispiel für die zweite Methode: } \new Staff { \new Voice = "contraltos" { - \relative c'' { a4 a a a } + \relative { a'4 a a a } } } \context Lyrics = "sopranos" { @@ -1116,7 +1114,7 @@ Handbuch zum Lernen: Notation Reference: @ref{Reihenfolge des Kontextlayouts}, -@ref{Kontexte erstellen}. +@ref{Kontexte erstellen und referenzieren}. @node Silben horizontal verschieben @@ -1132,8 +1130,8 @@ Um den Abstand zwischen Silben zu vergrößern, kann die @code{minimum-distance}-Eigenschaft des @code{LyricSpace}-Objekts gesetzt werden: -@lilypond[relative=1,verbatim,quote,ragged-right] -{ +@lilypond[verbatim,quote,ragged-right] +\relative c' { c c c c \override Lyrics.LyricSpace.minimum-distance = #1.0 c c c c @@ -1150,8 +1148,8 @@ wirkt, muss sie im @code{layout}-Block vorgenommen werden. @lilypond[verbatim,quote,ragged-right] \score { - \relative c' { - c c c c + \relative { + c' c c c c c c c } \addlyrics { @@ -1220,8 +1218,8 @@ sich nicht ändert: << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1245,8 +1243,8 @@ mit @code{\unfoldRepeats} ausgeklappt wird: << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1270,8 +1268,8 @@ ausgeklappt werden soll, müssen alle Wörter notiert werden: << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat unfold 2 { b4 b b b } } } @@ -1297,8 +1295,8 @@ parrallelen Abschnitten geschachtelt wird: << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1324,8 +1322,8 @@ Neue Strophen können auf die gleiche Art hinzugefügt werden: << \new Staff { \new Voice = "singleVoice" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 3 { b4 b b b } c4 c c c } @@ -1366,8 +1364,8 @@ eingesetzt werden: << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 3 { b4 b b b } c4 c c c } @@ -1391,8 +1389,8 @@ eingesetzt werden: The end sec -- tion. } \new Voice = "harmony" { - \relative c' { - f4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 + \relative { + f'4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 } } >> @@ -1418,8 +1416,8 @@ werden. \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b } \alternative { { b b } { b c } } } @@ -1464,8 +1462,8 @@ Dauer, unabhängig vom Wert der auf den Befehl folgenden Zahl.} \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b } + \relative { + \repeat volta 2 { b'4 b } \alternative { { b b } { b c } } c4 c } @@ -1514,9 +1512,9 @@ richtige Ausrichtung des Textes zu erreichen. \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { + \relative { \set melismaBusyProperties = #'() - \repeat volta 2 { b4 b ~} + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } \unset melismaBusyProperties c4 c @@ -1551,8 +1549,8 @@ müssen manuell eingegeben werden: \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b ~} + \relative { + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } c4 c } @@ -1584,8 +1582,8 @@ benutzen wollen, müssen sie manuell notiert werden: \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b ~} + \relative { + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } c4 c } @@ -1661,11 +1659,11 @@ anhängt: \score { << \new Voice = "melody" { - \relative c' { + \relative { << { \voiceOne - e4 e8 e + e'4 e8 e } \new Voice = "splitpart" { \voiceTwo @@ -1712,9 +1710,9 @@ anhängt: Strophennummerierung kann hinzugefügt werden: -@lilypond[quote,ragged-right,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. +@lilypond[quote,ragged-right,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. } \addlyrics { \set stanza = #"1. " Hi, my name is Bert. @@ -1800,9 +1798,9 @@ der Zeile gesetzt, ähnlich wie eine Instrumentenbezeichnung. Sie werden mit der @code{vocalName}-Eigenschaft erstellt. Eine Kurzversion kann mit @code{shortVocalName} definiert werden. -@lilypond[ragged-right,quote,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. +@lilypond[ragged-right,quote,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. } \addlyrics { \set vocalName = #"Bert " Hi, my name is Bert. @@ -1832,9 +1830,9 @@ vorgenommen. @lilypond[verbatim,ragged-right,quote] << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 \slurDotted f8.[( g16]) a4 @@ -1870,8 +1868,8 @@ geändert werden, wie das folgende Beispiel zeigt. @lilypond[verbatim,ragged-right,quote] << - \new Voice = melody \relative c' { - f4 \appoggiatura a32 b4 + \new Voice = melody \relative { + f'4 \appoggiatura a32 b4 \grace { f16 a16 } b2 \afterGrace b2 { f16[ a16] } \appoggiatura a32 b4 @@ -1919,9 +1917,9 @@ unterschiedlichen Melodien auszurichten. Das wird mit der @lilypond[verbatim,quote] << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 << \new Voice = "alternative" { \voiceOne @@ -1994,8 +1992,8 @@ gesetzt. Es gibt zwei Arten, die Zeilen auszurichten, wie das Beispiel zeigt: @lilypond[ragged-right,verbatim,quote] -melody = \relative c' { -e d c d | e e e e | +melody = \relative { +e' d c d | e e e e | d d e d | c1 | } @@ -2037,8 +2035,8 @@ zeigt die Strophennummer an. Dieses Beispiel zeigt eine Methode, diese Art von Notensatz zu produzieren. @lilypond[ragged-right,quote,verbatim] -melody = \relative c' { - c4 c c c | d d d d +melody = \relative { + c'4 c c c | d d d d } text = \lyricmode { @@ -2329,12 +2327,12 @@ Form genutzt werden, wie das Beispiel zeigt: \new ChoirStaff << \new Staff { \new Voice { - \relative c'' { g4\f g g g } + \relative { g'4\f g g g } } } \new Staff { \new Voice { - \relative c' { d4 d d\p d } + \relative { d'4 d d\p d } } } >> @@ -2430,7 +2428,7 @@ spezifisch für das Setzen von Singspiel-Partituren sind. @menu * Verweise für Oper und Musical:: * Namen von Figuren:: -* Musikalische Stichnoten +* Musikalische Stichnoten:: * Gesprochene Musik:: * Dialog zur Musik:: @end menu @@ -2486,7 +2484,7 @@ Notationsreferenz: @ref{Verschachtelte Notensysteme}, @ref{Seitenlayout}, @ref{Systeme trennen}, -@ref{Transposition}, +@ref{Transponieren}, @ref{Orchesterstimmen erstellen}, @ref{Text eingeben} @ref{Fußnoten erstellen}. @@ -2511,9 +2509,9 @@ wenn auf dem System nur die Stimme einer Figure notiert ist: \new Staff { \set Staff.vocalName = \markup \smallCaps Kaspar \set Staff.shortVocalName = \markup \smallCaps Kas. - \relative c' { + \relative { \clef "G_8" - c4 c c c + c'4 c c c \break c4 c c c } @@ -2522,7 +2520,7 @@ wenn auf dem System nur die Stimme einer Figure notiert ist: \set Staff.vocalName = \markup \smallCaps Melchior \set Staff.shortVocalName = \markup \smallCaps Mel \clef "bass" - \relative c' { + \relative { a4 a a a a4 a a a } @@ -2537,16 +2535,18 @@ Abschnitt von der Figur gesungen werden soll. Das kann man mit Textbeschriftungen vornehmen. Oft wird eine bestimmte Schriftart hierfür benutzt. -@lilypond[quote,verbatim,relative=1] -\clef "G_8" -c4^\markup \fontsize #1 \smallCaps Kaspar -c c c -\clef "bass" -a4^\markup \fontsize #1 \smallCaps Melchior -a a a -\clef "G_8" -c4^\markup \fontsize #1 \smallCaps Kaspar -c c c +@lilypond[quote,verbatim] +\relative c' { + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c + \clef "bass" + a4^\markup \fontsize #1 \smallCaps Melchior + a a a + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c +} @end lilypond Wenn sehr viele Figurenwechsel vorkommen, kann es auch einfacher @@ -2617,13 +2617,13 @@ Instrumentenbezeichnungen sein. Im folgenden Beispiel gibt es dazu einige Hilfestellungen. @lilypond[quote,verbatim] -flute = \relative c'' { - s4 s4 e g +flute = \relative { + s4 s4 e'' g } \addQuote "flute" { \flute } -pianoRH = \relative c'' { - c4. g8 +pianoRH = \relative { + c''4. g8 % position name of cue-ing instrument just before the cue notes, % and above the staff \new CueVoice { @@ -2632,7 +2632,7 @@ pianoRH = \relative c'' { } \cueDuring "flute" #UP { g4 bes4 } } -pianoLH = \relative c { c4 e, } +pianoLH = \relative { c4 e, } \score { \new PianoStaff << @@ -2678,7 +2678,7 @@ pianoRH = \relative c'' { \cueDuring "clarinet" #DOWN { c4. g8 } g4 bes4 } -pianoLH = \relative c { c4 e, } +pianoLH = \relative { c4 e, } \score { << @@ -2764,10 +2764,12 @@ Dialoge zur Musik wird üblicherweise über den Notensystemen gesetzt, meistens in kursiver Schrift, wobei der Beginn der Phrasen mit einem musikalischen Moment verklammert ist. -@lilypond[quote,verbatim,relative=2] -a4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a -a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a -a4 a a a +@lilypond[quote,verbatim] +\relative { + a'4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a + a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a + a4 a a a +} @end lilypond Für längere Abschnitt kann es nötig sein, die Noten zu dehnen, damit @@ -2795,8 +2797,8 @@ Hier ein Beispiel, das zeigt, wie das gesetzt werden kann. @c manually adjusted to suit the imposed line length. -td @lilypond[quote,verbatim,ragged-right] -music = \relative c'' { - \repeat unfold 3 { a4 a a a } +music = \relative { + \repeat unfold 3 { a'4 a a a } } dialogue = \lyricmode { @@ -2900,15 +2902,15 @@ auszulassen, kann der @code{Bar_engraver} entfert werden. \score { \new StaffGroup << \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } } \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -2930,15 +2932,15 @@ Taktstriche können auf nur für ein System entfernt werden: \new ChoirStaff << \new Staff \with { \remove "Bar_engraver" } { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } } \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -2952,34 +2954,38 @@ als Kadenz notiert werdne. Wenn der Abschnitt lang ist, müssen unsichtbare Taktstriche mit @code{\bar ""} eingefügt werden, wo Zeilenumbrüche stattfinden sollen. -@lilypond[verbatim,quote,relative=2] -a4 b c2 | -\cadenzaOn -a4 b c2 -a4 b c2 -\bar "" -a4 b c2 -a4 b c2 -\cadenzaOff -a4 b c2 | -a4 b c2 | +@lilypond[verbatim,quote] +\relative a' { + a4 b c2 | + \cadenzaOn + a4 b c2 + a4 b c2 + \bar "" + a4 b c2 + a4 b c2 + \cadenzaOff + a4 b c2 | + a4 b c2 | +} @end lilypond Pausen können als modifizierte Taktlinien notiert werden: -@lilypond[verbatim, quote,relative=2] -a4 -\cadenzaOn -b c2 -a4 b c2 -\bar "'" -a4 b c2 -a4 b c2 -\bar ";" -a4 b c2 -\bar "!" -a4 b c2 -\bar "||" +@lilypond[verbatim, quote] +\relative a' { + a4 + \cadenzaOn + b c2 + a4 b c2 + \bar "'" + a4 b c2 + a4 b c2 + \bar ";" + a4 b c2 + \bar "!" + a4 b c2 + \bar "||" +} @end lilypond Alternativ werden die Pausenzeichen der Notation des Gregorianischen Chorals @@ -3009,8 +3015,8 @@ finalis = { } \score { - \relative c'' { - g2 a4 g + \relative { + g'2 a4 g \divisioMinima g2 a4 g \divisioMaior @@ -3034,8 +3040,8 @@ weggelassen. @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -3061,22 +3067,22 @@ Der erste Takt jeder Hälfte hat immer eine ganze Note. Das ist der zentriert. @lilypond[verbatim,quote] -SopranoMusic = \relative g' { - g1 | c2 b | a1 | \bar "||" +SopranoMusic = \relative { + g'1 | c2 b | a1 | \bar "||" a1 | d2 c | c b | c1 | \bar "||" } -AltoMusic = \relative c' { - e1 | g2 g | f1 | +AltoMusic = \relative { + e'1 | g2 g | f1 | f1 | f2 e | d d | e1 | } -TenorMusic = \relative a { - c1 | c2 c | c1 | +TenorMusic = \relative { + c'1 | c2 c | c1 | d1 | g,2 g | g g | g1 | } -BassMusic = \relative c { +BassMusic = \relative { c1 | e2 e | f1 | d1 | b2 c | g' g | c,1 | } diff --git a/Documentation/de/notation/wind.itely b/Documentation/de/notation/wind.itely index 2de45f7296..15cf15e6e4 100644 --- a/Documentation/de/notation/wind.itely +++ b/Documentation/de/notation/wind.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.16.0" +@c \version "2.19.16" @c Translators: Till Paala @@ -178,11 +178,8 @@ Dieser Abschnitt beinhaltet die Notation von Dudelsackmusik. @cindex Sackpfeife @cindex Schottischer Dudelsack @funindex \taor -@funindex taor @funindex \hideKeySignature -@funindex hideKeySignature @funindex \showKeySignature -@funindex showKeySignature LilyPond besitzt spezielle Definitionen, mit der die Musik des schottischen Hochland-Dudelsacks notiert wird. Um sie @@ -222,9 +219,9 @@ Wenn die Vorzeichen hingegen angezeigt werden sollen, kann das mithilfe des Befehls @code{\showKeySignature} vorgenommen werden. Einige moderne Dudelsacknoten benutzen halbe Finger auf c und f, um -diese Noten zu erniedrigen. Das kann angezeigt werden mit @code{cflat} -bzw. @code{fflat}. Gleicherweise kann das piobaireachd hohe g als -@code{gflat} geschrieben werden, wenn es in leichter Musik vorkommt. +diese Noten zu erniedrigen. Das kann angezeigt werden mit @code{c-flat} +bzw. @code{f-flat}. Gleicherweise kann das piobaireachd hohe g als +@code{g-flat} geschrieben werden, wenn es in leichter Musik vorkommt. @seealso Schnipsel: @@ -311,8 +308,8 @@ Note darzustellen. Diagramme gibt es für folgende Instrumente: @noindent Holzbläserdiagramme werden als Beschriftung erstellt: -@lilypond[verbatim,quote,relative=2] -c1^\markup { +@lilypond[verbatim,quote,fragment] +c''1^\markup { \woodwind-diagram #'piccolo #'((lh . (gis)) (cc . (one three)) (rh . (ees))) @@ -322,9 +319,9 @@ c1^\markup { Löcher können offen, halboffen, Ring oder geschlossen sein: @c KEEP LY -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \textLengthOn -c1^\markup { +c''1^\markup { \center-column { "Ein Viertel" \woodwind-diagram #'flute #'((cc . (one1q)) @@ -333,7 +330,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "Eineinhalb" \woodwind-diagram #'flute #'((cc . (one1h)) @@ -342,7 +339,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "Drei Viertel" \woodwind-diagram #'flute #'((cc . (one3q)) @@ -351,7 +348,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "Ring" \woodwind-diagram #'flute #'((cc . (oneR)) @@ -360,7 +357,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "ganz" \woodwind-diagram #'flute #'((cc . (oneF two)) @@ -372,8 +369,8 @@ c1^\markup { Triller werden als schattierte Löcher in den Diagrammen angezeigt: -@lilypond[verbatim,quote,relative=2] -c1^\markup { +@lilypond[verbatim,quote,fragment] +c''1^\markup { \woodwind-diagram #'bass-clarinet #'((cc . (threeT four)) (lh . ()) @@ -384,9 +381,9 @@ c1^\markup { Eine Vielzahl von Trillern ist möglich: @c KEEP LY -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \textLengthOn -c1^\markup { +c''1^\markup { \center-column { "ein Viertel zu Ring" \woodwind-diagram #'flute #'((cc . (one1qTR)) @@ -395,7 +392,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "Ring zu geschlossen" \woodwind-diagram #'flute #'((cc . (oneTR)) @@ -404,7 +401,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "Ring zu geöffnet" \woodwind-diagram #'flute #'((cc . (oneRT)) @@ -413,7 +410,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "geöffnet zu geschlossen" \woodwind-diagram #'flute #'((cc . (oneT)) @@ -422,7 +419,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "ein Viertel zu drei Viertel" \woodwind-diagram #'flute #'((cc . (one1qT3q)) diff --git a/Documentation/de/notation/world.itely b/Documentation/de/notation/world.itely index d2a84a57ab..387a414617 100644 --- a/Documentation/de/notation/world.itely +++ b/Documentation/de/notation/world.itely @@ -10,7 +10,7 @@ @c Translators: Till Paala -@c \version "2.16.0" +@c \version "2.19.21" @node Weltmusik @section Weltmusik @@ -194,8 +194,8 @@ Hier ein Beispiel der arabischen @notation{rast}-Tonleiter: @lilypond[quote,verbatim] \include "arabic.ly" -\relative do' { - do re misb fa sol la sisb do sisb la sol fa misb re do +\relative { + do' re misb fa sol la sisb do sisb la sol fa misb re do } @end lilypond @@ -212,9 +212,9 @@ werden. @lilypond[quote,verbatim] \include "arabic.ly" -\relative do' { +\relative { \set Staff.extraNatural = ##f - dod dob dosd \dwn dob dobsb dodsd do do + dod' dob dosd \dwn dob dobsb dodsd do do } @end lilypond @@ -344,7 +344,7 @@ Notationsreferenz: @ref{Tonartbezeichnung}. Handbuch zum Lernen: -@rlearning{Versetzungszeichen und Tonartbezeichnung (Vorzeichen)}. +@rlearning{Tonhöhen und Tonartbezeichnungen (Vorzeichen)}. Referenz der Interna: @rinternals{KeySignature}. @@ -416,13 +416,13 @@ etwa Zwischenintervalle und ungewöhnliche Modi, zu illustrieren. @lilypond[quote,verbatim] \include "arabic.ly" \score { - \relative re' { + \relative { \set Staff.extraNatural = ##f \set Staff.autoBeaming = ##f \key re \bayati \time 10/8 - re4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 + re'4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 re16 [misb do re] sisb [do] la [sisb sol8] la [sisb] do [re] misb fa4 fa16 [misb] misb8. [re16] re8 [misb] re [do] sisb do4 sisb8 misb16 [re do sisb] la [do sisb la] la4 r8 diff --git a/Documentation/de/search-box.ihtml b/Documentation/de/search-box.ihtml index 9a2700da12..5e7222b839 100644 --- a/Documentation/de/search-box.ihtml +++ b/Documentation/de/search-box.ihtml @@ -16,11 +16,11 @@ search for a while and have a redirection from "v2.15" to "v2.17".
diff --git a/Documentation/de/texidocs/alternative-bar-numbering.texidoc b/Documentation/de/texidocs/alternative-bar-numbering.texidoc index b84d88a3d9..bcf5947fcb 100644 --- a/Documentation/de/texidocs/alternative-bar-numbering.texidoc +++ b/Documentation/de/texidocs/alternative-bar-numbering.texidoc @@ -1,5 +1,5 @@ -%% Translation of GIT committish: fc1ca638e0b5f66858b9b7a073ceefc1eccb3ed2 +%% Translation of GIT committish: ebe492ca408fb0d9abf80b94c56197eef8dc2f09 texidocde = "Zwei alternative Methoden können eingestellt werden, die die Taktnummerierung beeinflussen, insbesondere bei Wiederholungen." diff --git a/Documentation/de/texidocs/glissandi-can-skip-grobs.texidoc b/Documentation/de/texidocs/glissandi-can-skip-grobs.texidoc index 640df117ee..8799c79097 100644 --- a/Documentation/de/texidocs/glissandi-can-skip-grobs.texidoc +++ b/Documentation/de/texidocs/glissandi-can-skip-grobs.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: fc1ca638e0b5f66858b9b7a073ceefc1eccb3ed2 +%% Translation of GIT committish: ebe492ca408fb0d9abf80b94c56197eef8dc2f09 texidocde = "@code{NoteColumn}-Grobs können bei Glissandos übersprungen werden." doctitlede = "Glissando kann Grobs überspringen" diff --git a/Documentation/de/texidocs/strict-beat-beaming.texidoc b/Documentation/de/texidocs/strict-beat-beaming.texidoc index 7189134e46..0574da5141 100644 --- a/Documentation/de/texidocs/strict-beat-beaming.texidoc +++ b/Documentation/de/texidocs/strict-beat-beaming.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: fc1ca638e0b5f66858b9b7a073ceefc1eccb3ed2 +%% Translation of GIT committish: ebe492ca408fb0d9abf80b94c56197eef8dc2f09 texidocde = " Sekundäre Balken können in die Richtung gesetzt werden, die ihrer rhythmischen diff --git a/Documentation/de/translations.itexi b/Documentation/de/translations.itexi index 21a85322b1..34f04da14e 100644 --- a/Documentation/de/translations.itexi +++ b/Documentation/de/translations.itexi @@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; } @end html @end ifhtml -@emph{Zuletzt aktualisiert am Wed Dec 18 12:23:14 UTC 2013 +@emph{Zuletzt aktualisiert am Sat Jul 2 15:06:05 UTC 2016 } @multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 @@ -47,11 +47,11 @@ ja @ifhtml @html -ja +teilweise @end html @end ifhtml @ifnothtml -ja +teilweise @end ifnothtml @tab vor-GDP @item @@ -84,7 +84,7 @@ ja @item 1 Notensatz @* -5296 +5315 @tab  Till Paala @tab @tab @@ -101,7 +101,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -111,7 +111,7 @@ teilweise @item 2 Literatur @* -326 +382 @tab Till Paala @tab @tab @@ -128,11 +128,11 @@ ja @ifhtml @html -ja +teilweise @end html @end ifhtml @ifnothtml -ja +teilweise @end ifnothtml @tab vor-GDP @end multitable @@ -167,11 +167,11 @@ ja @ifhtml @html -ja +teilweise @end html @end ifhtml @ifnothtml -ja +teilweise @end ifnothtml @tab vor-GDP @item @@ -202,9 +202,9 @@ ja @end ifnothtml @tab vor-GDP @item -1 Scheme-Übung +1 Scheme-Tutorium @* -6271 +6359 @tab Till Paala @tab @tab @@ -221,7 +221,7 @@ teilweise (53 %) @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -231,7 +231,7 @@ teilweise @item 2 Schnittstellen für Programmierer @* -5925 +5752 @tab Till Paala @tab @tab @@ -248,7 +248,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -272,6 +272,8 @@ LilyPond Handbuch zum Lernen @* 124 @tab Till Paala +@* +Michael Gerdau @tab @tab @ifhtml @@ -299,6 +301,8 @@ LilyPond -- \TITLE\ @* 1139 @tab Till Paala +@* +Michael Gerdau @tab @tab @ifhtml @@ -322,68 +326,74 @@ ja @end ifnothtml @tab vor-GDP @item -1 Übung +1 Tutorium @* -2578 +2499 @tab Till Paala @* Reinhold Kainhofer +@* +Michael Gerdau @tab Hajo Bäß @tab @ifhtml @html -teilweise (48 %) +ja @end html @end ifhtml @ifnothtml -teilweise (48 %) +ja @end ifnothtml @tab @ifhtml @html -teilweise +ja @end html @end ifhtml @ifnothtml -teilweise +ja @end ifnothtml @tab vor-GDP @item 2 Übliche Notation @* -4396 -@tab Till Paala +4402 +@tab ??? +@* +Michael Gerdau @tab @tab @ifhtml @html -teilweise (35 %) +ja @end html @end ifhtml @ifnothtml -teilweise (35 %) +ja @end ifnothtml @tab @ifhtml @html -teilweise +ja @end html @end ifhtml @ifnothtml -teilweise +ja @end ifnothtml @tab vor-GDP @item 3 Grundbegriffe @* -11144 +11119 @tab Till Paala @* Reinhold Kainhofer +@* +Michael Gerdau @tab @tab @ifhtml @@ -399,65 +409,69 @@ ja @ifhtml @html -teilweise +ja @end html @end ifhtml @ifnothtml -teilweise +ja @end ifnothtml @tab vor-GDP @item -4 Die Ausgabe verändern +4 Die Ausgabe verbessern @* -16191 -@tab Till Paala +16592 +@tab ??? +@* +Michael Gerdau @tab @tab @ifhtml @html -teilweise (52 %) +ja @end html @end ifhtml @ifnothtml -teilweise (52 %) +ja @end ifnothtml @tab @ifhtml @html -teilweise +ja @end html @end ifhtml @ifnothtml -teilweise +ja @end ifnothtml @tab vor-GDP @item A Vorlagen @* -372 +1236 @tab Till Paala +@* +Michael Gerdau @tab @tab @ifhtml @html -teilweise (38 %) +ja @end html @end ifhtml @ifnothtml -teilweise (38 %) +ja @end ifnothtml @tab @ifhtml @html -teilweise +ja @end html @end ifhtml @ifnothtml -teilweise +ja @end ifnothtml @tab vor-GDP @end multitable @@ -492,11 +506,11 @@ ja @ifhtml @html -ja +teilweise @end html @end ifhtml @ifnothtml -ja +teilweise @end ifnothtml @tab vor-GDP @item @@ -556,7 +570,7 @@ ja @item 1.1 Tonhöhen @* -4990 +5169 @tab Till Paala @tab @tab @@ -573,7 +587,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -583,7 +597,7 @@ teilweise @item 1.2 Rhythmus @* -6890 +6795 @tab Till Paala @tab @tab @@ -600,7 +614,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -610,7 +624,7 @@ teilweise @item 1.3 Ausdrucksbezeichnungen @* -1793 +1798 @tab Till Paala @tab @tab @@ -627,7 +641,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -637,7 +651,7 @@ teilweise @item 1.4 Wiederholungszeichen @* -1050 +1288 @tab Till Paala @tab @tab @@ -654,7 +668,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -664,7 +678,7 @@ teilweise @item 1.5 Gleichzeitig erscheinende Noten @* -2821 +2919 @tab Till Paala @tab @tab @@ -681,7 +695,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -691,7 +705,7 @@ teilweise @item 1.6 Notation auf Systemen @* -2476 +2554 @tab Till Paala @tab @tab @@ -708,7 +722,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -718,7 +732,7 @@ teilweise @item 1.7 Anmerkungen @* -954 +1477 @tab Till Paala @tab @tab @@ -735,7 +749,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -745,7 +759,7 @@ teilweise @item 1.8 Text @* -2816 +2754 @tab Till Paala @tab @tab @@ -762,7 +776,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -799,7 +813,7 @@ ja @item 2.1 Notation von Gesang @* -5190 +4975 @tab Till Paala @tab @tab @@ -816,7 +830,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -826,7 +840,7 @@ teilweise @item 2.2 Tasteninstrumente und andere Instrumente mit mehreren Systemen @* -888 +904 @tab  Till Paala @tab @tab @@ -843,7 +857,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -853,7 +867,7 @@ teilweise @item 2.3 Bundlose Saiteninstrumente @* -281 +303 @tab Till Paala @tab @tab @@ -870,7 +884,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -880,7 +894,7 @@ teilweise @item 2.4 Saiteninstrumente mit Bünden @* -2662 +2820 @tab Till Paala @tab @tab @@ -897,7 +911,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -907,7 +921,7 @@ teilweise @item 2.5 Schlagzeug @* -811 +799 @tab Till Paala @tab @tab @@ -924,7 +938,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -951,17 +965,17 @@ ja @ifhtml @html -ja +teilweise @end html @end ifhtml @ifnothtml -ja +teilweise @end ifnothtml @tab vor-GDP @item 2.7 Notation von Akkorden @* -1972 +1931 @tab Till Paala @tab @tab @@ -978,7 +992,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1015,7 +1029,7 @@ ja @item 2.9 Notation von alter Musik @* -5375 +5516 @tab Till Paala @tab @tab @@ -1032,7 +1046,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1059,34 +1073,34 @@ ja @ifhtml @html -ja +teilweise @end html @end ifhtml @ifnothtml -ja +teilweise @end ifnothtml @tab vor-GDP @item 3 Allgemeine Eingabe und Ausgabe @* -10392 +12704 @tab Till Paala @tab @tab @ifhtml @html -ja +teilweise (94 %) @end html @end ifhtml @ifnothtml -ja +teilweise (94 %) @end ifnothtml @tab @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1096,7 +1110,7 @@ teilweise @item 4 Abstände @* -12256 +10911 @tab Till Paala @tab @tab @@ -1113,7 +1127,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1123,7 +1137,7 @@ teilweise @item 5 Standardeinstellungen verändern @* -15289 +15598 @tab Till Paala @tab @tab @@ -1140,7 +1154,7 @@ teilweise (85 %) @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1150,7 +1164,7 @@ teilweise @item A Notationsübersicht @* -2176 +3077 @tab Till Paala @tab @tab @@ -1167,11 +1181,11 @@ ja @ifhtml @html -ja +teilweise @end html @end ifhtml @ifnothtml -ja +teilweise @end ifnothtml @tab vor-GDP @item @@ -1194,7 +1208,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1233,11 +1247,11 @@ ja @ifhtml @html -ja +teilweise @end html @end ifhtml @ifnothtml -ja +teilweise @end ifnothtml @tab vor-GDP @item @@ -1270,7 +1284,7 @@ ja @item 1 @command{lilypond} starten @* -4537 +5440 @tab Reinhold Kainhofer @* Till Paala @@ -1279,17 +1293,17 @@ Till Paala @ifhtml @html -ja +teilweise (95 %) @end html @end ifhtml @ifnothtml -ja +teilweise (95 %) @end ifnothtml @tab @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1299,7 +1313,7 @@ teilweise @item 2 Dateien mit @command{convert-ly} aktualisieren @* -1484 +1866 @tab Till Paala @tab @tab @@ -1316,7 +1330,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1326,7 +1340,7 @@ teilweise @item 3 @command{lilypond-book} aufrufen @* -4137 +4211 @tab Reinhold Kainhofer @tab Till Paala @tab @@ -1343,7 +1357,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1353,7 +1367,7 @@ teilweise @item 4 Externe Programme @* -2817 +2786 @tab Till Paala @* Reinhold Kainhofer @@ -1372,7 +1386,7 @@ teilweise (87 %) @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1382,7 +1396,7 @@ teilweise @item 5 Vorschläge zum Schreiben von LilyPond-Eingabe-Dateien @* -2692 +2793 @tab Till Paala @tab @tab @@ -1399,7 +1413,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1421,8 +1435,10 @@ LilyPond -- Notation für Jedermann @item Überschriften @* -616 +629 @tab Till Paala +@* +Michael Gerdau @tab @tab @ifhtml @@ -1450,6 +1466,8 @@ LilyPond -- \TITLE\ @* 1139 @tab Till Paala +@* +Michael Gerdau @tab @tab @ifhtml @@ -1475,8 +1493,10 @@ ja @item Einleitung @* -4937 +5815 @tab Till Paala +@* +Michael Gerdau @tab @tab @ifhtml @@ -1492,7 +1512,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1502,8 +1522,10 @@ teilweise @item Download @* -1201 +1158 @tab Till Paala +@* +Michael Gerdau @tab @tab @ifhtml @@ -1519,7 +1541,7 @@ ja @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml @@ -1529,8 +1551,10 @@ teilweise @item Handbücher @* -1284 +1314 @tab Till Paala +@* +Michael Gerdau @tab @tab @ifhtml @@ -1546,34 +1570,36 @@ ja @ifhtml @html -teilweise +ja @end html @end ifhtml @ifnothtml -teilweise +ja @end ifnothtml @tab vor-GDP @item Gemeinschaft @* -3073 -@tab  Till Paala +3524 +@tab Till Paala +@* +Michael Gerdau @tab @tab @ifhtml @html -teilweise (97 %) +ja @end html @end ifhtml @ifnothtml -teilweise (97 %) +ja @end ifnothtml @tab @ifhtml @html -teilweise +teilweise @end html @end ifhtml @ifnothtml diff --git a/Documentation/de/usage.tely b/Documentation/de/usage.tely index b448e74e90..fabfa7ca79 100644 --- a/Documentation/de/usage.tely +++ b/Documentation/de/usage.tely @@ -23,7 +23,7 @@ vorgestellt. @c `Usage' was born 1999-10-10 with git commit c82c30c... @macro copyrightDeclare -Copyright @copyright{} 1999--2012 bei den Autoren. +Copyright @copyright{} 1999--2015 bei den Autoren. @end macro @set FDL diff --git a/Documentation/de/usage/external.itely b/Documentation/de/usage/external.itely index fc31bf4003..6f57989516 100644 --- a/Documentation/de/usage/external.itely +++ b/Documentation/de/usage/external.itely @@ -1,4 +1,4 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 @@ -8,7 +8,7 @@ Guide, node Updating translation committishes. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @c Translators: Till Paala, Reinhold Kainhofer @@ -152,8 +152,8 @@ Direkt in der @file{.ly}-Datei: @example \pointAndClickTypes #'note-event -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -161,8 +161,8 @@ oder @example #(ly:set-option 'point-and-click 'note-event) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -183,8 +183,8 @@ Direkt in der @file{.ly}-Datei: @example \pointAndClickTypes #'(note-event dynamic-event) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -192,8 +192,8 @@ oder @example #(ly:set-option 'point-and-click '(note-event dynamic-event)) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example diff --git a/Documentation/de/usage/lilypond-book.itely b/Documentation/de/usage/lilypond-book.itely index 02ad688826..964bfb70dc 100644 --- a/Documentation/de/usage/lilypond-book.itely +++ b/Documentation/de/usage/lilypond-book.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.22" @c Translators: Reinhold Kainhofer @c Translation checkers: Till Paala @@ -95,8 +95,8 @@ Dokumente für \verb+lilypond-book+ können Musik und Text nach Belieben kombinieren. Zum Beispiel: \begin{lilypond} -\relative c' { - c2 e2 \tuplet 3/2 { f8 a b } a2 e4 +\relative { + c'2 e2 \tuplet 3/2 { f8 a b } a2 e4 } \end{lilypond} @@ -156,8 +156,8 @@ Dokumente für @command{lilypond-book} können Musik und Text nach Belieben kombinieren. Zum Beispiel: @lilypond -\relative c' { - c2 e2 \tuplet 3/2 { f8 a b } a2 e4 +\relative { + c'2 e2 \tuplet 3/2 { f8 a b } a2 e4 } @end lilypond @@ -182,8 +182,8 @@ Wenn man eine @code{tagline} (die Zeile unten auf der Seite) braucht title = "A scale in LilyPond" } - \relative c' { - c d e f g a b c + \relative { + c' d e f g a b c } } @end lilypond @@ -803,8 +803,8 @@ Erzeugung der Grafik im relativen Oktavenmodus interpretiert, der wörtlich in das Dokument kopierte LilyPond-Code zeigt den @code{relative}-Befehl jedoch nicht. @example -\relative c' @{ % begin verbatim - c4 e2 g4 +\relative @{ % begin verbatim + c'4 e2 g4 f2 e % end verbatim @} @end example @@ -1202,8 +1202,8 @@ Sie können LilyPond-Fragmente in ein LaTeX-Dokument einfügen: Normaler LaTeX-Text. \begin@{lilypond@} -\relative c'' @{ - a4 b c d +\relative @{ + a'4 b c d @} \end@{lilypond@} @@ -1228,7 +1228,7 @@ Handbuch wurde in Texinfo geschrieben. Texinfo-Text @@lilypond -\relative c' @{ +\relative @{ a4 b c d @} @@end lilypond @@ -1255,8 +1255,8 @@ d4 c b a Dokumente für lilypond-book können Noten und Text frei kombinieren. Zum Beispiel -\relative c'' @{ - a4 b c d +\relative @{ + a'4 b c d @}

@@ -1356,7 +1356,7 @@ sich alle in der selben LilyPond-Datei befinden. (format #f "~a, section, 1, @{~a@}, ~a" page text label)))) (formatted-toc-items (map format-line (toc-items))) (whole-string (string-join formatted-toc-items ",\n")) - (output-name (ly:parser-output-name parser)) + (output-name (ly:parser-output-name)) (outfilename (format "~a.toc" output-name)) (outfile (open-output-file outfilename))) (if (output-port? outfile) diff --git a/Documentation/de/usage/running.itely b/Documentation/de/usage/running.itely index a4a46406a2..ff5bdb67be 100644 --- a/Documentation/de/usage/running.itely +++ b/Documentation/de/usage/running.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.21" @c Translators: Reinhold Kainhofer, Till Paala @c Translation checkers: Till Paala @@ -32,7 +32,7 @@ Dieses Kapitel behandelt die technischen Details, wie Lilypond ausgeführt werde @translationof Normal usage Die meisten Benutzer führen LilyPond von einer graphischen Benutzeroberfläche -aus. Siehe @rlearning{Übung}, falls Sie dies nicht bereits getan haben. Wenn +aus. Siehe @rlearning{Tutorium}, falls Sie dies nicht bereits getan haben. Wenn Sie einen alternativen Editor für Ihre LilyPond-Dateien verwenden, lesen Sie bitte die Dokumentation dieses Editors. @@ -154,6 +154,38 @@ Die folgenden Kommandozeilenoptionen werden von @command{lilypond} unterstützt: @table @code +@item -b, --bigpdfs +@cindex bigpdfs + +Mit dieser Option generierte PDF-Dateien sind deutlich größer als normal, +weil keine oder nur minimale Zeichensatz-Optimierung erfolgt. Werden +jedoch zwei oder mehr solcher PDF-Dateien in @w{@code{pdftex}-}, +@w{@code{xetex}-} oder @w{@code{luatex}}-Dokumente eingebunden und +anschließend mit ghostscript nachbearbeitet, entstehen deutlich +kleinere PDF-Dokumente, da ghostscript die Zeichensatzdaten auf +diesem Weg viel besser komprimieren kann. + +Nach + +@example +lilypond -b myfile +@end example + +@noindent +sollte @code{ghostscript} wie folgt ausgeführt werden. + +@example +gs -q -sDEVICE=pdfwrite -o gsout.pdf myfile.pdf +@end example + +Mit Hilfe von +@uref{https://code.google.com/p/pdfsizeopt/,@code{pdfsizeopt.py}} +kann die Ausgabedatei noch mehr verkleinert werden. + +@example +pdfsizeopt.py --use-multivalent=no gsout.pdf final.pdf +@end example + @item -d, --define-default=@var{Variable}=@var{Wert} Siehe @ref{Fortgeschrittene Optionen auf der Kommandozeile für LilyPond}. @@ -1030,9 +1062,9 @@ annehmen, dass folgendes Beispiel alle Notenköpfe in dem Notensystem rot macht, aber als Resultat hat man zwei Systeme, während die Notenköpfe immernoch schwarz im unteren System erscheinen. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.NoteHead.color = #red -\new Staff { a } +\new Staff { a' } @end lilypond Das liegt daran, dass kein @code{Staff}-Kontext existiert, wenn @@ -1041,10 +1073,10 @@ für diesen Befehl erstellt wird. Dann aber erstellt @code{\new Staff} noch ein zusätzliches System, wo die Noten gesetzt werden. Die richtige Schreibweise wäre: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Staff { \override Staff.NoteHead.color = #red - a + a' } @end lilypond @@ -1056,7 +1088,7 @@ erstellen. @lilypond[quote,verbatim] \repeat unfold 2 { - \relative c' { c4 d e f } + \relative { c'4 d e f } } @end lilypond @@ -1066,7 +1098,7 @@ umgangen werden. @lilypond[quote,verbatim] \new Voice { \repeat unfold 2 { - \relative c' { c4 d e f } + \relative { c'4 d e f } } } @end lilypond diff --git a/Documentation/de/usage/suggestions.itely b/Documentation/de/usage/suggestions.itely index 19842e81f4..c05a9f8cab 100644 --- a/Documentation/de/usage/suggestions.itely +++ b/Documentation/de/usage/suggestions.itely @@ -1,4 +1,4 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @node Vorschläge zum Schreiben von LilyPond-Eingabe-Dateien @chapter Vorschläge zum Schreiben von LilyPond-Eingabe-Dateien @@ -60,7 +60,7 @@ Hier einige Vorschläge, wie Sie Probleme vermeiden oder lösen können: @item @strong{Schreiben Sie immer mit @code{\version} die Versionsnummer in jede Datei}. Beachten Sie, dass in allen Vorlagen die Versionsnummer -@code{\version "2.16.0"} eingetragen ist. Es empfiehlt sich, in alle +@code{\version "2.19.21"} eingetragen ist. Es empfiehlt sich, in alle Dateien, unabhängig von ihrer Größe, den @code{\version}-Befehl einzufügen. Persönliche Erfahrung hat gezeigt, dass es ziemlich frustrierend sein kann zu erinnern, welche Programmversion man etwa @@ -103,9 +103,9 @@ ersparen Sie sich viele Probleme, wenn Sie ihre Musik eines Tages umarrangieren wollen. @item @strong{Trennen Sie Einstellungen} von den eigentlichen -Noten. Siehe auch @rlearning{Tipparbeit durch Variablen und Funktionen ersparen} +Noten. Siehe auch @rlearning{Tipparbeit durch Variablen und Funktionen einsparen} und -@rlearning{Globale Formatierung}. +@rlearning{Formatvorlagen}. @end itemize @@ -176,8 +176,8 @@ während die @code{violine}-Definition sich wahrscheinlich mit einer neuen Programmversion nicht verändern wird. @example -violine = \relative c'' @{ -g4 c'8. e16 +violine = \relative @{ +g'4 c'8. e16 @} ... \score @{ @@ -199,8 +199,8 @@ man es nur einmal vorzunehmen und die Noten in der Geigenstimme, @example fdannp = _\markup@{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} -violin = \relative c'' @{ -g4\fdannp c'8. e16 +violin = \relative @{ +g'4\fdannp c'8. e16 @} @end example @@ -254,9 +254,9 @@ aus, aber nicht den @code{\bass}-Befehl in dem @code{\score}-Abschnitt: @example -bass = \relative c' @{ +bass = \relative @{ %@{ - c4 c c c + c'4 c c c d d d d %@} @} @@ -635,4 +635,3 @@ copy out\myproject.pdf MyProject.pdf Programmbenutzung: @rprogram{Benutzung auf der Kommandozeile}, @rprogram{lilypond-book}. - diff --git a/Documentation/de/usage/updating.itely b/Documentation/de/usage/updating.itely index bd84a1427e..dfeb68e0d4 100644 --- a/Documentation/de/usage/updating.itely +++ b/Documentation/de/usage/updating.itely @@ -1,4 +1,4 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 diff --git a/Documentation/de/web.texi b/Documentation/de/web.texi index c830355094..262afd8753 100644 --- a/Documentation/de/web.texi +++ b/Documentation/de/web.texi @@ -1,13 +1,13 @@ -\input texinfo @c -*- coding: utf-8; mode: texinfo; -*- +\input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: 233fb6a8b3b6e31de1841641dbbd4c4f43423151 + Translation of GIT committish: 5b6ddab894b3065c35c72ef8048b8c6edbe684ac When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes. @end ignore -@c Translators: Till Paala +@c Translators: Till Paala, Michael Gerdau @setfilename web.info @settitle LilyPond -- Notation für Jedermann @@ -15,29 +15,32 @@ @documentlanguage de @afourpaper -@c `Web' was imported 2009-08-05 with git commit b938d71... -@c @macro copyrightDeclare -@c Copyright @copyright{} 2009--2012 by the authors. -@c @end macro - @set FDL @set web @include macros.itexi @include weblinks.itexi - @c don't remove this comment. @ignore @omfcreator Graham Percival and Patrick McCarty @omfdescription General info about the LilyPond music engraving system @omftype program usage @omfcategory Applications|Publishing -@omflanguage German +@omflanguage English @end ignore +@c `Web' was born 2003-03-30 with this commit: +@c Initial revision +@c author: Han-Wen Nienhuys +@c commit: d189a2119004c2f75da2020ea2ed36d817582fc5 + +@c @macro copyrightDeclare +@c Copyright @copyright{} 2003--2015 by the authors. +@c @end macro + @copying -Copyright @copyright{} 2009--2012 by the authors. +Copyright @copyright{} 2009--2015 by the authors. @c next line is necessary for broken pre-4.13 texinfo's @c install-info, so leave it there until we officially @@ -56,13 +59,13 @@ License''. @c Info files are no longer installed in a subdirectory, images are @c expected to be found in lilypond/ subdirectory. -@dircategory GNU LilyPond --- the music typesetter +@dircategory GNU LilyPond --- Das Notensatzsystem @direntry * LilyPond Handbuch zum Lernen: (lilypond-learning). Hier beginnen. * Glossar: (music-glossary). Begriffsübersetzungen von Englisch in andere Sprachen. * LilyPond Notationshandbuch: (lilypond-notation). LilyPond Notationshandbuch. * LilyPond Schnipsel: (lilypond-snippets). Viele Tricks, Tipps und Beispiele. -* LilyPond Referenz der Interna: (lilypond-internals). Definitionen zum Einstellen. +* LilyPond Referenz der Interna: (lilypond-internals). Definitionen zum Anpassen. * LilyPond Application Usage: (lilypond-usage). Programme installieren und benutzen. * LilyPond Webseite: (lilypond-web). Vorschau der neuen Webseite. * lilypond: (lilypond-usage)LilyPond starten. Das LilyPond-Programm aufrufen. @@ -89,9 +92,9 @@ License''. @titlepage @title LilyPond -@subtitle Das Notensatzprogramm +@subtitle Das Notensatzsystem @titlefont{Allgemeine Information} -@author Das LilyPond-Entwicklunsteam +@author Das LilyPond-Entwicklungsteam @vskip 0pt plus 1filll @c @vskip 20pt @@ -118,11 +121,12 @@ Für LilyPond Version @version{} @c @im ageId{cmws,web-snippet-alpha.png,Catchy Musical Web Snippet} @divId{quickSummary} -@subheading Was ist LilyPond? - -LilyPond ist ein Notensatzprogramm, dass es sich zum Ziel gemacht hat, Notendruck von der bestmöglichen Qualität zu erstellen. Mit dem Programm wird es -möglich, die Ästhetik handgestochenen traditionellen Notensatzes mit computergesetzen Noten zu erreichen. LilyPond ist Freie Software -und Teil des @uref{http://gnu.org,GNU Projekts}. +LilyPond ist ein Notensatzsystem. Das erklärte Ziel ist es, +Notendruck in bestmöglicher Qualität zu erstellen. Mit dem +Programm wird es möglich, die Ästhetik handgestochenen +traditionellen Notensatzes mit computergesetzten Noten zu +erreichen. LilyPond ist Freie Software und Teil des +@uref{http://gnu.org,GNU-Projekts}. @divClass{align-right} Lesen Sie mehr in der @ref{Einleitung}! @@ -130,9 +134,6 @@ Lesen Sie mehr in der @ref{Einleitung}! @divEnd @divEnd -@divClass{separator} -@divEnd - @divId{news} @@ -140,24 +141,41 @@ Lesen Sie mehr in der @ref{Einleitung}! @include web/news-front.itexi @divClass{float-right} -(@ref{Old news,,,,Ältere Neuigkeiten}) +(@ref{Ältere Neuigkeiten}) @divEnd @divEnd + @ifclear web_version @c do nothing @end ifclear @ifset web_version - @c make the box: -@divId{wildCardBox} -@subheading Neuigkeiten -@divId{wildCardText} + @c make the side bar: +@divId{homePageSideBar} +@subheading Stabile Version + +@c TODO: javascript to detect OS and suggest download? + +@ref{Download, Download @versionStable} + +@ref{Handbücher, Handbücher @versionStable} + +@subheading Entwickler Version + +@ref{Entwicklung, Download @versionDevel} + +@ref{Entwicklung, Handbücher @versionDevel} + +@subheading Pondings +@divId{pondingsText} @divEnd + @divEnd @end ifset + @html @end html -@ifset web_version - @c make the box: -@divId{latestVersion} -@subheading Direktlinks - -@c TODO: javascript to detect OS and suggest download? - -@subsubheading Stabile Version - -@ref{Download, @versionStable herunterladen} - -@ref{Handbücher, @versionStable Handbücher} - -@subsubheading Entwicklerversion - -@ref{Entwicklung, @versionDevel herunterladen} - -@ref{Entwicklung, @versionDevel Handbücher} - -@divEnd -@end ifset - @ifnottex @@ -226,7 +222,6 @@ Lesen Sie mehr in der @ref{Einleitung}! @allowcodebreaks false - @c ****************** GENERAL STUFF FOR INFO ************ @ignore Distributions will want to install lilypond.info in postinstall, doing: @@ -242,13 +237,9 @@ Distributions will want to install lilypond.info in postinstall, doing: @end ignore - - - @c FIXME: this still doesn't solve the broken links in pdf and big @c html; we'll need a bunch of @iftext and stuff in here. -gp @c ****************** SPECIAL MACROS FOR WEB MANUAL ************ - @macro docLinks{name,base,refLink,split,big,bigsize,pdf,pdfsize} @subheading Lesen Sie @@ -256,6 +247,7 @@ Distributions will want to install lilypond.info in postinstall, doing: @end macro + @macro docLinkSplit{name,base,webLink} @docLink{\name\ (geteiltes HTML),\base\/index.html,\webLink\} @end macro @@ -275,11 +267,11 @@ Distributions will want to install lilypond.info in postinstall, doing: @itemize @item @docLinkSplit{\name\,\base\,\split\} @minus{} - das Handbuch wird auf viele HTML-Seiten aufgeteilt. + das Handbuch wird in viele HTML-Seiten aufgeteilt. @*@ @ @emph{(kleiner Download für jede Seite)} @item @docLinkBig{\name\,\base\,\big\} @minus{} - das Handbuch auf einer großen HTML-Seite. + das Handbuch als eine großen HTML-Seite. @*@ @ @emph{(großer einmaliger Download, \bigsize\)} @item @docLinkPdf{\name\,\base\,\pdf\} @minus{} @@ -309,9 +301,14 @@ Distributions will want to install lilypond.info in postinstall, doing: @divClass{heading-center} @divClass{contactBox} -Wenn Sie die Erwähnung von \topic\ hier vermissen, teilen Sie das uns -bitte mit und beachten Sie die Anleitung dazu unter -@ref{Fehlerberichte}. +Sollten Sie hier die Erwähnung von \topic\ vermissen, dann teilen Sie uns +dies bitte mit indem Sie eine Nachricht an die bug-lilypond Mailingliste schicken. +Falls Sie diese Mailingliste noch nicht abonniert haben, können Sie das auf +dieser Seite ändern: +@uref{https://lists.gnu.org/mailman/listinfo/bug-lilypond,info page} +Oder schreiben Sie direkt eine Nachricht über das +@uref{http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs, +gmane lilypond.bugs web interface}. @divEnd @divEnd @@ -322,8 +319,8 @@ bitte mit und beachten Sie die Anleitung dazu unter @ifnothtml @macro contactUsAbout{topic} @cartouche -Wenn Sie die Erwähnung von \topic\ hier vermissen, teilen Sie das uns -bitte mit und beachten Sie die Anleitung dazu unter +Sollten Sie hier die Erwähnung von \topic\ vermissen, dann teilen Sie uns +dies bitte mit. Die Anleitung dazu finden Sie unter @ref{Fehlerberichte}. @end cartouche @@ -331,8 +328,6 @@ bitte mit und beachten Sie die Anleitung dazu unter @end macro @end ifnothtml - - @include web/introduction.itexi @include web/download.itexi @include web/manuals.itexi diff --git a/Documentation/de/web/community.itexi b/Documentation/de/web/community.itexi index 8b68907ace..de6578eec8 100644 --- a/Documentation/de/web/community.itexi +++ b/Documentation/de/web/community.itexi @@ -1,14 +1,15 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: a0077273ac8bf29ae472c8712bc78a02d138f898 + Translation of GIT committish: 5b6ddab894b3065c35c72ef8048b8c6edbe684ac When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes. @end ignore -@c Translators: Till Paala +@c Translators: Till Paala, Michael Gerdau +@include included/acknowledge.itexi @include included/authors.itexi @include included/helpus.itexi @@ -25,10 +26,10 @@ @item @ref{Kontakt}: hier erhalten Sie Hilfe, können diskutieren und -in in Kontakt mit der Gemeinschaft bleiben. +in Kontakt mit der Gemeinschaft bleiben. @item -@ref{Minimalbeispiele}: sie werden @emph{sehr stark} empfohlen, +@ref{Minimalbeispiele}: sie werden @emph{dringend} empfohlen, wenn man über LilyPond diskutieren will. @item @@ -38,7 +39,7 @@ wenn man über LilyPond diskutieren will. @divEnd @divClass{column-left-bottom} -@subheading LilyPond besser machen +@subheading LilyPond verbessern @itemize @@ -52,11 +53,14 @@ wenn man über LilyPond diskutieren will. @ref{Entwicklung}: für Mitarbeiter und Tester. @item -@ref{GSoC 2012}: Liste der Projekte für den Google Summer of Code. +@ref{Google Summer of Code}: Projektideen für den Google Summer of Code (GSoC). @item @ref{Autoren}: die Menschen, die LilyPond zu dem gemacht haben, -was es jetzt ist. +was es heute ist. + +@item +@ref{Danksagungen}: Projekte und Institutionen, die LilyPond unterstützen @end itemize @divEnd @@ -81,7 +85,6 @@ uns geschrieben wurde. @divEnd - @divClass{hide} @menu * Kontakt:: @@ -90,8 +93,9 @@ uns geschrieben wurde. * Helfen Sie uns:: * Sponsoren:: * Entwicklung:: -* GSoC 2012:: +* Google Summer of Code:: * Autoren:: +* Danksagungen:: * Veröffentlichungen:: * Ältere Neuigkeiten:: * Abstellkammer:: @@ -107,9 +111,9 @@ uns geschrieben wurde. @divClass{column-left-bottom} @subheading Benutzergruppen und Hilfe -@subsubheading Mailingliste der Benutzer: @code{lilypond-user@@gnu.org} +@subsubheading Benutzer Mailingliste: @code{lilypond-user@@gnu.org} -Diese Mailingliste ist der hauptsächliche Ort, wo Benutzer diskutieren +Diese Mailingliste ist der zentrale Ort, an dem Benutzer diskutieren und einander helfen. Die Sprache der Liste ist Englisch. Zu deutschsprachiger Hilfe, siehe unten. @quotation @@ -124,7 +128,7 @@ Archiv2} Archiv3} @uref{http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.general, -mit gmaine an lilypond-user schicken} +mit gmane an lilypond-user schicken} @end quotation @warning{Wenn Sie Fragen stellen (immer auf Englisch) benutzen @@ -133,21 +137,22 @@ Sie bitte @ref{Minimalbeispiele}!} @subsubheading LilyPond-Schnipsel-Depot -Das LilyPond-Schnipsel-Depot (LSR) ist eine große Sammlung durch die Benutzer -erstellter Beispiele, die frei kopiert und in eigenen Werken benutzt werden -dürfen. Schauen Sie, was andere Leute konstruiert haben und schreiben Sie -eigene Beispiele! +Das LilyPond-Schnipsel-Depot (LSR - LilyPond Snippet Repository) ist eine große Sammlung durch Anwender +erstellter Beispiele, die frei kopiert und in eigenen Werken verwendet werden +dürfen. Schauen Sie, was andere Leute konstruiert haben und fügen Sie ggf. +eigene Schnipsel hinzu! @example -@uref{http://lsr.dsi.unimi.it} +@uref{http://lsr.di.unimi.it} @end example Besonders lehrreiche Beispiele aus dem LSR werden in unsere offizielle Dokumentation eingefügt, in @ref{Schnipsel}. + @subsubheading IRC -Etwas Unterstützung können Sie auch auf unserem IRC-Kanal erhalten: +Unterstützung können Sie auch auf unserem IRC-Kanal erhalten: @example @uref{irc://irc.freenode.net/lilypond, #lilypond@@irc.freenode.net} @@ -182,42 +187,35 @@ Mailingliste gestellt wird. @subsubheading Andere Sprachen +@quotation @uref{http://www.lilypondforum.de/, Deutsches LilyPond-Forum} -@quotation -@uref{http://lists.gnu.org/mailman/listinfo/lilypond-es, -Spanische Mailingliste} - -@uref{http://groups.google.com/group/lilypond-brasil, -Portugiesische Gruppe} - @uref{http://lists.gnu.org/mailman/listinfo/lilypond-user-fr, Französische Mailingliste} -@uref{http://www.lilypondforum.nl/, -Holländisches Forum} -@end quotation +@uref{http://groups.google.com/group/lilypond-brasil, +Portugiesischsprachige Gruppe} +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-es, +Spanische Mailingliste} +@end quotation @divEnd @divClass{column-right-top} -@subheading Bleiben Sie informiert +@subheading Der LilyPond Blog -@subsubheading LilyPond Report - -Der einfachste Weg in Kontakt zu bleiben ist es, den Newsletter -unserer Gemeinschaft zu lesen, den LilyPond Report (auf Englisch). +Folgen sie unserem community blog, @q{Scores of Beauty}: @example -@uref{http://news.lilynet.net} -@end example +@uref{http://lilypondblog.org} +@end example @subsubheading Mailingliste für neue Versionen: @code{info-lilypond@@gnu.org} -Diese Mailingliste ist sehr wenig aktiv und kann nur gelesen werden: -hier wird über neue Versionen von LilyPond informiert. +Diese Mailingliste hat ein sehr geringes Mailaufkommen und kann nur gelesen werden. Sie dient +der Ankündigung neuer Versionen. @quotation @uref{http://lists.gnu.org/mailman/listinfo/info-lilypond, @@ -238,12 +236,12 @@ Archiv3} @divClass{column-right-bottom} -@subheading Diskussionen der Entwickler +@subheading Diskussionen der Entwickler und Übersetzer @subsubheading Entwickler-Mailingliste: @code{lilypond-devel@@gnu.org} -Die meisten Diskussionen von Entwicklern finden auf dieser Liste -statt. Änderungen sollten hier hin geschickt werden. +Diskussionen der Entwicklern finden auf dieser Liste +statt. Patches können ebenfalls hier hin geschickt werden. @quotation @uref{http://mail.gnu.org/mailman/listinfo/lilypond-devel, @@ -263,7 +261,8 @@ mit gmane an lilypond-devel schicken} @subsubheading Mailingliste für Fehler: @code{bug-lilypond@@gnu.org} -Fehlermeldungen und Diskussionen finden hier statt. +Fehlermeldungen und Diskussionen finden hier statt, jedoch bitte keine Patches +an diese Liste senden. @quotation @uref{http://mail.gnu.org/mailman/listinfo/bug-lilypond, @@ -282,14 +281,16 @@ Archiv3} @warning{Bevor Sie eine Nachricht an die Fehler-Liste schreiben, lesen Sie bitte unsere Richtlinien für @ref{Fehlerberichte}.} -@divEnd -@divClass{column-right-bottom} -@subheading Private E-Mails +@subsubheading Mailingliste für Übersetzungen: @code{translations@@lilynet.org} -Private Angelegenheiten sollten an Graham Percival -(den Projektmanager) gerichtet werden, der dann die -Betroffen einbezieht. +Jegliche Diskussionen über Übersetzungen der LilyPond Handbücher sollte auf dieser Liste stattfinden, +jedoch bitte keine Patches an diese Liste senden. + +@quotation +@uref{http://lilypond-translations.3384276.n2.nabble.com/, +Translation mailing list archive} +@end quotation @divEnd @@ -322,9 +323,9 @@ einkreisen und Ihnen helfen. @item Die effiziente Analyse eines Problems erfordert ohnehin eine -Reduktion auf das wesentliche. Kippen Sie umfangreiches Material -in der Liste ab, so scheint Ihnen die Lösung Ihres Problems keine -eigene Mühe wert. +Reduktion auf das Wesentliche. Wenn Sie umfangreiches Material an die +Liste schicken, dann erwecken Sie den Eindruck, dass Ihnen die Lösung +Ihres Problems keine eigene Mühe wert ist. @item Ein Minimalbeispiel zu erstellen hilft Ihnen zu verstehen, was @@ -355,13 +356,14 @@ Probleme können in weniger als einem einzigen Takt gezeigt werden. @item Wenn Sie versuchen, ein Beispiel zu erstellen, versuchen Sie -zuerst, Abschnitt Ihrer Datei auszukommentieren @w{(@code{%} +zuerst, Abschnitte Ihrer Datei auszukommentieren @w{(@code{%} oder @code{%@{ @dots{} %@}})}. Wenn Sie etwas auskommentieren -können, und das Problem immer noch gezeigt wird, entfernen Sie die +können, und das Problem immer noch vorhanden ist, entfernen Sie die auskommentierten Abschnitte. @item -Vermeiden Sie komplizierte Noten, Tonarten, Schlüssel oder Taktarten, es sei denn Ihr Problem hat mit ihnen etwas zu tun. +Vermeiden Sie komplizierte Noten, Tonarten, Schlüssel oder Taktarten, +es sei denn Ihr Problem hat mit ihnen etwas zu tun. @item Benutzen Sie nicht @code{\override} oder @code{\set}, es sei denn, @@ -473,11 +475,11 @@ Hier ein Beispiel eines guten bug reports: @divEnd @divClass{column-right-bottom} -@subheading 3. Schritt: Einsenden eines Fehlerberichtes +@subheading 3. Schritt: Einsenden eines Fehlerberichtes Wenn Sie sichergestellt haben, dass der Fehler noch nicht bekannt ist und einen Fehlerbericht erstellt haben, senden sie -ihn bitte uns zu! +ihn bitte an uns! @divClass{keep-bullets} @itemize @@ -489,7 +491,7 @@ ganz gewöhnlich eine E-Mail schicken. @item Wenn Sie nicht Mitglied der Liste sind, können Sie trotzdem -einen Fehlerbericht über die +einen Fehlerbericht über das @uref{http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs, gmane lilypond.bugs web interface} schicken. @@ -512,11 +514,11 @@ Fehlerberichtes hinzu. @divClass{column-center-bottom} @subheading 4. Schritt: Auf Antwort warten -Wenn Ihr Fehlerbericht an die Liste versandt wurde, untersucht -unser Fehlerbeseitiger (engl. bug squad) den Bericht. Sie werden +Wenn Ihr Fehlerbericht an die Liste versandt wurde, untersuchen +unsere Fehlerbeseitiger (engl. bug squad) den Bericht. Sie werden eventuell nach mehr Information gefragt. Sie werden informiert, -wann der Bericht um Tracker hinzugefüt wird. Warten Sie -bitte vier Tage, da uns nur eine geringe Zahl an Helfern zur Verfügung stehen. +wann der Bericht im Tracker hinzugefüt wird. Warten Sie bitte vier Tage, +da uns für diese Tätigkeit nur eine geringe Zahl an Helfern zur Verfügung stehen. Wenn ein Fehler dem Tracker hinzugefügt wurde, können Sie ihn kommentieren, um mehr Information hinzuzufügen. Sie können den Fehler auch markieren, @@ -566,7 +568,7 @@ demonstrieren. @divClass{keep-bullets} @divClass{column-left-top} -@subheading Materielle Hilfe +@subheading Kopfgelder/Prämien In der Vergangenheit @@ -659,9 +661,11 @@ Implementation, Vereinfachung, Dokumentation und Fehlerbeseitigung. @end ifset -@warning{Hier handelt es sich um nicht stabile Entwicklerversionen. +@c we normally don't allow named references, but in this case +@c it's good to emphasize the "stable" part. -gp +@warning{Hier handelt es sich um @emph{möglicherweise instabile} Entwicklerversionen. Wenn Sie nicht genau wissen, wie man LilyPond installiert und -benutzt, empfehlen wir ausdrücklich, die @ref{Download, stabilen Download}-Versionen +benutzt, empfehlen wir ausdrücklich, die @ref{Download, stabile Download}-Version zu benutzen und die @ref{Handbücher, stabilen Handbücher} zu lesen.} @divEnd @@ -670,7 +674,7 @@ zu benutzen und die @ref{Handbücher, stabilen Handbücher} zu lesen.} @subheading Veröffentlichungsnummern Es gibt zwei Veröffentlichungsreihen für LilyPond: stabile Versionen -und die unstabilen Entwicklerversionen. Stabile Versionen haben eine +und die instabilen Entwicklerversionen. Stabile Versionen haben eine gerade zweite Versionsnummer (also etwa 2.8, 2.10, 2.12). Entwicklerversionen haben eine ungerade zweite Versionsnummer (also 2.7, 2.9, 2.11). @@ -733,7 +737,7 @@ geschrieben (nur auf Englisch). @divClass{column-center-top} -@subheading Regressionsteste +@subheading Regressionstests @divClass{keep-bullets} @@ -741,23 +745,23 @@ geschrieben (nur auf Englisch). @itemize @item -@uref{../../input/regression/collated-files.html, Regressionsteste}: -Die Regressionsteste dieser Version. +@uref{../../input/regression/collated-files.html, Regressionstests}: +Die Regressionstests dieser Version. (@uref{../../input/regression/collated-files.pdf, PDF-Version}) @item -@uref{../../input/regression/musicxml/collated-files.html, MusicXML-Teste}: -musicXML-Regressionsteste dieser Version. +@uref{../../input/regression/musicxml/collated-files.html, MusicXML-Tests}: +musicXML-Regressionstests dieser Version. (@uref{../../input/regression/musicxml/collated-files.pdf, PDF-Version}) @item -@uref{../../input/regression/abc2ly/collated-files.html, abc2ly-Teste}: -abc2ly-Teste dieser Version. +@uref{../../input/regression/abc2ly/collated-files.html, abc2ly-Tests}: +abc2ly-Tests dieser Version. (@uref{../../input/regression/abc2ly/collated-files.pdf, PDF-Version}) @item -@uref{../../input/regression/lilypond-book/collated-files.html, lilypond-book-Teste}: -lilypond-book-Teste dieser Version. +@uref{../../input/regression/lilypond-book/collated-files.html, lilypond-book-Tests}: +lilypond-book-Tests dieser Version. (@uref{../../input/regression/lilypond-book/collated-files.pdf, PDF-Version}) @end itemize @@ -787,18 +791,16 @@ lilypond-book-Teste dieser Version. @item @regtestStableLilypondBook (@regtestStableLilypondBookPdf{}) @end itemize - @end ifset - @subsubheading Alle Versionen @itemize @item @uref{http://lilypond.org/test, Vergleiche zweier Versionen}: -@item @uref{http://lilypond.org/download/binaries/test-output/, -Archiv aller Regressionsteste} +@item @uref{http://lilypond.org/downloads/binaries/test-output/, +Archiv aller Regressionstests} @end itemize @@ -812,12 +814,13 @@ Archiv aller Regressionsteste} @ifclear web_version @warning{Diese Handbücher sind für LilyPond @version{}; die neuesten -Handbücher finden sich auf @url{http://lilypond.org}.} +Handbücher finden sich unter @url{http://lilypond.org}.} @end ifclear @divClass{normal-table} @multitable @columnfractions .3 .3 .3 @headitem Einleitung + @item @docLinkSplit{Lernen,learning,@manualDevelLearningSplit-de} @tab @@ -838,8 +841,10 @@ Handbücher finden sich auf @url{http://lilypond.org}.} @docLinkBig{Aufsatz,essay,@manualDevelEssayBig-de} @tab @docLinkPdf{Aufsatz,essay,@manualDevelEssayPdf-de} +@end multitable -@headitem Häufig benutzte Handbücher +@multitable @columnfractions .3 .3 .3 +@headitem Häufig benötigte Handbücher @item @docLinkSplit{Notation,notation,@manualDevelNotationSplit-de} @@ -861,9 +866,10 @@ Handbücher finden sich auf @url{http://lilypond.org}.} @docLinkBig{Schnipsel,snippets,@manualDevelSnippetsBig} @tab @docLinkPdf{Schnipsel,snippets,@manualDevelSnippetsPdf} +@end multitable - -@headitem Seltenere Handbücher +@multitable @columnfractions .3 .3 .3 +@headitem Seltener benötigte Handbücher @item @docLinkSplit{Webseite,web,@manualDevelWebSplit-de} @@ -892,189 +898,189 @@ Handbücher finden sich auf @url{http://lilypond.org}.} @docLinkBig{Interna,internals,@manualDevelInternalsBig} @tab @docLinkPdf{Interna,internals,@manualDevelInternalsPdf} +@end multitable @ifset web_version +@multitable @columnfractions .3 @headitem Zum Herunterladen @item @doctarballDevel +@end multitable @end ifset -@end multitable @divEnd @divEnd -@node GSoC 2012 -@unnumberedsec GSoC (Google Summer of Code) 2012 -@translationof GSoC 2012 + + +@node Google Summer of Code +@unnumberedsec Google Summer of Code +@translationof Google Summer of Code @divClass{column-center-top} @subheading Was ist Google Summer of Code? -Google Summer of Code ist ein globales Programm, -das Studenten Stipendien offeriert, um an Open-Source-Projekten während -der Sommerferien zu arbeiten. +Google Summer of Code ist ein globales Programm, bei dem Google Studenten +Stipendien offeriert, um in den Sommerferien an Open-Source-Projekten zu arbeiten. -Das LilyPond-Team hat beschlossen, dass sich hier eine ausgezeichnete Möglichkeit -bietet neue Mitarbeiter zu finden und Studenten, die sich schon an LilyPond beteiligen, weiter einzubinden. Einer unserer Mitarbeiter wurde für den -Sommer 2012 als Teil des @uref{http://www.gnu.org/, GNU-Projekts} angenommen; -wir hoffen, dass wir auch in kommenden Jahren an dem Programm teilnehmen können. +Es ist dies eine ausgezeichnete Gelegenheit neue Entwickler zu finden und diejenigen, +die bereits an LilyPond mitwirken zu motivieren, ihr Engagement zu vertiefen. +Einer unserer Entwickler wurde für den Sommer 2012 als Teil des @uref{http://www.gnu.org/, GNU-Projekts} angenommen; +wir hoffen, dass auch in kommenden Jahren Entwickler für LilyPond an dem Programm teilnehmen können. @divEnd @divClass{column-center-bottom} -@subheading Unsere Ideenliste 2012 +@subheading Unsere Ideenliste -Unten befindet sich eine Liste mit empfohlenen Projekten für GSoC-Stundenten für -den Sommer 2012. Wenn auch die Anmeldefrist vorbei ist, lassen wir die Informationen -trotzdem online, weil sie als Anregung für alle LilyPond-Entwickler dienen -können. Einige Mitglieder des Entwicklungsteams helfen gerne Freiwilligen, -die sich an diese Projekte wagen wollen. +Unten befindet sich eine Liste mit vorgeschlagenen Projekten für GSoC-Stundenten für +den Sommer 2012. Wir haben sie hier aufbewahrt, damit sie zukünftigen GSoC Interessenten +als Anregung dienen mag. -Es gibt natürlich viel mehr, was an LilyPond verbessert werden kann, darunter -auch sehr kleine Projekte. Eine vollständige Liste aller bekannten Probleme -findet sich @uref{http://code.google.com/p/lilypond/issues/list, hier}. +Natürlich gibt es noch sehr viele andere Aufgaben, um LilyPond weiter zu +verbessern und das LilyPond Entwicklerteam wird jederzeit jede/n gern unterstützen, +die/der Aufgaben wie jene unten aufgeführten angehen möchte. +Eine vollständige Liste aller aktuell offenen Punkte findet sich +@uref{http://code.google.com/p/lilypond/issues/list, hier}. + +@divEnd + +@divClass{column-center-middle-color3} @subheading Stichnoten -Lösen Sie Probleme mit der Synchronisation von Verzierungen (Vorschläge usw.), -zusammen mit der darunter liegenden Architektur (siehe -@uref{http://code.google.com/p/lilypond/issues/detail?id=34, -Nummer 34 in unserem Tracker}). Verzierungen bringen das Zeitmaß von LilyPond -durcheinander, weil sie sozusagen in der Zeit rückwärts gehen. Dadurch -entstehen seltsame Effekte, besonders wenn in einem Notensystem eine -Verzierung auftritt und im zweiten nicht. +Beseitigen Sie Probleme bei der Synchronisation von Vorschlagsnoten. Vorschlagsnoten +können das Zeitmaß von LilyPond durcheinander bringen und so unerwartete Effekte hervorrufen. +Das tritt besonders dann auf, wenn viele Notensysteme verwendet werden und einige Vorschlagsnoten +haben und andere nicht. @strong{Schwierigkeit:} mittel - @strong{Erfordernisse:} C++, MIDI - -@strong{Empfohlen:} Bekannt mit den Interna von LilyPond - +@strong{Empfohlen:} mit den Interna von LilyPond vertraut sein @strong{Mentoren:} Mike Solomon, Carl Sorensen +@divEnd + +@divClass{column-center-middle-color3} @subheading MusicXML -Hinzufügen von erweiterter Unterstützung für den Export von MusicXML und -Verbesserung des Imports, zusätzlich Tests, die die Funktionen überprüfen. -Abhängig von der zur Verfügung stehenden Zeit kann etwas oder alles der -folgenden Punkte implementiert werden: +Verbesserung der MusicXML Import- und Exportfunktionen: @divClass{keep-bullets} @itemize @item -Der Export soll grundlegende Funktionen wie den MIDI-Export können (d. h. -die Benutzung von eigenen Exportklassen, abgeleitet von der Übersetzerklasse.) +Der Export sollte ähnlich wie der MIDI Export wenigstens die Musik an sich exportieren können (d.h. +die Benutzung eine dezidierter Exportklassen, abgeleitet von der translator class.) @item -Der XML-Baum soll aus dem grundlegenden musikalischen Inhalt erstellt werden, -hinzu kommt eine Verbindung von musikalischem Ereignis zu XML-Tag. +Der XML-Baum der Musik an sich muss erzeugt, +Verbindungen zwischen den music events und den XML Tags hergestellt werden. @item Alle LilyPond-Engraver sollen ihre Arbeit verrichten. @item -Alle Ausgabe-Objekte (also alle Stencils/Gruppen von Stencils) sollen der +Alle Ausgabe-Objekte (also alle Stencil/Gruppen von Stencils) sollen der Musik zugeordnet werden (und damit auch dem XML-Tag im XML-Baum). @item -Ein XML-Ausgabebackend soll hinzugefügt werden, welches die Layoutinformationen -für jedes Ausgabe-Objekt den XML-Tags hinzufügen kann. +Ein XML-Ausgabebackend soll hinzugefügt werden. Dieses fügt die Layoutinformationen +für jedes Ausgabe-Objekt den XML-Tags hinzu. @end itemize @divEnd -Das Ziel wird als erreicht angesehen, wenn eine (vorher festgelegte) Partitur -von MusicXML importiert und dann wieder exportiert werden kann, ohne dass -ungewollter Datenverlust eintritt. - @strong{Schwierigkeit:} mittel - -@strong{Erfordernisse:} MusicXML, Python, grundlegene Kenntnis von LilyPond - +@strong{Erfordernisse:} MusicXML, Python, grundlegende Kenntnisse in LilyPond @strong{Mentoren:} Reinhold Kainhofer, Mike Solomon -Kenntnis anderer Notensatzprogramme (zum Testen) wäre ein netter Bonus. +Kenntnis anderer Notensatzprogramme (zum Testen) wäre hilfreich. +@divEnd + +@divClass{column-center-middle-color3} @subheading Binde- und Legatobögen verbessern Die Standardform von Binde- und Legatobögen ist oft nicht zufriedenstellend. -Überbindungen von enharmonischen Tönen (etwa @code{@{ cis'~ des' @}}) werden -nicht unterstützt, auch Überbindungen, die von Schlüssel- oder Systemwechsel -unterprochen werden, sind schlecht unterstützt. Das Projekt beinhaltet das -Sammeln und Sortieren von Beispielen schlechter Ausgabe, das feststellen der -richtigen Formatierung und das Schreiben das dazu notwendigen Codes. +Durch Schlüssel- oder Systemwechsel unterbrochene Bögen werden nicht gut behandelt. +Teil der Aufgabe wäre es, Beispiele von unschöner Ausgabe zu sammeln und zu gruppieren +um dann zu entscheiden, welche Ausgabe stattdessen gewünscht wäre. Schließlich +muß der dazu notwendige Programmcode geschrieben werden. @strong{Schwierigkeit:} schwer - @strong{Erfordernisse:} C++, Erfahrung mit Heuristiken +@strong{Empfohlene Kenntnisse:} LilyPond-Kenntnisse, Sinn für Ästhetik +@strong{Mentor:} Mike Solomon -@strong{Empfohlene Kenntnisse:} LilyPond-Kenntniss, Sinn für Ästhetik +@divEnd -@strong{Mentor:} Mike Solomon +@divClass{column-center-middle-color3} +@subheading Hinzufügen von Glyphenvarianten -@subheading Eine besondere Variante bestimmter Glyphen hinzufügen +@divClass{keep-bullets} +@itemize -Zusätzliche Varianten von Glyphen schaffen für Situationen wie auf der Linie, -zwischen den Linien, kürzere und schmalere Varianten für z. B. Versetzungszeichen, -zusammen mit einer Infrastruktur, die das unterstützt. Ein Beispiel ist die -Breve der Alten Notation, deren Notenkopf in zwei Varianten vorkommt, mit -kleinerem und größerem Loch. +@item +Hinzufügen von Glyphenvarianten zur Darstellen @q{auf} und @q{zwischen} Notenlinien. -@strong{Schwierigkeit:} leicht +@item +Kürzere und schmalere Varianten der gleichen Glyphe, z.B. Vorzeichen. +Ein weiteres spezielles Beispiel wäre ein Breve Notenkopf für @q{Alte Musik}. +Hier wäre zwei Varianten mit kleinem bzw. größerem @q{Loch} denkbar. +@end itemize +@divEnd + +@strong{Schwierigkeit:} leicht @strong{Erfordernisse:} MetaFont, C++, gutes Auge für Details +@strong{Empfohlene Kenntnisse:} grundlegene LilyPond Kenntnis +@strong{Mentor:} Werner Lemberg -@strong{Empfohlene Kenntnisse:} grundlegene LilyPond-Kenntnis -@strong{Mentor:} Werner Lemberg +@divEnd -@subheading Bebalkung verbessern +@divClass{column-center-middle-color3} +@subheading Balkenpositionierung verbessern -Die Standardpositionen von normaler Bebalkung, Bebalkung über Systeme hinweg, -unterbrochene und Knie-Bebaklung sollte verbessert werden. Balken sollten +Die Standardpositionierung von normalen Balken, Balken über Systeme hinweg, +unterbrochene und Knie-Balken sollte verbessert werden. Balken sollten sich am Kontext und benachbarten Noten orientieren (siehe @uref{http://icking-music-archive.org/lists/sottisier/sottieng.pdf, Abschnitt 2.2}). Wenn möglich, sollte die Rechenzeit für die Bebalkung verkürzt werden. @strong{Schwierigkeit:} mittel - @strong{Erfordernisse:} C++, Erfahrung mit Heuristiken - @strong{Empfohlene Kenntnisse:} Sinn für Ästhetik - @strong{Mentoren:} Mike Solomon, Carl Sorensen +@divEnd +@divClass{column-center-middle-color3} @subheading Kompilationswarnungen aufräumen -Aufräumen von Kompilationswarnungen, statischer Codeanalyse und Valgrind-Warnungen. -Werkzeuge zur automatischen Analyse von Code (Warnungen in @code{g++} und -@code{clang}) und Analysewerkzeuge wie die Valgrind-memory-leak-detection und -callgrind code profiler stellen wertvolle Informationen über mögliche Probleme -im C++-Code zu Verfügung. Wenn man diese Warnungen aufräumt, könnte man auch -automatisch alle Patche zurückweisen, die neue Warnungen mit sich bringen würden. +Werkzeuge zur automatisierten Codeanalyse wie @q{valgrind memory leak detection} oder +@q{callgrind code profiler} liefern wertvolle Information über möglicher +Defizite in unserem C++ code. Eine Bereinigung der Warnungen würde uns erlauben +automatisiert Patches, die zusätzliche Warnungen erzeugen, abzulehnen. @strong{Schwierigkeit:} mittel - @strong{Erfordernisse:} C++ - @strong{Mentoren:} Joe Neeman, Reinhold Kainhofer @divEnd - @node Autoren @unnumberedsec Autoren @translationof Authors @divClass{column-left-top} -@subheading Current Development Team +@subheading Aktuelles Entwicklungsteam @divClass{keep-bullets} @developersCurrent @@ -1082,7 +1088,7 @@ automatisch alle Patche zurückweisen, die neue Warnungen mit sich bringen würd @divEnd @divClass{column-right-top} -@subheading Previous Development Team +@subheading Früheres Entwicklungsteam @divClass{keep-bullets} @developersPrevious @@ -1091,22 +1097,22 @@ automatisch alle Patche zurückweisen, die neue Warnungen mit sich bringen würd @divClass{column-center-top} -@subheading Current Contributors +@subheading Aktuelle Mitarbeiter @divClass{keep-bullets} -@subsubheading Programming +@subsubheading Programmierung @coreCurrent -@subsubheading Font +@subsubheading Schriftarten @fontCurrent -@subsubheading Documentation +@subsubheading Dokumentation @docCurrent -@subsubheading Bug squad +@subsubheading Fehler Bereinigung @bugsquadCurrent @@ -1114,7 +1120,7 @@ automatisch alle Patche zurückweisen, die neue Warnungen mit sich bringen würd @supportCurrent -@subsubheading Translation +@subsubheading Übersetzung @translationsCurrent @@ -1123,18 +1129,18 @@ automatisch alle Patche zurückweisen, die neue Warnungen mit sich bringen würd @divClass{column-center-bottom} -@subheading Previous Contributors +@subheading Frühere Mitarbeiter @divClass{keep-bullets} -@subsubheading Programming +@subsubheading Programmierung @corePrevious -@subsubheading Font +@subsubheading Schriftarten @fontPrevious -@subsubheading Documentation +@subsubheading Dokumentation @docPrevious @@ -1147,13 +1153,24 @@ automatisch alle Patche zurückweisen, die neue Warnungen mit sich bringen würd @supportPrevious -@subsubheading Translation +@subsubheading Übersetzung @translationsPrevious @divEnd @divEnd +@node Danksagungen +@unnumberedsec Danksagungen +@translationof Acknowledgements + +@divClass{column-center-top} +@subheading Danksagungen + +@divClass{keep-bullets} +@acknowledgementsCurrent +@divEnd +@divEnd @node Veröffentlichungen @@ -1181,7 +1198,7 @@ automatisch alle Patche zurückweisen, die neue Warnungen mit sich bringen würd @divEnd @divEnd -@contactUsAbout{wissenschaftliche Aufsätzen} +@contactUsAbout{wissenschaftliche Aufsätze} @node Ältere Neuigkeiten @@ -1207,6 +1224,7 @@ automatisch alle Patche zurückweisen, die neue Warnungen mit sich bringen würd @subheading Ankündigungen Ankündigungen und Neuigkeiten nach Version: +@uref{http://lilypond.org/doc/v2.16/Documentation/web/index#Lilypond-2_002e16_002e0-released_0021-August-24_002c-2012-1,v2.16}, @uref{http://lilypond.org/doc/v2.14/Documentation/web/index#LilyPond-2_002e14_002e0-released_0021-June-6_002c-2011,v2.14}, @miscLink{announce-v2.12,v2.12}, @miscLink{announce-v2.10,v2.10}, @@ -1220,6 +1238,7 @@ Ankündigungen und Neuigkeiten nach Version: @miscLink{ANNOUNCE-0.1,v0.1} Ausführliche Liste der Änderungn nach Version: +@uref{http://lilypond.org/doc/v2.16/Documentation/changes/index.html,v2.16}, @uref{http://lilypond.org/doc/v2.14/Documentation/changes/index.html,v2.14}, @uref{http://lilypond.org/doc/v2.12/Documentation/topdocs/NEWS,v2.12}, @uref{http://lilypond.org/doc/v2.10/Documentation/topdocs/NEWS,v2.10}, @@ -1236,7 +1255,24 @@ Ausführliche Liste der Änderungn nach Version: @divEnd @divClass{column-center-bottom} -@subheading Änderungslog +@subheading Thanks + +Thanks to developers, contributors, bug hunters and suggestions for +@miscLink{THANKS-2.16,v2.16}, +@miscLink{THANKS-2.14,v2.14}, +@miscLink{THANKS-2.12,v2.12}, +@miscLink{THANKS-2.10,v2.10}, +@miscLink{THANKS-2.8,v2.8}, +@miscLink{THANKS-2.6,v2.6}, +@miscLink{THANKS-2.4,v2.4}, +@miscLink{THANKS-2.2,v2.2}, +@miscLink{THANKS-2.0,v2.0}, +@miscLink{THANKS-1.8,v1.8} + +@divEnd + +@divClass{column-center-bottom} +@subheading Änderungslogs Änderungslog für Entwickler nach Version: @miscLink{ChangeLog-2.10,v2.10}, diff --git a/Documentation/de/web/download.itexi b/Documentation/de/web/download.itexi index f88f69d1da..f3974f057a 100644 --- a/Documentation/de/web/download.itexi +++ b/Documentation/de/web/download.itexi @@ -1,13 +1,13 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 + Translation of GIT committish: 5b6ddab894b3065c35c72ef8048b8c6edbe684ac When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes. @end ignore -@c Translators: Till Paala +@c Translators: Till Paala, Michael Gerdau @include included/generating-output.itexi @@ -15,7 +15,7 @@ @warning{LilyPond ist ein @strong{textbasiertes} Notationsprogramm, es ähnelt eher einer Programmiersprache als einem graphischen Programm zum Notensatz. Bevor Sie LilyPond herunterladen, lesen -Sie bitte über unsere @ref{Text-Eingabe}.} +Sie bitte über unsere @ref{Texteingabe}.} @end macro @node Download @@ -26,7 +26,7 @@ Sie bitte über unsere @ref{Text-Eingabe}.} @ifclear web_version @c yes, we want verisonDevel here, since the online links @c for @version won't be up yet! - @heading Downloads for LilyPond @versionDevel + @heading Downloads für LilyPond @versionDevel Links für die stabile Version von LilyPond finden sich auf @uref{http://lilypond.org, lilypond.org} @@ -42,7 +42,7 @@ Links für die stabile Version von LilyPond finden sich auf @divClass{link-headings} @divClass{column-left-top} -@subheading Für Benutzer +@subheading Für Anwender @itemize @@ -77,24 +77,23 @@ für Paketersteller alte Versionen @item @ref{Entwicklung}: -die letze unstabile Version +die aktuelle instabile Version @end itemize @divEnd @divEnd - -@divClass{column-center-bottom} +@divClass{column-center-middle-color2} @subheading Programmlizenz -LilyPond wird under der -@ref{GPL, GNU General Public License} publiziert. +LilyPond wird unter der +@ref{GPL, GNU General Public License} veröffentlicht. @divEnd -@divClass{color1} +@divClass{column-center-bottom} @subheading Sponsoren @@ -105,10 +104,14 @@ Bandbreite bezahlen. @sourceimage{VTlogo_ITF,,,} @sourceimage{lao_banner_06_on_white_demo,,,} +@divEnd + +@divClass{column-center-bottom} @subheading Legales @divClass{legal} -Alle Logos und Produktabbildungen erkennen Copyright und Trademark an. +Alle Logos und Produktabbildungen werden unter ausdrücklicher Anerkennug des Copyright und Trademark +der Rechteinhaber verwendet. @logoLegalLinux @@ -146,12 +149,11 @@ Alle Logos und Produktabbildungen erkennen Copyright und Trademark an. @subheading Generische Pakete oder distributionsabhängige Pakete? Viele Distributionen enthalten LilyPond in ihrem normalen -Paket-System. Diese Versionen sind einfacher zu installieren und -auch wieder zu entfernen als die generischen Pakete, aber sie können -älter sein. Wenn Sie unsere generischen Pakete benutzen wollen, -entfernen Sie zunächst die offizielle Version aus ihrem System mit -dem Paketmanager Ihrer Distribution. Lesen Sie die Dokumentation -Ihrer Distribution, wie Sie den Paketmanager einsetzen. +Packet-System. Oft sind diese Versionen @emph{erheblich} älter, als die +das aktuelle stabile Version. Diese alten Packete sind meist einfacher zu installieren und +auch wieder zu entfernen, jedoch empfehlen wir im Falle von veralteten Packeten @emph{dringend} +die Verwendung unserer generischen Packete. Achten sie in dem Falle auch darauf, +daß ihr LilyPond Editor die korrekte Version verwendet. Siehe auch @ref{Leichteres Editieren}. @divEnd @@ -171,12 +173,12 @@ Ihrer Distribution, wie Sie den Paketmanager einsetzen. @ifset web_version @downloadStableLinuxNormal @end ifset - -(Wenn Sie Zweifel haben, dann diese) +32bit Systeme. @item @sourceimage{logo-linux,,,} @downloadStableLinuxBig +64bit Systeme. @item @sourceimage{logo-linux,,,} @@ -185,10 +187,12 @@ Ihrer Distribution, wie Sie den Paketmanager einsetzen. @item @sourceimage{logo-freebsd,,,} @downloadStableFreeBSDNormal +32bit Systeme. @item @sourceimage{logo-freebsd,,,} @downloadStableFreeBSDBig +64bit Systeme. @end itemize @@ -222,58 +226,20 @@ sh lilypond-@versionStable{}-OS-TYPE.sh --help - @divClass{column-right-top} -@subheading Eine Datei kompilieren +@subheading Eine Datei übersetzen @lilypadCommandLine @divEnd -@divClass{column-left-top} -@subheading Distributionspezifische Pakete - -Benutzen Sie bitte den Paketmanager Ihrer Distribution um diese -Versionen zu installieren oder zu aktualisieren. - -@itemize - -@item -@sourceimage{logo-fedora,,,} -@uref{http://koji.fedoraproject.org/koji/packageinfo?packageID=2447, -Fedora: LilyPond 2.14.2} - -@item -@sourceimage{logo-ubuntu,,,} -@uref{http://packages.ubuntu.com/search?keywords=lilypond, -Ubuntu: LilyPond 2.14.2} - -@item -@sourceimage{logo-slackware,,,} -@uref{http://www.johannes-schoepfer.de/lilypond/, -Slackware: LilyPond 2.14.2} - -@item -@sourceimage{logo-debian,,,} -@uref{http://packages.debian.org/search?keywords=lilypond, -Debian: LilyPond 2.12.3} - -@item -@sourceimage{logo-suse,,,} -@uref{http://download.opensuse.org/repositories/openSUSE:/Factory:/Contrib/standard/, -openSUSE: LilyPond 2.12.2} - -@end itemize - -@divEnd - - @divClass{column-center-bottom} @subheading Legales @divClass{legal} -Alle Logos und Produktabbildungen erkennen Copyright und Trademark an. +Alle Logos und Produktabbildungen werden unter ausdrücklicher Anerkennug des Copyright und Trademark +der Rechteinhaber verwendet. @logoLegalLinux @@ -300,12 +266,16 @@ Alle Logos und Produktabbildungen erkennen Copyright und Trademark an. @item @sourceimage{logo-macosx,,,} @downloadStableDarwinNormal -Für MacOS X 10.4 und höher auf Intel-Prozessoren (wenn Sie Zweifel haben, benutzen Sie diese Version). +Für MacOS X 10.4 oder höher auf Intel-Prozessoren (wenn Sie Zweifel haben, +benutzen Sie diese Version). + @item @sourceimage{logo-macosx,,,} @downloadStableDarwinPPC -Für MacOS X 10.4 oder höher auf G3 und G4 Prozessoren (alte Apple-Computer). +Für MacOS X 10.4 oder höher auf G3 und G4 Prozessoren (alte +Apple-Computer). + @end itemize @@ -322,20 +292,11 @@ Entfernen Sie den LilyPond.app-Ordner. @divClass{column-right-top} -@subheading Eine Datei kompilieren - -@lilypadOSX - -@divEnd - - -@divClass{column-left-top} @subheading Benutzung auf der Kommandozeile -@warning{Wenn Sie mit der GUI zufrieden sind, dann ignorieren Sie +@warning{Wenn Sie mit der GUI Hinweisen weiter unten zufrieden sind, dann ignorieren Sie bitte diese Anweisungen.} - @subsubheading MacOS X auf der Kommandozeile Die einfachste Art, lilypond-Skripte auszuführen ist es, eigene @@ -384,7 +345,7 @@ chmod u+x lilypond @item Jetzt müssen Sie das Verzeichnis zu Ihrem Pfad hinzufügen. Verändern (oder erstellen) Sie eine Datei mit dem Namen @code{.profile} in -Ihrem home-Verzeichnis, sodass sie beinhaltet: +Ihrem home-Verzeichnis, sodaß sie beinhaltet: @example export PATH=$PATH:~/bin @@ -397,8 +358,8 @@ Diese Datei sollte mit einer leeren Zeile schließen. @subsubheading Einzelne Skripte aufrufen -Die Skripte -- wie @command{lilypond-book}, @command{convert-ly}, -@command{abc2ly} und auch @command{lilypond} selber -- sind in +Die Skripte --- wie @command{lilypond-book}, @command{convert-ly}, +@command{abc2ly} und auch @command{lilypond} selber --- sind in einer @code{.app}-Datei für MacOS@tie{}X enthalten. Skripte können auch von der Kommandozeile aus aufgerufen werden, @@ -416,11 +377,20 @@ Das gilt auch für alle anderen Skripte in diesem Verzeichnis, wie @divEnd +@divClass{column-center-top} +@subheading Eine Datei übersetzen + +@lilypadOSX + +@divEnd + + @divClass{column-center-bottom} @subheading Legales @divClass{legal} -Alle Logos und Produktabbildungen erkennen Copyright und Trademark an. +Alle Logos und Produktabbildungen werden unter ausdrücklicher Anerkennug des Copyright und Trademark +der Rechteinhaber verwendet. @logoLegalMacOSX @@ -446,7 +416,7 @@ Alle Logos und Produktabbildungen erkennen Copyright und Trademark an. @item @sourceimage{logo-windows,,,} @downloadStableWindows -Für Windows 2000, XP, Vista, and Windows 7. +Für Windows 2000, XP, Vista, Windows 7 und 8. @end itemize @@ -486,17 +456,9 @@ Eintrag LilyPond und wählen die Option Entfernen. Klicken Sie auf @divClass{column-right-top} -@subheading Compiling a file - -@lilypadWindows - -@divEnd - - -@divClass{column-left-top} @subheading Benutzung auf der Kommandozeile -@warning{Wenn Sie mit der GUI zufrieden sind, dann ignorieren Sie +@warning{Wenn Sie mit der GUI Hinweisen weiter unten zufrieden sind, dann ignorieren Sie bitte diese Anweisungen.} @subsubheading Windows auf der Kommandozeile @@ -529,7 +491,7 @@ und klicken Sie auf @qq{OK} um das Fenster zu schließen. @subsubheading Einzelne Programme ausführen -LilyPond-Programme +LilyPond-Programme -- wie lilypond, lilypond-book, convert-ly und so weiter -- können von der Kommandozeile aus aufgerufen werden: @@ -540,11 +502,20 @@ lilypond test.ly @divEnd +@divClass{column-center-top} +@subheading Eine Datei Übersetzen + +@lilypadWindows + +@divEnd + + @divClass{column-center-bottom} @subheading Legales @divClass{legal} -Alle Logos und Produktabbildungen erkennen Copyright und Trademark an. +Alle Logos und Produktabbildungen werden unter ausdrücklicher Anerkennug des Copyright und Trademark +der Rechteinhaber verwendet. @logoLegalWindows diff --git a/Documentation/de/web/introduction.itexi b/Documentation/de/web/introduction.itexi index 2cd0aad330..d037998180 100644 --- a/Documentation/de/web/introduction.itexi +++ b/Documentation/de/web/introduction.itexi @@ -1,13 +1,13 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: e5a609e373eae846857f9a6d70a402a3d42b7d94 + Translation of GIT committish: 5b6ddab894b3065c35c72ef8048b8c6edbe684ac When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes. @end ignore -@c Translators: Till Paala +@c Translators: Till Paala, Michael Gerdau @node Einleitung @unnumbered Einleitung @@ -18,14 +18,19 @@ @imageFloat{flat-design,png,right} -LilyPond entstand, als zwei Musiker über das tote und unbeseelte Aussehen von computererstellten Notendrucken hinausgehen wollten. Alle Musiker wollen schöne Noten lesen, warum also sollten Programmierer kein Programm schreiben können, das schönere Orchesterstimmen setzen kann? +LilyPond entstand, als zwei Musiker über das tote und unbeseelte Aussehen +von computererstellten Notendrucken hinausgehen wollten. Musiker wollen +schöne Noten lesen, warum also sollten Programmierer kein Programm schreiben +können, das schönere Orchesterstimmen setzen kann? + +Das Resultat ist ein Programm, das schönen Notensatz erzeugt und dabei +der Tradition und dem ganzen Erfahrungsschatz des klassischen Notensatzes folgt. +Es kümmert sich programmatisch um alle Feinheiten des Layouts, damit +Komponisten, Setzer und Verleger sich auf die @emph{Musik} konzentrieren +können. Musiker sollen sich auf das @emph{Spielen} und nicht das @emph{Lesen} +der Musik konzentrieren. + -Das Resultat ist ein System, welches Musiker von den Details des -Notensatzlayouts befreit, sodass sie sich darauf konzentrieren -können, Musik zu machen. LilyPond arbeitet mit ihnen zusammen, -um Notensatz professioneller Qualität zu erstellen, welche nach -dem ganzen Erfahrungsschatz und den Traditionen des klassischen -Notensatzes gesetzt werden. @divEnd @divClass{link-headings} @@ -52,7 +57,6 @@ Notensatzes gesetzt werden. @divClass{column-right-top} @subheading Lilypond im Einsatz - @itemize @item @@ -66,11 +70,10 @@ Notensatzes gesetzt werden. @divClass{column-center-bottom} @subheading Wie LilyPond funktioniert - @itemize @item -@ref{Text-Eingabe}: Ihr schreibt Noten als @emph{Text}?! +@ref{Texteingabe}: Ihr schreibt Noten als @emph{Text}?! @item @ref{Leichteres Editieren}: Andere Möglichkeiten, mit LilyPond zu arbeiten. @@ -91,7 +94,7 @@ Notensatzes gesetzt werden. * Hintergrund:: Computational aesthetics. * Produktionen:: Real-life use of LilyPond. * Rezensionen:: What do people say about it? -* Text-Eingabe:: You write music as text?! +* Texteingabe:: You write music as text?! * Leichteres Editieren:: Andere Wege, mit LilyPond zu arbeiten. @end menu @divEnd @@ -101,13 +104,10 @@ Notensatzes gesetzt werden. @node Eigenschaften @unnumberedsec Eigenschaften @translationof Features - - - @divClass{column-center-top} -@subheading Eleganz -@subsubheading Hervorragender klassischer Notensatz + +@subheading Hervorragender klassischer Notensatz @imageFloat{flat-design,png,right} @@ -123,38 +123,69 @@ elegante Aussehen wie die besten gestochenen klassischen Partituren. Dazu mehr in unserem @ref{Aufsatz}. -@subsubheading Effektive Layout-Einstellungen +@divEnd -Verbringen Sie weniger Zeit damit, den Notensatz nachträglich zu -verändern: LilyPond formatiert die Noten von Anfang an richtig. -Die Platzaufteilung und die richtigen Zeilen- -und Seitenumbrüche werden von selber errechnet, um ein dichtes und gleichmäßiges -Notenbild zu erzeugen. Zusammenstöße zwischen Gesangstext, Noten -und Akkorden werden aufgelöst und alle Bögen sind automatisch -richtig gekrümmt! +@divClass{column-center-top} +@subheading Texteingabe + +@subsubheading Alles ist explizit + +LilyPond verarbeitet Texteingaben, die alle Informationen bzgl. des +@emph{Inhalts} ihrer Partitur enthalten und kann leicht durch Menschen +oder andere Programme gelesen werden. Es gibt keine in irgendwelchen +Menus versteckten Eigenschaften und kein binäres Dateiformat. + +Weitere Informationen zu diesem Konzept unter @ref{Texteingabe}. + + +@subsubheading Optimierungen sind robust und nachvollziehbar + +Wenn Sie irgendwelche Layoutänderungen vornehmen, so sind diese +Optimierungen für jeden in der Eingabedatei sichtbar und damit +sind diese Anpassungen jederzeit nachvollziehbar. Versehentlich +eingefügte Fehler können so leicht rückgängig gemacht werden, ohne +dabei auf die Gnade einer @emph{Undo} Funktion angewiesen zu sein. + + +@subsubheading Textdateien sind wenig fehleranfällig und zukunftssicher + +Textdateien sind in Bezug auf Datenverfälschung ausgesprochen robust. +Dazu sind sie direkt lesbar und daher jederzeit verständlich, auch +ohne die Verwendung des Programms, mit dem sie mal erzeugt wurden. + + +@subsubheading Setzen Sie Versionskontrolle zur Verwaltung ihrer Partituren ein + +Textdateien eignen sich hervorragend zur Verwaltung durch ein Versionsmanagement System. +Machen Sie das und erfahren unendliches und selektives Undo/Redo und erhalten die +vollständige Änderungshistorie ihrer Werke. Versionskontrolle erleichtert +dazu neue (kollaborative) Arbeitsweisen. @divEnd -@divClass{color2} -@subheading Einfach in der Benutzung +@divClass{column-center-top} +@subheading Benutzbarkeit @imageFloat{lilypond-book,png,right} -@subsubheading Text-basierte Eingabe +@subsubheading Effektive Layout Einstellungen + +Verbringen Sie weniger Zeit damit, den Notensatz nachträglich zu +optimieren; LilyPond formatiert die Noten von Anfang an richtig. +Die Platzaufteilung und die richtigen Zeilen- +und Seitenumbrüche werden von selber errechnet, um ein dichtes und gleichmäßiges +Notenbild zu erzeugen. Zusammenstöße zwischen Gesangstext, Noten +und Akkorden werden aufgelöst und alle Bögen sind automatisch +richtig gekrümmt! -LilyPond nimmt ASCII-Texteingabe, welche Sie mit Ihrem -Lieblingstexteditor erstellen können, schnell und bequem. Die Eingabe enthält alle -Information, sodass man keine komplexen Befehlssequenzen erinnern -muss. Speichern Sie die Eingabe einfach in einer Textdatei -für spätere Verwendung. @subsubheading Kombinieren Sie Noten und Text Sie können Notenfragmente in einen Text einfügen, ohne Bilder auszuschneiden und einzufügen. Mit LilyPond lassen sich Noten in @LaTeX{} oder HTML -nahtlos einfügen und mit OOoLilyPond auch in OpenOffice.org-Dokumente -integrieren. Es gibt auch Plugins, mit denen LilyPond-Code für verschiedene +nahtlos einfügen und mit @uref{http://extensions.services.openoffice.org/en/project/OOoLilyPond,OOoLilypond} auch in OpenOffice.org und LibreOffice Dokumente +integrieren. Es gibt auch Plugins, mit denen LilyPond Code für verschiedene Blogs und Wikis ermöglicht wird, sodass auch eine Zusammenarbeit online möglich wird. @@ -163,40 +194,76 @@ möglich wird. Text-basierte Eingabe ermöglicht das Schreiben von Partituren auch für Leute mit schweren physischen Behinderungen. Benutzer mit motorischen Behinderungen, die Tastatur oder Maus nicht benutzen -können, können mit einem Spracherkennungsprogramm LilyPond-Dateien +können, können mit einem Spracherkennungsprogramm LilyPond Dateien bearbeiten. Sogar vollkommen blinde Benutzer können mit Screenreader LilyPond-Dateien erstellen -- vollkommen unmöglich mit graphisch-basierten Notationsprogrammen. +@subsubheading Editor Vielfalt -@subsubheading Erweiterbares Design +Diverse Entwickler, selbst aktive LilyPond Anwender, haben spezielle Werkzeuge entwickelt +um das Editieren von LilyPond Dateien schneller und effizienter zu gestalten; Sie +sind nicht auf ein bestimmter Benutzerinterface festgelegt sondern können aus einer +Vielzahl unterschiedlicher Werkzeuge wählen. So können sie daheim einen LilyPond Editor +mit allem drum und dran verwenden und unterwegs den Minieditor ihres Mobiltelefons. +Einige Beispiele finden Sie unter @ref{Leichteres Editieren}. +@c TODO: Change this when the new pages have been written and pushed -Alle Einstellungen können verändert werden, um Ihrem persönlichen -typographischen Geschmack zu entsprechen. Wenn Ihnen das immer -noch nicht reicht, gibt es immer noch die eingebaute Scriptsprache -@qq{Scheme}, ein Dialekt des mächtigen LISP. Einstellungen, Variablen -und Funktionen sind alle in einem ausführlichen Programmhandbuch -dokumentiert. @divEnd -@divClass{color3} +@divClass{column-center-top} -@subheading Umgebung +@subheading Erweiterbares Design -@imageFloat{frescobaldi-lilypond-editor-small,png,right} +@subsubheading Einfache Verwaltung von Formatvorlagen -@subsubheading Freie Software +Alle Layout Einstellungen an ihre persönlichen typographischen Vorstellungen +angepasst werden. Sie können sehr einfach Formatvorlagen schreiben, die +buchstäblich jede von LilyPond's Voreinstellungen verändern. So erstellte +Formatvorlagen sind ihrerseits wieder Textdateien und können jeweils in einer +eigenen Datei abgelegt werden. Das ermöglicht ein extrem einfaches Wechseln +zwischen vollkommen unterschiedlichem Notensatz einfach durch Austausch dieser +Formatvorlagen. +Sie möchten die Partitur auf A4 Papier drucken sowie die Noten mit einem Beamer +ein System pro Seite projezieren? LilyPond's Layout Engine erzeugt beides aus +ein und derselben Eingabedatei. -LilyPond kann ohne jede Bezahlung heruntergeladen werden! -Wirklich, es ist vollkommen frei! Holen Sie es sich von der -Download-Seite. +@subsubheading Fügen Sie eigene Funktionen hinzu + +Wenn das noch nicht reichen sollte, dann gibt es immer noch die eingebaute +Skriptsprache Scheme. Mit ihr kann auf LilyPond's Layout Engine in exakt +der gleichen Weise zugegriffen werden, wie LilyPond es intern selbst tut. +Es ist damit ein @emph{extrem} mächtiges Werkzeug. +Einstellungen, Variablen und Funktionen sind alle im umfangreichen +Programm Referenz Handbuch dokumentiert. + +@subsubheading Verarbeiten Sie Partituren programmgesteuert + +LilyPond Eingabedateien können von externen Programmen oder Skripten editiert oder +sogar in Gänze erzeugt werden. Das kann z.B. für algorithmisches Komponieren genutzt werden. +Oder Sie Verarbeiten den musikalischen Inhalt zu Analysezwecke oder verwalten musikalische +Fragmente in einer Datenbank. Die Möglichkeiten sind nur durch ihre Phantasie begrenzt. + + +@subsubheading Entwickeln Sie neue Werkzeuge unter Verwendung von LilyPond + +LilyPond is kein monolithisches GUI Programm sondern ein Kommandozeilen Progrmm. +Daher kann es auch von anderen Programmen verwendet werden. So kann z.B. eine +Webanwendung mit LilyPond's Notensatzfähikeiten erweitert werden. Tatsächlich +existieren verschiedene Online Werkzeuge, die LiylPond verwenden. + +@c (TBD: Add a link to the new @ref{Applications} page. + + +@divEnd + +@divClass{column-center-top} + +@subheading Umgebung + +@imageFloat{frescobaldi-lilypond-editor-small,png,right} -Es handelt sich um Freie Software, welche zusammen mit dem -Quellcode zur Verfügung gestellt wird -- mit der Erlaubnis, zu -verändern und zu kopieren. Stören Sie sich an einem Fehler oder -brauchen Sie dringend eine neue Funktion? Schreiben Sie sie -einfach selber, oder bezahlen Sie jemanden, der es für Sie tut. @subsubheading Hervorragende Unterstützung @@ -209,21 +276,26 @@ einem deutschsprachigen Forum beantwortet, während das Entwicklungsteam es ermöglicht, dass Probleme schnell gelöst werden. -@subsubheading Erweiterte Editoren +@subsubheading Freie Software + +LilyPond kann ohne jede Bezahlung heruntergeladen werden! +Wirklich, es ist vollkommen frei! Holen Sie es sich von der +Download-Seite. -Einige Entwickler, die selber aktive LilyPond-Benutzer sind, haben auch -spezielle Werkzeuge geschrieben, die dabei helfen sollen, LilyPond-Dateien -schneller und effektiver zu erstellen und zu editieren. Für einige -Beispiele siehe @ref{Leichteres Editieren}. +Es handelt sich um Freie Software, welche zusammen mit dem +Quellcode zur Verfügung gestellt wird -- mit der Erlaubnis, zu +verändern und zu kopieren. Stören Sie sich an einem Fehler oder +brauchen Sie dringend eine neue Funktion? Schreiben Sie sie +einfach selber, oder bezahlen Sie jemanden, der es für Sie tut. @divEnd @divClass{column-center-bottom} @subheading Was jetzt? -Sind Sie noch nicht überzeugt? Dann schauen Sie sich einige konkrete -@ref{Beispiele} an. Wenn Sie sich schon entschlossen haben, +Sie sind noch nicht überzeugt? Dann schauen Sie sich einige konkrete +@ref{Beispiele} an. Wenn Sie sich bereits entschlossen haben, LilyPond auszuprobieren, lesen Sie zuerst über unsere -@ref{Text-Eingabe}. +@ref{Texteingabe}. @divEnd @@ -232,19 +304,26 @@ LilyPond auszuprobieren, lesen Sie zuerst über unsere @unnumberedsec Beispiele @translationof Examples -LilyPond ist ist ein sehr mächtiges und flexibles Werkzeug, dass Notensatz der unterschiedlichsten Art handhaben kann. Sehen Sie sich unsere Beispiele an und lassen Sie sich inspirieren! +@divClass{column-center-top} -@newsItem -@subsubheading Klassische Musik +@subheading Beautiful examples + +LilyPond ist ist ein sehr mächtiges und flexibles Werkzeug, dass Notensatz +der unterschiedlichsten Art handhaben kann. Sehen Sie sich unsere Beispiele an und lassen Sie sich inspirieren! + +@divEnd + +@divClass{column-center-middle-color2} +@subheading Klassische Musik Dieses Orgelpräludium von J. S. Bach ist ein recht typisches Notensatzprojekt mit LilyPond. @exampleImage{bach-bwv610} -@newsEnd +@divEnd -@newsItem -@subsubheading Komplexe Notation +@divClass{column-center-middle-color2} +@subheading Komplexe Notation Dieses Beispiel aus @emph{Goyescas} von Enrique Granados zeigt einige der fortgeschrittenen Notensatzfunktionen, unter Anderem @@ -252,31 +331,31 @@ Balken zwischen Notenzeilen, Hälse über die Notenzeilen hinweg und Stimmfolgestriche. @exampleImage{granados} -@newsEnd +@divEnd -@newsItem -@subsubheading Alte Musik +@divClass{column-center-middle-color2} +@subheading Alte Musik LilyPond hat Unterstützung für verschiedene Notationsarten der Alten Musik, wie etwa dieser Abschnitt eines Gregorianischen Chorals. @exampleImage{ancient-headword} -@newsEnd +@divEnd -@newsItem -@subsubheading Moderne Musik +@divClass{column-center-middle-color2} +@subheading Moderne Musik Zeitgenössische Komponisten werden feststellen, dass LilyPond sich sehr gut dazu eignet, außergewöhnliche Notation darzustellen. Hier ein Ausschnitt aus @emph{Čáry} von Trevor Bača für Bassflöte Solo. @exampleImage{cary} -@newsEnd +@divEnd -@newsItem -@subsubheading Effiziente, flexible Erstellung von Aufführungsmaterial +@divClass{column-center-middle-color2} +@subheading Effiziente, flexible Erstellung von Aufführungsmaterial Verschiedenes Aufführungsmaterial kann aus dem selben Quellcode erstellt werden. Hier ein Ausschnitt aus Händels @emph{Giulio @@ -289,10 +368,10 @@ Nicolas Sceaux}, als Partitur, Klavierauszug und eine Geigenstimme. @exampleImage{sesto-violin} -@newsEnd +@divEnd -@newsItem -@subsubheading Tabulatur +@divClass{column-center-middle-color2} +@subheading Tabulatur LilyPond unterstützt Tabulatur-Notation, die an ein beliebiges Instrument angepasst werden kann, dass Tabulatur-Notation einsetzt. @@ -300,20 +379,29 @@ Das Tabulatur-System wird automatisch anhand der Noten erstellt, die man für das fünflinige Notensystem notiert hat. @exampleImage{tab-example} -@newsEnd +@divEnd -@newsItem -@subsubheading Schenker-Graphen +@divClass{column-center-middle-color2} +@subheading Schenker Graphen Das Standardnotenbild kann sehr stark verändert werden. Hier eine eindrucksvolle Schenker-Analyse, von Kris Schaffer mit LilyPond erstellt für einen Artikel im @uref{http://www.linuxjournal.com/article/8364 , Linux Journal}. Die Farben wurden zur Verdeutlichung hinzugefügt. @exampleImage{bach-schenker} -@newsEnd +@divEnd + +@divClass{column-center-middle-color2} +@subheading Individuelle Ausgabe -@newsItem -@subsubheading Vokalmusik +Ein kurzer Auszug aus Stockhausen's Klavierstück II zeigt die +Fähigkeiten von Lilypond eine individuelle Ausgabe zu erzeugen. + +@exampleImage{Stockhausen_Klavierstueck2} +@divEnd + +@divClass{column-center-middle-color2} +@subheading Vokalmusik LilyPond eignet sich hervorragend, um Vokalmusik aller Arten zu notieren, von Hymnen bis zu einer Oper. Hier eine @@ -326,20 +414,20 @@ mit Schlüsseln im Vaticana-Stil, durchgestrichene Notenhälse für plicierte Noten und Ligaturklammern über bestimmten Notengruppen. @exampleImage{aucun-snippet} -@newsEnd +@divEnd -@newsItem -@subsubheading Anwendung für die Musikerziehung +@divClass{column-center-middle-color2} +@subheading Anwendung in der Musikerziehung LilyPond eignet sich perfekt für eine Anwendung in der Musikerziehung. Hier ein Beispiel einer einfachen Kontrapunktaufgabe. @exampleImage{theory} -@newsEnd +@divEnd -@newsItem -@subsubheading Popmusik +@divClass{column-center-middle-color2} +@subheading Popmusik Es ist einfach, ein Liedblatt mit Melodie, Text und Akkorden sowie Griffsymbolen zu erstellen. In diesem Beispiel sind einige der @@ -347,9 +435,9 @@ vordefinierten Griffdiagramme eingesetzt, aber sie können vollständig angepasst werden, um fast jeder Situation gerecht zu werden. @exampleImage{chart} -@newsEnd +@divEnd -@newsItem +@divClass{column-center-middle-color2} @subsubheading Große Projekte LilyPond eignet sich großartig für große Projekte wie Opern oder Werke für großes Symphonieorchester. Zusätzlich ermöglicht die @@ -357,8 +445,7 @@ texbasierte Eingabe größere Barrierefreiheit -- das folgende Beispiel wurde von Hu Haipeng, einem blinden Komponisten, zur Verfügung gestellt. @exampleImage{orchestra} -@newsEnd - +@divEnd @divClass{column-center-bottom} @subheading Was jetzt? @@ -366,7 +453,7 @@ Beispiel wurde von Hu Haipeng, einem blinden Komponisten, zur Verfügung gestell Noch immer nicht überzeugt? LilyPond ist Open Source und garantiert Ihnen @ref{Freiheit}. Wenn Sie sich schon entschlossen haben, LilyPond auszuprobieren, lesen zuerst über unsere -@ref{Text-Eingabe}. +@ref{Texteingabe}. @divEnd @@ -388,9 +475,9 @@ ein Programm zum erstellen schönen Notensatzes zu erwerben. @c @divClass{column-left-top} -@divClass{color2} +@divClass{column-center-middle-color2} @divClass{keep-bullets} -@subheading Was für Nutzen haben die Benutzer? +@subheading Was für einen Nutzen haben die Anwender? @itemize @@ -434,7 +521,7 @@ oder zu kopieren. @c @divClass{column-right-top} -@divClass{color3} +@divClass{column-center-middle-color3} @divClass{keep-bullets} @subheading Warum @qq{geben} die Entwickler von LilyPond ihre Arbeit umsonst her? @@ -489,7 +576,7 @@ Noch immer nicht überzeugt? Lesen Sie unseren ausführlichen Aufsatz über unsere Notensatzphilosophie in @ref{Hintergrund}. Wenn Sie sich schon entschlossen haben, LilyPond auszuprobieren, lesen zuerst über unsere -@ref{Text-Eingabe}. +@ref{Texteingabe}. @divEnd @@ -498,15 +585,17 @@ haben, LilyPond auszuprobieren, lesen zuerst über unsere @translationof Background @divClass{column-center-top} -@subheading Aufzatz zu den Hintergründen +@subheading Aufsatz zu den Hintergründen Wir haben einen ausführlichen Aufsatz geschrieben, der die Computerästhetik beschreibt: die Kunst, Schönheit mit dem Computer zu erstellen. -Wenn Sie nur eine kurze Einführung in LilyPond suchen, ist der -Aufsatz wahrscheinlich zu viel Material für Sie. Wenn Sie ihn -jetzt lesen wollen, gehen sie zu @ref{Aufsatz}. +Darin beschreiben wir ausführlich unsere grundlegenden Ideen. Wegen seines +Umfangs liegt er als eigenständiges @q{Handbuch} vor. Wenn Sie ihn +jetzt lesen wollen, gehen sie zu @ref{Aufsatz}. Wenn Sie indessen lediglich +an einer kurzen Einführung in LilyPond interessiert sein sollten, +dann können sie das auch auf später verschieben. @divEnd @divClass{column-center-bottom} @@ -516,7 +605,7 @@ Noch immer nicht überzeugt? Lesen Sie über einige der @ref{Productions} unserer Benutzer und schauen Sie sich die Noten an. Wenn Sie sich schon entschlossen haben, LilyPond auszuprobieren, lesen zuerst über unsere -@ref{Text-Eingabe}. +@ref{Texteingabe}. @divEnd @@ -524,6 +613,16 @@ haben, LilyPond auszuprobieren, lesen zuerst über unsere @unnumberedsec Produktionen @translationof Productions +@divClass{column-left-top} + +@subheading Produktionen die LilyPond verwenden + +Hier lesen Sie von Leuten, die LilyPond in ihren realen Produktionen +einsetzen, sei es für Aufführungen ihrer Musik oder zur Erzeugung +der druckreifen Veröffentlichungen. + +@divEnd + @divClass{column-left-top} @subheading Konzerte @@ -534,10 +633,52 @@ Welt eingesetzt. Einige Highlights: @itemize @item -Mussorgskijs @emph{Bilder einer Ausstellung}, neu orchestriert und +@uref{http://www.aurelienbello.com/,Aurélien Bello} hat Richard Strauss's @emph{Der Rosenkavalier} +für vier Sänger und dreizehnstimmiges Kammerorchester arrangiert. Hierbei handelt es +sich um eine Auftragsarbeit der Berliner Philharmoniker, deren Mitglieder dieses Werk am +@uref{http://www.festspielhaus.de/veranstaltung/der-kleine-rosenkavalier-02-04-2015-1100/,2. und 6. April 2015} +im Festspielhaus Baden-Baden sowie am +@uref{http://www.berliner-philharmoniker.de/konzerte/kalender/details/21070/,26.April 2015} +in der @emph{Philharmonie (großer Saal)} Berlin zur Auführung brachten. Wir sind hocherfreut. +daß derart hochrangige Musiker aus mit LilyPond gesetzten Noten spielen -- uns wurde +berichtet, sie sind mit den Noten sehr zufrieden. + +Aurélien hat ebenfalls @emph{Der Ring des Nibelungen} von Richard Wagner +zu einer +@uref{http://www.rsb-online.de/content/konzerte/wagnerzyklus-10-13/wagner-fuer-kinder/index_ger.html,100-minütigen Fassung für Kinder}. +neu orchestriert. Geschrieben für ein Standard Sinfonie Orchester jedoch mit verkleinertem Sängerensemble +wurde das Werk vom @emph{Radio-Sinfonieorchester Berlin} im April 2014 im Atze Musiktheater Berlin aufgeführt. +Der Dirigent war Heiko Matthias Förster. + +@item +Joe Smeets hat die Noten für das Kinderbuch @emph{Zing Mee} +(@emph{Sing' mit}) von Annie M.G., erschienen bei Querido -- ISBN +9789045106205: +@uref{http://www.queridokinderenjeugdboeken.nl/web/Boek.htm?dbid=18954&typeofpage=134707, www.queridokinderenjeugdboeken.nl} gesetzt; +Chornoten für die Holländische Übersetzung von Benjamin Britten's +@emph{Saint Nicolas}, aufgeführt vom @emph{Muziektheater Hollands Diep} in +2011; +@uref{http://www.muziektheaterhollandsdiep.nl/nl/voorstellingen/sint_nicolaas_leeft, www.muziektheaterhollandsdiep.nl}. +Er hat ebenfalls die Partitur und Einzelstimmen für ein Arrangement von +Mussorgsk’s @emph{Boris Godounov} für Bläserquartett, Klavier und Schlagzeug verfasst. +Es wurde ebenfalls durch das @emph{Muziektheater Hollands Diep} in 2014 aufgeführt. + +@item +Eine kritische Fassung von Tommaso Traetta's @emph{Enea nel Lazio (1760)}, +Opernzyklus in vier Teilen, Libretto von Vittorio Amedeo Cigna-Santi: +@uref{http://www.academia.edu/1987651/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_1_4_, Teil Eins} +@uref{http://www.academia.edu/1994533/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_2_4_, Teil Zwei} +@uref{http://www.academia.edu/1994558/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_3_4_, Teil Drei} +@uref{http://www.academia.edu/1996242/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_4_4_, Teil Vier} +Verfasst von +@uref{http://unito.academia.edu/LucaRossettoCasel, Luca Rossetto Casel} +für seine Doktorarbeit. + +@item +Mussorgskis @emph{Bilder einer Ausstellung}, neu orchestriert und dirigiert von @uref{http://www.aurelienbello.com/,Aurélien Bello} mit der @uref{http://www.junge-philharmonie-brandenburg.de/,Jungen Philharmonie Brandenburg} -am 10. Oktober 2011 und als Wiederholung am 15.--16. April 2012. +am 10. Oktober 2011 und als Wiederholung am 15.-16. April 2012. @item @uref{http://www.kierenmacmillan.info/, Kieren MacMillan}, Komponist und @@ -550,11 +691,10 @@ Chrysalis Duo}, @emph{thrafsmata}aufgeführt im Juli 2011 vom @uref{http://www.pnme.org/CurrentSeason/PreviousSeasons.html, Pittsburgh New Music Ensemble}. - @item @emph{Anonymous Student Compliment or Complaint}, von @uref{http://www.mikesolomon.org, Mike Solomon}, Gewinner des -@uref{http://leftcoastensemble.org/contest, 2011 Left Coast Composition Contest}, +@uref{http://leftcoastensemble.org, 2011 Left Coast Composition Contest}, an dem 172 Kompositionen aus 22 Ländern teilgenommen haben. Andere Werke bspw.: Norman (age 1) für Soloklarinette, aufgeührt an auf dem Electroacoustic Music Festival (FEMF) der @@ -569,8 +709,8 @@ Siehe @uref{http://www.ascarlatti2010.net, Alessandro Scarlatti 2010}, zur Feier des 350. Geburtstages des Komponisten. @item -@uref{http://www.mercurybaroque.org/02/02109.aspx, Mercury Baroque}s -Aufführung von Lullys @emph{Armide} am 15--16 Mai 2009 in Houston, +@uref{http://www.mercurybaroque.org, Mercury Baroque}s +Aufführung von Lullys @emph{Armide} am 15.-16. Mai 2009 in Houston, Texas (Notensatz von @uref{http://nicolas.sceaux.free.fr/, Nicolas Sceaux}). @@ -578,7 +718,8 @@ Nicolas Sceaux}). Instrumentale Ausschnitte von Rameaus @emph{Hippolyte et Aricie} in der St. James Church in Manhattan am 8. Mai 2009 von Frederick Renz und seinem Ensemble @uref{http://www.earlymusicny.org/, -Early Music New York} (Notensatz von Nicolas Sceaux). +Early Music New York} (Notensatz von +@uref{http://nicolas.sceaux.free.fr/, Nicolas Sceaux}). @item @emph{Affaire étrangère}, eine Oper von @@ -614,13 +755,12 @@ Klaviatur, die anzeigt, welche Tasten gedrückt werden müssen, um Anfängern beim Notenlesen zu helfen. @item -@uref{http://www.adoromusicpub.com/, Adoro Music Publishing}, +@uref{https://twitter.com/adoromusic, Adoro Music Publishing}, qualitativ hochwertige Partituren von Kirchenmusik, sowohl zum direkten Download als auch auf Papier erhältlich. @item -@uref{http://shadylane.fr/, The Shady Lane -Publishing}, +@uref{http://shadylane.fr/, The Shady Lane Publishing}, ein @qq{Mikro-Notenverlag}, der es sich zum Ziel gesetzt hat, eine neue Musikökonomie zu unterstützen, die den Musikern und Musikliebhabern näher steht. @@ -631,14 +771,15 @@ Musikliebhabern näher steht. @divEnd +@contactUsAbout{concerts or sheet music} @divClass{column-center-bottom} @subheading Was jetzt? -Immer noch nicht überzeugt?  Lesen Sie einige der @ref{Rezensionen} +Immer noch nicht überzeugt? Lesen Sie einige der @ref{Rezensionen} unserer Benutzer. Wenn Sie sich schon entschlossen haben, LilyPond auszuprobieren, lesen zuerst über unsere -@ref{Text-Eingabe}. +@ref{Texteingabe}. @divEnd @c TRANSLATORS, so far it's mostly from @@ -648,6 +789,12 @@ haben, LilyPond auszuprobieren, lesen zuerst über unsere @unnumberedsec Rezensionen @translationof Reviews +@divClass{column-center-top} +@subheading Was sagen Andere über LilyPond? + +@divEnd + + @divClass{column-left-top} @subheading Publizierte Artikel @@ -659,7 +806,7 @@ April 2011 @uref{http://www.linux-magazine.com,Linux Magazine} publiziert einen Atikel mit dem Titel -@uref{http://www.linux-magazine.com/w3/issue/126/088-090_projects.pdf, +@uref{http://www.linux-magazine.com/content/download/61706/482546/version/1/file/088-090_projects.pdf, Projects on the Move}. Es es eine Einleitung zu MuseScore, LilyPond and Chordii. Die Authorin Carla Schroder schreibt @qq{LilyPond wird von der Kommandozeile aus gesteuert, aber lassen Sie sich nicht davon @@ -694,7 +841,7 @@ Software zur Unterhaltung ihrer Bibliotheken unterhalten. @item June 2009 -In einem @uref{http://news.lilynet.net/Free-Music-Now, Artikel} +In einem @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/Free-Music-Now, Artikel} in der Jahreszeitschrift der @emph{National Conservatory Parent Association} erklärt der französischer Komponist und LilyPond-Mitarbeiter Valentin Villenave wie freie Lizenzen und insbesondere mit LilyPond @@ -755,12 +902,12 @@ Ein französischer Artikel über LilyPond Version 2.6 erscheint auf @item Oktober 2004 -Die Editoren von Computer!Totaal, einer holländischen +Die Redakteure von Computer!Totaal, einer holländischen Computerzeitschrift, @uref{http://lilypond.org/website/pdf/computer-totaal.jpeg, beschreiben LilyPond} in der Ausgabe Oktober 2004 als: @qq{Wunderbare -freie (Open Source) Software [..] Die Partituren von LilyPond -sind ausnahmslos schön [..] ein sehr mächtiges System das fast alles +freie (Open Source) Software [@dots{}] Die Partituren von LilyPond +sind ausnahmslos schön [@dots{}] ein sehr mächtiges System das fast alles tun kann.} @item @@ -787,7 +934,7 @@ Februar 2004 Der Jazz-Sänger Gail Selkirk schreibt über @uref{http://www.songbirdofswing.com/editorial_page/lilypond/, -Diving into LilyPond}. @qq{... man kann Liedblätter oder volle +Diving into LilyPond}. @qq{@dots{} man kann Liedblätter oder volle Orchsterpartituren erstellen, und das Ergebnis kann einen erstaunen.} @uref{http://www.computermusic.co.uk/, Computer Music Special}, @@ -820,7 +967,7 @@ Nummer CMS06. @qq{Auch wenn ich [LilyPond] noch nicht sehr gut kenne, bin ich schon außerordentlich beeindruckt. Ich habe das Programm benutzt, um eine Motette von Josquin Desprez - in Mensuralnotation zu notieren. Es steht außer Frage, dass LilyPond in + in Mensuralnotation zu notieren. Es steht außer Frage, dass LilyPond in der Geschwindigkeit, Einfachheit in der Benutzung und Notensatz alle anderen Notationsprogramme leicht überholt.} @divEnd @@ -844,10 +991,10 @@ Nummer CMS06. Arbeit. Ich habe noch nie etwas gesehen, das dem Satz nahekommt, den ich mit LilyPond erhalte. Ich bin vollkommen überzeugt, dass meine Publikationsanforderungen über alle Erwartungen erfüllt werden, - da ich dieses Programm verwenden kann. [...] sozusagen unveränderter - Notensatz von LilyPond [...] sieht besser aus als alle @qq{professionellen} + da ich dieses Programm verwenden kann. [@dots{}] sozusagen unveränderter + Notensatz von LilyPond [@dots{}] sieht besser aus als alle @qq{professionellen} Publikationen der letzten Zeit, mit denen ich ihn verglichen habe (so ungefähr - alle Warner Bros.-Noten und sogar viele der @qq{traditionellen Notenhäuser}). [...] + alle Warner Bros.-Noten und sogar viele der @qq{traditionellen Notenhäuser}). [@dots{}] } @qq{Das sollen erstmal Finale/Sibelius/Igor/usw. erreichen!!!!} @@ -862,7 +1009,7 @@ Nummer CMS06. @divClass{testimonial-item} -@subsubheading Chris Snyder, @uref{http://www.adoromusicpub.com/, Adoro Music Publishing} +@subsubheading Chris Snyder, @uref{https://twitter.com/adoromusic, Adoro Music Publishing} @qq{Die Art, in der die Noten mit LilyPond eingegeben werden, lässt mich musikalischer denken -- es gab Zeiten, wenn ich vergeblich @@ -890,7 +1037,7 @@ dem auch nur nahe kommen kann.} @divClass{testimonial-item} @subsubheading David Bobroff, Bassposaunist, Iceland Symphonieorchester -@qq{Ich finde LilyPond einfach toll [..] Je mehr ich darüber lerne, +@qq{Ich finde LilyPond einfach toll [@dots{}] Je mehr ich darüber lerne, desto mehr mag ich es!} @divEnd @@ -898,7 +1045,7 @@ desto mehr mag ich es!} @divClass{testimonial-item} @subsubheading Vaylor Trucks, E-Gitarrenspieler (Ja, @uref{http://www.allmanbrothersband.com/modules.php?op=modload&name=userpage&file=content&page_id=12, verwandt mit}) -@qq{Ich bin total beeindruckt von LilyPond [..]} +@qq{Ich bin total beeindruckt von LilyPond [@dots{}]} @qq{DAS IST DAS BESTE PROGRAMM ALLER ZEITEN!!!} @@ -912,8 +1059,8 @@ desto mehr mag ich es!} @qq{Ich hatte so eine Hassliebe zu ihm entwickelt. Liebe, weil das erste Notenblatt, das ich gesehen hatte, so gut aussah. Die Beschreibung lügt, wenn es um die Schönheit von LilyPond - geht -- das ist viel zu bescheiden! [...] da LilyPond immer besser - wird und ich mich mehr damit auseinander setze, wie Sachen in + geht -- das ist viel zu bescheiden! [@dots{}] da LilyPond immer besser + wird und ich mich mehr damit auseinander setze, wie Sachen in Scheme gemacht werden, habe ich viel weniger Frustrationen. Auf jeden Fall wollte ich sagen: Danke, dass ihr LilyPond anbietet, es ist wirklich toll!} @@ -956,26 +1103,26 @@ Aussehen des Notendrucks zu erreichen, das ich will, besonders wenn es sich nicht um "Standardlösungen" handelt.} @divEnd - - @divEnd +@contactUsAbout{news articles or testimonals} @divClass{column-center-bottom} @subheading Was jetzt? -Lesen Sie über unsere @ref{Text-Eingabe}. +Lesen Sie über unsere @ref{Texteingabe}. @divEnd -@node Text-Eingabe -@unnumberedsec Text-Eingabe +@node Texteingabe +@unnumberedsec Texteingabe @translationof Text input @c TRANSLATORS, so far it's mostly from @c http://lilypond.org/web/switch/howto +@divClass{column-center-top} @subheading Musik @qq{kompilieren} @imageClickable{nereid-shot-small,png, (Klick zum Vergrößern), nereid-shot,png, right} @@ -1013,7 +1160,7 @@ mit einem Backslash eingegeben. Versetzungszeichen werden durch verschiedene Endungen hinzugefügt: @w{@code{-is}} nach der Note setzt ein Kreuz, @w{@code{-es}} dagegen ein b (-- das sind die deutschen -Endungen, Endungen in anderen Sprachen sind auch möglich). LilyPond entscheidet selber, wo +Endungen, Endungen in anderen Sprachen sind auch möglich). LilyPond entscheidet selber, wo es die Versetzungszeichen platziert. @imageFloat{text-input-2-annotate-de,png,center} @@ -1063,13 +1210,16 @@ funktioniert als Einführung und Beginn für das Arbeiten mit LilyPond; hier werden viele Fragen beantwortet, bevor man sie überhaupt stellen konnte! -Lesen Sie bitte das Handbuch zum Lernen bevor Sie sich über -Fehler beschweren! Neue Benutzer denken manchmal, dass LilyPond -nicht richtig funktioniert, während das Programm in Wirklichkeit -genau das tut, wozu es geschrieben worden ist. +Bisweilen sind Meulinge von manchen Verhaltensweisen von LilyPond unnötig +verwirrt. Bitte lesen Sie dieses Handbuch bevor Sie anzweifeln, +daß LilyPond fehlerfrei arbeitet. Weitere Information findet sich unter @ref{Handbücher} +Der LilyPond Anwender Ben Lemon hat eine ganze Reihe von +@uref{http://benlemon.me/blog/music/lilypond/operation-lilypond/,Video Tutorials} +in seinem Blog hinterlegt, die sich speziell an Neulinge wenden. + @subsubheading Einfachere Editionsumgebungen @@ -1087,7 +1237,7 @@ stellen tatsächliche eine GUI zur Verfügung, mit der man graphisch eine Partitur editieren kann. Mehr Information finden Sie unter @ref{Leichteres Editieren}. - +@divEnd @divClass{column-center-bottom} @subheading Was jetzt? @@ -1112,32 +1262,9 @@ In particular, don't link to: @end ignore - -@divClass{column-center-top} -@subheading LilyPondTool - -@imageClickable{lilypondtool-2.12-screenshot-400wide,png, - (Klick zum Vergrößern),lilypondtool-2.12-screenshot,png,right} - -@sourceimage{logo-linux,,,} -@sourceimage{logo-freebsd,,,} -@sourceimage{logo-macosx,,,} -@sourceimage{logo-windows,,,} - -@uref{http://lilypondtool.organum.hu} - -Als Plugin für den @uref{http://www.jedit.org,jEdit}-Texteditor -erstellt, ist das LilyPondTool das textbasierte Werkzeug mit den -meisten Eigenschaften, um LilyPond-Partituren zu setzen und zu -editieren. Hierzu gehören ein Document Wizard um neue Dateien -(auch mit Gesangstexten) einfacher zu erstellen und ein eingebetteter -PDF-Betrachter mit fortschrittlicher Unterstützung für -point-and-click. - -@divEnd - @divClass{column-center-top} -@subheading Frescobaldi +@subheading Front-end Applications +@subsubheading Frescobaldi @imageClickable{frescobaldi-lilypond-editor-small,png, (Klick zum Vergrößern),frescobaldi-lilypond-editor,png,right} @@ -1148,19 +1275,22 @@ point-and-click. @uref{http://www.frescobaldi.org} -Frescobaldi ist ein leichter, aber sehr mächtiger LilyPond-Musik- und -Texteditor -mit eingebauter PDF-Vorschau. Er ist einfach zu benutzen und läuft auf allen -gängigen Betriebssystemen (GNU/Linux, Mac OS X und Windows). - -@divEnd +Frescobaldi ist ein leichtgewichtiger (im Sinne von @q{installiert nur wenig zusätzliche Software}), +aber sehr mächtiger LilyPond Musik- und Texteditor mit vielen für die Arbeit mit +LilyPond nützlichen Fähigkeiten. Herausragend ist die beidseitige Verknüpfung zwischen +dem LilyPond Code und der dargestellten Musik durch @q{point-and-click} mit der Maus. +Ferner gibt es Partiturassistenten, eingebautes LilyPond Handbuch, Syntaxhighlighting +sowie automatische Befehlsvervollständigung. Frescobaldi wurde in Python geschrieben, +verwendet PyQt4 für das GUI und ist auf allen gängigen Betriebssystemen verfügbar +(GNU/Linux, Mac OS X and Windows). -@divClass{column-center-top} -@subheading Denemo +@subsubheading Denemo @imageClickable{screenshot-denemo-small,png, (Klick zum Vergrößern),screenshot-denemo,png,right} @sourceimage{logo-linux,,,} +@sourceimage{logo-macosx,,,} @sourceimage{logo-windows,,,} @uref{http://denemo.org} @@ -1178,6 +1308,44 @@ Textansicht markiert, wenn man von dort aus druckt. @divEnd +@divClass{column-center-top} +@subheading Browserbasierte Editoren + +@subsubheading LilyBin +@uref{http://lilybin.com} + +Ein webbasierter LilyPond Editor, in dem man die Noten direkt online +setzen kann, ohne LilyPond vorher installieren zu müssen. + +@subsubheading Tunefl +@uref{http://www.tunefl.com} + +Mit tunefl können Sie kleine Partituren direkt online setzen, ohne +LilyPond lokal installieren zu müssen. Es unterstützt alle Fähigkeiten +des Programms über ein bequemes Webinterface. + +@divEnd + +@divClass{column-center-top} +@subheading IDE Plug-ins + +@subsubheading Elysium + +@sourceimage{logo-linux,,,} +@sourceimage{logo-freebsd,,,} +@sourceimage{logo-macosx,,,} +@sourceimage{logo-windows,,,} + +@uref{http://elysium.thsoft.hu} + +Elysium ist eine LilyPond IDE für Eclipse mit integrierter paralleler +Sicht auf Quelle und erzeugte Noten. Ferner verfügt es über schnelles +visuelle und akkustische Rückmeldung, ohne daß dazu der Kontext gewechselt +werden müßte. Schließlich verfügt es über eine ganze Reihe von Assistenten, +die von vorgefertigten Templates getrieben werden. + +@divEnd + @divClass{column-center-top} @subheading Texteditoren @@ -1186,8 +1354,8 @@ Textansicht markiert, wenn man von dort aus druckt. @sourceimage{logo-macosx,,,} @sourceimage{logo-windows,,,} +@subsubheading Emacs @uref{http://www.gnu.org/software/emacs/} - Emacs ist ein Texteditor mit sprachensensitiven Eigenschaften für sehr viele Computersprachen. Emacs ist ein sehr stark erweiterbarer Editor, welcher auch als Integrierte @@ -1197,23 +1365,28 @@ mit LilyPond-Dateien zur Verfügung stellt. Einer unserer Entwickler hat auch einen Hauptmodus für Emacs, @uref{http://nicolas.sceaux.free.fr/lilypond/lyqi.html,lyqi} geschrieben. -@uref{http://www.vim.org} +Wenn Sie bisher nicht bereits mit Emacs vertraut sind, dann bevorzugen +sie möglicherweise einen anderen Editor um LilyPond Dateien zu schreiben. +Nähere Informationen zum Einrichten von Emacs finden Sie unter +@rprogram{Unterstützung von Texteditoren}. + +@subsubheading Vim +@uref{http://www.vim.org} Vim ist ein minimaler Texteditor und eine Erweiterung des älteren Unix-Editors @command{vi}. Er ist auch erweiterbar und konfigurierbar. -Allgemein gilt, dass Sie wahrscheinlich zu einem anderen Editor -greifen werden, wenn Sie nicht schon von Anfang an mit Emacs oder -Vim vertraut sind. +Wenn Sie bisher nicht bereits mit Vim vertraut sind, dann bevorzugen +sie möglicherweise einen anderen Editor um LilyPond Dateien zu schreiben. -Weiter Information zum Einstellen von Emacs und Vim findet sich unter +Nähere Informationen zum Einrichten von Vim finden SIe unter @rprogram{Unterstützung von Texteditoren}. - @sourceimage{logo-macosx,,,} +@subsubheading TeXShop @uref{http://www.uoregon.edu/~koch/texshop} -Der TexShop-Editor für MacOS@tie{}X kann erweitert werden, sodass +Der TeXShop-Editor für MacOS@tie{}X kann erweitert werden, sodass er LilyPond, @command{lilypond-book} und @command{convert-ly} vom Editor aus ausführen kann. Hierzu wird eine Erweiterung eingesetzt, die man hier erhält: @@ -1224,40 +1397,47 @@ eingesetzt, die man hier erhält: @divEnd - @divClass{column-center-top} -@subheading Andere Programme können LilyPond-Doce exportieren - +@subheading Weitere Programme die LilyPond Code exportieren können @subsubheading Score, Tab- und MIDI-Editoren: @itemize + @item -@uref{http://canorus.org,Canorus} kann nach LilyPond exportieren, ist allerdings noch im Beta-Stadium. Testpersonen sind willkommen. +@uref{http://www.jezra.net/projects/bwwtolily,bwwtolily} versucht eine +@code{.bww} oder @code{.bmw} Datei nach LilyPond zu konvertieren. Auch wenn +nicht jeder Schnörkel korrekt konvertiert wird (das gilt besonders für solche +mit @q{piobaireachd} [was immer das ist -- Anm. des Übersetzers]), jedoch werden +diese zumindest aufgeführt. @item -@uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd}, -auf der @uref{http://cairographics.org, Cairo}-Bibliothek basierend, -hat experimentelle Unterstützung für LilyPond-Export. +@uref{http://canorus.org,Canorus} kann nach LilyPond exportieren, ist +allerdings noch im Beta-Stadium. Tester sind willkommen. -@uref{http://www.tuxguitar.com.ar/,TuxGuitar}, ein Tabulator-Editor und --Spieler, stellt neben Tabulatur auch eine Partiturvorschau zur -Verfügung und kann nach LilyPond exportieren. +@item +@uref{http://enc2ly.sourceforge.net/en/,Enc2ly} ist ein GNU/Linux Programm +zur Konvertierung von Encore Dateien in LilyPond Dateien. + +@item +@uref{https://github.com/hanwen/go-enc2ly,go-enc2ly} ist ein in Go geschriebenes +Werkzeug um Encore Dateien in LilyPond zu konvertieren. Es wurde unter Verwendung +von Felipe Castro's Forschung und @q{Reverse Engineering} geschrieben. Hierzu wurden +existierende .enc Dateien modifiziert und in die 4.55 Demo Version importiert. @item -@uref{http://musescore.org,MuseScore} hat unvollständigen Export für LilyPond, -wird aber aktiv entwickelt. +@uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd}, +auf der @uref{http://cairographics.org, Cairo}-Bibliothek basierend, +hat experimentelle Unterstützung für LilyPond Export. @item @uref{http://www.holmessoft.co.uk/homepage/software/NWC2LY/index.htm, -NW2LY} ist ein C#-Programm, das -@c @uref{http://www.noteworthysoftware.com/} -NoteWorthy-Lieder nach LilyPond +NW2LY} ist ein C#-Programm, das NoteWorthy Composer Werke nach LilyPond konvertieren kann. @item -@uref{https://github.com/ciconia/ripple/blob/master/README.markdown, -Ripple} ist ein Programm, mit dem man Partituren und Stimmen erstellen +@uref{https://github.com/ciconia/ripple/blob/master/README.markdown,Ripple} +ist ein Programm, mit dem man Partituren und Stimmen erstellen kann. Es enthält auch einen Modus, in dem man unterschiedliche musikalische Werke untereinander mischen und zu einer Partitur oder einer Stimme zusammenfügen kann. @@ -1266,15 +1446,6 @@ einer Stimme zusammenfügen kann. @uref{http://www.rosegardenmusic.com,Rosegarden}, ein Audio- und MIDI-Sequenzierer, der auch einen Noteneditor für einzelne Systeme unterstützt. -@item -@uref{https://launchpad.net/rumor/,Rumor}, -ein monophoner Echtzeitkonverter von MIDI nach LilyPond. - -@item -@uref{http://www.tuxguitar.com.ar/,TuxGuitar}, ein Tabulatureditor -mit mehrfachen Spuren und Spieler, enthält eine Vorschau der Noten -und kann nach LilyPond exportieren. - @end itemize @subsubheading Algorithmische Code-Generatoren @@ -1282,40 +1453,73 @@ und kann nach LilyPond exportieren. @itemize @item -@uref{http://strasheela.sourceforge.net, Strasheela} ist @qq{a -highly expressive constraint-based music composition system}. +@uref{http://www.projectabjad.org/,Abjad}, a +@uref{http://www.python.org/,Python} API zur formalisierten Partitur Kontrolle. +Es wurde geschrieben um Komponisten dabei zu helfen, komplexe LilyPond +Werke interativ und schrittweise zu erzeugen. @item -@uref{http://common-lisp.net/project/fomus/,FOMUS}, eine LISP-Bibliothek, -mit der Notation für Computermusik-Programmumgebungen generiert wird. +@uref{http://common-lisp.net/project/fomus/,FOMUS}, (FOrmat MUSic) ist ein +Kompositionswerkzeug für Computermusik Komponisten. Geschrieben in LISP +läuft es in einer ganzen Reihe von Interpretern +Portierung nach C++. + +@item +@uref{http://strasheela.sourceforge.net, Strasheela} ist eine Umgebung +auf Basis der @uref{http://www.mozart-oz.org/, Mozart/Oz} +constraint basierten Programmiersprache. @end itemize @divEnd - @divClass{column-center-top} -@subheading Weitere, nicht aktiv entwickelte Programme +@subheading Weitere, nicht mehr aktiv entwickelte Programme @itemize +@item +@uref{https://sourceforge.net/projects/lily4jedit,LilyPondTool} war +ein Plugin für den @uref{http://www.jedit.org,jEdit} Text Editor. + @item @uref{http://lilykde.googlecode.com/,LilyKDE} wurde durch -@uref{http://www.frescobaldi.org/,Frescobaldi} ersetzt und existiert als -LilyKDE3 für KDE 3.5 und lilypond-KDE4 für KDE 4.1. +@uref{http://www.frescobaldi.org/,Frescobaldi} ersetzt. Es existiert +nur noch als LilyKDE3 für KDE 3.5 und lilypond-KDE4 für KDE 4.1. + +@item +@uref{http://lilycomp.sourceforge.net, LilyComp} ist ein graphisches +Notationsprogramm, das wie ein Ziffernblock funktioniert, mit dem man +LilyPond Notation erstellen kann. + +@item +@uref{http://www.musescore.org,MuseScore}, ein Notationsprogramm. +Der LilyPond Export wurde in Version 2.0 entfernt, aber frühere +Versionen sind noch auf +@uref{http://sourceforge.net/projects/mscore/files/mscore/,Sourceforge}. +verfügbar. @item -@uref{http://noteedit.berlios.de,NoteEdit}, mit dem man -@uref{http://www.musicxml.com/xml.html,MusicXML} importieren kann, wird -als Fork unter +@uref{https://sourceforge.net/projects/noteedit.berlios/,NoteEdit}, konnte +@uref{http://www.makemusic.com/musicxml,MusicXML} importieren. +Ableger existieren als @uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd} -und @uref{http://canorus.org,Canorus} weiterentwickelt. +und @uref{http://canorus.org,Canorus}. +@item +@uref{http://extensions.services.openoffice.org/en/project/OOoLilyPond,OOoLilypond}, +ist eine OpenOffice.org Erweiterung die LilyPond Dateien in Grafiken +in OpenOffice.org Dokumenten umwandelt. Es wird zwarnicht mehr weiterentwickelt, +scheint aber noch mit Version 4 zu laufen. @item -@uref{http://lilycomp.sourceforge.net, LilyComp} ist ein graphisches -Notationsprogramm, das wie ein Zahlenblock funktioniert, mit dem man -LilyPond-Notation erstellen kann. +@uref{https://launchpad.net/rumor/,Rumor}, +ein monophoner Echtzeitkonverter von MIDI nach LilyPond. + +@item +@uref{http://sourceforge.net/projects/tuxguitar/,TuxGuitar}, ein Tabulator Editor +und Spieler, stellt neben Tabulatur auch eine Partiturvorschau zur +Verfügung und kann nach LilyPond exportieren. @end itemize @@ -1325,9 +1529,9 @@ LilyPond-Notation erstellen kann. @divClass{column-center-bottom} @subheading Was jetzt? -Sie sind jetzt bereit, @ref{Download, LilyPond herunterzuladen}. +Sind Sie jetzt bereit, @ref{Download, LilyPond herunterzuladen}. -Sind Sie noch immer nicht überzeugt? Viele Komponisten, Musiker +Sie sind noch immer nicht überzeugt? Viele Komponisten, Musiker und Dirigenten haben gelernt, wie man Noten in unserem Eingabeformat schreibt. Erfahrene Benutzer haben sogar berichtet, dass sie eine volle Partitur in LilyPond schneller notieren können als mit @@ -1341,7 +1545,8 @@ klassischen Notensatzkunst im unserem @ref{Hintergrund} erklärt. @subheading Legales @divClass{legal} -Alle Logos und Produktabbildungen erkennen Copyright und Trademark an. +Alle Logos und Produktabbildungen werden unter ausdrücklicher Anerkennug des Copyright und Trademark +der Rechteinhaber verwendet. @logoLegalLinux diff --git a/Documentation/de/web/manuals.itexi b/Documentation/de/web/manuals.itexi index d236a6f289..2864da9d32 100644 --- a/Documentation/de/web/manuals.itexi +++ b/Documentation/de/web/manuals.itexi @@ -1,13 +1,13 @@ -@c -*- coding: utf-8; mode: texinfo; -*- +@c -*- coding: utf-8; mode: texinfo; documentlanguage: de -*- @ignore - Translation of GIT committish: ebe492ca408fb0d9abf80b94c56197eef8dc2f09 + Translation of GIT committish: 5b6ddab894b3065c35c72ef8048b8c6edbe684ac When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes. @end ignore -@c Translators: Till Paala +@c Translators: Till Paala, Michael Gerdau @node Handbücher @unnumbered Handbücher @@ -37,7 +37,7 @@ @itemize @item -@ref{Text-Eingabe}: +@ref{Texteingabe}: LilyPond ist ein @strong{textbasiertes} Notensatzprogramm. Wenn Sie mit diesem Konzept nicht vertraut sind, lesen Sie darüber bitte jetzt! @@ -53,8 +53,6 @@ eine sanfte @qq{unbedingt lesen!} Einführung in LilyPond. die passenden Übersetzungen in vielen anderen Sprachen gegeben. @details{Glossar} - - @item @ifWebLinks{@manualStableEssaySplitNoName-de,@ressaynamed{Top,Aufsatz}} @emph{(optional)} Hintergrundinformation über den Notensatzprozess und die @@ -66,13 +64,13 @@ die passenden Übersetzungen in vielen anderen Sprachen gegeben. @divEnd @divClass{column-left-top} -@subheading Normale Benutzung +@subheading Regelmäßig benötigt @itemize @item @ifWebLinks{@manualStableNotationSplitNoName-de,@rusernamed{Top,Notation}} -eine Syntaxreferenz. +Syntaxreferenz. @details{Notation} @item @@ -91,7 +89,7 @@ kurze Tricks, Tipps und Beispiele. @divClass{column-right-top} -@subheading Unregelmäßige Benutzung +@subheading Seltener benötigt @itemize @@ -102,6 +100,7 @@ Häufig gestellte Fragen. @item @ref{Top,Web}: Dieses Dokument. +@details{Web} @item @ifWebLinks{@manualStableChangesSplitNoName,@rchangesnamed{Top,Änderungen}} @@ -109,9 +108,9 @@ Was ist neu? @details{Änderungen} @item -@ifWebLinks{@manualStableExtendingSplitNoName-de,@rextendnamed{Top,Erweitert}} +@ifWebLinks{@manualStableExtendingSplitNoName-de,@rextendnamed{Top,Erweitern}} clevere Anpassungen. -@details{Erweitert} +@details{Erweitern} @item @ifWebLinks{@manualStableInternalsSplitNoName,@rinternalsnamed{Top,Interna}} @@ -137,9 +136,14 @@ vorhergehende stabile Versionen und die aktuelle Version als komprimiertes Archi der Übersetzungsstatus für nicht Nicht-Englischsprachige. @item -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}: +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond Snippet Repository}: Beispiele, Tricks und Tipps, von LilyPond-Benutzern erstellt. +@item +@uref{http://benlemon.me/blog/music/lilypond/operation-lilypond/,Video Tutorials}: +Der LilyPond Anwender Ben Lemon hat eine Reihe Video Tutorials in seinem +Blog veröffentlicht. Sie wenden sich an Neulinge. + @item @ref{Entwicklung}: Handbücher für die Entwicklerversion. @@ -152,25 +156,36 @@ Diese Handbücher sind unter der GNU Free Documentation License herausgegeben. @divEnd +@divClass{column-center-bottom} +@subheading Format der Handbücher + +Die LilyPond Handbücher liegen generell in drei Formaten vor: geteiltes HTML, großes HTML und +PDF. Geteiltes HTML eignet sich besonders Online gelesen zu werden. Großes HTML (und einige sind +sehr groß) beinhaltet das gesamte Handbuch in einer einzigen Seite. PDF ist zum Download und +dem Offline Lesen vorgesehen. Sie gelangen zu diesen 3 Formaten indem Sie den Links +@code{details of} folgen und dann dem Namen des Handbuchs. + +@divEnd + @divEnd @divClass{hide} @menu -* Einführung:: -* Glossar:: -* Aufsatz:: -* Notation:: -* Benutzung:: -* Schnipsel:: -* FAQ:: -* Web:: -* Änderungen:: -* Erweitert:: -* Interna:: -* Übersetzt:: -* Alles:: -* FDL:: +* Einführung:: Einführung. +* Glossar:: Glossar. +* Aufsatz:: Aufsatz. +* Notation:: Referenz. +* Benutzung:: Benutzung. +* Schnipsel:: Schnipsel. +* FAQ:: FAQ. +* Web:: Web. +* Änderungen:: NEWS. +* Erweitern:: Programmierung. +* Interna:: Interna. +* Übersetzt:: Übersetzt. +* Alles:: Alle Handbücher +* FDL:: Lizenz. @end menu @divEnd @@ -204,8 +219,8 @@ weitere Informationen zu erhalten. @docLinks{Einführung, learning, @rlearningnamed{Top,Einführung}, @manualStableLearningSplit-de, - @manualStableLearningBig-de, 1.5 MB, - @manualStableLearningPdf-de, 3 MB} + @manualStableLearningBig-de, 3 MB, + @manualStableLearningPdf-de, 5 MB} @divEnd @@ -259,8 +274,8 @@ Auflösung hat.} @docLinks{Aufsatz, essay, @ressaynamed{Top,Aufsatz}, @manualStableEssaySplit-de, - @manualStableEssayBig-de, 2 MB, - @manualStableEssayPdf-de, 2.5 MB} + @manualStableEssayBig-de, 1 MB, + @manualStableEssayPdf-de, 2 MB} @divEnd @@ -286,8 +301,8 @@ englische Musikterminologie (siehe Glossar) bekannt sein.} @docLinks{Notation, notation, @rusernamed{Top,Notation}, @manualStableNotationSplit-de, - @manualStableNotationBig-de, 7 MB, - @manualStableNotationPdf-de, 18 MB} + @manualStableNotationBig-de, 9 MB, + @manualStableNotationPdf-de, 35 MB} @divEnd @@ -297,7 +312,7 @@ englische Musikterminologie (siehe Glossar) bekannt sein.} @translationof Usage @divClass{column-left-top} -@subheading Handbuch zur Benutzung +@subheading Benutzerhandbuch Dieses Buch erklärt, wie die Programme ausgeführt werden, wie man LilyPond-Notation in andere Programme integrieren kann und macht @@ -313,7 +328,7 @@ in Angriff nimmt. @rprogramnamed{Top,Benutzung}, @manualStableUsageSplit-de, @manualStableUsageBig-de, 400 KB, - @manualStableUsagePdf-de, 600 KB} + @manualStableUsagePdf-de, 650 KB} @divEnd @@ -327,7 +342,7 @@ in Angriff nimmt. Hier werden ausgewählte Schnipsel an LilyPond-Code mit der produzierten Notation gezeigt. Die Schnipsel stammen aus dem -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond-Schnipsel-Depot} +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond-Schnipsel-Depot} (LSR) und stehen alle unter der Public Domain. Beachten Sie, dass dieses Dokument keine bestimmte Teilmenge von @@ -338,7 +353,7 @@ Schipsel sind in der Datei @file{Documentation/snippets/new/} im Quellverzeichnis von LilyPond gespeichert. Die Schnipsel-Listen für jeden Abschnitt der Notationsreferenz -sind auch verlinkt vom @strong{Siehe auch}-Absatz. +sind auch verlinkt vom @strong{Siehe auch} Absatz. @divEnd @divClass{column-right-bottom} @@ -346,8 +361,8 @@ sind auch verlinkt vom @strong{Siehe auch}-Absatz. @docLinks{Schnipsel, snippets, @rlsrnamed{Top,Schnipsel}, @manualStableSnippetsSplit, - @manualStableSnippetsBig, 2.5 MB, - @manualStableSnippetsPdf, 8 MB} + @manualStableSnippetsBig, 1.5 MB, + @manualStableSnippetsPdf, 12.5 MB} @divEnd @@ -362,7 +377,7 @@ sind auch verlinkt vom @strong{Siehe auch}-Absatz. @subsubheading Wo sind die graphischen Menüs, Werkzeugleisten und Notenblatt? LilyPond erfordert es, dass Noten als Text eingegeben werden. -Lesen Sie bitte über unsere @ref{Text-Eingabe}. +Lesen Sie bitte über unsere @ref{Texteingabe}. @subsubheading Es gibt sehr viel Dokumentation! Muss ich das alles @@ -427,13 +442,12 @@ Programm. @docLinksBare{Web, web, @ref{Top,Web}, @manualDevelWebSplit-de, - @manualDevelWebBig-de, 1 MB, - @manualDevelWebPdf, 2 MB} + @manualDevelWebBig-de, 2.5 MB, + @manualDevelWebPdf, 3.5 MB} @divEnd - @node Änderungen @unnumberedsec Änderungen @translationof Changes @@ -451,14 +465,14 @@ Eigenschaften in LilyPond seit der vorigen stabilen Version. @docLinks{Änderungen, changes, @rchangesnamed{Top,Änderungen}, @manualStableChangesSplit, - @manualStableChangesBig, 6 KB, - @manualStableChangesPdf, 200 KB} + @manualStableChangesBig, 90 KB, + @manualStableChangesPdf, 80 KB} @divEnd -@node Erweitert -@unnumberedsec Erweitert +@node Erweitern +@unnumberedsec Erweitern @translationof Extending @divClass{column-left-top} @@ -473,8 +487,8 @@ Dieses Handbuch erklärt, wie man Erweiterungen für LilyPond schreibt. @docLinks{Erweitert, extending, @rextendnamed{Top,Erweitert}, @manualStableExtendingSplit-de, - @manualStableExtendingBig-de, 200 KB, - @manualStableExtendingPdf-de, 400 KB} + @manualStableExtendingBig-de, 300 KB, + @manualStableExtendingPdf-de, 500 KB} @divEnd @@ -507,8 +521,8 @@ erklärt. Jeder Abschnitt der Notationsreferenz hat einen @docLinks{Interna, internals, @rinternalsnamed{Top,Interna}, @manualStableInternalsSplit, - @manualStableInternalsBig, 2.5 MB, - @manualStableInternalsPdf, 2.8 MB} + @manualStableInternalsBig, 3 MB, + @manualStableInternalsPdf, 4 MB} @divEnd @@ -551,11 +565,14 @@ erhältlich. @divEnd @divClass{column-right-bottom} -@subheading Alte stabile Versionen +@subheading Frühere stabile Versionen @divClass{keep-bullets} @itemize +@item @uref{http://lilypond.org/doc/v2.16/Documentation/web/manuals.de.html, +LilyPond 2.16 Dokumentation} (auf deutsch) + @item @uref{http://lilypond.org/doc/v2.14/Documentation/web/manuals.de.html, LilyPond 2.14 Dokumentation} (auf deutsch) diff --git a/Documentation/es/changes.tely b/Documentation/es/changes.tely index 6ff76f0417..fe38731b92 100644 --- a/Documentation/es/changes.tely +++ b/Documentation/es/changes.tely @@ -1,6 +1,6 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 93d725094ee629b2d5200ab5a75b609579a62973 + Translation of GIT committish: 32839fc7052761649d3ba3512ca29373acbe880c When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -8,6 +8,7 @@ @end ignore @setfilename lilypond-changes.info @settitle Registro de cambios de LilyPond +@documentencoding UTF-8 @include macros.itexi @@ -44,7 +45,7 @@ Véase el manual del usuario, \NAME\ @finalout @node Top -@top Funcionalidades nuevas de la versión 2.18 desde la 2.16 +@top Funcionalidades nuevas de la versión 2.20 desde la 2.18 @allowcodebreaks false @@ -70,507 +71,909 @@ which scares away people. @end ignore @item -Ya no se aplica automáticamente la funcionalidad de ajuste de los -trazos de PostScript, sino que se deja a la discreción del -dispositivo PostScript (de forma predeterminada, Ghostscript la -usa para resoluciones de hasta 150ppp cuando se generan imágenes -de matriz de puntos). Cuando se habilita, se emplea -(principalmente para las plicas y las barras de compás) un -algoritmo de trazado más complejo diseñado para sacar provecho del -ajuste de los trazos. +Las listas de elementos separados por puntos como +@code{FretBoard.stencil} ya estaban contempladas a partir de la +versión@tie{}2.18. Ahora también pueden contener enteros sin +signo, y se pueden hacer separar opcionalmente mediante comas. +Ello permite un uso semejante a +@lilypond[quote,verbatim] +{ \time 2,2,1 5/8 g'8 8 8 8 8 } +@end lilypond +y +@example +\tagGroup violin,oboe,bassoon +@end example -El ajuste de trazos se puede forzar mediante la especificación de -la opción de línea de órdenes @samp{-dstrokeadjust} para la -instrucción LilyPond. Cuando se generan archivos @code{PDF}, esto -normalmente produce una vista previa de los @code{PDF} -marcadamente mejorada, pero con un tamaño de archivo -significativamente más grande. A altas resoluciones, la calidad -de la impresión puede no resultar afectada. +@item +Tales listas se pueden usar también dentro de expresiones para +asignaciones, conjuntos y sobreescrituras. Así, ahora puede +usarse de la forma siguiente: +@lilypond[quote,verbatim] +{ \unset Timing.beamExceptions + \set Timing.beatStructure = 1,2,1 + g'8 8 8 8 8 8 8 8 } +@end lilypond @item -Ahora hay un nuevo tipo de contexto llamado @code{NullVoice} que, -si bien no aparece en la salida impresa, se puede usar para -alinear la letra de las canciones. Esto puede ser especialmente -conveniente cuando se usa en paralelo con una construcción -@code{\partcombine}. +Anteriormente se podían asignar valores a los elementos de las +listas de asociación individualmente (por ejemplo, variables de +papel como @code{system-system-spacing.basic-distance}). Ahora +también pueden ser referenciadas de esta manera, como en +@example +\paper @{ + \void \displayScheme \system-system-spacing.basic-distance +@} +@end example -@lilypond[verbatim,quote] -soprano = \relative c' { c e g c } -alto = \relative c' { a c e g } -verse = \lyricmode { This is my song } +En combinación con los cambios mencionados anteriormente, esto +permite el establecimiento de valores y la referenciación de +pseudovariables como @code{violin.1}. -\score { - \new Staff << - \partcombine \soprano \alto - \new NullVoice = "aligner" \soprano - \new Lyrics \lyricsto "aligner" \verse - >> - \layout {} -} -@end lilypond +@item +Ahora se pueden incrustar los archivos de código fuente de +LilyPond dentro de los archivos PDF generados. Esta funcionalidad +experimental está inhabilitada de forma predeterminada y se puede +calificar como de no segura, pues los documentos PDF con contenido +oculto tienden a presentar un riesgo para la seguridad. Observe +que no todos los visores de PDF son capaces de manejar documentos +incrustados (en caso de que no sea así, la salida de PDF se verá +normalmente y los archivos fuente serán invisibles). Esta +funcionalidad solamente funciona con el backend PDF. +@item +Ahora se puden definir específicamente los nombres de las notas en +idioma francés en lugar de constituir un alias de los nombres +italianos: además de la sintaxis genérica derivada del italiano, +la altura de la nota @var{d} (@var{re}) se puede escribir ahora +como @code{ré}. Los dobles sostenidos se pueden escribir también +usando el sufijo @code{-x}. @item -Pueden colocarse dentro de una sola variable, o ser devueltas por -una función de evento, varias articulaciones: +Están contempladas cuerdas bajas adicionales (para la tablatura de +laúd). +@lilypond[quote,verbatim] +m = { f'4 d' a f d a, g, fis, e, d, c, \bar "|." } -@lilypond[verbatim,quote] -sempreStacc = -. ^\markup \italic sempre -\relative { c''4\sempreStacc c c c } +\score { + \new TabStaff \m + \layout { + \context { + \Score + tablatureFormat = #fret-letter-tablature-format + } + \context { + \TabStaff + stringTunings = \stringTuning + additionalBassStrings = \stringTuning + fretLabels = #'("a" "b" "r" "d" "e" "f" "g" "h" "i" "k") + } + } +} @end lilypond @item -La línea de base de los elementos de marcado que constituyen -partituras se toma actualmente del punto de referencia -(normalmente la línea central del pentagrama) del primer sistema -de la parte inferior, en lugar de la parte superior del rectángulo -circundante. Lo siguente -@lilypond[verbatim,quote] -\markup { - violin: \score { \new Staff { 1 } - \layout { indent=0 } } , - cello: \score { \new Staff { \clef "bass" } - \layout { indent=0 } } +Ahora está disponible la instrucción de lista de marcados +@code{\table}. Cada columna se puede alinear de distinta forma. +@lilypond[quote,verbatim] +\markuplist { + \override #'(padding . 2) + \table + #'(0 1 0 -1) + { + \underline { center-aligned right-aligned center-aligned left-aligned } + one "1" thousandth "0.001" + eleven "11" hundredth "0.01" + twenty "20" tenth "0.1" + thousand "1000" one "1.0" + } } @end lilypond -tenía anteriormente el siguiente aspecto: -@lilypond[quote] + +@item +Una instrucción de marcado nueva, @code{\with-dimensions-from}, +hace que sea más fácil de usar @code{\with-dimensions} obteniendo +las dimentiones nuevas a partir de un objeto de marcado, dado como +primer argumento. +@lilypond[quote,verbatim] \markup { - violin: \general-align #Y #UP - \score { \new Staff { 1 } - \layout { indent=0 } } , - cello: \general-align #Y #UP - \score { \new Staff { \clef "bass" } - \layout { indent=0 } } + \pattern #5 #Y #0 "x" + \pattern #5 #Y #0 \with-dimensions-from "x" "f" + \pattern #5 #Y #0 \with-dimensions-from "x" "g" + \override #'(baseline-skip . 2) + \column { + \pattern #5 #X #0 "n" + \pattern #5 #X #0 \with-dimensions-from "n" "m" + \pattern #5 #X #0 \with-dimensions-from "n" "!" + } } @end lilypond -sin que hubiera una manera adecuada de hacer que las dos -partituras estuviesen alineadas. @item -LilyPond ya no deduce automáticamente un contexto -@samp{\defaultchild} dentro de una definición de contexto con -cláusulas @samp{\accepts}. Cualquier definición de contexto que -no tenga una definición @samp{\defaultchild} explícita o heredada, -cuenta como un contexto @samp{Bottom} y es candidato para eventos -de duraciones y sobreescrituras sin causar la creación implícita -de otros contextos. Asegúrese de especificar un -@samp{\defaultchild} para contextos no-@samp{Bottom} al definirlos -partiendo de cero. +La nueva función de salto de página +@code{ly:one-line-auto-height-breaking} sitúa una partitura +completa en una sola línea y cambia la anchura del papel de forma +correspondiente, de igual manera que @code{ly:one-line-breaking}. +La diferencia es que también modifica automáticamente la altura de +la página para que se ajuste a la altura de la música. @item -Ahora están ampliamente contemplados los símbolos de registros de -acordeón tanto para discanto como bajo en el módulo @samp{scm accreg}, -véase @ruser{Accordion Registers}. -@lilypond[verbatim,quote] -#(use-modules (scm accreg)) -\new PianoStaff -<< - \new Staff \relative - { \clef "treble" \discant "10" - r8 s32 f'[ bes f] s e[ a e] s d[ g d] s16 e32[ a] - \discant "121" - << { r16 r r } \\ - { d r a r bes r } >> | - 1 +Está disponible la instrucción de marcado +@code{\draw-squiggle-line}. Es posible la personalización a +través de la sobreescritura de @code{thickness}, +@code{angularity}, @code{height} and @code{orientation}. +@lilypond[quote,verbatim] +\markup + \overlay { + \draw-squiggle-line #0.5 #'(3 . 3) ##t + + \translate #'(3 . 3) + \override #'(thickness . 4) + \draw-squiggle-line #0.5 #'(3 . -3) ##t + + \translate #'(6 . 0) + \override #'(angularity . -5) + \draw-squiggle-line #0.5 #'(-3 . -3) ##t + + \translate #'(3 . -3) + \override #'(angularity . 2) + \override #'(height . 0.3) + \override #'(orientation . -1) + \draw-squiggle-line #0.2 #'(-3 . 3) ##t } - \new Staff \relative - { \clef "treble" \freeBass "1" - r8 d'32 s16. c32 s16. bes32 s16. a32[ cis] s16 - \clef "bass" \stdBass "Master" - << { r16 ^"b" r ^"am" r ^"gm" | - 1^"a" } \\ - { d8_"D" c_"C" bes_"B" | a1_"A" } - >> +@end lilypond + +@item +Existe una instrucción nueva para eliminar los pentagramas vacíos, +@code{\RemoveAllEmptyStaves}, que actúa de la misma forma que +@code{\RemoveEmptyStaves}, excepto porque también elimina los +pentagramas vacíos del primer sistema de una partitura. + +@item +Las instrucciones de marcado @code{\undertie} y @code{\overtie} +están disponibles, así como la instrucción de marcado genérica +@code{\tie}. +@lilypond[quote,verbatim] +\markup { + \undertie "undertied" + \overtie "overtied" +} + +m = { + c''1 \prall -\tweak text \markup \tie "131" -1 +} + +{ \voiceOne \m \voiceTwo \m } +@end lilypond + +@item +@code{TabStaff} puede ahora imprimir microtonos para las +curvaturas de tono y otros efectos. +@lilypond[quote,verbatim] +\layout { + \context { + \Score + supportNonIntegerFret = ##t } +} + +mus = \relative { c'4 cih d dih } + +<< + \new Staff << \clef "G_8" \mus >> + \new TabStaff \mus >> @end lilypond @item -Las nuevas instrucciones @code{markLengthOn} y -@code{markLengthOff} controlan si se permite la existencia de un -espacio horizontal para las letras de ensayo e indicaciones de -tempo. +Ahora están disponibles dos estilos nuevos de enmarcado en blanco +para enmascarar el material de fondo. El estilo @code{outline} +aproxima los contornos de la forma de un glifo, y la forma se +produce a partir de un conjunto de copias desplazadas del glifo. +El estilo @code{rounded-box} produce una forma de rectángulo +redondeado. Para los tres estilos, incluido el estilo @code{box} +predeterminado, se puede personalizar el @code{thickness} o grosor +de la forma del enmarcado en blanco, como un múltiplo del grosor +de una línea del pentagrama. -@lilypond[quote,relative=2] -\markLengthOn -\compressFullBarRests -\tempo "Molto vivace" c2 c' -\mark\default -\tempo "Meno mosso" R1*16 -\mark\default -g,2 g -\bar "||" -\markLengthOff -\tempo "Molto vivace" c2 c' -\mark#1 -\tempo "Meno mosso" R1*16 -\mark\default -g,2 g +@lilypond[verbatim,quote] +\markup { + \combine + \filled-box #'(-1 . 15) #'(-3 . 4) #1 + \override #'(thickness . 3) + \whiteout whiteout-box +} +\markup { + \combine + \filled-box #'(-1 . 24) #'(-3 . 4) #1 + \override #'(style . rounded-box) + \override #'(thickness . 3) + \whiteout whiteout-rounded-box +} +\markup { + \combine + \filled-box #'(-1 . 18) #'(-3 . 4) #1 + \override #'(style . outline) + \override #'(thickness . 3) + \whiteout whiteout-outline +} +\relative { + \override Staff.Clef.whiteout-style = #'outline + \override Staff.Clef.whiteout = 3 + g'1 +} @end lilypond @item -Ahora las letras de ensayo al principio de una línea se sitúan de -forma predeterminada a la derecha de la clave y la armadura. Como -en versiones anteriores, la interfaz -@code{break-alignable-interface} controla el comportamiento. +Todas las instrucciones @code{\override}, @code{\revert}, +@code{\set} y @code{\unset} ahora funcionan con el prefijo +@code{\once} para hacer ajustes de una sola vez. +@lilypond[quote,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \once \override NoteHead.color = #green + g4 a + \once \revert NoteHead.color + b c | + \revert NoteHead.color + f2 c | +} +@end lilypond -@lilypond[quote,relative=2] -\set Score.barNumberVisibility = #all-bar-numbers-visible -\set Timing.currentBarNumber = #72 -\bar"||" \time 3/4 \key e\major \mark#10 \tempo "Adagio" b2. +@item +Al crear una salida MIDI, LilyPond ahora almacena el @code{title} +que se ha definido en el bloque @code{\header} de la partitura (o, +si no existe tal definición en el nivel de @code{\score}, la +primera definición de ese tipo que aparezca en un bloque +@code{\header} del @code{\bookpart}, @code{\book}, o ámbito de +nivel superior que encierra a la partitura) como el nombre de la +secuencia dentro del archivo MIDI. De forma opcional, el nombre +de la secuencia MIDI se puede sobreescribir usando el nuevo campo +@code{midititle} del bloque @code{\header} independientemente del +@code{title} (por ejemplo, en caso de que @code{title} contenga +código de elementos de marcado que no se convierta automáticamente +a texto sencillo de manera satisfactoria). + +@item +Las funciones musicales (además de las funciones vacías y de +Scheme) e instrucciones de marcado que se limitan a aplicar los +parámetros finales a una cadena de sobreescrituras, se pueden +definir ahora de forma que solamente escriben la expresión +interrumpida con @code{\etc}. + +@lilypond[verbatim,quote] +bold-red-markup = \markup \bold \with-color #red \etc +highlight = \tweak font-size 3 \tweak color #red \etc + +\markup \bold-red "text" +\markuplist \column-lines \bold-red { One Two } + +{ c' \highlight d' e'2-\highlight -! } @end lilypond @item -Ahora se pueden escribir directamente números decimales dentro de -la música, sin el prefijo del símbolo de almohadilla. Junto al -cambio anterior en la forma de especificar las propiedades de los -objetos, el código para modificar la longitud de las plicas ha -cambiado de esto: +Las funciones de LilyPond definidas con +@code{define-music-function}, @code{define-event-function}, +@code{define-scheme-function} y @code{define-void-function} ahora +se pueden llamar directamente desde Scheme como si fuesen +procedimientos de Scheme reales. Se sigue efectuando una +comprobación de los argumentos en su número y tipo de la misma +forma que cuando se llama a la función a través de código de +LilyPond. Esto incluye la inserción de valores predeterminados +para los argumentos opcionales que no se corresponden con sus +predicados. En lugar de usar @code{\default} en la propia lista +de argumentos para saltar explícitamente una secuencia de +argumentos opcionales, se puede emplear @code{*unspecified*}. + +@item +La posición actual del cursor de entrada y del analizador +sintáctico se almacenan ahora dentro de fluidos de GUILE y se +pueden referenciar a través de las llamadas de función +@code{(*location*)} y @code{(*parser*)}. Como consecuencia, un +gran número de funciones que anteriormente tomaban un argumento +@code{parser} explícito, ya no lo hacen. + +Las funciones definidas con @code{define-music-function}, +@code{define-event-function}, @code{define-scheme-function} y +@code{define-void-function} ya no usan los argumentos +@code{parser} @code{location}. + +Con estas definiciones, LilyPond trata de reconocer el uso +obsoleto de los argumentos @code{parser} y @code{location}, +ofreciendo durante algún tiempo una semántica compatible hacia +atrás. + +@item +En el idioma de nombre de nota "english", los nombres largos de +las alturas con alteración ahora contienen un guión para una mejor +legibilidad. Ahora se debe escribir @example -\override Stem #'length = #5.6 -e' f' g' a' +\key a-flat \major @end example -a esto: +en lugar de @example -\override Stem.length = 5.6 -e' f' g' a' +\key aflat \major @end example +como se hacía antes. -Se debe escribir un dígito a ambos lados del punto; no se permiten -valores como @code{4.} ó @code{-.3}. - -Asimismo, no se admiten fracciones decimales dentro de -@code{\chordmode}. +Las alteraciones dobles no llevan otro guión, de forma que el +holandés @code{cisis} lleva el nombre largo @code{c-sharpsharp} en +inglés. @item -Se pueden redefinir libremente ciertas abreviaturas como @code{(}, -@code{)}, @code{|}, @code{[}, @code{]}, @code{~}, @code{\(}, -@code{\)} y otras, como instrucciones normales. Un ejemplo sería -@lilypond[verbatim,quote] -"\\{" = ( -"\\}" = ) -"(" = \melisma -")" = \melismaEnd - -\new Staff << - \relative c' { - c8 \{ d e f \} % slurred - g ( a b c ) % no slur, but with melisma - c,1 \bar "|." - } - \addlyrics { Li -- ly -- pond. } ->> +El estilo visual de las barras de trémolo (forma, estilo e +inclinación) se controla ahora con más precisión. +@lilypond[quote,relative=2] + a8:32 b: c: d: + \override StemTremolo.shape = #'beam-like + a: b: c: d: + \override StemTremolo.style = #'constant + a: b: c: d: + g,2 @end lilypond + @item -El nombre de la abreviatura de articulación para -@code{\staccatissimo} ha cambiado de @code{-|} a@tie{}@code{-!}. +Los silencios de varios compases tienen una longitud que depende +de su duración, bajo el control de +@code{MultiMeasureRest.space-increment}. +@lilypond[quote] +{ \compressFullBarRests + \override Staff.MultiMeasureRest.space-increment = 3.0 + R1*2 R1*12 R1*64 } +@end lilypond @item -Ahora se escriben los rangos de cambios de tempo como @code{\tempo -4 = 60 - 68} en lugar de @code{\tempo 4 = 60 ~ 68}. +Los números de página se pueden imprimir ahora en números romanos, +fijando el valor de la variable @code{page-number-type} del bloque +@code{\paper}. @item -Se ha cambiado el nombre de @code{OctavateEight} por el de -@code{ClefModifier}. Las propiedades de contexto relacionadas han -cambiado su nombre @code{xxxOctavationyyy} por el de -@code{xxxTranspositionyyy}. +Ahora se pueden usar @code{\time} y @code{\partial} combinados +para cambiar la indicación de compás en la mitad de un compás. + +@lilypond[verbatim,quote,relative=1] +\override Score.BarNumber.break-visibility = #end-of-line-invisible +\partial 4 \time 3/4 f4 | 2 4 | 2 \bar "||" +\time 9/8 \partial 4. f8 8 8 | 2. 8 8 8 | +@end lilypond @item -Existe una nueva instrucción @code{\absolute} que marca -explícitamente la música introducida en alturas absolutas. Aunque -esto era antes el comportamiento predeterminado, una instrucción -@code{\absolute} explícita evita también la reinterpretación -cuando el pasaje está dentro de un bloque marcado como -@code{\relative}: -@lilypond[verbatim,quote] -\relative c { c'4 \absolute { f'' g'' } c } +Ahora es posible la sobreescritura de la propiedad @code{text} de +los nombres de acorde. + +@lilypond[verbatim,fragment,quote] +<< +\new ChordNames \chordmode { + a' b c:7 + \once \override ChordName.text = #"foo" + d +} +>> @end lilypond @item -Cuando se utiliza @code{\relative} sin emplear como referencia una -altura explícita, se toma como referencia el centro de la primera -octava, haciendo que no se pueda distinguir si la primera nota que -se introduce es relativa o absoluta. Anteriormente, la omisión de -una altura de referencia habría llevado a una altura -predeterminada de @code{c'} (el Do central). Dado que la -mencionada elección es, hasta cierto punto, arbitraria, la forma -de uso recomendada es que se especifique siempre una altura de -referencia. +Se ha mejorado la alineación horizontal cuando se usa +@code{TextScript}, con @code{DynamicText} o con @code{LyricText}. @item -Se puede usar la nueva instrucción @code{\single} para convertir -la sobreescritura de una propiedad en un truco que se aplica a una -expresión musical única: +Se ha añadido una instrucción nueva @code{\magnifyStaff} que +cambia la escala visual de los pentagramas, líneas, barras de +compás, barras cortadas y el espaciado horizontal general en el +nivel del contexto de @code{Staff}. Se evita que las líneas del +pentagrama disminuyan a un tamaño menor que el predeterminado +porque todos los grosores de las plicas, ligaduras y otros objetos +gráficos están basados en el grosor de las líneas del pentagrama. -@lilypond[quote,verbatim,relative=2] -
1 -@end lilypond +@item +@code{InstrumentName} contempla ahora el @code{text-interface}. @item -Dos maneras de hacer que los objetos gráficos no aparezcan en la -salida son: sobreescribir su propiedad @code{transparent} con un -valor verdadero @code{#t} (reteniendo el espaciado original), o -sobreescribiendo su propiedad @code{stencil} o sello con un valor -falso @code{#f} (que no ocupa ningún espacio). Estas dos -operaciones tienen ahora las formas cortas @code{\hide} (ocultar) -y @code{\omit} (omitir), respectivamente. A estas instrucciones -puede dárseles una expresión musical sobre la que efectuar el -trucaje, o bien el nombre de un objeto gráfico para el que se debe -crear la sobreescritura (para especificar los dos, utilice -@code{\single} sobre la instrucción en forma de sobreescritura): +Se contempla ahora el control del @q{nivel de expresión} de los +canales MIDI usando la propiedad de contexto +@code{Staff.midiExpression}. Se puede usar para alterar incluso +el volumen percibido de notas mantenidas (si bien a muy @q{bajo +nivel}) y acepta un valor numérico entre @code{0.0} y @code{1.0}. -@lilypond[quote,verbatim] -\new Staff \with { \omit Clef } -\relative c'' 1 -@end lilypond +@example +\score @{ + \new Staff \with @{ + midiExpression = #0.6 + midiInstrument = #"clarinet" + @} + << + @{ a'1~ a'1 @} + @{ + \set Staff.midiExpression = #0.7 s4\f\< + \set Staff.midiExpression = #0.8 s4 + \set Staff.midiExpression = #0.9 s4 + \set Staff.midiExpression = #1.0 s4 + + \set Staff.midiExpression = #0.9 s4\> + \set Staff.midiExpression = #0.8 s4 + \set Staff.midiExpression = #0.7 s4 + \set Staff.midiExpression = #0.6 s4\! + @} + >> + \midi @{ @} +@} +@end example @item -Se puede aplicar la nueva instrucción @code{\temporary} a las -sobreescrituras para hacer que no sustituyan a los ajustes de -propiedad previos. Si se aplica una instrucción de reversión -@code{\revert} a la misma propiedad varias veces seguidas, el -ajuste anterior reaparece: - -@lilypond[quote,verbatim,relative=2] -\override NoteHead.color = #red c4 -\override NoteHead.color = #green d -\revert NoteHead.color e2 -\override NoteHead.color = #red c4 -\temporary\override NoteHead.color = #green d -\revert NoteHead.color e -\revert NoteHead.color c -@end lilypond +Se ha añadido la posibiliidad de hacer más fácil usar tipografías +alternativas @q{de música} diferentes de la predeterminada +Emmentaler de LilyPond. Véase +@uref{http://fonts.openlilylib.org/} para más información. -Esto tiene utilidad principalmente para la escritura de funciones -musicales que se desea que tengan alguna propiedad modificada -solamente por un tiempo igual a la duración de la función. +@item +Los @q{grobs} u objetos gráficos y sus ancestros se pueden ahora +alinear separadamente permitiendo más flexibilidad para las +posiciones de los grobs. Por ejemplo, el borde izquierdo de un +grob se puede alinear sobre el centro de su ancestro. @item -Las instrucciones @code{\tag}, @code{\removeWithTag} y -@code{\keepWithTag} ahora admiten una lista de símbolos en lugar -de un solo símbolo para marcar, eliminar y seleccionar música que -esté etiquetada con una cualquiera de la lista de etiquetas. Esto -es de especial importancia para @code{\keepWithTag} porque no es -posible conseguir el mismo efecto usando varias instrucciones -@code{\keepWithTag} consecutivas. +Se han hecho mejoras en la instrucción @code{\partial} para evitar +problemas cuando se usa en varios contextos en paralelo. @item -La opción @samp{-d old-relative} se ha eliminado. Ya no está -accesible a través de la línea de órdenes; la utilidad que aún -conservaba era la interpretación de @code{\relative} en archivos -de LilyPond convertidos automáticamente de las versiones@tie{}1.8 -o anteriores. No está claro cuántas de tales versiones estaban -aún en funcionamiento. +@code{\chordmode} puede usar ahora las construcciones @code{< >} y +@code{<< >>}. @item -Se ha invertido el significado de @code{instrumentTransposition}. -Después de +Se ha añadido una instrucción @code{\tagGroup} que complementa a +las instrucciones existentes @code{\keepWithTag} y +@code{\removeWithTag}. Por ejemplo: + @example -\set instrumentTransposition = #@{ b #@} +\tagGroup #'(violinI violinII viola cello) @end example -una nota escrita @code{c'} ahora suena como @code{b}. -Anteriormente era a la inversa. Esperamos que este cambio y el -siguiente hagan más sencillo el tratamiento de los instrumentos -transpositores. - -@item -La música generada por las instrucciones @code{\set} y -@code{\override} ya no resulta afectada por la instrucción -@code{\transpose}. La consecuencia más importante es que -@code{\transpose} transporta la altura tonal sonora o de concierto -y la que se imprime en la misma medida incluso aunque la música -que se transporta contenga @code{\transposition}. Anteriormente, + +declara una lista de @q{tags} o etiquetas que pertenecen a un solo +@q{tag group} o grupo de etiquetas. + @example -\transpose c' f' \transposition bes' +\keepWithTag #'violinI @end example -era equivalente a @code{\transposition f'}. Ahora se mantiene -como equivalente a @code{\transposition bes'}. - -@item -Cuando se comprueba la existencia de colisiones, LilyPond ya no -trata los objetos como rectángulos. En lugar de ello se aproxima -la forma verdadera de los objetos utilizando un enfoque parecido -al uso de integrales, lo que por lo común dará como resultado un -posicionamiento más ceñido y regular de los objetos y los sistemas -de pentagramas: - -@lilypond[relative=1] -#(ly:set-option 'debug-skylines #t) -\dynamicUp -c'4\f a4\f d\f( f) -a,4\< c c c\! -d4-.\downbow a4^"r'venu..." c \tempo "T1" e + +se ocupa solamente de las @q{tags} del grupo de etiquetas +@q{violinI}. + +Cualquier elemento de la música incluida que lleve una o más +etiquetas del grupo, pero @emph{no} la etiqueta @var{violinI}, +será eliminado. + +@item +La función @code{\addlyrics} funciona ahora con contextos +arbitrarios, entre ellos @code{Staff}. + +@item +Ahora se pueden usar también los números de cuerda para imprimir +números romanos (p. ej. para instrumentos de cuerda sin trastes). +@lilypond[verbatim,quote,relative=2] +c2\2 +\romanStringNumbers +c\2 +\arabicStringNumbers +c1\3 @end lilypond -El fragmento anterior tenía anteriormente este aspecto: - -@lilypond[relative=1] -#(ly:set-option 'debug-skylines #t) -\override Hairpin #'vertical-skylines = #'() -\override DynamicText #'vertical-skylines = #'() -\override TextScript #'vertical-skylines = #'() -\override Score.MetronomeMark #'vertical-skylines = #'() -\override Staff.Clef #'vertical-skylines = #'() -\dynamicUp -c'4\f a4\f d\f( f) -a,4\< c c c\! -d4-.\downbow a4^"r'venu..." c \tempo "T1" e +@item +El nombre de la propiedad @code{thin-kern} del objeto gráfico +@code{BarLine} ha cambiado a @code{segno-kern}. + +@item +Los objetos gráficos @code{KeyCancellation} ahora ignoran las +claves de las notas guía (como hacen los objetos +@code{KeySignature}). + +@item +Se contempla ahora @code{\once@tie{}\unset} + +@item +Ahora es posible colorear independientemente tanto los puntos como +los paréntesis en los diagramas de posición de acordes, si se usa +la instrucción de marcado @code{\fret-diagram-verbose}. + +@lilypond[verbatim,quote,relative=1] +\new Voice { + c1^\markup { + \override #'(fret-diagram-details . ( + (finger-code . in-dot))) { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1 red) + (place-fret 4 5 2 inverted) + (place-fret 3 5 3 green) + (place-fret 2 5 4 blue inverted) + (place-fret 1 3 1 violet) + (barre 5 1 3 )) + } + } + c1^\markup { + \override #'(fret-diagram-details . ( + (finger-code . below-string))) { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1 red parenthesized) + (place-fret 4 5 2 yellow + default-paren-color + parenthesized) + (place-fret 3 5 3 green) + (place-fret 2 5 4 blue ) + (place-fret 1 3 1) + (barre 5 1 3)) + } + } +} @end lilypond -Entre los objetos afectados se encuentran @code{Accidentals}, -@code{Beams}, @code{Clefs}, @code{Dynamics}, @code{FiguredBass}, -@code{Flags}, @code{Glissandos}, @code{Lyrics}, -@code{MetronomeMarks}, @code{OttavaBrackets}, @code{Pedals}, -@code{RehearsalMarks}, @code{Rests}, @code{Scripts}, -@code{TextScripts}, @code{Ties}, @code{Tuplets} y -@code{VoltaBrackets}. - -@item -Ahora los grupos de valoración especial se crean mediante la -instrucción @code{\tuplet}, que toma una fracción -@code{@var{t}/@var{n}} para especificar que se tocan @var{t} notas -en el tiempo en que habitualmente se permite un número de -@var{n}. Una sola instrucción @code{\tuplet} puede crear varios -grupos especiales si su duración se inserta después de la -fracción. -@lilypond[quote,verbatim,relative=2] -\tuplet 3/2 { c8 d e } \tuplet 3/2 { f e d } c2 -\tuplet 3/2 4 { c8 d e f e d } c2 +@item +Se han añadido dos propiedades nuevas para usarlas dentro de +@code{fret-diagram-details} con la instrucción de marcado +@code{\fret-diagram-verbose}; @code{fret-label-horizontal-offset}, +que afecta a la @code{fret-label-indication}, y +@code{paren-padding}, que controla la distancia entre el puntillo +y los paréntesis que lo rodean. + +@lilypond[verbatim,quote,relative=1] +\new Voice { + c1^\markup { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1) + (place-fret 4 5 2) + (place-fret 3 5 3) + (place-fret 1 6 4 parenthesized) + (place-fret 2 3 1) + (barre 5 2 3)) + } + c1^\markup { + \override #'(fret-diagram-details . ( + (fret-label-horizontal-offset . 2) + (paren-padding . 0.25))) { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1) + (place-fret 4 5 2) + (place-fret 3 5 3) + (place-fret 1 6 4 parenthesized) + (place-fret 2 3 1) + (barre 5 2 3)) + } + } +} +@end lilypond + +@item +Se ha añadido una instrucción de marcado nueva, +@code{\justify-line}. Similar a la instrucción de marcado +@code{\fill-line} excepto que en lugar de disponer @emph{palabras} +en columnas, la instrucción @code{\justify-line} equilibra la +distancia entre ellas, haciendo que cuando hay tres o más palabras +en una instrucción de marcado, las distancias sean siempre +consistentes. + +@lilypond[quote,verbatim,papersize=a6] +\markup \fill-line {oooooo oooooo oooooo oooooo} +\markup \fill-line {ooooooooo oooooooo oo ooo} +@end lilypond + +@lilypond[quote,verbatim,papersize=a6] +\markup \justify-line {oooooo oooooo oooooo oooooo} +\markup \justify-line {ooooooooo oooooooo oo ooo} +@end lilypond + +@item +Se ha añadido la instrucción @code{\magnifyMusic}, que permite +modificar el tamaño de la notación sin alterar el tamaño del +pentagrama, mientras que se escalan automáticamente las plicas, +barras y el espaciado horizontal. +@lilypond[verbatim,quote] +\new Staff << + \new Voice \relative { + \voiceOne + 4 8. 16 8 4 r8 + } + \new Voice \relative { + \voiceTwo + \magnifyMusic 0.63 { + \override Score.SpacingSpanner.spacing-increment = #(* 1.2 0.63) + r32 c'' a c a c a c r c a c a c a c + r c a c a c a c a c a c a c a c + } + } +>> +@end lilypond + +@item +Se ha añadido una plantilla flexible adecuada para una amplia +variedad de piezas de música coral. Se puede usar para crear +música coral sencilla, con o sin acompañamiento de piano, en dos o +en cuatro pentagramas. A diferencia de otras, esta plantilla está +@q{incorporada}, lo que significa que no necesita ser copiada y +editada: en lugar de ello sencillamente se incluye con la +instrucción @code{\include} en el archivo de entrada. Para ver +más detalles, consulte @rlearning{Plantillas incorporadas}. + +@item +Se ha mejorado significativamente el posicionado de los números de +grupos especiales para las barras en forma de codo. +Anteriormente, los números de grupo especial se colocaban de +acuerdo a la posición del corchete del grupo, incluso si éste no +se imprimía. Ello podía dar lugar a números de tresillo +descolocados. Ahora se sitúan más cerca de la barra cuando hay un +segmento de barra adecuado para su colocación y cuando el corchete +no se dibuja. + +Se ha añadido también detección de colisiones, desplazando +horizontalmente si está demasiado cerca de una columna de notas +adyacente pero preservando la distancia vertical del número a la +barra acodada. Si el propio número es demasiado grande como para +caber en el espacio disponible, se usa en su lugar el sistema +original de posicionamiento basado en el corchete; en cambio, en +caso de colisión (p. ej. con una alteración accidental) el número +de tresillo se aleja moviéndolo verticalmente. + +@lilypond[verbatim,fragment,quote,relative=1] +\time 3/4 +\override Beam.auto-knee-gap = 3 +\tuplet 3/2 4 { + g8 c'' e, + c'8 g,, e'' + g,,8 e''' c,, +} +@end lilypond + +@noindent +El comportamiento original del tresillo para las barras acodadas +aún está disponible mediante una sobreescritura con la instrucción +@code{\override} a travé de la nueva propiedad +@code{knee-to-beam}. + +@lilypond[verbatim,fragment,quote,relative=1] +\time 3/4 +\override Beam.auto-knee-gap = 3 +\override TupletNumber.knee-to-beam = ##f +\tuplet 3/2 4 { + g8 c'' e, + c'8 g,, e'' + g,,8 e''' c,, +} @end lilypond -La instrucción @code{\times} con el orden de la fracción invertido -@code{@var{n}/@var{t}} aún está disponible. @item -Se introducen dos instrucciones nuevas de marcado: -@code{\draw-dashed-line} (trazar línea discontinua) y -@code{\draw-dotted-line} (trazar línea de puntos). +Se han @q{armonizado} las instrucciones @code{\lyricsto} y +@code{\addLyrics}. Ambas aceptan ahora el mismo tipo de lasta de +argumentos delimitada que aceptan @code{\lyrics} y @code{\chords}. +Se añade compatibilidad hacia atrás de manera que se permiten como +argumentos identificadores musicales (p. ej. @code{\mus}). Se ha +añadido una regla de @code{convert-ly} que elimina los usos +redundantes de @code{\lyricmode} y reorganiza las combinaciones +con iniciadores de contexto de forma que @code{\lyricsto} en +general se aplica al final (es decir, como lo haría +@code{\lyricmode}). + +@item +Las funciones e identificadores de Scheme se pueden usar ahora +como definiciones de salida. + +@item +Las expresiones de Scheme se pueden usar ahora como constituyentes +de acordes. + +@item +Espaciado visual mejorado de las cabezas de nota con formas @q{MI} +Funk y Walker pequeñas y normales, de forma que tengan la misma +anchura que otras notas con forma dentro de sus respectivos +conjuntos. Las cabezas del tipo @code{SOL} también han mejorado +visualmente cuando se usan tanto con las cabezas normales de tipo +Aiken como con las de tipo Sacred Harp, así como con las variantes +de línea delgada. + +@item +@code{LeftEdge} tiene ahora unas dimensiones verticales +@code{Y-extent} definibles. Véase @rinternals{LeftEdge}. + +@item +Se ha añadido una función nueva @code{make-path-stencil} que +contempla todas las instrucciones @code{path} tanto relativas como +absolutas: @code{lineto}, @code{rlineto}, @code{curveto}, +@code{rcurveto}, @code{moveto}, @code{rmoveto}, @code{closepath}. + +La función también contempla la sintaxis de @q{letra única} +utilizada en las instrucciones de ruta estándares del SVG: +@code{L}, @code{l}, @code{C}, @code{c}, @code{M}, @code{m}, +@code{Z} y @code{z}. + +Asimismo, la nueva instrucción es compatible hacia atrás con la +función original @code{make-connected-path-stencil}. Véase +también @file{scm/stencil.scm}. + +@item +Las propiedades de contexto nombradas en la propiedad +@samp{alternativeRestores} se restauran a su valor al comienzo de +la @emph{primera} alternativa en todas las alternativas +siguientes. + +Actualmente el conjunto predeterminado restaura el @q{compás +actual}: + +@lilypond[verbatim,fragment,quote,relative=2] +\time 3/4 +\repeat volta 2 { c2 e4 | } +\alternative { + { \time 4/4 f2 d | } + { f2 d4 | } +} +g2. | +@end lilypond @noindent -La línea discontinua se extiende sobre toda la longitud dada por -@var{destino}, si @code{full-length} está establecido al valor -@code{#t} (que es lo predeterminado) sin ningún espacio al -principio ni al final. Entonces, @code{final} se altera de forma -que quepa. Para insistir en los valores dados (o predeterminados) -para @code{inicio} y @code{final} utilice @code{\override -#'(full-length . #f)}. Son posibles ajustes manuales para -@code{inicio}, @code{final} y @code{fase}. +la @q{posición dentro del compás}: + +@lilypond[verbatim,fragment,quote,relative=2] +\time 3/4 +\repeat volta 2 { c2 e4 | } +\alternative { + { \time 4/4 + \set Timing.measurePosition = #(ly:make-moment -1/2) + f2 | } + { f2 d4 | } +} +g2. | +@end lilypond @noindent -La línea de puntos siempre se extiende a la longitud completa dada -por @var{destino}, sin ningún espacio al principio ni al final. -Es posible ajustar manualmente @code{final} para obtener espacios -mayores o menores entre los puntos. El valor dado (o -predeterminado) de @code{final} se altera de forma que corresponda -a la longitud de la línea, @code{line-length}. +y los @q{cambios de acorde}; -@lilypond[verbatim,quote] -\markup { - \draw-dashed-line #'(5.1 . 2.3) - \override #'(on . 0.3) - \override #'(off . 0.5) - \draw-dashed-line #'(5.1 . 2.3) - \draw-dotted-line #'(5.1 . 2.3) - \override #'(thickness . 2) - \override #'(off . 0.2) - \draw-dotted-line #'(5.1 . 2.3) +@lilypond[verbatim,fragment,quote] +<< + \new ChordNames { + \set chordChanges = ##t + \chordmode { c1:m d:m c:m d:m } + } + \new Staff { + \repeat volta 2 { \chordmode { c1:m } } + \alternative { + { \chordmode { d:m } } + { \chordmode { c:m } } + } + \chordmode { d:m } } +>> @end lilypond @item -A partir de la versión@tie{}2.17.10, los mensajes de error o la -@acronym{URI} de @code{textedit} que se usa para la funcionalidad -«apuntar y pulsar» especifican los números de columna empezando -en@tie{}1 en vez de en@tie{}0. El desplazamiento de bytes (que -también forma parte de las @acronym{URI}s de @code{textedit}) aún -comienza en@tie{}0. +Salida MIDI mejorada para las marcas de respiración. Después de +las notas unidas mediante una ligadura, las respiraciones toman la +duración @emph{solo} de la última nota de la ligadura; p. ej. +@code{@{ c4~ c8 \breathe @}} se ejecuta como @code{@{ c4~ c16 r +@}} en lugar de @code{@{ c4 r8 @}}. Esto es más consistente con +las articulaciones y con la forma en que los humanos interpretan +las respiraciones después de las ligaduras de unión. También hace +que ahora sea más fácil alinear varias marcas de respiración +simultáneas sobre más de una parte, aunque las notas tengan +distintas duraciones. + +@item +Se ha añadido un nuevo estilo de cabeza de nota para la tablatura: +@code{TabNoteHead.style = #'slash}. + +@item +Se ha añadido cuatro nuevos glifos de clave @emph{Doble de Sol}, +@emph{Sol de tenor}, @emph{Variante de percusión} y @emph{Variante +de Do} así como sus correspondientes formas reducidas de cambio de +clave. +@lilypond[verbatim,quote,fragment] + \override Staff.Clef.full-size-change = ##t + + \clef "GG" c c c c + \clef "tenorG" c c c c + \clef "varC" c c c c + \clef "altovarC" c c c c + \clef "tenorvarC" c c c c + \clef "baritonevarC" c c c c + \clef "varpercussion" c c c c + + \break + \override Staff.Clef.full-size-change = ##f + + \clef "GG" c c c c + \clef "tenorG" c c c c + \clef "varC" c c c c + \clef "altovarC" c c c c + \clef "tenorvarC" c c c c + \clef "baritonevarC" c c c c + \clef "varpercussion" c c c c +@end lilypond @item -La instrucción @code{\clef} contempla una transposición opcional: -@lilypond[verbatim,quote,relative=1] -\clef "treble_(8)" -c2 c -\clef "bass^[15]" -c2 c +Las duraciones aisladas en las secuencias musicales ahora tienen +el significado de notas sin altura. Esto puede ser de utilidad +para especificar duraciones de música o de funciones de Scheme. +Cuando se encuentran en la partitura final, las alturas vienen +provistas por la nota o acorde anterior. He aquí dos ejemplos en +los que se aprecia que produce una entrada más legible: + +@lilypond[verbatim,quote] +\new DrumStaff \with { \override StaffSymbol.line-count = 1 } +\drummode { + \time 3/4 + tambourine 8 \tuplet 3/2 { 16 16 16 } + 8 \tuplet 3/2 { 16 16 16 } 8 8 | +} +@end lilypond + +@lilypond[verbatim,quote] +\new Staff { r16 c'16 ~ 8 ~ 4 ~ 2 | } @end lilypond @item -Se ha hecho que la sintaxis de LilyPond de palabras separadas por -puntos @code{Voice.Accidental} sea intercambiable con -@code{#'(Voice Accidental)}, una lista de Scheme de símbolos. -Como resultado, código del estilo de -@example -\override Voice.TextSpanner #'(bound-details left text) = "rit." -@end example -ahora es equivalente a +@code{\displayLilyMusic} y sus funciones de Scheme subyacentes ya +no omiten las duraciones de nota redundantes. Ello hace que sea +más fácil reconocer correctamente y formatear las duraciones +aisladas en expresiones como @example -\override Voice.TextSpanner bound-details.left.text = "rit." -@end example -o incluso a -@example -\override #'(Voice TextSpanner) bound-details.left.text = "rit." +@{ c4 d4 8 @} @end example @item -La ruta a un grob y a una propiedad de un grob ya no requieren que -se especifiquen como dos argumentos distintos a instrucciones como -@samp{\override} y @code{\revert}, permitiendo la sintaxis -siguiente: +Las excepciones en el barrado se pueden construir ahora usando la +función de Scheme @code{\beamExceptions}. Ahora se puede escribir + +@lilypond[verbatim,quote,relative=1] +\time #'(2 1) 3/16 +\set Timing.beamExceptions = + \beamExceptions { 32[ 32] 32[ 32] 32[ 32] } +c16 c c | +\repeat unfold 6 { c32 } | +@end lilypond + +@noindent +con las diversas excepciones separadas mediante comprobaciones de +compás @code{|} (la escritura del patrón de la excepción la altura +de las notas es conveniente pero no obligatorio). Anteriormente +habría sido necesario escribir las excepciones del barrado como + @example -\override Voice.TextSpanner.bound-details.left.text = "rit." +\set Timing.beamExceptions = +#'( ;start of alist + (end . ;entry for end of beams + ( ;start of alist of end points + ((1 . 32) . (2 2 2)) ;rule for 1/32 beams -- end each 1/16 + ))) @end example -Dado que las funciones musicales complementarias como -@samp{\overrideProperty} no contemplan formas con y sin espacios -de separación al mismo tiempo, la utillización de una sola ruta -con puntos es ahora la forma de preferencia. La especificación -separada de la ruta de un grob y de la propiedad del grob, -contemplada aún por parte de @samp{\override} y de @samp{\revert} -por motivos de compatibilidad, se considera ahora obsoleta. - -@item -Debido a que dos palabras se aceptan ahora como símbolos que son -argumentos de función, las interfaces de @samp{\accidentalStyle}, -@samp{\alterBroken}, @samp{\footnote} y @samp{\tweak} han tenido -que ser rediseñadas allí donde estaban implicados símbolos que -eran argumentos opcionales. Compruebe la documentación de la -función respectiva para ver los detalles. - -@item -Varias instrucciones aceptan ahora listas de símbolos -(introducidas convenientemente como palabras separadas por puntos) -para diversos tipos de argumentos. Entre ellos se encuentran -@samp{\accidentalStyle}, @samp{\alterBroken}, @samp{\footnote}, -@samp{\hide}, @samp{\omit}, @samp{\overrideProperty}, -@samp{\shape} y @samp{\tweak}. - -@item -Se ha modificado la interfaz de usuario de las líneas divisorias. -Los glifos de barra de compás ahora se asemejan al aspecto de los -caracteres utilizados para expresar el tipo de barra, de manera -que un signo de repetición por la izquierda se debe codificar como -@code{.|:}. La instrucción @code{\defineBarLine} provee una -manera sencilla de definir estilos adicionales de línea divisoria. - -@item -Las alteraciones accidentales en la armadura de la tonalidad se -pueden imprimir en distinta octava de las posiciones -tradicionales, o en más de una octava. -@lilypond[quote,relative=0] -\override Staff.KeySignature #'flat-positions = #'((-5 . 5)) -\override Staff.KeyCancellation #'flat-positions = #'((-5 . 5)) -\clef bass \key es \major es g bes d -\clef treble \bar "||" \key es \major es g bes d -\override Staff.KeySignature #'sharp-positions = #'(2) -\bar "||" \key d \major b fis b2 -@end lilypond + +@item +Las articulaciones más comunes se reflejan ahora en la salida +MIDI. El acento y el marcato hacen a las notas sonar más fuerte; +el picado, el staccato, el staccatissimo y el portato las hacen +más cortas. Las marcas de respiración acortan la nota anterior. + +Este comportamiento se puede personalizar a través de las +propiedades @code{midiLength} @code{midiExtraVelocity} sobre +@code{ArticulationEvent}. Para ver ejemplos, consulre +@file{script-init.ly}. + +@item +La funcionalidad de PostScript del ajuste del trazo ya no se +aplica automáticamente, sino que se deja a la discreción del +dispositivo PostScript (de forma predeterminada, Ghostscript lo +usa para las resoluciones de hasta 150 ppp al generar imagenes de +matriz de puntos). Cuando se activa, se emplea (principalmente +para las plicas y las líneas divisorias) un algoritmo de trazado +más complejo diseñado para sacar provecho del ajuste del trazo. + +El ajuste del trazo se puede forzar especificando la opción de +línea de órdenes @samp{-dstrokeadjust} al llamar a LilyPond. +CUando se generan archivos @code{PDF}, ello dará lugar por lo +general a vistas previas de @code{PDF} con un aspecto marcadamente +mejorado pero un tamaño de archivo significativamente mayor. La +calidad de impresión en resoluciones altas no resulta afectada. @end itemize @ifhtml Para ver noticias anteriores, diríjase a +@uref{http://lilypond.org/doc/v2.18/Documentation/changes/}, @uref{http://lilypond.org/doc/v2.16/Documentation/changes/}, -@uref{http://lilypond.org/doc/v2.14/Documentation/changes/}, o @uref{../,vuelva} al índice de la documentación. diff --git a/Documentation/es/essay.tely b/Documentation/es/essay.tely index 4b8372865b..913940c7f0 100644 --- a/Documentation/es/essay.tely +++ b/Documentation/es/essay.tely @@ -1,6 +1,6 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 08560a1b8076630c4fc6cb9b902614d8b74fd6fc + Translation of GIT committish: 47db9a3883d726ca53e2133a3b2298f78dd6a32e When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -20,9 +20,14 @@ Este ensayo trata de las funciones de grabado musical automatizado dentro de LilyPond version @version{}. @end macro -@c `Essay' was born 2002-06-03 with git commit e38f5fc... +@c `Essay' was born 2002-06-03 with this commit: +@c tremolo segfault +@c author: Han-Wen Nienhuys +@c commit: 29262ca70c3d5209126150752fd3d804bef8e9a3 +@c file: Documentation/user/introduction.itely + @macro copyrightDeclare -Copyright @copyright{} 2002--2012 por los autores. +Copyright @copyright{} 2002--2015 por los autores. @end macro @set FDL diff --git a/Documentation/es/essay/engraving.itely b/Documentation/es/essay/engraving.itely index 46431c73f7..1c849fcf3a 100644 --- a/Documentation/es/essay/engraving.itely +++ b/Documentation/es/essay/engraving.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 7ec0c02a1520974682d2e3e3aa2dd59a1a05988d + Translation of GIT committish: 791d125bd2f98f1be6b7742bfedd981b5895c0c1 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.24" @node Grabado musical @chapter Grabado musical @@ -483,15 +483,11 @@ ejemplo anterior: A tamaños más pequeños, LilyPond utiliza líneas proporcionalmente más gruesas de manera que la música siga leyéndose con comodidad. -@ignore This also allows staves of different sizes to coexist peacefully when used together on the same page: -@c TODO: are the stems in this example the right thickness? How should -@c line weights be scaled for small staves? - @c Grieg's Violin Sonata Op. 45 -@lilypond[indent=1.5cm] +@lilypond[indent=1.5\cm] global = { \time 6/8 \key c \minor @@ -500,26 +496,24 @@ global = { \score { << \new Staff \with { - fontSize = #-4 - \override StaffSymbol.staff-space = #(magstep -4) - \override StaffSymbol.thickness = #(magstep -3) + \magnifyStaff #2/3 } - \relative c' { + \relative { \global \set Staff.instrumentName = #"Violin" - c8.(\f^> b16 c d) ees8.(^> d16 c b) + c'8.(\f^> b16 c d) ees8.(^> d16 c b) g8.(^> b16 c ees) g8-.^> r r R2. } \new PianoStaff << \set PianoStaff.instrumentName = #"Piano" - \new Staff \relative c' { + \new Staff \relative { \global s2. - s4. s8 r8 r16 + s4. s8 r8 r16 4.^> 8 r r } - \new Staff \relative c { + \new Staff \relative { \global \clef "bass" << @@ -539,7 +533,6 @@ global = { >> } @end lilypond -@end ignore @node ¿Para qué tanto esfuerzo? @unnumberedsubsec ¿Para qué tanto esfuerzo? @@ -607,7 +600,7 @@ comparaciones detalladas con grabados de música reales. de las tres configuraciones elegiríamos para la siguiente ligadura? @lilypond -\relative c { +\relative { \clef bass \once \override Slur.positions = #'(1.5 . 1) e8[( f] g[ a b d,)] r4 @@ -651,7 +644,7 @@ ligadura, y LilyPond ha otorgado una puntuación a cada una en rozar la cabeza de una de las figuras: @lilypond -\relative c { +\relative { \clef bass \once \override Slur.positions = #'(1.5 . 1) e8[(_"15.39" f] g[ a b d,)] r4 @@ -665,7 +658,7 @@ asciende mientras la melodía desciende, dando un total de 13.08 puntos de fealdad: @lilypond -\relative c { +\relative { \clef bass \once \override Slur.positions = #'(2 . 3) e8[(_"13.08" f] g[ a b d,)] r4 @@ -677,7 +670,7 @@ puntos por la inclinación hacia arriba, pero es la más atractiva de las tres configuraciones, así que LilyPond selecciona ésta: @lilypond -\relative c { +\relative { \clef bass e8[(_"12.04" f] g[ a b d,)] r4 } @@ -801,10 +794,10 @@ Para nuestra comparación elegimos la fuga en Sol menor del Clave bien temperado de Bach, libro I, BWV 861, cuyo sujeto inicial es @lilypond -\relative c' { +\relative { \key g \minor \clef "treble_8" - r8 d ees g, fis4 g + r8 d' ees g, fis4 g r8 a16 bes c8 bes16 a bes8 } @end lilypond @@ -838,24 +831,24 @@ LilyPond en segundo: @lilypond[staffsize=19.5,line-width=14\cm] global = { \key g \minor } -partI = \relative c' { +partI = \relative { \voiceOne - fis8 d' ees g, fis4 g + fis'8 d' ees g, fis4 g r8 a16 bes c8 bes16 a d8 r r4 } -partII = \relative c' { +partII = \relative { \voiceTwo - d4 r4 r8 d'16 c bes8 c16 d + d'4 r4 r8 d'16 c bes8 c16 d ees8 d c ees a, r r4 } -partIII = \relative c' { +partIII = \relative { \voiceOne - r2 r8 d ees g, fis4 g r8 a16 bes c8 bes16 a + r2 r8 d' ees g, fis4 g r8 a16 bes c8 bes16 a } -partIV = \relative c { +partIV = \relative { \voiceTwo d4 r r2 r8 d ees g, fis4 a @@ -922,7 +915,7 @@ collide = \once \override NoteColumn.force-hshift = #0 \new Voice { \voiceTwo bes \collide bes } >> } - \new Lyrics \lyricsto "sample" \lyricmode { "bien " " mal" } + \new Lyrics \lyricsto "sample" { "bien " " mal" } >> } @end lilypond @@ -1048,8 +1041,8 @@ otra forma podríamos introducir piezas complejas como sinfonías u musicales: combinando pequeños fragmentos de música dentro de otros más grandes, se puede expresar una música más compleja. Por ejemplo: -@lilypond[quote,verbatim,fragment,relative=1] -f4 +@lilypond[quote,verbatim,fragment] +f'4 @end lilypond @noindent @@ -1113,12 +1106,12 @@ la notación musical: @lilypond[quote,fragment] << - \new Staff \relative c'' { + \new Staff \relative { \key g \major \time 3/4 - d4 g,8 a b c d4 g, g + d''4 g,8 a b c d4 g, g } - \new Staff \relative c' { + \new Staff \relative { \clef "bass" \key g \major 2 a4 b2. @@ -1159,16 +1152,16 @@ aparente si tenemos en cuenta un ejemplo musical más complejo: \new PianoStaff << \new Staff = "RH" << - \new Voice = "I" \relative c''' { + \new Voice = "I" \relative { \time 3/4 \voiceOne - \tuplet 7/6 { g8 g g g g g g } + \tuplet 7/6 { g''8 g g g g g g } \oneVoice r4 r4\fermata } - \new Voice = "II" \relative c' { + \new Voice = "II" \relative { \voiceTwo - c4 + c'4 \tuplet 5/4 { 8 f g \change Staff = "LH" \oneVoice @@ -1180,7 +1173,7 @@ aparente si tenemos en cuenta un ejemplo musical más complejo: } >> \new Staff = "LH" << - \new Voice = "III" \relative c' { + \new Voice = "III" \relative { \time 2/4 \clef "bass" g4 \stopStaff s @@ -1465,8 +1458,8 @@ tiene todas las direcciones hacia arriba (o hacia la derecha). @lilypond[quote,ragged-right] \score { - \relative c' { - \stemDown 4_>-\arpeggio + \relative { + \stemDown 4_>-\arpeggio \override Arpeggio.direction = #RIGHT \stemUp 4^>-\arpeggio } @@ -1536,11 +1529,11 @@ a lo largo del fragmento musical. ((-2) (make-smaller-markup (make-bold-markup "2"))) (else "bla"))))))))) -\new Voice \relative c' { +\new Voice \relative { \stemUp \set autoBeaming = ##f \time 2/4 - 4 + 4 \once \override NoteHead.stencil = #note-head::brew-ez-stencil \once \override NoteHead.font-size = #-7 \once \override NoteHead.font-family = #'sans @@ -1548,11 +1541,11 @@ a lo largo del fragmento musical. 4 \once \override NoteHead.style = #'cross 4 - \applyOutput #'Voice #mc-squared + \applyOutput Voice #mc-squared 4 << { d8[ es-( fis^^ g] fis2-) } - \repeat unfold 5 { \applyOutput #'Voice #mc-squared s8 } + \repeat unfold 5 { \applyOutput Voice #mc-squared s8 } >> } @end lilypond @@ -1588,9 +1581,9 @@ hoja guía de acordes. << \chords { c2 c f2 c } \new Staff - \relative c' { + \relative { \time 2/4 - c4 c g' g a a g2 + c'4 c g' g a a g2 } \addlyrics { Cam -- pa ni -- ta del lu -- gar } >> @@ -1767,42 +1760,42 @@ LilyPond, versión @version{}: @lilypond[staffsize=14.3,line-width=15.9\cm] global = {\key g \minor} -partI = \relative c' { +partI = \relative { \voiceOne - fis8 d' ees g, fis4 g + fis'8 d' ees g, fis4 g r8 a16 bes c8 bes16 a d8 r r4 r2 r8 d16 ees f8 ees16 d - ees4 ~ ees16 d c bes a4 r8 ees'16 d + ees4 ~ 16 d c bes a4 r8 ees'16 d c8 d16 ees d8 e16 fis g8 fis16 g a4 ~ - a8 d, g f ees d c bes + 8 d, g f ees d c bes a2 g\fermata \bar "|." } -partII = \relative c' { +partII = \relative { \voiceTwo - d4 r4 r8 d'16 c bes8 c16 d + d'4 r4 r8 d'16 c bes8 c16 d ees8 d c ees a, r r4 r8 fis16 g a8 g16 fis g2 ~ - g2 r8 d' ees g, + 2 r8 d' ees g, fis4 g r8 a16 bes c8 bes16 a bes4. 8 r r 4 d2 } -partIII = \relative c' { +partIII = \relative { \voiceOne - r2 r8 d ees g, fis4 g r8 a16 bes c8 bes16 a - bes2 ~ bes8 b16 a g8 a16 b + r2 r8 d' ees g, fis4 g r8 a16 bes c8 bes16 a + bes2 ~ 8 b16 a g8 a16 b c4 r r2 R1 r8 d ees g, fis4 g r8 a16 bes c8 bes16 a b2 } -partIV = \relative c { +partIV = \relative { \voiceTwo d4 r r2 r8 d ees g, fis4 a d,8 d'16 c bes8 c16 d ees2 ~ - ees8 ees16 d c8 d16 ees fis,8 a16 g fis8 g16 a + 8 ees16 d c8 d16 ees fis,8 a16 g fis8 g16 a d,8 d'16 c bes8 c16 d ees8 c a fis' g f ees d c bes a g c a d d, g2\fermata diff --git a/Documentation/es/essay/literature.itely b/Documentation/es/essay/literature.itely index a54923d7f6..b9080bb7d2 100644 --- a/Documentation/es/essay/literature.itely +++ b/Documentation/es/essay/literature.itely @@ -1,7 +1,7 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 26a079ca2393d053315ef8dbef626c897dc9645a + Translation of GIT committish: d2a84c5798a7568cd3c73ca4f4a23bca704c8608 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -30,7 +30,6 @@ Si tiene necesidad de aprender más acerca de la notación musical, le presentamos a continuación algunos títulos interesantes que puede leer. - @table @cite @item Ignatzek 1995 Klaus Ignatzek, Die Jazzmethode für Klavier. Schott's Söhne @@ -40,13 +39,23 @@ Instructiva introducción a la interpretación de Jazz al piano. Uno de los pri capítulos contiene una panorámica de los acordes más comunes de la música de Jazz. @item Gerou 1996 - Tom Gerou and Linda Lusk, Essential Dictionary of Music Notation. Alfred Publishing, Van Nuys CA ISBN 0-88284-768-6. Una lista concisa y ordenada alfabéticamente de los problemas de la composición tipográfica y la notación musical, que abarca la mayor parte de los casos más comunes. +@item Gould 2011 +Elaine Gould, Behind Bars: the Definitive Guide to Music Notation. +Faber Music Ltd. ISBN 0-571-51456-1. + +Hals über Kopf: Das Handbuch des Notensatzes. +Edition Peters. ISBN 1843670488. + +Una completa guía de las reglas y convenciones de la notación musical +que cubre todo desde los temas básicos hasta las técnicas más complejas y +ofrece una fundamentación exhaustiva de los principios notacionales. + @item Read 1968 Gardner Read, Music Notation: A Manual of Modern Practice. Taplinger Publishing, New York (2nd edition). diff --git a/Documentation/es/extending.tely b/Documentation/es/extending.tely index 9d7b9071a5..63697fa0e8 100644 --- a/Documentation/es/extending.tely +++ b/Documentation/es/extending.tely @@ -1,6 +1,6 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 08560a1b8076630c4fc6cb9b902614d8b74fd6fc + Translation of GIT committish: 47db9a3883d726ca53e2133a3b2298f78dd6a32e When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -20,9 +20,14 @@ Este archivo explica la forma de extender las funcionalidades de LilyPond versión @version{}. @end macro -@c `Extending' was born 2003-04-23 with git commit c08f6e8... +@c `Extending' was born 2004-03-07 with this commit: +@c * Documentation/user/changing-defaults.itely (Changing defaults): +@c author: Han-Wen Nienhuys +@c commit: c53d0cabdf9361e448cdd02a338aa5d696f4f466 +@c file: Documentation/user/programming-interface.itely + @macro copyrightDeclare -Copyright @copyright{} 2003--2012 por los autores. +Copyright @copyright{} 2003--2015 por los autores. @end macro @set FDL diff --git a/Documentation/es/extending/programming-interface.itely b/Documentation/es/extending/programming-interface.itely index 9130771ab4..b2552e8eb6 100644 --- a/Documentation/es/extending/programming-interface.itely +++ b/Documentation/es/extending/programming-interface.itely @@ -1,21 +1,21 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @c This file is part of extending.tely @ignore - Translation of GIT committish: 41c8bf63a7cc180746eace9b9e5278f541be0229 + Translation of GIT committish: 708aa920d682cf9aa3ed647cd129afd8509760f4 When revising a translation, copy the HEAD committish of the version that you are working on. See TRANSLATION for details. @end ignore -@c \version "2.17.6" +@c \version "2.19.24" @node Interfaces para programadores @chapter Interfaces para programadores @translationof Interfaces for programmers -Se pueden realizar trucos avanzados mediante el uso de Scheme. Si no -está familiarizado con Scheme, le conviene leer nuestro tutorial de -Scheme, @ref{Tutorial de Scheme}. +Se pueden realizar trucos avanzados mediante el uso de Scheme. +Si no está familiarizado con Scheme, le conviene leer nuestro +tutorial de Scheme, @ref{Tutorial de Scheme}. @menu @@ -26,7 +26,6 @@ Scheme, @ref{Tutorial de Scheme}. * Funciones de marcado:: * Contextos para programadores:: * Funciones de callback:: -* Código de Scheme en línea:: * Trucos difíciles:: @end menu @@ -40,12 +39,12 @@ Scheme, @ref{Tutorial de Scheme}. @funindex $ @funindex # -La creación de expresiones musicales en Scheme puede ser una tarea -tediosa porque a veces presentan muchos niveles de profundidad de -anidamiento y el código resultante es grande. Para algunas tareas -sencillas, esto puede evitarse utilizando bloques de código de -LilyPond, que permiten usar la sintaxis ordinaria de LilyPond -dentro de Scheme. +La creación de expresiones musicales en Scheme puede ser una +tarea tediosa porque a veces presentan muchos niveles de +profundidad de anidamiento y el código resultante es grande. +Para algunas tareas sencillas, esto puede evitarse utilizando +bloques de código de LilyPond, que permiten usar la sintaxis +ordinaria de LilyPond dentro de Scheme. Los bloques de código de LilyPond tienen el siguiente aspecto: @example @@ -55,7 +54,7 @@ Los bloques de código de LilyPond tienen el siguiente aspecto: He aquí un ejemplo trivial: @lilypond[verbatim,quote] -ritpp = #(define-event-function (parser location) () +ritpp = #(define-event-function () () #{ ^"rit." \pp #} ) @@ -68,15 +67,12 @@ Scheme en efecto se modifica para que pueda incorporar bloques de código de LilyPond y pueda ocuparse de las expresiones de Scheme incrustadas que comienzan por @code{$} y@w{ }@code{#}. -@cindex parser (function argument) -@cindex location - El lector extrae el bloque de código de LilyPond y genera una llamada en tiempo de ejecución al analizador sintáctico para que interprete el código de LilyPond. Las expresiones de Scheme -incrustadas en el código de LilyPond se evalúan dentro del entorno -lóexico del bloque de código de LilyPond, de manera que puede -accederse a todas las variables locales y los parámetros de +incrustadas en el código de LilyPond se evalúan dentro del +entorno lóexico del bloque de código de LilyPond, de manera que +puede accederse a todas las variables locales y los parámetros de función que están disponibles en el punto en que se escribe el bloque de código de LilyPond. Las variables definidas en otros módulos de Scheme, como los módulos que contienen bloques @@ -85,31 +81,30 @@ variables de Scheme, es decir, precedidas de@tie{}@code{#}, pero se puede acceder a ellas como variables de LilyPond, es decir, precedidas de@tie{}@code{\}. -Si @code{location} (véase @ref{Funciones de Scheme}) se refiere a una -posición de entrada válida (como lo hace normalmente dentro de las -funciones musicales o de Scheme), toda la música generada dentro -del bloque de código tiene su @samp{origin} establecido a -@code{location}. +Toda la música generada dentro del bloque de código tiene su +@samp{origin} establecido a la localización actual del puntero de +entrada. Un bloque de código de LilyPond puede contener cualquier cosa que -podríamos utilizar en la parte derecha de una asignación. Además, un -bloque de LilyPond vacío corresponde a una expresión musical vacía, y -un bloque de LilyPond que contiene varios eventos musicales se -convierte en una expresión de música secuencial. +podríamos utilizar en la parte derecha de una asignación. +Además, un bloque de LilyPond vacío corresponde a una expresión +musical vacía, y un bloque de LilyPond que contiene varios +eventos musicales se convierte en una expresión de música +secuencial. @node Funciones de Scheme @section Funciones de Scheme @translationof Scheme functions @cindex Scheme, funciones de (sintaxis de LilyPond) -Las @emph{funciones de Scheme} son procedimientos de Scheme que pueden -crear expresiones de Scheme a partir de código de entrada escrito en -la sintaxis de LilyPond. Se pueden llamar desde prácticamente -cualquier lugar en el que se permita el uso de @code{#} para la -especificación de un valor en sintaxis de Scheme. Mientras que Scheme -tiene funciones propias, este capítulo se ocupa de las funciones -@emph{sintácticas}, funciones que reciben argumentos especificados en -la sintaxis de LilyPond. +Las @emph{funciones de Scheme} son procedimientos de Scheme que +pueden crear expresiones de Scheme a partir de código de entrada +escrito en la sintaxis de LilyPond. Se pueden llamar desde +prácticamente cualquier lugar en el que se permita el uso de +@code{#} para la especificación de un valor en sintaxis de +Scheme. Mientras que Scheme tiene funciones propias, este +capítulo se ocupa de las funciones @emph{sintácticas}, funciones +que reciben argumentos especificados en la sintaxis de LilyPond. @menu * Definición de funciones de Scheme:: @@ -127,7 +122,7 @@ La forma general de la definición de una función de Scheme es: @example funcion = #(define-scheme-function - (parser location @var{arg1} @var{arg2} @dots{}) + (@var{arg1} @var{arg2} @dots{}) (@var{tipo1?} @var{tipo2?} @dots{}) @var{cuerpo}) @end example @@ -136,98 +131,82 @@ funcion = donde @multitable @columnfractions .33 .66 -@item @code{parser} -@tab tiene que ser literalmente @code{parser} para dar a los bloques de código -de LilyPond (@code{#@{}@dots{}@code{#@}}) acceso al analizador -sintáctico. - -@item @code{location} -@tab tiene que ser literalmente @code{location} para ofrecer acceso al -objeto de situación de la entrada, que se usa para ofrecer -menssajes de error con nombres de archivo y números de línea. - @item @code{@var{argN}} -@tab @var{n}-ésimo argumento +@tab @var{n}-ésimo argumento. @item @code{@var{typeN?}} -@tab un @emph{predicado de tipo} de Scheme para el que @code{@var{argN}} -debe devolver @code{#t}. - -También existe una forma especial @code{(@emph{predicate?} -@emph{default})} para especificar argumentos opcionales. Si el -argumento actual no está presente cuando se ll ama a la función, el -valor predeterminado se emplea en sustitución. Los valores -predeterminados se evalúan en tiempo de definición (¡incluyendo los -bloques de código de LilyPond!), de manera que se necesitamos un valor -por omisión calculado en tiempo de ejecución, debemos escribir en su -lugar un valor especial que podamos reconocer fácilmente. Si -escribimos el predicado entre paréntesis pero no lo seguimos por el -valor predeterminado, se usa @code{#f} como valor por omisión. Los -valores por omisión no se verifican con @emph{predicate?} en tiempo de -definición ni en tiempo de ejecución: es nuestra responsabilidad -tratar con los valores que especifiquemos. Los valores por omisión -que son expresiones musicales se copian mientras se establece -@code{origin} al parámetro @code{location}. +@tab Un @emph{predicado de tipo} de Scheme para el que @code{@var{argN}} +debe devolver @code{#t}. También existe una forma especial +@code{(@emph{predicate?} @emph{default})} para especificar +argumentos opcionales. Si el argumento actual no está presente +cuando se ll ama a la función, el valor predeterminado se emplea +en sustitución. Los valores predeterminados se evalúan en tiempo +de definición (¡incluyendo los bloques de código de LilyPond!), +de manera que se necesitamos un valor por omisión calculado en +tiempo de ejecución, debemos escribir en su lugar un valor +especial que podamos reconocer fácilmente. Si escribimos el +predicado entre paréntesis pero no lo seguimos por el valor +predeterminado, se usa @code{#f} como valor por omisión. Los +valores por omisión no se verifican con @emph{predicate?} en +tiempo de definición ni en tiempo de ejecución: es nuestra +responsabilidad tratar con los valores que especifiquemos. Los +valores por omisión que son expresiones musicales se copian +mientras se establece @code{origin} a la ubicación actual del +cursor de entrada. @item @code{@var{cuerpo}} @tab una secuencia de formas de Scheme que se evalúan ordenadamente; la -última forma de la secuencia se usa como el valor de retorno de la -función de Scheme. Puede contener bloques de código de LilyPond -encerrados entre llaves con almohadillas +última forma de la secuencia se usa como el valor de retorno de +la función de Scheme. Puede contener bloques de código de +LilyPond encerrados entre llaves con almohadillas (@tie{}@w{@code{#@{@dots{}#@}}}@tie{}), como se describe en -@ref{Bloques de código de LilyPond}. Dentro de los bloques de código -de LilyPond, use el símbolo @code{#} para hacer referencia a -argumentos de función (p.ej. @samp{#arg1}) o para iniciar una +@ref{Bloques de código de LilyPond}. Dentro de los bloques de +código de LilyPond, use el símbolo @code{#} para hacer referencia +a argumentos de función (p.ej. @samp{#arg1}) o para iniciar una expresión en línea de Scheme que contenga argumentos de función -(p.ej. @w{@samp{#(cons arg1 arg2)}}). Donde las expresiones de Scheme -normales que usan @code{#} no funcionan, podríamos necesitar volver a -expresiones de Scheme inmediatas que usan @code{$}, como por ejemplo -@samp{$music}. +(p.ej. @w{@samp{#(cons arg1 arg2)}}). Donde las expresiones de +Scheme normales que usan @code{#} no funcionan, podríamos +necesitar volver a expresiones de Scheme inmediatas que usan +@code{$}, como por ejemplo @samp{$music}. -Si nuestra función devuelve una expresión musical, recibe un valor -@code{origin} útil. +Si nuestra función devuelve una expresión musical, recibe un +valor @code{origin} útil. @end multitable @noindent -La idoneidad de los argumentos para los predicados viene determinada -mediante llamadas reales al predicado después de que LilyPond ya las -ha convertido en una expresión de Scheme. Como consecuencia, el -argumento se puede especificar en la sintaxis de Scheme si se desea -(precedido de @code{#} o como resultado de haber llamado a una función -de Scheme), pero LilyPond también convierte algunas construcciones de -LilyPond en Scheme antes de hacer efectivamente la comprobación del -predicado sobre ellas. Actualmente se encuentran entre ellas la -música, los post-eventos, las cadenas simples (entrecomilladas o no), -los números, los elementos de marcado y de listas de marcado, score -(partitura), book (libro), bookpart (parte de libro), las definiciones -de contexto y los bloques de definición de salida. - -Para ciertos tipos de expresión (como la mayor parte de la música que -no está encerrada entre llaves) LilyPond necesita más allá de la -expresión misma para poder determinar su final. Si tal expresión se -considerase un argumento opcional mediante la evaluación de su -predicado, LilyPond no podría recuperarse después de decidir que la -expresión no se corresponde con el parámetro. Así, ciertas formas de -música necesitan ir encerradas entre llaves para poder considerarlas -como aceptables bajo algunas circunstancias. LilyPond resuelve -algunas otras ambigüedades mediante la comprobación con funciones de -predicado: ¿es @samp{-3} un post-evento de digitación o un número -negativo? ¿Es @code{"a" 4} en el modo de letra una cadena seguida por -un número, o un evento de letra con la duración @code{4}? LilyPond -prueba el predicado del argumento sobre diversas interpretaciones -sucesivas hasta que lo consigue, con un orden diseñado para minimizar -las interpretaciones poco consistentes y la lectura por adelantado. - -Por ejemplo, un predicado que acepta tanto expresiones musicales como -alturas consideraría que @code{c''} es una altura en lugar de una -expresión musical. Las duraciones o post-eventos que siguieran -inmediatamente podrían no funcionar con dicha interpretación. Así -pues, es mejor evitar los predicados excesivamente permisivos como -@code{scheme?} cuando la aplicación requeriría tipos de argumento más -específicos. - -Para ver una lista de los predicados de tipo disponibles, consulte -@ruser{Predicados de tipo predefinidos}. +La idoneidad de los argumentos para los predicados viene +determinada mediante llamadas reales al predicado después de que +LilyPond ya las ha convertido en una expresión de Scheme. Como +consecuencia, el argumento se puede especificar en la sintaxis de +Scheme si se desea (precedido de @code{#} o como resultado de +haber llamado a una función de Scheme), pero LilyPond también +convierte algunas construcciones de LilyPond en Scheme antes de +hacer efectivamente la comprobación del predicado sobre ellas. +Actualmente se encuentran entre ellas la música, los +post-eventos, las cadenas simples (entrecomilladas o no), los +números, los elementos de marcado y de listas de marcado, score +(partitura), book (libro), bookpart (parte de libro), las +definiciones de contexto y los bloques de definición de salida. + +LilyPond resuelve algunas ambigüedades mediante la comprobación +con funciones de predicado: ¿es @samp{-3} un post-evento de +digitación o un número negativo? ¿Es @code{"a" 4} en el modo de +letra una cadena seguida por un número, o un evento de letra con +la duración @code{4}? LilyPond prueba el predicado del argumento +sobre diversas interpretaciones sucesivas hasta que lo consigue, +con un orden diseñado para minimizar las interpretaciones poco +consistentes y la lectura por adelantado. + +Por ejemplo, un predicado que acepta tanto expresiones musicales +como alturas consideraría que @code{c''} es una altura en lugar +de una expresión musical. Las duraciones o post-eventos que +siguen inmediatamente, cambian dicha interpretación. Es mejor +evitar los predicados excesivamente permisivos como +@code{scheme?} cuando la aplicación requeriría tipos de argumento +más específicos. + +Para ver una lista de los predicados de tipo disponibles, +consulte @ruser{Predicados de tipo predefinidos}. @seealso @@ -244,40 +223,50 @@ Archivos instalados: @subsection Uso de las funciones de Scheme @translationof Scheme function usage -Las funciones de Scheme se pueden llamar casi desde cualquier lugar en -que puede escribirse una expresión de Scheme que comience con la -almohadilla@tie{}@code{#}. Llamamos a una función de Scheme -escribiendo su nombre precedido de la barra invertida@tie{}@code{\}, y -seguido por sus argumentos. Una vez que un argumento opcional no -corresponde a ningún argumento, LilyPond se salta este argumento y -todos los que le siguen, sustituyéndolos por su valor por omisión -especificado, y @q{recupera} el argumento que no correspondía al lugar -del siguiente argumento obligatorio. Dado que el argumento recuperado -necesita ir a algún lugar, los argumentos opcionales no se consideran -realmente opcionales a no ser que vayan seguidos de un argumento -obligatorio. - -Existe una excepción: si escribimos @code{\default} en el lugar de un -argumento opcional, este argumento y todos los argumentos opcionales -que le siguen se saltan y se sustituyen por sus valores -predeterminados. Esto funciona incluso si no sigue ningún argumento -obligatorio porque @code{\default} no necesita recuperarse. Las -instrucciones @code{mark} y @code{key} hacen uso de este truco para -ofrecer su comportamiento predeterminado cuando van seguidas solamente -por @code{\default}. +Las funciones de Scheme se pueden llamar casi desde cualquier +lugar en que puede escribirse una expresión de Scheme que +comience con la almohadilla@tie{}@code{#}. Llamamos a una +función de Scheme escribiendo su nombre precedido de la barra +invertida@tie{}@code{\}, y seguido por sus argumentos. Una vez +que un argumento opcional no corresponde a ningún argumento, +LilyPond se salta este argumento y todos los que le siguen, +sustituyéndolos por su valor por omisión especificado, y +@q{recupera} el argumento que no correspondía al lugar del +siguiente argumento obligatorio. Dado que el argumento +recuperado necesita ir a algún lugar, los argumentos opcionales +no se consideran realmente opcionales a no ser que vayan seguidos +de un argumento obligatorio. + +Existe una excepción: si escribimos @code{\default} en el lugar +de un argumento opcional, este argumento y todos los argumentos +opcionales que le siguen se saltan y se sustituyen por sus +valores predeterminados. Esto funciona incluso si no sigue +ningún argumento obligatorio porque @code{\default} no necesita +recuperarse. Las instrucciones @code{mark} y @code{key} hacen +uso de este truco para ofrecer su comportamiento predeterminado +cuando van seguidas solamente por @code{\default}. Aparte de los lugares en que se requiere un valor de Scheme hay -ciertos sitios en que se aceptan expresiones de almohadilla @code{#} y -se evalúan por sus efectos secundarios, pero por lo demás se ignoran. -Son, mayormente, los lugares en que también sería aceptable colocar -una asignación. - -Dado que no es buena idea devolver valores que puedan malinterpretarse -en algún contexto, debería usar funciones de Scheme normales solo para -los casos en que siempre se devuelve un valor útil, y usar funciones -de Scheme vacías (@pxref{Funciones de Scheme vacías}) en caso -contrario. - +ciertos sitios en que se aceptan expresiones de almohadilla +@code{#} y se evalúan por sus efectos secundarios, pero por lo +demás se ignoran. Son, mayormente, los lugares en que también +sería aceptable colocar una asignación. + +Dado que no es buena idea devolver valores que puedan +malinterpretarse en algún contexto, debería usar funciones de +Scheme normales solo para los casos en que siempre se devuelve un +valor útil, y usar funciones de Scheme vacías (@pxref{Funciones +de Scheme vacías}) en caso contrario. + +Por conveniencia, las funciones de Scheme también se pueden +llamar directamente desde Scheme, puenteando al analizador +sintáctico de LilyPond. Su nombre puede utilizarse como el +nombre de una función corriente. La comprobación de tipo de los +argumentos y el salto de los argumentos opcionales tiene lugar de +la misma forma que cuando se llama desde dentro de LilyPond, +tomando el valor de Scheme @code{*unspecified*} el papel de la +palabra reservada @code{\default} para saltar explícitamente +argumentos opcionales. @node Funciones de Scheme vacías @subsection Funciones de Scheme vacías @@ -285,19 +274,20 @@ contrario. @funindex define-void-function @funindex \void -En ocasiones, un procedimiento se ejecuta con el objeto de llevar a -cabo alguna acción más que para devolver un valor. Algunos lenguajes -de programación (como C y Scheme) usan las funciones para los dos -conceptos y se limitan a descartar el valor devuelto (usualmente -haciendo que cualquier expresión pueda actuar como instrucción, -ignorando el resultado devuelto). Esto puede parecer inteligente pero -es propenso a errores: casi todos los compiladores de C de hoy en día -emiten advertencias cuando se descarta una expresión no vacía. Para -muchas funciones que ejecutan una acción, los estándares de Scheme -declaran que el valor de retorno sea no especificado. Guile, el -intérprete de Scheme de LilyPond, tiene un valor único -@code{*unspecified*} que en tales casos devuelve de forma usual (como -cuando se usa directamente @code{set!} sobre una variable), pero +En ocasiones, un procedimiento se ejecuta con el objeto de llevar +a cabo alguna acción más que para devolver un valor. Algunos +lenguajes de programación (como C y Scheme) usan las funciones +para los dos conceptos y se limitan a descartar el valor devuelto +(usualmente haciendo que cualquier expresión pueda actuar como +instrucción, ignorando el resultado devuelto). Esto puede +parecer inteligente pero es propenso a errores: casi todos los +compiladores de C de hoy en día emiten advertencias cuando se +descarta una expresión no vacía. Para muchas funciones que +ejecutan una acción, los estándares de Scheme declaran que el +valor de retorno sea no especificado. Guile, el intérprete de +Scheme de LilyPond, tiene un valor único @code{*unspecified*} que +en tales casos devuelve de forma usual (como cuando se usa +directamente @code{set!} sobre una variable), pero desgraciadamente no de forma consistente. Definir una función de LilyPond con @code{define-void-function} @@ -307,16 +297,16 @@ satisface el predicado @code{void?}. @example noApuntarYPulsar = #(define-void-function - (parser location) + () () (ly:set-option 'point-and-click #f)) @dots{} \noApuntarYPulsar % desactivar la función de apuntar y pulsar @end example -Si queremos evaluar una expresión sólo por su efecto colateral y no -queremos que se interprete ningún valor que pueda devolver, podemos -hacerlo anteponiendo el prefijo @code{\void}: +Si queremos evaluar una expresión sólo por su efecto colateral y +no queremos que se interprete ningún valor que pueda devolver, +podemos hacerlo anteponiendo el prefijo @code{\void}: @example \void #(hashq-set! some-table some-key some-value) @@ -333,9 +323,9 @@ encuentre. También funciona para funciones musicales como @cindex funciones musicales -Las @emph{funciones musicales} son procedimientos de Scheme que pueden -crear automáticamente expresiones musicales, y se pueden usar para -simplificar enormemente el archivo de entrada. +Las @emph{funciones musicales} son procedimientos de Scheme que +pueden crear automáticamente expresiones musicales, y se pueden +usar para simplificar enormemente el archivo de entrada. @menu * Definiciones de funciones musicales:: @@ -359,18 +349,19 @@ La forma general para definir funciones musicales es: @example funcion = #(define-music-function - (parser location @var{arg1} @var{arg2} @dots{}) + (@var{arg1} @var{arg2} @dots{}) (@var{tipo1?} @var{tipo2?} @dots{}) @var{cuerpo}) @end example @noindent -de forma bastante análoga a @ref{Definición de funciones de Scheme}. -Lo más probable es que el @var{cuerpo} sea un +de forma bastante análoga a +@ref{Definición de funciones de Scheme}. Lo más probable es que +el @var{cuerpo} sea un @ref{Bloques de código de LilyPond,bloque de código de LilyPond}. -Para ver una lista de los predicados de tipo disponibles, consulte -@ruser{Predicados de tipo predefinidos}. +Para ver una lista de los predicados de tipo disponibles, +consulte @ruser{Predicados de tipo predefinidos}. @seealso @@ -387,42 +378,46 @@ Archivos de inicio: @subsection Uso de las funciones musicales @translationof Music function usage -Las funciones musicales se pueden actualmente utilizar en varios -lugares. Dependiendo de dónde se usan, son de aplicación ciertas -restricciones para que sea posible su análisis sintáctico de forma -no ambigua. El resultado que devuelve una función musical debe ser -compatible con el contexto desde el que se la llama. +Una @q{función musical} debe devolver una expresión que se +corresponda con el predicado @code{ly:music?}. Esto hace que las +llamadas a funciones musicales sean aproopiadas como argumentos +del tipo @code{ly:music?} para otra llamada a una función +musical. + +Si se usa una llamada a función musical dentro de otros +contextos, el contexto puede aplicar restricciones semánticas +adicionales. @itemize @item -En el nivel superior dentro de una expresión musical. Aquí -no se aplica ninguna restricción. +En el nivel superior dentro de una expresión musical no se acepta +ningún post-evento. @item -Como un post-evento, que comienza explícitamente con un indicador de -dirección (a elegir entre @code{-}, @code{^} @w{y @code{_}}). - -En este caso, no podemos usar una expresión musical @emph{abierta} -como último argumento, que terminaría en una expresión musical -capaz de aceptar post-eventos adicionales. +Cuando una función musical (a diferencia de una función de +evento) devuelve una expresión del tipo post-event, LilyPond +requiere uno de los indicadores de dirección con nombre +(@code{-}, @code{^}, @w{y @code{_}}) para poder integrar +adecuadamente el post-evento producido por la llamada a la +función musical dentro de la expresión circundante. @item -Como componente de un acorde. La expresión devuelta debe ser -del tipo @code{rhythmic-event}, probablemente un @code{NoteEvent}. +Como componente de un acorde. La expresión devuelta debe ser del +tipo @code{rhythmic-event}, probablemente un @code{NoteEvent}. @end itemize @noindent -Las reglas especiales para los argumentos del final hacen posible -escribir funciones polimórficas como @code{\tweak} que se pueden -aplicar a construcciones distintas. +Se pueden aplicar funciones @q{polimórficas}, como @code{\tweak}, +a los post-eventos, componentes de acordes y expresiones +musicales del nivel superior. @node Funciones de sustitución sencillas @subsection Funciones de sustitución sencillas @translationof Simple substitution functions Una función de sustitución sencilla es una función musical cuya -expresión musical de salida está escrita en código de LilyPond -y contiene argumentos de la función en la expresión de salida. +expresión musical de salida está escrita en código de LilyPond y +contiene argumentos de la función en la expresión de salida. Están descritas en @ruser{Ejemplos de funciones de sustitución}. @@ -430,21 +425,21 @@ Están descritas en @ruser{Ejemplos de funciones de sustitución}. @subsection Funciones de sustitución intermedias @translationof Intermediate substitution functions -Las funciones de sustitución intermedias contienen una -mezcla de código de Scheme y de LilyPond -dentro de la expresión musical que se devuelve. +Las funciones de sustitución intermedias contienen una mezcla de +código de Scheme y de LilyPond dentro de la expresión musical que +se devuelve. Algunas instrucciones @code{\override} requieren un argumento que -consiste en una pareja de números (llamada una @emph{célula cons} en -Scheme). +consiste en una pareja de números (llamada una @emph{célula cons} +en Scheme). -La pareja se puede pasar directamente dentro de la función musical, -usando una variable @code{pair?}: +La pareja se puede pasar directamente dentro de la función +musical, usando una variable @code{pair?}: @example barraManual = #(define-music-function - (parser location principio-final) + (principio-final) (pair?) #@{ \once \override Beam.positions = #principio-final @@ -455,14 +450,15 @@ barraManual = @} @end example -De forma alternativa, los números que componen la pareja se pueden -pasar como argumentos separados, y el código de Scheme que se ha usado -para crear la pareja se puede incluir dentro de la expresión musical: +De forma alternativa, los números que componen la pareja se +pueden pasar como argumentos separados, y el código de Scheme que +se ha usado para crear la pareja se puede incluir dentro de la +expresión musical: @lilypond[quote,verbatim,ragged-right] manualBeam = #(define-music-function - (parser location beg end) + (beg end) (number? number?) #{ \once \override Beam.positions = #(cons beg end) @@ -482,13 +478,13 @@ Las propiedades se mantienen conceptualmente utilizando una pila por cada propiedad, por cada grob y por cada contexto. Las funciones musicales pueden requerir la sobreescritura de una o varias propiedades durante el tiempo de duración de la función, -restaurándolas a sus valores previos antes de salir. Sin embargo, -las sobreescrituras normales extraen y descartan la cima de la -pila de propiedades actual antes de introducir un valor en ella, -de manera que el valor anterior de la propiedad se pierde cuando -se sobreescribe. Si se quiere preservar el valor anterior, hay -que preceder la instrucción @code{\override} con la palabra clave -@code{\temporary}, así: +restaurándolas a sus valores previos antes de salir. Sin +embargo, las sobreescrituras normales extraen y descartan la cima +de la pila de propiedades actual antes de introducir un valor en +ella, de manera que el valor anterior de la propiedad se pierde +cuando se sobreescribe. Si se quiere preservar el valor +anterior, hay que preceder la instrucción @code{\override} con la +palabra clave @code{\temporary}, así: @example \temporary \override @dots{} @@ -497,16 +493,16 @@ que preceder la instrucción @code{\override} con la palabra clave El uso de @code{\temporary} hace que se borre la propiedad (normalmente fijada a un cierto valor) @code{pop-first} de la sobreescritura, de forma que el valor anterior no se extrae de la -pila de propiedades antes de poner en ella el valor nuevo. Cuando -una instrucción @code{\revert} posterior extrae el avlor +pila de propiedades antes de poner en ella el valor nuevo. +Cuando una instrucción @code{\revert} posterior extrae el valor sobreescrito temporalmente, volverá a emerger el valor anterior. En otras palabras, una llamada a @code{\temporary \override} y a -continuación otra a @code{\revert} sobre la misma propiedad, tiene -un valor neto que es nulo. De forma similar, la combinación en -secuencia de @code{\temporary} y @code{\undo} sobre la misma -música que contiene las sobreescrituras, tiene un efecto neto -nulo. +continuación otra a @code{\revert} sobre la misma propiedad, +tiene un valor neto que es nulo. De forma similar, la +combinación en secuencia de @code{\temporary} y @code{\undo} +sobre la misma música que contiene las sobreescrituras, tiene un +efecto neto nulo. He aquí un ejemplo de una función musical que utiliza lo expuesto anteriormente. El uso de @code{\temporary} asegura que los @@ -517,7 +513,7 @@ se habrían fijado los valores predeterminados. @example crossStaff = -#(define-music-function (parser location notes) (ly:music?) +#(define-music-function (notes) (ly:music?) (_i "Create cross-staff stems") #@{ \temporary \override Stem.cross-staff = #cross-staff-connect @@ -539,7 +535,7 @@ además de la simple sustitución: @lilypond[quote,verbatim,ragged-right] AltOn = #(define-music-function - (parser location mag) + (mag) (number?) #{ \override Stem.length = #(* 7.0 mag) @@ -552,8 +548,8 @@ AltOff = { \revert NoteHead.font-size } -\relative c' { - c2 \AltOn #0.5 c4 c +\relative { + c'2 \AltOn #0.5 c4 c \AltOn #1.5 c c \AltOff c2 } @end lilypond @@ -565,7 +561,7 @@ musicales: @lilypond[quote,verbatim,ragged-right] withAlt = #(define-music-function - (parser location mag music) + (mag music) (number? ly:music?) #{ \override Stem.length = #(* 7.0 mag) @@ -576,8 +572,8 @@ withAlt = \revert NoteHead.font-size #}) -\relative c' { - c2 \withAlt #0.5 { c4 c } +\relative { + c'2 \withAlt #0.5 { c4 c } \withAlt #1.5 { c c } c2 } @end lilypond @@ -587,8 +583,8 @@ withAlt = @subsection Funciones sin argumentos @translationof Functions without arguments -En casi todos los casos, una función sin argumentos se debe escribir -con una variable: +En casi todos los casos, una función sin argumentos se debe +escribir con una variable: @example dolce = \markup@{ \italic \bold dolce @} @@ -600,15 +596,15 @@ función musical sin argumentos: @example mostrarNumeroDeCompas = #(define-music-function - (parser location) + () () (if (eq? #t (ly:get-option 'display-bar-numbers)) #@{ \once \override Score.BarNumber.break-visibility = ##f #@} #@{#@})) @end example -Para la impresión real de los números de compás donde se llama a esta -función, invoque a @command{lilypond} con +Para la impresión real de los números de compás donde se llama a +esta función, invoque a @command{lilypond} con @example lilypond -d display-bar-numbers ARCHIVO.ly @@ -619,13 +615,13 @@ lilypond -d display-bar-numbers ARCHIVO.ly @subsection Funciones musicales vacías @translationof Void music functions -Una función musical debe devolver una expresión musical. Si quiere -ejecutar una función exclusivamente por sus efectos secundarios, -debería usar @code{define-void-function}. Pero -puede haber casos en los que a veces queremos producir una expresión -musical, y a veces no (como en el ejemplo anterior). Devolver una -expresión musical @code{void} (vacía) por medio de @code{#@{ #@}} lo -hace posible. +Una función musical debe devolver una expresión musical. Si +quiere ejecutar una función exclusivamente por sus efectos +secundarios, debería usar @code{define-void-function}. Pero +puede haber casos en los que a veces queremos producir una +expresión musical, y a veces no (como en el ejemplo anterior). +Devolver una expresión musical @code{void} (vacía) por medio de +@code{#@{ #@}} lo hace posible. @node Funciones de eventos @@ -634,32 +630,33 @@ hace posible. @funindex define-event-function @cindex event functions -Para usar una función musical en el lugar de un evento, tenemos que -escribir un indicador de dirección antes de ella. Pero a veces, ello -hace que se pierda la correspondencia con la sintaxis de las -construcciones que queremos sustituir. Por ejemplo, si queremos -escribir instrucciones de matiz dinámico, éstos se adjuntan -habitualmente sin indicador de dirección, como @code{c'\pp}. He aquí -una forma de escribir indicaciones dinámicas arbitrarias: +Para usar una función musical en el lugar de un evento, tenemos +que escribir un indicador de dirección antes de ella. Pero a +veces, ello hace que se pierda la correspondencia con la sintaxis +de las construcciones que queremos sustituir. Por ejemplo, si +queremos escribir instrucciones de matiz dinámico, éstos se +adjuntan habitualmente sin indicador de dirección, como +@code{c'\pp}. He aquí una forma de escribir indicaciones +dinámicas arbitrarias: @lilypond[quote,verbatim,ragged-right] -dyn=#(define-event-function (parser location arg) (markup?) +dyn=#(define-event-function (arg) (markup?) (make-dynamic-script arg)) -\relative c' { c\dyn pfsss } +\relative { c'\dyn pfsss } @end lilypond -Podríamos hacer lo mismo usando una función musical, pero entonces -tendríamos que escribir siempre un indicador de dirección antes de -llamarla, como @code{@w{c-\dyn pfsss}}. +Podríamos hacer lo mismo usando una función musical, pero +entonces tendríamos que escribir siempre un indicador de +dirección antes de llamarla, como @code{@w{c-\dyn pfsss}}. @node Funciones de marcado @section Funciones de marcado @translationof Markup functions -Los elementos de marcado están implementados como funciones de Scheme -especiales que producen un objeto @code{Stencil} dada una serie de -argumentos. +Los elementos de marcado están implementados como funciones de +Scheme especiales que producen un objeto @code{Stencil} dada una +serie de argumentos. @menu @@ -718,12 +715,12 @@ ocurre con la instrucción @code{\displayMusic}, la salida de Véase @ref{Presentación de las expresiones musicales}. @noindent -Este ejemplo muestra las principales reglas de traducción entre la -sintaxis del marcado normal de LilyPond y la sintaxis del marcado de -Scheme. La utilización de @code{#@{ @dots{} #@}} para escribir en la -sintaxis de LilyPond será con frecuencia lo más conveniente, pero -explicamos cómo usar la macro @code{markup} para obtener una solución -sólo con Scheme. +Este ejemplo muestra las principales reglas de traducción entre +la sintaxis del marcado normal de LilyPond y la sintaxis del +marcado de Scheme. La utilización de @code{#@{ @dots{} #@}} para +escribir en la sintaxis de LilyPond será con frecuencia lo más +conveniente, pero explicamos cómo usar la macro @code{markup} +para obtener una solución sólo con Scheme. @quotation @multitable @columnfractions .3 .3 @@ -740,11 +737,12 @@ sólo con Scheme. @end multitable @end quotation -Todo el lenguaje Scheme está accesible dentro del macro @code{markup}. -Por ejemplo, podemos usar llamadas a funciones dentro de @code{markup} -para así manipular cadenas de caracteres. Esto es útil si se están -definiendo instrucciones de marcado nuevas (véase -@ref{Definición de una instrucción de marcado nueva}). +Todo el lenguaje Scheme está accesible dentro del macro +@code{markup}. Por ejemplo, podemos usar llamadas a funciones +dentro de @code{markup} para así manipular cadenas de caracteres. +Esto es útil si se están definiendo instrucciones de marcado +nuevas (véase @ref{Definición de una instrucción de marcado +nueva}). @knownissues @@ -758,8 +756,9 @@ resultado de la llamada a una función. @end lisp @noindent -no es válido. Hay que usar las funciones @code{make-line-markup}, -@code{make-center-markup} o @code{make-column-markup} en su lugar: +no es válido. Hay que usar las funciones +@code{make-line-markup}, @code{make-center-markup} o +@code{make-column-markup} en su lugar: @lisp (markup (make-line-markup (funcion-que-devuelve-marcados))) @@ -795,11 +794,11 @@ sellos), se llama la función @code{raise-markup} como @var{el marcado "ejemplo de texto"}) @end example -Primero la función @code{raise-markup} crea el sello para la cadena -@code{ejemplo de texto}, y después eleva el sello Stencil en 0.5 -espacios de pentagrama. Este es un ejemplo bastante simple; en el -resto de la sección podrán verse ejemplos más complejos, así como en -@file{scm/define-markup-commands.scm}. +Primero la función @code{raise-markup} crea el sello para la +cadena @code{ejemplo de texto}, y después eleva el sello Stencil +en 0.5 espacios de pentagrama. Este es un ejemplo bastante +simple; en el resto de la sección podrán verse ejemplos más +complejos, así como en @file{scm/define-markup-commands.scm}. @node Definición de una instrucción de marcado nueva @@ -821,8 +820,9 @@ marcado. @unnumberedsubsubsec Sintaxis de la definición de instrucciones de marcado @translationof Markup command definition syntax -Se pueden definir instrucciones de marcado nuevas usando el macro de -Scheme @code{define-markup-command}, en el nivel sintáctico superior. +Se pueden definir instrucciones de marcado nuevas usando el macro +de Scheme @code{define-markup-command}, en el nivel sintáctico +superior. @lisp (define-markup-command (@var{nombre-de-la-instruccion} @var{layout} @var{props} @var{arg1} @var{arg2} @dots{}) @@ -848,9 +848,10 @@ argumento @var{i}-ésimo de la instrucción predicado de tipo para el argumento @var{i}-ésimo @end table -Si la instrucción utiliza propiedades de los argumentos @code{props}, -se puede usar la palabra clave @code{#:properties} para especificar -qué propiedades se usan, así como sus valores predeterminados. +Si la instrucción utiliza propiedades de los argumentos +@code{props}, se puede usar la palabra clave @code{#:properties} +para especificar qué propiedades se usan, así como sus valores +predeterminados. Los argumentos se distinguen según su tipo: @itemize @@ -861,51 +862,54 @@ Los argumentos se distinguen según su tipo: @code{list?}, @code{number?}, @code{boolean?}, etc. @end itemize -No existe ninguna limitación en el orden de los argumentos (después de -los argumentos estándar @code{layout} y @code{props}). Sin embargo, las -funciones de marcado que toman un elemento de marcado como su último -argumento son un poco especiales porque podemos aplicarlas a una lista -de marcados y el resultado es una lista de marcados donde la función -de marcado (con los argumentos antecedentes especificados) se ha -aplicado a todos los elementos de la lista de marcados original. - -Dado que la replicación de los argumentos precedentes para aplicar una -función de marcado a una lista de marcados es poco costosa -principalmente por los argumentos de Scheme, se evitan las caídas de -rendimiento simplemente mediante la utilización de argumentos de -Scheme para los argumentos antecedentes de las funciones de marcado -que toman un marcado como su último argumento. +No existe ninguna limitación en el orden de los argumentos +(después de los argumentos estándar @code{layout} y +@code{props}). Sin embargo, las funciones de marcado que toman +un elemento de marcado como su último argumento son un poco +especiales porque podemos aplicarlas a una lista de marcados y el +resultado es una lista de marcados donde la función de marcado +(con los argumentos antecedentes especificados) se ha aplicado a +todos los elementos de la lista de marcados original. + +Dado que la replicación de los argumentos precedentes para +aplicar una función de marcado a una lista de marcados es poco +costosa principalmente por los argumentos de Scheme, se evitan +las caídas de rendimiento simplemente mediante la utilización de +argumentos de Scheme para los argumentos antecedentes de las +funciones de marcado que toman un marcado como su último +argumento. @funindex \markup @cindex markup macro @funindex interpret-markup Las instrucciones de marcado tienen un ciclo de vida más bien -complejo. El cuerpo de la definición de una instrucción de marcado es -responsable de la conversión de los argumentos de la instrucción de -marcado en una expresión de sello que se devuelve. Muy a menudo esto -se lleva a cabo llamando a la función @code{interpret-markup} sobre -una expresión de marcado, pasándole los argumentos @var{layout} y -@var{props}. Por lo general, estos argumentos se conocen solamente en -una fase muy tardía de la composición tipográfica. Las expresiones de -marcado ya tienen sus componentes ensamblados dentro de expresiones de -marcado cuando se expanden las instrucciones @code{\markup} (dentro de +complejo. El cuerpo de la definición de una instrucción de +marcado es responsable de la conversión de los argumentos de la +instrucción de marcado en una expresión de sello que se devuelve. +Muy a menudo esto se lleva a cabo llamando a la función +@code{interpret-markup} sobre una expresión de marcado, pasándole +los argumentos @var{layout} y @var{props}. Por lo general, estos +argumentos se conocen solamente en una fase muy tardía de la +composición tipográfica. Las expresiones de marcado ya tienen +sus componentes ensamblados dentro de expresiones de marcado +cuando se expanden las instrucciones @code{\markup} (dentro de una expresión de LilyPond) o la macro @code{markup} (dentro de -Scheme). La evaluación y la comprobación de tipos de los argumentos -de la instrucción de marcado tiene lugar en el momento en que se -interpretan @code{\markup} o @code{markup}. +Scheme). La evaluación y la comprobación de tipos de los +argumentos de la instrucción de marcado tiene lugar en el momento +en que se interpretan @code{\markup} o @code{markup}. -Pero la conversión real de expresiones de marcado en expresiones de -sello mediante la ejecución de los cuerpos de función de marcado solo -tienen lugar cuando se llama a @code{interpret-markup} sobre una -expresión de marcado. +Pero la conversión real de expresiones de marcado en expresiones +de sello mediante la ejecución de los cuerpos de función de +marcado solo tienen lugar cuando se llama a +@code{interpret-markup} sobre una expresión de marcado. @node Acerca de las propiedades @unnumberedsubsubsec Acerca de las propiedades @translationof On properties -Los argumentos @code{layout} y @code{props} de las instrucciones de -marcado traen a escena un contexto para la interpretación del marcado: -tamaño de la tipografía, grueso de línea, etc. +Los argumentos @code{layout} y @code{props} de las instrucciones +de marcado traen a escena un contexto para la interpretación del +marcado: tamaño de la tipografía, grueso de línea, etc. El argumento @code{layout} permite el acceso a las propiedades definidas en los bloques @code{paper}, usando la función @@ -916,21 +920,21 @@ mismo que el que se usa en las partituras) se lee usando: (ly:output-def-lookup layout 'line-width) @end example -El argumento @code{props} hace accesibles algunas propiedades a las -instrucciones de marcado. Por ejemplo, cuando se interpreta el -marcado del título de un libro, todas las variables definidas dentro -del bloque @code{\header} se añaden automáticamente a @code{props}, de -manera que el marcado del título del libro puede acceder al título del -libro, el autor, etc. También es una forma de configurar el -comportamiento de una instrucción de marcado: por ejemplo, cuando una -instrucción utiliza tamaños de tipografía durante el procesado, el -tamaño se lee de @code{props} en vez de tener un argumento -@code{font-size}. El que llama a una instrucción de marcado puede -cambiar el valor de la propiedad del tamaño de la tipografía con el -objeto de modificar el comportamiento. Utilice la palabra clave -@code{#:properties} de @code{define-markup-command} para especificar -qué propiedades se deben leer a partir de los argumentos de -@code{props}. +El argumento @code{props} hace accesibles algunas propiedades a +las instrucciones de marcado. Por ejemplo, cuando se interpreta +el marcado del título de un libro, todas las variables definidas +dentro del bloque @code{\header} se añaden automáticamente a +@code{props}, de manera que el marcado del título del libro puede +acceder al título del libro, el autor, etc. También es una forma +de configurar el comportamiento de una instrucción de marcado: +por ejemplo, cuando una instrucción utiliza tamaños de tipografía +durante el procesado, el tamaño se lee de @code{props} en vez de +tener un argumento @code{font-size}. El que llama a una +instrucción de marcado puede cambiar el valor de la propiedad del +tamaño de la tipografía con el objeto de modificar el +comportamiento. Utilice la palabra clave @code{#:properties} de +@code{define-markup-command} para especificar qué propiedades se +deben leer a partir de los argumentos de @code{props}. El ejemplo de la sección siguiente ilustra cómo acceder y sobreescribir las propiedades de una instrucción de marcado. @@ -940,40 +944,41 @@ sobreescribir las propiedades de una instrucción de marcado. @unnumberedsubsubsec Un ejemplo completo @translationof A complete example -El ejemplo siguiente define una instrucción de marcado para trazar un -rectángulo doble alrededor de un fragmento de texto. +El ejemplo siguiente define una instrucción de marcado para +trazar un rectángulo doble alrededor de un fragmento de texto. En primer lugar, necesitamos construir un resultado aproximado -utilizando marcados. Una consulta a @ruser{Instrucciones de marcado -de texto} nos muestra que es útil la instrucción @code{\box}: +utilizando marcados. Una consulta a @ruser{Instrucciones de +marcado de texto} nos muestra que es útil la instrucción +@code{\box}: @lilypond[quote,verbatim,ragged-right] \markup \box \box HELLO @end lilypond -Ahora, consideramos que es preferible tener más separación entre el -texto y los rectángulos. Según la documentación de @code{\box}, esta -instrucción usa una propiedad @code{box-padding}, cuyo valor -predeterminado es 0.2. La documentación también menciona cómo -sobreescribir este valor: +Ahora, consideramos que es preferible tener más separación entre +el texto y los rectángulos. Según la documentación de +@code{\box}, esta instrucción usa una propiedad +@code{box-padding}, cuyo valor predeterminado es 0.2. La +documentación también menciona cómo sobreescribir este valor: @lilypond[quote,verbatim,ragged-right] \markup \box \override #'(box-padding . 0.6) \box A @end lilypond -Después, el relleno o separación entre los dos rectángulos nos parece -muy pequeño, así que lo vamos a sobreescribir también: +Después, el relleno o separación entre los dos rectángulos nos +parece muy pequeño, así que lo vamos a sobreescribir también: @lilypond[quote,verbatim,ragged-right] \markup \override #'(box-padding . 0.4) \box \override #'(box-padding . 0.6) \box A @end lilypond -Repetir esta extensa instrucción de marcado una y otra vez sería un -quebradero de cabeza. Aquí es donde se necesita una instrucción de -marcado. Así pues, escribimos una instrucción de marcado -@code{double-box}, que toma un argumento (el texto). Dibuja los dos -rectángulos y añade una separación. +Repetir esta extensa instrucción de marcado una y otra vez sería +un quebradero de cabeza. Aquí es donde se necesita una +instrucción de marcado. Así pues, escribimos una instrucción de +marcado @code{double-box}, que toma un argumento (el texto). +Dibuja los dos rectángulos y añade una separación. @lisp #(define-markup-command (double-box layout props text) (markup?) @@ -994,14 +999,14 @@ o, de forma equivalente, @end lisp @code{text} es el nombre del argumento de la instrucción, y -@code{markup?} es el tipo: lo identifica como un elemento de marcado. -La función @code{interpret-markup} se usa en casi todas las -instrucciones de marcado: construye un sello, usando @code{layout}, -@code{props}, y un elemento de marcado. En el segundo caso, la marca -se construye usando el macro de Scheme @code{markup}, véase -@ref{Construcción de elementos de marcado en Scheme}. La -transformación de una expresión @code{\markup} en una expresión de -marcado de Scheme es directa. +@code{markup?} es el tipo: lo identifica como un elemento de +marcado. La función @code{interpret-markup} se usa en casi todas +las instrucciones de marcado: construye un sello, usando +@code{layout}, @code{props}, y un elemento de marcado. En el +segundo caso, la marca se construye usando el macro de Scheme +@code{markup}, véase @ref{Construcción de elementos de marcado en +Scheme}. La transformación de una expresión @code{\markup} en +una expresión de marcado de Scheme es directa. La instrucción nueva se puede usar como sigue: @@ -1009,14 +1014,15 @@ La instrucción nueva se puede usar como sigue: \markup \double-box A @end example -Sería buen hacer que la instrucción @code{double-box} fuera -personalizable: aquí, los valores de relleno @code{box-padding} son -fijos, y no se pueden cambiar por parte del usuario. Además, sería -mejor distinguir la separación entre los dos rectángulos, del relleno -entre el rectángulo interno y el texto. Así pues, introducimos una -nueva propiedad, @code{inter-box-padding}, para el relleno entre los -rectángulos. El @code{box-padding} se usará para el relleno interno. -Ahora el código nuevo es como se ve a continuación: +Sería bueno hacer que la instrucción @code{double-box} fuera +personalizable: aquí, los valores de relleno @code{box-padding} +son fijos, y no se pueden cambiar por parte del usuario. Además, +sería mejor distinguir la separación entre los dos rectángulos, +del relleno entre el rectángulo interno y el texto. Así pues, +introducimos una nueva propiedad, @code{inter-box-padding}, para +el relleno entre los rectángulos. El @code{box-padding} se usará +para el relleno interno. Ahora el código nuevo es como se ve a +continuación: @lisp #(define-markup-command (double-box layout props text) (markup?) @@ -1029,7 +1035,8 @@ Ahora el código nuevo es como se ve a continuación: @{ #text @} #@})) @end lisp -De nuevo, la versión equivalente que utiliza la macro de marcado sería: +De nuevo, la versión equivalente que utiliza la macro de marcado +sería: @lisp #(define-markup-command (double-box layout props text) (markup?) @@ -1041,19 +1048,20 @@ De nuevo, la versión equivalente que utiliza la macro de marcado sería: #:override `(box-padding . ,box-padding) #:box text))) @end lisp -Aquí, la palabra clave @code{#:properties} se usa de manera que las -propiedades @code{inter-box-padding} y @code{box-padding} se leen a -partir del argumento @code{props}, y se les proporcionan unos valores -predeterminados si las propiedades no están definidas. +Aquí, la palabra clave @code{#:properties} se usa de manera que +las propiedades @code{inter-box-padding} y @code{box-padding} se +leen a partir del argumento @code{props}, y se les proporcionan +unos valores predeterminados si las propiedades no están +definidas. Después estos valores se usan para sobreescribir las propiedades @code{box-padding} usadas por las dos instrucciones @code{\box}. Observe el apóstrofo invertido y la coma en el argumento de -@code{\override}: nos permiten introducir un valor de variable dentro -de una expresión literal. +@code{\override}: nos permiten introducir un valor de variable +dentro de una expresión literal. -Ahora, la instrucción se puede usar dentro de un elemento de marcado, -y el relleno de los rectángulos se puede personalizar: +Ahora, la instrucción se puede usar dentro de un elemento de +marcado, y el relleno de los rectángulos se puede personalizar: @lilypond[quote,verbatim,ragged-right] #(define-markup-command (double-box layout props text) (markup?) @@ -1075,15 +1083,15 @@ y el relleno de los rectángulos se puede personalizar: @unnumberedsubsubsec Adaptación de instrucciones incorporadas @translationof Adapting builtin commands -Una buena manera de comenzar a escribir una instrucción de marcado -nueva, es seguir el ejemplo de otra instrucción ya incorporada. Casi -todas las instrucciones de marcado que están incorporadas en LilyPond -se pueden encontrar en el archivo +Una buena manera de comenzar a escribir una instrucción de +marcado nueva, es seguir el ejemplo de otra instrucción ya +incorporada. Casi todas las instrucciones de marcado que están +incorporadas en LilyPond se pueden encontrar en el archivo @file{scm/define-markup-commands.scm}. -Por ejemplo, querríamos adaptar la instrucción @code{\draw-line}, para -que trace una línea doble. La instrucción @code{\draw-line} está -definida como sigue (se han suprimido los comentarios de +Por ejemplo, querríamos adaptar la instrucción @code{\draw-line}, +para que trace una línea doble. La instrucción @code{\draw-line} +está definida como sigue (se han suprimido los comentarios de documentación): @lisp @@ -1099,11 +1107,12 @@ documentación): (make-line-stencil th 0 0 x y))) @end lisp -Para definir una instrucción nueva basada en otra existente, copie la -definición y cámbiele el nombre. La palabra clave @code{#:category} -se puede eliminar sin miedo, pues sólo se utiliza para generar -documentación de LilyPond, y no tiene ninguna utilidad para las -instrucciones de marcado definidas por el usuario. +Para definir una instrucción nueva basada en otra existente, +copie la definición y cámbiele el nombre. La palabra clave +@code{#:category} se puede eliminar sin miedo, pues sólo se +utiliza para generar documentación de LilyPond, y no tiene +ninguna utilidad para las instrucciones de marcado definidas por +el usuario. @lisp (define-markup-command (draw-double-line layout props dest) @@ -1117,9 +1126,9 @@ instrucciones de marcado definidas por el usuario. (make-line-stencil th 0 0 x y))) @end lisp -A continuación se añade una propiedad para establecer la separación -entre las dos líneas, llamada @code{line-gap}, con un valor -predeterminado de p.ej. 0.6: +A continuación se añade una propiedad para establecer la +separación entre las dos líneas, llamada @code{line-gap}, con un +valor predeterminado de p.ej. 0.6: @lisp (define-markup-command (draw-double-line layout props dest) @@ -1130,9 +1139,10 @@ predeterminado de p.ej. 0.6: @dots{} @end lisp -Finalmente, se añade el código para trazar las dos líneas. Se usan -dos llamadas a @code{make-line-stencil} para trazar las líneas, y los -sellos resultantes se combinan usando @code{ly:stencil-add}: +Finalmente, se añade el código para trazar las dos líneas. Se +usan dos llamadas a @code{make-line-stencil} para trazar las +líneas, y los sellos resultantes se combinan usando +@code{ly:stencil-add}: @lilypond[quote,verbatim,ragged-right] #(define-markup-command (my-draw-line layout props dest) @@ -1173,10 +1183,10 @@ Scheme @code{define-markup-list-command}, que es similar al macro instrucción de marcado nueva}, excepto que donde éste devuelve un sello único, aquél devuelve una lista de sellos. -En el siguiente ejemplo se define una instrucción de lista de marcado -@code{\paragraph}, que devuelve una lista de líneas justificadas, -estando la primera de ellas sangrada. La anchura del sangrado se toma -del argumento @code{props}. +En el siguiente ejemplo se define una instrucción de lista de +marcado @code{\paragraph}, que devuelve una lista de líneas +justificadas, estando la primera de ellas sangrada. La anchura +del sangrado se toma del argumento @code{props}. @example #(define-markup-list-command (paragraph layout props args) (markup-list?) @@ -1196,22 +1206,24 @@ La versión que usa solamente Scheme es más compleja: @end example Aparte de los argumentos usuales @code{layout} y @code{props}, la -instrucción de lista de marcados @code{paragraph} toma un argumento de -lista de marcados, llamado @code{args}. El predicado para listas de -marcados es @code{markup-list?}. - -En primer lugar, la función toma el ancho del sangrado, una propiedad -llamada aquí @code{par-indent}, de la lista de propiedades -@code{props}. Si no se encuentra la propiedad, el valor -predeterminado es @code{2}. Después, se hace una lista de líneas -justificadas usando la instrucción incorporada de lista de marcados -@code{\justified-lines}, que está relacionada con la función -@code{make-justified-lines-markup-list}. Se añade un espacio -horizontal al principio usando @code{\hspace} (o la función -@code{make-hspace-markup}). Finalmente, la lista de marcados se -interpreta usando la función @code{interpret-markup-list}. - -Esta nueva instrucción de lista de marcados se puede usar como sigue: +instrucción de lista de marcados @code{paragraph} toma un +argumento de lista de marcados, llamado @code{args}. El +predicado para listas de marcados es @code{markup-list?}. + +En primer lugar, la función toma el ancho del sangrado, una +propiedad llamada aquí @code{par-indent}, de la lista de +propiedades @code{props}. Si no se encuentra la propiedad, el +valor predeterminado es @code{2}. Después, se hace una lista de +líneas justificadas usando la instrucción incorporada de lista de +marcados @code{\justified-lines}, que está relacionada con la +función @code{make-justified-lines-markup-list}. Se añade un +espacio horizontal al principio usando @code{\hspace} (o la +función @code{make-hspace-markup}). Finalmente, la lista de +marcados se interpreta usando la función +@code{interpret-markup-list}. + +Esta nueva instrucción de lista de marcados se puede usar como +sigue: @example \markuplist @{ @@ -1246,26 +1258,141 @@ Esta nueva instrucción de lista de marcados se puede usar como sigue: @cindex código, llamadas durante la interpretación @funindex \applyContext +@funindex make-apply-context +@funindex ly:context-property +@funindex ly:context-set-property! +@funindex ly:context-grob-definition +@funindex ly:assoc-get +@funindex ly:context-pushpop-property -Se pueden modificar los contextos durante la interpretación con código -de Scheme. La sintaxis para esto es +Se pueden modificar los contextos durante la interpretación con +código de Scheme. Dentro de un bloque de código de LilyPond, la +sintaxis para esto es: @example \applyContext @var{función} @end example -@code{@var{función}} debe ser una función de Scheme que toma un único -argumento, que es el contexto al que aplicarla. El código siguiente -imprime el número del compás actual sobre la salida estándar durante -la compilación: +En código de Scheme, la sintaxis es: @example -\applyContext - #(lambda (x) - (format #t "\nSe nos ha llamado en el compás número ~a.\n" - (ly:context-property x 'currentBarNumber))) +(make-apply-context @var{function}) @end example +@code{@var{función}} debe ser una función de Scheme que toma un +único argumento, que es el contexto al que aplicarla. La función +puede acceder a, así como sobreescribir u establecer propiedades +de grobs s y propiedades de contextos. Cualquier acción tomada +por la función que dependa del estado del contexto, está limitada +al estado del contexto @emph{en el momento de llamar a la +función}. Asimismo, los cambios efectuados por una llamada a +@code{\applyContext} permanecen en efecto hasta que se modifican +de nuevo directamente, o se revierten, incluso si han cambiado las +condiciones iniciales sobre las que dependen. + +Las siguientes funciones de Scheme son útiles cuando se utiliza +@code{\applyContext}: + +@table @code +@item ly:context-property +recuperar el valor de una propiedad de contexto + +@item ly:context-set-property! +establecer el valor de una propiedad de contexto + +@item ly:context-grob-definition +@itemx ly:assoc-get +recuperar el valor de una propiedad de un grob + +@item ly:context-pushpop-property +hacer una sobreescritura temporal +(@code{\temporary@tie{}\override}) o una reversión +(@code{\revert}) sobre una propiedad de un grob +@end table + +El ejemplo siguiente recupera el valor actual de @code{fontSize}, +y a continuación lo dobla: + +@lilypond[quote,verbatim] +doubleFontSize = +\applyContext + #(lambda (context) + (let ((fontSize (ly:context-property context 'fontSize))) + (ly:context-set-property! context 'fontSize (+ fontSize 6)))) + +{ + \set fontSize = -3 + b'4 + \doubleFontSize + b' +} +@end lilypond + + +El ejemplo siguiente recupera los colores actuales de los grobs +@code{NoteHead}, @code{Stem} y @code{Beam}, y a continuación los +modifica para que tengan un matiz menos saturado. + +@lilypond[quote,verbatim] +desaturate = +\applyContext + #(lambda (context) + (define (desaturate-grob grob) + (let* ((grob-def (ly:context-grob-definition context grob)) + (color (ly:assoc-get 'color grob-def black)) + (new-color (map (lambda (x) (min 1 (/ (1+ x) 2))) color))) + (ly:context-pushpop-property context grob 'color new-color))) + (for-each desaturate-grob '(NoteHead Stem Beam))) + +\relative { + \time 3/4 + g'8[ g] \desaturate g[ g] \desaturate g[ g] + \override NoteHead.color = #darkred + \override Stem.color = #darkred + \override Beam.color = #darkred + g[ g] \desaturate g[ g] \desaturate g[ g] +} +@end lilypond + + +Esto puede implementarse también como una función musical, con el +objeto de restringir las modificaciones a un único bloque de +música. Observe cómo se usa @code{ly:context-pushpop-property} +tanto como una sobreescritura temporal +(@code{\temporary@tie{}\override}) como una reversión +(@code{\revert}): + +@lilypond[quote,verbatim] +desaturate = +#(define-music-function + (music) (ly:music?) + #{ + \applyContext + #(lambda (context) + (define (desaturate-grob grob) + (let* ((grob-def (ly:context-grob-definition context grob)) + (color (ly:assoc-get 'color grob-def black)) + (new-color (map (lambda (x) (min 1 (/ (1+ x) 2))) color))) + (ly:context-pushpop-property context grob 'color new-color))) + (for-each desaturate-grob '(NoteHead Stem Beam))) + #music + \applyContext + #(lambda (context) + (define (revert-color grob) + (ly:context-pushpop-property context grob 'color)) + (for-each revert-color '(NoteHead Stem Beam))) + #}) + +\relative { + \override NoteHead.color = #darkblue + \override Stem.color = #darkblue + \override Beam.color = #darkblue + g'8 a b c + \desaturate { d c b a } + g b d b g2 +} +@end lilypond + @node Ejecutar una función sobre todos los objetos de la presentación @subsection Ejecutar una función sobre todos los objetos de la presentación @@ -1274,21 +1401,28 @@ la compilación: @cindex código, llamar sobre objetos de presentación @funindex \applyOutput - La manera más versátil de realizar el ajuste fino de un objeto es -@code{\applyOutput}, que -funciona insertando un evento dentro del contexto especificado -(@rinternals{ApplyOutputEvent}). Su sintaxis es +@code{\applyOutput}, que funciona insertando un evento dentro del +contexto especificado (@rinternals{ApplyOutputEvent}). Su +sintaxis es o bien @example \applyOutput @var{Contexto} @var{proc} @end example +o bien + +@example +\applyOutput @var{Context}.@var{Grob} @var{proc} +@end example + @noindent -donde @code{@var{proc}} es una función de Scheme que toma tres argumentos. +donde @code{@var{proc}} es una función de Scheme que toma tres +argumentos. -Al interpretarse, la función @code{@var{proc}} se llama para cada objeto de -presentación que se encuentra en el contexto @code{@var{Contexto}} +Al interpretarse, la función @code{@var{proc}} se llama para cada +objeto de presentación (con el nombre del grob @var{Grob} si se +especifica) que se encuentra en el contexto @code{@var{Contexto}} en el tiempo actual, con los siguientes argumentos: @itemize @@ -1300,30 +1434,30 @@ en el tiempo actual, con los siguientes argumentos: Además, la causa del objeto de presentación, es decir el objeto o expresión musical que es responsable de haberlo creado, está en la -propiedad @code{cause} del objeto. Por ejemplo, para la cabeza de una -nota, éste es un evento @rinternals{NoteHead}, y para un objeto -plica, éste es un objeto @rinternals{Stem}. +propiedad @code{cause} del objeto. Por ejemplo, para la cabeza de +una nota, éste es un evento @rinternals{NoteHead}, y para un +objeto plica, éste es un objeto @rinternals{Stem}. He aquí una función que usar para @code{\applyOutput}; borra las -cabezas de las notas que están sobre la línea central y junto a ella: +cabezas de las notas que están sobre la línea central y junto a +ella: @lilypond[quote,verbatim,ragged-right] #(define (blanker grob grob-origin context) - (if (and (memq 'note-head-interface (ly:grob-interfaces grob)) - (< (abs (ly:grob-property grob 'staff-position)) 2)) + (if (< (abs (ly:grob-property grob 'staff-position)) 2) (set! (ly:grob-property grob 'transparent) #t))) -\relative c' { - a'4 e8 <<\applyOutput #'Voice #blanker a c d>> b2 +\relative { + a'4 e8 <<\applyOutput Voice.NoteHead #blanker a c d>> b2 } @end lilypond -Para que @var{función} se interprete en los niveles de @code{Score} o de @code{Staff} -utilice estas formas: +Para que @var{función} se interprete en los niveles de +@code{Score} o de @code{Staff} utilice estas formas: @example -\applyOutput #'Score #@var{función} -\applyOutput #'Staff #@var{función} +\applyOutput Score@dots{} +\applyOutput Staff@dots{} @end example @@ -1332,26 +1466,27 @@ utilice estas formas: @translationof Callback functions Las propiedades (como @code{thickness} (grosor), @code{direction} -(dirección), etc.) se pueden establecer a valores fijos con \override, -p. ej.: +(dirección), etc.) se pueden establecer a valores fijos con +\override, p. ej.: @example \override Stem.thickness = #2.0 @end example -Las propiedades pueden fijarse también a un procedimiento de Scheme, +Las propiedades pueden fijarse también a un procedimiento de +Scheme: -@lilypond[fragment,verbatim,quote,relative=2] +@lilypond[fragment,verbatim,quote] \override Stem.thickness = #(lambda (grob) (if (= UP (ly:grob-property grob 'direction)) 2.0 7.0)) -c b a g b a g b +\relative { c'' b a g b a g b } @end lilypond @noindent -En este caso, el procedimiento se ejecuta tan pronto como el valor de -la propiedad se reclama durante el proceso de formateo. +En este caso, el procedimiento se ejecuta tan pronto como el valor +de la propiedad se reclama durante el proceso de formateo. Casi todo el motor de tipografiado está manejado por estos @emph{callbacks}. Entre las propiedades que usan normalmente @@ -1366,8 +1501,8 @@ Casi todo el motor de tipografiado está manejado por estos La rutina que calcula la anchura de un objeto @end table -El procedimiento siempre toma un argumento único, que es el grob (el -objeto gráfico). +El procedimiento siempre toma un argumento único, que es el grob +(el objeto gráfico). Dicho procedimiento puede acceder al valor usual de la propiedad, llamando en primer lugar a la función que es el @q{callback} usual @@ -1375,49 +1510,14 @@ para esa propiedad, y que puede verse en el manual de referencia interna o en el archivo 'define-grobs.scm': @example -\relative c'' @{ - \override Flag #'X-offset = #(lambda (flag) +\relative @{ + \override Flag.X-offset = #(lambda (flag) (let ((default (ly:flag::calc-x-offset flag))) (* default 4.0))) - c4. d8 a4. g8 + c''4. d8 a4. g8 @} @end example -Si se deben llamar rutinas con varios argumentos, el grob actual se -puede insertar con una cerradura de grob. He aquí un ajuste -procedente de @code{AccidentalSuggestion}, - -@example -`(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))))) -@end example - -@noindent -En este ejemplo, tanto -@code{ly:self-alignment-interface::x-aligned-on-self} como -@code{ly:self-alignment-interface::centered-on-x-parent} se llaman con -el grob como argumento. El resultado se añade con la función -@code{+}. Para asegurar que esta adición se ejecuta adecuadamente, -todo ello se encierra dentro de @code{ly:make-simple-closure}. - -De hecho, usar un solo procedimiento como valor de una propiedad -equivale a - -@example -(ly:make-simple-closure (ly:make-simple-closure (list @var{proc}))) -@end example - -@noindent -El @code{ly:make-simple-closure} interior aporta el grob como -argumento de @var{proc}, el exterior asegura que el resultado de la -función es lo que se devuelve, en lugar del objeto -@code{simple-closure}. - Desde dentro de un callback, el método más fácil para evaluar un elemento de marcado es usar grob-interpret-markup. Por ejemplo: @@ -1426,10 +1526,17 @@ mi-callback = #(lambda (grob) (grob-interpret-markup grob (markup "fulanito"))) @end example +@ignore + +@n ode Código de Scheme en línea +@s ection Código de Scheme en línea +@t ranslationof Inline Scheme code + +TODO: after this section had been written, LilyPond has improved +to the point that finding a @emph{simple} example where one would +@emph{have} to revert to Scheme has become rather hard. -@node Código de Scheme en línea -@section Código de Scheme en línea -@translationof Inline Scheme code +Until this section gets a rewrite, let's pretend we don't know. La principal desventaja de @code{\tweak} es su inflexibilidad sintáctica. Por ejemplo, lo siguiente produce un error de sintaxis (o @@ -1438,8 +1545,8 @@ más bien: así lo hacía en algún momento del pasado): @example F = \tweak font-size #-3 -\flageolet -\relative c'' @{ - c4^\F c4_\F +\relative @{ + c''4^\F c4_\F @} @end example @@ -1457,8 +1564,8 @@ F = #(let ((m (make-music 'ArticulationEvent (ly:music-property m 'tweaks))) m) -\relative c'' @{ - c4^\F c4_\F +\relative @{ + c''4^\F c4_\F @} @end example @@ -1471,6 +1578,8 @@ función de Scheme @code{acons}, y finalmente el resultado se escribe de nuevo con @code{set!}. El último elemento del bloque @code{let} es el valor de retorno, el propio @code{m}. +@end ignore + @node Trucos difíciles @section Trucos difíciles @@ -1483,18 +1592,19 @@ Hay un cierto número de tipos de ajustes difíciles. @item Un tipo de ajuste difícil es la apariencia de los objetos de -extensión, como las ligaduras de expresión y de unión. Inicialmente, -sólo se crea uno de estos objetos, y pueden ajustarse con el mecanismo -normal. Sin embargo, en ciertos casos los objetos extensores cruzan -los saltos de línea. Si esto ocurre, estos objetos se clonan. Se -crea un objeto distinto por cada sistema en que se encuentra. Éstos -son clones del objeto original y heredan todas sus propiedades, -incluidos los @code{\override}s. +extensión, como las ligaduras de expresión y de unión. +Inicialmente, sólo se crea uno de estos objetos, y pueden +ajustarse con el mecanismo normal. Sin embargo, en ciertos casos +los objetos extensores cruzan los saltos de línea. Si esto +ocurre, estos objetos se clonan. Se crea un objeto distinto por +cada sistema en que se encuentra. Éstos son clones del objeto +original y heredan todas sus propiedades, incluidos los +@code{\override}s. En otras palabras, un @code{\override} siempre afecta a todas las -piezas de un objeto de extensión fragmentado. Para cambiar sólo una -parte de un extensor en el salto de línea, es necesario inmiscuirse en -el proceso de formateado. El @emph{callback} +piezas de un objeto de extensión fragmentado. Para cambiar sólo +una parte de un extensor en el salto de línea, es necesario +inmiscuirse en el proceso de formateado. El @emph{callback} @code{after-line-breaking} contiene el procedimiento Scheme que se llama después de que se han determinado los saltos de línea, y los objetos de presentación han sido divididos sobre los distintos @@ -1514,9 +1624,9 @@ comprueba si somos el último de los objetos divididos en caso afirmativo, establece @code{extra-offset}. @end itemize -Este procedimiento se instala en @rinternals{Tie} (ligadura de unión), -de forma que la última parte de la ligadura dividida se traslada hacia -arriba. +Este procedimiento se instala en @rinternals{Tie} (ligadura de +unión), de forma que la última parte de la ligadura dividida se +traslada hacia arriba. @lilypond[quote,verbatim,ragged-right] #(define (my-callback grob) @@ -1533,18 +1643,18 @@ arriba. (eq? (car (last-pair siblings)) grob)) (ly:grob-set-property! grob 'extra-offset '(-2 . 5))))) -\relative c'' { +\relative { \override Tie.after-line-breaking = #my-callback - c1 ~ \break - c2 ~ c + c''1 ~ \break + c2 ~ 2 } @end lilypond @noindent Al aplicar este truco, la nueva función de callback -@code{after-line-breaking} también debe llamar a la antigua, -si existe este valor predeterminado. Por ejemplo, si se usa con +@code{after-line-breaking} también debe llamar a la antigua, si +existe este valor predeterminado. Por ejemplo, si se usa con @code{Hairpin}, se debe llamar también a @code{ly:spanner::kill-zero-spanned-time}. @@ -1552,8 +1662,8 @@ si existe este valor predeterminado. Por ejemplo, si se usa con @item Algunos objetos no se pueden cambiar con @code{\override} por razones técnicas. Son ejemplos @code{NonMusicalPaperColumn} y @code{PaperColumn}. Se pueden cambiar con la función -@code{\overrideProperty} que funciona de forma similar a @code{\once -\override}, pero usa una sintaxis distinta. +@code{\overrideProperty} que funciona de forma similar a +@code{\once \override}, pero usa una sintaxis distinta. @example \overrideProperty diff --git a/Documentation/es/extending/scheme-tutorial.itely b/Documentation/es/extending/scheme-tutorial.itely index ad55dbc255..de1c30089f 100644 --- a/Documentation/es/extending/scheme-tutorial.itely +++ b/Documentation/es/extending/scheme-tutorial.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 743dc7b27888c776186336cf4b330d3ebfc821de + Translation of GIT committish: 934175b31d43c95e341b098f12c2e833522a5d45 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.22" @node Tutorial de Scheme @appendix Tutorial de Scheme @@ -21,18 +21,18 @@ @cindex evaluar Scheme @cindex LISP -LilyPond utiliza el lenguaje de programación Scheme, tanto como parte -de la sintaxis del código de entrada, como para servir de mecanismo -interno que une los módulos del programa entre sí. Esta sección es -una panorámica muy breve sobre cómo introducir datos en Scheme. Si -quiere saber más sobre Scheme, consulte +LilyPond utiliza el lenguaje de programación Scheme, tanto como +parte de la sintaxis del código de entrada, como para servir de +mecanismo interno que une los módulos del programa entre sí. Esta +sección es una panorámica muy breve sobre cómo introducir datos en +Scheme. Si quiere saber más sobre Scheme, consulte @uref{http://@/www@/.schemers@/.org}. LilyPond utiliza la implementación GNU Guile de Scheme, que está basada en el estándar @qq{R5RS} del lenguaje. Si está aprendiendo Scheme para usarlo con LilyPond, no se recomienda trabajar con una -implementación distinta (o que se refiera a un estándar diferente). -Hay información sobre Guile en +implementación distinta (o que se refiera a un estándar +diferente). Hay información sobre Guile en @uref{http://www.gnu.org/software/guile/}. El estándar de Scheme @qq{R5RS} se encuentra en @uref{http://www.schemers.org/Documents/Standards/R5RS/}. @@ -48,10 +48,10 @@ Hay información sobre Guile en @translationof Introduction to Scheme Comenzaremos con una introducción a Scheme. Para esta breve -introducción utilizaremos el intérprete GUILE para explorar la manera -en que el lenguaje funciona. Una vez nos hayamos familiarizado con -Scheme, mostraremos cómo se puede integrar el lenguaje en los archivos -de LilyPond. +introducción utilizaremos el intérprete GUILE para explorar la +manera en que el lenguaje funciona. Una vez nos hayamos +familiarizado con Scheme, mostraremos cómo se puede integrar el +lenguaje en los archivos de LilyPond. @menu @@ -69,45 +69,46 @@ de LilyPond. @translationof Scheme sandbox La instalación de LilyPond incluye también la de la implementación -Guile de Scheme. Sobre casi todos los sistemas puede experimentar en -una @qq{caja de arena} de Scheme abriendo una ventana del terminal y -tecleando @q{guile}. En algunos sistemas, sobre todo en Windows, -podría necesitar ajustar la variable de entorno @code{GUILE_LOAD_PATH} -a la carpeta @code{../usr/share/guile/1.8} dentro de la instalación de -LilyPond (para conocer la ruta completa a esta carpeta, consulte -@rlearning{Otras fuentes de información}). Como alternativa, los -usuarios de Windows pueden seleccionar simplemente @q{Ejecutar} del -menú Inicio e introducir @q{guile}. - -Sin embargo, está disponible un cajón de arena de Scheme listo para -funcionar con todo LilyPond cargado, con esta instrucción de la línea -de órdenes: +Guile de Scheme. Sobre casi todos los sistemas puede experimentar +en una @qq{caja de arena} de Scheme abriendo una ventana del +terminal y tecleando @q{guile}. En algunos sistemas, sobre todo +en Windows, podría necesitar ajustar la variable de entorno +@code{GUILE_LOAD_PATH} a la carpeta @code{../usr/share/guile/1.8} +dentro de la instalación de LilyPond (para conocer la ruta +completa a esta carpeta, consulte @rlearning{Otras fuentes de +información}). Como alternativa, los usuarios de Windows pueden +seleccionar simplemente @q{Ejecutar} del menú Inicio e introducir +@q{guile}. + +Sin embargo, está disponible un cajón de arena de Scheme listo +para funcionar con todo LilyPond cargado, con esta instrucción de +la línea de órdenes: @example lilypond scheme-sandbox @end example @noindent -Una vez está funcionando el cajón de arena, verá un indicador -del sistema de Guile: +Una vez está funcionando el cajón de arena, verá un indicador del +sistema de Guile: @lisp guile> @end lisp Podemos introducir expresiones de Scheme en este indicador para -experimentar con Scheme. Si quiere usar la biblioteca readline de GNU -para una más cómoda edición de la línea de órdenes de Scheme, consulte -el archivo @file{ly/scheme-sandbox.ly} para más información. Si ya ha -activado la biblioteca readline para las sesiones de Guile -interactivas fuera de LilyPond, debería funcionar también en el cajón -de arena. +experimentar con Scheme. Si quiere usar la biblioteca readline de +GNU para una más cómoda edición de la línea de órdenes de Scheme, +consulte el archivo @file{ly/scheme-sandbox.ly} para más +información. Si ya ha activado la biblioteca readline para las +sesiones de Guile interactivas fuera de LilyPond, debería +funcionar también en el cajón de arena. @node Variables de Scheme @subsection Variables de Scheme @translationof Scheme variables -Las variables de Scheme pueden tener cualquier valor válido de Scheme, -incluso un procedimiento de Scheme. +Las variables de Scheme pueden tener cualquier valor válido de +Scheme, incluso un procedimiento de Scheme. Las variables de Scheme se crean con @code{define}: @@ -116,8 +117,8 @@ guile> (define a 2) guile> @end lisp -Las variables de Scheme se pueden evaluar en el indicador del sistema -de guile, simplemente tecleando el nombre de la variable: +Las variables de Scheme se pueden evaluar en el indicador del +sistema de guile, simplemente tecleando el nombre de la variable: @lisp guile> a @@ -125,8 +126,8 @@ guile> a guile> @end lisp -Las variables de Scheme se pueden imprimir en la pantalla utilizando -la función display: +Las variables de Scheme se pueden imprimir en la pantalla +utilizando la función display: @lisp guile> (display a) @@ -134,9 +135,10 @@ guile> (display a) @end lisp @noindent -Observe que el valor @code{2} y el indicador del sistema @code{guile} -se muestran en la misma línea. Esto se puede evitar llamando al -procedimiento de nueva línea o imprimiendo un carácter de nueva línea. +Observe que el valor @code{2} y el indicador del sistema +@code{guile} se muestran en la misma línea. Esto se puede evitar +llamando al procedimiento de nueva línea o imprimiendo un carácter +de nueva línea. @lisp guile> (display a)(newline) @@ -146,8 +148,8 @@ guile> (display a)(display "\n") guile> @end lisp -Una vez que se ha creado una variable, su valor se puede modificar con -@code{set!}: +Una vez que se ha creado una variable, su valor se puede modificar +con @code{set!}: @lisp guile> (set! a 12345) @@ -160,9 +162,10 @@ guile> @subsection Tipos de datos simples de Scheme @translationof Scheme simple data types -El concepto más básico de un lenguaje son sus tipos de datos: números, -cadenas de caracteres, listas, etc. He aquí una lista de los tipos de -datos que son de relevancia respecto de la entrada de LilyPond. +El concepto más básico de un lenguaje son sus tipos de datos: +números, cadenas de caracteres, listas, etc. He aquí una lista de +los tipos de datos que son de relevancia respecto de la entrada de +LilyPond. @table @asis @item Booleanos @@ -173,8 +176,8 @@ Los valores Booleanos son Verdadero y Falso. Verdadero en Scheme es @item Números Los números se escriben de la forma normal, @code{1} es el número -(entero) uno, mientras que @w{@code{-1.5}} es un número en coma flotante -(un número no entero). +(entero) uno, mientras que @w{@code{-1.5}} es un número en coma +flotante (un número no entero). @item Cadenas Las cadenas se encierran entre comillas: @@ -192,8 +195,8 @@ una cadena" @end example @noindent -y los caracteres de nueva línea al final de cada línea se incluirán -dentro de la cadena. +y los caracteres de nueva línea al final de cada línea se +incluirán dentro de la cadena. Los caracteres de nueva línea también se pueden añadir mediante la inclusión de @code{\n} en la cadena. @@ -204,8 +207,8 @@ inclusión de @code{\n} en la cadena. Las comillas dobles y barras invertidas se añaden a las cadenas -precediéndolas de una barra invertida. La cadena @code{\a dijo "b"} -se introduce como +precediéndolas de una barra invertida. La cadena @code{\a dijo +"b"} se introduce como @example "\\a dijo \"b\"" @@ -213,17 +216,18 @@ se introduce como @end table -Existen más tipos de datos de Scheme que no se estudian aquí. Para -ver un listado completo, consulte la guía de referencia de Guile, +Existen más tipos de datos de Scheme que no se estudian aquí. +Para ver un listado completo, consulte la guía de referencia de +Guile, @uref{http://www.gnu.org/software/guile/manual/html_node/Simple-Data-Types.html}. @node Tipos de datos compuestos de Scheme @subsection Tipos de datos compuestos de Scheme @translationof Scheme compound data types -También existen tipos de datos compuestos en Scheme. Entre los tipos -más usados en la programación de LilyPond se encuentran las parejas, -las listas, las listas-A y las tablas de hash. +También existen tipos de datos compuestos en Scheme. Entre los +tipos más usados en la programación de LilyPond se encuentran las +parejas, las listas, las listas-A y las tablas de hash. @menu * Parejas:: @@ -236,10 +240,10 @@ las listas, las listas-A y las tablas de hash. @unnumberedsubsubsec Parejas @translationof Pairs -El tipo fundacional de datos compuestos de Scheme es la @code{pareja}. -Como se espera por su nombre, una pareja son dos valores unidos en uno -solo. El operador que se usa para formar una pareja se llama -@code{cons}. +El tipo fundacional de datos compuestos de Scheme es la +@code{pareja}. Como se espera por su nombre, una pareja son dos +valores unidos en uno solo. El operador que se usa para formar +una pareja se llama @code{cons}. @lisp guile> (cons 4 5) @@ -261,8 +265,8 @@ guile> '(4 . 5) guile> @end lisp -Los dos elementos de una pareja pueden ser cualquier valor válido de -Scheme: +Los dos elementos de una pareja pueden ser cualquier valor válido +de Scheme: @lisp guile> (cons #t #f) @@ -272,8 +276,9 @@ guile> '("bla-bla" . 3.1415926535) guile> @end lisp -Se puede accede al primero y segundo elementos de la pareja mediante -los procedimientos de Scheme @code{car} y @code{cdr}, respectivamente. +Se puede accede al primero y segundo elementos de la pareja +mediante los procedimientos de Scheme @code{car} y @code{cdr}, +respectivamente. @lisp guile> (define mipareja (cons 123 "Hola") @@ -295,34 +300,44 @@ véase @unnumberedsubsubsec Listas @translationof Lists -Una estructura de datos muy común en Scheme es la @emph{lista}. -Formalmente, una lista se define como la lista vacía (representada -como @code{'()}, o bien como una pareja cuyo @code{cdr} es una lista. +Una estructura de datos muy común en Scheme es la +@emph{lista}. Formalmente, una lista @q{bien hecha} se define como +la lista vacía, representada como @code{'()} y con longitud cero, +o bien como una pareja cuyo @code{cdr} es a su vez una lista más +corta. -Existen muchas formas de crear listas. Quizá la más común es con el -procedimiento @code{list}: +Existen muchas formas de crear listas. Quizá la más común es con +el procedimiento @code{list}: @lisp guile> (list 1 2 3 "abc" 17.5) (1 2 3 "abc" 17.5) @end lisp -Como se ve, una lista se imprime en la forma de elementos individuales -separados por espacios y encerradas entre paréntesis. A diferencia de -las parejas, no hay ningún punto entre los elementos. +La representación de una lista como elementos individuales +separados por espacios y encerrada entre paréntesis es realmente +una forma compacta de las parejas con punto que constituyen la +lista, donde el punto e inmediatamente un paréntesis de apertura +se suprimen junto al paréntesis de cierre correspondiente. Sin +esta compactación, la salida habría sido +@lisp +(1 . (2 . (3 . ("abc" . (17.5 . ()))))) +@end lisp -También se puede escribir una lista como una lista literal encerrando -sus elementos entre paréntesis y añadiendo un apóstrofo: +De igual forma que con la salida, una lista puede escribirse +(después de haber añadido un apóstrofo para evitar su +interpretación como una llamada de función) como una lista literal +encerrando sus elementos entre paréntesis: @lisp guile> '(17 23 "fulano" "mengano" "zutano") (17 23 "fulano" "mengano" "zutano") @end lisp -Las listas son una parte fundamental de Scheme. De hecho, Scheme se -considera un dialecto de Lisp, donde @q{lisp} es una abreviatura de -@q{List Processing} (proceso de listas). Todas las expresiones de -Scheme son listas. +Las listas son una parte fundamental de Scheme. De hecho, Scheme +se considera un dialecto de Lisp, donde @q{lisp} es una +abreviatura de @q{List Processing} (proceso de listas). Todas las +expresiones de Scheme son listas. @node Listas asociativas (listas-A) @@ -330,14 +345,14 @@ Scheme son listas. @translationof Association lists (alists) Un tipo especial de listas son las @emph{listas asociativas} o -@emph{listas-A}. Se puede usar una lista-A para almacenar datos para -su fácil recuperación posterior. +@emph{listas-A}. Se puede usar una lista-A para almacenar datos +para su fácil recuperación posterior. -Las listas-A son listas cuyos elementos son parejas. El @code{car} de -cada elemento se llama @emph{clave}, y el @code{cdr} de cada elemento -se llama @emph{valor}. El procedimiento de Scheme @code{assoc} se usa -para recuperar un elemento de la lista-A, y @code{cdr} se usa para -recuperar el valor: +Las listas-A son listas cuyos elementos son parejas. El +@code{car} de cada elemento se llama @emph{clave}, y el @code{cdr} +de cada elemento se llama @emph{valor}. El procedimiento de +Scheme @code{assoc} se usa para recuperar un elemento de la +lista-A, y @code{cdr} se usa para recuperar el valor: @lisp guile> (define mi-lista-a '((1 . "A") (2 . "B") (3 . "C"))) @@ -350,21 +365,22 @@ guile> (cdr (assoc 2 mi-lista-a)) guile> @end lisp -Las listas-A se usan mucho en LilyPond para almacenar propiedades y -otros datos. +Las listas-A se usan mucho en LilyPond para almacenar propiedades +y otros datos. @node Tablas de hash @unnumberedsubsubsec Tablas de hash @translationof Hash tables -Estructuras de datos que se utilizan en LilyPond de forma ocasional. -Una tabla de hash es similar a una matriz, pero los índices de la -matriz pueden ser cualquier tipo de valor de Scheme, no sólo enteros. +Estructuras de datos que se utilizan en LilyPond de forma +ocasional. Una tabla de hash es similar a una matriz, pero los +índices de la matriz pueden ser cualquier tipo de valor de Scheme, +no sólo enteros. -Las tablas de hash son más eficientes que las listas-A si hay una gran -cantidad de datos que almacenar y los datos cambian con muy poca -frecuencia. +Las tablas de hash son más eficientes que las listas-A si hay una +gran cantidad de datos que almacenar y los datos cambian con muy +poca frecuencia. La sintaxis para crear tablas de hash es un poco compleja, pero veremos ejemplos de ello en el código fuente de LilyPond. @@ -393,8 +409,8 @@ guile> @end lisp Las claves y los valores se recuperan como una pareja con -@code{hashq-get-handle}. Ésta es la forma preferida, porque devuelve -@code{#f} si no se encuentra la clave. +@code{hashq-get-handle}. Ésta es la forma preferida, porque +devuelve @code{#f} si no se encuentra la clave. @lisp guile> (hashq-get-handle h 'key1) @@ -429,16 +445,16 @@ símbolos, una lista de símbolos y una lista de listas respectivamente: @end ignore Scheme se puede usar para hacer cálculos. Utiliza sintaxis -@emph{prefija}. Sumar 1 y@tie{}2 se escribe como @code{(+ 1 2)} y no -como el tradicional @math{1+2}. +@emph{prefija}. Sumar 1 y@tie{}2 se escribe como @code{(+ 1 2)} y +no como el tradicional @math{1+2}. @lisp guile> (+ 1 2) 3 @end lisp -Los cálculos se pueden anidar; el resultado de una función se puede -usar para otro cálculo. +Los cálculos se pueden anidar; el resultado de una función se +puede usar para otro cálculo. @lisp guile> (+ 1 (* 3 4)) @@ -448,9 +464,10 @@ guile> (+ 1 (* 3 4)) Estos cálculos son ejemplos de evaluaciones; una expresión como @code{(* 3 4)} se sustituye por su valor @code{12}. -Los cálculos de Scheme son sensibles a las diferencias entre enteros y -no enteros. Los cálculos enteros son exactos, mientras que los no -enteros se calculan con los límites de precisión adecuados: +Los cálculos de Scheme son sensibles a las diferencias entre +enteros y no enteros. Los cálculos enteros son exactos, mientras +que los no enteros se calculan con los límites de precisión +adecuados: @lisp guile> (/ 7 3) @@ -460,13 +477,13 @@ guile> (/ 7.0 3.0) @end lisp Cuando el intérprete de Scheme encuentra una expresión que es una -lista, el primer elemento de la lista se trata como un procedimiento a -evaluar con los argumentos del resto de la lista. Por tanto, todos -los operadores en Scheme son operadores prefijos. +lista, el primer elemento de la lista se trata como un +procedimiento a evaluar con los argumentos del resto de la lista. +Por tanto, todos los operadores en Scheme son operadores prefijos. -Si el primer elemento de una expresión de Scheme que es una lista que -se pasa al intérprete @emph{no es} un operador o un procedimiento, se -produce un error: +Si el primer elemento de una expresión de Scheme que es una lista +que se pasa al intérprete @emph{no es} un operador o un +procedimiento, se produce un error: @lisp guile> (1 2 3) @@ -481,13 +498,13 @@ ABORT: (misc-error) guile> @end lisp -Aquí podemos ver que el intérprete estaba intentando tratar el 1 como -un operador o procedimiento, y no pudo hacerlo. De aquí que el error -sea "Wrong type to apply: 1". +Aquí podemos ver que el intérprete estaba intentando tratar el 1 +como un operador o procedimiento, y no pudo hacerlo. De aquí que +el error sea "Wrong type to apply: 1". -Así pues, para crear una lista debemos usar el operador de lista, o -podemos precederla de un apóstrofo para que el intérprete no trate de -evaluarla. +Así pues, para crear una lista debemos usar el operador de lista, +o podemos precederla de un apóstrofo para que el intérprete no +trate de evaluarla. @lisp guile> (list 1 2 3) @@ -497,8 +514,8 @@ guile> '(1 2 3) guile> @end lisp -Esto es un error que puede aparecer cuando trabaje con Scheme dentro -de LilyPond. +Esto es un error que puede aparecer cuando trabaje con Scheme +dentro de LilyPond. @ignore La misma asignación se puede hacer también completamente en Scheme, @@ -529,8 +546,8 @@ nombre @code{veintiCuatro}. @subsection Procedimientos de Scheme @translationof Scheme procedures -Los procedimientos de Scheme son expresiones de Scheme ejecutables que -devuelven un valor resultante de su ejecución. También pueden +Los procedimientos de Scheme son expresiones de Scheme ejecutables +que devuelven un valor resultante de su ejecución. También pueden manipular variables definidas fuera del procedimiento. @menu @@ -550,7 +567,8 @@ Los procedimientos se definen en Scheme con @code{define}: expresión-de-scheme-que-devuelve-un-valor) @end example -Por ejemplo, podemos definir un procedimiento para calcular la media: +Por ejemplo, podemos definir un procedimiento para calcular la +media: @lisp guile> (define (media x y) (/ (+ x y) 2)) @@ -558,9 +576,9 @@ guile> media # @end lisp -Una vez se ha definido un procedimiento, se llama poniendo el nombre -del procedimiento dentro de una lista. Por ejemplo, podemos calcular -la media de 3 y 12: +Una vez se ha definido un procedimiento, se llama poniendo el +nombre del procedimiento dentro de una lista. Por ejemplo, +podemos calcular la media de 3 y 12: @lisp guile> (media 3 12) @@ -572,9 +590,10 @@ guile> (media 3 12) @unnumberedsubsubsec Predicados @translationof Predicates -Los procedimientos de Scheme que devuelven valores booleanos se suelen -llamar @emph{predicados}. Por convenio (pero no por necesidad), -los nombres de predicados acaban en un signo de interrogación: +Los procedimientos de Scheme que devuelven valores booleanos se +suelen llamar @emph{predicados}. Por convenio (pero no por +necesidad), los nombres de predicados acaban en un signo de +interrogación: @lisp guile> (define (menor-que-diez? x) (< x 10)) @@ -589,28 +608,29 @@ guile> (menor-que-diez? 15) @unnumberedsubsubsec Valores de retorno @translationof Return values -Los procedimientos de Scheme siempre devuelven un valor de retorno, -que es el valor de la última expresión ejecutada en el procedimiento. -El valor de retorno puede ser cualquier valor de Scheme válido, -incluso una estructura de datos compleja o un procedimiento. +Los procedimientos de Scheme siempre devuelven un valor de +retorno, que es el valor de la última expresión ejecutada en el +procedimiento. El valor de retorno puede ser cualquier valor de +Scheme válido, incluso una estructura de datos compleja o un +procedimiento. -A veces, el usuario quiere tener varias expresiones de Scheme dentro -de un procedimiento. Existen dos formas en que se pueden combinar -distintas expresiones. La primera es el procedimiento @code{begin}, -que permite evaluar varias expresiones, y devuelve el valor de la -última expresión. +A veces, el usuario quiere tener varias expresiones de Scheme +dentro de un procedimiento. Existen dos formas en que se pueden +combinar distintas expresiones. La primera es el procedimiento +@code{begin}, que permite evaluar varias expresiones, y devuelve +el valor de la última expresión. @lisp guile> (begin (+ 1 2) (- 5 8) (* 2 2)) 4 @end lisp -La segunda forma de combinar varias expresiones es dentro de un bloque -@code{let}. Dentro de un bloque let, se crean una serie de ligaduras -o asignaciones, y después se evalúa una secuencia de expresiones que -pueden incluir esas ligaduras o asignaciones. El valor de retorno del -bloque let es el valor de retorno de la última sentencia del bloque -let: +La segunda forma de combinar varias expresiones es dentro de un +bloque @code{let}. Dentro de un bloque let, se crean una serie de +ligaduras o asignaciones, y después se evalúa una secuencia de +expresiones que pueden incluir esas ligaduras o asignaciones. El +valor de retorno del bloque let es el valor de retorno de la +última sentencia del bloque let: @lisp guile> (let ((x 2) (y 3) (z 4)) (display (+ x y)) (display (- z 4)) @@ -641,8 +661,8 @@ Scheme tiene un procedimiento @code{if}: @var{expresión-de-prueba} es una expresión que devuelve un valor booleano. Si @var{expresión-de-prueba} devuelve @code{#t}, el procedimiento @code{if} devuelve el valor de la -@var{expresión-de-cierto}, en caso contrario devuelve el valor de la -@var{expresión-de-falso}. +@var{expresión-de-cierto}, en caso contrario devuelve el valor de +la @var{expresión-de-falso}. @lisp guile> (define a 3) @@ -696,105 +716,112 @@ guile> (cond ((< a b) "a es menor que b") @funindex $ @funindex # -El intérprete Guile forma parte de LilyPond, lo que significa que se -puede incluir Scheme dentro de los archivos de entrada de LilyPond. -Existen varios métodos para incluir Scheme dentro de LilyPond. +El intérprete Guile forma parte de LilyPond, lo que significa que +se puede incluir Scheme dentro de los archivos de entrada de +LilyPond. Existen varios métodos para incluir Scheme dentro de +LilyPond. La manera más sencilla es utilizar el símbolo de almohadilla@tie{}@code{#} antes de una expresión de Scheme. Ahora bien, el código de entrada de LilyPond se estructura en -elementos y expresiones, de forma parecida a cómo el lenguaje humano -se estructura en palabras y frases. LilyPond tiene un analizador -léxico que reconoce elementos indivisibles (números literales, cadenas -de texto, elementos de Scheme, nombres de nota, etc.), y un analizador -que entiende la sintaxis, la Gramática de LilyPond (@rcontrib{LilyPond grammar}). -Una vez que sabe que se aplica una regla sintáctica concreta, ejecuta -las acciones asociadas con ella. +elementos y expresiones, de forma parecida a cómo el lenguaje +humano se estructura en palabras y frases. LilyPond tiene un +analizador léxico que reconoce elementos indivisibles (números +literales, cadenas de texto, elementos de Scheme, nombres de nota, +etc.), y un analizador que entiende la sintaxis, la Gramática de +LilyPond (@rcontrib{LilyPond grammar}). Una vez que sabe que se +aplica una regla sintáctica concreta, ejecuta las acciones +asociadas con ella. El método del símbolo de almohadilla@tie{}@code{#} para incrustar Scheme se adapta de forma natural a este sistema. Una vez que el analizador léxico ve un símbolo de almohadilla, llama al lector de -Scheme para que lea una expresión de Scheme completa (que puede ser un -identificador, una expresión encerrada entre paréntesis, o algunas -otras cosas). Después de que se ha leído la expresión de Scheme, se -almacena como el valor de un elemento @code{SCM_TOKEN} de la -gramática. Después de que el analizador sintáctico ya sabe cómo hacer -uso de este elemento, llama a Guila para que evalúe la expresión de -Scheme. Dado que el analizador sintáctico suele requerir un poco de -lectura por delante por parte del analizador léxico para tomar sus -decisiones de análisis sintáctico, esta separación de lectura y -evaluación entre los analizadores léxico y sintáctico es justamente lo -que se necesita para mantener sincronizadas las ejecuciones de -expresiones de LilyPond y de Scheme. Por este motivo se debe usar el -símbolo de almohadilla@tie{}@code{#} para llamar a Scheme siempre que -sea posible. - -Otra forma de llamar al intérprete de Scheme desde lilyPond es el uso -del símbolo de dólar@tie{}@code{$} en lugar de la almohadilla para -introducir las expresiondes de Scheme. En este caso, LilyPond evalúa -el código justo después de que el analizador léxico lo ha leído. -Comprueba el tipo resultante de la expresión de Scheme y después -selecciona un tipo de elemento (uno de los varios elementos -@code{xxx_IDENTIFIER} dentro de la sintaxis) para él. Crea una -@emph{copia} del valor y la usa como valor del elemento. Si el valor -de la expresión es vacío (El valor de Guile de @code{*unspecified*}), -no se pasa nada en absoluto al analizador sintáctico. - -Éste es, de hecho, el mismo mecanismo exactamente que LilyPond emplea -cuando llamamos a cualquier variable o función musical por su nombre, -como @code{\nombre}, con la única diferencia de que el nombre viene -determinado por el analizador léxico de LilyPond sin consultar al -lector de Scheme, y así solamente se aceptan los nombres de variable -consistentes con el modo actual de LilyPond. +Scheme para que lea una expresión de Scheme completa (que puede +ser un identificador, una expresión encerrada entre paréntesis, o +algunas otras cosas). Después de que se ha leído la expresión de +Scheme, se almacena como el valor de un elemento @code{SCM_TOKEN} +de la gramática. Después de que el analizador sintáctico ya sabe +cómo hacer uso de este elemento, llama a Guila para que evalúe la +expresión de Scheme. Dado que el analizador sintáctico suele +requerir un poco de lectura por delante por parte del analizador +léxico para tomar sus decisiones de análisis sintáctico, esta +separación de lectura y evaluación entre los analizadores léxico y +sintáctico es justamente lo que se necesita para mantener +sincronizadas las ejecuciones de expresiones de LilyPond y de +Scheme. Por este motivo se debe usar el símbolo de +almohadilla@tie{}@code{#} para llamar a Scheme siempre que sea +posible. + +Otra forma de llamar al intérprete de Scheme desde LilyPond es el +uso del símbolo de dólar@tie{}@code{$} en lugar de la almohadilla +para introducir las expresiondes de Scheme. En este caso, +LilyPond evalúa el código justo después de que el analizador +léxico lo ha leído. Comprueba el tipo resultante de la expresión +de Scheme y después selecciona un tipo de elemento (uno de los +varios elementos @code{xxx_IDENTIFIER} dentro de la sintaxis) para +él. Crea una @emph{copia} del valor y la usa como valor del +elemento. Si el valor de la expresión es vacío (El valor de Guile +de @code{*unspecified*}), no se pasa nada en absoluto al +analizador sintáctico. + +Éste es, de hecho, el mismo mecanismo exactamente que LilyPond +emplea cuando llamamos a cualquier variable o función musical por +su nombre, como @code{\nombre}, con la única diferencia de que el +nombre viene determinado por el analizador léxico de LilyPond sin +consultar al lector de Scheme, y así solamente se aceptan los +nombres de variable consistentes con el modo actual de LilyPond. La acción inmediata de @code{$} puede llevar a alguna que otra -sorpresa, véase @ref{Variables de entrada y Scheme}. La utilización -de @code{#} donde el analizador sintáctico lo contempla es normalmente -preferible. Dentro de las expresiones musicales, aquellas que se -crean utilizando @code{#} @emph{se interprentan} como música. Sin -embargo, @emph{no se copian} antes de ser utilizadas. Si forman parte -de alguna estructura que aún podría tener algún uso, quizá tenga que -utilizar explícitamente @code{ly:music-deep-copy}. +sorpresa, véase @ref{Importación de Scheme dentro de LilyPond}. +La utilización de @code{#} donde el analizador sintáctico lo +contempla es normalmente preferible. Dentro de las expresiones +musicales, aquellas que se crean utilizando @code{#} @emph{se +interprentan} como música. Sin embargo, @emph{no se copian} antes +de ser utilizadas. Si forman parte de alguna estructura que aún +podría tener algún uso, quizá tenga que utilizar explícitamente +@code{ly:music-deep-copy}. @funindex $@@ @funindex #@@ -También existen los operadores de @q{división de listas} @code{$@@} y -@code{#@@} que insertan todos los elementos de una lista dentro del -contexto circundante. +También existen los operadores de @q{división de listas} +@code{$@@} y @code{#@@} que insertan todos los elementos de una +lista dentro del contexto circundante. Ahora echemos un vistazo a algo de código de Scheme real. Los -procedimientos de Scheme se pueden definir dentro de los archivos de -entrada de LilyPond: +procedimientos de Scheme se pueden definir dentro de los archivos +de entrada de LilyPond: @example #(define (media a b c) (/ (+ a b c) 3)) @end example -Observe que los comentarios de LilyPond (@code{%} y @code{%@{ %@}}) no -se pueden utilizar dentro del código de Scheme, ni siquiera dentro de -un archivo de entrada de LilyPond, porque es el intérprete Guile, y no -el analizador léxico de LilyPond, el que está leyendo la expresión de -Scheme. Los comentarios en el Scheme de Guile se introducen como -sigue: +Observe que los comentarios de LilyPond (@code{%} y @code{%@{ +%@}}) no se pueden utilizar dentro del código de Scheme, ni +siquiera dentro de un archivo de entrada de LilyPond, porque es el +intérprete Guile, y no el analizador léxico de LilyPond, el que +está leyendo la expresión de Scheme. Los comentarios en el Scheme +de Guile se introducen como sigue: @example ; esto es un comentario de una línea #! Esto es un comentario de bloque (no anidable) estilo Guile - Pero se usan rara vez por parte de los Schemers y nunca dentro del - código fuente de LilyPond + Pero se usan rara vez por parte de los Schemers + y nunca dentro del código fuente de LilyPond !# @end example Durante el resto de esta sección, supondremos que los datos se -introducen en un archivo de música, por lo que añadiremos -almohadillas@tie{}@code{#} al principio de todas las expresiones de Scheme. +introducen en un archivo de música, por lo que añadiremos una +almohadilla@tie{}@code{#} al principio de cada una de las +expresiones de Scheme. -Todas las expresiones de Scheme del nivel jerárquico superior dentro -de un archivo de entrada de LilyPond se pueden combinar en una sola -expresión de Scheme mediante la utilización del operador @code{begin}: +Todas las expresiones de Scheme del nivel jerárquico superior +dentro de un archivo de entrada de LilyPond se pueden combinar en +una sola expresión de Scheme mediante la utilización del operador +@code{begin}: @example #(begin @@ -821,8 +848,9 @@ equivale a #(define doce 12) @end example -Esto significa que las variables de LilyPond están disponibles para su -uso dentro de expresiones de Scheme. Por ejemplo, podríamos usar +Esto significa que las variables de LilyPond están disponibles +para su uso dentro de expresiones de Scheme. Por ejemplo, +podríamos usar @example veintiCuatro = (* 2 doce) @@ -832,25 +860,25 @@ veintiCuatro = (* 2 doce) lo que daría lugar a que el número 24 se almacenase dentro de la variable @code{veintiCuatro} de LilyPond (y de Scheme). -La forma usual de referirse a las variables de LilyPond, -@ref{Sintaxis del Scheme de LilyPond}, - -es llamarlas usando una barra invertida, es decir -@code{\veintiCuatro}. Dado que esto crea una copia para la mayor -parte de los tipos internos de LilyPond, concretamente las expresiones -musicales, las funciones musicales no sueln crear copias del material -que ellas mismas modifican. Por este motivo, las expresiones -musicales dadas con @code{#} no deberían, por lo general, contener -material que no se haya creado partiendo de cero o copiado -explícitamente en lugar de estar referenciado directamente. +La forma usual de referirse a las variables de LilyPond, es +llamarlas usando una barra invertida, es decir +@code{\veintiCuatro} (véase +@ref{Sintaxis del Scheme de LilyPond}). Dado que esto crea una +copia para la mayor parte de los tipos internos de LilyPond, +concretamente las expresiones musicales, las funciones musicales +no sueln crear copias del material que ellas mismas modifican. +Por este motivo, las expresiones musicales dadas con @code{#} no +deberían, por lo general, contener material que no se haya creado +partiendo de cero o copiado explícitamente en lugar de estar +referenciado directamente. @node Variables de entrada y Scheme @subsection Variables de entrada y Scheme @translationof Input variables and Scheme El formato de entrada contempla la noción de variables: en el -siguiente ejemplo, se asigna una expresión musical a una variable con -el nombre @code{traLaLa}. +siguiente ejemplo, se asigna una expresión musical a una variable +con el nombre @code{traLaLa}. @example traLaLa = @{ c'4 d'4 @} @@ -858,9 +886,10 @@ traLaLa = @{ c'4 d'4 @} @noindent -También hay una forma de ámbito: en el ejemplo siguiente, el bloque -@code{\layout} también contiene una variable @code{traLaLa}, que es -independiente de la @code{\traLaLa} externa. +También hay una forma de ámbito: en el ejemplo siguiente, el +bloque @code{\layout} también contiene una variable +@code{traLaLa}, que es independiente de la @code{\traLaLa} +externa. @example traLaLa = @{ c'4 d'4 @} @@ -868,13 +897,13 @@ traLaLa = @{ c'4 d'4 @} @end example @c -En efecto, cada archivo de entrada constituye un ámbito, y cada bloque -@code{\header}, @code{\midi} y @code{\layout} son ámbitos anidados -dentro del ámbito de nivel superior. +En efecto, cada archivo de entrada constituye un ámbito, y cada +bloque @code{\header}, @code{\midi} y @code{\layout} son ámbitos +anidados dentro del ámbito de nivel superior. -Tanto las variables como los ámbitos están implementados en el sistema -de módulos de GUILE. A cada ámbito se adjunta un módulo anónimo de -Scheme. Una asignación de la forma: +Tanto las variables como los ámbitos están implementados en el +sistema de módulos de GUILE. A cada ámbito se adjunta un módulo +anónimo de Scheme. Una asignación de la forma: @example traLaLa = @{ c'4 d'4 @} @@ -887,11 +916,12 @@ se convierte internamente en una definición de Scheme: (define traLaLa @var{Valor Scheme de `@code{@dots{}}'}) @end example -Esto significa que las variables de LilyPond y las variables de Scheme -se pueden mezclar con libertad. En el ejemplo siguiente, se almacena -un fragmento de música en la variable @code{traLaLa}, y se duplica -usando Scheme. El resultado se importa dentro de un bloque -@code{\score} por medio de una segunda variable @code{twice}: +Esto significa que las variables de LilyPond y las variables de +Scheme se pueden mezclar con libertad. En el ejemplo siguiente, +se almacena un fragmento de música en la variable @code{traLaLa}, +y se duplica usando Scheme. El resultado se importa dentro de un +bloque @code{\score} por medio de una segunda variable +@code{twice}: @lilypond[verbatim] traLaLa = { c'4 d'4 } @@ -906,13 +936,14 @@ traLaLa = { c'4 d'4 } @c Due to parser lookahead -En realidad, éste es un ejemplo bastante interesante. La asignación -solo tiene lugar después de que el analizador sintáctico se ha -asegurado de que no sigue nada parecido a @code{\addlyrics}, de manera -que necesita comprobar lo que viene a continuación. Lee el símbolo -@code{#} y la expresión de Scheme siguiente @emph{sin} evaluarla, de -forma que puede proceder a la asignación, y @emph{posteriormente} -ejecutar el código de Scheme sin problema. +En realidad, éste es un ejemplo bastante interesante. La +asignación solo tiene lugar después de que el analizador +sintáctico se ha asegurado de que no sigue nada parecido a +@code{\addlyrics}, de manera que necesita comprobar lo que viene a +continuación. Lee el símbolo @code{#} y la expresión de Scheme +siguiente @emph{sin} evaluarla, de forma que puede proceder a la +asignación, y @emph{posteriormente} ejecutar el código de Scheme +sin problema. @node Importación de Scheme dentro de LilyPond @subsection Importación de Scheme dentro de LilyPond @@ -920,12 +951,12 @@ ejecutar el código de Scheme sin problema. @funindex $ @funindex # -El ejemplo anterior muestra cómo @q{exportar} expresiones musicales -desde la entrada al intérprete de Scheme. Lo contrario también es -posible. Colocándolo después de @code{$}, un valor de Scheme se -interpreta como si hubiera sido introducido en la sintaxis de -LilyPond. En lugar de definir @code{\twice}, el ejemplo anterior -podría también haberse escrito como +El ejemplo anterior muestra cómo @q{exportar} expresiones +musicales desde la entrada al intérprete de Scheme. Lo contrario +también es posible. Colocándolo después de @code{$}, un valor de +Scheme se interpreta como si hubiera sido introducido en la +sintaxis de LilyPond. En lugar de definir @code{\twice}, el +ejemplo anterior podría también haberse escrito como @example @dots{} @@ -935,21 +966,22 @@ $(make-sequential-music newLa) Podemos utilizar @code{$} con una expresión de Scheme en cualquier lugar en el que usaríamos @code{\@var{nombre}} después de haber asignado la expresión de Scheme a una variable @var{nombre}. Esta -sustitución se produce dentro del @q{analizador léxico}, de manera que -LilyPond no llega a darse cuenta de la diferencia. +sustitución se produce dentro del @q{analizador léxico}, de manera +que LilyPond no llega a darse cuenta de la diferencia. -Sin embargo, existe un inconveniente, el de la medida del tiempo. Si -hubiésemos estado usando @code{$} en vez de @code{#} para definir -@code{newLa} en el ejemplo anterior, la siguiente definición de Scheme -habría fracasado porque @code{traLaLa} no habría sido definida aún. -Para ver una explicación de este problema de momento temporal, véase -@ref{Sintaxis del Scheme de LilyPond}. +Sin embargo, existe un inconveniente, el de la medida del tiempo. +Si hubiésemos estado usando @code{$} en vez de @code{#} para +definir @code{newLa} en el ejemplo anterior, la siguiente +definición de Scheme habría fracasado porque @code{traLaLa} no +habría sido definida aún. Para ver una explicación de este +problema de momento temporal, véase @ref{Sintaxis del Scheme de +LilyPond}. @funindex $@@ @funindex #@@ Un conveniente aspecto posterior pueden ser los operadores de -@q{división de listas} @code{$@@} y @code{#@@} para la inserción de -los elementos de una lista dentro del contexto circundante. +@q{división de listas} @code{$@@} y @code{#@@} para la inserción +de los elementos de una lista dentro del contexto circundante. Utilizándolos, la última parte del ejemplo se podría haber escrito como @@ -958,19 +990,20 @@ como @{ #@@newLa @} @end example -Aquí, cada elemento de la lista que está almacenado en @code{newLa} se -toma en secuencia y se inserta en la lista, como si hubiésemos escrito +Aquí, cada elemento de la lista que está almacenado en +@code{newLa} se toma en secuencia y se inserta en la lista, como +si hubiésemos escrito @example @{ #(first newLa) #(second newLa) @} @end example -Ahora bien, en todas esas formas, el código de Scheme se evalúa en el -momento en que el código de entrada aún se está procesando, ya sea en -el analizador léxico o en el analizador sintáctico. Si necesitamos -que se ejecute en un momento posterior, debemos consultar -@ref{Funciones de Scheme vacías}, o almacenarlo dentro de un -procedimiento: +Ahora bien, en todas esas formas, el código de Scheme se evalúa en +el momento en que el código de entrada aún se está procesando, ya +sea en el analizador léxico o en el analizador sintáctico. Si +necesitamos que se ejecute en un momento posterior, debemos +consultar @ref{Funciones de Scheme vacías}, o almacenarlo dentro +de un procedimiento: @example #(define (nopc) @@ -983,39 +1016,40 @@ procedimiento: @knownissues -No es posible mezclar variables de Scheme y de LilyPond con la opción -@option{--safe}. +No es posible mezclar variables de Scheme y de LilyPond con la +opción @option{--safe}. @node Propiedades de los objetos @subsection Propiedades de los objetos @translationof Object properties -Las propiedades de los objetos se almacenan en LilyPond en forma de -cadenas de listas-A, que son listas de listas-A. Las propiedades se -establecen añadiendo valores al principio de la lista de propiedades. -Las propiedades se leen extrayendo valores de las listas-A. +Las propiedades de los objetos se almacenan en LilyPond en forma +de cadenas de listas-A, que son listas de listas-A. Las +propiedades se establecen añadiendo valores al principio de la +lista de propiedades. Las propiedades se leen extrayendo valores +de las listas-A. -El establecimiento de un valor nuevo para una propiedad requiere la -asignación de un valor a la lista-A con una clave y un valor. La -sintaxis de LilyPond para hacer esto es la siguiente: +El establecimiento de un valor nuevo para una propiedad requiere +la asignación de un valor a la lista-A con una clave y un valor. +La sintaxis de LilyPond para hacer esto es la siguiente: @example \override Stem.thickness = #2.6 @end example Esta instrucción ajusta el aspecto de las plicas. Se añade una -entrada de lista-A @code{'(thickness . 2.6)} a la lista de propiedades -de un objeto @code{Stem}. @code{thickness} se mide a partir del -grosor de las líneas del pentagrama, y así estas plicas serán -@code{2.6} veces el grosor de las líneas del pentagrama. Esto hace -que las plicas sean casi el doble de gruesas de lo normal. Para -distinguir entre las variables que se definen en los archivos de -entrada (como @code{veintiCuatro} en el ejemplo anterior) y las -variables de los objetos internos, llamaremos a las últimas -@q{propiedades} y a las primeras @q{variables.} Así, el objeto plica -tiene una propiedad @code{thickness} (grosor), mientras que -@code{veintiCuatro} es una variable. +entrada de lista-A @code{'(thickness . 2.6)} a la lista de +propiedades de un objeto @code{Stem}. @code{thickness} se mide a +partir del grosor de las líneas del pentagrama, y así estas plicas +serán @code{2.6} veces el grosor de las líneas del pentagrama. +Esto hace que las plicas sean casi el doble de gruesas de lo +normal. Para distinguir entre las variables que se definen en los +archivos de entrada (como @code{veintiCuatro} en el ejemplo +anterior) y las variables de los objetos internos, llamaremos a +las últimas @q{propiedades} y a las primeras @q{variables.} Así, +el objeto plica tiene una propiedad @code{thickness} (grosor), +mientras que @code{veintiCuatro} es una variable. @cindex propiedades frente a variables @cindex variables frente a propiedades @@ -1041,18 +1075,19 @@ tiene una propiedad @code{thickness} (grosor), mientras que @unnumberedsubsubsec Desplazamientos @translationof Offsets -Los desplazamientos bidimensionales (coordenadas X e Y) se almacenan -como @emph{parejas}. El @code{car} del desplazamiento es la -coordenada X, y el @code{cdr} es la coordenada Y. +Los desplazamientos bidimensionales (coordenadas X e Y) se +almacenan como @emph{parejas}. El @code{car} del desplazamiento +es la coordenada X, y el @code{cdr} es la coordenada Y. @example \override TextScript.extra-offset = #'(1 . 2) @end example Esto asigna la pareja @code{(1 . 2)} a la propiedad -@code{extra-offset} del objeto TextScript. Estos números se miden en -espacios de pentagrama, y así esta instrucción mueve el objeto un -espacio de pentagrama a la derecha, y dos espacios hacia arriba. +@code{extra-offset} del objeto TextScript. Estos números se miden +en espacios de pentagrama, y así esta instrucción mueve el objeto +un espacio de pentagrama a la derecha, y dos espacios hacia +arriba. Los procedimientos para trabajar con desplazamientos están en @file{scm/lily-library.scm}. @@ -1061,13 +1096,14 @@ Los procedimientos para trabajar con desplazamientos están en @unnumberedsubsubsec Fracciones @subheading Fractions -Las fracciones tal y como se utilizan por parte de LilyPond -se almacenan, de nuevo, como @emph{parejas}, esta -vez de enteros sin signo. Mientras que Scheme es capaz de representar números racionaes -como un tipo nativo, musicalmente @samp{2/4} y @samp{1/2} no son lo mismo, -y necesitamos poder distinguir entre ellos. De igual forma, no existe el concepto -de @q{fracciones} negativas en LilyPond. Así pues, @code{2/4} en LilyPond -significa @code{(2 . 4)} en Scheme, y @code{#2/4} en LilyPond significa +Las fracciones tal y como se utilizan por parte de LilyPond se +almacenan, de nuevo, como @emph{parejas}, esta vez de enteros sin +signo. Mientras que Scheme es capaz de representar números +racionaes como un tipo nativo, musicalmente @samp{2/4} y +@samp{1/2} no son lo mismo, y necesitamos poder distinguir entre +ellos. De igual forma, no existe el concepto de @q{fracciones} +negativas en LilyPond. Así pues, @code{2/4} en LilyPond significa +@code{(2 . 4)} en Scheme, y @code{#2/4} en LilyPond significa @code{1/2} en Scheme. @@ -1075,14 +1111,14 @@ significa @code{(2 . 4)} en Scheme, y @code{#2/4} en LilyPond significa @unnumberedsubsubsec Dimensiones @translationof Extents -Las parejas se usan también para almacenar intervalos, que representan -un rango de números desde el mínimo (el @code{car}) hasta el máximo -(el @code{cdr}). Los intervalos se usan para almacenar las -dimensiones en X y en Y de los objetos imprimibles. Para dimensiones -en X, el @code{car} es la coordenada X de la parte izquierda, y el -@code{cdr} es la coordenada X de la parte derecha. Para las -dimensiones en Y, el @code{car} es la coordenada inferior, y el -@code{cdr} es la coordenada superior. +Las parejas se usan también para almacenar intervalos, que +representan un rango de números desde el mínimo (el @code{car}) +hasta el máximo (el @code{cdr}). Los intervalos se usan para +almacenar las dimensiones en X y en Y de los objetos imprimibles. +Para dimensiones en X, el @code{car} es la coordenada X de la +parte izquierda, y el @code{cdr} es la coordenada X de la parte +derecha. Para las dimensiones en Y, el @code{car} es la +coordenada inferior, y el @code{cdr} es la coordenada superior. Los procedimientos para trabajar con intervalos están en @file{scm/lily-library.scm}. Se deben usar estos procedimientos @@ -1093,12 +1129,13 @@ siempre que sea posible, para asegurar la consistencia del código. @unnumberedsubsubsec Listas-A de propiedades @translationof Property alists -Una lista-A de propiedades es una estructura de datos de LilyPond que -es una lista-A cuyas claves son propiedades y cuyos valores son -expresiones de Scheme que dan el valor deseado de la propiedad. +Una lista-A de propiedades es una estructura de datos de LilyPond +que es una lista-A cuyas claves son propiedades y cuyos valores +son expresiones de Scheme que dan el valor deseado de la +propiedad. -Las propiedades de LilyPond son símbolos de Scheme, como por ejemplo -@code{'thickness}. +Las propiedades de LilyPond son símbolos de Scheme, como por +ejemplo @code{'thickness}. @node Cadenas de listas-A @@ -1110,69 +1147,71 @@ propiedades. El conjunto de todas las propiedades que se aplican a un grob se almacena por lo general como una cadena de listas-A. Para poder -encontrar el valor de una propiedad determinada que debería tener un -grob, se busca por todas las listas-A de la cadena, una a una, +encontrar el valor de una propiedad determinada que debería tener +un grob, se busca por todas las listas-A de la cadena, una a una, tratando de encontrar una entrada que contenga la clave de la propiedad. Se devuelve la primera entrada de lista-A que se encuentre, y el valor es el valor de la propiedad. -El procedimiento de Scheme @code{chain-assoc-get} se usa normalmente -para obtener los valores de propiedades. +El procedimiento de Scheme @code{chain-assoc-get} se usa +normalmente para obtener los valores de propiedades. @node Representación interna de la música @subsection Representación interna de la música @translationof Internal music representation -Internamente, la música se representa como una lista de Scheme. La -lista contiene varios elementos que afectan a la salida impresa. El -análisis sintáctico es el proceso de convertir la música de la -representación de entrada de LilyPond a la representación interna de -Scheme. +Internamente, la música se representa como una lista de Scheme. +La lista contiene varios elementos que afectan a la salida +impresa. El análisis sintáctico es el proceso de convertir la +música de la representación de entrada de LilyPond a la +representación interna de Scheme. -Cuando se analiza una expresión musical, se convierte en un conjunto -de objetos musicales de Scheme. La propiedad definitoria de un objeto -musical es que ocupa un tiempo. El tiempo que ocupa se llama -@emph{duración}. Las duraciones se expresan como un número racional -que mide la longitud del objeto musical en redondas. +Cuando se analiza una expresión musical, se convierte en un +conjunto de objetos musicales de Scheme. La propiedad definitoria +de un objeto musical es que ocupa un tiempo. El tiempo que ocupa +se llama @emph{duración}. Las duraciones se expresan como un +número racional que mide la longitud del objeto musical en +redondas. Un objeto musical tiene tres clases de tipos: @itemize @item -nombre musical: Cada expresión musical tiene un nombre. Por ejemplo, -una nota lleva a un @rinternals{NoteEvent}, y @code{\simultaneous} -lleva a una @rinternals{SimultaneousMusic}. Hay una lista de todas -las expresiones disponibles en el manual de Referencia de -funcionamiento interno, bajo el epígrafe @rinternals{Music -expressions}. +nombre musical: Cada expresión musical tiene un nombre. Por +ejemplo, una nota lleva a un @rinternals{NoteEvent}, y +@code{\simultaneous} lleva a una @rinternals{SimultaneousMusic}. +Hay una lista de todas las expresiones disponibles en el manual de +Referencia de funcionamiento interno, bajo el epígrafe +@rinternals{Music expressions}. @item @q{type} (tipo) o interface: Cada nombre musical tiene varios -@q{tipos} o interfaces, por ejemplo, una nota es un @code{event}, pero -también es un @code{note-event}, un @code{rhythmic-event}, y un -@code{melodic-event}. Todas las clases de música están listadas en el -manual de Referencia de funcionamiento interno, bajo el epígrafe -@rinternals{Music classes}. +@q{tipos} o interfaces, por ejemplo, una nota es un @code{event}, +pero también es un @code{note-event}, un @code{rhythmic-event}, y +un @code{melodic-event}. Todas las clases de música están +listadas en el manual de Referencia de funcionamiento interno, +bajo el epígrafe @rinternals{Music classes}. @item -objeto de C++: Cada objeto musical está representado por un objeto de -la clase @code{Music} de C++. +objeto de C++: Cada objeto musical está representado por un objeto +de la clase @code{Music} de C++. @end itemize La información real de una expresión musical se almacena en -propiedades. Por ejemplo, un @rinternals{NoteEvent} tiene propiedades -@code{pitch} y @code{duration} que almacenan la altura y la duración -de esa nota. Hay una lista de todas la propiedades disponibles en el -manual de Referencia de funcionamiento interno, bajo el epígrafe -@rinternals{Music properties}. +propiedades. Por ejemplo, un @rinternals{NoteEvent} tiene +propiedades @code{pitch} y @code{duration} que almacenan la altura +y la duración de esa nota. Hay una lista de todas la propiedades +disponibles en el manual de Referencia de funcionamiento interno, +bajo el epígrafe @rinternals{Music properties}. Una expresión musical compuesta es un objeto musical que contiene -otros objetos musicales dentro de sus propiedades. Se puede almacenar -una lista de objetos dentro de la propiedad @code{elements} de un -objeto musical, o un único objeto musical @q{hijo} dentro de la -propiedad @code{element}. Por ejemplo, @rinternals{SequentialMusic} -tiene su hijo dentro de @code{elements}, y @rinternals{GraceMusic} -tiene su argumento único dentro de @code{element}. El cuerpo de una -repetición se almacena dentro de la propiedad @code{element} de +otros objetos musicales dentro de sus propiedades. Se puede +almacenar una lista de objetos dentro de la propiedad +@code{elements} de un objeto musical, o un único objeto musical +@q{hijo} dentro de la propiedad @code{element}. Por ejemplo, +@rinternals{SequentialMusic} tiene su hijo dentro de +@code{elements}, y @rinternals{GraceMusic} tiene su argumento +único dentro de @code{element}. El cuerpo de una repetición se +almacena dentro de la propiedad @code{element} de @rinternals{RepeatedMusic}, y las alternativas dentro de @code{elements}. @@ -1180,8 +1219,8 @@ repetición se almacena dentro de la propiedad @code{element} de @section Construir funciones complicadas @translationof Building complicated functions -Esta sección explica cómo reunir la información necesaria para crear -funciones musicales complicadas. +Esta sección explica cómo reunir la información necesaria para +crear funciones musicales complicadas. @menu * Presentación de las expresiones musicales:: @@ -1201,9 +1240,10 @@ funciones musicales complicadas. @cindex displayMusic @funindex \displayMusic -Si se está escribiendo una función musical, puede ser muy instructivo -examinar cómo se almacena internamente una expresión musical. Esto se -puede hacer con la función musical @code{\displayMusic} +Si se está escribiendo una función musical, puede ser muy +instructivo examinar cómo se almacena internamente una expresión +musical. Esto se puede hacer con la función musical +@code{\displayMusic}. @example @{ @@ -1232,24 +1272,32 @@ imprime lo siguiente: @end example De forma predeterminada, LilyPond imprime estos mensajes sobre la -consola junto al resto de los mensajes. Para separar estos mensajes y -guardar el resultado de @code{\display@{LOQUESEA@}}, redirija la -salida a un archivo. +consola junto al resto de los mensajes. Para separar estos +mensajes y guardar el resultado de @code{\display@{LOQUESEA@}}, +puede especificar que se use un puerto de salida opcional: @example -lilypond archivo.ly >salida.txt +@{ + \displayMusic #(open-output-file "display.txt") @{ c'4\f @} +@} @end example -Con un poco de magia combinada de LilyPond y Scheme, podemos realmente -hacer que LilyPond dirija solamente esta salida a su propio archivo: - +Esto sobreescribe el archivo de salida anterior cada vez ques e +llama; si necesitamos escribir más de una expresión, debemos usar +una variable para el puerto y reutilizarla: @example @{ - #(with-output-to-file "display.txt" - (lambda () #@{ \displayMusic @{ c'4\f @} #@})) + port = #(open-output-file "display.txt") + \displayMusic \port @{ c'4\f @} + \displayMusic \port @{ d'4 @} + #(close-output-port port) @} @end example +El manual de Guile describe los puertos detalladamente. Solo es +realmente necesario cerrar el puerto si necesitamos leer el +archivo antes de que LilyPond termine; en el primer ejemplo, no +nos hemos molestado en hacerlo. Un poco de reformateo hace a la información anterior más fácil de leer: @@ -1267,26 +1315,30 @@ leer: @end example Una secuencia musical @code{@{ @dots{} @}} tiene el nombre -@code{SequentialMusic}, y sus expresiones internas se almacenan coma -una lista dentro de su propiedad @code{'elements}. Una nota se -representa como un objeto @code{NoteEvent} (que almacena las +@code{SequentialMusic}, y sus expresiones internas se almacenan +coma una lista dentro de su propiedad @code{'elements}. Una nota +se representa como un objeto @code{NoteEvent} (que almacena las propiedades de duración y altura) con información adjunta (en este caso, un evento @code{AbsoluteDynamicEvent} con una propiedad -@code{"f"} de texto) almacenada en su propiedad @code{articulations}. +@code{"f"} de texto) almacenada en su propiedad +@code{articulations}. @funindex{\void} -@code{\displayMusic} devuelve la música que imprime en la consola, y -por ello se interpretará al tiempo que se imprime en la consola. Para -evitar la interpretación, escriba @code{\void} antes de + +@code{\displayMusic} devuelve la música que imprime en la consola, +y por ello se interpretará al tiempo que se imprime en la consola. +Para evitar la interpretación, escriba @code{\void} antes de @code{\displayMusic}. @node Propiedades musicales @subsection Propiedades musicales @translationof Music properties -@c TODO -- make sure we delineate between @emph{music} properties, -@c @emph{context} properties, and @emph{layout} properties. These -@c are potentially confusing. +@ignore +TODO -- make sure we delineate between @emph{music} properties, +@emph{context} properties, and @emph{layout} properties. These +are potentially confusing. +@end ignore Veamos un ejemplo: @@ -1302,8 +1354,9 @@ someNote = c' (ly:make-pitch 0 0 0)) @end example -The @code{NoteEvent} object is the representation of @code{someNote}. -Straightforward. How about putting c' in a chord? +El objeto @code{NoteEvent} es la representación de +@code{someNote}. Sencillo. ¿Y si ponemos el c' dentro de un +acorde? @example someNote = @@ -1320,12 +1373,12 @@ someNote = (ly:make-pitch 0 0 0)))) @end example -Ahora el objeto @code{NoteEvent} es el primer objeto -de la propiedad @code{'elements} de @code{someNote}. +Ahora el objeto @code{NoteEvent} es el primer objeto de la +propiedad @code{'elements} de @code{someNote}. -La función @code{display-scheme-music} es la función que se usa por -parte de @code{\displayMusic} para imprimir la representación de -Scheme de una expresión musical. +La función @code{display-scheme-music} es la función que se usa +por parte de @code{\displayMusic} para imprimir la representación +de Scheme de una expresión musical. @example #(display-scheme-music (first (ly:music-property someNote 'elements))) @@ -1349,8 +1402,8 @@ Después se accede a la altura de la nota a través de la propiedad (ly:make-pitch 0 0 0) @end example -La altura de la nota se puede cambiar estableciendo el valor de esta -propiedad @code{'pitch}, +La altura de la nota se puede cambiar estableciendo el valor de +esta propiedad @code{'pitch}. @funindex \displayLilyMusic @@ -1360,7 +1413,7 @@ propiedad @code{'pitch}, (ly:make-pitch 0 1 0)) ;; establecer la altura a d'. \displayLilyMusic \someNote ===> -d' +d'4 @end example @@ -1368,9 +1421,10 @@ d' @subsection Duplicar una nota con ligaduras (ejemplo) @translationof Doubling a note with slurs (example) -Supongamos que queremos crear una función que convierte una entrada -como @code{a} en @code{@{ a( a) @}}. Comenzamos examinando la -representación interna de la música con la que queremos terminar. +Supongamos que queremos crear una función que convierte una +entrada como @code{a} en @code{@{ a( a) @}}. Comenzamos +examinando la representación interna de la música con la que +queremos terminar. @example \displayMusic@{ a'( a') @} @@ -1403,10 +1457,10 @@ representación interna de la música con la que queremos terminar. @end example La mala noticia es que las expresiones @code{SlurEvent} se deben -añadir @q{dentro} de la nota (dentro de la -propiedad @code{articulations}). +añadir @q{dentro} de la nota (dentro de la propiedad +@code{articulations}). -Ahora examinamos la entrada, +Ahora examinamos la entrada. @example \displayMusic a' @@ -1419,19 +1473,19 @@ Ahora examinamos la entrada, (ly:make-pitch 0 5 0)))) @end example -Así pues, en nuestra función, tenemos que clonar esta expresión (de -forma que tengamos dos notas para construir la secuencia), añadir -@code{SlurEvent} a la propiedad @code{'articulations} de cada una de -ellas, y por último hacer una secuencia @code{SequentialMusic} con los -dos elementos @code{NoteEvent}. Para añadir a una propiedad, es útil saber -que una propiedad no establecida se lee como @code{'()}, la lista -vacía, así que no se requiere ninguna comprobación especial antes de -que pongamos otro elemento delante de la propiedad -@code{articulations}. +Así pues, en nuestra función, tenemos que clonar esta expresión +(de forma que tengamos dos notas para construir la secuencia), +añadir @code{SlurEvent} a la propiedad @code{'articulations} de +cada una de ellas, y por último hacer una secuencia +@code{SequentialMusic} con los dos elementos @code{NoteEvent}. +Para añadir a una propiedad, es útil saber que una propiedad no +establecida se lee como @code{'()}, la lista vacía, así que no se +requiere ninguna comprobación especial antes de que pongamos otro +elemento delante de la propiedad @code{articulations}. @example -doubleSlur = #(define-music-function (parser location note) (ly:music?) +doubleSlur = #(define-music-function (note) (ly:music?) "Return: @{ note ( note ) @}. `note' is supposed to be a single note." (let ((note2 (ly:music-deep-copy note))) @@ -1450,33 +1504,34 @@ doubleSlur = #(define-music-function (parser location note) (ly:music?) @translationof Adding articulation to notes (example) La manera fácil de añadir articulación a las notas es mezclar dos -expresiones musicales en un solo contexto. -Sin embargo, supongamos que queremos -escribir una función musical que lo haga. Esto tiene la ventaja -adicional de que podemos usar esa función musical para añadir una -articulación (como una instrucción de digitación) a una nota única -dentro de un acorde, lo cual no es posible si nos limitamos a mezclar -fragmentos de música independientes. - -Una @code{$variable} dentro de la notación @code{#@{@dots{}#@}} es como -una @code{\variable} normal en la notación clásica de LilyPond. -Sabemos que +expresiones musicales en un solo contexto. Sin embargo, +supongamos que queremos escribir una función musical que lo haga. +Esto tiene la ventaja adicional de que podemos usar esa función +musical para añadir una articulación (como una instrucción de +digitación) a una nota única dentro de un acorde, lo cual no es +posible si nos limitamos a mezclar fragmentos de música +independientes. + +Una @code{$variable} dentro de la notación @code{#@{@dots{}#@}} es +como una @code{\variable} normal en la notación clásica de +LilyPond. Sabemos que @example @{ \music -. -> @} @end example @noindent -no funciona en LilyPond. Podríamos evitar este problema adjuntando la -articulación a un acorde vacío, +no funciona en LilyPond. Podríamos evitar este problema +adjuntando la articulación a un acorde vacío, @example @{ << \music <> -. -> >> @} @end example @noindent -pero a los efectos de este ejemplo, aprenderemos ahora cómo hacerlo en -Scheme. Empezamos examinando nuestra entrada y la salida deseada, +pero a los efectos de este ejemplo, aprenderemos ahora cómo +hacerlo en Scheme. Empezamos examinando nuestra entrada y la +salida deseada. @example % input @@ -1535,46 +1590,47 @@ práctica en otros lenguajes de programación!) @noindent es una descripción de lo que hace la función. No es estrictamente -necesaria, pero de igual forma que los nombres claros de variable, es -una buena práctica. +necesaria, pero de igual forma que los nombres claros de variable, +es una buena práctica. -Se preguntará porqué modificamos el evento de nota directamente en -lugar de trabajar sobre una copia (se puede usar +Se preguntará por qué modificamos el evento de nota directamente +en lugar de trabajar sobre una copia (se puede usar @code{ly:music-deep-copy} para ello). La razón es un contrato silencioso: se permite que las funciones musicales modifiquen sus -argumentos; o bien se generan partiendo de cero (como la entrada del -usuario) o están ya copiadas (referenciar una variable de música con -@samp{\name} o la música procedente de expresiones de Scheme -inmediatas @samp{$(@dots{})} proporcionan una copia). Dado que sería -ineficiente crear copias innecesarias, el valor devuelto de una -función musical @emph{no} se copia. Así pues, para cumplir dicho -contrato, no debemos usar ningún argumento más de una vez, y +argumentos; o bien se generan partiendo de cero (como la entrada +del usuario) o están ya copiadas (referenciar una variable de +música con @samp{\name} o la música procedente de expresiones de +Scheme inmediatas @samp{$(@dots{})} proporcionan una copia). Dado +que sería ineficiente crear copias innecesarias, el valor devuelto +de una función musical @emph{no} se copia. Así pues, para cumplir +dicho contrato, no debemos usar ningún argumento más de una vez, y devolverlo cuenta como una vez. -En un ejemplo anterior, hemos construido música mediante la repetición -de un argumento musical dado. En tal caso, al menos una repetidión -tuvo que ser una copia de sí misma. Si no lo fuese, podrían ocurrir -cosas muy extrañas. Por ejemplo, si usamos @code{\relative} o -@code{\transpose} sobre la música resultante que contiene los mismos -elementos varias veces, estarían sujetos varias veces a la -relativización o al transporte. Si los asignamos a una variable de -música, se rompe el curso porque hacer referencia a @samp{\name} -creará de nuevo una copia que no retiene la identidad de los elementos -repetidos. - -Ahora bien, aun cuando la función anterior no es una función musical, -se usará normalmente dentro de funciones musicales. Así pues, tiene -sentido obedecer el mismo convenio que usamos para las funciones -musicales: la entrada puede modificarse para producir la salida, y el -código que llama es responsable de crear las copias si aún necesita el -propio argumento sin modificar. Si observamos las propias funciones -de LilyPond como @code{music-map}, veremos que se atienen a los mismos -principios. - -¿En qué punto nos encontramos? Ahora tenemos un @code{note-event} que -podemos modificar, no a causa de la utilización de -@code{ly:music-deep-copy} sino por una explicación muy desarrollada. -Añadimos el acento a su propiedad de lista @code{'articulations}. +En un ejemplo anterior, hemos construido música mediante la +repetición de un argumento musical dado. En tal caso, al menos +una repetidión tuvo que ser una copia de sí misma. Si no lo +fuese, podrían ocurrir cosas muy extrañas. Por ejemplo, si usamos +@code{\relative} o @code{\transpose} sobre la música resultante +que contiene los mismos elementos varias veces, estarían sujetos +varias veces a la relativización o al transporte. Si los +asignamos a una variable de música, se rompe el curso porque hacer +referencia a @samp{\name} creará de nuevo una copia que no retiene +la identidad de los elementos repetidos. + +Ahora bien, aun cuando la función anterior no es una función +musical, se usará normalmente dentro de funciones musicales. Así +pues, tiene sentido obedecer el mismo convenio que usamos para las +funciones musicales: la entrada puede modificarse para producir la +salida, y el código que llama es responsable de crear las copias +si aún necesita el propio argumento sin modificar. Si observamos +las propias funciones de LilyPond como @code{music-map}, veremos +que se atienen a los mismos principios. + +¿En qué punto nos encontramos? Ahora tenemos un @code{note-event} +que podemos modificar, no a causa de la utilización de +@code{ly:music-deep-copy} sino por una explicación muy +desarrollada. Añadimos el acento a su propiedad de lista +@code{'articulations}. @example (set! place new-value) @@ -1601,22 +1657,22 @@ propiedades musicales (las @code{'articulations}, @code{'duration}, (ly:music-property result-event-chord 'articulations)) @end example -Se usa @code{cons} para añadir un elemento a la parte delantera de una -lista sin modificar la lista original. Esto es lo que queremos: la -misma lista de antes, más la nueva expresión @code{ArticulationEvent}. -El orden dentro de la propiedad @code{'articulations} no tiene -importancia aquí. +Se usa @code{cons} para añadir un elemento a la parte delantera de +una lista sin modificar la lista original. Esto es lo que +queremos: la misma lista de antes, más la nueva expresión +@code{ArticulationEvent}. El orden dentro de la propiedad +@code{'articulations} no tiene importancia aquí. Finalmente, una vez hemos añadido la articulación de acento a su -propiedad @code{articulations}, podemos devolver @code{note-event}, de -aquí la última línea de la función. +propiedad @code{articulations}, podemos devolver +@code{note-event}, de aquí la última línea de la función. Ahora transformamos la función @code{add-accent} en una función musical (es cuestión de un poco de aderezo sintáctico y una -declaración del tipo de su único argumento @q{real}). +declaración del tipo de su argumento). @example -addAccent = #(define-music-function (parser location note-event) +addAccent = #(define-music-function (note-event) (ly:music?) "Add an accent ArticulationEvent to the articulations of `note-event', which is supposed to be a NoteEvent expression." @@ -1627,7 +1683,8 @@ addAccent = #(define-music-function (parser location note-event) note-event) @end example -Podemos verificar que esta función musical funciona correctamente: +A continuación verificamos que esta función musical funciona +correctamente: @example \displayMusic \addAccent c4 @@ -1660,13 +1717,13 @@ TODO Find a simple example @ignore @lilypond[quote,verbatim,ragged-right] -padText = #(define-music-function (parser location padding) (number?) +padText = #(define-music-function (padding) (number?) #{ \once \override TextScript.padding = #padding #}) -\relative c''' { - c4^"piu mosso" b a b +\relative { + c'''4^"piu mosso" b a b \padText #1.8 c4^"piu mosso" d e f \padText #2.6 @@ -1683,16 +1740,16 @@ Lo podemos usar para crear instrucciones nuevas: @lilypond[quote,verbatim,ragged-right] -tempoPadded = #(define-music-function (parser location padding tempotext) +tempoPadded = #(define-music-function (padding tempotext) (number? markup?) #{ \once \override Score.MetronomeMark.padding = #padding \tempo \markup { \bold #tempotext } #}) -\relative c'' { +\relative { \tempo \markup { "Low tempo" } - c4 d e f g1 + c''4 d e f g1 \tempoPadded #4.0 "High tempo" g4 f e d c1 } @@ -1702,7 +1759,7 @@ tempoPadded = #(define-music-function (parser location padding tempotext) Incluso se le pueden pasar expresiones musicales: @lilypond[quote,verbatim,ragged-right] -pattern = #(define-music-function (parser location x y) (ly:music? ly:music?) +pattern = #(define-music-function (x y) (ly:music? ly:music?) #{ #x e8 a b #y b a e #}) diff --git a/Documentation/es/included/generating-output.itexi b/Documentation/es/included/generating-output.itexi index d8bb8e3b4a..7234c37a01 100644 --- a/Documentation/es/included/generating-output.itexi +++ b/Documentation/es/included/generating-output.itexi @@ -3,7 +3,7 @@ @c learning/tutorial.itely @ignore - Translation of GIT committish: 63f65db72ca60bb87a6515a4f20a172c4a2897dc + Translation of GIT committish: 7a5bfc62fcac71d5c996b2df58921fd2fe783415 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -17,8 +17,8 @@ @macro lilypadOSX @warning{Estas instrucciones dan por sentado que está usando la propia aplicación LilyPond. Si está usando alguno de los programas que se -describen en @rweb{Entornos mejorados}, debe consultar la -documentación de estos programas si se encuentra con algún problema.} +describen en @rweb{Entornos mejorados}, consulte la +documentación de estos programas en caso de encontrarse con algún problema.} @subsubheading Paso 1. Creamos nuestro archivo @file{.ly} @@ -91,8 +91,7 @@ cierre el original. @warning{Estas instrucciones dan por sentado que está utilizando el editor LilyPad incorporado. Si está usando alguno de los programas que se describen en el apartado @rweb{Entornos mejorados}, consulte la -documentación de estos programas cuando encuentre algún problema -durante la compilación de un archivo.} +documentación de estos programas cuando encuentre algún problema.} @subsubheading Paso 1. Creamos el archivo @file{.ly} @@ -186,7 +185,7 @@ algún programa. familiarizado con los programas en línea de órdenes, o programas de consola. Si está utilizando alguno de los programas que se describen en @rweb{Entornos mejorados}, consulte la documentación de estos -programas cuando tenga algún problema al compilar un documento.} +programas cuando encuentre algún problema.} @subsubheading Paso 1. Creamos el archivo @file{.ly} diff --git a/Documentation/es/learning.tely b/Documentation/es/learning.tely index 8472fd6f5b..a16de4f568 100644 --- a/Documentation/es/learning.tely +++ b/Documentation/es/learning.tely @@ -1,6 +1,6 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 08560a1b8076630c4fc6cb9b902614d8b74fd6fc + Translation of GIT committish: 47db9a3883d726ca53e2133a3b2298f78dd6a32e When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -18,9 +18,14 @@ Este archivo ofrece una introducción al programa LilyPond versión @version{}. @end macro -@c `Learning Manual' was born 1999-10-10 with git commit b9abaac... +@c `Learning Manual' was born 1998-08-14 with this commit: +@c release: 1.0.2 +@c author: Han-Wen Nienhuys +@c commit: a3a44f9f3c581b6824b3a65f9039656693e09bbf +@c file: Documentation/tex/tutorial.yo + @macro copyrightDeclare -Copyright @copyright{} 1999--2012 por los autores. +Copyright @copyright{} 1999--2015 por los autores. @end macro @set FDL diff --git a/Documentation/es/learning/common-notation.itely b/Documentation/es/learning/common-notation.itely index 487ce0e3da..b54f8705c9 100644 --- a/Documentation/es/learning/common-notation.itely +++ b/Documentation/es/learning/common-notation.itely @@ -1,22 +1,18 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 45dd19546e9b75b3e1e977732f0962f35dd3290e + Translation of GIT committish: 42cd2e57e37cbbf1fc5ccbe2bc83048761690f60 When revising a translation, copy the HEAD committish of the version that you are working on. See TRANSLATION for details. @end ignore -@c \version "2.17.28" +@c \version "2.19.21" @ignore Tutorial guidelines: (different from policy.txt!) -- unless you have a really good reason, use either +- unless you have a really good reason, use @lilypond[verbatim,quote] - or - @lilypond[verbatim,quote,relative=2] - - Don't use any other relative=X commands. - use "aes" and "ees" instead of "as" and "es". I know it's not correct Dutch naming, but let's not confuse people with this @@ -33,8 +29,8 @@ Tutorial guidelines: (different from policy.txt!) @translationof Common notation Este capítulo explica cómo crear hermosas partituras que contengan -notación musical común, como continuación al material que está en el -@ref{Tutorial}. +notación musical común, como continuación al material que está en +el @ref{Tutorial}. @menu * Notación en un solo pentagrama:: @@ -48,12 +44,12 @@ notación musical común, como continuación al material que está en el @section Notación en un solo pentagrama @translationof Single staff notation -Esta sección presenta la notación común que se utiliza para música a -una voz sobre un pentagrama único. +Esta sección presenta la notación común que se utiliza para música +a una voz sobre un pentagrama único. @menu * Líneas divisorias y comprobaciones de compás:: -* Alteraciones accidentales y armaduras:: +* Alturas y armaduras:: * Ligaduras de unión y de expresión:: * Articulaciones y matices dinámicos:: * Añadir texto:: @@ -82,36 +78,53 @@ ejemplo @code{\bar "||"} para una doble barra, o @code{\bar "|."} para la doble barra final. Para ver una lista completa de las líneas divisorias, consulte @ruser{Barras de compás}. -@lilypond[verbatim,quote,relative=2] -g1 e1 \bar "||" c2. c'4 \bar "|." +@lilypond[verbatim,quote] +\relative { g'1 e1 \bar "||" c2. c'4 \bar "|." } @end lilypond @node Comprobaciones de compás @unnumberedsubsubsec Comprobaciones de compás @translationof Bar checks -Aunque no es estrictamente necesario, es coneniente utilizar +Aunque no es estrictamente necesario, es conveniente utilizar @emph{comprobaciones de compás} dentro del código de entrada para indicar dónde se supone que van las líneas divisorias. Se -introducen mediante el caráter de barra vertical, @code{|} (AltGr +introducen mediante el carácter de barra vertical, @code{|} (AltGr - 1 en el teclado español). Con las comprobaciones de compás, el programa puede verificar que hemos introducido las duraciones que completan los compases correctamente. Las comprobaciones de compás también hacen que el código de entrada sea más fácil de leer, porque ayudan a organizar el material. -@lilypond[verbatim,quote,relative=2] -g1 | e1 | c2. c'4 | g4 c g e | c4 r r2 | +@c This example deliberately produces a warning +@lilypond[verbatim,quote] +\relative { + g'1 | e1 | c2. c' | g4 c g e | c4 r r2 | +} @end lilypond +Si compila el código del ejemplo anterior, verá una advertencia en +la salida de la consola: + +@example +advertencia: la comprobación de compás ha fallado en: 1/2 + g'1 | e1 | c2. c' + | g4 c g e | c4 r r2 | +@end example + +Aunque la duración que falta está clara en la salida musical de +este ejemplo sencillo, la advertencia de la salida de consola es +mucho más efectiva al atraer la atención concretamente al @code{4} +que falta en el compás 3. + @seealso Referencia de la notación: @ruser{Comprobación de compás y de número de compás}. -@node Alteraciones accidentales y armaduras -@subsection Alteraciones accidentales y armaduras -@translationof Accidentals and key signatures +@node Alturas y armaduras +@subsection Alturas y armaduras +@translationof Pitches and key signatures @menu * Alteraciones accidentales:: @@ -119,18 +132,16 @@ Referencia de la notación: * Advertencia armaduras y alturas:: @end menu -@warning{Con frecuencia, los nuevos usuarios se encuentran confundidos -por las alteraciones accidentales: le rogamos que lea la advertencia -que aparece al final de esta sección, ¡especialmente si no está -familiarizado con la teoría musical!} +@warning{Con frecuencia, a los nuevos usuarios les cuesta +comprender cómo usa LilyPond la armadura: le rogamos que lea la +advertencia que aparece al final de esta sección.} @node Alteraciones accidentales @unnumberedsubsubsec Alteraciones accidentales -@translationof Accidentals +@translationof Pitch alterations @cindex accidentales, alteraciones -@cindex alteraciones -@cindex alteraciones y armaduras +@cindex becuadro @cindex sostenido @cindex doble sostenido @cindex sostenido, doble @@ -150,17 +161,22 @@ Glosario musical: @rglos{double flat}, @rglos{accidental}. +En LilyPond, los nombres de las notas identifican alturas. Por +ejemplo, @code{c} siempre significa Do natural, cualquiera que sea +la armadura. + Una nota con @notation{sostenido} se hace añadiendo @code{is} al nombre, y una nota @notation{bemol} añadiendo @code{es}. Como ha podido adivinar, un @notation{doble sostenido} o @notation{doble -bemol} se hace añadiendo @code{isis} o @code{eses}. Esta sintaxis se -deriva de las convenciones de nomenclatura de las notas en las lenguas -nórdicas y germánicas como el alemán y el holandés. Para utilizar -otros nombres para las @notation{alteraciones accidentales}, véase -@ruser{Nombres de las notas en otros idiomas}. - -@lilypond[verbatim,quote,relative=2] -cis4 ees fisis, aeses +bemol} se hace añadiendo @code{isis} o @code{eses}. Esta sintaxis +se deriva de las convenciones de nomenclatura de las notas en las +lenguas nórdicas y germánicas como el alemán y el holandés. Para +utilizar otros nombres para las @notation{alteraciones +accidentales}, véase @ruser{Nombres de las notas en otros +idiomas}. + +@lilypond[verbatim,quote] +\relative { cis''4 ees fisis, aeses } @end lilypond @cindex tonalidad, armadura de la, establecer @@ -178,11 +194,8 @@ cis4 ees fisis, aeses @cindex presentación frente a contenido @funindex \key -@funindex key @funindex \major -@funindex major @funindex \minor -@funindex minor Glosario musical: @rglos{key signature}, @@ -193,11 +206,13 @@ La @notation{armadura de la tonalidad} se establece mediante la instrucción @code{\key} seguido de una nota y @code{\major} o @code{\minor}. -@lilypond[verbatim,quote,relative=2] -\key d \major -a1 | -\key c \minor -a1 | +@lilypond[verbatim,quote] +\relative { + \key d \major + d'4 fis a c | + \bar "||" \key c \minor + c,4 ees g b | +} @end lilypond @smallspace @@ -216,55 +231,54 @@ Glosario musical: @rglos{transposition}, @rglos{Pitch names}. -Para determinar si hay que imprimir una @notation{alteración -accidental}, LilyPond examina las notas y la @notation{armadura de la -tonalidad}. La armadura solamente afecta a las alteraciones -@emph{impresas}, ¡no a las propias notas! Esta funcionalidad suele -confundir a los que están empezando con el programa, por ello -permítanos explicarla en detalle. - -LilyPond hace una clara distinción entre el contenido musical y la -presentación. La alteración (@notation{bemol}, @notation{becuadro} o -@notation{sostenido}) de una nota es parte de la altura, y por tanto -es contenido musical. Si una alteración (un signo @emph{impreso} de -bemol, becuadro o sostenido) se imprime o no delante de la nota -correspondiente, es una cuestión de presentación. La presentación es -algo que sigue unas reglas, así que las alteraciones accidentales se -imprimen automáticamente según dichas reglas. Las alturas de las -notas en su música son obras de arte, por tanto no se añadirán -automáticamente, y usted deberá introducir aquello que quiera oír. +LilyPond distingue entre el contenido musical y su representación +impresa. Una entrada como @code{d4 e fis2} define las alturas y +duraciones de las notas, lo que es el contenido musical. La +@notation{armadura} forma parte de la representación impresa. La +armadura también establece reglas para las representaciones +impresas de las notas. LilyPond compara la altura de cada nota de +la entrada con la armadura para determinar si imprimir, o no, una +alteración @notation{accidental}. + +La instrucción @code{\key} fija la @notation{armadura}, que afecta +a la representación impresa, pero @emph{no} modifica la altura +asignada a una nota cualquiera como @code{c} a partir de la +entrada. En el siguiente ejemplo: -@lilypond[verbatim,quote,relative=2] -\key d \major -cis4 d e fis +@lilypond[verbatim,quote] +\relative { + \key d \major + cis''4 d e fis +} @end lilypond @noindent -Ninguna nota lleva una alteración impresa, pero de todas formas usted -debe escribir el @code{is} a @code{cis} y a @code{fis} en el archivoo -de entrada. +Ninguna nota lleva una alteración impresa, pero de todas formas +usted debe escribir el @code{is} a @code{cis} y a @code{fis} en el +archivo de entrada. El texto @code{b} no significa @qq{imprimir una bolita negra en la -tercera línea del pentagrama.} Más bien significa: @qq{hay una nota -Si natural.} En la tonalidad de La bemol mayor, @emph{lleva} una -alteración accidental: +tercera línea del pentagrama.} Más bien significa: @qq{hay una +nota Si natural.} En la tonalidad de La bemol mayor, @emph{lleva} +una alteración accidental: -@lilypond[verbatim,quote,relative=2] -\key aes \major -aes4 c b c +@lilypond[verbatim,quote] +\relative { + \key aes \major + aes'4 c b c +} @end lilypond -Si se encuentra confundido por lo anterior, piense en lo siguiente: si -estuvises tocando un piano, ¿qué tecla pulsaría? Si se tratase de una -tecla negra, entonces ¡@emph{tiene que} añadir @w{@code{-is}} ó -@w{@code{-es}} al nombre de la nota! +Cada vez que escriba una nota correspondiente a una tecla negra +del piano, @emph{tiene que} añadir @w{@code{-is}} ó @w{@code{-es}} +al nombre de la nota Poner todas las alteraciones de forma explícita puede que requiera algo más de trabajo al teclear, pero la ventaja es que la -@notation{transposición} es más fácil, y las alteraciones se pueden -imprimir siguiendo varias convenciones distintas. Consulte +@notation{transposición} es más fácil, y las alteraciones se +pueden imprimir siguiendo varias convenciones distintas. Consulte @ruser{Alteraciones accidentales automáticas} para ver ejemplos de cómo se pueden imprimir las alteraciones de acuerdo a reglas diferentes. @@ -306,12 +320,31 @@ Glosario musical: @rglos{tie}. Una @notation{ligadura de unión} se crea adjuntando un carácter de -tilde curva @code{~} a la primera nota ligada: +tilde curva @code{~} a la primera de las dos notas ligadas: -@lilypond[verbatim,quote,relative=2] -g4~ g c2~ | c4~ c8 a~ a2 | +@lilypond[verbatim,quote] +\relative { g'4~ g c2~ | c4~ c8 a~ a2 | } @end lilypond +@cindex duración aislada +@cindex aislada, duración + +Cuando la altura no cambia, como es el caso cada vez que hay una +ligadura de unión, las alturas que siguen se pueden omitir, y +especificar tan solo las duraciones: + +@lilypond[verbatim,quote] +\relative { g'4~ 4 c2~ | 4~ 8 a~ 2 | } +@end lilypond + +Esta abreviatura puede ser de utilidad en otros lugares donde las +duraciones cambian pero la altura se mantiene fija; sin embargo, +recuerde que una altura aislada seguida de un espacio y de una +duración aislada se interpreta como una sola nota. En otras +palabras, @code{c4 a 8 8} se interpreta como @code{c4 a8 a8}, no +como @code{c4 a4 a8 a8}. En vez de ello, escriba @code{c4 a4 8 8 +}. + @node Ligaduras de expresión @unnumberedsubsubsec Ligaduras de expresión @translationof Slurs @@ -320,11 +353,11 @@ Glosario musical: @rglos{slur}. Una @notation{ligadura de expresión} es una curva que se traza -abarcando varias notas. Las notas inicial y final se marcan mediante -@code{(} y @code{)} respectivamente. +abarcando varias notas. Las notas inicial y final se marcan +mediante @code{(} y @code{)} respectivamente. -@lilypond[verbatim,quote,relative=2] -d4( c16) cis( d e c cis d) e( d4) +@lilypond[verbatim,quote] +\relative { d''4( c16) cis( d e c cis d) e( d4) } @end lilypond @node Ligaduras de fraseo @@ -337,12 +370,10 @@ Glosario musical: Las ligaduras que se utilizan para indicar @notation{fraseos} más largos se pueden introducir mediante @code{\(} y @code{\)}. Puede -haber al mismo tiempo ligaduras de legato y ligaduras de fraseo, pero -no es posible tener legatos simultáneos o ligaduras de expresión -simultáneas. +haber al mismo tiempo ligaduras de legato y ligaduras de fraseo. -@lilypond[verbatim,quote,relative=2] -g4\( g8( a) b( c) b4\) +@lilypond[verbatim,quote] +\relative { g'4\( g8( a) b( c) b4\) } @end lilypond @smallspace @@ -358,16 +389,17 @@ Glosario musical: @rglos{slur}, @rglos{tie}. -Una @notation{ligadura de expresión} parece una @notation{ligadura de -unión}, pero tiene un significado distinto. Una ligadura (de unión) -sencillamente hace que la primera nota sea más larga, y sólo se puede -utilizar sobre parejas de notas iguales. Las ligaduras de expresión -indican la @notation{articulación} de las notas, y se pueden utilizar -sobre grupos mayores de notas. Las ligaduras de unión y de expresión -se pueden anidar unas dentro de otras. +Una @notation{ligadura de expresión} parece una @notation{ligadura +de unión}, pero tiene un significado distinto. Una ligadura (de +unión) sencillamente hace que la primera nota sea más larga, y +sólo se puede utilizar sobre parejas de notas iguales. Las +ligaduras de expresión indican la @notation{articulación} de las +notas, y se pueden utilizar sobre grupos mayores de notas. Las +ligaduras de unión y de expresión se pueden anidar unas dentro de +otras. -@lilypond[verbatim,quote,relative=2] -c4~( c8 d~ d4 e) +@lilypond[verbatim,quote] +\relative { c''4(~ c8 d~ 4 e) } @end lilypond @@ -399,12 +431,15 @@ Referencia de la notación: Glosario musical: @rglos{articulation}. -Las @notation{articulaciones} más corrientes se pueden añadir a las -notas utilizando un guión @code{-} seguido de un carácter único: +Las @notation{articulaciones} más corrientes se pueden añadir a +las notas utilizando un guión @code{-} seguido de un carácter +único: -@lilypond[verbatim,quote,relative=2] -c4-^ c-+ c-- c-! -c4-> c-. c2-_ +@lilypond[verbatim,quote] +\relative { + c''4-^ c-+ c-- c-! + c4-> c-. c2-_ +} @end lilypond @node Indicaciones de digitación @@ -419,21 +454,23 @@ c4-> c-. c2-_ Glosario musical: @rglos{fingering}. -De manera similar, las @notation{digitaciones} se pueden añadir a una -nota utilizando un guión (@code{-}) seguido del dígito deseado: +De manera similar, las @notation{digitaciones} se pueden añadir a +una nota utilizando un guión (@code{-}) seguido del dígito +deseado: -@lilypond[verbatim,quote,relative=2] -c4-3 e-5 b-2 a-1 +@lilypond[verbatim,quote] +\relative { c''4-3 e-5 b-2 a-1 } @end lilypond Las articulaciones y digitaciones normalmente se colocan de forma automática, pero puede especificar una dirección mediante @code{^} (encima) o @code{_} (debajo). También puede usar varias articulaciones sobre la misma nota. Sin embargo, casi siempre es -mejor dejar que LilyPond determine la dirección de las articulaciones. +mejor dejar que LilyPond determine la dirección de las +articulaciones. -@lilypond[verbatim,quote,relative=2] -c4_-^1 d^. f^4_2-> e^-_+ +@lilypond[verbatim,quote] +\relative { c''4_-^1 d^. f^4_2-> e^-_+ } @end lilypond @node Matices dinámicos @@ -452,11 +489,8 @@ c4_-^1 d^. f^4_2-> e^-_+ @funindex \mf @funindex \pp @funindex \< -@funindex < @funindex \> -@funindex > @funindex \! -@funindex ! Glosario musical: @rglos{dynamics}, @@ -466,17 +500,17 @@ Glosario musical: Las expresiones de @notation{matiz} o signos dinámicos se hacen añadiendo las marcas (con una barra invertida) a la nota: -@lilypond[verbatim,quote,relative=2] -c4\ff c\mf c\p c\pp +@lilypond[verbatim,quote] +\relative { c''4\ff c\mf c\p c\pp } @end lilypond -Los @notation{crescendi} y @notation{decrescendi} comienzan con las -órdenes @code{\<} y @code{\>}. La siguiente indicación de matiz, como -por ejemplo @code{\f}, dará por terminado el (de)crescendo, o bien se -puede usar la instrucción @code{\!}: +Los @notation{crescendi} y @notation{decrescendi} comienzan con +las órdenes @code{\<} y @code{\>}. La siguiente indicación de +matiz, como por ejemplo @code{\f}, dará por terminado el +(de)crescendo, o bien se puede usar la instrucción @code{\!}: -@lilypond[verbatim,quote,relative=2] -c4\< c\ff\> c c\! +@lilypond[verbatim,quote] +\relative { c''4\< c\ff\> c c\! } @end lilypond @@ -496,20 +530,19 @@ Referencia de la notación: @cindex marcado @funindex \markup -@funindex markup Es posible añadir texto a la partitura: -@lilypond[verbatim,quote,relative=2] -c2^"espr" a_"legato" +@lilypond[verbatim,quote,fragment] +c''2^"espr" a'_"legato" @end lilypond Se puede aplicar un formateo adicional mediante la instrucción @code{\markup}: -@lilypond[verbatim,quote,relative=2] -c2^\markup { \bold espr } -a2_\markup { +@lilypond[verbatim,quote,fragment] +c''2^\markup { \bold espr } +a'2_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } @end lilypond @@ -535,36 +568,38 @@ Referencia de la notación: @funindex [ @funindex ] @funindex \autoBeamOff -@funindex autoBeamOff @funindex \autoBeamOn -@funindex autoBeamOn Glosario musical: @rglos{beam}. -Todas las @notation{barras} de las figuras se dibujan automáticamente: +Todas las @notation{barras} de las figuras se dibujan +automáticamente: -@lilypond[verbatim,quote,relative=2] -a8 ais d ees r d c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8 ais d ees r d c16 b a8 } @end lilypond -Si no le gustan las barras automáticas, pueden forzarse manualmente. -Marque la primera nota que comprende la barra con @code{[} y la última -con @code{]}. +Si no le gustan las barras automáticas, pueden forzarse +manualmente. Marque la primera nota que comprende la barra con +@code{[} y la última con @code{]}. -@lilypond[verbatim,quote,relative=2] -a8[ ais] d[ ees r d] c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8[ ais] d[ ees r d] c16 b a8 } @end lilypond -Si quiere desactivar completamente el barrado automático o para una -sección extensa de música, utilice la instrucción @code{\autoBeamOff} -para apagarlo y @code{\autoBeamOn} para activarlo de nuevo. +Si quiere desactivar completamente el barrado automático o para +una sección extensa de música, utilice la instrucción +@code{\autoBeamOff} para apagarlo y @code{\autoBeamOn} para +activarlo de nuevo. -@lilypond[verbatim,quote,relative=2] -\autoBeamOff -a8 c b4 d8. c16 b4 | -\autoBeamOn -a8 c b4 d8. c16 b4 | +@lilypond[verbatim,quote] +\relative { + \autoBeamOff + a'8 c b4 d8. c16 b4 | + \autoBeamOn + a8 c b4 d8. c16 b4 | +} @end lilypond @@ -592,7 +627,6 @@ Referencia de la notación: @cindex compás parcial @funindex \partial -@funindex partial Glosario musical: @rglos{anacrusis}. @@ -601,9 +635,11 @@ Una @notation{anacrusa} se introduce con la palabra clave @code{\partial}. Va seguida de una duración: @code{\partial 4} es una anacrusa de negra y @code{\partial 8} de corchea. -@lilypond[verbatim,quote,relative=2] -\partial 8 f8 | -c2 d | +@lilypond[verbatim,quote] +\relative { + \partial 8 f''8 | + c2 d | +} @end lilypond @node Grupos especiales @@ -614,7 +650,6 @@ c2 d | @cindex tresillos @funindex \tuplet -@funindex tuplet Glosario musical: @rglos{note value}, @@ -627,11 +662,13 @@ partido por el número de notas que normalmente ocupan la misma duración. Para los tresillos hay tres notas en el espacio de dos, de manera que los @notation{tresillos} tienen una fracción de 3/2. -@lilypond[verbatim,quote,relative=2] -\tuplet 3/2 { f8 g a } -\tuplet 3/2 { c8 r c } -\tuplet 3/2 { f,8 g16[ a g a] } -\tuplet 3/2 { d4 a8 } +@lilypond[verbatim,quote] +\relative { + \tuplet 3/2 { f''8 g a } + \tuplet 3/2 { c8 r c } + \tuplet 3/2 { f,8 g16[ a g a] } + \tuplet 3/2 { d4 a8 } +} @end lilypond @node Notas de adorno @@ -643,9 +680,7 @@ de manera que los @notation{tresillos} tienen una fracción de 3/2. @cindex appoggiatura @funindex \grace -@funindex grace @funindex \acciaccatura -@funindex acciaccatura @funindex \appoggiatura @funindex acciaccatura @@ -659,10 +694,12 @@ Las @notation{notas de adorno} se crean con la instrucción expresión musical por la palabra clave @code{\appoggiatura} o @code{\acciaccatura} -@lilypond[verbatim,quote,relative=2] -c2 \grace { a32 b } c2 | -c2 \appoggiatura b16 c2 | -c2 \acciaccatura b16 c2 | +@lilypond[verbatim,quote] +\relative { + c''2 \grace { a32 b } c2 | + c2 \appoggiatura b16 c2 | + c2 \acciaccatura b16 c2 | +} @end lilypond @@ -681,10 +718,10 @@ Esta sección es una introducción a las notas simultáneas: varios instrumentos, varios pentagramas para un solo instrumento (p.ej. piano) y acordes. -La palabra @qq{polifonía} en música hace referencia al hecho de tener -más de una voz en un momento determinado dentro de una pieza musical. -La palabra @qq{polifonía} en LilyPond se refiere al hecho de tener más -de una voz en el mismo pentagrama. +La palabra @qq{polifonía} en música hace referencia al hecho de +tener más de una voz en un momento determinado dentro de una pieza +musical. La palabra @qq{polifonía} en LilyPond se refiere al +hecho de tener más de una voz en el mismo pentagrama. @menu * Explicación de las expresiones musicales:: @@ -711,39 +748,39 @@ de una voz en el mismo pentagrama. @end menu En los archivos de entrada de LilyPond, la música se representa -mediante @emph{expresiones musicales}. Una sola nota es una expresión -musical: +mediante @emph{expresiones musicales}. Una sola nota es una +expresión musical: -@lilypond[verbatim,quote,relative=2] -a4 +@lilypond[verbatim,quote,fragment] +a'4 @end lilypond Al encerrar un grupo de notas dentro de llaves creamos una -@emph{expresión musical compuesta}. Aquí hemos creado una expresión -musical compuesta con dos notas: +@emph{expresión musical compuesta}. Aquí hemos creado una +expresión musical compuesta con dos notas: -@lilypond[verbatim,quote,relative=2] -{ a4 g4 } +@lilypond[verbatim,quote] +\relative { a'4 g4 } @end lilypond -Si colocamos un grupo de expresiones musicales (p.ej.: notas) dentro -de llaves, eso significa que se encuentran en secuencia (es decir, -cada una sigue a la anterior). El resultado es otra expresión -musical: +Si colocamos un grupo de expresiones musicales (p.ej.: notas) +dentro de llaves, eso significa que se encuentran en secuencia (es +decir, cada una sigue a la anterior). El resultado es otra +expresión musical: -@lilypond[verbatim,quote,relative=2] -{ { a4 g } f4 g } +@lilypond[verbatim,quote] +\relative { { a'4 g } f4 g } @end lilypond @node Analogía expresiones matemáticas @unnumberedsubsubsec Analogía: expresiones matemáticas @translationof Analogy mathematical expressions -Este mecanismo es semejante a las fórmulas matemáticas: una fórmula -grande se construye combinando fórmulas pequeñas. Dichas fórmulas se -llaman expresiones, y su definición es recursiva de tal forma que se -pueden construir expresiones de un tamaño y complejidad arbitrarios. -Por ejemplo: +Este mecanismo es semejante a las fórmulas matemáticas: una +fórmula grande se construye combinando fórmulas pequeñas. Dichas +fórmulas se llaman expresiones, y su definición es recursiva de +tal forma que se pueden construir expresiones de un tamaño y +complejidad arbitrarios. Por ejemplo: @example 1 @@ -786,35 +823,34 @@ hace necesario para músicas complejas como las partituras polifónicas. Glosario musical: @rglos{polyphony}. -Esta técnica es muy útil para la música @notation{polifónica}. Para -introducir música con más voces o con más pentagramas, lo que hacemos -es combinar varias expresiones en paralelo. Para indicar que dos -voces se deben interpretar al mismo tiempo, sencillamente introduzca -una combinación simultánea de expresiones musicales. Una expresión -musical @q{simultánea} se forma encerrando las expresiones dentro de -@code{<<} y @code{>>}. En el ejemplo que sigue, tres secuencias (cada -una de las cuales contiene dos notas diferentes) se combinan de forma -simultánea: +Esta técnica es muy útil para la música @notation{polifónica}. +Para introducir música con más voces o con más pentagramas, lo que +hacemos es combinar varias expresiones en paralelo. Para indicar +que dos voces se deben interpretar al mismo tiempo, sencillamente +introduzca una combinación simultánea de expresiones musicales. +Una expresión musical @q{simultánea} se forma encerrando las +expresiones dentro de @code{<<} y @code{>>}. En el ejemplo que +sigue, tres secuencias (cada una de las cuales contiene dos notas +diferentes) se combinan de forma simultánea: @lilypond[verbatim,quote] -\relative c'' { - << - { a2 g } - { f2 e } - { d2 b } - >> -} +<< + \relative { a'2 g } + \relative { f'2 e } + \relative { d'2 b } +>> @end lilypond -Tenga en cuenta que hemos sangrado cada nivel jerárquico de la entrada -con un margen distinto. A LilyPond no le importa cuánto (o cuán poco) -espacio haya al comienzo de una línea, pero el establecimiento de -márgenes distintos dentro del código de LilyPond, de esta forma, lo -hace mucho más fácil de leer por nosotros los seres humanos. +Tenga en cuenta que hemos sangrado cada nivel jerárquico de la +entrada con un margen distinto. A LilyPond no le importa cuánto +(o cuán poco) espacio haya al comienzo de una línea, pero el +establecimiento de márgenes distintos dentro del código de +LilyPond, de esta forma, lo hace mucho más fácil de leer por +nosotros los seres humanos. @warning{Cada nota se entiende relativa a la nota anterior de la -entrada, solamente la primera es relativa a la @code{c''} dentro de -la instrucción inicial @code{@bs{}\relative}.} +entrada, solamente la primera es relativa a la @code{c''} dentro +de la instrucción inicial @code{@bs{}\relative}.} @node Expresiones musicales simultáneas un solo pentagrama @@ -822,15 +858,15 @@ la instrucción inicial @code{@bs{}\relative}.} @translationof Simultaneous music expressions single staff Para determinar el número de pentagramas en una pieza, LilyPond -examina el comienzo de la primera expresión. Si hay una sola nota, -hay un solo pentagrama; si hay una expresión simultánea, hay más de un -pentagrama. El siguiente ejemplo presenta una expresión compleja, -pero dado que comienza con una sola nota, se dispone sobre un solo -pentagrama. +examina el comienzo de la primera expresión. Si hay una sola +nota, hay un solo pentagrama; si hay una expresión simultánea, hay +más de un pentagrama. El siguiente ejemplo presenta una expresión +compleja, pero dado que comienza con una sola nota, se dispone +sobre un solo pentagrama. @lilypond[verbatim,quote] -\relative c'' { - c2 <> | +\relative { + c''2 <> | << { e2 f } { c2 <> } >> | } @end lilypond @@ -846,51 +882,47 @@ pentagrama. @cindex notación, contexto de @funindex \new Staff -@funindex new Staff @funindex Staff @funindex \new -@funindex new @funindex Score @funindex Voice @funindex Lyrics @funindex ChordNames -Como ya hemos visto en @ref{Explicación de las expresiones musicales}, -los archivos de entrada para LilyPond se construyen a base de -expresiones musicales. Si la partitura comienza con expresiones -musicales simultáneas, LilyPond crea varios pentagramas. Sin embargo -es más fácil ver lo que ocurre si creamos cada uno de los pentagramas -de forma explícita. +Como ya hemos visto en @ref{Explicación de las expresiones +musicales}, los archivos de entrada para LilyPond se construyen a +base de expresiones musicales. Si la partitura comienza con +expresiones musicales simultáneas, LilyPond crea varios +pentagramas. Sin embargo es más fácil ver lo que ocurre si +creamos cada uno de los pentagramas de forma explícita. Para imprimir más de un pentagrama, cada fragmento de música que -constituye un pentagrama se marca escribiendo @code{\new Staff} antes -de él. Estos elementos @code{Staff} se combinan después en paralelo -con @code{<<} y @code{>>}: +constituye un pentagrama se marca escribiendo @code{\new Staff} +antes de él. Estos elementos @code{Staff} se combinan después en +paralelo con @code{<<} y @code{>>}: @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond -La instrucción @code{\new} inaugura un @q{contexto de notación}. Un -contexto de notación es un entorno dentro del que se interpretan los -acontecimientos musicales (como las notas o las instrucciones -@code{\clef}). Para piezas sencillas, tales contextos de notación se -crean automáticamente. Para piezas más complicadas, es mejor marcar -los contextos de forma explícita. +La instrucción @code{\new} inaugura un @q{contexto de notación}. +Un contexto de notación es un entorno dentro del que se +interpretan los acontecimientos musicales (como las notas o las +instrucciones @code{\clef}). Para piezas sencillas, tales +contextos de notación se crean automáticamente. Para piezas más +complicadas, es mejor marcar los contextos de forma explícita. Existen varias clases de contextos. @code{Score}, @code{Staff} y -@code{Voice} manejan la notación melódica, mientras que @code{Lyrics} -se ocupa de los textos cantados y @code{ChordNames} imprime los -nombres de los acordes. +@code{Voice} manejan la notación melódica, mientras que +@code{Lyrics} se ocupa de los textos cantados y @code{ChordNames} +imprime los nombres de los acordes. En términos de sintaxis, la anteposición de @code{\new} a una -expresión musical crea una expresión musical mayor. Es semejante al -signo menos de las matemáticas. La fórmula @math{(4+5)} es una +expresión musical crea una expresión musical mayor. Es semejante +al signo menos de las matemáticas. La fórmula @math{(4+5)} es una expresión, por tanto @math{-(4+5)} es una expresión más amplia. Las indicaciones de compás escritas en un pentagrama afectan al resto @@ -901,12 +933,10 @@ partituras con instrumentos transpositores son más comunes que las partituras polirrítmicas. @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" \key d \major \time 3/4 c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" \key d \major \time 3/4 c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond @@ -946,20 +976,18 @@ completa se coloca dentro de un @code{PianoStaff}: He aquí un pequeño ejemplo: @lilypond[verbatim,quote] -\relative c'' { - \new PianoStaff << - \new Staff { \time 2/4 c4 e | g g, | } - \new Staff { \clef "bass" c,,4 c' | e c | } - >> -} +\new PianoStaff << + \new Staff \relative { \time 2/4 c''4 e | g g, | } + \new Staff \relative { \clef "bass" c4 c' | e c | } +>> @end lilypond Otros grupos de pentagramas se declaran mediante @code{\new GrandStaff}, que es apropiado para partituras orquestales, y @code{\new ChoirStaff}, que es apropiado para partituras vocales. -Cada uno de estos grupos de pautas forma un tipo de contexto distinto, -que produce la llave a la izquierda y que también controla el alcance -de las líneas divisorias. +Cada uno de estos grupos de pautas forma un tipo de contexto +distinto, que produce la llave a la izquierda y que también +controla el alcance de las líneas divisorias. @seealso @@ -984,14 +1012,14 @@ Glosario musical: Hemos visto con anterioridad cómo se pueden combinar las notas formando @notation{acordes} que indican que son simultáneas, -encerrándolas entre dobles ángulos. Sin embargo, la forma normal de -indicar un acorde es encerrar las notas entre ángulos +encerrándolas entre dobles ángulos. Sin embargo, la forma normal +de indicar un acorde es encerrar las notas entre ángulos @emph{sencillos}. Observe que todas las notas de un acorde deben tener la misma duración, y que la duración se escribe después del ángulo de cierre. -@lilypond[verbatim,quote,relative=2] -r4 2 +@lilypond[verbatim,quote] +\relative { r4 2 } @end lilypond Debemos pensar en los acordes como algo casi equivalente a las notas @@ -1001,11 +1029,13 @@ adjuntar también a un acorde, y todo debe ir @emph{por fuera} de los con acordes. Tan sólo debe recordar que se escriben por fuera de los ángulos. -@lilypond[verbatim,quote,relative=2] -r4 ~ 2 | -8[ ] - 8\>[ ]\! | -r4 8.\p 16( 4-. ) | +@lilypond[verbatim,quote] +\relative { + r4 ~ 2 | + 8[ ] + 8\>[ ]\! | + r4 8.\p 16( 4-. ) | +} @end lilypond @seealso @@ -1030,9 +1060,10 @@ Referencia de la notación: @funindex >> La música polifónica en LilyPond, aunque no es difícil, utiliza -conceptos que aún no hemos tratado, por lo que no vamos a presentarlos -en este momento. En su lugar, las secciones siguientes presentan -estos conceptos y los explican en profundidad. +conceptos que aún no hemos tratado, por lo que no vamos a +presentarlos en este momento. En su lugar, las secciones +siguientes presentan estos conceptos y los explican en +profundidad. @seealso Manual de aprendizaje: @@ -1064,7 +1095,6 @@ canción sencillas. @cindex canciones @funindex \addlyrics -@funindex addlyrics Glosario musical: @rglos{lyrics}. @@ -1073,33 +1103,33 @@ Presentamos a continuación el inicio de la melodía de una canción infantil, @qq{Girls and boys come out to play}: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } @end lilypond -La @notation{letra} se puede asignar a esas notas, combinando ambas -con la palabra clave @code{\addlyrics}. La letra se escribe separando -cada sílaba mediante un espacio. +La @notation{letra} se puede asignar a esas notas, combinando +ambas con la palabra clave @code{\addlyrics}. La letra se escribe +separando cada sílaba mediante un espacio. @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } \addlyrics { - Girls and boys come | out to play, + Girls and boys come out to play, } >> @end lilypond -Observe los -ángulos dobles @w{@code{<<@dots{}>>}} alrededor del fragmento entero -para expresar que la música y la letra han de suceder al mismo tiempo. +Observe los ángulos dobles @w{@code{<<@dots{}>>}} alrededor del +fragmento entero para expresar que la música y la letra han de +suceder al mismo tiempo. @node Alineación de la letra a una melodía @subsection Alineación de la letra a una melodía @@ -1118,77 +1148,66 @@ Glosario musical: @rglos{melisma}, @rglos{extender line}. -La siguiente línea de la canción infantil es @notation{The moon doth -shine as bright as day}. A continuación vamos a ampliarla: +La siguiente línea de la canción infantil es @notation{The moon +doth shine as bright as day}. A continuación vamos a ampliarla: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c b a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond -Si compilamos el código del ejemplo anterior, veremos algunos mensajes -de advertencia sobre la consola: - -@example -song.ly:12:29: warning: la comprobación de compás ha fallado en: 5/8 - The | moon doth shine as - | bright as day; | -song.ly:12:46: warning: la comprobación de compás ha fallado en: 3/8 - The | moon doth shine as | bright as day; - | -@end example - -Éste es un buen ejemplo de la utilidad de las comprobaciones de -compás. Ahora, si miramos la música, podemos observar que la letra -adicional no se alinea correctamente con las notas. La palabra -@q{shine} se debe cantar sobre dos notas, no una. Esto se conoce como +Si miramos la música, podemos observar que la letra adicional no +se alinea correctamente con las notas. La palabra @q{shine} se +debe cantar sobre dos notas, no una. Esto se conoce como @notation{melisma}, una sílaba única que se canta sobre más de una nota. Existen varias formas de hacer que una sílaba recaiga sobre varias notas, siendo la más sencilla escribir una ligadura de -expresión sobre ellas (véase @ref{Ligaduras de unión y de expresión}): +expresión sobre ellas (véase +@ref{Ligaduras de unión y de expresión}): @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c( b) a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond -Ahora la letra se alinea correctamente con las notas, pero el barrado -automático de las notas que corresponden a @notation{shine as} no -parece correcto. Podemos remediarlo insertando instrucciones de -barrado manual para sobreescribir el barrado automático; para ver más -detalles consulte @ref{Barras automáticas y manuales}. +Ahora la letra se alinea correctamente con las notas, pero el +barrado automático de las notas que corresponden a @notation{shine +as} no parece correcto. Podemos remediarlo insertando +instrucciones de barrado manual para sobreescribir el barrado +automático; para ver más detalles consulte +@ref{Barras automáticas y manuales}. @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c([ b]) a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond @@ -1200,64 +1219,65 @@ melisma: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c[ b] a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine _ as | bright as day; | + Girls and boys come out to play, + The moon doth shine _ as bright as day; } >> @end lilypond Si una sílaba se extiende sobre varias notas o una sola nota muy -larga, normalmente se traza una @notation{línea extensora} desde la -sílaba que se extiende y por debajo de todas las notas que +larga, normalmente se traza una @notation{línea extensora} desde +la sílaba que se extiende y por debajo de todas las notas que corresponden a dicha sílaba. Se escribe como dos guiones bajos -@code{__}. He aquí un ejemplo extraído de los primeros tres compases -del @notation{Lamento de Dido}, de @notation{Dido y Eneas} de Purcell: +@code{__}. He aquí un ejemplo extraído de los primeros tres +compases del @notation{Lamento de Dido}, de @notation{Dido y +Eneas} de Purcell: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \minor \time 3/2 - g2 a bes | bes2( a) b2 | + g'2 a bes | bes2( a) b2 | c4.( bes8 a4. g8 fis4.) g8 | fis1 } \addlyrics { - When I am | laid, - am | laid __ in | earth, + When I am laid, + am laid __ in earth, } >> @end lilypond Hasta el momento, ninguno de los ejemplos implicaban palabras que -tuviesen más de una sílaba. Estas palabras se reparten por lo general -a razón de una nota por cada sílaba, con guiones cortos entre las -sílabas. Dichos guiones separadores se teclean como dos guiones, con -el resultado de un guión corto centrado entre las sílabas. -Presentamos a continuación un ejemplo que demuestra esto y todo lo que -hemos aprendido hasta el momento acerca de la alineación de la letra a -las notas. +tuviesen más de una sílaba. Estas palabras se reparten por lo +general a razón de una nota por cada sílaba, con guiones cortos +entre las sílabas. Dichos guiones separadores se teclean como dos +guiones, con el resultado de un guión corto centrado entre las +sílabas. Presentamos a continuación un ejemplo que demuestra esto +y todo lo que hemos aprendido hasta el momento acerca de la +alineación de la letra a las notas. @c no ragged-right here because otherwise the hyphens get lost, @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \key g \major \time 3/4 \partial 4 - d4 | g4 g a8( b) | g4 g b8( c) | + d'4 | g4 g a8( b) | g4 g b8( c) | d4 d e | c2 } \addlyrics { - A -- | way in a __ | man -- ger, - no __ | crib for a | bed, __ + A -- way in a __ man -- ger, + no __ crib for a bed, } >> @end lilypond @@ -1275,14 +1295,14 @@ el aria de Fígaro @notation{Largo al factotum}: @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \clef "bass" \key c \major \time 6/8 - c4.~ c8 d b | c8([ d]) b c d b | c8 + c'4.~ 8 d b | c8([ d]) b c d b | c8 } \addlyrics { - Lar -- go_al fac -- | to -- tum del -- la cit -- | tà + Lar -- go_al fac -- to -- tum del -- la cit -- tà } >> @end lilypond @@ -1306,32 +1326,32 @@ del @notation{Judas Macabeo} de Haendel: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key f \major \time 6/8 \partial 8 - c8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ c4 + c''8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ 4 } \addlyrics { - Let | flee -- cy flocks the | hills a -- | dorn, __ + Let flee -- cy flocks the hills a -- dorn, __ } - \relative c' { + \relative { \key f \major \time 6/8 \partial 8 - r8 | r4. r4 c8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 + r8 | r4. r4 c'8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 } \addlyrics { - Let | flee -- cy flocks the | hills a -- dorn, + Let flee -- cy flocks the hills a -- dorn, } >> @end lilypond -Cualquier partitura de una complejidad mayor que la de este sencillo -ejemplo se hace mejor separando la letra de la estructura de -pentagramas mediante variables (expresiones con nombre). Éstas se -tratan en @ref{Organizar las piezas mediante variables}. +Cualquier partitura de una complejidad mayor que la de este +sencillo ejemplo se hace mejor separando la letra de la estructura +de pentagramas mediante variables (expresiones con nombre). Éstas +se tratan en @ref{Organizar las piezas mediante variables}. @seealso @@ -1343,9 +1363,9 @@ Referencia de la notación: @section Retoques finales @translationof Final touches -Éste es el último apartado del tutorial; muestra la forma de dar los -toques finales a piezas sencillas, y ofrece una introducción al resto -del manual. +Éste es el último apartado del tutorial; muestra la forma de dar +los toques finales a piezas sencillas, y ofrece una introducción +al resto del manual. @menu * Organizar las piezas mediante variables:: @@ -1371,31 +1391,32 @@ del manual. Cuando los elementos que hemos discutido anteriormente se combinan para producir archivos mayores, las expresiones musicales se hacen -enormes. En música polifónica con muchos pentagramas, los archivos de -entrada pueden volverse muy propensos a la confusión. Podemos reducir -esta confusión utilizando las @emph{variables}. +enormes. En música polifónica con muchos pentagramas, los +archivos de entrada pueden volverse muy propensos a la confusión. +Podemos reducir esta confusión utilizando las @emph{variables}. -Con las variables (también conocidas como identificadores o macros), -podemos trocear las expresiones musicales complejas. Una variable se -asigna de la manera siguiente: +Con las variables (también conocidas como identificadores o +macros), podemos trocear las expresiones musicales complejas. Una +variable se asigna de la manera siguiente: @example musicaConNombre = @{ @dots{} @} @end example -El contenido de la expresión musical @code{musicaConNombre} se puede -usar posteriormente colocando una barra invertida delante del nombre -(@code{\musicaConNombre}, igual que una orden normal de LilyPond). +El contenido de la expresión musical @code{musicaConNombre} se +puede usar posteriormente colocando una barra invertida delante +del nombre (@code{\musicaConNombre}, igual que una orden normal de +LilyPond). @lilypond[verbatim,quote] violin = \new Staff { - \relative c'' { - a4 b c b + \relative { + a'4 b c b } } cello = \new Staff { - \relative c { + \relative { \clef "bass" e2 d } @@ -1410,23 +1431,22 @@ cello = \new Staff { @end lilypond @noindent -El nombre de una variable debe consistir enteramente en caracteres -alfabéticos, es decir sin números, guiones ni guiones bajos. +Por convención, los nombres de variable consisten enteramente en +caracteres alfabéticos. -Las variables se deben definir @emph{antes} de la expresión musical -principal, pero se pueden usar tantas veces como se quiera, en -cualquier lugar, una vez que han sido definidas. Incluso se pueden -usar dentro de la definición de otra variable, proporcionando una vía -para acortar el código si una sección musical se repite muchas veces. +Las variables se deben definir @emph{antes} de la expresión +musical principal, pero se pueden usar tantas veces como se +quiera, en cualquier lugar, una vez que han sido definidas. +Incluso se pueden usar dentro de la definición de otra variable, +proporcionando una vía para acortar el código si una sección +musical se repite muchas veces. @c KEEP LY -@lilypond[verbatim,quote,ragged-right] -tresilloA = \tuplet 3/2 { c,8 e g } +@lilypond[verbatim,quote] +tresilloA = \relative { \tuplet 3/2 { c'8 e g } } compasA = { \tresilloA \tresilloA \tresilloA \tresilloA } -\relative c'' { - \compasA \compasA -} +{ \compasA \compasA } @end lilypond Las variables se pueden usar para otros muchos tipos de objetos dentro @@ -1438,8 +1458,9 @@ nombre = "Wendy" papelAcinco = \paper @{ paperheight = 21.0 \cm @} @end example -Dependiendo de su contenido, la variable se puede usar en distintos -lugares. El siguiente ejemplo utiliza las variables anteriores: +Dependiendo de su contenido, la variable se puede usar en +distintos lugares. El siguiente ejemplo utiliza las variables +anteriores: @example \paper @{ @@ -1462,12 +1483,11 @@ lugares. El siguiente ejemplo utiliza las variables anteriores: @cindex bloque de encabezamientos @funindex \header -@funindex header -La información sobre el título, autor, número de Opus y similares se -escriben en el bloque @code{\header}. Éste se encuentra fuera de la -expresión musical principal; el bloque @code{\header} normalmente se -sitúa por debajo del número de versión. +La información sobre el título, autor, número de Opus y similares +se escriben en el bloque @code{\header}. Éste se encuentra fuera +de la expresión musical principal; el bloque @code{\header} +normalmente se sitúa por debajo del número de versión. @example \version @w{"@version{}"} @@ -1484,8 +1504,8 @@ sitúa por debajo del número de versión. @end example Cuando se procesa el archivo, el título y el autor se imprimen por -encima de la música. Puede obtener más información sobre los títulos -en @ruser{Crear títulos encabezamientos y pies de página}. +encima de la música. Puede obtener más información sobre los +títulos en @ruser{Crear títulos encabezamientos y pies de página}. @node Nombres de nota absolutos @@ -1499,15 +1519,16 @@ en @ruser{Crear títulos encabezamientos y pies de página}. @cindex alturas, valores absolutos de @cindex absolutos, nombres de nota -Hasta el momento siempre hemos utilizado @code{\relative} para definir -las alturas. Ésta es normalmente la forma más rápida de escribir la mayor parte -de la música. Sin @code{\relative}, las alturas se interpretan en modo absoluto. +Hasta el momento hemos utilizado @code{\relative} para definir las +alturas. Ésta es normalmente la forma más rápida de escribir la +mayor parte de la música. Sin @code{\relative}, las alturas se +interpretan en modo absoluto. -En este modo, LilyPond tratará todas las alturas como -valores absolutos. Una @code{c'} significará siembre un Do central, -una @code{b} significará siempre la nota inmediatamente por debajo del -Do central, y una @code{g,} significará siempre la nota que se coloca -en la primera línea del pentagrama en clave de Fa. +En este modo, LilyPond tratará todas las alturas como valores +absolutos. Una @code{c'} significará siembre un Do@tie{}central, +una @code{b} significará siempre la nota inmediatamente por debajo +del Do@tie{}central, y una @code{g,} significará siempre la nota +que se coloca en la primera línea del pentagrama en clave de Fa. @lilypond[verbatim,quote] { @@ -1517,54 +1538,50 @@ en la primera línea del pentagrama en clave de Fa. } @end lilypond -He aquí una escala que abarca cuatro octavas: +La escritura de una melodía en clave de Sol implica un gran número +de apóstrofos (@code{'}). Considere este fragmento de Mozart: @lilypond[verbatim,quote] { - \clef "bass" - c,4 d, e, f, | - g,4 a, b, c | - d4 e f g | - a4 b c' d' | - \clef "treble" - e'4 f' g' a' | - b'4 c'' d'' e'' | - f''4 g'' a'' b'' | - c'''1 | + \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 -Como puede ver, escribir una melodía en clave de Sol implica escribir -gran cantidad de apóstrofos @q{'} . Consideremos este fragmento de -Mozart: +@funindex \fixed +Las marcas de octava que son comunes se pueden indicar una sola +vez, utilizando la instrucción @code{\fixed} seguida de una altura +de referencia: @lilypond[verbatim,quote] -{ +\fixed c'' { \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 | + cis8. d16 cis8 e4 e8 | + b,8. cis16 b,8 d4 d8 | } @end lilypond -Todos estos apóstrofos hacen casi ilegible el código de entrada y será -origen de numerosos errores. Con @code{\relative}, el ejemplo -anterior es mucho más fácil de leer: +Con @code{\relative}, el ejemplo anterior no requiere marcas de +cambio de octava porque esta melodía se mueve por intervalos no +mayores de una cuarta, o tres posiciones dentro del pentagrama: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key a \major \time 6/8 - cis8. d16 cis8 e4 e8 | + cis''8. d16 cis8 e4 e8 | b8. cis16 b8 d4 d8 | } @end lilypond Si comete un error con una marca de octava (@code{'} o @code{,}) -mientras trabaja en el modo @code{\relative}, será muy obvio (muchas -notas estarán en la octava equivocada). Mientras trabaja en el modo -absoluto, un solo fallo no será tan visible, y tampoco será tan fácil -de localizar. +mientras trabaja en el modo @code{\relative}, será muy obvio +(muchas notas estarán en la octava equivocada). Mientras trabaja +en el modo absoluto, un solo fallo no será tan visible, y tampoco +será tan fácil de localizar. Sin embargo, el modo absoluto es útil para escribir música que contenga intervalos grandes, y será extremadamente útil para hacer @@ -1577,49 +1594,51 @@ usando @code{\relative} dentro de @code{\relative}, las secciones relativas externa e interna son independientes: @lilypond[verbatim,quote] -\relative c { c'4 \relative c'' { f g } c } +\relative { c'4 \relative { f'' g } c } @end lilypond -@funindex \absolute -Si está usando música absoluta dentro de un bloque de música -relativa, tendrá que marcar la música absoluta explícitamente con -la instrucción @code{\absolute} para evitar que se incorpore a la -música relativa: +Para usar el modo absoluto dentro de @code{\relative}, ponga la +música absoluta dentro de @code{\fixed c @{ @dots{} @}} y las +notas absolutas no afectarán a las octavas de la música relativa: @lilypond[verbatim,quote] -\relative c { c'4 \absolute { f'' g'' } c } +\relative { + c'4 \fixed c { f'' g'' } c | + c4 \fixed c'' { f g } c +} @end lilypond @node Más allá del tutorial @subsection Más allá del tutorial @translationof After the tutorial -Después de terminar el tutorial, quizá debería probar a escribir una o -dos piezas. Comience con una de las plantillas que aparecen en -@ref{Plantillas} y añada algunas notas. Si necesita un tipo de -notación que no ha sido tratada en el tutorial, eche un vistazo a la -Referencia de Notación, empezando por @ruser{Notación musical}. Si -quiere escribir música para un conjunto instrumental que no está -cubierto por ninguna plantilla, consulte @ref{Extender las +Después de terminar el tutorial, quizá debería probar a escribir +una o dos piezas. Comience con una de las plantillas que aparecen +en @ref{Plantillas} y añada algunas notas. Si necesita un tipo de +notación que no ha sido tratada en el tutorial, eche un vistazo a +la Referencia de Notación, empezando por @ruser{Notación musical}. +Si quiere escribir música para un conjunto instrumental que no +está cubierto por ninguna plantilla, consulte @ref{Extender las plantillas}. -Una vez que ha escrito algunas piezas cortas, lea el resto del Manual -de aprendizaje (capítulos 3 al 5). ¡Por supuesto, no pasa nada por -leerlo ahora mismo! Sin embargo, el resto del Manual de Aprendizaje -da por sentado que está familiarizado con la entrada de LilyPond. -Puede saltarse estos capítulos ahora y volver a ellos cuando haya -adquirido más experiencia. - -En este tutorial y en el resto del Manual de aprendizaje, existe un -apartado @strong{Véase también} al final de cada una de las secciones, -que contiene referencias cruzadas a otras secciones: no siga estas -referencias durante la primera lectura; cuando haya leído el Manual de -aprendizaje completo, quizá desee releer ciertas secciones y seguir -las referencias cruzadas para obtener más información. - -Si no lo ha hecho aún, le @emph{rogamos} que lea @ref{Panorámica de -los manuales}. Existe una gran cantidad de información sobre -LilyPond, de manera que los recién llegados con frecuencia no saben -exactamente dónde deben buscar la ayuda. Si emplea cinco minutos en -leer cuidadosamente esta sección ¡se ahorrará horas de frustración -buscando en el sitio equivocado! +Una vez que ha escrito algunas piezas cortas, lea el resto del +Manual de aprendizaje (capítulos 3 al 5). ¡Por supuesto, no pasa +nada por leerlo ahora mismo! Sin embargo, el resto del Manual de +Aprendizaje da por sentado que está familiarizado con la entrada +de LilyPond. Puede saltarse estos capítulos ahora y volver a +ellos cuando haya adquirido más experiencia. + +En este tutorial y en el resto del Manual de aprendizaje, existe +un apartado @strong{Véase también} al final de cada una de las +secciones, que contiene referencias cruzadas a otras secciones: no +siga estas referencias durante la primera lectura; cuando haya +leído el Manual de aprendizaje completo, quizá desee releer +ciertas secciones y seguir las referencias cruzadas para obtener +más información. + +Si no lo ha hecho aún, le @emph{rogamos} que lea @ref{Panorámica +de los manuales}. Existe una gran cantidad de información sobre +LilyPond, de manera que los recién llegados con frecuencia no +saben exactamente dónde deben buscar la ayuda. Si emplea cinco +minutos en leer cuidadosamente esta sección ¡se ahorrará horas de +frustración buscando en el sitio equivocado! diff --git a/Documentation/es/learning/fundamental.itely b/Documentation/es/learning/fundamental.itely index e954d9710e..d4a149e016 100644 --- a/Documentation/es/learning/fundamental.itely +++ b/Documentation/es/learning/fundamental.itely @@ -1,23 +1,23 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 7fdce4f39834cc8c83f176480cc1d20900eb09f8 + Translation of GIT committish: 8451fc41680f500fff56f826017b53dc3dcbf65d When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.29" +@c \version "2.19.22" @node Conceptos fundamentales @chapter Conceptos fundamentales @translationof Fundamental concepts -Ha podido ver en el tutorial cómo producir música bellamente impresa a -partir de un simple archivo de texto. Esta sección presenta los -conceptos y técnicas que se requieren para producir partituras -igualmente bellas pero más complejas. +Ha podido ver en el tutorial cómo producir música bellamente +impresa a partir de un simple archivo de texto. Esta sección +presenta los conceptos y técnicas que se requieren para producir +partituras igualmente bellas pero más complejas. @menu * Cómo funcionan los archivos de entrada de LilyPond:: @@ -33,12 +33,12 @@ igualmente bellas pero más complejas. El formato de entrada de LilyPond es bastante libre en su forma y concede a los usuarios con experiencia mucha flexibilidad para -estructurar sus archivos de la forma que deseen. Sin embargo, toda -esta flexibilidad puede hacer que las cosas se vuelvan confusas para -los nuevos usuarios. Esta sección le va a explicar parte de esta -estructura, pero puede obviar ciertos detalles en aras de la -simplicidad. Para ver una descripción completa del formato de -entrada, consulte @ruser{Estructura del archivo}. +estructurar sus archivos de la forma que deseen. Sin embargo, +toda esta flexibilidad puede hacer que las cosas se vuelvan +confusas para los nuevos usuarios. Esta sección le va a explicar +parte de esta estructura, pero puede obviar ciertos detalles en +aras de la simplicidad. Para ver una descripción completa del +formato de entrada, consulte @ruser{Estructura del archivo}. @menu @@ -55,7 +55,8 @@ entrada, consulte @ruser{Estructura del archivo}. @cindex entrada, formato de la @cindex archivo, estructura del -Un ejemplo básico de archivo de entrada de LilyPond es el siguiente: +Un ejemplo básico de archivo de entrada de LilyPond es el +siguiente: @example \version @w{"@version{}"} @@ -70,27 +71,25 @@ Un ejemplo básico de archivo de entrada de LilyPond es el siguiente: @end example @noindent -Existen muchas variaciones de este esquema básico, pero el ejemplo -constituye un útil punto de partida. +Existen muchas variaciones de este esquema básico, pero el +ejemplo constituye un útil punto de partida. @funindex \book -@funindex book @funindex \score -@funindex score @cindex book (libro) @cindex score (partitura) @cindex libro @cindex partitura -Hasta el momento, ninguno de los ejemplos que ha podido ver utiliza la -instrucción @code{\score@{@}}. Esto es así a causa de que LilyPond -añade automáticamente las órdenes adicionales que se requieren cuando -le proporcionamos una entrada sencilla. LilyPond trata una entrada -como esta: +Hasta el momento, ninguno de los ejemplos que ha podido ver +utiliza la instrucción @code{\score@{@}}. Esto es así a causa de +que LilyPond añade automáticamente las órdenes adicionales que se +requieren cuando le proporcionamos una entrada sencilla. +LilyPond trata una entrada como esta: @example -\relative c'' @{ - c4 a d c +\relative @{ + c''4 a d c @} @end example @@ -102,8 +101,8 @@ como una abreviatura de esta otra: \score @{ \new Staff @{ \new Voice @{ - \relative c'' @{ - c4 a b c + \relative @{ + c''4 a b c @} @} @} @@ -113,34 +112,33 @@ como una abreviatura de esta otra: @end example En otras palabras, si la entrada consta de una única expresión -musical, LilyPond interpreta el archivo como si la expresión musical -estuviera rodeada por un envoltorio hecho por las instrucciones que -acabamos de ver. +musical, LilyPond interpreta el archivo como si la expresión +musical estuviera rodeada por un envoltorio hecho por las +instrucciones que acabamos de ver. @cindex contextos implícitos @cindex implícitos, contextos @strong{¡Advertencia!} Muchos de los ejemplos que aparecen en la -documentación de LilyPond omiten las instrucciones @code{\new Staff} y -@code{\new Voice}, dejando que se creen de forma implícita. Esto -funciona bien para ejemplos sencillos, pero para ejemplos más -complicados, especialmente cuando se usan instrucciones adicionales, -la creación implícita de los contextos puede dar lugar a resultados -inesperados, incluso en ocasiones crear pentagramas no deseados. La -forma de crear contextos de forma explícita se explica en -@ref{Contextos y grabadores}. - -@warning{Cuando se escriben más de unas pocas líneas de música, se -recomienda crear siempre los pentagramas y las voces de forma +documentación de LilyPond omiten las instrucciones @code{\new +Staff} y @code{\new Voice}, dejando que se creen de forma +implícita. Esto funciona bien para ejemplos sencillos, pero para +ejemplos más complicados, especialmente cuando se usan +instrucciones adicionales, la creación implícita de los contextos +puede dar lugar a resultados inesperados, incluso en ocasiones +crear pentagramas no deseados. La forma de crear contextos de +forma explícita se explica en @ref{Contextos y grabadores}. + +@warning{Cuando se escriben más de unas pocas líneas de música, +se recomienda crear siempre los pentagramas y las voces de forma explícita.} De todas formas, por ahora vamos a volver al primer ejemplo para -examinar la instrucción @code{\score}, dejando las demás en su forma -predeterminada. +examinar la instrucción @code{\score}, dejando las demás en su +forma predeterminada. Un bloque @code{\score} siempre debe contener una expresión musical -única, que debe aparecer inmediatamente después de la instrucción -@code{\score}. Recuerde que una expresión musical podía ser cualquier +única. Recuerde que una expresión musical podía ser cualquier cosa entre una sola nota hasta una enorme expresión compuesta como @example @@ -152,11 +150,11 @@ cosa entre una sola nota hasta una enorme expresión compuesta como @end example @noindent -Puesto que todo se encuentra dentro de @code{@{ @dots{} @}}, cuenta como -una expresión musical. +Puesto que todo se encuentra dentro de @code{@{ @dots{} @}}, +cuenta como una expresión musical. -Como vimos anteriormente, el bloque @code{\score} puede contener otras -cosas, tales como +Como vimos anteriormente, el bloque @code{\score} puede contener +otras cosas, tales como @example \score @{ @@ -168,79 +166,78 @@ cosas, tales como @end example @funindex \header -@funindex header @funindex \layout -@funindex layout @funindex \midi -@funindex midi @cindex midi @cindex cabecera @cindex disposición @noindent -Observe que estas tres instrucciones (@code{\header}, @code{\layout} y -@code{\midi}) son especiales: a diferencia del resto de las -instrucciones que comienzan con una barra invertida (@code{\}), -@emph{no} son expresiones musicales y no forman parte de ninguna -expresión musical. Por tanto, se pueden situar dentro de un bloque -@code{\score} o fuera de él. De hecho, estas instrucciones se sitúan -por lo general fuera del bloque @code{\score} (por ejemplo, -@code{\header} se suele colocar antes de la instrucción @code{\score}, -como muestra el ejemplo que aparece al principio de la sección. - -Dos instrucciones más que no hemos visto aún son @code{\layout @{ @}} -y @code{\midi @{ @}}. Si aparecen tal y como se muestran aquí, hacen -que LilyPond produzca una salida impresa y una salida MIDI, -respectivamente. Se describen con todo detalle en el manual de -Referencia de la notación, en @ruser{Disposición de la partitura} y en -@ruser{Crear archivos MIDI}. +Observe que estas tres instrucciones (@code{\header}, +@code{\layout} y @code{\midi}) son especiales: a diferencia del +resto de las instrucciones que comienzan con una barra invertida +(@code{\}), @emph{no} son expresiones musicales y no forman parte +de ninguna expresión musical. Por tanto, se pueden situar dentro +de un bloque @code{\score} o fuera de él. De hecho, estas +instrucciones se sitúan por lo general fuera del bloque +@code{\score} (por ejemplo, @code{\header} se suele colocar antes +de la instrucción @code{\score}, como muestra el ejemplo que +aparece al principio de la sección. + +Dos instrucciones más que no hemos visto aún son @code{\layout @{ +@}} y @code{\midi @{ @}}. Si aparecen tal y como se muestran +aquí, hacen que LilyPond produzca una salida impresa y una salida +MIDI, respectivamente. Se describen con todo detalle en el +manual de Referencia de la notación, en @ruser{Disposición de la +partitura} y en @ruser{Creación de salida MIDI}. @cindex partituras, varias @cindex book, bloque implícito @cindex implícito, bloque book @funindex \book -@funindex book Podemos escribir varios bloques @code{\score}. Cada uno de ellos -recibirá el mismo tratamiento que una partitura independiente, pero se -combinarán todos juntos en un archivo de salida único. No se necesita -ninguna instrucción @code{\book}, se creará una implícitamente. Sin -embargo, si quiere archivos de salida separados a partir de un único -archivo @file{.ly}, entonces es necesario utilizar la instrucción -@code{\book} para separar las distintas secciones: cada bloque -@code{\book} produce un archivo de salida distinto. +recibirá el mismo tratamiento que una partitura independiente, +pero se combinarán todos juntos en un archivo de salida único. +No se necesita ninguna instrucción @code{\book}, se creará una +implícitamente. Sin embargo, si quiere archivos de salida +separados a partir de un único archivo @file{.ly}, entonces es +necesario utilizar la instrucción @code{\book} para separar las +distintas secciones: cada bloque @code{\book} produce un archivo +de salida distinto. En resumen: Cada bloque @code{\book} crea un archivo de salida distinto (por -ejemplo, un archivo PDF). Si no hemos escrito uno de forma explícita, -LilyPond envuelve todo nuestro código de entrada dentro de un bloque -@code{\book} de forma implícita. +ejemplo, un archivo PDF). Si no hemos escrito uno de forma +explícita, LilyPond envuelve todo nuestro código de entrada +dentro de un bloque @code{\book} de forma implícita. -Cada bloque @code{\score} es un trozo de música separado dentro de un -bloque @code{\book}. +Cada bloque @code{\score} es un trozo de música separado dentro +de un bloque @code{\book}. @cindex layout, efecto de la situación del bloque Cada bloque @code{\layout} afecta al bloque @code{\score} o @code{\book} dentro del cual aparece (es decir, un bloque -@code{\layout} dentro de un bloque @code{\score} afecta solamente a -ese bloque @code{\score}, pero un bloque @code{\layout} fuera de un -bloque @code{\score} (que por ello está dentro de un bloque -@code{\book}, ya sea explícita o implícitamente) afecta a los bloques -@code{\score} que están dentro de ese @code{\book}. +@code{\layout} dentro de un bloque @code{\score} afecta solamente +a ese bloque @code{\score}, pero un bloque @code{\layout} fuera +de un bloque @code{\score} (que por ello está dentro de un bloque +@code{\book}, ya sea explícita o implícitamente) afecta a los +bloques @code{\score} que están dentro de ese @code{\book}. -Para ver más detalles, consulte @ruser{Varias partituras en un libro}. +Para ver más detalles, consulte +@ruser{Varias partituras en un libro}. @cindex variables -Otro magnífico atajo es la posibilidad de definir variables como -se muestra en @ref{Organizar las piezas mediante variables}. Todas las -plantillas emplean lo siguiente: +Otro magnífico atajo es la posibilidad de definir variables como +se muestra en @ref{Organizar las piezas mediante variables}. +Todas las plantillas emplean lo siguiente: @example -melodia = \relative c' @{ - c4 a b c +melodia = \relative @{ + c'4 a b c @} \score @{ @@ -248,23 +245,24 @@ melodia = \relative c' @{ @} @end example -Cuando LilyPond examina este archivo, toma el valor de @code{melodia} -(todo lo que está después del signo igual) y lo inserta dondequiera -que ve @code{\melodia}. No se requiere un cuidado especial con el -nombre (puede ser @code{melodia}, @code{global}, -@code{CompasArmadura}, @code{manoderechadelpiano} o -@code{fulanomengano} o cualquier otro). Recuerde que puede usar casi -cualquier nombre que se le ocurra, en la medida en que contenga -solamente caracteres alfabéticos y sea diferente de cualquiera de los -nombres de instrucción de LilyPond. Para ver más detalles, consulte @ref{Ahorrar -tecleo mediante variables y funciones}. Las limitaciones exactas que -afectan a los nombres de variable se detallan en @ruser{Estructura del -archivo}. +Cuando LilyPond examina este archivo, toma el valor de +@code{melodia} (todo lo que está después del signo igual) y lo +inserta dondequiera que ve @code{\melodia}. No se requiere un +cuidado especial con el nombre (puede ser @code{melodia}, +@code{global}, @code{CompasArmadura}, @code{manoderechadelpiano} +o @code{fulanomengano} o cualquier otro). Recuerde que puede +usar casi cualquier nombre que se le ocurra, en la medida en que +contenga solamente caracteres alfabéticos y sea diferente de +cualquiera de los nombres de instrucción de LilyPond. Para ver +más detalles, consulte +@ref{Ahorrar tecleo mediante variables y funciones}. Las +limitaciones exactas que afectan a los nombres de variable se +detallan en @ruser{Estructura del archivo}. @seealso -Para ver una definición completa del formato del código de entrada, -consulte @ruser{Estructura del archivo}. +Para ver una definición completa del formato del código de +entrada, consulte @ruser{Estructura del archivo}. @node La partitura es una (única) expresión musical compuesta @@ -279,35 +277,35 @@ consulte @ruser{Estructura del archivo}. @cindex musical, expresión, compuesta @cindex expresión musical compuesta @funindex \score -@funindex score -En la sección anterior, @ref{Introducción a la estructura de los -archivos de LilyPond}, hemos podido ver la organización general de los -archivos de entrada de LilyPond. Pero parece que nos saltamos la -parte más importante: ¿cómo averiguamos qué escribir después de +En la sección anterior, +@ref{Introducción a la estructura de los archivos de LilyPond}, +hemos podido ver la organización general de los archivos de +entrada de LilyPond. Pero parece que nos saltamos la parte más +importante: ¿cómo averiguamos qué escribir después de @code{\score}? No nos hemos saltado nada en absoluto. El gran misterio es, -sencillamente, que no hay @emph{ningún} misterio. La siguiente línea -lo explica todo: +sencillamente, que no hay @emph{ningún} misterio. La siguiente +línea lo explica todo: @quotation -@emph{Un bloque @code{\score} debe comenzar con una expresión musical -compuesta.} +@emph{Un bloque @code{\score} debe contener exactamente una expresión musical.} @end quotation @noindent -Para comprender lo que se entiende por expresión musical y expresión -musical compuesta, quizá encuentre útil dar un repaso al tutorial, -@ref{Explicación de las expresiones musicales}. En esta sección vimos cómo -elaborar grandes expresiones musicales a partir de pequeñas piezas -(comenzábamos con notas, luego acordes, etc.). Ahora partiremos de -una gran expresión musical y recorreremos el camino inverso hacia -abajo. Por simplicidad, vamos a hacer sólo un cantante y un piano. -No necesitamos un @code{StaffGroup} (que simplemente agrupa un cierto -número de pautas con un corchete a la izquierda) para este conjunto, -así que lo retiramos. Sin embargo, @emph{sí} necesitamos pentagramas -para un cantante y un piano. +Para comprender lo que se entiende por expresión musical, quizá +encuentre útil dar un repaso al tutorial, +@ref{Explicación de las expresiones musicales}. En esta sección +vimos cómo elaborar grandes expresiones musicales a partir de +pequeñas piezas (comenzábamos con notas, luego acordes, etc.). +Ahora partiremos de una gran expresión musical y recorreremos el +camino inverso hacia abajo. Por simplicidad, vamos a hacer sólo +un cantante y un piano. No necesitamos un @code{StaffGroup} (que +simplemente agrupa un cierto número de pautas con un corchete a +la izquierda) para este conjunto, así que lo retiramos. Sin +embargo, @emph{sí} necesitamos pentagramas para un cantante y un +piano. @example \score @{ @@ -322,23 +320,24 @@ para un cantante y un piano. @end example Aquí hemos asignado nombres a los pentagramas: @qq{cantante} y -@qq{piano}. Esto no es esencial en este momento, pero es un hábito -que resulta útil cultivar de manera que podamos saber de un vistazo -para qué es cada pentagrama. - -Recuerde que utilizamos @code{<< @dots{} >>} en lugar de @code{@{ @dots{} @}} -para presentar la música simultánea. Esto hace que las partes vocal y -del piano aparezcan una sobre la otra en la partitura. La -construcción @code{<< @dots{} >>} no sería necesaria para el pentagrama -del cantante en el ejemplo de arriba si contiene solamente una -expresión musical secuencial, pero se necesitarían los @code{<< -@dots{} >>} en lugar de las llaves si la música de ese pentagrama fuese a -contener dos o más expresiones simultáneas, p.ej. dos voces -simultáneas, o una voz con letra. Vamos a tener una voz con letra, -por lo que se requieren los ángulos dobles. Después añadiremos algo -de música real; por ahora limitémonos a poner unas cuantas notas y -texto de relleno. Si ha olvidado cómo añadir la letra, puede releer -la sección @code{\addlyrics} de @ref{Elaborar canciones sencillas}. +@qq{piano}. Esto no es esencial en este momento, pero es un +hábito que resulta útil cultivar de manera que podamos saber de +un vistazo para qué es cada pentagrama. + +Recuerde que utilizamos @code{<< @dots{} >>} en lugar de @code{@{ +@dots{} @}} para presentar la música simultánea. Esto hace que +las partes vocal y del piano aparezcan una sobre la otra en la +partitura. La construcción @code{<< @dots{} >>} no sería +necesaria para el pentagrama del cantante en el ejemplo de arriba +si contiene solamente una expresión musical secuencial, pero se +necesitarían los @code{<< @dots{} >>} en lugar de las llaves si +la música de ese pentagrama fuese a contener dos o más +expresiones simultáneas, p.ej. dos voces simultáneas, o una voz +con letra. Vamos a tener una voz con letra, por lo que se +requieren los ángulos dobles. Después añadiremos algo de música +real; por ahora limitémonos a poner unas cuantas notas y texto de +relleno. Si ha olvidado cómo añadir la letra, puede releer la +sección @code{\addlyrics} de @ref{Elaborar canciones sencillas}. @lilypond[verbatim,quote,ragged-right] \score { @@ -356,44 +355,45 @@ la sección @code{\addlyrics} de @ref{Elaborar canciones sencillas}. } @end lilypond -Ahora tenemos muchos más detalles. Tenemos la pauta del cantante: -contiene una @code{Voice} o voz (en LilyPond, este término hace -referencia a un conjunto de notas, no necesariamente notas vocales -- -por ejemplo, un violín generalmente toca una voz --) y el texto de la -canción. También tenemos una pauta de piano: contiene un pentagrama -superior (mano derecha) y un pentagrama inferior (mano izquierda), -aunque el pentagrama inferior aún no tiene la clave de Fa. +Ahora tenemos muchos más detalles. Tenemos la pauta del +cantante: contiene una @code{Voice} o voz (en LilyPond, este +término hace referencia a un conjunto de notas, no necesariamente +notas vocales -- por ejemplo, un violín generalmente toca una voz +--) y el texto de la canción. También tenemos una pauta de +piano: contiene un pentagrama superior (mano derecha) y un +pentagrama inferior (mano izquierda), aunque el pentagrama +inferior aún no tiene la clave de Fa. -En este momento podríamos comenzar a meter las notas. Dentro de las -llaves que siguen a @code{\new Voice = "vocal"}, podríamos empezar -escribiendo +En este momento podríamos comenzar a meter las notas. Dentro de +las llaves que siguen a @code{\new Voice = "vocal"}, podríamos +empezar escribiendo @example -\relative c'' @{ - r4 d8\noBeam g, c4 r +\relative @{ + r4 d''8\noBeam g, c4 r @} @end example Pero si lo hiciéramos, la sección @code{\score} se haría bastante -larga y sería más difícil comprender lo que ocurre. En lugar de esto -utilizaremos identificadores o variables. Recordará que las vimos por -primera vez en la sección anterior. +larga y sería más difícil comprender lo que ocurre. En lugar de +esto utilizaremos identificadores o variables. Recordará que las +vimos por primera vez en la sección anterior. -Para asegurarnos de que el contenido de la variable @code{text} se -interpreta como letra, lo precedemos por @code{\lyricmode}. Como -@code{\addlyrics}, esto activa el modo de entrada de letra. Sin ello, -LilyPond trataría de interpretar el contenido como notas, lo que -generaría errores (Existen algunos otros modos, véase @ruser{Modos de -entrada}). +Para asegurarnos de que el contenido de la variable @code{text} +se interpreta como letra, lo precedemos por @code{\lyricmode}. +Como @code{\addlyrics}, esto activa el modo de entrada de letra. +Sin ello, LilyPond trataría de interpretar el contenido como +notas, lo que generaría errores (Existen algunos otros modos, +véase @ruser{Modos de entrada}). -Así pues, escribiendo algunas notas, y una clave de Fa para la mano -izquierda, ahora tenemos un fragmento musical de verdad: +Así pues, escribiendo algunas notas, y una clave de Fa para la +mano izquierda, ahora tenemos un fragmento musical de verdad: @lilypond[verbatim,quote,ragged-right] -melody = \relative c'' { r4 d8\noBeam g, c4 r } +melody = \relative { r4 d''8\noBeam g, c4 r } text = \lyricmode { And God said, } -upper = \relative c'' { 2~ } -lower = \relative c { b2 e } +upper = \relative { 2~ } +lower = \relative { b,2 e } \score { << @@ -413,12 +413,12 @@ lower = \relative c { b2 e } } @end lilypond -Cuando escriba una sección @code{\score} o cuando la esté leyendo, -hágalo despacio y con cuidado. Comience por el nivel exterior y luego -trabaje sobre cada uno de los niveles interiores. También es de gran -ayuda ser muy estricto con los márgenes (asegúrese de que en su editor -de texto cada elemento del mismo nivel comienza en la misma posición -horizontal). +Cuando escriba una sección @code{\score} o cuando la esté +leyendo, hágalo despacio y con cuidado. Comience por el nivel +exterior y luego trabaje sobre cada uno de los niveles +interiores. También es de gran ayuda ser muy estricto con los +márgenes (asegúrese de que en su editor de texto cada elemento +del mismo nivel comienza en la misma posición horizontal). @seealso @@ -434,17 +434,17 @@ Referencia de la notación: @cindex temporales, pentagramas @cindex ossias -No es esencial declarar todos los pentagramas al comienzo; se pueden -crear temporalmente en cualquier momento. Esto es de especial -utilidad para crear secciones de ossia (véase @rglos{ossia}). A -continuación presentamos un ejemplo sencillo que muestra cómo -introducir temporalmente un pentagrama nuevo mientras dura un -fragmento de tres notas: +No es esencial declarar todos los pentagramas al comienzo; se +pueden crear temporalmente en cualquier momento. Esto es de +especial utilidad para crear secciones de ossia (véase +@rglos{ossia}). A continuación presentamos un ejemplo sencillo +que muestra cómo introducir temporalmente un pentagrama nuevo +mientras dura un fragmento de tres notas: @lilypond[verbatim,quote,ragged-right] \new Staff { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -458,20 +458,20 @@ fragmento de tres notas: @end lilypond @noindent -Advierta que el tamaño de la clave es igual al que se imprime en un -cambio de clave (ligeramente menor que la clave al principio de una -línea). Esto es normal para cualquier clave que se imprime en la -mitad de una línea. +Advierta que el tamaño de la clave es igual al que se imprime en +un cambio de clave (ligeramente menor que la clave al principio +de una línea). Esto es normal para cualquier clave que se +imprime en la mitad de una línea. @cindex pentagrama, posicionado del -La sección ossia se puede colocar encima del pentagrama de la manera -siguiente: +La sección ossia se puede colocar encima del pentagrama de la +manera siguiente: @lilypond[verbatim,quote,ragged-right] \new Staff = "main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -484,18 +484,19 @@ siguiente: } @end lilypond -Este ejemplo utiliza @code{\with}, que se explica en todo detalle más -adelante. Es un medio de modificar el comportamiento predeterminado -de un solo pentagrama. Aquí, dice que el pentagrama nuevo se debe -colocar por encima del pentagrama llamado @qq{main} en vez de la -posición predeterminada que sería por debajo. +Este ejemplo utiliza @code{\with}, que se explica en todo detalle +más adelante. Es un medio de modificar el comportamiento +predeterminado de un solo pentagrama. Aquí, dice que el +pentagrama nuevo se debe colocar por encima del pentagrama +llamado @qq{main} en vez de la posición predeterminada que sería +por debajo. @seealso Los fragmentos de ossia se escriben a menudo sin clave y sin -indicación de compás, y generalmente en un tipo más pequeño. Esto -necesitaría más instrucciones que aún no se han visto. Véase -@ref{Tamaño de los objetos} y @ruser{Pentagramas de Ossia}. +indicación de compás, y generalmente en un tipo más pequeño. +Esto necesitaría más instrucciones que aún no se han visto. +Véase @ref{Tamaño de los objetos} y @ruser{Pentagramas de Ossia}. @node Acerca de la no anidabilidad de llaves y ligaduras @@ -509,11 +510,11 @@ necesitaría más instrucciones que aún no se han visto. Véase @cindex paréntesis y corchetes, tipos de @cindex paréntesis y corchetes, encerrar frente a marcar -En la escritura del archivo de entrada de LilyPond, hemos podido ver -algunos tipos de paréntesis, llaves o ángulos de distintos tipos. -Éstos obedecen a distintas reglas que al principio pueden resultar -confusas. Antes de explicar estas reglas, demos un repaso a las -distintas clases de corchetes, llaves y paréntesis. +En la escritura del archivo de entrada de LilyPond, hemos podido +ver algunos tipos de paréntesis, llaves o ángulos de distintos +tipos. Éstos obedecen a distintas reglas que al principio pueden +resultar confusas. Antes de explicar estas reglas, demos un +repaso a las distintas clases de corchetes, llaves y paréntesis. @c attempt to force this onto a new page @need 50 @@ -535,48 +536,54 @@ distintas clases de corchetes, llaves y paréntesis. @end multitable A las anteriores, debemos añadir otras construcciones que generan -líneas entre o a través de las notas: las ligaduras de unión (marcadas -con una tilde curva, @code{~}), los grupos especiales que se escriben -como @code{\tuplet x/y @{ @dots{} @}}, y las notas de adorno, que se escriben -como @code{\grace @{ @dots{} @}}. +líneas entre o a través de las notas: las ligaduras de unión +(marcadas con una tilde curva, @code{~}), los grupos especiales +que se escriben como @code{\tuplet x/y @{ @dots{} @}}, y las +notas de adorno, que se escriben como @code{\grace @{ @dots{} +@}}. Fuera de LilyPond, el uso convencional de los paréntesis y otros corchetes requiere que los distintos tipos se encuentren anidados -correctamente, como en: @code{<< [ @{ ( @dots{} ) @} ] >>}, de manera que -los paréntesis que se cierran deben encontrarse en el orden -exactamente opuesto al de los paréntesis que se abren. Esto -@strong{es} un requisito para los tres tipos de paréntesis que se -describen mediante la palabra @q{Encierra} en la tabla anterior: se -deben anidar correctamente. Sin embargo, el resto de las llaves y -corchetes, que se encuentran descritos por la palabra @q{Marca} en la -misma tabla anterior, @strong{no} tienen por qué anidarse -estrictamente con ninguno de los otros paréntesis. De hecho, éstos no -son paréntesis en el sentido de que encierran algo: simplemente son -marcadores que indican dónde empieza o finaliza algo. +correctamente, como en: @code{<< [ @{ ( @dots{} ) @} ] >>}, de +manera que los paréntesis que se cierran deben encontrarse en el +orden exactamente opuesto al de los paréntesis que se abren. +Esto @strong{es} un requisito para los tres tipos de paréntesis +que se describen mediante la palabra @q{Encierra} en la tabla +anterior: se deben anidar correctamente. Sin embargo, el resto +de las llaves y corchetes, que se encuentran descritos por la +palabra @q{Marca} en la misma tabla anterior, @strong{no} tienen +por qué anidarse estrictamente con ninguno de los otros +paréntesis. De hecho, éstos no son paréntesis en el sentido de +que encierran algo: simplemente son marcadores que indican dónde +empieza o finaliza algo. Así pues, por ejemplo, una ligadura de fraseo puede dar comienzo -antes de una barra insertada manualmente, y acabar antes de que acabe -la barra (algo que quizá no sea muy musical, pero es posible): +antes de una barra insertada manualmente, y acabar antes de que +acabe la barra (algo que quizá no sea muy musical, pero es +posible): -@lilypond[quote,verbatim,ragged-right,relative=2] -g8\( a b[ c b\) a] g4 +@lilypond[quote,verbatim,ragged-right] +\relative { g'8\( a b[ c b\) a] g4 } @end lilypond En general, los distintos tipos de corchete, y los implicados en -grupos especiales, ligaduras de unión y notas de adorno, se pueden -mezclar con total libertad. Este ejemplo muestra una barra que se -extiende hacia el interior de un grupo de valoración especial (línea -1), una ligadura de expresión que se prolonga hasta el interior de un -grupo especial (línea 2), una barra y una ligadura de expresión que se -prolongan hasta el interior de un grupo especial, una ligadura de -unión que atraviesa dos grupos especiales, y una ligadura de fraseo -que sale del interior de un grupo especial (líneas 3 y 4). - -@lilypond[quote,verbatim,ragged-right,relative=1] -r16[ g \tuplet 3/2 { r16 e'8] } -g,16( a \tuplet 3/2 { b16 d) e } -g,8[( a \tuplet 3/2 { b8 d) e~] } | -\tuplet 5/4 { e32\( a, b d e } a4.\) +grupos especiales, ligaduras de unión y notas de adorno, se +pueden mezclar con total libertad. Este ejemplo muestra una +barra que se extiende hacia el interior de un grupo de valoración +especial (línea 1), una ligadura de expresión que se prolonga +hasta el interior de un grupo especial (línea 2), una barra y una +ligadura de expresión que se prolongan hasta el interior de un +grupo especial, una ligadura de unión que atraviesa dos grupos +especiales, y una ligadura de fraseo que sale del interior de un +grupo especial (líneas 3 y 4). + +@lilypond[quote,verbatim,ragged-right] +\relative { + r16[ g' \tuplet 3/2 { r16 e'8] } + g,16( a \tuplet 3/2 { b16 d) e } + g,8[( a \tuplet 3/2 { b8 d) e~] } | + \tuplet 5/4 { e32\( a, b d e } a4.\) +} @end lilypond @@ -585,9 +592,9 @@ g,8[( a \tuplet 3/2 { b8 d) e~] } | @translationof Voices contain music Igual que los cantantes, LilyPond necesita voces para cantar. En -realidad, la música para cualquier instrumento de una partitura está -siempre contenida dentro de una voz --el concepto de LilyPond más -fundamental de todos--. +realidad, la música para cualquier instrumento de una partitura +está siempre contenida dentro de una voz --el concepto de +LilyPond más fundamental de todos--. @menu * Oigo voces:: @@ -610,64 +617,71 @@ fundamental de todos--. @cindex voces frente a acordes @cindex acordes frente a voces -De las capas más profundas de una partitura de LilyPond, las más bajas -y más fundamentales reciben el nombre de @q{Voice contexts} -(«contextos de voz») o, abreviadamente, @q{Voices} («voces»). Las -voces reciben a veces el nombre de @q{layers} («capas») en otros -programas de edición de partituras. - -De hecho, una capa o contexto de voz es la única que puede contener -música. Si un contexto de voz no se declara explícitamente, se crea -uno de forma automática, como vimos al comienzo de este capítulo. -Ciertos instrumentos como el oboe solamente pueden tocar una nota cada -vez. La música escrita para estos instrumentos -solamente requiere una voz. Los instrumentos que pueden tocar -más de una nota a la vez, como el piano, con frecuencia necesitarán -varias voces para codificar las distintas notas y ritmos concurrentes -que son capaces de tocar. +De las capas más profundas de una partitura de LilyPond, las más +bajas y más fundamentales reciben el nombre de @q{Voice contexts} +(«contextos de voz») o, abreviadamente, @q{Voices} («voces»). +Las voces reciben a veces el nombre de @q{layers} («capas») en +otros programas de edición de partituras. + +De hecho, una capa o contexto de voz es la única que puede +contener música. Si un contexto de voz no se declara +explícitamente, se crea uno de forma automática, como vimos al +comienzo de este capítulo. Ciertos instrumentos como el oboe +solamente pueden tocar una nota cada vez. La música escrita para +estos instrumentos solamente requiere una voz. Los instrumentos +que pueden tocar más de una nota a la vez, como el piano, con +frecuencia necesitarán varias voces para codificar las distintas +notas y ritmos concurrentes que son capaces de tocar. Una sola voz puede contener muchas notas dentro de un acorde, por -supuesto; entonces ¿cuándo, exactamente, se necesitan varias voces? -En primer lugar observe este ejemplo de cuatro acordes: +supuesto; entonces ¿cuándo, exactamente, se necesitan varias +voces? En primer lugar observe este ejemplo de cuatro acordes: -@lilypond[quote,verbatim,ragged-right,relative=1] -\key g \major -4 +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + 4 +} @end lilypond -Esto se puede expresar utilizando sólo símbolos de acorde con ángulos -simples, @code{< @dots{} >}, y para este propósito tan sólo se necesita -una voz. Pero suponga que el Fa sostenido fuese realmente una corchea -seguida de un Sol corchea, una nota de paso que conduce al La. Ahora -tenemos dos notas que empiezan en el mismo momento pero tienen -distintas duraciones: la negra Re, y la corchea Fa sostenido. ¿Cómo se -codifica esto? No se pueden escribir como un acorde porque todas las -notas de un acorde deben tener la misma duración. Y no se pueden -escribir como dos notas en secuencia porque tienen que empezar en el -mismo momento. Aquí es donde se necesitan dos voces. - -Veamos cómo se hace esto dentro de la sintaxis de entrada de LilyPond. +Esto se puede expresar utilizando sólo símbolos de acorde con +ángulos simples, @code{< @dots{} >}, y para este propósito tan +sólo se necesita una voz. Pero suponga que el Fa sostenido fuese +realmente una corchea seguida de un Sol corchea, una nota de paso +que conduce al La. Ahora tenemos dos notas que empiezan en el +mismo momento pero tienen distintas duraciones: la negra Re, y la +corchea Fa sostenido. ¿Cómo se codifica esto? No se pueden +escribir como un acorde porque todas las notas de un acorde deben +tener la misma duración. Y no se pueden escribir como dos notas +en secuencia porque tienen que empezar en el mismo momento. Aquí +es donde se necesitan dos voces. + +Veamos cómo se hace esto dentro de la sintaxis de entrada de +LilyPond. @funindex << \\ >> @funindex \\ -La forma más fácil de introducir fragmentos con más de una voz en un -solo pentagrama es escribir cada voz como una secuencia (con -@code{@{ @dots{} @}}), y combinarlas simultáneamente con ángulos dobles, -@code{<< @dots{} >>}. Los fragmentos también se deben separar mediante una -doble barra invertida, @code{\\}, para situarlos en voces separadas. -Sin esto, las notas irían a una sola voz, lo que normalmente produce -errores. Esta técnica se adapta especialmente bien a piezas de música -que son mayormente homofónicas pero ocasionalmente tienen cortas -secciones de polifonía. - -He aquí cómo dividimos los acordes anteriores en dos voces y añadimos -la nota de paso y la ligadura: - -@lilypond[quote,verbatim,ragged-right,relative=2] -\key g \major -% Voice "1" Voice "2" -<< { g4 fis8( g) a4 g } \\ { d4 d d d } >> +La forma más fácil de introducir fragmentos con más de una voz en +un solo pentagrama es escribir cada voz como una secuencia (con +@code{@{ @dots{} @}}), y combinarlas simultáneamente con ángulos +dobles, @code{<< @dots{} >>}. Los fragmentos también se deben +separar mediante una doble barra invertida, @code{\\}, para +situarlos en voces separadas. Sin esto, las notas irían a una +sola voz, lo que normalmente produce errores. Esta técnica se +adapta especialmente bien a piezas de música que son mayormente +homofónicas pero ocasionalmente tienen cortas secciones de +polifonía. + +He aquí cómo dividimos los acordes anteriores en dos voces y +añadimos la nota de paso y la ligadura: + +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + % Voice = "1" Voice = "2" + << { g'4 fis8( g) a4 g } \\ { d4 d d d } >> +} @end lilypond Observe cómo las plicas de la segunda voz ahora se dirigen hacia @@ -675,80 +689,85 @@ abajo. A continuación veamos otro ejemplo sencillo: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key d \minor -% Voice "1" Voice "2" -<< { r4 g g4. a8 } \\ { d,2 d4 g } >> | -<< { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> | -<< { a2. r4 } \\ { fis2. s4 } >> | +@lilypond[quote,verbatim,ragged-right] +\relative { + \key d \minor + % Voice = "1" Voice = "2" + << { r4 g' g4. a8 } \\ { d,2 d4 g } >> | + << { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> | + << { a2. r4 } \\ { fis2. s4 } >> | +} @end lilypond -No es necesario usar una construcción @code{<< \\ >>} distinta para -cada compás. Para música que tenga unas pocas notas en cada compás, -esta disposición podría facilitar la legibilidad del código, pero si -hay muchas notas en cada compás podría ser mejor dividirlo en dos -voces separadas, de la siguiente manera: - -@lilypond[quote,verbatim,ragged-right,relative=2] -\key d \minor -<< { - % Voice "1" - r4 g g4. a8 | - bes4 bes c bes | - a2. r4 | -} \\ { - % Voice "2" - d,2 d4 g | - g4 g g8( a) g4 | - fis2. s4 | -} >> +No es necesario usar una construcción @code{<< \\ >>} distinta +para cada compás. Para música que tenga unas pocas notas en cada +compás, esta disposición podría facilitar la legibilidad del +código, pero si hay muchas notas en cada compás podría ser mejor +dividirlo en dos voces separadas, de la siguiente manera: + +@lilypond[quote,verbatim,ragged-right] +<< + \key d \minor + \relative { % Voice = "1" + r4 g' g4. a8 | + bes4 bes c bes | + a2. r4 | + } \\ + \relative { % Voice = "2" + d'2 d4 g | + g4 g g8( a) g4 | + fis2. s4 | + } +>> @end lilypond @cindex voces, nombrado de @cindex voces que cruzan corchetes @cindex ligaduras que cruzan corchetes -Este ejemplo tiene sólo dos voces, pero la misma construcción se puede -usar para codificar tres o más voces mediante la adición de más -separadores de barra invertida. +Este ejemplo tiene sólo dos voces, pero la misma construcción se +puede usar para codificar tres o más voces mediante la adición de +más separadores de barra invertida. -Los contextos de voz llevan los nombres de @code{"1"}, @code{"2"}, -etc. Los primeros contextos establecen las voces @emph{externas}, la -voz aguda del contexto @code{"1"} y la voz grave del contexto -@code{"2"}. Las voces interiores van en los contextos @code{"3"} y -@code{"4"}. En cada uno de estos contextos, la dirección vertical de -las ligaduras, plicas, matices dinámicos, etc., se ajusta de forma -correcta. +Los contextos de voz llevan los nombres de @code{"1"}, +@code{"2"}, etc. Los primeros contextos establecen las voces +@emph{externas}, la voz aguda del contexto @code{"1"} y la voz +grave del contexto @code{"2"}. Las voces interiores van en los +contextos @code{"3"} y @code{"4"}. En cada uno de estos +contextos, la dirección vertical de las ligaduras, plicas, +matices dinámicos, etc., se ajusta de forma correcta. @lilypond[quote,verbatim] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f - % Voice "1" Voice "2" Voice "3" + c'16 d e f + % Voice = "1" Voice = "2" Voice = "3" << { g4 f e } \\ { r8 e4 d c8~ } >> | - << { d2 e } \\ { c8 b16 a b8 g~ g2 } \\ { s4 b c2 } >> | + << { d2 e } \\ { c8 b16 a b8 g~ 2 } \\ { s4 b c2 } >> | } @end lilypond -Todas estas voces están separadas de la voz principal que contiene las -notas justo por fuera de la construcción @code{<< @dots{} >>}. Le -llamaremos a esto la @emph{construcción simultánea}. Las ligaduras -(de prolongación y de expresión) solamente pueden conectar notas que -estén dentro de la misma voz, luego las ligaduras no pueden entrar o -salir de una construcción simultánea. A la inversa, las voces -paralelas de construcciones simultáneas distintas sobre el mismo -pentagrama, son la misma voz. Otras propiedades relativas a las voces -también conllevan construcciones simultáneas. A continuación vemos el -mismo ejemplo, con colores y cabezas distintos para cada voz. Observe -que los cambios en una voz no afectan a otras voces, pero persisten -más tarde dentro de la misma voz. Observe también que las notas -ligadas se pueden dividir entre las mismas voces de dos -construcciones, como se indica aquí en la voz de triángulos azules. +Todas estas voces están separadas de la voz principal que +contiene las notas justo por fuera de la construcción @code{<< +@dots{} >>}. Le llamaremos a esto la @emph{construcción +simultánea}. Las ligaduras (de prolongación y de expresión) +solamente pueden conectar notas que estén dentro de la misma voz, +luego las ligaduras no pueden entrar o salir de una construcción +simultánea. A la inversa, las voces paralelas de construcciones +simultáneas distintas sobre el mismo pentagrama, son la misma +voz. Otras propiedades relativas a las voces también conllevan +construcciones simultáneas. A continuación vemos el mismo +ejemplo, con colores y cabezas distintos para cada voz. Observe +que los cambios en una voz no afectan a otras voces, pero +persisten más tarde dentro de la misma voz. Observe también que +las notas ligadas se pueden dividir entre las mismas voces de dos +construcciones, como se indica aquí en la voz de triángulos +azules. @lilypond[quote,verbatim] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f + c'16 d e f << % Bar 1 { \voiceOneStyle @@ -765,7 +784,7 @@ construcciones, como se indica aquí en la voz de triángulos azules. { d2 e } \\ % Voice 2 continues - { c8 b16 a b8 g~ g2 } + { c8 b16 a b8 g~ 2 } \\ { \voiceThreeStyle @@ -781,25 +800,26 @@ construcciones, como se indica aquí en la voz de triángulos azules. @funindex \voiceFourStyle @funindex \voiceNeutralStyle -Las instrucciones @code{\voiceXXXStyle} están pensadas principalmente -para usarlas en documentos educativos como este mismo. Modifican el -color de la cabeza, la plica y las barras, y el estilo de la cabeza, -de forma que las voces se puedan distinguir fácilmente. La voz uno -está establecida a rombos rojos, la voz dos a triángulos azules, la -voz tres a círculos verdes con aspas, y la voz cuatro (que no se -utiliza aquí) a aspas color magenta. @code{\voiceNeutralStyle} (que -tampoco se usa aquí) devuelve todo al estilo predeterminado. Veremos -más adelante cómo el usuario puede crear instrucciones como éstas. -Véase @ref{Visibilidad y color de los objetos} y -@ref{Uso de variables para los ajustes de disposición}. +Las instrucciones @code{\voiceXXXStyle} están pensadas +principalmente para usarlas en documentos educativos como este +mismo. Modifican el color de la cabeza, la plica y las barras, y +el estilo de la cabeza, de forma que las voces se puedan +distinguir fácilmente. La voz uno está establecida a rombos +rojos, la voz dos a triángulos azules, la voz tres a círculos +verdes con aspas, y la voz cuatro (que no se utiliza aquí) a +aspas color magenta. @code{\voiceNeutralStyle} (que tampoco se +usa aquí) devuelve todo al estilo predeterminado. Veremos más +adelante cómo el usuario puede crear instrucciones como éstas. +Véase @ref{Visibilidad y color de los objetos} y @ref{Uso de +variables para los ajustes de disposición}. @cindex polifonía y modo relativo @cindex relativo, modo, polifonía y -La polifonía no cambia la relación de las notas dentro de un bloque -@code{\relative}. La altura de cada nota aún se calcula con -relación a la nota que le precede inmediatamente, o a la primera nota -del acorde precedente. Así, en +La polifonía no cambia la relación de las notas dentro de un +bloque @code{\relative}. La altura de cada nota aún se calcula +con relación a la nota que le precede inmediatamente, o a la +primera nota del acorde precedente. Así, en @example \relative c' @{ notaA << < notaB notaC > \\ notaD >> notaE @} @@ -817,34 +837,35 @@ voces están muy separadas, es colocar una instrucción @code{\relative} al principio de cada voz: @example -\relative c' @{ notaA @dots{} @} +\relative @{ notaA @dots{} @} << - \relative c'' @{ < notaB notaC > @dots{} @} + \relative @{ < notaB notaC > @dots{} @} \\ - \relative g' @{ notaD @dots{} @} + \relative @{ notaD @dots{} @} >> -\relative c' @{ notaE @dots{} @} +\relative @{ notaE @dots{} @} @end example -Finalmente, analicemos las voces en una pieza de música más compleja. -He aquí las notas de los dos primeros compases del segundo de los Dos -Nocturnos de Chopin, Op 32. Este ejemplo se utilizará en fases -posteriores dentro del presente capítulo y el siguiente, para ilustrar -varias técnicas para producir notación, y por tanto le pedimos que -ignore por ahora cualquier cosa en el código subyacente que le parezca -misterioso y tan sólo se concentre en la música y las voces (todas -las complicaciones se explicarán en secciones posteriores). +Finalmente, analicemos las voces en una pieza de música más +compleja. He aquí las notas de los dos primeros compases del +segundo de los Dos Nocturnos de Chopin, Op 32. Este ejemplo se +utilizará en fases posteriores dentro del presente capítulo y el +siguiente, para ilustrar varias técnicas para producir notación, +y por tanto le pedimos que ignore por ahora cualquier cosa en el +código subyacente que le parezca misterioso y tan sólo se +concentre en la música y las voces (todas las complicaciones se +explicarán en secciones posteriores). @c The following should appear as music without code @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << % Voice one - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ % Voice two { % Ignore these for now - they are explained in Ch 4 - \once \override NoteColumn.ignore-collision = ##t + \once \override NoteColumn.force-hshift = #0 2 \once \override NoteColumn.force-hshift = #0.5 des2 @@ -860,40 +881,40 @@ las complicaciones se explicarán en secciones posteriores). } @end lilypond -Con frecuencia, la dirección de las plicas se utiliza para indicar la -continuidad de dos líneas melódicas simultáneas. Aquí, todas las -plicas de las notas agudas se dirigen hacia arriba y las de las notas -graves hacia abajo. Ésta es la primera indicación de que se requiere -más de una voz. - -Pero la necesidad real de varias voces aflora cuando hay notas que -comienzan en el mismo tiempo pero tienen distintas duraciones. -Observe las notas que comienzan en la tercera parte del primer compás. -El La bemol es una negra con puntillo, el Fa es una negra y el Re -bemol es una blanca. Estas notas no se pueden escribir como un acorde -porque todas las notas de un acorde deben tener la misma duración. -Tampoco se pueden escribir como notas secuenciales, pues deben -comenzar al mismo tiempo. Esta sección del compás requiere tres -voces, y la práctica común sería escribir todo el compás como tres -voces como se muestra abajo, donde hemos usado distintas cabezas y -colores para las tres voces. Una vez más, el código que subyace a -este ejemplo se explicará más tarde, así pues ignore todo lo que no -entienda. +Con frecuencia, la dirección de las plicas se utiliza para +indicar la continuidad de dos líneas melódicas simultáneas. +Aquí, todas las plicas de las notas agudas se dirigen hacia +arriba y las de las notas graves hacia abajo. Ésta es la primera +indicación de que se requiere más de una voz. + +Pero la necesidad real de varias voces aflora cuando hay notas +que comienzan en el mismo tiempo pero tienen distintas +duraciones. Observe las notas que comienzan en la tercera parte +del primer compás. El La bemol es una negra con puntillo, el Fa +es una negra y el Re bemol es una blanca. Estas notas no se +pueden escribir como un acorde porque todas las notas de un +acorde deben tener la misma duración. Tampoco se pueden escribir +como notas secuenciales, pues deben comenzar al mismo tiempo. +Esta sección del compás requiere tres voces, y la práctica común +sería escribir todo el compás como tres voces como se muestra +abajo, donde hemos usado distintas cabezas y colores para las +tres voces. Una vez más, el código que subyace a este ejemplo se +explicará más tarde, así pues ignore todo lo que no entienda. @c The following should appear as music without code @c The three voice styles should be defined in -init @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << { % Voice one \voiceOneStyle - c2 aes4. bes8 + c''2 aes4. bes8 } \\ % Voice two { \voiceTwoStyle % Ignore these for now - they are explained in Ch 4 - \once \override NoteColumn.ignore-collision = ##t + \once \override NoteColumn.force-hshift = #0 2 \once \override NoteColumn.force-hshift = #0.5 des2 @@ -911,15 +932,15 @@ entienda. Vamos a intentar codificar esta música partiendo de cero. Como -veremos, esto se topa con ciertas dificultades. Comenzamos tal y como -hemos aprendido, usando la construcción @code{<< \\ >>} para +veremos, esto se topa con ciertas dificultades. Comenzamos tal y +como hemos aprendido, usando la construcción @code{<< \\ >>} para introducir la música del primer compás en tres voces: @lilypond[quote,verbatim,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } + { c''2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } >> | 1 | } @@ -930,19 +951,20 @@ introducir la música del primer compás en tres voces: @cindex plicas, voces y dirección de las @cindex plica arriba -Las direcciones de las plicas se asignan automáticamente de forma que -las voces de numeración impar reciben las plicas hacia arriba y las de -numeración par hacia abajo. Las plicas de las voces 1 y 2 están -correctas, pero las plicas de la voz 3 debería ir hacia abajo en este -fragmento en particular. Podemos corregir esto simplemente -olvidándonos de la voz tres y situando la música en la voz cuatro. -Esto se hace escribiendo otro par de barras invertidas (@code{\\}). +Las direcciones de las plicas se asignan automáticamente de forma +que las voces de numeración impar reciben las plicas hacia arriba +y las de numeración par hacia abajo. Las plicas de las voces 1 y +2 están correctas, pero las plicas de la voz 3 debería ir hacia +abajo en este fragmento en particular. Podemos corregir esto +simplemente olvidándonos de la voz tres y situando la música en +la voz cuatro. Esto se hace escribiendo otro par de barras +invertidas (@code{\\}). @lilypond[quote,verbatim,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << % Voice one - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ % Voice two { 2 des } \\ % Omit Voice three @@ -954,19 +976,21 @@ Esto se hace escribiendo otro par de barras invertidas (@code{\\}). @end lilypond @noindent -Vemos que esto arregla la dirección de la plica, pero la colocación -horizontal de las notas no es la deseada. LilyPond desplaza las notas -interiores cuando ellas o sus plicas de otro modo colisionarían con -las voces exteriores, pero esto no es lo más adecuado para música de -piano. En otras situaciones, los desplazamientos que LilyPond aplica -pueden no eliminar las colisiones. LilyPond aporta varias formas de -ajustar la colocación horizontal de las notas. Aún no estamos -preparados para ver cómo se corrige esto, por lo que dejaremos el -problema para una sección posterior (véase la propiedad -@code{force-hshift} en @ref{Arreglar notación con superposiciones}). - -@warning{No se pueden crear letras ni objetos de extensión -(como ligaduras, reguladores, etc.) @q{entre} voces distintas.} +Vemos que esto arregla la dirección de la plica, pero la +colocación horizontal de las notas no es la deseada. LilyPond +desplaza las notas interiores cuando ellas o sus plicas de otro +modo colisionarían con las voces exteriores, pero esto no es lo +más adecuado para música de piano. En otras situaciones, los +desplazamientos que LilyPond aplica pueden no eliminar las +colisiones. LilyPond aporta varias formas de ajustar la +colocación horizontal de las notas. Aún no estamos preparados +para ver cómo se corrige esto, por lo que dejaremos el problema +para una sección posterior (véase la propiedad +@code{force-hshift} en @ref{Arreglar notación con +superposiciones}). + +@warning{No se pueden crear letras ni objetos de extensión (como +ligaduras, reguladores, etc.) @q{entre} voces distintas.} @seealso Referencia de la notación: @@ -979,32 +1003,27 @@ Referencia de la notación: @funindex \voiceOne -@funindex voiceOne @funindex \voiceTwo -@funindex voiceTwo @funindex \voiceThree -@funindex voiceThree @funindex \voiceFour -@funindex voiceFour @funindex \oneVoice -@funindex oneVoice @funindex \new Voice @cindex contextos de voz, creación de -Los contextos de voz también se pueden crear manualmente dentro de un -bloque @code{<< >>} para crear música polifónica, utilizando -@code{\voiceOne} @dots{} @code{\voiceFour} para indicar las direcciones -requeridas de plicas, ligaduras, etc. En partituras más largas, este -método es más claro porque permite que las voces estén separadas y -reciban nombres más descriptivos. +Los contextos de voz también se pueden crear manualmente dentro +de un bloque @code{<< >>} para crear música polifónica, +utilizando @code{\voiceOne} @dots{} @code{\voiceFour} para +indicar las direcciones requeridas de plicas, ligaduras, etc. En +partituras más largas, este método es más claro porque permite +que las voces estén separadas y reciban nombres más descriptivos. Concretamente, la construcción @code{<< \\ >>} que usamos en la sección previa: @example \new Staff @{ - \relative c' @{ - << @{ e4 f g a @} \\ @{ c,4 d e f @} >> + \relative @{ + << @{ e'4 f g a @} \\ @{ c,4 d e f @} >> @} @} @end example @@ -1014,8 +1033,8 @@ equivale a @example \new Staff << - \new Voice = "1" @{ \voiceOne \relative c' @{ e4 f g a @} @} - \new Voice = "2" @{ \voiceTwo \relative c' @{ c4 d e f @} @} + \new Voice = "1" @{ \voiceOne \relative @{ e'4 f g a @} @} + \new Voice = "2" @{ \voiceTwo \relative @{ c'4 d e f @} @} >> @end example @@ -1024,8 +1043,8 @@ Los dos ejemplos anteriores producen: @c The following example should not display the code @lilypond[ragged-right,quote] \new Staff << - \new Voice = "1" { \voiceOne \relative c' { e4 f g a } } - \new Voice = "2" { \voiceTwo \relative c' { c4 d e f } } + \new Voice = "1" { \voiceOne \relative { e'4 f g a } } + \new Voice = "2" { \voiceTwo \relative { c'4 d e f } } >> @end lilypond @@ -1035,61 +1054,64 @@ Los dos ejemplos anteriores producen: Las instrucciones @code{\voiceXXX} establecen la dirección de las plicas, ligaduras de expresión, ligaduras de prolongación, articulaciones, anotaciones de texto, puntillos y digitaciones. -@code{\voiceOne} y @code{\voiceThree} hacen que estos objetos apunten -hacia arriba, mientras que @code{\voiceTwo} y @code{\voiceFour} los -hacen apuntar hacia abajo. Estas instrucciones también producen un -desplazamiento horizontal para cada voz cuando es necesario para -evitar choques entre las cabezas. La instrucción @code{\oneVoice} -devuelve los ajustes de nuevo a los valores normales para una sola -voz. - -Veamos en algunos ejemplos sencillos exactamente qué efecto tienen -@code{\oneVoice}, @code{\voiceOne} y @code{voiceTwo} sobre el marcado, -las ligaduras de unión y de expresión y las indicaciones de dinámica: +@code{\voiceOne} y @code{\voiceThree} hacen que estos objetos +apunten hacia arriba, mientras que @code{\voiceTwo} y +@code{\voiceFour} los hacen apuntar hacia abajo. Estas +instrucciones también producen un desplazamiento horizontal para +cada voz cuando es necesario para evitar choques entre las +cabezas. La instrucción @code{\oneVoice} devuelve los ajustes de +nuevo a los valores normales para una sola voz. + +Veamos en algunos ejemplos sencillos exactamente qué efecto +tienen @code{\oneVoice}, @code{\voiceOne} y @code{voiceTwo} sobre +el marcado, las ligaduras de unión y de expresión y las +indicaciones de dinámica: @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { % Default behavior or behavior after \oneVoice - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceOne - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceTwo - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond -A continuación veremos tres formas distintas de componer la notación -del mismo pasaje polifónico, cada una de las cuales tiene sus ventajas -según la circunstancia, utilizando el ejemplo de la sección anterior. +A continuación veremos tres formas distintas de componer la +notación del mismo pasaje polifónico, cada una de las cuales +tiene sus ventajas según la circunstancia, utilizando el ejemplo +de la sección anterior. Una expresión que aparece directamente dentro de @code{<< >>} -pertenece a la voz principal (pero, observe, @strong{no} dentro de una -construcción @code{<< \\ >>}). Esto es útil cuando aparecen voces -nuevas mientras la voz principal está sonando. A continuación podemos -ver una realización más correcta del ejemplo de la sección anterior. -Las notas rojas en forma de rombo muestran que la melodía principal -está ahora dentro de un contexto de una sola voz, haciendo que se -pueda trazar una ligadura por encima de ellas. +pertenece a la voz principal (pero, observe, @strong{no} dentro +de una construcción @code{<< \\ >>}). Esto es útil cuando +aparecen voces nuevas mientras la voz principal está sonando. A +continuación podemos ver una realización más correcta del ejemplo +de la sección anterior. Las notas rojas en forma de rombo +muestran que la melodía principal está ahora dentro de un +contexto de una sola voz, haciendo que se pueda trazar una +ligadura por encima de ellas. @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { +\new Staff \relative { \voiceOneStyle % This section is homophonic - c16^( d e f + c'16^( d e f % Start simultaneous section of three voices << % Continue the main voice in parallel @@ -1098,7 +1120,7 @@ pueda trazar una ligadura por encima de ellas. \new Voice { % Set stems, etc., down \voiceTwo - r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1116,20 +1138,20 @@ pueda trazar una ligadura por encima de ellas. @cindex voces temporales @cindex voces, anidado de -Son posibles construcciones polifónicas anidadas más profundamente, y -si una voz aparece sólo brevemente podría haber una forma más natural -de tipografiar la música. +Son posibles construcciones polifónicas anidadas más +profundamente, y si una voz aparece sólo brevemente podría haber +una forma más natural de tipografiar la música. @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { - c16^( d e f +\new Staff \relative { + c'16^( d e f << { g4 f e | d2 e) | } \new Voice { \voiceTwo r8 e4 d c8~ | << - { c8 b16 a b8 g~ g2 | } + { c8 b16 a b8 g~ 2 | } \new Voice { \voiceThree s4 b c2 | @@ -1142,24 +1164,25 @@ de tipografiar la música. @cindex espaciadoras, notas -Este método de anidar voces nuevas brevemente es útil cuando sólo hay -secciones polifónicas pequeñas, pero cuando todo el pentagrama es muy -polifónico podría ser más claro usar varias voces todo el tiempo, -usando notas espaciadoras para pasar por encima de las secciones en -que una voz está en silencio, como aquí: +Este método de anidar voces nuevas brevemente es útil cuando sólo +hay secciones polifónicas pequeñas, pero cuando todo el +pentagrama es muy polifónico podría ser más claro usar varias +voces todo el tiempo, usando notas espaciadoras para pasar por +encima de las secciones en que una voz está en silencio, como +aquí: @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' << +\new Staff \relative << % Initiate first voice \new Voice { \voiceOne - c16^( d e f g4 f e | d2 e) | + c'16^( d e f g4 f e | d2 e) | } % Initiate second voice \new Voice { % Set stems, etc, down \voiceTwo - s4 r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + s4 r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1177,46 +1200,46 @@ que una voz está en silencio, como aquí: @cindex notas, colisiones de @cindex desplazamiento, instrucciones de @funindex \shiftOff -@funindex shiftOff @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn - -Las notas cercanas de un acorde, o las notas que se producen al mismo -tiempo en distintas voces, se disponen en dos (y ocasionalmente más) -columnas para evitar el solapamiento de las cabezas. Reciben el -nombre de columnas de notas. Hay columnas distintas para cada voz, y -el desplazamiento especificado en curso dependiente de la voz se -aplica a la columna de la nota si en caso contrario se produjese una -colisión. Esto se puede ver en el ejemplo anterior. En el compás 2 el -Do en la voz dos está desplazado a la derecha respecto del Re de la -voz uno, y en el último acorde el Do de la voz tres también está -desplazado a la derecha respecto de las otras notas. - -Las instrucciones @code{\shiftOn}, @code{\shiftOnn}, @code{\shiftOnnn} -y @code{\shiftOff} especifican el grado en que se deben desplazar las -notas y acordes de la voz si en caso contrario ocurriese una -colisión. De forma predeterminada, las voces exteriores (normalmente -las voces uno y dos) llevan especificado @code{\shiftOff}, mientras -que las voces interiores (tres y cuatro) tienen @code{\shiftOn} -especificado. Cuando se aplica un desplazamiento, las voces uno y -tres se desplazan hacia la derecha y las voces dos y cuatro se -desplazan hacia la izquierda. - -@code{\shiftOnn} y @code{\shiftOnnn} definen niveles adicionales de -desplazamiento que se pueden especificar temporalmente para resolver -colisiones en situaciones complejas (véase @ref{Ejemplos reales de música}). - -Una columna de notas puede contener sólo una nota (o acorde) de una -voz con las plicas hacia arriba y una not (o acorde) de una voz con -las plicas hacia abajo. Si las notas de dos voces que tienen las -plicas en la misma dirección se sitúan en la misma posición y las dos -voces no tienen ningún desplazamiento o llevan especificado el mismo -desplazamiento, se producirá el mensaje de error @qq{Chocan demasiadas -columnas de notas}. + +Las notas cercanas de un acorde, o las notas que se producen al +mismo tiempo en distintas voces, se disponen en dos (y +ocasionalmente más) columnas para evitar el solapamiento de las +cabezas. Reciben el nombre de columnas de notas. Hay columnas +distintas para cada voz, y el desplazamiento especificado en +curso dependiente de la voz se aplica a la columna de la nota si +en caso contrario se produjese una colisión. Esto se puede ver +en el ejemplo anterior. En el compás 2 el Do en la voz dos está +desplazado a la derecha respecto del Re de la voz uno, y en el +último acorde el Do de la voz tres también está desplazado a la +derecha respecto de las otras notas. + +Las instrucciones @code{\shiftOn}, @code{\shiftOnn}, +@code{\shiftOnnn} y @code{\shiftOff} especifican el grado en que +se deben desplazar las notas y acordes de la voz si en caso +contrario ocurriese una colisión. De forma predeterminada, las +voces exteriores (normalmente las voces uno y dos) llevan +especificado @code{\shiftOff}, mientras que las voces interiores +(tres y cuatro) tienen @code{\shiftOn} especificado. Cuando se +aplica un desplazamiento, las voces uno y tres se desplazan hacia +la derecha y las voces dos y cuatro se desplazan hacia la +izquierda. + +@code{\shiftOnn} y @code{\shiftOnnn} definen niveles adicionales +de desplazamiento que se pueden especificar temporalmente para +resolver colisiones en situaciones complejas (véase +@ref{Ejemplos reales de música}). + +Una columna de notas puede contener sólo una nota (o acorde) de +una voz con las plicas hacia arriba y una not (o acorde) de una +voz con las plicas hacia abajo. Si las notas de dos voces que +tienen las plicas en la misma dirección se sitúan en la misma +posición y las dos voces no tienen ningún desplazamiento o llevan +especificado el mismo desplazamiento, se producirá el mensaje de +error @qq{Esta voz requiere un ajuste de @code{@bs{}voiceXx} o +@code{@bs{}shiftXx}}. @seealso @@ -1232,12 +1255,11 @@ Referencia de la notación: @translationof Voices and vocals -La música vocal presenta una dificultad especial: tenemos que combinar -dos expresiones, a saber, las notas y la letra. +La música vocal presenta una dificultad especial: tenemos que +combinar dos expresiones, a saber, las notas y la letra. @funindex \new Lyrics @funindex \lyricsto -@funindex lyricsto @funindex Lyrics @cindex Lyrics, creación de un contexto @cindex letra, creación de un contexto de @@ -1245,18 +1267,18 @@ dos expresiones, a saber, las notas y la letra. Ya ha visto la instrucción @code{\addlyrics@{@}}, que maneja bien partituras sencillas. Sin embargo esta técnica es algo limitada. -Para música de mayor complejidad, tenemos que introducir la letra en -un contexto @code{Lyrics} utilizando @code{\new Lyrics} y enlazar -explícitamente la letra y las notas mediante @code{\lyricsto@{@}}, -usando el nombre asignado a la voz. +Para música de mayor complejidad, tenemos que introducir la letra +en un contexto @code{Lyrics} utilizando @code{\new Lyrics} y +enlazar explícitamente la letra y las notas mediante +@code{\lyricsto@{@}}, usando el nombre asignado a la voz. @lilypond[quote,verbatim] << \new Voice = "one" { - \relative c'' { + \relative { \autoBeamOff \time 2/4 - c4 b8. a16 | g4. f8 | e4 d | c2 | + c''4 b8. a16 | g4. f8 | e4 d | c2 | } } \new Lyrics \lyricsto "one" { @@ -1265,49 +1287,47 @@ usando el nombre asignado a la voz. >> @end lilypond -Observe que la letra se debe enlazar a un contexto de @code{Voice}, -@emph{no} a un contexto de @code{Staff}. Este es un caso en que es -necesario crear contextos de @code{Staff} y de @code{Voice} -explícitamente. +Observe que la letra se debe enlazar a un contexto de +@code{Voice}, @emph{no} a un contexto de @code{Staff}. Este es +un caso en que es necesario crear contextos de @code{Staff} y de +@code{Voice} explícitamente. @cindex letra y barrado @cindex barrado y letra @funindex \autoBeamOff -@funindex autoBeamOff El barrado automático que LilyPond usa de forma predeterminada funciona bien para la música instrumental, pero no tan bien para -música con letra, donde o bien el barrado no se necesita en absoluto, -o bien se utiliza para indicar los melismas de la letra. En el -ejemplo anterior hemos utilizado la instrucción @code{\autoBeamOff} -para desactivar el barrado automático. +música con letra, donde o bien el barrado no se necesita en +absoluto, o bien se utiliza para indicar los melismas de la +letra. En el ejemplo anterior hemos utilizado la instrucción +@code{\autoBeamOff} para desactivar el barrado automático. @funindex \new ChoirStaff @funindex ChoirStaff @funindex \lyricmode -@funindex lyricmode @cindex vocal, estructura de una partitura @cindex coro, sistema de -Ahora vamos a reutilizar el ejemplo anterior de «Judas Macabeo» para -ilustrar esta técnica más flexible. Primero la reescribiremos para -que use variables, de manera que la música y la letra se puedan -separar de la estructura de pentagramas. También introduciremos una -llave de grupo de ChoirStaff. La letra en sí se debe introducir con -@code{\lyricmode} para estar seguros de que se interpreta como letra y -no como música. +Ahora vamos a reutilizar el ejemplo anterior de «Judas Macabeo» +para ilustrar esta técnica más flexible. Primero la +reescribiremos para que use variables, de manera que la música y +la letra se puedan separar de la estructura de pentagramas. +También introduciremos una llave de grupo de ChoirStaff. La +letra en sí se debe introducir con @code{\lyricmode} para estar +seguros de que se interpreta como letra y no como música. @lilypond[quote,verbatim] global = { \key f \major \time 6/8 \partial 8 } -SopOneMusic = \relative c'' { - c8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ c4 +SopOneMusic = \relative { + c''8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ 4 } SopOneLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, __ } -SopTwoMusic = \relative c' { - r8 | r4. r4 c8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' +SopTwoMusic = \relative { + r8 | r4. r4 c'8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' } SopTwoLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, @@ -1338,10 +1358,10 @@ SopTwoLyrics = \lyricmode { @end lilypond Ésta es la estructura básica de todas las partituras vocales. Se -pueden añadir más pentagramas según se necesite, se pueden añadir más -voces a los pentagramas y más estrofas a la letra, y las variables que -contienen la música se pueden colocar fácilmente en archivos separados -cuando se hagan demasiado largos. +pueden añadir más pentagramas según se necesite, se pueden añadir +más voces a los pentagramas y más estrofas a la letra, y las +variables que contienen la música se pueden colocar fácilmente en +archivos separados cuando se hagan demasiado largos. @cindex himno, estructura de @cindex SATB, estructura de @@ -1349,24 +1369,25 @@ cuando se hagan demasiado largos. @cindex varias estrofas vocales @cindex estrofas, varias, vocales -A continuación podemos ver un ejemplo final de la primera línea de un -himno con cuatro estrofas, para coro SATB. En este caso la letra de -las cuatro partes es la misma. Observe cómo utilizamos variables para -separar la notación musical de la estructura de pentagramas. Observe -también cómo se utiliza una variable, para la que hemos elegido el -nombre @q{TimeKey} («compás y tonalidad»), para que contenga varias -instrucciones que se usarán dentro de los dos pentagramas. En otros -ejemplos se le suele dar el nombre de @q{global}. +A continuación podemos ver un ejemplo final de la primera línea +de un himno con cuatro estrofas, para coro SATB. En este caso la +letra de las cuatro partes es la misma. Observe cómo utilizamos +variables para separar la notación musical de la estructura de +pentagramas. Observe también cómo se utiliza una variable, para +la que hemos elegido el nombre @q{TimeKey} («compás y +tonalidad»), para que contenga varias instrucciones que se usarán +dentro de los dos pentagramas. En otros ejemplos se le suele dar +el nombre de @q{global}. @lilypond[quote,verbatim] keyTime = { \key c \major \time 4/4 \partial 4 } -SopMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyricmode { E -- | ter -- nal fa -- ther, | strong to save, } @@ -1407,10 +1428,10 @@ Referencia de la notación: @section Contextos y grabadores @translationof Contexts and engravers -Los contextos y grabadores se han mencionado de manera informal en -secciones anteriores; ahora tan sólo vamos a ver estos conceptos con -más detalle, pues son importantes en el ajuste fino de la salida de -LilyPond. +Los contextos y grabadores se han mencionado de manera informal +en secciones anteriores; ahora tan sólo vamos a ver estos +conceptos con más detalle, pues son importantes en el ajuste fino +de la salida de LilyPond. @menu * Explicación de los contextos:: @@ -1426,75 +1447,78 @@ LilyPond. @cindex contextos, explicación de los -Cuando se imprime la música, se tienen que añadir a la salida una gran -cantidad de elementos notacionales que no aparecen explícitamente en -el archivo de entrada. Por ejemplo, compare la entrada y la salida -del siguiente ejemplo: +Cuando se imprime la música, se tienen que añadir a la salida una +gran cantidad de elementos notacionales que no aparecen +explícitamente en el archivo de entrada. Por ejemplo, compare la +entrada y la salida del siguiente ejemplo: -@lilypond[quote,verbatim,relative=2] -cis4 cis2. | a4 a2. | +@lilypond[quote,verbatim] +\relative { cis''4 cis2. | a4 a2. | } @end lilypond -La entrada es bastante escueta, pero en la salida se han añadido las -líneas divisorias, las alteraciones, la clave y la armadura de la -tonalidad. Cuando LilyPond @emph{interpreta} la entrada, la -información musical se analiza de izquierda a derecha de igual forma -que un intérprete lee la partitura. Mientras se lee el código de -entrada, el programa recuerda dónde están los límites de los compases, -y qué alturas requieren alteraciones accidentales explícitas. Esta -información se debe conservar a varios niveles. Por ejemplo, una -alteración accidental afecta solamente a un pentagrama, mientras que -una línea divisoria debe estar sincronizada a lo largo de todo el -sistema. - -Dentro de LilyPond, estas reglas y pequeñas porciones de información -se agrupan en @emph{Contexts}. Ya hemos visto el contexto de voz, -@code{Voice}. Otros ejemplos de contextos son @code{Staff} (Pauta o -pentagrama) y @code{Score} (Partitura). Los contextos son -jerárquicos, de forma que reflejan la naturaleza jerárquica de una -partitura musical. Por ejemplo: un contexto de @code{Staff} contener -muchos contextos de @code{Voice}, y un contexto de @code{Score} puede -contener muchos contextos de @code{Staff}. +La entrada es bastante escueta, pero en la salida se han añadido +las líneas divisorias, las alteraciones, la clave y la armadura +de la tonalidad. Cuando LilyPond @emph{interpreta} la entrada, +la información musical se analiza de izquierda a derecha de igual +forma que un intérprete lee la partitura. Mientras se lee el +código de entrada, el programa recuerda dónde están los límites +de los compases, y qué alturas requieren alteraciones +accidentales explícitas. Esta información se debe conservar a +varios niveles. Por ejemplo, una alteración accidental afecta +solamente a un pentagrama, mientras que una línea divisoria debe +estar sincronizada a lo largo de todo el sistema. + +Dentro de LilyPond, estas reglas y pequeñas porciones de +información se agrupan en @emph{Contexts}. Ya hemos visto el +contexto de voz, @code{Voice}. Otros ejemplos de contextos son +@code{Staff} (Pauta o pentagrama) y @code{Score} (Partitura). +Los contextos son jerárquicos, de forma que reflejan la +naturaleza jerárquica de una partitura musical. Por ejemplo: un +contexto de @code{Staff} contener muchos contextos de +@code{Voice}, y un contexto de @code{Score} puede contener muchos +contextos de @code{Staff}. @quotation @sourceimage{context-example,5cm,,} @end quotation -Cada contexto asume la responsabilidad de imponer algunas reglas de -notación, creando ciertos objetos de notación y manteniendo las -propiedades asociadas. Por ejemplo, el contexto @code{Voice} puede -introducir una alteración accidental y entonces el contexto -@code{Staff} mantiene la regla de mostrar o suprimir la alteración -para el resto del compás. - -Otro ejemplo lo constituye el hecho de que la sincronización de las -líneas divisorias se gestiona dentro del contexto de la partitura, -@code{Score}, de forma predeterminada. Sin embargo, en algunas -músicas posiblemente no queramos que las líneas divisorias estén -sincronizadas (pensemos en una partitura polimétrica en compases de -4/4 y de 3/4). En tales casos, debemos modificar los ajustes por -omisión de los contextos @code{Score} y @code{Staff}. - -Para partituras muy sencillas, los contextos se crean implícitamente y -no debemos preocuparnos por ellos. Para piezas mayores, como por -ejemplo cualquiera que tenga más de un pentagrama, los contextos se -deben crear explícitamente para asegurarnos de que tendremos la -cantidad exacta de pentagramas que necesitamos, y que están en el -orden correcto. Para tipografiar piezas con notación especializada, -es frecuente la modificación de contextos existentes o incluso definir -unos completamente nuevos. - - -Además de los contextos @code{Score,} @code{Staff} y @code{Voice}, hay -contextos que se sitúan entre los niveles de partitura y de pentagrama -para controlar los grupos de pentagramas, como los contextos -@code{PianoStaff} y @code{ChoirStaff}. También existen contextos -alternativos de pentagrama y de voz, y contextos para la letra, la -percusión, diagramas de trastes, bajo cifrado, etc. - -Los nombres de todos los tipos de contextos se componen de una o más -palabras que comienzan con mayúscula y que están unidas unas a otras -sin guión ni barra baja, por ejemplo: +Cada contexto asume la responsabilidad de imponer algunas reglas +de notación, creando ciertos objetos de notación y manteniendo +las propiedades asociadas. Por ejemplo, el contexto @code{Voice} +puede introducir una alteración accidental y entonces el contexto +@code{Staff} mantiene la regla de mostrar o suprimir la +alteración para el resto del compás. + +Otro ejemplo lo constituye el hecho de que la sincronización de +las líneas divisorias se gestiona dentro del contexto de la +partitura, @code{Score}, de forma predeterminada. Sin embargo, +en algunas músicas posiblemente no queramos que las líneas +divisorias estén sincronizadas (pensemos en una partitura +polimétrica en compases de 4/4 y de 3/4). En tales casos, +debemos modificar los ajustes por omisión de los contextos +@code{Score} y @code{Staff}. + +Para partituras muy sencillas, los contextos se crean +implícitamente y no debemos preocuparnos por ellos. Para piezas +mayores, como por ejemplo cualquiera que tenga más de un +pentagrama, los contextos se deben crear explícitamente para +asegurarnos de que tendremos la cantidad exacta de pentagramas +que necesitamos, y que están en el orden correcto. Para +tipografiar piezas con notación especializada, es frecuente la +modificación de contextos existentes o incluso definir unos +completamente nuevos. + +Además de los contextos @code{Score,} @code{Staff} y +@code{Voice}, hay contextos que se sitúan entre los niveles de +partitura y de pentagrama para controlar los grupos de +pentagramas, como los contextos @code{PianoStaff} y +@code{ChoirStaff}. También existen contextos alternativos de +pentagrama y de voz, y contextos para la letra, la percusión, +diagramas de trastes, bajo cifrado, etc. + +Los nombres de todos los tipos de contextos se componen de una o +más palabras que comienzan con mayúscula y que están unidas unas +a otras sin guión ni barra baja, por ejemplo: @code{GregorianTranscriptionStaff}. @@ -1508,23 +1532,23 @@ Referencia de la notación: @translationof Creating contexts @funindex \new -@funindex new @cindex nuevos contextos @cindex creación de contextos @cindex contextos, creación de En un archivo de entrada, el bloque de partitura, que se presenta precedido por la instrucción @code{\score}, contiene una sola -expresión musical y una definición de salida asociada (bien un bloque -@code{\layout} o bien un bloque @code{\midi}). El contexto -@code{Score} se suele dejar que se cree automáticamente cuando -comienza la interpretación de esa expresión musical. - -Para partituras que solamente tienen una voz y un pentagrama, podemos -también dejar que los contextos @code{Voice} y @code{Staff} se creen -automáticamente, pero para partituras más complejas es necesario -crearlos a mano. La instrucción más simple que hace esto es -@code{\new}. Se antepone a una expresión musical, por ejemplo +expresión musical y una definición de salida asociada (bien un +bloque @code{\layout} o bien un bloque @code{\midi}). El +contexto @code{Score} se suele dejar que se cree automáticamente +cuando comienza la interpretación de esa expresión musical. + +Para partituras que solamente tienen una voz y un pentagrama, +podemos también dejar que los contextos @code{Voice} y +@code{Staff} se creen automáticamente, pero para partituras más +complejas es necesario crearlos a mano. La instrucción más +simple que hace esto es @code{\new}. Se antepone a una expresión +musical, por ejemplo @example \new @var{tipo} @var{expresión_musical} @@ -1532,22 +1556,23 @@ crearlos a mano. La instrucción más simple que hace esto es @noindent donde @var{tipo} es el nombre de un contexto (como @code{Staff} o -@code{Voice}). Esta instrucción crea un contexto nuevo, y comienza a -interpretar la @var{expresión_musical} que está dentro de ese -contexto. +@code{Voice}). Esta instrucción crea un contexto nuevo, y +comienza a interpretar la @var{expresión_musical} que está dentro +de ese contexto. @warning{No se debe usar @bs{}@code{new Score} porque el contexto -@code{Score} esencial del nivel superior ya se crea automáticamente al -interpretarse la expresión musical que está dentro del bloque -@bs{}@code{score}. Los valores predeterminados de propiedades de -contexto válidos para toda la partitura se pueden cambiar dentro del -bloque @bs{}@code{layout}. Véase @ref{Modificar las propiedades de -los contextos}.} - -En las secciones anteriores ha podido ver muchos ejemplos prácticos que -creaban nuevos contextos de @code{Staff} y de @code{Voice}, pero para -recordarle cómo se emplean estas instrucciones en la práctica, he aquí -un ejemplo anotado de música real: +@code{Score} esencial del nivel superior ya se crea +automáticamente al interpretarse la expresión musical que está +dentro del bloque @bs{}@code{score}. Los valores predeterminados +de propiedades de contexto válidos para toda la partitura se +pueden cambiar dentro del bloque @bs{}@code{layout}. Véase +@ref{Modificar las propiedades de los contextos}.} + +En las secciones anteriores ha podido ver muchos ejemplos +prácticos que creaban nuevos contextos de @code{Staff} y de +@code{Voice}, pero para recordarle cómo se emplean estas +instrucciones en la práctica, he aquí un ejemplo anotado de +música real: @lilypond[quote,verbatim,ragged-right] \score { % start of single compound music expression @@ -1557,8 +1582,8 @@ un ejemplo anotado de música real: \clef "treble" \key g \minor \new Voice { % create voice for RH notes - \relative c'' { % start of RH notes - d4 ees16 c8. | + \relative { % start of RH notes + d''4 ees16 c8. | d4 ees16 c8. | } % end of RH notes } % end of RH voice @@ -1568,14 +1593,14 @@ un ejemplo anotado de música real: \key g \minor \new Voice { % create LH voice one \voiceOne - \relative g { % start of LH voice one notes + \relative { % start of LH voice one notes g8 ees, | g8 ees, | } % end of LH voice one notes } % end of LH voice one \new Voice { % create LH voice two \voiceTwo - \relative g { % start of LH voice two notes + \relative { % start of LH voice two notes g4 ees | g4 ees | } % end of LH voice two notes @@ -1587,38 +1612,40 @@ un ejemplo anotado de música real: (Observe cómo todas las instrucciones que abren un bloque con una llave curva, @code{@{}, o con ángulos dobles, @code{<<}, están -sangrados (tienen un margen adicional) con dos espacios adicionales, y -la llave de cierre correspondiente tiene un margen exactamente igual. -Aunque no es necesario, la observancia de esta práctica reducirá -considerablemente el número de errores de @q{paréntesis -descompensados}, y se recomienda vivamente. Permite apreciar de un -solo vistazo la estructura de la música, y cualquier paréntesis -descompensado aparecerá con obviedad. Observe también cómo el -pentagrama de la MI se crea usando dobles ángulos porque requiere dos -voces, mientras que el pentagrama de la MD se crea con una expresión -musical única encerrada entre llaves porque sólo requiere una voz.) +sangrados (tienen un margen adicional) con dos espacios +adicionales, y la llave de cierre correspondiente tiene un margen +exactamente igual. Aunque no es necesario, la observancia de +esta práctica reducirá considerablemente el número de errores de +@q{paréntesis descompensados}, y se recomienda vivamente. +Permite apreciar de un solo vistazo la estructura de la música, y +cualquier paréntesis descompensado aparecerá con obviedad. +Observe también cómo el pentagrama de la MI se crea usando dobles +ángulos porque requiere dos voces, mientras que el pentagrama de +la MD se crea con una expresión musical única encerrada entre +llaves porque sólo requiere una voz.) @cindex contextos, nombrado @cindex nombrar contextos La instrucción @code{\new} también puede otorgar un nombre -identificativo al contexto para distinguirlo de otros contextos del -mismo tipo: +identificativo al contexto para distinguirlo de otros contextos +del mismo tipo: @example \new @var{tipo} = @var{identificador} @var{expresión_musical} @end example Observe la distinción entre el nombre del tipo de contexto, -@code{Staff}, @code{Voice}, etc., y el nombre identificativo de una -instancia en particular de ese tipo, que puede ser cualquier secuencia -de letras inventada por el usuario. En el nombre identificativo -también se pueden utilizar dígitos y espacios, pero en este caso aquél -debe ir entre comillas p.ej. @code{\new Staff = "MiPentagrama 1" -@var{expresión_musical}}. El nombre identificativo se utiliza para -referirnos más tarde a esa instancia en particular de un contexto. -Hemos visto esto en la sección acerca de la letra, en @ref{Voces y música vocal}. +@code{Staff}, @code{Voice}, etc., y el nombre identificativo de +una instancia en particular de ese tipo, que puede ser cualquier +secuencia de letras inventada por el usuario. En el nombre +identificativo también se pueden utilizar dígitos y espacios, +pero en este caso aquél debe ir entre comillas p.ej. @code{\new +Staff = "MiPentagrama 1" @var{expresión_musical}}. El nombre +identificativo se utiliza para referirnos más tarde a esa +instancia en particular de un contexto. Hemos visto esto en la +sección acerca de la letra, en @ref{Voces y música vocal}. @seealso @@ -1632,47 +1659,50 @@ Referencia de la notación: @cindex grabadores -Todas y cada una de las marcas de la salida impresa de una partitura -hecha con LilyPond está producida por un @code{Engraver} (grabador). -Así, tenemos un grabador para imprimir pentagramas, otro para imprimir -las cabezas de las notas, otro para las plicas, otro para las barras, -etc, etc. ¡En total hay más de 120 grabadores! Afortunadamente, para -la mayor parte de las partituras no es necesario conocer más que -algunos, y para partituras sencillas no tenemos que saber nada de -ninguno de ellos. - -Los grabadores residen y operan dentro de Contextos. Los grabadores -como el grabador de la indicación metronómica, -@code{Metronome_mark_engraver}, cuya acción y resultado se aplican a -la partitura como un todo, operan en el contexto del nivel más alto: -el contexto de partitura @code{Score}. +Todas y cada una de las marcas de la salida impresa de una +partitura hecha con LilyPond está producida por un +@code{Engraver} (grabador). Así, tenemos un grabador para +imprimir pentagramas, otro para imprimir las cabezas de las +notas, otro para las plicas, otro para las barras, etc, etc. ¡En +total hay más de 120 grabadores! Afortunadamente, para la mayor +parte de las partituras no es necesario conocer más que algunos, +y para partituras sencillas no tenemos que saber nada de ninguno +de ellos. + +Los grabadores residen y operan dentro de Contextos. Los +grabadores como el grabador de la indicación metronómica, +@code{Metronome_mark_engraver}, cuya acción y resultado se +aplican a la partitura como un todo, operan en el contexto del +nivel más alto: el contexto de partitura @code{Score}. El grabador de la clave @code{Clef_engraver} y el de la armadura -@code{Key_engraver} se encuentran probablemente en todos los contextos -de pentagrama (@code{Staff}), pues los distintos pentagramas podrían -requerir diferentes claves y armaduras. +@code{Key_engraver} se encuentran probablemente en todos los +contextos de pentagrama (@code{Staff}), pues los distintos +pentagramas podrían requerir diferentes claves y armaduras. -El grabador de las cabezas de nota @code{Note_heads_engraver} y el de -las plicas @code{Stem_engraver} viven en cada uno de los contextos de -voz @code{Voice}, el contexto de nivel más bajo de todos. +El grabador de las cabezas de nota @code{Note_heads_engraver} y +el de las plicas @code{Stem_engraver} viven en cada uno de los +contextos de voz @code{Voice}, el contexto de nivel más bajo de +todos. Cada grabador procesa los objetos particulares asociados con su -función, y mantiene las propiedades que están relacionadas con dicha -función. Estas propiedades, como las que están asociadas con los -contextos, se pueden modificar para cambiar el funcionamiento del -grabador o el aspecto de esos elementos en la partitura impresa. - -Todos los grabadores tienen nombres compuestos de varias palabras que -describen su función. Sólo está en mayúsculas la inicial de la -primera palabra, y el resto se le une mediante guiones bajos. Así, el -grabador @code{Staff_symbol_engraver} es responsable de la creación de -las líneas del pentagrama, y el @code{Clef_engraver} determina y -establece la altura o el punto de referencia sobre el pentagrama -dibujando un símbolo de clave. +función, y mantiene las propiedades que están relacionadas con +dicha función. Estas propiedades, como las que están asociadas +con los contextos, se pueden modificar para cambiar el +funcionamiento del grabador o el aspecto de esos elementos en la +partitura impresa. + +Todos los grabadores tienen nombres compuestos de varias palabras +que describen su función. Sólo está en mayúsculas la inicial de +la primera palabra, y el resto se le une mediante guiones bajos. +Así, el grabador @code{Staff_symbol_engraver} es responsable de +la creación de las líneas del pentagrama, y el +@code{Clef_engraver} determina y establece la altura o el punto +de referencia sobre el pentagrama dibujando un símbolo de clave. A continuación presentamos algunos de los grabadores más comunes, -junto a su función. Podrá comprobar que es fácil adivinar la función -a partir del nombre (en inglés), y viceversa. +junto a su función. Podrá comprobar que es fácil adivinar la +función a partir del nombre (en inglés), y viceversa. @multitable @columnfractions .3 .7 @headitem Grabador @@ -1724,29 +1754,28 @@ Referencia de funcionamiento interno: @cindex contexto, propiedades de, modificación @cindex modificar las propiedades de contexto @funindex \set -@funindex set @funindex \unset -@funindex unset -Los contextos se responsabilizan de mantener los valores de un cierto -número de @emph{properties} de contexto. Muchas de ellas se pueden -cambiar para influir en la interpretación del código de entrada y -cambiar así la apariencia de la salida impresa. Se modifican mediante -la instrucción @code{\set}. Esta instrucción toma la forma siguiente: +Los contextos se responsabilizan de mantener los valores de un +cierto número de @emph{properties} de contexto. Muchas de ellas +se pueden cambiar para influir en la interpretación del código de +entrada y cambiar así la apariencia de la salida impresa. Se +modifican mediante la instrucción @code{\set}. Esta instrucción +toma la forma siguiente: @example \set @emph{NombreDelContexto}.@emph{nombreDeLaPropiedad} = #@emph{valor} @end example Donde el @emph{NombreDelContexto} es normalmente @code{Score}, -@code{Staff} o @code{Voice}. Se puede omitir, en cuyo caso se supone -que es el contexto en curso (normalmente @code{Voice}). +@code{Staff} o @code{Voice}. Se puede omitir, en cuyo caso se +supone que es el contexto en curso (normalmente @code{Voice}). Los nombres de las propiedades de contexto consisten en palabras unidas sin ningún guión o barra baja, y donde todas las palabras -excepto la primera empiezan en mayúscula. A continuación podemos ver -algunos ejemplos de nombres de propiedades utilizadas con frecuencia. -Hay muchas más que las que se muestran aquí. +excepto la primera empiezan en mayúscula. A continuación podemos +ver algunos ejemplos de nombres de propiedades utilizadas con +frecuencia. Hay muchas más que las que se muestran aquí. @c attempt to force this onto a new page @need 50 @@ -1783,85 +1812,88 @@ Hay muchas más que las que se muestran aquí. @noindent donde un valor Booleano es verdadero (@code{#t}, True) o falso -(@code{#f}, False), un Entero es un número entero positivo, un número -Real es un número decimal positivo o negativo, y el texto se encierra -entre comillas dobles. Observe la aparición de signos de cuadradillo, -(@code{#}), en dos lugares diferentes: como parte del valor Booleano -antes de la @code{t} o la @code{f}, y antes del @emph{valor} dentro de -la sentencia @code{\set}. Así pues, cuando se está escribiendo un -valor Booleano, hay que escribir dos signos de cuadradillo, por -ejemplo: @code{##t}. +(@code{#f}, False), un Entero es un número entero positivo, un +número Real es un número decimal positivo o negativo, y el texto +se encierra entre comillas dobles. Observe la aparición de +signos de cuadradillo, (@code{#}), en dos lugares diferentes: +como parte del valor Booleano antes de la @code{t} o la @code{f}, +y antes del @emph{valor} dentro de la sentencia @code{\set}. Así +pues, cuando se está escribiendo un valor Booleano, hay que +escribir dos signos de cuadradillo, por ejemplo: @code{##t}. @cindex propiedades que funcionan en contextos @cindex establecer propiedades en contextos -Antes de poder establecer cualquiera de estas propiedades, tenemos que -saber en qué contexto operan. A veces es algo obvio, pero en -ocasiones puede ser algo enrevesado. Si especificamos un contexto -equivocado, no se produce ningún mensaje de error, pero el -funcionamiento esperado no tendrá lugar. Por ejemplo, la propiedad -@code{instrumentName} (nombre del instrumento) vive claramente dentro -del contexto de @code{Staff}, puesto que es el pentagrama el que debe -ser nombrado. En este ejemplo, el primer pentagrama resulta -etiquetado, pero no el segundo, porque hemos omitido el nombre del -contexto. +Antes de poder establecer cualquiera de estas propiedades, +tenemos que saber en qué contexto operan. A veces es algo obvio, +pero en ocasiones puede ser algo enrevesado. Si especificamos un +contexto equivocado, no se produce ningún mensaje de error, pero +el funcionamiento esperado no tendrá lugar. Por ejemplo, la +propiedad @code{instrumentName} (nombre del instrumento) vive +claramente dentro del contexto de @code{Staff}, puesto que es el +pentagrama el que debe ser nombrado. En este ejemplo, el primer +pentagrama resulta etiquetado, pero no el segundo, porque hemos +omitido el nombre del contexto. @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { + \new Staff \relative { \set Staff.instrumentName = #"Soprano" - c2 c + c''2 c } - \new Staff \relative c' { + \new Staff \relative { \set instrumentName = #"Alto" % Wrong! - d2 d + d'2 d } >> @end lilypond -Recuerde que el nombre del contexto predeterminado es @code{Voice}, -así que la segunda instrucción @code{\set} establece la propiedad -@code{instrumentName} del contexto @code{Voice} a @qq{Alto}, pero como -LilyPond no busca esta propiedad en el contexto @code{Voice}, no se -realiza ninguna acción. Esto no es un error, y no se registra ningún -mensaje en el archivo Log de registro de errores. - -De forma parecida, si el nombre de la propiedad se escribe con alguna -falta, no se produce ningún mensaje de error, y claramente la acción -esperada no puede tener lugar. De hecho, se puede establecer -cualquier @q{property} (ficticia) usando cualquier nombre que queramos -en cualquier contexto que exista, mediante el uso de la instrucción -@code{\set}. Pero si el nombre no es conocido para LilyPond, no -producirá ninguna acción. Algunos editores de texto que apoyan a los -archivos de entrada de LilyPond de manera especial, documentan los -nombres de propiedades con viñetas cuando pasamos sobre ellos con el -puntero del ratón, como JEdit con la extensión LilyPondTool, o -resaltan los nombres de propiedades desconocidas de manera diferente, -como ConTEXT. Si no se utiliza un editor con tales posibilidades, se -recomienda comprobar la corrección del nombre de la propiedad en el -manual de Referencia de funcionamiento interno: véase +Recuerde que el nombre del contexto predeterminado es +@code{Voice}, así que la segunda instrucción @code{\set} +establece la propiedad @code{instrumentName} del contexto +@code{Voice} a @qq{Alto}, pero como LilyPond no busca esta +propiedad en el contexto @code{Voice}, no se realiza ninguna +acción. Esto no es un error, y no se registra ningún mensaje en +el archivo Log de registro de errores. + +De forma parecida, si el nombre de la propiedad se escribe con +alguna falta, no se produce ningún mensaje de error, y claramente +la acción esperada no puede tener lugar. De hecho, se puede +establecer cualquier @q{property} (ficticia) usando cualquier +nombre que queramos en cualquier contexto que exista, mediante el +uso de la instrucción @code{\set}. Pero si el nombre no es +conocido para LilyPond, no producirá ninguna acción. Algunos +editores de texto que apoyan a los archivos de entrada de +LilyPond de manera especial, documentan los nombres de +propiedades con viñetas cuando pasamos sobre ellos con el puntero +del ratón, como JEdit con la extensión LilyPondTool, o resaltan +los nombres de propiedades desconocidas de manera diferente, como +ConTEXT. Si no se utiliza un editor con tales posibilidades, se +recomienda comprobar la corrección del nombre de la propiedad en +el manual de Referencia de funcionamiento interno: véase @rinternals{Tunable context properties} o @rinternals{Contexts}. La propiedad @code{instrumentName} tendrá efecto solamente si se -establece dentro del contexto @code{Staff}, pero algunas propiedades -se pueden establecer en más de un contexto. Por ejemplo, la propiedad -@code{extraNatural} está establecida por defecto al valor @code{##t} -(verdadero) para todos los pentagramas. Si se establece a @code{##f} -(falso) en un contexto de @code{Staff} determinado, se aplicará -solamente a las alteraciones de ese pentagrama. Si se establece a -falso en el contexto de la partitura, @code{Score}, se aplicará a -todos los pentagramas. +establece dentro del contexto @code{Staff}, pero algunas +propiedades se pueden establecer en más de un contexto. Por +ejemplo, la propiedad @code{extraNatural} está establecida por +defecto al valor @code{##t} (verdadero) para todos los +pentagramas. Si se establece a @code{##f} (falso) en un contexto +de @code{Staff} determinado, se aplicará solamente a las +alteraciones de ese pentagrama. Si se establece a falso en el +contexto de la partitura, @code{Score}, se aplicará a todos los +pentagramas. Así, esto desactivará los becuadros adicionales en un pentagrama: @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - aeses2 aes + \new Staff \relative { + aeses'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Staff.extraNatural = ##f - aeses2 aes + aeses'2 aes } >> @end lilypond @@ -1871,73 +1903,77 @@ y esto los desactivará en todos los pentagramas: @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - aeses2 aes + \new Staff \relative { + aeses'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Score.extraNatural = ##f - aeses2 aes + aeses'2 aes } >> @end lilypond -Como un ejemplo más, si se establece @code{clefTransposition} dentro del -contexto de @code{Score}, éste cambia inmediatamente el valor de la -transposición en todos los pentagramas en curso y establece un nuevo -valor predeterminado que se aplicará a todos los pentagramas. +Como un ejemplo más, si se establece @code{clefTransposition} +dentro del contexto de @code{Score}, éste cambia inmediatamente +el valor de la transposición en todos los pentagramas en curso y +establece un nuevo valor predeterminado que se aplicará a todos +los pentagramas. -La instrucción opuesta, @code{\unset}, tiene el efecto de suprimir la -propiedad del contexto, lo que ocasiona que la mayoría de las -propiedades vuelvan a su valor predeterminado. Normalmente no es -necesario el uso de @code{\unset}, pues una nueva instrucción -@code{\set} hará el ajuste deseado. +La instrucción opuesta, @code{\unset}, tiene el efecto de +suprimir la propiedad del contexto, lo que ocasiona que la +mayoría de las propiedades vuelvan a su valor predeterminado. +Normalmente no es necesario el uso de @code{\unset}, pues una +nueva instrucción @code{\set} hará el ajuste deseado. Las instrucciones @code{\set} y @code{\unset} pueden aparecer en -cualquier lugar del archivo de entrada y tendrán efecto a partir del -tiempo en que se encuentran y hasta el final de la partitura o hasta -que la propiedad se establezca de nuevo mediante @code{\set} o -@code{\unset}. Probemos a modificar el tamaño de la fuente -tipográfica, lo que afecta al tamaño de las cabezas de las notas -(entre otras cosas) varias veces. El cambio se toma a partir del -valor predeterminado, no el valor en curso. - -@lilypond[quote,verbatim,ragged-right,relative=1] -c4 d -% make note heads smaller -\set fontSize = #-4 -e4 f | -% make note heads larger -\set fontSize = #2.5 -g4 a -% return to default size -\unset fontSize -b4 c | +cualquier lugar del archivo de entrada y tendrán efecto a partir +del tiempo en que se encuentran y hasta el final de la partitura +o hasta que la propiedad se establezca de nuevo mediante +@code{\set} o @code{\unset}. Probemos a modificar el tamaño de +la fuente tipográfica, lo que afecta al tamaño de las cabezas de +las notas (entre otras cosas) varias veces. El cambio se toma a +partir del valor predeterminado, no el valor en curso. + +@lilypond[quote,verbatim,ragged-right] +\relative { + c'4 d + % make note heads smaller + \set fontSize = #-4 + e4 f | + % make note heads larger + \set fontSize = #2.5 + g4 a + % return to default size + \unset fontSize + b4 c | +} @end lilypond Hemos podido ver cómo establecer los valores de diversos tipos de -propiedad diferentes. Observe que los números enteros y reales van -siempre precedidos de un símbolo de cuadradillo, @code{#}, mientras -que un valor booleano verdadero o falso se especifica mediante -@code{##t} y @code{##f}, con dos cuadradillos. Una propiedad de texto -se debe encerrar entre comillas dobles, como antes, aunque veremos más -adelante que el texto realmente se puede especificar de una forma -mucho más general utilizando la potentísima instrucción @code{markup}. +propiedad diferentes. Observe que los números enteros y reales +van siempre precedidos de un símbolo de cuadradillo, @code{#}, +mientras que un valor booleano verdadero o falso se especifica +mediante @code{##t} y @code{##f}, con dos cuadradillos. Una +propiedad de texto se debe encerrar entre comillas dobles, como +antes, aunque veremos más adelante que el texto realmente se +puede especificar de una forma mucho más general utilizando la +potentísima instrucción @code{markup}. @subsubheading Cambiar las propiedades de un contexto con @code{\with} @funindex \with -@funindex with @cindex contexto, propiedades de, establecimiento con \with -El valor predeterminado de las propiedades de contexto se puede establecer en el momento -en que se crea el contexto. A veces esta forma de establecer el valor -de una propiedad es mucho más clara, si ha de quedar fijo durante todo -el tiempo que dure el contexto. Cuando se crea un contexto con una -instrucción @code{\new} puede ir inmediatamente seguido de un bloque -@code{\with @{ @dots{} @}} en el que se establecen los valores predeterminados de las -propiedades. Por ejemplo, si queremos suprimir la impresión de -becuadros adicionales para toda la duración de un pentagrama, podemos -escribir: +El valor predeterminado de las propiedades de contexto se puede +establecer en el momento en que se crea el contexto. A veces +esta forma de establecer el valor de una propiedad es mucho más +clara, si ha de quedar fijo durante todo el tiempo que dure el +contexto. Cuando se crea un contexto con una instrucción +@code{\new} puede ir inmediatamente seguido de un bloque +@code{\with @{ @dots{} @}} en el que se establecen los valores +predeterminados de las propiedades. Por ejemplo, si queremos +suprimir la impresión de becuadros adicionales para toda la +duración de un pentagrama, podemos escribir: @example \new Staff \with @{ extraNatural = ##f @} @@ -1949,13 +1985,13 @@ de la siguiente forma: @lilypond[quote,verbatim,ragged-right] << \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } \new Staff \with { extraNatural = ##f } { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } >> @@ -1963,8 +1999,8 @@ de la siguiente forma: Las propiedades ajustadas de esta manera aún pueden cambiarse dinámicamente utilizando @code{\set} y ser devueltas al valor -predeterminados que se estableció en el bloque @code{\with} mediante -@code{\unset}. +predeterminados que se estableció en el bloque @code{\with} +mediante @code{\unset}. @cindex fontSize (tamaño de la tipografía) @cindex fuente, tamaño de la @@ -1972,34 +2008,34 @@ predeterminados que se estableció en el bloque @code{\with} mediante Así pues, si la propiedad @code{fontSize} se ajusta dentro de una cláusula @code{\with}, tiene el efecto de reiniciar el valor -predeterminado del tamaño de la fuente tipográfica. Si más tarde se -modifica con @code{\set}, este nuevo valor predeterminado puede -restablecerse con la instrucción @code{\unset fontSize}. +predeterminado del tamaño de la fuente tipográfica. Si más tarde +se modifica con @code{\set}, este nuevo valor predeterminado +puede restablecerse con la instrucción @code{\unset fontSize}. @subsubheading Cambiar las propiedades de un contexto con @code{\context} @cindex contextos, establecer propiedades de, con \context @funindex \context -@funindex context - -Los valores de propiedad de los contextos se pueden establecer para -@emph{todos} los contextos de un tipo determinado, como por ejemplo -todos los contextos de @code{Staff}, con una única instrucción. El -tipo de contexto se identifica mediante la utilización del nombre de -su tipo, como @code{Staff}, precedido de una barra invertida: -@code{\Staff}. El enunciado que establece el valor de la propiedad es -el mismo que el que está en un bloque @code{\with}, presentado -anteriormente. Se coloca en un bloque @code{\context} dentro de un -bloque @code{\layout}. Cada bloque @code{\context} afecta a todos los -contextos del tipo especificado a lo largo del bloque @code{\score} o -@code{\book} en el que aparece el bloque @code{\layout}. A -continuación presentamos un ejemplo que muestra el formato: + +Los valores de propiedad de los contextos se pueden establecer +para @emph{todos} los contextos de un tipo determinado, como por +ejemplo todos los contextos de @code{Staff}, con una única +instrucción. El tipo de contexto se identifica mediante la +utilización del nombre de su tipo, como @code{Staff}, precedido +de una barra invertida: @code{\Staff}. El enunciado que +establece el valor de la propiedad es el mismo que el que está en +un bloque @code{\with}, presentado anteriormente. Se coloca en +un bloque @code{\context} dentro de un bloque @code{\layout}. +Cada bloque @code{\context} afecta a todos los contextos del tipo +especificado a lo largo del bloque @code{\score} o @code{\book} +en el que aparece el bloque @code{\layout}. A continuación +presentamos un ejemplo que muestra el formato: @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - cisis4 e d cis + \relative { + cisis''4 e d cis } } \layout { @@ -2018,13 +2054,13 @@ pentagramas de la partitura: \score { << \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } >> @@ -2039,8 +2075,9 @@ pentagramas de la partitura: @noindent Las propiedades de contexto establecidas de esta forma se pueden sobreescribir para ejemplares concretos de contextos mediante -enunciados dentro de un bloque @code{\with}, y mediante instrucciones -@code{\set} intercaladas dentro de enunciados musicales. +enunciados dentro de un bloque @code{\with}, y mediante +instrucciones @code{\set} intercaladas dentro de enunciados +musicales. @seealso @@ -2065,34 +2102,33 @@ Referencia de funcionamiento interno: @cindex eliminación de grabadores @funindex \consists -@funindex consists @funindex \remove -@funindex remove -Hemos visto que cada uno de los contextos contiene varios grabadores, -cada uno de los cuales a su vez es responsable de la producción de una -fracción particular del resultado impreso, como líneas divisorias, -pentagramas, cabezas, plicas, etc. Si un grabador es eliminado de un -contexto, ya no podrá producir su salida impresa. Es una forma algo -radical de modificar la salida, pero a veces puede ser útil. +Hemos visto que cada uno de los contextos contiene varios +grabadores, cada uno de los cuales a su vez es responsable de la +producción de una fracción particular del resultado impreso, como +líneas divisorias, pentagramas, cabezas, plicas, etc. Si un +grabador es eliminado de un contexto, ya no podrá producir su +salida impresa. Es una forma algo radical de modificar la +salida, pero a veces puede ser útil. @subsubheading Cambiar un solo contexto -Para eliminar un grabador de un contexto único, usamos la instrucción -@code{\with} situada inmediatamente después de la instrucción que crea -el contexto, como en la sección anterior. +Para eliminar un grabador de un contexto único, usamos la +instrucción @code{\with} situada inmediatamente después de la +instrucción que crea el contexto, como en la sección anterior. -Como ilustración, repitamos un ejemplo extraído de la sección anterior -con las líneas del pentagrama eliminadas. Recuerde que las líneas del -pentagrama están dibujadas por el grabador +Como ilustración, repitamos un ejemplo extraído de la sección +anterior con las líneas del pentagrama eliminadas. Recuerde que +las líneas del pentagrama están dibujadas por el grabador @code{Staff_symbol_engraver}. @lilypond[quote,verbatim,ragged-right] \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c' { - c4 d +\relative { + c'4 d \set fontSize = #-4 % make note heads smaller e4 f | \set fontSize = #2.5 % make note heads larger @@ -2104,42 +2140,42 @@ pentagrama están dibujadas por el grabador @cindex ámbito, grabador del -Los grabadores también se pueden añadir a los contextos individuales -La instrucción que lo hace es +Los grabadores también se pueden añadir a los contextos +individuales La instrucción que lo hace es @code{\consists @var{Nombre_del_grabador}}, -situada dentro de un bloque @code{\with}. Ciertas partituras vocales -tienen una indicación de ámbito o tesitura situada al principio del -pentagrama para indicar el ámbito de notas en dicho pentagrama, véase -@rglos{ambitus}. El ambitus se produce por parte del grabador -@code{Ambitus_engraver}, que normalmente no está incluido en ningún -contexto. Si lo añadimos al contexto @code{Voice}, calcula el rango a -partir de esa única voz: +situada dentro de un bloque @code{\with}. Ciertas partituras +vocales tienen una indicación de ámbito o tesitura situada al +principio del pentagrama para indicar el ámbito de notas en dicho +pentagrama, véase @rglos{ambitus}. El ambitus se produce por +parte del grabador @code{Ambitus_engraver}, que normalmente no +está incluido en ningún contexto. Si lo añadimos al contexto +@code{Voice}, calcula el rango a partir de esa única voz: @lilypond[quote,verbatim,ragged-right] \new Staff << \new Voice \with { \consists "Ambitus_engraver" } { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @end lilypond @noindent -pero si añadimos el grabador de ámbito al contexto de @code{Staff}, -calcula el rango de todas las notas en todas las voces de ese -pentagrama: +pero si añadimos el grabador de ámbito al contexto de +@code{Staff}, calcula el rango de todas las notas en todas las +voces de ese pentagrama: @lilypond[quote,verbatim,ragged-right] \new Staff \with { @@ -2147,15 +2183,15 @@ pentagrama: } << \new Voice { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @@ -2164,38 +2200,37 @@ pentagrama: @subsubheading Cambiar todos los contextos del mismo tipo @funindex \layout -@funindex layout Los ejemplos anteriores muestran la manera de eliminar o añadir -grabadores a los contextos individuales. También es posible eliminar -o añadir grabadores a todos los contextos de un tipo específico, -situando las instrucciones en el contexto correspondiente dentro de un -bloque @code{\layout}. Por ejemplo, si queremos mostrar los rangos de -tesitura para todos los pentagramas de una partitura de cuatro pautas, -podemos escribir +grabadores a los contextos individuales. También es posible +eliminar o añadir grabadores a todos los contextos de un tipo +específico, situando las instrucciones en el contexto +correspondiente dentro de un bloque @code{\layout}. Por ejemplo, +si queremos mostrar los rangos de tesitura para todos los +pentagramas de una partitura de cuatro pautas, podemos escribir @lilypond[quote,verbatim,ragged-right] \score { << \new Staff { - \relative c'' { - c4 a b g + \relative { + c''4 a b g } } \new Staff { - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "G_8" - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "bass" - \relative c { + \relative { c4 a b g } } @@ -2211,9 +2246,9 @@ podemos escribir @noindent Los valores predeterminados de las propiedades de los contextos -también se pueden establecer para todos los contextos de un tipo en -particular incluyendo la instrucción @code{\set} dentro de un bloque -@code{\context} de la misma forma. +también se pueden establecer para todos los contextos de un tipo +en particular incluyendo la instrucción @code{\set} dentro de un +bloque @code{\context} de la misma forma. @seealso @@ -2222,23 +2257,24 @@ Referencia de la notación: @ruser{Cambiar los valores por omisión de los contextos}. @knownissues -Los grabadores @code{Stem_engraver} y @code{Beam_engraver} -(de plica y de barra) adjuntan a la cabeza de las notas -los objetos que crean. Si se suprime el grabador de cabezas de nota -@code{Note_heads_engraver}, no se produce ninguna cabeza y por tanto -no se crean tampoco plicas ni barras. +Los grabadores @code{Stem_engraver} y @code{Beam_engraver} (de +plica y de barra) adjuntan a la cabeza de las notas los objetos +que crean. Si se suprime el grabador de cabezas de nota +@code{Note_heads_engraver}, no se produce ninguna cabeza y por +tanto no se crean tampoco plicas ni barras. @node Extender las plantillas @section Extender las plantillas @translationof Extending the templates -Ha leído el tutorial y ahora sabe escribir música. Pero ¿cómo puede -poner los pentagramas que quiere? Las plantillas están muy bien, pero -¿qué ocurre si quiere algo que no está en una de ellas? Bien, puede -encontrar montañas de plantillas (véase @ref{Plantillas}) que le pueden -servir como punto de partida. Pero ¿y si quiere algo que no está -contemplado aquí? Continúe leyendo. +Ha leído el tutorial y ahora sabe escribir música. Pero ¿cómo +puede poner los pentagramas que quiere? Las plantillas están muy +bien, pero ¿qué ocurre si quiere algo que no está en una de +ellas? Bien, puede encontrar montañas de plantillas (véase +@ref{Plantillas}) que le pueden servir como punto de partida. +Pero ¿y si quiere algo que no está contemplado aquí? Continúe +leyendo. @menu @@ -2256,14 +2292,14 @@ contemplado aquí? Continúe leyendo. @cindex plantilla, modificar @cindex modificar plantillas -Para empezar, tome la plantilla que le parezca más parecida a aquello -que quiere conseguir. Digamos que quiere escribir algo para soprano y -cello. En este caso comenzaríamos con la plantilla @q{Notas y letra} -(para la parte de soprano). +Para empezar, tome la plantilla que le parezca más parecida a +aquello que quiere conseguir. Digamos que quiere escribir algo +para soprano y cello. En este caso comenzaríamos con la +plantilla @q{Notas y letra} (para la parte de soprano). @example \version @w{"@version{}"} -melodia = \relative c' @{ +melodia = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2287,12 +2323,12 @@ texto = \lyricmode @{ @} @end example -Ahora queremos añadir una parte de violoncello. Veamos el ejemplo -@q{Sólo notas}: +Ahora queremos añadir una parte de violoncello. Veamos el +ejemplo @q{Sólo notas}: @example \version @w{"@version{}"} -melodia = \relative c' @{ +melodia = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2306,22 +2342,22 @@ melodia = \relative c' @{ @} @end example -No necesitamos dos instrucciones @code{\version}. Vamos a necesitar -la sección @code{melodia}. No queremos dos secciones @code{\score} -(si tuviésemos dos @code{\score}s, acabaríamos con las dos particellas -por separado. Queremos las dos juntas, como un dúo. Dentro de la -sección @code{\score}, no nos hacen falta dos @code{\layout} ni dos -@code{\midi}. +No necesitamos dos instrucciones @code{\version}. Vamos a +necesitar la sección @code{melodia}. No queremos dos secciones +@code{\score} (si tuviésemos dos @code{\score}s, acabaríamos con +las dos particellas por separado. Queremos las dos juntas, como +un dúo. Dentro de la sección @code{\score}, no nos hacen falta +dos @code{\layout} ni dos @code{\midi}. Si nos limitásemos a copiar y pegar la sección @code{melodia}, -acabaríamos con dos secciones @code{melodia} separadas, así que vamos -a cambiarles el nombre. Llamaremos @code{musicaSoprano} a la sección -de la soprano y @code{musicaCello} a la sección del violoncello. Al -mismo tiempo cambiaremos el nombre de @code{texto} a -@code{letraSoprano}. Recuerde cambiar el nombre a las dos apariciones -de todos estos nombres -- tanto la definición inicial (la parte -@code{melodia = relative c' @{ }) -- como el uso de ese nombre (en la -sección @code{\score}). +acabaríamos con dos secciones @code{melodia} separadas, así que +vamos a cambiarles el nombre. Llamaremos @code{musicaSoprano} a +la sección de la soprano y @code{musicaCello} a la sección del +violoncello. Al mismo tiempo cambiaremos el nombre de +@code{texto} a @code{letraSoprano}. Recuerde cambiar el nombre a +las dos apariciones de todos estos nombres -- tanto la definición +inicial (la parte @code{melodia = \relative @{ }) -- como el uso +de ese nombre (en la sección @code{\score}). También aprovecharemos para cambiar el pentagrama de la parte del cello (los violoncellos se escriben normalmente en clave de Fa). @@ -2329,7 +2365,7 @@ Asimismo, cambiaremos algunas notas del cello. @example \version @w{"@version{}"} -musicaSoprano = \relative c' @{ +musicaSoprano = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2340,7 +2376,7 @@ letraSoprano = \lyricmode @{ Aaa Bee Cee Dee @} -musicaCello = \relative c @{ +musicaCello = \relative @{ \clef "bass" \key c \major \time 4/4 @@ -2360,10 +2396,10 @@ musicaCello = \relative c @{ @} @end example -Esto tiene una apariencia prometedora, pero la parte del cello no sale -en la partitura (no la hemos puesto en la sección @code{\score}). Si -queremos que la parte del cello aparezca debajo de la de soprano, -tenemos que añadir +Esto tiene una apariencia prometedora, pero la parte del cello no +sale en la partitura (no la hemos puesto en la sección +@code{\score}). Si queremos que la parte del cello aparezca +debajo de la de soprano, tenemos que añadir @example \new Staff \musicaCello @@ -2371,10 +2407,10 @@ tenemos que añadir @noindent justo debajo de todo lo de la soprano. También tenemos que poner -@code{<<} y @code{>>} antes y después de la música -- lo que indica a -LilyPond que hay más de una cosa (en este caso, @code{Staff}) -sucediendo al mismo tiempo --. La @code{\score} se parecerá ahora a -esto: +@code{<<} y @code{>>} antes y después de la música -- lo que +indica a LilyPond que hay más de una cosa (en este caso, +@code{Staff}) sucediendo al mismo tiempo --. La @code{\score} se +parecerá ahora a esto: @c Indentation in this example is deliberately poor @example @@ -2395,12 +2431,12 @@ esto: @end example @noindent -Esto parece un poco enrevesado; los márgenes están descuadrados. Esto -tiene fácil solución. Presentamos aquí la plantilla completa para -soprano y cello. +Lo anterior parece un poco enrevesado; los márgenes están +descuadrados. Esto tiene fácil solución. Presentamos aquí la +plantilla completa para soprano y cello. @lilypond[quote,verbatim,ragged-right,addversion] -sopranoMusic = \relative c' { +sopranoMusic = \relative { \clef "treble" \key c \major \time 4/4 @@ -2411,7 +2447,7 @@ sopranoLyrics = \lyricmode { Aaa Bee Cee Dee } -celloMusic = \relative c { +celloMusic = \relative { \clef "bass" \key c \major \time 4/4 @@ -2444,55 +2480,55 @@ Las plantillas de inicio se pueden encontrar en el apéndice @subsection Partitura vocal a cuatro voces SATB @translationof Four-part SATB vocal score -La mayor parte de las partituras vocales escritas para coro mixto a -cuatro voces con acompañamiento orquestal, como el «Elías» de +La mayor parte de las partituras vocales escritas para coro mixto +a cuatro voces con acompañamiento orquestal, como el «Elías» de Mendelssohn o el «Mesías» de Haendel, tienen la música coral y la -letra en cuatro pentagramas para S, A, T y B, respectivamente, con una -reducción de piano del acompañamiento de orquesta, por debajo. He aquí -un ejemplo del «Mesías» de Haendel: +letra en cuatro pentagramas para S, A, T y B, respectivamente, +con una reducción de piano del acompañamiento de orquesta, por +debajo. He aquí un ejemplo del «Mesías» de Haendel: @c The following should appear as music without code @lilypond[quote,ragged-right] global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis e2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis e2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4 2 4 | + r4 2 4 | 4. 8 2 | 4 2 | } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 | + 4 2 4 | 4. 8 2 | 4 2 | } @@ -2546,25 +2582,37 @@ lower = \relative c, { } @end lilypond -Ninguna de las plantillas proporciona esta disposición con exactitud. -La más parecida es @ref{Partitura vocal SATB y reducción para piano automática}, -pero necesitamos cambiar la -disposición y añadir un acompañamiento de piano que no esté derivado -automáticamente de las partes vocales. Las variables que contienen la -música y la letra de las partes vocales es adecuada, pero tendremos -que añadir variables para la reducción de piano. +@warning{Esta disposición se puede conseguir muy fácilmente +usando la plantilla incorporada: @code{satb.ly}, véase +@ref{Plantillas incorporadas}. Pero para mayor facilidad de uso, +esta plantilla oculta deliberadamente la necesaria estructura de +contexto, proporcionándola automáticamente en vez de ello. Así +pues, para nuestro objetivo de aprendizaje, veamos cómo construir +la estructura partiendo de cero. Quizá necesite hacerlo cada vez +que la plantilla incorporada no cumpla sus necesidades +completamente.} + +La plantilla (no incorporada: de copiar y editar) más parecida a +esta disposición es +@ref{Partitura vocal SATB y reducción para piano automática}, +pero necesitamos cambiar la disposición y añadir un +acompañamiento de piano que no esté derivado automáticamente de +las partes vocales. Las variables que contienen la música y la +letra de las partes vocales es adecuada, pero tendremos que +añadir variables para la reducción de piano. El orden en que aparecen los contextos en el ChoirStaff de la -plantilla no se corresponde con el orden de la partitura vocal que -hemos mostrado más arriba. Tenemos que reordenarlas para que haya -cuatro pentagramas con la letra escrita directamente bajo las notas de -cada parte. Todas las voces deben ser @code{\voiceOne}, que es la -predeterminada, para que las instrucciones @code{\voiceXXX} se puedan -eliminar. También tenemos que especificar la clave de tenor (clave de -sol octava baja) en las partes de tenor. Aún no hemos encontrado la -forma en que la letra se especifica en la plantilla, así que tenemos -que utilizar el método que nos resulta familiar. También tenemos que -escribir los nombres de cada pentagrama. +plantilla no se corresponde con el orden de la partitura vocal +que hemos mostrado más arriba. Tenemos que reordenarlas para que +haya cuatro pentagramas con la letra escrita directamente bajo +las notas de cada parte. Todas las voces deben ser +@code{\voiceOne}, que es la predeterminada, para que las +instrucciones @code{\voiceXXX} se puedan eliminar. También +tenemos que especificar la clave de tenor (clave de sol octava +baja) en las partes de tenor. Aún no hemos encontrado la forma +en que la letra se especifica en la plantilla, así que tenemos +que utilizar el método que nos resulta familiar. También tenemos +que escribir los nombres de cada pentagrama. Al hacerlo así obtenemos el ChoirStaff siguiente: @@ -2613,9 +2661,9 @@ Al hacerlo así obtenemos el ChoirStaff siguiente: >> % fin del ChoirStaff @end example -A continuación debemos trabajar sobre la parte de piano. Es fácil: -tan sólo hay que sacar la parte de piano de la plantilla de @q{Piano -solista}: +A continuación debemos trabajar sobre la parte de piano. Es +fácil: tan sólo hay que sacar la parte de piano de la plantilla +de @q{Piano solista}: @example \new PianoStaff << @@ -2682,44 +2730,44 @@ Los grupos ChoirStaff y PianoStaff se deben combinar utilizando >> @end example -Al combinar todo esto junto y escribir la música de los tres compases -del ejemplo anterior, obtenemos: +Al combinar todo esto junto y escribir la música de los tres +compases del ejemplo anterior, obtenemos: @lilypond[quote,verbatim,ragged-right,addversion] global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis fis2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis fis2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4 2 4 | + r4 2 4 | 4. 8 2 | 4 2 | } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 | + 4 2 4 | 4. 8 2 | 4 2 | } @@ -2789,24 +2837,26 @@ lower = \relative c, { @cindex partitura, ejemplo de escritura Después de adquirir algo de soltura en la escritura del código de -LilyPond, se dará cuenta de que es más fácil construir completamente -una partitura partiendo de cero, que modificar una plantilla. También -puede desarrollar su propio estilo de forma que se adapte al tipo de -música que le apetezca. Veamos a continuación cómo confeccionar una -partitura para un preludio de órgano, como ejemplo. - -Comenzamos con una sección para el encabezamiento. Aquí es donde van -el título, nombre del compositor, etc., después van las definiciones -de las variables, y finalmente el bloque de partitura. Comencemos a -verlas por encima y más tarde completaremos los detalles. - -Utilizaremos los dos primeros compases del preludio de Bach basado en -@emph{Jesu, meine Freude}, que está escrito para órgano con dos -manuales y pedal. Tiene estos dos compases de música al final de la -sección. La parte del manual superior tiene dos voces, y el inferior -y el pedal, una voz cada uno. Así pues, necesitamos cuatro -definiciones para la música y una más para definir el compás y la -tonalidad: +LilyPond, se dará cuenta de que es más fácil construir +completamente una partitura partiendo de cero, que modificar una +plantilla. También puede desarrollar su propio estilo de forma +que se adapte al tipo de música que le apetezca. Veamos a +continuación cómo confeccionar una partitura para un preludio de +órgano, como ejemplo. + +Comenzamos con una sección para el encabezamiento. Aquí es donde +van el título, nombre del compositor, etc., después van las +definiciones de las variables, y finalmente el bloque de +partitura. Comencemos a verlas por encima y más tarde +completaremos los detalles. + +Utilizaremos los dos primeros compases del preludio de Bach +basado en @emph{Jesu, meine Freude}, que está escrito para órgano +con dos manuales y pedal. Tiene estos dos compases de música al +final de la sección. La parte del manual superior tiene dos +voces, y el inferior y el pedal, una voz cada uno. Así pues, +necesitamos cuatro definiciones para la música y una más para +definir el compás y la tonalidad: @example \version @w{"@version{}"} @@ -2824,16 +2874,17 @@ MusicaPedal = @{ s1 @} @} @end example -Por el momento hemos escrito tan sólo una nota espaciadora, @code{s1}, -en lugar de la música de verdad. La añadiremos más adelante. +Por el momento hemos escrito tan sólo una nota espaciadora, +@code{s1}, en lugar de la música de verdad. La añadiremos más +adelante. A continuación veamos qué va en el bloque de partitura. -Sencillamente, reflejaremos la estructura de pentagramas que deseemos. -La música de órgano se escribe por lo general en tres pentagramas, uno -para cada uno de los manuales y otro para el pedal. Los pentagramas -de los manuales se abarcan con una llave, así que los incluiremos en -un grupo PianoStaff. La primera parte de manual tiene dos voces, y la -segunda sólo una. +Sencillamente, reflejaremos la estructura de pentagramas que +deseemos. La música de órgano se escribe por lo general en tres +pentagramas, uno para cada uno de los manuales y otro para el +pedal. Los pentagramas de los manuales se abarcan con una llave, +así que los incluiremos en un grupo PianoStaff. La primera parte +de manual tiene dos voces, y la segunda sólo una. @example \new PianoStaff << @@ -2853,13 +2904,14 @@ segunda sólo una. >> % fin del contexto de PianoStaff @end example -Después, tenemos que añadir un pentagrama para el órgano de pedal. -Esto va por debajo del PianoStaff, pero debe ser simultáneo con él, -por lo que escribimos dobles ángulos rodeando a los dos. Si esto se -nos olvida, se producirá un error en el archivo log de registro. ¡Es -un error muy común que cometerá antes o después! Intente copiar el -ejemplo final que aparece al final de la sección, borre los dobles -ángulos y procese el archivo para ver qué error produce. +Después, tenemos que añadir un pentagrama para el órgano de +pedal. Esto va por debajo del PianoStaff, pero debe ser +simultáneo con él, por lo que escribimos dobles ángulos rodeando +a los dos. Si esto se nos olvida, se producirá un error en el +archivo log de registro. ¡Es un error muy común que cometerá +antes o después! Intente copiar el ejemplo final que aparece al +final de la sección, borre los dobles ángulos y procese el +archivo para ver qué error produce. @example << % el grupo PianoStaff y el pentagrama de Pedal son simultáneos @@ -2886,23 +2938,24 @@ ejemplo final que aparece al final de la sección, borre los dobles >> @end example -No es necesario utilizar la construcción simultánea @code{<< @dots{} >>} para -el pentagrama del manual dos y el pentagrama del órgano de pedal, ya -que contienen una única expresión, pero no hace daño, y es una buena -costumbre utilizar siempre dobles ángulos después de @code{\new Staff} -cuando hay varias voces. Lo opuesto es cierto para las voces: -normalmente deben ir seguidas de llaves @code{@{ @dots{} @}} en caso de que -tengamos música codificada como distintas variables que se deben -situar consecutivamente. +No es necesario utilizar la construcción simultánea @code{<< +@dots{} >>} para el pentagrama del manual dos y el pentagrama del +órgano de pedal, ya que contienen una única expresión, pero no +hace daño, y es una buena costumbre utilizar siempre dobles +ángulos después de @code{\new Staff} cuando hay varias voces. Lo +opuesto es cierto para las voces: normalmente deben ir seguidas +de llaves @code{@{ @dots{} @}} en caso de que tengamos música +codificada como distintas variables que se deben situar +consecutivamente. Añadamos esta estructura al bloque de partitura, y ajustemos el sangrado de los márgenes. También escribimos las claves correspondientes, nos aseguramos de que las plicas y ligaduras de -unión y de expresión en cada una de las voces del pentagrama superior -apuntan en la dirección adecuada con @code{\voiceOne} y -@code{\voiceTwo} y escribimos el compás y la tonalidad en cada uno de -los pentagramas usando nuestra variable previamente definida -@code{\TimeKey}. +unión y de expresión en cada una de las voces del pentagrama +superior apuntan en la dirección adecuada con @code{\voiceOne} y +@code{\voiceTwo} y escribimos el compás y la tonalidad en cada +uno de los pentagramas usando nuestra variable previamente +definida @code{\TimeKey}. @example \score @{ @@ -2942,16 +2995,17 @@ los pentagramas usando nuestra variable previamente definida @cindex ampliabilidad de las pautas @cindex pautas, ampliabilidad -La disposición anterior de los pentagramas de órgano es casi perfecta; -sin embargo, existe un ligero defecto que no es visible cuando se -observa un solo sistema: la distancia entre el pentagrama de pedal y -el de la mano izquierda debiera ser aproximadamente la misma que la -que existe entre los pentagramas de las manos izquierda y derecha. -Concretamente, la ampliabilidad de los pentagramas dentro de un -contexto @code{PianoStaff} es limitada (de forma que la distancia -entre los pentagramas de las manos izquierda y derecha nunca crezcan -excesivamente), y el pentagrama de los pedales debería comportarse de -una forma similar. +La disposición anterior de los pentagramas de órgano es casi +perfecta; sin embargo, existe un ligero defecto que no es visible +cuando se observa un solo sistema: la distancia entre el +pentagrama de pedal y el de la mano izquierda debiera ser +aproximadamente la misma que la que existe entre los pentagramas +de las manos izquierda y derecha. Concretamente, la +ampliabilidad de los pentagramas dentro de un contexto +@code{PianoStaff} es limitada (de forma que la distancia entre +los pentagramas de las manos izquierda y derecha nunca crezcan +excesivamente), y el pentagrama de los pedales debería +comportarse de una forma similar. @cindex sub-propiedades @cindex propiedades, sub-propiedades @@ -2959,22 +3013,22 @@ una forma similar. @cindex gráficos, objetos @cindex grobs -El grado de ampliabilidad o separabilidad de los pentagramas se puede -controlar con la propiedad @code{staff-staff-spacing} del @q{objeto -gráfico} @code{VerticalAxisGroup} (los objetos gráficos reciben por lo -general el nombre de @q{grob}s en la documentación de lilypond); no se -preocupe por el momento de los detalles, pues esto se explica más -tarde de forma exhaustiva. Los más curiosos pueden echar un vistazo a -@ruser{Panorámica de la modificación de las propiedades}. En este -caso, queremos modificar solamente la sub-propiedad -@code{stretchability}. -De nuevo, los curiosos encontrarán los valores -predeterminados para la propiedad staff-staff-spacing -en el archivo @file{scm/define-grobs.scm} -examinando la definición del grob @code{VerticalAxisGroup} grob. El -valor de @code{stretchability} se toma de la definición del contexto -@code{PianoStaff} (en el archivo @file{ly/engraver-init.ly}) de -forma que los valores sean idénticos. +El grado de ampliabilidad o separabilidad de los pentagramas se +puede controlar con la propiedad @code{staff-staff-spacing} del +@q{objeto gráfico} @code{VerticalAxisGroup} (los objetos gráficos +reciben por lo general el nombre de @q{grob}s en la documentación +de lilypond); no se preocupe por el momento de los detalles, pues +esto se explica más tarde de forma exhaustiva. Los más curiosos +pueden echar un vistazo a @ruser{Panorámica de la modificación de +las propiedades}. En este caso, queremos modificar solamente la +sub-propiedad @code{stretchability}. De nuevo, los curiosos +encontrarán los valores predeterminados para la propiedad +staff-staff-spacing en el archivo @file{scm/define-grobs.scm} +examinando la definición del grob @code{VerticalAxisGroup} grob. +El valor de @code{stretchability} se toma de la definición del +contexto @code{PianoStaff} (en el archivo +@file{ly/engraver-init.ly}) de forma que los valores sean +idénticos. @example \score @{ @@ -3013,10 +3067,10 @@ forma que los valores sean idénticos. @} % fin del contexto Score @end example -Con esto se completa la estructura. Toda música para órgano de tres -pentagramas tendrá una estructura similar, aunque el número de voces -puede variar. Todo lo que nos queda es añadir la música, y combinar -todas las partes. +Con esto se completa la estructura. Toda música para órgano de +tres pentagramas tendrá una estructura similar, aunque el número +de voces puede variar. Todo lo que nos queda es añadir la +música, y combinar todas las partes. @lilypond[quote,verbatim,ragged-right,addversion] \header { @@ -3024,20 +3078,20 @@ todas las partes. composer = "J S Bach" } keyTime = { \key c \minor \time 4/4 } -ManualOneVoiceOneMusic = \relative g' { - g4 g f ees | +ManualOneVoiceOneMusic = \relative { + g'4 g f ees | d2 c | } -ManualOneVoiceTwoMusic = \relative c' { - ees16 d ees8~ ees16 f ees d c8 d~ d c~ | - c8 c4 b8 c8. g16 c b c d | +ManualOneVoiceTwoMusic = \relative { + ees'16 d ees8~ 16 f ees d c8 d~ d c~ | + 8 c4 b8 c8. g16 c b c d | } -ManualTwoMusic = \relative c' { - c16 b c8~ c16 b c g a8 g~ g16 g aes ees | - f16 ees f d g aes g f ees d ees8~ ees16 f ees d | +ManualTwoMusic = \relative { + c'16 b c8~ 16 b c g a8 g~ 16 g aes ees | + f16 ees f d g aes g f ees d ees8~ 16 f ees d | } -PedalOrganMusic = \relative c { - r8 c16 d ees d ees8~ ees16 a, b g c b c8 | +PedalOrganMusic = \relative { + r8 c16 d ees d ees8~ 16 a, b g c b c8 | r16 g ees f g f g8 c,2 | } @@ -3091,7 +3145,7 @@ Glosario musical: Llegado a este punto, usted ha visto cosas de este tipo: @lilypond[quote,verbatim,ragged-right] -hornNotes = \relative c'' { c4 b dis c } +hornNotes = \relative { c''4 b dis c } \score { { @@ -3104,8 +3158,8 @@ Incluso se dará cuenta de que esto puede ser útil en música minimalista: @lilypond[quote,verbatim,ragged-right] -fragmentA = \relative c'' { a4 a8. b16 } -fragmentB = \relative c'' { a8. gis16 ees4 } +fragmentA = \relative { a'4 a8. b16 } +fragmentB = \relative { a'8. gis16 ees4 } violin = \new Staff { \fragmentA \fragmentA | @@ -3119,25 +3173,25 @@ violin = \new Staff { } @end lilypond -Sin embargo también puede usar estos identificadores (que también se -conocen como variables, macros o instrucciones definidas por el -usuario) para hacer trucos: +Sin embargo también puede usar estos identificadores (que también +se conocen como variables, macros o instrucciones definidas por +el usuario) para hacer trucos: -@c TODO Avoid padtext - not needed with skylining @lilypond[quote,verbatim,ragged-right] dolce = \markup { \italic \bold dolce } -padText = { \once \override TextScript.padding = #5.0 } +centreText = { \once \override TextScript.self-alignment-X = #CENTER } + fthenp =_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } -violin = \relative c'' { +violin = \relative { \repeat volta 2 { - c4._\dolce b8 a8 g a b | - \padText - c4.^"hi there!" d8 e' f g d | - c,4.\fthenp b8 c4 c-. | + c''4._\dolce b8 a8 g a b | + \centreText + c4.^"hi there!" d8 e f g d | + c4.\fthenp b8 c4 c-. | } } @@ -3145,23 +3199,22 @@ violin = \relative c'' { { \violin } - \layout { ragged-right = ##t } } @end lilypond -Obviamente estos identificadores son útiles para ahorrar tecleo. Pero -son dignos de tener en cuenta incluso si se van a utilizar una sola -vez: reducen la complejidad. Examinemos el ejemplo anterior reescrito -sin ningún identificador. Encontrará que es mucho más difícil de -leer, sobre todo la última línea. +Obviamente estos identificadores son útiles para ahorrar tecleo. +Pero son dignos de tener en cuenta incluso si se van a utilizar +una sola vez: reducen la complejidad. Examinemos el ejemplo +anterior reescrito sin ningún identificador. Encontrará que es +mucho más difícil de leer, sobre todo la última línea. @example -violin = \relative c'' @{ +violin = \relative @{ \repeat volta 2 @{ - c4._\markup @{ \italic \bold dolce @} b8 a8 g a b | - \once \override TextScript.padding = #5.0 - c4.^"hi there!" d8 e' f g d | - c,4.\markup @{ + c''4._\markup @{ \italic \bold dolce @} b8 a8 g a b | + \once \override TextScript.self-alignment-X = #CENTER + c4.^"hi there!" d8 e f g d | + c4._\markup @{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} b8 c4 c-. | @@ -3169,69 +3222,68 @@ violin = \relative c'' @{ @} @end example -@c TODO Replace the following with a better example -td -@c Skylining handles this correctly without padText - -Hasta ahora hemos contemplado la sustitución estática: cuando LilyPond -se encuentra con @code{\padText}, lo sustituye con aquello que -hemos definido que sea (es decir, todo lo que está a la derecha de -@code{padtext=}). +Hasta ahora hemos contemplado la sustitución estática: cuando +LilyPond se encuentra con @code{\centreText}, lo sustituye con +aquello que hemos definido que sea (es decir, todo lo que está a +la derecha de @code{centreText=}). -LilyPond también puede manejar sustituciones no estáticas (piense en -ellas como en funciones). +LilyPond también puede manejar sustituciones no estáticas (piense +en ellas como en funciones). @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function - (parser location padding) + (padding) (number?) #{ \once \override TextScript.padding = #padding #}) -\relative c''' { - c4^"piu mosso" b a b | +\relative { + c''4^"piu mosso" b a b \padText #1.8 - c4^"piu mosso" d e f | + c4^"piu mosso" b a b \padText #2.6 - c4^"piu mosso" fis a g | + c4^"piu mosso" b a b } @end lilypond La utilización de identificadores también es una buena forma de -reducir el trabajo si la sintaxis de entrada de LilyPond cambia (véase -@rprogram{Actualizar ficheros con convert-ly}). Si tiene una sola -definición (como p.ej. @code{\dolce}) para todos sus archivos (ver -@ref{Hojas de estilo}), y después la sintaxis se modifica, sólo tendrá -que actualizar su definición @code{\dolce} única, en lugar de tener -que hacer cambios en cada uno de los archivos @file{.ly}. - +reducir el trabajo si la sintaxis de entrada de LilyPond cambia +(véase @rprogram{Actualizar ficheros con convert-ly}). Si tiene +una sola definición (como p.ej. @code{\dolce}) para todos sus +archivos (ver @ref{Hojas de estilo}), y después la sintaxis se +modifica, sólo tendrá que actualizar su definición @code{\dolce} +única, en lugar de tener que hacer cambios en cada uno de los +archivos @file{.ly}. @node Partituras y particellas @subsection Partituras y particellas @translationof Scores and parts -En música orquestal, todas las notas se imprimen dos veces. Una vez -en las particellas para los músicos, y otra para la partitura del -director. Los identificadores se pueden usar para evitar la -duplicación del trabajo. La música se escribe una vez y se almacena -en una variable. El contenido de dicha variable se usa después para -generar tanto la particella como la partitura del director. +En música orquestal, todas las notas se imprimen dos veces. Una +vez en las particellas para los músicos, y otra para la partitura +del director. Los identificadores se pueden usar para evitar la +duplicación del trabajo. La música se escribe una vez y se +almacena en una variable. El contenido de dicha variable se usa +después para generar tanto la particella como la partitura del +director. Es muy conveniente definir las notas en un archivo especial. Por ejemplo, supongamos que el archivo @file{trompa.ly} contiene la siguiente parte de un dúo para trompa y fagot: @example -notasTrompa = \relative c @{ +notasTrompa = \relative @{ \time 2/4 r4 f8 a | cis4 f | e4 d | @} @end example @noindent -Luego se hace una particella escribiendo en un archivo lo siguiente +Luego se hace una particella escribiendo en un archivo lo +siguiente @example \include "trompa.ly" @@ -3252,16 +3304,17 @@ La línea @end example @noindent -sustituye el contenido de @file{trompa.ly} en esta posición dentro del -archivo, así que @code{notasTrompa} se define con posterioridad. La -instrucción @code{\transpose f@tie{}c'} indica que el argumento -constituido por @code{\notasTrompa} se debe transponer una quinta -hacia arriba. Lo que suena como @code{f} se escribe como @code{c'}, -lo que corresponde con el tono de afinación de una trompa normal -en@tie{}Fa. La transposición se puede ver en la siguiente salida +sustituye el contenido de @file{trompa.ly} en esta posición +dentro del archivo, así que @code{notasTrompa} se define con +posterioridad. La instrucción @code{\transpose f@tie{}c'} indica +que el argumento constituido por @code{\notasTrompa} se debe +transponer una quinta hacia arriba. Lo que suena como @code{f} +se escribe como @code{c'}, lo que corresponde con el tono de +afinación de una trompa normal en@tie{}Fa. La transposición se +puede ver en la siguiente salida @lilypond[quote,ragged-right] -\transpose f c' \relative c { +\transpose f c' \relative { \time 2/4 r4 f8 a | cis4 f | e4 d | } @@ -3271,41 +3324,35 @@ En piezas para conjunto, con frecuencia una de las voces no suena durante muchos compases. Esto queda denotado por un silencio especial, el silencio multicompás. Se introduce con una @code{R} mayúscula seguida de una duración (@code{1}@tie{}en el caso de la -redonda, @code{2}@tie{}en el caso de una blanca, etc.). Multiplicando -la duración se pueden construir silencios más largos. Por ejemplo, -este silencio ocupa 3@tie{}compases de 2/4 +redonda, @code{2}@tie{}en el caso de una blanca, etc.). +Multiplicando la duración se pueden construir silencios más +largos. Por ejemplo, este silencio ocupa 3@tie{}compases de 2/4 @example R2*3 @end example Cuando se imprime la particella tienen que comprimirse los silencios -multicompás. Esto se hace estableciendo una variable en tiempo de -ejecución +multicompás. Existe una función musical para hacerlo: @example -\set Score.skipBars = ##t +\compressMMRests @{ ... @} @end example -@noindent -Esta instrucción establece el valor de la propiedad @code{skipBars} en -el contexto de @code{Score} a verdadero (@code{##t}). Anteponiendo el -silencio y esta opción a la música anterior, llegamos al siguiente -resultado +Applying this to @code{hornNotes} gives: @lilypond[quote,ragged-right] -\transpose f c' \relative c { +\compressMMRests \transpose f c' \relative { \time 2/4 - \set Score.skipBars = ##t R2*3 | r4 f8 a | cis4 f | e4 d | } @end lilypond - -Esta partitura se hace combinando toda la música junta. Suponiendo -que la otra voz se encuentra dentro de @code{notasFagot} en el archivo -@file{fagot.ly}, la partitura se hace con +Esta partitura se hace combinando toda la música junta. +Suponiendo que la otra voz se encuentra dentro de +@code{notasFagot} en el archivo @file{fagot.ly}, la partitura se +hace con @example \include "fagot.ly" @@ -3321,7 +3368,7 @@ que la otra voz se encuentra dentro de @code{notasFagot} en el archivo lo que nos lleva a @lilypond[quote,ragged-right] -\relative c << +\relative << \new Staff { \clef "treble" \time 2/4 @@ -3337,5 +3384,13 @@ lo que nos lleva a >> @end lilypond +@seealso +Manual de aprendizaje: +@ref{Organizar las piezas mediante variables}. +Referencia de la notación: +@ruser{Transposición}, +@ruser{Escritura de las particellas}, +@ruser{Silencios de compás completo}, +@ruser{Inclusión de archivos de LilyPond}. diff --git a/Documentation/es/learning/templates.itely b/Documentation/es/learning/templates.itely index ce9b26d388..ff35bd0b72 100644 --- a/Documentation/es/learning/templates.itely +++ b/Documentation/es/learning/templates.itely @@ -1,25 +1,25 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 67a345f965d169bc1acd23ff4160914fb2142f38 + Translation of GIT committish: 8892bd951e1705e116b36cf2243c061f74e73af9 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.25" @node Plantillas @appendix Plantillas @translationof Templates -Esta sección del manual contiene plantillas con la partitura de LilyPond -ya preparada. Sólo tiene que escribir las notas, lanzar LilyPond y ¡disfrutar de -unas hermosas partituras impresas! - +Esta sección del manual contiene plantillas con la partitura de +LilyPond ya preparada. Sólo tiene que escribir las notas, lanzar +LilyPond y ¡disfrutar de unas hermosas partituras impresas! @menu +* Plantillas incorporadas:: * Plantillas de pentagrama único:: * Plantillas de piano:: * Plantillas de cuarteto de cuerda:: @@ -30,6 +30,335 @@ unas hermosas partituras impresas! @end menu +@node Plantillas incorporadas +@appendixsec Plantillas incorporadas +@translationof Built-in templates + +Algunas plantillas que son adecuadas para un abanico de +posibilidades en música coral, se encuentran incorporadas dentro +de LilyPond. Se pueden usar para crear música coral sencilla, con +o sin acompañamiento de piano, en dos, cuatro u ocho pentagramas. +A diferencia de otras plantillas, éstas están @q{incorporadas}, lo +que significa que no tienen que copiarse o editarse: en lugar de +ello, sencillamente se incluyen con la instrucción +@code{@bs{}include} dentro del archivo de entrada. + +@warning {A diferencia de la mayoría de los archivos de inclusión, +estas plantillas incorporadas se deben incluir @emph{al final} del +archivo de entrada.} + +Las expresiones musicales necesarias se introducen definiendo +valores para variables específicas. Estas definiciones deben ir +antes del archivo incluido con la instrucción @code{@bs{}include}. + +@menu +* Plantilla coral SATB :: +* Plantilla coral SSAATTBB:: +@end menu + +@node Plantilla coral SATB +@appendixsubsec Plantilla coral SATB +@translationof SATB template + +La música se puede disponer con una o dos voces por pentagrama +fijando el valor de @code{TwoVoicesPerStaff} a @code{##f} o +@code{##t} respectivamente. + +A continuación aparece el archivo de entrada completo que produce +un arreglo a cuatro voces SATB con letras individuales y +acompañamiento de piano: + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a'4\f a8 a a4 a } + SopranoLyrics = \lyricmode { Sop -- ra -- no ly -- rics } + AltoMusic = \relative { d'4\f d d d } + AltoLyrics = \lyricmode { Al -- to ly -- rics } + TenorMusic = \relative { a4\p a a a } + TenorLyrics = \lyricmode { Te -- nor ly -- rics } + BassMusic = \relative { c2\p c4 c } + BassLyrics = \lyricmode { Bass ly -- rics } + PianoRHMusic = \relative { c' e g c } + PianoDynamics = { s2\mp s4 s4 } + PianoLHMusic = \relative { c e g c } + \include "satb.ly" +@end lilypond + +La misma entrada se puede utilizar para producir una partitura con +dos voces po pentagrama, tan solo ajustando el valor de +@code{TwoVoicesPerStaff} a @code{##t}. De nuevo, cada voz tiene +su letra individual. + + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a'4\f a8 a a4 a } + SopranoLyrics = \lyricmode { Sop -- ra -- no ly -- rics } + AltoMusic = \relative { d'4\f d d d } + AltoLyrics = \lyricmode { Al -- to ly -- rics } + TenorMusic = \relative { a4\p a a a } + TenorLyrics = \lyricmode { Te -- nor ly -- rics } + BassMusic = \relative { c2\p c4 c } + BassLyrics = \lyricmode { Bass ly -- rics } + PianoRHMusic = \relative { c' e g c } + PianoDynamics = { s2\mp s4 s4 } + PianoLHMusic = \relative { c e g c } + TwoVoicesPerStaff = ##t + \include "satb.ly" +@end lilypond + +Cuando se establece el valor de @code{TwoVoicesPerStaff} a falso o +se deja como predeterminado, cualquiera de las variables musicales +puede omitirse para producir arreglos con menos voces. Aquí, por +ejemplo, aparece la manera en que debe escribirse el archivo de +entrada para un dúo de Soprano y Bajo: + +@lilypond[verbatim,quote] + SopranoMusic = \relative { c'' c c c } + SopranoLyrics = \lyricmode { High voice ly -- rics } + BassMusic = \relative { a a a a } + BassLyrics = \lyricmode { Low voice ly -- rics } + \include "satb.ly" +@end lilypond + +Se puede añadir a cada una de las partes una segunda estrofa o una +letra alternativa: + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a'4 a a a } + SopranoLyricsOne = \lyricmode { + \set stanza = "1." + Words to verse one + } + SopranoLyricsTwo = \lyricmode { + \set stanza = "2." + Words to verse two + } + \include "satb.ly" +@end lilypond + +Cuando las letras y las duraciones son las mismas para todas las +partes, la música vocal se dispone mejor sobre dos pentagramas con +dos voces cada uno. Se ofrece la posibilidad de incluir hasta +nueve estrofas. El ejemplo sin acompañamiento que aparece a +continuación tiene solamente tres estrofas. + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a' a a a } + AltoMusic = \relative { f' f f f } + VerseOne = \lyricmode { + \set stanza = "1." + Words to verse one + } + VerseTwo = \lyricmode { + \set stanza = "2." + Words to verse two + } + VerseThree = \lyricmode { + \set stanza = "3." + Words to verse three + } + TenorMusic = \relative { a a a a } + BassMusic = \relative { f f f f } + TwoVoicesPerStaff = ##t + \include "satb.ly" +@end lilypond + +Puede ajustarse el valor de otras variables. La tonalidad y la +indicación de compás se pueden modificar a partir de los ajustes +predeterminados: + +@lilypond[verbatim, quote] + Key = \key a \major + Time = { + \time 5/4 + \tempo "Allegro" 4 = 144 + } + SopranoMusic = \relative { gis' gis gis gis gis } + AltoMusic = \relative { cis' cis cis cis cis } + VerseOne = \lyricmode { Words to this du -- et } + TwoVoicesPerStaff = ##t + \include "satb.ly" +@end lilypond + +Los nombres de instrumento y/o los nombres cortos de instrumento +se pueden modificar también: + +@lilypond[verbatim,quote] + SopranoMusic = \relative { c'' c c c } + SopranoLyrics = \lyricmode { High voice ly -- rics } + SopranoInstrumentName = "Soprano 1" + SopranoShortInstrumentName = "S1" + AltoMusic = \relative { a' a a a } + AltoLyrics = \lyricmode { Low voice ly -- rics } + AltoInstrumentName = "Soprano 2" + AltoShortInstrumentName = "S2" + \include "satb.ly" +@end lilypond + +aunque en su lugar podría resultar más fácil usar la plantilla +@code{ssaattbb.ly}, véase @ref{Plantilla coral SSAATTBB}. + +Se puede añadir un discanto definiendo el valor de la variable +@code{DescantMusic} y se puede añadir una letra para el discanto +definiendo valores para la variable @code{DescantLyrics}. De +manera similar, puede añadirse una parte de solista por encima de +los pentagramas del coro agrupado definiendo valores para +@code{SoloMusic} y @code{SoloLyrics}. + +Los bloques @code{\header} y @code{\paper} se pueden añadir de la +forma normal. Se puede poner un bloque @code{\layout} de la +manera usual en el nivel superior, y el contenido se combina (pero +no sobreescribe) con los ajustes predeterminados que se ofrecen en +la plantilla. Como alternativa, todos los ajustes predeterminados +provistos por la plantilla se pueden descartad definiendo una +variable @code{Layout} que contenga @emph{todos} los ajustes +requeridos: + +@example +Layout = \layout @{ ... @} +@end example + +El conjunto completo de variables que pueden modificarse se pueden +consultar en el archivo @file{ly/satb.ly}, véase @ref{Otras +fuentes de información}. + +@seealso +Manual de aprendizaje: +@ref{Organizar las piezas mediante variables}, +@ref{Plantillas de conjuntos vocales}, +@ref{Extender las plantillas}, +@ref{Otras fuentes de información}. + +@knownissues +El establecimiento de la variable @code{TwoVoicesPerStaff} tiene +efecto sobre la duración completa de la partitura: no se pueden +dar distintos valores en momentos diferentes. + +No son posibles arreglos más complejos de música coral SATB con +esta sencilla plantilla incorporada. + + +@node Plantilla coral SSAATTBB +@appendixsubsec Plantilla coral SSAATTBB +@translationof SSAATTBB template + +Todas las variables definidas para la plantilla SATB, con la +excepción de las variables @code{VerseXxx} están asimismo +disponibles para la plantilla SSAATTBB, véase @ref{Plantilla coral +SATB}. Además, la música y la letra de las voces primera y +segunda en una cualquiera o en las cuatro partes se puede +especificar dando valores a las variables @code{SopranoOneMusic}, +@code{SopranoTwoMusic}, etc., con las letras en +@code{SopranoOneLyrics}, @code{SopranoTwoLyrics}, etc. Se pueden +definir hasta cuatro estrovas adicionales para todas las partes +usando las variables @code{SopranoOneLyricsOne}, estando las demás +definidas de forma análoga. + +Si se establece el valor de @code{TwoVoicesPerStaff} a @code{##t}, +@emph{todas} las partes vocales se situarán en pentagramas únicos +como voces en divisi. Si @code{TwoVoicesPerStaff} se deja en su +valor predeterminado o se establece a @code{##f}, entonces las +partes vocales individuales se pueden disponer sobre uno o dos +pentagramas de acuerdo al valor de +@code{SopranoTwoVoicesPerStaff}, @code{MenTwoVoicesPerStaff}, etc. + +Como ejemplo, supongamos que tenemos una pieza para soprano y +contralto que comienza con todas las voces al unísono y continúa +en una sección con dos partes vocales, soprano y contralto, y +termina con una sección de cuatro pentagramas. Se codificaría de +la siguiente forma: + +@lilypond[verbatim,quote] +Time = { s1 \break s1 \break } +WomenMusic = \relative { a'4 a a a } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoMusic = \relative { s1 | c''4 c c c8 c } +SopranoLyrics = \lyricmode{ So -- pra -- no ly -- rics } +AltoMusic = \relative { s1 | g'4 g g g } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +SopranoOneMusic = \relative { s1 | s1 |e''4 e e e } +SopranoOneLyrics = \lyricmode { Sop One ly -- rics } +SopranoTwoMusic = \relative { s1 | s1 | c''4 c c c } +SopranoTwoLyrics = \lyricmode { Sop Two ly -- rics } +AltoOneMusic = \relative { s1 | s1 | g'4 g g g8 g } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { s1 | s1 | e'4 e e e8 e } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +\layout { ragged-right = ##t } +\include "ssaattbb.ly" +@end lilypond + +Las voces masculinas se pueden añadir de forma análoga. + +Para cambiar la disposición de forma que las voces de soprano en +divisi utilicen un pentagrama compartido, sencillamente fijamos el +valor de @code{SopranoTwoVoicesPerStaff} a ##t, dejando todos los +demás valores sin cambios, así: + +@lilypond[verbatim,quote] +SopranoTwoVoicesPerStaff = ##t +Time = { s1 \break s1 \break } +WomenMusic = \relative { a'4 a a a } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoMusic = \relative { s1 | c''4 c c c8 c } +SopranoLyrics = \lyricmode{ So -- pra -- no ly -- rics } +AltoMusic = \relative { s1 | g'4 g g g } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +SopranoOneMusic = \relative { s1 | s1 |e''4 e e e } +SopranoOneLyrics = \lyricmode { Sop One ly -- rics } +SopranoTwoMusic = \relative { s1 | s1 | c''4 c c c } +SopranoTwoLyrics = \lyricmode { Sop Two ly -- rics } +AltoOneMusic = \relative { s1 | s1 | g'4 g g g8 g } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { s1 | s1 | e'4 e e e8 e } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +\layout { ragged-right = ##t } +\include "ssaattbb.ly" +@end lilypond + +o bien, para hacer que todas las voces emparejadas compartan un +solo pentagrama, establezca @code{TwoVoicesPerStaff} al valor ##t: + +@lilypond[verbatim,quote] +TwoVoicesPerStaff = ##t +Time = { s1 \break s1 \break } +WomenMusic = \relative { a'4 a a a } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoMusic = \relative { s1 | c''4 c c c8 c } +SopranoLyrics = \lyricmode{ So -- pra -- no ly -- rics } +AltoMusic = \relative { s1 | g'4 g g g } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +SopranoOneMusic = \relative { s1 | s1 |e''4 e e e } +SopranoOneLyrics = \lyricmode { Sop One ly -- rics } +SopranoTwoMusic = \relative { s1 | s1 | c''4 c c c } +SopranoTwoLyrics = \lyricmode { Sop Two ly -- rics } +AltoOneMusic = \relative { s1 | s1 | g'4 g g g8 g } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { s1 | s1 | e'4 e e e8 e } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +\layout { ragged-right = ##t } +\include "ssaattbb.ly" +@end lilypond + +Es posible ver el conjunto completo de variables que se pueden +cambiar examinando el archivo @file{ly/ssaattbb.ly}, véase +@ref{Otras fuentes de información}. + +@seealso +Manual de aprendizaje: +@ref{Organizar las piezas mediante variables}, +@ref{Plantillas de conjuntos vocales}, +@ref{Extender las plantillas}, +@ref{Otras fuentes de información}. + +@knownissues +El valor de las distintas variables @code{...TwoVoicesPerStaff} se +aplica a toda la duración de la partitura: no pueden recibir +valores distintos en tiempos diferentes. + +No son posibles arreglos de música coral a 8 partes más complejos, +con esta sencilla plantilla incorporada. + + @node Plantillas de pentagrama único @appendixsec Plantillas de pentagrama único @translationof Single staff templates @@ -45,14 +374,14 @@ unas hermosas partituras impresas! @appendixsubsec Sólo notas @translationof Notes only -@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion] +@lilypondfile[verbatim,quote,ragged-right,texidoc] {single-staff-template-with-only-notes.ly} @node Notas y letra @appendixsubsec Notas y letra @translationof Notes and lyrics -@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion] +@lilypondfile[verbatim,quote,ragged-right,texidoc] {single-staff-template-with-notes-and-lyrics.ly} @node Notas y acordes @@ -130,6 +459,13 @@ unas hermosas partituras impresas! @appendixsec Plantillas de conjuntos vocales @translationof Vocal ensembles templates +Debemos copiar en nuestra partitura el texto de las plantillas que +se muestran más abajo, y editarlas alllí. Si tiene una +disposición coral SATB relativamente sencilla, quizá prefiera +utilizar las plantillas incorporadas, que solo necesitan incluirse +con la instrucción @code{\include}, véase @ref{Plantillas +incorporadas}. + @menu * Partitura vocal SATB:: * Partitura vocal SATB y reducción para piano automática:: @@ -219,9 +555,8 @@ unas hermosas partituras impresas! @appendixsubsec Transcripción de música mensural @translationof Transcription of mensural music -@c Line-width below is because of Issue 766. If that's fixed, it can be removed. -@lilypondfile[verbatim,quote,ragged-right,texidoc,line-width=140] -{ancient-notation-template----modern-transcription-of-mensural-music.ly} +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{incipit.ly} @node Plantilla para transcripción de canto gregoriano @appendixsubsec Plantilla para transcripción de canto gregoriano @@ -243,8 +578,7 @@ unas hermosas partituras impresas! @appendixsubsec Combo de jazz @translationof Jazz combo -@c Line-width below is because of Issue 766. If that's fixed, it can be removed. -@lilypondfile[verbatim,quote,ragged-right,texidoc,line-width=140] +@lilypondfile[verbatim,quote,ragged-right,texidoc] {jazz-combo-template.ly} diff --git a/Documentation/es/learning/tutorial.itely b/Documentation/es/learning/tutorial.itely index 7f206ea4c8..47439ec3da 100644 --- a/Documentation/es/learning/tutorial.itely +++ b/Documentation/es/learning/tutorial.itely @@ -1,7 +1,7 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: d378daa101069ce6497292b0f4a7f6ce2e9b51f0 + Translation of GIT committish: 88cfc9ee61dece9cffff98ab7f10318633698c39 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -10,13 +10,14 @@ @include included/generating-output.itexi -@c \version "2.16.0" +@c \version "2.19.21" @node Tutorial @chapter Tutorial @translationof Tutorial -Este capítulo ofrece una introducción básica al trabajo con LilyPond. +Este capítulo ofrece una introducción básica al trabajo con +LilyPond. @menu * Compilación del archivo:: @@ -30,8 +31,8 @@ Este capítulo ofrece una introducción básica al trabajo con LilyPond. @translationof Compiling a file Esta sección presenta el concepto de @qq{compilación}: el -procesamiento de los documentos de entrada de LilyPond (escritos por -uno mismo) para producir archivos de salida. +procesamiento de los documentos de entrada de LilyPond (escritos +por uno mismo) para producir archivos de salida. @menu * Escritura del código de entrada:: @@ -54,8 +55,8 @@ uno mismo) para producir archivos de salida. @end menu @qq{Compilación} es una palabra que significa procesar un texto de -entrada en formato de LilyPond para producir un archivo que se puede -imprimir y (de manera opcional) un archivo MIDI que se puede +entrada en formato de LilyPond para producir un archivo que se +puede imprimir y (de manera opcional) un archivo MIDI que se puede reproducir. El primer ejemplo muestra el aspecto de un sencillo archivo de texto de entrada. @@ -78,17 +79,17 @@ El resultado tiene este aspecto: @end lilypond @warning{la música y la letra escrita en el código de entrada de -LilyPond tiene que ir siempre entre @w{@strong{@{ llaves @}}}. Las llaves -deberían también estar rodeadas por espacios a no ser que se -encuentren al principio o al final de una línea, para evitar -ambigüedades. Es posible que se omitan en algunos ejemplos del -presente manual ¡pero no las omita en su propia música! Para ver más -información sobre la presentación de los ejemplos del manual, consulte -@ref{Cómo leer los manuales}.} - -Además, la entrada de LilyPond es @strong{sensible a las mayúsculas}. -@w{@samp{ @{ c d e @}}} es una entrada válida; @w{@samp{@{ C D E @}}} produce -un mensaje de error. +LilyPond tiene que ir siempre entre @w{@strong{@{ llaves @}}}. +Las llaves deberían también estar rodeadas por espacios a no ser +que se encuentren al principio o al final de una línea, para +evitar ambigüedades. Es posible que se omitan en algunos ejemplos +del presente manual ¡pero no las omita en su propia música! Para +ver más información sobre la presentación de los ejemplos del +manual, consulte @ref{Cómo leer los manuales}.} + +Además, la entrada de LilyPond es @strong{sensible a las +mayúsculas}. @w{@samp{ @{ c d e @}}} es una entrada válida; +@w{@samp{@{ C D E @}}} produce un mensaje de error. @smallspace @@ -124,12 +125,12 @@ sistema operativo y del programa o programas que utilicemos. @end itemize -Existen varios otros editores de texto con un apoyo específico a la -edición de texto de LilyPond. Para ver más información, consulte -@rweb{Entornos mejorados}. +Existen varios otros editores de texto con un apoyo específico a +la edición de texto de LilyPond. Para ver más información, +consulte @rweb{Entornos mejorados}. -@warning{La primera vez que ejecute LilyPond, tardará un minuto o dos -porque todas las tipografías del sistema han de ser analizadas +@warning{La primera vez que ejecute LilyPond, tardará un minuto o +dos porque todas las tipografías del sistema han de ser analizadas previamente. ¡Después de esto, LilyPond será mucho más rápido!} @@ -164,8 +165,9 @@ previamente. ¡Después de esto, LilyPond será mucho más rápido!} @section Cómo escribir archivos de entrada @translationof How to write input files -Esta sección presenta una parte de la sintaxis básica de LilyPond como -ayuda para que se inicie en la escritura de archivos de entrada. +Esta sección presenta una parte de la sintaxis básica de LilyPond +como ayuda para que se inicie en la escritura de archivos de +entrada. @menu * Notación sencilla:: @@ -190,9 +192,10 @@ ayuda para que se inicie en la escritura de archivos de entrada. * Todo junto:: @end menu -LilyPond añadirá ciertos elementos de notación de manera automática. -En el siguiente ejemplo hemos especificado solamente cuatro alturas, -pero LilyPond ha añadido la clave, el compás y las duraciones. +LilyPond añadirá ciertos elementos de notación de manera +automática. En el siguiente ejemplo hemos especificado solamente +cuatro alturas, pero LilyPond ha añadido la clave, el compás y las +duraciones. @lilypond[verbatim,quote] { @@ -201,8 +204,8 @@ pero LilyPond ha añadido la clave, el compás y las duraciones. @end lilypond @noindent -Este comportamiento se puede modificar, pero en general estos valores -automáticos son adecuados. +Este comportamiento se puede modificar, pero en general estos +valores automáticos son adecuados. @node Alturas @@ -219,7 +222,6 @@ automáticos son adecuados. @cindex relativo, modo, alteraciones y @funindex \relative -@funindex relative @funindex ' @funindex , @@ -231,70 +233,77 @@ Glosario musical: @rglos{octave}, @rglos{accidental}. +LilyPond emplea letras minúsculas para las alturas. Las letras +desde @code{c} hasta@tie{}@code{b} denotan las alturas de las +notas de la @q{octava corta} por debajo del @notation{Do central}. +Los sufijos @code{'} (apóstrofo) o@tie{}@code{,} (coma) se añaden +para indicar octavas más agudas o más graves. A continuación se +muestra una escala que comienza en el @notation{Do central}, y un +arpegio: + +@lilypond[verbatim,quote] +{ c' d' e' f' g' a' b' c'' g c' e' g' c'' e'' g'' c''' } +@end lilypond + La manera más sencilla de introducir las notas es mediante la -utilización del modo @code{\relative} (relativo). En este modo, se -elige la octava automáticamente bajo la suposición de que la siguiente -nota se colocará siempre lo más cerca de la nota actual, es decir, se -colocará en la octava comprendida dentro de hasta tres espacios de -pentagrama a partir de la nota anterior. Comenzaremos por introducir -el fragmento musical más elemental: una @notation{escala}, donde cada -nota está comprendida dentro de tan sólo un espacio de pentagrama -desde la nota anterior. +utilización del modo @code{\relative} (relativo). En este modo, +se elige la octava automáticamente bajo la suposición de que la +siguiente nota se colocará siempre lo más cerca de la nota actual, +es decir, se colocará en la octava comprendida dentro de hasta +tres espacios de pentagrama a partir de la nota anterior. +Comenzaremos por introducir el fragmento musical más elemental: +una @notation{escala}, donde cada nota está comprendida dentro de +tan sólo un espacio de pentagrama desde la nota anterior. @lilypond[verbatim,quote] -% set the starting point to middle C -\relative c' { - c d e f +\relative { + c' d e f g a b c } @end lilypond -La nota inicial es el @notation{Do central}. Cada nota sucesiva se -coloca lo más cerca posible de la nota previa (en otras palabras: la -primera @samp{c} es el Do más cercano al Do central; a éste le sigue -el Re más cercano a la nota previa, y así sucesivamente). Podemos -crear melodías con intervalos mayores, aún sin dejar de utilizar el -modo relativo: +La nota inicial, escrita como @code{c'}, es el @notation{Do +central}. Cada nota sucesiva se coloca lo más cerca posible de la +nota previa (en otras palabras: la primera @samp{c} es el Do más +cercano al Do central; a éste le sigue el Re más cercano a la nota +previa, y así sucesivamente). Podemos crear melodías con +intervalos mayores, aún sin dejar de utilizar el modo relativo: @lilypond[verbatim,quote] -\relative c' { - d f a g +\relative { + d' f a g c b f d } @end lilypond @noindent -No es necesario que la primera nota de la melodía comience exactamente -en aquella que especifica la altura de inicio. En el ejemplo -anterior, la primera nota (@code{d}) es el Re más cercano al Do -central. +En el ejemplo anterior, la primera nota (@code{d'}, con un +apóstrofo) es el Re que está en la octava que va del Do central al +Si por encima de él. -Añadiendo (o eliminando) comillas simples @code{'} o comas @code{,} a -la instrucción @q{@w{@code{@bs{}\relative c'}}}, podemos cambiar la octava -de inicio: +Añadiendo (o eliminando) comillas simples @code{'} o comas +@code{,} a la primera nota, podemos cambiar la octava de inicio: -@c KEEP LY @lilypond[verbatim,quote] -% una octava por encima del Do central -\relative c'' { - e c a c +\relative { + e'' c a c } @end lilypond -Al principio, el modo relativo puede resultar algo confuso, pero es la -forma más sencilla de introducir la mayor parte de las melodías. -Veamos cómo funciona en la práctica este cálculo relativo. Comenzando -por Si, que está situado en la línea central en clave de Sol, podemos -alcanzar Do, Re y Mi dentro de los tres espacios de pentagrama hacia -arriba, y La, Sol y Fa dentro de los tres espacios hacia abajo. Por -tanto, si la nota siguiente a Si es Do, Re o Mi se supondrá que está -por encima del Si, mientras que La, Sol o Fa se entenderán situados -por debajo. +Al principio, el modo relativo puede resultar algo confuso, pero +es la forma más sencilla de introducir la mayor parte de las +melodías. Veamos cómo funciona en la práctica este cálculo +relativo. Comenzando por Si, que está situado en la línea central +en clave de Sol, podemos alcanzar Do, Re y Mi dentro de los tres +espacios de pentagrama hacia arriba, y La, Sol y Fa dentro de los +tres espacios hacia abajo. Por tanto, si la nota siguiente a Si +es Do, Re o Mi se supondrá que está por encima del Si, mientras +que La, Sol o Fa se entenderán situados por debajo. @c KEEP LY @lilypond[verbatim,quote] -\relative c'' { - b c % el Do está un espacio por encima, es el Do de arriba +\relative { + b' c % el Do está un espacio por encima, es el Do de arriba b d % el Re está dos por encima ó 5 por debajo, es el Re de arriba b e % el Mi está 3 por encima ó 4 por debajo, es el Mi de arriba b a % el La está 6 por encima ó 1 por debajo, es el La de abajo @@ -303,21 +312,22 @@ por debajo. } @end lilypond -Lo mismo exactamente ocurre cuando cualquiera de esas notas llevan un -sostenido o un bemol. Las @notation{Alteraciones accidentales} se -@strong{ignoran totalmente} en el cálculo de la posición relativa. -Exactamente la misma cuenta de espacios de pentagrama se hace a partir -de una nota situada en cualquier otro lugar del mismo. +Lo mismo exactamente ocurre cuando cualquiera de esas notas llevan +un sostenido o un bemol. Las @notation{Alteraciones accidentales} +se @strong{ignoran totalmente} en el cálculo de la posición +relativa. Exactamente la misma cuenta de espacios de pentagrama +se hace a partir de una nota situada en cualquier otro lugar del +mismo. -Para añadir intervalos mayores de tres espacios de pentagrama, podemos -elevar la @notation{octava} añadiendo una comilla simple @code{'} (o -apóstrofo) a continuación del nombre de la nota. También podemos -bajar la octava escribiendo una coma @code{,} a continuación del -nombre de la nota. +Para añadir intervalos mayores de tres espacios de pentagrama, +podemos elevar la @notation{octava} añadiendo una comilla simple +@code{'} (o apóstrofo) a continuación del nombre de la nota. +También podemos bajar la octava escribiendo una coma @code{,} a +continuación del nombre de la nota. @lilypond[verbatim,quote] -\relative c'' { - a a, c' f, +\relative { + a' a, c' f, g g'' a,, f' } @end lilypond @@ -325,7 +335,8 @@ nombre de la nota. @noindent Para subir o bajar una nota en dos (¡o más!) octavas, utilizamos varias @code{''} ó @code{,,} (pero tenga cuidado de utilizar dos -comillas simples @code{''} ¡y no una comilla doble @code{"}@tie{}!) +comillas simples @code{''} ¡y no una comilla doble +@code{"}@tie{}!) @c " - keeps quotes in order for context-sensitive editor -td @node Duraciones (valores rítmicos) @@ -350,31 +361,32 @@ Glosario musical: @rglos{quarter note}, @rglos{dotted note}. -La @notation{duración} de una nota se especifica mediante un número -después del nombre de la nota: @code{1} significa @notation{redonda}, -@code{2} significa @notation{blanca}, @code{4} significa -@notation{negra} y así sucesivamente. Las @notation{barras de -corchea} se añaden automáticamente. +La @notation{duración} de una nota se especifica mediante un +número después del nombre de la nota: @code{1} significa +@notation{redonda}, @code{2} significa @notation{blanca}, @code{4} +significa @notation{negra} y así sucesivamente. Las +@notation{barras de corchea} se añaden automáticamente. -Si no especifica una duración, se utiliza la duración previa para la -nota siguiente. La figura por omisión de la primera nota es una -negra. +Si no especifica una duración, se utiliza la duración previa para +la nota siguiente. La figura por omisión de la primera nota es +una negra. @lilypond[verbatim,quote] -\relative c'' { - a1 +\relative { + a'1 a2 a4 a8 a a16 a a a a32 a a a a64 a a a a a a a a2 } @end lilypond -Para crear @notation{notas con puntillo}, añada un punto @code{.} al -número de la duración. La duración de una nota con puntillo se debe -especificar de forma explícita (es decir: mediante un número). +Para crear @notation{notas con puntillo}, añada un punto @code{.} +al número de la duración. La duración de una nota con puntillo se +debe especificar de forma explícita (es decir: mediante un +número). @lilypond[verbatim,quote] -\relative c'' { - a4 a a4. a8 +\relative { + a'4 a a4. a8 a8. a16 a a8. a8 a4. } @end lilypond @@ -389,12 +401,12 @@ especificar de forma explícita (es decir: mediante un número). Glosario musical: @rglos{rest}. -Un @notation{silencio} se introduce igual que si fuera una nota con el -nombre @code{r}@tie{}: +Un @notation{silencio} se introduce igual que si fuera una nota +con el nombre @code{r}@tie{}: @lilypond[verbatim,quote] -\relative c'' { - a4 r r2 +\relative { + a'4 r r2 r8 a r4 r4. r8 } @end lilypond @@ -407,18 +419,17 @@ nombre @code{r}@tie{}: @cindex compás, indicación de @funindex \time -@funindex time Glosario musical: @rglos{time signature}. -La @notation{indicación de compás} se puede establecer con la orden -@code{\time} : +La @notation{indicación de compás} se puede establecer con la +orden @code{\time} : @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 - a4 a a + a'4 a a \time 6/8 a4. a \time 4/4 @@ -434,7 +445,6 @@ La @notation{indicación de compás} se puede establecer con la orden @cindex metronómicas, indicaciones @funindex \tempo -@funindex tempo Glosario musical: @rglos{tempo indication}, @@ -444,10 +454,10 @@ La @notation{indicación de tempo} y la @notation{indicación metronómica} pueden establecerse con la instrucción @code{\tempo}: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 \tempo "Andante" - a4 a a + a'4 a a \time 6/8 \tempo 4. = 96 a4. a @@ -473,7 +483,6 @@ metronómica} pueden establecerse con la instrucción @code{\tempo}: @cindex bajo @funindex \clef -@funindex clef Glosario musical: @rglos{clef}. @@ -482,9 +491,9 @@ La @notation{clave} se puede establecer utilizando la orden @code{\clef} : @lilypond[verbatim,quote] -\relative c' { +\relative { \clef "treble" - c1 + c'1 \clef "alto" c1 \clef "tenor" @@ -499,15 +508,15 @@ La @notation{clave} se puede establecer utilizando la orden @unnumberedsubsubsec Todo junto @translationof All together -He aquí un pequeño ejemplo que muestra todos los elementos anteriores -juntos: +He aquí un pequeño ejemplo que muestra todos los elementos +anteriores juntos: @lilypond[verbatim,quote] -\relative c, { +\relative { \clef "bass" \time 3/4 \tempo "Andante" 4 = 120 - c2 e8 c' + c,2 e8 c' g'2. f4 e d c4 c, r @@ -546,23 +555,25 @@ Referencia de la notación: @funindex % @funindex %@{ ... %@} -Los archivos de entrada de LilyPond son como los archivos fuente de -muchos lenguajes de programación corrientes. Contienen un enunciado -de versión, son sensibles a las mayúsculas y generalmente los espacios -se ignoran. Las expresiones se forman con llaves @w{@code{@{ @}}} y los -comentarios se denotan por un signo de porcentaje (@code{%}) o por -@w{@code{%@{ @dots{} %@}}}@tie{}. +Los archivos de entrada de LilyPond son como los archivos fuente +de muchos lenguajes de programación corrientes. Contienen un +enunciado de versión, son sensibles a las mayúsculas y +generalmente los espacios se ignoran. Las expresiones se forman +con llaves @w{@code{@{ @}}} y los comentarios se denotan por un +signo de porcentaje (@code{%}) o por @w{@code{%@{ @dots{} +%@}}}@tie{}. -Si la frase anterior no tiene sentido para usted ¡no se preocupe! A -continuación explicaremos el significado de todos estos términos: +Si la frase anterior no tiene sentido para usted ¡no se preocupe! +A continuación explicaremos el significado de todos estos +términos: @itemize @item @strong{Enunciado de la versión}: Todo archivo de LilyPond debe contener un enunciado de versión. Un enunciado de versión es una -línea que describe la versión de LilyPond para la que se escribió este -archivo, como en el ejemplo siguiente: +línea que describe la versión de LilyPond para la que se escribió +este archivo, como en el ejemplo siguiente: @example \version "@w{@version{}}" @@ -571,25 +582,26 @@ archivo, como en el ejemplo siguiente: Por convenio, el enunciado de versión se coloca al principio del archivo de LilyPond. -El enunciado de versión es importante por dos motivos como mínimo. En -primer lugar, permite la actualización automática del código de +El enunciado de versión es importante por dos motivos como mínimo. +En primer lugar, permite la actualización automática del código de entrada conforme se va modificando la sintaxis de LilyPond. En segundo lugar, indica la versión de LilyPond que se necesita para compilar el archivo. -Si no se escribe ningún enunciado de versión en el archivo de entrada, -LilyPond imprime una advertencia durante la compilación del mismo. +Si no se escribe ningún enunciado de versión en el archivo de +entrada, LilyPond imprime una advertencia durante la compilación +del mismo. @item -@strong{Sensible a las mayúsculas}: tiene importancia el hecho de que -introduzca una letra en minúsculas (p.ej. @w{@code{a, b, s, t}}) o en -mayúsculas (p.ej. @w{@code{A, B, S, T}}). Las notas son minúsculas: -@w{@samp{@{ c d e @}}} es una entrada válida; @w{@samp{@{ C D E @}}} -produciría un mensaje de error. +@strong{Sensible a las mayúsculas}: tiene importancia el hecho de +que introduzca una letra en minúsculas (p.ej. @w{@code{a, b, s, t}}) +o en mayúsculas (p.ej. @w{@code{A, B, S, T}}). Las notas son +minúsculas: @w{@samp{@{ c d e @}}} es una entrada válida; +@w{@samp{@{ C D E @}}} produciría un mensaje de error. @item -@strong{Insensible al número de espacios}: no importa cuántos espacios -(o saltos de línea o de tabulación) añada. +@strong{Insensible al número de espacios}: no importa cuántos +espacios (o saltos de línea o de tabulación) añada. @w{@samp{@{ c4 d e @}}} significa lo mismo que @w{@samp{@{ c4 @tie{} @tie{} @tie{} d e @}}} y que @@ -610,36 +622,38 @@ tabulación, o bien con dos espacios: @end example Sin embargo, @emph{sí} se necesitan espacios para separar muchos -elementos sintácticos unos de otros. En otras palabras, los espacios -se pueden siempre @emph{añadir}, pero no siempre @emph{eliminar}. -Dado que la falta de espacios puede dar lugar a extraños errores, -recomendamos insertar espacios siempre antes y después de cualquier -elemento sintáctico, por ejemplo, antes y después de las llaves. +elementos sintácticos unos de otros. En otras palabras, los +espacios se pueden siempre @emph{añadir}, pero no siempre +@emph{eliminar}. Dado que la falta de espacios puede dar lugar a +extraños errores, recomendamos insertar espacios siempre antes y +después de cualquier elemento sintáctico, por ejemplo, antes y +después de las llaves. @item @strong{Expresiones:} Todo fragmento de código de entrada para -LilyPond ha de llevar @strong{@{@tie{}llaves@tie{}@}} antes y después de la -entrada. Estas llaves le dicen a LilyPond que la entrada es una -expresión musical unitaria, igual que los paréntesis @samp{()} de las -matemáticas. Las llaves deben ir rodeadas de un espacio a no ser que -se encuentren al comienzo o al final de una línea, para evitar -cualquier ambigüedad. +LilyPond ha de llevar @strong{@{@tie{}llaves@tie{}@}} antes y +después de la entrada. Estas llaves le dicen a LilyPond que la +entrada es una expresión musical unitaria, igual que los +paréntesis @samp{()} de las matemáticas. Las llaves deben ir +rodeadas de un espacio a no ser que se encuentren al comienzo o al +final de una línea, para evitar cualquier ambigüedad. Una instrucción de LilyPond seguida de una expresión simple entre -llaves (como por ejemplo @q{@w{@code{@bs{}relative c' @{ @dots{} @}}}}) también es una -expresión musical unitaria. +llaves (como por ejemplo @q{@w{@code{@bs{}relative @{ @dots{} +@}}}}) también es una expresión musical unitaria. @cindex comentarios @cindex comentario de línea @cindex comentario de bloque @item -@strong{Comentarios}: Un comentario es una nota para el lector humano -de la entrada musical; se ignora cuando esta entrada se analiza, de -manera que no tiene ningún efecto sobre la salida impresa. Existen -dos tipos de comentarios. El símbolo de porcentaje @samp{%} introduce -un comentario de línea; todo lo que se encuentra después de @samp{%} -en esa línea se ignora. Por convenio, una línea de comentario se -coloca @emph{por encima} del código a que se refiere el comentario. +@strong{Comentarios}: Un comentario es una nota para el lector +humano de la entrada musical; se ignora cuando esta entrada se +analiza, de manera que no tiene ningún efecto sobre la salida +impresa. Existen dos tipos de comentarios. El símbolo de +porcentaje @samp{%} introduce un comentario de línea; todo lo que +se encuentra después de @samp{%} en esa línea se ignora. Por +convenio, una línea de comentario se coloca @emph{por encima} del +código a que se refiere el comentario. @example a4 a a a @@ -647,13 +661,14 @@ a4 a a a b2 b @end example -Un comentario de bloque marca una sección entera de entrada musical -como comentario. Todo lo que está encerrado dentro de @code{%@{} y -@code{%@}} se ignora (pero los comentarios no pueden anidarse, lo que -significa que un comentario de bloque no puede incluir otros -comentarios de bloque). Si lo hiciera, el primer @code{%@}} daría por -terminado @emph{los dos} comentarios de bloque. El siguiente -fragmento muestra algunos posibles usos para los comentarios: +Un comentario de bloque marca una sección entera de entrada +musical como comentario. Todo lo que está encerrado dentro de +@code{%@{} y @code{%@}} se ignora (pero los comentarios no pueden +anidarse, lo que significa que un comentario de bloque no puede +incluir otros comentarios de bloque). Si lo hiciera, el primer +@code{%@}} daría por terminado @emph{los dos} comentarios de +bloque. El siguiente fragmento muestra algunos posibles usos para +los comentarios: @example % a continuación van las notas de campanitas del lugar @@ -691,11 +706,11 @@ pudiera encontrar. @translationof General troubleshooting tips La solución de problemas en LilyPond puede ser un desafío para las -personas acostumbradas a los interfaces gráficos, porque es posible -crear archivos de entrada inválidos. Cuando esto ocurre, la mejor -forma de identificar y resolver el problema es aplicar un enfoque -lógico. Se dan algunas guías para ayudarle a aprender a hacerlo, en -@rprogram{Solución de problemas}. +personas acostumbradas a los interfaces gráficos, porque es +posible crear archivos de entrada inválidos. Cuando esto ocurre, +la mejor forma de identificar y resolver el problema es aplicar un +enfoque lógico. Se dan algunas guías para ayudarle a aprender a +hacerlo, en @rprogram{Solución de problemas}. @node Algunos errores comunes @@ -705,18 +720,18 @@ lógico. Se dan algunas guías para ayudarle a aprender a hacerlo, en @cindex comunes, errores @cindex errores comunes -Existen algunos errores comunes que son difíciles de solucionar si nos -basamos solamente en los mensajes de error que se nos presentan. -Éstos se describen en @rprogram{Errores comunes}. +Existen algunos errores comunes que son difíciles de solucionar si +nos basamos solamente en los mensajes de error que se nos +presentan. Éstos se describen en @rprogram{Errores comunes}. @node Cómo leer los manuales @section Cómo leer los manuales @translationof How to read the manuals -Esta sección muestra cómo leer la documentación de forma eficiente, y -presenta algunas interesantes funcionalidades interactivas de la -versión en línea. +Esta sección muestra cómo leer la documentación de forma +eficiente, y presenta algunas interesantes funcionalidades +interactivas de la versión en línea. @menu * Material omitido:: @@ -741,31 +756,19 @@ versión en línea. @cindex archivos, consejos para construir Como ya vimos en @ref{Trabajar sobre los archivos de entrada}, el -código de entrada de LilyPond debe estar rodeado de llaves @code{@{ @}} o de -@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}}. Durante el resto del presente -manual, la mayor parte de los ejemplos omitirán las llaves. Para -reproducir los ejemplos, deberá copiar y pegar la entrada que se -muestra, pero @strong{deberá} escribir el @q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}}, -de la siguiente forma: +código de entrada de LilyPond debe estar rodeado de llaves +@code{@{ @}} o de @q{@w{@code{@bs{}relative @{ @dots{} @}}}}. +Durante el resto del presente manual, ciertos ejemplos breves +omitirán las llaves. Para reproducir estos ejemplos puede copiar +la entrada que se muestra, pero debe pegarla entre @code{@{} y +@code{@}} dentro del archivo de entrada. @example -\relative c'' @{ +@{ @dots{}aquí va el ejemplo@dots{} @} @end example -¿Por qué omitir las llaves? Casi todos los ejemplos del presente -manual se pueden insertar en medio de un fragmento mayor de música. -Para estos ejemplos no tiene ningún sentido añadir -@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} -(¡no debería poner un @code{\relative} dentro de otro -@code{\relative}!); si hubiésemos incluido -@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} -rodeando a cada uno de los ejemplos, usted no podría copiar un -ejemplo pequeño procedente de la documentación y pegarlo dentro de su -propia pieza. La mayoría querrá insertar el código dentro de una -pieza más grande, por eso hemos formateado el manual de esta manera. - Asimismo, recuerde que todo archivo de LilyPond debe llevar un enunciado @code{\version}. Dado que los ejemplos de los manuales son fragmentos de código y no archivos completos, el enunciado @@ -776,28 +779,29 @@ a incluirlo en nuestros documentos. @subsection Ejemplos con enlace @translationof Clickable examples -@warning{Esta funcionalidad sólo está disponible en los manuales en -HTML.} +@warning{Esta funcionalidad sólo está disponible en los manuales +en HTML.} -Muchas personas aprenden a utilizar programas probando y enredando con -ellos. Esto también puede hacerse con LilyPond. Si hace clic sobre -una imagen en la versión en HTML de este manual, podrá ver la entrada -exacta de LilyPond que se utilizó para generar esa imagen. Pruébelo -sobre esta imagen: +Muchas personas aprenden a utilizar programas probando y enredando +con ellos. Esto también puede hacerse con LilyPond. Si hace clic +sobre una imagen en la versión en HTML de este manual, podrá ver +la entrada exacta de LilyPond que se utilizó para generar esa +imagen. Pruébelo sobre esta imagen: @c no verbatim here @c KEEP LY @lilypond[quote] -\relative c'' { - c4-\markup { \bold \huge { Haga clic aquí. } } +\relative { + c''4-\markup { \bold \huge { Haga clic aquí. } } } @end lilypond Cortando y pegando todo lo que se encuentra dentro de la sección -@qq{ly snippet} (fragmento de tipo ly), tendrá una plantilla inicial -para sus experimentos. Para poder ver exactamente el mismo resultado -(con igual anchura de línea y todo), copie todo lo que está desde -@qq{Start cut-&-pastable section} hasta el final del archivo. +@qq{ly snippet} (fragmento de tipo ly), tendrá una plantilla +inicial para sus experimentos. Para poder ver exactamente el mismo +resultado (con igual anchura de línea y todo), copie todo lo que +está desde @qq{Start cut-&-pastable section} hasta el final del +archivo. @ignore @@ -819,10 +823,10 @@ Estamos trabajando sobre esta funcionalidad. @subsection Panorámica de los manuales @translationof Overview of manuals -Existe abundantísima documentación sobre LilyPond. Con frecuencia, -los nuevos usuarios se encuentran desorientados respecto a qué parte o -partes deben leer, y ocasionalmente pasan por alto la lectura de -partes de importancia vital. +Existe abundantísima documentación sobre LilyPond. Con +frecuencia, los nuevos usuarios se encuentran desorientados +respecto a qué parte o partes deben leer, y ocasionalmente pasan +por alto la lectura de partes de importancia vital. @warning{Por favor: no se salte las partes importantes de la documentación. Le resultará mucho más difícil comprender las @@ -832,24 +836,26 @@ secciones subsiguientes.} @item @strong{Antes de intentar hacer @emph{cualquier cosa}}: lea el -@ref{Tutorial} del manual de Aprendizaje, y la sección @ref{Notación -corriente}. Si encuentra términos musicales que no reconoce, -búsquelos en el @rglosnamed{Top, Glosario}. +@ref{Tutorial} del manual de Aprendizaje, y la sección +@ref{Notación corriente}. Si encuentra términos musicales que no +reconoce, búsquelos en el @rglosnamed{Top, Glosario}. @item -@strong{Antes de tratar de escribir una pieza completa de música}: lea -la sección @ref{Conceptos fundamentales} del manual de Aprendizaje. -Después, le vendrá bien consultar las secciones correspondientes de la -@rusernamed{Top, Referencia de la notación}. +@strong{Antes de tratar de escribir una pieza completa de música}: +lea la sección @ref{Conceptos fundamentales} del manual de +Aprendizaje. Después, le vendrá bien consultar las secciones +correspondientes de la @rusernamed{Top, Referencia de la +notación}. @item -@strong{Antes de tratar de modificar los resultados predeterminados}: -lea la sección @ref{Trucar la salida} del manual de Aprendizaje. +@strong{Antes de tratar de modificar los resultados +predeterminados}: lea la sección @ref{Trucar la salida} del manual +de Aprendizaje. @item @strong{Antes de afrontar un proyecto grande}: lea la sección -@rprogramnamed{Suggestions for writing files,Sugerencias para escribir -archivos de entrada de LilyPond} del manual de Utilización del -programa. +@rprogramnamed{Suggestions for writing files,Sugerencias para +escribir archivos de entrada de LilyPond} del manual de +Utilización del programa. @end itemize diff --git a/Documentation/es/learning/tweaks.itely b/Documentation/es/learning/tweaks.itely index 87be1fdb1e..451fb6b598 100644 --- a/Documentation/es/learning/tweaks.itely +++ b/Documentation/es/learning/tweaks.itely @@ -1,21 +1,22 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 7fdce4f39834cc8c83f176480cc1d20900eb09f8 + Translation of GIT committish: 5ae5c88bdb1a478263ed874cb823ec58dafc93f9 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.20" +@c \version "2.19.22" @node Trucar la salida @chapter Trucar la salida @translationof Tweaking output -Este capítulo trata de cómo modificar la salida. LilyPond es extremadamente -configurable; prácticamente todos los fragmentos de la salida se pueden cambiar. +Este capítulo trata de cómo modificar la salida. LilyPond es +extremadamente configurable; prácticamente todos los fragmentos de +la salida se pueden cambiar. @menu @@ -46,20 +47,20 @@ configurable; prácticamente todos los fragmentos de la salida se pueden cambiar El @q{Trucaje} es un término de LilyPond que denota los diversos métodos que el usuario tiene a su disposición para modificar el proceso de interpretación del archivo de entrada y cambiar la -apariencia de la salida impresa. Algunos trucos son muy fáciles de -usar; otros son más complejos. Pero en su conjunto, los métodos de -trucaje disponibles posibilitan conseguir casi cualquier apariencia -que deseemos en la música impresa. +apariencia de la salida impresa. Algunos trucos son muy fáciles +de usar; otros son más complejos. Pero en su conjunto, los +métodos de trucaje disponibles posibilitan conseguir casi +cualquier apariencia que deseemos en la música impresa. En esta sección vamos a estudiar los conceptos básicos que se necesitan para comprender el trucaje. Más tarde daremos un amplio abanico de instrucciones listas para usar, que podrá simplemente copiar para obtener el mismo efecto en sus partituras, y al mismo -tiempo mostraremos la forma de construir dichas instrucciones para que -pueda aprender cómo desarrollar sus propios trucos. +tiempo mostraremos la forma de construir dichas instrucciones para +que pueda aprender cómo desarrollar sus propios trucos. -Antes de comenzar con este capítulo, quizá quiera echar un vistazo a -la sección @ref{Contextos y grabadores}, pues los Contextos, los +Antes de comenzar con este capítulo, quizá quiera echar un vistazo +a la sección @ref{Contextos y grabadores}, pues los Contextos, los Grabadores y las Propiedades que se contienen en ellos son fundamentales para comprender y construir los trucos. @@ -81,53 +82,71 @@ interna del programa LilyPond, por lo que en primer lugar introduciremos algunos términos que se usan para describir dichas operaciones y estructuras internas. -El término @q{Objeto} es un término genérico que se usa para referirse -a la multitud de estructuras internas que LilyPond construye durante -el procesado de un archivo de entrada. Así, cuando se encuentra una -instrucción como @code{\new Staff}, se construye un objeto nuevo del -tipo @code{Staff}. Entonces, este objeto @code{Staff} contiene todas -las propiedades asociadas con ese pentagrama en particular, por -ejemplo, su nombre y su armadura, además de otros detalles de los -grabadores que se han asignado para que operen dentro del contexto del -pentagrama. De forma similar, hay objetos que guardan las propiedades -de todos los demás contextos, como objetos de @code{Voice}, objetos de +El término @q{Objeto} es un término genérico que se usa para +referirse a la multitud de estructuras internas que LilyPond +construye durante el procesado de un archivo de entrada. Así, +cuando se encuentra una instrucción como @code{\new Staff}, se +construye un objeto nuevo del tipo @code{Staff}. Entonces, este +objeto @code{Staff} contiene todas las propiedades asociadas con +ese pentagrama en particular, por ejemplo, su nombre y su +armadura, además de otros detalles de los grabadores que se han +asignado para que operen dentro del contexto del pentagrama. De +forma similar, hay objetos que guardan las propiedades de todos +los demás contextos, como objetos de @code{Voice}, objetos de @code{Score}, objetos de @code{Lyrics}, así como objetos que -representan todos los elementos notacionales como líneas divisorias, -cabezas de las notas, ligaduras, indicaciones dinámicas, etc. Cada -objeto tiene su propio conjunto de valores de propiedad. - -Ciertos tipos de objetos reciben nombres especiales. Los objetos que -representan elementos de notación sobre la salida impresa como cabezas -de notas, plicas, ligaduras de expresión y de unión, digitaciones, -claves, etc. reciben el nombre de @q{Objetos de presentación}, a -menudo conocidos como @q{Objetos gráficos}, o abreviadamente -@q{Grobs}. Aún son objetos en el sentido genérico que hemos -mencionado, y también todos ellos tienen propiedades asociadas, como -su posición, tamaño, color,etc. +representan todos los elementos notacionales como líneas +divisorias, cabezas de las notas, ligaduras, indicaciones +dinámicas, etc. Cada objeto tiene su propio conjunto de valores +de propiedad. + +Ciertos tipos de objetos reciben nombres especiales. Los objetos +que representan elementos de notación sobre la salida impresa como +cabezas de notas, plicas, ligaduras de expresión y de unión, +digitaciones, claves, etc. reciben el nombre de @q{Objetos de +presentación}, a menudo conocidos como @q{Objetos gráficos}, o +abreviadamente @q{Grobs}. Aún son objetos en el sentido genérico +que hemos mencionado, y también todos ellos tienen propiedades +asociadas, como su posición, tamaño, color,etc. Ciertos objetos de presentación son aún más especializados. Las -ligaduras de fraseo, los reguladores, las indicaciones de octava alta -y baja, y muchos otros objetos gráficos no están situados en un solo -lugar: tienen un punto de inicio, un punto de final, y quizá otras -propiedades relacionadas con su forma. Los objetos con una forma -extendida como estos, reciben el nombre de «Objetos de extensión» o -@q{Spanners}. - -Aún falta por explicar qué son los @q{Interfaces}. Muchos objetos, -incluso aunque son bastante diferentes, comparten funcionalidades que -se deben procesar de la misma manera. Por ejemplo, todos los objetos -gráficos tienen un color, un tamaño, una posición, etc., y todas estas -propiedades se procesan de la misma forma durante la interpretación -del archivo de entrada por parte de LilyPond. Para simplificar estas -operaciones internas, estas acciones y propiedades comunes se agrupan -en un objeto llamado @code{grob-interface}, interface de grob. Hay -muchas otras agrupaciones de propiedades comunes como ésta, y cada -una recibe un nombre que acaba en @code{interface}. En total hay más -de 100 interfaces de éstos. Veremos más adelante porqué esto es del -interés y de utilidad para el usuario. - -Estos son, en fin, los términos principales relativos a los objetos -que vamos a utilizar en este capítulo. +ligaduras de fraseo, los reguladores, las indicaciones de octava +alta y baja, y muchos otros objetos gráficos no están situados en +un solo lugar: tienen un punto de inicio, un punto de final, y +quizá otras propiedades relacionadas con su forma. Los objetos +con una forma extendida como estos, reciben el nombre de «Objetos +de extensión» o @q{Spanners}. + +Los «spanners» no se pueden trucar después de haberse creado. +Ello incluye tanto a @code{StaffSymbol} como a +@code{LedgerLineSpanner}, que continúan a lo largo de toda la +partitura (excepto si se les da fin con la instrucción +@code{\stopStaff} y se vuelven a crear con la instrucción +@code{\startStaff}. + +Es más, existen objetos gráficos @q{abstractos} que no impriman +nada por sí mismos, sino que más bien recopilan, posicionan y +gestionan a otros objetos gráficos. Los ejemplos usuales son +@code{DynamicLineSpanner}, @code{BreakAlignment}, +@code{NoteColumn}, @code{VerticalAxisGroup}, +@code{NonMusicalPaperColumn} y similares. Más tarde veremos cómo +se usan algunos de ellos. + +Aún falta por explicar qué son los @q{Interfaces}. Muchos +objetos, incluso aunque son bastante diferentes, comparten +funcionalidades que se deben procesar de la misma manera. Por +ejemplo, todos los objetos gráficos tienen un color, un tamaño, +una posición, etc., y todas estas propiedades se procesan de la +misma forma durante la interpretación del archivo de entrada por +parte de LilyPond. Para simplificar estas operaciones internas, +estas acciones y propiedades comunes se agrupan en un objeto +llamado @code{grob-interface}, interface de grob. Hay muchas +otras agrupaciones de propiedades comunes como ésta, y cada una +recibe un nombre que acaba en @code{interface}. En total hay más +de 100 interfaces de éstos. Veremos más adelante porqué esto es +del interés y de utilidad para el usuario. + +Estos son, en fin, los términos principales relativos a los +objetos que vamos a utilizar en este capítulo. @node Convenciones de nombres de objetos y propiedades @subsection Convenciones de nombres de objetos y propiedades @@ -177,6 +196,11 @@ objeto se modifican por parte de diferentes instrucciones; así pues, es útil poder reconocer los tipos de objetos y propiedades a partir de sus nombres. +@seealso +Referencia de la notación: +@ruser{Modificar las propiedades}. + + @node Métodos de trucaje @subsection Métodos de trucaje @translationof Tweaking methods @@ -201,21 +225,22 @@ a partir de sus nombres. @cindex override (sobreescritura), sintaxis de @funindex \override -@funindex override - -Ya hemos visto las instrucciones @code{\set} y @code{\with}, que se -usan para cambiar las propiedades de los @strong{contextos} y para -quitar y poner @strong{grabadores}, en @ref{Modificar las propiedades de los contextos} -y @ref{Añadir y eliminar grabadores}. Ahora debemos -examinar algunas otras instrucciones importantes. - -La instrucción que cambia las propiedades de los @strong{objetos de -presentación} es @code{\override}. Puesto que esta instrucción debe -modificar propiedades internas que se encuentran en un lugar profundo -dentro de LilyPond, su sintaxis no es tan simple como la del resto de -las instrucciones que hemos usado hasta ahora. Tiene que saber -exactamente qué propiedad de qué objeto y en qué contexto se debe -modificar, y cuál debe ser su nuevo valor. Veamos cómo se hace. + +Ya hemos visto las instrucciones @code{\set} y @code{\with}, que +se usan para cambiar las propiedades de los @strong{contextos} y +para quitar y poner @strong{grabadores}, en +@ref{Modificar las propiedades de los contextos} y +@ref{Añadir y eliminar grabadores}. Ahora debemos examinar +algunas otras instrucciones importantes. + +La instrucción que cambia las propiedades de los @strong{objetos +de presentación} es @code{\override}. Puesto que esta instrucción +debe modificar propiedades internas que se encuentran en un lugar +profundo dentro de LilyPond, su sintaxis no es tan simple como la +del resto de las instrucciones que hemos usado hasta ahora. Tiene +que saber exactamente qué propiedad de qué objeto y en qué +contexto se debe modificar, y cuál debe ser su nuevo valor. +Veamos cómo se hace. La sintaxis genérica de esta instrucción es: @@ -231,16 +256,17 @@ nombre @var{ObjetoDePresentación}, que es miembro del contexto @var{Contexto}, al valor @var{valor}. El @var{contexto} se puede omitir (y normalmente así es) cuando el -contexto requerido se encuentra implicado sin ambigüedad y es uno de -los contextos del nivel más bajo, es decir: @code{Voice}, -@code{ChordNames} o @code{Lyrics}, y lo omitiremos en muchos de los -ejemplos siguientes. Veremos más tarde cuándo se debe especificar. - -Las últimas secciones tratan de forma exhaustiva las propiedades y sus -valores, véase @ref{Tipos de propiedades}. Pero en esta sección -usaremos sólo unas cuantas propiedades y valores -sencillos que sean fáciles de entender, para ilustrar el formato -y la utilización de estas instrucciones. +contexto requerido se encuentra implicado sin ambigüedad y es uno +de los contextos del nivel más bajo, es decir: @code{Voice}, +@code{ChordNames} o @code{Lyrics}, y lo omitiremos en muchos de +los ejemplos siguientes. Veremos más tarde cuándo se debe +especificar. + +Las últimas secciones tratan de forma exhaustiva las propiedades y +sus valores, véase @ref{Tipos de propiedades}. Pero en esta +sección usaremos sólo unas cuantas propiedades y valores sencillos +que sean fáciles de entender, para ilustrar el formato y la +utilización de estas instrucciones. Las expresiones principales de LilyPond son elementos musicales como notas, duraciones y elementos de marcado. Las expresiones @@ -252,21 +278,22 @@ música de LilyPond, este manual utiliza siempre @samp{#} para la escritura, por coherencia. Para ver más información acerca del modo de Scheme, consulte @rextend{Sintaxis del Scheme de LilyPond}. -@code{\override} es la -instrucción de uso más común dentro del trucaje, y durante la mayor -parte del resto de este capítulo presentaremos ejemplos de cómo se -usa. A continuación hay un ejemplo sencillo para cambiar el color de -una cabeza: +@code{\override} es la instrucción de uso más común dentro del +trucaje, y durante la mayor parte del resto de este capítulo +presentaremos ejemplos de cómo se usa. A continuación hay un +ejemplo sencillo para cambiar el color de una cabeza: @cindex color, propiedad, ejemplo @cindex NoteHead, ejemplo de sobreescritura -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a b c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a b c | +} @end lilypond @@ -277,14 +304,13 @@ g4 a b c | @cindex revert, instrucción @funindex \revert -@funindex revert -Una vez sobreescrita, la propiedad retiene su nuevo valor hasta que -se sobreescribe de nuevo o se encuentra una instrucción +Una vez sobreescrita, la propiedad retiene su nuevo valor hasta +que se sobreescribe de nuevo o se encuentra una instrucción @code{\revert}. La instrucción @code{\revert} tiene la siguiente sintaxis y ocasiona que el valor de la propiedad se devuelva a su -valor predeterminado original; observe que no es a su valor previo si -se han utilizado varias instrucciones @code{\override}. +valor predeterminado original; observe que no es a su valor previo +si se han utilizado varias instrucciones @code{\override}. @example \revert @var{Contexto}.@var{ObjetoDePresentación}.@var{propiedad-de-presentación} @@ -293,20 +319,22 @@ se han utilizado varias instrucciones @code{\override}. Una vez más, igual que @var{Contexto} dentro de la instrucción @code{\override}, con frecuencia no es necesario especificar el @var{Contexto}. Se omitirá en muchos de los ejemplos siguientes. -Aquí devolvemos el color de la cabeza al valor predeterminado para las -dos últimas notas: +Aquí devolvemos el color de la cabeza al valor predeterminado para +las dos últimas notas: @cindex color, propiedad, ejemplo @cindex NoteHead, ejemplo de sobreescritura -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a -\revert NoteHead.color -b4 c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a + \revert NoteHead.color + b4 c | +} @end lilypond @@ -315,49 +343,47 @@ b4 c | @translationof The once prefix @funindex \once -@funindex once -Tanto la instrucción @code{\override} como @code{\set} se pueden -preceder por @code{\once}. Esto ocasiona que la siguiente instrucción -@code{\override} o @code{\set} sea efectiva solamente durante el -tiempo musical en curso y antes de que la propiedad vuelva a tener -otra vez su valor anterior (que puede ser distinto de su valor -predeterminado si aún se está aplicando otra instrucción -@code{\override} de sobreescritura). Utilizando el mismo ejemplo, -podemos cambiar el color de una sola nota de la siguiente manera: +@code{\override}, @code{\revert}, @code{\set} y @code{\unset} se +pueden hacer preceder por @code{\once}. Esto hace que la +instrucción sea efectiva solamente durante el tiempo musical en +curso y antes de que la propiedad vuelva a tener otra vez su valor +anterior (que puede ser distinto de su valor predeterminado si aún +se está aplicando otra instrucción @code{\override} de +sobreescritura). Utilizando el mismo ejemplo, podemos cambiar el +color de una sola nota de la siguiente manera: @cindex color, propiedad, ejemplo @cindex NoteHead, ejemplo de sobreescritura -@lilypond[quote,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\once \override NoteHead.color = #green -g4 a -\revert NoteHead.color -b c | +@lilypond[quote,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \once \override NoteHead.color = #green + g4 a + \once \revert NoteHead.color + b c | + \revert NoteHead.color + f2 c | +} @end lilypond El prefijo @code{\once} también se puede usar delante de muchas -instrucciones predefinidas para limitar su efecto a un solo momento -musical: - -@lilypond[quote,verbatim,relative=1] -c4 d -\once \stemDown -e4 f | -g4 a -\once \hideNotes -b c | -@end lilypond - -Sin embargo, las instrucciones predefinidas de la forma -@code{\@dots{}Neutral}, -@code{\@dots{}Off} y @code{\un@dots{}} utilizan -internamente @code{\revert} en vez de @code{\override}, por lo que -añadir @code{\once} como prefijo aquí no tiene ningún efecto. +instrucciones predefinidas para limitar su efecto a un solo +momento musical: +@lilypond[quote,verbatim] +\relative { + c'4( d) + \once \slurDashed + e4( f) | + g4( a) + \once \hideNotes + b( c) | +} +@end lilypond @node La instrucción overrideProperty @unnumberedsubsubsec La instrucción @code{@bs{}overrideProperty} @@ -366,12 +392,11 @@ añadir @code{\once} como prefijo aquí no tiene ningún efecto. @cindex overrideProperty, instrucción @funindex \overrideProperty -@funindex overrideProperty Hay otra forma para la instrucción de sobreescritura, @code{\overrideProperty}, que ocasionalmente es necesaria. La -mencionamos aquí con un propósito de exhaustividad, pero para ver más -detalles consulte @rextend{Trucos difíciles}. +mencionamos aquí con un propósito de exhaustividad, pero para ver +más detalles consulte @rextend{Trucos difíciles}. @c Maybe explain in a later iteration -td @@ -382,16 +407,14 @@ detalles consulte @rextend{Trucos difíciles}. @cindex tweak, instrucción @funindex \tweak -@funindex tweak -La última instrucción de trucaje que está disponible es @code{\tweak}. -Se debe utilizar cuando varios objetos tienen lugar -en el mismo momento musical pero solo queremos cambiar las propiedades -de algunos de ellos, como una sola nota dentro de un acorde. -El uso de -@code{\override} para la sobreescritura afectaría a todas las notas -del acorde, mientras que @code{\tweak} afecta solamente al siguiente -elemento del flujo de entrada. +La última instrucción de trucaje que está disponible es +@code{\tweak}. Se debe utilizar cuando varios objetos tienen +lugar en el mismo momento musical pero solo queremos cambiar las +propiedades de algunos de ellos, como una sola nota dentro de un +acorde. El uso de @code{\override} para la sobreescritura +afectaría a todas las notas del acorde, mientras que @code{\tweak} +afecta solamente al siguiente elemento del flujo de entrada. He aquí un ejemplo. Suponga que queremos cambiar el tamaño de la cabeza de la nota intermedia (el Mi) en un acorde de Do mayor. En @@ -400,45 +423,49 @@ primer lugar, veamos lo que haría @code{\once \override}: @cindex font-size, propiedad, ejemplo @cindex NoteHead, ejemplo de sobreescritura -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -\once \override NoteHead.font-size = #-3 -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + \once \override NoteHead.font-size = #-3 + 4 + 4 +} @end lilypond Vemos que la sobreescritura con override afecta a @emph{todas} las -cabezas de las notas del acorde. Esto es así porque todas las notas -de un acorde ocurren en el mismo @emph{momento musical}, y la acción -de @code{\once} es aplicar la sobreescritura a todos los objetos de -presentación del tipo especificado que ocurren en el mismo momento -musical que la propia instrucción de sobreescritura @code{\override}. - -La instrucción @code{\tweak} opera de una forma distinta. Actúa sobre -el elemento inmediatamente siguiente dentro del flujo de entrada. -En su forma más sencilla es efectivo solamente sobre objetos -que se crean directamente -a partir del elemento siguiente, en esencia las cabezas y las -articulaciones. - -Así pues, volviendo a nuestro ejemplo, el tamaño de la nota intermedia -se cambiaría de la siguiente forma: +cabezas de las notas del acorde. Esto es así porque todas las +notas de un acorde ocurren en el mismo @emph{momento musical}, y +la acción de @code{\once} es aplicar la sobreescritura a todos los +objetos de presentación del tipo especificado que ocurren en el +mismo momento musical que la propia instrucción de sobreescritura +@code{\override}. + +La instrucción @code{\tweak} opera de una forma distinta. Actúa +sobre el elemento inmediatamente siguiente dentro del flujo de +entrada. En su forma más sencilla es efectivo solamente sobre +objetos que se crean directamente a partir del elemento siguiente, +en esencia las cabezas y las articulaciones. + +Así pues, volviendo a nuestro ejemplo, el tamaño de la nota +intermedia se cambiaría de la siguiente forma: @cindex font-size, propiedad, ejemplo @cindex @code{\tweak}, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + 4 +} @end lilypond Observe que la sintaxis de @code{\tweak} no es igual que la de -@code{\override}. El contexto no se -debe especificar; de hecho, generaría un error hacerlo. -Tanto el contexto como el objeto de presentación -están implícitos por el siguiente elemento del flujo de entrada. -Observe también que no debe haber un signo igual. Así que la sintaxis -de la instrucción @code{\tweak} en su forma sencilla es: +@code{\override}. El contexto no se debe especificar; de hecho, +generaría un error hacerlo. Tanto el contexto como el objeto de +presentación están implícitos por el siguiente elemento del flujo +de entrada. Observe también que no debe haber un signo igual. Así +que la sintaxis de la instrucción @code{\tweak} en su forma +sencilla es: @example \tweak @var{propiedad-de-presentación} #@var{valor} @@ -450,39 +477,41 @@ sólo una de una serie de articulaciones, como se muestra aquí: @cindex color, propiedad, ejemplo @cindex @code{\tweak}, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -a4^"Black" +@lilypond[quote,fragment,ragged-right,verbatim] +a'4^"Black" -\tweak color #red ^"Red" -\tweak color #green _"Green" @end lilypond @noindent -Observe que la instrucción @code{\tweak} debe venir precedida de una -marca de articulación porque la propia expresión trucada debe aplicarse -como una articulación. En el caso de más de una sobreescritura de dirección -(@code{^} o @code{_}), gana la sobreescritura situada más a la izquierda -porque se aplica en último lugar. +Observe que la instrucción @code{\tweak} debe venir precedida de +una marca de articulación porque la propia expresión trucada debe +aplicarse como una articulación. En el caso de más de una +sobreescritura de dirección (@code{^} o @code{_}), gana la +sobreescritura situada más a la izquierda porque se aplica en +último lugar. @cindex @code{\tweak}, Accidental @cindex @code{\tweak}, specific layout object -Los objetos tales como plicas y alteraciones accidentales se crean más -tarde, y no directamente a partir del evento que viene a continuación. -Aún es posible utilizar @code{\tweak} sobre tales objetos creados -indirectamente mediante el nombrado explícito del objeto de -presentación, siempre y cuando LilyPond pueda rastrear su origen hasta -el evento original: - -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -<\tweak Accidental.color #red cis4 - \tweak Accidental.color #green es - g> +Los objetos tales como plicas y alteraciones accidentales se crean +más tarde, y no directamente a partir del evento que viene a +continuación. Aún es posible utilizar @code{\tweak} sobre tales +objetos creados indirectamente mediante el nombrado explícito del +objeto de presentación, siempre y cuando LilyPond pueda rastrear +su origen hasta el evento original: + +@lilypond[quote,fragment,ragged-right,verbatim] +<\tweak Accidental.color #red cis''4 + \tweak Accidental.color #green es'' + g''> @end lilypond Esta forma extensa de la instrucción @code{\tweak} se puede describir como @example -\tweak @var{objeto-de-presentación}.@var{propiedad-de-presentación} @var{valor} +\tweak @var{LayoutObject}.@var{layout-property} #@var{value} +"ANTES" \tweak @var{objeto-de-presentación}.@var{propiedad-de-presentación} @var{valor} @end example @cindex grupos especiales anidados @@ -495,49 +524,53 @@ como @funindex TupletBracket La instrucción @code{\tweak} también se debe usar para cambiar la -apariencia de uno solo de un conjunto de grupos especiales anidados -que comiencen en el mismo instante musical. En el siguiente ejemplo, -el corchete del tresillo largo y el primero de los tres corchetes -cortos empiezan en el mismo momento musical, y por ello cualquier -instrucción @code{\override} se aplicaría a los dos. En el ejemplo se -usa @code{\tweak} para distinguir entre ellos. La primera instrucción -@code{\tweak} especifica que el corchete del tresillo largo se debe -colocar por encima de las notas y el segundo especifica que el número -del tresillo se debe imprimir en rojo sobre el corchete del primer -tresillo corto. +apariencia de uno solo de un conjunto de grupos especiales +anidados que comiencen en el mismo instante musical. En el +siguiente ejemplo, el corchete del tresillo largo y el primero de +los tres corchetes cortos empiezan en el mismo momento musical, y +por ello cualquier instrucción @code{\override} se aplicaría a los +dos. En el ejemplo se usa @code{\tweak} para distinguir entre +ellos. La primera instrucción @code{\tweak} especifica que el +corchete del tresillo largo se debe colocar por encima de las +notas y el segundo especifica que el número del tresillo se debe +imprimir en rojo sobre el corchete del primer tresillo corto. @cindex @code{\tweak}, ejemplo @cindex direction, propiedad, ejemplo @cindex color, propiedad, ejemplo -@lilypond[quote,ragged-right,verbatim,fragment,relative=2] -\tweak direction #up -\tuplet 3/4 { - \tweak color #red - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \tweak direction #up + \tuplet 3/4 { + \tweak color #red + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond -Si los grupos anidados no comienzan en el mismo momento, su apariencia -se puede modificar de la forma usual mediante instrucciones -@code{\override}: +Si los grupos anidados no comienzan en el mismo momento, su +apariencia se puede modificar de la forma usual mediante +instrucciones @code{\override}: @cindex text, propiedad, ejemplo @cindex tuplet-number, función, ejemplo @cindex transparent, propiedad, ejemplo @cindex TupletNumber, ejemplo de sobreescritura -@lilypond[quote,ragged-right,verbatim,fragment,relative=1] -\tuplet 3/2 { c8[ c c] } -\once \override TupletNumber.text = #tuplet-number::calc-fraction-text -\tuplet 3/2 { - c8[ c] - c8[ c] - \once \override TupletNumber.transparent = ##t - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative { + \tuplet 3/2 { c'8[ c c] } + \once \override TupletNumber.text = #tuplet-number::calc-fraction-text + \tuplet 3/2 { + c8[ c] + c8[ c] + \once \override TupletNumber.transparent = ##t + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -546,12 +579,71 @@ se puede modificar de la forma usual mediante instrucciones Referencia de la notación: @ruser{La instrucción tweak}. +@node El prefijo single +@unnumberedsubsubsec El prefijo @code{@bs{}single} +@translationof The single prefix + +@funindex \single +@cindex truco, generado a partir de una sobreescritura + +Supongamos que queremos enfatizar la cabeza de algunas notas +trazándolas de color e incrementando su tamaño, y supongamos +también hemos programado una función para hacer la tarea más +cómoda: + +@lilypond[quote,verbatim] +emphNoteHead = { + \override NoteHead.color = #red + \override NoteHead.font-size = 2 +} +\relative { + c''4 a \once \emphNoteHead f d | +} +@end lilypond + +El prefijo @code{\once} funciona perfectamente para enfatizar +notas únicas o acordes completos, pero no se puede usar para +enfatizar una sola nota @emph{dentro} de un acorde. Anteriormente +vimos cómo se puede usar la instrucción @code{\tweak} para +hacerlo, véase @ref{La instrucción tweak,,La instrucción +@code{@bs{}tweak}}. Pero @code{\tweak} no se puede usar con una +función; ahí es donde entra la instrucción @code{\single}: + +@lilypond[quote,verbatim] +emphNoteHead = { + \override NoteHead.color = #red + \override NoteHead.font-size = 2 +} +\relative { + 4 +} +@end lilypond + +En resumen, @code{\single} convierte las sobreescrituras hechas +con@code{\override} en trucos hechos con @code{\tweak} de tal +manera que cuando hay varios objetos en el mismo instante de +tiempo musical (como las notas de un acorde), @code{\single} +afecta a una única nota, la que se genera por la expresión que +sigue inmediatamente, a diferencia de @code{\once} que afecta a +todos esos objetos. + +El uso de @code{\single} de esta forma con una función cualquiera +que contenga solamente sobreescrituras, puede aplicarse a las +notas individuales de un acorde. Sin embargo, @code{\single} no +convierte @code{\revert}, @code{\set} ni @code{\unset} en trucos +de @code{\tweak}. + +@seealso +Manual de aprendizaje: +@ref{La instrucción tweak,,La instrucción @code{@bs{}tweak}}, +@ref{Uso de variables para los ajustes de disposición}. + @node Manual de referencia de funcionamiento interno @section Manual de referencia de funcionamiento interno @translationof The Internals Reference manual -@cindex Internals Reference +@cindex Referencia de funcionamiento interno @menu * Propiedades de los objetos de presentación:: @@ -569,25 +661,27 @@ Referencia de la notación: @cindex presentación, propiedades de los objetos de @cindex Referencia de funcionamiento interno -Suponga que tiene una partitura con una ligadura de expresión que para -su gusto es demasiado fina y quiere trazarla un poco más gruesa. ¿Cómo -debe proceder? Ya sabe, por las afirmaciones anteriores acerca de la -flexibilidad de LilyPond, que tal posibilidad existe, y seguramente -piensa que una cierta instrucción de sobreescritura @code{\override} -será necesaria. Pero ¿existe una propiedad de grosor para las -ligaduras? y, si la hay, ¿cómo se puede modificar? Aquí es donde -interviene el Manual de Funcionamiento Interno. Contiene toda la -información que puede necesitar para construir ésta y todas las demás -instrucciones @code{\override}, de sobreescritura. +Suponga que tiene una partitura con una ligadura de expresión que +para su gusto es demasiado fina y quiere trazarla un poco más +gruesa. ¿Cómo debe proceder? Ya sabe, por las afirmaciones +anteriores acerca de la flexibilidad de LilyPond, que tal +posibilidad existe, y seguramente piensa que una cierta +instrucción de sobreescritura @code{\override} será necesaria. +Pero ¿existe una propiedad de grosor para las ligaduras? y, si la +hay, ¿cómo se puede modificar? Aquí es donde interviene el Manual +de Funcionamiento Interno. Contiene toda la información que puede +necesitar para construir ésta y todas las demás instrucciones +@code{\override}, de sobreescritura. Una advertencia antes de dirigir nuestra mirada a la referencia de -funcionamiento interno. Éste es un documento de @strong{referencia}, -lo que significa que hay pocas o ninguna explicación en él: su -propósito es presentar la información de forma precisa y concisa. Por -tanto, podrá parecerle desalentador a primera vista. ¡No se preocupe! -La guía y las explicaciones que presentamos aquí le permitirán extraer -la información de la referencia de funcionamiento interno por sí mismo -con tan sólo algo de práctica. +funcionamiento interno. Éste es un documento de +@strong{referencia}, lo que significa que hay pocas o ninguna +explicación en él: su propósito es presentar la información de +forma precisa y concisa. Por tanto, podrá parecerle desalentador +a primera vista. ¡No se preocupe! La guía y las explicaciones +que presentamos aquí le permitirán extraer la información de la +referencia de funcionamiento interno por sí mismo con tan sólo +algo de práctica. @cindex sobreescritura, ejemplo de @cindex Referencia de Funcionamiento Interno, ejemplo de utilización @@ -598,12 +692,12 @@ real: @c Mozart, dúo, núm. 7 de La Flauta Mágica -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -616,42 +710,44 @@ real: Suponga ahora que decidimos que nos gustan las ligaduras algo más gruesas. ¿Es posible? La ligadura es, ciertamente, un objeto de presentación, así que la cuestión es @q{¿Hay una propiedad -perteneciente a las ligaduras de expresión que controle su grosor?} -Para responder a esta pregunta debemos mirar el manual de Referencia -de Funcionamiento Interno, abreviadamente RFI@footnote{@strong{IR} -(Internals Reference) en inglés}. - -El RFI de la versión de LilyPond que está usando se puede encontrar en -la página web de LilyPond en @uref{http://lilypond.org}. Vaya a la -página de la documentación y siga el enlace Manual de Referencia de -Funcionamiento Interno (RFI). Para nuestros propósitos pedagógicos -sería mejor que utilizase la versión en HTML, no la @q{en una sola -página} ni el PDF. Para que los siguientes párrafos tengan algún -sentido deberá consultarlo realmente al tiempo que lee. +perteneciente a las ligaduras de expresión que controle su +grosor?} Para responder a esta pregunta debemos mirar el manual +de Referencia de Funcionamiento Interno, abreviadamente +RFI@footnote{@strong{IR} (Internals Reference) en inglés}. + +El RFI de la versión de LilyPond que está usando se puede +encontrar en la página web de LilyPond en +@uref{http://lilypond.org}. Vaya a la página de la documentación +y siga el enlace Manual de Referencia de Funcionamiento Interno +(RFI). Para nuestros propósitos pedagógicos sería mejor que +utilizase la versión en HTML, no la @q{en una sola página} ni el +PDF. Para que los siguientes párrafos tengan algún sentido deberá +consultarlo realmente al tiempo que lee. @c Link names in English as those pages are not yet translated. FV Bajo el encabezamiento @strong{Top} podrá ver cinco enlaces. Seleccione el enlace @emph{Backend}, que es donde se encuentra la -información sobre los objetos de presentación. Una vez allí, bajo el -encabezamiento @strong{Backend}, siga el enlace @emph{All layout -objects}. La página que aparece relaciona todos los objetos de -presentación que se usan en su versión de LilyPond, en orden -alfabético. Siga el enlace Slur (ligadura de expresión), y aparecerán -relacionadas las propiedades de las ligaduras de expresión o Slurs. +información sobre los objetos de presentación. Una vez allí, bajo +el encabezamiento @strong{Backend}, siga el enlace @emph{All +layout objects}. La página que aparece relaciona todos los +objetos de presentación que se usan en su versión de LilyPond, en +orden alfabético. Siga el enlace Slur (ligadura de expresión), y +aparecerán relacionadas las propiedades de las ligaduras de +expresión o Slurs. Una forma alternativa de encontrar esta página es a partir de la -Referencia de la Notación. En una de las páginas que tratan de las -ligaduras de expresión podrá encontrar un enlace al manual de +Referencia de la Notación. En una de las páginas que tratan de +las ligaduras de expresión podrá encontrar un enlace al manual de referencia del funcionamiento interno. Este enlace le llevará -directamente a esta página, aunque si tiene una idea del nombre del -objeto de presentación que pretende trucar, le resultará más fácil ir -directamente al RFI y buscar allí. +directamente a esta página, aunque si tiene una idea del nombre +del objeto de presentación que pretende trucar, le resultará más +fácil ir directamente al RFI y buscar allí. -Esta página sobre las ligaduras de expresión dentro del manual RFI nos -dice en primer lugar que los objetos Slur se crean por el grabador -Slur_engraver. A continuación relaciona los ajustes estándar. -Navegue por ellos buscando una propiedad que pudiera controlar -el grosor de las ligaduras, y encontrará +Esta página sobre las ligaduras de expresión dentro del manual RFI +nos dice en primer lugar que los objetos Slur se crean por el +grabador Slur_engraver. A continuación relaciona los ajustes +estándar. Navegue por ellos buscando una propiedad que pudiera +controlar el grosor de las ligaduras, y encontrará @example @code{thickness} (number) @@ -659,49 +755,49 @@ el grosor de las ligaduras, y encontrará Line thickness, generally measured in @code{line-thickness} @end example -Esto promete ser una buena opción para cambiar el grosor. Nos dice -que el valor de @code{thickness} es un simple @emph{número}, que el -valor predeterminado es 1.2, y que las unidades están dentro de otra -propiedad llamada @code{line-thickness}. +Esto promete ser una buena opción para cambiar el grosor. Nos +dice que el valor de @code{thickness} es un simple @emph{número}, +que el valor predeterminado es 1.2, y que las unidades están +dentro de otra propiedad llamada @code{line-thickness}. Como dijimos con anterioridad, existen entre pocas y ninguna explicación en el RFI, pero ya tenemos información suficiente para -probar a cambiar el grosor de la ligadura. Vemos que el nombre del -objeto de presentación es @code{Slur}, que el nombre de la propiedad -que debemos cambiar es @code{thickness} y que el nuevo valor debe ser -un número algo más grande que 1.2 si queremos hacer las ligaduras más -gruesas. +probar a cambiar el grosor de la ligadura. Vemos que el nombre +del objeto de presentación es @code{Slur}, que el nombre de la +propiedad que debemos cambiar es @code{thickness} y que el nuevo +valor debe ser un número algo más grande que 1.2 si queremos hacer +las ligaduras más gruesas. Ahora podemos construir la instrucción de sobreescritura -@code{\override} simplemente mediante la sustitución de los valores -que hemos encontrado para los nombres, omitiendo el contexto. -Usaremos un valor muy grande para el grosor al principio, para estar -seguros de que la instrucción está funcionando. Obtenemos lo -siguiente: +@code{\override} simplemente mediante la sustitución de los +valores que hemos encontrado para los nombres, omitiendo el +contexto. Usaremos un valor muy grande para el grosor al +principio, para estar seguros de que la instrucción está +funcionando. Obtenemos lo siguiente: @example \override Slur.thickness = #5.0 @end example -¡No olvide el @code{#'} antes del nombre de la propiedad y@tie{}@code{#} -antes del valor nuevo! +¡No olvide el @code{#'} antes del nombre de la propiedad +y@tie{}@code{#} antes del valor nuevo! La pregunta final es @q{¿Dónde se debe colocar esta instrucción?} Aunque nos falta seguridad y estamos todavía aprendiendo, la mejor -respuesta es: @q{Dentro de la música, antes de la primera ligadura y -cerca de ella.} Hagámoslo así: +respuesta es: @q{Dentro de la música, antes de la primera ligadura +y cerca de ella.} Hagámoslo así: @cindex Slur, ejemplo de sobreescritura @cindex thickness, propiedad, ejemplo -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { + \relative { % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 - r4 bes8 bes[( g]) g | + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -719,8 +815,8 @@ Así pues, ésta es la forma básica de construir instrucciones complicaciones más con las que nos encontraremos en secciones posteriores, pero ahora conoce todos los principios esenciales que necesita para hacerlo por sí mismo (aunque aún necesita algo de -práctica). La cual vendrá proporcionada por los ejemplos que vienen a -continuación. +práctica). La cual vendrá proporcionada por los ejemplos que +vienen a continuación. @subsubsubheading Búsqueda del contexto @@ -729,21 +825,22 @@ continuación. Pero en primer lugar ¿qué habría pasado si hubiésemos tenido que especificar el contexto? ¿Cuál sería? Podemos suponer que las -ligaduras están en el contexto de Voz, por estar claramente asociados -de manera estrecha con las líneas individuales de música, pero -¿podemos estar seguros? Para averiguarlo, vayamos de nuevo al inicio -de la página del RFI que describe las ligaduras (Slur), donde dice -@q{Slur objects are created by: Slur engraver} («Los objetos de -ligadura de expresión se crean por: el grabador Slur»). Así pues, las -ligaduras de expresión se crean en cualquier contexto en el que se -encuentre el grabador @code{Slur_engraver}. Siga el enlace a la -página del grabador @code{Slur_engraver}. Al final del todo, dice que -el grabador @code{Slur_engraver} es parte de siete contextos de voz, -incluido el contexto de voz estándar, @code{Voice}, por lo que nuestra -suposición era acertada. Y a causa de que @code{Voice} es uno de los -contextos de más bajo nivel que se encuentra implícito sin ambigüedad -por el hecho de que estamos escribiendo notas, podemos omitirlo en -este lugar concreto. +ligaduras están en el contexto de Voz, por estar claramente +asociados de manera estrecha con las líneas individuales de +música, pero ¿podemos estar seguros? Para averiguarlo, vayamos de +nuevo al inicio de la página del RFI que describe las ligaduras +(Slur), donde dice @q{Slur objects are created by: Slur engraver} +(«Los objetos de ligadura de expresión se crean por: el grabador +Slur»). Así pues, las ligaduras de expresión se crean en +cualquier contexto en el que se encuentre el grabador +@code{Slur_engraver}. Siga el enlace a la página del grabador +@code{Slur_engraver}. Al final del todo, dice que el grabador +@code{Slur_engraver} es parte de siete contextos de voz, incluido +el contexto de voz estándar, @code{Voice}, por lo que nuestra +suposición era acertada. Y a causa de que @code{Voice} es uno de +los contextos de más bajo nivel que se encuentra implícito sin +ambigüedad por el hecho de que estamos escribiendo notas, podemos +omitirlo en este lugar concreto. @subsubsubheading Sobreescritura por una sola vez @@ -751,29 +848,28 @@ este lugar concreto. @cindex once override @funindex \once -@funindex once Como puede ver, @emph{todas} las ligaduras son más gruesas en el último ejemplo. Pero ¿y si quisiéramos que solamente la primera ligadura fuese más gruesa? Esto se consigue con la instrucción o -prefijo @code{\once}. Colocado inmediatamente antes de la instrucción -@code{\override} ocasiona que solamente cambie la ligadura que -comienza en la nota @strong{inmediata siguiente}. Si la nota -inmediata siguiente no da inicio a una ligadura, la instrucción no -tiene ningún efecto en absoluto: no se recuerda hasta que se -encuentre alguna ligadura, sino que simplemente se ignora. Así pues, -la instrucción que lleva @code{\once} se debe reposicionar de la forma -siguiente: +prefijo @code{\once}. Colocado inmediatamente antes de la +instrucción @code{\override} ocasiona que solamente cambie la +ligadura que comienza en la nota @strong{inmediata siguiente}. Si +la nota inmediata siguiente no da inicio a una ligadura, la +instrucción no tiene ningún efecto en absoluto: no se recuerda +hasta que se encuentre alguna ligadura, sino que simplemente se +ignora. Así pues, la instrucción que lleva @code{\once} se debe +reposicionar de la forma siguiente: @cindex Slur, ejemplo de sobreescritura @cindex thickness, propiedad, ejemplo -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes8[( g]) g | @@ -787,10 +883,11 @@ siguiente: @end lilypond @noindent -Hemos hecho que ahora solamente la primera ligadura sea más gruesa. +Hemos hecho que ahora solamente la primera ligadura sea más +gruesa. -La instrucción o prefijo @code{\once} también se puede usar antes de -la instrucción @code{\set}. +La instrucción o prefijo @code{\once} también se puede usar antes +de la instrucción @code{\set}. @subsubsubheading Recuperación del ajuste @@ -798,23 +895,22 @@ la instrucción @code{\set}. @cindex predeterminadas, recuperar las propiedades @funindex \revert -@funindex revert -Finalmente ¿y si quisiéramos que solamente las dos primeras ligaduras -fuesen más gruesas? En fin; podríamos usar dos instrucciones, cada -una de ellas precedida por el prefijo @code{\once}, situadas -inmediatamente antes de cada una de las notas en que comienzan las -ligaduras: +Finalmente ¿y si quisiéramos que solamente las dos primeras +ligaduras fuesen más gruesas? En fin; podríamos usar dos +instrucciones, cada una de ellas precedida por el prefijo +@code{\once}, situadas inmediatamente antes de cada una de las +notas en que comienzan las ligaduras: @cindex Slur, ejemplo de sobreescritura @cindex thickness, propiedad, ejemplo -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes[( g]) g | @@ -830,20 +926,20 @@ ligaduras: @end lilypond @noindent -o podríamos omitir la instrucción prefija @code{\once} y utilizar la -instrucción @code{\revert} (restablecer) para devolver la propiedad -del grosor, @code{thickness}, a su valor predeterminado después de la -segunda ligadura: +o podríamos omitir la instrucción prefija @code{\once} y utilizar +la instrucción @code{\revert} (restablecer) para devolver la +propiedad del grosor, @code{thickness}, a su valor predeterminado +después de la segunda ligadura: @cindex Slur, ejemplo de sobreescritura @cindex thickness, propiedad, ejemplo -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 bes[( g]) g | @@ -862,16 +958,16 @@ segunda ligadura: @noindent la instrucción @code{\revert} se puede utilizar para devolver cualquier propiedad que se haya cambiado con @code{\override} a su -valor predeterminado. Puede utilizar el método que mejor se adapte a -aquello que quiere hacer. +valor predeterminado. Puede utilizar el método que mejor se +adapte a aquello que quiere hacer. -Así finaliza nuestra introducción al manual de RFI, y el método básico -de trucaje. A continuación, en las últimas secciones de este capítulo -encontrará varios ejemplos, en parte para introducirle en algunas de -las posibilidades adicionales del manual RFI, y en parte para -proporcionarle más práctica en cómo extraer información de él. Estos -ejemplos irán conteniendo cada vez menos palabras de guía y -explicación. +Así finaliza nuestra introducción al manual de RFI, y el método +básico de trucaje. A continuación, en las últimas secciones de +este capítulo encontrará varios ejemplos, en parte para +introducirle en algunas de las posibilidades adicionales del +manual RFI, y en parte para proporcionarle más práctica en cómo +extraer información de él. Estos ejemplos irán conteniendo cada +vez menos palabras de guía y explicación. @node Propiedades de los interfaces @subsection Propiedades de los interfaces @@ -881,31 +977,32 @@ explicación. @cindex propiedades de los interfaces @cindex interfaces, propiedades -Suponga ahora que queremos imprimir la letra de la canción en cursiva. -¿Qué forma de instrucción @code{\override} necesitamos para hacerlo? -En primer lugar miramos en la página del RFI que relaciona todos los -objetos, @q{All layout objects}, como antes, y buscamos un objeto que -pueda controlar la letra de la canción. Encontramos @code{LyricText}, -que parece adecuado. Al seguir este enlace se presentan las -propiedades ajustables para el texto de la letra. Estos incluyen -@code{font-series} y @code{font-size}, pero nada que pudiera aplicar -una forma cursiva. Esto es porque la propiedad de la forma es común a -todos los objetos de fuente tipográfica, y por tanto, en vez de -incluirlo en cada uno de los objetos de presentación, se agrupa junto -con otras propiedades comunes similares y se deposita en un -@strong{Interface}, el interface de las fuentes tipográficas -@code{font-interface}. - -Por tanto, ahora necesitamos aprender cómo encontrar las propiedades -de los interfaces, y descubrir qué objetos usan estas propiedades de -interface. - -Mire de nuevo la página del RFI que describe a LyricText. Al final de -la página hay una lista de enlaces a los interfaces que LyricText -contempla. La lista tiene siete elementos, entre ellos +Suponga ahora que queremos imprimir la letra de la canción en +cursiva. ¿Qué forma de instrucción @code{\override} necesitamos +para hacerlo? En primer lugar miramos en la página del RFI que +relaciona todos los objetos, @q{All layout objects}, como antes, y +buscamos un objeto que pueda controlar la letra de la canción. +Encontramos @code{LyricText}, que parece adecuado. Al seguir este +enlace se presentan las propiedades ajustables para el texto de la +letra. Estos incluyen @code{font-series} y @code{font-size}, pero +nada que pudiera aplicar una forma cursiva. Esto es porque la +propiedad de la forma es común a todos los objetos de fuente +tipográfica, y por tanto, en vez de incluirlo en cada uno de los +objetos de presentación, se agrupa junto con otras propiedades +comunes similares y se deposita en un @strong{Interface}, el +interface de las fuentes tipográficas @code{font-interface}. + +Por tanto, ahora necesitamos aprender cómo encontrar las +propiedades de los interfaces, y descubrir qué objetos usan estas +propiedades de interface. + +Mire de nuevo la página del RFI que describe a LyricText. Al +final de la página hay una lista de enlaces a los interfaces que +LyricText contempla. La lista tiene siete elementos, entre ellos @code{font-interface}. Al seguir este enlace llegamos a las -propiedades asociadas con este interface, que también son propiedades -de todos los objetos que lo llevan, entre ellos LyricText. +propiedades asociadas con este interface, que también son +propiedades de todos los objetos que lo llevan, entre ellos +LyricText. Ahora vemos todas las propiedades ajustables por el usuario que controlan las tipografías, entre ellas @code{font-shape(symbol)}, @@ -913,23 +1010,23 @@ donde @code{symbol} se puede establecer a @code{upright} (recta), @code{italics} (cursiva)o @code{caps} (mayúsculas pequeñas). Observará que @code{font-series} y @code{font-size} también se -encuentran aquí relacionadas. Esto inmediatamente hace que surja la -pregunta: ¿Por qué están las propiedades comunes de tipografía +encuentran aquí relacionadas. Esto inmediatamente hace que surja +la pregunta: ¿Por qué están las propiedades comunes de tipografía @code{font-series} y @code{font-size} relacionadas bajo -@code{LyricText} así como bajo el interface @code{font-interface} pero -@code{font-shape} no lo está? La respuesta es que @code{font-series} -y @code{font-size} se cambian a partir de sus valores predeterminados -globales cuando se crea un objeto @code{LyricText}, pero -@code{font-shape} no lo hace. Entonces los elementos de la lista -@code{LyricText} le dicen los valores para esas dos propiedades que -son de aplicación para @code{LyricText}. Otros objetos que contemplan -@code{font-interface} establecerán dichas propiedades de forma -diferente cuando se crean. - -Veamos si ahora podemos construir la instrucción @code{\override} para -cambiar la letra a cursiva. El objeto es @code{LyricText}, la -propiedad es @code{font-shape} y el valor es @code{italic}. Igual que -antes, omitiremos el contexto. +@code{LyricText} así como bajo el interface @code{font-interface} +pero @code{font-shape} no lo está? La respuesta es que +@code{font-series} y @code{font-size} se cambian a partir de sus +valores predeterminados globales cuando se crea un objeto +@code{LyricText}, pero @code{font-shape} no lo hace. Entonces los +elementos de la lista @code{LyricText} le dicen los valores para +esas dos propiedades que son de aplicación para @code{LyricText}. +Otros objetos que contemplan @code{font-interface} establecerán +dichas propiedades de forma diferente cuando se crean. + +Veamos si ahora podemos construir la instrucción @code{\override} +para cambiar la letra a cursiva. El objeto es @code{LyricText}, +la propiedad es @code{font-shape} y el valor es @code{italic}. +Igual que antes, omitiremos el contexto. Como nota aparte, aunque es importante, observe que ciertas propiedades toman valores que son símbolos, como @code{italic}, y @@ -940,28 +1037,28 @@ aparecerían como @code{"una cadena de texto"}; para ver más detalles sobre los símbolos y las cadenas, consulte @rextend{Tutorial de Scheme}. -Así pues, la instrucción @code{\override} necesaria para imprimir la -letra en cursiva, es: +Así pues, la instrucción @code{\override} necesaria para imprimir +la letra en cursiva, es: @example \override LyricText.font-shape = #'italic @end example @noindent -Esto debe escribirse justo delante de la letra a la que debe afectar, -de esta forma: +Esto debe escribirse justo delante de la letra a la que debe +afectar, de esta forma: @cindex font-shape, propiedad, ejemplo @cindex italic, ejemplo @cindex LyricText, ejemplo de sobreescritura @cindex @code{\addlyrics}, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -992,16 +1089,17 @@ Manual de Extensión: Hasta ahora hemos visto dos tipos de propiedad:: @code{número} y @code{símbolo}. Para que sea válido, el valor que se da a una -propiedad debe ser del tipo correcto y obedecer las reglas de dicho -tipo. El tipo de la propiedad se muestra siempre entre paréntesis -después del nombre de la propiedad en el RFI. He aquí una lista de -los tipos que podrá necesitar, junto con las reglas de dicho tipo, y -algunos ejemplos. Debe escribir siempre un símbolo de almohadilla, -@code{#}, por supuesto, delante de estos valores cuando se introducen -en la instrucción @code{\override}, incluso si el propio valor ya -comienza por@tie{}@code{#}. Solamente ofrecemos aquí ejemplos para -constantes; si quiere calcular un valor usando Scheme, consulte -@rextend{Cálculos en Scheme}. +propiedad debe ser del tipo correcto y obedecer las reglas de +dicho tipo. El tipo de la propiedad se muestra siempre entre +paréntesis después del nombre de la propiedad en el RFI. He aquí +una lista de los tipos que podrá necesitar, junto con las reglas +de dicho tipo, y algunos ejemplos. Debe escribir siempre un +símbolo de almohadilla, @code{#}, por supuesto, delante de estos +valores cuando se introducen en la instrucción @code{\override}, +incluso si el propio valor ya comienza por@tie{}@code{#}. +Solamente ofrecemos aquí ejemplos para constantes; si quiere +calcular un valor usando Scheme, consulte @rextend{Cálculos en +Scheme}. @multitable @columnfractions .2 .45 .35 @headitem Tipo de propiedad @@ -1077,39 +1175,40 @@ cambiar el aspecto de la música impresa. @subsection Visibilidad y color de los objetos @translationof Visibility and color of objects -Dentro de un uso educativo de la música, podríamos desear imprimir una -partitura con ciertos elementos omitidos como ejercicio para el -alumno, a quien se le pide que los complete. A la manera de ejemplo -sencillo, supongamos que el ejercicio es escribir las líneas -divisorias que faltan en un fragmento musical. Pero las líneas -divisorias normalmente se insertan automáticamente. ¿Cómo hacemos para -que no se impriman? - -Antes de enredarnos con esto, recordemos que las propiedades de los -objetos se agrupan en lo que hemos llamado @emph{interfaces} (véase -@ref{Propiedades de los interfaces}). Esto es simplemente agrupar -las propiedades que se pueden usar juntas para trucar un objeto -gráfico: si una de ellas se necesita para un objeto, también las -otras. Así, ciertos objetos usan las propiedades de algunos -interfaces, otros usan las de otros interfaces. Los interfaces que -contienen las propiedades que un determinado grob necesita se -encuentran relacionadas en el manual RFI al final de la página que -describe dicho grob, y esas propiedades se pueden ver mirando dichos -interfaces. +Dentro de un uso educativo de la música, podríamos desear imprimir +una partitura con ciertos elementos omitidos como ejercicio para +el alumno, a quien se le pide que los complete. A la manera de +ejemplo sencillo, supongamos que el ejercicio es escribir las +líneas divisorias que faltan en un fragmento musical. Pero las +líneas divisorias normalmente se insertan automáticamente. ¿Cómo +hacemos para que no se impriman? + +Antes de enredarnos con esto, recordemos que las propiedades de +los objetos se agrupan en lo que hemos llamado @emph{interfaces} +(véase @ref{Propiedades de los interfaces}). Esto es simplemente +agrupar las propiedades que se pueden usar juntas para trucar un +objeto gráfico: si una de ellas se necesita para un objeto, +también las otras. Así, ciertos objetos usan las propiedades de +algunos interfaces, otros usan las de otros interfaces. Los +interfaces que contienen las propiedades que un determinado grob +necesita se encuentran relacionadas en el manual RFI al final de +la página que describe dicho grob, y esas propiedades se pueden +ver mirando dichos interfaces. Hemos explicado cómo encontrar información sobre los grobs en @ref{Propiedades de los objetos de presentación}. Usando el mismo enfoque, vamos al RFI para buscar el objeto de presentación que -imprime las líneas divisorias. A través del enlace @emph{Backend} y -@emph{All layout objects} encontramos que hay un objeto de +imprime las líneas divisorias. A través del enlace @emph{Backend} +y @emph{All layout objects} encontramos que hay un objeto de presentación llamado @code{BarLine}. Entre sus propiedades se -encuentran dos que controlan la visibilidad: @code{break-visibility} y -@code{stencil}. Las líneas divisorias también contemplan un número de -interfaces, entre ellos el @code{grob-interface}, donde podemos -encontrar las propiedades @code{transparent} y @code{color}. Todas -ellas pueden afectar la visibilidad de las barras de compás (y, por -supuesto, por extensión, también la de muchos otros objetos de -presentación). Vamos a considerar cada uno de ellos por orden. +encuentran dos que controlan la visibilidad: +@code{break-visibility} y @code{stencil}. Las líneas divisorias +también contemplan un número de interfaces, entre ellos el +@code{grob-interface}, donde podemos encontrar las propiedades +@code{transparent} y @code{color}. Todas ellas pueden afectar la +visibilidad de las barras de compás (y, por supuesto, por +extensión, también la de muchos otros objetos de presentación). +Vamos a considerar cada uno de ellos por orden. @menu * La propiedad stencil (sello):: @@ -1124,48 +1223,50 @@ presentación). Vamos a considerar cada uno de ellos por orden. @cindex stencil (sello), propiedad -Esta propiedad controla la apariencia de las barras de compás mediante -la especificación del símbolo (o «glifo») que se debe imprimir. Igual -que como otras muchas propiedades, se puede establecer de forma que no -imprima nada ajustando su valor a @code{#f}. Vamos a probarlo, como -antes, omitiendo el Contexto implícito, @code{Voice}: +Esta propiedad controla la apariencia de las barras de compás +mediante la especificación del símbolo (o «glifo») que se debe +imprimir. Igual que como otras muchas propiedades, se puede +establecer de forma que no imprima nada ajustando su valor a +@code{#f}. Vamos a probarlo, como antes, omitiendo el Contexto +implícito, @code{Voice}: @cindex BarLine, ejemplo de sobreescritura @cindex stencil, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override BarLine.stencil = ##f - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond -Las barras de compás todavía se imprimen. ¿Qué es lo que está mal? -Vuelva al RFI y mire de nuevo la página que ofrece las propiedades del -objeto BarLine. Al principio de la página dice @qq{Barline objects -are created by: Bar_engraver} (los objetos Barline se crean por el -grabador Bar_engraver). Vaya a la página del grabador -@code{Bar_engraver} siguiendo el enlace. Al final da una lista de -contextos en los que el grabador de líneas divisorias opera. Todos -ellos son del tipo @code{Staff}, y así la razón de que la instrucción -@code{\override} no funcionara como esperábamos, es porque -@code{Barline} no se encuentra en el contexto predeterminado -@code{Voice}. Si el contexto no se especifica correctamente, la -instrucción simplemente no funciona. No se produce ningún mensaje de -error, y no se registra nada en el archivo log de registro. Vamos a -intentar corregirlo escribiendo el contexto correcto: +Las barras de compás todavía se imprimen. ¿Qué es lo que está +mal? Vuelva al RFI y mire de nuevo la página que ofrece las +propiedades del objeto BarLine. Al principio de la página dice +@qq{Barline objects are created by: Bar_engraver} (los objetos +Barline se crean por el grabador Bar_engraver). Vaya a la página +del grabador @code{Bar_engraver} siguiendo el enlace. Al final da +una lista de contextos en los que el grabador de líneas divisorias +opera. Todos ellos son del tipo @code{Staff}, y así la razón de +que la instrucción @code{\override} no funcionara como +esperábamos, es porque @code{Barline} no se encuentra en el +contexto predeterminado @code{Voice}. Si el contexto no se +especifica correctamente, la instrucción simplemente no funciona. +No se produce ningún mensaje de error, y no se registra nada en el +archivo log de registro. Vamos a intentar corregirlo escribiendo +el contexto correcto: @cindex BarLine, ejemplo de sobreescritura @cindex stencil, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.stencil = ##f - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1177,11 +1278,11 @@ frecuente que existe una abreviatura para ella, llamada @code{\omit} (omitir): @funindex \omit -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \omit Staff.BarLine - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1189,15 +1290,16 @@ frecuente que existe una abreviatura para ella, llamada Sin embargo, observe que el establecimiento de la propiedad @code{stencil} al valor @code{#f} produce errores cuando las se -requieren las dimensiones del objeto para un procesamiento correcto. -Por ejemplo, se generan errores si la propiedad @code{stencil} del -objeto @code{NoteHead} se establece al valor @code{#f}. Si es el -caso, podemos en vez de ello utilizar la función @code{point-stencil}, -que establece el sello a un objeto con tamaño nulo: +requieren las dimensiones del objeto para un procesamiento +correcto. Por ejemplo, se generan errores si la propiedad +@code{stencil} del objeto @code{NoteHead} se establece al valor +@code{#f}. Si es el caso, podemos en vez de ello utilizar la +función @code{point-stencil}, que establece el sello a un objeto +con tamaño nulo: -@lilypond[quote,verbatim,relative=2] -{ - c4 c +@lilypond[quote,verbatim] +\relative { + c''4 c \once \override NoteHead.stencil = #point-stencil c4 c } @@ -1227,11 +1329,11 @@ el valor en sí dentro de la instrucción @code{\override}. @cindex BarLine, ejemplo de sobreescritura @cindex break-visibility, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.break-visibility = ##(#f #f #f) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1248,26 +1350,26 @@ Y podemos ver que esto también quita todas las líneas divisorias. En la relación de propiedades que se especifican en la página del @code{grob-interface} del RFI podemos ver que la propiedad -@code{transparent} es un valor booleano. Esto se debe establecer a -@code{#t} para hacer que el grob sea transparente. En el ejemplo -siguiente vamos a hacer que la indicación de compás, y no las líneas -divisorias, sea transparente. Para hacerlo tenemos que buscar el -nombre del grob de la indicación de compás. Volviendo a la página -@q{All layout objects} del RFI, buscamos las propiedades del objeto de -presentación @code{TimeSignature}. Se produce por parte del grabador -@code{Time_signature_engraver} que como puede comprobar vive dentro -del contexto de @code{Staff} y también contempla el interface -@code{grob-interface}. Así pues, la instrucción que hace transparente -a la indicación de compás es: +@code{transparent} es un valor booleano. Esto se debe establecer +a @code{#t} para hacer que el grob sea transparente. En el +ejemplo siguiente vamos a hacer que la indicación de compás, y no +las líneas divisorias, sea transparente. Para hacerlo tenemos que +buscar el nombre del grob de la indicación de compás. Volviendo a +la página @q{All layout objects} del RFI, buscamos las propiedades +del objeto de presentación @code{TimeSignature}. Se produce por +parte del grabador @code{Time_signature_engraver} que como puede +comprobar vive dentro del contexto de @code{Staff} y también +contempla el interface @code{grob-interface}. Así pues, la +instrucción que hace transparente a la indicación de compás es: @cindex TimeSignature, ejemplo de sobreescritura @cindex transparent, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.TimeSignature.transparent = ##t - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1279,11 +1381,11 @@ es una operación bastante frecuente, de modo que tenemos una abreviatura llamada @code{\hide} (ocultar): @funindex \hide -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \hide Staff.TimeSignature - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1301,11 +1403,11 @@ compás se debe establecer al valor @code{#f}: @cindex TimeSignature, ejemplo de sobreescritura @cindex stencil, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \omit Staff.TimeSignature - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1325,45 +1427,47 @@ lo hacemos invisible. @cindex color, propiedad Para finalizar, intentemos hacer invisibles las barras de compás -pintándolas de color blanco (hay un problema relacionado, que consiste -en que la línea divisoria blanca puede tapar o no tapar las líneas del -pentagrama a las que cruza. Podrá observar en algunos de los ejemplos -que aparecen a continuación, que esto sucede de forma impredecible. -Los detalles sobre por qué esto ocurre así, y cómo controlarlo, se -estudian en @ruser{Pintar los objetos de blanco}; de momento estamos -estudiando el color, por lo que le rogamos que acepte esta limitación -por ahora). +pintándolas de color blanco (hay un problema relacionado, que +consiste en que la línea divisoria blanca puede tapar o no tapar +las líneas del pentagrama a las que cruza. Podrá observar en +algunos de los ejemplos que aparecen a continuación, que esto +sucede de forma impredecible. Los detalles sobre por qué esto +ocurre así, y cómo controlarlo, se estudian en @ruser{Pintar los +objetos de blanco}; de momento estamos estudiando el color, por lo +que le rogamos que acepte esta limitación por ahora). El interface @code{grob-interface} especifica que la propiedad del -color es una lista, pero no hay ninguna explicación sobre lo que debe -ir en esa lista. La lista que requiere es realmente una lista de -valores en unidades internas, pero para evitar tener que saber cuáles -son, se ofrecen varias vías para la especificación de los colores. La -primera forma es utilizar uno de los colores @q{normales} que están -relacionados en la primera tabla de la @ruser{Lista de colores}. Para -poner las líneas divisorias de color blanco, escribimos: +color es una lista, pero no hay ninguna explicación sobre lo que +debe ir en esa lista. La lista que requiere es realmente una +lista de valores en unidades internas, pero para evitar tener que +saber cuáles son, se ofrecen varias vías para la especificación de +los colores. La primera forma es utilizar uno de los colores +@q{normales} que están relacionados en la primera tabla de la +@ruser{Lista de colores}. Para poner las líneas divisorias de +color blanco, escribimos: @cindex BarLine, ejemplo de sobreescritura @cindex color, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #white - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @end lilypond @noindent -y de nuevo podemos comprobar que las barras de compás no son visibles. -Observe que @emph{white} no viene precedido de un apóstrofo: no es un -símbolo, sino una @emph{variable}. Cuando se evalúa, proporciona la -lista de valores internos que se requieren para establecer el color a -blanco. Los otros colores de la lista normal también son variables. -Para convencerse de que esto funciona, quizá quiera cambiar el color a -una de las otras variables de la lista. +y de nuevo podemos comprobar que las barras de compás no son +visibles. Observe que @emph{white} no viene precedido de un +apóstrofo: no es un símbolo, sino una @emph{variable}. Cuando se +evalúa, proporciona la lista de valores internos que se requieren +para establecer el color a blanco. Los otros colores de la lista +normal también son variables. Para convencerse de que esto +funciona, quizá quiera cambiar el color a una de las otras +variables de la lista. @cindex colores de X11 @cindex X11, colores de @@ -1380,11 +1484,11 @@ internos como éstos: @cindex BarLine, ejemplo de sobreescritura @cindex color, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(x11-color 'white) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1403,20 +1507,20 @@ paréntesis. @funindex rgb-color Aún existe otra función, que convierte valores RGB en colores -internos: la función @code{rgb-color}. Toma tres argumentos que dan -las intensidades de rojo, verde y azul. Cada uno de ellos puede tomar -valores entre 0 y 1. Por lo tanto, para establecer el color a rojo el -valor debe ser @code{(rgb-color 1 0 0)} y para blanco debe ser -@code{(rgb-color 1 1 1)}: +internos: la función @code{rgb-color}. Toma tres argumentos que +dan las intensidades de rojo, verde y azul. Cada uno de ellos +puede tomar valores entre 0 y 1. Por lo tanto, para establecer el +color a rojo el valor debe ser @code{(rgb-color 1 0 0)} y para +blanco debe ser @code{(rgb-color 1 1 1)}: @cindex BarLine, ejemplo de sobreescritura @cindex color, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(rgb-color 1 1 1) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1424,9 +1528,9 @@ valor debe ser @code{(rgb-color 1 0 0)} y para blanco debe ser Finalmente, existe también una escala de grises como parte del conjunto de colores de X11. Varían desde el negro, @code{'grey0}, -hasta el blanco, @code{'grey100}, en pasos de 1. Vamos a ilustrar esto -estableciendo todos los objetos de presentación de nuestro ejemplo a -varias gradaciones de gris: +hasta el blanco, @code{'grey100}, en pasos de 1. Vamos a ilustrar +esto estableciendo todos los objetos de presentación de nuestro +ejemplo a varias gradaciones de gris: @cindex StaffSymbol, ejemplo de sobreescritura @cindex TimeSignature, ejemplo de sobreescritura @@ -1437,8 +1541,8 @@ varias gradaciones de gris: @cindex color property, ejemplo @cindex x11-color, ejemplo de utilización -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.StaffSymbol.color = #(x11-color 'grey30) \override Staff.TimeSignature.color = #(x11-color 'grey60) @@ -1446,7 +1550,7 @@ varias gradaciones de gris: \override Voice.NoteHead.color = #(x11-color 'grey85) \override Voice.Stem.color = #(x11-color 'grey85) \override Staff.BarLine.color = #(x11-color 'grey10) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1454,13 +1558,13 @@ varias gradaciones de gris: @noindent Observe los contextos asociados con cada uno de los objetos de -presentación. Es importante que estén correctamente escritos, o las -instrucciones ¡no funcionarán! Recuerde que el contexto es aquel en -que se encuentra el grabador correspondiente. El contesto -predeterminado para los grabadores puede encontrarse empezando por el -objeto de presentación, de ahí al grabador que lo produce, y en la -página del grabador del RFI aparece en qué contexto se puede encontrar -normalmente el grabador. +presentación. Es importante que estén correctamente escritos, o +las instrucciones ¡no funcionarán! Recuerde que el contexto es +aquel en que se encuentra el grabador correspondiente. El +contesto predeterminado para los grabadores puede encontrarse +empezando por el objeto de presentación, de ahí al grabador que lo +produce, y en la página del grabador del RFI aparece en qué +contexto se puede encontrar normalmente el grabador. @node Tamaño de los objetos @@ -1479,10 +1583,10 @@ introducir un pentagrama temporal, como en un @rglos{ossia}. @cindex alignAboveContext, propiedad, ejemplo @cindex @code{\with}, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1495,10 +1599,11 @@ introducir un pentagrama temporal, como en un @rglos{ossia}. } @end lilypond -Los fragmentos de Ossia se escriben normalmente sin clave ni compás, y -por lo normal se imprimen más pequeños que el pentagrama principal. -Ya sabemos cómo quitar la clave y el compás: simplemente establecemos -el sello de cada uno de ellos a @code{#f}, como sigue: +Los fragmentos de Ossia se escriben normalmente sin clave ni +compás, y por lo normal se imprimen más pequeños que el pentagrama +principal. Ya sabemos cómo quitar la clave y el compás: +simplemente establecemos el sello de cada uno de ellos a +@code{#f}, como sigue: @cindex alignAboveContext, propiedad, ejemplo @cindex @code{\with}, ejemplo @@ -1506,10 +1611,10 @@ el sello de cada uno de ellos a @code{#f}, como sigue: @cindex Clef, ejemplo de sobreescritura @cindex TimeSignature, ejemplo de sobreescritura -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1528,38 +1633,38 @@ el sello de cada uno de ellos a @code{#f}, como sigue: @end lilypond @noindent -donde el par de llaves adicional después de la cláusula @code{\with} -es necesario para asegurar que la sobreescritura encerrada y la música -se aplican al pentagrama de ossia. - -Pero ¿cuál es la diferencia entre modificar el contexto de pentagrama -usando @code{\with} y modificar los sellos de clave y de compás con -\override, o en este caso -@code{\omit}? La diferencia principal es que los cambios que se realizan -en una cláusula @code{\with} se hacen en el momento en que se crea el -contexto, y permanecen activos como valores @strong{predeterminados} -durante toda la duración de dicho contexto, mientras que las -instrucciones @code{\set} o @code{\override} incluidas dentro de la -música son dinámicas: hacen cambios sincronizados con un punto -concreto de la música. Si los cambios se deshacen o se devuelven -mediante @code{\unset} o @code{\revert} volverán a su valor -predeterminado que será el establecido en la cláusula @code{\with}, o -si no se ha establecido ninguno en este lugar, los valores -predeterminados normales. - -Ciertas propiedades de contexto se pueden modificar solamente dentro -de cláusulas @code{\with}. Son aquellas propiedades que no se pueden -cambiar después de que el contexto se ha creado. -@code{alignAboveContext} y su compañero, @code{alignBelowContext}, son -dos de tales propiedades: una vez que el pentagrama se ha creado, su -alineación está decidida y no tendría sentido intentar cambiarla más -tarde. +donde el par de llaves adicional después de la cláusula +@code{\with} es necesario para asegurar que la sobreescritura +encerrada y la música se aplican al pentagrama de ossia. + +Pero ¿cuál es la diferencia entre modificar el contexto de +pentagrama usando @code{\with} y modificar los sellos de clave y +de compás con \override, o en este caso @code{\omit}? La +diferencia principal es que los cambios que se realizan en una +cláusula @code{\with} se hacen en el momento en que se crea el +contexto, y permanecen activos como valores +@strong{predeterminados} durante toda la duración de dicho +contexto, mientras que las instrucciones @code{\set} o +@code{\override} incluidas dentro de la música son dinámicas: +hacen cambios sincronizados con un punto concreto de la música. +Si los cambios se deshacen o se devuelven mediante @code{\unset} o +@code{\revert} volverán a su valor predeterminado que será el +establecido en la cláusula @code{\with}, o si no se ha establecido +ninguno en este lugar, los valores predeterminados normales. + +Ciertas propiedades de contexto se pueden modificar solamente +dentro de cláusulas @code{\with}. Son aquellas propiedades que no +se pueden cambiar después de que el contexto se ha creado. +@code{alignAboveContext} y su compañero, @code{alignBelowContext}, +son dos de tales propiedades: una vez que el pentagrama se ha +creado, su alineación está decidida y no tendría sentido intentar +cambiarla más tarde. Los valores predeterminados de las propiedades de los objetos de presentación también se pueden establecer dentro de cláusulas @code{\with}. Simplemente utilice la instrucción @code{\override} -normal dejando aparte el nombre del contexto, ya que está definido sin -ambigüedad como el contexto que la cláusula @code{\with} está +normal dejando aparte el nombre del contexto, ya que está definido +sin ambigüedad como el contexto que la cláusula @code{\with} está modificando. De hecho, se producirá un error si se especifica un contexto en este lugar. @@ -1570,10 +1675,10 @@ Así pues, podemos reemplazar el ejemplo anterior con @cindex Clef, ejemplo de sobreescritura @cindex TimeSignature, ejemplo de sobreescritura -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1596,10 +1701,10 @@ Resulta que también podemos emplear aquí las abreviaturas @code{transparent} y borrar el @code{stencil}, lo que conduce al resultado siguiente: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1617,24 +1722,24 @@ resultado siguiente: } @end lilypond -Finalmente llegamos a la forma de cambiar el tamaño de los objetos de -presentación. - -Ciertos objetos de presentación se crean como glifos sacados de una -fuente tipográfica. Entre ellos se encuentran las cabezas, -alteraciones, elementos de marcado, claves, indicaciones de compás, -indicaciones dinámicas y la letra de las canciones. Su tamaño se -cambia mediante la modificación de la propiedad @code{font-size}, como -veremos en breve. Otros objetos de presentación como ligaduras de -unión y de expresión (en general, objetos de extensión) se trazan -individualmente, por lo que no hay un tamaño de tipografía -@code{font-size} asociado a ellos. Estos objetos generalmente derivan -su tamaño de los objetos a los que están adosados, y por ello -normalmente no hay necesidad de cambiarles el tamaño manualmente. Aún -otras propiedades como la longitud de las plicas y las barras de -compás, el grosor de las barras de corchea y otras líneas, y la -separación de las líneas del pentagrama se deben modificar de otras -formas especiales. +Finalmente llegamos a la forma de cambiar el tamaño de los objetos +de presentación. + +Ciertos objetos de presentación se crean como glifos sacados de +una fuente tipográfica. Entre ellos se encuentran las cabezas, +alteraciones, elementos de marcado, claves, indicaciones de +compás, indicaciones dinámicas y la letra de las canciones. Su +tamaño se cambia mediante la modificación de la propiedad +@code{font-size}, como veremos en breve. Otros objetos de +presentación como ligaduras de unión y de expresión (en general, +objetos de extensión) se trazan individualmente, por lo que no hay +un tamaño de tipografía @code{font-size} asociado a ellos. Estos +objetos generalmente derivan su tamaño de los objetos a los que +están adosados, y por ello normalmente no hay necesidad de +cambiarles el tamaño manualmente. Aún otras propiedades como la +longitud de las plicas y las barras de compás, el grosor de las +barras de corchea y otras líneas, y la separación de las líneas +del pentagrama se deben modificar de otras formas especiales. Volviendo al ejemplo del ossia, vamos a cambiar en primer lugar el tamaño de la tipografía. Podemos hacerlo de dos formas. Podemos @@ -1645,18 +1750,18 @@ objeto como las cabezas (@code{NoteHead}s) con instrucciones como \override NoteHead.font-size = #-2 @end example -o podemos cambiar el tamaño de todas las tipografías estableciendo una -propiedad especial, @code{fontSize}, utilizando @code{\set}, o -mediante su inclusión dentro de una cláusula @code{\with} (pero sin el -@code{\set}). +o podemos cambiar el tamaño de todas las tipografías estableciendo +una propiedad especial, @code{fontSize}, utilizando @code{\set}, o +mediante su inclusión dentro de una cláusula @code{\with} (pero +sin el @code{\set}). @example \set fontSize = #-2 @end example Los dos enunciados producirían una reducción del tamaño de la -tipografía en dos pasos a partir de su valor previo, donde cada paso -reduce o aumenta el tamaño aproximadamente en un 12%. +tipografía en dos pasos a partir de su valor previo, donde cada +paso reduce o aumenta el tamaño aproximadamente en un 12%. Vamos a probarlo en nuestro ejemplo del ossia: @@ -1666,10 +1771,10 @@ Vamos a probarlo en nuestro ejemplo del ossia: @cindex TimeSignature, ejemplo de sobreescritura @cindex fontSize, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1687,11 +1792,12 @@ Vamos a probarlo en nuestro ejemplo del ossia: } @end lilypond -Aún no está demasiado bien. Las cabezas y los corchetes de las notas -son más pequeños, pero las plicas son demasiado largas en proporción, -y las líneas del pentagrama están demasiado separadas entre sí. Se -debe reducir su escala en proporción a la reducción de la tipografía. -El siguiente apartado trata sobre cómo se hace esto. +Aún no está demasiado bien. Las cabezas y los corchetes de las +notas son más pequeños, pero las plicas son demasiado largas en +proporción, y las líneas del pentagrama están demasiado separadas +entre sí. Se debe reducir su escala en proporción a la reducción +de la tipografía. El siguiente apartado trata sobre cómo se hace +esto. @node Longitud y grosor de los objetos @subsection Longitud y grosor de los objetos @@ -1707,23 +1813,24 @@ El siguiente apartado trata sobre cómo se hace esto. Las distancias y longitudes en LilyPond se miden generalmente en espacios de pentagrama, la distancia entre líneas adyacentes de la -pauta (o de manera ocasional medios espacios), mientras que la mayoría -de las propiedades de @code{thickness} (grosor) se miden en unidades -de una propiedad interna llamada @code{line-thickness.} Por ejemplo, -de forma predeterminada, a las líneas de los reguladores se les da un -grosor de 1 unidad de @code{line-thickness}, mientras que el -@code{thickness} de una plica es 1.3. Observe sin embargo que ciertas -propiedades de grosor son diferentes; por ejemplo, el grosor de las -barras de corchea se controla por medio del valor de -@code{beam-thickness}, que se mide en espacios de pentagrama. - -Entonces ¿cómo se tienen que escalar las longitudes en proporción al -tamaño de la tipografía? Se puede hacer con la ayuda de una función -especial que se llama @code{magstep}, pensada especialmente para este -propósito. Toma un argumento, el cambio de tamaño de la tipografía -(#-2 en nuestro ejemplo) y devuelve un factor de escalado adecuado -para reducir otros objetos en la misma proporción. Se usa de la -siguiente forma: +pauta (o de manera ocasional medios espacios), mientras que la +mayoría de las propiedades de @code{thickness} (grosor) se miden +en unidades de una propiedad interna llamada +@code{line-thickness.} Por ejemplo, de forma predeterminada, a +las líneas de los reguladores se les da un grosor de 1 unidad de +@code{line-thickness}, mientras que el @code{thickness} de una +plica es 1.3. Observe sin embargo que ciertas propiedades de +grosor son diferentes; por ejemplo, el grosor de las barras de +corchea se controla por medio del valor de @code{beam-thickness}, +que se mide en espacios de pentagrama. + +Entonces ¿cómo se tienen que escalar las longitudes en proporción +al tamaño de la tipografía? Se puede hacer con la ayuda de una +función especial que se llama @code{magstep}, pensada +especialmente para este propósito. Toma un argumento, el cambio +de tamaño de la tipografía (#-2 en nuestro ejemplo) y devuelve un +factor de escalado adecuado para reducir otros objetos en la misma +proporción. Se usa de la siguiente forma: @cindex alignAboveContext, propiedad, ejemplo @cindex @code{\with}, ejemplo @@ -1735,10 +1842,10 @@ siguiente forma: @cindex staff-space, propiedad, ejemplo @cindex stencil, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1759,16 +1866,16 @@ siguiente forma: @noindent Puesto que la longitud de las plicas y muchas otras propiedades -relacionadas con la longitudes calculan siempre con relación al valor -de la propiedad @code{staff-space}, su longitud también ve reducida su -escala automáticamente. Observe que esto afecta solamente a la escala -vertical del ossia: la escala horizontal se determina por medio de la -disposición de la música principal con el objeto de mantenerse en -sincronía con ella, de forma que no resulte afectada por ninguno de -estos cambios de tamaño. Por supuesto, si la escala de toda la música -principal se cambiase de esta forma, entonces el espaciado horizontal -se vería afectado. Trataremos de esto más tarde en la sección sobre -la disposición. +relacionadas con la longitudes calculan siempre con relación al +valor de la propiedad @code{staff-space}, su longitud también ve +reducida su escala automáticamente. Observe que esto afecta +solamente a la escala vertical del ossia: la escala horizontal se +determina por medio de la disposición de la música principal con +el objeto de mantenerse en sincronía con ella, de forma que no +resulte afectada por ninguno de estos cambios de tamaño. Por +supuesto, si la escala de toda la música principal se cambiase de +esta forma, entonces el espaciado horizontal se vería afectado. +Trataremos de esto más tarde en la sección sobre la disposición. Esto, en fin, completa la creación de un ossia. Los tamaños y longitudes del resto de los objetos se pueden modificar de manera @@ -1776,14 +1883,15 @@ análoga. Para cambios de escala pequeños, como en el ejemplo de arriba, el grosor de las diversas líneas dibujadas como divisorias, barras de -corchea, reguladores, ligaduras, etc, no requieren normalmente ningún -ajuste global. Si el grosor de cualquier objeto de presentación en -particular necesita ajustarse, se puede hacer mejor mediante la -sobreescritura de su propiedad @code{thickness}. Anteriormente -mostramos un ejemplo de cambio de grosor en las ligaduras, en -@ref{Propiedades de los objetos de presentación}. El grosor de todos los objetos -trazados (es decir, aquellos que no se producen a partir de una -tipografía) se pueden cambiar de la misma forma. +corchea, reguladores, ligaduras, etc, no requieren normalmente +ningún ajuste global. Si el grosor de cualquier objeto de +presentación en particular necesita ajustarse, se puede hacer +mejor mediante la sobreescritura de su propiedad @code{thickness}. +Anteriormente mostramos un ejemplo de cambio de grosor en las +ligaduras, en @ref{Propiedades de los objetos de presentación}. +El grosor de todos los objetos trazados (es decir, aquellos que no +se producen a partir de una tipografía) se pueden cambiar de la +misma forma. @node Colocación de los objetos @@ -1806,71 +1914,72 @@ tipografía) se pueden cambiar de la misma forma. @cindex objetos dentro del pentagrama @cindex objetos fuera del pentagrama -Hay ciertos objetos en notación musical que pertenecen al pentagrama y -otros cuyo lugar se sitúa fuera del pentagrama. Reciben el nombre de -objetos dentro-del-pentagrama y objetos fuera-del-pentagrama, -respectivamente. +Hay ciertos objetos en notación musical que pertenecen al +pentagrama y otros cuyo lugar se sitúa fuera del pentagrama. +Reciben el nombre de objetos dentro-del-pentagrama y objetos +fuera-del-pentagrama, respectivamente. Los objetos dentro-del-pentagrama son los que se sitúan sobre la -pauta: cabezas, plicas, alteraciones, etc. Sus posiciones normalmente -se fijan por la propia música; se posicionan verticalmente sobre -líneas específicas del pentagrama o están unidos a otros objetos -posicionados de esta forma. Las colisiones entre cabezas, plicas y -alteraciones en acordes de notas muy juntas, normalmente se evitan -automáticamente. Hay instrucciones y sobreescrituras que pueden -modificar este comportamiento automático, como veremos en breve. - -Entre los objetos que pertenecen al exterior de la pauta se encuentran -cosas como las marcas de ensayo, las marcas de texto y las de -dinámica. La regla de LilyPond para la colocación vertical de los -objetos fuera-de-pentagrama es colocarlos tan cerca del pentagrama -como sea posible, pero no tan cerca como para que puedan chocar con -algún otro objeto. LilyPond utiliza la propiedad -@code{outside-staff-priority} para determinar el orden en que se deben -situar los objetos, como veremos ahora. +pauta: cabezas, plicas, alteraciones, etc. Sus posiciones +normalmente se fijan por la propia música; se posicionan +verticalmente sobre líneas específicas del pentagrama o están +unidos a otros objetos posicionados de esta forma. Las colisiones +entre cabezas, plicas y alteraciones en acordes de notas muy +juntas, normalmente se evitan automáticamente. Hay instrucciones +y sobreescrituras que pueden modificar este comportamiento +automático, como veremos en breve. + +Entre los objetos que pertenecen al exterior de la pauta se +encuentran cosas como las marcas de ensayo, las marcas de texto y +las de dinámica. La regla de LilyPond para la colocación vertical +de los objetos fuera-de-pentagrama es colocarlos tan cerca del +pentagrama como sea posible, pero no tan cerca como para que +puedan chocar con algún otro objeto. LilyPond utiliza la +propiedad @code{outside-staff-priority} para determinar el orden +en que se deben situar los objetos, como veremos ahora. En primer lugar, LilyPond sitúa todos los objetos dentro-del-pentagrama. Después ordena los objetos fuera-del-pentagrama de acuerdo con su prioridad -@code{outside-staff-priority}. Los objetos fuera-del-pentagrama se -toman de uno en uno, comenzando por el que tiene la prioridad -@code{outside-staff-priority} más baja, y se sitúan de forma que no -colisionen con ningún objeto que se haya colocado ya. Esto es, si dos -grobs fuera-del-pentagrama compiten por el mismo espacio, el que tiene -la prioridad @code{outside-staff-priority} más baja se colocará más -cerca del pentagrama. Si dos objetos tienen la misma -@code{outside-staff-priority}, el que se ha encontrado primero se -situará más cerca de la pauta. - -En el siguiente ejemplo, todos los textos de marcado tienen la misma -prioridad (pues no se ha establecido explícitamente). Observe que -@q{Text3} se posiciona de nuevo automáticamente cerca del pentagrama, -acomodado por debajo de @q{Text2}. +@code{outside-staff-priority}. Los objetos fuera-del-pentagrama +se toman de uno en uno, comenzando por el que tiene la prioridad +@code{outside-staff-priority} más baja, y se sitúan de forma que +no colisionen con ningún objeto que se haya colocado ya. Esto es, +si dos grobs fuera-del-pentagrama compiten por el mismo espacio, +el que tiene la prioridad @code{outside-staff-priority} más baja +se colocará más cerca del pentagrama. Si dos objetos tienen la +misma @code{outside-staff-priority}, el que se ha encontrado +primero se situará más cerca de la pauta. + +En el siguiente ejemplo, todos los textos de marcado tienen la +misma prioridad (pues no se ha establecido explícitamente). +Observe que @q{Text3} se posiciona de nuevo automáticamente cerca +del pentagrama, acomodado por debajo de @q{Text2}. @cindex markup, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" | -c2^"Text3" -c2^"Text4" | +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond -Los pentagramas también se posicionan, de forma predeterminada, tan -cerca unos de otros como sea posible (sujeto a una separación mínima). -Si las notas se proyectan muy lejos en dirección a un pentagrama -adyacente, forzarán a alejarse a los pentagramas sólo si en caso -contrario fuese a ocurrir un solapamiento de la notación. El ejemplo -siguiente muestra esta acomodación @q{nestling} de las notas sobre -pentagramas adyacentes: +Los pentagramas también se posicionan, de forma predeterminada, +tan cerca unos de otros como sea posible (sujeto a una separación +mínima). Si las notas se proyectan muy lejos en dirección a un +pentagrama adyacente, forzarán a alejarse a los pentagramas sólo +si en caso contrario fuese a ocurrir un solapamiento de la +notación. El ejemplo siguiente muestra esta acomodación +@q{nestling} de las notas sobre pentagramas adyacentes: @lilypond[quote,ragged-right,verbatim] << \new Staff { - \relative c' { c4 a, } + \relative { c'4 a, } } \new Staff { - \relative c'''' { c4 a, } + \relative { c''''4 a, } } >> @end lilypond @@ -1880,26 +1989,26 @@ pentagramas adyacentes: @subsection Objetos interiores al pentagrama @translationof Within-staff objects -Ya hemos visto cómo las instrucciones @code{\voiceXXX} afectan a la -dirección de las ligaduras de expresión y de unión, digitaciones y -todo lo demás que dependa de la dirección de las plicas (véase -@ref{Voces explícitas}). Cuando se -escribe música polifónica, estas instrucciones son esenciales para que -puedan distinguirse varias líneas melódicas entrelazadas. Pero -ocasionalmente puede ser necesario sobreescribir este comportamiento -automático. Se puede hacer por secciones de música completas o -incluso para una nota individual. La propiedad que controla este -comportamiento es la propiedad de @code{direction} (dirección) de cada -objeto de presentación. En primer lugar explicaremos qué hace esto, y -luego introduciremos algunas instrucciones listas para usar que le -evitarán tener que codificar sobreescrituras explícitas para las -modificaciones más comunes. +Ya hemos visto cómo las instrucciones @code{\voiceXXX} afectan a +la dirección de las ligaduras de expresión y de unión, +digitaciones y todo lo demás que dependa de la dirección de las +plicas (véase @ref{Voces explícitas}). Cuando se escribe música +polifónica, estas instrucciones son esenciales para que puedan +distinguirse varias líneas melódicas entrelazadas. Pero +ocasionalmente puede ser necesario sobreescribir este +comportamiento automático. Se puede hacer por secciones de música +completas o incluso para una nota individual. La propiedad que +controla este comportamiento es la propiedad de @code{direction} +(dirección) de cada objeto de presentación. En primer lugar +explicaremos qué hace esto, y luego introduciremos algunas +instrucciones listas para usar que le evitarán tener que codificar +sobreescrituras explícitas para las modificaciones más comunes. Algunos objetos de presentación como las ligaduras se curvan hacia -arriba o hacia abajo; otros como las plicas y los corchetes también se -mueven a la derecha o a la izquierda cuando apuntan hacia arriba o -hacia abajo. Esto se controla automáticamente cuando está establecida -la propiedad @code{direction}. +arriba o hacia abajo; otros como las plicas y los corchetes +también se mueven a la derecha o a la izquierda cuando apuntan +hacia arriba o hacia abajo. Esto se controla automáticamente +cuando está establecida la propiedad @code{direction}. @menu * La propiedad direction (dirección):: @@ -1919,34 +2028,35 @@ la propiedad @code{direction}. @cindex center @cindex neutral -El ejemplo siguiente muestra en el compás 1 el comportamiento -predeterminado de las plicas, con las de las notas agudas apuntando -hacia abajo y las graves hacia arriba, seguidas de cuatro notas con -todas las plicas forzadas hacia abajo, cuatro notas con las plicas -forzadas hacia arriba, y por último cuatro notas devueltas al -comportamiento predeterminado. +El ejemplo siguiente muestra en el primer compás la colocación +predeterminada de las ligaduras de expresión, estando por encima +las que comienzan en notas agudas y por debajo las que comienzan +en notas graves, seguido de un compás con ambas ligaduras forzadas +hacia abajo, otro compás con las dos forzadas hacia arriba y por +último un compás con las ligaduras devueltas a su comportamiento +predeterminado. -@cindex Stem, ejemplo de sobreescritura +@cindex Slur, ejemplo de sobreescritura @cindex direction, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -a4 g c a | -\override Stem.direction = #DOWN -a4 g c a | -\override Stem.direction = #UP -a4 g c a | -\revert Stem.direction -a4 g c a | +@lilypond[quote,fragment,verbatim] +a'4( g') c''( a') | +\override Slur.direction = #DOWN +a'4( g') c''( a') | +\override Slur.direction = #UP +a'4( g') c''( a') | +\revert Slur.direction +a'4( g') c''( a') | @end lilypond -Aquí utilizamos las constantes @code{DOWN} (abajo) y @code{UP} +Aquí hemos usado las constantes @code{DOWN} (abajo) y @code{UP} (arriba). Éstos tienen los valores @w{@code{-1}} y @code{+1} respectivamente, y dichos valores numéricos también se pueden usar directamente. El valor @code{0} también se puede usar en algunos -casos. Se trata simplemente con el significado de @code{UP} para las -plicas, pero para algunos objetos tiene el significado de -@q{centrado}. Existe una constante @code{CENTER} que tiene el valor -@code{0}. +casos. Se trata simplemente con el significado de @code{UP} para +las ligaduras de expresión, pero para algunos objetos tiene el +significado de @q{centrado}. Existe una constante @code{CENTER} +que tiene el valor @code{0}. Sin embargo, estas sobreescrituras no se usan muy a menudo porque están disponibles instrucciones predefinidas equivalentes más @@ -1997,13 +2107,22 @@ menciona el significado de cada una allí donde no es obvio. @end multitable Las variantes neutras o normales de estas instrucciones están -implementadas usando @code{\revert} y @strong{no} pueden ir +implementadas usando @code{\revert} y éstas @strong{no} pueden ir precedidas de @code{\once}. Si quiere limitar el efecto de las otras instrucciones (que están implementadas usando @code{\override}) a un solo paso de tiempo, puede precederla de @code{\once} de la misma forma en que lo haría con las sobreescrituras explícitas. +O bien, si un único objeto de presentación necesita forzarse hacia +arriba o hacia abajo, pueden usarse los indicadores de dirección, +@code{^} o @code{_}: + +@lilypond[quote,fragment,verbatim] +a'4( g') c''( a') | +a'4^( g') c''_( a') | +@end lilypond + @node Digitaciones @unnumberedsubsubsec Digitaciones @translationof Fingering @@ -2011,12 +2130,13 @@ sobreescrituras explícitas. @cindex digitación, colocación @cindex digitación de acordes -La colocación de las digitaciones sobre notas sueltas también se puede -controlar mediante la propiedad @code{direction}, pero los cambios -sobre @code{direction} no tienen ningún efecto sobre las notas de los -acordes. Como veremos, existen instrucciones especiales que permiten -controlar las digitaciones de notas individuales, situando la -digitación encima, debajo, a la izquierda o a la derecha de cada nota. +La colocación de las digitaciones sobre notas sueltas también se +puede controlar mediante la propiedad @code{direction}, pero los +cambios sobre @code{direction} no tienen ningún efecto sobre las +notas de los acordes. Como veremos, existen instrucciones +especiales que permiten controlar las digitaciones de notas +individuales, situando la digitación encima, debajo, a la +izquierda o a la derecha de cada nota. En primer lugar, he aquí el efecto de @code{direction} sobre las digitaciones aplicadas a notas sueltas. Se muestra en el primer @@ -2026,54 +2146,62 @@ siguiente el efecto de especificar @code{DOWN} y @code{UP}: @cindex Fingering, ejemplo de sobreescritura @cindex direction, propiedad, ejemplo -@lilypond[quote,verbatim,relative=2] -c4-5 a-3 f-1 c'-5 | -\override Fingering.direction = #DOWN -c4-5 a-3 f-1 c'-5 | -\override Fingering.direction = #UP -c4-5 a-3 f-1 c'-5 | +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #DOWN + c4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #UP + c4-5 a-3 f-1 c'-5 | +} @end lilypond -Sin embargo, la sobreescritura de la propiedad @code{direction} no es -la forma más sencilla de especificar manualmente la digitación por -encima o por debajo de las notas; suele ser preferible usar @code{_} o -@code{^} en lugar de @code{-}, antes del número de la digitación. -Este es el ejemplo anterior utilizando este método: +Sin embargo, la sobreescritura de la propiedad @code{direction} no +es la forma más sencilla de especificar manualmente la digitación +por encima o por debajo de las notas; suele ser preferible usar +@code{_} o @code{^} en lugar de @code{-}, antes del número de la +digitación. Este es el ejemplo anterior utilizando este método: @cindex fingering, ejemplo @cindex digitación, ejemplo -@lilypond[quote,verbatim,relative=2] -c4-5 a-3 f-1 c'-5 | -c4_5 a_3 f_1 c'_5 | -c4^5 a^3 f^1 c'^5 | +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + c4_5 a_3 f_1 c'_5 | + c4^5 a^3 f^1 c'^5 | +} @end lilypond La propiedad @code{direction} se ignora para los acordes, pero los prefijos direccionales @code{_} y @code{^} sí funcionan. De forma -predeterminada, las digitaciones se colocan automáticamente encima y -debajo de las notas de un acorde, como se muestra aquí: +predeterminada, las digitaciones se colocan automáticamente encima +y debajo de las notas de un acorde, como se muestra aquí: @cindex fingering, ejemplo @cindex digitación, ejemplo -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond @noindent -pero se puede forzar de manera que todos o algunos de los números de -digitación estén por encima o por debajo: +pero se puede forzar de manera que todos o algunos de los números +de digitación estén por encima o por debajo: @cindex fingering, ejemplo @cindex digitación, ejemplo -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond Es posible ejercer un control aún mayor sobre la colocación de las @@ -2086,23 +2214,24 @@ fingeringOrientations}. El formato de esta instrucción es: @noindent se utiliza @code{\set} porque @code{fingeringOrientations} es una -propiedad del contexto @code{Voice}, creado y usado por el grabador -@code{New_fingering_engraver}. - -La propiedad se puede establecer al valor de una lista de entre uno y -tres valores. Controla si las digitaciones se pueden colocar por -encima (si @code{up} aparece en la lista), por debajo (si aparece -@code{down}), a la izquierda (si aparece @code{left}) o a la derecha -(si aparece @code{right}). A la inversa, si una colocación no está en -la lista, no se sitúa ninguna digitación en dicho lugar. LilyPond -coma estas restricciones y se trabaja la mejor colocación para la -digitación de las notas de los acordes que siguen. Observe que -@code{left} y @code{right} son mutuamente excluyentes: las -digitaciones pueden situarse en un lado o en el otro, no en los dos. +propiedad del contexto @code{Voice}, creado y usado por el +grabador @code{New_fingering_engraver}. + +La propiedad se puede establecer al valor de una lista de entre +uno y tres valores. Controla si las digitaciones se pueden +colocar por encima (si @code{up} aparece en la lista), por debajo +(si aparece @code{down}), a la izquierda (si aparece @code{left}) +o a la derecha (si aparece @code{right}). A la inversa, si una +colocación no está en la lista, no se sitúa ninguna digitación en +dicho lugar. LilyPond coma estas restricciones y se trabaja la +mejor colocación para la digitación de las notas de los acordes +que siguen. Observe que @code{left} y @code{right} son mutuamente +excluyentes: las digitaciones pueden situarse en un lado o en el +otro, no en los dos. @warning{Para controlar la colocación de la digitación de una sola -nota usando esta instrucción es necesario escribirla como un acorde de -una sola nota encerrándola entre ángulos simples.} +nota usando esta instrucción es necesario escribirla como un +acorde de una sola nota encerrándola entre ángulos simples.} Aquí podemos ver algunos ejemplos: @@ -2111,47 +2240,51 @@ Aquí podemos ver algunos ejemplos: @cindex @code{\set}, ejemplo de utilización @cindex fingeringOrientations, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(left) -4 -4 | -\set fingeringOrientations = #'(up left down) -4 -4 -\set fingeringOrientations = #'(up left) -4 -4 | -\set fingeringOrientations = #'(right) -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} @end lilypond @noindent Si la digitación parece un poco superpoblada, se puede reducir el -tamaño @code{font-size}. El valor predeterminado puede verse en el -objeto @code{Fingering} del RFI que es @w{@code{-5}}, así que probaremos -@w{@code{-7}}: - -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\override Fingering.font-size = #-7 -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(left) -4 -4 | -\set fingeringOrientations = #'(up left down) -4 -4 -\set fingeringOrientations = #'(up left) -4 -4 | -\set fingeringOrientations = #'(right) -4 -4 +tamaño @code{font-size}. El valor predeterminado puede verse en +el objeto @code{Fingering} del RFI que es @w{@code{-5}}, así que +probaremos @w{@code{-7}}: + +@lilypond[quote,ragged-right,verbatim] +\relative { + \override Fingering.font-size = #-7 + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} @end lilypond @@ -2159,9 +2292,9 @@ objeto @code{Fingering} del RFI que es @w{@code{-5}}, así que probaremos @subsection Objetos fuera del pentagrama @translationof Outside-staff objects -Los objetos fuera-del-pentagrama se sitúan automáticamente para evitar -las colisiones. Existen varias formas de sobreescribir la colocación -automática si el posicionado no resulta óptimo. +Los objetos fuera-del-pentagrama se sitúan automáticamente para +evitar las colisiones. Existen varias formas de sobreescribir la +colocación automática si el posicionado no resulta óptimo. @menu * La propiedad outside-staff-priority (prioridad fuera del pentagrama):: @@ -2176,32 +2309,34 @@ automática si el posicionado no resulta óptimo. @translationof The outside-staff-priority property Los objetos fuera-del-pentagrama se colocan automáticamente para -evitar las colisiones. Los objetos que tienen el valor más bajo de la -propiedad @code{outside-staff-priority} se sitúan más cerca del -pentagrama, y entonces otros objetos fuera-del-pentagrama se elevan -tanto como sea necesario para evitar la colisión. La prioridad -@code{outside-staff-priority} se defina en el @code{grob-interface} y -así es una propiedad de todos los objetos de presentación. De forma -predeterminada se establece a @code{#f} para todos los objetos -dentro-del-pentagrama, y a un valor numérico adecuado a cada objeto -fuera-del-pentagrama cuando se crea el objeto. La tabla siguiente -presenta los valores numéricos predeterminados para algunos de los -objetos fuera-del-pentagrama más comunes. +evitar las colisiones. Los objetos que tienen el valor más bajo +de la propiedad @code{outside-staff-priority} se sitúan más cerca +del pentagrama, y entonces otros objetos fuera-del-pentagrama se +elevan tanto como sea necesario para evitar la colisión. La +prioridad @code{outside-staff-priority} se defina en el +@code{grob-interface} y así es una propiedad de todos los objetos +de presentación. De forma predeterminada se establece a @code{#f} +para todos los objetos dentro-del-pentagrama, y a un valor +numérico adecuado a cada objeto fuera-del-pentagrama cuando se +crea el objeto. La tabla siguiente presenta los valores numéricos +predeterminados para algunos de los objetos fuera-del-pentagrama +más comunes. @cindex objetos de extensión Observe los nombres algo inusuales de algunos de los objetos: los objetos de extensión se crean automáticamente para controlar el -posicionamiento vertical de los grobs que (quizá) comienzan y terminan -en distintos momentos musicales, de manera que cualquier modificación -a la prioridad @code{outside-staff-priority} del grob subyacente no -tiene ningún efecto. Por ejemplo, cambiar la -@code{outside-staff-priority} del objeto de regulador @code{Hairpin} -no tiene efecto sobre la posición vertical de los reguladores: en -lugar de eso, tenemos que cambiar la @code{outside-staff-priority} del -objeto asociado @code{DynamicLineSpanner}. Esta sobreescritura se -debe escribir al comienzo del objeto de extensión, que podría incluir -varios reguladores o matices dinámicos encadenados. +posicionamiento vertical de los grobs que (quizá) comienzan y +terminan en distintos momentos musicales, de manera que cualquier +modificación a la prioridad @code{outside-staff-priority} del grob +subyacente no tiene ningún efecto. Por ejemplo, cambiar la +@code{outside-staff-priority} del objeto de regulador +@code{Hairpin} no tiene efecto sobre la posición vertical de los +reguladores: en lugar de eso, tenemos que cambiar la +@code{outside-staff-priority} del objeto asociado +@code{DynamicLineSpanner}. Esta sobreescritura se debe escribir +al comienzo del objeto de extensión, que podría incluir varios +reguladores o matices dinámicos encadenados. @multitable @columnfractions .3 .3 .3 @headitem Objeto de presentación @@ -2239,21 +2374,19 @@ varios reguladores o matices dinámicos encadenados. @tab Trinos mantenidos @end multitable -He aquí un ejemplo que muestra la situación predeterminada de algunos -de ellos. +He aquí un ejemplo que muestra la situación predeterminada de +algunos de ellos. @cindex texto, extensiones de @cindex octava alta y baja, corchete de @funindex \startTextSpan -@funindex startTextSpan @funindex \stopTextSpan -@funindex stopTextSpan @cindex TextSpanner, ejemplo de sobreescritura @cindex bound-details, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +@lilypond[quote,fragment,ragged-right,verbatim] % Set details for later Text Spanner \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } @@ -2261,28 +2394,30 @@ de ellos. \dynamicUp % Start Ottava Bracket \ottava #1 -c'4 \startTextSpan +c''4 \startTextSpan % Add Dynamic Text and hairpin -c4\pp\< -c4 +c''4\pp\< +c''4 % Add Text Script -c4^Text | -c4 c +c''4^Text | +c''4 c'' % Add Dynamic Text and terminate hairpin -c4\ff c \stopTextSpan | +c''4\ff c'' \stopTextSpan | % Stop Ottava Bracket \ottava #0 -c,4 c c c | +c'4 c' c' c' | @end lilypond Este ejemplo también muestra cómo crear textos con extensión (Text -Spanners): textos con líneas extensoras por encima de una sección de -música. El extensor abarca desde la instrucción @code{\startTextSpan} -hasta la instrucción @code{\stopTextSpan}, y el formado del texto se -define por medio de la instrucción @code{\override TextSpanner}. Para -ver más detalles, consulte @ruser{Extensiones de texto}. +Spanners): textos con líneas extensoras por encima de una sección +de música. El extensor abarca desde la instrucción +@code{\startTextSpan} hasta la instrucción @code{\stopTextSpan}, y +el formado del texto se define por medio de la instrucción +@code{\override TextSpanner}. Para ver más detalles, consulte +@ruser{Extensiones de texto}. -También muestra la manera de crear corchetes de octava alta y baja. +También muestra la manera de crear corchetes de octava alta y +baja. @cindex trucar la situación de los números de compás @cindex números de compás, ajustar posición @@ -2291,20 +2426,20 @@ También muestra la manera de crear corchetes de octava alta y baja. @cindex trucar la situación de las letras de ensayo @cindex ensayo, letras, trucar la colocación -Si los valores predeterminados de @code{outside-staff-priority} no le -ofrecen las colocaciones deseadas se puede sobreescribir la prioridad -de cualquiera de los objetos. Suponga que quisiéramos que el corchete -de octava estuviera situado por debajo del elemento extensor de texto -en el ejemplo de arriba. Todo lo que debemos hacer es localizar la -prioridad de @code{OttavaBracket} en el RFI o en las tablas -anteriores, y reducirlo a un valor inferior al de @code{TextSpanner}, -recordando que @code{OttavaBracket} se crea dentro del contexto de -@code{Staff}: +Si los valores predeterminados de @code{outside-staff-priority} no +le ofrecen las colocaciones deseadas se puede sobreescribir la +prioridad de cualquiera de los objetos. Suponga que quisiéramos +que el corchete de octava estuviera situado por debajo del +elemento extensor de texto en el ejemplo de arriba. Todo lo que +debemos hacer es localizar la prioridad de @code{OttavaBracket} en +el RFI o en las tablas anteriores, y reducirlo a un valor inferior +al de @code{TextSpanner}, recordando que @code{OttavaBracket} se +crea dentro del contexto de @code{Staff}: @cindex TextSpanner, ejemplo de sobreescritura @cindex bound-details, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +@lilypond[quote,fragment,ragged-right,verbatim] % Set details for later Text Spanner \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } @@ -2314,84 +2449,88 @@ recordando que @code{OttavaBracket} se crea dentro del contexto de \once \override Staff.OttavaBracket.outside-staff-priority = #340 % Start Ottava Bracket \ottava #1 -c'4 \startTextSpan +c''4 \startTextSpan % Add Dynamic Text -c4\pp +c''4\pp % Add Dynamic Line Spanner -c4\< +c''4\< % Add Text Script -c4^Text | -c4 c +c''4^Text | +c''4 c'' % Add Dynamic Text -c4\ff c \stopTextSpan | +c''4\ff c'' \stopTextSpan | % Stop Ottava Bracket \ottava #0 -c,4 c c c | +c'4 c' c' c' | @end lilypond Observe que algunos de estos objetos, concretamente los números de compás, las indicaciones metronómicas y las letras de ensayo, se -alojan de forma predeterminada dentro del contexto @code{Score}; así -pues, debe asegurarse de que utiliza el contexto adecuado cuando se -sobreescriben sus propiedades. +alojan de forma predeterminada dentro del contexto @code{Score}; +así pues, debe asegurarse de que utiliza el contexto adecuado +cuando se sobreescriben sus propiedades. @cindex ligaduras y outside-staff-priority @cindex ligaduras y articulaciones @cindex articulaciones y ligaduras -De forma predeterminada, las ligaduras de expresión están clasificadas -como objetos dentro-del-pentagrama, pero con frecuencia aparecen -encima del pentagrama si las notas que une son muy agudas. Ello puede -empujar a una posición muy elevada a los objetos fuera-del-pentagrama -como las articulaciones, pues la ligadura se colocará en primer lugar. -La propiedad @code{avoid-slur} de la articulación se puede establecer -al valor @code{'inside} (por dentro) para llevarla al interior de la -ligadura, pero la propiedad @code{avoid-slur} es efectiva solamente si -la prioridad @code{outside-staff-priority} está también ajustada al -valor @code{#f}. De forma alternativa, la prioridad -@code{outside-staff-priority} de la ligadura se puede fijar en un -valor numérico para hacer que se sitúe en línea con otros objetos -fuera del pentagrama de acuerdo con este valor. He aquí un ejemplo -que muestra el efecto de los dos métodos: - -@lilypond[quote,verbatim,relative=2] -c4( c^\markup { \tiny \sharp } d4.) c8 | -c4( -\once \override TextScript.avoid-slur = #'inside -\once \override TextScript.outside-staff-priority = ##f -c4^\markup { \tiny \sharp } d4.) c8 | -\once \override Slur.outside-staff-priority = #500 -c4( c^\markup { \tiny \sharp } d4.) c8 | +De forma predeterminada, las ligaduras de expresión están +clasificadas como objetos dentro-del-pentagrama, pero con +frecuencia aparecen encima del pentagrama si las notas que une son +muy agudas. Ello puede empujar a una posición muy elevada a los +objetos fuera-del-pentagrama como las articulaciones, pues la +ligadura se colocará en primer lugar. La propiedad +@code{avoid-slur} de la articulación se puede establecer al valor +@code{'inside} (por dentro) para llevarla al interior de la +ligadura, pero la propiedad @code{avoid-slur} es efectiva +solamente si la prioridad @code{outside-staff-priority} está +también ajustada al valor @code{#f}. De forma alternativa, la +prioridad @code{outside-staff-priority} de la ligadura se puede +fijar en un valor numérico para hacer que se sitúe en línea con +otros objetos fuera del pentagrama de acuerdo con este valor. He +aquí un ejemplo que muestra el efecto de los dos métodos: + +@lilypond[quote,verbatim] +\relative c'' { + c4( c^\markup { \tiny \sharp } d4.) c8 | + c4( + \once \override TextScript.avoid-slur = #'inside + \once \override TextScript.outside-staff-priority = ##f + c4^\markup { \tiny \sharp } d4.) c8 | + \once \override Slur.outside-staff-priority = #500 + c4( c^\markup { \tiny \sharp } d4.) c8 | +} @end lilypond -Los cambios en @code{outside-staff-priority} también se pueden emplear -para controlar la situación vertical de los objetos individuales, -aunque los resultados pueden no siempre ser deseables. Suponga que -quiere que @qq{Text3} se sitúe por encima de @qq{Text4} en el ejemplo -bajo el epígrafe Comportamiento Automático de más arriba (véase -@ref{Comportamiento automático}). Todo lo que debemos hacer es localizar la -prioridad de @code{TextScript} en el RFI o en las tablas de arriba, y -aumentar la prioridad de @qq{Text3} hasta un valor superior: +Los cambios en @code{outside-staff-priority} también se pueden +emplear para controlar la situación vertical de los objetos +individuales, aunque los resultados pueden no siempre ser +deseables. Suponga que quiere que @qq{Text3} se sitúe por encima +de @qq{Text4} en el ejemplo bajo el epígrafe Comportamiento +Automático de más arriba (véase @ref{Comportamiento automático}). +Todo lo que debemos hacer es localizar la prioridad de +@code{TextScript} en el RFI o en las tablas de arriba, y aumentar +la prioridad de @qq{Text3} hasta un valor superior: @cindex TextScript, ejemplo de sobreescritura @cindex outside-staff-priority, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" | +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | \once \override TextScript.outside-staff-priority = #500 -c2^"Text3" -c2^"Text4" | +c''2^"Text3" +c''2^"Text4" | @end lilypond -Esto, ciertamente, eleva a @qq{Text3} por encima de @qq{Text4} pero -también lo eleva por encima de @qq{Text2}, y @qq{Text4} ahora se -desploma hacia abajo. Quizá no sea tan buena idea. ¿Y si lo que -realmente queremos hacer es posicionar todas las anotaciones a la -misma distancia por encima del pentagrama? Para hacerlo, vamos a -necesitar claramente espaciar las notas en sentido horizontal para -hacer sitio para el texto. Esto se hace empleando la instrucción -@code{textLengthOn}. +Esto, ciertamente, eleva a @qq{Text3} por encima de @qq{Text4} +pero también lo eleva por encima de @qq{Text2}, y @qq{Text4} ahora +se desploma hacia abajo. Quizá no sea tan buena idea. ¿Y si lo +que realmente queremos hacer es posicionar todas las anotaciones a +la misma distancia por encima del pentagrama? Para hacerlo, vamos +a necesitar claramente espaciar las notas en sentido horizontal +para hacer sitio para el texto. Esto se hace empleando la +instrucción @code{textLengthOn}. @node La instrucción textLengthOn @unnumberedsubsubsec La instrucción @code{@bs{}textLengthOn} @@ -2400,62 +2539,63 @@ hacer sitio para el texto. Esto se hace empleando la instrucción @cindex notas, espaciar junto al texto @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff -De forma predeterminada, el texto producido mediante marcado no ocupa -ningún espacio horizontal en cuanto se refiere a la disposición de la -música. La instrucción @code{\textLengthOn} invierte este -comportamiento, ocasionando que las notas resulten tan espaciadas como -sea necesario para acomodar el texto: +De forma predeterminada, el texto producido mediante marcado no +ocupa ningún espacio horizontal en cuanto se refiere a la +disposición de la música. La instrucción @code{\textLengthOn} +invierte este comportamiento, ocasionando que las notas resulten +tan espaciadas como sea necesario para acomodar el texto: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,fragment,ragged-right,verbatim] \textLengthOn % Cause notes to space out to accommodate text -c2^"Text1" -c2^"Text2" | -c2^"Text3" -c2^"Text4" | +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond La instrucción para volver al comportamiento predeterminado es @code{\textLengthOff}. De forma alternativa, se puede usar -@code{\once} con @code{\textLengthOn} si el efecto se ha de limitar a -un solo momento musical. -The corresponding spacing behavior for rehearsal marks and tempo -indications is independently controlled with the commands -@code{\markLengthOn} and @code{\markLengthOff}. +@code{\once} con @code{\textLengthOn} si el efecto se ha de +limitar a un solo momento musical. El comportamiento de espaciado +correspondiente para las llamadas de ensayo y las indicaciones de +tempo se controla independientemente con las instrucciones +@code{\markLengthOn} y @code{\markLengthOff}. @cindex marcado, texto de, permitir las colisiones en El texto de marcado también evita las notas que se proyectan por encima del pentagrama. Si esto no es lo que deseamos, el -desplazamiento automático hacia arriba se puede desactivar mediante el -establecimiento de la prioridad a @code{#f}. He aquí un ejemplo que -muestra cómo el texto de marcado interactúa con tales notas. +desplazamiento automático hacia arriba se puede desactivar +mediante el establecimiento de la prioridad a @code{#f}. He aquí +un ejemplo que muestra cómo el texto de marcado interactúa con +tales notas. @cindex TextScript, ejemplo de sobreescritura @cindex outside-staff-priority, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -% This markup is short enough to fit without collision -c2^"Tex" c'' | -R1 | - -% This is too long to fit, so it is displaced upwards -c,,2^"Text" c'' | -R1 | - -% Turn off collision avoidance -\once \override TextScript.outside-staff-priority = ##f -c,,2^"Long Text " c'' | -R1 | - -% Turn off collision avoidance -\once \override TextScript.outside-staff-priority = ##f -\textLengthOn % and turn on textLengthOn -c,,2^"Long Text " % Spaces at end are honored -c''2 | +@lilypond[quote,ragged-right,verbatim] +\relative { + % This markup is short enough to fit without collision + c''2^"Tex" c'' | + R1 | + + % This is too long to fit, so it is displaced upwards + c,,2^"Text" c'' | + R1 | + + % Turn off collision avoidance + \once \override TextScript.outside-staff-priority = ##f + c,,2^"Long Text " c'' | + R1 | + + % Turn off collision avoidance + \once \override TextScript.outside-staff-priority = ##f + \textLengthOn % and turn on textLengthOn + c,,2^"Long Text " % Spaces at end are honored + c''2 | +} @end lilypond @node Posicionamiento de los matices dinámicos @@ -2466,43 +2606,45 @@ c''2 | @cindex dinámica, trucar la colocación de las indicaciones de @cindex matices, trucar la colocación -Las indicaciones de matiz dinámico normalmente se colocarán por debajo -del pentagrama, pero se pueden posicionar por encima con la -instrucción @code{\dynamicUp}. Se situarán verticalmente respecto a la -nota a la que van adosadas, y flotarán por debajo (o por encima) de -todos los objetos dentro-del-pentagrama tales como ligaduras de fraseo -y números de compás. Esto puede ofrecer resultados bastante -aceptables, como muestra este ejemplo: - -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\clef "bass" -\key aes \major -\time 9/8 -\dynamicUp -bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | -ees,2.~\)\mf ees4 r8 | +Las indicaciones de matiz dinámico normalmente se colocarán por +debajo del pentagrama, pero se pueden posicionar por encima con la +instrucción @code{\dynamicUp}. Se situarán verticalmente respecto +a la nota a la que van adosadas, y flotarán por debajo (o por +encima) de todos los objetos dentro-del-pentagrama tales como +ligaduras de fraseo y números de compás. Esto puede ofrecer +resultados bastante aceptables, como muestra este ejemplo: + +@lilypond[quote,ragged-right,verbatim] +\relative { + \clef "bass" + \key aes \major + \time 9/8 + \dynamicUp + bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | + ees,2.~\)\mf ees4 r8 | +} @end lilypond -Sin embargo, si las notas y sus indicaciones dinámicas adosadas están -muy cerca, la colocación automática evitará las colisiones desplazando -las marcas dinámicas posteriores más lejos, aunque este puede no ser -el lugar óptimo, como muestra el siguiente ejemplo más bien -artificial: +Sin embargo, si las notas y sus indicaciones dinámicas adosadas +están muy cerca, la colocación automática evitará las colisiones +desplazando las marcas dinámicas posteriores más lejos, aunque +este puede no ser el lugar óptimo, como muestra el siguiente +ejemplo más bien artificial: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim,fragment] \dynamicUp -a4\f b\mf a\mp b\p +\relative { a'4\f b\mf a\mp b\p } @end lilypond @noindent -Si se presentara una situación similar en música @q{real}, podría ser -preferible espaciar las notas un poco más entre sí, de forma que todas -las marcas dinámicas puedan caber a la misma distancia vertical desde -el pentagrama. Hemos sido capaces de hacer esto para el texto de -marcado utilizando la instrucción @code{\textLengthOn}, pero no existe -una instrucción equivalente para las indicaciones de matiz dinámico. -Por tanto, tendremos que averiguar cómo hacerlo utilizando -instrucciones @code{\override}. +Si se presentara una situación similar en música @q{real}, podría +ser preferible espaciar las notas un poco más entre sí, de forma +que todas las marcas dinámicas puedan caber a la misma distancia +vertical desde el pentagrama. Hemos sido capaces de hacer esto +para el texto de marcado utilizando la instrucción +@code{\textLengthOn}, pero no existe una instrucción equivalente +para las indicaciones de matiz dinámico. Por tanto, tendremos que +averiguar cómo hacerlo utilizando instrucciones @code{\override}. @node Escalado de un «Grob» @unnumberedsubsubsec Escalado de un «Grob» @@ -2511,17 +2653,18 @@ instrucciones @code{\override}. @cindex grob, cambio de tamaño de un @cindex escala de los grobs -En primer lugar debemos aprender cómo se especifica el tamaño de los -grobs. Todos los grobs tienen un punto de referencia definido dentro -de ellos que se usa para colocarlos respecto a su objeto padre. -Entonces, este punto del grob se posiciona a una distancia horizontal, -@code{X-offset}, y una distancia vertical, @code{Y-offset}, a partir -de su padre. La dimensión horizontal del objeto viene dada por una -pareja de números, @code{X-extent}, que dice dónde están los límites -izquierdo y derecho respecto del punto de referencia. La amplitud -vertical se define de forma similar mediante una pareja de números, -@code{Y-extent}. Éstas son propiedades de todos los grobs que -contemplan el @code{grob-interface}. +En primer lugar debemos aprender cómo se especifica el tamaño de +los grobs. Todos los grobs tienen un punto de referencia definido +dentro de ellos que se usa para colocarlos respecto a su objeto +padre. Entonces, este punto del grob se posiciona a una distancia +horizontal, @code{X-offset}, y una distancia vertical, +@code{Y-offset}, a partir de su padre. La dimensión horizontal +del objeto viene dada por una pareja de números, @code{X-extent}, +que dice dónde están los límites izquierdo y derecho respecto del +punto de referencia. La amplitud vertical se define de forma +similar mediante una pareja de números, @code{Y-extent}. Éstas +son propiedades de todos los grobs que contemplan el +@code{grob-interface}. @cindex @code{extra-spacing-width} @@ -2549,11 +2692,11 @@ Veamos si funciona en nuestro ejemplo anterior: @cindex DynamicText, ejemplo de sobreescritura @cindex extra-spacing-width, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim,fragment] \dynamicUp % Extend width by 1 staff space \override DynamicText.extra-spacing-width = #'(-0.5 . 0.5) -a4\f b\mf a\mp b\p +\relative { a'4\f b\mf a\mp b\p } @end lilypond @noindent @@ -2791,35 +2934,38 @@ consulte @cindex objetos que colisionan, mover @cindex grobs que colisionan, mover -Aunque pueda sorprenderle, LilyPond no es perfecto. Ciertos elementos -de notación se pueden superponer, lo que es una lástima, pero en -realidad es bastante poco frecuente. Normalmente la necesidad de -mover objetos es por claridad o razones estéticas: el aspecto es mejor -con un poco más o un poco menos de espacio de separación. +Aunque pueda sorprenderle, LilyPond no es perfecto. Ciertos +elementos de notación se pueden superponer, lo que es una lástima, +pero en realidad es bastante poco frecuente. Normalmente la +necesidad de mover objetos es por claridad o razones estéticas: el +aspecto es mejor con un poco más o un poco menos de espacio de +separación. Existen tres enfoques principales que llevan a la resolución de -superposiciones en la notación. Se deben considerar en el siguiente -orden: +superposiciones en la notación. Se deben considerar en el +siguiente orden: @enumerate @item -La @strong{dirección} de uno de los objetos que se superponen se puede -cambiar usando las instrucciones predefinidas que están relacionadas -arriba para los objetos dentro-del-pentagrama (véase @ref{Objetos interiores al pentagrama}). -Se pueden recolocar fácilmente las -plicas, ligaduras de expresión y de unión, barras de corchea, -indicaciones dinámicas, texto y grupos de valoración especial de esta -forma. La limitación es que sólo tiene la posibilidad de elegir entre -dos posiciones, y podría ser que ninguna de ellas sea la adecuada. +La @strong{dirección} de uno de los objetos que se superponen se +puede cambiar usando las instrucciones predefinidas que están +relacionadas arriba para los objetos dentro-del-pentagrama (véase +@ref{Objetos interiores al pentagrama}). Se pueden recolocar +fácilmente las plicas, ligaduras de expresión y de unión, barras +de corchea, indicaciones dinámicas, texto y grupos de valoración +especial de esta forma. La limitación es que sólo tiene la +posibilidad de elegir entre dos posiciones, y podría ser que +ninguna de ellas sea la adecuada. @item Las @strong{propiedades del objeto}, que LilyPond usa cuando está -colocando los objetos de presentación, se pueden modificar usando la -instrucción de sobreescritura @code{\override}. Las ventadas de hacer -cambios a este tipo de propiedad son: a) que algún otro objeto se -moverá automáticamente si es necesario, para dejarle sitio, y b) una -única sobreescritura se puede aplicar a todas las instancias del mismo -tipo de objeto. Entre tales propiedades se encuentran: +colocando los objetos de presentación, se pueden modificar usando +la instrucción de sobreescritura @code{\override}. Las ventadas +de hacer cambios a este tipo de propiedad son: a) que algún otro +objeto se moverá automáticamente si es necesario, para dejarle +sitio, y b) una única sobreescritura se puede aplicar a todas las +instancias del mismo tipo de objeto. Entre tales propiedades se +encuentran: @itemize @@ -2838,72 +2984,73 @@ Ya se ha estudiado con cierto detalle: véase @ref{Objetos interiores al pentagr @cindex right-padding, propiedad @cindex staff-padding, propiedad -Según un objeto se está colocando, el valor de su propiedad de relleno -@code{padding} especifica el espacio intermedio que se debe dejar -entre él mismo y el límite más próximo del objeto contra el que se -está colocando. Observe que es el valor de @code{padding} del objeto -@strong{que se está colocando} el que se usa; el valor de -@code{padding} del objeto que ya está colocado se ignora. Los -espacios intermedios especificados mediante @code{padding} se pueden -aplicar a todos los objetos que contemplan el interface -@code{side-position-interface}. +Según un objeto se está colocando, el valor de su propiedad de +relleno @code{padding} especifica el espacio intermedio que se +debe dejar entre él mismo y el límite más próximo del objeto +contra el que se está colocando. Observe que es el valor de +@code{padding} del objeto @strong{que se está colocando} el que se +usa; el valor de @code{padding} del objeto que ya está colocado se +ignora. Los espacios intermedios especificados mediante +@code{padding} se pueden aplicar a todos los objetos que +contemplan el interface @code{side-position-interface}. En lugar de con @code{padding}, la colocación de los grupos de -alteraciones se controla con -@code{right-padding}. Esta propiedad se encuentra en el objeto -@code{AccidentalPlacement} que, observe, vive dentro del contexto de -@strong{Staff}. Durante el proceso tipográfico, las cabezas de las -notas se componen tipográficamente en primer lugar, y después las -alteraciones, si existen, se añaden a la izquierda de las cabezas -utilizando la propiedad de relleno por la derecha @code{right-padding} -para determinar la separación entre la alteración y la cabeza, y -de las alteraciones entre sí. Así -pues, sólo la propiedad de relleno por la derecha @code{right-padding} -del objeto @code{AccidentalPlacement} tiene efecto sobre la colocación -de las alteraciones. - -La propiedad @code{staff-padding} está estrechamente relacionada con -la propiedad @code{padding}: @code{padding} controla la separación -mínima entre cualquier objeto que contemple el interface -@code{side-position-interface} y el objeto más cercano (generalmente -la nota o las líneas del pentagrama); @code{staff-padding} se aplica -sólo a los objetos que siempre se sitúan fuera del pentagrama: -controla la separación mínima entre dicho objeto y el pentagrama. -Observe que @code{staff-padding} no tiene ningún efecto sobre objetos -que se posicionan respecto a la nota en vez de hacerlo respecto al -pentagrama, incluso aunque puede ser sobreescrito sin error por tales -objetos: simplemente se ignora. - -Para descubrir qué propiedad de relleno se necesita para el objeto que -quiere recolocar, debe volver al manual de RFI y buscar las +alteraciones se controla con @code{right-padding}. Esta propiedad +se encuentra en el objeto @code{AccidentalPlacement} que, observe, +vive dentro del contexto de @strong{Staff}. Durante el proceso +tipográfico, las cabezas de las notas se componen tipográficamente +en primer lugar, y después las alteraciones, si existen, se añaden +a la izquierda de las cabezas utilizando la propiedad de relleno +por la derecha @code{right-padding} para determinar la separación +entre la alteración y la cabeza, y de las alteraciones entre sí. +Así pues, sólo la propiedad de relleno por la derecha +@code{right-padding} del objeto @code{AccidentalPlacement} tiene +efecto sobre la colocación de las alteraciones. + +La propiedad @code{staff-padding} está estrechamente relacionada +con la propiedad @code{padding}: @code{padding} controla la +separación mínima entre cualquier objeto que contemple el +interface @code{side-position-interface} y el objeto más cercano +(generalmente la nota o las líneas del pentagrama); +@code{staff-padding} se aplica sólo a los objetos que siempre se +sitúan fuera del pentagrama: controla la separación mínima entre +dicho objeto y el pentagrama. Observe que @code{staff-padding} no +tiene ningún efecto sobre objetos que se posicionan respecto a la +nota en vez de hacerlo respecto al pentagrama, incluso aunque +puede ser sobreescrito sin error por tales objetos: simplemente se +ignora. + +Para descubrir qué propiedad de relleno se necesita para el objeto +que quiere recolocar, debe volver al manual de RFI y buscar las propiedades del objeto. Tenga cuidado porque las propiedades de -relleno podrían no estar en el objeto más obvio, así que busque en los -objetos que puedan tener alguna relación con él. +relleno podrían no estar en el objeto más obvio, así que busque en +los objetos que puedan tener alguna relación con él. Todos los valores de relleno se miden en espacios del pentagrama. Para la mayor parte de los objetos el valor se establece de forma -predeterminada en aproximadamente 1.0 o menos (varía con cada objeto). -Se puede sobreescribir si se necesita una separación intermedia mayor -(o menor). +predeterminada en aproximadamente 1.0 o menos (varía con cada +objeto). Se puede sobreescribir si se necesita una separación +intermedia mayor (o menor). @item @code{self-alignment-X} (Auto-alineamiento en el eje X) @cindex self-alignment-X, propiedad -Esta propiedad se puede usar para alinear el objeto a la izquierda, a -la derecha, o centrarlo con respecto al punto de referencia del objeto -«padre». Se puede usar con todos los objetos que contemplan el -interface -@code{self-alignment-interface}. En general son objetos que contienen -texto. Los valores son @code{LEFT}, @code{RIGHT} o @code{CENTER}. De -forma alternativa se puede especificar un valor numérico entre -@w{@code{-1}} y @code{+1}, donde @w{@code{-1}} es alineado por la izquierda, -@code{+1} es alineado por la derecha, y los números intermedios mueven -el texto progresivamente desde alineado por la izquierda hasta alineado -por la derecha. Se pueden especificar valores numéricos mayores de -@code{1} para mover el texto incluso más lejos hacia la izquierda, o -menos de @w{@code{-1}} para alejarlo más hacia la derecha. Un cambio en +Esta propiedad se puede usar para alinear el objeto a la +izquierda, a la derecha, o centrarlo con respecto al punto de +referencia del objeto «padre». Se puede usar con todos los +objetos que contemplan el interface +@code{self-alignment-interface}. En general son objetos que +contienen texto. Los valores son @code{LEFT}, @code{RIGHT} o +@code{CENTER}. De forma alternativa se puede especificar un valor +numérico entre @w{@code{-1}} y @code{+1}, donde @w{@code{-1}} es +alineado por la izquierda, @code{+1} es alineado por la derecha, y +los números intermedios mueven el texto progresivamente desde +alineado por la izquierda hasta alineado por la derecha. Se +pueden especificar valores numéricos mayores de @code{1} para +mover el texto incluso más lejos hacia la izquierda, o menos de +@w{@code{-1}} para alejarlo más hacia la derecha. Un cambio en @code{1} en el valor corresponde a un movimiento de la mitad de la longitud total del propio texto. @@ -2912,14 +3059,15 @@ longitud total del propio texto. @cindex extra-spacing-width, propiedad -Esta propiedad está disponible para todos los objetos que contemplan -el interface @code{item-interface}. Toma dos números, el primero se -suma al límite izquierdo y el segundo se suma al límite derecho. Los -números negativos desplazan el límite a la izquierda y los positivos a -la derecha, por lo que para ensanchar un objeto el primer número debe -ser negativo y el segundo positivo. Observe que no todos los objetos -ostentan los dos números. Por ejemplo, el objeto @code{Accidental} -(alteración) sólo toma nota del primer número (el borde izquierdo). +Esta propiedad está disponible para todos los objetos que +contemplan el interface @code{item-interface}. Toma dos números, +el primero se suma al límite izquierdo y el segundo se suma al +límite derecho. Los números negativos desplazan el límite a la +izquierda y los positivos a la derecha, por lo que para ensanchar +un objeto el primer número debe ser negativo y el segundo +positivo. Observe que no todos los objetos ostentan los dos +números. Por ejemplo, el objeto @code{Accidental} (alteración) +sólo toma nota del primer número (el borde izquierdo). @item @code{staff-position} (posición de pentagrama) @@ -2927,12 +3075,13 @@ ostentan los dos números. Por ejemplo, el objeto @code{Accidental} @cindex staff-position, propiedad @code{staff-position} es una propiedad del interface -@code{staff-symbol-referencer-interface}, que está contemplado por los -objetos que se colocan con relación al pentagrama. Especifica la -posición vertical del objeto con relación a la tercera línea del -pentagrama en medios espacios de pentagrama. Es útil en la -resolución de colisiones entre objetos de presentación como silencios -multi-compás, ligaduras de unión y notas en distintas voces. +@code{staff-symbol-referencer-interface}, que está contemplado por +los objetos que se colocan con relación al pentagrama. Especifica +la posición vertical del objeto con relación a la tercera línea +del pentagrama en medios espacios de pentagrama. Es útil en la +resolución de colisiones entre objetos de presentación como +silencios multi-compás, ligaduras de unión y notas en distintas +voces. @item @code{horizontal-shift} @@ -2943,15 +3092,11 @@ multi-compás, ligaduras de unión y notas en distintas voces. @cindex colisiones de notas @cindex desplazamiento, instrucciones de @funindex \shiftOff -@funindex shiftOff @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn -Dentro de una vozm todas las notas que se producen en el mismo +Dentro de una voz, todas las notas que se producen en el mismo moemtno se agrupan en una columna de notas, y se crea un objeto @code{NoteColumn} para controlar el posicionamiento horizonal de dicho grupo de notas (véase @qq{Columnas de nota} en @ref{Voces @@ -3000,16 +3145,16 @@ fusión entre cabezas de nota. @item Finalmente, cuando todo lo demás falla, los objetos se pueden reposicionar manualmente con relación a la tercera línea del -pentagrama verticalmente, o desplazándolas una cierta distancia a una -nueva posición. Las desventajas son que los valores correctos para el -reposicionamiento se deben adivinar, a menudo por ensayo y error, para -cada objeto individual y, puesto que el movimiento se hace después de -que LilyPond ha colocado todos los demás objetos es usuario es -responsable de evitar cualquier colisión que pudiera producirse. Pero -la dificultar principal con este enfoque es que los valores de -reposicionado podrían tener que ser vueltos a calcular si la música se -modifica más tarde. Las propiedades que se pueden usar para este tipo -de posicionamiento manual son: +pentagrama verticalmente, o desplazándolas una cierta distancia a +una nueva posición. Las desventajas son que los valores correctos +para el reposicionamiento se deben adivinar, a menudo por ensayo y +error, para cada objeto individual y, puesto que el movimiento se +hace después de que LilyPond ha colocado todos los demás objetos +es usuario es responsable de evitar cualquier colisión que pudiera +producirse. Pero la dificultar principal con este enfoque es que +los valores de reposicionado podrían tener que ser vueltos a +calcular si la música se modifica más tarde. Las propiedades que +se pueden usar para este tipo de posicionamiento manual son: @table @code @item extra-offset (desplazamiento adicional) @@ -3017,43 +3162,45 @@ de posicionamiento manual son: @cindex extra-offset, propiedad Esta propiedad se aplica a cualquier objeto de presentación que -contemple el @code{grob-interface}. Toma una pareja de números que -especifican el desplazamiento adicional en las direcciones horizontal -y vertical. Los números negativos mueven el objeto a la izquierda o -hacia abajo. Las unidades son espacios de pentagrama. El -desplazamiento adicional se hace después de que la composición -tipográfica de los objetos ha terminado, así que un objeto puede ser -reposicionado a cualquier lugar sin afectar a ninguna otra cosa. +contemple el @code{grob-interface}. Toma una pareja de números +que especifican el desplazamiento adicional en las direcciones +horizontal y vertical. Los números negativos mueven el objeto a +la izquierda o hacia abajo. Las unidades son espacios de +pentagrama. El desplazamiento adicional se hace después de que la +composición tipográfica de los objetos ha terminado, así que un +objeto puede ser reposicionado a cualquier lugar sin afectar a +ninguna otra cosa. @item positions (posiciones) @cindex positions, propiedad -Ésta es de la mayor utilidad para ajustar manualmente la inclinación y -la altura de las barras de corchea, ligaduras de expresión y corchetes -de grupos de valoración especial. Toma una pareja de números que dan -la posición de los extremos izquierdo y derecho de la barra, ligadura, -etc. con relación a la tercera línea del pentagrama. Las unidades son -espacios de pentagrama. Observe, sin embargo, que las ligaduras de -expresión y de fraseo no se pueden reposicionar en cantidades -arbitrariamente grandes. LilyPond en primer lugar genera una lista de -posiciones posibles para la ligadura y de forma predeterminada -encuentra la ligadura que tiene @qq{mejor aspecto}. Si la propiedad -@code{positions} se ha sobreescrito, la ligadura que está más cerca de -las posiciones que se han solicitado, se selecciona de la lista. +Ésta es de la mayor utilidad para ajustar manualmente la +inclinación y la altura de las barras de corchea, ligaduras de +expresión y corchetes de grupos de valoración especial. Toma una +pareja de números que dan la posición de los extremos izquierdo y +derecho de la barra, ligadura, etc. con relación a la tercera +línea del pentagrama. Las unidades son espacios de pentagrama. +Observe, sin embargo, que las ligaduras de expresión y de fraseo +no se pueden reposicionar en cantidades arbitrariamente grandes. +LilyPond en primer lugar genera una lista de posiciones posibles +para la ligadura y de forma predeterminada encuentra la ligadura +que tiene @qq{mejor aspecto}. Si la propiedad @code{positions} se +ha sobreescrito, la ligadura que está más cerca de las posiciones +que se han solicitado, se selecciona de la lista. @end table @end enumerate -Un objeto en particular podría no tener todas estas propiedades. Es -necesario ir al manual RFI para buscar qué propiedades se encuentran -disponibles para el objeto en cuestión. +Un objeto en particular podría no tener todas estas propiedades. +Es necesario ir al manual RFI para buscar qué propiedades se +encuentran disponibles para el objeto en cuestión. Aquí presentamos una lista de los objetos que es más probable que -estén implicados en colisiones, con el nombre del objeto que habría -que buscar en el RFI para descubrir qué propiedades se deben usar para -moverlos. +estén implicados en colisiones, con el nombre del objeto que +habría que buscar en el RFI para descubrir qué propiedades se +deben usar para moverlos. @multitable @columnfractions .5 .5 @headitem Tipo de objeto @tab Nombre del objeto @@ -3074,9 +3221,9 @@ moverlos. @subsection Arreglar notación con superposiciones @translationof Fixing overlapping notation -Veamos ahora cómo pueden ser de ayuda las propiedades que hemos visto -en la sección anterior, para resolver problemas de notación que se -superpone. +Veamos ahora cómo pueden ser de ayuda las propiedades que hemos +visto en la sección anterior, para resolver problemas de notación +que se superpone. @menu * La propiedad padding (relleno):: @@ -3098,14 +3245,14 @@ superpone. @cindex superpuesta, notación La propiedad @code{padding} se puede ajustar para aumentar (o -disminuir) la distancia entre símbolos impresos encima o debajo de las -notas. +disminuir) la distancia entre símbolos impresos encima o debajo de +las notas. @cindex Script, ejemplo de sobreescritura @cindex padding, propiedad, ejemplo -@lilypond[quote,fragment,relative=1,verbatim] -c2\fermata +@lilypond[quote,fragment,verbatim] +c'2\fermata \override Script.padding = #3 b2\fermata @end lilypond @@ -3113,28 +3260,29 @@ b2\fermata @cindex MetronomeMark, ejemplo de sobreescritura @cindex padding, propiedad, ejemplo -@lilypond[quote,fragment,relative=1,verbatim] +@lilypond[quote,fragment,verbatim] % This will not work, see below \override MetronomeMark.padding = #3 \tempo 4 = 120 -c1 | +c'1 | % This works \override Score.MetronomeMark.padding = #3 \tempo 4 = 80 -d1 | +d'1 | @end lilypond -Observe en el segundo ejemplo la gran importancia que tiene saber qué -contexto maneja un determinado objeto. Puesto que el objeto -@code{MetronomeMark} se maneja dentro del contexto @code{Score}, los -cambios de propiedades en el contexto @code{Voice} pasarán -inadvertidos. Para ver más detalles, consulte @ruser{Modificar las propiedades}. +Observe en el segundo ejemplo la gran importancia que tiene saber +qué contexto maneja un determinado objeto. Puesto que el objeto +@code{MetronomeMark} se maneja dentro del contexto @code{Score}, +los cambios de propiedades en el contexto @code{Voice} pasarán +inadvertidos. +Para ver más detalles, consulte @ruser{Modificar las propiedades}. -Si la propiedad de relleno @code{padding} de un objeto se incrementa -cuando dicho objeto se encuentra en una pila de objetos que se están -colocando de acuerdo a su prioridad @code{outside-staff-priority}, -entonces ese objeto se moverá, y también todos los que están por fuera -de él. +Si la propiedad de relleno @code{padding} de un objeto se +incrementa cuando dicho objeto se encuentra en una pila de objetos +que se están colocando de acuerdo a su prioridad +@code{outside-staff-priority}, entonces ese objeto se moverá, y +también todos los que están por fuera de él. @node La propiedad right-padding (relleno por la derecha) @@ -3144,12 +3292,12 @@ de él. @cindex right-padding, propiedad La propiedad @code{right-padding} afecta al espaciado entre la -alteración y la nota a que se aplica. Normalmente no es necesaria, -pero el espaciado predeterminado puede estar mal para ciertos glifos -de alteraciones o combinaciones de glifos que se usan en música -microtonal. Éstos tienen que introducirse sobreescribiendo el sello -de la alteración con un elemento de marcado que contenga los símbolos -deseados, así: +alteración y la nota a que se aplica. Normalmente no es +necesaria, pero el espaciado predeterminado puede estar mal para +ciertos glifos de alteraciones o combinaciones de glifos que se +usan en música microtonal. Éstos tienen que introducirse +sobreescribiendo el sello de la alteración con un elemento de +marcado que contenga los símbolos deseados, así: @cindex Accidental, ejemplo de sobreescritura @cindex text, propiedad, ejemplo @@ -3160,8 +3308,8 @@ deseados, así: @lilypond[quote,ragged-right,verbatim] sesquisharp = \markup { \sesquisharp } -\relative c'' { - c4 +\relative { + c''4 % This prints a sesquisharp but the spacing is too small \once \override Accidental.stencil = #ly:text-interface::print \once \override Accidental.text = #sesquisharp @@ -3176,12 +3324,12 @@ sesquisharp = \markup { \sesquisharp } @noindent Esto utiliza necesariamente una sobreescritura para el sello de la -alteración que no se estudiará hasta más adelante. El tipo de sello -debe ser un procedimiento, aquí modificado para que imprima el -contenido de la propiedad @code{text} del objeto @code{Accidental}, -que a su vez está establecido como un signo de sesquisostenido. -Entonces el signo se puede separar de la cabeza de la nota -sobreescribiendo @code{right-padding}. +alteración que no se estudiará hasta más adelante. El tipo de +sello debe ser un procedimiento, aquí modificado para que imprima +el contenido de la propiedad @code{text} del objeto +@code{Accidental}, que a su vez está establecido como un signo de +sesquisostenido. Entonces el signo se puede separar de la cabeza +de la nota sobreescribiendo @code{right-padding}. @noindent @@ -3192,24 +3340,24 @@ sobreescribiendo @code{right-padding}. @cindex alineación de objetos sobre la línea base @cindex objetos, alineación sobre la línea base -@code{staff-padding} se puede usar para alinear objetos como matices -dinámicos a lo largo de una línea de base a una distancia fija del -pentagrama, siempre que no exista ningún otro elemento de notación -que fuerce una distancia mayor al pentagrama. No es una propiedad de -@code{DynamicText} sino de @code{DynamicLineSpanner}. Esto es así -porque la línea de base debe aplicarse por igual a @strong{todas} las -dinámicas, entre ellas las que se han creado como objetos de -extensión. Así que ésta es la forma de alinear las indicaciones de -matiz en el ejemplo de la sección anterior: +@code{staff-padding} se puede usar para alinear objetos como +matices dinámicos a lo largo de una línea de base a una distancia +fija del pentagrama, siempre que no exista ningún otro elemento de +notación que fuerce una distancia mayor al pentagrama. No es una +propiedad de @code{DynamicText} sino de @code{DynamicLineSpanner}. +Esto es así porque la línea de base debe aplicarse por igual a +@strong{todas} las dinámicas, entre ellas las que se han creado +como objetos de extensión. Así que ésta es la forma de alinear +las indicaciones de matiz en el ejemplo de la sección anterior: @cindex DynamicText, ejemplo de sobreescritura @cindex extra-spacing-width, propiedad, ejemplo @cindex DynamicLineSpanner, ejemplo de sobreescritura @cindex staff-padding, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,fragment,ragged-right,verbatim] \override DynamicLineSpanner.staff-padding = #3 -a4\f b\mf a\p b\mp +\relative { a'4\f b\mf a\p b\mp } @end lilypond @@ -3217,19 +3365,19 @@ a4\f b\mf a\p b\mp @unnumberedsubsubsec La propiedad @code{self-alignment-X} (auto-alineación en X) @translationof The self-alignment-X property -El ejemplo siguiente muestra cómo ajustar la posición -de un objeto de digitación de cuerda en relación a la plica de una nota -mediante el alineamiento del límite derecho con el punto de referencia -de la nota «padre»: +El ejemplo siguiente muestra cómo ajustar la posición de un objeto +de digitación de cuerda en relación a la plica de una nota +mediante el alineamiento del límite derecho con el punto de +referencia de la nota «padre»: @cindex StringNumber, ejemplo de sobreescritura @cindex self-alignment-X, propiedad, ejemplo -@lilypond[quote,fragment,ragged-right,verbatim,relative=3] +@lilypond[quote,fragment,ragged-right,verbatim] \voiceOne - + \once \override StringNumber.self-alignment-X = #RIGHT - + @end lilypond @node La propiedad staff-position (posición en el pentagrama) @@ -3238,39 +3386,41 @@ de la nota «padre»: @cindex objeto, colisión dentro del pentagrama -Los silencios multi-compás en una voz pueden chocar con las notas en -otra voz. Puesto que estos silencios se tipografían centrados entre -las barras de compás se necesitaría bastante esfuerzo para que -LilyPond averiguara qué otras notas podrían chocar con él, ya que -actualmente todo el manejo de colisiones entre notas y silencios se -hace solamente para notas y silencios que ocurren al mismo tiempo. He -aquí un ejemplo de colisión de este tipo: +Los silencios multi-compás en una voz pueden chocar con las notas +en otra voz. Puesto que estos silencios se tipografían centrados +entre las barras de compás se necesitaría bastante esfuerzo para +que LilyPond averiguara qué otras notas podrían chocar con él, ya +que actualmente todo el manejo de colisiones entre notas y +silencios se hace solamente para notas y silencios que ocurren al +mismo tiempo. He aquí un ejemplo de colisión de este tipo: -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] -<< { c4 c c c } \\ { R1 } >> +@lilypond[quote,verbatim,ragged-right] +<< \relative { c'4 c c c } \\ { R1 } >> @end lilypond -La mejor solución aquí es mover el silencio multi-compás hacia abajo, -pues el silencio está en la voz dos. El ajuste predeterminado para -@code{\voiceTwo} (es decir, en la segunda voz de una construcción -@code{<<@{@dots{}@} \\ @{@dots{}@}>>}) es que @code{staff-position} tenga el -valor -4 para MultiMeasureRest, así que tenemos que bajarlo, digamos, -cuatro semi-espacios de pentagrama, al valor @w{@code{-8}}. +La mejor solución aquí es mover el silencio multi-compás hacia +abajo, pues el silencio está en la voz dos. El ajuste +predeterminado para @code{\voiceTwo} (es decir, en la segunda voz +de una construcción @code{<<@{@dots{}@} \\ @{@dots{}@}>>}) es que +@code{staff-position} tenga el valor -4 para MultiMeasureRest, así +que tenemos que bajarlo, digamos, cuatro semi-espacios de +pentagrama, al valor @w{@code{-8}}. @cindex MultiMeasureRest, ejemplo de sobreescritura @cindex staff-position, propiedad, ejemplo -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] +@lilypond[quote,verbatim,ragged-right] << - { c4 c c c } + \relative { c'4 c c c } \\ \override MultiMeasureRest.staff-position = #-8 { R1 } >> @end lilypond -Esto es mejor que utilizar, por ejemplo, @code{extra-offset}, porque -la línea adicional por encima del silencio se inserta automáticamente. +Esto es mejor que utilizar, por ejemplo, @code{extra-offset}, +porque la línea adicional por encima del silencio se inserta +automáticamente. @node La propiedad extra-offset (desplazamiento adicional) @unnumberedsubsubsec La propiedad @code{extra-offset} (desplazamiento adicional) @@ -3284,17 +3434,17 @@ la línea adicional por encima del silencio se inserta automáticamente. La propiedad @code{extra-offset} da un completo control sobre el posicionamiento de un objeto tanto vertical como horizontalmente. -En el ejemplo siguiente, la segunda digitación se desplaza ligeramente -a la izquierda, y 1.8 espacios de pentagrama hacia abajo: +En el ejemplo siguiente, la segunda digitación se desplaza +ligeramente a la izquierda, y 1.8 espacios de pentagrama hacia +abajo: @cindex fingering (digitación), ejemplo de sobreescritura @cindex extra-offset, propiedad, ejemplo -@lilypond[quote,fragment,relative=1,verbatim] -\stemUp -f4-5 +@lilypond[quote,fragment,verbatim] +f'4-5 \once \override Fingering.extra-offset = #'(-0.3 . -1.8) -f4-5 +f'4-5 @end lilypond @@ -3310,106 +3460,125 @@ f4-5 @cindex barras de corchea, control manual La propiedad @code{positions} permite controlar manualmente la -posición vertical y de ahí también la inclinación de los tresillos, -ligaduras de expresión y de fraseo, y barras de corchea. +posición vertical y de ahí también la inclinación de los +tresillos, ligaduras de expresión y de fraseo, y barras de +corchea. -He aquí un ejemplo en el que las ligaduras de fraseo y de expresión -chocan entre sí: +He aquí un ejemplo en el que las ligaduras de fraseo y de +expresión chocan entre sí: -@lilypond[quote,verbatim,fragment,ragged-right,relative=2] -a8 \( ( a'16 ) a \) +@lilypond[quote,verbatim,ragged-right] +\relative { a'8 \( ( a'16 ) a \) } @end lilypond @cindex PhrasingSlur, ejemplo de sobreescritura @cindex positions, propiedad, ejemplo @noindent -Una posibilidad sería mover los dos extremos de la ligadura de fraseo -hacia arriba. Podemos tratar de establecer el extremo izquierdo a 2.5 -espacios de pentagrama por encima de la tercera línea y el extremo -derecho a 4.5 también hacia arriba, y LilyPond seleccionaría la -ligadura de fraseo de entre las candidatas que ha encontrado con sus -extremos más cercanos a éstos: - -@lilypond[quote,verbatim,fragment,ragged-right,relative=2] +Una posibilidad sería mover los dos extremos de la ligadura de +fraseo hacia arriba. Podemos tratar de establecer el extremo +izquierdo a 2.5 espacios de pentagrama por encima de la tercera +línea y el extremo derecho a 4.5 también hacia arriba, y LilyPond +seleccionaría la ligadura de fraseo de entre las candidatas que ha +encontrado con sus extremos más cercanos a éstos: + +@lilypond[quote,verbatim,fragment,ragged-right] \once \override PhrasingSlur.positions = #'(2.5 . 4.5) -a8 \( ( a'16 ) a \) +a'8 \( ( a''16 ) a'' \) @end lilypond Esto supone una mejora, pero ¿por qué no bajar un poco el extremo -derecho de la ligadura de expresión? Si lo probamos, veremos que no -se puede hacer así. Ello es a causa de que no existen ligaduras de -expresión candidatas que estén más bajas que la que ya se ha -seleccionado, y en este caso la propiedad @code{positions} no tiene -ningún efecto. Sin embargo, las ligaduras de unión, expresión y -fraseo @emph{se pueden} colocar y conformar de manera muy exacta -cuando se necesita. Para aprender la manera de hacerlo, consulte -@ruser{Modificación de ligaduras de unión y de expresión}. - -Presentamos otro ejemplo. Vemos que la barra -choca con las ligaduras: +derecho de la ligadura de expresión? Si lo probamos, veremos que +no se puede hacer así. Ello es a causa de que no existen +ligaduras de expresión candidatas que estén más bajas que la que +ya se ha seleccionado, y en este caso la propiedad +@code{positions} no tiene ningún efecto. Sin embargo, las +ligaduras de unión, expresión y fraseo @emph{se pueden} colocar y +conformar de manera muy exacta cuando se necesita. Para aprender +la manera de hacerlo, consulte @ruser{Modificación de ligaduras de +unión y de expresión}. + +Presentamos otro ejemplo. Vemos que la barra choca con las +ligaduras: -@lilypond[quote,verbatim,fragment,ragged-right] +@lilypond[quote,verbatim,ragged-right] { \time 4/2 << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } + \relative { + e''8 e e e + e e e e + f2 g + } >> << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } + \relative { + e''8 e e e + e e e e + f2 g + } >> } @end lilypond @noindent Esto se puede resolver manualmente elevando los dos extremos de la -barra desde su posición a 1.81 espacios de pentagrama bajo la línea -central hasta, digamos, 1 espacio: +barra desde su posición a 1.81 espacios de pentagrama bajo la +línea central hasta, digamos, 1 espacio: @cindex Beam, ejemplo de sobreescritura @cindex positions, propiedad, ejemplo -@lilypond[quote,verbatim,fragment,ragged-right] +@lilypond[quote,verbatim,ragged-right] { \time 4/2 << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { + \relative { \override Beam.positions = #'(-1 . -1) - e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' + e''8 e e e + e e e e + f2 g } >> << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } + \relative { + e''8 e e e + e e e e + f2 g + \revert Beam.positions + } >> } @end lilypond @noindent -Observe que la sobreescritura sigue aplicándose en la primera voz del -segundo compás de corcheas, pero no a ninguna de las barras de la -segunda voz. +Observe que la sobreescritura sigue aplicándose en la segunda voz +del segundo compás de corcheas, pero no a ninguna de las barras de +la primera voz, ni siquiera a las que están en el segundo compás, +que es posterior. Tan pronto como la sobreescritura no pueda +tener ningún efecto, debería ser revertida como se muestra. @node La propiedad force-hshift (forzar desplazamiento horizontal) @unnumberedsubsubsec La propiedad @code{force-hshift} (forzar desplazamiento horizontal) @translationof The force-hshift property -Ahora podremos ver cómo aplicar las correcciones finales al ejemplo de -Chopin que presentamos al final de @ref{Oigo voces}, que -dejamos con este aspecto: +Ahora podremos ver cómo aplicar las correcciones finales al +ejemplo de Chopin que presentamos al final de @ref{Oigo voces}, +que dejamos con este aspecto: @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { 2 des } \\ @@ -3423,11 +3592,7 @@ dejamos con este aspecto: @noindent Es necesario que la nota interior del primer acorde (el La bemol de la cuarta voz) no se aparte de la columna vertical de la nota -aguda. Podríamos esperar corregirlo mediante el uso de -@code{\shiftOff}, pero esto produce advertencias sobre columnas de -notas que colisionan. En lugar de ello, ajustamos a cero el valor -para esta nota de @code{force-hshift}, que es una propiedad de -@code{NoteColumn}. +aguda, por lo que usamos @code{\shiftOff}. En el segundo acorde preferimos que el Fa esté alineado con el La bemol y que la nota grave se coloque ligeramente a la derecha para @@ -3446,16 +3611,15 @@ Presentamos a continuación el resultado final: @cindex force-hshift, propiedad, ejemplo @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { 2 \once \override NoteColumn.force-hshift = 0.5 des } \\ \\ - { \once \override NoteColumn.force-hshift = 0 aes'2 - \once \override NoteColumn.force-hshift = 0 f4 fes } + { \once \shiftOff aes'2 \once \shiftOff f4 fes } >> | 1 | } @@ -3466,35 +3630,37 @@ Presentamos a continuación el resultado final: @subsection Ejemplos reales de música @translationof Real music example -Finalizaremos esta sección sobre los trucos mostrando los pasos que se -deben tomar para tratar con un ejemplo complicado que necesita varios -trucos para producir el resultado deseado. El ejemplo se ha escogido -deliberadamente para ilustrar el uso de la Referencia de la Notación -para resolver problemas de notación poco comunes. No es -representativo del proceso de grabado más usual, por lo que ¡le -recomendamos que no deje que estas dificultades le desanimen! -¡Afortunadamente, las dificultades como éstas no son muy comunes! +Finalizaremos esta sección sobre los trucos mostrando los pasos +que se deben tomar para tratar con un ejemplo complicado que +necesita varios trucos para producir el resultado deseado. El +ejemplo se ha escogido deliberadamente para ilustrar el uso de la +Referencia de la Notación para resolver problemas de notación poco +comunes. No es representativo del proceso de grabado más usual, +por lo que ¡le recomendamos que no deje que estas dificultades le +desanimen! ¡Afortunadamente, las dificultades como éstas no son +muy comunes! El ejemplo está extraído de la Primera Balada de Chopin, Op. 23, -compases 6 al 9, la transición entre el Lento inicial y el Moderato. -Presentamos en primer lugar el aspecto que queremos que tenga el -resultado, pero para evitar complicar demasiado el ejemplo hemos -quitado las indicaciones dinámicas, las digitaciones y el pedal. +compases 6 al 9, la transición entre el Lento inicial y el +Moderato. Presentamos en primer lugar el aspecto que queremos que +tenga el resultado, pero para evitar complicar demasiado el +ejemplo hemos quitado las indicaciones dinámicas, las digitaciones +y el pedal. @c The following should appear as music without code @c This example should not be indexed @c line-width ensures no break @lilypond[quote,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 << { c,8 d fis bes a } \new Voice { @@ -3527,8 +3693,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3549,28 +3715,29 @@ lhMusic = \relative c' { } @end lilypond -Observamos en primer lugar que la parte de la mano derecha del tercer -compás requiere cuatro voces. Son las cinco corcheas unidas por una -barra, la nota Do ligada, el Re blanca que se funde con el Re corchea, -y el Fa sostenido negra con puntillo, que también está fundida con la -corchea de su misma altura. Todo lo demás está en una sola voz, así -que lo más fácil es introducir estas tres voces adicionales, en el -momento en que se necesiten y de forma temporal. Si ha olvidado cómo -hacerlo, lea las secciones @ref{Oigo voces} y @ref{Voces explícitas}. -Aquí tomamos la decisión de utilizar voces instanciadas explícitamente -para el pasaje polifónico, dado que LilyPond es más probable que pueda -evitar las colisiones si todas las voces se instancian explícitamente -de esta forma. +Observamos en primer lugar que la parte de la mano derecha del +tercer compás requiere cuatro voces. Son las cinco corcheas +unidas por una barra, la nota Do ligada, el Re blanca que se funde +con el Re corchea, y el Fa sostenido negra con puntillo, que +también está fundida con la corchea de su misma altura. Todo lo +demás está en una sola voz, así que lo más fácil es introducir +estas tres voces adicionales, en el momento en que se necesiten y +de forma temporal. Si ha olvidado cómo hacerlo, lea las secciones +@ref{Oigo voces} y @ref{Voces explícitas}. Aquí tomamos la +decisión de utilizar voces instanciadas explícitamente para el +pasaje polifónico, dado que LilyPond es más probable que pueda +evitar las colisiones si todas las voces se instancian +explícitamente de esta forma. Vamos a comenzar introduciendo las notas como dos variables y -disponiendo la estructura de pentagramas en un bloque Score, y veremos -qué produce LilyPond de forma predeterminada: +disponiendo la estructura de pentagramas en un bloque Score, y +veremos qué produce LilyPond de forma predeterminada: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4. g8 | + r2 c''4. g8 | bes1~ | \time 6/4 bes2. r8 @@ -3579,7 +3746,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3594,8 +3761,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2 | +lhMusic = \relative { + r2 2 | 1 | r2. d,,4 r4 r | r4 @@ -3617,18 +3784,18 @@ lhMusic = \relative c' { @end lilypond Todas las notas son correctas, pero el aspecto está lejos de ser -satisfactorio. La ligadura de unión choca con el cambio de compás, -ciertas notas no se funden correctamente, y faltan algunos elementos de -notación. En primer lugar trataremos con lo más fácil. Podemos -añadir fácilmente la ligadura de expresión de la mano izquierda y la -ligadura de fraseo de la mano derecha, pues todo ello se estudió en el -Tutorial. Al hacerlo así obtenemos: +satisfactorio. La ligadura de unión choca con el cambio de +compás, ciertas notas no se funden correctamente, y faltan algunos +elementos de notación. En primer lugar trataremos con lo más +fácil. Podemos añadir fácilmente la ligadura de expresión de la +mano izquierda y la ligadura de fraseo de la mano derecha, pues +todo ello se estudió en el Tutorial. Al hacerlo así obtenemos: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | bes1~ | \time 6/4 bes2. r8 @@ -3637,7 +3804,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3652,8 +3819,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1) | r2. d,,4 r4 r | r4 @@ -3675,24 +3842,24 @@ lhMusic = \relative c' { @end lilypond El primer compás ahora es correcto. El segundo compás contiene un -arpegio y acaba en una doble barra. ¿Cómo los hacemos, pues no han -sido mencionados en este Manual de Aprendizaje? Aquí es donde tenemos -que volver e la Referencia de la Notación. Buscando la palabra -@q{arpegio} y @q{línea divisoria} en el índice nos muestra rápidamente -que un arpegio se hace añadiendo @code{\arpeggio} a un acorde, y la -doble barra se produce por medio de la instrucción @code{\bar "||"}. -Esto podemos hacerlo fácilmente. A continuación tenemos que corregir -la colisión entre la ligadura de unión y la indicación de compás. -Esto se hace mejor moviendo la ligadura hacia arriba. Estudiamos cómo -mover objetos anteriormente en @ref{Mover objetos}, donde dice que -los objetos que están situados de forma relativa al pentagrama se -pueden mover verticalmente -sobreescribiendo su propiedad @code{staff-position}, que -se especifica en unidades de medio espacio de pentagrama respecto de -la línea central del pentagrama. Así pues, la sobreescritura -siguiente colocada justo antes de la primera nota ligada subirá la -ligadura 3.5 medios espacios de pentagrama por encima de la línea -central: +arpegio y acaba en una doble barra. ¿Cómo los hacemos, pues no +han sido mencionados en este Manual de Aprendizaje? Aquí es donde +tenemos que volver e la Referencia de la Notación. Buscando la +palabra @q{arpegio} y @q{línea divisoria} en el índice nos muestra +rápidamente que un arpegio se hace añadiendo @code{\arpeggio} a un +acorde, y la doble barra se produce por medio de la instrucción +@code{\bar "||"}. Esto podemos hacerlo fácilmente. A +continuación tenemos que corregir la colisión entre la ligadura de +unión y la indicación de compás. Esto se hace mejor moviendo la +ligadura hacia arriba. Estudiamos cómo mover objetos +anteriormente en @ref{Mover objetos}, donde dice que los objetos +que están situados de forma relativa al pentagrama se pueden mover +verticalmente sobreescribiendo su propiedad @code{staff-position}, +que se especifica en unidades de medio espacio de pentagrama +respecto de la línea central del pentagrama. Así pues, la +sobreescritura siguiente colocada justo antes de la primera nota +ligada subirá la ligadura 3.5 medios espacios de pentagrama por +encima de la línea central: @code{\once \override Tie.staff-position = #3.5} @@ -3700,9 +3867,9 @@ Con esto se completa el compás dos, dando como resultado: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3713,7 +3880,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3728,8 +3895,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3750,18 +3917,19 @@ lhMusic = \relative c' { } @end lilypond -Vayamos ahora al tercer compás y comienzo de la sección Moderato. El -tutorial nos enseñó cómo escribir texto en negrita mediante la -instrucción @code{\markup}, por lo que añadir @qq{Moderato} en negrita -es fácil. Pero ahora ¿cómo fundimos notas que están en distintas -voces? Aquí es donde debemos volver a buscar ayuda en el manual de -Referencia de la notación. Al buscar la palabra @qq{merge} (mezcla) en -el índice de la Referencia de la notación llegamos rápidamente a las -instrucciones para mezclar notas con distinta cabeza y con o sin -puntillo, en @ruser{Resolución de las colisiones}. En nuestro ejemplo tenemos -que fusionar ambos tipos de nota en el transcurso de la sección -polifónica del compás 3; por tanto, en virtud de la información que -aparece en la Referencia de la Notación, escribimos +Vayamos ahora al tercer compás y comienzo de la sección Moderato. +El tutorial nos enseñó cómo escribir una indicación de tempo +mediante la instrucción @code{\tempo}, por lo que añadir +@qq{Moderato} es fácil. Pero ahora ¿cómo fundimos notas que están +en distintas voces? Aquí es donde debemos volver a buscar ayuda +en el manual de Referencia de la notación. Al buscar la palabra +@qq{merge} (mezcla) en el índice de la Referencia de la notación +llegamos rápidamente a las instrucciones para mezclar notas con +distinta cabeza y con o sin puntillo, en @ruser{Resolución de las +colisiones}. En nuestro ejemplo tenemos que fusionar ambos tipos +de nota en el transcurso de la sección polifónica del compás 3; +por tanto, en virtud de la información que aparece en la +Referencia de la Notación, escribimos @example \mergeDifferentlyHeadedOn @@ -3781,14 +3949,14 @@ al final, dando como resultado: @c line-width ensures no break @lilypond[quote,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices @@ -3796,7 +3964,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3813,8 +3981,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3835,35 +4003,35 @@ lhMusic = \relative c' { } @end lilypond -Estas sobreescrituras han fundido los dos Fa sostenido, pero no los -dos Re. ¿Por qué no? La respuesta está en la misma sección de la -Referencia de la Notación: las notas que se fusionan deben tener las -plicas en direcciones opuestas y dos notas no se pueden fusionar bien -si hay una tercera nota en la misma columna. Aquí los dos Re tienen -las plicas hacia arriba y hay una tercera nota: el Do. Sabemos cómo -cambiar la dirección de la plica usando @code{\stemDown}, y la -Referencia de la Notación también explica cómo mover el Do: aplicar un -desplazamiento usando una de las instrucciones @code{\shift}. Pero -¿cuál? El Do está en la voz dos que tiene desactivado el -desplazamiento, y los dos Re están en las voces uno y tres, que tienen -el desplazamiento desactivado y activado, respectivamente. Por ello -tenemos que desplazar el Do un nivel más todavía, usando -@code{\shiftOnn} para evitar que interfiera con los dos Re. Al -aplicar estos cambios obtenemos: +Estas sobreescrituras han fundido los dos Fa sostenido, pero no +los dos Re. ¿Por qué no? La respuesta está en la misma sección +de la Referencia de la Notación: las notas que se fusionan deben +tener las plicas en direcciones opuestas y dos notas no se pueden +fusionar bien si hay una tercera nota en la misma columna. Aquí +los dos Re tienen las plicas hacia arriba y hay una tercera nota: +el Do. Sabemos cómo cambiar la dirección de la plica usando +@code{\stemDown}, y la Referencia de la Notación también explica +cómo mover el Do: aplicar un desplazamiento usando una de las +instrucciones @code{\shift}. Pero ¿cuál? El Do está en la voz +dos que tiene desactivado el desplazamiento, y los dos Re están en +las voces uno y tres, que tienen el desplazamiento desactivado y +activado, respectivamente. Por ello tenemos que desplazar el Do +un nivel más todavía, usando @code{\shiftOnn} para evitar que +interfiera con los dos Re. Al aplicar estos cambios obtenemos: @cindex Tie, ejemplo de sobreescritura @cindex staff-position, propiedad, ejemplo @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices @@ -3891,8 +4059,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3913,12 +4081,12 @@ lhMusic = \relative c' { } @end lilypond -Ya casi está. Solamente quedan dos problemas: la plica hacia abajo -sobre el Re fusionado no tendría que estar ahí, y el Do estaría mejor -colocado a la derecha de los Re. Sabemos cómo hacer las dos cosas a -partir de trucos anteriores: hacemos la plica transparente, y movemos -el Do con la propiedad @code{force-hshift}. Aquí tenemos el resultado -final: +Ya casi está. Solamente quedan dos problemas: la plica hacia +abajo sobre el Re fusionado no tendría que estar ahí, y el Do +estaría mejor colocado a la derecha de los Re. Sabemos cómo hacer +las dos cosas a partir de trucos anteriores: hacemos la plica +transparente, y movemos el Do con la propiedad +@code{force-hshift}. Aquí tenemos el resultado final: @cindex NoteColumn, ejemplo de sobreescritura @cindex force-hshift, propiedad, ejemplo @@ -3927,14 +4095,14 @@ final: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices @@ -3970,8 +4138,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -4014,14 +4182,8 @@ lhMusic = \relative c' { * Simulación de un calderón en el MIDI:: @end menu -@cindex transparent, uso de la propiedad -@cindex objetos, hace invisibles @cindex eliminar objetos @cindex objetos, eliminar -@cindex objetos, ocultar -@cindex ocultar objetos -@cindex invisibles, objetos -@cindex objetos invisibles @node Unir notas entre voces distintas @unnumberedsubsubsec Unir notas entre voces distintas @@ -4030,78 +4192,42 @@ lhMusic = \relative c' { @cindex ligar notas entre voces distintas El ejemplo siguiente muestra cómo conectar notas que están en -distintas voces utilizando ligaduras de unión. Normalmente sólo se -pueden conectar mediante ligaduras de unión dos notas que estén en la -misma voz. Usando dos voces, con las notas ligadas en una de ellas: +distintas voces utilizando ligaduras de unión. Normalmente sólo +se pueden conectar mediante ligaduras de unión notas que estén en +la misma voz. Usando dos voces, con las notas ligadas en una de +ellas: -@lilypond[quote,fragment,relative=2] -<< { b8~ b\noBeam } \\ { b8[ g] } >> +@lilypond[quote] +<< { b'8~ 8\noBeam } \\ { b'8[ g'] } >> @end lilypond @noindent -y borrando la primera plica hacia arriba en esa voz, da la impresión -de que la ligadura se cruza entre las voces: - -@cindex Stem, ejemplo de sobreescritura -@cindex transparent, propiedad, ejemplo - -@lilypond[quote,fragment,relative=2,verbatim] -<< - { - \tweak Stem.transparent ##t - b8~ b\noBeam - } -\\ - { b8[ g] } ->> -@end lilypond +y borrando la primera plica (con su corchete) hacia arriba en esa +voz, da la impresión de que la ligadura se cruza entre las voces: -Para estar seguros de que la plica que acabamos de borrar no aprieta -demasiado a la ligadura, podemos alargar la plica estableciendo su -valor de longitud @code{length} a @code{8}, +@funindex \omit +@cindex Stem, example of removing +@cindex Flag, example of removing +@cindex @code{\omit}, example +@cindex example of @code{\omit} -@lilypond[quote,fragment,relative=2,verbatim] +@lilypond[quote,verbatim] << { - \tweak Stem.transparent ##t - \tweak Stem.length #8 - b8~ b\noBeam + \once \omit Stem + \once \omit Flag + b'8~ 8\noBeam } \\ - { b8[ g] } + { b'8[ g'] } >> @end lilypond -@funindex \single -@cindex tweak, generado a partir de una sobreescritura -Ahora bien, para la @emph{sobreescritura} de la transparencia de -un objeto gráfico, podríamos haber usado la abreviatura -@code{\hide} como se explicó anteriormente. El trucaje mediante -@qq{tweak} es una operación diferente que afecta solamente a las -propiedades generadas a partir de una sola expresión musical. -Resulta que podemos convertir los overrides o sobreescrituras en -tweaks o trucajes utilizando @code{\single}, haciendo posible -volver a escribir el ejemplo anterior como - -@lilypond[quote,fragment,relative=2,verbatim] -<< - { - \single \hide Stem - \single \hide Flag - \tweak Stem.length #8 - b8~ b\noBeam - } -\\ - { b8[ g] } ->> -@end lilypond +@seealso +Manual de aprendizaje +@ref{El prefijo once,,El prefijo @code{@bs{}once}}, +@ref{La propiedad stencil (sello)}. -En este caso particular, la diferencia con @code{\once \hide} no -es muy apreciable. Es importante cuando existen varios objetos en -el mismo punto del tiempo musical (como las notas de un acorde). -En tal caso, @code{\once} afecta a todos los objetos, mientras que -@code{\single} solo afecta a uno, aquél que se genera por parte de -la expresión musical que le sigue inmediatamente. @node Simulación de un calderón en el MIDI @unnumberedsubsubsec Simulación de un calderón en el MIDI @@ -4111,31 +4237,32 @@ la expresión musical que le sigue inmediatamente. @cindex fermata, realización en MIDI Para los objetos fuera-del-pentagrama, normalmente es mejor -sobreescribir la propiedad @code{stencil} («sello») del objeto que su -propiedad @code{transparent} cuando desee quitarlos de la salida -impresa. Mediante el establecimiento de la propiedad @code{stencil} -de un objeto al valor @code{#f} podemos quitar el objeto por completo -de la salida impresa. Esto significa que no tiene efecto sobre la -colocación de otros objetos que pudieran colocarse en relación a él. - -Por ejemplo, si quisiéramos cambiar la indicación metronómica con el -propósito de simular un calderón en la salida MIDI, seguramente no -querríamos que la indicación metronómica apareciese en la salida -impresa, y no querríamos influir sobre la separación entre los dos -sistemas ni sobre la colocación de las anotaciones adyacentes sobre el -pentagrama. Por lo tanto, establecer su propiedad @code{stencil} al -valor @code{#f} sería la mejor manera. Mostramos aquí el efecto de -los dos métodos: +sobreescribir la propiedad @code{stencil} («sello») del objeto que +su propiedad @code{transparent} cuando desee quitarlos de la +salida impresa. Mediante el establecimiento de la propiedad +@code{stencil} de un objeto al valor @code{#f} podemos quitar el +objeto por completo de la salida impresa. Esto significa que no +tiene efecto sobre la colocación de otros objetos que pudieran +colocarse en relación a él. + +Por ejemplo, si quisiéramos cambiar la indicación metronómica con +el propósito de simular un calderón en la salida MIDI, seguramente +no querríamos que la indicación metronómica apareciese en la +salida impresa, y no querríamos influir sobre la separación entre +los dos sistemas ni sobre la colocación de las anotaciones +adyacentes sobre el pentagrama. Por lo tanto, establecer su +propiedad @code{stencil} al valor @code{#f} sería la mejor manera. +Mostramos aquí el efecto de los dos métodos: @cindex MetronomeMark, ejemplo de sobreescritura @cindex transparent, propiedad, ejemplo @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a + a'4 a a \once \hide Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 @@ -4154,11 +4281,11 @@ los dos métodos: @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a - \once \override Score.MetronomeMark.stencil = ##f + a'4 a a + \once \omit Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 a4\fermata | @@ -4172,11 +4299,12 @@ los dos métodos: @end lilypond @noindent -Ambos métodos quitan de la salida impresa la indicación metronómica -que alarga el calderón, y los dos afectan al tempo del MIDI tal y como -queríamos, pero la indicación metronómica transparente de la primera -línea fuerza una colocación muy alta de la indicación de tempo que -sigue, mientras que la segunda (con el sello suprimido) no lo hace. +Ambos métodos quitan de la salida impresa la indicación +metronómica que alarga el calderón, y los dos afectan al tempo del +MIDI tal y como queríamos, pero la indicación metronómica +transparente de la primera línea fuerza una colocación muy alta de +la indicación de tempo que sigue, mientras que la segunda (con el +sello suprimido) no lo hace. @seealso Glosario musical: @@ -4192,19 +4320,20 @@ Glosario musical: @cindex ajustes de disposición, usar variables para hacer Las instrucciones de sobreescritura son con frecuencia largas y -tediosas de escribir, y se tienen que escribir de forma absolutamente -correcta. Si las mismas sobreescrituras se van a utilizar muchas -veces, podría merecer la pena definir variables para guardarlas. - -Supongamos que queremos realzar ciertas palabras de la letra de una -canción imprimiéndolas en cursiva y negrita. Las instrucciones -@code{\italic} y @code{\bold} sólo funcionan dentro de la letra de las -canciones si están incluidas, junto con la palabra o palabras que se -pretenden modificar, dentro de un @code{\markup}, lo que las hace -tediosas de escribir. La necesidad de incluir las propias palabras -impide que se puedan usar en variables simples. ¿Podríamos, como -alternativa, utilizar las instrucciones @code{\override} y -@code{\revert}? +tediosas de escribir, y se tienen que escribir de forma +absolutamente correcta. Si las mismas sobreescrituras se van a +utilizar muchas veces, podría merecer la pena definir variables +para guardarlas. + +Supongamos que queremos realzar ciertas palabras de la letra de +una canción imprimiéndolas en cursiva y negrita. Las +instrucciones @code{\italic} y @code{\bold} sólo funcionan dentro +de la letra de las canciones si están incluidas, junto con la +palabra o palabras que se pretenden modificar, dentro de un +@code{\markup}, lo que las hace tediosas de escribir. La necesidad +de incluir las propias palabras impide que se puedan usar en +variables simples. ¿Podríamos, como alternativa, utilizar las +instrucciones @code{\override} y @code{\revert}? @example @code{\override Lyrics.LyricText.font-shape = #'italic} @@ -4214,15 +4343,16 @@ alternativa, utilizar las instrucciones @code{\override} y @code{\revert Lyrics.LyricText.font-series} @end example -Estas instrucciones también serían extremadamente tediosas de escribir -si hubiera muchas palabras que quisiéramos subrayar. Pero sí -@emph{podemos} definirlas como dos variables y usarlas para delimitar -las palabras que destacar. Otra ventaja de la utilización de -variables para estas sobreescrituras es que ya no son necesarios los -espacios que rodean al punto, puesto que no se interpretan -directamente en el modo @code{\lyricmode}. He aquí un ejemplo de -esto, aunque en la práctica quizá elegiríamos unos nombres de variable -más cortos para que fueran más rápidos de teclear: +Estas instrucciones también serían extremadamente tediosas de +escribir si hubiera muchas palabras que quisiéramos subrayar. +Pero sí @emph{podemos} definirlas como dos variables y usarlas +para delimitar las palabras que destacar. Otra ventaja de la +utilización de variables para estas sobreescrituras es que ya no +son necesarios los espacios que rodean al punto, puesto que no se +interpretan directamente en el modo @code{\lyricmode}. He aquí un +ejemplo de esto, aunque en la práctica quizá elegiríamos unos +nombres de variable más cortos para que fueran más rápidos de +teclear: @cindex LyricText, ejemplo de sobreescritura @cindex font-shape, propiedad, ejemplo @@ -4241,10 +4371,10 @@ normal = { global = { \key c \major \time 4/4 \partial 4 } -SopranoMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopranoMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyrics { E -- | ter -- nal \emphasize Fa -- ther, | \normal strong to save, @@ -4288,15 +4418,15 @@ VerseFour = \lyricmode { @translationof Style sheets La salida que produce LilyPond se puede modificar profundamente; -consulte @ref{Trucar la salida} para leer detalles sobre este asunto. -Pero ¿qué ocurre si tiene muchos archivos a los que les quiere aplicar -sus propios trucos? O ¿qué ocurre si, sencillamente, quiere separar -los trucos de la propia música? Todo esto es bastante fácil de -conseguir. +consulte @ref{Trucar la salida} para leer detalles sobre este +asunto. Pero ¿qué ocurre si tiene muchos archivos a los que les +quiere aplicar sus propios trucos? O ¿qué ocurre si, +sencillamente, quiere separar los trucos de la propia música? +Todo esto es bastante fácil de conseguir. -Veamos un ejemplo. No se preocupe si no entiende -las partes que tienen todos los @code{#()}. Esto se explicará en -@ref{Trucos avanzados con Scheme}. +Veamos un ejemplo. No se preocupe si no entiende las partes que +tienen todos los @code{#()}. Esto se explicará en @ref{Trucos +avanzados con Scheme}. @lilypond[quote,verbatim,ragged-right] mpdolce = @@ -4306,13 +4436,13 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4321,13 +4451,13 @@ inst = @end lilypond Hagamos algo respecto a las definiciones @code{mpdolce} e -@code{inst}. Éstas producen la salida que deseamos, pero quizá las -querríamos utilizar en otra pieza. Podríamos simplemente copiarlas y -pegarlas al principio de cada archivo, pero sería bastante molesto. -También hace que se queden las definiciones a la vista dentro de -nuestros archivos de música, y yo personalmente encuentro todos los -@code{#()} bastante poco estéticos. Los vamos a esconder dentro de -otro archivo: +@code{inst}. Éstas producen la salida que deseamos, pero quizá +las querríamos utilizar en otra pieza. Podríamos simplemente +copiarlas y pegarlas al principio de cada archivo, pero sería +bastante molesto. También hace que se queden las definiciones a +la vista dentro de nuestros archivos de música, y yo personalmente +encuentro todos los @code{#()} bastante poco estéticos. Los vamos +a esconder dentro de otro archivo: @example %%% guardar esto en un archivo con el nombre "definiciones.ily" @@ -4338,17 +4468,17 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @end example Haremos referencia a este archivo utilizando la instrucción @code{\include} al principio del archivo de música (la extensión -@code{.ily} se utiliza para distinguir este archivo de inclusión --que -se supone que no debe ser procesado de forma independiente-- del -archivo principal). Ahora modificaremos la música (guardemos este -archivo como @file{musica.ly}). +@code{.ily} se utiliza para distinguir este archivo de inclusión +--que se supone que no debe ser procesado de forma independiente-- +del archivo principal). Ahora modificaremos la música (guardemos +este archivo como @file{musica.ly}). @c We have to do this awkward example/lilypond-non-verbatim @c because we can't do the \include stuff in the manual. @@ -4356,9 +4486,9 @@ archivo como @file{musica.ly}). @example \include "definiciones.ily" -\relative c'' @{ +\relative @{ \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinete" cis4.\< d8 e4 fis | @@ -4374,13 +4504,13 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4391,9 +4521,9 @@ inst = Eso tiene mejor aspecto, pero haremos algunos cambios más. El glissando es difícil de ver, así que lo haremos más grueso y lo acercaremos a las cabezas de las notas. Pondremos la indicación -metronómica encima de la clave, en lugar de ir encima de la primera -nota. Y por último, mi profesor de composición odia las indicaciones -de compás @q{C}, así que la convertiremos en @q{4/4}. +metronómica encima de la clave, en lugar de ir encima de la +primera nota. Y por último, mi profesor de composición odia las +indicaciones de compás @q{C}, así que la convertiremos en @q{4/4}. Sin embargo, no debemos cambiar el archivo @file{musica.ly}. Sustituyamos nuestro archivo @file{definiciones.ily} con éste: @@ -4407,7 +4537,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -4437,7 +4567,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4458,9 +4588,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4468,13 +4598,13 @@ inst = } @end lilypond -¡Eso tiene un aspecto mucho mejor! Ahora suponga que quiere publicar -esta pieza. A mi profesor de composición no le gustan las -indicaciones de compás @q{C}, pero yo les tengo cierto cariño. +¡Eso tiene un aspecto mucho mejor! Ahora suponga que quiere +publicar esta pieza. A mi profesor de composición no le gustan +las indicaciones de compás @q{C}, pero yo les tengo cierto cariño. Copiaremos el archivo actual @file{definiciones.ily} a -@file{publicar-web.ily} y modificaremos éste. Como el propósito de -esta música es producir un PDF que va a mostrarse en la pantalla, -también vamos a aumentar el tamaño general de la salida. +@file{publicar-web.ily} y modificaremos éste. Como el propósito +de esta música es producir un PDF que va a mostrarse en la +pantalla, también vamos a aumentar el tamaño general de la salida. @example %%% publicar-web.ily @@ -4485,7 +4615,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -4516,7 +4646,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4533,9 +4663,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4545,8 +4675,8 @@ inst = Ahora, en la música, simplemente sustituyo @code{\include "definiciones.ily"} por @code{\include "publicar-web.ily"}. Por -supuesto, podríamos hacer esto aún más práctico. Podríamos hacer un -archivo @file{definiciones.ily} que contuviera solamente las +supuesto, podríamos hacer esto aún más práctico. Podríamos hacer +un archivo @file{definiciones.ily} que contuviera solamente las definiciones de @code{mpdolce} y de @code{inst}, un archivo @file{publicar-web.ily} que contuviera solamente la sección @code{\layout} que se mostró en el ejemplo, y un archivo @@ -4562,10 +4692,11 @@ producir la salida que le gusta a mi profesor. El comienzo de %\include "universidad.ily" @end example -Este enfoque puede ser útil incluso si va a producir sólo un conjunto -de particellas. Yo utilizo media docena de archivos de @q{hojas de -estilo} para mis proyectos. Comienzo todos los archivos de música con -@code{\include "../global.ily"}, que contiene +Este enfoque puede ser útil incluso si va a producir sólo un +conjunto de particellas. Yo utilizo media docena de archivos de +@q{hojas de estilo} para mis proyectos. Comienzo todos los +archivos de música con @code{\include "../global.ily"}, que +contiene @example %%% global.ily @@ -4584,16 +4715,17 @@ estilo} para mis proyectos. Comienzo todos los archivos de música con @subsection Otras fuentes de información @translationof Other sources of information -La documentación del manual de Referencia de Funcionamiento Interno -contiene montañas de información sobre LilyPond, pero se puede obtener -más información aún leyendo los archivos internos de LilyPond. Para -echarles un vistazo, en primer lugar debe buscar la carpeta -correspondiente a su sistema. La ubicación de esta carpeta depende -(a) de si consiguió el programa LilyPond descargando un binario -precompilado desde el sitio web lilypond.org o si lo instaló mediante -un gestor de paquetes (es decir, distribuido con GNU/Linux, o instalado -bajo fink o cygwin) o fue compilado a partir de la fuente, y (b) de -qué sistema operativo está utilizando: +La documentación del manual de Referencia de Funcionamiento +Interno contiene montañas de información sobre LilyPond, pero se +puede obtener más información aún leyendo los archivos internos de +LilyPond. Para echarles un vistazo, en primer lugar debe buscar +la carpeta correspondiente a su sistema. La ubicación de esta +carpeta depende (a) de si consiguió el programa LilyPond +descargando un binario precompilado desde el sitio web +lilypond.org o si lo instaló mediante un gestor de paquetes (es +decir, distribuido con GNU/Linux, o instalado bajo fink o cygwin) +o fue compilado a partir de la fuente, y (b) de qué sistema +operativo está utilizando: @subsubsubheading Descargado de lilypond.org @@ -4613,9 +4745,9 @@ Diríjase a @end example bien haciendo @code{cd} hacia este directorio desde el Terminal, o -bien manteniendo pulsada la tecla de Control y haciendo click sobre la -aplicación de LilyPond, y allí eligiendo @q{Mostrar el contenido del -paquete}. +bien manteniendo pulsada la tecla de Control y haciendo click +sobre la aplicación de LilyPond, y allí eligiendo @q{Mostrar el +contenido del paquete}. @item Windows @@ -4628,11 +4760,10 @@ Mediante el Explorador de Windows, diríjase a @subsubsubheading Instalado mediante un gestor de paquetes o compilado a partir de la fuente -Diríjase a -@file{@var{PREFIJO}/share/lilypond/@var{X.Y.Z}/}, donde @var{PREFIJO} -se encuentra determinado por su administrador de paquetes o guión -@code{configure}, y @var{X.Y.Z} es el número de la versión de -LilyPond. +Diríjase a @file{@var{PREFIJO}/share/lilypond/@var{X.Y.Z}/}, donde +@var{PREFIJO} se encuentra determinado por su administrador de +paquetes o guión @code{configure}, y @var{X.Y.Z} es el número de +la versión de LilyPond. @smallspace @@ -4643,14 +4774,15 @@ Dentro de esta carpeta, las dos subcarpetas interesantes son @item @file{scm/} - contiene archivos en formato Scheme @end itemize -Vamos a comenzar observando algunos archivos que están en @file{ly/}. -Abra @file{ly/property-init.ly} con un editor de textos. El mismo que -usaría normalmente para los archivos @file{.ly} servirá perfectamente. -Este archivo contiene las definiciones de todas las instrucciones -estándar predefinidas de LilyPond, como por ejemplo @code{\stemUp} y -@code{\slurDotted}. Podrá ver que no son nada más que definiciones de -variables que contienen una o varias instrucciones @code{\override}. -Por ejemplo, @code{/tieDotted} está definido de tal forma que su valor +Vamos a comenzar observando algunos archivos que están en +@file{ly/}. Abra @file{ly/property-init.ly} con un editor de +textos. El mismo que usaría normalmente para los archivos +@file{.ly} servirá perfectamente. Este archivo contiene las +definiciones de todas las instrucciones estándar predefinidas de +LilyPond, como por ejemplo @code{\tieUp} y @code{\slurDotted}. +Podrá ver que no son nada más que definiciones de variables que +contienen una o varias instrucciones @code{\override}. Por +ejemplo, @code{\tieDotted} está definido de tal forma que su valor es: @example @@ -4682,15 +4814,16 @@ Los siguientes son los archivos más útiles que se encuentran en @tab Definiciones de las instrucciones predefinidas relacionadas con los objetos de extensión @end multitable -Otros ajustes (como las definiciones de las instrucciones de marcado) -se almacenan como archivos @file{.scm} (de Scheme). El lenguaje de -programación Scheme se utiliza para proporcionar un interfaz -programable en el funcionamiento interno de LilyPond. Cualquier -explicación adicional sobre estos archivos se encuentra por el momento -fuera del ámbito de este manual, porque se requieren conocimientos del -lenguaje Scheme. Se advierte a los usuarios que se necesita una -importante cantidad de conocimientos técnicos o de tiempo para -comprender el lenguaje Scheme y estos archivos (véase @rextend{Tutorial de Scheme}). +Otros ajustes (como las definiciones de las instrucciones de +marcado) se almacenan como archivos @file{.scm} (de Scheme). El +lenguaje de programación Scheme se utiliza para proporcionar un +interfaz programable en el funcionamiento interno de LilyPond. +Cualquier explicación adicional sobre estos archivos se encuentra +por el momento fuera del ámbito de este manual, porque se +requieren conocimientos del lenguaje Scheme. Se advierte a los +usuarios que se necesita una importante cantidad de conocimientos +técnicos o de tiempo para comprender el lenguaje Scheme y estos +archivos (véase @rextend{Tutorial de Scheme}). Si ya tiene estos conocimientos, los archivos de Scheme que pueden interesarle son: @@ -4721,21 +4854,23 @@ interesarle son: Aunque es posible hacer muchas cosas con las instrucciones @code{\override} y @code{\tweak} , tenemos una forma incluso más -poderosa de modificar el funcionamiento de LilyPond, a través de un -interface programable hacia las operaciones internas de LilyPond. Se -puede incorporar código escrito en el lenguaje de programación Scheme, -directamente en el mecanismo de funcionamiento de LilyPond. Por -supuesto, para hacer esto se necesitan al menos unos conocimientos -básicos de programación en Scheme, y damos una introducción en el -@rextend{Tutorial de Scheme}. - -Como ejemplo que ilustra una de las muchas posibilidades, en lugar de -dar a una propiedad un valor constante, se puede establecer al +poderosa de modificar el funcionamiento de LilyPond, a través de +un interface programable hacia las operaciones internas de +LilyPond. Se puede incorporar código escrito en el lenguaje de +programación Scheme, directamente en el mecanismo de +funcionamiento de LilyPond. Por supuesto, para hacer esto se +necesitan al menos unos conocimientos básicos de programación en +Scheme, y damos una introducción en el @rextend{Tutorial de +Scheme}. + +Como ejemplo que ilustra una de las muchas posibilidades, en lugar +de dar a una propiedad un valor constante, se puede establecer al resultado de un procedimiento de Scheme que se invoca cada vez que -LilyPond accede a esta propiedad. La propiedad se puede establecer -dinámicamente a un valor determinado por el procedimiento en el -momento en que se invoca. En este ejemplo damos a las cabezas de las -notas un color que depende de su posición dentro del pentagrama. +LilyPond accede a esta propiedad. La propiedad se puede +establecer dinámicamente a un valor determinado por el +procedimiento en el momento en que se invoca. En este ejemplo +damos a las cabezas de las notas un color que depende de su +posición dentro del pentagrama. @cindex x11-color, función, ejemplo de utilización @cindex NoteHead, ejemplo de sobreescritura @@ -4757,14 +4892,14 @@ notas un color que depende de su posición dentro del pentagrama. ((0) (x11-color 'violet )) ; for B ))) -\relative c' { +\relative { % Arrange to obtain color from color-notehead procedure \override NoteHead.color = #color-notehead a2 b | c2 d | e2 f | g2 a | } @end lilypond -Se pueden encontrar ejemplos adicionales que muestran la utilización -de estos interfaces programables, en +Se pueden encontrar ejemplos adicionales que muestran la +utilización de estos interfaces programables, en @rextendnamed{Callback functions,Funciones de callback}. diff --git a/Documentation/es/notation.tely b/Documentation/es/notation.tely index 502355754a..a70efba00c 100644 --- a/Documentation/es/notation.tely +++ b/Documentation/es/notation.tely @@ -1,6 +1,6 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 00cd4ff0b8dc4978344ba966bec06ddbc445f7e9 + Translation of GIT committish: 47db9a3883d726ca53e2133a3b2298f78dd6a32e When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -20,9 +20,14 @@ lector está familiarizado con el material que hay en @rlearningnamed{Top, Manual de aprendizaje}. @end macro -@c `Notation Reference' was born 1999-10-11 with git commit 940dda0... +@c `Notation Reference' was born 1998-08-14 with this commit: +@c release: 1.0.2 +@c author: Han-Wen Nienhuys +@c commit: a3a44f9f3c581b6824b3a65f9039656693e09bbf +@c file: Documentation/tex/refman.yo + @macro copyrightDeclare -Copyright @copyright{} 1999--2012 por los autores. +Copyright @copyright{} 1999--2015 por los autores. @end macro @@ -89,12 +94,12 @@ Apéndices @translationof LilyPond command index Este índice relaciona todas las instrucciones y palabras clave de -LilyPond, con enlaces a aquellas secciones del manual que describen o -se ocupan de su uso. Cada uno de los enlaces consta de dos partes. -La primera parte apunta a la situación exacta del manual en que -aparece la instrucción o palabra clave; la segunda parte apunta al -comienzo de la sección correspondiente del manual en la que aparece la -instrucción o palabra clave. +LilyPond, con enlaces a aquellas secciones del manual que +describen o se ocupan de su uso. Cada uno de los enlaces consta +de dos partes. La primera parte apunta a la situación exacta del +manual en que aparece la instrucción o palabra clave; la segunda +parte apunta al comienzo de la sección correspondiente del manual +en la que aparece la instrucción o palabra clave. @printindex ky @@ -102,14 +107,14 @@ instrucción o palabra clave. @appendix Índice de LilyPond @translationof LilyPond index -Además de todas las instrucciones y palabras clave de LilyPond, este -índice es una lista de términos musicales y las palabras que tienen -relación con cada uno de ellos, con enlaces a aquellas secciones del -manual que describen o se ocupan de dicho término. Cada uno de los -enlaces consta de dos partes. La primera parte apunta a la situación -exacta del manual en que aparece el término; la segunda parte apunta -al comienzo de la sección correspondiente del manual en la que se -discute dicho término. +Además de todas las instrucciones y palabras clave de LilyPond, +este índice es una lista de términos musicales y las palabras que +tienen relación con cada uno de ellos, con enlaces a aquellas +secciones del manual que describen o se ocupan de dicho término. +Cada uno de los enlaces consta de dos partes. La primera parte +apunta a la situación exacta del manual en que aparece el término; +la segunda parte apunta al comienzo de la sección correspondiente +del manual en la que se discute dicho término. @printindex cp diff --git a/Documentation/es/notation/ancient.itely b/Documentation/es/notation/ancient.itely index b315871178..f1f10c14e5 100644 --- a/Documentation/es/notation/ancient.itely +++ b/Documentation/es/notation/ancient.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @c vim: foldmethod=marker @ignore - Translation of GIT committish: 7d3ea6751584868fda754e8b275e06605aad857d + Translation of GIT committish: 09fca104f8cd9c8b85b269a4006ce3b7f9511489 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @node Notación antigua @@ -35,16 +35,16 @@ Entre las formas en que está contemplada la notación antigua se encuentra la posibilidad de tipografiar notación mensural, canto -gregoriano y canto kievano en notación cuadrada. Se puede acceder a -estas funcionalidades mediante la modificación de propiedades de +gregoriano y canto kievano en notación cuadrada. Se puede acceder +a estas funcionalidades mediante la modificación de propiedades de estilo de objetos gráficos como la cabeza de las notas o los silencios, o bien mediante la utilización de uno de los contextos predefinidos para estos estilos. -Muchos objetos gráficos, como la cabeza y el corchete de las figuras, -las alteraciones, la indicación de compás y los silencios ofrecen una -propiedad @code{style} (estilo), que se puede cambiar para emular -varios estilos diferentes de notación antigua. Véase +Muchos objetos gráficos, como la cabeza y el corchete de las +figuras, las alteraciones, la indicación de compás y los silencios +ofrecen una propiedad @code{style} (estilo), que se puede cambiar +para emular varios estilos diferentes de notación antigua. Véase @itemize @item @ref{Cabezas de nota de la música mensural}, @@ -91,30 +91,34 @@ Están disponibles tres estilos para la composición tipográfica del canto gregoriano: @itemize -@item @emph{Editio Vaticana} -es un estilo completo para canto gregoriano, que sigue la apariencia -de las ediciones de Solesmes, los libros de canto oficiales del -Vaticano desde 1904. LilyPond contempla todos los signos de notación -que se utilizan en este estilo, entre ellos las ligaduras, -@emph{custodias} y símbolos especiales como el quilisma y el oriscus. +@item +@emph{Editio Vaticana} es un estilo completo para canto +gregoriano, que sigue la apariencia de las ediciones de Solesmes, +los libros de canto oficiales del Vaticano desde 1904. LilyPond +contempla todos los signos de notación que se utilizan en este +estilo, entre ellos las ligaduras, @emph{custodias} y símbolos +especiales como el quilisma y el oriscus. @cindex Solesmes @cindex Vaticana, Editio -@item El estilo @emph{Editio Medicaea} -ofrece ciertas funcionalidades que se usan en las ediciones Medicaea -(o de Ratisbona) que se usaban con anterioridad a las ediciones de -Solesmes. Las diferencias más significativas con respecto al estilo -@emph{Vaticana} son las claves, que tienen trazos descendentes, y la -cabeza de las figuras, que son cuadradas y regulares. +@item +El estilo @emph{Editio Medicaea} ofrece ciertas funcionalidades +que se usan en las ediciones Medicaea (o de Ratisbona) que se +usaban con anterioridad a las ediciones de Solesmes. Las +diferencias más significativas con respecto al estilo +@emph{Vaticana} son las claves, que tienen trazos descendentes, y +la cabeza de las figuras, que son cuadradas y regulares. @cindex Ratisbona, Editio @cindex Medicaea, Editio -@item El estilo @emph{Hufnagel} (en @qq{uña de herradura}) o @emph{gótico} -reproduce el estilo de escritura en los manuscritos de canto -medievales de Alemania y Centro Europa. Recibe el nombre de la forma -de la nota básica (la @emph{virga}), que parece una pequeña uña. +@item +El estilo @emph{Hufnagel} (en @qq{uña de herradura}) o +@emph{gótico} reproduce el estilo de escritura en los manuscritos +de canto medievales de Alemania y Centro Europa. Recibe el nombre +de la forma de la nota básica (la @emph{virga}), que parece una +pequeña uña. @cindex hufnagel @end itemize @@ -124,43 +128,45 @@ impresas de música mensural tardomedievales y renacentistas: @itemize @item El estilo @emph{Mensural} se asemeja bastante al estilo de escritura utilizado en los -manuscritos tardomedievales y renacentistas tempranos, con la cabeza -de sus figuras en forma de rombo pequeñas y estrechas, y los silencios -que imitan un estilo dibujado a mano. +manuscritos tardomedievales y renacentistas tempranos, con la +cabeza de sus figuras en forma de rombo pequeñas y estrechas, y +los silencios que imitan un estilo dibujado a mano. @cindex mensural @item El estilo @emph{Neomensural} -es una versión modernizada y estilizada del anterior: la cabeza de las -figuras es más ancha y los silencios están formados por trazos -rectilíneos. Este estilo está particularmente indicado, p.ej., para -los @emph{incipits} de transcripciones de fragmentos de música -mensural. +es una versión modernizada y estilizada del anterior: la cabeza de +las figuras es más ancha y los silencios están formados por trazos +rectilíneos. Este estilo está particularmente indicado, p.ej., +para los @emph{incipits} de transcripciones de fragmentos de +música mensural. @cindex neomensural @item El estilo @emph{Petrucci} -recibe su nombre de Ottaviano Petrucci (1466-1539), el primer impresor -en utilizar tipos móviles para la música (en su @emph{Harmonice -musices odhecaton}, 1501). Este estilo utiliza para las figuras una -cabeza más grande que los otros estilos mensurales. +recibe su nombre de Ottaviano Petrucci (1466-1539), el primer +impresor en utilizar tipos móviles para la música (en su +@emph{Harmonice musices odhecaton}, 1501). Este estilo utiliza +para las figuras una cabeza más grande que los otros estilos +mensurales. @cindex Petrucci @end itemize -@emph{Baroque} y @emph{Classical} no son estilos completos pero -difieren del estilo predeterminado solamente en ciertos detalles: -algunas cabezas de nota (Baroque) y el silencio de negra (Classical). +@emph{Baroque} y @emph{Classical} no son estilos completos, sino +que difieren del estilo predeterminado solamente en ciertos +detalles: algunas cabezas de nota (Baroque) y el silencio de negra +(Classical). -Sólo el estilo mensural tiene alternativas para todos los aspectos de -la notación. Así, no existen silencios ni corchetes en los estilos -gregorianos, pues estos símbolos no se usan en la notación del canto -llano, y el estilo Petrucci no posee corchetes ni alteraciones por sí -mismo. +Sólo el estilo mensural tiene alternativas para todos los aspectos +de la notación. Así, no existen silencios ni corchetes en los +estilos gregorianos, pues estos símbolos no se usan en la notación +del canto llano, y el estilo Petrucci no posee corchetes ni +alteraciones por sí mismo. -Cada elemento de la notación se puede cambiar independientemente de -los otros, y así podemos usar corchetes mensurales, cabezas de +Cada elemento de la notación se puede cambiar independientemente +de los otros, y así podemos usar corchetes mensurales, cabezas de petrucci, silencios de classical y claves de vaticana en la misma pieza, si queremos. @@ -186,14 +192,14 @@ Glosario musical: @translationof Pre-defined contexts Para el canto gregoriano y la notación mensural, están a nuestra -disposición contextos predefinidos de voz y de pauta, que establecen -todos los símbolos de notación a unos valores adecuados para estos -estilos. Si nos satisfacen estos valores predeterminados, podemos a -continuación introducir directamente las notas sin la necesidad de -preocuparnos de los detalles sobre cómo personalizar un contexto. -Véanse uno de los contextos predefinidos @code{VaticanaVoice}, -@code{VaticanaStaff}, @code{MensuralVoice} y -@code{MensuralStaff}. +disposición contextos predefinidos de voz y de pauta, que +establecen todos los símbolos de notación a unos valores adecuados +para estos estilos. Si nos satisfacen estos valores +predeterminados, podemos a continuación introducir directamente +las notas sin la necesidad de preocuparnos de los detalles sobre +cómo personalizar un contexto. Véanse uno de los contextos +predefinidos @code{VaticanaVoice}, @code{VaticanaStaff}, +@code{MensuralVoice} y @code{MensuralStaff}. @itemize @item @ref{Contextos del canto gregoriano}, @@ -218,22 +224,22 @@ Referencia de la notación: @c TODO: Should double check if I recalled things correctly when I wrote @c down the following paragraph by heart. -Una ligadura es un símbolo gráfico que representa al menos dos notas -distintas. Las ligaduras aparecieron originalmente en los manuscritos -de la notación del canto gregoriano para denotar secuencias de notas -ascendentes o descendentes en la misma sílaba. Se usan también en -notación mensural. +Una ligadura es un símbolo gráfico que representa al menos dos +notas distintas. Las ligaduras aparecieron originalmente en los +manuscritos de la notación del canto gregoriano para denotar +secuencias de notas ascendentes o descendentes en la misma sílaba. +Se usan también en notación mensural. Las ligaduras se escriben @emph{encerrándolas} dentro de un par -@code{\[} y @code{\]}. Ciertos estilos de ligadura podrían necesitar -una sintaxis de entrada adicional específica para este tipo de -ligadura en particular. De forma predeterminada, el grabador -@code{LigatureBracket} se limita a colocar un corchete recto -sobre la ligadura: +@code{\[} y @code{\]}. Ciertos estilos de ligadura podrían +necesitar una sintaxis de entrada adicional específica para este +tipo de ligadura en particular. De forma predeterminada, el +grabador @code{LigatureBracket} se limita a colocar un corchete +recto sobre la ligadura: @lilypond[quote,ragged-right,verbatim] -\relative c'' { - \[ g c, a' f d' \] +\relative { + \[ g' c, a' f d' \] a g f \[ e f a g \] } @@ -241,9 +247,9 @@ sobre la ligadura: Están disponibles otros dos estilos de ligaduras: el Vaticana para canto gregoriano, y el Mensural para música mensural (sólo están -contempladas las ligaduras mensurales blancas para la música mensural, -y con ciertas limitaciones). Para usar cualquiera de estos estilos, -se debe sustituir el grabador predeterminado +contempladas las ligaduras mensurales blancas para la música +mensural, y con ciertas limitaciones). Para usar cualquiera de +estos estilos, se debe sustituir el grabador predeterminado @code{Ligature_bracket_engraver} por uno de los grabadores especializados en ligaduras del contexto @code{Voice}, como se explica en @ref{Ligaduras mensurales blancas} y @@ -259,18 +265,18 @@ Referencia de la notación: @knownissues Las ligaduras necesitan un espaciado especial que aún no se ha -desarrollado. Como consecuencia, la mayor parte del tiempo existe una -separación excesiva entre las ligaduras, y a menudo los cortes de -línea no son satisfactorios. Además, la letra de los cantos no se -alinea correctamente con las ligaduras. +desarrollado. Como consecuencia, la mayor parte del tiempo existe +una separación excesiva entre las ligaduras, y a menudo los cortes +de línea no son satisfactorios. Además, la letra de los cantos no +se alinea correctamente con las ligaduras. Las alteraciones accidentales no se deben imprimir dentro de las ligaduras, sino que deben reunirse e imprimirse juntas delante de ellas. -La sintaxis todavía utiliza el obsoleto estilo infijo -@code{\[ expresión_musical \]}. Por motivos de consistencia, esto -cambiará algún día al estilo postfijo @code{nota\[ @dots{} nota\]}. +La sintaxis todavía utiliza el obsoleto estilo infijo @code{\[ +expresión_musical \]}. Por motivos de consistencia, esto cambiará +algún día al estilo postfijo @code{nota\[ @dots{} nota\]}. @node Custos @@ -280,29 +286,30 @@ cambiará algún día al estilo postfijo @code{nota\[ @dots{} nota\]}. @cindex custos @cindex custodes -Un @emph{custos} (en plural: @emph{custodias}, que en latín significa -@qq{guarda}) es un símbolo que aparece al final de una pauta. Anticipa -la altura de la primera o primeras notas de la línea siguiente, -ayudando al intérprete con los saltos de línea durante la ejecución. +Un @emph{custos} (en plural: @emph{custodias}, que en latín +significa @qq{guarda}) es un símbolo que aparece al final de una +pauta. Anticipa la altura de la primera o primeras notas de la +línea siguiente, ayudando al intérprete con los saltos de línea +durante la ejecución. Las custodias se utilizaron mucho en la notación musical hasta el siglo XVII. En nuestros días, sobreviven sólo en algunas formas -particulares de notación musical como las ediciones contemporáneas de -canto gregoriano como la @emph{Editio Vaticana}. Hay distintos glifos -para el custos que se utilizan en las diferentes variaciones de estilo -notacional. +particulares de notación musical como las ediciones contemporáneas +de canto gregoriano como la @emph{Editio Vaticana}. Hay distintos +glifos para el custos que se utilizan en las diferentes +variaciones de estilo notacional. Para tipografiar las custodias, simplemente coloque un grabador -@code{Custos_engraver} dentro del contexto @code{Staff} -(el contexto del pentagrama) al declarar el bloque de @code{\layout} +@code{Custos_engraver} dentro del contexto @code{Staff} (el +contexto del pentagrama) al declarar el bloque de @code{\layout} (el bloque de disposición de la página), y modifique el estilo del custos con una instrucción @code{\override} si lo desea, como se muestra en el ejemplo siguiente: @lilypond[quote,ragged-right] \score { - \relative c'' { - a1 + \relative { + a'1 \break g } @@ -316,10 +323,10 @@ muestra en el ejemplo siguiente: } @end lilypond -El glifo del custos se selecciona mediante la propiedad @code{style}. -Los estilos contemplados son @code{vaticana}, @code{medicaea}, -@code{hufnagel} y @code{mensural}. Se muestran en el siguiente -fragmento: +El glifo del custos se selecciona mediante la propiedad +@code{style}. Los estilos contemplados son @code{vaticana}, +@code{medicaea}, @code{hufnagel} y @code{mensural}. Se muestran +en el siguiente fragmento: @lilypond[quote,ragged-right,fragment] \new Lyrics \lyricmode { @@ -373,22 +380,23 @@ Referencia de funcionamiento interno: @unnumberedsubsubsec Contextos de la música mensural @translationof Mensural contexts -@cindex MensuralVoiceContext -@cindex MensuralStaffContext +@cindex MensuralVoice +@cindex MensuralStaff Los contextos predefinidos de voz @code{MensuralVoice} y de pauta -@code{MensuralStaff} se pueden usar para grabar una pieza en estilo -mensural. Estos contextos establecen a unos valores iniciales -adecuados todas las propiedades relevantes de los contextos y de los -objetos gráficos, de manera que pueda comenzar inmediatamente a -escribir el canto, como lo demuestra el siguiente fragmento: +@code{MensuralStaff} se pueden usar para grabar una pieza en +estilo mensural. Estos contextos establecen a unos valores +iniciales adecuados todas las propiedades relevantes de los +contextos y de los objetos gráficos, de manera que pueda comenzar +inmediatamente a escribir el canto, como lo demuestra el siguiente +fragmento: @lilypond[quote,ragged-right,verbatim] \score { << - \new MensuralVoice = "discantus" \relative c'' { + \new MensuralVoice = "discantus" \relative { \hide Score.BarNumber { - c1\melisma bes a g\melismaEnd + c''1\melisma bes a g\melismaEnd f\breve \[ f1\melisma a c\breve d\melismaEnd \] c\longa @@ -415,19 +423,19 @@ Glosario musical: @cindex clefs La siguiente tabla presenta todas las claves antiguas que están -contempladas a través de la instrucción @code{\clef}. Algunas de las -claves usan el mismo glifo, pero se diferencian sólo en la línea en -que se imprimen. En tales casos, se usa un número añadido al nombre -para enumerar dichas claves, numerado desde la línea inferior hasta la -superior. Puede forzar manualmente que se escriba un glifo -de clave sobre una línea arbitraria, como se encuentra descrito en -@ref{Clave}. La nota impresa a la derecha de cada clave en la columna -de los ejemplos denota la situación del Do central (@code{c'}) con -respecto a dicha clave. - -Petrucci usaba claves de Do que tenían barras verticales en el lado -izquierdo en un equilibrio variable, dependiendo de la línea de la -pauta en que se imprimían. +contempladas a través de la instrucción @code{\clef}. Algunas de +las claves usan el mismo glifo, pero se diferencian sólo en la +línea en que se imprimen. En tales casos, se usa un número +añadido al nombre para enumerar dichas claves, numerado desde la +línea inferior hasta la superior. Puede forzar manualmente que se +escriba un glifo de clave sobre una línea arbitraria, como se +encuentra descrito en @ref{Clave}. La nota impresa a la derecha +de cada clave en la columna de los ejemplos denota la situación +del Do central (@code{c'}) con respecto a dicha clave. + +Petrucci usaba claves de Do que tenían barras verticales en el +lado izquierdo en un equilibrio variable, dependiendo de la línea +de la pauta en que se imprimían. @multitable @columnfractions .4 .4 .2 @item @@ -444,10 +452,10 @@ clave de Do, mensural @code{mensural-c3}, @code{mensural-c4},@* @code{mensural-c5} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "mensural-c2" \override NoteHead.style = #'mensural - c + c'1 @end lilypond @item @@ -455,10 +463,10 @@ clave de Fa, mensural @tab @code{mensural-f} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "mensural-f" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item @@ -466,10 +474,10 @@ clave de Sol, mensural @tab @code{mensural-g} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "mensural-g" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item @@ -479,10 +487,10 @@ clave de Do, mensural negra @code{blackmensural-c3}, @code{blackmensural-c4},@* @code{blackmensural-c5} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "blackmensural-c2" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item @@ -491,36 +499,36 @@ clave de Do, neomensural @code{neomensural-c1}, @code{neomensural-c2},@* @code{neomensural-c3}, @code{neomensural-c4} @tab -@lilypond[relative=1,notime] - \clef "neomensural-c2" c1 +@lilypond[fragment,notime] + \clef "neomensural-c2" c'1 @end lilypond @item -claves de Do en el estilo de Petrucci, para su uso en distintas líneas -de la pauta (el ejemplo muestra la clave de Do en segunda) +claves de Do en el estilo de Petrucci, para su uso en distintas +líneas de la pauta (el ejemplo muestra la clave de Do en segunda) @tab @code{petrucci-c1}, @code{petrucci-c2},@* @code{petrucci-c3}, @code{petrucci-c4},@* @code{petrucci-c5} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "petrucci-c2" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item -claves de Fa en el estilo de Petrucci, para su uso en -distintas líneas de la pauta -(el ejemplo muestra la lclave de Fa en tercera línea) +claves de Fa en el estilo de Petrucci, para su uso en distintas +líneas de la pauta (el ejemplo muestra la lclave de Fa en tercera +línea) @tab @code{petrucci-f3}, @code{petrucci-f4},@* @code{petrucci-f5} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "petrucci-f3" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item @@ -528,10 +536,10 @@ clave de Sol en el estilo de Petrucci @tab @code{petrucci-g} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "petrucci-g" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @end multitable @@ -544,7 +552,8 @@ Referencia de la notación: @ref{Clave}. @knownissues -La clave de Sol mensural está asignada a la clave de Sol de Petrucci. +La clave de Sol mensural está asignada a la clave de Sol de +Petrucci. @node Indicaciones de compás de la música mensural @@ -552,15 +561,16 @@ La clave de Sol mensural está asignada a la clave de Sol de Petrucci. @translationof Mensural time signatures @cindex mensuración, símbolo de -@cindex compás, indicación de +@cindex compás, indicación de, mensural +@cindex compás, indicación de, estilos de -Los símbolos de mensuración (que son algo similar, pero no exactamente -igual que las indicaciones de compás) están contemplados de forma -limitada. Los glifos están configurados de forma fija para -determinadas fracciones de tiempo. En otras palabras, para obtener un -símbolo de mensuración determinado con la instrucción -@code{\time n/m}, se tienen que escoger @code{n} y @code{m} según la -siguiente tabla +Los símbolos de mensuración (que son algo similar, pero no +exactamente igual que las indicaciones de compás) están +contemplados de forma limitada. Los glifos están configurados de +forma fija para determinadas fracciones de tiempo. En otras +palabras, para obtener un símbolo de mensuración determinado con +la instrucción @code{\time n/m}, se tienen que escoger @code{n} y +@code{m} según la siguiente tabla @lilypond[quote,ragged-right] \layout { @@ -610,13 +620,13 @@ siguiente tabla Utilice la propiedad @code{style} del elemento gráfico @code{TimeSignature} para seleccionar las indicaciones de compás -de la música antigua. Los estilos contemplados son @code{neomensural} -y @code{mensural}. La tabla anterior utiliza el estilo -@code{neomensural}. Los ejemplos siguientes muestran las diferencias -que existen entre los estilos: +de la música antigua. Los estilos contemplados son +@code{neomensural} y @code{mensural}. La tabla anterior utiliza +el estilo @code{neomensural}. Los ejemplos siguientes muestran +las diferencias que existen entre los estilos: -@lilypond[ragged-right,relative=1,quote] -{ +@lilypond[ragged-right,quote] +\relative c' { \textLengthOn \time 2/2 @@ -639,8 +649,8 @@ que existen entre los estilos: } @end lilypond -@ref{Indicación de compás} -ofrece una introducción general al uso de las indicaciones de compás. +@ref{Indicación de compás} ofrece una introducción general al uso +de las indicaciones de compás. @seealso Glosario musical: @@ -651,10 +661,9 @@ Referencia de la notación: @knownissues Las relaciones de duración de las notas no pueden cambiar con la -indicación de compás, porque no son constantes. Por ejemplo, -la razón de 1@tie{}breve = 3@tie{}semibreves -(@emph{tempus perfectum}) se puede hacer a mano mediante el -establecimiento de +indicación de compás, porque no son constantes. Por ejemplo, la +razón de 1@tie{}breve = 3@tie{}semibreves (@emph{tempus +perfectum}) se puede hacer a mano mediante el establecimiento de @example breveTP = #(ly:make-duration -1 0 3/2) @@ -663,13 +672,13 @@ breveTP = #(ly:make-duration -1 0 3/2) @end example @noindent -Esto fija un valor para @code{breveTP} de 3/2 multiplicado por 2 = 3 -veces una redonda. +Esto fija un valor para @code{breveTP} de 3/2 multiplicado por 2 = +3 veces una redonda. Los símbolos @code{mensural68alt} y @code{neomensural68alt} -(alternativos al símbolo de 6/8) no se puede seleccionar directamente -con @code{\time}. En su lugar, utilice -@code{\markup @{\musicglyph #"timesig.mensural68alt" @}}. +(alternativos al símbolo de 6/8) no se puede seleccionar +directamente con @code{\time}. En su lugar, utilice @code{\markup +@{\musicglyph #"timesig.mensural68alt" @}}. @node Cabezas de nota de la música mensural @@ -681,9 +690,9 @@ con @code{\time}. En su lugar, utilice Para la notación antigua, se puede elegir un estilo de cabezas de notas distinto al @code{default} (estilo predeterminado). Esto se consigue estableciendo la propiedad @code{style} del objeto -@code{NoteHead} a los valores @code{baroque}, -@code{neomensural}, @code{mensural}, @code{petrucci}, -@code{blackpetrucci} o @code{semipetrucci}. +@code{NoteHead} a los valores @code{baroque}, @code{neomensural}, +@code{mensural}, @code{petrucci}, @code{blackpetrucci} o +@code{semipetrucci}. El estilo @code{baroque} se diferencia del estilo predeterminado @code{default} en que: @@ -693,25 +702,25 @@ El estilo @code{baroque} se diferencia del estilo predeterminado @item Usa una forma cuadrada para las cabezas de @code{\breve}. @end itemize -Los estilos @code{neomensural}, @code{mensural} y @code{petrucci} se -diferencian del estilo @code{baroque} en que: +Los estilos @code{neomensural}, @code{mensural} y @code{petrucci} +se diferencian del estilo @code{baroque} en que: @itemize @item Usan cabezas romboidales para las semibreves y todas las notas más cortas, y @item Centran las plicas sobre las cabezas. @end itemize -El estilo @code{blackpetrucci} produce notas con una cabeza que puede -usarse en notación mensural negra o en secciones de coloratio dentro -de la notación mensural blanca. A causa de que el estilo de la cabeza -de las notas no influye en el número de corchetes, en este estilo la -notación de la semimínima debe hacer como @code{a8*2}, no como -@code{a4}, pues de lo contrario tendrá el aspecto de una mínima. El -multiplicador puede ser distinto si se usa la coloratio, es decir, -para la notación de tresillos. +El estilo @code{blackpetrucci} produce notas con una cabeza que +puede usarse en notación mensural negra o en secciones de +coloratio dentro de la notación mensural blanca. A causa de que +el estilo de la cabeza de las notas no influye en el número de +corchetes, en este estilo la notación de la semimínima debe hacer +como @code{a8*2}, no como @code{a4}, pues de lo contrario tendrá +el aspecto de una mínima. El multiplicador puede ser distinto si +se usa la coloratio, es decir, para la notación de tresillos. -Utilice el estilo @code{semipetrucci} para dibujar notas con cabeza -semi-rellena (breves, longas y máximas). +Utilice el estilo @code{semipetrucci} para dibujar notas con +cabeza semi-rellena (breves, longas y máximas). El ejemplo siguiente muestra el estilo @code{petrucci}: @@ -732,8 +741,8 @@ a'\longa @end lilypond -@ref{Estilos de cabezas de nota} ofrece una visión de conjunto sobre la -totalidad de los estilos de cabeza disponibles. +@ref{Estilos de cabezas de nota} ofrece una visión de conjunto +sobre la totalidad de los estilos de cabeza disponibles. @seealso Glosario musical: @@ -752,23 +761,26 @@ Referencia de la notación: Utilice la propiedad @code{flag-style} del elemento gráfico @code{Stem} para seleccionar los corchetes de estilo antiguo. -Aparte del estilo de corchete por defecto @code{default}, sólo está -contemplado el estilo @code{mensural} +Aparte del estilo de corchete por defecto @code{default}, sólo +está contemplado el estilo @code{mensural} -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\override Flag.style = #'mensural -\override Stem.thickness = #1.0 -\override NoteHead.style = #'mensural -\autoBeamOff -c8 d e f c16 d e f c32 d e f s8 -c'8 d e f c16 d e f c32 d e f +@lilypond[quote,fragment,ragged-right,verbatim] +\relative c' { + \override Flag.style = #'mensural + \override Stem.thickness = #1.0 + \override NoteHead.style = #'mensural + \autoBeamOff + c8 d e f c16 d e f c32 d e f s8 + c'8 d e f c16 d e f c32 d e f +} @end lilypond Observe que la bandera más interna de cada uno de los corchetes mensurales se alinea verticalmente con una línea de la pauta. -No existe un estilo particular de corchete para la notación neo-mensural ni Petrucci. -No existen corchetes en la notación del canto gregoriano. +No existe un estilo particular de corchete para la notación +neo-mensural ni Petrucci. No existen corchetes en la notación del +canto gregoriano. @seealso Glosario musical: @@ -776,12 +788,13 @@ Glosario musical: @rglos{flag}. @knownissues -La alineación vertical de cada uno de los corchetes con una línea de -la pauta da por supuesto que las plicas siempre terminan exactamente -encima o bien exactamente en el medio de dos líneas de la pauta. Esto -puede no ser siempre cierto cuando se utilizan las posibilidades de -disposición avanzadas de la notación clásica (que, de todas formas, -por lo común se encuentra fuera del ámbito de la notación mensural). +La alineación vertical de cada uno de los corchetes con una línea +de la pauta da por supuesto que las plicas siempre terminan +exactamente encima o bien exactamente en el medio de dos líneas de +la pauta. Esto puede no ser siempre cierto cuando se utilizan las +posibilidades de disposición avanzadas de la notación clásica +(que, de todas formas, por lo común se encuentra fuera del ámbito +de la notación mensural). @node Silencios de la música mensural @@ -790,30 +803,23 @@ por lo común se encuentra fuera del ámbito de la notación mensural). @cindex rests, ancient -Utilice la propiedad @code{style} del elemento gráfico -@code{Rest} para seleccionar silencios antiguos. Los estilos -contemplados son @code{classical}, @code{neomensural} y -@code{mensural}. @code{classical} se diferencia del estilo por -defecto @code{default} solamente en que el silencio de negra parece un -silencio de corchea invertido horizontalmente. Los estilos -@code{mensural} y @code{neomensural} reproducen el aspecto de los -silencios de los manuscritos y ediciones impresas de hasta el s.XVI. +Utilice la propiedad @code{style} del elemento gráfico @code{Rest} +para seleccionar silencios antiguos. Los estilos de música +antigua contemplados son @code{classical}, @code{neomensural} y +@code{mensural}. -El ejemplo siguiente muestra los estilos @code{mensural} y -@code{neomensural}: +El ejemplo siguiente muestra estos estilos: @lilypond[quote,fragment,ragged-right,verbatim] \set Score.skipBars = ##t -\override Rest.style = #'classical -r\longa^"classical" r\breve r1 r2 r4 r8 r16 s \break \override Rest.style = #'mensural r\longa^"mensural" r\breve r1 r2 r4 r8 r16 s \break \override Rest.style = #'neomensural r\longa^"neomensural" r\breve r1 r2 r4 r8 r16 @end lilypond -No existen silencios de fusa y semifusa específicos para los estilos -mensural ni neo-mensural. En su lugar se tomarán los silencios del +No existen silencios de fusa y semifusa específicos para los +estilos mensural ni neo-mensural. Se usan los silencios del estilo predeterminado. @seealso @@ -828,10 +834,10 @@ Fragmentos de código: @knownissues El glifo para el silencio de máxima en el estilo mensural es en -realidad un silencio de longa perfecta; use dos (o tres) silencios de -longa para imprimir un silencio de máxima. Los sliencions de longa no -se agrupan automáticamente, por lo que debe hacerse manualmente -utilizando silencios con altura determinada. +realidad un silencio de longa perfecta; use dos (o tres) silencios +de longa para imprimir un silencio de máxima. Los sliencions de +longa no se agrupan automáticamente, por lo que debe hacerse +manualmente utilizando silencios con altura determinada. @node Alteraciones y armaduras de la música mensural @@ -841,9 +847,13 @@ utilizando silencios con altura determinada. @cindex alteraciones @cindex armadura -El estilo @code{mensural} ofrece unos símbolos de sostenido y bemol -distintos de los del estilo predeterminado. Si se solicita, el -símbolo de becuadro se extrae del estilo @code{vaticana}. +El estilo @code{mensural} ofrece unos símbolos de sostenido y +bemol distintos de los del estilo predeterminado. La notación +mensural rara vez utilizaba el becuadro: en su lugar, se usaba el +sostenido o bemol correspondiente. Por ejemplo, un Si natural en +la tonalidad de Fa mayor se indicaría con un sostenido. Sin +embargo, si se solicita explícitamente, el símbolo de becuadro se +extrae del estilo @code{vaticana}. @lilypond[quote,ragged-right,staffsize=26] \markup { @@ -857,8 +867,8 @@ símbolo de becuadro se extrae del estilo @code{vaticana}. El estilo de las alteraciones y de la armadura de la tonalidad se controlan a través de la propiedad @code{glyph-name-alist} de los -elementos gráficos @code{Accidental} y -@code{KeySignature}, respectivamente; p.ej.: +elementos gráficos @code{Accidental} y @code{KeySignature}, +respectivamente; p.ej.: @example \override Staff.Accidental.glyph-name-alist = @@ -882,45 +892,46 @@ Referencia de funcionamiento interno: @rinternals{KeySignature}. -@cindex alteraciones accidentales - - @node Alteraciones de anotación (musica ficta) @unnumberedsubsubsec Alteraciones de anotación (@emph{musica ficta}) @translationof Annotational accidentals (musica ficta) En la música europea de hasta aprox. 1600, se esperaba de los -cantantes que alterasen cromáticamente ciertas notas según su propia -iniciativa y de acuerdo a ciertas reglas. Esto recibe el nombre de -@notation{musica ficta}. En las transcripciones modernas, estas -alteraciones accidentales se imprimen normalmente encima de la nota. +cantantes que alterasen cromáticamente ciertas notas según su +propia iniciativa y de acuerdo a ciertas reglas. Esto recibe el +nombre de @notation{musica ficta}. En las transcripciones +modernas, estas alteraciones accidentales se imprimen normalmente +encima de la nota. @cindex alteraciones de la musica ficta @cindex musica ficta, alteraciones -Están contempladas estas alteraciones sugeridas, y se pueden activar -estableciendo @code{suggestAccidentals} al valor verdadero. +Están contempladas estas alteraciones sugeridas, y se pueden +activar estableciendo @code{suggestAccidentals} al valor +verdadero. @funindex suggestAccidentals -@lilypond[verbatim,relative=1] -fis gis -\set suggestAccidentals = ##t -ais bis +@lilypond[verbatim] +\relative { + fis' gis + \set suggestAccidentals = ##t + ais bis +} @end lilypond -Esto hará que se traten @emph{todas} las alteraciones siguientes como -@emph{musica ficta} hasta que se desactive con -@code{\set suggestAccidentals = ##f}. Una forma más práctica es usar +Esto hará que se traten @emph{todas} las alteraciones siguientes +como @emph{musica ficta} hasta que se desactive con @code{\set +suggestAccidentals = ##f}. Una forma más práctica es usar @code{\once \set suggestAccidentals = ##t}, que puede incluso definirse como una forma breve muy conveniente: @lilypond[quote,verbatim] ficta = { \once \set suggestAccidentals = ##t } -\score { \relative c'' +\score { \relative \new MensuralVoice { - \once \set suggestAccidentals = ##t - bes4 a2 g2 \ficta fis8 \ficta e! fis2 g1 + \once \set suggestAccidentals = ##t + bes'4 a2 g2 \ficta fis8 \ficta e! fis2 g1 } } @end lilypond @@ -938,13 +949,13 @@ Referencia de funcionamiento interno: @cindex Mensural ligatures @cindex White mensural ligatures -Las ligaduras mensurales blancas están contempladas de forma limitada. +Las ligaduras mensurales blancas están contempladas de forma +limitada. Para grabar ligaduras mensurales blancas, en el bloque layout o de diseño de página reemplace el grabador @code{Ligature_bracket_engraver} por el grabador -@code{Mensural_ligature_engraver} en el contexto -@code{Voice}: +@code{Mensural_ligature_engraver} en el contexto @code{Voice}: @example \layout @{ @@ -956,50 +967,40 @@ diseño de página reemplace el grabador @} @end example -No existe ningún lenguaje de entrada adicional para describir la forma -de una ligadura mensural blanca. Más bien la forma se determina -exclusivamente a partir de la altura y duración de las notas -comprendidas. Si bien este enfoque podría hacer que un usuario con -poca experiencia tardase un tiempo en acostumbrarse a él, tiene la -gran ventaja de que toda la información musical de la ligadura se -conoce internamente. Esto no se requiere solamente para una salida -MIDI correcta, sino que también permite la transcripción automática de -las ligaduras. - -En algunos lugares, dos notas consecutivas se pueden representar bien -como dos cuadrados, bien como un paralelogramo oblicuo (forma de -flexa). En tales casos la forma por omisión es dos cuadrados, pero -puede requerirse una flexa fijando la propiedad @code{ligature-flexa} -de la @emph{segunda} cabeza. La longitud de una flexa se puede fijar -mediante la propiedad @code{flexa-width} de la cabeza. +No existe ningún lenguaje de entrada adicional para describir la +forma de una ligadura mensural blanca. Más bien la forma se +determina exclusivamente a partir de la altura y duración de las +notas comprendidas. Si bien este enfoque podría hacer que un +usuario con poca experiencia tardase un tiempo en acostumbrarse a +él, tiene la gran ventaja de que toda la información musical de la +ligadura se conoce internamente. Esto no se requiere solamente +para una salida MIDI correcta, sino que también permite la +transcripción automática de las ligaduras. + +En algunos lugares, dos notas consecutivas se pueden representar +bien como dos cuadrados, bien como un paralelogramo oblicuo (forma +de flexa). En tales casos la forma por omisión es dos cuadrados, +pero puede requerirse una flexa fijando la propiedad +@code{ligature-flexa} de la @emph{segunda} cabeza. La longitud de +una flexa se puede fijar mediante la propiedad @code{flexa-width} +de la cabeza. Por ejemplo: -@c @example -@c \set Score.timing = ##f -@c \set Score.defaultBarType = "-" -@c \override NoteHead.style = #'neomensural -@c \override Staff.TimeSignature.style = #'neomensural -@c \clef "petrucci-g" -@c \[ c'\maxima g \] -@c \[ d\longa c\breve f e d \] -@c \[ c'\maxima d'\longa \] -@c \[ e'1 a g\breve \] -@c @end example @lilypond[quote,ragged-right,verbatim] \score { - \relative c' { + \relative { \set Score.timing = ##f \set Score.defaultBarType = "-" \override NoteHead.style = #'petrucci \override Staff.TimeSignature.style = #'mensural \clef "petrucci-g" - \[ c'\maxima g \] - \[ d\longa + \[ c''\maxima g \] + \[ d'\longa \override NoteHead.ligature-flexa = ##t \once \override NoteHead.flexa-width = #3.2 c\breve f e d \] - \[ c'\maxima d\longa \] + \[ c\maxima d\longa \] \[ e1 a, g\breve \] } \layout { @@ -1013,22 +1014,22 @@ Por ejemplo: @end lilypond Si no se sustituye el grabador @code{Ligature_bracket_engraver} -por el @code{Mensural_ligature_engraver}, la misma música se -transcribe de la siguiente manera: +por el @code{Mensural_ligature_engraver}, la misma música presenta +la siguiente apariencia: @lilypond[quote,ragged-right] -\relative c' { +\relative { \set Score.timing = ##f \set Score.defaultBarType = "-" \override NoteHead.style = #'petrucci \override Staff.TimeSignature.style = #'mensural \clef "petrucci-g" - \[ c'\maxima g \] - \[ d\longa + \[ c''\maxima g \] + \[ d'\longa \override NoteHead.ligature-flexa = ##t \once \override NoteHead.flexa-width = #3.2 c\breve f e d \] - \[ c'\maxima d\longa \] + \[ c\maxima d\longa \] \[ e1 a, g\breve \] } @end lilypond @@ -1042,8 +1043,9 @@ Referencia de la notación: @ref{Ligaduras}. @knownissues -El espaciado horizontal de las ligaduras es pobre. -Las alteraciones accidentales pueden colisionar con las notas previas. +El espaciado horizontal de las ligaduras puede ser algo pobre. +Las alteraciones accidentales pueden colisionar con las notas +previas. @node Tipografiado del canto gregoriano @@ -1061,14 +1063,15 @@ Las alteraciones accidentales pueden colisionar con las notas previas. @end menu Al componer tipográficamente una pieza en notación de canto -gregoriano, el grabador @code{Vaticana_ligature_engraver} selecciona -automáticamente la cabeza adecuada de las figuras, de manera que no es -necesario establecer explícitamente el estilo de las cabezas. A pesar -de ello se puede establecer el estilo de las cabezas, p.ej.: a -@code{vaticana_punctum} para producir neumas de punctum. De forma -similar, el grabador @code{Mensural_ligature_engraver} construye -ligaduras mensurales automáticamente. Consulte @ref{Ligaduras} para -ver cómo funcionan los grabadores de ligaduras. +gregoriano, el grabador @code{Vaticana_ligature_engraver} +selecciona automáticamente la cabeza adecuada de las figuras, de +manera que no es necesario establecer explícitamente el estilo de +las cabezas. A pesar de ello se puede establecer el estilo de las +cabezas, p.ej.: a @code{vaticana_punctum} para producir neumas de +punctum. De forma similar, el grabador +@code{Mensural_ligature_engraver} construye ligaduras mensurales +automáticamente. Consulte @ref{Ligaduras} para ver cómo funcionan +los grabadores de ligaduras. @seealso Glosario musical: @@ -1083,16 +1086,16 @@ Referencia de la notación: @unnumberedsubsubsec Contextos del canto gregoriano @translationof Gregorian chant contexts -@cindex VaticanaVoiceContext -@cindex VaticanaStaffContext +@cindex VaticanaVoice +@cindex VaticanaStaff -El contexto predefinido de voz @code{VaticanaVoiceContext} y el de -pauta @code{VaticanaStaffContext} se pueden utilizar para grabar una -pieza de canto gregoriano en el estilo de la Editio Vaticana. Estos +El contexto predefinido de voz @code{VaticanaVoice} y el de pauta +@code{VaticanaStaff} se pueden utilizar para grabar una pieza de +canto gregoriano en el estilo de la Editio Vaticana. Estos contextos establecen a unos valores iniciales adecuados todas las -propiedades relevantes de los contextos y de los objetos gráficos, de -forma que pueda inmediatamente comenzar a escribir el canto en sí, -como lo demuestra el siguiente fragmento: +propiedades relevantes de los contextos y de los objetos gráficos, +de forma que pueda inmediatamente comenzar a escribir el canto en +sí, como lo demuestra el siguiente fragmento: @lilypond[quote,ragged-right,verbatim] \include "gregorian.ly" @@ -1125,16 +1128,17 @@ como lo demuestra el siguiente fragmento: @cindex claves -La tabla siguiente muestra todas las claves gregorianas contempladas a -través de la instrucción @code{\clef}. Algunas de las claves usan el -mismo glifo, pero se diferencian solamente en la línea en que se -imprimen. En estos casos, para enumerar estas claves se usa un número -a continuación del nombre de la clave, contando desde la línea -inferior. Aún se puede forzar manualmente la composición tipográfica -de un glifo de clave sobre una línea arbitraria, como se describe en -@ref{Clave}. La nota que se imprime a la derecha junto a cada una de -las claves en la columna de los ejemplos, denota el Do central -(@code{c'}) respecto a dicha clave. +La tabla siguiente muestra todas las claves gregorianas +contempladas a través de la instrucción @code{\clef}. Algunas de +las claves usan el mismo glifo, pero se diferencian solamente en +la línea en que se imprimen. En estos casos, para enumerar estas +claves se usa un número a continuación del nombre de la clave, +contando desde la línea inferior. Aún se puede forzar manualmente +la composición tipográfica de un glifo de clave sobre una línea +arbitraria, como se describe en @ref{Clave}. La nota que se +imprime a la derecha junto a cada una de las claves en la columna +de los ejemplos, denota el Do central (@code{c'}) respecto a dicha +clave. @multitable @columnfractions .4 .4 .2 @item @@ -1150,14 +1154,14 @@ Clave de Do, estilo Editio Vaticana @code{vaticana-do1}, @code{vaticana-do2},@* @code{vaticana-do3} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'vaticana.punctum \clef "vaticana-do2" - c + c' @end lilypond @item @@ -1165,14 +1169,14 @@ Clave de Fa, estilo Editio Vaticana @tab @code{vaticana-fa1}, @code{vaticana-fa2} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'vaticana.punctum \clef "vaticana-fa2" - c + c' @end lilypond @item @@ -1181,14 +1185,14 @@ Clave de Do, estilo Editio Medicaea @code{medicaea-do1}, @code{medicaea-do2},@* @code{medicaea-do3} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'medicaea.punctum \clef "medicaea-do2" - c + c' @end lilypond @item @@ -1196,14 +1200,14 @@ Clave de Fa, estilo Editio Medicaea @tab @code{medicaea-fa1}, @code{medicaea-fa2} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'medicaea.punctum \clef "medicaea-fa2" - c + c' @end lilypond @item @@ -1212,14 +1216,14 @@ Clave de Do, estilo hufnagel @code{hufnagel-do1}, @code{hufnagel-do2},@* @code{hufnagel-do3} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'hufnagel.punctum \clef "hufnagel-do2" - c + c' @end lilypond @item @@ -1227,14 +1231,14 @@ Clave de Fa, estilo hufnagel @tab @code{hufnagel-fa1}, @code{hufnagel-fa2} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'hufnagel.punctum \clef "hufnagel-fa2" - c + c' @end lilypond @item @@ -1242,13 +1246,13 @@ Clave combinada de Do y Fa, estilo hufnagel @tab @code{hufnagel-do-fa} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'hufnagel.punctum \clef "hufnagel-do-fa" - c + c' @end lilypond @end multitable @@ -1267,7 +1271,8 @@ Referencia de la notación: @cindex accidentals @cindex key signature -Están disponibles las alteraciones de los tres estilos gregorianos: +Están disponibles las alteraciones de los tres estilos +gregorianos: @lilypond[quote,ragged-right,staffsize=26] \markup { @@ -1294,10 +1299,10 @@ contemplada, LilyPond cambia a un estilo diferente. @c @lilypondfile[verbatim,quote,texidoc,doctitle] @c {ancient-accidentals.ly} -El estilo de las alteraciones y las armaduras de tonalidad se controla -a través de la propiedad @code{glyph-name-alist} de los grobs (objetos -gráficos) @rinternals{Accidental} y @rinternals{KeySignature}, -respectivamente; p.ej.: +El estilo de las alteraciones y las armaduras de tonalidad se +controla a través de la propiedad @code{glyph-name-alist} de los +grobs (objetos gráficos) @rinternals{Accidental} y +@rinternals{KeySignature}, respectivamente; p.ej.: @example \override Staff.Accidental.glyph-name-alist = @@ -1331,20 +1336,21 @@ En la notación del canto gregoriano no existen silencios, sino @ref{Divisiones}. Una @emph{divisio} (en plural: @emph{divisiones}, que en latín -significa @q{división}) es un símbolo del contexto del pentagrama que -se usa para estructurar la música gregoriana en frases y secciones. -El significado musical de @emph{divisio minima}, @emph{divisio maior} -y @emph{divisio maxima} se podrían caracterizar como una pausa corta, -media y larga (respectivamente), algo así como las marcas de -respiración de @ref{Marcas de respiración}. El signo de -@emph{finalis} no sólo marca el final de un canto, sino que se usa -también con frecuencia dentro de un único canto antifonal o -responsorial para marcar el final de cada una de las secciones. +significa @q{división}) es un símbolo del contexto del pentagrama +que se usa para estructurar la música gregoriana en frases y +secciones. El significado musical de @emph{divisio minima}, +@emph{divisio maior} y @emph{divisio maxima} se podrían +caracterizar como una pausa corta, media y larga +(respectivamente), algo así como las marcas de respiración de +@ref{Marcas de respiración}. El signo de @emph{finalis} no sólo +marca el final de un canto, sino que se usa también con frecuencia +dentro de un único canto antifonal o responsorial para marcar el +final de cada una de las secciones. Para usar divisiones, incluya el archivo @file{gregorian.ly}. Contiene definiciones que podrá aplicar con tan sólo escribir -@code{\divisioMinima}, @code{\divisioMaior}, @code{\divisioMaxima} y -@code{\finalis} en los lugares adecuados de la entrada. Algunas +@code{\divisioMinima}, @code{\divisioMaior}, @code{\divisioMaxima} +y @code{\finalis} en los lugares adecuados de la entrada. Algunas ediciones usan @emph{virgula} o @emph{caesura} en vez de divisio minima. Por ello, @file{gregorian.ly} define también las instrucciones @code{\virgula} y @code{\caesura}. @@ -1414,10 +1420,11 @@ Archivos de inicio: @cindex articulaciones -Además de los signos de articulación estándar que se hallan descritos -en la sección @ref{Articulaciones y ornamentos}, se proveen signos de -articulación diseñados específicamente para utilizarlos con la -notación en el estilo de la @emph{Editio Vaticana}. +Además de los signos de articulación estándar que se hallan +descritos en la sección @ref{Articulaciones y ornamentos}, se +proveen signos de articulación diseñados específicamente para +utilizarlos con la notación en el estilo de la @emph{Editio +Vaticana}. @lilypond[quote,ragged-right,verbatim] \include "gregorian.ly" @@ -1451,23 +1458,24 @@ Referencia de funcionamiento interno: @rinternals{Script_engraver}. @knownissues -Ciertas articulaciones se colocan demasiado cerca verticalmente de las -cabezas de nota correspondientes. +Ciertas articulaciones se colocan demasiado cerca verticalmente de +las cabezas de nota correspondientes. @node Puntos de aumentación (morae) @unnumberedsubsubsec Puntos de aumentación (@emph{morae}) @translationof Augmentum dots (morae) -Los puntos de aumentación, llamados también @emph{morae}, se escriben -con la función musical @code{\augmentum}. Observe que -@code{\augmentum} está programado como una función musical unaria y no -como un prefijo de cabeza. Se aplica solamente a la expresión musical -que sigue inmediatamente. Esto es, @code{\augmentum \virga c} no -tendrá ningún efecto visible. En su lugar, escriba @code{\virga -\augmentum c} o @code{\augmentum @{\virga c@}}. Tenga en cuenta -también que puede escribir @code{\augmentum @{a g@}} como abreviatura -de @code{\augmentum a \augmentum g}. +Los puntos de aumentación, llamados también @emph{morae}, se +escriben con la función musical @code{\augmentum}. Observe que +@code{\augmentum} está programado como una función musical unaria +y no como un prefijo de cabeza. Se aplica solamente a la +expresión musical que sigue inmediatamente. Esto es, +@code{\augmentum \virga c} no tendrá ningún efecto visible. En su +lugar, escriba @code{\virga \augmentum c} o @code{\augmentum +@{\virga c@}}. Tenga en cuenta también que puede escribir +@code{\augmentum @{a g@}} como abreviatura de @code{\augmentum a +\augmentum g}. @lilypond[quote,ragged-right,verbatim] \include "gregorian.ly" @@ -1497,26 +1505,28 @@ Fragmentos de código: @cindex Square neumes ligatures @cindex Gregorian square neumes ligatures -La notación de neumas cuadrados gregorianos está contemplada de forma -limitada (siguiendo el estilo de la Editio Vaticana). El núcleo -principal del conjunto de las ligaduras ya se pueden tipografiar, pero -aún faltan aspectos esenciales para una composición tipográfica seria, -como (entre otros) la alineación horizontal de varias ligaduras, la -alineación de la letra y un correcto manejo de las alteraciones -accidentales. +La notación de neumas cuadrados gregorianos está contemplada de +forma limitada (siguiendo el estilo de la Editio Vaticana). El +núcleo principal del conjunto de las ligaduras ya se pueden +tipografiar, pero aún faltan aspectos esenciales para una +composición tipográfica seria, como (entre otros) la alineación +horizontal de varias ligaduras, la alineación de la letra y un +correcto manejo de las alteraciones accidentales. Se habilita el soporte de los neumas gregorianos por medio de la inclusión con @code{\include} del archivo @file{gregorian.ly} al principio del archivo. Esto hace que estén disponibles una cierta -cantidad de instrucciones adicionales para producir los símbolos de -los neumas que se usan en la notación de canto llano. +cantidad de instrucciones adicionales para producir los símbolos +de los neumas que se usan en la notación de canto llano. -Las cabezas de las notas se pueden @emph{modificar} y/o @emph{unir}. +Las cabezas de las notas se pueden @emph{modificar} y/o +@emph{unir}. @itemize -@item La forma de la cabeza -se puede modificar @emph{precediendo} el nombre de la nota con una -cualquiera de las instrucciones siguientes: +@item +La forma de la cabeza se puede modificar @emph{precediendo} el +nombre de la nota con una cualquiera de las instrucciones +siguientes: @funindex \virga @code{\virga}, @funindex \stropha @@ -1540,17 +1550,18 @@ cualquiera de las instrucciones siguientes: @funindex \linea @code{\linea}. -@item Las ligaduras hablando en propiedad, -(es decir, notas unidas), se producen escribiendo una de las -instrucciones de unión @code{\pes} o @code{\flexa}, para el movimiento -ascendente y descendente, respectivamente, @emph{intercaladas} entre -las notas que se han de unir. +@item +Las ligaduras hablando en propiedad, (es decir, notas unidas), se +producen escribiendo una de las instrucciones de unión @code{\pes} +o @code{\flexa}, para el movimiento ascendente y descendente, +respectivamente, @emph{intercaladas} entre las notas que se han de +unir. @end itemize Una nota sin modificaciones produce un @emph{punctum}. Todos los -demás neumas, incluso los neumas de una nota con forma distinta como -la @emph{virga}, se consideran en principio como ligaduras y por ello -se deben escribir dentro de @code{\[@dots{}\]}. +demás neumas, incluso los neumas de una nota con forma distinta +como la @emph{virga}, se consideran en principio como ligaduras y +por ello se deben escribir dentro de @code{\[@dots{}\]}. @noindent Neumas de una nota: @@ -1558,100 +1569,104 @@ Neumas de una nota: @itemize @item El @emph{punctum} es la forma básica de nota (en el estilo @emph{Vaticana}: un cuadrado con una ligera curvatura a modo de -excelencia tipográfica). Además del @emph{punctum} normal, están el -@emph{punctum inclinatum}, oblicuo, producido con el prefijo -@code{\inclinatum}. El @emph{punctum} normal se puede modificar con -@code{\cavum}, que produce una nota vacía, y @code{\linea}, que traza -líneas verticales a ambos lados de la nota. - -@item La @emph{virga} tiene una plica descendente en el lado derecho. Se -produce mediante el modificador @code{\virga}. +excelencia tipográfica). Además del @emph{punctum} normal, están +el @emph{punctum inclinatum}, oblicuo, producido con el prefijo +@code{\inclinatum}. El @emph{punctum} normal se puede modificar +con @code{\cavum}, que produce una nota vacía, y @code{\linea}, +que traza líneas verticales a ambos lados de la nota. + +@item La @emph{virga} tiene una plica descendente en el lado derecho. +Se produce mediante el modificador @code{\virga}. @end itemize @noindent Ligaduras -A diferencia de casi todos los otros sistemas de notación de neumas, -el aspecto tipográfico de las ligaduras no viene dictado directamente -por las instrucciones de la entrada, sino que sigue unas convenciones -que dependen del significado musical. Por ejemplo, una ligadura de -tres notas con la forma musical bajo-alto-bajo, como -@code{\[ a \pes b \flexa g \]}, produce un Torculus que consiste en -tres cabezas de Punctum, mientras que la forma alto-bajo-alto, como -@code{\[ a \flexa g \pes b \]}, produce un Porrectus con una forma de -flexa curvada y una sola cabeza de Punctum. No existe ninguna -instrucción para tipografiar explícitamente la forma de flexa curvada; -la decisión de cuándo tipografiar una forma de flexa curvada está -basada en la entrada musical. La idea de este enfoque es separar los -aspectos musicales de la entrada, del estilo de notación de la salida. -De esta forma, la misma entrada se puede reutilizar para tipografiar +A diferencia de casi todos los otros sistemas de notación de +neumas, el aspecto tipográfico de las ligaduras no viene dictado +directamente por las instrucciones de la entrada, sino que sigue +unas convenciones que dependen del significado musical. Por +ejemplo, una ligadura de tres notas con la forma musical +bajo-alto-bajo, como @code{\[ a \pes b \flexa g \]}, produce un +Torculus que consiste en tres cabezas de Punctum, mientras que la +forma alto-bajo-alto, como @code{\[ a \flexa g \pes b \]}, produce +un Porrectus con una forma de flexa curvada y una sola cabeza de +Punctum. No existe ninguna instrucción para tipografiar +explícitamente la forma de flexa curvada; la decisión de cuándo +tipografiar una forma de flexa curvada está basada en la entrada +musical. La idea de este enfoque es separar los aspectos +musicales de la entrada, del estilo de notación de la salida. De +esta forma, la misma entrada se puede reutilizar para tipografiar la misma música en un estilo diferente de notación de canto gregoriano. @noindent Neumas licuescentes -Otra categoría fundamental de notas en el canto gregoriano es la de -los llamados neumas licuescentes. Se utilizan bajo ciertas +Otra categoría fundamental de notas en el canto gregoriano es la +de los llamados neumas licuescentes. Se utilizan bajo ciertas circunstancias al final de una sílaba que acaba en una letra -@q{licuescente}, es decir, consonantes sonoras que pueden tener una -altura tonal, (nasales, l, r, v, j, y sus diptongos equivalentes). -Así, los neumas licuescentes nunca se utilizan aisladamente (aunque se -pueden producir algunos de ellos), y siempre están al final de una -ligadura. +@q{licuescente}, es decir, consonantes sonoras que pueden tener +una altura tonal, (nasales, l, r, v, j, y sus diptongos +equivalentes). Así, los neumas licuescentes nunca se utilizan +aisladamente (aunque se pueden producir algunos de ellos), y +siempre están al final de una ligadura. Los neumas licuescentes se representan gráficamente de dos formas distintas más o menos intercambiables: con una nota pequeña o -@q{girando} la nota principal hacia arriba o hacia abajo. La primera -forma se produce haciendo un @code{pes} o una @code{flexa} normales y -modificando la forma de la segunda nota: @code{\[ a \pes \deminutum b -\] }, mientras que la segunda se hace modificando la forma de un neuma -de una nota con @code{\auctum} y uno de los generadores de dirección -@code{\descendens} o @code{\ascendens}, p.ej. @code{ \[ \auctum -\descendens a \] }. +@q{girando} la nota principal hacia arriba o hacia abajo. La +primera forma se produce haciendo un @code{pes} o una @code{flexa} +normales y modificando la forma de la segunda nota: @code{\[ a +\pes \deminutum b \] }, mientras que la segunda se hace +modificando la forma de un neuma de una nota con @code{\auctum} y +uno de los generadores de dirección @code{\descendens} o +@code{\ascendens}, p.ej. @code{ \[ \auctum \descendens a \] }. @noindent Símbolos especiales Hay una tercera categoría de símbolos que se hace a partir de un -pequeño número de símbolos que tienen un significado especial (que, -por cierto, casi siempre se conocen sólo vagamente): el +pequeño número de símbolos que tienen un significado especial +(que, por cierto, casi siempre se conocen sólo vagamente): el @emph{quilisma}, el @emph{oriscus} y el @emph{strophicus}. Todos ellos se producen anteponiendo al nombre de la nota el modificador -correspondiente, @code{\quilisma}, @code{\oriscus} o @code{\stropha}. +correspondiente, @code{\quilisma}, @code{\oriscus} o +@code{\stropha}. Dentro de los delimitadores de ligadura @code{\[} y @code{\]}, se -pueden acumular prácticamente cualquier cantidad de cabezas de nota -para formar una sola ligadura, y los prefijos de cabeza como -@code{\pes}, @code{\flexa}, @code{\virga}, @code{\inclinatum}, etc. se -pueden mezclar libremente. El uso del conjunto de reglas que subyace -a la construcción de ligaduras en la tabla anterior está -consecuentemente extrapolada. De esta manera se pueden crear un -número infinito de ligaduras distintas. - -Observe que el uso de esos símbolos en la propia música sigue ciertas -reglas que LilyPond no comprueba. P.ej., el @emph{quilisma} siempre -es la nota intermedia de una ligadura ascendente, y suele caer sobre -un intervalo de semitono, pero es perfectamente posible, si bien -incorrecto, hacer un quilisma de una nota. - -Además de los símbolos de nota, el archivo @file{gregorian.ly} define -también las instrucciones @code{\versus}, @code{\responsum}, -@code{\ij}, @code{\iij}, @code{\IJ} y @code{\IIJ}, que producen los -caracteres correspondientes, p.ej. para utilizarlos en la letra, como -marcas de sección, etc. Estas instrucciones utilizan caracteres de -Unicode especiales y sólo funcionan si se usa una fuente tipográfica -que los contemple. - -La tabla siguiente muestra un conjunto limitado, pero representativo, -de ligaduras gregorianas, junto a los fragmentos de código que las -producen. La tabla está basada en la tabla de neumas extendidos del -segundo volumen del Antiphonale Romanum (@emph{Liber Hymnarius}), -publicado en 1983 por los monjes de Solesmes. La primera columna da -el nombre de la ligadura, con la forma principal en tipo negrita y las -formas licuescentes en cursiva. La tercera forma muestra el fragmento -de código que produce dicha ligadura, utilizando Sol, La y Si como -alturas de ejemplo. +pueden acumular prácticamente cualquier cantidad de cabezas de +nota para formar una sola ligadura, y los prefijos de cabeza como +@code{\pes}, @code{\flexa}, @code{\virga}, @code{\inclinatum}, +etc. se pueden mezclar libremente. El uso del conjunto de reglas +que subyace a la construcción de ligaduras en la tabla anterior +está consecuentemente extrapolada. De esta manera se pueden crear +un número infinito de ligaduras distintas. + +Observe que el uso de esos símbolos en la propia música sigue +ciertas reglas que LilyPond no comprueba. P.ej., el +@emph{quilisma} siempre es la nota intermedia de una ligadura +ascendente, y suele caer sobre un intervalo de semitono, pero es +perfectamente posible, si bien incorrecto, hacer un quilisma de +una nota. + +Además de los símbolos de nota, el archivo @file{gregorian.ly} +define también las instrucciones @code{\versus}, +@code{\responsum}, @code{\ij}, @code{\iij}, @code{\IJ} y +@code{\IIJ}, que producen los caracteres correspondientes, +p.ej. para utilizarlos en la letra, como marcas de sección, etc. +Estas instrucciones utilizan caracteres de Unicode especiales y +sólo funcionan si se usa una fuente tipográfica que los contemple. + +La tabla siguiente muestra un conjunto limitado, pero +representativo, de ligaduras gregorianas, junto a los fragmentos +de código que las producen. La tabla está basada en la tabla de +neumas extendidos del segundo volumen del Antiphonale Romanum +(@emph{Liber Hymnarius}), publicado en 1983 por los monjes de +Solesmes. La primera columna da el nombre de la ligadura, con la +forma principal en tipo negrita y las formas licuescentes en +cursiva. La tercera forma muestra el fragmento de código que +produce dicha ligadura, utilizando Sol, La y Si como alturas de +ejemplo. @b{Neumas de una nota} @@ -1671,9 +1686,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum - \[ b \] + \[ b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1685,9 +1700,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum - \[ \cavum b \] + \[ \cavum b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1699,9 +1714,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum - \[ \linea b \] + \[ \linea b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1714,9 +1729,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=2.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum Auctum Ascendens - \[ \auctum \ascendens b \] + \[ \auctum \ascendens b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1729,9 +1744,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=2.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum Auctum Descendens - \[ \auctum \descendens b \] + \[ \auctum \descendens b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1744,9 +1759,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum Inclinatum - \[ \inclinatum b \] + \[ \inclinatum b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1759,9 +1774,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=2.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum Inclinatum Auctum - \[ \inclinatum \auctum b \] + \[ \inclinatum \auctum b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1774,9 +1789,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum Inclinatum Parvum - \[ \inclinatum \deminutum b \] + \[ \inclinatum \deminutum b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1789,9 +1804,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Virga - \[ \virga b \] + \[ \virga b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1810,9 +1825,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Clivis vel Flexa - \[ b \flexa g \] + \[ b' \flexa g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1826,9 +1841,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=2.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Clivis Aucta Descendens - \[ b \flexa \auctum \descendens g \] + \[ b' \flexa \auctum \descendens g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1841,9 +1856,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=2.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Clivis Aucta Ascendens - \[ b \flexa \auctum \ascendens g \] + \[ b' \flexa \auctum \ascendens g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1856,9 +1871,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=2.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Cephalicus - \[ b \flexa \deminutum g \] + \[ b' \flexa \deminutum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1871,9 +1886,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Podatus vel Pes - \[ g \pes b \] + \[ g' \pes b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1886,9 +1901,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Auctus Descendens - \[ g \pes \auctum \descendens b \] + \[ g' \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1901,9 +1916,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Auctus Ascendens - \[ g \pes \auctum \ascendens b \] + \[ g' \pes \auctum \ascendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1916,9 +1931,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Epiphonus - \[ g \pes \deminutum b \] + \[ g' \pes \deminutum b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1931,9 +1946,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Initio Debilis - \[ \deminutum g \pes b \] + \[ \deminutum g' \pes b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1946,9 +1961,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Auctus Descendens Initio Debilis - \[ \deminutum g \pes \auctum \descendens b \] + \[ \deminutum g' \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1968,9 +1983,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus - \[ a \pes b \flexa g \] + \[ a' \pes b \flexa g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1983,9 +1998,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus Auctus Descendens - \[ a \pes b \flexa \auctum \descendens g \] + \[ a' \pes b \flexa \auctum \descendens g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1998,9 +2013,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus Deminutus - \[ a \pes b \flexa \deminutum g \] + \[ a' \pes b \flexa \deminutum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2013,9 +2028,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus Initio Debilis - \[ \deminutum a \pes b \flexa g \] + \[ \deminutum a' \pes b \flexa g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2028,9 +2043,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus Auctus Descendens Initio Debilis - \[ \deminutum a \pes b \flexa \auctum \descendens g \] + \[ \deminutum a' \pes b \flexa \auctum \descendens g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2043,9 +2058,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus Deminutus Initio Debilis - \[ \deminutum a \pes b \flexa \deminutum g \] + \[ \deminutum a' \pes b \flexa \deminutum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2058,9 +2073,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Porrectus - \[ a \flexa g \pes b \] + \[ a' \flexa g \pes b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2073,9 +2088,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Porrectus Auctus Descendens - \[ a \flexa g \pes \auctum \descendens b \] + \[ a' \flexa g \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2088,9 +2103,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Porrectus Deminutus - \[ a \flexa g \pes \deminutum b \] + \[ a' \flexa g \pes \deminutum b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2103,9 +2118,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Climacus - \[ \virga b \inclinatum a \inclinatum g \] + \[ \virga b' \inclinatum a \inclinatum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2118,9 +2133,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Climacus Auctus - \[ \virga b \inclinatum a \inclinatum \auctum g \] + \[ \virga b' \inclinatum a \inclinatum \auctum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2133,9 +2148,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Climacus Deminutus - \[ \virga b \inclinatum a \inclinatum \deminutum g \] + \[ \virga b' \inclinatum a \inclinatum \deminutum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2148,9 +2163,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Scandicus - \[ g \pes a \virga b \] + \[ g' \pes a \virga b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2163,9 +2178,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Scandicus Auctus Descendens - \[ g \pes a \pes \auctum \descendens b \] + \[ g' \pes a \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2178,9 +2193,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Scandicus Deminutus - \[ g \pes a \pes \deminutum b \] + \[ g' \pes a \pes \deminutum b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2200,9 +2215,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Quilisma - \[ g \pes \quilisma a \pes b \] + \[ g' \pes \quilisma a \pes b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2215,9 +2230,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Quilisma Pes Auctus Descendens - \[ g \quilisma a \pes \auctum \descendens b \] + \[ g' \quilisma a \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2230,9 +2245,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Oriscus - \[ \oriscus b \] + \[ \oriscus b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2245,9 +2260,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Quassus - \[ \oriscus g \pes \virga b \] + \[ \oriscus g' \pes \virga b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2260,9 +2275,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Quassus Auctus Descendens - \[ \oriscus g \pes \auctum \descendens b \] + \[ \oriscus g' \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2275,9 +2290,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Salicus - \[ g \oriscus a \pes \virga b \] + \[ g' \oriscus a \pes \virga b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2290,9 +2305,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Salicus Auctus Descendens - \[ g \oriscus a \pes \auctum \descendens b \] + \[ g' \oriscus a \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2305,9 +2320,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Stropha - \[ \stropha b \] + \[ \stropha b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2320,9 +2335,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Stropha Aucta - \[ \stropha \auctum b \] + \[ \stropha \auctum b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2335,9 +2350,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Bistropha - \[ \stropha b \stropha b \] + \[ \stropha b' \stropha b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2350,9 +2365,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Tristropha - \[ \stropha b \stropha b \stropha b \] + \[ \stropha b' \stropha b \stropha b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2365,9 +2380,9 @@ Formas @b{Básica} y @emph{Licuescente} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Trigonus - \[ \stropha b \stropha b \stropha a \] + \[ \stropha b' \stropha b \stropha a \] } \layout { \neumeDemoLayout } } @@ -2405,20 +2420,21 @@ Están contemplados los siguientes prefijos de cabeza: @endpredefined Se pueden acumular los prefijos de cabeza, aunque con ciertas -restricciones. Por ejemplo, se pueden aplicar @code{\descendens} o -@code{\ascendens} a una cabeza, pero no los dos a la misma cabeza. +restricciones. Por ejemplo, se pueden aplicar @code{\descendens} +o @code{\ascendens} a una cabeza, pero no los dos a la misma +cabeza. @funindex \pes @funindex \flexa -Se pueden ligar dos cabezas adyacentes con las instrucciones infijas -@code{\pes} y @code{\flexa} para una línea melódica ascendente y -descendente, respectivamente. +Se pueden ligar dos cabezas adyacentes con las instrucciones +infijas @code{\pes} y @code{\flexa} para una línea melódica +ascendente y descendente, respectivamente. @funindex \augmentum -Utilice la función musical unaria @code{\augmentum} para añadir puntos -de augmentum. +Utilice la función musical unaria @code{\augmentum} para añadir +puntos de augmentum. @seealso Glosario musical: @@ -2431,14 +2447,14 @@ Referencia de la notación: @knownissues Cuando aparece un punto de @code{\augmentum} al final de la última -pauta dentro de una ligadura, a veces se posiciona defectuosamente en -el sentido vertical. Para rodear el problema, escriba una nota +pauta dentro de una ligadura, a veces se posiciona defectuosamente +en el sentido vertical. Para rodear el problema, escriba una nota adicional de salto (p.ej. @code{s8}) como última nota de la pauta. -@code{\augmentum} debería estar implementado como un prefijo de cabeza -en vez de una función musical unaria, de forma que @code{\augmentum} -se pudiera entremezclar con los prefijos de cabeza en un orden -arbitrario. +@code{\augmentum} debería estar implementado como un prefijo de +cabeza en vez de una función musical unaria, de forma que +@code{\augmentum} se pudiera entremezclar con los prefijos de +cabeza en un orden arbitrario. @node Tipografiado del canto kievano en notación cuadrada @subsection Tipografiado del canto kievano en notación cuadrada @@ -2457,17 +2473,26 @@ arbitrario. @unnumberedsubsubsec Contextos del canto kievano @translationof Kievan contexts -@cindex KievanVoiceContext -@cindex KievanStaffContext +@cindex KievanVoice +@cindex KievanStaff De la misma manera que con las notaciones mensural y gregoriana, pueden usarse los contextos predefinidos @code{KievanVoice} y -@code{KievanStaff} para tipografiar una pieza en notación cuadrada. -Estos contextos inician todas las propiedades de contexto necesarias a -sus valores adecuados, de manera que pueda ponerse manos a la obra -inmediatamente con la introducción del propio canto: +@code{KievanStaff} para tipografiar una pieza en notación +cuadrada. Estos contextos inician todas las propiedades de +contexto necesarias a sus valores adecuados, de manera que pueda +ponerse manos a la obra inmediatamente con la introducción del +propio canto: @lilypond[quote,ragged-right,verbatim] +% Font settings for Cyrillic +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + )) +} + \score { << \new KievanVoice = "melody" \relative c' { @@ -2487,12 +2512,13 @@ Glosario musical: @rglos{kievan notation}. @knownissues -LilyPond contempla la notación del canto kievano en el estilo sinodal, -tal y como se usa en los cantorales impresos por el Sacro Sínodo Ruso -en la década de 1910 y recientemenre reimpreso por la Casa de -Publicaciones del Patriarcado de Moscú. LilyPond no contempla las -formas anteriores (menos corrientes) de notación kievana que se usaban -en Galitzia para la notación del canto llano ruteno. +LilyPond contempla la notación del canto kievano en el estilo +sinodal, tal y como se usa en los cantorales impresos por el Sacro +Sínodo Ruso en la década de 1910 y recientemenre reimpreso por la +Casa de Publicaciones del Patriarcado de Moscú. LilyPond no +contempla las formas anteriores (menos corrientes) de notación +kievana que se usaban en Galitzia para la notación del canto llano +ruteno. @node Claves del canto kievano @unnumberedsubsubsec Claves del canto kievano @@ -2502,10 +2528,10 @@ en Galitzia para la notación del canto llano ruteno. En la notación kievana solamente se utiliza una clave (la clave Tse-fa-ut). Se utiliza para indicar la posición del Do: -@lilypond[quote,relative=1,notime,verbatim] +@lilypond[quote,fragment,notime,verbatim] \clef "kievan-do" \kievanOn - c + c' @end lilypond @seealso @@ -2522,21 +2548,22 @@ Referencia de la notación: @cindex cabezas de nota antiguas -Para la notación cuadrada del canto kievano, debe escogerse el estilo -apropiado para la forma de la cabeza de las notas y se deben suprimir -los corchetes y las plicas. Esto se consigue mediante una llamada a -la función @code{\kievanOn}, que establece las propiedades adecuadas -para la cabeza, plica y corchete de las notas. Una vez que las notas -de estilo kievano ya no se necesiten, pueden revertirse estas -propiedades llamando a la función @code{\kievanOff}. - -La nota final del canto kievano, que suele ir al final de una pieza -musical, puede seleccionarse estableciendo la duración al valor -@code{\longa}. La marca kievana de recitativo, utilizada para indicar -la entonación de varias sílabas sobre una sola nota, se puede -seleccionar estableciendo la duración al valor @code{\breve}. El -siguiente ejemplo muestra las diversas formas de la cabeza de las -notas del canto kievano: +Para la notación cuadrada del canto kievano, debe escogerse el +estilo apropiado para la forma de la cabeza de las notas y se +deben suprimir los corchetes y las plicas. Esto se consigue +mediante una llamada a la función @code{\kievanOn}, que establece +las propiedades adecuadas para la cabeza, plica y corchete de las +notas. Una vez que las notas de estilo kievano ya no se +necesiten, pueden revertirse estas propiedades llamando a la +función @code{\kievanOff}. + +La nota final del canto kievano, que suele ir al final de una +pieza musical, puede seleccionarse estableciendo la duración al +valor @code{\longa}. La marca kievana de recitativo, utilizada +para indicar la entonación de varias sílabas sobre una sola nota, +se puede seleccionar estableciendo la duración al valor +@code{\breve}. El siguiente ejemplo muestra las diversas formas +de la cabeza de las notas del canto kievano: @lilypond[quote,fragment,ragged-right,verbatim] \autoBeamOff @@ -2556,12 +2583,12 @@ Referencia de la notación: @ref{Estilos de cabezas de nota}. @knownissues -LilyPond determina de forma automática si debe trazarse la forma de -una nota con la plica hacia arriba o hacia abajo. Sin embargo, cuando -se está tipografiando un canto en notación cuadrada, es preceptivo que -las plicas estén orientadas en la misma dirección dentro de un -melisma. Esto puede hacerse manualmente fijando la propiedad -@code{direction} del objeto @code{Stem}. +LilyPond determina de forma automática si debe trazarse la forma +de una nota con la plica hacia arriba o hacia abajo. Sin embargo, +cuando se está tipografiando un canto en notación cuadrada, es +preceptivo que las plicas estén orientadas en la misma dirección +dentro de un melisma. Esto puede hacerse manualmente fijando la +propiedad @code{direction} del objeto @code{Stem}. @node Alteraciones accidentales del canto kievano @unnumberedsubsubsec Alteraciones accidentales del canto kievano @@ -2572,16 +2599,17 @@ melisma. Esto puede hacerse manualmente fijando la propiedad El estilo @code{kievan} para las alteraciones accidentales se selecciona con la propiedad @code{glyph-name-alist} del grob @code{Accidental}. El estilo @code{kievan} provee unos signos de -sostenido y de bemol diferentes del estilo predeterminado. No esiste -el becuadro en la notación kievana. El símbolo del sostenido no se -utiliza en la música sinodal pero puede aparecer en manuscritos más -antiguos. Se ha incluido principalmente a efectos de compatibilidad. +sostenido y de bemol diferentes del estilo predeterminado. No +esiste el becuadro en la notación kievana. El símbolo del +sostenido no se utiliza en la música sinodal pero puede aparecer +en manuscritos más antiguos. Se ha incluido principalmente a +efectos de compatibilidad. -@lilypond[quote,relative=1,notime,verbatim] +@lilypond[quote,fragment,notime,verbatim] \clef "kievan-do" \override Accidental.glyph-name-alist = #alteration-kievan-glyph-name-alist -bes' dis, +bes' dis' @end lilypond @seealso @@ -2598,14 +2626,14 @@ Referencia de la notación: @unnumberedsubsubsec Líneas divisorias del canto kievano @translationof Kievan bar line -Normalmente se coloca una figura decorativa al final de una pieza de -notación kievana, que puede denominarse como «doble barra final del -canto kievano». Se puede invocar como @code{\bar "k"}. +Normalmente se coloca una figura decorativa al final de una pieza +de notación kievana, que puede denominarse como «doble barra final +del canto kievano». Se puede invocar como @code{\bar "k"}. -@lilypond[quote,relative=1,notime,verbatim] +@lilypond[quote,fragment,notime,verbatim] \kievanOn \clef "kievan-do" - c \bar "k" + c' \bar "k" @end lilypond @seealso @@ -2651,6 +2679,14 @@ El ejemplo siguiente muestra el uso de las ligaduras del canto kievano: @lilypond[quote,ragged-right,verbatim] +% Font settings for Cyrillic +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + )) +} + \score { << \new KievanVoice = "melody" \relative c' { @@ -2689,15 +2725,15 @@ El espaciado horizontal de las ligaduras es mediocre. @end menu El trabajo con música antigua implica con frecuencia tareas -adicionales que difieren considerablemente de la notación moderna para -la que se diseñó LilyPond. En el resto de esta sección se perfilan -unos cuantos escenarios típicos, con sugerencias de soluciones. Entre -ellos están los siguientes: +adicionales que difieren considerablemente de la notación moderna +para la que se diseñó LilyPond. En el resto de esta sección se +perfilan unos cuantos escenarios típicos, con sugerencias de +soluciones. Entre ellos están los siguientes: @itemize @item cómo hacer incipits -(o sea, material a modo de prefacio que indica cómo era el original) a -las transcripciones modernas de música mensural; +(o sea, material a modo de prefacio que indica cómo era el +original) a las transcripciones modernas de música mensural; @item cómo conseguir el diseño @emph{Mensurstriche} que se usa con frecuencia para las transcripciones modernas de música polifónica; @@ -2709,8 +2745,45 @@ polifónica; @node Incipits @unnumberedsubsubsec Incipits @translationof Incipits +@funindex \incipit +@cindex incipits, añadir + +Al transcribir música mensural a la notación moderna, es costumbre +poner una indicación de la forma en que aparecían en la versión +original los silencios y la nota o notas iniciales (incluso con +las claves originales). Esto recibe el nombre de @emph{incipit}. +La instrucción @code{\incipit} usa el valor de @code{indent} del +pentagrama principal para fijar el espacio horizontal que ocupa el +incipit, y @code{incipit-width} para establecer la anchura del +pentagrama del propio incipit. + +@lilypond[verbatim,quote,ragged-right] +\score { + \new Staff << + \new Voice = Tenor { + \set Staff.instrumentName = #"Tenor" + \override Staff.InstrumentName.self-alignment-X = #RIGHT + \incipit { \clef "mensural-c4" \key f \major r\breve r1 c'1 } + \clef "treble_8" + \key f \major + R1 r2 c'2 | + a4. c'8 + } + \new Lyrics \lyricsto Tenor { Cyn -- thia your } + >> + \layout + { + indent = 5\cm + incipit-width = 3\cm + } +} +@end lilypond -Continuará... +@knownissues +Observe que se debe configurar el contenido de +@code{instrumentName} dentro de la música, para que aparezca el +incipit. Si no quiere que aparezca ningún nombre para el +instrumento, utilice @code{\set Staff.instrumentName = #""}. @c @seealso @c ... and reference to other sections ... @@ -2721,12 +2794,13 @@ Continuará... @translationof Mensurstriche layout @emph{Mensurstriche} (@q{líneas de mensuración}) es el término -aceptado para las barras de compás que se trazan entre los pentagramas -de un sistema pero no dentro de los propios pentagramas. Es una forma -común de preservar el aspecto visual de las duraciones del original, -es decir, sin tener que dividir las notas sincopadas en las barras de -compás, y al mismo tiempo ofrecer la ayuda orientativa que -proporcionan las barras de compás. +aceptado para las barras de compás que se trazan entre los +pentagramas de un sistema pero no dentro de los propios +pentagramas. Es una forma común de preservar el aspecto visual de +las duraciones del original, es decir, sin tener que dividir las +notas sincopadas en las barras de compás, y al mismo tiempo +ofrecer la ayuda orientativa que proporcionan las barras de +compás. @lilypondfile[verbatim,quote,texidoc] @@ -2757,40 +2831,34 @@ el grabador @code{Stem_engraver} del contexto de voz: @} @end example -Sin embargo, en ciertos estilos de transcripción, se usan plicas de -forma ocasional, por ejemplo para indicar la transición a partir de un -recitativo monotónico a un gesto melódico fijo. En estos casos -podemos usar bien @code{\hide Stem} o bien -@code{\override Stem.length = #0}, y restaurar la plica cuando se -necesite con el correspondiente @code{\once \override Stem.transparent = ##f} (véase el ejemplo de abajo). - @b{Compás}. Para el canto no medido, existen diversas alternativas. -Se puede eliminar el grabador Time_signature_engraver del contexto de -Staff sin ningún efecto secundario negativo. La alternativa, que es -hacer transparente la indicación de compás, deja un espacio en blanco -en la partitura, pues la indicación invisible sigue ocupando un -espacio. +Se puede eliminar el grabador Time_signature_engraver del contexto +de Staff sin ningún efecto secundario negativo. La alternativa, +que es hacer transparente la indicación de compás, deja un espacio +en blanco en la partitura, pues la indicación invisible sigue +ocupando un espacio. -En muchos casos da un buen resultado @code{\set Score.timing = ##f}. -Otra alternativa es utilizar @code{\cadenzaOn} y @code{\cadenzaOff}. +En muchos casos da un buen resultado @code{\set Score.timing = +##f}. Otra alternativa es utilizar @code{\cadenzaOn} y +@code{\cadenzaOff}. Para quitar las barras de compás, el enfoque radical consiste en retirar (mediante la instrucción @code{\remove}) el grabador -Bar_engraver del contexto de pentagrama Staff. Una vez más, en vez de -ello podemos usar @code{\hide BarLine} si se -necesita ocasionalmente una barra de compás. +Bar_engraver del contexto de pentagrama Staff. Una vez más, en +vez de ello podemos usar @code{\hide BarLine} si se necesita +ocasionalmente una barra de compás. -Un tipo de transcripción muy común es el canto de recitativo, en el -que la nota repetida se indica con una breve. Se puede tratar el -texto del tono de recitativo de dos maneras. Podemos ponerlo como una -sola sílaba alineada por la izquierda: +Un tipo de transcripción muy común es el canto de recitativo, en +el que la nota repetida se indica con una breve. Se puede tratar +el texto del tono de recitativo de dos maneras. Podemos ponerlo +como una sola sílaba alineada por la izquierda: @lilypond[verbatim,ragged-right] \include "gregorian.ly" -chant = \relative c' { +chant = \relative { \clef "G_8" - c\breve c4 b4 a c2 c4 \divisioMaior + c'\breve c4 b4 a c2 c4 \divisioMaior c\breve c4 c f, f \finalis } @@ -2810,26 +2878,38 @@ verba = \lyricmode { \Staff \remove "Time_signature_engraver" \remove "Bar_engraver" - \hide Stem + } + \context { + \Voice + \remove "Stem_engraver" } } } @end lilypond -Esto funciona bien en la medida en que el texto no comprenda un salto -de línea. Si es el caso, una alternativa sería añadir notas ocultas a -la partitura, en combinación con cambios en la visibilidad de las -plicas: +Esto funciona bien en la medida en que el texto no comprenda un +salto de línea. Si es el caso, una alternativa sería añadir notas +ocultas a la partitura, en combinación con cambios en la +visibilidad de las plicas: +En ciertos estilos de transcripción, se usan plicas de forma +ocasional, por ejemplo para indicar la transición a partir de un +recitativo monotónico a un gesto melódico fijo. En estos casos +podemos usar bien @code{\hide Stem} o bien @code{\override +Stem.length = #0} en lugar de eliminar el grabador +@code{Stem_engraver} con @code{\remove}, y restaurar la plica +cuando sea necesario, con el correspondiente @code{\undo \hide +Stem}. @lilypond[verbatim,ragged-right] \include "gregorian.ly" -chant = \relative c' { +chant = \relative { \clef "G_8" \set Score.timing = ##f - c\breve \hide NoteHead c c c c c + \hide Stem + c'\breve \hide NoteHead c c c c c \undo \hide NoteHead - \override Stem.transparent = ##f \stemUp c4 b4 a + \undo \hide Stem \stemUp c4 b4 a \hide Stem c2 c4 \divisioMaior c\breve \hide NoteHead c c c c c c c \undo \hide NoteHead c4 c f, f \finalis @@ -2850,37 +2930,37 @@ verba = \lyricmode { \Staff \remove "Time_signature_engraver" \hide BarLine - \hide Stem } } } @end lilypond Otra situación común es la transcripción de cantos neumáticos o -melismáticos, es decir, cantos con un número variable de notas en cada -sílaba. En este caso, podemos establecer los grupos de sílabas -claramente separados, normalmente también las subdivisiones de un -melisma mayor. Una forma de conseguirlo es usar un @code{\time} fijo, -p.ej. 1/4, y dejar que cada sílaba o grupo de notas llene uno de esos -compases, con la ayuda de grupos de valoración especial o duraciones -más breves. Si las líneas divisorias y todas las demás indicaciones -rítmicas se hacen transparentes, y el espacio que rodea las líneas -divisorias se aumenta, ello proporciona una aceptable representación -del original, en notación moderna. +melismáticos, es decir, cantos con un número variable de notas en +cada sílaba. En este caso, podemos establecer los grupos de +sílabas claramente separados, normalmente también las +subdivisiones de un melisma mayor. Una forma de conseguirlo es +usar un @code{\time} fijo, p.ej. 1/4, y dejar que cada sílaba o +grupo de notas llene uno de esos compases, con la ayuda de grupos +de valoración especial o duraciones más breves. Si las líneas +divisorias y todas las demás indicaciones rítmicas se hacen +transparentes, y el espacio que rodea las líneas divisorias se +aumenta, ello proporciona una aceptable representación del +original, en notación moderna. Para evitar que las sílabas de distinta anchura (como @qq{-ri} y @qq{-rum}) dispongan los grupos de notas de las sílabas de forma -irregular, se puede ajustar la propiedad @code{'X-extent} del objeto -@code{LyricText} a un valor fijo. Otra forma más engorrosa sería -añadir las sílabas como elementos de @code{\markup}. Si se necesitan -más ajustes posteriormente, esto se puede hacer fácilmente con -@q{notas} @code{s}. +irregular, se puede ajustar la propiedad @code{'X-extent} del +objeto @code{LyricText} a un valor fijo. Otra forma más engorrosa +sería añadir las sílabas como elementos de @code{\markup}. Si se +necesitan más ajustes posteriormente, esto se puede hacer +fácilmente con @q{notas} @code{s}. @lilypond[verbatim,quote] -spiritus = \relative c' { +spiritus = \relative { \time 1/4 \override Lyrics.LyricText.X-extent = #'(0 . 3) - d4 \tuplet 3/2 { f8 a g } g a a4 g f8 e + d'4 \tuplet 3/2 { f8 a g } g a a4 g f8 e d4 f8 g g8 d f g a g f4 g8 a a4 s \tuplet 3/2 { g8 f d } e f g a g4 } @@ -2919,9 +2999,8 @@ spirLyr = \lyricmode { @unnumberedsubsubsec Antigua y moderna desde la misma fuente @translationof Ancient and modern from one source -@c TODO Add text -@c Here among others the snippets about reducing note length -Continuará... +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{using-tags-to-produce-mensural-and-modern-music-from-the-same-source.ly} @c @seealso @c ... and reference to other sections ... @@ -2939,7 +3018,7 @@ Continuará... @c try Till Rettig @c Add example of white note heads: @c In the french baroque some composers used white note heads in slow pieces, -@c mainly in 3/2-time. A quarter looks there like a eighth with a white +@c mainly in 3/2-time. A quarter looks there like an eighth with a white @c note head. (Franz-Rudolf Kuhnen) @c TODO Add example of this: @@ -2954,4 +3033,3 @@ Continuará... @c @seealso @c ... and reference to other sections ... - diff --git a/Documentation/es/notation/changing-defaults.itely b/Documentation/es/notation/changing-defaults.itely index 040403915e..a90010a8bb 100644 --- a/Documentation/es/notation/changing-defaults.itely +++ b/Documentation/es/notation/changing-defaults.itely @@ -1,48 +1,51 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore -Translation of GIT committish: a43fe59b0205af99f84532935b103d0c064b4526 +Translation of GIT committish: 4299c96f609f79426a181ffed107d17fa6e1fdbd When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.22" @node Cambiar los valores por omisión @chapter Cambiar los valores por omisión @translationof Changing defaults -El objetivo del diseño de LilyPond es proporcionar la más alta calidad -de los resultados, de forma predeterminada. A pesar de ello, podría -tener que cambiar este resultado predeterminado. La disposición sobre -el papel se controla a través de un amplio número de @q{botones e -interruptores} llamados en su conjunto @q{propiedades}. En el Manual -de aprendizaje podemos encontrar una introducción en forma de tutorial -al acceso y modificación de estas propiedades, véase -@rlearning{Trucar la salida}. Éste debería leerse en primer lugar. -Este capítulo cubre un terreno similar, pero con un estilo más -adecuado para un manual de referencia. +El objetivo del diseño de LilyPond es proporcionar la más alta +calidad de los resultados, de forma predeterminada. A pesar de +ello, podría tener que cambiar este resultado predeterminado. La +disposición sobre el papel se controla a través de un amplio +número de @q{botones e interruptores} llamados en su conjunto +@q{propiedades}. En el Manual de aprendizaje podemos encontrar +una introducción en forma de tutorial al acceso y modificación de +estas propiedades, véase @rlearning{Trucar la salida}. Éste +debería leerse en primer lugar. Este capítulo cubre un terreno +similar, pero con un estilo más adecuado para un manual de +referencia. @cindex Referencia de funcionamiento interno -La descripción definitiva de los controles que están disponibles para -su ajuste fino están en un documento aparte: la -@rinternalsnamed{Top,Referencia de funcionamiento interno}. -Dicho manual relaciona todas -las variables, funciones y opciones que se encuentran disponibles en -LilyPond. Está escrito como un documento HTML, que se puede encontrar +La descripción definitiva de los controles que están disponibles +para su ajuste fino están en un documento aparte: la +@rinternalsnamed{Top,Referencia de funcionamiento interno}. Dicho +manual relaciona todas las variables, funciones y opciones que se +encuentran disponibles en LilyPond. Está escrito como un +documento HTML, que se puede encontrar @c leave the @uref as one long line. @uref{http://@/lilypond@/.org/@/doc/@/stable/@/Documentation/@/internals/,en@tie{}línea}, -pero que también va incluido en el paquete de la documentación de LilyPond. +pero que también va incluido en el paquete de la documentación de +LilyPond. Internamente, LilyPond utiliza el lenguaje Scheme (un dialecto de LISP) para aportar la infraestructura. La sobreescritura de las -decisiones de disposición da acceso efectivo a las interioridades del -programa, lo que requiere código de Scheme como entrada. Los -elementos de Scheme se inauguran dentro de un archivo @file{.ly} con -el símbolo de cuadradillo@tie{}@code{#}.@footnote{@rextend{Tutorial de Scheme} +decisiones de disposición da acceso efectivo a las interioridades +del programa, lo que requiere código de Scheme como entrada. Los +elementos de Scheme se inauguran dentro de un archivo @file{.ly} +con el símbolo de +cuadradillo@tie{}@code{#}.@footnote{@rextend{Tutorial de Scheme} contiene un breve tutorial sobre la introducción de números, listas, cadenas y símbolos en Scheme.} @@ -159,10 +162,11 @@ Archivos instalados: @translationof Score - the master of all contexts Este es el contexto de notación del nivel más alto. Ningún otro -contexto puede contener a un contexto Score. De forma predeterminada, -el contexto Score maneja la administración de las indicaciones de -compás y se asegura de que ciertos elementos como claves, compases y -armaduras están siempre alineados entre los distintos pentagramas. +contexto puede contener a un contexto Score. De forma +predeterminada, el contexto Score maneja la administración de las +indicaciones de compás y se asegura de que ciertos elementos como +claves, compases y armaduras están siempre alineados entre los +distintos pentagramas. Se crea implícitamente una instancia del contexto Score cuando se procesa un bloque @code{\score @{@dots{}@}}. @@ -174,27 +178,27 @@ procesa un bloque @code{\score @{@dots{}@}}. @strong{@emph{StaffGroup}} -Agrupa pentagramas y añade un corchete en la parte izquierda, formando -un grupo. Las líneas divisorias de los pentagramas contenidos se -conectan verticalmente. @code{StaffGroup} sólo consiste en una -colección de pentagramas, con un corchete delante y líneas divisorias -de arriba a abajo. +Agrupa pentagramas y añade un corchete en la parte izquierda, +formando un grupo. Las líneas divisorias de los pentagramas +contenidos se conectan verticalmente. @code{StaffGroup} sólo +consiste en una colección de pentagramas, con un corchete delante +y líneas divisorias de arriba a abajo. @strong{@emph{ChoirStaff}} -Idéntico a @code{StaffGroup} excepto que las barras de compás de los -pentagramas contenidos no se conectan verticalmente. +Idéntico a @code{StaffGroup} excepto que las barras de compás de +los pentagramas contenidos no se conectan verticalmente. @strong{@emph{GrandStaff}} Un grupo de pentagramas, con una llave en la parte izquierda que -abarca el grupo. Las barras de compás de los pentagramas contenidos -se conectan verticalmente. +abarca el grupo. Las barras de compás de los pentagramas +contenidos se conectan verticalmente. @strong{@emph{PianoStaff}} -Igual que @code{GrandStaff}, pero contempla la posibilidad de poner el -nombre del instrumento a la izquierda del sistema. +Igual que @code{GrandStaff}, pero contempla la posibilidad de +poner el nombre del instrumento a la izquierda del sistema. @node Contextos de nivel intermedio. Pentagramas @@ -208,10 +212,9 @@ accidentales. Puede contener contextos de @code{Voice}. @strong{@emph{RhythmicStaff}} -Como @code{Staff}, pero para imprimir ritmos. Al imprimir -se ignoran las alturas de las notas; las notas se imprimen -sobre una línea. La salida de MIDI conserva las alturas -sin modificación. +Como @code{Staff}, pero para imprimir ritmos. Al imprimir se +ignoran las alturas de las notas; las notas se imprimen sobre una +línea. La salida de MIDI conserva las alturas sin modificación. @strong{@emph{TabStaff}} @@ -256,13 +259,13 @@ voces en el mismo pentagrama. @strong{@emph{VaticanaVoice}} -Lo mismo que @code{Voice}, excepto que está diseñado para tipografiar -piezas en estilo gregoriano. +Lo mismo que @code{Voice}, excepto que está diseñado para +tipografiar piezas en estilo gregoriano. @strong{@emph{MensuralVoice}} -Lo mismo que @code{Voice}, con modificaciones para el tipografiado de -piezas en estilo mensural. +Lo mismo que @code{Voice}, con modificaciones para el tipografiado +de piezas en estilo mensural. @strong{@emph{Lyrics}} @@ -275,8 +278,8 @@ El contexto de voz utilizado en una pauta de percusión. @strong{@emph{FiguredBass}} -El contexto en que los objetos @code{BassFigure} se crean a partir de -la entrada escrita en el modo @code{\figuremode}. +El contexto en que los objetos @code{BassFigure} se crean a partir +de la entrada escrita en el modo @code{\figuremode}. @strong{@emph{TabVoice}} @@ -329,14 +332,14 @@ grabadores y reproductores dentro de este contexto. El prefijo @code{\new} sin ningún nombre se usa con frecuencia para crear partituras con muchos pentagramas: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - \new Staff { + \new Staff \relative { % leave the Voice context to be created implicitly - c4 c + c''4 c } - \new Staff { - d4 d + \new Staff \relative { + d''4 d } >> @end lilypond @@ -344,18 +347,16 @@ para crear partituras con muchos pentagramas: @noindent y para introducir varias voces dentro de un solo pentagrama: -@lilypond[quote,verbatim,relative=2] -<< - \new Staff << - \new Voice { - \voiceOne - c8 c c4 c c - } - \new Voice { - \voiceTwo - g4 g g g - } - >> +@lilypond[quote,verbatim] +\new Staff << + \new Voice \relative { + \voiceOne + c''8 c c4 c c + } + \new Voice \relative { + \voiceTwo + g'4 g g g + } >> @end lilypond @@ -371,18 +372,16 @@ la acción que se realiza: @code{\new} con un nombre o sin él, siempre crea un contexto nuevo y distinto, incluso si ya existe un contexto con el mismo nombre: -@lilypond[quote,verbatim,relative=2] -<< - \new Staff << - \new Voice = "A" { - \voiceOne - c8 c c4 c c - } - \new Voice = "A" { - \voiceTwo - g4 g g g - } - >> +@lilypond[quote,verbatim] +\new Staff << + \new Voice = "A" \relative { + \voiceOne + c''8 c c4 c c + } + \new Voice = "A" \relative { + \voiceTwo + g'4 g g g + } >> @end lilypond @@ -413,13 +412,13 @@ válidas culaquiera de las dos formas siguientes: % musical content \context Voice = "one" { - \relative c'' { - c4 c c c + \relative { + c''4 c c c } } \context Voice = "two" { - \relative c'' { - g8 g g4 g g + \relative { + g'8 g g4 g g } } >> @@ -441,13 +440,13 @@ válidas culaquiera de las dos formas siguientes: % musical content \context Voice = "one" { - \relative c'' { - c4 c c c + \relative { + c''4 c c c } } \context Voice = "two" { - \relative c'' { - g8 g g4 g g + \relative { + g'8 g g4 g g } } >> @@ -469,8 +468,8 @@ para establecer el contexto en que se ejecuta un procedimiento de Scheme especificado con @code{\applyContext}: @example -\new Staff \relative c' @{ - c1 +\new Staff \relative @{ + c'1 \context Timing \applyContext #(lambda (ctx) (newline) @@ -496,12 +495,14 @@ consulte @ref{Duración automática de las sílabas}. Las propiedades de todos los contextos de un tipo en particular se pueden modificar dentro de un bloque @code{\layout} (con una -sintaxis diferente), véase @ref{Cambiar todos los contextos del mismo tipo}. +sintaxis diferente), véase +@ref{Cambiar todos los contextos del mismo tipo}. Esta construcción también ofrece una forma de mantener las instrucciones de disposición separadas del contenido musical. Si se va a modificar un solo contexto, debe usarse un bloque -@code{\with}, véase @ref{Cambiar solamente un contexto determinado}. +@code{\with}, véase +@ref{Cambiar solamente un contexto determinado}. @seealso Manual de aprendizaje: @@ -530,33 +531,39 @@ pentagramas con instrucciones @code{\change}, asociar letra con una voz mediante instrucciones @code{\lyricsto}, o cuando se añaden eventos musicales adicionales a un contexto anterior. -Existe una excepción a esta regla general: precisamente uno de los -contextos de @code{Voice} que están dentro de un contexto de -@code{Staff} o de una construcción @code{<<@dots{}>>} persiste siempre -hasta el final de, contexto de @code{Staff} circundante o la -construcción @code{<<@dots{}>>}, incluso aunque puede haber períodos en -que no tiene nada que hacer. El contexto que persiste de esta forma -será el primero que se encuentre en la primera construcción encerrada -entre llaves @code{@{@dots{}@}}, ignorando cualquiera que se encuentre -dentro de construcciones encerradas por ángulos dobles @code{<<@dots{}>>}. +Existe una excepción a esta regla general: dentro de una +construcción @code{@{@dots{}@}} (música secuencial), la noción que +la construcción tiene del @qq{contexto actual} descenderá un nivel +cada vez que un elemento de la secuencia finaliza en un +subcontexto del contexto anterior. Esto evita la creación espúrea +de contextos implícitos en ciertas situaciones, pero significa que +el primer contexto dentro del que se desciende, se va a mantener +vivo hasta el final de la expresión. + +Como contraste, los contextos de una expresión hecha con la +construcción @code{<<@dots{}>>} (música simultánea) no se +prolongan, por lo que si una instrucción que crea un contexto se +encierra en otro par de @code{<<@dots{}>>}, se impedirá que el +contexto persista durante toda la duración de la secuencia +@code{@{@dots{}@}} que lo contiene. Cualquier contexto se puede mantener vivo si nos aseguramos de que tiene algo que hacer en cualquier momento musical dado. Los -contextos de @code{Staff} se mantienen con vida si nos aseguramos de -que una de sus voces se mantiene viva. Una manera de hacerlo es -añadir silencios de separación a una voz en paralelo con la música -real. Éstos deben añadirse a todos y cada uno de los contextos de -@code{Voice} que se hayan de mantener vivos. Si se van a usar -esporádicamente varias voces, es más seguro mantenerlas todas vivas en -lugar de tratar de confiar en las excepciones que hemos mencionado -arriba. +contextos de @code{Staff} se mantienen con vida si nos aseguramos +de que una de sus voces se mantiene viva. Una manera de hacerlo +es añadir silencios de separación a una voz en paralelo con la +música real. Éstos deben añadirse a todos y cada uno de los +contextos de @code{Voice} que se hayan de mantener vivos. Si se +van a usar esporádicamente varias voces, es más seguro mantenerlas +todas vivas en lugar de tratar de confiar en las excepciones que +hemos mencionado arriba. En el ejemplo siguiente, tanto la voz A como la voz B se mantienen vivas de esta manera durante la duración de la pieza: @lilypond[quote,verbatim] -musicA = \relative c'' { d4 d d d } -musicB = \relative c'' { g4 g g g } +musicA = \relative { d''4 d d d } +musicB = \relative { g'4 g g g } keepVoicesAlive = { << \new Voice = "A" { s1*5 } % Keep Voice "A" alive for 5 bars @@ -588,14 +595,14 @@ music = { @cindex letra, alineación con melodía esporádica -El ejemplo siguiente muestra cómo se puede escribir una línea melódica -esporádica con letra utilizando este enfoque. Por supuesto, en una -situación real la melodía y el acompañamiento consistirían en varias -secciones diferentes. +El ejemplo siguiente muestra cómo se puede escribir una línea +melódica esporádica con letra utilizando este enfoque. Por +supuesto, en una situación real la melodía y el acompañamiento +consistirían en varias secciones diferentes. @lilypond[quote,verbatim] -melody = \relative c'' { a4 a a a } -accompaniment = \relative c' { d4 d d d } +melody = \relative { a'4 a a a } +accompaniment = \relative { d'4 d d d } words = \lyricmode { These words fol -- low the mel -- o -- dy } \score { << @@ -634,14 +641,14 @@ incluyendo notas espaciadoras para alinearla correctamente con el acompañamiento: @lilypond[quote,verbatim] -melody = \relative c'' { +melody = \relative { s1 % skip a bar - a4 a a a + a'4 a a a s1 % skip a bar a4 a a a } -accompaniment = \relative c' { - d4 d d d +accompaniment = \relative { + d'4 d d d d4 d d d d4 d d d d4 d d d @@ -675,13 +682,13 @@ words = \lyricmode { These words fol -- low the mel -- o -- dy } @c TODO Should this be Modifying engravers or Modifying contexts? -Los contextos de notación (como @code{Score} y @code{Staff}) no sólo -almacenan propiedades, también contienen «plug-ins» o complementos -llamados @q{grabadores} que crean elementos de notación. Por ejemplo, -el contexto @code{Voice} contiene un grabador -@code{Note_heads_engraver} que crea las cabezas de nota y el contexto -@code{Staff} contiene un grabador @code{Key_engraver} que -crea la armadura. +Los contextos de notación (como @code{Score} y @code{Staff}) no +sólo almacenan propiedades, también contienen «plug-ins» o +complementos llamados @q{grabadores} que crean elementos de +notación. Por ejemplo, el contexto @code{Voice} contiene un +grabador @code{Note_heads_engraver} que crea las cabezas de nota y +el contexto @code{Staff} contiene un grabador @code{Key_engraver} +que crea la armadura. Para ver una descripción completa de todos y cada uno de los complementos, consulte @@ -701,9 +708,9 @@ Referencia de funcionamiento interno @expansion{} Traducción @expansion{} Conte relaciona los grabadores que se usan para ese contexto. -Puede ser de utilidad jugar un poco con estos complementos. Se hace -iniciando un contexto nuevo con @code{\new} o @code{\context} y -modificándolo: +Puede ser de utilidad jugar un poco con estos complementos. Se +hace iniciando un contexto nuevo con @code{\new} o @code{\context} +y modificándolo: @funindex \with @@ -721,41 +728,42 @@ modificándolo: @end example @noindent -donde los @dots{} deben ser el nombre de un grabador. Aquí tenemos un -ejemplo sencillo que suprime los grabadores -@code{Time_signature_engraver} y @code{Clef_engraver} de un contexto -@code{Staff}: +donde los @dots{} deben ser el nombre de un grabador. Aquí +tenemos un ejemplo sencillo que suprime los grabadores +@code{Time_signature_engraver} y @code{Clef_engraver} de un +contexto @code{Staff}: -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << - \new Staff { - f2 g + \new Staff \relative { + f'2 g } \new Staff \with { \remove "Time_signature_engraver" \remove "Clef_engraver" - } { - f2 g2 + } \relative { + f'2 g2 } >> @end lilypond -En el segundo pentagrama no hay indicación de compás ni clave. Éste -es un método bastante rudimentario de hacer que desaparezcan los -objetos porque afecta a todo el pentagrama. Este método también -afecta al espaciado, lo que puede ser deseable o no serlo. Se -muestran métodos más sofisticados para quitar objetos en +En el segundo pentagrama no hay indicación de compás ni clave. +Éste es un método bastante rudimentario de hacer que desaparezcan +los objetos porque afecta a todo el pentagrama. Este método +también afecta al espaciado, lo que puede ser deseable o no serlo. +Se muestran métodos más sofisticados para quitar objetos en @rlearning{Visibilidad y color de los objetos}. -El ejemplo siguiente muestra una aplicación práctica. Normalmente las -líneas divisorias y las indicaciones de compás están sincronizadas a -lo largo de toda la partitura. Lo hacen los grabadores -@code{Timing_translator} y @code{Default_bar_line_engraver}. Estos -complementos mantienen al día la administración de las indicaciones de -compás, posición dentro del compás, etc. Moviendo estos grabadores -desde el contexto de @code{Score} al de @code{Staff}, podemos -conseguir una partitura en la que cada pentagrama tiene su propio -compás independiente. +El ejemplo siguiente muestra una aplicación práctica. Normalmente +las líneas divisorias y las indicaciones de compás están +sincronizadas a lo largo de toda la partitura. Lo hacen los +grabadores @code{Timing_translator} y +@code{Default_bar_line_engraver}. Estos complementos mantienen al +día la administración de las indicaciones de compás, posición +dentro del compás, etc. Moviendo estos grabadores desde el +contexto de @code{Score} al de @code{Staff}, podemos conseguir una +partitura en la que cada pentagrama tiene su propio compás +independiente. @cindex polimétricas, partituras @cindex compases distintos al mismo tiempo @@ -767,17 +775,17 @@ compás independiente. \consists "Timing_translator" \consists "Default_bar_line_engraver" } - \relative c'' { + \relative { \time 3/4 - c4 c c c c c + c''4 c c c c c } \new Staff \with { \consists "Timing_translator" \consists "Default_bar_line_engraver" } - \relative c'' { + \relative { \time 2/4 - c4 c c c c c + c''4 c c c c c } >> \layout { @@ -792,12 +800,12 @@ compás independiente. @knownissues -El orden en que los grabadores se especifican es el orden en que se -llaman para realizar su tarea de procesamiento. Normalmente, el orden -en que se especifican los grabadores no tiene importancia, pero en -algunos casos especiales sí la tiene, por ejemplo donde un grabador -escribe una propiedad y otro la lee, o donde un grabador crea un groby -otro debe procesarlo. +El orden en que los grabadores se especifican es el orden en que +se llaman para realizar su tarea de procesamiento. Normalmente, +el orden en que se especifican los grabadores no tiene +importancia, pero en algunos casos especiales sí la tiene, por +ejemplo donde un grabador escribe una propiedad y otro la lee, o +donde un grabador crea un groby otro debe procesarlo. Las siguientes ordenaciones son importantes: @@ -812,8 +820,8 @@ antes del grabador @code{Script_column_engraver} de columnas de inscripciones, @item -el @code{Timing_translator} debe ir antes del grabador de números de -compás @code{Bar_number_engraver}. +el @code{Timing_translator} debe ir antes del grabador de números +de compás @code{Bar_number_engraver}. @end itemize @@ -830,17 +838,18 @@ Archivos instalados: @cindex contexto, cambiar propiedades predeterminadas de Se pueden cambiar las propiedades de contexto y de grob con las -instrucciones @code{\set} y @code{\override}, tal y como se describe -en @ref{Modificar las propiedades}. Estas instrucciones crean eventos -musicales, haciendo que los cambios tengan efecto en el punto temporal -en que la música se está procesando. +instrucciones @code{\set} y @code{\override}, tal y como se +describe en @ref{Modificar las propiedades}. Estas instrucciones +crean eventos musicales, haciendo que los cambios tengan efecto en +el punto temporal en que la música se está procesando. Por contra, esta sección explica la forma de cambiarlos valores -@emph{predeterminados} de las propiedades de contexto y de grob en el -momento en que se crea el contexto. Existen dos formas de hacerlo. -Una modifica los valores predeterminados en todos los contextos de un -tipo dado, y el otro modifica los valores predeterminados solamente en -una instancia concreta de un contexto. +@emph{predeterminados} de las propiedades de contexto y de grob en +el momento en que se crea el contexto. Existen dos formas de +hacerlo. Una modifica los valores predeterminados en todos los +contextos de un tipo dado, y el otro modifica los valores +predeterminados solamente en una instancia concreta de un +contexto. @menu * Cambiar todos los contextos del mismo tipo:: @@ -856,19 +865,18 @@ una instancia concreta de un contexto. @funindex \context @funindex \layout -Los ajustes de contexto predeterminados que se han de usar para la composición -tipográfica dentro de @code{Score}, @code{Staff}, @code{Voice} y otros contextos -se pueden especificar en un bloque @code{\context} dentro de cualquier -bloque @code{\layout}. +Los ajustes de contexto predeterminados que se han de usar para la +composición tipográfica dentro de @code{Score}, @code{Staff}, +@code{Voice} y otros contextos se pueden especificar en un bloque +@code{\context} dentro de cualquier bloque @code{\layout}. Los ajustes para la salida MIDI, al contrario que para la composición tipográfica, se tendrán que especificar aparte en bloques @code{\midi} (véase @ref{Definiciones de salida - estructura de los contextos}). -El bloque @code{\layout} se debe colocar -dentro del bloque @code{\score} al que se aplica, después de la -música. +El bloque @code{\layout} se debe colocar dentro del bloque +@code{\score} al que se aplica, después de la música. @example \layout @{ @@ -887,12 +895,13 @@ Se pueden especificar los siguientes tipos de ajustes: @itemize @item -Una instrucción @code{\override}, pero omitiendo el nombre del contexto +Una instrucción @code{\override}, pero omitiendo el nombre del +contexto @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Thicker stems" a a a + \relative { + a'4^"Thicker stems" a a a a4 a a\ff a } \layout { @@ -909,8 +918,8 @@ Estableciendo una propiedad de contexto directamente @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a\ff a } \layout { @@ -923,13 +932,13 @@ Estableciendo una propiedad de contexto directamente @end lilypond @item -Una instrucción predefinida tal como @code{\dynamicUp} o una expresión -musical como @code{\accidentalStyle dodecaphonic} +Una instrucción predefinida tal como @code{\dynamicUp} o una +expresión musical como @code{\accidentalStyle dodecaphonic} @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Dynamics above" a a a + \relative { + a'4^"Dynamics above" a a a a4 a a\ff a } \layout { @@ -957,8 +966,8 @@ StaffDefaults = \with { \score { \new Staff { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -973,22 +982,23 @@ StaffDefaults = \with { @end itemize -Las instrucciones de ajuste de propiedades se pueden disponer dentro -de un bloque @code{\layout} sin que estén encerradas en un bloque -@code{\context}. Tales ajustes son equivalentes a incluir las mismas -instrucciones de ajuste de propiedades al comienzo de cada uno de los -contextos del tipo especificado. Si no se especifica ningún contexto, -@emph{todos y cada uno} de los contextos del nivel inferior quedan -afectados, véase @ref{Contextos del nivel más bajo. Voces}. La -sintaxis de una instrucción de ajuste de propiedades dentro de un -bloque @code{\layout} es la misma que si la misma instrucción -estuviera escrita en el propio flujo musical. +Las instrucciones de ajuste de propiedades se pueden disponer +dentro de un bloque @code{\layout} sin que estén encerradas en un +bloque @code{\context}. Tales ajustes son equivalentes a incluir +las mismas instrucciones de ajuste de propiedades al comienzo de +cada uno de los contextos del tipo especificado. Si no se +especifica ningún contexto, @emph{todos y cada uno} de los +contextos del nivel inferior quedan afectados, véase +@ref{Contextos del nivel más bajo. Voces}. La sintaxis de una +instrucción de ajuste de propiedades dentro de un bloque +@code{\layout} es la misma que si la misma instrucción estuviera +escrita en el propio flujo musical. @lilypond[quote,verbatim] \score { \new Staff { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -1008,13 +1018,14 @@ estuviera escrita en el propio flujo musical. @cindex \with @funindex \with -Las propiedades de contexto de una única instancia de contexto pueden -cambiarse dentro de un bloque @code{\with}. Todas las demás -instancias de contexto del mismo tipo retienen los ajustes -predeterminados que LilyPond tiene programados y que se modifican por -parte de cualquier bloque @code{\layout} que se encuentre dentro del -ámbito. El bloque @code{\with} se debe situar inmediatamente después -de las instrucciones @code{\new} @var{context-type}: +Las propiedades de contexto de una única instancia de contexto +pueden cambiarse dentro de un bloque @code{\with}. Todas las +demás instancias de contexto del mismo tipo retienen los ajustes +predeterminados que LilyPond tiene programados y que se modifican +por parte de cualquier bloque @code{\layout} que se encuentre +dentro del ámbito. El bloque @code{\with} se debe situar +inmediatamente después de las instrucciones @code{\new} +@var{context-type}: @example \new Staff \with @{ [ajustes de contexto para esta instancia de contexto solamente] @} @@ -1040,8 +1051,8 @@ contexto \new Staff { \new Voice \with { \override Stem.thickness = #4.0 } { - \relative c'' { - a4^"Thick stems" a a a + \relative { + a'4^"Thick stems" a a a a4 a a a } } @@ -1056,15 +1067,15 @@ Estableciendo una propiedad de contexto directamente \score { << \new Staff { - \relative c'' { - a4^"Default font" a a a + \relative { + a'4^"Default font" a a a a4 a a a } } \new Staff \with { fontSize = #-4 } { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -1080,8 +1091,8 @@ Una instrucción predefinida tal como @code{\dynamicUp} << \new Staff { \new Voice { - \relative c'' { - a4^"Dynamics below" a a a + \relative { + a'4^"Dynamics below" a a a a4 a a\ff a } } @@ -1090,8 +1101,8 @@ Una instrucción predefinida tal como @code{\dynamicUp} { \new Voice \with { \dynamicUp } { - \relative c'' { - a4^"Dynamics above" a a a + \relative { + a'4^"Dynamics above" a a a a4 a a\ff a } } @@ -1106,8 +1117,8 @@ Una instrucción predefinida tal como @code{\dynamicUp} @unnumberedsubsubsec Orden de precedencia @translationof Order of precedence -El valor de una propiedad que se aplica en un momento determinado se -determina de la siguiente forma: +El valor de una propiedad que se aplica en un momento determinado +se determina de la siguiente forma: @itemize @item @@ -1115,12 +1126,14 @@ si está en efecto una instrucción @code{\override} o @code{\set} dentro del flujo musical, se usa dicho valor, @item -de lo contrario, se usa el valor predeterminado tomado de un enunciado -@code{\with} en las instrucciones de inicio del contexto, +de lo contrario, se usa el valor predeterminado tomado de un +enunciado @code{\with} en las instrucciones de inicio del +contexto, @item -de lo contrario, se usa el valor tomado del bloque @code{\context} más -reciente que corresponda dentro de los bloques @code{\layout} o @code{\midi}, +de lo contrario, se usa el valor tomado del bloque @code{\context} +más reciente que corresponda dentro de los bloques @code{\layout} +o @code{\midi}, @item de lo contrario se usa el valor predeterminado que LilyPond lleva @@ -1147,27 +1160,22 @@ Referencia de la notación: @cindex grabadores, incluir en contextos @funindex \alias -@funindex alias @funindex \name -@funindex name @funindex \type -@funindex type @funindex \consists -@funindex consists @funindex \accepts -@funindex accepts @funindex \denies -@funindex denies Los contextos específicos, como @code{Staff} y @code{Voice}, están -construidos a partir de bloques sencillos. Es posible crear nuevos -tipos de contextos con combinaciones distintas de añadidos grabadores. +construidos a partir de bloques sencillos. Es posible crear +nuevos tipos de contextos con combinaciones distintas de añadidos +grabadores. El siguiente ejemplo muestra cómo construir un tipo diferente de contexto de @code{Voice} partiendo de cero. Será parecido a @code{Voice}, pero imprime solamente cabezas centradas en forma de -barra inclinada. Se puede usar para indicar improvisación en piezas -de jazz, +barra inclinada. Se puede usar para indicar improvisación en +piezas de jazz, @lilypond[quote,ragged-right] \layout { \context { @@ -1186,16 +1194,16 @@ de jazz, \accepts "ImproVoice" }} -\relative c'' { - a4 d8 bes8 \new ImproVoice { c4^"ad lib" c +\relative { + a'4 d8 bes8 \new ImproVoice { c4^"ad lib" c c4 c^"undress" c_"while playing :)" c } a1 } @end lilypond -Estos ajustes se definen dentro de un bloque @code{\context} que a su -vez está dentro de un bloque @code{\layout}, +Estos ajustes se definen dentro de un bloque @code{\context} que a +su vez está dentro de un bloque @code{\layout}, @example \layout @{ @@ -1208,7 +1216,8 @@ vez está dentro de un bloque @code{\layout}, En el siguiente análisis, la entrada de ejemplo que se muestra debe ir en el lugar de los puntos suspensivos @dots{} del fragmento anterior. -En primer lugar es necesario definir un nombre para el nuevo contexto: +En primer lugar es necesario definir un nombre para el nuevo +contexto: @example \name ImproVoice @@ -1289,9 +1298,9 @@ Al juntarlo todo, obtenemos @funindex \accepts Los contextos dan lugar a jerarquías. Queremos poner el contexto -@code{ImproVoice} dentro del contexto @code{Staff}, igual que los contextos -de voz normales. Por tanto, modificamos la definición de -@code{Staff} con la instrucción @code{\accepts} (acepta), +@code{ImproVoice} dentro del contexto @code{Staff}, igual que los +contextos de voz normales. Por tanto, modificamos la definición +de @code{Staff} con la instrucción @code{\accepts} (acepta), @example \context @{ @@ -1300,12 +1309,41 @@ de voz normales. Por tanto, modificamos la definición de @} @end example +@funindex \inherit-acceptability +Con frecuencia, al reutilizar una definición de contexto +existente, el contexto resultante se puede usar en cualquier lugar +donde el contexto original hubiera podido hacerlo. + +@example +\layout @{ + @dots{} + \inherit-acceptability @var{to} @var{from} +@} +@end example + +@noindent +consigue que tengamos contextos del tipo @var{to} aceptados por +todos los contextos que asimismo aceptan @var{from}. Por ejemplo, +usar + +@example +\layout @{ + @dots{} + \inherit-acceptability "ImproVoice" "Voice" +@} +@end example + +@noindent +añade un @code{\accepts} para @code{ImproVoice} tanto a la +definición de @code{Staff} como a la de @code{RhythmicStaff}. + @funindex \denies -Lo opuesto a @code{\accepts} (acepta) es @code{\denies} (deniega), lo -que a veces se necesita cuando se están reutilizando definiciones de -contexto existentes. +Lo opuesto a @code{\accepts} (acepta) es @code{\denies} (deniega), +lo que a veces se necesita cuando se están reutilizando +definiciones de contexto existentes. -Ponemos ambos dentro de un bloque @code{\layout}, como +Organizar las piezas requeridas dentro de un bloque @code{\layout} +nos deja con @example \layout @{ @@ -1313,10 +1351,7 @@ Ponemos ambos dentro de un bloque @code{\layout}, como \name ImproVoice @dots{} @} - \context @{ - \Staff - \accepts "ImproVoice" - @} + \inherit-acceptability "ImproVoice" "Voice" @} @end example @@ -1324,8 +1359,8 @@ Así pues, la salida que aparece al comienzo de esta sub-sección se puede escribir como @example -\relative c'' @{ - a4 d8 bes8 +\relative @{ + a'4 d8 bes8 \new ImproVoice @{ c4^"ad lib" c c4 c^"desvístete" @@ -1343,7 +1378,6 @@ contexto. @seealso Referencia de funcionamiento interno: -@rinternals{Engraver_group}, @rinternals{Note_heads_engraver}, @rinternals{Text_engraver}, @rinternals{Rhythmic_column_engraver}, @@ -1358,15 +1392,15 @@ Referencia de funcionamiento interno: @funindex \accepts @funindex \denies -Los contextos se disponen en un sistema normalmente desde arriba hacia -abajo en el orden en que se encuentran en el archivo de entrada. -Cuando los contextos se anidan unos dentro de otros, el contexto -exterior incluye a los contextos anidados tal y como se especifica en -el archivo de entrada, siempre y cuando los contextos interiores estén -incluidos en la lista @qq{accepts} del contexto externo. Los -contextos anidados que no está nincluidos en la lista @qq{accepts} del -contexto externo se recolocan debajo del contexto externo en lugar de -anidarse dentro de él. +Los contextos se disponen en un sistema normalmente desde arriba +hacia abajo en el orden en que se encuentran en el archivo de +entrada. Cuando los contextos se anidan unos dentro de otros, el +contexto exterior incluye a los contextos anidados tal y como se +especifica en el archivo de entrada, siempre y cuando los +contextos interiores estén incluidos en la lista @qq{accepts} del +contexto externo. Los contextos anidados que no está nincluidos +en la lista @qq{accepts} del contexto externo se recolocan debajo +del contexto externo en lugar de anidarse dentro de él. La lista @qq{accepts} de un contexto se puede cambiar con las instrucciones @code{\accepts} (acepta) o @code{\denies} (niega). @@ -1412,11 +1446,11 @@ añadir un @code{StaffGroup} al contexto @code{GrandStaff}: } @end lilypond -@code{\denies} se usa principalmente cuando un contexto nuevo se está -basando en otro, pero los anidamientos requeridos difieren. Por -ejemplo, el contexto @code{VaticanaStaff} está basado en el contexto -@code{Staff}, pero con el contexto @code{VaticanaVoice} sustituido por -el contexto @code{Voice} en la lista @qq{accepts}. +@code{\denies} se usa principalmente cuando un contexto nuevo se +está basando en otro, pero los anidamientos requeridos difieren. +Por ejemplo, el contexto @code{VaticanaStaff} está basado en el +contexto @code{Staff}, pero con el contexto @code{VaticanaVoice} +sustituido por el contexto @code{Voice} en la lista @qq{accepts}. @cindex contextos implícitos @@ -1501,7 +1535,6 @@ Archivos instalados: @end menu - @node Navegar por la referencia del programa @subsection Navegar por la referencia del programa @translationof Navigating the program reference @@ -1509,10 +1542,8 @@ Archivos instalados: Supongamos que queremos mover la indicación de digitación del fragmento siguiente: -@lilypond[quote,relative=2,verbatim] -c-2 -\stemUp -f +@lilypond[quote,fragment,verbatim] +c''-2 @end lilypond Si hace una visita a la documentación en busca de instrucciones de @@ -1527,14 +1558,14 @@ Referencia de funcionamiento interno: @rinternals{Fingering}. @ifnothtml La referencia del programador se encuentra disponible en forma de -documento HTML. Se recomienda mucho que lo lea en la forma HTML, bien -en línea o bien descargando los archivos de la documentación HTML. -Esta sección sería mucho más difícil de entender si está utilizando el -manual en formato PDF. +documento HTML. Se recomienda mucho que lo lea en la forma HTML, +bien en línea o bien descargando los archivos de la documentación +HTML. Esta sección sería mucho más difícil de entender si está +utilizando el manual en formato PDF. @end ifnothtml -Siga el enlace que lleva a @rinternals{Fingering}. Al principio de la -página, puede ver +Siga el enlace que lleva a @rinternals{Fingering}. Al principio +de la página, puede ver @quotation Los objetos de digitación se crean por parte de: @@ -1542,7 +1573,8 @@ Los objetos de digitación se crean por parte de: @end quotation Siguiendo los enlaces relacionados dentro de la referencia del -programa, podemos seguir el flujo de información dentro del programa: +programa, podemos seguir el flujo de información dentro del +programa: @itemize @@ -1558,23 +1590,23 @@ El tipo de evento musical @code{fingering-event} está descrito en Expresiones musicales con el nombre de @rinternals{FingeringEvent} @end itemize -Este camino se recorre en contra de la corriente de información del -programa: comienza por la salida y acaba en el evento de entrada. -También podríamos haber empezado por un evento de la entrada, y leído -siguiendo el flujo de información terminando en su caso en el objeto -(u objetos) de la salida. +Este camino se recorre en contra de la corriente de información +del programa: comienza por la salida y acaba en el evento de +entrada. También podríamos haber empezado por un evento de la +entrada, y leído siguiendo el flujo de información terminando en +su caso en el objeto (u objetos) de la salida. -La referencia del programa también se puede examinar como un documento -normal. Contiene capítulos que tratan de +La referencia del programa también se puede examinar como un +documento normal. Contiene capítulos que tratan de @ifhtml @rinternals{Music definitions}, @end ifhtml @ifnothtml @code{Music definitions} @end ifnothtml -de la @rinternals{Translation}, y del @rinternals{Backend}. Cada uno -de los capítulos relaciona todas las definiciones utilizadas y todas -las propiedades que se pueden ajustar. +de la @rinternals{Translation}, y del @rinternals{Backend}. Cada +uno de los capítulos relaciona todas las definiciones utilizadas y +todas las propiedades que se pueden ajustar. @node Interfaces de la presentación @@ -1586,13 +1618,14 @@ las propiedades que se pueden ajustar. @cindex grob La página HTML que pudimos ver en la sección anterior describe el -objeto de presentación llamado @rinternals{Fingering}. Dicho objeto -es un símbolo dentro de la partitura. Tiene propiedades que guardan -números (como grosores y direcciones), pero también punteros a objetos -relacionados. Un objeto de presentación también se llama un -@emph{Grob}, que es una abreviatura de Graphical Object (objeto -gráfico). Para ver más detalles acerca de los objetos gráficos o -Grobs, consulte @rinternals{grob-interface}. +objeto de presentación llamado @rinternals{Fingering}. Dicho +objeto es un símbolo dentro de la partitura. Tiene propiedades +que guardan números (como grosores y direcciones), pero también +punteros a objetos relacionados. Un objeto de presentación +también se llama un @emph{Grob}, que es una abreviatura de +Graphical Object (objeto gráfico). Para ver más detalles acerca +de los objetos gráficos o Grobs, consulte +@rinternals{grob-interface}. La página dedicada a @code{Fingering} relaciona las definiciones del objeto @code{Fingering}. Por ejemplo, la página dice @@ -1608,25 +1641,25 @@ lo que significa que el número se mantendrá a una distancia de al menos 0.5 de la cabeza de la nota. -Cada objeto de presentación puede tener varias funciones como elemento -notacional o tipográfico. Por ejemplo, el objeto de digitación -Fingering tiene los siguientes aspectos +Cada objeto de presentación puede tener varias funciones como +elemento notacional o tipográfico. Por ejemplo, el objeto de +digitación Fingering tiene los siguientes aspectos @itemize @item -Su tamaño es independiente del espaciado horizontal, al contrario de -las ligaduras o las barras de las figuras. +Su tamaño es independiente del espaciado horizontal, al contrario +de las ligaduras o las barras de las figuras. @item Es un elemento de texto. Casi seguro que es un texto muy corto. @item -este elemento de texto se tipografía con un tipo de letra, no como las -ligaduras o las barras de las figuras. +este elemento de texto se tipografía con un tipo de letra, no como +las ligaduras o las barras de las figuras. @item -Horizontalmente, el centro del símbolo se debe alinear con el centro -de la cabeza de la nota. +Horizontalmente, el centro del símbolo se debe alinear con el +centro de la cabeza de la nota. @item Verticalmente, el símbolo se coloca cerca de la nota y del pentagrama. @@ -1652,8 +1685,8 @@ Este objeto contempla los siguientes interfaces: Al pulsar sobre cualquiera de los enlaces nos desplazaremos a la página del respectivo interfaz del objeto. Cada interfaz tiene un cierto número de propiedades. Algunas de ellas no son para que el -usuario las pueda ajustar (@q{Propiedades internas}), pero otras sí se -pueden modificar. +usuario las pueda ajustar (@q{Propiedades internas}), pero otras +sí se pueden modificar. Hemos estado hablando de @emph{el} objeto @code{Fingering}, pero realmente esto no significa mucho. El archivo de inicialización @@ -1684,9 +1717,9 @@ realmente esto no significa mucho. El archivo de inicialización @end example @noindent -Como podemos ver, el objeto @code{Fingering} no es más que un montón -de valores de variables, y la página web de la Referencia de -funcionamiento interno se genera directamente a partir de esta +Como podemos ver, el objeto @code{Fingering} no es más que un +montón de valores de variables, y la página web de la Referencia +de funcionamiento interno se genera directamente a partir de esta definición. @@ -1696,16 +1729,14 @@ definición. Recordemos que queríamos cambiar la posición del @b{2} en -@lilypond[quote,relative=2,verbatim] -c-2 -\stemUp -f +@lilypond[quote,fragment,verbatim] +c''-2 @end lilypond -Puesto que el @b{2} se encuentra colocado verticalmente sobre su nota, -tenemos que negociar con el interfaz asociado con esta colocación. -Esto se hace usando @code{side-position-interface}. La página que -describe este interface dice: +Puesto que el @b{2} se encuentra colocado verticalmente sobre su +nota, tenemos que negociar con el interfaz asociado con esta +colocación. Esto se hace usando @code{side-position-interface}. +La página que describe este interface dice: @quotation @code{side-position-interface} @@ -1719,45 +1750,43 @@ derecha, encima o debajo?) @cindex relleno @cindex padding (relleno) @noindent -Debajo de esta descripción, la variable @code{padding} (relleno) se -describe como +Debajo de esta descripción, la variable @code{padding} (relleno) +se describe como @quotation @table @code @item padding (dimensión, en espacios de pentagrama) -Añadir esta cantidad de espacio adicional entre objetos que están unos -junto a otros. +Añadir esta cantidad de espacio adicional entre objetos que están +unos junto a otros. @end table @end quotation Aumentando el valor de @code{padding}, podemos alejar la cifra de digitación de la cabeza de la nota. La siguiente orden inserta un -espacio en blanco de 3 espacios de pentagrama entre la nota y la -digitación: +espacio en blanco de tres @qq{espacios de pentagrama} entre la +nota y la digitación: + @example \once \override Voice.Fingering.padding = #3 @end example -Al insertar esta instrucción antes de que se haya creado el objeto -Fingering, es decir, antes del @code{c2}, llegamos al siguiente -resultado: +Al insertar este relleno antes de que se haya creado el objeto de +digitación, llegamos al siguiente resultado: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,fragment,verbatim] \once \override Voice.Fingering.padding = #3 -c-2 -\stemUp -f +c''-2 @end lilypond -En este caso, el contexto de este truco es @code{Voice}. Este hecho -se puede deducir también a partir de la referencia del programa, ya -que la página dedicada al añadido @rinternals{Fingering_engraver} dice +En este caso, el contexto de este truco es @code{Voice}. Véase el +apartado dedicado al añadido @rinternals{Fingering_engraver}, que +dice: @quotation -El grabador Fingering_engraver es parte de los contextos: @dots{} -@rinternals{Voice} +El grabador Fingering_engraver forma parte de los contextos: +@dots{} @rinternals{Voice} @end quotation @@ -1769,13 +1798,20 @@ Se hace necesario presentar una panorámica de las diversas convenciones de nomenclatura: @itemize -@item funciones de Scheme: minúsculas-con-guiones (incluso nombres de una sola palabra) -@item funciones de Scheme: ly:más-estilo-de-scheme +@item funciones de Scheme: minúsculas-con-guiones (lo que incluye a los nombres de una sola palabra) + +@item funciones de Scheme específicas de LilyPond: ly:más-estilo-de-scheme + @item eventos, clases y propiedades musicales: como-las-funciones-de-scheme + @item interfaces de Grobs: estilo-scheme + @item propiedades de backend: estilo-scheme (¡pero X e Y en mayúsculas!) + @item contextos (y ExpresionesMusicales y grobs): Mayúsculas o MayúsculasDeCamello + @item propiedades de contexto: minúsculasSeguidoDeMayúsculasDeCamello + @item grabadores: Mayúsculas_seguido_de_minúsculas_y_con_barras_bajas @end itemize @@ -1783,6 +1819,7 @@ convenciones de nomenclatura: Preguntas aún sin respuesta @itemize @item ¿Cuáles de aquéllas son convenciones y cuáles son reglas? + @item ¿Cuáles son reglas del lenguaje subyacente, y cuáles son específicas de LilyPond? @end itemize @end ignore @@ -1807,21 +1844,23 @@ Preguntas aún sin respuesta @translationof Overview of modifying properties Cada contexto es responsable de la creación de ciertos tipos de -objetos gráficos. Los ajustes que se usan para imprimir estos objetos -también se almacenan por contexto. Mediante la modificación de estos -ajustes, se puede alterar la apariencia de los objetos. +objetos gráficos. Los ajustes que se usan para imprimir estos +objetos también se almacenan por contexto. Mediante la +modificación de estos ajustes, se puede alterar la apariencia de +los objetos. Existen dos tipos diferentes de propiedades almacenadas en los -contextos: las propiedades de contexto y las propiedades de grob. Las -propiedades de contexto son propiedades que se aplican al contexto -como un todo y controlan la forma en que el propio contexto se -imprime. Por contra, las propiedades de grob se aplican a los tipos -de grob específicos que se imprimirán dentro del contexto. - -Las instrucciones @code{\set} y @code{\unset} se usan para cambiar los -valores de las propiedades de contexto. Las instrucciones -@code{\override} y @code{\revert} se usan para cambiar los valores de -las propiedades de grob. +contextos: las propiedades de contexto y las propiedades de grob. +Las propiedades de contexto son propiedades que se aplican al +contexto como un todo y controlan la forma en que el propio +contexto se imprime. Por contra, las propiedades de grob se +aplican a los tipos de grob específicos que se imprimirán dentro +del contexto. + +Las instrucciones @code{\set} y @code{\unset} se usan para cambiar +los valores de las propiedades de contexto. Las instrucciones +@code{\override} y @code{\revert} se usan para cambiar los valores +de las propiedades de grob. @ignore La sintaxis de esto es @@ -1852,12 +1891,12 @@ instrucción especifica como contexto a @code{Staff}, sólo se aplica al pentagrama actual. Otros pentagramas mantienen su aspecto normal. Aquí vemos la instrucción en pleno funcionamiento: -@lilypond[quote,verbatim,relative=2] -c4 +@lilypond[quote,fragment,verbatim] +c''4 \override Staff.Stem.thickness = #4.0 -c4 -c4 -c4 +c''4 +c''4 +c''4 @end lilypond La instrucción @code{\override} modifica la definición de la plica @@ -1869,11 +1908,11 @@ omitir, ocasionando que se utilice el contexto predeterminado @code{Voice}. Al añadir @code{\once} se aplica el cambio durante un solo paso de tiempo. -@lilypond[quote,verbatim,relative=2] -c4 +@lilypond[quote,fragment,verbatim] +c''4 \once \override Stem.thickness = #4.0 -c4 -c4 +c''4 +c''4 @end lilypond El @code{\override} se debe hacer antes de que el objeto se inicia. @@ -1881,11 +1920,11 @@ Por tanto, al alterar objetos @emph{Spanner} «de extensión» como ligaduras o barras, la instrucción @code{\override} se debe ejecutar en el momento en que se crea el objeto. En este ejemplo: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \override Slur.thickness = #3.0 -c8[( c +c''8[( c'' \override Beam.beam-thickness = #0.6 -c8 c]) +c''8 c'']) @end lilypond @noindent @@ -1931,10 +1970,10 @@ Referencia de funcionamiento interno: @rinternals{PropertySet}. @knownissues -El «back-end» o motor de salida no es muy estricto en la comprobación -de tipos de las propiedades de objetos. Las referencias cíclicas en -valores Scheme de propiedades pueden producir cuelgues o salidas -abruptas, o las dos cosas. +El «back-end» o motor de salida no es muy estricto en la +comprobación de tipos de las propiedades de objetos. Las +referencias cíclicas en valores Scheme de propiedades pueden +producir cuelgues o salidas abruptas, o las dos cosas. @node La instrucción set @@ -1946,32 +1985,33 @@ abruptas, o las dos cosas. @cindex cambiar propiedades Cada contexto puede tener distintas @emph{propiedades}, variables -contenidas dentro de ese contexto. Se pueden cambiar mientras dura el -paso de interpretación. Se consigue insertando la instrucción -@code{\set} dentro de la música: +contenidas dentro de ese contexto. Se pueden cambiar mientras +dura el paso de interpretación. Se consigue insertando la +instrucción @code{\set} dentro de la música: @example \set @var{contexto}.@var{propiedad} = #@var{valor} @end example -@var{valor} es un objeto de Scheme, razón por la que va precedido del -carácter almohadilla,@tie{}@code{#}. - -El nombre de las propiedades de contexto suele ir en minúsculas con -mayúscula en medio. Controlan sobre todo la traducción de la música a -la notación, p.ej. @code{localKeySignature} (para determinar si hay -que impriir alteraciones o no), o @code{measurePosition} (para -determinar cuándo hay que imprimir una línea divisoria). El valor de -las propiedades de contexto puede modifcarse con el tiempo durante la -interpretación de la música; un ejemplo obvio es -@code{measurePosition}. Las propiedades de contexto se modifican -mediante la instrucción @code{\set}. - -Por ejemplo, los silencios multicompás se combinan en un solo compás -si el valor de la propiedad de contexto @code{skipBars} se establece a -@code{#t} (verdadero): - -@lilypond[quote,verbatim,relative=2] +@var{valor} es un objeto de Scheme, razón por la que va precedido +del carácter almohadilla,@tie{}@code{#}. + +El nombre de las propiedades de contexto suele ir en minúsculas +con mayúscula en medio. Controlan sobre todo la traducción de la +música a la notación, p.ej. @code{localAlterations} (para +determinar si hay que impriir alteraciones o no), o +@code{measurePosition} (para determinar cuándo hay que imprimir +una línea divisoria). El valor de las propiedades de contexto +puede modifcarse con el tiempo durante la interpretación de la +música; un ejemplo obvio es @code{measurePosition}. Las +propiedades de contexto se modifican mediante la instrucción +@code{\set}. + +Por ejemplo, los silencios multicompás se combinan en un solo +compás si el valor de la propiedad de contexto @code{skipBars} se +establece a @code{#t} (verdadero): + +@lilypond[quote,fragment,verbatim] R1*2 \set Score.skipBars = ##t R1*2 @@ -1981,29 +2021,29 @@ Si se omite el argumento @var{context}, entonces se utiliza el contexto actual de nivel más bajo (normalmente @code{ChordNames}, @code{Voice} o @code{Lyrics}). En este ejemplo: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \set Score.autoBeaming = ##f -<< - { - e8 e e e - \set autoBeaming = ##t - e8 e e e - } \\ { - c8 c c c c8 c c c - } ->> +\relative { + e''8 e e e + \set autoBeaming = ##t + e8 e e e +} \\ +\relative { + c''8 c c c c8 c c c +} @end lilypond -El cambio se aplica @q{al vuelo}, mientras dura la música, de forma -que el ajuste sólo afecta al segundo grupo de corcheas. +El cambio se aplica @q{al vuelo}, mientras dura la música, de +forma que el ajuste sólo afecta al segundo grupo de corcheas. Observe que el contexto del nivel más bajo no siempre contiene la -propiedad que querríamos modificar: por ejemplo, intentar ajustar el -valor de la propiedad @code{skipBars} del contexto predeterminado del -nivel más bajo, que en este caso es @code{Voice}, no tendrá ningún -efecto, porque skipBars es una propiedad del contexto @code{Score}. +propiedad que querríamos modificar: por ejemplo, intentar ajustar +el valor de la propiedad @code{skipBars} del contexto +predeterminado del nivel más bajo, que en este caso es +@code{Voice}, no tendrá ningún efecto, porque skipBars es una +propiedad del contexto @code{Score}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] R1*2 \set skipBars = ##t R1*2 @@ -2027,23 +2067,22 @@ elimina la definición solamente si está establecida dentro de @var{contexto}. Properties that have been set in enclosing contexts will not be altered by an unset in an enclosed context: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \set Score.autoBeaming = ##t -<< - { - \unset autoBeaming - e8 e e e - \unset Score.autoBeaming - e8 e e e - } \\ { - c8 c c c c8 c c c - } ->> +\relative { + \unset autoBeaming + e''8 e e e + \unset Score.autoBeaming + e8 e e e +} \\ +\relative { + c''8 c c c c8 c c c +} @end lilypond Como @code{\set}, el argumento @var{contexto} no se tiene que -especificar para un contexto del nivel más bajo, por lo que los dos -enunciados +especificar para un contexto del nivel más bajo, por lo que los +dos enunciados @example \set Voice.autoBeaming = ##t @@ -2055,19 +2094,20 @@ son equivalentes si el contexto inferior en curso es @code{Voice}. @cindex \once -Los ajustes que se aplican solamente a un único paso de tiempo se -pueden escribir con @code{\once}, por ejemplo en +Los ajustes con @code{\set} o @code{\unset} que se aplican +solamente a un único paso de tiempo se pueden escribir con +@code{\once}, por ejemplo en -@lilypond[quote,verbatim,relative=2] -c4 +@lilypond[quote,fragment,verbatim] +c''4 \once \set fontSize = #4.7 -c4 -c4 +c''4 +c''4 @end lilypond En el manual de Referencia de funcionamiento interno hay una -descripción completa de todas las propiedades de contexto disponibles, -consulte +descripción completa de todas las propiedades de contexto +disponibles, consulte @ifhtml @rinternals{Tunable context properties}. @end ifhtml @@ -2088,13 +2128,14 @@ Referencia de funcionamiento interno: @cindex propiedades de grob @funindex \override -Existe un tipo especial de propiedad de contexto: la descripción de -los grobs. Las decscripciones de los grobs reciben un nombre en -@code{MayúsculasDeCamello} (empezando en mayúscula). Contienen los -@q{ajustes predeterminados} para un tipo particular de grob, en forma -de lista asociativa. Consulte @file{scm/define-grobs.scm} para -ver los ajustes de cada descripción de grob. Las descripciones de -grob se modifican con @code{\override}. +Existe un tipo especial de propiedad de contexto: la descripción +de los grobs. Las decscripciones de los grobs reciben un nombre +en @code{MayúsculasDeCamello} (empezando en mayúscula). Contienen +los @q{ajustes predeterminados} para un tipo particular de grob, +en forma de lista asociativa. Consulte +@file{scm/define-grobs.scm} para ver los ajustes de cada +descripción de grob. Las descripciones de grob se modifican con +@code{\override}. La sintaxis de la instrucción @code{\override} es @@ -2106,27 +2147,27 @@ Por ejemplo, podemos aumentar el grosor de la plica de una figura sobreescribiendo la propiedad @code{thickness} (grosor) del objeto @code{Stem} (plica): -@lilypond[quote,verbatim,relative=2] -c4 c +@lilypond[quote,fragment,verbatim] +c''4 c'' \override Voice.Stem.thickness = #3.0 -c4 c +c''4 c'' @end lilypond Si no se ha especificado ningún contexto en la instrucción @code{\override}, se utiliza el contexto del nivel inferior: -@lilypond[quote,verbatim,relative=2] -{ \override Staff.Stem.thickness = #3.0 - << - { - e4 e - \override Stem.thickness = #0.5 - e4 e - } \\ { - c4 c c c - } - >> -} +@lilypond[quote,fragment,verbatim] +\override Staff.Stem.thickness = #3.0 +<< + \relative { + e''4 e + \override Stem.thickness = #0.5 + e4 e + } \\ + \relative { + c''4 c c c + } +>> @end lilypond Algunas opciones susceptibles de trucaje, se llaman @@ -2160,53 +2201,53 @@ La sintaxis de la instrucción @code{\revert} es Por ejemplo, -@lilypond[quote,verbatim,relative=2] -c4 -\override Voice.Stem.thickness = #3.0 -c4 c -\revert Voice.Stem.thickness -c4 +@lilypond[quote,verbatim] +\relative { + c''4 + \override Voice.Stem.thickness = #3.0 + c4 c + \revert Voice.Stem.thickness + c4 +} @end lilypond -Los efectos de @code{\override} y @code{\revert} se aplican a todos -los grobs del contexto afectado partiendo del momento actual y hacia -adelante: +Los efectos de @code{\override} y @code{\revert} se aplican a +todos los grobs del contexto afectado partiendo del momento actual +y hacia adelante: -@lilypond[quote,verbatim,relative=2] -{ - << - { - e4 - \override Staff.Stem.thickness = #3.0 - e4 e e - } \\ { - c4 c c - \revert Staff.Stem.thickness - c4 - } - >> -} +@lilypond[quote,verbatim] +<< + \relative { + e''4 + \override Staff.Stem.thickness = #3.0 + e4 e e + } \\ + \relative { + c''4 c c + \revert Staff.Stem.thickness + c4 + } +>> @end lilypond @funindex \once @cindex sobreescritura para un solo momento -Se puede usar @code{\once} con @code{\override} para afectar solamente -al instante de tiempo actual: +Se puede usar @code{\once} con @code{\override} o @code{\revert} +para afectar solamente al instante de tiempo actual: -@lilypond[quote,verbatim,relative=2] -{ - << - { - \override Stem.thickness = #3.0 - e4 e e e - } \\ { - c4 - \once \override Stem.thickness = #3.0 - c4 c c - } - >> -} +@lilypond[quote,verbatim] +<< + \relative c { + \override Stem.thickness = #3.0 + e''4 e e e + } \\ + \relative { + c''4 + \once \override Stem.thickness = #3.0 + c4 c c + } +>> @end lilypond @@ -2279,16 +2320,18 @@ los objetos gráficos. Para objetos que resultan directamente de un elemento de código de la entrada, puede usar la función @code{\tweak}, por ejemplo -@lilypond[relative=2,verbatim,quote] -< c - \tweak color #red - d - g - \tweak duration-log #1 - a -> 4 --\tweak padding #8 --^ +@lilypond[verbatim,quote] +\relative { + < c'' + \tweak color #red + d + g + \tweak duration-log #1 + a + > 4 + -\tweak padding #8 + -^ +} @end lilypond @@ -2315,15 +2358,15 @@ posibilidad de modificarla. Así, esto funciona: -@lilypond[relative=2,verbatim,quote] -<\tweak color #red c>4 +@lilypond[verbatim,fragment,quote] +<\tweak color #red c''>4 @end lilypond @noindent pero esto no funciona: -@lilypond[relative=2,verbatim,quote] -\tweak color #red c4 +@lilypond[verbatim,fragment,quote] +\tweak color #red c''4 @end lilypond @end ignore @@ -2331,11 +2374,12 @@ pero esto no funciona: Para ver una introducción a la sintaxis y los usos de la instrucción tweak, consulte @rlearning{Métodos de trucaje}. -Si se colocan varios elementos similares en el mismo momento musical, -la instrucción @code{\override} no se puede usar para modificar uno -solo de ellos: aquí es donde se debe usar la instrucción -@code{\tweak}. Entre los elementos que pueden aparecer más de una vez -en el mismo momento musical están los siguientes: +Si se colocan varios elementos similares en el mismo momento +musical, la instrucción @code{\override} no se puede usar para +modificar uno solo de ellos: aquí es donde se debe usar la +instrucción @code{\tweak}. Entre los elementos que pueden +aparecer más de una vez en el mismo momento musical están los +siguientes: @c TODO expand to include any further uses of \tweak @itemize @@ -2349,23 +2393,23 @@ en el mismo momento musical están los siguientes: @cindex acorde, modificación de una nota -En este ejemplo se modifican el color de una cabeza y el tipo de otra, -dentro del mismo acorde: +En este ejemplo se modifican el color de una cabeza y el tipo de +otra, dentro del mismo acorde: -@lilypond[relative=2,verbatim,quote] -< c +@lilypond[verbatim,fragment,quote] +< c'' \tweak color #red - d - g + d'' + g'' \tweak duration-log #1 - a + a'' > 4 @end lilypond @code{\tweak} se puede usar para modificar ligaduras de expresión: -@lilypond[verbatim,quote,relative=1] -c-\tweak thickness #5 ( d e f) +@lilypond[verbatim,quote] +\relative { c'-\tweak thickness #5 ( d e f) } @end lilypond @@ -2376,28 +2420,28 @@ acorde completo no hace nada porque su evento musical actúa solamente como un contenedor, y todos los objetos de presentación se crean a partir de eventos dentro del @code{EventChord}: -@lilypond[relative=2,verbatim,quote] -\tweak color #red c4 -\tweak color #red 4 -<\tweak color #red c e>4 +@lilypond[verbatim,fragment,quote] +\tweak color #red c''4 +\tweak color #red 4 +<\tweak color #red c'' e''>4 @end lilypond -La instrucción @code{\tweak} sencilla no se puede usar para modificar -ningún objeto que no se haya creado directamente a partir de la entrada. -Concretamente, no afecta a las plicas, barras automáticas ni -alteraciones, porque éstos se generan posteriormente por -parte de objetos de presentación @code{NoteHead} -más que por elementos musicales del -flujo de entrada. +La instrucción @code{\tweak} sencilla no se puede usar para +modificar ningún objeto que no se haya creado directamente a +partir de la entrada. Concretamente, no afecta a las plicas, +barras automáticas ni alteraciones, porque éstos se generan +posteriormente por parte de objetos de presentación +@code{NoteHead} más que por elementos musicales del flujo de +entrada. -Tales objetos de presentación creados indirectamente se pueden trucar -usando la forma de la instrucción @code{\tweak} en que el nombre -del grob se especifica de forma explícita: +Tales objetos de presentación creados indirectamente se pueden +trucar usando la forma de la instrucción @code{\tweak} en que el +nombre del grob se especifica de forma explícita: -@lilypond[relative=2,verbatim,quote] +@lilypond[fragment,verbatim,quote] \tweak Stem.color #red -\tweak Beam.color #green c8 e -4 +\tweak Beam.color #green c''8 e'' +4 @end lilypond No se puede usar @code{\tweak} para modificar las claves o las @@ -2409,21 +2453,22 @@ requieren para especificar el contexto. Se pueden colocar varias instrucciones @code{\tweak} antes de un elemento de notación; todos le afectan: -@lilypond[verbatim,quote,relative=1] -c --\tweak style #'dashed-line --\tweak dash-fraction #0.2 --\tweak thickness #3 --\tweak color #red - \glissando -f' +@lilypond[verbatim,fragment,quote] +c' + -\tweak style #'dashed-line + -\tweak dash-fraction #0.2 + -\tweak thickness #3 + -\tweak color #red + \glissando +f'' @end lilypond -El flujo musical que se genera a partir de una sección de un archivo -de entrada (incluido cualquier elemento insertado automáticamente) -puede examinarse, véase @rextend{Presentación de las expresiones musicales}. -Esto puede ser de utilidad en la determinación de lo que -puede modificarse por medio de una instrucción @code{\tweak}. +El flujo musical que se genera a partir de una sección de un +archivo de entrada (incluido cualquier elemento insertado +automáticamente) puede examinarse, véase +@rextend{Presentación de las expresiones musicales}. Esto puede +ser de utilidad en la determinación de lo que puede modificarse +por medio de una instrucción @code{\tweak}. @seealso Manual de aprendizaje: @@ -2438,9 +2483,9 @@ Manual de extensión: @cindex control, trucar puntos de No se puede usar la instrucción @code{\tweak} para modificar los -puntos de control de una sola de varias ligaduras de unión dentro de -un acorde, aparte de la primera que se encuentre en el código de -entrada. +puntos de control de una sola de varias ligaduras de unión dentro +de un acorde, aparte de la primera que se encuentre en el código +de entrada. @node set frente a override @@ -2451,71 +2496,76 @@ entrada. @funindex \set @funindex \override -Tanto @code{\set} como @code{\override} manipulan propiedades -asociadas a contextos. En ambos casos las propiedades tienen en -cuenta la jerarquía de contextos: las propiedades no establecidas en -el propio contexto presentan los valores del contexto padre -respectivo. - -El valor y la duración en el tiempo de las propiedades de contexto son -dinámicos y están disponibles solamente cuando la música se está -interpretando o @q{iterando}. En el momento de la creación del -contexto, se inicializan las propiedades a partir de la definición de -contexto correspondiente y las posibles modificaciones de contexto. -Después de esto, cualquier cambio se obtiene a través de instrucciones -de establecimiento de propiedades dentro de la propia música. - -Ahora bien, las definiciones de grob (objetos gráficos) son una clase -especial de propiedades de contexto. Dado que su estructura, -mantenimiento y utilización es distinta de las propiedades de contexto -ordinarias, se accede a ellas con un conjunto de instrucciones -diferente, y se estudian por separado dentro de la documentación. - -A diferencia de las propiedades de contexto normales, las definiciones -de grob están subdivididas en propiedades de grob. Un @qq{grob} -(objeto gráfico) se crea normalmente por parte de un grabador en el -momento de la interpretación de una expresión musical y recibe sus -propiedades iniciales de la definición de grob en curso del contexto -del grabador. El grabador (u otras partes del @q{backend} de -LilyPond) pueden después añadir o modificar propiedades del grob, pero -ello no afecta a la definición de grob del contexto. - -Lo que conocemos como @q{propiedades de grob} en el contexto del -trucaje a nivel de usuario son en realidad las propiedades de la -definición de grob de un contexto. A diferencia de las propiedades de -contexto normales, las definiciones de grob mantienen la contabilidad -necesaria para seguir la pista de sus partes, las propiedades de grob -individuales (e incluso subpropiedades de éstos), de forma separada, -de forma que es posible definir dichas partes dentro de contextos -diferentes y hacer que la definición de grob en su conjunto, en el -momento de la creación del grob, se monte a partir de las piezas -proporcionadas en diferentes contextos entre el contexto actual y sus -contextos padre. - -Las definiciones de grob se manipulan usando @code{\override} y -@code{\revert} y tienen un nombre que empieza con una letra mayúscula -(como @samp{NoteHead}) mientras que las propiedades de contexto -ordinarias se manipulan utilizando @code{\set} y @code{\unset} y se -nombran empezando en letra minúscula. + +Tanto la instrucción @code{\set} como @code{\override} manipulan +propiedades asociadas a contextos. En ambos casos las propiedades +siguen una@emph{jerarquía de contextos}: las propiedades que no se +establecen dentro del contexto aún presentan los valores del +contexto de su padre respectivo. + +El valor y la duración en el tiempo de una propiedad de contexto +son dinámicos y están disponibles solamente cuando la música se +está interpretando o @q{iterando}. En el momento de la creación +del contexto, se inicializan las propiedades a partir de las +definiciones correspondientes (así como otras posibles +modificaciones) de dicho contexto. Cualquier cambio posterior se +obtiene a través de instrucciones de establecimiento de +propiedades dentro de la propia música. + +Las definiciones de grob (objetos gráficos) son una clase +@emph{especial} de propiedades de contexto, pues su estructura y +uso son distintos de las propiedades de contexto ordinarias. A +diferencia de las propiedades de los contextos normales, las +definiciones de grob se subdividen en @emph{propiedades de grob}. + +Además, en contraste con las propiedades de contexto normales, las +definiciones de grob tienen su propio conjunto de @q{utilidades de +mantenimiento} de las propiedades individuales y, en su caso, +sub-propiedades. Esto supone que es posible definir las distintas +partes dentro de diferentes contextos y aún tener la definición +completa del grob en el momento de su creación, montada a partir +de todas las piezas proporcionadas por el contexto actual y su +ancestro o ancestros, conjuntamente. + +Un grob u objeto gráfico se crea normalmente por parte de un +grabador en el momento de la interpretación de una expresión +musical y recibe sus propiedades iniciales de la definición de +grob en curso del contexto del grabador. El grabador (u otras +partes del @q{backend} de LilyPond) pueden después modificar (o +añadirse a) las propiedades iniciales del grob; sin embargo, ello +no afecta a la definición de grob del contexto. + +Lo que LilyPond conoce como @q{propiedades de grob} en el contexto +del trucaje a nivel de usuario son en realidad las propiedades de +la definición de grob de un contexto. + +Se accede a las definiciones de grob con un conjunto de +instrucciones diferente. Se manipulan usando @code{\override} y +@code{\revert} y tienen un nombre que empieza con una letra +mayúscula (como @samp{NoteHead}) mientras que las propiedades de +contexto ordinarias se manipulan utilizando @code{\set} y +@code{\unset} y se nombran empezando en letra minúscula. @cindex tweak, relación con @code{\override} @funindex \tweak @funindex \overrideProperty -Las instrucciones especiales @code{\tweak} y @code{\overrideProperty} -cambian las propiedades de grob pasando por encima de las propiedades -de contexto completamente. En su lugar, atrapan a los grobs tan -pronto se crean, y después establecen propiedades sobre ellos -directamente cuando se originan a partir de un evento musical trucado -o son de un tipo en particular, respectivamente. + +Las instrucciones @code{\tweak} y @code{\overrideProperty} cambian +las propiedades de grob pasando por encima de las propiedades de +contexto completamente. En su lugar, atrapan a los grobs tan +pronto se crean, y establecen propiedades sobre ellos directamente +con @code{\tweak} cuando se originan a partir de un evento musical +o, en el caso de @code{\overrideProperty}, para una sobreescritura +específica. @node Modificación de las listas-A @subsection Modificación de las listas-A @translationof Modifying alists -Ciertas propiedades configurables por parte del usuario se representan -internamente como @emph{listas-A} (listas asociativas), que almacenan -duplas de @emph{claves} y @emph{valores}. La estructura de una -lista-A es la siguiente: +Ciertas propiedades configurables por parte del usuario se +representan internamente como @emph{listas-A} (listas +asociativas), que almacenan duplas de @emph{claves} y +@emph{valores}. La estructura de una lista-A es la siguiente: @example '((@var{clave1} . @var{valor1}) @@ -2525,19 +2575,18 @@ lista-A es la siguiente: @end example Si una lista-A es una propiedad de un grob o una variable de -@code{\paper}, sus claves se pueden modificar individualmente sin que -afecte a las otras claves. +@code{\paper}, sus claves se pueden modificar individualmente sin +que afecte a las otras claves. Por ejemplo, para reducir el espacio entre pentagramas adyacentes dentro de un grupo, use la propiedad @code{staff-staff-spacing} -del grob @code{StaffGrouper}. La propiedad es una lista-A con cuatro -claves: @code{basic-distance} (distancia básica), -@code{minimum-distance} (distancia mínima), @code{padding} (relleno) -y @code{stretchability} (ampliabilidad). -Los ajustes estándar para esta propiedad -se relacionan en la sección -@qq{Backend} de la Referencia de Funcionamiento Interno -(véase @rinternals{StaffGrouper}): +del grob @code{StaffGrouper}. La propiedad es una lista-A con +cuatro claves: @code{basic-distance} (distancia básica), +@code{minimum-distance} (distancia mínima), @code{padding} +(relleno) y @code{stretchability} (ampliabilidad). Los ajustes +estándar para esta propiedad se relacionan en la sección +@qq{Backend} de la Referencia de Funcionamiento Interno (véase +@rinternals{StaffGrouper}): @example '((basic-distance . 9) @@ -2546,11 +2595,11 @@ se relacionan en la sección (stretchability . 5)) @end example -Una forma de acercar los pentagramas entre sí es reducir el valor de -la clave @code{basic-distance} (@code{9}) para que se corresponda con -el valor de @code{minimum-distance} (@code{7}). Para modificar una -única clave de forma individual, utilice una @emph{declaración -anidada}: +Una forma de acercar los pentagramas entre sí es reducir el valor +de la clave @code{basic-distance} (@code{9}) para que se +corresponda con el valor de @code{minimum-distance} (@code{7}). +Para modificar una única clave de forma individual, utilice una +@emph{declaración anidada}: @lilypond[quote,verbatim] % default space between staves @@ -2571,16 +2620,16 @@ anidada}: La utilización de una declaración anidada actualiza la clave especificada (como @code{basic-distance} en el ejemplo anterior) -sin alterar ninguna -de las otras claves que ya se habían establecido para la misma -propiedad. +sin alterar ninguna de las otras claves que ya se habían +establecido para la misma propiedad. -Ahora, supongamos que deseamos que los pentagramas estén tan próximos -como sea posible sin que se superpongan. La manera más sencilla de -hacerlo es establecer las cuatro claves de la lista-A a cero. Sin -embargo, no es necesario escribir cuatro declaraciones anidadas, una -por cada clave. En lugar de eso, se puede redefinir completamente la -propiedad con una sola declaración, como una lista-A: +Ahora, supongamos que deseamos que los pentagramas estén tan +próximos como sea posible sin que se superpongan. La manera más +sencilla de hacerlo es establecer las cuatro claves de la lista-A +a cero. Sin embargo, no es necesario escribir cuatro +declaraciones anidadas, una por cada clave. En lugar de eso, se +puede redefinir completamente la propiedad con una sola +declaración, como una lista-A: @lilypond[quote,verbatim] \new PianoStaff \with { @@ -2596,12 +2645,12 @@ propiedad con una sola declaración, como una lista-A: @end lilypond Observe que cualquier clave que no haya sido relacionada -explícitamente en la definición de la lista-A, será reiniciada a sus -valores @emph{predeterminados si no se han fijado}. En el caso de -@code{staff-staff-spacing}, el valor de cualquier clave no fijada se -reiniciaría a cero (excepto @code{stretchability}, que toma el valor -de @code{basic-distance} si no se fija). Así, las dos declaraciones -siguientes son equivalentes: +explícitamente en la definición de la lista-A, será reiniciada a +sus valores @emph{predeterminados si no se han fijado}. En el +caso de @code{staff-staff-spacing}, el valor de cualquier clave no +fijada se reiniciaría a cero (excepto @code{stretchability}, que +toma el valor de @code{basic-distance} si no se fija). Así, las +dos declaraciones siguientes son equivalentes: @example \override StaffGrouper.staff-staff-spacing = @@ -2616,20 +2665,21 @@ siguientes son equivalentes: Una consecuencia de esto (posiblemente no intencionada) es la eliminación de cualquier valor estándar que se establezca en un -archivo de inicio y que se carga cada vez que se compila un archivo de -entrada. En el ejemplo anterior, los ajustes estándar para -@code{padding} y @code{minimum-distance} (definidos en +archivo de inicio y que se carga cada vez que se compila un +archivo de entrada. En el ejemplo anterior, los ajustes estándar +para @code{padding} y @code{minimum-distance} (definidos en @file{scm/define-grobs.scm}) se reinician a sus valores -predeterminados si no se han fijado (cero para las dos claves). La -definición de una propiedad o variable como una lista-A (de cualquier -tamaño) siempre reinicia todos los valores de clave no establecidos a -sus valores predeterminados si no se han fijado. Ano ser que este sea -el resultado deseado, es más seguro actualizar los valores de clave -individualmente con una declaración anidada. - -@warning{Las declaraciones anidadas no funcionan para las listas-A de -propiedades de contexto (como @code{beamExceptions}, -@code{keySignature}, @code{timeSignatureSettings}, etc.). Estas +predeterminados si no se han fijado (cero para las dos claves). +La definición de una propiedad o variable como una lista-A (de +cualquier tamaño) siempre reinicia todos los valores de clave no +establecidos a sus valores predeterminados si no se han fijado. +Ano ser que este sea el resultado deseado, es más seguro +actualizar los valores de clave individualmente con una +declaración anidada. + +@warning{Las declaraciones anidadas no funcionan para las listas-A +de propiedades de contexto (como @code{beamExceptions}, +@code{keyAlterations}, @code{timeSignatureSettings}, etc.). Estas propiedades sólo se pueden modificar redefiniéndolas completamente como listas-A.} @@ -2643,6 +2693,7 @@ como listas-A.} * Modos de entrada:: * Dirección y posición:: * Distancias y medidas:: +* Dimensiones:: * Propiedades del símbolo del pentagrama:: * Objetos de extensión:: * Visibilidad de los objetos:: @@ -2650,40 +2701,42 @@ como listas-A.} * Rotación de objetos:: @end menu - @node Modos de entrada @subsection Modos de entrada @translationof Input modes La forma en que se interpreta la notación contenida dentro de un -archivo de entrada, está determinada por el modo de entrada en curso. +archivo de entrada, está determinada por el modo de entrada en +curso. -@strong{Modo de acordes} +@subsubsubheading Modo de acordes Se activa con la instrucción @code{\chordmode} y produce que la -entrada se interprete con al sintaxis de la notación de acordes, véase -@ref{Notación de acordes}. Los acordes se imprimen como notas sobre un -pentagrama. +entrada se interprete con al sintaxis de la notación de acordes, +véase @ref{Notación de acordes}. Los acordes se imprimen como +notas sobre un pentagrama. El modo de acordes se activa también con la instrucción -@code{\chords}. Esto crea también un contexto @code{ChordNames} nuevo -y produce que el código que sigue se interprete con la sintaxis de la -notación de acordes y se imprima como nombres de acorde dentro del -contexto @code{ChordNames}, véase @ref{Impresión de los nombres de acorde}. +@code{\chords}. Esto crea también un contexto @code{ChordNames} +nuevo y produce que el código que sigue se interprete con la +sintaxis de la notación de acordes y se imprima como nombres de +acorde dentro del contexto @code{ChordNames}, véase @ref{Impresión +de los nombres de acorde}. -@strong{Modo de percusión} +@subsubsubheading Modo de percusión -Se activa con la instrucción @code{\drummode} y produce que el código -de entrada se interprete con la sintaxis de la notación de percusión, -véase @ref{Notación básica de percusión}. +Se activa con la instrucción @code{\drummode} y produce que el +código de entrada se interprete con la sintaxis de la notación de +percusión, véase @ref{Notación básica de percusión}. El modo de percusión también se activa con la instrucción -@code{\drums}. También crea un contexto @code{DrumStaff} nuevo y hace -que el código que sigue se interprete con la sintaxis de la notación -de percusión y se imprima como símbolos de percusión sobre un -pentagrama de percusión, véase @ref{Notación básica de percusión}. +@code{\drums}. También crea un contexto @code{DrumStaff} nuevo y +hace que el código que sigue se interprete con la sintaxis de la +notación de percusión y se imprima como símbolos de percusión +sobre un pentagrama de percusión, véase @ref{Notación básica de +percusión}. -@strong{Modo de cifras} +@subsubsubheading Modo de cifras Se activa con la instrucción @code{\figuremode} y hace que el código de entrada se interprete con la sintaxis del bajo cifrado, véase @@ -2696,7 +2749,7 @@ con la sintaxis del bajo cifrado y se imprima como símbolos de bajo cifrado dentro del contexto @code{FiguredBass}, véase @ref{Introducción al bajo cifrado}. -@strong{Modos de traste y tablatura} +@subsubsubheading Modos de traste y tablatura No existen modos de entrada especiales para introducir símbolos de trastes y de tablatura. @@ -2705,94 +2758,85 @@ Para crear diagramas de trastes, escriba las notas o acordes en el modo de notas e imprímalos dentro de un contexto @code{TabStaff}, véase @ref{Tablaturas predeterminadas}. -Para crear diagramas de trastes encima de un pentagrama, escríbalos -como elementos de marcado encima de las notas utilizando la -instrucción @code{\fret-diagram}, véase @ref{Marcas de diagramas de trastes}. +Para crear diagramas de trastes encima de un pentagrama, podemos +elegir entre dos posibilidades. Se puede usar el contexto +@code{FretBoards} (véase @ref{Diagramas de traste automáticos}) o +se pueden introducir como elementos de marcado encima de las notas +utilizando la instrucción @code{\fret-diagram}, véase +@ref{Marcas de diagramas de trastes}. -@strong{Modo de letra} +@subsubsubheading Modo de letra -Se activa con la instrucción @code{\lyricmode}, y hace que la entrada -se interprete como sílabas de la letra de la canción con duraciones -opcionales y modificadores de letra asociados, véase @ref{Música vocal}. +Se activa con la instrucción @code{\lyricmode}, y hace que la +entrada se interprete como sílabas de la letra de la canción con +duraciones opcionales y modificadores de letra asociados, véase +@ref{Música vocal}. El modo de letra también se habilita con la instrucción -@code{\addlyrics}. Esto también crea un contexto @code{Lyrics} nuevo -y una instrucción @code{\lyricsto} implícita que asocia la letra que -viene a continuación con la música precedente. +@code{\addlyrics}. Esto también crea un contexto @code{Lyrics} +nuevo y una instrucción @code{\lyricsto} implícita que asocia la +letra que viene a continuación con la música precedente. -@strong{Modo de marcado} +@subsubsubheading Modo de marcado -Se activa con la instrucción @code{\markup}, y hace que la entrada se -interprete con la sintaxis del marcado, véase @ref{Text markup commands}. +Se activa con la instrucción @code{\markup}, y hace que la entrada +se interprete con la sintaxis del marcado, véase +@ref{Text markup commands}. -@c silly work-around for texinfo broken-ness -@c (@strong{Note...} causes a spurious cross-reference in Info) -@b{Modo de notas} +@subsubsubheading Modo de notas Es el modo predeterminado o se puede activar con la instrucción -@code{\notemode}. La entrada se interpreta como alturas, duraciones, -marcado, etc. y se imprime como notación musical sobre un pentagrama. +@code{\notemode}. La entrada se interpreta como alturas, +duraciones, marcado, etc. y se imprime como notación musical sobre +un pentagrama. Normalmente no es necesario especificar el modo de notas de forma explícita, pero puede ser útil hacerlo en ciertas situaciones, por ejemplo si estamos en el modo de letra, en el modo de acordes o en -otro modo y queremos insertar algo que solamente se puede hacer con la -sintaxis del modo de notas. - -Por ejemplo, para insertar indicaciones dinámicas para las estrofas de -una pieza coral es necesario entrar en el modo de notas para poder -interpretar dichas indicaciones: - -@lilypond[verbatim,relative=2,quote] -{ c4 c4 c4 c4 } -\addlyrics { - \notemode{\set stanza = \markup{ \dynamic f 1. } } - To be sung loudly -} -\addlyrics { - \notemode{\set stanza = \markup{ \dynamic p 2. } } - To be sung quietly -} -@end lilypond +otro modo y queremos insertar algo que solamente se puede hacer +con la sintaxis del modo de notas. @node Dirección y posición @subsection Dirección y posición @translationof Direction and placement -Al tipografiar música, la dirección y colocación de muchos elementos -es cuestión de elección. Por ejemplo, las plicas de las notas se -pueden dirigir hacia arriba o hacia abajo; la letra, las indicaciones -dinámicas y otras marcas expresivas se pueden colocar encima o debajo -del pentagrama; el texto se pude alinear a la izquierda, a la derecha -o centrado; etc. La mayoría de estas elecciones pueden dejarse que -LilyPond las determine automáticamente, pero en ciertos casos puede -ser deseable forzar una dirección o colocación concreta. +Al tipografiar música, la dirección y colocación de muchos +elementos es cuestión de elección. Por ejemplo, las plicas de las +notas se pueden dirigir hacia arriba o hacia abajo; la letra, las +indicaciones dinámicas y otras marcas expresivas se pueden colocar +encima o debajo del pentagrama; el texto se pude alinear a la +izquierda, a la derecha o centrado; etc. La mayoría de estas +elecciones pueden dejarse que LilyPond las determine +automáticamente, pero en ciertos casos puede ser deseable forzar +una dirección o colocación concreta. @menu * Indicadores de dirección de las articulaciones:: * La propiedad de dirección:: @end menu + @node Indicadores de dirección de las articulaciones @unnumberedsubsubsec Indicadores de dirección de las articulaciones @translationof Articulation direction indicators -De forma predeterminada algunas direcciones siempre son hacia arriba o -siempre hacia abajo (p. ej. los matices o el calderón), mientras que -otras cosas pueden alternar entre arriba y abajo en función de la -dirección de las plicas (como las ligaduras o los acentos). +De forma predeterminada algunas direcciones siempre son hacia +arriba o siempre hacia abajo (p. ej. los matices o el calderón), +mientras que otras cosas pueden alternar entre arriba y abajo en +función de la dirección de las plicas (como las ligaduras o los +acentos). @c TODO Add table showing these -Se puede sobreescribir la acción predeterminada mediante el prefijado -de la articulación por un @emph{indicacor de dirección}. Están -disponibles tres indicadores de dirección: @code{^} (que significa -@qq{arriba}), @code{_} (que significa @qq{abajo}) o @code{-} (que -significa @qq{usar la dirección predeterminada}). El indicador de -dirección se puede normalmente omitir, en cuyo caso se supone el -indicador predeterminado @code{-}, pero se necesita un indicador de -dirección @strong{siempre} antes de: +Se puede sobreescribir la acción predeterminada mediante el +prefijado de la articulación por un @emph{indicacor de dirección}. +Están disponibles tres indicadores de dirección: @code{^} (que +significa @qq{arriba}), @code{_} (que significa @qq{abajo}) o +@code{-} (que significa @qq{usar la dirección predeterminada}). +El indicador de dirección se puede normalmente omitir, en cuyo +caso se supone el indicador predeterminado @code{-}, pero se +necesita un indicador de dirección @strong{siempre} antes de: @itemize @item las instrucciones @code{\tweak} @@ -2805,13 +2849,16 @@ dirección @strong{siempre} antes de: Estas indicaciones afectan sólo a la nota siguiente. -@lilypond[verbatim,quote,relative=2] -c2( c) -c2_( c) -c2( c) -c2^( c) +@lilypond[verbatim,quote] +\relative { + c''2( c) + c2_( c) + c2( c) + c2^( c) +} @end lilypond + @node La propiedad de dirección @unnumberedsubsubsec La propiedad de dirección @translationof The direction property @@ -2819,15 +2866,16 @@ c2^( c) La posición o dirección de muchos objetos de presentación está controlada por la propiedad @code{direction}. -El valor de la propiedad @code{direction} se puede establecer al valor -@code{1}, con el significado de @qq{hacia arriba} o @qq{encima}, o a -@w{@code{-1}}, con el significado de @qq{hacia abajo} o @qq{debajo}. -Se pueden usar los símbolos @code{UP} y @code{DOWN} en sustitución de -@code{1} y @w{@code{-1}} respectivamente. La dirección predeterminada -se puede especificar estableciendo @code{direction} a @code{0} ó a -@code{CENTER}. De forma alternativa, en muchos casos existen -instrucciones predefinidas para especificar la dirección. Todas ellas -son de la forma: +El valor de la propiedad @code{direction} se puede establecer al +valor @code{1}, con el significado de @qq{hacia arriba} o +@qq{encima}, o a @w{@code{-1}}, con el significado de @qq{hacia +abajo} o @qq{debajo}. Se pueden usar los símbolos @code{UP} y +@code{DOWN} en sustitución de @code{1} y @w{@code{-1}} +respectivamente. La dirección predeterminada se puede especificar +estableciendo @code{direction} a @code{0} ó a @code{CENTER}. De +forma alternativa, en muchos casos existen instrucciones +predefinidas para especificar la dirección. Todas ellas son de la +forma: @example @code{\xxxUp}, @code{\xxxDown} o @code{\xxxNeutral} @@ -2835,29 +2883,34 @@ son de la forma: @noindent donde @code{\xxxNeutral} significa @qq{utilizar la dirección -predeterminada}. Véase @rlearning{Objetos interiores al pentagrama}. - -En alguna que otra ocasión como en el arpegio, el -valor de la propiedad @code{direction} puede especificar si el objeto se debe -colocar a la izquierda o a la derecha del objeto padre. En este caso -@w{@code{-1}} ó @code{LEFT} significan @qq{a la izquierda} y @code{1} -ó @code{RIGHT} significan @qq{a la derecha}. @code{0} ó @code{CENTER} -significan @qq{utilizar la dirección predeterminada}. - -Estas indicaciones afectan a todas las notas hasta que son canceladas. - -@lilypond[verbatim,quote,relative=2] -c2( c) -\slurDown -c2( c) -c2( c) -\slurNeutral -c2( c) +predeterminada}. Véase @rlearning{Objetos interiores al +pentagrama}. + +En alguna que otra ocasión como en el arpegio, el valor de la +propiedad @code{direction} puede especificar si el objeto se debe +colocar a la izquierda o a la derecha del objeto padre. En este +caso @w{@code{-1}} ó @code{LEFT} significan @qq{a la izquierda} y +@code{1} ó @code{RIGHT} significan @qq{a la derecha}. @code{0} ó +@code{CENTER} significan @qq{utilizar la dirección +predeterminada}. + +Estas indicaciones afectan a todas las notas hasta que son +canceladas. + +@lilypond[verbatim,quote] +\relative { + c''2( c) + \slurDown + c2( c) + c2( c) + \slurNeutral + c2( c) +} @end lilypond -En música polifónica, en general es mejor especificar una voz explícita -que cambiar la dirección de un objeto. Para ver más información, -véase @ref{Varias voces}. +En música polifónica, en general es mejor especificar una voz +explícita que cambiar la dirección de un objeto. Para ver más +información, véase @ref{Varias voces}. @seealso Manual de aprendizaje: @@ -2879,46 +2932,50 @@ Referencia de la notación: @funindex \in @funindex \pt -Las distancias en LilyPond son de dos tipos: absolutas y escaladas. - -Las distancias absolutas se usan para especificar márgenes, sangrados -y otros detalles de diseño de página, y de forma predeterminada se -especifican en milímetros. Las distancias se pueden especificar en -otras unidades escribiendo después de la cifra indicativa de la -cantidad, @code{\mm}, @code{\cm}, @code{\in}@tie{}(pulgadas), o -@code{\pt}@tie{}(puntos, 1/72.27 pulgadas). Las distancias de diseño -de página se pueden especificar también en unidades escalables (véase -el párrafo siguiente) adjuntando @code{\staff-space} a la cantidad. -La disposición de página se describe en detalle en -@ref{Disposición de la página}. +Las distancias en LilyPond son de dos tipos: absolutas y +escaladas. + +Las distancias absolutas se usan para especificar márgenes, +sangrados y otros detalles de diseño de página, y de forma +predeterminada se especifican en milímetros. Las distancias se +pueden especificar en otras unidades escribiendo después de la +cifra indicativa de la cantidad, @code{\mm}, @code{\cm}, +@code{\in}@tie{}(pulgadas), o @code{\pt}@tie{}(puntos, 1/72.27 +pulgadas). Las distancias de diseño de página se pueden +especificar también en unidades escalables (véase el párrafo +siguiente) adjuntando @code{\staff-space} a la cantidad. La +disposición de página se describe en detalle en @ref{Disposición +de la página}. Las distancias escaladas siempre se especifican en unidades de un -espacio del pentagrama o, más raramente, medio espacio del pentagrama. -El espacio de pentagrama es la distancia entre dos líneas del -pentagrama adyacentes. El valor predeterminado se puede cambiar -globalmente fijando el tamaño global del pentagrama, o se puede -sobreescribir localmente cambiando la propiedad @code{staff-space} del -objeto @code{StaffSymbol}. Las distancias escaladas se escalan -automáticamente con cualquier cambio al tamaño global del pentagrama o -a la propiedad @code{staff-space} del objeto @code{StaffSymbol}, pero -las fuentes tipográficas se escalan solamente con los cambios -efectuados al tamaño global del pentagrama. Así, el tamaño global del -pentagrama posibilita la fácil variación del tamaño general de una -partitura impresa. Para ver los métodos de establecimiento del tamaño -global del pentagrama, véase @ref{Establecer el tamaño del pentagrama}. +espacio del pentagrama o, más raramente, medio espacio del +pentagrama. El espacio de pentagrama es la distancia entre dos +líneas del pentagrama adyacentes. El valor predeterminado se +puede cambiar globalmente fijando el tamaño global del pentagrama, +o se puede sobreescribir localmente cambiando la propiedad +@code{staff-space} del objeto @code{StaffSymbol}. Las distancias +escaladas se escalan automáticamente con cualquier cambio al +tamaño global del pentagrama o a la propiedad @code{staff-space} +del objeto @code{StaffSymbol}, pero las fuentes tipográficas se +escalan solamente con los cambios efectuados al tamaño global del +pentagrama. Así, el tamaño global del pentagrama posibilita la +fácil variación del tamaño general de una partitura impresa. Para +ver los métodos de establecimiento del tamaño global del +pentagrama, véase @ref{Establecer el tamaño del pentagrama}. @funindex magstep -Si se necesita dibujar sólo una sección de una partitura a una escala -distinta, por ejemplo una sección ossia o una nota al pie, no se puede -simplemente cambiar el tamaño global del pentagrama porque esto -afectaría a toda la partitura. En tales casos, el cambio de tamaño se -hace sobreescribiendo tanto la propiedad @code{staff-space} de -@code{StaffSymbol} como el tamaño de las fuentes tipográficas. Está a -nuestra disposición una función de Scheme, @code{magstep}, para -convertir de un cambio en el tamaño de la fuente al cambio equivalente -en @code{staff-space}. Para ver una explicación y un ejemplo de su -utilización, consulte @rlearning{Longitud y grosor de los objetos}. +Si se necesita dibujar sólo una sección de una partitura a una +escala distinta, por ejemplo una sección ossia o una nota al pie, +no se puede simplemente cambiar el tamaño global del pentagrama +porque esto afectaría a toda la partitura. En tales casos, el +cambio de tamaño se hace sobreescribiendo tanto la propiedad +@code{staff-space} de @code{StaffSymbol} como el tamaño de las +fuentes tipográficas. Está a nuestra disposición una función de +Scheme, @code{magstep}, para convertir de un cambio en el tamaño +de la fuente al cambio equivalente en @code{staff-space}. Para +ver una explicación y un ejemplo de su utilización, consulte +@rlearning{Longitud y grosor de los objetos}. @seealso Manual de aprendizaje: @@ -2929,6 +2986,38 @@ Referencia de la notación: @ref{Establecer el tamaño del pentagrama}. +@node Dimensiones +@subsection Dimensiones +@translationof Dimensions + +@cindex dimensiones +@cindex caja circundante + +Las dimensiones de un objeto gráfico especifican las posiciones de +los límites izquierdo y derecho, así como los límites inferior y +superior de las cajas limítrofes de los objetos como distancias a +partir del punto de referencia del objeto en unidades de espacios +de pentagrama. Estas posiciones se codifican frecuentemente como +dos parejas de valores de Scheme. Por ejemplo, la instrucción de +marcado de texto @code{\with-dimensions} toma tres argumentos, de +los cuales los dos primeros son una pareja de Scheme que da las +posiiciones de los bordes izquierdo y derecho y otra pareja de +Scheme que da las posiciones de los límites inferior y superior: + +@example +\with-dimensions #'(-5 . 10) #'(-3 . 15) @var{arg} +@end example + +Esto especifica una caja circundante para @var{arg} con su límite +izquierdo en -5, su límite derecho en 10, el inferior en -3 y el +superior e 15, todos ellos medidos a partir del punto de +referencia del objeto en unidades de espacios de pentagrama. + +@seealso +Referencia de la notación: +@ref{Distancias y medidas}. + + @node Propiedades del símbolo del pentagrama @subsection Propiedades del símbolo del pentagrama @translationof Staff symbol properties @@ -2942,32 +3031,32 @@ Referencia de la notación: @c is used in a snippet to thicken centre line. @c If retained, add @ref to here in 1.6.2 -td -Se puede definir al mismo tiempo la posición vertical de las líneas de -la pauta y el número de líneas de la misma. Como muestra el siguiente -ejemplo, las posiciones de las notas no están influidas por las -posiciones de las líneas de la pauta. +Se puede definir al mismo tiempo la posición vertical de las +líneas de la pauta y el número de líneas de la misma. Como +muestra el siguiente ejemplo, las posiciones de las notas no están +influidas por las posiciones de las líneas de la pauta. @warning{La propiedad @code{'line-positions} sobreescribe a la -propiedad @code{'line-count}. El número de líneas de la pauta está -definido implícitamente por el número de elementos de la lista de -valores de @code{'line-positions}.} +propiedad @code{'line-count}. El número de líneas de la pauta +está definido implícitamente por el número de elementos de la +lista de valores de @code{'line-positions}.} -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.line-positions = #'(7 3 0 -4 -6 -7) } -{ a4 e' f b | d1 } +\relative { a4 e' f b | d1 } @end lilypond -Se puede modificar la anchura de la pauta. Las unidades son espacios -de pentagrama. El espaciado de los objetos dentro del pentagrama no -resulta afectado por este ajuste. +Se puede modificar la anchura de la pauta. Las unidades son +espacios de pentagrama. El espaciado de los objetos dentro del +pentagrama no resulta afectado por este ajuste. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.width = #23 } -{ a4 e' f b | d1 } +\relative { a4 e' f b | d1 } @end lilypond @@ -2977,16 +3066,17 @@ resulta afectado por este ajuste. Muchos objetos de notación musical abarcan varias notas o incluso varios compases. Son ejemplos los crescendi, trinos, corchetes de -grupo especial y corchetes de primera y segunda vez. Estos objetos se -llaman @qq{spanners} u «objetos de extensión», y tienen propiedades -especiales para controlar su apariencia y comportamiento. Algunas de -estas propiedades son comunes a todos los objetos de extensión; otras -se limitan a un subconjunto de los extensores. +grupo especial y corchetes de primera y segunda vez. Estos +objetos se llaman @qq{spanners} u «objetos de extensión», y tienen +propiedades especiales para controlar su apariencia y +comportamiento. Algunas de estas propiedades son comunes a todos +los objetos de extensión; otras se limitan a un subconjunto de los +extensores. Todos los objetos de extensión contemplan el interface -@code{spanner-interface}. Algunos, básicamente aquellos que trazan -una línea recta entre los dos objetos, contemplan también el interface -@code{line-spanner-interface}. +@code{spanner-interface}. Algunos, básicamente aquellos que +trazan una línea recta entre los dos objetos, contemplan también +el interface @code{line-spanner-interface}. @menu * Uso del spanner-interface:: @@ -3031,101 +3121,109 @@ Works not at all for: @end ignore -@lilypond[verbatim,quote,relative=2] -a~ a -a +@lilypond[verbatim,quote,fragment] +a'~ a' +a' % increase the length of the tie -\tweak minimum-length #5 -~ a +~ a' @end lilypond -@lilypond[verbatim,quote,relative=2] -a1 -\compressFullBarRests -R1*23 -% increase the length of the rest bar -\once \override MultiMeasureRest.minimum-length = #20 -R1*23 -a1 +@lilypond[verbatim,quote] +\relative \compressMMRests { + a'1 + R1*23 + % increase the length of the rest bar + \once \override MultiMeasureRest.minimum-length = #20 + R1*23 + a1 +} @end lilypond -@lilypond[verbatim,quote,relative=2] -a \< a a a \! -% increase the length of the hairpin -\override Hairpin.minimum-length = #20 -a \< a a a \! +@lilypond[verbatim,quote] +\relative { + a' \< a a a \! + % increase the length of the hairpin + \override Hairpin.minimum-length = #20 + a \< a a a \! +} @end lilypond -Esta sobreescritura se puede usar también para aumentar la longitud de -las ligaduras de expresión y de fraseo: +Esta sobreescritura se puede usar también para aumentar la +longitud de las ligaduras de expresión y de fraseo: -@lilypond[verbatim,quote,relative=2] -a( g) -a --\tweak minimum-length #5 -( g) +@lilypond[verbatim,quote] +\relative { + a'( g) + a + -\tweak minimum-length #5 + ( g) -a\( g\) -a --\tweak minimum-length #5 -\( g\) + a\( g\) + a + -\tweak minimum-length #5 + \( g\) +} @end lilypond Para algunos objetos de presentación, la propiedad -@code{minimum-length} es efectiva sólo si se llama explícitamente al -procedimiento @code{set-spacing-rods}. Para hacerlo, se debe fijar la -propiedad @code{springs-and-rods} al valor -@code{ly:spanner::set-spacing-rods}. Por ejemplo, la longitud mínima -de un glissando no tiene efecto a no ser que se establezca la -propiedad @code{springs-and-rods}: - -@lilypond[verbatim,quote,relative=1] +@code{minimum-length} es efectiva sólo si se llama explícitamente +al procedimiento @code{set-spacing-rods}. Para hacerlo, se debe +fijar la propiedad @code{springs-and-rods} al valor +@code{ly:spanner::set-spacing-rods}. Por ejemplo, la longitud +mínima de un glissando no tiene efecto a no ser que se establezca +la propiedad @code{springs-and-rods}: + +@lilypond[verbatim,fragment,quote] % default -e \glissando c' +e' \glissando c'' % not effective alone \once \override Glissando.minimum-length = #20 -e, \glissando c' +e' \glissando c'' % effective only when both overrides are present \once \override Glissando.minimum-length = #20 \once \override Glissando.springs-and-rods = #ly:spanner::set-spacing-rods -e, \glissando c' +e' \glissando c'' @end lilypond Lo mismo se puede decir del objeto @code{Beam}: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,fragment,quote] % not effective alone \once \override Beam.minimum-length = #20 -e8 e e e +e'8 e' e' e' % effective only when both overrides are present \once \override Beam.minimum-length = #20 \once \override Beam.springs-and-rods = #ly:spanner::set-spacing-rods -e8 e e e +e'8 e' e' e' @end lilypond @subsubsubheading La propiedad @code{to-barline} La segunda propiedad útil del @code{spanner-interface} es @code{to-barline}. De forma predeterminada tiene el valor cierto, -haciendo que los reguladores y otros objetos de extensión que terminan -sobre la primera nota de un compás, en vez de eso terminen en la línea -divisoria inmediatamente precedente. Si se establece al valor falso, -el extensor llegará más allá de la barra de compás y terminará -exactamente sobre la nota: - -@lilypond[verbatim,quote,relative=2] -a \< a a a a \! a a a \break -\override Hairpin.to-barline = ##f -a \< a a a a \! a a a +haciendo que los reguladores y otros objetos de extensión que +terminan sobre la primera nota de un compás, en vez de eso +terminen en la línea divisoria inmediatamente precedente. Si se +establece al valor falso, el extensor llegará más allá de la barra +de compás y terminará exactamente sobre la nota: + +@lilypond[verbatim,quote] +\relative { + a' \< a a a a \! a a a \break + \override Hairpin.to-barline = ##f + a \< a a a a \! a a a +} @end lilypond -Esta propiedad no es efectiva para todos los extensores. Por ejemplo, -su establecimiento a @code{#t} no tienen ningún efecto sobre las -ligaduras de expresión o de fraseo, o sobre otros extensores para los -que terminar en la barra de compás no tendría ningún significado. +Esta propiedad no es efectiva para todos los extensores. Por +ejemplo, su establecimiento a @code{#t} no tienen ningún efecto +sobre las ligaduras de expresión o de fraseo, o sobre otros +extensores para los que terminar en la barra de compás no tendría +ningún significado. @node Uso del line-spanner-interface @unnumberedsubsubsec Uso del @code{line-spanner-interface} @@ -3143,104 +3241,108 @@ Entre los objetos que contemplan el interface @end itemize La rutina responsable de dibujar los sellos de estos extensores es -@code{ly:line-interface::print}. esta rutina determina la -localización exacta de los dos puntos extremos y traza una línea entre -ellos, en el estilo solicitado. Las posiciones de los dos puntos -extremos del extensor se calculan al vuelo, pero es posible +@code{ly:line-spanner::print}. esta rutina determina la +localización exacta de los dos puntos extremos y traza una línea +entre ellos, en el estilo solicitado. Las posiciones de los dos +puntos extremos del extensor se calculan al vuelo, pero es posible sobreescribir sus coordenadas Y. Las propiedades que se deben especificar están anidadas a dos niveles de profundidad en la jerarquía de propiedades, pero la sintaxis de la instrucción @code{\override} es bastante sencilla: -@lilypond[relative=2,quote,verbatim] -e2 \glissando b +@lilypond[quote,fragment,verbatim] +e''2 \glissando b' \once \override Glissando.bound-details.left.Y = #3 \once \override Glissando.bound-details.right.Y = #-2 -e2 \glissando b +e''2 \glissando b' @end lilypond Las unidades para la propiedad @code{Y} son @code{staff-space}s, siendo el punto del cero la línea central del pentagrama. Para el glissando, esto es el valor de @code{Y} en la coordenada X que -corresponde al punto central de cada cabeza de nota si nos imaginamos -que la línea se extiende hasta allí. +corresponde al punto central de cada cabeza de nota si nos +imaginamos que la línea se extiende hasta allí. Si no está fijado @code{Y}, su valor se calcula a partir de la -posición vertical del punto de anclaje correspondiente del extensor. +posición vertical del punto de anclaje correspondiente del +extensor. En caso de salto de línea, los valores para los puntos extremos se especifican por las sub-listas @code{left-broken} y @code{right-broken} de @code{bound-details}. Por ejemplo: -@lilypond[relative=2,ragged-right,verbatim,quote] +@lilypond[ragged-right,fragment,verbatim,quote] \override Glissando.breakable = ##t \override Glissando.bound-details.right-broken.Y = #-3 -c1 \glissando \break -f1 +c''1 \glissando \break +f''1 @end lilypond -Un número de propiedades adicionales de las sub-listas @code{left} y -@code{right} de la propiedad @code{bound-details} se pueden +Un número de propiedades adicionales de las sub-listas @code{left} +y @code{right} de la propiedad @code{bound-details} se pueden especificar de la misma forma que @code{Y}: @table @code @item Y Establece la coordenada Y del punto extremo, en desplazamientos de -@code{staff-space}s desde la línea central del pentagrama. De forma -predeterminada es el centro del objeto ancla, y así un glissando -apunta al centro vertical de la cabeza de la nota. +@code{staff-space}s desde la línea central del pentagrama. De +forma predeterminada es el centro del objeto ancla, y así un +glissando apunta al centro vertical de la cabeza de la nota. Para extensores horizontales como los extensores de texto y los trinos, está inamoviblemente codificado como 0. @item attach-dir (dirección de anclaje) Determina dónde comienza y termina la línea en la dirección X, con -relación al objeto ancla. Sí, un valor de @w{@code{-1}} (o @code{LEFT}, -izquierda) hace que la línea comience o termine en el lado izquierdo -de la cabeza de la nota a la que está anclado. +relación al objeto ancla. Sí, un valor de @w{@code{-1}} (o +@code{LEFT}, izquierda) hace que la línea comience o termine en el +lado izquierdo de la cabeza de la nota a la que está anclado. @item X -Es la coordenada X absoluta del punto extremo. Se suele calcular al -vuelo, y su sobreescritura no tiene un efecto útil. +Es la coordenada X absoluta del punto extremo. Se suele calcular +al vuelo, y su sobreescritura no tiene un efecto útil. @item stencil (sello) -Los extensores de línea pueden tener símbolos al comienzo o al final, -lo que está contenido en esta sub-propiedad. Esto es para uso -interno; se recomienda en su lugar el uso de @code{text}. +Los extensores de línea pueden tener símbolos al comienzo o al +final, lo que está contenido en esta sub-propiedad. Esto es para +uso interno; se recomienda en su lugar el uso de @code{text}. @item text (texto) -Es un elemento de marcado que se evalúa para dar lugar al sello. Se -usa para escribir @i{cresc.}, @i{tr} y otros textos sobre los objetos -de extensión horizontales. +Es un elemento de marcado que se evalúa para dar lugar al sello. +Se usa para escribir @i{cresc.}, @i{tr} y otros textos sobre los +objetos de extensión horizontales. -@lilypond[quote,ragged-right,relative=2,verbatim] +@lilypond[quote,ragged-right,fragment,verbatim] \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } -c2\startTextSpan b c a\stopTextSpan +\relative { c''2\startTextSpan b c a\stopTextSpan } @end lilypond @item stencil-align-dir-y (alineación del sello en y) @item stencil-offset (desplazamiento del sello) -Si no se modifican uno u otro, el sello se coloca sencillamente en el -punto extremo, centrado sobre la línea, como viene definido por las -subpropiedades @code{X} e @code{Y}. Si se fijan +Si no se modifican uno u otro, el sello se coloca sencillamente en +el punto extremo, centrado sobre la línea, como viene definido por +las subpropiedades @code{X} e @code{Y}. Si se fijan @code{stencil-align-dir-y} o @code{stencil-offset} se moverá el -símbolo del borde verticalmente con relación al extremo de la línea: +símbolo del borde verticalmente con relación al extremo de la +línea: -@lilypond[relative=1,quote,verbatim] +@lilypond[quote,fragment,verbatim] \override TextSpanner.bound-details.left.stencil-align-dir-y = #-2 \override TextSpanner.bound-details.right.stencil-align-dir-y = #UP \override TextSpanner.bound-details.left.text = #"ggg" \override TextSpanner.bound-details.right.text = #"hhh" -c4^\startTextSpan c c c \stopTextSpan + +\relative { c'4^\startTextSpan c c c \stopTextSpan } @end lilypond -Observe que los valores negativos mueven el texto @emph{hacia arriba}, -al contrario de lo que podría esperarse, pues el valor de @w{@code{-1}} o -@code{DOWN} (abajo) significa alinear el borde @emph{inferior} del -texto con la línea de extensión. Un valor de @code{1} o @code{UP} -(arriba) alinea el borde superior del texto con la línea extensora. +Observe que los valores negativos mueven el texto @emph{hacia +arriba}, al contrario de lo que podría esperarse, pues el valor de +@w{@code{-1}} o @code{DOWN} (abajo) significa alinear el borde +@emph{inferior} del texto con la línea de extensión. Un valor de +@code{1} o @code{UP} (arriba) alinea el borde superior del texto +con la línea extensora. @item arrow (flecha) Al establecer esta sub-propiedad a @code{#t} se produce una punta de @@ -3248,26 +3350,30 @@ flecha en el extremo de la línea. @item padding (relleno) Esta sub-propiedad controla el espacio entre el punto extremo -especificado de la línea y el extremo real. Sin relleno, un glissando -empezaría y terminaría en el centro de la cabeza de las notas. +especificado de la línea y el extremo real. Sin relleno, un +glissando empezaría y terminaría en el centro de la cabeza de las +notas. @end table -La función musical @code{\endSpanners} finaliza de forma prematura el -extensor que comienza sobre la nota que sigue inmediatamente a +La función musical @code{\endSpanners} finaliza de forma prematura +el extensor que comienza sobre la nota que sigue inmediatamente a continuación. Se termina después de una nota exactamente, o en la siguiente barra de compás si @code{to-barline} es verdadero y se produce una divisoria antes de la siguiente nota. -@lilypond[verbatim,quote,ragged-right,relative=2] -\endSpanners -c2 \startTextSpan c2 c2 -\endSpanners -c2 \< c2 c2 +@lilypond[verbatim,quote,ragged-right] +\relative c'' { + \endSpanners + c2 \startTextSpan c2 c2 + \endSpanners + c2 \< c2 c2 +} @end lilypond -Si se usa @code{\endSpanners} no es necesario cerrar \startTextSpan -con \stopTextSpan, ni cerrar los reguladores con @code{\!}. +Si se usa @code{\endSpanners} no es necesario cerrar +\startTextSpan con \stopTextSpan, ni cerrar los reguladores con +@code{\!}. @seealso Referencia de funcionamiento interno: @@ -3286,17 +3392,18 @@ Referencia de funcionamiento interno: @cindex grobs, visibilidad de @cindex visibilidad de los objetos -Hay cuatro formas principales en que se puede controlar la visibilidad -de los objetos de presentación: se puede eliminar su sello, se pueden -volver transparentes, se pueden pintar de blanco, o se puede -sobreescribir su propiedad @code{break-visibility}. Las tres primeras -se aplican a todos los objetos de presentación; la última sólo a unos -pocos: los objetos @emph{divisibles}. El Manual de aprendizaje -introduce estas cuatro técnicas, -véase @rlearning{Visibilidad y color de los objetos}. +Hay cuatro formas principales en que se puede controlar la +visibilidad de los objetos de presentación: se puede eliminar su +sello, se pueden volver transparentes, se pueden pintar de blanco, +o se puede sobreescribir su propiedad @code{break-visibility}. +Las tres primeras se aplican a todos los objetos de presentación; +la última sólo a unos pocos: los objetos @emph{divisibles}. El +Manual de aprendizaje introduce estas cuatro técnicas, véase +@rlearning{Visibilidad y color de los objetos}. Hay también algunas otras técnicas que son específicas de ciertos -objetos de presentación. Se estudian bajo Consideraciones especiales. +objetos de presentación. Se estudian bajo Consideraciones +especiales. @menu * Eliminar el sello:: @@ -3314,13 +3421,13 @@ objetos de presentación. Se estudian bajo Consideraciones especiales. @cindex sello, eliminar @funindex \omit -Todo objeto de presentación tiene una propiedad stencil (sello). De -forma predeterminada está establecida a la función específica que -dibuja ese objeto. Si se sobreescribe esta propiedad a @code{#f} no -se llama a ninguna función y el objeto no se dibuja. La acción -predeterminada se puede recuperar con @code{\revert}. +Todo objeto de presentación tiene una propiedad stencil (sello). +De forma predeterminada está establecida a la función específica +que dibuja ese objeto. Si se sobreescribe esta propiedad a +@code{#f} no se llama a ninguna función y el objeto no se dibuja. +La acción predeterminada se puede recuperar con @code{\revert}. -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,fragment,verbatim] a1 a \override Score.BarLine.stencil = ##f a a @@ -3328,10 +3435,10 @@ a a a a a @end lilypond -Esta operación, bastante común, tiene la forma abreviada @code{\omit} -como atajo: +Esta operación, bastante común, tiene la forma abreviada +@code{\omit} como atajo: -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,fragment,verbatim] a1 a \omit Score.BarLine a a @@ -3349,22 +3456,22 @@ a a a Todo objeto de presentación tiene una propiedad transparent (transparente) que de forma predeterminada está establecida a -@code{#f}. Si se fija a @code{#t} el objeto aún ocupa espacio pero es -invisible. +@code{#f}. Si se fija a @code{#t} el objeto aún ocupa espacio +pero es invisible. -@lilypond[quote,verbatim,relative=2] -a4 a +@lilypond[quote,fragment,verbatim] +a'4 a' \once \override NoteHead.transparent = ##t -a a +a' a' @end lilypond Esta operación, bastante común, tiene la forma abreviada @code{\hide} como atajo: -@lilypond[quote,verbatim,relative=2] -a4 a +@lilypond[quote,fragment,verbatim] +a'4 a' \once \hide NoteHead -a a +a' a' @end lilypond @@ -3380,43 +3487,43 @@ a a @cindex objetos, sobreescritura de @cindex grobs, sobreescritura de -Todo objeto de presentación tiene una propiedad de color que de forma -predeterminada está establecida a @code{black} (negro). Si se -sobreescribe a @code{white} (blanco) el objeto será indistinguible del -fondo blanco. Sin embargo, si el objeto cruza a otros objetos, el -color de los puntos de cruce queda determinado por el orden en que se -dibujan estos objetos, lo que puede dejar una imagen fantasma del -objeto blanco, como puede verse aquí: +Todo objeto de presentación tiene una propiedad de color que de +forma predeterminada está establecida a @code{black} (negro). Si +se sobreescribe a @code{white} (blanco) el objeto será +indistinguible del fondo blanco. Sin embargo, si el objeto cruza +a otros objetos, el color de los puntos de cruce queda determinado +por el orden en que se dibujan estos objetos, lo que puede dejar +una imagen fantasma del objeto blanco, como puede verse aquí: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \override Staff.Clef.color = #white -a1 +a'1 @end lilypond -Se puede evitar esto cambiando el orden de impresión de los objetos. -Todos los objetos de presentación tienen una propiedad @code{layer} -(capa) que se debe establecer a un valor entero. Los objetos con el -valor de @code{layer} más bajo se dibujan primero, después se dibujan -los objetos con valores progresivamente mayores, y así los objetos con -valores más altos se dibujan encima de los que tienen valores más -bajos. De forma predeterminada, casi todos los objetos tienen -asignado un valor @code{layer} de @code{1}, aunque algunos objetos, -entre ellos el pentagrama y las líneas divisorias, @code{StaffSymbol} -y @code{BarLine}, tienen asignado un calor de @code{0}. El orden de -impresión de los objetos con el mismo valor de @code{layer} es -indeterminado. - -En el ejemplo de arriba, la clave blanca, con un valor @code{layer} -predeterminado de @code{1}, se dibuja después de las líneas del -pentagrama (valor @code{layer} predeterminado de @code{0}), -sobreimpresionándolas. Para cambiarlo, se debe dar al objeto -@code{Clef} un valor de @code{layer} más bajo, digamos @w{@code{-1}}, -para que se dibuje antes: - -@lilypond[quote,verbatim,relative=2] +Se puede evitar esto cambiando el orden de impresión de los +objetos. Todos los objetos de presentación tienen una propiedad +@code{layer} (capa) que se debe establecer a un valor entero. Los +objetos con el valor de @code{layer} más bajo se dibujan primero, +después se dibujan los objetos con valores progresivamente +mayores, y así los objetos con valores más altos se dibujan encima +de los que tienen valores más bajos. De forma predeterminada, +casi todos los objetos tienen asignado un valor @code{layer} de +@code{1}, aunque algunos objetos, entre ellos el pentagrama y las +líneas divisorias, @code{StaffSymbol} y @code{BarLine}, tienen +asignado un calor de @code{0}. El orden de impresión de los +objetos con el mismo valor de @code{layer} es indeterminado. + +En el ejemplo de arriba, la clave blanca, con un valor +@code{layer} predeterminado de @code{1}, se dibuja después de las +líneas del pentagrama (valor @code{layer} predeterminado de +@code{0}), sobreimpresionándolas. Para cambiarlo, se debe dar al +objeto @code{Clef} un valor de @code{layer} más bajo, digamos +@w{@code{-1}}, para que se dibuje antes: + +@lilypond[quote,fragment,verbatim] \override Staff.Clef.color = #white \override Staff.Clef.layer = #-1 -a1 +a'1 @end lilypond @@ -3428,58 +3535,59 @@ a1 @cindex break-visibility -Casi todos los objetos de presentación se imprimen una sola vez, pero -algunos como las líneas divisorias, claves, indicaciones de compás y -armaduras de tonalidad, se pueden tener que imprimir dos veces cuando -se produce un salto de línea : una vez al final de la línea y otra al -comienzo de la siguiente. Estos objetos reciben el nombre de -@emph{divisibles}, y tienen una propiedad, @code{break-visibility} -(visibilidad en el salto), para controlar su visibilidad en las tres -posiciones en que pueden aparecer: al comienzo de una línea, dentro de -la línea si se produce un cambio, y al final de la línea si el cambio -se produce en ese lugar. +Casi todos los objetos de presentación se imprimen una sola vez, +pero algunos como las líneas divisorias, claves, indicaciones de +compás y armaduras de tonalidad, se pueden tener que imprimir dos +veces cuando se produce un salto de línea : una vez al final de la +línea y otra al comienzo de la siguiente. Estos objetos reciben +el nombre de @emph{divisibles}, y tienen una propiedad, +@code{break-visibility} (visibilidad en el salto), para controlar +su visibilidad en las tres posiciones en que pueden aparecer: al +comienzo de una línea, dentro de la línea si se produce un cambio, +y al final de la línea si el cambio se produce en ese lugar. Por ejemplo, la indicación de compás se imprime de forma -predeterminada al comienzo de la primera línea y en ningún otro lugar -a no ser que cambie, en cuyo caso se imprime en el punto en que se -produce el cambio. Si este cambio se produce al final de una línea, -la nueva indicación de compás se imprime al principio de la línea -siguiente y también al final de la línea anterior como indicación de -precaución. +predeterminada al comienzo de la primera línea y en ningún otro +lugar a no ser que cambie, en cuyo caso se imprime en el punto en +que se produce el cambio. Si este cambio se produce al final de +una línea, la nueva indicación de compás se imprime al principio +de la línea siguiente y también al final de la línea anterior como +indicación de precaución. Este comportamiento se controla por medio de la propiedad @code{break-visibility}, que se explica en @c Leave this ref on a newline - formats incorrectly otherwise -td -@rlearning{Visibilidad y color de los objetos}. Esta propiedad toma un -vector de tres valores booleanos que, por orden, determinan si el -objeto se imprime al final, dentro, o al principio de la línea. O, -para ser más exactos: antes del salto de línea, si no hay salto, o -después del salto. +@rlearning{Visibilidad y color de los objetos}. Esta propiedad +toma un vector de tres valores booleanos que, por orden, +determinan si el objeto se imprime al final, dentro, o al +principio de la línea. O, para ser más exactos: antes del salto +de línea, si no hay salto, o después del salto. Como alternativa se puede especificar cualquiera de las ocho -combinaciones mediante funciones predefinidas cuya definición está en -@file{scm/output-lib.scm}, donde las tres últimas columnas indican si -los objetos de presentación serán visibles en las posiciones que se -muestran en el encabezamiento de cada columna: +combinaciones mediante funciones predefinidas cuya definición está +en @file{scm/output-lib.scm}, donde las tres últimas columnas +indican si los objetos de presentación serán visibles en las +posiciones que se muestran en el encabezamiento de cada columna: -@multitable {@code{begin-of-line-invisible}} {@code{'#(#t #t #t)}} {Antes del} {Si no hay} {Después del} +@multitable {@code{begin-of-line-invisible}} {@code{#(#t #t #t)}} {Antes del} {Si no hay} {Después del} @headitem Forma @tab Forma @tab Antes del @tab Si no hay @tab Después del @headitem de función @tab de vector @tab salto @tab salto @tab salto -@item @code{all-visible} @tab @code{'#(#t #t #t)} @tab sí @tab sí @tab sí -@item @code{begin-of-line-visible} @tab @code{'#(#f #f #t)} @tab no @tab no @tab sí -@item @code{center-visible} @tab @code{'#(#f #t #f)} @tab no @tab sí @tab no -@item @code{end-of-line-visible} @tab @code{'#(#t #f #f)} @tab sí @tab no @tab no -@item @code{begin-of-line-invisible} @tab @code{'#(#t #t #f)} @tab sí @tab sí @tab no -@item @code{center-invisible} @tab @code{'#(#t #f #t)} @tab sí @tab no @tab sí -@item @code{end-of-line-invisible} @tab @code{'#(#f #t #t)} @tab no @tab sí @tab sí -@item @code{all-invisible} @tab @code{'#(#f #f #f)} @tab no @tab no @tab no +@item @code{all-visible} @tab @code{#(#t #t #t)} @tab sí @tab sí @tab sí +@item @code{begin-of-line-visible} @tab @code{#(#f #f #t)} @tab no @tab no @tab sí +@item @code{center-visible} @tab @code{#(#f #t #f)} @tab no @tab sí @tab no +@item @code{end-of-line-visible} @tab @code{#(#t #f #f)} @tab sí @tab no @tab no +@item @code{begin-of-line-invisible} @tab @code{#(#t #t #f)} @tab sí @tab sí @tab no +@item @code{center-invisible} @tab @code{#(#t #f #t)} @tab sí @tab no @tab sí +@item @code{end-of-line-invisible} @tab @code{#(#f #t #t)} @tab no @tab sí @tab sí +@item @code{all-invisible} @tab @code{#(#f #f #f)} @tab no @tab no @tab no @end multitable -Los ajustes predeterminados de @code{break-visibility} dependen del -objeto de presentación. La tabla siguiente muestra todos los objetos -de presentación de interés que resultan afectados por -@code{break-visibility} y el ajuste predeterminado de esta propiedad: +Los ajustes predeterminados de @code{break-visibility} dependen +del objeto de presentación. La tabla siguiente muestra todos los +objetos de presentación de interés que resultan afectados por +@code{break-visibility} y el ajuste predeterminado de esta +propiedad: @multitable @columnfractions .3 .3 .4 @@ -3508,31 +3616,44 @@ de presentación de interés que resultan afectados por El ejemplo de abajo muestra el uso de la forma de vector para controlar la visibilidad de las líneas divisorias: -@lilypond[quote,verbatim,relative=1,ragged-right] -f4 g a b -f4 g a b -% Remove bar line at the end of the current line -\once \override Score.BarLine.break-visibility = ##(#f #t #t) -\break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + f'4 g a b + f4 g a b + % Remove bar line at the end of the current line + \once \override Score.BarLine.break-visibility = ##(#f #t #t) + \break + f4 g a b + f4 g a b +} @end lilypond -Aunque los tres componentes del vector utilizado para sobreescribir -@code{break-visibility} deben estar presentes, no todos son efectivos -para todos los objetos de presentación, y algunas combinaciones pueden -incluso dar errores. Son de aplicación las siguientes limitaciones: +Aunque los tres componentes del vector utilizado para +sobreescribir @code{break-visibility} deben estar presentes, no +todos son efectivos para todos los objetos de presentación, y +algunas combinaciones pueden incluso dar errores. Son de +aplicación las siguientes limitaciones: @itemize @bullet -@item Las líneas divisorias no se pueden imprimir al principio de la línea. -@item No se puede imprimir el número de compás al principio de la primera -línea a no ser que su valor establecido sea distinto de 1. -@item Clave: véase más abajo -@item Las repeticiones dobles de tipo porcentaje se imprimen completamente o -se suprimen por completo. Utilice begin-of line-invisible para -imprimirlas y all-invisible para suprimirlas. -@item Armadura: véase más abajo -@item ClefModifier: véase más abajo +@item +Las líneas divisorias no se pueden imprimir al principio de la línea. + +@item +No se puede imprimir el número de compás al principio de la +@emph{primera} línea a no ser que su valor establecido sea +distinto de @code{1}. + +@item Clave: véase la sección siguiente. + +@item +Las repeticiones dobles de tipo porcentaje se imprimen todas +siempre o bien no se imprimen nunca. Utilice @code{begin-of +line-invisible} para imprimirlas y @code{all-invisible} para +suprimirlas. + +@item Armadura: véase la sección siguiente. + +@item ClefModifier: véase la sección siguiente. @end itemize @@ -3547,73 +3668,82 @@ imprimirlas y all-invisible para suprimirlas. @cindex clave, visibilidad después de un cambio explícito @cindex explicitClefVisibility -La propiedad @code{break-visibility} controla la visibilidad de las -armaduras y cambios de clave sólo al principio de las líneas, es -decir, después de un salto. No tiene ningún efecto sobre la -visibilidad de la armadura o la clave después de un cambio explícito -de tonalidad o de clave dentro o al final de una línea. En el ejemplo -siguiente la armadura que sigue al cambio explícito de tonalidad a Si -bemol mayor es visible incluso con @code{all-invisible} establecido. - -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -% Try to remove all key signatures -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b -\break -f4 g a b -f4 g a b +La propiedad @code{break-visibility} controla la visibilidad de +las armaduras y cambios de clave sólo al principio de las líneas, +es decir, después de un salto. No tiene ningún efecto sobre la +visibilidad de la armadura o la clave después de un cambio +explícito de tonalidad o de clave dentro o al final de una línea. +En el ejemplo siguiente la armadura que sigue al cambio explícito +de tonalidad a Si bemol mayor es visible incluso con +@code{all-invisible} establecido. + +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + % Try to remove all key signatures + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b + \break + f4 g a b + f4 g a b +} @end lilypond -La visibilidad de estos cambios explícitos de tonalidad y de clave se -controla por medio de las propiedades -@code{explicitKeySignatureVisibility} y @code{explicitClefVisibility}. -Son los equivalentes de la propiedad @code{break-visibility} y las dos -toman un vector de tres valores booleanos o las funciones predefinidas -relacionadas anteriormente, exactamente igual que -@code{break-visibility}. Las dos son propiedades del contexto Staff, -no de los propios objetos de presentación, y por tanto se establecen -utilizando la instrucción @code{\set}. Las dos están establecidas de -forma predeterminada al valor @code{all-visible}. Estas propiedades +La visibilidad de estos cambios explícitos de tonalidad y de clave +se controla por medio de las propiedades +@code{explicitKeySignatureVisibility} y +@code{explicitClefVisibility}. Son los equivalentes de la +propiedad @code{break-visibility} y las dos toman un vector de +tres valores booleanos o las funciones predefinidas relacionadas +anteriormente, exactamente igual que @code{break-visibility}. Las +dos son propiedades del contexto Staff, no de los propios objetos +de presentación, y por tanto se establecen utilizando la +instrucción @code{\set}. Las dos están establecidas de forma +predeterminada al valor @code{all-visible}. Estas propiedades controlan sólo la visibilidad de las armaduras y las claves que resultan de los cambios explícitos y no afectan a las armaduras y -tonalidades que están al principio de las líneas; para quitarlas, aún -se debe sobreescribir la propiedad @code{break-visibility} en el -objeto correspondiente. +tonalidades que están al principio de las líneas; para quitarlas, +aún se debe sobreescribir la propiedad @code{break-visibility} en +el objeto correspondiente. -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond @subsubsubheading Visibilidad de las alteraciones de precaución -Para eliminar las alteraciones de cancelación que se imprimen en un -cambio de tonalidad explícito, establezca la propiedad +Para eliminar las alteraciones de cancelación que se imprimen en +un cambio de tonalidad explícito, establezca la propiedad @code{printKeyCancellation} del contexto Staff a @code{#f}: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\set Staff.printKeyCancellation = ##f -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \set Staff.printKeyCancellation = ##f + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond Con estas sobreescrituras solamente permanecen las alteraciones -accidentales delante de las notas para indicar el cambio de tonalidad. +accidentales delante de las notas para indicar el cambio de +tonalidad. Observe que al modificar la tonalidad a Do@tie{}mayor o La@tie{}menor, las alteraciones de cancelación serían @emph{la @@ -3621,30 +3751,34 @@ La@tie{}menor, las alteraciones de cancelación serían @emph{la establecimiento de @code{printKeyCancellation} al valor @code{#f} no tiene ningún efecto: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\set Staff.printKeyCancellation = ##f -\key c \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \set Staff.printKeyCancellation = ##f + \key c \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond En lugar de ello, para suprimir las alteraciones de cancelación aún cuando la armadura cambia a Do@tie{}mayor o a La@tie{}menor, sobreescriba la visibilidad del grob @code{KeyCancellation}: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\override Staff.KeyCancellation.break-visibility = #all-invisible -\key c \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \override Staff.KeyCancellation.break-visibility = #all-invisible + \key c \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond @c TODO Add visibility of cautionary accidentals before notes @@ -3654,15 +3788,16 @@ f4 g a b @cindex automaticBars @cindex líneas divisorias, eliminación -Como caso especial, la impresión de las líneas divisorias también se -puede inhabilitar estableciendo la propiedad @code{automaticBars} en -el contexto Score. Si se fija a @code{#f}, las barras de compás no se -imprimen automáticamente; se deben crear explícitamente con una -instrucción @code{\bar}. A diferencia de la instrucción predefinida -@code{\cadenzaOn}, los compases se siguen contando. La generación de -compases continúa de acuerdo a esta cuenta si esta propiedad se -establece posteriormente a @code{#t}. Si se fija al valor @code{#f}, -sólo pueden producirse saltos de línea en instrucciones @code{\bar} +Como caso especial, la impresión de las líneas divisorias también +se puede inhabilitar estableciendo la propiedad +@code{automaticBars} en el contexto Score. Si se fija a +@code{#f}, las barras de compás no se imprimen automáticamente; se +deben crear explícitamente con una instrucción @code{\bar}. A +diferencia de la instrucción predefinida @code{\cadenzaOn}, los +compases se siguen contando. La generación de compases continúa +de acuerdo a esta cuenta si esta propiedad se establece +posteriormente a @code{#t}. Si se fija al valor @code{#f}, sólo +pueden producirse saltos de línea en instrucciones @code{\bar} explícitas. @c TODO Add example @@ -3695,30 +3830,34 @@ Manual de aprendizaje: @translationof Line styles Ciertas indicaciones de ejecución, p.ej., @i{rallentando}, -@i{accelerando} y los @i{trinos} se escriben como texto y se extienden -sobre muchos compases mediante líneas, a veces punteadas u onduladas. - -Todos ellos usan las mismas rutinas que el glissando para dibujar los -textos y las líneas, y por ello el ajuste fino de su comportamiento se -hace de la misma manera. Se hace con un spanner (un objeto de -extensión), y la rutina responsable de dibujar los objetos de -extensión es @code{ly:line-interface::print}. Esta rutina determina la -colocación exacta de los dos @i{extremos del objeto de extensión} y -dibuja una línea entre ellos, en el estilo solicitado. - -He aquí un ejemplo de los distintos estilos de línea disponibles, y -cómo aplicarles ajustes finos. - -@lilypond[relative=2,ragged-right,verbatim,quote] -d2 \glissando d'2 -\once \override Glissando.style = #'dashed-line -d,2 \glissando d'2 -\override Glissando.style = #'dotted-line -d,2 \glissando d'2 -\override Glissando.style = #'zigzag -d,2 \glissando d'2 -\override Glissando.style = #'trill -d,2 \glissando d'2 +@i{accelerando} y los @i{trinos} se escriben como texto y se +extienden sobre muchos compases mediante líneas, a veces punteadas +u onduladas. + +Todos ellos usan las mismas rutinas que el glissando para dibujar +los textos y las líneas, y por ello el ajuste fino de su +comportamiento se hace de la misma manera. Se hace con un spanner +(un objeto de extensión), y la rutina responsable de dibujar los +objetos de extensión es @code{ly:line-spanner::print}. Esta rutina +determina la colocación exacta de los dos @i{extremos del objeto +de extensión} y dibuja una línea entre ellos, en el estilo +solicitado. + +He aquí un ejemplo de los distintos estilos de línea disponibles, +y cómo aplicarles ajustes finos. + +@lilypond[ragged-right,verbatim,quote] +\relative { + d''2 \glissando d'2 + \once \override Glissando.style = #'dashed-line + d,2 \glissando d'2 + \override Glissando.style = #'dotted-line + d,2 \glissando d'2 + \override Glissando.style = #'zigzag + d,2 \glissando d'2 + \override Glissando.style = #'trill + d,2 \glissando d'2 +} @end lilypond Las posiciones de los puntos extremos del objeto de extensión se @@ -3726,22 +3865,24 @@ computan al vuelo para cada uno de los objetos gráficos, pero es posible sobreescribirlos: @c TODO Complete -@lilypond[relative=2,ragged-right,verbatim,quote] -e2 \glissando f -\once \override Glissando.bound-details.right.Y = #-2 -e2 \glissando f +@lilypond[ragged-right,verbatim,quote] +\relative { + e''2 \glissando f + \once \override Glissando.bound-details.right.Y = #-2 + e2 \glissando f +} @end lilypond -El valor de @code{Y} está establecido a @w{@code{-2}} para el extremo -derecho. El lado izquierdo se puede ajustar de forma similar -especificando @code{left} en vez de @code{right}. +El valor de @code{Y} está establecido a @w{@code{-2}} para el +extremo derecho. El lado izquierdo se puede ajustar de forma +similar especificando @code{left} en vez de @code{right}. Si no está establecido @code{Y}, el valor se computa a partir de la posición vertical de los puntos de anclaje izquierdo y derecho del extensor. -Son posibles otros ajustes de los extensores, para ver más detalles -consulte @ref{Objetos de extensión}. +Son posibles otros ajustes de los extensores, para ver más +detalles consulte @ref{Objetos de extensión}. @node Rotación de objetos @@ -3749,8 +3890,8 @@ consulte @ref{Objetos de extensión}. @translationof Rotating objects Tanto los objetos de presentación como los elementos de texto de -marcado se pueden girar cualquier ángulo respecto a cualquier punto, -pero difiere el método de hacerlo. +marcado se pueden girar cualquier ángulo respecto a cualquier +punto, pero difiere el método de hacerlo. @menu * Rotación de objetos de presentación:: @@ -3766,26 +3907,26 @@ pero difiere el método de hacerlo. Todos los objetos de presentación que contemplan el interface @code{grob-interface} se pueden rotar estableciendo su propiedad -@code{rotation}. Acepta una lista de tres elementos: el ángulo de la -rotación en sentido antihorario, y las coordenadas x e y del punto con -relación al punto de referencia del objeto, alrededor del que se va a -realizar la rotación. El ángulo de rotación se especifica en grados -y las coordenadas en espacios de pentagrama. +@code{rotation}. Acepta una lista de tres elementos: el ángulo de +la rotación en sentido antihorario, y las coordenadas x e y del +punto con relación al punto de referencia del objeto, alrededor +del que se va a realizar la rotación. El ángulo de rotación se +especifica en grados y las coordenadas en espacios de pentagrama. -El ángulo de rotación y las coordenadas del punto de rotación se deben -determinar por ensayo y error. +El ángulo de rotación y las coordenadas del punto de rotación se +deben determinar por ensayo y error. @cindex reguladores en ángulo @cindex ángulo, reguladores en Solamente en ciertas ocasiones es útil la rotación de objetos de -presentación; el ejemplo siguiente muestra una situación en que puede -serlo: +presentación; el ejemplo siguiente muestra una situación en que +puede serlo: -@lilypond[quote,verbatim,relative=1] -g4\< e' d' f\! +@lilypond[quote,fragment,verbatim] +g4\< e' d'' f''\! \override Hairpin.rotation = #'(20 -1 0) -g,,4\< e' d' f\! +g4\< e' d'' f''\! @end lilypond @@ -3793,22 +3934,23 @@ g,,4\< e' d' f\! @unnumberedsubsubsec Rotación de elementos de marcado @translationof Rotating markup -Todos los textos de marcado se pueden rotar para que se dispongan en -cualquier ángulo precediéndolos de la instrucción @code{\rotate}. La -instrucción acepta dos argumentos: el ángulo de rotación en grados en -sentido antihorario, y el texto que rotar. Los límites que ocupa el -texto no se rotan: toman su valor a partir de los extremos de las -coordenadas x e y del texto rotado. En el ejemplo siguiente la -propiedad @code{outside-staff-priority} del texto se establece a -@code{#f} para desactivar la evitación automática de colisiones, lo -que empuja al texto a una posición muy alta. - -@lilypond[quote,verbatim,relative=1] +Todos los textos de marcado se pueden rotar para que se dispongan +en cualquier ángulo precediéndolos de la instrucción +@code{\rotate}. La instrucción acepta dos argumentos: el ángulo +de rotación en grados en sentido antihorario, y el texto que +rotar. Los límites que ocupa el texto no se rotan: toman su valor +a partir de los extremos de las coordenadas x e y del texto +rotado. En el ejemplo siguiente la propiedad +@code{outside-staff-priority} del texto se establece a @code{#f} +para desactivar la evitación automática de colisiones, lo que +empuja al texto a una posición muy alta. + +@lilypond[quote,fragment,verbatim] \override TextScript.outside-staff-priority = ##f g4^\markup { \rotate #30 "a G" } b^\markup { \rotate #30 "a B" } -des^\markup { \rotate #30 "a D-Flat" } -fis^\markup { \rotate #30 "an F-Sharp" } +des'^\markup { \rotate #30 "a D-Flat" } +fis'^\markup { \rotate #30 "an F-Sharp" } @end lilypond @@ -3855,48 +3997,49 @@ Referencia de funcionamiento interno: @translationof Aligning objects Los objetos gráficos que soportan el interface -@code{self-alignment-interface} y/o el @code{side-position-interface} -se pueden alinear contra un objeto colocado previamente, de diversas -maneras. Para ver una lista de estos objetos, consulte -@rinternals{self-alignment-interface} y +@code{self-alignment-interface} y/o el +@code{side-position-interface} se pueden alinear contra un objeto +colocado previamente, de diversas maneras. Para ver una lista de +estos objetos, consulte @rinternals{self-alignment-interface} y @rinternals{side-position-interface}. Todos los objetos gráficos tienen un punto de referencia, una extensión horizontal y una extensión vertical. La extensión horizontal es una pareja de números que dan los desplazamientos a partir del punto de referencia de los bordes izquierdo y derecho, -siendo negativos los desplazamientos hacia la izquierda. La extensión -vertical es una pareja de números que dan el desplazamiento a partir -del punto de referencia hasta los bordes inferior y superior, siendo -negativos los desplazamientos hacia abajo. +siendo negativos los desplazamientos hacia la izquierda. La +extensión vertical es una pareja de números que dan el +desplazamiento a partir del punto de referencia hasta los bordes +inferior y superior, siendo negativos los desplazamientos hacia +abajo. La posición de un objeto sobre el pentagrama viene dada por los valores de las propiedades @code{X-offset} e @code{Y-offset}. El -valor de @code{X-offset} da el desplazamiento desde la coordenada X -del punto de referencia del objeto padre, y el valor de -@code{Y-offset} da el desplazamiento a partir de la línea central del -pentagrama. Los valores de @code{X-offset} y @code{Y-offset} se -pueden establecer directamente o se puede dejar que se calculen por -parte de procedimientos para conseguir una alineación con el objeto -padre. +valor de @code{X-offset} da el desplazamiento desde la coordenada +X del punto de referencia del objeto padre, y el valor de +@code{Y-offset} da el desplazamiento a partir de la línea central +del pentagrama. Los valores de @code{X-offset} y @code{Y-offset} +se pueden establecer directamente o se puede dejar que se calculen +por parte de procedimientos para conseguir una alineación con el +objeto padre. @warning{Muchos objetos tienen consideraciones de posicionamiento especiales que hacen que se ignore o se modifique cualquier ajuste realizado a @code{X-offset} o a @code{Y-offset}, a pesar de que el objeto contemple el interface @code{self-alignment-interface}. La -sobreescritura de las propiedades @code{X-offset} ó @code{Y-offset} a -un valor fijo hace que se descarte la respectiva propiedad -@code{self-alignment}.} +sobreescritura de las propiedades @code{X-offset} ó +@code{Y-offset} a un valor fijo hace que se descarte la respectiva +propiedad @code{self-alignment}.} Por ejemplo, una alteración accidental se puede reposicionar verticalmente estableciendo @code{Y-offset} pero los cambios a @code{X-offset} no tienen ningún efecto. Las letras de ensayo se pueden alinear con objetos divisibles como -líneas divisorias, claves, armaduras e indicaciones de compás. Hay -propiedades especiales que se encuentran en -@code{break-aligned-interface} para el posicionamiento de las letras -de ensayo sobre dichos objetos. +líneas divisorias, claves, armaduras e indicaciones de compás. +Hay propiedades especiales que se encuentran en +@code{break-aligned-interface} para el posicionamiento de las +letras de ensayo sobre dichos objetos. @seealso Referencia de la notación: @@ -3917,18 +4060,18 @@ Manual de extensión: @unnumberedsubsubsec Establecer directamente @code{X-offset} y @code{Y-offset} @translationof Setting X-offset and Y-offset directly -Se pueden dar valores numéricos a las propiedades @code{X-offset} y -@code{Y-offset} de muchos objetos. El ejemplo siguiente muestra tres -notas con una digitación en su posición predeterminada y con los -valores @code{X-offset} y @code{Y-offset} modificados. +Se pueden dar valores numéricos a las propiedades @code{X-offset} +y @code{Y-offset} de muchos objetos. El ejemplo siguiente muestra +tres notas con una digitación en su posición predeterminada y con +los valores @code{X-offset} y @code{Y-offset} modificados. -@lilypond[verbatim,quote,relative=2] -a-3 -a +@lilypond[verbatim,fragment,quote] +a'-3 +a' -\tweak X-offset #0 -\tweak Y-offset #0 -3 -a +a' -\tweak X-offset #-1 -\tweak Y-offset #1 -3 @@ -3942,12 +4085,12 @@ a @translationof Using the side-position-interface Un objeto que contempla el @code{side-position-interface} se puede -colocar junto a su objeto padre de forma que los bordes especificados -de los dos objetos se toquen. El objeto se puede situar encima, -debajo, a la derecha o a la izquierda del objeto padre. El padre no -se puede especificar; viene determinado por el orden de los elementos -en el flujo de entrada. Casi todos los objetos tienen la cabeza de la -nota asociada como padre. +colocar junto a su objeto padre de forma que los bordes +especificados de los dos objetos se toquen. El objeto se puede +situar encima, debajo, a la derecha o a la izquierda del objeto +padre. El padre no se puede especificar; viene determinado por el +orden de los elementos en el flujo de entrada. Casi todos los +objetos tienen la cabeza de la nota asociada como padre. Los valores de las propiedades @code{side-axis} y @code{direction} determinan dónde colocar el objeto, como sigue: @@ -3965,17 +4108,19 @@ determinan dónde colocar el objeto, como sigue: @end multitable -Si @code{side-axis} es @code{0}, @code{X-offset} se debe establecer al -procedimiento @code{ly:side-position-interface::x-aligned-side}. Este +Si @code{side-axis} es @code{0}, @code{X-offset} se debe +establecer al procedimiento +@code{ly:side-position-interface::x-aligned-side}. Este procedimiento devuelve el calor correcto de @code{X-offset} para -situar el objeto al lado izquierdo o derecho del padre de acuerdo con -el valor de @code{direction}. +situar el objeto al lado izquierdo o derecho del padre de acuerdo +con el valor de @code{direction}. -Si @code{side-axis} es @code{1}, @code{Y-offset} se debe establecer al -procedimiento @code{ly:side-position-interface::y-aligned-side}. Este +Si @code{side-axis} es @code{1}, @code{Y-offset} se debe +establecer al procedimiento +@code{ly:side-position-interface::y-aligned-side}. Este procedimiento devuelve el valor correcto de @code{Y-offset} para -situar el objeto encima o debajo del padre de acuerdo con el valor de -@code{direction}. +situar el objeto encima o debajo del padre de acuerdo con el valor +de @code{direction}. @c TODO Add examples @@ -3990,24 +4135,25 @@ La alineación horizontal de un objeto que contempla el interface @code{self-alignment-interface} está controlada por el valor de la propiedad @code{self-alignment-X}, siempre y cuando la propiedad @code{X-offset} de este objeto esté establecida a -@code{ly:self-alignment-interface::x-aligned-on-self}. Se le puede -dar a @code{self-alignment-X} cualquier valor real, en unidades de la -mitad de la extensión X total del objeto. Los valores negativos -mueven el objeto a la derecha, los positivos hacia la izquierda. Un -valor de @code{0} centra el objeto sobre el punto de referencia de su -padre, un valor de @w{@code{-1}} alinea el borde izquierdo del objeto -sobre el punto de referencia de su padre, y un valor de @code{1} -alinea el borde derecho del objeto sobre el punto de referencia de su -padre. Se pueden usar los símbolos @code{LEFT}, @code{CENTER} y -@code{RIGHT} en sustitución de los valores @w{@code{-1}}, @code{0} y @code{1}, +@code{ly:self-alignment-interface::x-aligned-on-self}. Se le +puede dar a @code{self-alignment-X} cualquier valor real, en +unidades de la mitad de la extensión X total del objeto. Los +valores negativos mueven el objeto a la derecha, los positivos +hacia la izquierda. Un valor de @code{0} centra el objeto sobre +el punto de referencia de su padre, un valor de @w{@code{-1}} +alinea el borde izquierdo del objeto sobre el punto de referencia +de su padre, y un valor de @code{1} alinea el borde derecho del +objeto sobre el punto de referencia de su padre. Se pueden usar +los símbolos @code{LEFT}, @code{CENTER} y @code{RIGHT} en +sustitución de los valores @w{@code{-1}}, @code{0} y @code{1}, respectivamente. -Normalmente se usaría la instrucción @code{\override} para modificar -el valor de @code{self-alignment-X}, pero se puede usar la instrucción -@code{\tweak} para alinear varias anotaciones por separado sobre una -sola nota: +Normalmente se usaría la instrucción @code{\override} para +modificar el valor de @code{self-alignment-X}, pero se puede usar +la instrucción @code{\tweak} para alinear varias anotaciones por +separado sobre una sola nota: -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim,fragment] a' -\tweak self-alignment-X #-1 ^"left-aligned" @@ -4043,11 +4189,11 @@ padre. Se pueden usar los símbolos @code{DOWN}, @code{CENTER}, Estableciendo tanto @code{X-offset} como @code{Y-offset}, se puede alinear un objeto en las dos direcciones simultáneamente. -El ejemplo siguiente muestra cómo ajustar una digitación de forma que -se acerque a la cabeza de la nota. +El ejemplo siguiente muestra cómo ajustar una digitación de forma +que se acerque a la cabeza dela nota. -@lilypond[quote,verbatim,relative=2] -a +@lilypond[quote,verbatim,fragment] +a' -\tweak self-alignment-X #0.5 % move horizontally left -\tweak Y-offset #ly:self-alignment-interface::y-aligned-on-self -\tweak self-alignment-Y #-1 % move vertically up @@ -4092,61 +4238,62 @@ example shows the difference: @cindex break-align-symbols Las letras de ensayo se pueden alinear con objetos de notación -distintos a las barras de compás. Estos objetos son @code{ambitus}, -@code{breathing-sign}, @code{clef}, @code{custos}, @code{staff-bar}, -@code{left-edge}, @code{key-cancellation}, @code{key-signature} y -@code{time-signature}. +distintos a las barras de compás. Estos objetos son +@code{ambitus}, @code{breathing-sign}, @code{clef}, @code{custos}, +@code{staff-bar}, @code{left-edge}, @code{key-cancellation}, +@code{key-signature} y @code{time-signature}. Cada tipo de objeto tiene su propio punto de referencia predeterminado, con el que se alinean las marcas de ensayo: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % The rehearsal mark will be aligned to the right edge of the Clef \override Score.RehearsalMark.break-align-symbols = #'(clef) \key a \major \clef treble \mark "↓" -e1 +e'1 % The rehearsal mark will be aligned to the left edge of the Time Signature \override Score.RehearsalMark.break-align-symbols = #'(time-signature) \key a \major \clef treble \time 3/4 \mark "↓" -e2. +e'2. % The rehearsal mark will be centered above the Breath Mark \override Score.RehearsalMark.break-align-symbols = #'(breathing-sign) \key a \major \clef treble \time 4/4 -e1 +e'1 \breathe \mark "↓" @end lilypond -Se puede especificar una lista de posibles objetos para la alineación. -Si algunos de los objetos son invisibles en ese punto debido al valor -de @code{break-visibility} o a valores de visibilidad explícitos para -las armaduras y las claves, la letra de ensayo o número de compás se -alinean con el primer objeto de la lista que sea visible. Si ningún -objeto de la lista es visible, el objeto se alinea con la línea -divisoria. Si la línea divisoria es invisible, el objeto se alinea -con el punto en el que se encontraría la línea divisoria. - -@lilypond[verbatim,quote,relative=1] +Se puede especificar una lista de posibles objetos para la +alineación. Si algunos de los objetos son invisibles en ese punto +debido al valor de @code{break-visibility} o a valores de +visibilidad explícitos para las armaduras y las claves, la letra +de ensayo o número de compás se alinean con el primer objeto de la +lista que sea visible. Si ningún objeto de la lista es visible, +el objeto se alinea con la línea divisoria. Si la línea divisoria +es invisible, el objeto se alinea con el punto en el que se +encontraría la línea divisoria. + +@lilypond[verbatim,quote,fragment] % The rehearsal mark will be aligned to the right edge of the Key Signature \override Score.RehearsalMark.break-align-symbols = #'(key-signature clef) \key a \major \clef treble \mark "↓" -e1 +e'1 % The rehearsal mark will be aligned to the right edge of the Clef \set Staff.explicitKeySignatureVisibility = #all-invisible \override Score.RehearsalMark.break-align-symbols = #'(key-signature clef) \key a \major \clef bass \mark "↓" -gis,,1 +gis,1 % The rehearsal mark will be centered above the Bar Line \set Staff.explicitKeySignatureVisibility = #all-invisible \set Staff.explicitClefVisibility = #all-invisible @@ -4154,52 +4301,52 @@ gis,,1 \key a \major \clef treble \mark "↓" -e''1 +e'1 @end lilypond -La alineación de la letra de ensayo con relación al objeto de notación -se puede cambiar, como se ve en el ejemplo siguiente. En una -partitura con varios pentagramas, este ajuste se debe hacer para todos -los pentagramas. +La alineación de la letra de ensayo con relación al objeto de +notación se puede cambiar, como se ve en el ejemplo siguiente. En +una partitura con varios pentagramas, este ajuste se debe hacer +para todos los pentagramas. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % The RehearsalMark will be aligned with the right edge of the Key Signature \override Score.RehearsalMark.break-align-symbols = #'(key-signature) \key a \major \clef treble \time 4/4 \mark "↓" -e1 +e'1 % The RehearsalMark will be centered above the Key Signature \once \override Score.KeySignature.break-align-anchor-alignment = #CENTER \mark "↓" \key a \major -e1 +e'1 % The RehearsalMark will be aligned with the left edge of the Key Signature \once \override Score.KeySignature.break-align-anchor-alignment = #LEFT \key a \major \mark "↓" -e1 +e'1 @end lilypond La letra de ensayo también se puede desplazar al borde derecho o izquierdo en una medida arbitraria. Las unidades son espacios de pentagrama: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % The RehearsalMark will be aligned with the left edge of the Key Signature % and then shifted right by 3.5 staff-spaces \override Score.RehearsalMark.break-align-symbols = #'(key-signature) \once \override Score.KeySignature.break-align-anchor = #3.5 \key a \major \mark "↓" -e1 +e'1 % The RehearsalMark will be aligned with the left edge of the Key Signature % and then shifted left by 2 staff-spaces \once \override Score.KeySignature.break-align-anchor = #-2 \key a \major \mark "↓" -e1 +e'1 @end lilypond @@ -4213,9 +4360,10 @@ Los grobs (objetos gráficos) @code{VerticalAlignment} y @code{VerticalAxisGroup} trabajan de manera coordinada. @code{VerticalAxisGroup} agrupa distintos grobs como @code{Staff}, @code{Lyrics}, etc. Después, @code{VerticalAlignment} alinea los -distintos grobs agrupados previamente por @code{VerticalAxisGroup}. -Normalmente sólo existe un @code{VerticalAlignment} por cada -partitura, pero cada @code{Staff}, @code{Lyrics}, etc. tiene su propio +distintos grobs agrupados previamente por +@code{VerticalAxisGroup}. Normalmente sólo existe un +@code{VerticalAlignment} por cada partitura, pero cada +@code{Staff}, @code{Lyrics}, etc. tiene su propio @code{VerticalAxisGroup}. @@ -4223,29 +4371,31 @@ partitura, pero cada @code{Staff}, @code{Lyrics}, etc. tiene su propio @subsection Modificación de los sellos @translationof Modifying stencils -Todos los objetos de presentación tienen una propiedad @code{stencil} -que es parte del @code{grob-interface}. De forma predeterminada, esta -propiedad suele estar establecida a una función específica del objeto -que está hecha a medida para disponer el símbolo que lo representa en -la salida. Por ejemplo, el ajuste estándar para la propiedad -@code{stencil} del objeto @code{MultiMeasureRest} es -@code{ly:multi-measure-rest::print}. - -El símbolo estándar de cualquier objeto se puede sustituir modificando -la propiedad @code{stencil} para que haga referencia a un -procedimiento diferente escrito especialmente. Esto requiere un alto -nivel de conocimiento del funcionamiento interno de LilyPond, pero hay -una forma más fácil que a menudo puede dar resultados adecuados. +Todos los objetos de presentación tienen una propiedad +@code{stencil} que es parte del @code{grob-interface}. De forma +predeterminada, esta propiedad suele estar establecida a una +función específica del objeto que está hecha a medida para +disponer el símbolo que lo representa en la salida. Por ejemplo, +el ajuste estándar para la propiedad @code{stencil} del objeto +@code{MultiMeasureRest} es @code{ly:multi-measure-rest::print}. + +El símbolo estándar de cualquier objeto se puede sustituir +modificando la propiedad @code{stencil} para que haga referencia a +un procedimiento diferente escrito especialmente. Esto requiere +un alto nivel de conocimiento del funcionamiento interno de +LilyPond, pero hay una forma más fácil que a menudo puede dar +resultados adecuados. El procedimiento es establecer la propiedad @code{stencil} al -procedimiento que imprime texto (@code{ly:text-interface::print}) y -añadir una propiedad @code{text} al objeto ajustada para que contenga -el texto de marcado que produce el símbolo requerido. Debido a la -flexibilidad del marcado, se pueden conseguir muchas cosas; en -particular, consulte @ref{Notación gráfica dentro de elementos de marcado}. +procedimiento que imprime texto (@code{ly:text-interface::print}) +y añadir una propiedad @code{text} al objeto ajustada para que +contenga el texto de marcado que produce el símbolo requerido. +Debido a la flexibilidad del marcado, se pueden conseguir muchas +cosas; en particular, consulte @ref{Notación gráfica dentro de +elementos de marcado}. -El ejemplo siguiente muestra esto cambiando el símbolo de la cabeza de -la nota a unas aspas dentro de una circunferencia. +El ejemplo siguiente muestra esto cambiando el símbolo de la +cabeza de la nota a unas aspas dentro de una circunferencia. @lilypond[verbatim,quote] XinO = { @@ -4256,24 +4406,28 @@ XinO = { \musicglyph #"noteheads.s2cross" } } -\relative c'' { - a a \XinO a a +\relative { + a' a \XinO a a } @end lilypond -Cualquiera de los glifos de la fuente tipográfica Feta se puede pasar -a la instrucción de marcado @code{\musicglyph}: véase @ref{La tipografía Feta}. +Cualquiera de los glifos de la fuente tipográfica Feta se puede +pasar a la instrucción de marcado @code{\musicglyph}: véase +@ref{La tipografía Feta}. -@c TODO Add inserting eps files or ref to later +Se pueden insertar en línea tanto imágenes en formato @file{EPS} +como instrucciones de Postscript usando las instrucciones de +marcado @code{\epsfile} y @code{\postscript} respectivamente; +véase @ref{Graphic}. -@c TODO Add inserting Postscript or ref to later @seealso Referencia de la notación: @ref{Notación gráfica dentro de elementos de marcado}, @ref{Formatear el texto}, @ref{Text markup commands}, -@ref{La tipografía Feta}. +@ref{La tipografía Feta}, +@ref{Graphic}. @node Modificación de las formas @@ -4344,11 +4498,11 @@ curva. En este ejemplo, la colocación automática de la ligadura no resulta óptima, y @code{\tieDown} no es la solución. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] << - { e1~ e } + { e'1~ 1 } \\ - { r4 } + \relative { r4 } >> @end lilypond @@ -4389,14 +4543,14 @@ Así, usando el mismo ejemplo de arriba y la forma siguiente tiene el efecto de elevar la ligadura de unión en la mitad de un espacio de pentagrama: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] << { \shape #'((0 . 0.5) (0 . 0.5) (0 . 0.5) (0 . 0.5)) Tie - e1~ e + e'1~ 1 } \\ - { r4 } + \relative { r4 } >> @end lilypond @@ -4404,13 +4558,13 @@ Este posicionamiento de la ligadura de unión es mejor, pero quizá debería elevarse más en la parte central. El ejemplo siguiente hace esto, esta vez usando la forma alternativa @code{\tweak}: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] << { - e1-\shape #'((0 . 0.5) (0 . 1) (0 . 1) (0 . 0.5)) ~ e + e'1-\shape #'((0 . 0.5) (0 . 1) (0 . 1) (0 . 0.5)) ~ e' } \\ - { r4 } + \relative { r4 } >> @end lilypond @@ -4419,11 +4573,13 @@ control se pueden hacer de la misma forma, y dos curvas distintas que dan comienzo en el mismo momento musical se pueden conformar también: -@lilypond[verbatim,quote,ragged-right,relative=2] -c8(\( a) a'4 e c\) -\shape #'((0.7 . -0.4) (0.5 . -0.4) (0.3 . -0.3) (0 . -0.2)) Slur -\shape #'((0 . 0) (0 . 0.5) (0 . 0.5) (0 . 0)) PhrasingSlur -c8(\( a) a'4 e c\) +@lilypond[verbatim,quote,ragged-right] +\relative { + c''8(\( a) a'4 e c\) + \shape #'((0.7 . -0.4) (0.5 . -0.4) (0.3 . -0.3) (0 . -0.2)) Slur + \shape #'((0 . 0) (0 . 0.5) (0 . 0.5) (0 . 0)) PhrasingSlur + c8(\( a) a'4 e c\) +} @end lilypond La función @code{\shape} también puede desplazar los puntos de @@ -4434,36 +4590,42 @@ de los segmentos en particular, se puede usar una lista vacía como contenedor. En este ejemplo, el salto de línea hace que la única ligadura de expresión aparezca como si fueran dos: -@lilypond[verbatim,quote,ragged-right,relative=1] -c4( f g c -\break -d,4 c' f, c) +@lilypond[verbatim,quote,ragged-right] +\relative { + c'4( f g c + \break + d,4 c' f, c) +} @end lilypond Los cambios en la forma de las dos mitades de la ligadura de expresión deja más claro que la ligadura continúa más allá del salto de línea: -@lilypond[verbatim,quote,ragged-right,relative=1] +@lilypond[verbatim,quote,ragged-right] % () may be used as a shorthand for ((0 . 0) (0 . 0) (0 . 0) (0 . 0)) % if any of the segments does not need to be changed -\shape #'( - (( 0 . 0) (0 . 0) (0 . 0) (0 . 1)) - ((0.5 . 1.5) (1 . 0) (0 . 0) (0 . -1.5)) - ) Slur -c4( f g c -\break -d,4 c' f, c) +\relative c' { + \shape #'( + (( 0 . 0) (0 . 0) (0 . 0) (0 . 1)) + ((0.5 . 1.5) (1 . 0) (0 . 0) (0 . -1.5)) + ) Slur + c4( f g c + \break + d,4 c' f, c) +} @end lilypond En una curva en forma de «S» siempre es necesario ajustar manualmente los puntos de control: LilyPond nunca escoge tales formas automáticamente. -@lilypond[verbatim,quote,relative=2] -c8( e b-> f d' a e-> g) -\shape #'((0 . -1) (5.5 . -0.5) (-5.5 . -10.5) (0 . -5.5)) PhrasingSlur -c8\( e b-> f d' a e-> g\) +@lilypond[verbatim,quote] +\relative c'' { + c8( e b-> f d' a e-> g) + \shape #'((0 . -1) (5.5 . -0.5) (-5.5 . -10.5) (0 . -5.5)) PhrasingSlur + c8\( e b-> f d' a e-> g\) +} @end lilypond @subsubsubheading Especificar los puntos de control explícitamente @@ -4487,23 +4649,25 @@ continuación presentamos un ejemplo de esto. Muestra una forma de indicar una ligadura que se extiende hacia el interior de las casillas de primera y segunda vez de una repetición. -@lilypond[verbatim,quote,relative=2] -c1 -\repeat volta 3 { c4 d( e f } -\alternative { - { g2) d } - { - g2 - % create a slur and move it to a new position - % the <> is just an empty chord to carry the slur termination - -\tweak control-points #'((-2 . 3.8) (-1 . 3.9) (0 . 4) (1 . 3.4)) ( <> ) - f, - } - { - e'2 - % create a slur and move it to a new position - -\tweak control-points #'((-2 . 3) (-1 . 3.1) (0 . 3.2) (1 . 2.4)) ( <> ) - f, +@lilypond[verbatim,quote] +\relative { + c''1 + \repeat volta 3 { c4 d( e f } + \alternative { + { g2) d } + { + g2 + % create a slur and move it to a new position + % the <> is just an empty chord to carry the slur termination + -\tweak control-points #'((-2 . 3.8) (-1 . 3.9) (0 . 4) (1 . 3.4)) ( <> ) + f, + } + { + e'2 + % create a slur and move it to a new position + -\tweak control-points #'((-2 . 3) (-1 . 3.1) (0 . 3.2) (1 . 2.4)) ( <> ) + f, + } } } @end lilypond @@ -4537,27 +4701,29 @@ Referencia de funcionamiento interno: @cindex divididos, modificación de objetos de extensión @funindex \alterBroken -Cuando un @qq{spanner} u objeto extenso atraviesa uno o varios saltos -de línea, cada fragmento hereda los atributos del objeto de extensión -original. Así, el trucado ordinario de un objeto dividido aplica las -mismas modificaciones a todos y cada uno de sus segmentos. En el -ejemplo que aparece a continuación, la sobreescritura de -@code{thickness} (grosor) afecta a la ligadura a ambos lados del salto -de línea. +Cuando un @qq{spanner} u objeto extenso atraviesa uno o varios +saltos de línea, cada fragmento hereda los atributos del objeto de +extensión original. Así, el trucado ordinario de un objeto +dividido aplica las mismas modificaciones a todos y cada uno de +sus segmentos. En el ejemplo que aparece a continuación, la +sobreescritura de @code{thickness} (grosor) afecta a la ligadura a +ambos lados del salto de línea. -@lilypond[verbatim,quote,ragged-right,relative=2] -r2 -\once\override Slur.thickness = 10 -c8( d e f -\break -g8 f e d) r2 +@lilypond[verbatim,quote,ragged-right] +\relative c'' { + r2 + \once\override Slur.thickness = 10 + c8( d e f + \break + g8 f e d) r2 +} @end lilypond Es posible modificar de forma independiente el aspecto de los fragmentos individuales de un objeto de extensión dividido, con la -instrucción @code{\alterBroken}. Esta instrucción puede producir un -@code{\override} o bien un @code{\tweak} de una propiedad del objeto -de extensión. +instrucción @code{\alterBroken}. Esta instrucción puede producir +un @code{\override} o bien un @code{\tweak} de una propiedad del +objeto de extensión. La sintaxis de @code{\alterBroken} es @@ -4566,67 +4732,72 @@ La sintaxis de @code{\alterBroken} es @end example El argumento @var{valores} es una lista de valores, uno por cada -fragmento. Si @var{elemento} el el nombre de un grob como @code{Slur} -o @code{Staff.PianoPedalBracket}, el resultado es una instrucción de -sobreescritura @code{\override} del tipo de grob especificado. Si -@var{elemento} es una expresión musical como @qq{(} o @qq{[} el -resultado es la misma expresión musical con el correspondiente truco -aplicado. +fragmento. Si @var{elemento} el el nombre de un grob como +@code{Slur} o @code{Staff.PianoPedalBracket}, el resultado es una +instrucción de sobreescritura @code{\override} del tipo de grob +especificado. Si @var{elemento} es una expresión musical como +@qq{(} o @qq{[} el resultado es la misma expresión musical con el +correspondiente truco aplicado. El guión inicial se debe utilizar con la forma de trucaje, -@code{\tweak}. No lo escriba cuando utilice @code{\alterBroken} como -una operación de sobreescritura, @code{\override}. +@code{\tweak}. No lo escriba cuando utilice @code{\alterBroken} +como una operación de sobreescritura, @code{\override}. En su uso como @code{\override}, @code{\alterBroken} puede ir precedido de @code{\once} o @code{\temporary} y ser revertido con @code{\revert} con el argumento @var{propiedad}. -EL código siguiente aplica un @code{\override} independiente a cada -uno de los fragmentos de la ligadura del ejemplo anterior: +EL código siguiente aplica un @code{\override} independiente a +cada uno de los fragmentos de la ligadura del ejemplo anterior: -@lilypond[verbatim,quote,ragged-right,relative=2] -r2 -\alterBroken thickness #'(10 1) Slur -c8( d e f -\break -g8 f e d) r2 +@lilypond[verbatim,quote,ragged-right] +\relative c'' { + r2 + \alterBroken thickness #'(10 1) Slur + c8( d e f + \break + g8 f e d) r2 +} @end lilypond -La instrucción @code{\alterBroken} se puede usar con cualquier objeto -de extensión, incluidos @code{Tie}, @code{PhrasingSlur}, @code{Beam} y -@code{TextSpanner}. Por ejemplo, un editor que está preparando una -edición académica podría desear indicar la ausencia de parte de una -ligadura de fraseo en una fuente haciendo discontinuo solamente el -segmento que se ha añadido. El siguiente ejemplo ilustra de qué -manera se puede hacer esto, en este caso usando la forma @code{\tweak} -de la instrucción: +La instrucción @code{\alterBroken} se puede usar con cualquier +objeto de extensión, incluidos @code{Tie}, @code{PhrasingSlur}, +@code{Beam} y @code{TextSpanner}. Por ejemplo, un editor que está +preparando una edición académica podría desear indicar la ausencia +de parte de una ligadura de fraseo en una fuente haciendo +discontinuo solamente el segmento que se ha añadido. El siguiente +ejemplo ilustra de qué manera se puede hacer esto, en este caso +usando la forma @code{\tweak} de la instrucción: -@lilypond[verbatim,quote,ragged-right,relative=2] +@lilypond[verbatim,quote,ragged-right] % The empty list is conveniently used below, because it is the % default setting of dash-definition, resulting in a solid curve. -c2-\alterBroken dash-definition #'(() ((0 1.0 0.4 0.75))) \(e -\break -g2 e\) +\relative { + c''2-\alterBroken dash-definition #'(() ((0 1.0 0.4 0.75))) \(e + \break + g2 e\) +} @end lilypond -Es importante comprender que @code{\alterBroken} fija cada pieza del -objeto fragmentado al valor correspondiente dentro del argumento -@var{valores}. Cuando hay menos valores que piezas, cualquier -fragmento adicional recibe la asignación de la lista vacía. Esto -puede conllevar resultados no deseados si la propiedad de disposición -no está establecida a la lista vacía de forma predeterminada. En -estos casos, se debe asignar a cada segmento un valor adecuado. +Es importante comprender que @code{\alterBroken} fija cada pieza +del objeto fragmentado al valor correspondiente dentro del +argumento @var{valores}. Cuando hay menos valores que piezas, +cualquier fragmento adicional recibe la asignación de la lista +vacía. Esto puede conllevar resultados no deseados si la +propiedad de disposición no está establecida a la lista vacía de +forma predeterminada. En estos casos, se debe asignar a cada +segmento un valor adecuado. @knownissues -Los saltos de línea pueden ocurrir en distintos lugares según cambia -la disposición de la música. Los ajustes elegidos para +Los saltos de línea pueden ocurrir en distintos lugares según +cambia la disposición de la música. Los ajustes elegidos para @code{\alterBroken} podrían no ser adecuados para un objeto de -extensión que ya no está dividido o que se fragmenta en más piezas que -antes. El uso explícito (manual) de saltos de línea mediante +extensión que ya no está dividido o que se fragmenta en más piezas +que antes. El uso explícito (manual) de saltos de línea mediante @code{\break} puede prevenir situaciones como ésta. -La instrucción @code{\alterBroken} no es efectiva para propiedades de -los objetos extensos accedidas antes del salto de línea, como +La instrucción @code{\alterBroken} no es efectiva para propiedades +de los objetos extensos accedidas antes del salto de línea, como @code{direction}. @seealso @@ -4644,35 +4815,37 @@ Extender LilyPond: @cindex no-puros: contenedores de Scheme @cindex horizontal, sobreescribir el espaciado -Los contenedores @q{unpure-pure} (pura y no pura) son útiles para la -sobreescritura de los cálculos del espaciado en el @emph{eje Y} -(concretamente @code{Y-offset} e @code{Y-extent}) con una función de -Scheme en lugar de un literal, es decir, un número o una pareja de -números. - -Para ciertos objetos gráficos, las dimensiones @code{Y-extent} están -basadas en la propiedad @code{stencil}, la sobreescritura de la -propiedad de sello de éstos requiere una sobreescritura adicional de -@code{Y-extent} con un contenedor unpure-pure. Cuando una función -sobreescribe una dimensión @code{Y-offset} y/o @code{Y-extent} se -supone que esto dispara los cálculos de los saltos de línea -prematuramente durante la compilación. Así pues, la función no se -evalúa en absoluto (devolviendo por lo general un valor de @samp{0} o -@samp{'(0 . 0)}) lo que puede dar lugar a colisiones. Una función -@q{pura} no afecta a las propiedades, objetos o suicidios de grobs, y -por ello siempre ven sus valores relacionados con el eje Y evaluados -correctamente. - -Actualmente hay unas treinta funciones que ya se consideran @q{puras} -y los contenedores Unpure-pure son una manera de establecer funciones -que no están en esta lista como @q{puras}. La función @q{pura} se -evalúa @emph{antes} de cualquier salto de línea y así el espaciado -horizontal se puede ajustar @q{a tiempo}. La función @q{impura} se -evalúa entonces @emph{después} del salto de línea. - -@warning{Dado que es difícil saber siempre qué funciones están en esta -lista, recomendamos que cualquier función @q{pura} que estemos creando -no utilice los grobs @code{Beam} o @code{VerticalAlignment}.} +Los contenedores @q{unpure-pure} (pura y no pura) son útiles para +la sobreescritura de los cálculos del espaciado en el @emph{eje Y} +(concretamente @code{Y-offset} e @code{Y-extent}) con una función +de Scheme en lugar de un literal, es decir, un número o una pareja +de números. + +Para ciertos objetos gráficos, las dimensiones @code{Y-extent} +están basadas en la propiedad @code{stencil}, la sobreescritura de +la propiedad de sello de éstos requiere una sobreescritura +adicional de @code{Y-extent} con un contenedor unpure-pure. +Cuando una función sobreescribe una dimensión @code{Y-offset} y/o +@code{Y-extent} se supone que esto dispara los cálculos de los +saltos de línea prematuramente durante la compilación. Así pues, +la función no se evalúa en absoluto (devolviendo por lo general un +valor de @samp{0} o @samp{'(0 . 0)}) lo que puede dar lugar a +colisiones. Una función @q{pura} no afecta a las propiedades, +objetos o suicidios de grobs, y por ello siempre ven sus valores +relacionados con el eje Y evaluados correctamente. + +Actualmente hay unas treinta funciones que ya se consideran +@q{puras} y los contenedores Unpure-pure son una manera de +establecer funciones que no están en esta lista como @q{puras}. +La función @q{pura} se evalúa @emph{antes} de cualquier salto de +línea y así el espaciado horizontal se puede ajustar @q{a tiempo}. +La función @q{impura} se evalúa entonces @emph{después} del salto +de línea. + +@warning{Dado que es difícil saber siempre qué funciones están en +esta lista, recomendamos que cualquier función @q{pura} que +estemos creando no utilice los grobs @code{Beam} o +@code{VerticalAlignment}.} Un contenedor @q{unpure-pure} se contruye de la manera siguiente: @@ -4685,20 +4858,24 @@ etiqueta como @q{pura} que toma @var{n + 2} argumentos. De nuevo, el primer argumento debe ser siempre el grob pero los argumentos segundo y tercero son argumentos de @q{inicio} y de @q{final}. -@var{inicio} y @var{final} son, a todos los efectos, valores mudos que -sólo tienen importancia para los @code{objetos de extensión} (o sea: -@code{Hairpin}, regulador, o @code{Beam}, barra), que pueden devolver -distintas estimaciones de altura basadas en una columna de inicio y -una de final. +@var{inicio} y @var{final} son, a todos los efectos, valores mudos +que sólo tienen importancia para los @code{objetos de extensión} +(o sea: @code{Hairpin}, regulador, o @code{Beam}, barra), que +pueden devolver distintas estimaciones de altura basadas en una +columna de inicio y una de final. -El resto son los otros argumentos para la primera función (que puede -no ser ninguno si @var{n = 1}). +El resto son los otros argumentos para la primera función (que +puede no ser ninguno si @var{n = 1}). El resultado de la segunda función se usa como una aproximación del valor necesario, que se usa entonces por la primera función para obtener el valor real que se usa a continuación para el ajuste de precisión mucho más tardío durante el proceso de espaciado. +@c TODO: The following example supposedly showing a collision no longer +@c 'works' since 2.18.x. Another example of a collision is needed. +@c Issue #3512 + @lilypond[verbatim,quote,ragged-right] #(define (square-line-circle-space grob) (let* ((pitch (ly:event-property (ly:grob-property grob 'cause) 'pitch)) @@ -4729,20 +4906,23 @@ smartSquareLineCircleSpace = { } @end lilypond -En el primer compás, sin el contenedor @emph{unpure-pure}, el motor de -espaciado no conoce la anchura de la cabeza de la nota y permite que -colisione con las alteraciones accidentales. En el segundo compás, el -motor de espaciado conoce la anchura de las cabezas de las notas y -evita la colisión mediante el alargamiento de la línea en la medida -adecuada. +En el primer compás, sin el contenedor @emph{unpure-pure}, el +motor de espaciado no conoce la anchura de la cabeza de la nota y +permite que colisione con las alteraciones accidentales. En el +segundo compás, el motor de espaciado conoce la anchura de las +cabezas de las notas y evita la colisión mediante el alargamiento +de la línea en la medida adecuada. Normalmente, para cálculos simples se pueden usar funciones casi -idénticas tanto para las partes @q{no pura} y @q{pura}, simplemente -cambiando el número de argumentos que se pasan a, y el ámbito de, la -función. +idénticas tanto para las partes @q{no pura} y @q{pura}, +simplemente cambiando el número de argumentos que se pasan a, y el +ámbito de, la función. Este caso de utilización es lo bastante +frecuente como para que @code{ly:make-unpure-pure-container} +construya dicha segunda función de forma predeterminada cuando se +llama con solo un argumento de función. -@warning{Si una función está caracterizada como @q{pura} y resulta que -no lo es, el resultado puede ser inesperado.} +@warning{Si una función está caracterizada como @q{pura} y resulta +que no lo es, el resultado puede ser inesperado.} @node Uso de las funciones musicales @@ -4754,10 +4934,10 @@ no lo es, el resultado puede ser inesperado.} Dondequiera que se necesite reutilizar trucos con distintas expresiones musicales, con frecuencia conviene hacer que el truco forme parte de una @emph{función musical}. En esta sección -estudiaremos solamente las funciones de @emph{sustitución}, en las que -el objeto es sustituir una variable dentro de un fragmento de código -de entrada de LilyPond. Se describen otras funciones más complejas en -@rextend{Funciones musicales}. +estudiaremos solamente las funciones de @emph{sustitución}, en las +que el objeto es sustituir una variable dentro de un fragmento de +código de entrada de LilyPond. Se describen otras funciones más +complejas en @rextend{Funciones musicales}. @menu * Sintaxis de las funciones de sustitución:: @@ -4769,13 +4949,13 @@ de entrada de LilyPond. Se describen otras funciones más complejas en @subsection Sintaxis de las funciones de sustitución @translationof Substitution function syntax -Es fácil hacer una función que sustituya una variable dentro de código -de LilyPond. La forma general de estas funciones es +Es fácil hacer una función que sustituya una variable dentro de +código de LilyPond. La forma general de estas funciones es @example funcion = #(define-music-function - (parser location @var{arg1} @var{arg2} @dots{}) + (@var{arg1} @var{arg2} @dots{}) (@var{type1?} @var{type2?} @dots{}) #@{ @var{@dots{}música@dots{}} @@ -4795,18 +4975,13 @@ debe devolver @code{#t}. @item @code{@var{@dots{}música@dots{}}} @tab código de entrada normal de LilyPond, que utiliza @code{$} (en los -lugares en que sólo se permiten construcciones de Lilypond) o @code{#} -(para usarlo como un valor de Scheme o un argumento de función musical -o música dentro de listas de música) para referenciar argumentos -(p.ej. @samp{#arg1}). +lugares en que sólo se permiten construcciones de Lilypond) o +@code{#} (para usarlo como un valor de Scheme o un argumento de +función musical o música dentro de listas de música) para +referenciar argumentos (p.ej. @samp{#arg1}). @end multitable -Los argumentos @code{parser} y @code{location} son necesarios, y se -utilizan en algunas situaciones avanzadas como se encuentra descrito -en @rextend{Sintaxis de las funciones musicales}. Para las funciones -de sustitución, tan sólo hemos de asegurarnos de incluirlos. - -También es necesaria la lista de predicados de tipo. Algunos de los +Es necesaria la lista de predicados de tipo. Algunos de los predicados de tipo más comunes que se utilizan en las funciones musicales son: @@ -4845,24 +5020,25 @@ Archivos instalados: @subsection Ejemplos de funciones de sustitución @translationof Substitution function examples -Esta sección presenta algunos ejemplos de funciones de sustitución. -No pretenden ser exhaustivas, sino demostrar algunas de las -posibilidades de las funciones de sustitución sencillas. +Esta sección presenta algunos ejemplos de funciones de +sustitución. No pretenden ser exhaustivas, sino demostrar algunas +de las posibilidades de las funciones de sustitución sencillas. -En el primer ejemplo se define una función que simplifica el ajuste -del relleno de un elemento de inscripción de texto TextScript: +En el primer ejemplo se define una función que simplifica el +ajuste del relleno de un elemento de inscripción de texto +TextScript: @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function - (parser location padding) + (padding) (number?) #{ \once \override TextScript.padding = #padding #}) -\relative c'' { - c4^"piu mosso" b a b +\relative { + c''4^"piu mosso" b a b \padText #1.8 c4^"piu mosso" b a b \padText #2.6 @@ -4876,7 +5052,7 @@ para los argumentos de las funciones musicales: @lilypond[quote,verbatim,ragged-right] custosNote = #(define-music-function - (parser location note) + (note) (ly:music?) #{ \tweak NoteHead.stencil #ly:text-interface::print @@ -4886,24 +5062,58 @@ custosNote = #note #}) -\relative c' { c4 d e f \custosNote g } +\relative { c'4 d e f \custosNote g } +@end lilypond + +@funindex \etc +Ambas funciones son expresiones únicas sencillas en las que solo +falta el último elemento de una lamada de función o +sobreescritura. Para estas definiciones de función en particular, +existe una sintaxis alternativa más simple que consiste +simplemente en escribir la parte constante de la expresión y +sustituir el elemento final que falta por @code{\etc}: + +@lilypond[quote,verbatim,ragged-right] +padText = + \once \override TextScript.padding = \etc + +\relative { + c''4^"piu mosso" b a b + \padText #1.8 + c4^"piu mosso" b a b + \padText #2.6 + c4^"piu mosso" b a b +} +@end lilypond + +@lilypond[quote,verbatim,ragged-right] +custosNote = + \tweak NoteHead.stencil #ly:text-interface::print + \tweak NoteHead.text + \markup \musicglyph #"custodes.mensural.u0" + \tweak Stem.stencil ##f + \etc + +\relative { c'4 d e f \custosNote g } @end lilypond -Se pueden definir funciones de sustitución con más de un argumento: + +Se pueden definir funciones de sustitución con más de un +argumento: @lilypond[quote,verbatim,ragged-right] tempoPadded = #(define-music-function - (parser location padding tempotext) + (padding tempotext) (number? markup?) #{ \once \override Score.MetronomeMark.padding = #padding \tempo \markup { \bold #tempotext } #}) -\relative c'' { +\relative { \tempo \markup { "Low tempo" } - c4 d e f g1 + c''4 d e f g1 \tempoPadded #4.0 "High tempo" g4 f e d c1 } diff --git a/Documentation/es/notation/cheatsheet.itely b/Documentation/es/notation/cheatsheet.itely index 9ba8fcaf2c..a1b8afb9dd 100644 --- a/Documentation/es/notation/cheatsheet.itely +++ b/Documentation/es/notation/cheatsheet.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: ecd34079d2df7ba2c28b3c76740cd0b9f157d61b + Translation of GIT committish: fa9d87071c06d7bd6894e3115d24a7eab725d924 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.16" @c TODO: add tablature. @@ -128,7 +128,7 @@ c c, @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f c( d e) @end lilypond @@ -139,7 +139,7 @@ c( d e) @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f c\( c( d) e\) @end lilypond @@ -150,7 +150,7 @@ c\( c( d) e\) @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a8-[ b-] @end lilypond @@ -161,11 +161,11 @@ a8-[ b-] @tab @lilypond[relative=1] << \new Staff { - \set Staff.implicitTimeSignatureVisibility = #all-invisible + \set Staff.initialTimeSignatureVisibility = #all-invisible c1 } \new Staff { - \set Staff.implicitTimeSignatureVisibility = #all-invisible + \set Staff.initialTimeSignatureVisibility = #all-invisible c1 } >> @end lilypond @@ -175,7 +175,7 @@ a8-[ b-] @tab articulaciones @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible c-> c-. @end lilypond @@ -184,7 +184,7 @@ c-> c-. @tab matices dinámicos @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible c2\mf c\sfz @end lilypond @@ -194,7 +194,7 @@ c2\mf c\sfz @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a\< a a\! @end lilypond @@ -204,7 +204,7 @@ a\< a a\! @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a\> a a\! @end lilypond @@ -214,7 +214,7 @@ a\> a a\! @tab acorde @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible @end lilypond @@ -232,7 +232,7 @@ f8 c2 d e @tab tresillos @tab @lilypond[relative=1] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \tuplet 3/2 { f8 g a } @end lilypond @@ -241,7 +241,7 @@ f8 c2 d e @tab mordentes @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \context Voice { \grace b16 c4 } @end lilypond @@ -262,7 +262,7 @@ twinkle @tab separador de sílabas @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible << { g'1 g } \new Lyrics \lyricsto "" { twin -- kle } @@ -273,11 +273,11 @@ twinkle @tab acordes @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \chordmode { c:dim f:maj7 } @end lilypond -@item @code{\context ChordNames} +@item @code{\new ChordNames} @tab imprimir los nombres de los acordes @tab @lilypond[relative=2] @@ -288,7 +288,7 @@ twinkle @tab polifonía @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \context Staff <<{e f} \\ {c d}>> @end lilypond diff --git a/Documentation/es/notation/chords.itely b/Documentation/es/notation/chords.itely index 00907d49a3..41c66b9aca 100644 --- a/Documentation/es/notation/chords.itely +++ b/Documentation/es/notation/chords.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 83c5b56f8a495df4fca2551957e0fd8757ec3651 + Translation of GIT committish: 828310574b05b95170920eabb8142bf0e8f23182 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.28" @node Notación de acordes @section Notación de acordes @@ -55,36 +55,39 @@ notas. @cindex acordes de jazz @cindex jazz, acordes de -Los acordes se pueden escribir como música simultánea, como se explica -en @ref{Notas en acorde}. +Los acordes se pueden escribir como música simultánea, como se +explica en @ref{Notas en acorde}. -También se pueden escribir los acordes en el @qq{modo de acordes}, que -es un modo de entrada que se centra en las estructuras de los acordes -dentro de la música europea tradicional (donde se conoce como «cifrado -americano») más que en las notas concretas. Esto es muy práctico para -los que están familiarizados con la utilización de nombres para -describir los acordes. Hay más información sobre los distintos modos -de entrada en @ref{Modos de entrada}. +También se pueden escribir los acordes en el @qq{modo de acordes}, +que es un modo de entrada que se centra en las estructuras de los +acordes dentro de la música europea tradicional (donde se conoce +como «cifrado americano») más que en las notas concretas. Esto es +muy práctico para los que están familiarizados con la utilización +de nombres para describir los acordes. Hay más información sobre +los distintos modos de entrada en @ref{Modos de entrada}. @lilypond[verbatim,quote,ragged-right] \chordmode { c1 g a g c } @end lilypond -Los acordes escritos con el modo de acordes son elementos musicales, y -se pueden transportar igual que los acordes escritos mediante -construcciones de música simultánea. @code{\chordmode} es absoluto, -pues @code{\relative} no tiene ningún efecto sobre los bloques -@code{chordmode}. Sin embargo, dentro de @code{\chordmode} las -alturas absolutas son una octava más agudas que en el modo de notas. +Los acordes escritos con el modo de acordes son elementos +musicales, y se pueden transportar igual que los acordes escritos +mediante construcciones de música simultánea. @code{\chordmode} es +absoluto, pues @code{\relative} no tiene ningún efecto sobre los +bloques @code{chordmode}. Sin embargo, dentro de +@code{\chordmode} las alturas absolutas son una octava más agudas +que en el modo de notas. Se pueden mezclar los modos de acorde y de nota en la música secuencial: -@lilypond[verbatim,quote,ragged-right,relative=1] -2 -\chordmode { c2 f } -2 -\chordmode { f2 g } +@lilypond[verbatim,quote,ragged-right] +\relative { + 2 + \chordmode { c2 f } + 2 + \chordmode { f2 g } +} @end lilypond @seealso @@ -99,30 +102,10 @@ Fragmentos de código: @rlsr{Chords}. @knownissues -No se pueden usar las abreviaturas predefinidas de articulaciones y -adornos sobre notas dentro del modo de acordes; véase +No se pueden usar las abreviaturas predefinidas de articulaciones +y adornos sobre notas dentro del modo de acordes; véase @ref{Articulaciones y ornamentos}. -Cuando se mezclan los modos de acorde y de nota en música secuencial, -y el modo de acordes aparece en primer lugar, el modo de notas crea un -nuevo contexto de @code{Staff}: - -@lilypond[verbatim,quote,ragged-right,relative=1] -\chordmode { c2 f } -2 -@end lilypond - -@noindent -Para evitar este comportamiento podemos crear explícitamente el -contexto de @code{Staff}: - -@lilypond[verbatim,quote,ragged-right,relative=1] -\new Staff { - \chordmode { c2 f } - 2 -} -@end lilypond - @node Acordes más usuales @unnumberedsubsubsec Acordes más usuales @@ -142,7 +125,8 @@ duración opcional: @end lilypond Las tríadas menores, aumentadas y disminuidas se escriben poniendo -@code{:} y una cadena modificadora de variante después de la duración: +@code{:} y una cadena modificadora de variante después de la +duración: @lilypond[verbatim,quote,ragged-right] \chordmode { c2:m f4:aug g:dim } @@ -159,13 +143,14 @@ Se pueden crear acordes de séptima: @funindex maj @funindex m -La tabla que aparece más abajo muestra el efecto de los modificadores -de variante sobre los acordes de tríada y de séptima. La séptima -añadida de forma predeterminada a los acordes es menor, lo que hace -del acorde de séptima dominante el acorde básico de séptima. Todas -las alteraciones se consideran en relación con la séptima dominante. -Hay una tabla más completa donde aparecen los usos de los -modificadores en @ref{Modificadores de acorde más usuales}. +La tabla que aparece más abajo muestra el efecto de los +modificadores de variante sobre los acordes de tríada y de +séptima. La séptima añadida de forma predeterminada a los acordes +es menor, lo que hace del acorde de séptima dominante el acorde +básico de séptima. Todas las alteraciones se consideran en +relación con la séptima dominante. Hay una tabla más completa +donde aparecen los usos de los modificadores en +@ref{Modificadores de acorde más usuales}. @c @table @code @multitable @columnfractions .2 .4 .3 @@ -205,8 +190,8 @@ Acorde menor. Este modificador baja la tercera. @item dim, dim7 @tab -Acorde disminuido. Este modificador baja la tercera, la quinta y, si -existe, la séptima. +Acorde disminuido. Este modificador baja la tercera, la quinta y, +si existe, la séptima. @tab @lilypond[line-width=4\cm, noragged-right] \chordmode { @@ -230,9 +215,9 @@ Acorde aumentado. Este modificador eleva la quinta. @item maj, maj7 @tab -Acorde de séptima mayor. Este modificador añade una séptima elevada. -El @code{7} que sigue a @code{maj} es opcional. NO utilice este -modificador para crear una tríada mayor. +Acorde de séptima mayor. Este modificador añade una séptima +elevada. El @code{7} que sigue a @code{maj} es opcional. NO +utilice este modificador para crear una tríada mayor. @tab @lilypond[line-width=4\cm, noragged-right] \chordmode { @@ -252,12 +237,13 @@ Fragmentos de código: @rlsr{Chords}. @knownissues -Sólo se puede usar un modificador por cada acorde, normalmente sobre -la nota más aguda del mismo. Los acordes con más de un modificador se -analizan sin producir errores ni advertencias, pero el resultado es -impredecible. Los acordes que no se pueden conseguir con un solo -modificador se deben alterar en sus notas individuales como se -describe en @ref{Acordes extendidos y alterados}. +Sólo se puede usar un modificador por cada acorde, normalmente +sobre la nota más aguda del mismo. Los acordes con más de un +modificador se analizan sin producir errores ni advertencias, pero +el resultado es impredecible. Los acordes que no se pueden +conseguir con un solo modificador se deben alterar en sus notas +individuales como se describe en +@ref{Acordes extendidos y alterados}. @node Acordes extendidos y alterados @@ -267,19 +253,20 @@ describe en @ref{Acordes extendidos y alterados}. @cindex acordes extendidos @cindex acordes alterados -Se pueden crear estructuras de acorde de complejidad arbitraria dentro -del modo de acordes. Se puede usar la cadena modificadora para -extender un acorde, añadir o quitar notas, elevar o bajar notas del -acorde y añadir un bajo distinto o crear una inversión. - -El primer número que sigue al @code{:} se considera que es el ámbito -del acorde. El acorde se construye secuencialmente añadiendo terceras -a la fundamental hasta que se alcanza el número especificado. Observe -que la séptima añadida como parte de un acorde extendido es la séptima -menor, no mayor. Si el ámbito no es una tercera (p.ej. 6), se añaden -terceras hasta la tercera más alta inferior al ámbito, y después se -añade la nota del ámbito. El mayor valor posible para el ámbito es -13. Cualquier valor mayor se interpreta como 13. +Se pueden crear estructuras de acorde de complejidad arbitraria +dentro del modo de acordes. Se puede usar la cadena modificadora +para extender un acorde, añadir o quitar notas, elevar o bajar +notas del acorde y añadir un bajo distinto o crear una inversión. + +El primer número que sigue al @code{:} se considera que es el +ámbito del acorde. El acorde se construye secuencialmente +añadiendo terceras a la fundamental hasta que se alcanza el número +especificado. Observe que la séptima añadida como parte de un +acorde extendido es la séptima menor, no mayor. Si el ámbito no +es una tercera (p.ej. 6), se añaden terceras hasta la tercera más +alta inferior al ámbito, y después se añade la nota del ámbito. +El mayor valor posible para el ámbito es 13. Cualquier valor +mayor se interpreta como 13. @lilypond[quote,ragged-right,verbatim] \chordmode { @@ -291,12 +278,12 @@ añade la nota del ámbito. El mayor valor posible para el ámbito es @end lilypond @noindent -Observe que @code{c:5} es idéntico a @code{c} (los dos producen una -tríada de Do mayor). +Como excepción especial, @code{c:5} produce un @q{power chord}, +que tiene solamente la fundamental y la quinta. -Puesto que una oncena sin alteración no suena bien cuando se combina -con una trecena sin alteración, se elimina la oncena de los acordes de -@code{:13} (a no ser que se añada explícitamente). +Puesto que una oncena sin alteración no suena bien cuando se +combina con una trecena sin alteración, se elimina la oncena de +los acordes de @code{:13} (a no ser que se añada explícitamente). @lilypond[quote,ragged-right,verbatim] \chordmode { @@ -306,13 +293,14 @@ con una trecena sin alteración, se elimina la oncena de los acordes de @cindex adiciones en acordes -Se pueden añadir notas individuales a un acorde. Las adiciones siguen -el ámbito y van prefijadas por un punto (@code{.}). La séptima normal -que se añade a un acorde es la séptima menor, no mayor. +Se pueden añadir notas individuales a un acorde. Las adiciones +siguen el ámbito y van prefijadas por un punto (@code{.}). La +séptima normal que se añade a un acorde es la séptima menor, no +mayor. @lilypond[quote,verbatim] \chordmode { - c1:5.6 c:3.7.8 c:3.6.13 + c1:3.5.6 c:3.7.8 c:3.6.13 } @end lilypond @@ -320,16 +308,16 @@ Las notas añadidas pueden ser tan agudas como se desee. @lilypond[quote,verbatim] \chordmode { - c4:5.15 c:5.20 c:5.25 c:5.30 + c4:3.5.15 c:3.5.20 c:3.5.25 c:3.5.30 } @end lilypond @cindex acordes, alteración de notas -Las notas añadidas a los acordes se pueden alterar mediante la adición -de los sufijos @code{-} o @code{+} al número. Para alterar una nota -que se ha incluido automáticamente como parte de la estructura básica -del acorde, añádala como una nota alterada. +Las notas añadidas a los acordes se pueden alterar mediante la +adición de los sufijos @code{-} o @code{+} al número. Para +alterar una nota que se ha incluido automáticamente como parte de +la estructura básica del acorde, añádala como una nota alterada. @lilypond[quote,verbatim] \chordmode { @@ -341,10 +329,10 @@ del acorde, añádala como una nota alterada. @funindex ^ -Una nota que se quiere suprimir de un acorde se indica dentro de la -cadena modificadora prefijándola por un acento circunflejo @code{^}. -Sólo se permite una supresión con @code{^} dentro de una cadena -modificadora. +Una nota que se quiere suprimir de un acorde se indica dentro de +la cadena modificadora prefijándola por un acento circunflejo +@code{^}. Sólo se permite una supresión con @code{^} dentro de +una cadena modificadora. @lilypond[quote,verbatim] \chordmode { @@ -355,14 +343,15 @@ modificadora. @funindex sus Se puede añadir el modificador @code{sus} a la cadena modificadora -para crear acordes suspendidos. Esto elimina la tercera del acorde. -Escriba bien @code{2} o bien @code{4} para añadir la segunda o la cuarta -al acorde, respectivamente. @code{sus} equivale a @code{^3}; -@code{sus4} equivale a @code{.4^3}. +para crear acordes suspendidos. Esto elimina la tercera del +acorde. Escriba bien @code{2} o bien @code{4} para añadir la +segunda o la cuarta al acorde, respectivamente. Cuando @code{sus} +va seguido de una segunda o una cuarta, es equivalente a +@code{^3}, y en caso contrario a @code{sus4}, o sea, @code{5.4}. @lilypond[quote,ragged-right,verbatim] \chordmode { - c1:sus c:sus2 c:sus4 c:5.4^3 + c1:sus c:sus2 c:sus4 c:5.4 } @end lilypond @@ -377,24 +366,25 @@ mediante la adición de @code{/}@var{nota} al acorde. @lilypond[quote,ragged-right,verbatim] \chordmode { - c1 c/g c/f + c'1 c'/e c'/f } @end lilypond @funindex /+ -Se puede añadir una nota del bajo que forma parte del acorde, en lugar -de ser movida por efecto de una inversión, mediante el uso de -@code{/+}@var{nota}. +Se puede añadir una nota del bajo que forma parte del acorde, en +lugar de ser movida por efecto de una inversión, mediante el uso +de @code{/+}@var{nota}. @lilypond[quote,ragged-right,verbatim] \chordmode { - c1 c/g c/+g + c'1 c'/g c'/+e } @end lilypond -Los modificadores de acorde que se pueden utilizar para producir una -amplia variedad de acordes estándar se muestran en @ref{Modificadores de acorde más usuales}. +Los modificadores de acorde que se pueden utilizar para producir +una amplia variedad de acordes estándar se muestran en +@ref{Modificadores de acorde más usuales}. @seealso Referencia de la notación: @@ -404,22 +394,12 @@ Fragmentos de código: @rlsr{Chords}. @knownissues -Cada nota sólo puede estar presente en el acorde una sola vez. Lo que -sigue produce simplemente el acorde aumentado, porque @code{5+} se -interpreta en último lugar. - -@lilypond[quote,ragged-right,verbatim] -\chordmode { c1:5.5-.5+ } -@end lilypond - -Sólo se puede crear la segunda inversión mediante la adición de un -bajo. La primera inversión requiere cambiar la fundamental del -acorde. +Cada nota sólo puede estar presente en el acorde una sola vez. Lo +que sigue produce simplemente el acorde aumentado, porque +@code{5+} se interpreta en último lugar. @lilypond[quote,ragged-right,verbatim] -\chordmode { - c'1: c':/g e:6-3-^5 e:m6-^5 -} +\chordmode { c1:3.5.5-.5+ } @end lilypond @@ -427,8 +407,8 @@ acorde. @subsection Imprimir los acordes @translationof Displaying chords -Los acordes se pueden imprimir por su nombre, además de la impresión -estándar como notas sobre un pentagrama. +Los acordes se pueden imprimir por su nombre, además de la +impresión estándar como notas sobre un pentagrama. @menu * Impresión de los nombres de acorde:: @@ -455,14 +435,14 @@ Los nombres de acorde se imprimen dentro del contexto } @end lilypond -Los acordes se pueden escribir como notas simultáneas o a través del -uso del modo de acordes. El nombre de acorde que se imprime es el -mismo independientemente del modo de entrada, a no ser que existan -inversiones o bajos añadidos: +Los acordes se pueden escribir como notas simultáneas o a través +del uso del modo de acordes. El nombre de acorde que se imprime +es el mismo independientemente del modo de entrada, a no ser que +existan inversiones o bajos añadidos: @lilypond[verbatim,quote] -chordmusic = \relative c' { - 2 +chordmusic = \relative { + 2 1 \chordmode { c2 f:sus4 c1:/f @@ -483,10 +463,10 @@ chordmusic = \relative c' { @cindex indicar No Chord (sin acorde) en ChordNames Los silencios pasados a un contexto @code{ChordNames} hacen que se -imprima el elemento de marcado @code{noChordSymbol} (símbolo de N.C., -Sin Acorde). +imprima el elemento de marcado @code{noChordSymbol} (símbolo de +N.C., Sin Acorde). -@lilypond[verbatim, quote, relative=1] +@lilypond[verbatim,quote] << \new ChordNames \chordmode { c1 @@ -555,8 +535,8 @@ Referencia de funcionamiento interno: @rinternals{Bar_engraver}. @knownissues -Los acordes que contienen inversiones o bajos alterados no reciben un -nombre adecuado si se escriben usando música simultánea. +Los acordes que contienen inversiones o bajos alterados no reciben +un nombre adecuado si se escriben usando música simultánea. @node Nombres de acorde personalizados @@ -566,10 +546,10 @@ nombre adecuado si se escriben usando música simultánea. @cindex personalización de los nombres de acorde No hay un sistema único para nombrar acordes. Las distintas -tradiciones musicales usan distintos nombres para el mismo conjunto de -acordes. También hay distintos símbolos impresos para un nombre de -acorde dado. Los nombres y símbolos que se imprimen para los nombres -de acorde dados se pueden personalizar. +tradiciones musicales usan distintos nombres para el mismo +conjunto de acordes. También hay distintos símbolos impresos para +un nombre de acorde dado. Los nombres y símbolos que se imprimen +para los nombres de acorde dados se pueden personalizar. @cindex Banter @cindex jazz, acordes de @@ -577,30 +557,30 @@ de acorde dados se pueden personalizar. El esquema de nomenclatura de acordes predeterminado es un sistema para música de Jazz, propuesto por Klaus Ignatzek (véase -@ressay{Lista bibliográfica}). -También funcionan otros dos esquemas de nomenclatura -de acordes: una notación de acordes de Jazz alternativa y un esquema -sistemático llamado Acordes de Banter. La notación de Jazz -alternativa también se puede ver en el cuadro -@ref{Cuadro de nombres de acordes}. +@ressay{Lista bibliográfica}). También funcionan otros dos +esquemas de nomenclatura de acordes: una notación de acordes de +Jazz alternativa y un esquema sistemático llamado Acordes de +Banter. La notación de Jazz alternativa también se puede ver en +el cuadro @ref{Cuadro de nombres de acordes}. @c TODO -- Change this so we don't have a non-verbatim example. @c Make short example in docs, then move longer example to @c appendix, where the length of the snippet won't matter. -Además de los distintos sistemas de nomenclatura, se usan diferentes -nombres de nota para la fundamental en los distintos idiomas. Las -variables predefinidas @code{\germanChords}, @code{\semiGermanChords}, -@code{\italianChords} y @code{\frenchChords} establecen el valor de -estas variables. El efecto se muestra aquí: +Además de los distintos sistemas de nomenclatura, se usan +diferentes nombres de nota para la fundamental en los distintos +idiomas. Las variables predefinidas @code{\germanChords}, +@code{\semiGermanChords}, @code{\italianChords} y +@code{\frenchChords} establecen el valor de estas variables. El +efecto se muestra aquí: @lilypondfile[ragged-right]{chord-names-languages.ly} @funindex chordNameLowercaseMinor -Algunos cancioneros alemanes indican los acordes menores como letras -minúsculas, sin el sufijo @var{m}. Esto se puede conseguir +Algunos cancioneros alemanes indican los acordes menores como +letras minúsculas, sin el sufijo @var{m}. Esto se puede conseguir estableciendo la propiedad @code{chordNameLowercaseMinor}: @lilypond[verbatim,quote,ragged-right] @@ -611,8 +591,8 @@ estableciendo la propiedad @code{chordNameLowercaseMinor}: @end lilypond Si ninguno de los ajustes predeterminados proporciona el resultado -deseado, se puede afinar la presentación de los nombres de acorde a -través de las siguientes propiedades. +deseado, se puede afinar la presentación de los nombres de acorde +a través de las siguientes propiedades. @table @code @@ -621,19 +601,20 @@ través de las siguientes propiedades. @item chordRootNamer El nombre de acorde se imprime normalmente como una letra para la -fundamental con una alteración opcional. La transformación de la nota -en la letra se realiza por parte de esta función. Los nombres de nota -especiales (por ejemplo, la @q{H} alemana para un acorde de Si) se -pueden producir almacenando una función nueva en esta propiedad. +fundamental con una alteración opcional. La transformación de la +nota en la letra se realiza por parte de esta función. Los +nombres de nota especiales (por ejemplo, la @q{H} alemana para un +acorde de Si) se pueden producir almacenando una función nueva en +esta propiedad. @funindex majorSevenSymbol @item majorSevenSymbol -Esta propiedad contiene el objeto de marcado que se usa para hacer el -seguimiento de la salida de @code{chordRootNamer} para identificar un -acorde de séptima mayor. Las opciones predefinidas son -@code{whiteTriangleMarkup} (triángulo blanco) y +Esta propiedad contiene el objeto de marcado que se usa para hacer +el seguimiento de la salida de @code{chordRootNamer} para +identificar un acorde de séptima mayor. Las opciones predefinidas +son @code{whiteTriangleMarkup} (triángulo blanco) y @code{blackTriangleMarkup} (triángulo negro). @funindex additionalPitchPrefix @@ -641,9 +622,9 @@ acorde de séptima mayor. Las opciones predefinidas son @item additionalPitchPrefix Cuando el acorde contiene notas añadidas, se pueden prefijar -opcionalmente por un texto. Por omisión no hay ningún prefijo, para -evitar la sobrecarga visual, pero para pequeñas cantidades de notas -añadidas puede ser visualmente efectivo. +opcionalmente por un texto. Por omisión no hay ningún prefijo, +para evitar la sobrecarga visual, pero para pequeñas cantidades de +notas añadidas puede ser visualmente efectivo. @lilypond[verbatim,quote,ragged-right] \new ChordNames { @@ -657,22 +638,24 @@ añadidas puede ser visualmente efectivo. @item chordNoteNamer -Cuando el nombre del acorde contiene notas adicionales aparte de la -fundamental (p.ej., un bajo añadido), se utiliza esta función para -imprimir la nota adicional. De forma predeterminada se imprime la -nota usando @code{chordRootNamer}. La propiedad @code{chordNoteNamer} -se puede establecer a una función especializada para cambiar este -comportamiento. Por ejemplo, el bajo se puede imprimir en minúscula. +Cuando el nombre del acorde contiene notas adicionales aparte de +la fundamental (p.ej., un bajo añadido), se utiliza esta función +para imprimir la nota adicional. De forma predeterminada se +imprime la nota usando @code{chordRootNamer}. La propiedad +@code{chordNoteNamer} se puede establecer a una función +especializada para cambiar este comportamiento. Por ejemplo, el +bajo se puede imprimir en minúscula. @funindex chordNameSeparator @item chordNameSeparator -Las diferentes partes del nombre de un acorde se separan normalmente -mediante un pequeño espacio en blanco. Mediante el ajuste de -@code{chordNameSeparator}, podemos usar cualquier marcado que deseemos -como separador. Esto no afecta al separador entre un acorde y la nota -del bajo: para personalizar eso, utilice @code{slashChordSeparator}. +Las diferentes partes del nombre de un acorde se separan +normalmente mediante un pequeño espacio en blanco. Mediante el +ajuste de @code{chordNameSeparator}, podemos usar cualquier +marcado que deseemos como separador. Esto no afecta al separador +entre un acorde y la nota del bajo: para personalizar eso, utilice +@code{slashChordSeparator}. @lilypond[verbatim,quote,ragged-right] \chords { @@ -688,12 +671,12 @@ del bajo: para personalizar eso, utilice @code{slashChordSeparator}. @item slashChordSeparator Los acordes se pueden tocar sobre una nota del bajo distinta a la -fundamental. Se llaman "inversiones" o "acordes de barra inclinada" -porque la manera predeterminada de efectuar su notación es con una -barra inclinada entre el acorde y la nota del bajo. Por tanto, el -valor de @code{slashChordSeparator} es, por omisión, una barra -inclinada, pero podemos cambiarlo a cualquier elemento de marcado que -queramos. +fundamental. Se llaman "inversiones" o "acordes de barra +inclinada" porque la manera predeterminada de efectuar su notación +es con una barra inclinada entre el acorde y la nota del bajo. +Por tanto, el valor de @code{slashChordSeparator} es, por omisión, +una barra inclinada, pero podemos cambiarlo a cualquier elemento +de marcado que queramos. @lilypond[verbatim,quote,ragged-right] \chords { @@ -708,20 +691,20 @@ queramos. @item chordNameExceptions -Esta propiedad es una lista de parejas. El primer elemento de cada -pareja es un conjunto de notas utilizadas para identificar los -elementos presentes en el acorde. El segundo elemento es un elemento -de marcado que sigue a la salida de @code{chordRootNamer} para crear -el nombre del acorde. +Esta propiedad es una lista de parejas. El primer elemento de +cada pareja es un conjunto de notas utilizadas para identificar +los elementos presentes en el acorde. El segundo elemento es un +elemento de marcado que sigue a la salida de @code{chordRootNamer} +para crear el nombre del acorde. @funindex minorChordModifier @item minorChordModifier -La notación de los acordes menores se suele hacer por medio del sufijo -@q{m} a la derecha de la letra que indica la fundamental del acorde. -Sin embargo, otras convenciones dan preferencia a sufijos diferentes, -como un signo menos. +La notación de los acordes menores se suele hacer por medio del +sufijo @q{m} a la derecha de la letra que indica la fundamental +del acorde. Sin embargo, otras convenciones dan preferencia a +sufijos diferentes, como un signo menos. @lilypond[verbatim,quote,ragged-right] \chords { @@ -736,12 +719,12 @@ como un signo menos. @item chordPrefixSpacer -El modificador de los acordes menores tal y como viene determinado por -@code{minorChordModifier} se imprime por lo general inmediatamente a -la derecha de la fundamental. Se puede insertar un símbolo separador -entre la fundamental y el modificador estableciendo -@code{chordPrefixSpacer}. El símbolo separador no se usa cuando el -acorde está alterado. +El modificador de los acordes menores tal y como viene determinado +por @code{minorChordModifier} se imprime por lo general +inmediatamente a la derecha de la fundamental. Se puede insertar +un símbolo separador entre la fundamental y el modificador +estableciendo @code{chordPrefixSpacer}. El símbolo separador no +se usa cuando el acorde está alterado. @end table @@ -797,12 +780,12 @@ Fragmentos de código: @rlsr{Chords}. @knownissues -Los nombres de acorde se determinan a partir de las notas que están -presentes en el mismo y de la información acerca de la estructura del -acorde que ha podido ser introducida en @code{\chordmode}. Si el -método de las notas simultáneas se usa para introducir los acordes, -pueden resultar nombres no deseados a partir de las inversiones o de -las notas del bajo. +Los nombres de acorde se determinan a partir de las notas que +están presentes en el mismo y de la información acerca de la +estructura del acorde que ha podido ser introducida en +@code{\chordmode}. Si el método de las notas simultáneas se usa +para introducir los acordes, pueden resultar nombres no deseados a +partir de las inversiones o de las notas del bajo. @lilypond[quote,ragged-right,verbatim] myChords = \relative c' { @@ -860,21 +843,21 @@ continuo: >> @end lilypond -El soporte para bajo cifrado se compone de dos partes: hay un modo de -entrada, presentado por @code{\figuremode}, que admite la entrada de -las cifras del bajo, y hay un contexto llamado @code{FiguredBass} que -se ocupa de la impresión de los objetos del tipo @code{BassFigure}. -El bajo cifrado también se puede imprimir dentro de contextos de -@code{Staff}. +El soporte para bajo cifrado se compone de dos partes: hay un modo +de entrada, presentado por @code{\figuremode}, que admite la +entrada de las cifras del bajo, y hay un contexto llamado +@code{FiguredBass} que se ocupa de la impresión de los objetos del +tipo @code{BassFigure}. El bajo cifrado también se puede imprimir +dentro de contextos de @code{Staff}. @code{\figures@{ @dots{} @}} es una notación abreviada de @code{\new FiguredBass @{ \figuremode @{ @dots{} @} @}}. -Aunque el soporte para bajo cifrado puede parecerse superficialmente -al de los acordes, realmente es mucho más simple. El modo -@code{\figuremode} simplemente almacena las cifras y el contexto -@code{FiguredBass} las imprime tal y como se han introducido. No hay -ninguna conversión a notas. +Aunque el soporte para bajo cifrado puede parecerse +superficialmente al de los acordes, realmente es mucho más simple. +El modo @code{\figuremode} simplemente almacena las cifras y el +contexto @code{FiguredBass} las imprime tal y como se han +introducido. No hay ninguna conversión a notas. @ignore Las cifras se crean como textos de marcado. Cualquiera de las @@ -895,13 +878,13 @@ Fragmentos de código: @unnumberedsubsubsec Introducir el bajo cifrado @translationof Entering figured bass -Se usa @code{\figuremode} para cambiar el modo de entrada al modo de -cifras. Hay más información sobre los distintos modos de entrada en -@ref{Modos de entrada}. +Se usa @code{\figuremode} para cambiar el modo de entrada al modo +de cifras. Hay más información sobre los distintos modos de +entrada en @ref{Modos de entrada}. En el modo de cifras, un grupo de cifras del bajo está delimitado -mediante ángulos simples, @code{<} y @code{>}. La duración se escribe -después del @code{>}. +mediante ángulos simples, @code{<} y @code{>}. La duración se +escribe después del @code{>}. @lilypond[verbatim,quote,ragged-right] \new FiguredBass { @@ -911,8 +894,8 @@ después del @code{>}. } @end lilypond -Se pueden añadir alteraciones accidentales (incluso becuadros) a las -cifras: +Se pueden añadir alteraciones accidentales (incluso becuadros) a +las cifras: @lilypond[verbatim,quote,ragged-right] \figures { @@ -945,7 +928,8 @@ Se pueden incluir espacios verticales y corchetes en las cifras: } @end lilypond -Se puede insertar cualquier elemento de marcado de texto como una cifra: +Se puede insertar cualquier elemento de marcado de texto como una +cifra: @lilypond[verbatim,quote,ragged-right] \figures { @@ -995,7 +979,8 @@ terminadas explícitamente. @end lilypond -La siguiente tabla resume los modificadores de cifrado disponibles. +La siguiente tabla resume los modificadores de cifrado +disponibles. @multitable @columnfractions .1 .5 .4 @@ -1098,8 +1083,8 @@ están en el pentagrama. @lilypond[verbatim,ragged-right,quote] << - \relative c'' { - c4 c'8 r8 c,4 c' + \relative { + c''4 c'8 r8 c,4 c' } \new FiguredBass { \figuremode { @@ -1115,9 +1100,9 @@ En el ejemplo de arriba, el contexto @code{FiguredBass} se debe instanciar explícitamente para evitar crear un segundo pentagrama vacío. -El bajo cifrado se puede añadir también a contextos de @code{Staff} -directamente. En este caso, la posición vertical de las cifras se -ajusta automáticamente. +El bajo cifrado se puede añadir también a contextos de +@code{Staff} directamente. En este caso, la posición vertical de +las cifras se ajusta automáticamente. @lilypond[verbatim,ragged-right,quote] << @@ -1135,8 +1120,8 @@ ajusta automáticamente. >> @end lilypond -Cuando se escribe dentro de un contexto de pentagrama, el bajo cifrado -se puede presentar encima o debajo del mismo. +Cuando se escribe dentro de un contexto de pentagrama, el bajo +cifrado se puede presentar encima o debajo del mismo. @lilypond[verbatim,ragged-right,quote] << @@ -1176,9 +1161,9 @@ Referencia de funcionamiento interno: @rinternals{FiguredBass}. @knownissues -Para asegurar que las líneas extensoras funcionan adecuadamente, lo -más seguro es utilizar las mismas duraciones en la línea de cifras y -en la línea del bajo. +Para asegurar que las líneas extensoras funcionan adecuadamente, +lo más seguro es utilizar las mismas duraciones en la línea de +cifras y en la línea del bajo. @lilypond[verbatim,ragged-right,quote] << diff --git a/Documentation/es/notation/editorial.itely b/Documentation/es/notation/editorial.itely index 2c7865a122..10e3cf6b56 100644 --- a/Documentation/es/notation/editorial.itely +++ b/Documentation/es/notation/editorial.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @c This file is included from notation.itely @ignore - Translation of GIT committish: ed1acf4b9b63f6acdb4feb24eb4acf3f83548319 + Translation of GIT committish: a22f2ad68fccb81e52f805ba69cb8c0e6bf8cd82 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.21" @node Anotaciones editoriales @section Anotaciones editoriales @@ -16,8 +16,8 @@ @lilypondfile[quote]{editorial-headword.ly} -Esta sección trata de las diversas maneras de modificar el aspecto de -las notas y de aplicar énfasis analítico o educativo. +Esta sección trata de las diversas maneras de modificar el aspecto +de las notas y de aplicar énfasis analítico o educativo. @menu * Dentro del pentagrama:: @@ -29,8 +29,8 @@ las notas y de aplicar énfasis analítico o educativo. @subsection Dentro del pentagrama @translationof Inside the staff -Esta sección trata sobre cómo aplicar énfasis a los elementos situados -dentro del pentagrama. +Esta sección trata sobre cómo aplicar énfasis a los elementos +situados dentro del pentagrama. @menu * Seleccionar el tamaño de la tipografía para la notación:: @@ -52,65 +52,230 @@ dentro del pentagrama. @funindex fontSize @funindex font-size +@funindex magnification->font-size @funindex magstep -@funindex \huge -@funindex \large +@funindex magnifyMusic +@funindex teeny +@funindex tiny +@funindex small +@funindex normalsize +@funindex large +@funindex huge +@funindex \magnifyMusic +@funindex \teeny +@funindex \tiny @funindex \normalsize @funindex \small -@funindex \tiny -@funindex \teeny -@funindex huge -@funindex large -@funindex normalsize -@funindex small -@funindex tiny -@funindex teeny +@funindex \large +@funindex \huge + +@warning{@* +Para el tamaño de la tipografía del texto, consulte @ref{Seleccionar la tipografía y su tamaño}.@* +Para el tamaño del pentagrama, consulte @ref{Establecer el tamaño del pentagrama}.@* +Para las notas guía, consulte @ref{Formateo de las notas guía}.@* +Para los pentagramas de Ossia, consulte @ref{Pentagramas de Ossia}.} + +Para modificar el tamaño de la notación sin cambiar el tamaño del +pentagrama, especifique un factor de ampliación con la instrucción +@code{\magnifyMusic}: + +@c Grieg Piano Concerto (mvt.1 cadenza) +@lilypond[verbatim,quote] +\new Staff << + \new Voice \relative { + \voiceOne + 4 8. 16 8 4 r8 + } + \new Voice \relative { + \voiceTwo + \magnifyMusic 0.63 { + \override Score.SpacingSpanner.spacing-increment = #(* 1.2 0.63) + r32 c'' a c a c a c r c a c a c a c + r c a c a c a c a c a c a c a c + } + } +>> +@end lilypond + +El @code{\override} del ejemplo anterior es una solución +provisional para solventar un fallo del programa. Consulte el +apartado de @qq{Problemas y advertencias conocidos} al final de +esta sección. + +Si una figura con un tamaño normal de cabeza se mezcla con otra +más pequeña, el tamaño de la menor podría necesitar reiniciarse +(con @w{@samp{\once@tie{}\normalsize}}) para que las plicas y las +alteraciones accidentales mantengan una buena alineación: + +@c Chopin Prelude op.28 no.8 +@lilypond[verbatim,quote] +\new Staff << + \key fis \minor + \mergeDifferentlyDottedOn + \new Voice \relative { + \voiceOne + \magnifyMusic 0.63 { + \override Score.SpacingSpanner.spacing-increment = #(* 1.2 0.63) + \once \normalsize cis'32( cis' gis b a fis \once \normalsize d d' + \once \normalsize cis, cis' gis b a gis \once \normalsize fis fis' + \once \normalsize fis, fis' ais, cis b gis \once \normalsize eis eis' + \once \normalsize a, a' bis, d cis b \once \normalsize gis gis') + } + } + \new Voice \relative { + \voiceTwo + cis'8. d16 cis8. fis16 fis8. eis16 a8. gis16 + } +>> +@end lilypond -Se puede alterar el tamaño de la fuente tipográfica de los elementos -de notación. Esto no cambia el tamaño de los símbolos variables, como -las barras de corchea o las ligaduras. - -@warning{Para los tamaños de tipografía del texto, consulte -@ref{Seleccionar la tipografía y su tamaño}.} - -@lilypond[verbatim,quote,relative=2] -\huge -c4.-> d8---3 -\large -c4.-> d8---3 -\normalsize -c4.-> d8---3 -\small -c4.-> d8---3 -\tiny -c4.-> d8---3 -\teeny -c4.-> d8---3 +La instrucción @code{\magnifyMusic} no está pensada para las notas +guía, de adorno, o para los pentagramas de Ossia; existen métodos +más apropiados para la introducción de cada uno de esos elementos. +En vez de ello, es útil cuando el tamaño de la notación cambia +dentro de una sola parte instrumental sobre un pentagrama, y +cuando las notas de adorno no son adecuadas, como en pasajes de +tipo cadencial o en casos como los de los ejemplos anteriores. +Establecer el valor de @code{\magnifyMusic} a 0.63 duplica las +dimensiones del contexto @code{CueVoice}. + +@warning{La instrucción @code{@bs{}magnifyMusic} @i{no} debe +utilizarse si se está cambiando el tamaño del pentagrama al mismo +tiempo. Consulte @ref{Establecer el tamaño del pentagrama}.} + + +@subsubsubheading Cambiar el temaño de los objetos individuales + +Un objeto de presentación individual se puede cambiar de tamaño +usando las instrucciones @code{\tweak} u @code{\override} para +ajustar su propiedad @code{font-size}: + +@lilypond[quote,verbatim] +\relative { + % resize a note head + -5 + % resize a fingering + bes-\tweak font-size 0 -3 + % resize an accidental + \once \override Accidental.font-size = -4 bes!-^ + % resize an articulation + \once \override Script.font-size = 4 bes!-^ +} +@end lilypond + +El valor predeterminado de @code{font-size} para cada objeto de +presentación está relacionado en el Manual de Referencia de +funcionamiento interno. La propiedad @code{font-size} solamente +se puede fijar para los objetos de presentación que contemplan la +interfaz de presentación @code{font-interface}. Si no está +especificado @code{font-size} en la lista de +@q{Ajustes@tie{}estándar} del objeto, su valor es 0. Véase +@rinternals{All layout objects}. + + +@subsubsubheading Comprensión de la propiedad @code{fontSize} + +La propiedad de contexto @code{fontSize} ajusta el tamaño relativo +de todos los elementos de notación basados en glifos dentro de un +contexto: + +@lilypond[verbatim,quote] +\relative { + \time 3/4 + d''4---5 c8( b a g) | + \set fontSize = -6 + e'4-- c!8-4( b a g) | + \set fontSize = 0 + fis4---3 e8( d) fis4 | + g2. +} @end lilypond -Internamente, esto establece un valor para la propiedad -@code{fontSize}. Esto, a su vez, hace que se establezca el valor de -la propiedad @code{font-size} de todos los objetos de presentación. -El valor de @code{font-size} es un número que indica el tamaño con -relación al tamaño estándar para la altura vigente del pentagrama. -Cada unidad hacia arriba es un incremento de un 12% del tamaño de la -fuente, aproximadamente. Seis unidades son exactamente un factor de -dos. La función de Scheme @code{magstep} convierte un número de -tamaño @code{font-size} a un factor de escalado. La propiedad -@code{font-size} también se puede establecer directamente, de forma -que queden afectados solamente determinados objetos gráficos. - -@lilypond[verbatim,quote,relative=2] -\set fontSize = #3 -c4.-> d8---3 -\override NoteHead.font-size = #-4 -c4.-> d8---3 -\override Script.font-size = #2 -c4.-> d8---3 -\override Stem.font-size = #-5 -c4.-> d8---3 +El valor de @code{fontSize} es un número que indica el tamaño +relativo al tamaño estándar para la altura actual del pentagrama. +El valor predeterminado de @code{fontSize} es 0; la adición de 6 a +cualquier valor de @code{fontSize} duplica el tamaño impreso de +los glifos, y la sustracción de 6 reduce el tamaño a la mitad. +Cada paso aumenta el tamaño en un 12% aproximadamente. + +La función de Scheme @code{magnification->font-size} se provee por +conveniencia, pues las unidades logarítmicas de la propiedad +@code{font-size} no son totalmente intuitivas. Por ejemplo, para +ajustar la notación musical al 75% del tamaño predeterminado, +usamos: + +@example +\set fontSize = #(magnification->font-size 0.75) +@end example + +La función de Scheme @code{magstep} tiene el efecto opuesto: +convierte un valor de @code{font-size} en un factor de ampliación. + +La propiedad @code{fontSize} no afecta solamente a los elementos +notacionales que se dibujan con glifos, como la cabeza de las +figuras, las alteraciones accidentales, las inscripciones +textuales, etc. No afecta al tamaño de la propia pauta, ni cambia +la escala de las plicas, barras, o espaciado horizontal. Para +cambiar la escala de las plicas, barras y el espaciado horizontal +junto con el tamaño de la notación (sin cambiar el tamaño de la +pauta), use la instrucción @code{\magnifyMusic} que se ha +explicado anteriormente. Para cambiar la escala del tamaño de +todo, incluida la pauta, véase +@ref{Establecer el tamaño del pentagrama}. + +Siempre que se establece el valor de la @i{propiedad de contexto} +@code{fontSize}, su valor se añade al valor de la @i{propiedad de +objeto gráfico} @code{font-size} para los objetos de presentación +individuales, antes de que se imprima cualquiera de los glifos. +Esto puede causar confusión cuando se fija el valor de las +propiedades @code{font-size} individuales mientras @code{fontSize} +ya está fijado: + +@lilypond[verbatim,quote,fragment] +% the default font-size for NoteHead is 0 +% the default font-size for Fingering is -5 +c''4-3 + +\set fontSize = -3 +% the effective font size for NoteHead is now -3 +% the effective font size for Fingering is now -8 +c''4-3 + +\override Fingering.font-size = 0 +% the effective font size for Fingering is now -3 +c''4-3 @end lilypond +Las siguientes instrucciones de atajo también están disponibles: + +@multitable @columnfractions .2 .4 .4 +@item @b{Instrucción} @tab @b{Equivalente a} @tab @b{Tamaño relativo} +@item @code{\teeny} @tab @code{\set fontSize = -3} @tab 71% +@item @code{\tiny} @tab @code{\set fontSize = -2} @tab 79% +@item @code{\small} @tab @code{\set fontSize = -1} @tab 89% +@item @code{\normalsize} @tab @code{\set fontSize = 0} @tab 100% +@item @code{\large} @tab @code{\set fontSize = 1} @tab 112% +@item @code{\huge} @tab @code{\set fontSize = 2} @tab 126% +@end multitable + +@lilypond[verbatim,quote] +\relative c'' { + \teeny + c4.-> d8---3 + \tiny + c4.-> d8---3 + \small + c4.-> d8---3 + \normalsize + c4.-> d8---3 + \large + c4.-> d8---3 + \huge + c4.-> d8---3 +} +@end lilypond + + @cindex estándar, tamaño de la tipografía (de notación) @cindex fuente tipográfica (de notación), tamaño estándar de @@ -118,16 +283,15 @@ c4.-> d8---3 @funindex font-size Los cambios en el tamaño de la fuente se obtienen por medio del -escalado del tamaño del diseño que se encuentra más cerca del tamaño -deseado. El tamaño estándar para la tipografía (para @code{font-size -= #0}), depende de la altura estándar del pentagrama. Para un -pentagrama de 20 puntos, se selecciona una fuente de 10 puntos. +escalado del tamaño del diseño que se encuentra más cerca del +tamaño deseado. El tamaño estándar para la tipografía (para +@w{@code{font-size = 0}}) depende de la altura estándar del +pentagrama. Para un pentagrama de 20 puntos, se selecciona una +fuente de 11 puntos. -La propiedad @code{font-size} sólo se puede establecer en objetos -gráficos que utilicen fuentes tipográficas. Éstos son los que -contemplan el interfaz de presentación @code{font-interface}. @predefined +@code{\magnifyMusic}, @code{\teeny} (enano), @code{\tiny} (muy pequeño), @code{\small} (pequeño), @@ -137,12 +301,45 @@ contemplan el interfaz de presentación @code{font-interface}. @endpredefined @seealso +Notation Reference: +@ref{Seleccionar la tipografía y su tamaño}, +@ref{Establecer el tamaño del pentagrama}, +@ref{Formateo de las notas guía}, +@ref{Pentagramas de Ossia}. + +Installed Files: +@file{ly/music-functions-init.ly}, +@file{ly/property-init.ly}. + Fragmentos de código: @rlsr{Editorial annotations}. Referencia de funcionamiento interno: @rinternals{font-interface}. +@c The two issues mentioned below: +@c http://code.google.com/p/lilypond/issues/detail?id=3987 +@c http://code.google.com/p/lilypond/issues/detail?id=3990 +@knownissues +Actualmente hay dos falos del programa que impiden un correcto +espaciado horizontal al usar @code{\magnifyMusic}. Solamente +existe una forma de circunventarlo, y su funcionamiento correcto +no está garantizado en todos los casos. En el ejemplo que aparece +a continuación, sustituya la variable @var{mag} con su valor +preferido. También puede tratar de quitar una o ambas +instrucciones @code{\newSpacingSection}, y/o las instrucciones +@code{\override} y @code{\revert}: + +@example +\magnifyMusic @var{mag} @{ + \newSpacingSection + \override Score.SpacingSpanner.spacing-increment = #(* 1.2 @var{mag}) + [@var{music}] + \newSpacingSection + \revert Score.SpacingSpanner.spacing-increment +@} +@end example + @node Indicaciones de digitación @unnumberedsubsubsec Indicaciones de digitación @@ -152,46 +349,49 @@ Referencia de funcionamiento interno: @cindex cambio de dedo @funindex \finger -@funindex finger Las instrucciones de digitación se pueden introducir usando @samp{@var{nota}-@var{dígito}}: -@lilypond[verbatim,quote,relative=2] -c4-1 d-2 f-4 e-3 +@lilypond[verbatim,quote] +\relative { c''4-1 d-2 f-4 e-3 } @end lilypond -Para los cambios de dedo se pueden usar elementos de marcado de texto o de cadenas de caracteres. +Para los cambios de dedo se pueden usar elementos de marcado de +texto o de cadenas de caracteres. -@lilypond[verbatim,quote,relative=2] -c4-1 d-2 f\finger \markup \tied-lyric #"4~3" c\finger "2 - 3" +@lilypond[verbatim,quote] +\relative { + c''4-1 d-2 f\finger \markup \tied-lyric #"4~3" c\finger "2 - 3" +} @end lilypond @cindex thumb-script @funindex \thumb -@funindex thumb -Puede usar la articulación de pulgar para indicar que una nota se debe -tocar con el pulgar (p.ej. en música de violoncello). +Puede usar la articulación de pulgar para indicar que una nota se +debe tocar con el pulgar (p.ej. en música de violoncello). -@lilypond[verbatim,quote,relative=2] -2 +@lilypond[verbatim,quote] +\relative { 2 } @end lilypond @cindex digitación de acordes @cindex digitación, instrucciones de, para acordes @cindex acordes, digitación de -Las digitaciones para los acordes también se pueden añadir a las notas -individuales escribiéndolas después de las alturas. +Las digitaciones para los acordes también se pueden añadir a las +notas individuales escribiéndolas después de las alturas. -@lilypond[verbatim,quote,relative=2] -2 +@lilypond[verbatim,quote] +\relative { + 2 +} @end lilypond -Las indicaciones de digitación se pueden situar manualmente encima o -debajo del pentagrama, véase @ref{Dirección y posición}. +Las indicaciones de digitación se pueden situar manualmente encima +o debajo del pentagrama, véase @ref{Dirección y posición}. @snippets @@ -231,36 +431,40 @@ Referencia de funcionamiento interno: @cindex notas transparentes @funindex \hideNotes -@funindex hideNotes @funindex \unHideNotes -@funindex unHideNotes Las notas ocultas (o invisibles, o transparentes) pueden ser de -utilidad en la preparación de ejercicios de teoría o de composición. - -@lilypond[verbatim,quote,relative=2] -c4 d -\hideNotes -e4 f -\unHideNotes -g a -\hideNotes -b -\unHideNotes -c +utilidad en la preparación de ejercicios de teoría o de +composición. + +@lilypond[verbatim,quote] +\relative { + c''4 d + \hideNotes + e4 f + \unHideNotes + g a + \hideNotes + b + \unHideNotes + c +} @end lilypond La cabeza, la plica y el corchete de las figuras, así como los -silencios, son invisibles. Las barras son invisibles si comienzan en -una nota oculta. Los objetos de notación que están anclados a notas -invisibles, son a pesar de ello visibles. - -@lilypond[verbatim,quote,relative=2] -e8(\p f g a)-- -\hideNotes -e8(\p f g a)-- +silencios, son invisibles. Las barras son invisibles si comienzan +en una nota oculta. Los objetos de notación que están anclados a +notas invisibles, son a pesar de ello visibles. + +@lilypond[verbatim,quote] +\relative c'' { + e8(\p f g a)-- + \hideNotes + e8(\p f g a)-- +} @end lilypond + @predefined @code{\hideNotes}, @code{\unHideNotes}. @@ -301,48 +505,51 @@ Referencia de funcionamiento interno: @funindex color @funindex \with-color -@funindex with-color @funindex x11-color -Se pueden asignar colores a los objetos individuales. Los nombres de -color válidos se encuentran relacionados en la @ref{Lista de colores}. +Se pueden asignar colores a los objetos individuales. Los nombres +de color válidos se encuentran relacionados en la @ref{Lista de +colores}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \override NoteHead.color = #red -c4 c +c''4 c'' \override NoteHead.color = #(x11-color 'LimeGreen) -d +d'' \override Stem.color = #blue -e +e'' @end lilypond Se puede acceder al espectro completo de colores definido para X11 -usando la función de Scheme x11-color. Esta función acepta un único -argumento; éste puede ser un símbolo de la forma @code{@var{'FulanoMengano}} -o una cadena de la forma @code{"@var{FulanoMengano}"}. La primera forma es -más rápida de escribir y también más eficiente. Sin embargo, al usar -la segunda forma es posible acceder a los colores de X11 por medio de -la forma del nombre que tiene varias palabras. - -Si @code{x11-color} no entiende el parámetro, el color predeterminado -que se devuelve es el negro. - -@lilypond[verbatim,quote,relative=2] -\override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) -\set Staff.instrumentName = \markup { - \with-color #(x11-color 'navy) "Clarinet" -} +usando la función de Scheme x11-color. Esta función acepta un +único argumento; éste puede ser un símbolo de la forma +@code{@var{'FulanoMengano}} o una cadena de la forma +@code{"@var{FulanoMengano}"}. La primera forma es más rápida de +escribir y también más eficiente. Sin embargo, al usar la segunda +forma es posible acceder a los colores de X11 por medio de la +forma del nombre que tiene varias palabras. + +Si @code{x11-color} no entiende el parámetro, el color +predeterminado que se devuelve es el negro. + +@lilypond[verbatim,quote] +\relative c'' { + \override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) + \set Staff.instrumentName = \markup { + \with-color #(x11-color 'navy) "Clarinet" + } -gis8 a -\override Beam.color = #(x11-color "medium turquoise") -gis a -\override Accidental.color = #(x11-color 'DarkRed) -gis a -\override NoteHead.color = #(x11-color "LimeGreen") -gis a -% this is deliberate nonsense; note that the stems remain black -\override Stem.color = #(x11-color 'Boggle) -b2 cis + gis8 a + \override Beam.color = #(x11-color "medium turquoise") + gis a + \override Accidental.color = #(x11-color 'DarkRed) + gis a + \override NoteHead.color = #(x11-color "LimeGreen") + gis a + % this is deliberate nonsense; note that the stems remain black + \override Stem.color = #(x11-color 'Boggle) + b2 cis +} @end lilypond @cindex rgb-color @@ -354,18 +561,20 @@ b2 cis Se pueden especificar colores RGB exactos utilizando la función de Scheme @code{rgb-color}. -@lilypond[verbatim,quote,relative=2] -\override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) -\set Staff.instrumentName = \markup { - \with-color #(x11-color 'navy) "Clarinet" -} +@lilypond[verbatim,quote] +\relative c'' { + \override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) + \set Staff.instrumentName = \markup { + \with-color #(x11-color 'navy) "Clarinet" + } -\override Stem.color = #(rgb-color 0 0 0) -gis8 a -\override Stem.color = #(rgb-color 1 1 1) -gis8 a -\override Stem.color = #(rgb-color 0 0 0.5) -gis4 a + \override Stem.color = #(rgb-color 0 0 0) + gis8 a + \override Stem.color = #(rgb-color 1 1 1) + gis8 a + \override Stem.color = #(rgb-color 0 0 0.5) + gis4 a +} @end lilypond @seealso @@ -384,18 +593,20 @@ Fragmentos de código: @funindex x11-color @knownissues -Un color de X11 no es necesariamente de la misma tonalidad exacta que -un color normal de nombre similar. +Un color de X11 no es necesariamente de la misma tonalidad exacta +que un color normal de nombre similar. No todos los colores de X11 se distinguen entre sí en un navegador web, es decir, un navegador de web podría no mostrar ninguna -diferencia entre @code{LimeGreen} (verde lima) y @code{ForestGreen} -(verde bosque). Para la web se recomiendan los colores normales (o -sea: @code{blue}, azul, @code{green}, verde, @code{red}, rojo). +diferencia entre @code{LimeGreen} (verde lima) y +@code{ForestGreen} (verde bosque). Para la web se recomiendan los +colores normales (o sea: @code{blue}, azul, @code{green}, verde, +@code{red}, rojo). -Las notas de un acorde no se pueden colorear con @code{\override}; en -su lugar utilice @code{\tweak}. Consulte @ref{La instrucción tweak} para -ver más detalles. +Las notas de un acorde no se pueden colorear individualmente con +@code{\override}; en su lugar utilice @code{\tweak} o su +equivalente @code{\single\override} antes de la nota respectiva. +Consulte @ref{La instrucción tweak} para ver más detalles. @node Paréntesis @@ -409,26 +620,29 @@ ver más detalles. @cindex corchetes @funindex \parenthesize -@funindex parenthesize Los objetos se pueden encerrar entre paréntesis anteponiendo @code{\parenthesize} al evento musical. Si se aplica a un acorde, -encierra cada nota dentro de un par de paréntesis. También se pueden -poner entre paréntesis las notas individuales de un acorde. +encierra cada nota dentro de un par de paréntesis. También se +pueden poner entre paréntesis las notas individuales de un acorde. -@lilypond[verbatim,quote,relative=2] -c2 \parenthesize d -c2 \parenthesize -c2 +@lilypond[verbatim,quote] +\relative { + c''2 \parenthesize d + c2 \parenthesize + c2 +} @end lilypond -Los objetos que no son notas también se pueden poner entre paréntesis. -Para las articulaciones se necesita un guión antes de la instrucción -@code{\parenthesize}. +Los objetos que no son notas también se pueden poner entre +paréntesis. Para las articulaciones se necesita un guión antes de +la instrucción @code{\parenthesize}. -@lilypond[verbatim,quote,relative=2] -c2-\parenthesize -. d -c2 \parenthesize r +@lilypond[verbatim,quote] +\relative { + c''2-\parenthesize -. d + c2 \parenthesize r +} @end lilypond @seealso @@ -441,9 +655,9 @@ Referencia de funcionamiento interno: @rinternals{parentheses-interface}. @knownissues -Al poner un acorde entre paréntesis, se encierra cada una de las notas -individuales entre paréntesis, en vez de un solo paréntesis grande -rodeando al acorde completo. +Al poner un acorde entre paréntesis, se encierra cada una de las +notas individuales entre paréntesis, en vez de un solo paréntesis +grande rodeando al acorde completo. @node Plicas @@ -459,18 +673,15 @@ rodeando al acorde completo. @cindex plica neutral @funindex \stemUp -@funindex stemUp @funindex \stemDown -@funindex stemDown @funindex \stemNeutral -@funindex stemNeutral -Cuando se encuentra con una nota, se crea automáticamente un objeto -@code{Stem} (plica). Para las redondas y los silencios, también se -crean pero se hacen invisibles. +Cuando se encuentra con una nota, se crea automáticamente un +objeto @code{Stem} (plica). Para las redondas y los silencios, +también se crean pero se hacen invisibles. -Se puede hacer manualmente que las plicas apunten hacia arriba o hacia -abajo; véase @ref{Dirección y posición}. +Se puede hacer manualmente que las plicas apunten hacia arriba o +hacia abajo; véase @ref{Dirección y posición}. @predefined @code{\stemUp}, @@ -478,6 +689,7 @@ abajo; véase @ref{Dirección y posición}. @code{\stemNeutral}. @endpredefined + @snippets @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] @@ -503,8 +715,8 @@ Referencia de funcionamiento interno: @subsection Fuera del pentagrama @translationof Outside the staff -Esta sección trata sobre cómo enfatizar elementos que están dentro del -pentagrama, desde fuera del pentagrama. +Esta sección trata sobre cómo enfatizar elementos que están dentro +del pentagrama, desde fuera del pentagrama. @menu * Globos de ayuda:: @@ -527,18 +739,16 @@ pentagrama, desde fuera del pentagrama. @funindex balloonGrobText @funindex balloonText @funindex \balloonLengthOn -@funindex balloonLengthOn @funindex \balloonLengthOff -@funindex balloonLengthOff -Los elementos de notación se pueden marcar y nombrar con la ayuda de -un cartel o globo de ayuda rectangular. El propósito principal de -esta funcionalidad es la explicación de la notación. +Los elementos de notación se pueden marcar y nombrar con la ayuda +de un cartel o globo de ayuda rectangular. El propósito principal +de esta funcionalidad es la explicación de la notación. @c KEEP LY -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Voice \with { \consists "Balloon_engraver" } -{ +\relative c'' { \balloonGrobText #'Stem #'(3 . 4) \markup { "Soy una plica" } a8 \balloonGrobText #'Rest #'(-4 . -4) \markup { "Soy un silencio" } @@ -548,18 +758,18 @@ esta funcionalidad es la explicación de la notación. @end lilypond Existen dos funciones musicales, @code{balloonGrobText} y -@code{balloonText}; el primero se usa como @code{\once\override} para -adjuntar un texto a cualquier grob, y el último se usa como -@code{\tweak}, normalmente dentro de acordes, para adjuntar un texto a -una nota individual. +@code{balloonText}; el primero se usa como @code{\once\override} +para adjuntar un texto a cualquier grob, y el último se usa como +@code{\tweak}, normalmente dentro de acordes, para adjuntar un +texto a una nota individual. -Los textos de globo no influyen en el espaciado de las notas, -pero esto puede cambiarse: +Los textos de globo no influyen en el espaciado de las notas, pero +esto puede cambiarse: @c KEEP LY -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Voice \with { \consists "Balloon_engraver" } -{ +\relative c'' { \balloonGrobText #'Stem #'(3 . 4) \markup { "Soy una plica" } a8 \balloonGrobText #'Rest #'(-4 . -4) \markup { "Soy un silencio" } @@ -603,11 +813,12 @@ sincronizadas con las notas. Se debe usar el grabador @code{Grid_point_engraver} para crear los puntos extremos de las líneas, mientras que el grabador @code{Grid_line_span_engraver} se debe utilizar para trazar -efectivamente las líneas. De forma predeterminada, esto centra las -líneas de rejilla horizontalmente debajo y al lado izquierdo de la -cabeza de las notas. Las líneas de rejilla se extienden a partir de -línea media de los pentagramas. El intervalo @code{gridInterval} debe -especificar la duración entre las líneas de rejilla. +efectivamente las líneas. De forma predeterminada, esto centra +las líneas de rejilla horizontalmente debajo y al lado izquierdo +de la cabeza de las notas. Las líneas de rejilla se extienden a +partir de línea media de los pentagramas. El intervalo +@code{gridInterval} debe especificar la duración entre las líneas +de rejilla. @lilypond[verbatim,quote] \layout { @@ -624,11 +835,11 @@ especificar la duración entre las líneas de rejilla. \score { \new ChoirStaff << - \new Staff \relative c'' { + \new Staff \relative { \stemUp - c4. d8 e8 f g4 + c''4. d8 e8 f g4 } - \new Staff \relative c { + \new Staff \relative { \clef bass \stemDown c4 g' f e @@ -670,13 +881,11 @@ Referencia de funcionamiento interno: @funindex Horizontal_bracket_engraver @funindex \startGroup -@funindex startGroup @funindex \stopGroup -@funindex stopGroup -Los corchetes se usan en análisis musical para indicar la estructura -de las piezas musicales. Están contemplados los corchetes -horizontales simples. +Los corchetes se usan en análisis musical para indicar la +estructura de las piezas musicales. Están contemplados los +corchetes horizontales simples. @lilypond[verbatim,quote] \layout { @@ -685,8 +894,8 @@ horizontales simples. \consists "Horizontal_bracket_engraver" } } -\relative c'' { - c2\startGroup +\relative { + c''2\startGroup d\stopGroup } @end lilypond @@ -700,8 +909,8 @@ Los corchetes de análisis se pueden anidar. \consists "Horizontal_bracket_engraver" } } -\relative c'' { - c4\startGroup\startGroup +\relative { + c''4\startGroup\startGroup d4\stopGroup e4\startGroup d4\stopGroup\stopGroup diff --git a/Documentation/es/notation/expressive.itely b/Documentation/es/notation/expressive.itely index 7dfba42e5a..94196896b6 100644 --- a/Documentation/es/notation/expressive.itely +++ b/Documentation/es/notation/expressive.itely @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 48a57a1c8feb426029e059d9fbf8aaf1b14f0ff8 + Translation of GIT committish: 21be03e4b893ec2bbea745a713360310931337b9 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.25" +@c \version "2.19.21" @node Expresiones @section Expresiones @@ -29,9 +29,9 @@ crear en un a partitura. @subsection Expresiones adosadas a las notas @translationof Expressive marks attached to notes -Esta sección explica cómo crear marcas expresivas que están aplicadas -a notas: articulaciones, ornamentos y matices. También se tratan los -métodos para crear las nuevas marcas dinámicas. +Esta sección explica cómo crear marcas expresivas que están +aplicadas a notas: articulaciones, ornamentos y matices. También +se tratan los métodos para crear las nuevas marcas dinámicas. @menu * Articulaciones y ornamentos:: @@ -132,9 +132,11 @@ utilizando la sintaxis siguiente: La lista de los posibles valores de @code{@var{nombre}} está en @ref{Lista de articulaciones}. Por ejemplo: -@lilypond[verbatim,quote,relative=2] -c4\staccato c\mordent b2\turn -c1\fermata +@lilypond[verbatim,quote] +\relative { + c''4\staccato c\mordent b2\turn + c1\fermata +} @end lilypond @cindex marcato @@ -146,19 +148,21 @@ c1\fermata @cindex portato -Algunas de estas articulaciones tienen abreviaturas que facilitan su -escritura. Las abreviaturas se escriben detrás del nombre de la nota, -y su sintaxis consiste en un guión @code{-} seguido de un símbolo que -especifica la articulación. Existen abreviaturas predefinidas para el -@notation{marcato}, @notation{stopped} (nota apagada), -@notation{tenuto}, @notation{staccatissimo}, @notation{accent} -(acento), @notation{staccato} (picado), y @notation{portato}. La -salida correspondiente a estas articulaciones aparece de la siguiente -manera: +Algunas de estas articulaciones tienen abreviaturas que facilitan +su escritura. Las abreviaturas se escriben detrás del nombre de +la nota, y su sintaxis consiste en un guión @code{-} seguido de un +símbolo que especifica la articulación. Existen abreviaturas +predefinidas para el @notation{marcato}, @notation{stopped} (nota +apagada), @notation{tenuto}, @notation{staccatissimo}, +@notation{accent} (acento), @notation{staccato} (picado), y +@notation{portato}. La salida correspondiente a estas +articulaciones aparece de la siguiente manera: -@lilypond[verbatim,quote,relative=2] -c4-^ c-+ c-- c-! -c4-> c-. c2-_ +@lilypond[verbatim,quote] +\relative { + c''4-^ c-+ c-- c-! + c4-> c-. c2-_ +} @end lilypond Las reglas para la colocación predeterminada de las articulaciones se @@ -176,10 +180,10 @@ Está disponible una instrucción predefinida especial, multicompás (y sólo a un silencio multicompás). La instrucción crea un objeto @code{MultiMeasureRestText}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \override Script.color = #red \override MultiMeasureRestText.color = #blue -a2\fermata r\fermata +a'2\fermata r\fermata R1\fermataMarkup @end lilypond @@ -237,56 +241,40 @@ Referencia de funcionamiento interno: @cindex matices @cindex absolutos, matices @funindex \pppp -@funindex pppp @funindex \ppp -@funindex ppp @funindex \pp -@funindex pp @funindex \p -@funindex p @funindex \mp -@funindex mp @funindex \mf -@funindex mf @funindex \f -@funindex f @funindex \ff -@funindex ff @funindex \fff -@funindex fff @funindex \ffff -@funindex ffff @funindex \fffff -@funindex fffff @funindex \fp -@funindex fp @funindex \sf -@funindex sf @funindex \sff -@funindex sff @funindex \sp -@funindex sp @funindex \spp -@funindex spp @funindex \sfz -@funindex sfz @funindex \rfz -@funindex rfz Las marcas dinámicas de matiz absoluto se especifican usando una -instrucción después de una nota: @code{c4\ff}. Las marcas dinámicas -disponibles son @code{\ppppp}, @code{\pppp}, @code{\ppp}, @code{\pp}, -@code{\p}, @code{\mp}, @code{\mf}, @code{\f}, @code{\ff}, @code{\fff}, -@code{\ffff}, @code{\fffff}, @code{\fp}, @code{\sf}, @code{\sff}, -@code{\sp}, @code{\spp}, @code{\sfz} y @code{\rfz}. Las indicaciones -dinámicas se pueden colocar manualmente por encima o por debajo del -pentagrama; para ver más detalles, consulte @ref{Dirección y -posición}. - -@lilypond[verbatim,quote,relative=2] -c2\ppp c\mp -c2\rfz c^\mf -c2_\spp c^\ff +instrucción después de una nota: @code{c4\ff}. Las marcas +dinámicas disponibles son @code{\ppppp}, @code{\pppp}, +@code{\ppp}, @code{\pp}, @code{\p}, @code{\mp}, @code{\mf}, +@code{\f}, @code{\ff}, @code{\fff}, @code{\ffff}, @code{\fffff}, +@code{\fp}, @code{\sf}, @code{\sff}, @code{\sp}, @code{\spp}, +@code{\sfz} y @code{\rfz}. Las indicaciones dinámicas se pueden +colocar manualmente por encima o por debajo del pentagrama; para +ver más detalles, consulte @ref{Dirección y posición}. + +@lilypond[verbatim,quote] +\relative c'' { + c2\ppp c\mp + c2\rfz c^\mf + c2_\spp c^\ff +} @end lilypond @cindex regulador @@ -298,27 +286,28 @@ c2_\spp c^\ff @funindex \> @funindex \! @funindex \cr -@funindex cr @funindex \decr -@funindex decr - -Una indicación de @notation{crescendo} se comienza con @code{\<} y se -termina con @code{\!}, con un matiz absoluto o con otra indicación de -crescendo o de decrescendo. Una indicación de @notation{decrescendo} -comienza con @code{\>} y se termina también con @code{\!}, con un -matiz dinámico absoluto o con otra indicación de crescendo o de -decrescendo. Se pueden usar @code{\cr} y @code{\decr} en lugar de -@code{\<} y @code{\>}. De forma predeterminada, se tipografían -reguladores en ángulo cuando se utiliza esta notación. - -@lilypond[verbatim,quote,relative=2] -c2\< c\! -d2\< d\f -e2\< e\> -f2\> f\! -e2\> e\mp -d2\> d\> -c1\! + +Una indicación de @notation{crescendo} se comienza con @code{\<} y +se termina con @code{\!}, con un matiz absoluto o con otra +indicación de crescendo o de decrescendo. Una indicación de +@notation{decrescendo} comienza con @code{\>} y se termina también +con @code{\!}, con un matiz dinámico absoluto o con otra +indicación de crescendo o de decrescendo. Se pueden usar +@code{\cr} y @code{\decr} en lugar de @code{\<} y @code{\>}. De +forma predeterminada, se tipografían reguladores en ángulo cuando +se utiliza esta notación. + +@lilypond[verbatim,quote] +\relative c'' { + c2\< c\! + d2\< d\f + e2\< e\> + f2\> f\! + e2\> e\mp + d2\> d\> + c1\! +} @end lilypond Un regulador terminado mediante @code{\!} finaliza en el borde @@ -327,12 +316,13 @@ que esté terminado con el comienzo de otra indicación @notation{crescendo} o @notation{decrescendo}, terminará en el centro de la nota que tiene adosada la siguiente indicación @code{\<} ó @code{\>}. El regulador siguiente empezará entonces -en el borde derecho de la misma nota en lugar del borde -izquierdo, como sería usual si hubiese terminado con @code{\!} -previamente. +en el borde derecho de la misma nota en lugar del borde izquierdo, +como sería usual si hubiese terminado con @code{\!} previamente. -@lilypond[verbatim,quote,relative=2] -c1\< | c4 a c\< a | c4 a c\! a\< | c4 a c a\! +@lilypond[verbatim,quote] +\relative { + c''1\< | c4 a c\< a | c4 a c\! a\< | c4 a c a\! +} @end lilypond Los reguladores que terminan con indicaciones dinámicas absolutas @@ -341,8 +331,10 @@ parecida. Sin embargo, la longitud de la propia indicación dinámica puede alterar el punto en que finaliza el regulador anterior. -@lilypond[verbatim,quote,relative=2] -c1\< | c4 a c\mf a | c1\< | c4 a c\ffff a +@lilypond[verbatim,quote] +\relative { + c''1\< | c4 a c\mf a | c1\< | c4 a c\ffff a +} @end lilypond @cindex varios matices sobre una nota @@ -354,103 +346,102 @@ indicaciones dinámicas sobre una sola nota. Esto es útil especialmente para añadir un @notation{crescendo} y un @notation{decrescendo} a la misma nota: -@lilypond[verbatim,quote,relative=2] -c4\< c\! d\> e\! -<< f1 { s4 s4\< s4\> s4\! } >> +@lilypond[verbatim,quote] +\relative { + c''4\< c\! d\> e\! + << f1 { s4 s4\< s4\> s4\! } >> +} @end lilypond @cindex espressivo, articulación @funindex \espressivo -@funindex espressivo Se puede usar la instrucción @code{\espressivo} para indicar un crescendo y un decrescendo sobre la misma nota. Sin embargo, advierta que esta indicación está implementada como una articulación, no como una expresión dinámica. -@lilypond[verbatim,quote,relative=2] -c2 b4 a -g1\espressivo +@lilypond[verbatim,quote] +\relative { + c''2 b4 a + g1\espressivo +} @end lilypond @funindex \cresc -@funindex cresc @funindex \decresc -@funindex decresc @funindex \dim -@funindex dim -Las indicaciones de crescendo textuales se inician con @code{\cresc}. -Los decrescendos textuales se inician con @code{\decresc} o con @code{\dim}. -Se trazan líneas extensoras cuando es necesario. - -@lilypond[verbatim,quote,relative=2] -g8\cresc a b c b c d e\mf | -f8\decresc e d c e\> d c b | -a1\dim ~ | -a2. r4\! | + +Las indicaciones de crescendo textuales se inician con +@code{\cresc}. Los decrescendos textuales se inician con +@code{\decresc} o con @code{\dim}. Se trazan líneas extensoras +cuando es necesario. + +@lilypond[verbatim,quote] +\relative { + g'8\cresc a b c b c d e\mf | + f8\decresc e d c e\> d c b | + a1\dim ~ | + a2. r4\! | +} @end lilypond @funindex \crescTextCresc -@funindex crescTextCresc @funindex \dimTextDecresc -@funindex dimTextDecresc @funindex \dimTextDecr -@funindex dimTextDecr @funindex \dimTextDim -@funindex dimTextDim @funindex \crescHairpin -@funindex crescHairpin @funindex \dimHairpin -@funindex dimHairpin También pueden sustituirse los reguladores gráficos por cambios de dinámica textuales: -@lilypond[verbatim,quote,relative=2] -\crescTextCresc -c4\< d e f\! | -\dimTextDecresc -g4\> e d c\! | -\dimTextDecr -e4\> d c b\! | -\dimTextDim -d4\> c b a\! | -\crescHairpin -\dimHairpin -c4\< d\! e\> d\! | +@lilypond[verbatim,quote] +\relative c'' { + \crescTextCresc + c4\< d e f\! | + \dimTextDecresc + g4\> e d c\! | + \dimTextDecr + e4\> d c b\! | + \dimTextDim + d4\> c b a\! | + \crescHairpin + \dimHairpin + c4\< d\! e\> d\! | +} @end lilypond -Para crear nuevas indicaciones de matiz absoluto o de texto que deba -alinearse con los matices; véase @ref{Indicaciones dinámicas contemporáneas}. +Para crear nuevas indicaciones de matiz absoluto o de texto que +deba alinearse con los matices; véase +@ref{Indicaciones dinámicas contemporáneas}. @cindex matices, posición vertical @cindex dinámica, posición vertical @cindex vertical, posición, de las indicaciones dinámicas @funindex DynamicLineSpanner -La colocación vertical de las indicaciones de dinámica se maneja por -parte de @rinternals{DynamicLineSpanner}. +La colocación vertical de las indicaciones de dinámica se maneja +por parte de @rinternals{DynamicLineSpanner}. @funindex \dynamicUp -@funindex dynamicUp @funindex \dynamicDown -@funindex dynamicDown @funindex \dynamicNeutral -@funindex dynamicNeutral Está disponible un contexto @code{Dynamics} para tipografiar las -indicaciones de matiz dinámico en su propia línea horizontal. Utilice -silencios de separación para indicar los tiempos (las notas que están -dentro de un contexto @code{Dynamics} también ocupan tiempo musical, -pero no se imprimen). El contexto @code{Dynamics} puede contener -otros elementos como inscripciones textuales, objetos extensores de -texto e indicaciones de pedal de piano. +indicaciones de matiz dinámico en su propia línea horizontal. +Utilice silencios de separación para indicar los tiempos (las +notas que están dentro de un contexto @code{Dynamics} también +ocupan tiempo musical, pero no se imprimen). El contexto +@code{Dynamics} puede contener otros elementos como inscripciones +textuales, objetos extensores de texto e indicaciones de pedal de +piano. @lilypond[verbatim,quote] << - \new Staff \relative c' { - c2 d4 e | + \new Staff \relative { + c'2 d4 e | c4 e e,2 | g'4 a g a | c1 | @@ -491,7 +482,7 @@ texto e indicaciones de pedal de piano. @lilypondfile[verbatim,quote,texidoc,doctitle] {printing-hairpins-using-al-niente-notation.ly} -@cindex Ferneyhough, reguladores de +@cindex Ferneyhough, reguladores de @cindex reguladores de Ferneyhough @cindex reguladores acampanados @cindex acampanados, reguladores @@ -523,8 +514,8 @@ Manual de aprendizaje: Referencia de la notación: @ref{Dirección y posición}, @ref{Indicaciones dinámicas contemporáneas}, -@ref{¿Qué sale por el MIDI?}, -@ref{Control de los matices en el MIDI}. +@ref{Enriquecimiento de la salida MIDI}, +@ref{Control de las dinámicas del MIDI}. Fragmentos de código: @rlsr{Expressive marks}. @@ -543,14 +534,14 @@ Referencia de funcionamiento interno: @cindex indicaciones dinámicas nuevas @cindex dinámicas, indicaciones, nuevas -La manera más fácil de crear indicaciones dinámicas es usar objetos de -marcado (@code{\markup}). +La manera más fácil de crear indicaciones dinámicas es usar +objetos de marcado (@code{\markup}). @lilypond[verbatim,quote] moltoF = \markup { molto \dynamic f } -\relative c' { - 16_\moltoF +\relative { + 16_\moltoF 2.. } @end lilypond @@ -559,21 +550,19 @@ moltoF = \markup { molto \dynamic f } @cindex dinámicas, indicaciones entre paréntesis @cindex editoriales, indicaciones dinámicas @funindex \bracket -@funindex bracket @funindex \dynamic -@funindex dynamic En el modo de marcado se pueden crear indicaciones dinámicas -editoriales (entre paréntesis o corchetes). La sintaxis del modo de -marcado se describe en @ref{Formatear el texto}. +editoriales (entre paréntesis o corchetes). La sintaxis del modo +de marcado se describe en @ref{Formatear el texto}. @lilypond[verbatim,quote] roundF = \markup { \center-align \concat { \bold { \italic ( } \dynamic f \bold { \italic ) } } } boxF = \markup { \bracket { \dynamic f } } -\relative c' { - c1_\roundF +\relative { + c'1_\roundF c1_\boxF } @end lilypond @@ -581,27 +570,27 @@ boxF = \markup { \bracket { \dynamic f } } @cindex make-dynamic-script @funindex make-dynamic-script -Las indicaciones dinámicas sencillas y centradas se crean fácilmente -con la función @code{make-dynamic-script}. +Las indicaciones dinámicas sencillas y centradas se crean +fácilmente con la función @code{make-dynamic-script}. @lilypond[verbatim,quote] sfzp = #(make-dynamic-script "sfzp") -\relative c' { - c4 c c\sfzp c +\relative { + c'4 c c\sfzp c } @end lilypond -En general @code{make-dynamic-script} toma cualquier objeto de marcado -como argumento. La fuente tipográfica de matices sólo contiene los -caracteres @code{f, m, p, r, s} y @code{z}, por lo que si se desea -obtener una indicación dinámica que incluya texto normal o signos de -puntuación, es necesario utilizar instrucciones de marcado que -devuelvan los ajustes de la familia de fuente tipográfica y su -codificación a las del texto normal, por ejemplo @code{\normal-text}. -El interés de la utilización de @code{make-dynamic-script} en lugar de -un elemento de marcado corriente está en asegurar la alineación -vertical de los objetos de marcado y reguladores que se aplican a la -misma cabeza de nota. +En general @code{make-dynamic-script} toma cualquier objeto de +marcado como argumento. La fuente tipográfica de matices sólo +contiene los caracteres @code{f, m, p, r, s} y @code{z}, por lo +que si se desea obtener una indicación dinámica que incluya texto +normal o signos de puntuación, es necesario utilizar instrucciones +de marcado que devuelvan los ajustes de la familia de fuente +tipográfica y su codificación a las del texto normal, por ejemplo +@code{\normal-text}. El interés de la utilización de +@code{make-dynamic-script} en lugar de un elemento de marcado +corriente está en asegurar la alineación vertical de los objetos +de marcado y reguladores que se aplican a la misma cabeza de nota. @lilypond[verbatim,quote] roundF = \markup { \center-align \concat { @@ -614,8 +603,8 @@ mfEspress = \markup { \center-align \line { roundFdynamic = #(make-dynamic-script roundF) boxFdynamic = #(make-dynamic-script boxF) mfEspressDynamic = #(make-dynamic-script mfEspress) -\relative c' { - c4_\roundFdynamic\< d e f +\relative { + c'4_\roundFdynamic\< d e f g,1~_\boxFdynamic\> g1 g'1~\mfEspressDynamic @@ -623,15 +612,16 @@ mfEspressDynamic = #(make-dynamic-script mfEspress) } @end lilypond -Se puede utilizar en su lugar la forma Scheme del modo de marcado. Su -sintaxis se explica en @rextend{Construcción del marcado en Scheme}. +Se puede utilizar en su lugar la forma Scheme del modo de marcado. +Su sintaxis se explica en @rextend{Construcción del marcado en +Scheme}. @lilypond[verbatim,quote] moltoF = #(make-dynamic-script (markup #:normal-text "molto" #:dynamic "f")) -\relative c' { - 16 +\relative { + 16 2..\moltoF } @end lilypond @@ -644,8 +634,8 @@ moltoF = \tweak DynamicText.self-alignment-X #LEFT #(make-dynamic-script (markup #:normal-text "molto" #:dynamic "f")) -\relative c' { - 16 +\relative { + 16 2..\moltoF 1 } @end lilypond @@ -657,8 +647,8 @@ describen en @ref{Seleccionar la tipografía y su tamaño}. Referencia de la notación: @ref{Formatear el texto}, @ref{Seleccionar la tipografía y su tamaño}, -@ref{¿Qué sale por el MIDI?}, -@ref{Control de los matices en el MIDI}. +@ref{Enriquecimiento de la salida MIDI}, +@ref{Control de las dinámicas del MIDI}. Extender LilyPond: @rextend{Construcción del marcado en Scheme}. @@ -689,27 +679,29 @@ elevaciones de tono. @cindex ligaduras de expresión -Las @notation{Ligaduras de expresión} se introducen utilizando paréntesis: +Las @notation{Ligaduras de expresión} se introducen utilizando +paréntesis: @warning{En música polifónica, las ligaduras de expresión deben terminar en la misma voz en la que empiezan.} -@lilypond[verbatim,quote,relative=2] -f4( g a) a8 b( -a4 g2 f4) -2( 2) +@lilypond[verbatim,quote] +\relative { + f''4( g a) a8 b( + a4 g2 f4) + 2( 2) +} @end lilypond @cindex ligaduras de expresión, posicionamiento manual @cindex ligaduras de expresión, debajo de las notas @cindex ligaduras de expresión, encima de las notas @funindex \slurDown -@funindex slurDown @funindex \slurNeutral -@funindex slurNeutral -Las ligaduras de expresión se pueden colocar manualmente por encima o -por debajo de las notas; véase @ref{Dirección y posición}. +Las ligaduras de expresión se pueden colocar manualmente por +encima o por debajo de las notas; véase +@ref{Dirección y posición}. @cindex fraseo, ligadura de @cindex varias ligaduras de expresión @@ -718,11 +710,21 @@ por debajo de las notas; véase @ref{Dirección y posición}. @cindex ligaduras de expresión, varias @cindex ligaduras de expresión simultáneas -No están permitidas las ligaduras de expresión simultáneas o -solapadas, pero una ligadura de fraseo se puede solapar con una -ligadura de expresión. Esto hace posible imprimir dos ligaduras -distintas al mismo tiempo. Para ver más detalles, consulte -@ref{Ligaduras de fraseo}. +Debe tenerse cuidado con las ligaduras de expresión simultáneas o +superpuestas. En casi todos los casos, las ligaduras de expresión +externas indican, ciertamente, fraseo, y las ligaduras de fraseo +pueden superponerse a las ligaduras de expresión normales, véase +@ref{Ligaduras de fraseo}. Cuando se necesitan varias ligaduras +de expresión normales dentro de una sola voz, los comienzos y +finales correspondientes de las ligaduras deben etiquetarse +precediéndolos por @code{\=} seguido de un número o cadena de +caracteres que la identifique. + +@lilypond[verbatim,quote] +\fixed c' { + 2 +} +@end lilypond @cindex ligadura de expresión, estilo @cindex ligadura continua @@ -734,69 +736,68 @@ distintas al mismo tiempo. Para ver más detalles, consulte @cindex estilo de la ligadura @funindex \slurDashed -@funindex slurDashed @funindex \slurDotted -@funindex slurDotted @funindex \slurSolid -@funindex slurSolid Las ligaduras de expresión pueden ser continuas, discontinuas o de -puntos. El estilo predeterminado de las ligaduras de expresión es el -continuo: - -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurDashed -g4( e c2) -\slurDotted -c4( e g2) -\slurSolid -g4( e c2) +puntos. El estilo predeterminado de las ligaduras de expresión es +el continuo: + +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurDashed + g4( e c2) + \slurDotted + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @cindex ligadura de expresión, mitad continua y mitad discontinua @funindex \slurHalfDashed -@funindex slurHalfDashed @funindex \slurHalfSolid -@funindex slurHalfSolid También se puede hacer que las ligaduras de expresión sean semi-discontinuas (la primera mitad discontinua y la segunda mitad continua) o semi-continuas (la primera mitad continua y la segunda discontinua): -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurHalfDashed -g4( e c2) -\slurHalfSolid -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurHalfDashed + g4( e c2) + \slurHalfSolid + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @cindex ligadura de expresión, definir patrones de discontinuidad @funindex \slurDashPattern -@funindex slurDashPattern Se pueden definir patrones de discontinuidad para las ligaduras de expresión: -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurDashPattern #0.7 #0.75 -g4( e c2) -\slurDashPattern #0.5 #2.0 -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurDashPattern #0.7 #0.75 + g4( e c2) + \slurDashPattern #0.5 #2.0 + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @funindex \slurUp -@funindex slurUp @predefined @@ -852,27 +853,27 @@ Referencia de funcionamiento interno: @funindex \( @funindex \) -Las @notation{ligaduras de fraseo} (o marcas de fraseo) que indican -una frase musical se escriben usando las instrucciones @code{\(} y -@code{\)} respectivamente: +Las @notation{ligaduras de fraseo} (o marcas de fraseo) que +indican una frase musical se escriben usando las instrucciones +@code{\(} y @code{\)} respectivamente: -@lilypond[verbatim,quote,relative=2] -c4\( d( e) f( -e2) d\) +@lilypond[verbatim,quote] +\relative { + c''4\( d( e) f( + e2) d\) +} @end lilypond @funindex \phrasingSlurUp -@funindex phrasingSlurUp @funindex \phrasingSlurDown -@funindex phrasingSlurDown @funindex \phrasingSlurNeutral -@funindex phrasingSlurNeutral -Tipográficamente, la ligadura de fraseo se comporta casi exactamente -igual que una ligadura de expresión normal. Sin embargo, se tratan -como objetos diferentes. Una @code{\slurUp} no tendrá ningún efecto -sobre una ligadura de fraseo. El fraseo se puede situar manualmente -por encima o por debajo de las notas; véase @ref{Dirección y posición}. +Tipográficamente, la ligadura de fraseo se comporta casi +exactamente igual que una ligadura de expresión normal. Sin +embargo, se tratan como objetos diferentes. Una @code{\slurUp} no +tendrá ningún efecto sobre una ligadura de fraseo. El fraseo se +puede situar manualmente por encima o por debajo de las notas; +véase @ref{Dirección y posición}. @cindex simultáneas, ligaduras de fraseo @cindex varias ligaduras de fraseo @@ -881,7 +882,9 @@ por encima o por debajo de las notas; véase @ref{Dirección y posición}. @cindex fraseo, ligaduras de, simultáneas @cindex fraseo, ligaduras de, varias -No se pueden tener varias ligaduras de fraseo simultáneas o solapadas. +Las ligaduras de fraseo simultáneas o superpuestas se introducen +usando @code{\=} igual que se hace con las ligaduras de expresión +normales, véase @ref{Ligaduras de expresión}. @cindex fraseo, ligaduras de, discontinuas @cindex discontinuas, ligaduras de fraseo @@ -890,73 +893,74 @@ No se pueden tener varias ligaduras de fraseo simultáneas o solapadas. @cindex ligaduras de fraseo discontinuas @cindex ligaduras de fraseo punteadas -@funindex phrasingSlurDashed @funindex \phrasingSlurDashed @funindex \phrasingSlurDotted -@funindex phrasingSlurDotted @funindex \phrasingSlurSolid -@funindex phrasingSlurSolid - -Las ligaduras de fraseo pueden ser continuas, de puntos o de rayas. -El estilo predeterminado para las ligaduras de fraseo es el continuo: - -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurDashed -g4\( e c2\) -\phrasingSlurDotted -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) + +Las ligaduras de fraseo pueden ser continuas, de puntos o de +rayas. El estilo predeterminado para las ligaduras de fraseo es +el continuo: + +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurDashed + g4\( e c2\) + \phrasingSlurDotted + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond @cindex fraseo, ligadura de, mitad continua y mitad discontinua @cindex ligadura de fraseo mitad continua y mitad discontinua -@funindex phrasingSlurHalfDashed @funindex \phrasingSlurHalfDashed @funindex \phrasingSlurHalfSolid -@funindex phrasingSlurHalfSolid Se puede hacer también que las ligaduras de fraseo sean semi-discontinuas (la primera mitad discontinua y la segunda mitad continua) o semi-continuas (la primera mitad continua y la segunda mitad discontinua): -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurHalfDashed -g4\( e c2\) -\phrasingSlurHalfSolid -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurHalfDashed + g4\( e c2\) + \phrasingSlurHalfSolid + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond @cindex fraseo, ligadura de, definir patrones de discontinuidad @cindex ligadura de fraseo, definir patrones de discontinuidad @funindex \phrasingSlurDashPattern -@funindex phrasingSlurDashPattern Se pueden definir patrones de discontinuidad para las ligaduras de fraseo: -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurDashPattern #0.7 #0.75 -g4\( e c2\) -\phrasingSlurDashPattern #0.5 #2.0 -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurDashPattern #0.7 #0.75 + g4\( e c2\) + \phrasingSlurDashPattern #0.5 #2.0 + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond Las definiciones de patrones de discontinuidad tienen la misma -estructura que las definiciones de patrones de discontinuidad de las -ligaduras de expresión. Para ver más información acerca de patrones -de discontinuidad complejos, consulte los fragmentos de código bajo -@ref{Ligaduras de expresión}. +estructura que las definiciones de patrones de discontinuidad de +las ligaduras de expresión. Para ver más información acerca de +patrones de discontinuidad complejos, consulte los fragmentos de +código bajo @ref{Ligaduras de expresión}. @predefined @code{\phrasingSlurUp}, @@ -992,19 +996,27 @@ Referencia de funcionamiento interno: @cindex respiraciones @cindex pausa, marcas de @funindex \breathe -@funindex breathe Las respiraciones se introducen utilizando @code{\breathe}: -@lilypond[verbatim,quote,relative=2] -c2. \breathe d4 +@lilypond[verbatim,quote] +{ c''2. \breathe d''4 } @end lilypond -Las marcas de respiración dan por terminadas las barras automáticas; -para sobreescribir este comportamiento, consulte @ref{Barras manuales}. +A diferencia de otras marcas de expresión, los símbolos de +respiración no están asociados con la nota anterior, sino que son +eventos independientes. Por ello, todas las marcas de expresión +que están adjuntas a la nota anterior, cualquier corchete recto +que indique barrado manual, y cualquier paréntesis que indique +ligaduras de expresión y de fraseo, deben escribirse antes de +@code{\breathe}. + +Las marcas de respiración dan por terminadas las barras +automáticas; para sobreescribir este comportamiento, consulte +@ref{Barras manuales}. -@lilypond[verbatim,quote,relative=2] -c8 \breathe d e f g2 +@lilypond[verbatim,quote] +\relative { c''8 \breathe d e f g2 } @end lilypond Están contemplados los indicadores musicales para las marcas de @@ -1052,22 +1064,23 @@ Referencia de funcionamiento interno: @cindex caídas de tono (falls) @cindex elevaciones de tono (doits) @funindex \bendAfter -@funindex bendAfter Se pueden expresar @notation{caídas} y @notation{subidas} de tono (falls y doits) añadidas a las notas mediante la instrucción -@code{\bendAfter}. La dirección de la caída o elevación se indica con -un signo más o menos (arriba o abajo). El número indica el intervalo -de alturas sobre el que se extiende la caída o elevación +@code{\bendAfter}. La dirección de la caída o elevación se indica +con un signo más o menos (arriba o abajo). El número indica el +intervalo de alturas sobre el que se extiende la caída o elevación @emph{partiendo de} la nota principal. -@lilypond[verbatim,quote,relative=2] -c2\bendAfter #+4 -c2\bendAfter #-4 -c2\bendAfter #+6.5 -c2\bendAfter #-6.5 -c2\bendAfter #+8 -c2\bendAfter #-8 +@lilypond[verbatim,quote] +\relative c'' { + c2\bendAfter #+4 + c2\bendAfter #-4 + c2\bendAfter #+6.5 + c2\bendAfter #-6.5 + c2\bendAfter #+8 + c2\bendAfter #-8 +} @end lilypond @snippets @@ -1104,15 +1117,16 @@ siguen un camino lineal: glissandi, arpegios y trinos. @cindex glissando @funindex \glissando -@funindex glissando -Se crea un @notation{glissando} añadiendo @code{\glissando} después de -la nota: +Se crea un @notation{glissando} añadiendo @code{\glissando} +después de la nota: -@lilypond[verbatim,quote,relative=2] -g2\glissando g' -c2\glissando c, -\afterGrace f,1\glissando f'16 +@lilypond[verbatim,quote] +\relative { + g'2\glissando g' + c2\glissando c, + \afterGrace f,1\glissando f'16 +} @end lilypond Un glissando puede conectar notas de un pentagrama a otro: @@ -1134,30 +1148,32 @@ Un glissando puede conectar notas de un pentagrama a otro: @end lilypond Un glissando puede conectar las notas dentro de un acorde. Si se -necesita hacer algo que no sea una conexión de una nota con otra entre -los dos acordes, las conexiones entre las notas vienen definidas por -medio de @code{\glissandoMap}, donde las notas de un acorde se suponen -numeradas, empezando en cero, en el orden en que aparecen en el código -de entrada del archivo @file{.ly}. - -@lilypond[verbatim,quote,relative=2] -1\glissando g' | -1\glissando | - | -\break -\set glissandoMap = #'((0 . 1) (1 . 0)) -1\glissando | - | -\set glissandoMap = #'((0 . 0) (0 . 1) (0 . 2)) -c1\glissando | - | -\set glissandoMap = #'((2 . 0) (1 . 0) (0 . 1)) -1\glissando | - | +necesita hacer algo que no sea una conexión de una nota con otra +entre los dos acordes, las conexiones entre las notas vienen +definidas por medio de @code{\glissandoMap}, donde las notas de un +acorde se suponen numeradas, empezando en cero, en el orden en que +aparecen en el código de entrada del archivo @file{.ly}. + +@lilypond[verbatim,quote] +\relative { + 1\glissando g' | + 1\glissando | + | + \break + \set glissandoMap = #'((0 . 1) (1 . 0)) + 1\glissando | + | + \set glissandoMap = #'((0 . 0) (0 . 1) (0 . 2)) + c1\glissando | + | + \set glissandoMap = #'((2 . 0) (1 . 0) (0 . 1)) + 1\glissando | + | +} @end lilypond -Se pueden crear distintos tipos de glissando. Para ver más detalles, -consulte @ref{Estilos de línea}. +Se pueden crear distintos tipos de glissando. Para ver más +detalles, consulte @ref{Estilos de línea}. @snippets @lilypondfile[verbatim,quote,texidoc,doctitle] @@ -1186,8 +1202,8 @@ Referencia de funcionamiento interno: @rinternals{Glissando}. @knownissues -La impresión de texto sobre la línea (como @notation{gliss.}) no está -contemplada. +La impresión de texto sobre la línea (como @notation{gliss.}) no +está contemplada. @node Arpegio @@ -1199,72 +1215,70 @@ contemplada. @cindex acorde arpegiado @cindex quebrado, acorde @funindex \arpeggio -@funindex arpeggio @funindex \arpeggioArrowUp -@funindex arpeggioArrowUp @funindex \arpeggioArrowDown -@funindex arpeggioArrowDown @funindex \arpeggioNormal -@funindex arpeggioNormal -Un signo de @notation{acorde arpegiado} (conocido también como acorde -quebrado) sobre un acorde, se denota adjuntando @code{\arpeggio} al -acorde: +Un signo de @notation{acorde arpegiado} (conocido también como +acorde quebrado) sobre un acorde, se denota adjuntando +@code{\arpeggio} al acorde: -@lilypond[verbatim,quote,relative=1] -1\arpeggio +@lilypond[verbatim,quote] +\relative { 1\arpeggio } @end lilypond Se pueden escribir distintos tipos de acordes arpegiados. @code{\arpeggioNormal} produce la vuelta al arpegio normal: -@lilypond[verbatim,quote,relative=1] -2\arpeggio +@lilypond[verbatim,quote] +\relative { + 2\arpeggio -\arpeggioArrowUp -2\arpeggio + \arpeggioArrowUp + 2\arpeggio -\arpeggioArrowDown -2\arpeggio + \arpeggioArrowDown + 2\arpeggio -\arpeggioNormal -2\arpeggio + \arpeggioNormal + 2\arpeggio +} @end lilypond @cindex arpegiado, acorde, símbolos especiales @cindex especial, símbolos de arpegio @funindex \arpeggioBracket -@funindex arpeggioBracket @funindex \arpeggioParenthesis -@funindex arpeggioParenthesis @funindex \arpeggioParenthesisDashed -@funindex arpeggioParenthesisDashed Se pueden crear símbolos especiales de arpegio @emph{con corchete}: -@lilypond[verbatim,quote,relative=1] -2 +@lilypond[verbatim,quote] +\relative { + 2 -\arpeggioBracket -2\arpeggio + \arpeggioBracket + 2\arpeggio -\arpeggioParenthesis -2\arpeggio + \arpeggioParenthesis + 2\arpeggio -\arpeggioParenthesisDashed -2\arpeggio + \arpeggioParenthesisDashed + 2\arpeggio -\arpeggioNormal -2\arpeggio + \arpeggioNormal + 2\arpeggio +} @end lilypond Las propiedades de discontinuidad del paréntesis del arpegio se -controlan mediante la propiedad @code{'dash-details}, que se describe -en @ref{Ligaduras de expresión}. +controlan mediante la propiedad @code{'dash-definition}, que se +describe en @ref{Ligaduras de expresión}. -Los acordes arpegiados se pueden desarrollar explícitamente utilizando -@notation{ligaduras de unión}. Véase @ref{Ligaduras de unión}. +Los acordes arpegiados se pueden desarrollar explícitamente +utilizando @notation{ligaduras de unión}. Véase +@ref{Ligaduras de unión}. @predefined @code{\arpeggio}, @@ -1323,11 +1337,8 @@ see @ref{Plicas de pentagrama cruzado}. @cindex trinos @funindex \trill -@funindex trill @funindex \startTrillSpan -@funindex startTrillSpan @funindex \stopTrillSpan -@funindex stopTrillSpan Los trinos cortos sin línea extensora se imprimen con @code{\trill}; véase @ref{Articulaciones y ornamentos}. @@ -1335,35 +1346,41 @@ Los trinos cortos sin línea extensora se imprimen con Los @notation{trinos} largos mantenidos, con línea de extensión, se hacen con @code{\startTrillSpan} y @code{\stopTrillSpan}: -@lilypond[verbatim,quote,relative=2] -d1\startTrillSpan -d1 -c2\stopTrillSpan -r2 +@lilypond[verbatim,quote] +\relative { + d''1\startTrillSpan + d1 + c2\stopTrillSpan + r2 +} @end lilypond -Un trino extendido que atraviesa un salto de línea -recomienza exactamente encima de la primera nota -de la nueva línea. +Un trino extendido que atraviesa un salto de línea recomienza +exactamente encima de la primera nota de la nueva línea. -@lilypond[ragged-right,verbatim,quote,relative=2] -d1\startTrillSpan -\break -d1 -c2\stopTrillSpan -r2 +@lilypond[ragged-right,verbatim,quote] +\relative { + d''1\startTrillSpan + \break + d1 + c2\stopTrillSpan + r2 +} @end lilypond Los trinos extendidos consecutivos funcionan sin necesidad de instrucciones @code{\stopTrillSpan} explícitas, porque cada trino -se convertirá automáticamente en el borde derecho del trino anterior. - -@lilypond[verbatim,quote,relative=2] -d1\startTrillSpan -d1 -b1\startTrillSpan -d2\stopTrillSpan -r2 +se convertirá automáticamente en el borde derecho del trino +anterior. + +@lilypond[verbatim,quote] +\relative { + d''1\startTrillSpan + d1 + b1\startTrillSpan + d2\stopTrillSpan + r2 +} @end lilypond También se pueden combinar los trinos con notas de adorno. @@ -1371,29 +1388,32 @@ La sintaxis de esta construcción y el método para colocar las notas de adorno con precisión están descritos en @ref{Notas de adorno}. -@lilypond[verbatim,quote,relative=2] -d1~\afterGrace -d1\startTrillSpan { c32[ d]\stopTrillSpan } -c2 r2 +@lilypond[verbatim,quote] +\relative { + d''1~\afterGrace + d1\startTrillSpan { c32[ d]\stopTrillSpan } + c2 r2 +} @end lilypond @cindex trinos de nota explícita @cindex explícita, trinos de nota @funindex \pitchedTrill -@funindex pitchedTrill Los trinos que se tienen que ejecutar sobre notas auxiliares explícitas se pueden tipografiar con la instrucción -@code{pitchedTrill}. El primer argumento es la nota principal, y el -segundo es la nota @emph{trinada}, que se imprime como una cabeza de -nota, sin plica y entre paréntesis. - -@lilypond[verbatim,quote,relative=2] -\pitchedTrill -d2\startTrillSpan fis -d2 -c2\stopTrillSpan -r2 +@code{pitchedTrill}. El primer argumento es la nota principal, y +el segundo es la nota @emph{trinada}, que se imprime como una +cabeza de nota, sin plica y entre paréntesis. + +@lilypond[verbatim,quote] +\relative { + \pitchedTrill + d''2\startTrillSpan fis + d2 + c2\stopTrillSpan + r2 +} @end lilypond @cindex trino con nota y alteración @@ -1403,19 +1423,21 @@ Es necesario añadir manualmente las alteraciones subsiguientes de la misma nota dentro del mismo compás. Sólo se imprime la alteración del primer trino con nota, dentro de un compás. -@lilypond[verbatim,quote,relative=2] -\pitchedTrill -eis4\startTrillSpan fis -eis4\stopTrillSpan -\pitchedTrill -eis4\startTrillSpan cis -eis4\stopTrillSpan -\pitchedTrill -eis4\startTrillSpan fis -eis4\stopTrillSpan -\pitchedTrill -eis4\startTrillSpan fis! -eis4\stopTrillSpan +@lilypond[verbatim,quote] +\relative { + \pitchedTrill + eis''4\startTrillSpan fis + eis4\stopTrillSpan + \pitchedTrill + eis4\startTrillSpan cis + eis4\stopTrillSpan + \pitchedTrill + eis4\startTrillSpan fis + eis4\stopTrillSpan + \pitchedTrill + eis4\startTrillSpan fis! + eis4\stopTrillSpan +} @end lilypond diff --git a/Documentation/es/notation/fretted-strings.itely b/Documentation/es/notation/fretted-strings.itely index 1a5699dd5d..62f92f0fbc 100644 --- a/Documentation/es/notation/fretted-strings.itely +++ b/Documentation/es/notation/fretted-strings.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: b8a84e9fbdbb30e224d05afb73233760c3dacc4d + Translation of GIT committish: a9fa9784c0b21fe7de2738befc0a3bcc5f89ee4f When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.28" @node Instrumentos de cuerda con trastes @section Instrumentos de cuerda con trastes @@ -28,6 +28,7 @@ exclusivos de los instrumentos de cuerda con trastes. * Notación común para cuerdas con trastes:: * Guitarra:: * Banjo:: +* Laúd:: @end menu @@ -54,17 +55,17 @@ instrumentos de cuerda con trastes. @unnumberedsubsubsec Referencias para cuerdas con trastes @translationof References for fretted strings -La notación musical para instrumentos de cuerda con trastes se realiza -normalmente en una sola pauta, ya sea en notación musical tradicional -o en tablatura. A veces se combinan los dos tipos, y es común en -música popular utilizar diagramas de acordes por encima de un -pentagrama de notación tradicional. La guitarra y el banjo son -instrumentos transpositores, que suenan una octava por debajo de lo -escrito. Las partituras para estos instrumentos deben usar la clave -de Sol octava baja @code{"treble_8"} (o @code{\transposition c} para -obtener una salida MIDI correcta). Otros elementos relativos a los -instrumentos de cuerda con trastes se estudian en otras partes de -manual: +La notación musical para instrumentos de cuerda con trastes se +realiza normalmente en una sola pauta, ya sea en notación musical +tradicional o en tablatura. A veces se combinan los dos tipos, y +es común en música popular utilizar diagramas de acordes por +encima de un pentagrama de notación tradicional. La guitarra y el +banjo son instrumentos transpositores, que suenan una octava por +debajo de lo escrito. Las partituras para estos instrumentos +deben usar la clave de Sol octava baja @code{"treble_8"} (o +@code{\transposition c} para obtener una salida MIDI correcta). +Otros elementos relativos a los instrumentos de cuerda con trastes +se estudian en otras partes de manual: @itemize @item @@ -72,15 +73,16 @@ Las digitaciones se indican como se explica en @ref{Indicaciones de digitación}. @item -Las instrucciones para ligaduras @notation{Laissez vibrer} así como -ligaduras de unión sobre arpegios y trémolos están en +Las instrucciones para ligaduras @notation{Laissez vibrer} así +como ligaduras de unión sobre arpegios y trémolos están en @ref{Ligaduras de unión}. @item Las instrucciones para el manejo de varias voces se encuentran en @ref{Resolución de las colisiones}. -@item Las instrucciones para la indicación de armónicos está en +@item +Las instrucciones para la indicación de armónicos está en @ref{Armónicos}. @end itemize @@ -109,20 +111,20 @@ Referencia de la notación: Se puede indicar la cuerda en que se debe tocar una nota añadiendo @code{\}@tie{}@var{número} a una nota. -@lilypond[verbatim,quote,relative=0] +@lilypond[verbatim,quote,fragment] \clef "treble_8" c4\5 e\4 g2\3 -1 +1 @end lilypond -Cuando se usan al mismo tiempo digitaciones e indicaciones del número -de cuerda, su colocación se puede controlar por el orden en que -aparecen estos elementos en el código @emph{solamente} si aparecen -dentro de un acorde explícito: aplicado a acordes completos o notas -individuales @emph{fuera} de acordes, las digitaciones se colocan -usando un mecanismo distinto. +Cuando se usan al mismo tiempo digitaciones e indicaciones del +número de cuerda, su colocación se puede controlar por el orden en +que aparecen estos elementos en el código @emph{solamente} si +aparecen dentro de un acorde explícito: aplicado a acordes +completos o notas individuales @emph{fuera} de acordes, las +digitaciones se colocan usando un mecanismo distinto. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef "treble_8" g4\3-0 g-0\3 @@ -130,6 +132,22 @@ g-0\3 @end lilypond +Los números de cuerda también pueden (así como en los instrumentos +sin trastes, donde es obligatorio) imprimirse en números romanos y +colocarse bajo el pentagrama, en lugar de encima de él. + +@lilypond[verbatim,quote,fragment] +\clef "treble_8" +c'2\2 +a\3 +\romanStringNumbers +c'\2 +\set stringNumberOrientations = #'(down) +a\3 +\arabicStringNumbers +g1\4 +@end lilypond + @snippets @lilypondfile[verbatim,quote,texidoc,doctitle] @@ -138,6 +156,11 @@ g-0\3 @lilypondfile[verbatim,quote,texidoc,doctitle] {allowing-fingerings-to-be-printed-inside-the-staff.ly} +@predefined +@code{\arabicStringNumbers}, +@code{\romanStringNumbers}. +@endpredefined + @seealso Referencia de la notación: @ref{Indicaciones de digitación}. @@ -161,33 +184,32 @@ Referencia de funcionamiento interno: @funindex TabVoice La notación para instrumentos de cuerda pulsada se realiza con -frecuencia utilizando un sistema de dedos y cifras, o tablatura. A -diferencia de la notación tradicional, las notas no se designan +frecuencia utilizando un sistema de dedos y cifras, o tablatura. +A diferencia de la notación tradicional, las notas no se designan mediante figuras, sino mediante números (o símbolos semejantes a letras en la intavolatura histórica). Las líneas de la tablatura indican sobre qué cuerda se debe tocar la nota, y el número sobre una línea indica el traste en que la cuerda correspondiente debe -pisarse. Las notas que se deben tocar simultáneamente se -alinean en sentido vertical. +pisarse. Las notas que se deben tocar simultáneamente se alinean +en sentido vertical. De forma predeterminada, la cuerda 1 es la más aguda y corresponde a la línea superior de la pauta @code{TabStaff}. La afinación predeterminada de las cuerdas del @code{TabStaff} es la afinación -estándar de guitarra (con 6 cuerdas). Las notas se imprimen -como tablatura, usando los contextos @code{TabStaff} -y @code{TabVoice}. Se añade automáticamente una clave caligráfica -de tablatura. +estándar de guitarra (con 6 cuerdas). Las notas se imprimen como +tablatura, usando los contextos @code{TabStaff} y @code{TabVoice}. +Se añade automáticamente una clave caligráfica de tablatura. @lilypond[quote,ragged-right,verbatim] -\new TabStaff \relative c' { +\new TabStaff \relative { a,8 a' a d,8 a' a } @end lilypond -Las tablaturas predeterminadas no contienen símbolos para la duración -de las notas ni ningún otro símbolo musical, como p.ej. indicaciones -expresivas. +Las tablaturas predeterminadas no contienen símbolos para la +duración de las notas ni ningún otro símbolo musical, como +p.ej. indicaciones expresivas. @lilypond[quote,ragged-right,verbatim] symbols = { @@ -195,7 +217,7 @@ symbols = { c4-.^"Allegro" d( e) f4-.\f g a^\fermata \mark \default - c8_.\<\( c16 c~ c2\! + c8_.\<\( c16 c~ 2\! c'2.\prall\) } @@ -210,10 +232,11 @@ symbols = { @funindex \tabFullNotation Si queremos que todos los símbolos musicales que se usan en la -notación tradicional aparezcan también en la tablatura, tenemos que -aplicar la instrucción @code{\tabFullNotation} dentro de un contexto -@code{TabStaff}. Tenga en cuenta que, en la tablatura, las blancas -tienen doble plica para poder distinguirlas de las negras. +notación tradicional aparezcan también en la tablatura, tenemos +que aplicar la instrucción @code{\tabFullNotation} dentro de un +contexto @code{TabStaff}. Tenga en cuenta que, en la tablatura, +las blancas tienen doble plica para poder distinguirlas de las +negras. @lilypond[quote,ragged-right,verbatim] symbols = { @@ -221,7 +244,7 @@ symbols = { c4-.^"Allegro" d( e) f4-.\f g a^\fermata \mark \default - c8_.\<\( c16 c~ c2\! + c8_.\<\( c16 c~ 2\! c'2.\prall\) } @@ -238,31 +261,33 @@ symbols = { @funindex minimumFret @funindex restrainOpenStrings -De forma predeterminada, las notas se asignan a la posición más baja -del mástil (primera posición). Las cuerdas al aire se toman como -preferencia, automáticamente. Si queremos que una nota determinada se -toque sobre una cuerda concreta, podemos añadir una indicación de -número de cuerda al nombre de la nota. Si no queremos que las -indicaciones de número de cuerda aparezcan en la notación tradicional, -podemos sobreescribir el sello correspondiente. Generalmente es mucho -más cómodo definir la posición utilizando el valor de -@code{minimumFret}. El valor predeterminado de es 0. - -Incluso si @code{minimumFret} está establecido, se usan las cuerdas al -aire siempre que sea posible. Este comportamiento se puede cambiar -fijando @code{restrainOpenStrings} al valor @code{#t}. +De forma predeterminada, las notas se asignan a la posición más +baja del mástil (primera posición). Las cuerdas al aire se toman +como preferencia, automáticamente. Si queremos que una nota +determinada se toque sobre una cuerda concreta, podemos añadir una +indicación de número de cuerda al nombre de la nota. Si no +queremos que las indicaciones de número de cuerda aparezcan en la +notación tradicional, podemos sobreescribir el sello +correspondiente. Generalmente es mucho más cómodo definir la +posición utilizando el valor de @code{minimumFret}. El valor +predeterminado de es 0. + +Incluso si @code{minimumFret} está establecido, se usan las +cuerdas al aire siempre que sea posible. Este comportamiento se +puede cambiar fijando @code{restrainOpenStrings} al valor +@code{#t}. @lilypond[quote,ragged-right,verbatim] \layout { \omit Voice.StringNumber } \new StaffGroup << - \new Staff \relative c { + \new Staff \relative { \clef "treble_8" \time 2/4 c16 d e f g4 c,16\5 d\5 e\4 f\4 g4\4 c,16 d e f g4 } - \new TabStaff \relative c { + \new TabStaff \relative { c16 d e f g4 c,16\5 d\5 e\4 f\4 g4\4 \set TabStaff.minimumFret = #5 @@ -276,21 +301,24 @@ fijando @code{restrainOpenStrings} al valor @code{#t}. @funindex \chordRepeats @cindex acordes, repetición de @cindex repetición con @code{q} +@cindex @code{q}, repetición de acordes -Las construcciones de acorde se pueden repetir mediante el símbolo de -repetición de acordes @code{q}. En combinación con las tablaturas, su -comportamiento de eliminar números de cuerda y de dedos junto a otros -eventos es fastidioso, por lo que quizá quiera ejecutar +Las construcciones de acorde se pueden repetir mediante el símbolo +de repetición de acordes @code{q}. En combinación con las +tablaturas, su comportamiento de eliminar números de cuerda y de +dedos junto a otros eventos es fastidioso, por lo que quizá quiera +ejecutar @example \chordRepeats #'(string-number-event fingering-event) @end example explícitamente sobre expresiones musicales en las tablaturas que -utilicen @ref{Repetición de acordes}. Esta instrucción en particular -es tan común que está disponible como @code{\tabChordRepeats}. +utilicen @ref{Repetición de acordes}. Esta instrucción en +particular es tan común que está disponible como +@code{\tabChordRepeats}. @lilypond[quote,verbatim] -guitar = \relative c' { - r8 ~ q4 q8~ q q4 +guitar = \relative { + r8 ~ q4 q8~ 8 q4 } \new StaffGroup << @@ -304,15 +332,15 @@ guitar = \relative c' { >> @end lilypond -Las ligaduras de unión que cruzan saltos de línea llevan paréntesis de -forma predeterminada. Lo mismo rige para la casilla de segunda vez de -una repetición. +Las ligaduras de unión que cruzan saltos de línea llevan +paréntesis de forma predeterminada. Lo mismo rige para la casilla +de segunda vez de una repetición. @lilypond[quote,ragged-right,verbatim] -ties = \relative c' { +ties = \relative { \repeat volta 2 { - e2. f4~ - f2 g2~ + e'2. f4~ + 2 g2~ } \alternative { { g4 f2. } @@ -345,14 +373,14 @@ ties = \relative c' { @funindex \hideSplitTiedTabNotes -La instrucción @code{\hideSplitTiedTabNotes} cancela el comportamiento -de imprimir los números de traste entre paréntesis: +La instrucción @code{\hideSplitTiedTabNotes} cancela el +comportamiento de imprimir los números de traste entre paréntesis: @lilypond[quote,ragged-right,verbatim] -ties = \relative c' { +ties = \relative { \repeat volta 2 { - e2. f4~ - f2 g2~ } + e'2. f4~ + 2 g2~ } \alternative { { g4 f2. } { g4\repeatTie c,2. } @@ -389,8 +417,8 @@ ties = \relative c' { @funindex \harmonicByFret @funindex \harmonicByRatio -Se pueden añadir indicaciones de armónicos a la notación de tablatura -como sus alturas de sonido: +Se pueden añadir indicaciones de armónicos a la notación de +tablatura como sus alturas de sonido: @lilypond[verbatim,quote] \layout { \omit Voice.StringNumber } @@ -410,12 +438,13 @@ firstHarmonic = { } @end lilypond -Observe que la instrucción @code{\harmonic} se debe adjuntar siempre a -notas individuales (posiblemente dentro de un acorde) en lugar de a -acordes completos. Sólo tiene sentido para armónicos sobre una cuerda -abierta en el duodécimo traste. Cualquier otro armónico debe estar -calculado por parte de LilyPond. Se puede conseguir esto indicando el -traste en que debe rozar la cuerda el dedo de la mano que pisa. +Observe que la instrucción @code{\harmonic} se debe adjuntar +siempre a notas individuales (posiblemente dentro de un acorde) en +lugar de a acordes completos. Sólo tiene sentido para armónicos +sobre una cuerda abierta en el duodécimo traste. Cualquier otro +armónico debe estar calculado por parte de LilyPond. Se puede +conseguir esto indicando el traste en que debe rozar la cuerda el +dedo de la mano que pisa. @lilypond[verbatim,quote] fretHarmonics = { @@ -435,8 +464,8 @@ fretHarmonics = { } @end lilypond -De forma alternativa, se pueden calcular los armónicos definiendo la -razón de las longitudes de cuerda por encima y por debajo de la +De forma alternativa, se pueden calcular los armónicos definiendo +la razón de las longitudes de cuerda por encima y por debajo de la digitación de armónico. @lilypond[verbatim,quote] @@ -530,7 +559,8 @@ melodia = \partcombine { e4 g g g } { e4 e e e } >> @end lilypond -Los efectos especiales de guitarra se limitan a armónicos y @emph{slides}. +Los efectos especiales de guitarra se limitan a armónicos y +@emph{slides}. @node Tablaturas personalizadas @unnumberedsubsubsec Tablaturas personalizadas @@ -553,16 +583,18 @@ Los efectos especiales de guitarra se limitan a armónicos y @emph{slides}. @funindex stringTunings -La tablatura en LilyPond calcula automáticamente el traste para cada -nota, basándose en la cuerda a que está asignada la nota. Para -hacerlo, es necesario especificar la afinación de las cuerdas. La -afinación de las cuerdas se da en la propiedad @code{stringTunings}. +La tablatura en LilyPond calcula automáticamente el traste para +cada nota, basándose en la cuerda a que está asignada la nota. +Para hacerlo, es necesario especificar la afinación de las +cuerdas. La afinación de las cuerdas se da en la propiedad +@code{stringTunings}. -LilyPond trae afinaciones predefinidas para el banjo, la mandolina, la -guitarra, el bajo, el ukelele, el violín, la viola, el violoncello y -el contrabajo. LilyPond establece automáticamente la transposición -correcta para las afinaciones predefinidas. El ejemplo siguiente es -para bajo, que suena una octava por debajo de lo escrito. +LilyPond trae afinaciones predefinidas para el banjo, la +mandolina, la guitarra, el bajo, el ukelele, el violín, la viola, +el violoncello y el contrabajo. LilyPond establece +automáticamente la transposición correcta para las afinaciones +predefinidas. El ejemplo siguiente es para bajo, que suena una +octava por debajo de lo escrito. @lilypond[quote,ragged-right,verbatim] << @@ -570,15 +602,15 @@ para bajo, que suena una octava por debajo de lo escrito. \omit StringNumber } { \clef "bass_8" - \relative c, { - c4 d e f + \relative { + c,4 d e f } } \new TabStaff \with { stringTunings = #bass-tuning } { - \relative c, { - c4 d e f + \relative { + c,4 d e f } } >> @@ -586,30 +618,29 @@ para bajo, que suena una octava por debajo de lo escrito. La afinación por omisión es @code{guitar-tuning} (la afinación estándar Mi-La-Re-Sol-Si-Mi). Otras afinaciones predefinidas son -@code{guitar-open-g-tuning} (Sol Mayor al aire, Re-Sol-Re-Sol-Si-Re), -@code{mandolin-tuning} (mandolina) y @code{banjo-open-g-tuning} (banjo -con Sol Mayor al aire). Las afinaciones predefinidas están en +@code{guitar-open-g-tuning} (Sol Mayor al aire, +Re-Sol-Re-Sol-Si-Re), @code{mandolin-tuning} (mandolina) y +@code{banjo-open-g-tuning} (banjo con Sol Mayor al aire). Las +afinaciones predefinidas están en @file{ly/string-tunings-init.ly}. -@funindex stringTuning @funindex \stringTuning @cindex tablaturas, afinaciones personalizadas @cindex personalizadas, afinaciones de cuerdas -Es posible crear cualquier afinación de cuerdas que se desee. -Se puede usar la función @code{\stringTuning} para definir una -afinación de cuerdas y que puede usarse para -establecerla como el valor de -@code{stringTunings} para el contexto actual. - -Su argumento es una construcción de acorde -que define la altura de las notas de cada cuerda al aire en dicha -afinación. La construcción de acorde debe estar en el modo de -octava absoluto, véase @ref{Escritura de octava absoluta}. -La cuerda con el número más alto (generalmente la más grave) -debe ir primero en el acorde. Por ejemplo, podemos definir una -afinación para un instrumento de cuatro cuerdas con las alturas -@code{a''}, @code{d''}, @code{g'} y @code{c'}: +Es posible crear cualquier afinación de cuerdas que se desee. Se +puede usar la función @code{\stringTuning} para definir una +afinación de cuerdas y que puede usarse para establecerla como el +valor de @code{stringTunings} para el contexto actual. + +Su argumento es una construcción de acorde que define la altura de +las notas de cada cuerda al aire en dicha afinación. La +construcción de acorde debe estar en el modo de octava absoluto, +véase @ref{Escritura de octava absoluta}. La cuerda con el número +más alto (generalmente la más grave) debe ir primero en el acorde. +Por ejemplo, podemos definir una afinación para un instrumento de +cuatro cuerdas con las alturas @code{a''}, @code{d''}, @code{g'} y +@code{c'}: @lilypond[quote,verbatim] @@ -631,7 +662,8 @@ mynotes = { @end lilypond La propiedad @code{stringTunings} también se utiliza por parte de -@code{FretBoards} para calcular los diagramas de posición automáticos. +@code{FretBoards} para calcular los diagramas de posición +automáticos. Las afinaciones de cuerdas se utilizan como parte de la clave de asociación para los diagramas de posición predefinidos (véase @@ -660,28 +692,28 @@ mynotes = { >> @end lilypond -Internamente, una afinación de las cuerdas es una lista de Scheme de -alturas, una por cada cuerda, ordenadas de 1 a N, donde la cuerda 1 -está arriba en la pauta de tablatura y la cuerda N está abajo. Esto -resulta generalmente en un orden de la nota más aguda a la más grave, -pero algunos instrumentos (p.ej. el ukelele) no tienen las cuerdas -dispuestas en orden de altura. +Internamente, una afinación de las cuerdas es una lista de Scheme +de alturas, una por cada cuerda, ordenadas de 1 a N, donde la +cuerda 1 está arriba en la pauta de tablatura y la cuerda N está +abajo. Esto resulta generalmente en un orden de la nota más aguda +a la más grave, pero algunos instrumentos (p.ej. el ukelele) no +tienen las cuerdas dispuestas en orden de altura. -La altura de una cuerda dentro de una lista de alturas de cuerdas es -un objeto altura de LilyPond. Los objetos altura se crean con la -función de Scheme @code{ly:make-pitch} (véase +La altura de una cuerda dentro de una lista de alturas de cuerdas +es un objeto altura de LilyPond. Los objetos altura se crean con +la función de Scheme @code{ly:make-pitch} (véase @ref{Funciones de Scheme}). @code{\stringTuning} crea dicho objeto a partir de la entrada de acordes. LilyPond calcula automáticamente el número de líneas dentro del -@code{TabStaff} y el número de cuerdas dentro de un @code{FretBoard} -calculado automáticamente como el número de elementos de -@code{stringTunings}. +@code{TabStaff} y el número de cuerdas dentro de un +@code{FretBoard} calculado automáticamente como el número de +elementos de @code{stringTunings}. -Para permitir a todos los contextos TabStaff usar la misma afinación -personalizada por omisión, podemos usar +Para permitir a todos los contextos TabStaff usar la misma +afinación personalizada por omisión, podemos usar @example \layout @{ @@ -710,7 +742,48 @@ También se puede usar una clave moderna de tablatura. } @end lilypond -La clave moderna de tablatura contempla tablaturas de 4 a 7 cuerdas. +La clave moderna de tablatura contempla tablaturas de 4 a 7 +cuerdas. + +@cindex microtonos, tablatura +@cindex cuartos de tono, tablatura +@cindex tablatura de microtonos +@cindex tablatura de cuartos de tono + +Ua pauta de tablatura @code{TabStaff} puede contener intervalos +microtonales como cuartos de tono, que se pueden reproducir +mediante eventos de la rueda de cambio de tono. Es necesario +fijar el valor @code{supportNonIntegerFret = ##t} dentro del +contexto Score. Sin embargo, los microtonos no están contemplados +en los diagramas @code{FretBoards}. + +@lilypond[quote,ragged-right,verbatim] +\layout { + \context { + \Score + supportNonIntegerFret = ##t + } +} + +custom-tuning = \stringTuning + +mus = \relative { + eeses'4 + eeseh + ees + eeh + e + eih + eis + eisih + eisis +} + +<< + \new Staff << \clef "G_8" \mus >> + \new TabStaff \with { stringTunings = \custom-tuning } \mus +>> +@end lilypond @seealso Referencia de la notación: @@ -729,9 +802,10 @@ Referencia de funcionamiento interno: @rinternals{Tab_note_heads_engraver}. @knownissues -Los cálculos de tablatura automáticos no funcionan bien en la mayoría -de los casos para instrumentos en que la afinación de las cuerdas no -varía de forma monótona con el número de cuerda, como el ukelele. +Los cálculos de tablatura automáticos no funcionan bien en la +mayoría de los casos para instrumentos en que la afinación de las +cuerdas no varía de forma monótona con el número de cuerda, como +el ukelele. @node Marcas de diagramas de trastes @@ -745,20 +819,21 @@ varía de forma monótona con el número de cuerda, como el ukelele. @cindex trastes, diagramas de, personalizados @cindex personalizados, diagramas de trastes -Se pueden añadir diagramas de trastes a la música como elementos de -marcado sobre la nota deseada. El marcado contiene información sobre -el diagrama de trastes deseado. Existen tres interfaces distintos de -marcado de diagramas de trastes: standard (estándar), terse (escueto) -y verbose (prolijo). Los tres interfaces producen marcados -equivalentes, pero tienen cantidades variables de información en la -cadena de marcado. Hay más detalles sobre la sintaxis de las distintos -cadenas de marcado que se usan para definir diagramas de posiciones en -@ref{Instrument Specific Markup}. - -La cadena de marcado de los diagramas estándar de trastes indica el -número de la cuerda y el número de traste en que se coloca cada uno de -los puntos sobre la cuerda. Además se pueden indicar cuerdas al aire -y cuerdas mudas (que no se tocan). +Se pueden añadir diagramas de trastes a la música como elementos +de marcado sobre la nota deseada. El marcado contiene información +sobre el diagrama de trastes deseado. Existen tres interfaces +distintos de marcado de diagramas de trastes: standard (estándar), +terse (escueto) y verbose (prolijo). Los tres interfaces producen +marcados equivalentes, pero tienen cantidades variables de +información en la cadena de marcado. Hay más detalles sobre la +sintaxis de las distintos cadenas de marcado que se usan para +definir diagramas de posiciones en @ref{Instrument Specific +Markup}. + +La cadena de marcado de los diagramas estándar de trastes indica +el número de la cuerda y el número de traste en que se coloca cada +uno de los puntos sobre la cuerda. Además se pueden indicar +cuerdas al aire y cuerdas mudas (que no se tocan). @lilypond[quote, verbatim] << @@ -781,8 +856,8 @@ y cuerdas mudas (que no se tocan). @cindex cejilla, indicación de -Las indicaciones de cejilla se pueden añadir al diagrama a partir de -la cadena de marcado del diagrama de trastes. +Las indicaciones de cejilla se pueden añadir al diagrama a partir +de la cadena de marcado del diagrama de trastes. @lilypond[quote, verbatim] << @@ -806,11 +881,11 @@ la cadena de marcado del diagrama de trastes. @cindex fret-diagram, marcado con @cindex ukelele -@funindex fret-diagram @funindex \fret-diagram -El tamaño del diagrama de trastes y el número de trastes del diagrama, -se puede cambiar en la cadena de marcado @code{fret-diagram}. +El tamaño del diagrama de trastes y el número de trastes del +diagrama, se puede cambiar en la cadena de marcado +@code{fret-diagram}. @lilypond[quote, verbatim] << @@ -831,9 +906,9 @@ se puede cambiar en la cadena de marcado @code{fret-diagram}. >> @end lilypond -Se puede cambiar el número de cuerdas de un diagrama de trastes para -que se adapte a distintos instrumentos como el bajo y el ukelele, con -la cadena de marcado del diagrama. +Se puede cambiar el número de cuerdas de un diagrama de trastes +para que se adapte a distintos instrumentos como el bajo y el +ukelele, con la cadena de marcado del diagrama. @lilypond[quote, verbatim] << @@ -874,8 +949,8 @@ marcado del diagrama. >> @end lilypond -Se puede controlar el radio y la posición de los puntos con la cadena -de marcado @code{fret-diagram}. +Se puede controlar el radio y la posición de los puntos con la +cadena de marcado @code{fret-diagram}. @lilypond[quote, verbatim] << @@ -898,16 +973,15 @@ de marcado @code{fret-diagram}. @cindex fret-diagram-terse, marcado con -@funindex fret-diagram-terse @funindex \fret-diagram-terse La cadena de marcado de diagrama de trastes escueta, -@code{fret-diagram-terse}, omite los números de la cuerda; el número -de cuerda viene implícito por la presencia del punto y coma. Hay un -punto y coma por cada cuerda del diagrama. El primer punto y coma -corresponde al número de cuerda más alto, y el último punto y coma -corresponde a la primera cuerda. Se pueden indicad cuerdas mudas, al -aire y números de traste. +@code{fret-diagram-terse}, omite los números de la cuerda; el +número de cuerda viene implícito por la presencia del punto y +coma. Hay un punto y coma por cada cuerda del diagrama. El +primer punto y coma corresponde al número de cuerda más alto, y el +último punto y coma corresponde a la primera cuerda. Se pueden +indicad cuerdas mudas, al aire y números de traste. @lilypond[quote, verbatim] << @@ -928,8 +1002,8 @@ aire y números de traste. >> @end lilypond -Se pueden incluir números de cejilla en la cadena de marcado escueta -@code{fret-diagram-terse}. +Se pueden incluir números de cejilla en la cadena de marcado +escueta @code{fret-diagram-terse}. @lilypond[quote, verbatim] << @@ -950,8 +1024,8 @@ Se pueden incluir números de cejilla en la cadena de marcado escueta >> @end lilypond -Se pueden incluir indicaciones de digitación en la cadena de marcado -escueta @code{fret-diagram-terse} +Se pueden incluir indicaciones de digitación en la cadena de +marcado escueta @code{fret-diagram-terse} @c Need to use override to enable fingerings to show this -- can we do so? @lilypond[quote, verbatim] @@ -974,19 +1048,18 @@ escueta @code{fret-diagram-terse} >> @end lilypond -Otras propiedades de los diagramas de trastes se deben -ajustar usando @code{\override} al utilizar el marcado -escueto con fret-diagram-terse. +Otras propiedades de los diagramas de trastes se deben ajustar +usando @code{\override} al utilizar el marcado escueto con +fret-diagram-terse. @cindex fret-diagram-verbose, marcado con @cindex capo -@funindex fret-diagram-verbose @funindex \fret-diagram-verbose -La cadena de marcado prolija @code{fret-diagram-verbose} está en el -formato de una lista de Scheme. Cada elemento de la lista indica la -colocación un elemento sobre el diagrama de trastes. +La cadena de marcado prolija @code{fret-diagram-verbose} está en +el formato de una lista de Scheme. Cada elemento de la lista +indica la colocación un elemento sobre el diagrama de trastes. @lilypond[quote, verbatim] << @@ -1023,17 +1096,24 @@ colocación un elemento sobre el diagrama de trastes. Se pueden incluir digitaciones y cejillas en una cadena de marcado prolija @code{fret-diagram-verbose}. Es exclusiva del interfaz de -fret-diagram-verbose la indicación @q{capo} que se puede colocar sobre -el diagrama de posición. La indicación de capo es una barra gruesa -que cubre todas las cuerdas. El traste que tiene el capo es el más -bajo del diagrama de posición. +fret-diagram-verbose la indicación @q{capo} que se puede colocar +sobre el diagrama de posición. La indicación de capo es una barra +gruesa que cubre todas las cuerdas. El traste que tiene el capo +es el más bajo del diagrama de posición. + +Los puntos que indican las digitaciones se pueden tanto colorear +como imprimir entre paréntesis; asimismo, es posible alterar +independientemente el color de los paréntesis. + +También se pueden insertar elementos de marcado dentro de los +puntos. @c \override is necessary to make fingering visible @lilypond[quote, verbatim] << \new ChordNames { \chordmode { - f1 g c + f1 g c c b } } \new Staff { @@ -1069,13 +1149,42 @@ bajo del diagrama de posición. (place-fret 2 5 3) ) } + \override Voice.TextScript.size = 1.4 + 1^\markup { + \fret-diagram-verbose #'( + (place-fret 6 3 1 red parenthesized default-paren-color) + (place-fret 5 3 1 inverted) + (place-fret 4 5 2 blue parenthesized) + (place-fret 3 5 3 blue) + (place-fret 2 5 4 blue) + (place-fret 1 3 1 inverted) + ) + } + \override Voice.TextScript.size = 1.5 + 1^\markup { + \override #'(fret-diagram-details . ((finger-code . in-dot))) + \fret-diagram-verbose #`( + (place-fret 5 2 1) + (place-fret 4 4 "fis" red) + (place-fret 3 4 "b" red) + (place-fret + 2 4 + ,#{ \markup + \concat { + \vcenter "d" + \fontsize #-5 + \musicglyph #"accidentals.sharp"} #} + red) + (place-fret 1 2 1) + ) + } } >> @end lilypond -Todas las otras propiedades de diagrama de trastes se deben ajustar -utilizando @code{\override} cuando se usa el marcado prolijo con -fret-diagram-verbose. +Todas las otras propiedades de diagrama de trastes se deben +ajustar utilizando @code{\override} cuando se usa el marcado +prolijo con fret-diagram-verbose. @ignore The following example shows the three fret-diagram markup @@ -1128,8 +1237,8 @@ and color of dots. El aspecto gráfico de un diagrama de trastes se puede personalizar según las preferencias del usuario a través de las propiedades del interface @code{fret-diagram-interface}. Los detalles están en -@rinternals{fret-diagram-interface}. Para un marcado de diagrama de -trastes, las propiedades del interface pertenecen a +@rinternals{fret-diagram-interface}. Para un marcado de diagrama +de trastes, las propiedades del interface pertenecen a @code{Voice.TextScript}. @snippets @@ -1165,8 +1274,8 @@ Referencia de funcionamiento interno: Se pueden imprimir los diagramas de trastes usando el contexto @code{FretBoards}. De forma predeterminada, el contexto -@code{FretBoards} imprime diagramas de trastes que están almacenados -en una tabla de búsqueda: +@code{FretBoards} imprime diagramas de trastes que están +almacenados en una tabla de búsqueda: @lilypond[verbatim, ragged-right, quote] \include "predefined-guitar-fretboards.ly" @@ -1178,13 +1287,13 @@ en una tabla de búsqueda: @end lilypond Los diagramas de traste predefinidos están en el archivo -@file{predefined-guitar-fretboards.ly}. Los diagramas de trastes se -almacenan tomando como base las notas de un acorde y el valor de -@code{stringTunings} que se está utilizando en cada momento. -@file{predefined-guitar-fretboards.ly} contiene diagramas de traste -predefinidos sólo para @code{guitar-tuning}. Los diagramas de traste -predefinidos se pueden añadir para otros instrumentos u otras -afinaciones siguiendo los ejemplos que aparecen en +@file{predefined-guitar-fretboards.ly}. Los diagramas de trastes +se almacenan tomando como base las notas de un acorde y el valor +de @code{stringTunings} que se está utilizando en cada momento. +@file{predefined-guitar-fretboards.ly} contiene diagramas de +traste predefinidos sólo para @code{guitar-tuning}. Los diagramas +de traste predefinidos se pueden añadir para otros instrumentos u +otras afinaciones siguiendo los ejemplos que aparecen en @file{predefined-guitar-fretboards.ly}. Los diagramas de posiciones para el ukelele están en el archivo @* @@ -1224,8 +1333,8 @@ myChords = \chordmode { c1 c:m7.5- c:aug } } @end lilypond -Las notas de los acordes se pueden introducir como música simultánea o -bien usando el modo de acordes (véase +Las notas de los acordes se pueden introducir como música +simultánea o bien usando el modo de acordes (véase @ref{Panorámica del modo de acordes}). @lilypond[verbatim, ragged-right,quote] @@ -1240,7 +1349,6 @@ bien usando el modo de acordes (véase @cindex trastes, diagramas de, con nombres de acorde @funindex ChordNames -@funindex chordmode @funindex \chordmode Es corriente que se impriman juntos los nombres de acorde y los @@ -1270,8 +1378,8 @@ mychords = \chordmode{ @cindex diagramas de traste, transporte de los Los diagramas de traste predefinidos se pueden transportar, en la -medida en que esté almacenado un diagrama para el acorde transportado, -en la tabla de diagramas de traste. +medida en que esté almacenado un diagrama para el acorde +transportado, en la tabla de diagramas de traste. @lilypond[verbatim, ragged-right, quote] \include "predefined-guitar-fretboards.ly" @@ -1294,18 +1402,18 @@ mychordlist = { @end lilypond -La tabla de diagramas de traste predefinidos para la guitarra contiene -ocho acordes (mayor, menor, aumentado, disminuido, séptima dominante, -séptima mayor, menor séptima y novena domniante) para 17 tonalidades -distintas. La tabla de diagramas predefinidos para el ukelele -contiene estos acordes y además otros tres (sexta mayor, segunda -suspendida y cuarta suspendida). Se puede ver una lista completa de -los diagramas de traste predefinidos en -@ref{Diagramas predefinidos de trastes}. -Si no hay una entrada en la tabla para un acorde, el -grabador FretBoards calcula un cadena de diagrama fret-diagram usando -la funcionalidad de diagramas automáticos que se describe en -@ref{Diagramas de traste automáticos}. +La tabla de diagramas de traste predefinidos para la guitarra +contiene ocho acordes (mayor, menor, aumentado, disminuido, +séptima dominante, séptima mayor, menor séptima y novena +domniante) para 17 tonalidades distintas. La tabla de diagramas +predefinidos para el ukelele contiene estos acordes y además otros +tres (sexta mayor, segunda suspendida y cuarta suspendida). Se +puede ver una lista completa de los diagramas de traste +predefinidos en @ref{Diagramas predefinidos de trastes}. Si no +hay una entrada en la tabla para un acorde, el grabador FretBoards +calcula un cadena de diagrama fret-diagram usando la funcionalidad +de diagramas automáticos que se describe en @ref{Diagramas de +traste automáticos}. @lilypond[verbatim, ragged-right, quote] \include "predefined-guitar-fretboards.ly" @@ -1327,14 +1435,14 @@ mychords = \chordmode{ @cindex personalizados, añadir diagramas de traste @cindex diagramas de trastes personalizados, añadir -Se pueden añadir diagramas de posiciones a la tabla de diagramas de -posiciones. Para añadir un diagrama debemos especificar la +Se pueden añadir diagramas de posiciones a la tabla de diagramas +de posiciones. Para añadir un diagrama debemos especificar la tabla de correspondencias para el diagrama, el acorde del diagrama, la afinación utilizada y una definición del diagrama. Normalmente la tabla de correspondencias será @var{default-fret-table}. La definición del diagrama puede ser -una cadena de definición escueta fret-diagram-terse o una lista -de marcados prolija fret-diagram-verbose. +una cadena de definición escueta fret-diagram-terse o una lista de +marcados prolija fret-diagram-verbose. @lilypond[verbatim, ragged-right, quote] \include "predefined-guitar-fretboards.ly" @@ -1358,11 +1466,12 @@ mychords = \chordmode { >> @end lilypond -Se pueden almacenar distintos diagramas de traste para el mismo acorde -usando distintas octavas para las notas. Las octavas de diferencia -deben ser al menos dos por encima o por debajo de la octava -predeterminada, porque las octavas inmediatas superior e inferior de -la predeterminada se utilizan para los trasteros transpositores. +Se pueden almacenar distintos diagramas de traste para el mismo +acorde usando distintas octavas para las notas. Las octavas de +diferencia deben ser al menos dos por encima o por debajo de la +octava predeterminada, porque las octavas inmediatas superior e +inferior de la predeterminada se utilizan para los trasteros +transpositores. @lilypond[verbatim, ragged-right, quote] \include "predefined-guitar-fretboards.ly" @@ -1390,20 +1499,18 @@ mychords = \chordmode { @cindex acordes, formas de, en instrumentos de trastes @funindex \addChordShape -@funindex addChordShape -@funindex storePredefinedDiagram @funindex \storePredefinedDiagram -Además de los diagramas de traste, LilyPond almacena una lista interna -de formas de acorde. Las formas de acorde son diagramas de traste que -se pueden desplazar por el mástil para dar acordes distintos. Se -pueden añadir formas de acorde a la lista interna y luego usarlas para -definir diagramas de posición predefinidos. Dado que se pueden mover -a distintas posiciones dentro del mástil, las formas de acorde -normalmente no contienen cuerdas al aire. Como los diagramas de -posiciones, las formas de acorde se pueden introducir como cadenas -escuetas fret-diagram-terse o como listas de marcado prolijas -fret-diagram-verbose. +Además de los diagramas de traste, LilyPond almacena una lista +interna de formas de acorde. Las formas de acorde son diagramas +de traste que se pueden desplazar por el mástil para dar acordes +distintos. Se pueden añadir formas de acorde a la lista interna y +luego usarlas para definir diagramas de posición predefinidos. +Dado que se pueden mover a distintas posiciones dentro del mástil, +las formas de acorde normalmente no contienen cuerdas al aire. +Como los diagramas de posiciones, las formas de acorde se pueden +introducir como cadenas escuetas fret-diagram-terse o como listas +de marcado prolijas fret-diagram-verbose. @lilypond[verbatim, ragged-right, quote] \include "predefined-guitar-fretboards.ly" @@ -1487,11 +1594,12 @@ Referencia de funcionamiento interno: @cindex automáticos, diagramas de traste @cindex automáticos, diagramas de acordes -Se pueden crear diagramas de traste automáticamente a partir de las -notas introducidas usando el contexto @code{FretBoards}. Si no está -disponible ningún diagrama predefinido para las notas introducidas en -la afinación @code{stringTunings} activa, este contexto calcula las -cuerdas y los trastes que se pueden usar para tocar las notas. +Se pueden crear diagramas de traste automáticamente a partir de +las notas introducidas usando el contexto @code{FretBoards}. Si +no está disponible ningún diagrama predefinido para las notas +introducidas en la afinación @code{stringTunings} activa, este +contexto calcula las cuerdas y los trastes que se pueden usar para +tocar las notas. @lilypond[quote,ragged-right,verbatim] << @@ -1512,16 +1620,14 @@ cuerdas y los trastes que se pueden usar para tocar las notas. >> @end lilypond -@funindex predefinedFretboardsOff @funindex \predefinedFretboardsOff -@funindex predefinedFretboardsOn @funindex \predefinedFretboardsOn Puesto que de forma predeterminada no se carga ningún diagrama -predefinido, el comportamiento predeterminado es el cálculo automático -de los diagramas de traste. Una vez que los diagramas predeterminados -se han cargado, se puede habilitar e inhabilitar el cálculo automático -con instrucciones predefinidas: +predefinido, el comportamiento predeterminado es el cálculo +automático de los diagramas de traste. Una vez que los diagramas +predeterminados se han cargado, se puede habilitar e inhabilitar +el cálculo automático con instrucciones predefinidas: @lilypond[quote,ragged-right,verbatim] @@ -1553,18 +1659,18 @@ con instrucciones predefinidas: -A veces el calculador de trastes es incapaz de encontrar un diagrama -aceptable. Esto se puede remediar generalmente mediante la asignación -manual de una nota a una cuerda. En muchos casos sólo hay que colocar -manualmente una nota sobre una cuerda; el resto de las notas se -situará en el lugar adecuado por parte del contexto -@code{FretBoards}. +A veces el calculador de trastes es incapaz de encontrar un +diagrama aceptable. Esto se puede remediar generalmente mediante +la asignación manual de una nota a una cuerda. En muchos casos +sólo hay que colocar manualmente una nota sobre una cuerda; el +resto de las notas se situará en el lugar adecuado por parte del +contexto @code{FretBoards}. @cindex trastes, añadir digitaciones a diagramas de @cindex digitaciones, añadir, a diagramas de trastes -Se pueden añadir digitaciones a los diagramas de traste del contexto -FretBoard. +Se pueden añadir digitaciones a los diagramas de traste del +contexto FretBoard. @lilypond[quote, verbatim] << @@ -1587,8 +1693,9 @@ FretBoard. @funindex minimumFret -El traste mínimo que usar en el cálculo de cuerdas y trastes para el -contexto FretBoard se puede fijar con la propiedad @code{minimumFret}. +El traste mínimo que usar en el cálculo de cuerdas y trastes para +el contexto FretBoard se puede fijar con la propiedad +@code{minimumFret}. @lilypond[quote, verbatim] << @@ -1610,18 +1717,18 @@ contexto FretBoard se puede fijar con la propiedad @code{minimumFret}. >> @end lilypond -Las cuerdas y los trastes para el contexto @code{FretBoards} dependen -de la propiedad @code{stringTunings}, que tiene el mismo significado -que en el contexto de tablatura TabStaff. -Consulte @ref{Tablaturas personalizadas} para ver más información -sobre la propiedad @code{stringTunings}. +Las cuerdas y los trastes para el contexto @code{FretBoards} +dependen de la propiedad @code{stringTunings}, que tiene el mismo +significado que en el contexto de tablatura TabStaff. Consulte +@ref{Tablaturas personalizadas} para ver más información sobre la +propiedad @code{stringTunings}. -El aspecto gráfico de un diagrama de trastes se puede personalizar de -acuerdo a las preferencias del usuario a través de las propiedades del -interface @code{fret-diagram-interface}. Los detalles están en -@rinternals{fret-diagram-interface}. Para un diagrama de -@code{FretBoards}, las propiedades del interface pertenecen a -@code{FretBoards.FretBoard}. +El aspecto gráfico de un diagrama de trastes se puede personalizar +de acuerdo a las preferencias del usuario a través de las +propiedades del interface @code{fret-diagram-interface}. Los +detalles están en @rinternals{fret-diagram-interface}. Para un +diagrama de @code{FretBoards}, las propiedades del interface +pertenecen a @code{FretBoards.FretBoard}. @predefined @@ -1652,28 +1759,27 @@ instrumentos con afinaciones no monótonas. @cindex digitaciones de la mano derecha para instrumentos de trastes @cindex derecha, mano, digitaciones para instrumentos de traste -@funindex rightHandFinger @funindex \rightHandFinger Las digitaciones de la mano derecha @var{p-i-m-a} se deben introducir usando @code{\rightHandFinger} seguido de un número. @warning{Si el número se introduce en notación de Scheme, recuerde -escribir al final un espacio seguido de un ángulo de cierre @code{>} o -similar.} +escribir al final un espacio seguido de un ángulo de cierre +@code{>} o similar.} -@lilypond[quote,verbatim,relative=0] +@lilypond[quote,verbatim,fragment] \clef "treble_8" c4\rightHandFinger #1 e\rightHandFinger #2 g\rightHandFinger #3 -c\rightHandFinger #4 -1 +c'\rightHandFinger #4 +1 @end lilypond -Por brevedad, se puede escribir @code{\rightHandFinger} como algo más -corto, como por ejemplo @code{RH}: +Por brevedad, se puede escribir @code{\rightHandFinger} como algo +más corto, como por ejemplo @code{RH}: @example RH=#rightHandFinger @@ -1701,15 +1807,15 @@ Referencia de funcionamiento interno: @translationof Guitar Casi todos los asuntos de notación relacionados con la música para -guitarra están suficientemente cubiertos en la sección general sobre -ajustes de instrumentos de trastes, pero hay algunos más de los que -merece la pena hablar aquí. De forma ocasional, los usuarios quieren -crear documentos del tipo de cancioneros que tengan sólo la letra de -las canciones con indicaciones de acordes sobre ella. Dado que -LilyPond es un tipografiador de música, no se recomienda para -documentos que no tienen notación musical. Una alternativa mejor es -un procesador de texto, editor de texto o, para usuarios con -experiencia, un tipografiador como GuitarTeX. +guitarra están suficientemente cubiertos en la sección general +sobre ajustes de instrumentos de trastes, pero hay algunos más de +los que merece la pena hablar aquí. De forma ocasional, los +usuarios quieren crear documentos del tipo de cancioneros que +tengan sólo la letra de las canciones con indicaciones de acordes +sobre ella. Dado que LilyPond es un tipografiador de música, no +se recomienda para documentos que no tienen notación musical. Una +alternativa mejor es un procesador de texto, editor de texto o, +para usuarios con experiencia, un tipografiador como GuitarTeX. @menu * Indicar la posición y la cejilla:: @@ -1725,17 +1831,19 @@ experiencia, un tipografiador como GuitarTeX. @cindex posición y cejilla, indicación para instrumentos de trastes @cindex trastes, instrumentos de, indicación de la posición y cejilla -Este ejemplo muestra cómo incluir indicaciones de posición y cejilla -de guitarra: +Este ejemplo muestra cómo incluir indicaciones de posición y +cejilla de guitarra: -@lilypond[quote,ragged-right,verbatim,relative=0] -\clef "treble_8" -b16 d g b e -\textSpannerDown -\override TextSpanner.bound-details.left.text = #"XII " -g16\startTextSpan -b16 e g e b g\stopTextSpan -e16 b g d +@lilypond[quote,ragged-right,verbatim,fragment] +\relative { + \clef "treble_8" + b,16 d g b e + \textSpannerDown + \override TextSpanner.bound-details.left.text = #"XII " + g16\startTextSpan + b16 e g e b g\stopTextSpan + e16 b g d +} @end lilypond @seealso @@ -1756,23 +1864,24 @@ Fragmentos de código: @cindex tapadas, notas, en instrumentos de trastes @cindex armónicos en instrumentos de trastes -Se pueden usar cabezas de nota especiales para indicar notas apagadas -o armónicos. Los armónicos se suelen explicar de forma más completa -con un marcado de texto. +Se pueden usar cabezas de nota especiales para indicar notas +apagadas o armónicos. Los armónicos se suelen explicar de forma +más completa con un marcado de texto. @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \clef "treble_8" \override Staff.NoteHead.style = #'harmonic-mixed - d^\markup { \italic { \fontsize #-2 { "harm. 12" }}} 1 + d'^\markup { \italic { \fontsize #-2 { "harm. 12" }}} 1 } @end lilypond -Las notas tapadas (llamadas también @notation{notas muertas}) están -contempladas dentro de los pentagramas normales y de tablatura: +Las notas tapadas (llamadas también @notation{notas muertas}) +están contempladas dentro de los pentagramas normales y de +tablatura: @lilypond[quote,ragged-right,verbatim] -music = \relative c' { +music = \relative { < a\3 \deadNote c\2 a'\1 >4 < b\3 \deadNote d\2 b'\1 > < c\3 \deadNote e\2 c'\1 > @@ -1796,8 +1905,8 @@ Otra téctnica de ejecución (utilizada especialmente en la guitarra eléctrica) se llama @notation{tapado de palma}. La cuerda es parcialmente tapada por la palma de la mano que pulsa (de ahí el nombre). Lilypond contempla la notación de las notas de estilo de -tapado de palma mediante el cambio de la forma de la cabeza de nota a -un triángulo. +tapado de palma mediante el cambio de la forma de la cabeza de +nota a un triángulo. @lilypond[quote,ragged-right,verbatim] \new Voice { % Warning: explicit Voice instantiation is @@ -1830,7 +1939,6 @@ Referencia de la notación: @unnumberedsubsubsec Indicación de acordes de potencia o de quinta vacía @translationof Indicating power chords -@funindex powerChords @funindex \powerChords @cindex potencia, acordes de @@ -1839,19 +1947,19 @@ Referencia de la notación: @cindex quinta vacía, acordes de @cindex vacía, acordes de quinta -Los acordes de quinta vacía o acordes de potencia -(@emph{power chords}) y sus símbolos se pueden tipografiar -en el modo de acordes o como construcciones de acorde normales: +Los acordes de quinta vacía o acordes de potencia (@emph{power +chords}) y sus símbolos se pueden tipografiar en el modo de +acordes o como construcciones de acorde normales: @lilypond[quote,ragged-right,verbatim] ChordsAndSymbols = { \chordmode { \powerChords - e,,1:1.5 - a,,1:1.5.8 + e,,1:5 + a,,1:5.8 \set minimumFret = #8 - c,1:1.5 - f,1:1.5.8 + c,1:5 + f,1:5.8 } \set minimumFret = #5 1 @@ -1873,16 +1981,16 @@ ChordsAndSymbols = { } @end lilypond -Los símbolos de acordes de quinta vacía se desactivan automáticamente -tan pronto como se utiliza cualquiera de los otros modificadores de -acorde: +Los símbolos de acordes de quinta vacía se desactivan +automáticamente tan pronto como se utiliza cualquiera de los otros +modificadores de acorde: @lilypond[quote,ragged-right,verbatim] mixedChords = \chordmode { c,1 \powerChords - b,,1:1.5 - fis,,1:1.5.8 + b,,1:5 + fis,,1:5.8 g,,1:m } \score { @@ -1930,9 +2038,9 @@ Fragmentos de código: @cindex tablatura de banjo LilyPond contempla el banjo de cinco cuerdas de una manera básica. -Cuando haga tablaturas para banjo de cinco cuerdas, utilice la función -de formato de tablatura de banjo para obtener los números correctos de -los trastes para la quinta cuerda: +Cuando haga tablaturas para banjo de cinco cuerdas, utilice la +función de formato de tablatura de banjo para obtener los números +correctos de los trastes para la quinta cuerda: @c due to crazy intervals of banjo music, absolute pitch is recommended @@ -1983,3 +2091,62 @@ Archivos de inicio: Fragmentos de código: @rlsr{Fretted strings}. + + +@node Laúd +@subsection Laúd +@translationof Lute + +@menu +* Tablaturas de laúd:: +@end menu + +@node Tablaturas de laúd +@unnumberedsubsubsec Tablaturas de laúd +@translationof Lute tablatures + +@cindex laúd, tablaturas de +@cindex tablatura, laúd + +LilyPond contempla las tablaturas para laúd. + +Para obtener las cuerdas graves adicionales, utilice +@code{additionalBassStrings}, donde se determinan las notas +correspondientes a dichas cuerdas. Se imprimen por debajo de la +línea inferior como: a, /a, //a, ///a, 4, 5 etc. + +Se debe usar el valor @code{fret-letter-tablature-format} para la +propiedad de contexto @code{tablatureFormat} y probablemente +también ajustar la propiedad @code{fretLabels} para una mayor +personalización. + +@lilypond[quote,ragged-right,verbatim] +m = { f'4 d' a f d a, g, fis, e, d, c, \bar "|." } + +\score { + << + \new Staff { \clef bass \cadenzaOn \m } + \new TabStaff \m + >> + \layout { + \context { + \Score + tablatureFormat = #fret-letter-tablature-format + } + \context { + \TabStaff + stringTunings = \stringTuning + additionalBassStrings = \stringTuning + fretLabels = #'("a" "b" "r" "d" "e" "f" "g" "h" "i" "k") + } + } +} +@end lilypond + +@cindex laúd, afinación del +@cindex afinación del laúd + +@knownissues +No se contempla el uso de @code{FretBoards} con +@code{additionalBassStrings}; de utilizarse, puede dar lugar a un +resultado poco satisfactorio. diff --git a/Documentation/es/notation/input.itely b/Documentation/es/notation/input.itely index 8d44e209eb..8aa61e3041 100644 --- a/Documentation/es/notation/input.itely +++ b/Documentation/es/notation/input.itely @@ -1,28 +1,28 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 18f6f13f39b25f28679fe2073763151008ca3366 + Translation of GIT committish: 4c31c117565b1c7dd78e606fceb7cba354f2859a When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.22" @node Entrada y salida generales @chapter Entrada y salida generales @translationof General input and output -Esta sección trata de asuntos relacionados con la entrada y salida -generales de LilyPond, más que con la notación específica. +Esta sección trata de asuntos relacionados con la entrada y +salida generales de LilyPond, más que con la notación específica. @menu * Estructura del código de entrada:: * Títulos y encabezamientos:: * Trabajar sobre los archivos de entrada:: * Controlar la salida:: -* Salida MIDI:: +* Creación de salida MIDI:: * Extraer información musical:: @end menu @@ -31,8 +31,9 @@ generales de LilyPond, más que con la notación específica. @section Estructura del código de entrada @translationof Input structure -El formato principal de entrada para LilyPond son archivos de texto. -Por convenio, el nombre de estos archivos termina en @file{.ly}. +El formato principal de entrada para LilyPond son archivos de +texto. Por convenio, el nombre de estos archivos termina en +@file{.ly}. @menu * Estructura de una partitura:: @@ -62,9 +63,10 @@ delimitada por un par de llaves: @warning{Sólo puede haber @strong{una} expresión musical dentro del bloque @code{\score}, y @strong{debe} estar encerrada entre llaves.} -Esta expresión musical única puede tener cualquier tamaño, y puede -contener otras expresiones musicales hasta cualquier grado de -complejidad. Todos los siguientes ejemplos son expresiones musicales: +Esta expresión musical única puede tener cualquier tamaño, y +puede contener otras expresiones musicales hasta cualquier grado +de complejidad. Todos los siguientes ejemplos son expresiones +musicales: @example @{ c'4 c' c' c' @} @@ -99,25 +101,27 @@ complejidad. Todos los siguientes ejemplos son expresiones musicales: @} @end example -Los comentarios son una excepción a esta regla general (para ver otras -excepciones, consulte @ref{Estructura del archivo}). Tanto los comentarios de -una línea como los que están delimitados por @code{%@{ @dots{} %@}} se -pueden escribir en cualquier lugar dentro del archivo de entrada. Se -pueden escribir dentro o fuera del bloque @code{\score}, y dentro o -fuera de la expresión musical única dentro del bloque @code{\score}. - -Recuerde que incluso dentro de un archivo que contenga solamente un -bloque @code{\score}, éste se encuentra incluido implícitamente dentro -de un bloque @code{\book}. Un bloque @code{\book} dentro de un -archivo fuente produce al menos un archivo de salida, y de forma -predeterminada el nombre del archivo de salida que se produce está -derivado del nombre del archivo de entrada, de forma que -@file{fandangoforelephants.ly} da como resultado -@file{fandangoforelephants.pdf}. - -(Para ver más detalles acerca de los bloques @code{\book}, consulte -@ref{Varias partituras en un libro}, @ref{Varios archivos de salida a -partir de uno de entrada} y @ref{Estructura del archivo}.) +Los comentarios son una excepción a esta regla general (para ver +otras excepciones, consulte @ref{Estructura del archivo}). Tanto +los comentarios de una línea como los que están delimitados por +@code{%@{ @dots{} %@}} se pueden escribir en cualquier lugar +dentro del archivo de entrada. Se pueden escribir dentro o fuera +del bloque @code{\score}, y dentro o fuera de la expresión +musical única dentro del bloque @code{\score}. + +Recuerde que incluso dentro de un archivo que contenga solamente +un bloque @code{\score}, éste se encuentra incluido +implícitamente dentro de un bloque @code{\book}. Un bloque +@code{\book} dentro de un archivo fuente produce al menos un +archivo de salida, y de forma predeterminada el nombre del +archivo de salida que se produce está derivado del nombre del +archivo de entrada, de forma que @file{fandangoforelephants.ly} +da como resultado @file{fandangoforelephants.pdf}. + +(Para ver más detalles acerca de los bloques @code{\book}, +consulte @ref{Varias partituras en un libro}, +@ref{Varios archivos de salida a partir de uno de entrada} y +@ref{Estructura del archivo}.) @seealso Manual de aprendizaje: @@ -155,8 +159,8 @@ y los textos se introducen con un bloque @code{\markup}: @funindex \book Todos los movimientos y textos que aparecen en el mismo archivo -@file{.ly} se tipografían normalmente en la forma de un solo archivo -de salida. +@file{.ly} se tipografían normalmente en la forma de un solo +archivo de salida. @example \score @{ @@ -176,11 +180,11 @@ bloque @code{\book}, pues en caso contrario sólo aparecerá en la salida el primer @code{\score} o @code{\markup}. El encabezamiento de cada pieza se puede poner dentro del bloque -@code{\score}. Antes de cada movimiento, se imprime el nombre de la -pieza (@code{piece}) extraído del encabezamiento. El título del libro -entero se puede poner dentro del bloque @code{\book}, pero si no está -presente se inserta el encabezamiento @code{\header} que está al -principio del archivo. +@code{\score}. Antes de cada movimiento, se imprime el nombre de +la pieza (@code{piece}) extraído del encabezamiento. El título +del libro entero se puede poner dentro del bloque @code{\book}, +pero si no está presente se inserta el encabezamiento +@code{\header} que está al principio del archivo. @example \header @{ @@ -205,11 +209,11 @@ principio del archivo. @funindex \bookpart -Se pueden agrupar distintas piezas de música en partes de un libro -utilizando bloques @code{\bookpart}. Las partes de libro se separan -por medio de saltos de página, y pueden dar comienzo con un título, -como el libro propiamente dicho, mediante la especificación del bloque -@code{\header}. +Se pueden agrupar distintas piezas de música en partes de un +libro utilizando bloques @code{\bookpart}. Las partes de libro +se separan por medio de saltos de página, y pueden dar comienzo +con un título, como el libro propiamente dicho, mediante la +especificación del bloque @code{\header}. @example \bookpart @{ @@ -235,23 +239,25 @@ como el libro propiamente dicho, mediante la especificación del bloque @translationof Multiple output files from one input file Si queremos varios archivos de salida a partir del mismo archivo -@file{.ly}, podemos escribir varios bloques @code{\book}, donde cada -uno de estos bloques @code{\book} dará como resultado un archivo de -salida distinto. Si no especificamos ningún bloque @code{\book} en el -archivo, LilyPond trata implícitamente todo el archivo como un solo -bloque @code{\book}, véase @ref{Estructura del archivo}. +@file{.ly}, podemos escribir varios bloques @code{\book}, donde +cada uno de estos bloques @code{\book} dará como resultado un +archivo de salida distinto. Si no especificamos ningún bloque +@code{\book} en el archivo, LilyPond trata implícitamente todo el +archivo como un solo bloque @code{\book}, véase @ref{Estructura +del archivo}. Al producir varios archivos a partir de un solo archivo fuente, -Lilypond se asegura de que ninguno de los archivos de salida de ningún -bloque @code{\book} sobreescribe el archivo de salida producido por un -@code{\book} anterior del mismo archivo de entrada. +Lilypond se asegura de que ninguno de los archivos de salida de +ningún bloque @code{\book} sobreescribe el archivo de salida +producido por un @code{\book} anterior del mismo archivo de +entrada. -Lo hace añadiendo un sufijo al nombre de la salida para cada libro -@code{\book} que utiliza el nombre del archivo de salida +Lo hace añadiendo un sufijo al nombre de la salida para cada +libro @code{\book} que utiliza el nombre del archivo de salida predeterminado, derivado del archivo fuente de entrada. -El comportamiento predeterminado es añadir un sufijo con el número de -versión para cada nombre que pueda coincidir; así: +El comportamiento predeterminado es añadir un sufijo con el +número de versión para cada nombre que pueda coincidir; así: @example \book @{ @@ -288,14 +294,15 @@ en el archivo fuente @file{eightminiatures.ly}, produce @funindex \bookOutputName Lilypond le ofrece unos mecanismos que le permiten controlar los -nombres de archivo que se utilizan por parte de los diversos motores -finales al producir los archivos de salida. - -En la sección anterior vimos cómo Lilypond evita las coincidencias de -nombres al producir varias salidas a partir de un único archivo fuente -de entrada. También podemos especificar nuestros propios sufijos para -cada bloque @code{\book}, de manera que podemos producir, por ejemplo, -archivos con los nombres @file{eightminiatures-Romanze.pdf}, +nombres de archivo que se utilizan por parte de los diversos +motores finales al producir los archivos de salida. + +En la sección anterior vimos cómo Lilypond evita las +coincidencias de nombres al producir varias salidas a partir de +un único archivo fuente de entrada. También podemos especificar +nuestros propios sufijos para cada bloque @code{\book}, de manera +que podemos producir, por ejemplo, archivos con los nombres +@file{eightminiatures-Romanze.pdf}, @file{eightminiatures-Menuetto.pdf} y @file{eightminiatures-Nocturne.pdf} añadiendo una declaración @code{\bookOutputSuffix} dentro de cada bloque @code{\book}. @@ -318,9 +325,9 @@ archivos con los nombres @file{eightminiatures-Romanze.pdf}, @} @end example -También podemos especificar un nombre de archivo de salida diferente -para cada bloque @code{book}, mediante la utilización de declaraciones -@code{\bookOutputName}: +También podemos especificar un nombre de archivo de salida +diferente para cada bloque @code{book}, mediante la utilización +de declaraciones @code{\bookOutputName}: @example \book @{ @@ -364,19 +371,19 @@ El código anterior produce los siguientes archivos de salida: @funindex \book @funindex \bookpart -Un archivo @file{.ly} puede contener cualquier número de expresiones -del nivel superior, donde una expresión del nivel superior es una de -las siguientes posibilidades: +Un archivo @file{.ly} puede contener cualquier número de +expresiones del nivel superior, donde una expresión del nivel +superior es una de las siguientes posibilidades: @itemize @item Una definición de salida, como @code{\paper}, @code{\midi} y @code{\layout}. Tal definición en el nivel más alto cambia los -ajustes predeterminados para todo el libro. Si se introduce más de -una de estas definiciones del mismo tipo en el nivel más alto, las -definiciones se combinan, pero en situaciones de conflicto las -definiciones más tardías tienen preferencia. Para ver los detalles -sobre cómo afecta al bloque @code{\layout}, consulte +ajustes predeterminados para todo el libro. Si se introduce más +de una de estas definiciones del mismo tipo en el nivel más alto, +las definiciones se combinan, pero en situaciones de conflicto +las definiciones más tardías tienen preferencia. Para ver los +detalles sobre cómo afecta al bloque @code{\layout}, consulte @ref{El bloque layout,,El bloque @code{@bs{}layout}}. @item @@ -385,42 +392,45 @@ Una expresión directa de Scheme, como @code{#(ly:set-option 'point-and-click #f)}. @item -Un bloque @code{\header}. Esto establece el bloque de encabezamiento -global (es decir, al principio del archivo). Es el bloque que -contiene los ajustes predeterminados de los campos de encabezamientos -como el compositor, título, etc. para todos los libros que están -dentro del archivo (véase @ref{Explicación de los títulos}). +Un bloque @code{\header}. Esto establece el bloque de +encabezamiento global (es decir, al principio del archivo). Es +el bloque que contiene los ajustes predeterminados de los campos +de encabezamientos como el compositor, título, etc. para todos +los libros que están dentro del archivo (véase +@ref{Explicación de los títulos}). @item -Un bloque @code{\score}. Esta partitura se reúne con otras partituras -del nivel superior, y se combina con ellas formando un @code{\book} -(libro) único. Este comportamiento se puede cambiar estableciendo el -valor de la variable @code{toplevel-score-handler} en el nivel -superior. El @emph{handler} predeterminado se define en el archivo de -inicio @file{../scm/lily.scm}. +Un bloque @code{\score}. Esta partitura se reúne con otras +partituras del nivel superior, y se combina con ellas formando un +@code{\book} (libro) único. Este comportamiento se puede cambiar +estableciendo el valor de la variable +@code{toplevel-score-handler} en el nivel superior. El +@emph{handler} predeterminado se define en el archivo de inicio +@file{../scm/lily.scm}. @item Un bloque @code{\book} combina lógicamente varios movimientos (es -decir, varios bloques @code{\score}) en un solo documento. Si hay -varias partituras @code{\score}, se crea un solo archivo de salida -para cada bloque @code{\book}, en el que se concatenan todos los -movimientos correspondientes. La única razón para especificar -explícitamente bloques @code{\book} en un archivo de entrada -@file{.ly} es si queremos crear varios archivos de salida a partir de -un único archivo de entrada. Una excepción se da dentro de los -documentos de lilypond-book, en los que tenemos que escribir -explícitamente un bloque @code{\book} si queremos tener más de una -única partitura @code{\score} o marcado @code{\markup} en el mismo -ejemplo. Se puede cambiar este comportamiento estableciendo el valor -de la variable @code{toplevel-book-handler} en el nivel superior. El +decir, varios bloques @code{\score}) en un solo documento. Si +hay varias partituras @code{\score}, se crea un solo archivo de +salida para cada bloque @code{\book}, en el que se concatenan +todos los movimientos correspondientes. La única razón para +especificar explícitamente bloques @code{\book} en un archivo de +entrada @file{.ly} es si queremos crear varios archivos de salida +a partir de un único archivo de entrada. Una excepción se da +dentro de los documentos de lilypond-book, en los que tenemos que +escribir explícitamente un bloque @code{\book} si queremos tener +más de una única partitura @code{\score} o marcado @code{\markup} +en el mismo ejemplo. Se puede cambiar este comportamiento +estableciendo el valor de la variable +@code{toplevel-book-handler} en el nivel superior. El @emph{handler} predeterminado se define en el archivo de inicio @file{../scm/lily.scm}. @item Un bloque @code{\bookpart}. Un libro puede dividirse en varias -partes, utilizando bloques @code{\bookpart}, con objeto de facilitar -la inserción de saltos de página o usar distintos ajustes de -@code{\paper} en las distintas partes. +partes, utilizando bloques @code{\bookpart}, con objeto de +facilitar la inserción de saltos de página o usar distintos +ajustes de @code{\paper} en las distintas partes. @item Una expresión musical compuesta, como @@ -428,10 +438,11 @@ Una expresión musical compuesta, como @{ c'4 d' e'2 @} @end example -Esto añade la pieza al @code{\score} y la conforma dentro de un libro -único junto a todas las demás partituras @code{\score} y expresiones -musicales del nivel superior. En otras palabras, un archivo que -contiene sólo la expresión musical anterior se traduce a +Esto añade la pieza al @code{\score} y la conforma dentro de un +libro único junto a todas las demás partituras @code{\score} y +expresiones musicales del nivel superior. En otras palabras, un +archivo que contiene sólo la expresión musical anterior se +traduce a @example \book @{ @@ -462,7 +473,8 @@ Un texto de marcado, por ejemplo una estrofa @end example Los textos de marcado se colocan encima, en medio o debajo de las -partituras o expresiones musicales, según donde aparezcan escritos. +partituras o expresiones musicales, según donde aparezcan +escritos. @cindex variables @@ -473,13 +485,13 @@ fulano = @{ c4 d e d @} @end example Esto se puede utilizar más tarde en el archivo escribiendo -@code{\fulano}. El nombre de las variables ha de ser exclusivamente -alfabético; sin números, guiones ni barras bajas. +@code{\fulano}. El nombre de las variables ha de ser +exclusivamente alfabético; sin números, guiones ni barras bajas. @end itemize -El ejemplo siguiente muestra tres cosas que se pueden introducir en el -nivel superior: +El ejemplo siguiente muestra tres cosas que se pueden introducir +en el nivel superior: @example \layout @{ @@ -494,28 +506,30 @@ nivel superior: @{ c'4 d' e2 @} @end example -En cualquier punto del archivo se pueden introducir cualquiera de las -instrucciones léxicas siguientes: +En cualquier punto del archivo se pueden introducir cualquiera de +las instrucciones léxicas siguientes: @itemize @item @code{\version} @item @code{\include} @item @code{\sourcefilename} @item @code{\sourcefileline} -@item -Un comentario de una línea, determinado por un símbolo @code{%} al principio. +@item Un comentario de una línea, determinado por un símbolo @code{%} +al principio. @item -Un comentario de varias líneas, delimitado por @code{%@{ @dots{} %@}}. +Un comentario de varias líneas, delimitado por @code{%@{ @dots{} +%@}}. @end itemize @cindex espacios en blanco -Por lo general se ignoran los espacios entre elementos del flujo de -entrada, y se pueden omitir o aumentar tranquilamente para mejorar la -legibilidad. Sin embargo, los espacios se deben utilizar siempre para -evitar errores, en las siguientes situaciones: +Por lo general se ignoran los espacios entre elementos del flujo +de entrada, y se pueden omitir o aumentar tranquilamente para +mejorar la legibilidad. Sin embargo, los espacios se deben +utilizar siempre para evitar errores, en las siguientes +situaciones: @itemize @@ -527,8 +541,8 @@ todos los elementos que comienzan con un signo @code{\} de barra invertida. @item A continuación de todo elemento que se deba interpretar -como expresión de Scheme, es decir, todo elemento que comience por -un signo@tie{}@code{#}. +como expresión de Scheme, es decir, todo elemento que comience +por un signo@tie{}@code{#}. @item Para separar los elementos de una expresión de Scheme. @@ -550,12 +564,17 @@ Referencia de la notación: @section Títulos y encabezamientos @translationof Titles and headers +@cindex títulos +@cindex encabezamientos +@cindex pies de página + Casi toda la música impresa tiene un título y el nombre del compositor; ciertas piezas tienen mucha más información. @menu * Crear títulos encabezamientos y pies de página:: * Títulos encabezamientos y pies de página personalizados:: +* Creación de metadatos de PDF:: * Crear notas al pie:: * Referencia a números de página:: * Índice general:: @@ -579,21 +598,21 @@ compositor; ciertas piezas tienen mucha más información. Cada bloque @code{\book} de un solo archivo de entrada produce un archivo de salida distinto, véase @ref{Estructura del archivo}. -Dentro de cada archivo de salida están disponibles tres tipos de zonas -para títulos: @emph{Títulos de libro} al principio de cada libro, -@emph{Títulos de parte de libro} al principio de cada -parte de un libro y @emph{Títulos de partitura} al comienzo de una -partitura. - -Los valores de los campos para encabezamientos tales como @code{title} -(para el título) y @code{composer} (para el autor) se establecen en -bloques @code{\header} (para ver la sintaxis de los bloques -@code{\header} y una lista completa de los campos disponibles de forma -predeterminada, consulte @ref{Presentación predeterminada de los -títulos de partes de libro y partitura}). Tanto los títulos de libro como -los títulos de parte de libro y los títulos de partitura pueden -contener los mismos -campos, aunque de forma predeterminada los campos de los títulos de +Dentro de cada archivo de salida están disponibles tres tipos de +zonas para títulos: @emph{Títulos de libro} al principio de cada +libro, @emph{Títulos de parte de libro} al principio de cada +parte de un libro y @emph{Títulos de partitura} al comienzo de +una partitura. + +Los valores de los campos para encabezamientos tales como +@code{title} (para el título) y @code{composer} (para el autor) +se establecen en bloques @code{\header} (para ver la sintaxis de +los bloques @code{\header} y una lista completa de los campos +disponibles de forma predeterminada, consulte @ref{Presentación +predeterminada de los títulos de partes de libro y partitura}). +Tanto los títulos de libro como los títulos de parte de libro y +los títulos de partitura pueden contener los mismos campos, +aunque de forma predeterminada los campos de los títulos de partitura se limitan a @code{piece} (pieza) y @code{opus}. Los bloques @code{\header} se pueden situar en cuatro lugares @@ -619,68 +638,69 @@ Después de la expresión musical de un bloque @code{\score}. @end itemize -Los valores de los campos se fitran a través de esta jerarquía, -persistiendo aquellos que se establecen más arriba a no ser que se -sobreescriban por un valor establecido más abajo en la jerarquía, y -así: +Los valores de los campos se filtran a través de esta jerarquía, +persistiendo aquellos que se establecen más arriba a no ser que +se sobreescriban por un valor establecido más abajo en la +jerarquía, y así: @itemize @item El título de un libro deriva de los campos establecidos al principio del archivo de entrada, modificado por campos -establecidos en el bloque @code{\book}. Los campos resultantes se -usan para imprimir el título de libro para dicho libro, siempre y -cuando haya otro material que genere una página al comienzo del -libro, antes de la primera parte de libro. Es suficiente una sola -instrucción @code{\pageBreak}. +establecidos en el bloque @code{\book}. Los campos resultantes +se usan para imprimir el título de libro para dicho libro, +siempre y cuando haya otro material que genere una página al +comienzo del libro, antes de la primera parte de libro. Es +suficiente una sola instrucción @code{\pageBreak}. @item Un título de parte de libro se deriva de los campos fijados al principio del archivo de entrada, modificado por los campos establecidos dentro del bloque @code{\book}, y posteriormente modificado por los campos que se fijan dentro del bloque -@code{\bookpart}. Los valores resultantes se usan para imprimir el -título de parte de libro para esa parte. +@code{\bookpart}. Los valores resultantes se usan para imprimir +el título de parte de libro para esa parte. @item Un título de partitura se deriva de los campos que se fijan al -principio del archivo de entrada, modificados por los campos fijados -dentro del bloque @code{\book}, posteriormente modificados por los -campos que se fijan dentro del bloque @code{\bookpart} y finalmente -modificados por los campos establecidos dentro del bloque -@code{\score}. Los valores restulantes se utilizan para imprimir el -título de partitura. Observe, sin embargo, que de forma -predeterminada solamente se imprimen los campos @code{piece} y -@code{opus} en los títulos de partitura a no ser que la variable de -@code{\paper}, @code{print-all-headers}, tenga el valor @code{#t}. +principio del archivo de entrada, modificados por los campos +fijados dentro del bloque @code{\book}, posteriormente +modificados por los campos que se fijan dentro del bloque +@code{\bookpart} y finalmente modificados por los campos +establecidos dentro del bloque @code{\score}. Los valores +resultantes se utilizan para imprimir el título de partitura. +Observe, sin embargo, que de forma predeterminada solamente se +imprimen los campos @code{piece} y @code{opus} en los títulos de +partitura a no ser que la variable de @code{\paper}, +@code{print-all-headers}, tenga el valor @code{#t}. @end itemize -@warning{Recuerde que al poner un bloque @bs{}@code{header} dentro de -un bloque @bs{}@code{score}, la expresión musical debe aparecer antes -del bloque @bs{}@code{header}.} +@warning{Recuerde que al poner un bloque @bs{}@code{header} +dentro de un bloque @bs{}@code{score}, la expresión musical debe +aparecer antes del bloque @bs{}@code{header}.} -No es necesario aportar bloques @code{\header} en los cuatro lugares: -cualquiera de ellos o incluso todos pueden omitirse. De forma -similar, los archivos de entrada sencillos pueden omitir los bloques -@code{\book} y @code{\bookpart}, dejando que se creen de forma -implícita. +No es necesario aportar bloques @code{\header} en los cuatro +lugares: cualquiera de ellos o incluso todos pueden omitirse. De +forma similar, los archivos de entrada sencillos pueden omitir +los bloques @code{\book} y @code{\bookpart}, dejando que se creen +de forma implícita. -Si el lobro solamente tiene una partitura, el bloque @code{\header} -debiera situarse normalmente al principio del archivo de forma que -solamente se produce una zona de título de parte de libro, haciendo -que estén disponibles para su uso todos los títulos de -encabezamientos. +Si el libro solamente tiene una partitura, el bloque +@code{\header} debiera situarse normalmente al principio del +archivo de forma que solamente se produce una zona de título de +parte de libro, haciendo que estén disponibles para su uso todos +los títulos de encabezamientos. Si el libro tiene varias partituras, son posibles distintas -combinaciones de bloques @code{\header}, según los distintos tipos de -publicaciones musicales. Por ejemplo, si la publicación contiene -varias piezas del mismo autor, un bloque @code{\header} colocado al -principio del archivo que especifique el título del libro y el autor, -con bloques @code{\header} en cada bloque @code{\score} que -especifique la @code{piece} y/o el @code{opus} sería lo más adecuado, -como aquí: +combinaciones de bloques @code{\header}, según los distintos +tipos de publicaciones musicales. Por ejemplo, si la publicación +contiene varias piezas del mismo autor, un bloque @code{\header} +colocado al principio del archivo que especifique el título del +libro y el autor, con bloques @code{\header} en cada bloque +@code{\score} que especifique la @code{piece} y/o el @code{opus} +sería lo más adecuado, como aquí: @lilypond[papersize=a5,quote,verbatim,noragged-right] \header { @@ -689,10 +709,10 @@ como aquí: } \score { - \new Staff \relative g, { + \new Staff \relative { \clef bass \key g \major - \repeat unfold 2 { g16( d' b') a b d, b' d, } | + \repeat unfold 2 { g,16( d' b') a b d, b' d, } | \repeat unfold 2 { g,16( e' c') b c e, c' e, } | } \header { @@ -701,7 +721,7 @@ como aquí: } \score { - \new Staff \relative b { + \new Staff \relative { \clef bass \key g \major \partial 16 b16 | @@ -714,10 +734,10 @@ como aquí: } @end lilypond -Son posibles disposiciones más complejas. Por ejemplo, los campos de -texto extraídos del bloque @code{\header} de un libro se pueden -imprimir en todos los títulos de partitura, con ciertos campos -sobreescritos y otros suprimidos manualmente: +Son posibles disposiciones más complejas. Por ejemplo, los +campos de texto extraídos del bloque @code{\header} de un libro +se pueden imprimir en todos los títulos de partitura, con ciertos +campos sobreescritos y otros suprimidos manualmente: @lilypond[papersize=a5,quote,verbatim,noragged-right] \book { @@ -727,7 +747,7 @@ sobreescritos y otros suprimidos manualmente: \header { title = "DAS WOHLTEMPERIRTE CLAVIER" subtitle = "TEIL I" - % Do not display the tagline for this book + % Do not display the default LilyPond footer for this book tagline = ##f } \markup { \vspace #1 } @@ -770,7 +790,7 @@ Referencia de la notación: @unnumberedsubsubsec Presentación predeterminada de los títulos de partes de libro y partitura @translationof Default layout of bookpart and score titles -Este ejemplo muestra todas las variables de @code{\header}: +Este ejemplo muestra todas las variables impresas de @code{\header}: @c KEEP LY @lilypond[papersize=a6landscape,quote,verbatim,noragged-right] @@ -790,8 +810,8 @@ Este ejemplo muestra todas las variables de @code{\header}: meter = "Meter (metro)" arranger = "Arranger (arreglista)" % Los siguientes campos están centrados en la parte inferior - tagline = "la tagline o línea de etiqueta va al final de la úitlma página" - copyright = "el copyright va al final de la primera página" + tagline = "La tagline o línea de etiqueta va al final de la última página" + copyright = "El copyright va al final de la primera página" } \score { { s1 } @@ -828,20 +848,22 @@ Observe que El nombre de instrumento se repite en todas las páginas. @item -Solamente @code{piece} (la pieza) y @code{opus} se imprimen en una -@code{\score} cuando la variable de papel @code{print-all-headers} se -establece a @code{##f} (el valor predeterminado). +Solamente @code{piece} (la pieza) y @code{opus} se imprimen en +una @code{\score} cuando la variable de papel +@code{print-all-headers} se establece a @code{##f} (el valor +predeterminado). @item @c Is the bit about \null markups true? -mp -Los campos de texto que se dejan sin establecer dentro de un bloque -@code{\header} se sustituyen por elementos de marcado nulos -@code{\null} de manera que no ocupen espacio innecesariamente. +Los campos de texto que se dejan sin establecer dentro de un +bloque @code{\header} se sustituyen por elementos de marcado +nulos @code{\null} de manera que no ocupen espacio +innecesariamente. @item -Los ajustes predeterminados para @code{scoreTitleMarkup} sitúan los -campos de texto @code{piece} y @code{opus} en extremos opuestos de la -misma línea. +Los ajustes predeterminados para @code{scoreTitleMarkup} sitúan +los campos de texto @code{piece} y @code{opus} en extremos +opuestos de la misma línea. @end itemize @@ -857,10 +879,11 @@ título de libro, inicie el bloque @code{\book} con algún material de marcado o con una instrucción @code{\pageBreak}. Utilice la variable @code{breakbefore} dentro de un bloque -@code{\header} que está propiamente dentro de un bloque @code{\score} -para hacer que los títulos del bloque @code{\header} del nivel -superior aparezcan ocupando toda la primera página, empezando la -música (definida en el bloque @code{\score}) en la página siguiente. +@code{\header} que está propiamente dentro de un bloque +@code{\score} para hacer que los títulos del bloque +@code{\header} del nivel superior aparezcan ocupando toda la +primera página, empezando la música (definida en el bloque +@code{\score}) en la página siguiente. @c KEEP LY @lilypond[papersize=c7landscape,verbatim,noragged-right] @@ -896,10 +919,10 @@ Archivos de inicio: @unnumberedsubsubsec Disposición predeterminada de las cabeceras y pies de página @translationof Default layout of headers and footers -Las @emph{cabeceras} y los @emph{pies} de página son líneas de texto -que aparecen en la parte más alta y en la más baja de las páginas -separadas del texto principal de un libro. Se controlan mediante las -siguientes variables de @code{\paper}: +Las @emph{cabeceras} y los @emph{pies} de página son líneas de +texto que aparecen en la parte más alta y en la más baja de las +páginas separadas del texto principal de un libro. Se controlan +mediante las siguientes variables de @code{\paper}: @itemize @item @code{oddHeaderMarkup} (marcado de cabecera impar) @@ -908,25 +931,25 @@ siguientes variables de @code{\paper}: @item @code{evenFooterMarkup} (marcado de pie par) @end itemize -Estas variables de marcado sólo pueden acceder a los campos de texto -extraídos de bloques @code{\header} del nivel superior (que se aplican -a todas las partituras del libro) y se definen en el archivo -@file{ly/titling-init.ly}. De forma predeterminada: +Estas variables de marcado sólo pueden acceder a los campos de +texto extraídos de bloques @code{\header} del nivel superior (que +se aplican a todas las partituras del libro) y se definen en el +archivo @file{ly/titling-init.ly}. De forma predeterminada: @itemize @item -los números de página se sitúan automáticamente en el extremo superior -izquierdo (si es par) o superior derecho (si es impar), a partir de la -segunda página. +los números de página se sitúan automáticamente en el extremo +superior izquierdo (si es par) o superior derecho (si es impar), +a partir de la segunda página. @item el campo de texto @code{instrument} se sitúa en el centro en cada página, a partir de la segunda página. @item -el texto de @code{copyright} se centra en la parte baja de la primera -página. +el texto de @code{copyright} se centra en la parte baja de la +primera página. @item la línea @code{tagline} se centra al final de la última página, y @@ -934,8 +957,9 @@ debajo del texto de @code{copyright} si sólo hay una página. @end itemize -La línea de etiqueta tagline predeterminada se puede cambiar añadiendo un campo -@code{tagline} en el bloque @code{\header} del nivel superior. +La línea predeterminada de pie de página de LilyPond se puede +cambiar añadiendo un campo @code{tagline} en el bloque +@code{\header} del nivel superior. @lilypond[papersize=a8landscape,verbatim] \book { @@ -943,15 +967,15 @@ La línea de etiqueta tagline predeterminada se puede cambiar añadiendo un camp tagline = "... music notation for Everyone" } \score { - \relative c' { - c4 d e f + \relative { + c'4 d e f } } } @end lilypond -Para eliminar la línea @code{tagline}, establezca su valor a -@code{##f}. +Para eliminar la línea de pie de página predeterminada de +LilyPond, establezca el valor de @code{tagline} a @code{##f}. @node Títulos encabezamientos y pies de página personalizados @@ -972,9 +996,9 @@ Para eliminar la línea @code{tagline}, establezca su valor a @unnumberedsubsubsec Formateo personalizado del texto de los bloques de título @translationof Custom text formatting for titles -Se pueden usar instrucciones @code{\markup} estándar para personalizar -el texto de cualquier cabecera, pie o título dentro del bloque -@code{\header}. +Se pueden usar instrucciones @code{\markup} estándar para +personalizar el texto de cualquier cabecera, pie o título dentro +del bloque @code{\header}. @lilypond[quote,verbatim,noragged-right] \score { @@ -1000,11 +1024,11 @@ Referencia de la notación: @funindex bookTitleMarkup @funindex scoreTitleMarkup -Las instrucciones @code{\markup} dentro del bloque @code{\header} son -útiles para dar un formato simple al texto, pero no permiten un -control preciso sobre la colocación de los títulos. Para personalizar -la colocación de los campos de texto, cambie una o las dos variables de -@code{\paper} siguientes: +Las instrucciones @code{\markup} dentro del bloque @code{\header} +son útiles para dar un formato simple al texto, pero no permiten +un control preciso sobre la colocación de los títulos. Para +personalizar la colocación de los campos de texto, cambie una o +las dos variables de @code{\paper} siguientes: @itemize @item @code{bookTitleMarkup} (marcado de título del libro) @@ -1012,12 +1036,12 @@ la colocación de los campos de texto, cambie una o las dos variables de @end itemize La colocación de los títulos cuando se utilizan los valores -predeterminados de estas variables de @code{\markup} se muestra en los -ejemplos de +predeterminados de estas variables de @code{\markup} se muestra +en los ejemplos de @ref{Presentación predeterminada de los títulos de partes de libro y partitura}. -Los ajustes predeterminados para @code{scoreTitleMarkup} tal y como -están definidos en el archivo @file{ly/titling-init.ly} son: +Los ajustes predeterminados para @code{scoreTitleMarkup} tal y +como están definidos en el archivo @file{ly/titling-init.ly} son: @example scoreTitleMarkup = \markup @{ \column @{ @@ -1043,9 +1067,9 @@ opuestos de la misma línea: } @end lilypond -Este ejemplo redefine @code{scoreTitleMarkup} de manera que el campo -de texto @code{piece} aparece centrado y en un tipo de letra grande y -en negrita. +Este ejemplo redefine @code{scoreTitleMarkup} de manera que el +campo de texto @code{piece} aparece centrado y en un tipo de +letra grande y en negrita. @lilypond[papersize=a5,quote,verbatim,noragged-right] \book { @@ -1070,21 +1094,21 @@ en negrita. } @end lilypond -Los campos de texto que normalmente no son efectivos -dentro de los bloques @code{\header} de una partitura -se pueden imprimir el la zona del Título de la partitura -si se coloca @code{print-all-headers} dentro del bloque @code{\paper}. -Una desventaja de la -utilización de este método es que los campos de texto que están -orientados específicamente para la zona del título de parte de libro -han de suprimirse manualmente en cada uno de los bloques -@code{\score}. Véase @ref{Explicación de los títulos}. +Los campos de texto que normalmente no son efectivos dentro de +los bloques @code{\header} de una partitura se pueden imprimir el +la zona del Título de la partitura si se coloca +@code{print-all-headers} dentro del bloque @code{\paper}. Una +desventaja de la utilización de este método es que los campos de +texto que están orientados específicamente para la zona del +título de parte de libro han de suprimirse manualmente en cada +uno de los bloques @code{\score}. Véase @ref{Explicación de los +títulos}. Para evitarlo, añada el campo de texto deseado a la definición de -@code{scoreTitleMarkup}. En el ejemplo siguiente, el campo de texto -@code{composer} (asociado normalmente con @code{bookTitleMarkup}) se -añade a @code{scoreTitleMarkup}, permitiendo que cada partitura -muestre un compositor diferente: +@code{scoreTitleMarkup}. En el ejemplo siguiente, el campo de +texto @code{composer} (asociado normalmente con +@code{bookTitleMarkup}) se añade a @code{scoreTitleMarkup}, +permitiendo que cada partitura muestre un compositor diferente: @lilypond[papersize=a5,quote,verbatim,noragged-right] \book { @@ -1116,8 +1140,9 @@ muestre un compositor diferente: } @end lilypond -También podemos crear nuestros propios campos de texto personalizados, -y referirnos a ellos en la definición del elemento de marcado. +También podemos crear nuestros propios campos de texto +personalizados, y referirnos a ellos en la definición del +elemento de marcado. @lilypond[papersize=a5,quote,verbatim,noragged-right] \book { @@ -1162,11 +1187,12 @@ Referencia de la notación: @c can make-header and make-footer be removed from @c paper-defaults-init.ly? -mp -Las instrucciones @code{\markup} dentro del bloque @code{\header} son -de utilidad para dar formato al texto de una manera sencilla, pero no -permiten un control preciso sobre la colocación de las cabeceras y los -pies de página. Para personalizar la colocación de los campos de -texto, use una o más de las siguientes variables de @code{\paper}: +Las instrucciones @code{\markup} dentro del bloque @code{\header} +son de utilidad para dar formato al texto de una manera sencilla, +pero no permiten un control preciso sobre la colocación de las +cabeceras y los pies de página. Para personalizar la colocación +de los campos de texto, use una o más de las siguientes variables +de @code{\paper}: @itemize @item @code{oddHeaderMarkup} (marcado de encabezamiento impar) @@ -1179,10 +1205,10 @@ texto, use una o más de las siguientes variables de @code{\paper}: @cindex on-the-fly @funindex \on-the-fly -La instrucción de marcado @code{\on-the-fly} se puede utilizar para -añadir elementos de forma condicional al texto de encabezamiento y pie -de página definido dentro del bloque @code{\paper}, usando la sintaxis -siguiente: +La instrucción de marcado @code{\on-the-fly} se puede utilizar +para añadir elementos de forma condicional al texto de +encabezamiento y pie de página definido dentro del bloque +@code{\paper}, usando la sintaxis siguiente: @example @code{variable} = @code{\markup} @{ @@ -1192,11 +1218,11 @@ siguiente: @} @end example -El @var{procedimiento} se llama cada vez que se evalúa la instrucción -@code{\markup} en que ésta aparece. El @var{procedimiento} debería -comprobar si se cumple una condición determinada e interpretar (es -decir: imprimir) el argumento @var{marcado} si, y sólo si, la -condición es verdadera. +El @var{procedimiento} se llama cada vez que se evalúa la +instrucción @code{\markup} en que ésta aparece. El +@var{procedimiento} debería comprobar si se cumple una condición +determinada e interpretar (es decir: imprimir) el argumento +@var{marcado} si, y sólo si, la condición es verdadera. Se proveen un cierto número de procedimientos ya hechos para la comprobación de diversas condiciones: @@ -1220,13 +1246,14 @@ comprobación de diversas condiciones: @end multitable @end quotation -El ejemplo siguiente centra los números de página en la parte baja de -las páginas. En primer lugar, los ajustes predeterminados para -@code{oddHeaderMarkup} y @code{evenHeaderMarkup} se eliminan -definiéndolos como un marcado @emph{nulo}. Después de esto, se -redefine @code{oddFooterMarkup} con el número de página centrado. -Finalmente, @code{evenFooterMarkup} recibe la misma disposición -definiéndola como @code{\oddFooterMarkup}: +El ejemplo siguiente centra los números de página en la parte +baja de las páginas. En primer lugar, los ajustes +predeterminados para @code{oddHeaderMarkup} y +@code{evenHeaderMarkup} se eliminan definiéndolos como un marcado +@emph{nulo}. Después de esto, se redefine @code{oddFooterMarkup} +con el número de página centrado. Finalmente, +@code{evenFooterMarkup} recibe la misma disposición definiéndola +como @code{\oddFooterMarkup}: @lilypond[papersize=a8,quote,verbatim,noragged-right] \book { @@ -1249,8 +1276,8 @@ definiéndola como @code{\oddFooterMarkup}: } @end lilypond -Se pueden combinar varias condiciones de @code{\on-the-fly} con un -operador @q{and}, por ejemplo: +Se pueden combinar varias condiciones de @code{\on-the-fly} con +un operador @q{and}, por ejemplo: @example @code{\on-the-fly \first-page} @@ -1268,6 +1295,52 @@ Referencia de la notación: Archivos instalados: @file{../ly/titling-init.ly}. +@node Creación de metadatos de PDF +@subsection Creación de metadatos de PDF +@translationof Creating PDF metadata + +@cindex metadatos de PDF + +Además de mostrarse en la salida impresa, las variables de +encabezamiento de @code{\header} se usan para establecer los +metadatos de PDF (la información que muestran los lectores de PDF +como @code{propiedades} del archivo). Por ejemplo, si se +establece la propiedad @code{title} del bloque @code{header} como +@q{Sinfonía núm. 1}, el documento PDF llevará también este +título. + +@example + @code{\header@{} + @code{title = "Sinfonía núm. 1"} + @code{@}} +@end example + +Si quiere fijar el título de la salida impresa con un texto pero +quiere que la propiedad de título del PDF tenga un texto +diferente, puede usar @code{pdftitle} como se muestra a +continuación. + +@example + @code{\header@{} + @code{title = "Sinfonía núm. 1"} + @code{pdftitle = "Sinfonía núm. 1 de Beethoven"} + @code{@}} +@end example + +Todas las variables @code{title}, @code{subject}, +@code{keywords}, @code{subtitle}, @code{composer}, +@code{arranger}, @code{poet}, @code{author} y @code{copyright} +establecen propiedades del PDF y pueden hacerse preceder de +@q{pdf} para fijar una propiedad del archivo PDF a un valor +distinto del de la salida impresa. + +La propiedad de PDF @code{Creator} se fija automáticamente a +@q{LilyPond} más la versión actual de LilyPond, y las variables +@code{CreationDate} y @code{ModDate} se fijan a la fecha y hora +actuales. Se puede sobreescribir @code{ModDate} mediante el +establecimiento de un valor para la variable de cabecera +@code{moddate} (o @code{pdfmoddate}) a una cadena de fecha de PDF +válida. @node Crear notas al pie @subsection Crear notas al pie @@ -1291,16 +1364,17 @@ Se pueden crear dos tipos de notas al pie: automáticas y manuales. @subsubsubheading Panorámica de las notas al pie -Las notas al pie dentro de expresiones musicales caen dentro de dos -categorías: +Las notas al pie dentro de expresiones musicales caen dentro de +dos categorías: @table @emph @item Notas al pie basadas en eventos -Se adjuntan a un evento en particular. Son ejemplos de tales eventos -las notas sueltas, las articulaciones (como indicaciones de digitación, -acentos, indicaciones dinámicas) y los post-eventos (como las ligaduras de expresión -y las barras de corchea manuales). La forma general de las notas -al pie basadas en eventos es como sigue: +Se adjuntan a un evento en particular. Son ejemplos de tales +eventos las notas sueltas, las articulaciones (como indicaciones +de digitación, acentos, indicaciones dinámicas) y los +post-eventos (como las ligaduras de expresión y las barras de +corchea manuales). La forma general de las notas al pie basadas +en eventos es como sigue: @example [@var{dirección}] \footnote [@var{marca}] @var{desplazamiento} @var{texto-de-la-nota} @var{música} @@ -1308,13 +1382,13 @@ al pie basadas en eventos es como sigue: @item Notas al pie basadas en tiempo Se ligan a un punto temporal determinado, dentro de un contexto -musical. Algunas instrucciones como @code{\time} y @code{\clef} en -realidad no usan eventos para crear objetos como la indicación de -compás y la clave. Un acorde tampoco crea un evento por sí mismo: su -plica o corchete se crea al final de un paso de tiempo (nominalmente, -a través de uno de los eventos de nota que contiene). Una nota al pie -basada en tiempo permite anotar tales objetos de presentación sin -referirse a ningún evento. +musical. Algunas instrucciones como @code{\time} y @code{\clef} +en realidad no usan eventos para crear objetos como la indicación +de compás y la clave. Un acorde tampoco crea un evento por sí +mismo: su plica o corchete se crea al final de un paso de tiempo +(nominalmente, a través de uno de los eventos de nota que +contiene). Una nota al pie basada en tiempo permite anotar tales +objetos de presentación sin referirse a ningún evento. Una nota al pie basada en tiempo permite que tales objetos de presentación se puedan anotar sin hacer referencia a un evento. @@ -1331,42 +1405,45 @@ Los elementos para las dos formas son como sigue: @table @var @item dirección -Si (y sólo si) el @code{\footnote} se está aplicando a un post-evento -o articulación, debe ir precedida de un indicador de dirección -(@code{-, _, ^}) con el objeto de adjuntar la @var{música} (con una -marca de nota al pie) a la nota o silencio precedente. +Si (y sólo si) el @code{\footnote} se está aplicando a un +post-evento o articulación, debe ir precedida de un indicador de +dirección (@code{-, _, ^}) con el objeto de adjuntar la +@var{música} (con una marca de nota al pie) a la nota o silencio +precedente. @item marca -es un elemento de marcado o cadena de caracteres que especifica la -marca de nota al pie que se usa para marcar tanto el punto de +es un elemento de marcado o cadena de caracteres que especifica +la marca de nota al pie que se usa para marcar tanto el punto de referencia como la propia nota al pie en la parte inferior de la -página. Se puede omitir (o, de forma equivalente, sustituirse por -@code{\default}) en cuyo caso se genera un número secuencialmente de -forma automática. Tales secuencias numéricas se reinician en cada -página que contiene una nota al pie. +página. Se puede omitir (o, de forma equivalente, sustituirse +por @code{\default}) en cuyo caso se genera un número +secuencialmente de forma automática. Tales secuencias numéricas +se reinician en cada página que contiene una nota al pie. @item desplazamiento -es una pareja de números tal como @samp{#(2 . 1)} que especifica los -desplazamientos en X y en Y en unidades de espacios de pentagrama a -partir del límite del objeto en que se desea situar la marca. Los -valores de desplazamiento positivos se toman a partir del borde -superior derecho, los valores negativos a partir del borde inferior -izquierdo y cero implica que la marca se centra sobre el borde. +es una pareja de números tal como @samp{#(2 . 1)} que especifica +los desplazamientos en X y en Y en unidades de espacios de +pentagrama a partir del límite del objeto en que se desea situar +la marca. Los valores de desplazamiento positivos se toman a +partir del borde superior derecho, los valores negativos a partir +del borde inferior izquierdo y cero implica que la marca se +centra sobre el borde. @item Contexto es el contexto en que se crea el grob que recibe la nota al pie. Se puede omitir si el grob está en un contexto del nivel inferior, -p.ej un contexto @code{Voice}. +p. ej. un contexto @code{Voice}. @item Nombre-del-Grob especifica un tipo de grob que marcar (como @samp{Flag} para el -corchete). Si se da, la nota al pie no se adjunta a una expresión -musical en particular, sino a todos los grobs del tipo +corchete). Si se da, la nota al pie no se adjunta a una +expresión musical en particular, sino a todos los grobs del tipo especificado que ocurren en dicho momento de tiempo musical. @item texto-de-la-nota -es el elemento de marccado o cadena de caracteres que especifica el -texto de la nota al pie que utilizar en la parte baja de la página. +es el elemento de marcado o cadena de caracteres que especifica +el texto de la nota al pie que utilizar en la parte baja de la +página. @item música es el evento musical, post-evento o articulación que se @@ -1399,11 +1476,11 @@ sintaxis siguiente: } @end lilypond -No es posible marcar un acrode @emph{completo} con una nota al pie -basada en evento: un acorde, incluso aquel que contiene una sola -nota, no produce un verdadero evento por sí mismo. Sin embargo, -las notas individuales que están @emph{dentro} del acorde sí se -pueden marcar: +No es posible marcar un acorde @emph{completo} con una nota al +pie basada en evento: un acorde, incluso aquel que contiene una +sola nota, no produce un verdadero evento por sí mismo. Sin +embargo, las notas individuales que están @emph{dentro} del +acorde sí se pueden marcar: @c KEEP LY @lilypond[quote,verbatim,papersize=a8landscape] @@ -1419,11 +1496,11 @@ pueden marcar: Si se desea que la nota al pie se adjunte a un post-evento o articulación, la instrucción @code{\footnote} @emph{debe} ir -precedida por un indicador de dirección, @code{-, _, ^}, y seguida -por el post-evento o articulación que se desea anotar como -argumento @var{música}. En esta forma, la @code{\footnote} se -puede considerar como una simple copia de su último argumento con -una marca de nota al pie adjunta. La sintaxis es: +precedida por un indicador de dirección, @code{-, _, ^}, y +seguida por el post-evento o articulación que se desea anotar +como argumento @var{música}. En esta forma, la @code{\footnote} +se puede considerar como una simple copia de su último argumento +con una marca de nota al pie adjunta. La sintaxis es: @example @var{dirección} \footnote [@var{marca}] @var{desplazamiento} @var{texto-de-la-nota} @var{música} @@ -1433,8 +1510,8 @@ una marca de nota al pie adjunta. La sintaxis es: @lilypond[quote,verbatim,papersize=a8landscape] \book { \header { tagline = ##f } - \relative c'' { - a4_\footnote #'(0 . -1) "Ligadura forzada hacia abajo" ( + \relative { + a'4_\footnote #'(0 . -1) "Ligadura forzada hacia abajo" ( b8^\footnote #'(1 . 0.5) "Barra manual forzada hacia arriba" [ b8 ] c4 ) @@ -1451,8 +1528,8 @@ Si el objeto de presentación que recibe la nota al pie está causado @emph{indirectamente} por un evento (como un objeto @code{Accidental}, alteración, o @code{Stem}, plica, causados por un evento @code{NoteHead}, cabeza de nota), el nombre del grob -@var{GrobName} del objeto de presentación es necesario después del -texto de la nota al pie, en lugar de @var{música}: +@var{GrobName} del objeto de presentación es necesario después +del texto de la nota al pie, en lugar de @var{música}: @c KEEP LY @lilypond[quote,verbatim,papersize=a8landscape] @@ -1490,22 +1567,22 @@ Una nota dentro de un acorde puede recibir una nota al pie individual, basada en evento. El único grob causado directamente por una nota de un acorde es @samp{NoteHead}, por lo que la instrucción de nota al pie basada en evento @emph{solamente} es -apta para añadir una nota al pie a la @samp{NoteHead} dentro de un -acorde. Todos los demás grobs de notas de acorde están causados -indirectamente. La propia instrucción @code{\footnote} no ofrece -ninguna sintaxis para especificar al mismo tiempo un tipo concreto -de grob @emph{y también} un evento concreto al que adjuntar la -nota. Sin embargo, se puede usat una instrucción @code{\footnote} -basada en tiempo para especificar el tipo de grob, y luego añadir -la instrucción @code{\single} como prefijo, con el objeto de que -se aplique solamente al evento siguiente: +apta para añadir una nota al pie a la @samp{NoteHead} dentro de +un acorde. Todos los demás grobs de notas de acorde están +causados indirectamente. La propia instrucción @code{\footnote} +no ofrece ninguna sintaxis para especificar al mismo tiempo un +tipo concreto de grob @emph{y también} un evento concreto al que +adjuntar la nota. Sin embargo, se puede usar una instrucción +@code{\footnote} basada en tiempo para especificar el tipo de +grob, y luego añadir la instrucción @code{\single} como prefijo, +con el objeto de que se aplique solamente al evento siguiente: @c KEEP LY @lilypond[quote,verbatim,papersize=a8landscape] \book { \header { tagline = ##f } \relative c'' { - < \footnote #'(1 . -2) "An A" a + < \footnote #'(1 . -2) "Un La" a \single \footnote #'(-1 . -1) "Un sostenido" Accidental cis \single \footnote #'(0.5 . 0.5) "Un bemol" Accidental @@ -1515,28 +1592,29 @@ se aplique solamente al evento siguiente: } @end lilypond -@warning {Cuando las notas al pie se adjuntan a varios elementos musicales que -están dentro del mismo momento musical, como ocurre en el ejemplo -anterior, las notas al pie se numeran desde los elementos más -altos a los más bajos tal y como aparecen en la salida impresa, no -en el orden en que se escriben en el flujo de entrada.} +@warning{Cuando las notas al pie se adjuntan a varios elementos musicales +que están dentro del mismo momento musical, como ocurre en el +ejemplo anterior, las notas al pie se numeran desde los elementos +más altos a los más bajos tal y como aparecen en la salida +impresa, no en el orden en que se escriben en el flujo de +entrada.} Los objetos de presentación como las claves y las armaduras de cambio de tonalidad están, más bien, causadas por propiedades que cambian, y no por eventos. Otros, como las líneas divisorias y los números de compás, son una consecuencia directa del paso del tiempo. Por esta razón, las notas al pie sobre tales objetos -tienen que basarse en su tiempo musical. Las notas al pie basadas -en tiempo so preferibles también cuando se marcan cosas como las -plicas y las barras de corchea en @emph{acordes}: dado que estas -funcionalidades de cada acorde individual están asignadas -normalmente a @emph{un solo} evento dentro del acorde, sería -imprudente descansar en una elección particular. - -En las notas al pie basadas en tiempo, siempre se debe especificar -explícitamente el objeto de presentación en cuestión, y si el grob -se crea dentro de un contexto distinto al de nivel más bajo, debe -especificarse el contexto apropiado. +tienen que basarse en su tiempo musical. Las notas al pie +basadas en tiempo so preferibles también cuando se marcan cosas +como las plicas y las barras de corchea en @emph{acordes}: dado +que estas funcionalidades de cada acorde individual están +asignadas normalmente a @emph{un solo} evento dentro del acorde, +sería imprudente descansar en una elección particular. + +En las notas al pie basadas en tiempo, siempre se debe +especificar explícitamente el objeto de presentación en cuestión, +y si el grob se crea dentro de un contexto distinto al de nivel +más bajo, debe especificarse el contexto apropiado. @c KEEP LY @lilypond[quote,verbatim,papersize=a8landscape] @@ -1589,19 +1667,19 @@ Se muestran más ejemplos de marcas personalizadas en @cindex notas al pie en texto independiente Se utilizan dentro de un elemento de marcado fuera de cualquier -expresión musical. No se traza una líne hasta el punto de referencia: -la marca simplemente sigue al elemento de marcado que se referencia. -Se pueden insertar las marcas automáticamente, en cuyo caso son -numéricas. De forma alternativa, se pueden aportar manualmente marcas -personalizadas. +expresión musical. No se traza una línea hasta el punto de +referencia: la marca simplemente sigue al elemento de marcado que +se referencia. Se pueden insertar las marcas automáticamente, en +cuyo caso son numéricas. De forma alternativa, se pueden aportar +manualmente marcas personalizadas. -Las notas al pie para texto independiente con marcas automáticas y -personalizadas se crean de distintas formas. +Las notas al pie para texto independiente con marcas automáticas +y personalizadas se crean de distintas formas. @subsubsubheading Notas al pie en texto independiente con marcas automáticas -La sintaxis de una nota al pue sobre texto independiente con marcas -automáticas es +La sintaxis de una nota al pie sobre texto independiente con +marcas automáticas es @example \markup @{ @dots{} \auto-footnote @var{texto} @var{nota} @dots{} @} @@ -1612,11 +1690,13 @@ Los elementos son: @table @var @item texto -es el elemento de marcado o cadena de caracteres que se desea anotar. +es el elemento de marcado o cadena de caracteres que se desea +anotar. @item nota -es el elemento de marcado o cadena de caracteres que especifica el -texto de la nota al pie que utilizar en la parte baja de la página. +es el elemento de marcado o cadena de caracteres que especifica +el texto de la nota al pie que utilizar en la parte baja de la +página. @end table @@ -1632,7 +1712,7 @@ Por ejemplo: \auto-footnote "recent" \italic " Aug 2012" "composition." } - \relative c' { + \relative { a'4 b8 e c4 d } } @@ -1640,8 +1720,8 @@ Por ejemplo: @subsubsubheading Notas al pie sobre texto independiente con marcas personalizadas -La sintaxis de una nota al pie sobre texto independiente con marcas -personalizadas es +La sintaxis de una nota al pie sobre texto independiente con +marcas personalizadas es @example \markup @{ @dots{} \footnote @var{marca} @var{nota} @dots{} @} @@ -1652,15 +1732,15 @@ Los elementos son: @table @var @item marca -es un elemento de marcado o cadena de caracteres que especifica la -marca que se usa para señalar el punto de referencia. Observe que -esta marca @emph{no} se inserta automáticamente antes de la propia -nota al pie. +es un elemento de marcado o cadena de caracteres que especifica +la marca que se usa para señalar el punto de referencia. Observe +que esta marca @emph{no} se inserta automáticamente antes de la +propia nota al pie. @item nota -es el elemento de marcado o cadena de caracteres que especifica el -texto de la nota que aparece en la parte baja de la página, precedida -por la @var{marca} especificada. +es el elemento de marcado o cadena de caracteres que especifica +el texto de la nota que aparece en la parte baja de la página, +precedida por la @var{marca} especificada. @end table @@ -1682,7 +1762,7 @@ De forma alternativa, se pueden usar alias en ASCII (véase } "composition." } - \relative c' { + \relative { a'4 b8 e c4 d } } @@ -1705,7 +1785,7 @@ especificar las marcas (véase @ref{Unicode}): } "composition." } - \relative c' { + \relative { a'4 b8 e c4 d } } @@ -1718,7 +1798,7 @@ Manual de aprendizaje: Referencia de la notación: @ref{ASCII aliases}, @ref{Globos de ayuda}, -@ref{List of special characters}, +@ref{Lista de caracteres especiales}, @ref{Indicaciones de texto}, @ref{Guiones de texto}, @ref{Unicode}. @@ -1730,8 +1810,8 @@ Referencia de funcionamiento interno: @rinternals{Footnote_engraver}. @knownissues -Varias notas al pie en la misma página solo pueden ir apiladas unas -sobre otras; no se pueden imprimir en la misma línea. +Varias notas al pie en la misma página solo pueden ir apiladas +unas sobre otras; no se pueden imprimir en la misma línea. Las notas al pie no se pueden adjuntar a @code{MultiMeasureRests} (silencios multicompás), a barras de corchea automáticas ni a la @@ -1747,11 +1827,11 @@ anotación. @translationof Reference to page numbers Un lugar determinado de una partitura puede señalizarse usando la -instrucción @code{\label} (etiqueta), ya sea en el nivel superior o -dentro de la música. Podemos referirnos a esta etiqueta más tarde -dentro de un elemento de marcado, para obtener el número de la página -en la que se sitúa el punto señalizado, usando la instrucción de -marcado @code{\page-ref}. +instrucción @code{\label} (etiqueta), ya sea en el nivel superior +o dentro de la música. Podemos referirnos a esta etiqueta más +tarde dentro de un elemento de marcado, para obtener el número de +la página en la que se sitúa el punto señalizado, usando la +instrucción de marcado @code{\page-ref}. @c KEEP LY @lilypond[verbatim,papersize=a8landscape] @@ -1772,20 +1852,20 @@ marcado @code{\page-ref}. La instrucción de marcado @code{\page-ref} toma tres argumentos: @enumerate -@item la etiqueta, un símbolo de scheme, p.ej. @code{#'firstScore}; +@item la etiqueta, un símbolo de Scheme, p.ej. @code{#'firstScore}; @item un elemento de marcado que se usará como medidor para estimar las dimensiones del marcado; @item un elemento de marcado que se utilizará en sustitución del número de página si la etiqueta es desconocida. @end enumerate -El motivo de que se necesite un medidor es que en el momento en que se -están interpretando los marcados, los saltos de página aún no se han -producido y por tanto los números de página no se conocen todavía. -Para sortear este inconveniente, la interpretación real del marcado se -retrasa hasta un momento posterior; sin embargo, las dimensiones del -marcado se tienen que conocer de antemano, así que se usa el medidor -para decidir estas dimensiones. Si el libro tiene entre 10 y 99 -páginas, el medidor puede ser "00", es decir, un número de dos -dígitos. +El motivo de que se necesite un medidor es que en el momento en +que se están interpretando los marcados, los saltos de página aún +no se han producido y por tanto los números de página no se +conocen todavía. Para sortear este inconveniente, la +interpretación real del marcado se retrasa hasta un momento +posterior; sin embargo, las dimensiones del marcado se tienen que +conocer de antemano, así que se usa el medidor para decidir estas +dimensiones. Si el libro tiene entre 10 y 99 páginas, el medidor +puede ser "00", es decir, un número de dos dígitos. @predefined @funindex \label @@ -1799,11 +1879,12 @@ dígitos. @subsection Índice general @translationof Table of contents -Se puede insertar un índice general o tabla de contenidos utilizando -la instrucción @code{\markuplist \table-of-contents}. Los elementos -que deben aparecer en la tabla de contenidos se introducen con la -instrucción @code{\tocItem}, que se puede usar en el nivel más alto de -la jerarquía del código, o dentro de una expresión musical. +Se puede insertar un índice general o tabla de contenidos +utilizando la instrucción @code{\markuplist \table-of-contents}. +Los elementos que deben aparecer en la tabla de contenidos se +introducen con la instrucción @code{\tocItem}, que se puede usar +en el nivel más alto de la jerarquía del código, o dentro de una +expresión musical. @verbatim \markuplist \table-of-contents @@ -1827,40 +1908,94 @@ la jerarquía del código, o dentro de una expresión musical. @end verbatim Los elementos de marcado que se usan para dar formato al índice -general se encuentran definidos dentro del bloque @code{\paper}. Los -elementos predeterminados son @code{tocTitleMarkup}, para dar formato -al título de la tabla, y @code{tocItemMarkup}, para aplicar formato a -los elementos del índice, que consisten en el título del elemento y el -número de página. Estas variables se pueden cambiar por parte del -usuario: +general o tabla de contenidos se encuentran definidos dentro del +bloque @code{\paper}. Hay dos elementos de marcado +@q{predefinidos} disponibles: + +@itemize + +@item +@code{tocTitleMarkup} + +@noindent +Utilizado para dar formato al título del índice general. + +@verbatim +tocTitleMarkup = \markup \huge \column { + \fill-line { \null "Índice general" \null } + \null +} +@end verbatim + +@item +@code{tocItemMarkup} + +@noindent +Usado para dar formato a los elementos del índice general. + +@verbatim +tocItemMarkup = \markup \fill-line { + \fromproperty #'toc:text \fromproperty #'toc:page +} +@end verbatim + +@end itemize + +@noindent +Ambas variables pueden modificarse. + +He aquí un ejemplo que modifica el título del índice general para +que aparezca en francés: @verbatim \paper { - %% Traducir el título del índice al español: tocTitleMarkup = \markup \huge \column { - \fill-line { \null "Índice general" \null } + \fill-line { \null "Table des matières" \null } \hspace #1 } - %% usar una fuente mayor - tocItemMarkup = \markup \large \fill-line { - \fromproperty #'toc:text \fromproperty #'toc:page - } +@end verbatim + +A continuación aparece un ejemplo que modifica el tamaño de +fuente tipográfica de los elementos del índice general: + +@verbatim +tocItemMarkup = \markup \large \fill-line { + \fromproperty #'toc:text \fromproperty #'toc:page } @end verbatim -Observe la forma en que nos referimos al texto y al número de página -del elemento de índice, dentro de la definición @code{tocItemMarkup}. +Observe la forma en que nos referimos al texto y al número de +página del elemento de índice, dentro de la definición +@code{tocItemMarkup}. -También se pueden definir nuevas instrucciones y elementos de -marcado para crear índices generales más elaborados: -@itemize -@item en primer lugar, defina una variable de marcado nueva dentro del bloque @code{\paper} -@item luego defina una función de música cuyo propósito es añadir un elemento al índice general -utilizando esta variable de marcado del bloque @code{\paper}. -@end itemize +La instrucción @code{\tocItemWithDotsMarkup} se puede incluir +dentro de @code{tocItemMarkup} para llenar la línea con puntos +entre un elemento del índice general y su número de página +correspondiente: -En el ejemplo siguiente se define un estilo nuevo para introducir los -nombres de los actos de una ópera en el índice general: +@lilypond[verbatim,line-width=10.0\cm] +\header { tagline = ##f } +\paper { + tocItemMarkup = \tocItemWithDotsMarkup +} + +\book { + \markuplist \table-of-contents + \tocItem \markup { Allegro } + \tocItem \markup { Largo } + \markup \null +} +@end lilypond + +Las instrucciones predefinidas con sus propios marcados pueden +definirse también para que construyan un índice general más +complejo. En el ejemplo siguiente se define un estilo nuevo para +introducir los nombres de los actos de una ópera en el índice +general: + +@noindent +Una nueva variable de marcado (llamada @code{tocActMarkup}) se +define en el bloque @code{\paper}: @verbatim \paper { @@ -1870,12 +2005,23 @@ nombres de los actos de una ópera en el índice general: \hspace #1 } } +@end verbatim + +@noindent +A continuación se crea una función musical personalizada +(@code{tocAct}), que usa la nueva definición de marcado +@code{tocActMarkup}. +@verbatim tocAct = -#(define-music-function (parser location text) (markup?) - (add-toc-item! 'tocActMarkup text)) + #(define-music-function (text) (markup?) + (add-toc-item! 'tocActMarkup text)) @end verbatim +@noindent +Un archivo de entrada de LilyPond que use estas definiciones +personalizadas tendría el aspecto siguiente: + @lilypond[line-width=10.0\cm] \header { tagline = ##f } \paper { @@ -1887,14 +2033,14 @@ tocAct = } tocAct = -#(define-music-function (parser location text) (markup?) +#(define-music-function (text) (markup?) (add-toc-item! 'tocActMarkup text)) \book { \markuplist \table-of-contents \tocAct \markup { Atto Primo } \tocItem \markup { Coro. Viva il nostro Alcide } - \tocItem \markup { Cesare. Presti omai l'Egizzia terra } + \tocItem \markup { Cesare. Presti omai l'Egizia terra } \tocAct \markup { Atto Secondo } \tocItem \markup { Sinfonia } \tocItem \markup { Cleopatra. V'adoro, pupille, saette d'Amore } @@ -1902,21 +2048,19 @@ tocAct = } @end lilypond -Se pueden añadir puntos de relleno entre un elemento y su número de página: -@lilypond[verbatim,line-width=10.0\cm] -\header { tagline = ##f } -\paper { - tocItemMarkup = \tocItemWithDotsMarkup -} +He aquí un ejemplo de la instrucción @code{\fill-with-pattern} +usada dentro del contexto de un índice general: -\book { - \markuplist \table-of-contents - \tocItem \markup { Allegro } - \tocItem \markup { Largo } - \markup \null +@verbatim +\paper { + tocItemMarkup = \markup { \fill-line { + \override #'(line-width . 70) + \fill-with-pattern #1.5 #CENTER . \fromproperty #'toc:text \fromproperty #'toc:page + } + } } -@end lilypond +@end verbatim @seealso Archivos de inicio: @@ -1955,26 +2099,29 @@ referirse a otro archivo, utilice \include "otroarchivo.ly" @end example -La línea @code{\include "otroarchivo.ly"} equivale a pegar todo el -contenido de @file{otroarchivo.ly} en el archivo actual en el lugar en -que aparece el @code{\include}. Por ejemplo, en un proyecto grande -podríamos querer archivos distintos para cada parte instrumental y -crear un archivo de @qq{partitura completa} que reúne los archivos -individuales de los instrumentos. Normalmente el archivo incluido -define un cierto número de variables que a partir de entonces quedan -disponibles para poderlas utilizar en el archivo de la partitura -completa. En los archivos incluidos se pueden marcar las secciones -etiquetadas para ayudar a hacerlas utilizables en distintos lugares de -la partitura, véase @ref{Distintas ediciones a partir de una misma fuente}. - -Los archivos que están en el directorio de trabajo actual se pueden -referenciar simplemente especificando el nombre después de la -instrucción @code{\include}. Los archivos en otros lugares se pueden -incluir proporcionando una referencia de ruta completa o una ruta -relativa (pero utilice la barra inclinada normal del UNIX, /, no la -barra invertida de DOS/Windows, \, como separador de directorio). Por -ejemplo, si @file{material.ly} está situado un directorio por encima -del directorio de trabajo actual, utilice +La línea @code{\include "otroarchivo.ly"} equivale a pegar todo +el contenido de @file{otroarchivo.ly} en el archivo actual en el +lugar en que aparece el @code{\include}. Por ejemplo, en un +proyecto grande podríamos querer archivos distintos para cada +parte instrumental y crear un archivo de @qq{partitura completa} +que reúne los archivos individuales de los instrumentos. +Normalmente el archivo incluido define un cierto número de +variables que a partir de entonces quedan disponibles para +poderlas utilizar en el archivo de la partitura completa. En los +archivos incluidos se pueden marcar las secciones etiquetadas +para ayudar a hacerlas utilizables en distintos lugares de la +partitura, véase @ref{Distintas ediciones a partir de una misma +fuente}. + +Los archivos que están en el directorio de trabajo actual se +pueden referenciar simplemente especificando el nombre después de +la instrucción @code{\include}. Los archivos en otros lugares se +pueden incluir proporcionando una referencia de ruta completa o +una ruta relativa (pero utilice la barra inclinada normal del +UNIX, /, no la barra invertida de DOS/Windows, \, como separador +de directorio). Por ejemplo, si @file{material.ly} está situado +un directorio por encima del directorio de trabajo actual, +utilice @example \include "../material.ly" @@ -1992,32 +2139,35 @@ directorio actual, use @end example Los archivos de inclusión también pueden contener enunciados -@code{\include} a su vez. De forma predeterminada, estos enunciados -@code{\include} de segundo nivel no se interpretan hasta que se -incorporan al archivo principal, por lo que los nombres de archivo que -especifican deben ser relativos al directorio que contiene el archivo -principal, no al directorio que contiene el archivo incluido. Sin -embargo, este comportamiento se puede modificar globalmente pasando la -opción @option{-drelative-includes} en la línea de órdenes (o mediante +@code{\include} a su vez. De forma predeterminada, estos +enunciados @code{\include} de segundo nivel no se interpretan +hasta que se incorporan al archivo principal, por lo que los +nombres de archivo que especifican deben ser relativos al +directorio que contiene el archivo principal, no al directorio +que contiene el archivo incluido. Sin embargo, este +comportamiento se puede modificar globalmente pasando la opción +@option{-drelative-includes} en la línea de órdenes (o mediante la adición de @code{#(ly:set-option 'relative-includes #t)} al principio del archivo principal de entrada). -Cuando @code{relative-includes} está establecido al valor @code{#t}, -la ruta de cada instrucción @code{\include} se considera relativa al -archivo que contiene dicha instrucción. Este comportamiento es el -recomendado y se convertirá en el comportamiento predeterminado en una -versión futura de lilypond. - -Tanto los archivos relativos al directorio principal como los archivos -relativos a algún otro directorio se pueden @code{\include}ar mediante -el establecimiento de @code{relative-includes} al valor @code{#t} o a -@code{#f} en los lugares apropiados dentro de los archivos. Por -ejemplo, si se ha creado una biblioteca genérica, libA, que a su vez -utiliza sub-archivos que se @code{\include}an por medio del archivo de +Cuando @code{relative-includes} está establecido al valor +@code{#t}, la ruta de cada instrucción @code{\include} se +considera relativa al archivo que contiene dicha instrucción. +Este comportamiento es el recomendado y se convertirá en el +comportamiento predeterminado en una versión futura de lilypond. + +Tanto los archivos relativos al directorio principal como los +archivos relativos a algún otro directorio se pueden +@code{\include}ar mediante el establecimiento de +@code{relative-includes} al valor @code{#t} o a @code{#f} en los +lugares apropiados dentro de los archivos. Por ejemplo, si se ha +creado una biblioteca genérica, libA, que a su vez utiliza +sub-archivos que se @code{\include}an por medio del archivo de entrada de dicha biblioteca, esas instrucciones @code{\include} tendrán que venir precedidas por @code{#(ly:set-option -#relative-includes #t)} de manera que se interpreten correctamente al -construir el archivo de entrada @code{.ly} principal, de esta forma: +#relative-includes #t)} de manera que se interpreten +correctamente al construir el archivo de entrada @code{.ly} +principal, de esta forma: @example libA/ @@ -2049,13 +2199,14 @@ completa, simplemente con Se pueden usar estructuras de archivo más complejas instando los cambios en los lugares adecuados. -También se pueden incluir archivos de un directorio que está en una -ruta de búsqueda especificada como opción al invocar a LilyPond desde -la línea de órdenes. Los archivos incluidos se especifican usando -solamente su nombre de archivo. Por ejemplo, para compilar mediante -este método un archivo @file{principal.ly} que incluye archivos -situados en un subdirectorio llamado @file{partes}, cambie al -directorio que contiene @file{principal.ly} e introduzca +También se pueden incluir archivos de un directorio que está en +una ruta de búsqueda especificada como opción al invocar a +LilyPond desde la línea de órdenes. Los archivos incluidos se +especifican usando solamente su nombre de archivo. Por ejemplo, +para compilar mediante este método un archivo @file{principal.ly} +que incluye archivos situados en un subdirectorio llamado +@file{partes}, cambie al directorio que contiene +@file{principal.ly} e introduzca @example lilypond --include=partes principal.ly @@ -2069,27 +2220,27 @@ y en @file{principal.ly} escriba @dots{} etc. @end example -Los archivos que se incluyen en muchas partituras se pueden poner en -el directorio de LilyPond @file{../ly} (la localización de este -directorio depende de la instalación: véase -@rlearning{Otras fuentes de información}). Estos archivos se pueden -incluir sencillamente por su nombre en un enunciado @code{\include}. -De esta forma se incluyen los archivos dependientes del idioma como +Los archivos que se incluyen en muchas partituras se pueden poner +en el directorio de LilyPond @file{../ly} (la localización de +este directorio depende de la instalación: véase @rlearning{Otras +fuentes de información}). Estos archivos se pueden incluir +sencillamente por su nombre en un enunciado @code{\include}. De +esta forma se incluyen los archivos dependientes del idioma como @file{espanol.ly}. -LilyPond incluye de forma predeterminada ciertos archivos cuando se -inicia el programa. Estas inclusiones no son visibles para el +LilyPond incluye de forma predeterminada ciertos archivos cuando +se inicia el programa. Estas inclusiones no son visibles para el usuario, pero los archivos se pueden identificar ejecutando -@code{lilypond --verbose} desde la línea de órdenes. Esto presentará -una lista de rutas y archivos que utiliza LilyPond, junto a muchas -otras indicaciones. De forma alternativa, pueden verse explicaciones -sobre los archivos más importantes de este conjunto en -@rlearning{Otras fuentes de información}. Estos archivos se pueden -editar, pero los cambios realizados sobre ellos se perderán al -instalar una nueva versión de LilyPond. - -Pueden verse ejemplos sencillos sobre el uso de @code{\include} en -@rlearning{Partituras y particellas}. +@code{lilypond --verbose} desde la línea de órdenes. Esto +presentará una lista de rutas y archivos que utiliza LilyPond, +junto a muchas otras indicaciones. De forma alternativa, pueden +verse explicaciones sobre los archivos más importantes de este +conjunto en @rlearning{Otras fuentes de información}. Estos +archivos se pueden editar, pero los cambios realizados sobre +ellos se perderán al instalar una nueva versión de LilyPond. + +Pueden verse ejemplos sencillos sobre el uso de @code{\include} +en @rlearning{Partituras y particellas}. @seealso Manual de aprendizaje: @@ -2098,25 +2249,25 @@ Manual de aprendizaje: @knownissues Si un archivo incluido recibe un nombre igual al de uno de los -archivos de instalación de LilyPond, el archivo que tiene prioridad es -el de los archivos de instalación de LilyPond. +archivos de instalación de LilyPond, el archivo que tiene +prioridad es el de los archivos de instalación de LilyPond. @node Distintas ediciones a partir de una misma fuente @subsection Distintas ediciones a partir de una misma fuente @translationof Different editions from one source -Se pueden usar varios métodos para generar la producción de distintas -versiones de una partitura a partir de la misma fuente musical. Las -variables son quizá el más útil para combinar secciones extensas de -música y/o anotaciones. Las etiquetas son más útiles para seleccionar -una sección de entre varias secciones de música alternativas, más -cortas, y se pueden usar también para dividir piezas de música en -distintos trozos. +Se pueden usar varios métodos para generar la producción de +distintas versiones de una partitura a partir de la misma fuente +musical. Las variables son quizá el más útil para combinar +secciones extensas de música y/o anotaciones. Las etiquetas son +más útiles para seleccionar una sección de entre varias secciones +de música alternativas, más cortas, y se pueden usar también para +dividir piezas de música en distintos trozos. -Cualquiera que sea el método utilizado, la separación de la notación -de la estructura de la partitura hará que sea más fácil cambiar la -estructura dejando intacta la notación. +Cualquiera que sea el método utilizado, la separación de la +notación de la estructura de la partitura hará que sea más fácil +cambiar la estructura dejando intacta la notación. @menu * Uso de las variables:: @@ -2132,19 +2283,20 @@ estructura dejando intacta la notación. Si las secciones de la música se definen dentro de variables, se pueden reutilizar en distintas partes de la partitura, véase -@rlearning{Organizar las piezas mediante variables}. Por ejemplo, una -partitura vocal @notation{a cappella} con frecuencia incluye una -reducción de piano de las partes para ensayar que es idéntica a la -música vocal, por lo que ésta sólo se tiene que escribir una vez. Se -puede combinar sobre un solo pentagrama la música de dos variables, -véase @ref{Combinación automática de las partes}. He aquí un ejemplo: +@rlearning{Organizar las piezas mediante variables}. Por +ejemplo, una partitura vocal @notation{a cappella} con frecuencia +incluye una reducción de piano de las partes para ensayar que es +idéntica a la música vocal, por lo que ésta sólo se tiene que +escribir una vez. Se puede combinar sobre un solo pentagrama la +música de dos variables, véase @ref{Combinación automática de las +partes}. He aquí un ejemplo: @lilypond[verbatim,quote] -sopranoMusic = \relative c'' { a4 b c b8( a) } -altoMusic = \relative g' { e4 e e f } -tenorMusic = \relative c' { c4 b e d8( c) } -bassMusic = \relative c' { a4 gis a d, } -allLyrics = \lyricmode {King of glo -- ry } +sopranoMusic = \relative { a'4 b c b8( a) } +altoMusic = \relative { e'4 e e f } +tenorMusic = \relative { c'4 b e d8( c) } +bassMusic = \relative { a4 gis a d, } +allLyrics = \lyricmode { King of glo -- ry } << \new Staff = "Soprano" \sopranoMusic \new Lyrics \allLyrics @@ -2162,28 +2314,23 @@ allLyrics = \lyricmode {King of glo -- ry } \new Lyrics \allLyrics \new PianoStaff << \new Staff = "RH" { - \set Staff.printPartCombineTexts = ##f - \partcombine - \sopranoMusic - \altoMusic + \partcombine \sopranoMusic \altoMusic } \new Staff = "LH" { - \set Staff.printPartCombineTexts = ##f \clef "bass" - \partcombine - \tenorMusic - \bassMusic + \partcombine \tenorMusic \bassMusic } >> >> @end lilypond -Se pueden producir partituras distintas que presenten sólo las partes -vocales o sólo la parte de piano, cambiando solamente los enunciados -estructurales, sin modificar la notación musical. +Se pueden producir partituras distintas que presenten sólo las +partes vocales o sólo la parte de piano, cambiando solamente los +enunciados estructurales, sin modificar la notación musical. -Para partituras extensas, las definiciones de variable se pueden poner -en archivos separados que se incluyen más tarde, véase @ref{Inclusión de archivos de LilyPond}. +Para partituras extensas, las definiciones de variable se pueden +poner en archivos separados que se incluyen más tarde, véase +@ref{Inclusión de archivos de LilyPond}. @node Uso de etiquetas @@ -2193,19 +2340,16 @@ en archivos separados que se incluyen más tarde, véase @ref{Inclusión de arch @funindex \tag @funindex \keepWithTag @funindex \removeWithTag -@funindex \pushToTag -@funindex \appendToTag @cindex etiqueta @cindex mantener música etiquetada @cindex quitar música etiquetada -@cindex división en música etiquetada -La instrucción @code{\tag #'@var{parteA}} marca una expresión musical -con el nombre @var{parteA}. Las expresiones etiquetadas de esta -manera se pueden seleccionar o filtrar más tarde por su nombre, usando -bien @code{\keepWithTag #'@var{nombre}} o bien @code{\removeWithTag -#'@var{nombre}}. El resultado de la aplicación de estos filtros a la -música etiquetada es como sigue: +La instrucción @code{\tag #'@var{parteA}} marca una expresión +musical con el nombre @var{parteA}. Las expresiones etiquetadas +de esta manera se pueden seleccionar o filtrar más tarde por su +nombre, usando bien @code{\keepWithTag #'@var{nombre}} o bien +@code{\removeWithTag #'@var{nombre}}. El resultado de la +aplicación de estos filtros a la música etiquetada es como sigue: @multitable @columnfractions .5 .5 @headitem Filtro @@ -2217,8 +2361,8 @@ o de @code{\keepWithTag #'(@var{nombre1} @var{nombre2}@dots{})} el nombre o nombres de etiqueta dados; se excluye la música etiquetada con cualquier otro nombre de etiqueta. @item -Música etiquetada precedida de -@code{\removeWithTag #'@var{nombre}} o +Música etiquetada precedida de +@code{\removeWithTag #'@var{nombre}} o @code{\removeWithTag #'(@var{nombre1} @var{nombre2}@dots{})} @tab Se incluye la música no etiquetada y la música que no está @@ -2230,17 +2374,26 @@ Música etiquetada no precedida de @code{\keepWithTag} ni de @tab Se incluye toda la música etiquetada y no etiquetada. @end multitable -Los argumentos de las instrucciones @code{\tag}, @code{\keepWithTag} y -@code{\removeWithTag} deben ser un símbolo (como @code{#'partitura} o -@code{#'parte}), seguido de una expresión musical. - -En el ejemplo siguiente vemos dos versiones de una pieza musical, una -que muestra trinos con la notación usual y otra con los trinos -expandidos explícitamente: +Los argumentos de las instrucciones @code{\tag}, +@code{\keepWithTag} y @code{\removeWithTag} deben ser un símbolo +o lista de símbolos (como @code{#'score} o @code{#'(violinI +violinII}), seguida de una expresión musical. Si @emph{y solo +si} los símbolos son identificadores de LilyPond válidos +(caracteres alfabéticos solamente, sin números, guiones bajos ni +guiones normales) que no puedan confundirse con notas, la porción +@code{#'} se puede omitir y, como abreviatura, una lista de +símbolos puede usar el separador de punto, es decir: @code{\tag +#'(violinI violinII)} se puede escribir como @code{\tag +violinI.violinII}. Lo mismo vale para @code{\keepWithTag} y +@code{\removeWithTag}. + +En el ejemplo siguiente vemos dos versiones de una pieza musical, +una que muestra trinos con la notación usual y otra con los +trinos expandidos explícitamente: @lilypond[verbatim,quote] -music = \relative g' { - g8. c32 d +music = \relative { + g'8. c32 d \tag #'trills { d8.\trill } \tag #'expand { \repeat unfold 3 { e32 d } } c32 d @@ -2258,8 +2411,8 @@ music = \relative g' { De forma alternativa, a veces es más fácil excluir secciones de música: @lilypond[verbatim,quote] -music = \relative g' { - g8. c32 d +music = \relative { + g'8. c32 d \tag #'trills { d8.\trill } \tag #'expand {\repeat unfold 3 { e32 d } } c32 d @@ -2291,8 +2444,9 @@ c1-\tag #'finger ^4 c1-\tag #'warn ^"¡Ojo!" @end example -Se pueden poner varias etiquetas sobre expresiones con varias entradas -de @code{\tag}, o combinando varias etiquetas en una lista de símbolos: +Se pueden poner varias etiquetas sobre expresiones con varias +entradas de @code{\tag}, o combinando varias etiquetas en una +lista de símbolos: @lilypond[quote,verbatim] music = \relative c'' { @@ -2327,41 +2481,108 @@ music = \relative c'' { } @end lilypond -Dos o más filtros @code{\keepWithTag} aplicados a una sola -expresión musical producen la eliminación de @emph{todas} las -secciones etiquetadas, porque el primer filtro quita todas las -secciones etiquetadas excepto la que se nombra, y el segundo -filtro elimina incluso esa sección etiquetada. Por lo general, -querrá usar una sola instrucción @code{\keepWithTag} con una lista -de varias etiquetas: de esta forma solamente se suprimirán las -secciones etiquetadas que no aparezcan en @emph{ninguna} de las -etiquetas. +El uso de dos o más filtros @code{\keepWithTag} sobre una sola +expresión musical produce la eliminación de @emph{todas} las +secciones etiquetadas. El primer filtro quita todas excepto +la que se nombra, y cualquier filtro posterior +elimina el resto. +Usando una sola instrucción @code{\keepWithTag} con una +lista de varias etiquetas se suprimirán solamente +las secciones etiquetadas que no aparezcan especificadas en la lista. + +@lilypond[verbatim,quote] +music = \relative c'' { + \tag #'violinI { a4 a a a } + \tag #'violinII { b4 b b b } + \tag #'viola { c4 c c c } + \tag #'cello { d4 d d d } +} + +\new Staff { + \keepWithTag #'(violinI violinII) + \music +} +@end lilypond + +@noindent +will print @code{\tag}s @var{violinI} and @var{violinII} but not +@var{viola} or @var{cello}. + +@cindex grupos de etiquetas +@funindex \tagGroup +Aunque @code{\keepWithTag} es útil para el manejo de @emph{un +solo} conjunto de alternativas, la eliminación de música +etiquetada con otras etiquetas @emph{no relacionadas} es +problemática si se utilizan para más de un propósito. +En ese caso pueden declararse @q{grupos de etiquetas}: + +@example +\tagGroup #'(violinI violinII viola cello) +@end example + +@noindent +Ahora todas las etiquetas pertenecen a un solo @q{grupo de etiquetas}. +Observe que las etiquetas individuales no pueden ser miembros +de más de un @emph{grupo de etiquetas}. + +@example +\keepWithTag #'violinI @dots{} +@end example + +@noindent +mostrará solamente la música etiquetada a partir del +grupo de etiquetas de @code{violinI} y +cualquier fragmento musical etiquetado con una de las +@emph{otras} etiquetas resultará suprimido. + +@lilypond[verbatim,quote] +music = \relative { + \tagGroup #'(violinI violinII viola cello) + \tag #'violinI { c''4^"violinI" c c c } + \tag #'violinII { a2 a } + \tag #'viola { e8 e e2. } + \tag #'cello { d'2 d4 d } + R1^"untagged" +} + +\new Voice { + \keepWithTag #'violinI + \music +} +@end lilypond + +Al usar la instrucción @code{\keepWithTag} solo son visibles +las etiquetas de los grupos de aquellas etiquetas se se incluyen +en la instrucción. + +@funindex \pushToTag +@funindex \appendToTag +@cindex dividir en música etiquetada A veces podemos desear dividir la música en un determinado lugar dentro de una expresión musical existente. Podemos usar @code{\pushToTag} y @code{\appendToTag} para añadir material delante o al final de los @code{elements} de una construcción musical existente. No toda construcción musical tiene la parte -@code{elements}, pero las músicas secuenciaes y simultáneas son +@code{elements}, pero las músicas secuenciales y simultáneas son dos apuestas seguras: @lilypond[verbatim,quote] -test = { \tag #'here { \tag #'here <> } } +music = { \tag #'here { \tag #'here <> } } { \pushToTag #'here c' \pushToTag #'here e' - \pushToTag #'here g' \test + \pushToTag #'here g' \music \appendToTag #'here c' \appendToTag #'here e' - \appendToTag #'here g' \test + \appendToTag #'here g' \music } @end lilypond -Las dos instrucciones admiten una etiqueta, el material que dividir en -cada ocurrencia de la etiqueta, y la expresión etiquetada. Las -instrucciones aseguran que se copia todo lo que cambian, de forma que -el código original @code{\test} retiene su significado. +Las dos instrucciones admiten una etiqueta, el material que +dividir en cada ocurrencia de la etiqueta, y la expresión +etiquetada. @seealso Manual de aprendizaje: @@ -2376,11 +2597,12 @@ Al llamar a @code{\relative} sobre una expresión musical obtenida mediante el filtrado de música con las instrucciones @code{\keepWithTag} o @code{\removeWithTag}, podría ocurrir que cambiaran las relaciones de octava, dado que solo se tendrán en -cuenta las alturas de las notas que efectivamente permanecen en la -expresión filtrada. La aplicación de @code{\relative} en primer -lugar, antes de @code{\keepWithTag} o de @code{\removeWithTag}, -evita este peligro porque en este caso @code{\relative} actúa -sobre todas las notas tal y como se introducen. +cuenta las alturas de las notas que efectivamente permanecen en +la expresión filtrada. La aplicación de @code{\relative} en +primer lugar, antes de @code{\keepWithTag} o de +@code{\removeWithTag}, evita este peligro porque en este caso +@code{\relative} actúa sobre todas las notas tal y como se +introducen. @node Uso de ajustes globales @@ -2389,15 +2611,16 @@ sobre todas las notas tal y como se introducen. @cindex include-settings -Se pueden incluir ajustes globales a partir de un archivo distinto: +Se pueden incluir ajustes globales a partir de un archivo +distinto: @example lilypond -dinclude-settings=MIS_AJUSTES.ly MI_PARTITURA.ly @end example -En archivos diferentes se pueden almacenar grupos de ajustes como +En archivos diferentes se pueden almacenar grupos de ajustes como el tamaño de la página o las fuentes tipográficas. Ello permite -hacer diferentes ediciones de la mism a partitura así como aplicar +hacer diferentes ediciones de la misma partitura así como aplicar ajustes estándar a muchas partituras, simplemente por medio de la especificación del archivo de ajustes adecuado. @@ -2434,38 +2657,41 @@ Referencia de la notación: @cindex UTF-8 LilyPond usa el conjunto de caracteres definido por el consorcio -Unicode y la norma ISO/IEC 10646. Define un nombre único y un código -para los conjuntos de caracteres que se utilizan en prácticamente -todos los idiomas modernos y también en muchos otros. Unicode se -puede implementar utilizando varios esquemas de codificación -distintos. LilyPond usa la codificación UTF-8 (UTF son las siglas de -@emph{Unicode Transformation Format}, o formato de transformación de -Unicode) que representa todos los caracteres comunes de Latin en un -solo byte, y representa otros caracteres usando un formato de longitud +Unicode y la norma ISO/IEC 10646. Define un nombre único y un +código para los conjuntos de caracteres que se utilizan en +prácticamente todos los idiomas modernos y también en muchos +otros. Unicode se puede implementar utilizando varios esquemas +de codificación distintos. LilyPond usa la codificación UTF-8 +(UTF son las siglas de @emph{Unicode Transformation Format}, o +formato de transformación de Unicode) que representa todos los +caracteres comunes de la codificación Latin en un solo byte, y +representa otros caracteres usando un formato de longitud variable de hasta cuatro bytes. -El aspecto visual real de los caracteres viene determinado por los -glifos que se definen en las fuentes tipográficas concretas que se -tengan disponibles: una fuente tipográfica define la asignación de un -subconjunto de los códigos de Unicode a glifos. LilyPond usa la -biblioteca Pango para representar y disponer tipográficamente textos -multilingües. +El aspecto visual real de los caracteres viene determinado por +los glifos que se definen en las fuentes tipográficas concretas +que se tengan disponibles: una fuente tipográfica define la +asignación de un subconjunto de los códigos de Unicode a glifos. +LilyPond usa la biblioteca Pango para representar y disponer +tipográficamente textos multilingües. LilyPond no realiza ninguna conversión en la codificación de la entrada. Esto significa que cualquier text, ya sea el título, la -letra de la canción o una instrucción musical que contenga caracteres -distintos a los del conjunto ASCII, se deben codificar en UTF-8. La -forma más fácil de escribir dicho texto es utilizar un editor -preparado para Unicode y guardar el archivo con la codificación UTF-8. -Casi todos los editores modernos populares contemplan el UTF-8, por -ejemplo lo hacen vim, Emacs, jEdit, y GEdit. Todos los sistemas MS -Windows posteriores a NT usan Unicode como codificación de caracteres -nativa, de manera que incluso el accesorio Bloc de Notas (Notepad) -puede editar y guardar un archivo en el formato UTF-8. Una -alternativa más funcional para Windows es BabelPad. - -Si un archivo de entrada que contiene un carácter que no es ASCII, no -se guarda en el formato UTF-8, se genera el mensaje de error +letra de la canción o una instrucción musical que contenga +caracteres distintos a los del conjunto ASCII, se deben codificar +en UTF-8. La forma más fácil de escribir dicho texto es utilizar +un editor preparado para Unicode y guardar el archivo con la +codificación UTF-8. Casi todos los editores modernos populares +contemplan el UTF-8, por ejemplo lo hacen vim, Emacs, jEdit y +Gedit. Todos los sistemas MS Windows posteriores a NT usan +Unicode como codificación de caracteres nativa, de manera que +incluso el accesorio Bloc de Notas (Notepad) puede editar y +guardar un archivo en el formato UTF-8. Una alternativa más +funcional para Windows es BabelPad. + +Si un archivo de entrada que contiene un carácter que no es +ASCII, no se guarda en el formato UTF-8, se genera el mensaje de +error @example FT_Get_Glyph_Name () error: argumento inválido @@ -2473,8 +2699,20 @@ FT_Get_Glyph_Name () error: argumento inválido He aquí un ejemplo que muestra texto cirílico, hebreo y portugués: +@c NOTE: No verbatim in the following example as the code does not +@c display correctly in PDF Font settings for Cyrillic and Hebrew + @lilypond[quote] -%c No verbatim here as the code does not display correctly in PDF +% Linux Libertine fonts contain Cyrillic and Hebrew glyphs. +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + #:sans "Linux Biolinum O,sans-serif" + #:typewriter "Linux Libertine Mono O,monospace" + )) +} + % Cyrillic bulgarian = \lyricmode { Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон. @@ -2490,8 +2728,8 @@ portuguese = \lyricmode { à vo -- cê uma can -- ção legal } -\relative c' { - c2 d e f g f e +\relative { + c'2 d e f g f e } \addlyrics { \bulgarian } \addlyrics { \hebrew } @@ -2505,45 +2743,46 @@ portuguese = \lyricmode { @cindex Unicode -Para introducir un carácter aislado para el que se conoce el punto de -código Unicode pero no está disponible en el editor que se está -usando, use @code{\char ##xhhhh} o bien @code{\char #dddd} dentro de -un bloque @code{\markup}, donde @code{hhhh} es el código hexadecimal -del carácter en cuestión y @code{dddd} es su valor decimal -correspondiente. Pueden omitirse los ceros iniciales, pero es -costumbre indicar los cuatro caracteres en la representación -hexadecimal (observe que @emph{no} debe utilizarse la codificación -UTF-8 del punto de código Unicode después de @code{\char}, pues la -codificación UTF-8 contiene bits adicionales que indican el número de -octetos). Hay tablas de códigos Unicode y un índice de nombres de -caracteres que da el punto de código en hexadecimal para cualquier -carácter en el portal del Consorcio Unicode, -@uref{http://www.unicode.org/}. +Para introducir un carácter aislado para el que se conoce el +punto de código Unicode pero no está disponible en el editor que +se está usando, use @code{\char ##xhhhh} o bien @code{\char +#dddd} dentro de un bloque @code{\markup}, donde @code{hhhh} es +el código hexadecimal del carácter en cuestión y @code{dddd} es +su valor decimal correspondiente. Pueden omitirse los ceros +iniciales, pero es costumbre indicar los cuatro caracteres en la +representación hexadecimal (observe que @emph{no} debe utilizarse +la codificación UTF-8 del punto de código Unicode después de +@code{\char}, pues la codificación UTF-8 contiene bits +adicionales que indican el número de octetos). Hay tablas de +códigos Unicode y un índice de nombres de caracteres que da el +punto de código en hexadecimal para cualquier carácter en el +portal del Consorcio Unicode, @uref{http://www.unicode.org/}. Por ejemplo, tanto @code{\char ##x03BE} como @code{\char #958} insertan el carácter Unicode U+03BE, que tiene el nombre Unicode @qq{Letra griega Xi pequeña}. -Se puede escribir de esta forma cualquier punto de código Unicode, y -si todos los caracteres especiales se escriben en este formato no es -necesario guardar el archivo de entrada en formato UTF-8. Por -supuesto, debe estar instalada y estar disponible para LilyPond una -fuente tipográfica que contenga codificados todos estos caracteres. +Se puede escribir de esta forma cualquier punto de código +Unicode, y si todos los caracteres especiales se escriben en este +formato no es necesario guardar el archivo de entrada en formato +UTF-8. Por supuesto, debe estar instalada y estar disponible +para LilyPond una fuente tipográfica que contenga codificados +todos estos caracteres. -El ejemplo siguiente muestra valores hexadecimales Unicode que se usan -en cuatro lugares: en una llamada de ensayo, como texto de +El ejemplo siguiente muestra valores hexadecimales Unicode que se +usan en cuatro lugares: en una llamada de ensayo, como texto de articulación, en la letra y como texto independiente bajo la partitura: @lilypond[quote,verbatim] \score { - \relative c'' { - c1 \mark \markup { \char ##x03EE } + \relative { + c''1 \mark \markup { \char ##x03EE } c1_\markup { \tiny { \char ##x03B1 " to " \char ##x03C9 } } } \addlyrics { O \markup { \concat { Ph \char ##x0153 be! } } } } -\markup { "Copyright 2008--2012" \char ##x00A9 } +\markup { "Copyright 2008--2015" \char ##x00A9 } @end lilypond @cindex copyright, símbolo de @@ -2585,7 +2824,7 @@ especiales: } @end lilypond -También podemos hacer nuestros propios alias, ya sea de forma global: +También podemos hacer nuestros propios alias, ya sea de forma global, @lilypond[quote,verbatim] \paper { @@ -2622,44 +2861,57 @@ Archivos instalados: * Sustituir la tipografía de la notación:: @end menu +@funindex clip-regions +@cindex fragmentos de música +@cindex música, fragmentos @node Extracción de fragmentos de música @subsection Extracción de fragmentos de música @translationof Extracting fragments of music -Es posible citar pequeños fragmentos de una partitura grande -directamente a partir de la salida. Puede compararse con la -separación de una pieza de una partitura, recortándola con tijeras. +Es posible producir en la salida uno o más fragmentos de una +partitura mediante la definición de la situación explícita de la +música que se quiere extraer dentro del bloque @code{\layout} del +archivo de entrada, utilizando la función @code{clip-regions}, y +a continuación ejecutando LilyPond con la opción +@option{-dclip-systems}. -Esto se hace definiendo los compases que se deben recortar. Por -ejemplo, la inclusión de la siguiente definición - -@verbatim -\layout { +@example +\layout @{ clip-regions = #(list (cons (make-rhythmic-location 5 1 2) (make-rhythmic-location 7 3 4))) -} -@end verbatim +@} +@end example @noindent -extrae un fragmento empezando por la mitad del quinto compás y -finalizando en el séptimo compás. El significado de @code{5 1 2} es: -después de una blanca (1/2) en el compás 5, y el de @code{7 3 4} -después de tres negras del compás 7. +Este ejemplo extrae un solo fragmento del archivo de entrada +@emph{comenzando} después de la duración de una blanca en el +quinto compás (@code{5 1 2}) y @emph{terminando} después de la +tercera negra del compás séptimo (@code{7 3 4}). + +Se pueden extraer fragmentos adicionales añadiendo más pares de +entradas de @code{make-rhythmic-location} a la lista +@code{clip-regions} dentro del bloque @code{\layout}. + +De forma predeterminada, cada fragmento de música se obtendrá en +la salida como un archivo @code{EPS} distinto, pero también se +pueden crear otros formatos como @code{PDF} o @code{PNG} si es +necesario. La música extraída se obtiene en la salida como si +hubiera sido literalmente @q{cortada} de la partitura original +impresa, de forma que si un fragmento se extiende sobre una o más +líneas, se genera un archivo de salida distinto por cada línea +generada. -Se pueden definir más zonas de recorte añadiendo más parejas de -definición de tiempo rhythmic-location a la lista. +@seealso +Referencia de la notación: +@ref{El bloque layout}. -Para poder utilizar esta funcionalidad, LilyPond se debe invocar con -la opción @option{-dclip-systems}. Los recortes aparecen en la salida -como archivos EPS, y se convierten en PDF y PNG si estos formatos -también están activados. +Manual de utilización: +@rprogram{Utilización desde la línea de órdenes}. -Para ver más información sobre los formatos de salida, consulte -@rprogram{Invocar a LilyPond}. @node Saltar la música corregida @@ -2670,11 +2922,11 @@ Para ver más información sobre los formatos de salida, consulte @funindex showFirstLength @funindex showLastLength -Al escribir o copiar música, normalmente sólo es interesante de ver y -corregir la música cercana al final (donde estamos añadiendo las -notas). Para acelerar este proceso de corrección, es posible saltar -la composición tipográfica de todos excepto unos pocos de los últimos -compases. Esto se consigue poniendo +Al escribir o copiar música, normalmente sólo es interesante de +ver y corregir la música cercana al final (donde estamos +añadiendo las notas). Para acelerar este proceso de corrección, +es posible saltar la composición tipográfica de todos excepto +unos pocos de los últimos compases. Esto se consigue poniendo @example showLastLength = R1*5 @@ -2682,34 +2934,39 @@ showLastLength = R1*5 @end example @noindent -en nuestro archivo fuente. Esto hará que se tracen sólo los últimos -cinco compases (suponiendo un compás de 4/4) de cada una de las -partituras @code{\score} del archivo de entrada. Para piezas largas, -el tipografiado de únicamente una parte pequeña es con frecuencia un -orden de magnitud más rápido que el de la obra completa. Si estamos -trabajando sobre el principio de una partitura que ya hemos -tipografiado (p.ej., para añadir una parte instrumental nueva), -también puede ser útil la propiedad @code{showFirstLength}. +en nuestro archivo fuente. Esto hará que se tracen sólo los +últimos cinco compases (suponiendo un compás de 4/4) de cada una +de las partituras @code{\score} del archivo de entrada. Para +piezas largas, el tipografiado de únicamente una parte pequeña es +con frecuencia un orden de magnitud más rápido que el de la obra +completa. Si estamos trabajando sobre el principio de una +partitura que ya hemos tipografiado (p.ej., para añadir una parte +instrumental nueva), también puede ser útil la propiedad +@code{showFirstLength}. Este mecanismo de pasar por alto partes de un partitura se puede controlar con un grano más fino mediante la propiedad -@code{Score.skipTypesetting}. Cuando su valor está establecido, no se -lleva a cabo ningún tipografiado en absoluto. - -Esta propiedad se usa también para controlar la salida al archivo -MIDI. Observe que pasa por alto todos los eventos, incluidos el tempo -y los cambios de instrumento. Está usted advertido. - -@lilypond[quote,relative=2,ragged-right,verbatim] -c8 d -\set Score.skipTypesetting = ##t -e8 e e e e e e e -\set Score.skipTypesetting = ##f -c8 d b bes a g c2 +@code{Score.skipTypesetting}. Cuando su valor está establecido, +no se lleva a cabo ningún tipografiado en absoluto. + +Esta propiedad se usa también para controlar la salida hacia el +archivo MIDI. Observe que pasa por alto todos los eventos, +incluidos el tempo y los cambios de instrumento. Está usted +advertido. + +@lilypond[quote,ragged-right,verbatim] +\relative c' { + c1 + \set Score.skipTypesetting = ##t + \tempo 4 = 80 + c4 c c c + \set Score.skipTypesetting = ##f + d4 d d d +} @end lilypond -En música polifónica, @code{Score.skipTypesetting} afecta a todas las -voces y pentagramas, ahorrando más tiempo incluso. +En música polifónica, @code{Score.skipTypesetting} afecta a todas +las voces y pentagramas, ahorrando más tiempo incluso. @node Formatos de salida alternativos @@ -2722,11 +2979,12 @@ voces y pentagramas, ahorrando más tiempo incluso. @cindex EPS, salida @cindex PostScript encapsulado, salida de -Los formatos de salida predeterminados para la partitura impresa son -el formato de documento portátil (PDF) y PostScript (PS). Los -formatos de salida Gráficos de vector escalables (SVG), PostScript -encapsulado (EPS) y Gráficos de red portátiles (PNG) también están -disponibles a través de opciones de la línea de órdenes, véase +Los formatos de salida predeterminados para la partitura impresa +son el formato de documento portátil (PDF) y PostScript (PS). +Los formatos de salida Gráficos de red portátiles (PNG), +Gráficos de vector escalables (SVG) y PostScript encapsulado (EPS) +también están disponibles a través de opciones de la línea de +órdenes, véase @rprogram{Opciones básicas de la línea de órdenes para LilyPond}. @@ -2734,8 +2992,8 @@ disponibles a través de opciones de la línea de órdenes, véase @subsection Sustituir la tipografía de la notación @translationof Replacing the notation font -Gonville es una alternativa a la tipografía Feta que se utiliza en -LilyPond y se puede descargar de: +Gonville es una alternativa a la tipografía Feta que se utiliza +en LilyPond y se puede descargar de: @example @uref{http://www.chiark.greenend.org.uk/~sgtatham/gonville/ ,http://www.chiark.greenend.org.uk/~sgtatham/gonville/} @end example @@ -2747,678 +3005,810 @@ fuente Gonville: @c for the font comparison. -gp @sourceimage{Gonville_after,15cm,,} -Aquí hay unos compases de muestra tipografiados en la fuente Feta de -LilyPond: +Aquí hay unos compases de muestra tipografiados en la fuente Feta +de LilyPond: @sourceimage{Gonville_before,15cm,,} @subsubheading Instrucciones de instalación para MacOS -Descargue y extraiga el archivo zip. Copie la carpeta @code{lilyfonts} -a @file{@var{SHARE_DIR}/lilypond/current}; para más información, -consulte @rlearning{Otras fuentes de información}. Renombre la carpeta -@code{fonts} existente a @code{fonts_orig} y la carpeta -@code{lilyfonts} a @code{fonts}. Para volver a la fuente Feta, -invierta el proceso. +Descargue y extraiga el archivo zip. Copie la carpeta +@code{lilyfonts} a @file{@var{SHARE_DIR}/lilypond/current}; para +más información, consulte @rlearning{Otras fuentes de +información}. Renombre la carpeta @code{fonts} existente a +@code{fonts_orig} y la carpeta @code{lilyfonts} a @code{fonts}. +Para volver a la fuente Feta, invierta el proceso. @seealso Manual de aprendizaje: @rlearning{Otras fuentes de información}. @knownissues - Gonville no se puede usar para tipografiar notación de @q{Música Antigua} y es probable que cualquier nuevo glifo en versiones -posteriores de LilyPond no existan en la familia -tipográfica Gonville. Diríjase a la página web del autor para obtener más +posteriores de LilyPond no existan en la familia tipográfica +Gonville. Diríjase a la página web del autor para obtener más información sobre éste y otros asuntos, entre ellos el régimen de licencias de Gonville. -@node Salida MIDI -@section Salida MIDI -@translationof MIDI output +@node Creación de salida MIDI +@section Creación de salida MIDI +@translationof Creating MIDI output @cindex sonido @cindex MIDI -El MIDI (Musical Instrument Digital Interface, Interfase Digital para -Instrumentos Musicales) es un estándar para interconectar y controlar -instrumentos musicales electrónicos. Un archivo o secuencia MIDI es -una serie de notas dentro de un conjunto de pistas. No es un archivo -de sonidos reales; se necesita un programa reproductor especial para -traducir la serie de notas en sonidos de verdad. - -Cualquier música se puede convertir a archivos MIDI, de manera que -podamos escuchar lo que hayamos introducido. Esto es muy conveniente -para comprobar la corrección de la música; las octavas equivocadas o -las alteraciones erróneas se ponen de relieve muy claramente al -escuchar la salida MIDI. - -La salida estándar de MIDI es un poco primitiva; de forma opcional, se -encuentra disponible una salida MIDI mejorada y mucho más realista, -por medio de @ref{El script Articulate}. +LilyPond puede producir archivos que siguen el estándar MIDI +(Musical Instrument Digital Interface; interfaz digital para +instrumentos musicales) y permitir así comprobar la música por el +oído (con la ayuda de alguna aplicación o dispositivo que +entienda el MIDI). La escucha de la salida MIDI también puede +ser de ayuda en la localización de errores tales como notas que +se han introducido incorrectamente, alteraciones omitidas y otros +casos por el estilo. -La salida MIDI reserva un canal por cada pentagrama, y reserva -el canal 10 para la percusión. Sólo hay 16 canales MIDI por cada -dispositivo, por lo que si la partitura tiene más de 15 pautas, los -canales MIDI se reutilizarán. +Los archivos MIDI no contienen sonido (como los archivos AAC, MP3 +o Vorbis) pero requieren software adicional para producir el +sonido a partir de ellos. @menu -* Crear archivos MIDI:: -* Instrumentos MIDI:: -* ¿Qué sale por el MIDI?:: -* Repeticiones y MIDI:: -* Control de los matices en el MIDI:: -* Percusión en MIDI:: +* Notación contemplada por el MIDI:: +* Notación no contemplada en el MIDI:: +* El bloque MIDI:: +* Control de las dinámicas del MIDI:: +* Uso de los instrumentos MIDI:: +* Uso de las repeticiones con el MIDI:: +* Asignación de canales MIDI:: +* Propiedades de contexto para efectos MIDI:: +* Enriquecimiento de la salida MIDI:: * El script Articulate:: @end menu -@node Crear archivos MIDI -@subsection Crear archivos MIDI -@translationof Creating MIDI files +@cindex MIDI, notación contemplada -@cindex MIDI, bloque -Para crear un MIDI a partir de un archivo de LilyPond, inserte un -bloque @code{\midi} dentro de un bloque @code{\score}; +@node Notación contemplada por el MIDI +@subsection Notación contemplada por el MIDI +@translationof Supported notation for MIDI + +Se puede usar la notación musical siguiente con las posibilidades +predeterminadas de LilyPond para producir salida MIDI: + +@itemize +@item Marcas de respiración +@item Acordes introducidos como nombres de acorde +@item Crescendos y decrescendos sobre más de una nota. El volumen se altera de forma lineal entre los dos extremos +@item Indicadores dinámicos desde @code{ppppp} hasta @code{fffff}, incluyendo @code{mp}, @code{mf} y @code{sf} +@item Microtonos, pero @emph{no} acordes microtonales. Se necesita también un reproductor de MIDI capaz de ejecutar eventos de rueda de tono. +@item Letra de las canciones +@item Altura de las notas +@item Ritmo introducido como duraciones de las notas, incluidos los grupos de valoración especial como los tresillos +@item Articulaciones @q{sencillas}; picado, staccato, acento, marcato y portato +@item Cambios de tempo introducidos con la función @code{\tempo} +@item Ligaduras de unión +@item Trémolos que @emph{not} se hayan introducido como un valor del tipo @q{@code{:}[@var{número}]} +@end itemize + +También se pueden controlar el panorama, el balance, la expresión +y los efectos de reverberación y chorus mediante el +establecimiento de propiedades de contexto, véase +@ref{Propiedades de contexto para efectos MIDI}. + +Si se combina con el script @file{articulate}, es posible +producir la salida por el MIDI de los siguientes elementos +adicionales de notación musical: + +@itemize +@item Appoggiaturas (apoyaturas). Se les da la mitad de la duración de la nota siguiente (sin tener en cuenta los puntillos). Por ejemplo: @example -\score @{ - @var{@dots{}música@dots{}} - \layout @{ @} - \midi @{ @} -@} +\appoggiatura c8 d2. @end example -Si hay @emph{solamente} un bloque @code{\midi} dentro de un -@code{\score} (es decir, sin ningún bloque @code{\layout}), -entonces @emph{solamente} se producirá MIDI. No se produce -ninguna salida impresa de notación musical. +@noindent +El Do toma la duración de una negra. + +@item Notas y grupos de adorno (mordentes de una nota, trinos, grupetos circulares, etc.) +@item Rallentando, accelerando, ritardando y a tempo +@item Ligaduras de expresión y de fraseo +@item Tenuto +@end itemize + +@noindent +Véase @ref{Enriquecimiento de la salida MIDI}. + +@cindex MIDI, notación no contemplada + +@node Notación no contemplada en el MIDI +@subsection Notación no contemplada en el MIDI +@translationof Unsupported notation for MIDI + +Los siguientes elementos de notación musical no se pueden hacer +salir por el MIDI: + +@itemize +@item Articulaciones distintas al picado, staccato, acento, marcato y portato +@item Crescendos y decrescendos sobre una @emph{sola} nota +@item Calderón +@item Bajo cifrado +@item Glissandos +@item Caídas y elevaciones +@item Acordes microtonales +@item Duraciones introducidas como anotaciones, p.ej. el swing +@item Cambios de tempo sin @code{\tempo} (p.ej., introducidas como anotaciones) +@item Trémolos que @emph{se introducen} con la notación de la forma @q{@code{:}[@var{número}]} +@end itemize + + +@node El bloque MIDI +@subsection El bloque MIDI +@translationof The MIDI block + +@cindex bloque MIDI + +Para crear un archivo de salida MIDI a partir de un archivo de +entrada de LilyPond, introduzca un bloque @code{\midi}, que puede +estar vacío, dentro del bloque @code{\score}: @example \score @{ - @var{@dots{}música@dots{}} + @var{@dots{} música @dots{}} + \layout @{ @} \midi @{ @} @} @end example -Se traducen correctamente a la salida MIDI la altura y duración de -las notas, las ligaduras de unión, matices y cambios de tempo. Las -@q{marcas} dinámicas se traducen a niveles de volumen con una -@q{fracción fija} del rango de volumen MIDI disponible; Los -crescendi y decrescendi hacen que el volumen varíe linealmente -entre sus dos extremos. +@warning{ Un bloque @code{@bs{}score} que, además de la música, +contiene solamente un bloque @code{@bs{}midi} (o sea, @emph{sin} +el bloque @code{@bs{}layout}), solo produce archivos de salida +MIDI; no se imprime ninguna notación musical.} + +La extensión predeterminada para los archivos de salida +(@code{.midi}) se puede cambiar usando la opción +@code{-dmidi-extension} con la instrucción @code{lilypond}: -Se reflejan en la salida de MIDI todas las indicaciones de -@code{\tempo}, incluidos todos los cambios de tempo siguientes, -especificados dentro de la notación musical. +@example +lilypond -dmidi-extension=mid Archivo.ly +@end example -Por lo general basta con dejar vacío el bloque @code{\midi}, pero -puede contener disposiciones distintas de los contextos, -definiciones de contexto nuevas o código que establezca valores -para propiedades. En el ejemplo que aparece a continuación se -fija el tempo a 72 negras por minuto, pero @emph{solamente} para -la reproducción de audio a través de MIDI. +Como alternativa, puede añadirse la siguiente expresión de Scheme +antes del comienzo de uno de los bloques @code{\book}, +@code{\bookpart} o @code{\score}. Véase @ref{Estructura del archivo}. @example -\score @{ - @var{@dots{}music@dots{}} - \midi @{ - \tempo 4 = 72 - @} -@} +#(ly:set-option 'midi-extension "mid") @end example -Observe que @code{\tempo} es en realidad una instrucción para -establecer valores para propiedades durante la interpretación de -la música, y en el contexto de las definiciones de salida, como un -bloque @code{\midi}, se reinterpreta como si fuese una -modificación de contexto. +@seealso +Referencia de la notación: +@ref{Estructura del archivo}. + +Archivos instalados: +@file{scm/midi.scm}. + +@knownissues +Están disponibles 15 canales MIDI y un canal adicional (el número +10) para la percusión. Los pentagramas se asignan a los canales +por orden, de forma que una partitura que contenga más de 15 +pentagramas da como resultado que los pentagramas adicionales +comparten (pero no sobreescriben) el mismo canal MIDI. Esto +puede ser problemático si los pentagramas que comparten canal +tienen establecidas propiedades MIDI, basadas en canal, en mutuo +conflicto (como distintos instrumentos MIDI). + + +@node Control de las dinámicas del MIDI +@subsection Control de las dinámicas del MIDI +@translationof Controlling MIDI dynamics + +Es posible controlar el volumen MIDI general, el volumen relativo +de las indicaciones de matiz dinámico y el volumen relativo de +los distintos instrumentos. + +Las indicaciones matiz dinámico se traducen automáticamente a +niveles de volumen dentro del rango de volúmenes MIDI disponible +mientras que los crescendos y decrescendos varían el volumen +linealmente entre sus dos extremos. Es posible controlar el +volumen relativo de las indicaciones de matiz dinámico, y el +volumen general de los diferentes instrumentos. + +@menu +* Indicaciones de matiz dinámico en el MIDI:: +* Establecimiento del volumen MIDI:: +* Establecimiento de las propiedades del bloque MIDI:: +@end menu + +@cindex MIDI, volumen +@cindex MIDI, ecualización +@cindex MIDI, matices dinámicos +@cindex dinámica del MIDI + + +@node Indicaciones de matiz dinámico en el MIDI +@unnumberedsubsubsec Indicaciones de matiz dinámico en el MIDI +@translationof Dynamic marks in MIDI + +Solo las marcas de dinámica desde @code{ppppp} hasta +@code{fffff}, incluidos @code{mp}, @code{mf} y @code{sf} tienen +valores asignados. Este valor se aplica a continuación al valor +del rango de volumen MIDI general para obtener el volumen final +que se incluye en la salida MIDI para esa indicación de matiz +dinámico en particular. Las fracciones predeterminadas varían +desde 0.25 para el @notation{ppppp} hasta 0.95 para el +@notation{fffff}. El conjunto completo de las indicaciones de +matiz dinámico pueden verse en el archivo @file{scm/midi.scm}. + + +@snippets +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{creating-custom-dynamics-in-midi-output.ly} + +Archivos instalados: +@file{ly/script-init.ly} +@file{scm/midi.scm}. + +Fragmentos de código: +@rlsr{MIDI}. + +Referencia de funcionamiento interno: +@rinternals{Dynamic_performer}. -@cindex MIDI, definiciones de contexto -Las definiciones de contexto siguen la misma sintaxis que las de -un bloque @code{\layout}; +@node Establecimiento del volumen MIDI +@unnumberedsubsubsec Establecimiento del volumen MIDI +@translationof Setting MIDI volume + +Los volúmenes generales mínimo y máximo de las indicaciones de +matiz dinámico MIDI se controlan estableciendo las propiedades +@code{midiMinimumVolume} y @code{midiMaximumVolume} en el nivel +del bloque @code{Score}. Estas propiedades tienen efecto +solamente al comienzo de una vos y sobre las indicaciones +dinámicas. La fracción que corresponde a cada indicación +dinámica se modifica con esta fórmula: + +@example +midiMinimumVolume + (midiMaximumVolume - midiMinimumVolume) * fracción +@end example + +En el ejemplo siguiente, el rango dinámico del volumen MIDI +general se limita al intervalo entre @code{0.2} y @code{0.5}. @example \score @{ - @var{@dots{}música@dots{}} + << + \new Staff @{ + \set Staff.midiInstrument = #"flute" + @var{@dots{} music @dots{}} + @} + \new Staff @{ + \set Staff.midiInstrument = #"clarinet" + @var{@dots{} music @dots{}} + @} + >> \midi @{ \context @{ - \Voice - \remove "Dynamic_performer" + \Score + midiMinimumVolume = #0.2 + midiMaximumVolume = #0.5 @} @} @} @end example -elimina de la salida MIDI el efecto de los matices dinámicos. Los -módulos de traducción para el sonido se llaman @q{performers} -(intérpretes). - -@snippets - -@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] -{changing-midi-output-to-one-channel-per-voice.ly} - -@knownissues - -Algunos sistemas operativos requieren una extensión de archivo -@emph{específica} para los archivos MIDI. Si se prefiere una -extensión distinta, inserte la línea siguiente en el nivel -superior del archivo de entrada, antes del comienzo de cualquier -bloque @code{\book}, @code{\bookpart} o @code{\score}; +Se puede obtener una ecualización sencilla de instrumentos MIDI +estableciendo las propiedades @code{midiMinimumVolume} y +@code{midiMaximumVolume} dentro del contexto @code{Staff}. @example -#(ly:set-option 'midi-extension "mid") +\score @{ + \new Staff @{ + \set Staff.midiInstrument = #"flute" + \set Staff.midiMinimumVolume = #0.7 + \set Staff.midiMaximumVolume = #0.9 + @var{@dots{} music @dots{}} + @} + \midi @{ @} +@} @end example -De esta manera quedará establecida la extensión predeterminada -para los archivos MIDI a @code{.mid}. - -De forma alternativa, se puede proporcionar una opción en la línea -de órdenes de la consola: +Para partituras con más de un pentagrama y más de un instrumento +MIDI, se pueden fijar individualmente los volúmenes relativos de +cada instrumento: @example -lilypond -dmidi-extension=mid MiArchivo.ly +\score @{ + << + \new Staff @{ + \set Staff.midiInstrument = #"flute" + \set Staff.midiMinimumVolume = #0.7 + \set Staff.midiMaximumVolume = #0.9 + @var{@dots{} music @dots{}} + @} + \new Staff @{ + \set Staff.midiInstrument = #"clarinet" + \set Staff.midiMinimumVolume = #0.3 + \set Staff.midiMaximumVolume = #0.6 + @var{@dots{} music @dots{}} + @} + >> + \midi @{ @} +@} @end example -Los cambios del volumen MIDI sólo tienen lugar al principio de la -nota, por lo que los crescendi y decrescendi no pueden afectar al -volumen de una sola nota. +En este ejemplo el volumen del clarinete se reduce de forma +relativa al volumen de la flauta. -Puede que algunos propgramas reproductores de MIDI no siempre -manejen correctamente los cambios de tempo en la salida MIDI. +Si no se establecen estas propiedades de volumen, LilyPond aún +aplica un @q{pequeño grado} de ecualización a ciertos +instrumentos. Véase @file{scm/midi.scm}. -@seealso Archivos instalados: -@file{../ly/performer-init.ly}. +@file{scm/midi.scm}. -Manual de aprendizaje: -@rlearning{Otras fuentes de información}. +@seealso +Referencia de la notación: +@ref{Disposición de la partitura}. +Referencia de funcionamiento interno: +@rinternals{Dynamic_performer}. -@node Instrumentos MIDI -@subsection Instrumentos MIDI -@translationof MIDI Instruments +@snippets +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{replacing-default-midi-instrument-equalization.ly} -@cindex instrumento, nombres de -@funindex Staff.midiInstrument +@knownissues +Los cambios en el volumen del MIDI solamente tienen lugar en el +comienzo de una nota, por lo que los crescendos y decrescendos no +afectan al volumen de una sola nota. -El instrumento MIDI que se quiere utilizar se establece fijando la -propiedad @code{Staff.midiInstrument} al nombre del instrumento. -El nombre se debe elegir de entre los que están en la lista que -aparece en @ref{instrumentos MIDI}. +@node Establecimiento de las propiedades del bloque MIDI +@unnumberedsubsubsec Establecimiento de las propiedades del bloque MIDI +@translationof Setting MIDI block properties -@example -\new Staff @{ - \set Staff.midiInstrument = #"glockenspiel" - @var{@dots{}notas@dots{}} -@} -@end example +El bloque @code{\midi} puede contener distintas disposiciones de +los contextos, definiciones de contexto nuevas o código que fija +los valores de ciertas propiedades. @example -\new Staff \with @{midiInstrument = #"cello"@} @{ - @var{@dots{}notas@dots{}} +\score @{ + @var{@dots{} music @dots{}} + \midi @{ + \tempo 4 = 72 + @} @} @end example -Si el instrumento elegido no coincide exactamente con uno de los -instrumentos de la lista de instrumentos MIDI, se usará el -instrumento Piano de Cola (@code{"acoustic grand"}). - +Aquí, el tempo se establece a 72 pulsos de negra por minuto. La +indicación de tempo dentro del bloque @code{\midi} no aparece en +la partitura impresa. Aunque cualquier otra indicación de +@code{\tempo} que se especifique dentro del bloque @code{\score} +también se reflejará en la salida MIDI. -@node ¿Qué sale por el MIDI? -@subsection ¿Qué sale por el MIDI? -@translationof What goes into the MIDI output? +Dentro de un bloque @code{\midi}, la instrucción @code{\tempo} +está estableciendo propiedades durante la interpretación de la +música y en el contexto de las definiciones de salida; así, se +interpreta @emph{como si} fuera una modificación de contesto. -@menu -* Contemplado en el MIDI:: -* No contemplado en el MIDI:: -@end menu - -@node Contemplado en el MIDI -@unnumberedsubsubsec Contemplado en el MIDI -@translationof Supported in MIDI - -@cindex alturas en MIDI -@cindex MIDI, alturas -@cindex cuartos de tono en MIDI -@cindex MIDI, cuartos de tono -@cindex microtonos en MIDI -@cindex MIDI, microtonos -@cindex acordes, nombres de, en MIDI -@cindex MIDI, nombres de -@cindex duraciones en MIDI -@cindex MIDI, duraciones -@cindex Articlulate, scripts -@cindex MIDI, articulaciones -@cindex articulaciones en MIDI -@cindex trinos en MIDI -@cindex grupetos en MIDI -@cindex rallentando en MIDI -@cindex accelerando en MIDI -@c TODO etc - -Los siguientes elementos de notación se reflejan en la salida MIDI: - -@itemize -@item Alturas -@item Microtonos (véase @ref{Alteraciones accidentales}. La reproducción necesita un reproductor que contemple la curvatura de tono o @emph{pitch bend}.) -@item Acordes escritos como nombres de acorde -@item Ritmos escritos como duraciones de las notas, incluidos los grupos de valoración especial -@item Trémolos escritos sin @q{@code{:}[@var{número}]} -@item Ligaduras de unión -@item Matices o indicaciones de dinámica -@item Crescendi y decrescendi sobre varias notas -@item Cambios de tempo insertados con una marca metronómica -@item Letra de las canciones -@end itemize +@cindex MIDI, definiciones de contexto +@cindex contexto, definiciones con MIDI -Utilizando @ref{El script Articulate}, a la lista anterior se añaden -una serie de elementos: +Las definiciones de contexto siguen la misma sintaxis que las del +bloque @code{\layout}: -@itemize -@item Articulaciones (ligaduras de expresión, picados, etc) -@item Trinos, mordentes circulares -@item Rallentando y accelerando -@end itemize +@example +\score @{ + @var{@dots{} music @dots{}} + \midi @{ + \context @{ + \Voice + \remove "Dynamic_performer" + @} + @} +@} +@end example +Este ejemplo suprime el efecto de las indicaciones dinámicas +sobre la salida MIDI. Nota: los módulos de traducción de +LilyPond usados para el sonido se llaman @q{performers}. -@node No contemplado en el MIDI -@unnumberedsubsubsec No contemplado en el MIDI -@translationof Unsupported in MIDI +@seealso +Manual de aprendizaje: +@rlearning{Otras fuentes de información}. -@c TODO index as above +Referencia de la notación: +@ref{Expresiones}, +@ref{Disposición de la partitura}. -Los siguientes elementos de notación no tienen ningún efecto sobre la -salida MIDI, a no ser que utilicemos @ref{El script Articulate}: +Archivos instalados: +@file{ly/performer-init.ly}. -@itemize -@item Duraciones escritas como anotaciones, p.ej. el swing -@item Cambios de tempo escritos como anotaciones sin marca de tempo -@item Staccato y otras articulaciones y ornamentos -@item Ligaduras de expresión y de fraseo -@item Crescendi y decrescendi sobre una nota única -@item Trémolos introducidos con @q{@code{:}[@var{número}]} -@item Bajo cifrado -@item Acordes microtonales -@end itemize +Fragmentos de código: +@rlsr{MIDI}. +Referencia de funcionamiento interno: +@rinternals{Dynamic_performer}. -@node Repeticiones y MIDI -@subsection Repeticiones y MIDI -@translationof Repeats in MIDI +@knownissues +Ciertos reproductores de MIDI no siempre maneja correctamente los +cambios de tempo en la salida MIDI. -@cindex repeticiones, expandir -@funindex \unfoldRepeats +Los cambios efectuados al @code{midiInstrument}, así como ciertas +opciones MIDI, al @emph{comienzo} de un pentagrama pueden +aparecer dos veces en la salida MIDI. -Con un poco de trucaje, se puede hacer que cualquier tipo de -repetición esté presente en la salida MIDI. Esto se consigue mediante -la aplicación de la función musical @code{\unfoldRepeats}. Esta -función cambia todas las repeticiones a repeticiones desplegadas. -@lilypond[quote,verbatim] -\unfoldRepeats { - \repeat tremolo 8 { c'32 e' } - \repeat percent 2 { c''8 d'' } - \repeat volta 2 { c'4 d' e' f' } - \alternative { - { g' a' a' g' } - { f' e' d' c' } - } -} -\bar "|." -@end lilypond -En partituras con varias voces, el desplegado de las repeticiones en -la salida MIDI solo se produce correctamente si @emph{todas y cada -una} de las voces incluye las repeticiones de manera completa y -explícita. +@node Uso de los instrumentos MIDI +@subsection Uso de los instrumentos MIDI +@translationof Using MIDI instruments -Al crear un archivo de partitura que use @code{\unfoldRepeats} para el -MIDI, es necesario hacer dos bloques @code{\score}: uno para el MIDI -(con repeticiones desplegadas) y otro para la notación impresa (con -repeticiones de volta --primera y segunda vez--, tremolo --trémolo--, -y percent --repetición de compases--). Por ejemplo, +Los instrumentos MIDI se establecen usando la propiedad +@code{midiInstrument} dentro de un contexto @code{Staff}. @example \score @{ - @var{@dots{}música@dots{}} - \layout @{ @dots{} @} + \new Staff @{ + \set Staff.midiInstrument = #"glockenspiel" + @var{@dots{} music @dots{}} + @} + \midi @{ @} @} +@end example + +o + +@example \score @{ - \unfoldRepeats @var{@dots{}música@dots{}} - \midi @{ @dots{} @} + \new Staff \with @{midiInstrument = #"cello"@} @{ + @var{@dots{} music @dots{}} + @} + \midi @{ @} @} @end example +Si el instrumento elegido no coincide exactamente con uno de los +instrumentos de la lista de la sección @q{instrumentos MIDI}, se +usará el instrumento Piano de Cola (@code{"acoustic grand"}). +Véase @ref{Instrumentos MIDI}. -@node Control de los matices en el MIDI -@subsection Control de los matices en el MIDI -@translationof Controlling MIDI dynamics - -La dinámica en el MIDI está implementada por medio del intérprete -Dynamic_performer que reside de forma predeterminada dentro del -contexto Voice. Es posible controlar el volumen MIDI general, el -volumen relativo de los matices dinámicos y el volumen relativo de los -distintos instrumentos. +@seealso +Manual de aprendizaje: +@rlearning{Otras fuentes de información}. -@menu -* Indicaciones dinámicas:: -* Volumen maestro MIDI:: -* Balance entre instrumentos (i):: -* Balance entre instrumentos (ii):: -@end menu +Referencia de la notación: +@ref{Instrumentos MIDI}, +@ref{Disposición de la partitura}. -@node Indicaciones dinámicas -@unnumberedsubsubsec Indicaciones dinámicas -@translationof Dynamic marks - -Los matices o indicaciones de dinámica se traducen a una fracción -fija del rango de volumen MIDI disponible. Las fracciones -predeterminadas se extienden desde 0.25 para @notation{ppppp} -hasta 0.95 para @notation{fffff}. El conjunto de indicaciones -dinámicas y las fracciones asociadas pueden verse en -@file{../scm/midi.scm}, véase @rlearning{Otras fuentes de -información}. Este conjunto de fracciones se puede cambiar o -extender proporcionando una función que toma como argumento una -indicación dinámica y devuelve la fracción requerida, y -estableciendo @code{Score.dynamicAbsoluteVolumeFunction} a esta -función. - -Por ejemplo, si se requiere una indicación dinámica -@notation{rinforzando}, @code{\rfz}, ésta no tiene ningún efecto -predeterminado sobre el volumen MIDI, pues no está incluida en el -conjunto predeterminado. De igual manera, si se define una -indicación dinámica nueva con @code{make-dynamic-script}, ésta -tampoco estará incluida en el conjunto predeterminado. El ejemplo -siguiente muestra cómo hay que añadir el volumen MIDI para estas -indicaciones dinámicas. La función Scheme establece la fracción a -0.9 si se encuentra una indicación dinámica rfz, y en caso -contrario llama a la función predeterminada. +Archivos instalados: +@file{scm/midi.scm}. -@lilypond[verbatim,quote] -#(define (myDynamics dynamic) - (if (equal? dynamic "rfz") - 0.9 - (default-dynamic-absolute-volume dynamic))) +@knownissues +Los instrumentos de percusión cuya notación está en un contexto +@code{DrumStaff} se encontrará a la salida, correctamente, sobre +el canal MIDI número@tie{}10 pero ciertos instrumentos de +percusión afinada como el xilófono, el vibráfono o los timbales, +se tratan como instrumentos @qq{normales}, de forma que la música +de éstos se debe introducir en un contexto @code{Staff} (no +@code{DrumStaff}) para obtener una salida MIDI correcta. Hay una +lista completa de entradas de los @code{sets de percusión del +canal 10} en el archivo @file{scm/midi.scm}. Véase +@rlearning{Otras fuentes de información}. -\score { - \new Staff { - \set Staff.midiInstrument = #"cello" - \set Score.dynamicAbsoluteVolumeFunction = #myDynamics - \new Voice { - \relative c'' { - a4\pp b c-\rfz - } - } - } - \layout {} - \midi {} -} -@end lilypond -Como alternativa, si se necesitara redefinir la tabla completa de -fracciones, sería mejor usar el procedimiento -@notation{default-dynamic-absolute-volume} que aparece en -@file{../scm/midi.scm} y la tabla asociada como modelo. El último -ejemplo de esta sección muestra cómo se puede hacer esto. +@node Uso de las repeticiones con el MIDI +@subsection Uso de las repeticiones con el MIDI +@translationof Using repeats with MIDI -@node Volumen maestro MIDI -@unnumberedsubsubsec Volumen maestro MIDI -@translationof Overall MIDI volume +@cindex repeticiones en MIDI +@cindex MIDI con repeticiones +@funindex \unfoldRepeats -El volumen general máximo y mínimo de las indicaciones dinámicas -de MIDI se controla estableciendo valores para las propiedades -@code{midiMinimumVolume} y @code{midiMaximumVolume} en el nivel de -@code{Score}. Estas propiedades tienen efecto solamente al inicio -de una voz y sobre las indicaciones dinámicas. La fracción que -corresponde a cada indicación dinámica se modifica con esta -fórmula: +Las repeticiones se pueden representar en la salida MIDI +aplicando la instrucción @code{\unfoldRepeats}. @example -midiMinimumVolume + (midiMaximumVolume - midiMinimumVolume) * fracción +\score @{ + \unfoldRepeats @{ + \repeat tremolo 8 @{ c'32 e' @} + \repeat percent 2 @{ c''8 d'' @} + \repeat volta 2 @{ c'4 d' e' f' @} + \alternative @{ + @{ g' a' a' g' @} + @{ f' e' d' c' @} + @} + @} + \midi @{ @} +@} @end example -En el ejemplo siguiente, el rango de intensidad dinámica del -volumen general MIDI está limitado al intervalo desde 0.2 hasta -0.5. - -@lilypond[verbatim,quote] -\score { - << - \new Staff { - \key g \major - \time 2/2 - \set Staff.midiInstrument = #"flute" - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 - } - } - \new Staff { - \key g \major - \set Staff.midiInstrument = #"clarinet" - \new Voice \relative c'' { - b1\p a2. b8 a - g2. fis8 e - fis2 r - } - } - >> - \layout {} - \midi { - \tempo 2 = 72 - \context { - \Score - midiMinimumVolume = #0.2 - midiMaximumVolume = #0.5 - } - } -} -@end lilypond - -@node Balance entre instrumentos (i) -@unnumberedsubsubsec Balance entre instrumentos (i) -@translationof Equalizing different instruments (i) - -Si las propiedades de volumen MIDI máximo y mínimo están -establecidas en el contexto @code{Staff} se pueden controlar los -volúmenes relativos de los instrumentos MIDI. Esto proporciona un -ecualizador de instrumentos básico que puede realzar -significativamente la calidad de la salida MIDI. +Para restringir el efecto de @code{\unfoldRepeats} a la salida +MIDI únicamente, y al mismo tiempo genera partituras imprimibles, +es necesario hacer @emph{dos} bloques @code{\score}: uno para el +MIDI (con las repeticiones desplegadas) y otro para la notación +(con repeticiones de primera y segunda vez, trémolos y del tipo +porcentaje); -En este ejemplo se reduce el volumen del clarinete con relación al -de la flauta. - -@lilypond[verbatim,quote] -\score { - << - \new Staff { - \key g \major - \time 2/2 - \set Staff.midiInstrument = #"flute" - \set Staff.midiMinimumVolume = #0.7 - \set Staff.midiMaximumVolume = #0.9 - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 - } - } - \new Staff { - \key g \major - \set Staff.midiInstrument = #"clarinet" - \set Staff.midiMinimumVolume = #0.3 - \set Staff.midiMaximumVolume = #0.6 - \new Voice \relative c'' { - b1\p a2. b8 a - g2. fis8 e - fis2 r - } - } - >> - \layout {} - \midi { - \tempo 2 = 72 - } -} -@end lilypond +@example +\score @{ + @var{@dots{} music @dots{}} + \layout @{ @} +@} +\score @{ + \unfoldRepeats @{ + @var{@dots{} music @dots{}} + @} + \midi @{ @} +@} +@end example +Si se usan varias voces, cada una de ellas debe contener las +repeticiones completamente desplegadas para poder obtener una +salida MIDI correcta. -@node Balance entre instrumentos (ii) -@unnumberedsubsubsec Balance entre instrumentos (ii) -@translationof Equalizing different instruments (ii) - -Si las propiedades de volumen MIDI máximo y mínimo no están -establecidas, de forma predeterminada LilyPond aplica un pequeño -grado de ecualización a algunos instrumentos. Los instrumentos y -la ecualización que se aplica se muestra en la tabla -@notation{instrument-equalizer-alist} en @file{../scm/midi.scm}. - -El ecualizador básico predeterminado se puede sustituir -estableciendo @code{instrumentEqualizer} en el contexto -@code{Score} a un procedimiento Scheme nuevo que acepte el nombre -de un instrumento MIDI como único argumento y devuelva un par de -fracciones que dan los volúmenes máximo y mínimo que se aplican a -dicho instrumento. Esta sustitución se hace de la misma forma que -mostramos para restablecer la fracción de volumen absoluto -@code{dynamicAbsoluteVolumeFunction} al comienzo de esta sección. -El ecualizador predeterminado, -@notation{default-instrument-equalizer}, en -@file{../scm/midi.scm}, muestra cómo se puede escribir tal -procedimiento. - -El ejemplo siguiente establece los volúmenes relativos de la -flauta y del clarinete a los mismos valores que el ejemplo -anterior. +@seealso +Referencia de la notación: +@ref{Repeticiones}. + + +@node Asignación de canales MIDI +@subsection Asignación de canales MIDI +@translationof MIDI channel mapping + +@cindex MIDI, canales +@cindex MIDI, pistas +@funindex midiChannelMapping + +Cuando se está generando un archivo MIDI de una partitura, +LilyPond asigna cada nota de la partitura automáticamente a un +canal MIDI, aquel en que se tocaría cuando se envía hacia un +dispositivo MIDI. Un canal MIDI tiene una cierta cantidad de +controles disponibles para seleccionar, por ejemplo, el +instrumento que usar para reproducir las notas en ese canal, u +ordenar al dispositivo MIDI que aplique diversos efectos al +sonido producido sobre el canal. En todo momento, cada control +de un canal MIDI solo puede tener asignado un valor único (que +sin embargo se puede modificar, por ejemplo, para cambiar a otro +instrumento en mitad de una partitura). + +El estándar MIDI contempla solamente 16 canales por dispositivo +MIDI. Este límite en el número de canales limita también el +número de instrumentos diferentes que pueden estar tocando al +mismo tiempo. + +LilyPond crea pistas MIDI separadas para cada pentagrama (o +instrumento o voz, según el valor de +@code{Score.midiChannelMapping}), y también para cada contexto de +letra. No hay un límite para el número de pistas. + +Para solventar el número limitado de canales MIDI, LilyPond +contempla algunos modos diferentes para la asignación de canales +MIDI, que se seleccionan usando la propiedad de contexto +@code{Score.midiChannelMapping}. En cada caso, si se necesitan +más canales MIDI que el límite, los números de canal asignados +vuelven a contar desde cero, causando posiblemente una asignación +incorrecta de instrumento a algunas notas. Esta propiedad de +contexto se puede fijar a uno de los siguientes valores: -@lilypond[verbatim,quote] -#(define my-instrument-equalizer-alist '()) +@table @var -#(set! my-instrument-equalizer-alist - (append - '( - ("flute" . (0.7 . 0.9)) - ("clarinet" . (0.3 . 0.6))) - my-instrument-equalizer-alist)) +@item @code{'staff} + +Reservar un canal MIDI distinto para cada uno de los pentagramas +de la partitura (es el ajuste predeterminado). Todas las notas +de todas las voces comparten el canal MIDI del pentagrama que las +encierra, y todas se codifican dentro de la misma pista MIDI. + +El límite de 16 canales se aplica al número total de contextos de +pentagrama y de letra, incluso aunque las letras del MIDI no +consumen un canal MIDI. + +@item @code{'instrument} + +Reservar un canal MIDI distinto a cada uno de los instrumentos +diferentes especificados en la partitura. Esto significa que +todas las notas reproducidas con el mismo instrumento MIDI +comparten el mismo canal MIDI (y la misma pista), incluso aunque +las notas provengan de diferentes voces o pentagramas. + +En este caso los contextos de letra no cuentan para el límite de +16 canales MIDI (ya que no se asignan a un instrumento MIDI), de +forma que este ajuste puede permitir una mejor distribución de +los canales MIDI cuando el número de contextos de pentagrama y de +letra en la partitura excede la cantidad de 16. + +@item @code{'voice} + +Reservar un canal MIDI distinto a cada voz de la partitura que +tenga un nombre único entre las voces de su pentagrama +circundante. Las voces de los distintos pentagramas siempre se +asignan a distintos canales MIDI pero dos voces cualesquiera +contenidas dentro del mismo pentagrama comparten el mismo canal +MIDI sin tienen el mismo nombre. A causa de que +@code{midiInstrument} y los diversos controles MIDI para los +efectos son propiedades del contexto de pentagrama, no se pueden +fijar independientemente para cada voz. La primera voz se +reproduce con el instrumento y los efectos especificados para el +pentagrama, y las voces con un nombre distinto de la primera +recibirán el instrumento y los efectos predeterminados. + +Nota: se pueden asignar distintos instrumentos y/o efectos a +varias voces dentro del mismo pentagrama moviendo el +@code{Staff_performer} del contexto @code{Staff} al contexto +@code{Voice}, y dejando que @code{midiChannelMapping} conserve su +valor predeterminado de @code{'staff} o se fije al valor +@code{'instrument}; véase el fragmento de código siguiente. -#(define (my-instrument-equalizer s) - (let ((entry (assoc s my-instrument-equalizer-alist))) - (if entry - (cdr entry)))) +@end table -\score { - << - \new Staff { - \key g \major - \time 2/2 - \set Score.instrumentEqualizer = #my-instrument-equalizer - \set Staff.midiInstrument = #"flute" - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 - } - } - \new Staff { - \key g \major - \set Staff.midiInstrument = #"clarinet" - \new Voice \relative c'' { - b1\p a2. b8 a - g2. fis8 e - fis2 r - } - } - >> - \layout { } - \midi { - \tempo 2 = 72 - } -} -@end lilypond +Por ejemplo, la asignación predeterminada de canal MIDI de una +partitura puede cambiarse al ajuste @code{'instrument} como se +muestra a continuación: -@ignore -@c Delete when satisfied this is adequately covered elsewhere -td +@example +\score @{ + ...music... + \midi @{ + \context @{ + \Score + midiChannelMapping = #'instrument + @} + @} +@} +@end example -@n ode Microtones in MIDI -@s ubsection Microtones in MIDI +@snippets +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{changing-midi-output-to-one-channel-per-voice.ly} -@cindex microtones in MIDI -Microtones consisting of half sharps and half flats are exported -to the MIDI file and render correctly in MIDI players which support -pitch bending. See @ref{Nombres de las notas en otros idiomas}. Here is -an example showing all the half sharps and half flats. It can be -copied out and compiled to test microtones in your MIDI player. +@node Propiedades de contexto para efectos MIDI +@subsection Propiedades de contexto para efectos MIDI +@translationof Context properties for MIDI effects + +@cindex Efectos en MIDI +@cindex Panorama en MIDI +@cindex Balance en MIDI +@cindex Estéreo, balance en MIDI +@cindex Expresión en MIDI +@cindex Reverberación en MIDI +@cindex Chorus en MIDI +@funindex midiPanPosition +@funindex midiBalance +@funindex midiExpression +@funindex midiReverbLevel +@funindex midiChorusLevel + +Se pueden usar las siguientes propiedades de contexto para +aplicar diversos efectos MIDI a las notas que se reproducen sobre +el canal MIDI asociado con el pentagrama, instrumento MIDI o voz +actual (dependiendo del valor de la propiedad de contexto +@code{Score.midiChannelMapping} y del contexto en que está +situado el @code{Staff_performer}; véase @ref{Asignación de +canales MIDI}). + +Los cambios en estas propiedades de contexto afectan a todas las +notas que se reproducen sobre el canal después del cambio, aunque +algunos de los efectos se pueden incluso aplicar también a notas +que están ya sonando en ese momento (dependiendo de la +implementación del dispositivo de salida MIDI). + +Se contemplan las siguientes propiedades de contexto: -@lilypond[verbatim,quote] -\score { - \relative c' { - c4 cih cis cisih - d4 dih ees eeh - e4 eih f fih - fis4 fisih g gih - gis4 gisih a aih - bes4 beh b bih - } - \layout {} - \midi {} -} -@end lilypond -@end ignore +@table @var +@item @code{Staff.midiPanPosition} + +La posición de panorama controla cómo se distribuye el sonido de +un canal MIDI entre las salidas estéreo izquierda y derecha. La +propiedad de contexto acepta un número entre -1.0 (@code{#LEFT}) +y 1.0 (@code{#RIGHT}); el valor -1.0 pone toda la potencia de +sonido en la salida estéreo izquierda (dejando la salida derecha +en completo silencio), el valor 0.0 (@code{#CENTER}) distribuye +el sonido por igual entre las salidas estéreo izquierda y +derecha, y el valor 1.0 mueve todo el sonido a la salida estéreo +derecha. Los valores entre -1.0 y 1.0 se pueden usar para +obtener distribuciones mezcladas entre las salidas estéreo +izquierda y derecha. + +@item @code{Staff.midiBalance} + +Equilibrio estéreo de un canal MIDI. De forma similar a la +posición de panorama esta propiedad de contexto acepta un número +entre -1.0 (@code{#LEFT}) y 1.0 (@code{#RIGHT}). Varía el +volumen relativo que se envía a los dos altavoces estéreo sin +afectar a la distribución de las propias señales estéreo. + +@item @code{Staff.midiExpression} + +Nivel de expresión (como una fracción del nivel máximo +disponible) que se aplica a un canal MIDI. Un dispositivo MIDI +combina el nivel de expresión del canal MIDI con el nivel actual +de dinámica de una voz (controlado mediante las instrucciones de +dinámica como @code{\p} o @code{\ff}) para obtener el volumen +total de cada nota dentro de la voz. El control de expresión se +puede usar, por ejemplo, para implementar efectos de crescendo y +decrescendo sobre notas mantenidas (algo que LilyPond no +contempla de forma automática). + +@c Issue 4059 contains an attached snippet which shows how this might +@c be done, but this is too large and complex for the NR, even as a +@c referenced snippet. It could be added to the LSR. + +El rango de los niveles de expresión se extiende desde 0.0 +(ninguna expresión, lo que significa un volumen nulo) hasta 1.0 +(expresión al máximo). + +@item @code{Staff.midiReverbLevel} + +El nivel de reverberación (cono una fracción del máximo nivel +disponible) que se aplica a un canal MIDI. Esta propiedad acepta +números entre 0.0 (sin reverberación) y 1.0 (efecto máximo). + +@item @code{Staff.midiChorusLevel} + +Nivel del efecto Chorus (como una fracción del máximo nivel +disponible) que se aplica a un canal MIDI. Esta propiedad acepta +números entre 0.0 (sin efecto de chorus) y 1.0 (efecto al +máximo). -@node Percusión en MIDI -@subsection Percusión en MIDI -@translationof Percussion in MIDI +@end table -La notación de los instrumentos de percusión se realiza -normalmente en un contexto @code{DrumStaff} y cuando se hace de -esta forma se les da salida correctamente por el canal -MIDI@tie{}10, pero ciertos instrumentos de percusión de altura -determinada, como el xilófono, marimba, vibráfono, timbales, etc., -se tratan como instrumentos @qq{normales} y la música para estos -instrumentos se debe introducir en contextos de @code{Staff} -normales, no en un contexto @code{DrumStaff}, para obtener la -salida MIDI correcta. -Ciertos sonidos de altura indeterminada que están incluidos en el -estándar General MIDI, como el tom melódico, el tambor taiko, los -tambores sintéticos, etc., no se pueden acceder a través del canal -MIDI@tie{}10, por lo que la notación para dichos instrumentos se -debe introducir también en un contexto normal de @code{Staff}, -utilizando las alturas normales adecuadas. +@knownissues -Muchos instrumentos de percusión no están incluidos dentro del -estándar General MIDI, p.ej. las castañuelas. El método más fácil -(aunque no satisfactorio) de producir una salida MIDI al escribir -para estos instrumentos es sustituirlos por el sonido más parecido -del conjunto estándar. +Dado que los archivos MIDI no contienen en realidad ninguna +información sonora, los cambios en estas propiedades de contexto +solamente se convierten en peticiones para que cambien los +controles de canal MIDI dentro de los archivos MIDI emitidos. Si +un dispositivo MIDI determinado (como un reproductor MIDI por +software) puede de hecho manejar cualquiera de estas solicitudes +de un archivo MIDI, es algo que depende totalmente de la +implementación del mismo: un dispositivo podría optar por ignorar +algunas o todas estas solicitudes. Asimismo, la forma en que un +dispositivo MIDI interpreta los diferentes valores de estos +controles (generalmente, el estándar MIDI determina el +comportamiento solamente en los puntos extremos del rango de +valores disponibles para cada control), y el hecho de si un +cambio en el valor de un control afecta a las notas que ya se +están reproduciendo sobre ese canal MIDI o no, también son +aspectos específicos de la implementación del dispositivo MIDI. + +Al generar archivos MIDI, LilyPond sencillamente convierte de +forma lineal los valores fraccionarios dentro de cada rango (7 +bits, o 14 bits para los controles de canal MIDI que admiten +resolución fina) en valores enteros dentro del rango +correspondiente (de 0 a 127 o de 0 a 32767, respectivamente), +redondeando los valores fraccionarios hacia el entero más próximo +en dirección opuesta al cero. Los valores enteros convertidos se +almacenan tal cual en el archivo MIDI generado. Consulte la +documentación de su dispositivo MIDI para ver información acerca +de cómo interpreta estos valores. + + +@node Enriquecimiento de la salida MIDI +@subsection Enriquecimiento de la salida MIDI +@translationof Enhancing MIDI output -@c TODO Expand with examples, and any other issues +@menu +* El script Articulate:: +@end menu -@knownissues +La salida MIDI predeterminada es muy básica, pero se puede +mejorar mediante la selección de los instrumentos MIDI las +propiedades del bloque @code{\midi} y/o usando el script +@file{articulate}. -Debido a que el estándar General MIDI no contiene golpes de aro -(@emph{rim shots}), para este propósito se utiliza en su lugar el -golpe lateral de baqueta (@emph{sidestick}). +@cindex instrumentos, nombres +@cindex MIDI, instrumentos +@cindex articulate, script +@cindex articulate.ly +@funindex Staff.midiInstrument @node El script Articulate @subsection El script Articulate @translationof The Articulate script -Es posible obtener una salida MIDI más real si se utiliza el -script Articulate. Éste trata de tener en cuenta las -articulaciones (ligaduras de expresión, picados, etc), mediante la -sustitución de las notas con secuencias musicales de silencios y -notas escaladas en el tiempo de forma apropiada. También trata de -desplegar los trinos, grupetos circulares, etc. y responder a las -indicaciones de rallentando y accelerando. - Para utilizar el script Articulate, tenemos que incluirlo al principio de nuestro archivo de entrada: @@ -3426,27 +3816,46 @@ principio de nuestro archivo de entrada: \include "articulate.ly" @end example -y en la sección @code{\score}, hacer lo siguiente: +El script crea una salida MIDI en que las notas tienen una +duración ajustada en el tiempo de forma que se correspondan con +una serie de indicaciones de articulación y de tempo. Sin +embargo, la salida tipografiada también se altera para reflejar +literalmente el contenido de la salida MIDI. @example -\unfoldRepeats \articulate << - resto de la partitura@dots{} ->> +\score @{ + \articulate << + @var{@dots{} music @dots{}} + >> + \midi @{ @} +@} @end example -Después de alterar el código de entrada de esta manera el -resultado visual se altera profundamente, pero el bloque -@code{\midi} estándar produce un archivo MIDI mejorado. +La instrucción @code{\articulate} habilita el procesado de las +abreviaturas como trinos y mordentes de varias notas. En el +propio script puede verse una lista completa de los elementos que +están previstos. Véase @file{ly/articulate.ly}. -Si bien no es esencial para que funcione el script Articulate, -podemos insertar la instrucción @code{\unfoldRepeats} según -aparece en el ejemplo anterior, dado que habilita la ejecución de -abreviaturas tales como los @notation{trinos}. +@seealso +Manual de aprendizaje: +@rlearning{Otras fuentes de información}. -@knownissues +Referencia de la notación: +@ref{Score layout}. + +Archivos instalados: +@file{ly/articulate.ly}. + +@warning{El script @file{articulate} puede acortar los acordes, +lo que podría no ser adecuado para algunos tipos de instrumento, +como el órgano. Las notas que no tienen ninguna articulación +también se pueden acortar; así, para contener el alcance +de este efecto limite +el uso de de la función @code{\articulate} a segmentos de música +más breves o modifique los valores de las variables definidas +dentro del script @file{articulate} +para compensar el efecto de acortamiento de las notas.} -Articulate acorta los acordes, y ciertos fragmentos de música -(especialmente la música de órgano) es posible que suene peor. @node Extraer información musical @@ -3495,6 +3904,25 @@ hacia un archivo. lilypond archivo.ly >resultado.txt @end example +@funindex \void +Observe que Lilypond no se limita a mostrar la expresión musical, +sino que también la interpreta (porque @code{\displayLilyMusic} +la devuelve además de mostrarla). Simplemente inserte +@code{\displayLilyMusic} dentro de +la música existente con el objeto de obtener información sobre +ella. + +Para interpretar y mostrar una sección de música en la consola, +y al mismo tiempo suprimirla del archivo de salida, +use la instrucción @code{\void}. + +@example +@{ + \void \displayLilyMusic \transpose c a, @{ c4 e g a bes @} + c1 +@} +@end example + @node Impresión de las expresiones musicales de Scheme @subsection Impresión de las expresiones musicales de Scheme @@ -3507,8 +3935,8 @@ Véase @rextend{Presentación de las expresiones musicales}. @subsection Guardar los eventos musicales en un archivo @translationof Saving music events to a file -Los eventos musicales se pueden guardar en un archivo pentagrama a -pentagrama mediante la inclusión de un archivo en nuestra +Los eventos musicales se pueden guardar en un archivo pentagrama +a pentagrama mediante la inclusión de un archivo en nuestra partitura principal. @example @@ -3517,10 +3945,10 @@ partitura principal. De esta forma se crean uno o más archivos llamados @file{FILENAME-STAFFNAME.notes} ó -@file{FILENAME-unnamed-staff.notes} para cada pentagrama. Observe -que si tiene más de un pentagrama sin nombre, los eventos de todos -los pentagramas se mezclarán entre sí dentro del mismo archivo. -El resultado tiene el aspecto siguiente: +@file{FILENAME-unnamed-staff.notes} para cada pentagrama. +Observe que si tiene más de un pentagrama sin nombre, los eventos +de todos los pentagramas se mezclarán entre sí dentro del mismo +archivo. El resultado tiene el aspecto siguiente: @example 0.000 note 57 4 p-c 2 12 @@ -3537,13 +3965,13 @@ tabulación, con dos campos fijos en cada línea seguidos de parámetros opcionales. @example -@var{tiempo} @var{tipo} @var{@dots{}parámetros@dots{}} +@var{tiempo} @var{tipo} @var{@dots{}parámetros@dots{}} @end example Esta información se puede leer fácilmente por parte de otros programas como guiones de Python, y pueden ser muy útiles para aquellos investigadores que desean realizar un análisis musical o -hacer experimientos de reproducción con LilyPond. +hacer experimentos de reproducción con LilyPond. @knownissues No todos los eventos musicales de lilypond están contemplados por diff --git a/Documentation/es/notation/keyboards.itely b/Documentation/es/notation/keyboards.itely index ef4962d579..65fa5258bb 100644 --- a/Documentation/es/notation/keyboards.itely +++ b/Documentation/es/notation/keyboards.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: a2030063498b24f5b08e10b0e429a12a82abbf2d + Translation of GIT committish: e6e59e19a164f0d3af53b0bde3798940de162d66 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.25" @node Teclados y otros instrumentos de varios pentagramas @section Teclados y otros instrumentos de varios pentagramas @@ -16,13 +16,13 @@ @lilypondfile[quote]{keyboard-headword.ly} -Esta sección se ocupa de varios aspectos de la notación musical que -son exclusivos de los instrumentos de teclado y otros instrumentos -cuya notación se realiza sobre varios pentagramas, como el arpa o el -vibráfono. A los efectos de nomenclatura, en esta sección se -denominan abreviadamente @qq{teclados} a todo este grupo de -instrumentos de varios pentagramas, aunque algunos de ellos no tienen -teclado. +Esta sección se ocupa de varios aspectos de la notación musical +que son exclusivos de los instrumentos de teclado y otros +instrumentos cuya notación se realiza sobre varios pentagramas, +como el arpa o el vibráfono. A los efectos de nomenclatura, en +esta sección se denominan abreviadamente @qq{teclados} a todo este +grupo de instrumentos de varios pentagramas, aunque algunos de +ellos no tienen teclado. @menu * Notación común para instrumentos de teclado:: @@ -36,8 +36,8 @@ teclado. @subsection Notación común para instrumentos de teclado @translationof Common notation for keyboards -Esta sección trata aspectos de notación que pueden aparecer en casi -todos los instrumentos de teclado. +Esta sección trata aspectos de notación que pueden aparecer en +casi todos los instrumentos de teclado. @menu * Referencias para teclados:: @@ -67,59 +67,64 @@ todos los instrumentos de teclado. La notación de los instrumentos de teclado se suele realizar con sistemas de piano. Éstos son dos pentagramas normales agrupados mediante una llave. También se utiliza esta notación para otros -instrumentos de teclado. La música de órgano se escribe normalmente -con dos pentagramas dentro de un grupo @code{PianoStaff} y un tercer -pentagrama normal para los pedales. +instrumentos de teclado. La música de órgano se escribe +normalmente con dos pentagramas dentro de un grupo +@code{PianoStaff} y un tercer pentagrama normal para los pedales. -Los pentagramas son hasta cierto punto independientes, pero a veces -las voces pueden cruzarse entre los dos pentagramas. Esta sección -trata técnicas de notación que son particulares de la música de -teclado. +Los pentagramas son hasta cierto punto independientes, pero a +veces las voces pueden cruzarse entre los dos pentagramas. Esta +sección trata técnicas de notación que son particulares de la +música de teclado. -En otros lugares se tratan varios problemas comunes de la música de -teclado: +En otros lugares se tratan varios problemas comunes de la música +de teclado: @itemize @item La música para teclado suele contener varias voces y el número de -éstas puede variar ampliamente; esto se describe en @ref{Resolución de las colisiones}. +éstas puede variar ampliamente; esto se describe en +@ref{Resolución de las colisiones}. -@item La música para teclado se puede escribir en paralelo, como se describe -en @ref{Escribir música en paralelo}. +@item La música para teclado se puede escribir en paralelo, como se +describe en @ref{Escribir música en paralelo}. @item Los matices dinámicos se pueden colocar en un contexto -@code{Dynamics}, entre los dos contextos @code{Staff} -para alinear las indicaciones de matiz sobre una línea horizontal -equidistante de los dos pentagramas; véase @ref{Matices dinámicos}. +@code{Dynamics}, entre los dos contextos @code{Staff} para alinear +las indicaciones de matiz sobre una línea horizontal equidistante +de los dos pentagramas; véase @ref{Matices dinámicos}. -@item Las digitaciones se indican como puede verse en @ref{Indicaciones de digitación}. +@item Las digitaciones se indican como puede verse en +@ref{Indicaciones de digitación}. -@item Las indicaciones de pedal de órgano se insertan como articulaciones, -véase @ref{Lista de articulaciones}. +@item Las indicaciones de pedal de órgano se insertan como +articulaciones, véase @ref{Lista de articulaciones}. -@item Las líneas verticales de rejilla se pueden mostrar como se describe en @ref{Líneas de rejilla}. +@item Las líneas verticales de rejilla se pueden mostrar como se +describe en @ref{Líneas de rejilla}. @item La música para teclado incluye con frecuencia ligaduras @notation{Laissez vibrer} así como ligaduras sobre arpegios y trémolos, descritos en @ref{Ligaduras de unión}. -@item La colocación de arpegios a través de varias voces y pentagramas se -cubre en @ref{Arpegio}. +@item La colocación de arpegios a través de varias voces y pentagramas +se cubre en @ref{Arpegio}. -@item Las indicaciones de trémolo se describen en @ref{Repeticiones de trémolo}. +@item Las indicaciones de trémolo se describen en +@ref{Repeticiones de trémolo}. -@item Varios de los trucos que pueden ser necesarios en música para teclado -se muestran en @rlearning{Ejemplos reales de música}. +@item Varios de los trucos que pueden ser necesarios en música para +teclado se muestran en @rlearning{Ejemplos reales de música}. -@item Las notas ocultas se pueden usar para producir ligaduras de unión que -se cruzan entre voces, como se explica en @rlearning{Otras aplicaciones de los trucos}. +@item Las notas ocultas se pueden usar para producir ligaduras de unión +que se cruzan entre voces, como se explica en +@rlearning{Otras aplicaciones de los trucos}. @end itemize @c @snippets @c @lilypondfile[verbatim,quote,texidoc,doctitle] @c {forcing-visibility-of-systems-with-multi-bar-rests-when-using-\RemoveEmptyStaffContext.ly} -@c http://lsr.dsi.unimi.it/LSR/Item?u=1&id=312 +@c http://lsr.di.unimi.it/LSR/Item?u=1&id=312 @seealso Manual de aprendizaje: @@ -158,9 +163,9 @@ Fragmentos de código: @cindex cruzado, pentagrama, barras de @funindex \change -@funindex change -Las voces se pueden cambiar de pentagrama manualmente usando la instrucción +Las voces se pueden cambiar de pentagrama manualmente usando la +instrucción @example \change Staff = @var{nombre_del_pentagrama} @@ -168,14 +173,14 @@ Las voces se pueden cambiar de pentagrama manualmente usando la instrucción @noindent La cadena @var{nombre_del_pentagrama} es el nombre del pentagrama. -Cambia la voz actual de su pentagrama en curso al pentagrama de nombre -@var{nombre_del_pentagrama}. Los valores más corrientes para -@var{nombre_del_pentagrama} son @code{"arriba"} y @code{"abajo"}, o -bien @code{"MD"} y @code{"MI"}. +Cambia la voz actual de su pentagrama en curso al pentagrama de +nombre @var{nombre_del_pentagrama}. Los valores más corrientes +para @var{nombre_del_pentagrama} son @code{"arriba"} y +@code{"abajo"}, o bien @code{"MD"} y @code{"MI"}. El pentagrama al que salta la voz debe existir en el momento del -salto. Si es necesario, los pentagramas se tienen que @qq{mantener -con vida}, véase @ref{Mantener vivos los contextos}. +salto. Si es necesario, los pentagramas se tienen que +@qq{mantener con vida}, véase @ref{Mantener vivos los contextos}. Las notas de pentagrama cruzado reciben la barra automáticamente: @@ -201,15 +206,16 @@ Las notas de pentagrama cruzado reciben la barra automáticamente: Si el barrado necesita algún trucaje, efectúe en primer lugar los cambios en las direcciones de las plicas. Las posiciones de las -barras se miden posteriormente a partir del centro del pentagrama que -está más cerca de la barra. Para ver un ejemplo sencillo de trucaje -de las barras, consulte @rlearning{Arreglar notación con superposiciones}. +barras se miden posteriormente a partir del centro del pentagrama +que está más cerca de la barra. Para ver un ejemplo sencillo de +trucaje de las barras, consulte +@rlearning{Arreglar notación con superposiciones}. @cindex colisiones de pentagrama cruzado @cindex colisiones, voces de pentagrama cruzado -Se puede producir una superposición en la notación cuando las voces se -cruzan de un pentagrama a otro: +Se puede producir una superposición en la notación cuando las +voces se cruzan de un pentagrama a otro: @lilypond[verbatim,quote] \new PianoStaff << @@ -236,13 +242,13 @@ cruzan de un pentagrama a otro: @end lilypond La plica y la ligadura de expresión se superponen a la línea del -símbolo de dinámica porque la resolución automática de colisiones se -suspende para las barras, ligaduras y otros objetos de extensión que -conectan notas situadas en distintos pentagramas, así como para las -plicas y articulaciones si su colocación está afectada por un objeto -de extensión de pentagrama cruzado. Las colisiones resultantes se -pueden resolver manualmente donde sea necesario, utilizando los -métodos descritos en la sección +símbolo de dinámica porque la resolución automática de colisiones +se suspende para las barras, ligaduras y otros objetos de +extensión que conectan notas situadas en distintos pentagramas, +así como para las plicas y articulaciones si su colocación está +afectada por un objeto de extensión de pentagrama cruzado. Las +colisiones resultantes se pueden resolver manualmente donde sea +necesario, utilizando los métodos descritos en la sección @rlearning{Arreglar notación con superposiciones}. @seealso @@ -263,8 +269,8 @@ Referencia de funcionamiento interno: @knownissues El mecanismo para evitar las colisiones de barras de corchea no -funciona para las barras automáticas que terminan justo antes de un -cambio de pauta. En este caso, utilice barras manuales. +funciona para las barras automáticas que terminan justo antes de +un cambio de pauta. En este caso, utilice barras manuales. @node Cambiar de pentagrama automáticamente @@ -276,11 +282,11 @@ cambio de pauta. En este caso, utilice barras manuales. @cindex pentagrama, cambio automático de @funindex \autochange -@funindex autochange @funindex PianoStaff Se puede hacer que las voces cambien automáticamente entre los -pentagramas inferior y superior. La sintaxis para conseguir esto es +pentagramas inferior y superior. La sintaxis para conseguir esto +es @example \autochange @dots{}@var{música}@dots{} @@ -288,12 +294,12 @@ pentagramas inferior y superior. La sintaxis para conseguir esto es @noindent Esto creará dos pentagramas dentro del grupo actual de pentagramas -(normalmente un @code{PianoStaff}), llamados @code{"up"} (arriba) y -@code{"down"} (abajo). El pentagrama inferior estará en clave de Fa -de forma predeterminada. El cambiador automático hace el cambio -basándose en la altura (el Do@tie{}central es el punto de inflexión), -y se adelanta saltando sobre los silencios para hacer cambios por -adelantado. +(normalmente un @code{PianoStaff}), llamados @code{"up"} (arriba) +y @code{"down"} (abajo). El pentagrama inferior estará en clave +de Fa de forma predeterminada. El cambiador automático hace el +cambio basándose en la altura (el Do@tie{}central es el punto de +inflexión), y se adelanta saltando sobre los silencios para hacer +cambios por adelantado. @lilypond[quote,verbatim] \new PianoStaff { @@ -304,27 +310,42 @@ adelantado. } @end lilypond +@noindent +Se pueden especificar otras notas para el punto de corte. Si los +pentagramas no han sido instanciados de forma explícita, se pueden +usar otras claves. + +@lilypond[quote,verbatim] +music = { + g8 b a c' b8 d' c'8 e' + d'8 r f' g' a'2 +} + +\autochange d' \music +\autochange b \with { \clef soprano } \music +\autochange d' \with { \clef alto } \with { \clef tenor } \music +@end lilypond + @cindex relativo, modo, autocambiador y @cindex autocambiador y el modo relativo @funindex \relative -@funindex relative Una sección marcada @code{\relative} que se encuentra fuera de -@code{\autochange} no tiene efecto sobre las notas de la música; por -tanto, en caso necesario escriba @code{\relative} dentro de +@code{\autochange} no tiene efecto sobre las notas de la música; +por tanto, en caso necesario escriba @code{\relative} dentro de @code{\autochange}. Si se necesita más control sobre los pentagramas individuales, se -pueden crear manualmente con los nombres @code{"up"} y @code{"down"}. -Entonces, la instrucción @code{\autochange} alternará su voz entre los -pentagramas existentes. +pueden crear manualmente con los nombres @code{"up"} y +@code{"down"}. Entonces, la instrucción @code{\autochange} +alternará su voz entre los pentagramas existentes. @warning{Si se crean los pentagramas manualmente, @emph{se deben} llamar @code{"up"} y @code{"down"} (en inglés).} -Por ejemplo, esto es necesario para colocar una armadura de tonalidad -en el pentagrama inferior: +Por ejemplo, esto es necesario para colocar una armadura de +tonalidad en el pentagrama inferior: @c Keep Ly needed, otherwise 'up' and 'down' get incorrectly translated in verbatim output @c KEEP LY @@ -333,7 +354,7 @@ en el pentagrama inferior: \new Staff = "up" { \new Voice = "melodiaUno" { \key g \major - \autochange \relative c' { + \autochange \relative { g8 b a c b d c e d8 r fis, g a2 } @@ -359,9 +380,9 @@ Referencia de funcionamiento interno: @knownissues @cindex acordes, división entre pentagramas con \autochange -Los cambios de pentagrama pueden no acabar en lugares óptimos. Para -conseguir una salida de alta calidad es mejor especificar manualmente -los cambios de pentagrama. +Los cambios de pentagrama pueden no acabar en lugares óptimos. +Para conseguir una salida de alta calidad es mejor especificar +manualmente los cambios de pentagrama. Los acordes no se dividen entre los pentagramas; se asignan a un pentagrama en función de la primera nota nombrada dentro de la @@ -386,18 +407,16 @@ construcción del acorde. @funindex followVoice @funindex \showStaffSwitch -@funindex showStaffSwitch @funindex \hideStaffSwitch -@funindex hideStaffSwitch Cuando una voz cambia a otro pentagrama, se puede imprimir automáticamente una línea que conecte las notas: -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim] \new PianoStaff << \new Staff = "one" { \showStaffSwitch - c1 + c'1 \change Staff = "two" b2 a } @@ -443,17 +462,18 @@ Referencia de funcionamiento interno: @funindex \autoBeamOff @funindex Span_stem_engraver -Se pueden hacer acordes que cruzan los pentagramas usando el grabador -@code{Span_stem_engraver}. Debe tenerse cuidado para estar seguro de -que las barras automáticas no unen las notas de una pauta cuando no es -necesario que estén unidas en la otra pauta. +Se pueden hacer acordes que cruzan los pentagramas usando el +grabador @code{Span_stem_engraver}. Debe tenerse cuidado para +estar seguro de que las barras automáticas no unen las notas de +una pauta cuando no es necesario que estén unidas en la otra +pauta. @lilypondfile[verbatim,quote] {cross-staff-stems.ly} -Por el momento no se puede especificar este grabador por su -nombre entre comillas, sino prefijando el nombre con un símbolo -de almohadilla @code{#}, a causa de la manera en que está +Por el momento no se puede especificar este grabador por su nombre +entre comillas, sino prefijando el nombre con un símbolo de +almohadilla @code{#}, a causa de la manera en que está implementado. @snippets @@ -498,33 +518,29 @@ relacionados con el piano. @cindex U.C. @funindex \sustainOn -@funindex sustainOn @funindex \sustainOff -@funindex sustainOff @funindex \sostenutoOn -@funindex sostenutoOn @funindex \sostenutoOff -@funindex sostenutoOff @funindex \unaCorda -@funindex unaCorda @funindex \treCorde -@funindex treCorde En general, los pianos tienen tres pedales que alteran la forma de producir el sonido: el pedal de mantenimiento (pedal @notation{derecho} o pedal @notation{forte}), el pedal @notation{sostenuto} (@notation{sos.}, pedal central) y el pedal -@notation{una corda} (@notation{U.C.}, pedal izquierdo). Los pedales -de mantenimiento como el pedal derecho del piano se encuentran también -en el vibráfono y en la celesta. - -@lilypond[quote,verbatim,relative=2] -c4\sustainOn d e g -1\sustainOff -c4\sostenutoOn e g c, -1\sostenutoOff -c4\unaCorda d e g -1\treCorde +@notation{una corda} (@notation{U.C.}, pedal izquierdo). Los +pedales de mantenimiento como el pedal derecho del piano se +encuentran también en el vibráfono y en la celesta. + +@lilypond[quote,verbatim] +\relative { + c''4\sustainOn d e g + 1\sustainOff + c4\sostenutoOn e g c, + 1\sostenutoOff + c4\unaCorda d e g + 1\treCorde +} @end lilypond @cindex pedal, estilos de indicación @@ -540,25 +556,28 @@ c4\unaCorda d e g @funindex text Existen tres estilos de indicaciones de pedal: textual, corchete y -mixta. El pedal derecho y el pedal de una corda utilizan el estilo -textual de forma predeterminada, mientras que el pedal sostenuto -utiliza el método mixto de forma predeterminada. - -@lilypond[quote,verbatim,relative=2] -c4\sustainOn g c2\sustainOff -\set Staff.pedalSustainStyle = #'mixed -c4\sustainOn g c d -d\sustainOff\sustainOn g, c2\sustainOff -\set Staff.pedalSustainStyle = #'bracket -c4\sustainOn g c d -d\sustainOff\sustainOn g, c2 -\bar "|." +mixta. El pedal derecho y el pedal de una corda utilizan el +estilo textual de forma predeterminada, mientras que el pedal +sostenuto utiliza el método mixto de forma predeterminada. + +@lilypond[quote,verbatim] +\relative { + c''4\sustainOn g c2\sustainOff + \set Staff.pedalSustainStyle = #'mixed + c4\sustainOn g c d + d\sustainOff\sustainOn g, c2\sustainOff + \set Staff.pedalSustainStyle = #'bracket + c4\sustainOn g c d + d\sustainOff\sustainOn g, c2 + \bar "|." +} @end lilypond La colocación de las instrucciones de pedal se corresponden con el -movimiento físico del pedal derecho en el transcurso de la ejecución. -La pedalización hasta la barra final de compás se indica mediante la -omisión de la instrucción final de levantar el pedal. +movimiento físico del pedal derecho en el transcurso de la +ejecución. La pedalización hasta la barra final de compás se +indica mediante la omisión de la instrucción final de levantar el +pedal. Las indicaciones de pedal se pueden poner dentro de un contexto @code{Dynamics}, que los alinea sobre una línea horizontal. @@ -590,7 +609,8 @@ Referencia de funcionamiento interno: @cindex acordeón -Esta sección se ocupa de la notación que es exclusiva del acordeón. +Esta sección se ocupa de la notación que es exclusiva del +acordeón. @menu * Símbolos de Discanto:: @@ -606,19 +626,19 @@ Esta sección se ocupa de la notación que es exclusiva del acordeón. @cindex acordeón, cambios en el @cindex acordeón, signos de cambio en el -Los acordeones se suelen construir con más de un conjunto de lengüetas -que pueden estar al unísono, una octava por encima, o una octava por -debajo de la altura escrita. Cada fabricante de acordeones utiliza -distintos nombres para los @notation{cambios} que seleccionan las -distintas combinaciones de lengüetas, como @notation{oboe}, -@notation{musette} o @notation{bandoneón}, de manera que ha entrado -en uso un sistema de signos para simplificar las instrucciones de -ejecución. +Los acordeones se suelen construir con más de un conjunto de +lengüetas que pueden estar al unísono, una octava por encima, o +una octava por debajo de la altura escrita. Cada fabricante de +acordeones utiliza distintos nombres para los @notation{cambios} +que seleccionan las distintas combinaciones de lengüetas, como +@notation{oboe}, @notation{musette} o @notation{bandoneón}, de +manera que ha entrado en uso un sistema de signos para simplificar +las instrucciones de ejecución. @snippets @lilypondfile[verbatim,quote,texidoc,doctitle] -{accordion-registers.ly} +{accordion-register-symbols.ly} @seealso Fragmentos de código: @@ -643,19 +663,22 @@ Esta sección trata sobre asuntos de notación específicos del arpa. @cindex harps @cindex bisbiglando -Ciertas características comunes de la música de arpa se estudian en -otras partes de la documentación: +Ciertas características comunes de la música de arpa se estudian +en otras partes de la documentación: @itemize @item El glissando es la técnica más característica del arpa, @ref{Glissando}. -@item El @notation{bisbigliando} se escribe como un trémolo, @ref{Repeticiones de trémolo}. +@item El @notation{bisbigliando} se escribe como un trémolo, +@ref{Repeticiones de trémolo}. -@item Los armónicos naturales se estudian bajo el epígrafe @ref{Armónicos}. +@item Los armónicos naturales se estudian bajo el epígrafe +@ref{Armónicos}. -@item Para los arpegios dirigidos y los no arpegios, véase @ref{Arpegio}. +@item Para los arpegios dirigidos y los no arpegios, véase +@ref{Arpegio}. @end itemize @@ -676,37 +699,37 @@ Referencia de la notación: @cindex pedales del arpa @cindex pedales del arpa, diagramas -Las arpas tienen siete cuerdas por octava que pueden sonar a la altura -natural, bemol o sostenido. En el arpa de palancas o arpa celta, cada -cuerda se ajusta individualmente, pero en las arpas de pedales todas -las cuerdas con igual nombre de nota se controlan por un único -pedal. Visto de izquierda a derecha desde la posición del ejecutante, -los pedales son Re, Do y Si a la izquierda y Mi, Fa, Sol y La a la -derecha. La posición de los pedales se puede indicar con indicaciones -textuales: +Las arpas tienen siete cuerdas por octava que pueden sonar a la +altura natural, bemol o sostenido. En el arpa de palancas o arpa +celta, cada cuerda se ajusta individualmente, pero en las arpas de +pedales todas las cuerdas con igual nombre de nota se controlan +por un único pedal. Visto de izquierda a derecha desde la posición +del ejecutante, los pedales son Re, Do y Si a la izquierda y Mi, +Fa, Sol y La a la derecha. La posición de los pedales se puede +indicar con indicaciones textuales: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \textLengthOn -cis1_\markup \concat \vcenter { +cis''1_\markup \concat \vcenter { [D \flat C \sharp B|E \sharp F \sharp G A \flat] } -c!1_\markup \concat \vcenter { +c''!1_\markup \concat \vcenter { [ C \natural ] } @end lilypond o mediante diagramas de pedal: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \textLengthOn -cis1_\markup { \harp-pedal #"^v-|vv-^" } -c!1_\markup { \harp-pedal #"^o--|vv-^" } +cis''1_\markup { \harp-pedal #"^v-|vv-^" } +c''!1_\markup { \harp-pedal #"^o--|vv-^" } @end lilypond -La instrucción @code{\harp-pedal} acepta una cadena de caracteres en -la que @code{^} es la posición alta del pedal (altura bemol), @code{-} -es la posición intermedia (altura natural), @code{v} es la posición -baja (altura sostenido), y @code{|} es la línea vertical separadora. -Si se antepone @code{o}, el siguiente símbolo de pedal se rodea por -una elipse. +La instrucción @code{\harp-pedal} acepta una cadena de caracteres +en la que @code{^} es la posición alta del pedal (altura bemol), +@code{-} es la posición intermedia (altura natural), @code{v} es +la posición baja (altura sostenido), y @code{|} es la línea +vertical separadora. Si se antepone @code{o}, el siguiente +símbolo de pedal se rodea por una elipse. @seealso Referencia de la notación: diff --git a/Documentation/es/notation/notation-appendices.itely b/Documentation/es/notation/notation-appendices.itely index 89bf583569..cd96f25151 100644 --- a/Documentation/es/notation/notation-appendices.itely +++ b/Documentation/es/notation/notation-appendices.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 4cd16b30ea12e67d0c67c3e5663db113ae95db5f + Translation of GIT committish: 0b22ae65f4614b93ba9d604d3a164816b2baac42 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.28" @node Tablas del manual sobre notación @appendix Tablas del manual sobre notación @@ -20,10 +20,11 @@ * Afinaciones de cuerdas predefinidas:: * Diagramas predefinidos de posiciones:: * Tamaños de página predefinidos:: -* instrumentos MIDI:: +* Instrumentos MIDI:: * Lista de colores:: * La tipografía Feta:: * Estilos de cabezas de nota:: +* Estilos de clave:: * Instrucciones de marcado de texto:: * Instrucciones de listas de marcado de texto:: * Lista de caracteres especiales:: @@ -54,8 +55,8 @@ nombres de los acordes, junto a las notas que representan. @appendixsec Modificadores de acorde más usuales @translationof Common chord modifiers -La tabla siguiente presenta los modificadores de acorde que se pueden -usar para generar las estructuras de acordes estándar. +La tabla siguiente presenta los modificadores de acorde que se +pueden usar para generar las estructuras de acordes estándar. @multitable @columnfractions .2 .25 .2 .15 .2 @@ -206,7 +207,7 @@ Tríada aumentada y séptima @*menor @tab @code{aug7} @tab -@code{c1:aug} +@code{c1:aug7} @tab @lilypond[line-width=2.1\cm,noragged-right,notime] << @@ -238,7 +239,7 @@ Tríada menor con séptima @*mayor @tab @code{m7+} @tab -@code{m7+} +@code{c1:m7+} @tab @lilypond[line-width=2.1\cm,noragged-right,notime] << @@ -478,10 +479,10 @@ Quinta justa @tab @code{1.5} @tab -@code{\powerChords c1:1.5} +@code{\powerChords c1:5} @tab @lilypond[line-width=2.1\cm,noragged-right,notime] -\chordmode { \powerChords c1:1.5 } +\chordmode { \powerChords c1:5 } @end lilypond @item @@ -491,10 +492,10 @@ Quinta justa, @*octava @tab @code{1.5.8} @tab -@code{\powerChords c1:1.5.8} +@code{\powerChords c1:5.8} @tab @lilypond[line-width=2.1\cm,noragged-right,notime] - \chordmode { \powerChords c1:1.5.8 } + \chordmode { \powerChords c1:5.8 } @end lilypond @end multitable @@ -503,7 +504,8 @@ Quinta justa, @*octava @appendixsec Afinaciones de cuerdas predefinidas @translationof Predefined string tunings -El cuadro de abajo muestra las afinaciones predefinidas de cuerdas. +El cuadro de abajo muestra las afinaciones predefinidas de +cuerdas. @lilypondfile{display-predefined-string-tunings.ly} @@ -786,16 +788,16 @@ Los tamaños de página se definen en el archivo @file{scm/paper.scm} (74 x 52 mm) @end table -@c lowercase to avoid duplicate node. FV -@node instrumentos MIDI -@appendixsec instrumentos MIDI + +@node Instrumentos MIDI +@appendixsec Instrumentos MIDI @translationof MIDI instruments -A continuación figura una lista con los nombres que se pueden utilizar -para la propiedad @code{midiInstrument} (instrumento MIDI). El orden -de los instrumentos que aparece aquí, de arriba a abajo empezando por -la columna de la izquierda, corresponde a los 128 números de programa -del estándar General MIDI. +A continuación figura una lista con los nombres que se pueden +utilizar para la propiedad @code{midiInstrument} (instrumento +MIDI). El orden de los instrumentos que aparece aquí, de arriba a +abajo empezando por la columna de la izquierda, corresponde a los +128 números de programa del estándar General MIDI. @example acoustic grand contrabass lead 7 (fifths) @@ -850,7 +852,8 @@ cello lead 6 (voice) @subsubheading Colores normales -La sintaxis para el uso de colores se encuentra detallada en @ref{Colorear objetos}. +La sintaxis para el uso de colores se encuentra detallada en +@ref{Colorear objetos}. @cindex lista de colores @cindex colores, lista de @@ -868,13 +871,15 @@ darkcyan darkmagenta darkyellow Los nombres de los colores de X admiten algunas variantes: Un nombre que se escribe como una palabra única con mayúsculas -intercaladas (p.ej. @q{LightSlateBlue}) se puede escribir también como -palabras separadas por espacios y sin mayúsculas (p.ej. @q{light slate -blue}). +intercaladas (p.ej. @q{LightSlateBlue}) se puede escribir también +como palabras separadas por espacios y sin mayúsculas +(p.ej. @q{light slate blue}). -La palabra @q{grey} siempre se puede escribir como @q{gray} (p.ej. @q{DarkSlateGray}). +La palabra @q{grey} siempre se puede escribir como @q{gray} +(p.ej. @q{DarkSlateGray}). -Algunos nombres admiten un sufijo numérico (p.ej. @q{LightSalmon4}). +Algunos nombres admiten un sufijo numérico +(p.ej. @q{LightSalmon4}). @subsubheading Nombres de los colores sin sufijo numérico: @@ -954,13 +959,13 @@ donde N es un número entre 0 y 100. @cindex Feta, tipografía @cindex tipografía Feta -Los símbolos siguientes están disponibles en la tipografía Emmentaler -y es posible acceder a ellos directamente utilizando elementos de -marcado textual con el nombre del glifo -tal y como se muestra en las tablas de abajo, -por ejemplo @code{g^\markup @{\musicglyph #"scripts.segno" @}} ó -@code{\markup @{\musicglyph #"five"@}}. Para ver más información, -consulte @ref{Formatear el texto}. +Los símbolos siguientes están disponibles en la tipografía +Emmentaler y es posible acceder a ellos directamente utilizando +elementos de marcado textual con el nombre del glifo tal y como se +muestra en las tablas de abajo, por ejemplo @code{g^\markup +@{\musicglyph #"scripts.segno" @}} ó @code{\markup @{\musicglyph +#"five"@}}. Para ver más información, consulte @ref{Formatear el +texto}. @menu * Glifos de clave:: @@ -1271,11 +1276,248 @@ consulte @ref{Formatear el texto}. @translationof Note head styles @cindex nota, estilos de cabeza -Se pueden usar los siguientes estilos para las cabezas de las notas. +Se pueden usar los siguientes estilos para las cabezas de las +notas. @lilypondfile[noindent]{note-head-style.ly} +@node Estilos de clave +@appendixsec Estilos de clave +@translationof Clef styles + +La tabla siguiente presenta los distintos estilos de clave +posibles y el lugar del @emph{Do central} en cada una. + +@multitable @columnfractions .30 .2 .30 .2 + +@headitem +Ejemplo +@tab +Salida +@tab +Ejemplo +@tab +Salida + + +@item +@code{\clef G} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef G c1 +@end lilypond + +@tab +@code{\clef "G2"} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef "G2" +c1 +@end lilypond + +@item +@code{\clef treble} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef treble +c1 +@end lilypond + +@tab +@code{\clef violin} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef violin +c1 +@end lilypond + +@item +@code{\clef french} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef french +c1 +@end lilypond + +@tab +@code{\clef GG} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef GG +c1 +@end lilypond + +@item +@code{\clef tenorG} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef tenorG +c1 +@end lilypond + +@tab +@code{\clef soprano} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef soprano +c1 +@end lilypond + +@item +@code{\clef mezzosoprano} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef mezzosoprano +c1 +@end lilypond + +@tab +@code{\clef C} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef C +c1 +@end lilypond + +@item +@code{\clef alto} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef alto +c1 +@end lilypond + +@tab +@code{\clef tenor} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef tenor +c1 +@end lilypond + +@item +@code{\clef baritone} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef baritone +c1 +@end lilypond + +@tab +@code{\clef varC} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef varC +c1 +@end lilypond + +@item +@code{\clef altovarC} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef altovarC +c1 +@end lilypond + +@tab +@code{\clef tenorvarC} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef tenorvarC +c1 +@end lilypond + +@item +@code{\clef baritonevarC} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef baritonevarC +c1 +@end lilypond + +@tab +@code{\clef varbaritone} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef varbaritone +c1 +@end lilypond + +@item +@code{\clef baritonevarF} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef baritonevarF +c1 +@end lilypond + +@tab +@code{\clef F} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef F +c1 +@end lilypond + +@item +@code{\clef bass} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef bass +c1 +@end lilypond + +@tab +@code{\clef subbass} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef subbass +c1 +@end lilypond + +@item +@code{\clef percussion} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef percussion +c1 +@end lilypond + +@tab +@c @example does not work as expected within multitables +@code{ +\new TabStaff @{ @* +@ @ \clef tab @* +@} +} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\new TabStaff { + \clef tab + c1 +} +@end lilypond + +@item +@c @example does not work as expected within multitables +@code{ +\new TabStaff @{ @* +@ @ \clef moderntab @* +@} +} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\new TabStaff { + \clef moderntab + c1 +} +@end lilypond + + +@end multitable + + @node Instrucciones de marcado de texto @appendixsec Instrucciones de marcado de texto @translationof Text markup commands @@ -1297,15 +1539,15 @@ Se puede usar cualquiera de las siguientes instrucciones con @appendixsec Lista de caracteres especiales @translationof List of special characters -Se pueden usar las siguientes referencias a carcteres especiales; para -ver más detalles, consulte @ref{Alias de ASCII}. +Se pueden usar las siguientes referencias a carcteres especiales; +para ver más detalles, consulte @ref{Alias de ASCII}. Se usa la sintaxis del HTML y casi todas estas referencias son las mismas que en el HTML. El resto están inspiradas en @LaTeX{}. -Los caracteres están enmarcados en un rectángulo de forma que pueda -verse el tamaño que tienen. Se ha añadido un pequeño relleno de -separación entre el carácter y el rectángulo para mejorar la +Los caracteres están enmarcados en un rectángulo de forma que +pueda verse el tamaño que tienen. Se ha añadido un pequeño relleno +de separación entre el carácter y el rectángulo para mejorar la legibilidad. @lilypond[quote] @@ -1317,63 +1559,12 @@ legibilidad. @appendixsec Lista de articulaciones @translationof List of articulations -@cindex acento -@cindex apagado -@cindex arco abajo -@cindex arco arriba -@cindex calderón -@cindex circulus -@cindex coda -@cindex downbow -@cindex downmordent -@cindex downprall -@cindex espressivo -@cindex fermata -@cindex flageolet -@cindex grupeto circular -@cindex grupeto circular invertido -@cindex halfopen -@cindex ictus -@cindex indicación de pulgar -@cindex lheel -@cindex lineprall -@cindex longfermata -@cindex ltoe -@cindex marcas de pie -@cindex marcato -@cindex mordent -@cindex open -@cindex órgano, indicaciones de pedal de -@cindex pedal, indicaciones de -@cindex portato -@cindex prall -@cindex pralldown -@cindex prallmordent -@cindex prallprall -@cindex prallup -@cindex pulgar, indicación de -@cindex reverseturn -@cindex rheel -@cindex rtoe -@cindex segno -@cindex semicirculus -@cindex semitrino -@cindex semitrino descendente -@cindex shortfermata -@cindex signumcongruentiae -@cindex snappizzicato -@cindex staccatissimo -@cindex staccato -@cindex tenuto -@cindex trill -@cindex trino -@cindex upmordent -@cindex upprall -@cindex varcoda -@cindex verylongfermata -Las siguientes inscripciones están disponibles en la tipografía Feta y -se pueden adjuntar a las notas (p.ej. @samp{c\accent}). +Las listas siguientes relacionan todos los símbolos de la +tipografía Feta que se pueden adjuntar a las notas +(p. ej. @samp{f\accent} o @samp{f->}). Cada ejemplo muestra el +símbolo en las posiciones @emph{superior}, @emph{inferior} y +@emph{neutra}, respectivamente. @c Articulations and ornamentations @c Fingering instructions (for "thumb") @@ -1394,73 +1585,809 @@ se pueden adjuntar a las notas (p.ej. @samp{c\accent}). * Indicaciones antiguas:: @end menu +@ignore +The @multitable @columnfraction value discrepancy between the first and +the remaining columns is deliberate; it seems (at least visually +anyway) the gap (after building the documentation) between first and +second column examples was always larger than between the remaining +columns - JL +@end ignore + +@cindex accent +@cindex espressivo +@cindex marcato +@cindex portato +@cindex staccatissimo +@cindex staccato +@cindex tenuto +@cindex thumb @node Indicaciones de articulación @unnumberedsubsec Indicaciones de articulación @translationof Articulation scripts -@lilypond[quote] -\include "script-chart.ly" -\new RhythmicStaff { \scriptStaff #articulations } +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\accent} or @code{->} +@lilypond[notime,relative=2] +f^\accent e,_\accent b'\accent +@end lilypond +@tab +@code{\espressivo} +@lilypond[notime,relative=2] +f^\espressivo e,_\espressivo b'\espressivo +@end lilypond +@tab +@code{\marcato} or @code{-^} +@lilypond[notime,relative=2] +f^\marcato e,_\marcato b'\marcato +@end lilypond +@tab +@code{\portato} or @code{-_} +@lilypond[notime,relative=2] +f^\portato e,_\portato b'\portato @end lilypond +@item +@code{\staccatissimo} @* or @code{-!} +@lilypond[notime,relative=2] +f^\staccatissimo e,_\staccatissimo b'\staccatissimo +@end lilypond +@tab +@code{\staccato} or @code{-.} +@lilypond[notime,relative=2] +f^\staccato e,_\staccato b'\staccato +@end lilypond +@tab +@code{\tenuto} or @code{--} +@lilypond[notime,relative=2] +f^\tenuto e,_\tenuto b'\tenuto +@end lilypond + +@end multitable + +@cindex prall +@cindex prallup +@cindex pralldown +@cindex upprall +@cindex downprall +@cindex prallprall +@cindex lineprall +@cindex prallmordent +@cindex mordent +@cindex upmordent +@cindex downmordent +@cindex trill +@cindex turn +@cindex reverseturn @node Indicaciones de adornos @unnumberedsubsec Indicaciones de adornos @translationof Ornament scripts -@lilypond[quote] -\include "script-chart.ly" -\new RhythmicStaff { \scriptStaff #ornaments } +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\prall} +@lilypond[notime,relative=2] +f^\prall e,_\prall b'\prall +@end lilypond +@tab +@code{\prallup} +@lilypond[notime,relative=2] +f^\prallup e,_\prallup b'\prallup +@end lilypond +@tab +@code{\pralldown} +@lilypond[notime,relative=2] +f^\pralldown e,_\pralldown b'\pralldown +@end lilypond +@tab +@code{\upprall} +@lilypond[notime,relative=2] +f^\upprall e,_\upprall b'\upprall @end lilypond +@item +@code{\downprall} +@lilypond[notime,relative=2] +f^\downprall e,_\downprall b'\downprall +@end lilypond +@tab +@code{\prallprall} +@lilypond[notime,relative=2] +f^\prallprall e,_\prallprall b'\prallprall +@end lilypond +@tab +@code{\lineprall} +@lilypond[notime,relative=2] +f^\lineprall e,_\lineprall b'\lineprall +@end lilypond +@tab +@code{\prallmordent} +@lilypond[notime,relative=2] +f^\prallmordent e,_\prallmordent b'\prallmordent +@end lilypond + +@item +@code{\mordent} +@lilypond[notime,relative=2] +f^\mordent e,_\mordent b'\mordent +@end lilypond +@tab +@code{\upmordent} +@lilypond[notime,relative=2] +f^\upmordent e,_\upmordent b'\upmordent +@end lilypond +@tab +@code{\downmordent} +@lilypond[notime,relative=2] +f^\downmordent e,_\downmordent b'\downmordent +@end lilypond +@tab +@code{\trill} +@lilypond[notime,relative=2] +f^\trill e,_\trill b'\trill +@end lilypond + +@item +@code{\turn} +@lilypond[notime,relative=2] +f^\turn e,_\turn b'\reverseturn +@end lilypond +@tab +@code{\reverseturn} +@lilypond[notime,relative=2] +f^\reverseturn e,_\reverseturn b'\reverseturn +@end lilypond + +@end multitable + +@cindex fermata +@cindex shortfermata +@cindex longfermata +@cindex verylongfermata @node Indicaciones de calderón @unnumberedsubsec Indicaciones de calderón @translationof Fermata scripts -@lilypond[quote] -\include "script-chart.ly" -\new RhythmicStaff { \scriptStaff #fermatas } +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\shortfermata} +@lilypond[notime,relative=2] +f^\shortfermata e,_\shortfermata b'\shortfermata +@end lilypond +@tab +@code{\fermata} +@lilypond[notime,relative=2] +f^\fermata e,_\fermata b'\fermata +@end lilypond +@tab +@code{\longfermata} +@lilypond[notime,relative=2] +f^\longfermata e,_\longfermata b'\longfermata +@end lilypond +@tab +@code{\verylongfermata} +@lilypond[notime,relative=2] +f^\verylongfermata e,_\verylongfermata b'\verylongfermata @end lilypond +@end multitable + +@cindex upbow +@cindex downbow +@cindex flageolet +@cindex open +@cindex halfopen +@cindex lheel +@cindex rheel +@cindex ltoe +@cindex rtoe +@cindex snappizzicato +@cindex stopped @node Indicaciones específicas de ciertos instrumentos @unnumberedsubsec Indicaciones específicas de ciertos instrumentos @translationof Instrument-specific scripts -@lilypond[quote] -\include "script-chart.ly" -\new RhythmicStaff { \scriptStaff #instrument-specific } +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\upbow} +@lilypond[notime,relative=2] +f^\upbow e,_\upbow b'\upbow +@end lilypond +@tab +@code{\downbow} +@lilypond[notime,relative=2] +f^\downbow e,_\downbow b'\downbow +@end lilypond +@tab +@code{\flageolet} +@lilypond[notime,relative=2] +f^\flageolet e,_\flageolet b'\flageolet +@end lilypond +@tab +@code{\open} +@lilypond[notime,relative=2] +f^\open e,_\open b'\open @end lilypond +@item +@code{\halfopen} +@lilypond[notime,relative=2] +f^\halfopen e,_\halfopen b'\halfopen +@end lilypond +@tab +@code{\lheel} +@lilypond[notime,relative=2] +f^\lheel e,_\lheel b'\lheel +@end lilypond +@tab +@code{\rheel} +@lilypond[notime,relative=2] +f^\rheel e,_\rheel b'\rheel +@end lilypond +@tab +@code{\ltoe} +@lilypond[notime,relative=2] +f^\ltoe e,_\ltoe b'\ltoe +@end lilypond + +@item +@code{\rtoe} +@lilypond[notime,relative=2] +f^\rtoe e,_\rtoe b'\rtoe +@end lilypond +@tab +@code{\snappizzicato} +@lilypond[notime,relative=2] +f^\snappizzicato e,_\snappizzicato b'\snappizzicato +@end lilypond +@tab +@code{\stopped} or @code{-+} +@lilypond[notime,relative=2] +f^\stopped e,_\stopped b'\stopped +@end lilypond + +@end multitable + +@cindex segno +@cindex coda +@cindex varcoda @node Indicaciones de repetición @unnumberedsubsec Indicaciones de repetición @translationof Repeat sign scripts -@lilypond[quote] -\include "script-chart.ly" -\new RhythmicStaff { \scriptStaff #repeats } +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\segno} +@lilypond[notime,relative=2] +f^\segno e,_\segno b'\segno +@end lilypond +@tab +@code{\coda} +@lilypond[notime,relative=2] +f^\coda e,_\coda b'\coda +@end lilypond +@tab +@code{\varcoda} +@lilypond[notime,relative=2] +f^\varcoda e,_\varcoda b'\varcoda @end lilypond +@end multitable + +@cindex accentus +@cindex circulus +@cindex ictus +@cindex semicirculus +@cindex signumcongruentiae @node Indicaciones antiguas @unnumberedsubsec Indicaciones antiguas @translationof Ancient scripts -@lilypond[quote] -\include "script-chart.ly" +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\accentus} +@lilypond[notime] +\include "gregorian.ly" +\new VaticanaStaff { e'^\accentus s4 f_\accentus s4 b\accentus} +@end lilypond +@tab +@code{\circulus} +@lilypond[notime] +\include "gregorian.ly" +\new VaticanaStaff { e'^\circulus s4 f_\circulus s4 b\circulus } +@end lilypond +@tab +@code{\ictus} +@lilypond[notime] +\include "gregorian.ly" +\new VaticanaStaff { e'^\ictus s4 f_\ictus s4 b\ictus} +@end lilypond + +@item +@code{\semicirculus} +@lilypond[notime] +\include "gregorian.ly" +\new VaticanaStaff { + e'^\semicirculus s4 f_\semicirculus s4 b\semicirculus +} +@end lilypond +@tab +@code{\signumcongruentiae} +@lilypond[notime] \include "gregorian.ly" -\new VaticanaStaff { \scriptStaffAncient #ancient } +\new VaticanaStaff { + e'^\signumcongruentiae s4 + f_\signumcongruentiae s4 + b\signumcongruentiae +} @end lilypond +@end multitable + +@cindex drums, various +@cindex acoustic bass +@cindex bass +@cindex snare +@cindex electric snare +@cindex acoustic snare +@cindex tom tom +@cindex bongo +@cindex conga +@cindex timbale +@cindex sidestick +@cindex floor tom tom +@cindex low tom tom +@cindex high tom tom +@cindex mid tom tom +@cindex high hat +@cindex pedal high hat +@cindex open high hat +@cindex half-open high hat +@cindex cymbal, various +@cindex crash cymbal +@cindex ride cymbal +@cindex chinese cymbal +@cindex splash cymbal +@cindex ride bell +@cindex cowbell +@cindex agogo +@cindex high bongo +@cindex low bongo +@cindex mute bongo +@cindex open bongo +@cindex high conga +@cindex low conga +@cindex mute conga +@cindex open conga +@cindex high timbale +@cindex low timbale +@cindex mute timbale +@cindex open timbale +@cindex sidestick +@cindex guiro +@cindex cabasa +@cindex maracas +@cindex whistle +@cindex handclap +@cindex tambourine +@cindex vibraslap +@cindex tam tam +@cindex claves +@cindex woodblock +@cindex cuica +@cindex triangle @node Notas de percusión @appendixsec Notas de percusión @translationof Percussion notes -@lilypondfile[quote]{percussion-chart.ly} +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{bassdrum @* bd @*} +@lilypond[notime,ragged-right] +\drums { bd4 bd1 } +@end lilypond +@tab +@code{acousticbassdrum @* bda @*} +@lilypond[notime,ragged-right] +\drums { bda4 bda1 } +@end lilypond +@tab +@code{snare @* sn @*} +@lilypond[notime,ragged-right] +\drums { sn4 sn1 } +@end lilypond +@tab +@code{acousticsnare @* sna @*} +@lilypond[notime,ragged-right] +\drums { sna4 sna1 } +@end lilypond + +@item +@code{electricsnare @* sne @*} +@lilypond[notime,ragged-right] +\drums { sne4 sne1 } +@end lilypond +@tab +@code{lowfloortom @* tomfl @*} +@lilypond[notime,ragged-right] +\drums { tomfl4 tomfl1 } +@end lilypond +@tab +@code{highfloortom @* tomfh @*} +@lilypond[notime,ragged-right] +\drums { tomfh4 tomfh1 } +@end lilypond +@tab +@code{lowtom @* toml @*} +@lilypond[notime,ragged-right] +\drums { toml4 toml1 } +@end lilypond + +@item +@code{hightom @* tomh @*} +@lilypond[notime,ragged-right] +\drums { tomh4 tomh1 } +@end lilypond +@tab +@code{lowmidtom @* tomml @*} +@lilypond[notime,ragged-right] +\drums { tomml4 tomml1 } +@end lilypond +@tab +@code{highmidtom @* tommh @*} +@lilypond[notime,ragged-right] +\drums { tommh4 tommh1 } +@end lilypond +@tab +@code{highhat @* hh @*} +@lilypond[notime,ragged-right] +\drums { hh4 hh1 } +@end lilypond + +@item +@code{closedhihat @* hhc @*} +@lilypond[notime,ragged-right] +\drums { hhc4 hhc1 } +@end lilypond +@tab +@code{openhighhat @* hho @*} +@lilypond[notime,ragged-right] +\drums { hho4 hho1 } +@end lilypond +@tab +@code{halfopenhihat @* hhho @*} +@lilypond[notime,ragged-right] +\drums { hhho4 hhho1 } +@end lilypond +@tab +@code{pedalhihat @* hhp @*} +@lilypond[notime,ragged-right] +\drums { hhp4 hhp1 } +@end lilypond + + +@item +@code{crashcymbal @* cymc @*} +@lilypond[notime,ragged-right] +\drums { cymc4 cymc1 } +@end lilypond +@tab +@code{crashcymbala @* cymca @*} +@lilypond[notime,ragged-right] +\drums { cymca4 cymca1 } +@end lilypond +@tab +@code{crashcymbalb @* cymcb @*} +@lilypond[notime,ragged-right] +\drums { cymcb4 cymcb1 } +@end lilypond +@tab +@code{ridecymbal @* cymr @*} +@lilypond[notime,ragged-right] +\drums { cymr4 cymr1 } +@end lilypond + +@item +@code{ridecymbala @* cymra @*} +@lilypond[notime,ragged-right] +\drums { cymra4 cymra1 } +@end lilypond +@tab +@code{ridecymbalb @* cymrb @*} +@lilypond[notime,ragged-right] +\drums { cymrb4 cymrb1 } +@end lilypond +@tab +@code{chinesecymbal @* cymch @*} +@lilypond[notime,ragged-right] +\drums { cymch4 cymch1 } +@end lilypond +@tab +@code{splashcymbal @* cyms @*} +@lilypond[notime,ragged-right] +\drums { cyms4 cyms1 } +@end lilypond + +@item +@code{ridebell @* rb @*} +@lilypond[notime,ragged-right] +\drums { rb4 rb1 } +@end lilypond +@tab +@code{cowbell @* cb @*} +@lilypond[notime,ragged-right] +\drums { cb4 cb1 } +@end lilypond +@tab +@code{hibongo @* boh @*} +@lilypond[notime,ragged-right] +\drums { boh4 boh1 } +@end lilypond +@tab +@code{openhibongo @* boho @*} +@lilypond[notime,ragged-right] +\drums { boho4 boho1 } +@end lilypond + +@item +@code{mutehibongo @* bohm @*} +@lilypond[notime,ragged-right] +\drums { bohm4 bohm1 } +@end lilypond +@tab +@code{lobongo @* bol @*} +@lilypond[notime,ragged-right] +\drums { bol4 bol1 } +@end lilypond +@tab +@code{openlobongo @* bolo @*} +@lilypond[notime,ragged-right] +\drums { bolo4 bolo1 } +@end lilypond +@tab +@code{mutelobongo @* bolm @*} +@lilypond[notime,ragged-right] +\drums { bolm4 bolm1 } +@end lilypond + + +@item +@code{hiconga @* cgh @*} +@lilypond[notime,ragged-right] +\drums { cgh4 cgh1 } +@end lilypond +@tab +@code{openhiconga @* cgho @*} +@lilypond[notime,ragged-right] +\drums { cgho4 cgho1 } +@end lilypond +@tab +@code{mutehiconga @* cghm @*} +@lilypond[notime,ragged-right] +\drums { cghm4 cghm1 } +@end lilypond +@tab +@code{loconga @* cgl @*} +@lilypond[notime,ragged-right] +\drums { cgl4 cgl1 } +@end lilypond + +@item +@code{openloconga @* cglo @*} +@lilypond[notime,ragged-right] +\drums { cglo4 cglo1 } +@end lilypond +@tab +@code{muteloconga @* cglm @*} +@lilypond[notime,ragged-right] +\drums { cglm4 cglm1 } +@end lilypond +@tab +@code{hitimbale @* timh @*} +@lilypond[notime,ragged-right] +\drums { timh4 timh1 } +@end lilypond +@tab +@code{lotimbale @* timl @*} +@lilypond[notime,ragged-right] +\drums { timl4 timl1 } +@end lilypond + +@item +@code{hiagogo @* agh @*} +@lilypond[notime,ragged-right] +\drums { agh4 agh1 } +@end lilypond +@tab +@code{loagogo @* agl @*} +@lilypond[notime,ragged-right] +\drums { agl4 agl1 } +@end lilypond +@tab +@code{sidestick @* ss @*} +@lilypond[notime,ragged-right] +\drums { ss4 ss1 } +@end lilypond +@tab +@code{hisidestick @* ssh @*} +@lilypond[notime,ragged-right] +\drums { ssh4 ssh1 } +@end lilypond + +@item +@code{losidestick @* ssl @*} +@lilypond[notime,ragged-right] +\drums { ssl4 ssl1 } +@end lilypond +@tab +@code{guiro @* gui @*} +@lilypond[notime,ragged-right] +\drums { gui4 gui1 } +@end lilypond +@tab +@code{shortguiro @* guis @*} +@lilypond[notime,ragged-right] +\drums { guis4 guis1 } +@end lilypond +@tab +@code{longguiro @* guil @*} +@lilypond[notime,ragged-right] +\drums { guil4 guil1 } +@end lilypond + +@item +@code{cabasa @* cab @*} +@lilypond[notime,ragged-right] +\drums { cab4 cab1 } +@end lilypond +@tab +@code{maracas @* mar @*} +@lilypond[notime,ragged-right] +\drums { mar4 mar1 } +@end lilypond +@tab +@code{shortwhistle @* whs @*} +@lilypond[notime,ragged-right] +\drums { whs4 whs1 } +@end lilypond +@tab +@code{longwhistle @* whl @*} +@lilypond[notime,ragged-right] +\drums { whl4 whl1 } +@end lilypond + +@item +@code{handclap @* hc @*} +@lilypond[notime,ragged-right] +\drums { hc4 hc1 } +@end lilypond +@tab +@code{tambourine @* tamb @*} +@lilypond[notime,ragged-right] +\drums { tamb4 tamb1 } +@end lilypond +@tab +@code{vibraslap @* vibs @*} +@lilypond[notime,ragged-right] +\drums { vibs4 vibs1 } +@end lilypond +@tab +@code{tamtam @* tt @*} +@lilypond[notime,ragged-right] +\drums { tt4 tt1 } +@end lilypond + +@item +@code{claves @* cl @*} +@lilypond[notime,ragged-right] +\drums { cl4 cl1 } +@end lilypond +@tab +@code{hiwoodblock @* wbh @*} +@lilypond[notime,ragged-right] +\drums { wbh4 wbh1 } +@end lilypond +@tab +@code{lowoodblock @* wbl @*} +@lilypond[notime,ragged-right] +\drums { wbl4 wbl1 } +@end lilypond +@tab +@code{opencuica @* cuio @*} +@lilypond[notime,ragged-right] +\drums { cuio4 cuio1 } +@end lilypond + +@item +@code{mutecuica @* cuim @*} +@lilypond[notime,ragged-right] +\drums { cuim4 cuim1 } +@end lilypond +@tab +@code{triangle @* tri @*} +@lilypond[notime,ragged-right] +\drums { tri4 tri1 } +@end lilypond +@tab +@code{opentriangle @* trio @*} +@lilypond[notime,ragged-right] +\drums { trio4 trio1 } +@end lilypond +@tab +@code{mutetriangle @* trim} +@lilypond[notime,ragged-right] +\drums { trim4 trim1 } +@end lilypond + +@item +@code{oneup @* ua @*} +@lilypond[notime,ragged-right] +\drums { ua4 ua1 } +@end lilypond +@tab +@code{twoup @* ub @*} +@lilypond[notime,ragged-right] +\drums { ub4 ub1 } +@end lilypond +@tab +@code{threeup @* uc @*} +@lilypond[notime,ragged-right] +\drums { uc4 uc1 } +@end lilypond +@tab +@code{fourup @* ud @*} +@lilypond[notime,ragged-right] +\drums { ud4 ud1 } +@end lilypond + +@item +@code{fiveup @* ue @*} +@lilypond[notime,ragged-right] +\drums { ue4 ue1 } +@end lilypond +@tab +@code{onedown @* da @*} +@lilypond[notime,ragged-right] +\drums { da4 da1 } +@end lilypond +@tab +@code{twodown @* db @*} +@lilypond[notime,ragged-right] +\drums { db4 db1 } +@end lilypond +@tab +@code{threedown @* dc @*} +@lilypond[notime,ragged-right] +\drums { dc4 dc1 } +@end lilypond + +@item +@code{fourdown @* dd @*} +@lilypond[notime,ragged-right] +\drums { dd4 dd1 } +@end lilypond +@tab +@code{fivedown @* de @*} +@lilypond[notime,ragged-right] +\drums { de4 de1 } +@end lilypond + + +@end multitable @node Glosario técnico @@ -1486,7 +2413,6 @@ fuente. * parser (analizador sintáctico):: * variable del analizador sintáctico:: * prob (objeto de propiedades):: -* cerradura simple:: * smob (objeto de Scheme):: * stencil (sello):: @end menu @@ -1500,14 +2426,14 @@ fuente. @cindex lista de asociación @cindex alist -Una lista asociativa o abreviadamente una @strong{lista-A} (alist en -inglés) es una pareja de Scheme que asocia un valor con una clave: -@w{@code{(clave . valor)}}. Por ejemplo, en @file{scm/lily.scm}, la -lista-A @w{@qq{type-p-name-alist}} asocia ciertos predicadps de tipo -(p.ej.@tie{}@code{ly:music?}) con nombres (p.ej.@tie{}@qq{music}) de -forma que se pueda informar de los fallos de comprobación de tipo con -un mensaje de consola que incluye el nombre del predicado de tipo -esperado. +Una lista asociativa o abreviadamente una @strong{lista-A} (alist +en inglés) es una pareja de Scheme que asocia un valor con una +clave: @w{@code{(clave . valor)}}. Por ejemplo, en +@file{scm/lily.scm}, la lista-A @w{@qq{type-p-name-alist}} asocia +ciertos predicadps de tipo (p.ej.@tie{}@code{ly:music?}) con +nombres (p.ej.@tie{}@qq{music}) de forma que se pueda informar de +los fallos de comprobación de tipo con un mensaje de consola que +incluye el nombre del predicado de tipo esperado. @node callback @@ -1516,13 +2442,14 @@ esperado. @cindex callback -Una @strong{callback} es una rutina, función o método cuya referencia -se pasa como argumento en una llamada a otra rutina, permitiendo así -que la runtina llamada invoque a aquélla. La técnica permite que una -capa de software de nivel más bajo llame a una función definida en una -capa de nivel más alto. Las funciones de callback se usan ampliamente -en LilyPond para permitir al código de Scheme del nivel de usuario -definir cuántas acciones de bajo nivel se llevan a cabo. +Una @strong{callback} es una rutina, función o método cuya +referencia se pasa como argumento en una llamada a otra rutina, +permitiendo así que la runtina llamada invoque a aquélla. La +técnica permite que una capa de software de nivel más bajo llame a +una función definida en una capa de nivel más alto. Las funciones +de callback se usan ampliamente en LilyPond para permitir al +código de Scheme del nivel de usuario definir cuántas acciones de +bajo nivel se llevan a cabo. @node closure (cerradura) @@ -1530,26 +2457,19 @@ definir cuántas acciones de bajo nivel se llevan a cabo. @translationof closure @cindex cerradura -@cindex cerradura simple - -En Scheme, se crea una @strong{cerradura} cuando una función, por lo -general una expresión lambda, se pasa como variable. La cerradura -contiene el codigo de la función y referencias a las ligaduras léxicas -de las variables libres de la función (es decir, las variables que se -usan en la expresión pero se definen fuera de ella). Cuando más tarde -se aplica esta función a diferentes argumentos, las ligaduras de -variables libres que se capturaron dentro de la cerradura se utilizan -para obtener los valores de las variables libres que se usarán en el -cálculo. Una propiedad útil de las cerraduras es la retención de los -valores internos de las variables de una invocación a otra, -permitiendo así que se pueda mantener un estado. - -Una @strong{cerradura simple} es una cerradura cuya expresión no tiene -variables libres y por ello no tiene ligaduras de variables libres. -Una cerradura simple se representa en LilyPond mediante un @q{smob} -que contiene la expresión y un método para aplicar la expresión a la -lista de argumentos que se le pasa. +En Scheme, se crea una @strong{cerradura} cuando una función, por +lo general una expresión lambda, se pasa como variable. La +cerradura contiene el codigo de la función y referencias a las +ligaduras léxicas de las variables libres de la función (es decir, +las variables que se usan en la expresión pero se definen fuera de +ella). Cuando más tarde se aplica esta función a diferentes +argumentos, las ligaduras de variables libres que se capturaron +dentro de la cerradura se utilizan para obtener los valores de las +variables libres que se usarán en el cálculo. Una propiedad útil +de las cerraduras es la retención de los valores internos de las +variables de una invocación a otra, permitiendo así que se pueda +mantener un estado. @node glifo @@ -1561,10 +2481,10 @@ lista de argumentos que se le pasa. @cindex tipografía Un @strong{glifo} es una representación gráfica particular de un -carácter tipográfico, o una combinación de dos caracteres que forman -una ligadura. Un conjunto de glifos con un estilo y forma uniformes -forman una fuente tipográfica, y un conjunto de fuentes tipográficas -que abarcan varios estilos forman un tipo. +carácter tipográfico, o una combinación de dos caracteres que +forman una ligadura. Un conjunto de glifos con un estilo y forma +uniformes forman una fuente tipográfica, y un conjunto de fuentes +tipográficas que abarcan varios estilos forman un tipo. @seealso Referencia de la notación: @@ -1580,12 +2500,12 @@ Referencia de la notación: @cindex objetos de presentación @cindex objetos gráficos -Los objetos de LilyPond que representan elementos de la notación en la -salida impresa tales como la cabeza y la plica de las notas, ligaduras -de unión y de expresión, digitaciones, claves, et. se denominan -@q{objetos de presentación}, a menudo conocidos como @q{OBjetos -GRáficos}, o abreviadamente @strong{grobs}. Se representan mediante -instancias de la clase @code{Grob}. +Los objetos de LilyPond que representan elementos de la notación +en la salida impresa tales como la cabeza y la plica de las notas, +ligaduras de unión y de expresión, digitaciones, claves, et. se +denominan @q{objetos de presentación}, a menudo conocidos como +@q{OBjetos GRáficos}, o abreviadamente @strong{grobs}. Se +representan mediante instancias de la clase @code{Grob}. @seealso Manual de aprendizaje: @@ -1606,14 +2526,15 @@ Referencia de funcionamiento interno: @cindex propiedades inmutables @cindex propiedades compartidas -Un objeto @strong{inmutable} es aquél cuyo estado no se puede +Un objeto @strong{inmutable} es aquel cuyo estado no se puede modificar después de su creación, en contraste con los objetos mutables, que se pueden modificar después de su creación. En LilyPond, las propiedades inmutables o compartidas definen el -estilo y comportamiento predeterminados de los grobs. Se comparten -por parte de muchos objetos. En aparente contradicción con su nombre, -se pueden cambiar utilizando @code{\override} y @code{\revert}. +estilo y comportamiento predeterminados de los grobs. Se +comparten por parte de muchos objetos. En aparente contradicción +con su nombre, se pueden cambiar utilizando @code{\override} y +@code{\revert}. @seealso Referencia de la notación: @@ -1628,9 +2549,9 @@ Referencia de la notación: @cindex interfaz de grob @cindex interfaces de objetos gráficos -Las acciones y propiedades comunes a un conjunto de grobs se agrupan -en un objeto denominado @code{interfaz de grob (grob-inerface)}, o -abreviadamente @q{interfaz}. +Las acciones y propiedades comunes a un conjunto de grobs se +agrupan en un objeto denominado @code{interfaz de grob +(grob-inerface)}, o abreviadamente @q{interfaz}. @seealso Manual de aprendizaje: @@ -1653,16 +2574,17 @@ Referencia de funcionamiento interno: @cindex analizador léxico @cindex Flex -Un @strong{lexer} o analizador léxico es un programa que convierte una -secuencia de caracteres en una secuencia de elementos o tokens, en un -proceso que se llama análisis léxico. El analizador léxico de -LilyPond convierte el flujo obtenido a partir de un archivo de entrada -@file{.ly} en un flujo descompuesto en tokens más apto para la -siguiente fase del procesado: el análisis sintáctico, véase -@ref{parser (analizador sintáctico)}. El analizador léxico de -LilyPond lexer está construido con la herramienta Flex a partir del -archivo de lexer @file{lily/lexer.ll} que contiene las reglas léxicas. -Este archivo es parte del código fuente y no se incluye dentro de la +Un @strong{lexer} o analizador léxico es un programa que convierte +una secuencia de caracteres en una secuencia de elementos o +tokens, en un proceso que se llama análisis léxico. El analizador +léxico de LilyPond convierte el flujo obtenido a partir de un +archivo de entrada @file{.ly} en un flujo descompuesto en tokens +más apto para la siguiente fase del procesado: el análisis +sintáctico, véase @ref{parser (analizador sintáctico)}. El +analizador léxico de LilyPond lexer está construido con la +herramienta Flex a partir del archivo de lexer +@file{lily/lexer.ll} que contiene las reglas léxicas. Este +archivo es parte del código fuente y no se incluye dentro de la instalación binaria de LilyPond. @@ -1677,9 +2599,10 @@ Un objeto @strong{mutable} es aquél cuyo estado se puede modificar después de su creación, en contraste con un objeto inmutable, cuyo estado se fija en el momento de la creación. -En LilyPond, las propiedades mutables contienen valores específicos de -un grob. Por lo general, las listas de otros objetos o los resultados -de los cálculos se almacenan en propiedades mutables. +En LilyPond, las propiedades mutables contienen valores +específicos de un grob. Por lo general, las listas de otros +objetos o los resultados de los cálculos se almacenan en +propiedades mutables. @seealso Referencia de la notación: @@ -1710,19 +2633,20 @@ instancias parra los bloques midi, layout y paper. Un @strong{parser} o analizador sintáctico analiza la secuencia de tokens o elementos léxicos producida por un analizador léxico para -determinar su estructura gramatical, agrupando los elementos léxicos -en conjuntos mayores según las reglas de la gramática. Si la -secuencia de elementos léxicos es válida, el producto final es un -árbol de tokens cuya raíz es el símbolo inicial de la gramática. Si -no se puede conseguir esto, el archivo es inválido y se produce un -mensaje de error adecuado. Las agrupaciones sintácticas y las reglas -para construir estas agrupaciones a partir de sus elementos -constituyentes para la sintaxis de LilyPond están definidas en -@file{lily/parser.yy} y se muestran en la forma normal de Backus (BNF) -dentro de @rcontrib{LilyPond grammar}. Este archivo se usa para -construir el analizador sintáctico durante la compilación del programa -por parte del generador de analizadores sintácticos, Bison. Es parte -del código fuente y no se incluye dentro de la instalación binaria de +determinar su estructura gramatical, agrupando los elementos +léxicos en conjuntos mayores según las reglas de la gramática. Si +la secuencia de elementos léxicos es válida, el producto final es +un árbol de tokens cuya raíz es el símbolo inicial de la +gramática. Si no se puede conseguir esto, el archivo es inválido +y se produce un mensaje de error adecuado. Las agrupaciones +sintácticas y las reglas para construir estas agrupaciones a +partir de sus elementos constituyentes para la sintaxis de +LilyPond están definidas en @file{lily/parser.yy} y se muestran en +la forma normal de Backus (BNF) dentro de @rcontrib{LilyPond +grammar}. Este archivo se usa para construir el analizador +sintáctico durante la compilación del programa por parte del +generador de analizadores sintácticos, Bison. Es parte del código +fuente y no se incluye dentro de la instalación binaria de LilyPond. @@ -1745,19 +2669,21 @@ LilyPond. @cindex showLastLength @cindex showFirstLength -Son variables definidas directamente dentro de Scheme. Su uso directo -por parte de los usuarios está fuertemente desaconsejado, porque su -semántica de ámbito puede ser confusa. +Son variables definidas directamente dentro de Scheme. Su uso +directo por parte de los usuarios está fuertemente desaconsejado, +porque su semántica de ámbito puede ser confusa. Cuando el valor de una de estas variables se modifica dentro de un -archivo @file{.ly}, el cambio es global, y a no ser que se revierta -explícitamente, el nuevo valor persistirá hasta el final del archivo, -afectando a todos los bloques @code{\score} así como a los archivos -externos añadidos con la instrucción @code{\include}. Esto puede -conducir a consecuencias imprevistas y en proyectos de composición -tipográfica complejos puede ser difícil de rastrear. +archivo @file{.ly}, el cambio es global, y a no ser que se +revierta explícitamente, el nuevo valor persistirá hasta el final +del archivo, afectando a todos los bloques @code{\score} así como +a los archivos externos añadidos con la instrucción +@code{\include}. Esto puede conducir a consecuencias imprevistas +y en proyectos de composición tipográfica complejos puede ser +difícil de rastrear. -LilyPond utiliza las siguientes variables del analizador sintáctico: +LilyPond utiliza las siguientes variables del analizador +sintáctico: @itemize @item afterGraceFraction @@ -1782,20 +2708,13 @@ LilyPond utiliza las siguientes variables del analizador sintáctico: @cindex prob Los OBjetos de PRopiedades, o abreviadamente @strong{probs}, son -instancias de la clase @code{Prob}, que es una sencilla clase básica -que tiene listas-A de propiedades mutables e inmutables y los métodos -para manipularlas. Las clases @code{Music} y @code{Stream_event} -derivan de @code{Prob}. También se crean instancias de la clase -@code{Prob} para almacenar el contenido formateado de los grobs del -sistema y los bloques de títulos durante el proceso de disposición de -la página. - - -@node cerradura simple -@unnumberedsubsec cerradura simple -@translationof simple closure - -Véase @ref{closure (cerradura)}. +instancias de la clase @code{Prob}, que es una sencilla clase +básica que tiene listas-A de propiedades mutables e inmutables y +los métodos para manipularlas. Las clases @code{Music} y +@code{Stream_event} derivan de @code{Prob}. También se crean +instancias de la clase @code{Prob} para almacenar el contenido +formateado de los grobs del sistema y los bloques de títulos +durante el proceso de disposición de la página. @node smob (objeto de Scheme) @@ -1805,14 +2724,14 @@ Véase @ref{closure (cerradura)}. @cindex smob @cindex objeto de Scheme -Los @strong{Smobs}, u OBjetos de ScheMe, forman parte del mecanismo -utilizado por Guile para exportar objetos de C y de C++ al código de -Scheme. En LilyPond, se crean smobs a partir de objetos de C++ por -medio de macros. Hay dos tipos de objetos smob: los smobs simples, -orientados a objetos inmutables simples como números, y los smobs -complejos, usados para objetos con identidades. Si tiene acceso a las -fuentes de LilyPond sources, encontrará más información en -@file{lily/includes/smob.hh}. +Los @strong{Smobs}, u OBjetos de ScheMe, forman parte del +mecanismo utilizado por Guile para exportar objetos de C y de C++ +al código de Scheme. En LilyPond, se crean smobs a partir de +objetos de C++ por medio de macros. Hay dos tipos de objetos +smob: los smobs simples, orientados a objetos inmutables simples +como números, y los smobs complejos, usados para objetos con +identidades. Si tiene acceso a las fuentes de LilyPond sources, +encontrará más información en @file{lily/includes/smob.hh}. @node stencil (sello) @@ -1822,17 +2741,18 @@ fuentes de LilyPond sources, encontrará más información en @cindex stencil @cindex sello -Las instancias de la clase @strong{stencil} contienen la información -necesaria para imprimir un objeto tipográfico. Es un smob simple que -contiene una caja de confinamiento, que a su vez define las -dimensiones vertical y horizontal del objeto, y una expresión de -Scheme que imprime el objeto cuendo se evalúa. Los stencils o sellos -se pueden combinar para formar sellos más complejos definidos por un -árbol de expresiones de Scheme formado a partir de las expresiones de -Scheme de los sellos que lo componen. +Las instancias de la clase @strong{stencil} contienen la +información necesaria para imprimir un objeto tipográfico. Es un +smob simple que contiene una caja de confinamiento, que a su vez +define las dimensiones vertical y horizontal del objeto, y una +expresión de Scheme que imprime el objeto cuendo se evalúa. Los +stencils o sellos se pueden combinar para formar sellos más +complejos definidos por un árbol de expresiones de Scheme formado +a partir de las expresiones de Scheme de los sellos que lo +componen. -La propiedad @code{stencil}, que conecta a un grob con su sello, se -define dentro del interfaz @code{grob-interface}. +La propiedad @code{stencil}, que conecta a un grob con su sello, +se define dentro del interfaz @code{grob-interface}. @seealso Referencia de funcionamiento interno: @@ -1864,9 +2784,9 @@ Referencia de funcionamiento interno: @appendixsec Identificadores de modificación de contextos @translationof Context modification identifiers -Se definen las siguientes instrucciones -para su uso como modificaciones de contexto dentro de un -bloque @code{\layout} o @code{\with}. +Se definen las siguientes instrucciones para su uso como +modificaciones de contexto dentro de un bloque @code{\layout} o +@code{\with}. @include context-mod-identifiers.tely diff --git a/Documentation/es/notation/percussion.itely b/Documentation/es/notation/percussion.itely index 45be96ecd9..66353944de 100644 --- a/Documentation/es/notation/percussion.itely +++ b/Documentation/es/notation/percussion.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: d5fc7a079db0853bfb49e21821226d492f01cf8c + Translation of GIT committish: 0129dea8eff59c10ba6e295f6f2cd48083fc5296 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.2" @node Percusión @section Percusión @@ -23,9 +23,9 @@ @subsection Notación común para percusión @translationof Common notation for percussion -La notación rítmica se emplea primordialmente para la percusión y la -batería, pero también se puede utilizar para mostrar los valores -rítmicos una melodía. +La notación rítmica se emplea primordialmente para la percusión y +la batería, pero también se puede utilizar para mostrar los +valores rítmicos una melodía. @menu * Referencias para percusión:: @@ -47,12 +47,14 @@ rítmicos una melodía. @itemize @item -La notación de algunas percusiones se puede hacer sobre una pauta de -ritmo; esto se estudia en @ref{Mostrar los ritmos de la melodía} y +La notación de algunas percusiones se puede hacer sobre una pauta +de ritmo; esto se estudia en +@ref{Mostrar los ritmos de la melodía} y @ref{Crear instancias de pentagramas nuevos}. @item -La salida MIDI se trata en una sección aparte; véase @ref{Percusión en MIDI}. +La salida MIDI se trata en una sección aparte; véase +@ref{Instrumentos MIDI}. @end itemize @@ -60,7 +62,7 @@ La salida MIDI se trata en una sección aparte; véase @ref{Percusión en MIDI}. Referencia de la notación: @ref{Mostrar los ritmos de la melodía}, @ref{Crear instancias de pentagramas nuevos}. -@ref{Percusión en MIDI}. +@ref{Instrumentos MIDI}. Fragmentos de código: @rlsr{Percussion}. @@ -73,11 +75,11 @@ Fragmentos de código: @cindex percusión @cindex batería -Las notas de percusión se pueden escribir en el modo @code{\drummode}, -que es similar al modo estándar para introducir notas. La manera más -fácil de escribir notas de percusión es utilizar la instrucción -@code{\drums}, que crea el contexto y el modo de entrada apropiados -para percusión: +Las notas de percusión se pueden escribir en el modo +@code{\drummode}, que es similar al modo estándar para introducir +notas. La manera más fácil de escribir notas de percusión es +utilizar la instrucción @code{\drums}, que crea el contexto y el +modo de entrada apropiados para percusión: @lilypond[quote,verbatim] \drums { @@ -96,36 +98,36 @@ Esto es una abreviatura de @end lilypond Cada elemento de un set de percusión lleva un nombre completo y un -nombre abreviado, y los dos se pueden usar en la entrada. La lista -completa de nombre de instrumentos de percusión se encuentra en -@ref{Notas de percusión}. +nombre abreviado, y los dos se pueden usar en la entrada. La +lista completa de nombre de instrumentos de percusión se encuentra +en @ref{Notas de percusión}. @cindex clave de percusión @cindex percusión, clave Observe que la notación normal de las notas con altura determinada -(como @code{cis4}) en un contexto @code{DrumStaff} producen un mensaje -de error. Las claves de percusión se añaden automáticamente al -contexto @code{DrumStaff} pero también se pueden establecer -explícitamente o utilizar otras claves. +(como @code{cis4}) en un contexto @code{DrumStaff} producen un +mensaje de error. Las claves de percusión se añaden +automáticamente al contexto @code{DrumStaff} pero también se +pueden establecer explícitamente o utilizar otras claves. @lilypond[quote,ragged-right,verbatim] \drums { \clef percussion - bd4 bd bd bd + bd4 4 4 4 \clef treble - hh4 hh hh hh + hh4 4 4 4 } @end lilypond -Hay ciertos detalles respecto a cómo está contemplado el MIDI para los -instrumentos de percusión; para ver los detalles consulte -@ref{Percusión en MIDI}. +Hay ciertos detalles respecto a cómo está contemplado el MIDI para +los instrumentos de percusión; para ver los detalles consulte +@ref{Instrumentos MIDI}. @seealso Referencia de la notación: -@ref{Percusión en MIDI}, +@ref{Instrumentos MIDI}, @ref{Notas de percusión}. Archivos de inicio: @@ -142,33 +144,33 @@ Fragmentos de código: Los redobles se indican mediante tres barras cruzadas en la plica. Para las negras o notas más largas, las tres barras se muestran explícitamente, las corcheas se presentan con dos barras cruzadas -(siendo la barra de corchea la tercera), y los redobles más breves que -las corcheas tienen una barra cruzada para complementar las barras -normales. Esto se consigue mediante la notación de trémolo, -véase @ref{Repeticiones de trémolo}. +(siendo la barra de corchea la tercera), y los redobles más breves +que las corcheas tienen una barra cruzada para complementar las +barras normales. Esto se consigue mediante la notación de +trémolo, véase @ref{Repeticiones de trémolo}. @lilypond[quote,verbatim] \drums { \time 2/4 - sn16 sn8 sn16 sn8 sn8:32 ~ - sn8 sn8 sn4:32 ~ - sn4 sn8 sn16 sn16 - sn4 r4 + sn16 8 16 8 8:32 ~ + 8 8 4:32 ~ + 4 8 16 16 + 4 r4 } @end lilypond Los golpes de baqueta se pueden indicar mediante la colocación de -los elementos de marcado @code{"R"} o @code{"L"} encima o debajo de -las notas, como se estudia en @ref{Dirección y posición}. La propiedad -@code{staff-padding} se puede sobreescribir para conseguir una línea -de base satisfactoria. +los elementos de marcado @code{"R"} o @code{"L"} encima o debajo +de las notas, como se estudia en @ref{Dirección y posición}. La +propiedad @code{staff-padding} se puede sobreescribir para +conseguir una línea de base satisfactoria. @lilypond[quote,verbatim] \drums { \repeat unfold 2 { - sn16^"L" sn^"R" sn^"L" sn^"L" sn^"R" sn^"L" sn^"R" sn^"R" + sn16^"L" 16^"R" 16^"L" 16^"L" 16^"R" 16^"L" 16^"R" 16^"R" \stemUp - sn16_"L" sn_"R" sn_"L" sn_"L" sn_"R" sn_"L" sn_"R" sn_"R" + sn16_"L" 16_"R" 16_"L" 16_"L" 16_"R" 16_"L" 16_"R" 16_"R" } } @end lilypond @@ -186,15 +188,13 @@ Fragmentos de código: @translationof Pitched percussion Ciertos instrumentos de percusión de altura determinada (p.ej.: el -xilófono, el vibráfono y los timbales) se escriben usando pentagramas -normales. Esto se estudia en otras secciones del manual. +xilófono, el vibráfono y los timbales) se escriben usando +pentagramas normales. Esto se estudia en otras secciones del +manual. @seealso -@c TODO: possibly link to an alternate section of NR 3.5, if -@c "percussion in MIDI" gets a separate subsubsection for -@c pitched percussion sounds. -gp Referencia de la notación: -@ref{Percusión en MIDI}. +@ref{Instrumentos MIDI}. Fragmentos de código: @rlsr{Percussion}. @@ -207,10 +207,10 @@ Fragmentos de código: @cindex percusión @cindex batería -Una parte de percusión para más de un instrumento, normalmente utiliza -una pauta de varias líneas donde cada posición dentro de la pauta se -refiere a un elemento de percusión. Para tipografiar la música, se -deben interpretar las notas dentro de los contextos +Una parte de percusión para más de un instrumento, normalmente +utiliza una pauta de varias líneas donde cada posición dentro de +la pauta se refiere a un elemento de percusión. Para tipografiar +la música, se deben interpretar las notas dentro de los contextos @rinternals{DrumStaff} y @rinternals{DrumVoice}. @lilypond[quote,verbatim] @@ -243,16 +243,16 @@ también se puede usar. Por ejemplo, >> @end lilypond -También existen otras posibilidades en lo referente a la disposición. -Para usarlas, establezca la propiedad @code{drumStyleTable} en el -contexto @rinternals{DrumVoice}. Se han predefinido las siguientes -variables: +También existen otras posibilidades en lo referente a la +disposición. Para usarlas, establezca la propiedad +@code{drumStyleTable} en el contexto @rinternals{DrumVoice}. Se +han predefinido las siguientes variables: @table @code @item drums-style -Es la opción por defecto. Tipografía un típico set de percusión sobre -pentagrama: +Es la opción por defecto. Se usa para tipografiar una batería +típica sobre pentagrama: @lilypond[quote,line-width=10.0\cm] nam = \lyricmode { @@ -281,13 +281,45 @@ mus = \drummode { @end lilypond El esquema de percusión contempla seis tambores graves (toms) -distintos. Cuando haya menos toms, sencillamente seleccione aquellos -que producen el resultado deseado, es decir, para tener toms en las -tres líneas centrales utilizará @code{tommh}, @code{tomml} y -@code{tomfh}. +distintos. Cuando haya menos toms, sencillamente seleccione +aquellos que producen el resultado deseado, es decir, para tener +toms en las tres líneas centrales utilizará @code{tommh}, +@code{tomml} y @code{tomfh}. + +@item agostini-drums-style +Inventado por el percusionista francés Dante Agostini en 1965, +esta notación se emplea normalmente en Francia pero también en +muchos otros lugares. + +@lilypond[quote,line-width=10.0\cm] +nam = \lyricmode { + cymc cyms cymr hh hhc hho hhho hhp + cb hc bd sn ss tomh tommh tomml toml tomfh tomfl } +mus = \drummode { + cymc cyms cymr hh hhc hho hhho hhp \break + cb hc bd sn ss tomh tommh tomml toml tomfh tomfl s16 } +\score { + << \new DrumStaff \with { + \remove "Bar_engraver" + \remove "Time_signature_engraver" + \hide Stem + \override Stem.Y-extent = ##f + drumStyleTable = #agostini-drums-style + } \mus + \new Lyrics \nam + >> + \layout { + \context { + \Score + \override LyricText.font-family = #'typewriter + \override BarNumber.transparent =##T + } + } +} +@end lilypond @item timbales-style -Esto tipografía timbales en una pauta de dos líneas: +Se usa para tipografiar timbales en una pauta de dos líneas: @lilypond[quote,ragged-right] nam = \lyricmode { timh ssh timl ssl cb } @@ -312,7 +344,7 @@ mus = \drummode { timh ssh timl ssl cb s16 } @end lilypond @item congas-style -Esto tipografía congas en una pauta de dos líneas: +Se usa para tipografiar congas en una pauta de dos líneas: @lilypond[quote,ragged-right] nam = \lyricmode { cgh cgho cghm ssh cgl cglo cglm ssl } @@ -338,7 +370,7 @@ mus = \drummode { cgh cgho cghm ssh cgl cglo cglm ssl s16 } @end lilypond @item bongos-style -Esto tipografía bongos sobre una pauta de dos líneas: +Se usa para bongos sobre una pauta de dos líneas: @lilypond[quote,ragged-right] nam = \lyricmode { boh boho bohm ssh bol bolo bolm ssl } @@ -364,8 +396,8 @@ mus = \drummode { boh boho bohm ssh bol bolo bolm ssl s16 } @end lilypond @item percussion-style -Para tipografiar toda clase de percusiones simples sobre pautas de una -línea: +Para tipografiar toda clase de percusiones simples sobre pautas de +una línea: @lilypond[quote,ragged-right] nam = \lyricmode { tri trio trim gui guis guil cb cl tamb cab mar hc } @@ -393,8 +425,8 @@ mus = \drummode { tri trio trim gui guis guil cb cl tamb cab mar hc s16 } @unnumberedsubsubsec Pautas de percusión personalizadas @translationof Custom percussion staves -Si no le gusta ninguna de las listas predefinidas, puede definir su -propia lista al principio de su archivo +Si no le gusta ninguna de las listas predefinidas, puede definir +su propia lista al principio de su archivo @lilypond[quote,verbatim] #(define mydrums '( @@ -421,8 +453,8 @@ down = \drummode { bd4 sn bd toml8 toml } He aquí algunos ejemplos adicionales: -Dos bloques de madera, escritos con wbh (@emph{woodblock-high}, bloque -alto) y wbl (@emph{woodblock-low} bloque bajo) +Dos bloques de madera, escritos con wbh (@emph{woodblock-high}, +bloque alto) y wbl (@emph{woodblock-low} bloque bajo) @lilypond[quote,verbatim] % These lines define the position of the woodblocks in the stave; @@ -448,17 +480,18 @@ woodstaff = { \drummode { \time 2/4 - wbl8 wbl16 wbl wbh8-> wbl | - wbl8 wbl16 wbh-> ~ wbh wbl16 r8 | + wbl8 16 16 8-> 8 | + wbl8 16 16-> ~ 16 16 r8 | } } @end lilypond -Observe que en este caso especial se debe alterar la longitud de la -línea divisoria con @code{\override Staff.BarLine.bar-extent #'(de . a)}. -En caso contrario resulta demasiado corta. También debe definir las -posiciones de las dos líneas del pentagrama. Para más información -sobre estos delicados asuntos, consulte @ref{El símbolo del pentagrama}. +Observe que en este caso especial se debe alterar la longitud de +la línea divisoria con @code{\override Staff.BarLine.bar-extent +#'(de . a)}. En caso contrario resulta demasiado corta. También +debe definir las posiciones de las dos líneas del pentagrama. +Para más información sobre estos delicados asuntos, consulte +@ref{El símbolo del pentagrama}. Una pandereta, escrita mediante @q{tamb} (@emph{tambourine}): @@ -477,8 +510,8 @@ tambustaff = { \drummode { \time 6/8 - tamb8. tamb16 tamb8 tamb tamb tamb | - tamb4. tamb8 tamb tamb | + tamb8. 16 8 8 8 8 | + tamb4. 8 8 8 | % the trick with the scaled duration and the shorter rest % is neccessary for the correct ending of the trill-span! tamb2.*5/6 \startTrillSpan s8 \stopTrillSpan | @@ -486,7 +519,6 @@ tambustaff = { } @end lilypond - Música para gong, introducida con @q{tt} (tam-tam): @lilypond[quote,verbatim] @@ -526,8 +558,8 @@ bellstaff = { \bellstaff \drummode { \time 2/4 - rb8 rb cb cb16 rb-> ~ | - rb16 rb8 rb16 cb8 cb | + rb8 8 cb8 16 rb16-> ~ | + 16 8 16 cb8 8 | } } @end lilypond @@ -609,8 +641,8 @@ Referencia de funcionamiento interno: @translationof Ghost notes Las notas fantasma para la batería e instrumentos de percusión se -pueden crear utilizando la instrucción @code{\parenthesize} detallada -en @ref{Paréntesis}. +pueden crear utilizando la instrucción @code{\parenthesize} +detallada en @ref{Paréntesis}. @lilypond[quote,ragged-right,verbatim] \new DrumStaff @@ -620,12 +652,12 @@ en @ref{Paréntesis}. \drummode { << { - hh8[ hh] hh16 + hh8[ 8] hh16 \parenthesize sn hh \parenthesize sn hh8 hh } \\ { - bd4 r4 bd8 bd r8 bd + bd4 r4 bd8 8 r8 bd } >> } diff --git a/Documentation/es/notation/pitches.itely b/Documentation/es/notation/pitches.itely index da52953fd2..f03c553e14 100644 --- a/Documentation/es/notation/pitches.itely +++ b/Documentation/es/notation/pitches.itely @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: fa12d929326daf49f84838a95b0570b32e4b3400 + Translation of GIT committish: e45059ae37b240ce52639ad5c49110b510a89481 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.18" +@c \version "2.19.22" @node Alturas @@ -16,8 +16,9 @@ @lilypondfile[quote]{pitches-headword.ly} -En esta sección se discute cómo especificar la altura de las notas. -Este proceso se compone de tres fases: entrada, modificación y salida. +En esta sección se discute cómo especificar la altura de las +notas. Este proceso se compone de tres fases: entrada, +modificación y salida. @menu * Escritura de notas:: @@ -31,10 +32,10 @@ Este proceso se compone de tres fases: entrada, modificación y salida. @subsection Escritura de notas @translationof Writing pitches -En esta sección se describe la manera de introducir la altura de las -notas. Existen dos formas distintas de colocar las notas en su octava -correspondiente: el modo absoluto y el relativo. En casi todas las -ocasiones, será más práctico el modo relativo. +En esta sección se describe la manera de introducir la altura de +las notas. Existen dos formas distintas de colocar las notas en +su octava correspondiente: el modo absoluto y el relativo. En +casi todas las ocasiones, será más práctico el modo relativo. @menu * Escritura de octava absoluta:: @@ -56,9 +57,10 @@ ocasiones, será más práctico el modo relativo. @cindex absoluta, introducción, de la octava @cindex octava, introducción absoluta -El nombre de una nota se especifica usando las letras minúsculas de la -@code{a} a la @code{g}. Las notas cuyos nombres van desde @code{c} -hasta @code{b} se imprimen en la octava inferior al Do central. +El nombre de una nota se especifica usando las letras minúsculas +de la @code{a} a la @code{g}. Las notas cuyos nombres van desde +@code{c} hasta @code{b} se imprimen en la octava inferior al Do +central. @c don't use c' here. @lilypond[verbatim,quote] @@ -77,31 +79,46 @@ hasta @code{b} se imprimen en la octava inferior al Do central. Se pueden especificar otras octavas mediante una comilla simple quote@tie{}(@code{'}) o una coma@tie{}(@code{,}) . -Cada@tie{}@code{'} eleva la altura en una octava; cada@tie{}@code{,} -baja la altura una octava. +Cada@tie{}@code{'} eleva la altura en una octava; +cada@tie{}@code{,} baja la altura una octava. @lilypond[verbatim,quote] { \clef treble - c'4 c'' e' g - d''4 d' d c + c'4 e' g' c'' + c'4 g b c' \clef bass - c,4 c,, e, g - d,,4 d, d c + c,4 e, g, c + c,4 g,, b,, c, } @end lilypond -@funindex absolute -@funindex \absolute -Se puede indicar explícitamente que la música está en notación de -octava absoluta si se precede con @code{\absolute}: +@funindex \fixed +Las marcas de octava comunes se pueden escribir una sola vez sobre +una nota de referencia si se emplea @code{\fixed} antes de la +música. Las notas dentro de @code{\fixed} solo necesitan las +marcas de apóstrofo @code{'} o de comoa @tie{}@code{,} cuando +están por encima o por debajo de la octava de la nota de +referencia. -@example -\absolute @var{musicexpr} -@end example +@lilypond[verbatim,quote] +{ + \fixed c' { + \clef treble + c4 e g c' + c4 g, b, c + } + \clef bass + \fixed c, { + c4 e g c' + c4 g, b, c + } +} +@end lilypond -se interpreta en el modo de entrada de octava absoluta -independientemende de en qué contexto aparece. +La altura de las notas de la expresión musical que sigue a +@code{\fixed} no reultan afectadas por un @code{\relative} +circundante, que se estudia a continuación. @seealso Glosario musical: @@ -121,7 +138,6 @@ Fragmentos de código: @cindex relativa, especificación de la octava @cindex octava, especificación relativa -@funindex relative @funindex \relative La entrada de octava absoluta requere que se especifique la octava @@ -137,21 +153,22 @@ usando la instrucción @code{\relative}: \relative @var{altura_inicial} @var{expresión_musical} @end example -En el modo relativo, se supone que cada nota se encuentra lo más cerca -posible de la nota anterior. Esto significa que la octava de una nota -que está dentro de @code{@var{expresión_musical}} se calcula como sigue: +En el modo relativo, se supone que cada nota se encuentra lo más +cerca posible de la nota anterior. Esto significa que la octava +de una nota que está dentro de @code{@var{expresión_musical}} se +calcula como sigue: @itemize @item -Si no se usa ninguna marca de cambio de octava en una nota, su octava -se calcula de forma que el intervalo que forme con la nota anterior -sea menor de una quinta. Este intervalo se determina sin considerar -las alteraciones. +Si no se usa ninguna marca de cambio de octava en una nota, su +octava se calcula de forma que el intervalo que forme con la nota +anterior sea menor de una quinta. Este intervalo se determina sin +considerar las alteraciones. @item Se puede añadir una marca de cambio de octava@tie{}@code{'} -o@tie{}@code{,} para elevar o bajar la altura, respectivamente, en una -octava más en relación con la altura calculada sin esta marca. +o@tie{}@code{,} para elevar o bajar la altura, respectivamente, en +una octava más en relación con la altura calculada sin esta marca. @item Se pueden usar varias marcas de cambio de octava. Por ejemplo, @@ -159,8 +176,9 @@ Se pueden usar varias marcas de cambio de octava. Por ejemplo, @item La altura de la primera nota es relativa a -@code{@var{altura_inicial}}. @code{@var{altura_inicial}} se especifica en -modo de octava absoluta. ¿Qué opciones tienen sentido? +@code{@var{altura_inicial}}. @code{@var{altura_inicial}} se +especifica en modo de octava absoluta. ¿Qué opciones tienen +sentido? @table @asis @item @code{c} (Do), en cualquier octava @@ -168,27 +186,26 @@ La identificación del Do central con @code{c'} es algo bastante básico, por lo que tiende a ser fácil encontrar octavas de @code{c}. Si nuestra música comienza con @code{gis} (un Sol sostenido) por encima de @code{c'''}, tendríamos que escribir algo -como @code{\relative c''' @{ gis' @dots{} @}} +como @code{\relative @{ gis''' @dots{} @}} @item una nota que está una o más octavas de la primera nota de dentro -Escribir @code{\relative gis''' @{ gis @dots{} @}} hace que sea -fácil determinar la altura absoluta de la primera nota de dentro. +Escribir @code{\relative @{ gis''' @dots{} @}} hace que sea fácil +determinar la altura absoluta de la primera nota de dentro. @item ninguna altura de inicio explícita -Esta opción (concretamente, escribir @code{\relative @{ gis''' -@dots{} @}}) se puede ver como una versión más compacta de la -opción anterior: la primera nota de dentro se escribe ella misma -en altura absoluta. Esto resulta ser equivalente a elegir -@code{f} (Fa) como la altura de referencia. +La forma @code{\relative @{ gis''' @dots{} @}} sirve como una +versión más compacta de la opción anterior: la primera nota de +dentro se escribe ella misma en altura absoluta (esto resulta ser +equivalente a elegir @code{f} (Fa) como la altura de referencia). @end table -La documentación suele utilizar la primera opción. +La documentación suele utilizar esta última opción. @end itemize Aquí podemos ver el modo relativo en acción: @lilypond[verbatim,quote] -\relative c { +\relative { \clef bass c d e f g a b c @@ -196,39 +213,41 @@ Aquí podemos ver el modo relativo en acción: } @end lilypond -Las marcas de cambio de octava se utilizan para intervalos mayores de -la cuarta: +Las marcas de cambio de octava se utilizan para intervalos mayores +de la cuarta: @lilypond[verbatim,quote] -\relative c'' { - c g c f, +\relative { + c'' g c f, c' a, e'' c } @end lilypond -Una serie de notas sin ninguna marca de octava puede, a pesar de todo, -abarcar intervalos muy grandes: +Una serie de notas sin ninguna marca de octava puede, a pesar de +todo, abarcar intervalos muy grandes: @lilypond[verbatim,quote] -\relative c { +\relative { c f b e a d g c } @end lilypond -Cuando hay unos bloques @code{\relative} anidados dentro de otros, es -de aplicación el bloque @code{\relative} más interno. +Cuando hay unos bloques @code{\relative} anidados dentro de otros, +el bloque @code{\relative} más interno comienza con su propia nota +de referencia independientemente del @code{\relative} exterior. @lilypond[verbatim,quote] -\relative c' { - c d e f - \relative c'' { - c d e f +\relative { + c' d e f + \relative { + c'' d e f } } @end lilypond -@code{\relative} no tiene efecto sobre los bloques @code{\chordmode}. +@code{\relative} no tiene efecto sobre los bloques +@code{\chordmode}. @lilypond[verbatim,quote] \new Staff { @@ -242,16 +261,17 @@ de aplicación el bloque @code{\relative} más interno. @code{\relative} no se permite dentro de los bloques @code{\chordmode}. -La música que esa dentro de un bloque @code{\transpose} es absoluta, a -no ser que se incluya una instrucción @code{\relative}. +La música que esa dentro de un bloque @code{\transpose} es +absoluta, a no ser que se incluya una instrucción +@code{\relative}. @lilypond[verbatim,quote] -\relative c' { - d e +\relative { + d' e \transpose f g { d e - \relative c' { - d e + \relative { + d' e } } } @@ -260,14 +280,14 @@ no ser que se incluya una instrucción @code{\relative}. @cindex acordes e introducción relativa de la octava @cindex relativa, introducción de la octava, y acordes -Si el elemento anterior es un acorde, la primera nota del acorde se -utiliza para determinar la primera nota del siguiente acorde. Dentro -de los acordes, la siguiente nota siempre está en relación a la -anterior. +Si el elemento anterior es un acorde, la primera nota del acorde +se utiliza para determinar la primera nota del siguiente acorde. +Dentro de los acordes, la siguiente nota siempre está en relación +a la anterior. @lilypond[verbatim,quote] -\relative c' { - c +\relative { + c' @@ -277,24 +297,20 @@ anterior. Como se explicó más arriba, la octava de las notas se calcula solamente a partir de sus nombres, sin tener en cuenta alteración alguna. Por tanto, un Mi doble sostenido después de un Si se -escribirá más agudo, mientras que un Fa doble sostenido se escribirá -más grave. En otras palabras, se considera a la cuarta doble -aumentada un intervalo menor que la quinta doble disminuida, +escribirá más agudo, mientras que un Fa doble sostenido se +escribirá más grave. En otras palabras, se considera a la cuarta +doble aumentada un intervalo menor que la quinta doble disminuida, independientemente del número de semitonos de cada uno de ellos. @lilypond[verbatim,quote] -\relative c'' { - c2 fis +\relative { + c''2 fis c2 ges b2 eisis b2 feses } @end lilypond -Es una consecuencia de las reglas expuestas que la primera nota dentro -de una expresión musical precedida de @code{@w{\relative f}} se -interpreta igual que si estuviera escrita en el modo de altura -absoluta. @seealso Glosario musical: @@ -315,11 +331,8 @@ Referencia de funcionamiento interno: @cindex transposición y modo relativo @funindex \transpose -@funindex transpose @funindex \chordmode -@funindex chordmode @funindex \relative -@funindex relative @node Alteraciones accidentales @@ -332,12 +345,12 @@ Referencia de funcionamiento interno: @c duplicated in Key signature and Accidentals @warning{Las alteraciones accidentales y las armaduras son una -frecuente causa de confusión para los nuevos usuarios. En LilyPond, -los nombres de las notas son el código de entrada en bruto; la -armadura y la clave determinan de qué forma se presenta este código en -bruto. Una nota sin alteración como@tie{}@code{c} significa @q{Do -natural}, si que le afecten la armadura ni la clave. Para ver más -información, consulte @rlearning{Alteraciones accidentales y armaduras}.} +frecuente causa de confusión para los nuevos usuarios. En +LilyPond, los nombres de las notas especifican las alturas; la +armadura y la clave determinan de qué forma se presentan estas +alturas. Una nota sin alteración como@tie{}@code{c} significa +@q{Do natural}, si que le afecten la armadura ni la clave. Para +ver más información, consulte @rlearning{Alturas y armaduras}.} @cindex notas, nombres holandeses de @cindex notas, nombres predeterminados @@ -351,24 +364,25 @@ información, consulte @rlearning{Alteraciones accidentales y armaduras}.} @cindex becuadro @cindex natural, nota -Se escribe una nota @notation{sostenida} añadiendo @code{is} al nombre -de la nota, y un @notation{bemol} añadiendo @code{es}. Como es de -esperar, un @notation{dobles sostenido} y un @notation{doble bemol} se -obtiene añadiendo @code{isis} o @code{eses}. Esta sintaxis deriva de -los nombres de las notas en holandés. Para utilizar otros nombres -para las alteraciones, consulte @ref{Nombres de las notas en otros idiomas}. +Se escribe una nota @notation{sostenida} añadiendo @code{is} al +nombre de la nota, y un @notation{bemol} añadiendo @code{es}. +Como es de esperar, un @notation{dobles sostenido} y un +@notation{doble bemol} se obtiene añadiendo @code{isis} o +@code{eses}. Esta sintaxis deriva de los nombres de las notas en +holandés. Para utilizar otros nombres para las alteraciones, +consulte @ref{Nombres de las notas en otros idiomas}. -@lilypond[verbatim,quote,relative=2] -ais1 aes aisis aeses +@lilypond[verbatim,quote,fragment] +\relative c'' { ais1 aes aisis aeses } @end lilypond -Un becuadro cancelará el efecto de una alteración accidental o de la -armadura. Sin embargo, los becuadros no se codifican dentro de la -sintaxis del nombre de la nota con un sufijo; una nota becuadro se -muestra como un simple nombre de nota natural: +Una nota natural se introduce como el nombre de la nota, sin más; +no se necesita ningún sufijo. Se impirime un símbolo de becuadro +si es necesario para cancelar el efecto de una alteración o +armadura anterior. -@lilypond[verbatim,quote,relative=2] -a4 aes a2 +@lilypond[verbatim,quote,fragment] +\relative c'' { a4 aes a2 } @end lilypond @cindex cuartos de tono @@ -378,8 +392,8 @@ a4 aes a2 Se pueden escribir medios bemoles y los medios sostenidos; a continuación presentamos una serie de DOs cada vez más agudos: -@lilypond[verbatim,quote,relative=2] -ceseh1 ces ceh c cih cis cisih +@lilypond[verbatim,quote,fragment] +\relative c'' { ceseh1 ces ceh c cih cis cisih } @end lilypond @cindex alteración recordatoria @@ -392,29 +406,30 @@ ceseh1 ces ceh c cih cis cisih @funindex ? @funindex ! -Normalmente las alteraciones accidentales se imprimen automáticamente, -pero también puede imprimirlas manualmente. Un alteración -recordatoria se puede forzar añadiendo un signo de -admiración@tie{}@code{!} después de la altura de la nota. Se puede -obtener una alteración de precaución (o sea, una alteración entre -paréntesis) añadiendo el signo de interrogación@tie{}@code{?} después -del nombre de la nota. Estas alteraciones adicionales se pueden usar -también para producir notas con becuadro. +Normalmente las alteraciones accidentales se imprimen +automáticamente, pero también puede imprimirlas manualmente. Un +alteración recordatoria se puede forzar añadiendo un signo de +admiración@tie{}@code{!} después de la altura de la nota. Se +puede obtener una alteración de precaución (o sea, una alteración +entre paréntesis) añadiendo el signo de +interrogación@tie{}@code{?} después del nombre de la nota. -@lilypond[verbatim,quote,relative=2] -cis cis cis! cis? c c c! c? +@lilypond[verbatim,quote,fragment] +\relative c'' { cis cis cis! cis? c c c! c? } @end lilypond @cindex alteración en nota ligada @cindex ligadura, alteraciones y -Las alteraciones sobre notas unidas por ligadura sólo se imprimen al -comienzo de un sistema: +Las alteraciones sobre notas unidas por ligadura sólo se imprimen +al comienzo de un sistema: -@lilypond[verbatim,quote,relative=2,ragged-right] -cis1~ cis~ -\break -cis +@lilypond[verbatim,quote,fragment,ragged-right] +\relative c'' { + cis1~ 1~ + \break + cis +} @end lilypond @@ -436,7 +451,7 @@ Glosario musical: @rglos{quarter tone}. Manual de aprendizaje: -@rlearning{Alteraciones accidentales y armaduras}. +@rlearning{Alturas y armaduras}. Referencia de la notación: @ref{Alteraciones accidentales automáticas}, @@ -456,9 +471,9 @@ Referencia de funcionamiento interno: @cindex cuartos de tono, alteraciones @knownissues -No existen estándares reconocidos ampliamente para denotar -los bemoles de tres cuartos, de manera que los símbolos de LilyPond -no se ajustan a ningún estándar. +No existen estándares reconocidos ampliamente para denotar los +bemoles de tres cuartos, de manera que los símbolos de LilyPond no +se ajustan a ningún estándar. @node Nombres de las notas en otros idiomas @@ -470,25 +485,25 @@ no se ajustan a ningún estándar. @cindex idioma, nombres de nota en otros @cindex idioma, alturas en otros -Existen conjuntos predefinidos de nombres de notas y sus alteraciones -para algunos idiomas aparte del inglés. La selección del idioma de -los nombres de las notas se suele hacer al principio del archivo; el -ejemlo siguiente está escrito utilizando los nombres italianos de las -notas: +Existen conjuntos predefinidos de nombres de notas y sus +alteraciones para algunos idiomas aparte del inglés. La selección +del idioma de los nombres de las notas se suele hacer al principio +del archivo; el ejemlo siguiente está escrito utilizando los +nombres italianos de las notas: @lilypond[quote,verbatim] \language "italiano" -\relative do' { - do re mi sib +\relative { + do' re mi sib } @end lilypond -Los idiomas disponibles y los nombres de las notas que definen son los -siguientes: +Los idiomas disponibles y los nombres de las notas que definen son +los siguientes: @quotation -@multitable {@code{nederlands}} {do re mi fa sol la sib si} +@multitable {@code{nederlands}} {do re/re mi fa sol la sib si} @headitem Idioma @tab Nombre de las notas @item @code{nederlands} @@ -501,7 +516,9 @@ siguientes: @tab c d e f g a bf b @item @code{espanol} o @code{español} @tab do re mi fa sol la sib si -@item @code{italiano} o @code{français} +@item @code{français} + @tab do ré/re mi fa sol la sib si +@item @code{italiano} @tab do re mi fa sol la sib si @item @code{norsk} @tab c d e f g a b h @@ -516,49 +533,52 @@ siguientes: @end multitable @end quotation -Además de los nombres de las notas, los sufijos de las alteraciones -pueden también variar dependiendo del idioma: +Además de los nombres de las notas, los sufijos de las +alteraciones pueden también variar dependiendo del idioma: @quotation -@multitable {@code{nederlands}} {-s/-sharp} {-ess/-es} {-ss/-x/-sharpsharp} {-essess/-eses} +@multitable {@code{nederlands}} {-@code{s}/-@code{-sharp}} {-@code{ess}/-@code{es}} {-@code{ss}/-@code{x}/-@code{-sharpsharp}} {-@code{essess}/-@code{eses}} @headitem Idioma @tab sostenido @tab bemol @tab doble sostenido @tab doble bemol @item @code{nederlands} - @tab -is @tab -es @tab -isis @tab -eses + @tab -@code{is} @tab -@code{es} @tab -@code{isis} @tab -@code{eses} @item @code{catalan} - @tab -d/-s @tab -b @tab -dd/-ss @tab -bb + @tab -@code{d}/-@code{s} @tab -@code{b} @tab -@code{dd}/-@code{ss} @tab -@code{bb} @item @code{deutsch} - @tab -is @tab -es @tab -isis @tab -eses + @tab -@code{is} @tab -@code{es} @tab -@code{isis} @tab -@code{eses} @item @code{english} - @tab -s/-sharp @tab -f/-flat @tab -ss/-x/-sharpsharp - @tab -ff/-flatflat -@item @code{espanol} o @code{español} - @tab -s @tab -b @tab -ss/-x @tab -bb -@item @code{italiano} o @code{français} - @tab -d @tab -b @tab -dd @tab -bb + @tab -@code{s}/-@code{-sharp} @tab -@code{f}/-@code{-flat} @tab -@code{ss}/-@code{x}/-@code{-sharpsharp} + @tab -@code{ff}/-@code{-flatflat} +@item @code{espanol} or @code{español} + @tab -@code{s} @tab -@code{b} @tab -@code{ss}/-@code{x} @tab -@code{bb} +@item @code{français} + @tab -@code{d} @tab -@code{b} @tab -@code{dd}/-@code{x} @tab -@code{bb} +@item @code{italiano} + @tab -@code{d} @tab -@code{b} @tab -@code{dd} @tab -@code{bb} @item @code{norsk} - @tab -iss/-is @tab -ess/-es @tab -ississ/-isis - @tab -essess/-eses + @tab -@code{iss}/-@code{is} @tab -@code{ess}/-@code{es} @tab -@code{ississ}/-@code{isis} + @tab -@code{essess}/-@code{eses} @item @code{portugues} - @tab -s @tab -b @tab -ss @tab -bb + @tab -@code{s} @tab -@code{b} @tab -@code{ss} @tab -@code{bb} @item @code{suomi} - @tab -is @tab -es @tab -isis @tab -eses + @tab -@code{is} @tab -@code{es} @tab -@code{isis} @tab -@code{eses} @item @code{svenska} - @tab -iss @tab -ess @tab -ississ @tab -essess + @tab -@code{iss} @tab -@code{ess} @tab -@code{ississ} @tab -@code{essess} @item @code{vlaams} - @tab -k @tab -b @tab -kk @tab -bb + @tab -@code{k} @tab -@code{b} @tab -@code{kk} @tab -@code{bb} @end multitable @end quotation -En holandés, @code{aes} se contrae como @code{as}, pero las dos formas -se aceptan en LilyPond. De forma similar, se aceptan tanto @code{es} -como @code{ees}. Esto se aplica también a +En holandés, @code{aes} se contrae como @code{as}, pero las dos +formas se aceptan en LilyPond. De forma similar, se aceptan tanto +@code{es} como @code{ees}. Esto se aplica también a @code{aeses}@tie{}/@tie{}@code{ases} y a -@code{eeses}@tie{}/@tie{}@code{eses}. A veces se definen solamente -estos nombres contraídos en los archivos de idioma correspondientes. +@code{eeses}@tie{}/@tie{}@code{eses}. A veces se definen +solamente estos nombres contraídos en los archivos de idioma +correspondientes. -@lilypond[verbatim,quote,relative=2] -a2 as e es a ases e eses +@lilypond[verbatim,quote,fragment] +\relative c'' { a2 as e es a ases e eses } @end lilypond @cindex microtonos @@ -567,13 +587,13 @@ a2 as e es a ases e eses @cindex sesqui-sostenido @cindex sesqui-bemol -Algunas músicas utilizan microtonos cuyas alteraciones son fracciones -de un sostenido o bemol @q{normales}. La tabla siguiente relacione -los nombres de las notas para las alteraciones de un cuarto de tono en -distintos idiomas; aquí, los prefijos @notation{semi-} y -@notation{sesqui-} respectivamente significan @q{medio} y @q{uno y -medio}. Los idiomas que no aparecen en esta tabla no aportan aún -nombres especiales para las notas. +Algunas músicas utilizan microtonos cuyas alteraciones son +fracciones de un sostenido o bemol @q{normales}. La tabla +siguiente relacione los nombres de las notas para las alteraciones +de un cuarto de tono en distintos idiomas; aquí, los prefijos +@notation{semi-} y @notation{sesqui-} respectivamente significan +@q{medio} y @q{uno y medio}. Los idiomas que no aparecen en esta +tabla no aportan aún nombres especiales para las notas. @quotation @multitable {@code{nederlands}} {@b{semi-sostenido}} {@b{semi-bemol}} {@b{sesqui-sostenido}} {@b{sesqui-bemol}} @@ -586,8 +606,10 @@ nombres especiales para las notas. @tab -ih @tab -eh @tab -isih @tab -eseh @item @code{english} @tab -qs @tab -qf @tab -tqs @tab -tqf -@item @code{espanol} +@item @code{espanol} o @code{español} @tab -cs @tab -cb @tab -tcs @tab -tcb +@item @code{français} + @tab -sd @tab -sb @tab -dsd @tab -bsb @item @code{italiano} @tab -sd @tab -sb @tab -dsd @tab -bsb @item @code{portugues} @@ -595,11 +617,12 @@ nombres especiales para las notas. @end multitable @end quotation -Casi todos los idiomas presentados aquí están asociados comúnmente con -la música clásica occidental, también conocida como @notation{Período -de la práctica común}. Sin embargo, también están contempladas las -alturas y los sistemas de afinación alternativos: véase @ref{Notación -común para músicas no occidentales}. +Casi todos los idiomas presentados aquí están asociados comúnmente +con la música clásica occidental, también conocida como +@notation{Período de la práctica común}. Sin embargo, también +están contempladas las alturas y los sistemas de afinación +alternativos: véase @ref{Notación común para músicas no +occidentales}. @seealso Glosario musical: @@ -641,40 +664,40 @@ Esta sección trata de la manera de modificar las alturas. @funindex = @funindex \octaveCheck -@funindex octaveCheck @funindex controlpitch -En el modo relativo, es fácil olvidar una marca de cambio de octava. -Las comprobaciones de octava hacen más fácil encontrar estos errores, -mediante la presentación de una advertencia y corrigiendo la octava si -la nota se encuentra en una octava distinta de lo esperado. +En el modo relativo, es fácil olvidar una marca de cambio de +octava. Las comprobaciones de octava hacen más fácil encontrar +estos errores, mediante la presentación de una advertencia y +corrigiendo la octava si la nota se encuentra en una octava +distinta de lo esperado. -Para comprobar la octava de una nota, especifique la octava absoluta -después del símbolo@tie{}@code{=}. Este ejemplo genera un mensaje de -advertencia (y corrige la altura) porque la segunda nota es la octava -absoluta @code{d''} en lugar de @code{d'} como indica la corrección de -octava. +Para comprobar la octava de una nota, especifique la octava +absoluta después del símbolo@tie{}@code{=}. Este ejemplo genera +un mensaje de advertencia (y corrige la altura) porque la segunda +nota es la octava absoluta @code{d''} en lugar de @code{d'} como +indica la corrección de octava. @lilypond[verbatim,quote] -\relative c'' { - c2 d='4 d +\relative { + c''2 d='4 d e2 f } @end lilypond -La octava de las notas se puede comprobar también con la instrucción -@code{\octaveCheck@tie{}@var{altura_de_control}}. -@code{@var{altura_de_control}} se especifica en modo absoluto. Esto -comprueba que el intervalo entre la nota anterior y la -@code{@var{altura_de_control}} se encuentra dentro de una cuarta (es decir, el -cálculo normal para el modo relativo). Si esta comprobación fracasa, -se imprime un mensaje de advertencia, pero la nota previa no se -modifica. Las notas posteriores están en relación a la -@code{@var{altura_de_control}}. +La octava de las notas se puede comprobar también con la +instrucción @code{\octaveCheck@tie{}@var{altura_de_control}}. +@code{@var{altura_de_control}} se especifica en modo absoluto. +Esto comprueba que el intervalo entre la nota anterior y la +@code{@var{altura_de_control}} se encuentra dentro de una cuarta +(es decir, el cálculo normal para el modo relativo). Si esta +comprobación fracasa, se imprime un mensaje de advertencia. +Aunque la nota previa no se modifica, las notas posteriores están +en relación al valor corregido. @lilypond[verbatim,quote] -\relative c'' { - c2 d +\relative { + c''2 d \octaveCheck c' e2 f } @@ -685,8 +708,8 @@ comprobaciones de @code{\octaveCheck} fracasan, pero la segunda es correcta. @lilypond[verbatim,quote] -\relative c'' { - c4 f g f +\relative { + c''4 f g f c4 \octaveCheck c' @@ -718,64 +741,65 @@ Referencia de funcionamiento interno: @cindex notas, transporte de @funindex \transpose -@funindex transpose -Una expresión musical se puede transportar mediante @code{\transpose}. -La sintaxis es +Una expresión musical se puede transportar mediante +@code{\transpose}. La sintaxis es @example \transpose @var{nota_origen} @var{nota_destino} @var{expresión_musical} @end example -Esto significa que la @code{@var{expresión_musical}} se transporta el -intervalo que hay entre las notas @code{@var{nota_origen}} y -@code{@var{nota_destino}}: cualquier nota con la altura de @code{@var{nota_origen}} -se cambia por @code{@var{nota_destino}} y cualquier otra nota se transporta -el mismo intervalo. Las dos notas se introducen en modo absoluto. +Esto significa que la @code{@var{expresión_musical}} se transporta +el intervalo que hay entre las notas @code{@var{nota_origen}} y +@code{@var{nota_destino}}: cualquier nota con la altura de +@code{@var{nota_origen}} se cambia por @code{@var{nota_destino}} y +cualquier otra nota se transporta el mismo intervalo. Las dos +notas se introducen en modo absoluto. -@warning{La música que está dentro de un bloque @code{@bs{}transpose} -es absoluta, a no ser que se incluya una instrucción -@code{@bs{}relative} dentro del bloque.} +@warning{La música que está dentro de un bloque +@code{@bs{}transpose} es absoluta, a no ser que se incluya una +instrucción @code{@bs{}relative} dentro del bloque.} -Por ejemplo, tomemos una pieza escrita en la tonalidad de Re mayor. -Se puede transportar hacia arriba a Mi mayor; observe que también la -armadura de la tonalidad se transporta automáticamente. +Por ejemplo, tomemos una pieza escrita en la tonalidad de Re +mayor. Se puede transportar hacia arriba a Mi mayor; observe que +también la armadura de la tonalidad se transporta automáticamente. @lilypond[verbatim,quote] \transpose d e { - \relative c' { + \relative { \key d \major - d4 fis a d + d'4 fis a d } } @end lilypond Si una particella escrita en Do (@notation{afinación de concierto} normal) se debe tocar con un clarinete en La (para el que un La se -escribe como un Do, y que suena una tercera menor por debajo de lo que -está escrito), la particella correspondiente se produce mediante: +escribe como un Do, y que suena una tercera menor por debajo de lo +que está escrito), la particella correspondiente se produce +mediante: @lilypond[verbatim,quote] \transpose a c' { - \relative c' { + \relative { \key c \major - c4 d e g + c'4 d e g } } @end lilypond @noindent -Observe que especificamos @code{\key c \major} de forma explícita. Si -no especificamos ninguna tonalidad, las notas se transportan pero no -se imprime la armadura. +Observe que especificamos @code{\key c \major} de forma explícita. +Si no especificamos ninguna tonalidad, las notas se transportan +pero no se imprime la armadura. @code{\transpose} distingue entre notas enarmónicas: tanto -@code{\transpose c cis} como @code{\transpose c des} transportan un -semitono hacia arriba. La primera versión imprime sostenidos y las -notas no se mueven de su lugar en la escala, en cambio la segunda -imprime bemoles de la nota siguiente. +@code{\transpose c cis} como @code{\transpose c des} transportan +un semitono hacia arriba. La primera versión imprime sostenidos y +las notas no se mueven de su lugar en la escala, en cambio la +segunda imprime bemoles de la nota siguiente. @lilypond[verbatim,quote] -music = \relative c' { c d e f } +music = \relative { c' d e f } \new Staff { \transpose c cis { \music } \transpose c des { \music } @@ -785,12 +809,13 @@ music = \relative c' { c d e f } @cindex transpositores, instrumentos @cindex instrumentos transpositores -@code{\transpose} también se puede usar para introducir notas escritas -para un instrumento transpositor. Los ejemplos anteriores muestran -cómo escribir alturas en Do (o en @notation{afinación de concierto}) y -tipografiarlas para un instrumento transpositor, pero también es -posible el caso contrario si, por ejemplo, tenemos un conjunto de -partes instrumentales y quiere hacer un guión en Do para el director. +@code{\transpose} también se puede usar para introducir notas +escritas para un instrumento transpositor. Los ejemplos +anteriores muestran cómo escribir alturas en Do (o en +@notation{afinación de concierto}) y tipografiarlas para un +instrumento transpositor, pero también es posible el caso +contrario si, por ejemplo, tenemos un conjunto de partes +instrumentales y quiere hacer un guión en Do para el director. Por ejemplo, al introducir música para trompeta en Si bemol que comienza por un Mi en la partitura (Re de concierto), se puede escribir: @@ -802,7 +827,8 @@ musicaEnSiBemol = @{ e4 @dots{} @} @noindent Para imprimir esta música en Fa (por ejemplo, al arreglarla para -trompa) puede envolver la música existente con otro @code{\transpose}: +trompa) puede envolver la música existente con otro +@code{\transpose}: @example musicaEnSiBemol = @{ e4 @dots{} @} @@ -832,21 +858,20 @@ Referencia de funcionamiento interno: @rinternals{TransposedMusic}. @funindex \transpose -@funindex transpose @funindex \chordmode -@funindex chordmode @funindex \relative -@funindex relative @knownissues -La conversión relativa no afecta a las secciones @code{\transpose}, -@code{\chordmode} ni @code{\relative} dentro de su argumento. Para -usar el modo relativo dentro de música transportada, se debe colocar -otro @code{\relative} dentro de @code{\transpose}. +La conversión relativa no afecta a las secciones +@code{\transpose}, @code{\chordmode} ni @code{\relative} dentro de +su argumento. Para usar el modo relativo dentro de música +transportada, se debe colocar otro @code{\relative} dentro de +@code{\transpose}. No se imprimen alteraciones accidentales triples cuando se usa -@code{\transpose}. En lugar de ello, se usará una nota @q{equivalente -enarmónicamente} (p.ej., Re bemol en lugar de Mi triple bemol). +@code{\transpose}. En lugar de ello, se usará una nota +@q{equivalente enarmónicamente} (p.ej., Re bemol en lugar de Mi +triple bemol). @node Inversión @@ -864,13 +889,13 @@ operación con: \inversion @var{nota-pivote} @var{nota-destino} @var{expresión_musical} @end example -La @code{@var{expresión_musical}} se invierte intervalo a intervalo -alrededor de @code{@var{nota-pivote}}, y después se transporta de -manera que @code{@var{nota-pivote}} se hace corresponder con -@code{@var{nota-destino}}. +La @code{@var{expresión_musical}} se invierte intervalo a +intervalo alrededor de @code{@var{nota-pivote}}, y después se +transporta de manera que @code{@var{nota-pivote}} se hace +corresponder con @code{@var{nota-destino}}. @lilypond[verbatim,quote] -music = \relative c' { c d e f } +music = \relative { c' d e f } \new Staff { \music \inversion d' d' \music @@ -879,8 +904,8 @@ music = \relative c' { c d e f } @end lilypond @warning{Los motivos a invertir deberían venir expresados en modo -absoluto o convertirse previamente a la forma absoluta encerrándolos -en un bloque @code{\relative}.} +absoluto o convertirse previamente a la forma absoluta +encerrándolos en un bloque @code{\relative}.} @seealso Referencia de la notación: @@ -897,13 +922,12 @@ Referencia de la notación: @cindex transformación de retrogradación @cindex operación de retrogradación @funindex \retrograde -@funindex retrograde Se puede revertir una expresión musical para producir su retrogradación: @lilypond[verbatim,quote] -music = \relative c' { c8. ees16( fis8. a16 b8.) gis16 f8. d16 } +music = \relative { c'8. ees16( fis8. a16 b8.) gis16 f8. d16 } \new Staff { \music @@ -933,14 +957,15 @@ Referencia de la notación: @cindex operaciones modales En una composición musical que está basada en una escala, con -frecuencia se transforman los motivos de diversas formas. Un motivo -se puede @notation{transportar} para que comience en distintos lugares -de la escala o puede @notation{invertirse} alrededor de una nota -pivote de la escala. También se puede revertir para producir una -@notation{retrogradación}, véase @ref{Retrogradación}. +frecuencia se transforman los motivos de diversas formas. Un +motivo se puede @notation{transportar} para que comience en +distintos lugares de la escala o puede @notation{invertirse} +alrededor de una nota pivote de la escala. También se puede +revertir para producir una @notation{retrogradación}, véase +@ref{Retrogradación}. -@warning{Cualquier nota que no entre en la escada dada, se dejará sin -transformar.} +@warning{Cualquier nota que no entre en la escada dada, se dejará +sin transformar.} @subsubsubheading Transposición modal @@ -950,7 +975,6 @@ transformar.} @cindex transposición modal @cindex operación de transposición @funindex \modalTranspose -@funindex modalTranspose Se puede transportar un motivo dentro de una escala dada con: @@ -958,13 +982,13 @@ Se puede transportar un motivo dentro de una escala dada con: \modalTranspose @var{nota-origen} @var{nota-destino} @var{escala} @var{motivo} @end example -Las notas del @var{motivo} se desplazan dentro de la @var{escala} el -número de grados de la escala dados por el intervalo entre +Las notas del @var{motivo} se desplazan dentro de la @var{escala} +el número de grados de la escala dados por el intervalo entre @var{nota-destino} y @var{nota-origen}: @lilypond[verbatim,quote] -diatonicScale = \relative c' { c d e f g a b } -motif = \relative c' { c8 d e f g a b c } +diatonicScale = \relative { c' d e f g a b } +motif = \relative { c'8 d e f g a b c } \new Staff { \motif @@ -973,12 +997,12 @@ motif = \relative c' { c8 d e f g a b c } } @end lilypond -Se pueden especificar escalas ascendentes de cualquier longitud y con -cualesquiera intervalos: +Se pueden especificar escalas ascendentes de cualquier longitud y +con cualesquiera intervalos: @lilypond[verbatim,quote] -pentatonicScale = \relative c' { ges aes bes des ees } -motif = \relative c' { ees8 des ges,4 } +pentatonicScale = \relative { ges aes bes des ees } +motif = \relative { ees'8 des ges,4 } \new Staff { \motif @@ -987,12 +1011,13 @@ motif = \relative c' { ees8 des ges,4 } @end lilypond Cuando se utiliza con una escala cromática, @code{\modalTranspose} -tiene un efecto similar a @code{\transpose}, pero con la posibilidad -de especificar los nombres de las notas que se quieren usar: +tiene un efecto similar a @code{\transpose}, pero con la +posibilidad de especificar los nombres de las notas que se quieren +usar: @lilypond[verbatim,quote] -chromaticScale = \relative c' { c cis d dis e f fis g gis a ais b } -motif = \relative c' { c8 d e f g a b c } +chromaticScale = \relative { c' cis d dis e f fis g gis a ais b } +motif = \relative { c'8 d e f g a b c } \new Staff { \motif @@ -1007,10 +1032,9 @@ motif = \relative c' { c8 d e f g a b c } @cindex inversión modal @cindex operación de inversión modal @funindex \modalInversion -@funindex modalInversion -Se puede invertir un motivo dentro de una escala dada alrededor de una -nota pivote dada y transportada al mismo tiempo en una única +Se puede invertir un motivo dentro de una escala dada alrededor de +una nota pivote dada y transportada al mismo tiempo en una única operación, con: @example @@ -1018,10 +1042,10 @@ operación, con: @end example Las notas del @var{motivo} se colocan al mismo número de grados de -distancia de la escala a partir de la @var{nota-pivote} dentro de la -@var{escala}, pero en la dirección opuestoa, y el resultado se -desplaza después dentro de la @var{escala} el número de grados de la -escala dados por el intervalo entre la @var{nota-destino} y la +distancia de la escala a partir de la @var{nota-pivote} dentro de +la @var{escala}, pero en la dirección opuestoa, y el resultado se +desplaza después dentro de la @var{escala} el número de grados de +la escala dados por el intervalo entre la @var{nota-destino} y la @var{nota-pivote}. Así pues, para invertir sencillamente alrededor de una nota de la @@ -1029,8 +1053,8 @@ escala, utilice el mismo valor para @var{nota-pivote} y @var{nota-destino}: @lilypond[verbatim,quote] -octatonicScale = \relative c' { ees f fis gis a b c d } -motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } +octatonicScale = \relative { ees' f fis gis a b c d } +motif = \relative { c'8. ees16 fis8. a16 b8. gis16 f8. d16 } \new Staff { \motif @@ -1039,13 +1063,14 @@ motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } @end lilypond Para invertir alrededor de una nota pivote entre dos notas de la -escala, invierta alrededor de una de las notas y después transporte en -un grado de la escala. Las dos notas especificadas se pueden -interpretar como que horquillan entre ellas a la nota pivote: +escala, invierta alrededor de una de las notas y después +transporte en un grado de la escala. Las dos notas especificadas +se pueden interpretar como que horquillan entre ellas a la nota +pivote: @lilypond[verbatim,quote] -scale = \relative c' { c g' } -motive = \relative c' { c c g' c, } +scale = \relative { c' g' } +motive = \relative { c' c g' c, } \new Staff { \motive @@ -1057,8 +1082,8 @@ La operación combinada de inversión y retrogradación produce la inversión retrógrada: @lilypond[verbatim,quote] -octatonicScale = \relative c' { ees f fis gis a b c d } -motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } +octatonicScale = \relative { ees' f fis gis a b c d } +motif = \relative { c'8. ees16 fis8. a16 b8. gis16 f8. d16 } \new Staff { \motif @@ -1077,8 +1102,8 @@ Referencia de la notación: @subsection Imprimir las alturas @translationof Displaying pitches -Esta sección trata de cómo alterar la presentación de la altura de las -notas. +Esta sección trata de cómo alterar la presentación de la altura de +las notas. @menu * Clave:: @@ -1122,53 +1147,45 @@ notas. @cindex clave de contrabajo @funindex \clef -@funindex clef -Es posible cambiar la clave. En todos los ejemplos se muestra el Do -central. Estos nombres de clave pueden (aunque no necesariamente) -encerrarse entre comillas. +Sin ninugna instrucción explícita, la clave predeterminada en +LilyPond es la clave @qq{treble} (o clave de @emph{Sol}). -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment,ragged-right] +c'2 c' +@end lilypond + +Sin embargo, se puede cambiar la clave usando la instrucción +@code{\clef} y el nombre de la clave correspondiente. En los +siguientes ejemplos se muestra la posición del @emph{Do central} +en distintas claves. + +@lilypond[verbatim,quote,fragment] \clef treble -c2 c +c'2 c' \clef alto -c2 c +c'2 c' \clef tenor -c2 c +c'2 c' \clef bass -c2 c +c'2 c' @end lilypond -Otras claves son las siguientes: - -@lilypond[verbatim,quote,relative=1] -\clef french -c2 c -\clef soprano -c2 c -\clef mezzosoprano -c2 c -\clef baritone -c2 c - -\break +Para ver el repertorio completo de los posibles nombes para las +cllaves, consulte @ref{Estilos de clave}. -\clef varbaritone -c2 c -\clef subbass -c2 c -\clef percussion -c2 c +Las claves especiales como las utilizadas en la música +@emph{antigua}, se describen en @ref{Claves de la música mensural} +y en @ref{Claves de canto gregoriano}. La música que requiere +claves de tablatura se estudia en @ref{Tablaturas predeterminadas} +y en @ref{Tablaturas personalizadas}. -\break +@cindex Claves de guía +@cindex Claves con notas guía -\clef G % synonym for treble -c2 c -\clef F % synonym for bass -c2 c -\clef C % synonym for alto -c2 c -@end lilypond +Para emplear claves en las notas guía, véanse las instrucciones +@code{\cueClef} y @code{\cueDuringWithClef} en +@ref{Formateo de las notas guía}. @cindex transpositoras, claves @cindex clave transpositora @@ -1179,46 +1196,94 @@ c2 c @cindex tenor, clave de, coral Al añadir @code{_8} o @code{^8} al nombre de la clave, la clave se -transpone una octava hacia abajo o hacia arriba, respectivamente, y -@code{_15} y @code{^15} la transpone dos octavas. Si es necesario -se pueden usar otros números enteros. El argumento +transpone una octava hacia abajo o hacia arriba, respectivamente, +y @code{_15} y @code{^15} la transpone dos octavas. Si es +necesario se pueden usar otros números enteros. El argumento @var{nombre_de_clave} se debe encerrar entre comillas si contiene caracteres no alfabéticos: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef treble -c2 c +c'2 c' \clef "treble_8" -c2 c +c'2 c' \clef "bass^15" -c2 c +c'2 c' \clef "alto_2" -c2 c +c'2 c' \clef "G_8" -c2 c +c'2 c' \clef "F^5" -c2 c +c'2 c' @end lilypond Se puede obtener una indicación de octavación opcional encerrando el argumento numérico entre paréntesis o corchetes rectos: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef "treble_(8)" -c2 c +c'2 c' \clef "bass^[15]" -c2 c +c'2 c' @end lilypond Las alturas se imprimen como si el argumento numérico no tuviera los paréntesis o corchetes. -Ciertas claves para usos especiales se describen en @ref{Claves de la -música mensural}, @ref{Claves de canto gregoriano}, @ref{Tablaturas -predeterminadas} y @ref{Tablaturas personalizadas}. Para mezclar -distintas claves al usar notas guía dentro de una partitura, -consulte las funciones @code{\cueClef} y @code{\cueDuringWithClef} -en la sección @ref{Formateo de las notas guía}. +De forma predeterminada, un cambio de clave que se produce en un +salto de línea provoca que el símbolo de clave nuevo se imprima al +final de la línea anterior, como una clave @emph{de cortesía}, así +como al principio del siguiente. Esta clave @emph{de cortesía} se +puede suprimir. + +@lilypond[verbatim,quote,fragment] +\clef treble { c'2 c' } \break +\clef bass { c'2 c' } \break +\clef alto + \set Staff.explicitClefVisibility = #end-of-line-invisible + { c'2 c' } \break + \unset Staff.explicitClefVisibility +\clef bass { c'2 c' } \break +@end lilypond + +De forma predeterminada, una clave que se ha impreso previamente +no se vuelve a imprimir si se emplea de nuevo la misma instrucción +@code{\clef}, y se ignora. La instrucción @code{\set +Staff.forceClef = ##t} modifica este comportamiento. + +@lilypond[verbatim,quote,fragment] + \clef treble + c'1 + \clef treble + c'1 + \set Staff.forceClef = ##t + c'1 + \clef treble + c'1 +@end lilypond + +Cuando hay un cambio de clave manual, el glifo de la clave +modificada es pás pequeño de lo normal. Se puede sobreescribir +este comportamiento. + +@lilypond[verbatim,quote,fragment] + \clef "treble" + c'1 + \clef "bass" + c'1 + \clef "treble" + c'1 + \override Staff.Clef.full-size-change = ##t + \clef "bass" + c'1 + \clef "treble" + c'1 + \revert Staff.Clef.full-size-change + \clef "bass" + c'1 + \clef "treble" + c'1 +@end lilypond @snippets @@ -1233,6 +1298,9 @@ Referencia de la notación: @ref{Tablaturas personalizadas}, @ref{Formateo de las notas guía}. +Archivos instalados: +@file{scm/parser-clef.scm}. + Fragmentos de código: @rlsr{Pitches}. @@ -1249,13 +1317,13 @@ grobs distintos. Así pues, cualquier @code{\override} también al grob @var{ClefModifier} como un @code{\override} diferente. -@lilypond[fragment,quote,relative=1] +@lilypond[fragment,quote,verbatim] \new Staff \with { - \override ClefModifier.color = #red \override Clef.color = #blue + \override ClefModifier.color = #red } -\clef "treble_8" c4 +\clef "treble_8" c'4 @end lilypond @@ -1266,16 +1334,16 @@ diferente. @cindex Armadura de la tonalidad @funindex \key -@funindex key @c duplicated in Key signature and Accidentals @warning{Las alteraciones accidentales y las armaduras son una -frecuente causa de confusión para los nuevos usuarios. En LilyPond, -los nombres de las notas son el código de entrada en bruto; la -armadura y la clave determinan de qué forma se presenta este código en -bruto. Una nota sin alteración como@tie{}@code{c} significa @q{Do -natural}, si que le afecten la armadura ni la clave. Para ver más -información, consulte @rlearning{Alteraciones accidentales y armaduras}.} +frecuente causa de confusión para los nuevos usuarios. En +LilyPond, los nombres de las notas son el código de entrada en +bruto; la armadura y la clave determinan de qué forma se presenta +este código en bruto. Una nota sin alteración como@tie{}@code{c} +significa @q{Do natural}, si que le afecten la armadura ni la +clave. Para ver más información, consulte @rlearning{Alturas y +armaduras}.} La armadura indica la tonalidad en que se toca una pieza. Está denotada por un conjunto de alteraciones (bemoles o sostenidos) al @@ -1287,23 +1355,14 @@ armadura se hace con la instrucción @code{\key}: @end example @funindex \major -@funindex major @funindex \minor -@funindex minor @funindex \ionian -@funindex ionian @funindex \locrian -@funindex locrian @funindex \aeolian -@funindex aeolian @funindex \mixolydian -@funindex mixolydian @funindex \lydian -@funindex lydian @funindex \phrygian -@funindex phrygian @funindex \dorian -@funindex dorian @cindex modos eclesiásticos @cindex modos @@ -1318,19 +1377,22 @@ armadura se hace con la instrucción @code{\key}: @cindex dórico, modo @noindent -Aquí, @code{@var{modo}} debe ser @code{\major} o @code{\minor} para obtener -la tonalidad @code{@var{nota}} mayor o @code{@var{nota}} menor, respectivamente. -También puede usar los nombres estándar de modo (también conocidos -como @notation{modos eclesiásticos}): @code{\ionian} (jónico), -@code{\dorian} (dórico), @code{\phrygian} (frigio), @code{\lydian} -(lidio), @code{\mixolydian} (mixolidio), @code{\aeolian} (eolio) y +Aquí, @code{@var{modo}} debe ser @code{\major} o @code{\minor} +para obtener la tonalidad @code{@var{nota}} mayor o +@code{@var{nota}} menor, respectivamente. También puede usar los +nombres estándar de modo (también conocidos como @notation{modos +eclesiásticos}): @code{\ionian} (jónico), @code{\dorian} (dórico), +@code{\phrygian} (frigio), @code{\lydian} (lidio), +@code{\mixolydian} (mixolidio), @code{\aeolian} (eolio) y @code{\locrian} (locrio). -@lilypond[verbatim,quote,relative=2] -\key g \major -fis1 -f -fis +@lilypond[verbatim,quote,fragment] +\relative { + \key g \major + fis''1 + f + fis +} @end lilypond Se pueden definir modos adicionales, escribiendo una lista con la @@ -1341,8 +1403,8 @@ comienza en Do. freygish = #`((0 . ,NATURAL) (1 . ,FLAT) (2 . ,NATURAL) (3 . ,NATURAL) (4 . ,NATURAL) (5 . ,FLAT) (6 . ,FLAT)) -\relative c' { - \key c \freygish c4 des e f +\relative { + \key c \freygish c'4 des e f \bar "||" \key d \freygish d es fis g } @end lilypond @@ -1356,14 +1418,14 @@ en que se imprimirán las alteraciones. Si en una entrada se especifica una sola posición, las alteraciones se colocan dentro de la octava que termina en dicha posición del pentagrama. -@lilypond[verbatim, quote,relative=0] +@lilypond[verbatim, quote,fragment] \override Staff.KeySignature.flat-positions = #'((-5 . 5)) \override Staff.KeyCancellation.flat-positions = #'((-5 . 5)) -\clef bass \key es \major es g bes d -\clef treble \bar "||" \key es \major es g bes d +\clef bass \key es \major es g bes d' +\clef treble \bar "||" \key es \major es' g' bes' d'' \override Staff.KeySignature.sharp-positions = #'(2) -\bar "||" \key b \major b fis b2 +\bar "||" \key b \major b' fis' b'2 @end lilypond @snippets @@ -1374,13 +1436,14 @@ de la octava que termina en dicha posición del pentagrama. @lilypondfile[verbatim,quote,texidoc,doctitle] {non-traditional-key-signatures.ly} + @seealso Glosario musical: @rglos{church mode}, @rglos{scordatura}. Manual de aprendizaje: -@rlearning{Alteraciones accidentales y armaduras}. +@rlearning{Alturas y armaduras}. Fragmentos de código: @rlsr{Pitches}. @@ -1405,23 +1468,24 @@ Referencia de funcionamiento interno: @funindex set-octavation @funindex \ottava -@funindex ottava Los @notation{corchetes de Ottava} introducen un trasporte adicional de una octava para el pentagrama. -@lilypond[verbatim,quote,relative=2] -a2 b -\ottava #-2 -a2 b -\ottava #-1 -a2 b -\ottava #0 -a2 b -\ottava #1 -a2 b -\ottava #2 -a2 b +@lilypond[verbatim,quote] +\relative a' { + a2 b + \ottava #-2 + a2 b + \ottava #-1 + a2 b + \ottava #0 + a2 b + \ottava #1 + a2 b + \ottava #2 + a2 b +} @end lilypond @snippets @@ -1432,6 +1496,9 @@ a2 b @lilypondfile[verbatim,quote,texidoc,doctitle] {adding-an-ottava-marking-to-a-single-voice.ly} +@lilypondfile[verbatim,quote,texidoc,doctitle] +{modifying-the-ottava-spanner-slope.ly} + @seealso Glosario musical: @rglos{octavation}. @@ -1456,33 +1523,34 @@ Referencia de funcionamiento interno: @cindex MIDI, transposición @funindex \transposition -@funindex transposition Al tipografiar partituras donde participan instrumentos transpositores, ciertas partes se pueden tipografiar en un tono -distinto del @notation{tono de concierto}. En estos casos, se debe -especificar la tonalidad del @notation{instrumento transpositor}; de -otro modo, la salida MIDI y las notas guía en otras partes producirían -alturas incorrectas. Para ver más información sobre partes citadas -como guía, consulte @ref{Citar otras voces}. +distinto del @notation{tono de concierto}. En estos casos, se +debe especificar la tonalidad del @notation{instrumento +transpositor}; de otro modo, la salida MIDI y las notas guía en +otras partes producirían alturas incorrectas. Para ver más +información sobre partes citadas como guía, consulte @ref{Citar +otras voces}. @example \transposition @var{pitch} @end example -El tono usado para @code{\transposition} debe corresponderse con el -sonido real que se oye cuando el instrumento transpositor interpreta -un Do central @code{c'} escrito en el pentagrama. Esta nota se -escribe en altura absoluta, por tanto un instrumento que produce un -sonido real un tono más agudo que la música impresa (un instrumento en -Re) debe usar @code{\transposition d'}. La instrucción -@code{\transposition} se debe usar @emph{solamente} si las notas -@emph{no} se van a escribir en afinación de concierto. - -A continuación pueden verse algunas notas para violín y para clarinete -en Si bemol, donde las partes se han introducido usando las notas y la -armadura tal y como aparecen en la partitura del director. Lo que -tocan los dos instrumentos está sonando al unísono. +El tono usado para @code{\transposition} debe corresponderse con +el sonido real que se oye cuando el instrumento transpositor +interpreta un Do central @code{c'} escrito en el pentagrama. Esta +nota se escribe en altura absoluta, por tanto un instrumento que +produce un sonido real un tono más agudo que la música impresa (un +instrumento en Re) debe usar @code{\transposition d'}. La +instrucción @code{\transposition} se debe usar @emph{solamente} si +las notas @emph{no} se van a escribir en afinación de concierto. + +A continuación pueden verse algunas notas para violín y para +clarinete en Si bemol, donde las partes se han introducido usando +las notas y la armadura tal y como aparecen en la partitura del +director. Lo que tocan los dos instrumentos está sonando al +unísono. @lilypond[verbatim,quote] \new GrandStaff << @@ -1568,9 +1636,10 @@ Fragmentos de código: @funindex voice @funindex default -Existen muchas convenciones distintas sobre la forma de tipografiar -las alteraciones. LilyPond proporciona una función para especificar -qué estilo de alteraciones usar. Esta función se invoca como sigue: +Existen muchas convenciones distintas sobre la forma de +tipografiar las alteraciones. LilyPond proporciona una función +para especificar qué estilo de alteraciones usar. Esta función se +invoca como sigue: @example \new Staff << @@ -1579,30 +1648,31 @@ qué estilo de alteraciones usar. Esta función se invoca como sigue: >> @end example -El estilo de alteraciones se aplica al @code{Staff} en curso de forma -predeterminada (con la excepción de los estilos @code{piano} y -@code{piano-cautionary}, que se explican más adelante). +El estilo de alteraciones se aplica al @code{Staff} en curso de +forma predeterminada (con la excepción de los estilos @code{piano} +y @code{piano-cautionary}, que se explican más adelante). Opcionalmente, la función puede tomar un segundo argumento que -determina en qué ámbito se debe cambiar el estilo. Por ejemplo, para -usar el mismo estilo en todos los pentagramas del @code{StaffGroup} en -curso, use +determina en qué ámbito se debe cambiar el estilo. Por ejemplo, +para usar el mismo estilo en todos los pentagramas del +@code{StaffGroup} en curso, use @example \accidentalStyle StaffGroup.voice @end example -Están contemplados los siguientes estilos de alteración. Para dar una -muestra de cada uno de los estilos, utilizamos el ejemplo siguiente: +Están contemplados los siguientes estilos de alteración. Para dar +una muestra de cada uno de los estilos, utilizamos el ejemplo +siguiente: @lilypond[verbatim,quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1612,8 +1682,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1641,9 +1711,9 @@ musicB = { } @end lilypond -Observe que las últimas líneas de este ejemplo se pueden sustituir por -las siguientes, siempre y cuando queramos usar el mismo estilo en los -dos pentagramas. +Observe que las últimas líneas de este ejemplo se pueden sustituir +por las siguientes, siempre y cuando queramos usar el mismo estilo +en los dos pentagramas. @example \new PianoStaff @{ @@ -1670,20 +1740,20 @@ dos pentagramas. Es el comportamiento de composición tipográfica predeterminado. Corresponde a la práctica común del s. XVIII: las alteraciones -accidentales se recuerdan hasta el final del compás en el que aparecen -y sólo en la misma octava. Así, en el ejemplo siguiente, no se -imprimen becuadros antes del Si natural en el segundo compás ni en el -último Do: +accidentales se recuerdan hasta el final del compás en el que +aparecen y sólo en la misma octava. Así, en el ejemplo siguiente, +no se imprimen becuadros antes del Si natural en el segundo compás +ni en el último Do: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1693,8 +1763,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1733,30 +1803,30 @@ musicB = { @funindex voice -El comportamiento normal es recordar las alteraciones accidentales al -nivel de @code{Staff}. En este estilo, sin embargo, se tipografían -las alteraciones individualmente para cada voz. Aparte de esto, la -regla es similar a @code{default}. +El comportamiento normal es recordar las alteraciones accidentales +al nivel de @code{Staff}. En este estilo, sin embargo, se +tipografían las alteraciones individualmente para cada voz. +Aparte de esto, la regla es similar a @code{default}. Como resultado, las alteraciones de una voz no se cancelan en las -otras voces, lo que con frecuencia lleva a un resultado no deseado: en -el ejemplo siguiente, es difícil determinar si el segundo La se debe -tocar natural o sostenido. Por tanto, la opción @code{voice} se debe -usar sólo si las voces se van a leer individualmente por músicos -distintos. Si el pentagrama va a utilizarse por parte de un solo -músico (p.ej., un director, o en una partitura de piano), entonces se -deben usar en su lugar los estilos @code{modern} o -@code{modern-cautionary}. +otras voces, lo que con frecuencia lleva a un resultado no +deseado: en el ejemplo siguiente, es difícil determinar si el +segundo La se debe tocar natural o sostenido. Por tanto, la +opción @code{voice} se debe usar sólo si las voces se van a leer +individualmente por músicos distintos. Si el pentagrama va a +utilizarse por parte de un solo músico (p.ej., un director, o en +una partitura de piano), entonces se deben usar en su lugar los +estilos @code{modern} o @code{modern-cautionary}. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1766,8 +1836,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1802,26 +1872,27 @@ musicB = { @funindex modern -Esta regla corresponde a la práctica común del s. XX. Omite algunos -becuadros adicionales, que tradicionalmente se imprimían precediendo a -un sostenido que sigue a un doble sostenido, o a un bemol que sigue -a un doble bemol. La regla @code{modern} imprime las mismas -alteraciones que el estilo @code{default}, con dos adiciones que -sirven para evitar la ambigüedad: después de alteraciones temporales -se imprimen indicaciones de cancelación también en el compás siguiente -(para notas en la misma octava) y, en el mismo compás, para notas en -octavas distintas. De aquí los becuadros antes del Si natural y del -Do en el segundo compás del pentagrama superior: +Esta regla corresponde a la práctica común del s. XX. Omite +algunos becuadros adicionales, que tradicionalmente se imprimían +precediendo a un sostenido que sigue a un doble sostenido, o a un +bemol que sigue a un doble bemol. La regla @code{modern} imprime +las mismas alteraciones que el estilo @code{default}, con dos +adiciones que sirven para evitar la ambigüedad: después de +alteraciones temporales se imprimen indicaciones de cancelación +también en el compás siguiente (para notas en la misma octava) y, +en el mismo compás, para notas en octavas distintas. De aquí los +becuadros antes del Si natural y del Do en el segundo compás del +pentagrama superior: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1831,8 +1902,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1869,21 +1940,20 @@ musicB = { @funindex modern-cautionary Esta regla es similar a @code{modern}, pero las alteraciones -@q{añadidas} (las que no se imprimen en el estilo @code{default}) se -imprimen como alteraciones de precaución. Se imprimen de forma -predeterminada con paréntesis, pero también se pueden imprimir en -tamaño reducido definiendo la propiedad @code{cautionary-style} de -@code{AccidentalSuggestion}. +@q{añadidas} se imprimen como alteraciones de precaución (entre +paréntesis). También se pueden imprimir en un tamaño distinto +sobreescribiendo la propiedad @code{font-size} del objeto +@code{AccidentalCautionary}. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1893,8 +1963,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1933,22 +2003,23 @@ musicB = { @funindex modern-voice Esta regla se usa para que puedan leer las alteraciones en varias -voces, tanto músicos que tocan una voz como músicos que tocan todas -las voces. Se imprimen las alteraciones para cada voz, pero @emph{se -cancelan} entre voces dentro del mismo @code{Staff}. Por tanto, el La -en el último compás se cancela porque la cancelación anterior estaba -en una voz distinta, y el Re en el pentagrama inferior se cancela a -causa de la alteración en otra voz en el compás previo: +voces, tanto músicos que tocan una voz como músicos que tocan +todas las voces. Se imprimen las alteraciones para cada voz, pero +@emph{se cancelan} entre voces dentro del mismo @code{Staff}. Por +tanto, el La en el último compás se cancela porque la cancelación +anterior estaba en una voz distinta, y el Re en el pentagrama +inferior se cancela a causa de la alteración en otra voz en el +compás previo: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1958,8 +2029,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1997,19 +2068,20 @@ musicB = { Esta regla es la misma que @code{modern-voice}, pero con las alteraciones añadidas (las que el estilo @code{voice} no imprime) -compuestas como de precaución. Incluso aunque todas las alteraciones -impresas por el estilo @code{default} @emph{son} impresas con esta -regla, algunas de ellas se tipografían como de precaución. +compuestas como de precaución. Incluso aunque todas las +alteraciones impresas por el estilo @code{default} @emph{son} +impresas con esta regla, algunas de ellas se tipografían como de +precaución. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2019,8 +2091,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2056,24 +2128,24 @@ musicB = { @funindex piano -Esta regla refleja la práctica del s.XX para la notación de piano. Su -comportamiento es muy similar al estilo @code{modern}, pero aquí las -alteraciones también se cancelan entre distintos pentagramas del mismo -grupo @code{GrandStaff} o @code{PianoStaff}, de ahí todas las -cancelaciones de las últimas notas. +Esta regla refleja la práctica del s.XX para la notación de piano. +Su comportamiento es muy similar al estilo @code{modern}, pero +aquí las alteraciones también se cancelan entre distintos +pentagramas del mismo grupo @code{GrandStaff} o @code{PianoStaff}, +de ahí todas las cancelaciones de las últimas notas. -Este estilo de alteración se aplica de manera predeterminada al grupo -@code{GrandStaff} o @code{PianoStaff} en curso. +Este estilo de alteración se aplica de manera predeterminada al +grupo @code{GrandStaff} o @code{PianoStaff} en curso. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2083,8 +2155,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2122,18 +2194,18 @@ musicB = { @funindex piano-cautionary -Igual que @code{\accidentalStyle piano} pero con las -alteraciones añadidas compuestas como de precaución. +Igual que @code{\accidentalStyle piano} pero con las alteraciones +añadidas compuestas como de precaución. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2143,8 +2215,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2178,20 +2250,21 @@ musicB = { @funindex neo-modern -Esta regla reproduce una práctica común en la música contemporánea: -las alteraciones accidentales se imprimen como en @code{modern}, pero -se vuelven a imprimir si aparece la misma nota otra vez en el mismo -compás (excepto si la nota se repite inmediatamente). +Esta regla reproduce una práctica común en la música +contemporánea: las alteraciones accidentales se imprimen como en +@code{modern}, pero se vuelven a imprimir si aparece la misma nota +otra vez en el mismo compás (excepto si la nota se repite +inmediatamente). @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2201,8 +2274,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2238,17 +2311,20 @@ musicB = { @funindex neo-modern-cautionary Esta regla es similar a @code{neo-modern}, pero las alteraciones -adicionales se imprimen como alteraciones de precaución. +@q{adicionales} se imprimen como alteraciones de precaución (con +paréntesis). También se pueden imprimir en un tamaño distinto +sobreescribiendo la propiedad @code{font-size} del objeto +@code{AccidentalCautionary}. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2258,8 +2334,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2294,21 +2370,22 @@ musicB = { @funindex neo-modern-voice -Esta regla se usa para alteraciones accidentales sobre varias voces -que se han de leer por parte de músicos que tocan una voz, así como -por músicos que tocan todas las voces. Las alteraciones se imprimen -para cada voz como con @code{neo-modern}, pero se cancelan para otras -voces que están en el mismo pentagrama @code{Staff}. +Esta regla se usa para alteraciones accidentales sobre varias +voces que se han de leer por parte de músicos que tocan una voz, +así como por músicos que tocan todas las voces. Las alteraciones +se imprimen para cada voz como con @code{neo-modern}, pero se +cancelan para otras voces que están en el mismo pentagrama +@code{Staff}. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2318,8 +2395,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2354,18 +2431,19 @@ musicB = { @funindex neo-modern-voice-cautionary -Esta regla es similar a @code{neo-modern-voice}, pero las alteraciones -adicionales se imprimen como alteraciones de precaución. +Esta regla es similar a @code{neo-modern-voice}, pero las +alteraciones adicionales se imprimen como alteraciones de +precaución. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2375,8 +2453,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2411,20 +2489,20 @@ musicB = { @funindex dodecaphonic -Esta regla refleja una práctica introducida por los compositores de -principios del s.XX, en un intento de abolir la jerarquía entre notas -naturales y alteradas. Con este estilo, @emph{todas} las notas llevan -alteración, incluso becuadros. +Esta regla refleja una práctica introducida por los compositores +de principios del s.XX, en un intento de abolir la jerarquía entre +notas naturales y alteradas. Con este estilo, @emph{todas} las +notas llevan alteración, incluso becuadros. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2434,8 +2512,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2463,6 +2541,126 @@ musicB = { } @end lilypond +@item dodecaphonic-no-repeat + +@cindex dodecaphonic accidental style +@cindex dodecaphonic style, neo-modern + +@funindex dodecaphonic-no-repeat + +Como con el estilo de alteraciones dodecafónico @emph{todas} las +notas llevan una alteración de forma predeterminada, pero las +alteriaciones se suprimen cuando hay notas repetidas +inmediatamente en el mismo pentagrama. + +@lilypond[quote] +musicA = { + << + \relative { + cis''8 fis, bes4 8 f bis4 | + cis2. 4 | + } + \\ + \relative { + ais'2 cis, | + fis8 b a4 cis2 | + } + >> +} + +musicB = { + \clef bass + \new Voice { + \voiceTwo \relative { + 8[ + \change Staff = up + cis' cis + \change Staff = down + ] + \showStaffSwitch + \change Staff = up + dis'4 | + \change Staff = down + 4 gis 2 | + } + } +} + +\new PianoStaff { + << + \context Staff = "up" { + \accidentalStyle dodecaphonic-no-repeat + \musicA + } + \context Staff = "down" { + \accidentalStyle dodecaphonic-no-repeat + \musicB + } + >> +} +@end lilypond + + +@item dodecaphonic-first + +@cindex dodecaphonic accidental style +@cindex dodecaphonic style, neo-modern + +@funindex dodecaphonic-first + +Similar al estilo de alteraciones dodecafónico, @emph{todas} las +notas llevan una alteración, pero solo la primera vez que se +encuentran en el compás. Las alteraciones se recuerdan solamente +para la octava actual pero a través de las voces. + +@lilypond[quote] +musicA = { + << + \relative { + cis''8 fis, bes4 8 f bis4 | + cis2. 4 | + } + \\ + \relative { + ais'2 cis, | + fis8 b a4 cis2 | + } + >> +} + +musicB = { + \clef bass + \new Voice { + \voiceTwo \relative { + 8[ + \change Staff = up + cis' cis + \change Staff = down + ] + \showStaffSwitch + \change Staff = up + dis'4 | + \change Staff = down + 4 gis 2 | + } + } +} + +\new PianoStaff { + << + \context Staff = "up" { + \accidentalStyle dodecaphonic-first + \musicA + } + \context Staff = "down" { + \accidentalStyle dodecaphonic-first + \musicB + } + >> +} +@end lilypond + + @item teaching (enseñanza) @cindex teaching (enseñanza), estilo de alteraciones @@ -2470,22 +2668,22 @@ musicB = { @funindex teaching -Esta regla está pensada para estudiantes, y hace más sencillo crear -hojas de escalas con alteraciones de precaución creadas +Esta regla está pensada para estudiantes, y hace más sencillo +crear hojas de escalas con alteraciones de precaución creadas automáticamente. Las alteraciones se imprimen como en el estilo -@code{modern}, pero se añaden alteraciones de precaución para todas -las notas sostenidas o bemoles especificadas por la armadura, excepto -si la nota se repite inmediatamente. +@code{modern}, pero se añaden alteraciones de precaución para +todas las notas sostenidas o bemoles especificadas por la +armadura, excepto si la nota se repite inmediatamente. @lilypond[quote,staffsize=18] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2495,8 +2693,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2533,18 +2731,18 @@ musicB = { @funindex no-reset -Es el mismo que @code{default} pero con alteraciones que duran @q{para -siempre} y no sólo dentro del mismo compás: +Es el mismo que @code{default} pero con alteraciones que duran +@q{para siempre} y no sólo dentro del mismo compás: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2554,8 +2752,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2590,20 +2788,20 @@ musicB = { @funindex forget -Es lo opuesto a @code{no-reset}: Las alteraciones no se recuerdan en -absoluto: de aquí que todas las alteraciones se compongan -tipográficamente en relación a la armadura de la tonalidad, sin que -estén afectadas por lo que viene antes. +Es lo opuesto a @code{no-reset}: Las alteraciones no se recuerdan +en absoluto: de aquí que todas las alteraciones se compongan +tipográficamente en relación a la armadura de la tonalidad, sin +que estén afectadas por lo que viene antes. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2613,8 +2811,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2663,21 +2861,22 @@ Referencia de funcionamiento interno: @cindex acordes, alteraciones dentro de @knownissues -Las notas simultáneas no se tienen en cuenta para la -determinación automática de las alteraciones accidentales; -sólo se consideran las notas anteriores y la armadura de -la tonalidad. Puede ser necesario forzar las alteraciones -accidentales con with@tie{}@code{!} o@tie{}@code{?} cuando -la misma nota, con el mismo nombre, ocurre simultáneamente -con distintas alteraciones, como en @samp{}. +Las notas simultáneas no se tienen en cuenta para la determinación +automática de las alteraciones accidentales; sólo se consideran +las notas anteriores y la armadura de la tonalidad. Puede ser +necesario forzar las alteraciones accidentales con +with@tie{}@code{!} o@tie{}@code{?} cuando la misma nota, con el +mismo nombre, ocurre simultáneamente con distintas alteraciones, +como en @samp{}. La cancelación de precaución de alteraciones se hace mirando el compás previo. Sin embargo, en el bloque @code{\alternative} que sigue a una sección de repetición de primera y segunda vez -@code{\repeat volta N}, se esperaría que la cancelación se calculase -utilizando el compás previo @emph{que se ha tocado}, no el compás -previo @emph{que se ha impreso}. En el ejemplo siguiente, el Do -natural de la casilla de segunda vez no necesita becuadro: +@code{\repeat volta N}, se esperaría que la cancelación se +calculase utilizando el compás previo @emph{que se ha tocado}, no +el compás previo @emph{que se ha impreso}. En el ejemplo +siguiente, el Do natural de la casilla de segunda vez no necesita +becuadro: @lilypond[quote] { @@ -2693,11 +2892,11 @@ natural de la casilla de segunda vez no necesita becuadro: } @end lilypond -Se puede usar el siguiente rodeo del problema: definir una función que -cambie localmente el estilo de alteraciones a @code{forget}: +Se puede usar el siguiente rodeo del problema: definir una función +que cambie localmente el estilo de alteraciones a @code{forget}: @lilypond[verbatim,quote] -forget = #(define-music-function (parser location music) (ly:music?) #{ +forget = #(define-music-function (music) (ly:music?) #{ \accidentalStyle forget #music \accidentalStyle modern @@ -2724,15 +2923,15 @@ forget = #(define-music-function (parser location music) (ly:music?) #{ @cindex tesitura El término @emph{ambitus} o ámbito, denota el rango de notas que -abarca una voz dada en una parte musical. También puede denotar el -margen de notas que es capaz de tocar un determinado instrumento -musical. Los ámbitos se imprimen en las partes vocales de tal manera -que los intérpretes puedan determinar con facilidad si cumplen con sus -propias posibilidades. +abarca una voz dada en una parte musical. También puede denotar +el margen de notas que es capaz de tocar un determinado +instrumento musical. Los ámbitos se imprimen en las partes +vocales de tal manera que los intérpretes puedan determinar con +facilidad si cumplen con sus propias posibilidades. Los ámbitos se presentan al comienzo de la pieza junto a la clave -inicial. El rango se especifica gráficamente mediante dos cabezas de -nota que representan a las notas inferior y superior. Sólo se +inicial. El rango se especifica gráficamente mediante dos cabezas +de nota que representan a las notas inferior y superior. Sólo se imprimen alteraciones si no forman parte de la armadura de la tonalidad. @@ -2744,8 +2943,8 @@ tonalidad. } } -\relative c'' { - aes c e2 +\relative { + aes' c e2 cis,1 } @end lilypond @@ -2818,16 +3017,18 @@ Esta sección propone formas de alterar las cabezas de las figuras. Se puede modificar la apariencia de la cabeza de las notas: -@lilypond[verbatim,quote,relative=2] -c4 b -\override NoteHead.style = #'cross -c4 b -\revert NoteHead.style -a b -\override NoteHead.style = #'harmonic -a b -\revert NoteHead.style -c4 d e f +@lilypond[verbatim,quote] +\relative c'' { + c4 b + \override NoteHead.style = #'cross + c4 b + \revert NoteHead.style + a b + \override NoteHead.style = #'harmonic + a b + \revert NoteHead.style + c4 d e f +} @end lilypond Para ver todos los estilos de cabeza de las notas, consulte @@ -2835,38 +3036,46 @@ Para ver todos los estilos de cabeza de las notas, consulte El estilo @code{cross} (aspas) se usa para representar una amplia variedad de intenciones musicales. Las siguientes instrucciones -genéricas predefinidas modifican la forma de la cabeza de las figuras -tanto en el contexto de pentagrama normal como en el de tablatura, y -se pueden usar para representar cualquier significado musical: +genéricas predefinidas modifican la forma de la cabeza de las +figuras tanto en el contexto de pentagrama normal como en el de +tablatura, y se pueden usar para representar cualquier significado +musical: -@lilypond[verbatim,quote,relative=2] -c4 b -\xNotesOn - a b c4 b -\xNotesOff -c4 d +@lilypond[verbatim,quote] +\relative { + c''4 b + \xNotesOn + a b c4 b + \xNotesOff + c4 d +} @end lilypond -La forma de función musical de esta instrucción predefinida se puede -usar dentro y fuera de los acordes para generar cabezas de nota en -aspa, tanto en el contexto de pentagrama normal como en el de -tablatura: +La forma de función musical de esta instrucción predefinida se +puede usar dentro y fuera de los acordes para generar cabezas de +nota en aspa, tanto en el contexto de pentagrama normal como en el +de tablatura: -@lilypond[verbatim,quote,relative=2] -c4 b -\xNote { e f } -c b < g \xNote c f > b +@lilypond[verbatim,quote] +\relative { + c''4 b + \xNote { e f } + c b < g \xNote c f > b +} @end lilypond -Como sinónimos de @code{\xNote}, @code{\xNotesOn} y @code{\xNotesOff}, -se pueden usar @code{\deadNote}, @code{\deadNotesOn} y -@code{\deadNotesOff}. El término @notation{dead note} (nota muerta) -se utiliza corrientemente por parte de los guitarristas. +Como sinónimos de @code{\xNote}, @code{\xNotesOn} y +@code{\xNotesOff}, se pueden usar @code{\deadNote}, +@code{\deadNotesOn} y @code{\deadNotesOff}. El término +@notation{dead note} (nota muerta) se utiliza corrientemente por +parte de los guitarristas. También existe una abreviatura similar para las formas en rombo: -@lilypond[verbatim,quote,relative=2] -2 4 f\harmonic +@lilypond[verbatim,quote] +\relative c'' { + 2 4 f\harmonic +} @end lilypond @predefined @@ -2909,15 +3118,14 @@ Referencia de funcionamiento interno: @cindex simplificada, notación @funindex \easyHeadsOn -@funindex easyHeadsOn @funindex \easyHeadsOff -@funindex easyHeadsOff -Las notas con cabeza de @q{notación facilitada} tienen el nombre de la -nota (en inglés) dentro de la cabeza. Se usan en la música para -principiantes. Para que las letras sean legibles, se deben imprimir -en un tamaño grande de fuente tipográfica. Para imprimir con una -fuente más grande, véase @ref{Establecer el tamaño del pentagrama}. +Las notas con cabeza de @q{notación facilitada} tienen el nombre +de la nota (en inglés) dentro de la cabeza. Se usan en la música +para principiantes. Para que las letras sean legibles, se deben +imprimir en un tamaño grande de fuente tipográfica. Para imprimir +con una fuente más grande, véase @ref{Establecer el tamaño del +pentagrama}. @lilypond[verbatim,quote] #(set-global-staff-size 26) @@ -2977,70 +3185,62 @@ Referencia de funcionamiento interno: @cindex notas, cabezas de, Walker @funindex \aikenHeads -@funindex aikenHeads @funindex \sacredHarpHeads -@funindex sacredHarpHeads @funindex \southernHarmonyHeads -@funindex southernHarmonyHeads @funindex \funkHeads -@funindex funkHeads @funindex \walkerHeads -@funindex walkerHeads - -En la notación de cabezas con forma, la forma de la cabeza corresponde -a la función armónica de una nota dentro de la escala. Esta notación -se hizo popular en los libros americanos de canciones durante el -s.XIX. Las cabezas de nota con formas se pueden producir en los -estilos @q{Sacred Harp}, @q{Southern Harmony}, -Funk (Harmonica Sacra), Walker y Aiken @q{(Christian + +En la notación de cabezas con forma, la forma de la cabeza +corresponde a la función armónica de una nota dentro de la +escala. Esta notación se hizo popular en los libros americanos de +canciones durante el s.XIX. Las cabezas de nota con formas se +pueden producir en los estilos @q{Sacred Harp}, @q{Southern +Harmony}, Funk (Harmonica Sacra), Walker y Aiken @q{(Christian Harmony)}: -@lilypond[verbatim,quote,relative=2] -\aikenHeads -c, d e f g2 a b1 c \break -\sacredHarpHeads -c,4 d e f g2 a b1 c \break -\southernHarmonyHeads -c,4 d e f g2 a b1 c \break -\funkHeads -c,4 d e f g2 a b1 c \break -\walkerHeads -c,4 d e f g2 a b1 c \break +@lilypond[verbatim,quote] +\relative c'' { + \aikenHeads + c, d e f g2 a b1 c \break + \sacredHarpHeads + c,4 d e f g2 a b1 c \break + \southernHarmonyHeads + c,4 d e f g2 a b1 c \break + \funkHeads + c,4 d e f g2 a b1 c \break + \walkerHeads + c,4 d e f g2 a b1 c \break +} @end lilypond @funindex \key -@funindex key @funindex \aikenHeadsMinor -@funindex aikenHeadsMinor @funindex \sacredHarpHeadsMinor -@funindex sacredHarpHeadsMinor @funindex \southernHarmonyHeadsMinor -@funindex southernHarmonyHeadsMinor @funindex \funkHeadsMinor -@funindex funkHeadsMinor @funindex \walkerHeadsMinor -@funindex walkerHeadsMinor - -Las formas se determinan en función del grado de la escala, donde la -tónica está determinada por la instrucción @code{\key} Cuando se -escribe en un tono menor, la nota de la escala se puede determinar a -partir del relativo mayor: - -@lilypond[verbatim,quote,relative=2] -\key a \minor -\aikenHeads -a b c d e2 f g1 a \break -\aikenHeadsMinor -a,4 b c d e2 f g1 a \break -\sacredHarpHeadsMinor -a,2 b c d \break -\southernHarmonyHeadsMinor -a2 b c d \break -\funkHeadsMinor -a2 b c d \break -\walkerHeadsMinor -a2 b c d \break +Las formas se determinan en función del grado de la escala, donde +la tónica está determinada por la instrucción @code{\key} Cuando +se escribe en un tono menor, la nota de la escala se puede +determinar a partir del relativo mayor: + +@lilypond[verbatim,quote] +\relative c'' { + \key a \minor + \aikenHeads + a b c d e2 f g1 a \break + \aikenHeadsMinor + a,4 b c d e2 f g1 a \break + \sacredHarpHeadsMinor + a,2 b c d \break + \southernHarmonyHeadsMinor + a2 b c d \break + \funkHeadsMinor + a2 b c d \break + \walkerHeadsMinor + a2 b c d \break +} @end lilypond @predefined @@ -3087,23 +3287,22 @@ Referencia de funcionamiento interno: @cindex notas, cabezas de, barradas @funindex \improvisationOn -@funindex improvisationOn @funindex \improvisationOff -@funindex improvisationOff -La improvisación se denota a veces mediante cabezas de nota en forma -de barra inclinada, donde el ejecutante puede elegir cualquier nota -pero con el ritmo especificado. Estas cabezas de nota se crean así: +La improvisación se denota a veces mediante cabezas de nota en +forma de barra inclinada, donde el ejecutante puede elegir +cualquier nota pero con el ritmo especificado. Estas cabezas de +nota se crean así: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Voice \with { \consists "Pitch_squash_engraver" -} { - e8 e g a a16( bes) a8 g +} \relative { + e''8 e g a a16( bes) a8 g \improvisationOn e8 ~ - e2 ~ e8 f4 f8 ~ - f2 + 2 ~ 8 f4 f8 ~ + 2 \improvisationOff a16( bes) a8 g e } diff --git a/Documentation/es/notation/repeats.itely b/Documentation/es/notation/repeats.itely index 8bddbed0ab..f2f8e2b49f 100644 --- a/Documentation/es/notation/repeats.itely +++ b/Documentation/es/notation/repeats.itely @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 873151f815f8b8e27eb5231c74e28392561e4668 + Translation of GIT committish: c4a960d0461ee5ecd87cd46692ec11682b8969b0 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.21" @node Repeticiones @section Repeticiones @@ -21,23 +21,24 @@ siguientes tipos de repetición: @table @code @item volta (primera y segunda vez) -La repetición de la música no se imprime de forma desarrollada, sino -que se indica encerrándola entre barras de repetición. Si el salto de -la repetición se encuentra al comienzo de una pieza, la barra de -repetición sólo se imprime al final del fragmento. Se imprimen una -serie de finales alternativos (volte) de izquierda a derecha indicados -mediante corchetes. Ésta es la notación estándar para las -repeticiones con finales alternativos. +La repetición de la música no se imprime de forma desarrollada, +sino que se indica encerrándola entre barras de repetición. Si el +salto de la repetición se encuentra al comienzo de una pieza, la +barra de repetición sólo se imprime al final del fragmento. Se +imprimen una serie de finales alternativos (volte) de izquierda a +derecha indicados mediante corchetes. Ésta es la notación +estándar para las repeticiones con finales alternativos. @item unfold (desplegada) -Las música repetida se escribe y se interpreta completamente tantas -veces como especifique el valor @code{@var{número_de_repeticiones}}. Es útil -cuando se está escribiendo música repetitiva. +Las música repetida se escribe y se interpreta completamente +tantas veces como especifique el valor +@code{@var{número_de_repeticiones}}. Es útil cuando se está +escribiendo música repetitiva. @item percent (porcentaje) -Hacer repeticiones de compases o parte de ellos. Tienen un aspecto -semejante a un signo de porcentaje. Las repeticiones de porcentaje se -deben declarar dentro de un contexto @code{Voice}. +Hacer repeticiones de compases o parte de ellos. Tienen un +aspecto semejante a un signo de porcentaje. Las repeticiones de +porcentaje se deben declarar dentro de un contexto @code{Voice}. @item tremolo (trémolo) Hacer barras de trémolo. @@ -54,11 +55,12 @@ Hacer barras de trémolo. @subsection Repeticiones largas @translationof Long repeats -Esta sección trata sobre la forma de introducir repeticiones largas, -normalmente de varios compases. Las repeticiones adoptan dos formas: -repeticiones encerradas entre signos de repetición, o repeticiones -explícitas, que se usan para escribir música repetitiva. También se -pueden controlar manualmente los signos de repetición. +Esta sección trata sobre la forma de introducir repeticiones +largas, normalmente de varios compases. Las repeticiones adoptan +dos formas: repeticiones encerradas entre signos de repetición, o +repeticiones explícitas, que se usan para escribir música +repetitiva. También se pueden controlar manualmente los signos de +repetición. @menu * Repeticiones normales:: @@ -94,16 +96,30 @@ donde @code{@var{expresión_musical}} es una expresión musical. Una repetición simple sin finales alternativos: -@lilypond[verbatim,quote,relative=2] -\repeat volta 2 { c4 d e f } -c2 d -\repeat volta 2 { d4 e f g } +@lilypond[verbatim,quote] +\relative { + \repeat volta 2 { c''4 d e f } + c2 d + \repeat volta 2 { d4 e f g } +} +@end lilypond + +De forma predeterminada no se imprimen las dobles barras de +apertura de repetición en el primer compás completo. Sin embargo +es posible imprimirlas usando @code{\bar ".|:"} antes de la +primera nota. + +@lilypond[verbatim,fragment,quote] +\relative { + \repeat volta 2 { \bar ".|:" c''4 d e f } + c2 d + \repeat volta 2 { d4 e f g } +} @end lilypond -Los filanes alternativos (casillas de primera y segunda vez) -se pueden generar utilizando @code{\alternative}. Cada -grupo de alternativas debe, a su vez, estar encerrado -entre llaves curvas. +Los finales alternativos (casillas de primera y segunda vez) se +pueden generar utilizando @code{\alternative}. Cada grupo de +alternativas debe, a su vez, estar encerrado entre llaves curvas. @example \repeat volta @var{número_de_repeticiones} @var{expresión_musical} @@ -115,140 +131,102 @@ entre llaves curvas. @noindent donde @code{@var{expresión_musical}} es una expresión musical. -Si existen más repeticiones que finales alternativos, -se asigna el primer final alternativo -a las repeticiones más antiguas. +Si existen más repeticiones que finales alternativos, se asigna el +primer final alternativo a las repeticiones más antiguas. Repetición única con primera y segunda vez: -@lilypond[verbatim,quote,relative=2] -\repeat volta 2 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 2 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + } + c1 } -c1 @end lilypond Varias repeticiones con primera y segunda vez: -@lilypond[verbatim,quote,relative=2] -\repeat volta 4 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 4 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + } + c1 } -c1 @end lilypond Más de una repetición con más de un final alternativo: -@lilypond[verbatim,quote,relative=2] -\repeat volta 3 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } - { a2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 3 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + { a2 g | } + } + c1 } -c1 @end lilypond -@warning{Si hay dos o más alternativas, no debe aparecer -nada entre la llave de cierre de una y la de apertura de la otra -dentro de un bloque @code{@bs{}alternative}, pues en caso -contrario no obtendremos el número de finales esperado.} +@warning{Si hay dos o más alternativas, no debe aparecer nada +entre la llave de cierre de una y la de apertura de la otra dentro +de un bloque @code{@bs{}alternative}, pues en caso contrario no +obtendremos el número de finales esperado.} @warning{Si incluimos @code{@bs{}relative} dentro de un -@code{@bs{}repeat} sin instanciar el contexto -@code{Voice} explícitamente, -aparecerán pentagramas adicionales no deseados. +@code{@bs{}repeat} sin instanciar el contexto @code{Voice} +explícitamente, aparecerán pentagramas adicionales no deseados. Véase @rprogram{Aparece un pentagrama de más}.} @cindex repetición con anacrusa @cindex anacrusa en repeticiones @funindex \partial +@cindex comprobación de compás con repeticiones +@cindex repetición con comprobaciones de compás -Si una repetición comienza en medio de un compás y no tiene finales -alternativos (primera y segunda vez), normalmente el final de la -repetición también caerá en el medio de un compás, de forma que el -comienzo y el final formen un compás completo. En tales casos, los -signos de repetición no son verdaderas líneas divisorias. No utilice -instrucciones @code{\partial} o comprobaciones de compás en los -lugares en que se imprimen estos símbolos de repetición: +Si una repetición sin casillas de primera y segunda vez comienza +en medio de un compás, normalmente termina en el lugar +correspondiente en mitad de otro compás posterior (de tal forma +que los dos suman un compás completo). En este caso, los símbolos +de repetición no son @q{verdaderas} líneas divisorias, por lo que +no deben escribirse en este sitio comprobaciones de compás ni +instrucciones @code{\partial}: @lilypond[verbatim,quote,relative=1] -% no \partial here -c4 e g % no bar check here -% no \partial here +c'4 e g \repeat volta 4 { e4 | c2 e | - % no \partial here - g4 g g % no bar check here + g4 g g } -% no \partial here -g4 | -a2 a | -g1 | + g4 | + a2 a | + g1 | @end lilypond -De forma similar, si una repetición compienza con el compás de -anacrusa inicial de una partitura y no tiene finales alternativos, se -dan las mismas condiciones que en el ejemplo anterior, excepto que en -este caso se necesita la instrucción @code{\partial} al principio de -la partitura: +Si una repetición que no tiene casillas de primera y segunda vez +comienza con un compás parcial, entonces se aplica el mismo +principio, excepto que se requiere una instrucción @code{\partial} +al comienzo del compás: @lilypond[verbatim,quote,relative=1] -\partial 4 % required +\partial 4 \repeat volta 4 { - e4 | + e'4 | c2 e | - % no \partial here - g4 g g % no bar check here -} -% no \partial here -g4 | -a2 a | -g1 | -@end lilypond - -Cuando se añaden primera y segunda vez a una repetición que comienza -con un compás incompleto, se hace necesario establecer la propiedad de -contexto @code{Timing.measureLength} manualmente, en los siguiente -lugares específicos: - -@itemize -@item -en el comienzo de los complases incompletos del bloque -@code{\alternative}, que normalmente se producen al final de cada -final alternativo, excepto (en la mayoría de los casos) el último de -ellos. - -@item -en el comienzo de cada uno de los finales alternativos, excepto el -primero. -@end itemize - -@lilypond[verbatim,quote,relative=1] -\partial 4 -\repeat volta 2 { e4 | c2 e | } -\alternative { - { - f2 d | - \set Timing.measureLength = #(ly:make-moment 3/4) - g4 g g % optional bar check is allowed here - } - { - \set Timing.measureLength = #(ly:make-moment 4/4) - a2 a | - } + g4 g g } -g1 | + g4 | + a2 a | + g1 | @end lilypond -La propiedad @code{measureLength} se describe en @ref{Gestión del -tiempo}. - @cindex repeticiones, con ligaduras @cindex primera y segunda vez, con ligaduras @cindex ligaduras, en repeticiones @@ -257,12 +235,14 @@ tiempo}. Se pueden añadir ligaduras de unión al segundo final: -@lilypond[verbatim,quote,relative=2] -c1 -\repeat volta 2 { c4 d e f~ } -\alternative { - { f2 d } - { f2\repeatTie f, } +@lilypond[verbatim,quote] +\relative { + c''1 + \repeat volta 2 { c4 d e f~ } + \alternative { + { f2 d } + { f2\repeatTie f, } + } } @end lilypond @@ -280,48 +260,56 @@ indicación @qq{D.S.} correspondiente se debe añadir manualmente. Salida de una repetición: -@lilypond[verbatim,quote,relative=1] -e1 -\inStaffSegno -f2 g a b -c1_"D.S." \bar "|." +@lilypond[verbatim,quote] +\relative { + e'1 + \inStaffSegno + f2 g a b + c1_"D.S." \bar "|." +} @end lilypond Al comienzo de una repetición: -@lilypond[verbatim,quote,relative=1] -e1 -\repeat volta 2 { - \inStaffSegno % start repeat - f2 g a b +@lilypond[verbatim,quote] +\relative { + e'1 + \repeat volta 2 { + \inStaffSegno % start repeat + f2 g a b + } + c1_"D.S." \bar "|." } -c1_"D.S." \bar "|." @end lilypond Al final de una repetición: -@lilypond[verbatim,quote,relative=1] -e1 -\repeat volta 2 { +@lilypond[verbatim,quote] +\relative { + e'1 + \repeat volta 2 { + f2 g a b + \inStaffSegno % end repeat + } f2 g a b - \inStaffSegno % end repeat + c1_"D.S." \bar "|." } -f2 g a b -c1_"D.S." \bar "|." @end lilypond Entre dos repeticiones: -@lilypond[verbatim,quote,relative=1] -e1 -\repeat volta 2 { - f2 g a b -} -\inStaffSegno % double repeat -\repeat volta 2 { - f2 g a b +@lilypond[verbatim,quote] +\relative { + e'1 + \repeat volta 2 { + f2 g a b + } + \inStaffSegno % double repeat + \repeat volta 2 { + f2 g a b + } + c1_"D.S." \bar "|." } -c1_"D.S." \bar "|." @end lilypond Se pueden obtener símbolos de línea divisoria alternativos @@ -333,17 +321,19 @@ deben seleccionarse a partir de los tipos predefinidos o de tipos definidos anteriormente con la instrucción @code{\defineBarLine} (véase @ref{Barras de compás}). -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] \defineBarLine ":|.S[" #'(":|." "S[" "") \defineBarLine "]" #'("]" "" "") -e1 -\repeat volta 2 { - f2 g a b - \once \set Score.endRepeatSegnoType = ":|.S[" - \inStaffSegno +\relative { + e'1 + \repeat volta 2 { + f2 g a b + \once \set Score.endRepeatSegnoType = ":|.S[" + \inStaffSegno + } + f2 g \bar "]" a b + c1_"D.S." \bar "|." } -f2 g \bar "]" a b -c1_"D.S." \bar "|." @end lilypond @snippets @@ -373,6 +363,9 @@ Referencia de la notación: @ref{Modificación de ligaduras de unión y de expresión}, @ref{Gestión del tiempo}. +Archivos instalados: +@file{ly/engraver-init.ly}. + Fragmentos de código: @rlsr{Repeats}. @@ -423,10 +416,10 @@ en una nota de adorno oculta. Para ver un ejemplo, consulte epígrafe Fragmentos de código seleccionados, en @ref{Glissando}. Si una repetición que comienza con un compás incompleto tiene un -bloque @code{\alternative} que contiene modificaciones a la propiedad -@code{measureLength}, la utilización de @code{\unfoldRepeats} dará -lugar a líneas divisorias erróneamente colocadas y advertencias de -comprobación de compás. +bloque @code{\alternative} que contiene modificaciones a la +propiedad @code{measureLength}, la utilización de +@code{\unfoldRepeats} dará lugar a líneas divisorias erróneamente +colocadas y advertencias de comprobación de compás. Una repetición anidada como @@ -461,26 +454,29 @@ situaciones. @funindex repeatCommands @funindex start-repeat -@warning{Estos métodos sólo se utilizan para realizar construcciones -de repetición poco usuales, y pueden tener un comportamiento distinto -al esperado. En casi todas las situaciones, se deben crear las -repeticiones utilizando la instrucción estándar @code{@bs{}repeat} o -imprimiendo las barras de compás correspondientes. Para ver más -información, consulte @ref{Barras de compás}.} +@warning{Estos métodos sólo se utilizan para realizar +construcciones de repetición poco usuales, y pueden tener un +comportamiento distinto al esperado. En casi todas las +situaciones, se deben crear las repeticiones utilizando la +instrucción estándar @code{@bs{}repeat} o imprimiendo las barras +de compás correspondientes. Para ver más información, consulte +@ref{Barras de compás}.} Se puede usar la propiedad @code{repeatCommands} para controlar la -disposición de las repeticiones. Su valor es una lista de Scheme de -instrucciones de repetición. +disposición de las repeticiones. Su valor es una lista de Scheme +de instrucciones de repetición. @table @code @item start-repeat Imprimir una barra de compás @code{.|:} -@lilypond[verbatim,quote,relative=2] -c1 -\set Score.repeatCommands = #'(start-repeat) -d4 e f g -c1 +@lilypond[verbatim,quote] +\relative { + c''1 + \set Score.repeatCommands = #'(start-repeat) + d4 e f g + c1 +} @end lilypond En la práctica habitual del grabado no se imprimen signos de @@ -489,24 +485,28 @@ repetición al principio de la pieza. @item @code{end-repeat} Imprimir una barra de compás @code{:|.} -@lilypond[verbatim,quote,relative=2] -c1 -d4 e f g -\set Score.repeatCommands = #'(end-repeat) -c1 +@lilypond[verbatim,quote] +\relative { + c''1 + d4 e f g + \set Score.repeatCommands = #'(end-repeat) + c1 +} @end lilypond @item (volta @var{number}) @dots{} (volta #f) -Crear una nueva casilla de repetición con el número que se especifica. -El corchete de vez se debe terminar de forma explícita, pues en caso -contrario no se imprime. +Crear una nueva casilla de repetición con el número que se +especifica. El corchete de vez se debe terminar de forma +explícita, pues en caso contrario no se imprime. -@lilypond[verbatim,quote,relative=2] -f4 g a b -\set Score.repeatCommands = #'((volta "2")) -g4 a g a -\set Score.repeatCommands = #'((volta #f)) -c1 +@lilypond[verbatim,quote] +\relative { + f''4 g a b + \set Score.repeatCommands = #'((volta "2")) + g4 a g a + \set Score.repeatCommands = #'((volta #f)) + c1 +} @end lilypond @end table @@ -514,29 +514,31 @@ c1 Se pueden producir varias instrucciones de repetición en el mismo punto: -@lilypond[verbatim,quote,relative=2] -f4 g a b -\set Score.repeatCommands = #'((volta "2, 5") end-repeat) -g4 a g a -c1 -\set Score.repeatCommands = #'((volta #f) (volta "95") end-repeat) -b1 -\set Score.repeatCommands = #'((volta #f)) +@lilypond[verbatim,quote] +\relative { + f''4 g a b + \set Score.repeatCommands = #'((volta "2, 5") end-repeat) + g4 a g a + c1 + \set Score.repeatCommands = #'((volta #f) (volta "95") end-repeat) + b1 + \set Score.repeatCommands = #'((volta #f)) +} @end lilypond @cindex corchete de casilla de repetición con texto @cindex texto en casilla de repetición -Se puede incluir texto dentro de la casilla de primera y segunda vez. -El texto puede ser un número o números, o un elemento de marcado, -véase @ref{Formatear el texto}. La forma más fácil de usar texto de -marcado es definir el marcado previamente, y luego incluirlo dentro de -una lista de Scheme. +Se puede incluir texto dentro de la casilla de primera y segunda +vez. El texto puede ser un número o números, o un elemento de +marcado, véase @ref{Formatear el texto}. La forma más fácil de +usar texto de marcado es definir el marcado previamente, y luego +incluirlo dentro de una lista de Scheme. @lilypond[verbatim,quote] voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } -\relative c'' { - c1 +\relative { + c''1 \set Score.repeatCommands = #(list(list 'volta voltaAdLib) 'start-repeat) c4 b d e @@ -547,11 +549,6 @@ voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } @end lilypond -@snippets - -@lilypondfile[verbatim,quote,texidoc,doctitle] -{printing-a-repeat-sign-at-the-beginning-of-a-piece.ly} - @seealso Referencia de la notación: @ref{Barras de compás}, @@ -582,9 +579,9 @@ Referencia de funcionamiento interno: @cindex alternativos, finales, en repeticiones explícitas @funindex unfold -Mediante la utilización de la instrucción @code{unfold} se pueden usar -las repeticiones para simplificar la escritura desplegada de música -repetitiva. La sintaxis es: +Mediante la utilización de la instrucción @code{unfold} se pueden +usar las repeticiones para simplificar la escritura desplegada de +música repetitiva. La sintaxis es: @example \repeat unfold @var{número_de_repeticiones} @var{expresión_musical} @@ -595,14 +592,17 @@ donde @code{@var{expresión_musical}} es una expresión musical y @code{@var{número_de_repeticiones}} es el número de veces que @code{@var{expresión_musical}} se repite. -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -c1 +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + c1 +} @end lilypond En ciertos casos, especialmente dentro de un contexto -@code{\relative}, la función @code{\repeat unfold} no es exactamente -igual que escribir la expresión musical varias veces. P. ej.: +@code{\relative}, la función @code{\repeat unfold} no es +exactamente igual que escribir la expresión musical varias +veces. P. ej.: @example \repeat unfold 2 @{ a'4 b c @} @@ -616,61 +616,68 @@ a'4 b c | a'4 b c Se pueden hacer repeticiones desplegadas con finales alternativos. -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + } + c1 } -c1 @end lilypond Si hay más repeticiones que finales alternativos, el primer final -alternativo se aplica las veces necesarias hasta que -las alternativas restantes completan el número total -de repeticiones. - -@lilypond[verbatim,quote,relative=2] -\repeat unfold 4 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } - { e2 d } - } -c1 -@end lilypond - -Si existen más finales alternativos que repeticiones, -se aplican solo los primeros finales alternativos. -Las alternativas restantes se ignoran y no se imprimen. - -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } - { e2 d } +alternativo se aplica las veces necesarias hasta que las +alternativas restantes completan el número total de repeticiones. + +@lilypond[verbatim,quote] +\relative { + \repeat unfold 4 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + { e2 d } + } + c1 } -c1 @end lilypond -Es posible también anidar varias funciones -@code{unfold} (con finales alternativos o sin ellos). +Si existen más finales alternativos que repeticiones, se aplican +solo los primeros finales alternativos. Las alternativas +restantes se ignoran y no se imprimen. -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { - \repeat unfold 2 { c4 d e f } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } \alternative { { c2 g' } { c,2 b } + { e2 d } + } + c1 +} +@end lilypond + +Es posible también anidar varias funciones @code{unfold} (con +finales alternativos o sin ellos). + +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + } } + c1 } -c1 @end lilypond -Las construcciones de acorde se pueden repetir mediante el -símbolo de repetición de acordes @code{q}. -Véase @ref{Repetición de acordes}. +Las construcciones de acorde se pueden repetir mediante el símbolo +de repetición de acordes @code{q}. Véase @ref{Repetición de +acordes}. @warning{Si pone @code{@bs{}relative} dentro de un bloque @code{@bs{}repeat} sin instanciar explícitamente el contexto @@ -695,11 +702,9 @@ Referencia de funcionamiento interno: @translationof Short repeats Esta sección trata de cómo introducir repeticiones cortas. Las -repeticiones cortas pueden adoptar dos formas: -barras inclinadas o signos de porcentaje -si estamos representando repeticiones de una -sola nota, un compás o dos compases, -y trémolos en caso contrario. +repeticiones cortas pueden adoptar dos formas: barras inclinadas o +signos de porcentaje si estamos representando repeticiones de una +sola nota, un compás o dos compases, y trémolos en caso contrario. @menu * Repeticiones de compás o parte de ellos:: @@ -718,8 +723,8 @@ y trémolos en caso contrario. @funindex \repeat percent @funindex percent -Los patrones cortos que se repiten se imprimen una sola vez, -y el patrón repetido se sustituye por un símbolo especial. +Los patrones cortos que se repiten se imprimen una sola vez, y el +patrón repetido se sustituye por un símbolo especial. La sintaxis es: @@ -730,38 +735,46 @@ La sintaxis es: @noindent donde @code{@var{expresión_musical}} es una expresión musical. -Los patrones más cortos que un compás se sustituyen por -barras inclinadas. +Los patrones más cortos que un compás se sustituyen por barras +inclinadas. -@lilypond[verbatim,quote,relative=2] -\repeat percent 4 { c128 d e f } -\repeat percent 4 { c64 d e f } -\repeat percent 5 { c32 d e f } -\repeat percent 4 { c16 d e f } -\repeat percent 4 { c8 d } -\repeat percent 4 { c4 } -\repeat percent 2 { c2 } +@lilypond[verbatim,quote] +\relative c'' { + \repeat percent 4 { c128 d e f } + \repeat percent 4 { c64 d e f } + \repeat percent 5 { c32 d e f } + \repeat percent 4 { c16 d e f } + \repeat percent 4 { c8 d } + \repeat percent 4 { c4 } + \repeat percent 2 { c2 } +} @end lilypond -Los patrones de repetición de uno o dos compases se sustituyen -por signos parecidos al símbolo de porcentaje. +Los patrones de repetición de uno o dos compases se sustituyen por +signos parecidos al símbolo de porcentaje. -@lilypond[verbatim,quote,relative=2] -\repeat percent 2 { c4 d e f } -\repeat percent 2 { c2 d } -\repeat percent 2 { c1 } +@lilypond[verbatim,quote] +\relative c'' { + \repeat percent 2 { c4 d e f } + \repeat percent 2 { c2 d } + \repeat percent 2 { c1 } +} @end lilypond -@lilypond[verbatim,quote,relative=2] -\repeat percent 3 { c4 d e f | c2 g' } +@lilypond[verbatim,quote] +\relative { + \repeat percent 3 { c''4 d e f | c2 g' } +} @end lilypond Los patrones más cortos que un compás pero que contienen duraciones mezcladas utilizan un símbolo de porcentaje doble. -@lilypond[verbatim,quote,relative=2] -\repeat percent 4 { c8. 16 } -\repeat percent 2 { \tuplet 3/2 { r8 c d } e4 } +@lilypond[verbatim,quote] +\relative { + \repeat percent 4 { c''8. 16 } + \repeat percent 2 { \tuplet 3/2 { r8 c d } e4 } +} @end lilypond @snippets @@ -797,6 +810,28 @@ Referencia de funcionamiento interno: @rinternals{Double_percent_repeat_engraver}, @rinternals{Slash_repeat_engraver}. +@knownissues +Las repeticiones de porcentaje no contienen nada más aparte del +propio signo de porcentaje; especialmente, los cambios de +indicación de compás no se repiten. + +@lilypond[quote,verbatim,relative=2] +\repeat percent 3 { \time 5/4 c2. 2 \time 4/4 2 2 } +@end lilypond + +@noindent +Cualquier cambio de compás o instrucción @code{\partial} se tiene +que producir en pasajes paralelos @emph{fuera} de la repetición de +porcentaje, p. ej. en una pista especial para la gestión del +compás. + +@lilypond[quote,verbatim,relative=2] +<< + \repeat percent 3 { c2. 2 2 2 } + \repeat unfold 3 { \time 5/4 s4*5 \time 4/4 s1 } +>> +@end lilypond + @node Repeticiones de trémolo @unnumberedsubsubsec Repeticiones de trémolo @@ -808,57 +843,60 @@ Referencia de funcionamiento interno: @funindex \repeat tremolo @funindex tremolo -Los trémolos pueden adoptar dos formas: alternancia entre dos acordes -o dos notas, y repetición rápida de una sola nota o acorde. Los -trémolos que consisten en una alternancia se indican por medio de la -adición de barras entre las notas o acordes que se alternan, mientras -que los trémolos que consisten en la repetición rápida de una sola -nota se indican mediante la adición de barras cruzadas a una nota -única. +Los trémolos pueden adoptar dos formas: alternancia entre dos +acordes o dos notas, y repetición rápida de una sola nota o +acorde. Los trémolos que consisten en una alternancia se indican +por medio de la adición de barras entre las notas o acordes que se +alternan, mientras que los trémolos que consisten en la repetición +rápida de una sola nota se indican mediante la adición de barras +cruzadas a una nota única. -Para colocar marcas de trémolo entre las notas, use @code{\repeat} con -el estilo @code{tremolo} (trémolo): +Para colocar marcas de trémolo entre las notas, use @code{\repeat} +con el estilo @code{tremolo} (trémolo): -@lilypond[quote,verbatim,relative=2] -\repeat tremolo 8 { c16 d } -\repeat tremolo 6 { c16 d } -\repeat tremolo 2 { c16 d } +@lilypond[quote,verbatim] +\relative c'' { + \repeat tremolo 8 { c16 d } + \repeat tremolo 6 { c16 d } + \repeat tremolo 2 { c16 d } +} @end lilypond La sintaxis de @code{\repeat tremolo} espera que se escriban exactamente dos notas dentro de las llaves, y el número de -repeticiones debe corresponderse con un valor que se pueda expresar -con figuras normales o con puntillo. Así, @code{\repeat tremolo 7} es -válido y produce una nota con doble puntillo, pero +repeticiones debe corresponderse con un valor que se pueda +expresar con figuras normales o con puntillo. Así, @code{\repeat +tremolo 7} es válido y produce una nota con doble puntillo, pero @code{\repeat tremolo 9} no es válido. -La duración del trémolo es igual a la duración de la expresión entre -llaves, multiplicada por el número de repeticiones: @code{\repeat -tremolo 8 @{ c16 d16 @}} da como resultado un trémolo de redonda, -escrito como dos redondas unidas por barras de trémolo. +La duración del trémolo es igual a la duración de la expresión +entre llaves, multiplicada por el número de repeticiones: +@code{\repeat tremolo 8 @{ c16 d16 @}} da como resultado un +trémolo de redonda, escrito como dos redondas unidas por barras de +trémolo. -Existen dos maneras de colocar marcas de trémolo sobre una única nota. -Incluso aquí se puede utilizar la sintaxis @code{\repeat tremolo}, en -cuyo caso la nota no debe ir encerrada entre llaves: +Existen dos maneras de colocar marcas de trémolo sobre una única +nota. Incluso aquí se puede utilizar la sintaxis @code{\repeat +tremolo}, en cuyo caso la nota no debe ir encerrada entre llaves: @lilypond[quote,verbatim,ragged-right] \repeat tremolo 4 c'16 @end lilypond @cindex trémolo, indicaciones de -@funindex tremoloFlags @funindex : -El mismo resultado se puede obtener escribiendo -@code{:@var{N}} después de la nota, donde @code{@var{N}} indica la -duración de la subdivisión (debe ser 8 como mínimo). Si @code{@var{N}} -es 8, se añade una barra de corchea a la plica de la nota. -Si @code{@var{N}} se omite, se utiliza el último valor (almacenado en -@code{tremoloFlags}): +El mismo resultado se puede obtener escribiendo @code{:@var{N}} +después de la nota, donde @code{@var{N}} indica la duración de la +subdivisión (debe ser 8 como mínimo). Si @code{@var{N}} es 8, se +añade una barra de corchea a la plica de la nota. Si +@code{@var{N}} se omite, se utiliza el último valor: -@lilypond[quote,verbatim,relative=2] -c2:8 c:32 -c: c: +@lilypond[quote,verbatim] +\relative { + c''2:8 c:32 + c: c: +} @end lilypond @snippets diff --git a/Documentation/es/notation/rhythms.itely b/Documentation/es/notation/rhythms.itely index 9b1454e584..0851e27f25 100644 --- a/Documentation/es/notation/rhythms.itely +++ b/Documentation/es/notation/rhythms.itely @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 873151f815f8b8e27eb5231c74e28392561e4668 + Translation of GIT committish: 3ecc98aa5db8a47adcf9defc4ec9fc018c5cc47d When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.40" @node Duraciones @section Duraciones @@ -15,8 +15,8 @@ @lilypondfile[quote]{rhythms-headword.ly} -Esta sección trata de los ritmos, los silencios, las duraciones, las -barras y los compases. +Esta sección trata de los ritmos, los silencios, las duraciones, +las barras y los compases. @menu * Escritura de las duraciones (valores rítmicos):: @@ -49,27 +49,26 @@ barras y los compases. @cindex notas, longitud de @funindex \longa -@funindex longa @funindex \breve -@funindex breve @funindex \maxima -@funindex maxima - -Las duraciones se designan mediante números y puntos. Las duraciones -se introducen como sus valores recíprocos respecto de la redonda. Por -ejemplo, una negra se escribe usando un @code{4} (puesto que es 1/4 de -redonda), mientras que una blanca se escribe con un @code{2} (por ser -1/2 de redonda). Para notas mayores de la redonda se deben usar las -instrucciones @code{\longa} (que es una breve doble) y -@code{\breve}. Se pueden especificar duraciones tan cortas como la -garrapatea (con el número 128). Son posibles valores más cortos, pero -sólo como notas unidas por una barra. + +Las duraciones se designan mediante números y puntos. Las +duraciones se introducen como sus valores recíprocos respecto de +la redonda. Por ejemplo, una negra se escribe usando un @code{4} +(puesto que es 1/4 de redonda), mientras que una blanca se escribe +con un @code{2} (por ser 1/2 de redonda). Para notas mayores de +la redonda se deben usar las instrucciones @code{\longa} (que es +una breve doble) y @code{\breve}. Se pueden especificar duraciones +tan cortas como la garrapatea (con el número 128). Son posibles +valores más cortos, pero sólo como notas unidas por una barra. @c Two 64th notes are needed to obtain beams -@lilypond[quote,verbatim,relative=2] -\time 8/1 -c\longa c\breve c1 c2 -c4 c8 c16 c32 c64 c128 c128 +@lilypond[quote,verbatim] +\relative { + \time 8/1 + c''\longa c\breve c1 c2 + c4 c8 c16 c32 c64 c128 c128 +} @end lilypond Aquí se pueden ver las mismas duraciones con el barrado automático @@ -77,28 +76,41 @@ desactivado. @c not strictly "writing rhythms"; more of a "displaying" thing, @c but it's ok here. -gp -@lilypond[quote,verbatim,relative=2] -\time 8/1 -\autoBeamOff -c\longa c\breve c1 c2 -c4 c8 c16 c32 c64 c128 c128 +@lilypond[quote,verbatim] +\relative { + \time 8/1 + \autoBeamOff + c''\longa c\breve c1 c2 + c4 c8 c16 c32 c64 c128 c128 +} @end lilypond Se puede escribir una nota con la duración de una cuádruple breve -mediante @code{\maxima}, pero esto está contemplado solamente dentro -de la notación musical antigua. Para ver más detalles, consulte -@ref{Notación antigua}. +mediante @code{\maxima}, pero esto está contemplado solamente +dentro de la notación musical antigua. Para ver más detalles, +consulte @ref{Notación antigua}. @cindex duración predeterminada @cindex predeterminada, duración de la nota @cindex nota, duración predeterminada -Si la duración se omite, su valor será el de la duración de la nota -anterior. Por omisión, el valor de la primera nota es el de una -negra. +Si la duración se omite, su valor será el de la duración de la +nota anterior. Por omisión, el valor de la primera nota es el de +una negra. -@lilypond[quote,verbatim,relative=2] -a a a2 a a4 a a1 a +@lilypond[quote,verbatim] +\relative { a' a a2 a a4 a a1 a } +@end lilypond + +Las duraciones aisladas en una secuencia musical toman la altura +de la nota o acorde anterior. + +@lilypond[quote,verbatim] +\relative { + \time 8/1 + c'' \longa \breve 1 2 + 4 8 16 32 64 128 128 +} @end lilypond @cindex notas, con puntillo @@ -112,13 +124,14 @@ Para obtener duraciones de notas con puntillo, escriba un punto (@code{.}) después del número. Las notas con doble puntillo se especifican escribiendo dos puntos, y así sucesivamente. -@lilypond[quote,verbatim,relative=2] -a4 b c4. b8 a4. b4.. c8. +@lilypond[quote,verbatim] +\relative { a'4 b c4. b8 a4. b4.. c8. } @end lilypond Ciertas duraciones no se pueden representar sólo con duraciones -binarias y puntillos; la única forma de representarlas es ligando dos -o más notas. Para ver más detalles, consulte @ref{Ligaduras de unión}. +binarias y puntillos; la única forma de representarlas es ligando +dos o más notas. Para ver más detalles, consulte @ref{Ligaduras +de unión}. Para ver de qué manera se pueden especificar las duraciones de las sílabas de la letra y cómo alinear la letra a las notas, consulte @@ -130,16 +143,13 @@ otros ajustes que controlan la notación proporcional, consulte @ref{Notación proporcional}. @funindex \dotsUp -@funindex dotsUp @funindex \dotsDown -@funindex dotsDown @funindex \dotsNeutral -@funindex dotsNeutral -Normalmente los puntillos se desplazan hacia arriba para evitar las -líneas del pentagrama, excepto en situaciones de polifonía. Se pueden -situar los puntillos manualmente encima o debajo de las líneas de la -pauta; véase @ref{Dirección y posición}. +Normalmente los puntillos se desplazan hacia arriba para evitar +las líneas del pentagrama, excepto en situaciones de polifonía. Se +pueden situar los puntillos manualmente encima o debajo de las +líneas de la pauta; véase @ref{Dirección y posición}. @predefined @code{\autoBeamOn}, @@ -185,10 +195,10 @@ Referencia de funcionamiento interno: @knownissues @c Deliberately duplicated in Durations and Rests. -gp -No existe un límite fundamental para las duraciones de los silencios -(tanto para el más largo como para el más corto), pero el numero de -glifos es limitado: sólo se pueden imprimir desde el silencio de -garrapatea (128) hasta el de máxima (8 redondas). +No existe un límite fundamental para las duraciones de los +silencios (tanto para el más largo como para el más corto), pero +el numero de glifos es limitado: sólo se pueden imprimir desde el +silencio de garrapatea (128) hasta el de máxima (8 redondas). @node Grupos especiales @@ -199,7 +209,6 @@ garrapatea (128) hasta el de máxima (8 redondas). @cindex tresillos @funindex \tuplet -@funindex tuplet Los grupos especiales se obtienen a partir de una expresión musical con la instrucción @code{\tuplet}, multiplicando la @@ -210,14 +219,16 @@ rapidez de la expresión musical por una fracción: @end example @noindent -El nomerador de la fracción se imprime encima o debajo de las +El numerador de la fracción se imprime encima o debajo de las notas, opcionalmente con un corchete. El grupo especial más común es el tresillo, en el que 3@tie{}notas tienen el valor que normalmente tienen@tie{}2: -@lilypond[quote,verbatim,relative=2] -a2 \tuplet 3/2 { b4 b b } -c4 c \tuplet 3/2 { b4 a g } +@lilypond[quote,verbatim] +\relative { + a'2 \tuplet 3/2 { b4 4 4 } + c4 c \tuplet 3/2 { b4 a g } +} @end lilypond @cindex agrupación de grupes especiales @@ -228,34 +239,44 @@ especial, resulta fastidioso tener que escribir una instrucción la duración de un conjunto de grupos directamente antes de la música para que así se agrupen automáticamente: -@lilypond[quote,verbatim,relative=2] -g2 r8 \tuplet 3/2 8 { cis16 d e e f g g f e } +@lilypond[quote,verbatim] +\relative { + g'2 r8 \tuplet 3/2 8 { cis16 d e e f g g f e } +} @end lilypond @cindex grupos de valoración especial, colocación del corchete @funindex \tupletUp -@funindex tupletUp @funindex \tupletDown -@funindex tupletDown @funindex \tupletNeutral -@funindex tupletNeutral Se pueden colocar manualmente los corchetes de tresillo encima o -debajo de la pauta; véase @ref{Dirección y posición}. +debajo de la pauta: + +@lilypond[quote,verbatim] +\relative { + \tupletUp \tuplet 3/2 { c''8 d e } + \tupletNeutral \tuplet 3/2 { c8 d e } + \tupletDown \tuplet 3/2 { f,8 g a } + \tupletNeutral \tuplet 3/2 { f8 g a } +} +@end lilypond Los grupos pueden anidarse unos dentro de otros: -@lilypond[quote,verbatim,relative=2] -\autoBeamOff -c4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 +@lilypond[quote,verbatim] +\relative { + \autoBeamOff + c''4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 +} @end lilypond -La modificación de los grupos especiales anidados que comienzan en el -mismo instante musical se debe hacer con @code{\tweak}. +La modificación de los grupos especiales anidados que comienzan en +el mismo instante musical se debe hacer con @code{\tweak}. -Para modificar la duración de las notas sin imprimir un corchete de -grupo especial, véase @ref{Escalar las duraciones}. +Para modificar la duración de las notas sin imprimir un corchete +de grupo especial, véase @ref{Escalar las duraciones}. @predefined @code{\tupletUp}, @@ -271,7 +292,7 @@ grupo especial, véase @ref{Escalar las duraciones}. @funindex tupletSpannerDuration @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] -{entering-several-tuplets-using-only-one--times-command.ly} +{entering-several-tuplets-using-only-one--tuplet-command.ly} @cindex grupos de valoración especial, modificación del número @@ -299,6 +320,7 @@ Manual de aprendizaje: @rlearning{Métodos de trucaje}. Referencia de la notación: +@ref{Dirección y posición}, @ref{Gestión del tiempo}, @ref{Escalar las duraciones}, @ref{La instrucción tweak}, @@ -312,22 +334,6 @@ Referencia de funcionamiento interno: @rinternals{TupletNumber}, @rinternals{TimeScaledMusic}. -@cindex adorno, notas de, dentro de corchetes de grupo especial - -@knownissues -Las notas de adorno se pueden escribir dentro de los corchetes de -grupo especial, @emph{excepto} cuando un pentagrama comienza por una -nota de adorno seguida de un grupo de valoración especial. En este -caso concreto, se debe poner la nota de adorno antes de la instrucción -@code{\tuplet} para evitar errores. - -@cindex indicaciones de tempo dentro de corchetes de grupo especial - -Cuando se utiliza un grupo de valoración especial al comienzo de una -pieza con una indicación de @code{\tempo}, la música se debe escribir -explícitamente dentro de un bloque @code{\new Voice}, tal y como se -explica en @rlearning{Las voces contienen música}. - @node Escalar las duraciones @unnumberedsubsubsec Escalar las duraciones @@ -336,61 +342,65 @@ explica en @rlearning{Las voces contienen música}. @cindex escalar las duraciones @cindex duraciones, escalado de -La duración de las figuras, silencios o acordes se puede multiplicar -por un factor @code{N/M} añadiendo @code{*N/M} (o @code{*N} si @code{M} es -1) a la duración. Esto no afectará a la apariencia de las notas o -silencios que se producen, pero la duración alterada se usará para -calcular la posición dentro del compás y para establecer la duración -en la salida MIDI. Los factores de multiplicación se pueden combinar -en la forma @code{*L*M/N}. Los factores son parte de la duración: si -no especificamos una duración para las notas siguientes, la duración -por omisión que se toma de la nota anterior incluirá cualquier factor -de escala que se haya aplicado. - -En el siguiente ejemplo las tres primeras notas duran exactamente dos -partes, pero no se imprime ningún corchete de tresillo. - -@lilypond[quote,relative=2,verbatim] -\time 2/4 -% Alter durations to triplets -a4*2/3 gis a -% Normal durations -a4 a -% Double the duration of chord -4*2 -% Duration of quarter, appears like sixteenth -b16*4 c4 -@end lilypond - -La duración de los silencios espaciadores también se puede modificar -mediante un multiplicador. Esto es útil para saltar muchos compases, -como por ejemplo @code{s1*23}. +La duración de las figuras, silencios o acordes se puede +multiplicar por un factor @code{N/M} añadiendo @code{*N/M} (o +@code{*N} si @code{M} es 1) a la duración. Esto no afectará a la +apariencia de las notas o silencios que se producen, pero la +duración alterada se usará para calcular la posición dentro del +compás y para establecer la duración en la salida MIDI. Los +factores de multiplicación se pueden combinar en la forma +@code{*L*M/N}. Los factores son parte de la duración: si no +especificamos una duración para las notas siguientes, la duración +por omisión que se toma de la nota anterior incluirá cualquier +factor de escala que se haya aplicado. + +En el siguiente ejemplo las tres primeras notas duran exactamente +dos partes, pero no se imprime ningún corchete de tresillo. + +@lilypond[quote,verbatim] +\relative { + \time 2/4 + % Alter durations to triplets + a'4*2/3 gis a + % Normal durations + a4 a + % Double the duration of chord + 4*2 + % Duration of quarter, appears like sixteenth + b16*4 c4 +} +@end lilypond + +La duración de los silencios espaciadores también se puede +modificar mediante un multiplicador. Esto es útil para saltar +muchos compases, como por ejemplo @code{s1*23}. @cindex compresión de música @cindex expansión de música @funindex \scaleDurations -@funindex scaleDurations De la misma forma, se pueden comprimir por una fracción trozos de música más largos, como si cada nota, acorde o silencio tuviera la -fracción como multiplicador. Esto dejará intacta la apariencia de la -@emph{música}, pero la duración interna de las notas se multiplicará -por la fracción @emph{numerador}/@emph{denominador}. -He aquí un ejemplo que muestra cómo -se puede comprimir y expandir la música: +fracción como multiplicador. Esto dejará intacta la apariencia de +la @emph{música}, pero la duración interna de las notas se +multiplicará por la fracción @emph{numerador}/@emph{denominador}. +He aquí un ejemplo que muestra cómo se puede comprimir y expandir +la música: -@lilypond[quote,relative=2,verbatim] -\time 2/4 -% Normal durations -4 c8 a -% Scale music by *2/3 -\scaleDurations 2/3 { - 4. c8 a f -} -% Scale music by *2 -\scaleDurations 2/1 { - 4 c8 b +@lilypond[quote,verbatim] +\relative { + \time 2/4 + % Normal durations + 4 c8 a + % Scale music by *2/3 + \scaleDurations 2/3 { + 4. c8 a f + } + % Scale music by *2 + \scaleDurations 2/1 { + 4 c8 b + } } @end lilypond @@ -424,22 +434,29 @@ ningún error. @funindex ~ -Una ligadura de unión conecta dos notas adyacentes de la misma altura. La ligadura -en efecto extiende la longitud de una nota. +Una ligadura de unión conecta dos notas adyacentes de la misma +altura. La ligadura en efecto extiende la longitud de una nota. @warning{No deben confundirse las ligaduras de unión con las -@emph{ligaduras de expresión}, que indican articulación, ni con las -@emph{ligaduras de fraseo}, que indican el fraseo musical. Una -ligadura de unión es tan sólo una manera de extender la duración de -una nota, algo parecido a lo que hace el puntillo.} +@emph{ligaduras de expresión}, que indican articulación, ni con +las @emph{ligaduras de fraseo}, que indican el fraseo musical. +Una ligadura de unión es tan sólo una manera de extender la +duración de una nota, algo parecido a lo que hace el puntillo.} Se introduce una ligadura de unión escribiendo el símbolo de la tilde curva (@code{~}) después de la primera de cada pareja de notas que se quieren unir. Esto indica que la nota se une a la siguiente, que debe tener la misma altura. -@lilypond[quote,verbatim,relative=2] -a2~ a4~ a16 r r8 +@lilypond[quote,verbatim] +{ a'2~ 4~ 16 r r8 } +@end lilypond + +Las ligaduras de unión pueden hacer uso de la interpretación +@q{última altura explícita} para las duraciones aisladas: + +@lilypond[quote,verbatim] +{ a'2~ 4~ 16 r r8 } @end lilypond Se usan ligaduras de unión bien cuando la nota atraviesa la barra de @@ -449,29 +466,33 @@ subdivisiones del compás de mayor duración: @c KEEP LY @lilypond[verbatim,quote] -\relative c' { - r8^"sí" c~ c2 r4 | - r8^"no" c2~ c8 r4 +\relative { + r8^"sí" c'~ 2 r4 | + r8^"no" c2~ 8 r4 } @end lilypond -Si necesitamos ligar muchas notas a través de las líneas divisorias, -nos podría resultar más fácil utilizar la división automática de las -notas, véase @ref{División automática de las notas}. Este mecanismo divide -automáticamente las notas largas y las liga a través de las barras de -compás. +Si necesitamos ligar muchas notas a través de las líneas +divisorias, nos podría resultar más fácil utilizar la división +automática de las notas, véase @ref{División automática de las +notas}. Este mecanismo divide automáticamente las notas largas y +las liga a través de las barras de compás. @cindex ligaduras y acordes @cindex acordes y ligaduras -Cuando se aplica una ligadura de unión a un acorde, se conectan todas -las cabezas de las notas cuyas alturas coinciden. Si no coincide -ningún par de cabezas, no se crea ninguna ligadura. Los acordes se -pueden ligar parcialmente colocando las ligaduras dentro del acorde. +Cuando se aplica una ligadura de unión a un acorde, se conectan +todas las cabezas de las notas cuyas alturas coinciden. Si no +coincide ningún par de cabezas, no se crea ninguna ligadura. Los +acordes se pueden ligar parcialmente colocando las ligaduras +dentro del acorde. -@lilypond[quote,verbatim,relative=1] -~ - +@lilypond[quote,verbatim] +\relative c' { + 2~ 2 | + 4~ + | +} @end lilypond @cindex repetición, ligaduras de unión en @@ -480,43 +501,41 @@ pueden ligar parcialmente colocando las ligaduras dentro del acorde. @cindex ligaduras de unión y corchetes de primera y segunda vez @funindex \repeatTie -@funindex repeatTie Cuando la segunda vez de una repetición comienza con una nota ligada, es necesario especificar la ligadura repetida como sigue: -@lilypond[quote,relative=2,verbatim] -\repeat volta 2 { c g 2~ } -\alternative { - % First alternative: following note is tied normally - { 2. r4 } - % Second alternative: following note has a repeated tie - { 2\repeatTie d4 c } } +@lilypond[quote,verbatim] +\relative { + \repeat volta 2 { c'' g 2~ } + \alternative { + % First alternative: following note is tied normally + { 2. r4 } + % Second alternative: following note has a repeated tie + { 2\repeatTie d4 c } + } +} @end lilypond @cindex laissez vibrer @cindex ligaduras laissez vibrer @funindex \laissezVibrer -@funindex laissezVibrer Las ligaduras @notation{L.v.} (@notation{laissez vibrer}, dejar -vibrar) indican que las notas no se deben apagar al final. Se usan en -la notación para piano, arpa y otros instrumentos de cuerda y -percusión. Se pueden introducir de la siguiente manera: +vibrar) indican que las notas no se deben apagar al final. Se +usan en la notación para piano, arpa y otros instrumentos de +cuerda y percusión. Se pueden introducir de la siguiente manera: -@lilypond[quote,verbatim,relative=1] -1\laissezVibrer +@lilypond[quote,verbatim,fragment] +1\laissezVibrer @end lilypond @cindex ligaduras, colocación @funindex \tieUp -@funindex tieUp @funindex \tieDown -@funindex tieDown @funindex \tieNeutral -@funindex tieNeutral Es posible hacer manualmente que las ligaduras de unión se curven hacia arriba o hacia abajo; véase @ref{Dirección y posición}. @@ -528,59 +547,63 @@ hacia arriba o hacia abajo; véase @ref{Dirección y posición}. @cindex puntos, ligaduras de @funindex \tieDotted -@funindex tieDotted @funindex \tieDashed -@funindex tieDashed @funindex \tieSolid -@funindex tieSolid Se puede hacer que las ligaduras de expresión sean discontinuas, punteadas o una combinación de continuas y discontinuas. -@lilypond[quote, verbatim, relative=1] -\tieDotted -c2~ c -\tieDashed -c2~ c -\tieHalfDashed -c2~ c -\tieHalfSolid -c2~ c -\tieSolid -c2~ c +@lilypond[quote, verbatim] +\relative c' { + \tieDotted + c2~ 2 + \tieDashed + c2~ 2 + \tieHalfDashed + c2~ 2 + \tieHalfSolid + c2~ 2 + \tieSolid + c2~ 2 +} @end lilypond Se pueden especificar patrones de discontinuidad personalizados: -@lilypond[quote, verbatim, relative=1] -\tieDashPattern #0.3 #0.75 -c2~ c -\tieDashPattern #0.7 #1.5 -c2~ c -\tieSolid -c2~ c +@lilypond[quote, verbatim] +\relative c' { + \tieDashPattern #0.3 #0.75 + c2~ 2 + \tieDashPattern #0.7 #1.5 + c2~ 2 + \tieSolid + c2~ 2 +} @end lilypond -Las definiciones de patrones de discontinuidad para las ligaduras de -unión tienen la misma estructura que las definiciones de patrones de -discontinuidad para las ligaduras de expresión. Para ver más -información acerca de los patrones de discontinuidad complejos, -consulte los fragmentos de código bajo @ref{Ligaduras de expresión}. +Las definiciones de patrones de discontinuidad para las ligaduras +de unión tienen la misma estructura que las definiciones de +patrones de discontinuidad para las ligaduras de expresión. Para +ver más información acerca de los patrones de discontinuidad +complejos, consulte los fragmentos de código bajo +@ref{Ligaduras de expresión}. Sobreescriba las propiedades de disposición @var{whiteout} y -@var{layer} para las ligaduras de unión que colisionen con otros -objetos del pentagrama. - -@lilypond[verbatim,quote,ragged-right,relative=2] -\override Tie.layer = #-2 -\override Staff.TimeSignature.layer = #-1 -\override Staff.KeySignature.layer = #-1 -\override Staff.TimeSignature.whiteout = ##t -\override Staff.KeySignature.whiteout = ##t -b2 b~ -\time 3/4 -\key a \major -b r4 +@var{layer} de los objetos que puedan causar una discontinuidad en +las ligaduras de unión. + +@lilypond[verbatim,quote,ragged-right] +\relative { + \override Tie.layer = #-2 + \override Staff.TimeSignature.layer = #-1 + \override Staff.KeySignature.layer = #-1 + \override Staff.TimeSignature.whiteout = ##t + \override Staff.KeySignature.whiteout = ##t + b'2 b~ + \time 3/4 + \key a \major + b r4 +} @end lilypond @predefined @@ -596,6 +619,7 @@ b r4 @endpredefined @snippets + @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] {using-ties-with-arpeggios.ly} @@ -622,12 +646,12 @@ Referencia de funcionamiento interno: @rinternals{Tie}. @knownissues -Un cambio de pentagrama cuando hay una ligadura activa no producirá -una ligadura inclinada. +Un cambio de pentagrama cuando hay una ligadura activa no +producirá una ligadura inclinada. Los cambios de clave o de octava durante una ligadura de unión no -están bien definidos realmente. En estos casos puede ser preferible -una ligadura de expresión. +están bien definidos realmente. En estos casos puede ser +preferible una ligadura de expresión. @node Escritura de silencios @@ -654,22 +678,18 @@ expresiones musicales. @cindex breve, silencio de @funindex \rest -@funindex rest @funindex r @funindex \maxima -@funindex maxima @funindex \longa -@funindex longa @funindex \breve -@funindex breve -Los silencios se introducen como notas con el nombre @code{r}. Las -duraciones mayores que la redonda utilizan las instrucciones +Los silencios se introducen como notas con el nombre @code{r}. +Las duraciones mayores que la redonda utilizan las instrucciones predefinidas que se muestran aquí: @c \time 16/1 is used to avoid spurious bar lines @c and long tracts of empty measures -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Staff { % These two lines are just to prettify this example \time 16/1 @@ -687,24 +707,26 @@ predefinidas que se muestran aquí: @cindex silencios multicompás @cindex silencios de compás completo -Los silencios de un compás, centrados en medio del compás, se deben -hacer con silencios multicompás. Se pueden usar para un solo compás -así como para muchos compases, y se tratan en @ref{Silencios de compás completo}. +Los silencios de un compás, centrados en medio del compás, se +deben hacer con silencios multicompás. Se pueden usar para un +solo compás así como para muchos compases, y se tratan en +@ref{Silencios de compás completo}. @cindex silencio, especificar la posición vertical -Para especificar explícitamente la posición vertical de un silencio, -escriba una nota seguida de @code{\rest}. Se colocará un silencio en -la posición en que debería aparecer la nota. Esto posibilita la -aplicación manual precisa de formato a la música polifónica, ya que el -formateador automático de colisiones de silencios no mueve estos -silencios. +Para especificar explícitamente la posición vertical de un +silencio, escriba una nota seguida de @code{\rest}. Se colocará +un silencio en la posición en que debería aparecer la nota. Esto +posibilita la aplicación manual precisa de formato a la música +polifónica, ya que el formateador automático de colisiones de +silencios no mueve estos silencios. -@lilypond[quote,verbatim,relative=2] -a4\rest d4\rest +@lilypond[quote,verbatim] +\relative { a'4\rest d4\rest } @end lilypond @snippets + @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] {rest-styles.ly} @@ -726,9 +748,9 @@ Referencia de funcionamiento interno: @knownissues @c Deliberately duplicated in Durations and Rests. -gp No existe un límite fundamental respecto de las duraciones de los -silencios (tanto para el más corto como para el más largo), pero el -número de glifos es limitado: hay silencios desde la garrapatea (128) -hasta la máxima (8 redondas). +silencios (tanto para el más corto como para el más largo), pero +el número de glifos es limitado: hay silencios desde la garrapatea +(128) hasta la máxima (8 redondas). @node Silencios invisibles @@ -743,31 +765,33 @@ hasta la máxima (8 redondas). @funindex s @funindex \skip -@funindex skip Un silencio invisible (también conocido como @q{skip} o desplazamiento) se puede introducir como una nota con el nombre@tie{}@code{s}: -@lilypond[verbatim,quote,relative=2] -c4 c s c -s2 c +@lilypond[verbatim,quote] +\relative c'' { + c4 c s c | + s2 c | +} @end lilypond @cindex letra, desplazamiento de -Los silencios de separación sólo están disponible en el modo de notas -y en el modo de acordes. En otras situaciones, por ejemplo, cuando se -introduce la letra, se usa la instrucción @code{\skip} para producir -un desplazamiento de una cierta magnitud temporal. @code{\skip} -requiere una duración explícita, pero se ignora si las sílabas de la -letra toman sus duraciones de las notas de una melodía asociada, a -través de @code{\addlyrics} o de @code{\lyricsto}. +Los silencios de separación sólo están disponible en el modo de +notas y en el modo de acordes. En otras situaciones, por ejemplo, +cuando se introduce la letra, se usa la instrucción @code{\skip} +para producir un desplazamiento de una cierta magnitud temporal. +@code{\skip} requiere una duración explícita, pero se ignora si +las sílabas de la letra toman sus duraciones de las notas de una +melodía asociada, a través de @code{\addlyrics} o de +@code{\lyricsto}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << { - a2 \skip2 a2 a2 + a'2 \skip2 a'2 a'2 } \new Lyrics { \lyricmode { @@ -777,35 +801,36 @@ través de @code{\addlyrics} o de @code{\lyricsto}. >> @end lilypond -Dado que @code{\skip} es una instrucción, no afecta a las duraciones -por omisión de las notas siguientes, a diferencia de@tie{}@code{s}. +Dado que @code{\skip} es una instrucción, no afecta a las +duraciones por omisión de las notas siguientes, a diferencia +de@tie{}@code{s}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << { - \repeat unfold 8 { a4 } + \repeat unfold 8 { a'4 } } { - a4 \skip 2 a | - s2 a + a'4 \skip 2 a' | + s2 a' } >> @end lilypond Un silencio de separación produce implícitamente contextos -@code{Staff} y @code{Voice} si no existe ninguno, igual que las notas -y los silencios normales: +@code{Staff} y @code{Voice} si no existe ninguno, igual que las +notas y los silencios normales: -@lilypond[quote,verbatim,relative=2] -s1 s s +@lilypond[quote,verbatim] +{ s1 s s } @end lilypond -@code{\skip} tan sólo desplaza un tiempo musical; no produce ninguna -salida, de ninguna clase. +@code{\skip} tan sólo desplaza un tiempo musical; no produce +ninguna salida, de ninguna clase. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % This is valid input, but does nothing -\skip 1 \skip1 \skip 1 +{ \skip 1 \skip1 \skip 1 } @end lilypond @seealso @@ -834,42 +859,46 @@ Referencia de funcionamiento interno: @cindex redonda, silencios de, para un compás completo @cindex silencios de redonda para un compás completo +@funindex \compressMMRests @funindex R -Los silencios de uno o más compases completos se introducen como notas -con el nombre @code{R} en mayúscula: +Los silencios de uno o más compases completos se introducen como +notas con el nombre @code{R} en mayúscula: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % Rest measures contracted to single measure -\compressFullBarRests -R1*4 -R1*24 -R1*4 -b2^"Tutti" b4 a4 +\compressMMRests { + R1*4 + R1*24 + R1*4 + b'2^"Tutti" b'4 a'4 +} @end lilypond La duración de los silencios de compás completo es idéntica a la -notación de la duración que se usa para las notas. La duración de un -silencio multi-compás debe ser siempre un número entero de compases, -por lo que con frecuencia han de utilizarse puntillos o fracciones: - -@lilypond[quote,verbatim,relative=2] -\compressFullBarRests -\time 2/4 -R1 | R2 | -\time 3/4 -R2. | R2.*2 | -\time 13/8 -R1*13/8 | R1*13/8*12 | -\time 10/8 -R4*5*4 | +notación de la duración que se usa para las notas. La duración de +un silencio multi-compás debe ser siempre un número entero de +compases, por lo que con frecuencia han de utilizarse puntillos o +fracciones: + +@lilypond[quote,verbatim] +\compressMMRests { + \time 2/4 + R1 | R2 | + \time 3/4 + R2. | R2.*2 | + \time 13/8 + R1*13/8 | R1*13/8*12 | + \time 10/8 + R4*5*4 | +} @end lilypond Un silencio de un compás completo se imprime como un silencio de redonda o de breve, centrado en el compás, según el tipo de compás vigente. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 4/4 R1 | \time 6/4 @@ -881,27 +910,23 @@ R1*2 | @cindex multicompás, silencios, expansión de @cindex multicompás, silencios, contracción de -@funindex \expandFullBarRests -@funindex expandFullBarRests -@funindex \compressFullBarRests -@funindex compressFullBarRests - De forma predeterminada un silencio multicompás se expande en la -partitura impresa para mostrar explícitamente todos los compases de -silencio. De forma alternativa, un silencio multicompás se puede -presentar como un solo compás que contiene un símbolo de silencio -multicompás, con el número de compases impreso encima del compás: +partitura impresa para mostrar explícitamente todos los compases +de silencio. De forma alternativa, un silencio multicompás se +puede presentar como un solo compás que contiene un símbolo de +silencio multicompás, con el número de compases impreso encima del +compás: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] % Default behavior \time 3/4 r2. | R2.*2 | \time 2/4 R2 | \time 4/4 % Rest measures contracted to single measure -\compressFullBarRests -r1 | R1*17 | R1*4 | -% Rest measures expanded -\expandFullBarRests +\compressMMRests { + r1 | R1*17 | R1*4 | +} +% Rest measures expanded again \time 3/4 R2.*2 | @end lilypond @@ -916,27 +941,27 @@ R2.*2 | @cindex multicompás, silencio, con marcados @funindex \fermataMarkup -@funindex fermataMarkup @funindex MultiMeasureRestText -Se pueden añadir elementos de marcado a los silencios multicompás. Se -proporciona la instrucción predefinida @code{\fermataMarkup} para -añadir calderones. +Se pueden añadir elementos de marcado a los silencios multicompás. +Se proporciona la instrucción predefinida @code{\fermataMarkup} +para añadir calderones. -@lilypond[quote,verbatim,relative=2] -\compressFullBarRests -\time 3/4 -R2.*10^\markup { \italic "ad lib." } -R2.^\fermataMarkup +@lilypond[quote,verbatim] +\compressMMRests { + \time 3/4 + R2.*10^\markup { \italic "ad lib." } + R2.^\fermataMarkup +} @end lilypond @warning{Los elementos de marcado que se añaden a un silencio multicompás son objetos del tipo @code{MultiMeasureRestText}, no @code{TextScript}. Las sobreescrituras de propiedades deben ir -dirigidas hacia el objeto correcto, o se ignorarán. Véase el ejemplo -siguiente:} +dirigidas hacia el objeto correcto, o se ignorarán. Véase el +ejemplo siguiente:} -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] % This fails, as the wrong object name is specified \override TextScript.padding = #5 R1^"wrong" @@ -945,29 +970,24 @@ R1^"wrong" R1^"right" @end lilypond -Cuando un silencio multicompás sigue inmediatamente al establecimiento -de un compás parcial con @code{\partial}, es posible que no se emitan -las advertencias correspondientes de comprobación de compás. +Cuando un silencio multicompás sigue inmediatamente al +establecimiento de un compás parcial con @code{\partial}, es +posible que no se emitan las advertencias correspondientes de +comprobación de compás. @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff @funindex \fermataMarkup -@funindex fermataMarkup -@funindex \compressFullBarRests -@funindex compressFullBarRests -@funindex \expandFullBarRests -@funindex expandFullBarRests +@funindex \compressMMRests @predefined @code{\textLengthOn}, @code{\textLengthOff}, @code{\fermataMarkup}, -@code{\compressFullBarRests}, -@code{\expandFullBarRests}. +@code{\compressMMRests}. @endpredefined + @snippets @cindex eclesiásticos, silencios @cindex silencios eclesiásticos @@ -1014,8 +1034,8 @@ puede chocar con el número del compás. @cindex condensar silencios @cindex silencio normal, condensar -No hay ninguna forma de condensar automáticamente muchos silencios en -un solo silencio multicompás. +No hay ninguna forma de condensar automáticamente muchos silencios +en un solo silencio multicompás. @cindex silencio, colisiones de @@ -1045,56 +1065,60 @@ silencios. @cindex medida @funindex \time -@funindex time La indicación de compás se establece como sigue: -@lilypond[quote,verbatim,relative=2] -\time 2/4 c2 -\time 3/4 c2. +@lilypond[quote,verbatim,fragment] +\time 2/4 c''2 +\time 3/4 c''2. @end lilypond +Se estudian los cambios de indicación de compás en el medio de un +compás en @ref{Anacrusas}. + @cindex compás, visibilidad de la indicación de -La indicación de compás se imprime al comienzo de una pieza y siempre -que hay un cambio de compás. Si se produce un cambio al final de una -línea, se imprime una indicación de advertencia en dicho lugar. Se -puede modificar este comportamiento predeterminado, véase -@ref{Visibilidad de los objetos}. +La indicación de compás se imprime al comienzo de una pieza y +siempre que hay un cambio de compás. Si se produce un cambio al +final de una línea, se imprime una indicación de advertencia en +dicho lugar. Se puede modificar este comportamiento +predeterminado, véase @ref{Visibilidad de los objetos}. -@lilypond[quote,verbatim,relative=2] -\time 2/4 -c2 c -\break -c c -\break -\time 4/4 -c c c c +@lilypond[quote,verbatim] +\relative c'' { + \time 2/4 + c2 c + \break + c c + \break + \time 4/4 + c c c c +} @end lilypond @cindex compás, estilo de la indicación de @cindex metro, estilo de @funindex \numericTimeSignature -@funindex numericTimeSignature @funindex \defaultTimeSignature -@funindex defaultTimeSignature El símbolo de compás que se usa en 2/2 y 4/4 se puede cambiar a un estilo numérico: -@lilypond[quote,verbatim,relative=2] -% Default style -\time 4/4 c1 -\time 2/2 c1 -% Change to numeric style -\numericTimeSignature -\time 4/4 c1 -\time 2/2 c1 -% Revert to default style -\defaultTimeSignature -\time 4/4 c1 -\time 2/2 c1 +@lilypond[quote,verbatim] +\relative c'' { + % Default style + \time 4/4 c1 + \time 2/2 c1 + % Change to numeric style + \numericTimeSignature + \time 4/4 c1 + \time 2/2 c1 + % Revert to default style + \defaultTimeSignature + \time 4/4 c1 + \time 2/2 c1 +} @end lilypond Las indicaciones de compás de la música mensural se tratan en @@ -1112,17 +1136,17 @@ propiedades basadas en el tipo de compás @code{baseMoment}, predefinidos de estas propiedades están en @file{scm/time-signature-settings.scm}. -El valor predeterminado de @code{beatStructure} puede sobreescribirse -dentro de la propia instrucción @code{\time} escribiéndolo como primer -argumento opcional: +El valor predeterminado de @code{beatStructure} puede +sobreescribirse dentro de la propia instrucción @code{\time} +escribiéndolo como primer argumento opcional: @lilypond[quote,verbatim] \score { \new Staff { - \relative c' { - \time #'(2 2 3) 7/8 - \repeat unfold 7 { c8 } | - \time #'(3 2 2) 7/8 + \relative { + \time 2,2,3 7/8 + \repeat unfold 7 { c'8 } | + \time 3,2,2 7/8 \repeat unfold 7 { c8 } | } } @@ -1132,10 +1156,10 @@ argumento opcional: De forma alternativa, los valores predeterminados de todoas estas variables basadas en la indicación de compás, incluidas @code{baseMoment} y @code{beamExceptions}, se pueden establecer -juntas. Los valores se pueden fijar independientemente para varios -tipos de compás distintos. Los nuevos valores tienen efecto cuando se -ejecuta una instrucción @code{\time} posterior con el mismo valor del -tipo de compás: +juntas. Los valores se pueden fijar independientemente para +varios tipos de compás distintos. Los nuevos valores tienen +efecto cuando se ejecuta una instrucción @code{\time} posterior +con el mismo valor del tipo de compás: @lilypond[quote,verbatim] \score { @@ -1144,7 +1168,7 @@ tipo de compás: \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 { c8 } | @@ -1158,13 +1182,13 @@ tipo de compás: @enumerate @item -@code{@var{timeSignatureFraction}}, una fracción que describe -el tipo de compás al que se aplican estos valores. +@code{@var{timeSignatureFraction}}, una fracción que describe el +tipo de compás al que se aplican estos valores. @item @code{@var{baseMomentFraction}}, una fracción que contiene el -numerador y denominador de la unidad de medida básica de ese tipo de -compás. +numerador y denominador de la unidad de medida básica de ese tipo +de compás. @item @code{@var{beatStructure}}, una lista de Scheme que indica la @@ -1183,17 +1207,17 @@ comportamiento de las barras automáticas}. @cindex restaurar las propiedades predeterminadas del tipo de compás @funindex \revertTimeSignatureSettings -Los valores modificados de las propiedades predeterminadas del tipo de -compás se pueden restaurar a los valores originales: +Los valores modificados de las propiedades predeterminadas del +tipo de compás se pueden restaurar a los valores originales: @lilypond[quote,verbatim] \score{ - \relative c' { - \repeat unfold 8 { c8 } | + \relative { + \repeat unfold 8 { c'8 } | \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 { c8 } | @@ -1207,8 +1231,8 @@ compás se pueden restaurar a los valores originales: Se pueden establecer diferentes valores de las propiedades predeterminadas del tipo de compás para los distintos pentagramas moviendo el @code{Timing_translator} y el -@code{Default_bar_line_engraver} del contexto @code{Score} al contexto -@code{Staff}. +@code{Default_bar_line_engraver} del contexto @code{Score} al +contexto @code{Staff}. @lilypond[quote, verbatim] \score { @@ -1217,7 +1241,7 @@ moviendo el @code{Timing_translator} y el \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 {c''8} @@ -1226,7 +1250,7 @@ moviendo el @code{Timing_translator} y el \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(1 3) % beatStructure + 1,3 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 {c''8} @@ -1247,10 +1271,10 @@ moviendo el @code{Timing_translator} y el } @end lilypond -Otro método para cambiar estas variables relacionadas con el tipo de -compás, que evita la reimpresión de la indicación de compás en el -momento del cambio, se muestra en -@ref{Establecer el comportamiento de las barras automáticas}. +Otro método para cambiar estas variables relacionadas con el tipo +de compás, que evita la reimpresión de la indicación de compás en +el momento del cambio, se muestra en @ref{Establecer el +comportamiento de las barras automáticas}. @predefined @code{\numericTimeSignature}, @@ -1292,62 +1316,72 @@ Referencia de funcionamiento interno: @cindex metrónomo, indicación de, con texto @funindex \tempo -@funindex tempo Es muy sencillo escribir una indicación metronómica básica: -@lilypond[verbatim,quote,relative=1] -\tempo 4 = 120 -c2 d -e4. d8 c2 +@lilypond[verbatim,quote] +\relative { + \tempo 4 = 120 + c'2 d + e4. d8 c2 +} @end lilypond -También se pueden imprimir indicaciones metronómicas -como un intervalo entre dos números: +También se pueden imprimir indicaciones metronómicas como un +intervalo entre dos números: -@lilypond[verbatim,quote,relative=1] -\tempo 4 = 40 - 46 -c4. e8 a4 g -b,2 d4 r +@lilypond[verbatim,quote] +\relative { + \tempo 4 = 40 - 46 + c'4. e8 a4 g + b,2 d4 r +} @end lilypond Se pueden usar indicaciones de tempo con texto: -@lilypond[verbatim,quote,relative=2] -\tempo "Allegretto" -c4 e d c -b4. a16 b c4 r4 +@lilypond[verbatim,quote] +\relative { + \tempo "Allegretto" + c''4 e d c + b4. a16 b c4 r4 +} @end lilypond -La combinación de una indicación metronómica y un texto hace que la -marca de metrónomo se encierre entre paréntesis automáticamente: +La combinación de una indicación metronómica y un texto hace que +la marca de metrónomo se encierre entre paréntesis +automáticamente: -@lilypond[verbatim,quote,relative=2] -\tempo "Allegro" 4 = 160 -g4 c d e -d4 b g2 +@lilypond[verbatim,quote] +\relative { + \tempo "Allegro" 4 = 160 + g'4 c d e + d4 b g2 +} @end lilypond En general, el texto puede ser cualquier objeto de marcado: -@lilypond[verbatim,quote,relative=2] -\tempo \markup { \italic Faster } 4 = 132 -a8-. r8 b-. r gis-. r a-. r +@lilypond[verbatim,quote] +\relative { + \tempo \markup { \italic Faster } 4 = 132 + a'8-. r8 b-. r gis-. r a-. r +} @end lilypond Se puede escribir una indicación metronómica entre paréntesis sin ninguna indicación textual, escribiendo una cadena vacía en la entrada: -@lilypond[verbatim,quote,relative=2] -\tempo "" 8 = 96 -d4 g e c +@lilypond[verbatim,quote] +\relative { + \tempo "" 8 = 96 + d''4 g e c +} @end lilypond @funindex \markLengthOn -@funindex markLengthOn @funindex \markLengthOff -@funindex markLengthOff En una particella de un instrumento con períodos de silencio largos, en ocasiones se suceden muy cerca distintas indicaciones @@ -1357,16 +1391,17 @@ superpongan, y @code{\markLengthOff} restablece el comportamiento predeterminado de ignorar las indicaciones de tempo para el espaciado horizontal. -@lilypond[verbatim,quote,relative=0] -\compressFullBarRests -\markLengthOn -\tempo "Molto vivace" -R1*12 -\tempo "Meno mosso" -R1*16 -\markLengthOff -\tempo "Tranquillo" -R1*20 +@lilypond[verbatim,quote] +\compressMMRests { + \markLengthOn + \tempo "Molto vivace" + R1*12 + \tempo "Meno mosso" + R1*16 + \markLengthOff + \tempo "Tranquillo" + R1*20 +} @end lilypond @snippets @@ -1393,7 +1428,7 @@ Glosario musical: Referencia de la notación: @ref{Formatear el texto}, -@ref{Salida MIDI}. +@ref{Creación de salida MIDI}. Fragmentos de código: @rlsr{Staff notation}. @@ -1411,61 +1446,70 @@ Referencia de funcionamiento interno:: @cindex compás parcial @cindex parcial, compás @cindex compás de anacrusa +@cindex compás, indicación de, en medio de un compás @funindex measurePosition @funindex \partial -@funindex partial -Los compases parciales como las @emph{anacrusas} o partes -@emph{al alzar} se escriben usando la instrucción -@code{\partial}: +Los compases parciales como las @emph{anacrusas} o partes @emph{al +alzar} se escriben usando la instrucción @code{\partial}: @example \partial @var{duración} @end example -@noindent -donde @code{@var{duración}} es la longitud @emph{restante} -del compás parcial @emph{antes} del comienzo del siguiente -compás completo. +Cuando se usa @code{\partial} al principio de la partitura, +@code{@var{duración}} es el tiempo de anacrusa, la longitud de la +música que precede al primer compás. -@lilypond[quote,verbatim,relative=1] -\time 3/4 -\partial 8 -e8 | a4 c8 b c4 | +@lilypond[quote,verbatim] +\relative { + \time 3/4 + \partial 4. + r4 e'8 | a4 c8 b c4 | +} @end lilypond -La @var{duración} puede ser cualquier valor menor de un compás -completo: +Cuando se usa @code{\partial} después del comienzo de la +partitura, @code{@var{duración}} es la longitud @emph{restante} +del compás actual. No crea un nuevo compás con numeración. -@lilypond[quote,verbatim,relative=1] -\time 3/4 -\partial 4. -r4 e8 | a4 c8 b c4 | +@lilypond[quote,verbatim] +\relative { + \set Score.barNumberVisibility = #all-bar-numbers-visible + \override Score.BarNumber.break-visibility = + #end-of-line-invisible + \time 9/8 + d''4.~ 4 d8 d( c) b | c4.~ 4. \bar "||" + \time 12/8 + \partial 4. + c8( d) e | f2.~ 4 f8 a,( c) f | +} @end lilypond -El @code{\partial @var{duración}} se puede también escribir como: - -@example -\set Timing.measurePosition -@var{duración} -@end example - -Así que el primer ejemplo podría haberse escrito así: +La instrucción @code{\partial} es @emph{necesaria} cuando cambia +la indicación de compás en medio de un compás, pero también puede +usarse sola. -@lilypond[quote,verbatim,relative=1] -\time 3/4 -\set Timing.measurePosition = #(ly:make-moment -1/8) -e8 | a4 c8 b c4 | +@lilypond[quote,verbatim] +\relative { + \set Score.barNumberVisibility = #all-bar-numbers-visible + \override Score.BarNumber.break-visibility = + #end-of-line-invisible + \time 6/8 + \partial 8 + e'8 | a4 c8 b[ c b] | + \partial 4 + r8 e,8 | a4 \bar "||" + \partial 4 + r8 e8 | a4 + c8 b[ c b] | +} @end lilypond -La propiedad @code{measurePosition} contiene un número racional, -que suele ser positivo y que indica qué porción del compás ha -transcurrido hasta ahora en este punto. La instrucción -@code{\partial @var{duración}} lo establece a un número negativo, -en cuyo caso tiene un significado distinto: en esta ocasión indica -que el compás actual (el primero) será @emph{precedido} por un -compás cero (el compás parcial) con una duración dada por el valor -@var{duración}. +La instrucción @code{\partial} fija la propiedad +@code{Timing.measurePosition}, que un número racional que indica +cuánto tiempo ha transcurrido dentro del compás actual. @seealso Glosario musical: @@ -1480,20 +1524,6 @@ Fragmentos de código: Referencia de funcionamiento interno: @rinternals{Timing_translator}. -@knownissues -La instrucción @code{\partial} debe usarse solamente en el comienzo de -una pieza. Si se emplea después del comienzo se obtendrán varias -advertencias o efectos desagradables, en este caso utilice en su lugar -@code{\set Timing.measurePosition}. - -@lilypond[quote,verbatim,relative=1] -\time 6/8 -\partial 8 -e8 | a4 c8 b[ c b] | -\set Timing.measurePosition = #(ly:make-moment -1/4) -r8 e,8 | a4 c8 b[ c b] | -@end lilypond - @node Música sin compasear @unnumberedsubsubsec Música sin compasear @@ -1518,37 +1548,38 @@ r8 e,8 | a4 c8 b[ c b] | @cindex barras, música sin metro @funindex \cadenzaOn -@funindex cadenzaOn @funindex \cadenzaOff -@funindex cadenzaOff -En la música medida se insertan líneas divisorias -y se calculan los números de compás automáticamente. -En música sin metro (es decir, cadencias), esto no es deseable -y se puede @q{desactivar} usando la instrucción -@code{\cadenzaOn}, para despúes @q{reactivarlo} en el lugar -adecuado usando @code{\cadenzaOff}. +En la música medida se insertan líneas divisorias y se calculan +los números de compás automáticamente. En música sin metro (es +decir, cadencias), esto no es deseable y se puede @q{desactivar} +usando la instrucción @code{\cadenzaOn}, para despúes +@q{reactivarlo} en el lugar adecuado usando @code{\cadenzaOff}. -@lilypond[verbatim,relative=2,quote] -c4 d e d -\cadenzaOn -c4 c d8[ d d] f4 g4. -\cadenzaOff -\bar "|" -d4 e d c +@lilypond[verbatim,quote] +\relative c'' { + c4 d e d + \cadenzaOn + c4 c d8[ d d] f4 g4. + \cadenzaOff + \bar "|" + d4 e d c +} @end lilypond La numeración de compases se continúa al final de la cadencia. -@lilypond[verbatim,relative=2,quote] -% Show all bar numbers -\override Score.BarNumber.break-visibility = #all-visible -c4 d e d -\cadenzaOn -c4 c d8[ d d] f4 g4. -\cadenzaOff -\bar "|" -d4 e d c +@lilypond[verbatim,quote] +\relative c'' { + % Show all bar numbers + \override Score.BarNumber.break-visibility = #all-visible + c4 d e d + \cadenzaOn + c4 c d8[ d d] f4 g4. + \cadenzaOff + \bar "|" + d4 e d c +} @end lilypond Al insertar una instrucción @code{\bar} dentro de una cadencia no @@ -1560,37 +1591,40 @@ de @code{\bar}. Si se quieren imprimir alteraciones accidentales posteriores tendrán que insertarse manualmente alteraciones forzadas o de cortesía, véase @ref{Alteraciones accidentales}. -@lilypond[verbatim,relative=2,quote] -c4 d e d -\cadenzaOn -cis4 d cis d -\bar "|" -% First cis is printed without alteration even if it's after a \bar -cis4 d cis! d -\cadenzaOff -\bar "|" +@lilypond[verbatim,quote] +\relative c'' { + c4 d e d + \cadenzaOn + cis4 d cis d + \bar "|" + % First cis is printed without alteration even if it's after a \bar + cis4 d cis! d + \cadenzaOff + \bar "|" +} @end lilypond El barrado automático se desactiva mediante @code{\cadenzaOn}. -Por tanto, todo el barrado en las -cadencias se debe introducir manualmente. -Véase @ref{Barras manuales}. - -@lilypond[verbatim,relative=2,quote] -\repeat unfold 8 { c8 } -\cadenzaOn -cis8 c c c c -\bar"|" -c8 c c -\cadenzaOff -\repeat unfold 8 { c8 } -@end lilypond - -Estas instrucciones predefinidas afectan a todas las -pautas de la partitura, aunque aparezcan en un solo contexto -@code{Voice}. Para cambiar esto, traslade el -@code{Timing_translator} del contexto @code{Score} al contexto -@code{Staff}, véase @ref{Notación polimétrica}. +Por tanto, todo el barrado en las cadencias se debe introducir +manualmente. Véase @ref{Barras manuales}. + +@lilypond[verbatim,quote] +\relative { + \repeat unfold 8 { c''8 } + \cadenzaOn + cis8 c c c c + \bar"|" + c8 c c + \cadenzaOff + \repeat unfold 8 { c8 } +} +@end lilypond + +Estas instrucciones predefinidas afectan a todas las pautas de la +partitura, aunque aparezcan en un solo contexto @code{Voice}. +Para cambiar esto, traslade el @code{Timing_translator} del +contexto @code{Score} al contexto @code{Staff}, véase +@ref{Notación polimétrica}. @predefined @code{\cadenzaOn}, @@ -1621,11 +1655,10 @@ Fragmentos de código: @cindex saltos de página, música sin medida @knownissues -Sólo se insertan saltos de línea y de página automáticamente -en las líneas divisorias, -por lo que es necesario insertar manualmente líneas divisorias -@q{invisibles} en fragmentos largos de música sin medir para permitir -los saltos: +Sólo se insertan saltos de línea y de página automáticamente en +las líneas divisorias, por lo que es necesario insertar +manualmente líneas divisorias @q{invisibles} en fragmentos largos +de música sin medir para permitir los saltos: @example \bar "" @@ -1647,37 +1680,35 @@ los saltos: @funindex timeSignatureFraction @funindex \scaleDurations -@funindex scaleDurations @funindex \tuplet -@funindex tuplet Está contemplada la notación polimétrica, ya sea explícitamente o -mediante la modificación manual de la indicación visible del compás y/o el -escalado de la duración de las notas. +mediante la modificación manual de la indicación visible del +compás y/o el escalado de la duración de las notas. @subsubsubheading Pentagramas con distintas indicaciones de compás y compases de igual longitud -Establezca una indicación de compás común para cada pentagrama, y fije -@code{timeSignatureFraction} a la fracción deseada. Luego use la función -@code{\scaleDurations} para escalar las duraciones de las notas en cada -pauta a la indicación de compás común. +Establezca una indicación de compás común para cada pentagrama, y +fije @code{timeSignatureFraction} a la fracción deseada. Luego +use la función @code{\scaleDurations} para escalar las duraciones +de las notas en cada pauta a la indicación de compás común. @cindex barras en música polimétrica @cindex polimétrico, metro, barras en -En el siguiente ejemplo, se usa en paralelo música con compases de 3/4, 9/8 y -10/8. En el segundo pentagrama, las duraciones mostradas se -multiplican por 2/3 (pues 2/3 * 9/8 = 3/4), y en el tercer pentagrama, -las duraciones que se muestran están multiplicadas por 3/5 (pues 3/5 * -10/8 = 3/4). Con frecuencia habrá que insertar las barras de -forma manual, pues el escalado de las duraciones afecta a las reglas -de barrado automático. +En el siguiente ejemplo, se usa en paralelo música con compases de +3/4, 9/8 y 10/8. En el segundo pentagrama, las duraciones +mostradas se multiplican por 2/3 (pues 2/3 * 9/8 = 3/4), y en el +tercer pentagrama, las duraciones que se muestran están +multiplicadas por 3/5 (pues 3/5 * 10/8 = 3/4). Con frecuencia +habrá que insertar las barras de forma manual, pues el escalado de +las duraciones afecta a las reglas de barrado automático. @lilypond[quote,verbatim] -\relative c' << +\relative << \new Staff { \time 3/4 - c4 c c | + c'4 c c | c4 c c | } \new Staff { @@ -1701,8 +1732,8 @@ de barrado automático. @subsubsubheading Pentagramas con distintas indicaciones de compás y longitudes de compás distintas Se puede dar a cada pentagrama su propia indicación de compás -independiente trasladando los grabadores @code{Timing_translator} y -@code{Default_bar_line_engraver} al contexto de @code{Staff}. +independiente trasladando los grabadores @code{Timing_translator} +y @code{Default_bar_line_engraver} al contexto de @code{Staff}. @lilypond[quote,verbatim] \layout { @@ -1720,10 +1751,10 @@ independiente trasladando los grabadores @code{Timing_translator} y % Now each staff has its own time signature. -\relative c' << +\relative << \new Staff { \time 3/4 - c4 c c | + c'4 c c | c4 c c | } \new Staff { @@ -1755,13 +1786,13 @@ Se crean usando la función @code{\compoundMeter}. La sintaxis es: @end example La construcción más simple es una lista única, en la que el -@emph{último} número indica el denominador de la indicación de compás -y los anteriores son los numeradores. +@emph{último} número indica el denominador de la indicación de +compás y los anteriores son los numeradores. @lilypond[quote,verbatim] -\relative c' { +\relative { \compoundMeter #'((2 2 2 8)) - \repeat unfold 6 c8 \repeat unfold 12 c16 + \repeat unfold 6 c'8 \repeat unfold 12 c16 } @end lilypond @@ -1770,14 +1801,14 @@ adicionales. Asimismo, los ajustes de barrado se ajustarán dependiendo de los valores. @lilypond[quote,verbatim] -\relative c' { +\relative { \compoundMeter #'((1 4) (3 8)) - \repeat unfold 5 c8 \repeat unfold 10 c16 + \repeat unfold 5 c'8 \repeat unfold 10 c16 } -\relative c' { +\relative { \compoundMeter #'((1 2 3 8) (3 4)) - \repeat unfold 12 c8 + \repeat unfold 12 c'8 } @end lilypond @@ -1804,11 +1835,11 @@ Referencia de funcionamiento interno: @knownissues Al usar distintos compases en paralelo, las notas que están en el -mismo instante de tiempo se colocan en la misma posición horizontal. -Sin embargo, las barras de compás en los distintos pentagramas harán -que el espaciado de notas sea menos regular en cada pentagrama -individual de lo que sería normal sin las distintas indicaciones de -compás. +mismo instante de tiempo se colocan en la misma posición +horizontal. Sin embargo, las barras de compás en los distintos +pentagramas harán que el espaciado de notas sea menos regular en +cada pentagrama individual de lo que sería normal sin las +distintas indicaciones de compás. @node División automática de las notas @@ -1824,30 +1855,65 @@ compás. @funindex Completion_heads_engraver @funindex Completion_rest_engraver -Las notas largas se pueden convertir automáticamente en notas ligadas. -Se hace mediante la sustitución del @code{Note_heads_engraver} por el -@code{Completion_heads_engraver}. De forma similar, los silencios largos que -sobrepasan líneas de compás se dividen automáticamente sustituyendo el -grabador @code{Rest_engraver} con el grabador @code{Completion_rest_engraver}. -En el ejemplo siguiente, las notas y los silencios que atraviesan la barra -de compás se dividen, y además las notas se unen mediante una ligadura. +Las notas largas se pueden convertir automáticamente en notas +ligadas. Se hace mediante la sustitución del +@code{Note_heads_engraver} por el +@code{Completion_heads_engraver}. De forma similar, los silencios +largos que sobrepasan líneas de compás se dividen automáticamente +sustituyendo el grabador @code{Rest_engraver} con el grabador +@code{Completion_rest_engraver}. En el ejemplo siguiente, las +notas y los silencios que atraviesan la barra de compás se +dividen, y además las notas se unen mediante una ligadura. -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim] \new Voice \with { \remove "Note_heads_engraver" \consists "Completion_heads_engraver" \remove "Rest_engraver" \consists "Completion_rest_engraver" } - -{ c2. c8 d4 e f g a b c8 c2 b4 a g16 f4 e d c8. c2 r1*2 } +\relative { + c'2. c8 d4 e f g a b c8 c2 b4 a g16 f4 e d c8. c2 r1*2 +} @end lilypond Estos grabadores dividen todas las notas y silencios largos en la -barra de compás, e inserta ligaduras en las notas. -Uno de sus usos es depurar partituras complejas: -si los compases no están completos, las ligaduras mostrarán -exactamente cuánto le falta a cada compás. +barra de compás, e inserta ligaduras en las notas. Uno de sus +usos es depurar partituras complejas: si los compases no están +completos, las ligaduras mostrarán exactamente cuánto le falta a +cada compás. + +La propiedad @code{completionUnit} fija una duración preferida +para las notas divididas. + +@lilypond[quote,verbatim] +\new Voice \with { + \remove "Note_heads_engraver" + \consists "Completion_heads_engraver" +} \relative { + \time 9/8 g\breve. d''4. \bar "||" + \set completionUnit = #(ly:make-moment 3 8) + g\breve. d4. +} +@end lilypond + +Estos grabadores dividen las notas que tienen la duración +escalada, como las de los tresillos, en notas que tienen el mismo +factor de escala que la nota original de la entrada. + +@lilypond[quote,verbatim] +\new Voice \with { + \remove "Note_heads_engraver" + \consists "Completion_heads_engraver" +} \relative { + \time 2/4 r4 + \tuplet 3/2 {g'4 a b} + \scaleDurations 2/3 {g a b} + g4*2/3 a b + \tuplet 3/2 {g4 a b} + r4 +} +@end lilypond @seealso Glosario musical: @@ -1868,13 +1934,13 @@ Referencia de funcionamiento interno: @rinternals{Forbid_line_break_engraver}. @knownissues -No todas las duraciones (sobre todo las que contienen grupos -especiales) se pueden representar exactamente con notas normales y -puntillos, pero el grabador @code{Completion_heads_engraver} nunca -insertará grupos especiales. - -@code{Completion_heads_engraver} afecta sólo a las notas; no divide -silencios. +Por consistencia con el comportamiento anterior, las notas y +silencios que tienen una duración mayor de un compás, como +@code{c1*2}, se dividen en notas sin ningún factor de escala, +@code{@{ c1 c1 @}}. La propiedad @code{completionFactor} controla +este comportamiento, y al darle el valor @code{#f} podemos hacer +que las notas y silencios divididos tengan el mismo factor de +escala que las duraciones de las notas originales de la entrada. @node Mostrar los ritmos de la melodía @@ -1885,16 +1951,16 @@ silencios. @cindex duraciones de la melodía, mostrar A veces podemos querer mostrar solamente el ritmo de una melodía. -Esto se puede hacer con un pentagrama de ritmo. Todas las alturas de -las notas se convierten en barras inclinadas, y el pentagrama tiene -una sola línea: +Esto se puede hacer con un pentagrama de ritmo. Todas las alturas +de las notas se convierten en barras inclinadas, y el pentagrama +tiene una sola línea: -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << \new RhythmicStaff { - \new Voice = "myRhythm" { + \new Voice = "myRhythm" \relative { \time 4/4 - c4 e8 f g2 + c'4 e8 f g2 r4 g g f g1 } @@ -1914,9 +1980,7 @@ una sola línea: @funindex Pitch_squash_engraver @funindex \improvisationOn -@funindex improvisationOn @funindex \improvisationOff -@funindex improvisationOff Las tablas de acordes de guitarra ofrecen a menudo los ritmos de rasgueado. Esto se puede hacer con el grabador @@ -1985,42 +2049,46 @@ automáticamente: @cindex barras, reglas personalizadas @funindex \autoBeamOn -@funindex autoBeamOn @funindex \autoBeamOff -@funindex autoBeamOff -@lilypond[quote,verbatim,relative=2] -\time 2/4 c8 c c c -\time 6/8 c8 c c c8. c16 c8 +@lilypond[quote,verbatim] +\relative c'' { + \time 2/4 c8 c c c + \time 6/8 c8 c c c8. c16 c8 +} @end lilypond Cuando estas decisiones automáticas no son lo bastante buenas, se -pueden escribir los barrados de forma explícita; véase @ref{Barras manuales}. Las barras @emph{se deben} introducir manualmente si se -quieren extender por encima de los silencios. +pueden escribir los barrados de forma explícita; véase +@ref{Barras manuales}. Las barras @emph{se deben} introducir +manualmente si se quieren extender por encima de los silencios. Si no se necesita el barrado automático, se puede desactivar con @code{\autoBeamOff} y activarse con @code{\autoBeamOn}: -@lilypond[quote,relative=1,verbatim] -c4 c8 c8. c16 c8. c16 c8 -\autoBeamOff -c4 c8 c8. c16 c8. -\autoBeamOn -c16 c8 +@lilypond[quote,verbatim] +\relative c' { + c4 c8 c8. c16 c8. c16 c8 + \autoBeamOff + c4 c8 c8. c16 c8. + \autoBeamOn + c16 c8 +} @end lilypond @cindex melismas, barras en @cindex barras y melismas -@warning{Si se usan barras para indicar los melismas de las canciones, -entonces se debe desactivar el barrado automático con -@code{@bs{}autoBeamOff} e indicar las barras manualmente. -La utilización de @code{@bs{}partcombine} con -@code{@bs{}autoBeamOff} puede producir resultados no deseados. Véanse -los fragmentos de código para mayor información.} +@warning{Si se usan barras para indicar los melismas de las +canciones, entonces se debe desactivar el barrado automático con +@code{@bs{}autoBeamOff} e indicar las barras manualmente. La +utilización de @code{@bs{}partcombine} con @code{@bs{}autoBeamOff} +puede producir resultados no deseados. Véanse los fragmentos de +código para mayor información.} Se pueden crear patrones de barrado que difieran de los valores -automáticos predeterminados; véase @ref{Establecer el comportamiento de las barras automáticas}. +automáticos predeterminados; véase +@ref{Establecer el comportamiento de las barras automáticas}. @predefined @code{\autoBeamOff}, @@ -2069,9 +2137,9 @@ Referencia de funcionamiento interno: @knownissues Las propiedades de una barra vienen determinadas al @emph{comienzo} de su construcción y cualquier cambio adicional en -las propiedades de la barra que se produzca antes de que la barra se ha -completado no tendrá efecto hasta que inicie la @emph{siguiente} -barra nueva. +las propiedades de la barra que se produzca antes de que la barra +se ha completado no tendrá efecto hasta que inicie la +@emph{siguiente} barra nueva. @node Establecer el comportamiento de las barras automáticas @@ -2083,13 +2151,11 @@ barra nueva. @funindex autoBeaming @funindex baseMoment -@funindex beamExceptions +@funindex \beamExceptions @funindex beatStructure @funindex measureLength @funindex \time -@funindex time @funindex \set -@funindex set Cuando está habilitado el barrado automático, la colocación de las barras automáticas viene determinada por tres propiedades de @@ -2104,10 +2170,10 @@ en curso, se usa dicha regla para determinar la colocación de las barras; se ignoran los valores de @code{baseMoment} y @code{beatStructure}. -Si no está definida ninguna regla de -@code{beamExceptions} para el tipo de compás en curso, la -colocación de las barras está determinada por los valores de -@code{baseMoment} y @code{beatStructure}. +Si no está definida ninguna regla de @code{beamExceptions} para el +tipo de compás en curso, la colocación de las barras está +determinada por los valores de @code{baseMoment} y +@code{beatStructure}. @subsubsubheading Barrado basado en @code{baseMoment} y @code{beatStructure} @@ -2134,50 +2200,65 @@ De forma predeterminada, @code{baseMoment} es una unidad más que el denominador del compás. De forma predeterminada también, cada unidad de longitud @code{baseMoment} es un único pulso. -@lilypond[quote,relative=2,verbatim] -\time 5/16 -c16^"default" c c c c | -% beamExceptions are unlikely to be defined for 5/16 time, -% but let's disable them anyway to be sure -\set Timing.beamExceptions = #'() -\set Timing.beatStructure = #'(2 3) -c16^"(2+3)" c c c c | -\set Timing.beatStructure = #'(3 2) -c16^"(3+2)" c c c c | +Observe que existen valores de @code{beatStructure} y de +@code{baseMoment} diferentes para cada indicación de compás. Los +cambios que se hacen a estas variables se aplican solamente al +tipo de compás en vigor, por lo que dichos cambios se deben +escribir después de la instrucción @code{\time} que da comienzo a +una sección nueva con un tipo de compás distinto, no antes. Los +valores nuevos que se dan a una indicación de compás concreta se +retienen y se vuelven a aplicar cuando ese tipo de compás vuelve a +establecerse. + +@lilypond[quote,verbatim] +\relative c'' { + \time 5/16 + c16^"default" c c c c | + % beamExceptions are unlikely to be defined for 5/16 time, + % but let's disable them anyway to be sure + \set Timing.beamExceptions = #'() + \set Timing.beatStructure = 2,3 + c16^"(2+3)" c c c c | + \set Timing.beatStructure = 3,2 + c16^"(3+2)" c c c c | +} @end lilypond -@lilypond[quote,relative=2,verbatim] -\time 4/4 -a8^"default" a a a a a a a -% Disable beamExceptions because they are definitely -% defined for 4/4 time -\set Timing.beamExceptions = #'() -\set Timing.baseMoment = #(ly:make-moment 1/4) -\set Timing.beatStructure = #'(1 1 1 1) -a8^"changed" a a a a a a a +@lilypond[quote,verbatim] +\relative { + \time 4/4 + a'8^"default" a a a a a a a + % Disable beamExceptions because they are definitely + % defined for 4/4 time + \set Timing.beamExceptions = #'() + \set Timing.baseMoment = #(ly:make-moment 1/4) + \set Timing.beatStructure = 1,1,1,1 + a8^"changed" a a a a a a a +} @end lilypond -Los cambios en los ajustes de barrado se pueden limitar a contextos -específicos. Si no se incluye ningún ajuste en un contexto de nivel -más bajo, se aplican los ajustes del contexto circundante. +Los cambios en los ajustes de barrado se pueden limitar a +contextos específicos. Si no se incluye ningún ajuste en un +contexto de nivel más bajo, se aplican los ajustes del contexto +circundante. -@lilypond[quote, verbatim,relative=1] +@lilypond[quote, verbatim] \new Staff { \time 7/8 % No need to disable beamExceptions % as they are not defined for 7/8 time - \set Staff.beatStructure = #'(2 3 2) + \set Staff.beatStructure = 2,3,2 << \new Voice = one { - \relative c'' { - a8 a a a a a a + \relative { + a'8 a a a a a a } } \new Voice = two { - \relative c' { + \relative { \voiceTwo - \set Voice.beatStructure = #'(1 3 3) - f8 f f f f f f + \set Voice.beatStructure = 1,3,3 + f'8 f f f f f f } } >> @@ -2188,108 +2269,95 @@ En caso de usar varias voces, se debe especificar el contexto @code{Staff} si queremos aplicar el barrado a todas las voces del pentagrama: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 7/8 % rhythm 3-1-1-2 % Change applied to Voice by default -- does not work correctly % Because of autogenerated voices, all beating will % be at baseMoment (1 . 8) -\set beatStructure = #'(3 1 1 2) -<< {a8 a a a16 a a a a8 a} \\ {f4. f8 f f f} >> +\set beatStructure = 3,1,1,2 +<< \relative {a'8 a a a16 a a a a8 a} \\ \relative {f'4. f8 f f f} >> % Works correctly with context Staff specified -\set Staff.beatStructure = #'(3 1 1 2) -<< {a8 a a a16 a a a a8 a} \\ {f4. f8 f f f} >> +\set Staff.beatStructure = 3,1,1,2 +<< \relative {a'8 a a a16 a a a a8 a} \\ \relative {f'4. f8 f f f} >> @end lilypond El valor de @code{baseMoment} se puede ajustar para cambiar el -comportamiento de las barras, si se desea. Cuando se hace, el valor -de @code{beatStructure} se debe fijar de manera que sea compatible con -el nuevo valor de @code{baseMoment}. +comportamiento de las barras, si se desea. Cuando se hace, el +valor de @code{beatStructure} se debe fijar de manera que sea +compatible con el nuevo valor de @code{baseMoment}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 5/8 % No need to disable beamExceptions % as they are not defined for 5/8 time \set Timing.baseMoment = #(ly:make-moment 1/16) -\set Timing.beatStructure = #'(7 3) -\repeat unfold 10 { a16 } +\set Timing.beatStructure = 7,3 +\repeat unfold 10 { a'16 } @end lilypond -@code{baseMoment} es un @i{momento}, una unidad de duración musical. -Se crea una cantidad del tipo @i{momento} por medio de la función de -Scheme @code{ly:make-moment}. Para ver más información acerca de esta -función, consulte @ref{Gestión del tiempo}. +@code{baseMoment} es un @i{momento}, una unidad de duración +musical. Se crea una cantidad del tipo @i{momento} por medio de +la función de Scheme @code{ly:make-moment}. Para ver más +información acerca de esta función, consulte @ref{Gestión del +tiempo}. -De forma predeterminada @code{baseMoment} está fijado a una unidad más -que el denominador del compás. Todas las excepciones a este valor -predeterminado están en +De forma predeterminada @code{baseMoment} está fijado a una unidad +más que el denominador del compás. Todas las excepciones a este +valor predeterminado están en @file{scm/time-signature-settings.scm}. @subsubsubheading Barrado basado en @code{beamExceptions} -Las reglas de autobarrado especiales (distintas de terminar una barra -sobre un pulso) están definidas en la propiedad @code{beamExceptions}. - -@lilypond[quote,relative=2,verbatim] -\time 3/16 -\set Timing.beatStructure = #'(2 1) -\set Timing.beamExceptions = - #'( ;start of alist - (end . ;entry for end of beams - ( ;start of alist of end points - ((1 . 32) . (2 2 2)) ;rule for 1/32 beams -- end each 1/16 - ))) %close all entries -c16 c c | -\repeat unfold 6 { c32 } | -@end lilypond - -@code{beamExceptions} es una lista-A con una clave de rule-type y un -valor de beaming-rules. - -En este momento el único valor disponible de rule-type es @code{'end} -para la terminación de las barras. - -Beaming-rules es una lista-A de Scheme (o una lista de parejas) que -indica el tipo de barra y la agrupación que se aplica a las barras que -contienen notas con una duración más breve de ese tipo de barra. - -@example -#'((tipo-barra1 . agrupación1) - (tipo-barra2 . agrupación2) - (tipo-barra3 . agrupación3)) -@end example +Las reglas de autobarrado especiales (distintas de terminar una +barra sobre un pulso) están definidas en la propiedad +@code{beamExceptions}. -Tipo de barra es una dupla de Scheme que indica la duración de la -barra, p.ej. @code{(1 . 16)}. +El valor de @code{beamExceptions}, que es una estructura de datos +de Scheme bastante compleja, se genera fácilmente con la función +@code{\beamExceptions}. Esta función recibe uno o más patrones +rítmicos barrados manualmente y con un compás de duración (los +compases se deben separar por una barra de comprobación de +compás@tie{}@code{|} porque la función no tiene otra manera de +discernir la longitud del compás). He aquí un ejemplo sencillo: -Agrupación es una lista de Scheme que indica la agrupación que aplicar -a la barra. El valor de agrupación está en unidades del tipo de -barra. +@lilypond[quote,verbatim] +\relative c'' { + \time 3/16 + \set Timing.beatStructure = 2,1 + \set Timing.beamExceptions = + \beamExceptions { 32[ 32] 32[ 32] 32[ 32] } + c16 c c | + \repeat unfold 6 { c32 } | +} +@end lilypond -@warning{ Un valor de @code{beamExceptions} debe ser una lista de -excepciones @emph{completa}. Esto es, toda excepción que se tenga que -aplicar debe estar incluida en este ajuste. No es posible añadir, -eliminar o cambiar sólo una de las excepciones. Aunque esto puede -parecer engorroso, significa que no es necesario conocer los ajustes -de barrado actuales para poder especificar un patrón de barrado -nuevo.} +@warning{Un valor de @code{beamExceptions} debe ser una lista de +excepciones @emph{completa}. Esto es, toda excepción que se tenga +que aplicar debe estar incluida en este ajuste. No es posible +añadir, eliminar o cambiar sólo una de las excepciones. Aunque +esto puede parecer engorroso, significa que no es necesario +conocer los ajustes de barrado actuales para poder especificar un +patrón de barrado nuevo.} Cuando cambia el compás, se fijan los valores predeterminados de @code{Timing.baseMoment}, @code{Timing.beatStructure} y -@code{Timing.beamExceptions}. Un ajuste en el tipo de compás da como -resultado un reinicio de los ajustes de barrado automático para el -contexto @code{Timing} al comportamiento predeterminado. +@code{Timing.beamExceptions}. Un ajuste en el tipo de compás da +como resultado un reinicio de los ajustes de barrado automático +para el contexto @code{Timing} al comportamiento predeterminado. -@lilypond[quote,verbatim,relative=2] -\time 6/8 -\repeat unfold 6 { a8 } -% group (4 + 2) -\set Timing.beatStructure = #'(4 2) -\repeat unfold 6 { a8 } -% go back to default behavior -\time 6/8 -\repeat unfold 6 { a8 } +@lilypond[quote,verbatim] +\relative a' { + \time 6/8 + \repeat unfold 6 { a8 } + % group (4 + 2) + \set Timing.beatStructure = 4,2 + \repeat unfold 6 { a8 } + % go back to default behavior + \time 6/8 + \repeat unfold 6 { a8 } +} @end lilypond Los ajustes de barrado automático predeterminados para un tipo de @@ -2302,85 +2370,91 @@ Muchos ajustes de barrado automáticos para un tipo de compás contienen una entrada para @code{beamExceptions}. Por ejemplo, el compás de 4/4 trata de unir el compás en dos partes si solo hay corcheas. La regla @code{beamExceptions} puede sobreescribir el -ajuste @code{beatStructure} si no se reinicia @code{beamExceptions}. +ajuste @code{beatStructure} si no se reinicia +@code{beamExceptions}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 4/4 \set Timing.baseMoment = #(ly:make-moment 1/8) -\set Timing.beatStructure = #'(3 3 2) +\set Timing.beatStructure = 3,3,2 % This won't beam (3 3 2) because of beamExceptions -\repeat unfold 8 {c8} | +\repeat unfold 8 {c''8} | % This will beam (3 3 2) because we clear beamExceptions \set Timing.beamExceptions = #'() -\repeat unfold 8 {c8} +\repeat unfold 8 {c''8} @end lilypond -De forma similar, las corcheas en compás de 3/4 se unen mediante una -sola barra para todo el compás, de forma predeterminada. Para unir -las corcheas en 3/4 mediante una barra en cada parte, reinicie -@code{beamExceptions}. +De forma similar, las corcheas en compás de 3/4 se unen mediante +una sola barra para todo el compás, de forma predeterminada. Para +unir las corcheas en 3/4 mediante una barra en cada parte, +reinicie @code{beamExceptions}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 3/4 % by default we beam in (6) due to beamExceptions -\repeat unfold 6 {a8} | +\repeat unfold 6 {a'8} | % This will beam (1 1 1) due to default baseMoment and beatStructure \set Timing.beamExceptions = #'() -\repeat unfold 6 {a8} +\repeat unfold 6 {a'8} @end lilypond En la música tipografiada de los períodos clásico y romántico, con -frecuencia las barras comienzan a mitad de un compás en 3/4, pero la -práctica moderna es evitar la falsa impresión de 6/8 (véase Gould, -pág. 153). Se producen situaciones similares en el compás de 3/8. -Este comportamiento viene controlado mediante la propiedad de contexto -@code{beamHalfMeasure}, que tiene efecto solamente sobre indicaciones -de compás que tienen la cifra 3 en el numerador: - -@lilypond[quote,verbatim,relative=2] -\time 3/4 -r4. a8 a a | -\set Timing.beamHalfMeasure = ##f -r4. a8 a a | +frecuencia las barras comienzan a mitad de un compás en 3/4, pero +la práctica moderna es evitar la falsa impresión de 6/8 (véase +Gould, pág. 153). Se producen situaciones similares en el compás +de 3/8. Este comportamiento viene controlado mediante la +propiedad de contexto @code{beamHalfMeasure}, que tiene efecto +solamente sobre indicaciones de compás que tienen la cifra 3 en el +numerador: + +@lilypond[quote,verbatim] +\relative a' { + \time 3/4 + r4. a8 a a | + \set Timing.beamHalfMeasure = ##f + r4. a8 a a | +} @end lilypond @subsubsubheading Cómo funciona el barrado automático -Cuando se habilita el barrado automático, la colocación de las barras -de corchea automáticas viene determinada por las propiedades de -contexto @code{baseMoment}, @code{beatStructure} y +Cuando se habilita el barrado automático, la colocación de las +barras de corchea automáticas viene determinada por las +propiedades de contexto @code{baseMoment}, @code{beatStructure} y @code{beamExceptions}. -Son de aplicación las siguientes reglas, en orden de prioridad, cuando -se determina el aspecto de las barras: +Son de aplicación las siguientes reglas, en orden de prioridad, +cuando se determina el aspecto de las barras: @itemize @item -Si está especificada una barra manual con @code{[@dots{}]}, fijar la barra -tal y como se ha especificado; en caso contrario, +Si está especificada una barra manual con @code{[@dots{}]}, fijar +la barra tal y como se ha especificado; en caso contrario, @item -si está definida en @code{beamExceptions} una regla de barrado para -este tipo de barra, utilizarla para determinar los lugares válidos en -que pueden terminar las barras; en caso contrario, +si está definida en @code{beamExceptions} una regla de barrado +para este tipo de barra, utilizarla para determinar los lugares +válidos en que pueden terminar las barras; en caso contrario, @item -si está definida en @code{beamExceptions} una regla de final de barra -para un tipo de barra más largo, utilizarla para determinar los -lugares válidos en que pueden terminar las barras; en caso contrario, +si está definida en @code{beamExceptions} una regla de final de +barra para un tipo de barra más largo, utilizarla para determinar +los lugares válidos en que pueden terminar las barras; en caso +contrario, @item -usar los valores de @code{baseMoment} y de @code{beatStructure} para -determinar los finales de los pulsos dentro del compás, y terminar las -barras al final de los pulsos. +usar los valores de @code{baseMoment} y de @code{beatStructure} +para determinar los finales de los pulsos dentro del compás, y +terminar las barras al final de los pulsos. @end itemize -En las reglas anteriores, el tipo de barra @emph{beam-type} es -la duración de la nota más breve dentro del grupo unido por una barra. +En las reglas anteriores, el tipo de barra @emph{beam-type} es la +duración de la nota más breve dentro del grupo unido por una +barra. -Las reglas de barrado predefinidas están -en el archivo @file{scm/time-signature-settings.scm}. +Las reglas de barrado predefinidas están en el archivo +@file{scm/time-signature-settings.scm}. @snippets @cindex barras, subdivisión @@ -2424,56 +2498,58 @@ Referencia de funcionamiento interno: @rinternals{beam-interface}. @knownissues -Si una partitura termina mientras una barra de corchea automática no -ha terminado y aún acepta notas, esta última barra no se imprime en -absoluto. Lo mismo sirve para las voces polifónicas introducidas con -@code{<< @dots{} \\ @dots{} >>}. Si una voz polifónica termina -mientras una barra de corchea automática aún admite notas, no se -imprime. El rodeo para estos problemas es aplicar el barrado manual a -la última barra de la voz o partitura. - -De forma predeterminada, el traductor @code{Timing} recibe el nombre -del contexto @code{Score} como alias. Esto significa que el -establecimiento del compás en ua pauta afectará al barrado de las -otras pautas también. Así, un ajuste en el compás en un pentagrama -tardío reiniciará el barrado personalizado que se había ajustado en un -pentagrama más temprano. Una forma de evitar este problema es ajustar -la indicación de compás en un pentagrama solamente. - -@lilypond[quote,verbatim,relative=2] +Si una partitura termina mientras una barra de corchea automática +no ha terminado y aún acepta notas, esta última barra no se +imprime en absoluto. Lo mismo sirve para las voces polifónicas +introducidas con @code{<< @dots{} \\ @dots{} >>}. Si una voz +polifónica termina mientras una barra de corchea automática aún +admite notas, no se imprime. El rodeo para estos problemas es +aplicar el barrado manual a la última barra de la voz o partitura. + +De forma predeterminada, el traductor @code{Timing} recibe el +nombre del contexto @code{Score} como alias. Esto significa que +el establecimiento del compás en ua pauta afectará al barrado de +las otras pautas también. Así, un ajuste en el compás en un +pentagrama tardío reiniciará el barrado personalizado que se había +ajustado en un pentagrama más temprano. Una forma de evitar este +problema es ajustar la indicación de compás en un pentagrama +solamente. + +@lilypond[quote,verbatim] << \new Staff { \time 3/4 \set Timing.baseMoment = #(ly:make-moment 1/8) - \set Timing.beatStructure = #'(1 5) - \repeat unfold 6 { a8 } + \set Timing.beatStructure = 1,5 + \set Timing.beamExceptions = #'() + \repeat unfold 6 { a'8 } } \new Staff { - \repeat unfold 6 { a8 } + \repeat unfold 6 { a'8 } } >> @end lilypond -Los ajustes de barrado predeterminados para dicho compás también se -pueden cambiar, de forma que siempre se utilice siempre el barrado -deseado. La manera de efectuar cambios en los ajustes de barrado -automático para una indicación de compás se describe en +Los ajustes de barrado predeterminados para dicho compás también +se pueden cambiar, de forma que siempre se utilice siempre el +barrado deseado. La manera de efectuar cambios en los ajustes de +barrado automático para una indicación de compás se describe en @ref{Indicación de compás}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << \new Staff { \overrideTimeSignatureSettings 3/4 % timeSignatureFraction 1/8 % baseMomentFraction - #'(1 5) % beatStructure + 1,5 % beatStructure #'() % beamExceptions \time 3/4 - \repeat unfold 6 { a8 } + \repeat unfold 6 { a'8 } } \new Staff { \time 3/4 - \repeat unfold 6 { a8 } + \repeat unfold 6 { a'8 } } >> @end lilypond @@ -2490,70 +2566,76 @@ automático para una indicación de compás se describe en @funindex [ En ciertos casos puede ser preciso sobreescribir el algoritmo de -barrado automático. Por ejemplo, el barrador automático no escribe -barras por encima de los silencios o las líneas divisorias, y en las -partituras corales el barrado se ajusta con frecuencia para que siga -la medida de la letra en vez de la de las notas. Tales barras se -especifican manualmente marcando los puntos de comienzo y final con -@code{[} y @code{]} +barrado automático. Por ejemplo, el barrador automático no +escribe barras por encima de los silencios o las líneas +divisorias, y en las partituras corales el barrado se ajusta con +frecuencia para que siga la medida de la letra en vez de la de las +notas. Tales barras se especifican manualmente marcando los +puntos de comienzo y final con @code{[} y @code{]} -@lilypond[quote,relative=1,verbatim] -r4 r8[ g' a r] r g[ | a] r +@lilypond[quote,verbatim] +\relative { r4 r8[ g' a r] r g[ | a] r } @end lilypond @cindex barras manuales, abreviatura de dirección @cindex barras manuales, notas de adorno -La dirección de las barras se puede establecer manualmente utilizando -indicadores de dirección: +La dirección de las barras se puede establecer manualmente +utilizando indicadores de dirección: -@lilypond[quote,relative=2,verbatim] -c8^[ d e] c,_[ d e f g] +@lilypond[quote,verbatim] +\relative { c''8^[ d e] c,_[ d e f g] } @end lilypond @funindex \noBeam -@funindex noBeam -Se pueden marcar notas individuales con @code{\noBeam} para evitar que -resulten unidas por una barra: +Se pueden marcar notas individuales con @code{\noBeam} para evitar +que resulten unidas por una barra: -@lilypond[quote,verbatim,relative=2] -\time 2/4 -c8 c\noBeam c c +@lilypond[quote,verbatim] +\relative { + \time 2/4 + c''8 c\noBeam c c +} @end lilypond -Se pueden producir al mismo tiempo barras de notas de adorno y barras -normales. Las notas de adorno sin barra no se colocan dentro de las -barras de notas normales. +Se pueden producir al mismo tiempo barras de notas de adorno y +barras normales. Las notas de adorno sin barra no se colocan +dentro de las barras de notas normales. -@lilypond[quote,verbatim,relative=2] -c4 d8[ -\grace { e32 d c d } -e8] e[ e -\grace { f16 } -e8 e] +@lilypond[quote,verbatim] +\relative { + c''4 d8[ + \grace { e32 d c d } + e8] e[ e + \grace { f16 } + e8 e] +} @end lilypond @funindex stemLeftBeamCount @funindex stemRightBeamCount -Se puede conseguir un control incluso más estricto sobre las barras -estableciendo las propiedades @code{stemLeftBeamCount} y +Se puede conseguir un control incluso más estricto sobre las +barras estableciendo las propiedades @code{stemLeftBeamCount} y @code{stemRightBeamCount}. Especifican el número de barras que se dibujarán en los lados izquierdo y derecho, respectivamente, de la -nota siguiente. Si cualquiera de estas dos propiedades está ajustada -a un valor, dicho valor se usará una sola vez, y luego se borrará. En -este ejemplo, el último Fa se imprime con sólo una barra en el lado -izquierdo, es decir, la barra de corchea del grupo como un todo. +nota siguiente. Si cualquiera de estas dos propiedades está +ajustada a un valor, dicho valor se usará una sola vez, y luego se +borrará. En este ejemplo, el último Fa se imprime con sólo una +barra en el lado izquierdo, es decir, la barra de corchea del +grupo como un todo. -@lilypond[quote,relative=2,verbatim] -a8[ r16 f g a] -a8[ r16 -\set stemLeftBeamCount = #2 -\set stemRightBeamCount = #1 -f16 -\set stemLeftBeamCount = #1 -g16 a] +@lilypond[quote,verbatim] +\relative a' { + a8[ r16 f g a] + a8[ r16 + \set stemLeftBeamCount = #2 + \set stemRightBeamCount = #1 + f16 + \set stemLeftBeamCount = #1 + g16 a] +} @end lilypond @predefined @@ -2561,6 +2643,7 @@ g16 a] @endpredefined @snippets + @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] {flat-flags-and-beam-nibs.ly} @@ -2588,45 +2671,48 @@ Referencia de funcionamiento interno: @cindex progresivas, barras @funindex \featherDurations -@funindex featherDurations @funindex grow-direction -Las barras progresivas se usan para indicar que un pequeño grupo de -notas se debe tocar a una velocidad creciente (o decreciente), sin -cambiar el tempo general de la pieza. El ámbito de la barra progresiva -se debe indicar manualmente usando @code{[} y @code{]}, el efecto de -ángulo de la barra se inicia especificando una dirección en la -propiedad @code{grow-direction} del objeto @code{Beam}. - -Si queremos que la colocación de las notas y el sonido de la salida -MIDI refleje el @emph{ritardando} o @emph{accelerando} -indicado por la barra -progresiva, las notas se deben agrupar como una expresión musical -delimitada por llaves y precedida de una instrucción -@code{featheredDurations} que especifica la razón entre las duraciones -de la primera y la última notas dentro del grupo. +Las barras progresivas se usan para indicar que un pequeño grupo +de notas se debe tocar a una velocidad creciente (o decreciente), +sin cambiar el tempo general de la pieza. El ámbito de la barra +progresiva se debe indicar manualmente usando @code{[} y @code{]}, +el efecto de ángulo de la barra se inicia especificando una +dirección en la propiedad @code{grow-direction} del objeto +@code{Beam}. + +Si queremos que la colocación de las notas y el sonido de la +salida MIDI refleje el @emph{ritardando} o @emph{accelerando} +indicado por la barra progresiva, las notas se deben agrupar como +una expresión musical delimitada por llaves y precedida de una +instrucción @code{featheredDurations} que especifica la razón +entre las duraciones de la primera y la última notas dentro del +grupo. Los corchetes rectos muestran el ámbito de la barra y las llaves muestran qué notas han de modificar sus duraciones. Normalmente -delimitarían el mismo grupo de notas, pero no es un requisito: las dos -instrucciones son independientes. - -En el ejemplo siguiente las ocho semicorcheas ocupan exactamente el -mismo tiempo que una blanca, pero la primera nota tiene la mitad de -duración que la última, con las notas intermedias alargándose -gradualmente. Las cuatro primeras fusas se aceleran gradualmente, -mientras que las últimas cuatro fusas están a un tempo constante. - -@lilypond[relative=1,verbatim,quote] -\override Beam.grow-direction = #LEFT -\featherDurations #(ly:make-moment 2/1) -{ c16[ c c c c c c c] } -\override Beam.grow-direction = #RIGHT -\featherDurations #(ly:make-moment 2/3) -{ c32[ d e f] } -% revert to non-feathered beams -\override Beam.grow-direction = #'() -{ g32[ a b c] } +delimitarían el mismo grupo de notas, pero no es un requisito: las +dos instrucciones son independientes. + +En el ejemplo siguiente las ocho semicorcheas ocupan exactamente +el mismo tiempo que una blanca, pero la primera nota tiene la +mitad de duración que la última, con las notas intermedias +alargándose gradualmente. Las cuatro primeras fusas se aceleran +gradualmente, mientras que las últimas cuatro fusas están a un +tempo constante. + +@lilypond[verbatim,quote] +\relative c' { + \override Beam.grow-direction = #LEFT + \featherDurations #(ly:make-moment 2/1) + { c16[ c c c c c c c] } + \override Beam.grow-direction = #RIGHT + \featherDurations #(ly:make-moment 2/3) + { c32[ d e f] } + % revert to non-feathered beams + \override Beam.grow-direction = #'() + { g32[ a b c] } +} @end lilypond @noindent @@ -2642,9 +2728,9 @@ Fragmentos de código: @rlsr{Rhythms}. @knownissues -La instrucción @code{\featherDurations} sólo funciona con fragmentos -musicales muy breves, y cuando los números de la fracción son -pequeños. +La instrucción @code{\featherDurations} sólo funciona con +fragmentos musicales muy breves, y cuando los números de la +fracción son pequeños. @node Compases @@ -2672,53 +2758,53 @@ pequeños. @cindex repetición, barras de @funindex \bar -@funindex bar -Las líneas divisorias delimitan a los compases pero también se pueden -usar para indicar las repeticiones. Normalmente, las líneas -divisorias normales se insertan de manera automática en la salida -impresa en lugares que están basados en el compás actual. +Las líneas divisorias delimitan a los compases pero también se +pueden usar para indicar las repeticiones. Normalmente, las +líneas divisorias normales se insertan de manera automática en la +salida impresa en lugares que están basados en el compás actual. -Las barras de compás sencillas insertadas automáticamente se pueden -cambiar por otros tipos con la instrucción @code{\bar}. Por ejemplo, -se suele poner una doble barra de cierre al final de la pieza: +Las barras de compás sencillas insertadas automáticamente se +pueden cambiar por otros tipos con la instrucción @code{\bar}. +Por ejemplo, se suele poner una doble barra de cierre al final de +la pieza: -@lilypond[quote,relative=1,verbatim] -e4 d c2 \bar "|." +@lilypond[quote,verbatim] +\relative { e'4 d c2 \bar "|." } @end lilypond -No deja de ser válida la última nota de un compás si no termina sobre -la línea divisoria automática: se supone que la nota se prolonga sobre -el compás siguiente. Pero una secuencia larga de dichos compases -prolongados puede hacer que la música aparezca comprimida o incluso -que se salga de la página. Esto es a causa de que los saltos de línea -automáticos solamente se producen al final de compases completos, es -decir, cuando todas las notas han finalizado antes de que el compás -termine. +No deja de ser válida la última nota de un compás si no termina +sobre la línea divisoria automática: se supone que la nota se +prolonga sobre el compás siguiente. Pero una secuencia larga de +dichos compases prolongados puede hacer que la música aparezca +comprimida o incluso que se salga de la página. Esto es a causa +de que los saltos de línea automáticos solamente se producen al +final de compases completos, es decir, cuando todas las notas han +finalizado antes de que el compás termine. -@warning{Una duración incorrecta puede hacer que se trate de evitar la -producción de saltos de línea, dando como resultado una línea de -música con una compresión exagerada o música que se sale de la -página.} +@warning{Una duración incorrecta puede hacer que se trate de +evitar la producción de saltos de línea, dando como resultado una +línea de música con una compresión exagerada o música que se sale +de la página.} @cindex línea, saltos @cindex líneas divisorias invisibles @cindex compás, barras invisibles de También se permiten saltos de línea en las barras insertadas -manualmente incluso dentro de compases incompletos. Para permitir un -salto de línea donde no hay ninguna línea divisoria visible, utilice -lo siguiente: +manualmente incluso dentro de compases incompletos. Para permitir +un salto de línea donde no hay ninguna línea divisoria visible, +utilice lo siguiente: @example \bar "" @end example @noindent -De esta manera se insertará una barra invisible de compás y se hará -posible el salto de línea en este punto, sin forzarlo. No se -incrementa el contador de los números de compás. Para forzar un salto -de línea, consulte @ref{Saltos de línea}. +De esta manera se insertará una barra invisible de compás y se +hará posible el salto de línea en este punto, sin forzarlo. No se +incrementa el contador de los números de compás. Para forzar un +salto de línea, consulte @ref{Saltos de línea}. @cindex manuales, líneas divisorias @cindex manuales, barras de compás @@ -2726,148 +2812,165 @@ de línea, consulte @ref{Saltos de línea}. @cindex líneas divisorias manuales Esta y otras líneas divisorias especiales se pueden insertar -manualmente en cualquier punto. Cuando coinciden con el final de un -compás, sustituyen a la línea divisoria simple que se habría insertado -automáticamente en dicho lugar. Cuando no coinciden con el final de -un compás, se inserta la línea especificada en ese punto en la salida -impresa. - -Observe que las líneas divisorias manuales son puramente visuales. No -afectan a ninguna de las propiedades que una barra normal afectaría, -como a los números de compás, alteraciones, saltos de línea, etc. No -afectan tampoco al cálculo y colocación de las líneas divisorias -subsiguientes. Cuando una divisoria se coloca manualmente donde ya -existe una divisoria normal, los efectos de la línea original no se -alteran. +manualmente en cualquier punto. Cuando coinciden con el final de +un compás, sustituyen a la línea divisoria simple que se habría +insertado automáticamente en dicho lugar. Cuando no coinciden con +el final de un compás, se inserta la línea especificada en ese +punto en la salida impresa. + +Observe que las líneas divisorias manuales son puramente visuales. +No afectan a ninguna de las propiedades que una barra normal +afectaría, como a los números de compás, alteraciones, saltos de +línea, etc. No afectan tampoco al cálculo y colocación de las +líneas divisorias subsiguientes. Cuando una divisoria se coloca +manualmente donde ya existe una divisoria normal, los efectos de +la línea original no se alteran. Están disponibles para su inserción manual dos tipos de líneas divisorias simples y cinco tipos de doble barra: -@lilypond[quote,relative=1,verbatim] -f1 \bar "|" -f1 \bar "." -g1 \bar "||" -a1 \bar ".|" -b1 \bar ".." -c1 \bar "|.|" -d1 \bar "|." -e1 +@lilypond[quote,verbatim] +\relative { + f'1 \bar "|" + f1 \bar "." + g1 \bar "||" + a1 \bar ".|" + b1 \bar ".." + c1 \bar "|.|" + d1 \bar "|." + e1 +} @end lilypond @noindent así como la barra de puntos y la discontinua: -@lilypond[quote,relative=1,verbatim] -f1 \bar ";" -g1 \bar "!" -a1 +@lilypond[quote,verbatim] +\relative { + f'1 \bar ";" + g1 \bar "!" + a1 +} @end lilypond @noindent y nueve tipos de barra de repetición: -@lilypond[quote,relative=1,verbatim] -f1 \bar ".|:" -g1 \bar ":..:" -a1 \bar ":|.|:" -b1 \bar ":|.:" -c1 \bar ":.|.:" -d1 \bar "[|:" -e1 \bar ":|][|:" -f1 \bar ":|]" -g1 \bar ":|." -a1 +@lilypond[quote,verbatim] +\relative { + f'1 \bar ".|:" + g1 \bar ":..:" + a1 \bar ":|.|:" + b1 \bar ":|.:" + c1 \bar ":.|.:" + d1 \bar "[|:" + e1 \bar ":|][|:" + f1 \bar ":|]" + g1 \bar ":|." + a1 +} @end lilypond Además se puede imprimir una línea divisoria como una marca corta: -@lilypond[quote,relative=1,verbatim] -f1 \bar "'" g1 + +@lilypond[quote,fragment,verbatim] +f'1 \bar "'" g'1 @end lilypond -Sin embargo, dado que las mencionadas marcas se utilizan usualmente en -el canto gregoriano, es preferible en este caso utilizar -@code{\divisioMinima}, que se describe en la sección @ref{Divisiones} -dentro de Canto gregoriano. + +Sin embargo, dado que las mencionadas marcas se utilizan +usualmente en el canto gregoriano, es preferible en este caso +utilizar @code{\divisioMinima}, que se describe en la sección +@ref{Divisiones} dentro de Canto gregoriano. LilyPond contempla la notación del canto kievano y ofrece una línea divisoria especial kievana: -@lilypond[quote,relative=1,verbatim] -f1 \bar "k" + +@lilypond[quote,fragment,verbatim] +f'1 \bar "k" @end lilypond + Pueden verse más detalles de esta notación explicados en @ref{Tipografiado del canto kievano en notación cuadrada}. @cindex segno -Para los símbolos de segno en línea, existen tres tipos -de barras de compás que se diferencian en su comportamiento -en los saltos de línea: - -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar "S" -c4 c c c \break -\bar "S" -c4 c c c -\bar "S-|" -c4 c c c \break -\bar "S-|" -c4 c c c -\bar "S-S" -c4 c c c \break -\bar "S-S" -c1 +Para los símbolos de segno en línea, existen tres tipos de barras +de compás que se diferencian en su comportamiento en los saltos de +línea: + +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar "S" + c4 c c c \break + \bar "S" + c4 c c c + \bar "S-|" + c4 c c c \break + \bar "S-|" + c4 c c c + \bar "S-S" + c4 c c c \break + \bar "S-S" + c1 +} @end lilypond @cindex repeticiones -Aunque se pueden insertar manualmente barras de compás con significado -de repeticiones, no se reconocen como repeticiones por parte de -LilyPond. Las secciones repetidas se introducen mejor utilizando las -diversas instrucciones de repetición (véase @ref{Repeticiones}), que -imprimen automáticamente las barras correspondientes. +Aunque se pueden insertar manualmente barras de compás con +significado de repeticiones, no se reconocen como repeticiones por +parte de LilyPond. Las secciones repetidas se introducen mejor +utilizando las diversas instrucciones de repetición (véase +@ref{Repeticiones}), que imprimen automáticamente las barras +correspondientes. -Además se puede especificar @code{".|:-||"}, que equivale a @code{".|:"} -excepto en los saltos de línea, en que produce una doble barra al -final de la línea y una repetición izquierda (de comienzo) al -principio de la línea siguiente. +Además se puede especificar @code{".|:-||"}, que equivale a +@code{".|:"} excepto en los saltos de línea, en que produce una +doble barra al final de la línea y una repetición izquierda (de +comienzo) al principio de la línea siguiente. -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar ".|:-||" -c4 c c c \break -\bar ".|:-||" -c4 c c c +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar ".|:-||" + c4 c c c \break + \bar ".|:-||" + c4 c c c +} @end lilypond Para combinaciones de repeticiones con el símbolo de segno, existen seis variantes diferentes: -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar ":|.S" -c4 c c c \break -\bar ":|.S" -c4 c c c -\bar ":|.S-S" -c4 c c c \break -\bar ":|.S-S" -c4 c c c -\bar "S.|:-S" -c4 c c c \break -\bar "S.|:-S" -c4 c c c -\bar "S.|:" -c4 c c c \break -\bar "S.|:" -c4 c c c -\bar ":|.S.|:" -c4 c c c \break -\bar ":|.S.|:" -c4 c c c -\bar ":|.S.|:-S" -c4 c c c \break -\bar ":|.S.|:-S" -c1 +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar ":|.S" + c4 c c c \break + \bar ":|.S" + c4 c c c + \bar ":|.S-S" + c4 c c c \break + \bar ":|.S-S" + c4 c c c + \bar "S.|:-S" + c4 c c c \break + \bar "S.|:-S" + c4 c c c + \bar "S.|:" + c4 c c c \break + \bar "S.|:" + c4 c c c + \bar ":|.S.|:" + c4 c c c \break + \bar ":|.S.|:" + c4 c c c + \bar ":|.S.|:-S" + c4 c c c \break + \bar ":|.S.|:-S" + c1 +} @end lilypond Además, existe una instrucción @code{\inStaffSegno} que crea una @@ -2876,7 +2979,6 @@ una línea de repetición adecuada si se utiliza con una instrucción @code{\repeat volta}, véase @ref{Repeticiones normales}. @funindex \defineBarLine -@funindex defineBarLine @cindex compás, definir líneas de @cindex definir líneas de compás @@ -2929,16 +3031,16 @@ apariencia pero distinto comportamiento en los saltos de línea y/o diferentes barras de extensión. La parque que sigue al signo @code{"-"} no se usa para construir la barra de compás. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] \defineBarLine "||-dashedSpan" #'("||" "" "!!") \new StaffGroup << - \new Staff { + \new Staff \relative c'' { c1 \bar "||" c1 \bar "||-dashedSpan" c1 } - \new Staff { + \new Staff \relative c'' { c1 c1 c1 @@ -2950,17 +3052,17 @@ Además, el carácter del espacio en blanco @code{" "} sirve como contenedor para definir barras de extensión correctamente alineadas a las barras principales: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] \defineBarLine ":|.-wrong" #'(":|." "" "|.") \defineBarLine ":|.-right" #'(":|." "" " |.") \new StaffGroup << - \new Staff { + \new Staff \relative c'' { c1 \bar ":|.-wrong" c1 \bar ":|.-right" c1 } - \new Staff { + \new Staff \relative c'' { c1 c1 c1 @@ -2973,22 +3075,23 @@ sencilla de definirlos. Para ver más información sobre cómo modificar o añadir barras de compás, consulte el archivo @file{scm/bar-line.scm}. -En las partituras con muchos pentagramas, una instrucción @code{\bar} -en uno de ellos se aplica automáticamente a todos los demás. Las -líneas resultantes se conectan entre los distintos pentagramas de un -@code{StaffGroup}, @code{PianoStaff} o @code{GrandStaff}. +En las partituras con muchos pentagramas, una instrucción +@code{\bar} en uno de ellos se aplica automáticamente a todos los +demás. Las líneas resultantes se conectan entre los distintos +pentagramas de un @code{StaffGroup}, @code{PianoStaff} o +@code{GrandStaff}. -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << \new StaffGroup << - \new Staff { - e4 d + \new Staff \relative { + e'4 d \bar "||" f4 e } - \new Staff { \clef bass c4 g e g } + \new Staff \relative { \clef bass c'4 g e g } >> - \new Staff { \clef bass c2 c2 } + \new Staff \relative { \clef bass c'2 c2 } >> @end lilypond @@ -2998,18 +3101,17 @@ líneas resultantes se conectan entre los distintos pentagramas de un @funindex whichBar @funindex defaultBarType @funindex \bar -@funindex bar @funindex bartype -La instrucción @samp{\bar @var{tipo de barra}} es una forma corta de -hacer @samp{\set Timing.whichBar = @var{tipo de barra}}. Cuando -@code{whichBar} se establece con el valor de una cadena, se crea una -línea divisoria de ese tipo. +La instrucción @samp{\bar @var{tipo de barra}} es una forma corta +de hacer @samp{\set Timing.whichBar = @var{tipo de barra}}. +Cuando @code{whichBar} se establece con el valor de una cadena, se +crea una línea divisoria de ese tipo. -El tipo de barra predeterminado que se usa para las líneas divisorias -insertadas automáticamente es @code{"|"}. Se puede cambiar en -cualquier momento con -@samp{\set Timing.defaultBarType = @var{tipo de barra}}. +El tipo de barra predeterminado que se usa para las líneas +divisorias insertadas automáticamente es @code{"|"}. Se puede +cambiar en cualquier momento con @samp{\set Timing.defaultBarType += @var{tipo de barra}}. @seealso Referencia de la notación: @@ -3039,16 +3141,18 @@ Referencia de funcionamiento interno: @funindex currentBarNumber Por defecto, los números de compás se imprimen al principio de la -línea, excepto la primera. El número propiamente dicho se almacena en -la propiedad @code{currentBarNumber}, que normalmente se actualiza -automáticamente para cada compás. También se puede establecer -manualmente: +línea, excepto la primera. El número propiamente dicho se +almacena en la propiedad @code{currentBarNumber}, que normalmente +se actualiza automáticamente para cada compás. También se puede +establecer manualmente: -@lilypond[verbatim,quote,relative=1] -c1 c c c -\break -\set Score.currentBarNumber = #50 -c1 c c c +@lilypond[verbatim,quote] +\relative c' { + c1 c c c + \break + \set Score.currentBarNumber = #50 + c1 c c c +} @end lilypond @cindex números de compás, espaciado regular @@ -3056,26 +3160,28 @@ c1 c c c @funindex barNumberVisibility @funindex BarNumber -Los números de compás se pueden tipografiar a intervalos regulares en -vez de al principio de cada línea. Para hacerlo se debe sobreescribir -el comportamiento predeterminado de forma que se puedan imprimir en -otros lugares. Esto viene controlado por la propiedad -@code{break-visibility} de @code{BarNumber}. Toma tres valores que se -pueden fijar al valor @code{#t} o @code{#f} para especificar si el -número de compás correspondiente es visible o no. El orden de los -tres valores es @code{visible al final de la línea}, @code{visible en -mitad de la línea}, @code{visible al principio de la línea}. En el -ejemplo siguiente se imprimen los números de compás en todos los -sitios posibles: - -@lilypond[verbatim,quote,relative=1] -\override Score.BarNumber.break-visibility = #'#(#t #t #t) -\set Score.currentBarNumber = #11 -% Permit first bar number to be printed -\bar "" -c1 | c | c | c -\break -c1 | c | c | c +Los números de compás se pueden tipografiar a intervalos regulares +en vez de al principio de cada línea. Para hacerlo se debe +sobreescribir el comportamiento predeterminado de forma que se +puedan imprimir en otros lugares. Esto viene controlado por la +propiedad @code{break-visibility} de @code{BarNumber}. Toma tres +valores que se pueden fijar al valor @code{#t} o @code{#f} para +especificar si el número de compás correspondiente es visible o +no. El orden de los tres valores es @code{visible al final de la +línea}, @code{visible en mitad de la línea}, @code{visible al +principio de la línea}. En el ejemplo siguiente se imprimen los +números de compás en todos los sitios posibles: + +@lilypond[verbatim,quote] +\relative c' { + \override Score.BarNumber.break-visibility = ##(#t #t #t) + \set Score.currentBarNumber = #11 + % Permit first bar number to be printed + \bar "" + c1 | c | c | c | + \break + c1 | c | c | c | +} @end lilypond @snippets @@ -3085,6 +3191,9 @@ c1 | c | c | c @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] {printing-bar-numbers-at-regular-intervals.ly} +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{printing-bar-numbers-with-changing-regular-intervals.ly} + @cindex compás, número de, formato @cindex número de compases, formato de @@ -3119,10 +3228,10 @@ Referencia de funcionamiento interno: @knownissues Los números de compás pueden colisionar con el corchete @code{StaffGroup}, si hay uno en la parte de arriba. Para -solucionarlo, se puede usar la propiedad de relleno @code{padding} de -@code{BarNumber} para colocar el número correctamente. -Consulte @rinternals{StaffGroup} y @rinternals{BarNumber} -para ver más información. +solucionarlo, se puede usar la propiedad de relleno @code{padding} +de @code{BarNumber} para colocar el número correctamente. +Consulte @rinternals{StaffGroup} y @rinternals{BarNumber} para ver +más información. @node Comprobación de compás y de número de compás @@ -3138,49 +3247,61 @@ para ver más información. @funindex | Las comprobaciones de compás ayudan a detectar errores en las -duraciones. Una comprobación de compás se escribe usando el símbolo -de la barra vertical, @code{|}, en cualquier lugar donde se espera que -caiga una línea divisoria. Si se encuentran líneas de comprobación de -compás en otros lugares, se imprime una lista de advertencias en el -archivo log de registro, mostrando los números de línea y columna en -que han fallado las comprobaciones de compás. En el siguiente -ejemplo, la segunda comprobación de compás avisará de un error +duraciones. Una comprobación de compás se escribe usando el +símbolo de la barra vertical, @code{|}, en cualquier lugar donde +se espera que caiga una línea divisoria. Si se encuentran líneas +de comprobación de compás en otros lugares, se imprime una lista +de advertencias en el archivo log de registro, mostrando los +números de línea y columna en que han fallado las comprobaciones +de compás. En el siguiente ejemplo, la segunda comprobación de +compás avisará de un error. @example \time 3/4 c2 e4 | g2 | @end example -Las comprobaciones de compás también se pueden usar en la letra de las -canciones: +Una duración incorrecta produce una partitura completamente +desbaratada, especialmente si la partitura es polifónica, de +manera que la mejor forma de empezar a corregir la entrada es +buscar sistemáticamente la existencia de comprobaciones de compás +fallidas y duraciones incorrectas. + +Si se producen varias comprobaciones de compás seguidas por valor +de la misma duración musical, solo aparece el primer mensaje de +advertencia. Así se consigue que el mensaje esté concentrado en +la fuente del error de pulso. + +Las comprobaciones de compás también se pueden insertar dentro de +la letra de las canciones: @example \lyricmode @{ \time 2/4 - Bri -- lla, | bri -- lla, | + Twin -- kle | Twin -- kle | @} @end example -Las duraciones incorrectas a menudo desbaratan la partitura -completamente, sobre todo si la música es polifónica, por ello el -mejor sitio para empezar a corregir la entrada es hacer un barrido en -busca de comprobaciones de compás fallidas y duraciones incorrectas. +Observe que las comprobaciones de compás dentro de la letra de las +canciones se evalúan en el momento musical de la sílaba +@emph{siguiente} a la comprobación de compas que se procesa. Si +la letra está asociada con las notas de una voz que tiene un +silencio al principio del compás, no se puede poner ninguna sílaba +al comienzo de ese compás y se imprimie un mensaje de advertencia +si se escribe una comprobación de compás dentro de la letra, en +esa posición. -Si varias comprobaciones de compás corresponden al mismo intervalo -musical, sólo se imprime el primer mensaje de advertencia. Esto -permite que la advertencia se centre en la fuente del error de cuenta -de tiempo. @funindex | @funindex "|" -También es posible redefinir la acción que se lleva a cabo cuando se -encuentra una barra vertical o símbolo de comprobación de compás, -@code{|}, en el código de entrada, de forma que haga algo distinto a -una comprobación de compás. Se hace asignando una expresión musical a -@code{"|"}, el símbolo de barra vertical. En el ejemplo siguiente se -establece @code{|} de forma que inserte una doble línea divisoria -cuando aparece en el código de entrada, en vez de comprobar el final -de un compás. +También es posible redefinir la acción que se lleva a cabo cuando +se encuentra una barra vertical o símbolo de comprobación de +compás, @code{|}, en el código de entrada, de forma que haga algo +distinto a una comprobación de compás. Se hace asignando una +expresión musical a @code{"|"}, el símbolo de barra vertical. En +el ejemplo siguiente se establece @code{|} de forma que inserte +una doble línea divisoria cuando aparece en el código de entrada, +en vez de comprobar el final de un compás. @lilypond[quote,verbatim] "|" = \bar "||" @@ -3193,12 +3314,11 @@ de un compás. @end lilypond @funindex \barNumberCheck -@funindex barNumberCheck -Al copiar piezas musicales grandes puede servir de ayuda comprobar que -el número de compás de LilyPond corresponde al original desde el que -está copiando. Esto se puede comprobar con @code{\barNumberCheck}, -por ejemplo: +Al copiar piezas musicales grandes puede servir de ayuda comprobar +que el número de compás de LilyPond corresponde al original desde +el que está copiando. Esto se puede comprobar con +@code{\barNumberCheck}, por ejemplo: @verbatim \barNumberCheck #123 @@ -3221,37 +3341,41 @@ Fragmentos de código: @cindex letras de ensayo @funindex \mark -@funindex mark Para imprimir una letra de ensayo, utilice la orden @code{\mark}. -@lilypond[quote,verbatim,relative=2] -c1 \mark \default -c1 \mark \default -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + c1 \mark \default + c1 \mark \default + c1 \mark \default + c1 \mark \default +} @end lilypond @noindent -La letra de ensayo se incrementa automáticamente si usa @code{\mark -\default}, pero también puede utilizar un número entero como argumento -para establecer la indicación manualmente. El valor que se utilizará -se almacena dentro de la propiedad @code{rehearsalMark}. +La letra de ensayo se incrementa automáticamente si usa +@code{\mark \default}, pero también puede utilizar un número +entero como argumento para establecer la indicación manualmente. +El valor que se utilizará se almacena dentro de la propiedad +@code{rehearsalMark}. -@lilypond[quote,verbatim,relative=2] -c1 \mark \default -c1 \mark \default -c1 \mark #8 -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + c1 \mark \default + c1 \mark \default + c1 \mark #8 + c1 \mark \default + c1 \mark \default +} @end lilypond @noindent La letra@tie{}@q{I} se salta de acuerdo con las tradiciones de grabado. Si quiere incluir la letra @q{I}, use una de las -instrucciones siguientes, según el estilo de marcas de -ensayo que desee (sólo letras, letras dentro de un rectángulo -o letras dentro de un círculo). +instrucciones siguientes, según el estilo de marcas de ensayo que +desee (sólo letras, letras dentro de un rectángulo o letras dentro +de un círculo). @example \set Score.markFormatter = #format-mark-alphabet @@ -3259,13 +3383,15 @@ o letras dentro de un círculo). \set Score.markFormatter = #format-mark-circle-alphabet @end example -@lilypond[quote,verbatim,relative=2] -\set Score.markFormatter = #format-mark-box-alphabet -c1 \mark \default -c1 \mark \default -c1 \mark #8 -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + \set Score.markFormatter = #format-mark-box-alphabet + c1 \mark \default + c1 \mark \default + c1 \mark #8 + c1 \mark \default + c1 \mark \default +} @end lilypond @cindex ensayo, letra de, formato @@ -3281,36 +3407,39 @@ c1 \mark \default @cindex personalizada, marca de ensayo @cindex manual, marca de ensayo -El estilo se define por medio de la propiedad @code{markFormatter}. -Es una función que toma como argumentos la marca en curso (un número -entero) y el contexto actual. Debe devolver un objeto de marcado. En -el ejemplo siguiente, se establece @code{markFormatter} con el valor -de un procedimiento enlatado. Después de algunos compases, se -establece con el valor de una función que produce un número encerrado -en una caja. - -@lilypond[quote,verbatim,relative=2] -\set Score.markFormatter = #format-mark-numbers -c1 \mark \default -c1 \mark \default -\set Score.markFormatter = #format-mark-box-numbers -c1 \mark \default -\set Score.markFormatter = #format-mark-circle-numbers -c1 \mark \default -\set Score.markFormatter = #format-mark-circle-letters -c1 +El estilo se define por medio de la propiedad +@code{markFormatter}. Es una función que toma como argumentos la +marca en curso (un número entero) y el contexto actual. Debe +devolver un objeto de marcado. En el ejemplo siguiente, se +establece @code{markFormatter} con el valor de un procedimiento +enlatado. Después de algunos compases, se establece con el valor +de una función que produce un número encerrado en una caja. + +@lilypond[quote,verbatim] +\relative c'' { + \set Score.markFormatter = #format-mark-numbers + c1 \mark \default + c1 \mark \default + \set Score.markFormatter = #format-mark-box-numbers + c1 \mark \default + \set Score.markFormatter = #format-mark-circle-numbers + c1 \mark \default + \set Score.markFormatter = #format-mark-circle-letters + c1 +} @end lilypond El archivo @file{scm/translation-functions.scm} contiene las -definiciones de @code{format-mark-numbers} (el formato por omisión), -@code{format-mark-box-numbers}, @code{format-mark-letters} y -@code{format-mark-box-letters}. Se pueden usar éstos como inspiración -para otras funciones de formateo. +definiciones de @code{format-mark-numbers} (el formato por +omisión), @code{format-mark-box-numbers}, +@code{format-mark-letters} y @code{format-mark-box-letters}. Se +pueden usar éstos como inspiración para otras funciones de +formateo. Podemos utilizar @code{format-mark-barnumbers}, @code{format-mark-box-barnumbers} y -@code{format-mark-circle-barnumbers} para obtener números de compás en -lugar de números o letras secuenciales. +@code{format-mark-circle-barnumbers} para obtener números de +compás en lugar de números o letras secuenciales. Se pueden especificar otros estilos de letra de ensayo de forma manual: @@ -3320,8 +3449,8 @@ manual: @end example @noindent -Observe que @code{Score.markFormatter} no afecta a las marcas que se -especifican de esta forma. Sin embargo, es posible aplicar un +Observe que @code{Score.markFormatter} no afecta a las marcas que +se especifican de esta forma. Sin embargo, es posible aplicar un elemento @code{\markup} a la cadena. @example @@ -3336,21 +3465,22 @@ elemento @code{\markup} a la cadena. @cindex glifos musicales @funindex \musicglyph -@funindex musicglyph -Los glifos musicales (como el segno) se pueden imprimir dentro de un -elemento @code{\mark} +Los glifos musicales (como el segno) se pueden imprimir dentro de +un elemento @code{\mark} -@lilypond[quote,verbatim,relative=1] -c1 \mark \markup { \musicglyph #"scripts.segno" } -c1 \mark \markup { \musicglyph #"scripts.coda" } -c1 \mark \markup { \musicglyph #"scripts.ufermata" } -c1 +@lilypond[quote,verbatim] +\relative c' { + c1 \mark \markup { \musicglyph #"scripts.segno" } + c1 \mark \markup { \musicglyph #"scripts.coda" } + c1 \mark \markup { \musicglyph #"scripts.ufermata" } + c1 +} @end lilypond @noindent -Consulte @ref{La tipografía Feta} para ver una lista de los símbolos que se -pueden imprimir con @code{\musicglyph}. +Consulte @ref{La tipografía Feta} para ver una lista de los +símbolos que se pueden imprimir con @code{\musicglyph}. Para ver formas comunes de trucar la colocación de las letras de ensayo, consulte @ref{Formatear el texto}. Para un control más @@ -3359,8 +3489,8 @@ preciso, consulte @code{break-alignable-interface} en la sección El archivo @file{scm/translation-functions.scm} contiene las definiciones de @code{format-mark-numbers} y de -@code{format-mark-letters}. Se pueden utilizar como inspiración para -escribir otras funciones de formateo. +@code{format-mark-letters}. Se pueden utilizar como inspiración +para escribir otras funciones de formateo. @seealso Referencia de la notación: @@ -3404,89 +3534,93 @@ Referencia de funcionamiento interno: @funindex \acciaccatura @funindex \appoggiatura -Los mordentes y notas de adorno son ornamentos musicales, -impresos en un tipo más pequeño y no ocupan ningún -tiempo lógico adicional en el compás. +Los mordentes y notas de adorno son ornamentos musicales, impresos +en un tipo más pequeño y no ocupan ningún tiempo lógico adicional +en el compás. -@lilypond[quote,relative=2,verbatim] -c4 \grace b16 a4( -\grace { b16 c16 } a2) +@lilypond[quote,verbatim] +\relative { + c''4 \grace b16 a4( + \grace { b16 c16 } a2) +} @end lilypond Hay otros tres tipos posibles de notas de adorno; la @emph{acciaccatura} o mordente de una nota (una nota de adorno sin -medida que se indica mediante una nota ligada y con el -corchete tachado) y la @emph{appoggiatura}, que toma una fracción fija -de la nota principal a la que se adjunta, y que se imprime sin +medida que se indica mediante una nota ligada y con el corchete +tachado) y la @emph{appoggiatura}, que toma una fracción fija de +la nota principal a la que se adjunta, y que se imprime sin tachar. Es posible escribir una nota de adorno con la plica -tachada, como la @emph{acciaccatura} pero sin la ligadura, como para -colocarla entre notas que están ligadas entre sí, utilizando la función -@code{\slashedGrace}. +tachada, como la @emph{acciaccatura} pero sin la ligadura, como +para colocarla entre notas que están ligadas entre sí, utilizando +la función @code{\slashedGrace}. -@lilypond[quote,relative=2,verbatim] -\acciaccatura d8 c4 -\appoggiatura e8 d4 -\acciaccatura { g16 f } e2 -\slashedGrace a,8 g4 -\slashedGrace b16 a4( -\slashedGrace b8 a2) +@lilypond[quote,verbatim] +\relative { + \acciaccatura d''8 c4 + \appoggiatura e8 d4 + \acciaccatura { g16 f } e2 + \slashedGrace a,8 g4 + \slashedGrace b16 a4( + \slashedGrace b8 a2) +} @end lilypond La colocación de notas de adorno se sincroniza entre los distintos -pentagramas. En el siguiente ejemplo, hay dos semicorcheas de adorno -por cada corchea de adorno: +pentagramas. En el siguiente ejemplo, hay dos semicorcheas de +adorno por cada corchea de adorno: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Staff { e2 \grace { c16 d e f } e2 } - \new Staff { c2 \grace { g8 b } c2 } + \new Staff \relative { e''2 \grace { c16 d e f } e2 } + \new Staff \relative { c''2 \grace { g8 b } c2 } >> @end lilypond @cindex adorno, seguimiento de notas de @funindex \afterGrace -@funindex afterGrace Si queremos terminar una nota con un adorno, usamos la instrucción @code{\afterGrace}. Toma dos argumentos: la nota principal, y las notas de adorno que siguen a la nota principal. -@lilypond[quote,verbatim,relative=2] -c1 \afterGrace d1 { c16[ d] } c1 +@lilypond[quote,verbatim] +\relative { c''1 \afterGrace d1 { c16[ d] } c1 } @end lilypond -Esto pone las notas de adorno después de un espacio que dura 3/4 de la -longitud de la nota principal. La fracción predeterminada de 3/4 se -puede cambiar estableciendo @code{afterGraceFraction}. El ejemplo -siguiente muestra el resultado de establecer el espacio en su valor -predeterminado, en 15/16, y por último en 1/2 de la nota principal. +Esto pone las notas de adorno después de un espacio que dura 3/4 +de la longitud de la nota principal. La fracción predeterminada +de 3/4 se puede cambiar estableciendo @code{afterGraceFraction}. +El ejemplo siguiente muestra el resultado de establecer el espacio +en su valor predeterminado, en 15/16, y por último en 1/2 de la +nota principal. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - \new Staff { - c1 \afterGrace d1 { c16[ d] } c1 + \new Staff \relative { + c''1 \afterGrace d1 { c16[ d] } c1 } - \new Staff { + \new Staff \relative { #(define afterGraceFraction (cons 15 16)) - c1 \afterGrace d1 { c16[ d] } c1 + c''1 \afterGrace d1 { c16[ d] } c1 } - \new Staff { + \new Staff \relative { #(define afterGraceFraction (cons 1 2)) - c1 \afterGrace d1 { c16[ d] } c1 + c''1 \afterGrace d1 { c16[ d] } c1 } >> @end lilypond El espacio entre la nota principal y la de adorno también se puede -especificar usando espaciadores. El ejemplo siguiente sitúa -la nota de adorno después de un espacio que dura 7/8 de la -nota principal. +especificar usando espaciadores. El ejemplo siguiente sitúa la +nota de adorno después de un espacio que dura 7/8 de la nota +principal. -@lilypond[quote,verbatim,relative=2] -\new Voice { +@lilypond[quote,verbatim] +\new Voice \relative { << - { d1^\trill_( } + { d''1^\trill_( } { s2 s4. \grace { c16 d } } >> c1) @@ -3497,19 +3631,20 @@ nota principal. @cindex notas de adorno, trucar @cindex notas de adorno, cambiar los ajustes de disposición -Una expresión musical @code{\grace} introduce ajustes de tipografía -especiales, por ejemplo para producir un tipo más pequeño y para fijar -las direcciones. Por ello, cuando se introducen trucos para la -presentación, deben ir dentro de la expresión de adorno. Las -sobreescrituras se deben también revertir dentro de la expresión de -adorno. Aquí, la dirección predeterminada de la plica de la nota de -adorno se sobreescribe y luego se revierte. +Una expresión musical @code{\grace} introduce ajustes de +tipografía especiales, por ejemplo para producir un tipo más +pequeño y para fijar las direcciones. Por ello, cuando se +introducen trucos para la presentación, deben ir dentro de la +expresión de adorno. Las sobreescrituras se deben también revertir +dentro de la expresión de adorno. Aquí, la dirección +predeterminada de la plica de la nota de adorno se sobreescribe y +luego se revierte. -@lilypond[quote,verbatim,relative=2] -\new Voice { +@lilypond[quote,verbatim] +\new Voice \relative { \acciaccatura { \stemDown - f16-> + f''16-> \stemNeutral } g4 e c2 @@ -3567,67 +3702,45 @@ tachar, y tiene exactamente la misma apariencia que una La sincronización de las notas de adorno también puede acarrear sorpresas. La notación de pentagramas, como armaduras, líneas -divisorias, etc., se sincronizan también. Ponga cuidado cuando mezcle -pentagramas con adornos y sin adornos, por ejemplo +divisorias, etc., se sincronizan también. Ponga cuidado cuando +mezcle pentagramas con adornos y sin adornos, por ejemplo -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Staff { e4 \bar ".|:" \grace c16 d2. } - \new Staff { c4 \bar ".|:" d2. } + \new Staff \relative { e''4 \bar ".|:" \grace c16 d2. } + \new Staff \relative { c''4 \bar ".|:" d2. } >> @end lilypond @noindent Esto se puede remediar insertando desplazamientos de adorno de las -duraciones correspondientes en los otros pentagramas. Para el ejemplo -anterior +duraciones correspondientes en los otros pentagramas. Para el +ejemplo anterior -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Staff { e4 \bar ".|:" \grace c16 d2. } - \new Staff { c4 \bar ".|:" \grace s16 d2. } + \new Staff \relative { e''4 \bar ".|:" \grace c16 d2. } + \new Staff \relative { c''4 \bar ".|:" \grace s16 d2. } >> @end lilypond -El uso de notas de adorno dentro de los contextos de voz tiende -a confundir la manera en que se tipografía la voz. -Esto se puede soslayar mediante la inserción de un silencio o nota -entre la instrucción de voz y la nota de adorno. +Es obligatorio usar la instrucción @code{\grace} para la parte de +los desplazamientos, incluso si la parte visual usa +@code{\acciaccatura} o @code{\appoggiatura} porque en caso +contrario se imprime una fea ligadura que conecta a la nota de +adorno invisible con la nota siguiente. -@lilypond[quote,verbatim] -accMusic = { - \acciaccatura { f8 } e8 r8 \acciaccatura { f8 } e8 r4 -} +Las secciones de adorno sólo se deben usar dentro de expresiones +de música secuenciales. No están contemplados el anidado ni la +yuxtaposición de secciones de adorno, y podría producir caídas u +otros errores. -\new Staff { - << - \new Voice { - \relative c'' { - r8 r8 \voiceOne \accMusic \oneVoice r8 | - r8 \voiceOne r8 \accMusic \oneVoice r8 | - } - } - \new Voice { - \relative c' { - s8 s8 \voiceTwo \accMusic \oneVoice s8 | - s8 \voiceTwo r8 \accMusic \oneVoice s8 | - } - } - >> -} -@end lilypond - -Las secciones de adorno sólo se deben usar dentro de expresiones de -música secuenciales. No están contemplados el anidado ni la -yuxtaposición de secciones de adorno, y podría producir caídas u otros -errores. - -Cada nota de adorno en la salida MIDI tiene una longitud que es 1/4 de -su duración real. Si la duración combinada de las notas de adorno es -mayor que la longitud de la nota precedente, se genera un error -@qq{@code{Retrocediendo en el tiempo MIDI}}. Tiene dos opciones: en -primer lugar, puede hacer más corta la duración de las notas de -adorno, por ejemplo: +Cada nota de adorno en la salida MIDI tiene una longitud que es +1/4 de su duración real. Si la duración combinada de las notas de +adorno es mayor que la longitud de la nota precedente, se genera +un error @qq{@code{Retrocediendo en el tiempo MIDI}}. Tiene dos +opciones: en primer lugar, puede hacer más corta la duración de +las notas de adorno, por ejemplo: @example c'8 \acciaccatura @{ c'8[ d' e' f' g'] @} @@ -3656,19 +3769,21 @@ Véase @ref{Escalar las duraciones}. @cindex cadenza (cadencia), alinear a @cindex alineación a una cadenza (cadencia) -En un contexto orquestal, las cadenzas presentan un problema especial: -al construir una partitura que tiene una cadenza, todos los demás -instrumentos deben saltar tantas notas como la longitud de la cadenza, -pues en caso contrario empezarán demasiado pronto o demasiado tarde. +En un contexto orquestal, las cadenzas presentan un problema +especial: al construir una partitura que tiene una cadenza, todos +los demás instrumentos deben saltar tantas notas como la longitud +de la cadenza, pues en caso contrario empezarán demasiado pronto o +demasiado tarde. -Una solución a este problema son las funciones @code{mmrest-of-length} -y @code{skip-of-length}. Estas funciones de Scheme toman un fragmento -de música como argumento y generan un @code{\skip} o silencio -multicompás, de la longitud exacta del fragmento. +Una solución a este problema son las funciones +@code{mmrest-of-length} y @code{skip-of-length}. Estas funciones +de Scheme toman un fragmento de música como argumento y generan un +@code{\skip} o silencio multicompás, de la longitud exacta del +fragmento. @lilypond[verbatim,quote] -MyCadenza = \relative c' { - c4 d8 e f g g4 +MyCadenza = \relative { + c'4 d8 e f g g4 f2 g4 g } @@ -3707,13 +3822,13 @@ Fragmentos de código: @funindex measurePosition @funindex measureLength -El tiempo está administrado por el @code{Timing_translator}, que de -forma predeterminada vive en el contexto de @code{Score}. Se añade un -alias, @code{Timing}, al contexto en que se coloca el -@code{Timing_translator}. -Para asegurar que está disponible el alias @code{Timing}, quizá -tenga que crear explícitamente una instancia del contexto -contenedor (como @code{Voice} o @code{Staff}). +El tiempo está administrado por el @code{Timing_translator}, que +de forma predeterminada vive en el contexto de @code{Score}. Se +añade un alias, @code{Timing}, al contexto en que se coloca el +@code{Timing_translator}. Para asegurar que está disponible el +alias @code{Timing}, quizá tenga que crear explícitamente una +instancia del contexto contenedor (como @code{Voice} o +@code{Staff}). Se usan las siguientes propiedades de @code{Timing} para seguir la pista del tiempo dentro de la partitura. @@ -3723,40 +3838,40 @@ pista del tiempo dentro de la partitura. @table @code @item currentBarNumber -El número de compás en curso. Para ver un ejemplo que muestra el uso -de esta propiedad, consulte @ref{Numeración de compases}. +El número de compás en curso. Para ver un ejemplo que muestra el +uso de esta propiedad, consulte @ref{Numeración de compases}. @item measureLength -La longitud de los compases dentro de la indicación actual de compás. -Para un 4/4 esto es@tie{}1, y para el 6/8 es 3/4. Su valor determinad -cuándo se insertan las líneas divisorias y cómo se generan las barras -automáticas. +La longitud de los compases dentro de la indicación actual de +compás. Para un 4/4 esto es@tie{}1, y para el 6/8 es 3/4. Su +valor determinad cuándo se insertan las líneas divisorias y cómo +se generan las barras automáticas. @item measurePosition -El punto en que nos encontramos dentro del compás. Esta cantidad se -reinicia sustrayendo @code{measureLength} cada vez que se alcanza o se -excede @code{measureLength}. Cuando eso ocurre, se incrementa -@code{currentBarNumber}. +El punto en que nos encontramos dentro del compás. Esta cantidad +se reinicia sustrayendo @code{measureLength} cada vez que se +alcanza o se excede @code{measureLength}. Cuando eso ocurre, se +incrementa @code{currentBarNumber}. @item timing -Si tiene un valor verdadero, las variables anteriores se actualizan a -cada paso de tiempo. Cuando tiene un valor falso, el grabador se -queda en el compás actual indefinidamente. +Si tiene un valor verdadero, las variables anteriores se +actualizan a cada paso de tiempo. Cuando tiene un valor falso, el +grabador se queda en el compás actual indefinidamente. @end table La cuenta del tiempo se puede cambiar estableciendo el valor de cualquiera de estas variables explícitamente. En el siguiente -ejemplo, se imprime la indicación de compás predeterminada 4/4, pero -@code{measureLength} tiene está ajustado a 5/4. En los 4/8 hasta el -tercer compás, la posición @code{measurePosition} se adelanta en 1/8 -hasta 5/8, acortando ese compás en 1/8. Entonces, la siguiente línea -divisoria cae en 9/8 en vez de hacerlo en 5/4. +ejemplo, se imprime la indicación de compás predeterminada 4/4, +pero @code{measureLength} tiene está ajustado a 5/4. En los 4/8 +hasta el tercer compás, la posición @code{measurePosition} se +adelanta en 1/8 hasta 5/8, acortando ese compás en 1/8. Entonces, +la siguiente línea divisoria cae en 9/8 en vez de hacerlo en 5/4. @lilypond[quote,verbatim] -\new Voice \relative c' { +\new Voice \relative { \set Timing.measureLength = #(ly:make-moment 5/4) - c1 c4 | + c'1 c4 | c1 c4 | c4 c \set Timing.measurePosition = #(ly:make-moment 5/8) @@ -3766,8 +3881,8 @@ divisoria cae en 9/8 en vez de hacerlo en 5/4. @end lilypond @noindent -Como lo ilustra el ejemplo, @code{ly:make-moment n m} construye una -duración de la fracción n/m de una redonda. Por ejemplo, +Como lo ilustra el ejemplo, @code{ly:make-moment n m} construye +una duración de la fracción n/m de una redonda. Por ejemplo, @code{ly:make-moment 1 8} es una duración de una corchea y @code{ly:make-moment 7 16} es la duración de siete semicorcheas. diff --git a/Documentation/es/notation/simultaneous.itely b/Documentation/es/notation/simultaneous.itely index 3bd67079ad..e220a56e45 100644 --- a/Documentation/es/notation/simultaneous.itely +++ b/Documentation/es/notation/simultaneous.itely @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 45dd19546e9b75b3e1e977732f0962f35dd3290e + Translation of GIT committish: 16661f7f6a78f04d056228d11bdc9e17a7cdf760 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.28" +@c \version "2.19.29" @c Translation status: post-GDP @@ -17,15 +17,17 @@ @lilypondfile[quote,ragged-right,line-width=16\cm]{simultaneous-headword.ly} -La polifonía en música hace referencia a tener más de una voz en una -pieza cualquiera de música. En LilyPond la polifonía hace referencia -a tener más de una voz en el mismo pentagrama. +La palabra @q{polifonía} en música hace referencia a tener más de +una voz en una pieza cualquiera de música. En LilyPond la +polifonía hace referencia a tener más de una voz en el mismo +pentagrama. @menu * Una voz única:: * Varias voces:: @end menu + @node Una voz única @subsection Una voz única @translationof Single voice @@ -39,6 +41,7 @@ Esta sección trata de la notas simultáneas dentro de la misma voz. * Racimos (clusters):: @end menu + @node Notas en acorde @unnumberedsubsubsec Notas en acorde @translationof Chorded notes @@ -50,37 +53,48 @@ Esta sección trata de la notas simultáneas dentro de la misma voz. @funindex > @funindex <...> -Un acorde se forma encerrando un conjunto de notas entre @code{<} y -@code{>}. Un acorde puede ir seguido de una duración, -como si fueran simples notas. +Un acorde se forma encerrando un conjunto de notas entre @code{<} +y @code{>}. Un acorde puede ir seguido de una duración, como si +fueran simples notas. -@lilypond[verbatim,quote,relative=2] -1 2 4 8. 16 +@lilypond[verbatim,quote] +\relative { + 1 2 4 8. 16 +} @end lilypond -Los acordes también pueden ir seguidos de articulaciones, de nuevo como -si fueran simples notas. +Los acordes también pueden ir seguidos de articulaciones, de nuevo +como si fueran simples notas. -@lilypond[verbatim,quote,relative=2] -1\fermata 2-> 4\prall 8.^! 16-. +@lilypond[verbatim,quote] +\relative { + 1\fermata 2-> 4\prall 8.^! 16-. +} @end lilypond -Las notas dentro del propio acorde también pueden ir seguidas -de articulaciones y ornamentos. +Las notas dentro del propio acorde también pueden ir seguidas de +articulaciones y ornamentos. -@lilypond[verbatim,quote,relative=2] -1 c-^ e>2 4 -8. 16 +@lilypond[verbatim,quote] +\relative { + 1 c-^ e>2 4 + 8. 16 +} @end lilypond Sin embargo, algunos elementos de notación tales como las -expresiones de matices dinámicos, los reguladores y las ligaduras -de expresión, se deben unir al acorde y no a las notas que -integran el mismo, pues en caso contrario no se imprimirán. +expresiones de matices dinámicos y los reguladores se deben unir +al acorde y no a las notas que integran el mismo, pues en caso +contrario no se imprimirán. Otros elementos de notación como las +digitaciones y las ligaduras de expresión se posicionan de forma +muy diferente cuando se adjuntan a las notas de un acorde en lugar +de hacerlo a redondas o notas sueltas. -@lilypond[verbatim,quote,relative=2] -1 \f ( ) -\< \! +@lilypond[verbatim,quote] +\relative { + 1 \f ( ) + \< \! +} @end lilypond @cindex acordes vacíos @@ -90,32 +104,37 @@ Un acorde funciona como un mero contenedor para las notas que lo componen y sus articulaciones y otros elementos adjuntos. Como consecuencia, un acorde sin ninguna nota en su interior no tiene realmente ninguna duración. Cualqier articulación adjunta se -producirá en el mismo momento musical que la nota o acorde siguiente y -se puede combinar con ellos (para ver posibilidades más complejas de -combinaciones de estos elementos, consulte +producirá en el mismo momento musical que la nota o acorde +siguiente y se puede combinar con ellos (para ver posibilidades +más complejas de combinaciones de estos elementos, consulte @ref{Expresiones simultáneas}): -@lilypond[verbatim,quote,relative=2] -\grace { g8( a b } -<> ) \p \< -. -\markup \italic "sempre staccato" -\repeat unfold 4 { c4 e } c1\f +@lilypond[verbatim,quote] +\relative { + \grace { g'8( a b } + <> ) \p \< -. -\markup \italic "sempre staccato" + \repeat unfold 4 { c4 e } c1\f +} @end lilypond @cindex relativo, acordes en altura @cindex acordes y altura relativa Se puede usar el modo relativo para la altura de las notas de los -acordes. La primera nota del acorde siempre es relativa a la primera nota -del acorde anterior, o en caso de que el elemento precedente no sea un acorde, -la altura de la última nota que vino antes del acorde. -El resto de las notas del acorde son relativas a la nota anterior -@emph{dentro del mismo acorde}. - -@lilypond[verbatim,quote,relative=2] -1 +acordes. La primera nota del acorde siempre es relativa a la +primera nota del acorde anterior, o en caso de que el elemento +precedente no sea un acorde, la altura de la última nota que vino +antes del acorde. El resto de las notas del acorde son relativas +a la nota anterior @emph{dentro del mismo acorde}. + +@lilypond[verbatim,quote] +\relative { + 1 +} @end lilypond -Para ver más información sobre los acordes, consulte @ref{Notación de acordes}. +Para ver más información sobre los acordes, consulte +@ref{Notación de acordes}. @seealso Glosario musical: @@ -134,9 +153,10 @@ Fragmentos de código: @rlsr{Simultaneous notes}. @knownissues -Los acordes que contienen más de dos alturas en el mismo espacio de pentagrama, -como @samp{}, crean notas cuyas cabezas se superponen. -Dependiendo de la situación, una mejor representación puede requerir: +Los acordes que contienen más de dos alturas en el mismo espacio +de pentagrama, como @samp{}, crean notas cuyas cabezas +se superponen. Dependiendo de la situación, una mejor +representación puede requerir: @itemize @@ -160,83 +180,94 @@ Culsters o racimos; véase @ref{Racimos (clusters)}. @cindex acordes, repetición de @cindex repetición, con @code{q} +@cindex @code{q}, repetición de acordes -Para reducir el tecleo, se puede usar una abreviatura de repetición -del acorde anterior. El símbolo de repetición de acordes es @code{q}: +Para reducir el tecleo, se puede usar una abreviatura de +repetición del acorde anterior. El símbolo de repetición de +acordes es @code{q}: -@lilypond[verbatim,quote,relative=2] -1 q 2 q +@lilypond[verbatim,quote] +\relative { + 1 q 2 q +} @end lilypond Como en los acordes normales, el símbolo de repetición de acordes -puede usarse con duraciones, articulaciones, elementos de marcado, ligaduras -de expresión, barras, etc., pues sólo se duplican las notas del acorde precedente. +puede usarse con duraciones, articulaciones, elementos de marcado, +ligaduras de expresión, barras, etc., pues sólo se duplican las +notas del acorde precedente. -@lilypond[verbatim,quote,relative=2] -1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +@lilypond[verbatim,quote] +\relative { + 1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +} @end lilypond -El símbolo de repetición de acordes -siempre recuerda la última ocurrencia de un acorde, -por lo que es posible repetir el acorde más reciente -incluso si se han escrito en medio otras notas que no están en un acorde, o silencios. +El símbolo de repetición de acordes siempre recuerda la última +ocurrencia de un acorde, por lo que es posible repetir el acorde +más reciente incluso si se han escrito en medio otras notas que no +están en un acorde, o silencios. -@lilypond[verbatim,quote,relative=2] -1 c'4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1 c'4 q2 r8 q8 | + q2 c, | +} @end lilypond Sin embargo, el símbolo de repetición de acordes no retiene los matices dinámicos, las articulaciones ni los ornamentos que -contiene o que están adosados al acorde anterior. +contiene o que están adosados al acorde anterior. -@lilypond[verbatim,quote,relative=2] -1\sfz c'4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1\sfz c'4 q2 r8 q8 | + q2 c, | +} @end lilypond -Para poder retener algunos de ellos, se puede llamar explícitamente a -la función @code{\chordRepeats} con un argumento adicional que -especifique una lista de @var{tipos de evento} que conservar, a no ser -que los eventos de ese tipo ya estén presentes en el propio acorde -@code{q}. +Para poder retener algunos de ellos, se puede llamar +explícitamente a la función @code{\chordRepeats} con un argumento +adicional que especifique una lista de @var{tipos de evento} que +conservar, a no ser que los eventos de ese tipo ya estén presentes +en el propio acorde @code{q}. @lilypond[verbatim,quote] -\relative c'' { +\relative { \chordRepeats #'(articulation-event) - { 1\sfz c'4 q2 r8 q8-. } | + { 1\sfz c'4 q2 r8 q8-. } | q2 c, | } @end lilypond Aquí, el uso de @code{\chordRepeats} dentro de una construcción @code{\relative} produce un resultado inseperado: una vez se han -expandido los eventos de acorde, no pueden distinguirse de aquellos -introducidos como acordes normales, haciendo que @code{\relative} -asigne una octava basada en su contexto actual. +expandido los eventos de acorde, no pueden distinguirse de +aquellos introducidos como acordes normales, haciendo que +@code{\relative} asigne una octava basada en su contexto actual. Dado que las instancias anidadas de @code{\relative} no se afectan -mutuamente, se puede usar otra instrucción @code{\relative} dentro de -@code{\chordRepeats} para establecer las relaciones de octava antes de -expandir los acordes repetidos. En tal caso, todo el contenido de la -instrucción @code{\relative} interior no afecta a la exterior; de aquí -la distinta escritura de octava en la última nota de este ejemplo. +mutuamente, se puede usar otra instrucción @code{\relative} dentro +de @code{\chordRepeats} para establecer las relaciones de octava +antes de expandir los acordes repetidos. En tal caso, todo el +contenido de la instrucción @code{\relative} interior no afecta a +la exterior; de aquí la distinta escritura de octava en la última +nota de este ejemplo. -@c Without \new Voice, implicit voice creation does the dumbest thing. @lilypond[verbatim,quote] -\new Voice -\relative c'' { +\relative { \chordRepeats #'(articulation-event) - \relative c'' - { 1\sfz c'4 q2 r8 q8-. } | - q2 c | + \relative + { 1\sfz c'4 q2 r8 q8-. } | + q2 c'' | } @end lilypond -Las interacciones con @code{\relative} se producen solamente con las -llamadas explícitas de @code{\chordRepeats}: la expansión implícita al -comienzo del proceso de tipografiado se hace en un momento en que -todas las instancias de @code{\relative} ya se han procesado. +Las interacciones con @code{\relative} se producen solamente con +las llamadas explícitas de @code{\chordRepeats}: la expansión +implícita al comienzo del proceso de tipografiado se hace en un +momento en que todas las instancias de @code{\relative} ya se han +procesado. @seealso Referencia de la notación: @@ -252,63 +283,68 @@ Archivos de inicio: @translationof Simultaneous expressions Una o más expresiones musicales encerradas entre ángulos dobles se -entienden como simultáneas. Si la primera expresión comienza con una -sola nota o si toda la expresión simultánea aparece explícitamente -dentro de una sola voz, la expresión completa se sitúa sobre un solo -pentagrama; en caso contrario los elementos de la expresión simultánea -se sitúan en pentagramas distintos. +entienden como simultáneas. Si la primera expresión comienza con +una sola nota o si toda la expresión simultánea aparece +explícitamente dentro de una sola voz, la expresión completa se +sitúa sobre un solo pentagrama; en caso contrario los elementos de +la expresión simultánea se sitúan en pentagramas distintos. -Los ejemplos siguientes muestran expresiones simultáneas sobre un solo -pentagrama: +Los ejemplos siguientes muestran expresiones simultáneas sobre un +solo pentagrama: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Voice { % explicit single voice - << { a4 b g2 } { d4 g c,2 } >> + << \relative { a'4 b g2 } + \relative { d'4 g c,2 } >> } @end lilypond -@lilypond[quote,verbatim,relative=2] -% single first note -a << { a4 b g } { d4 g c, } >> +@lilypond[quote,verbatim] +\relative { + % single first note + a' << \relative { a'4 b g } + \relative { d'4 g c, } >> +} @end lilypond Esto puede ser de utilidad si las secciones simultáneas tienen -idénticas duraciones, pero se producirán errores si se intentan poner -notas de distinta duración sobre la misma plica. Las notas, -articulaciones y cambios de propiedades que están dentro de @emph{un -solo} contexto @samp{Voice} se recolectan y se representan en el orden -musical: - -@lilypond[quote,verbatim,relative=2] -4-. <>-. << c a >> << { c-. } { a s-. } >> +idénticas duraciones, pero se producirán errores si se intentan +poner notas de distinta duración sobre la misma plica. Las notas, +articulaciones y cambios de propiedades que están dentro de +@emph{un solo} contexto @samp{Voice} se recolectan y se +representan en el orden musical: + +@lilypond[quote,verbatim] +\relative { + 4-. <>-. << c a >> << { c-. } { a s-. } >> +} @end lilypond Tratar de poner más de una plica o barra de corchea, o distintas -duraciones o propiedades en el mismo momento musical, requiere el uso -de más de una voz. +duraciones o propiedades en el mismo momento musical, requiere el +uso de más de una voz. -El ejemplo siguiente muestra cómo las expresiones simultáneas pueden -generar varios pentagramas de forma implícita: +El ejemplo siguiente muestra cómo las expresiones simultáneas +pueden generar varios pentagramas de forma implícita: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % no single first note -<< { a4 b g2 } { d4 g2 c,4 } >> +<< \relative { a'4 b g2 } + \relative { d'4 g2 c,4 } >> @end lilypond Aquí no hay problema en tener distintas duraciones porque se interpretan en voces distintas. -@cindex colisiones, columnas que chocan @cindex colisiones, ignorar @knownissues -Si hay notas de dos o más voces en la misma posición del pentagrama, -con las plicas en la misma dirección, -y no tienen desplazamiento (o tienen especificado el mismo desplazamiento), -aparecerá el mensaje +Si hay notas que proceden de dos o más voces, sin especificar +ningún desplazamiento horizontal, y tienen las plicas en la misma +dirección, aparece el mensaje @example -advertencia: demasiadas columnas de notas que chocan entre sí. Se ignoran +Advertencia: esta voz requiere un ajuste de \voiceXx o \shiftXx @end example durante la compilación. Este mensaje se puede suprimir mediante @@ -319,9 +355,8 @@ durante la compilación. Este mensaje se puede suprimir mediante Sin embargo, esto no solamente suprime la advertencia sino que puede evitar cualquier resolución de colisiones y puede tener -otros efectos no deseados -(consulte también @emph{Problemas conocidos} en -@ref{Resolución de las colisiones}). +otros efectos no deseados (consulte también +@emph{Problemas conocidos} en @ref{Resolución de las colisiones}). @node Racimos (clusters) @@ -332,19 +367,19 @@ otros efectos no deseados @cindex racimo (cluster) @funindex \makeClusters -@funindex makeClusters Un «cluster» o racimo indica que se deben tocar simultáneamente un conjunto de notas consecutivas. Se escriben aplicando la función @code{\makeClusters} a una secuencia de acordes, p.ej.: -@lilypond[quote,relative=2,verbatim] -\makeClusters { 2 } +@lilypond[quote,verbatim] +\relative \makeClusters { 2 } @end lilypond -Se pueden mezclar en el mismo pentagrama notas normales y clusters, -incluso al mismo tiempo. En tal caso, no se hace ningún intento de -evitar automáticamente las colisiones entre clusters y notas normales. +Se pueden mezclar en el mismo pentagrama notas normales y +clusters, incluso al mismo tiempo. En tal caso, no se hace ningún +intento de evitar automáticamente las colisiones entre clusters y +notas normales. @seealso Glosario musical: @@ -359,8 +394,9 @@ Referencia de funcionamiento interno: @rinternals{Cluster_spanner_engraver}. @knownissues -Los clusters sólo tienen un buen aspecto cuando abarcan un mínimo de -dos acordes. En caso contrario aparecerán excesivamente estrechos. +Los clusters sólo tienen un buen aspecto cuando abarcan un mínimo +de dos acordes. En caso contrario aparecerán excesivamente +estrechos. Los clusters no llevan plica y por sí mismos no pueden indicar las duraciones, pero la longitud del cluster que se imprime viene @@ -385,6 +421,7 @@ pentagramas. * Escribir música en paralelo:: @end menu + @node Polifonía en un solo pentagrama @unnumberedsubsubsec Polifonía en un solo pentagrama @translationof Single-staff polyphony @@ -395,11 +432,9 @@ pentagramas. @cindex letra asignada a una voz @funindex \voiceOne -@funindex voiceOne @funindex \voiceOne ... \voiceFour @funindex Voice @funindex \oneVoice -@funindex oneVoice @subsubsubheading Instanciar las voces explícitamente @@ -407,26 +442,26 @@ La estructura básica necesaria para obtener varias voces independientes en un mismo pentagrama se ilustra en el ejemplo siguiente: -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] \new Staff << \new Voice = "first" - { \voiceOne r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { \voiceOne r8 r16 g'' e8. f16 g8[ c,] f e16 d } \new Voice= "second" - { \voiceTwo d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { \voiceTwo d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @noindent Aquí se crean explícitamente instancias de voces, cada una de las cuales recibe un nombre. Las instrucciones @code{\voiceOne} -@dots{} @code{\voiceFour} (voz uno hasta voz cuatro) preparan las voces de -manera que la primera y segunda voces llevan las plicas hacia arriba, -las voces segunda y cuarta llevan las plicas hacia abajo, las cabezas -de las notas en las voces tercera y cuarta se desplazan -horizontalmente, y los silencios de las voces respectivas se desplazan -también automáticamente para evitar las colisiones. La instrucción -@code{\oneVoice} (una voz) devuelve todos los ajustes de las voces al -estado neutro predeterminado. +@dots{} @code{\voiceFour} (voz uno hasta voz cuatro) preparan las +voces de manera que la primera y segunda voces llevan las plicas +hacia arriba, las voces segunda y cuarta llevan las plicas hacia +abajo, las cabezas de las notas en las voces tercera y cuarta se +desplazan horizontalmente, y los silencios de las voces +respectivas se desplazan también automáticamente para evitar las +colisiones. La instrucción @code{\oneVoice} (una voz) devuelve +todos los ajustes de las voces al estado neutro predeterminado. @subsubsubheading Pasajes polifónicos temporales @@ -440,18 +475,18 @@ siguiente: @end example @noindent -Aquí, la primera expresión dentro de un pasaje polifónico temporal se -coloca en el contexto @code{Voice} que estaba en uso inmediatamente -antes del pasaje polifónico, y ese mismo contexto @code{Voice} -continua después de la sección temporal. Otras expresiones dentro de -los ángulos se asignan a distintas voces temporales. Esto permite -asignar la letra de forma continua a una voz antes, durante y después -de la sección polifónica: - -@lilypond[quote, verbatim, relative=2] -<< +Aquí, la primera expresión dentro de un pasaje polifónico temporal +se coloca en el contexto @code{Voice} que estaba en uso +inmediatamente antes del pasaje polifónico, y ese mismo contexto +@code{Voice} continua después de la sección temporal. Otras +expresiones dentro de los ángulos se asignan a distintas voces +temporales. Esto permite asignar la letra de forma continua a una +voz antes, durante y después de la sección polifónica: + +@lilypond[quote,verbatim] +\relative << \new Voice = "melody" { - a4 + a'4 << { \voiceOne @@ -485,46 +520,48 @@ construcción se asignan a contextos @code{Voice} nuevos. Estos contextos @code{Voice} nuevos se crean implícitamente y reciben los nombres fijos @code{"1"}, @code{"2"}, etc. -El primer ejemplo podría haberse tipografiado de la manera siguiente: +El primer ejemplo podría haberse tipografiado de la manera +siguiente: -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { r8 r16 g'' e8. f16 g8[ c,] f e16 d } \\ - { d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond -Esta sintaxis se puede usar siempre que no nos importe que se creen -nuevas voces temporales que después serán descartadas. Estas voces -creadas implícitamente reciben ajustes equivalentes al efecto de las -instrucciones @code{\voiceOne} @dots{} @code{\voiceFour}, en el orden en -que aparecen en el código. +Esta sintaxis se puede usar siempre que no nos importe que se +creen nuevas voces temporales que después serán descartadas. +Estas voces creadas implícitamente reciben ajustes equivalentes al +efecto de las instrucciones @code{\voiceOne} @dots{} +@code{\voiceFour}, en el orden en que aparecen en el código. En el siguiente ejemplo, la voz intermedia lleva las plicas hacia -arriba, de manera que la introducimos en tercer lugar para que pase a -ser la voz tres, que tiene las plicas hacia arriba tal y como -queremos. Se usan silencios de separación para evitar la aparición de -silencios duplicados. +arriba, de manera que la introducimos en tercer lugar para que +pase a ser la voz tres, que tiene las plicas hacia arriba tal y +como queremos. Se usan silencios de separación para evitar la +aparición de silencios duplicados. -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 g g g g f16 ees f8 d } + \relative { r8 g'' g g g f16 ees f8 d } \\ - { ees,8 r ees r d r d r } + \relative { ees'8 r ees r d r d r } \\ - { d'8 s c s bes s a s } + \relative { d''8 s c s bes s a s } >> @end lilypond -En todas las partituras excepto las más simples, se recomienda crear -contextos @code{Voice} explícitos como aparece explicado en -@rlearning{Contextos y grabadores} y en @rlearning{Voces explícitas}. +En todas las partituras excepto las más simples, se recomienda +crear contextos @code{Voice} explícitos como aparece explicado en +@rlearning{Contextos y grabadores} y en @rlearning{Voces +explícitas}. @subsubsubheading Orden de las voces -Al escribir varias voces en el archivo de entrada, -utilice el orden siguiente: +Al escribir varias voces en el archivo de entrada, utilice el +orden siguiente: @example Voz 1: las más aguda @@ -538,8 +575,8 @@ etc. A pesar de que esto puede parecer contrario a la intuición, simplifica el proceso de disposición automática de las figuras. -Observe que las voces de numeración impar reciben plicas -hacia arriba, y las de numeración par reciben plicas hacia abajo: +Observe que las voces de numeración impar reciben plicas hacia +arriba, y las de numeración par reciben plicas hacia abajo: @lilypond[quote,verbatim] \new Staff << @@ -558,21 +595,21 @@ hacia arriba, y las de numeración par reciben plicas hacia abajo: >> @end lilypond -@warning{No se pueden crear letras ni elementos de extensión -(como ligaduras, reguladores, etc.) que se crucen de una voz a otra.} +@warning{No se pueden crear letras ni elementos de extensión (como +ligaduras, reguladores, etc.) que se crucen de una voz a otra.} @subsubsubheading Duraciones idénticas -En el caso especial en que queremos tipografiar fragmentos de música -que discurre en paralelo y con las mismas duraciones, se pueden -combinar en un solo contexto de voz, formando así acordes. Para -conseguirlo, las incorporamos dentro de una construcción de música -simultánea, dentro de una voz creada explícitamente: +En el caso especial en que queremos tipografiar fragmentos de +música que discurre en paralelo y con las mismas duraciones, se +pueden combinar en un solo contexto de voz, formando así acordes. +Para conseguirlo, las incorporamos dentro de una construcción de +música simultánea, dentro de una voz creada explícitamente: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] \new Voice << - { e4 f8 d e16 f g8 d4 } - { c4 d8 b c16 d e8 b4 } + \relative { e''4 f8 d e16 f g8 d4 } + \relative { c''4 d8 b c16 d e8 b4 } >> @end lilypond @@ -614,18 +651,18 @@ Fragmentos de código: @funindex \voiceFourStyle @funindex \voiceNeutralStyle -Se pueden aplicar colores y formas distintos a las voces para permitir -identificarlas fácilmente: +Se pueden aplicar colores y formas distintos a las voces para +permitir identificarlas fácilmente: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { \voiceOneStyle d4 c2 b4 } + \relative { \voiceOneStyle d''4 c2 b4 } \\ - { \voiceTwoStyle e,2 e } + \relative { \voiceTwoStyle e'2 e } \\ - { \voiceThreeStyle b2. c4 } + \relative { \voiceThreeStyle b2. c4 } \\ - { \voiceFourStyle g'2 g } + \relative { \voiceFourStyle g'2 g } >> @end lilypond @@ -664,43 +701,38 @@ Fragmentos de código: @cindex desplazamiento, silencio automático de @cindex desplazamiento de silencios, automático @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn @funindex \shiftOff -@funindex shiftOff @funindex \mergeDifferentlyDottedOn -@funindex mergeDifferentlyDottedOn @funindex \mergeDifferentlyDottedOff -@funindex mergeDifferentlyDottedOff @funindex \mergeDifferentlyHeadedOn -@funindex mergeDifferentlyHeadedOn @funindex \mergeDifferentlyHeadedOff -@funindex mergeDifferentlyHeadedOff - -Las cabezas de notas que están en diferentes voces y tienen la misma -altura, la misma forma de cabeza, y dirección opuesta de la plica, se -combinan automáticamente, pero las que tienen cabezas distintas o la -misma dirección de la plica no se combinan. Los silencios que se -encuentran en el lado opuesto de una plica en otra voz se desplazan -verticalmente. El ejemplo siguiente muestra tres circunstancias -distintas, sobre los pulsos 1 y 3 en el primer compás y sobre el pulso -1 del segundo compás, donde la combinación automática falla. - -@lilypond[quote,verbatim,relative=2] + +Las cabezas de notas que están en diferentes voces y tienen la +misma altura, la misma forma de cabeza, y dirección opuesta de la +plica, se combinan automáticamente, pero las que tienen cabezas +distintas o la misma dirección de la plica no se combinan. Los +silencios que se encuentran en el lado opuesto de una plica en +otra voz se desplazan verticalmente. El ejemplo siguiente muestra +tres circunstancias distintas, sobre los pulsos 1 y 3 en el primer +compás y sobre el pulso 1 del segundo compás, donde la combinación +automática falla. + +@lilypond[quote,verbatim] << - { - c8 d e d c d c4 + \relative { + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -709,19 +741,21 @@ Las cabezas de notas diferentes se pueden combinar como se muestra más abajo. En este ejemplo las cabezas del pulso 1 del primer compás sí se combinan: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -729,84 +763,90 @@ compás sí se combinan: Las figuras negras y blancas no se combinan de esta manera, pues sería difícil poder distinguirlas. -También se pueden combinar cabezas con puntillos diferentes, como se -muestra en el tercer pulso del primer compás: +También se pueden combinar cabezas con puntillos diferentes, como +se muestra en el tercer pulso del primer compás: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond La blanca y la corchea en el comienzo del segundo compás no están -correctamente combinadas porque la combinación automática no es capaz -de completarse satisfactoriamente cuando se encuentran tres o más -notas alineadas en la misma columna de notas, y en este caso la cabeza -combinada es incorrecta. Para conseguir que la combinación seleccione -la cabeza correcta, se debe aplicar un @code{\shift} o desplazamiento -a la nota que no se debe combinar. Aquí, se aplica @code{\shiftOn} -para mover el sol agudo fuera de la columna, y entonces -@code{\mergeDifferentlyHeadedOn} hace su trabajo correctamente. - -@lilypond[quote,relative=2,verbatim] +correctamente combinadas porque la combinación automática no es +capaz de completarse satisfactoriamente cuando se encuentran tres +o más notas alineadas en la misma columna de notas, y en este caso +la cabeza combinada es incorrecta. Para conseguir que la +combinación seleccione la cabeza correcta, se debe aplicar un +@code{\shift} o desplazamiento a la nota que no se debe combinar. +Aquí, se aplica @code{\shiftOn} para mover el sol agudo fuera de +la columna, y entonces @code{\mergeDifferentlyHeadedOn} hace su +trabajo correctamente. + +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 \shiftOn g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond -La instrucción @code{\shiftOn} permite (aunque no fuerza) -que las notas de una voz se puedan desplazar. Cuando@code{\shiftOn} -se aplica a una voz, una nota o acorde de esta voz se desplaza -solamente si su plica chocase en caso contrario con una plica de otra voz, -y sólo si las plicas en colisión apuntan en la misma dirección. -La instrucción @code{\shiftOff} evita la posibilidad de este tipo de desplazamiento. - -De forma predeterminada, las voces externas (normalmente las voces uno y dos) -tienen @code{\shiftOff} especificado (desplazamiento desactivado), mientras -que las voces interiores (tres y siguientes) tienen especificado -@code{\shiftOn} (desplazamiento activado). Cuando se aplica un desplazamiento, -las voces con plicas hacia arriba (voces de numeración impar) -se desplazan hacia la derecha, -y las voces con las plicas hacia abajo (voces con numeración par) -se desplazarn a la izquierda. - -He aquí un ejemplo que le ayudará a visualizar -la forma en que se expanidría internamente una expresión polifónica. +La instrucción @code{\shiftOn} permite (aunque no fuerza) que las +notas de una voz se puedan desplazar. Cuando@code{\shiftOn} se +aplica a una voz, una nota o acorde de esta voz se desplaza +solamente si su plica chocase en caso contrario con una plica de +otra voz, y sólo si las plicas en colisión apuntan en la misma +dirección. La instrucción @code{\shiftOff} evita la posibilidad +de este tipo de desplazamiento. + +De forma predeterminada, las voces externas (normalmente las voces +uno y dos) tienen @code{\shiftOff} especificado (desplazamiento +desactivado), mientras que las voces interiores (tres y +siguientes) tienen especificado @code{\shiftOn} (desplazamiento +activado). Cuando se aplica un desplazamiento, las voces con +plicas hacia arriba (voces de numeración impar) se desplazan hacia +la derecha, y las voces con las plicas hacia abajo (voces con +numeración par) se desplazarn a la izquierda. + +He aquí un ejemplo que le ayudará a visualizar la forma en que se +expanidría internamente una expresión polifónica. @warning{Observe que con tres o más voces, el orden vertical de las mismas dentro de su archivo de entrada ¡no sería el mismo que el orden vertical de las voces en el pentagrama!} @lilypond[quote,verbatim] -\new Staff \relative c'' { +\new Staff \relative { %% abbreviated entry << - { f2 } % 1: highest + { f''2 } % 1: highest \\ { g,2 } % 2: lowest \\ @@ -824,15 +864,16 @@ el orden vertical de las voces en el pentagrama!} } @end lilypond -Dos instrucciones adicionales, @code{\shiftOnn} y @code{\shiftOnnn}, -ofrecen niveles de desplazamiento mayores que se pueden -especificar temporalmente para resolver colisiones en situaciones -complejas; véase @rlearning{Ejemplos reales de música}. +Dos instrucciones adicionales, @code{\shiftOnn} y +@code{\shiftOnnn}, ofrecen niveles de desplazamiento mayores que +se pueden especificar temporalmente para resolver colisiones en +situaciones complejas; véase @rlearning{Ejemplos reales de +música}. -Sólo se combinan las notas si tienen la plica en direcciones opuestas -(como la tienen, por ejemplo, en las voces uno y dos de forma -predeterminada o cuando las plicas se establecen explícitamente en -direcciones opuestas). +Sólo se combinan las notas si tienen la plica en direcciones +opuestas (como la tienen, por ejemplo, en las voces uno y dos de +forma predeterminada o cuando las plicas se establecen +explícitamente en direcciones opuestas). @predefined @code{\mergeDifferentlyDottedOn}, @@ -877,11 +918,11 @@ El uso de @code{\override NoteColumn.ignore-collision = ##t} hace que las notas con distinta cabeza en voces diferentes se mezclen incorrectamente. -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim,fragment] \mergeDifferentlyHeadedOn -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> \override NoteColumn.ignore-collision = ##t -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> @end lilypond @ignore @@ -902,16 +943,15 @@ tienen también distinto puntillo, no están claros. @cindex a due, partes @cindex solo, partes @funindex \partcombine -@funindex partcombine La combinación automática de particellas se usa para mezclar dos partes musicales distintas sobre un pentagrama. Esto puede ser de gran ayuda especialmente al tipografiar partituras orquestales. -Se imprime una sola voz cuando la música de las dos voces es la misma, -pero en aquellos lugares en que difieren, se imprime una segunda -voz. Las direcciones de las plicas se establecen hacia arriba o hacia -abajo según proceda, al tiempo que se identifican y quedan marcadas -las partes de solista y de dúo. +Se imprime una sola voz cuando la música de las dos voces es la +misma, pero en aquellos lugares en que difieren, se imprime una +segunda voz. Las direcciones de las plicas se establecen hacia +arriba o hacia abajo según proceda, al tiempo que se identifican y +quedan marcadas las partes de solista y de dúo. La sintaxis para la combinación automática de las partes es: @@ -919,24 +959,24 @@ La sintaxis para la combinación automática de las partes es: \partcombine @var{expresión_musical_1} @var{expresión_musical_2} @end example -El ejemplo siguiente ejemplifica la funcionalidad básica, -poniendo las partes en un solo pentagrama en forma polifónica, y -estableciendo las direcciones de las plicas de forma adecuada. -Se utilizan las mismas variables para las partes -independientes y el pentagrama combinado. +El ejemplo siguiente ejemplifica la funcionalidad básica, poniendo +las partes en un solo pentagrama en forma polifónica, y +estableciendo las direcciones de las plicas de forma adecuada. Se +utilizan las mismas variables para las partes independientes y el +pentagrama combinado. @lilypond[quote,verbatim] -instrumentOne = \relative c' { - c4 d e f | +instrumentOne = \relative { + c'4 d e f | R1 | d'4 c b a | b4 g2 f4 | e1 | } -instrumentTwo = \relative g' { +instrumentTwo = \relative { R1 | - g4 a b c | + g'4 a b c | d4 c b a | g4 f( e) d | e1 | @@ -949,16 +989,51 @@ instrumentTwo = \relative g' { >> @end lilypond -Las dos partes tienen notas idénticas en el tercer compás, -por lo que aparecen solamente una vez. Las direcciones de las plicas -y ligaduras se establecen de forma automática, según se trate de un -solo o de un unísono. Cuando se necesita en situaciones de polifonía, -la primera parte (que recibe el nombre de contexto @code{one}) -recibe las plicas hacia arriba, mientras que la segunda (llamada -@code{two}) siempre recibe las plicas hacia abajo. En los fragmentos -de solo, las partes se marcan con @qq{Solo} y @qq{Solo II}, -respectivamente. Las partes en unísono (@notation{a due}) se marcan -con el texto @qq{a2}. +Las dos partes tienen notas idénticas en el tercer compás, por lo +que aparecen solamente una vez. Las direcciones de las plicas y +ligaduras se establecen de forma automática, según se trate de un +solo o de un unísono. Cuando se necesita en situaciones de +polifonía, la primera parte (que recibe el nombre de contexto +@code{one}) recibe las plicas hacia arriba, mientras que la +segunda (llamada @code{two}) siempre recibe las plicas hacia +abajo. En los fragmentos de solo, las partes se marcan con +@qq{Solo} y @qq{Solo II}, respectivamente. Las partes en unísono +(@notation{a due}) se marcan con el texto @qq{a2}. + +De forma predeterminada, el combinador de partes mezcla dos notas +de la misma altura como una nota @notation{a due}, combina las +notas que tengan la misma duración y estén a menos de una novena +de distancia como acordes, y dispone en voces separadas las notas +que estén a más de una novena de distancia (o cuando hay cruce de +voces). Este comportamiento se puede sobreescribir con un +argumento opcional que consiste en una pareja de números después +de la instrucción @code{\partcombine}: el primero especifica el +intervalo donde las notas comienzan a estar combinadas (el valor +predeterminado es cero) y el segundo donde las notas se dividen en +voces distintas. El ajuste del segundo argumento al valor cero +significa que el combinador de partes separa las notas que estén +dentro de un intervalo de segunda o más, establecerlo al valor uno +separa las notas de una tercera o más, y así sucesivamente. + +@lilypond[quote,verbatim] +instrumentOne = \relative { + a4 b c d | + e f g a | + b c d e | +} + +instrumentTwo = \relative { + c'4 c c c | + c c c c | + c c c c | +} + +<< + \new Staff \partcombine \instrumentOne \instrumentTwo + \new Staff \partcombine #'(2 . 3) \instrumentOne \instrumentTwo +>> +@end lilypond + Los dos argumentos de @code{\partcombine} se interpretan como contextos de @rinternals{Voice} separados, por lo que si la música @@ -974,60 +1049,52 @@ de incluir la función @code{\relative}, es decir: @noindent Una sección @code{\relative} que se encuentra fuera de @code{\partcombine} no tiene ningún efecto sobre las notas de -@code{@var{expresión_musical_1}} y @code{@var{expresión_musical_2}}. +@code{@var{expresión_musical_1}} y +@code{@var{expresión_musical_2}}. @funindex \partcombineChords -@funindex partcombineChords @funindex \partcombineApart -@funindex partcombineApart @funindex \partcombineUnisono -@funindex partcombineUnisono @funindex \partcombineSoloI -@funindex partcombineSoloI @funindex \partcombineSoloII -@funindex partcombineSoloII @funindex \partcombineAutomatic -@funindex partcombineAutomatic - -En las partituras profesionales, las voces con frecuencia se mantienen -separadas entre sí durante pasajes prolongados incluso si algunas -notas coninciden entre ambas, y podrían escribirse fácilmente como un -unísono. Por ello, la combinación de las notas en un acorde, o mostrar -una voz como solo, no son soluciones ideales porque la función -@code{\partcombine} considera cada nota de forma individual. En este -caso, el resultado de la función @code{\partcombine} se puede -alterar o corregir con las instrucciones siguientes: -Las instrucciones que finalizan en @code{@dots{}Once} se aplican -exclusivamente a la nota siguiente dentro de la expresión musical. +En las partituras profesionales, las voces con frecuencia se +mantienen separadas entre sí durante pasajes prolongados incluso +si algunas notas coninciden entre ambas, y podrían escribirse +fácilmente como un unísono. Por ello, la combinación de las notas +en un acorde, o mostrar una voz como solo, no son soluciones +ideales porque la función @code{\partcombine} considera cada nota +de forma individual. En este caso, el resultado de la función +@code{\partcombine} se puede alterar o corregir con una de las +instrucciones siguientes. Todas las instrucciones se pueden +anteceder por @code{\once} para que se apliquen solamente a la +nota siguiente dentro de la expresión musical. @itemize @item -@code{\partcombineApart} y @code{\partcombineApartOnce} -mantienen las notas como dos voces separadas incluso si se pueden -combinar en un acorde o unísono. +@code{\partcombineApart} mantiene las notas como dos voces +separadas incluso si se pueden combinar en un acorde o unísono. @item -@code{\partcombineChords} y @code{\partcombineChordsOnce} -combinan las notas en un acorde. +@code{\partcombineChords} combina las notas en un acorde. @item -@code{\partcombineUnisono} y @code{\partcombineUnisonoOnce} -combinan las dos voces como unísono y marcan el resultado -como @qq{unison}. +@code{\partcombineUnisono} combina las dos voces como unísono y +marca el resultado como @qq{unison}. @item -@code{\partcombineSoloI} y @code{\partcombineSoloIOnce} -muestran solo la voz uno y la marcan como @qq{Solo}. +@code{\partcombineSoloI} muestra solo la voz uno y la marca como +@qq{Solo}. @item -@code{\partcombineSoloII} o @code{\partcombineSoloIIOnce} -imprimen solo la voz dos y la marcan como @qq{Solo}. +@code{\partcombineSoloII} imprime solo la voz dos y la marca como +@qq{Solo}. @item -@code{\partcombineAutomatic} y @code{\partcombineAutomaticOnce} -terminan el efecto de las instrucciones anteriores y retornan a la -funcionalidad estándar de @code{\partcombine}. +@code{\partcombineAutomatic} termina el efecto de las +instrucciones anteriores y retorna a la funcionalidad estándar de +@code{\partcombine}. @end itemize @@ -1037,11 +1104,11 @@ instrumentOne = \relative c' { \partcombineAutomatic e2^"auto" e | \partcombineChords e'2^"chord" e | \partcombineAutomatic c2^"auto" c | - \partcombineApart c2^"apart" \partcombineChordsOnce e^"chord once" | + \partcombineApart c2^"apart" \once \partcombineChords e^"chord once" | c2 c | } -instrumentTwo = \relative c' { - c2 c | +instrumentTwo = \relative { + c'2 c | e2 e | a,2 c | c2 c' | @@ -1065,8 +1132,8 @@ La instrucción @code{\partcombine} no está diseñada para funcionar con la letra de las canciones; si una de las voces recibe un nombre explícito para poder adjuntar una letra, el combinador de partes no funciona. Sin embargo, se puede conseguir este efecto -usando un contexto @code{NullVoice}. Véase -@ref{Polifonía con letras compartidas}. +usando un contexto @code{NullVoice}. Véase @ref{Polifonía con +letras compartidas}. @snippets @@ -1100,36 +1167,37 @@ Las funciones @code{\partcombine@dots{}} no se pueden escribir dentro de los bloques @code{\tuplet} ni @code{\relative}. Si @code{printPartCombineTexts} está establecido y las dos voces -tocan y terminan las mismas notas en el mismo compás, -el combinador de partes puede tipografiar @code{a2} más de una vez -en ese compás. - -@code{\partcombine} solo tiene en cuenta el momento de inicio de las -notas dentro de una voz @code{Voice}; por ejemplo, no puede recordar -si una nota dentro de una voz ya ha comenzado cuando las notas que se -combinan se han iniciado justo ahora en la otra voz. Esto puede -conducir a cierto número de problemas inesperados entre los que se -incluye la impresión incorrecta de marcas de @qq{Solo} o de -@qq{Unison}. - -@code{\partcombine} conserva todos los elementos extensos (ligaduras, -reguladores, etc.) dentro del mismo contexto @code{Voice} de forma que -si uno cualquiera de estos elementos extensos inicia o termina en un -contexto @code{Voice} diferente, puede no imprimirse o hacerlo -incorrectamente. +tocan y terminan las mismas notas en el mismo compás, el +combinador de partes puede tipografiar @code{a2} más de una vez en +ese compás. + +@code{\partcombine} solo tiene en cuenta el momento de inicio de +las notas dentro de una voz @code{Voice}; por ejemplo, no puede +recordar si una nota dentro de una voz ya ha comenzado cuando las +notas que se combinan se han iniciado justo ahora en la otra voz. +Esto puede conducir a cierto número de problemas inesperados entre +los que se incluye la impresión incorrecta de marcas de @qq{Solo} +o de @qq{Unison}. + +@code{\partcombine} conserva todos los elementos extensos +(ligaduras, reguladores, etc.) dentro del mismo contexto +@code{Voice} de forma que si uno cualquiera de estos elementos +extensos inicia o termina en un contexto @code{Voice} diferente, +puede no imprimirse o hacerlo incorrectamente. Si la función @code{\partcombine} no puede combinar las dos expresiones musicales (es decir, cuando las dos voces tienen -duraciones distintas), otorgará internamente sus propios nombres a las -voces: @code{one} y @code{two} respectivamente. Esto significa que si -se produce un cambio a un contexto @code{Voice} que tenga un nombre -distinto, se ignorarán los eventos dentro del contexto @code{Voice} -que tiene el nombre distinto. +duraciones distintas), otorgará internamente sus propios nombres a +las voces: @code{one} y @code{two} respectivamente. Esto +significa que si se produce un cambio a un contexto @code{Voice} +que tenga un nombre distinto, se ignorarán los eventos dentro del +contexto @code{Voice} que tiene el nombre distinto. -Consulte también el apartado @emph{Advertencias y problemas conocidos} -en la sección @ref{Tablaturas predeterminadas} al utilizar -@code{\partcombine} con tablaturas, y la @emph{Nota} de -@ref{Barras automáticas} al utilizar barrado automático. +Consulte también el apartado +@emph{Advertencias y problemas conocidos} en la sección +@ref{Tablaturas predeterminadas} al utilizar @code{\partcombine} +con tablaturas, y la @emph{Nota} de @ref{Barras automáticas} al +utilizar barrado automático. @node Escribir música en paralelo @@ -1140,29 +1208,28 @@ en la sección @ref{Tablaturas predeterminadas} al utilizar @cindex música intercalada @cindex paralelo, música en @funindex \parallelMusic -@funindex parallelMusic -La música para varias partes se puede intercalar dentro del código de -entrada. La función @code{\parallelMusic} admite una lista que +La música para varias partes se puede intercalar dentro del código +de entrada. La función @code{\parallelMusic} admite una lista que contiene los nombres de las variables que se van a crear, y una expresión musical. El contenido de los compases alternativos -extraídos de la expresión se convierten en el valor de las variables -respectivas, de manera que podemos utilizarlas más tarde para imprimir -la música. +extraídos de la expresión se convierten en el valor de las +variables respectivas, de manera que podemos utilizarlas más tarde +para imprimir la música. -@warning{Es obligatorio utilizar comprobaciones de compás @code{|}, y -los compases deben tener la misma longitud.} +@warning{Es obligatorio utilizar comprobaciones de compás +@code{|}, y los compases deben tener la misma longitud.} @lilypond[quote,verbatim] \parallelMusic #'(voiceA voiceB voiceC) { % Bar 1 r8 g'16 c'' e'' g' c'' e'' r8 g'16 c'' e'' g' c'' e'' | - r16 e'8.~ e'4 r16 e'8.~ e'4 | + r16 e'8.~ 4 r16 e'8.~ 4 | c'2 c'2 | % Bar 2 r8 a'16 d'' f'' a' d'' f'' r8 a'16 d'' f'' a' d'' f'' | - r16 d'8.~ d'4 r16 d'8.~ d'4 | + r16 d'8.~ 4 r16 d'8.~ 4 | c'2 c'2 | } @@ -1175,20 +1242,20 @@ los compases deben tener la misma longitud.} Se puede usar el modo relativo. Observe que la instrucción @code{\relative} no se utiliza dentro del propio bloque @code{\parallelMusic}. Las notas guardan relación con la nota -anterior en la misma voz, no con la nota anterior dentro del código de -entrada (dicho de otra manera, las notas relativas de @code{vozA} -ignoran a las notas que hay en @code{vozB}. +anterior en la misma voz, no con la nota anterior dentro del +código de entrada (dicho de otra manera, las notas relativas de +@code{vozA} ignoran a las notas que hay en @code{vozB}. @lilypond[quote,verbatim] \parallelMusic #'(voiceA voiceB voiceC) { % Bar 1 r8 g16 c e g, c e r8 g,16 c e g, c e | - r16 e8.~ e4 r16 e8.~ e4 | + r16 e8.~ 4 r16 e8.~ 4 | c2 c | % Bar 2 r8 a,16 d f a, d f r8 a,16 d f a, d f | - r16 d8.~ d4 r16 d8.~ d4 | + r16 d8.~ 4 r16 d8.~ 4 | c2 c | } @@ -1198,8 +1265,9 @@ ignoran a las notas que hay en @code{vozB}. >> @end lilypond -Esto funciona aceptablemente bien para música de piano. El siguiente -ejemplo asigna cada cuatro compases consecutivos a cuatro variables: +Esto funciona aceptablemente bien para música de piano. El +siguiente ejemplo asigna cada cuatro compases consecutivos a +cuatro variables: @lilypond[quote,verbatim] global = { diff --git a/Documentation/es/notation/spacing.itely b/Documentation/es/notation/spacing.itely index d93a82571f..cb44a81ee6 100644 --- a/Documentation/es/notation/spacing.itely +++ b/Documentation/es/notation/spacing.itely @@ -1,19 +1,17 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: e965ee6c9b3b42a76fd6fce1f9c6b93b3ee79aae + Translation of GIT committish: 1e339d5efe13a725a4f0c2d8dfc3d40390446b89 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.22" @ignore GDP TODO list -This block comment is copied here to ease comparation of -original and its translation. Negative numbers are allowed: > Are you sure? The following works well @@ -23,30 +21,6 @@ Negative numbers are allowed: > and prints page number -1 on the second page, for example. -In 5.2.1 the @refbugs (line 495 in spacing.itely on master) it -states: - -"@code{layout-set-staff-size} does not change the distance between -the -staff lines." - -Could we add a sentence: -"Use instead the pair fontSize = #@var{N} - \override StaffSymbol.staff-space = #(magstep -@var{N}) -inside the Staff context to change the size of the font and the -distance between -staff lines accordingly." - -Actually I found, that the @internalsref{StaffSymbol} at line 481 -sends to an incomplete -documentation. The property staff-space is not explained here. I -thought Y-extent might be of -help, but it is in turn explained by x-space which again is -missing from the list. Who has the -knowledge to fix this? - - Clarify http://code.google.com/p/lilypond/issues/detail?id=68 @@ -59,31 +33,32 @@ http://code.google.com/p/lilypond/issues/detail?id=68 La disposición global sobre el papel viene determinada por tres factores: el diseño de página, los saltos de línea y el espaciado. -Estos factores influyen entre sí. La elección de uno u otro espaciado -determina qué densidad termina teniendo cada sistema de música. Esto -influye en el lugar en que se eligen los saltos de línea y, en último -término, en el número de páginas que tiene una partitura. +Estos factores influyen entre sí. La elección de uno u otro +espaciado determina qué densidad termina teniendo cada sistema de +música. Esto influye en el lugar en que se eligen los saltos de +línea y, en último término, en el número de páginas que tiene una +partitura. -Considerado globalmente, este proceso se produce en cuatro fases: en -primer lugar se eligen unas distancias elásticas o @q{muelles}, +Considerado globalmente, este proceso se produce en cuatro fases: +en primer lugar se eligen unas distancias elásticas o @q{muelles}, basados en la duración de las figuras. Se prueban todas las -combinaciones de saltos de línea posibles, y para cada una de ellas se -calcula una puntuación de @q{maldad}. Después se hace una estimación -de la altura de cada uno de los posibles sistemas. Finalmente se -selecciona una combinación de saltos de página y de línea de tal forma -que ni el espaciado horizontal ni el vertical estén demasiado -estrechos ni estirados. - -Hay dos tipos de bloques que pueden contener ajustes de disposición: -@code{\paper @{@dots{}@}} y @code{\layout @{@dots{}@}}. El bloque -@code{\paper} contiene ajustes de disposición de la página que se -espera sean los mismos para todas las partituras de un libro o parte de libro, -como la -altura de la hoja o si se imprimen los números de página, etc. Véase +combinaciones de saltos de línea posibles, y para cada una de +ellas se calcula una puntuación de @q{maldad}. Después se hace +una estimación de la altura de cada uno de los posibles sistemas. +Finalmente se selecciona una combinación de saltos de página y de +línea de tal forma que ni el espaciado horizontal ni el vertical +estén demasiado estrechos ni estirados. + +Hay dos tipos de bloques que pueden contener ajustes de +disposición: @code{\paper @{@dots{}@}} y @code{\layout +@{@dots{}@}}. El bloque @code{\paper} contiene ajustes de +disposición de la página que se espera sean los mismos para todas +las partituras de un libro o parte de libro, como la altura de la +hoja o si se imprimen los números de página, etc. Véase @ref{Disposición de la página}. El bloque @code{\layout} contiene -ajustes de disposición de la partitura, como el número de sistemas que -utilizar, o la separación entre grupos de pentagramas, etc. Véase -@ref{Disposición de la partitura}. +ajustes de disposición de la partitura, como el número de sistemas +que utilizar, o la separación entre grupos de pentagramas, etc. +Véase @ref{Disposición de la partitura}. @menu * Disposición de la página:: @@ -99,8 +74,8 @@ utilizar, o la separación entre grupos de pentagramas, etc. Véase @section Disposición de la página @translationof Page layout -Esta sección estudia las opciones de disposición de la página para el -bloque @code{\paper}. +Esta sección estudia las opciones de disposición de la página para +el bloque @code{\paper}. @menu * El bloque paper:: @@ -159,31 +134,32 @@ Entre los ajustes que pueden aparecer dentro de un bloque la función de Scheme @code{set-paper-size}, @item -variables de @code{\paper} utilizadas para personalizar la disposición -de la página, y +variables de @code{\paper} utilizadas para personalizar la +disposición de la página, y @item -definiciones de marcado utilizadas para personalizar la disposición de -los encabezamientos, pies y títulos. +definiciones de marcado utilizadas para personalizar la +disposición de los encabezamientos, pies y títulos. @end itemize -La función @code{set-paper-size} se estudia en la sección siguiente, -@ref{Tamaño del papel y escalado automático}. Las variables de -@code{\paper} que se ocupan de la disposición de la página -se estudian en secciones posteriores. Las definiciones de elementos -de marcado que se encargan de los encabezamientos, pies y títulos se -estudian en @ref{Títulos encabezamientos y pies de página personalizados}. +La función @code{set-paper-size} se estudia en la sección +siguiente, @ref{Tamaño del papel y escalado automático}. Las +variables de @code{\paper} que se ocupan de la disposición de la +página se estudian en secciones posteriores. Las definiciones de +elementos de marcado que se encargan de los encabezamientos, pies +y títulos se estudian en +@ref{Títulos encabezamientos y pies de página personalizados}. -Casi todas las variables de @code{\paper} funcionan solamente dentro -de un bloque @code{\paper}. Las pocas que funcionan también en un -bloque @code{\layout} están relacionadas en -@ref{El bloque layout,,El bloque @code{@bs{}layout}}. +Casi todas las variables de @code{\paper} funcionan solamente +dentro de un bloque @code{\paper}. Las pocas que funcionan +también en un bloque @code{\layout} están relacionadas en @ref{El +bloque layout,,El bloque @code{@bs{}layout}}. Excepto cuando se especifica lo contrario, todas las variables de -@code{\paper} que corresponden a distancias sobre la página se miden -en milímetros, a no ser que el usuario especifique unas unidades -diferentes. Por ejemplo, la declaración siguiente +@code{\paper} que corresponden a distancias sobre la página se +miden en milímetros, a no ser que el usuario especifique unas +unidades diferentes. Por ejemplo, la declaración siguiente establece el margen superior @code{top-margin} a diez milímetros: @example @@ -204,12 +180,12 @@ Para fijarlo en @code{0.5} pulgadas, utilice el sufijo de unidades Los sufijos de unidades que están disponibles son @code{\mm}, @code{\cm}, @code{\in} y @code{\pt}. Estas unidades son valores simples para convertir a partir de milímetros; están definidos en -@file{ly/paper-defaults-init.ly}. Por claridad, al usar milímetros, -se suele escribir el sufijo @code{\mm} aunque no es necesario -técnicamente. +@file{ly/paper-defaults-init.ly}. Por claridad, al usar +milímetros, se suele escribir el sufijo @code{\mm} aunque no es +necesario técnicamente. -También es posible definir valores de @code{\paper} utilizando Scheme. -El equivalente de Scheme del ejemplo anterior es: +También es posible definir valores de @code{\paper} utilizando +Scheme. El equivalente de Scheme del ejemplo anterior es: @example \paper @{ @@ -246,9 +222,9 @@ Archivos instalados: @unnumberedsubsubsec Fijar el tamaño del papel @translationof Setting paper size -@q{A4} es el valor predeterminado si no se establece ningún tamaño de -página explícitamente. Sin embargo, existen dos funciones que se -pueden usar para modificarlo: +@q{A4} es el valor predeterminado si no se establece ningún tamaño +de página explícitamente. Sin embargo, existen dos funciones que +se pueden usar para modificarlo: @table @code @item set-default-paper-size @@ -271,30 +247,31 @@ que se debe colocar siempre dentro de un bloque @code{\paper}. @end table Si se usa la función @code{set-default-paper-size} en el ámbito -superior jerárquico, debe ir antes de cualquier bloque @code{\paper}. -@code{set-default-paper-size} establece el tamaño de todas las -páginas, mientras que @code{set-paper-size} establece sólo el tamaño -de las páginas a las que se aplica el bloque @code{\paper}. Por -ejemplo, si el bloque @code{\paper} está al principio del archivo, -aplica el tamaño de papel a todas las páginas. Si el bloque -@code{\paper} está dentro de un bloque @code{\book}, entonces el -tamaño del papel sólo se aplica a ese libro. +superior jerárquico, debe ir antes de cualquier bloque +@code{\paper}. @code{set-default-paper-size} establece el tamaño +de todas las páginas, mientras que @code{set-paper-size} establece +sólo el tamaño de las páginas a las que se aplica el bloque +@code{\paper}. Por ejemplo, si el bloque @code{\paper} está al +principio del archivo, aplica el tamaño de papel a todas las +páginas. Si el bloque @code{\paper} está dentro de un bloque +@code{\book}, entonces el tamaño del papel sólo se aplica a ese +libro. Cuando se usa la función @code{set-paper-size}, se debe colocar -@emph{antes} de cualquier otra función que se utilice dentro del mismo -bloque @code{\paper}. Véase @ref{Escalado automático al tamaño del -papel}. +@emph{antes} de cualquier otra función que se utilice dentro del +mismo bloque @code{\paper}. Véase +@ref{Escalado automático al tamaño del papel}. Los tamaños de página están definidos en el archivo @file{scm/paper.scm}, y aunque es posible añadir tamaños -personalizados, se sobreescribirán en las actualizaciones del software -posteriores. La lista de todos los tamaños de papel disponibles -está en @ref{Tamaños de página predefinidos}. +personalizados, se sobreescribirán en las actualizaciones del +software posteriores. La lista de todos los tamaños de papel +disponibles está en @ref{Tamaños de página predefinidos}. @c An appendix entry exists for paper sizes but is not auto-generated -Se puede usar la siguiente instrucción en el archivo para añadir un -tamaño de página personalizado que se puede usar después con +Se puede usar la siguiente instrucción en el archivo para añadir +un tamaño de página personalizado que se puede usar después con @code{set-default-paper-size} o con @code{set-paper-size} según convenga, @@ -313,19 +290,19 @@ Se puede usar cualquiera de las unidades @code{in} (pulgadas), @cindex página, orientación de la @cindex papel, tamaño, apaisado -Si se añade el símbolo @code{'landscape} a la función del tamaño de la -página, el papel se gira 90 grados y se establece adecuadamente la -anchura de las líneas. +Si se añade el símbolo @code{'landscape} a la función del tamaño +de la página, el papel se gira 90 grados y se establece +adecuadamente la anchura de las líneas. @example #(set-default-paper-size "a6" 'landscape) @end example Se pueden intercambiar las dimensiones del papel @emph{sin que la -impresión resulte girada} (como cuando se imprime en tamaño tarjeta -postal, o al crear gráficos para su inclusión en lugar de un documento -independiente) añadiendo @samp{landscape} después del nombre del -propio tamaño del papel: +impresión resulte girada} (como cuando se imprime en tamaño +tarjeta postal, o al crear gráficos para su inclusión en lugar de +un documento independiente) añadiendo @samp{landscape} después del +nombre del propio tamaño del papel: @example #(set-default-paper-size "a6landscape") @@ -350,41 +327,42 @@ Archivos instalados: @unnumberedsubsubsec Escalado automático al tamaño del papel @translationof Automatic scaling to paper size -Si se cambia el tamaño del papel con una de las funciones de Scheme -(@code{set-default-paper-size} o @code{set-paper-size}), los valores -de algunas variables de @code{\paper} se escalan automáticamente al -nuevo tamaño. Para sortear el escalado automático para una variable -determinada, fije el valor de la variable después de establecer el -tamaño del papel. Observe que el escalado automático no se activa -mediante el ajuste de las variables -@code{paper-height} o de @code{paper-width}, -incluso aunque @code{paper-width} puede influir sobre otros valores -(esto es distinto al escalado y se estudia más abajo). Las funciones -@code{set-default-paper-size} y @code{set-paper-size} se describen en -@ref{Fijar el tamaño del papel}. - -Las dimensiones verticales afectadas por el escalado automático son -@code{top-margin} y @code{bottom-margin} -(véase @ref{Variables de espaciado de paper verticales fijas,,Variables de espaciado de @code{@bs{}paper} verticales fijas}). -Las dimensiones +Si se cambia el tamaño del papel con una de las funciones de +Scheme (@code{set-default-paper-size} o @code{set-paper-size}), +los valores de algunas variables de @code{\paper} se escalan +automáticamente al nuevo tamaño. Para sortear el escalado +automático para una variable determinada, fije el valor de la +variable después de establecer el tamaño del papel. Observe que +el escalado automático no se activa mediante el ajuste de las +variables @code{paper-height} o de @code{paper-width}, incluso +aunque @code{paper-width} puede influir sobre otros valores (esto +es distinto al escalado y se estudia más abajo). Las funciones +@code{set-default-paper-size} y @code{set-paper-size} se describen +en @ref{Fijar el tamaño del papel}. + +Las dimensiones verticales afectadas por el escalado automático +son @code{top-margin} y @code{bottom-margin} (véase @ref{Variables +de espaciado de paper verticales fijas,,Variables de espaciado de +@code{@bs{}paper} verticales fijas}). Las dimensiones horizontales afectadas por el escalado automático son @code{left-margin}, @code{right-margin}, @code{inner-margin}, @code{outer-margin}, @code{binding-offset}, @code{indent} y -@code{short-indent} (véase -@ref{Variables de espaciado de paper horizontales,,Variables de espaciado de @code{@bs{}paper} horizontales}). - -Los valores predeterminados para estas dimensiones están fijados en el -archivo @file{ly/paper-defaults-init.ly}, usando variables internas -llamadas @code{top-margin-default}, @code{bottom-margin-default}, etc. -Estos son los valores que resultan del tamaño predeterminado del papel -@code{a4}. Como referencia, con el papel @code{a4} la altura -@code{paper-height} es @code{297\mm} y la anchura @code{paper-width} -es @code{210\mm}. +@code{short-indent} (véase @ref{Variables de espaciado de paper +horizontales,,Variables de espaciado de @code{@bs{}paper} +horizontales}). + +Los valores predeterminados para estas dimensiones están fijados +en el archivo @file{ly/paper-defaults-init.ly}, usando variables +internas llamadas @code{top-margin-default}, +@code{bottom-margin-default}, etc. Estos son los valores que +resultan del tamaño predeterminado del papel @code{a4}. Como +referencia, con el papel @code{a4} la altura @code{paper-height} +es @code{297\mm} y la anchura @code{paper-width} es @code{210\mm}. @seealso Referencia de la notación: -@ref{Variables de espaciado de paper verticales fijas,,Variables de espaciado de @code{@bs{}paper} verticales fijas}, -@ref{Variables de espaciado de paper horizontales,,Variables de espaciado de @code{@bs{}paper} horizontales}. +@ref{Variables de espaciado de paper verticales fijas}, +@ref{Variables de espaciado de paper horizontales}. Archivos de inicio: @file{ly/paper-defaults-init.ly}, @@ -397,51 +375,50 @@ Archivos de inicio: @warning{Algunas dimensiones de @code{@bs{}paper} se escalan automáticamente al tamaño del papel, lo que puede llevar a un -comportamiento no esperado. Véase @ref{Escalado automático al tamaño -del papel}.} +comportamiento no esperado. Véase +@ref{Escalado automático al tamaño del papel}.} -Los valores predeterminados (previos al escalado) están definidos en -el archivo @file{ly/paper-defaults-init.ly}. +Los valores predeterminados (previos al escalado) están definidos +en el archivo @file{ly/paper-defaults-init.ly}. @table @code @item paper-height (altura del papel) @funindex paper-height -Altura de la página, no fijada de forma predeterminada. Observe que -el escalado automático de algunas dimensiones verticales no resulta -afectado por esto. +Altura de la página, no fijada de forma predeterminada. Observe +que el escalado automático de algunas dimensiones verticales no +resulta afectado por esto. @item top-margin (margen superior) @funindex top-margin -Margen entre el extremo superior de la página y la parte superior de -la zona imprimible. Si se modifica el tamaño del papel, el valor -predeterminado de esta dimensión se escala de acuerdo con ello. +Margen entre el extremo superior de la página y la parte superior +de la zona imprimible. Si se modifica el tamaño del papel, el +valor predeterminado de esta dimensión se escala de acuerdo con +ello. @item bottom-margin (margen inferior) @funindex bottom-margin Margen entre la parte inferior de la zona imprimible y el extremo -inferior de la página. Si se modifica el tamaño del papel, se escala -de acuerdo con ello el valor predeterminado de esta dimensión. +inferior de la página. Si se modifica el tamaño del papel, se +escala de acuerdo con ello el valor predeterminado de esta +dimensión. @item ragged-bottom (sin justificar por abajo) @funindex ragged-bottom -Si se fija al valor verdadero, los sistemas no se reparten -verticalmente hasta abajo de la página. Esto no afecta a la última -página. Se debe fijar a verdadero para piezas que sólo tienen dos o -tres sistemas por página, como por ejemplo las partituras orquestales. +Si esto se fija al valor verdadero, los sistemas se disponen según +su espaciado natural, ni comprimido ni ampliado verticalmente para +rellenar la página. @item ragged-last-bottom (sin justificar la última por abajo) @funindex ragged-last-bottom -Si se establece al valor falso, los sistemas se reparten verticalmente -hasta abajo de la última página. Las piezas que llenan sobradamente -dos o más páginas deben tener este valor fijado a falso. También -afecta a la última página de las partes de libro, es decir, partes de -un libro creadas con bloques @code{\bookpart}. - +Si se establece al valor falso, entonces la última página (tanto +del documento como de cada sección que se hubiera creado con un +bloque @code{\bookpart}) se justifica verticalmente de la misma +forma que las páginas anteriores. @end table @seealso @@ -456,35 +433,35 @@ Fragmentos de código: @knownissues Los títulos (extraídos del bloque @code{\header}) se tratan como -sistemas, así pues @code{ragged-bottom} y @code{ragged-last-bottom} -aumentan la separación entre los títulos y el primer sistema de la -partitura. +sistemas, así pues @code{ragged-bottom} y +@code{ragged-last-bottom} aumentan la separación entre los títulos +y el primer sistema de la partitura. -Los tamaños de papel definidos explícitamente -sobreescriben cualquier ajuste de los márgenes -superior o inferior definidos por el usuario. +Los tamaños de papel definidos explícitamente sobreescriben +cualquier ajuste de los márgenes superior o inferior definidos por +el usuario. @node Variables de espaciado de paper verticales flexibles @subsection Variables de espaciado de @code{@bs{}paper} verticales flexibles @translationof Flexible vertical spacing paper variables -En casi todos los casos es preferible que las distancias verticales -entre ciertos elementos (como márgenes, títulos, sistemas y las -distintas partituras) sean flexibles, de manera que se amplíen y -compriman adecuadamente dependiendo de la situación. Están -disponibles un cierto número de variables del bloque @code{\paper} -(relacionadas más abajo) para realizar un ajuste fino del -comportamiento de estas dimensiones frente a su ampliación o -compresión. +En casi todos los casos es preferible que las distancias +verticales entre ciertos elementos (como márgenes, títulos, +sistemas y las distintas partituras) sean flexibles, de manera que +se amplíen y compriman adecuadamente dependiendo de la situación. +Están disponibles un cierto número de variables del bloque +@code{\paper} (relacionadas más abajo) para realizar un ajuste +fino del comportamiento de estas dimensiones frente a su +ampliación o compresión. Observe que las variables de @code{\paper} que se estudian en esta -sección no controlan el espaciado de los pentagramas que están dentro -de los sistemas individuales. El espaciado dentro de los sistemas se -controla por medio de propiedades de grob, con ajustes que se escriben -normalmente dentro de un bloque @code{\score} o @code{\layout}, y no -dentro del bloque @code{\paper}. -Véase @ref{Espaciado vertical flexible dentro de los sistemas}. +sección no controlan el espaciado de los pentagramas que están +dentro de los sistemas individuales. El espaciado dentro de los +sistemas se controla por medio de propiedades de grob, con ajustes +que se escriben normalmente dentro de un bloque @code{\score} o +@code{\layout}, y no dentro del bloque @code{\paper}. Véase +@ref{Espaciado vertical flexible dentro de los sistemas}. @menu * Estructura de las listas-A de espaciado vertical flexible:: @@ -496,23 +473,25 @@ Véase @ref{Espaciado vertical flexible dentro de los sistemas}. @unnumberedsubsubsec Estructura de las listas-A de espaciado vertical flexible @translationof Structure of flexible vertical spacing alists -Cada una de las variables de espaciado de @code{\paper} flexibles es -una lista-A (lista asociativa) que contiene cuatro @emph{claves}: +Cada una de las variables de espaciado de @code{\paper} flexibles +es una lista-A (lista asociativa) que contiene cuatro +@emph{claves}: @itemize @item @code{basic-distance} (distancia básica): distancia vertical, medida en espacios de pentagrama, entre los -@emph{puntos de referencia} de los dos elementos, cuando no resulte -ninguna colisión, y no se produzca ninguna ampliación o compresión. -El punto de referencia de un elemento de marcado (de título o del -nivel jerárquico superior) es su punto más alto, y el punto de -referencia de un sistema es el centro vertical del @code{StaffSymbol} -más cercano (incluso si se trata de una línea que no es un pentagrama, -como un contexto @code{Lyrics}). Los valores de @code{distancia básica} menores -de @code{padding} o de @code{minimum-distance} no son significativos, -porque la distancia resultante nunca será menor de @code{padding} o de +@emph{puntos de referencia} de los dos elementos, cuando no +resulte ninguna colisión, y no se produzca ninguna ampliación o +compresión. El punto de referencia de un elemento de marcado (de +título o del nivel jerárquico superior) es su punto más alto, y el +punto de referencia de un sistema es el centro vertical del +@code{StaffSymbol} más cercano (incluso si se trata de una línea +que no es un pentagrama, como un contexto @code{Lyrics}). Los +valores de @code{distancia básica} menores de @code{padding} o de +@code{minimum-distance} no son significativos, porque la distancia +resultante nunca será menor de @code{padding} o de @code{minimum-distance}. @item @@ -536,23 +515,24 @@ medido en espacios de pentagrama. @code{stretchability} (ampliabilidad): medida sin unidades de la propensión relativa de esta dimensión a ampliarse. Si es cero, la distancia no se ampliará (a no ser que -resultasen colisiones). Si es positiva, la significación del valor de -ampliabilidad de una dimensión concreta depende solamente de su -relación con los valores de @code{stretchability} de las otras -dimensiones. Por ejemplo, si una dimensión tiene el doble de -@code{stretchability} que otra, se ampliará con el doble de facilidad. -Los valores deben ser no negativos y finitos. El valor @code{+inf.0} -desencadena un error de programación y se ignora, pero se puede usar -@code{1.0e7} para un muelle casi infinitamente ampliable. Si no se -fija un valor, el valor predeterminado se establece a @code{basic-distance}. -Observe que la propensión de la dimensión a @emph{comprimirse} no se -puede establecer directamente por el usuario y es igual a +resultasen colisiones). Si es positiva, la significación del +valor de ampliabilidad de una dimensión concreta depende solamente +de su relación con los valores de @code{stretchability} de las +otras dimensiones. Por ejemplo, si una dimensión tiene el doble +de @code{stretchability} que otra, se ampliará con el doble de +facilidad. Los valores deben ser no negativos y finitos. El +valor @code{+inf.0} desencadena un error de programación y se +ignora, pero se puede usar @code{1.0e7} para un muelle casi +infinitamente ampliable. Si no se fija un valor, el valor +predeterminado se establece a @code{basic-distance}. Observe que +la propensión de la dimensión a @emph{comprimirse} no se puede +establecer directamente por el usuario y es igual a (@code{basic-distance}@tie{}@minus{}@tie{}@code{minimum-distance}). @end itemize -Si una página tiene un margen inferior no justificado, la distancia -resultante es la mayor de: +Si una página tiene un margen inferior no justificado, la +distancia resultante es la mayor de: @itemize @@ -563,25 +543,25 @@ resultante es la mayor de: @code{minimum-distance}, y @item -@code{padding} más la menor distancia necesaria -para eliminar las colisiones. +@code{padding} más la menor distancia necesaria para eliminar las +colisiones. @end itemize -Para partituras de varias páginas con la parte inferior -no justificada en la última página, ésta usará el mismo -espaciado que la página anterior -siempre y cuando haya espacio suficiente para ello. +Para partituras de varias páginas con la parte inferior no +justificada en la última página, ésta usará el mismo espaciado que +la página anterior siempre y cuando haya espacio suficiente para +ello. Los métodos específicos para la modificación de las listas-A se -estudian en @ref{Modificación de las listas-A}. El siguiente ejemplo -muestra las dos formas en que pueden modificarse estas listas-A. La -primera declaración actualiza un par clave-valor individualmente, y la -segunda redefine la variable completamente: +estudian en @ref{Modificación de las listas-A}. El siguiente +ejemplo muestra las dos formas en que pueden modificarse estas +listas-A. La primera declaración actualiza un par clave-valor +individualmente, y la segunda redefine la variable completamente: @example \paper @{ - system-system-spacing #'basic-distance = #8 + system-system-spacing.basic-distance = #8 score-system-spacing = #'((basic-distance . 12) (minimum-distance . 6) @@ -597,15 +577,15 @@ segunda redefine la variable completamente: Los nombres de estas variables siguen el formato @code{@var{superior}-@var{inferior}-spacing}, donde -@code{@var{superior}} e @code{@var{inferior}} son los elementos que -van a ser espaciados. Cada distancia se mide entre los puntos de -referencia de los dos elementos (véase más arriba la descripción de la -estructura de la lista-A). Observe que en estos nombres de variable, -el término @q{@code{markup}} se refiere tanto a @emph{elementos de -marcado de título} (@code{bookTitleMarkup} o @code{scoreTitleMarkup}) -como a @emph{elementos de marcado del nivel superior} (véase -@ref{Estructura del archivo}). Todas las distancias se miden en -espacios de pentagrama. +@code{@var{superior}} e @code{@var{inferior}} son los elementos +que van a ser espaciados. Cada distancia se mide entre los puntos +de referencia de los dos elementos (véase más arriba la +descripción de la estructura de la lista-A). Observe que en estos +nombres de variable, el término @q{@code{markup}} se refiere tanto +a @emph{elementos de marcado de título} (@code{bookTitleMarkup} o +@code{scoreTitleMarkup}) como a @emph{elementos de marcado del +nivel superior} (véase @ref{Estructura del archivo}). Todas las +distancias se miden en espacios de pentagrama. Los ajustes predeterminados están definidos en el archivo @file{ly/paper-defaults-init.ly}. @@ -622,15 +602,15 @@ superior) y el sistema que le sigue. @item score-markup-spacing @funindex score-markup-spacing -distancia entre el último sistema de una partitura y el elemento de -marcado (de título o del nivel superior) que le sigue. +distancia entre el último sistema de una partitura y el elemento +de marcado (de título o del nivel superior) que le sigue. @item score-system-spacing @funindex score-system-spacing -distancia entre el último sistema de una partitura y el primer sistema -de la partitura que le sigue, cuando no existe ningún elemento de -marcado (de título o del nivel superior) entre ellos. +distancia entre el último sistema de una partitura y el primer +sistema de la partitura que le sigue, cuando no existe ningún +elemento de marcado (de título o del nivel superior) entre ellos. @item system-system-spacing @funindex system-system-spacing @@ -647,24 +627,24 @@ superior). @funindex last-bottom-spacing distancia desde el último sistema o elemento de marcado del nivel -superior en una página, hasta la parte inferior de la zona imprimible -(es decir, el extremo superior del margen inferior). +superior en una página, hasta la parte inferior de la zona +imprimible (es decir, el extremo superior del margen inferior). @item top-system-spacing @funindex top-system-spacing -distancia desde la parte superior de la zona imprimible (es decir, el -extremo inferior del margen superior) hasta el primer sistema de una -página, cuando no hay ningún elemento de marcado (de título o del -nivel superior) entre los dos. +distancia desde la parte superior de la zona imprimible (es decir, +el extremo inferior del margen superior) hasta el primer sistema +de una página, cuando no hay ningún elemento de marcado (de título +o del nivel superior) entre los dos. @item top-markup-spacing @funindex top-markup-spacing -distancia desde el extremo superior de la zona imprimible (es decir, -el extremo inferior del margen superior) hasta el primer elemento de -marcado (de título o del nivel superior) sobre una página, cuando no -hay ningún sistema entre los dos. +distancia desde el extremo superior de la zona imprimible (es +decir, el extremo inferior del margen superior) hasta el primer +elemento de marcado (de título o del nivel superior) sobre una +página, cuando no hay ningún sistema entre los dos. @end table @seealso @@ -704,91 +684,113 @@ relacionados aquí se encuentran definidos en el archivo @table @code -@item paper-width +@item paper-width (anchura del papel) @funindex paper-width Anchura de la página, sin fijar de forma predeterminada. Aunque -@code{paper-width} no tiene ningún efecto sobre el escalado automático -de algunas dimensiones horizontales, sí influye sobre la variable -@code{line-width}. Si están establecidas las dos variables -@code{paper-width} y @code{line-width}, entonces también se actualizan -@code{left-margin} y @code{right-margin}. Véase también -@code{check-consistency}. - -@item line-width -@funindex line-width +@code{paper-width} no tiene ningún efecto sobre el escalado +automático de algunas dimensiones horizontales, sí influye sobre +la variable @code{line-width}. Si están establecidas las dos +variables @code{paper-width} y @code{line-width}, entonces también +se actualizan @code{left-margin} y @code{right-margin}. Véase +también @code{check-consistency}. -Dimensiones horizontales de las líneas del pentagrama en los sistemas -sin sangrado y justificados, igual a -@code{(paper-width@tie{}@minus{}@tie{}left-margin@tie{}@minus{}@tie{}right-margin)} -cuando está sin fijar. Si @code{line-width} está fijado, y tanto -@code{left-margin} como @code{right-margin} están sin fijar, entonces -los márgenes se actualizan para centrar los sistemas automáticamente -sobre la página. Véase también @code{check-consistency}. -Esta variable también se puede fijar dentro de un bloque @code{\layout}. +@item line-width (longitud de la línea) +@funindex line-width -@item left-margin +Cuando se especifica dentro de un bloque @code{\paper}, define las +dimensiones horizontales del espacio disponible para las líneas +del pentagrama en los sistemas sin sangrado por la izquierda. Si +se deja sin especificar, la longitud @code{line-width} del papel +se determina a partir de +@code{(paper-width@tie{}@minus{}@tie{}left-margin@tie{}@minus{}@tie{}right-margin)}. +Si se especifica la longitud @code{line-width} del papel, y no se +especifican el margen izquierdo @code{left-margin} ni el margen +derecho @code{right-margin}, entonces los márgenes se actualizan +de forma que los sistemas se centran automáticamente sobre la +página. Véase también @code{check-consistency}. + +Los valores de @code{line-width} para las partituras individuales +se pueden especificar dentro de los bloques @code{\layout} de las +partituras. Estos valores controlan la longitud de las líneas +producidas partitura a partitura. Si la longitud +@code{line-width} no se especifica para una partitura, su valor +predeterminado es el @code{line-width} del bloque paper. El hecho +de fijar la longitud @code{line-width} de una partitura no tiene +efecto sobre los márgenes del papel. Las líneas del pentagrama, +de una longitud determinada por el valor @code{line-width} de la +partitura, se alinean por la izquierda dentro del área definida +por la longitud @code{line-width} del papel. Si la longitud +@code{line-width} del papel y de la partitura son iguales, las +líneas del pentagrama se extienden exactamente desde el margen +izquierdo hasta el margen derecho, pero si la longitud +@code{line-width} de la partitura es mayor que la +@code{line-width} del papel, las líneas del pentagrama se +imprimirán encima del espacio reservado al margen derecho. + +@item left-margin (margen izquierdo) @funindex left-margin -Margen entre el extremos izquierdo de la página y el comienzo de las -líneas del pentagrama en los sistemas sin sangrado. Si el tamaño del -papel se modifica, el valor predeterminado de esta dimensión se escala -de acuerdo con ello. Si no se fija el valor de @code{left-margin}, y -tanto @code{line-width} como @code{right-margin} están fijados, -entonces se establece el valor de @code{left-margin} a +Margen entre el extremo izquierdo de la página y el comienzo de +las líneas del pentagrama en los sistemas sin sangrado. Si el +tamaño del papel se modifica, el valor predeterminado de esta +dimensión se escala de acuerdo con ello. Si no se fija el valor +de @code{left-margin}, y tanto @code{line-width} como +@code{right-margin} están fijados, entonces se establece el valor +de @code{left-margin} a @code{(paper-width@tie{}@minus{}@tie{}line-width@tie{}@minus{}@tie{}right-margin)}. -Si solamente está fijado @code{line-width}, entonces los dos márgenes -se establecen a -@code{((paper-width@tie{}@minus{}@tie{}line-width)@tie{}/@tie{}2)}, y -como consecuencia los sistemas se centran sobre la página. Véase -también @code{check-consistency}. +Si solamente está fijado @code{line-width}, entonces los dos +márgenes se establecen a +@code{((paper-width@tie{}@minus{}@tie{}line-width)@tie{}/@tie{}2)}, +y como consecuencia los sistemas se centran sobre la página. +Véase también @code{check-consistency}. -@item right-margin +@item right-margin (margen derecho) @funindex right-margin -Margen entre el extremo derecho de la página y el final de las líneas -del pentagrama en sistemas justificados. Si el tamaño de la página se -modifica, el valor predeterminado de esta dimensión se escala de -acuerdo con ello. Si @code{right-margin} está sin fijar, y tanto -@code{line-width} como @code{left-margin} están fijados, el valor de -@code{right-margin} se establece a +Margen entre el extremo derecho de la página y el final de las +líneas del pentagrama en sistemas justificados. Si el tamaño de +la página se modifica, el valor predeterminado de esta dimensión +se escala de acuerdo con ello. Si @code{right-margin} está sin +fijar, y tanto @code{line-width} como @code{left-margin} están +fijados, el valor de @code{right-margin} se establece a @code{(paper-width@tie{}@minus{}@tie{}line-width@tie{}@minus{}@tie{}left-margin)}. Si solamente está fijado @code{line-width}, los dos márgenes se establecen a -@code{((paper-width@tie{}@minus{}@tie{}line-width)@tie{}/@tie{}2)}, y -como consecuencia los sistemas aparecen centrados sobre la página. -Véase también @code{check-consistency}. +@code{((paper-width@tie{}@minus{}@tie{}line-width)@tie{}/@tie{}2)}, +y como consecuencia los sistemas aparecen centrados sobre la +página. Véase también @code{check-consistency}. -@item check-consistency +@item check-consistency (comprobar la consistencia) @funindex check-consistency -Si se establece al valor verdadero, se imprime una advertencia en caso -de que la suma de @code{left-margin}, @code{line-width} y -@code{right-margin} no coincida exactamente con el valor de -@code{paper-width}, y se sustituye cada uno de estos valores (excepto -@code{paper-width}) con su valor predeterminado (escalado al tamaño -del papel si es necesario). Si está fijado al valor falso, se ignora -cualquier inconsistencia y se permite que los sistemas se salgan del -borde del papel. +Si esto es verdadero (su valor predeterminado), se imprime una +advertencia en caso de que la suma de @code{left-margin}, +@code{line-width} y @code{right-margin} no coincida exactamente +con el valor de @code{paper-width}, y se sustituye cada uno de +estos valores (excepto @code{paper-width}) con su valor +predeterminado (escalado al tamaño del papel si es necesario). Si +está fijado al valor falso, se ignora cualquier inconsistencia y +se permite que los sistemas se salgan del borde del papel. -@item ragged-right +@item ragged-right (no justificar por la derecha) @funindex ragged-right -Si está fijado al valor verdadero, los sistemas no cubren el ancho de -la línea. En lugar de ello, los sistemas finalizan en su longitud -horizontal natural. Valor predeterminado: @code{#t} para las -partituras con un solo sistema, y @code{#f} para partituras que tienen -dos o más sistemas. Esta variable también se puede establecer dentro -de un bloque @code{\layout}. +Si está fijado al valor verdadero, los sistemas no cubren el ancho +de la línea. En lugar de ello, los sistemas finalizan en su +longitud horizontal natural. Valor predeterminado: @code{#t} para +las partituras con un solo sistema, y @code{#f} para partituras +que tienen dos o más sistemas. Esta variable también se puede +establecer dentro de un bloque @code{\layout}. -@item ragged-last +@item ragged-last (no justificar el último) @funindex ragged-last -Si está fijado al valor verdadero, el último sistema de la partitura -no llena toda la anchura de la línea. En lugar de ello, el último -sistema finaliza en su longitud horizontal natural. Valor -predeterminado: @code{#f}. Esta variable también puede ajustarse -dentro de un bloque @code{\layout}. +Si está fijado al valor verdadero, el último sistema de la +partitura no llena toda la anchura de la línea. En lugar de ello, +el último sistema finaliza en su longitud horizontal natural. +Valor predeterminado: @code{#f}. Esta variable también puede +ajustarse dentro de un bloque @code{\layout}. @end table @@ -800,9 +802,9 @@ Archivos de inicio: @file{ly/paper-defaults-init.ly}. @knownissues -Los tamaños de papel definidos explícitamente -sobreescriben cualquier ajuste de los márgenes -izquierdo o derecho definidos por el usuario. +Los tamaños de papel definidos explícitamente sobreescriben +cualquier ajuste de los márgenes izquierdo o derecho definidos por +el usuario. @node Variables de paper para el modo de doble cara @@ -814,7 +816,7 @@ Los valores predeterminados (antes del escalado) se definen en @table @code -@item two-sided +@item two-sided (dos caras) @funindex two-sided @cindex encuadernación @@ -825,30 +827,30 @@ Si tiene el valor verdadero, utilizar @code{inner-margin}, márgenes dependiendo de si el número de la página es par o impar. Esto sobreescribe a @code{left-margin} y a @code{right-margin}. -@item inner-margin +@item inner-margin (margen interno) @funindex inner-margin -Margen que todas las páginas tienen en el lado interno si forman parte -de un libro. Si el tamaño del papel se modifica, el valor +Margen que todas las páginas tienen en el lado interno si forman +parte de un libro. Si el tamaño del papel se modifica, el valor predeterminado de esta dimensión se escala de acuerdo con ello. Solamente funciona con @code{two-sided} fijado al valor verdadero. -@item outer-margin +@item outer-margin (margen externo) @funindex outer-margin -Margen que todas las páginas tienen en el lado externo si forman parte -de un libro. Si el tamaño del papel se modifica, el valor +Margen que todas las páginas tienen en el lado externo si forman +parte de un libro. Si el tamaño del papel se modifica, el valor predeterminado de esta dimensión se escala de acuerdo con ello. Solamente funciona con @code{two-sided} fijado al valor verdadero. -@item binding-offset +@item binding-offset (margen de encuadernación) @funindex binding-offset -Medida en que se aumenta @code{inner-margin} para asegurar que no se -oculta nada a causa de la encuadernación. Si el tamaño del papel se -modifica, el valor predeterminado de esta dimensión se escala de -acuerdo con ello. Solamente funciona con @code{two-sided} fijado al -valor verdadero. +Medida en que se aumenta @code{inner-margin} para asegurar que no +se oculta nada a causa de la encuadernación. Si el tamaño del +papel se modifica, el valor predeterminado de esta dimensión se +escala de acuerdo con ello. Solamente funciona con +@code{two-sided} fijado al valor verdadero. @end table @@ -864,35 +866,43 @@ Archivos de inicio: @unnumberedsubsubsec Variables de @code{@bs{}paper} para desplazamientos y sangrados @translationof paper variables for shifts and indents -Los valores predeterminados (antes del escalado) que no se relacionan -aquí están definidos en el archivo @file{ly/paper-defaults-init.ly}. +Los valores predeterminados (antes del escalado) que no se +relacionan aquí están definidos en el archivo +@file{ly/paper-defaults-init.ly}. @table @code -@item horizontal-shift +@item horizontal-shift (desplazamiento horizontal) @funindex horizontal-shift @c This default value is buried in the middle of page.scm. -mp -Medida en que todos los sistemas (incluidos los títulos de cabecera y -los separadores de sistemas) se desplazan a la derecha. +Medida en que todos los sistemas (incluidos los títulos de +cabecera y los separadores de sistemas) se desplazan a la derecha. Predeterminado: @code{0.0}. -@item indent +@item indent (sangrado) @funindex indent Nivel de sangrado para el primer sistema de una partitura. Si se modifica el tamaño del papel, el valor predeterminado de esta -dimensión se escala de acuerdo con ello. Esta variable también se -puede ajustar dentro de un bloque @code{\layout}. +dimensión se escala de acuerdo con ello. El espacio dentro de +@code{line-width} que está disponible para el primer sistema se +reduce en esta cantidad. @code{indent} se puede también +especificar dentro de los bloques @code{\layout} para ajustar los +sangrados partitura a partitura. -@item short-indent +@item short-indent (sangrado reducido) @funindex short-indent -Nivel de sangrado para todos los sistemas de una partitura excepto el -primero. Si el tamaño del papel se modifica, el valor predeterminado -de esta dimensión se escala de acuerdo con ello. Esta variable -también se puede ajustar dentro de un bloque @code{\layout}. +Nivel de sangrado para todos los sistemas de una partitura excepto +el primero. Si el tamaño del papel se modifica, el valor +predeterminado de esta dimensión se escala de acuerdo con ello. +El espacio dentro de @code{line-width} que está disponible para +los sistemas que no son el primero, se reduce en esta cantidad. +También se puede especificar @code{short-indent} dentro de los +bloques @code{\layout} para ajustar los sangrados reducidos +partitura a partitura. @end table @@ -928,31 +938,32 @@ Fragmentos de código: @item max-systems-per-page @funindex max-systems-per-page -Número máximo de sistemas que se colocan sobre una página. Solo está -contemplado por el algoritmo @code{ly:optimal-breaking}. Valor -predeterminado: no fijado. +Número máximo de sistemas que se colocan sobre una página. Solo +está contemplado por el algoritmo @code{ly:optimal-breaking}. +Valor predeterminado: no fijado. @item min-systems-per-page @funindex min-systems-per-page Número mínimo de sistemas que se colocan sobre una página. Puede -causar que las páginas aparezcan atiborradas si el valor es demasiado -grande En el momento actual solo está contemplado por el algoritmo -@code{ly:optimal-breaking}. Valor predeterminado: no fijado. +causar que las páginas aparezcan atiborradas si el valor es +demasiado grande En el momento actual solo está contemplado por el +algoritmo @code{ly:optimal-breaking}. Valor predeterminado: no +fijado. @item systems-per-page @funindex systems-per-page -Número de sistemas que se deben colocar en cada página. En el momento -actual solo está contemplado por el algoritmo +Número de sistemas que se deben colocar en cada página. En el +momento actual solo está contemplado por el algoritmo @code{ly:optimal-breaking}. Valor predeterminado: no fijado. @item system-count @funindex system-count Número de sistemas que utilizar para una partitura. Valor -predeterminado: no fijado. Esta variables también se puede ajustar -dentro de un bloque @code{\layout}. +predeterminado: no fijado. Esta variables también se puede +ajustar dentro de un bloque @code{\layout}. @end table @@ -965,8 +976,8 @@ Referencia de la notación: @unnumberedsubsubsec Variables de @code{@bs{}paper} para los saltos de página @translationof paper variables for page breaking -Los valores predeterminados que no están relacionados aquí, se definen -en el archivo @file{ly/paper-defaults-init.ly} +Los valores predeterminados que no están relacionados aquí, se +definen en el archivo @file{ly/paper-defaults-init.ly} @table @code @@ -975,25 +986,27 @@ en el archivo @file{ly/paper-defaults-init.ly} Algoritmo de saltos de página que utilizar. Se puede elegir entre @code{ly:minimal-breaking}, @code{ly:page-turn-breaking}, -@code{ly:one-line-breaking} y @code{ly:optimal-breaking} -(predeterminado). +@code{ly:one-line-breaking}, +@code{ly:one-line-auto-height-breaking}, y +@code{ly:optimal-breaking} (predeterminado). @item page-breaking-system-system-spacing @funindex page-breaking-system-system-spacing -Engaña a la parte del programa encargada de los saltos de página para -que piense que @code{system-system-spacing} está establecido a un -valor distinto al que tiene realmente. Por ejemplo, si -@code{page-breaking-system-system-spacing #'padding} está establecido -a algo que es mucho mayor que @code{system-system-spacing #'padding}, -entonces el divisor de páginas pone menos sistemas en cada página. -Valor predeterminado: sin ajustar. +Engaña a la parte del programa encargada de los saltos de página +para que piense que @code{system-system-spacing} está establecido +a un valor distinto al que tiene realmente. Por ejemplo, si +@code{page-breaking-system-system-spacing #'padding} está +establecido a algo que es mucho mayor que +@code{system-system-spacing #'padding}, entonces el divisor de +páginas pone menos sistemas en cada página. Valor predeterminado: +sin ajustar. @item page-count @funindex page-count -Número de páginas que utilizar en una partitura, no ajustado de forma -predeterminada. +Número de páginas que utilizar en una partitura, no ajustado de +forma predeterminada. @end table @@ -1025,7 +1038,7 @@ posibilidades. @item blank-page-penalty (penalización por página vacía) @funindex blank-page-penalty -Penalización por tener una página vcía en mitad de una partitura. +Penalización por tener una página vacía en mitad de una partitura. Si @code{blank-page-penalty} es grande y está seleccionado @code{ly:page-turn-breaking}, entonces será menos probable que LilyPond inserte una página en medio de una partitura. En lugar @@ -1061,7 +1074,7 @@ Referencia de la notación: @ref{Saltos de página óptimos}, @ref{Paso de página óptimo}, @ref{Saltos de página mínimos}, -@ref{Saltos de página de una línea}. +@ref{Saltos de página del tipo una-línea}. Archivos de inicio: @file{ly/paper-defaults-init.ly}. @@ -1071,8 +1084,8 @@ Archivos de inicio: @unnumberedsubsubsec Variables de @code{@bs{}paper} para la numeración de las páginas @translationof paper variables for page numbering -Los valores predeterminados que no se relacionan aquí están definidos -en el archivo @file{ly/paper-defaults-init.ly} +Los valores predeterminados que no se relacionan aquí están +definidos en el archivo @file{ly/paper-defaults-init.ly} @table @code @@ -1080,12 +1093,12 @@ en el archivo @file{ly/paper-defaults-init.ly} @item auto-first-page-number @funindex auto-first-page-number -El algoritmo de división de páginas está afectado por el hecho de que -el número de la primera página sea par o impar. Si está establecido -al valor verdadero, el algoritmo de división de páginas decide si -comenzar con un número par o impar. Esto hace que el número de la -primera página se quede como está, o que se aumente en una unidad. -Predeterminado: @code{#f}. +El algoritmo de división de páginas está afectado por el hecho de +que el número de la primera página sea par o impar. Si está +establecido al valor verdadero, el algoritmo de división de +páginas decide si comenzar con un número par o impar. Esto hace +que el número de la primera página se quede como está, o que se +aumente en una unidad. Predeterminado: @code{#f}. @cindex números de página, especificar el primero @item first-page-number @@ -1105,6 +1118,15 @@ primera página. Si está fijado a falso, no se imprimen los números de página. +@cindex números de página, romanos +@item page-number-type +@funindex page-number-type + +Tipo de numeración para las páginas. Entre las posibilidades +están @code{roman-lower} (números romanos en minúsculas), +@code{roman-upper} (números romanos en mayúsculas) y @code{arabic} +(cifras arábigas). Valor predeterminado: @code{'arabic}. + @end table @seealso @@ -1112,10 +1134,10 @@ Archivos de inicio: @file{ly/paper-defaults-init.ly}. @knownissues -Los números de página impares siempre están a la derecha. -Si quiere que la música comience en la página 1 debe haber -una página en blanco en el reverso de la página de cubierta -de manera que la página 1 esté en el lado derecho. +Los números de página impares siempre están a la derecha. Si +quiere que la música comience en la página 1 debe haber una página +en blanco en el reverso de la página de cubierta de manera que la +página 1 esté en el lado derecho. @node Variables de paper diversas @@ -1128,26 +1150,26 @@ de manera que la página 1 esté en el lado derecho. @funindex page-spacing-weight Importancia relativa del espacio (vertical) de las páginas y el -espaciado (horizontal) de las líneas. Los valores altos hacen que el -espaciado de la página tenga más importancia. Predeterminado: +espaciado (horizontal) de las líneas. Los valores altos hacen que +el espaciado de la página tenga más importancia. Predeterminado: @code{10}. @item print-all-headers @funindex print-all-headers Si está fijado a verdadero, imprime todos los encabezamientos para -cada una de las partituras @code{\score} de la salida. Normalmente -sólo se imprimen las variables de encabezamiento @code{piece} y -@code{opus}. Valor predeterminado: @code{#f}. +cada una de las partituras @code{\score} de la salida. +Normalmente sólo se imprimen las variables de encabezamiento +@code{piece} y @code{opus}. Valor predeterminado: @code{#f}. @item system-separator-markup @funindex system-separator-markup -Objeto de marcado que se inserta entre los sistemas. Se suele usar -para partituras orquestales. Predeterminado: sin establecer. El -elemento de marcado @code{\slashSeparator}, definido en el archivo -@file{ly/titling-init.ly}, se aporta como un valor predeterminado -adecuado, por ejemplo: +Objeto de marcado que se inserta entre los sistemas. Se suele +usar para partituras orquestales. Predeterminado: sin establecer. +El elemento de marcado @code{\slashSeparator}, definido en el +archivo @file{ly/titling-init.ly}, se aporta como un valor +predeterminado adecuado, por ejemplo: @lilypond[quote,verbatim,noragged-right,line-width=30\mm] #(set-default-paper-size "a8") @@ -1160,7 +1182,7 @@ adecuado, por ejemplo: tagline = ##f } \score { - \relative c'' { c1 \break c1 \break c1 } + \relative { c''1 \break c1 \break c1 } } } @end lilypond @@ -1175,17 +1197,17 @@ Fragmentos de código: @rlsr{Spacing}. @knownissues -El encabezamiento de página predeterminado pone el número de página y -el campo @code{instrument} del bloque @code{\header} sobre la misma -línea. +El encabezamiento de página predeterminado pone el número de +página y el campo @code{instrument} del bloque @code{\header} +sobre la misma línea. @node Disposición de la partitura @section Disposición de la partitura @translationof Score layout -Esta sección trata de las opciones de disposición de la partitura para -el bloque @code{\layout}. +Esta sección trata de las opciones de disposición de la partitura +para el bloque @code{\layout}. @menu * El bloque layout:: @@ -1200,14 +1222,15 @@ el bloque @code{\layout}. @funindex \layout Así como el bloque @code{\paper} contiene ajustes relativos al -formateo de la página para todo el documento, el bloque @code{\layout} -contiene ajustes para la disposición específica de las partituras. -Para fijar las opciones de disposición de partituras de forma global, -escríbalas en un bloque @code{\layout} del nivel jerárquico superior. -Para fijar opciones de disposición para una partitura individual -escríbalas dentro de un bloque @code{\layout} dentro del bloque -@code{\score}, después de la música. Entre los ajustes que pueden -aparecer en un bloque @code{\layout} se encuentran los siguientes: +formateo de la página para todo el documento, el bloque +@code{\layout} contiene ajustes para la disposición específica de +las partituras. Para fijar las opciones de disposición de +partituras de forma global, escríbalas en un bloque @code{\layout} +del nivel jerárquico superior. Para fijar opciones de disposición +para una partitura individual escríbalas dentro de un bloque +@code{\layout} dentro del bloque @code{\score}, después de la +música. Entre los ajustes que pueden aparecer en un bloque +@code{\layout} se encuentran los siguientes: @itemize @item la función de Scheme @code{layout-set-staff-size}, @@ -1217,17 +1240,20 @@ aparecer en un bloque @code{\layout} se encuentran los siguientes: La función @code{layout-set-staff-size} se estudia en la sección siguiente, @ref{Establecer el tamaño del pentagrama}. Las -modificaciones de contexto se estudian en un capítulo distinto; véase -@ref{Modificar los complementos (plug-ins) de contexto} y -@ref{Cambiar los valores por omisión de los contextos}. Las variables de -@code{\paper} que pueden aparecer dentro de un bloque @code{\layout} -son: +modificaciones de contexto se estudian en un capítulo distinto; +véase @ref{Modificar los complementos (plug-ins) de contexto} y +@ref{Cambiar los valores por omisión de los contextos}. + +Las variables de @code{\paper} que pueden aparecer dentro de un +bloque @code{\layout}, y cuyos valores predeterminados se toman +del bloque @code{paper}, son: @itemize @item -@code{line-width}, @code{ragged-right} y @code{ragged-last} -(véase @ref{Variables de paper para la anchura y los márgenes,,Variables de @code{@bs{}paper} para la anchura y los márgenes}) +@code{line-width}, @code{ragged-right} y @code{ragged-last} (véase +@ref{Variables de paper para la anchura y los márgenes,,Variables +de @code{@bs{}paper} para la anchura y los márgenes}) @item @code{indent} y @code{short-indent} @@ -1256,16 +1282,17 @@ He aquí un ejemplo de un bloque @code{\layout}: @} @end example -Se pueden escribir varios bloques @code{\layout} como expresiones del -nivel superior. Esto puede ser útil, por ejemplo, si hay distintos -ajustes almacenados en diversos archivos y se incluyen opcionalmente. -Internamente, cuando se evalúa un bloque @code{\layout}, se hace una -copia de la configuración de @code{\layout} actual, y después se -aplican los cambios definidos en el bloque; el resultado se guarda -como la nueva configuración actual. Desde el punto de vista del -usuario, los bloques @code{\layout} se combinan, pero en situaciones -de conflicto (cuando se cambia la misma propiedad en diferentes -bloques) las definiciones más tarías toman precedencia. +Se pueden escribir varios bloques @code{\layout} como expresiones +del nivel superior. Esto puede ser útil, por ejemplo, si hay +distintos ajustes almacenados en diversos archivos y se incluyen +opcionalmente. Internamente, cuando se evalúa un bloque +@code{\layout}, se hace una copia de la configuración de +@code{\layout} actual, y después se aplican los cambios definidos +en el bloque; el resultado se guarda como la nueva configuración +actual. Desde el punto de vista del usuario, los bloques +@code{\layout} se combinan, pero en situaciones de conflicto +(cuando se cambia la misma propiedad en diferentes bloques) las +definiciones más tarías toman precedencia. Por ejemplo: si este bloque: @@ -1280,13 +1307,14 @@ Por ejemplo: si este bloque: @end example se coloca después del del ejemplo anterior, las sobreescrituras de -@code{'padding} y de @code{'color} para @code{TextScript} se combinan, -pero la última sobreescritura @code{'thickness} para @code{Glissando} -sustituye (u oculta) a la anterior. +@code{'padding} y de @code{'color} para @code{TextScript} se +combinan, pero la última sobreescritura @code{'thickness} para +@code{Glissando} sustituye (u oculta) a la anterior. Los bloques @code{\layout} se pueden asignar a variables para una -reutilización posterior, pero la forma en que esto funciona es ligera -y significativamente diferente del hecho de escribirlas literalmente. +reutilización posterior, pero la forma en que esto funciona es +ligera y significativamente diferente del hecho de escribirlas +literalmente. Si se define una variable de la siguiente manera: @@ -1301,10 +1329,11 @@ variable_de_Layout = \layout @{ guardará la configuración actual de @code{\layout} con la sobreescritura añadida de @code{NoteHead.font-size}, pero esta -combinación @emph{no} se guarda como la nueva configuración actual. -Tenga en cuenta que la @q{configuración actual} se lee cuando la -variable se define y no cuando se usa, de manera que el contenido de -la variable depende de su posición dentro del código fuente. +combinación @emph{no} se guarda como la nueva configuración +actual. Tenga en cuenta que la @q{configuración actual} se lee +cuando la variable se define y no cuando se usa, de manera que el +contenido de la variable depende de su posición dentro del código +fuente. La variable se puede entonces usar dentro de otro bloque @code{\layout}, por ejemplo: @@ -1319,19 +1348,20 @@ La variable se puede entonces usar dentro de otro bloque @} @end example -Un bloque @code{\layout} que contiene una variable, como en el ejemplo -anterior, @emph{no} copia la configuración actual, sino que en lugar -de ello usa el contenido de @code{\variable_de_layout} como la -configuración base para las adiciones posteriores. Esto significa que -cualquier cambio definido entre la definición y el uso de la variable, -se pierde. +Un bloque @code{\layout} que contiene una variable, como en el +ejemplo anterior, @emph{no} copia la configuración actual, sino +que en lugar de ello usa el contenido de +@code{\variable_de_layout} como la configuración base para las +adiciones posteriores. Esto significa que cualquier cambio +definido entre la definición y el uso de la variable, se pierde. Si la @code{variable_de_layout} se define (o se incluye con -@code{\include}) inmediatamente antes de que se utilice, su contenido -es sencillamente la configuración en curso más las sobreescrituras que -se hayan definido dentro de él. Así pues, en el ejemplo anterior que -muestra el uso de @code{\variable_de_layout} el último bloque -@code{\layout} consistiría en: +@code{\include}) inmediatamente antes de que se utilice, su +contenido es sencillamente la configuración en curso más las +sobreescrituras que se hayan definido dentro de él. Así pues, en +el ejemplo anterior que muestra el uso de +@code{\variable_de_layout} el último bloque @code{\layout} +consistiría en: @example TextScript.padding = #1 @@ -1343,18 +1373,19 @@ muestra el uso de @code{\variable_de_layout} el último bloque más las sobreescrituras de @code{indent} y de @code{StaffGrouper}. -Pero si la variable ya hubiera sido definida antes del primer bloque -@code{\layout} la configuración actual contendría ahora solamente +Pero si la variable ya hubiera sido definida antes del primer +bloque @code{\layout} la configuración actual contendría ahora +solamente @example NoteHead.font-size= #4 % (escrita en la definición de la variable) NoteHead.color = #red % (añadida después del uso de la variable) @end example -Si se planifica cuidadosamente, las variables de @code{\layout} pueden -ser una herramienta valiosa para estructurar el diseño de la -disposición de las fuentes, y tambiién para reiniciar la configuración -de @code{\layout} a un estado conocido. +Si se planifica cuidadosamente, las variables de @code{\layout} +pueden ser una herramienta valiosa para estructurar el diseño de +la disposición de las fuentes, y tambiién para reiniciar la +configuración de @code{\layout} a un estado conocido. @seealso Referencia de la notación: @@ -1371,97 +1402,108 @@ Fragmentos de código: @cindex tipografía, fijar el tamaño de @cindex pentagrama, fijar el tamaño de @funindex disposición, archivo de +@funindex magnification->font-size +@funindex magstep +@funindex set-global-staff-size +@funindex layout-set-staff-size -El @strong{tamaño de pentagrama} predeterminado se establece en 20 -puntos. Esto se puede modificar de dos maneras: -Para establecer globalmente el tamaño del pentagrama para todas las -partituras de un archivo (o en un bloque @code{book}, para ser -exactos), utilice @code{set-global-staff-size}. +El @strong{tamaño de pentagrama} predeterminado es de 20 puntos, +que corresponde a una altura del pentagrama de 7.03 mm (un punto +es 100/7227 de pulgada, o 2540/7227 mm). El tamaño del pentagrama +se puede modificar de tres formas: + +@enumerate + +@item +Para establecer globalmente el tamaño del pentagrama para todas +las partituras de un archivo (o en un bloque @code{\book}, para +ser exactos), utilice @code{set-global-staff-size}: @example #(set-global-staff-size 14) @end example @noindent -Esto establece el tamaño global predeterminado a una altura de -pentagrama de 14pt y escala todas las tipografías según corresponda. +El ejemplo de arriba establece el tamaño global predeterminado del +pentagrama a 14 pt (4.92 mm) y escala todas las tipografías según +corresponda. + +@item +Para fijar el tamaño del pentagrama para una sola partitura dentro +de un libro, use @code{layout-set-staff-size} dentro del bloque +@code{\layout} de dicha partitura: -Para establecer el tamaño del pentagrama de forma individual para cada -partitura, use @example -\score@{ +\score @{ @dots{} \layout @{ - #(layout-set-staff-size 15) + #(layout-set-staff-size 14) @} @} @end example -La fuente tipográfica Feta ofrece símbolos musicales a ocho tamaños -distintos. Cada fuente tipográfica está afinada para un tamaño de -pentagrama distinto: a un tamaño menor la tipografía se vuelve más -pesada, para que coincida con las líneas de pentagrama relativamente -más gruesas. Los tamaños de tipografía recomendados están -relacionados en la tabla siguiente: +@item +Para fijar el tamaño del pentagrama para una sola pauta dentro de +un sistema, use la instrucción @code{\magnifyStaff}. Por ejemplo, +las partituras de música de cámara editadas de la forma +tradicional, con piano, usan habitualmente pautas de 7 mm para el +piano, mientras que los otros pentagramas suelen estar entre 3/5 y +5/7 de reducción (entre el 60% y el 71%). Para obtener la +proporción de 5/7, escriba: -@quotation -@multitable @columnfractions .15 .2 .22 .2 +@example +\score @{ + << + \new Staff \with @{ + \magnifyStaff #5/7 + @} @{ @dots{} @} + \new PianoStaff @{ @dots{} @} + >> +@} +@end example -@item @b{nombre de la fuente} -@tab @b{altura del pentagrama (pt)} -@tab @b{altura del pentagrama (mm)} -@tab @b{usos} - -@item feta11 -@tab 11.22 -@tab 3.9 -@tab partituras de bolsillo - -@item feta13 -@tab 12.60 -@tab 4.4 -@tab - -@item feta14 -@tab 14.14 -@tab 5.0 -@tab - -@item feta16 -@tab 15.87 -@tab 5.6 -@tab - -@item feta18 -@tab 17.82 -@tab 6.3 -@tab cancioneros - -@item feta20 -@tab 20 -@tab 7.0 -@tab particellas estándar - -@item feta23 -@tab 22.45 -@tab 7.9 -@tab - -@item feta26 -@tab 25.2 -@tab 8.9 -@tab -@c modern rental material? +En caso de que usted sepa qué tamaño de @code{fontSize} quiere +usar, puede emplear la forma siguiente: -@end multitable -@end quotation +@example +\score @{ + << + \new Staff \with @{ + \magnifyStaff #(magstep -3) + @} @{ @dots{} @} + \new PianoStaff @{ @dots{} @} + >> +@} +@end example + +Para imitar la apariencia de las ediciones tradicionales, es mejor +evitar reducir el grosor de las líneas del pentagrama. + +@end enumerate + + +@subheading Peso automático de la tipografía a distintos tamaños -Estas tipografías están disponibles en cualquier tamaño. La propiedad -de contexto @code{fontSize} y la propiedad de disposición -@code{staff-space} (en @rinternals{StaffSymbol}) se pueden usar para -afinar el tamaño de los pentagramas individuales. Los tamaños de -pentagrama individuales están en relación al tamaño global. +La fuente tipográfica Feta ofrece símbolos musicales a ocho +tamaños distintos. Cada fuente tipográfica está afinada para un +tamaño de pentagrama distinto: a un tamaño menor la tipografía se +vuelve más pesada, para que coincida con las líneas de pentagrama +relativamente más gruesas. Los tamaños de tipografía recomendados +están relacionados en la tabla siguiente: + +@multitable @columnfractions .15 .2 .22 .2 + +@item @b{nombre de la fuente} @tab @b{altura del pentagrama (pt)} @tab @b{altura del pentagrama (mm)} @tab @b{usos} +@item feta11 @tab 11.22 @tab 3.9 @tab partituras de bolsillo +@item feta13 @tab 12.60 @tab 4.4 @tab +@item feta14 @tab 14.14 @tab 5.0 @tab +@item feta16 @tab 15.87 @tab 5.6 @tab +@item feta18 @tab 17.82 @tab 6.3 @tab cancioneros +@item feta20 @tab 20 @tab 7.0 @tab particellas estándar +@item feta23 @tab 22.45 @tab 7.9 @tab +@item feta26 @tab 25.2 @tab 8.9 @tab @c modern rental material? +@end multitable @seealso Referencia de la notación: @@ -1471,8 +1513,8 @@ Fragmentos de código: @rlsr{Spacing}. @knownissues -@code{layout-set-staff-size} no cambia la distancia entre las líneas -del pentagrama. +@code{layout-set-staff-size} no cambia la distancia entre las +líneas del pentagrama. @node Saltos @@ -1482,12 +1524,6 @@ del pentagrama. @menu * Saltos de línea:: * Saltos de página:: -* Saltos de página óptimos:: -* Paso de página óptimo:: -* Saltos de página mínimos:: -* Saltos de página de una línea:: -* Saltos de línea explícitos:: -* Utilizar una voz adicional para los saltos de línea:: @end menu @@ -1495,83 +1531,114 @@ del pentagrama. @subsection Saltos de línea @translationof Line breaking +@funindex \break +@funindex \noBreak +@funindex \autoBreaksOff +@funindex \autoBreaksOn +@funindex \autoLineBreaksOff +@funindex \autoLineBreaksOn @cindex saltos de línea @cindex línea, saltos de Normalmente los saltos de línea se determinan automáticamente. Se eligen de forma que las líneas no aparezcan demasiado apretadas ni -demasiado sueltas, y que las líneas consecutivas tengan una densidad -similar. +demasiado sueltas, y que las líneas consecutivas tengan una +densidad similar. -Para forzar manualmente un salto de línea sobre la línea divisoria, -utilice la instrucción @code{\break}: +Para forzar manualmente un salto de línea sobre la línea +divisoria, utilice la instrucción @code{\break}: -@lilypond[quote,ragged-right,relative=2,verbatim] -c4 c c c | \break -c4 c c c | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c c | \break + c4 c c c | +} @end lilypond -De forma predeterminada se ignora cualquier @code{\break} en la mitad -de un compás, y se imprime una advertencia. Para forzar un salto de -línea en medio de un compás, añada una barra de compás invisible con -@w{@samp{\bar ""}}: +De forma predeterminada se ignora cualquier instrucción +@code{\break} insertada en la mitad de un compás, y se imprime un +mensaje de advertencia durante la compilación del archivo de +entrada de LilyPond. Para forzar un salto de línea en medio de un +compás, añada una línea divisoria invisible con @w{@samp{\bar +""}}: -@lilypond[quote,ragged-right,relative=2,verbatim] -c4 c c -\bar "" \break -c | -c4 c c c | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c + \bar "" + \break + c | + c4 c c c | +} @end lilypond -También se ignora un @code{\break} que se produce en la línea -divisoria si el compás anterior termina en medio de una nota, como -cuando un grupo de valoración especial inicia y termina en compases -diferentes. Para permitir que las instrucciones @code{\break} -funcionen en estas situaciones, elimine el grabador -@code{Forbid_line_break_engraver} del contexto @code{Voice}. Observe -que los saltos de línea forzados manualmente se deben añadir en -paralelo con la música: +También se ignora cualquier instrucción @code{\break} que se +produzca en la línea divisoria si el compás anterior termina en +medio de una nota, como cuando un grupo de valoración especial +comienza en un compás y termina en otro distinto. En este caso, +elimine el grabador @code{Forbid_line_break_engraver} del contexto +@code{Voice} y use una construcción de música simultánea +insertando el @code{break} en el lugar adecuado dentro de la +segunda voz: @lilypond[quote,ragged-right,verbatim] \new Voice \with { \remove "Forbid_line_break_engraver" -} \relative c'' { +} \relative { << - { c2. \tuplet 3/2 { c4 c c } c2. | } + { c''2. \tuplet 3/2 { c4 c c } c2. | } { s1 | \break s1 | } >> } @end lilypond -De forma similar, los saltos de línea están normalmente prohibidos -cuando hay barras de corchea que cruzan la línea divisoria. Se -puede cambiar este comportamiento fijando -@code{\override Beam.breakable = ##t}: +De forma similar, el funcionamiento predeterminado es que los +saltos de línea resulten ignorados cuando hay barras de corchea +que cruzan la línea divisoria. Utilice la instrucción +@code{\override Beam.breakable = ##t} para forzar esto: -@lilypond[quote,ragged-right,relative=2,verbatim] -\override Beam.breakable = ##t -c2. c8[ c | \break -c8 c] c2. | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \override Beam.breakable = ##t + c2. c8[ c | \break + c8 c] c2. | +} @end lilypond -La instrucción @code{\noBreak}, prohíbe un salto de línea en -la barra divisoria en que se inserta. - -Los ajustes más básicos que influyen sobre el espaciado de las líneas -son @code{indent} y @code{line-width}. Se establecen dentro del bloque -@code{\layout}. Controlan el sangrado de la primera línea de música, -y la longitud de las líneas. +La instrucción @code{\noBreak}, evita que se produzca +un salto de línea en la barra divisoria en que se inserta. + +Dentro de una partitura, se evitan los saltos de línea automáticos +dento de la música que se encuentra entre las instrucciones +@code{\autoLineBreaksOff} y @code{\autoLineBreaksOn}. Si también +se quieren evitar los saltos de página automáticos, deben usarse +las instrucciones @code{\autoBreaksOff} y @code{\autoBreaksOn}. +Los saltos manuales no están afectados por estas instrucciones. +Observe que el hecho de inhibir los saltos de línea automáticos +puede hacer que la música se extienda sobre el margen derecho +cuandoquiera que no cabe completamente dentro de una sola línea. + +Los saltos automáticos de línea (no de página) se pueden habilitar +sobre líneas divisorias individuales mediante el uso de +@code{\once \autoLineBreaksOn} en una barra. La instrucción +identifica un salto de línea permitido, en lugar de uno prohibido. + +Los ajustes más básicos que influyen sobre el espaciado de las +líneas son @code{indent} y @code{line-width}. Se establecen dentro +del bloque @code{\layout}. Controlan el sangrado de la primera +línea de música, y la longitud de las líneas. Si se establece @code{ragged-right} a verdadero en el bloque @code{\layout}, los sistemas terminan en su longitud horizontal -natural, en lugar de distribuirse horizontalmente para llenar toda la -línea. Esto es de utilidad para fragmentos cortos, y para efectuar una -comprobación de lo apretado que es el espaciado natural. +natural, en lugar de distribuirse horizontalmente para llenar toda +la línea. Esto es de utilidad para fragmentos cortos, y para +efectuar una comprobación de lo apretado que es el espaciado +natural. @c TODO Check and add para on default for ragged-right -La opción @code{ragged-last} es similar a @code{ragged-right}, pero -afecta sólo a la última línea de la pieza. +La opción @code{ragged-last} es similar a @code{ragged-right}, +pero afecta sólo a la última línea de la pieza. @example \layout @{ @@ -1602,15 +1669,23 @@ compases, y sólo en dichos lugares: @predefined -@funindex \break @code{\break}, -@funindex \noBreak -@code{\noBreak}. +@code{\noBreak}, +@code{\autoBreaksOff}, +@code{\autoBreaksOn}, +@code{\autoLineBreaksOff}, +@code{\autoLineBreaksOn}. @endpredefined +@snippets + +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{using-an-extra-voice-for-breaks.ly} + @seealso Referencia de la notación: -@ref{Variables de paper para los saltos de línea,,Variables de @code{@bs{}paper} para los saltos de línea}. +@ref{Variables de paper para los saltos de línea}, +@ref{The layout block}. Fragmentos de código: @rlsr{Spacing}. @@ -1618,37 +1693,77 @@ Fragmentos de código: Referencia de funcionamiento interno: @rinternals{LineBreakEvent}. +@knownissues + +Si se escribe @code{\autoLineBreaksOff} o @code{\autoBreaksOff} +antes de cualquier contenido musical, aparecerán mensajes de +error. Escriba siempre estas instrucciones después de algo de +música. + @node Saltos de página @subsection Saltos de página @translationof Page breaking -Se puede sobreescribir el mecanismo predeterminado de salto de página -insertando instrucciones @code{\pageBreak} o @code{\noPageBreak}. -Estas instrucciones son análogas a @code{\break} y @code{\noBreak}. -Se deben insertar en una línea divisoria. Estas instrucciones fuerzan -y prohíben, respectivamente, la eventualidad de un salto de página. -Por supuesto, la instrucción @code{\pageBreak} también fuerza un salto -de línea. - -Las instrucciones @code{\pageBreak} y @code{\noPageBreak} también se -pueden insertar en el nivel más alto, entre las partituras y los -elementos de marcado situados en el nivel superior. - -Hay ajustes análogos a @code{ragged-right} y @code{ragged-last} que -tienen el mismo efecto sobre el espaciado vertical: -@code{ragged-bottom} y @code{ragged-last-bottom}. Si están -establecidos a @code{#t} los sistemas de todas las páginas o sólo de -la última página, respectivamente, no se verán justificados -verticalmente. Véase +Esta sección describe los distintos métodos para crear saltos de +página, y cómo modificarlos. + +@menu +* Saltos de página manuales:: +* Saltos de página óptimos:: +* Saltos de página mínimos:: +* Saltos de página del tipo una-línea:: +* Saltos de página del tipo una-línea-altura-automática:: +* Paso de página óptimo:: +@end menu + + +@node Saltos de página manuales +@unnumberedsubsubsec Saltos de página manuales +@translationof Manual page breaking + +@funindex \pageBreak +@funindex \noPageBreak +@funindex \autoPageBreaksOn +@funindex \autoPageBreaksOff +@cindex página, saltos manuales + +Se puede sobreescribir el mecanismo predeterminado de salto de +página insertando instrucciones @code{\pageBreak} o +@code{\noPageBreak}. Estas instrucciones son análogas a +@code{\break} y @code{\noBreak}. Se deben insertar en una línea +divisoria. Estas instrucciones fuerzan y prohíben, +respectivamente, la eventualidad de un salto de página en dicha +línea divisoria. Por supuesto, la instrucción @code{\pageBreak} +también fuerza un salto de línea. + +Las instrucciones @code{\pageBreak} y @code{\noPageBreak} también +se pueden insertar en el nivel más alto, entre las partituras y +los elementos de marcado situados en el nivel superior. + +Dentro de una partitura, no se producen saltos de página +automáticos en el interior de la música que se encuentra entre las +instrucciones @code{\autoPageBreaksOff} y +@code{\autoPageBreaksOn}. Los saltos de página manuales no +reultan afectados por estas instrucciones. + +Hay ajustes análogos a @code{ragged-right} y @code{ragged-last} +que tienen el mismo efecto sobre el espaciado vertical. Si +@code{ragged-bottom} se establece a @code{#t} los sistemas no se +justifican verticalmente. Cuando el valor de +@code{ragged-last-bottom} se fija a @code{#t}, como lo está de +forma predeterminada, se permite una separación al final de la +última página (o la última página de cada uno de las partes de +libro @code{\bookpart}). Véase @ref{Variables de espaciado de paper verticales fijas,,Variables de espaciado de @code{@bs{}paper} verticales fijas}. Los saltos de página se calculan por medio de la función -@code{page-breaking}. LilyPond ofrece tres algoritmos para el cómputo -de los saltos de página: @code{ly:optimal-breaking}, -@code{ly:page-turn-breaking} y @code{ly:minimal-breaking}. El -predeterminado es @code{ly:optimal-breaking}, pero el valor se puede -cambiar en el bloque @code{\paper}: +@code{page-breaking}. LilyPond ofrece varios algoritmos para el +cómputo de los saltos de página, entre ellos +@code{ly:optimal-breaking}, @code{ly:page-turn-breaking} y +@code{ly:minimal-breaking}. El predeterminado es +@code{ly:optimal-breaking}, pero el valor se puede cambiar en el +bloque @code{\paper}: @example \paper @{ @@ -1658,14 +1773,14 @@ cambiar en el bloque @code{\paper}: @funindex \bookpart -Cuando un libro tiene muchas partituras y páginas, puede ser difícil -resolver el problema de los saltos de página, necesitando mucha -memoria y prolongados tiempos de procesamiento. Para facilitar el -proceso de división en páginas, se usan los bloques @code{\bookpart} -para dividir el libro en varias partes: los saltos de página se -producen de manera independiente en cada parte. También se pueden -usar diferentes funciones de división en páginas para las distintas -partes del libro. +Cuando un libro tiene muchas partituras y páginas, puede ser +difícil resolver el problema de los saltos de página, necesitando +mucha memoria y prolongados tiempos de procesamiento. Para +facilitar el proceso de división en páginas, se usan los bloques +@code{\bookpart} para dividir el libro en varias partes: los +saltos de página se producen de manera independiente en cada +parte. También se pueden usar diferentes funciones de división en +páginas para las distintas partes del libro. @example \bookpart @{ @@ -1691,30 +1806,41 @@ partes del libro. @} @end example + @predefined @funindex \pageBreak @code{\pageBreak}, -@funindex \noPageBreak -@code{\noPageBreak}. +@code{\noPageBreak}, +@code{\autoPageBreaksOn}, +@code{\autoPageBreaksOff}. @endpredefined @seealso Referencia de la notación: -@ref{Variables de paper para los saltos de página,,Variables de @code{@bs{}paper} para los saltos de página}. +@ref{Variables de paper para los saltos de página}. Fragmentos de código: @rlsr{Spacing}. +@knownissues + +El prefijo @code{\once} no es efectivo con +@code{\autoPageBreaksOn} y @code{\autoPageBreaksOff}. Si se ha +desactivado la división automática de páginas y después se vuelve +a activar para permitir un salto, debe continuar activada durante +algunos compases (cuyo número exacto dependerá de la partitura) +antes de volverse a desactivar, pues en caso contrario podría +perderse la oportunidad de que el salto se produzca. @node Saltos de página óptimos -@subsection Saltos de página óptimos +@unnumberedsubsubsec Saltos de página óptimos @translationof Optimal page breaking @funindex ly:optimal-breaking -La función @code{ly:optimal-breaking} es el método predeterminado de -LilyPond para determinar los saltos de página. Intenta hallar una -división de páginas que haga mínimos el apretujamiento y la +La función @code{ly:optimal-breaking} es el método predeterminado +de LilyPond para determinar los saltos de página. Intenta hallar +una división de páginas que haga mínimos el apretujamiento y la distensión, tanto horizontal como verticalmente. A diferencia de @code{ly:page-turn-breaking}, no tiene un concepto de los pasos de página. @@ -1724,51 +1850,119 @@ Fragmentos de código: @rlsr{Spacing}. +@node Saltos de página mínimos +@unnumberedsubsubsec Saltos de página mínimos +@translationof Minimal page breaking + +@funindex ly:minimal-breaking + +La función @code{ly:minimal-breaking} efectúa unos cálculos +mínimos para determinar los saltos de página: completa una página +con tantos sistemas como sea posible antes de continuar con la +siguiente. Así, puede preferirse para partituras con muchas +páginas, donde las otras funciones de salto de página pueden +resultar demasiado lentas o ávidas de memoria, o con una gran +cantidad de textos. Se habilita utilizando: + +@example +\paper @{ + page-breaking = #ly:minimal-breaking +@} +@end example + +@seealso +Snippets: +@rlsr{Spacing}. + + +@node Saltos de página del tipo una-línea +@unnumberedsubsubsec Saltos de página del tipo una-línea +@translationof One-line page breaking + +@funindex ly:one-line-breaking + +La función @code{ly:one-line-breaking} es un algoritmo de saltos +de página para uso especial que pone cada partitura en una página +y en una sola línea. Esta función de salto de página no compone +los títulos ni los márgenes; solamente se imprime la partitura. + +El ancho de la página se ajusta de forma que la partitura más +larga quepa en una línea. Concretamente, las variables +@code{paper-width}, @code{line-width} y @code{indent} del bloque +@code{\paper} se ignoran, aunque @code{left-margin} y +@code{right-margin} aún se respetan. La altura de la página se +deja sin cambios. + + +@node Saltos de página del tipo una-línea-altura-automática +@unnumberedsubsubsec Saltos de página del tipo una-línea-altura-automática +@translationof One-line-auto-height page breaking + +@funindex ly:one-line-auto-height-breaking + +La función @code{ly:one-line-auto-height-breaking} funciona igual +que @code{ly:one-line-breaking} excepro que la altura de la página +se modifica automáticamente para hacerse corresponder con la +altura de la música. De forma específica, la variable +@code{paper-height} del bloque @code{\paper} se ajusta de tal +manera que abarca los extremos superior e inferior de la partitura +más alta más los márgenes superior e inferior @code{top-margin} y +@code{bottom-margin}. + +Observe que el ajuste @code{top-system-spacing} afecta a la +posición vertical de la música. Fíjelo al valor @code{##f} dentro +de un bloque @code{paper} para disponer la música sencillamente +entre los márgenes superior e inferior. + + @node Paso de página óptimo -@subsection Paso de página óptimo +@unnumberedsubsubsec Paso de página óptimo @translationof Optimal page turning @funindex ly:page-turn-breaking -Con frecuencia es necesario encontrar una configuración de división de -páginas de manera que haya un silencio al final de una página de cada -dos. De esta forma, el músico puede pasar la página sin perder notas. -La función @code{ly:page-turn-breaking} trata de encontrar una -división de páginas que haga mínimos el apretujamiento y el -estiramiento, pero con la restricción añadida de que sólo se permite -introducir vueltas de página en los lugares especificados. - -Hay dos etapas en el uso de esta función de división de páginas. En -primer lugar debemos habilitarlo en el bloque @code{\paper}, como se -explicó en @ref{Saltos de página}. Entonces debemos decirle a la función -dónde nos gustaría permitir los saltos de página. +Con frecuencia es necesario encontrar una configuración de +división de páginas de manera que haya un silencio al final de una +página de cada dos. De esta forma, el músico puede pasar la +página sin perder notas. La función @code{ly:page-turn-breaking} +trata de encontrar una división de páginas que haga mínimos el +apretujamiento y el estiramiento, pero con la restricción añadida +de que sólo se permite introducir vueltas de página en los lugares +especificados. + +Hay dos etapas en el uso de esta función de división de páginas. +En primer lugar debemos habilitarlo en el bloque @code{\paper}, +como se explicó en @ref{Saltos de página}. Entonces debemos +decirle a la función dónde nos gustaría permitir los saltos de +página. Hay dos formas de conseguir la segunda tarea. Primero, podemos -especificar manualmente cada uno de los pasos de página potenciales, -insertando @code{\allowPageTurn} en nuestro archivo de entrada en los -lugares adecuados. +especificar manualmente cada uno de los pasos de página +potenciales, insertando @code{\allowPageTurn} en nuestro archivo +de entrada en los lugares adecuados. Si esto es demasiado tedioso, podemos añadir un grabador -@code{Page_turn_engraver} a un contexto Staff o Voice. El grabador -@code{Page_turn_engraver} analizará el contexto en busca de secciones -sin notas (observe que no busca silencios, sino la ausencia de notas. -Se hace así para que la polifonía en un solo pentagrama con silencios -en una de las voces no arruine la labor del grabador -@code{Page_turn_engraver}). Cuando encuentra una sección sin notas -suficientemente larga, el grabador @code{Page_turn_engraver} inserta -un @code{\allowPageTurn} en la última barra de compás de dicha -sección, a no ser que haya una barra @q{especial} de compás (como una -doble barra), en cuyo caso se insertará el @code{\allowPageTurn} en la -última barra @q{especial} de compás de la sección. +@code{Page_turn_engraver} a un contexto Staff o Voice. El +grabador @code{Page_turn_engraver} analizará el contexto en busca +de secciones sin notas (observe que no busca silencios, sino la +ausencia de notas. Se hace así para que la polifonía en un solo +pentagrama con silencios en una de las voces no arruine la labor +del grabador @code{Page_turn_engraver}). Cuando encuentra una +sección sin notas suficientemente larga, el grabador +@code{Page_turn_engraver} inserta un @code{\allowPageTurn} en la +última barra de compás de dicha sección, a no ser que haya una +barra @q{especial} de compás (como una doble barra), en cuyo caso +se insertará el @code{\allowPageTurn} en la última barra +@q{especial} de compás de la sección. @funindex minimumPageTurnLength El grabador @code{Page_turn_engraver} lee la propiedad de contexto -@code{minimumPageTurnLength} para determinar qué longitud debe tener -una sección sin notas antes de que se considere la posibilidad de un -paso de página. El valor predeterminado para +@code{minimumPageTurnLength} para determinar qué longitud debe +tener una sección sin notas antes de que se considere la +posibilidad de un paso de página. El valor predeterminado para @code{minimumPageTurnLength} es @code{(ly:make-moment 1/1)}. Si -quiere inhabilitar las vueltas de página, puede establecerlo a algún -valor muy grande. +quiere inhabilitar las vueltas de página, fíjelo a algún valor +@q{muy grande}. @example \new Staff \with @{ \consists "Page_turn_engraver" @} @@ -1785,20 +1979,23 @@ valor muy grande. @end example @funindex minimumRepeatLengthForPageTurn -El grabador @code{Page_turn_engraver} detecta las repeticiones de -primera y segunda vez. Sólo permite un pase de página durante la -repetición si hay suficiente tiempo al principio y al final de la -repetición para volver a pasar la página hacia atrás. El grabador -@code{Page_turn_engraver} también puede inhabilitar los pasos de -página si la repetición es muy corta. Si establecemos la propiedad de -contexto @code{minimumRepeatLengthForPageTurn} entonces el grabador -@code{Page_turn_engraver} sólo permitirá los pases de página en las -repeticiones cuya duración sea mayor que este valor. + +Al usar repeticiones de primera y segunda vez, el grabador +@code{Page_turn_engraver} solo permite un pase de página durante +la repetición si hay suficiente tiempo al principio y al final de +la repetición para volver a pasar la página hacia atrás. Si la +repetición es demasiado corta, se puede usar el grabador +@code{Page_turn_engraver} para @emph{inhabilitar} los pasos de +página mediante el establecimiento de un valor adecuado para la +propiedad de contexto @code{minimumRepeatLengthForPageTurn}. En +este caso el grabador @code{Page_turn_engraver} sólo permitirá los +pases de página en las repeticiones cuya duración sea mayor que el +valor especificado. Las instrucciones de paso de página, @code{\pageTurn}, -@code{\noPageTurn} y @code{\allowPageTurn}, se pueden usar también en -el nivel más elevado del código, entre las partituras y los elementos -de marcado del nivel superior. +@code{\noPageTurn} y @code{\allowPageTurn}, se pueden usar también +en el nivel más elevado del código, dentro de elementos de marcado +del nivel superior y entre las partituras. @predefined @funindex \pageTurn @@ -1811,207 +2008,19 @@ de marcado del nivel superior. @seealso Referencia de la notación: -@ref{Variables de paper para los saltos de línea,,Variables de @code{@bs{}paper} para los saltos de línea}. +@ref{Variables de paper para los saltos de línea}. Fragmentos de código: @rlsr{Spacing}. @knownissues -Sólo debería haber un grabador @code{Page_turn_engraver} dentro de una +Utilice un solo grabador @code{Page_turn_engraver} en cada partitura. Si hay más de uno, se interferirán entre sí. -@node Saltos de página mínimos -@subsection Saltos de página mínimos -@translationof Minimal page breaking - -@funindex ly:minimal-breaking - -La función @code{ly:minimal-breaking} efectúa unos cálculos mínimos -para determinar los saltos de página: completa una página con tantos -sistemas como sea posible antes de continuar con la siguiente. Así, -puede preferirse para partituras con muchas páginas, donde las otras -funciones de salto de página pueden resultar demasiado lentas o ávidas -de memoria, o con una gran cantidad de textos. Se habilita utilizando: - -@example -\paper @{ - page-breaking = #ly:minimal-breaking -@} -@end example - -@seealso -Fragmentos de código: -@rlsr{Spacing}. - -@node Saltos de página de una línea -@subsection Saltos de página de una línea -@translationof One-line page breaking - -@funindex ly:one-line-breaking - -La función @code{ly:one-line-breaking} es un algoritmo de saltos de -página para uso especial que pone cada partitura en una página y en -una sola línea. Esta función de salto de página no compone los -títulos ni los márgenes; solamente se imprime la partitura. - -El ancho de la página se ajusta de forma que la partitura más larga -quepa en una línea. Concretamente, las variables @code{paper-width}, -@code{line-width} y @code{indent} del bloque @code{\paper} se ignoran, -aunque @code{left-margin} y @code{right-margin} aún se respetan. La -altura de la página se deja sin cambios. - -@node Saltos de línea explícitos -@subsection Saltos de línea explícitos -@translationof Explicit breaks - -Lily a veces rechaza las instrucciones @code{\break} y -@code{\pageBreak} explícitas. Hay dos instrucciones para -sobreescribir este comportamiento: - -@example -\override NonMusicalPaperColumn.line-break-permission = ##f -\override NonMusicalPaperColumn.page-break-permission = ##f -@end example - -Cuando se sobreescribe el valor de @code{line-break-permission} a -falso, Lily inserta saltos de línea en las instrucciones @code{\break} -explícitas y en ningún otro lugar. Cuando se sobreescribe el valor de -@code{page-break-permission} a falso, Lily inserta saltos de página en -las instrucciones @code{\pageBreak} explícitas y en ningún otro lugar. - -@lilypond[quote,verbatim] -\paper { - indent = #0 - ragged-right = ##t - ragged-bottom = ##t -} - -music = \relative c'' { c8 c c c } - -\score { - \new Staff { - \repeat unfold 2 { \music } \break - \repeat unfold 4 { \music } \break - \repeat unfold 6 { \music } \break - \repeat unfold 8 { \music } \pageBreak - \repeat unfold 8 { \music } \break - \repeat unfold 6 { \music } \break - \repeat unfold 4 { \music } \break - \repeat unfold 2 { \music } - } - \layout { - \context { - \Score - \override NonMusicalPaperColumn.line-break-permission = ##f - \override NonMusicalPaperColumn.page-break-permission = ##f - } - } -} -@end lilypond - -@seealso -Fragmentos de código: -@rlsr{Spacing}. - - -@node Utilizar una voz adicional para los saltos de línea -@subsection Utilizar una voz adicional para los saltos de línea -@translationof Using an extra voice for breaks - -La información sobre saltos de línea y de página suele aparecer -directamente entremezclado dentro del código de notas. - -@example -music = \relative c'' @{ c4 c c c @} - -\score @{ - \new Staff @{ - \repeat unfold 2 @{ \music @} \break - \repeat unfold 3 @{ \music @} - @} -@} -@end example - -Esto hace sencillas de introducir a las instrucciones @code{\break} y -@code{\pageBreak}, pero mezcla la escritura de música con información -que especifica cómo se debe disponer la música sobre la página. -Podemos mantener la introducción de música y la información de saltos -de línea y de página en dos lugares separados mediante la introducción -de una voz adicional que contenga los saltos. Esta voz adicional -contiene solamente desplazamientos o @q{skips} junto con los -@code{\break}, @code{pageBreak} y otras informaciones sobre la -disposición de los saltos. - -@lilypond[quote,verbatim] -music = \relative c'' { c4 c c c } - -\header { tagline = ##f } -\paper { left-margin = 0\mm } -\book { - \score { - \new Staff << - \new Voice { - s1 * 2 \break - s1 * 3 \break - s1 * 6 \break - s1 * 5 \break - } - \new Voice { - \repeat unfold 2 { \music } - \repeat unfold 3 { \music } - \repeat unfold 6 { \music } - \repeat unfold 5 { \music } - } - >> - } -} -@end lilypond - -Este patrón resulta especialmente útil cuando se sobreescribe -@code{line-break-system-details} y las otras útiles (pero largas) -propiedades de @code{NonMusicalPaperColumnGrob}, como se explica en -@ref{Espaciado vertical}. - -@lilypond[quote,verbatim] -music = \relative c'' { c4 c c c } - -\header { tagline = ##f } -\paper { left-margin = 0\mm } -\book { - \score { - \new Staff << - \new Voice { - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 0)) - s1 * 2 \break - - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 5)) - s1 * 3 \break - - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 15)) - s1 * 6 \break - - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 30)) - s1 * 5 \break - } - \new Voice { - \repeat unfold 2 { \music } - \repeat unfold 3 { \music } - \repeat unfold 6 { \music } - \repeat unfold 5 { \music } - } - >> - } -} -@end lilypond - @seealso -Referencia de la notación: -@ref{Espaciado vertical}. +Notation Reference: +@ref{Vertical spacing}. Fragmentos de código: @rlsr{Spacing}. @@ -2024,10 +2033,10 @@ Fragmentos de código: @cindex espaciado vertical @cindex vertical, espaciado -El espaciado vertical está controlado por tres factores: la cantidad -de espacio disponible (es decir, el tamaño del papel y los márgenes), -la separación entre los sistemas, y la separación entre los -pentagramas dentro de un sistema. +El espaciado vertical está controlado por tres factores: la +cantidad de espacio disponible (es decir, el tamaño del papel y +los márgenes), la separación entre los sistemas, y la separación +entre los pentagramas dentro de un sistema. @menu * Espaciado vertical flexible dentro de los sistemas:: @@ -2046,7 +2055,8 @@ pentagramas dentro de un sistema. @cindex espacio dentro de los sistemas Tres mecanismos distintos controlan el espaciado vertical flexible -dentro de los sistemas, uno por cada una de las categorías siguientes: +dentro de los sistemas, uno por cada una de las categorías +siguientes: @itemize @@ -2066,16 +2076,17 @@ dentro de los sistemas, uno por cada una de las categorías siguientes: @c TODO: Clarify this. This almost implies that non-staff lines @c have NO effect on the spacing between staves. -mp -La altura de cada sistema se determina en dos fases. Primero, todos -los pentagramas se disponen según la cantidad de espacio vacío -disponible. Después, las líneas que no son pautas se distribuyen -entre las pautas. +La altura de cada sistema se determina en dos fases. Primero, +todos los pentagramas se disponen según la cantidad de espacio +vacío disponible. Después, las líneas que no son pautas se +distribuyen entre las pautas. Observe que los mecanismos de espaciado estudiados en esta sección -solamente controlan el espaciado vertical de las pautas y líneas que -no son pautas dentro de los sistemas individuales. El espaciado -vertical entre distintos sistemas, partituras, marcados y márgenes se -controla mediante variables de @code{\paper} que se estudian en +solamente controlan el espaciado vertical de las pautas y líneas +que no son pautas dentro de los sistemas individuales. El +espaciado vertical entre distintos sistemas, partituras, marcados +y márgenes se controla mediante variables de @code{\paper} que se +estudian en @ref{Variables de espaciado de paper verticales flexibles,,Variables de espaciado de @code{@bs{}paper} verticales flexibles}. @menu @@ -2105,29 +2116,30 @@ controla mediante variables de @code{\paper} que se estudian en Los mecanismos de espaciado vertical dentro del sistema están controlados por dos conjuntos de propiedades de grob. El primer -conjunto está asociado con el grob @code{VerticalAxisGroup}, que se -crea por parte de todas las pautas y líneas que no son pautas. El -segundo conjunto está asociado con el grob @code{StaffGrouper}, que -puede crearse por parte de los grupos de pentagramas, pero solamente -si se le llama explícitamente. Estas propiedades se describen -individualmente al final de la presente sección. - -Los nombres de estas propiedades (excepto para @code{staff-affinity}) -siguen el formato @code{@var{elemento1}-@var{elemento2}-spacing}, -donde @code{@var{elemento1}} y @code{@var{elemento2}} son los -elementos que se van a espaciar. Observe que @code{@var{elemento2}} -no está necesariamente por debajo de @code{@var{elemento1}}; por -ejemplo, @code{nonstaff-relatedstaff-spacing} mide hacia arriba a -partir de la línea del tipo no-pauta si @code{staff-affinity} es -@code{UP}. - -Cada distancia se mide entre los @emph{puntos de referencia} de los -dos elementos. El @emph{punto de referencia} para un pentagrama y -otro tipo de pauta es el centro vertical de su @code{StaffSymbol} (es -decir, la línea central si @code{line-count} es un número impar; el -espacio central si @code{line-count} es par). Los puntos de -referencia para las líneas individuales que no son pautas aparecen en -la tabla siguiente: +conjunto está asociado con el grob @code{VerticalAxisGroup}, que +se crea por parte de todas las pautas y líneas que no son pautas. +El segundo conjunto está asociado con el grob @code{StaffGrouper}, +que puede crearse por parte de los grupos de pentagramas, pero +solamente si se le llama explícitamente. Estas propiedades se +describen individualmente al final de la presente sección. + +Los nombres de estas propiedades (excepto para +@code{staff-affinity}) siguen el formato +@code{@var{elemento1}-@var{elemento2}-spacing}, donde +@code{@var{elemento1}} y @code{@var{elemento2}} son los elementos +que se van a espaciar. Observe que @code{@var{elemento2}} no está +necesariamente por debajo de @code{@var{elemento1}}; por ejemplo, +@code{nonstaff-relatedstaff-spacing} mide hacia arriba a partir de +la línea del tipo no-pauta si @code{staff-affinity} es @code{UP}. + +Cada distancia se mide entre los @emph{puntos de referencia} de +los dos elementos. El @emph{punto de referencia} para un +pentagrama y otro tipo de pauta es el centro vertical de su +@code{StaffSymbol} (es decir, la línea central si +@code{line-count} es un número impar; el espacio central si +@code{line-count} es par). Los puntos de referencia para las +líneas individuales que no son pautas aparecen en la tabla +siguiente: @multitable {Línea que no es una pauta} {Punto de referencia} @headitem Línea que no es una pauta @tab Punto de referencia @@ -2139,8 +2151,8 @@ la tabla siguiente: @item @code{FretBoards} @tab línea superior @end multitable -En la siguiente imagen, las líneas horizontales indican las posiciones -de estos puntos de referencia: +En la siguiente imagen, las líneas horizontales indican las +posiciones de estos puntos de referencia: @lilypond[quote,noragged-right,line-width=110\mm] #(define zero-space '((padding . -inf.0) (basic-distance . 0))) @@ -2157,7 +2169,7 @@ lowerCaseChords = \with { } labelContext = #(define-music-function - (parser location context) + (context) (string?) #{ s1*0^\markup { \upright {\typewriter #context } } #}) @@ -2207,20 +2219,21 @@ labelContext = >> @end lilypond -Cada una de las propiedades de grob del espaciado vertical (excepto -@code{staff-affinity}) -usa la misma estructura de lista-A que las -variables de espaciado del bloque @code{\paper} que se han estudiado -en @ref{Variables de espaciado de paper verticales flexibles,,Variables de espaciado de @code{@bs{}paper} verticales flexibles}. -En @ref{Modificación de las listas-A} -se estudian métodos específicos para la modificación de -las listas-A. Las propiedades de los grobs deben ajustarse con un -@code{\override} dentro de un bloque @code{\score} o @code{\layout}, y -no dentro de un bloque @code{\paper}. - -El ejemplo que sigue muestra las dos maneras en que pueden modificarse -estas listas-A. La primera declaración actualiza un par clave-valor de -forma individual, y la segunda redefine la propiedad completamente: +Cada una de las propiedades de grob del espaciado vertical +(excepto @code{staff-affinity}) usa la misma estructura de lista-A +que las variables de espaciado del bloque @code{\paper} que se han +estudiado en +@ref{Variables de espaciado de paper verticales flexibles,,Variables de espaciado de @code{@bs{}paper} verticales flexibles}. +En @ref{Modificación de las listas-A} se estudian métodos +específicos para la modificación de las listas-A. Las propiedades +de los grobs deben ajustarse con un @code{\override} dentro de un +bloque @code{\score} o @code{\layout}, y no dentro de un bloque +@code{\paper}. + +El ejemplo que sigue muestra las dos maneras en que pueden +modificarse estas listas-A. La primera declaración actualiza un +par clave-valor de forma individual, y la segunda redefine la +propiedad completamente: @example \new Staff \with @{ @@ -2250,90 +2263,94 @@ póngalos dentro del bloque @code{\layout}: Los ajustes estándar para las propiedades de grob del espaciado vertical están relacionadas en @rinternals{VerticalAxisGroup} y en -@rinternals{StaffGrouper}. Las sobreescrituras predeterminadas para -los tipos específicos de líneas que no son pautas están relacionadas -en las descripciones de contexto correspondientes en +@rinternals{StaffGrouper}. Las sobreescrituras predeterminadas +para los tipos específicos de líneas que no son pautas están +relacionadas en las descripciones de contexto correspondientes en @rinternals{Contexts}. @subsubheading Propiedades del grob @code{VerticalAxisGroup} -Las propiedades de @code{VerticalAxisGroup} se suelen ajustar con una -instrucción @code{\override} en el nivel de @code{Staff} (o +Las propiedades de @code{VerticalAxisGroup} se suelen ajustar con +una instrucción @code{\override} en el nivel de @code{Staff} (o equivalente). @table @code @item staff-staff-spacing -Se utiliza para determinar la distancia entre la pauta actual -y la pauta que está justo por debajo -de ella dentro del mismo sistema, incluso si hay más líneas que no son -pautas (tales como @code{Lyrics}) entre las dos pautas. No se aplica -a la pauta inferior de un sistema. - -Inicialmente, el valor de espaciado @code{staff-staff-spacing} de un -grupo @code{VerticalAxisGroup} es una función de Scheme que aplica las -propiedades del @code{StaffGrouper} si la pauta forma parte de un -grupo, o el @code{default-staff-staff-spacing} de la pauta en caso -contrario. Esto hace posible que las pautas estén espaciadas de forma -diferente cuando están agrupadas. Para conseguir un espaciado regular -sin importar el agrupamiento, esta función se puede sustituir por una -lista-A de espaciado flexible, utilizando la forma de -sobreescritura de redefinición completa que se ha mostrado más arriba. +Se utiliza para determinar la distancia entre la pauta actual y la +pauta que está justo por debajo de ella dentro del mismo sistema, +incluso si hay más líneas que no son pautas (tales como +@code{Lyrics}) entre las dos pautas. No se aplica a la pauta +inferior de un sistema. + +Inicialmente, el valor de espaciado @code{staff-staff-spacing} de +un grupo @code{VerticalAxisGroup} es una función de Scheme que +aplica las propiedades del @code{StaffGrouper} si la pauta forma +parte de un grupo, o el @code{default-staff-staff-spacing} de la +pauta en caso contrario. Esto hace posible que las pautas estén +espaciadas de forma diferente cuando están agrupadas. Para +conseguir un espaciado regular sin importar el agrupamiento, esta +función se puede sustituir por una lista-A de espaciado flexible, +utilizando la forma de sobreescritura de redefinición completa que +se ha mostrado más arriba. @item default-staff-staff-spacing -Una lista-A de espaciado flexible que define el -espacio @code{staff-staff-spacing} que se usará para las pautas sin +Una lista-A de espaciado flexible que define el espacio +@code{staff-staff-spacing} que se usará para las pautas sin agrupar, a no ser que se haya sobreescrito explícitamente @code{staff-staff-spacing} con una instrucción @code{\override}. @item staff-affinity Dirección de la pauta que utilizar para el espaciado de la línea actual que no es pauta. Se puede elegir entre @code{UP} (arriba), -@code{DOWN} (abajo) y @code{CENTER} (centro). Si es @code{CENTER}, la -línea del tipo no-pauta se coloca equidistante entre las dos pautas -contiguas a ambos lados, a no ser que lo impidan colisiones u otras -restricciones de espaciado. Las líneas del tipo no-pauta adyacentes -han de llevar valores de @code{staff-affinity} no crecientes desde la -parte superior hasta la inferior, p.ej. una línea del tipo no-pauta -establecida a @code{UP} no debería seguir inmediatamente a otra que -esté establecida a @code{DOWN}. Las líneas del tipo no-pauta en la -parte superior de un sistema deben usar @code{DOWN}; las de la parte -inferior deben usar @code{UP}. El ajuste de @code{staff-affinity} -para una pauta hace que se le trate como una línea que no es una -pauta. El establecimiento de @code{staff-affinity} a @code{#f} para -una línea que no es una pauta hace que se trate como una pauta. -Establecer @code{staff-affinity} a @code{UP}, @code{CENTER}, o -@code{DOWN} hace que el pentagrama resulte espaciado como si fuera una -línea que no es una pauta. +@code{DOWN} (abajo) y @code{CENTER} (centro). Si es +@code{CENTER}, la línea del tipo no-pauta se coloca equidistante +entre las dos pautas contiguas a ambos lados, a no ser que lo +impidan colisiones u otras restricciones de espaciado. Las líneas +del tipo no-pauta adyacentes han de llevar valores de +@code{staff-affinity} no crecientes desde la parte superior hasta +la inferior, p.ej. una línea del tipo no-pauta establecida a +@code{UP} no debería seguir inmediatamente a otra que esté +establecida a @code{DOWN}. Las líneas del tipo no-pauta en la +parte superior de un sistema deben usar @code{DOWN}; las de la +parte inferior deben usar @code{UP}. El ajuste de +@code{staff-affinity} para una pauta hace que se le trate como una +línea que no es una pauta. El establecimiento de +@code{staff-affinity} a @code{#f} para una línea que no es una +pauta hace que se trate como una pauta. Establecer +@code{staff-affinity} a @code{UP}, @code{CENTER}, o @code{DOWN} +hace que el pentagrama resulte espaciado como si fuera una línea +que no es una pauta. @item nonstaff-relatedstaff-spacing Distancia entre la línea del tipo no-pauta actual y la pauta más -próxima en la dirección de @code{staff-affinity}, si no hay ninguna -línea que no sea una pauta entre las dos, y @code{staff-affinity} es -@code{UP} o @code{DOWN}. Si @code{staff-affinity} es @code{CENTER}, -entonces se usa @code{nonstaff-relatedstaff-spacing} para las pautas -más próximas @emph{a los dos lados}, incluso aunque aparezcan otras -líneas del tipo no-pauta entre la pauta actual y una de las otras. -Esto significa que la colocación de una línea que no es una pauta -depende tanto de las pautas que la rodean como de las líneas que no -son pautas y que la rodean. Establecer la ampliabilidad -@code{stretchability} de uno de estos tipos de espaciado a un valor -más pequeño provoca que este espaciado domine. El establecimiento de -@code{stretchability} a un valor mayor hace que dicho espaciado tenga -un menor efecto. +próxima en la dirección de @code{staff-affinity}, si no hay +ninguna línea que no sea una pauta entre las dos, y +@code{staff-affinity} es @code{UP} o @code{DOWN}. Si +@code{staff-affinity} es @code{CENTER}, entonces se usa +@code{nonstaff-relatedstaff-spacing} para las pautas más próximas +@emph{a los dos lados}, incluso aunque aparezcan otras líneas del +tipo no-pauta entre la pauta actual y una de las otras. Esto +significa que la colocación de una línea que no es una pauta +depende tanto de las pautas que la rodean como de las líneas que +no son pautas y que la rodean. Establecer la ampliabilidad +@code{stretchability} de uno de estos tipos de espaciado a un +valor más pequeño provoca que este espaciado domine. El +establecimiento de @code{stretchability} a un valor mayor hace que +dicho espaciado tenga un menor efecto. @item nonstaff-nonstaff-spacing -Distancia entre la línea actual del tipo no-pauta y la siguiente línea -del tipo no-pauta en la dirección de @code{staff-affinity}, si las dos -están al mismo lado de la pauta relacionada, y @code{staff-affinity} -es @code{UP} o @code{DOWN}. +Distancia entre la línea actual del tipo no-pauta y la siguiente +línea del tipo no-pauta en la dirección de @code{staff-affinity}, +si las dos están al mismo lado de la pauta relacionada, y +@code{staff-affinity} es @code{UP} o @code{DOWN}. @item nonstaff-unrelatedstaff-spacing Distancia entre la línea actual del tipo no-pauta y la pauta en la dirección opuesta de @code{staff-affinity}, si no hay ninguna otra línea del tipo no-pauta entre las dos, y @code{staff-affinity} es -@code{UP} o @code{DOWN}. Se puede usar, por ejemplo, para requerir -una cantidad de relleno mínima entre una línea de @code{Lyrics} y la -pauta a la que no pertenece. +@code{UP} o @code{DOWN}. Se puede usar, por ejemplo, para +requerir una cantidad de relleno mínima entre una línea de +@code{Lyrics} y la pauta a la que no pertenece. @end table @subsubheading Propiedades del grob @code{StaffGrouper} @@ -2344,21 +2361,20 @@ equivalente). @table @code @item staff-staff-spacing -Distancia entre pautas consecutivas dentro del grupo de pautas actual. -La propiedad @code{staff-staff-spacing} del grob +Distancia entre pautas consecutivas dentro del grupo de pautas +actual. La propiedad @code{staff-staff-spacing} del grob @code{VerticalAxisGroup} de una pauta individual se puede -sobreescribir con distintos ajustes de espaciado para dicha -pauta. +sobreescribir con distintos ajustes de espaciado para dicha pauta. @item staffgroup-staff-spacing -Distancia entre la última pauta del grupo en curso y la pauta que está -justo por debajo de ella dentro del mismo sistema, incluso si existen -una o más líneas que no son pautas (tales como @code{Lyrics}) entre -las dos pautas. No se aplica al pentagrama o pauta inferior de un -sistema. La propiedad @code{staff-staff-spacing} del grob -@code{VerticalAxisGroup} de una pauta individual se puede -sobreescribir con distintos ajustes de espaciado para dicha -pauta. +Distancia entre la última pauta del grupo en curso y la pauta que +está justo por debajo de ella dentro del mismo sistema, incluso si +existen una o más líneas que no son pautas (tales como +@code{Lyrics}) entre las dos pautas. No se aplica al pentagrama o +pauta inferior de un sistema. La propiedad +@code{staff-staff-spacing} del grob @code{VerticalAxisGroup} de +una pauta individual se puede sobreescribir con distintos ajustes +de espaciado para dicha pauta. @end table @seealso @@ -2381,13 +2397,13 @@ Referencia de funcionamiento interno: @unnumberedsubsubsec Espaciado de pautas no agrupadas @translationof Spacing of ungrouped staves -Las @emph{pautas}, tales como los pentagramas (@code{Staff}), pautas -de percusión (@code{DrumStaff}) o de tablatura (@code{TabStaff}), -etc. son contextos que pueden contener uno o más contextos de voz, -pero no pueden contener otras pautas. +Las @emph{pautas}, tales como los pentagramas (@code{Staff}), +pautas de percusión (@code{DrumStaff}) o de tablatura +(@code{TabStaff}), etc. son contextos que pueden contener uno o +más contextos de voz, pero no pueden contener otras pautas. -Las siguientes propiedades afectan al espaciado de las pautas @emph{no -agrupadas}: +Las siguientes propiedades afectan al espaciado de las pautas +@emph{no agrupadas}: @itemize @item Propiedades de @code{VerticalAxisGroup}: @@ -2400,15 +2416,16 @@ agrupadas}: Estas propiedades de grob se describen individualmente más arriba; véase @ref{Propiedades de espaciado dentro de los sistemas}. -Están implicadas ciertas propiedades adicionales para las pautas que -son parte de un grupo; véase @ref{Espaciado de pautas agrupadas}. +Están implicadas ciertas propiedades adicionales para las pautas +que son parte de un grupo; véase +@ref{Espaciado de pautas agrupadas}. El ejemplo siguiente muestra cómo la propiedad -@code{default-staff-staff-spacing} puede afectar al espaciado de pautas no -agrupadas. Las mismas sobreescrituras aplicadas a -@code{staff-staff-spacing} -tendrían el mismo efecto, pero también se aplicaría en caso de que las -pautas estuvieran combinadas en un grupo o grupos. +@code{default-staff-staff-spacing} puede afectar al espaciado de +pautas no agrupadas. Las mismas sobreescrituras aplicadas a +@code{staff-staff-spacing} tendrían el mismo efecto, pero también +se aplicaría en caso de que las pautas estuvieran combinadas en un +grupo o grupos. @lilypond[verbatim,quote,staffsize=16] \layout { @@ -2460,15 +2477,16 @@ Referencia de funcionamiento interno: @translationof Spacing of grouped staves En partituras grandes como las orquestales, es común colocar los -pentagramas en grupos. El espacio entre los grupos suele ser mayor -que el espacio que hay entre los pentagramas dentro del mismo grupo. +pentagramas en grupos. El espacio entre los grupos suele ser +mayor que el espacio que hay entre los pentagramas dentro del +mismo grupo. Los grupos de pautas, @emph{Staff-groups} (tales como -@code{StaffGroup}, @code{ChoirStaff}, etc.) son contextos que pueden -contener al mismo tiempo uno o más pentagramas o pautas. +@code{StaffGroup}, @code{ChoirStaff}, etc.) son contextos que +pueden contener al mismo tiempo uno o más pentagramas o pautas. -Las siguientes propiedades afectan al espaciado de las pautas dentro -de los grupos: +Las siguientes propiedades afectan al espaciado de las pautas +dentro de los grupos: @itemize @item Propiedades de @code{VerticalAxisGroup}: @@ -2485,8 +2503,8 @@ de los grupos: Estas propiedades de grob se describen individualmente más arriba; véase @ref{Propiedades de espaciado dentro de los sistemas}. -El ejemplo siguiente muestra cómo pueden afectar las propiedades del -grob @code{StaffGrouper} al espaciado de las pautas agrupadas: +El ejemplo siguiente muestra cómo pueden afectar las propiedades +del grob @code{StaffGrouper} al espaciado de las pautas agrupadas: @lilypond[verbatim,quote,staffsize=16] \layout { @@ -2529,14 +2547,14 @@ Referencia de funcionamiento interno: @translationof Spacing of non-staff lines Las @emph{Líneas que no son pautas} (tales como @code{Lyrics}, -@code{ChordNames}, etc.) son contextos cuyos objetos de presentación -se imprimen como pentagramas (es decir, en líneas horizontales dentro -de los sistemas). Específicamente, las líneas que no son pautas son -contextos del tipo no-pauta que crean el objeto de presentación -@code{VerticalAxisGroup}. +@code{ChordNames}, etc.) son contextos cuyos objetos de +presentación se imprimen como pentagramas (es decir, en líneas +horizontales dentro de los sistemas). Específicamente, las líneas +que no son pautas son contextos del tipo no-pauta que contienen el +grabador @rinternals{Axis_group_engraver}. -Las siguientes propiedades afectan al espaciado de las líneas que no -son pautas: +Las siguientes propiedades afectan al espaciado de las líneas que +no son pautas: @itemize @item Propiedades de @code{VerticalAxisGroup}: @@ -2552,10 +2570,11 @@ Estas propiedades de grob se describen individualmente más arriba; véase @ref{Propiedades de espaciado dentro de los sistemas}. El ejemplo siguiente muestra cómo la propiedad -@code{nonstaff-nonstaff-spacing} puede afectar el espaciado de líneas -consecutivas que no son pautas. Aquí, mediante el establecimiento de -la clave de ampliabilidad @code{stretchability} a un valor muy grande, -la línea de letra es capaz de ampliarse mucho más de lo que es usual: +@code{nonstaff-nonstaff-spacing} puede afectar el espaciado de +líneas consecutivas que no son pautas. Aquí, mediante el +establecimiento de la clave de ampliabilidad @code{stretchability} +a un valor muy grande, la línea de letra es capaz de ampliarse +mucho más de lo que es usual: @lilypond[verbatim,quote,staffsize=16] \layout { @@ -2604,9 +2623,9 @@ Referencia de funcionamiento interno: @translationof Explicit staff and system positioning Una forma de entender los mecanismos del espaciado vertical -flexible que se han explicado más arriba es como una -colección de ajustes que controlan la cantidad de relleno -vertical entre los pentagramas y los sistemas. +flexible que se han explicado más arriba es como una colección de +ajustes que controlan la cantidad de relleno vertical entre los +pentagramas y los sistemas. Es posible enfrentarse al espaciado vertical de una forma distinta utilizando @code{NonMusicalPaperColumn.line-break-system-details}. @@ -2625,8 +2644,8 @@ lista asociativa de tres ajustes diferentes: @end itemize Las sobreescrituras de los objetos gráficos, entre ellas las de -@code{NonMusicalPaperColumn} que aparecen más abajo, pueden ocurrir en -tres lugares distintos dentro de un archivo de entrada: +@code{NonMusicalPaperColumn} que aparecen más abajo, pueden +ocurrir en tres lugares distintos dentro de un archivo de entrada: @itemize @item directamente en medio de las notas @@ -2635,12 +2654,13 @@ tres lugares distintos dentro de un archivo de entrada: @end itemize Cuando sobreescribimos @code{NonMusicalPaperColumn}, usamos la -instrucción @code{\override} usual en los bloques @code{\context} y en -el bloque @code{\with}. Por otra parte, cuando sobreescribimos -@code{NonMusicalPaperColumn} en medio de las notas, debemos usar la -instrucción especial @code{\overrideProperty}. He aquí algunas -sobreescrituras de @code{NonMusicalPaperColumn} de ejemplo con la -instrucción especial @code{\overrideProperty}: +instrucción @code{\override} usual en los bloques @code{\context} +y en el bloque @code{\with}. Por otra parte, cuando +sobreescribimos @code{NonMusicalPaperColumn} en medio de las +notas, debemos usar la instrucción especial +@code{\overrideProperty}. He aquí algunas sobreescrituras de +@code{NonMusicalPaperColumn} de ejemplo con la instrucción +especial @code{\overrideProperty}: @example \overrideProperty NonMusicalPaperColumn.line-break-system-details @@ -2663,8 +2683,8 @@ instrucción especial @code{\overrideProperty}: @end example Para entender cómo funciona cada uno de los distintos ajustes, -empezamos observando un ejemplo que no incluye absolutamente ninguna -sobreescritura. +empezamos observando un ejemplo que no incluye absolutamente +ninguna sobreescritura. @c \book { } is required in these examples to ensure the spacing @c overrides can be seen between systems. -np @@ -2691,18 +2711,19 @@ sobreescritura. } @end lilypond -Esta partitura mantiene aislada la información de los saltos de línea -y de página en una voz dedicada a ello. Esta técnica de crear una voz -de saltos ayuda a mantener separada de la escritura de notas conforme -el ejemplo se vuelve más complicado. Consulte -@ref{Utilizar una voz adicional para los saltos de línea}. +Esta partitura mantiene aislada tanto la información de los saltos +de línea como los de página en una voz dedicada a ello. Esta +técnica de crear una voz de saltos ayuda a mantener separada de la +escritura de notas conforme el ejemplo se vuelve más complicado. +Consulte @ref{Saltos}. -Los saltos explícitos dividen la música de forma regular en seis -compases por línea. El espaciado vertical es el resultado de los -ajustes predeterminados de LilyPond. Para establecer explícitamente -el punto de origen vertical de cada sistema, podemos establecer el par -@code{Y-offset} en el atributo @code{line-break-system-details} del -grob (objeto gráfico) @code{NonMusicalPaperColumn}: +Utilizando instrucciones @code{\break} explícitas, la música se +divide líneas de cinco compases cada una. El espaciado vertical +proviene de los ajustes predeterminados de LilyPond pero el punto +de origen vertical de cada sistema se fija explícitamente usando +el par @code{Y-offset} en el atributo +@code{line-break-system-details} del grob (objeto gráfico) +@code{NonMusicalPaperColumn}: @lilypond[verbatim,quote,staffsize=16] \header { tagline = ##f } @@ -2732,17 +2753,17 @@ grob (objeto gráfico) @code{NonMusicalPaperColumn}: } @end lilypond -Observe que @code{line-break-system-details} toma una lista asociativa -de una cantidad de valores potencialmente elevada, pero aquí sólo -fijamos un valor. Observe también que aquí la propiedad -@code{Y-offset} determina la posición vertical exacta sobre la página -en la que se trazará cada uno de los nuevos sistemas. +Observe que @code{line-break-system-details} toma una lista +asociativa de una cantidad de valores potencialmente elevada, pero +aquí sólo fijamos un valor. Observe también que aquí la propiedad +@code{Y-offset} determina la posición vertical exacta sobre la +página en la que se trazará cada uno de los nuevos sistemas. -Ahora que hemos establecido explícitamente el punto de origen vertical -de cada sistema, podemos también establecer manualmente las distancias -verticales entre los pentagramas dentro de cada sistema. Lo hacemos -usando la subpropiedad @code{alignment-distances} de -@code{line-break-system-details}. +Ahora que hemos establecido explícitamente el punto de origen +vertical de cada sistema, podemos también establecer manualmente +las distancias verticales entre los pentagramas dentro de cada +sistema. Lo hacemos usando la subpropiedad +@code{alignment-distances} de @code{line-break-system-details}. @lilypond[verbatim,quote,staffsize=16] \header { tagline = ##f } @@ -2778,13 +2799,14 @@ usando la subpropiedad @code{alignment-distances} de Observe que aquí asignamos dos valores distintos al atributo @code{line-break-system-details} del grob @code{NonMusicalPaperColumn}. Aunque el atributo alist de -@code{line-break-system-details} acepta muchos parámetros de espaciado -adicionales (entre ellos, por ejemplo, un par @code{X-offset} -correspondiente), sólo tenemos que establecer el desplazamiento -@code{Y-offset} y los pares @code{alignment-distances} para controlar -el punto de origen vertical de cada sistema y pentagrama. Finalmente, -observe que @code{alignment-distances} especifica el posicionamiento -vertical de los pentagramas pero no de los grupos de pentagramas. +@code{line-break-system-details} acepta muchos parámetros de +espaciado adicionales (entre ellos, por ejemplo, un par +@code{X-offset} correspondiente), sólo tenemos que establecer el +desplazamiento @code{Y-offset} y los pares +@code{alignment-distances} para controlar el punto de origen +vertical de cada sistema y pentagrama. Finalmente, observe que +@code{alignment-distances} especifica el posicionamiento vertical +de los pentagramas pero no de los grupos de pentagramas. @lilypond[verbatim,quote,staffsize=16] \header { tagline = ##f } @@ -2821,14 +2843,15 @@ vertical de los pentagramas pero no de los grupos de pentagramas. Algunos puntos que tener en cuenta: @itemize -@item Al usar @code{alignment-distances}, la letra -y otras líneas que no son pautas, no cuentan como un pentagrama. +@item Al usar @code{alignment-distances}, la letra y otras líneas que no +son pautas, no cuentan como un pentagrama. @item Las unidades de los números que se pasan a @code{X-offset}, @code{Y-offset} y @code{alignment-distances} se interpretan como -múltiplos de la distancia entre líneas de pentagrama adyacentes. Los -valores positivos mueven a los pentagramas y a la letra hacia arriba, -los valores negativos mueven los pentagramas y la letra hacia abajo. +múltiplos de la distancia entre líneas de pentagrama adyacentes. +Los valores positivos mueven a los pentagramas y a la letra hacia +arriba, los valores negativos mueven los pentagramas y la letra +hacia abajo. @item A causa de que los ajustes a @code{NonMusicalPaperColumn.line-break-system-details} dados aquí @@ -2856,52 +2879,60 @@ Podemos decir intuitivamente que algunos objetos de la notación musical pertenecen al pentagrama y otros se sitúan fuera del pentagrama. Entre los objetos que pertenecen al exterior del pentagrama están las marcas de ensayo, las marcas textuales y las -indicaciones de dinámica (en lo sucesivo, les llamaremos objetos fuera -del pentagrama). La regla de LilyPond para la colocación vertical de -los objetos fuera del pentagrama es ponerlos tan cerca del pentagrama -como sea posible pero no tan próximos como para que choquen con otro -objeto. +indicaciones de dinámica (en lo sucesivo, les llamaremos objetos +fuera del pentagrama). La regla de LilyPond para la colocación +vertical de los objetos fuera del pentagrama es ponerlos tan cerca +del pentagrama como sea posible pero no tan próximos como para que +choquen con otro objeto. LilyPond utiliza la propiedad @code{outside-staff-priority} para determinar si un grob es un objeto fuera del pentagrama: si -@code{outside-staff-priority} es un número, el grob es un objeto fuera -del pentagrama. Además, @code{outside-staff-priority} informa a -LilyPond en qué orden se debe situar los objetos. - -En primer lugar, LilyPond sitúa todos los objetos que no pertenecen al -exterior del pentagrama. Después ordena los objetos fuera del -pentagrama de acuerdo a su prioridad @code{outside-staff-priority} (en -orden creciente). LilyPond toma los objetos fuera del pentagrama uno -a uno y los coloca de forma que no choquen con ningún objeto que ya -haya sido colocado. Esto es, si dos grobs fuera del pentagrama -compiten por el mismo espacio, el que tiene la prioridad -@code{outside-staff-priority} más baja se colocará más próximo al -pentagrama. - -@lilypond[quote,ragged-right,relative=2,verbatim] -c4_"Text"\pp -r2. -\once \override TextScript.outside-staff-priority = #1 -c4_"Text"\pp % this time the text will be closer to the staff -r2. -% by setting outside-staff-priority to a non-number, -% we disable the automatic collision avoidance -\once \override TextScript.outside-staff-priority = ##f -\once \override DynamicLineSpanner.outside-staff-priority = ##f -c4_"Text"\pp % now they will collide +@code{outside-staff-priority} es un número, el grob es un objeto +fuera del pentagrama. Además, @code{outside-staff-priority} +informa a LilyPond en qué orden se debe situar los objetos. + +En primer lugar, LilyPond sitúa todos los objetos que no +pertenecen al exterior del pentagrama. Después ordena los objetos +fuera del pentagrama de acuerdo a su prioridad +@code{outside-staff-priority} (en orden creciente). LilyPond toma +los objetos fuera del pentagrama uno a uno y los coloca de forma +que no choquen con ningún objeto que ya haya sido colocado. Esto +es, si dos grobs fuera del pentagrama compiten por el mismo +espacio, el que tiene la prioridad @code{outside-staff-priority} +más baja se colocará más próximo al pentagrama. + +Hay un listado completo de las prioridades +outside-staff-priorities en +@rlearning{La propiedad outside-staff-priority (prioridad fuera del pentagrama)}. + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4_"Text"\pp + r2. + \once \override TextScript.outside-staff-priority = #1 + c4_"Text"\pp % this time the text will be closer to the staff + r2. + % by setting outside-staff-priority to a non-number, + % we disable the automatic collision avoidance + \once \override TextScript.outside-staff-priority = ##f + \once \override DynamicLineSpanner.outside-staff-priority = ##f + c4_"Text"\pp % now they will collide +} @end lilypond El relleno vertical que rodea a los objetos fuera del pentagrama se puede controlar con @code{outside-staff-padding}. -@lilypond[quote,ragged-right,relative=2,verbatim,staffsize=18] -\once \override TextScript.outside-staff-padding = #0 -a4-"outside-staff-padding = #0" -\once \override TextScript.outside-staff-padding = #3 -d-"outside-staff-padding = #3" -c-"default outside-staff-padding" -b-"default outside-staff-padding" -R1 +@lilypond[quote,ragged-right,verbatim,staffsize=18] +\relative { + \once \override TextScript.outside-staff-padding = #0 + a'4-"outside-staff-padding = #0" + \once \override TextScript.outside-staff-padding = #3 + d-"outside-staff-padding = #3" + c-"default outside-staff-padding" + b-"default outside-staff-padding" + R1 +} @end lilypond De forma predeterminada, los objetos fuera del pentagrama se @@ -2914,11 +2945,13 @@ incrementa el espacio horicontal necesario, y en este caso mueve el texto hacia arriba para evitar que quede demasiado cerca de las líneas adicionales. -@lilypond[quote,ragged-right,relative=2,verbatim] -c4^"Word" c c''2 -R1 -\once \override TextScript.outside-staff-horizontal-padding = #1 -c,,4^"Word" c c''2 +@lilypond[quote,ragged-right,verbatim] +\relative { + c''4^"Word" c c''2 + R1 + \once \override TextScript.outside-staff-horizontal-padding = #1 + c,,4^"Word" c c''2 +} @end lilypond @seealso @@ -2935,7 +2968,7 @@ Fragmentos de código: @menu * Panorámica del espaciado horizontal:: -* Área de espaciado nueva:: +* Sección de espaciado nueva:: * Cambiar el espaciado horizontal:: * Longitud de la línea:: * Notación proporcional:: @@ -2948,53 +2981,56 @@ Fragmentos de código: El motor de espaciado traduce las diferencias en las duraciones a distancias ampliables (@q{muelles}) de distintas longitudes. Las -duraciones más largas reciben un espacio mayor y las duraciones más -cortas reciben menos. Las duraciones más breves reciben un espacio de -tamaño fijo (que se controla mediante @code{shortest-duration-space} -en el objeto @rinternals{SpacingSpanner}). Cuanto más larga es la -duración, más espacio recibe: al doblar una duración se añade un -espacio de tamaño fijo (este tamaño se controla mediante -@code{spacing-increment}) a la nota. - -Por ejemplo, la pieza siguiente contiene numerosas blancas, negras y -corcheas; la corchea va seguida de un ancho de cabeza de blanca (ACB). -La negra va seguida de 2 ACB, la blanca por 3 ACB, etc. - -@lilypond[quote,verbatim,relative=1] -c2 c4. c8 -c4. c8 c4. c8 -c8 c c4 c c +duraciones más largas reciben un espacio mayor y las duraciones +más cortas reciben menos. Las duraciones más breves reciben un +espacio de tamaño fijo (que se controla mediante +@code{shortest-duration-space} en el objeto +@rinternals{SpacingSpanner}). Cuanto más larga es la duración, +más espacio recibe: al doblar una duración se suma +@code{spacing-increment} al espacio que ocupa la nota. + +Por ejemplo, la pieza siguiente contiene numerosas blancas, negras +y corcheas; la corchea va seguida de un ancho de cabeza de blanca +(ACB). La negra va seguida de 2 ACB, la blanca por 3 ACB, etc. + +@lilypond[quote,verbatim] +\relative c' { + c2 c4. c8 + c4. c8 c4. c8 + c8 c c4 c c +} @end lilypond -Normalmente, el valor de @code{spacing-increment} está establecido en -1.2 espacios de pentagrama, lo que es aproximadamente el ancho de una -cabeza, y @code{shortest-duration-space} está establecido en 2.0, lo -que significa que la nota más breve recibe 2.4 espacios de pentagrama -(2.0 multiplicado por el @code{spacing-increment}) de espacio -horizontal. Este espacio se cuenta a partir del borde izquierdo del -símbolo, de manera que las notas más breves van seguidas generalmente -por un espacio de 1 ACB. +Normalmente, el valor de @code{spacing-increment} está establecido +en 1.2 espacios de pentagrama, lo que es aproximadamente el ancho +de una cabeza, y @code{shortest-duration-space} está establecido +en 2.0, lo que significa que la nota más breve recibe 2.4 espacios +de pentagrama (2.0 multiplicado por el @code{spacing-increment}) +de espacio horizontal. Este espacio se cuenta a partir del borde +izquierdo del símbolo, de manera que las notas más breves van +seguidas generalmente por un espacio de 1 ACB. Si siguiésemos el procedimiento anterior exactamente, entonces la adición de una sola fusa a una partitura que usa corcheas y semicorcheas, aumentaría enormemente la anchura de la partitura -completa. La nota más breve ya no es la semicorchea, sino la fusa, -añadiendo así 1 ACB a cada una de las notas. Para evitarlo, la -duración más breve a efectos de espaciado no es la nota más breve de -la partitura, sino la que ocurre con más frecuencia. - -La duración más breve que es más común se determina de la siguiente -manera: en cada compás se determina la duración más breve. La menor -duración más común se toma como base para el espaciado, habiendo -estipulado que esta duración menor siempre debe ser igual o menor que -una corchea. La duración más breve se imprime cuando se ejecuta -@code{lilypond} con la opción @option{--verbose}. - -Estas duraciones también se pueden personalizar. Si establecemos la -@code{common-shortest-duration} en @rinternals{SpacingSpanner}, +completa. La nota más breve ya no es la semicorchea, sino la +fusa, añadiendo así 1 ACB a cada una de las notas. Para evitarlo, +la duración más breve a efectos de espaciado no es la nota más +breve de la partitura, sino la que ocurre con más frecuencia. + +La duración más breve que es más común se determina de la +siguiente manera: en cada compás se determina la duración más +breve. La menor duración más común se toma como base para el +espaciado, habiendo estipulado que esta duración menor siempre +debe ser igual o menor que una corchea. La duración más breve se +imprime cuando se ejecuta @code{lilypond} con la opción +@option{--verbose}. + +Estas duraciones también se pueden personalizar. Si establecemos +la @code{common-shortest-duration} en @rinternals{SpacingSpanner}, entonces éste establece la duración base para el espaciado. La -duración máxima para esta base (normalmente una corchea), se fija a -través de @code{base-shortest-duration}. +duración máxima para esta base (normalmente una corchea), se fija +a través de @code{base-shortest-duration}. @funindex common-shortest-duration @funindex base-shortest-duration @@ -3002,34 +3038,37 @@ través de @code{base-shortest-duration}. @funindex spacing Las notas que son aún más breves que la nota común más breve van -seguidas por un espacio proporcional a su duración en relación con la -nota común más breve. Así pues, si fuésemos a añadir tan sólo algunas -semicorcheas al ejemplo anterior, irían seguidas por medio ACB: +seguidas por un espacio proporcional a su duración en relación con +la nota común más breve. Así pues, si fuésemos a añadir tan sólo +algunas semicorcheas al ejemplo anterior, irían seguidas por medio +ACB: -@lilypond[quote,verbatim,relative=2] -c2 c4. c8 c4. c16[ c] c4. c8 c8 c8 c4 c4 c4 +@lilypond[quote,verbatim] +\relative { c''2 c4. c8 | c4. c16[ c] c4. c8 | c8 c c4 c c } @end lilypond -En el @emph{Ensayo sobre grabado musical automatizado}, -se explicó que las -direcciones de las plicas influyen en el espaciado -(véase @ressay{Espaciado óptico}). Esto se controla -con la propiedad @code{stem-spacing-correction} en el objeto +Como se explicó en el @emph{Ensayo sobre grabado musical +automatizado}, las direcciones de las plicas influyen en el +espaciado (véase @ressay{Espaciado óptico}) y se puede ajustar con +la propiedad @code{stem-spacing-correction} del objeto @rinternals{NoteSpacing}. Estos se generan para cada uno de los -contextos de @rinternals{Voice}. El objeto @code{StaffSpacing} -(generado en el contexto de @rinternals{Staff}) contiene la misma -propiedad para controlar el espaciado de las líneas de plica o -divisorias. El ejemplo siguiente muestra estas correcciones, una vez -con los valores predeterminados y otra con correcciones exageradas: +contextos de @rinternals{Voice}. + +El objeto @code{StaffSpacing} (generado en el contexto de +@rinternals{Staff}) contiene la misma propiedad para controlar el +espaciado de las líneas de plica o divisorias. + +El ejemplo siguiente muestra estas correcciones, una vez con los +valores predeterminados y otra con un ajuste exagerado: @lilypond[quote,ragged-right] -{ - c'4 e''4 e'4 b'4 | - b'4 e''4 b'4 e''4 | +\fixed c' { + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | \override Staff.NoteSpacing.stem-spacing-correction = #1.5 \override Staff.StaffSpacing.stem-spacing-correction = #1.5 - c'4 e''4 e'4 b'4 | - b'4 e''4 b'4 e''4 | + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | } @end lilypond @@ -3050,63 +3089,68 @@ Referencia de funcionamiento interno: @rinternals{NonMusicalPaperColumn}. @knownissues -No existe ningún mecanismo conveniente para sobreescribir el espaciado -manualmente. Se puede usar el siguiente rodeo para insertar espacio -adicional en una partitura, ajustando el valor del relleno en la -medida necesaria. +No existe ningún mecanismo conveniente para sobreescribir el +espaciado manualmente. Se puede usar el siguiente rodeo para +insertar espacio adicional en una partitura, ajustando el valor +del relleno en la medida necesaria. @example \override Score.NonMusicalPaperColumn.padding = #10 @end example -No existe ningún rodeo para disminuir la magnitud de la separación. +No existe ningún rodeo para disminuir la magnitud de la +separación. -@node Área de espaciado nueva -@subsection Área de espaciado nueva -@translationof New spacing area +@node Sección de espaciado nueva +@subsection Sección de espaciado nueva +@translationof New spacing section @funindex \newSpacingSection -@cindex área de espaciado nueva -@cindex espaciado, nueva área de +@cindex sección de espaciado nueva +@cindex espaciado, nueva seccción de @cindex notas, espaciar horizontalmente Se pueden iniciar secciones nuevas con diferentes parámetros de -espaciado, con @code{newSpacingSection}. Esto es útil cuando hay -secciones que tienen distinta noción de las notas largas y cortas. +espaciado, con la instrucción @code{newSpacingSection}. Esto es +útil para las secciones que tienen distinta noción de las notas +@q{largas} y @q{cortas}. La instrucción @code{\newSpacingSection} +crea un nuevo objeto @code{SpacingSpanner} en ese momento musical. En el ejemplo siguiente, el cambio de compás introduce una sección -nueva, y por ello las semicorcheas se separan automáticamente -de manera ligeramente más amplia. - -@lilypond[relative=1,verbatim,quote] -\time 2/4 -c4 c8 c -c8 c c4 c16[ c c8] c4 -\newSpacingSection -\time 4/16 -c16[ c c8] +nueva, y por ello las semicorcheas se separan automáticamente de +manera ligeramente más amplia. + +@lilypond[verbatim,quote] +\relative c' { + \time 2/4 + c4 c8 c + c8 c c4 c16[ c c8] c4 + \newSpacingSection + \time 4/16 + c16[ c c8] +} @end lilypond -La instrucción @code{\newSpacingSection} crea un nuevo objeto -@code{SpacingSpanner} en ese momento musical. Si los ajustes de -espaciado automáticos no dan el espaciado deseado, pueden -aplicarse sobreescrituras manuales a sus propiedades con -@code{\override}. Las sobreescrituras se deben aplicar en el -mismo momento musical que la propia instrucción -@code{\newSpacingSection}. Entonces afectarán al espaciado de +Si los ajustes de espaciado automáticos no dan el espaciado +deseado, pueden aplicarse sobreescrituras manuales a sus +propiedades con @code{\override}. Las sobreescrituras se deben +aplicar en el mismo momento musical que la propia instrucción +@code{\newSpacingSection} y afectarán entonces al espaciado de toda la música que venga a continuación hasta que las propiedades se cambien en una nueva sección de espaciado, por ejemplo: -@lilypond[relative=1,verbatim,quote] -\time 4/16 -c16[ c c8] -\newSpacingSection -\override Score.SpacingSpanner.spacing-increment = #2 -c16[ c c8] -\newSpacingSection -\revert Score.SpacingSpanner.spacing-increment -c16[ c c8] +@lilypond[verbatim,quote] +\relative c' { + \time 4/16 + c16[ c c8] + \newSpacingSection + \override Score.SpacingSpanner.spacing-increment = #2 + c16[ c c8] + \newSpacingSection + \revert Score.SpacingSpanner.spacing-increment + c16[ c c8] +} @end lilypond @@ -3123,16 +3167,17 @@ Referencia de funcionamiento interno: @translationof Changing horizontal spacing Se puede alterar el espaciado horizontal con la propiedad -@code{base-shortest-duration}. Aquí compararemos la misma música, una -vez sin alterar la propiedad, y luego alterándola. Los valores -mayores de @code{ly:make-moment} producen música más pequeña. Observe -que @code{ly:make-moment} construye una duración, por lo que @code{1 -4} es una duración mayor que @code{1 16}. +@code{base-shortest-duration}. Aquí compararemos la misma música, +una vez sin alterar la propiedad, y luego alterándola. Los +valores mayores de @code{ly:make-moment} producen música más +pequeña. Observe que @code{ly:make-moment} construye una +duración, por lo que @code{1 4} es una duración mayor que @code{1 +16}. @lilypond[verbatim,line-width=12\cm] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | @@ -3142,8 +3187,8 @@ que @code{ly:make-moment} construye una duración, por lo que @code{1 @lilypond[verbatim,line-width=12\cm] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | @@ -3163,8 +3208,8 @@ De forma predeterminada, el espaciado en los grupos de valoración especial depende de varios factores ajenos a la duración (como alteraciones, cambios de clave, etc.). Para pasar por alto estos símbolos y forzar un espaciado de duraciones iguales uniforme, use -@code{Score.SpacingSpanner.uniform-stretching}. Esta propiedad sólo -puede cambiarse al principio de la partitura: +@code{Score.SpacingSpanner.uniform-stretching}. Esta propiedad +sólo puede cambiarse al principio de la partitura: @lilypond[quote,ragged-right,verbatim] \score { @@ -3185,12 +3230,14 @@ puede cambiarse al principio de la partitura: } @end lilypond -Cuando se establece @code{strict-note-spacing}, las notas se separan -sin tener en cuenta las claves, líneas divisorias ni notas de adorno: +Cuando se establece @code{strict-note-spacing}, las notas se +separan sin tener en cuenta las claves, líneas divisorias ni notas +de adorno: -@lilypond[quote,ragged-right,relative=2,verbatim] +@lilypond[quote,ragged-right,fragment,verbatim] \override Score.SpacingSpanner.strict-note-spacing = ##t -\new Staff { c8[ c \clef alto c \grace { c16 c } c8 c c] c32[ c] } +\new Staff \relative { + c''8[ c \clef alto c \grace { c16 c } c8 c c] c32[ c] } @end lilypond @seealso @@ -3200,7 +3247,7 @@ Fragmentos de código: @node Longitud de la línea @subsection Longitud de la línea -@translationof Line length +@translationof Line width @cindex saltos de página @cindex página, saltos de @@ -3215,28 +3262,29 @@ Fragmentos de código: @c Setting indent in \paper block makes not much sense, but it works. @c Bit verbose and vague, use examples? -Los ajustes más básicos que influyen en el espaciado son @code{indent} -y @code{line-width}. Se definen en el bloque @code{\layout}. -Controlan el sangrado de la primera línea de música y la longitud de -las líneas. - -Si se fija un valor verdadero para @code{ragged-right} en el bloque -@code{\layout}, entonces los sistemas terminan en su longitud -horizontal natural, en lugar de repartirse horizontalmente hasta -llenar toda la línea. Esto es útil para fragmentos cortos, y para -comprobar qué tan apretado es el espaciado natural. -El valor normal predeterminado es falso, pero si la partitura -tiene un solo sistema, el valor predeterminado es verdadero. +Los ajustes más básicos que influyen en el espaciado son +@code{indent} y @code{line-width}. Se definen en el bloque +@code{\layout}. Controlan el sangrado de la primera línea de +música y la longitud de las líneas. + +Si se fija un valor verdadero para @code{ragged-right} en el +bloque @code{\layout}, entonces los sistemas terminan en su +longitud horizontal natural, en lugar de repartirse +horizontalmente hasta llenar toda la línea. Esto es útil para +fragmentos cortos, y para comprobar qué tan apretado es el +espaciado natural. El valor normal predeterminado es falso, pero +si la partitura tiene un solo sistema, el valor predeterminado es +verdadero. @cindex diseño de página @cindex página, disposición de la @cindex vertical, espaciado -La opción @code{ragged-last} es similar a @code{ragged-right}, pero -afecta sólo a la última línea de la pieza. No se efectúa ninguna -restricción sobre dicha línea. El resultado es similar al formateo de -los párrafos de texto. En un párrafo, la última línea sencillamente -ocupa su longitud horizontal natural. +La opción @code{ragged-last} es similar a @code{ragged-right}, +pero afecta sólo a la última línea de la pieza. No se efectúa +ninguna restricción sobre dicha línea. El resultado es similar al +formateo de los párrafos de texto. En un párrafo, la última línea +sencillamente ocupa su longitud horizontal natural. @c Note that for text there are several options for the last line. @c While Knuth TeX uses natural length, lead typesetters use the same @c stretch as the previous line. eTeX uses \lastlinefit to @@ -3261,12 +3309,13 @@ Fragmentos de código: LilyPond contempla la notación proporcional, un tipo de espaciado horizontal en el que cada nota consume una medida horizontal que -equivale exactamente a su duración rítmica. Este tipo de espaciado -proporcional es comparable al espaciado horizontal hecho sobre un -papel milimetrado. Ciertas partituras del finales del s.XX y -principios del s.XXI utilizan notación proporcional para clarificar -relaciones rítmicas complejas o para facilitar la colocación de líneas -cronométricas u otros gráficos directamente en la partitura. +equivale exactamente a su duración rítmica. Este tipo de +espaciado proporcional es comparable al espaciado horizontal hecho +sobre un papel milimetrado. Ciertas partituras del finales del +s.XX y principios del s.XXI utilizan notación proporcional para +clarificar relaciones rítmicas complejas o para facilitar la +colocación de líneas cronométricas u otros gráficos directamente +en la partitura. LilyPond contempla cinco ajustes distintos para la notación proporcional, que se pueden usar solos o combinados: @@ -3279,32 +3328,36 @@ proporcional, que se pueden usar solos o combinados: @item @code{\override PaperColumn.used = ##t} @end itemize -En los ejemplos que siguen, exploramos el uso de estos cinco ajustes -de la notación proporcional y examinamos la forma en que interactúan. +En los ejemplos que siguen, exploramos el uso de estos cinco +ajustes de la notación proporcional y examinamos la forma en que +interactúan. Comenzamos con el siguiente ejemplo de un solo compás, que usa un espaciado clásico sin justificación por la derecha. +@c The initial pitch is not necessary as long as RhythmicStaff is +@c not preceded by other material in the score, but we don't want +@c to explain that. @lilypond[quote,verbatim,ragged-right] \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> } @end lilypond Observe que la blanca que inicia el compás ocupa mucho menos de la -mitad de todo el espacio horizontal del compás. De forma similar, las -semicorcheas y el cinquillo de semicorcheas con que finaliza el compás -ocupan en conjunto mucho más de la mitad de todo el espacio horizontal -del compás. +mitad de todo el espacio horizontal del compás. De forma similar, +las semicorcheas y el cinquillo de semicorcheas con que finaliza +el compás ocupan en conjunto mucho más de la mitad de todo el +espacio horizontal del compás. En el grabado clásico, este espaciado puede ser exactamente el que deseamos porque podemos tomar prestado el espacio horizontal de la -blanca y conservar el espacio horizontal a lo largo del compás como un -todo. +blanca y conservar el espacio horizontal a lo largo del compás +como un todo. Por otro lado, si queremos insertar una línea de tiempo graduada o algún otro gráfico encima o debajo de la partitura, necesitamos la @@ -3315,7 +3368,7 @@ ajuste @code{proportionalNotationDuration}. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3327,43 +3380,45 @@ ajuste @code{proportionalNotationDuration}. } @end lilypond -La blanca al principio del compás y las notas rápidas de la segunda -mitad del compás ocupan ahora cantidades iguales de espacio -horizontal. Podríamos colocar una línea de tiempo graduada o un -gráfico encima o debajo de este ejemplo. - -El ajuste @code{proportionalNotationDuration} es un ajuste de contexto -que reside en @code{Score}. Recordemos que los ajustes de contexto -aparecen en uno de tres posibles lugares del archivo de entrada: en un -bloque @code{\with}, en un bloque @code{\context}, o directamente -entre la música precedido por la instrucción @code{\set}. Como con -todos los ajustes de contexto, el usuario puede elegir en cuál de los -tres lugares diferentes prefiere establecer el valor de +La blanca al principio del compás y las notas rápidas de la +segunda mitad del compás ocupan ahora cantidades iguales de +espacio horizontal. Podríamos colocar una línea de tiempo +graduada o un gráfico encima o debajo de este ejemplo. + +El ajuste @code{proportionalNotationDuration} es un ajuste de +contexto que reside en @code{Score}. Recordemos que los ajustes +de contexto aparecen en uno de tres posibles lugares del archivo +de entrada: en un bloque @code{\with}, en un bloque +@code{\context}, o directamente entre la música precedido por la +instrucción @code{\set}. Como con todos los ajustes de contexto, +el usuario puede elegir en cuál de los tres lugares diferentes +prefiere establecer el valor de @code{proportionalNotationDuration}. El ajuste @code{proportionalNotationDuration} acepta un solo -argumento, que es la duración de referencia contra el que se aplica el -espaciado de toda la música. La función Scheme de LilyPond -@code{make-moment} acepta dos argumentos: un numerador y un -denominador que, juntos, expresan una cierta fracción de redonda. La -llamada @code{(ly:make-moment 1/20)}, por tanto, produce una duración -de referencia de una nota de un veinteavo de redonda (semicorcheas de -cinquillo). Son también posibles valores como -@code{(ly:make-moment 1/16)}, -@code{(ly:make-moment 1/8)} y @code{(ly:make-moment 3/97)}. - -¿Cómo seleccionamos la duración correcta de referencia para pasarla a -@code{proportionalNotationDuration}? Normalmente mediante un proceso -de ensayo y error, comenzando con una duración cercana a la más rápida -(o más breve) duración de la pieza. Las duraciones de referencia más -pequeñas aplican un espaciado más suelto; las duraciones de referencia -más largas aplican un espaciado más apretado. +argumento, que es la duración de referencia contra el que se +aplica el espaciado de toda la música. La función Scheme de +LilyPond @code{make-moment} acepta dos argumentos: un numerador y +un denominador que, juntos, expresan una cierta fracción de +redonda. La llamada @code{(ly:make-moment 1/20)}, por tanto, +produce una duración de referencia de una nota de un veinteavo de +redonda (semicorcheas de cinquillo). Son también posibles valores +como @code{(ly:make-moment 1/16)}, @code{(ly:make-moment 1/8)} y +@code{(ly:make-moment 3/97)}. + +¿Cómo seleccionamos la duración correcta de referencia para +pasarla a @code{proportionalNotationDuration}? Normalmente +mediante un proceso de ensayo y error, comenzando con una duración +cercana a la más rápida (o más breve) duración de la pieza. Las +duraciones de referencia más pequeñas aplican un espaciado más +suelto; las duraciones de referencia más largas aplican un +espaciado más apretado. @lilypond[quote,verbatim,ragged-right] \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3377,7 +3432,7 @@ más largas aplican un espaciado más apretado. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3391,7 +3446,7 @@ más largas aplican un espaciado más apretado. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3404,48 +3459,48 @@ más largas aplican un espaciado más apretado. @end lilypond Observe que una duración de referencia demasiado grande (como la -corchea, en el ejemplo de arriba) produce un espaciado excesivamente -apretado y puede ser causa de colisiones entre las cabezas de nota. -Observe también que la notación proporcional en general ocupa más -espacio horizontal que el espaciado clásico. El espaciado -proporcional aporta claridad rítmica a expensas del espacio -horizontal. +corchea, en el ejemplo de arriba) produce un espaciado +excesivamente apretado y puede ser causa de colisiones entre las +cabezas de nota. Observe también que la notación proporcional en +general ocupa más espacio horizontal que el espaciado clásico. El +espaciado proporcional aporta claridad rítmica a expensas del +espacio horizontal. Ahora veremos cómo espaciar de forma óptima grupos de valoración especial que se superponen. -Empezamos por examinar qué le ocurre a nuestro ejemplo original, con -espaciado clásico, cuando añadimos un segundo pentagrama con un tipo -diferente de grupo especial. +Empezamos por examinar qué le ocurre a nuestro ejemplo original, +con espaciado clásico, cuando añadimos un segundo pentagrama con +un tipo diferente de grupo especial. @lilypond[quote,verbatim,ragged-right] \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } \new RhythmicStaff { - \tuplet 9/8 { c'8 c' c' c' c' c' c' c' c' } + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } } >> } @end lilypond -El espaciado es defectuoso porque las notas regularmente espaciadas -del pentagrama inferior no se amplían de manera uniforme. Los grabados -clásicos incluyen muy pocos tresillos complejos y así las reglas del -grabado clásico pueden generar este tipo de resultado. El -establecimiento de @code{proportionalNotationDuration} lo -soluciona. +El espaciado es defectuoso porque las notas regularmente +espaciadas del pentagrama inferior no se amplían de manera +uniforme. Los grabados clásicos incluyen muy pocos tresillos +complejos y así las reglas del grabado clásico pueden generar este +tipo de resultado. El establecimiento de +@code{proportionalNotationDuration} lo soluciona. @lilypond[quote,verbatim,ragged-right] \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } \new RhythmicStaff { - \tuplet 9/8 { c'8 c' c' c' c' c' c' c' c' } + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } } >> \layout { @@ -3457,20 +3512,20 @@ soluciona. } @end lilypond -Pero si observamos con mucho cuidado podremos ver que las notas de la -segunda mitad del 9-illo están espaciadas de forma ligeramente más -ancha que las de la primera mitad del 9-illo. Para asegurar una -ampliación uniforme, activamos @code{uniform-stretching}, que es una -propiedad de @code{SpacingSpanner}. +Pero si observamos con mucho cuidado podremos ver que las notas de +la segunda mitad del 9-illo están espaciadas de forma ligeramente +más ancha que las de la primera mitad del 9-illo. Para asegurar +una ampliación uniforme, activamos @code{uniform-stretching}, que +es una propiedad de @code{SpacingSpanner}. @lilypond[quote,verbatim,ragged-right] \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } \new RhythmicStaff { - \tuplet 9/8 { c'8 c' c' c' c' c' c' c' c' } + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } } >> \layout { @@ -3483,39 +3538,43 @@ propiedad de @code{SpacingSpanner}. } @end lilypond -Nuestro ejemplo de dos pentagramas ahora está espaciado exactamente, -nuestras relaciones rítmicas son visualmente claras, y podemos incluir -una línea de tiempo graduada o un gráfico, si queremos. +Nuestro ejemplo de dos pentagramas ahora está espaciado +exactamente, nuestras relaciones rítmicas son visualmente claras, +y podemos incluir una línea de tiempo graduada o un gráfico, si +queremos. -Observe que el paquete de notación proporcional de LilyPond espera que -todas las partituras proporcionales establezcan el atributo -@code{uniform-stretching} de @code{SpacingSpanner} al valor ##t. El -establecimiento de @code{proportionalNotationDuration} sin ajustar -también el atributo @code{uniform-stretching} de @code{SpacingSpanner} -al valor ##t causará, por ejemplo, que los desplazamientos -(@code{skips}) consuman una cantidad de espacio horizontal incorrecta. +Observe que el paquete de notación proporcional de LilyPond espera +que todas las partituras proporcionales establezcan el atributo +@code{uniform-stretching} de @code{SpacingSpanner} al valor ##t. +El establecimiento de @code{proportionalNotationDuration} sin +ajustar también el atributo @code{uniform-stretching} de +@code{SpacingSpanner} al valor ##t causará, por ejemplo, que los +desplazamientos (@code{skips}) consuman una cantidad de espacio +horizontal incorrecta. El @code{SpacingSpanner} es un grob abstracto que reside en el contexto de @code{Score}. Como con nuestros ajustes de @code{proportionalNotationDuration}, las sobreescrituras al -@code{SpacingSpanner} sólo pueden ocurrir en uno de estos tres lugares -dentro del archivo de entrada: en el bloque @code{\with}, en el bloque -@code{\context} o directamente dentro de la escritura de notas. +@code{SpacingSpanner} sólo pueden ocurrir en uno de estos tres +lugares dentro del archivo de entrada: en el bloque @code{\with}, +en el bloque @code{\context} o directamente dentro de la escritura +de notas. De manera predeterminada, sólo hay un @code{SpacingSpanner} por -@code{Score}. Esto supone que, por omisión, @code{uniform-stretching} -está activado para la partitura completa o desactivado para la -partitura completa. Sin embargo, podemos sobreescribir este -comportamiento y activar distintas posibilidades de espaciado en -distintos lugares de la partitura. Lo hacemos con la instrucción -@code{\newSpacingSection}. Consulte @ref{Área de espaciado nueva} -para más información. +@code{Score}. Esto supone que, por omisión, +@code{uniform-stretching} está activado para la partitura completa +o desactivado para la partitura completa. Sin embargo, podemos +sobreescribir este comportamiento y activar distintas +posibilidades de espaciado en distintos lugares de la partitura. +Lo hacemos con la instrucción @code{\newSpacingSection}. Consulte +@ref{Sección de espaciado nueva} para más información. A continuación examinamos los efectos del grabador -@code{Separating_line_group_engraver} y veremos por qué las partituras -proporcionales con frecuencia eliminan este grabador. El ejemplo -siguiente muestra que hay una pequeña cantidad de espacio -@qq{preliminar} justo antes de la primera nota de cada sistema. +@code{Separating_line_group_engraver} y veremos por qué las +partituras proporcionales con frecuencia eliminan este grabador. +El ejemplo siguiente muestra que hay una pequeña cantidad de +espacio @qq{preliminar} justo antes de la primera nota de cada +sistema. @lilypond[quote,verbatim,ragged-right] \paper { @@ -3531,9 +3590,9 @@ siguiente muestra que hay una pequeña cantidad de espacio Esta cantidad de espacio preliminar es la misma ya sea después de una indicación de compás, una armadura o una clave. El grabador -@code{Separating_line_group_engraver} es responsable de este espacio. -La eliminación de @code{Separating_line_group_engraver} reduce este -espacio a cero. +@code{Separating_line_group_engraver} es responsable de este +espacio. La eliminación de @code{Separating_line_group_engraver} +reduce este espacio a cero. @lilypond[quote,verbatim,ragged-right] \paper { @@ -3549,36 +3608,38 @@ espacio a cero. } @end lilypond -Los elementos no musicales como la indicación de compás, la armadura, -la clave y las alteraciones son problemáticos en notación -proporcional. Ninguno de estos elementos tiene duración rítmica. -Pero todos ellos consumen espacio horizontal. Las distintas -partituras proporcionales abordan este problema de distinta manera. +Los elementos no musicales como la indicación de compás, la +armadura, la clave y las alteraciones son problemáticos en +notación proporcional. Ninguno de estos elementos tiene duración +rítmica. Pero todos ellos consumen espacio horizontal. Las +distintas partituras proporcionales abordan este problema de +distinta manera. Sería posible evitar los problemas de espaciado con las armaduras, -simplemente evitando tenerlas. Esta es una opción válida pues casi -todas las partituras proporcionales son música contemporánea. Lo -mismo puede valer para las indicaciones de compás, especialmente para -las partituras que incluyen una línea de tiempo graduada u otro -gráfico. Pero estas partituras son excepcionales y casi todas las -partituras proporcionales incluyen al menos unas pocas indicaciones de -compás. Las claves y las alteraciones son aún más esenciales. - -Así pues ¿qué estrategias existen para el espaciado de los elementos -no musicales en un contexto proporcional? Una buena opción es la -propiedad @code{strict-note-spacing} de @code{SpacingSpanner}. -Compare las dos partituras siguientes: +simplemente evitando tenerlas. Esta es una opción válida pues +casi todas las partituras proporcionales son música contemporánea. +Lo mismo puede valer para las indicaciones de compás, +especialmente para las partituras que incluyen una línea de tiempo +graduada u otro gráfico. Pero estas partituras son excepcionales +y casi todas las partituras proporcionales incluyen al menos unas +pocas indicaciones de compás. Las claves y las alteraciones son +aún más esenciales. + +Así pues ¿qué estrategias existen para el espaciado de los +elementos no musicales en un contexto proporcional? Una buena +opción es la propiedad @code{strict-note-spacing} de +@code{SpacingSpanner}. Compare las dos partituras siguientes: @lilypond[quote,verbatim,ragged-right] \new Staff { \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) - c''8 c'' c'' \clef alto d' d'2 + c''8 8 8 \clef alto d'2 2 } \new Staff { \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) \override Score.SpacingSpanner.strict-note-spacing = ##t - c''8 c'' c'' \clef alto d' d'2 + c''8 8 8 \clef alto d'2 2 } @end lilypond @@ -3586,9 +3647,9 @@ Las dos partituras son proporcionales, pero el espaciado de la primera es muy suelto a causa del cambio de clave. Sin embargo, el espaciado de la segunda partitura se mantiene estricto, porque @code{strict-note-spacing} está activado. La activación de -@code{strict-note-spacing} hace que el ancho de las indicaciones de -compás, armaduras, cambios de clave y alteraciones no tomen parte en -el algoritmo de espaciado. +@code{strict-note-spacing} hace que el ancho de las indicaciones +de compás, armaduras, cambios de clave y alteraciones no tomen +parte en el algoritmo de espaciado. Además de los ajustes dados aquí, hay otros que aparecen con frecuencia en las partituras proporcionales. Entre ellos están: @@ -3603,14 +3664,15 @@ frecuencia en las partituras proporcionales. Entre ellos están: @end itemize Estos ajustes dan a las notas de adorno un espaciado estricto, -extienden los corchetes de grupo especial para que marquen tanto los -puntos de comienzo como de final, y permiten que los elementos de -extensión se dividan entre los sistemas y las páginas. Consulte las -partes respectivas del manual para ver estos ajustes relacionados. +extienden los corchetes de grupo especial para que marquen tanto +los puntos de comienzo como de final, y permiten que los elementos +de extensión se dividan entre los sistemas y las páginas. +Consulte las partes respectivas del manual para ver estos ajustes +relacionados. @seealso Referencia de la notación: -@ref{Área de espaciado nueva}. +@ref{Sección de espaciado nueva}. Fragmentos de código: @rlsr{Spacing}. @@ -3622,13 +3684,14 @@ Fragmentos de código: En ocasiones, podemos terminar con uno o dos pentagramas en una segunda página (o tercera, o cuarta@dots{}). Es fastidioso, -especialmente cuando vemos que las páginas anteriores parecen tener -espacio de sobra. +especialmente cuando vemos que las páginas anteriores parecen +tener espacio de sobra. -Al investigar los problemas de disposición, una herramienta de valor -incalculable es @code{annotate-spacing}. Esta instrucción imprime los -valores de un cierto número de variables de espaciado; para ver más -detalles consulte la sección siguiente, @ref{Mostrar el espaciado}. +Al investigar los problemas de disposición, una herramienta de +valor incalculable es @code{annotate-spacing}. Esta instrucción +imprime los valores de un cierto número de variables de espaciado; +para ver más detalles consulte la sección siguiente, +@ref{Mostrar el espaciado}. @menu * Mostrar el espaciado:: @@ -3644,8 +3707,9 @@ detalles consulte la sección siguiente, @ref{Mostrar el espaciado}. @funindex annotate-spacing Para presentar gráficamente las dimensiones de las variables de -disposición vertical que pueden verse alteradas por el formato de la -página, establezca @code{annotate-spacing} en el bloque @code{\paper}: +disposición vertical que pueden verse alteradas por el formato de +la página, establezca @code{annotate-spacing} en el bloque +@code{\paper}: @lilypond[verbatim,quote,papersize=a6landscape] \book { @@ -3656,11 +3720,12 @@ página, establezca @code{annotate-spacing} en el bloque @code{\paper}: @noindent Todas las dimensiones de disposición se muestran en espacios de -pentagrama, independientemente de las unidades especificadas en los -bloques @code{\paper} o @code{\layout}. En el ejemplo anterior, -@code{paper-height} tiene un valor de 59.75 @code{staff-spaces} -(espacios de pentagrama), y el @code{staff-size} (tamaño del -pentagrama) es de 20 puntos, el valor predeterminado. Observe que: +pentagrama, independientemente de las unidades especificadas en +los bloques @code{\paper} o @code{\layout}. En el ejemplo +anterior, @code{paper-height} tiene un valor de 59.75 +@code{staff-spaces} (espacios de pentagrama), y el +@code{staff-size} (tamaño del pentagrama) es de 20 puntos, el +valor predeterminado. Observe que: @multitable {1 staff-space} {staff-size)/4 * (25.4/72.27) mm} @@ -3677,10 +3742,10 @@ pentagrama) es de 20 puntos, el valor predeterminado. Observe que: @noindent En este caso, un @code{staff-space} equivale aproximadamente a 1.757mm. Así, la medida @code{paper-height} de 59.75 -@code{staff-spaces} equivale a 105 milímetros, la altura de una hoja -@code{a6} en orientación apaisada. Las parejas (@var{a},@var{b}) son -intervalos, donde @var{a} es el límite inferior y @var{b} es el límite -superior del intervalo. +@code{staff-spaces} equivale a 105 milímetros, la altura de una +hoja @code{a6} en orientación apaisada. Las parejas +(@var{a},@var{b}) son intervalos, donde @var{a} es el límite +inferior y @var{b} es el límite superior del intervalo. @seealso Referencia de la notación: @@ -3694,19 +3759,20 @@ Fragmentos de código: @subsection Cambiar el espaciado @translationof Changing spacing -La salida de @code{annotate-spacing} revela las dimensiones verticales -con gran detalle. Para ver más detalles acerca de la modificación de -los márgenes y otras variables de diseño de la página, consulte -@ref{Disposición de la página}. +La salida de @code{annotate-spacing} revela las dimensiones +verticales con gran detalle. Para ver más detalles acerca de la +modificación de los márgenes y otras variables de diseño de la +página, consulte @ref{Disposición de la página}. -Aparte de los márgenes, hay algunas otras opciones para ahorrar espacio: +Aparte de los márgenes, hay algunas otras opciones para ahorrar +espacio: @itemize @item Forzar los sistemas para que se junten lo más posible entre sí (de -forma que quepan la mayor cantidad de ellos en la página) y al mismo -tiempo estén espaciados de forma que no exista un espacio vacío en la -parte baja del papel. +forma que quepan la mayor cantidad de ellos en la página) y al +mismo tiempo estén espaciados de forma que no exista un espacio +vacío en la parte baja del papel. @example \paper @{ @@ -3717,16 +3783,17 @@ parte baja del papel. @end example @item -Forzar el número de sistemas. Puede ser de utilidad de dos formas. -Si tan sólo se establece un valor, incluso el mismo valor que el -número de sistemas que se están trazando de forma predeterminada, ello -ocasionará a veces que se traten de introducir más sistemas en cada -página, pues en este caso se omite un paso en que se produce una -estimación, dando así un encaje mejor en cada página. Asimismo, el -forzar una reducción neta en el número de sistemas puede producir el -ahorro de una página adicional. Por ejemplo, si la disposición -predeterminada tiene 11 sistemas, la asignación siguiente fuerza una -disposición con 10 sistemas. +Forzar el número de sistemas. Puede ser de utilidad de dos +formas. Si tan sólo se establece un valor, incluso el mismo valor +que el número de sistemas que se están trazando de forma +predeterminada, ello ocasionará a veces que se traten de +introducir más sistemas en cada página, pues en este caso se omite +un paso en que se produce una estimación, dando así un encaje +mejor en cada página. Asimismo, el forzar una reducción neta en +el número de sistemas puede producir el ahorro de una página +adicional. Por ejemplo, si la disposición predeterminada tiene 11 +sistemas, la asignación siguiente fuerza una disposición con 10 +sistemas. @example \paper @{ @@ -3735,8 +3802,8 @@ disposición con 10 sistemas. @end example @item -Forzar el número de páginas. Por ejemplo, la asignación -siguiente fuerza una disposición con dos páginas. +Forzar el número de páginas. Por ejemplo, la asignación siguiente +fuerza una disposición con dos páginas. @example \paper @{ @@ -3746,28 +3813,31 @@ siguiente fuerza una disposición con dos páginas. @item Evitar (o reducir en número) los objetos que aumentan el tamaño -vertical de un sistema. Por ejemplo, las repeticiones de primera y -segunda vez (o repeticiones con finales alternativos) necesitan -espacio adicional. Si estas repeticiones se reparten a lo largo de -dos sistemas, ocupan más espacio que un sistema con las casillas de -repetición y otro sistema sin ellas. Por ejemplo, las indicaciones -dinámicas que se @q{salen} de un sistema se pueden acercar al -pentagrama: - -@lilypond[verbatim,quote,relative=1] -e4 c g\f c -e4 c g-\tweak X-offset #-2.7 \f c +vertical de un sistema. Por ejemplo, los corchetes de las +repeticiones de primera y segunda vez (o repeticiones con finales +alternativos) necesitan espacio adicional. Si estas casillas se +reparten a lo largo de dos sistemas, ocupan más espacio que si +estuvieran sobre el mismo sistema. Como otro ejemplo, las +indicaciones dinámicas que se @q{salen} de un sistema se pueden +acercar al pentagrama: + +@lilypond[verbatim,quote] +\relative e' { + e4 c g\f c + e4 c g-\tweak X-offset #-2.7 \f c +} @end lilypond @item -Alterar el espaciado horizontal por medio de @code{SpacingSpanner}. -Para ver más detalles, consulte @ref{Cambiar el espaciado horizontal}. -El ejemplo siguiente ilustra el espaciado predeterminado: +Alterar el espaciado horizontal por medio de +@code{SpacingSpanner}. Para ver más detalles, consulte +@ref{Cambiar el espaciado horizontal}. El ejemplo siguiente +ilustra el espaciado predeterminado: @lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | @@ -3777,15 +3847,15 @@ El ejemplo siguiente ilustra el espaciado predeterminado: @end lilypond @noindent -El ejemplo siguiente modifica @code{common-shortest-duration} de un -valor de @code{1/4} (negra) a @code{1/2} (blanca). La negra es la -nota más común y la más breve del ejemplo, por lo que al agrandar esta -duración se produce un efecto de @q{apretujamiento}: +El ejemplo siguiente modifica @code{common-shortest-duration} de +un valor de @code{1/4} (negra) a @code{1/2} (blanca). La negra es +la nota más común y la más breve del ejemplo, por lo que al +agrandar esta duración se produce un efecto de @q{apretujamiento}: @lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | @@ -3802,8 +3872,8 @@ duración se produce un efecto de @q{apretujamiento}: @end lilypond @noindent -La propiedad @code{common-shortest-duration} no se puede modificar de -manera dinámica, por lo que se debe situar siempre dentro de un +La propiedad @code{common-shortest-duration} no se puede modificar +de manera dinámica, por lo que se debe situar siempre dentro de un bloque @code{\context} de forma que se aplique a la partitura completa. diff --git a/Documentation/es/notation/staff.itely b/Documentation/es/notation/staff.itely index c642b6e389..cf585bc585 100644 --- a/Documentation/es/notation/staff.itely +++ b/Documentation/es/notation/staff.itely @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 9b0c8394bbd8510cfc39c40342879703a4b3d2c1 + Translation of GIT committish: 19d0e8e1a9cee3444ec4915b1d2d116e67f5b3f7 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @node Notación de los pentagramas @section Notación de los pentagramas @@ -18,8 +18,8 @@ @lilypondfile[quote,ragged-right,line-width=14.5\cm,staffsize=16]{staff-headword.ly} Esta sección explica cómo influir sobre la apariencia de los -pentagramas, cómo imprimir partituras con más de un pentagrama y cómo -añadir indicaciones de tempo y notas guía a los pentagramas. +pentagramas, cómo imprimir partituras con más de un pentagrama y +cómo añadir indicaciones de tempo y notas guía a los pentagramas. @menu * Impresión de los pentagramas:: @@ -32,8 +32,8 @@ añadir indicaciones de tempo y notas guía a los pentagramas. @subsection Impresión de los pentagramas @translationof Displaying staves -Esta sección describe los distintos métodos de creación de pentagramas -y grupos de ellos. +Esta sección describe los distintos métodos de creación de +pentagramas y grupos de ellos. @menu * Crear instancias de pentagramas nuevos:: @@ -61,7 +61,6 @@ y grupos de ellos. @cindex tablatura, pauta de @funindex \drummode -@funindex drummode @funindex DrumStaff @funindex RhythmicStaff @funindex TabStaff @@ -69,22 +68,23 @@ y grupos de ellos. @funindex VaticanaStaff @funindex GregorianTranscriptionStaff -Las @notation{pautas} y los @notation{pentagramas} o pautas de cinco -líneas se crean con las instrucciones @code{\new} o @code{\context}. -Para ver más detalles, consulte @ref{Crear y referenciar contextos}. +Las @notation{pautas} y los @notation{pentagramas} o pautas de +cinco líneas se crean con las instrucciones @code{\new} o +@code{\context}. Para ver más detalles, consulte @ref{Crear y +referenciar contextos}. El contexto básico de pentagrama es @code{Staff}: -@lilypond[verbatim,quote,relative=2] -\new Staff { c4 d e f } +@lilypond[verbatim,quote] +\new Staff \relative { c''4 d e f } @end lilypond -El contexto @code{DrumStaff} crea una pauta de cinco líneas preparada -para un conjunto de batería típico. Cada instrumento se presenta con -un símbolo distinto. Los instrumentos se escriben en el modo de -percusión que sigue a una instrucción @code{\drummode}, con cada -instrumento identificado por un nombre. Para ver más detalles, -consulte @ref{Pautas de percusión}. +El contexto @code{DrumStaff} crea una pauta de cinco líneas +preparada para un conjunto de batería típico. Cada instrumento se +presenta con un símbolo distinto. Los instrumentos se escriben en +el modo de percusión que sigue a una instrucción @code{\drummode}, +con cada instrumento identificado por un nombre. Para ver más +detalles, consulte @ref{Pautas de percusión}. @lilypond[verbatim,quote] \new DrumStaff { @@ -92,34 +92,36 @@ consulte @ref{Pautas de percusión}. } @end lilypond -@code{RhythmicStaff} crea una pauta de una sola línea que sólo muestra -las duraciones de la entrada. Se preservan las duraciones reales. -Para ver más detalles, consulte @ref{Mostrar los ritmos de la melodía}. +@code{RhythmicStaff} crea una pauta de una sola línea que sólo +muestra las duraciones de la entrada. Se preservan las duraciones +reales. Para ver más detalles, consulte +@ref{Mostrar los ritmos de la melodía}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new RhythmicStaff { c4 d e f } @end lilypond -@code{TabStaff} crea una tablatura con seis cuerdas en la afinación -estándar de guitarra. Para ver más detalles, consulte @ref{Tablaturas predeterminadas}. +@code{TabStaff} crea una tablatura con seis cuerdas en la +afinación estándar de guitarra. Para ver más detalles, consulte +@ref{Tablaturas predeterminadas}. -@lilypond[verbatim,quote,relative=2] -\new TabStaff { c4 d e f } +@lilypond[verbatim,quote] +\new TabStaff \relative { c''4 d e f } @end lilypond -Existen dos contextos de pauta específicos para la notación de música -antigua: @code{MensuralStaff} y @code{VaticanaStaff}. Se describen en -@ref{Contextos predefinidos}. +Existen dos contextos de pauta específicos para la notación de +música antigua: @code{MensuralStaff} y @code{VaticanaStaff}. Se +describen en @ref{Contextos predefinidos}. @code{GregorianTranscriptionStaff} crea una pauta para la notación moderna de canto gregoriano. No muestra líneas divisorias. -@lilypond[verbatim,quote,relative=2] -\new GregorianTranscriptionStaff { c4 d e f e d } +@lilypond[verbatim,quote] +\new GregorianTranscriptionStaff \relative { c''4 d e f e d } @end lilypond -Se pueden definir contextos nuevos de pentagrama único. Para ver más -detalles, consulte @ref{Definir contextos nuevos}. +Se pueden definir contextos nuevos de pentagrama único. Para ver +más detalles, consulte @ref{Definir contextos nuevos}. @seealso Glosario musical: @@ -171,61 +173,63 @@ Referencia de funcionamiento interno: @cindex sistema Existen varios contextos para agrupar pentagramas individuales -formando sistemas. Cada contexto de agrupación establece el estilo -del delimitador de comienzo del sistema y el comportamiento de las -barras de compás. +formando sistemas. Cada contexto de agrupación establece el +estilo del delimitador de comienzo del sistema y el comportamiento +de las barras de compás. Si no se especifica ningún contexto, se usan las propiedades -predeterminadas: el grupo comienza con una línea vertical y las barras -de compás no están conectadas. +predeterminadas: el grupo comienza con una línea vertical y las +barras de compás no están conectadas. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond -En el contexto @code{StaffGroup}, el grupo se inicia con un corchete y -las barras de compás se dibujan atravesando todos los pentagramas. +En el contexto @code{StaffGroup}, el grupo se inicia con un +corchete y las barras de compás se dibujan atravesando todos los +pentagramas. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond -En un @code{ChoirStaff} (sistema de coro), el grupo se inicia con un -corchete, pero las barras de compás no están conectadas. +En un @code{ChoirStaff} (sistema de coro), el grupo se inicia con +un corchete, pero las barras de compás no están conectadas. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new ChoirStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond -En un @code{GrandStaff} (sistema de piano), el grupo se inicia con una -llave y las barras de compás se conectan entre los pentagramas. +En un @code{GrandStaff} (sistema de piano), el grupo se inicia con +una llave y las barras de compás se conectan entre los +pentagramas. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new GrandStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond El @code{PianoStaff} (sistema de piano) es idéntico a -@code{GrandStaff}, excepto que contempla directamente la impresión del -nombre del instrumento. Para ver más detalles, consulte +@code{GrandStaff}, excepto que contempla directamente la impresión +del nombre del instrumento. Para ver más detalles, consulte @ref{Nombres de instrumentos}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new PianoStaff << \set PianoStaff.instrumentName = #"Piano" - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { \clef bass c1 c } >> @end lilypond @@ -237,8 +241,8 @@ siguientes valores: @code{SystemStartBar} (línea), @code{SystemStartSquare} (corchete en ángulo recto), pero se debe especificar explícitamente. -Se pueden definir contextos nuevos de grupo de pentagramas. Para ver -más detalles, consulte @ref{Definir contextos nuevos}. +Se pueden definir contextos nuevos de grupo de pentagramas. Para +ver más detalles, consulte @ref{Definir contextos nuevos}. @snippets @lilypondfile[verbatim,quote,texidoc,doctitle] @@ -280,9 +284,6 @@ Referencia de funcionamiento interno: @rinternals{SystemStartBracket}, @rinternals{SystemStartSquare}. -@knownissues -@code{PianoStaff} no acepta @code{ChordNames} de forma predeterminada. - @node Grupos de pentagramas anidados @unnumberedsubsubsec Grupos de pentagramas anidados @@ -296,27 +297,28 @@ Referencia de funcionamiento interno: @cindex llaves, anidado de Los contextos de grupos de pentagramas se pueden anidar hasta una -profundidad arbitraria. En este caso, cada contexto descendiente crea -un corchete nuevo adyacente al corchete de su grupo padre. +profundidad arbitraria. En este caso, cada contexto descendiente +crea un corchete nuevo adyacente al corchete de su grupo padre. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c2 c | c2 c } + \new Staff \relative { c''2 c | c2 c } \new StaffGroup << - \new Staff { g2 g | g2 g } + \new Staff \relative { g'2 g | g2 g } \new StaffGroup \with { systemStartDelimiter = #'SystemStartSquare } << - \new Staff { e2 e | e2 e } - \new Staff { c2 c | c2 c } + \new Staff \relative { e'2 e | e2 e } + \new Staff \relative { c'2 c | c2 c } >> >> >> @end lilypond -Se pueden definir nuevos contextos de grupos de pentagramas anidados. -Para ver más detalles, consulte @ref{Definir contextos nuevos}. +Se pueden definir nuevos contextos de grupos de pentagramas +anidados. Para ver más detalles, consulte +@ref{Definir contextos nuevos}. @snippets @lilypondfile[verbatim,quote,texidoc,doctitle] @@ -347,9 +349,9 @@ Referencia de funcionamiento interno: @cindex separación de sistemas, marca de Si el número de sistemas por página varía de una página a otra, es -costumbre separar los sistemas colocando una marca separadora entre -ellos. De forma predeterminada, el separador de sistemas es nulo, -pero se puede activar con una opción de @code{\paper}. +costumbre separar los sistemas colocando una marca separadora +entre ellos. De forma predeterminada, el separador de sistemas es +nulo, pero se puede activar con una opción de @code{\paper}. @c \book is required here to display the system separator @c ragged-right is required as there are two systems @@ -358,15 +360,15 @@ pero se puede activar con una opción de @code{\paper}. \score { \new StaffGroup << \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } } \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } @@ -396,9 +398,9 @@ Fragmentos de código: @translationof Modifying single staves Esta sección explica cómo cambiar los atributos específicos de un -pentagrama: por ejemplo, cambiar el número de líneas o el tamaño de la -pauta. También se describen los métodos para comenzar y terminar los -pentagramas, y establecer secciones de ossia. +pentagrama: por ejemplo, cambiar el número de líneas o el tamaño +de la pauta. También se describen los métodos para comenzar y +terminar los pentagramas, y establecer secciones de ossia. @menu * El símbolo del pentagrama:: @@ -421,19 +423,19 @@ pentagramas, y establecer secciones de ossia. @cindex líneas adicionales @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff Se pueden usar las instrucciones @code{\stopStaff} y @code{\startStaff} para detener y (re)iniciar, respectivamente, la impresión de las líneas de la pauta en cualquier punto de la partitura. -@lilypond[verbatim,quote,relative=2] -\stopStaff f4 d \startStaff g, e -f'4 d \stopStaff g, e -f'4 d \startStaff g, e +@lilypond[verbatim,quote] +\relative { + \stopStaff f''4 d \startStaff g, e + f'4 d \stopStaff g, e + f'4 d \startStaff g, e +} @end lilypond @predefined @@ -442,20 +444,22 @@ f'4 d \startStaff g, e @endpredefined Las líneas de la pauta pertenecen al grob @code{StaffSymbol} -(incluidas las líneas adicionales) y se pueden modificar usando las -propiedades de @code{StaffSymbol}, pero esas modificaciones deben -hacerse antes de que el pentagrama se (re)inicie. +(incluidas las líneas adicionales) y se pueden modificar usando +las propiedades de @code{StaffSymbol}, pero esas modificaciones +deben hacerse antes de que el pentagrama se (re)inicie. Se puede cambiar el número de líneas de la pauta: -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-count = #2 -\startStaff g, e | - -f'4 d \stopStaff -\revert Staff.StaffSymbol.line-count -\startStaff g, e | +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-count = #2 + \startStaff g, e | + + f'4 d \stopStaff + \revert Staff.StaffSymbol.line-count + \startStaff g, e | +} @end lilypond La posición de cada una de las líneas de la pauta también puede @@ -467,13 +471,15 @@ línea de pauta por cada valor que se introduce, de manera que el número de líneas así como su posición en la pauta pueden cambiarse con una sola operación de sobreescritura. -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) -\startStaff g, e | -f'4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) -\startStaff g, e +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) + \startStaff g, e | + f'4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) + \startStaff g, e | +} @end lilypond Para preservar las direcciones típicas de las plicas (hacia arriba @@ -484,82 +490,88 @@ pauta personalizada con la posición de la línea central normal del Do@tie{}central para que se correspondan a las líneas nuevas. Véase @ref{Clave}. -Puede cambiarse el grosor de las líneas de la pauta. También resultan -afectadas, de forma predeterminada, las líneas adicionales y no la -plica de las figuras. +Puede cambiarse el grosor de las líneas de la pauta. También +resultan afectadas, de forma predeterminada, las líneas +adicionales y no la plica de las figuras. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #3 +} \relative { + f''4 d g, e } -{ f4 d g, e } @end lilypond También es posible fijar el grosor de las líneas adicionales de forma independiente del de las líneas de la pauta. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #2 \override StaffSymbol.ledger-line-thickness = #'(0.5 . 0.4) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond @noindent -El primer valor se multiplica por -el grosor de las líneas del pentagrama, -el segundo por el ancho de un espacio del pentagrama, y después -los dos valores se suman para obtener el grosor de -las líneas adicionales. +El primer valor se multiplica por el grosor de las líneas del +pentagrama, el segundo por el ancho de un espacio del pentagrama, +y después los dos valores se suman para obtener el grosor de las +líneas adicionales. Se pueden alterar las posiciones de las líneas adicionales: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-positions = #'(-3 -2 -1 2 5 6) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond -Puede hacerse que las líneas adicionales añadidas aparezcan por encima -o por debajo de la cabeza de las figuras, dependiendo de la posición -actual relativa a otras cabezas de figura que tienen asimismo sus -propias líneas adicionales. +Puede hacerse que las líneas adicionales añadidas aparezcan por +encima o por debajo de la cabeza de las figuras, dependiendo de la +posición actual relativa a otras cabezas de figura que tienen +asimismo sus propias líneas adicionales. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-extra = #4 +} \relative { + f'''4 a, d, f, } -{ f'4 a, d, f, } @end lilypond -También puede hacerse que las líneas adicionales aparezcan dentro del -pentagrama allí donde se requieren líneas de pauta personalizadas. El -ejemplo muestra la posición predeterminada de las líneas adicionales -cuando el valor de posición explícito @code{ledger-position} se ha -fijado o no. La instrucción @code{\stopStaff} se necesita en el -ejemplo para revertir la instrucción de sobreescritura -@code{\override} para todo el @code{StaffSymbol} (el símbolo de -pauta). - -@lilypond[verbatim,quote,relative=1] -\override Staff.StaffSymbol.line-positions = #'(-8 0 2 4) -d4 e f g -\stopStaff -\startStaff -\override Staff.StaffSymbol.ledger-positions = #'(-8 -6 (-4 -2) 0) -d4 e f g +También puede hacerse que las líneas adicionales aparezcan dentro +del pentagrama allí donde se requieren líneas de pauta +personalizadas. El ejemplo muestra la posición predeterminada de +las líneas adicionales cuando el valor de posición explícito +@code{ledger-position} se ha fijado o no. La instrucción +@code{\stopStaff} se necesita en el ejemplo para revertir la +instrucción de sobreescritura @code{\override} para todo el +@code{StaffSymbol} (el símbolo de pauta). + +@lilypond[verbatim,quote] +\relative d' { + \override Staff.StaffSymbol.line-positions = #'(-8 0 2 4) + d4 e f g + \stopStaff + \startStaff + \override Staff.StaffSymbol.ledger-positions = #'(-8 -6 (-4 -2) 0) + d4 e f g +} @end lilypond -Puede alterarse la distancia entre líneas de la pauta. Esto afecta -también al espaciado de las líneas adicionales. +Puede alterarse la distancia entre líneas de la pauta. Esto +afecta también al espaciado de las líneas adicionales. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.staff-space = #1.5 +} \relative { + f'''4 d, g, e, } -{ f'4 d, g, e, } @end lilypond @snippets @@ -594,16 +606,15 @@ Referencia de funcionamiento interno: @cindex escalado de pentagramas @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff Los pentagramas @notation{Ossia} se pueden preparar mediante la -creación de un pentagrama simultáneo nuevo en la posición adecuada: +creación de un pentagrama simultáneo nuevo en la posición +adecuada: @lilypond[verbatim,quote] -\new Staff \relative c'' { - c4 b d c +\new Staff \relative { + c''4 b d c << { c4 b d c } \new Staff { e4 d f e } @@ -613,29 +624,28 @@ creación de un pentagrama simultáneo nuevo en la posición adecuada: @end lilypond @noindent -Sin embargo, el ejemplo anterior no es lo que normalmente se desea. -Para crear pentagramas de ossia que estén encima del pentagrama -original, que no tengan compás ni clave, y que tengan un tamaño menor -de tipografía se deben usar varios trucos. El Manual de aprendizaje -describe una técnica específica para llegar a este objetivo, empezando -por @rlearning{Anidado de expresiones musicales}. +Sin embargo, el ejemplo anterior no es lo que normalmente se +desea. Para crear pentagramas de ossia que estén encima del +pentagrama original, que no tengan compás ni clave, y que tengan +un tamaño menor de tipografía se deben usar varios trucos. El +Manual de aprendizaje describe una técnica específica para llegar +a este objetivo, empezando por @rlearning{Anidado de expresiones +musicales}. El ejemplo siguiente utiliza la propiedad @code{alignAboveContext} -para alinear el pentagrama de ossia. Este método es muy conveniente -cuando se necesitan sólo algunos pentagramas de ossia. +para alinear el pentagrama de ossia. Este método es muy +conveniente cuando se necesitan sólo algunos pentagramas de ossia. @lilypond[verbatim,quote] -\new Staff = "main" \relative c'' { - c4 b d c +\new Staff = "main" \relative { + c''4 b d c << { c4 b d c } \new Staff \with { \remove "Time_signature_engraver" alignAboveContext = #"main" - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) + \magnifyStaff #2/3 firstClef = ##f } { e4 d f e } @@ -644,27 +654,25 @@ cuando se necesitan sólo algunos pentagramas de ossia. } @end lilypond -Si se requieren muchos pentagramas de ossia aislados, puede ser más -conveniente la creación de un contexto @code{Staff} vacío con un -@emph{identificador de contexto} específico; después se pueden crear -los pentagramas de ossia @emph{llamando} a este contexto y usando -@code{\startStaff} y @code{\stopStaff} en los puntos deseados. Las -ventajas de este método son más patentes si la pieza es más larga que -en ejemplo siguiente. +Si se requieren muchos pentagramas de ossia aislados, puede ser +más conveniente la creación de un contexto @code{Staff} vacío con +un @emph{identificador de contexto} específico; después se pueden +crear los pentagramas de ossia @emph{llamando} a este contexto y +usando @code{\startStaff} y @code{\stopStaff} en los puntos +deseados. Las ventajas de este método son más patentes si la +pieza es más larga que en ejemplo siguiente. @lilypond[verbatim,quote,ragged-right] << \new Staff = "ossia" \with { \remove "Time_signature_engraver" \hide Clef - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) + \magnifyStaff #2/3 } { \stopStaff s1*6 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 << { e4 f e2 } \context Staff = "ossia" { @@ -685,25 +693,25 @@ en ejemplo siguiente. @end lilypond Como alternativa, se puede usar la instrucción -@code{\RemoveEmptyStaves} para crear pentagramas de ossia. Este -método es muy conveniente cuando los pentagramas de ossia aparecen -inmediatamente después de un salto de línea. Para ver más información -sobre @code{\RemoveEmptyStaves}, consulte @ref{Ocultar pentagramas}. +@code{\RemoveAllEmptyStaves} para crear pentagramas de ossia. +Este método es muy conveniente cuando los pentagramas de ossia +aparecen inmediatamente después de un salto de línea. Para ver más +información sobre @code{\RemoveAllEmptyStaves}, consulte +@ref{Ocultar pentagramas}. @lilypond[verbatim,quote,ragged-right] << \new Staff = "ossia" \with { \remove "Time_signature_engraver" \hide Clef - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) - } \relative c'' { + \magnifyStaff #2/3 + \RemoveAllEmptyStaves + } \relative { R1*3 - c4 e8 d c2 + c''4 e8 d c2 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 e4 f e2 g4 a g2 \break c4 b c2 @@ -711,13 +719,6 @@ sobre @code{\RemoveEmptyStaves}, consulte @ref{Ocultar pentagramas}. e4 d c2 } >> - -\layout { - \context { - \Staff \RemoveEmptyStaves - \override VerticalAxisGroup.remove-first = ##t - } -} @end lilypond @@ -760,10 +761,9 @@ Referencia de funcionamiento interno: @cindex vacío, pentagrama @funindex \RemoveEmptyStaves -@funindex RemoveEmptyStaves +@funindex \RemoveAllEmptyStaves @funindex Staff_symbol_engraver @funindex \stopStaff -@funindex stopStaff Se pueden ocultar las líneas del pentagrama quitando el grabador @code{Staff_symbol_engraver} del contexto de @code{Staff}. Como @@ -773,30 +773,36 @@ alternativa se puede utilizar la instrucción @code{\stopStaff}. \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c''' { a8 f e16 d c b a2 } +\relative { a''8 f e16 d c b a2 } @end lilypond -Se pueden ocultar los pentagramas que están vacíos mediante la -instrucción @code{\RemoveEmptyStaves} dentro del bloque @code{\layout} -para el contexto @code{\Staff}. En las partituras orquestales, este -estilo se conoce como @q{partitura a la francesa}. De forma -predeterminada, esta instrucción oculta y elimina todos los -pentagramas vacíos de la partitura excepto los del primer sistema. -@warning{Un pentagrama se considera vacío cuando contiene solamente -silencios, silencios multicompás, desplazamientos, silencios de -separación o una combinación de estos elementos.} +Se pueden ocultar los pentagramas vacíos (para hacer la que se +conoce como @q{partitura a la francesa}) aplicando la instrucción +@code{\RemoveEmptyStaves} sobre un contexto, lo cual se puede +hacer globalmente (dentro del bloque @code{\layout}) así como para +pautas específicas solamente (dentro de un bloque @code{\with}). +Esta instrucción elimina todas las pautas vacías de la partitura +excepto las del primer sistema. Si queremos ocultar también las +del primer sistema, usamos @code{\RemoveAllEmptyStaves}. Los +contextos que están contemplados son @code{Staff}, +@code{RhythmicStaff} y @code{VaticanaStaff}. + +@warning{Un pentagrama se considera vacío cuando contiene +solamente silencios, silencios multicompás, desplazamientos, +silencios de separación o una combinación de estos elementos.} @lilypond[verbatim,quote,ragged-right] \layout { \context { - \Staff \RemoveEmptyStaves + \Staff + \RemoveEmptyStaves } } -\relative c' << +\relative << \new Staff { - e4 f g a \break + e'4 f g a \break b1 \break a4 b c2 } @@ -811,34 +817,16 @@ separación o una combinación de estos elementos.} @cindex ossia @noindent -También se puede usar @code{\RemoveEmptyStaves} en el contexto -@code{\Staff} para crear secciones de ossia para un pentagrama. Para -ver más detalles, consulte @ref{Pentagramas de Ossia}. - -@cindex ocultar pentagramas de música antigua -@cindex ocultar pentagramas rítmicos - -@funindex \RemoveEmptyStaves -@funindex RemoveEmptyStaves - -Se puede usar la instrucción @code{\RemoveEmptyStaves} para ocultar -los pentagramas vacíos en contextos de música antigua como -@code{\VaticanaStaff}. De forma similar, se puede usar -@code{\RhythmicStaff \RemoveEmptyStaves} para ocultar los contextos -@code{RhythmicStaff} vacíos. +También se puede usar @code{\RemoveAllEmptyStaves} para crear +secciones de ossia para un pentagrama. Para ver más detalles, +consulte @ref{Pentagramas de Ossia}. @predefined -@code{\Staff \RemoveEmptyStaves}, -@code{\VaticanaStaff \RemoveEmptyStaves}, -@code{\RhythmicStaff \RemoveEmptyStaves}. +@code{\RemoveEmptyStaves}, +@code{\RemoveAllEmptyStaves}. @endpredefined - -@snippets -@lilypondfile[verbatim,quote,texidoc,doctitle] -{removing-the-first-empty-line.ly} - @seealso Glosario musical: @rglos{Frenched staff}. @@ -867,18 +855,18 @@ Referencia de funcionamiento interno: @knownissues La eliminación del grabador @code{Staff_symbol_engraver} también -oculta las barras de compás. Si se fuerza la visibilidad de la barra -de compás, pueden ocurrir errores de formato visual. En este caso, -utilice las siguientes sobreescrituras de valores en vez de quitar el -grabador: +oculta las barras de compás. Si se fuerza la visibilidad de la +barra de compás, pueden ocurrir errores de formato visual. En +este caso, utilice las siguientes sobreescrituras de valores en +vez de quitar el grabador: @example \omit StaffSymbol \override NoteHead.no-ledgers = ##t @end example -Para ver los fallos y problemas conocidos, así como las advertencias -asociadas con @code{\RemoveEmptyStaves}, consulte +Para ver los fallos y problemas conocidos, así como las +advertencias asociadas con @code{\RemoveEmptyStaves}, consulte @ref{Cambiar los valores por omisión de los contextos}. @@ -886,9 +874,9 @@ asociadas con @code{\RemoveEmptyStaves}, consulte @subsection Escritura de las particellas @translationof Writing parts -Esta sección explica cómo insertar indicaciones de tempo y nombres de -instrumento en una partitura. También se describen métodos para citar -otras voces y dar formato a las notas guía. +Esta sección explica cómo insertar indicaciones de tempo y nombres +de instrumento en una partitura. También se describen métodos +para citar otras voces y dar formato a las notas guía. @menu * Nombres de instrumentos:: @@ -905,18 +893,19 @@ otras voces y dar formato a las notas guía. @cindex instrumento, nombre abreviado Se pueden imprimir los nombres de los instrumentos en el lado -izquierdo de los pentagramas dentro de los contextos -@code{Staff}, @code{PianoStaff}, @code{StaffGroup}, @code{GrandStaff} -y @code{ChoirStaff}. El valor de @code{instrumentName} se usa para el -primer pentagrama, y el valor de @code{shortInstrumentName} se usa -para todos los pentagramas siguientes. +izquierdo de los pentagramas dentro de los contextos @code{Staff}, +@code{PianoStaff}, @code{StaffGroup}, @code{GrandStaff} y +@code{ChoirStaff}. El valor de @code{instrumentName} se usa para +el primer pentagrama, y el valor de @code{shortInstrumentName} se +usa para todos los pentagramas siguientes. -@lilypond[verbatim,quote,ragged-right,relative=1] +@lilypond[verbatim,quote,ragged-right] \new Staff \with { instrumentName = #"Violin " shortInstrumentName = #"Vln. " +} \relative { + c'4.. g'16 c4.. g'16 \break | c1 | } -{ c4.. g'16 c4.. g'16 \break | c1 } @end lilypond @cindex instrumentos, nombres complejos de @@ -924,70 +913,69 @@ para todos los pentagramas siguientes. También podemos usar @code{\markup} para construir nombres de instrumento más complicados: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { instrumentName = \markup { \column { "Clarinetti" \line { "in B" \smaller \flat } } } +} \relative { + c''4 c,16 d e f g2 } -{ c4 c,16 d e f g2 } @end lilypond @cindex instrument names, centering -Cuando se agrupan dos o más contextos de pentagrama, los nombres de -instrumento y los nombres cortos aparecen centrados de forma -predeterminada. Para centrar nombres de instrumento de varias líneas, -se debe utilizar @code{\center-column}: +Cuando se agrupan dos o más contextos de pentagrama, los nombres +de instrumento y los nombres cortos aparecen centrados de forma +predeterminada. Para centrar nombres de instrumento de varias +líneas, se debe utilizar @code{\center-column}: -@lilypond[verbatim,quote,indent=1.5\cm,relative=2] +@lilypond[verbatim,quote,indent=1.5\cm] << \new Staff \with { instrumentName = #"Flute" - } - { f2 g4 f } + } \relative { + f''2 g4 f +} \new Staff \with { instrumentName = \markup { - \center-column { "Clarinet" } - \line { "in B" \smaller \flat } + \center-column { "Clarinet" + \line { "in B" \smaller \flat } + } } - } - { c4 b c2 } + } \relative { c''4 b c2 } >> @end lilypond @funindex indent @funindex short-indent -Sin embargo, si los nombres de instrumento son más largos, éstos no se -centran para un grupo de pentagramas a no ser que se aumenten los -valores del sangrado, @code{indent}, y del sangrado corto, -@code{short-indent}. Para ver más detalles sobre estos ajustes, -consulte @ref{Variables de paper para desplazamientos y sangrados,,Variables de @code{@bs{}paper} para desplazamientos y sangrados}. +Sin embargo, si los nombres de instrumento son más largos, éstos +no se centran para un grupo de pentagramas a no ser que se +aumenten los valores del sangrado, @code{indent}, y del sangrado +corto, @code{short-indent}. Para ver más detalles sobre estos +ajustes, consulte +@ref{Variables de paper para desplazamientos y sangrados,,Variables de @code{@bs{}paper} para desplazamientos y sangrados}. @lilypond[verbatim,quote,ragged-right] -\relative c'' { - << - \new Staff \with { - instrumentName = #"Alto Flute in G" - shortInstrumentName = #"Flt." - } - { - f2 g4 f \break - g4 f g2 - } - \new Staff \with { - instrumentName = #"Clarinet" - shortInstrumentName = #"Clar." - } - { - c,4 b c2 \break - c2 b4 c - } - >> -} +<< + \new Staff \with { + instrumentName = #"Alto Flute in G" + shortInstrumentName = #"Flt." + } \relative { + f''2 g4 f \break + g4 f g2 + } + \new Staff \with { + instrumentName = #"Clarinet" + shortInstrumentName = #"Clar." + } \relative { + c''4 b c2 \break + c2 b4 c + } +>> \layout { indent = 3.0\cm @@ -998,73 +986,57 @@ consulte @ref{Variables de paper para desplazamientos y sangrados,,Variables de @cindex nombres de instrumento, añadir a otros contextos Para añadir nombres de instrumento a otros contextos (como -@code{ChordNames} o @code{FiguredBass}), debemos -añadir el grabador @code{Instrument_name_engraver} a dicho -contexto. Para ver más detalles, consulte @ref{Modificar los complementos (plug-ins) de contexto}. +@code{ChordNames} o @code{FiguredBass}), debemos añadir el +grabador @code{Instrument_name_engraver} a dicho contexto. Para +ver más detalles, consulte @ref{Modificar los complementos +(plug-ins) de contexto}. @cindex nombres de instrumento, cambiar El nombre de instrumento corto @code{shortInstrumentName} se puede -cambiar en mitad de una pieza; sin embargo, sólo el primer -@code{instrumentName} se imprime y el resto de ellos se ignoran: +cambiar en mitad de una pieza, igual que otros ajustes que pueden +ser necesarios para el instrumento nuevo; sin embargo, sólo el +primer @code{instrumentName} se imprime y el resto de ellos se +ignoran: -@lilypond[verbatim,quote,ragged-right,relative=1] -\new Staff \with { - instrumentName = #"Flute" - shortInstrumentName = #"Flt." -} -{ - c1 c c c \break - c1 c c c \break - \set Staff.instrumentName = #"Clarinet" - \set Staff.shortInstrumentName = #"Clt." - c1 c c c \break - c1 c c c \break +@lilypond[verbatim,quote,ragged-right] +prepPiccolo = <>^\markup \italic { muta in Piccolo } + +setPiccolo = { + \set Staff.instrumentName = #"Piccolo" + \set Staff.shortInstrumentName = #"Picc." + \set Staff.midiInstrument = #"piccolo" + <>^\markup \bold { Piccolo } + \transposition c'' } -@end lilypond - -@cindex instrumento, cambio de -@cindex cambio de instrumento - -@funindex \addInstrumentDefinition -@funindex addInstrumentDefinition -@funindex \instrumentSwitch -@funindex instrumentSwitch -Si se necesita un @emph{cambio} de instrumento, se debe usar -@code{\addInstrumentDefinition} en combinación con -@code{\instrumentSwitch} para crear una lista detallada de los cambios -necesarios para el intercambio. La instrucción -@code{\addInstrumentDefinition} tiene dos argumentos: una cadena -identificativa, y una lista asociativa de propiedades de contexto y -los valores que el instrumento va a usar. Se debe situar en el ámbito -del nivel más alto. @code{\instrumentSwitch} se usa en la expresión -musical para declarar el cambio de instrumento: +prepFlute = <>^\markup \italic { muta in Flauto } -@lilypond[verbatim,quote,ragged-right] -\addInstrumentDefinition #"contrabassoon" - #`((instrumentTransposition . ,(ly:make-pitch -1 0 0)) - (shortInstrumentName . "Cbsn.") - (clefGlyph . "clefs.F") - (middleCPosition . 6) - (clefPosition . 2) - (instrumentCueName . ,(make-bold-markup "cbsn.")) - (midiInstrument . "bassoon")) +setFlute = { + \set Staff.instrumentName = #"Flute" + \set Staff.shortInstrumentName = #"Flt." + \set Staff.midiInstrument = #"flute" + <>^\markup \bold { Flute } + \transposition c' +} \new Staff \with { - instrumentName = #"Bassoon" + instrumentName = #"Flute" + shortInstrumentName = #"Flt." + midiInstrument = #"flute" } -\relative c' { - \clef tenor - \compressFullBarRests - c2 g' - R1*16 - \instrumentSwitch "contrabassoon" - c,,2 g \break - c,1 ~ | c1 +\relative { + g'1 g g g \break + g1 g \prepPiccolo R R \break + \setPiccolo + g1 g g g \break + g1 g \prepFlute R R \break + \setFlute + g1 g g g } @end lilypond + @seealso Referencia de la notación: @ref{Variables de paper para desplazamientos y sangrados,,Variables de @code{@bs{}paper} para desplazamientos y sangrados}, @@ -1089,34 +1061,31 @@ Referencia de funcionamiento interno: @cindex notas guía @funindex \addQuote -@funindex addQuote @funindex \quoteDuring -@funindex quoteDuring @funindex \transposition -@funindex transposition -Es muy frecuente que una voz use las mismas notas que otra voz. Por -ejemplo, los violines primero y segundo tocando la misma frase durante -un determinado pasaje musical. Esto se hace dejando que una voz -@emph{cite} a la otra, sin tener que volver a introducir la música -para la segunda voz. +Es muy frecuente que una voz use las mismas notas que otra voz. +Por ejemplo, los violines primero y segundo tocando la misma frase +durante un determinado pasaje musical. Esto se hace dejando que +una voz @emph{cite} a la otra, sin tener que volver a introducir +la música para la segunda voz. La instrucción @code{\addQuote}, utilizada en el ámbito del nivel -sintáctico superior, define un flujo de música desde el que es posible -citar fragmentos. +sintáctico superior, define un flujo de música desde el que es +posible citar fragmentos. -La instrucción @code{\quoteDuring} se usa para indicar el punto en que -comienza la cita. Va seguida por dos argumentos: el nombre de la voz -citada, tal y como se definió con @code{\addQuote}, y una expresión -musical que indica la duración de la cita. +La instrucción @code{\quoteDuring} se usa para indicar el punto en +que comienza la cita. Va seguida por dos argumentos: el nombre de +la voz citada, tal y como se definió con @code{\addQuote}, y una +expresión musical que indica la duración de la cita. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { s1 } } \addQuote "flute" { \fluteNotes } @@ -1129,18 +1098,18 @@ oboeNotes = \relative c'' { } @end lilypond -Si la expresión musical que se usa para @code{\quoteDuring} contiene -cualquier cosa que no sea un silencio de separación o un silencio -multicompás, se produce una situación de polifonía, lo que no suele -ser deseable: +Si la expresión musical que se usa para @code{\quoteDuring} +contiene cualquier cosa que no sea un silencio de separación o un +silencio multicompás, se produce una situación de polifonía, lo +que no suele ser deseable: @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } } \addQuote "flute" { \fluteNotes } @@ -1153,10 +1122,45 @@ oboeNotes = \relative c'' { } @end lilypond +Si una instrucción @code{\unfoldRepeat} dentro de una expresión +musical se necesita imprimir al usar @code{\quoteDuring}, entonces +debe contener también su propia instrucción @code{\unfoldRepeat}; + +@lilypond[verbatim,quote] +fluteNotes = \relative { + \repeat volta 2 { a'4 gis g gis } +} + +oboeNotesDW = \relative { + \repeat volta 2 \quoteDuring #"incorrect" { s1 } +} + +oboeNotesW = \relative { + \repeat volta 2 \quoteDuring #"correct" { s1 } +} + + +\addQuote "incorrect" { \fluteNotes } + +\addQuote "correct" { \unfoldRepeats \fluteNotes } + +\score { + \unfoldRepeats + << + \new Staff \with { instrumentName = "Flute" } + \fluteNotes + \new Staff \with { instrumentName = "Oboe (incorrect)" } + \oboeNotesDW + \new Staff \with { instrumentName = "Oboe (correct)" } + \oboeNotesW + >> +} +@end lilypond + La instrucción @code{\quoteDuring} usa los ajustes de -@code{\transposition} tanto de la parte citada como de la que cita, -para producir notas que tienen la misma altura de sonido en la parte -que cita y en las de la parte citada. +@code{\transposition} tanto de la parte citada como de la que +cita, para producir notas que tienen la misma altura de sonido en +la parte que cita y en las de la parte citada. @lilypond[verbatim,quote] clarinetNotes = \relative c'' { @@ -1165,8 +1169,8 @@ clarinetNotes = \relative c'' { b4 ais a ais | cis4^"quoted" r8 bis\p b4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"clarinet" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"clarinet" { s1 } } \addQuote "clarinet" { \clarinetNotes } @@ -1191,19 +1195,19 @@ oboeNotes = \relative c'' { @funindex quotedCueEventTypes De forma predeterminada, la música citada incluye todas las -articulaciones, matices dinámicos, elementos de marcado, etc. de la -expresión citada. Es posible elegir cuáles de estos objetos de la -música que se cita se imprimen, mediante la propiedad de contexto -@code{quotedEventTypes}. +articulaciones, matices dinámicos, elementos de marcado, etc. de +la expresión citada. Es posible elegir cuáles de estos objetos de +la música que se cita se imprimen, mediante la propiedad de +contexto @code{quotedEventTypes}. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a2 g2 | +fluteNotes = \relative { + a'2 g2 | b4\<^"quoted" r8 ais a4\f( c->) } -oboeNotes = \relative c'' { - c2. b4 | +oboeNotes = \relative { + c''2. b4 | \quoteDuring #"flute" { s1 } } @@ -1240,13 +1244,12 @@ Referencia de funcionamiento interno: @knownissues Sólo el contenido de la primera voz de una instrucción -@code{\addQuote} se tiene en cuenta para la cita, de manera que -si la expresión musical contiene enunciados @code{\new} -o @code{\context Voice}, sus contenidos no serían citados. -La cita de notas de adorno no está contemplada y puede hacer que -LilyPond termine de forma abrupta; la cita de unos tresillos -dentro de otros puede dar como resultado una -notación de pobre calidad. +@code{\addQuote} se tiene en cuenta para la cita, de manera que si +la expresión musical contiene enunciados @code{\new} o +@code{\context Voice}, sus contenidos no serían citados. La cita +de notas de adorno no está contemplada y puede hacer que LilyPond +termine de forma abrupta; la cita de unos tresillos dentro de +otros puede dar como resultado una notación de pobre calidad. @node Formateo de las notas guía @@ -1263,13 +1266,9 @@ notación de pobre calidad. @funindex \cueDuring -@funindex cueDuring @funindex \cueClef -@funindex cueClef @funindex \cueDuringWithClef -@funindex cueDuringWithClef @funindex \quoteDuring -@funindex quoteDuring @cindex notas pequeñas @cindex pequeñas, notas @@ -1278,45 +1277,52 @@ notación de pobre calidad. La manera más sencilla de dar formato a las notas guía es crear explícitamente un contexto @code{CueVoice} dentro de la parte. -@lilypond[verbatim,relative=1] -R1 -<< - { e2\rest r4. e8 } - \new CueVoice { - \stemUp d'8^"flute" c d e fis2 - } ->> -d,4 r a r +@lilypond[verbatim] +\relative { + R1 + << + { e'2\rest r4. e8 } + \new CueVoice { + \stemUp d'8^"flute" c d e fis2 + } + >> + d,4 r a r +} @end lilypond -La instrucción @code{\cueClef} puede usarse también con un contexto -@code{CueVoice} explícito si se requiere un cambio de clave, e imprime -una clave del tamaño adecuado para las notas guía. Después puede -utilizarse la instrucción @code{\cueClefUnset} para volver a la clave -original, de nuevo con un signo de clave del tamaño adecuado. +La instrucción @code{\cueClef} puede usarse también con un +contexto @code{CueVoice} explícito si se requiere un cambio de +clave, e imprime una clave del tamaño adecuado para las notas +guía. Después puede utilizarse la instrucción +@code{\cueClefUnset} para volver a la clave original, de nuevo con +un signo de clave del tamaño adecuado. -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -<< - { e2\rest r4. \cueClefUnset e,8 } - \new CueVoice { - \cueClef "treble" \stemUp d''8^"flute" c d e fis2 - } ->> -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + << + { e'2\rest r4. \cueClefUnset e,8 } + \new CueVoice { + \cueClef "treble" \stemUp d''8^"flute" c d e fis2 + } + >> + d,,4 r a r +} @end lilypond Las instrucciones @code{\cueClef} y @code{\cueClefUnset} se pueden usar también sin un @code{CueVoice} si es necesario. -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -\cueClef "treble" -d'8^"flute" c d e fis2 -\cueClefUnset -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + \cueClef "treble" + d''8^"flute" c d e fis2 + \cueClefUnset + d,,4 r a r +} @end lilypond En casos de colocación más compleja de notas guía, por ejemplo con @@ -1340,21 +1346,21 @@ y La música procedente de los compases correspondientes del elemento @code{@var{nombre_de_la_cita}} se añade como un contexto -@code{CueVoice} y ocurre simultáneamente con la @code{@var{música}}, -lo que produce una situación polifónica. La @code{@var{dirección}} -toma un argumento @code{UP} (arriba) o @code{DOWN} (abajo), y -corresponde a las voces primera y segunda, respectivamente, -determinando cómo se imprimen las notas guía en relación a la otra -voz. +@code{CueVoice} y ocurre simultáneamente con la +@code{@var{música}}, lo que produce una situación polifónica. La +@code{@var{dirección}} toma un argumento @code{UP} (arriba) o +@code{DOWN} (abajo), y corresponde a las voces primera y segunda, +respectivamente, determinando cómo se imprimen las notas guía en +relación a la otra voz. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 | d8 c d e fis2 | g2 d | +fluteNotes = \relative { + r2. c''4 | d8 c d e fis2 | g2 d | } oboeNotes = \relative c'' { R1 - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } \cueDuring #"flute" #UP { R1 } g2 c, } @@ -1374,18 +1380,19 @@ Es posible ajustar qué aspectos de la música se citan con @code{quotedCueEventTypes}. Su valor por omisión es @code{'(note-event rest-event tie-event beam-event tuplet-span-event)}, lo que significa que solamente las notas, -silencios, ligaduras de unión, barras y grupos especiales se citan, -pero no las articulaciones, marcas dinámicas, elementos de marcado, -etc. +silencios, ligaduras de unión, barras y grupos especiales se +citan, pero no las articulaciones, marcas dinámicas, elementos de +marcado, etc. -@warning{Cuando un contexto @code{Voice} da comienzo con @code{\cueDuring}, -como en el ejemplo siguiente, el contexto @code{Voice} se debe -declarar explícitamente, pues en caso contrario toda la expresión musical -pertenecería al contexto @code{CueVoice}.} +@warning{Cuando un contexto @code{Voice} da comienzo con +@code{\cueDuring}, como en el ejemplo siguiente, el contexto +@code{Voice} se debe declarar explícitamente, pues en caso +contrario toda la expresión musical pertenecería al contexto +@code{CueVoice}.} @lilypond[verbatim,quote] -oboeNotes = \relative c'' { - r2 r8 d16(\f f e g f a) +oboeNotes = \relative { + r2 r8 d''16(\f f e g f a) g8 g16 g g2. } \addQuote "oboe" { \oboeNotes } @@ -1399,24 +1406,21 @@ oboeNotes = \relative c'' { } @end lilypond -El nombre del instrumento que está tocando se puede imprimir si se -ajusta la propiedad @code{instrumentCueName} dentro de un contexto -@code{CueVoice} provisional. La colocación y estilo del -@code{instrumentCueName} viene controlado a través del objeto -@code{InstrumentSwitch}, véase @ref{Nombres de instrumentos}. Si las -notas guía requieren un cambio de clave, puede hacerse manualmente -pero la clave original se debe restaurar al final de las notas guía. +Se pueden usar elementos de marcado para mostrar el nombre del +instrumento citado. Si las notas guía requieren un cambio de +clave, puede hacerse manualmente pero la clave original se debe +restaurar al final de las notas guía. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { \clef bass R1 \clef treble - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } \cueDuring #"flute" #UP { R1 } \clef bass g4. b8 d2 @@ -1433,18 +1437,18 @@ De forma alternativa, puede usarse la función @code{\cueDuringWithClef} en su lugar. Esta instrucción admite un argumento adicional para especificar el cambio de clabe que se necesita imprimir para las notas guía, pero después imprime -automáticamente la clave original una vez que ha finalizado la serie -de notas guía. +automáticamente la clave original una vez que ha finalizado la +serie de notas guía. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { \clef bass R1 - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup { \tiny "flute" } \cueDuringWithClef #"flute" #UP #"treble" { R1 } g4. b8 d2 } @@ -1457,25 +1461,25 @@ bassoonNotes = \relative c { @end lilypond @funindex \transposedCueDuring -@funindex transposedCueDuring Como @code{\quoteDuring}, @code{\cueDuring} tiene en cuenta las transposiciones instrumentales. Las notas guía se producen en las -alturas en que se escribirían para el instrumento que recibe la cita, -para así producir las alturas de sonido del instrumento original. +alturas en que se escribirían para el instrumento que recibe la +cita, para así producir las alturas de sonido del instrumento +original. Para transportar las notas guía de forma diferente, use @code{\transposedCueDuring}. Esta instrucción acepta un argumento -adicional para especificar (en modo absoluto) la altura impresa con -que queremos representar el sonido de un Do central de concierto. -Esto es útil para toma citas de un instrumento que está en un registro -completamente diferente. +adicional para especificar (en modo absoluto) la altura impresa +con que queremos representar el sonido de un Do central de +concierto. Esto es útil para toma citas de un instrumento que +está en un registro completamente diferente. @lilypond[verbatim,quote] -piccoloNotes = \relative c''' { +piccoloNotes = \relative { \clef "treble^8" R1 - c8 c c e g2 + c'''8 c c e g2 c4 g g2 } @@ -1499,23 +1503,20 @@ bassClarinetNotes = \relative c' { @cindex cue notes, removing @funindex \killCues -@funindex killCues -@funindex \addInstrumentDefinition -@funindex addInstrumentDefinition La instrucción @code{\killCues} elimina las notas guía de una expresión musical, de forma que la misma expresión musical pueda -utilizarse para producir la particella instrumental (con notas guía) y -la partitura de conjunto. La instrucción @code{\killCues} elimina -solamente las notas y eventos que se han citado mediante +utilizarse para producir la particella instrumental (con notas +guía) y la partitura de conjunto. La instrucción @code{\killCues} +elimina solamente las notas y eventos que se han citado mediante @code{\cueDuring}. Otros elementos de marcado asociados con las guías, como los cambios de clave o una etiqueta identificativa del -instrumento fuente, pueden marcarse para su inclusión selectiva dentro -de la partitura; véase @ref{Uso de etiquetas}. +instrumento fuente, pueden marcarse para su inclusión selectiva +dentro de la partitura; véase @ref{Uso de etiquetas}. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { @@ -1523,7 +1524,7 @@ bassoonNotes = \relative c { R1 \tag #'part { \clef treble - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } } \cueDuring #"flute" #UP { R1 } \tag #'part \clef bass @@ -1546,10 +1547,11 @@ bassoonNotes = \relative c { >> @end lilypond -Como alternativa, los cambios de clave y los letreros de instrumento -se pueden recolectar dentro de una definición de instrumento para su -uso repetido, utilizando @code{\addInstrumentDefinition} que se -descibe en @ref{Nombres de instrumentos}. +Como alternativa, los cambios de clave y los letreros de +instrumento se pueden recolectar dentro de una definición de +instrumento para su uso repetido, utilizando +@code{\addInstrumentDefinition} que se descibe en @ref{Nombres de +instrumentos}. @seealso Referencia de la notación: @@ -1571,5 +1573,5 @@ Referencia de funcionamiento interno: Pueden ocurrir colisiones con los silencios si se usa @code{\cueDuring}, entre los contextos de @code{Voice} y de @code{CueVoice}. Al usar @code{\cueDuringWithClef} o -@code{\transposedCueDuring} el argumento adicional requerido para cada -caso debe ir después de la cita y de la dirección. +@code{\transposedCueDuring} el argumento adicional requerido para +cada caso debe ir después de la cita y de la dirección. diff --git a/Documentation/es/notation/text.itely b/Documentation/es/notation/text.itely index 8f970d3fdd..20b95b4cb0 100644 --- a/Documentation/es/notation/text.itely +++ b/Documentation/es/notation/text.itely @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 354e5ce3edd1dba03b4ecb68fc766bb46235f5d2 + Translation of GIT committish: bfc3420ada8810d57156e9fc871560188f044a64 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.21" @node Texto @section Texto @@ -19,8 +19,8 @@ Esta sección explica cómo incluir texto (con diversos estilos de formateo) en las partituras. @noindent -Ciertos elementos de texto de los que no nos ocupamos aquí se tratan -en otras secciones específicas: @ref{Música vocal}, +Ciertos elementos de texto de los que no nos ocupamos aquí se +tratan en otras secciones específicas: @ref{Música vocal}, @ref{Títulos y encabezamientos}. @menu @@ -37,11 +37,11 @@ Esta sección presenta las distintas formas de añadir texto a una partitura. @cindex texto, en otros idiomas -@warning{Para escribir texto con caracteres acentuados y especiales -(como los de idiomas distintos del inglés), sencillamente inserte los -caracteres directamente en el archivo de LilyPond. El archivo se debe -guardar como UTF-8. Para ver más información, consulte -@ref{Codificación del texto}.} +@warning{Para escribir texto con caracteres acentuados y +especiales (como los de idiomas distintos del inglés), +sencillamente inserte los caracteres directamente en el archivo de +LilyPond. El archivo se debe guardar como UTF-8. Para ver más +información, consulte @ref{Codificación del texto}.} @menu @@ -67,8 +67,8 @@ indicaciones se pueden colocar manualmente por encima o por debajo del pentagrama, utilizando la sintaxis que se describe en @ref{Dirección y posición}. -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e a4-"scherz." f +@lilypond[quote,verbatim] +\relative { a'8^"pizz." g f e a4-"scherz." f } @end lilypond Esta sintaxis es en realidad una abreviatura; se puede añadir @@ -76,34 +76,35 @@ explícitamente a una nota un formateado de texto más complejo utilizando un bloque @code{\markup}, como se describe bajo @ref{Formatear el texto}. -@lilypond[quote,verbatim,relative=2] -a8^\markup { \italic pizz. } g f e -a4_\markup { \tiny scherz. \bold molto } f +@lilypond[quote,verbatim] +\relative { + a'8^\markup { \italic pizz. } g f e + a4_\markup { \tiny scherz. \bold molto } f } @end lilypond De forma predeterminada, las indicaciones de texto no afectan al -espaciado de las notas. Sin embargo, su anchura sí podría tenerse en -cuenta: en el siguiente ejemplo, la primera cadena de texto no afecta -al espaciado, pero la segunda sí afecta. - -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e -\textLengthOn -a4_"scherzando" f +espaciado de las notas. Sin embargo, su anchura sí podría tenerse +en cuenta: en el siguiente ejemplo, la primera cadena de texto no +afecta al espaciado, pero la segunda sí afecta. + +@lilypond[quote,verbatim] +\relative { + a'8^"pizz." g f e + \textLengthOn + a4_"scherzando" f +} @end lilypond -Se pueden adjuntar articulaciones a las notas, además de inscripciones -de texto. Para ver más información, consulte @ref{Articulaciones y -ornamentos}. +Se pueden adjuntar articulaciones a las notas, además de +inscripciones de texto. Para ver más información, consulte +@ref{Articulaciones y ornamentos}. -Para ver más información sobre el orden relativo de las inscripciones -de texto y las articulaciones, consulte @rlearning{Colocación de los -objetos}. +Para ver más información sobre el orden relativo de las +inscripciones de texto y las articulaciones, consulte +@rlearning{Colocación de los objetos}. @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff @predefined @code{\textLengthOn}, @@ -132,10 +133,10 @@ Referencia de funcionamiento interno: @cindex letra, mantener dentro del margen @knownissues -La comprobación necesaria para asegurar que las inscripciones de texto -y la letra de las canciones se mantienen dentro de los márgenes, -requiere cálculos adicionales. En caso de que desee un proceso -ligeramente más rápido, puede utilizar +La comprobación necesaria para asegurar que las inscripciones de +texto y la letra de las canciones se mantienen dentro de los +márgenes, requiere cálculos adicionales. En caso de que desee un +proceso ligeramente más rápido, puede utilizar @example \override Score.PaperColumn.keep-inside-line = ##f @@ -149,43 +150,46 @@ ligeramente más rápido, puede utilizar @cindex texto, elementos de extensión Ciertas indicaciones de ejecución, p.ej., @i{rallentando} o -@i{accelerando}, se escriben como texto y se extienden sobre muchos -compases mediante líneas de puntos. Estos objetos, que reciben el -nombre de @q{spanners} u objetos de extensión, se pueden crear desde -una nota hasta otra usando la siguiente sintaxis: - -@lilypond[verbatim,quote,relative=2] -\override TextSpanner.bound-details.left.text = "rit." -b1\startTextSpan -e,\stopTextSpan +@i{accelerando}, se escriben como texto y se extienden sobre +muchos compases mediante líneas de puntos. Estos objetos, que +reciben el nombre de @q{spanners} u objetos de extensión, se +pueden crear desde una nota hasta otra usando la siguiente +sintaxis: + +@lilypond[verbatim,quote] +\relative { + \override TextSpanner.bound-details.left.text = "rit." + b'1\startTextSpan + e,\stopTextSpan +} @end lilypond @cindex texto, formateado de los elementos de extensión @cindex formato de los elementos de extensión de texto @noindent -La cadena de texto que imprimir se establece a través de propiedades -de objeto. De forma predeterminada se imprime en estilo cursiva, pero -se pueden conseguir distintos efectos de formato utilizando bloques -@code{\markup}, como se describe en @ref{Formatear el texto}. - -@lilypond[quote,relative=2,verbatim] -\override TextSpanner.bound-details.left.text = - \markup { \upright "rit." } -b1\startTextSpan c -e,\stopTextSpan +La cadena de texto que imprimir se establece a través de +propiedades de objeto. De forma predeterminada se imprime en +estilo cursiva, pero se pueden conseguir distintos efectos de +formato utilizando bloques @code{\markup}, como se describe en +@ref{Formatear el texto}. + +@lilypond[quote,verbatim] +\relative { + \override TextSpanner.bound-details.left.text = + \markup { \upright "rit." } + b'1\startTextSpan c + e,\stopTextSpan +} @end lilypond -El estilo de la línea, así como la cadena de texto, se pueden definir -como una propiedad de objeto. Esta sintaxis se describe en -@ref{Estilos de línea}. +El estilo de la línea, así como la cadena de texto, se pueden +definir como una propiedad de objeto. Esta sintaxis se describe +en @ref{Estilos de línea}. @funindex \textSpannerUp -@funindex textSpannerUp @funindex \textSpannerDown -@funindex textSpannerDown @funindex \textSpannerNeutral -@funindex textSpannerNeutral @predefined @@ -195,8 +199,8 @@ como una propiedad de objeto. Esta sintaxis se describe en @endpredefined @knownissues -LilyPond sólo puede manejar un objeto de extensión de texto por cada -voz. +LilyPond sólo puede manejar un objeto de extensión de texto por +cada voz. @snippets @lilypondfile[verbatim,quote,texidoc,doctitle] @@ -232,9 +236,7 @@ Referencia de funcionamiento interno: @cindex líneas divisorias, símbolos sobre las @funindex \mark -@funindex mark @funindex \markup -@funindex markup Se pueden añadir a la partitura varios elementos de texto con la sintaxis que se describe en @ref{Llamadas de ensayo}: @@ -242,22 +244,29 @@ sintaxis que se describe en @ref{Llamadas de ensayo}: @c \mark needs to be placed on a separate line (it's not @c attached to an object like \markup is). -vv -@lilypond[verbatim,quote,relative=2] -c4 -\mark "Allegro" -c c c +@lilypond[verbatim,quote] +\relative { + \mark "Verse" + c'2 g' + \bar "||" + \mark "Chorus" + g2 c, + \bar "|." +} @end lilypond Esta sintaxis posibilita colocar cualquier texto sobre la línea -divisoria; se pueden incorporar formatos más complejos para el texto -usando un bloque @code{\markup}, como está explicado en +divisoria; se pueden incorporar formatos más complejos para el +texto usando un bloque @code{\markup}, como está explicado en @ref{Formatear el texto}: -@lilypond[quote,verbatim,relative=1] -1 -\mark \markup { \italic { colla parte } } -2 -1 +@lilypond[quote,verbatim] +\relative { + 1 + \mark \markup { \italic { colla parte } } + 2 + 1 +} @end lilypond @noindent @@ -266,30 +275,33 @@ llamadas, segno o calderones, especificando el nombre del símbolo correspondiente como se explica en @ref{Notación musical dentro de elementos de marcado}: -@lilypond[quote,verbatim,relative=2] -2 -\mark \markup { \musicglyph #"scripts.ufermata" } -1 +@lilypond[quote,verbatim] +\relative { + 2 + \mark \markup { \musicglyph #"scripts.ufermata" } + 1 +} @end lilypond @noindent -Estos objetos se tipografían solamente sobre el pentagrama superior de -la partitura; dependiendo de si están especificados al final o en -medio de un compás, se colocarán sobre la línea divisoria o entre las -notas. Si se especifican en un salto de línea, las llamadas se -imprimen al principio de la línea siguiente. - -@lilypond[quote,verbatim,relative=2,ragged-right] -\mark "Allegro" -c1 c -\mark "assai" \break -c c +Estos objetos se tipografían solamente sobre el pentagrama +superior de la partitura; dependiendo de si están especificados al +final o en medio de un compás, se colocarán sobre la línea +divisoria o entre las notas. Si se especifican en un salto de +línea, las llamadas se imprimen al principio de la línea +siguiente. + +@lilypond[quote,verbatim,ragged-right] +\relative c'' { + \mark "Allegro" + c1 c + \mark "assai" \break + c c +} @end lilypond @funindex \markLengthOn -@funindex markLengthOn @funindex \markLengthOff -@funindex markLengthOff @predefined @code{\markLengthOn}, @@ -332,11 +344,11 @@ Referencia de funcionamiento interno: @cindex texto independiente @funindex \markup -@funindex markup -Un bloque @code{\markup} puede existir de forma independiente, fuera -de cualquier bloque @code{\score}, como una @qq{expresión de nivel -superior}. Esta sintaxis se describe en @ref{Estructura del archivo}. +Un bloque @code{\markup} puede existir de forma independiente, +fuera de cualquier bloque @code{\score}, como una @qq{expresión de +nivel superior}. Esta sintaxis se describe en +@ref{Estructura del archivo}. @lilypond[verbatim,quote] \markup { @@ -347,7 +359,8 @@ superior}. Esta sintaxis se describe en @ref{Estructura del archivo}. @noindent Esto hace posible imprimir texto separado de la música, lo que es especialmente útil cuando el archivo de entrada contiene varias -piezas, tal y como se describe en @ref{Varias partituras en un libro}. +piezas, tal y como se describe en +@ref{Varias partituras en un libro}. @lilypond[quote,verbatim] \score { @@ -364,13 +377,12 @@ piezas, tal y como se describe en @ref{Varias partituras en un libro}. Los bloques de texto independientes pueden abarcar varias páginas, posibilitando la impresión de documentos de texto o libros íntegramente desde LilyPond. Esta funcionalidad y la sintaxis que -requiere se describen en @ref{Elementos de marcado de varias páginas}. +requiere se describen en +@ref{Elementos de marcado de varias páginas}. @funindex \markup -@funindex markup @funindex \markuplist -@funindex markuplist @predefined @code{\markup}, @@ -422,7 +434,6 @@ usando la sintaxis específica del modo de @code{\markup}. @cindex tipografiar texto @funindex \markup -@funindex markup Se usa un bloque @code{\markup} para tipografiar texto con una sintaxis ampliable que se denomina @qq{modo de marcado}. @@ -432,26 +443,28 @@ sintaxis ampliable que se denomina @qq{modo de marcado}. @cindex marcado, sintaxis @cindex sintaxis del marcado -La sintaxis del marcado es similar a la sintaxis usual de LilyPond: -una expresión @code{\markup} se encierra entre llaves +La sintaxis del marcado es similar a la sintaxis usual de +LilyPond: una expresión @code{\markup} se encierra entre llaves @code{@{ @dots{} @}}. Una sola palabra se considera como una expresión mínima, y por tanto no necesita estar encerrada entre llaves. -A diferencia de las indicaciones de @qq{texto entrecomillado} simples, -los bloques @code{\markup} pueden contener expresiones anidadas o -instrucciones de marcado, que se introducen utilizando el carácter de -barra invertida @code{\} . Estas instrucciones sólo afectan a la -expresión que sigue inmediatamente. - -@lilypond[quote,verbatim,relative=2] -a1-\markup intenso -a2^\markup { poco \italic più forte } -c e1 -d2_\markup { \italic "string. assai" } -e -b1^\markup { \bold { molto \italic agitato } } -c +A diferencia de las indicaciones de @qq{texto entrecomillado} +simples, los bloques @code{\markup} pueden contener expresiones +anidadas o instrucciones de marcado, que se introducen utilizando +el carácter de barra invertida @code{\} . Estas instrucciones sólo +afectan a la expresión que sigue inmediatamente. + +@lilypond[quote,verbatim] +\relative { + a'1-\markup intenso + a2^\markup { poco \italic più forte } + c e1 + d2_\markup { \italic "string. assai" } + e + b1^\markup { \bold { molto \italic agitato } } + c +} @end lilypond @cindex caracteres especiales en modo de marcado @@ -460,35 +473,40 @@ c @cindex impresión de caracteres especiales @cindex texto entrecomillado en modo de marcado -Un bloque @code{\markup} puede contener también cadenas de texto entre -comillas. Dichas cadenas se tratan como expresiones de texto mínimas, -y por tanto cualquier instrucción de marcado o carácter especial (como -@code{\} y@tie{}@code{#}) se imprimen literalmente sin afectar al formateo -del texto. Se puede hacer que se impriman las propias comillas si se -les antepone una barra invertida. - -@lilypond[quote,verbatim,relative=2] -a1^"\italic markup..." -a_\markup { \italic "... prints \"italic\" letters!" } -a a +Un bloque @code{\markup} puede contener también cadenas de texto +entre comillas. Dichas cadenas se tratan como expresiones de +texto mínimas, y por tanto cualquier instrucción de marcado o +carácter especial (como @code{\} y@tie{}@code{#}) se imprimen +literalmente sin afectar al formateo del texto. Se puede hacer +que se impriman las propias comillas si se les antepone una barra +invertida. + +@lilypond[quote,verbatim] +\relative { + a'1^"\italic markup..." + a_\markup { \italic "... prints \"italic\" letters!" } + a a +} @end lilypond -Para que se traten como una expresión distinta, es necesario que las -listas de palabras estén encerradas entre comillas o precedidas de una -instrucción. La forma en que están definidas las expresiones de -marcado afecta a cómo se apilan, se centran y se alinean estas -expresiones; en el ejemplo siguiente, la segunda expresión -@code{\markup} se trata igual que la primera: - -@lilypond[quote,verbatim,relative=2] -c1^\markup { \center-column { a bbb c } } -c1^\markup { \center-column { a { bbb c } } } -c1^\markup { \center-column { a \line { bbb c } } } -c1^\markup { \center-column { a "bbb c" } } +Para que se traten como una expresión distinta, es necesario que +las listas de palabras estén encerradas entre comillas o +precedidas de una instrucción. La forma en que están definidas +las expresiones de marcado afecta a cómo se apilan, se centran y +se alinean estas expresiones; en el ejemplo siguiente, la segunda +expresión @code{\markup} se trata igual que la primera: + +@lilypond[quote,verbatim] +\relative c'' { + c1^\markup { \center-column { a bbb c } } + c1^\markup { \center-column { a { bbb c } } } + c1^\markup { \center-column { a \line { bbb c } } } + c1^\markup { \center-column { a "bbb c" } } +} @end lilypond -Los marcados se pueden almacenar dentro de variables. Estas variables -se pueden adjuntar directamente a las notas: +Los marcados se pueden almacenar dentro de variables. Estas +variables se pueden adjuntar directamente a las notas: @lilypond[quote,verbatim] allegro = \markup { \bold \large Allegro } @@ -527,23 +545,22 @@ confusión. @cindex cambio de la fuente tipográfica @funindex \italic -@funindex italic @funindex \bold -@funindex bold @funindex \underline -@funindex underline -Está contemplado de forma básica el cambio de la fuente tipográfica en -el modo de marcado: +Está contemplado de forma básica el cambio de la fuente +tipográfica en el modo de marcado: -@lilypond[quote,verbatim,relative=2] -d1^\markup { - \bold { Più mosso } - \italic { non troppo \underline Vivo } +@lilypond[quote,verbatim] +\relative { + d''1^\markup { + \bold { Più mosso } + \italic { non troppo \underline Vivo } + } + r2 r4 r8 + d,_\markup { \italic quasi \smallCaps Tromba } + f1 d2 r } -r2 r4 r8 -d,_\markup { \italic quasi \smallCaps Tromba } -f1 d2 r @end lilypond @cindex fuente tipográfica, tamaño de @@ -551,13 +568,9 @@ f1 d2 r @funindex \abs-fontsize @funindex \fontsize -@funindex fontsize @funindex \smaller -@funindex smaller @funindex \larger -@funindex larger @funindex \magnify -@funindex magnify El tamaño de la fuente tipográfica se puede alterar en relación al tamaño global del pentagrama, de una serie de formas como se ve a @@ -565,51 +578,65 @@ continuación. Se puede fijar a un tamaño predefinido, -@lilypond[quote,verbatim,relative=2] -b1_\markup { \huge Sinfonia } -b1^\markup { \teeny da } -b1-\markup { \normalsize camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \huge Sinfonia } + b1^\markup { \teeny da } + b1-\markup { \normalsize camera } +} @end lilypond Se puede establecer a un tamaño relativo al valor anterior, -@lilypond[quote,verbatim,relative=2] -b1_\markup { \larger Sinfonia } -b1^\markup { \smaller da } -b1-\markup { \magnify #0.6 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \larger Sinfonia } + b1^\markup { \smaller da } + b1-\markup { \magnify #0.6 camera } +} @end lilypond -Se puede aumentar o disminuir de forma relativa al valor fijado por el -tamaño global del pentagrama, +Se puede aumentar o disminuir de forma relativa al valor fijado +por el tamaño global del pentagrama, -@lilypond[quote,verbatim,relative=2] -b1_\markup { \fontsize #-2 Sinfonia } -b1^\markup { \fontsize #1 da } -b1-\markup { \fontsize #3 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \fontsize #-2 Sinfonia } + b1^\markup { \fontsize #1 da } + b1-\markup { \fontsize #3 camera } +} @end lilypond También se puede establecer a un tamaño de puntos fijo, independientemente del tamaño global del pentagrama, -@lilypond[quote,verbatim,relative=2] -b1_\markup { \abs-fontsize #20 Sinfonia } -b1^\markup { \abs-fontsize #8 da } -b1-\markup { \abs-fontsize #14 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \abs-fontsize #20 Sinfonia } + b1^\markup { \abs-fontsize #8 da } + b1-\markup { \abs-fontsize #14 camera } +} +@end lilypond + +Si el texto incluye espacios, es mejor escribir todo entre +comillas, de forma que el tamaño de cada espacio sea correcto para +el tamaño de los otros caracteres. + +@lilypond[quote,verbatim] +\markup \fontsize #6 \bold { Sinfonia da camera } +\markup \fontsize #6 \bold { "Sinfonia da camera" } @end lilypond @cindex subíndice @cindex superíndice @funindex \super -@funindex super @funindex \sub -@funindex sub @funindex \normal-size-super -@funindex normal-size-super El texto se puede imprimir como subíndice o como superíndice. De -forma predeterminada se imprimen en un tamaño menor, pero también se -puede usar un tamaño normal: +forma predeterminada se imprimen en un tamaño menor, pero también +se puede usar un tamaño normal: @lilypond[quote,verbatim] \markup { @@ -624,10 +651,10 @@ puede usar un tamaño normal: @cindex fuente tipográfica, familias de El modo de marcado ofrece una manera fácil de elegir familias de -tipografía alternativas. A no ser que se especifique de otro modo, se -selecciona automáticamente la fuente predeterminada con serifa, de -tipo romano: en la última línea del ejemplo siguiente, no hay -diferencia entre la primera y la segunda palabra. +tipografía alternativas. A no ser que se especifique de otro +modo, se selecciona automáticamente la fuente predeterminada con +serifa, de tipo romano: en la última línea del ejemplo siguiente, +no hay diferencia entre la primera y la segunda palabra. @lilypond[quote,verbatim] \markup { @@ -649,10 +676,10 @@ números o matices, no ofrecen todos los caracteres, como se explica en @c \concat is actually documented in Align (it is not @c a font-switching command). But we need it here. -vv -Si se usan dentro de una palabra, algunas instrucciones de cambio de -tipografía o de formateo pueden producir un espacio vacío no deseado. -Esto se puede solucionar concatenando en uno solo los distintos -elementos de texto: +Si se usan dentro de una palabra, algunas instrucciones de cambio +de tipografía o de formateo pueden producir un espacio vacío no +deseado. Esto se puede solucionar concatenando en uno solo los +distintos elementos de texto: @lilypond[quote,verbatim] \markup { @@ -669,28 +696,21 @@ elementos de texto: } @end lilypond -Se puede encontrar una lista exhaustiva de instrucciones de cambio y -utilización personalizada de las fuentes tipográficas en @ref{Font}. +Se puede encontrar una lista exhaustiva de instrucciones de cambio +y utilización personalizada de las fuentes tipográficas en +@ref{Font}. -También es posible definir conjuntos personalizados de fuentes, tal y -como se explica en @ref{Tipografías}. +También es posible definir conjuntos personalizados de fuentes, +tal y como se explica en @ref{Tipografías}. @funindex \teeny -@funindex teeny @funindex \tiny -@funindex tiny @funindex \small -@funindex small @funindex \normalsize -@funindex normalsize @funindex \large -@funindex large @funindex \huge -@funindex huge @funindex \smaller -@funindex smaller @funindex \larger -@funindex larger @predefined @@ -722,10 +742,9 @@ Referencia de funcionamiento interno: @knownissues La utilización de las instrucciones de tamaño de texto -@code{\teeny}, @code{\tiny}, -@code{\small}, @code{\normalsize}, @code{\large} y -@code{\huge} conducen a un espaciado de las líneas inconsistente -comparado con el uso de @code{\fontsize}. +@code{\teeny}, @code{\tiny}, @code{\small}, @code{\normalsize}, +@code{\large} y @code{\huge} conducen a un espaciado de las líneas +inconsistente comparado con el uso de @code{\fontsize}. @node Alineación de texto @@ -739,9 +758,10 @@ comparado con el uso de @code{\fontsize}. @cindex marcado, elementos, alinear @cindex marcado, texto, alinear -Esta subsección trata sobre cómo colocar texto en el modo de marcado. -Los objetos de marcado también se pueden mover como un todo, usando la -sintaxis que se describe en @rlearning{Mover objetos}. +Esta subsección trata sobre cómo colocar texto en el modo de +marcado. Los objetos de marcado también se pueden mover como un +todo, usando la sintaxis que se describe en +@rlearning{Mover objetos}. @c Padding commands should be mentioned on this page, but @c most of these require \box to be more clearly illustrated. -vv @@ -750,113 +770,111 @@ sintaxis que se describe en @rlearning{Mover objetos}. @cindex horizontal, alineación de texto @funindex \left-align -@funindex left-align @funindex \center-align -@funindex center-align @funindex \right-align -@funindex right-align Los objetos de marcado se pueden alinear de distintas maneras. De -forma predeterminada, una indicación de texto se alinea sobre el borde -izquierdo: en el ejemplo siguiente, no existe diferencia entre los -marcados primero y segundo. - -@lilypond[quote,verbatim,relative=2] -d1-\markup { poco } -f -d-\markup { \left-align poco } -f -d-\markup { \center-align { poco } } -f -d-\markup { \right-align poco } +forma predeterminada, una indicación de texto se alinea sobre el +borde izquierdo: en el ejemplo siguiente, no existe diferencia +entre los marcados primero y segundo. + +@lilypond[quote,verbatim] +\relative { + d''1-\markup { poco } + f + d-\markup { \left-align poco } + f + d-\markup { \center-align { poco } } + f + d-\markup { \right-align poco } +} @end lilypond @funindex \halign -@funindex halign Se puede realizar un ajuste fino de la alineación horizontal usando un valor numérico: -@lilypond[quote,verbatim,relative=2] -a1-\markup { \halign #-1 poco } -e' -a,-\markup { \halign #0 poco } -e' -a,-\markup { \halign #0.5 poco } -e' -a,-\markup { \halign #2 poco } +@lilypond[quote,verbatim] +\relative { + a'1-\markup { \halign #-1 poco } + e' + a,-\markup { \halign #0 poco } + e' + a,-\markup { \halign #0.5 poco } + e' + a,-\markup { \halign #2 poco } +} @end lilypond @noindent Ciertos objetos pueden poseer sus propios procedimientos de -alineación, y por tanto no resultan afectados por estas instrucciones. -Es posible mover estos objetos de marcado como un todo, como se -muestra por ejemplo en @ref{Indicaciones de texto}. +alineación, y por tanto no resultan afectados por estas +instrucciones. Es posible mover estos objetos de marcado como un +todo, como se muestra por ejemplo en @ref{Indicaciones de texto}. @cindex texto, alineación vertical @cindex vertical, alineación de texto @funindex \raise -@funindex raise @funindex \lower -@funindex lower @funindex \null -@funindex null - -La alineación vertical es un poco más compleja. Como se ha dicho más -arriba, los objetos de marcado se pueden mover como un todo; sin -embargo, también es posible mover elementos específicos dentro de un -bloque de marcado. En este caso, el elemento a mover se debe preceder -de un @emph{punto de anclaje}, que puede ser otro elemento de marcado -o un objeto invisible. El ejemplo siguiente ejemplifica estas dos -posibilidades; el último marcado en este ejemplo no tiene punto de -anclaje y por ello no resulta movido. - -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \raise #2 { Scène 1 } -} -a' -g_\markup { - \null - \lower #4 \bold { Très modéré } -} -a -d,^\markup { - \raise #4 \italic { Une forêt. } + +La alineación vertical es un poco más compleja. Como se ha dicho +más arriba, los objetos de marcado se pueden mover como un todo; +sin embargo, también es posible mover elementos específicos dentro +de un bloque de marcado. En este caso, el elemento a mover se +debe preceder de un @emph{punto de anclaje}, que puede ser otro +elemento de marcado o un objeto invisible. El ejemplo siguiente +ejemplifica estas dos posibilidades; el último marcado en este +ejemplo no tiene punto de anclaje y por ello no resulta movido. + +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \raise #2 { Scène 1 } + } + a' + g_\markup { + \null + \lower #4 \bold { Très modéré } + } + a + d,^\markup { + \raise #4 \italic { Une forêt. } + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @funindex \general-align -@funindex general-align @funindex \translate -@funindex translate @funindex \translate-scaled -@funindex translate-scaled -Algunas instrucciones pueden afectar tanto a la alineación horizontal -como a la vertical de los objetos de texto en el modo de marcado. -Cualquier objeto afectado por estas instrucciones se deben preceder de -un punto de anclaje: +Algunas instrucciones pueden afectar tanto a la alineación +horizontal como a la vertical de los objetos de texto en el modo +de marcado. Cualquier objeto afectado por estas instrucciones se +deben preceder de un punto de anclaje: -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \translate #'(-1 . 2) "Scène 1" -} -a' -g_\markup { - \null - \general-align #Y #3.2 \bold "Très modéré" -} -a -d,^\markup { - \null - \translate-scaled #'(-1 . 2) \teeny "Une forêt." +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \translate #'(-1 . 2) "Scène 1" + } + a' + g_\markup { + \null + \general-align #Y #3.2 \bold "Très modéré" + } + a + d,^\markup { + \null + \translate-scaled #'(-1 . 2) \teeny "Une forêt." + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @cindex varias líneas, marcado @@ -867,9 +885,7 @@ a'4 a g2 a @cindex columnas, texto @funindex \column -@funindex column @funindex \center-column -@funindex center-column Un objeto de marcado puede incluir varias líneas de texto. En el ejemplo siguiente, cada elemento o expresión se sitúa en su propia @@ -896,7 +912,6 @@ línea, ya sea alineada por la izquierda o centrada: @cindex marcado, centrar en la página @funindex \fill-line -@funindex fill-line De forma similar, una lista de elementos o expresiones se puede repartir de forma que rellene por completo el ancho de la línea @@ -930,14 +945,13 @@ cualquier otra expresión de marcado: @cindex ajuste de línea, texto con @funindex \wordwrap -@funindex wordwrap @funindex \justify -@funindex justify Las indicaciones de texto largas se pueden también ajustar -automáticamente según un ancho de línea dado. Estarán alineados por -la izquierda o justificados, como se muestra en el ejemplo siguiente. +automáticamente según un ancho de línea dado. Estarán alineados +por la izquierda o justificados, como se muestra en el ejemplo +siguiente. @lilypond[quote,verbatim] \markup { @@ -969,8 +983,8 @@ la izquierda o justificados, como se muestra en el ejemplo siguiente. @cindex marcado, texto, instrucciones de alineación @cindex alineación, instrucciones de texto -Hay una lista exhaustiva de instrucciones de alineación de texto en -@ref{Align}. +Hay una lista exhaustiva de instrucciones de alineación de texto +en @ref{Align}. @seealso Manual de aprendizaje: @@ -1000,8 +1014,8 @@ Referencia de funcionamiento interno: @cindex insertar objetos gráficos @cindex gráficos, insertar objetos -Se puede añadir diversos objetos gráficos a una partitura, utilizando -instrucciones de marcado. +Se puede añadir diversos objetos gráficos a una partitura, +utilizando instrucciones de marcado. @cindex enmarcar texto @cindex texto, enmarcar @@ -1011,18 +1025,14 @@ instrucciones de marcado. @cindex decorar texto @funindex \box -@funindex box @funindex \circle -@funindex circle @funindex \rounded-box -@funindex rounded-box @funindex \bracket -@funindex bracket @funindex \hbracket -@funindex hbracket -Ciertas instrucciones de marcado permiten la decoración de elementos -de texto con gráficos, como se muestra en el ejemplo siguiente. +Ciertas instrucciones de marcado permiten la decoración de +elementos de texto con gráficos, como se muestra en el ejemplo +siguiente. @lilypond[quote,verbatim] \markup \fill-line { @@ -1046,17 +1056,13 @@ de texto con gráficos, como se muestra en el ejemplo siguiente. @cindex marcado, relleno de textos de @funindex \pad-markup -@funindex pad-markup @funindex \pad-x -@funindex pad-x @funindex \pad-to-box -@funindex pad-to-box @funindex \pad-around -@funindex pad-around -Algunas instrucciones pueden requerir un aumento del relleno alrededor -del texto: esto se puede conseguir con algunas instrucciones de -marcado descritas exhaustivamente en @ref{Align}. +Algunas instrucciones pueden requerir un aumento del relleno +alrededor del texto: esto se puede conseguir con algunas +instrucciones de marcado descritas exhaustivamente en @ref{Align}. @lilypond[quote,verbatim] \markup \fill-line { @@ -1086,17 +1092,11 @@ Flute quartet keeps very uneven time." @cindex notación gráfica @funindex \combine -@funindex combine @funindex \draw-circle -@funindex draw-circle @funindex \filled-box -@funindex filled-box @funindex \triangle -@funindex triangle @funindex \draw-line -@funindex draw-line @funindex \arrow-head -@funindex arrow-head Se pueden imprimir otros símbolos o elementos gráficos sin que se requiera ningún otro texto. De igual manera que en el caso de las @@ -1124,19 +1124,18 @@ expresiones de marcado, dichos objetos se pueden combinar: @cindex PostScript @funindex \epsfile -@funindex epsfile @funindex \postscript -@funindex postscript Entre las funcionalidades gráficas avanzadas se encuentran la posibilidad de incluir archivos de imagen externos convertidos al -formato de PostScript Encapsulado (@emph{eps}), y la inclusión directa -de gráficos dentro del archivo de entrada, usando código PostScript -nativo. En tal caso puede ser de utilidad la especificación explícita -del tamaño del dibujo, como se ejemplifica a continuación: - -@lilypond[quote,verbatim,relative=1] -c1^\markup { +formato de PostScript Encapsulado (@emph{eps}), y la inclusión +directa de gráficos dentro del archivo de entrada, usando código +PostScript nativo. En tal caso puede ser de utilidad la +especificación explícita del tamaño del dibujo, como se +ejemplifica a continuación: + +@lilypond[quote,verbatim,fragment] +c'1^\markup { \combine \epsfile #X #10 #"./context-example.eps" \with-dimensions #'(0 . 6) #'(0 . 10) @@ -1152,16 +1151,18 @@ c1^\markup { closepath stroke" } -c +c' @end lilypond -Hay una lista exhaustiva de instrucciones específicas de gráficos en -@ref{Graphic}. +Hay una lista exhaustiva de instrucciones específicas de gráficos +en @ref{Graphic}. @seealso Referencia de la notación: -@ref{Graphic}, -@ref{Anotaciones editoriales}. +@ref{Align}, +@ref{Dimensions}, +@ref{Anotaciones editoriales}, +@ref{Graphic}. Archivos de inicio: @file{scm/define-markup-commands.scm}, @@ -1188,76 +1189,82 @@ musical, dentro de un objeto de marcado. Las notas y las alteraciones se pueden escribir utilizando instrucciones de marcado: -@lilypond[quote,verbatim,relative=2] -a2 a^\markup { +@lilypond[quote,verbatim,fragment] +a'2 a'^\markup { \note #"4" #1 = \note-by-number #1 #1 #1.5 } -b1_\markup { +b'1_\markup { \natural \semiflat \flat \sesquiflat \doubleflat } \glissando -a1_\markup { +a'1_\markup { \natural \semisharp \sharp \sesquisharp \doublesharp } -\glissando b +\glissando b' @end lilypond Otros objetos de notación se pueden también imprimir en el modo de marcado: -@lilypond[quote,verbatim,relative=1] -g1 bes -ees\finger \markup \tied-lyric #"4~1" -fis_\markup { \dynamic rf } -bes^\markup { - \beam #8 #0.1 #0.5 -} -cis -d-\markup { - \markalphabet #8 - \markletter #8 +@lilypond[quote,verbatim] +\relative { + g1 bes + ees\finger \markup \tied-lyric #"4~1" + fis_\markup { \dynamic rf } + bes^\markup { + \beam #8 #0.1 #0.5 + } + cis + d-\markup { + \markalphabet #8 + \markletter #8 + } } @end lilypond -De forma más general, cualquier símbolo musical disponible se puede -incluir por separado dentro de un objeto de marcado, como se -ejemplifica a continuación; hay una lista exhaustiva de estos símbolos -y sus nombres en @ref{La tipografía Feta}. - -@lilypond[quote,verbatim,relative=2] -c2 -c'^\markup { \musicglyph #"eight" } -c,4 -c,8._\markup { \musicglyph #"clefs.G_change" } -c16 -c2^\markup { \musicglyph #"timesig.neomensural94" } +De forma más general, cualquier símbolo musical disponible se +puede incluir por separado dentro de un objeto de marcado, como se +ejemplifica a continuación; hay una lista exhaustiva de estos +símbolos y sus nombres en @ref{La tipografía Feta}. + +@lilypond[quote,verbatim] +\relative { + c''2 + c'^\markup { \musicglyph #"eight" } + c,4 + c,8._\markup { \musicglyph #"clefs.G_change" } + c16 + c2^\markup { \musicglyph #"timesig.neomensural94" } +} @end lilypond Otra forma de imprimir glifos que no son de texto se encuentra -descrita en @ref{Explicación de las fuentes tipográficas}. Tiene la -utilidad de imprimir llaves de distintos tamaños. +descrita en @ref{Explicación de las fuentes tipográficas}. Tiene +la utilidad de imprimir llaves de distintos tamaños. El modo de marcado también contempla diagramas para instrumentos específicos: -@lilypond[quote,verbatim,relative=2] -c1^\markup { - \fret-diagram-terse #"x;x;o;2;3;2;" -} -c^\markup { - \harp-pedal #"^-v|--ov^" -} -c -c^\markup { - \combine - \musicglyph #"accordion.discant" +@lilypond[quote,verbatim] +\relative { + c''1^\markup { + \fret-diagram-terse #"x;x;o;2;3;2;" + } + c^\markup { + \harp-pedal #"^-v|--ov^" + } + c + c^\markup { \combine - \raise #0.5 \musicglyph #"accordion.dot" - \raise #1.5 \musicglyph #"accordion.dot" + \musicglyph #"accordion.discant" + \combine + \raise #0.5 \musicglyph #"accordion.dot" + \raise #1.5 \musicglyph #"accordion.dot" + } } @end lilypond @@ -1270,23 +1277,25 @@ Specific Markup}. @cindex partitura dentro marcado @cindex marcado, partitura dentro de -Incluso una partitura completa se puede incluir dentro de un objeto de -marcado. En tal caso, el bloque anidado @code{\score} debe contener -un bloque @code{\layout}, como se muestra aquí: +Incluso una partitura completa se puede incluir dentro de un +objeto de marcado. En tal caso, el bloque anidado @code{\score} +debe contener un bloque @code{\layout}, como se muestra aquí: -@lilypond[quote,verbatim,relative=1] -c4 d^\markup { - \score { - \relative c' { c4 d e f } - \layout { } +@lilypond[quote,verbatim] +\relative { + c'4 d^\markup { + \score { + \relative { c'4 d e f } + \layout { } + } } + e f | + c d e f } -e f | -c d e f @end lilypond -Hay una lista exhaustiva de instrucciones relacionadas con la notación -musical en @ref{Music}. +Hay una lista exhaustiva de instrucciones relacionadas con la +notación musical en @ref{Music}. @seealso Referencia de la notación: @@ -1316,15 +1325,12 @@ Referencia de funcionamiento interno: @cindex texto que ocupa varias páginas @funindex \markuplist -@funindex markuplist @funindex \justified-lines -@funindex justified-lines @funindex \wordwrap-lines -@funindex wordwrap-lines Aunque los objetos de marcado estándar no se pueden dividir, una -sintaxis específica hace posible la introducción de líneas de texto -que pueden abarcar varias páginas: +sintaxis específica hace posible la introducción de líneas de +texto que pueden abarcar varias páginas: @c KEEP LY @lilypond[quote,verbatim] @@ -1351,18 +1357,18 @@ una lista de marcados, o una lista de listas de marcado. @end itemize -Hay una lista exhaustiva de las instrucciones de lista de marcado en -@ref{Text markup list commands}. +Hay una lista exhaustiva de las instrucciones de lista de marcado +en @ref{Instrucciones de listas de marcado de texto}. @seealso Referencia de la notación: -@ref{Text markup list commands}. +@ref{Instrucciones de listas de marcado de texto}. Archivos de inicio: @file{scm/define-markup-commands.scm}. Manual de extensión: -@rextend{New markup list command definition}. +@rextend{Definición de nuevas instrucciones de lista de marcado}. Fragmentos de código: @rlsr{Text}. @@ -1371,7 +1377,6 @@ Referencia de funcionamiento interno: @rinternals{TextScript}. @funindex \markuplist -@funindex markuplist @predefined @code{\markuplist}. @@ -1406,9 +1411,10 @@ tipográficas, y cómo se pueden cambiar en las partituras. @funindex font-interface -Las fuentes tipográficas se manejan a través de distintas bibliotecas. -FontConfig se utiliza para detectar las tipografías disponibles en el -sistema; las tipografías seleccionadas se trazan utilizando Pango. +Las fuentes tipográficas se manejan a través de distintas +bibliotecas. FontConfig se utiliza para detectar las tipografías +disponibles en el sistema; las tipografías seleccionadas se trazan +utilizando Pango. Las tipografías de notación musical se pueden describir como un conjunto de glifos específicos, ordenados en varias familias. La @@ -1416,8 +1422,8 @@ siguiente sintaxis permite usar directamente varias tipografías @code{feta} de LilyPond distintas a las de texto en el modo de marcado: -@lilypond[quote,verbatim,relative=2] -a1^\markup { +@lilypond[quote,verbatim,fragment] +a'1^\markup { \vcenter { \override #'(font-encoding . fetaBraces) \lookup #"brace120" @@ -1430,54 +1436,56 @@ a1^\markup { @end lilypond @noindent -Sin embargo, todos estos glifos excepto las llaves de varios tamaños -que están contenidas en la fuente tipográfica @code{fetaBraces} están -disponibles utilizando la sintaxis más sencilla que se describe en +Sin embargo, todos estos glifos excepto las llaves de varios +tamaños que están contenidas en la fuente tipográfica +@code{fetaBraces} están disponibles utilizando la sintaxis más +sencilla que se describe en @ref{Notación musical dentro de elementos de marcado}. -Cuando se usan los glifos de la fuente de llaves @code{fetaBraces}, el -tamaño de la llave se especifica por la parte numérica del nombre del -glifo, en unidades arbitrarias. Se puede especificar cualquier entero -de @code{0} a @code{575} inclusive, siendo @code{0} el que produce la -llave más pequeña. El valor óptimo se debe determinar por ensayo y -error. Todos estos glifos son llaves izquierdas; las llaves derechas -se pueden obtener mediante rotación, véase @ref{Rotación de objetos}. - -Están disponibles tres familias de tipografías de texto: la tipografía -@emph{romana} (con serifa), que de forma predeterminada es New Century -Schoolbook, la fuente @emph{sans} y la fuente monoespaciada -@emph{de máquina de escribir}. Estas dos últimas familias vienen -determinadas por la instalación de Pango. - -@warning{No existen fuentes tipográficas predeterminadas asociadas -con las familias de fuente @emph{sans} y @emph{typewriter}. Un -archivo de entrada que especifica alguna de éstas puede dar lugar -a salidas diferentes en distintos sistemas. Para asegurar un -resultado consistente entre distintas plataformas, se deben -especificar las tipografías por su nombre, y dichas fuentes deben -estar disponibles en cualquier sistema que vaya a procesar el -documento. Véase @ref{Fuentes de un solo elemento} y -@ref{Fuentes tipográficas del documento completo}.} +Cuando se usan los glifos de la fuente de llaves +@code{fetaBraces}, el tamaño de la llave se especifica por la +parte numérica del nombre del glifo, en unidades arbitrarias. Se +puede especificar cualquier entero de @code{0} a @code{575} +inclusive, siendo @code{0} el que produce la llave más pequeña. +El valor óptimo se debe determinar por ensayo y error. Todos +estos glifos son llaves izquierdas; las llaves derechas se pueden +obtener mediante rotación, véase @ref{Rotación de objetos}. + +Están disponibles tres familias de fuentes tipográficas para el +texto: +@itemize +@item +La fuente @emph{roman} (serif), que de forma predeterminada es +LilyPond Serif (un alias de TeX Gyre Schola). +@item +La fuente @emph{sans}, que de forma predeterminada es LilyPond +Sans Serif (un alias de TeX Gyre Heros). +@item +La fuente @emph{typewriter} mecanográfica (monoespaciada), que de +forma predeterminada es LilyPond Monospace (un alias de TeX Gyre +Cursor). +@end itemize Cada familia puede incluir distintas formas y series. El ejemplo siguiente muestra la posibilidad de seleccionar familias, formas, -series y tamaños alternativos. El valor que se da a @code{font-size} -es el cambio requerido a partir del tamaño predeterminado. +series y tamaños alternativos. El valor que se da a +@code{font-size} es el cambio requerido a partir del tamaño +predeterminado. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Score.RehearsalMark.font-family = #'typewriter \mark \markup "Ouverture" \override Voice.TextScript.font-shape = #'italic \override Voice.TextScript.font-series = #'bold -d2.^\markup "Allegro" +d''2.^\markup "Allegro" \override Voice.TextScript.font-size = #-3 -c4^smaller +c''4^smaller @end lilypond @noindent -Se puede usar una sintaxis similar en el modo de marcado, aunque en -este caso es preferible usar la sintaxis sencilla que se explica en -@ref{Seleccionar la tipografía y su tamaño}: +Se puede usar una sintaxis similar en el modo de marcado, aunque +en este caso es preferible usar la sintaxis sencilla que se +explica en @ref{Seleccionar la tipografía y su tamaño}: @lilypond[quote,verbatim] \markup { @@ -1503,7 +1511,8 @@ este caso es preferible usar la sintaxis sencilla que se explica en Aunque es fácil cambiar entre las fuentes tipográficas preconfiguradas, también es posible usar otras fuentes, como se -explica en las siguientes secciones: @ref{Fuentes de un solo elemento} y +explica en las siguientes secciones: +@ref{Fuentes de un solo elemento} y @ref{Fuentes tipográficas del documento completo}. @seealso @@ -1519,18 +1528,18 @@ Referencia de la notación: @unnumberedsubsubsec Fuentes de un solo elemento @translationof Single entry fonts -Se puede usar en una partitura cualquier fuente tipográfica que esté -instalada en el sistema operativo y reconocida por parte de +Se puede usar en una partitura cualquier fuente tipográfica que +esté instalada en el sistema operativo y reconocida por parte de FontConfig, usando la siguiente sintaxis: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.TimeSignature.font-name = #"Bitstream Charter" \override Staff.TimeSignature.font-size = #2 \time 3/4 -a1_\markup { - \override #'(font-name . "Vera Bold") - { Vera Bold } +a'1_\markup { + \override #'(font-name . "Bitstream Vera Sans,sans-serif, Oblique Bold") + { Vera Oblique Bold } } @end lilypond @@ -1539,10 +1548,18 @@ a1_\markup { @cindex listar fuentes tipográficas disponibles @cindex disponibles, listar las fuentes tipográficas +@var{font-name} puede describirse usando una lista de @q{fuentes +tipográfcias} separadas por comas y una lista de @q{estilos} +separados por espacios. En la medida en que la @q{fuente +tipográfica} de la lista esté instalada y contenga el glifo +solicitado, se usará. En caso contrario, se usará como +sustitución la @emph{siguiente} fuente tipográfica de la lista. + @funindex show-available-fonts -La instrucción siguiente presenta una lista de todas las tipografías -disponibles en el sistema operativo: +La ejecución de lilypond con la opción siguiente presenta una +lista de todas las tipografías disponibles en el sistema +operativo: @example lilypond -dshow-available-fonts x @@ -1568,10 +1585,14 @@ Fragmentos de código: Se pueden cambiar las fuentes tipográficas que se usan como tipografías predeterminadas en las familias @emph{romana}, @emph{sans-serif} y @emph{monoespaciada}, especificándolas en este -orden como se ve en el ejemplo de abajo, que escala las tipografías -automáticamente con el valor fijado para el tamaño global del pentagrama. -Para leer más explicaciones -sobre las fuentes tipográficas, consulte @ref{Explicación de las fuentes tipográficas}. +orden como se ve en el ejemplo de abajo, que escala las +tipografías automáticamente con el valor fijado para el tamaño +global del pentagrama. De forma parecida a +@ref{Fuentes de un solo elemento}, se puede describir usando una +lista de @q{fuentes tipográficas} separadas por comas. Sin +embargo, los @q{estilos} de fuente no se pueden describir. Para +leer más explicaciones sobre las fuentes tipográficas, consulte +@ref{Explicación de las fuentes tipográficas}. @cindex fuente, establecer la familia de @cindex fuentes tipográficas, cambiar para todo el documento @@ -1582,7 +1603,7 @@ sobre las fuentes tipográficas, consulte @ref{Explicación de las fuentes tipog \paper { #(define fonts (make-pango-font-tree "Times New Roman" - "Nimbus Sans" + "Nimbus Sans,Nimbus Sans L" "Luxi Mono" (/ staff-height pt 20))) } diff --git a/Documentation/es/notation/unfretted-strings.itely b/Documentation/es/notation/unfretted-strings.itely index 4e34832898..3d1cb444c4 100644 --- a/Documentation/es/notation/unfretted-strings.itely +++ b/Documentation/es/notation/unfretted-strings.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 67a345f965d169bc1acd23ff4160914fb2142f38 + Translation of GIT committish: 38876d5851add12a153f8e7adb375a8c1c84f376 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.18.0" @node Instrumentos de cuerda sin trastes @section Instrumentos de cuerda sin trastes @@ -21,8 +21,8 @@ @cindex cuerdas orquestales @cindex cuerdas, escribir música para -Esta sección aporta información y referencias que resultan útiles si -se escribe música para instrumentos de cuerda sin trastes, +Esta sección aporta información y referencias que resultan útiles +si se escribe música para instrumentos de cuerda sin trastes, principalmente instrumentos de cuerda orquestales. @menu @@ -33,10 +33,10 @@ principalmente instrumentos de cuerda orquestales. @subsection Notación común para cuerdas sin trastes @translationof Common notation for unfretted strings -Hay poca notación especializada para los instrumentos de cuerdas sin -trastes. La notación de la música se realiza en un solo pentagrama, y -se suele usar una sola voz. Se pueden necesitar dos voces para -algunos pasajes en dobles cuerdas o en divisi. +Hay poca notación especializada para los instrumentos de cuerdas +sin trastes. La notación de la música se realiza en un solo +pentagrama, y se suele usar una sola voz. Se pueden necesitar dos +voces para algunos pasajes en dobles cuerdas o en divisi. @menu * Referencias para cuerdas sin trastes:: @@ -49,9 +49,9 @@ algunos pasajes en dobles cuerdas o en divisi. @unnumberedsubsubsec Referencias para cuerdas sin trastes @translationof References for unfretted strings -La mayor parte de la notación que resulta de utilidad para las cuerdas -orquestales y otros instrumentos de arco se estudia en otras partes -del manual: +La mayor parte de la notación que resulta de utilidad para las +cuerdas orquestales y otros instrumentos de arco se estudia en +otras partes del manual: @itemize @@ -96,6 +96,7 @@ Fragmentos de código: @funindex \upbow @funindex \downbow @funindex \open +@funindex \romanStringNumbers @cindex arco, indicaciones de @cindex arco arriba, indicación @@ -104,38 +105,49 @@ Fragmentos de código: @cindex abajo, arco @cindex al aire, indicación de cuerda @cindex cuerda al aire, indicación de +@cindex cuerda, números de Las indicaciones de arco se crean como articulaciones, que se describen en @ref{Articulaciones y ornamentos}. Las instrucciones de arco @code{\upbow} (arco arriba) y -@code{\downbow} (arco abajo) se usan con ligaduras de expresión de la -siguiente manera: +@code{\downbow} (arco abajo) se usan con ligaduras de expresión de +la siguiente manera: -@lilypond[verbatim,quote,relative=2] -c4(\downbow d) e(\upbow f) +@lilypond[verbatim,quote] +\relative { c''4(\downbow d) e(\upbow f) } @end lilypond @noindent -y el ejemplo siguiente muestra tres formas distintas de indicar un La -sobre una cuerda al aire del violín: -@lilypond[verbatim,quote,relative=2] -a4 \open -a^\markup { \teeny "II" } -a2^\markup { \small "sul A" } +Se pueden añadir números romanos como números de cuerda (en +sustitución de la opción predeterminada, que son cifras arábigas +rodeadas por un círculo), tal y como se explica en +@ref{Indicación de los números de cuerda}. + +Como alternativa, se pueden imprimir las indicaciones de cuerda +mediante instrucciones de marcado; los símbolos de articulación +también pueden indicar cuerdas al aire. + +@lilypond[verbatim,quote,fragment] +a'4 \open +\romanStringNumbers +a'\2 +a'2^\markup { \small "sul A" } @end lilypond @predefined @code{\downbow}, @code{\upbow}, -@code{\open}. +@code{\open}, +@code{\romanStringNumbers}. @endpredefined @seealso Referencia de la notación: @ref{Articulaciones y ornamentos}, +@ref{Indicación de los números de cuerda}, @ref{Ligaduras de expresión}. @@ -157,53 +169,59 @@ Referencia de la notación: La notación de los armónicos naturales se puede realizar de varias formas. Generalmente, una nota con la cabeza en forma de rombo -significa tocar (sin apretar) la cuerda en el lugar donde se pisaría -la nota si no fuese un rombo. - -@lilypond[verbatim,quote,relative=2] -d4 e4. -\harmonicsOn -d8 e e -d4 e4. -\harmonicsOff -d8 e e +significa tocar (sin apretar) la cuerda en el lugar donde se +pisaría la nota si no fuese un rombo. + +@lilypond[verbatim,quote] +\relative d'' { + d4 e4. + \harmonicsOn + d8 e e + d4 e4. + \harmonicsOff + d8 e e +} @end lilypond -Como posibilidad alternativa está la de mostrar una cabeza normal de -nota en la altura de la nota que debe sonar, con un pequeño círculo -que indica que se debe tocar como armónico: +Como posibilidad alternativa está la de mostrar una cabeza normal +de nota en la altura de la nota que debe sonar, con un pequeño +círculo que indica que se debe tocar como armónico: -@lilypond[verbatim,quote,relative=2] -d2^\flageolet d_\flageolet +@lilypond[verbatim,quote,fragment] +d''2^\flageolet d''_\flageolet @end lilypond Se puede hacer un círculo de menor tamaño, véase la lista de -fragmentos de código en @ref{Referencias para cuerdas sin trastes}. +fragmentos de código en +@ref{Referencias para cuerdas sin trastes}. @strong{@i{Armónicos artificiales}} @cindex artificiales, armónicos @cindex armónicos artificiales -La notación de los armónicos artificiales se realiza con dos notas, -una con una cabeza normal que indica la posición donde se pisa, y otra -con una cabeza en forma de rombo hueco para indicar la posición donde -se roza la cuerda (sin pisar) para producir el armónico. +La notación de los armónicos artificiales se realiza con dos +notas, una con una cabeza normal que indica la posición donde se +pisa, y otra con una cabeza en forma de rombo hueco para indicar +la posición donde se roza la cuerda (sin pisar) para producir el +armónico. @c TODO If the default for harmonicDots is changed, change this -Los armónicos artificiales indicados con @code{\harmonic} no presentan -los puntillos. La propiedad de contexto @code{harmonicDots} se debe -activar si se necesitan los puntillos. - -@lilypond[verbatim,quote,relative=1] -2. 4 -\set harmonicDots = ##t -2. 4 +Los armónicos artificiales indicados con @code{\harmonic} no +presentan los puntillos. La propiedad de contexto +@code{harmonicDots} se debe activar si se necesitan los puntillos. + +@lilypond[verbatim,quote] +\relative e' { + 2. 4 + \set harmonicDots = ##t + 2. 4 +} @end lilypond -@warning{@code{@bs{}harmonic} @strong{se debe} colocar dentro de una -construcción de acorde incluso si solamente hay una nota. Normalmente -se usaría @code{@bs{}harmonicsOn} en esta situación.} +@warning{@code{@bs{}harmonic} @strong{se debe} colocar dentro de +una construcción de acorde incluso si solamente hay una nota. +Normalmente se usaría @code{@bs{}harmonicsOn} en esta situación.} @seealso Glosario musical: @@ -223,15 +241,16 @@ Referencia de la notación: @cindex Bartók pizzicato @cindex snap pizzicato -El @notation{snap pizzicato} (conocido también como @qq{pizzicato de Bartók}) es un -tipo de pizzicato en el que la cuerda se pulsa hacia arriba (y no lateralmente) -de forma deliberada, de forma que golpea la madera del diapasón. - -@lilypond[verbatim,quote,relative=1] -c4\snappizzicato -4\snappizzicato -4^\snappizzicato -4_\snappizzicato +El @notation{snap pizzicato} (conocido también como @qq{pizzicato +de Bartók}) es un tipo de pizzicato en el que la cuerda se pulsa +hacia arriba (y no lateralmente) de forma deliberada, de forma que +golpea la madera del diapasón. + +@lilypond[verbatim,quote] +\relative { + c'4\snappizzicato + 4\snappizzicato + 4^\snappizzicato + 4_\snappizzicato +} @end lilypond - - diff --git a/Documentation/es/notation/vocal.itely b/Documentation/es/notation/vocal.itely index b03d0e0aff..cc317c5a7d 100644 --- a/Documentation/es/notation/vocal.itely +++ b/Documentation/es/notation/vocal.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 0fd0f2751c2001f2ff49c98bb8534aef1db77c6d + Translation of GIT committish: 88cfc9ee61dece9cffff98ab7f10318633698c39 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @node Música vocal @section Música vocal @@ -16,8 +16,9 @@ @lilypondfile[quote]{vocal-headword.ly} -Esta sección explica cómo tipografiar música vocal, y cómo asegurarse -de que la letra se alinea con las notas de su melodía correspondiente. +Esta sección explica cómo tipografiar música vocal, y cómo +asegurarse de que la letra se alinea con las notas de su melodía +correspondiente. @menu * Notación común para música vocal:: @@ -35,8 +36,8 @@ de que la letra se alinea con las notas de su melodía correspondiente. @subsection Notación común para música vocal @translationof Common notation for vocal music -Esta sección se ocupa de las cuestiones comunes a la mayoría de los -tipos de música vocal. +Esta sección se ocupa de las cuestiones comunes a la mayoría de +los tipos de música vocal. @menu * Referencias para música vocal:: @@ -54,32 +55,32 @@ tipos de música vocal. @unnumberedsubsubsec Referencias para música vocal @translationof References for vocal music -Esta sección indica dónde encontrar los detalles de las cuestiones de -notación que pueden surgir en cualquier tipo de música vocal. +Esta sección indica dónde encontrar los detalles de las cuestiones +de notación que pueden surgir en cualquier tipo de música vocal. @itemize @item Casi todos los estilos de música vocal utilizan texto escrito como -letra. Hay una introducción a esta notación en @rlearning{Elaborar -canciones sencillas}. +letra. Hay una introducción a esta notación en +@rlearning{Elaborar canciones sencillas}. @item -La música vocal probablemente requiere el uso del modo de marcado o -@code{markup}, ya sea para la letra o para otros elementos de texto -(nombres de los personajes, etc.). Esta sintaxis está descrita en -@ref{Introducción al marcado de texto}. +La música vocal probablemente requiere el uso del modo de marcado +o @code{markup}, ya sea para la letra o para otros elementos de +texto (nombres de los personajes, etc.). Esta sintaxis está +descrita en @ref{Introducción al marcado de texto}. @item -Los @notation{ambitus} o indicaciones de tesitura vocal se pueden añadir al -principio de los pentagramas vocales, como se explica en +Los @notation{ambitus} o indicaciones de tesitura vocal se pueden +añadir al principio de los pentagramas vocales, como se explica en @ref{Tesitura}. @item -De forma predeterminada, las indicaciones dinámicas se sitúan debajo -del pentagrama, pero en la música coral se suelen disponer por encima -del pentagrama para evitar la letra, como se explica en +De forma predeterminada, las indicaciones dinámicas se sitúan +debajo del pentagrama, pero en la música coral se suelen disponer +por encima del pentagrama para evitar la letra, como se explica en @ref{Disposiciones de la partitura para música coral}. @end itemize @@ -117,12 +118,13 @@ Fragmentos de código: @c TODO should we explain hyphens here -La letra de las canciones se introduce en un modo de entrada especial -que se inicia mediante la palabra clave @code{\lyricmode}, o bien -mediante @code{\addlyrics} ó @code{\lyricsto}. En este modo especial -de entrada, el carácter @code{d} no se analiza como una nota, sino más -bien como una sílaba de una sola letra. Dicho de otra forma, las -sílabas se introducen como las notas, pero la altura de las notas se +La letra de las canciones se introduce en un modo de entrada +especial que se inicia mediante la palabra clave +@code{\lyricmode}, o bien mediante @code{\addlyrics} ó +@code{\lyricsto}. En este modo especial de entrada, el carácter +@code{d} no se analiza como una nota, sino más bien como una +sílaba de una sola letra. Dicho de otra forma, las sílabas se +introducen como las notas, pero la altura de las notas se sustituye por texto. Por ejemplo: @@ -133,72 +135,75 @@ Por ejemplo: @end example Existen dos métodos principales para especificar la colocación -horizontal de las sílabas: mediante la indicación de la duración de -cada sílaba explícitamente, como en el ejemplo anterior, o dejando que -la letra se alinee automáticamente con una melodía u otra voz de -música, utilizando @code{\addlyrics} o @code{\lyricsto}. El primer -método se describe a continuación bajo el epígrafe @ref{Duración -manual de las sílabas}. El segundo método se describe en -@ref{Duración automática de las sílabas}. - -Una palabra o sílaba de la letra comienza con un carácter alfabético -(y algunos otros caracteres, véase más abajo) y termina con un espacio -o un dígito. El resto de los caracteres dentro de la sílaba pueden -ser cualesquier caracteres que no sean dígitos o espacios. - -A causa de que cualquier carácter que no es un dígito o un espacio se -considera parte de la sílaba, una palabra es válida incluso si termina -con @code{@}}, lo que a menudo lleva al siguiente fallo: +horizontal de las sílabas: mediante la indicación de la duración +de cada sílaba explícitamente, como en el ejemplo anterior, o +dejando que la letra se alinee automáticamente con una melodía u +otra voz de música, utilizando @code{\addlyrics} o +@code{\lyricsto}. El primer método se describe a continuación +bajo el epígrafe @ref{Duración manual de las sílabas}. El segundo +método se describe en @ref{Duración automática de las sílabas}. + +Una palabra o sílaba de la letra comienza con un carácter +alfabético (y algunos otros caracteres, véase más abajo) y termina +con un espacio o un dígito. El resto de los caracteres dentro de +la sílaba pueden ser cualesquier caracteres que no sean dígitos o +espacios. + +A causa de que cualquier carácter que no es un dígito o un espacio +se considera parte de la sílaba, una palabra es válida incluso si +termina con @code{@}}, lo que a menudo lleva al siguiente fallo: @example \lyricmode @{ la la la@} @end example -En este ejemplo, el símbolo @code{@}} se encuentra incluido dentro de -la sílaba final, por tanto la llave de apertura no se compensa con la -correspondiente llave de cierre y el archivo de entrada probablemente -no se podrá procesar. En vez de ello, las llaves siempre deben ir -rodeadas por espacios: +En este ejemplo, el símbolo @code{@}} se encuentra incluido dentro +de la sílaba final, por tanto la llave de apertura no se compensa +con la correspondiente llave de cierre y el archivo de entrada +probablemente no se podrá procesar. En vez de ello, las llaves +siempre deben ir rodeadas por espacios: @example \lyricmode @{ la la la @} @end example -Los signos de puntuación, las letras con caracteres acentuados o de -cualquier idioma distinto del inglés, o los caracteres especiales -(como el símbolo del corazón o las comillas inclinadas), se pueden -insertar directamente en el archivo de entrada, siempre que éste se -grabe con la codificación UTF-8. Para más información, consulte -@ref{Caracteres especiales}. +Los signos de puntuación, las letras con caracteres acentuados o +de cualquier idioma distinto del inglés, o los caracteres +especiales (como el símbolo del corazón o las comillas +inclinadas), se pueden insertar directamente en el archivo de +entrada, siempre que éste se grabe con la codificación UTF-8. +Para más información, consulte @ref{Caracteres especiales}. @lilypond[quote,verbatim] -\relative c'' { d8 c16 a bes8 f e' d c4 } +\relative { d''8 c16 a bes8 f ees' d c4 } \addlyrics { „Schad’ um das schö -- ne grü -- ne Band, } @end lilypond -Se pueden usar las comillas normales dentro de la letra, pero deben ir -precedidas por el carácter de barra invertida y la sílaba en su -conjunto se debe encerrar en otro par de comillas. Por ejemplo, +Se pueden usar las comillas normales dentro de la letra, pero +deben ir precedidas por el carácter de barra invertida y la sílaba +en su conjunto se debe encerrar en otro par de comillas. Por +ejemplo, @lilypond[quote,verbatim] -\relative c' { \time 3/4 e4 e4. e8 d4 e d c2. } +\relative { \time 3/4 e'4 e4. e8 d4 e d c2. } \addlyrics { "\"I" am so lone -- "ly,\"" said she } @end lilypond -La definición completa del comienzo de una palabra en el modo Lyrics -(letra) es algo más compleja. Una palabra en el modo Lyrics comienza -por: un carácter alfabético, @code{_}, @code{?}, @code{!}, @code{:}, -@code{'}, los caracteres de control desde @code{^A} hasta @code{^F}, -desde @code{^Q} hasta @code{^W}, @code{^Y}, @code{^^}, cualquier -carácter de 8 bits con código ASCII por encima del 127, o una -combinación de dos caracteres consistente en la combinación de una -barra invertida seguida por @code{`}, @code{'}, @code{"} ó @code{^}. +La definición completa del comienzo de una palabra en el modo +Lyrics (letra) es algo más compleja. Una palabra en el modo +Lyrics comienza por: un carácter alfabético, @code{_}, @code{?}, +@code{!}, @code{:}, @code{'}, los caracteres de control desde +@code{^A} hasta @code{^F}, desde @code{^Q} hasta @code{^W}, +@code{^Y}, @code{^^}, cualquier carácter de 8 bits con código +ASCII por encima del 127, o una combinación de dos caracteres +consistente en la combinación de una barra invertida seguida por +@code{`}, @code{'}, @code{"} ó @code{^}. @c " to balance double quotes for not-so-bright context-sensitive editors -Un enorme control sobre la apariencia de la letra proviene del uso de -elementos de marcado @code{\markup} dentro de la propia letra. Para -ver una explicación de muchas de las opciones, consulte +Un enorme control sobre la apariencia de la letra proviene del uso +de elementos de marcado @code{\markup} dentro de la propia letra. +Para ver una explicación de muchas de las opciones, consulte @ref{Formatear el texto}. @snippets @@ -233,35 +238,48 @@ Fragmentos de código: @funindex \addlyrics @funindex \lyricsto -La letra se imprime mediante su interpretación dentro del contexto -llamado @code{Lyrics}, véase @ref{Explicación de los contextos}. +La letra se interpreta en el modo @code{\lyricmode} y se imprime +dentro del contexto llamado @code{Lyrics}, +véase @ref{Explicación de los contextos}. @example \new Lyrics \lyricmode @{ @dots{} @} @end example -La letra se puede alinear con la melodía de dos maneras principales: +Dos variantes de @code{\lyricmode} además disponen un contexto +asociado que se usa para sincronizar las sílabas de la letra con +la música. @code{\addlyrics}, que es más conveniente, sigue +inmediatamente al contenido musical del contexto de Voz con el que +se debe sincronizar, creando implícitamente un contexto Lyrics +completo. @code{\lyricsto} es más versátil y requiere tanto que +se especifique el contexto Voice asociado por su nombre, como que +se cree explícitamente un contexto contenedor Lyrics. Para ver +más detalles, consulte @ref{Duración automática de las sílabas}. + +La letra se puede alinear con la melodía de dos maneras +principales: @itemize @item -Se puede alinear la letra automáticamente, tomándose las duraciones de -las sílabas de otra voz de música, o (en circunstancias especiales) -una melodía asociada, usando @code{\addlyrics}, @code{\lyricsto}, o -estableciendo el valor de la propiedad @code{associatedVoice}. Para -ver más detalles, consulte @ref{Duración automática de las sílabas}. +Se puede alinear la letra automáticamente, tomándose las +duraciones de las sílabas de otra voz de música, o (en +circunstancias especiales) una melodía asociada, usando +@code{\addlyrics}, @code{\lyricsto}, o estableciendo el valor de +la propiedad @code{associatedVoice}. Para ver más detalles, +consulte @ref{Duración automática de las sílabas}. @lilypond[quote,ragged-right,verbatim] << \new Staff << \time 2/4 - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \voiceOne - c4 b8. a16 g4. r8 a4 ( b ) c2 + c''4 b8. a16 g4. r8 a4 ( b ) c2 } - \new Voice = "two" \relative c' { + \new Voice = "two" \relative { \voiceTwo - s2 s4. f8 e4 d c2 + s2 s4. f'8 e4 d c2 } >> @@ -283,11 +301,12 @@ ver más detalles, consulte @ref{Duración automática de las sílabas}. La primera línea de letra muestra la forma normal de introducir la letra. -La segunda línea de texto muestra cómo se puede cambiar la voz de la -que se toman las duraciones para las sílabas. Esto es útil si el -texto de las distintas estrofas corresponde a las mismas notas de -formas diferentes, y todas las duraciones están disponibles dentro de -contextos de voz. Para ver más detalles, consulte @ref{Versos}. +La segunda línea de texto muestra cómo se puede cambiar la voz de +la que se toman las duraciones para las sílabas. Esto es útil si +el texto de las distintas estrofas corresponde a las mismas notas +de formas diferentes, y todas las duraciones están disponibles +dentro de contextos de voz. Para ver más detalles, consulte +@ref{Versos}. @item El texto se puede alinear independientemente de la duración de @@ -296,9 +315,9 @@ explícitamente, y se escriben con @code{\lyricmode}. @lilypond[quote,ragged-right,verbatim] << - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \time 2/4 - c4 b8. a16 g4. f8 e4 d c2 + c''4 b8. a16 g4. f8 e4 d c2 } % uses previous explicit duration of 2; @@ -317,21 +336,16 @@ El primer verso no está alineado con las notas porque no se especificaron las duraciones, y se utiliza el valor previo de 2 (blanca) para todas las sílabas. -El segundo verso muestra cómo las palabras se pueden alinear de forma -independiente de las notas. Esto es útil si el texto de los distintos -versos se corresponde con las notas de maneras diferentes, pero las -duraciones requeridas no están disponibles en un contexto de música. -Para ver más detalles, consulte @ref{Duración manual de las sílabas}. -Esta técnica también es útil cuando se quiere preparar un diálogo -encima de la música; para ver ejemplos que lo muestran, consulte +El segundo verso muestra cómo las palabras se pueden alinear de +forma independiente de las notas. Esto es útil si el texto de los +distintos versos se corresponde con las notas de maneras +diferentes, pero las duraciones requeridas no están disponibles en +un contexto de música. Para ver más detalles, consulte +@ref{Duración manual de las sílabas}. Esta técnica también es +útil cuando se quiere preparar un diálogo encima de la música; +para ver ejemplos que lo muestran, consulte @ref{Diálogos encima de la música}. -Cuando se escriben de esta forma, las sílabas del texto se alinean por -la izquierda con las notas, de forma predeterminada, pero se pueden -centrar sobre las notas de una melodía especificando una voz asociada, -si existe. Para ver más detalles, consulte @ref{Duración manual de -las sílabas}. - @end itemize @seealso @@ -365,30 +379,33 @@ notas de una melodía de tres formas: @itemize @item -especificando por su nombre el contexto Voice que contiene la melodía, -con @code{\lyricsto}, +especificando por su nombre el contexto Voice que contiene la +melodía, con @code{\lyricsto}, @item introduciendo la letra con @code{\addlyrics} y colocándola -inmediatamente después del contexto de voz que contiene la melodía, +inmediatamente después del contexto de voz que contiene la +melodía, @item -estableciendo un valor para la propiedad @code{associatedVoice}, la -alineación de la letra se puede mover a un contexto de voz distinto, -especificado por su nombre, en cualquier momento musical. +estableciendo un valor para la propiedad @code{associatedVoice}, +la alineación de la letra se puede mover a un contexto de voz +distinto, especificado por su nombre, en cualquier momento +musical. @end itemize -En los tres métodos se pueden trazar guiones de separación entre las -sílabas de una palabra y líneas extensoras después del final de una -palabra. Para ver más detalles, véase @ref{Líneas de extensión y -guiones}. +En los tres métodos se pueden trazar guiones de separación entre +las sílabas de una palabra y líneas extensoras después del final +de una palabra. Para ver más detalles, véase +@ref{Líneas de extensión y guiones}. El contexto @code{Voice} que contiene la melodía con que se está -alineando la letra, no debe haber @qq{muerto}, o se perderá la letra a -partir de este punto. Esto puede ocurrir si existen períodos en que -dicha voz no tiene nada que hacer. Para ver métodos para mantener -vivos los contextos, consulte @ref{Mantener vivos los contextos}. +alineando la letra, no debe haber @qq{muerto}, o se perderá la +letra a partir de este punto. Esto puede ocurrir si existen +períodos en que dicha voz no tiene nada que hacer. Para ver +métodos para mantener vivos los contextos, consulte +@ref{Mantener vivos los contextos}. @subheading Uso de @code{\lyricsto} @@ -396,13 +413,13 @@ vivos los contextos, consulte @ref{Mantener vivos los contextos}. @funindex \lyricsto Las sílabas de la letra se pueden alinear automáticamente bajo las -notas de una melodía especificando por su nombre el contexto de voz -que contiene la melodía, con @code{\lyricsto}: +notas de una melodía especificando por su nombre el contexto de +voz que contiene la melodía, con @code{\lyricsto}: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - \new Voice = "melody" { - a1 a4. a8 a2 + \new Voice = "melody" \relative { + a'1 a4. a8 a2 } \new Lyrics \lyricsto "melody" { These are the words @@ -416,10 +433,9 @@ nombrado, que debe existir previamente. Por tanto, normalmente se especifica primero el contexto @code{Voice} seguido del contexto @code{Lyrics}. La letra en sí sigue a la instrucción @code{\lyricsto}. La instrucción @code{\lyricsto} invoca -automáticamente el modo de letra, por lo que la palabra clave -@code{\lyricmode} se puede omitir. De forma predeterminada, la letra -se coloca por debajo de las notas. Para otras colocaciones, consulte -@ref{Posicionamiento vertical de la letra}. +automáticamente el modo de letra. De forma predeterminada, la +letra se coloca por debajo de las notas. Para otras colocaciones, +consulte @ref{Posicionamiento vertical de la letra}. @subheading Uso de @code{\addlyrics} @@ -449,17 +465,18 @@ He aquí un ejemplo: @lilypond[verbatim,quote] { \time 3/4 - \relative c' { c2 e4 g2. } + \relative { c'2 e4 g2. } \addlyrics { play the game } } @end lilypond -Se pueden añadir más versos poniendo más secciones @code{\addlyrics}: +Se pueden añadir más versos poniendo más secciones +@code{\addlyrics}: @lilypond[ragged-right,verbatim,quote] { \time 3/4 - \relative c' { c2 e4 g2. } + \relative { c'2 e4 g2. } \addlyrics { play the game } \addlyrics { speel het spel } \addlyrics { joue le jeu } @@ -473,8 +490,8 @@ casos debería usar @code{\lyricsto}. @subheading Uso de @code{associatedVoice} -Se puede cambiar la melodía a la que se alinea la letra mediante el -establecimiento de la propiedad @code{associatedVoice}, +Se puede cambiar la melodía a la que se alinea la letra mediante +el establecimiento de la propiedad @code{associatedVoice}, @example \set associatedVoice = #"lala" @@ -482,10 +499,10 @@ establecimiento de la propiedad @code{associatedVoice}, @noindent -El valor de la propiedad (aquí: @code{"lala"}) debe ser el nombre de -un contexto @code{Voice}. Por razones técnicas, la instrucción -@code{\set} se debe escribir una sílaba antes de aquella a la que se -quiere aplicar el cambio de voz. +El valor de la propiedad (aquí: @code{"lala"}) debe ser el nombre +de un contexto @code{Voice}. Por razones técnicas, la instrucción +@code{\set} se debe escribir una sílaba antes de aquella a la que +se quiere aplicar el cambio de voz. He aquí un ejemplo que muestra su uso: @@ -493,13 +510,13 @@ He aquí un ejemplo que muestra su uso: << \new Staff << \time 2/4 - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \voiceOne - c4 b8. a16 g4. r8 a4 ( b ) c2 + c''4 b8. a16 g4. r8 a4 ( b ) c2 } - \new Voice = "two" \relative c' { + \new Voice = "two" \relative { \voiceTwo - s2 s4. f8 e8 d4. c2 + s2 s4. f'8 e8 d4. c2 } >> % takes durations and alignment from notes in "one" initially @@ -518,33 +535,32 @@ Referencia de la notación: @ref{Mantener vivos los contextos}, @ref{Posicionamiento vertical de la letra}. + @node Duración manual de las sílabas @unnumberedsubsubsec Duración manual de las sílabas @translationof Manual syllable durations En ciertas músicas vocales complejas puede ser deseable colocar la letra de forma completamente independiente de las notas. En este -caso, no use @code{\lyricsto} ni @code{\addlyrics} y no establezca un -valor para @code{associatedVoice}. Las sílabas se escriben como notas --- pero sustituyendo los nombres de las notas por texto -- y la -duración de cada sílaba se escribe explícitamente después de la -sílaba. +caso, no use @code{\lyricsto} ni @code{\addlyrics} y no establezca +un valor para @code{associatedVoice}. Las sílabas se escriben +como notas -- pero sustituyendo los nombres de las notas por texto +-- y la duración de cada sílaba se escribe explícitamente después +de la sílaba. -De forma predeterminada, las sílabas se alinean por la izquierda con -el momento musical correspondiente. Se pueden trazar líneas -separadores entre las sílabas, como es usual, pero no se pueden trazar -líneas extensoras cuando no hay una voz asociada. +Se pueden trazar líneas separadores entre las sílabas, como es +usual, pero no se pueden trazar líneas extensoras cuando no hay +una voz asociada. He aquí dos ejemplos: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { - \time 3/4 - c2 e4 g2 f + \new Voice = "melody" \relative { + c''2 a f f e e } \new Lyrics \lyricmode { - play1 the4 game4 + c4. -- a -- f -- f -- e2. -- e } >> @end lilypond @@ -553,8 +569,8 @@ He aquí dos ejemplos: @lilypond[quote,verbatim,ragged-right] << \new Staff { - \relative c'' { - c2 c2 + \relative { + c''2 c2 d1 } } @@ -564,8 +580,8 @@ He aquí dos ejemplos: } } \new Staff { - \relative c' { - c8 c c c c c c c + \relative { + c'8 c c c c c c c c8 c c c c c c c } } @@ -575,28 +591,22 @@ He aquí dos ejemplos: Esta técnica es muy útil cuando se escriben diálogos encima de la música, véase @ref{Diálogos encima de la música}. -Para centrar las sílabas sobre las notas en sus momentos musicales -correspondientes, ajuste @code{associatedVoice} al nombre del contexto -de voz que contiene dichas notas. Cuando está establecido el valor de -@code{associatedVoice}, se pueden usar tanto dobles guiones como -dobles barras bajas para trazar correctamente guiones separadores y -líneas extensoras bajos los melismas. +Para cambiar la alineación de las sílabas, simplemente +sobreescriba la propiedad @code{self-alignment-X}: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - c2 e4 g f g + c'2 e4 g2 f } \new Lyrics \lyricmode { - \set associatedVoice = #"melody" - play2 the4 game2. __ + \override LyricText.self-alignment-X = #LEFT + play1 a4 game4 } >> @end lilypond -@c TODO see also feature request 707 - show how to do this with manual durations - @seealso Referencia de la notación: @ref{Mantener vivos los contextos}. @@ -615,16 +625,17 @@ Referencia de funcionamiento interno: @cindex espacios en la letra @cindex comillas en la letra -Para asignar más de una sílaba a una única nota con espacios entre las -sílabas, podemos encerrar la frase entre comillas o utilizar un -carácter de guión bajo @code{_}. De forma alternativa, podemos usar -el símbolo de tilde curva (@code{~}) para obtener una ligadura de -texto. +Para asignar más de una sílaba a una única nota con espacios entre +las sílabas, podemos encerrar la frase entre comillas o utilizar +un carácter de guión bajo @code{_}. De forma alternativa, podemos +usar el símbolo de tilde curva (@code{~}) para obtener una +ligadura de texto. -@lilypond[quote,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] { - { \autoBeamOff - r8 b c fis, fis c' b e, + \relative { + \autoBeamOff + r8 b' c fis, fis c' b e, } \addlyrics { @@ -651,24 +662,24 @@ Referencia de funcionamiento interno: @funindex \melisma @funindex \melismaEnd -A veces, y sobre todo en la música medieval y del Barroco, -varias notas se cantan -sobre una sílaba única; tales vocalizaciones reciben el nombre de -melismas, o melismata (véase @rglos{melisma}). -La sílaba de un melisma se suele alinear por -la izquierda con la primera nota del melisma. +A veces, y sobre todo en la música medieval y del Barroco, varias +notas se cantan sobre una sílaba única; tales vocalizaciones +reciben el nombre de melismas, o melismata (véase +@rglos{melisma}). La sílaba de un melisma se suele alinear por la +izquierda con la primera nota del melisma. -Cuando se produce un melisma sobre una sílaba distinta de la última de -una palabra, dicha sílaba se suele unir a la siguiente con un guión -separador. Esto se indica en el código de entrada escribiendo un -doble guión, @w{@code{--}}, inmediatamente después de la sílaba. +Cuando se produce un melisma sobre una sílaba distinta de la +última de una palabra, dicha sílaba se suele unir a la siguiente +con un guión separador. Esto se indica en el código de entrada +escribiendo un doble guión, @w{@code{--}}, inmediatamente después +de la sílaba. -De forma alternativa, cuando se produce un melisma sobre la última o -sobre la única sílaba de una palabra, se suele trazar una línea +De forma alternativa, cuando se produce un melisma sobre la última +o sobre la única sílaba de una palabra, se suele trazar una línea extensora desde el final de la sílaba hasta la última nota del -melisma. Esto se indica en el código de entrada escribiendo una doble -barra baja o carácter de subrayado, @code{__}, inmediatamente después -de la palabra. +melisma. Esto se indica en el código de entrada escribiendo una +doble barra baja o carácter de subrayado, @code{__}, +inmediatamente después de la palabra. Existen cinco formas de indicar los melismas: @@ -678,13 +689,13 @@ Existen cinco formas de indicar los melismas: Se crean melismas automáticamente sobre las notas unidas mediante ligadura de unión: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g2 ~ | - g4 e2 ~ | - e8 + f''4 g2 ~ | + 4 e2 ~ | + 8 } \new Lyrics \lyricsto "melody" { Ky -- ri -- e __ @@ -694,14 +705,14 @@ ligadura de unión: @item Se pueden crear melismas automáticamente a partir de la música -escribiendo ligaduras de expresión sobre las notas de cada melisma. -Ésta es la forma usual de escribir la letra: +escribiendo ligaduras de expresión sobre las notas de cada +melisma. Ésta es la forma usual de escribir la letra: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 ( f e f ) + f''4 g8 ( f e f ) e8 ( d e2 ) } \new Lyrics \lyricsto "melody" { @@ -710,20 +721,21 @@ escribiendo ligaduras de expresión sobre las notas de cada melisma. >> @end lilypond -Observe que las ligaduras de fraseo no afectan a la creación de melismas. +Observe que las ligaduras de fraseo no afectan a la creación de +melismas. @item Se considera que las notas forman un melisma cuando se unen manualmente mediante barra, siempre y cuando el barrado automático -esté desactivado. Véase @ref{Establecer el comportamiento de las -barras automáticas}. +esté desactivado. Véase +@ref{Establecer el comportamiento de las barras automáticas}. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \autoBeamOff - f4 g8[ f e f] + f''4 g8[ f e f] e2. } \new Lyrics \lyricsto "melody" { @@ -732,18 +744,19 @@ barras automáticas}. >> @end lilypond -Claramente, esto no es adecuado para los melismas formados por notas -de duración más larga que la corchea. +Claramente, esto no es adecuado para los melismas formados por +notas de duración más larga que la corchea. @item -Un grupo de notas sin ligadura de expresión se trata como un melisma -si están comprendidas entre @code{\melisma} y @code{\melismaEnd}. +Un grupo de notas sin ligadura de expresión se trata como un +melisma si están comprendidas entre @code{\melisma} y +@code{\melismaEnd}. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 + f''4 g8 \melisma f e f \melismaEnd @@ -756,15 +769,15 @@ si están comprendidas entre @code{\melisma} y @code{\melismaEnd}. @end lilypond @item -Se puede definir un melisma enteramente dentro de la letra escribiendo -un carácter de barra baja suelto, @code{_}, por cada nota adicional -que se quiere añadir al melisma. +Se puede definir un melisma enteramente dentro de la letra +escribiendo un carácter de barra baja suelto, @code{_}, por cada +nota adicional que se quiere añadir al melisma. -@lilypond[verbatim, quote, relative=2] +@lilypond[verbatim, quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 f e f + f''4 g8 f e f e8 d e2 } \new Lyrics \lyricsto "melody" { @@ -775,17 +788,17 @@ que se quiere añadir al melisma. @end itemize -Es posible tener ligaduras de unión o de expresión y barras manuales -en la melodía sin que indiquen melisma. Para hacerlo, ajuste el valor -de @code{melismaBusyProperties}: +Es posible tener ligaduras de unión o de expresión y barras +manuales en la melodía sin que indiquen melisma. Para hacerlo, +ajuste el valor de @code{melismaBusyProperties}: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \set melismaBusyProperties = #'() - c4 d ( e ) - g8 [ f ] f4 ~ f + c'4 d ( e ) + g8 [ f ] f4 ~ 4 } \new Lyrics \lyricsto "melody" { Ky -- ri -- e e -- le -- i -- son @@ -795,26 +808,26 @@ de @code{melismaBusyProperties}: Se pueden usar otros valores para @code{melismaBusyProperties} si queremos incluir o excluir selectivamente las ligaduras de unión, -ligaduras de expresión o barras de la detección automática -de los melismas; véase @code{melismaBusyProperties} -en el apartado @rinternals{Tunable context properties}. +ligaduras de expresión o barras de la detección automática de los +melismas; véase @code{melismaBusyProperties} en el apartado +@rinternals{Tunable context properties}. Como alternativa, si todas las indicaciones de melismas se van a ignorar, se puede establecer @code{ignoreMelismata} al valor verdadero; véase @ref{Versos con ritmos distintos}. Si se requiere un melisma en el transcurso de un pasaje en el que -@code{melismaBusyProperties} está activo, puede indicarse colocando -una sola barra baja en la letra por cada nota que se debe incluir -dentro del melisma: +@code{melismaBusyProperties} está activo, puede indicarse +colocando una sola barra baja en la letra por cada nota que se +debe incluir dentro del melisma: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \set melismaBusyProperties = #'() - c4 d ( e ) - g8 [ f ] ~ f4 ~ f + c'4 d ( e ) + g8 [ f ] ~ 4 ~ f } \new Lyrics \lyricsto "melody" { Ky -- ri -- _ e __ _ _ _ @@ -847,8 +860,8 @@ Referencia de funcionamiento interno: @rinternals{Tunable context properties}. @knownissues -No se crean automáticamente líneas extensoras bajo los melismas; se -deben insertar manualmente con un doble guión bajo. +No se crean automáticamente líneas extensoras bajo los melismas; +se deben insertar manualmente con un doble guión bajo. @node Líneas de extensión y guiones @@ -862,31 +875,32 @@ deben insertar manualmente con un doble guión bajo. @c TODO cf Multiple notes to one syllable; should this be merged in? @c leave this as samp. -gp -Los melismas se indican mediante una línea horizontal centrada entre -una sílaba y la siguiente. Esta línea recibe el nombre de línea de -extensión, y se escribe como @samp{ __ } (fíjese en los espacios antes -y después de los dos guiones bajos). +Los melismas se indican mediante una línea horizontal centrada +entre una sílaba y la siguiente. Esta línea recibe el nombre de +línea de extensión, y se escribe como @samp{ __ } (fíjese en los +espacios antes y después de los dos guiones bajos). @warning{Los melismas se indican en la partitura con líneas -extensoras, que se escriben con un doble guión bajo; pero también se -pueden introducir melismas cortos mediante saltos de notas -individuales, que se escriben como caracteres de guión bajo sueltos; -de forma predeterminada éstos no producen la impresión de una línea de -extensión.} +extensoras, que se escriben con un doble guión bajo; pero también +se pueden introducir melismas cortos mediante saltos de notas +individuales, que se escriben como caracteres de guión bajo +sueltos; de forma predeterminada éstos no producen la impresión de +una línea de extensión.} @cindex guiones @c leave this as samp. -gp -Los guiones centrados se escriben como @samp{ -- } entre sílabas de -una misma palabra (fíjese en los espacios antes y después de los dos -guiones). El guión quedará centrado entre las sílabas, y su longitud -se ajustará en función del espacio que exista entre ellas. +Los guiones centrados se escriben como @samp{ -- } entre sílabas +de una misma palabra (fíjese en los espacios antes y después de +los dos guiones). El guión quedará centrado entre las sílabas, y +su longitud se ajustará en función del espacio que exista entre +ellas. En la música grabada de modo muy apretado, se pueden quitar los guiones. Se puede controlar si esto ocurre o no, mediante las -propiedades @code{minimum-distance} (distancia mínima entre las dos -sílabas) y la @code{minimum-length} (umbral por debajo del cual se -suprimen los guiones) de @code{LyricHyphen}. +propiedades @code{minimum-distance} (distancia mínima entre las +dos sílabas) y la @code{minimum-length} (umbral por debajo del +cual se suprimen los guiones) de @code{LyricHyphen}. @seealso Referencia de funcionamiento interno: @@ -917,12 +931,12 @@ Referencia de funcionamiento interno: @cindex lyrics, using variables -Se pueden crear variables que contienen letra, pero la letra se debe -introducir en el modo de letra: +Se pueden crear variables que contienen letra, pero la letra se +debe introducir en el modo de letra: @lilypond[quote,verbatim] -musicOne = \relative c'' { - c4 b8. a16 g4. f8 e4 d c2 +musicOne = \relative { + c''4 b8. a16 g4. f8 e4 d c2 } verseOne = \lyricmode { Joy to the world, the Lord is come. @@ -945,14 +959,15 @@ invocar con @code{\addlyrics} o con @code{\lyricsto}. Para disposiciones distintas o más complejas, la mejor forma es definir en primer lugar las variables de la música y de la letra, -después preparar una jerarquía de pentagramas y letras, omitiendo la -letra en sí, y después poner la letra utilizando @code{\context} por -debajo. Esto asegura que las voces referenciadas por @code{\lyricsto} -siempre han sido definidas previamente. Por ejemplo: +después preparar una jerarquía de pentagramas y letras, omitiendo +la letra en sí, y después poner la letra utilizando +@code{\context} por debajo. Esto asegura que las voces +referenciadas por @code{\lyricsto} siempre han sido definidas +previamente. Por ejemplo: @lilypond[quote,verbatim] -sopranoMusic = \relative c'' { c4 c c c } -contraltoMusic = \relative c'' { a4 a a a } +sopranoMusic = \relative { c''4 c c c } +contraltoMusic = \relative { a'4 a a a } sopranoWords = \lyricmode { Sop -- ra -- no words } contraltoWords = \lyricmode { Con -- tral -- to words } @@ -1001,17 +1016,17 @@ Referencia de funcionamiento interno: @cindex letra, posicionamiento Dependiendo del tipo de música, la letra puede colocarse sobre el -pentagrama, debajo del pentagrama, o entre dos pentagramas. Lo más -fácil es situar la letra debajo de la pauta asociada, y se puede -conseguir simplemente definiendo el contexto Lyrics por debajo del -contexto Staff: +pentagrama, debajo del pentagrama, o entre dos pentagramas. Lo +más fácil es situar la letra debajo de la pauta asociada, y se +puede conseguir simplemente definiendo el contexto Lyrics por +debajo del contexto Staff: @lilypond[quote,verbatim] \score { << \new Staff { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics { @@ -1023,17 +1038,17 @@ contexto Staff: } @end lilypond -Se puede colocar la letra sobre el pentagrama usando uno de los dos -métodos disponibles: el más sencillo (y preferible) es usar la misma -sintaxis que se ha visto más arriba y especificar explícitamente la -posición de la letra: +Se puede colocar la letra sobre el pentagrama usando uno de los +dos métodos disponibles: el más sencillo (y preferible) es usar la +misma sintaxis que se ha visto más arriba y especificar +explícitamente la posición de la letra: @lilypond[quote,verbatim] \score { << \new Staff = "staff" { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics \with { alignAboveContext = "staff" } { @@ -1045,11 +1060,12 @@ posición de la letra: } @end lilypond -Como alternativa, se puede usar un proceso en dos pasos. En primer -lugar se declara el contexto Lyrics (sin ningún contenido) antes de -los contextos Staff y Voice, y después se escribe la instrucción -@code{\lyricsto} después de la declaración de Voice a que hace -referencia, usando @code{\context}, como se ve a continuación: +Como alternativa, se puede usar un proceso en dos pasos. En +primer lugar se declara el contexto Lyrics (sin ningún contenido) +antes de los contextos Staff y Voice, y después se escribe la +instrucción @code{\lyricsto} después de la declaración de Voice a +que hace referencia, usando @code{\context}, como se ve a +continuación: @lilypond[quote,verbatim] \score { @@ -1060,7 +1076,7 @@ referencia, usando @code{\context}, como se ve a continuación: } \new Staff { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \context Lyrics = "lyrics" { @@ -1072,16 +1088,16 @@ referencia, usando @code{\context}, como se ve a continuación: } @end lilypond -Cuando hay dos voces sobre pentagramas separados, la letra se puede -colocar entre ellos usando cualquiera de estos métodos. He aquí un -ejemplo del segundo método: +Cuando hay dos voces sobre pentagramas separados, la letra se +puede colocar entre ellos usando cualquiera de estos métodos. He +aquí un ejemplo del segundo método: @lilypond[quote,verbatim] \score { \new ChoirStaff << \new Staff { \new Voice = "sopranos" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics = "sopranos" @@ -1091,7 +1107,7 @@ ejemplo del segundo método: } \new Staff { \new Voice = "contraltos" { - \relative c'' { a4 a a a } + \relative { a'4 a a a } } } \context Lyrics = "sopranos" { @@ -1108,9 +1124,10 @@ ejemplo del segundo método: } @end lilypond -Es posible generar otras combinaciones de letra y pautas mediante la -elaboración de los ejemplos anteriores, o examinando las plantillas del -Manual de Aprendizaje, véase @rlearning{Plantillas de conjuntos vocales}. +Es posible generar otras combinaciones de letra y pautas mediante +la elaboración de los ejemplos anteriores, o examinando las +plantillas del Manual de Aprendizaje, véase +@rlearning{Plantillas de conjuntos vocales}. @snippets @lilypondfile[verbatim,quote,texidoc,doctitle] @@ -1124,6 +1141,7 @@ Referencia de la notación: @ref{Orden de disposición de los contextos}, @ref{Crear y referenciar contextos}. + @node Colocación horizontal de las sílabas @unnumberedsubsubsec Colocación horizontal de las sílabas @translationof Placing syllables horizontally @@ -1131,11 +1149,11 @@ Referencia de la notación: @cindex espaciado de la letra @cindex letra, aumentar la separación -Para aumentar la separación entre las líneas de texto, establezca la -propiedad @code{minimum-distance} de @code{LyricSpace}. +Para aumentar la separación entre las líneas de texto, establezca +la propiedad @code{minimum-distance} de @code{LyricSpace}. -@lilypond[relative=1,verbatim,quote,ragged-right] -{ +@lilypond[verbatim,quote,ragged-right] +\relative c' { c c c c \override Lyrics.LyricSpace.minimum-distance = #1.0 c c c c @@ -1147,13 +1165,13 @@ propiedad @code{minimum-distance} de @code{LyricSpace}. @end lilypond @noindent -Para efectuar este cambio en todas las letras de la partitura, ajuste -la propiedad dentro del bloque @code{\layout}. +Para efectuar este cambio en todas las letras de la partitura, +ajuste la propiedad dentro del bloque @code{\layout}. @lilypond[verbatim,quote,ragged-right] \score { - \relative c' { - c c c c + \relative { + c' c c c c c c c } \addlyrics { @@ -1175,9 +1193,9 @@ la propiedad dentro del bloque @code{\layout}. @c TODO: move to LSR -vv -La comprobación necesaria para asegurar que las inscripciones de texto -están dentro de los márgenes, requiere cálculos adicionales. Para -acelerar ligeramente el procesado, se puede desactivar esta +La comprobación necesaria para asegurar que las inscripciones de +texto están dentro de los márgenes, requiere cálculos adicionales. +Para acelerar ligeramente el procesado, se puede desactivar esta funcionalidad: @example @@ -1211,17 +1229,17 @@ alguna otra parte de este manual; véase @ref{Repeticiones}. Esta sección explica cómo añadir letra a secciones de música que se repiten. -La letra que va con una sección de música que se repite, debiera estar -encerrada en la misma construcción de repeticiones exacta que la -música, si el texto no cambia. +La letra que va con una sección de música que se repite, debiera +estar encerrada en la misma construcción de repeticiones exacta +que la música, si el texto no cambia. @lilypond[verbatim,quote] \score { << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1236,8 +1254,8 @@ música, si el texto no cambia. } @end lilypond -El texto se expandirá correctamente de esta manera si las repeticiones -se despliegan. +El texto se expandirá correctamente de esta manera si las +repeticiones se despliegan. @lilypond[verbatim,quote] \score { @@ -1245,8 +1263,8 @@ se despliegan. << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1270,8 +1288,8 @@ escriba simplemente todo el texto: << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat unfold 2 { b4 b b b } } } @@ -1287,18 +1305,18 @@ escriba simplemente todo el texto: } @end lilypond -Cuando el texto de las secciones de primera o segunda vez es distinto, -la letra de cada repetición se debe escribir dentro de contextos -@code{Lyrics} diferentes, -anidados correctamente en secciones paralelas: +Cuando el texto de las secciones de primera o segunda vez es +distinto, la letra de cada repetición se debe escribir dentro de +contextos @code{Lyrics} diferentes, anidados correctamente en +secciones paralelas: @lilypond[verbatim,quote] \score { << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1324,8 +1342,8 @@ Se pueden añadir más estrofas de una manera similar: << \new Staff { \new Voice = "singleVoice" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 3 { b4 b b b } c4 c c c } @@ -1353,9 +1371,10 @@ Se pueden añadir más estrofas de una manera similar: @cindex alignBelowContext @funindex alignBelowContext -Sin embargo, si esta construcción se inserta dentro de un contexto de -varios pentagramas tal como un @code{ChoirStaff}, la letra de los -versos segundo y tercero aparecerán debajo del pentagrama inferior. +Sin embargo, si esta construcción se inserta dentro de un contexto +de varios pentagramas tal como un @code{ChoirStaff}, la letra de +los versos segundo y tercero aparecerán debajo del pentagrama +inferior. Para posicionarlos correctamente utilice @code{alignBelowContext}: @@ -1364,8 +1383,8 @@ Para posicionarlos correctamente utilice @code{alignBelowContext}: << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 3 { b4 b b b } c4 c c c } @@ -1389,8 +1408,8 @@ Para posicionarlos correctamente utilice @code{alignBelowContext}: The end sec -- tion. } \new Voice = "harmony" { - \relative c' { - f4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 + \relative { + f'4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 } } >> @@ -1410,9 +1429,11 @@ Para posicionarlos correctamente utilice @code{alignBelowContext}: @cindex finales alternativos y letra @cindex primera y segunda vez y letra -Si el texto de la sección repetida es el mismo, se puede usar -exactamente la misma estructura tanto para la letra como para la -música. +Si el texto de la sección repetida es el mismo, y ninguno de los +bloques @code{\alternative} comienza con un silencio, se puede +usar exactamente la misma estructura tanto para la letra como para +la música. Esto tiene la ventaja de que @code{\unfoldRepeats} +expande correctamente tanto la música como la letra. @lilypond[quote,verbatim] \score { @@ -1420,8 +1441,8 @@ música. \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b } \alternative { { b b } { b c } } } @@ -1442,22 +1463,23 @@ música. @cindex saltar notas en la letra @cindex letra, saltar notas -Pero cuando la sección repetida tiene un texto distinto, no se puede -usar una construcción de repetición para el texto y es necesario -insertar manualmente instrucciones @code{\skip} -para saltar sobre las notas en las secciones -alternativas que no correspondan. +Pero cuando la sección repetida tiene un texto distinto, o cuando +uno de los bloques @code{\alternative} comienza con un silencio, +no se puede usar una construcción de repetición para el texto y es +necesario insertar manualmente instrucciones @code{\skip} para +saltar sobre las notas en las secciones alternativas que no +correspondan. -Nota: no utilice un guión bajo, @code{_}, para saltar notas: el guión -bajo indica un melisma, y hace que la sílaba anterior resulte alineada -por la izquierda. +Nota: no utilice un guión bajo, @code{_}, para saltar notas: el +guión bajo indica un melisma, y hace que la sílaba anterior +resulte alineada por la izquierda. @warning{La instrucción @code{@bs{}skip} debe ir seguida por un -número, pero este número se ignora dentro de la letra, que deriva las -duraciones de las notas de una melodía asociada a través de -@code{\addlyrics} o @code{\lyricsto}. Cada @code{@bs{}skip} salta una -sola nota de cualquier valor, independientemente del valor del número -que se escribe a continuación.} +número, pero este número se ignora dentro de la letra, que deriva +las duraciones de las notas de una melodía asociada a través de +@code{\addlyrics} o @code{\lyricsto}. Cada @code{@bs{}skip} salta +una sola nota de cualquier valor, independientemente del valor del +número que se escribe a continuación.} @lilypond[verbatim,quote,ragged-right] \score { @@ -1465,8 +1487,8 @@ que se escribe a continuación.} \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b } + \relative { + \repeat volta 2 { b'4 b } \alternative { { b b } { b c } } c4 c } @@ -1494,20 +1516,21 @@ que se escribe a continuación.} @funindex \repeatTie Cuando una nota está ligada sobre dos o más finales alternativos -(sobre la primera nota de una casilla de primera y segunda vez), se -usa una ligadura de unión para arrastrar la nota dentro del primer -final alternativo y se usa una instrucción @code{\repeatTie} de -ligadura de repetición en las casillas de repetición siguientes. Esta -estructura produce problemas de alineación difíciles cuando hay letra -de por medio; aumentar la longitud de las secciones alternativas de -forma que las notas ligadas se vean contenidas completamente dentro de -ellas, puede ofrecer un resultado más aceptable. - -La ligadura de unión crea un melisma dentro de la casilla de primera -vez pero no en la segunda vez y siguientes; por tanto, para alinear la -letra correctamente es necesario inhabilitar la creación automática de -melismas sobre la sección de finales alternativos e insertar saltos -manuales. +(sobre la primera nota de una casilla de primera y segunda vez), +se usa una ligadura de unión para arrastrar la nota dentro del +primer final alternativo y se usa una instrucción +@code{\repeatTie} de ligadura de repetición en las casillas de +repetición siguientes. Esta estructura produce problemas de +alineación difíciles cuando hay letra de por medio; aumentar la +longitud de las secciones alternativas de forma que las notas +ligadas se vean contenidas completamente dentro de ellas, puede +ofrecer un resultado más aceptable. + +La ligadura de unión crea un melisma dentro de la casilla de +primera vez pero no en la segunda vez y siguientes; por tanto, +para alinear la letra correctamente es necesario inhabilitar la +creación automática de melismas sobre la sección de finales +alternativos e insertar saltos manuales. @lilypond[quote,verbatim] \score { @@ -1515,9 +1538,9 @@ manuales. \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { + \relative { \set melismaBusyProperties = #'() - \repeat volta 2 { b4 b ~} + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } \unset melismaBusyProperties c4 c @@ -1540,12 +1563,12 @@ manuales. Observe que si se usa @code{\unfoldRepeats} sobre una sección que contiene alguna @code{\repeatTie}, la @code{\repeatTie} se debe -eliminar para evitar que se impriman al mismo tiempo los dos tipos de -ligadura. +eliminar para evitar que se impriman al mismo tiempo los dos tipos +de ligadura. -Cuando la sección repetida tiene textos distintos, no se puede usar -@code{\repeat} para la letra y se deben insertar instrucciones -@code{\skip} manualmente, como se vio antes. +Cuando la sección repetida tiene textos distintos, no se puede +usar @code{\repeat} para la letra y se deben insertar +instrucciones @code{\skip} manualmente, como se vio antes. @lilypond[quote,verbatim] \score { @@ -1553,8 +1576,8 @@ Cuando la sección repetida tiene textos distintos, no se puede usar \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b ~} + \relative { + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } c4 c } @@ -1577,9 +1600,9 @@ Cuando la sección repetida tiene textos distintos, no se puede usar } @end lilypond -Si queremos imprimir líneas extensoras y guiones que entran o salen de -las casillas de primera y segunda vez, hemos de insertarlos -manualmente. +Si queremos imprimir líneas extensoras y guiones que entran o +salen de las casillas de primera y segunda vez, hemos de +insertarlos manualmente. @lilypond[quote,verbatim] \score { @@ -1587,8 +1610,8 @@ manualmente. \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b ~} + \relative { + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } c4 c } @@ -1627,7 +1650,8 @@ Referencia de la notación: Cuando solamente difieren las palabras y las duraciones de las dos partes mientras que la altura de las notas es la misma, el método adecuado puede ser la desactivación temporal de la detección -automática de los melismas e indicar el melisma dentro de la letra: +automática de los melismas e indicar el melisma dentro de la +letra: @lilypond[quote,verbatim] \score { @@ -1654,17 +1678,18 @@ automática de los melismas e indicar el melisma dentro de la letra: Cuando difieren tanto la música como las palabras, puede ser mejor imprimir la música y la letra que difieren mediante el nombrado de -contextos de voz y adjuntando la letra a estos contextos específicos: +contextos de voz y adjuntando la letra a estos contextos +específicos: @lilypond[verbatim,ragged-right,quote] \score { << \new Voice = "melody" { - \relative c' { + \relative { << { \voiceOne - e4 e8 e + e'4 e8 e } \new Voice = "splitpart" { \voiceTwo @@ -1749,14 +1774,6 @@ words = \lyricmode { la __ la __ } >> @end lilypond -El contexto de voz nula @code{NullVoice} debe estar situado dentro -de un contexto @code{Staff} y contener notas que ya se están -mostrando en dicho pentagrama, y en la misma octava. En caso -contrario, la @code{NullVoice} podría interactuar con las voces -impresas de forma inesperada. Por ejemplo, notas arbitrarias en -la @code{NullVoice} pueden hacer que aparezcan (o desaparezcan) -alteraciones accidentales en el pentragrama. - Este método se puede usar trambién con la función @code{\partcombine}, que en sí no permite incluir letra: @@ -1778,8 +1795,8 @@ La función @code{\addLyrics} solo funciona con letras de @code{Voice}, por lo que no puede utilizarse con @code{NullVoice}. @noindent -La función @code{\partcombine} se describe en @ref{Combinación -automática de las partes}. +La función @code{\partcombine} se describe en +@ref{Combinación automática de las partes}. Por último, este método se puede usar incluso si las voces están en distintos pentagramas, y no se limita a dos voces únicamente: @@ -1791,25 +1808,14 @@ altoTwo = \relative { d'2 g4( fis8 g) } aligner = \relative { b'8( c d c) d( d d d) } words = \lyricmode { la __ la __ } -\new ChoirStaff << - \new Staff << - \soprano - \new NullVoice = "aligner" \aligner - >> +\new ChoirStaff \with {\accepts NullVoice } << + \new Staff \soprano + \new NullVoice = "aligner" \aligner \new Lyrics \lyricsto "aligner" \words \new Staff \partcombine \altoOne \altoTwo >> @end lilypond -Observe, sin embargo, que en la segunda mitad del compás que se ve -arriba, las notas del contexto @code{NullVoice} reflejan las -duraciones de las notas del pentagrama inferior, pero no se -desvian de la altura única que se muestra en el pentagrama al que -pertenece la @code{NullVoice}. Aunque no es obligatorio en este -ejemplo en particular, generalmente es buena idea introducir las -notas de esta forma. - - @node Versos @subsection Versos @translationof Stanzas @@ -1833,9 +1839,9 @@ notas de esta forma. Los números de los versos se pueden añadir estableciendo @code{stanza}, p.ej., -@lilypond[quote,ragged-right,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. +@lilypond[quote,ragged-right,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. } \addlyrics { \set stanza = #"1. " Hi, my name is Bert. @@ -1847,7 +1853,8 @@ Los números de los versos se pueden añadir estableciendo @noindent -Estos números aparecerán inmediatamente antes de la primera sílaba. +Estos números aparecerán inmediatamente antes de la primera +sílaba. @c TODO Create and add snippet to show how two lines of a @c stanza can be grouped together, along these lines: @@ -1886,11 +1893,11 @@ stanzaOneThree = { @translationof Adding dynamics marks to stanzas Los versos que difieren en su sonoridad se pueden especificar -escribiendo una indicación dinámica antes de cada verso. En LilyPond, -todo lo que aparece delante de un verso está dentro del objeto -@code{StanzaNumber}; las indicaciones dinámicas no son diferentes. -Por razones técnicas, tendrá que establecer el valor de la sección -stanza (verso) fuera de @code{\lyricmode}: +escribiendo una indicación dinámica antes de cada verso. En +LilyPond, todo lo que aparece delante de un verso está dentro del +objeto @code{StanzaNumber}; las indicaciones dinámicas no son +diferentes. Por razones técnicas, tendrá que establecer el valor +de la sección stanza (verso) fuera de @code{\lyricmode}: @lilypond[quote,ragged-right,verbatim] text = { @@ -1916,14 +1923,14 @@ text = { @cindex cantante, nombre del @cindex nombre del cantante -También se pueden poner los nombres de los cantantes. Se imprimen al -comienzo de la línea, igual que los nombres de instrumento. Se crean -estableciendo un valor para @code{vocalName}. Se puede definir una -versión abreviada como @code{shortVocalName}. +También se pueden poner los nombres de los cantantes. Se imprimen +al comienzo de la línea, igual que los nombres de instrumento. Se +crean estableciendo un valor para @code{vocalName}. Se puede +definir una versión abreviada como @code{shortVocalName}. -@lilypond[ragged-right,quote,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. +@lilypond[ragged-right,quote,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. } \addlyrics { \set vocalName = #"Bert " Hi, my name is Bert. @@ -1938,22 +1945,22 @@ versión abreviada como @code{shortVocalName}. @unnumberedsubsubsec Versos con ritmos distintos @translationof Stanzas with different rhythms -Con frecuencia, los distintos versos de una canción encajan de formas -ligeramente diferentes con la misma melodía. Estas variaciones se -pueden capturar con el uso de @code{\lyricsto}. +Con frecuencia, los distintos versos de una canción encajan de +formas ligeramente diferentes con la misma melodía. Estas +variaciones se pueden capturar con el uso de @code{\lyricsto}. @subsubheading Ignorar los melismas -Existe la posibilidad de que el texto tenga un melisma en un verso, -pero varias sílabas en otro. Una solución es hacer que la voz más -rápida ignore el melisma. Esto se consigue estableciendo +Existe la posibilidad de que el texto tenga un melisma en un +verso, pero varias sílabas en otro. Una solución es hacer que la +voz más rápida ignore el melisma. Esto se consigue estableciendo @code{ignoreMelismata} en el contexto Lyrics. @lilypond[verbatim,ragged-right,quote] << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 \slurDotted f8.[( g16]) a4 @@ -1972,10 +1979,10 @@ rápida ignore el melisma. Esto se consigue estableciendo @end lilypond @knownissues -A diferencia de casi todas las instrucciones @code{\set}, @code{\set -ignoreMelismata} no funciona si va precedido de @code{\once}. Es -necesario utilizar @code{\set} y @code{\unset} para delimitar la letra -en que se quieren ignorar los melismas. +A diferencia de casi todas las instrucciones @code{\set}, +@code{\set ignoreMelismata} no funciona si va precedido de +@code{\once}. Es necesario utilizar @code{\set} y @code{\unset} +para delimitar la letra en que se quieren ignorar los melismas. @subsubheading Aplicar sílabas a notas de adorno @@ -1984,13 +1991,14 @@ en que se quieren ignorar los melismas. De forma predeterminada, las notas de adorno (p.ej. insertadas por -medio de @code{\grace}) no pueden recibirla asignación de sílabas si -se utiliza @code{\lyricsto}, pero este comportamiento puede cambiarse: +medio de @code{\grace}) no pueden recibirla asignación de sílabas +si se utiliza @code{\lyricsto}, pero este comportamiento puede +cambiarse: @lilypond[verbatim,ragged-right,quote] << - \new Voice = melody \relative c' { - f4 \appoggiatura a32 b4 + \new Voice = melody \relative { + f'4 \appoggiatura a32 b4 \grace { f16 a16 } b2 \afterGrace b2 { f16[ a16] } \appoggiatura a32 b4 @@ -2011,11 +2019,11 @@ se utiliza @code{\lyricsto}, pero este comportamiento puede cambiarse: @end lilypond @knownissues -Como ocurre con @code{associatedVoice}, @code{includeGraceNotes} se -tiene que establecer al menos una sílaba antes de la que se va a -colocar bajo una nota de adorno. Para el caso de una nota de adorno -al comienzo mismo de una pieza, considere la posibilidad de usar un -bloque @code{\with} o @code{\context}: +Como ocurre con @code{associatedVoice}, @code{includeGraceNotes} +se tiene que establecer al menos una sílaba antes de la que se va +a colocar bajo una nota de adorno. Para el caso de una nota de +adorno al comienzo mismo de una pieza, considere la posibilidad de +usar un bloque @code{\with} o @code{\context}: @lilypond[verbatim,ragged-right,quote] << @@ -2035,16 +2043,16 @@ bloque @code{\with} o @code{\context}: @cindex associatedVoice @cindex melodía alternativa, cambio a una -Son posibles variaciones más complejas en la coordinación de la letra -y la música. La melodía a la que se está alineando la letra puede -cambiarse desde dentro de la letra mediante el establecimiento de la -propiedad @code{associatedVoice}: +Son posibles variaciones más complejas en la coordinación de la +letra y la música. La melodía a la que se está alineando la letra +puede cambiarse desde dentro de la letra mediante el +establecimiento de la propiedad @code{associatedVoice}: @lilypond[verbatim,quote] << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 << \new Voice = "alternative" { \voiceOne @@ -2077,10 +2085,11 @@ propiedad @code{associatedVoice}: @end lilypond @noindent -El texto del primer verso se fija a la melodía llamada @q{lahlah} de -la forma usual, pero el segundo verso se fija inicialmente al contexto -@code{lahlah} y después se cambia a la melodía @code{alternative} para -las sílabas desde @q{ran} hasta @q{sau} mediante las líneas: +El texto del primer verso se fija a la melodía llamada @q{lahlah} +de la forma usual, pero el segundo verso se fija inicialmente al +contexto @code{lahlah} y después se cambia a la melodía +@code{alternative} para las sílabas desde @q{ran} hasta @q{sau} +mediante las líneas: @example \set associatedVoice = "alternative" % se aplica a "ran" @@ -2092,34 +2101,34 @@ sau -- rus Rex @end example @noindent -Aquí, @code{alternative} es el nombre del contexto de @code{Voice} que -contiene el tresillo. +Aquí, @code{alternative} es el nombre del contexto de @code{Voice} +que contiene el tresillo. Observe la posición de la instrucción @code{\set associatedVoice}: parece estar situada una sílaba antes de lo normal, pero está bien así. -@warning{La instrucción @code{\set associatedVoice} se debe escribir -una sílaba @emph{antes} de aquella en la que queremos que se produzca -el cambio a la voz nueva. Dicho de otra forma, el cambio de la voz -asociada se produce una sílaba más tarde de lo esperado. Esto es por -razones técnicas, y no es un fallo.} +@warning{La instrucción @code{\set associatedVoice} se debe +escribir una sílaba @emph{antes} de aquella en la que queremos que +se produzca el cambio a la voz nueva. Dicho de otra forma, el +cambio de la voz asociada se produce una sílaba más tarde de lo +esperado. Esto es por razones técnicas, y no es un fallo.} @node Imprimir los versos al final @unnumberedsubsubsec Imprimir los versos al final @translationof Printing stanzas at the end -En ocasiones es conveniente tener un verso ajustado a la música, y el -resto añadido en forma de estrofa al final de la pieza. Esto se puede -conseguir escribiendo los versos adicionales dentro de una sección -@code{\markup} fuera del bloque Score principal de la partitura. -Tenga en cuenta que existen dos formas distintas de forzar los saltos -de línea al utilizar @code{\markup}. +En ocasiones es conveniente tener un verso ajustado a la música, y +el resto añadido en forma de estrofa al final de la pieza. Esto +se puede conseguir escribiendo los versos adicionales dentro de +una sección @code{\markup} fuera del bloque Score principal de la +partitura. Tenga en cuenta que existen dos formas distintas de +forzar los saltos de línea al utilizar @code{\markup}. @lilypond[ragged-right,verbatim,quote] -melody = \relative c' { -e d c d | e e e e | +melody = \relative { +e' d c d | e e e e | d d e d | c1 | } @@ -2155,14 +2164,14 @@ its fleece was white as snow. @unnumberedsubsubsec Imprimir los versos al final en varias columnas @translationof Printing stanzas at the end in multiple columns -Cuando una pieza tiene muchos versos, a menudo se imprimen en varias -columnas a lo largo de toda la página. Con frecuencia un número de -verso fuera del margen precede a cada verso. El ejemplo siguiente -muestra cómo producir dicha salida en LilyPond. +Cuando una pieza tiene muchos versos, a menudo se imprimen en +varias columnas a lo largo de toda la página. Con frecuencia un +número de verso fuera del margen precede a cada verso. El ejemplo +siguiente muestra cómo producir dicha salida en LilyPond. @lilypond[ragged-right,quote,verbatim] -melody = \relative c' { - c4 c c c | d d d d +melody = \relative { + c'4 c c c | d d d d } text = \lyricmode { @@ -2239,35 +2248,37 @@ Referencia de funcionamiento interno: @unnumberedsubsubsec Referencias para canciones @translationof References for songs -Por lo general, las canciones se escriben sobre tres pentagramas con -la melodía del cantante en el pentagrama superior y dos pentagramas de -acompañamiento de piano en la parte inferior. La letra del primer -verso se imprime inmediatamente debajo del pentagrama superior. Si -existe solamente una pequeña cantidad de versos adicionales, pueden -imprimirse inmediatamente debajo del primero, pero si hay más versos -de los que caben cómodamente allí, el segundo verso y siguientes se -imprimen después de la música, como texto independiente. +Por lo general, las canciones se escriben sobre tres pentagramas +con la melodía del cantante en el pentagrama superior y dos +pentagramas de acompañamiento de piano en la parte inferior. La +letra del primer verso se imprime inmediatamente debajo del +pentagrama superior. Si existe solamente una pequeña cantidad de +versos adicionales, pueden imprimirse inmediatamente debajo del +primero, pero si hay más versos de los que caben cómodamente allí, +el segundo verso y siguientes se imprimen después de la música, +como texto independiente. -Todos los elementos notacionales necesarios para escribir canciones se -describen completamente en otras secciones de la documentación: +Todos los elementos notacionales necesarios para escribir +canciones se describen completamente en otras secciones de la +documentación: @itemize @item -Para montar la disposición de las pautas, véase @ref{Impresión de los -pentagramas}. +Para montar la disposición de las pautas, véase +@ref{Impresión de los pentagramas}. @item -Para escribir música para piano, véase @ref{Teclados y otros -instrumentos de varios pentagramas}. +Para escribir música para piano, véase +@ref{Teclados y otros instrumentos de varios pentagramas}. @item -Para imprimir la letra de una línea melódica, véase @ref{Notación -común para música vocal}. +Para imprimir la letra de una línea melódica, véase +@ref{Notación común para música vocal}. @item -Para colocar la letra, véase @ref{Posicionamiento vertical de la -letra}. +Para colocar la letra, véase +@ref{Posicionamiento vertical de la letra}. @item Para escribir versos véase @ref{Versos}. @@ -2279,10 +2290,10 @@ mayúsculas) sobre las pautas. Esto se describe en @ref{Imprimir los acordes}. @item -Para imprimir diagramas de posiciones de los acordes para -el acompañamiento de guitarra o para otros instrumentos con trastes en -el mástil, consulte @qq{Marcados de diagramas de posiciones de acorde} -dentro de @ref{Notación común para cuerdas con trastes}. +Para imprimir diagramas de posiciones de los acordes para el +acompañamiento de guitarra o para otros instrumentos con trastes +en el mástil, consulte @qq{Marcados de diagramas de posiciones de +acorde} dentro de @ref{Notación común para cuerdas con trastes}. @end itemize @@ -2305,8 +2316,8 @@ Fragmentos de código: @unnumberedsubsubsec Hojas guía de acordes @translationof Lead sheets -Se pueden imprimir hojas guía de acordes combinando partes vocales y -el @q{modo de acordes}; esta sintaxis se explica en +Se pueden imprimir hojas guía de acordes combinando partes vocales +y el @q{modo de acordes}; esta sintaxis se explica en @ref{Notación de acordes}. @snippets @@ -2341,32 +2352,37 @@ canciones por partes, los oratorios, etc. @unnumberedsubsubsec Referencias para música coral @translationof References for choral -La notación de música coral se realiza normalmente sobre dos, tres o -cuatro pentagramas dentro de un grupo de pautas @code{ChoirStaff}. Si -se necesita un acompañamiento, se sitúa debajo dentro de un grupo -@code{PianoStaff}, que se suele reducir de tamaño, para ensayar las obras corales -@emph{a cappella}. Las notas de cada parte vocal se sitúan dentro de -un contexto @code{Voice}, y cara pentagrama recibe o una sola parte -vocal (es decir, una @code{Voice}) o un par de partes vocales (es -decir, dos @code{Voice}s). +La notación de música coral se realiza normalmente sobre dos, tres +o cuatro pentagramas dentro de un grupo de pautas +@code{ChoirStaff}. Si se necesita un acompañamiento, se sitúa +debajo dentro de un grupo @code{PianoStaff}, que se suele reducir +de tamaño, para ensayar las obras corales @emph{a cappella}. Las +notas de cada parte vocal se sitúan dentro de un contexto +@code{Voice}, y cara pentagrama recibe o una sola parte vocal (es +decir, una @code{Voice}) o un par de partes vocales (es decir, dos +@code{Voice}s). -Los textos se disponen en contextos @code{Lyrics}, bien debajo de cada -pauta de música correspondiente, o bien una encima y una debajo de la -pauta de música, si ésta contiene la música de las dos partes. +Los textos se disponen en contextos @code{Lyrics}, bien debajo de +cada pauta de música correspondiente, o bien una encima y una +debajo de la pauta de música, si ésta contiene la música de las +dos partes. -En otras partes del manual se describen completamente algunos otros -temas sobre música coral: +En otras partes del manual se describen completamente algunos +otros temas sobre música coral: @itemize @item -Hay una introducción a la creación de partituras vocales SATB en el -Manual de aprendizaje, véase @rlearning{Partitura vocal a cuatro voces -SATB}. +Hay una introducción a la creación de partituras vocales SATB en +el Manual de aprendizaje, véase +@rlearning{Partitura vocal a cuatro voces SATB}. También existe +una plantilla incorporada que simplifica la introducción de música +vocal SATB, véase see @rlearning{Plantillas incorporadas}. + @item -También en el Manual de aprendizaje hay varias plantillas adecuadas -para diversos estilos de música coral, véase +También en el Manual de aprendizaje hay varias plantillas +adecuadas para diversos estilos de música coral, véase @rlearning{Plantillas de conjuntos vocales}. @item @@ -2374,15 +2390,16 @@ Para ver más información acerca de @code{ChoirStaff} y @code{PianoStaff}, consulte @ref{Agrupar pentagramas}. @item -Las figuras con cabezas de formas, como las que se usan en la notación -del estilo Arpa Sacra y otros similares, se describen en @ref{Cabezas -de notas con formas diversas}. +Las figuras con cabezas de formas, como las que se usan en la +notación del estilo Arpa Sacra y otros similares, se describen en +@ref{Cabezas de notas con formas diversas}. @item Cuando dos partes vocales comparten un pentagrama, las plicas, -ligaduras, etc. de la parte aguda se orientan hacia arriba, y los de -la parte grave hacia abajo. Para hacerlo, utilice @code{\voiceOne} y -@code{\voiceTwo}. Véase @ref{Polifonía en un solo pentagrama}. +ligaduras, etc. de la parte aguda se orientan hacia arriba, y los +de la parte grave hacia abajo. Para hacerlo, utilice +@code{\voiceOne} y @code{\voiceTwo}. Véase +@ref{Polifonía en un solo pentagrama}. @item Cuando una parte vocal se divide temporalmente, debemos usar @@ -2422,8 +2439,8 @@ Referencia de funcionamiento interno: La música coral que contiene cuatro pentagramas, con o sin acompañamiento de piano, se suele disponer con dos sistemas por página. Dependiendo del tamaño de la página, conseguirlo puede -requerir cambios en ciertos ajustes predeterminados. Se deben tener -en cuenta los siguientes ajustes: +requerir cambios en ciertos ajustes predeterminados. Se deben +tener en cuenta los siguientes ajustes: @itemize @@ -2434,20 +2451,20 @@ tamaño general de los elementos de la partitura. Véase @item Las diferentes distancias entre sistemas, pentagramas y líneas de -texto se pueden ajustar de manera independiente. Véase @ref{Espaciado -vertical}. +texto se pueden ajustar de manera independiente. Véase +@ref{Espaciado vertical}. @item Se pueden imprimir las dimensiones de las variables de disposición -verticales como ayuda para el ajuste del espaciado vertical. Esta y -otras posibilidades para hacer encajar la música en un número de -páginas menor, se describen en @ref{Encajar la música en menos -páginas}. +verticales como ayuda para el ajuste del espaciado vertical. Esta +y otras posibilidades para hacer encajar la música en un número de +páginas menor, se describen en +@ref{Encajar la música en menos páginas}. @item -Si el número de sistemas por página cambia de uno a dos, es costumbre -indicarlo mediante una marca separadora de sistemas entre los dos -sistemas. Véase @ref{Separación de sistemas}. +Si el número de sistemas por página cambia de uno a dos, es +costumbre indicarlo mediante una marca separadora de sistemas +entre los dos sistemas. Véase @ref{Separación de sistemas}. @item Para ver más detalles sobre otras propiedades de formateo de las @@ -2458,25 +2475,26 @@ páginas, consulte @ref{Disposición de la página}. Las indicaciones dinámicas se colocan por omisión debajo del pentagrama, pero en la música coral se suelen situar encima del -pentagrama para evitar las colisiones con el texto. La instrucción -predefinida @code{\dynamicUp} hace esta tarea para las indicaciones -dinámicas en un único contexto @code{Voice}. Si hay muchos contextos -de voz, esta instrucción predefinida tendría que colocarse en cada uno -de ellos. Como alternativa, se puede usar su forma expandida para -poner las indicaciones dinámicas de toda la partitura encima de sus -pautas respectivas, como se muestra aquí: +pentagrama para evitar las colisiones con el texto. La +instrucción predefinida @code{\dynamicUp} hace esta tarea para las +indicaciones dinámicas en un único contexto @code{Voice}. Si hay +muchos contextos de voz, esta instrucción predefinida tendría que +colocarse en cada uno de ellos. Como alternativa, se puede usar +su forma expandida para poner las indicaciones dinámicas de toda +la partitura encima de sus pautas respectivas, como se muestra +aquí: @lilypond[verbatim,quote] \score { \new ChoirStaff << \new Staff { \new Voice { - \relative c'' { g4\f g g g } + \relative { g'4\f g g g } } } \new Staff { \new Voice { - \relative c' { d4 d d\p d } + \relative { d'4 d d\p d } } } >> @@ -2502,7 +2520,7 @@ Referencia de la notación: @ref{Disposición de la partitura}, @ref{Separación de sistemas}, @ref{Establecer el tamaño del pentagrama}, -@ref{Utilizar una voz adicional para los saltos de línea}, +@ref{Saltos}, @ref{Espaciado vertical}. Referencia de funcionamiento interno: @@ -2543,31 +2561,33 @@ pasajes hablados. instrumentos individuales de la orquesta o banda. @item -Una @emph{Partitura vocal} que contiene todas las partes vocales con -acompañamiento de piano. El acompañamiento es normalmente una -reducción de orquesta, y en este caso es frecuente indicar el nombre -del instrumento original de la orquesta. Las partituras vocales a -veces incluyen indicaciones de escena y notas guía del libreto. +Una @emph{Partitura vocal} que contiene todas las partes vocales +con acompañamiento de piano. El acompañamiento es normalmente una +reducción de orquesta, y en este caso es frecuente indicar el +nombre del instrumento original de la orquesta. Las partituras +vocales a veces incluyen indicaciones de escena y notas guía del +libreto. @item Un @emph{Libro vocal} que contiene sólo las partes vocales (sin acompañamiento), a veces en combinación con el libreto. @item -Un @emph{Libreto} que contiene los diálogos completos que normalmente -hay en los musicales, junto a la letra de las partes cantadas. Suelen -incluirse también las indicaciones de escena. Se puede utilizar -LilyPond para tipografiar libretos, pero dado que no contienen música, -puede ser preferible algún método alternativo. +Un @emph{Libreto} que contiene los diálogos completos que +normalmente hay en los musicales, junto a la letra de las partes +cantadas. Suelen incluirse también las indicaciones de escena. +Se puede utilizar LilyPond para tipografiar libretos, pero dado +que no contienen música, puede ser preferible algún método +alternativo. @end itemize En la sección de referencias que aparece a continuación están relacionadas las secciones de la documentación de LilyPond que se -ocupan de los temas necesarios para crear partituras en los estilos -habituales de la ópera y los musicales. Después aparecen secciones -que cubren las técnicas peculiares de la tipografía musical de las -partituras de ópera y de musicales. +ocupan de los temas necesarios para crear partituras en los +estilos habituales de la ópera y los musicales. Después aparecen +secciones que cubren las técnicas peculiares de la tipografía +musical de las partituras de ópera y de musicales. @menu * Referencias para ópera y musicales:: @@ -2589,21 +2609,22 @@ agrupar pentagramas. Para anidar unos grupos dentro de otros, consulte @ref{Grupos de pentagramas anidados}. @item -La impresión de pentagramas vacíos en las partituras del director y -vocales se suele inhibir. Para crear estas partituras, conocidas como -@qq{Partituras francesas} consulte @ref{Ocultar pentagramas}. +La impresión de pentagramas vacíos en las partituras del director +y vocales se suele inhibir. Para crear estas partituras, +conocidas como @qq{Partituras francesas} consulte +@ref{Ocultar pentagramas}. @item -La escritura de partituras orquestales se estudia en @ref{Escritura de -las particellas}. Pueden ser de relevancia otras secciones del -capítulo de Notación especializada, dependiendo de la orquestación -utilizada. Muchos instrumentos son transpositores, consulte -@ref{Transposición de los instrumentos}. +La escritura de partituras orquestales se estudia en +@ref{Escritura de las particellas}. Pueden ser de relevancia +otras secciones del capítulo de Notación especializada, +dependiendo de la orquestación utilizada. Muchos instrumentos son +transpositores, consulte @ref{Transposición de los instrumentos}. @item Si el número de sistemas por página varía de una a otra página, es -costumbre separar los sistemas con una marca separadora de sistemas. Véase -See @ref{Separación de sistemas}. +costumbre separar los sistemas con una marca separadora de +sistemas. Véase See @ref{Separación de sistemas}. @item Para ver detalles acerca de otras propiedades de formateo de las @@ -2656,9 +2677,9 @@ pentagrama cuando éste está dedicado a dicho personaje solamente: \new Staff { \set Staff.vocalName = \markup \smallCaps Kaspar \set Staff.shortVocalName = \markup \smallCaps Kas. - \relative c' { + \relative { \clef "G_8" - c4 c c c + c'4 c c c \break c4 c c c } @@ -2667,7 +2688,7 @@ pentagrama cuando éste está dedicado a dicho personaje solamente: \set Staff.vocalName = \markup \smallCaps Melchior \set Staff.shortVocalName = \markup \smallCaps Mel \clef "bass" - \relative c' { + \relative { a4 a a a a4 a a a } @@ -2677,69 +2698,63 @@ pentagrama cuando éste está dedicado a dicho personaje solamente: @end lilypond Cuando dos o más personajes comparten un pentagrama, el nombre del -personaje se suele imprimir encima del pentagrama al principio de cada -sección correspondiente a dicho personaje. Esto se puede hacer con -elementos de marcado. Con frecuencia se usa un tipo de letra especial -para este propósito. - -@lilypond[quote,verbatim,relative=1] -\clef "G_8" -c4^\markup \fontsize #1 \smallCaps Kaspar -c c c -\clef "bass" -a4^\markup \fontsize #1 \smallCaps Melchior -a a a -\clef "G_8" -c4^\markup \fontsize #1 \smallCaps Kaspar -c c c -@end lilypond - -Como alternativa, si hay muchos cambios de personajes, puede ser más -fácil establecer definiciones de @qq{instrumentos} para cada -instrumento en el nivel superior de la sintaxis, de forma que se puede -usar @code{\instrumentSwitch} para indicar cada uno de los cambios. +personaje se suele imprimir encima del pentagrama al principio de +cada sección correspondiente a dicho personaje. Esto se puede +hacer con elementos de marcado. Con frecuencia se usa un tipo de +letra especial para este propósito. @lilypond[quote,verbatim] -\addInstrumentDefinition #"kaspar" - #`((instrumentTransposition . ,(ly:make-pitch -1 0 0)) - (shortInstrumentName . "Kas.") - (clefGlyph . "clefs.G") - (clefTransposition . -7) - (middleCPosition . 1) - (clefPosition . -2) - (instrumentCueName . ,(markup #:fontsize 1 #:smallCaps "Kaspar")) - (midiInstrument . "voice oohs")) - -\addInstrumentDefinition #"melchior" - #`((instrumentTransposition . ,(ly:make-pitch 0 0 0)) - (shortInstrumentName . "Mel.") - (clefGlyph . "clefs.F") - (clefTransposition . 0) - (middleCPosition . 6) - (clefPosition . 2) - (instrumentCueName . ,(markup #:fontsize 1 #:smallCaps "Melchior")) - (midiInstrument . "choir aahs")) +\relative c' { + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c + \clef "bass" + a4^\markup \fontsize #1 \smallCaps Melchior + a a a + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c +} +@end lilypond + +Como alternativa, si hay muchos cambios de personajes, puede ser +más fácil establecer variables que contengan las definiciones de +cada personaje, para así poder indicar el cambio de personaje de +manera fácil y concisa. + +@lilypond[quote,verbatim] +kaspar = { + \clef "G_8" + \set Staff.shortVocalName = "Kas." + \set Staff.midiInstrument = "voice oohs" + <>^\markup \smallCaps "Kaspar" +} + +melchior = { + \clef "bass" + \set Staff.shortVocalName = "Mel." + \set Staff.midiInstrument = "choir aahs" + <>^\markup \smallCaps "Melchior" +} \relative c' { - \instrumentSwitch "kaspar" + \kaspar c4 c c c - \instrumentSwitch "melchior" + \melchior a4 a a a - \instrumentSwitch "kaspar" + \kaspar c4 c c c } @end lilypond @seealso +Manual de aprendizaje: +@rlearning{Organizar las piezas mediante variables}. + Referencia de la notación: -@ref{Nombres de instrumentos}, -@ref{Funciones de Scheme}, @ref{Texto}, @ref{Instrucciones de marcado de texto}. -Extender LilyPond: -@rextend{Construcción de elementos de marcado en Scheme}. - @node Guías musicales @unnumberedsubsubsec Guías musicales @translationof Musical cues @@ -2747,39 +2762,36 @@ Extender LilyPond: @cindex guías musicales @cindex musicales, guías -Se pueden insertar guías musicales en las partituras vocales, en los -libros vocales y en las partes orquestales para indicar qué música de -otra parte precede inmediatamente a una entrada. Asimismo, las guías -se suelen insertar en la reducción de piano en las partituras vocales -para indicar lo que está tocando cada parte orquestas. Esto sirve de -ayuda al director cuando no está disponible una partitura del -director. - -El mecanismo básico para insertar guías se explica de forma exhaustiva -en el texto principal, véase @ref{Citar otras voces} y @ref{Formateo -de las notas guía}. Pero cuando se deben insertar muchas guías, por -ejemplo, como ayuda para el director en una partitura vocal, el nombre -del instrumento se debe colocar cuidadosamente justo antes del -comienzo de las notas guía, y cerca de ellas. El siguiente ejemplo -muestra cómo se hace esto. +Se pueden insertar guías musicales en las partituras vocales, en +los libros vocales y en las partes orquestales para indicar qué +música de otra parte precede inmediatamente a una entrada. +Asimismo, las guías se suelen insertar en la reducción de piano en +las partituras vocales para indicar lo que está tocando cada parte +orquestas. Esto sirve de ayuda al director cuando no está +disponible una partitura del director. + +El mecanismo básico para insertar guías se explica de forma +exhaustiva en el texto principal, véase @ref{Citar otras voces} y +@ref{Formateo de las notas guía}. Pero cuando se deben insertar +muchas guías, por ejemplo, como ayuda para el director en una +partitura vocal, el nombre del instrumento se debe colocar +cuidadosamente justo antes del comienzo de las notas guía, y cerca +de ellas. El siguiente ejemplo muestra cómo se hace esto. @lilypond[quote,verbatim] -flute = \relative c'' { - s4 s4 e g +flute = \relative { + s4 s4 e'' g } \addQuote "flute" { \flute } -pianoRH = \relative c'' { - c4. g8 +pianoRH = \relative { + c''4. g8 % position name of cue-ing instrument just before the cue notes, % and above the staff - \new CueVoice { - \override InstrumentSwitch.self-alignment-X = #RIGHT - \set instrumentCueName = "Flute" - } + <>^\markup { \right-align { \tiny "Flute" } } \cueDuring "flute" #UP { g4 bes4 } } -pianoLH = \relative c { c4 e, } +pianoLH = \relative { c4 e, } \score { \new PianoStaff << @@ -2794,18 +2806,14 @@ pianoLH = \relative c { c4 e, } } @end lilypond -Si un instrumento transpositor se está citando, la parte instrumental -debe especificar la tonalidad de manera que la conversión de las notas -citadas se realice automáticamente. El ejemplo de abajo muestra esta -transposición para un clarinete en Si bemol. Las notas de este -ejemplo son bajas en el pentagrama, por lo que se especifica -@code{DOWN} en @code{\cueDuring} (para que las plicas se orienten -hacia abajo) y el nombre del instrumento se coloca debajo del -pentagrama. Observe también que la voz de la mano derecha del piano -está declarada explícitamente. Esto es así porque las notas citadas en -este ejemplo comienzan al principio del primer compás y en caso -contrario produciría que todas las notas de la mano derecha del piano -se situaran dentro de un contexto @code{CueVoice}. +Si un instrumento transpositor se está citando, la parte +instrumental debe especificar la tonalidad de manera que la +conversión de las notas citadas se realice automáticamente. El +ejemplo de abajo muestra esta transposición para un clarinete en +Si bemol. Las notas de este ejemplo son bajas en el pentagrama, +por lo que se especifica @code{DOWN} en @code{\cueDuring} (para +que las plicas se orienten hacia abajo) y el nombre del +instrumento se coloca debajo del pentagrama. @lilypond[quote,verbatim] clarinet = \relative c' { @@ -2817,15 +2825,11 @@ clarinet = \relative c' { pianoRH = \relative c'' { \transposition c' % position name of cue-ing instrument below the staff - \new CueVoice { - \override InstrumentSwitch.self-alignment-X = #RIGHT - \override InstrumentSwitch.direction = #DOWN - \set instrumentCueName = "Clar." - } + <>_\markup { \right-align { \tiny "Clar." } } \cueDuring "clarinet" #DOWN { c4. g8 } g4 bes4 } -pianoLH = \relative c { c4 e, } +pianoLH = \relative { c4 e, } \score { << @@ -2845,12 +2849,12 @@ pianoLH = \relative c { c4 e, } @end lilypond A partir de estos dos ejemplos debería quedar claro que insertar -muchas notas guía en una partitura vocal puede ser -tedioso, y la visión de las notas de la parte de piano quedaría -entorpecida. Sin embargo, como -muestra el siguiente fragmento de código, es posible definir una -función musical para reducir la cantidad de texto que se teclea y para -hacer que las notas del piano estén más claras. +muchas notas guía en una partitura vocal puede ser tedioso, y la +visión de las notas de la parte de piano quedaría entorpecida. +Sin embargo, como muestra el siguiente fragmento de código, es +posible definir una función musical para reducir la cantidad de +texto que se teclea y para hacer que las notas del piano estén más +claras. @snippets @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] @@ -2871,17 +2875,16 @@ Fragmentos de código: @rlsr{Vocal music}. Referencia de funcionamiento interno: -@rinternals{InstrumentSwitch}, @rinternals{CueVoice}. @knownissues -@code{\cueDuring} inserta automáticamente un contexto @code{CueVoice} -y todas las notas guía se colocan dentro de este contexto. Ello -significa que no es posible tener dos secuencias de notas guía -superpuestas mediante esta técnica. Las secuencias superpuestas se -podrían introducir declarando explícitamente contextos @code{CueVoice} -separados y usando @code{\quoteDuring} para extraer e insertar las -notas citadas. +@code{\cueDuring} inserta automáticamente un contexto +@code{CueVoice} y todas las notas guía se colocan dentro de este +contexto. Ello significa que no es posible tener dos secuencias +de notas guía superpuestas mediante esta técnica. Las secuencias +superpuestas se podrían introducir declarando explícitamente +contextos @code{CueVoice} separados y usando @code{\quoteDuring} +para extraer e insertar las notas citadas. @node Música hablada @@ -2891,10 +2894,11 @@ notas citadas. @cindex parlato @cindex Sprechgesang -Efectos tales como el @q{parlato} o el @q{Sprechgesang} requieren que -los intérpretes hablen sin altura definida pero con el ritmo adecuado; -la notación de estos estilos se realiza mediante figuras con la cabeza -en forma de cruz, como se muestra en @ref{Cabezas de nota especiales}. +Efectos tales como el @q{parlato} o el @q{Sprechgesang} requieren +que los intérpretes hablen sin altura definida pero con el ritmo +adecuado; la notación de estos estilos se realiza mediante figuras +con la cabeza en forma de cruz, como se muestra en +@ref{Cabezas de nota especiales}. @c TODO add "marking-notes-on-spoken-parts" snippet -vv @c add "showing the rhythm of a melody" snip @@ -2906,36 +2910,39 @@ en forma de cruz, como se muestra en @ref{Cabezas de nota especiales}. @unnumberedsubsubsec Diálogos encima de la música @translationof Dialogue over music -Los diálogos sobre la música se imprimen normalmente por encima de los -pentagramas en un estilo inclinado, con el comienzo de cada frase -ligado a un momento musical en particular. +Los diálogos sobre la música se imprimen normalmente por encima de +los pentagramas en un estilo inclinado, con el comienzo de cada +frase ligado a un momento musical en particular. Para interjecciones cortas, basta un simple elemento de marcado. -@lilypond[quote,verbatim,relative=2] -a4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a -a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a -a4 a a a +@lilypond[quote,verbatim] +\relative { + a'4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a + a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a + a4 a a a +} @end lilypond -Para frases más largas puede ser necesario expandir la música de forma -que que las palabras quepan holgadamente. No está previsto en -LilyPond hacer esto de manera completamente automática, y puede ser -necesaria cierta intervención manual sobre la disposición. +Para frases más largas puede ser necesario expandir la música de +forma que que las palabras quepan holgadamente. No está previsto +en LilyPond hacer esto de manera completamente automática, y puede +ser necesaria cierta intervención manual sobre la disposición. -Para frases largas o pasajes con un diálogo en disposición apretada, -puede dar mejores resultados la utilización de un contexto de letra. -El contexto Lyrics no se debe asociar con una voz musical; en vez de -ello, cada sección del diálogo recibe una duración explícita. Si hay -una pausa en medio del diálogo, se debe separar la palabra final del -resto y dividirse la duración entre ellas de forma que la música -subyacente reciba un espaciado continuo y adecuado. +Para frases largas o pasajes con un diálogo en disposición +apretada, puede dar mejores resultados la utilización de un +contexto de letra. El contexto Lyrics no se debe asociar con una +voz musical; en vez de ello, cada sección del diálogo recibe una +duración explícita. Si hay una pausa en medio del diálogo, se +debe separar la palabra final del resto y dividirse la duración +entre ellas de forma que la música subyacente reciba un espaciado +continuo y adecuado. -Si el diálogo se extiende a más de una línea, será necesario insertar -@code{\break}s manualmente y ajustar la colocación del diálogo para -evitar que se extienda más allá del margen derecho. La última palabra -del último compás de una línea debe separarse también, como se ha -visto antes. +Si el diálogo se extiende a más de una línea, será necesario +insertar @code{\break}s manualmente y ajustar la colocación del +diálogo para evitar que se extienda más allá del margen derecho. +La última palabra del último compás de una línea debe separarse +también, como se ha visto antes. He aquí un ejemplo que ilustra cómo puede hacerse. @@ -2943,8 +2950,8 @@ He aquí un ejemplo que ilustra cómo puede hacerse. @c manually adjusted to suit the imposed line length. -td @lilypond[quote,verbatim,ragged-right] -music = \relative c'' { - \repeat unfold 3 { a4 a a a } +music = \relative { + \repeat unfold 3 { a'4 a a a } } dialogue = \lyricmode { @@ -2992,11 +2999,11 @@ Referencia de funcionamiento interno: @cindex himnos @cindex música religiosa -La música y la letra de los cánticos, salmos e himnos suelen seguir un -formato bien establecido dentro de cualquier iglesia en particular. -Aunque los formatos pueden diferir de una iglesia a otra, los -problemas de tipografiado que surgen son bastante similares, y se -estudian en esta sección. +La música y la letra de los cánticos, salmos e himnos suelen +seguir un formato bien establecido dentro de cualquier iglesia en +particular. Aunque los formatos pueden diferir de una iglesia a +otra, los problemas de tipografiado que surgen son bastante +similares, y se estudian en esta sección. @menu * Referencias para cánticos y salmos:: @@ -3009,8 +3016,8 @@ estudian en esta sección. @unnumberedsubsubsec Referencias para cánticos y salmos @translationof References for chants and psalms -El tipografiado del canto gregoriano en distintos estilos de notación -antigua se describe en @ref{Notación antigua}. +El tipografiado del canto gregoriano en distintos estilos de +notación antigua se describe en @ref{Notación antigua}. @seealso Referencia de la notación: @@ -3024,12 +3031,14 @@ Snippets: @unnumberedsubsubsec Preparar un cántico @translationof Setting a chant -La preparación moderna de los cánticos utiliza notación moderna con un -número variable de elementos tomados de la notación antigua. Algunos -de los elementos y métodos que considerar se presentan aquí. +La preparación moderna de los cánticos utiliza notación moderna +con un número variable de elementos tomados de la notación +antigua. Algunos de los elementos y métodos que considerar se +presentan aquí. -Los cánticos usan con frecuencia figuras negras sin plica para indicar -la altura, tomando las duraciones del ritmo hablado del texto. +Los cánticos usan con frecuencia figuras negras sin plica para +indicar la altura, tomando las duraciones del ritmo hablado del +texto. @lilypond[verbatim,quote] stemOff = { \hide Staff.Stem } @@ -3041,24 +3050,25 @@ stemOff = { \hide Staff.Stem } @end lilypond -Los cánticos con frecuencia omiten las líneas divisorias o utilizan -barras de compás recortadas o discontinuas para indicar pausas en la -música. Para omitir todas las barras de compás de todos los -pentagramas, suprima completamente el grabador de barras: +Los cánticos con frecuencia omiten las líneas divisorias o +utilizan barras de compás recortadas o discontinuas para indicar +pausas en la música. Para omitir todas las barras de compás de +todos los pentagramas, suprima completamente el grabador de +barras: @lilypond[verbatim,quote] \score { \new StaffGroup << \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } } \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -3081,15 +3091,15 @@ pentagrama: \new ChoirStaff << \new Staff \with { \remove "Bar_engraver" } { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } } \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -3099,44 +3109,50 @@ pentagrama: @end lilypond Para suprimir las líneas divisorias sólo de una sección de música, -trátela como si fuera una cadencia. Si la sección es larga, podría -necesitar insertar líneas divisorias @qq{mudas} con @code{\bar ""} -para indicar dónde se debe producir el salto de línea. - -@lilypond[verbatim,quote,relative=2] -a4 b c2 | -\cadenzaOn -a4 b c2 -a4 b c2 -\bar "" -a4 b c2 -a4 b c2 -\cadenzaOff -a4 b c2 | -a4 b c2 | +trátela como si fuera una cadencia. Si la sección es larga, +podría necesitar insertar líneas divisorias @qq{mudas} con +@code{\bar ""} para indicar dónde se debe producir el salto de +línea. + +@lilypond[verbatim,quote] +\relative a' { + a4 b c2 | + \cadenzaOn + a4 b c2 + a4 b c2 + \bar "" + a4 b c2 + a4 b c2 + \cadenzaOff + a4 b c2 | + a4 b c2 | +} @end lilypond Los silencios o pausas en los cánticos pueden indicarse mediante barras de compás modificadas. -@lilypond[verbatim, quote,relative=2] -a4 -\cadenzaOn -b c2 -a4 b c2 -\bar "'" -a4 b c2 -a4 b c2 -\bar ";" -a4 b c2 -\bar "!" -a4 b c2 -\bar "||" -@end lilypond - -Como alternativa, se usa a veces la notación del canto gregoriano para -las pausas o silencios, aunque el resto de la notación sea moderna. -Este ejemplo utiliza una marca @code{\breathe} modificada: +@lilypond[verbatim, quote] +\relative a' { + a4 + \cadenzaOn + b c2 + a4 b c2 + \bar "'" + a4 b c2 + a4 b c2 + \bar ";" + a4 b c2 + \bar "!" + a4 b c2 + \bar "||" +} +@end lilypond + +Como alternativa, se usa a veces la notación del canto gregoriano +para las pausas o silencios, aunque el resto de la notación sea +moderna. Este ejemplo utiliza una marca @code{\breathe} +modificada: @lilypond[verbatim,quote] divisioMinima = { @@ -3161,8 +3177,8 @@ finalis = { } \score { - \relative c'' { - g2 a4 g + \relative { + g'2 a4 g \divisioMinima g2 a4 g \divisioMaior @@ -3180,14 +3196,14 @@ finalis = { } @end lilypond -Los cánticos suelen omitir la indicación de compás y con frecuencia -omiten la clave también. +Los cánticos suelen omitir la indicación de compás y con +frecuencia omiten la clave también. @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -3204,31 +3220,32 @@ omiten la clave también. @end lilypond Los cánticos de salmos en la tradición anglicana suelen ser -@emph{sencillos}, con siete compases de música, o @emph{dobles}, con -dos períodos de siete compases. Cada grupo de siete compases se -divide en dos mitades, que corresponden a las dos mitades de cada -verso, normalmente separados mediante una doble línea divisoria. Sólo -se utilizan redondas y blancas. El primer compás de cada mitad -siempre contiene un único acorde en redondas. Ésta es la @qq{nota de -recitado}. Los cánticos se suelen centrar sobre la página. +@emph{sencillos}, con siete compases de música, o @emph{dobles}, +con dos períodos de siete compases. Cada grupo de siete compases +se divide en dos mitades, que corresponden a las dos mitades de +cada verso, normalmente separados mediante una doble línea +divisoria. Sólo se utilizan redondas y blancas. El primer compás +de cada mitad siempre contiene un único acorde en redondas. Ésta +es la @qq{nota de recitado}. Los cánticos se suelen centrar sobre +la página. @lilypond[verbatim,quote] -SopranoMusic = \relative g' { - g1 | c2 b | a1 | \bar "||" +SopranoMusic = \relative { + g'1 | c2 b | a1 | \bar "||" a1 | d2 c | c b | c1 | \bar "||" } -AltoMusic = \relative c' { - e1 | g2 g | f1 | +AltoMusic = \relative { + e'1 | g2 g | f1 | f1 | f2 e | d d | e1 | } -TenorMusic = \relative a { - c1 | c2 c | c1 | +TenorMusic = \relative { + c'1 | c2 c | c1 | d1 | g,2 g | g g | g1 | } -BassMusic = \relative c { +BassMusic = \relative { c1 | e2 e | f1 | d1 | b2 c | g' g | c,1 | } @@ -3284,20 +3301,20 @@ global = { } % End markup @end lilypond -Otros enfoques para la preparación de este cántico se muestran en el -primero de los siguientes fragmentos de código. +Otros enfoques para la preparación de este cántico se muestran en +el primero de los siguientes fragmentos de código. @snippets @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] {chant-or-psalms-notation.ly} -Los cánticos y otros textos litúrgicos pueden disponerse de una forma -más libre, y posiblemente usen elementos notacionales tomados de la -música antigua. Con frecuencia la letra se imprime por debajo y -alineada con las notas. En este caso, las notas se disponen -espaciadas de acuerdo con las sílabas en vez de hacerlo con las -duraciones de las notas. +Los cánticos y otros textos litúrgicos pueden disponerse de una +forma más libre, y posiblemente usen elementos notacionales +tomados de la música antigua. Con frecuencia la letra se imprime +por debajo y alineada con las notas. En este caso, las notas se +disponen espaciadas de acuerdo con las sílabas en vez de hacerlo +con las duraciones de las notas. @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] {ancient-notation-template----modern-transcription-of-gregorian-music.ly} @@ -3320,24 +3337,24 @@ Referencia de la notación: @unnumberedsubsubsec Puntuación de un salmo @translationof Pointing a psalm -El texto de un salmo anglicano se suele imprimir en versos separados -debajo del canto. +El texto de un salmo anglicano se suele imprimir en versos +separados debajo del canto. -Los cantos sencillos (con siete compases) se repiten para cada verso. -Los cantos dobles (con 14 compases) se repiten para cada par de -versos. Se insertan marcas dentro del texto para indicar la forma en -que encajan con el canto. Cada verso se divide en dos mitades. Se -suele utilizar un signo de dos puntos para indicar esta división. -Esto corresponde a la doble línea divisoria de la música. El texto -antes de los dos puntos se canta con los tres primeros compases de la -música; el texto después de los dos puntos se canta con los últimos -cuatro compases. +Los cantos sencillos (con siete compases) se repiten para cada +verso. Los cantos dobles (con 14 compases) se repiten para cada +par de versos. Se insertan marcas dentro del texto para indicar +la forma en que encajan con el canto. Cada verso se divide en dos +mitades. Se suele utilizar un signo de dos puntos para indicar +esta división. Esto corresponde a la doble línea divisoria de la +música. El texto antes de los dos puntos se canta con los tres +primeros compases de la música; el texto después de los dos puntos +se canta con los últimos cuatro compases. Se insertan líneas de compás simples (o en algunos casos una coma -invertida u otro símbolo similar) entre el texto para indicar dónde -caen las líneas divisorias de la música. En el modo de marcado, se -puede introducir una línea de compás simple con el símbolo de -comprobación de compás, la barra vertical, @code{|}. +invertida u otro símbolo similar) entre el texto para indicar +dónde caen las líneas divisorias de la música. En el modo de +marcado, se puede introducir una línea de compás simple con el +símbolo de comprobación de compás, la barra vertical, @code{|}. @lilypond[verbatim,quote] \markup { @@ -3353,8 +3370,9 @@ comprobación de compás, la barra vertical, @code{|}. } @end lilypond -otros símbolos pueden requerir glifos de las fuentes tipográficas -@code{fetaMusic}. Para ver más detalles, consulte @ref{Tipografías}. +Otros símbolos pueden requerir glifos de las fuentes tipográficas +@code{fetaMusic}. Para ver más detalles, consulte +@ref{Tipografías}. @lilypond[verbatim,quote] tick = \markup { @@ -3375,11 +3393,11 @@ tick = \markup { } @end lilypond -Donde hay una redonda en un compás, todo el texto que corresponde a ese -compás se recita sobre esa nota en el ritmo de la palabra. Donde hay -dos notas en un compás, suele haber solamente una o dos sílabas -correspondientes. Si hay más de dos sílabas, se suele insertar un -punto para indicar dónde se produce el cambio de nota. +Donde hay una redonda en un compás, todo el texto que corresponde +a ese compás se recita sobre esa nota en el ritmo de la palabra. +Donde hay dos notas en un compás, suele haber solamente una o dos +sílabas correspondientes. Si hay más de dos sílabas, se suele +insertar un punto para indicar dónde se produce el cambio de nota. @lilypond[verbatim,quote] dot = \markup { @@ -3406,9 +3424,9 @@ tick = \markup { @end lilypond En algunos salterios (libros de salmos) se usa un asterisco para -indicar un corte en una sección recitada en lugar de una coma y las -sílabas acentuadas o ligeramente alargadas se indican en estilo -negrita. +indicar un corte en una sección recitada en lugar de una coma y +las sílabas acentuadas o ligeramente alargadas se indican en +estilo negrita. @lilypond[verbatim,quote] dot = \markup { @@ -3434,8 +3452,8 @@ tick = \markup { } @end lilypond -En otros salterios se coloca un acento sobre la sílaba para indicar el -énfasis. +En otros salterios se coloca un acento sobre la sílaba para +indicar el énfasis. @lilypond[verbatim,quote] tick = \markup { @@ -3464,11 +3482,11 @@ tick = \markup { } @end lilypond -El uso del marcado para centrar texto y para disponer las líneas en -columnas se describe en @ref{Formatear el texto}. +El uso del marcado para centrar texto y para disponer las líneas +en columnas se describe en @ref{Formatear el texto}. -Casi todos estos elementos se muestran en uno u otro de los dos versos -en la plantilla, véase @rlearning{Salmos}. +Casi todos estos elementos se muestran en uno u otro de los dos +versos en la plantilla, véase @rlearning{Salmos}. @seealso Manual de aprendizaje: @@ -3484,11 +3502,12 @@ Referencia de la notación: @unnumberedsubsubsec Compases parciales en melodías de himno @translationof Partial measures in hymn tunes -Con frecuencia las melodías de himno comienzan y terminan cada línea -de música con compases parciales de forma que cada línea de música -corresponde exactamente con una línea de texto. Esto requiere una -instrucción @code{\partial} al principio de la música e instrucciones -@code{\bar "|"} ó @code{\bar "||"} al final de cada línea. +Con frecuencia las melodías de himno comienzan y terminan cada +línea de música con compases parciales de forma que cada línea de +música corresponde exactamente con una línea de texto. Esto +requiere una instrucción @code{\partial} al principio de la música +e instrucciones @code{\bar "|"} ó @code{\bar "||"} al final de +cada línea. @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] {hymn-template.ly} @@ -3498,8 +3517,8 @@ instrucción @code{\partial} al principio de la música e instrucciones @subsection Música vocal antigua @translationof Ancient vocal music -Está contemplada la música vocal en estilo de tipografía antiguo, como -se explica en @ref{Notación antigua}. +Está contemplada la música vocal en estilo de tipografía antiguo, +como se explica en @ref{Notación antigua}. @c TODO diff --git a/Documentation/es/notation/wind.itely b/Documentation/es/notation/wind.itely index 9aaa571ae1..5d254e2c53 100644 --- a/Documentation/es/notation/wind.itely +++ b/Documentation/es/notation/wind.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: f739a44f91a0b7ef5f634b6c4ca5b45c988798c1 + Translation of GIT committish: 88cfc9ee61dece9cffff98ab7f10318633698c39 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.16" @node Instrumentos de viento @section Instrumentos de viento @@ -16,8 +16,8 @@ @lilypondfile[quote]{wind-headword.ly} -Esta sección incluye elementos de notación musical que afloran -al escribir para instrumentos de viento. +Esta sección incluye elementos de notación musical que afloran al +escribir para instrumentos de viento. @menu * Notación común para instrumentos de viento:: @@ -29,7 +29,7 @@ al escribir para instrumentos de viento. @subsection Notación común para instrumentos de viento @translationof Common notation for wind instruments -Esta sección trata la notación común para casi todos los +Esta sección trata la notación común para casi todos los instrumentos de viento. @menu @@ -43,28 +43,64 @@ instrumentos de viento. @cindex viento, instrumentos -Muchas cuestiones de la notación para instrumentos de viento tienen -que ver con las respiraciones y los golpes de lengua: +Muchas cuestiones de la notación para instrumentos de viento +tienen que ver con las respiraciones y los golpes de lengua: @itemize -@item Las respiraciones se pueden especificar mediante silencios o marcas de respiración, véase @ref{Marcas de respiración}. -@item La ejecución ligada se indica mediante ligaduras de expresión, véase @ref{Ligaduras de expresión}. -@item Los distintos golpes de lengua, desde legato hasta staccato pasando por non legato, se presentan por lo general mediante articulaciones, en ocasiones combinadas con ligaduras de expresión, véase @ref{Articulaciones y ornamentos} y @ref{Lista de articulaciones}. -@item El frullato se indica generalmente mediante una indicación de trémolo y una marca textual sobre la nota. Véase @ref{Repeticiones de trémolo}. +@item +Las respiraciones se pueden especificar mediante silencios o +marcas de respiración, véase @ref{Marcas de respiración}. +@item +La ejecución ligada se indica mediante ligaduras de expresión, +véase @ref{Ligaduras de expresión}. +@item +Los distintos golpes de lengua, desde legato hasta staccato +pasando por non legato, se presentan por lo general mediante +articulaciones, en ocasiones combinadas con ligaduras de +expresión, véase @ref{Articulaciones y ornamentos} y +@ref{Lista de articulaciones}. +@item +El frullato se indica generalmente mediante una indicación de +trémolo y una marca textual sobre la nota. Véase +@ref{Repeticiones de trémolo}. @end itemize También existen otros aspectos de la notación musical que son de aplicación a los instrumentos de viento: @itemize -@item Muchos instrumentos de viento son transpositores, véase @ref{Transposición de los instrumentos}. -@item El portamento es característico del trombón, pero otros instrumentos de viento pueden realizar glissandos con llaves o válvulas. Véase @ref{Glissando}. -@item Los glissandos de serie armónica, que son posibles en todos los metales pero bastante específicos de las trompas, se escriben en general como notas de adorno, véase @ref{Notas de adorno}. -@item Las inflexiones de tono al final de una nota se tratan en @ref{Caídas y elevaciones}. -@item Los golpes de llave o de válvula se suelen indicar con el estilo @code{cross} (aspas) de cabezas de nota, véase @ref{Cabezas de nota especiales}. -@item Los instrumentos de viento-madera pueden sobreinflar las notas graves para producir armónicos. Éstos se muestran por medio de la articulación @code{flageolet}. Véase @ref{Lista de articulaciones}. -@item El uso de sordinas para los metales se suele indicar mediante marcas de texto, pero en los lugares donde se suceden muchos cambios rápidos es mejor utilizar las articulaciones @code{stopped} (tapado) y @code{open} (abierto). Véase @ref{Articulaciones y ornamentos} y @ref{Lista de articulaciones}. -@item Las trompas tapadas se indican por medio de la articulación @code{stopped}. Véase @ref{Articulaciones y ornamentos}. +@item +Muchos instrumentos de viento son transpositores, véase +@ref{Transposición de los instrumentos}. +@item +El portamento es característico del trombón, pero otros +instrumentos de viento pueden realizar glissandos con llaves o +válvulas. Véase @ref{Glissando}. +@item +Los glissandos de serie armónica, que son posibles en todos los +metales pero bastante específicos de las trompas, se escriben en +general como notas de adorno, véase @ref{Notas de adorno}. +@item +Las inflexiones de tono al final de una nota se tratan en +@ref{Caídas y elevaciones}. +@item +Los golpes de llave o de válvula se suelen indicar con el estilo +@code{cross} (aspas) de cabezas de nota, véase @ref{Cabezas de +nota especiales}. +@item +Los instrumentos de viento-madera pueden sobreinflar las notas +graves para producir armónicos. Éstos se muestran por medio de la +articulación @code{flageolet}. Véase +@ref{Lista de articulaciones}. +@item +El uso de sordinas para los metales se suele indicar mediante +marcas de texto, pero en los lugares donde se suceden muchos +cambios rápidos es mejor utilizar las articulaciones +@code{stopped} (tapado) y @code{open} (abierto). Véase +@ref{Articulaciones y ornamentos} y @ref{Lista de articulaciones}. +@item +Las trompas tapadas se indican por medio de la articulación +@code{stopped}. Véase @ref{Articulaciones y ornamentos}. @end itemize @snippets @@ -93,13 +129,13 @@ Fragmentos de código: @unnumberedsubsubsec Digitaciones @translationof Fingerings -Todos los instrumentos de viento aparte del trombón requieren el uso -de los distintos dedos para producir cada nota. En los fragmentos -de código que aparecen a continuación pueden verse algunos ejemplos -de digitaciones. +Todos los instrumentos de viento aparte del trombón requieren el +uso de los distintos dedos para producir cada nota. En los +fragmentos de código que aparecen a continuación pueden verse +algunos ejemplos de digitaciones. -Se pueden producir diagramas de posiciones para instrumentos -de viento madera,como se describe en +Se pueden producir diagramas de posiciones para instrumentos de +viento madera,como se describe en @ref{Diagramas de posiciones para viento madera}. @snippets @@ -122,8 +158,7 @@ Fragmentos de código: @subsection Gaita @translationof Bagpipes -Esta sección trata de la notación común -para gaita. +Esta sección trata de la notación común para gaita. @menu * Definiciones para la gaita:: @@ -140,48 +175,48 @@ para gaita. @cindex notas de adorno @funindex \taor -@funindex taor @funindex \hideKeySignature -@funindex hideKeySignature @funindex \showKeySignature -@funindex showKeySignature -LilyPond contiene definiciones especiales para la música de gaita escocesa de las -tierras altas; para usarlas, escriba +LilyPond contiene definiciones especiales para la música de gaita +escocesa de las tierras altas; para usarlas, escriba @example \include "bagpipe.ly" @end example @noindent -al principio del archivo de entrada. De esta forma podrá escribir las notas de adorno especiales -que son usuales en la música de gaita, mediante instrucciones breves. Por ejemplo, puede escribir +al principio del archivo de entrada. De esta forma podrá escribir +las notas de adorno especiales que son usuales en la música de +gaita, mediante instrucciones breves. Por ejemplo, puede escribir @code{\taor} en lugar de @example \grace @{ \small G32[ d G e] @} @end example -@file{bagpipe.ly} también contiene definiciones de alturas para las notas de la -gaita en las octavas adecuadas, de forma que no se tenga que preocupar por -@code{\relative} o por @code{\transpose}. +@file{bagpipe.ly} también contiene definiciones de alturas para +las notas de la gaita en las octavas adecuadas, de forma que no se +tenga que preocupar por @code{\relative} o por @code{\transpose}. @lilypond[ragged-right,verbatim,quote,notime] \include "bagpipe.ly" { \grg G4 \grg a \grg b \grg c \grg d \grg e \grg f \grA g A } @end lilypond -La música de gaita utiliza siempre la tonalidad de Re mayor (aunque esto no es -completamente cierto). Sin embargo, puesto que es la única tonalidad que se puede utilizar, -normalmente la armadura no se escribe. Para configurar esto de forma correcta, -comience la música siempre con @code{\hideKeySignature} (ocultar armadura). Si, por algún motivo, -quiere mostrar la armadura, puede usar @code{\showKeySignature} -en su lugar. +La música de gaita utiliza siempre la tonalidad de Re mayor +(aunque esto no es completamente cierto). Sin embargo, puesto que +es la única tonalidad que se puede utilizar, normalmente la +armadura no se escribe. Para configurar esto de forma correcta, +comience la música siempre con @code{\hideKeySignature} (ocultar +armadura). Si, por algún motivo, quiere mostrar la armadura, puede +usar @code{\showKeySignature} en su lugar. -Alguna música moderna utiliza digitaciones cruzadas sobre el Do y el Fa para bemolizar estas notas. -Se puede indicar esto mediante @code{cflat} o @code{fflat}. De forma parecida, el -sol agudo piobaireachd se puede escribir @code{gflat} cuando aparece en música -ligera. +Alguna música moderna utiliza digitaciones cruzadas sobre el Do y +el Fa para bemolizar estas notas. Se puede indicar esto mediante +@code{c-flat} o @code{f-flat}. De forma parecida, el sol agudo +piobaireachd se puede escribir @code{g-flat} cuando aparece en +música ligera. @seealso Fragmentos de código: @@ -195,8 +230,8 @@ Fragmentos de código: @cindex gaita, ejemplo de @cindex Amazing Grace, ejemplo de gaita -La conocida melodía Amazing Grace tiene este aspecto en notación de -gaita. +La conocida melodía Amazing Grace tiene este aspecto en notación +de gaita. @lilypond[verbatim,quote] \include "bagpipe.ly" @@ -254,10 +289,10 @@ viento madera. @subsubsection Diagramas de posiciones para viento madera @translationof Woodwind diagrams -Se pueden utilizar diagramas de posiciones para los instrumentos de -viento madera para indicar la digitación que usar al tocar ciertas -notas, y están disponibles para los -siguientes instrumentos: +Se pueden utilizar diagramas de posiciones para los instrumentos +de viento madera para indicar la digitación que usar al tocar +ciertas notas, y están disponibles para los siguientes +instrumentos: @itemize @item flautín @@ -274,18 +309,20 @@ siguientes instrumentos: Los diagramas se crean como elementos de marcado: -@lilypond[verbatim, quote, relative=2] -c1^ \markup \woodwind-diagram #'piccolo #'((lh . (gis)) - (cc . (one three)) - (rh . (ees))) +@lilypond[verbatim,quote,fragment] +c''1^\markup { + \woodwind-diagram #'piccolo #'((lh . (gis)) + (cc . (one three)) + (rh . (ees))) +} @end lilypond Las llaves pueden estar abiertas, parcialmente cubiertas, con el anillo pulsado o totalmente apretadas: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \textLengthOn -c1^\markup { +c''1^\markup { \center-column { "one quarter" \woodwind-diagram #'flute #'((cc . (one1q)) @@ -294,7 +331,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "one half" \woodwind-diagram #'flute #'((cc . (one1h)) @@ -303,7 +340,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "three quarter" \woodwind-diagram #'flute #'((cc . (one3q)) @@ -312,7 +349,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "ring" \woodwind-diagram #'flute #'((cc . (oneR)) @@ -321,7 +358,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "full" \woodwind-diagram #'flute #'((cc . (oneF two)) @@ -333,8 +370,8 @@ c1^\markup { Los trinos se indican mediante llaves sombreadas: -@lilypond[verbatim,quote,relative=2] -c1^\markup { +@lilypond[verbatim,quote,fragment] +c''1^\markup { \woodwind-diagram #'bass-clarinet #'((cc . (threeT four)) (lh . ()) @@ -344,9 +381,9 @@ c1^\markup { Es posible imprimir una amplia variedad de trinos: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \textLengthOn -c1^\markup { +c''1^\markup { \center-column { "one quarter to ring" \woodwind-diagram #'flute #'((cc . (one1qTR)) @@ -355,7 +392,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "ring to shut" \woodwind-diagram #'flute #'((cc . (oneTR)) @@ -364,7 +401,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "ring to open" \woodwind-diagram #'flute #'((cc . (oneRT)) @@ -373,7 +410,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "open to shut" \woodwind-diagram #'flute #'((cc . (oneT)) @@ -382,7 +419,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "one quarter to three quarters" \woodwind-diagram #'flute #'((cc . (one1qT3q)) @@ -398,9 +435,10 @@ instrumento dado se puede imprimir en la consola usando usando @code{#(print-keys-verbose 'flute (current-error-port))}, aunque no se pueden mostrar en la salida de música impresa. -Es posible crear diagramas nuevos, aunque requiere conocimientos de -Scheme y quizá no esté al alcance de todos los usuarios. Los patrones -de los diagramas están en @file{scm/define-woodwind-diagrams.scm} y en +Es posible crear diagramas nuevos, aunque requiere conocimientos +de Scheme y quizá no esté al alcance de todos los usuarios. Los +patrones de los diagramas están en +@file{scm/define-woodwind-diagrams.scm} y en @file{scm/display-woodwind-diagrams.scm}. @predefined diff --git a/Documentation/es/notation/world.itely b/Documentation/es/notation/world.itely index 6dc0fdf271..57cc149db9 100644 --- a/Documentation/es/notation/world.itely +++ b/Documentation/es/notation/world.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: es -*- @ignore - Translation of GIT committish: 26a079ca2393d053315ef8dbef626c897dc9645a + Translation of GIT committish: a94d26b6693cad58b946a01b7efaaed29480f063 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @node Músicas del mundo @section Músicas del mundo @@ -201,8 +201,8 @@ Por ejemplo, así es como puede ser la notación de la escala árabe @lilypond[quote,verbatim] \include "arabic.ly" -\relative do' { - do re misb fa sol la sisb do sisb la sol fa misb re do +\relative { + do' re misb fa sol la sisb do sisb la sol fa misb re do } @end lilypond @@ -220,9 +220,9 @@ alterar mediante este método. @lilypond[quote,verbatim] \include "arabic.ly" -\relative do' { +\relative { \set Staff.extraNatural = ##f - dod dob dosd \dwn dob dobsb dodsd do do + dod' dob dosd \dwn dob dobsb dodsd do do } @end lilypond @@ -355,7 +355,7 @@ Referencia de la notación: @ref{Armadura de la tonalidad}. Manual de aprendizaje: -@rlearning{Alteraciones accidentales y armaduras}. +@rlearning{Alturas y armaduras}. Referencia de funcionamiento interno: @rinternals{KeySignature}. @@ -424,13 +424,13 @@ tratamos en esta sección. @lilypond[quote,verbatim] \include "arabic.ly" \score { - \relative re' { + \relative { \set Staff.extraNatural = ##f \set Staff.autoBeaming = ##f \key re \bayati \time 10/8 - re4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 + re'4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 re16 [misb do re] sisb [do] la [sisb sol8] la [sisb] do [re] misb fa4 fa16 [misb] misb8. [re16] re8 [misb] re [do] sisb do4 sisb8 misb16 [re do sisb] la [do sisb la] la4 r8 diff --git a/Documentation/es/search-box.ihtml b/Documentation/es/search-box.ihtml index 824a2c7f2c..9c2da71343 100644 --- a/Documentation/es/search-box.ihtml +++ b/Documentation/es/search-box.ihtml @@ -1,5 +1,5 @@ 8. 16 +@lilypond[verbatim,quote] +\relative { + 1 c-^ e>2 4 + 8. 16 +} @end lilypond -Certains éléments de notation, tels que nuances, soufflets et liaisons, -ne peuvent se rattacher qu'à l'accord et non aux notes qui le composent, -sous peine de ne les voir s'imprimer. +Certains éléments de notation, tels que nuances et soufflets ne peuvent +se rattacher qu'à un accord et non aux notes qui le composent, sous +peine de ne les voir s'imprimer. D'autres éléments, tels que doigtés ou +liaisons, seront placés différemment selon qu'ils sont rattachés à des +notes composant un accord, à un accord dans sa globalité ou à des notes +individuelles. -@lilypond[verbatim,quote,relative=2] -1 \f ( ) -\< \! +@lilypond[verbatim,quote] +\relative { + 1 \f ( ) + \< \! +} @end lilypond @cindex accord vide @@ -97,10 +108,12 @@ interviendra au même moment que la note ou l'accord qui le suit et lui sera donc combiné -- pour des combinaisons plus complexes, voir @ref{Expressions simultanées}. -@lilypond[verbatim,quote,relative=2] -\grace { g8( a b } -<> ) \p \< -. -\markup \italic "sempre staccato" -\repeat unfold 4 { c4 e } c1\f +@lilypond[verbatim,quote] +\relative { + \grace { g'8( a b } + <> ) \p \< -. -\markup \italic "sempre staccato" + \repeat unfold 4 { c4 e } c1\f +} @end lilypond @cindex accord et mode relatif @@ -113,8 +126,10 @@ première hauteur mentionnée dans l'accord précédent ou de la note individuelle précédente. Les autres notes au sein de l'accord se positionnent relativement à la précédente @emph{dans cet accord}. -@lilypond[verbatim,quote,relative=2] -1 +@lilypond[verbatim,quote] +\relative { + 1 +} @end lilypond Pour plus d'information à propos des accords, voir @@ -164,13 +179,16 @@ des @ref{Clusters}. @cindex accord, répétition @cindex répétition, utilisation de @code{q} +@cindex @code{q}, répétition d'accord Dans le but de vous épargner de la saisie, LilyPond dispose d'un raccourci -- symbolisé par la lettre @code{q} -- qui a pour effet de -répéter le dernier accord saisi@tie{}: +répéter le dernier accord saisi : -@lilypond[verbatim,quote,relative=2] -1 q 2 q +@lilypond[verbatim,quote] +\relative { + 1 q 2 q +} @end lilypond À l'instar de n'importe quel accord, le symbole de répétition peut être @@ -178,27 +196,33 @@ affublé d'une durée, de signes d'articulation, @emph{markups}, liaisons, ligatures@dots{} En fait, c'est la structure du dernier accord qui est dupliquée. -@lilypond[verbatim,quote,relative=2] -1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +@lilypond[verbatim,quote] +\relative { + 1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +} @end lilypond Dans la mesure où le symbole de répétition d'accord enregistre la structure du dernier accord construit, il est tout à fait possible de l'utiliser même après une succession de notes individuelles et de -silences@tie{}: +silences : -@lilypond[verbatim,quote,relative=2] -1 c'4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1 c'4 q2 r8 q8 | + q2 c, | +} @end lilypond Le symbole de répétition d'accord ne prend en charge que les hauteurs, en aucun cas les nuances, articulations ou ornementations, qu'elles aient été attachées aux notes le composant ou à l'ensemble. -@lilypond[verbatim,quote,relative=2] -1\sfz c4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1\sfz c'4 q2 r8 q8 | + q2 c, | +} @end lilypond Le seul moyen de les reproduire consiste à utiliser explicitement la @@ -207,16 +231,16 @@ supplémentaire qui recense les @var{types d'événement} à répéter et qui seraient absents de l'accord construit par un @code{q}. @lilypond[verbatim,quote] -\relative c'' { +\relative { \chordRepeats #'(articulation-event) - { 1\sfz c'4 q2 r8 q8-. } | + { 1\sfz c'4 q2 r8 q8-. } | q2 c, | } @end lilypond Comme vous pouvez le constater, l'utilisation de @code{\chordRepeats} au sein d'un bloc @code{\relative} ne produit pas le résultat -escompté@tie{}: les événements de l'accord expansés sont identiques à la +escompté : les événements de l'accord expansés sont identiques à la saisie traditionnelle d'un accord, ce qui a pour conséquence que l'octave affectée par @code{\relative} repose sur le contexte en cours. @@ -228,19 +252,18 @@ cas présent, l'intégralité du bloc @code{\relative} intérieur n'affecte en rien ce qui l'entoure, ce qui explique la spécification d'octave attachée à la dernière note : -@c Without \new Voice, implicit voice creation does the dumbest thing. @lilypond[verbatim,quote] \new Voice -\relative c'' { +\relative { \chordRepeats #'(articulation-event) - \relative c'' - { 1\sfz c'4 q2 r8 q8-. } | - q2 c | + \relative + { 1\sfz c'4 q2 r8 q8-. } | + q2 c'' | } @end lilypond Les interactions avec @code{\relative} ne se produisent que lors d'un -appel explicite de @code{\chordRepeats}@tie{}: l'expansion implicite en +appel explicite de @code{\chordRepeats} : l'expansion implicite en début de saisie intervient à un moment où toutes les instances de @code{\relative} ont déjà été interprétées. @@ -265,17 +288,21 @@ particulier, elle sera placée sur une seule portée. Dans le cas contraire, les éléments d'une expression simultanée seront placés sur des portées distinctes. -Voici deux exemples d'expression simultanée sur une même portée@tie{}: +Voici deux exemples d'expression simultanée sur une même portée : -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Voice { % explicit single voice - << { a4 b g2 } { d4 g c,2 } >> + << \relative { a'4 b g2 } + \relative { d'4 g c,2 } >> } @end lilypond -@lilypond[quote,verbatim,relative=2] -% single first note -a << { a4 b g } { d4 g c, } >> +@lilypond[quote,verbatim] +\relative { + % single first note + a' << \relative { a'4 b g } + \relative { d'4 g c, } >> +} @end lilypond Cette manière de procéder est utile lorsque les éléments de l'expression @@ -284,8 +311,10 @@ même hampe des notes de durée différente, vous générerez des erreurs. Notes, articulations et modifications de propriétés au sein d'un même @code{Voice} sont enregistrées et gravées selon l'ordre musical : -@lilypond[quote,verbatim,relative=2] -4-. <>-. << c a >> << { c-. } { a s-. } >> +@lilypond[quote,verbatim] +\relative { + 4-. <>-. << c a >> << { c-. } { a s-. } >> +} @end lilypond La présence de plusieurs hampes, ligatures, durées ou propriétés au même @@ -294,15 +323,15 @@ instant musical nécessite l'utilisation de plusieurs voix. Dans l'exemple suivant, l'expression simultanée génère implicitement plusieurs portées : -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % no single first note -<< { a4 b g2 } { d4 g2 c,4 } >> +<< \relative { a'4 b g2 } + \relative { d'4 g2 c,4 } >> @end lilypond En pareil cas, des rythmes différents ne sont source d'aucun problème puisqu'ils sont interprétés dans des voix différentes. -@cindex collision sur empilement de notes @cindex collisions, ignorer @knownissues @@ -312,10 +341,11 @@ sur la portée, ce quelque soit le décalage que vous auriez pu leur appliquer. Ceci ne manque pas de faire apparaître un message @example -warning: ignoring too many clashing note columns +warning: This voice needs a \voiceXx or \shiftXx setting @emph{en français :} -Avertissement : trop d'empilements de notes se chevauchent. On fera au mieux. +Avertissement : Cette voix requiert un @code{voiceXx} ou un réglage +@code{\shiftXx} @end example lors de la compilation. Le déclenchement de cet avertissement peut être @@ -326,7 +356,7 @@ désactivé par une clause @end example Ceci n'aura pas pour seule conséquence que ce message ne sera plus -émis@tie{}; les procédures d'évitement de collision de quelqu'ordre que +émis ; les procédures d'évitement de collision de quelqu'ordre que ce soit seront désactivées, ce qui peut conduire à quelques effets inattendus (voir aussi @emph{Problèmes connus et avertissements} à la rubrique @ref{Résolution des collisions}). @@ -339,15 +369,14 @@ rubrique @ref{Résolution des collisions}). @cindex cluster @funindex \makeClusters -@funindex makeClusters Un cluster indique un agrégat de sons. On peut le représenter par une plage limitée par un @emph{ambitus} (notes extrêmes). On obtient une telle notation en appliquant la fonction @code{\makeClusters} à une séquence d'accords, comme -@lilypond[quote,relative=2,verbatim] -\makeClusters { 2 } +@lilypond[quote,verbatim] +\relative \makeClusters { 2 } @end lilypond Des notes ordinaires et des clusters peuvent cohabiter sur une même @@ -371,7 +400,7 @@ L'apparence d'un cluster sera extrêmement resserrée s'il ne comporte au moins deux accords. Dans la mesure où un cluster ne possède pas de hampe, il n'y a aucun -moyen d'en connaître la durée@tie{}; cependant la longueur du signe +moyen d'en connaître la durée ; cependant la longueur du signe imprimé dépend directement de la durée affectée aux accords qui le définissent. @@ -407,23 +436,22 @@ portées. @cindex paroles assignées à une voix @funindex \voiceOne -@funindex voiceOne @funindex \voiceOne ... \voiceFour @funindex Voice @funindex \oneVoice -@funindex oneVoice -@subsubsubheading{Instanciation explicite des voix} + +@subsubsubheading Instanciation explicite des voix La manière la plus facile d'entrer des fragments avec plus d'une voix -sur une portée est la suivante@tie{}: +sur une portée est la suivante : -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] \new Staff << \new Voice = "first" - { \voiceOne r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { \voiceOne r8 r16 g'' e8. f16 g8[ c,] f e16 d } \new Voice= "second" - { \voiceTwo d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { \voiceTwo d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @@ -437,10 +465,11 @@ quelque peu décalées, tout comme leurs silences, afin d'éviter les collisions. La commande @code{\oneVoice} permet de retrouver les réglages par défaut. -@subsubsubheading{Polyphonie temporaire} + +@subsubsubheading Polyphonie temporaire Un fragment temporairement polyphonique se construit de la manière -suivante@tie{}: +suivante : @example << @{ \voiceOne ... @} @@ -455,12 +484,12 @@ perdurera après ce fragment. Les autres expressions entre doubles chevrons seront assignées à des voix temporaires distinctes. C'est la raison pour laquelle les paroles qui suivaient la voix avant la polyphonie continueront à le faire durant ce passage polyphonique et -après lui@tie{}: +après lui : -@lilypond[quote, verbatim, relative=2] -<< +@lilypond[quote,verbatim] +\relative << \new Voice = "melody" { - a4 + a'4 << { \voiceOne @@ -484,7 +513,7 @@ après lui@tie{}: Vous remarquerez que les commandes @code{\voiceOne} et @code{\voiceTwo} permettent d'obtenir des réglages différents pour chacune des voix. -@subsubsubheading{La construction avec un double antislash} +@subsubsubheading La construction avec un double antislash @cindex couches @cindex calques @@ -500,11 +529,11 @@ portent les noms @code{"1"}, @code{"2"}, etc. Dans chacun de ces contextes, le positionnement des liaisons, la direction des hampes, etc. sont réglés de manière appropriée. En voici un exemple : -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { r8 r16 g'' e8. f16 g8[ c,] f e16 d } \\ - { d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @@ -520,13 +549,13 @@ qu'elle adopte les réglages de @code{\voiceThree} qui correspondent à ce que nous voulons. Grâce à des espaces invisibles, nous évitons de surcharger la portée avec des demis soupirs. -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 g g g g f16 ees f8 d } + \relative { r8 g'' g g g f16 ees f8 d } \\ - { ees,8 r ees r d r d r } + \relative { ees'8 r ees r d r d r } \\ - { d'8 s c s bes s a s } + \relative { d''8 s c s bes s a s } >> @end lilypond @@ -535,25 +564,26 @@ les contextes de voix de manière explicite. Voir à ce sujet @rlearning{Contextes et graveurs} et @rlearning{Instanciation explicite des voix}. -@subsubsubheading{Ordre des voix} + +@subsubsubheading Ordre des voix L'ordre dans lequel doivent apparaître les voix d'une construction -simultanée suit le schéma suivant@tie{}: +simultanée suit le schéma suivant : @example -Voix 1: la plus haute -Voix 2: la plus basse -Voix 3: deuxième plus haute -Voix 4: deuxième plus basse -Voix 5: troisième plus haute -Voix 6: troisième plus basse +Voix 1 : la plus haute +Voix 2 : la plus basse +Voix 3 : deuxième plus haute +Voix 4 : deuxième plus basse +Voix 5 : troisième plus haute +Voix 6 : troisième plus basse etc. @end example Cette présentation en entonnoir peut sembler quelque peu -contre-intuitive@tie{}; elle simplifie cependant grandement le processus +contre-intuitive ; elle simplifie cependant grandement le processus de mise en forme. Vous noterez que les hampes des voix au numéro impair -vont vers le haut, celles des voix paires vers le bas@tie{}: +vont vers le haut, celles des voix paires vers le bas : @lilypond[quote,verbatim] \new Staff << @@ -575,18 +605,18 @@ vont vers le haut, celles des voix paires vers le bas@tie{}: @warning{Paroles et objets étendus (liaisons, soufflets etc.) ne peuvent passer d'une voix à l'autre.} -@subsubsubheading{Identité rythmique} +@subsubsubheading Identité rythmique Lorsque l'on doit saisir des fragments de musique parallèle qui ont le même rythme, on peut les combiner dans un contexte de voix unique et par voie de conséquence former des accords. Il suffit pour cela de les regrouper dans une construction de musique simultanée simple au sein -d'une voix explicite@tie{}: +d'une voix explicite : -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] \new Voice << - { e4 f8 d e16 f g8 d4 } - { c4 d8 b c16 d e8 b4 } + \relative { e''4 f8 d e16 f g8 d4 } + \relative { c''4 d8 b c16 d e8 b4 } >> @end lilypond @@ -632,17 +662,17 @@ Morceaux choisis : @funindex \voiceNeutralStyle Opter pour des couleurs et des têtes de notes spécifiques selon la voix -permet de les identifier plus facilement@tie{}: +permet de les identifier plus facilement : -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { \voiceOneStyle d4 c2 b4 } + \relative { \voiceOneStyle d''4 c2 b4 } \\ - { \voiceTwoStyle e,2 e } + \relative { \voiceTwoStyle e'2 e } \\ - { \voiceThreeStyle b2. c4 } + \relative { \voiceThreeStyle b2. c4 } \\ - { \voiceFourStyle g'2 g } + \relative { \voiceFourStyle g'2 g } >> @end lilypond @@ -683,21 +713,13 @@ Morceaux choisis : @cindex silences, décalage automatique @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn @funindex \shiftOff -@funindex shiftOff @funindex \mergeDifferentlyDottedOn -@funindex mergeDifferentlyDottedOn @funindex \mergeDifferentlyDottedOff -@funindex mergeDifferentlyDottedOff @funindex \mergeDifferentlyHeadedOn -@funindex mergeDifferentlyHeadedOn @funindex \mergeDifferentlyHeadedOff -@funindex mergeDifferentlyHeadedOff Les notes de hauteur identique appartenant à des voix différentes, même si leur hampe sont opposées, verront leur tête automatiquement @@ -708,60 +730,66 @@ hampes seront décalés verticalement. Vous constaterez, dans l'exemple suivant, que la fusion échoue aux premier et troisième temps de la première mesure, ainsi qu'au premier temps de la deuxième mesure. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { - c8 d e d c d c4 + \relative { + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond Cependant, vous pouvez fusionner une tête de blanche avec une tête de croche -- jamais avec une noire. Les têtes du premier temps de la -première mesure ont bien fusionné@tie{}: +première mesure ont bien fusionné : -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond De même, vous pouvez fusionner les têtes de notes pointées et -non pointées comme au troisième temps de la première mesure@tie{}: +non pointées comme au troisième temps de la première mesure : -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -771,24 +799,26 @@ Lorsque trois notes ou plus s'agglutinent dans un même empilement, notes qui devraient l'être. Pour obtenir une fusion optimale, appliquez un décalage (@code{\shift}) à la note qui ne devrait pas fusionner. Ici, on applique un @code{\shiftOn} pour décaler le @notation{sol} de -l'empilement@tie{}; le rendement de @code{\mergeDifferentlyHeadedOn} est +l'empilement ; le rendement de @code{\mergeDifferentlyHeadedOn} est alors comme il faut. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 \shiftOn g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -816,16 +846,16 @@ l'ordre vertical des voix tel qu'il apparaîtra sur la portée.} @c KEEP LY @lilypond[quote,verbatim] -\new Staff \relative c'' { +\new Staff \relative { %% saisie abrégée << - { f2 } % 1: extrême haute + { f''2 } % 1 : extrême haute \\ - { g,2 } % 2: extrême basse + { g,2 } % 2 : extrême basse \\ - { d'2 } % 3: intermédiaire haute + { d'2 } % 3 : intermédiaire haute \\ - { b2 } % 4: intermédiaire basse + { b2 } % 4 : intermédiaire basse >> %% expansion en interne de ce qui précède << @@ -888,11 +918,11 @@ Une clause @code{\override NoteColumn.ignore-collision = ##t} aura pour effet une fusion incorrecte des têtes de note différentes à partir de voix différentes. -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim,fragment] \mergeDifferentlyHeadedOn -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> \override NoteColumn.ignore-collision = ##t -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> @end lilypond @ignore @@ -913,7 +943,6 @@ are at the same time differently dotted are not clear. @cindex solo @funindex \partcombine -@funindex partcombine Le regroupement automatique de parties vous permet de fusionner deux pupitres sur une seule portée, ceci dans le but de créer des @@ -923,29 +952,29 @@ deux voix séparées apparaissent, avec des hampes dont la direction est gérée automatiquement. Vous pouvez aussi identifier et faire ressortir les solos et parties @emph{a due}. -Voici la syntaxe qui permet de combiner des parties@tie{}: +Voici la syntaxe qui permet de combiner des parties : @example \partcombine @var{expression_musicale_1} @var{expression_musicale_2} @end example L'exemple suivant illustre les fonctionnalités élémentaires du -combinateur de parties@tie{}: positionner les parties sur une portée, -gérer la direction des hampes et de la polyphonie. Les identifiants -sont les mêmes pour la combinaison et les parties séparées. +combinateur de parties : positionner les parties sur une portée, gérer +la direction des hampes et de la polyphonie. Les identifiants sont les +mêmes pour la combinaison et les parties séparées. @lilypond[quote,verbatim] -instrumentOne = \relative c' { - c4 d e f | +instrumentOne = \relative { + c'4 d e f | R1 | d'4 c b a | b4 g2 f4 | e1 | } -instrumentTwo = \relative g' { +instrumentTwo = \relative { R1 | - g4 a b c | + g'4 a b c | d4 c b a | g4 f( e) d | e1 | @@ -963,15 +992,47 @@ alors qu'elles ont été spécifiées deux fois (une fois dans chacune des parties). La direction des hampes et des liaisons de tenue ou de phrasé est gérée automatiquement, selon qu'il s'agisse d'un solo ou d'un unisson. La première partie, dont le contexte s'appellera @code{one}, -aura toujours ses hampes dirigées vers le haut et sera notée @qq{Solo}, +aura toujours ses hampes dirigées vers le haut et sera notée « Solo », alors que la deuxième, appelée @code{two}, aura des hampes vers le bas -et sera notée @qq{Solo@tie{}II}. Les parties à l'unisson seront -par défaut estampillées d'un @qq{a2}. +et sera notée « Solo II ». Les parties à l'unisson seront par défaut +estampillées d'un « a2 ». + +Par défaut, le combinateur fusionnera deux notes de même hauteur en une +note @notation{a due}, regroupera en accord les notes de même rythme et +dont l'intervalle est inférieur à une neuvième, enfin isolera les notes +séparées de plus d'une neuvième (ou si les voix se croisent) dans des +voix distinctes. Ceci peut s'adapter à l'aide d'une paire de nombres +fournie en argument optionnel à la commande @code{\partcombine} : le +premier nombre spécifie l'intervalle à partir duquel les notes seront +combinées (0 par défaut) et le second celui à partir duquel les notes +seront placées dans des voix séparées. Un second élément de cette paire +à zéro obligera le combinateur à séparer les notes dès la seconde ; s'il +est à un, elles seront séparées à partir de la tierce, et ainsi de +suite. + +@lilypond[quote,verbatim] +instrumentOne = \relative { + a4 b c d | + e f g a | + b c d e | +} + +instrumentTwo = \relative { + c'4 c c c | + c c c c | + c c c c | +} + +<< + \new Staff \partcombine \instrumentOne \instrumentTwo + \new Staff \partcombine #'(2 . 3) \instrumentOne \instrumentTwo +>> +@end lilypond LilyPond interprète dans un contexte @code{Voice} chacun des arguments fournis à @code{\partcombine}. Si vous travaillez avec des octaves relatives, spécifiez @code{\relative} dans chacune des expressions -musicales, comme ceci@tie{}: +musicales, comme ceci : @example \partcombine @@ -986,17 +1047,11 @@ restera sans effet sur les hauteurs de @code{@var{expression_musicale_2}}. @funindex \partcombineChords -@funindex partcombineChords @funindex \partcombineApart -@funindex partcombineApart @funindex \partcombineUnisono -@funindex partcombineUnisono @funindex \partcombineSoloI -@funindex partcombineSoloI @funindex \partcombineSoloII -@funindex partcombineSoloII @funindex \partcombineAutomatic -@funindex partcombineAutomatic En matière d'édition professionnelle, les voix sont souvent maintenues séparément et sur une durée conséquente, bien que les notes des @@ -1005,37 +1060,33 @@ l'unisson. Dans la mesure où @code{\partcombine} considère les notes séparément, combiner des notes en accord ou indiquer un solo ne serait pas optimal en pareil cas. LilyPond dispose alors de certaines commandes qui permettent d'influencer le comportement de la fonction -@code{\partcombine}@tie{}: - -Les commandes se terminant par @code{@dots{}Once} n'affectent que la -note qui les suit directement dans l'expression musicale. +@code{\partcombine}. Ces commandes peuvent se voir préfixées d'un +@code{\once} de sorte à n'affecter que la note qui les suit +directement dans l'expression musicale. @itemize @item -@code{\partcombineApart} et @code{\partcombineApartOnce} maintiennent -les notes dans des voix séparées même si elles peuvent se combiner en -accord ou en unisson. +@code{\partcombineApart} maintient les notes dans des voix séparées même +si elles peuvent se combiner en accord ou en unisson. @item -@code{\partcombineChords} et @code{\partcombineChordsOnce} combinent les -notes en accords. +@code{\partcombineChords} combine les notes en accords. @item -@code{\partcombineUnisono} et @code{\partcombineUnisonoOnce} combinent -les voix en un @qq{unisson}. +@code{\partcombineUnisono} combine les voix en un « unisson ». @item -@code{\partcombineSoloI} et @code{\partcombineSoloIOnce} affichent -exclusivement la première voix et l'affublent d'un @qq{Solo}. +@code{\partcombineSoloI} affiche exclusivement la première voix et +l'affuble d'un « Solo ». @item -@code{\partcombineSoloII} et @code{\partcombineSoloIIOnce} affichent -exclusivement la deuxième voix et l'affublent d'un @qq{Solo}. +@code{\partcombineSoloII} affiche exclusivement la deuxième voix et +l'affuble d'un « Solo ». @item -@code{\partcombineAutomatic} et @code{\partcombineAutomaticOnce} -annulent les effets des dérogations précédentes et activent le -comportement standard de la fonction @code{\partcombine}. +@code{\partcombineAutomatic} annule les effets des dérogations +précédentes et active le comportement standard de la fonction +@code{\partcombine}. @end itemize @lilypond[quote,verbatim] @@ -1044,11 +1095,11 @@ instrumentOne = \relative c' { \partcombineAutomatic e2^"auto" e | \partcombineChords e'2^"chord" e | \partcombineAutomatic c2^"auto" c | - \partcombineApart c2^"apart" \partcombineChordsOnce e^"chord once" | + \partcombineApart c2^"apart" \once \partcombineChords e^"chord once" | c2 c | } -instrumentTwo = \relative c' { - c2 c | +instrumentTwo = \relative { + c'2 c | e2 e | a,2 c | c2 c' | @@ -1067,6 +1118,7 @@ instrumentTwo = \relative c' { @subsubsubheading Utilisation de @code{\partcombine} et paroles @cindex \partcombine et paroles +@cindex parloes et \partcombine La commande @code{\partcombine} n'est pas conçue pour traiter des paroles ; si l'une des voix est explicitement nommée, afin de lui @@ -1100,7 +1152,7 @@ Référence des propriétés internes : @knownissues Les différentes commandes @code{\partcombine@dots{}} ne prennent en charge que deux voix. De la même manière, le combinateur n'est pas -conçu pour travailler avec des paroles@tie{}; il s'arrête dès qu'il est +conçu pour travailler avec des paroles ; il s'arrête dès qu'il est explicitement fait appel à l'une des voix pour y attacher des paroles. @code{\partcombine@dots{}} ne peut s'inscrire ni dans un bloc @@ -1113,7 +1165,7 @@ plus d'une fois par mesure. @code{\partcombine} n'examine que l'attaque des notes. Il n'est donc pas en mesure de déterminer si une note attaquée précédemment est encore jouée ou non, ce qui peut engendrer quelques problèmes, entre autres des -indications de @qq{Solo} ou @qq{Unison} incorrectement placées. +indications de « Solo » ou « Unison » incorrectement placées. @code{\partcombine} conserve les objets étendus (liaisons, soufflets, etc.) dans la même voix de sorte à éviter qu'ils soient improprement ou @@ -1139,7 +1191,6 @@ Certaines considérations apparaissent aussi dans les chapitres @cindex musique entremêlée @funindex \parallelMusic -@funindex parallelMusic On peut écrire plusieurs voix de façon entremêlée. La fonction @code{\parallelMusic} prend en charge une liste des variables à créer, @@ -1154,12 +1205,12 @@ les mesures doivent être de longueur identique.} \parallelMusic #'(voiceA voiceB voiceC) { % Bar 1 r8 g'16 c'' e'' g' c'' e'' r8 g'16 c'' e'' g' c'' e'' | - r16 e'8.~ e'4 r16 e'8.~ e'4 | + r16 e'8.~ 4 r16 e'8.~ 4 | c'2 c'2 | % Bar 2 r8 a'16 d'' f'' a' d'' f'' r8 a'16 d'' f'' a' d'' f'' | - r16 d'8.~ d'4 r16 d'8.~ d'4 | + r16 d'8.~ 4 r16 d'8.~ 4 | c'2 c'2 | } @@ -1172,19 +1223,19 @@ les mesures doivent être de longueur identique.} Vous pouvez travailler en mode relatif. Notez cependant que la commande @code{\relative} n'apparaît pas au sein du bloc @code{\parallelMusic}. Le calcul des hauteurs relatives s'effectue voix par voix, et non au fil -des lignes saisies@tie{}; en d'autres termes, les notes de la +des lignes saisies ; en d'autres termes, les notes de la @code{voiceA} ignorent tout de celles de la @code{voiceB}. @lilypond[quote,verbatim] \parallelMusic #'(voiceA voiceB voiceC) { % Bar 1 r8 g16 c e g, c e r8 g,16 c e g, c e | - r16 e8.~ e4 r16 e8.~ e4 | + r16 e8.~ 4 r16 e8.~ 4 | c2 c | % Bar 2 r8 a,16 d f a, d f r8 a,16 d f a, d f | - r16 d8.~ d4 r16 d8.~ d4 | + r16 d8.~ 4 r16 d8.~ 4 | c2 c | } @@ -1195,7 +1246,7 @@ des lignes saisies@tie{}; en d'autres termes, les notes de la @end lilypond Ceci fonctionne bien avec la musique pour piano. L'exemple suivant -affecte quatre mesures à quatre variables@tie{}: +affecte quatre mesures à quatre variables : @lilypond[quote,verbatim] global = { diff --git a/Documentation/fr/notation/spacing.itely b/Documentation/fr/notation/spacing.itely index fad2e47bd3..f677b5c2d0 100644 --- a/Documentation/fr/notation/spacing.itely +++ b/Documentation/fr/notation/spacing.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- @ignore - Translation of GIT committish: d46572826e777ed3e9fa4656535a6e9000f2ed9e + Translation of GIT committish: 2034ca4fcbed9253b5a85e9360e47d3fe3ff1d09 - When revising a translation, copy the HEAD committish of the - version that you are working on. For details, see the Contributors' - Guide, node Updating translation committishes.. + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.22" @c Translators: Frédéric Chiasson, Jean-Charles Malahieude @@ -23,25 +23,6 @@ Negative numbers are allowed: > and prints page number -1 on the second page, for example. -In 5.2.1 the @refbugs (line 495 in spacing.itely on master) it -states: - -"@code{layout-set-staff-size} does not change the distance between -the staff lines." - -Could we add a sentence: -"Use instead the pair fontSize = #@var{N} - \override StaffSymbol.staff-space = #(magstep @var{N}) -inside the Staff context to change the size of the font and the -distance between staff lines accordingly." - -Actually I found, that the @internalsref{StaffSymbol} at line 481 -sends to an incomplete documentation. The property staff-space is not -explained here. I thought Y-extent might be of help, but it is in turn -explained by x-space which again is missing from the list. Who has the -knowledge to fix this? - - Clarify http://code.google.com/p/lilypond/issues/detail?id=68 @@ -62,7 +43,7 @@ partition. En pratique, cette procédure comporte quatre étapes. Dans un premier temps, des distances élastiques @emph{(springs)} sont déterminées sur la base des durées. Sont alors calculées différentes possibilités de saut -de ligne, chacune se voyant attribuer un @qq{coefficient de laideur}, +de ligne, chacune se voyant attribuer un « coefficient de laideur », puis est estimée la hauteur de chaque système. LilyPond opte enfin pour la combinaison entre sauts de page et de ligne qui offre la meilleure occupation de l'espace, tant horizontalement que verticalement. @@ -95,7 +76,7 @@ cependant rien : certains termes techniques ont une histoire particulière selon leur langue d'origine. Ainsi le vocable anglais @emph{Ragged} signifie en lambeau, en loques ; dans l'univers typographique, un maître français voit un alignement à gauche -- il dira -@qq{au fer à gauche} -- alors que son homologue anglophone constate un +« au fer à gauche » -- alors que son homologue anglophone constate un @emph{ragged-right} -- donc du vide à droite.} @@ -220,8 +201,8 @@ fonctions Scheme. Voici l'équivalent de l'exemple précédent : @seealso Manuel de notation : @ref{Format du papier et adaptation automatique}, +@ref{Le bloc layout}, @ref{Titrages personnalisés}. -@ref{Le bloc layout}. Fichiers d'initialisation : @file{ly/paper-defaults-init.ly}. @@ -305,7 +286,7 @@ appel à l'aide des fonctions @code{set-default-paper-size} et #(set-paper-size "mon format") @} @end example - + Les unités peuvent s'exprimer aussi bien en @code{in} (pouces), qu'en @code{cm} (centimètres) ou @code{mm} (millimètres). @@ -365,7 +346,7 @@ c'est une autre histoire dont nous parlerons plus tard et qui n'a rien à voir avec la mise à l'échelle. L'adaptation automatique affecte les dimensionnements verticaux -@code{top-margin} et @code{bottom-margin} -- voir +@code{top-margin} et @code{bottom-margin} -- voir @ref{Variables d'espacement vertical fixe} --, ainsi que les dimensionnements horizontaux @code{left-margin}, @code{right-margin}, @code{inner-margin}, @code{outer-margin}, @code{binding-offset}, @@ -381,8 +362,8 @@ correspondant au format par défaut -- papier A4 -- pour lequel @seealso Manuel de notation : -@ref{Variables d'espacement vertical fixe}, -@ref{Variables d'espacement horizontal}. +@ref{Variables d'espacement horizontal}, +@ref{Variables d'espacement vertical fixe}. Fichiers d'initialisation : @file{ly/paper-defaults-init.ly}, @@ -505,7 +486,7 @@ référence} de deux éléments, qui évite tout risque de collision en l'absence de dilatation ou compression. Le point de référence d'un titre ou d'un @emph{markup} est son sommet, celui d'un système est le centre vertical du @code{StaffSymbol} le plus proche -- même lorsqu'une -ligne de @qq{non-portée} viendrait à s'intercaler. Une +ligne de « non-portée » viendrait à s'intercaler. Une @code{basic-distance} inférieure à @code{padding} ou @code{minimum-distance} sera sans effet, dans la mesure où l'espacement résultant ne saurait être inférieur à @code{padding} ou @@ -522,7 +503,7 @@ inférieur au @code{padding}. @c TODO: explain skylines somewhere and xref to it from here. @item -@code{padding} @emph{(décalage)} -- la grandeur minimale de @qq{blanc} +@code{padding} @emph{(décalage)} -- la grandeur minimale de « blanc » qui sépare deux éléments, exprimée en hauteur de portée. On peut le voir comme la hauteur minimale d'un rectangle vide qui devrait s'étendre sur toute la largeur des deux éléments. @@ -574,7 +555,7 @@ deuxième redéfinit complètement la variable. @example \paper @{ - system-system-spacing #'basic-distance = #8 + system-system-spacing.basic-distance = #8 score-system-spacing = #'((padding . 1) @@ -711,19 +692,36 @@ aussi @code{check-consistency}. @item line-width @funindex line-width -la longueur d'un système musical sans indentation et justifié sur toute -la largeur de la page. La valeur par défaut est égale à +La longueur d'une ligne. Lorsque spécifié dans un bloc @code{\paper}, +ceci définit l'étendue horizontale dont disposeront les lignes de portée +d'un système non indenté. La valeur par défaut est égale à @code{paper-width}, auquel sont retranchés @code{left-margin} et @code{right-margin}. Lorsque vous définissez @code{line-width} sans modifier les valeurs de @code{left-margin} et @code{right-margin}, les marges seront alors recalculées de telle sorte que les systèmes soient -centrés. Voir aussi @code{check-consistency}. La variable -@code{line-width} peut se définir aussi dans un bloc @code{\layout}. +centrés. Voir aussi @code{check-consistency}. + +La valeur de @code{line-width} peut aussi se spécifier individuellement +au niveau de la partition, au sein d'un bloc @code{\layout}. Ceci +permet de contrôler la longueur des lignes partition par partition. Si +la longueur de ligne n'est pas spécifié dans une partition particulière, +elle sera valorisée à celle du @code{line-width} mentionné dans le bloc +@code{\paper}. La détermination de @code{line-width} pour un +@code{\score} particulier n'a aucun effet sur les marges. Les lignes +d'une portée dont la longueur est déterminée par le @code{line-width} +d'une partition seront alignées par la gauche sur la surface de papier +telle que définie par le @code{line-width} du bloc @code{\paper}. Dès +lors que les valeurs de @code{line-width} de la partition et du papier +sont égales, les lignes s'étendront de la marge gauche à la marge +droite. En cas de @code{line-width} de la partition supérieur au +@code{line-width} du papier, les lignes de portée déborderont dans la +marge de droite. + @item left-margin @funindex left-margin -la marge entre le bord gauche de la feuille et le début de chaque +La marge entre le bord gauche de la feuille et le début de chaque système. La valeur par défaut est de @code{10\mm} ; elle sera ajustée selon le format du papier. Lorsque vous définissez @code{line-width} et @code{right-margin} sans modifier la valeur de @@ -742,7 +740,7 @@ La marge entre le bord droit de la page et la fin des systèmes en pleine largeur (non @emph{ragged}). La valeur par défaut est de @code{10\mm} et s'ajustera selon le format du papier. Lorsque vous définissez @code{line-width} et @code{left-margin}, sans modifier la valeur de -@code{right-margin}, cette dernière sera alors égale à +@code{right-margin}, cette dernière sera alors égale à @code{(paper-width @minus{} line-width @minus{} left-margin)}. Lorsque seule @code{line-width} est définie, les deux marges correspondent à @@ -759,7 +757,9 @@ l'addition de ces trois éléments ne dépassera pas la largeur du papier (@code{paper-width}). La valeur par défaut est @code{#t}. Dans le cas d'une incohérence, un message d'avertissement est émis et les trois variables -- marges et longueur de ligne -- rétablies à leur -valeur par défaut (ajustées selon le format du papier). +valeur par défaut (ajustées selon le format du papier). La +désactivation de cette variable (valorisation à @code{#f}, toute +incohérence sera ignorée, et les systèmes pourront déborder de la page. @item ragged-right @funindex ragged-right @@ -767,7 +767,7 @@ valeur par défaut (ajustées selon le format du papier). Lorsque cette variable est activée, les systèmes ne s'étendront pas sur la longueur de la ligne, mais s'arrêteront à leur longueur normale. La valeur par défaut est @code{#f} mais, si la partition ne comporte -qu'un seul système, elle passe à @code{#t}. Cette variable peut aussi +qu'un seul système, elle passe à @code{#t}. Cette variable peut aussi se gérer au sein d'un bloc @code{\layout}. @item ragged-last @@ -875,17 +875,20 @@ de @code{0.0\mm}. @funindex indent Le niveau d'indentation du premier système d'une partition. La valeur -par défaut est de @code{15\mm} et s'ajustera selon le format du -papier. Cette variable peut aussi se gérer au sein d'un bloc -@code{\layout}. +par défaut est de @code{15\mm} en A4 et s'ajustera selon le format du +papier. L'espace correspondant à @code{line-width} est réduit d'autant +pour le premier système. Cette variable peut aussi se gérer partition +par partition au sein d'un bloc @code{\layout}. @item short-indent @funindex short-indent Le niveau d'indentation de tous les systèmes hormis le premier. La -valeur par défaut est de @code{0}, et s'ajustera selon le format du -papier dès lors que vous lui aurez affecté une valeur. Cette -variable peut aussi se gérer au sein d'un bloc @code{\layout}. +valeur par défaut est de @code{0} pour du A4, et s'ajustera selon le +format du papier dès lors que vous lui aurez affecté une valeur. Bien +entendu, l'espace spécifié par @code{line-width} sera réduit d'autant. +Cette variable peut aussi se gérer partition par partition, au sein d'un +bloc @code{\layout}. @end table @@ -968,13 +971,13 @@ Les valeurs par défaut sont définies dans le fichier L'algorithme de calcul des sauts de page à utiliser. Vous avez le choix entre @code{ly:minimal-breaking}, @code{ly:page-turn-breaking}, -@code{ly:one-line-breaking} et @code{ly:optimal-breaking} (activé -par défaut). +@code{ly:one-line-breaking}, @code{ly:one-line-auto-height-breaking} et +@code{ly:optimal-breaking} (activé par défaut). @item page-breaking-system-system-spacing @funindex page-breaking-system-system-spacing -Cette variable permet de @qq{tromper} l'algorithme de gestion des sauts +Cette variable permet de « tromper » l'algorithme de gestion des sauts de page quant à la valeur de @code{system-system-spacing}. Ainsi, lorsque @code{page-breaking-system-system-spacing #'padding} a une valeur nettement supérieure à @code{system-system-spacing #'padding}, @@ -1019,7 +1022,7 @@ autres choix. Pénalité pour apparition d'une page blanche en cours de partition. L'attribution d'une valeur élevée à @code{blank-page-penalty} alors qu'a été activé @code{ly:page-turn-breaking} forcera -LilyPond à éviter de placer une page blanche au mileu de la +LilyPond à éviter de placer une page blanche au mileu de la partition, quitte à espacer d'autant plus la musique pour remplir cette page blanche et la suivante. La valeur par défaut est de @code{5}. @@ -1047,11 +1050,11 @@ valeur par défaut est de @code{2}. @seealso Manuel de notation : -@ref{Sauts de page}, +@ref{Minimisation des sauts de page}, @ref{Optimisation des sauts de page}, @ref{Optimisation des tournes}, -@ref{Minimisation des sauts de page}, -@ref{Présentation en rouleau}. +@ref{Présentation en rouleau}, +@ref{Sauts de page}. Fichiers d'initialisation : @file{ly/paper-defaults-init.ly}. @@ -1096,6 +1099,14 @@ première. La valeur par défaut est @code{#f}. La désactivation de cette variable permet d'obtenir des pages non numérotées. La valeur par défaut est @code{#t}. +@cindex page, numérotation en chiffres romains +@item page-number-type +@funindex page-number-type + +Le type de chiffres à utiliser pour la numérotation : @code{roman-lower} +(romains minuscules), @code{roman-upper} (romains majuscules) ou +@code{arabic} (arabes). La valeur par défaut est @code{'arabic}. + @end table @seealso @@ -1151,7 +1162,7 @@ courant : tagline = ##f } \score { - \relative c'' { c1 \break c1 \break c1 } + \relative { c''1 \break c1 \break c1 } } } @end lilypond @@ -1217,8 +1228,9 @@ La fonction @code{layout-set-staff-size} fait l'objet de la rubrique suivante, @ref{Définition de la taille de portée}. La modification des contextes est abordée dans d'autres chapitres -- voir @ref{Modification des greffons de contexte} et -@ref{Modification des réglages par défaut d'un contexte}. Les variables -du bloc @code{\paper} que l'on peut retrouver dans un bloc +@ref{Modification des réglages par défaut d'un contexte}. + +Les variables du bloc @code{\paper} que l'on peut retrouver dans un bloc @code{\layout} sont : @itemize @@ -1369,10 +1381,19 @@ Morceaux choisis : @cindex fonte, définition de la taille @cindex portée, définition de la taille @funindex layout file +@funindex magnification->font-size +@funindex magstep +@funindex set-global-staff-size +@funindex layout-set-staff-size La @strong{taille de portée} @emph{(staff size)} est fixée par défaut à -20 points. Il existe deux manières de la modifier : +20 points, ce qui correspond à 7,03 cm -- 1 point équivaut à +100/7227 pouce, soit 2 540/7 227 mm. Il existe trois manières de la +modifier : + +@enumerate +@item La taille des portées peut se définir globalement pour toutes les partitions d'un même fichier, ou plus précisément d'un bloc @code{\book}, à l'aide de @code{set-global-staff-size}. @@ -1382,21 +1403,67 @@ partitions d'un même fichier, ou plus précisément d'un bloc @end example @noindent -Ceci définit donc la hauteur des portées à 14 points par +Ceci définit donc la hauteur des portées à 14 points (4,92 mm) par défaut ; toutes les fontes seront ajustées en conséquence. -Vous pouvez aussi spécifier une taille à une partition en particulier en -procédant comme ci-dessous : +@item +La taille d'une partition particulière au sein d'un ouvrage se définit à +l'aide d'un @code{layout-set-staff-size} placé dans le bloc +@code{\layout} approprié : @example \score@{ @dots{} \layout@{ - #(layout-set-staff-size 15) + #(layout-set-staff-size 14) @} @} @end example +@item +L'affectation d'une taille particulière à l'une des portées d'un +système, LilyPond dispose de la commande @code{\magnifyStaff}. Par +exemple, les partitions traditionnelles de musique de chambre avec piano +présentaient souvent des portées de piano de 7 mm alors que les autres +portées étaient gravées à une hauteur de cinq septièmes (s'il y avait +assez de place) ou trois cinquièmes (en cas de présentation resserrée) +de cette hauteur. Une proportion de 5/7 s'obtient se libelle ainsi : + +@example +\score @{ + << + \new Staff \with @{ + \magnifyStaff #5/7 + @} @{ @dots{} @} + \new PianoStaff @{ @dots{} @} + >> +@} +@end example + +Si la valeur de @code{fontSize} à utiliser est connue, la forme suivante +peut s'employer : + +@example +\score @{ + << + \new Staff \with @{ + \magnifyStaff #(magstep -3) + @} @{ @dots{} @} + \new PianoStaff @{ @dots{} @} + >> +@} +@end example + +Mieux vaut éviter de réduire l'épaisseur des lignes si l'on veut que la +partition s'approche au plus près des canons de la gravure +traditionnelle. + +@end enumerate + + +@subheading Relation automatique entre fonte et taille +@c VO Automatic font weight at different sizes + La fonte Feta fournit les symboles musicaux dans huit tailles différentes. Chaque fonte correspond à une hauteur particulière de portée ; les petites tailles comportent des symboles plus épais @@ -1404,63 +1471,19 @@ pour être cohérent avec l'épaisseur relativement plus importante des lignes de la portée. Le tableau suivant répertorie les différentes tailles de police. -@quotation @multitable @columnfractions .15 .2 .22 .2 -@item @b{nom de la fonte} -@tab @b{hauteur de portée (pt)} -@tab @b{hauteur de portée (mm)} -@tab @b{utilisation} - -@item feta11 -@tab 11,22 -@tab 3,9 -@tab format de poche - -@item feta13 -@tab 12,60 -@tab 4,4 -@tab - -@item feta14 -@tab 14,14 -@tab 5,0 -@tab - -@item feta16 -@tab 15,87 -@tab 5,6 -@tab - -@item feta18 -@tab 17,82 -@tab 6,3 -@tab carnet de chant - -@item feta20 -@tab 20 -@tab 7,0 -@tab partition standard - -@item feta23 -@tab 22,45 -@tab 7,9 -@tab - -@item feta26 -@tab 25,2 -@tab 8,9 -@tab -@c matériel de location moderne ? +@item @b{nom de la fonte} @tab @b{hauteur de portée (pt)} @tab @b{hauteur de portée (mm)} @tab @b{utilisation} +@item feta11 @tab 11,22 @tab 3,9 @tab format de poche +@item feta13 @tab 12,60 @tab 4,4 @tab +@item feta14 @tab 14,14 @tab 5,0 @tab +@item feta16 @tab 15,87 @tab 5,6 @tab +@item feta18 @tab 17,82 @tab 6,3 @tab carnet de chant +@item feta20 @tab 20 @tab 7,0 @tab partition standard +@item feta23 @tab 22,45 @tab 7,9 @tab +@item feta26 @tab 25,2 @tab 8,9 @tab @c matériel de location moderne ? @end multitable -@end quotation - -Ces fontes sont disponibles dans toutes les tailles. La propriété de -contexte @code{fontSize} ainsi que la propriété de mise en forme -@code{staff-space} (voir @rinternals{StaffSymbol}) permettent d'ajuster -individuellement la taille de chaque portée. La taille de chacune des -portées est relative à la taille globale. @seealso Manuel de notation : @@ -1481,12 +1504,6 @@ lignes d'une portée. @menu * Sauts de ligne:: * Sauts de page:: -* Optimisation des sauts de page:: -* Optimisation des tournes:: -* Minimisation des sauts de page:: -* Présentation en rouleau:: -* Sauts explicites:: -* Recours à une voix supplémentaire pour gérer les sauts:: @end menu @@ -1494,8 +1511,14 @@ lignes d'une portée. @subsection Sauts de ligne @translationof Line breaking -@cindex saut de ligne +@cindex saut de ligne manuel @cindex ligne, passer à la suivante +@funindex \break +@funindex \noBreak +@funindex \autoBreaksOff +@funindex \autoBreaksOn +@funindex \autoLineBreaksOff +@funindex \autoLineBreaksOn Les sauts de ligne sont normalement gérés de façon automatique. Ils interviennent de telle sorte qu'une ligne ne soit ni trop resserrée, ni @@ -1503,30 +1526,35 @@ trop aérée, et que des lignes consécutives aient à peu près la même densité. Vous pouvez cependant insérer l'instruction @code{\break} à l'endroit où -vous le jugez utile pour @qq{forcer} le passage à la ligne suivante : +vous le jugez utile pour « forcer » le passage à la ligne suivante : -@lilypond[quote,ragged-right,relative=2,verbatim] -c4 c c c | \break -c4 c c c | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c c | \break + c4 c c c | +} @end lilypond Par défaut, un saut de ligne ne saurait intervenir au beau milieu d'une -mesure ; LilyPond vous le signalera par un message si tel était le -cas. Si d'aventure vous voulez forcer un saut de ligne en l'absence de -barre de mesure, vous devrez auparavant insérer une barre invisible -- à -l'aide de @code{\bar ""}. - -@lilypond[quote,ragged-right,relative=2,verbatim] -c4 c c -\bar "" \break -c | -c4 c c c | +mesure ; LilyPond vous le signalera par un message lors de la +compilation du fichier. Si d'aventure vous voulez forcer un saut de +ligne en l'absence de barre de mesure, vous devrez auparavant insérer +une barre invisible -- à l'aide de @code{\bar ""}. + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c + \bar "" + \break + c | + c4 c c c | +} @end lilypond LilyPond ignorera un @code{\break} placé sur une barre à la fin d'une mesure dès lors que la précédente avait une note en suspend -- c'est -typiquement le cas lorsqu'un nolet est à cheval sur deux mesures. -L'instruction @code{\break} sera alors opérationnelle si vous avez +typiquement le cas lorsqu'un n-olet est à cheval sur deux mesures. +L'instruction @code{\break} sera toutefois opérationnelle si vous avez auparavant désactivé le @code{Forbid_line_break_engraver} du contexte @code{Voice} concerné. Notez bien qu'en pareil cas, les sauts de ligne forcés doivent être saisis au sein d'une expression polyphonique : @@ -1534,9 +1562,9 @@ forcés doivent être saisis au sein d'une expression polyphonique : @lilypond[quote,ragged-right,verbatim] \new Voice \with { \remove "Forbid_line_break_engraver" -} \relative c'' { +} \relative { << - { c2. \tuplet 3/2 { c4 c c } c2. | } + { c''2. \tuplet 3/2 { c4 c c } c2. | } { s1 | \break s1 | } >> } @@ -1546,15 +1574,34 @@ Selon le même principe, un saut de ligne ne peut intervenir alors qu'une ligature s'étend sur deux mesures consécutives. Il faut en ce cas là introduire la dérogation @w{@code{\override Beam.breakable = ##t}}. -@lilypond[quote,ragged-right,relative=2,verbatim] -\override Beam.breakable = ##t -c2. c8[ c | \break -c8 c] c2. | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \override Beam.breakable = ##t + c2. c8[ c | \break + c8 c] c2. | +} @end lilypond L'instruction opposée, @code{\noBreak}, interdira toute tentative de saut de ligne à la fin de la mesure où elle est explicitée. +Au sein même d'une pièce, les sauts de lignes automatiques sont inhibés +dans la musique encadrée par les commandes @code{\autoLineBreaksOff} et +@code{\autoLineBreaksOn}. Dans le cas où les sauts de pages +automatiques devraient eux aussi être inhibés, ce sont les commandes +@code{\autoBreaksOff} et @code{\autoBreaksOn} qu'il faudrait utiliser. +Les sauts de ligne ou de page manuels ne sont pas affectés par ces +commandes. Notez bien que la désactivation du positionnement +automatique des sauts des ligne peut avoir pour effet un débordement de +la musique dans la marge de droite si tout ne peut être contenu sur une +ligne. + +Des sauts de ligne automatiques peuvent cependant être autorisés en un +point particulier à l'aide d'un @code{\once \autoLineBreaksOn} sur une +barre de mesure. Ceci ne concerne pas les sauts de page. Ceci indique +qu'un saut de ligne peut intervenir à cet endroit précis, mais ne le +force en aucun cas. + LilyPond dispose de deux variables de base pour influencer l'espacement au niveau des lignes. Toutes deux se définissent dans un bloc @code{\layout}, @code{indent} réglant l'indentation de la première @@ -1599,14 +1646,22 @@ ailleurs : @end example @predefined -@funindex \break @code{\break}, -@funindex \noBreak -@code{\noBreak}. +@code{\noBreak}, +@code{\autoBreaksOff}, +@code{\autoBreaksOn}, +@code{\autoLineBreaksOff}, +@code{\autoLineBreaksOn}. @endpredefined +@snippets + +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{using-an-extra-voice-for-breaks.ly} + @seealso Manuel de notation : +@ref{Le bloc layout}, @ref{Variables de gestion des sauts de ligne}. Référence des propriétés internes : @@ -1615,33 +1670,68 @@ Référence des propriétés internes : Morceaux choisis : @rlsrnamed{Spacing,Espacements}. +@knownissues + +Les commandes @code{\autoLineBreaksOff} et @code{\autoBreaksOff} doivent +impérativement se placer après le début de la musique pour éviter tout +message d'erreur. + @node Sauts de page @subsection Sauts de page @translationof Page breaking +Cette section présente les différentes méthodes de gestion des sauts de +page, ainsi que les moyens de les modifier. + +@menu +* Saut de page manuel:: +* Optimisation des sauts de page:: +* Minimisation des sauts de page:: +* Présentation en ligne continue:: +* Présentation en rouleau:: +* Optimisation des tournes:: +@end menu + + +@node Saut de page manuel +@unnumberedsubsubsec Saut de page manuel +@translationof Manual page breaking + +@cindex manuel, saut de page +@funindex \pageBreak +@funindex \noPageBreak +@funindex \autoPageBreaksOn +@funindex \autoPageBreaksOff + La gestion automatique des sauts de page se contrôle à l'aide des commandes @code{\pageBreak} et @code{\noPageBreak}. Ces commandes fonctionnent de manière analogue à @code{\break} et @code{\noBreak} pour les sauts de ligne et se placent donc au moment d'une barre de mesure. -Elles permettent de forcer, ou d'interdire, un saut de page à l'endroit -indiqué. Comme on peut s'y attendre, @code{\pageBreak} force le saut de -ligne. +Elles permettent de forcer, ou d'interdire, un saut de page à la +prochaine barre de mesure. Comme on peut s'y attendre, +@code{\pageBreak} force aussi le saut de ligne. Les commandes @code{\pageBreak} et @code{\noPageBreak} peuvent se trouver à des niveaux supérieurs, entre deux partitions ou @emph{markups} de premier rang. +Au sein même d'une pièce, les sauts de page automatiques sont inhibés +dans la musique encadrée par les commandes @code{\autoPageBreaksOff} et +@code{\autoPageeBreaksOn}. Les sauts de page manuels ne sont pas +affectés par ces commandes. + Tout comme @code{ragged-right} et @code{ragged-last} qui permettent de gérer la répartition horizontale, LilyPond dispose de commutateurs -équivalents au niveau de la verticalité : @code{ragged-bottom} et -@code{ragged-last-bottom}. Lorsqu'ils sont tous deux activés -- -affectés de @code{#t} -- les systèmes ne seront pas répartis sur les -pages y compris la dernière. Pour de plus amples détails, reportez-vous -à @ref{Variables d'espacement vertical fixe}. +équivalents au niveau de la verticalité. @code{ragged-bottom}, une fois +activé, empèchera les systmèes de se répartir sur la page. Quant à +@code{ragged-last-bottom} (valorisé à @code{#t} par défaut), il laissera +un espace vide en dernière page, y compris pour cahque @code{\bookpart}. +Pour de plus amples détails, reportez-vous à +@ref{Variables d'espacement vertical fixe}. Les sauts de page sont générés par la fonction @code{page-breaking}. -LilyPond dispose de trois différents algorithmes en la matière : +LilyPond dispose de plusieurs algorithmes en la matière : @code{ly:optimal-breaking}, @code{ly:page-turn-breaking} et @code{ly:minimal-breaking}. C'est @code{ly:optimal-breaking} qui est activé par défaut, mais rien ne vous empêche d'en changer, par @@ -1689,10 +1779,10 @@ sections. @end example @predefined -@funindex \pageBreak @code{\pageBreak}, -@funindex \noPageBreak -@code{\noPageBreak}. +@code{\noPageBreak}, +@code{\autoPageBreaksOn}, +@code{\autoPageBreaksOff}. @endpredefined @seealso @@ -1702,9 +1792,19 @@ Manuel de notation : Morceaux choisis : @rlsrnamed{Spacing,Espacements}. +@knownissues + +Le préfixe @code{\once} est ineffectif en ce qui concerne les commandes +@code{\autoPageBreaksOn} et @code{\autoPageBreaksOff}. Si le +positionnement automatique des sauts de page est désactivé et qu'il est +réactivé pour permettre un saut de page, il doit le rester pendant +quelques mesures (le nombre précis de mesures dépendant de la pièce) +avant d'être à nouveau désactivé, autrement l'opportunité de passer à la +page suivante ne sera pas saisie. + @node Optimisation des sauts de page -@subsection Optimisation des sauts de page +@unnumberedsubsubsec Optimisation des sauts de page @translationof Optimal page breaking @funindex ly:optimal-breaking @@ -1713,15 +1813,80 @@ LilyPond, pour déterminer où placer un saut de page, utilise par défaut la fonction @code{ly:optimal-breaking}. Celle-ci tend à trouver une rupture qui évite d'obtenir à la fois une page trop dense ou exagérément aérée. Contrairement à la fonction @code{ly:page-turn-breaking}, elle -n'a aucune notion de ce qu'est une @qq{tourne}. +n'a aucune notion de ce qu'est une « tourne ». @seealso Morceaux choisis : @rlsrnamed{Spacing,Espacements}. +@node Minimisation des sauts de page +@unnumberedsubsubsec Minimisation des sauts de page +@translationof Minimal page breaking + +@funindex ly:minimal-breaking + +La fonction @code{ly:minimal-breaking} est celle qui réalise le moins de +calculs pour positionner les sauts de page. Elle mettra le plus de +systèmes possible sur une page avant de passer à la suivante. On peut +donc la préférer lorsque la partition s'étend sur beaucoup de pages ou +lorsque les autres fonctions de gestion des sauts de page ralentissent +nettement le traitement, sont trop gourmandes en mémoire ou qu'il y a +beaucoup de texte. Il suffit de la mentionner au sein du bloc +@code{\paper} : + +@example +\paper @{ + page-breaking = #ly:minimal-breaking +@} +@end example + +@seealso +Morceaux choisis : +@rlsrnamed{Spacing,Espacements}. + + +@node Présentation en ligne continue +@unnumberedsubsubsec Présentation en ligne continue +@translationof One-line page breaking + +@funindex ly:one-line-breaking + +La fonction @code{ly:one-line-breaking} constitue un algorithme de +calcul des sauts de pages particulier en ceci que chaque partition fait +l'objet d'une page unique, d'une seule ligne. Cette fonctionnalité +s'affranchit de l'impression des titres et marges ; seule la partition +est affichée. + +La largeur de page est ajustée de telle sorte que la pièce la plus +longue tienne sur une seule ligne. En particulier, les variables +@code{paper-width}, @code{line-width} et @code{indent} du bloc +@code{\paper} seront ignorées ; les @code{left-margin} et +@code{right-margin} seront honorées. La hauteur de page ne sera pas +modifiée. + + +@node Présentation en rouleau +@unnumberedsubsubsec Présentation en rouleau +@translationof One-line-auto-height page breaking + +@funindex ly:one-line-auto-height-breaking + +La fonction @code{ly:one-line-auto-height-breaking} opère comme +@code{ly:one-line-breaking}, à ceci près que la hauteur de page s'adapte +automatiquement à la hauteur de la musique. Dans les faits, la variable +@code{paper-height} du bloc @code{\paper} s'ajuste de façon à englober +la hauteur de la partition la plus étendue, plus les @code{top-margin} +et @code{bottom-margin}. + +L'affectation d'une valeur à @code{top-system-spacing} influencera le +positionnement vertical de la musique. Sa désactivation -- valorisation +à @code{##f} au sein du bloc @code{\paper} -- aura pour effet de +simplement placer la musique entre les marges supérieure et inférieure. + + @node Optimisation des tournes -@subsection Optimisation des tournes +@unnumberedsubsubsec Optimisation des tournes @translationof Optimal page turning @funindex ly:page-turn-breaking @@ -1753,7 +1918,7 @@ d'une portée polyphonique dont l'une des parties contiendrait des silences. Lorsqu'il rencontre un fragment suffisamment long ne contenant aucune note, il insère un @code{\allowPageTurn} à la barre terminant ce fragment, à moins qu'il ne rencontre en chemin une -@qq{barre spéciale} -- telle une double barre -- auquel cas il y +« barre spéciale » -- telle une double barre -- auquel cas il y déposera le @code{\allowPageTurn}. @funindex minimumPageTurnLength @@ -1783,8 +1948,8 @@ la manière suivante : Le @code{Page_turn_engraver} tient compte des reprises. C'est pourquoi il ne permettra une tourne que dans le cas où il y aura suffisamment de -temps au début et à la fin de la reprise pour que l'exécutant ait le -temps de revenir à la page précédente. Le @code{Page_turn_engraver} est +temps au début et à la fin de la reprise pour que l'exécutant puisse +aisément revenir à la page précédente. Le @code{Page_turn_engraver} est même capable d'interdire un tourne dans le cas d'une reprise de courte durée, ajustable au travers de la propriété de contexte @code{minimumRepeatLengthForPageTurn}. @@ -1814,209 +1979,6 @@ Une partition ne devrait contenir qu'une seule instance du @code{Page_turn_engraver}, au risque de les voir se contredire. -@node Minimisation des sauts de page -@subsection Minimisation des sauts de page -@translationof Minimal page breaking - -@funindex ly:minimal-breaking - -La fonction @code{ly:minimal-breaking} est celle qui réalise le moins de -calculs pour positionner les sauts de page. Elle mettra le plus de -systèmes possible sur une page avant de passer à la suivante. On peut -donc la préférer lorsque la partition s'étend sur beaucoup de pages ou -lorsque les autres fonctions de gestion des sauts de page ralentissent -nettement le traitement, sont trop gourmandes en mémoire ou qu'il y a -beaucoup de texte. Il suffit de la mentionner au sein du bloc -@code{\paper} : - -@example -\paper @{ - page-breaking = #ly:minimal-breaking -@} -@end example - -@seealso -Morceaux choisis : -@rlsrnamed{Spacing,Espacements}. - - -@node Présentation en rouleau -@subsection Présentation en rouleau -@translationof One-line page breaking - -@funindex ly:one-line-breaking - -La fonction @code{ly:one-line-breaking} constitue un algorithme de -calcul des sauts de pages particulier en ceci que chaque partition fait -l'objet d'une page unique, d'une seule ligne. Cette fonctionnalité -s'affranchit de l'impression des titres et marges ; seule la partition -est affichée. - -La largeur de page est ajustée de telle sorte que la pièce la plus -longue tienne sur une seule ligne. En particulier, les variables -@code{paper-width}, @code{line-width} et @code{indent} du bloc -@code{\paper} seront ignorées ; les @code{left-margin} et -@code{right-margin} seront honorées. La hauteur de page ne sera pas -modifiée. - - -@node Sauts explicites -@subsection Sauts explicites -@translationof Explicit breaks - -Il arrive parfois que LilyPond rejette des @code{\break} ou des -@code{\pageBreak} explicites. Vous pouvez alors prendre le contrôle -avec ces deux instructions dérogatoires : - -@example -\override NonMusicalPaperColumn.line-break-permission = ##f -\override NonMusicalPaperColumn.page-break-permission = ##f -@end example - -Lorsque vous désactivez @code{line-break-permission}, LilyPond -ne passera à la ligne suivante qu'en présence d'un @code{\break} -explicite, et nulle part ailleurs. De la même façon, la désactivation -de @code{page-break-permission} aura pour conséquence que LilyPond ne -changera de page que lorsqu'il rencontrera un @code{\pageBreak}, et -nulle part ailleurs. - -@lilypond[quote,verbatim] -\paper { - indent = #0 - ragged-right = ##t - ragged-bottom = ##t -} - -music = \relative c'' { c8 c c c } - -\score { - \new Staff { - \repeat unfold 2 { \music } \break - \repeat unfold 4 { \music } \break - \repeat unfold 6 { \music } \break - \repeat unfold 8 { \music } \pageBreak - \repeat unfold 8 { \music } \break - \repeat unfold 6 { \music } \break - \repeat unfold 4 { \music } \break - \repeat unfold 2 { \music } - } - \layout { - \context { - \Score - \override NonMusicalPaperColumn.line-break-permission = ##f - \override NonMusicalPaperColumn.page-break-permission = ##f - } - } -} -@end lilypond - -@seealso -Morceaux choisis : -@rlsrnamed{Spacing,Espacements}. - - -@node Recours à une voix supplémentaire pour gérer les sauts -@subsection Recours à une voix supplémentaire pour gérer les sauts -@translationof Using an extra voice for breaks - -La plupart du temps, les informations concernant les sauts de ligne ou -de page se retrouvent directement au milieu des notes. - -@example -musique = \relative c'' @{ c4 c c c @} - -\score @{ - \new Staff @{ - \repeat unfold 2 @{ \musique @} \break - \repeat unfold 3 @{ \musique @} - @} -@} -@end example - -Bien que cela constitue un moyen aisé de saisir les commandes -@code{\break} et @code{\pageBreak}, les données musicales se retrouvent -mélangées à des informations qui concernent plutôt l'agencement de la -musique sur le papier. Vous pouvez tout à fait séparer ce qui est -purement musical et les informations concernant les sauts de ligne ou de -page en créant une voix supplémentaire dédiée. Cette voix spécifique -ne contiendra que des blancs -- des silences invisibles @code{\skip} --, -des @code{\break}, des @code{\pageBreak} et autres informations -concernant les ruptures. - -@lilypond[quote,verbatim] -music = \relative c'' { c4 c c c } - -\header { tagline = ##f } -\paper { left-margin = 0\mm } -\book { - \score { - \new Staff << - \new Voice { - s1 * 2 \break - s1 * 3 \break - s1 * 6 \break - s1 * 5 \break - } - \new Voice { - \repeat unfold 2 { \music } - \repeat unfold 3 { \music } - \repeat unfold 6 { \music } - \repeat unfold 5 { \music } - } - >> - } -} -@end lilypond - -Cette manière de procéder est tout à fait indiquée lorsque vous ajustez -les @code{line-break-system-details} et autres propriétés fort -intéressantes de @code{NonMusicalPaperColumnGrob}, comme vous pouvez -le voir au chapitre @ref{Espacement vertical}. - -@lilypond[quote,verbatim] -music = \relative c'' { c4 c c c } - -\header { tagline = ##f } -\paper { left-margin = 0\mm } -\book { - \score { - \new Staff << - \new Voice { - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 0)) - s1 * 2 \break - - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 5)) - s1 * 3 \break - - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 15)) - s1 * 6 \break - - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 30)) - s1 * 5 \break - } - \new Voice { - \repeat unfold 2 { \music } - \repeat unfold 3 { \music } - \repeat unfold 6 { \music } - \repeat unfold 5 { \music } - } - >> - } -} -@end lilypond - -@seealso -Manuel de notation : -@ref{Espacement vertical}. - -Morceaux choisis : -@rlsrnamed{Spacing,Espacements}. - - @node Espacement vertical @section Espacement vertical @translationof Vertical spacing @@ -2111,7 +2073,7 @@ de portées particulier. Les propriétés qui leur sont attachées sont abordées en fin de section. Le nom de ces propriétés, sauf @code{staff-affinity}, suit le schéma -@code{@var{item1}-@var{item2}-spacing} -- @code{@var{item1}} et +@w{@code{@var{item1}-@var{item2}-spacing}} -- @code{@var{item1}} et @code{@var{item2}} étant les éléments à espacer. Notez bien que @code{@var{item2}} n'est pas forcément placé au-dessous : c'est le cas pour la propriété @code{nonstaff-relatedstaff-spacing} qui spécifie @@ -2155,7 +2117,7 @@ lowerCaseChords = \with { } labelContext = #(define-music-function - (parser location context) + (context) (string?) #{ s1*0^\markup { \upright {\typewriter #context } } #}) @@ -2311,23 +2273,12 @@ la valeur de @code{staff-affinity} est égale à @code{CENTER}, la valeur de @code{nonstaff-relatedstaff-spacing} servira à centrer la ligne de non-portée entre les deux portées adjacentes même si une autre non-portée est présente (quelque soit le côté). Le positionnement -d'une ligne de non-portée dépend donc à la fois des portées tout -comme des autres lignes de non-portée adjacentes. L'affectation -d'une faible valeur à la propriété @code{stretchability} de l'un -de ces types d'espacement les avantagera ; leur affecter une -grande valeur aura pour conséquence de diminuer leur influence. - -@c FIXME -@c traduction approximative des dernières phrases, qui manquent de -@c précision : QUI EST AVANTAGÉ OU NON ? -@ignore - This means that the placement of a non-staff line depends -on both the surrounding staves and the surrounding non-staff lines. -Setting the @code{stretchability} of one of these types of spacing to -a small value will make that spacing dominate. Setting the -@code{stretchability} to a large value will make that spacing have -little effect. -@end ignore +d'une ligne de non-portée dépend donc à la fois des portées qui +l'entourent tout comme des autres lignes de non-portée adjacentes. +L'affectation d'une faible valeur à la propriété @code{stretchability} +de l'un de ces types d'espacement l'avantagera ; lui affecter une +valeur élevée aura pour conséquence de diminuer l'influence de +l'espacement considéré. @item nonstaff-nonstaff-spacing Il s'agit de la distance entre deux lignes de non-portée selon @@ -2371,8 +2322,8 @@ regroupement a été ajustée au niveau de son propre @seealso Manuel de notation : -@ref{Variables d'espacement vertical fluctuant}, -@ref{Modification de listes associatives}. +@ref{Modification de listes associatives}, +@ref{Variables d'espacement vertical fluctuant}. Fichiers d'initialisation : @file{ly/engraver-init.ly}, @@ -2389,7 +2340,7 @@ Référence des propriétés internes : @translationof Spacing of ungrouped staves Les @code{Staff}, @code{DrumStaff}, @code{TabStaff} entre autres sont -des contextes de @qq{portée} pouvant contenir plusieurs voix, mais pas +des contextes de « portée » pouvant contenir plusieurs voix, mais pas une portée. L'espacement de ces @i{portées isolées} est géré par les propriétés @@ -2468,14 +2419,14 @@ Référence des propriétés internes : Dans les partitions orchestrales ou de grande ampleur, il arrive souvent que des portées soient regroupées. L'espacement est alors plus important entre deux regroupements qu'entre les portées d'un même -groupe. +groupe. Les @i{regroupements de portées} tels le @code{StaffGroup} ou le @code{ChoirStaff} sont des contextes qui peuvent contenir simultanément une ou plusieurs portées. L'espacement entre les portées d'un même regroupement est géré par les -propriétés suivantes : +propriétés suivantes : @itemize @item Propriétés du @code{VerticalAxisGroup} : @@ -2541,7 +2492,8 @@ Les @i{lignes de non-portée}, comme les @code{Lyrics} ou les @code{ChordNames} sont des contextes dont les objets de rendu sont gravés à l'instar des portées -- une ligne horizontale dans un système. En fait, les lignes de non-portée sont des contextes qui vont créer un -objet de rendu @code{VerticalAxisGroup}. +objet de rendu @code{VerticalAxisGroup} auxquel est attaché le +@rinternals{Axis_group_engraver}. L'espacement des lignes de non-portée est géré par les propriétés suivantes : @@ -2700,9 +2652,9 @@ Cette partition isole les informations de saut de ligne ou de page dans une voix spécifique. La mise en forme est ainsi séparée des événements musicaux ; ceci nous permettra d'y voir plus clair au fur et à mesure que nous avancerons. Pour plus de précisions, relisez -@ref{Recours à une voix supplémentaire pour gérer les sauts}. +@ref{Sauts}. -Les @code{\break} explicites répartissent la musique en lignes de six +Les @code{\break} explicites répartissent la musique en lignes de cinq mesures chacune. L'espacement vertical est celui que LilyPond attribue par défaut. Nous pouvons, afin de fixer explicitement le point d'attache vertical de chacun des systèmes, définir un doublet @@ -2860,7 +2812,7 @@ Vous savez de manière intuitive qu'un certain nombre d'objets en matière de notation musicale appartiennent à la portée, et que d'autres se placent en dehors de la portée. Entre autres objets externes, nous avons les marques repères, les textes et les -nuances ; nous les appellerons @qq{objets extérieurs à la portée}. +nuances ; nous les appellerons « objets extérieurs à la portée ». La règle adoptée par LilyPond pour positionner verticalement ces objets extérieurs consiste à les placer au plus près de la portée tout en prenant garde d'éviter qu'il y ait chevauchement. @@ -2881,31 +2833,38 @@ lorsque deux objets devraient se placer au même endroit, celui dont la @code{outside-staff-priority} est la plus faible sera disposé au plus près de la portée. -@lilypond[quote,ragged-right,relative=2,verbatim] -c4_"Text"\pp -r2. -\once \override TextScript.outside-staff-priority = #1 -c4_"Text"\pp % this time the text will be closer to the staff -r2. -% by setting outside-staff-priority to a non-number, -% we disable the automatic collision avoidance -\once \override TextScript.outside-staff-priority = ##f -\once \override DynamicLineSpanner.outside-staff-priority = ##f -c4_"Text"\pp % now they will collide +Une liste des @code{outside-staff-priorities} est disponible à la +rubrique @rlearning{La propriété outside-staff-priority}. + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4_"Text"\pp + r2. + \once \override TextScript.outside-staff-priority = #1 + c4_"Text"\pp % this time the text will be closer to the staff + r2. + % by setting outside-staff-priority to a non-number, + % we disable the automatic collision avoidance + \once \override TextScript.outside-staff-priority = ##f + \once \override DynamicLineSpanner.outside-staff-priority = ##f + c4_"Text"\pp % now they will collide +} @end lilypond Le décalage vertical entre des objets extérieurs à la portée se contrôle par la propriété @code{outside-staff-padding}. @c KEEP LY -@lilypond[quote,ragged-right,relative=2,verbatim,staffsize=18] -\once \override TextScript.outside-staff-padding = #0 -a'4-"outside-staff-padding = #0" -\once \override TextScript.outside-staff-padding = #3 -d-"outside-staff-padding = #3" -c-"outside-staff-padding par défaut" -b-"outside-staff-padding par défaut" -R1 +@lilypond[quote,ragged-right,verbatim,staffsize=18] +\relative { + \once \override TextScript.outside-staff-padding = #0 + a'4-"outside-staff-padding = #0" + \once \override TextScript.outside-staff-padding = #3 + d-"outside-staff-padding = #3" + c-"outside-staff-padding par défaut" + b-"outside-staff-padding par défaut" + R1 +} @end lilypond Par défaut, les objets extérieurs à la portée sont positionnés en @@ -2917,11 +2876,13 @@ d'accroître l'espace horizontal requis et repoussera verticalement un objet pour éviter qu'il ne soit trop proche d'ventuelles lignes supplémentaires. -@lilypond[quote,ragged-right,relative=2,verbatim] -c4^"Word" c c''2 -R1 -\once \override TextScript.outside-staff-horizontal-padding = #1 -c,,4^"Word" c c''2 +@lilypond[quote,ragged-right,verbatim] +\relative { + c''4^"Word" c c''2 + R1 + \once \override TextScript.outside-staff-horizontal-padding = #1 + c,,4^"Word" c c''2 +} @end lilypond @seealso @@ -2940,7 +2901,7 @@ Morceaux choisis : * Généralités sur l'espacement horizontal:: * Changement d'espacement en cours de partition:: * Modification de l'espacement horizontal:: -* Longueur de ligne:: +* Largeur de ligne:: * Notation proportionnelle:: @end menu @@ -2963,10 +2924,12 @@ de croches. La croche est suivie d'un espace de la largeur d'une tête de note ; pour la noire , cet espace est de deux têtes ; il est de trois pour la blanche. -@lilypond[quote,verbatim,relative=1] -c2 c4. c8 -c4. c8 c4. c8 -c8 c c4 c c +@lilypond[quote,verbatim] +\relative c' { + c2 c4. c8 + c4. c8 c4. c8 + c8 c c4 c c +} @end lilypond @code{spacing-increment} est normalement défini à 1,2 espace de @@ -2990,9 +2953,7 @@ souvent. La courte durée la plus fréquente est déterminée à partir de la note la plus courte de chaque mesure. C'est elle qui servira de base pour l'espacement, à cette nuance près que la plus courte durée ne saurait -être strictement supérieure à la croche. Cette @qq{durée de référence} -est d'ailleurs affichée lorsque vous lancez @code{lilypond} avec l'option -@option{--verbose}. +être strictement supérieure à la croche. Ces durées peuvent être adaptées. Vous pouvez définir la durée de base pour les espacements grâce à la propriété @@ -3010,32 +2971,35 @@ proportionnel à la durée témoin. Si donc nous ajoutions quelques doubles croches à l'exemple précédent, elles seraient suivies d'une demie largeur de tête : -@lilypond[quote,verbatim,relative=2] -c2 c4. c8 | c4. c16[ c] c4. c8 | c8 c c4 c c +@lilypond[quote,verbatim] +\relative { c''2 c4. c8 | c4. c16[ c] c4. c8 | c8 c c4 c c } @end lilypond -Dans notre @emph{Essai sur la gravure musicale automatisée}, nous avons -vu comment la direction des hampes peut influencer l'espacement -- voir -@ressay{Espacement}. Ceci est contrôlé par la propriété -@code{stem-spacing-correction} de l'objet @rinternals{NoteSpacing}, créé -pour chaque contexte @rinternals{Voice}. L'objet -@code{StaffSpacing}, généré au niveau d'un contexte @rinternals{Staff}, -possède une même propriété qui contrôlera l'espacement hampe-barre de -mesure. L'exemple suivant montre ces adaptations, tout d'abord selon -les réglages par défaut, puis avec des corrections forcées. +Comme le met en évidence notre @emph{Essai sur la gravure musicale +automatisée}, la direction des hampes peut influencer l'espacement -- voir +@ressay{Espacement} et s'ajuster à l'aide de la propriété +@code{stem-spacing-correction} de l'objet @rinternals{NoteSpacing} créé +pour chaque contexte @rinternals{Voice}. + +L'objet @code{StaffSpacing}, généré au niveau d'un contexte +@rinternals{Staff}, possède une même propriété qui contrôlera +l'espacement hampe-barre de mesure. + +L'exemple suivant montre ces adaptations, tout d'abord selon les +réglages par défaut, puis avec des corrections forcées. @lilypond[quote,ragged-right] -{ - c'4 e''4 e'4 b'4 | - b'4 e''4 b'4 e''4 | +\fixed c' { + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | \override Staff.NoteSpacing.stem-spacing-correction = #1.5 \override Staff.StaffSpacing.stem-spacing-correction = #1.5 - c'4 e''4 e'4 b'4 | - b'4 e''4 b'4 e''4 | + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | } @end lilypond -L'espacement spécifique à la notation proportionnelle fait l'objet d'une +L'espacement spécifique à la notation proportionnelle fait l'objet d'une @rusernamed{Notation proportionnelle,rubrique dédiée}. @seealso @@ -3054,7 +3018,7 @@ Référence des propriétés internes : @knownissues Il n'existe pas de mécanisme simple et efficace qui permette de forcer manuellement l'espacement. La solution ci-dessous permet -cependant @qq{d'aérer} artificiellement une partition ; il vous +cependant « d'aérer » artificiellement une partition ; il vous suffit d'ajuster la valeur du décalage @emph{(padding)} autant que de besoin. @@ -3067,7 +3031,7 @@ Il n'y a aucun moyen de diminuer l'espacement. @node Changement d'espacement en cours de partition @subsection Changement d'espacement en cours de partition -@translationof New spacing area +@translationof New spacing section @cindex espacement, modification en cours de partition @cindex notes, espacement horizontal @@ -3099,15 +3063,17 @@ amendements doivent intervenir au même moment que la commande @code{\newSpacingSection} ; ils produiront leurs effets jusqu'à ce qu'ils soient à nouveau modifiés par une nouvelle section, comme ici : -@lilypond[relative=1,verbatim,quote] -\time 4/16 -c16[ c c8] -\newSpacingSection -\override Score.SpacingSpanner.spacing-increment = #2 -c16[ c c8] -\newSpacingSection -\revert Score.SpacingSpanner.spacing-increment -c16[ c c8] +@lilypond[verbatim,quote] +\relative c' { + \time 4/16 + c16[ c c8] + \newSpacingSection + \override Score.SpacingSpanner.spacing-increment = #2 + c16[ c c8] + \newSpacingSection + \revert Score.SpacingSpanner.spacing-increment + c16[ c c8] +} @end lilypond @seealso @@ -3133,8 +3099,8 @@ resserrée. En effet, @code{ly:make-moment} construit une durée : @lilypond[verbatim,line-width=12\cm] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | @@ -3144,8 +3110,8 @@ resserrée. En effet, @code{ly:make-moment} construit une durée : @lilypond[verbatim,line-width=12\cm] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | @@ -3160,7 +3126,7 @@ resserrée. En effet, @code{ly:make-moment} construit une durée : @end lilypond @snippets -L'espacement au sein d'un nolet dépend par défaut d'un certain nombre de +L'espacement au sein d'un n-olet dépend par défaut d'un certain nombre de facteurs qui ne sont pas liés à la durée (altération, changement de clef, etc.). @code{Score.SpacingSpanner.uniform-stretching} permet d'ignorer ces symboles et, par voie de conséquence, de forcer @@ -3191,9 +3157,10 @@ L'activation du commutateur @code{strict-note-spacing} permet d'espacer les notes sans tenir compte des clefs, barres de mesure ou notes d'ornement qui pourraient apparaître : -@lilypond[quote,ragged-right,relative=2,verbatim] +@lilypond[quote,ragged-right,fragment,verbatim] \override Score.SpacingSpanner.strict-note-spacing = ##t -\new Staff { c8[ c \clef alto c \grace { c16 c } c8 c c] c32[ c] } +\new Staff \relative { + c''8[ c \clef alto c \grace { c16 c } c8 c c] c32[ c] } @end lilypond @seealso @@ -3201,9 +3168,9 @@ Morceaux choisis : @rlsrnamed{Spacing,Espacements}. -@node Longueur de ligne -@subsection Longueur de ligne -@translationof Line length +@node Largeur de ligne +@subsection Largeur de ligne +@translationof Line width @cindex saut de page @cindex pages, saut @@ -3295,11 +3262,14 @@ effets de ces réglages et comment ils interagissent. Commençons par cette mesure toute simple qui utilise l'espacement classique et justifiée à gauche. +@c The initial pitch is not necessary as long as RhythmicStaff is +@c not preceded by other material in the score, but we don't want +@c to explain that. @lilypond[quote,verbatim,ragged-right] \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> } @@ -3324,7 +3294,7 @@ définissant la propriété @code{proportionalNotationDuration}. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c' c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3371,7 +3341,7 @@ une durée de référence élevée produira une musique resserrée. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3385,7 +3355,7 @@ une durée de référence élevée produira une musique resserrée. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3399,7 +3369,7 @@ une durée de référence élevée produira une musique resserrée. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3419,20 +3389,20 @@ beaucoup plus d'espace horizontal que l'espacement traditionnel. La notation proportionnelle met en évidence le rythme au détriment de l'espacement horizontal. -Examinons à présent le moyen d'optimiser l'espacement de nolets en +Examinons à présent le moyen d'optimiser l'espacement de n-olets en tuilage. Reprenons notre exemple de départ, avec son espacement traditionnel, et -ajoutons lui une portée incluant un autre type de nolet. +ajoutons lui une portée incluant un autre type de n-olet. @lilypond[quote,verbatim,ragged-right] \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } \new RhythmicStaff { - \tuplet 9/8 { c'8 c' c' c' c' c' c' c' c' } + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } } >> } @@ -3441,7 +3411,7 @@ ajoutons lui une portée incluant un autre type de nolet. L'espacement est loin d'être idéal, pour la simple raison que l'espacement régulier des notes de la portée inférieure ne s'étire pas uniformément. Il est vrai que de telles constructions complexes en -nolets sont assez rares en gravure traditionnelle, ce qui explique que +n-olets sont assez rares en gravure traditionnelle, ce qui explique que les règles qu'elle applique peuvent amener à ce résultat. Le recours à @code{proportionalNotationDuration} permet d'arranger les choses. @@ -3449,10 +3419,10 @@ les règles qu'elle applique peuvent amener à ce résultat. Le recours à \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } \new RhythmicStaff { - \tuplet 9/8 { c'8 c' c' c' c' c' c' c' c' } + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } } >> \layout { @@ -3474,10 +3444,10 @@ allons activer le @code{uniform-stretching}, propriété attachée au \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } \new RhythmicStaff { - \tuplet 9/8 { c'8 c' c' c' c' c' c' c' c' } + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } } >> \layout { @@ -3520,7 +3490,7 @@ rubrique @ref{Changement d'espacement en cours de partition}. Intéressons-nous maintenant au @code{Separating_line_group_engraver}, qui est désactivé pour la plupart des partitions en notation proportionnelle. Voici ce qui apparaît dans une partition -traditionnelle : il y a toujours un @qq{espace préservé} juste +traditionnelle : il y a toujours un « espace préservé » juste avant la première note de chaque portée. @lilypond[quote,verbatim,ragged-right] @@ -3557,7 +3527,7 @@ réduire cet espace à zéro. Les éléments non musicaux tels que métrique, armure, clef et altérations, posent problème lorsqu'on travaille en notation proportionnelle. Bien qu'aucune notion de durée ne leur soit -attachée, ces éléments @qq{consomment} de l'espace. Différentes +attachée, ces éléments « consomment » de l'espace. Différentes approches permettent cependant de gérer ce problème. Éviter les problèmes d'espacement avec l'armure est chose aisée : @@ -3578,13 +3548,13 @@ les deux portées suivantes : @lilypond[quote,verbatim,ragged-right] \new Staff { \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) - c''8 c'' c'' \clef alto d' d'2 + c''8 8 8 \clef alto d' 2 } \new Staff { \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) \override Score.SpacingSpanner.strict-note-spacing = ##t - c''8 c'' c'' \clef alto d' d'2 + c''8 8 8 \clef alto d' 2 } @end lilypond @@ -3610,7 +3580,7 @@ réglages en usage dans la notation proportionnelle comme, entre autres, @end itemize Ces différents réglages permettent un espacement strict des notes -d'ornement, d'étendre les indications de nolet afin d'indiquer de façon +d'ornement, d'étendre les indications de n-olet afin d'indiquer de façon évidente leurs bornes et d'autoriser le tronçonnement des extenseurs à l'occasion d'un saut de ligne ou de page. Nous vous renvoyons aux différentes rubriques associées du manuel pour chacun de ces réglages. @@ -3753,15 +3723,17 @@ se répartir sur deux pages. @item Éviter ou réduire les objets qui augmentent la hauteur des systèmes. -Par exemple, un crochet de reprise ou d'alternative consomme de -l'espace. Le fait de les reporter sur plusieurs systèmes regroupés -diminue d'autant l'espace disponible que si seul le premier ne -comportait l'indication. Autre exemple, les indications de nuance qui -se @qq{détachent} d'un système peuvent être rapprochées de la portée : - -@lilypond[verbatim,quote,relative=1] -e4 c g\f c -e4 c g-\tweak X-offset #-2.7 \f c +Par exemple, un crochet d'alternative en fin de reprise consomme de +l'espace. Dans le cas où il s'étend sur deux systèmes, il occupera +plus d'espace que si seul le premier comportait l'indication. Autre +exemple, les indications de nuance qui se « détachent » d'un système +peuvent être rapprochées de la portée : + +@lilypond[verbatim,quote] +\relative e' { + e4 c g\f c + e4 c g-\tweak X-offset #-2.7 \f c +} @end lilypond @item @@ -3772,8 +3744,8 @@ l'espacement par défaut : @lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | @@ -3786,12 +3758,12 @@ l'espacement par défaut : Par contre, le fait de modifier la valeur de la propriété @code{common-shortest-duration} en passant de @code{1/4} à @code{1/2} -- bien que la noire soit la durée la plus courante, nous prenons une -valeur plus longue -- donnera un effet @qq{resserré} à la musique : +valeur plus longue -- donnera un effet « resserré » à la musique : @lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | diff --git a/Documentation/fr/notation/staff.itely b/Documentation/fr/notation/staff.itely index cfa27825a5..c23ac659e6 100644 --- a/Documentation/fr/notation/staff.itely +++ b/Documentation/fr/notation/staff.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- @ignore - Translation of GIT committish: d46572826e777ed3e9fa4656535a6e9000f2ed9e + Translation of GIT committish: a1267e20afa61258ce3031f07d916e0e66ac6582 - When revising a translation, copy the HEAD committish of the - version that you are working on. For details, see the Contributors' - Guide, node Updating translation committishes.. + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @c Translators: Valentin Villenave, Jean-Charles Malahieude @c Translation checkers: John Mandereau @@ -67,7 +67,6 @@ Nous allons voir ici comment créer des portées et comment les regrouper. @cindex tablature @funindex \drummode -@funindex drummode @funindex DrumStaff @funindex RhythmicStaff @funindex TabStaff @@ -82,8 +81,8 @@ au pluriel) -- sont créées à l'aide des commandes @code{\new} ou Le contexte de portée standard s'appelle @code{Staff} : -@lilypond[verbatim,quote,relative=2] -\new Staff { c4 d e f } +@lilypond[verbatim,quote] +\new Staff \relative { c''4 d e f } @end lilypond Le contexte @code{DrumStaff} crée une portée à cinq lignes correspondant @@ -104,7 +103,7 @@ de présenter les valeurs rythmiques saisies. Seules sont imprimées les durées. Pour de plus amples détails, consultez @ref{Gravure de lignes rythmiques}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new RhythmicStaff { c4 d e f } @end lilypond @@ -112,8 +111,8 @@ Un @code{TabStaff} crée une portée de tablature correspondant aux six cordes d'une guitare standard. Pour de plus amples détails, consultez @ref{Tablatures par défaut}. -@lilypond[verbatim,quote,relative=2] -\new TabStaff { c4 d e f } +@lilypond[verbatim,quote] +\new TabStaff \relative { c''4 d e f } @end lilypond LilyPond dispose aussi de deux contextes dédiés à la musique @@ -124,8 +123,8 @@ Le contexte @code{GregorianTranscriptionStaff} permet d'obtenir des éditions modernes du grégorien. Bien entendu, il est dépourvu de barres de mesure. -@lilypond[verbatim,quote,relative=2] -\new GregorianTranscriptionStaff { c4 d e f e d } +@lilypond[verbatim,quote] +\new GregorianTranscriptionStaff \relative { c''4 d e f e d } @end lilypond Vous pourrez toujours définir d'autres contextes de portée selon vos @@ -138,15 +137,15 @@ Glossaire musicologique : @rglosnamed{staves,portées}. Manuel de notation : +@ref{Contextes de musique mensurale}, +@ref{Contextes du chant grégorien}, +@ref{Contextes prédéfinis}, @ref{Création et référencement d'un contexte}, -@ref{Portées de percussion}, +@ref{Définition de nouveaux contextes}, @ref{Gravure de lignes rythmiques}, -@ref{Tablatures par défaut}, -@ref{Contextes prédéfinis}, +@ref{Portées de percussion}, @ref{Symbole de la portée}, -@ref{Contextes du chant grégorien}, -@ref{Contextes de musique mensurale}, -@ref{Définition de nouveaux contextes}. +@ref{Tablatures par défaut}. Morceaux choisis : @rlsrnamed{Staff notation, Notation sur la portée}. @@ -190,40 +189,40 @@ suivantes s'appliqueront par défaut : les portées du groupe ne sont pas reliées, hormis par une simple ligne verticale en début de ligne, et les barres de mesure sont indépendantes. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond Dans un @code{StaffGroup}, le groupe de portées est signifié par un crochet, et les barres de mesure sont d'un seul tenant. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond Dans un @code{ChoirStaff}, le groupe de portées est signifié par un crochet sur la gauche, et les barres de mesure sont individuelles. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new ChoirStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond Dans un @code{GrandStaff}, le groupe de portées est signifié par une accolade sur la gauche, et les barres de mesure sont d'un seul tenant. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new GrandStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond @@ -231,11 +230,11 @@ Le contexte @code{PianoStaff} est identique au @code{GrandStaff}, sauf qu'il gère automatiquement l'affichage du nom d'instrument -- voir @ref{Noms d'instrument} pour plus de détails. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new PianoStaff << \set PianoStaff.instrumentName = #"Piano" - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { \clef bass c1 c } >> @end lilypond @@ -271,8 +270,8 @@ Glossaire musicologique : @rglosnamed{grand staff,système}. Manuel de notation : -@ref{Noms d'instrument}, -@ref{Définition de nouveaux contextes}. +@ref{Définition de nouveaux contextes}, +@ref{Noms d'instrument}. Morceaux choisis : @rlsrnamed{Staff notation, Notation sur la portée}. @@ -288,9 +287,6 @@ Référence des propriétés internes : @rinternals{SystemStartBracket}, @rinternals{SystemStartSquare}. -@knownissues -Un @code{PianoStaff} ne peut contenir, par défaut, de @code{ChordNames}. - @node Imbrication de regroupements de portées @unnumberedsubsubsec Imbrication de regroupements de portées @@ -305,17 +301,17 @@ Les accolades et crochets qui délimitent les systèmes peuvent être imbriqués en profondeur. Chaque niveau inférieur aura son propre délimiteur, en plus de celui du niveau supérieur. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c2 c | c2 c } + \new Staff \relative { c''2 c | c2 c } \new StaffGroup << - \new Staff { g2 g | g2 g } + \new Staff \relative { g'2 g | g2 g } \new StaffGroup \with { systemStartDelimiter = #'SystemStartSquare } << - \new Staff { e2 e | e2 e } - \new Staff { c2 c | c2 c } + \new Staff \relative { e'2 e | e2 e } + \new Staff \relative { c'2 c | c2 c } >> >> >> @@ -330,9 +326,9 @@ l'explique @ref{Définition de nouveaux contextes}. @seealso Manuel de notation : -@ref{Regroupement de portées}, +@ref{Définition de nouveaux contextes}, @ref{Noms d'instrument}, -@ref{Définition de nouveaux contextes}. +@ref{Regroupement de portées}. Morceaux choisis : @rlsrnamed{Staff notation,Notation sur la portée}. @@ -365,15 +361,15 @@ défaut, mais vous pouvez l'activer par une option au sein du bloc \score { \new StaffGroup << \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } } \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } @@ -429,18 +425,18 @@ d'@emph{ossia}. @cindex ligne supplémentaire @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff Les commandes @code{\stopStaff} et @code{\startStaff} permettent respectivement de clôturer et (re)démarrer une portée n'importe où dans une partition. -@lilypond[verbatim,quote,relative=2] -\stopStaff f4 d \startStaff g, e -f'4 d \stopStaff g, e -f'4 d \startStaff g, e +@lilypond[verbatim,quote] +\relative { + \stopStaff f''4 d \startStaff g, e + f'4 d \stopStaff g, e + f'4 d \startStaff g, e +} @end lilypond @predefined @@ -458,31 +454,35 @@ auront été définies avant de créer la portée en question. Vous pouvez modifier le nombre de lignes d'une portée : -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-count = #2 -\startStaff g, e | - -f'4 d \stopStaff -\revert Staff.StaffSymbol.line-count -\startStaff g, e | +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-count = #2 + \startStaff g, e | + + f'4 d \stopStaff + \revert Staff.StaffSymbol.line-count + \startStaff g, e | +} @end lilypond Le positionnement de chacune des lignes de la portée est modifiable. Une liste de nombres détermine le positionnement de chaque ligne. Le @code{0} correspond à la ligne médiane d'une portée habituelle, pour -laquelle la liste est donc @code{(-4@tie{}-2@tie{}0@tie{}2@tie{}4)}. +laquelle la liste est donc @code{(-4 -2 0 2 4)}. Une ligne sera donc imprimée pour chaque valeur exprimée ; le nombre de lignes, ainsi que leur position dans la portée, peut donc se modifier à l'aide d'une seule commande. -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) -\startStaff g, e | -f'4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) -\startStaff g, e +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) + \startStaff g, e | + f'4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) + \startStaff g, e | +} @end lilypond Afin de préserver l'orientation habituelle des hampes -- ascendantes @@ -507,12 +507,13 @@ les lignes supplémentaires et les hampes seront aussi modifiées. L'épaisseur des lignes supplémentaires (@emph{ledger lines}) peut être déterminée indépendamment des lignes de la portée. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #2 \override StaffSymbol.ledger-line-thickness = #'(0.5 . 0.4) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond @noindent @@ -522,11 +523,12 @@ combinées pour donner la nouvelle épaisseur des lignes supplémentaires. L'emplacement des lignes supplémentaires est réglable : -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-positions = #'(-3 -2 -1 2 5 6) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond Vous pouvez faire apparaître des lignes supplémentaires additionnelles @@ -534,11 +536,12 @@ au-dessus ou en dessous des têtes de note selon leur positionnement relatif aux autres notes, qu'elles aient ou non elles-mêmes des lignes supplémentaires. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-extra = #4 +} \relative { + f'''4 a, d, f, } -{ f'4 a, d, f, } @end lilypond Des lignes supplémentaires peuvent apparaître y compris au sein d'une @@ -561,11 +564,12 @@ d4 e f g Modifier l'équidistance des lignes de la portée affectera aussi les lignes supplémentaires. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.staff-space = #1.5 +} \relative { + f'''4 d, g, e, } -{ f'4 d, g, e, } @end lilypond @snippets @@ -600,16 +604,14 @@ Référence des propriétés internes : @cindex nombre de portées @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff Une portée d'@notation{ossia} -- ou de variante -- s'obtient en créant, à l'endroit approprié, une nouvelle portée simultanée : @lilypond[verbatim,quote] -\new Staff \relative c'' { - c4 b d c +\new Staff \relative { + c''4 b d c << { c4 b d c } \new Staff { e4 d f e } @@ -632,17 +634,15 @@ L'exemple qui suit utilise, pour aligner la portée d'ossia, la propriété lorsqu'il y a un nombre restreint d'ossias. @lilypond[verbatim,quote] -\new Staff = "main" \relative c'' { - c4 b d c +\new Staff = "main" \relative { + c''4 b d c << { c4 b d c } \new Staff \with { \remove "Time_signature_engraver" alignAboveContext = #"main" - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) + \magnifyStaff #2/3 firstClef = ##f } { e4 d f e } @@ -664,14 +664,12 @@ procéder, bien plus que dans l'exemple suivant. \new Staff = "ossia" \with { \remove "Time_signature_engraver" \hide Clef - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) + \magnifyStaff #2/3 } { \stopStaff s1*6 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 << { e4 f e2 } \context Staff = "ossia" { @@ -691,27 +689,25 @@ procéder, bien plus que dans l'exemple suivant. >> @end lilypond -Vous pourriez aussi recourir à la commande -@code{\Staff \RemoveEmptyStaves} pour créer votre portée d'ossia. -Cependant, cette méthode reste limitée à l'apparition de ces ossias en -début de ligne. Pour plus d'information au sujet de la commande -@code{\Staff \RemoveEmptyStaves}, reportez-vous au chapitre -@ref{Masquage de portées}. +Vous pourriez aussi recourir à la commande @code{\RemoveAllEmptyStaves} +pour créer votre portée d'ossia. Cependant, cette méthode reste limitée +à l'apparition de ces ossias en début de ligne. Pour plus d'information +au sujet de la commande @code{\RemoveAllEmptyStaves}, reportez-vous au +chapitre @ref{Masquage de portées}. @lilypond[verbatim,quote,ragged-right] << \new Staff = "ossia" \with { \remove "Time_signature_engraver" \hide Clef - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) - } \relative c'' { + \magnifyStaff #2/3 + \RemoveAllEmptyStaves + } \relative { R1*3 - c4 e8 d c2 + c''4 e8 d c2 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 e4 f e2 g4 a g2 \break c4 b c2 @@ -719,13 +715,6 @@ début de ligne. Pour plus d'information au sujet de la commande e4 d c2 } >> - -\layout { - \context { - \Staff \RemoveEmptyStaves - \override VerticalAxisGroup.remove-first = ##t - } -} @end lilypond @snippets @@ -740,8 +729,8 @@ Glossaire musicologique : Manuel d'initiation : @rlearning{Expressions musicales imbriquées}, -@rlearning{Taille des objets}, -@rlearning{Longueur et épaisseur des objets}. +@rlearning{Longueur et épaisseur des objets}, +@rlearning{Taille des objets}. Manuel de notation : @ref{Masquage de portées}. @@ -759,12 +748,14 @@ Référence des propriétés internes : @cindex Frenched scores @cindex masquage de portée +@cindex musique ancienne, masquage de portée +@cindex portées rythmiques, masquage @cindex portée vide @funindex \RemoveEmptyStaves +@funindex \RemoveAllEmptyStaves @funindex Staff_symbol_engraver @funindex \stopStaff -@funindex stopStaff Désactiver le graveur @code{Staff_symbol_engraver} dans un contexte @code{Staff} permet de masquer des lignes. La commande @@ -774,16 +765,20 @@ Désactiver le graveur @code{Staff_symbol_engraver} dans un contexte \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c''' { a8 f e16 d c b a2 } +\relative { a''8 f e16 d c b a2 } @end lilypond -L'instruction @code{\Staff \RemoveEmptyStaves} placée dans un bloc -@code{\layout} aura pour effet de masquer toute portée qui ne contient -rien. Dans les partitions d'orchestre, les portées qui n'ont que des -silences sont habituellement masquées afin de gagner de la place. Ce -style d'édition s'appelle en anglais « French Score ». -Cette fonctionnalité masque et supprime toutes les portées vides d'une -partition, hormis celles du premier système. +L'instruction @code{\RemoveEmptyStaves} placée dans un bloc +@code{\layout} ou dans une clause @code{\with} affectant une portée +particulière, aura pour effet de masquer toute portée qui ne contient +rien. Dans les partitions d'orchestre, les portées qui n'ont que des +silences sont habituellement masquées afin de gagner de la place. Ce +style d'édition s'appelle en anglais « Frenched Score ». Cette +fonctionnalité masque et supprime toutes les portées vides d'une +partition, hormis celles du premier système. Le premier système sera +lui aussi concerné dès lors que sera utilisée l'instruction +@code{\RemoveAllEmptyStaves}. Ces instructions couvrent les contextes +@code{Staff}, @code{RhythmicStaff} et @code{VaticanaStaff}. @warning{Une portée est considérée comme vide dès lors qu'elle ne contient que des silences multimesures, des silences visibles ou @@ -793,13 +788,14 @@ combinaison de ces éléments.} @lilypond[verbatim,quote,ragged-right] \layout { \context { - \Staff \RemoveEmptyStaves + \Staff + \RemoveEmptyStaves } } -\relative c' << +\relative << \new Staff { - e4 f g a \break + e'4 f g a \break b1 \break a4 b c2 } @@ -814,30 +810,15 @@ combinaison de ces éléments.} @cindex ossia @noindent -@code{\Staff \RemoveEmptyStaves} permet aussi de gérer des fragments +@code{\RemoveAllEmptyStaves} permet aussi de gérer des fragments d'ossia attachés à une portée. Pour plus de détails, voir @ref{Portées d'ossia}. -@cindex musique ancienne, masquage de portée -@cindex portées rythmiques, masquage - -@funindex \RemoveEmptyStaves - -La commande @code{\VaticanaStaff \RemoveEmptyStaves} permet de masquer des -portées vides dans les contextes de musique ancienne. Pour des -contextes @code{RhythmicStaff}, il faudra utiliser -@code{\RhythmicStaff \RemoveEmptyStaves}. - @predefined -@code{\Staff \RemoveEmptyStaves}, -@code{\VaticanaStaff \RemoveEmptyStaves}, -@code{\RhythmicStaff \RemoveEmptyStaves}. +@code{\RemoveEmptyStaves}, +@code{\RemoveAllEmptyStaves}, @endpredefined -@snippets -@lilypondfile[verbatim,quote,texidoc,doctitle] -{removing-the-first-empty-line.ly} - @seealso Glossaire musicologique : @rglos{Frenched staff}. @@ -846,11 +827,11 @@ Manuel d'initiation: @rlearning{Visibilité et couleur des objets}. Manuel de notation : +@ref{Dictée à trous}, @ref{Modification des réglages par défaut d'un contexte}, -@ref{Symbole de la portée}, @ref{Portées d'ossia}, -@ref{Dictée à trous}, @ref{Silences invisibles}, +@ref{Symbole de la portée}, @ref{Visibilité des objets}. Morceaux choisis : @@ -911,26 +892,28 @@ chacune des portées, qu'il s'agisse d'un contexte @code{Staff}, @code{instrumentName}, et les suivantes celle de @code{shortInstrumentName}. -@lilypond[verbatim,quote,ragged-right,relative=1] +@lilypond[verbatim,quote,ragged-right] \new Staff \with { instrumentName = #"Violin " shortInstrumentName = #"Vln. " +} \relative { + c'4.. g'16 c4.. g'16 \break | c1 | } -{ c4.. g'16 c4.. g'16 \break | c1 } @end lilypond Le recours à la commande @code{\markup} permet de construire des noms d'instrument particuliers, tels que -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { instrumentName = \markup { \column { "Clarinetti" \line { "in B" \smaller \flat } } } +} \relative { + c''4 c,16 d e f g2 } -{ c4 c,16 d e f g2 } @end lilypond @cindex noms d'instrument, centrés @@ -967,26 +950,22 @@ d'augmenter les retraits -- @emph{indent} -- au sein du bloc reportez-vous au chapitre @ref{Variables d'indentation et de décalage}. @lilypond[verbatim,quote,ragged-right] -\relative c'' { - << - \new Staff \with { - instrumentName = #"Alto Flute in G" - shortInstrumentName = #"Flt." - } - { - f2 g4 f \break - g4 f g2 - } - \new Staff \with { - instrumentName = #"Clarinet" - shortInstrumentName = #"Clar." - } - { - c,4 b c2 \break - c2 b4 c - } - >> -} +<< + \new Staff \with { + instrumentName = #"Alto Flute in G" + shortInstrumentName = #"Flt." + } \relative { + f''2 g4 f \break + g4 f g2 + } + \new Staff \with { + instrumentName = #"Clarinet" + shortInstrumentName = #"Clar." + } \relative { + c''4 b c2 \break + c2 b4 c + } +>> \layout { indent = 3.0\cm @@ -1005,72 +984,52 @@ informations sur la manière d'activer ou désactiver un graveur, voir @cindex instrument, changement de nom @cindex changement de nom d'instrument -Vous pouvez changer le nom d'un instrument en cours de morceau. Notez -cependant que la valeur de @code{instrumentName} ne s'affichera que sur -la première portée : +Le nom abrégé d'un instrument (@code{shortInstrumentName}) peut changer +en cours de morceau, en même temps que les autres réglages propres au +nouvel instrument. Notez cependant que la valeur de +@code{instrumentName} ne s'affichera que sur la première portée : -@lilypond[verbatim,quote,ragged-right,relative=1] -\new Staff \with { - instrumentName = #"Flute" - shortInstrumentName = #"Flt." -} -{ - c1 c c c \break - c1 c c c \break - \set Staff.instrumentName = #"Clarinet" - \set Staff.shortInstrumentName = #"Clt." - c1 c c c \break - c1 c c c \break +@lilypond[verbatim,quote,ragged-right] +prepPiccolo = <>^\markup \italic { muta in Piccolo } + +setPiccolo = { + \set Staff.instrumentName = #"Piccolo" + \set Staff.shortInstrumentName = #"Picc." + \set Staff.midiInstrument = #"piccolo" + <>^\markup \bold { Piccolo } + \transposition c'' } -@end lilypond -@cindex instrument, changement -@cindex changement d'instrument - -@funindex \addInstrumentDefinition -@funindex addInstrumentDefinition -@funindex \instrumentSwitch -@funindex instrumentSwitch - -Lorsqu'un musicien doit changer d'instrument -- piccolo et flûte, basson -et contrebasson --, la commande @code{\addInstrumentDefinition}, -couplée à l'instruction @code{\instrumentSwitch} permet de spécifier en -détail les modifications intervenant lors du changement. La commande -@code{\addInstrumentDefinition} prend deux arguments : une chaîne -de caractères qui servira d'identifiant, et une liste d'association -de valeurs aux propriétés de ce nouvel instrument. Ces définitions -devront être déclarées avant tout autre élément musical. L'instruction -@code{\instrumentSwitch} se placera dans la musique au moment de la -substitution : +prepFlute = <>^\markup \italic { muta in Flauto } -@lilypond[verbatim,quote,ragged-right] -\addInstrumentDefinition #"contrabassoon" - #`((instrumentTransposition . ,(ly:make-pitch -1 0 0)) - (shortInstrumentName . "Cbsn.") - (clefGlyph . "clefs.F") - (middleCPosition . 6) - (clefPosition . 2) - (instrumentCueName . ,(make-bold-markup "cbsn.")) - (midiInstrument . "bassoon")) +setFlute = { + \set Staff.instrumentName = #"Flute" + \set Staff.shortInstrumentName = #"Flt." + \set Staff.midiInstrument = #"flute" + <>^\markup \bold { Flute } + \transposition c' +} \new Staff \with { - instrumentName = #"Bassoon" + instrumentName = #"Flute" + shortInstrumentName = #"Flt." + midiInstrument = #"flute" } -\relative c' { - \clef tenor - \compressFullBarRests - c2 g' - R1*16 - \instrumentSwitch "contrabassoon" - c,,2 g \break - c,1 ~ | c1 +\relative { + g'1 g g g \break + g1 g \prepPiccolo R R \break + \setPiccolo + g1 g g g \break + g1 g \prepFlute R R \break + \setFlute + g1 g g g } @end lilypond @seealso Manuel de notation : -@ref{Variables d'indentation et de décalage}, -@ref{Modification des greffons de contexte}. +@ref{Modification des greffons de contexte}, +@ref{Variables d'indentation et de décalage}. Morceaux choisis : @rlsrnamed{Staff notation,Notation sur la portée}. @@ -1090,11 +1049,8 @@ Référence des propriétés internes : @cindex petites notes @funindex \addQuote -@funindex addQuote @funindex \quoteDuring -@funindex quoteDuring @funindex \transposition -@funindex transposition Il est assez courant qu'une voix soit doublée par une autre. Par exemple, les premiers et seconds violons peuvent jouer les mêmes notes @@ -1113,12 +1069,12 @@ arguments : le nom de la voix reproduite, tel que défini par cette citation. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { s1 } } \addQuote "flute" { \fluteNotes } @@ -1136,12 +1092,12 @@ autre chose que du silence, il en résulterait une situation polyphonique, ce qui n'est pas le but recherché : @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } } \addQuote "flute" { \fluteNotes } @@ -1153,6 +1109,41 @@ oboeNotes = \relative c'' { >> } @end lilypond +Lorsqu'une commande @code{\unfoldRepeat} est requise dans une expression +musicale de telle sorte que la musique soit réimprimée par +@code{\quoteDuring}, l'instruction @code{\addQuote} doit elle-mêeme +contenir la commande @code{\unfoldRepeat} : + +@lilypond[verbatim,quote] +fluteNotes = \relative { + \repeat volta 2 { a'4 gis g gis } +} + +oboeNotesDW = \relative { + \repeat volta 2 \quoteDuring #"incorrect" { s1 } +} + +oboeNotesW = \relative { + \repeat volta 2 \quoteDuring #"correct" { s1 } +} + + +\addQuote "incorrect" { \fluteNotes } + +\addQuote "correct" { \unfoldRepeats \fluteNotes } + +\score { + \unfoldRepeats + << + \new Staff \with { instrumentName = "Flute" } + \fluteNotes + \new Staff \with { instrumentName = "Oboe (incorrect)" } + \oboeNotesDW + \new Staff \with { instrumentName = "Oboe (correct)" } + \oboeNotesW + >> +} +@end lilypond L'instruction @code{\quoteDuring} prendra en compte les réglages d'une commande @code{\transposition}, qu'elle apparaisse au niveau de la voix @@ -1165,11 +1156,11 @@ clarinetNotes = \relative c'' { b4 ais a ais | cis4^"quoted" r8 bis\p b4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"clarinet" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"clarinet" { s1 } } \addQuote "clarinet" { \clarinetNotes } - + \score { << \new Staff \with { instrumentName = "Clarinet" } \clarinetNotes @@ -1194,13 +1185,13 @@ permet de définir plus précisément quels éléments de la voix originelle seront reproduits. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a2 g2 | +fluteNotes = \relative { + a'2 g2 | b4\<^"quoted" r8 ais a4\f( c->) } -oboeNotes = \relative c'' { - c2. b4 | +oboeNotes = \relative { + c''2. b4 | \quoteDuring #"flute" { s1 } } @@ -1262,27 +1253,25 @@ qualité. @cindex CueVoice @funindex \cueDuring -@funindex cueDuring @funindex \cueClef -@funindex cueClef @funindex \cueDuringWithClef -@funindex cueDuringWithClef @funindex \quoteDuring -@funindex quoteDuring Le moyen le plus simple pour mettre en forme des notes provenant d'une autre voix consiste à déclarer explicitement un contexte @code{CueVoice} au sein de la voix où elle apparaît. -@lilypond[verbatim,relative=1] -R1 -<< - { e2\rest r4. e8 } - \new CueVoice { - \stemUp d'8^"flute" c d e fis2 - } ->> -d,4 r a r +@lilypond[verbatim] +\relative { + R1 + << + { e'2\rest r4. e8 } + \new CueVoice { + \stemUp d'8^"flute" c d e fis2 + } + >> + d,4 r a r +} @end lilypond L'instruction @code{\cueClef}, utilisée conjointement à un contexte @@ -1290,32 +1279,36 @@ L'instruction @code{\cueClef}, utilisée conjointement à un contexte réduite, propre à la voix citée. Le retour à la clef d'origine s'effectue à l'aide de l'instruction @code{\cueClefUnset}. -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -<< - { e2\rest r4. \cueClefUnset e,8 } - \new CueVoice { - \cueClef "treble" \stemUp d''8^"flute" c d e fis2 - } ->> -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + << + { e'2\rest r4. \cueClefUnset e,8 } + \new CueVoice { + \cueClef "treble" \stemUp d''8^"flute" c d e fis2 + } + >> + d,,4 r a r +} @end lilypond Notez que les deux instructions @code{\cueClef} et @code{\cueClefUnset} sont disponibles si nécessaire en dehors d'un @code{CueVoice}. -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -\cueClef "treble" -d'8^"flute" c d e fis2 -\cueClefUnset -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + \cueClef "treble" + d''8^"flute" c d e fis2 + \cueClefUnset + d,,4 r a r +} @end lilypond Lorsque la situation est plus complexe, instrument transpositeur ou -citations de plusieurs sources, vous disposez des instructions +citations de plusieurs sources, vous disposez des instructions @code{\cueDuring} et @code{\cueDuringWithClef}, versions spécifiques de la commande @code{\quoteDuring} -- voir la rubrique précédente (@ref{Citation d'autres voix}). @@ -1341,13 +1334,13 @@ notes seront attachées à la première ou à la seconde voix -- @code{UP} pour la première, @code{DOWN} pour la seconde. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 | d8 c d e fis2 | g2 d | +fluteNotes = \relative { + r2. c''4 | d8 c d e fis2 | g2 d | } oboeNotes = \relative c'' { R1 - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } \cueDuring #"flute" #UP { R1 } g2 c, } @@ -1364,7 +1357,7 @@ La propriété @code{quotedCueEventTypes} permet de définir précisément quels éléments de la voix originelle seront reproduits. Sa valeur par défaut est @code{'(note-event rest-event tie-event beam-event tuplet-span-event)}. LilyPond reproduira donc les notes, silences, -liaisons de prolongation, ligatures et nolets, mais pas les +liaisons de prolongation, ligatures et n-olets, mais pas les articulations, annotations ni nuances. @warning{Dans l'exemple précédent, il était nécessaire de déclarer @@ -1373,8 +1366,8 @@ l'expression musicale se serait retrouvée dans le contexte @code{CueVoice}.} @lilypond[verbatim,quote] -oboeNotes = \relative c'' { - r2 r8 d16(\f f e g f a) +oboeNotes = \relative { + r2 r8 d''16(\f f e g f a) g8 g16 g g2. } \addQuote "oboe" { \oboeNotes } @@ -1388,25 +1381,21 @@ oboeNotes = \relative c'' { } @end lilypond -Le nom de l'instrument qui est répliqué sera imprimé dès lors qu'aura -été définie la propriété @code{instrumentCueName} d'un contexte -@code{CueVoice} temporaire. Le positionnement et le style adopté par -@code{instrumentCueName} dépendent de l'objet @code{InstrumentSwitch} --- voir @ref{Noms d'instrument}. Par ailleurs, si la citation nécessite -l'apparition d'une clef différente, celle-ci devra être introduite -manuellement, tout comme l'originale qui devra être rappelée en fin de -citation. +Le nom de l'instrument qui est répliqué peut s'indiquer à l'aide d'un +@emph{markup}. Par ailleurs, si la citation nécessite l'apparition +d'une clef différente, celle-ci devra être introduite manuellement, tout +comme l'originale qui devra être rappelée en fin de citation. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { \clef bass R1 \clef treble - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } \cueDuring #"flute" #UP { R1 } \clef bass g4. b8 d2 @@ -1424,14 +1413,14 @@ grâce à un argument supplémentaire, de gérer le changement de clef nécessaire à la citation et le retour à la clef originelle. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { \clef bass R1 - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup { \tiny "flute" } \cueDuringWithClef #"flute" #UP #"treble" { R1 } g4. b8 d2 } @@ -1444,12 +1433,11 @@ bassoonNotes = \relative c { @end lilypond @funindex \transposedCueDuring -@funindex transposedCueDuring L'instruction @code{\cueDuring}, à l'instar de la commande @code{\quoteDuring}, tient compte des instruments transpositeurs. La citation s'effectue aux hauteurs correspondant à l'instrument où elles -apparaissent. +apparaissent. L'instruction @code{\transposedCueDuring} est particulièrement adaptée pour des instrument ayant une tessiture éloignée, comme dans le cas d'un @@ -1459,10 +1447,10 @@ argument supplémentaire afin de spécifier la transposition à effectuer en hauteur absolue. @lilypond[verbatim,quote] -piccoloNotes = \relative c''' { +piccoloNotes = \relative { \clef "treble^8" R1 - c8 c c e g2 + c'''8 c c e g2 c4 g g2 } @@ -1488,9 +1476,6 @@ bassClarinetNotes = \relative c' { @cindex fin de réplique @funindex \killCues -@funindex killCues -@funindex \addInstrumentDefinition -@funindex addInstrumentDefinition La commande @code{killCues} permet de supprimer les notes d'une citation. Ceci est utile lorsque cette citation n'est pas imprimée dans @@ -1501,8 +1486,8 @@ faites appel à des balises -- voir @ref{Utilisation de balises} à ce sujet. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { @@ -1510,7 +1495,7 @@ bassoonNotes = \relative c { R1 \tag #'part { \clef treble - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } } \cueDuring #"flute" #UP { R1 } \tag #'part \clef bass @@ -1541,10 +1526,10 @@ d'information, reportez-vous au chapitre @ref{Noms d'instrument}. @seealso Manuel de notation : @ref{Citation d'autres voix}, +@ref{Citation-repère}, +@ref{Clefs}, @ref{Instruments transpositeurs}, @ref{Noms d'instrument}, -@ref{Clefs}, -@ref{Citation-repère}, @ref{Utilisation de balises}. Morceaux choisis : diff --git a/Documentation/fr/notation/text.itely b/Documentation/fr/notation/text.itely index 04afd78674..3b5ad35351 100644 --- a/Documentation/fr/notation/text.itely +++ b/Documentation/fr/notation/text.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- @ignore - Translation of GIT committish: 34f7824737173f1b485c8989dd0de6b45c8b7c2a + Translation of GIT committish: a1267e20afa61258ce3031f07d916e0e66ac6582 - When revising a translation, copy the HEAD committish of the - version that you are working on. For details, see the Contributors' - Guide, node Updating translation committishes.. + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.21" @c Translators: Jean-Charles Malahieude @c Translation checkers: Valentin Villenave, John Mandereau @@ -68,8 +68,8 @@ comme dans l'exemple suivant. Ces indications se placeront manuellement au-dessus ou au-dessous de la portée selon la syntaxe utilisée -- cf. @ref{Direction et positionnement}. -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e a4-"scherz." f +@lilypond[quote,verbatim] +\relative { a'8^"pizz." g f e a4-"scherz." f } @end lilypond Cette syntaxe est en fait un raccourci. Des constructions plus @@ -77,9 +77,10 @@ Cette syntaxe est en fait un raccourci. Des constructions plus @code{\markup} et selon les préceptes énoncés dans @ref{Mise en forme du texte}. -@lilypond[quote,verbatim,relative=2] -a8^\markup { \italic pizz. } g f e -a4_\markup { \tiny scherz. \bold molto } f +@lilypond[quote,verbatim] +\relative { + a'8^\markup { \italic pizz. } g f e + a4_\markup { \tiny scherz. \bold molto } f } @end lilypond Par défaut, ces indications n'affectent en rien l'espacement des @@ -87,10 +88,12 @@ notes. Leur longueur peut néanmoins être prise en considération : dans l'exemple qui suit, le premier commentaire n'influe pas sur l'espacement, à l'inverse du second. -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e -\textLengthOn -a4_"scherzando" f +@lilypond[quote,verbatim] +\relative { + a'8^"pizz." g f e + \textLengthOn + a4_"scherzando" f +} @end lilypond En plus d'indications textuelles, les notes peuvent se voir attacher des @@ -102,9 +105,7 @@ textuelles et articulations, reportez-vous au chapitre @rlearning{Positionnement des objets}. @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff @predefined @code{\textLengthOn}, @@ -116,9 +117,9 @@ Manuel d'initiation : @rlearning{Positionnement des objets}. Manuel de notation : -@ref{Mise en forme du texte}, +@ref{Articulations et ornements}, @ref{Direction et positionnement}, -@ref{Articulations et ornements}. +@ref{Mise en forme du texte}. Morceaux choisis : @rlsrnamed{Text,Texte}. @@ -155,10 +156,12 @@ prolongent sur plusieurs notes à l'aide d'une ligne pleine, pointillée ou ondulée. Ces objets, que l'on appelle @qq{extenseurs}, se dessinent entre deux notes à l'aide de la syntaxe suivante : -@lilypond[verbatim,quote,relative=2] -\override TextSpanner.bound-details.left.text = "rit." -b1\startTextSpan -e,\stopTextSpan +@lilypond[verbatim,quote] +\relative { + \override TextSpanner.bound-details.left.text = "rit." + b'1\startTextSpan + e,\stopTextSpan +} @end lilypond @cindex texte, mise en forme des prolongations @@ -172,11 +175,13 @@ cependant, rien ne s'oppose à un autre graphisme dès lors que vous faites appel à un bloc @code{\markup} -- voir @ref{Mise en forme du texte}. -@lilypond[quote,relative=2,verbatim] -\override TextSpanner.bound-details.left.text = - \markup { \upright "rit." } -b1\startTextSpan c -e,\stopTextSpan +@lilypond[quote,verbatim] +\relative { + \override TextSpanner.bound-details.left.text = + \markup { \upright "rit." } + b'1\startTextSpan c + e,\stopTextSpan +} @end lilypond Le style de ligne se définit lui aussi comme une propriété de l'objet. @@ -184,11 +189,8 @@ Les détails concernant la syntaxe à utiliser sont expliqués au chapitre @ref{Styles de ligne}. @funindex \textSpannerUp -@funindex textSpannerUp @funindex \textSpannerDown -@funindex textSpannerDown @funindex \textSpannerNeutral -@funindex textSpannerNeutral @predefined @code{\textSpannerUp}, @@ -205,9 +207,9 @@ Les détails concernant la syntaxe à utiliser sont expliqués au chapitre @seealso Manuel de notation : -@ref{Styles de ligne}, +@ref{Mise en forme du texte}, @ref{Nuances}, -@ref{Mise en forme du texte}. +@ref{Styles de ligne}. Morceaux choisis : @rlsrnamed{Text,Texte}, @@ -231,9 +233,7 @@ LilyPond ne peut traiter qu'un seul extenseur à la fois par voix. @cindex barres de mesure, symboles au dessus de @funindex \mark -@funindex mark @funindex \markup -@funindex markup La commande @code{\mark} est tout d'abord conçue pour les @ref{Indications de repère}. @@ -241,10 +241,15 @@ La commande @code{\mark} est tout d'abord conçue pour les @c \mark needs to be placed on a separate line (it's not @c attached to an object like \markup is). -vv -@lilypond[verbatim,quote,relative=2] -c4 -\mark "Allegro" -c c c +@lilypond[verbatim,quote] +\relative { + \mark "Verse" + c'2 g' + \bar "||" + \mark "Chorus" + g2 c, + \bar "|." +} @end lilypond Cette syntaxe rend possible l'adjonction de n'importe quel texte à une @@ -252,11 +257,13 @@ barre de mesure. Ce texte peut être mis en forme de différentes manières dès lors qu'est utilisé un bloc @code{\markup}, comme indiqué au chapitre @ref{Mise en forme du texte}. -@lilypond[quote,verbatim,relative=1] -1 -\mark \markup { \italic { colla parte } } -2 -1 +@lilypond[quote,verbatim] +\relative { + 1 + \mark \markup { \italic { colla parte } } + 2 + 1 +} @end lilypond @noindent @@ -266,10 +273,12 @@ barre de mesure. Couplez-la alors à la commande @code{\markup} pour avoir accès au symbole approprié, selon les indications contenues au chapitre @ref{Notation musicale dans du texte formaté}. -@lilypond[quote,verbatim,relative=2] -2 -\mark \markup { \musicglyph #"scripts.ufermata" } -1 +@lilypond[quote,verbatim] +\relative { + 2 + \mark \markup { \musicglyph #"scripts.ufermata" } + 1 +} @end lilypond @noindent @@ -282,17 +291,17 @@ elle sera placée juste avant la première note de cette portée. Enfin, une marque qui tomberait sur un saut de ligne sera imprimée au début de la ligne suivante. -@lilypond[quote,verbatim,relative=2,ragged-right] -\mark "Allegro" -c1 c -\mark "assai" \break -c c +@lilypond[quote,verbatim,ragged-right] +\relative c'' { + \mark "Allegro" + c1 c + \mark "assai" \break + c c +} @end lilypond @funindex \markLengthOn -@funindex markLengthOn @funindex \markLengthOff -@funindex markLengthOff @predefined @code{\markLengthOn}, @@ -309,9 +318,9 @@ c c @seealso Manuel de notation : @ref{Indications de repère}, +@ref{La fonte Feta}, @ref{Mise en forme du texte}, -@ref{Notation musicale dans du texte formaté}, -@ref{La fonte Feta}. +@ref{Notation musicale dans du texte formaté}. Morceaux choisis: @rlsrnamed{Text,Texte}. @@ -334,7 +343,6 @@ Référence des propriétés internes : @cindex indépendant, texte @funindex \markup -@funindex markup Un bloc @code{\markup} peut exister en lui-même, indépendamment de tout bloc @code{\score}, et venir en préambule par exemple -- voir le @@ -370,9 +378,7 @@ fonctionnalité, ainsi que la syntaxe appropriée, est abordée plus en détail au chapitre @ref{Texte avec sauts de page}. @funindex \markup -@funindex markup @funindex \markuplist -@funindex markuplist @predefined @code{\markup}, @@ -386,8 +392,8 @@ détail au chapitre @ref{Texte avec sauts de page}. @seealso Manuel de notation : @ref{Mise en forme du texte}, -@ref{Structure de fichier}, @ref{Plusieurs partitions dans un même ouvrage}, +@ref{Structure de fichier}, @ref{Texte avec sauts de page}. Morceaux choisis : @@ -425,7 +431,6 @@ forme du texte à l'aide de la syntaxe propre au mode @code{\markup}. @cindex annotation @funindex \markup -@funindex markup La commande @code{\markup} permet d'ajouter du texte et dispose de sa propre syntaxe que nous appellerons le @qq{mode @emph{markup}}. @@ -447,14 +452,16 @@ d'autres commandes @emph{markup}, dès lors qu'elles sont précédées du caractère @code{\}. Ces commandes n'affecteront que la première expression qui les suit. -@lilypond[quote,verbatim,relative=2] -a1-\markup intenso -a2^\markup { poco \italic più forte } -c e1 -d2_\markup { \italic "string. assai" } -e -b1^\markup { \bold { molto \italic agitato } } -c +@lilypond[quote,verbatim] +\relative { + a'1-\markup intenso + a2^\markup { poco \italic più forte } + c e1 + d2_\markup { \italic "string. assai" } + e + b1^\markup { \bold { molto \italic agitato } } + c +} @end lilypond @cindex caractères spéciaux en mode markup @@ -476,10 +483,12 @@ inverse. @c repeat double quote for pairing " @c KEEP LY -@lilypond[quote,verbatim,relative=2] -a1^"\italic markup..." -a_\markup { \italic "... imprime des lettres en \"italique\" !" } -a a +@lilypond[quote,verbatim] +\relative { + a'1^"\italic markup..." + a_\markup { \italic "... imprime des lettres en \"italique\" !" } + a a +} @end lilypond Une liste de mots, pour pouvoir être traitée en tant qu'expression @@ -490,11 +499,13 @@ l'exemple qui suit, la deuxième expression @code{\markup} est traitée tout comme la première : @c repeat double quote for pairing " -@lilypond[quote,verbatim,relative=2] -c1^\markup { \center-column { a bbb c } } -c1^\markup { \center-column { a { bbb c } } } -c1^\markup { \center-column { a \line { bbb c } } } -c1^\markup { \center-column { a "bbb c" } } +@lilypond[quote,verbatim] +\relative c'' { + c1^\markup { \center-column { a bbb c } } + c1^\markup { \center-column { a { bbb c } } } + c1^\markup { \center-column { a \line { bbb c } } } + c1^\markup { \center-column { a "bbb c" } } +} @end lilypond Vous pouvez stocker les étiquettes textuelles en tant que variables, @@ -539,23 +550,22 @@ Les erreurs de syntaxe en mode @emph{markup} sont peu explicites. @cindex souligné @funindex \italic -@funindex italic @funindex \bold -@funindex bold @funindex \underline -@funindex underline Le mode @emph{markup} autorise des changements élémentaires de la fonte : -@lilypond[quote,verbatim,relative=2] -d1^\markup { - \bold { Più mosso } - \italic { non troppo \underline Vivo } +@lilypond[quote,verbatim] +\relative { + d''1^\markup { + \bold { Più mosso } + \italic { non troppo \underline Vivo } + } + r2 r4 r8 + d,_\markup { \italic quasi \smallCaps Tromba } + f1 d2 r } -r2 r4 r8 -d,_\markup { \italic quasi \smallCaps Tromba } -f1 d2 r @end lilypond @cindex caractères, taille @@ -563,60 +573,70 @@ f1 d2 r @funindex \abs-fontsize @funindex \fontsize -@funindex fontsize @funindex \smaller -@funindex smaller @funindex \larger -@funindex larger @funindex \magnify -@funindex magnify La taille des caractères se modifie, relativement à la taille globale des portées, de différentes manières. Vous pouvez adopter l'une des tailles prédéfinies, comme ici : -@lilypond[quote,verbatim,relative=2] -b1_\markup { \huge Sinfonia } -b1^\markup { \teeny da } -b1-\markup { \normalsize camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \huge Sinfonia } + b1^\markup { \teeny da } + b1-\markup { \normalsize camera } +} @end lilypond Vous pouvez la modifier relativement à sa valeur précédente : -@lilypond[quote,verbatim,relative=2] -b1_\markup { \larger Sinfonia } -b1^\markup { \smaller da } -b1-\markup { \magnify #0.6 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \larger Sinfonia } + b1^\markup { \smaller da } + b1-\markup { \magnify #0.6 camera } +} @end lilypond -Vous pouvez l'augementer ou la diminuer par rapport à la taille globale +Vous pouvez l'augmenter ou la diminuer par rapport à la taille globale de portée : -@lilypond[quote,verbatim,relative=2] -b1_\markup { \fontsize #-2 Sinfonia } -b1^\markup { \fontsize #1 da } -b1-\markup { \fontsize #3 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \fontsize #-2 Sinfonia } + b1^\markup { \fontsize #1 da } + b1-\markup { \fontsize #3 camera } +} @end lilypond Vous pouvez lui attribuer une valeur arbitraire quelle que soit la taille de portée globale : -@lilypond[quote,verbatim,relative=2] -b1_\markup { \abs-fontsize #20 Sinfonia } -b1^\markup { \abs-fontsize #8 da } -b1-\markup { \abs-fontsize #14 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \abs-fontsize #20 Sinfonia } + b1^\markup { \abs-fontsize #8 da } + b1-\markup { \abs-fontsize #14 camera } +} +@end lilypond + +Lorsque le texte comporte des espaces, mieux vaut le borner par des +guillemets informatiques ; s'en suivra une meilleure adéquation entre la +taille des espaces et celle des autres caractères : + +@lilypond[quote,verbatim] +\markup \fontsize #6 \bold { Sinfonia da camera } +\markup \fontsize #6 \bold { "Sinfonia da camera" } @end lilypond @cindex indice @cindex exposant @funindex \super -@funindex super @funindex \sub -@funindex sub @funindex \normal-size-super -@funindex normal-size-super Vous pouvez imprimer du texte en indice ou en exposant. Celui-ci sera dans une taille plus petite, mais rien ne s'oppose à ce que vous lui @@ -687,21 +707,13 @@ Pour savoir comment personnaliser des fontes, reportez-vous au chapitre @ref{Fontes}. @funindex \teeny -@funindex teeny @funindex \tiny -@funindex tiny @funindex \small -@funindex small @funindex \normalsize -@funindex normalsize @funindex \large -@funindex large @funindex \huge -@funindex huge @funindex \smaller -@funindex smaller @funindex \larger -@funindex larger @predefined @code{\teeny}, @@ -716,10 +728,10 @@ Pour savoir comment personnaliser des fontes, reportez-vous au chapitre @seealso Manuel de notation : -@ref{Font}, -@ref{Personnalisation des indications de nuance}, +@rusernamed{Font,Fonte}, +@ref{Fontes}, @ref{Indications de reprise manuelles}, -@ref{Fontes}. +@ref{Personnalisation des indications de nuance}. Fichiers d'initialisation : @file{scm/define-markup-commands.scm}. @@ -758,41 +770,41 @@ utilisant la syntaxe décrite au chapitre @cindex alignement horizontal du texte @funindex \left-align -@funindex left-align @funindex \center-align -@funindex center-align @funindex \right-align -@funindex right-align Les objets de type @emph{markup} peuvent s'aligner de différentes manières. Une indication textuelle est par défaut alignée sur son extrémité gauche. Dans l'exemple qui suit, il n'y a aucune différence entre les deux premiers @emph{markups}. -@lilypond[quote,verbatim,relative=2] -d1-\markup { poco } -f -d-\markup { \left-align poco } -f -d-\markup { \center-align { poco } } -f -d-\markup { \right-align poco } +@lilypond[quote,verbatim] +\relative { + d''1-\markup { poco } + f + d-\markup { \left-align poco } + f + d-\markup { \center-align { poco } } + f + d-\markup { \right-align poco } +} @end lilypond @funindex \halign -@funindex halign L'alignement horizontal peut être ajusté à l'aide d'une valeur numérique : -@lilypond[quote,verbatim,relative=2] -a1-\markup { \halign #-1 poco } -e' -a,-\markup { \halign #0 poco } -e' -a,-\markup { \halign #0.5 poco } -e' -a,-\markup { \halign #2 poco } +@lilypond[quote,verbatim] +\relative { + a'1-\markup { \halign #-1 poco } + e' + a,-\markup { \halign #0 poco } + e' + a,-\markup { \halign #0.5 poco } + e' + a,-\markup { \halign #2 poco } +} @end lilypond @noindent @@ -806,11 +818,8 @@ objets @emph{markup}, comme indiqué par exemple au chapitre @cindex alignement vertical du texte @funindex \raise -@funindex raise @funindex \lower -@funindex lower @funindex \null -@funindex null @c QUERY Should the function of ``\null'' be clarified? rp @@ -824,51 +833,52 @@ suit illustre ces deux possibilités. Vous noterez par ailleurs que le dernier @emph{markup}, dépourvu de point d'ancrage, n'est de ce fait pas déplacé. -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \raise #2 { Scène 1 } -} -a' -g_\markup { - \null - \lower #4 \bold { Très modéré } -} -a -d,^\markup { - \raise #4 \italic { Une forêt. } +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \raise #2 { Scène 1 } + } + a' + g_\markup { + \null + \lower #4 \bold { Très modéré } + } + a + d,^\markup { + \raise #4 \italic { Une forêt. } + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @funindex \general-align -@funindex general-align @funindex \translate -@funindex translate @funindex \translate-scaled -@funindex translate-scaled Certaines commandes permettent de régler l'alignement des objets textuels en mode @emph{markup}, tant au niveau horizontal que vertical. Tout objet soumis à ces commandes doit être précédé d'un point d'ancrage. -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \translate #'(-1 . 2) "Scène 1" -} -a' -g_\markup { - \null - \general-align #Y #3.2 \bold "Très modéré" -} -a -d,^\markup { - \null - \translate-scaled #'(-1 . 2) \teeny "Une forêt." +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \translate #'(-1 . 2) "Scène 1" + } + a' + g_\markup { + \null + \general-align #Y #3.2 \bold "Très modéré" + } + a + d,^\markup { + \null + \translate-scaled #'(-1 . 2) \teeny "Une forêt." + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @cindex multiligne, markup @@ -879,9 +889,7 @@ a'4 a g2 a @cindex colonnes de texte @funindex \column -@funindex column @funindex \center-column -@funindex center-column Un objet de type @emph{markup} peut contenir plusieurs lignes de texte. Dans l'exemple suivant, chaque élément ou expression ira se placer sur @@ -908,7 +916,6 @@ sa propre ligne, tantôt alignée à gauche, tantôt centrée. @cindex markup, centrage sur la page @funindex \fill-line -@funindex fill-line Pareillement, une liste d'éléments ou d'expressions sera répartie sur une ligne entière, voire même centrée sur toute la page s'il n'y a qu'un @@ -940,9 +947,7 @@ texte multiligne ou une autre expression @emph{markup}. @cindex markup, texte justifié @funindex \wordwrap -@funindex wordwrap @funindex \justify -@funindex justify Les indications textuelles, lorsqu'elles sont relativement longues, peuvent se répartir sur plusieurs lignes en fonction de la largeur de @@ -987,7 +992,7 @@ Manuel d'initiation : @rlearning{Déplacement d'objets}. Manuel de notation : -@ref{Align}, +@rusernamed{Align,Alignement}, @ref{Indications textuelles}. Fichiers d'initialisation : @@ -1021,15 +1026,10 @@ graphiques à votre partition. @cindex markup, encadrement du texte @funindex \box -@funindex box @funindex \circle -@funindex circle @funindex \rounded-box -@funindex rounded-box @funindex \bracket -@funindex bracket @funindex \hbracket -@funindex hbracket Certaines commandes de @emph{markup} permettent d'ornementer des éléments textuels avec des graphismes, à l'instar de l'exemple @@ -1057,13 +1057,9 @@ suivant : @cindex markup, rembourrage du texte @funindex \pad-markup -@funindex pad-markup @funindex \pad-x -@funindex pad-x @funindex \pad-to-box -@funindex pad-to-box @funindex \pad-around -@funindex pad-around Certaines directives peuvent nécessiter d'accroître l'espacement autour du texte -- voir l'annexe @ref{Align} pour une liste des différentes @@ -1097,17 +1093,11 @@ Flute quartet keeps very uneven time." @cindex notation et graphisme @funindex \combine -@funindex combine @funindex \draw-circle -@funindex draw-circle @funindex \filled-box -@funindex filled-box @funindex \triangle -@funindex triangle @funindex \draw-line -@funindex draw-line @funindex \arrow-head -@funindex arrow-head Vous pouvez imprimer certains graphismes ou symboles sans qu'il n'y ait de texte. Ces objets peuvent même se combiner, à l'instar de @@ -1135,9 +1125,7 @@ n'importe quelle expression @emph{markup}. @cindex postscript @funindex \epsfile -@funindex epsfile @funindex \postscript -@funindex postscript Des fonctionnalités graphiques avancées vous permettent même d'inclure dans une partition un fichier image converti au format PostScript @@ -1146,8 +1134,8 @@ directement dans le fichier source à partir d'instructions PostScript pures. Nous vous conseillons, en pareil cas, de toujours spécifier les dimensions du dessin, comme dans ce qui suit : -@lilypond[quote,verbatim,relative=1] -c1^\markup { +@lilypond[quote,verbatim,fragment] +c'1^\markup { \combine \epsfile #X #10 #"./context-example.eps" \with-dimensions #'(0 . 6) #'(0 . 10) @@ -1163,7 +1151,7 @@ c1^\markup { closepath stroke" } -c +c' @end lilypond L'annexe @ref{Graphic} répertorie les différentes commandes en matière @@ -1171,9 +1159,10 @@ de graphisme. @seealso Manuel de notation : -@ref{Graphic}, +@rusernamed{Align,Alignement}, @ref{Annotations éditoriales}, -@ref{Align}. +@ref{Dimensions}, +@rusernamed{Graphic,Graphique}. Fichiers d'initialisation : @file{scm/define-markup-commands.scm}, @@ -1200,38 +1189,40 @@ objet @emph{markup}. Notes et altérations sont données à l'aide d'instructions @emph{markup} : -@lilypond[quote,verbatim,relative=2] -a2 a^\markup { +@lilypond[quote,verbatim,fragment] +a'2 a'^\markup { \note #"4" #1 = \note-by-number #1 #1 #1.5 } -b1_\markup { +b'1_\markup { \natural \semiflat \flat \sesquiflat \doubleflat } \glissando -a1_\markup { +a'1_\markup { \natural \semisharp \sharp \sesquisharp \doublesharp } -\glissando b +\glissando b' @end lilypond Le mode @emph{markup} permet d'accéder à d'autres objets de notation : -@lilypond[quote,verbatim,relative=1] -g1 bes -ees\finger \markup \tied-lyric #"4~1" -fis_\markup { \dynamic rf } -bes^\markup { - \beam #8 #0.1 #0.5 -} -cis -d-\markup { - \markalphabet #8 - \markletter #8 +@lilypond[quote,verbatim] +\relative { + g1 bes + ees\finger \markup \tied-lyric #"4~1" + fis_\markup { \dynamic rf } + bes^\markup { + \beam #8 #0.1 #0.5 + } + cis + d-\markup { + \markalphabet #8 + \markletter #8 + } } @end lilypond @@ -1239,13 +1230,15 @@ En règle générale, tout symbole musical peut être inclus dans un @emph{markup}, comme le montre l'exemple qui suit. Ces différents symboles sont répertoriés dans l'annexe @ref{La fonte Feta}. -@lilypond[quote,verbatim,relative=2] -c2 -c'^\markup { \musicglyph #"eight" } -c,4 -c,8._\markup { \musicglyph #"clefs.G_change" } -c16 -c2^\markup { \musicglyph #"timesig.neomensural94" } +@lilypond[quote,verbatim] +\relative { + c''2 + c'^\markup { \musicglyph #"eight" } + c,4 + c,8._\markup { \musicglyph #"clefs.G_change" } + c16 + c2^\markup { \musicglyph #"timesig.neomensural94" } +} @end lilypond La rubrique @ref{Tout savoir sur les fontes} contient d'autres @@ -1255,20 +1248,22 @@ crochets ou accolades. Le mode @emph{markup} supporte aussi les diagrammes spécifiques à certains instruments : -@lilypond[quote,verbatim,relative=2] -c1^\markup { - \fret-diagram-terse #"x;x;o;2;3;2;" -} -c^\markup { - \harp-pedal #"^-v|--ov^" -} -c -c^\markup { - \combine - \musicglyph #"accordion.discant" +@lilypond[quote,verbatim] +\relative { + c''1^\markup { + \fret-diagram-terse #"x;x;o;2;3;2;" + } + c^\markup { + \harp-pedal #"^-v|--ov^" + } + c + c^\markup { \combine - \raise #0.5 \musicglyph #"accordion.dot" - \raise #1.5 \musicglyph #"accordion.dot" + \musicglyph #"accordion.discant" + \combine + \raise #0.5 \musicglyph #"accordion.dot" + \raise #1.5 \musicglyph #"accordion.dot" + } } @end lilypond @@ -1285,15 +1280,17 @@ Rien ne s'oppose à ce qu'une étiquette ne comporte une partition. Il suffit que l'expression en question contienne un bloc @code{\score} incluant un bloc @code{\layout}. -@lilypond[quote,verbatim,relative=1] -c4 d^\markup { - \score { - \relative c' { c4 d e f } - \layout { } +@lilypond[quote,verbatim] +\relative { + c'4 d^\markup { + \score { + \relative { c'4 d e f } + \layout { } + } } + e f | + c d e f } -e f | -c d e f @end lilypond Les différentes commandes @emph{markup} relatives à la notation musicale @@ -1301,8 +1298,8 @@ sont répertoriées à l'annexe @ref{Music}. @seealso Manuel de notation : -@ref{Music}, @ref{La fonte Feta}, +@rusernamed{Music,Musique}, @ref{Tout savoir sur les fontes}. Fichiers d'initialisation : @@ -1327,11 +1324,8 @@ Référence des propriétés internes : @cindex plusieurs pages de texte @funindex \markuplist -@funindex markuplist @funindex \justified-lines -@funindex justified-lines @funindex \wordwrap-lines -@funindex wordwrap-lines Alors que @code{\markup} s'utilise pour traiter un bloc de texte insécable, @code{\markuplist} permet, employé en tête de partition, @@ -1426,8 +1420,8 @@ spécifiques regroupés dans plusieurs familles. L'exemple qui suit montre la syntaxe à utiliser pour accéder, en mode @emph{markup}, aux différentes fontes @code{feta} non textuelles de LilyPond. -@lilypond[quote,verbatim,relative=2] -a1^\markup { +@lilypond[quote,verbatim,fragment] +a'1^\markup { \vcenter { \override #'(font-encoding . fetaBraces) \lookup #"brace120" @@ -1456,20 +1450,18 @@ comporte que des accolades ouvrantes. Pour obtenir une accolade fermante, il suffit d'appliquer une rotation au glyphe sélectionné, comme indiqué à la rubrique @ref{Rotation des objets}. -Vous disposez de trois familles de fontes textuelles : @emph{roman} pour -la police sérif ou avec empattement -- fixée par défaut à New Century -Schoolbook --, une police sans empattement (@emph{sans} sérif) et une à -chasse fixe (monospace ou @emph{typewriter}) -- les deux dernières étant -déterminées par l'installation de Pango. - -@warning{Aucune police par défaut n'est associée aux familles -@emph{sans} et @emph{typewriter}. Lorsque l'une d'elles apparaît dans -un fichier source, le résultat peut varier d'un ordinateur à l'autre. -Le résultat sera homogène quelque soit la plateforme dès lors que ces -polices auront été spécifiées par leur nom et qu'elles sont disponibles -pour tout système amené à traiter le fichier. Voir -@ref{Attribution d'une fonte en particulier} et -@ref{Choix des fontes par défaut}.} +Vous disposez de trois familles de fontes textuelles : +@itemize +@item +@emph{roman} pour la police sérif ou avec empattement -- fixée par +défaut à LilyPond Serif (alias de TeX Gyre Schola), +@item +une police sans empattement (@emph{sans} sérif) -- fixée par défaut à +LilyPond Sans Serif (alias de TeX Gyre Heros) et +@item +une police à chasse fixe (monospace ou @emph{typewriter}) -- fixée par +défaut à LilyPond Monospace (alias de TeX Gyre Cursor). +@end itemize Chaque famille dispose en principe de différents styles et niveaux de gras. L'exemple qui suit illustre la manière de changer la famille, le @@ -1477,14 +1469,14 @@ style, la graisse ou la taille. Notez bien que l'argument fourni à @code{font-size} correspond à la correction à apporter à la taille par défaut. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Score.RehearsalMark.font-family = #'typewriter \mark \markup "Ouverture" \override Voice.TextScript.font-shape = #'italic \override Voice.TextScript.font-series = #'bold -d2.^\markup "Allegro" +d''2.^\markup "Allegro" \override Voice.TextScript.font-size = #-3 -c4^smaller +c''4^smaller @end lilypond @noindent @@ -1526,7 +1518,7 @@ Manuel de notation : @ref{Notation musicale dans du texte formaté}, @ref{Rotation des objets}, @ref{Sélection de la fonte et de la taille}, -@ref{Font}. +@rusernamed{Font,Fonte}. @node Attribution d'une fonte en particulier @@ -1537,24 +1529,30 @@ Vous pouvez utiliser n'importe quelle police installée sur votre système, dès lors qu'elle est accessible par Fontconfig et que vous respectez la syntaxe suivante : -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.TimeSignature.font-name = #"Bitstream Charter" \override Staff.TimeSignature.font-size = #2 \time 3/4 -a1_\markup { - \override #'(font-name . "Vera Bold") - { Vera Bold } +a'1_\markup { + \override #'(font-name . "Bitstream Vera Sans,sans-serif, Oblique Bold") + { Vera Oblique Bold } } @end lilypond @cindex fontes disponibles @cindex disponibilité des fontes +@var{font-name} peut se décrire sous la forme d'une liste de polices +séparées par une virgule, une espace et une liste de styles. Dès lors +que la police présente dans la liste est installée et comporte le glyphe +requis, elle sera utilisée ; c'est la suivante dans la liste qui sera +utilisée dans le cas contraire. + @funindex show-available-fonts -Pour obtenir la liste de toutes les polices disponibles sur votre -machine, lancez +LilyPond, lancé avec l'option suivante, affiche la liste de toutes +les polices disponibles sur votre machine : @example lilypond -dshow-available-fonts toto @@ -1564,8 +1562,8 @@ lilypond -dshow-available-fonts toto @seealso Manuel de notation : -@ref{Tout savoir sur les fontes}, -@ref{Choix des fontes par défaut}. +@ref{Choix des fontes par défaut}, +@ref{Tout savoir sur les fontes}. Morceaux choisis : @rlsrnamed{Text,Texte}. @@ -1583,9 +1581,11 @@ Vous pouvez tout à fait préférer un autre jeu de polices par défaut que celui de LilyPond. Il vous faudra alors spécifier les différentes familles, en respectant l'ordre @emph{roman}, @emph{sans empattement} et @emph{monospace}, comme dans l'exemple suivant ; ces fontes seront -automatiquement mises à l'échelle de la taille globale des -portées. Pour plus d'explications sur les fontes, relisez -@ref{Tout savoir sur les fontes}. +automatiquement mises à l'échelle de la taille globale des portées. +Tout comme indiqué dans @ref{Attribution d'une fonte en particulier}, +il peut s'agir d'une liste de polices séparées par une virgule, à ceci +près qu'il n'est pas possible de spécifier de style. Pour plus +d'explications sur les fontes, relisez @ref{Tout savoir sur les fontes}. @cindex polices, choix par défaut @cindex fontes, choix par défaut @@ -1596,7 +1596,7 @@ portées. Pour plus d'explications sur les fontes, relisez \paper { #(define fonts (make-pango-font-tree "Times New Roman" - "Nimbus Sans" + "Nimbus Sans,Nimbus Sans L" "Luxi Mono" (/ staff-height pt 20))) } @@ -1614,7 +1614,7 @@ portées. Pour plus d'explications sur les fontes, relisez @seealso Manuel de notation : -@ref{Tout savoir sur les fontes}, @ref{Attribution d'une fonte en particulier}, +@rusernamed{Font,Fonte}, @ref{Sélection de la fonte et de la taille}, -@ref{Font}. +@ref{Tout savoir sur les fontes}. diff --git a/Documentation/fr/notation/unfretted-strings.itely b/Documentation/fr/notation/unfretted-strings.itely index 35b84030ac..cc428db791 100644 --- a/Documentation/fr/notation/unfretted-strings.itely +++ b/Documentation/fr/notation/unfretted-strings.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- @ignore - Translation of GIT committish: d4c6b132223ef4312a637160503a132c2373f525 + Translation of GIT committish: caa4700b4acbc870158d70ee257efaa723c550f0 - When revising a translation, copy the HEAD committish of the - version that you are working on. For details, see the Contributors' - Guide, node Updating translation committishes.. + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.18.0" @c Translators: Valentin Villenave, Matthieu Jacquot @c Translation checkers: Jean-Charles Malahieude, John Mandereau @@ -83,10 +83,10 @@ Manuel d'initiation : @rlearning{Modèles pour quatuor à cordes}. Manuel de notation : +@ref{Arpèges}, @ref{Commentaires textuels}, @ref{Doigtés}, -@ref{Notes en accords}, -@ref{Arpèges}. +@ref{Notes en accords}. Morceaux choisis : @rlsrnamed{Unfretted strings, Cordes non frettées}. @@ -99,12 +99,14 @@ Morceaux choisis : @funindex \upbow @funindex \downbow @funindex \open +@funindex \romanStringNumbers @cindex indications d'archet @cindex poussé, indication d'archet @cindex tiré, indication d'archet @cindex indication de corde à vide @cindex corde à vide, indication +@cindex corde, numéro Les indications d'archet se créent comme des articulations, elles sont décrites dans @ref{Articulations et ornements}. @@ -112,29 +114,36 @@ décrites dans @ref{Articulations et ornements}. Les indications d'archet, poussé (@code{\upbow}) et tiré (@code{\downbow}), peuvent se combiner à des liaisons comme ici : -@lilypond[verbatim,quote,relative=2] -c4(\downbow d) e(\upbow f) +@lilypond[verbatim,quote] +\relative { c''4(\downbow d) e(\upbow f) } @end lilypond @noindent -ou dans l'exemple suivant qui montre trois manières d'indiquer la corde -de La, à vide, sur un violon : - -@lilypond[verbatim,quote,relative=2] -a4 \open -a^\markup { \teeny "II" } -a2^\markup { \small "sul A" } +Des chiffres romains peuvent s'ajouter pour indiquer les numéros de +corde (en lieu et place de chiffres arabes cerclés), comme expliqué +dans @ref{Indications du numéro de corde}. + +Alternativement, les indications de corde peuvent se traiter sous forme +de @emph{markup}, et un script indiquer une corde à vide. + +@lilypond[verbatim,quote,fragment] +a'4 \open +\romanStringNumbers +a'\2 +a'2^\markup { \small "sul A" } @end lilypond @predefined @code{\downbow}, @code{\upbow}, -@code{\open}. +@code{\open}, +@code{\romanStringNumbers}. @endpredefined @seealso Manuel de notation : @ref{Articulations et ornements}, +@ref{Indications du numéro de corde}, @ref{Liaisons d'articulation}. @@ -159,21 +168,23 @@ tête de note en forme de losange signifie généralement que vous devez effleurer la corde à l'endroit où vous l'auriez pincée si la note avait été normale. -@lilypond[verbatim,quote,relative=2] -d4 e4. -\harmonicsOn -d8 e e -d4 e4. -\harmonicsOff -d8 e e +@lilypond[verbatim,quote] +\relative d'' { + d4 e4. + \harmonicsOn + d8 e e + d4 e4. + \harmonicsOff + d8 e e +} @end lilypond Une autre façon de procéder consiste à faire surmonter la note normale d'un petit cercle. Ceci indique que la note écrite doit être jouée en harmonique : -@lilypond[verbatim,quote,relative=2] -d2^\flageolet d_\flageolet +@lilypond[verbatim,quote,fragment] +d''2^\flageolet d''_\flageolet @end lilypond Un plus petit cercle peut être créé, comme indiqué dans les exemples de @@ -209,8 +220,8 @@ Glossaire musicologique : @rglos{harmonics}. Manuel de notation : -@ref{Têtes de note spécifiques}, -@ref{Références en matière de cordes non frettées}. +@ref{Références en matière de cordes non frettées}, +@ref{Têtes de note spécifiques}. @node Snap (Bartók) pizzicato @@ -226,9 +237,11 @@ Un @notation{snap pizzicato}, aussi appelé @qq{Bartok pizz} est un type de pizzicato pour lequel la corde est tirée vers le haut (plutôt que sur le côté) de telle sorte qu'elle vienne frapper le manche. -@lilypond[verbatim,quote,relative=1] -c4\snappizzicato -4\snappizzicato -4^\snappizzicato -4_\snappizzicato +@lilypond[verbatim,quote] +\relative { + c'4\snappizzicato + 4\snappizzicato + 4^\snappizzicato + 4_\snappizzicato +} @end lilypond diff --git a/Documentation/fr/notation/vocal.itely b/Documentation/fr/notation/vocal.itely index cd0b35afe9..a06b34051f 100644 --- a/Documentation/fr/notation/vocal.itely +++ b/Documentation/fr/notation/vocal.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- @ignore - Translation of GIT committish: d46572826e777ed3e9fa4656535a6e9000f2ed9e + Translation of GIT committish: caa4700b4acbc870158d70ee257efaa723c550f0 - When revising a translation, copy the HEAD committish of the - version that you are working on. For details, see the Contributors' - Guide, node Updating translation committishes.. + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @c Translators: Valentin Villenave, Jean-Charles Malahieude @c Translation checkers: Jean-Jacques Gerbaud @@ -94,8 +94,8 @@ Manuel d'initiation : @rlearning{Écriture de chants simples}. Manuel de notation : -@ref{Introduction au formatage de texte}, @ref{Ambitus}, +@ref{Introduction au formatage de texte}, @ref{Mise en forme d'une partition chorale}. Morceaux choisis : @@ -150,7 +150,7 @@ syllabe. L'exemple suivant comporte une faute de frappe évidente : @end example @noindent -la dernière syllabe contient une @code{@}} ; il y a de fait un +la dernière syllabe contient une @code{@}} ; il y a de fait un défaut de parité avec l'accolade ouvrante, et la compilation échouera fort probablement. Prenez dès à présent l'habitude de toujours encadrer d'espaces une accolade : @@ -165,7 +165,7 @@ dans le fichier et de veiller à le sauvegarder avec le codage UTF-8. Voir à ce sujet @ref{Caractères spéciaux} pour plus de détails. @lilypond[quote,verbatim] -\relative c'' { d8 c16 a bes8 f e' d c4 } +\relative { d''8 c16 a bes8 f ees' d c4 } \addlyrics { „Schad’ um das schö -- ne grü -- ne Band, } @end lilypond @@ -174,7 +174,7 @@ précéder d'une barre oblique inverse et encadrez d'une paire de guillemets la syllabe ainsi composée : @lilypond[quote,verbatim] -\relative c' { \time 3/4 e4 e4. e8 d4 e d c2. } +\relative { \time 3/4 e'4 e4. e8 d4 e d c2. } \addlyrics { "\"I" am so lone- "ly\"" said she } @end lilypond @@ -194,7 +194,7 @@ mode @code{\markup}, utilisable y compris au sein du mode @code{\lyricmode}. Des explications complètes sont disponibles au chapitre @ref{Mise en forme du texte}. -@snippets +1@snippets @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] {formatting-lyrics-syllables.ly} @@ -224,13 +224,25 @@ Référence des propriétés internes : @funindex \addlyrics @funindex \lyricsto -L'impression des paroles est réalisée à partir de l'interprétation d'un -contexte @code{Lyrics} -- voir @ref{Tout savoir sur les contextes}. +Les paroles sont interprétées à partir à partir du mode +@code{\lyricmode} et imprimées dans un contexte @code{Lyrics} -- voir + @ref{Tout savoir sur les contextes}. @example \new Lyrics \lyricmode @{ @dots{} @} @end example +Deux variantes à @code{\lyricmode} permettent de plus d'associer +un contexte pour synchroniser les syllabes à la musique. La plus +commode consiste à ajouter un @code{\addlyrics} directement après +le contenu musical du context @code{Voice} qui devrait se +synchroniser avec le contexte @code{Lyrics} alors implicitement +créé. L'instruction @code{\lyricsto} est plus versatile en ceci +qu'elle requiert de spécifier à la fois le contexte @code{Voice} +associé et de créer explicitement un contexte @code{Lyrics} pour +contenir les paroles. Pour de plus amples détails, voir +@ref{Durée automatique des syllabes}. + Vous disposez de deux méthodes pour aligner des paroles sur une mélodie : @@ -248,13 +260,13 @@ circonstances, une mélodie associée, grâce aux commandes << \new Staff << \time 2/4 - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \voiceOne - c4 b8. a16 g4. r8 a4 ( b ) c2 + c''4 b8. a16 g4. r8 a4 ( b ) c2 } - \new Voice = "two" \relative c' { + \new Voice = "two" \relative { \voiceTwo - s2 s4. f8 e4 d c2 + s2 s4. f'8 e4 d c2 } >> @@ -289,9 +301,9 @@ explicitement leur durée à chaque syllabe. @lilypond[quote,ragged-right,verbatim] << - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \time 2/4 - c4 b8. a16 g4. f8 e4 d c2 + c''4 b8. a16 g4. f8 e4 d c2 } % uses previous explicit duration of 2; @@ -318,12 +330,6 @@ déduire les durées à partir d'un contexte musical ; la rubrique technique permet aussi d'ajouter des dialogues, comme indiqué à la rubrique @ref{Dialogue et musique}. -Des paroles saisies de cette manière s'aligneront par défaut sur la -gauche des notes ; elles seront centrées sur les notes de la -mélodie dès lors que vous pourrez les associer à une voix. Tout ceci -est abordé plus en détails à la rubrique -@ref{Durée explicite des syllabes}. - @end itemize @seealso @@ -387,10 +393,10 @@ spécifiant à l'aide de la commande @code{\lyricsto} le contexte de voix qui contient cette mélodie : @c KEEP LY -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - \new Voice = "melodie" { - a1 a4. a8 a2 + \new Voice = "melodie" \relative { + a'1 a4. a8 a2 } \new Lyrics \lyricsto "melodie" { Ce sont les mots @@ -403,11 +409,9 @@ Cette commande adapte les paroles aux notes de la voix (contexte @code{Voice} dans le jargon LilyPond) @var{melodie}. Ce contexte @code{Voice} doit exister avant l'affectation des paroles par @code{\lyricsto}. La commande @code{\lyricsto} introduit -automatiquement le mode @code{\lyricmode} ; il n'est alors pas -nécessaire de rajouter @code{\lyricmode}. Les paroles viendront par -défaut se placer en dessous des notes ; la rubrique -@ref{Positionnement vertical des paroles} vous donnera des indications -pour d'autres options. +automatiquement le mode @code{\lyricmode}. Les paroles viendront par +défaut se placer en dessous des notes. Pour un autre positionnement, +voir @ref{Positionnement vertical des paroles}. @subheading Utilisation de @code{\addlyrics} @@ -425,7 +429,7 @@ d'écrire de la musique vocale dans une structure Lilypond plus complexe. @end example @noindent -revient au même que +revient au même que @example \new Voice = "blah" @{ MUSIQUE @} @@ -437,7 +441,7 @@ En voici un exemple : @lilypond[verbatim,quote] { \time 3/4 - \relative c' { c2 e4 g2. } + \relative { c'2 e4 g2. } \addlyrics { play the game } } @end lilypond @@ -448,7 +452,7 @@ sections @code{\addlyrics}. @lilypond[ragged-right,verbatim,quote] { \time 3/4 - \relative c' { c2 e4 g2. } + \relative { c'2 e4 g2. } \addlyrics { play the game } \addlyrics { speel het spel } \addlyrics { joue le jeu } @@ -482,13 +486,13 @@ Voici un exemple de cette manière de procéder : << \new Staff << \time 2/4 - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \voiceOne - c4 b8. a16 g4. r8 a4 ( b ) c2 + c''4 b8. a16 g4. r8 a4 ( b ) c2 } - \new Voice = "two" \relative c' { + \new Voice = "two" \relative { \voiceTwo - s2 s4. f8 e8 d4. c2 + s2 s4. f'8 e8 d4. c2 } >> % takes durations and alignment from notes in "one" initially @@ -517,20 +521,19 @@ syllabes sont entrées comme des notes -- du texte remplaçant les hauteurs -- ce qui veut dire que vous devez définir leur durée explicitement. -Par défaut, les syllabes seront alignées par la gauche sur l'instant -musical. Les traits d'union seront imprimés entre les syllabes, à -l'inverse des mélismes puisqu'il n'y a pas de voix associée. +Les traits d'union seront imprimés entre les syllabes, à l'inverse des +mélismes puisqu'il n'y a pas de voix associée. Voici deux illustrations de cette technique : -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << \new Voice = "melody" { \time 3/4 - c2 e4 g2 f + c''2 a f f e e } \new Lyrics \lyricmode { - play1 the4 game4 + c4. -- a -- f -- f -- e2. -- e } >> @end lilypond @@ -538,8 +541,8 @@ Voici deux illustrations de cette technique : @lilypond[quote,verbatim,ragged-right] << \new Staff { - \relative c'' { - c2 c2 + \relative { + c''2 c2 d1 } } @@ -549,8 +552,8 @@ Voici deux illustrations de cette technique : } } \new Staff { - \relative c' { - c8 c c c c c c c + \relative { + c'8 c c c c c c c c8 c c c c c c c } } @@ -560,28 +563,22 @@ Voici deux illustrations de cette technique : Cette manière de procéder est tout à fait adaptée lorsqu'un fond musical accompagne des dialogues -- voir @ref{Dialogue et musique}. -Les syllabes seront centrées par rapport à l'instant musical dès lors -que vous aurez attribué à la propriété @code{associatedVoice} le nom du -contexte @code{Voice} contenant les notes. Grâce à l'utilisation de -@code{associatedVoice}, les doubles tirets @code{--} ou soulignés -@code{__} seront rendus correctement en trait d'union ou indication de -mélisme. +Les syllabes seront alignées selon la dérogation apportée à la propriété +@code{self-alignment-X} : -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - c2 e4 g f g + c'2 e4 g2 f } \new Lyrics \lyricmode { - \set associatedVoice = #"melody" - play2 the4 game2. __ + \override LyricText.self-alignment-X = #LEFT + play1 a4 game4 } >> @end lilypond -@c TODO see also feature request 707 - show how to do this with manual durations - @seealso Manuel de notation : @ref{Dialogue et musique}. @@ -602,14 +599,15 @@ Référence des propriétés internes : @funindex _ Pour attribuer plus d'une syllabe à une même note, vous pouvez soit les -mettre entre guillemets, soit utiliser le caractère souligné -(@code{_}) pour obtenir une espace, ou bien encore utiliser un tilde -(@code{~}) pour obtenir une liaison entre les syllabes. +mettre entre guillemets, soit utiliser le caractère souligné (@code{_}) +pour obtenir une espace, ou bien encore utiliser un tilde (@code{~}) +pour obtenir une liaison entre les syllabes. -@lilypond[quote,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] { - { \autoBeamOff - r8 b c fis, fis c' b e, + \relative { + \autoBeamOff + r8 b' c fis, fis c' b e, } \addlyrics { @@ -644,7 +642,7 @@ traditionnellement alignée par la gauche sur la première note du mélisme. Lorsqu'un mélisme tombe sur une syllabe autre que la dernière d'un mot, un trait d'union étiré, indiqué par un double tiret @w{@code{--}} dans -le fichier source, reliera cette syllabe à la suivante. +le fichier source, reliera cette syllabe à la suivante. Lorsqu'un mélisme tombe sur la dernière syllabe d'un mot ou que ce mot n'en comporte qu'une, l'usage est d'indiquer la « tenue » jusqu'à la @@ -658,13 +656,13 @@ Vous disposez de cinq méthodes pour indiquer la présence d'un mélisme : @item Une liaison de prolongation constitue de fait un mélisme : -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g2 ~ | - g4 e2 ~ | - e8 + f''4 g2 ~ | + 4 e2 ~ | + 8 } \new Lyrics \lyricsto "melody" { Ky -- ri -- e __ @@ -678,11 +676,11 @@ s'étendra de la première à la dernière note couvertes par cette liaison. Il s'agit là de la façon traditionnelle de saisir des paroles : -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 ( f e f ) + f''4 g8 ( f e f ) e8 ( d e2 ) } \new Lyrics \lyricsto "melody" { @@ -699,12 +697,12 @@ LilyPond considère des notes regroupées par une ligature manuelle comme un mélisme, si tant est que la procédure de ligature automatique a été désactivée -- voir @ref{Définition des règles de ligature automatique}. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \autoBeamOff - f4 g8[ f e f] + f''4 g8[ f e f] e2. } \new Lyrics \lyricsto "melody" { @@ -721,11 +719,11 @@ LilyPond considère un groupe de notes non liées, mais encadrées par @code{\melisma} et @code{\melismaEnd}, comme constituant un mélisme : -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 + f''4 g8 \melisma f e f \melismaEnd @@ -742,11 +740,11 @@ Vous pouvez indiquer un mélisme directement dans les paroles, à l'aide d'un caractère souligné simple @code{_}, pour chaque note faisant partie de la vocalise : -@lilypond[verbatim, quote, relative=2] +@lilypond[verbatim, quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 f e f + f''4 g8 f e f e8 d e2 } \new Lyrics \lyricsto "melody" { @@ -762,13 +760,13 @@ prolongation ou d'articulation et des ligatures apparaissant dans une mélodie comme fait générateur d'un mélisme. Il suffit en ce cas de définir @code{melismaBusyProperties} : -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \set melismaBusyProperties = #'() - c4 d ( e ) - g8 [ f ] f4 ~ f + c'4 d ( e ) + g8 [ f ] f4 ~ 4 } \new Lyrics \lyricsto "melody" { Ky -- ri -- e e -- le -- i -- son @@ -791,13 +789,13 @@ Lorsque, dans un passage où la propriété @code{melismaBusyProperties} est active, survient un mélisme, vous pouvez l'indiquer dans les paroles par un simple caractère souligné pour chaque note à inclure : -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \set melismaBusyProperties = #'() - c4 d ( e ) - g8 [ f ] ~ f4 ~ f + c'4 d ( e ) + g8 [ f ] ~ 4 ~ f } \new Lyrics \lyricsto "melody" { Ky -- ri -- _ e __ _ _ _ @@ -821,8 +819,8 @@ Manuel d'initiation : Manuel de notation : @ref{Alignement des paroles sur la mélodie}, -@ref{Durée automatique des syllabes}, @ref{Définition des règles de ligature automatique}, +@ref{Durée automatique des syllabes}, @ref{Rythme différent selon le couplet}. Référence des propriétés internes : @@ -902,8 +900,8 @@ Vous pouvez créer des variables pour contenir les paroles, dès lors que vous faites appel au mode approprié : @lilypond[quote,verbatim] -musicOne = \relative c'' { - c4 b8. a16 g4. f8 e4 d c2 +musicOne = \relative { + c''4 b8. a16 g4. f8 e4 d c2 } verseOne = \lyricmode { Joy to the world, the Lord is come. @@ -935,8 +933,8 @@ laquelle il est fait référence par @code{\lyricsto} aura bien été préalablement définie, comme dans l'exemple suivant : @lilypond[quote,verbatim] -sopranoMusic = \relative c'' { c4 c c c } -contraltoMusic = \relative c'' { a4 a a a } +sopranoMusic = \relative { c''4 c c c } +contraltoMusic = \relative { a'4 a a a } sopranoWords = \lyricmode { Sop -- ra -- no words } contraltoWords = \lyricmode { Con -- tral -- to words } @@ -995,7 +993,7 @@ de paroles après le contexte de portée : << \new Staff { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics { @@ -1017,7 +1015,7 @@ manière explicite : << \new Staff = "staff" { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics \with { alignAboveContext = "staff" } { @@ -1045,7 +1043,7 @@ question. Voici comment cela se présente : } \new Staff { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \context Lyrics = "lyrics" { @@ -1067,7 +1065,7 @@ deuxième méthode : \new ChoirStaff << \new Staff { \new Voice = "sopranos" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics = "sopranos" @@ -1077,7 +1075,7 @@ deuxième méthode : } \new Staff { \new Voice = "contraltos" { - \relative c'' { a4 a a a } + \relative { a'4 a a a } } } \context Lyrics = "sopranos" { @@ -1107,8 +1105,8 @@ Manuel d'initiation : @rlearning{Modèles pour ensemble vocal}. Manuel de notation : -@ref{Ordonnancement des contextes}, -@ref{Création et référencement d'un contexte}. +@ref{Création et référencement d'un contexte}, +@ref{Ordonnancement des contextes}. @node Positionnement horizontal des syllabes @@ -1121,8 +1119,8 @@ Manuel de notation : La propriété @code{minimum-distance} de l'objet @code{LyricSpace} permet d'accroître l'espacement des paroles. -@lilypond[relative=1,verbatim,quote,ragged-right] -{ +@lilypond[verbatim,quote,ragged-right] +\relative c' { c c c c \override Lyrics.LyricSpace.minimum-distance = #1.0 c c c c @@ -1139,8 +1137,8 @@ dans le bloc @code{\layout}. @lilypond[verbatim,quote,ragged-right] \score { - \relative c' { - c c c c + \relative { + c' c c c c c c c } \addlyrics { @@ -1210,8 +1208,8 @@ ne diffèrent pas d'une fois sur l'autre. << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1234,8 +1232,8 @@ Les mots seront alors correctement répétés si la reprise est développée. << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1259,8 +1257,8 @@ saisissez le texte normalement : << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat unfold 2 { b4 b b b } } } @@ -1286,8 +1284,8 @@ séparés ; ils seront combinés dans une section parallèle : << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1313,8 +1311,8 @@ Et ce quel que soit le nombre de « couplets » : << \new Staff { \new Voice = "singleVoice" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 3 { b4 b b b } c4 c c c } @@ -1352,8 +1350,8 @@ seront repoussées sous la dernière portée. L'instruction << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 3 { b4 b b b } c4 c c c } @@ -1377,8 +1375,8 @@ seront repoussées sous la dernière portée. L'instruction The end sec -- tion. } \new Voice = "harmony" { - \relative c' { - f4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 + \relative { + f'4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 } } >> @@ -1395,8 +1393,11 @@ seront repoussées sous la dernière portée. L'instruction @cindex reprise avec alternative et paroles @cindex alternative et paroles -Les paroles d'un fragment répété, lorsqu'elles sont identiques, peuvent -adopter la même construction que la musique : +Les paroles d'un fragment répété, lorsqu'elles sont identiques et +qu'aucune alternative ne débute par un silence, peuvent adopter la même +construction que la musique. Ceci permet par ailleurs une expansion +correcte à la fois de la musique et des paroles lors de l'utilisation de +@code{\unfoldRepeats}. @lilypond[quote,verbatim] \score { @@ -1404,8 +1405,8 @@ adopter la même construction que la musique : \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b } \alternative { { b b } { b c } } } @@ -1423,7 +1424,8 @@ adopter la même construction que la musique : @end lilypond Cette identité de structure n'est toutefois pas possible lorsque les -paroles sont différentes. Des instructions @code{\skip} devront venir +paroles sont différentes ou que l'un des blocs @code{\alternative} +débute par un silence. Des instructions @code{\skip} devront venir s'insérer dans les paroles pour « sauter » les notes des alternatives qui ne les concernent pas. @@ -1443,8 +1445,8 @@ note quelle qu'en soit la durée.} \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b } + \relative { + \repeat volta 2 { b'4 b } \alternative { { b b } { b c } } c4 c } @@ -1489,9 +1491,9 @@ temporairement la détection automatique de mélismes et insérer des \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { + \relative { \set melismaBusyProperties = #'() - \repeat volta 2 { b4 b ~} + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } \unset melismaBusyProperties c4 c @@ -1526,8 +1528,8 @@ insérer des blancs : \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b ~} + \relative { + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } c4 c } @@ -1559,8 +1561,8 @@ doivent être insérées manuellement : \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b ~} + \relative { + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } c4 c } @@ -1633,11 +1635,11 @@ d'une fois sur l'autre : \score { << \new Voice = "melody" { - \relative c' { + \relative { << { \voiceOne - e4 e8 e + e'4 e8 e } \new Voice = "splitpart" { \voiceTwo @@ -1659,16 +1661,15 @@ d'une fois sur l'autre : } @end lilypond -Il n'est pas rare, en musique chorale, qu'une voix se divise -pendant plusieurs mesures. Bien qu'une construction du type -@code{<< @{@dots{}@} \\ @{@dots{}@} >>}, où deux expressions -musicales (ou plus) séparées par des doubles obliques inversées -peuvent sembler être le moyen adéquat de définir cette division, -@strong{toutes} les expressions qu'elle contient seront assignées à -de @strong{nouveaux contextes de voix}, ce qui aura pour effet -qu'aucune parole ne leur sera affectée -- les paroles sont -attachées au contexte de voix initial. Il vaut mieux construire -ce passage comme une polyphonie temporaire -- voir +Il n'est pas rare, en musique chorale, qu'une voix se divise pendant +plusieurs mesures. Bien qu'une construction du type @code{<< +@{@dots{}@} \\ @{@dots{}@} >>}, où deux expressions musicales (ou plus) +séparées par des doubles obliques inversées peuvent sembler être le +moyen adéquat de définir cette division, @strong{toutes} les expressions +qu'elle contient seront assignées à de @strong{nouveaux contextes de +voix}, ce qui aura pour effet qu'aucune parole ne leur sera affectée -- +les paroles sont attachées au contexte de voix initial. Il vaut mieux +construire ce passage comme une polyphonie temporaire -- voir @ref{Polyphonie sur une portée}. @@ -1720,14 +1721,6 @@ words = \lyricmode { la __ la __ } >> @end lilypond -Le contexte @code{NullVoice} doit prendre place dans un contexte -@code{Staff} et ne saurait contenir que des notes déjà présentes sur la -portée en question et à la même octave. Dans le cas contraire, ce -@code{NullVoice} pourrait interagir avec les autres voix imprimées de -façon inopinée. Par exemple, des notes arbitraires dans un -@code{NullVoice} pourraient entraîner l'apparition ou la disparition -d'altérations sur la portée considérée. - Cette façon de procéder permet par ailleurs d'utiliser la fonction @code{\partcombine} qui normalement ne peut s'utiliser avec des paroles : @@ -1764,23 +1757,14 @@ altoTwo = \relative { d'2 g4( fis8 g) } aligner = \relative { b'8( c d c) d( d d d) } words = \lyricmode { la __ la __ } -\new ChoirStaff << - \new Staff << - \soprano - \new NullVoice = "aligner" \aligner - >> +\new ChoirStaff \with { \accepts NullVoice } << + \new Staff \soprano + \new NullVoice = "aligner" \aligner \new Lyrics \lyricsto "aligner" \words \new Staff \partcombine \altoOne \altoTwo >> @end lilypond -Vous aurez remarqué que, dans la deuxième partie de la mesure ci-dessus, -les notes du contexte @code{NullVoice} reprennent le rythme de la portée -inférieure sans pour autant dévier une seule fois des hauteurs affichées -dans la voix à laquelle ce @code{NullVoice} est attaché. Bien que ce ne -soit pas nécessaire dans le cadre de cet exemple particulier, nous vous -conseillons de saisir les notes d'un @code{NullVoice} de cette manière. - @node Couplets @subsection Couplets @@ -1805,9 +1789,9 @@ conseillons de saisir les notes d'un @code{NullVoice} de cette manière. On peut ajouter un numéro aux couplets en définissant la variable @code{stanza} : -@lilypond[quote,ragged-right,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. +@lilypond[quote,ragged-right,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. } \addlyrics { \set stanza = #"1. " Hi, my name is Bert. @@ -1894,9 +1878,9 @@ au début de chaque ligne comme les noms d'instrument. Il faut pour cela définir @code{vocalName}, et @code{shortVocalName} pour une version abrégée. -@lilypond[ragged-right,quote,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. +@lilypond[ragged-right,quote,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. } \addlyrics { \set vocalName = #"Bert " Hi, my name is Bert. @@ -1932,9 +1916,9 @@ laquelle elle s'appliquera : @lilypond[verbatim,ragged-right,quote] << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 \slurDotted f8.[( g16]) a4 @@ -1973,8 +1957,8 @@ propriété @code{includeGraceNotes} : @lilypond[verbatim,ragged-right,quote] << - \new Voice = melody \relative c' { - f4 \appoggiatura a32 b4 + \new Voice = melody \relative { + f'4 \appoggiatura a32 b4 \grace { f16 a16 } b2 \afterGrace b2 { f16[ a16] } \appoggiatura a32 b4 @@ -2029,9 +2013,9 @@ modifie la propriété @code{associatedVoice}. Dans cet exemple, @lilypond[verbatim,quote] << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 << \new Voice = "alternative" { \voiceOne @@ -2108,9 +2092,9 @@ entre les couplets (@emph{verses} en anglais) 2 et 3. @c KEEP LY @lilypond[ragged-right,verbatim,quote] -melody = \relative c'' { +melody = \relative { \time 2/4 - g4 g8 b | b a b a | + g'4 g8 b | b a b a | g4 g8 b | b a b4 | } @@ -2153,9 +2137,9 @@ traditionnellement le cas. @c KEEP LY @lilypond[ragged-right,quote,verbatim] -melody = \relative c'' { +melody = \relative { \time 2/4 - g4 g8 b | b a b a | + g'4 g8 b | b a b a | g4 g8 b | b a b4 | } @@ -2285,12 +2269,12 @@ Manuel d'initiation : @rlearning{Chansons}. Manuel de notation : -@ref{Vue d'ensemble de la musique vocale}, +@ref{Couplets}, @ref{Gravure des accords}, @ref{Gravure des portées}, @ref{Instruments utilisant des portées multiples}, @ref{Positionnement vertical des paroles}, -@ref{Couplets}. +@ref{Vue d'ensemble de la musique vocale}. Morceaux choisis : @rlsrnamed{Vocal music,Musique vocale}. @@ -2359,6 +2343,9 @@ différents endroits de la documentation de LilyPond : La création pas à pas d'une partition pour chœur se trouve dans le manuel d'initiation, à la rubrique @rlearning{Partition pour chœur à quatre voix mixtes}. +LilyPond dispose aussi d'un canevas automatisé qui simplifie grandement +la saisie d'une partiotion pour chœur SATB disponible à la rubrique +@rlearning{Gabarits préprogrammés}. @item Plusieurs exemples et canevas sont regroupés dans le manuel @@ -2400,9 +2387,9 @@ Manuel d'initiation : Manuel de notation : @ref{Ordonnancement des contextes}, +@ref{Polyphonie sur une portée}, @ref{Regroupement de portées}, -@ref{Têtes de note à forme variable}, -@ref{Polyphonie sur une portée}. +@ref{Têtes de note à forme variable}. Morceaux choisis : @rlsrnamed{Vocal music,Musique vocale}. @@ -2468,12 +2455,12 @@ du chœur. \new ChoirStaff << \new Staff { \new Voice { - \relative c'' { g4\f g g g } + \relative { g'4\f g g g } } } \new Staff { \new Voice { - \relative c' { d4 d d\p d } + \relative { d'4 d d\p d } } } >> @@ -2492,15 +2479,15 @@ du chœur. @seealso Manuel de notation : -@ref{Modification de l'espacement}, +@ref{Définition de la taille de portée}, +@ref{Espacement vertical}, @ref{Mise en évidence de l'espacement}, -@ref{Réduction du nombre de pages de la partition}, @ref{Mise en forme de la page}, @ref{Mise en forme de la partition}, -@ref{Séparation des systèmes}, -@ref{Définition de la taille de portée}, -@ref{Recours à une voix supplémentaire pour gérer les sauts}, -@ref{Espacement vertical}. +@ref{Modification de l'espacement}, +@ref{Réduction du nombre de pages de la partition}, +@ref{Sauts}, +@ref{Séparation des systèmes}. Référence des propriétés internes : @rinternals{VerticalAxisGroup}, @@ -2594,7 +2581,7 @@ anglophones la disent « à la française » -- est expliquée à la rubrique @ref{Masquage de portées}. @item -La génération d'un matériel d'orchestre fait l'objet de la rubrique +La génération d'un matériel d'orchestre fait l'objet de la rubrique @ref{Écriture de parties séparées}. D'autres parties du chapitre consacré à la notation spécialisée vous seront utiles selon l'orchestration de la pièce. Tous les instruments ne sont pas accordés @@ -2628,6 +2615,7 @@ Glossaire musicologique : Manuel de notation : @ref{Ajout de texte}, +@ref{Écriture de parties séparées}, @ref{Imbrication de regroupements de portées}, @ref{Instruments transpositeurs}, @ref{Masquage de portées}, @@ -2635,8 +2623,7 @@ Manuel de notation : @ref{Notes de bas de page}, @ref{Regroupement de portées}, @ref{Séparation des systèmes}, -@ref{Transposition}, -@ref{Écriture de parties séparées}. +@ref{Transposition}. Morceaux choisis : @rlsrnamed{Vocal music,Musique vocale}. @@ -2658,9 +2645,9 @@ l'indiquer en regard de cette portée : \new Staff { \set Staff.vocalName = \markup \smallCaps Kaspar \set Staff.shortVocalName = \markup \smallCaps Kas. - \relative c' { + \relative { \clef "G_8" - c4 c c c + c'4 c c c \break c4 c c c } @@ -2669,7 +2656,7 @@ l'indiquer en regard de cette portée : \set Staff.vocalName = \markup \smallCaps Melchior \set Staff.shortVocalName = \markup \smallCaps Mel \clef "bass" - \relative c' { + \relative { a4 a a a a4 a a a } @@ -2683,64 +2670,57 @@ généralement imprimé en surplomb de la portée, à chaque changement de rôle. L'utilisation d'un @emph{markup} -- dans une fonte réservée à cet effet -- vous permettra de générer ces indications : -@lilypond[quote,verbatim,relative=1] -\clef "G_8" -c4^\markup \fontsize #1 \smallCaps Kaspar -c c c -\clef "bass" -a4^\markup \fontsize #1 \smallCaps Melchior -a a a -\clef "G_8" -c4^\markup \fontsize #1 \smallCaps Kaspar -c c c +@lilypond[quote,verbatim] +\relative c' { + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c + \clef "bass" + a4^\markup \fontsize #1 \smallCaps Melchior + a a a + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c +} @end lilypond Dans le cas où les changements de personnage se multiplient, il peut -s'avérer pratique de détourner l'utilisation de la fonction -@code{\instrumentSwitch} pour gérer les différentes interventions de -l'un ou de l'autre ; vous devrez auparavant avoir établi la -définition d'un « instrument » pour chacun des rôles en question : +s'avérer pratique d'affecter à des variables la définition de +chacun des rôles afin de simplifier la gestion des différentes +interventions de l'un ou de l'autre. @lilypond[quote,verbatim] -\addInstrumentDefinition #"kaspar" - #`((instrumentTransposition . ,(ly:make-pitch -1 0 0)) - (shortInstrumentName . "Kas.") - (clefGlyph . "clefs.G") - (clefTransposition . -7) - (middleCPosition . 1) - (clefPosition . -2) - (instrumentCueName . ,(markup #:fontsize 1 #:smallCaps "Kaspar")) - (midiInstrument . "voice oohs")) - -\addInstrumentDefinition #"melchior" - #`((instrumentTransposition . ,(ly:make-pitch 0 0 0)) - (shortInstrumentName . "Mel.") - (clefGlyph . "clefs.F") - (clefTransposition . 0) - (middleCPosition . 6) - (clefPosition . 2) - (instrumentCueName . ,(markup #:fontsize 1 #:smallCaps "Melchior")) - (midiInstrument . "choir aahs")) +kaspar = { + \clef "G_8" + \set Staff.shortVocalName = "Kas." + \set Staff.midiInstrument = "voice oohs" + <>^\markup \smallCaps "Kaspar" +} + +melchior = { + \clef "bass" + \set Staff.shortVocalName = "Mel." + \set Staff.midiInstrument = "choir aahs" + <>^\markup \smallCaps "Melchior" +} \relative c' { - \instrumentSwitch "kaspar" + \kaspar c4 c c c - \instrumentSwitch "melchior" + \melchior a4 a a a - \instrumentSwitch "kaspar" + \kaspar c4 c c c } @end lilypond @seealso -Manuel de notation : -@ref{Noms d'instrument}, -@ref{Fonctions Scheme}, -@ref{Texte}, -@ref{Commandes pour markup}. +Manuel d'initiation: +@rlearning{Organisation du code source avec des variables}. -Manuel d'extension des fonctionnalités : -@rextend{Construction d'un markup en Scheme}. +Manuel de notation : +@ref{Commandes pour markup}, +@ref{Texte}. @node Citation-repère @@ -2766,22 +2746,19 @@ devient une nécessité ; voici une illustration de la manière de procéder en pareil cas : @lilypond[quote,verbatim] -flute = \relative c'' { - s4 s4 e g +flute = \relative { + s4 s4 e'' g } \addQuote "flute" { \flute } -pianoRH = \relative c'' { - c4. g8 +pianoRH = \relative { + c''4. g8 % position name of cue-ing instrument just before the cue notes, % and above the staff - \new CueVoice { - \override InstrumentSwitch.self-alignment-X = #RIGHT - \set instrumentCueName = "Flute" - } + <>^\markup { \right-align { \tiny "Flute" } } \cueDuring "flute" #UP { g4 bes4 } } -pianoLH = \relative c { c4 e, } +pianoLH = \relative { c4 e, } \score { \new PianoStaff << @@ -2803,11 +2780,7 @@ par l'exemple ci-dessous, dans lequel il est fait appel à une clarinette en si bémol. Dans la mesure où les notes citées se trouvent vers le bas de la portée, nous affectons un @code{DOWN} à la commande @code{\cueDuring}, de telle sorte que les hampes aillent vers le bas et -que le nom de l'instrument cité soit en dessous de la portée. Vous -noterez que la voix contenant la main droite du piano est explicitement -déclarée ; ceci tient au fait que la citation se produit dès le -début de la première mesure -- si nous ne le faisions pas, l'intégralité -de la main droite se verrait placée dans un contexte @code{CueVoice}. +que le nom de l'instrument cité soit en dessous de la portée. @lilypond[quote,verbatim] clarinet = \relative c' { @@ -2819,15 +2792,11 @@ clarinet = \relative c' { pianoRH = \relative c'' { \transposition c' % position name of cue-ing instrument below the staff - \new CueVoice { - \override InstrumentSwitch.self-alignment-X = #RIGHT - \override InstrumentSwitch.direction = #DOWN - \set instrumentCueName = "Clar." - } + <>_\markup { \right-align { \tiny "Clar." } } \cueDuring "clarinet" #DOWN { c4. g8 } g4 bes4 } -pianoLH = \relative c { c4 e, } +pianoLH = \relative { c4 e, } \score { << @@ -2863,16 +2832,15 @@ Glossaire musicologique : Manuel de notation : @ref{Alignement des objets}, +@ref{Citation d'autres voix}, @ref{Direction et positionnement}, @ref{Mise en forme d'une citation}, -@ref{Citation d'autres voix}, @ref{Utilisation de fonctions musicales}. Morceaux choisis : @rlsrnamed{Vocal music,Musique vocale}. Référence des propriétés internes : -@rinternals{InstrumentSwitch}, @rinternals{CueVoice}. @knownissues @@ -2915,10 +2883,12 @@ surviennent. Une courte intervention peut se formuler à l'aide d'un simple @emph{markup} : -@lilypond[quote,verbatim,relative=2] -a4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a -a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a -a4 a a a +@lilypond[quote,verbatim] +\relative { + a'4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a + a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a + a4 a a a +} @end lilypond Une intervention un peu plus longue peut nécessiter d'étirer la musique @@ -2945,8 +2915,8 @@ Voici une illustration de tout ce que nous venons de voir : @c manually adjusted to suit the imposed line length. -td @lilypond[quote,verbatim,ragged-right] -music = \relative c'' { - \repeat unfold 3 { a4 a a a } +music = \relative { + \repeat unfold 3 { a'4 a a a } } dialogue = \lyricmode { @@ -3055,15 +3025,15 @@ barres de mesure produira des portées sans barre : \score { \new StaffGroup << \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } } \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -3085,15 +3055,15 @@ L'absence de barre de mesure peut ne concerner que certaines portées : \new ChoirStaff << \new Staff \with { \remove "Bar_engraver" } { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } } \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -3108,35 +3078,39 @@ pensez à y insérer des barres fantômes -- un simple @code{\bar ""} -- pour indiquer à LilyPond où serait susceptible de se produire un saut de ligne. -@lilypond[verbatim,quote,relative=2] -a4 b c2 | -\cadenzaOn -a4 b c2 -a4 b c2 -\bar "" -a4 b c2 -a4 b c2 -\cadenzaOff -a4 b c2 | -a4 b c2 | +@lilypond[verbatim,quote] +\relative a' { + a4 b c2 | + \cadenzaOn + a4 b c2 + a4 b c2 + \bar "" + a4 b c2 + a4 b c2 + \cadenzaOff + a4 b c2 | + a4 b c2 | +} @end lilypond Dans la mélodie d'un cantique, les silences ou pauses s'indiquent à l'aide de barres de mesure spécifiques : -@lilypond[verbatim, quote,relative=2] -a4 -\cadenzaOn -b c2 -a4 b c2 -\bar "'" -a4 b c2 -a4 b c2 -\bar ";" -a4 b c2 -\bar "!" -a4 b c2 -\bar "||" +@lilypond[verbatim, quote] +\relative a' { + a4 + \cadenzaOn + b c2 + a4 b c2 + \bar "'" + a4 b c2 + a4 b c2 + \bar ";" + a4 b c2 + \bar "!" + a4 b c2 + \bar "||" +} @end lilypond Vous pouvez accessoirement, bien qu'il s'agisse de notation moderne, @@ -3167,8 +3141,8 @@ finalis = { } \score { - \relative c'' { - g2 a4 g + \relative { + g'2 a4 g \divisioMinima g2 a4 g \divisioMaior @@ -3191,8 +3165,8 @@ De nombreux cantiques sont dépourvus de métrique, voire même de clef. @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -3219,22 +3193,22 @@ correspondant au « récitatif ». Ces cantiques sont traditionnellement centrés sur la page. @lilypond[verbatim,quote] -SopranoMusic = \relative g' { - g1 | c2 b | a1 | \bar "||" +SopranoMusic = \relative { + g'1 | c2 b | a1 | \bar "||" a1 | d2 c | c b | c1 | \bar "||" } -AltoMusic = \relative c' { - e1 | g2 g | f1 | +AltoMusic = \relative { + e'1 | g2 g | f1 | f1 | f2 e | d d | e1 | } -TenorMusic = \relative a { - c1 | c2 c | c1 | +TenorMusic = \relative { + c'1 | c2 c | c1 | d1 | g,2 g | g g | g1 | } -BassMusic = \relative c { +BassMusic = \relative { c1 | e2 e | f1 | d1 | b2 c | g' g | c,1 | } @@ -3312,11 +3286,11 @@ Manuel d'initiation : @rlearning{Modèles pour ensemble vocal}. Manuel de notation : -@ref{Notations anciennes}, @ref{Barres de mesure}, @ref{Modification des greffons de contexte}, -@ref{Typographie du chant grégorien}, @ref{Musique sans métrique}, +@ref{Notations anciennes}, +@ref{Typographie du chant grégorien}, @ref{Visibilité des objets}. @@ -3476,8 +3450,8 @@ présenté à la rubrique @rlearning{Psalmodie}. @seealso Manuel d'initiation : -@rlearning{Psalmodie}, -@rlearning{Modèles pour ensemble vocal}. +@rlearning{Modèles pour ensemble vocal}, +@rlearning{Psalmodie}. Manuel de notation : @ref{Fontes}, diff --git a/Documentation/fr/notation/wind.itely b/Documentation/fr/notation/wind.itely index 6ecc977325..1e0dcca764 100644 --- a/Documentation/fr/notation/wind.itely +++ b/Documentation/fr/notation/wind.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- @ignore - Translation of GIT committish: e6e64de1da49ff8c6005daa5fd81adc8387b2668 + Translation of GIT committish: a1267e20afa61258ce3031f07d916e0e66ac6582 - When revising a translation, copy the HEAD committish of the - version that you are working on. For details, see the Contributors' - Guide, node Updating translation committishes.. + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.16" @c Translators: Valentin Villenave, Jean-Charles Malahieude @c Translation checkers: Jean-Charles Malahieude, John Mandereau @@ -112,15 +112,15 @@ Voir le chapitre @ref{Articulations et ornements}. @seealso Manuel de notation : -@ref{Signes de respiration}, -@ref{Liaisons d'articulation}, @ref{Articulations et ornements}, -@ref{Liste des signes d'articulation}, -@ref{Répétitions en trémolo}, -@ref{Instruments transpositeurs}, +@ref{Chutes et sauts}, @ref{Glissando}, +@ref{Instruments transpositeurs}, +@ref{Liaisons d'articulation}, +@ref{Liste des signes d'articulation}, @ref{Notes d'ornement}, -@ref{Chutes et sauts}, +@ref{Répétitions en trémolo}, +@ref{Signes de respiration}, @ref{Têtes de note spécifiques}. Morceaux choisis : @@ -174,11 +174,8 @@ Voici quelques informations spécifiques à la cornemuse. @cindex Scottish highland bagpipe @cindex petites notes @funindex \taor -@funindex taor @funindex \hideKeySignature -@funindex hideKeySignature @funindex \showKeySignature -@funindex showKeySignature LilyPond inclut des définitions spécifiques destinées à la notation pour cornemuse écossaise ; pour les utiliser, il suffit d'ajouter @@ -214,12 +211,12 @@ tenez à afficher l'armure. Des compositions actuelles peuvent ne pas respecter cette tonalité traditionnelle, auquel cas les do et fa devraient être abaissés en -utilisant @code{cflat} ou @code{fflat} ; ils seront représentés par +utilisant @code{c-flat} ou @code{f-flat} ; ils seront représentés par une note en forme de croix. Lorsqu'on joue des œuvres moins cérémonieuses que pour une parade ou un défilé, peut survenir un sol aigu, au doux nom de -@qq{piobaireachd}, et que l'on indiquera par @code{gflat}. +@qq{piobaireachd}, et que l'on indiquera par @code{g-flat}. @seealso Morceaux choisis : @@ -311,8 +308,8 @@ bois, et tout particulièrement les instruments suivants : @noindent Les diagrammes sont générés en tant qu'objet de type @emph{markup} : -@lilypond[verbatim,quote,relative=2] -c1^\markup +@lilypond[verbatim,quote,fragment] +c''1^\markup \woodwind-diagram #'piccolo #'((lh . (gis)) (cc . (one three)) (rh . (ees))) @@ -321,9 +318,9 @@ c1^\markup Les clés ou trous peuvent être partiellement enfoncés ou bouchés : @c KEEP LY -@lilypond[verbatim, quote, relative=2] +@lilypond[verbatim, quote, fragment] \textLengthOn -c1^\markup { +c''1^\markup { \center-column { "quart de trou" \woodwind-diagram #'flute #'((cc . (one1q)) @@ -332,7 +329,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "demi-trou" \woodwind-diagram #'flute #'((cc . (one1h)) @@ -341,7 +338,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "trois quarts de trou" \woodwind-diagram #'flute #'((cc . (one3q)) @@ -350,7 +347,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "anneau" \woodwind-diagram #'flute #'((cc . (oneR)) @@ -359,7 +356,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "bouché" \woodwind-diagram #'flute #'((cc . (oneF two)) @@ -372,8 +369,8 @@ c1^\markup { L'indication du doigté permettant de triller s'obtient en grisant une position : -@lilypond[verbatim,quote,relative=2] -c1^\markup { +@lilypond[verbatim,quote,fragment] +c''1^\markup { \woodwind-diagram #'bass-clarinet #'((cc . (threeT four)) (lh . ()) @@ -385,9 +382,9 @@ Certaines combinaisons particulières en matière de trille sont possibles : @c KEEP LY -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \textLengthOn -c1^\markup { +c''1^\markup { \center-column { "quart de trou et anneau" \woodwind-diagram #'flute #'((cc . (one1qTR)) @@ -396,7 +393,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "anneau et fermé" \woodwind-diagram #'flute #'((cc . (oneTR)) @@ -405,7 +402,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "anneau et ouvert" \woodwind-diagram #'flute #'((cc . (oneRT)) @@ -414,7 +411,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "ouvert et fermé" \woodwind-diagram #'flute #'((cc . (oneT)) @@ -423,7 +420,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "quart de trou et trois quarts" \woodwind-diagram #'flute #'((cc . (one1qT3q)) diff --git a/Documentation/fr/notation/world.itely b/Documentation/fr/notation/world.itely index 741e6fcef4..9b1f303d36 100644 --- a/Documentation/fr/notation/world.itely +++ b/Documentation/fr/notation/world.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: fr -*- @ignore - Translation of GIT committish: bdff8baf5bce0c4c456ebbf292ba8fc771e4bd31 + Translation of GIT committish: 958e95822083954cad00e0a598eb9f12ceba67b9 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @c Translators: Jean-Jacques Gerbaud, Valentin Villenave @c Translation checkers: Jean-Charles Malahieude @@ -197,8 +197,8 @@ Par exemple, voici comment on peut écrire la gamme arabe @lilypond[quote,verbatim] \include "arabic.ly" -\relative do' { - do re misb fa sol la sisb do sisb la sol fa misb re do +\relative { + do' re misb fa sol la sisb do sisb la sol fa misb re do } @end lilypond @@ -216,9 +216,9 @@ l'aspect du demi-bémol dans l'armure. @lilypond[quote,verbatim] \include "arabic.ly" -\relative do' { +\relative { \set Staff.extraNatural = ##f - dod dob dosd \dwn dob dobsb dodsd do do + dod' dob dosd \dwn dob dobsb dodsd do do } @end lilypond @@ -354,7 +354,7 @@ Manuel de notation : @ref{Armure}. Manuel d’initiation : -@rlearning{Altérations et armure}. +@rlearning{Hauteurs et armure}. Référence des propriétés internes : @rinternals{KeySignature}. @@ -422,13 +422,13 @@ intermédiaires et des modes inhabituels traités dans ce chapitre. @lilypond[quote,verbatim] \include "arabic.ly" \score { - \relative re' { + \relative { \set Staff.extraNatural = ##f \set Staff.autoBeaming = ##f \key re \bayati \time 10/8 - re4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 + re'4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 re16 [misb do re] sisb [do] la [sisb sol8] la [sisb] do [re] misb fa4 fa16 [misb] misb8. [re16] re8 [misb] re [do] sisb do4 sisb8 misb16 [re do sisb] la [do sisb la] la4 r8 diff --git a/Documentation/fr/search-box.ihtml b/Documentation/fr/search-box.ihtml index f8f6c10aa0..f00bdb5101 100644 --- a/Documentation/fr/search-box.ihtml +++ b/Documentation/fr/search-box.ihtml @@ -1,5 +1,5 @@ 8. 16 +@lilypond[verbatim,quote] +\relative { + 1 c-^ e>2 4 + 8. 16 +} @end lilypond -Tuttavia, alcuni elementi della notazione, come le dinamiche, le forcelle e le -legature di portamento, devono essere attaccate all'accordo invece che alle -sue singole note, altrimenti non appariranno. +Tuttavia, alcuni elementi della notazione, come le dinamiche e le forcelle, +devono essere attaccate all'accordo invece che alle sue singole note, altrimenti +non appariranno. Altri elementi della notazione, come le diteggiature e le +legature di portamento, saranno posizionate in modo nettamente diverso se +attaccate alle note di un accordo invece che a un accordo intero o a singole +note. -@lilypond[verbatim,quote,relative=2] -1 \f ( ) -\< \! +@lilypond[verbatim,quote] +\relative { + 1 \f ( ) + \< \! +} @end lilypond @cindex accordi vuoti @@ -96,10 +107,12 @@ nel momento musicale della nota o accordo seguenti e si combinerà con questi (possibilità più complesse di combinazione sono spiegate in @ref{Simultaneous expressions}): -@lilypond[verbatim,quote,relative=2] -\grace { g8( a b } -<> ) \p \< -. -\markup \italic "sempre staccato" -\repeat unfold 4 { c4 e } c1\f +@lilypond[verbatim,quote] +\relative { + \grace { g'8( a b } + <> ) \p \< -. -\markup \italic "sempre staccato" + \repeat unfold 4 { c4 e } c1\f +} @end lilypond @cindex altezza relativa, accordi @@ -111,8 +124,10 @@ che lo precede oppure, se non c'è un accordo precedente, è relativa all'altezza dell'ultima nota che precede l'accordo. Le altezze di tutte le altre note dell'accordo sono relative alla nota che le precede @emph{all'interno dell'accordo}. -@lilypond[verbatim,quote,relative=2] -1 +@lilypond[verbatim,quote] +\relative { + 1 +} @end lilypond Maggiori informazioni sugli accordi si trovano in @ref{Chord notation}. @@ -160,12 +175,15 @@ i @ref{Clusters}. @cindex accordo, ripetizione @cindex ripetizione, uso di @code{q} +@cindex @code{q}, ripetizione accordo Per inserire la musica più rapidamente, si può usare una scorciatoia che ripete l'accordo precedente. Il simbolo di ripetizione dell'accordo è @code{q}: -@lilypond[verbatim,quote,relative=2] -1 q 2 q +@lilypond[verbatim,quote] +\relative { + 1 q 2 q +} @end lilypond Come nel caso dei normali accordi, il simbolo di ripetzione dell'accordo si @@ -173,25 +191,31 @@ può usare con le durate, le articolazioni, i testi a margine, le legature di portamento, le travature, etc. dato che solo le altezze dell'accordo precedente vengono duplicate. -@lilypond[verbatim,quote,relative=2] -1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +@lilypond[verbatim,quote] +\relative { + 1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +} @end lilypond Il simbolo di ripetizione dell'accordo ricorda sempre l'ultimo accordo inserito, quindi è possibile inserire l'accordo più recente anche se nel frattempo sono state inserite altre note (senza accordi) o pause. -@lilypond[verbatim,quote,relative=2] -1 c'4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1 c'4 q2 r8 q8 | + q2 c, | +} @end lilypond Tuttavia questo simbolo non conserva le dinamiche, le articolazioni o gli abbellimenti dell'accordo precedente. -@lilypond[verbatim,quote,relative=2] -1\sfz c'4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1\sfz c'4 q2 r8 q8 | + q2 c, | +} @end lilypond Per far sì che alcuni elementi siano conservati, si può invocare esplicitamente @@ -200,9 +224,9 @@ lista di @var{tipi di evento} da mantenere, a meno che eventi di quel tipo non siano già presenti nell'accordo @code{q} stesso. @lilypond[verbatim,quote] -\relative c'' { +\relative { \chordRepeats #'(articulation-event) - { 1\sfz c'4 q2 r8 q8-. } | + { 1\sfz c'4 q2 r8 q8-. } | q2 c, | } @end lilypond @@ -225,8 +249,8 @@ specificata con un'ottava diversa. \new Voice \relative c'' { \chordRepeats #'(articulation-event) - \relative c'' - { 1\sfz c'4 q2 r8 q8-. } | + \relative + { 1\sfz c'4 q2 r8 q8-. } | q2 c | } @end lilypond @@ -257,15 +281,19 @@ elementi dell'espressione simultanea saranno messi in righi separati. Gli esempi seguenti mostrano espressioni simultanee su un rigo: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Voice { % voce singola esplicita - << { a4 b g2 } { d4 g c,2 } >> + << \relative { a'4 b g2 } + \relative { d'4 g c,2 } >> } @end lilypond -@lilypond[quote,verbatim,relative=2] -% prima nota singola -a << { a4 b g } { d4 g c, } >> +@lilypond[quote,verbatim] +\relative { + % prima nota singola + a' << \relative { a'4 b g } + \relative { d'4 g c, } >> +} @end lilypond Questo può essere utile se le sezioni simultanee hanno durate @@ -274,36 +302,36 @@ allo stesso gambo causerà degli errori. Le note, le articolazioni e le modifiche delle proprietà in una @emph{singola} voce (@samp{Voice}) sono raccolte e create secondo l'ordine della musica: -@lilypond[quote,verbatim,relative=2] -4-. <>-. << c a >> << { c-. } { a s-. } >> +@lilypond[quote,verbatim] +\relative { + 4-. <>-. << c a >> << { c-. } { a s-. } >> +} @end lilypond Per poter inserire gambi o travature multiple e variare le durate o altre proprietà di note riferibili allo stesso momento musicale, occorre usare più voci. -L'esempio seguente mostra come le espressioni simultanee possano +L'esempio seguente mostra come le espressioni simultanee possano generare implicitamente righi multipli: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % nessuna singola nota precede l'espressione simultanea -<< { a4 b g2 } { d4 g2 c,4 } >> +<< \relative { a'4 b g2 } + \relative { d'4 g2 c,4 } >> @end lilypond In questo caso le durate diverse non causano problemi perché sono interpretate in voci diverse. -@cindex collisioni, troppe colonne di note che si urtano @cindex collisioni, ignorare @knownissues -Se le note appartenenti a due o più voci, con gambi nella stessa direzione, si -trovano nello stesso punto del rigo e non è stato specificato uno spostamento -orizzontale (oppure è stato specificato lo stesso valore per lo spostamento), -il messaggio: +Se le note appartenenti a due o più voci, senza che sia stato specificato +uno spostamento, hanno i gambi nella stessa direzione, il messaggio @example -attenzione: troppe collisioni tra colonne di note, ignorate +attenzione: questa voce ha bisogno di un'impostazione \voiceXx o \shiftXx @end example apparirà durante la compilazione del file. Si può evitare con: @@ -325,15 +353,14 @@ risoluzione delle collisioni, e potrebbe comportare altri effetti indesiderati @cindex cluster di note @funindex \makeClusters -@funindex makeClusters Un cluster prescrive l'esecuzione simultanea di tutti i suoni compresi in un determinato intervallo. Può essere rappresentato come un involucro che contiene le note che ne fanno parte. Si inserisce applicando la funzione @code{\makeClusters} a una sequenza di accordi, ad esempio: -@lilypond[quote,relative=2,verbatim] -\makeClusters { 2 } +@lilypond[quote,verbatim] +\relative \makeClusters { 2 } @end lilypond Si possono inserire insieme sullo stesso rigo le normali note e i cluster, @@ -387,23 +414,21 @@ Questa sezione presenta le note simultanee in più voci o più righi. @cindex testo assegnato a una voce @funindex \voiceOne -@funindex voiceOne @funindex \voiceOne ... \voiceFour @funindex Voice @funindex \oneVoice -@funindex oneVoice @subsubsubheading Istanziare esplicitamente le voci La struttura di base necessaria per ottenere più voci indipendenti in un solo rigo è illustrata nell'esempio seguente: -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] \new Staff << \new Voice = "prima" - { \voiceOne r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { \voiceOne r8 r16 g'' e8. f16 g8[ c,] f e16 d } \new Voice= "seconda" - { \voiceTwo d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { \voiceTwo d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @@ -417,7 +442,7 @@ automaticamente per evitare collisioni. Il comando @code{\oneVoice} ripristina tutte le impostazioni della voce alle direzioni neutrali predefinite. -@subsubsubheading Pasaggi polifonici temporanei +@subsubsubheading Passaggi polifonici temporanei Un passaggio polifonico temporaneo si può creare col seguente costrutto: @@ -436,10 +461,10 @@ uncinate vengono assegnate a voci temporanee distinte. Questo permette di assegnare il testo a una voce che continua prima, durante e dopo una sezione polifonica: -@lilypond[quote, verbatim, relative=2] -<< +@lilypond[quote,verbatim] +\relative << \new Voice = "melody" { - a4 + a'4 << { \voiceOne @@ -475,11 +500,11 @@ prestabiliti @code{"1"}, @code{"2"}, etc. Il primo esempio potrebbe essere riscritto nel modo seguente: -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { r8 r16 g'' e8. f16 g8[ c,] f e16 d } \\ - { d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @@ -493,13 +518,13 @@ Nell'esempio seguente, la voce intermedia ha i gambi in su, dunque viene inserita in terza posizione in modo che diventi la terza voce, che ha i gambi in su. Si usano le pause spaziatrici per evitare il raddoppio delle pause ordinarie. -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 g g g g f16 ees f8 d } + \relative { r8 g'' g g g f16 ees f8 d } \\ - { ees,8 r ees r d r d r } + \relative { ees'8 r ees r d r d r } \\ - { d'8 s c s bes s a s } + \relative { d''8 s c s bes s a s } >> @end lilypond @@ -555,10 +580,10 @@ con il medesimo ritmo, si possono combinare in un unico contesto in un semplice costrutto musicale simultaneo all'interno di una voce esplicita: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] \new Voice << - { e4 f8 d e16 f g8 d4 } - { c4 d8 b c16 d e8 b4 } + \relative { e''4 f8 d e16 f g8 d4 } + \relative { c''4 d8 b c16 d e8 b4 } >> @end lilypond @@ -604,15 +629,15 @@ Frammenti: Si possono assegnare colori e forme diverse a ciascuna voce per facilitarne l'identificazione: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { \voiceOneStyle d4 c2 b4 } + \relative { \voiceOneStyle d''4 c2 b4 } \\ - { \voiceTwoStyle e,2 e } + \relative { \voiceTwoStyle e'2 e } \\ - { \voiceThreeStyle b2. c4 } + \relative { \voiceThreeStyle b2. c4 } \\ - { \voiceFourStyle g'2 g } + \relative { \voiceFourStyle g'2 g } >> @end lilypond @@ -653,21 +678,13 @@ Frammenti: @cindex spostamento automatico della pausa @cindex pausa, spostamento automatico @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn @funindex \shiftOff -@funindex shiftOff @funindex \mergeDifferentlyDottedOn -@funindex mergeDifferentlyDottedOn @funindex \mergeDifferentlyDottedOff -@funindex mergeDifferentlyDottedOff @funindex \mergeDifferentlyHeadedOn -@funindex mergeDifferentlyHeadedOn @funindex \mergeDifferentlyHeadedOff -@funindex mergeDifferentlyHeadedOff Le teste di note che si trovano in voci diverse ma hanno stessa altezza, stessa testa e direzione del gambo opposta vengono unite automaticamente; @@ -677,18 +694,20 @@ spostate verticalmente. L'esempio seguente mostra tre diverse circostanze, sul primo e terzo movimento della prima battuta e sul primo movimento della seconda battuta, in cui l'unione automatica delle teste di nota non funziona. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { - c8 d e d c d c4 + \relative { + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -697,19 +716,21 @@ Note con teste diverse possono essere unite come è mostrato sotto. In questo esempio le teste delle note nel primo battito della prima battuta sono unite: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -720,20 +741,22 @@ difficile distinguerle. Anche le teste di note con diversi punti, come nel terzo movimento della prima battuta, possono essere unite: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -748,21 +771,23 @@ che non deve essere unita. In questo esempio si usa @code{\shiftOn} per spostare il Sol superiore (@notation{g}) fuori dalla colonna e di conseguenza @code{\mergeDifferentlyHeadedOn} funziona correttamente. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 \shiftOn g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -789,10 +814,10 @@ nel file di input non deve essere lo stesso dell'ordine verticale delle voci del rigo!} @lilypond[quote,verbatim] -\new Staff \relative c'' { +\new Staff \relative { %% inserimento abbreviato << - { f2 } % 1: più alta + { f''2 } % 1: più alta \\ { g,2 } % 2: più bassa \\ @@ -862,11 +887,11 @@ Se si usa @code{\override NoteColumn.ignore-collision = ##t}, le note con teste diverse che si trovano in voci diverse saranno unite in modo non corretto. -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim,fragment] \mergeDifferentlyHeadedOn -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> \override NoteColumn.ignore-collision = ##t -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> @end lilypond @ignore @@ -887,15 +912,14 @@ are at the same time differently dotted are not clear. @cindex parte a due @cindex parte solista @funindex \partcombine -@funindex partcombine -La combinazione automatica delle parti si usa per combinare in un unico -rigo due parti musicali separate. Ciò è utile soprattutto quando si scrivono -partiture orchestrali. Viene stampata una sola voce se le due parti -musicali sono identiche, ma nei punti in cui sono diverse viene -aggiunta una seconda voce. Le direzioni dei gambi sono impostate -in su e in giù in base alla voce di appartenenza, mentre le sezioni solistiche e @notation{a due} -sono a loro volta identificate e contrassegnate. +La combinazione automatica delle parti si usa per combinare in un unico rigo due +parti musicali separate. Ciò è utile soprattutto quando si scrivono partiture +orchestrali. Viene stampata una sola voce se le due parti musicali sono +identiche, ma nei punti in cui sono diverse viene aggiunta una seconda voce. Le +direzioni dei gambi sono impostate in su e in giù in base alla voce di +appartenenza, mentre le sezioni solistiche e @notation{a due} sono a loro volta +identificate e contrassegnate. La sintassi per la combinazione automatica delle parti è: @@ -909,17 +933,17 @@ gambi sono regolate di conseguenza. Si usano le stesse variabili per le parti indipendenti e il rigo combinato. @lilypond[quote,verbatim] -instrumentOne = \relative c' { - c4 d e f | +instrumentOne = \relative { + c'4 d e f | R1 | d'4 c b a | b4 g2 f4 | e1 | } -instrumentTwo = \relative g' { +instrumentTwo = \relative { R1 | - g4 a b c | + g'4 a b c | d4 c b a | g4 f( e) d | e1 | @@ -943,6 +967,39 @@ parte sono contrassegnate rispettivamente con @qq{Solo} e @qq{Solo II}. Le parti (@notation{a due}) all'unisono sono contrassegnate con la scritta @qq{a2}. +Il comportamento predefinito del combinatore delle parti è +quello di unire due note della stessa altezza in una nota @notation{a due}, +combinare in un accordo note della stessa durata e separate da un intervallo +inferiore alla nona e separare in voci distinte le note con un intervallo +superiore alla nona (o quando le voci collidono). Tale comportamento può +essere modificato con un argomento opzionale di una coppia di numeri dopo +il comando @code{\partcombine}: il primo indica l'intervallo in cui le note +iniziano a essere combinate (il valore predefinito è zero) e il secondo +dove le note vengono divise in note distinte. Impostando il secondo argomento +su zero, il combinatore delle parti divide le note che hanno un intervallo +di una seconda o più; impostandolo su uno, divide le note di una terza o +più, e così via. + +@lilypond[quote,verbatim] +instrumentOne = \relative { + a4 b c d | + e f g a | + b c d e | +} + +instrumentTwo = \relative { + c'4 c c c | + c c c c | + c c c c | +} + +<< + \new Staff \partcombine \instrumentOne \instrumentTwo + \new Staff \partcombine #'(2 . 3) \instrumentOne \instrumentTwo +>> +@end lilypond + + Entrambi gli argomenti di @code{\partcombine} sono interpretati come contesti @code{Voice} separati, dunque se la musica viene inserita in modo relativo @emph{entrambe} le parti devono contenere una funzione @@ -960,17 +1017,11 @@ effetto sulle altezze di @code{@var{espressione-musicale1}} e @code{@var{espressione-musicale2}}. @funindex \partcombineChords -@funindex partcombineChords @funindex \partcombineApart -@funindex partcombineApart @funindex \partcombineUnisono -@funindex partcombineUnisono @funindex \partcombineSoloI -@funindex partcombineSoloI @funindex \partcombineSoloII -@funindex partcombineSoloII @funindex \partcombineAutomatic -@funindex partcombineAutomatic Nelle partiture professionali, spesso le voci sono tenute separate per lunghi passaggi anche se alcune note sono le stesse in entrambe le voci @@ -978,37 +1029,32 @@ e potrebbero essere stampate come unisono. Combinare le note in un accordo o mostrare una voce come solista, dunque, non è la scelta ideale, perché la funzione @code{\partcombine} considera ogni nota individualmente. In questo caso si può sovrascrivere la funzione -@code{\partcombine} con i comandi elencati sotto. - -I comandi che finiscono con @code{@dots{}Once} si applicano soltanto alla +@code{\partcombine} con uno dei comandi elencati sotto. Tutti i comandi +devono essere preceduti da @code{\once} per applicarli soltanto alla nota successiva dell'espressione musicale. @itemize @item -@code{\partcombineApart} e @code{\partcombineApartOnce} mantengono le -note su due voci distinte, anche se potrebbero essere combinate in un -accordo o in un unisono. +@code{\partcombineApart} mantiene le note su due voci distinte, anche se +potrebbero essere combinate in un accordo o in un unisono. @item -@code{\partcombineChords} e @code{\partcombineChordsOnce} uniscono le -note in un accordo. +@code{\partcombineChords} unisce le note in un accordo. @item -@code{\partcombineUnisono} e @code{\partcombineUnisonoOnce} uniscono -entrambe le voci come @qq{unisono}. +@code{\partcombineUnisono} unisce entrambe le voci come @qq{unisono}. @item -@code{\partcombineSoloI} e @code{\partcombineSoloIOnce} stampano soltanto -la prima voce e la contrassegnano come un @qq{Solo}. +@code{\partcombineSoloI} stampa soltanto la prima voce e la contrassegna +come un @qq{Solo}. @item -@code{\partcombineSoloII} o @code{\partcombineSoloIIOnce} stampano soltanto -la seconda voce e la contrassegnano come un @qq{Solo}. +@code{\partcombineSoloII} stampa soltanto la seconda voce e la contrassegna +come un @qq{Solo}. @item -@code{\partcombineAutomatic} e @code{\partcombineAutomaticOnce} terminano -le funzioni dei comandi precedenti e ripristinano il funzionamento -predefinito di @code{\partcombine}. +@code{\partcombineAutomatic} termina le funzioni dei comandi precedenti e +ripristina il funzionamento predefinito di @code{\partcombine}. @end itemize @lilypond[quote,verbatim] @@ -1017,11 +1063,11 @@ instrumentOne = \relative c' { \partcombineAutomatic e2^"automatico" e | \partcombineChords e'2^"accordo" e | \partcombineAutomatic c2^"automatico" c | - \partcombineApart c2^"separato" \partcombineChordsOnce e^"accordo una volta sola" | + \partcombineApart c2^"separato" \once \partcombineChords e^"accordo una volta sola" | c2 c | } -instrumentTwo = \relative c' { - c2 c | +instrumentTwo = \relative { + c'2 c | e2 e | a,2 c | c2 c' | @@ -1112,7 +1158,6 @@ se si usa @code{\partcombine} con l'intavolatura, e la @emph{Nota} in @cindex musica parallela @cindex parallela, musica @funindex \parallelMusic -@funindex parallelMusic La musica che contiene parti diverse può essere messa in parallelo nel codice di input. La funzione @code{\parallelMusic} accetta una lista contenente @@ -1128,12 +1173,12 @@ devono avere la stessa durata.} \parallelMusic #'(voiceA voiceB voiceC) { % Battuta 1 r8 g'16 c'' e'' g' c'' e'' r8 g'16 c'' e'' g' c'' e'' | - r16 e'8.~ e'4 r16 e'8.~ e'4 | + r16 e'8.~ 4 r16 e'8.~ 4 | c'2 c'2 | % Battuta 2 r8 a'16 d'' f'' a' d'' f'' r8 a'16 d'' f'' a' d'' f'' | - r16 d'8.~ d'4 r16 d'8.~ d'4 | + r16 d'8.~ 4 r16 d'8.~ 4 | c'2 c'2 | } @@ -1152,12 +1197,12 @@ parole, le note relative di @code{voiceA} ignorano le note in @code{voiceB}. \parallelMusic #'(voiceA voiceB voiceC) { % Battuta 1 r8 g16 c e g, c e r8 g,16 c e g, c e | - r16 e8.~ e4 r16 e8.~ e4 | + r16 e8.~ 4 r16 e8.~ 4 | c2 c | % Battuta 2 r8 a,16 d f a, d f r8 a,16 d f a, d f | - r16 d8.~ d4 r16 d8.~ d4 | + r16 d8.~ 4 r16 d8.~ 4 | c2 c | } diff --git a/Documentation/it/notation/spacing.itely b/Documentation/it/notation/spacing.itely new file mode 100644 index 0000000000..095b730cdb --- /dev/null +++ b/Documentation/it/notation/spacing.itely @@ -0,0 +1,3666 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- + +@ignore + Translation of GIT committish: 1e339d5efe13a725a4f0c2d8dfc3d40390446b89 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c \version "2.19.22" + +@c Translators: Federico Bruni +@c Translation checkers: + +@ignore +GDP TODO list + +Negative numbers are allowed: +> Are you sure? The following works well +> \paper{ +> first-page-number = -2 +> } +> and prints page number -1 on the second page, for example. + + +Clarify +http://code.google.com/p/lilypond/issues/detail?id=68 + +@end ignore + + +@node Gestione dello spazio +@chapter Gestione dello spazio +@translationof Spacing issues + +La formattazione globale del foglio è determinata da tre fattori: la +formattazione della pagina, le interruzioni di linea e la spaziatura. +Ciascun fattore influenza l'altro. La scelta della spaziatura determina +la densità con cui vengono disposti i sistemi musicali, che a sua volta +influenza la scelta delle interruzioni di linea e quindi infine quante +pagine occupa un brano. + +Generalmente, questa procedura si svolge in quattro stadi. Inizialmente +vengono scelte le distanze flessibili (@q{springs}), in base alle +durate. Poi vengono tentate tutte le possibili combinazioni per le +interruzioni di linea e viene calcolato un punteggio @q{negativo} per +ciascuna di esse. Quindi viene calcolata l'altezza di ogni possibile +sistema. Infine viene scelta una combinazione di interruzioni di linea +e di interruzioni di pagina che assicuri che la spaziatura verticale e +quella orizzontale non siano né troppo compresse né troppo allungate. + +Due tipi di blocchi possono contenere le impostazioni di formattazione: +@code{\paper @{@dots{}@}} e @code{\layout @{@dots{}@}}. Il blocco +@code{\paper} contiene le impostazioni di formattazione della pagina +da applicare a tutte le partiture di un libro o di una parte, +come l'altezza del foglio o se stampare o meno i numeri di pagina, etc. +(vedi @ref{Page layout}). Il blocco @code{\layout} contiene le impostazioni +di formattazione della partitura, come il numero di sistemi da usare o lo +spazio tra i gruppi di righi, etc. (vedi @ref{Score layout}). + +@menu +* Formattazione della pagina:: +* Formattazione della partitura:: +* Interruzioni:: +* Spaziatura verticale:: +* Spaziatura orizzontale:: +* Riduzione del numero di pagine di una partitura:: +@end menu + + +@node Formattazione della pagina +@section Formattazione della pagina +@translationof Page layout + +Questa sezione tratta le opzioni di formattazione della pagina per il +blocco @code{\paper}. + +@menu +* Il blocco paper:: +* Formato carta e ridimensionamento automatico:: +* Variabili paper della spaziatura verticale fissa:: +* Variabili paper della spaziatura verticale flessibile:: +* Variabili paper della spaziatura orizzontale:: +* Altre variabili di paper:: +@end menu + + +@node Il blocco paper +@subsection Il blocco @code{@bs{}paper} +@translationof The paper block + +I blocchi @code{\paper} possono essere posizionati in tre punti diversi, in +modo da formare una gerarchia discendente di blocchi @code{\paper}: + +@itemize + +@item +All'inizio del file di input, prima di tutti i blocchi @code{\book}, +@code{\bookpart} e @code{\score}. + +@item +Dentro un blocco @code{\book} ma fuori da tutti i blocchi +@code{\bookpart} e @code{\score} in esso racchiusi. + +@item +Dentro un blocco @code{\bookpart} ma fuori da tutti i blocchi +@code{\score} in esso racchiusi. + +@end itemize + +Non è possibile inserire un blocco @code{\paper} in un blocco @code{\score}. + +I valori dei campi vengono filtrati dall'alto verso il basso attraverso +questa gerarchia: i valori impostati nei livelli più alti della +gerarchia persistono finché non sono sovrascritti da un valore +impostato in un livello più basso. + +Vari blocchi @code{\paper} possono apparire in ognuno di questi livelli, per +esempio come parti di vari file inclusi con @code{\include}. In questo caso, +i campi di ciascun livello vengono combinati e i valori riscontrati per +ultimi avranno la precedenza in caso di campi duplicati. + +Le impostazioni che possono apparire in un blocco @code{\paper} comprendono: + +@itemize + +@item +la funzione scheme @code{set-paper-size}, + +@item +le variabili @code{\paper} per personalizzare la formattazione della pagina e + +@item +le definizioni di markup usate per personalizzare la formattazione di intestazioni, +piè di pagina e titoli. + +@end itemize + +La funzione @code{set-paper-size} è trattata nella prossima +sezione, @ref{Paper size and automatic scaling}. Le variabili +@code{\paper} che si occupano della formattazione della pagina sono +trattate in sezioni successive. Le definizioni di markup relative a +intestazioni, piè di pagina e titoli sono trattate in +@ref{Custom titles headers and footers}. + +La maggior parte delle variabili @code{\paper} funzionano soltanto in +un blocco @code{\paper}. Le poche che funzionano anche in un blocco +@code{\layout} sono elencate in +@ref{The layout block,,Il blocco @code{@bs{}layout}}. + +Se non indicato diversamente, tutte le variabili @code{\paper} che +corrispondono a distanze sulla pagina sono misurate in millimetri, +a meno che un'unità di misura diversa non sia specificata dall'utente. +Per esempio, la seguente dichiarazione imposta @code{top-margin} su +dieci millimetri: + +@example +\paper @{ + top-margin = 10 +@} +@end example + +Per impostarla su @code{0.5} pollici, usare il suffisso di +unità @code{\in} (inch = pollice): + +@example +\paper @{ + top-margin = 0.5\in +@} +@end example + +I suffissi di unità disponibili sono @code{\mm}, @code{\cm}, +@code{\in} e @code{\pt}. Queste unità sono semplici valori utili +per convertire dai millimetri e sono definite in +@file{ly/paper-defaults-init.ly}. Solo per chiarezza, quando +si usano i millimetri, di solito si usa il suffisso @code{\mm}, +anche se non è tecnicamente necessario. + +È anche possibile definire i valori di @code{\paper} con Scheme. +L'equivalente Scheme dell'esempio precedente è: + +@example +\paper @{ + #(define top-margin (* 0.5 in)) +@} +@end example + +@seealso +Guida alla notazione: +@ref{Paper size and automatic scaling}, +@ref{Custom titles headers and footers}, +@ref{The layout block,,Il blocco @code{@bs{}layout}}. + +File installati: +@file{ly/paper-defaults-init.ly}. + + +@node Formato carta e ridimensionamento automatico +@subsection Formato carta e ridimensionamento automatico +@translationof Paper size and automatic scaling + +@cindex formato carta +@cindex formato pagina +@cindex carta, formato +@cindex pagina, formato + +@funindex \paper + +@menu +* Impostare il formato carta:: +* Ridimensionamento automatico al formato carta:: +@end menu + + +@node Impostare il formato carta +@unnumberedsubsubsec Impostare il formato carta +@translationof Setting the paper size + +@q{A4} è il valore predefinito quando non viene impostato esplicitamente +alcun formato carta. Esistono due funzioni che permettono di cambiare +formato: + +@table @code +@item set-default-paper-size + +@example +#(set-default-paper-size "quarto") +@end example + +che deve sempre trovarsi nel livello superiore, e + +@item set-paper-size + +@example +\paper @{ + #(set-paper-size "tabloid") +@} +@end example + +che deve sempre trovarsi in un blocco @code{\paper}. +@end table + +La funzione @code{set-default-paper-size}, se usata nel livello superiore, +deve precedere qualsiasi blocco @code{\paper}. +@code{set-default-paper-size} imposta il formato di tutte le pagine, +mentre @code{set-paper-size} imposta il formato soltanto di quelle +pagine a cui è applicato il blocco @code{\paper}. Per esempio, se il +blocco @code{\paper} si trova all'inizio del file, applicherà il formato +a tutte le pagine. Se il blocco @code{\paper} si trova dentro un blocco +@code{\book}, il formato verrà applicato a quel libro soltanto. + +Quando si usa la funzione @code{set-paper-size}, questa deve essere +posta @emph{prima} di qualsiasi altra funzione usata nello stesso blocco +@code{\paper}. Vedi @ref{Automatic scaling to paper size}. + +I formati carta sono definiti in @file{scm/paper.scm}, e sebbene sia +possibile aggiungere formati personalizzati in questo file, tali aggiunte +verrebbero sovrascritte da successivi aggiornamenti del software. I formati +disponibili sono elencati in @ref{Predefined paper sizes}. + +@c An appendix entry exists for paper sizes but is not auto-generated + +È tuttavia possibile aggiungere un formato personalizzato nel file di +input per poi utilizzarlo con @code{set-default-paper-size} o +@code{set-paper-size}: + +@example +#(set! paper-alist (cons '("mio formato" . (cons (* 15 in) (* 3 in))) paper-alist)) + +\paper @{ + #(set-paper-size "mio formato") +@} +@end example + +Si può usare qualsiasi unità di misura: @code{in} (inch, o pollici), @code{cm} +(centimetri) e @code{mm} (millimetri). + +@cindex formato carta, orientamento +@cindex pagina, orientamento +@cindex formato carta, orizzontale (landscape) + +Aggiungendo il simbolo @code{'landscape} alla funzione del formato, le pagine +vengono ruotate di 90 gradi e le linee occupano il maggior spazio a disposizione. + +@example +#(set-default-paper-size "a6" 'landscape) +@end example + +Appendendo @samp{landscape} (orizzontale) al nome del formato, è possibile +scambiare le dimensioni della carta @emph{senza} ruotare la stampa +(come quando si stampa in formato cartolina o si creano dei file +grafici da includere invece di un documento indipendente): + +@example +#(set-default-paper-size "a6landscape") +@end example + +Quando il formato termina con un esplicito @samp{landscape} (orizzontale) o +@samp{portrait} (verticale), la presenza di un simbolo @code{'landscape} +influisce @emph{solo} sull'orientamento della stampa, non sul formato +usato per la formattazione. + +@seealso +Guida alla notazione: +@ref{Automatic scaling to paper size}, +@ref{Predefined paper sizes}. + +File installati: +@file{scm/paper.scm}. + + +@node Ridimensionamento automatico al formato carta +@unnumberedsubsubsec Ridimensionamento automatico al formato carta +@translationof Automatic scaling to paper size + +Se il formato viene cambiato con una delle funzioni scheme +(@code{set-default-paper-size} o @code{set-paper-size}), i +valori di diverse variabili @code{\paper} sono automaticamente +ricalcolati in base alla nuova dimensione. Per aggirare il ridimensionamento +automatico di una certa variabile, impostare la variabile dopo aver +impostato il formato. Fare attenzione al fatto che il ridimensionamento +automatico non viene attivato se si impostano le variabili +@code{paper-height} o @code{paper-width}, anche se +@code{paper-width} può influenzare altri valori (ma questo +è un argomento diverso dal ridimensionamento ed è trattato in seguito). Le +funzioni @code{set-default-paper-size} e @code{set-paper-size} sono +descritte in @ref{Setting the paper size}. + +Le dimensioni verticali interessate dal ridimensionamento automatico +sono @code{top-margin} e @code{bottom-margin} (vedi +@ref{Fixed vertical spacing paper variables,,Variabili fisse della spaziatura verticale di @code{@bs{}paper}}). +Le dimensioni orizzontali interessate dal ridimensionamento automatico +sono @code{left-margin}, @code{right-margin}, @code{inner-margin}, +@code{outer-margin}, @code{binding-offset}, @code{indent} e @code{short-indent} (vedi +@ref{Horizontal spacing paper variables,,Variabili della spaziatura orizzontale di @code{@bs{}paper}}). + +I valori predefiniti di queste dimensioni sono impostati in +@file{ly/paper-defaults-init.ly} e salvati in variabili interne +chiamate @code{top-margin-default}, @code{bottom-margin-default}, etc. +Questi valori si riferiscono al formato predefinito @code{a4}. +Per riferimento, nel formato @code{a4} il valore di @code{paper-height} è +@code{297\mm} e quello di @code{paper-width} è @code{210\mm}. + +@seealso +Guida alla notazione: +@ref{Fixed vertical spacing paper variables,,Variabili fisse della spaziatura verticale di @code{@bs{}paper}}, +@ref{Horizontal spacing paper variables,,Variabili della spaziatura orizzontale di @code{@bs{}paper}}. + +File installati: +@file{ly/paper-defaults-init.ly}, +@file{scm/paper.scm}. + + +@node Variabili paper della spaziatura verticale fissa +@subsection Variabili @code{@bs{}paper} della spaziatura verticale fissa +@translationof Fixed vertical spacing paper variables + +@warning{Alcune dimensioni definite nel blocco @code{@bs{}paper} sono +ridimensionate automaticamente in base al formato carta, portando a +possibili risultati imprevisti. Vedi +@ref{Automatic scaling to paper size}.} + +I valori predefiniti (prima del ridimensionamento) sono definiti in +@file{ly/paper-defaults-init.ly}. + +@table @code +@item paper-height +@funindex paper-height + +L'altezza della pagina (valore predefinito: non impostata). Il ridimensionamento +automatico di alcune dimensioni verticali non è influenzato da questa. + +@item top-margin +@funindex top-margin + +Il margine tra il punto più alto della pagina e il punto più alto +dell'area di stampa. Se il formato viene modificato, il valore +predefinito di questa dimensione viene ridimensionato di conseguenza. + +@item bottom-margin +@funindex bottom-margin + +Il margine tra il punto più basso dell'area di stampa e il punto +più basso della pagina. Se il formato viene modificato, il valore +predefinito di questa dimensione viene ridimensionato di conseguenza. + +@item ragged-bottom +@funindex ragged-bottom + +Se impostato su vero, i sistemi avranno la loro naturale spaziatura. +Non saranno giustificati, ovvero non saranno né compressi né allungati +verticalmente per stare nella pagina. + +@item ragged-last-bottom +@funindex ragged-last-bottom + +Se impostato su falso, l'ultima pagina, e l'ultima pagina +di ogni sezione creata con un blocco @code{\bookpart}, saranno +giustificate verticalmente come nelle pagine precedenti. + +@end table + +@seealso +Guida alla notazione: +@ref{Automatic scaling to paper size}. + +File installati: +@file{ly/paper-defaults-init.ly}. + +Frammenti: +@rlsr{Spacing}. + +@knownissues +I titoli (definiti nel blocco @code{\header}) sono considerati +un sistema, dunque @code{ragged-bottom} e @code{ragged-last-bottom} +aggiungeranno spazio tra i titoli e il primo sistema della partitura. + +Formati carta definiti esplicitamente sovrascriveranno qualsiasi +impostazione di margine superiore o inferiore definito dall'utente. + + +@node Variabili paper della spaziatura verticale flessibile +@subsection Variabili @code{@bs{}paper} della spaziatura verticale flessibile +@translationof Flexible vertical spacing paper variables + +Nella maggior parte dei casi è preferibile che le distanze verticali +tra certi elementi (come margini, titoli, sistemi e partiture +separate) siano flessibili, così che siano ben compresse o allungate +a seconda della situazione. Sono disponibili diverse variabili +@code{\paper} (elencate sotto) per regolare il comportamento di +allungamento di queste dimensioni. + +Nota bene che le variabili @code{\paper} trattate in questa sezione +non regolano la spaziatura dei righi dei singoli sistemi. +La spaziatura interna ai sistemi è controllata dalle proprietà +del grob, solitamente inserite in un blocco @code{\score} o +@code{\layout} e non in un blocco @code{\paper}. Vedi +@ref{Flexible vertical spacing within systems}. + +@menu +* Struttura delle liste associative flessibili della spaziatura verticale:: +* Elenco delle variabili paper flessibili della spaziatura verticale:: +@end menu + + +@node Struttura delle liste associative flessibili della spaziatura verticale +@unnumberedsubsubsec Struttura delle liste associative flessibili della spaziatura verticale +@translationof Structure of flexible vertical spacing alists + +Ognuna delle variabili @code{\paper} flessibili della spaziatura verticale +è una lista associativa (alist) composta da quattro @emph{elementi}: + +@itemize + +@item +@code{basic-distance} -- la distanza verticale, misurata in +spazi rigo, tra i @emph{punti di riferimento} dei due +elementi, quando non si verificano collisioni e non sono +attivi allungamenti o compressioni. Il punto di riferimento +di un markup (un titolo o un markup di un livello superiore) +è il suo punto più alto, mentre quello di un sistema è il +centro verticale del più vicino @code{StaffSymbol}, anche se +una linea diversa da un rigo (come un contesto @code{Lyrics}) si +trova nel mezzo. Valori di @code{basic-distance} inferiori a quelli +di @code{padding} o @code{minimum-distance} non hanno senso, dato che +la distanza risultante non sarà mai inferiore a quella definita per +@code{padding} o @code{minimum-distance}. + +@item +@code{minimum-distance} -- la minima distanza verticale consentita, +misurata in spazi rigo, tra i punti di riferimento dei due +elementi, quando la compressione è attiva. Valori di +@code{minimum-distance} inferiori a quelli di @code{padding} non +hanno senso, perché la distanza risultante non sarà mai inferiore +a quella definita per @code{padding.} + +@c TODO: explain skylines somewhere and xref to it from here. + +@item +@code{padding} -- la quantità minima di spazio verticale libero +tra i profili (@emph{skyline}) dei due elementi, misurata in +spazi rigo. + +@item +@code{stretchability} -- una misura, priva di unità di misura, +della relativa propensione della dimensione a allungarsi. Se +pari a zero, la distanza non si allungherà (a meno che non ci +siano delle collisioni). Se positiva, il significato del valore +di @code{stretchability} di una certa dimensione sta nella sua +relazione con i valori di @code{stretchability} delle altre +dimensioni. Per esempio, se una dimensione ha un valore di +@code{stretchability} doppio rispetto a un'altra, si allungherà +il doppio. +I valori devono essere non negativi e finiti. Il valore @code{+inf.0} causa un +errore di programmazione e viene ingorato, ma si può usare @code{1.0e7} per +ottenere un'elasticità allungabile quasi all'infinito. Se non impostata, il +valore predefinito equivale a quello di @code{basic-distance}. Nota che la +propensione della dimensione a @emph{comprimersi} non può essere impostata +direttamente dall'utente ed è uguale a +(@code{basic-distance}@tie{}@minus{}@tie{}@code{minimum-distance}). + +@end itemize + +Se in una pagina lo spazio verticale non è giustificato (ovvero con +@code{ragged-bottom} impostato su vero) la distanza risultante è +data dal valore più grande assegnato a una di queste tre proprietà: + +@itemize + +@item +@code{basic-distance}, + +@item +@code{minimum-distance} e + +@item +@code{padding} con l'aggiunta della più piccola distanza necessaria a +eliminare collisioni. + +@end itemize + +In caso di partiture con molte pagine in cui l'ultima pagina non è +giustificata (ovvero con @code{ragged-last-bottom} impostato su vero), +l'ultima pagina usa la stessa spaziatura della pagina precedente, +purché ci sia abbastanza spazio. + +I metodi specifici per modificare le liste associative (alist) sono +trattati in @ref{Modifying alists}. L'esempio seguente illustra i +due modi in cui queste possono essere modificate. La prima dichiarazione +aggiorna un elemento-valore individualmente, mentre la seconda ridefinisce +completamente la variabile: + +@example +\paper @{ + system-system-spacing.basic-distance = #8 + score-system-spacing = + #'((basic-distance . 12) + (minimum-distance . 6) + (padding . 1) + (stretchability . 12)) +@} +@end example + + +@node Elenco delle variabili paper flessibili della spaziatura verticale +@unnumberedsubsubsec Elenco delle variabili @code{@bs{}paper} flessibili della spaziatura verticale +@translationof List of flexible vertical spacing paper variables + +I nomi di queste variabili hanno il formato +@code{@var{superiore}-@var{inferiore}-spacing}, dove @code{@var{superiore}} +e @code{@var{inferiore}} indicano gli elementi di cui stabilire la +distanza. Ogni distanza viene misurata tra i punti di riferimento +dei due elementi (vedi la descrizione precedente della struttura della +lista associativa). Nei nomi di queste variabili il termine @q{@code{markup}} +si riferisce sia ai @emph{titoli} (@code{bookTitleMarkup} o +@code{scoreTitleMarkup}) sia ai @emph{markup di livello superiore} (vedi +@ref{File structure}). Tutte le distanze sono misurate in spazi rigo. + +Le impostazioni predefinite sono definite in @file{ly/paper-defaults-init.ly}. + +@c TODO: Where do headers/footers fit in? -mp + +@table @code +@item markup-system-spacing +@funindex markup-system-spacing + +la distanza tra il testo (titolo o markup di livello superiore) e il sistema +che lo segue. + +@item score-markup-spacing +@funindex score-markup-spacing + +la distanza tra l'ultimo sistema di un brano e il testo (titolo o +markup di livello superiore) che lo segue. + +@item score-system-spacing +@funindex score-system-spacing + +la distanza tra l'ultimo sistema di un brano e il primo sistema +del brano successivo, quando non c'è alcun testo (titolo o +markup di livello superiore) tra di loro. + +@item system-system-spacing +@funindex system-system-spacing + +la distanza tra due sistemi di uno stesso brano. + +@item markup-markup-spacing +@funindex markup-markup-spacing + +la distanza tra due testi (titoli o markup di livello superiore). + +@item last-bottom-spacing +@funindex last-bottom-spacing + +la distanza tra l'ultimo sistema o l'ultimo markup di livello superiore di +una pagina e la fine dello spazio stampabile (ovvero la parte superiore +del margine inferiore). + +@item top-system-spacing +@funindex top-system-spacing + +la distanza tra l'inizio dello spazio stampabile (ovvero la parte +inferiore del margine superiore) e il primo sistema di una pagina, quando +non c'è alcun testo (titolo o markup di livello superiore) tra di loro. + +@item top-markup-spacing +@funindex top-markup-spacing + +la distanza tra l'inizio dello spazio stampabile (ovvero la parte +inferiore del margine superiore) e il primo testo (titolo o markup di +livello superiore) di una pagina, quando non c'è alcun sistema tra i due. +@end table + +@seealso +Guida alla notazione: +@ref{Flexible vertical spacing within systems}. + +File installati: +@file{ly/paper-defaults-init.ly}. + +Frammenti: +@rlsr{Spacing}. + + +@node Variabili paper della spaziatura orizzontale +@subsection Variabili @code{@bs{}paper} della spaziatura orizzontale +@translationof Horizontal spacing paper variables + +@warning{Alcune dimensioni in @code{@bs{}paper} sono ridimensionate +automaticamente in base al formato carta, producendo talvolta un +risultato inatteso. Vedi @ref{Automatic scaling to paper size}.} + +@menu +* Variabili paper per larghezze e margini:: +* Variabili paper per la modalità due pagine per foglio:: +* Variabili paper per spostamenti e indentazioni:: +@end menu + + +@node Variabili paper per larghezze e margini +@unnumberedsubsubsec Variabili @code{@bs{}paper} per larghezze e margini +@translationof paper variables for widths and margins + +I valori predefiniti (prima del ridimensionamento) non elencati qui si +trovano in @file{ly/paper-defaults-init.ly}. + +@table @code + +@item paper-width +@funindex paper-width + +Larghezza della pagina (non impostata inizialmente). @code{paper-width}, +pur non avendo effetto sul ridimensionamento automatico di alcune dimensioni +orizzontali, influenza la variabile @code{line-width}. Se sono impostate +sia @code{paper-width} che @code{line-width}, saranno modificate anche +@code{left-margin} e @code{right-margin}. Vedi anche @code{check-consistency}. + +@item line-width +@funindex line-width + +Se specificata in un blocco @code{\paper} definisce la lunghezza orizzontale +disponibile per i righi musicali nei sistemi non indentati. Se non specificata, +la larghezza della linea (@code{line-width}) del foglio è determinata dalla sottrazione +@code{(paper-width@tie{}@minus{}@tie{}left-margin@tie{}@minus{}@tie{}right-margin)}. +Se @code{line-width} è specificata nel blocco @code{\paper} e entrambi i margini, +@code{left-margin} e @code{right-margin}, non lo sono, questi saranno aggiornati +in modo da centrare i sistemi sulla pagina automaticamente. +Vedi anche @code{check-consistency}. + +Le variabili @code{line-width} per i singoli brani possono essere specificate +nel blocco @code{\layout} di ogni brano, ovvero dentro un blocco @code{\score}. +Questi valori regolano la larghezza delle linee prodotte brano per brano. Se +@code{line-width} non viene specificata per un brano, il suo valore predefinito +coincide con la larghezza della linea del foglio, ovvero col valore della +variabile @code{line-width} del blocco @code{\paper}. Impostando +@code{line-width} per un brano in particolare, ovvero all'interno di un blocco +@code{\score}, i margini del foglio non vengono modificati. Le linee del rigo, +la cui lunghezza è determinata dalla variabile @code{line-width} del brano, sono +allineate a sinistra all'interno dello spazio definito dalla variabile +@code{line-width} del foglio. Se le variabili @code{line-width} del brano e del +foglio sono uguali, le linee del rigo si estenderanno esattamente dal margine +sinistro al margine destro, ma se quella del brano è maggiore di quella del +foglio le linee del rigo andranno oltre il margine destro. + +@item left-margin +@funindex left-margin + +Margine tra il bordo sinistro della pagina e l'inizio delle linee +del rigo nei sistemi non indentati. Se il formato è modificato, il valore +predefinito di questa dimensione viene ridimensionato proporzionalmente. Se +@code{left-margin} non è impostato, e sono impostati sia @code{line-width} che +@code{right-margin}, allora @code{left-margin} equivale alla differenza +@code{(paper-width@tie{}@minus{}@tie{}line-width@tie{}@minus{}@tie{}right-margin)}. +Se è impostata soltanto @code{line-width}, entrambi i margini sono impostati su +@code{((paper-width@tie{}@minus{}@tie{}line-width)@tie{}/@tie{}2)}, +e di conseguenza i sistemi sono centrati sulla pagina. Vedi anche +@code{check-consistency}. + +@item right-margin +@funindex right-margin + +Margine tra il bordo destro della pagina e la fine delle linee +del rigo in sistemi giustificati. Se il formato è modificato, il valore +predefinito di questa dimensione viene ridimensionato proporzionalmente. Se +@code{right-margin} non è impostato, e sono impostati sia @code{line-width} che +@code{left-margin}, allora @code{right-margin} equivale a +@code{(paper-width@tie{}@minus{}@tie{}line-width@tie{}@minus{}@tie{}left-margin)}. +Se è impostata soltanto @code{line-width}, entrambi i margini sono impostati su +@code{((paper-width@tie{}@minus{}@tie{}line-width)@tie{}/@tie{}2)}, +e di conseguenza i sistemi sono centrati sulla pagina. Vedi anche +@code{check-consistency}. + +@item check-consistency +@funindex check-consistency + +Se impostata su vero (valore predefinito), appare un avvertimento nella +console se la somma di @code{left-margin}, @code{line-width} e +@code{right-margin} non corrisponde esattamente a @code{paper-width}, e a +ciascuna di queste variabili (eccetto @code{paper-width}) sarà assegnato il suo +valore predefinito (ridimensionato in base al formato, se richiesto). Se +impostato su falso, qualsiasi incongruenza viene ignorata e i sistemi potrebbero +andare oltre il bordo della pagina. + +@item ragged-right +@funindex ragged-right + +Se impostato su vero, i sistemi non occuperanno interamente la larghezza +della linea, ovvero non saranno giustificati. Termineranno invece alla loro +lunghezza orizzontale naturale. Valori predefiniti: @code{#t} (true = vero) +per i brani con un unico sistema, e @code{#f} (false = falso) per i brani +con due o più sistemi. Questa variabile può essere impostata anche in +un blocco @code{\layout}. + +@item ragged-last +@funindex ragged-last + +Se impostata su vero, l'ultimo sistema del brano non occuperà interamente +la larghezza della linea, ovvero non sarà giustificato. Terminerà invece +alla sua lunghezza orizzontale naturale. Valore predefinito: @code{#f} (false = falso). +Questa variabile può essere impostata anche in un blocco @code{\layout}. + +@end table + +@seealso +Guida alla notazione: +@ref{Automatic scaling to paper size}. + +File installati: +@file{ly/paper-defaults-init.ly}. + +@knownissues +Formati carta definiti esplicitamente sovrascriveranno qualsiasi margine +destro o sinistro definito dall'utente. + + +@node Variabili paper per la modalità due pagine per foglio +@unnumberedsubsubsec Variabili @code{@bs{}paper} per la modalità due pagine per foglio +@translationof paper variables for two-sided mode + +I valori predefiniti (prima del ridimensionamento) sono definiti in +@file{ly/paper-defaults-init.ly}. + +@table @code + +@item two-sided +@funindex two-sided + +@cindex rilegatura +@cindex margine di rilegatura + +Se impostata su vero, vengono usati @code{inner-margin}, @code{outer-margin} e +@code{binding-offset} per determinare i margini a seconda che il numero di +pagina sia dispari o pari. Questa variabile sovrascrive @code{left-margin} +e @code{right-margin}. + +@item inner-margin +@funindex inner-margin + +Margine del lato interno di tutte le pagine se queste fanno parte +di un libro. Se il formato è modificato, il valore predefinito di questa +dimensione viene ridimensionato proporzionalmente. Funziona soltanto con +@code{two-sided} impostato su vero. + +@item outer-margin +@funindex outer-margin + +È il margine del lato esterno di tutte le pagine se queste fanno parte +di un libro. Se il formato è modificato, il valore predefinito di questa +dimensione viene ridimensionato proporzionalmente. Funziona soltanto con +@code{two-sided} impostato su vero. + +@item binding-offset +@funindex binding-offset + +Quantità di spazio da aggiungere a @code{inner-margin} per assicurarsi che +niente sia nascosto dalla rilegatura. Se il formato è modificato, il valore +predefinito di questa dimensione viene ridimensionato proporzionalmente. +Funziona soltanto con @code{two-sided} impostato su vero. + +@end table + +@seealso +Guida alla notazione: +@ref{Automatic scaling to paper size}. + +File installati: +@file{ly/paper-defaults-init.ly}. + + +@node Variabili paper per spostamenti e indentazioni +@unnumberedsubsubsec Variabili @code{@bs{}paper} per spostamenti e indentazioni +@translationof paper variables for shifts and indents + +I valori predefiniti (prima del ridimensionamento) non elencati qui sono +visibili in @file{ly/paper-defaults-init.ly}. + +@table @code + +@item horizontal-shift +@funindex horizontal-shift + +@c This default value is buried in the middle of page.scm. -mp + +È la quantità di spazio di cui spostare a destra tutti i sistemi (inclusi +i titoli e i separatori dei sistemi). Valore predefinito: @code{0.0\mm}. + +@item indent +@funindex indent + +Livello di indentazione del primo sistema di un brano. +Se il formato è modificato, il valore predefinito di questa dimensione viene +ridimensionato proporzionalmente. Lo spazio compreso in @code{line-width} +disponibile per il primo sistema è ridotto di questa quantità. @code{indent} +può essere specificato anche in blocchi @code{\layout} per impostare +l'indentazione brano per brano. + +@item short-indent +@funindex short-indent + +Livello di indentazione di tutti i sistemi di un brano eccetto +il primo sistema. Se il formato è modificato, il valore predefinito di +questa dimensione viene ridimensionato proporzionalmente. Lo spazio +compreso in @code{line-width} disponibile per tutti i sistemi tranne il +primo è ridotto di questa quantità. @code{short-indent} può essere specificato +anche in blocchi @code{\layout} per impostare le brevi indentazioni brano per brano. + +@end table + +@seealso +Guida alla notazione: +@ref{Automatic scaling to paper size}. + +File installati: +@file{ly/paper-defaults-init.ly}. + +Frammenti: +@rlsr{Spacing}. + + +@node Altre variabili di paper +@subsection Altre variabili di @code{@bs{}paper} +@translationof Other paper variables + +@menu +* Variabili di paper per l'interruzione di linea:: +* Variabili di paper per l'interruzione di pagina:: +* Variabili di paper per la numerazione delle pagine:: +* Svariate variabili di paper:: +@end menu + + +@node Variabili di paper per l'interruzione di linea +@unnumberedsubsubsec Variabili di @code{@bs{}paper} per l'interruzione di linea +@translationof paper variables for line breaking + +@table @code + +@item max-systems-per-page +@funindex max-systems-per-page + +Il numero massimo di sistemi che saranno disposti in una pagina. Attualmente +ciò è supportanto soltanto dall'algoritmo @code{ly:optimal-breaking}. +Valore predefinito: non impostato. + +@item min-systems-per-page +@funindex min-systems-per-page + +Il numero minimo di sistemi che saranno disposti in una pagina. Ciò +potrebbe riempire troppo le pagine, se il numero è troppo grande. Attualmente +ciò è supportanto soltanto dall'algoritmo @code{ly:optimal-breaking}. +Valore predefinito: non impostato. + +@item systems-per-page +@funindex systems-per-page + +Il numero di sistemi da disporre in una pagina. Attualmente +ciò è supportanto soltanto dall'algoritmo @code{ly:optimal-breaking}. +Valore predefinito: non impostato. + +@item system-count +@funindex system-count + +Il numero di sistemi da usare per un brano. Valore predefinito: non impostato. +Questa variabile può essere impostata anche in un blocco @code{\layout}. + +@end table + +@seealso +Guida alla notazione: +@ref{Line breaking}. + + +@node Variabili di paper per l'interruzione di pagina +@unnumberedsubsubsec Variabili di @code{@bs{}paper} per l'interruzione di pagina +@translationof paper variables for page breaking + +I valori predefiniti non elencati qui sono visibili in +@file{ly/paper-defaults-init.ly} + +@table @code + +@item page-breaking +@funindex page-breaking + +L'algoritmo di interruzione di pagina da usare. Le opzioni sono +@code{ly:minimal-breaking}, @code{ly:page-turn-breaking}, +@code{ly:one-line-breaking}, @code{ly:one-line-auto-height-breaking} e +@code{ly:optimal-breaking} (predefinito). + +@item page-breaking-system-system-spacing +@funindex page-breaking-system-system-spacing + +Induce il sistema di interruzione di pagina a credere che +@code{system-system-spacing} sia impostato in modo diverso dal +modo in cui è impostato realmente. Per esempio, se +@code{page-breaking-system-system-spacing #'padding} è impostato su un +valore molto più grande di @code{system-system-spacing #'padding}, il +sistema di interruzione di pagina disporrà meno sistemi su ciascuna +pagina. Valore predefinito: non impostato. + +@item page-count +@funindex page-count + +Il numero di pagine da usare per un brano, non impostato. + +@end table + +Le variabili seguenti sono attive soltanto quando @code{page-breaking} +è impostato su @code{ly:page-turn-breaking}. Le interruzioni di pagina +vengono quindi scelte per minimizzare il numero di voltate di pagina. +Dato che le voltate di pagina si rendono necessarie quando si passa da +una pagina con numero dispari a una con numero pari, verrà solitamente +favorita una formattazione in cui l'ultima pagina abbia un numero dispari. +I punti preferiti per le voltate di pagina possono essere indicati +manualmente col comando @code{\allowPageTurn} o automaticamente +includendo l'incisore @code{Page_turn_engraver} (vedi @ref{Optimal page turning}). + +Se le scelte disponibili per avere voltate di pagina adeguate sono +insufficienti, LilyPond potrebbe inserire una pagina vuota all'interno +di un brano o tra i brani (se ce ne sono almeno due), oppure potrebbe +terminare un brano su una pagina pari. Aumentando i valori delle +seguenti tre variabili diminuisce la probabilità che queste entrino +in azione. + +I valori sono penalità: maggiore il valore, minore la probabilità +che si verifichi l'azione associata rispetto alle altre scelte. + +@table @code + +@item blank-page-penalty +@funindex blank-page-penalty + +La penalità per avere una pagina vuota nel mezzo di un brano. Se il +valore di @code{blank-page-penalty} è grande ed è selezionato +@code{ly:page-turn-breaking}, sarà meno probabile che LilyPond +insersica una pagina nel mezzo del brano. Aggiungerà invece +maggior spazio tra i sistemi per occupare la pagina vuota e +quella successiva. Valore predefinito: 5. + +@item blank-last-page-penalty +@funindex blank-last-page-penalty + +La penalità per terminare il brano su una pagina pari. Se il +valore di @code{blank-last-page-penalty} è grande ed è selezionato +@code{ly:page-turn-breaking}, sarà meno probabile che LilyPond +produca una partitura in cui l'ultima pagina sia pari. Regolerà +invece la spaziatura in modo da usare una pagina in più o in meno. +Valore predefinito: 0. + +@item blank-after-score-page-penalty +@funindex blank-after-score-page-penalty + +La penalità per avere una pagina vuota dopo la fine di un brano e +prima di quello successivo. Il valore predefinito è inferiore a +@code{blank-page-penalty}, in modo che siano inserite preferibilmente +pagine vuote al termine di un brano piuttosto che nel mezzo di un brano. +Valore predefinito: 2. + +@end table + + +@seealso +Guida alla notazione: +@ref{Page breaking}, +@ref{Optimal page breaking}, +@ref{Optimal page turning}, +@ref{Minimal page breaking}, +@ref{One-line page breaking}. + +File installati: +@file{ly/paper-defaults-init.ly}. + + +@node Variabili di paper per la numerazione delle pagine +@unnumberedsubsubsec Variabili di @code{@bs{}paper} per la numerazione delle pagine +@translationof paper variables for page numbering + +I valori predefiniti non elencati qui sono visibili in +@file{ly/paper-defaults-init.ly} + +@table @code + +@cindex numeri di pagina, numerazione automatica +@item auto-first-page-number +@funindex auto-first-page-number + +L'algoritmo di interruzione di pagina si comporta diversamente a seconda +che il numero della prima pagina sia dispari o pari. Se questa variabile +è impostata su vero, l'algoritmo di interruzione di pagina +deciderà se iniziare con un numero dispari o un numero pari. Quindi il +numero della prima pagina resterà lo stesso o aumenterà di uno. +Valore predefinito: @code{#f} (falso). + +@cindex numeri di pagina, indicare il primo +@item first-page-number +@funindex first-page-number + +Il valore del numero di pagina della prima pagina. + +@item print-first-page-number +@funindex print-first-page-number + +Se impostato su vero, appare il numero di pagina sulla prima pagina. + +@cindex numeri di pagina, sopprimere +@item print-page-number +@funindex print-page-number + +Se impostato su falso, non apparirano i numeri di pagina. + +@cindex numeri di pagina in numeri romani +@item page-number-type +@funindex page-number-type + +Il tipo di numero usato per numerare le pagine. Le opzioni possibili +sono @code{roman-lower}, @code{roman-upper} e @code{arabic}. +Valore predefinito: @code{'arabic}. + +@end table + +@seealso +File installati: +@file{ly/paper-defaults-init.ly}. + +@knownissues +I numeri di pagina dispari sono sempre sulla destra. Se la musica +deve iniziare a pagina 1, ci deve essere una pagina vuota sulla +seconda di copertina in modo che pagina 1 sia sul lato destro. + + +@node Svariate variabili di paper +@unnumberedsubsubsec Svariate variabili di @code{@bs{}paper} +@translationof Miscellaneous paper variables + +@table @code + +@item page-spacing-weight +@funindex page-spacing-weight + +L'importanza della spaziatura (verticale) e della linea (orizzontale) +della pagina. Valori più grandi renderanno la spaziatura della pagina +più importante. Valore predefinito: @code{10}. + +@item print-all-headers +@funindex print-all-headers + +Se impostato su vero, appariranno nell'output tutte le intestazioni di +ciascun blocco @code{\score}. Di norma appaiono soltanto le variabili +@code{piece} e @code{opus}. Valore predefinito: @code{#f}. + +@item system-separator-markup +@funindex system-separator-markup + +Un oggetto markup inserito tra i sistemi, spesso usato per le +partiture orchestrali. Valore predefinito: non impostato. È +disponibile il comando markup @code{\slashSeparator}, definito +in @file{ly/titling-init.ly}, che fornisce un ragionevole valore +predefinito, per esempio: + +@lilypond[quote,verbatim,noragged-right,line-width=30\mm] +#(set-default-paper-size "a8") + +\book { + \paper { + system-separator-markup = \slashSeparator + } + \header { + tagline = ##f + } + \score { + \relative { c''1 \break c1 \break c1 } + } +} +@end lilypond + +@end table + +@seealso +File installati: +@file{ly/titling-init.ly}. + +Frammenti: +@rlsr{Spacing}. + +@knownissues +L'intestazione di pagina predefinita pone sulla stessa linea il numero di +pagina e il campo @code{instrument} del blocco @code{\header}. + + +@node Formattazione della partitura +@section Formattazione della partitura +@translationof Score layout + +Questa sezione tratta le opzioni di formattazione della partitura disponibili +nel blocco @code{\layout}. + +@menu +* Il blocco layout:: +* Impostare la dimensione del rigo:: +@end menu + + +@node Il blocco layout +@subsection Il blocco @code{@bs{}layout} +@translationof The layout block + +@funindex \layout + +Mentre il blocco @code{\paper} contiene le impostazioni relative +alla formattazione della pagina per l'intero documento, il blocco +@code{\layout} contiene impostazioni di formattazione specifica +di un brano. Per impostare globalmente le opzioni di formattazione +del brano, inserirle in un blocco @code{\layout} del livello superiore. +Per impostare le impostazioni di formattazione per un singolo brano, inserirle +in un blocco @code{\layout} racchiuso in un blocco @code{\score}, dopo la +musica. Le impostazioni che possono apparire in un blocco +@code{\layout} includono: + +@itemize +@item la funzione scheme @code{layout-set-staff-size}, +@item le modifiche di contesto nei blocchi @code{\context} e +@item le variabili @code{\paper} che agiscono sulla formattazione del brano. +@end itemize + +La funzione @code{layout-set-staff-size} è spiegata nella prossima +sezione, @ref{Setting the staff size}. Le modifiche di contesto sono +trattate in un capitolo separato; vedi @ref{Modifying context plug-ins} e +@ref{Changing context default settings}. + +Le variabili @code{\paper} che possono apparire in un blocco @code{\layout}, +con valori predefiniti presi dal blocco @code{\paper}, sono: + +@itemize + +@item +@code{line-width}, @code{ragged-right} e @code{ragged-last} +(vedi @ref{paper variables for widths and margins,,variabili @code{@bs{}paper} per larghezze e margini}) + +@item +@code{indent} e @code{short-indent} +(vedi @ref{paper variables for shifts and indents,,variabili @code{@bs{}paper} per spostamenti e indentazioni}) + +@item +@code{system-count} +(vedi @ref{paper variables for line breaking,,variabili @code{@bs{}paper} per l'interruzione di linea}) + +@end itemize + +Ecco un esempio di blocco @code{\layout}: + +@example +\layout @{ + indent = 2\cm + \context @{ + \StaffGroup + \override StaffGrouper.staff-staff-spacing.basic-distance = #8 + @} + \context @{ + \Voice + \override TextScript.padding = #1 + \override Glissando.thickness = #3 + @} +@} +@end example + +Si possono inserire molteplici blocchi @code{\layout} come espressioni +di livello superiore. Ciò può essere utile, per esempio, se impostazioni +diverse sono salvate in file separati e incluse facoltativamente. +Internamente, quando un blocco @code{\layout} viene elaborato, viene fatta +una copia della configurazione del blocco @code{\layout} corrente, poi +qualsiasi modifica apportata nel blocco viene applicata e il risultato +viene salvato come la nuova configurazione corrente. Dalla prospettiva +dell'utente, i blocchi @code{\layout} sono combinati, ma in situazioni di +conflitto (ovvero quando viene modificata la stessa proprietà in blocchi +diversi) hanno precedenza le definizioni più recenti. + +Per esempio, se questo blocco + +@example +\layout @{ + \context @{ + \Voice + \override TextScript.color = #magenta + \override Glissando.thickness = #1.5 + @} +@} +@end example + +viene posto dopo quello dell'esempio precedente, le sovrascritture di +@code{'padding} e @code{'color} per @code{TextScript} sono combinate, mentre +quella più recente di @code{'thickness} per @code{Glissando} sostituisce +(o nasconde) quella precedente. + +I blocchi @code{\layout} possono essere assegnati a delle variabili per +poterli riusare successivamente, ma il modo in cui ciò funziona è +leggermente ma significativamente diverso rispetto a scriverle davvero. + +Se una variabile è definita in questo modo, + +@example +layoutVariable = \layout @{ + \context @{ + \Voice + \override NoteHead.font-size = #4 + @} +@} +@end example + +manterrà la configurazione attuale di @code{\layout} con l'aggiunta +della sovrascrittura @code{NoteHead.font-size}, ma questa combinazione +@emph{non} è salvata come la nuova configurazione corrente. Attenzione +al fatto che la @qq{configurazione corrente} viene letta quando la variabile +è definita e non quando viene usata, dunque il contenuto della variabile +dipende dalla sua posizione nel file di input. + +La variabile può quindi essere usata all'interno di un altro +blocco @code{\layout}, per esempio: + +@example +\layout @{ + \layoutVariable + \context @{ + \Voice + \override NoteHead.color = #red + @} +@} +@end example + +Un blocco @code{\layout} che contiene una variabile, come nell'esempio +precedente, @emph{non} copia la configurazione corrente bensì usa il +contenuto di @code{\layoutVariable} come configurazione di base per +altre aggiunte. Ciò significa che qualsiasi modifica definita tra la +definizione della variabile e il momento in cui essa viene usata è perduta. + +Se @code{layoutVariable} è definita (o inclusa con @code{\include}) subito +prima di essere usata, il suo contenuto comprende soltanto la configurazione +corrente più le sovrascritture definite al suo interno. Quindi nell'esempio +precedente che illustra l'uso di @code{\layoutVariable} il blocco @code{\layout} +finale conterrebbe: + +@example + TextScript.padding = #1 + TextScript.color = #magenta + Glissando.thickness = #1.5 + NoteHead.font-size = #4 + NoteHead.color = #red +@end example + +più le sovrascritture @code{indent} e @code{StaffGrouper}. + +Ma se la variabile fosse già stata definita prima del primo blocco +@code{\layout}, la configurazione corrente conterrebbe soltanto + +@example + NoteHead.font-size = #4 % (scritta nella definizione della variabile) + NoteHead.color = #red % (aggiunta dopo l'uso della variabile) +@end example + +Se ben organizzate, le variabili @code{\layout} possono essere un +valido strumento per strutturare le formattazioni dei sorgenti, e anche +per ripristinare la configurazione di @code{\layout} a uno stato conosciuto. + +@seealso +Guida alla notazione: +@ref{Changing context default settings}. + +Frammenti: +@rlsr{Spacing}. + + +@node Impostare la dimensione del rigo +@subsection Impostare la dimensione del rigo +@translationof Setting the staff size + +@cindex tipo di carattere, impostare la dimensione +@cindex rigo, impostare la dimensione +@funindex layout file +@funindex magnification->font-size +@funindex magstep +@funindex set-global-staff-size +@funindex layout-set-staff-size + +La dimensione del rigo (in inglese @strong{staff size}) è 20 punti, che +corrispondono a un'altezza del rigo di 7.03mm (un punto è uguale a 100/7227 +di un pollice o a 2540/7227 mm). La dimensione del rigo può essere +modificata in tre modi: + +@enumerate + +@item +Per impostare la dimensione del rigo globalmente per tutti i brani di un +file (o di un blocco @code{\book}, per essere precisi), usare +@code{set-global-staff-size}: + +@example +#(set-global-staff-size 14) +@end example + +@noindent +L'esempio precedente imposta la dimensione del rigo globale a 14pt (4.92mm) e +ridimensiona proporzionalmente tutti i tipi di carattere. + +@item +Per impostare la dimensione del rigo di una singola partitura in un libro, usare +@code{layout-set-staff-size} all'interno del blocco @code{\layout} di quel brano: + +@example +\score @{ + @dots{} + \layout @{ + #(layout-set-staff-size 14) + @} +@} +@end example + +@item +Per impostare la dimensione del rigo di un singolo rigo di un sistema, usare +il comando @code{\magnifyStaff}. Per esempio, le partiture di musica da camera +incise in modo tradizionale spesso usavano righi per pianoforte di 7mm mentre +gli altri righi erano solitamente tra 3/5 e 5/7 più grandi (tra 60% e 71%). +Per ottenere la proporzione 5/7, usare: + +@example +\score @{ + << + \new Staff \with @{ + \magnifyStaff #5/7 + @} @{ @dots{} @} + \new PianoStaff @{ @dots{} @} + >> +@} +@end example + +Se si desidera una dimensione del tipo di carattere (@code{fontSize}) ben +precisa, si può usare la seguente forma: + +@example +\score @{ + << + \new Staff \with @{ + \magnifyStaff #(magstep -3) + @} @{ @dots{} @} + \new PianoStaff @{ @dots{} @} + >> +@} +@end example + +Per emulare l'aspetto delle partiture incise coi metodi tradizionali, è meglio +evitare di ridurre lo spessore delle linee del rigo. + +@end enumerate + + +@subheading Corpo automatico dei tipi di carattere a dimensioni diverse + +Il tipo di carattere Feta fornisce simboli musicali in otto dimensioni +diverse. Ogni tipo di carattere è calibrato per una specifica dimensione +del rigo: via via che la dimensione del rigo diventa più piccola, il corpo +del carattere diventa più grosso, per abbinarsi alle linee del rigo più +spesse. Le dimensioni del carattere consigliate sono elencate nella +seguente tabella: + +@multitable @columnfractions .15 .2 .22 .2 +@item @b{nome del tipo di carattere} @tab @b{altezza del rigo (pt)} @tab @b{altezza del rigo (mm)} @tab @b{uso} +@item feta11 @tab 11.22 @tab 3.9 @tab partiture tascabili +@item feta13 @tab 12.60 @tab 4.4 @tab +@item feta14 @tab 14.14 @tab 5.0 @tab +@item feta16 @tab 15.87 @tab 5.6 @tab +@item feta18 @tab 17.82 @tab 6.3 @tab canzonieri +@item feta20 @tab 20 @tab 7.0 @tab parti standard +@item feta23 @tab 22.45 @tab 7.9 @tab +@item feta26 @tab 25.2 @tab 8.9 @tab @c modern rental material? +@end multitable + +@seealso +Guida alla notazione: +@ref{Selecting notation font size}. + +Frammenti: +@rlsr{Spacing}. + +@knownissues +@code{layout-set-staff-size} non modifica la distanza tra le linee del rigo. + + +@node Interruzioni +@section Interruzioni +@translationof Breaks + +@menu +* Interruzioni di linea:: +* Interruzioni di pagina:: +@end menu + + +@node Interruzioni di linea +@subsection Interruzioni di linea +@translationof Line breaking + +@funindex \break +@funindex \noBreak +@funindex \autoBreaksOff +@funindex \autoBreaksOn +@funindex \autoLineBreaksOff +@funindex \autoLineBreaksOn +@cindex manual line breaks +@cindex breaking lines + +Le interruzioni di linea di solito sono determinate automaticamente. Sono +decise in modo che le linee non sembrino né fitte né troppo spaziate, e che +le linee consecutive abbiano una densità simile. + +Per forzare manualmente un'interruzione di linea dopo una stanghetta, usare +il comando @code{\break}: + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c c | \break + c4 c c c | +} +@end lilypond + +Per impostazione predefinita, un comando @code{\break} inserito nel mezzo di una +misura viene ignorato (e apparirà un messaggio di avvertimento durante la +compilazione del file LilyPond). L'aggiunta di una stanghetta invisibile +-- @w{@samp{\bar ""}} -- prima del comando @code{\break} forzerà l'interruzione +di linea: + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c + \bar "" \break + c | + c4 c c c | +} +@end lilypond + +Un comando @code{\break} successivo a una stanghetta viene ignorato se la +misura precedente termina nel mezzo di una nota (per esempio, quando un +gruppo irregolare inizia in una misura e termina in un'altra). In questo +caso conviene togliere l'incisore @code{Forbid_line_break_engraver} dal +contesto @code{Voice} e usare una costruzione musicale simultanea inserendo +il @code{\break} nel punto giusto della seconda voce: + +@lilypond[quote,ragged-right,verbatim] +\new Voice \with { + \remove "Forbid_line_break_engraver" +} \relative { + << + { c''2. \tuplet 3/2 { c4 c c } c2. | } + { s1 | \break s1 | } + >> +} +@end lilypond + +Analogalmente, le interruzioni di linea vengono ignorate quando le travature +oltrepassano una stanghetta. Tale comportamento predefinito può +essere modificato col comando @code{\override Beam.breakable = ##t}: + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \override Beam.breakable = ##t + c2. c8[ c | \break + c8 c] c2. | +} +@end lilypond + +Il comando @code{\noBreak} impedisce un'interruzione di linea sulla +stanghetta in cui è inserito. + +In una partitura, l'interruzione di linea automatica è vietata per +la musica compresa tra i comandi @code{\autoLineBreaksOff} e +@code{\autoLineBreaksOn}. Per impedire anche le interruzioni di +pagina, usare i comandi @code{\autoBreaksOff} e @code{\autoBreaksOn}. +Le interruzioni manuali non sono interessate da questi comandi. +Nota che bloccare le interruzioni di linea automatiche potrebbe +far andare la musica oltre il margine destro se questa non può +essere contenuta in una linea. + +Le interruzioni di linea automatiche (ma non le interruzioni di pagina) +possono essere abilitate per singole stanghette usando +@code{\once \autoLineBreaksOn} all'inizio di una stanghetta. +Ciò identifica un'interruzione di linea permessa, invece che forzata. + +Le impostazioni fondamentali che influenzano la spaziatura della linea +sono @code{indent} e @code{line-width}, impostate nel blocco +@code{\layout}: regolano l'indentazione della prima linea e la +lunghezza delle linee. + +Se @code{ragged-right} è impostato su vero nel blocco @code{\layout}, allora +i sistemi terminano alla loro naturale lunghezza orizzontale, invece di +essere allungati orizzontalmente per riempire l'intera linea. Ciò è +utile per brevi frammenti e per verificare quanto è stretta la spaziatura +naturale. + +@c TODO Check and add para on default for ragged-right + +L'opzione @code{ragged-last} è simile a @code{ragged-right}, ma agisce +soltanto sull'ultima linea del brano. + +@example +\layout @{ + indent = 0\mm + line-width = 150\mm + ragged-last = ##t +@} +@end example + +@cindex interruzioni di linea regolari +@cindex musica a quattro battute + +Per inserire interruzioni di linea a intervalli regolari usare @code{\break} +separato da pause spaziatrici e ripetuto con @code{\repeat}. Per esempio, +per interrompere le seguenti 28 misure (considerando un tempo di 4/4) esattamente +ogni 4 misure, usare: + +@example +<< + \repeat unfold 7 @{ + s1 \noBreak s1 \noBreak + s1 \noBreak s1 \break + @} + @{ @var{la vera musica@dots{}} @} +>> +@end example + + +@predefined +@code{\break}, +@code{\noBreak}, +@code{\autoBreaksOff}, +@code{\autoBreaksOn}, +@code{\autoLineBreaksOff}, +@code{\autoLineBreaksOn}. +@endpredefined + +@snippets + +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{using-an-extra-voice-for-breaks.ly} + +@seealso +Guida alla notazione: +@ref{paper variables for line breaking} +@ref{The layout block}. + +Frammenti: +@rlsr{Spacing}. + +Guida al funzionamento interno: +@rinternals{LineBreakEvent}. + +@knownissues + +L'inserimento dei comandi @code{\autoLineBreaksOff} o @code{\autoBreaksOff} +prima della musica produrrà dei messaggi di errore. Inserire sempre questi +comandi dopo la musica. + + +@node Interruzioni di pagina +@subsection Interruzioni di pagina +@translationof Page breaking + +Questa sezione descrive i diversi metodi di interruzione di pagina e +spiega come modificarli. + +@menu +* Interruzione di pagina manuale:: +* Interruzione di pagina ottimale:: +* Interruzione di pagina minimale:: +* Interruzione di pagina su una linea:: +* Interruzione di pagina su una linea con altezza automatica:: +* Voltata di pagina ottimale:: +@end menu + + +@node Interruzione di pagina manuale +@unnumberedsubsubsec Interruzione di pagina manuale +@translationof Manual page breaking + +@funindex \pageBreak +@funindex \noPageBreak +@funindex \autoPageBreaksOn +@funindex \autoPageBreaksOff +@cindex page breaking, manual + +L'interruzione di pagina predefinita può essere sovrascritta con i +comandi @code{\pageBreak} o @code{\noPageBreak}. Questi comandi, +analoghi a @code{\break} e @code{\noBreak}, devono essere +inseriti dopo una stanghetta e forzano o proibiscono l'interruzione +di pagina in quel punto. Ovviamente il comando @code{\pageBreak} +forza anche un'interruzione di linea. + +I comandi @code{\pageBreak} e @code{\noPageBreak} possono essere +inseriti anche nel livello superiore, tra le partiture e i testi +(nel blocco @code{markup}) di livello superiore. + +In un brano, le interruzioni di pagina automatiche sono vietate per +la musica compresa tra i comandi @code{\autoPageBreaksOff} e +@code{\autoPageBreaksOn}. Le interruzioni di pagina manuali non +sono interessate da questi comandi. + +Esistono impostazioni analoghe a @code{ragged-right} e +@code{ragged-last} che hanno lo stesso effetto sulla spaziatura +verticale. Se @code{ragged-bottom} è impostato su @code{#t}, i +sistemi non saranno giustificati verticalmente. Quando +@code{ragged-last-bottom} è impostato su @code{#t} (valore +predefinito), è permesso dello spazio vuoto in fondo all'ultima +pagina (o in fondo all'ultima pagina di ciascun +@code{\bookpart}). Vedi +@ref{Fixed vertical spacing paper variables,,Variabili fisse della spaziatura verticale di @code{@bs{}paper}}. + +Le interruzioni di pagina sono calcolate dalla funzione @code{page-breaking}. +LilyPond fornisce vari algoritmi per calcolare le interruzioni di pagina, tra +cui @code{ly:optimal-breaking}, @code{ly:page-turn-breaking} e +@code{ly:minimal-breaking}. Quello predefinito è +@code{ly:optimal-breaking}, ma il valore può essere modificato nel +blocco @code{\paper}: + +@example +\paper @{ + page-breaking = #ly:page-turn-breaking +@} +@end example + +@funindex \bookpart + +Quando un libro ha molte partiture e pagine, il problema delle interruzioni +di pagina potrebbe essere difficile da risolvere e richiedere lunghi tempi +di elaborazione e molta memoria. Per semplificare il processo di interruzione +delle pagine, si usano i blocchi @code{\bookpart} per dividere il libro in +varie parti: in questo modo l'interruzione di pagina si verifica separatamente +in ciascuna parte. Si possono anche usare algoritmi di interruzione di +pagina diversi per le diverse parti del libro. + +@example +\bookpart @{ + \header @{ + subtitle = "Prefazione" + @} + \paper @{ + %% In una parte contenente soprattutto testo, + %% ly:minimal-breaking potrebbe essere preferibile + page-breaking = #ly:minimal-breaking + @} + \markup @{ @dots{} @} + @dots{} +@} +\bookpart @{ + %% In questa parte, contenente musica, si usa l'algoritmo di + %% interruzione di pagina ottimale. + \header @{ + subtitle = "Primo movimento" + @} + \score @{ @dots{} @} + @dots{} +@} +@end example + + +@predefined +@code{\pageBreak}, +@code{\noPageBreak}, +@code{\autoPageBreaksOn}, +@code{\autoPageBreaksOff}. +@endpredefined + +@seealso +Guida alla notazione: +@ref{paper variables for page breaking}. + +Frammenti: +@rlsr{Spacing}. + +@knownissues + +Il prefisso @code{\once} non funziona con i comandi @code{\autoPageBreaksOn} +e @code{\autoPageBreaksOff}. Se l'interruzione di pagina automatica è +disabilitata e poi viene abilitata per permettere un'interruzione di +pagina, deve restare attiva per alcune battute (il numero preciso di +battute dipende dalla partitura) prima di essere disattivata, altrimenti +la possibilità di interrompere la pagina non verrà considerata. + + +@node Interruzione di pagina ottimale +@unnumberedsubsubsec Interruzione di pagina ottimale +@translationof Optimal page breaking + +@funindex ly:optimal-breaking + +La funzione @code{ly:optimal-breaking} è il metodo predefinito di LilyPond +per determinare le interruzioni di pagina. Tenta di individuare un'interruzione +di pagina che minimizzi la densità e l'allungamento, sia orizzontalmente che +verticalmente. Diversamente da @code{ly:page-turn-breaking}, non prende in +considerazione le voltate di pagina. + +@seealso +Frammenti: +@rlsr{Spacing}. + + +@node Interruzione di pagina minimale +@unnumberedsubsubsec Interruzione di pagina minimale +@translationof Minimal page breaking + +@funindex ly:minimal-breaking + +La funzione @code{ly:minimal-breaking} fa dei calcoli minimi +per valutare l'interruzione di pagina: riempie una pagina col +maggior numero possibile di sistemi prima di passare a quella +successiva. Dunque potrebbe essere preferibile per le partiture +con molte pagine, per le quali le altre funzioni di interruzione +di pagina potrebbero essere troppo lente o richiedere troppa +memoria, o con molto testo. Si abilita con: + +@example +\paper @{ + page-breaking = #ly:minimal-breaking +@} +@end example + +@seealso +Frammenti: +@rlsr{Spacing}. + + +@node Interruzione di pagina su una linea +@unnumberedsubsubsec Interruzione di pagina su una linea +@translationof One-line page breaking + +@funindex ly:one-line-breaking + +La funzione @code{ly:one-line-breaking} è un algoritmo di interruzione +di pagina per uso speciale in quanto pone ogni brano su una sola pagina e +una singola linea. Non appaiono né titoli né margini, ma viene +mostrato solo il brano musicale. + +La larghezza della pagina è regolata in modo che il brano più +lungo stia su una sola linea. In particolare, le variabili @code{paper-width}, +@code{line-width} e @code{indent} del blocco @code{\paper} vengono +ignorate, sebbene @code{left-margin} e @code{right-margin} siano +comunque considerate. L'altezza della pagina resta invariata. + + +@node Interruzione di pagina su una linea con altezza automatica +@unnumberedsubsubsec Interruzione di pagina su una linea con altezza automatica +@translationof One-line-auto-height page breaking + +@funindex ly:one-line-auto-height-breaking + +La funzione @code{ly:one-line-auto-height-breaking} funziona proprio come +@code{ly:one-line-breaking} con la differenza che l'altezza della pagina +viene modificata automaticamente per adattarsi all'altezza della musica. +Più precisamente, la variabile @code{paper-height} del blocco @code{\paper} +viene impostata in modo che abbracci l'altezza della partitura più alta +e i margini superiore e inferiore (@code{top-margin} e @code{bottom-margin}). + +Fare attenzione al fatto che l'impostazione @code{top-system-spacing} avrà +effetto sulla posizione verticale della musica. Impostarla su @code{##f} in +un blocco @code{\paper} per posizionare la musica tra i margini superiore e +inferiore. + + +@node Voltata di pagina ottimale +@unnumberedsubsubsec Voltata di pagina ottimale +@translationof Optimal page turning + +@funindex ly:page-turn-breaking + +È spesso necessario trovare una configurazione delle interruzioni di +pagina in cui ci sia una pausa al termine di ogni due pagine. +In questo modo il musicista può voltare la pagina senza perdere +le note. La funzione @code{ly:page-turn-breaking} tenta di trovare +un'interruzione di pagina che minimizzi densità e allungamento, ma +con l'ulteriore restrizione che le voltate di pagina sono permesse +solo in punti specifici. + +Ci sono due passi da seguire per usare questa funzione. Prima +occorre abilitarla nel blocco @code{\paper}, come è spiegato in +@ref{Page breaking}. Poi bisogna indicare alla funzione dove +sono permesse le interruzioni di pagina. + +Ci sono due modi per fare il secondo passo. Si può specificare +manualmente ogni potenziale voltata di pagina, inserendo +@code{\allowPageTurn} nei punti adatti del file di input. + +Oppure, se ciò è troppo noioso, si può aggiungere l'incisore +@code{Page_turn_engraver} a un contesto Staff o Voice. L'incisore +@code{Page_turn_engraver} analizzerà il contesto in cerca di sezioni +senza note (non cerca pause, bensì l'assenza di note, in modo che +la polifonia su un singolo rigo con pause in una delle parti non +confonda @code{Page_turn_engraver}). Quando trova una sezione +senza note abbastanza lunga, @code{Page_turn_engraver} inserirà il +comando @code{\allowPageTurn} nella stanghetta finale di quella +sezione, a meno che non ci sia una stanghetta @q{speciale} (come +una doppia stanghetta), nel qual caso il comando @code{\allowPageTurn} +sarà inserito nella stanghetta finale @qq{speciale} della sezione. + +@funindex minimumPageTurnLength +L'incisore @code{Page_turn_engraver} legge la proprietà di contesto +@code{minimumPageTurnLength} per determinare quanto deve essere lunga +una sezione senza note prima che una voltata di pagina sia considerata. +Il valore predefinito di @code{minimumPageTurnLength} è +@code{(ly:make-moment 1/1)}. Per disabilitare le voltate di pagina, +impostarla su un valore @qq{molto grande}. + +@example +\new Staff \with @{ \consists "Page_turn_engraver" @} +@{ + a4 b c d | + R1 | % voltata di pagina permessa qui + a4 b c d | + \set Staff.minimumPageTurnLength = #(ly:make-moment 5/2) + R1 | % voltata di pagina non permessa qui + a4 b r2 | + R1*2 | % voltata di pagina permessa qui + a1 +@} +@end example + +@funindex minimumRepeatLengthForPageTurn +Quando si usano ripetizioni con finali alternativi, l'incisore @code{Page_turn_engraver} +permetterà una voltata di pagina durante la ripetizione soltanto se c'è +abbastanza tempo all'inizio e alla fine della ripetizione per voltare +indietro la pagina. Se la ripetizione è troppo breve, si può usare +@code{Page_turn_engraver} per @emph{disabilitare} le voltate impostando +un valore appropriato per la proprietà di contesto @code{minimumRepeatLengthForPageTurn}. +In questo caso @code{Page_turn_engraver} consentirà le voltate soltanto nelle +ripetizioni la cui durata sia maggiore del valore specificato. + +I comandi per le voltate di pagina (@code{\pageTurn}, @code{\noPageTurn} +e @code{\allowPageTurn}), possono essere usati anche nel livello superiore, +nei blocchi markup di livello superiore e tra una partitura e l'altra. + +@predefined +@funindex \pageTurn +@code{\pageTurn}, +@funindex \noPageTurn +@code{\noPageTurn}, +@funindex \allowPageTurn +@code{\allowPageTurn}. +@endpredefined + +@seealso +Guida alla notazione: +@ref{paper variables for line breaking}. + +Frammenti: +@rlsr{Spacing}. + +@knownissues +Usare soltanto un incisore @code{Page_turn_engraver} per partitura. Se ce +n'è più d'uno, interferiranno uno con l'altro. + + +@seealso +Guida alla notazione: +@ref{Vertical spacing}. + +Frammenti: +@rlsr{Spacing}. + + +@node Spaziatura verticale +@section Spaziatura verticale +@translationof Vertical spacing + +@cindex vertical spacing +@cindex spacing, vertical + +La spaziatura verticale è regolata da tre elementi: la quantità di +spazio disponibile (ovvero il formato e i margini), la quantità di +spazio tra i sistemi e la quantità di spazio tra i righi di un +sistema. + +@menu +* Spaziatura verticale flessibile all'interno dei sistemi:: +* Posizionamento esplicito di righi e sistemi:: +* Elusione delle collisioni verticali:: +@end menu + + +@node Spaziatura verticale flessibile all'interno dei sistemi +@subsection Spaziatura verticale flessibile all'interno dei sistemi +@translationof Flexible vertical spacing within systems + +@cindex distanza tra i righi +@cindex righi, distanza +@cindex spazio tra i righi +@cindex spazio dentro i sistemi + +Tre meccanismi distinti regolano la spaziatura verticale flessibile +all'interno dei sistemi, uno per ognuna delle seguenti categorie: + +@itemize + +@item +@emph{righi non raggruppati}, + +@item +@emph{righi raggruppati} (righi con un gruppo come +@code{ChoirStaff}, etc.), e + +@item +@emph{linee che non sono righi} (come @code{Lyrics}, @code{ChordNames}, +etc.). + +@end itemize + +@c TODO: Clarify this. This almost implies that non-staff lines +@c have NO effect on the spacing between staves. -mp + +L'altezza di ogni sistema è determinata in due fasi. Prima vengono +spaziati tutti i righi in base alla quantità di spazio disponibile. +Poi le linee che non sono righi sono distribuite tra i righi. + +Nota che i meccanismi di spaziatura trattati in questa sezione regolano +soltanto la spaziatura verticale dei righi e delle linee (che non sono +righi) all'interno di singoli sistemi. La spaziatura verticale tra +sistemi, partiture, testi e margini separati è regolata dalle variabili +@code{\paper} trattate in +@ref{Flexible vertical spacing paper variables,,Variabili @code{@bs{}paper} della spaziatura verticale flessibile}. + +@menu +* Proprietà della spaziatura dentro un sistema:: +* Spaziatura dei righi non raggruppati:: +* Spaziatura dei righi raggruppati:: +* Spaziatura delle linee che non sono righi:: +@end menu + + +@node Proprietà della spaziatura dentro un sistema +@unnumberedsubsubsec Proprietà della spaziatura dentro un sistema +@translationof Within-system spacing properties + +@funindex staff-affinity +@funindex staffgroup-staff-spacing +@funindex staff-staff-spacing +@funindex nonstaff-unrelatedstaff-spacing +@funindex nonstaff-relatedstaff-spacing +@funindex nonstaff-nonstaff-spacing +@funindex default-staff-staff-spacing +@funindex minimum-Y-extent +@funindex extra-offset +@funindex self-alignment-X +@funindex X-offset +@funindex VerticalAxisGroup + +I meccanismi di spaziatura verticale dentro un sistema sono regolati da +due gruppi di proprietà dei grob. Il primo gruppo è associato al grob +@code{VerticalAxisGroup}, creato da tutti i righi e tutte le linee che +non sono righi. Il secondo gruppo è associato al grob +@code{StaffGrouper}, che può essere creato da gruppi di righi, ma +solo se richiamato esplicitamente. Queste proprietà sono descritte +una per una alla fine di questa sezione. + +Il nome di queste proprietà (con l'eccezione di @code{staff-affinity}) +hanno il formato @code{@var{elemento1}-@var{elemento2}-spacing}, dove +@code{@var{elemento1}} e @code{@var{elemento2}} sono gli elementi di +cui determinare la distanza. Nota che @code{@var{elemento2}} non è +necessariamente sotto @code{@var{elemento1}}; per esempio, +@code{nonstaff-relatedstaff-spacing} prenderà le misure verso l'alto a +partire dalla linea che non è un rigo (nonstaff) se +@code{staff-affinity} è impostato su @code{UP}. + +Ogni distanza è calcolata tra i @emph{punti di riferimento} dei due +elementi. Il punto di riferimento di un rigo è il centro verticale +del suo @code{StaffSymbol} (ovvero la linea centrale se +@code{line-count} (il numero di linee) è dispari; lo spazio centrale +se @code{line-count} è pari). I punti di riferimento per ciascuna linea +che non è un rigo sono elencati nella seguente tabella: + +@multitable {Non-staff line} {Reference point} +@headitem Linea non-rigo @tab Punto di riferimento +@item @code{ChordNames} @tab linea di base +@item @code{NoteNames} @tab linea di base +@item @code{Lyrics} @tab linea di base +@item @code{Dynamics} @tab metà altezza di @q{m} +@item @code{FiguredBass} @tab punto più alto +@item @code{FretBoards} @tab linea più alta +@end multitable + +Nell'immagine seguente, le linee orizzontali indicano le posizioni di +questi punti di riferimento: + +@lilypond[quote,noragged-right,line-width=110\mm] +#(define zero-space '((padding . -inf.0) (basic-distance . 0))) + +alignToZero = \with { + \override VerticalAxisGroup.nonstaff-relatedstaff-spacing = #zero-space + \override VerticalAxisGroup.nonstaff-nonstaff-spacing = #zero-space + \override VerticalAxisGroup.staff-affinity = #DOWN + \remove Text_engraver % impedisce di averne due + \consists Text_engraver +} +lowerCaseChords = \with { + chordNameLowercaseMinor = ##t +} +labelContext = +#(define-music-function + (context) + (string?) + #{ s1*0^\markup { \upright {\typewriter #context } } #}) + +\layout { + \context { \Dynamics \alignToZero } + \context { \FiguredBass \alignToZero } + \context { \Lyrics \alignToZero } + \context { \NoteNames \alignToZero } + \context { \ChordNames \alignToZero \lowerCaseChords } + \context { \FretBoards \alignToZero } + \context { \Score + \omit BarLine + \override DynamicText.self-alignment-X = #-1 + \override FretBoard.X-offset = #1.75 + \override InstrumentName.minimum-Y-extent = #'(-1 . 2) + \textLengthOn + \omit TimeSignature + } +} + +%% Questi contesti hanno punti di riferimento nella linea di base: +%% ChordNames, NoteNames, and Lyrics +<< + \new ChordNames { \chords { \labelContext "ChordNames" g1:m } } + \new NoteNames { s1 |\labelContext "NoteNames" g1 | } + \new Lyrics { \lyrics { \skip 1*2 | \labelContext "Lyrics" ghijk1 | } } + \new RhythmicStaff \with { instrumentName = #"linea di base " } s1*3 +>> + +%% Il punto di riferimento per Dynamics è la linea centrale della 'm' nel tipo di carattere +<< + \new Dynamics { \labelContext "Dynamics" s1\mp s\fp } + \new RhythmicStaff \with { instrumentName = #"metà altezza " } s1*3 +>> + +%% Il punto di riferimento per FiguredBass è il suo punto più alto +<< + \new FiguredBass { \labelContext "FiguredBass" \figuremode { <6 5>1 } } + \new RhythmicStaff \with { instrumentName = #"punto più alto " } s1 +>> + +%% Il punto di riferimento per FretBoards è la linea più alta +\include "predefined-guitar-fretboards.ly" +<< + \new FretBoards { \labelContext "FretBoards" \chordmode { e1 } } + \new RhythmicStaff \with { instrumentName = #"linea più alta " } s1 +>> +@end lilypond + +Tutte le proprietà di spaziatura verticale del grob (eccetto +@code{staff-affinity}) usano la stessa struttura della lista +associativa usata dalle variabili di spaziatura di @code{\paper} +trattate in +@ref{Flexible vertical spacing paper variables,,Variabili @code{@bs{}paper} della spaziatura verticale flessibile}. +Metodi specifici per modificare queste liste sono spiegati in +@ref{Modifying alists}. Le proprietà dei grob devono essere +modificate con un comando @code{\override} dentro un blocco +@code{\score} o @code{\layout} e non in un blocco +@code{\paper}. + +L'esempio seguente illustra i due modi con cui si possono modificare +queste liste associative (alist). La prima dichiarazione trasforma un +elemento-valore singolarmente, mentre la seconda ridefinisce +completamente la proprietà: + +@example +\new Staff \with @{ + \override VerticalAxisGroup.default-staff-staff-spacing.basic-distance = #10 +@} @{ @dots{} @} + +\new Staff \with @{ + \override VerticalAxisGroup.default-staff-staff-spacing = + #'((basic-distance . 10) + (minimum-distance . 9) + (padding . 1) + (stretchability . 10)) +@} @{ @dots{} @} +@end example + +Per cambiare le impostazioni di spaziatura globalmente, inserirle in +un blocco @code{\layout}: + +@example +\layout @{ + \context @{ + \Staff + \override VerticalAxisGroup.default-staff-staff-spacing.basic-distance = #10 + @} +@} +@end example + +Le impostazioni predefinite delle proprietà di spaziatura verticale dei +grob sono elencate in @rinternals{VerticalAxisGroup} e +@rinternals{StaffGrouper}. Le modifiche predefinite con @code{\override} +per tipologie specifiche di linee che non sono righi sono elencate +nelle descrizioni del relativo contesto in @rinternals{Contexts}. + + +@subsubheading Proprietà del grob @code{VerticalAxisGroup} + +Le proprietà di @code{VerticalAxisGroup} sono solitamente modificate +con un @code{\override} nel livello @code{Staff} (o equivalente). + +@table @code +@item staff-staff-spacing + +Usata per determinare la distanza tra il rigo corrente e il rigo +inferiore nello stesso sistema, anche se tra i due si trovano una o +più linee che non sono righi (come @code{Lyrics}). +Non è applicata all'ultimo rigo di un sistema. + +Inizialmente, la proprietà @code{staff-staff-spacing} di un +@code{VerticalAxisGroup} è una funzione Scheme che applica le +proprietà di @code{StaffGrouper} se il rigo fa parte di un +gruppo, o la proprietà @code{default-staff-staff-spacing} del rigo +altrimenti. Questo permette ai righi di essere spaziati diversamente +quando sono raggruppati. Per ottenere una spaziatura uniforme +indipendentemente dal raggruppamento, questa funzione può essere +sostituita da un alist di spaziatura flessibile, usando la forma +di override che ridefinisce completamente la variabile, come mostrato +prima. + +@item default-staff-staff-spacing +Un alist di spaziatura flessibile che definisce la proprietà +@code{staff-staff-spacing} usata per i righi isolati, a meno che +@code{staff-staff-spacing} non sia stata impostata esplicitamente +con un @code{\override}. + +@item staff-affinity +La direzione del rigo da usare per spaziare la linea che non è un rigo. +Le opzioni sono @code{UP} (su), @code{DOWN} (giù) e +@code{CENTER} (centro). Se impostata su @code{CENTER}, la linea +fuori dal rigo si troverà in un punto equidistante tra i due righi +più vicini su qualunque lato, a meno che delle collisioni o altre +costrizioni di spazio non lo impediscano. Linee (che non sono righi) +adiacenti dovrebbero avere un valore di @code{staff-affinity} che +non cresce: per esempio, una linea che non è un rigo impostata su +@code{UP} non deve seguire immediatamente una linea impostata su +@code{DOWN}. Linee che non sono righi in cima a un sistema devono usare +@code{DOWN}; quelle in fondo @code{UP}. Impostando +@code{staff-affinity} per un rigo, questo sarà trattato come +una linea che non è un rigo. Impostando @code{staff-affinity} su @code{#f}, +una linea che non è un rigo sarà trattata come un rigo. Impostando +@code{staff-affinity} su @code{UP}, @code{CENTER} o @code{DOWN}, +un rigo verrà spaziato come se fosse una linea che non è un rigo. + +@item nonstaff-relatedstaff-spacing +La distanza fra la linea (che non è un rigo) corrente e il rigo più +vicino nella direzione di @code{staff-affinity}, se non ci sono +linee che non sono righi tra le due e @code{staff-affinity} è +impostato su @code{UP} o @code{DOWN}. Se @code{staff-affinity} è +impostato su @code{CENTER}, viene usato @code{nonstaff-relatedstaff-spacing} +per i righi più vicini su @emph{entrambi} i lati, anche se appaiono +altre linee tra quella corrente e uno qualsiasi dei righi. Ciò +significa che il posizionamento di una linea dipende sia dai righi +che dalle linee circostanti. Impostando la proprietà @code{stretchability} +di uno di questi tipi di spaziatura su un piccolo valore, quella spaziatura +sarà dominante. Impostando @code{stretchability} su un grande valore, quella +spaziatura avrà poco effetto. + +@item nonstaff-nonstaff-spacing +La distanza fra la linea (che non è un rigo) corrente e quella successiva +nella direzione di @code{staff-affinity}, se entrambe sono sullo stesso +lato del rigo in questione e se @code{staff-affinity} è impostata su +@code{UP} o @code{DOWN}. + +@item nonstaff-unrelatedstaff-spacing +La distanza fra la linea (che non è un rigo) corrente e il rigo nella +direzione opposta rispetto a @code{staff-affinity}, se non ci sono +altre linee tra i due e se @code{staff-affinity} è impostato su +@code{UP} o @code{DOWN}. Ciò può servire, per esempio, a imporre +un padding minimo tra una linea @code{Lyrics} e il rigo al quale non +appartiene. +@end table + + +@subsubheading Proprietà del grob @code{StaffGrouper} + +Le proprietà di @code{StaffGrouper} sono solitamente modificate con un +@code{\override} nel livello @code{StaffGroup} (o livello equivalente). + +@table @code +@item staff-staff-spacing +La distanza tra righi consecutivi del gruppo di righi +corrente. La proprietà @code{staff-staff-spacing} del grob +@code{VerticalAxisGroup} di un singolo rigo può essere +sovrascritta con varie impostazioni di spaziatura per quel rigo. + +@item staffgroup-staff-spacing +La distanza tra l'ultimo rigo del gruppo di righi corrente e +il rigo immediatamente successivo nello stesso sistema, anche se +tra i due righi ci sono una o più linee che non sono righi (come +@code{Lyrics}). Non è applicata al rigo inferiore di un sistema. La +proprietà @code{staff-staff-spacing} del grob @code{VerticalAxisGroup} +di un singolo rigo può essere sovrascritta con varie impostazioni di +spaziatura per quel rigo. +@end table + +@seealso +Guida alla notazione: +@ref{Flexible vertical spacing paper variables,,Variabili @code{@bs{}paper} della spaziatura verticale flessibile}, +@ref{Modifying alists}. + +File installati: +@file{ly/engraver-init.ly}, +@file{scm/define-grobs.scm}. + +Guida al funzionamento interno: +@rinternals{Contexts}, +@rinternals{VerticalAxisGroup}, +@rinternals{StaffGrouper}. + + +@node Spaziatura dei righi non raggruppati +@unnumberedsubsubsec Spaziatura dei righi non raggruppati +@translationof Spacing of ungrouped staves + +I @emph{righi} (come @code{Staff}, @code{DrumStaff}, +@code{TabStaff}, etc.) sono contesti che possono contenere uno o +più contesti voce, ma non possono contenere altri righi. + +Le seguenti proprietà influenzano la spaziatura di righi @emph{non raggruppati}: + +@itemize +@item Proprietà di @code{VerticalAxisGroup}: +@itemize +@item @code{default-staff-staff-spacing} +@item @code{staff-staff-spacing} +@end itemize +@end itemize + +Queste proprietà del grob sono state descritte una a una in precedenza; vedi +@ref{Within-system spacing properties}. + +Altre proprietà entrano in gioco per i righi che sono parte di un gruppo; +vedi @ref{Spacing of grouped staves}. + +L'esempio seguente mostra come la proprietà @code{default-staff-staff-spacing} +possa influenzare la spaziatura di righi non raggruppati. Le stesse +modifiche applicate a @code{staff-staff-spacing} avrebbero lo stesso +effetto, ma verrebbero applicate anche nel caso in cui i righi siano +combinati in uno o più gruppi. + +@lilypond[verbatim,quote,staffsize=16] +\layout { + \context { + \Staff + \override VerticalAxisGroup.default-staff-staff-spacing = + #'((basic-distance . 8) + (minimum-distance . 7) + (padding . 1)) + } +} + +<< + % Questa nota molto bassa ha bisogno di più spazio di quanto 'basic-distance + % possa fornirne, dunque la distanza tra questo rigo e quello successivo + % è determinato da 'padding. + \new Staff { b,2 r | } + + % Qui 'basic-distance fornisce abbastanza spazio, e non c'è bisogno + % di comprimere lo spazio (verso 'minimum-distance) per far spazio + % per qualcos'altro sulla pagina, dunque la distanza tra questo + % rigo e quello successivo è determinato da 'basic-distance. + \new Staff { \clef bass g2 r | } + + % Impostando 'padding su un valore negativo, è possibile far sì che + % i righi entrino in collisione. Il più basso valore accettabile per + % 'basic-distance è 0. + \new Staff \with { + \override VerticalAxisGroup.default-staff-staff-spacing = + #'((basic-distance . 3.5) + (padding . -10)) + } { \clef bass g2 r | } + \new Staff { \clef bass g2 r | } +>> +@end lilypond + +@seealso +File installati: +@file{scm/define-grobs.scm}. + +Frammenti: +@rlsr{Spacing}. + +Guida al funzionamento interno: +@rinternals{VerticalAxisGroup}. + + +@node Spaziatura dei righi raggruppati +@unnumberedsubsubsec Spaziatura dei righi raggruppati +@translationof Spacing of grouped staves + +Nelle partiture orchestrali e in alte grosse partiture, di norma i righi +vengono raggruppati. Lo spazio tra i gruppi è più ampio dello spazio +tra i righi dello stesso gruppo. + +I @emph{gruppi di righi} (come @code{StaffGroup}, @code{ChoirStaff}, +etc.) sono contesti che possono contenere uno o più righi +simultaneamente. + +Le seguenti proprietà influenzano la spaziatura dei righi nei gruppi: + +@itemize +@item Proprietà di @code{VerticalAxisGroup}: +@itemize +@item @code{staff-staff-spacing} +@end itemize +@item Proprietà di @code{StaffGrouper}: +@itemize +@item @code{staff-staff-spacing} +@item @code{staffgroup-staff-spacing} +@end itemize +@end itemize + +Queste proprietà dei grob sono descritte una a una in una sezione precedente; vedi +@ref{Within-system spacing properties}. + +L'esempio seguente mostra come le proprietà del grob +@code{StaffGrouper} possano influenzare la spaziatura dei righi raggruppati: + +@lilypond[verbatim,quote,staffsize=16] +\layout { + \context { + \Score + \override StaffGrouper.staff-staff-spacing.padding = #0 + \override StaffGrouper.staff-staff-spacing.basic-distance = #1 + } +} + +<< + \new PianoStaff \with { + \override StaffGrouper.staffgroup-staff-spacing.basic-distance = #20 + } << + \new Staff { c'1 } + \new Staff { c'1 } + >> + + \new StaffGroup << + \new Staff { c'1 } + \new Staff { c'1 } + >> +>> +@end lilypond + +@seealso +File installati: +@file{scm/define-grobs.scm}. + +Frammenti: +@rlsr{Spacing}. + +Guida al funzionamento interno: +@rinternals{VerticalAxisGroup}, +@rinternals{StaffGrouper}. + + +@node Spaziatura delle linee che non sono righi +@unnumberedsubsubsec Spaziatura delle linee che non sono righi +@translationof Spacing of non-staff lines + +Le @emph{linee che non sono righi} (come @code{Lyrics}, @code{ChordNames}, +etc.) sono contesti i cui oggetti della formattazione sono disposti come se +fossero su dei righi (ovvero su linee orizzontali all'interno dei sistemi). +Precisamente, le linee che non sono righi sono contesti non-rigo che contengono +l'incisore @rinternals{Axis_group_engraver}. + +Le seguenti proprietà influenzano la spaziatura delle linee che non sono righi: + +@itemize +@item Proprietà di @code{VerticalAxisGroup}: +@itemize +@item @code{staff-affinity} +@item @code{nonstaff-relatedstaff-spacing} +@item @code{nonstaff-nonstaff-spacing} +@item @code{nonstaff-unrelatedstaff-spacing} +@end itemize +@end itemize + +Queste proprietà del grob sono descritte una a una in una sezione +precedente, vedi @ref{Within-system spacing properties}. + +L'esempio seguente mostra come la proprietà +@code{nonstaff-nonstaff-spacing} influenza la spaziatura di linee +che non sono un rigo consecutive. Impostando l'elemento +@code{stretchability} su un valore molto alto, il testo vocale +riesce a allungarsi molto più del solito: + +@lilypond[verbatim,quote,staffsize=16] +\layout { + \context { + \Lyrics + \override VerticalAxisGroup.nonstaff-nonstaff-spacing.stretchability = #1000 + } +} + +\new StaffGroup +<< + \new Staff \with { + \override VerticalAxisGroup.staff-staff-spacing = #'((basic-distance . 30)) + } { c'1 } + \new Lyrics \with { + \override VerticalAxisGroup.staff-affinity = #UP + } \lyricmode { up } + \new Lyrics \with { + \override VerticalAxisGroup.staff-affinity = #CENTER + } \lyricmode { center } + \new Lyrics \with { + \override VerticalAxisGroup.staff-affinity = #DOWN + } \lyricmode { down } + \new Staff { c'1 } +>> +@end lilypond + +@seealso +File installati: +@file{ly/engraver-init.ly}, +@file{scm/define-grobs.scm}. + +Frammenti: +@rlsr{Spacing}. + +@c @lsr{spacing,page-spacing.ly}, +@c @lsr{spacing,alignment-vertical-spacing.ly}. + +Guida al funzionamento interno: +@rinternals{Contexts}, +@rinternals{VerticalAxisGroup}. + + +@node Posizionamento esplicito di righi e sistemi +@subsection Posizionamento esplicito di righi e sistemi +@translationof Explicit staff and system positioning + +Un modo per comprendere i meccanismi di spaziatura verticale +appena spiegati è di considerarli come un insieme di impostazioni +che regolano la quantità di @emph{padding} verticale tra righi +e tra sistemi. + +È possibile gestire la spaziatura verticale in un modo diverso +usando @code{NonMusicalPaperColumn.line-break-system-details}. +Mentre i meccanismi di spaziatura verticale flessibile specificano +il padding verticale, @code{NonMusicalPaperColumn.line-break-system-details} +indica precisamente le posizioni verticali esatte sulla pagina. + +@code{NonMusicalPaperColumn.line-break-system-details} accetta una +lista associativa di tre diverse impostazioni: + +@itemize +@item @code{X-offset} +@item @code{Y-offset} +@item @code{alignment-distances} +@end itemize + +Le modifiche del grob con @code{\override}, incluse quelle per @code{NonMusicalPaperColumn} +come nell'esempio successivo, possono trovarsi in uno di questi tre diversi +punti del file di input: + +@itemize +@item direttamente in mezzo alle note +@item in un blocco @code{\context} +@item nel blocco @code{\with} +@end itemize + +Quando si modifica @code{NonMusicalPaperColumn}, si usa il solito +comando @code{\override} nei blocchi @code{\context} e nel blocco +@code{\with}. Invece quando si modifica +@code{NonMusicalPaperColumn} in mezzo alle note, +si usa il comando speciale @code{\overrideProperty}. Ecco alcuni +esempi di modifiche di @code{NonMusicalPaperColumn} col comando +speciale @code{\overrideProperty}: + +@example +\overrideProperty NonMusicalPaperColumn.line-break-system-details + #'((X-offset . 20)) + +\overrideProperty NonMusicalPaperColumn.line-break-system-details + #'((Y-offset . 40)) + +\overrideProperty NonMusicalPaperColumn.line-break-system-details + #'((X-offset . 20) + (Y-offset . 40)) + +\overrideProperty NonMusicalPaperColumn.line-break-system-details + #'((alignment-distances . (15))) + +\overrideProperty NonMusicalPaperColumn.line-break-system-details + #'((X-offset . 20) + (Y-offset . 40) + (alignment-distances . (15))) +@end example + +Per comprendere come funziona ognuna di queste impostazioni, iniziamo +vedendo un esempio che non contiene alcuna modifica. + +@c \book { } is required in these examples to ensure the spacing +@c overrides can be seen between systems. -np + +@lilypond[verbatim,quote,staffsize=16] +\header { tagline = ##f } +\paper { left-margin = 0\mm } +\book { + \score { + << + \new Staff << + \new Voice { + s1*5 \break + s1*5 \break + s1*5 \break + } + \new Voice { \repeat unfold 15 { c'4 c' c' c' } } + >> + \new Staff { + \repeat unfold 15 { d'4 d' d' d' } + } + >> + } +} +@end lilypond + +Questa partitura isola l'informazione sulle interruzioni di linea e di pagina +in una voce apposita. Questa tecnica di creare una voce per le interruzioni +permette di tenere la formattazione separata dalla musica via via che il +nostro esempio diventa più complicato. Vedi anche @ref{Breaks}. + +Usando comandi @code{\break} espliciti, la musica viene divisa proporzionalmente +in cinque misure per linea. La spaziatura verticale è quella predefinita di +LilyPond ma il punto di inizio verticale di ogni sistema è impostato +esplicitamente con la coppia @code{Y-offset} dell'attributo +@code{line-break-system-details} del grob @code{NonMusicalPaperColumn}: + +@lilypond[verbatim,quote,staffsize=16] +\header { tagline = ##f } +\paper { left-margin = 0\mm } +\book { + \score { + << + \new Staff << + \new Voice { + \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details + #'((Y-offset . 0)) + s1*5 \break + \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details + #'((Y-offset . 40)) + s1*5 \break + \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details + #'((Y-offset . 60)) + s1*5 \break + } + \new Voice { \repeat unfold 15 { c'4 c' c' c' } } + >> + \new Staff { + \repeat unfold 15 { d'4 d' d' d' } + } + >> + } +} +@end lilypond + +Nota che @code{line-break-system-details} accetta una lista associativa di +molti valori, ma ne abbiamo impostato solo uno in questo esempio. Nota +anche che la proprietà @code{Y-offset} qui determina la posizione verticale +esatta sulla pagina in cui ogni nuovo sistema verrà visualizzato. + +Ora che abbiamo impostato esplicitamente il punto di inizio verticale di +ogni sistema, possiamo impostare manualmente anche le distanze verticali +tra i righi. Per farlo usiamo la sottoproprietà @code{alignment-distances} +di @code{line-break-system-details}. + +@lilypond[verbatim,quote,staffsize=16] +\header { tagline = ##f } +\paper { left-margin = 0\mm } +\book { + \score { + << + \new Staff << + \new Voice { + \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details + #'((Y-offset . 20) + (alignment-distances . (10))) + s1*5 \break + \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details + #'((Y-offset . 60) + (alignment-distances . (15))) + s1*5 \break + \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details + #'((Y-offset . 85) + (alignment-distances . (20))) + s1*5 \break + } + \new Voice { \repeat unfold 15 { c'4 c' c' c' } } + >> + \new Staff { + \repeat unfold 15 { d'4 d' d' d' } + } + >> + } +} +@end lilypond + +Nota che qui assegnamo due valori diversi all'attributo +@code{line-break-system-details} del grob +@code{NonMusicalPaperColumn}. Sebbene l'attributo alist +@code{line-break-system-details} accetti molti altri parametri di +spaziatura (inclusa, per esempio, una coppia corrispondente +di @code{X-offset}), è sufficiente impostare soltanto le coppie @code{Y-offset} +e @code{alignment-distances} per regolare il punto di inizio verticale di +ogni sistema e ogni rigo. Infine nota che @code{alignment-distances} +specifica il posizionamento verticale dei righi ma non dei gruppi di righi. + +@lilypond[verbatim,quote,staffsize=16] +\header { tagline = ##f } +\paper { left-margin = 0\mm } +\book { + \score { + << + \new Staff << + \new Voice { + \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details + #'((Y-offset . 0) + (alignment-distances . (30 10))) + s1*5 \break + \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details + #'((Y-offset . 60) + (alignment-distances . (10 10))) + s1*5 \break + \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details + #'((Y-offset . 100) + (alignment-distances . (10 30))) + s1*5 \break + } + \new Voice { \repeat unfold 15 { c'4 c' c' c' } } + >> + \new StaffGroup << + \new Staff { \repeat unfold 15 { d'4 d' d' d' } } + \new Staff { \repeat unfold 15 { e'4 e' e' e' } } + >> + >> + } +} +@end lilypond + +Alcuni punti da considerare: + +@itemize +@item Quando si usa @code{alignment-distances}, il testo vocale e altre linee +che non sono righi non contano come rigo. + +@item Le unità dei numeri assegnati a @code{X-offset}, +@code{Y-offset} e @code{alignment-distances} sono interpretati come +multipli della distanza tra linee del rigo adiacenti. Valori positivi +spostano in su righi e testo, valori negativi li spostano in giù. + +@item Dato che le impostazioni di @code{NonMusicalPaperColumn.line-break-system-details} +illustrate qui permettono il posizionamento di righi e sistemi ovunque +sulla pagina, è possibile violare i confini del foglio o dei margini o +perfino sovrapporre righi e sistemi uno sopra l'altro. Ciò può essere +evitato assegnando valori ragionevoli a queste diverse impostazioni. +@end itemize + +@seealso +Frammenti: +@rlsr{Spacing}. + + +@node Elusione delle collisioni verticali +@subsection Elusione delle collisioni verticali +@translationof Vertical collision avoidance + +@funindex outside-staff-priority +@funindex outside-staff-padding +@funindex outside-staff-horizontal-padding + +Intuitivamente, ci sono alcuni oggetti della notazione musicale che +appartengono al rigo e altri che devono essere disposti fuori dal +rigo. Gli oggetti esterni al rigo comprendono i numeri di chiamata, +il testo e le dinamiche (d'ora in avanti tutti questi elementi saranno +chiamati oggetti esterni al rigo). La regola di LilyPond per il +posizionamento verticale degli oggetti esterni al rigo è di disporli +il più vicino possibile al rigo ma non così vicino da farli collidere +con un altro oggetto. + +LilyPond usa la proprietà @code{outside-staff-priority} per determinare +se un grob è un oggetto fuori dal rigo: se @code{outside-staff-priority} +è un numero, il grob è un oggetto esterno al rigo. @code{outside-staff-priority} +indica a LilyPond anche in quale ordine disporre gli oggetti. + +LilyPond posiziona prima tutti gli oggetti che non sono esterni al +rigo. Quindi ordina gli oggetti esterni al rigo in base al loro valore +di @code{outside-staff-priority} (in ordine crescente). Uno per volta, LilyPond +prende gli oggetti esterni al rigo e li dispone in modo che non entrino in +collisione con alcun oggetto che sia già stato disposto. Ovvero, se due +grob esterni al rigo si contendono lo stesso spazio, quello col valore +di @code{outside-staff-priority} più basso sarà posto più vicino al rigo. + +Un elenco delle proprietà esterne al rigo si trova in +@rlearning{La proprietà outside-staff-priority}. + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4_"Testo"\pp + r2. + \once \override TextScript.outside-staff-priority = #1 + c4_"Testo"\pp % stavolta il testo sarà più vicino al rigo + r2. + % impostando outside-staff-priority su un non-numero, + % disabilitiamo l'elusione automatica delle collisioni + \once \override TextScript.outside-staff-priority = ##f + \once \override DynamicLineSpanner.outside-staff-priority = ##f + c4_"Testo"\pp % qui entrano in collisione +} +@end lilypond + +Il padding verticale intorno agli oggetti esterni al rigo +può essere regolato con @code{outside-staff-padding}. + +@lilypond[quote,ragged-right,verbatim,staffsize=18] +\relative { + \once \override TextScript.outside-staff-padding = #0 + a'4-"outside-staff-padding = #0" + \once \override TextScript.outside-staff-padding = #3 + d-"outside-staff-padding = #3" + c-"outside-staff-padding predefinito" + b-"outside-staff-padding predefinito" + R1 +} +@end lilypond + + +Per impostazione predefinita, gli oggetti esterni al rigo sono disposti +in modo da evitare la collisione orizzontale con grob posizionati +precedentemente. Ciò può portare a situazioni in cui gli oggetti +sono posizionati uno vicino all'altro orizzontalmente. +Come è dimostrato nell'esempio successivo, impostando @code{outside-staff-horizontal-padding} +si aumenta la spaziatura orizzontale richiesta e in questo caso si sposta +in su il testo per impedire che si avvicini troppo ai tagli addizionali. + +@lilypond[quote,ragged-right,verbatim] +\relative { + c''4^"Parola" c c''2 + R1 + \once \override TextScript.outside-staff-horizontal-padding = #1 + c,,4^"Parola" c c''2 +} +@end lilypond + +@seealso +Frammenti: +@rlsr{Spacing}. + + +@node Spaziatura orizzontale +@section Spaziatura orizzontale +@translationof Horizontal spacing + +@cindex spaziatura orizzontale +@cindex orizzontale, spaziatura + +@menu +* Panoramica sulla spaziatura orizzontale:: +* Nuova spaziatura nel corso di un brano:: +* Modifica della spaziatura orizzontale:: +* Larghezza della linea:: +* Notazione proporzionale:: +@end menu + + +@node Panoramica sulla spaziatura orizzontale +@subsection Panoramica sulla spaziatura orizzontale +@translationof Horizontal spacing overview + +Il motore della spaziatura traduce le differenze delle durate delle +note in distanze allungabili (@q{springs}) di diversa lunghezza. Durate +più lunghe occupano più spazio, quelle più brevi ne occupano meno. +Le durate più brevi occupano una quantità fissa di spazio (regolata da +@code{shortest-duration-space} nell'oggetto @rinternals{SpacingSpanner}). +Più lunga è la durata, più spazio occupa: raddoppiando una durata +si aggiunge spazio alla nota di una quantità pari al valore di +@code{spacing-increment}. + +Per esempio, il brano seguente contiene molte minime, semiminime e +crome; la croma (1/8) è seguita da 1 Larghezza della Testa di Nota (LTN). +La semiminima (1/4) è seguita da 2 LTN, la minima (1/2) da 3 LTN, etc. + +@lilypond[quote,verbatim] +\relative c' { + c2 c4. c8 + c4. c8 c4. c8 + c8 c c4 c c +} +@end lilypond + +Solitamente, @code{spacing-increment} è impostato su 1.2 di spazio rigo, che +equivale all'incirca alla larghezza della testa di nota, e +@code{shortest-duration-space} è impostato su 2.0, che significa che +la nota più breve occupa 2.4 di spazio rigo (2 volte @code{spacing-increment}) +di spazio orizzontale. Questo spazio è calcolato dal margine sinistro +del simbolo, dunque le note più brevi sono generalmente seguite da +un LTN di spazio. + +Se si seguisse esattamente la procedura descritta, aggiungendo una +sola biscroma (1/32) a un brano che usa solo crome e semicrome, la +spaziatura orizzontale dell'intero brano sarebbe troppo larga. Infatti +la nota più breve non è più una semicroma ma una biscroma, aggiungendo +quindi 1 LTN a ogni nota. Per impedire ciò, la durata più breve per +la spaziatura non è la nota più breve, bensì la che ricorre più +frequentemente nel brano. + +La durata più breve più comune viene individuata nel modo seguente. In ogni +misura viene determinata la durata più breve e quella più frequente viene +scelta come base per la spaziatura, con la condizione che tale durata debba +essere sempre uguale o inferiore a una nota di un ottavo. + +Tali durate possono anche essere personalizzate. Impostando +@code{common-shortest-duration} in @rinternals{SpacingSpanner}, si +imposta la durata di base per la spaziatura. La durata massima per +essa (solitamente un ottavo), si imposta con @code{base-shortest-duration}. + +@funindex common-shortest-duration +@funindex base-shortest-duration +@funindex stem-spacing-correction +@funindex spacing + +Note ancora più brevi della nota più breve più comune sono seguite +da uno spazio proporzionale alla loro durata rispetto a essa. Dunque +se aggiungessimo solo alcuni sedicesimi all'esempio precedente, sarebbero +seguiti dalla metà di LTN: + +@lilypond[quote,verbatim] +\relative { c''2 c4. c8 | c4. c16[ c] c4. c8 | c8 c c4 c c } +@end lilypond + + +Come è spiegato nel saggio @emph{Essay on automated music engraving}, le +direzioni del gambo influenzano la spaziatura (vedi @ressay{Optical spacing}) e +possono essere aggiustate usando la proprietà @code{stem-spacing-correction} +dell'oggetto @rinternals{NoteSpacing} (che sono generati per ogni +contesto @rinternals{Voice}. + +L'oggetto @code{StaffSpacing} (generato nel contesto @rinternals{Staff}) +contiene la stessa proprietà per regolare la spaziatura tra gambo e stanghetta. + +L'esempio seguente mostra tutto questo: una volta con le impostazioni +predefinite e una volta con un aggiustamento esagerato: + +@lilypond[quote,ragged-right] +\fixed c' { + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | + \override Staff.NoteSpacing.stem-spacing-correction = #1.5 + \override Staff.StaffSpacing.stem-spacing-correction = #1.5 + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | +} +@end lilypond + +LilyPond supporta la notazione proporzionale, vedi @ref{Proportional notation}. + +@seealso +Essay on automated music engraving: +@ressay{Optical spacing}. + +Frammenti: +@rlsr{Spacing}. + +Guida al funzionamento interno: +@rinternals{SpacingSpanner}, +@rinternals{NoteSpacing}, +@rinternals{StaffSpacing}, +@rinternals{NonMusicalPaperColumn}. + +@knownissues +Non esiste un modo semplice per modificare manualmente la spaziatura. Per +aggirare il problema si può inserire dell'ulteriore spazio in una partitura, +regolando il valore di padding di quanto è necessario: + +@example + \override Score.NonMusicalPaperColumn.padding = #10 +@end example + +Non esiste alcun trucco per diminuire la quantità di spazio. + + +@c traduzione del titolo non letterale ma più chiara +@node Nuova spaziatura nel corso di un brano +@subsection Nuova spaziatura nel corso di un brano +@translationof New spacing section + +@funindex \newSpacingSection +@cindex nuova spaziatura nel corso di un brano +@cindex spaziatura nuova nel corso di un brano +@cindex note, spaziatura orizzontale + +Nuove sezioni con parametri di spaziatura diversi possono essere iniziati +col comando @code{\newSpacingSection}. Ciò può essere utile per sezioni +con nozioni diverse di note @q{lunghe} e note @q{brevi}. Il comando +@code{\newSpacingSection} crea un nuovo oggetto @code{SpacingSpanner} in +quel momento musicale. + +Nell'esempio seguente, il cambio di indicazione di tempo introduce una +nuova sezione, e i sedicesimi hanno automaticamente una spaziatura +un po' più larga. + +@lilypond[verbatim,quote] +\relative c' { + \time 2/4 + c4 c8 c + c8 c c4 c16[ c c8] c4 + \newSpacingSection + \time 4/16 + c16[ c c8] +} +@end lilypond + +Se gli aggiustamenti automatici della spaziatura non producono la +spaziatura richiesta, si possono applicare degli @code{\override} +manuali alle sue proprietà. Questi devono essere applicati nello +stesso momento musicale del comando @code{\newSpacingSection} stesso e +avranno effetto sulla spaziatura di tutta la musica seguente finché +le proprietà non vengono cambiate in una nuova sezione. Per esempio: + +@lilypond[verbatim,quote] +\relative c' { + \time 4/16 + c16[ c c8] + \newSpacingSection + \override Score.SpacingSpanner.spacing-increment = #2 + c16[ c c8] + \newSpacingSection + \revert Score.SpacingSpanner.spacing-increment + c16[ c c8] +} +@end lilypond + + +@seealso +Frammenti: +@rlsr{Spacing}. + +Guida al funzionamento interno: +@rinternals{SpacingSpanner}. + + +@node Modifica della spaziatura orizzontale +@subsection Modifica della spaziatura orizzontale +@translationof Changing horizontal spacing + +La spaziatura orizzontale può essere modificata tramite la proprietà +@code{base-shortest-duration}. Nel prossimo esempio confrontiamo +la stessa musica, prima senza cambiare la proprietà e poi cambiandola. +Valori più grandi di @code{ly:make-moment} produrranno musica più densa. +Nota che @code{ly:make-moment} constituisce una durata, dunque +@code{1 4} è una durata più lunga di @code{1 16}. + +@lilypond[verbatim,line-width=12\cm] +\score { + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + g4 e e2 | f4 d d2 | c4 e g g | c,1 | + d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | + g4 e e2 | f4 d d2 | c4 e g g | c,1 | + } +} +@end lilypond + +@lilypond[verbatim,line-width=12\cm] +\score { + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + g4 e e2 | f4 d d2 | c4 e g g | c,1 | + d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | + g4 e e2 | f4 d d2 | c4 e g g | c,1 | + } + \layout { + \context { + \Score + \override SpacingSpanner.base-shortest-duration = #(ly:make-moment 1/16) + } + } +} +@end lilypond + + +@snippets + +L'impostazione predefinita prevede che la spaziatura nei gruppi irregolari +dipenda da vari fattori diversi dalla durata (come alterazioni, cambi di +chiave, etc). Per ignorare tali simboli e forzare la spaziatura perché +sia uniforme, usare @code{Score.SpacingSpanner.uniform-stretching}. Questa +proprietà può essere modificata soltanto all'inizio di una partitura: + +@lilypond[quote,ragged-right,verbatim] +\score { + << + \new Staff { + \tuplet 5/4 { c8 c c c c } c8 c c c + } + \new Staff { + c8 c c c \tuplet 5/4 { c8 c c c c } + } + >> + \layout { + \context { + \Score + \override SpacingSpanner.uniform-stretching = ##t + } + } +} +@end lilypond + +Se si imposta @code{strict-note-spacing}, la spaziatura tra le note non tiene +conto di chiavi, stanghette e abbellimenti: + +@lilypond[quote,ragged-right,fragment,verbatim] +\override Score.SpacingSpanner.strict-note-spacing = ##t +\new Staff \relative { + c''8[ c \clef alto c \grace { c16 c } c8 c c] c32[ c] } +@end lilypond + +@seealso +Frammenti: +@rlsr{Spacing}. + + +@node Larghezza della linea +@subsection Larghezza della linea +@translationof Line width + +@cindex interruzioni di pagina +@cindex pagina, interruzioni + +@funindex indent +@funindex line-width +@funindex ragged-right +@funindex ragged-last + +@c Although line-width can be set in \layout, it should be set in paper +@c block, to get page layout right. +@c Setting indent in \paper block makes not much sense, but it works. + +@c Bit verbose and vague, use examples? +Le impostazioni fondamentali che influenzano la spaziatura sono @code{indent} e +@code{line-width}, impostate nel blocco @code{\layout}. Regolano l'indentazione +della prima linea musicale e la lunghezza delle linee. + +Se @code{ragged-right} è impostato su vero nel blocco @code{\layout}, i sistemi +terminano alla loro naturale lunghezza orizzontale, invece di essere espansi +orizzontalmente per riempire tutta la linea. Ciò è utile in caso di brevi +frammenti e per verificare quanto è compatta la spaziatura naturale. L'impostazione +predefinita è solitamente falso, ma se la partitura ha un solo sistema il +valore predefinito è vero. + +@cindex formattazione della pagina +@cindex spaziatura verticale +@cindex verticale, spaziatura + +L'opzione @code{ragged-last} è simile a @code{ragged-right}, ma ha effetto +soltanto sull'ultima linea del brano. Nessune restrizioni vengono poste su +quella linea. Il risultato è simile alla formattazione dei paragrafi di testo. +In un paragrafo l'ultima linea occupa la sua naturale lunghezza orizzontale. +@c Note that for text there are several options for the last line. +@c While Knuth TeX uses natural length, lead typesetters use the same +@c stretch as the previous line. eTeX uses \lastlinefit to +@c interpolate between both these solutions. + +@example +\layout @{ + indent = #0 + line-width = #150 + ragged-last = ##t +@} +@end example + +@seealso +Frammenti: +@rlsr{Spacing}. + + +@node Notazione proporzionale +@subsection Notazione proporzionale +@translationof Proportional notation + +LilyPond supporta la notazione proporzionale, un tipo di spaziatura orizzontale +in cui ogni nota occupa una quantità di spazio orizzontale esattamente +equivalente alla sua durata musicale. Questo tipo di spaziatura proporzionale +può essere paragonata alla spaziatura orizzontale su carta quadrettata. Alcune +partiture della fine del ventesimo secolo e dell'inizio del ventunesimo usano +la notazione proporzionale per chiarire relazioni ritmiche complesse o per +agevolare il posizionamento della linea del tempo o di altri elementi +grafici direttamente nella partitura. + +LilyPond supporta cinque diverse impostazioni per la notazione proporzionale, +che possono essere usate insieme o da sole: + +@itemize +@item @code{proportionalNotationDuration} +@item @code{uniform-stretching} +@item @code{strict-note-spacing} +@item @code{\remove "Separating_line_group_engraver"} +@item @code{\override PaperColumn.used = ##t} +@end itemize + +Nell'esempio seguente analizziamo queste cinque diverse impostazioni di +notazione proporzionale e valutiamo come esse interagiscono tra loro. + +Iniziamo con l'esempio seguente di una misura, che usa la spaziatura +classica con la giustificazione del rigo disattivata. + +@c The initial pitch is not necessary as long as RhythmicStaff is +@c not preceded by other material in the score, but we don't want +@c to explain that. +@lilypond[quote,verbatim,ragged-right] +\score { + << + \new RhythmicStaff { + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } + } + >> +} +@end lilypond + +La minima all'inizio della misura occupa uno spazio molto inferiore alla metà +dello spazio orizzontale della misura. Ugualmente, i sedicesimi e le quintine +di sedicesimi alla fine della battuta insieme occupano molto più spazio della +metà dello spazio orizzontale della misura. + +Nell'incisione tipografica classica, questa spaziatura è solitamente proprio +ciò che si desidera, perché è possibile prendere in prestito dello spazio +orizzontale dalla minima e economizzare lo spazio orizzontale complessivo +della misura. + +D'altra parte, se vogliamo inserire una linea del tempo con tacche o altri +elementi grafici sopra o sotto la partitura, abbiamo bisogno della notazione +proporzionale. Per attivarla si usa l'impostazione proportionalNotationDuration. + +@lilypond[quote,verbatim,ragged-right] +\score { + << + \new RhythmicStaff { + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } + } + >> + \layout { + \context { + \Score + proportionalNotationDuration = #(ly:make-moment 1/20) + } + } +} +@end lilypond + +La minima all'inizio della misura e le note più veloci nella seconda +metà della misura ora occupano la stessa quantità di spazio orizzontale. +Potremmo inserire una linea del tempo con tacche o un'immagine +grafica sopra o sotto questo esempio. + +L'impostazione @code{proportionalNotationDuration} è un'impostazione di +contesto che si trova in @code{Score}. Ricordiamo che le impostazioni di +contesto possono apparire in tre luoghi del file di input: in un blocco +@code{\with}, in un blocco @code{\context} o direttamente in mezzo alle +note preceduta dal comando @code{\set}. Come per tutte le impostazioni di +contesto, l'utente può scegliere in quale di questi tre luoghi impostare +@code{proportionalNotationDuration}. + +L'impostazione @code{proportionalNotationDuration} prende un solo argomento, +che è la durata di riferimento in base alla quale tutta la musica verrà +spaziata. La funzione Scheme di LilyPond @code{make-moment} prende due +argomenti: un numeratore e un denominatore che insieme esprimono una qualche +frazione di una nota intera. La funzione di chiamata @code{(ly:make-moment 1/20)} +produce quindi una durata di riferimento di un ventesimo di nota. Sono ammessi +anche valori come @code{(ly:make-moment 1/16)}, @code{(ly:make-moment 1/8)} e +@code{(ly:make-moment 3/97)}. + +Come scegliamo la durata di riferimento corretta da passare a +@code{proportionalNotationDuration}? Solitamente attraverso un processo di +prova e errore, iniziando con una durata vicina alla più veloce (o piccola) +durata del brano. Durate di riferimento più piccole determinano una spaziatura +della musica più larga; quelle più grandi causano una spaziatura più stretta. + +@lilypond[quote,verbatim,ragged-right] +\score { + << + \new RhythmicStaff { + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } + } + >> + \layout { + \context { + \Score + proportionalNotationDuration = #(ly:make-moment 1/8) + } + } +} + +\score { + << + \new RhythmicStaff { + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } + } + >> + \layout { + \context { + \Score + proportionalNotationDuration = #(ly:make-moment 1/16) + } + } +} + +\score { + << + \new RhythmicStaff { + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } + } + >> + \layout { + \context { + \Score + proportionalNotationDuration = #(ly:make-moment 1/32) + } + } +} +@end lilypond + +Nota che una durata di riferimento troppo grande -- come la nota di +un ottavo, sopra -- determina una spaziatura della musica troppo stretta +e può causare collisioni tra le teste di nota. Fare attenzione anche al +fatto che la notazione proporzionale in generale occupa più spazio orizzontale +della spaziatura classica. Insomma, la spaziatura proporzionale fornisce +chiarezza ritmica al costo dello spazio orizzontale. + +Ora vediamo come spaziare in modo ottimale i gruppi irregolari sovrapposti. + +Iniziamo esaminando cosa succede al nostro esempio di partenza, con la +spaziatura classica, quando aggiungiamo un secondo rigo con un diverso +tipo di gruppo irregolare. + +@lilypond[quote,verbatim,ragged-right] +\score { + << + \new RhythmicStaff { + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } + } + \new RhythmicStaff { + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } + } + >> +} +@end lilypond + +La spaziatura è pessima perché le note del rigo inferiore spaziate a distanze +uguali non si allungano in modo uniforme. Le incisioni classiche contengono +pochissime terzine complesse e quindi le regole di incisione classica possono +generare questo tipo di risultato. Impostando @code{proportionalNotationDuration} +ciò viene corretto. + +@lilypond[quote,verbatim,ragged-right] +\score { + << + \new RhythmicStaff { + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } + } + \new RhythmicStaff { + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } + } + >> + \layout { + \context { + \Score + proportionalNotationDuration = #(ly:make-moment 1/20) + } + } +} +@end lilypond + +Ma se osserviamo con attenzione possiamo vedere che le note della seconda +metà della nonina hanno una spaziatura leggermente più larga delle note +della prima parte della nonina. Per assicurare un allungamento uniforme, +attiviamo @code{uniform-stretching}, una proprietà di +@code{SpacingSpanner}. + +@lilypond[quote,verbatim,ragged-right] +\score { + << + \new RhythmicStaff { + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } + } + \new RhythmicStaff { + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } + } + >> + \layout { + \context { + \Score + proportionalNotationDuration = #(ly:make-moment 1/20) + \override SpacingSpanner.uniform-stretching = ##t + } + } +} +@end lilypond + +Il nostro esempio di due righi ora ha una spaziatura esatta, le relazioni +ritmiche sono visivamente chiare e possiamo includere una linea del tempo +con tacche o altro elemento grafico, se lo vogliamo. + +Nota che la notazione proporzionale di LilyPond si aspetta che tutte le +partiture proporzionali impostino l'attributo 'uniform-stretching di +SpacingSpanner su @code{##t}. Impostare proportionalNotationDuration senza +impostare anche l'attributo 'uniform-stretching di SpacingSpanner su +@code{##t} farà sì, per esempio, che le pause invisibili occupino una quantità +scorretta di spazio orizzontale. + +SpacingSpanner è un grob astratto che si trova nel contesto Score. +Come per le impostazioni di proportionalNotationDuration, le modifiche +@code{\override} a SpacingSpanner si possono trovare in uno dei tre diversi +punti del file di input – nel blocco \with del brano, nel blocco \context +del brano o direttamente in mezzo alle note. + +Per impostazione predefinita, esiste un solo @code{SpacingSpanner} per +@code{Score}. Ciò significa che @code{uniform-stretching} è attivato o +disattivato per l'intera partitura. Possiamo tuttavia modificare tale +comportamento e attivare diverse funzionalità di spaziatura in punti +diversi del brano. Per farlo si usa il comando @code{\newSpacingSection}. +Maggiori informazioni in @ref{New spacing section}. + +Ora esaminiamo gli effetti dell'incisore @code{Separating_line_group_engraver} e +vediamo perché le partiture proporzionali solitamente tolgano questo incisore. +L'esempio seguente mostra che c'è un piccolo spazio @qq{introduttivo} proprio +prima della prima nota di ogni sistema. + +@lilypond[quote,verbatim,ragged-right] +\paper { + indent = #0 +} + +\new Staff { + c'1 + \break + c'1 +} +@end lilypond + + +L'ampiezza di questo spazio introduttivo è la stessa sia dopo un'indicazione di +tempo che dopo un'armatura di chiave o una chiave. +È l'incisore @code{Separating_line_group_engraver} a causare questo spazio. +Togliendolo lo spazio diventa zero. + +@lilypond[quote,verbatim,ragged-right] +\paper { + indent = #0 +} + +\new Staff \with { + \remove "Separating_line_group_engraver" +} { + c'1 + \break + c'1 +} +@end lilypond + +Nella notazione proporzionale gli elementi non musicali come le indicazioni di +tempo, le armature di chiave, le chiavi e le alterazioni sono problematiche. +Nessuna di queste infatti ha una durata ritmica, ma tutte occupano spazio +orizzontale. Questi problemi sono affrontati diversamente dalle varie +partiture proporzionali. + +È possibile evitare i problemi di spaziatura dovuti alle armature di +chiave semplicemente omettendole. Questa è un'opzione valida dato che +la maggior parte delle partiture proporzionali sono di musica contemporanea. +Lo stesso potrebbe valere per le indicazioni di tempo, specialmente per quelle +partiture che includono una linea del tempo o altri elementi grafici. Ma queste +partiture sono un'eccezione e la maggior parte delle partiture proporzionali +hanno almeno qualche indicazione di tempo. Le chiavi e le alterazioni sono +ancora più fondamentali. + +Dunque quali strategie adottare per spaziare elementi non musicali nel contesto +di musica proporzionale? Una valida opzione è la proprietà @code{strict-note-spacing} +di @code{SpacingSpanner}. Confrontiamo i seguenti due righi: + +@lilypond[quote,verbatim,ragged-right] +\new Staff { + \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) + c''8 8 8 \clef alto d'2 2 +} + +\new Staff { + \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) + \override Score.SpacingSpanner.strict-note-spacing = ##t + c''8 8 8 \clef alto d'2 2 +} +@end lilypond + +Entrambi sono proporzionali, ma la spaziatura del primo è troppo +larga a causa del cambio di chiave. La spaziatura del secondo +resta invece stretta, perché è attivato strict-note-spacing. +Attivando strict-note-spacing, la larghezza di indicazioni di tempo, +armature di chiave, chiavi e alterazioni non ha alcun ruolo +nell'algoritmo di spaziatura. + +Oltre alle impostazioni che abbiamo visto, ce ne sono altre che appaiono +frequentemente nelle partiture proporzionali, tra cui: + +@itemize +@item @code{\override SpacingSpanner.strict-grace-spacing = ##t} +@item @code{\set tupletFullLength = ##t} +@item @code{\override Beam.breakable = ##t} +@item @code{\override Glissando.breakable = ##t} +@item @code{\override TextSpanner.breakable = ##t} +@item @code{\remove "Forbid_line_break_engraver" nel contesto Voice} +@end itemize + +Queste impostazioni spaziano in modo conciso gli abbellimenti, estendono le +parentesi dei gruppi irregolari per contrassegnare i punti di inizio e di +fine del ritmo, e permettono agli elementi che si estendono orizzontalmente +di andare oltre i sistemi e le pagine. Consultare le sezioni del manuale +per queste impostazioni. + +@seealso +Guida alla notazione: +@ref{New spacing section}. + +Frammenti: +@rlsr{Spacing}. + + +@node Riduzione del numero di pagine di una partitura +@section Riduzione del numero di pagine di una partitura +@translationof Fitting music onto fewer pages + +Talvolta può capitare di avere uno o due righi su una seconda +(o terza, o quarta@dots{}) pagina. Ciò è fastidioso, specialmente +se c'è molto spazio nelle pagine precedenti. + +Quando si studiano i problemi di formattazione, uno strumento irrinunciabile +è @code{annotate-spacing}, un comando che mostra i valori delle diverse +variabili di spaziatura. Maggiori dettagli nella prossima sezione, +@ref{Displaying spacing}. + +@menu +* Visualizzare la spaziatura:: +* Modificare la spaziatura:: +@end menu + + +@node Visualizzare la spaziatura +@subsection Visualizzare la spaziatura +@translationof Displaying spacing + +@funindex annotate-spacing +@cindex spaziatura, visualizzazione della formattazione + +Per visualizzare graficamente le dimensioni delle varibili della formattazione +verticale che possono essere modificate per formattare la pagina, impostare +@code{annotate-spacing} nel blocco @code{\paper}: + +@lilypond[verbatim,quote,papersize=a6landscape] +\book { + \score { { c4 } } + \paper { annotate-spacing = ##t } +} +@end lilypond + + +@noindent +Tutte le dimensioni della formattazione sono visualizzate in spazi rigo, +indipendentemente dalle unità di misura specificate nei blocchi +@code{\paper} o @code{\layout}. Nell'esempio qui sopra, l'altezza +del foglio (@code{paper-height}) ha un valore di 59.75 spazi +rigo (@code{staff-space}), e la dimensione del rigo (@code{staff-size}) è +pari a 20 punti (il valore predefinito). Nota che: + +@multitable {1 staff-space} {staff-size)/4 * (25.4/72.27) mm} + +@item 1 punto +@tab = (25.4/72.27) mm + +@item 1 staff-space +@tab = (@code{staff-size})/4 pts +@item +@tab = (@code{staff-size})/4 * (25.4/72.27) mm + +@end multitable + +@noindent +In questo caso, uno @code{staff-space} è uguale all'incirca a +1.757mm. Dunque i 59.75 @code{staff-space} di @code{paper-height} +corrispondono a 105 millimetri, pari all'altezza del formato @code{a6} +in orientamento orizzontale. Le coppie (@var{a},@var{b}) sono +intervalli, dove @var{a} è l'estremo inferiore e @var{b} l'estremo +superiore dell'intervallo. + +@seealso +Guida alla notazione: +@ref{Setting the staff size}. + +Frammenti: +@rlsr{Spacing}. + + +@node Modificare la spaziatura +@subsection Modificare la spaziatura +@translationof Changing spacing + +L'output di @code{annotate-spacing} svela le dimensioni verticali molto +dettagliatamente. Maggiori informazioni su come modificare i margini e +altre variabili di formattazione si trovano in @ref{Page layout}. + +Oltre ai margini, ci sono altre opzioni utili per salvare spazio: + +@itemize +@item +Forzare i sistemi perché si avvicinino il più possibile (per far +entrare più sistemi possibile in una pagina) mentre sono spaziati in +modo da non lasciare spazio bianco in fondo alla pagina. + +@example +\paper @{ + system-system-spacing = #'((basic-distance . 0.1) (padding . 0)) + ragged-last-bottom = ##f + ragged-bottom = ##f +@} +@end example + +@item +Forzare il numero dei sistemi. Ciò può essere utile in due modi. Il +semplice impostare un valore, persino lo stesso valore del numero di +sistemi disposti senza modificare la variabile, può far sì che più +sistemi riescano a entrare in ogni pagina, perché viene saltato il +passaggio di valutazione, dando un valore più adatto per ogni pagina. +Inoltre, forzare davvero una riduzione nel numero di sistemi può far +risparmiare un'ulteriore pagina. Per esempio, se la formattazione +predefinita ha 11 sistemi, la seguente impostazione forzerà la +formattazione con 10 sistemi. + +@example +\paper @{ + system-count = #10 +@} +@end example + +@item +Forzare il numero delle pagine. Per esempio, la seguente impostazione +forzerà la formattazione in due pagine. + +@example +\paper @{ + page-count = #2 +@} +@end example + +@item +Evitare (o ridurre) gli oggetti che aumentano la dimensione verticale di +un sistema. Per esempio, le parentesi delle volte per i finali alternativi +richiedono ulteriore spazio. Se questi finali si estendono per due sistemi, +occupano più spazio che se fossero sullo stesso sistema. Altro esempio: le +dinamiche che @qq{spuntano fuori} da un sistema possono essere avvicinate al +rigo: + +@lilypond[verbatim,quote] +\relative e' { + e4 c g\f c + e4 c g-\tweak X-offset #-2.7 \f c +} +@end lilypond + +@item +Modificare la spaziatura orizzontale tramite @code{SpacingSpanner}. Maggiori +informazioni in @ref{Changing horizontal spacing}. L'esempio seguente mostra +la spaziatura predefinita: + +@lilypond[verbatim,quote] +\score { + \relative { + g'4 e e2 | + f4 d d2 | + c4 d e f | + g4 g g2 | + g4 e e2 | + } +} +@end lilypond + +@noindent +L'esempio successivo modifica @code{common-shortest-duration} da un +valore di @code{1/4} a uno di @code{1/2}. La nota di un quarto è la +durata più comune e più breve in questo esempio, dunque rendendola più +lunga si verifica un effetto @qq{compressione}: + +@lilypond[verbatim,quote] +\score { + \relative { + g'4 e e2 | + f4 d d2 | + c4 d e f | + g4 g g2 | + g4 e e2 | + } + \layout { + \context { + \Score + \override SpacingSpanner.common-shortest-duration = + #(ly:make-moment 1/2) + } + } +} +@end lilypond + +@noindent +La proprietà @code{common-shortest-duration} non può essere modificata in +modo dinamico, quindi deve essere sempre posta in un blocco @code{\context} +così che sia applicata all'intera partitura. + +@end itemize + +@seealso +Guida alla notazione: +@ref{Page layout}, +@ref{Changing horizontal spacing}. + +Frammenti: +@rlsr{Spacing}. + diff --git a/Documentation/it/notation/specialist.itely b/Documentation/it/notation/specialist.itely new file mode 100644 index 0000000000..16165a2c68 --- /dev/null +++ b/Documentation/it/notation/specialist.itely @@ -0,0 +1,41 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- +@ignore + Translation of GIT committish: 26a079ca2393d053315ef8dbef626c897dc9645a + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c \version "2.16.0" + +@node Notazione specialistica +@chapter Notazione specialistica +@translationof Specialist notation + +Questo capitolo spiega come creare la notazione musicale per particolari +tipi di strumento o per stili specifici. + +@menu +* Musica vocale:: +* Keyboard and other multi-staff instruments:: +* Unfretted string instruments:: +* Fretted string instruments:: +* Percussion:: +* Wind instruments:: +* Chord notation:: +* Contemporary music:: +* Ancient notation:: +* World music:: +@end menu + +@include notation/vocal.itely +@include notation/keyboards.itely +@include notation/unfretted-strings.itely +@include notation/fretted-strings.itely +@include notation/percussion.itely +@include notation/wind.itely +@include notation/chords.itely +@include notation/contemporary.itely +@include notation/ancient.itely +@include notation/world.itely diff --git a/Documentation/it/notation/staff.itely b/Documentation/it/notation/staff.itely index 5555f21d56..e5511734d9 100644 --- a/Documentation/it/notation/staff.itely +++ b/Documentation/it/notation/staff.itely @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: 9b0c8394bbd8510cfc39c40342879703a4b3d2c1 + Translation of GIT committish: 19d0e8e1a9cee3444ec4915b1d2d116e67f5b3f7 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @c Translators: Federico Bruni @c Translation checkers: @@ -65,7 +65,6 @@ Questa sezione presenta i diversi metodi per creare e raggruppare i righi. @cindex tablatura @funindex \drummode -@funindex drummode @funindex DrumStaff @funindex RhythmicStaff @funindex TabStaff @@ -78,8 +77,8 @@ Il @notation{rigo musicale} si crea con i comandi @code{\new} o Il contesto di base del rigo è @code{Staff}: -@lilypond[verbatim,quote,relative=2] -\new Staff { c4 d e f } +@lilypond[verbatim,quote] +\new Staff \relative { c''4 d e f } @end lilypond Il contesto @code{DrumStaff} crea un rigo di cinque linee impostato @@ -98,7 +97,7 @@ con un nome. Ulteriori dettagli in @ref{Percussion staves}. soltanto i valori ritmici dell'input. Le durate reali vengono mantenute. Ulteriori dettagli in @ref{Showing melody rhythms}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new RhythmicStaff { c4 d e f } @end lilypond @@ -106,8 +105,8 @@ mantenute. Ulteriori dettagli in @ref{Showing melody rhythms}. nell'accordatura standard per chitarra. Ulteriori dettagli in @ref{Default tablatures}. -@lilypond[verbatim,quote,relative=2] -\new TabStaff { c4 d e f } +@lilypond[verbatim,quote] +\new TabStaff \relative { c''4 d e f } @end lilypond Ci sono due contesti del rigo specifici per la notazione di musica @@ -117,8 +116,8 @@ in @ref{Pre-defined contexts}. Il contesto @code{GregorianTranscriptionStaff} crea un rigo per il canto gregoriano moderno. Non mostra le stanghette delle battute. -@lilypond[verbatim,quote,relative=2] -\new GregorianTranscriptionStaff { c4 d e f e d } +@lilypond[verbatim,quote] +\new GregorianTranscriptionStaff \relative { c''4 d e f e d } @end lilypond Si possono creare nuovi contesti per un singolo rigo, come è spiegato @@ -179,40 +178,40 @@ l'inizio del sistema. Se non si specifica alcun contesto, vengono usate le proprietà predefinite: il gruppo inizia con una linea verticale e le stanghette non sono collegate. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond Nel contesto @code{StaffGroup}, il gruppo inizia con una parentesi quadra e le stanghette attraversano tutti i righi. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond Nel contesto @code{ChoirStaff}, il gruppo inizia con una parentesi quadra, ma le stanghette non sono collegate. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new ChoirStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond Nel contesto @code{GrandStaff}, il gruppo inizia con una parentesi graffa e le stanghette sono collegate da rigo a rigo. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new GrandStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond @@ -220,11 +219,11 @@ Il contesto @code{PianoStaff} è identico a @code{GrandStaff}, con l'unica differenza che permette di mostrare il nome dello strumento direttamente. Ulteriori dettagli in @ref{Instrument names}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new PianoStaff << \set PianoStaff.instrumentName = #"Piano" - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { \clef bass c1 c } >> @end lilypond @@ -280,9 +279,6 @@ Guida al funzionamento interno: @rinternals{SystemStartBracket}, @rinternals{SystemStartSquare}. -@knownissues -@code{PianoStaff} non accetta @code{ChordNames}. - @node Gruppi di righi annidati @unnumberedsubsubsec Gruppi di righi annidati @@ -299,17 +295,17 @@ I contesti dei gruppi di righi possono essere annidati fino a qualsiasi livello. In questo caso, ogni contesto inferiore crea una nuova parentesi accanto alla parentesi del gruppo superiore. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c2 c | c2 c } + \new Staff \relative { c''2 c | c2 c } \new StaffGroup << - \new Staff { g2 g | g2 g } + \new Staff \relative { g'2 g | g2 g } \new StaffGroup \with { systemStartDelimiter = #'SystemStartSquare } << - \new Staff { e2 e | e2 e } - \new Staff { c2 c | c2 c } + \new Staff \relative { e'2 e | e2 e } + \new Staff \relative { c'2 c | c2 c } >> >> >> @@ -361,15 +357,15 @@ in @code{\paper}. \score { \new StaffGroup << \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } } \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } @@ -424,18 +420,18 @@ le sezioni ossia. @cindex tagli addizionali, modificare @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff I comandi @code{\stopStaff} e @code{\startStaff} servono a fermare o (ri)avviare le linee del rigo, per impedire che appaiano in un punto della partitura. -@lilypond[verbatim,quote,relative=2] -\stopStaff f4 d \startStaff g, e -f'4 d \stopStaff g, e -f'4 d \startStaff g, e +@lilypond[verbatim,quote] +\relative { + \stopStaff f''4 d \startStaff g, e + f'4 d \stopStaff g, e + f'4 d \startStaff g, e +} @end lilypond @predefined @@ -450,14 +446,16 @@ il rigo sia (ri)avviato. Si può cambiare il numero di linee del rigo: -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-count = #2 -\startStaff g, e | - -f'4 d \stopStaff -\revert Staff.StaffSymbol.line-count -\startStaff g, e | +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-count = #2 + \startStaff g, e | + + f'4 d \stopStaff + \revert Staff.StaffSymbol.line-count + \startStaff g, e | +} @end lilypond Si può cambiare anche la posizione di ogni linea del rigo. Un elenco di @@ -467,13 +465,15 @@ per le altre. La linea del rigo appare solo se è presente il suo valore, quindi questo comando permette di variare anche il numero delle linee, oltre alla loro posizione. -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) -\startStaff g, e | -f'4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) -\startStaff g, e +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) + \startStaff g, e | + f'4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) + \startStaff g, e | +} @end lilypond Per conservare le tipiche direzioni dei gambi (nella metà inferiore del @@ -486,22 +486,24 @@ alle nuove linee. Si veda @ref{Clef}. Si può modificare lo spessore della linea del rigo. Per impostazione predefinita, questa modifica ha effetto anche sui tagli addizionali e sui gambi. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #3 +} \relative { + f''4 d g, e } -{ f4 d g, e } @end lilypond È anche possibile impostare lo spessore dei tagli addizionali in modo indipendente dalle linee del rigo. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #2 \override StaffSymbol.ledger-line-thickness = #'(0.5 . 0.4) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond @noindent @@ -511,22 +513,24 @@ nuovo valore dello spessore del taglio addizionale. Si possono modificare le posizioni verticali dei tagli addizionali: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-positions = #'(-3 -2 -1 2 5 6) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond Si possono far apparire ulteriori tagli addizionali sopra o sotto le teste delle note, a seconda della posizione corrente relativa alle altre teste, anch'esse con i propri tagli addizionali. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-extra = #4 +} \relative { + f'''4 a, d, f, } -{ f'4 a, d, f, } @end lilypond Si possono far apparire i tagli addizionali anche dentro il rigo quando servono @@ -535,23 +539,26 @@ tagli addizionali quando la proprietà @code{ledger-position} è impostata e quando non lo è. Nell'esempio il comando @code{\stopStaff} serve ad annullare il comando @code{\override} per l'oggetto @code{StaffSymbol}. -@lilypond[verbatim,quote,relative=1] -\override Staff.StaffSymbol.line-positions = #'(-8 0 2 4) -d4 e f g -\stopStaff -\startStaff -\override Staff.StaffSymbol.ledger-positions = #'(-8 -6 (-4 -2) 0) -d4 e f g +@lilypond[verbatim,quote] +\relative d' { + \override Staff.StaffSymbol.line-positions = #'(-8 0 2 4) + d4 e f g + \stopStaff + \startStaff + \override Staff.StaffSymbol.ledger-positions = #'(-8 -6 (-4 -2) 0) + d4 e f g +} @end lilypond Si può cambiare la distanza tra le linee del rigo. Tale modifica ha effetto anche sulla spaziatura della linea. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.staff-space = #1.5 +} \relative { + f'''4 d, g, e, } -{ f'4 d, g, e, } @end lilypond @snippets @@ -585,16 +592,14 @@ Guida al funzionamento interno: @cindex ridimensionamento dei righi @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff I righi @notation{ossia} si possono creare aggiungendo un nuovo rigo simultaneo nel punto giusto: @lilypond[verbatim,quote] -\new Staff \relative c'' { - c4 b d c +\new Staff \relative { + c''4 b d c << { c4 b d c } \new Staff { e4 d f e } @@ -616,17 +621,15 @@ il rigo ossia. Questo metodo conviene quando sono necessari solo pochi righi ossia. @lilypond[verbatim,quote] -\new Staff = "main" \relative c'' { - c4 b d c +\new Staff = "main" \relative { + c''4 b d c << { c4 b d c } \new Staff \with { \remove "Time_signature_engraver" alignAboveContext = #"main" - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) + \magnifyStaff #2/3 firstClef = ##f } { e4 d f e } @@ -647,14 +650,12 @@ esempio. \new Staff = "ossia" \with { \remove "Time_signature_engraver" \hide Clef - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) + \magnifyStaff #2/3 } { \stopStaff s1*6 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 << { e4 f e2 } \context Staff = "ossia" { @@ -675,25 +676,24 @@ esempio. @end lilypond -Come alternativa, si può usare il comando @code{\Staff \RemoveEmptyStaves} +Altrimenti si può usare il comando @code{\RemoveAllEmptyStaves} per creare i righi ossia. Questo metodo conviene quando i righi ossia si trovano subito dopo un'interruzione di linea. Ulteriori informazioni -su @code{\Staff \RemoveEmptyStaves} si trovano in @ref{Hiding staves}. +su @code{\RemoveAllEmptyStaves} si trovano in @ref{Hiding staves}. @lilypond[verbatim,quote,ragged-right] << \new Staff = "ossia" \with { \remove "Time_signature_engraver" \hide Clef - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) - } \relative c'' { + \magnifyStaff #2/3 + \RemoveAllEmptyStaves + } \relative { R1*3 - c4 e8 d c2 + c''4 e8 d c2 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 e4 f e2 g4 a g2 \break c4 b c2 @@ -702,12 +702,6 @@ su @code{\Staff \RemoveEmptyStaves} si trovano in @ref{Hiding staves}. } >> -\layout { - \context { - \Staff \RemoveEmptyStaves - \override VerticalAxisGroup.remove-first = ##t - } -} @end lilypond @@ -746,11 +740,14 @@ Guida al funzionamento interno: @cindex rigo, nascondere @cindex rigo vuoto @cindex nascondere i righi +@cindex nascondere i righi antichi +@cindex nascondere i righi ritmici +@cindex nascondere i tetragrammi @funindex \RemoveEmptyStaves +@funindex \RemoveAllEmptyStaves @funindex Staff_symbol_engraver @funindex \stopStaff -@funindex stopStaff Le linee del rigo si possono nascondere togliendo l'incisore @@ -761,15 +758,18 @@ si può usare @code{\stopStaff}. \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c''' { a8 f e16 d c b a2 } +\relative { a''8 f e16 d c b a2 } @end lilypond -I righi vuoti si possono nascondere inserendo il comando -@code{\Staff \RemoveEmptyStaves} nel blocco @code{\layout}. Nelle -partiture per orchestra, questo stile è noto come @q{Partitura -alla francese}. Questo comando nasconde e toglie tutti i righi -vuoti di una partitura eccetto quelli nel primo sistema. +I righi vuoti si possono nascondere (per la cosiddetta @q{partitura alla francese}) +applicando il comando @code{\RemoveEmptyStaves} a un contesto, che può +essere fatto globalmente (in un blocco @code{\layout}) oppure soltanto per +righi specifici (in un blocco @code{\with}). Questo comando toglie tutti i +righi vuoti di una partitura eccetto quelli nel primo sistema. Per nascondere +anche quelli del primo sistema usare il comando @code{\RemoveAllEmptyStaves}. +I contesti supportati sono @code{Staff}, @code{RhythmicStaff} e +@code{VaticanaStaff}. @warning{Un rigo viene considerato vuoto quando contiene soltanto pause multiple, pause, salti, pause spaziatrici o una combinazione di questi @@ -782,9 +782,9 @@ elementi.} } } -\relative c' << +\relative << \new Staff { - e4 f g a \break + e'4 f g a \break b1 \break a4 b c2 } @@ -799,32 +799,14 @@ elementi.} @cindex ossia @noindent -@code{\Staff \RemoveEmptyStaves} si può usare anche per creare sezioni ossia +@code{\RemoveAllEmptyStaves} si può usare anche per creare sezioni ossia per un rigo. I dettagli si trovano in @ref{Ossia staves}. -@cindex nascondere i righi antichi -@cindex nascondere i righi ritmici - -@funindex \RemoveEmptyStaves - -Per nascondere i righi vuoti nei contesti della musica antica si può usare -il comando @code{\VaticanaStaff \RemoveEmptyStaves}. Analogalmente, -@code{\RhythmicStaff \RemoveEmptyStaves} permette di nascondere i contesti -@code{RhythmicStaff} vuoti. - - @predefined -@code{\Staff \RemoveEmptyStaves}, -@code{\VaticanaStaff \RemoveEmptyStaves}, -@code{\RhythmicStaff \RemoveEmptyStaves}. +@code{\RemoveEmptyStaves}, +@code{\RemoveAllEmptyStaves}. @endpredefined - -@snippets - -@lilypondfile[verbatim,quote,texidoc,doctitle] -{removing-the-first-empty-line.ly} - @seealso Glossario musicale: @rglosnamed{Frenched staff,rigo temporaneo}. @@ -894,12 +876,13 @@ nei contesti @code{Staff}, @code{PianoStaff}, @code{StaffGroup}, @code{GrandStaf e @code{ChoirStaff}. Il valore di @code{instrumentName} viene usato per il primo rigo e quello di @code{shortInstrumentName} per tutti i righi successivi. -@lilypond[verbatim,quote,ragged-right,relative=1] +@lilypond[verbatim,quote,ragged-right] \new Staff \with { instrumentName = #"Violin " shortInstrumentName = #"Vln. " +} \relative { + c'4.. g'16 c4.. g'16 \break | c1 | } -{ c4.. g'16 c4.. g'16 \break | c1 } @end lilypond @cindex nomi degli strumenti, complessi @@ -907,15 +890,16 @@ primo rigo e quello di @code{shortInstrumentName} per tutti i righi successivi. Si può usare @code{\markup} per creare nomi più complessi: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { instrumentName = \markup { \column { "Clarinetti" \line { "in B" \smaller \flat } } } +} \relative { + c''4 c,16 d e f g2 } -{ c4 c,16 d e f g2 } @end lilypond @cindex nomi degli strumenti, centrare @@ -925,20 +909,20 @@ sia quello normale che quello abbreviato, vengono centrati automaticamente. Per allineare al centro i nomi degli strumenti che vanno a capo, occorre usare @code{\center-column}: -@lilypond[verbatim,quote,indent=1.5\cm,relative=2] +@lilypond[verbatim,quote,indent=1.5\cm] << \new Staff \with { instrumentName = #"Flute" - } - { f2 g4 f } + } \relative { + f''2 g4 f +} \new Staff \with { instrumentName = \markup { \center-column { "Clarinet" \line { "in B" \smaller \flat } } } - } - { c4 b c2 } + } \relative { c''4 b c2 } >> @end lilypond @@ -951,26 +935,22 @@ Ulteriori dettagli su queste impostazioni si trovano in @ref{paper variables for shifts and indents,,@code{@bs{}paper} variables for shifts and indents}. @lilypond[verbatim,quote,ragged-right] -\relative c'' { - << - \new Staff \with { - instrumentName = #"Alto Flute in G" - shortInstrumentName = #"Flt." - } - { - f2 g4 f \break - g4 f g2 - } - \new Staff \with { - instrumentName = #"Clarinet" - shortInstrumentName = #"Clar." - } - { - c,4 b c2 \break - c2 b4 c - } - >> -} +<< + \new Staff \with { + instrumentName = #"Alto Flute in G" + shortInstrumentName = #"Flt." + } \relative { + f''2 g4 f \break + g4 f g2 + } + \new Staff \with { + instrumentName = #"Clarinet" + shortInstrumentName = #"Clar." + } \relative { + c''4 b c2 \break + c2 b4 c + } +>> \layout { indent = 3.0\cm @@ -987,65 +967,45 @@ a quel contesto. Ulteriori dettagli in @ref{Modifying context plug-ins}. @cindex nomi degli strumenti, modifica @cindex modificare i nomi degli strumenti -@code{shortInstrumentName} può essere cambiato all'interno di un brano, mentre -di @code{instrumentName} apparirà solo la prima definizione e le modifiche +@code{shortInstrumentName} può essere cambiato all'interno di un brano, insieme +a altre impostazioni necessarie al nuovo strumento. Tuttavia, di +@code{instrumentName} apparirà solo la prima definizione e le modifiche successive saranno ignorate: -@lilypond[verbatim,quote,ragged-right,relative=1] -\new Staff \with { - instrumentName = #"Flute" - shortInstrumentName = #"Flt." -} -{ - c1 c c c \break - c1 c c c \break - \set Staff.instrumentName = #"Clarinet" - \set Staff.shortInstrumentName = #"Clt." - c1 c c c \break - c1 c c c \break +@lilypond[verbatim,quote,ragged-right] +prepPiccolo = <>^\markup \italic { muta in Piccolo } + +setPiccolo = { + \set Staff.instrumentName = #"Piccolo" + \set Staff.shortInstrumentName = #"Picc." + \set Staff.midiInstrument = #"piccolo" + <>^\markup \bold { Piccolo } + \transposition c'' } -@end lilypond -@cindex cambio di strumento -@cindex strumento, cambio di - -@funindex \addInstrumentDefinition -@funindex addInstrumentDefinition -@funindex \instrumentSwitch -@funindex instrumentSwitch - -Se serve un @emph{cambio} di strumento, si può usare -@code{\addInstrumentDefinition} insieme a -@code{\instrumentSwitch} per creare una lista dettagliata delle -modifiche necessarie per il cambio. Il comando -@code{\addInstrumentDefinition} prende due argomenti: una stringa -testuale per identificare lo strumento, e una lista di associazione -delle proprietà di contesto e dei valori da usare. -Deve trovarsi nell'ambito di più alto livello. Per dichiarare il cambio di -strumento, si usa il comando @code{\instrumentSwitch}, all'interno -dell'espressione musicale, : +prepFlute = <>^\markup \italic { muta in Flauto } -@lilypond[verbatim,quote,ragged-right] -\addInstrumentDefinition #"contrabassoon" - #`((instrumentTransposition . ,(ly:make-pitch -1 0 0)) - (shortInstrumentName . "Cbsn.") - (clefGlyph . "clefs.F") - (middleCPosition . 6) - (clefPosition . 2) - (instrumentCueName . ,(make-bold-markup "cbsn.")) - (midiInstrument . "bassoon")) +setFlute = { + \set Staff.instrumentName = #"Flute" + \set Staff.shortInstrumentName = #"Flt." + \set Staff.midiInstrument = #"flute" + <>^\markup \bold { Flute } + \transposition c' +} \new Staff \with { - instrumentName = #"Bassoon" + instrumentName = #"Flute" + shortInstrumentName = #"Flt." + midiInstrument = #"flute" } -\relative c' { - \clef tenor - \compressFullBarRests - c2 g' - R1*16 - \instrumentSwitch "contrabassoon" - c,,2 g \break - c,1 ~ | c1 +\relative { + g'1 g g g \break + g1 g \prepPiccolo R R \break + \setPiccolo + g1 g g g \break + g1 g \prepFlute R R \break + \setFlute + g1 g g g } @end lilypond @@ -1074,11 +1034,8 @@ Guida al funzionamento interno: @cindex note in corpo più piccolo @funindex \addQuote -@funindex addQuote @funindex \quoteDuring -@funindex quoteDuring @funindex \transposition -@funindex transposition È molto comune che una voce usi le stesse note di un'altra voce. Per esempio, il primo e il secondo violino che suonano la stessa frase durante un particolare @@ -1094,12 +1051,12 @@ definito da @code{\addQuote}, e un'espressione musicale per la durata della citazione. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { s1 } } \addQuote "flute" { \fluteNotes } @@ -1117,12 +1074,12 @@ di pause spaziatrici o multiple, la citazione apparirà in forma polifonica e potrebbe causare risultati indesiderati. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } } \addQuote "flute" { \fluteNotes } @@ -1135,6 +1092,42 @@ oboeNotes = \relative c'' { } @end lilypond +@c Frase non chiara, traduco letteralmente. - fb +Se un comando @code{\unfoldRepeat} in un'espressione musicale deve essere +stampato quando si usa @code{\quoteDuring}, allora anch'esso deve contenere +il suo comando @code{\unfoldRepeat}; + +@lilypond[verbatim,quote] +fluteNotes = \relative { + \repeat volta 2 { a'4 gis g gis } +} + +oboeNotesDW = \relative { + \repeat volta 2 \quoteDuring #"incorrect" { s1 } +} + +oboeNotesW = \relative { + \repeat volta 2 \quoteDuring #"correct" { s1 } +} + + +\addQuote "incorrect" { \fluteNotes } + +\addQuote "correct" { \unfoldRepeats \fluteNotes } + +\score { + \unfoldRepeats + << + \new Staff \with { instrumentName = "Flute" } + \fluteNotes + \new Staff \with { instrumentName = "Oboe (incorrect)" } + \oboeNotesDW + \new Staff \with { instrumentName = "Oboe (correct)" } + \oboeNotesW + >> +} +@end lilypond + Il comando @code{\quoteDuring} usa le impostazioni @code{\transposition} sia della parte citata sia di quella che cita per produrre delle note per la parte che cita che abbiano la stessa altezza di quelle nella parte citata. @@ -1146,8 +1139,8 @@ clarinetNotes = \relative c'' { b4 ais a ais | cis4^"quoted" r8 bis\p b4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"clarinet" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"clarinet" { s1 } } \addQuote "clarinet" { \clarinetNotes } @@ -1176,13 +1169,13 @@ presenti nel frammento citato. È possibile scegliere quali di questi oggetti far apparire usando la proprietà di contesto @code{quotedEventTypes}. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a2 g2 | +fluteNotes = \relative { + a'2 g2 | b4\<^"quoted" r8 ais a4\f( c->) } -oboeNotes = \relative c'' { - c2. b4 | +oboeNotes = \relative { + c''2. b4 | \quoteDuring #"flute" { s1 } } @@ -1239,13 +1232,9 @@ terzine annidate potrebbe produrre una notazione mediocre. @funindex \cueDuring -@funindex cueDuring @funindex \cueClef -@funindex cueClef @funindex \cueDuringWithClef -@funindex cueDuringWithClef @funindex \quoteDuring -@funindex quoteDuring @cindex note più piccole @cindex CueVoice @@ -1253,15 +1242,17 @@ terzine annidate potrebbe produrre una notazione mediocre. Il modo più semplice per formattare le notine è creare esplicitamente un contesto @code{CueVoice} all'interno della parte. -@lilypond[verbatim,relative=1] -R1 -<< - { e2\rest r4. e8 } - \new CueVoice { - \stemUp d'8^"flute" c d e fis2 - } ->> -d,4 r a r +@lilypond[verbatim] +\relative { + R1 + << + { e'2\rest r4. e8 } + \new CueVoice { + \stemUp d'8^"flute" c d e fis2 + } + >> + d,4 r a r +} @end lilypond Si può usare il comando @code{\cueClef} all'interno di un contesto @@ -1270,28 +1261,32 @@ questo modo la chiave apparirà nella dimensione giusta per le notine. Si può poi usare il comando @code{\cueClefUnset} per tornare alla chiave originale, di nuovo nella dimensione giusta. -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -<< - { e2\rest r4. \cueClefUnset e,8 } - \new CueVoice { - \cueClef "treble" \stemUp d''8^"flute" c d e fis2 - } ->> -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + << + { e'2\rest r4. \cueClefUnset e,8 } + \new CueVoice { + \cueClef "treble" \stemUp d''8^"flute" c d e fis2 + } + >> + d,,4 r a r +} @end lilypond I comandi @code{\cueClef} e @code{\cueClefUnset} si possono usare anche senza un esplicito contesto @code{CueVoice}. -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -\cueClef "treble" -d'8^"flute" c d e fis2 -\cueClefUnset -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + \cueClef "treble" + d''8^"flute" c d e fis2 + \cueClefUnset + d,,4 r a r +} @end lilypond Per posizionamenti complessi delle notine, per esempio includere la @@ -1320,13 +1315,13 @@ corrisponde alla prima e alla seconda voce rispettivamente, determinando come le notine appaiono in relazione all'altra voce. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 | d8 c d e fis2 | g2 d | +fluteNotes = \relative { + r2. c''4 | d8 c d e fis2 | g2 d | } oboeNotes = \relative c'' { R1 - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } \cueDuring #"flute" #UP { R1 } g2 c, } @@ -1354,8 +1349,8 @@ esplicitamente, altrimenti l'intera espressione musicale appartiene al contesto @code{CueVoice}.} @lilypond[verbatim,quote] -oboeNotes = \relative c'' { - r2 r8 d16(\f f e g f a) +oboeNotes = \relative { + r2 r8 d''16(\f f e g f a) g8 g16 g g2. } \addQuote "oboe" { \oboeNotes } @@ -1369,24 +1364,21 @@ oboeNotes = \relative c'' { } @end lilypond -Il nome dello strumento che suona la citazione si imposta con la proprietà -@code{instrumentCueName} in un contesto @code{CueVoice} temporaneo. Il -posizionamento e lo stile di @code{instrumentCueName} è regolato dall'oggetto -@code{instrumentSwitch}, vedi @ref{Instrument names}. Se le citazioni in corpo -più piccolo richiedono un cambio di chiave, si può fare manualmente ma anche -il ripristino della chiave originale dovrà essere fatto manualmente al termine -delle citazioni. +Si può usare il comando @code{\markup} per mostrare il nome dello strumento +citato. Se le citazioni in corpo più piccolo richiedono un cambio di chiave, si +può fare manualmente, ma anche il ripristino della chiave originale dovrà essere +fatto manualmente al termine delle citazioni. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { \clef bass R1 \clef treble - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } \cueDuring #"flute" #UP { R1 } \clef bass g4. b8 d2 @@ -1405,14 +1397,14 @@ per le citazioni in corpo più piccolo ma mostrerà automaticamente la chiave or citazioni sono finite. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { \clef bass R1 - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup { \tiny "flute" } \cueDuringWithClef #"flute" #UP #"treble" { R1 } g4. b8 d2 } @@ -1425,7 +1417,6 @@ bassoonNotes = \relative c { @end lilypond @funindex \transposedCueDuring -@funindex transposedCueDuring Come @code{\quoteDuring}, @code{\cueDuring} prende in considerazione la trasposizione degli strumenti. Le citazioni in corpo più piccolo vengono mostrate nelle altezze @@ -1439,10 +1430,10 @@ per rappresentare il Do centrale in intonazione reale. È utile nel caso di cit da uno strumento che ha un registro completamente diverso. @lilypond[verbatim,quote] -piccoloNotes = \relative c''' { +piccoloNotes = \relative { \clef "treble^8" R1 - c8 c c e g2 + c'''8 c c e g2 c4 g g2 } @@ -1466,9 +1457,6 @@ bassClarinetNotes = \relative c' { @cindex citazioni in corpo più piccolo, togliere le @funindex \killCues -@funindex killCues -@funindex \addInstrumentDefinition -@funindex addInstrumentDefinition Il comando @code{\killCues} toglie le citazioni in corpo più piccolo da un'espressione musicale, in modo che la stessa espressione musicale possa essere @@ -1480,8 +1468,8 @@ possono essere contrassegnate per includerle in modo selettivo nella partitura; si veda @ref{Using tags}. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { @@ -1489,7 +1477,7 @@ bassoonNotes = \relative c { R1 \tag #'part { \clef treble - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup { \tiny "flute" } } \cueDuring #"flute" #UP { R1 } \tag #'part \clef bass diff --git a/Documentation/it/notation/text.itely b/Documentation/it/notation/text.itely index 863ff5b3e9..8b0f382a56 100644 --- a/Documentation/it/notation/text.itely +++ b/Documentation/it/notation/text.itely @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; -*- @ignore - Translation of GIT committish: 354e5ce3edd1dba03b4ecb68fc766bb46235f5d2 + Translation of GIT committish: bfc3420ada8810d57156e9fc871560188f044a64 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.21" @c Translators: Federico Bruni @c Translation checkers: @@ -64,17 +64,18 @@ del @qq{testo tra virgolette}, come mostrato nell'esempio seguente. Tali indicazioni possono essere posizionate sopra o sotto il rigo, usando la sintassi descritta in @ref{Direction and placement}. -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e a4-"scherz." f +@lilypond[quote,verbatim] +\relative { a'8^"pizz." g f e a4-"scherz." f } @end lilypond In realtà questa sintassi è una scorciatoia; si può specificare una formattazione del testo più complessa usando in modo esplicito un blocco @code{\markup}, come è spiegato in @ref{Formatting text}. -@lilypond[quote,verbatim,relative=2] -a8^\markup { \italic pizz. } g f e -a4_\markup { \tiny scherz. \bold molto } f +@lilypond[quote,verbatim] +\relative { + a'8^\markup { \italic pizz. } g f e + a4_\markup { \tiny scherz. \bold molto } f } @end lilypond Le indicazioni testuali, di norma, non influenzano la spaziatura delle note. @@ -82,10 +83,12 @@ Ma è possibile far sì che la loro larghezza venga presa in considerazione: nell'esempio seguente la prima stringa di testo non influenza la spaziatura, mentre la seconda sì. -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e -\textLengthOn -a4_"scherzando" f +@lilypond[quote,verbatim] +\relative { + a'8^"pizz." g f e + \textLengthOn + a4_"scherzando" f +} @end lilypond Oltre alle scritte, si possono attaccare alle note anche le @@ -95,9 +98,7 @@ Per maggiori informazioni sull'ordinamento relativo delle scritte e delle articolazioni si veda @rlearning{Posizionamento degli oggetti}. @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff @predefined @code{\textLengthOn}, @@ -146,10 +147,12 @@ lungo molteplici note con delle linee punteggiate. Tali oggetti, chiamati @qq{estensori} (spanner), si creano collegando due note con la seguente sintassi: -@lilypond[verbatim,quote,relative=2] -\override TextSpanner.bound-details.left.text = "rit." -b1\startTextSpan -e,\stopTextSpan +@lilypond[verbatim,quote] +\relative { + \override TextSpanner.bound-details.left.text = "rit." + b'1\startTextSpan + e,\stopTextSpan +} @end lilypond @cindex estensori del testo, formattazione @@ -161,22 +164,21 @@ dell'oggetto. Per impostazione predefinita, appare in corsivo, ma si può ottenere una formattazione diversa tramite i blocchi @code{\markup}, come è spiegato in @ref{Formatting text}. -@lilypond[quote,relative=2,verbatim] -\override TextSpanner.bound-details.left.text = - \markup { \upright "rit." } -b1\startTextSpan c -e,\stopTextSpan +@lilypond[quote,verbatim] +\relative { + \override TextSpanner.bound-details.left.text = + \markup { \upright "rit." } + b'1\startTextSpan c + e,\stopTextSpan +} @end lilypond Lo stile della linea, così come la stringa testuale, può essere definito come una proprietà dell'oggetto. Questa sintassi è descritta in @ref{Line styles}. @funindex \textSpannerUp -@funindex textSpannerUp @funindex \textSpannerDown -@funindex textSpannerDown @funindex \textSpannerNeutral -@funindex textSpannerNeutral @predefined @@ -224,9 +226,7 @@ Guida al funzionamento interno: @cindex stanghette, simboli sulle @funindex \mark -@funindex mark @funindex \markup -@funindex markup Si possono aggiungere vari elementi testuali a una partitura tramite la sintassi descritta in @ref{Rehearsal marks}: @@ -234,21 +234,28 @@ sintassi descritta in @ref{Rehearsal marks}: @c \mark needs to be placed on a separate line (it's not @c attached to an object like \markup is). -vv -@lilypond[verbatim,quote,relative=2] -c4 -\mark "Allegro" -c c c +@lilypond[verbatim,quote] +\relative { + \mark "Verse" + c'2 g' + \bar "||" + \mark "Chorus" + g2 c, + \bar "|." +} @end lilypond Questa sintassi permette di porre del testo sopra una stanghetta; una formattazione del testo più complessa è possibile grazie al blocco @code{\markup}, come è spiegato in @ref{Formatting text}: -@lilypond[quote,verbatim,relative=1] -1 -\mark \markup { \italic { colla parte } } -2 -1 +@lilypond[quote,verbatim] +\relative { + 1 + \mark \markup { \italic { colla parte } } + 2 + 1 +} @end lilypond @noindent @@ -256,10 +263,12 @@ Questa sintassi permette anche di stampare segni speciali, come coda, segno o corona, se si specifica il nome appropriato del simbolo, come è spiegato in @ref{Music notation inside markup}: -@lilypond[quote,verbatim,relative=2] -2 -\mark \markup { \musicglyph #"scripts.ufermata" } -1 +@lilypond[quote,verbatim] +\relative { + 2 + \mark \markup { \musicglyph #"scripts.ufermata" } + 1 +} @end lilypond @noindent @@ -269,17 +278,17 @@ possono trovarsi sopra la stanghetta o tra le note. Se inserito prima di un'interruzione di linea, l'indicazione apparirà all'inizio della linea successiva. -@lilypond[quote,verbatim,relative=2,ragged-right] -\mark "Allegro" -c1 c -\mark "assai" \break -c c +@lilypond[quote,verbatim,ragged-right] +\relative c'' { + \mark "Allegro" + c1 c + \mark "assai" \break + c c +} @end lilypond @funindex \markLengthOn -@funindex markLengthOn @funindex \markLengthOff -@funindex markLengthOff @predefined @code{\markLengthOn}, @@ -319,7 +328,6 @@ Guida al funzionamento interno: @cindex testo al livello superiore @funindex \markup -@funindex markup Un blocco @code{\markup} può esistere di per sé, fuori da qualsiasi blocco @code{\score}, come un'@tie{@qq{espressione di livello superiore}}. Questa @@ -354,9 +362,7 @@ Questa funzionalità, e la sintassi specifica che richiede, è descritta in @ref{Multi-page markup}. @funindex \markup -@funindex markup @funindex \markuplist -@funindex markuplist @predefined @code{\markup}, @@ -408,7 +414,6 @@ usando la sintassi specifica della modalità @code{\markup}. @cindex annotazione @funindex \markup -@funindex markup Un blocco @code{\markup} permette di comporre del testo con un'ampia sintassi chiamata @qq{modalità markup}. @@ -428,14 +433,16 @@ Diversamente dalle indicazioni testuali @qq{tra virgolette}, i blocchi inseriti col carattere di barra inversa @code{\}. Tali comandi hanno effetto solo sulla prima espressione che segue. -@lilypond[quote,verbatim,relative=2] -a1-\markup intenso -a2^\markup { poco \italic più forte } -c e1 -d2_\markup { \italic "string. assai" } -e -b1^\markup { \bold { molto \italic agitato } } -c +@lilypond[quote,verbatim] +\relative { + a'1-\markup intenso + a2^\markup { poco \italic più forte } + c e1 + d2_\markup { \italic "string. assai" } + e + b1^\markup { \bold { molto \italic agitato } } + c +} @end lilypond @cindex caratteri speciali in modalità markup @@ -453,10 +460,12 @@ minime, e quindi qualsiasi comando di markup o carattere speciale la formattazione del testo. Le stesse doppie virgolette possono essere stampate facendole precedere da una barra inversa. -@lilypond[quote,verbatim,relative=2] -a1^"\italic markup..." -a_\markup { \italic "... prints \"italic\" letters!" } -a a +@lilypond[quote,verbatim] +\relative { + a'1^"\italic markup..." + a_\markup { \italic "... prints \"italic\" letters!" } + a a +} @end lilypond Perché sia trattata come un'espressione distinta, una lista di parole deve @@ -465,11 +474,13 @@ in cui le espressioni musicali sono definite influenza il modo in cui saranno sistemate, centrate e allineate; nell'esempio seguente, la seconda espressione di @code{\markup} viene trattata nello stesso modo della prima: -@lilypond[quote,verbatim,relative=2] -c1^\markup { \center-column { a bbb c } } -c1^\markup { \center-column { a { bbb c } } } -c1^\markup { \center-column { a \line { bbb c } } } -c1^\markup { \center-column { a "bbb c" } } +@lilypond[quote,verbatim] +\relative c'' { + c1^\markup { \center-column { a bbb c } } + c1^\markup { \center-column { a { bbb c } } } + c1^\markup { \center-column { a \line { bbb c } } } + c1^\markup { \center-column { a "bbb c" } } +} @end lilypond I markup possono essere salvati in delle variabili, che possono poi essere @@ -512,22 +523,21 @@ Gli errori di sintassi relativi alla modalità markup possono essere poco chiari @cindex font, cambiare @funindex \italic -@funindex italic @funindex \bold -@funindex bold @funindex \underline -@funindex underline La modalità markup permette di cambiare il tipo di carattere: -@lilypond[quote,verbatim,relative=2] -d1^\markup { - \bold { Più mosso } - \italic { non troppo \underline Vivo } +@lilypond[quote,verbatim] +\relative { + d''1^\markup { + \bold { Più mosso } + \italic { non troppo \underline Vivo } + } + r2 r4 r8 + d,_\markup { \italic quasi \smallCaps Tromba } + f1 d2 r } -r2 r4 r8 -d,_\markup { \italic quasi \smallCaps Tromba } -f1 d2 r @end lilypond @cindex dimensione del tipo di carattere @@ -537,60 +547,70 @@ f1 d2 r @funindex \abs-fontsize @funindex \fontsize -@funindex fontsize @funindex \smaller -@funindex smaller @funindex \larger -@funindex larger @funindex \magnify -@funindex magnify Si può modificare la dimensione del tipo di carattere, rispetto alla dimensione globale del rigo, in vari modi. Si può impostare su una dimensione predefinita, -@lilypond[quote,verbatim,relative=2] -b1_\markup { \huge Sinfonia } -b1^\markup { \teeny da } -b1-\markup { \normalsize camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \huge Sinfonia } + b1^\markup { \teeny da } + b1-\markup { \normalsize camera } +} @end lilypond oppure in modo proporzionale rispetto al valore precedente, -@lilypond[quote,verbatim,relative=2] -b1_\markup { \larger Sinfonia } -b1^\markup { \smaller da } -b1-\markup { \magnify #0.6 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \larger Sinfonia } + b1^\markup { \smaller da } + b1-\markup { \magnify #0.6 camera } +} @end lilypond Può essere aumentata o diminuita rispetto al valore impostato per la dimensione globale del rigo: -@lilypond[quote,verbatim,relative=2] -b1_\markup { \fontsize #-2 Sinfonia } -b1^\markup { \fontsize #1 da } -b1-\markup { \fontsize #3 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \fontsize #-2 Sinfonia } + b1^\markup { \fontsize #1 da } + b1-\markup { \fontsize #3 camera } +} @end lilypond Si può impostare anche su una dimensione fissa (in punti), indipendentemente dalla dimensione globale del rigo: -@lilypond[quote,verbatim,relative=2] -b1_\markup { \abs-fontsize #20 Sinfonia } -b1^\markup { \abs-fontsize #8 da } -b1-\markup { \abs-fontsize #14 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \abs-fontsize #20 Sinfonia } + b1^\markup { \abs-fontsize #8 da } + b1-\markup { \abs-fontsize #14 camera } +} +@end lilypond + +Se il testo contiene degli spazi, è meglio racchiuderlo tutto tra virgolette, +in modo che la dimensione di ciascun spazio sia adatta alla dimensione degli +altri caratteri. + +@lilypond[quote,verbatim] +\markup \fontsize #6 \bold { Sinfonia da camera } +\markup \fontsize #6 \bold { "Sinfonia da camera" } @end lilypond @cindex pedice @cindex apice @funindex \super -@funindex super @funindex \sub -@funindex sub @funindex \normal-size-super -@funindex normal-size-super È possibile stampare il testo come pedice o apice. Per impostazione predefinita, questo appaiono in corpo più piccolo, ma si può usare @@ -661,21 +681,13 @@ tipi di carattere personalizzati si trova in @ref{Font}. è spiegato in @ref{Fonts}. @funindex \teeny -@funindex teeny @funindex \tiny -@funindex tiny @funindex \small -@funindex small @funindex \normalsize -@funindex normalsize @funindex \large -@funindex large @funindex \huge -@funindex huge @funindex \smaller -@funindex smaller @funindex \larger -@funindex larger @predefined @@ -731,40 +743,40 @@ tramite la sintassi descritta in @rlearning{Spostare gli oggetti}. @cindex allineamento orizzontale del testo @funindex \left-align -@funindex left-align @funindex \center-align -@funindex center-align @funindex \right-align -@funindex right-align Gli oggetti di markup possono essere allineati in vari modi. Per impostazione predefinita, l'indicazione testuale è allineata rispetto al suo margine sinistro: nell'esempio seguente, non c'è differenza tra il primo e il secondo markup. -@lilypond[quote,verbatim,relative=2] -d1-\markup { poco } -f -d-\markup { \left-align poco } -f -d-\markup { \center-align { poco } } -f -d-\markup { \right-align poco } +@lilypond[quote,verbatim] +\relative { + d''1-\markup { poco } + f + d-\markup { \left-align poco } + f + d-\markup { \center-align { poco } } + f + d-\markup { \right-align poco } +} @end lilypond @funindex \halign -@funindex halign L'allineamento orizzontale può essere ritoccato usando un valore numerico: -@lilypond[quote,verbatim,relative=2] -a1-\markup { \halign #-1 poco } -e' -a,-\markup { \halign #0 poco } -e' -a,-\markup { \halign #0.5 poco } -e' -a,-\markup { \halign #2 poco } +@lilypond[quote,verbatim] +\relative { + a'1-\markup { \halign #-1 poco } + e' + a,-\markup { \halign #0 poco } + e' + a,-\markup { \halign #0.5 poco } + e' + a,-\markup { \halign #2 poco } +} @end lilypond @noindent @@ -777,11 +789,8 @@ oggetti di markup tutti insieme, come mostrato ad esempio in @cindex allineamento verticale del testo @funindex \raise -@funindex raise @funindex \lower -@funindex lower @funindex \null -@funindex null @c QUERY Should the function of ``\null'' be clarified? rp @@ -793,50 +802,51 @@ può essere un altro elemento markup o un oggetto invisibile. L'esempio seguen illustra queste due possibilità; l'ultimo markup in questo esempio non ha un punto di riferimento e di conseguenza non si muove. -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \raise #2 { Scène 1 } -} -a' -g_\markup { - \null - \lower #4 \bold { Très modéré } -} -a -d,^\markup { - \raise #4 \italic { Une forêt. } +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \raise #2 { Scène 1 } + } + a' + g_\markup { + \null + \lower #4 \bold { Très modéré } + } + a + d,^\markup { + \raise #4 \italic { Une forêt. } + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @funindex \general-align -@funindex general-align @funindex \translate -@funindex translate @funindex \translate-scaled -@funindex translate-scaled Alcuni comandi possono cambiare l'allineamento sia orizzontale che verticale degli oggetti testuali in modalità markup. Qualsiasi oggetto interessato da questi comandi deve essere preceduto da un punto di riferimento: -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \translate #'(-1 . 2) "Scène 1" -} -a' -g_\markup { - \null - \general-align #Y #3.2 \bold "Très modéré" -} -a -d,^\markup { - \null - \translate-scaled #'(-1 . 2) \teeny "Une forêt." +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \translate #'(-1 . 2) "Scène 1" + } + a' + g_\markup { + \null + \general-align #Y #3.2 \bold "Très modéré" + } + a + d,^\markup { + \null + \translate-scaled #'(-1 . 2) \teeny "Une forêt." + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @cindex markup multilinea @@ -847,9 +857,7 @@ a'4 a g2 a @cindex colonne, testo @funindex \column -@funindex column @funindex \center-column -@funindex center-column Un oggetto markup può includere varie linee di testo. Nell'esempio seguente, ogni elemento o espressione viene posizionato sulla sua @@ -876,7 +884,6 @@ linea, allineato a sinistra o centrato: @cindex markup, centrare sulla pagina @funindex \fill-line -@funindex fill-line Analogalmente, una lista di elementi o espressioni può essere distesa per riempire l'intera larghezza orizzontale della linea (se c'è un solo @@ -909,9 +916,7 @@ espressione di markup: @cindex markup, testo giustificato @funindex \wordwrap -@funindex wordwrap @funindex \justify -@funindex justify Indicazioni testuali lunghe possono andare a capo automaticamente in base alla larghezza della linea specificata. Possono essere allineate a @@ -989,15 +994,10 @@ i comandi di markup. @cindex markup, incorniciatura @funindex \box -@funindex box @funindex \circle -@funindex circle @funindex \rounded-box -@funindex rounded-box @funindex \bracket -@funindex bracket @funindex \hbracket -@funindex hbracket Alcuni comandi di markup consentono di decorare gli elementi testuali con degli elementi grafici, come è illustrato nell'esempio seguente. @@ -1024,13 +1024,9 @@ degli elementi grafici, come è illustrato nell'esempio seguente. @cindex markup, padding @funindex \pad-markup -@funindex pad-markup @funindex \pad-x -@funindex pad-x @funindex \pad-to-box -@funindex pad-to-box @funindex \pad-around -@funindex pad-around Alcuni comandi possono richiedere un aumento del padding intorno al testo; per farlo si usano dei comandi di markup, descritti in modo @@ -1062,17 +1058,11 @@ Flute quartet keeps very uneven time." @cindex simboli non musicali @funindex \combine -@funindex combine @funindex \draw-circle -@funindex draw-circle @funindex \filled-box -@funindex filled-box @funindex \triangle -@funindex triangle @funindex \draw-line -@funindex draw-line @funindex \arrow-head -@funindex arrow-head Si possono produrre altri elementi grafici o simboli che non richiedono alcun testo. Come con qualsiasi espressione di markup, tali oggetti @@ -1099,9 +1089,7 @@ possono essere combinati. @cindex postscript @funindex \epsfile -@funindex epsfile @funindex \postscript -@funindex postscript Le funzionalità grafiche avanzate comprendono la possibilità di includere file di immagini convertite nel formato Encapsulated PostScript @@ -1109,8 +1097,8 @@ file di immagini convertite nel formato Encapsulated PostScript usando del codice PostScript nativo. In tal caso, può essere utile specificare esplicitamente la dimensione del disegno, come è mostrato sotto: -@lilypond[quote,verbatim,relative=1] -c1^\markup { +@lilypond[quote,verbatim,fragment] +c'1^\markup { \combine \epsfile #X #10 #"./context-example.eps" \with-dimensions #'(0 . 6) #'(0 . 10) @@ -1126,7 +1114,7 @@ c1^\markup { closepath stroke" } -c +c' @end lilypond Una lista completa dei comandi specifici per la grafica si trova in @@ -1134,9 +1122,10 @@ Una lista completa dei comandi specifici per la grafica si trova in @seealso Guida alla notazione: -@ref{Graphic}, +@ref{Align}, +@ref{Dimensions}, @ref{Editorial annotations}, -@ref{Align}. +@ref{Graphic}. File installati: @file{scm/define-markup-commands.scm}, @@ -1162,38 +1151,40 @@ oggetto markup. Per le note e le alterazioni esistono dei comandi markup appositi: -@lilypond[quote,verbatim,relative=2] -a2 a^\markup { +@lilypond[quote,verbatim,fragment] +a'2 a'^\markup { \note #"4" #1 = \note-by-number #1 #1 #1.5 } -b1_\markup { +b'1_\markup { \natural \semiflat \flat \sesquiflat \doubleflat } \glissando -a1_\markup { +a'1_\markup { \natural \semisharp \sharp \sesquisharp \doublesharp } -\glissando b +\glissando b' @end lilypond Anche altri oggetti della notazione possono essere stampati in modalità markup: -@lilypond[quote,verbatim,relative=1] -g1 bes -ees\finger \markup \tied-lyric #"4~1" -fis_\markup { \dynamic rf } -bes^\markup { - \beam #8 #0.1 #0.5 -} -cis -d-\markup { - \markalphabet #8 - \markletter #8 +@lilypond[quote,verbatim] +\relative { + g1 bes + ees\finger \markup \tied-lyric #"4~1" + fis_\markup { \dynamic rf } + bes^\markup { + \beam #8 #0.1 #0.5 + } + cis + d-\markup { + \markalphabet #8 + \markletter #8 + } } @end lilypond @@ -1202,13 +1193,15 @@ separatamente in un oggetto markup, come è illustrato sotto. Una lista completa di questi simboli e dei loro nomi si trova in @ref{The Feta font}. -@lilypond[quote,verbatim,relative=2] -c2 -c'^\markup { \musicglyph #"eight" } -c,4 -c,8._\markup { \musicglyph #"clefs.G_change" } -c16 -c2^\markup { \musicglyph #"timesig.neomensural94" } +@lilypond[quote,verbatim] +\relative { + c''2 + c'^\markup { \musicglyph #"eight" } + c,4 + c,8._\markup { \musicglyph #"clefs.G_change" } + c16 + c2^\markup { \musicglyph #"timesig.neomensural94" } +} @end lilypond Un altro modo per stampare glifi non testuali è descritto in @@ -1217,20 +1210,22 @@ dimensioni. La modalità markup supporta anche i diagrammi per strumenti specifici: -@lilypond[quote,verbatim,relative=2] -c1^\markup { - \fret-diagram-terse #"x;x;o;2;3;2;" -} -c^\markup { - \harp-pedal #"^-v|--ov^" -} -c -c^\markup { - \combine - \musicglyph #"accordion.discant" +@lilypond[quote,verbatim] +\relative { + c''1^\markup { + \fret-diagram-terse #"x;x;o;2;3;2;" + } + c^\markup { + \harp-pedal #"^-v|--ov^" + } + c + c^\markup { \combine - \raise #0.5 \musicglyph #"accordion.dot" - \raise #1.5 \musicglyph #"accordion.dot" + \musicglyph #"accordion.discant" + \combine + \raise #0.5 \musicglyph #"accordion.dot" + \raise #1.5 \musicglyph #"accordion.dot" + } } @end lilypond @@ -1246,15 +1241,17 @@ Questi diagrammi sono documentati in @ref{Instrument Specific Markup}. caso, il blocco @code{\score} annidato deve contenere un blocco @code{\layout}, come è illustrato qui: -@lilypond[quote,verbatim,relative=1] -c4 d^\markup { - \score { - \relative c' { c4 d e f } - \layout { } +@lilypond[quote,verbatim] +\relative { + c'4 d^\markup { + \score { + \relative { c'4 d e f } + \layout { } + } } + e f | + c d e f } -e f | -c d e f @end lilypond Una lista completa dei comandi relativi alla notazione musicale si trova @@ -1288,11 +1285,8 @@ Guida al funzionamento interno: @cindex testo esteso su più pagine @funindex \markuplist -@funindex markuplist @funindex \justified-lines -@funindex justified-lines @funindex \wordwrap-lines -@funindex wordwrap-lines Sebbene gli oggetti di markup standard non possano avere interruzioni, una specifica sintassi permette di inserire linee di testo che possono estendersi @@ -1342,7 +1336,6 @@ Guida al funzionamento interno: @rinternals{TextScript}. @funindex \markuplist -@funindex markuplist @predefined @code{\markuplist}. @@ -1383,8 +1376,8 @@ come un insieme di glifi specifici, ordinati in varie famiglie. La seguente sintassi permette di usare vari caratteri @code{feta} di LilyPond (non testuali) direttamente nella modalità markup: -@lilypond[quote,verbatim,relative=2] -a1^\markup { +@lilypond[quote,verbatim,fragment] +a'1^\markup { \vcenter { \override #'(font-encoding . fetaBraces) \lookup #"brace120" @@ -1409,32 +1402,32 @@ più piccola. Il valore ottimale deve essere determinato per tentativi. Questi glifi sono tutte graffe sinistre; le graffe destre si possono ottenere con la rotazione, vedi @ref{Rotating objects}. -Sono disponibili tre famiglie di tipi di carattere: il @emph{roman} -(con grazie), che usa di default New Century Schoolbook, il -@emph{sans} (senza grazie) e il tipo monospaziato @emph{typewriter} -- queste -ultime due famiglie sono determinate dall'installazione di Pango. - -@warning{Non ci sono tipi predefiniti associati con le famiglie @emph{sans} -e @emph{typewriter}. Un file di input che usa una di queste famiglie -può produrre output diversi su computer diversi. Per garantire un output -coerente su piattaforme diverse, occorre specificare i tipi di carattere -per nome e quei tipi devono essere presenti in qualsiasi sistema che -elabori il file. Si veda @ref{Single entry fonts} e -@ref{Entire document fonts}.} +Sono disponibili tre famiglie di tipi di carattere: +@itemize +@item +Il tipo @emph{roman} (con grazie), il cui valore predefinito è LilyPond Serif +(un alias di TeX Gyre Schola). +@item +Il tipo @emph{sans} (senza grazie), il cui valore predefinito è LilyPond Sans +Serif (un alias di TeX Gyre Heros). +@item +Il tipo monospaziato @emph{typewriter}, il cui valore predefinito è LilyPond +Monospace (un alias di TeX Gyre Cursor). +@end itemize Ogni famiglia può avere forme e serie differenti. L'esempio seguente illustra la possibilità di scegliere famiglie, forme, serie e dimensioni alternative. Il valore specificato per @code{font-size} è la modifica relativa alla dimensione predefinita. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Score.RehearsalMark.font-family = #'typewriter \mark \markup "Ouverture" \override Voice.TextScript.font-shape = #'italic \override Voice.TextScript.font-series = #'bold -d2.^\markup "Allegro" +d''2.^\markup "Allegro" \override Voice.TextScript.font-size = #-3 -c4^smaller +c''4^smaller @end lilypond @noindent @@ -1485,14 +1478,14 @@ Si può usare nella partitura qualsiasi tipo di carattere che sia installato nel sistema operativo e riconosciuto da FontConfig, usando la seguente sintassi: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.TimeSignature.font-name = #"Bitstream Charter" \override Staff.TimeSignature.font-size = #2 \time 3/4 -a1_\markup { - \override #'(font-name . "Vera Bold") - { Vera Bold } +a'1_\markup { + \override #'(font-name . "Bitstream Vera Sans,sans-serif, Oblique Bold") + { Vera Oblique Bold } } @end lilypond @@ -1501,10 +1494,15 @@ a1_\markup { @cindex elencare i tipi di carattere disponibili @cindex tipi di carattere disponibili, elenco +@var{font-name} può essere definito da una lista separata da virgola di +@q{font} e una lista separata da spazi di @q{stili}. Se il @q{font} nella +lista è installato e contiene il glifo richiesto, verrà usato, altrimenti +sarà usato al suo posto il font @emph{successivo}. + @funindex show-available-fonts -Il seguente comando mostra un elenco di tutti i tipi di carattere disponibili -nel sistema operativo: +Lanciando lilypond con la seguente opzione si ottiene un elenco di tutti i +tipi di carattere disponibili nel sistema operativo: @example lilypond -dshow-available-fonts x @@ -1527,11 +1525,13 @@ Frammenti: @unnumberedsubsubsec Tipi di carattere per l'intero documento @translationof Entire document fonts -È possibile modificare i tipi di carattere usati come tipi predefiniti -nelle famiglie @emph{roman}, @emph{sans} e @emph{typewriter} specificandoli, in -questo ordine, come è mostrato nell'esempio seguente, che ridimensiona -automaticamente i caratteri col valore impostato per la dimensione globale -del rigo. I tipi di carattere sono spiegati in @ref{Fonts explained}. +È possibile modificare i tipi di carattere usati come tipi predefiniti nelle +famiglie @emph{roman}, @emph{sans} e @emph{typewriter} specificandoli, in questo +ordine, come è mostrato nell'esempio seguente, che ridimensiona automaticamente +i caratteri col valore impostato per la dimensione globale del rigo. In modo +analogo a @ref{Single entry fonts}, si può indicare con una lista separata da +virgole di @q{font}. Gli @q{stili} dei font, invece, non possono essere +definiti. I tipi di carattere sono spiegati in @ref{Fonts explained}. @cindex famiglie di tipi di carattere, impostare @cindex tipi di carattere, modificarli per l'intero documento @@ -1542,7 +1542,7 @@ del rigo. I tipi di carattere sono spiegati in @ref{Fonts explained}. \paper { #(define fonts (make-pango-font-tree "Times New Roman" - "Nimbus Sans" + "Nimbus Sans,Nimbus Sans L" "Luxi Mono" (/ staff-height pt 20))) } @@ -1564,4 +1564,3 @@ Guida alla notazione: @ref{Single entry fonts}, @ref{Selecting font and font size}, @ref{Font}. - diff --git a/Documentation/it/notation/vocal.itely b/Documentation/it/notation/vocal.itely new file mode 100644 index 0000000000..1ca2de981c --- /dev/null +++ b/Documentation/it/notation/vocal.itely @@ -0,0 +1,3415 @@ +@c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- +@ignore + Translation of GIT committish: 88cfc9ee61dece9cffff98ab7f10318633698c39 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c \version "2.19.21" + +@c Translators: Federico Bruni +@c Translation checkers: + +@node Musica vocale +@section Musica vocale +@translationof Vocal music + +@lilypondfile[quote]{vocal-headword.ly} + +Questa sezione spiega come scrivere la musica vocale e assicurarsi che +il testo sia allineato con le note della melodia. + +@menu +* Notazione comune per la musica vocale:: +* Tecniche specifiche per il testo vocale:: +* Strofe:: +* Canzoni:: +* Musica corale:: +* Opera e musical:: +* Canti salmi e inni:: +* Musica vocale antica:: + +@end menu + + +@node Notazione comune per la musica vocale +@subsection Notazione comune per la musica vocale +@translationof Common notation for vocal music + +Questa sezione tratta le questioni relative alla maggior parte +delle tipologie di musica vocale. + +@menu +* Riferimenti per la musica vocale:: +* Inserimento del testo vocale:: +* Allineamento del testo alla melodia:: +* Durate automatiche delle sillabe:: +* Durate manuali delle sillabe:: +* Più sillabe in una nota:: +* Più note in una sillaba:: +* Estensori e trattini:: +@end menu + + +@node Riferimenti per la musica vocale +@unnumberedsubsubsec Riferimenti per la musica vocale +@translationof References for vocal music + +Questa sezione indica dove trovare informazioni dettagliate +sulle questioni comuni a qualsiasi tipo di musica vocale. + +@itemize + +@item +La maggior parte degli stili di musica vocale usa il testo +semplice per le parti vocali. Un'introduzione a questo tipo +di notazione è disponibile in @rlearning{Impostare canzoni semplici}. + +@item +La musica vocale richiede solitamente l'uso della modalità +@code{markup}, sia per il testo musicale che per altri elementi +testuali (i nomi dei personaggi, etc.). Questa sintassi è +spiegata in @ref{Text markup introduction}. + +@item +L'@notation{Ambitus} può essere aggiunto all'inizio dei righi per +la voce, come è spiegato in @ref{Ambitus}. + +@item +Le indicazioni dinamiche sono di norma posizionate sotto il rigo, +ma nella musica corale sono posizionate solitamente sopra il +rigo per evitare il testo, come è spiegato in @ref{Score layouts for choral}. + +@end itemize + +@seealso +Glossario musicale: +@rglos{ambitus}. + +Manuale di apprendimento: +@rlearning{Impostare canzoni semplici}. + +Guida alla notazione: +@ref{Text markup introduction}, +@ref{Ambitus}, +@ref{Score layouts for choral}. + +Frammenti: +@rlsr{Vocal music}. + + +@node Inserimento del testo vocale +@unnumberedsubsubsec Inserimento del testo vocale +@translationof Entering lyrics + +@cindex testo, inserimento +@cindex inserimento del testo +@cindex formattazione nel testo vocale +@cindex testo vocale, formattazione +@cindex punteggiatura nel testo vocale +@cindex testo vocale, punteggiatura +@cindex spazi nel testo vocale +@cindex testo vocale, spazi +@cindex citazioni nel testo vocale +@cindex testo vocale, citazioni +@funindex \lyricmode + +@c TODO should we explain hyphens here + +Il testo vocale viene inserito in una speciale modalità di input, che +può essere introdotta dai comandi @code{\lyricmode}, @code{\addlyrics} o +@code{\lyricsto}. In questa speciale modalità, l'input @code{d} non +viene analizzato come l'altezza @notation{Re}, ma come una sillaba di +una lettera. In altre parole, le sillabe si inseriscono come le note, +ma le altezze sono sostituite dal testo. + +Per esempio: + +@example +\lyricmode @{ Three4 blind mice,2 three4 blind mice2 @} +@end example + +Ci sono due metodi principali per determinare il posizionamento +orizzontale delle sillabe. Si può indicare la durata di ogni +sillaba esplicitamente, come nell'esempio precedente; oppure +si può lasciare che il testo sia allineato automaticamente a +una melodia o a un'altra voce del brano, usando @code{\addlyrics} o +@code{\lyricsto}. Il primo metodo è descritto sotto in +@ref{Manual syllable durations}; il secondo in +@ref{Automatic syllable durations}. + +Una parola o sillaba del testo inizia con un carattere alfabetico +(seguito da altri caratteri, vedi dopo) ed è terminata da uno +spazio bianco o da un numero. I caratteri successivi al primo +nella sillaba possono essere un qualsiasi carattere che non sia +un numero o uno spazio bianco. + +Dato che qualsiasi carattere che non sia un numero o uno spazio +viene considerato come parte della sillaba, una parola è valida +anche se finisce con @code{@}}, causando spesso il seguente errore: + +@example +\lyricmode @{ lah lah lah@} +@end example + +In questo esempio, la parentesi @code{@}} è inclusa nella sillaba finale, +dunque +la parentesi iniziale non viene chiusa e la compilazione del file +probabilmente non riuscirà. Le parentesi devono quindi essere +sempre circondate da uno spazio: + +@example +\lyricmode @{ lah lah lah @} +@end example + +La punteggiatura, i caratteri accentati, quelli di lingue diverse +dall'inglese e i caratteri speciali (come il simbolo del cuore o +le virgolette oblique) possono essere inseriti direttamente +nel file di input, purché sia salvato nella codifica UTF-8. +Ulteriori informazioni in @ref{Special characters}. + +@lilypond[quote,verbatim] +\relative { d''8 c16 a bes8 f e' d c4 } +\addlyrics { „Schad’ um das schö -- ne grü -- ne Band, } +@end lilypond + +Le virgolette normali possono essere usate nel testo vocale, ma +devono essere precedute da un carattere di barra inversa e l'intera +sillaba deve essere racchiusa tra altre virgolette. Per esempio, + +@lilypond[quote,verbatim] +\relative { \time 3/4 e'4 e4. e8 d4 e d c2. } +\addlyrics { "\"I" am so lone -- "ly,\"" said she } +@end lilypond + +La definizione completa di come può iniziare una parola nella modalità +testo è un po' più complessa. Può iniziare con un carattere alfabetico, +@code{_}, @code{?}, @code{!}, @code{:}, @code{'}, i caratteri di controllo +@code{^A} fino a @code{^F}, @code{^Q} fino a @code{^W}, @code{^Y}, +@code{^^}, qualsiasi carattere a 8-bit con un codice ASCII superiore a +127 oppure una combinazione a due caratteri di una barra inversa +seguita da @code{`}, @code{'}, @code{"} o @code{^}. + +@c " to balance double quotes for not-so-bright context-sensitive editors + +Per avere un maggior controllo sull'aspetto del testo si può usare +@code{\markup} all'interno del testo. Per una spiegazione delle +molte opzioni disponibili leggere @ref{Formatting text}. + +@snippets + +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{formatting-lyrics-syllables.ly} + + +@seealso +Manuale di apprendimento: +@rlearning{Canzoni}. + +Guida alla notazione: +@ref{Automatic syllable durations}, +@ref{Fonts}, +@ref{Formatting text}, +@ref{Input modes}, +@ref{Manual syllable durations}, +@ref{Special characters}. + +Guida al funzionamento interno: +@rinternals{LyricText}. + +Frammenti: +@rlsr{Text}. + + +@node Allineamento del testo alla melodia +@unnumberedsubsubsec Allineamento del testo alla melodia +@translationof Aligning lyrics to a melody + +@cindex testo vocale, allineamento a una melodia +@cindex @code{associatedVoice} +@funindex \lyricmode +@funindex \addlyrics +@funindex \lyricsto + +Il testo vocale viene interpretato in @code{\lyricmode} e stampato in un +contesto @code{Lyrics}, vedi @ref{Contexts explained}. + +@example +\new Lyrics \lyricmode @{ @dots{} @} +@end example + +Due varianti di @code{\lyricmode} impostano un contesto associato +usato per sincronizzare le sillabe del testo con la musica. Il più +comodo @code{\addlyrics} segue immediatamente il contenuto musicale +del contesto della voce con cui deve essere sincronizzato, creando +implicitamente un contesto Lyrics. Il più versatile @code{\lyricsto} +richiede sia di specificare il contesto della voce associata con un +nome sia di creare esplicitamente un contesto Lyrics che contenga il +testo. Maggiori dettagli in @ref{Automatic syllable durations}. + +Ci sono due modi per allineare il testo a una melodia: + +@itemize + +@item +Il testo può essere allineato automaticamente in modo che le +durate delle sillabe siano prese da un'altra voce o (in +circostanze speciali) da una melodia associata, usando +@code{\addlyrics}, @code{\lyricsto} o impostando la proprietà +@code{associatedVoice}. Ulteriori informazioni in +@ref{Automatic syllable durations}. + +@lilypond[quote,ragged-right,verbatim] +<< + \new Staff << + \time 2/4 + \new Voice = "one" \relative { + \voiceOne + c''4 b8. a16 g4. r8 a4 ( b ) c2 + } + \new Voice = "two" \relative { + \voiceTwo + s2 s4. f'8 e4 d c2 + } + >> + +% prende le durate e l'allineamento dalle note in "one" + \new Lyrics \lyricsto "one" { + Life is __ _ love, live __ life. + } + +% prende le durate e l'allineamento dalle note in "one" inizialmente +% poi passa a "two" + \new Lyrics \lyricsto "one" { + No more let + \set associatedVoice = "two" % deve essere impostato prima della sillaba + sins and sor -- rows grow. + } +>> +@end lilypond + +La prima strofa mostra il modo normale di inserire il testo. + +La seconda strofa mostra come cambiare la voce da cui prendere +le durate per le sillabe del testo. Ciò è utile se le parole +di strofe diverse si distribuiscono lungo le note in modo differente e +tutte le durate sono disponibili nei contesti della voce. Ulteriori +dettagli in @ref{Stanzas}. + +@item +Il testo può essere allineato indipendentemente dalla durata +delle note se le durate delle sillabe vengono specificate esplicitamente +e inserite con @code{\lyricmode}. + +@lilypond[quote,ragged-right,verbatim] +<< + \new Voice = "one" \relative { + \time 2/4 + c''4 b8. a16 g4. f8 e4 d c2 + } + +% usa la durata esplicita precedente di 2; + \new Lyrics \lyricmode { + Joy to the earth! + } + +% durate esplicite, impostate su un ritmo diverso + \new Lyrics \lyricmode { + Life4 is love,2. live4 life.2 + } +>> +@end lilypond + +La prima strofa non è allineata con le note perché le durate non +sono state specificate, e il valore precedente di 2 viene usato +per ogni parola. + +La seconda strofa mostra come le parole possano essere allineate +in modo del tutto indipendente dalle note. Ciò è utile se le +parole di strofe diverse si distribuiscono lungo le note in modo differente +e le durate necessarie non sono disponibili in un contesto musicale. +Ulteriori dettagli in @ref{Manual syllable durations}. Questa tecnica +è utile anche quando si imposta un dialogo sopra una musica, come +si può vedere negli esempi in @ref{Dialogue over music}. + +@end itemize + +@seealso +Manuale di apprendimento: +@rlearning{Allineare il testo alla melodia}. + +Guida alla notazione: +@ref{Contexts explained}, +@ref{Automatic syllable durations}, +@ref{Stanzas}, +@ref{Manual syllable durations}, +@ref{Dialogue over music}, +@ref{Manual syllable durations}. + +Guida al funzionamento interno: +@rinternals{Lyrics}. + + +@node Durate automatiche delle sillabe +@unnumberedsubsubsec Durate automatiche delle sillabe +@translationof Automatic syllable durations + +@cindex sillabe, durata automatica +@cindex testo vocale e melodie +@cindex associatedVoice +@funindex \addlyrics +@funindex \lyricsto + +Il testo vocale può essere allineato automaticamente alle note di +una melodia in tre modi: + +@itemize + +@item +specificando il nome del contesto Voice contenente la melodia +con @code{\lyricsto}, + +@item +introducendo il testo con @code{\addlyrics} e inserendolo subito +dopo il contesto Voice contenente la melodia, + +@item +impostando la proprietà @code{associatedVoice}, l'allineamento del +testo può essere cambiato su un contesto Voice con un nome diverso +in qualsiasi momento musicale. + +@end itemize + +In tutti questi tre metodi è possibile disegnare dei trattini tra +le sillabe di una parola e delle linee di estensione oltre la +fine di una parola. Maggiori dettagli in @ref{Extenders and hyphens}. + +Il contesto @code{Voice} contenente la melodia al quale il testo si +deve allineare non deve essere @qq{morto}, altrimenti +il testo successivo a quel punto verrà perduto. Questo può accadere +se ci sono dei momenti in cui quella voce non ha nulla da fare. +Metodi per mantenere attivi i contesti sono descritti in +@ref{Keeping contexts alive}. + +@subheading Uso di @code{\lyricsto} + +@cindex \lyricsto +@funindex \lyricsto + +Il testo vocale può essere allineato a una melodia automaticamente +specificando il nome del contesto voce con @code{\lyricsto}: + +@lilypond[quote,verbatim] +<< + \new Voice = "melody" \relative { + a'1 a4. a8 a2 + } + \new Lyrics \lyricsto "melody" { + These are the words + } +>> +@end lilypond + +@noindent +In questo modo il testo viene allineato alle note del contesto @code{Voice} +con quel nome, che deve già esistere. Ecco perché di solito il contesto +@code{Voice} viene indicato prima, seguito dal contesto @code{Lyrics}. +Il testo segue il comando @code{\lyricsto}. Il comando @code{\lyricsto} +invoca la modalità testo automaticamente. Per impostazione predefinita, +il testo viene posizionato sotto le note. Altri posizionamenti sono +descritti in @ref{Placing lyrics vertically}. + +@subheading Uso di @code{\addlyrics} + +@cindex \addlyrics +@funindex \addlyrics + +Il comando @code{\addlyrics} è solo una comoda scorciatoia da usare +per evitare di impostare il testo tramite una struttura più complessa. + +@example +@{ MUSICA @} +\addlyrics @{ TESTO VOCALE @} +@end example + +@noindent +equivale a + +@example +\new Voice = "blah" @{ MUSICA @} +\new Lyrics \lyricsto "blah" @{ TESTO VOCALE @} +@end example + +Ecco un esempio, + +@lilypond[verbatim,quote] +{ + \time 3/4 + \relative { c'2 e4 g2. } + \addlyrics { play the game } +} +@end lilypond + +Si possono aggiungere più strofe aggiungendo più sezioni +@code{\addlyrics}: + + +@lilypond[ragged-right,verbatim,quote] +{ + \time 3/4 + \relative { c'2 e4 g2. } + \addlyrics { play the game } + \addlyrics { speel het spel } + \addlyrics { joue le jeu } +} +@end lilypond + +Il comando @code{\addlyrics} non può gestire le impostazioni +polifoniche. Inoltre non può essere usato per associare il +testo alla voce per intavolatura (@code{TabVoice}). +In questi casi bisogna usare @code{\lyricsto}. + +@subheading Uso di associatedVoice + +La melodia a cui allineare il testo vocale può essere cambiata +impostando la proprietà @code{associatedVoice}, + +@example +\set associatedVoice = #"lala" +@end example + +@noindent + +Il valore della proprietà (qui: @code{"lala"}) deve essere il nome +di un contesto @code{Voice}. Per ragioni tecniche, il comando @code{\set} +deve essere posizionato una sillaba prima prima di quella alla quale +si riferisce il cambio di voce. + +Ecco un esempio che ne dimostra l'utilizzo: + +@lilypond[quote,ragged-right,verbatim] +<< + \new Staff << + \time 2/4 + \new Voice = "one" \relative { + \voiceOne + c''4 b8. a16 g4. r8 a4 ( b ) c2 + } + \new Voice = "two" \relative { + \voiceTwo + s2 s4. f'8 e8 d4. c2 + } + >> +% inizialmente prende le note e le durate da "one" +% poi passa a "two" + \new Lyrics \lyricsto "one" { + No more let + \set associatedVoice = "two" % must be set one syllable early + sins and sor -- rows grow. + } +>> +@end lilypond + +@seealso +Guida alla notazione: +@ref{Extenders and hyphens}, +@ref{Keeping contexts alive}, +@ref{Placing lyrics vertically}. + + +@node Durate manuali delle sillabe +@unnumberedsubsubsec Durate manuali delle sillabe +@translationof Manual syllable durations + +In alcune musiche vocali complesse, si potrebbe voler posizionare +il testo in modo totalmente indipendente dalle note. In tali casi +non bisogna usare @code{\lyricsto} o @code{\addlyrics} e nemmeno +impostare @code{associatedVoice}. Le sillabe verranno invece +inserite come se fossero note, ma col testo al posto delle altezze, +e la durata di ogni sillaba sarà indicata esplicitamente dopo la +sillaba. + +Si possono mostrare le linee tratteggiate tra le sillabe come sempre, +mentre le linee di estensione non appaiono se non c'è una voce associata. + +Ecco due esempi: + +@lilypond[verbatim,quote] +<< + \new Voice = "melody" \relative { + c''2 a f f e e + } + \new Lyrics \lyricmode { + c4. -- a -- f -- f -- e2. -- e + } +>> +@end lilypond + + +@lilypond[quote,verbatim,ragged-right] +<< + \new Staff { + \relative { + c''2 c2 + d1 + } + } + \new Lyrics { + \lyricmode { + I2 like4. my8 cat!1 + } + } + \new Staff { + \relative { + c'8 c c c c c c c + c8 c c c c c c c + } + } +>> +@end lilypond + +Questa tecnica è utile quando si scrivono dialoghi , vedi +@ref{Dialogue over music}. + +Per cambiare l'allineamento delle sillabe, basta impostare la +proprietà @code{self-alignment-X}: + +@lilypond[verbatim,quote] +<< + \new Voice = "melody" \relative { + \time 3/4 + c'2 e4 g2 f + } + \new Lyrics \lyricmode { + \override LyricText.self-alignment-X = #LEFT + play1 a4 game4 + } +>> +@end lilypond + + +@seealso +Guida alla notazione: +@ref{Dialogue over music}. + +Guida al funzionamento interno: +@rinternals{Lyrics}, +@rinternals{Voice}. + + +@node Più sillabe in una nota +@unnumberedsubsubsec Più sillabe in una nota +@translationof Multiple syllables to one note + +@funindex _ +@cindex spazi, nel testo vocale +@cindex virgolette, nel testo vocale +@cindex legature, nel testo vocale + +Per assegnare più di una sillaba a una singola nota mantenendo uno +spazio tra le sillabe, occorre mettere la frase tra virgolette o +usare il carattere @code{_}. Altrimenti si può usare il simbolo +tilde (@code{~}) per ottenere una legatura di valore per il testo. + +@lilypond[quote,ragged-right,verbatim] +{ + \relative { + \autoBeamOff + r8 b' c fis, fis c' b e, + } + \addlyrics + { + \override LyricHyphen.minimum-distance = #1.0 % Ensure hyphens are visible + Che_in ques -- ta_e_in quel -- l'al -- tr'on -- da + } + \addlyrics { "Che in" ques -- "ta e in" quel -- l'al -- tr'on -- da } + \addlyrics { Che~in ques -- ta~e~in quel -- l'al -- tr'on -- da } +} +@end lilypond + +@seealso +Guida al funzionamento interno: +@rinternals{LyricCombineMusic}. + + +@node Più note in una sillaba +@unnumberedsubsubsec Più note in una sillaba +@translationof Multiple notes to one syllable + +@cindex melisma +@cindex fraseggio, nel testo vocale +@funindex \melisma +@funindex \melismaEnd + +Talvolta, in particolare nella musica medievale e barocca, molte +note vengono cantate in una sillaba; si chiama melisma (vedi +@rglos{melisma}). La sillaba di un melisma viene solitamente +allineata a sinistra della prima nota del melisma. + +Quando un melisma si trova su una sillaba diversa dall'ultima in +una parola, quella sillaba di solito viene collegata a quella successiva +con una linea tratteggiata. Ciò si indica inserendo un doppio +trattino @w{@code{--}}, subito dopo la sillaba. + +Altrimenti, se un melisma si trova sull'ultima o unica sillaba in +una parola, solitamente appare una linea di estensione dalla fine +della sillaba all'ultima nota del melisma. Ciò si indica inserendo +un doppio trattino basso, @code{__}, subito dopo la parola. + +Esistono cinque modi per indicare i melismi: + +@itemize + +@item +I melismi vengono creati automaticamente sulle note legate insieme: + +@lilypond[quote,verbatim] +<< + \new Voice = "melody" \relative { + \time 3/4 + f''4 g2 ~ | + 4 e2 ~ | + 8 + } + \new Lyrics \lyricsto "melody" { + Ky -- ri -- e __ + } +>> +@end lilypond + +@item +I melismi possono essere creati automaticamente dalla musica inserendo +delle legature di portamento sulle note di ogni melisma. Questo è +il modo più comune di inserire il testo: + +@lilypond[quote,verbatim] +<< + \new Voice = "melody" \relative { + \time 3/4 + f''4 g8 ( f e f ) + e8 ( d e2 ) + } + \new Lyrics \lyricsto "melody" { + Ky -- ri -- e __ + } +>> +@end lilypond + +Attenzione: le legature di frase non causano la creazione di melismi. + +@item +Le note sono considerate un melisma se le loro travature sono +disposte manualmente, purché la travatura automatica sia disabilitata. +Vedi @ref{Setting automatic beam behavior}. + +@lilypond[quote,verbatim] +<< + \new Voice = "melody" \relative { + \time 3/4 + \autoBeamOff + f''4 g8[ f e f] + e2. + } + \new Lyrics \lyricsto "melody" { + Ky -- ri -- e + } +>> +@end lilypond + +Ovviamente ciò non è adatto ai melismi su note più lunghe degli ottavi. + +@item +Un gruppo di note privo di legature sarà trattato come un melisma +se sono comprese tra @code{\melisma} @code{\melismaEnd}. + +@lilypond[quote,verbatim] +<< + \new Voice = "melody" \relative { + \time 3/4 + f''4 g8 + \melisma + f e f + \melismaEnd + e2. + } + \new Lyrics \lyricsto "melody" { + Ky -- ri -- e + } +>> +@end lilypond + +@item +Un melisma può essere definito interamente nel testo inserendo un +solo trattino basso, @code{_}, per ogni nota ulteriore da aggiungere +al melisma. + +@lilypond[verbatim, quote] +<< + \new Voice = "melody" \relative { + \time 3/4 + f''4 g8 f e f + e8 d e2 + } + \new Lyrics \lyricsto "melody" { + Ky -- ri -- _ _ _ e __ _ _ + } +>> +@end lilypond + +@end itemize + +È possibile avere legature di portamento e di valore e travature manuali +nella melodia senza che indichino i melismi. Per farlo si imposta +@code{melismaBusyProperties}: + +@lilypond[verbatim,quote] +<< + \new Voice = "melody" \relative { + \time 3/4 + \set melismaBusyProperties = #'() + c'4 d ( e ) + g8 [ f ] f4 ~ 4 + } + \new Lyrics \lyricsto "melody" { + Ky -- ri -- e e -- le -- i -- son + } +>> +@end lilypond + +Altre impostazioni di @code{melismaBusyProperties} possono essere +usate per includere o escludere selettivamente legature di valore +e di portamento e travature dal rilevamento automatico del melisma; +consultare @code{melismaBusyProperties} in @rinternals{Tunable context properties}. + +Altrimenti, se si vuole ignorare tutte le indicazioni di melisma, basta +impostare @code{ignoreMelismata} su vero; vedi @ref{Stanzas with different rhythms}. + +Se un melisma è necessario in un passaggio in cui @code{melismaBusyProperties} +è attivo, lo si può indicare inserendo un singolo trattino basso nel testo +per ogni nota che debba essere inclusa nel melisma: + +@lilypond[verbatim,quote] +<< + \new Voice = "melody" \relative { + \time 3/4 + \set melismaBusyProperties = #'() + c'4 d ( e ) + g8 [ f ] ~ f4 ~ 4 + } + \new Lyrics \lyricsto "melody" { + Ky -- ri -- _ e __ _ _ _ + } +>> +@end lilypond + + +@predefined + +@code{\autoBeamOff}, +@code{\autoBeamOn}, +@code{\melisma}, +@code{\melismaEnd}. + +@seealso +Glossario musicale: +@rglos{melisma}. + +Manuale di apprendimento: +@rlearning{Allineare il testo alla melodia}. + +Guida alla notazione: +@ref{Aligning lyrics to a melody}, +@ref{Automatic syllable durations}, +@ref{Setting automatic beam behavior}, +@ref{Stanzas with different rhythms}. + +Guida al funzionamento interno: +@rinternals{Tunable context properties}. + +@knownissues +Le linee di estensione sotto i melismi non vengono creati automaticamente; +devono essere inseriti a mano con un doppio trattino basso. + + +@node Estensori e trattini +@unnumberedsubsubsec Estensori e trattini +@translationof Extenders and hyphens + +@cindex melisma +@cindex estensore + +@c TODO cf Multiple notes to one syllable; should this be merged in? + +@c leave this as samp. -gp +Nell'ultima sillaba di una parola, i melismi sono talvolta indicati +con una lunga linea orizzontale che inizia dalla sillaba del melisma +e termina in quella successiva. Tale linea viene chiamata linea di +estensione e si inserisce con @samp{ __ } (notare gli spazi prima e +dopo i due caratteri). + +@warning{I melismi appaiono nella partitura come linee di estensione, +che si inseriscono con un doppio trattino basso; ma i melismi brevi +si possono inserire anche saltando note singole +but short melismata can +also be entered by skipping individual notes, which are entered as +single underscore characters; these do not make an extender line to be +typeset by default.} + +@cindex hyphens + +@c leave this as samp. -gp +Il trattino centrato si inserisce con @samp{ -- } tra le sillabe di +una stessa parola (notare gli spazi prima e dopo i due caratteri). +Il trattino sarà centrato tra le sillabe e la sua lunghezza sarà +regolata a seconda dello spazio tra le sillabe. + +Nelle partiture compresse i trattini possono essere eliminati. +Questo comportamento è controllato da due proprietà di @code{LyricHyphen}: +@code{minimum-distance} (distanza minima tra le due sillabe) e +@code{minimum-length} (soglia sotto la quale i trattini vengono rimossi). + +@seealso +Guida al funzionamento interno: +@rinternals{LyricExtender}, +@rinternals{LyricHyphen}. + + +@node Tecniche specifiche per il testo vocale +@subsection Tecniche specifiche per il testo vocale +@translationof Techniques specific to lyrics + +@c TODO this whole section is to be reorganised + +@menu +* Lavorare con testo e variabili:: +* Posizionamento verticale del testo:: +* Posizionamento orizzontale delle sillabe:: +* Testo e ripetizioni:: +* Testi alternati:: +* Polifonia con testo in comune:: +@end menu + + + +@node Lavorare con testo e variabili +@unnumberedsubsubsec Lavorare con testo e variabili +@translationof Working with lyrics and variables + +@cindex testo vocale, uso delle variabili + +Si possono creare delle variabili contenenti il testo vocale, ma questo +deve essere inserito in modalità testo vocale: + +@lilypond[quote,verbatim] +musicOne = \relative { + c''4 b8. a16 g4. f8 e4 d c2 +} +verseOne = \lyricmode { + Joy to the world, the Lord is come. +} +\score { + << + \new Voice = "one" { + \time 2/4 + \musicOne + } + \new Lyrics \lyricsto "one" { + \verseOne + } + >> +} +@end lilypond + +Non è necessario aggiungere le durate se la variabile viene richiamata +con @code{\addlyrics} o @code{\lyricsto}. +Se la musica ha un ordine diverso e più complesso, conviene definire +prima le variabili che contengono la musica e il testo, poi impostare +la gerarchia di righi e testo, omettendo il testo stesso, e infine +aggiungere il testo all'interno di un blocco @code{\context}. Ciò +garantisce che le voci richiamate da @code{\lyricsto} siano sempre +state definite prima. Per esempio: + +@lilypond[quote,verbatim] +sopranoMusic = \relative { c''4 c c c } +contraltoMusic = \relative { a'4 a a a } +sopranoWords = \lyricmode { Sop -- ra -- no words } +contraltoWords = \lyricmode { Con -- tral -- to words } + +\score { + \new ChoirStaff << + \new Staff { + \new Voice = "sopranos" { + \sopranoMusic + } + } + \new Lyrics = "sopranos" + \new Lyrics = "contraltos" + \new Staff { + \new Voice = "contraltos" { + \contraltoMusic + } + } + \context Lyrics = "sopranos" { + \lyricsto "sopranos" { + \sopranoWords + } + } + \context Lyrics = "contraltos" { + \lyricsto "contraltos" { + \contraltoWords + } + } + >> +} +@end lilypond + +@seealso +Guida alla notazione: +@ref{Placing lyrics vertically}. + +Guida al funzionamento interno: +@rinternals{LyricCombineMusic}, +@rinternals{Lyrics}. + + +@node Posizionamento verticale del testo +@unnumberedsubsubsec Posizionamento verticale del testo +@translationof Placing lyrics vertically + +@cindex posizionamento del testo +@cindex testo, posizionamento + +A seconda del tipo di musica, il testo può trovarsi sopra o sotto +il rigo oppure tra i righi. Posizionare il testo sotto il rigo +associato è il modo più semplice, infatti basta definire il +contesto @code{Lyrics} sotto il contesto @code{Staff}; + +@lilypond[quote,verbatim] +\score { + << + \new Staff { + \new Voice = "melody" { + \relative { c''4 c c c } + } + } + \new Lyrics { + \lyricsto "melody" { + Here are the words + } + } + >> +} +@end lilypond + +Per posizionare il testo sopra il rigo ci sono due metodi. Il metodo più +semplice (e preferito) consiste nell'usare la stessa sintassi precedente e +indicare in modo esplicito la posizione del testo: + +@lilypond[quote,verbatim] +\score { + << + \new Staff = "staff" { + \new Voice = "melody" { + \relative { c''4 c c c } + } + } + \new Lyrics \with { alignAboveContext = "staff" } { + \lyricsto "melody" { + Here are the words + } + } + >> +} +@end lilypond + +Altrimenti si possono usare due passaggi. Prima si dichiara il +contesto Lyrics (privo di contenuto) prima dei contesti Staff e +Voice, poi il comando @code{\lyricsto} viene posizionato dopo la +voce a cui si riferisce tramite @code{\context}. Ecco un esempio: + +@lilypond[quote,verbatim] +\score { + << + \new Lyrics = "lyrics" \with { + % il testo sopra un rigo deve avere questo override + \override VerticalAxisGroup.staff-affinity = #DOWN + } + \new Staff { + \new Voice = "melody" { + \relative { c''4 c c c } + } + } + \context Lyrics = "lyrics" { + \lyricsto "melody" { + Here are the words + } + } + >> +} +@end lilypond + +Quando ci sono due voci in righi separati, si può posizionare il testo +tra i righi usando uno di questi metodi. Ecco un esempio del secondo +metodo: + +@lilypond[quote,verbatim] +\score { + \new ChoirStaff << + \new Staff { + \new Voice = "sopranos" { + \relative { c''4 c c c } + } + } + \new Lyrics = "sopranos" + \new Lyrics = "contraltos" \with { + % il testo sopra un rigo deve avere questo override + \override VerticalAxisGroup.staff-affinity = #DOWN + } + \new Staff { + \new Voice = "contraltos" { + \relative { a'4 a a a } + } + } + \context Lyrics = "sopranos" { + \lyricsto "sopranos" { + Sop -- ra -- no words + } + } + \context Lyrics = "contraltos" { + \lyricsto "contraltos" { + Con -- tral -- to words + } + } + >> +} +@end lilypond + +Si possono generare altre combinazioni di testo e righi a partire +da questi esempi oppure studiando i modelli nel +Manuale di apprendimento, vedi @rlearning{Modelli per gruppi vocali}. + +@snippets +@lilypondfile[verbatim,quote,texidoc,doctitle] +{obtaining-2.12-lyrics-spacing-in-newer-versions.ly} + +@seealso +Manuale di apprendimento: +@rlearning{Modelli per gruppi vocali}. + +Guida alla notazione: +@ref{Context layout order}, +@ref{Creating and referencing contexts}. + + +@node Posizionamento orizzontale delle sillabe +@unnumberedsubsubsec Posizionamento orizzontale delle sillabe +@translationof Placing syllables horizontally + +@cindex spaziatura del testo +@cindex testo vocale, aumentare lo spazio tra + +Per aumentare lo spazio tra le righe del testo, si imposta la proprietà +@code{minimum-distance} di @code{LyricSpace}. + +@lilypond[verbatim,quote,ragged-right] +\relative c' { + c c c c + \override Lyrics.LyricSpace.minimum-distance = #1.0 + c c c c +} +\addlyrics { + longtext longtext longtext longtext + longtext longtext longtext longtext +} +@end lilypond + +@noindent +Per applicare questa modifica a tutti i testi della partitura, impostare la +proprietà nel blocco @code{\layout}. + +@lilypond[verbatim,quote,ragged-right] +\score { + \relative { + c' c c c + c c c c + } + \addlyrics { + longtext longtext longtext longtext + longtext longtext longtext longtext + } + \layout { + \context { + \Lyrics + \override LyricSpace.minimum-distance = #1.0 + } + } +} +@end lilypond + +@snippets +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{lyrics-alignment.ly} + +@c TODO: move to LSR -vv + +Verificare che le annotazioni testuali e il testo vocale stiano dentro i +margini richiede ulteriori calcoli. Se si desidera velocizzare un po' +l'elaborazione, tale funzionalità può essere disabilitata: + +@example +\override Score.PaperColumn.keep-inside-line = ##f +@end example + +Per far sì che il testo eviti anche le stanghette, usare + +@example +\layout @{ + \context @{ + \Lyrics + \consists "Bar_engraver" + \consists "Separating_line_group_engraver" + \hide BarLine + @} +@} +@end example + +@node Testo e ripetizioni +@unnumberedsubsubsec Testo e ripetizioni +@translationof Lyrics and repeats + +@cindex ripetizioni e testo vocale +@cindex testo vocale, ripetizioni + +@subheading Ripetizioni semplici + +Le ripetizioni in @emph{musica} sono trattate in un'altra sezione: +@ref{Repeats}. Questa sezione spiega come aggiungere del testo +vocale a delle parti musicali ripetute. + +Il testo che si riferisce a una sezione musicale ripetuta deve +avere lo stesso costrutto di ripetizione della musica, se le +parole non sono modificate. + +@lilypond[verbatim,quote] +\score { + << + \new Staff { + \new Voice = "melody" { + \relative { + a'4 a a a + \repeat volta 2 { b4 b b b } + } + } + } + \new Lyrics { + \lyricsto "melody" { + Non ri -- petu -- to. + \repeat volta 2 { Ri -- petu -- to due. } + } + } + >> +} +@end lilypond + +Le parole verranno poi espanse correttamente se le ripetizioni +sono ripetute. + +@lilypond[verbatim,quote] +\score { + \unfoldRepeats { + << + \new Staff { + \new Voice = "melody" { + \relative { + a'4 a a a + \repeat volta 2 { b4 b b b } + } + } + } + \new Lyrics { + \lyricsto "melody" { + Non ri -- petu -- to. + \repeat volta 2 { Ri -- petu -- to due. } + } + } + >> + } +} +@end lilypond + +Se la sezione ripetuta deve essere ripetuta di nuovo con parole diverse, +è sufficiente inserire tutte le parole: + +@lilypond[verbatim,quote,ragged-right] +\score { + << + \new Staff { + \new Voice = "melody" { + \relative { + a'4 a a a + \repeat unfold 2 { b4 b b b } + } + } + } + \new Lyrics { + \lyricsto "melody" { + Non ri -- petu -- to. + Parole della prima volta. + Parole della seconda volta. + } + } + >> +} +@end lilypond + +Quando le parole che si riferiscono a una ripetizione sono diverse, +le parole di ogni ripetizione devono essere inserite in contesti +@code{Lyrics} separati, annidati correttamente in sezioni parallele: + +@lilypond[verbatim,quote] +\score { + << + \new Staff { + \new Voice = "melody" { + \relative { + a'4 a a a + \repeat volta 2 { b4 b b b } + } + } + } + \new Lyrics \lyricsto "melody" { + Non ri -- petu -- to. + << + { Parole della prima volta. } + \new Lyrics { + \set associatedVoice = "melody" + Parole della seconda volta. + } + >> + } + >> +} +@end lilypond + +Si possono aggiungere più strofe in modo analogo: + +@lilypond[verbatim,quote] +\score { + << + \new Staff { + \new Voice = "singleVoice" { + \relative { + a'4 a a a + \repeat volta 3 { b4 b b b } + c4 c c c + } + } + } + \new Lyrics \lyricsto "singleVoice" { + Non ri -- petu -- to. + << + { Parole della prima volta. } + \new Lyrics { + \set associatedVoice = "singleVoice" + Parole della seconda volta. + } + \new Lyrics { + \set associatedVoice = "singleVoice" + Parole della terza volta. + } + >> + La sezione fi -- nale. + } + >> +} +@end lilypond + +@cindex alignBelowContext +@funindex alignBelowContext + +Tuttavia, se questo costrutto si trova all'interno di un contesto +multirigo come @code{ChoirStaff}, il testo della seconda e terza +strofa apparirà sotto il rigo inferiore. + +Per posizionarli correttamente usare @code{alignBelowContext}: + +@lilypond[verbatim,quote] +\score { + << + \new Staff { + \new Voice = "melody" { + \relative { + a'4 a a a + \repeat volta 3 { b4 b b b } + c4 c c c + } + } + } + \new Lyrics = "firstVerse" \lyricsto "melody" { + Non ri -- petu -- to. + << + { Parole della prima volta. } + \new Lyrics = "secondVerse" + \with { alignBelowContext = #"firstVerse" } { + \set associatedVoice = "melody" + Parole della seconda volta. + } + \new Lyrics = "thirdVerse" + \with { alignBelowContext = #"secondVerse" } { + \set associatedVoice = "melody" + Parole della terza volta.. + } + >> + La sezione fi -- nale. + } + \new Voice = "harmony" { + \relative { + f'4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 + } + } + >> +} +@end lilypond + + + +@c TODO positioning a common line of lyrics + +@subheading Ripetizioni con finali alternativi + +@cindex testo vocale, ripetizioni con finali alternativi +@cindex ripetere il testo vocale con finali alternativi +@cindex finali alternativi e testo vocale + +Se le parole della sezione ripetuta sono le stesse, e nessuno dei finali +alternativi inizia con una pausa, si può usare la stessa identica struttura sia +per il testo che per la musica. Ciò comporta il vantaggio che +@code{unfoldRepeats} espanderà correttamente sia la musica che il testo vocale. + +@lilypond[quote,verbatim] +\score { + << + \new Staff { + \time 2/4 + \new Voice = "melody" { + \relative { + a'4 a a a + \repeat volta 2 { b4 b } + \alternative { { b b } { b c } } + } + } + } + \new Lyrics { + \lyricsto "melody" { + Non ri -- petu -- to. + \repeat volta 2 { Ripe -- tu -- } + \alternative { { to due. } { to due. } } + } + } + >> +} +@end lilypond + +@funindex \skip +@cindex saltare le note nel teso vocale +@cindex testo vocale, saltare le note + +Ma quando la sezione ripetuta ha parole diverse o uno dei blocchi +@code{\alternative} inizia con una pausa, non si può usare il costrutto della +ripetizione per le parole e bisogna inserire manualmente i comandi @code{\skip} +per le note delle sezioni alternative prive di un testo corrispondente. + +Attenzione: non usare il trattino basso, @code{_}, per saltare le note, +perché il trattino basso indica un melisma e fa sì che la sillaba +precedente sia allineata a sinistra. + +@warning{Il comando @code{@bs{}skip} deve essere seguito da un numero, +ma questo numero viene ignorato se nel testo vocale la durata delle +sillabe deriva dalla durata delle note in una melodia associata attraverso +@code{\addlyrics} o @code{\lyricsto}. Ogni @code{@bs{}skip} salta una +singola nota di un qualsiasi valore, senza tener conto del valore del +numero che segue.} + +@lilypond[verbatim,quote,ragged-right] +\score { + << + \new Staff { + \time 2/4 + \new Voice = "melody" { + \relative { + \repeat volta 2 { b'4 b } + \alternative { { b b } { b c } } + c4 c + } + } + } + \new Lyrics { + \lyricsto "melody" { + Parole della prima volta. + \repeat unfold 2 { \skip 1 } + Termina qui. + } + } + \new Lyrics { + \lyricsto "melody" { + Pa -- role + \repeat unfold 2 { \skip 1 } + seconda volta. + } + } + >> +} +@end lilypond + +@cindex testo vocale e note legate +@funindex \repeatTie + +Quando una nota è legata verso uno o più finali alternativi, si usa +una legatura di valore per portare quella nota nel primo finale +alternativo e @code{\repeatTie} per portarla nel secondo e nei successivi. +Questa struttura comporta dei problemi di difficile allineamento quando +è presente il testo; si può ottenere un risultato più accettabile +aumentando la lunghezza delle sezioni alternative in modo che le note +legate siano contenute interamente al loro interno. + +La legatura crea un melisma nella prima alternativa, ma non nella seconda +e nelle successive, dunque per allineare il testo correttamente occorre +disabilitare la creazione automatica dei melismi dopo la sezione delle volte +e inserire dei salti manuali. + +@lilypond[quote,verbatim] +\score { + << + \new Staff { + \time 2/4 + \new Voice = "melody" { + \relative { + \set melismaBusyProperties = #'() + \repeat volta 2 { b'4 b ~} + \alternative { { b b } { b \repeatTie c } } + \unset melismaBusyProperties + c4 c + } + } + } + \new Lyrics { + \lyricsto "melody" { + \repeat volta 2 { Ecco una __ } + \alternative { + { \skip 1 strofa } + { \skip 1 sec } + } + onda strofa. + } + } + >> +} +@end lilypond + +Se @code{\unfoldRepeats} precede una sezione contenente @code{\repeatTie}, +bisogna togliere @code{\repeatTie} per evitare che appaiano entrambi i +tipi di legatura. + +Quando la sezione ripetuta ha parola diverse, non si può mettere il +testo in un blocco @code{\repeat} e bisogna inserire manualmente i +comandi @code{\skip}, come si è visto prima. + +@lilypond[quote,verbatim] +\score { + << + \new Staff { + \time 2/4 + \new Voice = "melody" { + \relative { + \repeat volta 2 { b'4 b ~} + \alternative { { b b } { b \repeatTie c } } + c4 c + } + } + } + \new Lyrics { + \lyricsto "melody" { + Ecco una __ strofa. + \repeat unfold 2 { \skip 1 } + } + } + \new Lyrics { + \lyricsto "melody" { + Eccone un' + \repeat unfold 2 { \skip 1 } + altra da cantare. + } + } + >> +} +@end lilypond + +Se si desidera mostrare gli estensori e i trattini subito prima o dopo +un finale alternativo, questi vanno inseriti a mano. + +@lilypond[quote,verbatim] +\score { + << + \new Staff { + \time 2/4 + \new Voice = "melody" { + \relative { + \repeat volta 2 { b'4 b ~} + \alternative { { b b } { b \repeatTie c } } + c4 c + } + } + } + \new Lyrics { + \lyricsto "melody" { + Ecco una __ strofa. + \repeat unfold 2 { \skip 1 } + } + } + \new Lyrics { + \lyricsto "melody" { + Ecco "una_" + \skip 1 + "_" sec -- onda strofa. + } + } + >> +} +@end lilypond + +@seealso +Guida alla notazione: +@ref{Keeping contexts alive}, +@ref{Repeats}. + +@c non sono affatto sicuro di questa traduzione -- fb +@node Testi alternati +@unnumberedsubsubsec Testi alternati +@translationof Divisi lyrics + +@cindex testo vocale alternato +@cindex testo vocale diviso + +Quando solo le parole e le durate di due parti differiscono mentre le +altezze sono le stesse, conviene disabilitare temporaneamente la rilevazione +automatica dei melismi e indicare il melisma nel testo cantato: + +@lilypond[quote,verbatim] +\score { + << + \new Voice = "melody" { + \relative c' { + \set melismaBusyProperties = #'() + \slurDown + \slurDashed + e4 e8 ( e ) c4 c | + \unset melismaBusyProperties + c + } + } + \new Lyrics \lyricsto "melody" { + They shall not o -- ver -- come + } + \new Lyrics \lyricsto "melody" { + We will _ + } + >> +} +@end lilypond + +Quando sia la musica che le parole differiscono, è meglio nominare i contesti +della voce in cui musica e testo sono diversi e assegnare il testo a quei +contesti specifici: + +@lilypond[verbatim,ragged-right,quote] +\score { + << + \new Voice = "melody" { + \relative { + << + { + \voiceOne + e'4 e8 e + } + \new Voice = "splitpart" { + \voiceTwo + c4 c + } + >> + \oneVoice + c4 c | + c + } + } + \new Lyrics \lyricsto "melody" { + They shall not o -- ver -- come + } + \new Lyrics \lyricsto "splitpart" { + We will + } + >> +} +@end lilypond + +Nella musica corale è comune avere una voce divisa in varie +misure. Il costrutto @code{<< @{@dots{}@} \\ @{@dots{}@} >>}, +in cui due (o più) espressioni musicali sono separate dalla +doppia barra inversa, potrebbe sembrare il modo giusto di +impostare le voci divise. Tuttavia questo costrutto assegna +@strong{tutte} le espressioni al suo interno a +@strong{NUOVI contesti Voice}, dunque @emph{nessun testo cantato} +sarà impostato per esse perché il testo si collegherà al contesto +della voce originale. Di norma, non è ciò che si desidera. +Il costrutto adatto in questa situazione è il passaggio polifonico +temporaneo, spiegato nella sezione @emph{Passaggi polifonici temporanei} +in @ref{Single-staff polyphony}. + + +@node Polifonia con testo in comune +@unnumberedsubsubsec Polifonia con testo in comune +@translationof Polyphony with shared lyrics + +@cindex NullVoice +@cindex polifonia, testo cantato condiviso +@cindex testo cantato, condiviso tra voci +@cindex \partcombine e testo cantato +@funindex \partcombine + +Quando due voci contenenti durate diverse condividono lo stesso +testo cantato, allineare il testo a una delle voci può creare +dei problemi nell'altra voce. Per esempio, il secondo estensore +del testo nell'esempio seguente è troppo corto, perché il testo +è allineato solo alla voce superiore: + +@lilypond[quote,verbatim] +soprano = \relative { b'8( c d c) d2 } +alto = \relative { g'2 b8( a g a) } +words = \lyricmode { la __ la __ } + +\new Staff << + \new Voice = "sopranoVoice" { \voiceOne \soprano } + \new Voice { \voiceTwo \alto } + \new Lyrics \lyricsto "sopranoVoice" \words +>> +@end lilypond + +Per ottenere il risultato desiderato, si allinea il testo a un +nuovo contesto @code{NullVoice} contenente una giusta combinazione +delle due voci. Le note del contesto @code{NullVoice} non appaiono +nello spartito, ma servono soltanto ad allineare il testo nel +modo corretto: + +@lilypond[quote,verbatim] +soprano = \relative { b'8( c d c) d2 } +alto = \relative { g'2 b8( a g a) } +aligner = \relative { b'8( c d c) b( a g a) } +words = \lyricmode { la __ la __ } + +\new Staff << + \new Voice { \voiceOne \soprano } + \new Voice { \voiceTwo \alto } + \new NullVoice = "aligner" \aligner + \new Lyrics \lyricsto "aligner" \words +>> +@end lilypond + +Questo metodo si può usare anche con la funzione @code{\partcombine}, +che di per sé non accetta il testo cantato: + +@lilypond[quote,verbatim] +soprano = \relative { b'8( c d c) d2 } +alto = \relative { g'2 b8( a g a) } +aligner = \relative { b'8( c d c) b( a g a) } +words = \lyricmode { la __ la __ } + +\new Staff << + \new Voice \partcombine \soprano \alto + \new NullVoice = "aligner" \aligner + \new Lyrics \lyricsto "aligner" \words +>> +@end lilypond + +@knownissues +La funzione @code{\addLyrics} funziona solo con testi vocali collegati +a contesti @code{Voice} e non può essere usata con @code{NullVoice}. + +@noindent +La funzione @code{\partcombine} è descritta in +@ref{Automatic part combining}. + +Infine, si può usare questo metodo anche quando le voci si trovano su +righi diversi e non è limitata a due sole voci: + +@lilypond[quote,verbatim] +soprano = \relative { b'8( c d c) d2 } +altoOne = \relative { g'2 b8( a b4) } +altoTwo = \relative { d'2 g4( fis8 g) } +aligner = \relative { b'8( c d c) d( d d d) } +words = \lyricmode { la __ la __ } + +\new ChoirStaff \with {\accepts NullVoice } << + \new Staff << + \soprano + \new NullVoice = "aligner" \aligner + >> + \new Lyrics \lyricsto "aligner" \words + \new Staff \partcombine \altoOne \altoTwo +>> +@end lilypond + + +@node Strofe +@subsection Strofe +@translationof Stanzas + +@menu +* Aggiungere i numeri di strofa:: +* Aggiungere le dinamiche alle strofe:: +* Aggiungere i nomi dei cantanti alle strofe:: +* Strofe con durate diverse:: +* Stampare le strofe alla fine:: +* Stampare le strofe alla fine in molteplici colonne:: +@end menu + + +@node Aggiungere i numeri di strofa +@unnumberedsubsubsec Aggiungere i numeri di strofa +@translationof Adding stanza numbers + +@cindex numeri di strofa +@cindex strofa, numeri di + +I numeri di strofa si aggiungono impostando @code{stanza}: + +@lilypond[quote,ragged-right,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. +} \addlyrics { + \set stanza = #"1. " + Hi, my name is Bert. +} \addlyrics { + \set stanza = #"2. " + Oh, ché -- ri, je t'aime +} +@end lilypond + + +@noindent +Questi numeri appaiono prima dell'inizio della prima sillaba. + +@c TODO Create and add snippet to show how two lines of a +@c stanza can be grouped together, along these lines: +@c (might need improving a bit) -td + +@ignore +leftbrace = \markup { \override #'(font-encoding . fetaBraces) \lookup +#"brace105" } + +stanzaOneOne = { + \set stanza = \markup { "1. " \leftbrace } + \lyricmode { Child, you're mine and I love you. + Lend thine ear to what I say. + + } +} + +stanzaOneThree = { +% \set stanza = \markup { " "} + \lyricmode { Child, I have no great -- er joy + Than to have you walk in truth. + + } +} + +\new Voice { + \repeat volta 2 { c'8 c' c' c' c' c' c'4 + c'8 c' c' c' c' c' c'4 } +} \addlyrics { \stanzaOneOne } + \addlyrics { \stanzaOneThree } + +@end ignore + +@node Aggiungere le dinamiche alle strofe +@unnumberedsubsubsec Aggiungere le dinamiche alle strofe +@translationof Adding dynamics marks to stanzas + +Le strofe che hanno un volume diverso possono essere indicate con un +segno di dinamica all'inizio di ogni strofa. In LilyPond, tutto ciò +che si trova di fronte a una strofa va nell'oggetto @code{StanzaNumber}; +lo stesso vale per i segni di dinamica. Per ragioni tecniche, bisogna +impostare la strofa fuori da @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 + +@node Aggiungere i nomi dei cantanti alle strofe +@unnumberedsubsubsec Aggiungere i nomi dei cantanti alle strofe +@translationof Adding singers' names to stanzas + +@cindex nome del cantante +@cindex cantante, nome del + +Si possono aggiungere anche i nomi dei cantanti. Appariranno +all'inizio del rigo, proprio come per i nomi degli strumenti. +Si creano impostando @code{vocalName}. Una versione abbreviata +si inserisce con @code{shortVocalName}. + +@lilypond[ragged-right,quote,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. +} \addlyrics { + \set vocalName = #"Bert " + Hi, my name is Bert. +} \addlyrics { + \set vocalName = #"Ernie " + Oh, ché -- ri, je t'aime +} +@end lilypond + +@node Strofe con durate diverse +@unnumberedsubsubsec Strofe con durate diverse +@translationof Stanzas with different rhythms + +Spesso, strofe diverse di una canzone sono collegate a una melodia in +modi leggermente diversi. Tali variazioni possono essere colte con +@code{\lyricsto}. + +@subsubheading Ignorare i melismi + +Può capitare ad esempio che il testo abbia un melisma in una strofa, +ma varie sillabe in un'altra. Una possibile soluzione consiste +nel far sì che la voce più veloce ignori il melisma, impostando +@code{ignoreMelismata} nel contesto Lyrics. + +@lilypond[verbatim,ragged-right,quote] +<< + \relative \new Voice = "lahlah" { + \set Staff.autoBeaming = ##f + c'4 + \slurDotted + f8.[( g16]) + a4 + } + \new Lyrics \lyricsto "lahlah" { + più len -- ta + } + \new Lyrics \lyricsto "lahlah" { + più + \set ignoreMelismata = ##t + velo -- ce + \unset ignoreMelismata + ancora + } +>> +@end lilypond + +@knownissues +Diversamente dalla maggior parte dei comandi @code{\set}, +@code{\set ignoreMelismata} non funziona se preceduto da @code{\once}. +Bisogna usare @code{\set} e @code{\unset} per contrassegnare il testo +in cui il melisma deve essere ignorato. + +@subsubheading Aggiungere le sillabe agli abbellimenti + +@cindex abbellimenti e testo cantato +@cindex testo cantato su abbellimenti + +Per impostazione predefinita, gli abbellimenti (ovvero le note inserite +con @code{\grace}) non sono assegnati alle sillabe quando si usa +@code{\lyricsto}, ma tale comportamento può essere modificato: + +@lilypond[verbatim,ragged-right,quote] +<< + \new Voice = melody \relative { + f'4 \appoggiatura a32 b4 + \grace { f16 a16 } b2 + \afterGrace b2 { f16[ a16] } + \appoggiatura a32 b4 + \acciaccatura a8 b4 + } + \new Lyrics + \lyricsto melody { + normal + \set includeGraceNotes = ##t + case, + gra -- ce case, + after -- grace case, + \set ignoreMelismata = ##t + app. case, + acc. case. + } +>> +@end lilypond + +@knownissues +Come per @code{associatedVoice}, @code{includeGraceNotes} deve essere +impostato al più tardi una sillaba prima di quella da mettere sotto +un abbellimento. Per il caso di un abbellimento proprio all'inizio +di un brano, meglio usare un blocco @code{\with} o @code{\context}: + +@lilypond[verbatim,ragged-right,quote] +<< + \new Voice = melody \relative c' { + \grace { c16( d e f } + g1) f + } + \new Lyrics \with { includeGraceNotes = ##t } + \lyricsto melody { + Ah __ fa + } +>> +@end lilypond + +@subsubheading Passare a una melodia alternativa + +@cindex associatedVoice +@cindex melodia alternativa, passare a + +Sono possibili variazioni più complesse nell'impostare testo e musica. +La melodia su cui è impostato il testo può essere modificata all'interno +del contesto del testo impostando la proprietà @code{associatedVoice}: + +@lilypond[verbatim,quote] +<< + \relative \new Voice = "lahlah" { + \set Staff.autoBeaming = ##f + c'4 + << + \new Voice = "alternative" { + \voiceOne + \tuplet 3/2 { + % mostra chiaramente le associazioni. + \override NoteColumn.force-hshift = #-3 + f8 f g + } + } + { + \voiceTwo + f8.[ g16] + \oneVoice + } >> + a8( b) c + } + \new Lyrics \lyricsto "lahlah" { + Ju -- ras -- sic Park + } + \new Lyrics \lyricsto "lahlah" { + % Complicato: bisogna impostare associatedVoice + % una sillaba prima di quella cui si applica! + \set associatedVoice = "alternative" % si applica a "ran" + Ty -- + ran -- + no -- + \set associatedVoice = "lahlah" % si applica a "rus" + sau -- rus Rex + } >> +@end lilypond + +@noindent +Il testo per la prima strofa viene impostato sulla melodia +@q{lahlah} nel solito modo, ma la seconda strofa è impostata +inizialmente sul contesto @code{lahlah} e passa poi alla melodia +@code{alternative} per le sillabe da @q{ran} a @q{sau}: + +@example +\set associatedVoice = "alternative" % si applica a "ran" +Ty -- +ran -- +no -- +\set associatedVoice = "lahlah" % si applica a "rus" +sau -- rus Rex +@end example + +@noindent +In questo esempio @code{alternative} è il nome del contesto @code{Voice} +contenente la terzina. + +Attenzione al posizionamento del comando @code{\set associatedVoice}: appare +una sillaba troppo presto, ma ciò è corretto. + +@warning{Il comando @code{\set associatedVoice} deve essere inserito +una sillaba @emph{prima} di quella in cui deve verificarsi il passaggio +alla nuova voce. In altre parole, il passaggio alla voce associata +accade una sillaba dopo quella che ci si aspetterebbe. Ciò è dovuto +a ragioni tecniche e non è un difetto di LilyPond.} + + +@node Stampare le strofe alla fine +@unnumberedsubsubsec Stampare le strofe alla fine +@translationof Printing stanzas at the end + +Talvolta si allinea una sola strofa alla musica e le strofe +rimanenti appaiono in forma di versi alla fine del brano. +Per ottenere ciò si aggiungono le strofe ulteriori in un +blocco @code{\markup} esterno al blocco della partitura. +Nell'esempio seguente si possono notare due modi di forzare +le interruzioni di linea in un blocco @code{\markup}. + +@lilypond[ragged-right,verbatim,quote] +melody = \relative { +e' d c d | e e e e | +d d e d | c1 | +} + +text = \lyricmode { +\set stanza = #"1." Ma- ry had a lit- tle lamb, +its fleece was white as snow. +} + +\score{ << + \new Voice = "one" { \melody } + \new Lyrics \lyricsto "one" \text +>> + \layout { } +} +\markup { \column{ + \line{ Verse 2. } + \line{ All the children laughed and played } + \line{ To see a lamb at school. } + } +} +\markup{ + \wordwrap-string #" + Verse 3. + + Mary took it home again, + + It was against the rule." +} +@end lilypond + + +@node Stampare le strofe alla fine in molteplici colonne +@unnumberedsubsubsec Stampare le strofe alla fine in molteplici colonne +@translationof Printing stanzas at the end in multiple columns + +Quando un brano ha molte strofe, queste sono spesso stampate in +molteplici colonne lungo la pagina. Un numero di strofa rientrato +spesso introduce ciascuna strofa. L'esempio seguente mostra come +riprodurre questo output in LilyPond. + +@lilypond[ragged-right,quote,verbatim] +melody = \relative { + c'4 c c c | d d d d +} + +text = \lyricmode { + \set stanza = #"1." + This is verse one. + It has two lines. +} + +\score { + << + \new Voice = "one" { \melody } + \new Lyrics \lyricsto "one" \text + >> + \layout { } +} + +\markup { + \fill-line { + \hspace #0.1 % sposta la colonna in avanti rispetto al margine sinistro; + % può essere tolto se lo spazio nella pagina è stretto + \column { + \line { \bold "2." + \column { + "This is verse two." + "It has two lines." + } + } + \combine \null \vspace #0.1 % aggiunge spazio verticale tra le strofe + \line { \bold "3." + \column { + "This is verse three." + "It has two lines." + } + } + } + \hspace #0.1 % aggiunge spazio orizzontale tra le colonne; + \column { + \line { \bold "4." + \column { + "This is verse four." + "It has two lines." + } + } + \combine \null \vspace #0.1 % aggiunge spazio verticale tra le strofe + \line { \bold "5." + \column { + "This is verse five." + "It has two lines." + } + } + } + \hspace #0.1 % dà ulteriore spazio sul margine destro; + % può essere tolto se lo spazio nella pagina è stretto + } +} +@end lilypond + + +@seealso +Guida al funzionamento interno: +@rinternals{LyricText}, +@rinternals{StanzaNumber}. + + +@node Canzoni +@subsection Canzoni +@translationof Songs + +@menu +* Riferimenti per canzoni:: +* Canzonieri:: +@end menu + +@node Riferimenti per canzoni +@unnumberedsubsubsec Riferimenti per canzoni +@translationof References for songs + +Le canzoni si scrivono solitamente su tre righi: la melodia per il +cantante nel rigo superiore e due righi per l'accompagnamento di +pianoforte in basso. Il testo della prima strofa appare immediatamente +sotto il rigo superiore. Se ci sono solo poche altre strofe, queste +possono essere poste subito sotto la prima; ma se ci sono più strofe di +quante ne possano essere contenute lì la seconda strofa e le successive +vengono stampate dopo la musica come testo separato. + +Tutti gli elementi della notazione necessari per scrivere canzoni sono +descritti dettagliatamente in altre parti della documentazione: + +@itemize + +@item +Per costruire la struttura del rigo: @ref{Displaying staves}. + +@item +Per scrivere la musica per pianoforte: +@ref{Keyboard and other multi-staff instruments}. + +@item +Per scrivere il testo da associare a una linea melodica: +@ref{Common notation for vocal music}. + +@item +Per posizionare il testo: @ref{Placing lyrics vertically}. + +@item +Per inserire le strofe: @ref{Stanzas}. + +@item +Le canzoni hanno spesso i nomi degli accordi che appaiono sopra i +righi. Questo argomento è trattato in @ref{Displaying chords}. + +@item +Per stampare i diagrammi degli accordi per l'accompagnamento per chitarra o +altri strumenti a tasti: @qq{Fret diagram markups} in @ref{Common notation for fretted strings}. + +@end itemize + +@seealso +Manuale di apprendimento: +@rlearning{Canzoni}. + +Guida alla notazione: +@ref{Common notation for vocal music}, +@ref{Displaying chords}, +@ref{Displaying staves}, +@ref{Keyboard and other multi-staff instruments}, +@ref{Placing lyrics vertically}, +@ref{Stanzas}. + +Frammenti: +@rlsr{Vocal music}. + + +@node Canzonieri +@unnumberedsubsubsec Canzonieri +@translationof Lead sheets + +I canzonieri (in inglese @emph{lead sheet}) si ottengono combinando le +parti vocali con la @q{modalità per accordi}; la sintassi è +spiegata in @ref{Chord notation}. + +@snippets +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{simple-lead-sheet.ly} + +@seealso +Guida alla notazione: +@ref{Chord notation}. + + +@node Musica corale +@subsection Musica corale +@translationof Choral + +@cindex anthems +@cindex part songs +@cindex oratorio +@cindex SATB + +Questa sezione tratta le questioni che hanno a che fare più direttamente +con la musica corale, compresi inni, cori polifonici, oratori, etc. + +@menu +* Riferimenti per musica corale:: +* Struttura di una partitura corale:: +* Voci divise:: +@end menu + +@node Riferimenti per musica corale +@unnumberedsubsubsec Riferimenti per musica corale +@translationof References for choral + +La musica corale viene solitamente rappresentata con due, tre o quattro +righi in un gruppo @code{ChoirStaff}. L'accompagnamento, se richiesto, +è posto sotto in un gruppo @code{PianoStaff}, che viene solitamente +rimpicciolito per le prove di opere corali @emph{a cappella}. Le note +di ogni parte vocale sono inserite in un contesto @code{Voice} e a ogni +rigo viene assegnato una sola parta vocale (ovvero un contesto @code{Voice}) o +una coppia di parti vocali (due contesti @code{Voice}). + +Le parole vengono poste nei contesti @code{Lyrics}, o sotto ciascun rigo +musicale corrispondente oppure una strofa sopra e una sotto il rigo musicale +se questo contiene musica per due parti. + +Vari argomenti comuni nella musica corale sono trattati dettagliatamente +in altre sezioni della documentazione: + +@itemize + +@item +Un'introduzione alla creazione di una partitura vocale SATB si trova +nel manuale di apprendimento: @rlearning{Partitura vocale a quattro parti SATB}. +È disponibile anche un modello integrato che semplifica la scrittura di +musica vocale SATB: @rlearning{Modelli integrati}. + +@item +Vari modelli adatti per vari stili di musica corale si trovano anche +nel manuale di apprendimento: @rlearning{Modelli per gruppi vocali}. + +@item +Le informazioni relative a @code{ChoirStaff} e @code{PianoStaff} si trovano +in @ref{Grouping staves}. + +@item +Le teste di nota a forma variabile, come quelle usate nello stile Sacred Harp e +notazione simile, sono descritte in @ref{Shape note heads}. + +@item +Quando due parti vocali si trovano su uno stesso rigo, i gambi, le +legature, etc. della parte più alta sono dirette in su e quelle della +parte più bassa sono rivolte in giù. Per farlo si usa @code{\voiceOne} e +@code{\voiceTwo}, come è spiegato in @ref{Single-staff polyphony}. + +@item +Quando una parte vocale si divide temporaneamente, si devono usare i +@emph{passaggi polifonici temporanei} +(vedi @ref{Single-staff polyphony}). + +@end itemize + +@predefined +@code{\oneVoice}, +@code{\voiceOne}, +@code{\voiceTwo}. + +@seealso +Manuale di apprendimento: +@rlearning{Partitura vocale a quattro parti SATB}, +@rlearning{Modelli per gruppi vocali}. + +Guida alla notazione: +@ref{Context layout order}, +@ref{Grouping staves}, +@ref{Shape note heads}, +@ref{Single-staff polyphony}. + +Frammenti: +@rlsr{Vocal music}. + +Guida al funzionamento interno: +@rinternals{ChoirStaff}, +@rinternals{Lyrics}, +@rinternals{PianoStaff}. + + +@node Struttura di una partitura corale +@unnumberedsubsubsec Struttura di una partitura corale +@translationof Score layouts for choral + +La musica corale contenente quattro righi, con o senza accompagnamento +del pianoforte, viene solitamente disposta in due sistemi per pagina. +A seconda della dimensione della pagina, ottenere ciò può richiedere +modifiche a varie impostazioni predefinite. Occorre considerare le +seguenti impostazioni: + +@itemize + +@item +La dimensione globale del rigo può essere modificata per cambiare la +dimensione degli elementi della partitura. Vedi @ref{Setting the staff size}. + +@item +Le distanze tra i sistemi, i righi e il testo cantato possono essere +tutte regolate in modo indipendente. Vedi @ref{Vertical spacing}. + +@item +Le dimensioni delle variabili di disposizione verticale possono essere +mostrate per facilitare la regolazione della spaziatura verticale. Questa +e altre possibilità per far entrare la musica in meno pagine sono +descritte in @ref{Fitting music onto fewer pages}. + +@item +Se il numero dei sistemi per pagina cambia da uno a due, è uso comune +indicare ciò con un separatore di sistema tra i due sistemi. Vedi +@ref{Separating systems}. + +@item +Per maggiori informazioni sulle proprietà di formattazione della pagina, +leggere @ref{Page layout}. + +@end itemize + + +Le indicazioni dinamiche sono poste, per impostazione predefinita, sotto +il rigo, ma nella musica corale sono poste solitamente sopra il rigo per +evitare il testo cantato. Il comando predefinito @code{\dynamicUp} permette +di ottenere ciò per le indicazioni dinamiche in un singolo contesto @code{Voice}. +Se ci sono molti contesti @code{Voice}, questo comando dovrebbe essere posto +in ciascuno di essi. Ma esiste la possibilità di usare una sola volta la +sua forma estesa, che sposta tutte le indicazioni dinamiche dell'intera +partitura sopra i loro rispettivi righi, come mostrato in questo esempio: + +@lilypond[verbatim,quote] +\score { + \new ChoirStaff << + \new Staff { + \new Voice { + \relative { g'4\f g g g } + } + } + \new Staff { + \new Voice { + \relative { d'4 d d\p d } + } + } + >> + \layout { + \context { + \Score + \override DynamicText.direction = #UP + \override DynamicLineSpanner.direction = #UP + } + } +} +@end lilypond + +@predefined +@code{\dynamicUp}, @code{\dynamicDown}, @code{\dynamicNeutral}. + +@seealso +Guida alla notazione: +@ref{Changing spacing}, +@ref{Displaying spacing}, +@ref{Fitting music onto fewer pages}, +@ref{Page layout}, +@ref{Score layout}, +@ref{Separating systems}, +@ref{Setting the staff size}, +@ref{Breaks}, +@ref{Vertical spacing}. + +Guida al funzionamento interno: +@rinternals{VerticalAxisGroup}, +@rinternals{StaffGrouper}. + + +@node Voci divise +@unnumberedsubsubsec Voci divise +@translationof Divided voices + +@cindex voci divise + +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{using-arpeggiobracket-to-make-divisi-more-visible.ly} + +@seealso +Guida alla notazione: +@ref{Expressive marks as lines}. + + +@node Opera e musical +@subsection Opera e musical +@translationof Opera and stage musicals + +La musica, il testo cantato e i dialoghi delle opere e dei musical +sono di solito impostati in una o più delle seguenti forme: + +@itemize + +@item +Una @emph{partitura del direttore} contenente l'intera partitura +orchestrale e le parti vocali, insieme a un libretto con le battute +d'entrata se ci sono dei passaggi parlati. + +@item +Le @emph{parti orchestrali} contenenti la musica degli strumenti +individuali dell'orchestra o della band. + +@item +Una @emph{partitura vocale} contenente tutte le parti vocali con +accompagnamento del pianoforte. L'accompagnamento di solito è +una riduzione orchestrale e in questo caso il nome dello strumento +orchestrale originale viene spesso indicato. Le partiture +vocali talvolta hanno anche le didascalie e il libretto +con le battute d'entrata. + +@item +Un @emph{libro vocale} contenente soltanto le parti vocali +(nessun accompagnamento), talvolta insieme al libretto. + +@item +Un @emph{libretto} contenente i passaggi estesi dei dialoghi +parlati solitamente presenti nei musical, insieme alle parole +delle parti cantate. Le didascalie sono solitamente incluse. +È possibile usare LilyPond per creare i libretti, ma dato che +non contengono musica è preferibile usare altri metodi. + +@end itemize + +Le sezioni della documentazione di LilyPond che trattano gli +argomenti necessari per creare partiture negli stili più comuni +nell'opera e nei musical sono indicati nei riferimenti seguenti. +A questi seguono sezioni che trattano le tecniche specifiche +che sono peculiari per le partiture di opera e musical. + +@menu +* Riferimenti per opera e musical:: +* Nomi dei personaggi:: +* Suggerimenti musicali:: +* Musica parlata:: +* Dialogo sopra la musica:: +@end menu + +@node Riferimenti per opera e musical +@unnumberedsubsubsec Riferimenti per opera e musical +@translationof References for opera and stage musicals + +@itemize + +@item +La partitura di un direttore d'orchestra contiene molti righi e +testi vocali raggruppati. I modi per raggruppare i righi sono +mostrati in @ref{Grouping staves}. Per annidare gruppi di +righi leggere @ref{Nested staff groups}. + +@item +La stampa di righi vuoti nelle partiture musicali e vocali dei direttori +è solitamente soppressa. Per creare tale partitura leggere +@ref{Hiding staves}. + +@item +La scrittura di parti orchestrali è trattata in @ref{Writing parts}. +Altre sezioni del capitolo Notazione specialistica potrebbero essere +rilevanti, a seconda dell'orchestrazione usata. Molti strumenti +sono strumenti traspositori, vedi @ref{Instrument transpositions}. + +@item +Se il numero di sistemi per pagina cambia da pagina a pagina, è di uso +comune separare i sistemi con un segno separatore di sistemi. +Vedi @ref{Separating systems}. + +@item +Per maggiori informazioni sulle proprietà di formattazione della pagina +leggere @ref{Page layout}. + +@item +Si possono inserire suggerimenti di dialogo, didascalie e note a pié di +pagina, vedi @ref{Creating footnotes} e @ref{Text}. Didascalie estese +possono essere aggiunte anche con una sezione di markup indipendenti +tra i due blocchi @code{\score}, vedi @ref{Separate text}. + +@end itemize + +@seealso +Glossario musicale: +@rglosnamed{Frenched score,Partitura senza righi vuoti}, +@rglosnamed{Frenched staves,Rigo temporaneo}, +@rglosnamed{transposing instrument,Strumento traspositore}. + +Guida alla notazione: +@ref{Creating footnotes}, +@ref{Grouping staves}, +@ref{Hiding staves}, +@ref{Instrument transpositions}, +@ref{Nested staff groups}, +@ref{Page layout}, +@ref{Separating systems}, +@ref{Transpose}, +@ref{Writing parts}, +@ref{Writing text}. + +Frammenti: +@rlsr{Vocal music}. + + +@node Nomi dei personaggi +@unnumberedsubsubsec Nomi dei personaggi +@translationof Character names + +@cindex nomi dei personaggi +@cindex personaggi, nomi dei + +I nomi dei personaggi sono solitamente mostrati a sinistra del rigo quando +il rigo è dedicato a quel personaggio soltanto: + +@lilypond[quote,verbatim,ragged-right] +\score { + << + \new Staff { + \set Staff.vocalName = \markup \smallCaps Kaspar + \set Staff.shortVocalName = \markup \smallCaps Kas. + \relative { + \clef "G_8" + c'4 c c c + \break + c4 c c c + } + } + \new Staff { + \set Staff.vocalName = \markup \smallCaps Melchior + \set Staff.shortVocalName = \markup \smallCaps Mel + \clef "bass" + \relative { + a4 a a a + a4 a a a + } + } + >> +} +@end lilypond + +Quando due o più personaggi condividono lo stesso rigo, il nome del +personaggio è solitamente collocato sopra il rigo all'inizio di ogni +sezione appartenente a quel personaggio. È possibile fare ciò con +i markup. Spesso si usa un tipo di carattere preciso a questo scopo. + +@lilypond[quote,verbatim] +\relative c' { + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c + \clef "bass" + a4^\markup \fontsize #1 \smallCaps Melchior + a a a + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c +} +@end lilypond + +Altrimenti, se ci sono molti cambi di personaggi, è più semplice +impostare una variabile per salvare le definizioni di ogni +personaggio, in modo che il cambio di personaggio possa essere +indicato in modo facile e conciso. + +@lilypond[quote,verbatim] +kaspar = { + \clef "G_8" + \set Staff.shortVocalName = "Kas." + \set Staff.midiInstrument = "voice oohs" + <>^\markup \smallCaps "Kaspar" +} + +melchior = { + \clef "bass" + \set Staff.shortVocalName = "Mel." + \set Staff.midiInstrument = "choir aahs" + <>^\markup \smallCaps "Melchior" +} + +\relative c' { + \kaspar + c4 c c c + \melchior + a4 a a a + \kaspar + c4 c c c +} +@end lilypond + +@seealso +Manuale di apprendimento: +@rlearning{Organizzare i brani con le variabili}. + +Guida alla notazione: +@ref{Text}, +@ref{Text markup commands}. + + +@node Suggerimenti musicali +@unnumberedsubsubsec Suggerimenti musicali +@translationof Musical cues + +@cindex suggerimenti musicali +@cindex cues + +I suggerimenti musicali possono essere inseriti nelle pariture vocali, nei +libri vocali e nelle parti orchestrali per indicare quale musica in un'altra +parte precede immediatamente un'entrata. I suggerimenti sono spesso inseriti +anche nella riduzione per pianoforte nelle partiture vocali per indicare +cosa sta suonando ogni strumento dell'orchestra. Ciò aiuta il direttore +quando non è disponibile la partitura completa. + +Il meccanismo di base per inserire i suggerimenti è spiegato dettagliatamente +in @ref{Quoting other voices} e @ref{Formatting cue notes}. Ma quando si +devono inserire molti suggerimenti, per esempio per aiutare il direttore +in una partitura vocale, il nome dello strumento deve essere posizionato +attentamente proprio prima dell'inizio delle citazioni in corpo più piccolo +(@qq{cue notes}). L'esempio seguente mostra come si fa. + +@lilypond[quote,verbatim] +flute = \relative { + s4 s4 e'' g +} +\addQuote "flute" { \flute } + +pianoRH = \relative { + c''4. g8 + % posiziona il nome dello strumento citato proprio prima delle citazioni in corpo piccolo, + % e sopra il rigo + <>^\markup { \right-align { \tiny "Flute" } } + \cueDuring "flute" #UP { g4 bes4 } +} +pianoLH = \relative { c4 e, } + +\score { + \new PianoStaff << + \new Staff { + \pianoRH + } + \new Staff { + \clef "bass" + \pianoLH + } + >> +} +@end lilypond + +Se viene citato uno strumento traspositore, la parte strumentale deve +specificare la sua armatura di chiave in modo che la conversione delle +sue notine sia fatta automaticamente. Il prossimo esempio mostra questa +trasposizioone per un clarinetto in Si bemolle. Le note in questo esempio +si trovano in basso nel rigo, quindi viene specificato @code{DOWN} in +@code{\cueDuring} (in modo che i gambi vadano giù) e il nome dello strumento +è posizionato sotto il rigo. + +@lilypond[quote,verbatim] +clarinet = \relative c' { + \transposition bes + fis4 d d c +} +\addQuote "clarinet" { \clarinet } + +pianoRH = \relative c'' { + \transposition c' + % posiziona il nome dello strumento citato sotto il rigo + <>_\markup { \right-align { \tiny "Clar." } } + \cueDuring "clarinet" #DOWN { c4. g8 } + g4 bes4 +} +pianoLH = \relative { c4 e, } + +\score { + << + \new PianoStaff << + \new Staff { + \new Voice { + \pianoRH + } + } + \new Staff { + \clef "bass" + \pianoLH + } + >> + >> +} +@end lilypond + +Da questi due esempi è evidente che inserire molte citazioni in corpo +piccolo in una partitura vocale sarebbe noioso, e le note della parte +per pianoforte sarebbero confuse. Tuttavia, come mostra il frammento +seguente, è possibile definire una funzione musicale per ridurre l'input +e rendere più chiare le note per pianoforte. + +@snippets +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{adding-orchestral-cues-to-a-vocal-score.ly} + +@seealso +Glossario musicale: +@rglosnamed{cue-notes,Notine o Citazioni in corpo più piccolo}. + +Guida alla notazione: +@ref{Aligning objects}, +@ref{Direction and placement}, +@ref{Formatting cue notes}, +@ref{Quoting other voices}, +@ref{Using music functions}. + +Frammenti: +@rlsr{Vocal music}. + +Guida al funzionamento interno: +@rinternals{CueVoice}. + +@knownissues +@code{\cueDuring} inserisce automaticamente un contesto @code{CueVoice} e +tutte le notine sono poste in quel contesto. Ciò significa che non è +possibile avere due sequenze sovrapposte di notine con questa tecnica. +Si possono inserire sequenze sovrapposte solo dichiarando esplicitamente +contesti @code{CueVoice} distinti e usando @code{\quoteDuring} per estrarre +e inserire le notine. + + +@node Musica parlata +@unnumberedsubsubsec Musica parlata +@translationof Spoken music + +@cindex parlato +@cindex Sprechgesang +Effetti come il @q{parlato} o @q{Sprechgesang} chiedono all'esecutore +di parlare senza intonare note ma andando comunque a ritmo; tali effetti +si indicano con teste di nota barrate, come è illustrato in @ref{Special note heads}. + +@c TODO add "marking-notes-on-spoken-parts" snippet -vv +@c add "showing the rhythm of a melody" snip +@c add "one staff-line notation" +@c add "improvisation" ref +@c add "lyrics independents of notes" ref + +@node Dialogo sopra la musica +@unnumberedsubsubsec Dialogo sopra la musica +@translationof Dialogue over music + +Il dialogo parallelo alla musica appare solitamente sopra i righi in +corsivo, con l'inizio di ogni frase collegato a un momento musicale +ben preciso. + +In caso di brevi intromissioni può bastare un semplice @code{\markup}. + +@lilypond[quote,verbatim] +\relative { + a'4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a + a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a + a4 a a a +} +@end lilypond + +In caso di frasi più lunghe può essere necessario espandere la musica +per poter far entrare le parole. Non c'è modo di fare ciò del tutto +automaticamente in LilyPond e sarà necessario anche qualche intervento +manuale per formattare la pagina. + +In caso di frasi lunghe o di passaggi con molti dialoghi serrati, +l'uso di un contesto Lyrics darà risultati migliori. Il contesto Lyrics +non deve essere associato a una voce musicale; occorre invece assegnare +a ogni parte del dialogo una durata esplicita. Se c'è un vuoto nel +dialogo, la parola finale deve essere separata dal resto e la durata +divisa tra le due così che la musica sottostante abbia spazio sufficiente. + +Se il dialogo si estende per più di un rigo sarà necessario inserire +manualmente dei @code{\break} e aggiustare il posizionamento del dialogo +per evitare di entrare nel margine destro. La parola finale dell'ultima +misura di un rigo deve anche essere separata, come mostrato prima. + +Ecco un esempio che illustra come fare. + +@c This should be a snippet, but it can't be as it needs to be +@c manually adjusted to suit the imposed line length. -td + +@lilypond[quote,verbatim,ragged-right] +music = \relative { + \repeat unfold 3 { a'4 a a a } +} + +dialogue = \lyricmode { + \markup { + \fontsize #1 \upright \smallCaps Abe: + "Say this over measures one and" + }4*7 + "two"4 | + \break + "and this over measure"4*3 + "three"4 | +} + +\score { + << + \new Lyrics \with { + \override LyricText.font-shape = #'italic + \override LyricText.self-alignment-X = #LEFT + } + { \dialogue } + \new Staff { + \new Voice { \music } + } + >> +} +@end lilypond + +@c TODO show use of \column to produce dialogue on two lines + +@seealso +Guida alla notazione: +@ref{Manual syllable durations}, +@ref{Text}. + +Internal Reference: +@rinternals{LyricText}. + + +@node Canti salmi e inni +@subsection Canti salmi e inni +@translationof Chants psalms and hymns + +@cindex canti +@cindex inni +@cindex musica religiosa + +La musica e le parole per canti, sali e inni di solito segue un +formato ben definito in ciascuna chiesa. Sebbene i formati possano +differire da chiesa a chiesa, i problemi tipografici che si possono +incontrare sono generalmente simili e sono trattati in questa sezione. + +@menu +* Riferimenti per canti e salmi:: +* Impostare un canto:: +* Salmi:: +* Misure parziali nei motivi degli inni:: +@end menu + +@node Riferimenti per canti e salmi +@unnumberedsubsubsec Riferimenti per canti e salmi +@translationof References for chants and psalms + +La composizione tipografica dei canti gregoriani in vari stili di +notazione antica è descritta in @ref{Ancient notation}. + +@seealso +Guida alla notazione: +@ref{Ancient notation}. + +Frammenti: +@rlsr{Vocal music}. + + +@node Impostare un canto +@unnumberedsubsubsec Impostare un canto +@translationof Setting a chant + +Le impostazioni per il canto moderno usano la notazione moderna insieme +ad alcuni elementi della notazione antica. Alcuni di questi elementi e +metodi sono mostrati in questa sezione. + +I canti usano spesso note di un quarto senza gambi per indicare +l'altezza, mentre le durate vengono dal ritmo parlato delle parole. + +@lilypond[verbatim,quote] +stemOff = { \hide Staff.Stem } + +\relative c' { + \stemOff + a'4 b c2 | +} + +@end lilypond + +Nei canti le stanghette sono spesso omesse oppure si usano delle +stanghette più brevi o punteggiate per indicare le pause nella +musica. Per omettere tutte le stanghette da tutti i righi +si disattiva l'incisore delle stanghette: + +@lilypond[verbatim,quote] +\score { + \new StaffGroup << + \new Staff { + \relative { + a'4 b c2 | + a4 b c2 | + a4 b c2 | + } + } + \new Staff { + \relative { + a'4 b c2 | + a4 b c2 | + a4 b c2 | + } + } + >> + \layout { + \context { + \Staff + \remove "Bar_engraver" + } + } +} +@end lilypond + +Le stanghette possono anche essere tolte solo in certi righi: + +@lilypond[verbatim, quote] +\score { + \new ChoirStaff << + \new Staff + \with { \remove "Bar_engraver" } { + \relative { + a'4 b c2 | + a4 b c2 | + a4 b c2 | + } + } + \new Staff { + \relative { + a'4 b c2 | + a4 b c2 | + a4 b c2 | + } + } + >> +} +@end lilypond + +Per togliere le stanghette da una sezione musicale soltanto basta +trattarla come una cadenza. Se la sezione è lunga potrebbe essere +necessario inserire delle stanghette fittizie con @code{\bar ""} per +mostrare dove si deve interrompere la linea. + +@lilypond[verbatim,quote] +\relative a' { + a4 b c2 | + \cadenzaOn + a4 b c2 + a4 b c2 + \bar "" + a4 b c2 + a4 b c2 + \cadenzaOff + a4 b c2 | + a4 b c2 | +} +@end lilypond + +Nei canti le pause si indicano con stanghette modificate. + +@lilypond[verbatim, quote] +\relative a' { + a4 + \cadenzaOn + b c2 + a4 b c2 + \bar "'" + a4 b c2 + a4 b c2 + \bar ";" + a4 b c2 + \bar "!" + a4 b c2 + \bar "||" +} +@end lilypond + +Altrimenti, talvolta si usa la notazione usata nel canto gregoriano per +le pause anche se il resto della notazione è moderna. Nell'esempio +seguente si usa un segno @code{\breathe} modificato: + +@lilypond[verbatim,quote] +divisioMinima = { + \once \override BreathingSign.stencil = #ly:breathing-sign::divisio-minima + \once \override BreathingSign.Y-offset = #0 + \breathe +} +divisioMaior = { + \once \override BreathingSign.stencil = #ly:breathing-sign::divisio-maior + \once \override BreathingSign.Y-offset = #0 + \breathe +} +divisioMaxima = { + \once \override BreathingSign.stencil = #ly:breathing-sign::divisio-maxima + \once \override BreathingSign.Y-offset = #0 + \breathe +} +finalis = { + \once \override BreathingSign.stencil = #ly:breathing-sign::finalis + \once \override BreathingSign.Y-offset = #0 + \breathe +} + +\score { + \relative { + g'2 a4 g + \divisioMinima + g2 a4 g + \divisioMaior + g2 a4 g + \divisioMaxima + g2 a4 g + \finalis + } + \layout { + \context { + \Staff + \remove "Bar_engraver" + } + } +} +@end lilypond + +Nei canti viene solitamente omessa l'indicazione di tempo e spesso +anche la chiave. + +@lilypond[verbatim,quote] +\score { + \new Staff { + \relative { + a'4 b c2 | + a4 b c2 | + a4 b c2 | + } + } + \layout { + \context { + \Staff + \remove "Bar_engraver" + \remove "Time_signature_engraver" + \remove "Clef_engraver" + } + } +} +@end lilypond + +I canti per salmi della tradizione anglicana sono solitamente o +@emph{singoli}, con 7 battute musicali, oppure @emph{doppi}, con due +gruppi di 7 battute. Ogni gruppo di 7 battute è diviso a metà, +che corrispondono alle metà di ciascun verso, di solito separato +da una doppia stanghetta. Si usano solo semibrevi e minime. La +prima battuta di ogni metà contiene sempre un solo accordo di semibrevi, +che viene chiamato la @qq{nota recitativa}. I canti sono centrati +sulla pagina. + +@lilypond[verbatim,quote] +SopranoMusic = \relative { + g'1 | c2 b | a1 | \bar "||" + a1 | d2 c | c b | c1 | \bar "||" +} + +AltoMusic = \relative { + e'1 | g2 g | f1 | + f1 | f2 e | d d | e1 | +} + +TenorMusic = \relative { + c'1 | c2 c | c1 | + d1 | g,2 g | g g | g1 | +} + +BassMusic = \relative { + c1 | e2 e | f1 | + d1 | b2 c | g' g | c,1 | +} + +global = { + \time 2/2 +} + +% Si usa un blocco markup per centrare il canto sulla pagina +\markup { + \fill-line { + \score { % centered + << + \new ChoirStaff << + \new Staff << + \global + \clef "treble" + \new Voice = "Soprano" << + \voiceOne + \SopranoMusic + >> + \new Voice = "Alto" << + \voiceTwo + \AltoMusic + >> + >> + \new Staff << + \clef "bass" + \global + \new Voice = "Tenor" << + \voiceOne + \TenorMusic + >> + \new Voice = "Bass" << + \voiceTwo + \BassMusic + >> + >> + >> + >> + \layout { + \context { + \Score + \override SpacingSpanner.base-shortest-duration = #(ly:make-moment + 1/2) + } + \context { + \Staff + \remove "Time_signature_engraver" + } + } + } % End score + } +} % End markup +@end lilypond + +Altri approcci per impostare un canto simile sono illustrati nel primo +dei seguenti frammenti. + +@snippets + +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{chant-or-psalms-notation.ly} + +I cantici e altri testi liturgici possono essere impostati in modo +più libero e possono usare elementi della notazione della musica +antica. Le parole sono spesso mostrate sotto e allineate con le note. +In questo caso le note sono spaziate in base alle sillabe invece che +alle durate delle note. + +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{ancient-notation-template----modern-transcription-of-gregorian-music.ly} + +@seealso +Manuale di apprendimento: +@rlearning{Visibilità e colore degli oggetti}, +@rlearning{Modelli per gruppi vocali}. + +Guida alla notazione: +@ref{Ancient notation}, +@ref{Bar lines}, +@ref{Modifying context plug-ins}, +@ref{Typesetting Gregorian chant}, +@ref{Unmetered music}, +@ref{Visibility of objects}. + +@c esiste già un nodo con lo stesso nome: @rlearning{Salmi} +@node Salmi +@unnumberedsubsubsec Salmi +@translationof Pointing a psalm + +Le parole di un salmo anglicano sono solitamente stampate in +versi separati centrati sotto il canto. + +I canti singoli (7 battute) si ripetono per ogni verso. I canti +doppi (con 14 battute) si ripetono per ogni coppia di versi. +Sono inseriti dei segni nelle parole per mostrare come si +combinano col canto. Ogni verso è diviso a metà e tale divisione +è indicata solitamente dai due punti, che corrispondono alla +doppia stanghetta in musica. Le parole che precedono i due punti +sono cantate insieme alle prime tre battute della musica; quelle +successive insieme alle restanti quattro battute. + +Stanghette singole (o in alcuni libri di salmi una virgola inversa +o segno simile) sono inserite tra le parole per indicare dove +cadono le stanghette nella musica. In modalità markup una stanghetta +singola può essere inserita usando il simbolo di controllo battuta +@code{|}. + +@lilypond[verbatim,quote] +\markup { + \fill-line { + \column { + \left-align { + \line { O come let us sing | unto the | Lord : let } + \line { us heartily rejoice in the | strength of | our } + \line { sal- | -vation. } + } + } + } +} +@end lilypond + +Altri simboli potrebbero richiedere i glifi dei tipi di carattere @code{fetaMusic}. +Maggiori informazioni in @ref{Fonts}. + +@lilypond[verbatim,quote] +tick = \markup { + \raise #1 \fontsize #-5 \musicglyph #"scripts.rvarcomma" +} +\markup { + \fill-line { + \column { + \left-align { + \line { O come let us sing \tick unto the \tick Lord : let } + \line { + us heartily rejoice in the \tick strength of \tick our + } + \line { sal \tick vation. } + } + } + } +} +@end lilypond + +Se c'è una semibreve in una battuta, tutte le parole che si riferiscono +a quella battuta sono recitate su quella nota singola col ritmo del +parlato. Dove ci sono due note in una battuta ci saranno solo una o +due sillabe corrispondenti. Se ci sono più di due sillabe, si inserisce +solitamente un punto per indicare dove si trova il cambio di nota. + +@lilypond[verbatim,quote] +dot = \markup { + \raise #0.7 \musicglyph #"dots.dot" +} +tick = \markup { + \raise #1 \fontsize #-5 \musicglyph #"scripts.rvarcomma" +} +\markup { + \fill-line { + \column { + \left-align { + \line { + O come let us sing \tick unto \dot the \tick Lord : let + } + \line { + us heartily rejoice in the \tick strength of \tick our + } + \line { sal \tick vation. } + } + } + } +} +@end lilypond + +In alcuni libri di salmi si usa un asterisco, al posto di una virgola, per +indicare una pausa in una sezione recitata, mentre le sillabe accentate o +leggermente allungate sono indicate in grassetto. + +@lilypond[verbatim,quote] +dot = \markup { + \raise #0.7 \musicglyph #"dots.dot" +} +tick = \markup { + \raise #1 \fontsize #-5 \musicglyph #"scripts.rvarcomma" +} +\markup { + \fill-line { + \column { + \left-align { + \line { Today if ye will hear his voice * } + \line { + \concat { \bold hard en } + | not your | hearts : as in the pro- + } + \line { vocation * and as in the \bold day of tempt- | } + \line { -ation | in the | wilderness. } + } + } + } +} +@end lilypond + +In altri libri di salmi si usa un simbolo di accento sopra la sillaba +per indicare l'accento. + +@lilypond[verbatim,quote] +tick = \markup { + \raise #2 \fontsize #-5 \musicglyph #"scripts.rvarcomma" +} +\markup { + \fill-line { + \column { + \left-align { + \line { + O come let us \concat { + si \combine \tick ng + } + | unto the | Lord : let + } + \line { + us heartily \concat { + rejo \combine \tick ice + } + in the | strength of | our + } + \line { sal- | -vation. } + } + } + } +} +@end lilypond + +L'uso di @code{\markup} per centrare il testo e disporre le linee in +colonne è descritto in @ref{Formatting text}. + +La maggior parte di questi elementi sono mostrati in uno dei due versi +del modello @rlearning{Salmi}. + +@seealso +Manuale di apprendimento: +@rlearning{Salmi}, +@rlearning{Modelli per gruppi vocali}. + +Guida alla notazione: +@ref{Fonts}, +@ref{Formatting text}. + + +@node Misure parziali nei motivi degli inni +@unnumberedsubsubsec Misure parziali nei motivi degli inni +@translationof Partial measures in hymn tunes + +Le melodie degli inni spesso iniziano e terminano ogni rigo musicale +con misure parziali, così che ciascun rigo musicale corrisponda +esattamente a un rigo di testo. Per fare ciò è necessario un comando +@code{\partial} all'inizio della musica e dei comandi @code{\bar "|"} o +@code{\bar "||"} alla fine di ogni linea. + +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{hymn-template.ly} + + +@node Musica vocale antica +@subsection Musica vocale antica +@translationof Ancient vocal music + +È supportata la musica vocale antica, come spiegato in +@ref{Ancient notation}. + +@c TODO + +@c Add "Printing both the ancient and the modern clef in vocal music" snippet, +@c and "Transcription of Ancient music with incipit" snippet. -vv + +@seealso +Guida alla notazione: +@ref{Ancient notation}. diff --git a/Documentation/it/notation/world.itely b/Documentation/it/notation/world.itely new file mode 100644 index 0000000000..214239c8ff --- /dev/null +++ b/Documentation/it/notation/world.itely @@ -0,0 +1,595 @@ +@c -*- coding: utf-8; mode: texinfo; -*- +@ignore + Translation of GIT committish: a94d26b6693cad58b946a01b7efaaed29480f063 + + When revising a translation, copy the HEAD committish of the + version that you are working on. For details, see the Contributors' + Guide, node Updating translation committishes.. +@end ignore + +@c \version "2.19.21" + +@c Translators: Federico Bruni +@c Translation checkers: + +@node World music +@section World music +@translationof World music + +Questo capitolo tratta la notazione delle musiche tradizionali diverse da +quelle occidentali. + +@menu +* Notazione comune per la musica non occidentale:: +* Musica araba:: +* Musica classica turca:: +@end menu + + +@node Notazione comune per la musica non occidentale +@subsection Notazione comune per la musica non occidentale +@translationof Common notation for non-Western music + +Questa sezione spiega come scrivere e stampare partiture musicali che +non appartengono alla tradizione classica occidentale, chiamata anche +@notation{Periodo di pratica comune}. + +@menu +* Estensione dei sistemi di notazione e di accordatura:: +@end menu + + +@node Estensione dei sistemi di notazione e di accordatura +@unnumberedsubsubsec Estensione dei sistemi di notazione e di accordatura +@translationof Extending notation and tuning systems + +La notazione classica standard (nota anche come notazione del +@notation{Periodo di pratica comune}) viene usata in tutti i +generi musicali, non solo nella musica @q{classica} occidentale. +Questa notazione è trattata in @ref{Writing pitches}, mentre i +vari nomi di nota che possono essere usati sono spiegati in +@ref{Note names in other languages}. + +Tuttavia, molti generi musicali non occidentali (e alcuni tipi di +musica folk occidentale e tradizionale) utilizzano sistemi di +accordatura alternativi o estesi che non rientrano facilmente +nella notazione classica standard. + +In alcuni casi viene usata comunque la notazione standard, mentre le +differenze di altezza restano implicite. Per esempio, la +@notation{musica araba} viene rappresentata con le alterazioni +standard di un semitono e di un quarto di tono, e le esatte +alterazioni di altezza sono determinate in base al contesto. +Vengono usati solitamente i nomi italiani delle note, mentre il +file di inizializzazione @file{arabic.ly} fornisce un comodo +insieme di macro e definizioni che estendono la notazione standard. +Maggiori dettagli in @ref{Arabic music}. + +@cindex accordatura non occidentale + +Altri generi musicali richiedono notazioni estese o uniche. +La @notation{musica classica turca} o musica ottomana, per +eesempio, usa forme melodiche note come @notation{makamlar}, +i cui intervalli sono basati su divisioni di 1/9 del tono intero. +Usa comunque le note sul rigo standard occidentale, ma con alterazioni +speciali presenti esclusivamente nella musica turca, definite nel file +@file{makam.ly}. Maggiori informazioni sulla musica classica turca e +sui makamlar in @ref{Turkish classical music}. + +Per trovare i file di inizializzazione come @file{arabic.ly} o +@file{makam.ly} nel proprio sistema, leggere +@rlearning{Altre fonti di informazione}. + +@snippets + +@lilypondfile[verbatim,quote,texidoc,doctitle] +{makam-example.ly} + +@seealso +Glossario musicale: +@rglosnamed{Common Practice Period,Periodo di pratica comune}, +@rglos{makamlar}. + +Manuale di apprendimento: +@rlearning{Altre fonti di informazione}. + +Guida alla notazione: +@ref{Writing pitches}, +@ref{Note names in other languages}, +@ref{Arabic music}, +@ref{Turkish classical music}. + + +@node Musica araba +@subsection Musica araba +@translationof Arabic music + +Questa sezione evidenzia le questioni relative alla notazione della +musica araba. + +@menu +* Referenze per la musica araba:: +* Nomi delle note in arabo:: +* Armature di chiave arabe:: +* Indicazioni di tempo arabe:: +* Esempio di musica araba:: +* Letture complementari sulla musica araba:: +@end menu + + +@node Referenze per la musica araba +@unnumberedsubsubsec Referenze per la musica araba +@translationof References for Arabic music + +@cindex musica araba +@cindex araba, musica +@cindex intervalli intermedi +@cindex maqam + +Finora la musica araba è stata soprattutto una tradizione orale. La musica, +se trascritta, viene solitamente schematizzata in una sorta di abbozzo, sul quale +gli esecutori hanno molta libertà di improvvisazione. Ma, per poter comunicare +e preservare la musica araba, l'uso della notazione accidentale, con alcune +variazioni, è sempre più diffuso. + +Alcuni elementi della notazione musicale occidentale, come la trascrizione +di accordi e parti independenti, non sono necessari per scrivere i brani +arabi più tradizionali. Ci sono tuttavia alcune questioni differenti, come +il bisogno di indicare gli intervalli intermedi che si trovano tra un semitono +e un tono, oltre agli intervalli minori e maggiori usati nella musica +occidentale. C'è anche il bisogno di raggruppare e indicare un gran numero +di diversi maqam (modi) che fanno parte della musica araba. + +In generale, la notazione della musica araba non tenta di indicare precisamente +gli elementi microtonali presenti nella pratica musicale. + +Varie questioni rilevanti per la musica araba sono trattate in altre sezioni +della documentazione: + +@itemize +@item I nomi delle note e le alterazioni (inclusi i quarti di tono) possono +essere modificati come è spiegato in @ref{Common notation for non-Western music}. + +@item Ulteriori armature di chiave possono essere adattate come descritto +in @ref{Key signature}. + +@item Indicazioni di tempo complesse potrebbero obbligare a raggruppare le note +manualmente, come descritto in @ref{Manual beams}. + +@item I @notation{takasim}, improvvisazioni in tempo libero, possono essere +scritti omettendo le stanghette, come è spiegato in @ref{Unmetered music}. + +@end itemize + + +@seealso +Guida alla notazione: +@ref{Common notation for non-Western music}, +@ref{Key signature}, +@ref{Manual beams}. + +Frammenti: +@rlsr{World music}. + + +@node Nomi delle note in arabo +@unnumberedsubsubsec Nomi delle note in arabo +@translationof Arabic note names + + +@cindex nomi delle note in arabo +@cindex arabo, Nomi delle note in + +I nomi più tradizionali delle note in arabo possono essere piuttosto +lunghi e non sono adatti alla scrittura musicale, quindi non vengono +suati. I nomi delle note in inglese non sono molto conosciute nell'istruzione +musicale araba, quindi al loro posto sono usati i nomi delle note in +italiano, ovvero i nomi usati nel solfeggio (@code{do, re, mi, fa, +sol, la, si}); si possono usare anche le alterazioni. I nomi delle note +in italiano e le alterazioni sono spiegati in +@ref{Note names in other languages}; l'uso della notazione occidentale +standard per scrivere musica non occidentale è trattato in +@ref{Common notation for non-Western music}. + +Ecco un esempio di come può essere scritta la scala araba @notation{rast}: + +@lilypond[quote,verbatim] +\include "arabic.ly" +\relative { + do' re misb fa sol la sisb do sisb la sol fa misb re do +} +@end lilypond + + +@cindex simbolo arabo per semibemolle +@cindex semibemolle, simbolo arabo + +Il simbolo di semibemolle non corrisponde al simbolo usato nella notazione +araba. Per ottenere il simbolo arabo di semibemolle, si può usare il +simbolo @code{\dwn}, definito in @file{arabic.ly}, prima di un simbolo di +bemolle. L'aspetto del simbolo di semibemolle nell'armatura di chiave non +può essere modificato con questo metodo. + +@lilypond[quote,verbatim] +\include "arabic.ly" +\relative { + \set Staff.extraNatural = ##f + dod' dob dosd \dwn dob dobsb dodsd do do +} +@end lilypond + + +@seealso +Guida alla notazione: +@ref{Note names in other languages}, +@ref{Common notation for non-Western music}. + +Frammenti: +@rlsr{World music}. + + +@node Armature di chiave arabe +@unnumberedsubsubsec Armature di chiave arabe +@translationof Arabic key signatures + +@cindex armature di chiave arabe + +Oltre alle armature di chiave minori e maggiori, sono definite le +seguenti armature in @file{arabic.ly}: @notation{bayati}, +@notation{rast}, @notation{sikah}, @notation{iraq} e +@notation{kurd}. Queste armature definiscono un piccolo numero di +gruppi di maqam invece del gran numero di maqam di uso comune. + +In generale, un maqam usa l'armatura di chiave del suo gruppo o di +un gruppo vicino, e le variazioni di alterazioni sono contrassegnate +nel corso della musica. + +Per esempio, per indicare l'armatura di chiave di un brano maqam muhayer: + +@example +\key re \bayati +@end example + +@noindent +dove @var{re} è l'altezza predefinita del maqam muhayer, e +@var{bayati} è il nome del maqam di base nel gruppo. + +Sebbene l'armatura di chiave indichi il gruppo, di solito si precisa +nel titolo il maqam più specifico, dunque in questo esempio il nome +di maqam muhayer dovrebbe apparire nel titolo. + +Altri maqam nello stesso gruppo bayati, come mostrato nella tabella +in basso (bayati, hussaini, saba, and ushaq), possono essere indicati +nello stesso modo. Sono tutte variazioni del maqam di base e più +comune nel gruppo, ovvero bayati. Solitamente differiscono dal maqam +di base nei tetracordi superiori, o in certi dettagli di disposizione +che non cambiano fondamentalmente la loro natura. + +L'altro maqam nello stesso gruppo (Nawa) è correlato con bayati per +la modulazione, indicata in tabella tra parentesi per quei maqam +che sono modulazioni del loro maqam fondamentale. I maqam arabi +permettono soltanto modulazioni limitate, a causa della natura degli +strumenti musicali arabi. Nawa può essere indicato nel modo seguente: + +@example +\key sol \bayati +@end example + +Nella musica araba, lo stesso termine, come bayati, usato per indicare +un gruppo maqam, è anche un maqam che è solitamente il più importante +nel gruppo, e può anche essere considerato come il maqam di base. + +Ecco un raggruppamento consigliato che mostra le armature di chiave dei +più comuni maqam: + +@multitable @columnfractions 0.15 0.1 0.1 0.6 +@headitem gruppo maqam + @tab tonalità + @tab finalis + @tab Altri maqma nel gruppo (finalis) +@item ajam + @tab major + @tab sib + @tab jaharka (fa) +@item bayati + @tab bayati + @tab re + @tab hussaini, muhayer, saba, ushaq, nawa (sol) +@item hijaz + @tab kurd + @tab re + @tab shahnaz, shad arban (sol), hijazkar (do) +@item iraq + @tab iraq + @tab sisb + @tab - +@item kurd + @tab kurd + @tab re + @tab hijazkar kurd (do) +@item nahawand + @tab minor + @tab do + @tab busalik (re), farah faza (sol) +@item nakriz + @tab minor + @tab do + @tab nawa athar, hisar (re) +@item rast + @tab rast + @tab do + @tab mahur, yakah (sol) +@item sikah + @tab sikah + @tab misb + @tab huzam +@end multitable + +@snippets + +@lilypondfile[verbatim,quote,texidoc,doctitle] +{non-traditional-key-signatures.ly} + + +@seealso +Glossario musicale: +@rglos{maqam}, +@rglos{bayati}, +@rglos{rast}, +@rglos{sikah}, +@rglos{iraq}, +@rglos{kurd}. + +Guida alla notazione: +@ref{Key signature}. + +Manuale di apprendimento: +@rlearning{Altezze e armature di chiave}. + +Guida al funzionamento interno: +@rinternals{KeySignature}. + +Frammenti: +@rlsr{World music}, +@rlsr{Pitches}. + + +@node Indicazioni di tempo arabe +@unnumberedsubsubsec Indicazioni di tempo arabe +@translationof Arabic time signatures + +@cindex indicazioni di tempo arabe +@cindex Semai, forma +@cindex taqasim + +Alcune forme di musica classica araba e turca, come @notation{Semai}, +usano indicazioni di tempo insolite, come 10/8. Ciò può determinare +un raggruppamento automatico delle note piuttosto diverso dalle +partiture esistenti, dove le note possono non essere raggruppate sul +tempo, ma in un modo che è difficile da cogliere aggiustando la disposizione +automatica delle travature. L'alternativa consiste nel disattivare la +disposizione automatica delle travature e disporre le travature manualmente. +Anche se non è richiesto di riprodurre lo stile di una partitura esistente, +può essere comunque opportuno regolare il comportamento della disposizione +automatica delle travature e/o usare indicazioni di tempo composto. + +@snippets + +@lilypondfile[verbatim,quote,texidoc,doctitle] +{arabic-improvisation.ly} + + +@seealso +Glossario musicale: +@rglos{semai}, +@rglos{taqasim}. + +Guida alla notazione: +@ref{Manual beams}, +@ref{Automatic beams}, +@ref{Unmetered music}, +@ref{Automatic accidentals}, +@ref{Setting automatic beam behavior}, +@ref{Time signature}. + +Frammenti: +@rlsr{World music}. + + +@node Esempio di musica araba +@unnumberedsubsubsec Esempio di musica araba +@translationof Arabic music example + +@cindex esempio di musica araba +@cindex araba, esempio di musica +@cindex modello di musica araba +@cindex araba, modello di musica + +Ecco un modello che usa l'inizio di un @notation{Semai} turco, conosciuto +nell'educazione musicale araba, per illustrare le peculiarità della +notazione musicale araba, come gli intervalli intermedi e i modi +inusuali discussi in questa sezione. + +@lilypond[quote,verbatim] +\include "arabic.ly" +\score { + \relative { + \set Staff.extraNatural = ##f + \set Staff.autoBeaming = ##f + \key re \bayati + \time 10/8 + + re'4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 + re16 [misb do re] sisb [do] la [sisb sol8] la [sisb] do [re] misb + fa4 fa16 [misb] misb8. [re16] re8 [misb] re [do] sisb + do4 sisb8 misb16 [re do sisb] la [do sisb la] la4 r8 + } + \header { + title = "Semai Muhayer" + composer = "Jamil Bek" + } +} +@end lilypond + + +@seealso +Frammenti: +@rlsr{World music}. + + +@node Letture complementari sulla musica araba +@unnumberedsubsubsec Letture complementari sulla musica araba +@translationof Further reading for Arabic music + +@enumerate + +@item +@emph{The music of the Arabs} di Habib Hassan Touma [Amadeus Press, 1996], +contiene uno studio dei maqam e il loro metodo di classificazione. + +Ci sono anche vari siti web che spiegano i maqam e alcuni offrono degli +esempi audio, come: + +@itemize @bullet +@item +@uref{http://www.maqamworld.com/} +@item +@uref{http://www.turath.org/} +@end itemize + +Nonostante ci sia un generale consenso sui criteri di classificazione dei +maqam che sono collegati tra loro a causa di comuni tetracordi inferiori o +della modulazione, i metodi di classificazione possono variare in alcuni +dettagli. + +@item +Non c'è una coerenza perfetta, talvolta perfino nello stesso testo, su +come specificare le armature di chiave per certi maqam. È tuttavia +pratica comune l'utilizzo di una armatura di chiave per gruppo, invece +di un'armatura diversa per ogni maqam. + +I metodi dei seguenti autori per l'@dfn{Oud}, il liuto arabo, contegono +esempi di composizioni in gran parte turche e arabe. + +@itemize @bullet +@item +Charbel Rouhana +@item +George Farah +@item +Ibrahim Ali Darwish Al-masri +@end itemize +@end enumerate + + +@node Musica classica turca +@subsection Musica classica turca +@translationof Turkish classical music + +Questa sezione evidenzia le questioni rilevanti per la notazione di musica +classica turca. + +@menu +* Riferimenti per la musica classica turca:: +* Nomi delle note in turco:: +@end menu + + +@node Riferimenti per la musica classica turca +@unnumberedsubsubsec Riferimenti per la musica classica turca +@translationof References for Turkish classical music + +@cindex Turkish music +@cindex Ottoman music +@cindex comma intervals +@cindex makam +@cindex makamlar + +La musica classica turca si è sviluppata nell'impero ottomano in un +periodo più o meno contemporaneo a quello della musica classica in +Europa, e ha proseguito nei secoli ventesimo e ventunesimo come una +tradizione viva e distinta, con le sue forme compositive, la sua +teoria e i propri stili di esecuzione. Tra le sue principali peculiarità +c'è l'uso degli intervalli microtonali basati sui @q{commi} di 1/9 di un +tono, dal quale vengono costruite le forme melodiche note come +@notation{makam} (plurale @notation{makamlar}). + +Alcune questioni rilevanti per la musica classica turca sono trattate in +altre sezioni della documentazione: + +@itemize +@item I nomi per le note speciali e le alterazioni sono spiegati in +@ref{Common notation for non-Western music}. + +@end itemize + + +@node Nomi delle note in turco +@unnumberedsubsubsec Nomi delle note in turco +@translationof Turkish note names + +@cindex nomi delle note in turco +@cindex turco, nomi delle note in +@cindex makam +@cindex makamlar + +Nella musica classica turca le altezze tradizionalmente hanno nomi +unici, e a causa della divisione del tono in nove parti i makamlar +usano un insieme di intervalli completamente diverso dalle scale e +dai modi occidentali: @notation{koma} (1/9 di un tono), +@notation{eksik bakiye} (3/9), @notation{bakiye} (4/9), +@notation{kücük mücenneb} (5/9), @notation{büyük mücenneb} +(8/9), @notation{tanîni} (un tono intero) e +@notation{artık ikili} (12/9 o 13/9 di un tono). + +Dal punto di vista della notazione moderna conviene usare le note standard +occidentali sul rigo (do, re, mi, @dots{}) con delle alterazioni speciali +che alzano o abbassano le note di intervalli di 1/9, 4/9, 5/9 e 8/9 di tono. +Queste alterazioni sono definite nel file @file{makam.ly}. + +La tabella seguente elenca: +@itemize +@item +il nome di queste alterazioni speciali, +@item +il suffisso di alterazione da aggiungere alle note, +@item +e l'alterazione di altezza rappresentata come una frazione dell'intero tono. +@end itemize + +@quotation +@multitable {@b{büyük mücenneb (sharp)}} {@b{suffix}} {@b{pitch alteration}} +@headitem Nome alterazione + @tab suffissp @tab alterazione + +@item büyük mücenneb (diesis) + @tab -bm @tab +8/9 +@item kücük mücenneb (diesis) + @tab -k @tab +5/9 +@item bakiye (sharp) + @tab -b @tab +4/9 +@item koma (sharp) + @tab -c @tab +1/9 + +@item koma (flat) + @tab -fc @tab -1/9 +@item bakiye (flat) + @tab -fb @tab -4/9 +@item kücük mücenneb (bemolle) + @tab -fk @tab -5/9 +@item büyük mücenneb (bemolle) + @tab -fbm @tab -8/9 +@end multitable +@end quotation + +Per una spiegazione più generale della notazione musicale non occidentale, leggere +@ref{Common notation for non-Western music}. + +@seealso +Glossario musicale: +@rglos{makam}, +@rglos{makamlar}. + +Guida alla notazione: +@ref{Common notation for non-Western music}. + diff --git a/Documentation/it/search-box.ihtml b/Documentation/it/search-box.ihtml index af7767a329..b5602c33e5 100644 --- a/Documentation/it/search-box.ihtml +++ b/Documentation/it/search-box.ihtml @@ -1,25 +1,18 @@ - diff --git a/Documentation/it/texidocs/adding-ambitus-per-voice.texidoc b/Documentation/it/texidocs/adding-ambitus-per-voice.texidoc index b69b838c16..7dafdc3e2b 100644 --- a/Documentation/it/texidocs/adding-ambitus-per-voice.texidoc +++ b/Documentation/it/texidocs/adding-ambitus-per-voice.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " L'ambitus può essere specificato per voce. In tal caso occorre spostarlo manualmente per evitare collisioni. diff --git a/Documentation/it/texidocs/adding-an-ottava-marking-to-a-single-voice.texidoc b/Documentation/it/texidocs/adding-an-ottava-marking-to-a-single-voice.texidoc index fcbf004b7b..2e5f8a850d 100644 --- a/Documentation/it/texidocs/adding-an-ottava-marking-to-a-single-voice.texidoc +++ b/Documentation/it/texidocs/adding-an-ottava-marking-to-a-single-voice.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Se il rigo ha più di una voce, l'ottavazione in una voce trasporrà la posizione delle note in tutte le voci per la durata della parentesi diff --git a/Documentation/it/texidocs/adding-orchestral-cues-to-a-vocal-score.texidoc b/Documentation/it/texidocs/adding-orchestral-cues-to-a-vocal-score.texidoc new file mode 100644 index 0000000000..2a7b8b577e --- /dev/null +++ b/Documentation/it/texidocs/adding-orchestral-cues-to-a-vocal-score.texidoc @@ -0,0 +1,15 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +L'esempio seguente mostra un approccio per simplificare l'aggiunta di +citazioni orchestrali a una riduzione per pianoforte di una partitura +vocale. La funzione musicale @code{\\cueWhile} prende quattro argomenti: +la musica da cui prendere la citazione, come è definita da @code{\\addQuote}, +il nome da inserire prima delle notine, poi o @code{#UP} o @code{#DOWN} per +specificare o @code{\\voiceOne} col nome sopra il rigo o @code{\\voiceTwo} +col nome sotto il rigo, e infine la musica per pianoforte che deve apparire +in parallelo alle notine. Il nome dello strumento citato è posto a sinistra +delle notine. Molti passaggi possono essere citati, ma non possono +sovrapporsi l'un l'altro nel tempo. + +" + doctitleit = "Aggiungere citazioni orchestrali a una partitura vocale" diff --git a/Documentation/it/texidocs/adding-timing-marks-to-long-glissandi.texidoc b/Documentation/it/texidocs/adding-timing-marks-to-long-glissandi.texidoc index ae1b562153..51f1e160d7 100644 --- a/Documentation/it/texidocs/adding-timing-marks-to-long-glissandi.texidoc +++ b/Documentation/it/texidocs/adding-timing-marks-to-long-glissandi.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " I battiti saltati nei glissandi molto lunghi vengono talvolta segnalati con delle indicazioni di tempo, che consistono solitamente in dei gambi diff --git a/Documentation/it/texidocs/adding-volta-brackets-to-additional-staves.texidoc b/Documentation/it/texidocs/adding-volta-brackets-to-additional-staves.texidoc index da1d0a24f9..4ed65a4ea8 100644 --- a/Documentation/it/texidocs/adding-volta-brackets-to-additional-staves.texidoc +++ b/Documentation/it/texidocs/adding-volta-brackets-to-additional-staves.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " L'incisore @code{Volta_engraver} risiede nel contesto @code{Score}, quindi le parentesi delle ripetizioni appaiono di norma soltanto sul rigo superiore. diff --git a/Documentation/it/texidocs/additional-voices-to-avoid-collisions.texidoc b/Documentation/it/texidocs/additional-voices-to-avoid-collisions.texidoc index 6479a00fc5..59591444b1 100644 --- a/Documentation/it/texidocs/additional-voices-to-avoid-collisions.texidoc +++ b/Documentation/it/texidocs/additional-voices-to-avoid-collisions.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " In alcuni casi di musica polifonica complessa sono necessarie delle voci ulteriori per evitare le collisioni tra note. Se servono più di diff --git a/Documentation/it/texidocs/adjusting-the-shape-of-falls-and-doits.texidoc b/Documentation/it/texidocs/adjusting-the-shape-of-falls-and-doits.texidoc index 822b065a64..d61b4bb072 100644 --- a/Documentation/it/texidocs/adjusting-the-shape-of-falls-and-doits.texidoc +++ b/Documentation/it/texidocs/adjusting-the-shape-of-falls-and-doits.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " La proprietà @code{shortest-duration-space} può essere modificata per cambiare la forma dei portamenti indeterminati verso il basso o verso l'alto. diff --git a/Documentation/it/texidocs/aligning-bar-numbers.texidoc b/Documentation/it/texidocs/aligning-bar-numbers.texidoc index 92236ed56a..9e3a4a5d07 100644 --- a/Documentation/it/texidocs/aligning-bar-numbers.texidoc +++ b/Documentation/it/texidocs/aligning-bar-numbers.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Per impostazione predefinita i numeri di battuta sono allineati a destra rispetto al loro oggetto genitore. Di solito si tratta del margine sinistro della linea diff --git a/Documentation/it/texidocs/allowing-fingerings-to-be-printed-inside-the-staff.texidoc b/Documentation/it/texidocs/allowing-fingerings-to-be-printed-inside-the-staff.texidoc index 9708052c2c..ae37ac9779 100644 --- a/Documentation/it/texidocs/allowing-fingerings-to-be-printed-inside-the-staff.texidoc +++ b/Documentation/it/texidocs/allowing-fingerings-to-be-printed-inside-the-staff.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Per impostazione predefinita, le diteggiature orientate verticalmente sono poste fuori dal rigo. Tuttavia, questo comportamento può essere annullato. diff --git a/Documentation/it/texidocs/alternative-bar-numbering.texidoc b/Documentation/it/texidocs/alternative-bar-numbering.texidoc index aaa077249d..628e01b6b4 100644 --- a/Documentation/it/texidocs/alternative-bar-numbering.texidoc +++ b/Documentation/it/texidocs/alternative-bar-numbering.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Si possono impostare due metodi alternativi di numerazione della battuta, utili specialmente per le ripetizioni. diff --git a/Documentation/it/texidocs/alternative-breve-notes.texidoc b/Documentation/it/texidocs/alternative-breve-notes.texidoc index d83f6b7722..b3c2322681 100644 --- a/Documentation/it/texidocs/alternative-breve-notes.texidoc +++ b/Documentation/it/texidocs/alternative-breve-notes.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le note brevi sono disponibili anche con due linee verticali su ciascun lato della testa invece di una sola e in stile barocco. diff --git a/Documentation/it/texidocs/ambitus-with-multiple-voices.texidoc b/Documentation/it/texidocs/ambitus-with-multiple-voices.texidoc index 0a4368c68d..595af19c67 100644 --- a/Documentation/it/texidocs/ambitus-with-multiple-voices.texidoc +++ b/Documentation/it/texidocs/ambitus-with-multiple-voices.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Se si aggiunge l'incisore @code{Ambitus_engraver} al contesto @code{Staff} viene creato un solo ambitus per il rigo, anche nel caso di righi che hanno più diff --git a/Documentation/it/texidocs/ancient-notation-template----modern-transcription-of-gregorian-music.texidoc b/Documentation/it/texidocs/ancient-notation-template----modern-transcription-of-gregorian-music.texidoc index 09a03dcae2..63d5d0e3e3 100644 --- a/Documentation/it/texidocs/ancient-notation-template----modern-transcription-of-gregorian-music.texidoc +++ b/Documentation/it/texidocs/ancient-notation-template----modern-transcription-of-gregorian-music.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo esempio mostra come realizzare una trascrizione moderna di musica gregoriana. La musica gregoriana non presenta la suddivisione in misure né gambi; diff --git a/Documentation/it/texidocs/ancient-notation-template----modern-transcription-of-mensural-music.texidoc b/Documentation/it/texidocs/ancient-notation-template----modern-transcription-of-mensural-music.texidoc deleted file mode 100644 index be59253994..0000000000 --- a/Documentation/it/texidocs/ancient-notation-template----modern-transcription-of-mensural-music.texidoc +++ /dev/null @@ -1,12 +0,0 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 - texidocit = " -Quando si trascrive musica mensurale, può essere utile inserire all'inizio del -pezzo un incipit che indichi l'intonazione e il tempo originali. Le stanghette -di battuta, a cui i musicisti di oggi sono abituati e che aiutano a riconoscere -più velocemente gli schemi ritmici, durante l'epoca della musica mensurale non -erano ancora state introdotte; infatti il metro cambiava spesso ogni poche -note. Come compromesso, le stanghette vengono spesso inserite tra i righi -invece che al loro interno. - -" - doctitleit = "Modello per notazione antica -- trascrizione moderna di musica mensurale" diff --git a/Documentation/it/texidocs/anglican-psalm-template.texidoc b/Documentation/it/texidocs/anglican-psalm-template.texidoc index f2c0f398eb..2a1cee31cf 100644 --- a/Documentation/it/texidocs/anglican-psalm-template.texidoc +++ b/Documentation/it/texidocs/anglican-psalm-template.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo modello presenta un modo per impostare un salmo anglicano. Mostra anche come le strofe possano essere aggiunte come testo separato al di sotto diff --git a/Documentation/it/texidocs/applying-note-head-styles-depending-on-the-step-of-the-scale.texidoc b/Documentation/it/texidocs/applying-note-head-styles-depending-on-the-step-of-the-scale.texidoc index 264609d87d..ba8973c330 100644 --- a/Documentation/it/texidocs/applying-note-head-styles-depending-on-the-step-of-the-scale.texidoc +++ b/Documentation/it/texidocs/applying-note-head-styles-depending-on-the-step-of-the-scale.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " La proprietà @code{shapeNoteStyles} può essere usata per definire vari stili di teste di nota per ogni grado della scala (definita dall'armatura diff --git a/Documentation/it/texidocs/arabic-improvisation.texidoc b/Documentation/it/texidocs/arabic-improvisation.texidoc new file mode 100644 index 0000000000..1ea8a93d3a --- /dev/null +++ b/Documentation/it/texidocs/arabic-improvisation.texidoc @@ -0,0 +1,10 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +Per improvvisazioni o taqasim a tempo libero, si può omettere l'indicazione +di tempo e usare @code{\\cadenzaOn}. Può essere necessaria la modifica +dello stile delle alterazioni, perché l'assenza delle stanghette farà +sì che l'alterazione sia contrassegnata una volta sola. Ecco un esempio +di quello che potrebbe essere l'inizio di un'improvvisazione hijaz: + +" + doctitleit = "Improvvisazione araba" diff --git a/Documentation/it/texidocs/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.texidoc b/Documentation/it/texidocs/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.texidoc index a89cd15a66..ddc79d20b7 100644 --- a/Documentation/it/texidocs/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.texidoc +++ b/Documentation/it/texidocs/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " LilyPond può modificare la direzione del gambo della nota centrale di un rigo in modo che segua la melodia: occorre aggiungere l'incisore diff --git a/Documentation/it/texidocs/avoiding-collisions-with-chord-fingerings.texidoc b/Documentation/it/texidocs/avoiding-collisions-with-chord-fingerings.texidoc index 8b3a1ae955..861b21d0f4 100644 --- a/Documentation/it/texidocs/avoiding-collisions-with-chord-fingerings.texidoc +++ b/Documentation/it/texidocs/avoiding-collisions-with-chord-fingerings.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Diteggiature e numeri di corda applicati a note individuali evitano automaticamente le travature e i gambi, ma questo non vale per diteggiature diff --git a/Documentation/it/texidocs/beam-endings-in-score-context.texidoc b/Documentation/it/texidocs/beam-endings-in-score-context.texidoc index fedb857692..5571809887 100644 --- a/Documentation/it/texidocs/beam-endings-in-score-context.texidoc +++ b/Documentation/it/texidocs/beam-endings-in-score-context.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le regole relative alle estremità delle travature definite nel contesto @code{Score} si applicano a tutti i righi, ma possono essere modificate anche ai livelli diff --git a/Documentation/it/texidocs/beams-across-line-breaks.texidoc b/Documentation/it/texidocs/beams-across-line-breaks.texidoc index 9bad277a0a..81be565bc4 100644 --- a/Documentation/it/texidocs/beams-across-line-breaks.texidoc +++ b/Documentation/it/texidocs/beams-across-line-breaks.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le interruzioni di linea sono di norma proibite quando le travature attraversano la stanghetta di una battuta. Si può cambiare questo comportamento nel modo diff --git a/Documentation/it/texidocs/changing-beam-knee-gap.texidoc b/Documentation/it/texidocs/changing-beam-knee-gap.texidoc index 23ca14346f..9826541c05 100644 --- a/Documentation/it/texidocs/changing-beam-knee-gap.texidoc +++ b/Documentation/it/texidocs/changing-beam-knee-gap.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le travature angolari vengono inserite automaticamente quando viene rilevata un'ampia distanza tra le teste di nota. Questo comportamento diff --git a/Documentation/it/texidocs/changing-form-of-multi-measure-rests.texidoc b/Documentation/it/texidocs/changing-form-of-multi-measure-rests.texidoc index 4758c86013..01a2e4739e 100644 --- a/Documentation/it/texidocs/changing-form-of-multi-measure-rests.texidoc +++ b/Documentation/it/texidocs/changing-form-of-multi-measure-rests.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Se la pausa multipla dura dieci misure o un numero inferiore a dieci, nel rigo apparirà una serie di pause di longa e di breve (chiamate in tedesco @qq{Kirchenpausen} diff --git a/Documentation/it/texidocs/changing-midi-output-to-one-channel-per-voice.texidoc b/Documentation/it/texidocs/changing-midi-output-to-one-channel-per-voice.texidoc new file mode 100644 index 0000000000..13b7efd6ca --- /dev/null +++ b/Documentation/it/texidocs/changing-midi-output-to-one-channel-per-voice.texidoc @@ -0,0 +1,16 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +Nella creazione del file di output MIDI, il comportamento predefinito prevede +che ogni rigo sia assegnato a un canale MIDI, con tutte le voci del rigo +amalgamate in un canale. Ciò diminuisce il rischio di esaurire i canali +MIDI disponibili, dato che ce ne sono solo 16 per traccia. + +Tuttavia, spostando @code{Staff_performer} nel contesto @code{Voice}, ogni +voce in un rigo può avere il proprio canale MIDI, come è illustrato +nell'esempio seguente: sebbene le voci siano sullo stesso rigo, vengono +creati due canali MIDI, ciascuno con un diverso strumento MIDI +(@code{midiInstrument}). + +" + doctitleit = "Impostare l'output MIDI su un canale per voce" + diff --git a/Documentation/it/texidocs/changing-partcombine-texts.texidoc b/Documentation/it/texidocs/changing-partcombine-texts.texidoc index f830a51800..314445deb3 100644 --- a/Documentation/it/texidocs/changing-partcombine-texts.texidoc +++ b/Documentation/it/texidocs/changing-partcombine-texts.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Quando si usa la funzionalità di combinazione automatica delle parti, si può modificare il testo delle sezioni soliste e dell'unisono: diff --git a/Documentation/it/texidocs/changing-text-and-spanner-styles-for-text-dynamics.texidoc b/Documentation/it/texidocs/changing-text-and-spanner-styles-for-text-dynamics.texidoc index df559e26f8..3df0f913b6 100644 --- a/Documentation/it/texidocs/changing-text-and-spanner-styles-for-text-dynamics.texidoc +++ b/Documentation/it/texidocs/changing-text-and-spanner-styles-for-text-dynamics.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il testo usato per i crescendo e i decrescendo può essere cambiato modificando le proprietà di contesto @code{crescendoText} e diff --git a/Documentation/it/texidocs/changing-the-ambitus-gap.texidoc b/Documentation/it/texidocs/changing-the-ambitus-gap.texidoc index 4a46b0a585..8d425aaa9f 100644 --- a/Documentation/it/texidocs/changing-the-ambitus-gap.texidoc +++ b/Documentation/it/texidocs/changing-the-ambitus-gap.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " È possibile cambiare le impostazioni predefinite dell'intervallo tra le teste di nota dell'ambitus e la linea che le collega. diff --git a/Documentation/it/texidocs/changing-the-breath-mark-symbol.texidoc b/Documentation/it/texidocs/changing-the-breath-mark-symbol.texidoc index 7c45f11bc7..69966b5e67 100644 --- a/Documentation/it/texidocs/changing-the-breath-mark-symbol.texidoc +++ b/Documentation/it/texidocs/changing-the-breath-mark-symbol.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il glifo del respiro può essere modificato sovrascrivendo la proprietà @code{text} dell'oggetto di formattazione @code{BreathingSign} con diff --git a/Documentation/it/texidocs/changing-the-number-of-augmentation-dots-per-note.texidoc b/Documentation/it/texidocs/changing-the-number-of-augmentation-dots-per-note.texidoc index 1b15b3eeb8..159416d28e 100644 --- a/Documentation/it/texidocs/changing-the-number-of-augmentation-dots-per-note.texidoc +++ b/Documentation/it/texidocs/changing-the-number-of-augmentation-dots-per-note.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il numero di punti di aumentazione su una singola nota può essere modificato in modo indipendente dai punti posizionati dopo la nota. diff --git a/Documentation/it/texidocs/changing-the-tempo-without-a-metronome-mark.texidoc b/Documentation/it/texidocs/changing-the-tempo-without-a-metronome-mark.texidoc index 94bec71b4e..7c1a30c3e4 100644 --- a/Documentation/it/texidocs/changing-the-tempo-without-a-metronome-mark.texidoc +++ b/Documentation/it/texidocs/changing-the-tempo-without-a-metronome-mark.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Per cambiare il tempo del file MIDI senza che appaia l'indicazione metronomica, basta renderla invisibile. diff --git a/Documentation/it/texidocs/changing-the-tuplet-number.texidoc b/Documentation/it/texidocs/changing-the-tuplet-number.texidoc index aea3b17b75..5801cfd789 100644 --- a/Documentation/it/texidocs/changing-the-tuplet-number.texidoc +++ b/Documentation/it/texidocs/changing-the-tuplet-number.texidoc @@ -1,7 +1,8 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Di norma compare sulla parentesi del gruppo irregolare solo il -numeratore del numero del gruppo irregolare. Ma è possibile +numeratore del numero del gruppo irregolare, ovvero il numeratore +dell'argomento del comando @code{\\tuplet}. Ma è possibile mostrare la frazione num:den del numero del gruppo irregolare oppure nascondere del tutto il numero. diff --git a/Documentation/it/texidocs/chant-or-psalms-notation.texidoc b/Documentation/it/texidocs/chant-or-psalms-notation.texidoc new file mode 100644 index 0000000000..0cd499c311 --- /dev/null +++ b/Documentation/it/texidocs/chant-or-psalms-notation.texidoc @@ -0,0 +1,7 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +Questa forma di notazione è utilizzata per i salmi, dove i versi non +sono sempre della stessa lunghezza. + +" + doctitleit = "Notazione per canti e salmi" diff --git a/Documentation/it/texidocs/combining-two-parts-on-the-same-staff.texidoc b/Documentation/it/texidocs/combining-two-parts-on-the-same-staff.texidoc index cbe6575afc..fdd6aac333 100644 --- a/Documentation/it/texidocs/combining-two-parts-on-the-same-staff.texidoc +++ b/Documentation/it/texidocs/combining-two-parts-on-the-same-staff.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Lo strumento di unione delle parti (il comando @code{\\partcombine}) permette di combinare varie parti sullo stesso rigo. Indicazioni testuali come diff --git a/Documentation/it/texidocs/conducting-signs,-measure-grouping-signs.texidoc b/Documentation/it/texidocs/conducting-signs,-measure-grouping-signs.texidoc index a9cbadd264..5dda8b2b92 100644 --- a/Documentation/it/texidocs/conducting-signs,-measure-grouping-signs.texidoc +++ b/Documentation/it/texidocs/conducting-signs,-measure-grouping-signs.texidoc @@ -1,9 +1,9 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il raggruppamento delle pulsazioni all'interno della misura è regolato dalla proprietà di contesto @code{beatStructure}. I valori di @code{beatStructure} per -varie indicazioni di tempo vengono stabiliti in @file{scm/time-signature-settings.scm}. Questi -valori possono essere impostati o modificati con @code{\\set}. Altrimenti, si +varie indicazioni di tempo vengono stabiliti in @code{scm/time-signature-settings.scm}. +Questi valori possono essere impostati o modificati con @code{\\set}. Altrimenti, si può usare @code{\\time} per impostare sia l'indicazione di tempo che la struttura delle pulsazioni. Per farlo si specifica il raggruppamento interno delle pulsazioni in una misura in una lista di numeri (nella sintassi di Scheme) prima dell'indicazione @@ -19,7 +19,7 @@ della misura. Tali segni facilitano la lettura di musica moderna ritmicamente complessa. Nell'esempio la misura di 9/8 è raggruppata in due diversi schemi usando due metodi differenti, mentre la misura di 5/8 è raggruppata in base alle -impostazioni predefinite in @file{scm/time-signature-settings.scm}: +impostazioni predefinite in @code{scm/time-signature-settings.scm}: " doctitleit = "Segni per la conduzione, segni di raggruppamento della misura" diff --git a/Documentation/it/texidocs/contemporary-glissando.texidoc b/Documentation/it/texidocs/contemporary-glissando.texidoc index 3e2c3133af..28afcb27cf 100644 --- a/Documentation/it/texidocs/contemporary-glissando.texidoc +++ b/Documentation/it/texidocs/contemporary-glissando.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Un glissando contemporaneo senza una nota finale può essere creato usando una nota nascosta e un tempo di cadenza. diff --git a/Documentation/it/texidocs/controlling-the-placement-of-chord-fingerings.texidoc b/Documentation/it/texidocs/controlling-the-placement-of-chord-fingerings.texidoc index 2b7569ae2b..f6a83e65d6 100644 --- a/Documentation/it/texidocs/controlling-the-placement-of-chord-fingerings.texidoc +++ b/Documentation/it/texidocs/controlling-the-placement-of-chord-fingerings.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il posizionamento dei numeri della diteggiatura può essere regolato in modo preciso. Perché l'orientamento funzioni, occorre usare il costrutto per diff --git a/Documentation/it/texidocs/controlling-the-vertical-ordering-of-scripts.texidoc b/Documentation/it/texidocs/controlling-the-vertical-ordering-of-scripts.texidoc index ac1fdac3c3..f6a21d47d9 100644 --- a/Documentation/it/texidocs/controlling-the-vertical-ordering-of-scripts.texidoc +++ b/Documentation/it/texidocs/controlling-the-vertical-ordering-of-scripts.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " L'ordine verticale degli script è determinato dalla proprietà @code{'script-priority}. Più il numero è piccolo, più sarà posto diff --git a/Documentation/it/texidocs/controlling-tuplet-bracket-visibility.texidoc b/Documentation/it/texidocs/controlling-tuplet-bracket-visibility.texidoc index 2a212c0609..277b3f2d94 100644 --- a/Documentation/it/texidocs/controlling-tuplet-bracket-visibility.texidoc +++ b/Documentation/it/texidocs/controlling-tuplet-bracket-visibility.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il comportamento predefinito relativo alla visibilità della parentesi quadra del gruppo irregolare è di mostrare una parentesi a meno che non ci sia diff --git a/Documentation/it/texidocs/creating-a-delayed-turn.texidoc b/Documentation/it/texidocs/creating-a-delayed-turn.texidoc index 3e93204e49..07f8188ff4 100644 --- a/Documentation/it/texidocs/creating-a-delayed-turn.texidoc +++ b/Documentation/it/texidocs/creating-a-delayed-turn.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Creare un gruppetto ritardato, dove la nota più bassa del gruppetto usa l'alterazione, richiede vari \override. La proprietà diff --git a/Documentation/it/texidocs/creating-arpeggios-across-notes-in-different-voices.texidoc b/Documentation/it/texidocs/creating-arpeggios-across-notes-in-different-voices.texidoc index 9be6542c7f..b1c34f7921 100644 --- a/Documentation/it/texidocs/creating-arpeggios-across-notes-in-different-voices.texidoc +++ b/Documentation/it/texidocs/creating-arpeggios-across-notes-in-different-voices.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Si può disegnare un arpeggio che attraversa delle note in voci diverse dello stesso rigo se si aggiunge l'incisore @code{Span_arpeggio_engraver} nel diff --git a/Documentation/it/texidocs/creating-cross-staff-arpeggios-in-a-piano-staff.texidoc b/Documentation/it/texidocs/creating-cross-staff-arpeggios-in-a-piano-staff.texidoc index 71ead8f058..0e750623f6 100644 --- a/Documentation/it/texidocs/creating-cross-staff-arpeggios-in-a-piano-staff.texidoc +++ b/Documentation/it/texidocs/creating-cross-staff-arpeggios-in-a-piano-staff.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " In un rigo per pianoforte (@code{PianoStaff}), è possibile far sì che un arpeggio attraversi i righi impostando la proprietà @code{PianoStaff.connectArpeggios}. diff --git a/Documentation/it/texidocs/creating-cross-staff-arpeggios-in-other-contexts.texidoc b/Documentation/it/texidocs/creating-cross-staff-arpeggios-in-other-contexts.texidoc index cd47728a73..01db304057 100644 --- a/Documentation/it/texidocs/creating-cross-staff-arpeggios-in-other-contexts.texidoc +++ b/Documentation/it/texidocs/creating-cross-staff-arpeggios-in-other-contexts.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Si possono creare arpeggi che attraversano i righi in contesti diversi da @code{GrandStaff}, @code{PianoStaff} e @code{StaffGroup} se l'incisore diff --git a/Documentation/it/texidocs/creating-custom-dynamics-in-midi-output.texidoc b/Documentation/it/texidocs/creating-custom-dynamics-in-midi-output.texidoc new file mode 100644 index 0000000000..c83102b3b5 --- /dev/null +++ b/Documentation/it/texidocs/creating-custom-dynamics-in-midi-output.texidoc @@ -0,0 +1,11 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +L'esempio seguente mostra come creare un segno di dinamica, non incluso +nell'elenco predefinito, e assegnargli un valore specifico così che +possa essere usato per cambiare l'output MIDI. + + +Al segno di dinamica @code{\\rfz} viene assegnato il valore @code{0.9}. + +" + doctitleit = "Creare dinamiche personalizzate nell'output MIDI" diff --git a/Documentation/it/texidocs/creating-metronome-marks-in-markup-mode.texidoc b/Documentation/it/texidocs/creating-metronome-marks-in-markup-mode.texidoc index fcc59b22a4..b4aeca7415 100644 --- a/Documentation/it/texidocs/creating-metronome-marks-in-markup-mode.texidoc +++ b/Documentation/it/texidocs/creating-metronome-marks-in-markup-mode.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Si possono creare nuove indicazioni metronomiche in modalità testuale, ma non modificheranno il tempo del file MIDI. diff --git a/Documentation/it/texidocs/cross-staff-tremolos.texidoc b/Documentation/it/texidocs/cross-staff-tremolos.texidoc index d951c0ef4e..37fa0e01c5 100644 --- a/Documentation/it/texidocs/cross-staff-tremolos.texidoc +++ b/Documentation/it/texidocs/cross-staff-tremolos.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Dato che @code{\\repeat tremolo} si aspetta esattamente due argomenti musicali per i tremoli di accordi, la nota o l'accordo che cambiano rigo in un tremolo che diff --git a/Documentation/it/texidocs/default-direction-of-stems-on-the-center-line-of-the-staff.texidoc b/Documentation/it/texidocs/default-direction-of-stems-on-the-center-line-of-the-staff.texidoc index e20c6effaa..33ff195b89 100644 --- a/Documentation/it/texidocs/default-direction-of-stems-on-the-center-line-of-the-staff.texidoc +++ b/Documentation/it/texidocs/default-direction-of-stems-on-the-center-line-of-the-staff.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " La direzione predefinita dei gambi sulla linea centrale del rigo si imposta con la proprietà @code{neutral-direction} dell'oggetto @code{Stem}. diff --git a/Documentation/it/texidocs/display-bracket-with-only-one-staff-in-a-system.texidoc b/Documentation/it/texidocs/display-bracket-with-only-one-staff-in-a-system.texidoc index 4441645841..a3f1ffe1a6 100644 --- a/Documentation/it/texidocs/display-bracket-with-only-one-staff-in-a-system.texidoc +++ b/Documentation/it/texidocs/display-bracket-with-only-one-staff-in-a-system.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Se c'è un solo rigo in uno dei tipi di rigo @code{ChoirStaff} o @code{StaffGroup}, la parentesi e la stanghetta iniziale non diff --git a/Documentation/it/texidocs/dynamics-custom-text-spanner-postfix.texidoc b/Documentation/it/texidocs/dynamics-custom-text-spanner-postfix.texidoc index 9e648ea5cd..53a6c0a8d9 100644 --- a/Documentation/it/texidocs/dynamics-custom-text-spanner-postfix.texidoc +++ b/Documentation/it/texidocs/dynamics-custom-text-spanner-postfix.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Funzioni postfix per estensori testuali personalizzati del crescendo. Gli estensori devono iniziare sulla prima nota della misura; e bisogna usare diff --git a/Documentation/it/texidocs/dynamics-text-spanner-postfix.texidoc b/Documentation/it/texidocs/dynamics-text-spanner-postfix.texidoc index 1192f0db22..a84b1aec6a 100644 --- a/Documentation/it/texidocs/dynamics-text-spanner-postfix.texidoc +++ b/Documentation/it/texidocs/dynamics-text-spanner-postfix.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Si possono definire estensori testuali personalizzati che fanno uso delle forcine e dei crescendo testuali. @code{\\<} e @code{\\>} generano le diff --git a/Documentation/it/texidocs/engraving-ties-manually.texidoc b/Documentation/it/texidocs/engraving-ties-manually.texidoc index e64c6a62b0..01f8ce35e8 100644 --- a/Documentation/it/texidocs/engraving-ties-manually.texidoc +++ b/Documentation/it/texidocs/engraving-ties-manually.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le legature di valore possono essere disegnate a mano cambiando la proprietà @code{tie-configuration} dell'oggetto @code{TieColumn}. Il diff --git a/Documentation/it/texidocs/entering-several-tuplets-using-only-one--times-command.texidoc b/Documentation/it/texidocs/entering-several-tuplets-using-only-one--tuplet-command.texidoc similarity index 90% rename from Documentation/it/texidocs/entering-several-tuplets-using-only-one--times-command.texidoc rename to Documentation/it/texidocs/entering-several-tuplets-using-only-one--tuplet-command.texidoc index 653f1c6f16..b2cb6f7c00 100644 --- a/Documentation/it/texidocs/entering-several-tuplets-using-only-one--times-command.texidoc +++ b/Documentation/it/texidocs/entering-several-tuplets-using-only-one--tuplet-command.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " La proprietà @code{tupletSpannerDuration} imposta la durata di ognuno dei gruppi irregolari compresi tra parentesi dopo il comando @code{\\tuplet}. diff --git a/Documentation/it/texidocs/extending-glissandi-across-repeats.texidoc b/Documentation/it/texidocs/extending-glissandi-across-repeats.texidoc index a742bc64fa..87b387a0ab 100644 --- a/Documentation/it/texidocs/extending-glissandi-across-repeats.texidoc +++ b/Documentation/it/texidocs/extending-glissandi-across-repeats.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Un glissando che si estende in vari blocchi @code{\\alternative} può essere simulato aggiungendo all'inizio di ogni blocco @code{\\alternative} diff --git a/Documentation/it/texidocs/flat-flags-and-beam-nibs.texidoc b/Documentation/it/texidocs/flat-flags-and-beam-nibs.texidoc index 5b5b92c814..79c8bf047a 100644 --- a/Documentation/it/texidocs/flat-flags-and-beam-nibs.texidoc +++ b/Documentation/it/texidocs/flat-flags-and-beam-nibs.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " È possibile ottenere delle codette su note isolate e dei tratti di suddivisione all'estremità della travatura con una combinazione di @code{stemLeftBeamCount}, @@ -10,10 +10,11 @@ Per ottenere delle codette rivolte a destra, si usa la coppia di indicatori Per ottenere delle codette rivolte a sinistra, si imposta invece @code{stemRightBeamCount} (Example 2). -Perché i tratti di suddivisione alla fine di un gruppo di note unite da travatura siano rivolti -a destra, si imposta @code{stemRightBeamCount} su un valore positivo. Perché i -tratti di suddivisione all'inizio di un gruppo di note unite da travatura siano rivolti a sinistra, -si imposta invece @code{stemLeftBeamCount} (Example 3). +Perché i tratti di suddivisione alla fine di un gruppo di note unite da +travatura siano rivolti a destra, si imposta @code{stemRightBeamCount} su un +valore positivo. Perché i tratti di suddivisione all'inizio di un gruppo di note +unite da travatura siano rivolti a sinistra, si imposta invece +@code{stemLeftBeamCount} (Example 3). Talvolta, ad esempio per una nota isolata circondata da pause, ha senso avere una coda che punti sia a destra che a sinistra. Lo si può fare con @@ -22,7 +23,7 @@ una coppia di indicatori di travatura @code{[]} da soli (Example 4). (Nota che @code{\\set stemLeftBeamCount} è sempre equivalente a @code{\\once \\set}. In altre parole, le impostazioni che definiscono il conteggio delle travature non @qq{permangono}, quindi la coppia di code -attaccate al @code{c'16[]} solitario nell'ultimo esempio non hanno nulla a +attaccate al @code{16[]} solitario nell'ultimo esempio non hanno nulla a che fare con l'impostazione @code{\\set} di due note prima.) " diff --git a/Documentation/it/texidocs/forcing-horizontal-shift-of-notes.texidoc b/Documentation/it/texidocs/forcing-horizontal-shift-of-notes.texidoc index 957354fdb1..4e3d51bbc2 100644 --- a/Documentation/it/texidocs/forcing-horizontal-shift-of-notes.texidoc +++ b/Documentation/it/texidocs/forcing-horizontal-shift-of-notes.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Quando il motore tipografico non riesce a risolvere una situazione, si può usare la sintassi che sovrascrive le decisioni tipografiche. L'unità di diff --git a/Documentation/it/texidocs/formatting-lyrics-syllables.texidoc b/Documentation/it/texidocs/formatting-lyrics-syllables.texidoc new file mode 100644 index 0000000000..1ac4046d2b --- /dev/null +++ b/Documentation/it/texidocs/formatting-lyrics-syllables.texidoc @@ -0,0 +1,7 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +La modalità markup può essere usata per formattare le singole +sillabe del testo vocale. + +" + doctitleit = "Formattazione delle sillabe del testo vocale" diff --git a/Documentation/it/texidocs/grid-lines--changing-their-appearance.texidoc b/Documentation/it/texidocs/grid-lines--changing-their-appearance.texidoc index 70a58e8286..53d48aa38a 100644 --- a/Documentation/it/texidocs/grid-lines--changing-their-appearance.texidoc +++ b/Documentation/it/texidocs/grid-lines--changing-their-appearance.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " L'aspetto delle linee della griglia può essere modificato sovrascrivendo alcune delle loro proprietà. diff --git a/Documentation/it/texidocs/guitar-strum-rhythms.texidoc b/Documentation/it/texidocs/guitar-strum-rhythms.texidoc index a4b66a0c3a..27bf3a83fb 100644 --- a/Documentation/it/texidocs/guitar-strum-rhythms.texidoc +++ b/Documentation/it/texidocs/guitar-strum-rhythms.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Per la musica per chitarra, è possibile mostrare i ritmi di accompagnamento, insieme alle note della melodia e ai nomi e ai diagrammi degli accordi. diff --git a/Documentation/it/texidocs/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.texidoc b/Documentation/it/texidocs/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.texidoc index 762b59dd44..7ecfbe90af 100644 --- a/Documentation/it/texidocs/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.texidoc +++ b/Documentation/it/texidocs/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo frammento mostra come nascondere le alterazioni delle note unite alla figura precedente mediante una legatura di valore all'inizio di un nuovo sistema diff --git a/Documentation/it/texidocs/hiding-the-extender-line-for-text-dynamics.texidoc b/Documentation/it/texidocs/hiding-the-extender-line-for-text-dynamics.texidoc index c123168f04..05acef6454 100644 --- a/Documentation/it/texidocs/hiding-the-extender-line-for-text-dynamics.texidoc +++ b/Documentation/it/texidocs/hiding-the-extender-line-for-text-dynamics.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " I cambi di dinamica in stile testuale (come cresc. e dim.) appaiono con una linea tratteggiata che mostra la loro estensione. Questa linea diff --git a/Documentation/it/texidocs/hymn-template.texidoc b/Documentation/it/texidocs/hymn-template.texidoc index 8ee2ac1b3f..5dffb7c712 100644 --- a/Documentation/it/texidocs/hymn-template.texidoc +++ b/Documentation/it/texidocs/hymn-template.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il codice seguente presenta un modo di impostare un inno in cui ogni verso inizia e finisce con una misura parziale. Mostra anche come aggiungere delle diff --git a/Documentation/it/texidocs/incipit.texidoc b/Documentation/it/texidocs/incipit.texidoc new file mode 100644 index 0000000000..3401bc59b8 --- /dev/null +++ b/Documentation/it/texidocs/incipit.texidoc @@ -0,0 +1,10 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +Quando si trascrive musica mensurale, un incipit all'inizio del brano è +utile per indicare il tempo e l'armatura di chiave originali. I musicisti +oggi sono abituati alle stanghette, ma queste non erano note all'epoca +della musica mensurale. Come compromesso, spesso le stanghette vengono +poste tra i righi, uno stile di formattazione chiamato mensurstriche. + +" + doctitleit = "Incipit" diff --git a/Documentation/it/texidocs/inserting-a-caesura.texidoc b/Documentation/it/texidocs/inserting-a-caesura.texidoc index bc108107da..51e2fcf1e1 100644 --- a/Documentation/it/texidocs/inserting-a-caesura.texidoc +++ b/Documentation/it/texidocs/inserting-a-caesura.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " I segni di cesura possono essere creati sovrascrivendo la proprietà @code{'text} dell'oggetto @code{BreathingSign}. È disponibile anche un segno di cesura diff --git a/Documentation/it/texidocs/isolated-percent-repeats.texidoc b/Documentation/it/texidocs/isolated-percent-repeats.texidoc index 34daa2f11c..56361e9010 100644 --- a/Documentation/it/texidocs/isolated-percent-repeats.texidoc +++ b/Documentation/it/texidocs/isolated-percent-repeats.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Si possono stampare anche segni di percentuale isolati. diff --git a/Documentation/it/texidocs/jazz-combo-template.texidoc b/Documentation/it/texidocs/jazz-combo-template.texidoc index 9e84989ac5..c3393e490d 100644 --- a/Documentation/it/texidocs/jazz-combo-template.texidoc +++ b/Documentation/it/texidocs/jazz-combo-template.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Ecco un modello piuttosto complesso, per un gruppo jazz. Si noti che tutti gli strumenti sono in @code{\\key c \\major}. Si tratta della tonalità diff --git a/Documentation/it/texidocs/lyrics-alignment.texidoc b/Documentation/it/texidocs/lyrics-alignment.texidoc new file mode 100644 index 0000000000..9e75d380c8 --- /dev/null +++ b/Documentation/it/texidocs/lyrics-alignment.texidoc @@ -0,0 +1,10 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " + +L'allineamento orizzontale del testo vocale si imposta attraverso la +proprietà @code{self-alignment-X} dell'oggetto @code{LyricText}. +@code{#-1} è sinistra, @code{#0} è centro e @code{#1} è destra; +si possono usare anche @code{#LEFT}, @code{#CENTER} e @code{#RIGHT}. + +" + doctitleit = "Allineamento del testo vocale" diff --git a/Documentation/it/texidocs/makam-example.texidoc b/Documentation/it/texidocs/makam-example.texidoc new file mode 100644 index 0000000000..022cbd9790 --- /dev/null +++ b/Documentation/it/texidocs/makam-example.texidoc @@ -0,0 +1,7 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +Makam è un tipo di melodia proveniente dalla Turchia che usa alterazioni +microtonali di 1/9. Consultare il file di inizializzazione @samp{ly/makam.ly} +per vedere come sono definiti i nomi delle altezze e le alterazioni. +" + doctitleit = "Esempio di makam" diff --git a/Documentation/it/texidocs/making-glissandi-breakable.texidoc b/Documentation/it/texidocs/making-glissandi-breakable.texidoc index 93fca27a9b..e63994bd4f 100644 --- a/Documentation/it/texidocs/making-glissandi-breakable.texidoc +++ b/Documentation/it/texidocs/making-glissandi-breakable.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Per permettere a un glissando di andare a capo se capita su un'interruzione di riga, si impostano le proprietà @code{breakable} e @code{after-line-breaking} diff --git a/Documentation/it/texidocs/making-slurs-with-complex-dash-structure.texidoc b/Documentation/it/texidocs/making-slurs-with-complex-dash-structure.texidoc index cbade23e06..88c04fb8e4 100644 --- a/Documentation/it/texidocs/making-slurs-with-complex-dash-structure.texidoc +++ b/Documentation/it/texidocs/making-slurs-with-complex-dash-structure.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le legature di portamento possono avere schemi di tratteggio complessi definendo la proprietà @code{dash-definition}. @code{dash-definition} è diff --git a/Documentation/it/texidocs/making-some-staff-lines-thicker-than-the-others.texidoc b/Documentation/it/texidocs/making-some-staff-lines-thicker-than-the-others.texidoc index 24efb79a76..61ef389dcd 100644 --- a/Documentation/it/texidocs/making-some-staff-lines-thicker-than-the-others.texidoc +++ b/Documentation/it/texidocs/making-some-staff-lines-thicker-than-the-others.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " In ambito didattico può essere utile rendere più spesso una linea del rigo (per esempio, la linea centrale, o per sottolineare la linea diff --git a/Documentation/it/texidocs/mensurstriche-layout-bar-lines-between-the-staves.texidoc b/Documentation/it/texidocs/mensurstriche-layout-bar-lines-between-the-staves.texidoc index d102b528f7..3344f1bf4c 100644 --- a/Documentation/it/texidocs/mensurstriche-layout-bar-lines-between-the-staves.texidoc +++ b/Documentation/it/texidocs/mensurstriche-layout-bar-lines-between-the-staves.texidoc @@ -1,9 +1,9 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " La formattazione mensurale, in cui le stanghette non appaiono sui righi ma nello spazio tra i righi, si può ottenere usando @code{StaffGroup} al posto -di @code{ChoirStaff}. La stanghetta sui righi viene nascosta impostando -la proprietà @code{transparent}. +di @code{ChoirStaff}. La stanghetta sui righi viene nascosta con +@code{\\hide}. " doctitleit = "Formattazione mensurale (stanghette tra i righi)" diff --git a/Documentation/it/texidocs/modifying-default-values-for-articulation-shorthand-notation.texidoc b/Documentation/it/texidocs/modifying-default-values-for-articulation-shorthand-notation.texidoc index 56f6f86e33..6272c3c383 100644 --- a/Documentation/it/texidocs/modifying-default-values-for-articulation-shorthand-notation.texidoc +++ b/Documentation/it/texidocs/modifying-default-values-for-articulation-shorthand-notation.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le abbreviazioni sono definite in @samp{ly/script-init.ly}, dove sono assegnati valori predefiniti alle variabili @code{dashHat}, @code{dashPlus}, diff --git a/Documentation/it/texidocs/modifying-the-ottava-spanner-slope.texidoc b/Documentation/it/texidocs/modifying-the-ottava-spanner-slope.texidoc new file mode 100644 index 0000000000..261311aac7 --- /dev/null +++ b/Documentation/it/texidocs/modifying-the-ottava-spanner-slope.texidoc @@ -0,0 +1,6 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +È possibile cambiare l'inclinazione dell'estensore dell'ottava. + +" + doctitleit = "Modificare l'inclinazione dell'estensore dell'ottava" diff --git a/Documentation/it/texidocs/multi-measure-rest-markup.texidoc b/Documentation/it/texidocs/multi-measure-rest-markup.texidoc index 62d258d356..c266b246bc 100644 --- a/Documentation/it/texidocs/multi-measure-rest-markup.texidoc +++ b/Documentation/it/texidocs/multi-measure-rest-markup.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il testo a margine di una pausa multipla viene centrato sopra o sotto di essa. Se il testo è lungo, la misura non si espanderà. Per espandere diff --git a/Documentation/it/texidocs/nesting-staves.texidoc b/Documentation/it/texidocs/nesting-staves.texidoc index c241c17677..163cc4daff 100644 --- a/Documentation/it/texidocs/nesting-staves.texidoc +++ b/Documentation/it/texidocs/nesting-staves.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Si può usare la proprietà @code{systemStartDelimiterHierarchy} per creare gruppi di righi annidati più complessi. Il comando @code{\\set diff --git a/Documentation/it/texidocs/non-default-tuplet-numbers.texidoc b/Documentation/it/texidocs/non-default-tuplet-numbers.texidoc index 718e2ca14b..b5d7fee205 100644 --- a/Documentation/it/texidocs/non-default-tuplet-numbers.texidoc +++ b/Documentation/it/texidocs/non-default-tuplet-numbers.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " LilyPond fornisce anche funzioni di formattazione che permettono di creare numeri di gruppi irregolari diversi dalla frazione vera e propria, così come diff --git a/Documentation/it/texidocs/non-traditional-key-signatures.texidoc b/Documentation/it/texidocs/non-traditional-key-signatures.texidoc index c3eba8e1c1..060031e689 100644 --- a/Documentation/it/texidocs/non-traditional-key-signatures.texidoc +++ b/Documentation/it/texidocs/non-traditional-key-signatures.texidoc @@ -1,13 +1,13 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il comando @code{\\key} comunemente usato imposta la proprietà -@code{keySignature}, che fa parte del contesto @code{Staff}. +@code{keyAlterations}, che fa parte del contesto @code{Staff}. Per creare armature di chiave non standard, tale proprietà va impostata esplicitamente. Il formato di questo comando è una lista: -@code{\\set Staff.keySignature = #`(((ottava . grado) . alterazione) ((ottava +@code{\\set Staff.keyAlterations = #`(((ottava . grado) . alterazione) ((ottava . grado) . alterazione) ...)} dove, per ogni elemento della lista, @code{ottava} indica l'ottava (0@tie{}è l'ottava dal Do@tie{}centrale al Si precedente), @code{grado} indica la nota all'interno diff --git a/Documentation/it/texidocs/numbers-as-easy-note-heads.texidoc b/Documentation/it/texidocs/numbers-as-easy-note-heads.texidoc index 5c0dc37bbc..dec944949f 100644 --- a/Documentation/it/texidocs/numbers-as-easy-note-heads.texidoc +++ b/Documentation/it/texidocs/numbers-as-easy-note-heads.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le teste di nota con nome della nota usano la proprietà @code{note-names} dell'oggetto @code{NoteHead} per determinare cosa appaia diff --git a/Documentation/it/texidocs/obtaining-2.12-lyrics-spacing-in-newer-versions.texidoc b/Documentation/it/texidocs/obtaining-2.12-lyrics-spacing-in-newer-versions.texidoc new file mode 100644 index 0000000000..0c9ad2493e --- /dev/null +++ b/Documentation/it/texidocs/obtaining-2.12-lyrics-spacing-in-newer-versions.texidoc @@ -0,0 +1,12 @@ +%% Translation of GIT committish: 1f7e785d25b62afbf2ed3119a9874010e79b9b12 + texidocit = " +Il motore di spaziatura verticale è cambiato a partire dalla +versione 2.14. Ciò può far sì che il testo vocale abbia un +posizionamento diverso. + +È possibile impostare delle proprietà dei contesti @code{Lyric} e @code{Staff} +che facciano sì che il motore di spaziatura si comporti come nella versione 2.12. + + +" + doctitleit = "Ottenere la spaziatura del testo della vecchia versione 2.12" diff --git a/Documentation/it/texidocs/orchestra,-choir-and-piano-template.texidoc b/Documentation/it/texidocs/orchestra,-choir-and-piano-template.texidoc index cd2ebd5461..254e865f07 100644 --- a/Documentation/it/texidocs/orchestra,-choir-and-piano-template.texidoc +++ b/Documentation/it/texidocs/orchestra,-choir-and-piano-template.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo modello mostra come usare i contesti annidati @code{StaffGroup} e @code{GrandStaff} per creare sottogruppi degli strumenti dello stesso diff --git a/Documentation/it/texidocs/ottava-text.texidoc b/Documentation/it/texidocs/ottava-text.texidoc index 62672e3c9b..6c17baf09d 100644 --- a/Documentation/it/texidocs/ottava-text.texidoc +++ b/Documentation/it/texidocs/ottava-text.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Internamente, @code{\\ottava} imposta le proprietà @code{ottavation} (ad esempio, su @code{8va} o @code{8vb}) e @code{middleCPosition}. Per diff --git a/Documentation/it/texidocs/partcombine-and-autobeamoff.texidoc b/Documentation/it/texidocs/partcombine-and-autobeamoff.texidoc index f77194353a..6d12eea7b1 100644 --- a/Documentation/it/texidocs/partcombine-and-autobeamoff.texidoc +++ b/Documentation/it/texidocs/partcombine-and-autobeamoff.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " La funzione @code{\\autoBeamOff}, se usata insieme a @code{\\partcombine}, può essere difficile da comprendere. diff --git a/Documentation/it/texidocs/percent-repeat-count-visibility.texidoc b/Documentation/it/texidocs/percent-repeat-count-visibility.texidoc index b4220af42f..b981396dd6 100644 --- a/Documentation/it/texidocs/percent-repeat-count-visibility.texidoc +++ b/Documentation/it/texidocs/percent-repeat-count-visibility.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " I contatori della ripetizione con segno percentuale possono essere mostrati a intervalli regolari impostando la proprietà di contesto @code{repeatCountVisibility}. diff --git a/Documentation/it/texidocs/percent-repeat-counter.texidoc b/Documentation/it/texidocs/percent-repeat-counter.texidoc index 7f47617d19..c8e6fd713b 100644 --- a/Documentation/it/texidocs/percent-repeat-counter.texidoc +++ b/Documentation/it/texidocs/percent-repeat-counter.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le ripetizioni di misura che hanno più di due ripetizioni possono avere un contatore se si cambia la proprietà opportuna, come mostra questo esempio: diff --git a/Documentation/it/texidocs/permitting-line-breaks-within-beamed-tuplets.texidoc b/Documentation/it/texidocs/permitting-line-breaks-within-beamed-tuplets.texidoc index 3b17ed2656..b1f82f534d 100644 --- a/Documentation/it/texidocs/permitting-line-breaks-within-beamed-tuplets.texidoc +++ b/Documentation/it/texidocs/permitting-line-breaks-within-beamed-tuplets.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo esempio artificioso mostra come permettere interruzioni del rigo sia manuali che automatiche all'interno di un gruppo irregolare con travature. diff --git a/Documentation/it/texidocs/piano-template-simple.texidoc b/Documentation/it/texidocs/piano-template-simple.texidoc index 8c30ac6714..660e7e816b 100644 --- a/Documentation/it/texidocs/piano-template-simple.texidoc +++ b/Documentation/it/texidocs/piano-template-simple.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Ecco un comune doppio pentagramma per pianoforte con un po' di note. diff --git a/Documentation/it/texidocs/piano-template-with-centered-lyrics.texidoc b/Documentation/it/texidocs/piano-template-with-centered-lyrics.texidoc index ca4fb20b31..44a9ac1e99 100644 --- a/Documentation/it/texidocs/piano-template-with-centered-lyrics.texidoc +++ b/Documentation/it/texidocs/piano-template-with-centered-lyrics.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: 1f7e785d25b62afbf2ed3119a9874010e79b9b12 texidocit = " Invece di destinare un rigo a parte alla linea melodica e al suo testo, è possibile collocare il testo al centro di un doppio pentagramma per pianoforte. diff --git a/Documentation/it/texidocs/piano-template-with-melody-and-lyrics.texidoc b/Documentation/it/texidocs/piano-template-with-melody-and-lyrics.texidoc index 67ce1696db..d607c355ad 100644 --- a/Documentation/it/texidocs/piano-template-with-melody-and-lyrics.texidoc +++ b/Documentation/it/texidocs/piano-template-with-melody-and-lyrics.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Ecco un tipico formato per canzoni: un rigo con linea melodica e testo, e sotto l'accompagnamento per pianoforte. diff --git a/Documentation/it/texidocs/positioning-grace-notes-with-floating-space.texidoc b/Documentation/it/texidocs/positioning-grace-notes-with-floating-space.texidoc index 2c5382474b..fab7eabd30 100644 --- a/Documentation/it/texidocs/positioning-grace-notes-with-floating-space.texidoc +++ b/Documentation/it/texidocs/positioning-grace-notes-with-floating-space.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Se si imposta la proprietà @code{'strict-grace-spacing}, le colonne musicali degli abbellimenti 'fluttuano', ovvero si scollegano dalle note normali: diff --git a/Documentation/it/texidocs/positioning-multi-measure-rests.texidoc b/Documentation/it/texidocs/positioning-multi-measure-rests.texidoc index 18724dedbd..94faef2d68 100644 --- a/Documentation/it/texidocs/positioning-multi-measure-rests.texidoc +++ b/Documentation/it/texidocs/positioning-multi-measure-rests.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Diversamente dalle pause normali, non esiste un comando predefinito per cambiare la posizione sul rigo di un simbolo di pausa multipla di qualsiasi diff --git a/Documentation/it/texidocs/positioning-text-markups-inside-slurs.texidoc b/Documentation/it/texidocs/positioning-text-markups-inside-slurs.texidoc index 5108fc0d8e..05c4d69091 100644 --- a/Documentation/it/texidocs/positioning-text-markups-inside-slurs.texidoc +++ b/Documentation/it/texidocs/positioning-text-markups-inside-slurs.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " I testi a margine devono avere la proprietà @code{outside-staff-priority} impostata su false per poter apparire dentro le legature di portamento. diff --git a/Documentation/it/texidocs/preventing-extra-naturals-from-being-automatically-added.texidoc b/Documentation/it/texidocs/preventing-extra-naturals-from-being-automatically-added.texidoc index 17fc9173af..a4c8d7e39e 100644 --- a/Documentation/it/texidocs/preventing-extra-naturals-from-being-automatically-added.texidoc +++ b/Documentation/it/texidocs/preventing-extra-naturals-from-being-automatically-added.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Secondo le norme tipografiche tradizionali, un segno di bequadro viene inserito prima di un diesis o di un bemolle se un precedente doppio diesis o diff --git a/Documentation/it/texidocs/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.texidoc b/Documentation/it/texidocs/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.texidoc index 3286fbb098..a62cf3057a 100644 --- a/Documentation/it/texidocs/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.texidoc +++ b/Documentation/it/texidocs/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Quando l'armatura di chiave cambia, vengono inseriti automaticamente i segni di bequadro per annulare le alterazioni di precedenti armature. Si diff --git a/Documentation/it/texidocs/printing-a-repeat-sign-at-the-beginning-of-a-piece.texidoc b/Documentation/it/texidocs/printing-a-repeat-sign-at-the-beginning-of-a-piece.texidoc deleted file mode 100644 index f9791cb141..0000000000 --- a/Documentation/it/texidocs/printing-a-repeat-sign-at-the-beginning-of-a-piece.texidoc +++ /dev/null @@ -1,7 +0,0 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 - texidocit = " -Una stanghetta @code{.|:} può apparire all'inizio di un brano, se si -sovrascrive la proprietà pertinente: - -" - doctitleit = "Stampare un segno di ripetizione all'inizio di un brano" diff --git a/Documentation/it/texidocs/printing-bar-numbers-at-regular-intervals.texidoc b/Documentation/it/texidocs/printing-bar-numbers-at-regular-intervals.texidoc index 7de0cba7c4..dd3df5d53e 100644 --- a/Documentation/it/texidocs/printing-bar-numbers-at-regular-intervals.texidoc +++ b/Documentation/it/texidocs/printing-bar-numbers-at-regular-intervals.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " I numeri di battuta possono essere resi visbili a intervalli regolari attraverso la proprietà @code{barNumberVisibility}. In questo esempio diff --git a/Documentation/it/texidocs/printing-bar-numbers-inside-boxes-or-circles.texidoc b/Documentation/it/texidocs/printing-bar-numbers-inside-boxes-or-circles.texidoc index c61342d4f3..414065636d 100644 --- a/Documentation/it/texidocs/printing-bar-numbers-inside-boxes-or-circles.texidoc +++ b/Documentation/it/texidocs/printing-bar-numbers-inside-boxes-or-circles.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " I numeri di battuta possono apparire anche all'interno di rettangoli o cerchi. diff --git a/Documentation/it/texidocs/printing-bar-numbers-with-changing-regular-intervals.texidoc b/Documentation/it/texidocs/printing-bar-numbers-with-changing-regular-intervals.texidoc new file mode 100644 index 0000000000..c67b0e675c --- /dev/null +++ b/Documentation/it/texidocs/printing-bar-numbers-with-changing-regular-intervals.texidoc @@ -0,0 +1,8 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +L'intervallo dei numeri di battuta può essere modificato cambiando la +funzione di contesto @code{@{set-bar-number-visibility@}}. + +" + doctitleit = "Stampare i numeri di battuta a intervalli regolari variabili" + diff --git a/Documentation/it/texidocs/printing-hairpins-in-various-styles.texidoc b/Documentation/it/texidocs/printing-hairpins-in-various-styles.texidoc index 5a3c1018f2..0132b28304 100644 --- a/Documentation/it/texidocs/printing-hairpins-in-various-styles.texidoc +++ b/Documentation/it/texidocs/printing-hairpins-in-various-styles.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il segno di dinamica della forcella può avere diversi stili diff --git a/Documentation/it/texidocs/printing-hairpins-using-al-niente-notation.texidoc b/Documentation/it/texidocs/printing-hairpins-using-al-niente-notation.texidoc index 4df9c3a1b7..797c7d7f08 100644 --- a/Documentation/it/texidocs/printing-hairpins-using-al-niente-notation.texidoc +++ b/Documentation/it/texidocs/printing-hairpins-using-al-niente-notation.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le forcelle di dinamica possono essere rappresentate con ua punta tonda (notazione @qq{al niente}) impostando la proprietà @code{circled-tip} diff --git a/Documentation/it/texidocs/printing-marks-at-the-end-of-a-line.texidoc b/Documentation/it/texidocs/printing-marks-at-the-end-of-a-line.texidoc index 43f285f559..4b7c5079a9 100644 --- a/Documentation/it/texidocs/printing-marks-at-the-end-of-a-line.texidoc +++ b/Documentation/it/texidocs/printing-marks-at-the-end-of-a-line.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " È possibile posizionare le indicazioni alla fine della linea corrente, invece che all'inizio della linea successiva. In tali casi, può essere preferibile diff --git a/Documentation/it/texidocs/printing-marks-on-every-staff.texidoc b/Documentation/it/texidocs/printing-marks-on-every-staff.texidoc index 6781d12c62..0aa0af296b 100644 --- a/Documentation/it/texidocs/printing-marks-on-every-staff.texidoc +++ b/Documentation/it/texidocs/printing-marks-on-every-staff.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Sebbene le indicazioni testuali siano di norma collocate solo sopra il rigo più alto, è possibile farle apparire su ogni rigo. diff --git a/Documentation/it/texidocs/printing-metronome-and-rehearsal-marks-below-the-staff.texidoc b/Documentation/it/texidocs/printing-metronome-and-rehearsal-marks-below-the-staff.texidoc index 231bf41de3..4d6c74ce91 100644 --- a/Documentation/it/texidocs/printing-metronome-and-rehearsal-marks-below-the-staff.texidoc +++ b/Documentation/it/texidocs/printing-metronome-and-rehearsal-marks-below-the-staff.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Di norma, il metronomo e i numeri di chiamata vengono posizionati sopra il rigo. Per metterli sotto il rigo basta impostare correttamente la proprietà diff --git a/Documentation/it/texidocs/printing-the-bar-number-for-the-first-measure.texidoc b/Documentation/it/texidocs/printing-the-bar-number-for-the-first-measure.texidoc index 8f8861f3a6..e47ac4b805 100644 --- a/Documentation/it/texidocs/printing-the-bar-number-for-the-first-measure.texidoc +++ b/Documentation/it/texidocs/printing-the-bar-number-for-the-first-measure.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il primo numero di battuta di una partitura viene soppresso se è inferiore o uguale a `1'. Se si imposta @code{barNumberVisibility} su diff --git a/Documentation/it/texidocs/redefining-grace-note-global-defaults.texidoc b/Documentation/it/texidocs/redefining-grace-note-global-defaults.texidoc index 1686d57dc8..09855cac9e 100644 --- a/Documentation/it/texidocs/redefining-grace-note-global-defaults.texidoc +++ b/Documentation/it/texidocs/redefining-grace-note-global-defaults.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le impostazioni globali predefinite degli abbellimenti sono salvate negli identificatori @code{startGraceMusic}, @code{stopGraceMusic}, diff --git a/Documentation/it/texidocs/removing-bar-numbers-from-a-score.texidoc b/Documentation/it/texidocs/removing-bar-numbers-from-a-score.texidoc index 070ddd40ef..134c84c6c9 100644 --- a/Documentation/it/texidocs/removing-bar-numbers-from-a-score.texidoc +++ b/Documentation/it/texidocs/removing-bar-numbers-from-a-score.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " I numeri di battuta possono essere tolti rimuovendo l'incisore @code{Bar_number_engraver} dal contesto @code{Score}. diff --git a/Documentation/it/texidocs/removing-the-first-empty-line.texidoc b/Documentation/it/texidocs/removing-the-first-empty-line.texidoc index d864a456a0..da30349fe4 100644 --- a/Documentation/it/texidocs/removing-the-first-empty-line.texidoc +++ b/Documentation/it/texidocs/removing-the-first-empty-line.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il primo rigo vuoto si può togliere dalla partitura impostando la proprietà @code{remove-first} di @code{VerticalAxisGroup}. Questa impostazione diff --git a/Documentation/it/texidocs/replacing-default-midi-instrument-equalization.texidoc b/Documentation/it/texidocs/replacing-default-midi-instrument-equalization.texidoc new file mode 100644 index 0000000000..6d0067a4ae --- /dev/null +++ b/Documentation/it/texidocs/replacing-default-midi-instrument-equalization.texidoc @@ -0,0 +1,14 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +L'equalizzatore predefinito degli strumenti MIDI può essere modificato +impostando la proprietà @code{instrumentEqualizer} nel contesto @code{Score} +come una procedura Scheme definita dall'utente che usi il nome dello strumento +MIDI come argomento insieme a una coppia di frazioni indicanti i volumi +minimi e massimi da applicare a quello specifico strumento. + +L'esempio seguente imposta i volumi massimo e minimo per il flauto e +per il clarintetto. + +" + doctitleit = "Modificare l'equalizzazione predefinita degli strumenti MIDI" + diff --git a/Documentation/it/texidocs/rest-styles.texidoc b/Documentation/it/texidocs/rest-styles.texidoc index eeb368617f..10431a90aa 100644 --- a/Documentation/it/texidocs/rest-styles.texidoc +++ b/Documentation/it/texidocs/rest-styles.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Esistono vari stili di pausa. diff --git a/Documentation/it/texidocs/satb-choir-template---four-staves.texidoc b/Documentation/it/texidocs/satb-choir-template---four-staves.texidoc index 37a913dd9d..02d287bf1f 100644 --- a/Documentation/it/texidocs/satb-choir-template---four-staves.texidoc +++ b/Documentation/it/texidocs/satb-choir-template---four-staves.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Modello per coro SATB (quattro righi) diff --git a/Documentation/it/texidocs/setting-hairpin-behavior-at-bar-lines.texidoc b/Documentation/it/texidocs/setting-hairpin-behavior-at-bar-lines.texidoc index 5692773d49..3e4f5d76ad 100644 --- a/Documentation/it/texidocs/setting-hairpin-behavior-at-bar-lines.texidoc +++ b/Documentation/it/texidocs/setting-hairpin-behavior-at-bar-lines.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Se la nota che termina una forcella si trova sul primo battito di una battuta, la forcella si ferma prima della stanghetta che precede la diff --git a/Documentation/it/texidocs/setting-the-double-repeat-default-for-volte.texidoc b/Documentation/it/texidocs/setting-the-double-repeat-default-for-volte.texidoc index 6ccd71fc61..e455bf3236 100644 --- a/Documentation/it/texidocs/setting-the-double-repeat-default-for-volte.texidoc +++ b/Documentation/it/texidocs/setting-the-double-repeat-default-for-volte.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Esistono tre diversi stili di doppie ripetizioni per le volte, che si possono impostare con @code{doubleRepeatType}. diff --git a/Documentation/it/texidocs/setting-the-minimum-length-of-hairpins.texidoc b/Documentation/it/texidocs/setting-the-minimum-length-of-hairpins.texidoc index cca0a8ceda..448581e82b 100644 --- a/Documentation/it/texidocs/setting-the-minimum-length-of-hairpins.texidoc +++ b/Documentation/it/texidocs/setting-the-minimum-length-of-hairpins.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Se le forcelle sono troppo corte, possono essere allungate modificando la proprietà @code{minimum-length} dell'oggetto @code{Hairpin}. diff --git a/Documentation/it/texidocs/shortening-volta-brackets.texidoc b/Documentation/it/texidocs/shortening-volta-brackets.texidoc index 84889afc7c..ab43cb8be4 100644 --- a/Documentation/it/texidocs/shortening-volta-brackets.texidoc +++ b/Documentation/it/texidocs/shortening-volta-brackets.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Per impostazione predefinita, le parentesi delle volte si estendono per tutta l'alternativa, ma si possono accorciare impostando diff --git a/Documentation/it/texidocs/simple-lead-sheet.texidoc b/Documentation/it/texidocs/simple-lead-sheet.texidoc new file mode 100644 index 0000000000..a6156aa079 --- /dev/null +++ b/Documentation/it/texidocs/simple-lead-sheet.texidoc @@ -0,0 +1,7 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +Mettendo insieme nomi degli accordi, melodia e testo si ottiene un +canzoniere (in inglese @qq{lead sheet}): + +" + doctitleit = "Canzoniere semplice" diff --git a/Documentation/it/texidocs/single-staff-template-with-notes,-lyrics,-and-chords.texidoc b/Documentation/it/texidocs/single-staff-template-with-notes,-lyrics,-and-chords.texidoc index e9c8d7004e..c9adfc8244 100644 --- a/Documentation/it/texidocs/single-staff-template-with-notes,-lyrics,-and-chords.texidoc +++ b/Documentation/it/texidocs/single-staff-template-with-notes,-lyrics,-and-chords.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Ecco il modello di un comune spartito semplificato (lead sheet): include linea melodica, testo vocale e sigle degli accordi. diff --git a/Documentation/it/texidocs/single-staff-template-with-notes-and-chords.texidoc b/Documentation/it/texidocs/single-staff-template-with-notes-and-chords.texidoc index 8a4eddc7f3..fa6b449fdb 100644 --- a/Documentation/it/texidocs/single-staff-template-with-notes-and-chords.texidoc +++ b/Documentation/it/texidocs/single-staff-template-with-notes-and-chords.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Vuoi preparare uno spartito semplificato (lead sheet) con melodia e accordi? La tua ricerca è finita! diff --git a/Documentation/it/texidocs/single-staff-template-with-notes-and-lyrics.texidoc b/Documentation/it/texidocs/single-staff-template-with-notes-and-lyrics.texidoc index f4e9103178..5799261210 100644 --- a/Documentation/it/texidocs/single-staff-template-with-notes-and-lyrics.texidoc +++ b/Documentation/it/texidocs/single-staff-template-with-notes-and-lyrics.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo piccolo modello presenta una semplice linea melodica con un testo. Copialo e incollalo, aggiungi le note e le parole. Questo esempio disabilita la diff --git a/Documentation/it/texidocs/single-staff-template-with-only-notes.texidoc b/Documentation/it/texidocs/single-staff-template-with-only-notes.texidoc index 02b6699976..ca34ce055f 100644 --- a/Documentation/it/texidocs/single-staff-template-with-only-notes.texidoc +++ b/Documentation/it/texidocs/single-staff-template-with-only-notes.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo modello molto semplice mette a disposizione un rigo con delle note ed è quindi adatto per uno strumento non accompagnato o per un frammento diff --git a/Documentation/it/texidocs/stand-alone-two-column-markup.texidoc b/Documentation/it/texidocs/stand-alone-two-column-markup.texidoc index 3a2f283f88..dbc7f3ff79 100644 --- a/Documentation/it/texidocs/stand-alone-two-column-markup.texidoc +++ b/Documentation/it/texidocs/stand-alone-two-column-markup.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il testo separato può essere disposto su varie colonne con i comandi di @code{\\markup}: diff --git a/Documentation/it/texidocs/strict-beat-beaming.texidoc b/Documentation/it/texidocs/strict-beat-beaming.texidoc index 123e051fb5..d5d0fb1ad4 100644 --- a/Documentation/it/texidocs/strict-beat-beaming.texidoc +++ b/Documentation/it/texidocs/strict-beat-beaming.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Si possono impostare i tratti di suddivisione della travatura in modo che siano rivolti verso la relativa pulsazione. La prima travatura fa sì che non spuntino diff --git a/Documentation/it/texidocs/string-quartet-template-simple.texidoc b/Documentation/it/texidocs/string-quartet-template-simple.texidoc index f7b7f8b8ca..09b057f748 100644 --- a/Documentation/it/texidocs/string-quartet-template-simple.texidoc +++ b/Documentation/it/texidocs/string-quartet-template-simple.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo modello presenta un semplice quartetto d'archi. Impiega anche una sezione @code{\\global} per definire il tempo e l'armatura di chiave. diff --git a/Documentation/it/texidocs/string-quartet-template-with-separate-parts.texidoc b/Documentation/it/texidocs/string-quartet-template-with-separate-parts.texidoc index ac32c5342d..a3e78d7075 100644 --- a/Documentation/it/texidocs/string-quartet-template-with-separate-parts.texidoc +++ b/Documentation/it/texidocs/string-quartet-template-with-separate-parts.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il frammento di codice del @qq{Modello per quartetto d'archi} crea un bel quartetto, ma cosa fare se si ha bisogno di creare le singole parti? Questo diff --git a/Documentation/it/texidocs/subdividing-beams.texidoc b/Documentation/it/texidocs/subdividing-beams.texidoc index d50e918b39..4a115c3f6d 100644 --- a/Documentation/it/texidocs/subdividing-beams.texidoc +++ b/Documentation/it/texidocs/subdividing-beams.texidoc @@ -1,20 +1,27 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le travature di note consecutive di un sedicesimo (o più brevi) non -vengono suddivise, ovvero i tre (o più) tratti della travatura si estendono, senza -spezzarsi, sugli interi gruppi di note. Questo comportamento può essere -modificato in modo da suddividere le travature in sottoraggruppamenti attraverso -la proprietà @code{subdivideBeams}. -Se impostata, le travature che comprendono più sottoraggruppamenti verranno suddivise a intervalli -definiti dal valore attuale di @code{baseMoment}, riducendo le travature -multiple a una sola travatura che collega i sottoraggruppamenti. Si noti che -@code{baseMoment}, se non impostata esplicitamente, equivale a uno fratto -il denominatore dell'attuale indicazione di tempo. Deve quindi essere -impostata su una frazione che stabilisca la durata del sottogruppo di -travature; lo si può fare usando la funzione @code{ly:make-moment}, come -è mostrato in questo frammento di codice. Inoltre quando @code{baseMoment} -cambia, anche @code{beatStructure} deve essere modificato per accordarsi -con @code{baseMoment}: +vengono suddivise, ovvero i tre (o più) tratti della travatura si +estendono, senza spezzarsi, sugli interi gruppi di note. +Questo comportamento può essere modificato in modo da suddividere le +travature in sottogruppi attraverso la proprietà +@code{subdivideBeams}. Se impostata, le travature che comprendono più +sottogruppi verranno suddivise a intervalli definiti dal +valore attuale di @code{baseMoment}, riducendo le travature multiple +al numero di travature che indica il valore metrico della suddivisione. +Se il gruppo successivo alla suddivisione è più breve del valore +metrico corrente (di solito perché la travatura è incompleta), il +numero di travature riflette il gruppo di suddivisione più lungo +possibile. Tuttavia, se rimane una sola nota dopo la divisione, questa +restrizione non viene applicata. +Si noti che @code{baseMoment}, se non impostata +esplicitamente, equivale a uno fratto il denominatore dell'attuale +indicazione di tempo. Deve quindi essere impostata su una frazione +che stabilisca la durata del sottogruppo di travature; lo si può fare +usando la funzione @code{ly:make-moment}, come è mostrato in questo +frammento di codice. Inoltre quando @code{baseMoment} cambia, anche +@code{beatStructure} deve essere modificato per accordarsi con +@code{baseMoment}: " doctitleit = "Suddividere le travature" diff --git a/Documentation/it/texidocs/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.texidoc b/Documentation/it/texidocs/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.texidoc index 5516022dad..7166858dbd 100644 --- a/Documentation/it/texidocs/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.texidoc +++ b/Documentation/it/texidocs/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Talvolta un'indicazione di tempo non deve mostrare la frazione intera (ad esempio 7/4), ma solo il numeratore (7 in questo caso). Si può ottenere facilmente con diff --git a/Documentation/it/texidocs/transposing-pitches-with-minimum-accidentals-smart-transpose.texidoc b/Documentation/it/texidocs/transposing-pitches-with-minimum-accidentals-smart-transpose.texidoc index 399c967e53..a2029149f4 100644 --- a/Documentation/it/texidocs/transposing-pitches-with-minimum-accidentals-smart-transpose.texidoc +++ b/Documentation/it/texidocs/transposing-pitches-with-minimum-accidentals-smart-transpose.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo esempio usa del codice Scheme per imporre delle modifiche enarmoniche alle note che permettano di avere il numero minimo di diff --git a/Documentation/it/texidocs/tweaking-clef-properties.texidoc b/Documentation/it/texidocs/tweaking-clef-properties.texidoc index c3eb8f2ef3..832479fa1d 100644 --- a/Documentation/it/texidocs/tweaking-clef-properties.texidoc +++ b/Documentation/it/texidocs/tweaking-clef-properties.texidoc @@ -1,32 +1,18 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " -Il comando @code{\\clef \"treble_8\"} equivale a impostare +Cambiando il glifo della chiave, la sua posizione o l'ottavazione non +cambia la posizione delle note successive nel rigo. Per far sì che +le armature di chiave si trovino sulle linee del rigo corrette, bisogna +specificare anche @code{middleCPosition}, con valori positivi o negativi +che spostano il @code{Do centrale} rispettivamente su o giù in senso +relativo alla linea centrale del rigo. + +Per esempio, @code{\\clef \"treble_8\"} equivale a impostare @code{clefGlyph}, @code{clefPosition} (che regola la posizione verticale della chiave), @code{middleCPosition} e @code{clefTransposition}. Viene stampata una chiave quando cambia una di queste proprietà, eccetto @code{middleCPosition}. - -La modifica del glifo, della posizione della chiave o -dell'ottavazione non è sufficiente per cambiare la posizione delle -note che seguono sul rigo: bisogna anche specificare la posizione -del Do centrale (middle C). Per far sì che le armature di chiave -si trovino sulle linee corrette del rigo, occorre impostare anche -@code{middleCClefPosition}. I parametri di posizione sono relativi -alla linea centrale del rigo, con i numeri positivi che indicano -la parte superiore: ogni linea e spazio valgono uno. Il valore -@code{clefTransposition} di norma è impostato su 7, -7, 15 -o -15, ma altri valori sono considerati validi. - - -Quando un cambio di chiave avviene in corrispondenza di un'interruzione di -linea, di norma il simbolo della nuova chiave viene inserito sia alla fine -del rigo precedente sia all'inizio di quello successivo. Se la -chiave di avvertimento a fine rigo non fosse necessaria, -può essere nascosta impostando la proprietà @code{explicitClefVisibility} -del contesto @code{Staff} su @code{end-of-line-invisible}. Il comportamento -predefinito può essere ripristinato con @code{\\unset Staff.explicitClefVisibility}. - Gli esempi seguenti mostrano le possibilità date dall'impostazione manuale di tali proprietà. Sulla prima linea le modifiche manuali preservano il posizionamento relativo standard di chiavi e note, mentre sulla seconda diff --git a/Documentation/it/texidocs/tweaking-grace-layout-within-music.texidoc b/Documentation/it/texidocs/tweaking-grace-layout-within-music.texidoc index d04af80f3e..b27b5e539b 100644 --- a/Documentation/it/texidocs/tweaking-grace-layout-within-music.texidoc +++ b/Documentation/it/texidocs/tweaking-grace-layout-within-music.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " L'aspetto di tutte le espressioni contenute nei blocchi @code{\grace} di un brano può essere modificato con le funzioni @code{add-grace-property} e diff --git a/Documentation/it/texidocs/use-square-bracket-at-the-start-of-a-staff-group.texidoc b/Documentation/it/texidocs/use-square-bracket-at-the-start-of-a-staff-group.texidoc index 61bcf198e9..22f5133738 100644 --- a/Documentation/it/texidocs/use-square-bracket-at-the-start-of-a-staff-group.texidoc +++ b/Documentation/it/texidocs/use-square-bracket-at-the-start-of-a-staff-group.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Si può usare il segno @code{SystemStartSquare} (uno dei segni che delimitano l'inizio del sistema) impostandolo esplicitamente in un contesto diff --git a/Documentation/it/texidocs/using-a-tick-as-the-breath-mark-symbol.texidoc b/Documentation/it/texidocs/using-a-tick-as-the-breath-mark-symbol.texidoc index a24b630523..2a23ee44d1 100644 --- a/Documentation/it/texidocs/using-a-tick-as-the-breath-mark-symbol.texidoc +++ b/Documentation/it/texidocs/using-a-tick-as-the-breath-mark-symbol.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " La musica vocale e per fiati usa frequentemente il segno di spunta come segno di respiro. Questo indica un respiro che sottrae un po' di tempo alla nota diff --git a/Documentation/it/texidocs/using-an-extra-voice-for-breaks.texidoc b/Documentation/it/texidocs/using-an-extra-voice-for-breaks.texidoc new file mode 100644 index 0000000000..b4abcdc2be --- /dev/null +++ b/Documentation/it/texidocs/using-an-extra-voice-for-breaks.texidoc @@ -0,0 +1,14 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +Spesso è più facile gestire l'informazione sulle interruzioni di linea +e di pagina tenendola separata dalla musica grazie a un'ulteriore voce +che contenga solo pause spaziatrici e i comandi +@code{\\break}, @code{\\pageBreak} e altre informazioni di formattazione. + +Questo modello diventa utile specialmente quando si modifica +@code{line-break-system-details} e altre utili ma lunghe +proprietà di @code{NonMusicalPaperColumnGrob}. + +" + doctitleit = "Usare una voce apposita per le interruzioni" + diff --git a/Documentation/it/texidocs/using-arpeggiobracket-to-make-divisi-more-visible.texidoc b/Documentation/it/texidocs/using-arpeggiobracket-to-make-divisi-more-visible.texidoc new file mode 100644 index 0000000000..e7baa0d8f3 --- /dev/null +++ b/Documentation/it/texidocs/using-arpeggiobracket-to-make-divisi-more-visible.texidoc @@ -0,0 +1,8 @@ +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 + texidocit = " +Si può usare @code{arpeggioBracket} per indicare la divisione delle +voci quando non ci sono gambi che forniscano questa informazione. Questo +caso è frequente nella musica corale. + +" + doctitleit = "Usare arpeggioBracket per rendere i divisi più visibili" diff --git a/Documentation/it/texidocs/using-double-slurs-for-legato-chords.texidoc b/Documentation/it/texidocs/using-double-slurs-for-legato-chords.texidoc index 4e29990d83..6d17f8d32c 100644 --- a/Documentation/it/texidocs/using-double-slurs-for-legato-chords.texidoc +++ b/Documentation/it/texidocs/using-double-slurs-for-legato-chords.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Alcuni compositori scrivono due legature di portamento per indicare gli accordi legati. Si può ottenere questo risultato impostando @code{doubleSlurs}. diff --git a/Documentation/it/texidocs/using-grace-note-slashes-with-normal-heads.texidoc b/Documentation/it/texidocs/using-grace-note-slashes-with-normal-heads.texidoc index c9f74b1dda..1ce9ea6cce 100644 --- a/Documentation/it/texidocs/using-grace-note-slashes-with-normal-heads.texidoc +++ b/Documentation/it/texidocs/using-grace-note-slashes-with-normal-heads.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Il gambo barrato presente nelle acciaccature può essere applicato in altre situazioni. diff --git a/Documentation/it/texidocs/using-ties-with-arpeggios.texidoc b/Documentation/it/texidocs/using-ties-with-arpeggios.texidoc index 094d5867d3..63f28fc072 100644 --- a/Documentation/it/texidocs/using-ties-with-arpeggios.texidoc +++ b/Documentation/it/texidocs/using-ties-with-arpeggios.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Le legature di valore vengono usate talvolta per scrivere un arpeggio. In questo caso, le due note da legare devono non essere consecutive. Per ottenere tale risultato diff --git a/Documentation/it/texidocs/vertically-aligned-dynamics-and-textscripts.texidoc b/Documentation/it/texidocs/vertically-aligned-dynamics-and-textscripts.texidoc index 026dcff14f..876a4b82ed 100644 --- a/Documentation/it/texidocs/vertically-aligned-dynamics-and-textscripts.texidoc +++ b/Documentation/it/texidocs/vertically-aligned-dynamics-and-textscripts.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Tutti gli oggetti @code{DynamicLineSpanner} (forcelle e testi di dinamica) sono posti a una distanza minima dal rigo determinata da @code{'staff-padding}. diff --git a/Documentation/it/texidocs/vertically-aligning-ossias-and-lyrics.texidoc b/Documentation/it/texidocs/vertically-aligning-ossias-and-lyrics.texidoc index 1b9f453629..214c9094c4 100644 --- a/Documentation/it/texidocs/vertically-aligning-ossias-and-lyrics.texidoc +++ b/Documentation/it/texidocs/vertically-aligning-ossias-and-lyrics.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo frammento mostra come usare le proprietà di contesto @code{alignBelowContext} e @code{alignAboveContext} per diff --git a/Documentation/it/texidocs/vocal-ensemble-template-with-automatic-piano-reduction.texidoc b/Documentation/it/texidocs/vocal-ensemble-template-with-automatic-piano-reduction.texidoc index ebd4932d0a..1a1736ae77 100644 --- a/Documentation/it/texidocs/vocal-ensemble-template-with-automatic-piano-reduction.texidoc +++ b/Documentation/it/texidocs/vocal-ensemble-template-with-automatic-piano-reduction.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo modello aggiunge una riduzione automatica per pianoforte alla tipica partitura vocale SATB illustrata in @qq{Modello per complesso vocale}. Si diff --git a/Documentation/it/texidocs/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.texidoc b/Documentation/it/texidocs/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.texidoc index f9cd799b68..b88fea99c3 100644 --- a/Documentation/it/texidocs/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.texidoc +++ b/Documentation/it/texidocs/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo modello è fondamentalmente analogo al semplice modello @qq{Complesso vocale}, con l'unica differenza che qui tutti i versi del testo sono posizionati diff --git a/Documentation/it/texidocs/vocal-ensemble-template-with-verse-and-refrain.texidoc b/Documentation/it/texidocs/vocal-ensemble-template-with-verse-and-refrain.texidoc index 72a37ec5aa..03effa2bcb 100644 --- a/Documentation/it/texidocs/vocal-ensemble-template-with-verse-and-refrain.texidoc +++ b/Documentation/it/texidocs/vocal-ensemble-template-with-verse-and-refrain.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Questo modello crea una partitura che inizia con una sezione solistica e prosegue in un ritornello a due voci. Illustra anche l'uso delle diff --git a/Documentation/it/texidocs/vocal-ensemble-template.texidoc b/Documentation/it/texidocs/vocal-ensemble-template.texidoc index 5b86cfea09..155cc2413c 100644 --- a/Documentation/it/texidocs/vocal-ensemble-template.texidoc +++ b/Documentation/it/texidocs/vocal-ensemble-template.texidoc @@ -1,4 +1,4 @@ -%% Translation of GIT committish: 5db593aa3737cf8c60f9c4c4fcbe317c2d832766 +%% Translation of GIT committish: e0808cc5f4890c5f8f03ed1be48fc911627afea4 texidocit = " Ecco una tipica partitura corale a quattro parti, SATB. Se il complesso è più ampio, è spesso comodo scrivere gli elementi comuni in un'unica sezione, che diff --git a/Documentation/it/translations.itexi b/Documentation/it/translations.itexi index df15a8a68a..6d03c64e40 100644 --- a/Documentation/it/translations.itexi +++ b/Documentation/it/translations.itexi @@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; } @end html @end ifhtml -@emph{Ultimo aggiornamento Wed Dec 18 12:23:14 UTC 2013 +@emph{Ultimo aggiornamento Sat Jul 2 15:06:05 UTC 2016 } @multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 @@ -30,7 +30,7 @@ Cambiamenti in LilyPond @item Section titles @* -1453 +2393 @tab Federico Bruni @tab @tab @@ -150,7 +150,7 @@ sì @item 1 Tutorial @* -2578 +2499 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -177,7 +177,7 @@ sì @item 2 Notazione comunemente utilizzata @* -4396 +4402 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -204,7 +204,7 @@ sì @item 3 Concetti fondamentali @* -11144 +11119 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -231,7 +231,7 @@ sì @item 4 Modifica dell'output @* -16191 +16592 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -258,7 +258,7 @@ sì @item A Modelli @* -372 +1236 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -378,7 +378,7 @@ sì @item 1.1 Altezze @* -4990 +5169 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -405,7 +405,7 @@ sì @item 1.2 Ritmi @* -6890 +6795 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -432,7 +432,7 @@ sì @item 1.3 Segni di espressione @* -1793 +1798 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -449,17 +449,17 @@ sì @ifhtml @html -sì +parzialmente @end html @end ifhtml @ifnothtml -sì +parzialmente @end ifnothtml @tab pre-GDP @item 1.4 Ripetizioni @* -1050 +1288 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -486,7 +486,7 @@ sì @item 1.5 Note simultanee @* -2821 +2919 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -513,7 +513,7 @@ sì @item 1.6 Notazione del rigo @* -2476 +2554 @tab Federico Bruni @tab @tab @@ -540,7 +540,7 @@ sì @item 1.7 Note editoriali @* -954 +1477 @tab Federico Bruni @tab @tab @@ -567,7 +567,223 @@ sì @item 1.8 Testo @* -2816 +2754 +@tab Federico Bruni +@tab +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab +@ifhtml + +@html +parzialmente +@end html +@end ifhtml +@ifnothtml +parzialmente +@end ifnothtml +@tab pre-GDP +@item +2 Notazione specialistica +@* +81 +@tab Federico Bruni +@tab +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab pre-GDP +@item +2.1 Musica vocale +@* +4975 +@tab Federico Bruni +@tab +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab pre-GDP +@item +2.2 World music +@* +1446 +@tab Federico Bruni +@tab +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab pre-GDP +@item +3 Input e output +@* +12704 +@tab Federico Bruni +@tab +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab pre-GDP +@item +4 Gestione dello spazio +@* +10911 +@tab Federico Bruni +@tab +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab pre-GDP +@item +5 Modifica delle impostazioni predefinite +@* +15598 +@tab Federico Bruni +@tab +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab pre-GDP +@item +A Tabelle del manuale della notazione +@* +3077 +@tab Federico Bruni +@tab +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab +@ifhtml + +@html +sì +@end html +@end ifhtml +@ifnothtml +sì +@end ifnothtml +@tab pre-GDP +@item +B Schema riassuntivo +@* +252 @tab Federico Bruni @tab @tab @@ -660,7 +876,7 @@ sì @item 1 Eseguire @command{lilypond} @* -4537 +5440 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -687,7 +903,7 @@ sì @item 2 Aggiornare i file con @command{convert-ly} @* -1484 +1866 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -714,7 +930,7 @@ sì @item 3 Eseguire @command{lilypond-book} @* -4137 +4211 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -741,7 +957,7 @@ sì @item 4 Programmi esterni @* -2817 +2786 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -768,7 +984,7 @@ sì @item 5 Consigli su come scrivere i file @* -2692 +2793 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -807,7 +1023,7 @@ LilyPond -- Notazione musicale per tutti @item Section titles @* -616 +629 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -861,7 +1077,7 @@ sì @item Introduzione @* -4937 +5815 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -888,7 +1104,7 @@ sì @item Download @* -1201 +1158 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -915,7 +1131,7 @@ sì @item Manuali @* -1284 +1314 @tab Federico Bruni @tab Luca Rossetto Casel @tab @@ -942,7 +1158,7 @@ sì @item Comunità @* -3073 +3524 @tab Federico Bruni @tab Luca Rossetto Casel @tab diff --git a/Documentation/it/usage.tely b/Documentation/it/usage.tely index bb46a612ad..8d71f3dd76 100644 --- a/Documentation/it/usage.tely +++ b/Documentation/it/usage.tely @@ -1,6 +1,6 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: 08560a1b8076630c4fc6cb9b902614d8b74fd6fc + Translation of GIT committish: 47db9a3883d726ca53e2133a3b2298f78dd6a32e When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -24,7 +24,7 @@ LilyPond versione @version{}. Inoltre, suggerisce alcune delle @c `Usage' was born 1999-10-10 with git commit c82c30c... @macro copyrightDeclare -Copyright @copyright{} 1999--2012 degli autori. +Copyright @copyright{} 1999--2015 degli autori. @end macro @set FDL diff --git a/Documentation/it/usage/external.itely b/Documentation/it/usage/external.itely index ddae2b9cdc..ac306ccb6c 100644 --- a/Documentation/it/usage/external.itely +++ b/Documentation/it/usage/external.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: 07c022f5e65a806e27c3f5f4f4bdae4020c1af8e + Translation of GIT committish: afa67f5aac628a66db3de8f47244bde02581ed55 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @node Programmi esterni @chapter Programmi esterni @@ -44,7 +44,7 @@ elementi musicali. @translationof Configuring the system for point and click Quando questa funzionalità è attiva, LilyPond aggiunge dei collegamenti -ipertestuali al file PDF. Questi collegamenti vengono inviati a un +ipertestuali al file PDF e SVG. Questi collegamenti vengono inviati a un @q{programma di supporto per URI} o al browser web, che apre un editor di testo col cursore posizionato nel punto giusto. @@ -125,14 +125,16 @@ suo pacchetto difettoso. @translationof Using GNOME 2 for point and click Per usare GNOME 2 (e i visualizzatori PDF ad esso integrati), il magico -comando che fornisce al sistema gli URI @samp{textedit:} è -@example +comando che fornisce al sistema gli URI @samp{textedit:} è: + +@smallexample gconftool-2 -t string -s /desktop/gnome/url-handlers/textedit/command "lilypond-invoke-editor %s" gconftool-2 -s /desktop/gnome/url-handlers/textedit/needs_terminal false -t bool gconftool-2 -t bool -s /desktop/gnome/url-handlers/textedit/enabled true -@end example +@end smallexample + +Dopo questi comandi: -Dopo questi comandi, @example gnome-open textedit:///etc/issue:1:0:0 @end example @@ -145,7 +147,8 @@ dovrebbe lanciare @file{lilypond-invoke-editor} per l'apertura del file. In GNOME 3, gli URI sono gestiti da @q{gvfs} invece che da @q{gconf}. Si crea un file in una directory locale (ad esempio @file{/tmp}) -che abbia il nome @file{lilypond-invoke-editor.desktop} e il seguente contenuto +che abbia il nome @file{lilypond-invoke-editor.desktop} e il seguente contenuto: + @example [Desktop Entry] Version=1.0 @@ -165,7 +168,8 @@ xdg-desktop-menu install ./lilypond-invoke-editor.desktop xdg-mime default lilypond-invoke-editor.desktop x-scheme-handler/textedit @end example -Dopo questi comandi, +Dopo questi comandi: + @example gnome-open textedit:///etc/issue:1:0:0 @end example @@ -212,11 +216,11 @@ con altri visualizzatori. @cindex file di output, dimensione La funzionalità "punta e clicca" è abilitata di default quando si creano -i file PDF. +i file PDF o SVG. I collegamenti "punta e clicca" appesantiscono sensibilmente i file di output. Per -ridurre la dimensione dei file PDF e PS, è possibile disattivare il "punta e -clicca" inserendo +ridurre la dimensione di questi file (e dei file PS), è possibile disattivare +il "punta e clicca" inserendo @example \pointAndClickOff @@ -237,7 +241,7 @@ lilypond -dno-point-and-click file.ly @end example @warning{Occorre sempre disattivare il "punta e clicca" nei file LilyPond -che si vogliano diffondere, per evitare di includere nel file .pdf delle informazioni +che si vogliano diffondere, per evitare di includere nel file PDF delle informazioni sui percorsi del proprio computer: questo infatti può costituire un rischio di sicurezza.} @@ -260,8 +264,8 @@ Codice interno al file @file{.ly}: @example \pointAndClickTypes #'note-event -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -269,8 +273,8 @@ oppure @example #(ly:set-option 'point-and-click 'note-event) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -291,8 +295,8 @@ Codice interno al file @file{.ly}: @example \pointAndClickTypes #'(note-event dynamic-event) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -300,8 +304,8 @@ oppure @example #(ly:set-option 'point-and-click '(note-event dynamic-event)) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -526,10 +530,9 @@ che viene usato per rappresentare la notazione musicale. @command{musicxml2ly} estrae le note, le articolazioni, la struttura della partitura, il testi, etc. da file MusicXML organizzati in parti; quindi li -scrive in un file @file{.ly}. Si usa dalla linea di comando. +scrive in un file @file{.ly}. Si lancia dalla linea di comando nel modo +seguente: - -Si lancia dalla linea di comando nel modo seguente, @example musicxml2ly [@var{opzione}]@dots{} @var{file-xml} @end example @@ -595,8 +598,8 @@ il file di input è un file MusicXML compresso in un archivio ZIP. @subsection Utilizzo di @code{abc2ly} @translationof Invoking abc2ly -@warning{Questo programma non è supportato e potrebbe essere rimosso -dalle future versioni di LilyPond.} +@warning{Questo programma non è attualmente supportato e un giorno potrebbe +essere rimosso dalle future versioni di LilyPond.} @cindex ABC @@ -629,7 +632,7 @@ mostra informazioni sulla versione. @end table Esiste una rudimentale funzione per aggiungere codice LilyPond nel -file sorgente ABC. Se scrivi: +file sorgente ABC. Per esempio: @example %%LY voices \set autoBeaming = ##f @@ -665,9 +668,10 @@ lo fa. @subsection Utilizzo di @command{etf2ly} @translationof Invoking etf2ly -@warning{Questo programma non è supportato e potrebbe essere rimosso -dalle future versioni di LilyPond.} +@warning{Questo programma non è attualmente supportato e un giorno potrebbe +essere rimosso dalle future versioni di LilyPond.} +@cindex Enigma Transport Format @cindex ETF @cindex enigma @cindex Finale @@ -677,7 +681,7 @@ ETF (Enigma Transport Format) è un formato usato da Finale, un prodotto di Coda Music Technology. @command{etf2ly} converte parte di un file ETF in un file LilyPond pronto all'uso. -Si lancia dalla linea di comando nel modo seguente. +Si lancia dalla linea di comando nel modo seguente: @example etf2ly [@var{opzione}]@dots{} @var{file-etf} @@ -713,7 +717,7 @@ confondono @command{etf2ly}. Le sequenze di abbellimenti non sono risolte corre LilyPond non supporta la conversione da altri formati, ma esistono alcuni strumenti esterni che possono generare file LilyPond. L'elenco si trova -in @rweb{Easier editing}. +in @rweb{Editing facilitato}. @@ -725,41 +729,55 @@ Questa sezione presenta dei metodi per integrare testo e musica diversi dal metodo automatizzato di @command{lilypond-book}. @menu -* Tante citazioni da una grande partitura:: -* Inserire l'output di LilyPond in OpenOffice e LibreOffice:: -* Inserire l'output di LilyPond in altri programmi:: +* LuaTex:: +* OpenOffice e LibreOffice:: +* Altri programmi:: @end menu -@node Tante citazioni da una grande partitura -@unnumberedsubsec Tante citazioni da una grande partitura -@translationof Many quotes from a large score +@node LuaTex +@subsection LuaTex +@translationof LuaTex + +@cindex LuaTex +@cindex lyluatex -Per inserire molti frammenti di una grande partitura, si può usare anche -la funzione di ritaglio dei sistemi; si veda @ruser{Extracting fragments of music}. +Per integrare l'output di Lilypond in un documento, oltre a +@code{lilypond-book}, esiste un programma alternativo che può +essere usato con LuaTex: +@uref{https://github.com/jperon/lyluatex/blob/master/README.en.md,lyluatex}. -@node Inserire l'output di LilyPond in OpenOffice e LibreOffice -@unnumberedsubsec Inserire l'output di LilyPond in OpenOffice e LibreOffice -@translationof Inserting LilyPond output into OpenOffice and LibreOffice +@node OpenOffice e LibreOffice +@subsection OpenOffice e LibreOffice +@translationof OpenOffice and LibreOffice +@cindex OpenOffice.org @cindex LibreOffice.org +@cindex OOoLilyPond -La notazione di LilyPond può essere aggiunta a OpenOffice e LibreOffice con -@uref{http://@/ooolilypond@/.sourceforge@/.net@/,OOoLilyPond}. +La notazione di LilyPond può essere aggiunta a OpenOffice e LibreOffice +con @uref{http://@/ooolilypond@/.sourceforge@/.net@/,OOoLilyPond}, +un'estensione di OpenOffice.org che converte i file di LilyPond in immagini +incluse nei documenti di OpenOffice.org. Sebbene non sia più sviluppato, +sembra che funzioni ancora nella versione 4. -@node Inserire l'output di LilyPond in altri programmi -@unnumberedsubsec Inserire l'output di LilyPond in altri programmi -@translationof Inserting LilyPond output into other programs +@node Altri programmi +@subsection Altri programmi +@translationof Other programs -Per inserire l'output di LilyPond in altri programmi, si usa @code{lilypond} -invece di @code{lilypond-book}. Bisogna creare ogni esempio singolarmente +Per inserire l'output di LilyPond in altri programmi, si usa . Bisogna creare ogni esempio singolarmente e aggiungerlo al documento; consulta la documentazione del relativo -programma. La maggior parte dei programmi può inserire l'output di LilyPond -in formato @file{PNG}, @file{EPS} o @file{PDF}. +programma. + +Altri programmi in grado di gestire i formati @file{PNG}, @file{EPS} o +@file{PDF} dovrebbero usare @code{lilypond} invece di @code{lilypond-book}. +Ciascun output di LilyPond deve essere creato e inserito separatamente. +Consultare la documentazione del programma usato per sapere come inserire +file. Per ridurre lo spazio bianco intorno alla partitura LilyPond, si usano -le seguenti opzioni +le seguenti opzioni: @example \paper@{ @@ -771,36 +789,48 @@ le seguenti opzioni scoreTitleMarkup = ##f @} -@{ c1 @} +@var{@dots{} music @dots{}} @end example -Per creare file immagine utili, si usa +@noindent +Per creare immagini @file{EPS}: @example -EPS - lilypond -dbackend=eps -dno-gs-load-fonts -dinclude-eps-fonts myfile.ly +@end example -PNG +@noindent +Per creare immagini @file{PNG}: +@example lilypond -dbackend=eps -dno-gs-load-fonts -dinclude-eps-fonts --png miofile.ly +@end example -Un file PNG trasparente +@noindent +Per creare immagini @file{PNG} trasparenti: +@smallexample lilypond -dbackend=eps -dno-gs-load-fonts -dinclude-eps-fonts \ -dpixmap-format=pngalpha --png miofile.ly -@end example +@end smallexample + +@cindex frammenti di musica +@cindex citare frammenti di musica +@cindex musica, citare frammenti + +Per inserire molti frammenti di una grande partitura, si può +usare anche la funzione di ritaglio dei sistemi; si veda +@ruser{Estrarre frammenti musicali}. @node Inclusioni indipendenti @section @code{include} indipendenti @translationof Independent includes -Alcuni hanno scritto ampi (e utili!) frammenti di codice che possono -essere condivisi da progetti diversi. Questo codice potrebbe alla fine -entrare a far parte di LilyPond, ma finché questo non avviene occorre -scaricarlo e includerlo manualmente con @code{\include}. - +Alcuni utenti hanno creato file che possono essere inclusi in LilyPond +tramite @code{\include} per produrre certi effetti. Quelli elencati +in questo capitolo fanno parte di Lilypond. Maggiori informazioni +in @ruser{Lavorare coi file di input}. @menu * Articolazione MIDI:: @@ -811,28 +841,15 @@ scaricarlo e includerlo manualmente con @code{\include}. @subsection Articolazione MIDI @translationof MIDI articulation -LilyPond permette di generare l'output MIDI, che consente di -@qq{verificare a orecchio} quanto è stato scritto. Tuttavia l'output -contiene solo la dinamica, i segni di tempo espliciti, le note e le loro -durate. - -Il progetto @emph{articulate} costituisce un tentativo di inviare al file -MIDI maggiori informazioni sulla partitura. Il suo funzionamento si basa -sull'abbreviazione delle note prive di legatura di portamento, in -modo da @q{articolare} le note. Questa riduzione dipende dai segni di -articolazione attaccati a una nota: staccato dimezza il valore della nota, tenuto -assegna alla nota la sua intera durata, e così via. Lo script è consapevole anche dei -trilli e dei gruppetti; può essere esteso per elaborare altri ornamenti come i -mordenti. - -@example -@uref{http://@/www@/.nicta@/.com@/.au/@/people/@/chubbp/@/articulate} -@end example - -@knownissues +@cindex MIDI +@cindex Articulate, progetto -La sua principale limitazione è che può agire solo sugli elementi che -conosce: qualsiasi cosa che sia del semplice testo (invece di una proprietà -della nota) viene dunque ignorato. +Il progetto @uref{http://www.nicta.com.au/articulate,Articulate} è un +tentativo di migliorare l'output MIDI di Lilypond. Aggiusta la durata +delle note (che non si trovano in una legatura di portamento) in base +ai segni di articolazione attaccati ad esse. Per esempio, @q{staccato} +dimezza il valore della nota, @q{tenuto} assegna alla nota la sua +durata completa, e così via. +Maggiori informazioni in @ruser{Miglioramento dell'output MIDI}. diff --git a/Documentation/it/usage/lilypond-book.itely b/Documentation/it/usage/lilypond-book.itely index e54bc7c786..420777e3cd 100644 --- a/Documentation/it/usage/lilypond-book.itely +++ b/Documentation/it/usage/lilypond-book.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: eba67a0bc70f38a7847de75c640d7ad19c6fd804 + Translation of GIT committish: 7f48cb638958a728209577caa41bbaca8a2e4ef2 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.22" @c Note: keep this node named so that `info lilypond-book' brings you here. @node lilypond-book @@ -86,8 +86,8 @@ I documenti per \verb+lilypond-book+ possono combinare liberamente musica e test Ad esempio, \begin{lilypond} -\relative c' { - c2 e2 \tuplet 3/2 { f8 a b } a2 e4 +\relative { + c'2 e2 \tuplet 3/2 { f8 a b } a2 e4 } \end{lilypond} @@ -146,8 +146,8 @@ I documenti per \verb+lilypond-book+ possono combinare liberamente musica e test Ad esempio, @lilypond -\relative c' { - c2 e2 \tuplet 3/2 { f8 a b } a2 e4 +\relative { + c'2 e2 \tuplet 3/2 { f8 a b } a2 e4 } @end lilypond @@ -171,8 +171,8 @@ frammento deve essere compreso in un costrutto @code{\book @{ @}}. title = "Una scala in LilyPond" } - \relative c' { - c d e f g a b c + \relative { + c' d e f g a b c } } @end lilypond @@ -781,8 +781,8 @@ esempio, la musica viene interpretata in modalità relativa ma il blocco testuale non mostrerà il blocco @code{relative}, ovvero @example -\relative c' @{ % begin verbatim - c4 e2 g4 +\relative @{ % begin verbatim + c'4 e2 g4 f2 e % end verbatim @} @end example @@ -899,7 +899,7 @@ indipendentemente da quello che userai, puoi convertire facilmente PostScript e PDF con strumenti come @command{ps2pdf} e @command{pdf2ps} inclusi nel pacchetto Ghostscript. -Per creare un file PDF con PDF@LaTeX{}, si usa +Per creare un file PDF con PDF@LaTeX{}, si usa: @example lilypond-book --pdf tuofile.lytex @@ -910,8 +910,7 @@ pdflatex tuofile.tex @cindex type1, carattere @cindex dvips @cindex utilizzo di dvips -Per produrre l'output PDF attraverso @LaTeX{}/@command{dvips}/@command{ps2pdf}, -bisogna usare questi comandi +Per produrre l'output PDF attraverso @LaTeX{}/@command{dvips}/@command{ps2pdf}: @example lilypond-book tuofile.lytex @@ -930,6 +929,23 @@ relativi ai caratteri; questi messaggi sono innocui e possono essere ignorati. Se esegui @command{latex} in modalità due colonne, ricorda di aggiungere @option{-t landscape} alle opzioni di @command{dvips}. +Gli ambienti come: + +@example +\begin@{lilypond@} @dots{} \end@{lilypond@} +@end example + +@noindent +non sono interpretati da @LaTeX{}. @code{lilypond-book} estrae questi +@q{ambienti} e li copia in file in un suo formato per poter eseguire +LilyPond su di essi. Prende quindi gli elementi grafici risultanti +e crea un file @file{.tex} dove le macro +@code{\begin@{lilypond@}}@dots{}@code{\end@{lilypond@}} sono poi +sostituite da comandi di @q{inclusione di immagini}. È a questo +punto che @LaTeX{} viene eseguito (anche se @LaTeX{} è stato eseguito +in precedenza, in realtà ha agito su un documento @q{vuoto} solo per +fare alcuni calcoli, come per esempio di @code{\linewidth}). + @knownissues Il comando @code{\pageBreak} non funziona all'interno dell'ambiente @code{\begin@{lilypond@} @dots{} \end@{lilypond@}}. @@ -1152,8 +1168,8 @@ Si possono includere frammenti LilyPond in un documento LaTeX. Normale testo LaTeX. \begin@{lilypond@} -\relative c'' @{ - a4 b c d +\relative @{ + a'4 b c d @} \end@{lilypond@} @@ -1178,7 +1194,7 @@ manuale è scritto in Texinfo. Testo Texinfo @@lilypond -\relative c' @{ +\relative @{ a4 b c d @} @@end lilypond @@ -1205,8 +1221,8 @@ d4 c b a I documenti per lilypond-book possono combinare liberamente musica e testo. Ad esempio, -\relative c'' @{ - a4 b c d +\relative @{ + a'4 b c d @}

@@ -1312,7 +1328,7 @@ di output di lilypond. (format #f "~a, section, 1, @{~a@}, ~a" page text label)))) (formatted-toc-items (map format-line (toc-items))) (whole-string (string-join formatted-toc-items ",\n")) - (output-name (ly:parser-output-name parser)) + (output-name (ly:parser-output-name)) (outfilename (format "~a.toc" output-name)) (outfile (open-output-file outfilename))) (if (output-port? outfile) @@ -1394,4 +1410,3 @@ dove @code{\includescore} viene definito in questo modo: Altri modi per combinare testo e musica (senza usare @command{lilypond-book}) sono trattati in @ref{LilyPond output in other programs}. - diff --git a/Documentation/it/usage/running.itely b/Documentation/it/usage/running.itely index 74b238600f..3a20ae22e1 100644 --- a/Documentation/it/usage/running.itely +++ b/Documentation/it/usage/running.itely @@ -1,7 +1,7 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: 93d725094ee629b2d5200ab5a75b609579a62973 + Translation of GIT committish: 0fa6f042cccacb643d46781dde23617c71a9753e When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -55,16 +55,16 @@ obiettivi di questo manuale; si prega di consultare altra documentazione su questo argomento se non si conosce la linea di comando. @menu -* Utilizzo di lilypond:: +* Utilizzo di LilyPond:: * Opzioni di base della linea di comando per LilyPond:: * Opzioni avanzate della linea di comando per LilyPond:: * Variabili d'ambiente:: * LilyPond in una gabbia chroot:: @end menu -@node Utilizzo di lilypond +@node Utilizzo di LilyPond @unnumberedsubsec Utilizzo di @command{lilypond} -@translationof Invoking lilypond +@translationof Invoking LilyPond L'eseguibile @command{lilypond} può essere lanciato dalla linea di comando nel seguente modo. @@ -101,28 +101,75 @@ produrrà come output @var{base}@file{-violin.pdf} e @var{base}@file{-cello-1.pdf}. -@unnumberedsubsubsec Comandi standard da shell +@unnumberedsubsubsec Usare LilyPond con funzionalità standard della shell -Se la shell (ovvero la finestra dei comandi) utilizzata supporta le normali -redirezioni, potrebbe essere utile usare i seguenti comandi per dirigere -l'output di una console in un file: +Dato che LilyPond è un'applicazione a linea di comando, si possono sfruttare +le funzionalità della @q{shell} usata per lanciare LilyPond. -@itemize +Per esempio: -@item -@code{lilypond file.ly 1>stdout.log} per redirigere l'output normale +@example +lilypond *.ly +@end example -@item -@code{lilypond file.ly 2>stderr.log} per redirigere i messaggi di errore +@noindent +elaborerà tutti i file LilyPond nella directory corrente. -@item -@code{lilypond file.ly &>all.log} per redirigere tutto l'output +Potrebbe essere utile anche redirigere l'output della console (per esempio +in un file): -@end itemize +@example +lilypond file.ly 1> stdout.txt + +lilypond file.ly 2> stderr.txt + +lilypond file.ly &> all.txt +@end example + +@noindent +Questi tre comandi redirigono rispettivamente l'output @q{normale}, gli +@q{errori} o @q{tutto} in un file di testo. Consulta la documentazione +della tua shell, del prompt dei comandi (Windows), delle applicazioni +Terminale o Console (MacOS X), per vedere se la redirezione dell'output +è supportata o se la sintassi è diversa. + +L'esempio seguente cerca e elabora tutti i file di input nella directory +corrente e in tutte le directory inferiori ricorsivamente. I file di output +saranno salvati nella stessa directory in cui è stato lanciato il comando, +invece delle stesse directory in cui si trovano i file di input. + +@example +find . -name '*.ly' -exec lilypond '@{@}' \; +@end example + +@noindent +Questo comando dovrebbe funzionare anche in MacOS@tie{}X. + +Gli utenti Windows devono lanciare questo comando: + +@example +forfiles /s /M *.ly /c "cmd /c lilypond @@file" +@end example + +@noindent +nel @code{prompt dei comandi}, che di solito si trova in +@code{Avvio > Accessori > Prompt dei comandi}, oppure, se si usa la +versione 8, scrivendo @q{prompt dei comandi} nella finestra di ricerca. + +Altrimenti, si può indicare un percorso esplicito alla cartella che +contiene tutte le sottocartelle con i file di input tramite l'opzione +@code{/p}: -Consulta la documentazione della tua shell per vedere se supporta queste -opzioni o se la sintassi è diversa. Nota che questi sono comandi shell -e non hanno niente a che fare con lilypond. +@example +forfiles /s /p C:\Documents\MyScores /M *.ly /c "cmd /c lilypond @@file" +@end example + +Tale percorso, se contiene spazi, deve essere racchiuso tra +virgolette doppie: + +@example +forfiles /s /p "C:\Documents\My Scores" /M *.ly /c "cmd /c lilypond @@file" +@end example @node Opzioni di base della linea di comando per LilyPond @@ -138,6 +185,33 @@ Sono contemplate le seguenti opzioni: @table @code +@item -b, --bigpdfs +@cindex bigpdfs + +I file PDF generati saranno molto più grandi del normale (a causa +di un'ottimizzazione dei tipi di carattere scarsa o assente). Tuttavia, +due o più file PDF, se inclusi in documenti @w{@code{pdftex}}, +@w{@code{xetex}} o @w{@code{luatex}}, possono essere ulteriormente +elaborati attraverso ghostscript (rimuovendo le duplicazioni dei dati +dei tipi di carattere), ottenendo così file PDF @emph{molto} più piccoli. + +@example +lilypond -b myfile +@end example + +Poi eseguire @code{ghostscript}; + +@example +gs -q -sDEVICE=pdfwrite -o gsout.pdf myfile.pdf +@end example + +Poi si può usare @code{pdfsizeopt.py} per ottimizzare ulteriormente la +dimensione del file; + +@example +pdfsizeopt.py --use-multivalent=no gsout.pdf final.pdf +@end example + @item -d, --define-default=@var{variabile}=@var{valore} Si veda @ref{Advanced command line options for LilyPond}. @@ -177,6 +251,10 @@ Formati di output. Come @code{formato} si può scegliere tra Esempio: @code{lilypond -fpng @var{file}.ly} +@noindent +Per i formati @code{svg} e @code{eps} usare l'opzione @code{-dbackend}. +Vedi @ref{Advanced command line options for LilyPond}. + @item -h, --help Mostra una sintesi dell'utilizzo. @@ -190,9 +268,9 @@ Imposta il file di inizializzazione su @var{file} (predefinito: @file{init.ly}). @cindex percorso di ricerca @item -I, --include=@var{directory} -Aggiunge @var{directory} al percorso di ricerca per i file di input. È possibile assegnare più opzioni -I. La ricerca inizierà nella prima +Aggiunge @var{directory} al percorso di ricerca per i file di input. directory definita, e se il file da includere non viene trovato la ricerca continuerà nelle directory seguenti. @@ -340,8 +418,9 @@ con @strong{NESSUNA GARANZIA}!) @table @code -@item -d@var{[nome-opzione]}=@var{[valore]},--define-default=@var{[nome-opzione]}=@var{[valore]} -Imposta l'equivalente funzione interna di Scheme su @var{valore}. +@item -d@var{[nome-opzione]}=@var{[valore]}, +--define-default=@var{[nome-opzione]}=@var{[valore]} +Imposta l'equivalente funzione interna di Scheme su @var{valore}. Per esempio: @example -dbackend=svg @@ -349,7 +428,7 @@ Imposta l'equivalente funzione interna di Scheme su @var{valore}. Se non viene specificato un @var{valore}, viene usato il valore predefinito. Per disabilitare un'opzione, si può usare il -prefisso @code{no-} prima di @var{nome-opzione}, ad esempio +prefisso @code{no-} prima di @var{nome-opzione}. Per esempio: @cindex punta e clicca, linea di comando @@ -374,55 +453,84 @@ valori predefiniti: @item @code{anti-alias-factor} @tab @code{1} -@tab Elabora a una risoluzione più alta (usando un certo fattore) e ridimensiona -il risultato per evitare gli @q{artefatti} nelle immagini @code{PNG}. +@tab Elabora a una risoluzione più alta (usando il fattore specificato) e +ridimensiona il risultato per evitare gli @q{artefatti} nelle immagini @code{PNG}. @item @code{aux-files} @tab @code{#t} -@tab Crea i file @code{.tex}, @code{.texi}, @code{.count} nel backend -@code{EPS}. +@tab Crea i file @code{.tex}, @code{.texi} e @code{.count} se usata con +l'opzione del backend @code{eps}. @item @code{backend} @tab @code{ps} -@tab Seleziona il backend. I file Postscript (predefinito) includono i tipi di -carattere @code{TTF}, @code{Type1} e @code{OTF}. Non vengono inclusi i sottoinsiemi -di questi tipi. Se si usa un set di caratteri @q{orientali}, si possono ottenere -file di grosse dimensioni. +@tab Questa è l'impostazione predefinita. I file Postscript (predefinito) +includono i tipi di carattere @code{TTF}, @code{Type1} e @code{OTF}. Non +vengono inclusi i @qq{sottoinsiemi} di questi tipi. Se si usa un set di +caratteri @q{orientali}, si possono ottenere file di grosse dimensioni. @item @tab @code{eps} -@tab Encapsulated PostScript. Invia ogni pagina (sistema) in un file -@file{EPS} separato, senza font, e in un unico file @file{EPS} con -tutte le pagine (sistemi) inclusi i font. Questa è la modalità -predefinita di @command{lilypond-book}. +@tab Usata come opzione predefinita dal comando @command{lilypond-book}. Per +ogni pagina crea sia un singolo file con tutte le pagine e i tipi di carattere +inclusi sia file EPS (Encapsulated PostScript) separati per ogni pagina +ma senza i tipi di caratteri inclusi. @item @tab @code{null} -@tab non produce la stampa della partitura; ha lo stesso -effetto di @code{-dno-print-pages}. - -@item -@tab @code{svg} -@tab Scalable Vector Graphics. Crea un singolo file SVG, senza font -incorporati, per ogni pagina dell'output. Si raccomanda di installare i -font Century Schoolbook, inclusi nell'installazione di LilyPond, per una -resa ottimale. In UNIX basta copiare questi font dalla directory di -LilyPond (solitamente @file{/usr/share/lilypond/VERSION/fonts/otf/}) in -@file{~/.fonts/}. L'output SVG dovrebbe essere compatibile con qualsiasi -editor SVG o user agent. C'è anche un'opzione @code{svg-woff} (sotto) per -poter usare i file di font woff nel backend SVG. +@tab Non genera la stampa della partitura. Produce lo stesso effetto +di @code{-dno-print-pages}. @item @tab @code{scm} @tab Estrae i comandi di disegno grezzi e interni, basati su Scheme. +@item +@tab @code{svg} +@tab Scalable Vector Graphics. +Viene creato un singolo file SVG per ogni pagina dell'output. I glifi +musicali vengono tradotti in grafica vettoriale, ma i tipi di carattere +del testo @emph{non} sono incorporati nei file SVG. Dunque qualsiasi +lettore SVG dovrà avere accesso ai tipi di carattere necessari per +rendere in modo adeguato il testo. Si raccomanda di non usare +@q{liste} o @q{alias} dei tipi di carattere se il lettore SVG non è +in grado di gestirli. Se si usano i file @emph{Web Open Font Format} (WOFF), +è richiesta anche l'opzione @code{svg-woff}. +@end multitable + +@noindent +@strong{Nota per l'output del backend svg:} +Nell'output svg LilyPond usa i valori generici @code{serif}, @code{sans-serif} o +@code{monospace} di @code{font-family}. Dunque quando si usa il backend +@code{svg} è obbligatorio definire esplicitamente specifici tipi di carattere +predefiniti nel proprio file di input: + +@quotation +@verbatim +\paper { + #(define fonts + (make-pango-font-tree "TeX Gyre Schola" + "TeX Gyre Heros" + "TeX Gyre Cursor" + (/ staff-height pt 20))) +} +@end verbatim +@end quotation + +Leggere anche @ruser{Tipi di carattere per l'intero documento}. + +@multitable @columnfractions .33 .16 .51 + @item @code{check-internal-types} @tab @code{#f} @tab Controlla l'assegnazione di ogni proprietà per i tipi. @item @code{clip-systems} @tab @code{#f} -@tab Genera frammenti ritagliati di una partitura. +@tab Estrae frammenti musicali da una partitura. Per far ciò è necessario +che sia stata definita la funzione @code{clip-regions} all'interno del blocco +@code{\layout}. Maggiori informazioni in @ruser{Estrarre frammenti musicali}. +Nessun frammento verrà estratto se questa opzione è usata insieme +all'opzione @option{-dno-print-pages}. @item @code{datadir} @tab @@ -475,6 +583,10 @@ la compilazione. @tab @code{#f} @tab Scarica le firme dell'output di ogni sistema. Usato per testare le regressioni. +@item @code{embed-source-code} +@tab @code{#f} +@tab Incorpora i file sorgente LilyPond nel documento PDF generato. + @item @code{eps-box-padding} @tab @code{#f} @tab Sposta il margine sinistro della cornice EPS dell'output della quantità @@ -553,8 +665,8 @@ essere compresa tra virgolette precedute dal segno di escape. @tab Imposta il formato di output di GhostScript per le immagini raster. @item @code{point-and-click} -@tab @code{#f} -@tab Aggiunge i collegamenti @q{punta e clicca} all'output @code{PDF}. Si veda +@tab @code{#t} +@tab Aggiunge i collegamenti @q{punta e clicca} all'output PDF e SVG. Si veda @ref{Point and click}. @item @code{preview} @@ -619,9 +731,9 @@ scempio, ad esempio @quotation @verbatim -#(system "rm -rf /") +#(s ystem "rm -rf /") % troppo pericoloso per scriverlo correttamente { - c4^$(ly:gulp-file "/etc/passwd") + c4^$(ly:gulp-file "/etc/passwd") % malvagio ma non distruttivo } @end verbatim @end quotation @@ -670,18 +782,23 @@ di output. @item @code{strokeadjust} @tab @code{#f} @tab Forza l'aggiustamento del tratto da parte di PostScript. Questa opzione -è utile quando il @code{PDF} è generato dall'output PostScript (l'aggiustamento +è utile quando il PDF è generato dall'output PostScript (l'aggiustamento del tratto di solito è abilitato automaticamente per gli strumenti bitmap -a bassa risoluzione). Senza questa opzione, le anteprime@tie{}@code{PDF} -tendono a produrre larghezze dei gambi molto variabili alle risoluzioni -tipiche dei monitor. L'opzione non produce effetti visibili sulla -qualità di stampa e causa un notevole aumento della dimensione dei file -@code{PDF}. +a bassa risoluzione). Senza questa opzione, i lettori PDF tendono a +produrre larghezze dei gambi molto variabili alle risoluzioni tipiche +dei monitor. L'opzione non produce effetti visibili sulla qualità di +stampa e causa un notevole aumento della dimensione dei file PDF. @item @code{svg-woff} @tab @code{#f} -@tab Usa i file di font woff nel backend SVG. +@tab Questa opzione è richiesta se si usano i file del formato per font Web Open +Font Format (WOFF) col backend SVG. Viene creato un singolo file SVG per ogni +pagina di output. Eccetto i glifi musicali di LilyPond, nessun altro tipo di +carattere verrà incorporato nel file. Dunque qualsiasi lettore SVG dovrà avere +accesso ai tipi di carattere per rendere in modo adeguato il testo. Si raccomanda +di non usare gli @q{alias} o le @q{liste} dei tipi di carattere se il lettore +SVG non è in grado di gestirli. @item @code{trace-memory-frequency} @tab @code{#f} @@ -922,14 +1039,21 @@ test.ly:2:19: error: not a duration: 5 5 g' @} @end example -Queste posizioni indicano la migliore ipotesi di LilyPond a proposito del -punto in cui l'avvertimento o l'errore sono comparsi, ma (per loro +Queste posizioni indicano il punto in cui LilyPond ritiene più probabile +che siano apparsi l'avvertimento o l'errore, ma (per loro stessa natura) avvertimenti ed errori capitano quando succede qualcosa -di imprevisto. Se non riesci a vedere un errore nella riga indicata -del file di input, prova a controllare una o due righe sopra la posizione -indicata. +di imprevisto. Se non riesci a vedere un errore nella riga suggerita, +prova a controllare una o due righe sopra la posizione indicata. -Maggiori informazioni sugli errori si trovano in @ref{Errori comuni}. +Attenzione: l'analisi degli errori è sempre attivata nel corso dei vari +passaggi di elaborazione. Per esempio, se ci sono parti di input che +sono elaborati varie volte (es: per produrre l'output midi e quello +grafico) oppure se viene usata la stessa variabile musicale in vari +contesti, potrebbe apparire lo stesso messaggio molteplici volte. Anche +la diagnosi eseguita in uno degli @q{ultimi} passaggi (es: controlli di +battuta) può apparire varie volte. + +Maggiori informazioni sugli errori si trovano in @ref{Common errors}. @node Errori comuni @@ -948,6 +1072,7 @@ comprese, è facile gestirle. * Messaggio di errore FT_Get_Glyph_Name:: * Avvertimento sul fatto che le affinità del rigo devono solo diminuire:: * Messaggio di errore new inaspettato:: +* Avviso questa voce ha bisogno di un'impostazione voiceXx o shiftXx:: @end menu @node La musica esce dalla pagina @@ -993,9 +1118,9 @@ si potrebbe pensare che il seguente codice colori di rosso tutte le teste delle note nel rigo, ma in realtà produce due righi, di cui il più basso conserva il colore nero predefinito per le teste delle note. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.NoteHead.color = #red -\new Staff { a } +\new Staff { a' } @end lilypond Questo accade perché non esiste un contesto @code{Staff} quando viene @@ -1004,33 +1129,10 @@ l'override viene applicato ad esso. Ma poi il comando @code{\new Staff} crea un altro rigo separato nel quale vengono inserite le note. Il codice corretto per colorare le teste di tutte le note è -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Staff { \override Staff.NoteHead.color = #red - a -} -@end lilypond - -Vediamo un secondo esempio. Se un comando @code{\relative} viene posto -dentro un comando @code{\repeat}, vengono generati due righi, il secondo -spostato orizzontalmente rispetto al primo, perché il comando @code{\repeat} -genera due blocchi @code{\relative}, ognuno dei quali crea implicitamente i -blocchi @code{Staff} e @code{Voice}. - -@lilypond[quote,verbatim] -\repeat unfold 2 { - \relative c' { c4 d e f } -} -@end lilypond - -Per correggere il problema basta istanziare esplicitamente il contesto -@code{Voice}: - -@lilypond[quote,verbatim] -\new Voice { - \repeat unfold 2 { - \relative c' { c4 d e f } - } + a' } @end lilypond @@ -1054,7 +1156,7 @@ iniziano con un punto e virgola, (@code{;}). Questo messaggio di errore compare nella console di output o nel file di log file se un file di input contiene un carattere non-ASCII e non è stato salvato nella -codifica UTF-8. Per dettagli si veda @ruser{Text encoding}. +codifica UTF-8. Per dettagli si veda @ruser{Codifica del testo}. @node Avvertimento sul fatto che le affinità del rigo devono solo diminuire @@ -1073,7 +1175,7 @@ come un rigo inserendo @noindent all'inizio del contesto. Per dettagli si veda @qq{Spacing of non-staff lines} in -@ruser{Flexible vertical spacing within systems}. +@ruser{Spaziatura verticale flessibile all'interno dei sistemi}. @node Messaggio di errore new inaspettato @unnumberedsubsec Messaggio di errore @code{@bs{}new} inaspettato @@ -1123,3 +1225,41 @@ che i nuovi righi siano avviati in parallelo, ovvero contemporaneamente: >> } @end lilypond + +@node Avviso questa voce ha bisogno di un'impostazione voiceXx o shiftXx +@unnumberedsubsec Avviso questa voce ha bisogno di un'impostazione @bs{}voiceXx o @bs{}shiftXx +@translationof Warning this voice needs a voiceXx or shiftXx setting + +Se note appartenenti a due voci diverse con gambi nella stessa +direzione si trovano nello stesso momento musicale, e per le voci +non è stato specificato alcun spostamento, quando si compila il +file apparirà il messaggio di avviso +@samp{avviso: questa voce ha bisogno di un'impostazione \voiceXx o \shiftXx}. +Tale avviso apparirà anche quando le note non hanno gambi visibili, +come nel caso delle semibrevi, se i gambi di note più brevi della +stessa altezza sono nella stessa direzione. + +Ricorda che la direzione del gambo, a meno che non sia specificata, per +esempio tramite @code{\voiceOne}, etc., dipende dalla posizione della +nota sul rigo. Dunque se la direzione del gambo non è specificata, l'avviso +apparirà solo quando i gambi si trovano nella stessa direzione, ovvero +quando le note si trovano nella stessa metà del rigo. + +Si possono evitare questi avvisi mettendo le note in voci in cui siano +indicate le direzioni dei gambi e gli spostamenti, per esempio usando +@code{\voiceOne}, etc. + +Le note delle voci con un numero maggiore di due, @code{\voiceThree} etc., sono +spostate automaticamente per avitare la collisione tra colonne di note. Ciò +causa uno spostamento visibile delle note con gambo, mentre le semibrevi +non sono spostate visibilmente, a meno che non si verifichi una reale collisione +tra teste di nota oppure quando le voci si incrociano rispetto al loro ordine +naturale (quando le note di @code{\voiceThree} sono più alte di quelle di +@code{\voiceOne}, etc.) + +@seealso +@rlearning{Definire esplicitamente le voci}, +@rlearning{Esempio musicale}, +@ruser{Polifonia su un solo rigo}, +@ruser{Risoluzione delle collisioni}. + diff --git a/Documentation/it/usage/suggestions.itely b/Documentation/it/usage/suggestions.itely index a8b66c1a79..69f6248bcf 100644 --- a/Documentation/it/usage/suggestions.itely +++ b/Documentation/it/usage/suggestions.itely @@ -1,14 +1,14 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: 45d0e015edc53abebada17a0fdb1d665f7edf900 + Translation of GIT committish: d36171e34d236d890f5dc511b895037188c6c7cb When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @node Consigli su come scrivere i file @chapter Consigli su come scrivere i file @@ -54,48 +54,90 @@ in moda da essere poi aggiornati in modo più semplice (o più difficile). @section Consigli generali @translationof General suggestions -Ecco alcuni consigli che possono aiutarti a evitare o risolvere -i problemi: +Ecco alcuni consigli che possono aiutare a evitare (e risolvere) i +problemi più comuni in fase di scrittura: @itemize -@item @strong{Includi il numero di @code{\version} in ogni file}. Nota che tutti -i modelli contengono l'informazione su @code{\version}. Si consiglia vivamente -di includere sempre @code{\version}, non importa quanto piccolo possa essere -il file. L'esperienza personale insegna come sia frustrante cercare di ricordare -quale versione di LilyPond si usava alcuni anni prima! @command{convert-ly} -richiede che si dichiari la versione di LilyPond utilizzata. - -@item @strong{Includi i controlli}: @ruser{Controlli di battuta e del numero di battuta}, -@ruser{Controlli di ottava}. Includendo i controlli ogni tanto, se fai -un errore lo puoi individuare più rapidamente. Cosa si intende per -@q{ogni tanto}? Dipende dalla complessità della musica. Se la musica -è molto semplice, anche solo una volta o due. Se la musica è molto -complessa, a ogni battuta. - -@item @strong{Una battuta per ogni linea di testo}. Se c'è qualcosa di -complicato, nella musica stessa o nell'output che desideri, di solito è -preferibile scrivere una sola battuta per linea. Risparmiare spazio sullo -schermo concentrando otto battute per ogni riga non è affatto conveniente -se poi devi fare il @q{debug} dei file di input. - -@item @strong{Inserisci dei commenti nei file di input}. Puoi usare i numeri -di battuta (ogni tanto) o dei riferimenti ai temi musicali -(@q{secondo tema nei violini,} @q{quarta variazione,} etc.). Potresti non -aver bisogno dei commenti mentre scrivi il brano la prima volta, ma se due -o tre anni dopo vuoi cambiare qualcosa o se vuoi dare il sorgente a un amico, -sarà molto più difficile capire le tue intenzioni e la struttura del file -se mancano i commenti. - -@item @strong{Indenta le parentesi graffe}. Molti problemi sono causati -da mancata corrispondenza tra le quantità di @code{@{} e di @code{@}}. - -@item @strong{Esplicita le durate} all'inizio delle sezioni e delle -variabili. Se specifichi @code{c4 d e} all'inizio di una frase -(invece di @code{c d e} soltanto) puoi evitare l'insorgere di problemi -al momento di rimetter mano alla musica. - -@item @strong{Separa le modifiche manuali (tweak)} dalle definizioni -musicali. Vedi @rlearning{Ridurre l'input grazie a variabili e funzioni}, e +@item @strong{Includere sempre il numero di @code{\version} in ogni file di input}, +non importa quanto piccolo possa essere il file. Ciò impedisce di dover +ricordare con quale versione di LilyPond è stato creato il file ed è +importante soprattutto per @ref{Updating files with convert-ly} (che ha +bisogno della dichiarazione @code{\version}); o quando si inviano i file +di input a altri utenti (per esempio, quando si chiede aiuto nelle mailing +list). Nota che tutti i modelli contengono l'informazione su @code{\version}. + +@item +@strong{Scrivere ciascuna battuta su una singola riga del file di input}. Ciò +semplifica molto l'analisi dei problemi del file di input. + +@item +@strong{Inserire i @ruser{Controlli di battuta e del numero di battuta} e +i @ruser{Controlli di ottava}}. Inserendo @q{controlli} di questo tipo nei +file di input, si può individuare un errore più rapidamente. Quanto spesso +aggiungere i controlli dipende dalla complessità della musica da scrivere. Per +composizioni semplici, aggiungere controlli in pochi punti strategici può essere +sufficiente, ma per musica più complessa, con molte voci e/o righi, è consigliabile +inserire i controlli dopo ogni battuta. + +@item +@strong{Inserire commenti nei file di input}. Riferimenti a temi musicali +(@q{secondo tema nei violini,} @q{quarta variazione,} etc.) o numeri di battuta +inseriti come commenti rendono molto più semplice la lettura del file di input, +specialmente se occorre modificare qualcosa successivamente o passare i file +di input di LilyPond a un'altra persona. + +@item +@strong{Aggiungere durate esplicite all'inizio delle @q{sezioni}}. +Per esempio, @code{c4 d e} invece di @code{c d e f} può semplificare il +riarrangiamento della musica in un momento successivo. + +@item +@strong{Imparare a allineare e indentare le parentesi e la musica parallela}. +Molti problemi sono spesso causati da parentesi @q{mancanti}. Indentare +chiaramente le parentesi di @q{apertura} e di @q{chiusura} (o gli indicatori +@code{<<} e @code{>>}) aiuta a evitare tali problemi. Per esempio, + +@example +\new Staff @{ + \relative @{ + r4 g'8 g c8 c4 d | + e4 r8 | + % Sezione Ossia + << + @{ f8 c c | @} + \new Staff @{ + f8 f c | + @} + >> + r4 | + @} +@} +@end example + +@noindent +è molto più semplice da leggere di + +@example +\new Staff @{ \relative @{ r4 g'8 g c4 c8 d | e4 r8 +% Sezione Ossia +<< @{ f8 c c @} \new Staff @{ f8 f c @} >> r4 | @} @} +@end example + +@item +@strong{Tenere separato il contenuto musicale dallo stile} mettendo gli +@code{\override} nel blocco @code{\layout}: + +@example +\score @{ + @var{@dots{}music@dots{}} + \layout @{ + \override TabStaff.Stemstencil = ##f + @} +@} +@end example + +Ciò non creerà un nuovo contesto ma sarà applicato quando ne viene creato +uno. Vedi anche @rlearning{Ridurre l'input grazie a variabili e funzioni} e @rlearning{Fogli di stile}. @end itemize @@ -114,7 +156,7 @@ contenuto in uno spartito già scritto), musica) un sistema alla volta (ma sempre una battuta per linea di testo), e controlla ogni sistema completato. Puoi usare le proprietà @code{showLastLength} o @code{showFirstLength} per velocizzare -l'elaborazione -- vedi @ruser{Skipping corrected music}. +l'elaborazione -- vedi @ruser{Saltare la musica già corretta}. @item Definisci @code{mBreak = @{ \break @}} e inserisci @code{\mBreak} nel file di input ogni volta che nel manoscritto c'è un a capo. In questo @@ -164,8 +206,8 @@ struttura nella definizione. La struttura della sezione in una nuova versione di LilyPond. @example -violin = \relative c'' @{ -g4 c'8. e16 +violin = \relative @{ +g'4 c'8. e16 @} @dots{} \score @{ @@ -186,8 +228,8 @@ niente in @code{violin}. @example fthenp = _\markup@{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} -violin = \relative c'' @{ -g4\fthenp c'8. e16 +violin = \relative @{ +g'4\fthenp c'8. e16 @} @end example @@ -234,9 +276,9 @@ allora commenta tutta la musica del basso (ma lascia @code{\bass} in @code{\score} non commentato). @example -bass = \relative c' @{ +bass = \relative @{ %@{ - c4 c c c + c'4 c c c d d d d %@} @} diff --git a/Documentation/it/usage/updating.itely b/Documentation/it/usage/updating.itely index 91c0081b2e..53cbfedbfa 100644 --- a/Documentation/it/usage/updating.itely +++ b/Documentation/it/usage/updating.itely @@ -1,7 +1,7 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: b381556a3132e765159edc75107b31259dbf5988 + Translation of GIT committish: bd8e8f0193000854fef9d3de3cc0a9f667ea8fb1 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -18,11 +18,13 @@ @cindex aggiornare un file di LilyPond @cindex convert-ly -La sintassi di input di LilyPond viene regolarmente modificata per semplificarla -o per migliorarla in vari modi. L'effetto collaterale è che l'interprete di LilyPond -spesso non è più compatibile con i vecchi file di input. Per ovviare a questo -problema, si può usare il programma @command{convert-ly} per aggiornare -i file alle nuove versioni di LilyPond. +Via via che LilyPond migliora, la sintassi (il linguaggio di input) di +alcuni comandi e funzioni può cambiare. Ciò può causare errori imprevisti, +avvisi e perfino output errato se i file di input, creati in precedenza per +versioni più vecchie, vengono usati con versioni più recenti. + +Per superare questo problema, si può usare il comando @command{convert-ly} per +aggiornare questi file di input più vecchi alla nuova sintassi. @menu * Perché la sintassi cambia?:: @@ -40,102 +42,150 @@ i file alle nuove versioni di LilyPond. @cindex convert-ly @cindex aggiornare i vecchi file di input -La sintassi di input di LilyPond talvolta cambia. Via via che LilyPond -migliora, la sintassi (il linguaggio dell'input) viene modificata di -conseguenza. Queste modifiche vengono fatte a volte per far sì che l'input -sia più facile da leggere e da scrivere e a volte per aggiungere a LilyPond -nuove funzionalità. - -Ad esempio, tutti i nomi delle proprietà di @code{\paper} e @code{\layout} -dovrebbero essere scritte nella forma @code{primo-secondo-terzo}. -Tuttavia, nella versione 2.11.60 ci siamo accorti che la proprietà -@code{printallheaders} non seguiva questa convenzione. -Dovevamo lasciarla così come era (confondendo i nuovi utenti che devono avere -a che fare con un formato di input incoerente), o cambiarla (disturbando i -vecchi utenti che avevano già delle partiture)? In questo caso decidemmo di -cambiare il nome in @code{print-all-headers}. Fortunatamente, questa modifica -può essere automatizzata con @command{convert-ly}. - -Purtroppo @command{convert-ly} non è in grado di gestire tutti i cambiamenti -dell'input. Ad esempio, in LilyPond 2.4 e precedenti, gli accenti e le lettere -non inglesi venivano inserite con LaTeX -- per mostrare la parola francese per -Natale si usava @code{No\"el}. Ma in LilyPond -@c keep "-matching straight in fancy editors -2.6 e superiori, il carattere speciale @code{ë} deve essere inserito direttamente -nel file LilyPond come carattere UTF-8. @command{convert-ly} non può sostituire -tutti i caratteri speciali di LaTeX con i rispettivi caratteri UTF-8; è necessario -aggiornare a mano i vecchi file di input di LilyPond. - -Le regole di conversione di @command{convert-ly} si basano sulla ricerca -e sostituzione di parole chiave piuttosto che su una completa comprensione -di LilyPond. Ciò comporta varie conseguenze: +Le modifiche della sintassi di solito servono a rendere l'input più +facile sia da leggere che da scrivere e talvolta ad aggiungere a +LilyPond nuove funzionalità o miglioramenti di funzioni esistenti. + +Ecco un esempio reale: + +Tutti i nomi delle proprietà di @code{\paper} e @code{\layout} dovrebbero essere +scritte nella forma @code{primo-secondo-terzo}. Tuttavia, nella versione 2.11.60 +è emerso che la proprietà @code{printallheaders} non seguiva questa convenzione. +Questa proprietà doveva essere lasciata così come era (confondendo i nuovi +utenti con un formato di input incoerente), o doveva essere cambiata +(disturbando i vecchi utenti con file di input già scritti)? + +Fu deciso di cambiare il nome della proprietà in @code{print-all-headers}, e +tramite il comando @command{convert-ly} i vecchi utenti avevano a disposizione +uno strumento per aggiornare automaticamente i propri file di input. + +Tuttavia il comando @command{convert-ly} non è sempre in grado di gestire tutti +i cambiamenti di sintassi. Nelle versioni di LilyPond precedenti la versione +2.4.2, gli accenti e i caratteri non inglesi venivano inseriti con la notazione +standard di LaTeX. Per esempio, per inserire la parola francese che significa +@q{Natale} si usava @code{No\"el}. Ma nelle versioni successive di LilyPond, il +carattere speciale @code{ë} deve essere inserito direttamente come carattere +UTF-8. Il comando @command{convert-ly} non può sostituire i caratteri speciali +di LaTeX con i rispettivi caratteri UTF-8, dunque è necessario aggiornare a mano +i vecchi file di input di LilyPond. + +Le regole di conversione del comando @command{convert-ly} si basano sulla ricerca +e sostituzione di parole chiave (piuttosto che su una completa @q{comprensione} +del contesto di ciò che sta cambiando in un certo file di input). Ciò comporta +varie conseguenze: + @itemize @bullet @item L'affidabilità della conversione dipende dalla qualità di ciascun insieme di regole applicate e dalla complessità del rispettivo cambiamento. Talvolta -le conversioni richiedono correzioni manuali, quindi la vecchia versione -deve essere tenuta a disposizione per poterle confrontare. +le conversioni richiedono correzioni manuali ulteriori, quindi il file originale +deve essere conservato per poterlo confrontare in caso di necessità. + @item -Sono possibili solo conversioni nei formati più recenti: non ci sono regole -per tornare a una versione precedente. Dunque la copia di lavoro principale -di un file LilyPond deve essere aggiornata soltanto quando non è più necessario -compilarlo con le versioni precedenti di LilyPond. Sistemi di controllo di -versione come Git possono essere utili per gestire più di una versione. +Sono possibili solo conversioni ai cambi di sintassi più recenti: non ci +sono regole per tornare a una versione precedente di LilyPond. Dunque il file +di input deve essere aggiornato soltanto quando le versioni precedenti di +LilyPond non sono più mantenute. Di nuovo, il file di input originale deve +essere conservato per ogni evenienza, magari usando sistemi di controllo di +versione (es.: Git) per semplificare la gestione di versioni multiple dei +file di input. + @item -LilyPond e Scheme hanno delle robuste difese in caso di spazi omessi o -posizionati in modo originale, ma le regole usate da @command{convert-ly} tendono -a dare per scontato certe forme stilistiche. Seguire lo stile usato nei manuali -è la via più sicura per aggiornamenti indolori, soprattutto perché i manuali -stessi sono aggiornati con @command{convert-ly}. +LilyPond ha delle robuste difese quando elabora spazi omessi o posizionati +in modo @q{originale}, ma le regole usate da @command{convert-ly} tendono spesso +a dare per scontato certe forme stilistiche. Seguire lo stile di input usato +nei manuali di LilyPond è dunque la via più sicura per aggiornamenti indolori, +soprattutto perché gli esempi dei manuali stessi sono tutti aggiornati col +comando @command{convert-ly}. @end itemize - @node Utilizzo di convert-ly @section Utilizzo di @command{convert-ly} @translationof Invoking convert-ly -@command{convert-ly} usa la dichiarazione @code{\version} nel file di input -per determinare il vecchio numero di versione. Nella maggior parte dei casi -per aggiornare il file di input è sufficiente eseguire +Il comando @command{convert-ly} usa il numero specificato da @code{\version} nel +file di input per determinare versioni precedenti. Nella maggior parte dei casi +per aggiornare il file di input è sufficiente eseguire: @example convert-ly -e miofile.ly @end example @noindent -nella directory che contiene il file. Questo comando aggiornerà -@file{miofile.ly} e preserverà il file originale in -@file{miofile.ly~}. +nella directory che contiene il file di input. Questo comando aggiornerà +@file{miofile.ly} e preserverà il file originale rinominandolo +@file{miofile.ly~}. Verrà modificato anche il numero di @code{\version} +nel file di input aggiornato, insieme agli aggiornamenti di sintassi +richiesti. + +Dopo averlo lanciato, il comando @command{convert-ly} elencherà i numeri di +versione per i quali sono state eseguite le conversioni. Se non vengono +elencati dei numeri di versione il file è già aggiornato e utilizza la sintassi +LilyPond più recente. + +@warning{Per ogni nuova versione di LilyPond, viene creato un nuovo +@command{convert-ly}, ma non tutte le versioni di LilyPond necessitano +di cambi di sintassi per i propri file di input creati da una versione +precedente. Ciò significa che il comando @command{convert-ly} converterà +i file di input solo fino all'ultimo cambio di sintassi in suo possesso +e di conseguenza il numero di @code{\version} nel file di input aggiornato +è talvolta precedente alla versione del comando @command{convert-ly} stesso.} + +Per convertire tutti i file di input in una directory si usa: + +@example +convert-ly -e *.ly +@end example -@warning{@command{convert-ly} converte sempre fino all'ultimo cambiamento di -sintassi gestito. Questo significa che il numero di @code{\version} -che appare nel file convertito è di solito inferiore al numero di versione di -@command{convert-ly}.} +Sia gli utenti Linux che MacOS@tie{}X possono usare le rispettive applicazioni +del terminale, ma gli utenti MacOS@tie{}X possono anche eseguire questo comando +direttamente dalla voce di menu @code{Compila > Aggiorna la sintassi}. -Per convertire in una volta sola tutti i file di input in una directory si usa +Un utente Windows deve eseguire il comando: @example -convert-ly -e *.ly +convert-ly.py -e *.ly @end example -Altrimenti, se si desidera specificare un nome diverso per il file -aggiornato, senza modificare il file originale e il suo nome, si usa +@noindent +inserendolo in un @code{prompt dei comandi}, che di solito si trova in +@code{Start > Accessori > Prompt dei comandi} o, per gli utenti della +versione 8, scrivendo @q{prompt dei comandi} nella finestra di ricerca. + +Per convertire tutti i file di input che si trovano in diverse sottodirectory: @example -convert-ly miofile.ly > mionuovofile.ly +find . -name '*.ly' -exec convert-ly -e '@{@}' \; +@end example + +Questo esempio cerca e converte tutti i file di input nella directory +corrente e in tutte le sue sottodirectory ricorsivamente. I file +convertiti saranno salvati nella stessa directory insieme all'originale +rinominato. Dovrebbe funzionare anche per gli utenti MacOS@tie{}X, anche +se solo tramite l'applicazione del terminale. + +Gli utenti Windows devono usare: + +@example +forfiles /s /M *.ly /c "cmd /c convert-ly.py -e @@file" @end example -Il programma elencherà i numeri di versione per i quali sono state eseguite -le conversioni. Se non vengono elencati dei numeri di versione il file è -già aggiornato. +Altrimenti, si può indicare un percorso esplicito alla cartella che +contiene tutte le sottocartelle con i file di input tramite l'opzione +@code{/p}: -Gli utenti MacOS@tie{}X possono eseguire questi comandi dalla voce di menu -@code{Compila > Aggiorna la sintassi}. +@example +forfiles /s /p C:\Documents\MyScores /M *.ly /c "cmd /c convert-ly.py -e @@file" +@end example + +Tale percorso, se contiene spazi, deve essere racchiuso tra +virgolette doppie: + +@example +forfiles /s /p "C:\Documents\My Scores" /M *.ly /c "cmd /c convert-ly.py -e @@file" +@end example -Gli utenti Windows devono inserire questi comandi nella finestra del Prompt -dei comandi, che di solito si trova in -@code{Start > Accessori > Prompt dei comandi}. @node Opzioni da linea di comando per convert-ly @@ -156,13 +206,28 @@ Esistono le seguenti opzioni: aumenta il numero di versione in @code{\version} solo se il file è stato modificato da @command{convert-ly}. In questo caso, la dichiarazione di versione corrisponderà alla versione successiva all'ultimo reale cambiamento. -Senza questa opzione, la versione rifletterà l'ultima conversione -@emph{tentata}. +Il numero di una versione instabile sarà arrotondato al numero della versione +stabile successiva, a meno che ciò non vada oltre il numero di versione +obiettivo. Senza questa opzione, la versione rifletterà l'ultima +conversione @emph{tentata}. @item -e, --edit Applica le conversioni direttamente nel file di input, modificando l'originale. Il file originale viene rinominato @file{nomefile.ly~}. Questo file di backup può essere un file nascosto in alcuni sistemi operativi. +Altrimenti, se si desidera specificare un nome diverso per il file +aggiornato senza usare il predefinito @code{~} dell'opzione @code{-e} +appeso al vecchio file di input, si può usare la redirezione dell'output: + +@example +convert-ly miofile.ly > mionuovofile.ly +@end example + +Gli utenti Windows devono usare: + +@example +convert-ly.py miofile.ly > mionuovofile.ly +@end example @item -b, --backup-numbered Se usato insieme all'opzione @samp{-e}, aggiunge un numero al nome dei file diff --git a/Documentation/it/web.texi b/Documentation/it/web.texi index bf3f9167cf..82551ac928 100644 --- a/Documentation/it/web.texi +++ b/Documentation/it/web.texi @@ -1,6 +1,6 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; -*- @ignore - Translation of GIT committish: 0807a75d66c302c6b7fb13c9b586a25ebf0265ad + Translation of GIT committish: 1244656c3b2d852f29bd75007469e1b1ed0b616f When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -13,11 +13,6 @@ @documentlanguage it @afourpaper -@c `Web' was imported 2009-08-05 with git commit b938d71... -@c @macro copyrightDeclare -@c Copyright @copyright{} 2009--2012 by the authors. -@c @end macro - @set FDL @set web @include macros.itexi @@ -37,7 +32,7 @@ @c Translation checkers: Luca Rossetto Casel @copying -Copyright @copyright{} 2009--2012 degli autori. +Copyright @copyright{} 2003--2015 degli autori. @quotation Permission is granted to copy, distribute and/or modify this @@ -93,7 +88,6 @@ Per la versione di LilyPond @version{} @c @im ageId{cmws,web-snippet-alpha.png,Catchy Musical Web Snippet} @divId{quickSummary} -@subheading Cos'è LilyPond? LilyPond è un programma di incisione musicale e il suo scopo è produrre spartiti musicali della migliore qualità possibile. Introduce nelle stampe prodotte dai @@ -106,8 +100,6 @@ Maggiori informazioni nella nostra @ref{Introduzione}! @divEnd @divEnd -@divClass{separator} -@divEnd @divId{news} @@ -125,10 +117,22 @@ Maggiori informazioni nella nostra @ref{Introduzione}! @c do nothing @end ifclear @ifset web_version - @c make the box: -@divId{wildCardBox} +@divId{homePageSideBar} +@subheading Stabile + +@ref{Download, Download @versionStable} + +@ref{Manuali, Manuali @versionStable} + +@subheading Instabile + +@ref{Sviluppo, Download @versionDevel} + +@ref{Sviluppo, Manuali @versionDevel} + + @subheading Pondings -@divId{wildCardText} +@divId{pondingsText} @divEnd @divEnd @@ -157,32 +161,11 @@ Maggiori informazioni nella nostra @ref{Introduzione}! var index = Math.floor(Math.random() * tweets.length); var tweet = tweets[index]; var text = tweet.childNodes[0]; - document.getElementById("wildCardText").innerHTML = text.nodeValue; + document.getElementById("pondingsText").innerHTML = text.nodeValue; @end html -@ifset web_version - @c make the box: -@divId{latestVersion} -@subheading Link rapidi - -@c TODO: javascript to detect OS and suggest download? - -@subsubheading Stabile - -@ref{Download, Download @versionStable} - -@ref{Manuali, Manuali @versionStable} - -@subsubheading Instabile - -@ref{Sviluppo, Download @versionDevel} - -@ref{Sviluppo, Manuali @versionDevel} - -@divEnd -@end ifset @ifnottex diff --git a/Documentation/it/web/community.itexi b/Documentation/it/web/community.itexi index 4737b5c964..a7d974919a 100644 --- a/Documentation/it/web/community.itexi +++ b/Documentation/it/web/community.itexi @@ -1,6 +1,6 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: b4a06339566ce7e7f17ba60745261fc26b32abb0 + Translation of GIT committish: 58d22c26c9ed6f1845ebb5a7f36bdba8edf1b03b When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -50,7 +50,7 @@ quando si discute di LilyPond. @ref{Sviluppo}: per i collaboratori e i tester. @item -@ref{GSoC 2012}: le nostre idee per l'edizione 2012 del Google Summer of Code. +@ref{Google Summer of Code}: idee per il Google Summer of Code (GSoC). @item @ref{Autori}: le persone che hanno reso LilyPond quello che è oggi. @@ -88,7 +88,7 @@ quando si discute di LilyPond. * Aiutaci:: * Sponsor:: * Sviluppo:: -* GSoC 2012:: +* Google Summer of Code:: * Autori:: * Riconoscimenti:: * Pubblicazioni:: @@ -136,7 +136,7 @@ usati nei tuoi lavori. Guarda quello che hanno scritto altre persone, e aggiungi i tuoi esempi! @example -@uref{http://lsr.dsi.unimi.it} +@uref{http://lsr.di.unimi.it} @end example Esempi particolarmente istruttivi provenienti dal LSR sono inclusi nella @@ -179,32 +179,32 @@ potrebbe essere utile per altri dovrebbe essere inviata a una delle mailing list @subsubheading Altre lingue @quotation -@uref{http://lists.gnu.org/mailman/listinfo/lilypond-es, -mailing list spagnola} -@uref{http://www.lilypondforum.de/, -forum tedesco} +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-user-fr, +mailing list francese} @uref{http://groups.google.com/group/lilypond-brasil, gruppo portoghese} -@uref{http://lists.gnu.org/mailman/listinfo/lilypond-user-fr, -mailing list francese} +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-es, +mailing list spagnola} + +@uref{http://www.lilypondforum.de/, +forum tedesco} -@uref{http://www.lilypondforum.nl/, -forum olandese} @end quotation @divEnd @divClass{column-right-top} -@subheading Resta informato +@subheading LilyPond Blog -@subsubheading LilyPond Report +Leggi il blog gestito dalla comunità, @q{Scores of Beauty}: -Il modo più semplice per restare in contatto è leggere la newsletter della -nostra comunità, il @uref{http://news.lilynet.net/, LilyPond Report}. +@example +@uref{http://lilypondblog.org} +@end example @subsubheading Mailing list dei rilasci: @code{info-lilypond@@gnu.org} @@ -230,12 +230,12 @@ archivio 3} @divClass{column-right-bottom} -@subheading Discussione per gli Sviluppatori +@subheading Luoghi di discussione per sviluppatori e traduttori @subsubheading Mailing list degli sviluppatori: @code{lilypond-devel@@gnu.org} -Gran parte delle discussioni tra sviluppatori ha luogo in questa lista. Le -pezze (patch) devono essere inviate qui. +Le discussioni tra sviluppatori hanno luogo in questa lista. Le +@q{patch} possono essere inviate anche qui. @quotation @uref{http://lists.gnu.org/mailman/listinfo/lilypond-devel, @@ -255,7 +255,8 @@ scrivi alla lista lilypond-devel tramite gmane} @subsubheading Mailing list dei bug: @code{bug-lilypond@@gnu.org} -Le discussioni relative ai bug hanno luogo qui. +Questa lista è dedicata alla segnalazione di bug e alle discussioni sui +problemi di LilyPond. Non inviare @q{patch} qui. @quotation @uref{http://lists.gnu.org/mailman/listinfo/bug-lilypond, @@ -274,13 +275,15 @@ archivio 3} @warning{Prima di inviare un messaggio alla lista bug, leggi le nostre linee guida per la @ref{Segnalazione bug}.} -@divEnd +@subsubheading Mailing list dei traduttori: @code{translations@@lilynet.org} -@divClass{column-right-bottom} -@subheading Email delicate +Tutte le discussioni relative alla traduzione dei manuali di LilyPond deve +avere luogo qui. Non inviare patch a questa lista. -Le questioni private devono essere inviate a Graham Percival (project -manager), che ne discuterà con gli interessati. +@quotation +@uref{http://lilypond-translations.3384276.n2.nabble.com/, +Archivio della mailing list dei traduttori} +@end quotation @divEnd @@ -413,7 +416,7 @@ allora si tratta di un bug. Potremmo già essere a conoscenza di questo bug. Controlla qui: @example -@uref{http://code.google.com/p/lilypond/issues/list} +@uref{http://sourceforge.net/p/testlilyissues/issues/} @end example @warning{Per favore @strong{NON} aggiungere segnalazioni di bug direttamente @@ -536,7 +539,7 @@ mostrino come dovrebbe apparire secondo te! @divClass{keep-bullets} @divClass{column-left-top} -@subheading Remunerazioni +@subheading Remunerazioni (bounty) In passato, @@ -596,7 +599,7 @@ Un buon modo per sapere quali sono gli sviluppatori più attivi e preparati Sviluppatori interessati: @table @asis @item @email{dak@@gnu.org, David Kastrup} -Le remunerazioni sono necessarie per poter continuare il mio lavoro a tempo +Le donazioni mi permettono di continuare il mio lavoro a tempo pieno su LilyPond. Mi occupo in particolare di progettazione, coerenza, implementazione, semplificazione, documentazione e debug dell'interfaccia utente e programmatore. @@ -757,7 +760,7 @@ I collaudi lilypond-book per questa versione. @itemize @item @uref{http://lilypond.org/test, Confronto tra i collaudi di regressione} -@item @uref{http://lilypond.org/download/binaries/test-output/, +@item @uref{http://lilypond.org/downloads/binaries/test-output/, Archivio di tutti i collaudi di regressione} @end itemize @@ -872,168 +875,276 @@ manuali sono reperibili su @url{http://lilypond.org}} @divEnd -@node GSoC 2012 -@unnumberedsec GSoC 2012 -@translationof GSoC 2012 +@node Google Summer of Code +@unnumberedsec Google Summer of Code +@translationof Google Summer of Code @divClass{column-center-top} @subheading Che cos'è il Google Summer of Code? -È un programma internazionale organizzato da Google che offre agli studenti -degli stipendi per lavorare a progetti di software libero durante le -vacanze estive. +@uref{https://developers.google.com/open-source/gsoc/, GSoC} è un programma +internazionale che offre agli studenti degli stipendi per scrivere codice per +progetti di software libero e open source durante l'estate. È un'ottima +opportunità per gli studenti per fare esperienza con lo sviluppo software +in un progetto vero e per dare un contributo da cui tutti potranno trarre +vantaggio. Attrae nuovi collaboratori e stimola gli studenti che già +partecipano allo sviluppo di LilyPond ad impegnarsi di più in esso. LilyPond +partecipa a GSoC sotto l'egida del @uref{http://www.gnu.org/, progetto GNU}. + +Abbiamo avuto partecipanti al GSoC nel 2012 e nel 2015 e invitiamo gli studenti +a fare domanda per le prossime estati. -Il team di LilyPond ha deciso che si tratta di un'ottima opportunità per trovare -nuovi collaboratori e stimolare gli studenti che già partecipano allo sviluppo di -LilyPond ad essere più coinvolti. Uno dei nostri sviluppatori è stato accettato -per l'edizione 2012 sotto l'egida del @uref{http://www.gnu.org/, progetto GNU}; -speriamo di partecipare anche a future edizioni. +Se hai dubbi o desideri presentare domanda, invia un'email alla nostra +mailing list degli sviluppatori (vedi @ref{Contact}). @divEnd -@divClass{column-center-bottom} -@subheading La nostra lista delle idee per il 2012 +@divClass{column-center-middle-color2} +@subheading Elenco di idee di progetti -Ecco una lista di progetti che suggeriamo per gli studenti del GSoC 2012. -Sebbene il periodo delle domande sia finito, abbiamo deciso di tenere questa -pagina online come fonte di ispirazione per chiunque sia interessato a -contribuire allo sviluppo di LilyPond. -Alcuni membri del team di sviluppo sono disponibili a aiutare chi volesse -affrontare questi progetti. +Ecco un elenco di progetti suggeriti per il GSoC o per chiunque sia interessato +a aiutare a migliorare LilyPond. (Ultimo aggiornamento: Febbraio 2016) -Ci sono certamente molte altre cose da migliorare in LilyPond, inclusi -progetti molto piccoli. Una lista completa di tutti i problemi si trova -@uref{http://code.google.com/p/lilypond/issues/list, qui}. +La disponibilità di mentori varia da progetto a progetto e di anno in anno. +Invia un'email alla nostra mailing list degli sviluppatori (vedi @ref{Contact}) +e ti aiuteremo a trovare un mentore per un progetto che sia adatto ai tuoi +interessi e capacità. -@subheading Abbellimenti +Se hai idee per un progetto GSoC che non è elencato qui sotto, puoi inviarci +un'email per discuterne. Ci sono molte aree in cui LilyPond può essere +migliorato e il nostro team di sviluppo è sempre disponibile a aiutare +coloro che desiderino affrontare un progetto come quelli di seguito elencati. -Correggere i problemi di sincronizzazione degli abbellimenti, -insieme a tutta l'architettura sottostante (si veda il -@uref{http://code.google.com/p/lilypond/issues/detail?id=34, numero 34 del nostro tracker}). -Gli abbellimenti confondono il tempo di LilyPond perché è come se portassero -indietro il tempo. Questo causa strani effetti, specialmente quando un rigo -ha un abbellimento e l'altro non ce l'ha. +Una lista completa di tutti i problemi da risolvere si trova +@uref{http://sourceforge.net/p/testlilyissues/issues/, qui}. -@strong{Difficoltà:} media +@divEnd -@strong{Requisiti:} C++, MIDI +@divClass{column-center-middle-color3} +@subheading Migliorare la struttura interna degli accordi -@strong{Consigliato:} familiarità col funzionamento interno di LilyPond +La rappresentazione interna degli accordi in LilyPond non è abbastanza potente +da comprendere la nomenclatura degli accordi jazz. Attualmente l'accordo ha +una radice, un basso e un'inversione. Sarebbe auspicabile poter gestire +accordi @qq{impilati} o bicordi, minori/maggiori, etc. Per poter far questo, +deve essere sviluppata una rappresentazione interna capace di catturare +l'essenza di accordi complessi. Una volta che questa rappresentazione +interna viene sviluppata, c'è un'ulteriore vantaggio: sarà più semplice +migliorare la formattazione dei nomi degli accordi. -@strong{Mentore/i:} Mike Solomon, Carl Sorensen +@strong{Difficoltà:} Facile/media +@strong{Requisiti:} Scheme (Guile), ma il livello necessario può essere +facilmente imparato +@strong{Consigliato:} Teoria e nomenclatura degli accordi +@strong{Mentore:} Carl Sorensen -@subheading MusicXML +@divEnd -Aggiungere un'esportazione a MusicXML completa e migliorare l'importazione, -insieme a dei test che verifichino il funzionamento. A seconda del tempo a -disposizione, implementare alcune o tutte le seguenti funzionalità: +@divClass{column-center-middle-color3} +@subheading ScholarLY + +ScholarLY è una libreria di +@uref{https://openlilylib.org, openLilyLib} che fornisce delle funzionalità +per aggiungere annotazioni alle partiture, rendendo possibile la gestione +dei flussi di lavoro accademici nel contesto del documento della partitura. +Finora è possibile inserire delle annotazioni di diverso tipo, produrre +messaggi cliccabili nell'output della console e esportare su file di testo +o LaTeX. + +Ci sono numerose richieste di nuove funzionalità per trasformare questa +libreria in uno strumento ancora più potente e completo. Alcuni esempi: +inserimento di esempi musicali, creazione di note a piè di pagina, applicazione +automatica di stili all'elemento annotato (per esempio, usare il trattino per +la legatura di portamento, mettere un'alterazione tra parentesi), creazione +di resoconti con voci punta-e-clicca. Una descrizione completa di questo +progetto si trova in +@uref{https://github.com/openlilylib/scholarly/wiki/GSoC, questa pagina Wiki}. -@divClass{keep-bullets} -@itemize +@strong{Difficoltà:} media +@strong{Requisiti:} Scheme, possibilmente LaTeX, (opzionalmente Python) +@strong{Consigliato:} Esperienza o interesse nelle edizioni accademiche e +nei progetti collaborativi. +@strong{Mentore:} Urs Liska -@item -Gestire l'esportazione del contenuto musicale principale come l'esportazione -MIDI (ovvero usando classi dedicate dell'esportatore, derivate dalla classe -del traduttore) +@divEnd -@item -Costruire l'albero XML del contenuto musicale di base, -aggiungere un collegamento dall'evento musicale al tag XML +@divClass{column-center-middle-color3} +@subheading Aggiungere varianti dei glifi dei tipi di carattere -@item -Far sì che tutti gli incisori di LilyPond facciano il loro lavoro +@divClass{keep-bullets} +@itemize @item -Aggiungere la capacità di collegare ogni oggetto dell'output -(in pratica ogni stampo (stencil) / gruppo di stampi) alla sua causa musicale -(e quindi al tag XML nell'albero XML) +Aggiungere varianti @q{sulla} linea del rigo e @q{tra} le linee dei righi. @item -Aggiungere un backend di output XML, che possa aggiungere le informazioni di -formattazione per ogni oggetto di output ai tag XML +Varianti più corte e più strette di alcuni glifi, come ad esempio le +alterazioni. Un altro esempio più specifico è la testa della nota +breve nella notazione antica che ha due varianti, con un @q{buco} più +piccolo o più grande. @end itemize @divEnd -L'obiettivo sarà considerato raggiunto quando una partitura (scelta precedentemente) -può essere importata da MusicXML e riesportata senza una perdita di dati -indesiderata. +@strong{Difficoltà:} facile +@strong{Requisiti:} MetaFont, C++, buon occhio per il dettaglio +@strong{Conoscenze consigliate:} conoscenza di base di LilyPond +@strong{Mentore/i:} Werner Lemberg + +@divEnd + +@divClass{column-center-middle-color3} +@subheading Abbellimenti + +Correggere i problemi di sincronizzazione degli abbellimenti. +Gli abbellimenti possono interferire col modo in cui LilyPond +gestisce il tempo e causare strani effetti, specialmente quando si +usano più righi e alcuni di questi hanno degli abbellimenti mentre +altri non ce li hanno. Questo è uno dei +@uref{https://sourceforge.net/p/testlilyissues/issues/34/,bug} più +imbarazzanti e di vecchia data in LilyPond. @strong{Difficoltà:} media +@strong{Requisiti:} C++, MIDI +@strong{Consigliato:} familiarità col funzionamento interno di LilyPond +@strong{Mentori potenziali:} Mike Solomon (non disponibile per GSoC 2016), Carl Sorensen -@strong{Requisiti:} MusicXML, Python, conoscenza di base di LilyPond +@divEnd -@strong{Mentore/i:} Reinhold Kainhofer, Mike Solomon -è auspicabile una certa familiarità con altri software di notazione musicale (a -fine comparativo). +@divClass{column-center-middle-color3} +@subheading Migliorare la disposizione predefinita delle travature -@subheading Migliorare le legature di portamento e di valore +Per le travature normali, tra i righi, spezzate e angolari. La disposizione +delle travature deve dipendere dal contesto e dalle note vicine (si veda la +sezione 2.2 di +@uref{http://imslp.org/wiki/Repository_of_Music-Notation_Mistakes_%28Coulon%2C_Jean-Pierre%29, +questo libro}). Se possibile, ridurre anche il tempo di elaborazione della +disposizione delle travature. -La forma predefinita delle curve delle legature di portamento e di valore è spesso -non soddisfacente. Non sono supportate né le legature di valore su note -enarmoniche @code{@{ cis'~ des' @}} né le legature di valore "spezzate" da -una chiave o da un cambio di rigo. Il progetto include la raccolta e la classificazione -di esempi di output scadente, la decisione sull'output desiderato e la scrittura -del codice vero e proprio. +@strong{Difficoltà:} media +@strong{Requisiti:} C++, esperienza con la scrittura di euristiche +@strong{Conoscenze consigliate:} senso estetico +@strong{Mentori potenziali:} Mike Solomon (non disponibile per GSoC 2016), Carl Sorensen -@strong{Difficoltà:} difficile +@divEnd -@strong{Requisiti:} C++, esperienza con la scrittura di euristica -@strong{Conoscenze consigliate:} conoscenza di LilyPond, senso estetico +@divClass{column-center-middle-color3} +@subheading Permettere agli estensori di attraversare le voci -@strong{Mentore/i:} Mike Solomon +Attualmente gli estensori di ogni tipo (legature di valore e di portamento, +dinamiche, estensori del testo, trilli, etc.) devono essere terminati nel +contesto in cui sono iniziati. Tuttavia, questo limite non riflette la +realtà della notazione nella maggior parte delle impostazioni polifoniche. +Attualmente sono necessari degli scomodi espedienti che fanno uso di voci +nascoste per ottenere degli estensori che attraversino le voci. -@subheading Aggiungere una variante speciale dei glifi dei tipi di carattere -Aggiungere varianti sulla linea del rigo, tra le linee dei righi, più corte e -più strette di alcuni glifi, come ad esempio le alterazioni, insieme a un'infrastruttura -generica per supportarle. Un esempio è la testa della nota breve nella notazione -antica che ha due varianti, con un buco più piccolo e più grande. +Dovrebbero essere esplorati nuovi modi di affrontare questo problema, per +esempio -@strong{Difficoltà:} facile +@divClass{keep-bullets} +@itemize -@strong{Requisiti:} MetaFont, C++, buon occhio per il dettaglio +@item specificando un @qq{contesto obiettivo} dove è prevista la terminazione +dell'estensore -@strong{Conoscenze consigliate:} conoscenza di base di LilyPond +@item specificando esplicitamente l'oggetto su cui terminare l'estensore +tramite un ID -@strong{Mentore/i:} Werner Lemberg +@end itemize +@divEnd + +Questa funzionalità risolverebbe molti problemi che si riscontrano comunemente +nella musica per pianoforte e nelle parti combinate. + +@strong{Difficoltà:} media (?) +@strong{Requisiti:} C++, Scheme +@strong{Mentore potenziale:} Urs Liska +@divEnd -@subheading Migliorare la disposizione delle travature -Il posizionamento predefinito delle travature normali, tra i righi, spezzate e angolari -deve essere migliorato. La disposizione delle travature deve dipendere dal contesto -e dalle note vicine (si veda la -@uref{http://icking-music-archive.org/lists/sottisier/sottieng.pdf, sezione 2.2 qui}). -Se possibile, ridurre il tempo di elaborazione della disposizione delle travature. +@divClass{column-center-middle-color3} +@subheading Migliorare il comportamento durante la compilazione + +Strumenti di analisi automatica del codice, come il rilevamento di +perdite di memoria di valgrind e i profilatori di codice di callgrind, +forniscono informazioni utili per individuare possibili errori nel +nostro codice C++. Pulire gli avvisi ci permetterebbe di automatizzare +il rifiuto di qualsiasi patch che introduca avvisi ulteriori. @strong{Difficoltà:} media +@strong{Requisiti:} C++ +@strong{Mentori potenziali:} Reinhold Kainhofer (non disponibile per GSoC 2016), +Joe Neeman -@strong{Requisiti:} C++, esperienza con la scrittura di euristiche +@divEnd -@strong{Conoscenze consigliate:} senso estetico -@strong{Mentore/i:} Mike Solomon, Carl Sorensen +@divClass{column-center-middle-color3} +@subheading MusicXML -@subheading Semplificare vari avvisi durante la compilazione +Migliorare le funzioni di importazione e esportazione di MusicXML: -Semplificare gli avvisi del compilatore e di valgrind e l'analisi del codice statico. -Strumenti di analisi automatica del codice (avvisi in @code{g++} e @code{clang}) -e strumenti di analisi come il rilevamento di perdite di memoria di valgrind e -i profilatori di codice di callgrind forniscono informazioni utili per individuare -possibili errori nel codice C++. -Pulire questi avvisi ci permetterebbe di rifiutare automaticamente qualsiasi -patch che introduca avvisi ulteriori. +@divClass{keep-bullets} +@itemize + +@item +Gestire l'esportazione del contenuto musicale principale come l'esportazione +MIDI (ovvero usando classi dedicate dell'esportatore, derivate dalla classe +del traduttore). + +@item +Costruire l'albero XML del contenuto musicale di base, +aggiungere un collegamento dall'evento musicale al tag XML. + +@item +Far sì che tutti gli incisori di LilyPond facciano il loro lavoro. + +@item +Aggiungere la capacità di collegare ogni oggetto dell'output +(ovvero ogni stampo (stencil) / gruppo di stampi) alla sua causa musicale +(e quindi al tag XML nell'albero XML). + +@item +Creare un backend di output XML, che possa aggiungere le informazioni di +formattazione per ogni oggetto di output ai tag XML. + +@end itemize +@divEnd + +Ci sono varie direzioni possibili per questo progetto, inclusa quella di +proseguire l'esportazione in formato MusicXML iniziata nel progetto GSoC 2015. @strong{Difficoltà:} media +@strong{Requisiti:} MusicXML, Python, Scheme, conoscenza di base di LilyPond +@strong{Mentori potenziali:} Reinhold Kainhofer, Mike Solomon (entrambi non +disponibili per GSoC 2016) -@strong{Requisiti:} C++ +È utile avere una certa familiarità con altri software di notazione musicale (a +fine comparativo). -@strong{Mentore/i:} Joe Neeman, Reinhold Kainhofer +@divEnd + +@divClass{column-center-middle-color3} +@subheading Migliorare le legature di portamento e di valore + +La qualità tipografica delle legature di portamento e di valore è spesso +non soddisfacente. Le legature di valore @qq{spezzate} da una chiave o da +un cambio di rigo non sono gestite al meglio. Il progetto potrebbe +includere la raccolta e la classificazione di esempi di output scadente, la +decisione sull'output desiderato e la scrittura del codice per migliorarlo. + +@strong{Difficoltà:} difficile +@strong{Requisiti:} C++, esperienza con la scrittura di euristica +@strong{Conoscenze consigliate:} conoscenza di LilyPond, senso estetico +@strong{Mentori:} Mike Solomon, Janek Warchol (entrambi non disponibili +per GSoC 2016) @divEnd + @node Autori @unnumberedsec Autori @translationof Authors diff --git a/Documentation/it/web/download.itexi b/Documentation/it/web/download.itexi index a20dfeec53..039e527952 100644 --- a/Documentation/it/web/download.itexi +++ b/Documentation/it/web/download.itexi @@ -1,6 +1,6 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: 53ea968b35ad64c914a7bd503786aaf8d3b0c762 + Translation of GIT committish: e6207bad4b2148e2c99ff66c2593ab5cf0b21f4e When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -82,7 +82,7 @@ ultima versione non stabile @divEnd -@divClass{column-center-bottom} +@divClass{column-center-middle-color2} @subheading Licenza software @@ -91,7 +91,7 @@ LilyPond è distribuito secondo la @divEnd -@divClass{color1} +@divClass{column-center-bottom} @subheading Sponsor @@ -102,6 +102,9 @@ Un ringraziamento a @uref{http://www.vt.edu/, Virginia Tech} e @sourceimage{VTlogo_ITF,,,} @sourceimage{lao_banner_06_on_white_demo,,,} +@divEnd + +@divClass{column-center-bottom} @subheading Legalese @divClass{legal} @@ -142,12 +145,12 @@ immagini dei prodotti. @divClass{column-center-top} @subheading Pacchetti generici o pacchetti specifici di una distribuzione? -Molte distribuzioni includono LilyPond nel loro repository di pacchetti -e questi pacchetti sono spesso molto più facili da installare rispetto -ai pacchetti generici che si trovano su queto sito. Tuttavia le versioni -di LilyPond in questi repository sono @emph{molto} più vecchi della versione -stabile corrente. Se preferisci usare i nostri pacchetti generici, controlla -che il tuo editor LilyPond stia usando la versione corretta. Vedi @ref{Easier editing}. +Molte distribuzioni includono LilyPond nei loro repository ma i loro +pacchetti sono spesso @emph{molto} più vecchi della versione +stabile corrente. Anche se questi pacchetti più vecchi sono più facili +da installare, consigliamo @emph{caldamente} di usare i nostri pacchetti +generici. In questo caso, controlla che il tuo editor LilyPond stia usando +la versione corretta. Vedi @ref{Easier editing}. @divEnd @@ -167,12 +170,12 @@ che il tuo editor LilyPond stia usando la versione corretta. Vedi @ref{Easier e @ifset web_version @downloadStableLinuxNormal @end ifset - -(se non sei sicuro, usa questo) +Sistemi a 32bit. @item @sourceimage{logo-linux,,,} @downloadStableLinuxBig +Sistemi a 64bit. @item @sourceimage{logo-linux,,,} @@ -181,10 +184,12 @@ che il tuo editor LilyPond stia usando la versione corretta. Vedi @ref{Easier e @item @sourceimage{logo-freebsd,,,} @downloadStableFreeBSDNormal +Sistemi a 32bit. @item @sourceimage{logo-freebsd,,,} @downloadStableFreeBSDBig +Sistemi a 64bit. @end itemize @@ -219,44 +224,7 @@ sh lilypond-@versionStable{}-OS-TYPE.sh --help @divClass{column-right-top} -@subheading Pacchetti specifici di una distribuzione - -Usa il gestore pacchetti della tua distribuzione per istallare o -aggiornare a queste versioni. - -@itemize - -@item -@sourceimage{logo-fedora,,,} -@uref{http://koji.fedoraproject.org/koji/packageinfo?packageID=2447, -Fedora: LilyPond 2.14.2} - -@item -@sourceimage{logo-ubuntu,,,} -@uref{http://packages.ubuntu.com/search?keywords=lilypond, -Ubuntu: LilyPond 2.14.2} -@item -@sourceimage{logo-slackware,,,} -@uref{http://www.johannes-schoepfer.de/lilypond/, -Slackware: LilyPond 2.14.2} - -@item -@sourceimage{logo-debian,,,} -@uref{http://packages.debian.org/search?keywords=lilypond, -Debian: LilyPond 2.12.3} - -@item -@sourceimage{logo-suse,,,} -@uref{http://software.opensuse.org/search?baseproject=openSUSE%3A11.2&p=1&q=lilypond, -openSUSE: LilyPond 2.12.3} - -@end itemize - -@divEnd - - -@divClass{column-center-top} @subheading Compilare un file @lilypadCommandLine @@ -511,7 +479,8 @@ che contiene i file eseguibili di LilyPond, in questo modo: [@var{pre-set paths}];@var{DIR}\LilyPond\usr\bin @end example -@warning{@var{DIR} generalmente è @code{C:@bs{}Program Files}.} +@warning{@var{DIR} generalmente è @code{C:@bs{}Program Files (x86)} per i +sistemi a 64 bit e @code{C:@bs{}Program Files} per quelli a 32 bit.} @noindent e clicca il bottone @qq{OK} per chiudere la finestra. diff --git a/Documentation/it/web/introduction.itexi b/Documentation/it/web/introduction.itexi index 74c4ea7d9f..e04da75106 100644 --- a/Documentation/it/web/introduction.itexi +++ b/Documentation/it/web/introduction.itexi @@ -1,6 +1,6 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: 62dd4c2473cba2401ef83ccac3d353959c166399 + Translation of GIT committish: d4756c74976a991bd80cf757f774e5525d0830cb When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -21,10 +21,13 @@ l'aspetto meccanico degli spartiti realizzati col computer. I musicisti preferiscono leggere musica ben scritta; allora, perché dei programmatori non potrebbero scrivere un software in grado di produrre partiture eleganti? -Il risultato è un sistema che fa sì che i musicisti possano non curarsi dei -dettagli d'impaginazione per concentrarsi invece sulla musica. LilyPond lavora -con loro per creare partiture con una qualità di livello editoriale, realizzate secondo -le migliori tradizioni della tipografia musicale. +Il risultato è un programma che crea delle belle partiture seguendo le +migliori tradizioni della tipografia musicale. Si prende cura in modo +programmatico dei dettagli della formattazione, consentendo a compositori, +trascrittori e editori di prestare attenzione alla @emph{musica} invece di +cercare di migliorare l'output del proprio software. Gli esecutori +otterranno delle parti che permetteranno loro di concentrarsi sull' +@emph{esecuzione} della musica invece che sulla sua @emph{lettura}. @divEnd @@ -102,11 +105,8 @@ le migliori tradizioni della tipografia musicale. @unnumberedsec Funzionalità @translationof Features - -@subheading Perché passare a LilyPond? - - -@subsubheading Eccellente incisione classica +@divClass{column-center-top} +@subheading Eccellente incisione classica @imageFloat{flat-design,png,right} @@ -119,76 +119,177 @@ L'output di LilyPond ha lo stesso aspetto netto, equilibrato ed elegante delle migliori partiture classiche. Questo è stato approfondito nel nostro @ref{Essay}. +@divEnd -@subsubheading Pochi ritocchi -Impieghi minor tempo nel correggere l'output; LilyPond imposta la -formattazione corretta fin dall'inizio. Determina da solo lo -spazio, e le interruzioni di linea e di pagina per fornire un'impaginazione -proporzionata e uniforme. Le collisioni tra testo, note e accordi vengono risolte -e le legature di portamento e le codette sono posizionate automaticamente! +@divClass{column-center-top} +@subheading Input testuale +@subsubheading Tutto è esplicito -@subsubheading Input testuale +LilyPond elabora input testuale, contenente tutte le informazioni +sul @emph{contenuto} della partitura e può essere facilmente letto +da un altro essere umano così come da un altro programma. Non ci +sono oscure impostazioni nascoste dietro le voci di un menù né +salvataggi in file binari. -LilyPond riceve l'input in ASCII, che puoi creare nel tuo editor di -testo preferito, velocemente e comodamente. L'input contiene tutte le -informazioni necessarie, dunque non c'è bisogno di ricordare complesse -sequenze di comandi: puoi semplicemente salvare il file per una -consultazione successiva. +Questo concetto è approfondito in @ref{Text input}. -@subsubheading Accessibilità +@subsubheading Le modifiche manuali sono robuste e tracciabili -L'input testuale rende inoltre la scrittura musicale possibile per gli utenti -con serie inabilità fisiche. Gli utenti con problemi di coordinazione che non -sono in grado di usare la tastiera o il mouse possono usare software di -riconoscimento vocale per modificare i file LilyPond. Anche gli utenti -totalmente privi di vista possono usare un software di lettura dello schermo -per scrivere file LilyPond -- un'operazione impossibile nei programmi -di scrittura musicale basati su interfaccia grafica. +Se devi cambiare qualcosa relativo all'aspetto, tale modifica +sarà visibile anche nel file di input in una forma comprensibile +per un essere umano. Quindi sei sempre in grado di rivedere +le tracce di ciò che hai fatto. Se tu dovessi per sbaglio +rendere il file non funzionante, puoi facilmente ripristinare +o modificare qualsiasi decisione senza essere costretto a +usare una funzione @emph{Annulla}. -@subsubheading Unisci musica e testo +@subsubheading I file di testo sono a prova di fallimento e di futuro + +I file di testo sono molto robusti contro la corruzione di file. Ed +essendo leggibili dall'essere umano sei anche sempre in grado di +interpretarli pur non avendo accesso al programma che li ha creati. + + +@subsubheading Gestisci le tue partiture col controllo di versione + +I file di testo possono essere gestiti con un programma di controllo +di versione. Provalo e sperimenta gli infiniti e diversi meccanismi +per annullare e ripetere le modifiche nonché la possibilità di avere la +storia dell'intero sviluppo delle tue partiture. Il controllo di +versione potrebbe anche aprirti la strada a nuovi metodi di lavoro +(collaborativo). + +@divEnd + +@divClass{column-center-top} +@subheading Usabilità @imageFloat{lilypond-book,png,right} + +@subsubheading Scelte di formattazione efficaci + +Impieghi minor tempo nel correggere l'output; LilyPond imposta la formattazione +corretta fin dall'inizio. Determina da solo lo spazio, e le interruzioni di +linea e di pagina per fornire un'impaginazione proporzionata e uniforme. Le +collisioni tra testo, note e accordi vengono risolte e le legature di portamento +e le codette sono posizionate automaticamente! + + +@subsubheading Unisci musica e testo + Inserisci frammenti di musica nel testo senza dover tagliare e incollare -immagini. Integra comodamente la musica in @LaTeX{} e in HTML, o -aggiungi la musica in OpenOffice.org o LibreOffice con OOoLilyPond. +immagini. Integra comodamente la musica in @LaTeX{} o HTML, o aggiungi la +musica in OpenOffice.org e LibreOffice con +@uref{http://extensions.services.openoffice.org/en/project/OOoLilyPond,OOoLilypond}. +Esistono anche dei plugin che permettono di usare l'input di LilyPond in blog e +wiki, rendendo possibile la collaborazione online. +@subsubheading Accessibilità -@subsubheading Software libero +L'input testuale rende inoltre la scrittura musicale possibile per gli utenti +con serie inabilità fisiche. Gli utenti con problemi di coordinazione che non +sono in grado di usare la tastiera o il mouse possono usare software di +riconoscimento vocale per modificare i file LilyPond. Anche gli utenti +totalmente privi di vista possono usare un software di lettura dello schermo per +scrivere file LilyPond – un'operazione impossibile nei programmi di scrittura +musicale basati su interfaccia grafica. Puoi vedere una partitura spettacolare +in @ref{Examples}. -LilyPond può essere scaricato gratuitamente! Sì: è gratuito. Scaricalo -dalla pagina di download. +@subsubheading Diversità degli editor -È anche software libero. Viene distribuito col codice sorgente e il -permesso di modificarlo e copiarlo. Sei infastidito da un -malfunzionamento, o desideri una nuova funzionalità? Puoi aggiungerla tu -stesso, o pagare qualcun altro per farlo. +Molti sviluppatori, loro stessi attivi utenti LilyPond, hanno scritto +degli strumenti volti proprio a rendere più veloce e efficace il processo +di modifica dei file LilyPond; non sei quindi legato a una singola interfaccia +utente ma puoi usare strumenti diversi per compiti diversi. Puoi perfino +usare un editor LilyPond ricco di funzionalità a casa e l'app blocco note +del telefonino per modificare i file quando sei in movimento. Alcuni esempi +sono elencati in @ref{Easier editing}. + + +@divEnd +@divClass{column-center-top} + +@subheading Progettazione estendibile -@subsubheading Modello estendibile +@subsubheading Facile gestione dei fogli di stile Tutte le impostazioni possono essere modificate per soddisfare il tuo -personale gusto tipografico. Se questo non è ancora abbastanza, c'è sempre -il linguaggio di scripting Scheme, un dialetto del potente linguaggio -LISP. Impostazioni, variabili e funzioni sono tutte documentate -nell'esauriente manuale di riferimento del programma. +personale gusto tipografico. Puoi facilmente scrivere dei fogli di +stile che cambiano qualsiasi elemento dell'aspetto predefinito delle +partiture create da LilyPond. Dato che anche questi sono scritti come +file di testo e possono essere salvati in file separati, puoi semplicemente +passare da un foglio di stile all'altro per produrre partiture con un +aspetto o una disposizione completamente diversi. +Desideri stampare una partitura su foglio A4 e proiettarla con un +proiettore, un sistema per pagina? Il motore della formattazione di +LilyPond genererà entrambi dallo stesso input. + +@subsubheading Aggiungi le tue funzioni + +Se questo non è ancora abbastanza, c'è sempre il linguaggio di scripting +Scheme, che può accedere al motore della formattazione di LilyPond allo +stesso di livello cui ci accede LilyPond stesso, rendendolo uno strumento +@emph{molto} potente. Impostazioni, variabili e funzioni sono tutte +documentate nell'esauriente manuale di riferimento del programma.. + +@subsubheading Elabora le partiture tramite la programmazione + +I file di input di LilyPond possono essere modificati o perfino generati +da programmi e script, per esempio per la composizionoe algoritmica. +Ma si può accedere al contenuto musicale anche per analizzarlo o per +gestire dei frammenti di input in un database. Non ci sono limiti +tranne la tua immaginazione. +@subsubheading Creare nuovi strumenti che usano LilyPond + +LilyPond, non essendo un monolitico programma a interfaccia grafica ma +uno strumento a linea di comando, può essere usato anche da altre applicazioni. +È così possibile dare il potere di incisione di LilyPond a certi +programmi come un'applicazione web. Esistono già vari strumenti online +che usano LilyPond. + + +@divEnd + +@divClass{column-center-top} + +@subheading Ambiente + +@imageFloat{frescobaldi-lilypond-editor-small,png,right} + @subsubheading Ottimo supporto LilyPond gira su tutte le piattaforme più note: GNU/Linux, MacOS X, e Windows. LilyPond include un'ampia documentazione e centinaia di file di esempio. C'è un'attiva comunità di utenti che risponde alle -domande nella mailing list dedicata agli utenti Lilypond, mentre il team -di sviluppo si assicura che i problemi vengano risolti rapidamente. +domande nella mailing list internazionale dedicata agli utenti Lilypond, +offrendo gentilmente il proprio aiuto. I tempi di risposta sono solitamente +molto brevi e spesso vengono suggerite brillanti soluzioni dei problemi +segnalati. Grazie alla stretta interazione col team di sviluppo, tali +soluzioni sono spesso incluse in LilyPond stesso. Maggiori informazioni +in @ref{Community}. + +@subsubheading Software libero + +LilyPond può essere scaricato gratuitamente! Sì: è gratuito. Scaricalo +dalla pagina di download. +È anche software libero. Viene distribuito col codice sorgente e il +permesso di modificarlo e copiarlo. Sei infastidito da un +malfunzionamento, o desideri una nuova funzionalità? Puoi aggiungerla tu +stesso, o pagare qualcun altro per farlo. +Maggiori informazioni in @ref{Freedom}. +@divEnd @divClass{column-center-bottom} @subheading E ora? @@ -203,60 +304,58 @@ già deciso di provare LilyPond, per prima cosa informati sul nostro @unnumberedsec Esempi @translationof Examples +@divClass{column-center-top} + +@subheading Begli esempi + Lilypond è uno strumento potente e flessibile per scrivere ogni tipo di musica. Dai un'occhiata alla galleria di esempi e lasciati ispirare! -@ignore -Here is a passage from Franz Liszt's solo piano transcription -of the Overture to Wagner's @emph{Tannhäuser}. The spacing -in this example was all performed by Lilypond's formatting -algorithms, without tweaks of any kind. It -handles cross-staff beaming gracefully and puts the system brace -perfectly around all three staves. - -@exampleImage{liszt-wagner} -@end ignore +@divEnd + -@newsItem -@subsubheading Musica Classica +@divClass{column-center-middle-color2} +@subheading Musica Classica -Questo brano per organo di J.S. Bach rappresenta un tipico esempio di progetto Lilypond. +Questo brano per organo di J.S. Bach rappresenta un tipico esempio di +progetto Lilypond. @exampleImage{bach-bwv610} -@newsEnd +@divEnd -@newsItem -@subsubheading Notazione Complessa +@divClass{column-center-middle-color2} +@subheading Notazione Complessa Questo esempio tratto dalle @emph{Goyescas} di Enrique Granados mostra alcune delle funzionalità tipografiche più avanzate, come la ripartizione di travature -e gambi tra più righi e l'evidenziazione dello svolgimento di una singola voce mediante tratti spezzati. +e gambi tra più righi e l'evidenziazione dello svolgimento di una singola voce +mediante tratti spezzati. @exampleImage{granados} -@newsEnd +@divEnd -@newsItem -@subsubheading Musica Antica +@divClass{column-center-middle-color2} +@subheading Musica Antica Lilypond supporta anche vari tipi di notazione antica, come questo passaggio di canto gregoriano. @exampleImage{ancient-headword} -@newsEnd +@divEnd -@newsItem -@subsubheading Musica Moderna +@divClass{column-center-middle-color2} +@subheading Musica Moderna I compositori contemporanei ritengono che Lilypond sia molto adatto a visualizzare notazioni non convenzionali. Ecco un estratto dal @emph{Čáry} di Trevor Bača, per flauto basso non accompagnato. @exampleImage{cary} -@newsEnd +@divEnd -@newsItem -@subsubheading Creazione efficiente e flessibile di materiali da esecuzione +@divClass{column-center-middle-color2} +@subheading Creazione efficiente e flessibile di materiali da esecuzione A partire dallo stesso codice sorgente possono essere creati diversi materiali d'esecuzione. Questo è @@ -270,10 +369,10 @@ completa, riduzione per canto e pianoforte, e parte per violino. @exampleImage{sesto-violin} -@newsEnd +@divEnd -@newsItem -@subsubheading Intavolatura +@divClass{column-center-middle-color2} +@subheading Intavolatura Lilypond supporta la notazione per intavolatura, che può essere personalizzata per adattarsi a ogni strumento che ne fa uso. Il rigo @@ -281,10 +380,10 @@ dell'intavolatura viene generato automaticamente dalle note inserite per il pentagramma. @exampleImage{tab-example} -@newsEnd +@divEnd -@newsItem -@subsubheading Grafici Schenker +@divClass{column-center-middle-color2} +@subheading Grafici Schenker L'output di default può essere ampiamente modificato. Ecco un'analisi Schenkeriana di grande effetto, creata da Kris Schaffer, per un articolo @@ -292,10 +391,20 @@ su @uref{http://www.linuxjournal.com/article/8364 , Linux Journal}. I colori sono stati aggiunti per migliorare la visibilità. @exampleImage{bach-schenker} -@newsEnd +@divEnd + +@divClass{column-center-middle-color2} +@subheading Output personalizzato + +Un breve estratto del Klavierstück II di Stockhausen per dimostrare la +capacità di Lilypond di fornire output personalizzato. + +@exampleImage{Stockhausen_Klavierstueck2} +@divEnd + -@newsItem -@subsubheading Musica Vocale +@divClass{column-center-middle-color2} +@subheading Musica Vocale Lilypond è eccellente per la musica vocale di tutti i generi, dagli inni sacri all'opera. Ecco un mottetto medievale con requisiti leggermente @@ -306,19 +415,19 @@ incipit con chiave in stile Vaticana, i gambi barrati a indicare note plicate, e le parentesi quadre sulle sezioni legate. @exampleImage{aucun-snippet} -@newsEnd +@divEnd -@newsItem -@subsubheading Applicazioni didattiche +@divClass{column-center-middle-color2} +@subheading Applicazioni didattiche Lilypond è molto indicato anche per applicazioni didattiche. Ecco un esempio di un semplice esercizio di contrappunto. @exampleImage{theory} -@newsEnd +@divEnd -@newsItem -@subsubheading Musica Popolare +@divClass{column-center-middle-color2} +@subheading Musica Popolare È semplice creare spartiti semplificati pop con melodia, testo, nomi degli accordi, e tastiere. In questo esempio puoi vedere alcuni @@ -326,10 +435,10 @@ dei diagrammi di tastiera predefiniti, ma questi possono essere ampiamente personalizzati per adattarsi a quasi ogni situazione. @exampleImage{chart} -@newsEnd +@divEnd -@newsItem -@subsubheading Grandi Progetti +@divClass{column-center-middle-color2} +@subheading Grandi Progetti Lilypond è ottimo anche per progetti ad ampio respiro come opere o lavori per un'orchestra sinfonica al completo. Inoltre l'input testuale permette @@ -337,8 +446,8 @@ una maggiore accessibilità -- questo esempio è stato realizzato da Hu Haipeng, un compositore cieco. @exampleImage{orchestra} -@newsEnd +@divEnd @divClass{column-center-bottom} @subheading E ora? @@ -366,7 +475,7 @@ dovrebbe richiedere centinaia di dollari di software! @c @divClass{column-left-top} -@divClass{color2} +@divClass{column-center-middle-color2} @divClass{keep-bullets} @subheading Quali sono i vantaggi per gli utenti? @@ -407,7 +516,7 @@ essere legalmente disponibile per la copia, la modifica e la distribuzione. @c @divClass{column-right-top} -@divClass{color3} +@divClass{column-center-middle-color3} @divClass{keep-bullets} @subheading Perché gli sviluppatori di LilyPond @qq{regalano} la loro opera? @@ -470,9 +579,11 @@ LilyPond, per prima cosa informati sul nostro @ref{Input testuale}. Abbiamo un lungo saggio che descrive l'estetica computazionale: l'arte di creare la bellezza con un computer. -Se cerchi soltanto una rapida introduzione a LilyPond, il saggio potrebbe -contenere troppe informazioni da leggere. Se vuoi leggerlo ora, -procedi in @ref{Essay}. +Si tratta di una lettura interessante se ti incuriosisce una discussione +approfondita delle nostre idee principali. A causa del suo volume, il +saggio è presentato come "manunale". Se vuoi leggerlo ora, passa a +@ref{Essay}. Tuttavia, se vuoi solo una rapida introduzione a LilyPond, +per ora puoi saltarlo. @divEnd @divClass{column-center-bottom} @@ -488,6 +599,16 @@ LilyPond, per prima cosa informati sul nostro @ref{Input testuale}. @unnumberedsec Produzioni @translationof Productions +@divClass{column-center-top} + +@subheading Produzioni che usano LilyPond + +Qui puoi informarti sulle persone che usano LilyPond nelle +loro produzioni, sia per le esecuzioni della loro musica +che per le partiture pubblicate. + +@divEnd + @divClass{column-left-top} @subheading Concerti @@ -498,26 +619,38 @@ In evidenza: @itemize @item -@uref{http://www.aurelienbello.com/,Aurélien Bello} ha riorchestrato -@emph{Der Ring des Nibelungen} di Richard Wagner in una -@uref{http://www.rsb-online.de/content/konzerte/wagnerzyklus-10-13/wagner-fuer-kinder/index_ger.html,100- -versione ridotta per bambini}. -È stata scritta per un'orchestra sinfonica standard ma con un cast ridotto di -cantanti, e verrà eseguita dalla -@emph{Radio-Sinfonieorchester Berlin} il 5 e 6 Aprile 2014 nel teatro -Atze Musiktheater di Berlino. Il direttore è Heiko Matthias Förster. +@uref{http://www.aurelienbello.com/,Aurélien Bello} ha arrangiato una +versione del @emph{Der Rosenkavalier} di Richard Strauss +per quattro voci e un'orchestra da camera di tredici musicisti. È stata +commissionata dall'Orchestra Filarmonica di Berlino i cui membri saranno +gli esecutori il +@uref{http://www.festspielhaus.de/veranstaltung/der-kleine-rosenkavalier-02-04-2015-1100/,2 e 6 Aprile} +al Festspielhaus, Baden-Baden, e poi il +@uref{http://www.berliner-philharmoniker.de/konzerte/kalender/details/21070/,26 Aprile} +alla @emph{Großer Saal} della Philarmonie di Berlino. +Siamo contenti di vedere musicisti di tale reputazione suonare leggendo +partiture prodotte da LilyPond (e, a quanto si dice, sono molto soddisfatti +di queste partiture). + +Aurélien ha anche riorchestrato il @emph{Der Ring des Nibelungen} di Richard Wagner in una +@uref{https://www.rsb-online.de/content/concerts/new-season-1516/family-concerts-age-7-and-above/index_eng.html,versione ridotta per bambini}. +Scritta per un'orchestra sinfonica standard, ma con un cast ridotto di +cantanti, è stata eseguita dalla +@uref{http://www.rsb-online.de/,@emph{Radio-Sinfonieorchester Berlin}} +nell'Aprile 2014 al teatro Atze Musiktheater di Berlino. Il direttore +era Heiko Matthias Förster. @item Joe Smeets ha creato una partitura per il libro di bambini @emph{Zing Mee} -(@emph{Sing along}) di Annie M.G. pubblicato da Querido -- ISBN -9789045106205: -@uref{http://www.queridokinderenjeugdboeken.nl/web/Boek.htm?dbid=18954&typeofpage=134707, www.queridokinderenjeugdboeken.nl}; le partiture delle prove del coro -per la traduzione olandese del @emph{Saint Nicolas} di Benjamin Britten sono -state eseguite dal @emph{Muziektheater Hollands Diep} nel 2011: -@uref{http://www.muziektheaterhollandsdiep.nl/nl/voorstellingen/sint_nicolaas_leeft, www.muziektheaterhollandsdiep.nl}. Attualmente sta lavorando sulla partitura -e le parti per un arrangiamento del @emph{Boris Godounov} di Moussurgsky per -quartetto d'archi, pianoforte e percussioni. Verrà eseguita nel 2014, -di nuovo dal @emph{Muziektheater Hollands Diep}. +(@emph{Sing along}) di Annie M.G. pubblicato da +@uref{http://www.queridokinderenjeugdboeken.nl/, Querido} -- ISBN 9789045106205; +le partiture delle prove del coro per la traduzione olandese del +@emph{Saint Nicolas} di Benjamin Britten sono state eseguite dal +@emph{Muziektheater Hollands Diep} nel 2011; +@uref{http://www.muziektheaterhollandsdiep.nl/nl/voorstellingen/sint_nicolaas_leeft, www.muziektheaterhollandsdiep.nl}. +Ha lavorato anche alla partitura e alle parti di un arrangiamento del +@emph{Boris Godounov} di Moussurgsky per quartetto d'archi, pianoforte e +percussioni, eseguito nel 2014, di nuovo dal @emph{Muziektheater Hollands Diep}. @item @@ -535,27 +668,26 @@ per la sua tesi di dottorato. @item @emph{Pictures at an exhibition} di Mussorgsky, riorchestrata e diretta da @uref{http://www.aurelienbello.com/,Aurélien Bello} con -la @uref{http://www.junge-philharmonie-brandenburg.de/,Junge Philharmonie Brandenburg} -il 10 Ottobre 2011 e di nuovo il 15-16 Aprile 2012. +la @uref{https://junge-philharmonie-brandenburg.de/,Junge Philharmonie Brandenburg} +nell'Ottobre 2011 e nell'Aprile 2012. @item -@uref{http://www.kierenmacmillan.info/, Kieren MacMillan}, compositore e +@uref{http://kierenmacmillan.info/, Kieren MacMillan}, compositore e direttore musicale. Le sue opere recenti sono: @emph{Go Thy Way}, eseguita da @uref{http://www.saltlakechoralartists.org/, Salt Lake Choral Artists} nel Marzo 2012; @emph{Just Out of Reach Suite} eseguita dal @uref{http://www.herald-dispatch.com/news/marshall/x1883873762/Music-duo-Chrysalis-to-perform-at-Marshall-University-on-Jan-19, Chrysalis Duo} ; @emph{thrafsmata} eseguita nel Luglio 2011 dal -@uref{http://www.pnme.org/CurrentSeason/PreviousSeasons.html, Pittsburgh -New Music Ensemble}. +@uref{http://www.pnme.org/, Pittsburgh New Music Ensemble}. @item @emph{Anonymous Student Compliment or Complaint}, di @uref{http://www.mikesolomon.org, Mike Solomon}, che ha vinto il -@uref{http://leftcoastensemble.org, Left Coast Composition Contest del 2011}, +@uref{http://www.leftcoastensemble.org/, Left Coast Composition Contest del 2011}, a cui hanno partecipato 172 opere provenienti da 22 paesi. Altre opere comprendono Norman (age 1) per clarinetto solo, eseguita all'Electroacoustic -Music Festival (FEMF) della @uref{http://emu.music.ufl.edu/fems_concerts.html, University of Florida} +Music Festival (FEMF) della @uref{http://arts.ufl.edu/academics/music/, University of Florida} nell'Ottobre 2010. @item @@ -567,7 +699,7 @@ per celebrare il 350° compleanno del compositore. @item Esecuzione dell' @emph{Armide} di Lully da parte della -@uref{http://www.mercurybaroque.org, Mercury Baroque}, +@uref{http://www.mercuryhouston.org/, Mercury Baroque}, 15-16 Maggio 2009, a Houston, Texas (spartiti realizzati da @uref{http://nicolas.sceaux.free.fr/, Nicolas Sceaux}). @@ -582,7 +714,7 @@ New York} (spartiti realizzati da @emph{Affaire étrangère}, un opera di @uref{http://valentin.villenave.net/,Valentin Villenave} basata su un libretto francese di -@uref{http://en.wikipedia.org/wiki/Lewis_Trondheim, Lewis +@uref{https://en.wikipedia.org/wiki/Lewis_Trondheim, Lewis Trondheim}. La prima rappresentazione ha avuto luogo il 1 Febbraio 2009 presso @uref{http://www.orchestre-montpellier.com/, L'Opéra National di Montpellier}, Francia. @@ -605,13 +737,12 @@ oltre 1500 spartiti di brani di musica classica liberamente scaricabili, e principale vetrina delle partiture fatte con LilyPond. @item -@uref{http://www.adoromusicpub.com/, Adoro Music Publishing}, +@uref{https://twitter.com/adoromusic, Adoro Music Publishing}, spartiti di alta qualità di musica sacra, disponibili per il download immediato o nel tradizionale supporto cartaceo. @item -@uref{http://www.shadylane.fr/, The Shady Lane -Publishing}, +@uref{http://matthieujacquot.com/, The Shady Lane Publishing}, una @qq{piccola casa editrice musicale} il cui obiettivo è promuovere una nuova forma di economia della musica più vicina ai musicisti e agli amanti della musica. @@ -638,6 +769,11 @@ nostro @ref{Input testuale}. @unnumberedsec Recensioni @translationof Reviews +@divClass{column-center-top} +@subheading Cosa dicono di LilyPond? + +@divEnd + @divClass{column-left-top} @subheading Articoli pubblicati @@ -649,7 +785,7 @@ Aprile 2011 @uref{http://www.linux-magazine.com,Linux Magazine} pubblica un articolo intitolato -@uref{http://www.linux-magazine.com/w3/issue/126/088-090_projects.pdf, +@uref{http://www.linux-magazine.com/content/download/61706/482546/version/1/file/088-090_projects.pdf, Projects on the Move}. È un articolo introduttivo a MuseScore, LilyPond e Chordii. L'autrice Carla Schroder afferma @qq{LilyPond è un programma a linea di comando, ma non lasciatevi spaventare dalla mancanza @@ -682,7 +818,7 @@ software per gestire le loro biblioteche. @item Giugno 2009 -In un @uref{http://news.lilynet.net/Free-Music-Now, articolo} +In un @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/Free-Music-Now, articolo} pubblicato nella rivista annuale francese @emph{National Conservatory Parent Association}, Valentin Villenave, compositore francese e collaboratore di LilyPond, spiega come le licenze libere, e in particolare le partiture @@ -846,7 +982,7 @@ grande tipografia musicale].} @divClass{testimonial-item} -@subsubheading Chris Snyder, @uref{http://www.adoromusicpub.com/, Adoro Music Publishing} +@subsubheading Chris Snyder, @uref{https://twitter.com/adoromusic, Adoro Music Publishing} @qq{Il modo in cui la musica viene inserita in LilyPond mi fa pensare in modo più musicale -- a volte non sapevo come dire a @@ -954,6 +1090,7 @@ Leggi cos'è l' @ref{Input testuale}. @c TRANSLATORS, so far it's mostly from @c http://lilypond.org/web/switch/howto +@divClass{column-center-top} @subheading @qq{Compilare} Musica @imageClickable{nereid-shot-small,png, (clicca per ingrandire), nereid-shot,png, right} @@ -1036,9 +1173,9 @@ per aiutare i nuovi utenti, a cominciare dal manuale di @ref{Apprendimento}. Il di Apprendimento è il luogo migliore da cui iniziare, perché molte domande trovano risposta prima ancora di manifestarsi! -Sei pregato di leggere il Manuale di Apprendimento prima di lamentarti per ipotetici malfunzionamenti! -I nuovi utenti talvolta credono che LilyPond non stia funzionando -bene, quando in realtà sta funzionando proprio come è stato progettato. +Talvolta i nuovi utenti sono confusi, senza motivo, da alcuni aspetti del +comportamento di LilyPond. Leggi la documentazione prima di pensare che +LilyPond non stia funzionando bene. Informazioni più approfondite sono disponibili nei @ref{Manuali}. @@ -1064,6 +1201,7 @@ programmi forniscono una vera e propria interfaccia grafica che consente la manipolazione diretta di una partitura grafica. Per maggiori informazioni, si veda @ref{Editing facilitato}. +@divEnd @divClass{column-center-bottom} @subheading E ora? @@ -1078,57 +1216,9 @@ ancora convinto? Leggi a proposito dell' @ref{Editing facilitato}. @unnumberedsec Editing facilitato @translationof Easier editing -@ignore -GNU policy forbids us from linking to non-Free software, so don't -add such links. - -In particular, don't link to: -- the LilyPond bundle for TextMate (a commercial editor for MacOS). - -@end ignore - @divClass{column-center-top} -@subheading Tunefl - -@sourceimage{logo-linux,,,} -@sourceimage{logo-freebsd,,,} -@sourceimage{logo-macosx,,,} -@sourceimage{logo-windows,,,} - -@uref{http://www.tunefl.com} - -Con tunefl è possibile scrivere le partiture direttamente online, -senza bisogno di installare LilyPond sul proprio computer. Consente di -sperimentare tutte le funzionalità del programma usando una comoda -interfaccia web. - -@divEnd - - -@divClass{column-center-top} -@subheading LilyPondTool - -@imageClickable{lilypondtool-2.12-screenshot-400wide,png, - (clicca per ingrandire),lilypondtool-2.12-screenshot,png,right} - -@sourceimage{logo-linux,,,} -@sourceimage{logo-freebsd,,,} -@sourceimage{logo-macosx,,,} -@sourceimage{logo-windows,,,} - -@uref{http://lilypondtool.organum.hu} - -Nato come plugin per l'editor di testo -@uref{http://www.jedit.org,jEdit}, -LilyPondTool è uno degli strumenti con le maggiori funzioni per scrivere -partiture con LilyPond. Le sue funzionalità includono una procedura guidata alla -creazione del documento, con supporto al testo, per impostare i documenti più -facilmente, e un lettore di PDF incorporato con supporto avanzato al punta-e-clicca. - -@divEnd - -@divClass{column-center-top} -@subheading Frescobaldi +@subheading Interfacce grafiche +@subsubheading Frescobaldi @imageClickable{frescobaldi-lilypond-editor-small,png, (clicca per ingrandire),frescobaldi-lilypond-editor,png,right} @@ -1136,22 +1226,29 @@ facilmente, e un lettore di PDF incorporato con supporto avanzato al punta-e-cli @sourceimage{logo-linux,,,} @sourceimage{logo-freebsd,,,} @sourceimage{logo-windows,,,} +@sourceimage{logo-macosx,,,} @uref{http://www.frescobaldi.org} -Frescobaldi è un editor di testo e musica leggero ma potente; è progettato -specificamente per LilyPond e ha un lettore PDF incluso. È facile da usare -e funziona su tutti i principali sistemi operativi (Linux, Mac OS X e Windows). +Frescobaldi è un editor di testo e musica leggero ma potente, con tante +funzionalità e progettato specificamente per LilyPond. Le principali +funzionalità comprendono i collegamenti punta-e-clicca tra codice di +input e spartito, guide assistite dettagliate alla creazione di un nuovo +spartito, navigatore integrato della documentazione di LilyPond, evidenziazione +della sintassi e completamento automatico. Frescobaldi è scritto in Python, +usa PyQt4 per la sua interfaccia utente e funziona su tutti i principali +sistemi operativi (Linux, Mac OS X e Windows). @divEnd @divClass{column-center-top} -@subheading Denemo +@subsubheading Denemo @imageClickable{screenshot-denemo-small,png, (clicca per ingrandire),screenshot-denemo,png,right} @sourceimage{logo-linux,,,} +@sourceimage{logo-macosx,,,} @sourceimage{logo-windows,,,} @uref{http://denemo.org} @@ -1168,26 +1265,56 @@ nella visualizzazione grafica, e qualsiasi errore di sintassi nelle tue modifich manuali al codice LilyPond viene evidenziato nella visualizzazione testuale quando elaborato da lì. +@divEnd + + +@divClass{column-center-top} +@subheading Editor online su browser + +@subsubheading LilyBin +@uref{http://lilybin.com} + +Un editor LilyPond che si usa nel browser e permette di scrivere una +partitura direttamente senza dover installare LilyPond, purché si sia +connessi a Internet. + +@subsubheading Tunefl +@uref{http://www.tunefl.com} + +Con tunefl è possibile scrivere le partiture direttamente online, +senza bisogno di installare LilyPond sul proprio computer. Consente di +sperimentare tutte le funzionalità del programma usando una comoda +interfaccia web. @divEnd + @divClass{column-center-top} -@subheading Editor testuali +@subheading Plugin IDE +@subsubheading Elysium @sourceimage{logo-linux,,,} @sourceimage{logo-freebsd,,,} @sourceimage{logo-macosx,,,} @sourceimage{logo-windows,,,} -@uref{http://elysium.thsoft.hu} - Elysium è un ambiente di sviluppo integrato (IDE) per LilyPond ed è un'estensione dell'editor Eclipse. Ha una vista che affianca sorgente e spartito e permette un rapido feedback visivo e sonoro senza bisogno di cambiare i contesti. Include molti modelli con configurazione assistita. +@divEnd + + +@divClass{column-center-top} +@subheading Editor testuali +@sourceimage{logo-linux,,,} +@sourceimage{logo-freebsd,,,} +@sourceimage{logo-macosx,,,} +@sourceimage{logo-windows,,,} +@subsubheading Emacs @uref{http://www.gnu.org/software/emacs/} Emacs è un editor di testo che ha la capacità di comprendere molti @@ -1199,23 +1326,32 @@ Uno sviluppatore ha scritto @uref{https://github.com/nsceaux/lyqi,lyqi}, una modalità primaria di Emacs. +A meno che tu non sia un utente esperto di Emacs, probabilmente +dovresti usare un altro editor per scrivere file di input di +LilyPond. + +Maggori informazioni su come impostare Emacs si trovano in +@rprogram{LilyPond e gli editor di testo}. + +@subsubheading Vim @uref{http://www.vim.org} Vim è un editor di testo minimale che deriva dal vecchio editor Unix @command{vi}. Anch'esso è estendibile e configurabile. -Come regola generale, se non hai già confidenza con Emacs o -Vim, allora probabilmente vorrai usare un editor diverso per scrivere -i file di input di LilyPond. +A meno che tu non sia un utente esperto di Vim, probabilmente +dovresti usare un altro editor per scrivere file di input di +LilyPond. Puoi trovare maggiori informazioni sulla configurazione di Emacs e Vim in @rprogram{LilyPond e gli editor di testo}. @sourceimage{logo-macosx,,,} +@subsubheading TeXShop @uref{http://www.uoregon.edu/~koch/texshop} -L'editor TexShop per MacOS@tie{}X può essere potenziato per eseguire LilyPond, +L'editor TeXShop per MacOS@tie{}X può essere potenziato per eseguire LilyPond, @command{lilypond-book} e @command{convert-ly} all'interno dell'editor, usando le estensioni disponibili presso: @@ -1227,7 +1363,7 @@ usando le estensioni disponibili presso: @divEnd @divClass{column-center-top} -@subheading Programmi che possono esportare in codice LilyPond +@subheading Altri programmi che possono esportare in codice LilyPond @subsubheading Editor di partiture, intavolature e MIDI: @@ -1247,19 +1383,20 @@ esportare in formato LilyPond, ma è un software ancora in beta. Gli utenti che vogliono provarlo sono benvenuti. @item -@uref{http://enc2ly.sourceforge.net/en/,Enc2ly} è un programma GNU/Linux che -converte uno spartito @uref{http://www.gvox.com/,Encore} in uno in formato -LilyPond. +@uref{http://extensions.services.openoffice.org/en/project/OOoLilyPond,OOoLilypond}, +un'estensione di OpenOffice.org che converte i file di LilyPond in immagini +incluse nei documenti di OpenOffice.org. Sebbene non sia più sviluppato, +sembra che funzioni ancora nella versione 4. @item -@uref{https://github.com/hanwen/go-enc2ly,go-enc2ly} è uno strumento Go che -converte i file @uref{http://www.gvox.com/,Encore} in formato LilyPond. È stato -creato grazie al lavoro di ricerca e di reverse engineering di Felipe Castro, che -ha modificato file .enc esistenti e li ha caricati usando la versione demo 4.55. +@uref{http://enc2ly.sourceforge.net/en/,Enc2ly} è un programma GNU/Linux che +converte uno spartito Encore in uno in formato LilyPond. @item -@uref{http://www.musescore.org,MuseScore}, un editor di partiture, ha un'esportazione -in formato LilyPond incompleta ma è in attivo sviluppo. +@uref{https://github.com/hanwen/go-enc2ly,go-enc2ly} è uno strumento Go che +converte i file Encore in formato LilyPond. È stato creato grazie al +lavoro di ricerca e di reverse engineering di Felipe Castro, che ha +modificato file .enc esistenti e li ha caricati usando la versione demo 4.55. @item @uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd}, @@ -1281,15 +1418,6 @@ mischiare insieme opere musicali diverse in una singola partitura o parte. @uref{http://www.rosegardenmusic.com,Rosegarden}, un sequencer audio e MIDI, che ha anche un editor per le partiture con un solo rigo. -@item -@uref{https://launchpad.net/rumor/,Rumor}, un convertitore -realtime monofonico da MIDI a LilyPond. - -@item -@uref{http://www.tuxguitar.com.ar/,TuxGuitar}, un editor e riproduttore -multitraccia per tablatura, include un visualizzatore della partitura e può -esportare in formato LilyPond. - @end itemize @subsubheading Generatori di codice algoritmici: @@ -1319,27 +1447,45 @@ ambiente costruito sul linguaggio di programmazione a vincoli @divClass{column-center-top} -@subheading Altri programmi che non sono sviluppati attivamente +@subheading Altri programmi che non sono più sviluppati attivamente @itemize +@item +@uref{https://sourceforge.net/projects/lily4jedit,LilyPondTool} è stato +creato come plugin dell'editor di testo @uref{http://www.jedit.org,jEdit}. + @item @uref{http://lilykde.googlecode.com/,LilyKDE} è stato sostituito da @uref{http://www.frescobaldi.org/,Frescobaldi}; esiste soltanto come LilyKDE3 per KDE 3.5 e lilypond-KDE4 per KDE 4.1. @item -@uref{http://noteedit.berlios.de,NoteEdit}, che importava +@uref{http://lilycomp.sourceforge.net, LilyComp} è un programma grafico di +inserimento note, che si comporta in modo molto simile a un tastierino numerico +che produce note nella sintassi di LilyPond. + +@item +@uref{http://www.musescore.org,MuseScore}, un editor di partiture. +L'esportazione in formato LilyPond è stata rimossa nella versione 2.0 ma +sono ancora disponibili e scaricabili le versioni precedenti su +@uref{http://sourceforge.net/projects/mscore/files/mscore/,Sourceforge}. + +@item +@uref{https://sourceforge.net/projects/noteedit.berlios/,NoteEdit}, che importava @uref{http://www.makemusic.com/musicxml,MusicXML}, è stato "forkato" in @uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd} e @uref{http://canorus.org,Canorus}. +@item +@uref{https://launchpad.net/rumor/,Rumor}, un convertitore +realtime monofonico da MIDI a LilyPond. @item -@uref{http://lilycomp.sourceforge.net, LilyComp} è un programma grafico ad -inserimento note, che si comporta in modo molto simile a un tastierino numerico -che produce note di LilyPond. +@uref{http://www.tuxguitar.com.ar/,TuxGuitar}, un editor e riproduttore +multitraccia per tablatura, include un visualizzatore della partitura e può +esportare in formato LilyPond. @end itemize @@ -1361,7 +1507,10 @@ le @ref{Funzionalità}, gli @ref{Esempi}, o la approccio all'estetica computazionale della tipografia musicale classica viene spiegato nella nostra @ref{Storia}. +@divEnd + +@divClass{column-center-bottom} @subheading Legalese @divClass{legal} diff --git a/Documentation/it/web/manuals.itexi b/Documentation/it/web/manuals.itexi index 15761b230c..970ad597a1 100644 --- a/Documentation/it/web/manuals.itexi +++ b/Documentation/it/web/manuals.itexi @@ -1,6 +1,6 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: it -*- @ignore - Translation of GIT committish: fdb9b90f39b33d15d097f69c43c7799b1c1dce9b + Translation of GIT committish: e47e01d5b2ed58ed0843751e3ab6a2aa84888afa When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -126,11 +126,11 @@ versioni stabili precedenti e quella attuale in un archivio compresso. stato delle traduzioni per i lettori di lingua non inglese. @item -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}: +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond Snippet Repository}: esempi, consigli e trucchi creati dagli utenti. @item -@uref{http://benlemon.me/blog/music/lilypond/operation-lilypond/,Video Tutorial}: +@uref{http://bit.ly/LilyPondBeginners,Video Tutorial}: Ben Lemon, un utente di LilyPond, ha creato una serie di video tutorial sul suo blog rivolti ai nuovi utenti. @@ -329,7 +329,7 @@ intraprendere un progetto impegnativo. @subheading Frammenti Questo manuale presenta una selezione di frammenti di codice LilyPond tratti dal -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository} +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond Snippet Repository} (LSR). Tutti i frammenti di codice sono nel pubblico dominio. Si prega di notare che questo documento non è un sottoinsieme esatto del LSR. LSR @@ -609,4 +609,3 @@ per cui l'abbiamo scelta, è disponibile in @ref{Libertà}. @include fdl.itexi @divEnd - diff --git a/Documentation/ja/included/generating-output.itexi b/Documentation/ja/included/generating-output.itexi index c7534bfc10..4e256f7cbc 100644 --- a/Documentation/ja/included/generating-output.itexi +++ b/Documentation/ja/included/generating-output.itexi @@ -2,13 +2,15 @@ @c This file is part of web/download.itexi and @c learning/tutorial.itely @ignore - Translation of GIT committish: f7630a9232be374298d88e1b8bdb85ead17a7572 + Translation of GIT committish: 211937747d4adbae18d6ce41f88dffbb3ca04a5f When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore +@c Translators: Masamichi Hosoda, Yoshiki Sawada + @c This is about "compiling" a lilypond file @c (Learning 1 Tutorial), **not** compiling the @c source code. @@ -49,7 +51,7 @@ @subsubheading ステップ 3. 出力を閲覧する -コンパイルが終了すると、元のファイルと同じな前の PDF ファイルが作成され、@c +コンパイルが終了すると、元のファイルと同じ名前の PDF ファイルが作成され、@c 自動的にデフォルトの PDF ビューアで表示されます。 @sourceimage{Learning_Macos_pdf_output,,,} @@ -62,7 +64,7 @@ LilyPond 用に新しくファイルを作成するには、@w{@code{File > New} @sourceimage{Learning_Macos_New_menu,,,} -あるいは、@w{@code{File > Open} を選択し、既存のファイルを開いて編集します。 +あるいは、@w{@code{File > Open}} を選択し、既存のファイルを開いて編集します。 @sourceimage{Learning_Macos_Open_menu,,,} @@ -75,6 +77,8 @@ Mac OS に付属されているデフォルトの Preview PDF ビューアを使 その後に実行するコンパイルは更新された PDF を生成するのに失敗する可能性があります。@c その時は、元の PDF ファイルを閉じてください。 + + @end macro @@ -85,6 +89,7 @@ Mac OS に付属されているデフォルトの Preview PDF ビューアを使 ファイルのコンパイルで何か問題に遭遇した時は@c そのプログラムのドキュメントを調べてください。} + @subsubheading ステップ 1. @file{.ly} ファイルを作成する デスクトップ上の LilyPond アイコンをクリックして、見本のファイルを開きます。 @@ -93,7 +98,7 @@ Mac OS に付属されているデフォルトの Preview PDF ビューアを使 見本ファイルの上端に表示されるメニューから @w{@code{ファイル > 名前を付けて保存}} を選択します。@c -@w{@code{ファイル > 上書き保存}} を使用しないでください。@c +@w{@code{ファイル > 保存}} を使用しないでください。@c なぜならファイルに有効な LilyPond ファイル名を付けるまで、@c 上書き保存は機能しないからです。 @@ -104,32 +109,35 @@ Mac OS に付属されているデフォルトの Preview PDF ビューアを使 @sourceimage{SaveAs,,,} -@subsubheading ステップ 2a. コンパイルする (ドラッグ&ドロップを使用します) +@subsubheading ステップ 2. コンパイルする -ファイルをコンパイルするには、好みで以下のいずれかの方法をとります: +LilyPond ファイルを楽譜にするためには、コンパイルする必要があります。@c +これにはいくつかの方法があります。 +-- ドラッグ&ドロップ、右クリック、ダブルクリック、@c +コマンドライン(コマンドプロンプト)です。@c +最初の 3 種類を見てみましょう。 -ファイルを LilyPond アイコンに直接ドラッグ&ドロップします。 +1. ファイルを LilyPond アイコンに直接ドラッグ&ドロップします。 @sourceimage{DragDrop,,,} -ファイルを右クリックして、ポップアップ メニューから -@w{@code{プログラムから開く > LilyPond}} を選択します。 -Right-click on the file and from the pop-up context menu choose - -@sourceimage{GenPDF,,,} +何も起こらないように見えますが、しばらくすると、@c +デスクトップに 2 つの新しいファイル +-- @file{test.log} と @file{test.pdf} -- +が表示されるはずです。 +2. ファイルを右クリックして、ポップアップ メニューから +@w{@code{Generate PDF}} を選択します。 -@subsubheading ステップ 2b. コンパイルする (ダブルクリックする) +@sourceimage{GenPDF,,,} -あるいは、ただ単に @file{test.ly} をダブルクリックします。 +3. あるいは、ただ単に @file{test.ly} をダブルクリックします。 @subsubheading ステップ 3. 出力を閲覧する -@file{test.ly} をコンパイルしている間、コマンド ウィンドウが一瞬だけ開いて閉じます。@c -この処理の間に 3 つのファイルが作成されます。 - -PDF ファイルは @file{test.ly} ファイルの譜刻結果を保持しています。 +@file{test.pdf} は @file{test.ly} ファイルの譜刻結果を保持しています。@c +ダブルクリックすると、PDF ビュアーで開かれます。 @sourceimage{PDFRead,,,} @@ -137,10 +145,11 @@ PDF ファイルは @file{test.ly} ファイルの譜刻結果を保持してい @subsubheading その他のコマンド 新しくファイルを作成するには、以前に作成したファイルのウィンドウから -@w{@code{ファイル > 新規作成}} を選択します。 - +@w{@code{ファイル > 新規作成}} を選択します。@c あるいは @w{@code{ファイル > 開く}} を選択し、以前に保存したファイルを@c -開いて編集します。 +開いて編集します。@c +または、ファイルを右クリックして @w{@code{Edit Source}} を選択しても、@c +編集することができます。 @sourceimage{EditFile,,,} @@ -152,14 +161,12 @@ PDF ファイルが作成されない場合は、コンパイルの過程で作 このログ ファイルは、LilyPond ファイルをコンパイルする度に上書きされます。 -PS ファイルは LilyPond が PDF ファイルを作成するために内部的に使用するもので、@c -無視できます。@c -PS ファイルもコンパイルの度に上書きされます。 - -PDF ファイルを PDF ビュー他で閲覧している場合、 +PDF ファイルを PDF ビュアーで閲覧している場合、 新たにコンパイルを行う前に閉じる必要があります。@c なぜなら、閲覧されている間は新たに PDF ファイルを作成するのに失敗する可能性があるからです。 +@sourceimage{BadLog2,,,} + @end macro @@ -171,6 +178,7 @@ PDF ファイルを PDF ビュー他で閲覧している場合、 ファイルのコンパイルで何か問題に遭遇した時は@c そのプログラムのドキュメントを調べてください。} + @subsubheading ステップ 1. @file{.ly} ファイルを作成する @file{test.ly} というテキスト ファイルを作成し、以下を記述します: @@ -213,3 +221,5 @@ Success: compilation successfully completed 結果として得られる @file{test.pdf} を閲覧したり、印刷したりすることができます。 @end macro + + diff --git a/Documentation/ja/learning.tely b/Documentation/ja/learning.tely index d7782a2523..6990ac916f 100644 --- a/Documentation/ja/learning.tely +++ b/Documentation/ja/learning.tely @@ -1,6 +1,6 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; -*- @ignore - Translation of GIT committish: dadabdfc4537ef85adb9159d46eda5a0ff180835 + Translation of GIT committish: 76ee88f5adfc7bcd8eff487543e3605e43a93d80 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -18,9 +18,14 @@ @end macro -@c `Learning Manual' was born 1999-10-10 with git commit b9abaac... +@c `Learning Manual' was born 1998-08-14 with this commit: +@c release: 1.0.2 +@c author: Han-Wen Nienhuys +@c commit: a3a44f9f3c581b6824b3a65f9039656693e09bbf +@c file: Documentation/tex/tutorial.yo + @macro copyrightDeclare -Copyright @copyright{} 1999--2012 by the authors. +Copyright @copyright{} 1998--2015 by the authors. @end macro @set FDL @@ -37,7 +42,7 @@ Copyright @copyright{} 1999--2012 by the authors. @end ignore -@c Translators: Yoshiki Sawada +@c Translators: Masamichi Hosoda, Yoshiki Sawada @c Translation status: post-GDP diff --git a/Documentation/ja/learning/common-notation.itely b/Documentation/ja/learning/common-notation.itely index 989f0443cd..6dca8c5856 100644 --- a/Documentation/ja/learning/common-notation.itely +++ b/Documentation/ja/learning/common-notation.itely @@ -1,23 +1,19 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*- @ignore - Translation of GIT committish: c1b0482f63f881bd3f67845e5f76a3e04675ef2a + Translation of GIT committish: 76ee88f5adfc7bcd8eff487543e3605e43a93d80 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.28" +@c \version "2.19.21" @ignore Tutorial guidelines: (different from policy.txt!) -- unless you have a really good reason, use either +- unless you have a really good reason, use @lilypond[verbatim,quote] - or - @lilypond[verbatim,quote,relative=2] - - Don't use any other relative=X commands. - use "aes" and "ees" instead of "as" and "es". I know it's not correct Dutch naming, but let's not confuse people with this @@ -29,7 +25,7 @@ Tutorial guidelines: (different from policy.txt!) @end ignore -@c Translators: Yoshiki Sawada +@c Translators: Masamichi Hosoda, Yoshiki Sawada @c Translation status: post-GDP @@ -37,10 +33,8 @@ Tutorial guidelines: (different from policy.txt!) @chapter 一般的な記譜法 @translationof Common notation -このチュートリアルではまず LilyPond 音楽言語についての紹介を行い、@c -楽譜を作り出す方法について説明します。@c -LilyPond との最初の接触の後、我々は一般的な音楽記譜法を持つ楽譜を@c -作成する方法について説明します。 +この章では、@ref{チュートリアル}内の下記素材で、@c +一般的な音楽記譜法による美しい楽譜を作成する方法を説明します。 @menu * 単一譜表表記:: @@ -58,8 +52,8 @@ LilyPond との最初の接触の後、我々は一般的な音楽記譜法を 一般的な記譜法を紹介します。 @menu -* 小節チェック:: -* 臨時記号と調号:: +* 小節線と小節チェック:: +* ピッチと調号:: * タイとスラー:: * アーティキュレーションと強弱記号:: * テキストを追加する:: @@ -68,10 +62,34 @@ LilyPond との最初の接触の後、我々は一般的な音楽記譜法を @end menu +@node 小節線と小節チェック +@subsection 小節線と小節チェック +@translationof Bar lines and bar checks + +@menu +* 小節線:: +* 小節チェック:: +@end menu + +@node 小節線 +@unnumberedsubsubsec 小節線 +@translationof Bar lines + + +単線の小節線は自動的に挿入されるので、手動で追加する必要はありません。@c +他の種類の小節線は @code{\bar "||"} で複縦線、@code{\bar "|."} で終止線、@c +のように @code{\bar} を使って追加します。 +小節線のすべてのリストは @ruser{小節線} を見てください。 + +@lilypond[verbatim,quote] +\relative { g'1 e1 \bar "||" c2. c'4 \bar "|." } +@end lilypond + @node 小節チェック -@subsection 小節チェック +@unnumberedsubsubsec 小節チェック @translationof Bar checks + 必須ではありませんが、入力コードの中で @emph{小節チェック} を挿入して@c どこに小節線を置こうとしているのかを示すべきです。@c 小節チェックは挿入するには @code{|} を入力します。@c @@ -80,27 +98,50 @@ LilyPond との最初の接触の後、我々は一般的な音楽記譜法を さらに、小節チェックは要素を整理する助けとなるため、 入力コードが読みやすくなります。 -@lilypond[verbatim,quote,relative=2] -g1 | e1 | c2. c'4 | g4 c g e | c4 r r2 | +@c This example deliberately produces a warning +@lilypond[verbatim,quote] +\relative { + g'1 | e1 | c2. c' | g4 c g e | c4 r r2 | +} @end lilypond +上の例のコードをコンパイルすると、コンソールに以下の警告が出力されます。 + +@example +warning: barcheck failed at: 1/2 + g'1 | e1 | c2. c' + | g4 c g e | c4 r r2 | +@end example + +この単純な例では長さの間違いは明確ですが、@c +コンソール出力の警告は 3 小節目に @code{4} が欠けていることが@c +効果的にわかります。 + @seealso 記譜法リファレンス: @ruser{小節と小節番号のチェック} -@node 臨時記号と調号 -@subsection 臨時記号と調号 -@translationof Accidentals and key signatures +@node ピッチと調号 +@subsection ピッチと調号 +@translationof Pitches and key signatures -@warning{新しいユーザ、特に音楽理論に馴染みのないユーザは@c -しばしばこれらのことで混乱します --- このページの最後にある警告を呼んでください!} +@menu +* ピッチ変更:: +* 調号:: +* 警告 調号とピッチ:: +@end menu + +@warning{新しいユーザはしばしば LilyPond の調号の使い方を誤解します。 +-- このページの最後にある警告を読んでください。} + +@node ピッチ変更 +@unnumberedsubsubsec ピッチ変更 +@translationof Pitch alterations -@subheading 臨時記号 @cindex accidentals (臨時記号) -@cindex accidentals and key signatures (臨時記号と調号) +@cindex natural (ナチュラル) @cindex sharp (シャープ) @cindex double sharp (ダブル シャープ) @cindex sharp, double (ダブル シャープ) @@ -118,6 +159,9 @@ g1 | e1 | c2. c'4 | g4 c g e | c4 r r2 | @c シャープ (sharp), フラット (flat), ダブル シャープ (double sharp), @c ダブル フラット (double flat), 臨時記号 (accidental) +LilyPond の音符名はピッチを示しています。 +例えば、@code{c} は調号に関係なく常に C-ナチュラル を意味します。 + @notation{シャープ} は音符名に @code{is} を付け加えることによって作られ、@c @notation{フラット} は @code{es} を付け加えることによって作られます。@c 予想しているかもしれませんが、@notation{ダブル シャープ} や@c @@ -125,17 +169,19 @@ g1 | e1 | c2. c'4 | g4 c g e | c4 r r2 | 付け加えることによって作られます。@c この構文はドイツ語やオランダ語のような北欧とドイツの言語@c での命名規則から生まれました。 -@notation{臨時記号} に対して他の名前を使うには、@c +@notation{変更} に対して他の名前を使うには、@c @ruser{他の言語での音符名} を参照してください。 -@lilypond[verbatim,quote,relative=2] -cis1 ees fisis, aeses +@lilypond[verbatim,quote] +\relative { cis''4 ees fisis, aeses } @end lilypond - @cindex key signature, setting -@subheading 調号 -@c 調号 + +@node 調号 +@unnumberedsubsubsec 調号 +@translationof Key signatures + @cindex key signature (調号) @cindex major (メジャー) @@ -145,56 +191,51 @@ cis1 ees fisis, aeses @cindex layout vs. content (レイアウト vs. 内容) @funindex \key -@funindex key @funindex \major -@funindex major @funindex \minor -@funindex minor 音楽用語集: @rglos{key signature}, @rglos{major}, @rglos{minor} @notation{調号} はコマンド @code{\key} とそれに続くピッチと @code{\major} または @code{\minor} によってセットされます。 -@lilypond[verbatim,quote,relative=2] -\key d \major -a1 -\key c \minor -a +@lilypond[verbatim,quote] +\relative { + \key d \major + d'4 fis a c | + \bar "||" \key c \minor + c,4 ees g b | +} @end lilypond @smallspace +@node 警告 調号とピッチ +@unnumberedsubsubsec 警告: 調号とピッチ +@translationof Warning key signatures and pitches -@subheading 警告: 調号とピッチ 音楽用語集: @rglos{accidental}, @rglos{key signature}, @rglos{pitch}, @rglos{flat}, @rglos{natural}, @rglos{sharp}, -@rglos{transposition} - -@notation{臨時記号} を譜刻するかどうかを決定するために LilyPond はピッチと -@notation{調号} を検証します。@c -調号は @emph{譜刻される} 臨時記号にだけ影響を与え、@c -音符の @notation{ピッチ} には影響を与えません!@c -この特徴はしばしば新しく LilyPond を始める人を混乱させるため、@c -より詳細に説明します。 - -LilyPond は音楽の内容とレイアウトを峻別します。@c -音符の変更記号 (@notation{フラット}、@notation{ナチュラル}、@c -@notation{シャープ}) はピッチの一部であるため、音楽の内容です。@c -臨時記号 (@emph{譜刻される}フラット、ナチュラル、シャープ記号) が@c -対応する音符の前に譜刻されるかどうかはレイアウトの問題です。@c -レイアウトは規則に従う何らかのものであるため、@c -臨時記号はそれらの規則に対応して自動的に譜刻されます。@c -あなたの音楽の中でのピッチは人工的な仕掛けであるため、@c -それらは自動的には追加されず、あなたはあなたの聞きたいピッチを@c -入力しなければなりません。 +@rglos{transposition}, @rglos{Pitch names}. + +LilyPond は音楽の内容と印刷表現を区別します。@c +@code{d4 e fis2} のような入力は、音楽の内容としてピッチと長さを定義します。@c +@notation{調号} は印刷表現の一部です。@c +また、調号は音符の印刷表現のルールを設定します。@c +LilyPond は @notation{臨時記号} を譜刻するかどうかを決定するためにピッチと@c +@notation{調号} を比較します。@c + +コマンド @code{\key} は印刷表現に作用する @notation{調号} を設定しますが、 +@code{c} のような入力中の音符に割り当てられたピッチは変更 @emph{しません}。 以下の例では: -@lilypond[verbatim,quote,relative=2] -\key d \major -cis4 d e fis +@lilypond[verbatim,quote] +\relative { + \key d \major + cis''4 d e fis +} @end lilypond @noindent @@ -207,25 +248,27 @@ cis4 d e fis そうではなく、@qq{ピッチが B ナチュラルである音符がある} という意味です。@c A フラット メジャーの調では、@code{b} には臨時記号が付きます: -@lilypond[verbatim,quote,relative=2] -\key aes \major -aes4 c b c +@lilypond[verbatim,quote] +\relative { + \key aes \major + aes'4 c b c +} @end lilypond -混乱してしまいましたか?@c -以下のように考えてみてください: あなたがピアノを弾いているとします。@c 黒鍵を押したいのであれば、音符名に @w{@code{-is}} や @w{@code{-es}} -を付ける必要があるのです! +を付ける必要があります。 すべての変化を明示的に付け加えることは入力時にちょっとした努力を@c 要するかもしれません。@c -しかしながら、移調がより容易になる、異なる規約に対応して臨時記号を@c +しかしながら、@notation{移調}がより容易になる、@c +異なる規約に対応して臨時記号を@c 譜刻できるという利点があります。@c 臨時記号がどのように異なる規則に対応して譜刻されるのかについての@c いくつかの例は、@ruser{自動臨時記号} を参照してください。 @c 臨時記号の自動譜刻 + @seealso 記譜法リファレンス: @ruser{他の言語での音符名}, @ruser{臨時記号}, @@ -246,50 +289,78 @@ aes4 c b c @funindex ( ... ) @funindex \( ... \) +@menu +* タイ:: +* スラー:: +* フレージング スラー:: +* 警告 スラー vs. タイ:: +@end menu -@subheading タイ - +@node タイ +@unnumberedsubsubsec タイ +@translationof Ties 音楽用語集: @rglos{tie} -@notation{タイ}はタイが始まる最初の音符にチルド @code{~} を@c +@notation{タイ}はタイでつながる2つの音符の最初の音符にチルダ @code{~} を@c 付加することによって作成されます。 -@lilypond[verbatim,quote,relative=2] -g4~ g c2~ | c4~ c8 a~ a2 | +@lilypond[verbatim,quote] +\relative { g'4~ g c2~ | c4~ c8 a~ a2 | } +@end lilypond + +@cindex bare duration +@cindex duration, bare + +タイでつながれた音符のように、ピッチが変わらない場合、@c +後のピッチを省略し、長さだけを指定できます。 + +@lilypond[verbatim,quote] +\relative { g'4~ 4 c2~ | 4~ 8 a~ 2 | } @end lilypond +この省略形はピッチが変わらずにリズムが変わる場所で有用ですが、@c +長さを指定しないピッチにはスペースが続くということと、@c +長さだけを指定した場合でも1つの音符として解釈されるということを@c +覚えてください。 + +@node スラー +@unnumberedsubsubsec スラー +@translationof Slurs -@subheading スラー 音楽用語集: @rglos{slur} @notation{スラー}は多くの音符に亘って描かれる曲線です。@c スラーの開始音符と終了音符にはそれぞれ @code{(} と @code{)} を付加します。 -@lilypond[verbatim,quote,relative=2] -d4( c16) cis( d e c cis d) e( d4) +@lilypond[verbatim,quote] +\relative { d''4( c16) cis( d e c cis d) e( d4) } @end lilypond +@node フレージング スラー +@unnumberedsubsubsec フレージング スラー +@translationof Phrasing slurs -@subheading フレージング スラー 音楽用語集: @rglos{slur}, @rglos{phrasing} 長い @notation{フレーズ} を示すためのスラーは @code{\(} と @code{\)} によって挿入することができます。@c -あなたは@notation{スラー}とフレージング スラーを重ねることができます。@c -しかしながら、あなたは複数のスラーを重ねたり、複数のフレージング スラーを@c -重ねることはできません。 +あなたは@notation{スラー}とフレージング スラーを同時に使うことができます。 -@lilypond[verbatim,quote,relative=2] -g4\( g8( a) b( c) b4\) +@lilypond[verbatim,quote] +\relative { g'4\( g8( a) b( c) b4\) } @end lilypond @smallspace @cindex slurs versus ties (スラー vs. タイ) -@subheading 警告: スラー vs. タイ + +@node 警告 スラー vs. タイ +@unnumberedsubsubsec 警告: スラー vs. タイ +@translationof Warnings slurs vs. ties + 音楽用語集: @rglos{articulation}, @rglos{slur}, @rglos{tie} @@ -300,10 +371,11 @@ g4\( g8( a) b( c) b4\) 表していて、より大きな音符のグループに対して使用することができます。@c スラーとタイはネストさせることができます。 -@lilypond[verbatim,quote,relative=2] -c4~( c8 d~ d4 e) +@lilypond[verbatim,quote] +\relative { c''4(~ c8 d~ 4 e) } @end lilypond + @seealso 記譜法リファレンス: @ruser{タイ}, @@ -315,8 +387,16 @@ c4~( c8 d~ d4 e) @subsection アーティキュレーションと強弱記号 @translationof Articulation and dynamics +@menu +* アーティキュレーション:: +* 運指法記号:: +* 強弱記号:: +@end menu + +@node アーティキュレーション +@unnumberedsubsubsec アーティキュレーション +@translationof Articulations -@subheading アーティキュレーション @cindex articulation (アーティキュレーション) @cindex accent (アクセント) @@ -327,13 +407,17 @@ c4~( c8 d~ d4 e) 一般的な @notation{アーティキュレーション} はダッシュ @code{-} と単一文字を@c 使うことで音符に付け加えることができます: -@lilypond[verbatim,quote,relative=2] -c4-^ c-+ c-- c-! -c4-> c-. c2-_ +@lilypond[verbatim,quote] +\relative { + c''4-^ c-+ c-- c-! + c4-> c-. c2-_ +} @end lilypond +@node 運指法記号 +@unnumberedsubsubsec 運指法記号 +@translationof Fingerings -@subheading 運指法記号 @cindex fingering (運指法記号) @@ -345,8 +429,8 @@ c4-> c-. c2-_ 同様に、@notation{運指法} はダッシュ (@code{-}) と譜刻する数字を使うことで@c 音符に付け加えることができます: -@lilypond[verbatim,quote,relative=2] -c-3 e-5 b-2 a-1 +@lilypond[verbatim,quote] +\relative { c''4-3 e-5 b-2 a-1 } @end lilypond 通常、アーティキュレーションと運指法は自動的に譜刻されます。@c @@ -357,12 +441,14 @@ c-3 e-5 b-2 a-1 しかしながらたいていの場合は、LilyPond にアーティキュレーションの方向を@c 決定させるのが一番です。 -@lilypond[verbatim,quote,relative=2] -c4_-^1 d^. f^4_2-> e^-_+ +@lilypond[verbatim,quote] +\relative { c''4_-^1 d^. f^4_2-> e^-_+ } @end lilypond +@node 強弱記号 +@unnumberedsubsubsec 強弱記号 +@translationof Dynamics -@subheading 強弱記号 @cindex dynamics (強弱記号) @cindex decrescendo (デクレッシェンド) @@ -375,11 +461,8 @@ c4_-^1 d^. f^4_2-> e^-_+ @funindex \mf @funindex \pp @funindex \< -@funindex < @funindex \> -@funindex > @funindex \! -@funindex ! 音楽用語集: @rglos{dynamics}, @rglos{crescendo} @rglos{decrescendo} @@ -392,8 +475,8 @@ c4_-^1 d^. f^4_2-> e^-_+ @end ignore 付きのマークを付け加えることによって作成されます: -@lilypond[verbatim,quote,relative=2] -c4\ff c\mf c\p c\pp +@lilypond[verbatim,quote] +\relative { c''4\ff c\mf c\p c\pp } @end lilypond @notation{クレッシェンド} と @notation{デクレッシェンド} はコマンド @code{\<} と @@ -401,8 +484,8 @@ c4\ff c\mf c\p c\pp 次の強弱記号 -- 例えば、@code{\f} -- が (デ)クレッシェンドを終わらせます。@c コマンド @code{\!} を使って終わらせることもできます: -@lilypond[verbatim,quote,relative=2] -c4\< c\ff\> c c\! +@lilypond[verbatim,quote] +\relative { c''4\< c\ff\> c c\! } @end lilypond @@ -422,19 +505,18 @@ c4\< c\ff\> c c\! @cindex markup (マークアップ) @funindex \markup -@funindex markup テキストをあなたの楽譜に追加することができます: -@lilypond[verbatim,quote,relative=2] -c2^"espr" a_"legato" +@lilypond[verbatim,quote,fragment] +c''2^"espr" a'_"legato" @end lilypond 追加のフォーマット指定を @code{\markup} コマンドで追加することができます: -@lilypond[verbatim,quote,relative=2] -c2^\markup { \bold espr } -a2_\markup { +@lilypond[verbatim,quote,fragment] +c''2^\markup { \bold espr } +a'2_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } @end lilypond @@ -460,35 +542,35 @@ a2_\markup { @funindex [ @funindex ] @funindex \autoBeamOff -@funindex autoBeamOff @funindex \autoBeamOn -@funindex autoBeamOn 音楽用語集: @rglos{beam} すべての @notation{連桁} は自動的に描かれます: -@lilypond[verbatim,quote,relative=2] -a8 ais d ees r d c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8 ais d ees r d c16 b a8 } @end lilypond あなたが自動連桁を好まない場合、手動で上書きすることもできます。@c ある箇所の連桁を修正するには、連桁を付ける最初の音符に @code{[} を、@c 最後の音符に @code{]} を付け加えます。 -@lilypond[verbatim,quote,relative=2] -a8[ ais] d[ ees r d] c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8[ ais] d[ ees r d] c16 b a8 } @end lilypond もしあなたが楽譜全体あるいは一部で自動連桁を Off にしたいのなら、@c 自動連桁を Off にするにはコマンド @code{\autoBeamOff} を、@c 再度自動連桁を On にするには @code{\autoBeamOn} を使用します。 -@lilypond[verbatim,quote,relative=2] -\autoBeamOff -a8 c b4 d8. c16 b4 | -\autoBeamOn -a8 c b4 d8. c16 b4 | +@lilypond[verbatim,quote] +\relative { + \autoBeamOff + a'8 c b4 d8. c16 b4 | + \autoBeamOn + a8 c b4 d8. c16 b4 | +} @end lilypond @@ -502,14 +584,22 @@ a8 c b4 d8. c16 b4 | @subsection 高度なリズム コマンド @translationof Advanced rhythmic commands -@subheading 部分小節 +@menu +* 部分小節:: +* 連符:: +* 装飾小音符:: +@end menu + +@node 部分小節 +@unnumberedsubsubsec 部分小節 +@translationof Partial measure + @cindex pickup (ピックアップ) @cindex anacrusis (弱拍) @cindex partial measure (部分小節) @funindex \partial -@funindex partial 音楽用語集: @rglos{anacrusis} @@ -519,19 +609,23 @@ a8 c b4 d8. c16 b4 | @code{\partial 4} は 4 分音符のピックアップであり、@c @code{\partial 8} は 8 分音符のピックアップです。 -@lilypond[verbatim,quote,relative=2] -\partial 8 f8 | -c2 d | +@lilypond[verbatim,quote] +\relative { + \partial 8 f''8 | + c2 d | +} @end lilypond -@subheading 連符 +@node 連符 +@unnumberedsubsubsec 連符 +@translationof Tuplets + @cindex tuplets (連符) @cindex triplets (3 連符) @funindex \tuplet -@funindex tuplet 音楽用語集: @rglos{note value}, @rglos{triplet} @@ -541,24 +635,26 @@ c2 d | 3 連符は 2 つの音符の代わりに 3 つの音符を演奏しますので、@notation{連符} の分数は 3/2 となります。 -@lilypond[verbatim,quote,relative=2] -\tuplet 3/2 { f8 g a } -\tuplet 3/2 { c8 r c } -\tuplet 3/2 { f,8 g16[ a g a] } -\tuplet 3/2 { d4 a8 } +@lilypond[verbatim,quote] +\relative { + \tuplet 3/2 { f''8 g a } + \tuplet 3/2 { c8 r c } + \tuplet 3/2 { f,8 g16[ a g a] } + \tuplet 3/2 { d4 a8 } +} @end lilypond +@node 装飾小音符 +@unnumberedsubsubsec 装飾小音符 +@translationof Grace notes -@subheading 装飾小音符 @cindex grace notes (装飾小音符) @cindex acciaccatura (短前打音) @cindex appoggiatura (前打音) @funindex \grace -@funindex grace @funindex \acciaccatura -@funindex acciaccatura @funindex \appoggiatura @funindex acciaccatura @@ -569,10 +665,12 @@ c2 d | キーワード @code{\appoggiatura} や @code{\acciaccatura} による接頭音楽表記に@c よっても作成されます: -@lilypond[verbatim,quote,relative=2] -c2 \grace { a32 b } c2 | -c2 \appoggiatura b16 c2 | -c2 \acciaccatura b16 c2 | +@lilypond[verbatim,quote] +\relative { + c''2 \grace { a32 b } c2 | + c2 \appoggiatura b16 c2 | + c2 \acciaccatura b16 c2 | +} @end lilypond @@ -612,18 +710,24 @@ LilyPond の中での多声は同じ譜表上にある複数の声部を参照 @cindex compound music expression (複合音楽表記) @cindex music expression, compound (複合音楽表記) +@menu +* 数学的表記との類似:: +* 同時進行する音楽表記 複数の譜:: +* 同時進行する音楽表記 単一の譜表:: +@end menu + LilyPond 入力ファイルの中では、音楽は @notation{音楽表記} によって表されます。@c 単一の音符は 1 つの音楽表記になります: -@lilypond[verbatim,quote,relative=2] -a4 +@lilypond[verbatim,quote,fragment] +a'4 @end lilypond 表記を波括弧で括ることによって @emph{複合音楽表記} が作成されます。@c 2 つの音符を持つ複合音楽表記を作成しました: -@lilypond[verbatim,quote,relative=2] -{ a4 g4 } +@lilypond[verbatim,quote] +\relative { a'4 g4 } @end lilypond 波括弧の中にある音楽表記 (例えば、いくつかの音符) のグループはそれらが@c @@ -631,13 +735,14 @@ a4 (つまり、それぞれの音符は前の音符に続くということです)。@c もう 1 つ音楽表記の結果を示します: -@lilypond[verbatim,quote,relative=2] -{ { a4 g } f4 g } +@lilypond[verbatim,quote] +\relative { { a'4 g } f4 g } @end lilypond +@node 数学的表記との類似 +@unnumberedsubsubsec 数学的表記との類似 +@translationof Analogy: mathematical expressions -@subheading 数学的表記との類似 -@c Analogy: mathematical expressions このメカニズムは数学式と似ています: 大きな式は小さな式を組み合わせることによって作成されます。@c @@ -662,9 +767,10 @@ a4 数学式と同様に、音楽表記も任意の深さにネストさせることができ、@c それは多声楽譜のような複雑な音楽のために必要なことです。 +@node 同時進行する音楽表記 複数の譜 +@unnumberedsubsubsec 同時進行する音楽表記: 複数の譜 +@translationof Simultaneous music expressions multiple staves -@subheading 同時進行の音楽表記: 複数の譜 -@c Simultaneous music expressions: multiple staves @cindex multiple staves (複数の譜) @cindex staves, multiple (複数の譜) @@ -694,13 +800,11 @@ a4 保持しています) が同時進行するように組み合わされています: @lilypond[verbatim,quote] -\relative c'' { - << - { a2 g } - { f2 e } - { d2 b } - >> -} +<< + \relative { a'2 g } + \relative { f'2 e } + \relative { d'2 b } +>> @end lilypond 入力の各レベルに対して異なる量のスペースをインデントとして与えていることに@c @@ -710,26 +814,29 @@ LilyPond は行の先頭にどれくらい多く (あるいは少なく) のス しかしながら、上の例のように LilyPond コードにインデントを入れることによって@c 人間にとってはずっと読みやすくなります。 +@ignore @warning{入力での各音符は前の音符との相対関係にあり、先頭の @code{@bs{}relative} コマンドの中にある @code{c''} と相対関係にあるわけではありません。} +@end ignore +@node 同時進行する音楽表記 単一の譜表 +@unnumberedsubsubsec 同時進行する音楽表記: 単一の譜表 +@translationof Simultaneous music expressions single staff -@subheading 同時進行する音楽表記: 単一の譜表 -@c Simultaneous music expressions: single staff 楽曲の中にある譜の数を決定するために、@c -LilPond は最初の音楽表記の始まりを調べます。@c -始まりの音楽表記が単一の表記であった場合、楽譜の中の譜表は 1 つです。@c -以下の例は複雑な表記を持ちますが、単一の表記で始まっているため譜表も 1 つです。 +LilyPond は最初の音楽表記の始まりを調べます。@c +それが単一の音符であった場合は譜表が 1 つ、@c +同時進行する表記であった場合は譜表が複数になります。@c +以下の例は複雑な表記を持ちますが、単一の音符で始まっているため譜表も 1 つです。 @lilypond[verbatim,quote] -\relative c'' { - c2 <> | +\relative { + c''2 <> | << { e2 f } { c2 <> } >> | } @end lilypond - @node 複数の譜 @subsection 複数の譜 @translationof Multiple staves @@ -741,10 +848,8 @@ LilPond は最初の音楽表記の始まりを調べます。@c @cindex notation context (記譜コンテキスト) @funindex \new Staff -@funindex new Staff @funindex Staff @funindex \new -@funindex new @funindex Score @funindex Voice @funindex Lyrics @@ -761,12 +866,10 @@ LilyPond 入力ファイルは音楽表記によって構築されています これらの @code{Staff} 要素は @code{<<} と @code{>>} で並列に組み合わされます: @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond コマンド @code{\new} は 1 つの @q{記譜コンテキスト} を導入します。@c @@ -792,12 +895,10 @@ LilyPond 入力ファイルは音楽表記によって構築されています 複合リズム (polyrhythmic) の楽譜よりも一般的だからです。 @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" \key d \major \time 3/4 c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" \key d \major \time 3/4 c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond @node 譜表グループ @@ -836,12 +937,10 @@ LilyPond 入力ファイルは音楽表記によって構築されています 小さな例を挙げます: @lilypond[verbatim,quote] -\relative c'' { - \new PianoStaff << - \new Staff { \time 2/4 c4 e | g g, | } - \new Staff { \clef "bass" c,,4 c' | e c | } - >> -} +\new PianoStaff << + \new Staff \relative { \time 2/4 c''4 e | g g, | } + \new Staff \relative { \clef "bass" c4 c' | e c | } +>> @end lilypond ピアノ譜以外の譜表グループ化はオーケストラ譜向けには @code{\new GrandStaff} @@ -862,6 +961,8 @@ LilyPond 入力ファイルは音楽表記によって構築されています @subsection 音符を組み合わせて和音にする @translationof Combining notes into chords +Music Glossary: @rglos{chord} + @cindex chords (和音) @cindex note durations in chords (和音の中での音符の演奏時間) @@ -878,8 +979,8 @@ LilyPond 入力ファイルは音楽表記によって構築されています その演奏時間は山括弧を閉じた後に置かれなければならないということに@c 注意してください。 -@lilypond[verbatim,quote,relative=2] -r4 2 +@lilypond[verbatim,quote] +\relative { r4 2 } @end lilypond 和音は単一の音符とほとんど同じであると考えてください: @@ -888,11 +989,13 @@ r4 2 例えば、あなたは連桁やタイなどのマークをコードに組み合わせることができます。@c それらは山括弧の外側に置かれなければなりません。 -@lilypond[verbatim,quote,relative=2] -r4 ~ 2 | -8[ ] - 8\>[ ]\! | -r4 8.\p 16( 4-. ) | +@lilypond[verbatim,quote] +\relative { + r4 ~ 2 | + 8[ ] + 8\>[ ]\! | + r4 8.\p 16( 4-. ) | +} @end lilypond @seealso @@ -928,60 +1031,6 @@ LilyPond での多声音楽はまだ説明していないコンセプトを用 記譜法リファレンス: @ruser{同時進行する音符} -@ignore -異なる旋律が単一の譜に組み込まれる場合、それらは多声部として譜刻されます。@c -各声部はそれ自体の符幹 (符頭から上下に出る棒)、スラー、@c -連桁 (符幹と符幹を結ぶ横棒) を持ちます。@c -最上段の声部は符頭から上に伸びる符幹を持ち、@c -最下段の声部は下に伸びる符幹を持ちます。 - -そのような多声のパートを入力するには、各声部をシークエンスとして -(@w{@code{@{ ... @}}} を使って) 入力し、それらを @code{\\} で区切って@c -結合することで同時進行するように組み合わせます: - -@lilypond[verbatim,quote,relative=2] -<< - { a4 g2 f4~ f4 } \\ - { r4 g4 f2 f4 } ->> -@end lilypond - -多声部音楽を譜刻する場合、空白休符を使用すると都合が良いかもしれません: -それは譜刻されない休符です。@c -空白休符は一時的に演奏されない声部の空白期間を埋めるのに有用です。@c -今度は通常の休符 (@code{r}) の代わりに空白休符 (@code{s}) を使った@c -上と同じ例を示します: - -@lilypond[verbatim,quote,relative=2] -<< - { a4 g2 f4~ f4 } \\ - { s4 g4 f2 f4 } ->> -@end lilypond - -@noindent -さらに、これらの表記は任意にネストさせることができます。 - -@lilypond[verbatim,quote,relative=2] -<< - \new Staff << - { a4 g2 f4~ f4 } \\ - { s4 g4 f2 f4 } - >> - \new Staff << - \clef bass - { 1 ~ 4 } \\ - { e,,4 d e2 ~ e4} - >> ->> -@end lilypond - -@seealso -記譜法リファレンス: -@ruser{同時進行する音符} -@end ignore - - @node 歌曲 @section 歌曲 @translationof Songs @@ -1003,18 +1052,16 @@ LilyPond での多声音楽はまだ説明していないコンセプトを用 @cindex songs (歌) @funindex \addlyrics -@funindex addlyrics 音楽用語集: @rglos{lyrics} -童謡の冒頭部分の旋律があります。@c -歌詞は @notation{Girls and boys come out to play} です: +童謡 @notation{Girls and boys come out to play} の冒頭部分の旋律です: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } @end lilypond @@ -1024,18 +1071,18 @@ LilyPond での多声音楽はまだ説明していないコンセプトを用 @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } \addlyrics { - Girls and boys come | out to play, + Girls and boys come out to play, } >> @end lilypond -二重の山括弧 @w{@code{<< ... >>}} が楽曲全体を囲っていて、@c +二重の山括弧 @w{@code{<<@dots{}>>}} が楽曲全体を囲っていて、@c 音楽と歌詞が同時進行することを示しています。 @@ -1059,32 +1106,20 @@ LilyPond での多声音楽はまだ説明していないコンセプトを用 @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c b a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond -上の例のコードをコンパイルすると、コンソール出力にいくつかの警告が表示されます: - -@example -song.ly:12:29: warning: barcheck failed at: 5/8 - The | moon doth shine as - | bright as day; | -song.ly:12:46: warning: barcheck failed at: 3/8 - The | moon doth shine as | bright as day; - | -@end example - -これは小節チェックの有用性を示す良い例です。@c -今度は楽譜を見てください。@c +楽譜を見ると、@c 追加した歌詞は適切に音符に揃えられてはいません。@c 単語 @notation{shine} は 1 つの音符ではなく 2 つの音符に割り当てられるべきです。@c @@ -1096,15 +1131,15 @@ song.ly:12:46: warning: barcheck failed at: 3/8 @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c( b) a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond @@ -1118,15 +1153,15 @@ song.ly:12:46: warning: barcheck failed at: 3/8 @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c([ b]) a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond @@ -1137,15 +1172,15 @@ song.ly:12:46: warning: barcheck failed at: 3/8 @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c[ b] a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine _ as | bright as day; | + Girls and boys come out to play, + The moon doth shine _ as bright as day; } >> @end lilypond @@ -1160,15 +1195,15 @@ song.ly:12:46: warning: barcheck failed at: 3/8 @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \minor \time 3/2 - g2 a bes | bes2( a) b2 | + g'2 a bes | bes2( a) b2 | c4.( bes8 a4. g8 fis4.) g8 | fis1 } \addlyrics { - When I am | laid, - am | laid __ in | earth, + When I am laid, + am laid __ in earth, } >> @end lilypond @@ -1185,16 +1220,16 @@ song.ly:12:46: warning: barcheck failed at: 3/8 @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \key g \major \time 3/4 \partial 4 - d4 | g4 g a8( b) | g4 g b8( c) | + d'4 | g4 g a8( b) | g4 g b8( c) | d4 d e | c2 } \addlyrics { - A -- | way in a __ | man -- ger, - no __ | crib for a | bed, __ + A -- way in a __ man -- ger, + no __ crib for a bed, } >> @end lilypond @@ -1211,14 +1246,14 @@ song.ly:12:46: warning: barcheck failed at: 3/8 @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \clef "bass" \key c \major \time 6/8 - c4.~ c8 d b | c8([ d]) b c d b | c8 + c'4.~ 8 d b | c8([ d]) b c d b | c8 } \addlyrics { - Lar -- go_al fac -- | to -- tum del -- la cit -- | tà + Lar -- go_al fac -- to -- tum del -- la cit -- tà } >> @end lilypond @@ -1242,23 +1277,23 @@ song.ly:12:46: warning: barcheck failed at: 3/8 @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key f \major \time 6/8 \partial 8 - c8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ c4 + c''8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ 4 } \addlyrics { - Let | flee -- cy flocks the | hills a -- | dorn, __ + Let flee -- cy flocks the hills a -- dorn, __ } - \relative c' { + \relative { \key f \major \time 6/8 \partial 8 - r8 | r4. r4 c8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 + r8 | r4. r4 c'8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 } \addlyrics { - Let | flee -- cy flocks the | hills a -- dorn, + Let flee -- cy flocks the hills a -- dorn, } >> @end lilypond @@ -1323,13 +1358,13 @@ namedMusic = @{ @dots{} @} @lilypond[verbatim,quote] violin = \new Staff { - \relative c'' { - a4 b c b + \relative { + a'4 b c b } } cello = \new Staff { - \relative c { + \relative { \clef "bass" e2 d } @@ -1353,12 +1388,10 @@ cello = \new Staff { 楽曲のある部分が何度もリピートしている場合に入力の手間を省くことができます。 @lilypond[verbatim,quote] -tripletA = \tuplet 3/2 { c,8 e g } +tripletA = \relative { \tuplet 3/2 { c'8 e g } } barA = { \tripletA \tripletA \tripletA \tripletA } -\relative c'' { - \barA \barA -} +{ \barA \barA } @end lilypond 変数を入力ファイルの中にある他の多くのオブジェクト タイプに対しても@c @@ -1379,6 +1412,7 @@ aFivePaper = \paper @{ paperheight = 21.0 \cm @} \aFivePaper line-width = \width @} + @{ c4^\name @} @@ -1394,7 +1428,6 @@ aFivePaper = \paper @{ paperheight = 21.0 \cm @} @cindex header block (ヘッダ ブロック) @funindex \header -@funindex header タイトル、作曲者、作品番号、それに類似の情報は @code{\header} ブロックの中に挿入されます。@c @@ -1431,12 +1464,11 @@ aFivePaper = \paper @{ paperheight = 21.0 \cm @} @cindex pitches, absolute values (ピッチの絶対値) @cindex absolute note names (絶対音符名) -これまで我々は常にピッチを定義するのに @code{\relative} を使ってきました。@c -これはたいていの音楽を入力するのに最も容易な方法です。@c -しかしながら、ピッチを定義するための方法がもう一つ存在します: -絶対モードです。 +これまで我々はピッチを定義するのに @code{\relative} を使ってきました。@c +これは通常たいていの音楽を入力するのに最も早い方法です。@c +@code{\relative} 無しだとピッチは絶対モードで解釈されます。 -あなたが @code{\relative} を省略した場合、LilyPond はすべてのピッチを@c +LilyPond はすべてのピッチを@c 絶対値として扱います。@c @code{c'} は常にミドル C を意味し、@code{b} は常にミドル C の 1 音下の音符を@c 意味し、@code{g,} は常にヘ音記号の譜表の最下段の譜線上にある音符を意味します。 @@ -1449,45 +1481,40 @@ aFivePaper = \paper @{ paperheight = 21.0 \cm @} } @end lilypond -今度は 4 オクターブの音階があります: +ト音記号に旋律を書く場合は多くのクォート @code{'} 記号が使用されます。@c +モーツァルトからの以下の楽譜の断片について考えてみます: @lilypond[verbatim,quote] { - \clef "bass" - c,4 d, e, f, | - g,4 a, b, c | - d4 e f g | - a4 b c' d' | - \clef "treble" - e'4 f' g' a' | - b'4 c'' d'' e'' | - f''4 g'' a'' b'' | - c'''1 | + \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 -ト音記号に旋律を書く場合は多くのクォート @code{'} 記号が使用されることが@c -見て取れます。@c -モーツァルトからの以下の楽譜の断片について考えてみます: +@funindex \fixed +コマンド @code{\fixed} に参照用ピッチを続けることにより、@c +共通のオクターブ記号を 1 回だけ示すようにすることができます。 @lilypond[verbatim,quote] -{ +\fixed c'' { \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 | + cis8. d16 cis8 e4 e8 | + b,8. cis16 b,8 d4 d8 | } @end lilypond -これらすべてのクォート記号は入力ファイルを読みにくいものにして、@c -エラーの原因になります。@c -@code{\relative} を使うことで、上の例はずっと読みやすく、入力しやすくなります: +@code{\relative} を使うと、 +前の例は 3 譜表スペースより大きいメロディーの動きが無いので、 +オクターブ記号が不要になります: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key a \major \time 6/8 - cis8. d16 cis8 e4 e8 | + cis''8. d16 cis8 e4 e8 | b8. cis16 b8 d4 d8 | } @end lilypond @@ -1499,8 +1526,28 @@ aFivePaper = \paper @{ paperheight = 21.0 \cm @} はっきりとせず、見つけにくいです。 しかしながら、絶対モードは大きな音程を持つ音楽に対しては有用であり、@c -LilyPond ファイルをコンピュータで生成する場合は非常に有用です。 +LilyPond ファイルをコンピュータで生成する場合は非常に有用です。@c +メロディーの断片をコピー&ペーストした場合、@c +絶対モードは元のオクターブが維持されます。 + +時には音楽はより複雑な方法でアレンジされます。@c +@code{\relative} の中で @code{\relative} を使うと、@c +外と中の相対部分は独立しています: + +@lilypond[verbatim,quote] +\relative { c'4 \relative { f'' g } c } +@end lilypond + +@code{\relative} の中で絶対モードを使うには、@c +@code{\fixed c @{ @dots{} @}} の中に絶対モードの音楽を置きます。@c +絶対モードのピッチは相対モードのオクターブに影響しません: +@lilypond[verbatim,quote] +\relative { + c'4 \fixed c { f'' g'' } c | + c4 \fixed c'' { f g } c +} +@end lilypond @node このチュートリアルの後にすべきこと @subsection このチュートリアルの後にすべきこと diff --git a/Documentation/ja/learning/fundamental.itely b/Documentation/ja/learning/fundamental.itely index 5122a524b8..3ae1f86046 100644 --- a/Documentation/ja/learning/fundamental.itely +++ b/Documentation/ja/learning/fundamental.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.29" +@c \version "2.19.22" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -77,9 +77,7 @@ LilyPond 入力ファイルの基本例は以下のようなものです: しかしながら、この例はスタート地点として役に立ちます。 @funindex \book -@funindex book @funindex \score -@funindex score @cindex book @cindex score @@ -90,8 +88,8 @@ LilyPond が自動的に追加のコマンドを付け加えるからです。@c LilyPond は以下のような入力: @example -\relative c'' @{ - c4 a d c +\relative @{ + c''4 a d c @} @end example @@ -103,8 +101,8 @@ LilyPond は以下のような入力: \score @{ \new Staff @{ \new Voice @{ - \relative c'' @{ - c4 a b c + \relative @{ + c''4 a b c @} @} @} @@ -168,11 +166,8 @@ LilyPond はまるでその音楽表記が上で示されたコマンドで包 @end example @funindex \header -@funindex header @funindex \layout -@funindex layout @funindex \midi -@funindex midi @cindex header (ヘッダ) @cindex layout (レイアウト) @cindex midi @@ -199,7 +194,6 @@ MIDI 出力を作り出します。@c @cindex book block, implicit (暗黙の book ブロック) @cindex implicit book block (暗黙の book ブロック) @funindex \book -@funindex book あなたは複数の @code{\score} ブロックを記述するかもしれません。@c それらはそれぞれ別々の楽譜として扱われますが、それらは結合されて@c @@ -240,8 +234,8 @@ LilyPond は暗黙的に入力コードを @code{\book} ブロックで包み込 すべてのテンプレートがこれを使っています: @example -melody = \relative c' @{ - c4 a b c +melody = \relative @{ + c'4 a b c @} \score @{ @@ -271,7 +265,6 @@ LilyPond がこのファイルを見ると、@code{melody} の値 @translationof Score is a (single) compound musical expression @funindex \score -@funindex score @cindex score @cindex contents of a score block (score ブロックの内容) @cindex score block, contents of (score ブロックの内容) @@ -393,8 +386,8 @@ LilyPond 入力ファイルの一般的な構造について見てきました @code{\new Voice = "vocal"} の後の波括弧の中に、以下を書き加えることができます: @example -\relative c'' @{ - r4 d8\noBeam g, c4 r +\relative @{ + r4 d''8\noBeam g, c4 r @} @end example @@ -414,10 +407,10 @@ LilyPond 入力ファイルの一般的な構造について見てきました これで、実際の楽譜の一部ができます: @lilypond[verbatim,quote,ragged-right] -melody = \relative c'' { r4 d8\noBeam g, c4 r } +melody = \relative { r4 d''8\noBeam g, c4 r } text = \lyricmode { And God said, } -upper = \relative c'' { 2~ } -lower = \relative c { b2 e } +upper = \relative { 2~ } +lower = \relative { b,2 e } \score { << @@ -465,8 +458,8 @@ lower = \relative c { b2 e } @lilypond[verbatim,quote,ragged-right] \new Staff { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -491,8 +484,8 @@ lower = \relative c { b2 e } @lilypond[verbatim,quote,ragged-right] \new Staff = "main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -586,11 +579,13 @@ LilyPond 以外では、種類の異なる括弧が適切にネストされる タイが 2 つの連符にまたがっていて、@c さらにフレージング スラーが連符の外にまで伸びています (行 3 と 4)。 -@lilypond[quote,verbatim,ragged-right,relative=1] -r16[ g \tuplet 3/2 { r16 e'8] } -g,16( a \tuplet 3/2 { b16 d) e } -g,8[( a \tuplet 3/2 { b8 d) e~] } | -\tuplet 5/4 { e32\( a, b d e } a4.\) +@lilypond[quote,verbatim,ragged-right] +\relative { + r16[ g' \tuplet 3/2 { r16 e'8] } + g,16( a \tuplet 3/2 { b16 d) e } + g,8[( a \tuplet 3/2 { b8 d) e~] } | + \tuplet 5/4 { e32\( a, b d e } a4.\) +} @end lilypond @@ -681,10 +676,12 @@ LilyPond の楽譜の中で最も低レベルで、最も基礎的であり、 以下では、上記の例の和音を 2 つのボイスに分け、経過音とスラーを付け加えています: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key g \major -% Voice "1" Voice "2" -<< { g4 fis8( g) a4 g } \\ { d4 d d d } >> +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + % Voice = "1" Voice = "2" + << { g'4 fis8( g) a4 g } \\ { d4 d d d } >> +} @end lilypond この例では 2 番目のボイスの符幹が下向きになっていることに気付いてください。 @@ -693,7 +690,7 @@ LilyPond の楽譜の中で最も低レベルで、最も基礎的であり、 @lilypond[quote,verbatim,fragment,ragged-right,relative=2] \key d \minor -% Voice "1" Voice "2" +% Voice = "1" Voice = "2" << { r4 g g4. a8 } \\ { d,2 d4 g } >> | << { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> | << { a2. r4 } \\ { fis2. s4 } >> | @@ -705,19 +702,20 @@ LilyPond の楽譜の中で最も低レベルで、最も基礎的であり、 しかしながら、各小節に多くの音符がある場合、@c 以下のようにボイス毎に分離した方が良いかもしれません: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key d \minor -<< { - % Voice "1" - r4 g g4. a8 | - bes4 bes c bes | - a2. r4 | -} \\ { - % Voice "2" - d,2 d4 g | - g4 g g8( a) g4 | - fis2. s4 | -} >> +@lilypond[quote,verbatim,ragged-right] +<< + \key d \minor + \relative { % Voice = "1" + r4 g' g4. a8 | + bes4 bes c bes | + a2. r4 | + } \\ + \relative { % Voice = "2" + d'2 d4 g | + g4 g g8( a) g4 | + fis2. s4 | + } +>> @end lilypond @@ -739,12 +737,12 @@ LilyPond の楽譜の中で最も低レベルで、最も基礎的であり、 向きは適切にセットされます。 @lilypond[quote,verbatim,fragment] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f - % Voice "1" Voice "2" Voice "3" + c'16 d e f + % Voice = "1" Voice = "2" Voice = "3" << { g4 f e } \\ { r8 e4 d c8 ~ } >> | - << { d2 e2 } \\ { c8 b16 a b8 g ~ g2 } \\ { s4 b4 c2 } >> | + << { d2 e2 } \\ { c8 b16 a b8 g ~ 2 } \\ { s4 b4 c2 } >> | } @end lilypond @@ -764,9 +762,9 @@ LilyPond の楽譜の中で最も低レベルで、最も基礎的であり、 またがって分かれるかもしれないということに注意してください。 @lilypond[quote,verbatim] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f + c'16 d e f << % Bar 1 { \voiceOneStyle @@ -783,7 +781,7 @@ LilyPond の楽譜の中で最も低レベルで、最も基礎的であり、 { d2 e } \\ % Voice 2 continues - { c8 b16 a b8 g~ g2 } + { c8 b16 a b8 g~ 2 } \\ { \voiceThreeStyle @@ -853,10 +851,10 @@ LilyPond の楽譜の中で最も低レベルで、最も基礎的であり、 @c The following should appear as music without code @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << % Voice one - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ % Voice two { % Ignore these for now - they are explained in Ch 4 @@ -899,12 +897,12 @@ A フラットは付点 4 分音符であり、F は 4 分音符、D フラッ @c The following should appear as music without code @c The three voice styles should be defined in -init @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << { % Voice one \voiceOneStyle - c2 aes4. bes8 + c''2 aes4. bes8 } \\ % Voice two { \voiceTwoStyle @@ -933,10 +931,10 @@ A フラットは付点 4 分音符であり、F は 4 分音符、D フラッ @c ignore @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } + { c''2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } >> 1 } @@ -955,10 +953,10 @@ A フラットは付点 4 分音符であり、F は 4 分音符、D フラッ ボイス 3 を省略するには、@code{\\} を 2 つ記述します: @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << % Voice one - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ % Voice two { 2 des } \\ % Omit Voice three @@ -995,15 +993,10 @@ LilyPond は音符の水平方向の位置を調節するための手段をい @translationof Explicitly instantiating voices @funindex \voiceOne -@funindex voiceOne @funindex \voiceTwo -@funindex voiceTwo @funindex \voiceThree -@funindex voiceThree @funindex \voiceFour -@funindex voiceFour @funindex \oneVoice -@funindex oneVoice @funindex \new Voice @cindex voice contexts, creating (ボイス コンテキストを作成する) @@ -1018,8 +1011,8 @@ LilyPond は音符の水平方向の位置を調節するための手段をい @example \new Staff @{ - \relative c' @{ - << @{ e4 f g a @} \\ @{ c,4 d e f @} >> + \relative @{ + << @{ e'4 f g a @} \\ @{ c,4 d e f @} >> @} @} @end example @@ -1029,8 +1022,8 @@ LilyPond は音符の水平方向の位置を調節するための手段をい @example \new Staff << - \new Voice = "1" @{ \voiceOne \relative c' @{ e4 f g a @} @} - \new Voice = "2" @{ \voiceTwo \relative c' @{ c4 d e f @} @} + \new Voice = "1" @{ \voiceOne \relative @{ e'4 f g a @} @} + \new Voice = "2" @{ \voiceTwo \relative @{ c'4 d e f @} @} >> @end example @@ -1039,8 +1032,8 @@ LilyPond は音符の水平方向の位置を調節するための手段をい @c The following example should not display the code @lilypond[ragged-right,quote] \new Staff << - \new Voice = "1" { \voiceOne \relative c' { e4 f g a } } - \new Voice = "2" { \voiceTwo \relative c' { c4 d e f } } + \new Voice = "1" { \voiceOne \relative { e'4 f g a } } + \new Voice = "2" { \voiceTwo \relative { c'4 d e f } } >> @end lilypond @@ -1059,27 +1052,27 @@ LilyPond は音符の水平方向の位置を調節するための手段をい マークアップ、タイ、スラー、強弱記号に与える影響を見ていきましょう: @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { % Default behavior or behavior after \oneVoice - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceOne - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceTwo - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @@ -1096,10 +1089,10 @@ LilyPond は音符の水平方向の位置を調節するための手段をい 示しています。 @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { +\new Staff \relative { \voiceOneStyle % This section is homophonic - c16^( d e f + c'16^( d e f % Start simultaneous section of three voices << % Continue the main voice in parallel @@ -1108,7 +1101,7 @@ LilyPond は音符の水平方向の位置を調節するための手段をい \new Voice { % Set stems, etc., down \voiceTwo - r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1127,15 +1120,15 @@ LilyPond は音符の水平方向の位置を調節するための手段をい @cindex voices, nesting (ボイスをネストさせる) @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { - c16^( d e f +\new Staff \relative { + c'16^( d e f << { g4 f e | d2 e) | } \new Voice { \voiceTwo r8 e4 d c8~ | << - { c8 b16 a b8 g~ g2 | } + { c8 b16 a b8 g~ 2 | } \new Voice { \voiceThree s4 b c2 | @@ -1155,17 +1148,17 @@ LilyPond は音符の水平方向の位置を調節するための手段をい ボイスが無音の場所を飛ばすには以下のように空白音符を使用します: @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' << +\new Staff \relative << % Initiate first voice \new Voice { \voiceOne - c16^( d e f g4 f e | d2 e) | + c'16^( d e f g4 f e | d2 e) | } % Initiate second voice \new Voice { % Set stems, etc, down \voiceTwo - s4 r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + s4 r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1185,13 +1178,9 @@ LilyPond は音符の水平方向の位置を調節するための手段をい @cindex collisions, notes (音符の衝突) @cindex shift commands (シフト コマンド) @funindex \shiftOff -@funindex shiftOff @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn 和音の中で小さな間隔で置かれる音符、@c あるいは異なるボイスで同時に発生する音符は、@c @@ -1239,7 +1228,6 @@ LilyPond は音符の水平方向の位置を調節するための手段をい @funindex \new Lyrics @funindex \lyricsto -@funindex lyricsto @funindex Lyrics @cindex Lyrics context, creating (歌詞コンテキストを作成する) @cindex lyrics, linking to voice (歌詞をボイスにリンクさせる) @@ -1254,10 +1242,10 @@ LilyPond は音符の水平方向の位置を調節するための手段をい @lilypond[quote,verbatim] << \new Voice = "one" { - \relative c'' { + \relative { \autoBeamOff \time 2/4 - c4 b8. a16 | g4. f8 | e4 d | c2 | + c''4 b8. a16 | g4. f8 | e4 d | c2 | } } \new Lyrics \lyricsto "one" { @@ -1274,7 +1262,6 @@ LilyPond は音符の水平方向の位置を調節するための手段をい @cindex lyrics and beaming (歌詞と連桁) @cindex beaming and lyrics (連桁と歌詞) @funindex \autoBeamOff -@funindex autoBeamOff LilyPond がデフォルトで使用する自動連桁は楽器だけの音楽では@c うまく機能しますが、歌詞を持つ音楽ではそれほどうまく機能しません。@c @@ -1286,7 +1273,6 @@ LilyPond がデフォルトで使用する自動連桁は楽器だけの音楽 @funindex \new ChoirStaff @funindex ChoirStaff @funindex \lyricmode -@funindex lyricmode @cindex vocal score structure (ボーカル譜構造) @cindex choir staff @@ -1300,14 +1286,14 @@ LilyPond がデフォルトで使用する自動連桁は楽器だけの音楽 @lilypond[quote,verbatim] global = { \key f \major \time 6/8 \partial 8 } -SopOneMusic = \relative c'' { - c8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ c4 +SopOneMusic = \relative { + c''8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ 4 } SopOneLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, __ } -SopTwoMusic = \relative c' { - r8 | r4. r4 c8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' +SopTwoMusic = \relative { + r8 | r4. r4 c'8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' } SopTwoLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, @@ -1363,10 +1349,10 @@ SopTwoLyrics = \lyricmode { @lilypond[quote,verbatim] keyTime = { \key c \major \time 4/4 \partial 4 } -SopMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyricmode { E -- | ter -- nal fa -- ther, | strong to save, } @@ -1430,8 +1416,8 @@ VerseFour = 記譜要素を出力に追加しなければなりません。@c 例えば、以下の例で入力と出力を比較してください: -@lilypond[quote,verbatim,relative=2] -cis4 cis2. | a4 a2. | +@lilypond[quote,verbatim] +\relative { cis''4 cis2. | a4 a2. | } @end lilypond この入力は内容がやや乏しいですが、出力では小節線、臨時記号、音部記号、@c @@ -1501,7 +1487,6 @@ LilyPond 内部では、これらの規則と情報ビットは@emph{コンテ @translationof Creating contexts @funindex \new -@funindex new @cindex new contexts (新しいコンテキスト) @cindex creating contexts (コンテキストを作成する) @cindex contexts, creating (コンテキストを作成する) @@ -1552,8 +1537,8 @@ score ブロックは単一の音楽表記とそれに関連する出力定義 \clef "treble" \key g \minor \new Voice { % 右手の音符用のボイスを作成します - \relative c'' { % 右手の音符の開始点 - d4 ees16 c8. | + \relative { % 右手の音符の開始点 + d''4 ees16 c8. | d4 ees16 c8. | } % 右手の音符の終了点 } % 右手のボイスの終了点 @@ -1563,14 +1548,14 @@ score ブロックは単一の音楽表記とそれに関連する出力定義 \key g \minor \new Voice { % 左手のボイス 1 を作成します \voiceOne - \relative g { % 左手のボイス 1 の音符の開始点 + \relative { % 左手のボイス 1 の音符の開始点 g8 ees, | g8 ees, | } % 左手のボイス 1 の音符の終了点 } % 左手のボイス 1 の終了点 \new Voice { % 左手のボイス 2 を作成します \voiceTwo - \relative g { % 左手のボイス 2 の音符の開始点 + \relative { % 左手のボイス 2 の音符の開始点 g4 ees | g4 ees | } % 左手のボイス 2 の音符の終了点 @@ -1715,9 +1700,7 @@ LilyPond によって作成された楽譜上にあるすべての記号は @cindex context properties, modifying (コンテキスト プロパティを変更する) @cindex modifying context properties (コンテキスト プロパティを変更する) @funindex \set -@funindex set @funindex \unset -@funindex unset コンテキストにはいくつかのコンテキスト プロパティを保持する責任があります。@c それらプロパティの多くは変更可能であり、変更することで入力の構文解釈に影響を@c @@ -1799,13 +1782,13 @@ LilyPond によって作成された楽譜上にあるすべての記号は @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { + \new Staff \relative { \set Staff.instrumentName = #"Soprano" - c2 c + c''2 c } - \new Staff \relative c' { + \new Staff \relative { \set instrumentName = #"Alto" % Wrong! - d2 d + d'2 d } >> @end lilypond @@ -1847,12 +1830,12 @@ LilyPond 入力ファイルに対する特別なサポートを持つ@c @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - aeses2 aes + \new Staff \relative { + aeses'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Staff.extraNatural = ##f - aeses2 aes + aeses'2 aes } >> @end lilypond @@ -1862,12 +1845,12 @@ LilyPond 入力ファイルに対する特別なサポートを持つ@c @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - aeses2 aes + \new Staff \relative { + aeses'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Score.extraNatural = ##f - aeses2 aes + aeses'2 aes } >> @end lilypond @@ -1890,17 +1873,19 @@ LilyPond 入力ファイルに対する特別なサポートを持つ@c 変更は直前にセットされた値から行われるのではなく、デフォルト値から行われます。 @c KEEP LY -@lilypond[quote,verbatim,ragged-right,relative=1] -c4 d -% 符頭を小さくします -\set fontSize = #-4 -e4 f | -% 符頭を大きくします -\set fontSize = #2.5 -g4 a -% デフォルトのサイズに戻します -\unset fontSize -b4 c | +@lilypond[quote,verbatim,ragged-right] +\relative { + c'4 d + % 符頭を小さくします + \set fontSize = #-4 + e4 f | + % 符頭を大きくします + \set fontSize = #2.5 + g4 a + % デフォルトのサイズに戻します + \unset fontSize + b4 c | +} @end lilypond これまでにいくつかのタイプのプロパティ値をセットする方法を見てきました。@c @@ -1917,7 +1902,6 @@ b4 c | @c Setting context properties with @code{\with} @funindex \with -@funindex with @cindex context properties, setting with \with (\with でコンテキスト プロパティを設定する) コンテキスト プロパティはコンテキストが作成されるときに@c @@ -1940,13 +1924,13 @@ like this: @lilypond[quote,verbatim,ragged-right] << \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } \new Staff \with { extraNatural = ##f } { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } >> @@ -1971,7 +1955,6 @@ like this: @cindex context properties, setting with \context (\context でコンテキスト プロパティを設定する) @funindex \context -@funindex context コンテキスト プロパティの値は単一のコマンドによってある特定のタイプの@c コンテキスト@emph{すべて} -- すべての @code{Staff} コンテキストなどのように @@ -1991,8 +1974,8 @@ like this: @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - cisis4 e d cis + \relative { + cisis''4 e d cis } } \layout { @@ -2010,13 +1993,13 @@ like this: \score { << \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } >> @@ -2055,9 +2038,7 @@ like this: @cindex removing engravers (エングラーバを削除する) @funindex \consists -@funindex consists @funindex \remove -@funindex remove これまでに、コンテキストはそれぞれにいくつかのエングラーバを保持し、@c それぞれのエングラーバは出力のある特定部分 @@ -2081,8 +2062,8 @@ like this: \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c' { - c4 d +\relative { + c'4 d \set fontSize = #-4 % 符頭を小さくします e4 f | \set fontSize = #2.5 % 符頭を大きくします @@ -2114,15 +2095,15 @@ like this: \new Voice \with { \consists "Ambitus_engraver" } { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @@ -2138,15 +2119,15 @@ like this: } << \new Voice { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @@ -2156,7 +2137,6 @@ like this: @c Changing all contexts of the same type @funindex \layout -@funindex layout 上の例では、個々のコンテキストにエングラーバを追加あるいは削除する方法を@c 示しました。@c @@ -2170,24 +2150,24 @@ like this: \score { << \new Staff { - \relative c'' { - c4 a b g + \relative { + c''4 a b g } } \new Staff { - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "G_8" - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "bass" - \relative c { + \relative { c4 a b g } } @@ -2254,7 +2234,7 @@ like this: @example \version @w{"@version{}"} -melody = \relative c' @{ +melody = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2284,7 +2264,7 @@ text = \lyricmode @{ @example \version @w{"@version{}"} -melody = \relative c' @{ +melody = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2325,7 +2305,7 @@ melody = \relative c' @{ @example \version @w{"@version{}"} -sopranoMusic = \relative c' @{ +sopranoMusic = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2336,7 +2316,7 @@ sopranoLyrics = \lyricmode @{ Aaa Bee Cee Dee @} -celloMusic = \relative c @{ +celloMusic = \relative @{ \clef "bass" \key c \major \time 4/4 @@ -2396,7 +2376,7 @@ celloMusic = \relative c @{ ここで、完成したソプラノとチェロ用のテンプレートを挙げます。 @lilypond[quote,verbatim,ragged-right,addversion] -sopranoMusic = \relative c' { +sopranoMusic = \relative { \clef "treble" \key c \major \time 4/4 @@ -2407,7 +2387,7 @@ sopranoLyrics = \lyricmode { Aaa Bee Cee Dee } -celloMusic = \relative c { +celloMusic = \relative { \clef "bass" \key c \major \time 4/4 @@ -2453,44 +2433,44 @@ Mendelssohn の Elijah や Handel の Messiah などのオーケストラ伴奏 @lilypond[quote,ragged-right] global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis e2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis e2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4
2 4 | + r4 2 4 | 4. 8 2 | 4 2 | } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 | + 4 2 4 | 4. 8 2 | 4 2 | } @@ -2682,39 +2662,39 @@ lower = \relative c, { @c KEEP LY @lilypond[quote,verbatim,ragged-right,addversion] global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis fis2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis fis2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4 2 4 | + r4 2 4 | 4. 8 2 | 4 2 | } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 | + 4 2 4 | 4. 8 2 | 4 2 | } @@ -3014,20 +2994,20 @@ Voice はこれとは対照的に、あなたの音楽を連続して演奏す composer = "J S Bach" } keyTime = { \key c \minor \time 4/4 } -ManualOneVoiceOneMusic = \relative g' { - g4 g f ees | +ManualOneVoiceOneMusic = \relative { + g'4 g f ees | d2 c | } -ManualOneVoiceTwoMusic = \relative c' { - ees16 d ees8~ ees16 f ees d c8 d~ d c~ | - c8 c4 b8 c8. g16 c b c d | +ManualOneVoiceTwoMusic = \relative { + ees'16 d ees8~ 16 f ees d c8 d~ d c~ | + 8 c4 b8 c8. g16 c b c d | } -ManualTwoMusic = \relative c' { - c16 b c8~ c16 b c g a8 g~ g16 g aes ees | - f16 ees f d g aes g f ees d ees8~ ees16 f ees d | +ManualTwoMusic = \relative { + c'16 b c8~ 16 b c g a8 g~ 16 g aes ees | + f16 ees f d g aes g f ees d ees8~ 16 f ees d | } -PedalOrganMusic = \relative c { - r8 c16 d ees d ees8~ ees16 a, b g c b c8 | +PedalOrganMusic = \relative { + r8 c16 d ees d ees8~ 16 a, b g c b c8 | r16 g ees f g f g8 c,2 | } @@ -3081,7 +3061,7 @@ PedalOrganMusic = \relative c { これまでに、以下のような記述を見てきました: @lilypond[quote,verbatim,ragged-right] -hornNotes = \relative c'' { c4 b dis c } +hornNotes = \relative { c''4 b dis c } \score { { @@ -3094,8 +3074,8 @@ hornNotes = \relative c'' { c4 b dis c } 気付くかもしれません: @lilypond[quote,verbatim,ragged-right] -fragmentA = \relative c'' { a4 a8. b16 } -fragmentB = \relative c'' { a8. gis16 ees4 } +fragmentA = \relative { a'4 a8. b16 } +fragmentB = \relative { a'8. gis16 ees4 } violin = \new Staff { \fragmentA \fragmentA | @@ -3121,9 +3101,9 @@ fthenp =_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } -violin = \relative c'' { +violin = \relative { \repeat volta 2 { - c4._\dolce b8 a8 g a b | + c''4._\dolce b8 a8 g a b | \padText c4.^"hi there!" d8 e' f g d | c,4.\fthenp b8 c4 c-. | @@ -3145,9 +3125,9 @@ violin = \relative c'' { とても読み難く、特に最後の行が読み難いです。 @example -violin = \relative c'' @{ +violin = \relative @{ \repeat volta 2 @{ - c4._\markup @{ \italic \bold dolce @} b8 a8 g a b | + c''4._\markup @{ \italic \bold dolce @} b8 a8 g a b | \once \override TextScript.padding = #5.0 c4.^"hi there!" d8 e' f g d | c,4.\markup @{ @@ -3170,14 +3150,14 @@ LilyPond は非静的な置き換えも処理できます (それらを関数と @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function - (parser location padding) + (padding) (number?) #{ \once \override TextScript.padding = #padding #}) -\relative c''' { - c4^"piu mosso" b a b | +\relative { + c'''4^"piu mosso" b a b | \padText #1.8 c4^"piu mosso" d e f | \padText #2.6 @@ -3210,7 +3190,7 @@ padText = 以下のホルン/@/バスーン デュオのパートを保持しているとします: @example -hornNotes = \relative c @{ +hornNotes = \relative @{ \time 2/4 r4 f8 a | cis4 f | e4 d | @} @@ -3249,7 +3229,7 @@ hornNotes = \relative c @{ この移調により出力は以下のようになります: @lilypond[quote,ragged-right] -\transpose f c' \relative c { +\transpose f c' \relative { \time 2/4 r4 f8 a | cis4 f | e4 d | } @@ -3281,7 +3261,7 @@ R2*3 以下のような結果になります: @lilypond[quote,ragged-right] -\transpose f c' \relative c { +\transpose f c' \relative { \time 2/4 \set Score.skipBars = ##t R2*3 | @@ -3307,7 +3287,7 @@ R2*3 そして、以下のような楽譜になります: @lilypond[quote,ragged-right] -\relative c << +\relative << \new Staff { \clef "treble" \time 2/4 diff --git a/Documentation/ja/learning/templates.itely b/Documentation/ja/learning/templates.itely index de6f029732..af5077d0b0 100644 --- a/Documentation/ja/learning/templates.itely +++ b/Documentation/ja/learning/templates.itely @@ -223,7 +223,7 @@ @appendixsubsec Transcription of mensural music @lilypondfile[verbatim,quote,ragged-right,texidoc] -{ancient-notation-template----modern-transcription-of-mensural-music.ly} +{incipit.ly} @node Gregorian transcription template @appendixsubsec Gregorian transcription template @@ -244,7 +244,6 @@ @appendixsubsec ジャズ バンド @translationof Jazz combo -@c Line-width below is because of Issue 766. If that's fixed, it can be removed. @lilypondfile[verbatim,quote,ragged-right,texidoc] {jazz-combo-template.ly} diff --git a/Documentation/ja/learning/tutorial.itely b/Documentation/ja/learning/tutorial.itely index 9df0483d2f..8e48c14456 100644 --- a/Documentation/ja/learning/tutorial.itely +++ b/Documentation/ja/learning/tutorial.itely @@ -1,7 +1,7 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*- @ignore - Translation of GIT committish: fabcd22c8f88ea9a87241597f1e48c0a9adbfc6e + Translation of GIT committish: 76ee88f5adfc7bcd8eff487543e3605e43a93d80 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -10,9 +10,9 @@ @include included/generating-output.itexi -@c \version "2.16.0" +@c \version "2.19.21" -@c Translators: Yoshiki Sawada +@c Translators: Masamichi Hosoda, Yoshiki Sawada @c Translation status: post-GDP @@ -54,19 +54,17 @@ @cindex example, first (最初の例) @cindex case sensitive (大文字と小文字を区別する) -@qq{コンパイル} は LilyPond フォーマットで書かれた入力ファイルから@c -出力ファイルを作り出す処理を意味する用語です。 -出力ファイルは一般に PDF (印刷や閲覧用)、MIDI (演奏用)、それに PNG -(オンラインで使用) - +@menu +* 出力を作り出す:: +@end menu -ため、そして (オプションとして) 演奏可能な MIDI ファイルを@c -作り出すために処理することを意味する用語です。@c +@qq{コンパイル} は LilyPond フォーマットで書かれた入力ファイルから@c +出力ファイルを作り出す処理を意味する用語です。@c +出力ファイルには一般に PDF (印刷や閲覧用)、MIDI (演奏用)、それに PNG +(オンラインで使用)があります。@c LilyPond 入力ファイルはシンプルなテキストファイルです。@c -最初の例ではシンプルな入力ファイルがどのようなものかを示します。 -楽譜を作成するために、我々は記譜法を指定する入力ファイルを書きます。@c -例えば、以下のように書くと: +最初の例ではシンプルな入力ファイルを示します。 @example \version "@w{@version{}}" @@ -75,8 +73,7 @@ LilyPond 入力ファイルはシンプルなテキストファイルです。@c @} @end example -@noindent -結果は以下のようになります: +出力は以下のようになります: @c in this case we don't want verbatim @lilypond[quote] @@ -85,12 +82,8 @@ LilyPond 入力ファイルはシンプルなテキストファイルです。@c } @end lilypond -@c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -@c strong内で {} を使用しようとした場合、なぜか下記のような表記にしなければ -エラーが発生した -@c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @warning{LilyPond 入力の音符と歌詞は、 -@strong{@code{@{}} @strong{波括弧} @strong{@code{@}}} +@w{@strong{@{ 波括弧 @}}} で囲まれている必要があります。@c さらに、あいまいさを避けるために、波括弧は行の最初か最後でない限りは@c スペースによって囲まれているべきです。@c @@ -103,12 +96,12 @@ LilyPond 入力ファイルはシンプルなテキストファイルです。@c @w{@code{@{ c d e @}}} は有効な入力ですが、@c @w{@code{@{ C D E @}}} はエラーになります。 -@smallspace - @smallspace -@subheading 出力を作り出す +@node 出力を作り出す +@unnumberedsubsubsec 出力を作り出す +@translationof Producing output @cindex PDF file (PDF ファイル) @cindex viewing music (楽譜を閲覧する) @@ -194,6 +187,16 @@ LilyPond の基本的な構文をいくつか紹介します。 @cindex simple notation (簡単な記譜法) @cindex notation, simple (簡単な記譜法) +@menu +* ピッチ:: +* 演奏時間 (リズム):: +* 休符:: +* 拍子記号:: +* テンポ記号:: +* 音部記号:: +* すべてをまとめて:: +@end menu + LilyPond はいくつかの記譜要素を自動的に追加します。@c 次の例では、我々は 4 つのピッチを指定しただけですが、LilyPond が音部記号、@c 拍子記号、リズムを加えています。 @@ -209,8 +212,9 @@ LilyPond はいくつかの記譜要素を自動的に追加します。@c 役に立ちます。 -@subheading ピッチ -@c ピッチ +@node ピッチ +@unnumberedsubsubsec ピッチ +@translationof Pitches @cindex pitches (ピッチ) @cindex relative mode (相対モード) @@ -220,7 +224,6 @@ LilyPond はいくつかの記譜要素を自動的に追加します。@c @cindex relative mode, and accidentals (臨時記号と相対モード) @funindex \relative -@funindex relative @funindex ' @funindex , @@ -228,6 +231,16 @@ LilyPond はいくつかの記譜要素を自動的に追加します。@c @rglos{scale}, @rglos{middle C}, @rglos{octave}, @rglos{accidental} +LilyPondではピッチを指定するために小文字を使います。文字 +@code{c} から@tie{}@code{b} は@notation{ミドル C}の@c +下の@q{スモール・オクターブ}を示します。@c +@code{'} や@tie{}@code{,} を後ろにつけると上か下のオクターブになります。@c +@notation{ミドル C}から始まる音階とアルペジオの例です: + +@lilypond[verbatim,quote] +{ c' d' e' f' g' a' b' c'' g c' e' g' c'' e'' g'' c''' } +@end lilypond + 音符を入力するための最も簡単な方法は @code{\relative} モードを@c 使用することです。@c このモードでは、後に続く音符は常に前の音符に最も近い場所になるという@c @@ -238,14 +251,13 @@ LilyPond はいくつかの記譜要素を自動的に追加します。@c 前の音符からちょうど 1 譜表スペースの位置にきます) -- からはじめます。 @lilypond[verbatim,quote] -% set the starting point to middle C -\relative c' { - c d e f +\relative { + c' d e f g a b c } @end lilypond -最初の音符は@notation{ミドル C} です。@c +最初の音符は@code{c'}で示される@notation{ミドル C} です。@c 一連の音符はそれぞれ前の音符と最も近い場所に置かれています -- 言い換えると、最初の @code{c} はミドル C に最も近い C です。@c これに前の音符に最も近い D が続きます。@c @@ -253,24 +265,23 @@ LilyPond はいくつかの記譜要素を自動的に追加します。@c より大きな音程を持つ旋律を作ることができます: @lilypond[verbatim,quote] -\relative c' { - d f a g +\relative { + d' f a g c b f d } @end lilypond @noindent -旋律の最初の音符が開始ピッチを指定している音符である必要はありません。@c -前の例では、最初の音符 -- @code{d} -- はミドル C に最も近い D です。 +前の例では、最初の音符 -- @code{d} に一つ @code{'} が付いている -- +はミドル C から B へ上がっていくオクターブにある D です。 -@code{@w{\relative c' @{}} コマンドにクォート @code{'} やカンマ @code{,} を@c +最初の音符にクォート @code{'} やカンマ @code{,} を@c 付け加える (あるいは取り除く) ことによって、@c 開始オクターブを変更することができます: @lilypond[verbatim,quote] -% one octave above middle C -\relative c'' { - e c a c +\relative { + e'' c a c } @end lilypond @@ -285,8 +296,8 @@ A, G, F である場合は B の下に置かれます。 @c KEEP LY @lilypond[verbatim,quote] -\relative c'' { - b c % c は b よりも 1 譜表スペース上なので、c は b の上になります +\relative { + b' c % c は b よりも 1 譜表スペース上なので、c は b の上になります b d % d は 2 つ上または 5 つ下なので、d は上になります b e % e は 3 つ上または 4 つ下なので、e は上になります b a % a は 6 つ上または 1 つ下なので、a は下になります @@ -307,8 +318,8 @@ A, G, F である場合は B の下に置かれます。 下げることができます。 @lilypond[verbatim,quote] -\relative c'' { - a a, c' f, +\relative { + a' a, c' f, g g'' a,, f' } @end lilypond @@ -317,14 +328,12 @@ A, G, F である場合は B の下に置かれます。 音符を 2 オクターブ (あるいはそれ以上) 変えるには、複数化した @code{''} や @code{,,} を使用します -- しかしながら、1 つのダブル クォート @code{"} ではなく、2 つのシングル クォートを使用するよう注意してください!@c -また、@code{@w{\relative c'}} の中の最初の値もこのように@c -変更されるかもしれません。 @c " - keeps quotes in order for context-sensitive editor -td -@subheading 演奏時間 (リズム) -@c Durations (rhythms) -@c 演奏時間 (原語: Durations, リズム) +@node 演奏時間 (リズム) +@unnumberedsubsubsec 演奏時間 (リズム) +@translationof Durations (rhythms) @cindex note durations (音符の演奏時間) @cindex durations (演奏時間) @@ -353,8 +362,8 @@ A, G, F である場合は B の下に置かれます。 最初の音符のデフォルトの演奏時間は 4 分音符です。 @lilypond[verbatim,quote] -\relative c'' { - a1 +\relative { + a'1 a2 a4 a8 a a16 a a a a32 a a a a64 a a a a a a a a2 } @@ -365,15 +374,16 @@ A, G, F である場合は B の下に置かれます。 付点音符の演奏時間は明記されなければなりません (つまり、数字で)。 @lilypond[verbatim,quote] -\relative c'' { - a4 a a4. a8 +\relative { + a'4 a a4. a8 a8. a16 a a8. a8 a4. } @end lilypond -@subheading 休符 -@c Rests +@node 休符 +@unnumberedsubsubsec 休符 +@translationof Rests @cindex rest (休符) @cindex notating rests (休符を記譜する) @@ -384,20 +394,20 @@ A, G, F である場合は B の下に置かれます。 @notation{休符}は @code{r} という名前の音符のような形で入力されます: @lilypond[verbatim,quote] -\relative c'' { - a r r2 +\relative { + a'4 r r2 r8 a r4 r4. r8 } @end lilypond -@subheading 拍子記号 -@c Time signature +@node 拍子記号 +@unnumberedsubsubsec 拍子記号 +@translationof Time signature @cindex time signature (拍子記号) @funindex \time -@funindex time 音楽用語集: @rglos{time signature} @c 拍子記号 (time signature) @@ -405,9 +415,9 @@ A, G, F である場合は B の下に置かれます。 @notation{拍子記号}は @code{\time} コマンドでセットすることができます: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 - a4 a a + a'4 a a \time 6/8 a4. a \time 4/4 @@ -416,14 +426,14 @@ A, G, F である場合は B の下に置かれます。 @end lilypond -@subheading テンポ記号 -@c Tempo marks +@node テンポ記号 +@unnumberedsubsubsec テンポ記号 +@translationof Tempo marks @cindex tempo marks (テンポ記号) @cindex metronome marks (メトロノーム記号) @funindex \tempo -@funindex tempo 音楽用語集: @rglos{tempo indication}, @rglos{metronome} @@ -431,10 +441,10 @@ A, G, F である場合は B の下に置かれます。 @code{\tempo} コマンドでセットすることができます: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 \tempo "Andante" - a4 a a + a'4 a a \time 6/8 \tempo 4. = 96 a4. a @@ -445,8 +455,9 @@ A, G, F である場合は B の下に置かれます。 @end lilypond -@subheading 音部記号 -@c Clef +@node 音部記号 +@unnumberedsubsubsec 音部記号 +@translationof Clef @cindex clef (音部記号) @cindex treble (ト音記号、高音部記号) @@ -455,7 +466,6 @@ A, G, F である場合は B の下に置かれます。 @cindex bass (バス) @funindex \clef -@funindex clef 音楽用語集: @rglos{clef} @c : 音部記号 (clef) @@ -463,30 +473,31 @@ A, G, F である場合は B の下に置かれます。 @notation{音部記号}は @code{\clef} コマンドを使ってセットすることができます: @lilypond[verbatim,quote] -\relative c' { - \clef treble +\relative { + \clef "treble" + c'1 + \clef "alto" c1 - \clef alto + \clef "tenor" c1 - \clef tenor - c1 - \clef bass + \clef "bass" c1 } @end lilypond -@subheading すべてをまとめて -@c All together +@node すべてをまとめて +@unnumberedsubsubsec すべてをまとめて +@translationof All together 以上の要素をすべて集めたちょっとした例をお見せします: @lilypond[verbatim,quote] -\relative c, { +\relative { \clef "bass" \time 3/4 \tempo "Andante" 4 = 120 - c2 e8 c' + c,2 e8 c' g'2. f4 e d c4 c, r @@ -575,7 +586,7 @@ LilyPond 入力ファイルは多くの一般的なプログラミング言語 以下と同じ意味になります: @example -@{ c d +@{ c4 d e @} @end example @@ -586,7 +597,7 @@ LilyPond 入力ファイルは多くの一般的なプログラミング言語 @example @{ - c d e + c4 d e @} @end example @@ -644,7 +655,7 @@ b2 b この行と以下の音符は無視されます。 なぜなら、これらはブロック コメントの中にあるからです - f f e e d d c2 + f4 f e e d d c2 %@} @end example @@ -722,35 +733,19 @@ LilyPond で発生する問題をトラブルシュートすることは、@c @c @ref{Working on input files} @ref{入力ファイルに取り組む} で見てきたように、LilyPond 入力は @{ @} マークか -@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} +@q{@w{@code{@bs{}relative @{ @dots{} @}}}} で囲まれていなければなりません。@c -このマニュアルの残りの部分では、たいていの例はこのことを省略しています。@c -このマニュアルにある例を複製するためにあなたは表示されている入力を@c -コピーするかもしれませんが、あなたは以下のように -@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} -を付け加えなければなりません: +このマニュアルの残りの部分では、いくつかの短い例はこのことを省略しています。@c +このような例を複製するためにあなたは表示されている入力を@c +コピーできますが、あなたは入力ファイルの中で、 +@code{@{} と @code{@{} の間にペーストしてください。 @example -\relative c'' @{ +@{ @dots{}例がここに来ます@dots{} @} @end example -なぜ波括弧を省略するのか?@c -このマニュアルの中のたいていの例はより大きな音楽の途中に@c -挿入することができます。@c -これらの例に対して @q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} -を付け加えることには意味がありません --- あなたはある @code{\relative} を他の @code{\relative} の -中に置くべきではありません!@c -すべての例の周りに -@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} -を置いてしまうと、@c -あなたは小さな例をコピーして、それをより大きなあなた自身の音楽の中に@c -ペーストすることができなくなってしまいます。@c -たいていの人は資料を既存の楽曲に付け加えようとしますので、@c -我々はそのようにマニュアルを形作っています。 - さらに、すべての LilyPond ファイルは @code{\version} 宣言を持つべきである@c ということを思い出してください。@c マニュアルの中の例はコードの断片であり、ファイルではないため、@c @@ -773,8 +768,8 @@ LilyPond で発生する問題をトラブルシュートすることは、@c @c no verbatim here @lilypond[quote] -\relative c'' { - c-\markup { \bold \huge { ここをクリックしてください } } +\relative { + c''4-\markup { \bold \huge { ここをクリックしてください } } } @end lilypond diff --git a/Documentation/ja/learning/tweaks.itely b/Documentation/ja/learning/tweaks.itely index ff31215f2d..303625837f 100644 --- a/Documentation/ja/learning/tweaks.itely +++ b/Documentation/ja/learning/tweaks.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.20" +@c \version "2.19.22" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -201,7 +201,6 @@ LilyPond が @code{\new Staff} のようなコマンドに遭遇した場合、@ @cindex override syntax (override 構文) @funindex \override -@funindex override 我々はすでに @ref{コンテキスト プロパティを変更する} と @ref{エングラーバを追加 / 削除する} で @strong{コンテキスト} のプロパティを@c @@ -258,12 +257,14 @@ Scheme モードについての更なる情報は @rextend{LilyPond Scheme synta @cindex color property, example (color プロパティの例) @cindex NoteHead, example of overriding (NoteHead をオーバライドする例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a b c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a b c | +} @end lilypond @@ -274,7 +275,6 @@ g4 a b c | @cindex revert command (revert コマンド) @funindex \revert -@funindex revert 一旦オーバライドされると、そのプロパティは再度オーバライドされるか @code{\revert} コマンドに遭遇するまで新しい値のままでいます。@c @@ -296,14 +296,16 @@ g4 a b c | @cindex color property, example (color プロパティの例) @cindex NoteHead, example of overriding (NoteHead をオーバライドする例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a -\revert NoteHead.color -b4 c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a + \revert NoteHead.color + b4 c | +} @end lilypond @@ -312,7 +314,6 @@ b4 c | @translationof The \once prefix @funindex \once -@funindex once @code{\override} コマンドと @code{\set} コマンドには両方とも@c 接頭辞 @code{\once} が付く可能性があります。@c @@ -323,14 +324,16 @@ b4 c | @cindex color property, example (color プロパティの例) @cindex NoteHead, example of overriding (NoteHead をオーバライドする例) -@lilypond[quote,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\once \override NoteHead.color = #green -g4 a -\revert NoteHead.color -b c | +@lilypond[quote,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \once \override NoteHead.color = #green + g4 a + \revert NoteHead.color + b c | +} @end lilypond @code{\once} 接頭辞をさまざまな定義済みコマンドの前に置くことで、@c @@ -358,7 +361,6 @@ b c | @cindex overrideProperty command (overrideProperty コマンド) @funindex \overrideProperty -@funindex overrideProperty オーバライド コマンドには @code{\overrideProperty} という@c もう 1 つのフォーマットがあり、時々必要となります。@c @@ -373,7 +375,6 @@ b c | @cindex tweak command (tweak コマンド) @funindex \tweak -@funindex tweak 利用可能な最後の調整コマンドは @code{\tweak} です。@c これは同じ音楽タイミングで発生するいくつかのオブジェクトのうち、@c @@ -393,11 +394,13 @@ C メジャー コードの中にある真ん中の音符 (ミドル E) の符 @cindex font-size property, example (font-size プロパティの例) @cindex NoteHead, example of overriding (NoteHead をオーバライドする例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -\once \override NoteHead.font-size = #-3 -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + \once \override NoteHead.font-size = #-3 + 4 + 4 +} @end lilypond このオーバライドは和音の中にある@emph{すべて}の符頭に影響を与えています。@c @@ -416,9 +419,11 @@ C メジャー コードの中にある真ん中の音符 (ミドル E) の符 @cindex font-size property, example (font-size プロパティの例) @cindex @code{\tweak}, example (@code{\tweak} の例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + 4 +} @end lilypond @code{\tweak} の構文は @code{\override} コマンドの構文とは@c @@ -440,8 +445,8 @@ C メジャー コードの中にある真ん中の音符 (ミドル E) の符 @cindex color property, example (color プロパティの例) @cindex @code{\tweak}, example (@code{\tweak} の例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -a4^"Black" +@lilypond[quote,fragment,ragged-right,verbatim] +a'4^"Black" -\tweak color #red ^"Red" -\tweak color #green _"Green" @end lilypond @@ -463,10 +468,10 @@ a4^"Black" オブジェクト名を指定して LilyPond がそれらのオブジェクトの起源を@c 追跡できるようにすることで、@code{\tweak} で調整することができます: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -<\tweak Accidental.color #red cis4 - \tweak Accidental.color #green es - g> +@lilypond[quote,fragment,ragged-right,verbatim] +<\tweak Accidental.color #red cis''4 + \tweak Accidental.color #green es'' + g''> @end lilypond この長い形式の @code{\tweak} コマンドは以下のように記述することができます: @@ -500,13 +505,15 @@ a4^"Black" @cindex direction property, example (direction プロパティの例) @cindex color property, example (color プロパティの例) -@lilypond[quote,ragged-right,verbatim,fragment,relative=2] -\tweak direction #up -\tuplet 3/4 { - \tweak color #red - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \tweak direction #up + \tuplet 3/4 { + \tweak color #red + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -518,15 +525,17 @@ a4^"Black" @cindex transparent property, example (transparent プロパティの例) @cindex TupletNumber, example of overriding (TupletNumber をオーバライドする例) -@lilypond[quote,ragged-right,verbatim,fragment,relative=1] -\tuplet 3/2 { c8[ c c] } -\once \override TupletNumber.text = #tuplet-number::calc-fraction-text -\tuplet 3/2 { - c8[ c] - c8[ c] - \once \override TupletNumber.transparent = ##t - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative { + \tuplet 3/2 { c'8[ c c] } + \once \override TupletNumber.text = #tuplet-number::calc-fraction-text + \tuplet 3/2 { + c8[ c] + c8[ c] + \once \override TupletNumber.transparent = ##t + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -588,12 +597,12 @@ a4^"Black" @c Mozart, Die Zauberflöte Nr.7 Duett -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -682,14 +691,14 @@ Slur へのリンクを選択すると、Slur のプロパティがリスト ア @cindex Slur example of overriding (Slur をオーバライドする例) @cindex thickness property, example (thickness プロパティの例) -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { + \relative { % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 - r4 bes8 bes[( g]) g | + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -740,7 +749,6 @@ Slur へのリンクを選択すると、Slur のプロパティがリスト ア @cindex once override (一度だけオーバライドする) @funindex \once -@funindex once 上記の最後の例では @emph{すべて} のスラーが太くなっています。@c しかし、最初のスラーだけを太くしたい場合はどうでしょうか?@c @@ -758,12 +766,12 @@ Slur へのリンクを選択すると、Slur のプロパティがリスト ア @cindex thickness property, example (thickness プロパティの例) @c KEEP LY -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % 直後にあるスラーのみを太くします \once \override Slur.thickness = #5.0 bes8[( g]) g | @@ -787,7 +795,6 @@ Slur へのリンクを選択すると、Slur のプロパティがリスト ア @cindex default properties, reverting to (デフォルトのプロパティに戻す) @funindex \revert -@funindex revert 最後に、最初の 2 つだけのスラーを太くしたい場合はどうでしょうか?@c その場合、2 つのコマンド -- それぞれの前に @code{\once} を付けた -- @@ -797,12 +804,12 @@ Slur へのリンクを選択すると、Slur のプロパティがリスト ア @cindex thickness property, example (thickness プロパティの例) @c KEEP LY -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % 直後にあるスラーのみを太くします \once \override Slur.thickness = #5.0 bes[( g]) g | @@ -826,12 +833,12 @@ Slur へのリンクを選択すると、Slur のプロパティがリスト ア @cindex thickness property, example (thickness プロパティの例) @c KEEP LY -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % 以後のスラーの太さを 1.2 から 5.0 に増やします \override Slur.thickness = #5.0 bes[( g]) g | @@ -947,12 +954,12 @@ LilyPond に読み込まれます。@c @cindex LyricText, example of overriding (Lyric をオーバライドする例) @cindex @code{\addlyrics}, example (@code{\addlyrics} の例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -1130,11 +1137,11 @@ LilyPond に読み込まれます。@c @cindex BarLine, example of overriding (BarLine をオーバライドする例) @cindex stencil property, example (stencil プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override BarLine.stencil = ##f - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1161,11 +1168,11 @@ LilyPond に読み込まれます。@c @cindex BarLine, example of overriding (BarLine をオーバライドする例) @cindex stencil property, example (stencil プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.stencil = ##f - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1176,11 +1183,11 @@ LilyPond に読み込まれます。@c 短くしたコマンド @code{\omit} が用意されています: @funindex \omit -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \omit Staff.BarLine - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1196,9 +1203,9 @@ LilyPond に読み込まれます。@c この場合、@code{point-stencil} を使ってサイズが 0 のステンシル (型、型紙) を@c オブジェクトにセットします: -@lilypond[quote,verbatim,relative=2] -{ - c4 c +@lilypond[quote,verbatim] +\relative { + c''4 c \once \override NoteHead.stencil = #point-stencil c4 c } @@ -1230,11 +1237,11 @@ LilyPond に読み込まれます。@c @cindex BarLine, example of overriding (BarLine をオーバライドする例) @cindex break-visibility property, example (break-visibility プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.break-visibility = ##(#f #f #f) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1269,11 +1276,11 @@ LilyPond に読み込まれます。@c @cindex TimeSignature, example of overriding (TimeSignature をオーバライドする例) @cindex transparent property, example (transparent プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.TimeSignature.transparent = ##t - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1284,11 +1291,11 @@ LilyPond に読み込まれます。@c 短くしたコマンド @code{\hide} が用意されています: @funindex \hide -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \hide Staff.TimeSignature - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1305,11 +1312,11 @@ LilyPond に読み込まれます。@c @cindex TimeSignature, example of overriding (TimeSignature をオーバライドする例) @cindex stencil property, example (stencil プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \omit Staff.TimeSignature - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1350,11 +1357,11 @@ LilyPond に読み込まれます。@c @cindex BarLine, example of overriding (BarLine をオーバライドする例) @cindex color property, example (color プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #white - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1385,11 +1392,11 @@ LilyPond に読み込まれます。@c @cindex BarLine, example of overriding (BarLine をオーバライドする例) @cindex color property, example (color プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(x11-color 'white) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1415,11 +1422,11 @@ RGB 値を内部カラーに変換する @code{rgb-color} 関数です。@c @cindex BarLine, example of overriding (BarLine をオーバライドする例) @cindex color property, example (color プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(rgb-color 1 1 1) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1441,8 +1448,8 @@ RGB 値を内部カラーに変換する @code{rgb-color} 関数です。@c @cindex color property, example (color プロパティの例) @cindex x11-color, example of using (x11-color の使用例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.StaffSymbol.color = #(x11-color 'grey30) \override Staff.TimeSignature.color = #(x11-color 'grey60) @@ -1450,7 +1457,7 @@ RGB 値を内部カラーに変換する @code{rgb-color} 関数です。@c \override Voice.NoteHead.color = #(x11-color 'grey85) \override Voice.Stem.color = #(x11-color 'grey85) \override Staff.BarLine.color = #(x11-color 'grey10) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1485,10 +1492,10 @@ RGB 値を内部カラーに変換する @code{rgb-color} 関数です。@c @cindex alignAboveContext property, example (alignAboveContext プロパティの例) @cindex @code{\with}, example (@code{\with} の例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1512,10 +1519,10 @@ RGB 値を内部カラーに変換する @code{rgb-color} 関数です。@c @cindex Clef, example of overriding (Clef をオーバライドする例) @cindex TimeSignature, example of overriding (TimeSignature をオーバライドする例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1575,10 +1582,10 @@ RGB 値を内部カラーに変換する @code{rgb-color} 関数です。@c @cindex TimeSignature, example of overriding (TimeSignature をオーバライドする例) @c KEEP LY -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,fragment,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1600,10 +1607,10 @@ RGB 値を内部カラーに変換する @code{rgb-color} 関数です。@c 短縮形 @code{\hide} と @code{\omit} を使うことができ、結果として@c 以下のようになります: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1670,10 +1677,10 @@ RGB 値を内部カラーに変換する @code{rgb-color} 関数です。@c @cindex fontSize property, example (fontSize プロパティの例) @c KEEP LY -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1738,10 +1745,10 @@ LilyPond では距離と長さは一般に譜スペース -- 譜の中の隣り @cindex staff-space property, example (staff-space プロパティの例) @cindex stencil property, example (stencil プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1846,11 +1853,11 @@ LilyPond が持つ譜外部オブジェクトの垂直位置のルールは、@c @cindex markup example (マークアップの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" | -c2^"Text3" -c2^"Text4" | +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond デフォルトでは、譜も互いにできるだけ近くなるよう配置されます @@ -1862,10 +1869,10 @@ c2^"Text4" | @lilypond[quote,ragged-right,verbatim] << \new Staff { - \relative c' { c4 a, } + \relative { c'4 a, } } \new Staff { - \relative c'''' { c4 a, } + \relative { c''''4 a, } } >> @end lilypond @@ -2011,12 +2018,14 @@ a4 g c a | @cindex Fingering, example of overriding (Fingering をオーバライドする例) @cindex direction property, example (direction プロパティの例) -@lilypond[quote,verbatim,relative=2] -c4-5 a-3 f-1 c'-5 | -\override Fingering.direction = #DOWN -c4-5 a-3 f-1 c'-5 | -\override Fingering.direction = #UP -c4-5 a-3 f-1 c'-5 | +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #DOWN + c4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #UP + c4-5 a-3 f-1 c'-5 | +} @end lilypond しかしながら、@code{direction} プロパティをオーバライドすることは、@c @@ -2027,10 +2036,12 @@ c4-5 a-3 f-1 c'-5 | @cindex fingering example (運指法記号の例) -@lilypond[quote,verbatim,relative=2] -c4-5 a-3 f-1 c'-5 | -c4_5 a_3 f_1 c'_5 | -c4^5 a^3 f^1 c'^5 | +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + c4_5 a_3 f_1 c'_5 | + c4^5 a^3 f^1 c'^5 | +} @end lilypond @code{direction} プロパティは和音では無視されますが、@c @@ -2040,10 +2051,12 @@ c4^5 a^3 f^1 c'^5 | @cindex fingering example (運指法記号の例) -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond @noindent @@ -2052,10 +2065,12 @@ c4^5 a^3 f^1 c'^5 | @cindex fingering example (運指法記号の例) -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond @code{\set fingeringOrientations} コマンドを使うことによって和音の中に@c @@ -2092,22 +2107,24 @@ LilyPond はこれらの制約を受け取り、 @cindex @code{\set}, example of using (@code{\set} の使用例) @cindex fingeringOrientations property, example (fingeringOrientations プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(left) -4 -4 | -\set fingeringOrientations = #'(up left down) -4 -4 -\set fingeringOrientations = #'(up left) -4 -4 | -\set fingeringOrientations = #'(right) -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} @end lilypond @noindent @@ -2116,23 +2133,25 @@ LilyPond はこれらの制約を受け取り、 デフォルト値は内部リファレンスの @code{Fingering} オブジェクトのページから @w{@code{-5}} であることがわかるので、@w{@code{-7}} にセットしてみましょう: -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\override Fingering.font-size = #-7 -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(left) -4 -4 | -\set fingeringOrientations = #'(up left down) -4 -4 -\set fingeringOrientations = #'(up left) -4 -4 | -\set fingeringOrientations = #'(right) -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + \override Fingering.font-size = #-7 + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} @end lilypond @@ -2209,15 +2228,13 @@ LilyPond はこれらの制約を受け取り、 @cindex ottava bracket (オッターバ囲み) @funindex \startTextSpan -@funindex startTextSpan @funindex \stopTextSpan -@funindex stopTextSpan @cindex TextSpanner, example of overriding (TextSpanner をオーバライドする例) @cindex bound-details property, example (bound-details プロパティの例) @c KEEP LY -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +@lilypond[quote,fragment,ragged-right,verbatim] % 以降のテキスト スパナの詳細を設定します \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } @@ -2225,18 +2242,18 @@ LilyPond はこれらの制約を受け取り、 \dynamicUp % オッターバ囲みの開始 \ottava #1 -c'4 \startTextSpan +c''4 \startTextSpan % 強弱テキストとヘアピンを付け加えます -c4\pp\< -c4 +c''4\pp\< +c''4 % テキスト スクリプトを付け加えます -c4^Text | -c4 c +c''4^Text | +c''4 c'' % 強弱テキストを付け加え、強弱ヘアピンを終わらせます -c4\ff c \stopTextSpan | +c''4\ff c'' \stopTextSpan | % オッターバ囲みを終わらせます \ottava #0 -c,4 c c c | +c'4 c' c' c' | @end lilypond この例はテキスト スパナ -- 音楽の上に置かれる延長線付きのテキスト -- の@c @@ -2268,7 +2285,7 @@ c,4 c c c | @cindex bound-details property, example (bound-details プロパティの例) @c KEEP LY -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +@lilypond[quote,fragment,ragged-right,verbatim] % 以降のテキスト スパナの詳細を設定します \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } @@ -2278,19 +2295,19 @@ c,4 c c c | \once \override Staff.OttavaBracket.outside-staff-priority = #340 % オッターバ囲みの開始 \ottava #1 -c'4 \startTextSpan +c''4 \startTextSpan % 強弱テキストを付け加えます -c4\pp +c''4\pp % 強弱の線スパナを付け加えます -c4\< +c''4\< % テキスト スクリプトを付け加えます -c4^Text | -c4 c +c''4^Text | +c''4 c'' % 強弱テキストを付け加えます -c4\ff c \stopTextSpan | +c''4\ff c'' \stopTextSpan | % オッターバ囲みを終わらせます \ottava #0 -c,4 c c c | +c'4 c' c' c' | @end lilypond これらのオブジェクトのいくつか @@ -2319,14 +2336,16 @@ c,4 c c c | @code{outside-staff-priority} 値に従って配置することができます。@c ここで、2 つの方法の効果を示す例を挙げます: -@lilypond[quote,verbatim,relative=2] -c4( c^\markup { \tiny \sharp } d4.) c8 | -c4( -\once \override TextScript.avoid-slur = #'inside -\once \override TextScript.outside-staff-priority = ##f -c4^\markup { \tiny \sharp } d4.) c8 | -\once \override Slur.outside-staff-priority = #500 -c4( c^\markup { \tiny \sharp } d4.) c8 | +@lilypond[quote,verbatim] +\relative c'' { + c4( c^\markup { \tiny \sharp } d4.) c8 | + c4( + \once \override TextScript.avoid-slur = #'inside + \once \override TextScript.outside-staff-priority = ##f + c4^\markup { \tiny \sharp } d4.) c8 | + \once \override Slur.outside-staff-priority = #500 + c4( c^\markup { \tiny \sharp } d4.) c8 | +} @end lilypond @code{outside-staff-priority} は、個々のオブジェクトの垂直方向の配置を@c @@ -2340,12 +2359,12 @@ c4( c^\markup { \tiny \sharp } d4.) c8 | @cindex TextScript, example of overriding (TextScript をオーバライドする例) @cindex outside-staff-priority property, example (outside-staff-priority プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" | +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | \once \override TextScript.outside-staff-priority = #500 -c2^"Text3" -c2^"Text4" | +c''2^"Text3" +c''2^"Text4" | @end lilypond これはたしかに @qq{Text3} を @qq{Text4} の上に配置しています。@c @@ -2365,9 +2384,7 @@ c2^"Text4" | @cindex notes, spreading out with text (テキストに合わせて音符の間隔を広げる) @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff デフォルトでは、音楽のレイアウトが考慮されている限り、@c マークアップによって作り出されるテキストは水平方向のスペースと関係しません。@c @@ -2375,12 +2392,12 @@ c2^"Text4" | テキストの配置に便宜をはかる必要がある限り、音符の間隔を広げます: @c KEEP LY -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,fragment,ragged-right,verbatim] \textLengthOn % 音符の間隔を広げてテキストに揃えます -c2^"Text1" -c2^"Text2" | -c2^"Text3" -c2^"Text4" | +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond デフォルトの動作に戻すためのコマンドは @code{\textLengthOff} です。@c @@ -2399,25 +2416,27 @@ c2^"Text4" | @cindex outside-staff-priority property, example (outside-staff-priority プロパティの例) @c KEEP LY -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -% このマークアップは短いため衝突は起きません -c2^"Tex" c'' | -R1 | - -% このマークアップは長くて納まりきらないため、上に押し上げられます -c,,2^"Text" c'' | -R1 | - -% 衝突回避を OFF にします -\once \override TextScript.outside-staff-priority = ##f -c,,2^"Long Text " c'' | -R1 | - -% 衝突回避を OFF にします -\once \override TextScript.outside-staff-priority = ##f -\textLengthOn % そして textLengthOn を ON にします -c,,2^"Long Text " % 後ろにスペースが付け加えられます -c''2 | +@lilypond[quote,ragged-right,verbatim] +\relative { + % このマークアップは短いため衝突は起きません + c''2^"Tex" c'' | + R1 | + + % このマークアップは長くて納まりきらないため、上に押し上げられます + c,,2^"Text" c'' | + R1 | + + % 衝突回避を OFF にします + \once \override TextScript.outside-staff-priority = ##f + c,,2^"Long Text " c'' | + R1 | + + % 衝突回避を OFF にします + \once \override TextScript.outside-staff-priority = ##f + \textLengthOn % そして textLengthOn を ON にします + c,,2^"Long Text " % 後ろにスペースが付け加えられます + c''2 | +} @end lilypond @@ -2437,13 +2456,15 @@ c''2 | このことは、以下の例のように、@c 到底受け入れられない結果を生み出す可能性があります: -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\clef "bass" -\key aes \major -\time 9/8 -\dynamicUp -bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | -ees,2.~\)\mf ees4 r8 | +@lilypond[quote,ragged-right,verbatim] +\relative { + \clef "bass" + \key aes \major + \time 9/8 + \dynamicUp + bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | + ees,2.~\)\mf ees4 r8 | +} @end lilypond しかしながら、音符とそれに付けられた強弱記号が互いに近い場合、@c @@ -2845,8 +2866,8 @@ LilyPond はまずスラーが取り得る位置のリストを生成し、そ @cindex Script, example of overriding (Script をオーバライドする例) @cindex padding property, example (padding プロパティの例) -@lilypond[quote,fragment,relative=1,verbatim] -c2\fermata +@lilypond[quote,fragment,verbatim] +c'2\fermata \override Script.padding = #3 b2\fermata @end lilypond @@ -2855,15 +2876,15 @@ b2\fermata @cindex padding property, example (padding プロパティの例) @c KEEP LY -@lilypond[quote,fragment,relative=1,verbatim] +@lilypond[quote,fragment,verbatim] % これは機能しません。この下を見てください \override MetronomeMark.padding = #3 \tempo 4 = 120 -c1 | +c'1 | % これは機能します \override Score.MetronomeMark.padding = #3 \tempo 4 = 80 -d1 | +d'1 | @end lilypond 2 番目の例では、ある特定のオブジェクトを扱うのはどのコンテキストなのかを@c @@ -2901,8 +2922,8 @@ d1 | @c KEEP LY @lilypond[quote,ragged-right,verbatim] sesquisharp = \markup { \sesquisharp } -\relative c'' { - c4 +\relative { + c''4 % これは 1.5 倍シャープを譜刻しますが、スペースが小さすぎます \once \override Accidental.stencil = #ly:text-interface::print \once \override Accidental.text = #sesquisharp @@ -2951,13 +2972,13 @@ sesquisharp = \markup { \sesquisharp } @cindex staff-padding property, example (staff-padding プロパティの例) @c KEEP LY -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,fragment,ragged-right,verbatim] \dynamicUp % 幅を 1 単位広げます \override DynamicText.extra-spacing-width = #'(-0.5 . 0.5) % 強弱記号を譜から 2 単位上のベース ラインに揃えます \override DynamicLineSpanner.staff-padding = #2 -a4\f b\mf c\mp b\p +\relative { a'4\f b\mf c\mp b\p } @end lilypond @@ -2973,11 +2994,11 @@ a4\f b\mf c\mp b\p @cindex StringNumber, example of overriding (StringNumber をオーバライドする例) @cindex self-alignment-X property, example (self-alignment-X プロパティの例) -@lilypond[quote,fragment,ragged-right,verbatim,relative=3] +@lilypond[quote,fragment,ragged-right,verbatim] \voiceOne - + \once \override StringNumber.self-alignment-X = #RIGHT - + @end lilypond @@ -2995,8 +3016,8 @@ LilyPond がそれと衝突するかもしれない音符を突き止めるの 同時に起こる音符と休符に対してのみ行われるからです。@c 以下に、このタイプの衝突の例を挙げます: -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] -<< { c4 c c c } \\ { R1 } >> +@lilypond[quote,verbatim,ragged-right] +<< \relative { c'4 c c c } \\ { R1 } >> @end lilypond ここでの最良の解決策は、複数小節に亘る休符を下へ移動させることです。@c @@ -3011,9 +3032,9 @@ LilyPond がそれと衝突するかもしれない音符を突き止めるの @cindex MultiMeasureRest, example of overriding (MultiMeasureRest をオーバライドする例) @cindex staff-position property, example (staff-position プロパティの例) -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] +@lilypond[quote,verbatim,ragged-right] << - { c4 c c c } + \relative { c'4 c c c } \\ \override MultiMeasureRest.staff-position = #-8 { R1 } @@ -3066,8 +3087,8 @@ f4-5 ここで、フレージング スラーとスラーが衝突している例を示します: -@lilypond[quote,verbatim,fragment,ragged-right,relative=2] -a8 \( ( a'16 ) a \) +@lilypond[quote,verbatim,ragged-right] +\relative { a'8 \( ( a'16 ) a \) } @end lilypond @cindex PhrasingSlur, example of overriding (PhrasingSlur をオーバライドする例) @@ -3079,9 +3100,9 @@ a8 \( ( a'16 ) a \) 設定すると、LilyPond は候補の中から両端の位置が最も設定に近いフレージング スラーを選択します: -@lilypond[quote,verbatim,fragment,ragged-right,relative=2] +@lilypond[quote,verbatim,fragment,ragged-right] \once \override PhrasingSlur.positions = #'(2.5 . 4.5) -a8 \( ( a'16 ) a \) +a'8 \( ( a''16 ) a'' \) @end lilypond これで改善されました。@c @@ -3100,12 +3121,12 @@ a8 \( ( a'16 ) a \) { \time 4/2 << - { c'1 ~ c'2. e'8 f' } + { c'1 ~ 2. e'8 f' } \\ { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } >> << - { c'1 ~ c'2. e'8 f' } + { c'1 ~ 2. e'8 f' } \\ { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } >> @@ -3123,7 +3144,7 @@ a8 \( ( a'16 ) a \) { \time 4/2 << - { c'1 ~ c'2. e'8 f' } + { c'1 ~ 2. e'8 f' } \\ { \override Beam.positions = #'(-1 . -1) @@ -3131,7 +3152,7 @@ a8 \( ( a'16 ) a \) } >> << - { c'1 ~ c'2. e'8 f' } + { c'1 ~ 2. e'8 f' } \\ { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } >> @@ -3152,10 +3173,10 @@ a8 \( ( a'16 ) a \) この例は以下のような状態でした: @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { 2 des } \\ @@ -3186,10 +3207,10 @@ a8 \( ( a'16 ) a \) @cindex force-hshift property, example (force-hshift プロパティの例) @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { 2 @@ -3231,9 +3252,9 @@ a8 \( ( a'16 ) a \) @c line-width ensures no break @c KEEP LY @lilypond[quote,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3273,8 +3294,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3316,9 +3337,9 @@ LilyPond はうまく衝突を回避できるからです。 @c line-width ensures no break @c KEEP LY @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4. g8 | + r2 c''4. g8 | bes1~ | \time 6/4 bes2. r8 @@ -3327,7 +3348,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % メイン ボイスの続き \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3342,8 +3363,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2 | +lhMusic = \relative { + r2 2 | 1 | r2. d,,4 r4 r | r4 @@ -3377,9 +3398,9 @@ lhMusic = \relative c' { @c line-width ensures no break @c KEEP LY @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | bes1~ | \time 6/4 bes2. r8 @@ -3388,7 +3409,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % メイン ボイスの続き \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3403,8 +3424,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1) | r2. d,,4 r4 r | r4 @@ -3453,9 +3474,9 @@ lhMusic = \relative c' { @c line-width ensures no break @c KEEP LY @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3466,7 +3487,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % メイン ボイスの続き \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3481,8 +3502,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3535,9 +3556,9 @@ lhMusic = \relative c' { @c line-width ensures no break @c KEEP LY @lilypond[quote,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3550,7 +3571,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % メイン ボイスの続き \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3567,8 +3588,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3614,9 +3635,9 @@ C はシフト off のボイス 2 の中にあり、2 つの D はボイス 1 @c line-width ensures no break @c KEEP LY @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3649,8 +3670,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3687,9 +3708,9 @@ lhMusic = \relative c' { @c line-width ensures no break @c KEEP LY @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3729,8 +3750,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3793,8 +3814,8 @@ lhMusic = \relative c' { 通常、タイで結べるのは同じボイスの中にある 2 つ音符だけです。@c 2 つのボイスを使い、そのうちの 1 つにタイで結んだ音符を置きます: -@lilypond[quote,fragment,relative=2] -<< { b8~ b\noBeam } \\ { b8[ g] } >> +@lilypond[quote] +<< { b'8~ 8\noBeam } \\ { b'8[ g'] } >> @end lilypond @noindent @@ -3808,7 +3829,7 @@ lhMusic = \relative c' { << { \tweak Stem.transparent ##t - b8~ b\noBeam + b8~ 8\noBeam } \\ { b8[ g] } @@ -3823,7 +3844,7 @@ lhMusic = \relative c' { { \tweak Stem.transparent ##t \tweak Stem.length #8 - b8~ b\noBeam + b8~ 8\noBeam } \\ { b8[ g] } @@ -3846,7 +3867,7 @@ lhMusic = \relative c' { \single \hide Stem \single \hide Flag \tweak Stem.length #8 - b8~ b\noBeam + b8~ 8\noBeam } \\ { b8[ g] } @@ -3892,10 +3913,10 @@ lhMusic = \relative c' { @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a + a'4 a a \once \hide Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 @@ -3914,10 +3935,10 @@ lhMusic = \relative c' { @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a + a'4 a a \once \omit Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 @@ -4003,10 +4024,10 @@ normal = { global = { \key c \major \time 4/4 \partial 4 } -SopranoMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopranoMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyrics { E -- | ter -- nal \emphasize Fa -- ther, | \normal strong to save, @@ -4070,13 +4091,13 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4104,7 +4125,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @end example @@ -4122,9 +4143,9 @@ inst = @example \include "definitions.ily" -\relative c'' @{ +\relative @{ \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4143,13 +4164,13 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4180,7 +4201,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -4213,7 +4234,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4234,9 +4255,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4265,7 +4286,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -4299,7 +4320,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4316,9 +4337,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4539,7 +4560,7 @@ Scheme プロシージャをセットすることができます。@c ((0) (x11-color 'violet )) ; for B ))) -\relative c' { +\relative { % Arrange to obtain color from color-notehead procedure \override NoteHead.color = #color-notehead a2 b | c2 d | e2 f | g2 a | diff --git a/Documentation/ja/macros.itexi b/Documentation/ja/macros.itexi index b15306d257..2530ab362a 100644 --- a/Documentation/ja/macros.itexi +++ b/Documentation/ja/macros.itexi @@ -1,6 +1,6 @@ @c -*- coding: utf-8; mode: texinfo; -*- @ignore - Translation of GIT committish: d5647c5fd1c38d4124d2374725b923f4901f3661 + Translation of GIT committish: 211937747d4adbae18d6ce41f88dffbb3ca04a5f When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -106,14 +106,13 @@ translations should be in macros.itexi. @end cartouche @end macro + @macro lilyTitlePage{TITLE} @c This produces the unified index @syncodeindex fn cp @syncodeindex vr cp - - @c ***** Copyright stuff ***** @ifset FDL @copying @@ -125,10 +124,6 @@ GNU フリー文書利用許諾契約書バージョン 1.1 またはフリー @end copying @end ifset - - - - @ifclear FDL @copying This document has been placed in the public domain. @@ -190,7 +185,7 @@ LilyPond バージョン @version{} 用 @end macro @c Due to a bug in texi2html (texi2html.pl CVS versions <= 1.245) -@c the macro must not be empty. +@c the next macro must not be empty. @macro endpredefined @c @@ -778,7 +773,7 @@ The @qq{X image} is not a registered trademark. It was created by placed under the GNU Free Documentation License version 1.2 or later. We found the image on @uref{http://commons.wikimedia.org/wiki/File:Mac_OS_X_Userbox_X.png, -this Wikipedia Commons page}. +this Wikimedia Commons page}. @end macro @@ -789,7 +784,7 @@ trademark. It was created by placed under the GNU Free Documentation License version 1.2. We found the image on @uref{http://commons.wikimedia.org/wiki/Category:Microsoft_Windows_logos, -this Wikipedia Commons page}. +this Wikimedia Commons page}. @end macro diff --git a/Documentation/ja/notation.tely b/Documentation/ja/notation.tely index 0afb531979..ab84313ba6 100644 --- a/Documentation/ja/notation.tely +++ b/Documentation/ja/notation.tely @@ -21,7 +21,7 @@ @c `Notation Reference' was born 1999-10-11 with git commit 940dda0... @macro copyrightDeclare -Copyright @copyright{} 1999--2012 by 著作者一同 +Copyright @copyright{} 1999--2015 by 著作者一同 @end macro diff --git a/Documentation/ja/notation/changing-defaults.itely b/Documentation/ja/notation/changing-defaults.itely index 8d3c5b837c..b9aa8ebc54 100644 --- a/Documentation/ja/notation/changing-defaults.itely +++ b/Documentation/ja/notation/changing-defaults.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.22" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -320,14 +320,14 @@ LilyPond は、適切なコンテキストが存在しないうちに音楽表 score を作成するのに用いられます: @c KEEP LY -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - \new Staff { + \new Staff \relative { % 暗黙的に Voice コンテキストが作成されます - c4 c + c''4 c } - \new Staff { - d4 d + \new Staff \relative { + d''4 d } >> @end lilypond @@ -335,18 +335,16 @@ score を作成するのに用いられます: @noindent そして、1 つの譜に複数のボイスが配置されます: -@lilypond[quote,verbatim,relative=2] -<< - \new Staff << - \new Voice { - \voiceOne - c8 c c4 c c - } - \new Voice { - \voiceTwo - g4 g g g - } - >> +@lilypond[quote,verbatim] +\new Staff << + \new Voice \relative { + \voiceOne + c''8 c c4 c c + } + \new Voice \relative { + \voiceTwo + g'4 g g g + } >> @end lilypond @@ -363,18 +361,16 @@ score を作成するのに用いられます: 例え同じ名前を持つコンテキストが存在していたとしても、常に全く新たな@c コンテキストを作成します: -@lilypond[quote,verbatim,relative=2] -<< - \new Staff << - \new Voice = "A" { - \voiceOne - c8 c c4 c c - } - \new Voice = "A" { - \voiceTwo - g4 g g g - } - >> +@lilypond[quote,verbatim] +\new Staff << + \new Voice = "A" \relative { + \voiceOne + c''8 c c4 c c + } + \new Voice = "A" \relative { + \voiceTwo + g'4 g g g + } >> @end lilypond @@ -404,13 +400,13 @@ score を作成するのに用いられます: % 音楽コンテンツ \context Voice = "one" { - \relative c'' { - c4 c c c + \relative { + c''4 c c c } } \context Voice = "two" { - \relative c'' { - g8 g g4 g g + \relative { + g'8 g g4 g g } } >> @@ -433,13 +429,13 @@ score を作成するのに用いられます: % 音楽コンテンツ \context Voice = "one" { - \relative c'' { - c4 c c c + \relative { + c''4 c c c } } \context Voice = "two" { - \relative c'' { - g8 g g4 g g + \relative { + g'8 g g4 g g } } >> @@ -464,8 +460,8 @@ score を作成するのに用いられます: プロシージャを実行させるのに用いられます: @example -\new Staff \relative c' @{ - c1 +\new Staff \relative @{ + c'1 \context Timing \applyContext #(lambda (ctx) (newline) @@ -551,8 +547,8 @@ score を作成するのに用いられます: @c KEEP LY @lilypond[quote,verbatim] -musicA = \relative c'' { d4 d d d } -musicB = \relative c'' { g4 g g g } +musicA = \relative { d''4 d d d } +musicB = \relative { g'4 g g g } keepVoicesAlive = { << \new Voice = "A" { s1*5 } % Voice "A" を 5 小節の間、維持する @@ -591,8 +587,8 @@ music = { @c KEEP LY @lilypond[quote,verbatim] -melody = \relative c'' { a4 a a a } -accompaniment = \relative c' { d4 d d d } +melody = \relative { a'4 a a a } +accompaniment = \relative { d'4 d d d } words = \lyricmode { These words fol -- low the mel -- o -- dy } \score { << @@ -631,14 +627,14 @@ words = \lyricmode { These words fol -- low the mel -- o -- dy } @c KEEP LY @lilypond[quote,verbatim] -melody = \relative c'' { +melody = \relative { s1 % 1 小節スキップします - a4 a a a + a'4 a a a s1 % 1 小節スキップします a4 a a a } -accompaniment = \relative c' { - d4 d d d +accompaniment = \relative { + d'4 d d d d4 d d d d4 d d d d4 d d d @@ -868,8 +864,8 @@ Internals Reference @expansion{} Translation @expansion{} Context. @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Thicker stems" a a a + \relative { + a'4^"Thicker stems" a a a a4 a a\ff a } \layout { @@ -886,8 +882,8 @@ Internals Reference @expansion{} Translation @expansion{} Context. @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a\ff a } \layout { @@ -905,8 +901,8 @@ Internals Reference @expansion{} Translation @expansion{} Context. @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Dynamics above" a a a + \relative { + a'4^"Dynamics above" a a a a4 a a\ff a } \layout { @@ -933,8 +929,8 @@ StaffDefaults = \with { \score { \new Staff { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -961,8 +957,8 @@ StaffDefaults = \with { @lilypond[quote,verbatim] \score { \new Staff { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -1013,8 +1009,8 @@ StaffDefaults = \with { \override Stem.thickness = #4.0 } { - \relative c'' { - a4^"Thick stems" a a a + \relative { + a'4^"Thick stems" a a a a4 a a a } } @@ -1029,8 +1025,8 @@ StaffDefaults = \with { \score { << \new Staff { - \relative c'' { - a4^"Default font" a a a + \relative { + a'4^"Default font" a a a a4 a a a } } @@ -1038,8 +1034,8 @@ StaffDefaults = \with { \with { fontSize = #-4 } { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -1055,8 +1051,8 @@ StaffDefaults = \with { << \new Staff { \new Voice { - \relative c'' { - a4^"Dynamics below" a a a + \relative { + a'4^"Dynamics below" a a a a4 a a\ff a } } @@ -1067,8 +1063,8 @@ StaffDefaults = \with { \new Voice \with { \dynamicUp } { - \relative c'' { - a4^"Dynamics above" a a a + \relative { + a'4^"Dynamics above" a a a a4 a a\ff a } } @@ -1122,17 +1118,11 @@ StaffDefaults = \with { @cindex engravers, including in contexts (エングラーバをコンテキストに含める) @funindex \alias -@funindex alias @funindex \name -@funindex name @funindex \type -@funindex type @funindex \consists -@funindex consists @funindex \accepts -@funindex accepts @funindex \denies -@funindex denies @code{Staff} や @code{Voice} のようなコンテキストは、@c 簡単なブロックの組み合わせで構成されています。 @@ -1162,8 +1152,8 @@ StaffDefaults = \with { \accepts "ImproVoice" }} -\relative c'' { - a4 d8 bes8 \new ImproVoice { c4^"ad lib" c +\relative { + a'4 d8 bes8 \new ImproVoice { c4^"ad lib" c c4 c^"undress" c_"while playing :)" c } a1 } @@ -1284,8 +1274,8 @@ squashedPosition = #0 それから、このサブセクションの最初にあった出力を入力します: @example -\relative c'' @{ - a4 d8 bes8 +\relative @{ + a'4 d8 bes8 \new ImproVoice @{ c4^"ad lib" c c4 c^"undress" @@ -1963,7 +1953,7 @@ Scheme 値の循環参照は、ハング アップまたはクラッシュ、@c 通常、コンテキスト プロパティの名前は、@c 小文字で始まる単語に大文字で始まる単語をつなげたものです。@c これらはたいてい音楽から記譜への翻訳を制御します --- 例えば、@code{localKeySignature} (臨時記号を表示するかどうかを決定します) +-- 例えば、@code{localAlterations} (臨時記号を表示するかどうかを決定します) や、@code{measurePosition} (小節線を表示するタイミングを決定します) です。@c コンテキスト プロパティは、楽曲の解釈をしている間、@c ずっと値を変更しておくことができます。@c @@ -1985,17 +1975,16 @@ R1*2 (一般に、@code{ChordNames}, @code{Voice}, @code{TabVoice}, あるいは @code{Lyrics} です)。 -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \set Score.autoBeaming = ##f -<< - { - e8 e e e - \set autoBeaming = ##t - e8 e e e - } \\ { - c8 c c c c8 c c c - } ->> +\relative { + e''8 e e e + \set autoBeaming = ##t + e8 e e e +} \\ +\relative { + c''8 c c c c8 c c c +} @end lilypond 変更は @q{オンザフライ} (その場、その時々) で適用されるため、@c @@ -2008,7 +1997,7 @@ R1*2 (この場合は、@code{Voice} です) にセットしようと試みても、効果はありません。@c なぜなら、@code{skipBars} は @code{Score} コンテキストのプロパティだからです。 -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] R1*2 \set skipBars = ##t R1*2 @@ -2032,18 +2021,17 @@ R1*2 音楽表記を囲っているコンテキストにセットされたプロパティは、@c 囲まれているコンテキストの中にある @code{\unset} では変更されません: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \set Score.autoBeaming = ##t -<< - { - \unset autoBeaming - e8 e e e - \unset Score.autoBeaming - e8 e e e - } \\ { - c8 c c c c8 c c c - } ->> +\relative { + \unset autoBeaming + e''8 e e e + \unset Score.autoBeaming + e8 e e e +} \\ +\relative { + c''8 c c c c8 c c c +} @end lilypond @code{\set} と同様に、 @@ -2063,11 +2051,11 @@ R1*2 @code{\set} の前に @code{\once} を置くと、@c その設定は単一の時間ステップにだけ適用されます: -@lilypond[quote,verbatim,relative=2] -c4 +@lilypond[quote,fragment,verbatim] +c''4 \once \set fontSize = #4.7 -c4 -c4 +c''4 +c''4 @end lilypond 利用可能なすべてのコンテキスト プロパティについての完全な記述は、@c @@ -2112,27 +2100,27 @@ Translation @expansion{} Tunable context properties. 例えば、@code{Stem} オブジェクトの @code{thickness} プロパティを@c オーバライドすることによって、符幹の太さを太くすることができます: -@lilypond[quote,verbatim,relative=2] -c4 c +@lilypond[quote,fragment,verbatim] +c''4 c'' \override Voice.Stem.thickness = #3.0 -c4 c +c''4 c'' @end lilypond @code{\override} でコンテキストが指定されていない場合、その下にある@c コンテキストに適用されます: -@lilypond[quote,verbatim,relative=2] -{ \override Staff.Stem.thickness = #3.0 - << - { - e4 e - \override Stem.thickness = #0.5 - e4 e - } \\ { - c4 c c c - } - >> -} +@lilypond[quote,fragment,verbatim] +\override Staff.Stem.thickness = #3.0 +<< + \relative { + e''4 e + \override Stem.thickness = #0.5 + e4 e + } \\ + \relative { + c''4 c c c + } +>> @end lilypond 調整可能なオプションには @q{サブプロパティ} があり、これはプロパティの@c @@ -2164,32 +2152,33 @@ c4 c 例を示します: -@lilypond[quote,verbatim,relative=2] -c4 -\override Voice.Stem.thickness = #3.0 -c4 c -\revert Voice.Stem.thickness -c4 +@lilypond[quote,verbatim] +\relative { + c''4 + \override Voice.Stem.thickness = #3.0 + c4 c + \revert Voice.Stem.thickness + c4 +} @end lilypond @code{\override} と @code{\revert} の効果は、@c その時点から影響を受けるコンテキストの中にある@c すべてのグラフィカル オブジェクトに適用されます: -@lilypond[quote,verbatim,relative=2] -{ - << - { - e4 - \override Staff.Stem.thickness = #3.0 - e4 e e - } \\ { - c4 c c - \revert Staff.Stem.thickness - c4 - } - >> -} +@lilypond[quote,verbatim] +<< + \relative { + e''4 + \override Staff.Stem.thickness = #3.0 + e4 e e + } \\ + \relative { + c''4 c c + \revert Staff.Stem.thickness + c4 + } +>> @end lilypond @funindex \once @@ -2198,19 +2187,18 @@ c4 @code{\once} を @code{\override} と共に用いることで、@c カレントの時間ステップだけに効果を与えることができます: -@lilypond[quote,verbatim,relative=2] -{ - << - { - \override Stem.thickness = #3.0 - e4 e e e - } \\ { - c4 - \once \override Stem.thickness = #3.0 - c4 c c - } - >> -} +@lilypond[quote,verbatim] +<< + \relative c { + \override Stem.thickness = #3.0 + e''4 e e e + } \\ + \relative { + c''4 + \once \override Stem.thickness = #3.0 + c4 c c + } +>> @end lilypond @@ -2281,16 +2269,18 @@ graphical objects. For objects that are created directly from an item in the input file, you can use the @code{\tweak} command. For example: -@lilypond[relative=2,verbatim,quote] -< c - \tweak color #red - d - g - \tweak duration-log #1 - a -> 4 --\tweak padding #8 --^ +@lilypond[verbatim,quote] +\relative { + < c'' + \tweak color #red + d + g + \tweak duration-log #1 + a + > 4 + -\tweak padding #8 + -^ +} @end lilypond @@ -2316,15 +2306,15 @@ note, and able to modify it. So, this works: -@lilypond[relative=2,verbatim,quote] -<\tweak color #red c>4 +@lilypond[verbatim,fragment,quote] +<\tweak color #red c''>4 @end lilypond @noindent but this does not: -@lilypond[relative=2,verbatim,quote] -\tweak color #red c4 +@lilypond[verbatim,fragment,quote] +\tweak color #red c''4 @end lilypond @end ignore @@ -2353,20 +2343,20 @@ but this does not: 以下の例では、和音の中にある符頭の 1 つの色を変更し、@c さらに他の符頭のタイプを変更しています: -@lilypond[relative=2,verbatim,quote] -< c +@lilypond[verbatim,fragment,quote] +< c'' \tweak color #red - d - g + d'' + g'' \tweak duration-log #1 - a + a'' > 4 @end lilypond @code{\tweak} を用いて、スラーを変更することができます: -@lilypond[verbatim,quote,relative=1] -c-\tweak thickness #5 ( d e f) +@lilypond[verbatim,quote] +\relative { c'-\tweak thickness #5 ( d e f) } @end lilypond @@ -2379,10 +2369,10 @@ c-\tweak thickness #5 ( d e f) オブジェクトは @code{EventChord} の内部にあるイベントによって作成される@c からです: -@lilypond[relative=2,verbatim,quote] -\tweak color #red c4 -\tweak color #red 4 -<\tweak color #red c e>4 +@lilypond[verbatim,fragment,quote] +\tweak color #red c''4 +\tweak color #red 4 +<\tweak color #red c'' e''>4 @end lilypond 単純な @code{\tweak} コマンドでは入力から直接作成されないオブジェクトを@c @@ -2396,10 +2386,10 @@ c-\tweak thickness #5 ( d e f) オブジェクト名を明示的に指定した @code{\tweak} コマンドを用いることで@c 調整することができます: -@lilypond[relative=2,verbatim,quote] +@lilypond[fragment,verbatim,quote] \tweak Stem.color #red -\tweak Beam.color #green c8 e -4 +\tweak Beam.color #green c''8 e'' +4 @end lilypond @code{\tweak} コマンドで音部記号や拍子記号を変更することはできません。@c @@ -2410,14 +2400,14 @@ c-\tweak thickness #5 ( d e f) 記譜要素の前に複数の @code{\tweak} コマンドを配置することができます -- それらはすべて効果を持ちます: -@lilypond[verbatim,quote,relative=1] -c --\tweak style #'dashed-line --\tweak dash-fraction #0.2 --\tweak thickness #3 --\tweak color #red - \glissando -f' +@lilypond[verbatim,fragment,quote] +c' + -\tweak style #'dashed-line + -\tweak dash-fraction #0.2 + -\tweak thickness #3 + -\tweak color #red + \glissando +f'' @end lilypond 入力ファイルのあるセクションから生成される音楽の流れ @@ -2575,7 +2565,7 @@ property (modified with @code{\set}) was created. ネストされた宣言を用いてキー値を個々に更新する方が安全です。 @warning{ネストされた宣言は、コンテキスト プロパティ連想配列 -(@code{beamExceptions}, @code{keySignature}, @code{timeSignatureSettings} 等) +(@code{beamExceptions}, @code{keyAlterations}, @code{timeSignatureSettings} 等) に対しては機能しません。@c これらのプロパティを変更するには、@c 連想配列として丸ごと再定義するしかありません。} @@ -2752,11 +2742,13 @@ property (modified with @code{\set}) was created. 方向指示子は、その後にくる音符だけに効果を持ちます: -@lilypond[verbatim,quote,relative=2] -c2( c) -c2_( c) -c2( c) -c2^( c) +@lilypond[verbatim,quote] +\relative { + c''2( c) + c2_( c) + c2( c) + c2^( c) +} @end lilypond @node 方向プロパティ @@ -2806,13 +2798,15 @@ TrillPitchGroup - not tried これらの指示子は、キャンセルされるまで効果を持ちます。 -@lilypond[verbatim,quote,relative=2] -c2( c) -\slurDown -c2( c) -c2( c) -\slurNeutral -c2( c) +@lilypond[verbatim,quote] +\relative { + c''2( c) + \slurDown + c2( c) + c2( c) + \slurNeutral + c2( c) +} @end lilypond 多声の音楽では、一般的にオブジェクトの向きを変えるよりも明示的に @@ -2910,22 +2904,22 @@ Scheme 関数 @code{magstep} を使用することができます。@c 譜線の本数は、@code{'line-positions} の値リストの中にある要素数によって、@c 暗黙的に定義されます。} -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.line-positions = #'(7 3 0 -4 -6 -7) } -{ a4 e' f b | d1 } +\relative { a4 e' f b | d1 } @end lilypond 譜の幅を変更することができます。@c 単位は譜スペースです。@c 譜内部のオブジェクトのスペースは、この設定によって影響を受けません。 -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.width = #23 } -{ a4 e' f b | d1 } +\relative { a4 e' f b | d1 } @end lilypond @@ -2989,12 +2983,12 @@ Works not at all for: @end ignore @c KEEP LY -@lilypond[verbatim,quote,relative=2] -a~a -a +@lilypond[verbatim,quote,fragment] +a'~ a' +a' % タイの長さを増加させます -\tweak minimum-length #5 -~a +~ a' @end lilypond @c KEEP LY @@ -3009,26 +3003,30 @@ a1 @end lilypond @c KEEP LY -@lilypond[verbatim,quote,relative=2] -a \< a a a \! -% ヘアピンの長さを増加させます -\override Hairpin.minimum-length = #20 -a \< a a a \! +@lilypond[verbatim,quote] +\relative { + a' \< a a a \! + % ヘアピンの長さを増加させます + \override Hairpin.minimum-length = #20 + a \< a a a \! +} @end lilypond さらに、このオーバライドはスラーとフレージング スラーの長さを@c 増加させるためにも使用されます: -@lilypond[verbatim,quote,relative=2] -a( a) -a --\tweak minimum-length #5 -( a) +@lilypond[verbatim,quote] +\relative { + a'( g) + a + -\tweak minimum-length #5 + ( g) -a\( a\) -a --\tweak minimum-length #5 -\( a\) + a\( g\) + a + -\tweak minimum-length #5 + \( g\) +} @end lilypond いくつかのレイアウト オブジェクトでは、@c @@ -3042,32 +3040,32 @@ a 効果を持ちません: @c KEEP LY -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,fragment,quote] % デフォルト -e \glissando c' +e' \glissando c'' % 単独では効果を持ちません \once \override Glissando.minimum-length = #20 -e, \glissando c' +e' \glissando c'' % 以下の両方のオーバライドが存在する場合にのみ、効果を持ちます \once \override Glissando.minimum-length = #20 \once \override Glissando.springs-and-rods = #ly:spanner::set-spacing-rods -e, \glissando c' +e' \glissando c'' @end lilypond @code{Beam} オブジェクトでも同じことが言えます: @c KEEP LY -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,fragment,quote] % 単独では効果を持ちません \once \override Beam.minimum-length = #20 -e8 e e e +e'8 e' e' e' % 以下の両方のオーバライドが存在する場合にのみ、効果を持ちます \once \override Beam.minimum-length = #20 \once \override Beam.springs-and-rods = #ly:spanner::set-spacing-rods -e8 e e e +e'8 e' e' e' @end lilypond @subsubsubheading The @code{to-barline} プロパティ @@ -3079,10 +3077,12 @@ e8 e e e 直前の小節線のところで終了させられます。@c 偽に設定すると、スパナは小節線を越えて、音符のところで終了します: -@lilypond[verbatim,quote,relative=2] -a \< a a a a \! a a a \break -\override Hairpin.to-barline = ##f -a \< a a a a \! a a a +@lilypond[verbatim,quote] +\relative { + a' \< a a a a \! a a a \break + \override Hairpin.to-barline = ##f + a \< a a a a \! a a a +} @end lilypond このプロパティはすべてのスパナに対して効果を持つわけではありません。@c @@ -3115,11 +3115,11 @@ a \< a a a a \! a a a プロパティ階層内で 2 階層下にネストされていますが、@c この @code{\override} コマンドは非常にシンプルです: -@lilypond[relative=2,quote,verbatim] -e2 \glissando b +@lilypond[quote,fragment,verbatim] +e''2 \glissando b' \once \override Glissando.bound-details.left.Y = #3 \once \override Glissando.bound-details.right.Y = #-2 -e2 \glissando b +e''2 \glissando b' @end lilypond @code{Y} プロパティの単位は @code{staff-space} であり、@c @@ -3284,7 +3284,7 @@ c2 \< c2 c2 関数は呼び出されず、そのオブジェクトは描画されません。@c @code{\rever} でデフォルトの動作に戻すことができます。 -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,fragment,verbatim] a1 a \omit Score.BarLine a a @@ -3303,10 +3303,10 @@ a a a @code{#t} にセットされると、そのオブジェクトはスペースを占めたままですが、@c 不可視になります。 -@lilypond[quote,verbatim,relative=2] -a4 a +@lilypond[quote,fragment,verbatim] +a'4 a' \once \hide NoteHead -a a +a' a' @end lilypond @node オブジェクトを白で描く @@ -3330,9 +3330,9 @@ a a これにより、以下に示すように、@c 白いオブジェクトの画像が幽霊のように浮かび上がることがあります: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \override Staff.Clef.color = #white -a1 +a'1 @end lilypond オブジェクトの描画順序を変更することにより、これを回避することができます。@c @@ -3359,10 +3359,10 @@ a1 より小さな値 -- 例えば、@code{-1} -- を与えて、@c 音部記号を先に描画させる必要があります: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \override Staff.Clef.color = #white \override Staff.Clef.layer = #-1 -a1 +a'1 @end lilypond @node break-visibility を用いる @@ -3451,14 +3451,16 @@ a1 以下の例は、小節線の可視性を制御するベクトルの使用方法を示しています: @c KEEP LY -@lilypond[quote,verbatim,relative=1,ragged-right] -f4 g a b -f4 g a b -% カレント行の最後で小節線を削除します -\once \override Score.BarLine.break-visibility = #'#(#f #t #t) -\break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + f'4 g a b + f4 g a b + % カレント行の最後で小節線を削除します + \once \override Score.BarLine.break-visibility = #'#(#f #t #t) + \break + f4 g a b + f4 g a b +} @end lilypond @code{break-visibility} をオーバライドするために使用される@c @@ -3499,16 +3501,18 @@ f4 g a b B フラット メジャーへの明示的な変更の後に出現する調号は可視のままです。 @c KEEP LY -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -% すべての調号を削除しようと試みます -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b -\break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + % すべての調号を削除しようと試みます + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b + \break + f4 g a b + f4 g a b +} @end lilypond そのような明示的な調号や音部記号の変更の可視性は @@ -3527,15 +3531,17 @@ f4 g a b オブジェクトを削除するには適切な @code{break-visibility} をオーバライドする必要があります。 -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond @subsubsubheading 前の調をキャンセルする臨時記号の可視性 @@ -3544,16 +3550,18 @@ f4 g a b @code{Staff} コンテキスト プロパティ @code{printKeyCancellation} に @code{#f} をセットします: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\set Staff.printKeyCancellation = ##f -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \set Staff.printKeyCancellation = ##f + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond このオーバライドによって、調の変更を示す臨時記号だけが残ります。 @@ -3564,30 +3572,34 @@ f4 g a b そのようなケースでは、@code{printKeyCancellation} を @code{#f} に@c 設定しても効果はありません: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\set Staff.printKeyCancellation = ##f -\key c \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \set Staff.printKeyCancellation = ##f + \key c \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond 調を C@tie{}メジャーや A@tie{}マイナーに変更する場合に、@c 前の調をキャンセルする臨時記号を消すには、@code{KeyCancellation} グラフィカル オブジェクトの可視性をオーバライドします: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\override Staff.KeyCancellation.break-visibility = #all-invisible -\key c \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \override Staff.KeyCancellation.break-visibility = #all-invisible + \key c \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond @c TODO Add visibility of cautionary accidentals before notes @@ -3668,10 +3680,12 @@ d,2 \glissando d'2 それらをオーバライドすることもできます: @c TODO Complete -@lilypond[relative=2,ragged-right,verbatim,quote] -e2 \glissando f -\once \override Glissando.bound-details.right.Y = #-2 -e2 \glissando f +@lilypond[ragged-right,verbatim,quote] +\relative { + e''2 \glissando f + \once \override Glissando.bound-details.right.Y = #-2 + e2 \glissando f +} @end lilypond グリッサンドの終点の @code{Y} には @code{-2} がセットされています。@c @@ -3721,10 +3735,10 @@ e2 \glissando f レイアウト オブジェクトを回転させることが有用な状況はあまりありません。@c 以下の例は、有用であるかもしれないシチュエーションの 1 つを示しています: -@lilypond[quote,verbatim,relative=1] -g4\< e' d' f\! +@lilypond[quote,fragment,verbatim] +g4\< e' d'' f''\! \override Hairpin.rotation = #'(20 -1 0) -g,,4\< e' d' f\! +g4\< e' d'' f''\! @end lilypond @node マークアップを回転させる @@ -3742,12 +3756,12 @@ g,,4\< e' d' f\! セットしています。@c そうしなければテキストのいくつかは高く押し上げられてしまいます。 -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,fragment,verbatim] \override TextScript.outside-staff-priority = ##f g4^\markup { \rotate #30 "a G" } b^\markup { \rotate #30 "a B" } -des^\markup { \rotate #30 "a D-Flat" } -fis^\markup { \rotate #30 "an F-Sharp" } +des'^\markup { \rotate #30 "a D-Flat" } +fis'^\markup { \rotate #30 "an F-Sharp" } @end lilypond @@ -3854,13 +3868,13 @@ fis^\markup { \rotate #30 "an F-Sharp" } 以下の例は、3 つの音符を示していて、1 つはデフォルト配置の運指記号を持ち、@c 他の 2 つの運指記号は @code{X-offset} と @code{Y-offset} が変更されています。 -@lilypond[verbatim,quote,relative=2] -a-3 -a +@lilypond[verbatim,fragment,quote] +a'-3 +a' -\tweak X-offset #0 -\tweak Y-offset #0 -3 -a +a' -\tweak X-offset #-1 -\tweak Y-offset #1 -3 @@ -3942,7 +3956,7 @@ a @code{\tweak} コマンドを用いることで@c 単一の音符に付けられている複数の注釈を個別に揃えることができます: -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim,fragment] a' -\tweak self-alignment-X #-1 ^"left-aligned" @@ -3982,8 +3996,8 @@ a' 以下の例は、運指記号を符頭に近づけるための調整方法を示しています。 @c KEEP LY -@lilypond[quote,verbatim,relative=2] -a +@lilypond[quote,verbatim,fragment] +a' -\tweak self-alignment-X #0.5 % 左方向に移動させます -\tweak Y-offset #ly:self-alignment-interface::y-aligned-on-self -\tweak self-alignment-Y #-1 % 上方向に移動させます @@ -4037,26 +4051,26 @@ example shows the difference: リハーサル記号と小節番号はオブジェクトの上で水平方向に中央揃えされます: @c KEEP LY -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % リハーサル記号は音部記号の上に中央揃えされます \override Score.RehearsalMark.break-align-symbols = #'(clef) \key a \major \clef treble \mark "↓" -e1 +e'1 % リハーサル記号は拍子記号の上に中央揃えされます \override Score.RehearsalMark.break-align-symbols = #'(time-signature) \key a \major \clef treble \time 3/4 \mark "↓" -e2. +e'2. % リハーサル記号はブレス記号の上に中央揃えされます \override Score.RehearsalMark.break-align-symbols = #'(breathing-sign) \key a \major \clef treble \time 4/4 -e1 +e'1 \breathe \mark "↓" @end lilypond @@ -4071,20 +4085,20 @@ e1 小節線が不可視である場合、小節線があるはずの場所に揃えられます。 @c KEEP LY -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % リハーサル記号は調号の上に中央揃えされます \override Score.RehearsalMark.break-align-symbols = #'(key-signature clef) \key a \major \clef treble \mark "↓" -e1 +e'1 % リハーサル記号は音部記号の上に中央揃えされます \set Staff.explicitKeySignatureVisibility = #all-invisible \override Score.RehearsalMark.break-align-symbols = #'(key-signature clef) -\key a \minor +\key a \major \clef bass \mark "↓" -gis,,1 +gis,1 % リハーサル記号は小節線の上に中央揃えされます \set Staff.explicitKeySignatureVisibility = #all-invisible \set Staff.explicitClefVisibility = #all-invisible @@ -4092,7 +4106,7 @@ gis,,1 \key a \major \clef treble \mark "↓" -e''1 +e'1 @end lilypond 以下の例で示すように、@c @@ -4100,24 +4114,24 @@ e''1 複数の譜を持つ楽譜では、この設定はすべての譜に適用されます。 @c KEEP LY -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % RehearsalMark は KeySignature の上に中央揃えされます \override Score.RehearsalMark.break-align-symbols = #'(key-signature) \key a \major \clef treble \time 4/4 \mark "↓" -e1 +e'1 % RehearsalMark は KeySignature の左端に揃えられます \once \override Score.KeySignature.break-align-anchor-alignment = #LEFT \mark "↓" \key a \major -e +e'1 % RehearsalMark は KeySignature の右端に揃えられます \once \override Score.KeySignature.break-align-anchor-alignment = #RIGHT \key a \major \mark "↓" -e +e'1 @end lilypond また、リハーサル記号を左端に揃えて、@c @@ -4125,20 +4139,20 @@ e 単位は譜スペースです: @c KEEP LY -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % リハーサル記号は調号の左端に揃えられて % さらに 3.5 譜スペース右にずらされます \override Score.RehearsalMark.break-align-symbols = #'(key-signature) \once \override Score.KeySignature.break-align-anchor = #3.5 \key a \major \mark "↓" -e1 +e'1 % リハーサル記号は調号の左端に揃えられて % さらに 2 譜スペース左にずらされます \once \override Score.KeySignature.break-align-anchor = #-2 \key a \major \mark "↓" -e1 +e'1 @end lilypond @@ -4194,8 +4208,8 @@ XinO = { \musicglyph #"noteheads.s2cross" } } -\relative c'' { - a a \XinO a a +\relative { + a' a \XinO a a } @end lilypond @@ -4274,7 +4288,7 @@ Web でベジエ曲線が描かれる様子を示すアニメーションを@c @lilypond[verbatim,quote,relative=1] << - { e1 ~ e } + { e1 ~ 1 } \\ { r4 } >> @@ -4312,38 +4326,40 @@ Web でベジエ曲線が描かれる様子を示すアニメーションを@c それでは、上記の例に @code{\once \override} 形式の @code{\shape} を@c 使ってタイを 0.5 譜スペースだけ上に移動させてみましょう: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] << { \shape #'((0 . 0.5) (0 . 0.5) (0 . 0.5) (0 . 0.5)) Tie - e1~ e + e'1~ 1 } \\ - { r4 } + \relative { r4 } >> @end lilypond タイの位置は改善されましたが、中央部分をもっと持ち上げるべきです。@c 以下の例で @code{\tweak} 形式でそれを行っています: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] << { - e1-\shape #'((0 . 0.5) (0 . 1) (0 . 1) (0 . 0.5)) ~ e + e'1-\shape #'((0 . 0.5) (0 . 1) (0 . 1) (0 . 0.5)) ~ e' } \\ - { r4 } + \relative { r4 } >> @end lilypond 同じ方法で制御ポイントを水平方向に移動させることもできて、同じ音楽@c タイミングで発生する 2 つの曲線をうまく配置することができます: -@lilypond[verbatim,quote,ragged-right,relative=2] -c8(\( a) a'4 e c\) -\shape #'((0.7 . -0.4) (0.5 . -0.4) (0.3 . -0.3) (0 . -0.2)) Slur -\shape #'((0 . 0) (0 . 0.5) (0 . 0.5) (0 . 0)) PhrasingSlur -c8(\( a) a'4 e c\) +@lilypond[verbatim,quote,ragged-right] +\relative { + c''8(\( a) a'4 e c\) + \shape #'((0.7 . -0.4) (0.5 . -0.4) (0.3 . -0.3) (0 . -0.2)) Slur + \shape #'((0 . 0) (0 . 0.5) (0 . 0.5) (0 . 0)) PhrasingSlur + c8(\( a) a'4 e c\) +} @end lilypond @code{\shape} 関数は改行を跨ぐ曲線の制御ポイントを移動させることも@c @@ -4352,35 +4368,41 @@ c8(\( a) a'4 e c\) 片方の曲線は変更する必要がない場合、空のリストを渡します。@c 以下の例では、1 つのスラーが改行で 2 つに分割されています: -@lilypond[verbatim,quote,ragged-right,relative=1] -c4( f g c -\break -d,4 c' f, c) +@lilypond[verbatim,quote,ragged-right] +\relative { + c'4( f g c + \break + d,4 c' f, c) +} @end lilypond 分割されたスラーの形状を変更することで、改行を跨いで続くスラーである@c ことがわかりやすくなります: @c KEEP LY -@lilypond[verbatim,quote,ragged-right,relative=1] +@lilypond[verbatim,quote,ragged-right] % 片方のスラーを変更する必要がない場合、 % () を ((0 . 0) (0 . 0) (0 . 0) (0 . 0)) の短縮形として使うことができます -\shape #'( - (( 0 . 0) (0 . 0) (0 . 0) (0 . 1)) - ((0.5 . 1.5) (1 . 0) (0 . 0) (0 . -1.5)) - ) Slur -c4( f g c -\break -d,4 c' f, c) +\relative c' { + \shape #'( + (( 0 . 0) (0 . 0) (0 . 0) (0 . 1)) + ((0.5 . 1.5) (1 . 0) (0 . 0) (0 . -1.5)) + ) Slur + c4( f g c + \break + d,4 c' f, c) +} @end lilypond S 字曲線が求められた場合は、常に制御ポイントを手動で調節する必要があります --- LilyPond が自動的にそのような形状を選択することはありません。 -@lilypond[verbatim,quote,relative=2] -c8( e b-> f d' a e-> g) -\shape #'((0 . -1) (5.5 . -0.5) (-5.5 . -10.5) (0 . -5.5)) PhrasingSlur -c8\( e b-> f d' a e-> g\) +@lilypond[verbatim,quote] +\relative c'' { + c8( e b-> f d' a e-> g) + \shape #'((0 . -1) (5.5 . -0.5) (-5.5 . -10.5) (0 . -5.5)) PhrasingSlur + c8\( e b-> f d' a e-> g\) +} @end lilypond @subsubsubheading 制御ポイントの位置を明示的に指定する @@ -4400,23 +4422,25 @@ X@tie{}座標はタイあるいはスラーを取り付ける音符の参照ポ 繰り返しの差し替え部分まで延びるスラーを表示する方法を示しています。 @c KEEP LY -@lilypond[verbatim,quote,relative=2] -c1 -\repeat volta 3 { c4 d( e f } -\alternative { - { g2) d } - { - g2 - % スラーを作成して、新しい位置に移動させます - % <> はスラーを終わらせるための空の和音です - -\tweak control-points #'((-2 . 3.8) (-1 . 3.9) (0 . 4) (1 . 3.4)) ( <> ) - f, - } - { - e'2 - % スラーを作成して、新しい位置に移動させます - -\tweak control-points #'((-2 . 3) (-1 . 3.1) (0 . 3.2) (1 . 2.4)) ( <> ) - f, +@lilypond[verbatim,quote] +\relative { + c''1 + \repeat volta 3 { c4 d( e f } + \alternative { + { g2) d } + { + g2 + % スラーを作成して、新しい位置に移動させます + % <> はスラーを終わらせるための空の和音です + -\tweak control-points #'((-2 . 3.8) (-1 . 3.9) (0 . 4) (1 . 3.4)) ( <> ) + f, + } + { + e'2 + % スラーを作成して、新しい位置に移動させます + -\tweak control-points #'((-2 . 3) (-1 . 3.1) (0 . 3.2) (1 . 2.4)) ( <> ) + f, + } } } @end lilypond @@ -4562,7 +4586,7 @@ smartSquareLineCircleSpace = { @example function = #(define-music-function - (parser location @var{arg1} @var{arg2} @dots{}) + (@var{arg1} @var{arg2} @dots{}) (@var{type1?} @var{type2?} @dots{}) #@{ @var{@dots{}music@dots{}} @@ -4638,14 +4662,14 @@ symbol? @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function - (parser location padding) + (padding) (number?) #{ \once \override TextScript.padding = $padding #}) -\relative c''' { - c4^"piu mosso" b a b +\relative { + c'''4^"piu mosso" b a b \padText #1.8 c4^"piu mosso" d e f \padText #2.6 @@ -4658,7 +4682,7 @@ padText = @lilypond[quote,verbatim,ragged-right] custosNote = #(define-music-function - (parser location note) + (note) (ly:music?) #{ \tweak NoteHead.stencil #ly:text-interface::print @@ -4668,7 +4692,7 @@ custosNote = #note #}) -\relative c' { c4 d e f \custosNote g } +\relative { c'4 d e f \custosNote g } @end lilypond 複数の引数をとる置換関数を定義することもできます: @@ -4676,16 +4700,16 @@ custosNote = @lilypond[quote,verbatim,ragged-right] tempoPadded = #(define-music-function - (parser location padding tempotext) + (padding tempotext) (number? markup?) #{ \once \override Score.MetronomeMark.padding = $padding \tempo \markup { \bold #tempotext } #}) -\relative c'' { +\relative { \tempo \markup { "Low tempo" } - c4 d e f g1 + c''4 d e f g1 \tempoPadded #4.0 "High tempo" g4 f e d c1 } diff --git a/Documentation/ja/notation/cheatsheet.itely b/Documentation/ja/notation/cheatsheet.itely index cefecafef0..f57a38d6be 100644 --- a/Documentation/ja/notation/cheatsheet.itely +++ b/Documentation/ja/notation/cheatsheet.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.16" @c Translators: Yoshiki Sawada @@ -133,7 +133,7 @@ c c, @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f c( d e) @end lilypond @@ -144,7 +144,7 @@ c( d e) @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f c\( c( d) e\) @end lilypond @@ -155,7 +155,7 @@ c\( c( d) e\) @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a8-[ b-] @end lilypond @@ -166,11 +166,11 @@ a8-[ b-] @tab @lilypond[relative=1] << \new Staff { - \set Staff.implicitTimeSignatureVisibility = #all-invisible + \set Staff.initialTimeSignatureVisibility = #all-invisible c1 } \new Staff { - \set Staff.implicitTimeSignatureVisibility = #all-invisible + \set Staff.initialTimeSignatureVisibility = #all-invisible c1 } >> @end lilypond @@ -180,7 +180,7 @@ a8-[ b-] @tab アーティキュレーション @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible c-> c-. @end lilypond @@ -189,7 +189,7 @@ c-> c-. @tab 強弱記号 @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible c2\mf c\sfz @end lilypond @@ -199,7 +199,7 @@ c2\mf c\sfz @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a\< a a\! @end lilypond @@ -209,7 +209,7 @@ a\< a a\! @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a\> a a\! @end lilypond @@ -219,7 +219,7 @@ a\> a a\! @tab 和音 @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible @end lilypond @@ -237,7 +237,7 @@ f8 c2 d e @tab 3 連符 @tab @lilypond[relative=1] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \tuplet 3/2 { f8 g a } @end lilypond @@ -246,7 +246,7 @@ f8 c2 d e @tab 装飾小音符 @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \context Voice { \grace b16 c4 } @end lilypond @@ -267,7 +267,7 @@ twinkle @tab 歌詞のハイフン @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible << { g'1 g } \new Lyrics \lyricsto "" { twin -- kle } @@ -278,7 +278,7 @@ twinkle @tab コード @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \chordmode { c:dim f:maj7 } @end lilypond @@ -293,7 +293,7 @@ twinkle @tab 多声 @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \context Staff <<{e f} \\ {c d}>> @end lilypond diff --git a/Documentation/ja/notation/chords.itely b/Documentation/ja/notation/chords.itely index c7a7bc5a1b..d3035fe3cb 100644 --- a/Documentation/ja/notation/chords.itely +++ b/Documentation/ja/notation/chords.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.28" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -74,11 +74,13 @@ 一連の音楽の中で、和音モードと音符モードを切り替えることができます: -@lilypond[verbatim,quote,ragged-right,relative=1] -2 -\chordmode { c2 f } -2 -\chordmode { f2 g } +@lilypond[verbatim,quote,ragged-right] +\relative { + 2 + \chordmode { c2 f } + 2 + \chordmode { f2 g } +} @end lilypond @seealso @@ -311,7 +313,7 @@ C の長三和音を作り出すということに注意してください。 @lilypond[quote,verbatim] \chordmode { - c1:5.6 c:3.7.8 c:3.6.13 + c1:3.5.6 c:3.7.8 c:3.6.13 } @end lilypond @@ -319,13 +321,13 @@ C の長三和音を作り出すということに注意してください。 @lilypond[quote,verbatim] \chordmode { - c4:5.15 c:5.20 c:5.25 c:5.30 + c4:3.5.15 c:3.5.20 c:3.5.25 c:3.5.30 } @end lilypond @cindex chord steps, altering (和音の音を変化させる) -和音の音は、数字の後ろに @code{+} または@code{-] を置くことで@c +和音の音は、数字の後ろに @code{+} または@code{-} を置くことで@c 変化させることができます。@c 和音構造の一部として自動的に含まれる音を変化させるには、@c その音を追加して変化させます。 @@ -363,7 +365,7 @@ C の長三和音を作り出すということに注意してください。 @lilypond[quote,ragged-right,verbatim] \chordmode { - c1:sus c:sus2 c:sus4 c:5.4^3 + c1:5 c:sus2 c:sus4 c:5.4 } @end lilypond @@ -407,7 +409,7 @@ C の長三和音を作り出すということに注意してください。 増和音が作り出されます。 @lilypond[quote,ragged-right,verbatim] -\chordmode { c1:5.5-.5+ } +\chordmode { c1:3.5.5-.5+ } @end lilypond 第二転回和音を作り出すには、低音を追加するしかありません。@c @@ -481,7 +483,7 @@ C の長三和音を作り出すということに注意してください。 @code{ChordNames} コンテキストに休符が渡されると、@c @code{noChordSymbol} マークアップが表示されます。 -@lilypond[verbatim, quote, relative=1] +@lilypond[verbatim,quote] << \new ChordNames \chordmode { c1 @@ -1078,8 +1080,8 @@ example, the vertical spacing of the figures may be set with @lilypond[verbatim,ragged-right,quote] << - \relative c'' { - c4 c'8 r8 c,4 c' + \relative { + c''4 c'8 r8 c,4 c' } \new FiguredBass { \figuremode { diff --git a/Documentation/ja/notation/editorial.itely b/Documentation/ja/notation/editorial.itely index 084b00f579..12341e03e5 100644 --- a/Documentation/ja/notation/editorial.itely +++ b/Documentation/ja/notation/editorial.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.21" @c Translators: Yoshiki Sawada @@ -124,7 +124,7 @@ c4.-> d8---3 (一定の割合で) 増減することによって、達成されます@c 標準フォント サイズ (@w{@code{font-size = #0}} のフォント サイズ) は@c 標準の譜の高さに基づきます。@c -20pt の譜では、10pt のフォントが選択されます。 +20pt の譜では、11pt のフォントが選択されます。 @code{font-size} プロパティはフォントを使用するレイアウト オブジェクトだけに@c セットすることができます@c @@ -157,7 +157,6 @@ c4.-> d8---3 @cindex finger change (指を変える) @funindex \finger -@funindex finger 運指の指示は @var{音符}-@var{数字} を用いることで挿入することができます: @@ -167,27 +166,28 @@ c4-1 d-2 f-4 e-3 指の変更のためにマークアップ テキストや文字列が使用されることもあります。 -@lilypond[verbatim,quote,relative=2] -c4-1 d-2 f-4 e-3 +@lilypond[verbatim,quote] +\relative { c''4-1 d-2 f-4 e-3 } @end lilypond 指の入れ替えのためにマークアップ テキストを使うこともできます。 -@lilypond[verbatim,quote,relative=2] -c4-1 d-2 f\finger \markup \tied-lyric #"4~3" c\finger "2 - 3" +@lilypond[verbatim,quote] +\relative { + c''4-1 d-2 f\finger \markup \tied-lyric #"4~3" c\finger "2 - 3" +} @end lilypond @cindex thumb-script (サム-スクリプト) @funindex \thumb -@funindex thumb ある音符を親指で演奏するよう指示するために、@c サム-スクリプト (thumb-script) を付け加えることができます (例えば、チェロ音楽で)。 -@lilypond[verbatim,quote,relative=2] -2 +@lilypond[verbatim,quote] +\relative { 2 } @end lilypond @cindex fingering chords (和音の運指法) @@ -197,8 +197,10 @@ c4-1 d-2 f\finger \markup \tied-lyric #"4~3" c\finger "2 - 3" 和音の個々の音符の後に運指を付け加えることによって、@c 和音に対する運指法を付け加えることができます。 -@lilypond[verbatim,quote,relative=2] -2 +@lilypond[verbatim,quote] +\relative { + 2 +} @end lilypond 運指指示の配置を手動で譜の上または下にすることができます。@c @@ -243,34 +245,36 @@ c4-1 d-2 f\finger \markup \tied-lyric #"4~3" c\finger "2 - 3" @cindex notes, transparent @funindex \hideNotes -@funindex hideNotes @funindex \unHideNotes -@funindex unHideNotes @c 未訳 隠された (または不可視、透明の) 音符は、preparing theory や作曲の演習の際に@c 有用です。 -@lilypond[verbatim,quote,relative=2] -c4 d -\hideNotes -e4 f -\unHideNotes -g a -\hideNotes -b -\unHideNotes -c +@lilypond[verbatim,quote] +\relative { + c''4 d + \hideNotes + e4 f + \unHideNotes + g a + \hideNotes + b + \unHideNotes + c +} @end lilypond 符頭、符幹、旗、それに休符は不可視です。@c 連桁は、隠された音符から始まる場合は、不可視です。 不可視の音符に取り付けられたオブジェクトは可視のままです。 -@lilypond[verbatim,quote,relative=2] -e8(\p f g a)-- -\hideNotes -e8(\p f g a)-- +@lilypond[verbatim,quote] +\relative c'' { + e8(\p f g a)-- + \hideNotes + e8(\p f g a)-- +} @end lilypond @@ -313,19 +317,18 @@ Notation Reference: @funindex color @funindex \with-color -@funindex with-color @funindex x11-color 個々のオブジェクトに色を割り振ることができます。@c 有効なカラー名は @ref{List of colors} でリストアップされています。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \override NoteHead.color = #red -c4 c +c''4 c'' \override NoteHead.color = #(x11-color 'LimeGreen) -d +d'' \override Stem.color = #blue -e +e'' @end lilypond @@ -342,22 +345,24 @@ X11 のために定義された色の全範囲にアクセスすることがで その色はデフォルトの黒になります。 @c KEEP LY -@lilypond[verbatim,quote,relative=2] -\override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) -\set Staff.instrumentName = \markup { - \with-color #(x11-color 'navy) "Clarinet" -} +@lilypond[verbatim,quote] +\relative c'' { + \override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) + \set Staff.instrumentName = \markup { + \with-color #(x11-color 'navy) "Clarinet" + } -gis8 a -\override Beam.color = #(x11-color "medium turquoise") -gis a -\override Accidental.color = #(x11-color 'DarkRed) -gis a -\override NoteHead.color = #(x11-color "LimeGreen") -gis a -% 以下は意図的に意味をなさない色を指定しています。符幹が黒のままであることに注意してください -\override Stem.color = #(x11-color 'Boggle) -b2 cis + gis8 a + \override Beam.color = #(x11-color "medium turquoise") + gis a + \override Accidental.color = #(x11-color 'DarkRed) + gis a + \override NoteHead.color = #(x11-color "LimeGreen") + gis a + % 以下は意図的に意味をなさない色を指定しています。符幹が黒のままであることに注意してください + \override Stem.color = #(x11-color 'Boggle) + b2 cis +} @end lilypond @cindex rgb-color @@ -369,18 +374,20 @@ b2 cis Scheme 関数 @code{rgb-color} を用いることによって、@c 厳密な RGB カラーを指定することができます。 -@lilypond[verbatim,quote,relative=2] -\override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) -\set Staff.instrumentName = \markup { - \with-color #(x11-color 'navy) "Clarinet" -} +@lilypond[verbatim,quote] +\relative c'' { + \override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) + \set Staff.instrumentName = \markup { + \with-color #(x11-color 'navy) "Clarinet" + } -\override Stem.color = #(rgb-color 0 0 0) -gis8 a -\override Stem.color = #(rgb-color 1 1 1) -gis8 a -\override Stem.color = #(rgb-color 0 0 0.5) -gis4 a + \override Stem.color = #(rgb-color 0 0 0) + gis8 a + \override Stem.color = #(rgb-color 1 1 1) + gis8 a + \override Stem.color = #(rgb-color 0 0 0.5) + gis4 a +} @end lilypond @seealso @@ -425,7 +432,6 @@ Web 向けでは、ノーマル カラーを使用することを推奨します @cindex brackets (囲み) @funindex \parenthesize -@funindex parenthesize 音楽イベントの前に @code{\parenthesize} を置くことによって、@c そのオブジェクトに括弧を付けることができます。@c @@ -433,19 +439,23 @@ Web 向けでは、ノーマル カラーを使用することを推奨します 和音の音符それぞれに括弧が付けられます。@c 和音内部の音符に個別に括弧を付けることもできます。 -@lilypond[verbatim,quote,relative=2] -c2 \parenthesize d -c2 \parenthesize -c2 +@lilypond[verbatim,quote] +\relative { + c''2 \parenthesize d + c2 \parenthesize + c2 +} @end lilypond 音符ではないオブジェクトにも括弧を付けることができます。@c アーティキュレーションに対して括弧をつける場合、@c @code{\parenthesize} コマンドの前にハイフンが必要です。 -@lilypond[verbatim,quote,relative=2] -c2-\parenthesize -. d -c2 \parenthesize r +@lilypond[verbatim,quote] +\relative { + c''2-\parenthesize -. d + c2 \parenthesize r +} @end lilypond @seealso @@ -471,11 +481,8 @@ c2 \parenthesize r @cindex invisible stem (不可視の符幹) @funindex \stemUp -@funindex stemUp @funindex \stemDown -@funindex stemDown @funindex \stemNeutral -@funindex stemNeutral @cindex stem, direction (符幹の向き) @cindex stem, up (符幹を上向きにする) @cindex stem, down (符幹を下向きにする) @@ -543,16 +550,14 @@ c2 \parenthesize r @funindex balloonGrobText @funindex balloonText @funindex \balloonLengthOn -@funindex balloonLengthOn @funindex \balloonLengthOff -@funindex balloonLengthOff 記譜要素に四角いバルーンで印を付けて、テキストを付け加えることができます。@c この機能の主目的は記譜法を説明することです。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Voice \with { \consists "Balloon_engraver" } -{ +\relative c'' { \balloonGrobText #'Stem #'(3 . 4) \markup { "I'm a Stem" } a8 \balloonGrobText #'Rest #'(-4 . -4) \markup { "I'm a rest" } @@ -640,11 +645,11 @@ altered: \score { \new ChoirStaff << - \new Staff \relative c'' { + \new Staff \relative { \stemUp - c4. d8 e8 f g4 + c''4. d8 e8 f g4 } - \new Staff \relative c { + \new Staff \relative { \clef bass \stemDown c4 g' f e @@ -686,9 +691,7 @@ altered: @funindex Horizontal_bracket_engraver @funindex \startGroup -@funindex startGroup @funindex \stopGroup -@funindex stopGroup 音楽分析では、囲みを使って楽曲の構造を示します。@c シンプルな水平な囲みがサポートされています。 @@ -700,8 +703,8 @@ altered: \consists "Horizontal_bracket_engraver" } } -\relative c'' { - c2\startGroup +\relative { + c''2\startGroup d\stopGroup } @end lilypond @@ -715,8 +718,8 @@ Analysis brackets may be nested. \consists "Horizontal_bracket_engraver" } } -\relative c'' { - c4\startGroup\startGroup +\relative { + c''4\startGroup\startGroup d4\stopGroup e4\startGroup d4\stopGroup\stopGroup diff --git a/Documentation/ja/notation/expressive.itely b/Documentation/ja/notation/expressive.itely index 97973e4d2b..02f8b4e6ff 100644 --- a/Documentation/ja/notation/expressive.itely +++ b/Documentation/ja/notation/expressive.itely @@ -5,8 +5,9 @@ When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes..@end ignore +@end ignore -@c \version "2.17.25" +@c \version "2.19.21" @c Translators: Yoshiki Sawada @@ -138,9 +139,11 @@ @ref{List of articulations} でリストアップしています。@c 例えば: -@lilypond[verbatim,quote,relative=2] -c4\staccato c\mordent b2\turn -c1\fermata +@lilypond[verbatim,quote] +\relative { + c''4\staccato c\mordent b2\turn + c1\fermata +} @end lilypond @cindex marcato (マルカート) @@ -179,10 +182,10 @@ c4-> c-. c2-_ ことができます (複数小節の休符にだけ付けることができます)。@c このコマンドは @code{MultiMeasureRestText} オブジェクトを作成します。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \override Script.color = #red \override MultiMeasureRestText.color = #blue -a2\fermata r\fermata +a'2\fermata r\fermata R1\fermataMarkup @end lilypond @@ -235,43 +238,24 @@ R1\fermataMarkup @cindex dynamics, absolute (絶対強弱記号) @funindex \ppppp -@funindex ppppp @funindex \pppp -@funindex pppp @funindex \ppp -@funindex ppp @funindex \pp -@funindex pp @funindex \p -@funindex p @funindex \mp -@funindex mp @funindex \mf -@funindex mf @funindex \f -@funindex f @funindex \ff -@funindex ff @funindex \fff -@funindex fff @funindex \ffff -@funindex ffff @funindex \fffff -@funindex fffff @funindex \fp -@funindex fp @funindex \sf -@funindex sf @funindex \sff -@funindex sff @funindex \sp -@funindex sp @funindex \spp -@funindex spp @funindex \sfz -@funindex sfz @funindex \rfz -@funindex rfz 絶対強弱記号は音符の後にコマンドを用いて -- @code{c4\ff} などのように @@ -284,10 +268,12 @@ R1\fermataMarkup 強弱記号を手動で譜の上または下に配置することもできます -- @ref{Direction and placement} を参照してください。 -@lilypond[verbatim,quote,relative=2] -c2\ppp c\mp -c2\rfz c^\mf -c2_\spp c^\ff +@lilypond[verbatim,quote] +\relative c'' { + c2\ppp c\mp + c2\rfz c^\mf + c2_\spp c^\ff +} @end lilypond @c 保留 @@ -300,9 +286,7 @@ c2_\spp c^\ff @funindex \> @funindex \! @funindex \cr -@funindex cr @funindex \decr -@funindex decr @notation{クレッシェンド} 記号は @code{\<} で始まり、@code{\!}、@c 絶対強弱記号あるいは追加のクレッシェンド記号またはデクレッシェンド記号で@c @@ -314,14 +298,16 @@ c2_\spp c^\ff 用いる場合もあります。@c この記譜法を用いるとデフォルトでは @notation{ヘアピン} が譜刻されます。 -@lilypond[verbatim,quote,relative=2] -c2\< c\! -d2\< d\f -e2\< e\> -f2\> f\! -e2\> e\mp -d2\> d\> -c1\! +@lilypond[verbatim,quote] +\relative c'' { + c2\< c\! + d2\< d\f + e2\< e\> + f2\> f\! + e2\> e\mp + d2\> d\> + c1\! +} @end lilypond @code{\!} で終了するヘアピンは、@c @@ -332,15 +318,19 @@ c1\! 音符の中央で終了します。@c 次のへアピンは、通常通りに音符の左端で始まる代わりに、右端から始まります。 -@lilypond[verbatim,quote,relative=2] -c1\< | c4 a c\< a | c4 a c\! a\< | c4 a c a\! +@lilypond[verbatim,quote] +\relative { + c''1\< | c4 a c\< a | c4 a c\! a\< | c4 a c a\! +} @end lilypond @code{\!} の代わりに絶対強弱記号で終了するヘアピも同じように譜刻されます。@c しかしながら、絶対強弱記号の幅によってヘアピンの終了点は変わります。 -@lilypond[verbatim,quote,relative=2] -c1\< | c4 a c\mf a | c1\< | c4 a c\ffff a +@lilypond[verbatim,quote] +\relative { + c''1\< | c4 a c\mf a | c1\< | c4 a c\ffff a +} @end lilypond @cindex multiple dynamic marks on one note (1 つの音符に複数の強弱記号をつける) @@ -349,71 +339,69 @@ c1\< | c4 a c\mf a | c1\< | c4 a c\ffff a これは特に、同じ音符に @notation{クレッシェンド} と @notation{デクレッシェンド} を付ける場合に有用です。 -@lilypond[verbatim,quote,relative=2] -c4\< c\! d\> e\! -<< f1 { s4 s4\< s4\> s4\! } >> +@lilypond[verbatim,quote] +\relative { + c''4\< c\! d\> e\! + << f1 { s4 s4\< s4\> s4\! } >> +} @end lilypond @cindex espressivo articulation (表現的なアーティキュレーション) @funindex \espressivo -@funindex espressivo @code{\espressivo} コマンドを用いて、同じ音符にクレッシェンドとデクレッシェンドを@c 付けることができます。@c しかしながら、これは強弱記号ではなくアーティキュレーションとして実装されている@c ということに注意してください。 -@lilypond[verbatim,quote,relative=2] -c2 b4 a -g1\espressivo +@lilypond[verbatim,quote] +\relative { + c''2 b4 a + g1\espressivo +} @end lilypond @funindex \cresc -@funindex cresc @funindex \decresc -@funindex decresc @funindex \dim -@funindex dim テキストのクレッシェンド記号は @code{\cresc} で開始します。@c テキストのデクレッシェンド記号は @code{\decresc} または @code{\dim} で開始します。@c 必要に応じて延長線が譜刻されます。 -@lilypond[verbatim,quote,relative=2] -g8\cresc a b c b c d e\mf | -f8\decresc e d c e\> d c b | -a1\dim ~ | -a2. r4\! | +@lilypond[verbatim,quote] +\relative { + g'8\cresc a b c b c d e\mf | + f8\decresc e d c e\> d c b | + a1\dim ~ | + a2. r4\! | +} @end lilypond @funindex \crescTextCresc -@funindex crescTextCresc @funindex \dimTextDecresc -@funindex dimTextDecresc @funindex \dimTextDecr -@funindex dimTextDecr @funindex \dimTextDim -@funindex dimTextDim @funindex \crescHairpin -@funindex crescHairpin @funindex \dimHairpin -@funindex dimHairpin 強弱のテキスト符号の変更でヘアピンを置換することもできます: -@lilypond[verbatim,quote,relative=2] -\crescTextCresc -c4\< d e f\! | -\dimTextDecresc -g4\> e d c\! | -\dimTextDecr -e4\> d c b\! | -\dimTextDim -d4\> c b a\! | -\crescHairpin -\dimHairpin -c4\< d\! e\> d\! | +@lilypond[verbatim,quote] +\relative c'' { + \crescTextCresc + c4\< d e f\! | + \dimTextDecresc + g4\> e d c\! | + \dimTextDecr + e4\> d c b\! | + \dimTextDim + d4\> c b a\! | + \crescHairpin + \dimHairpin + c4\< d\! e\> d\! | +} @end lilypond 新たに絶対強弱記号や強弱に対応させるテキストを作成するには、@c @@ -428,11 +416,8 @@ c4\< d\! e\> d\! | 強弱記号の垂直方向の位置は @rinternals{DynamicLineSpanner} によって処理されます。 @funindex \dynamicUp -@funindex dynamicUp @funindex \dynamicDown -@funindex dynamicDown @funindex \dynamicNeutral -@funindex dynamicNeutral @code{Dynamics} を用いて水平線上に強弱記号を譜刻することができます。@c タイミングを示すために空白休符を使用します。@c @@ -443,8 +428,8 @@ c4\< d\! e\> d\! | @lilypond[verbatim,quote] << - \new Staff \relative c' { - c2 d4 e | + \new Staff \relative { + c'2 d4 e | c4 e e,2 | g'4 a g a | c1 | @@ -533,8 +518,8 @@ c4\< d\! e\> d\! | @lilypond[verbatim,quote] moltoF = \markup { molto \dynamic f } -\relative c' { - 16_\moltoF +\relative { + 16_\moltoF 2.. } @end lilypond @@ -543,9 +528,7 @@ moltoF = \markup { molto \dynamic f } @cindex dynamics, parenthesis (括弧の強弱記号) @cindex editorial dynamics (注釈の強弱記号) @funindex \bracket -@funindex bracket @funindex \dynamic -@funindex dynamic マークアップ モードでは、@c 注釈の強弱記号 (括弧や角括弧で囲まれます) を作成することができます。@c @@ -556,8 +539,8 @@ roundF = \markup { \center-align \concat { \bold { \italic ( } \dynamic f \bold { \italic ) } } } boxF = \markup { \bracket { \dynamic f } } -\relative c' { - c1_\roundF +\relative { + c'1_\roundF c1_\boxF } @end lilypond @@ -570,8 +553,8 @@ boxF = \markup { \bracket { \dynamic f } } @lilypond[verbatim,quote] sfzp = #(make-dynamic-script "sfzp") -\relative c' { - c4 c c\sfzp c +\relative { + c'4 c c\sfzp c } @end lilypond @@ -597,8 +580,8 @@ mfEspress = \markup { \center-align \line { roundFdynamic = #(make-dynamic-script roundF) boxFdynamic = #(make-dynamic-script boxF) mfEspressDynamic = #(make-dynamic-script mfEspress) -\relative c' { - c4_\roundFdynamic\< d e f +\relative { + c'4_\roundFdynamic\< d e f g,1~_\boxFdynamic\> g1 g'1~\mfEspressDynamic @@ -614,8 +597,8 @@ Scheme 形式のマークアップ モードを用いることもできます。 moltoF = #(make-dynamic-script (markup #:normal-text "molto" #:dynamic "f")) -\relative c' { - 16 +\relative { + 16 2..\moltoF } @end lilypond @@ -628,8 +611,8 @@ moltoF = \tweak DynamicText.self-alignment-X #LEFT #(make-dynamic-script (markup #:normal-text "molto" #:dynamic "f")) -\relative c' { - 16 +\relative { + 16 2..\moltoF 1 } @end lilypond @@ -678,19 +661,19 @@ LilyPond の拡張: @warning{多声音楽では、@c スラーが始まったボイスでそのスラーを終わらせる必要があります。} -@lilypond[verbatim,quote,relative=2] -f4( g a) a8 b( -a4 g2 f4) -2( 2) +@lilypond[verbatim,quote] +\relative { + f''4( g a) a8 b( + a4 g2 f4) + 2( 2) +} @end lilypond @cindex slurs, manual placement (手動でスラーを配置する) @cindex slurs, below notes (音符の下にスラーを配置する) @cindex slurs, above notes (音符の上にスラーを配置する) @funindex \slurDown -@funindex slurDown @funindex \slurNeutral -@funindex slurNeutral スラーを手動で音符の上または下に配置することができます。@c @ref{Direction and placement} を参照してください。 @@ -717,64 +700,63 @@ a4 g2 f4) @cindex slur, dashed (破線のスラー) @cindex style, slur (スラーのスタイル) @funindex \slurDashed -@funindex slurDashed @funindex \slurDotted -@funindex slurDotted @funindex \slurSolid -@funindex slurSolid スラーは実線、点線あるいは破線のどれかになります。@c 実線がスラーのデフォルト スタイルです: -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurDashed -g4( e c2) -\slurDotted -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurDashed + g4( e c2) + \slurDotted + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @funindex \slurHalfDashed -@funindex slurHalfDashed @funindex \slurHalfSolid -@funindex slurHalfSolid @cindex slur, half dashed and half solid (半分が破線で半分が実線のスラー) スラーの半分を破線 (前半を破線、後半を実線) にする、あるいは、@c 半分を実線 (前半を実線、後半を破線) にすることもできます: -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurHalfDashed -g4( e c2) -\slurHalfSolid -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurHalfDashed + g4( e c2) + \slurHalfSolid + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @funindex \slurDashPattern -@funindex slurDashPattern @cindex slur, defining dash patterns (スラーの破線パターンを定義する) スラーの破線パターンを定義することができます: -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurDashPattern #0.7 #0.75 -g4( e c2) -\slurDashPattern #0.5 #2.0 -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurDashPattern #0.7 #0.75 + g4( e c2) + \slurDashPattern #0.5 #2.0 + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @funindex \slurUp -@funindex slurUp @predefined @@ -833,17 +815,16 @@ g4( e c2) 音楽センテンスを示す @notation{フレージング スラー} (またはフレーズ記号) は@c コマンド @code{\(} と @code{\)} を用いて記述します: -@lilypond[verbatim,quote,relative=2] -c4\( d( e) f( -e2) d\) +@lilypond[verbatim,quote] +\relative { + c''4\( d( e) f( + e2) d\) +} @end lilypond @funindex \phrasingSlurUp -@funindex phrasingSlurUp @funindex \phrasingSlurDown -@funindex phrasingSlurDown @funindex \phrasingSlurNeutral -@funindex phrasingSlurNeutral 印刷の上では、フレージング スラーは通常のスラーとほとんど同じです。@c しかしながら、それぞれ異なるオブジェクトとして取り扱われます。@c @@ -860,12 +841,9 @@ e2) d\) 同時進行あるいは重なり合うフレージング スラーは許可されません。 -@funindex phrasingSlurDashed @funindex \phrasingSlurDashed @funindex \phrasingSlurDotted -@funindex phrasingSlurDotted @funindex \phrasingSlurSolid -@funindex phrasingSlurSolid @cindex phrasing slur, dashed (破線のフレージング スラー) @cindex dashed phrasing slur (破線のフレージング スラー) @cindex phrasing slur, dotted (点線のフレージング スラー) @@ -876,52 +854,55 @@ e2) d\) フレージング スラーを実線、点線あるいは破線にすることができます。@c 実線がフレージング スラーのデフォルト スタイルです: -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurDashed -g4\( e c2\) -\phrasingSlurDotted -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurDashed + g4\( e c2\) + \phrasingSlurDotted + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond -@funindex phrasingSlurHalfDashed @funindex \phrasingSlurHalfDashed @funindex \phrasingSlurHalfSolid -@funindex phrasingSlurHalfSolid @cindex phrasing slur, half solid and half dashed (半分が実線で半分が破線のフレージング スラー) @cindex slur, half solid and half dashed phrasing (半分が実線で半分が破線のフレージング スラー) フレージング スラーの半分を破線 (前半を破線、後半を実線) にする、あるいは、@c 半分を実線 (前半を実線、後半を破線) にすることもできます: -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurHalfDashed -g4\( e c2\) -\phrasingSlurHalfSolid -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurHalfDashed + g4\( e c2\) + \phrasingSlurHalfSolid + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond @funindex \phrasingSlurDashPattern -@funindex phrasingSlurDashPattern @cindex phrasing slur, defining dash patterns @cindex slur, phrasing, defining dash patterns (フレージング スラーの破線パターンを定義する) @cindex slur, defining dash patterns for phrasing (フレージング スラーの破線パターンを定義する) フレージング スラーの破線パターンを定義することができます: -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurDashPattern #0.7 #0.75 -g4\( e c2\) -\phrasingSlurDashPattern #0.5 #2.0 -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurDashPattern #0.7 #0.75 + g4\( e c2\) + \phrasingSlurDashPattern #0.5 #2.0 + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond フレージング スラーに対する破線パターンの定義は、@c @@ -963,19 +944,18 @@ g4\( e c2\) @cindex breath marks (ブレス記号) @cindex pause mark (休止記号) @funindex \breathe -@funindex breathe ブレス記号は @code{\breathe} を用いて入力します: -@lilypond[verbatim,quote,relative=2] -c2. \breathe d4 +@lilypond[verbatim,quote] +{ c''2. \breathe d''4 } @end lilypond ブレス記号は自動連桁を終わらせます。@c この振る舞いをオーバライドする方法は、@ref{手動連桁} を参照してください。 -@lilypond[verbatim,quote,relative=2] -c8 \breathe d e f g2 +@lilypond[verbatim,quote] +\relative { c''8 \breathe d e f g2 } @end lilypond @c 保留 @@ -1026,20 +1006,21 @@ divisiones (ディビジョン: 区切り) がサポートされています。@ @cindex falls (Fall) @cindex doits (Doit) @funindex \bendAfter -@funindex bendAfter @code{\bendAfter} コマンドを用いて、@c @notation{Fall} と @notation{Doit} 音符にを付け加えることができます。@c Fall あるいは Doit の向きはプラスあるいはマイナス (上あるいは下) で示します。@c 指示の数は Fall あるいは Doit の主音符を展開させるピッチの幅を示します。 -@lilypond[verbatim,quote,relative=2] -c2\bendAfter #+4 -c2\bendAfter #-4 -c2\bendAfter #+6.5 -c2\bendAfter #-6.5 -c2\bendAfter #+8 -c2\bendAfter #-8 +@lilypond[verbatim,quote] +\relative c'' { + c2\bendAfter #+4 + c2\bendAfter #-4 + c2\bendAfter #+6.5 + c2\bendAfter #-6.5 + c2\bendAfter #+8 + c2\bendAfter #-8 +} @end lilypond @snippets @@ -1075,15 +1056,16 @@ c2\bendAfter #-8 @cindex glissando (グリッサンド) @funindex \glissando -@funindex glissando @notation{グリッサンド} は音符の後に @code{\glissando} を付けることに@c よって作成されます: -@lilypond[verbatim,quote,relative=2] -g2\glissando g' -c2\glissando c, -\afterGrace f,1\glissando f'16 +@lilypond[verbatim,quote] +\relative { + g'2\glissando g' + c2\glissando c, + \afterGrace f,1\glissando f'16 +} @end lilypond グリッサンドは譜を跨いで音符を結ぶことができます: @@ -1110,20 +1092,22 @@ c2\glissando c, 和音の音符は入力ファイル @file{.ly} で出現する順に 0, 1, @dots{} と@c 番号が付きます。 -@lilypond[verbatim,quote,relative=2] -1\glissando g' | -1\glissando | - | -\break -\set glissandoMap = #'((0 . 1) (1 . 0)) -1\glissando | - | -\set glissandoMap = #'((0 . 0) (0 . 1) (0 . 2)) -c1\glissando | - | -\set glissandoMap = #'((2 . 0) (1 . 0) (0 . 1)) -1\glissando | - | +@lilypond[verbatim,quote] +\relative { + 1\glissando g' | + 1\glissando | + | + \break + \set glissandoMap = #'((0 . 1) (1 . 0)) + 1\glissando | + | + \set glissandoMap = #'((0 . 0) (0 . 1) (0 . 2)) + c1\glissando | + | + \set glissandoMap = #'((2 . 0) (1 . 0) (0 . 1)) + 1\glissando | + | +} @end lilypond 異なるスタイルのグリッサンドを作成することもできます。@c @@ -1170,68 +1154,65 @@ c1\glissando | @cindex chord, broken (変則和音) @funindex \arpeggio -@funindex arpeggio @funindex \arpeggioArrowUp -@funindex arpeggioArrowUp @funindex \arpeggioArrowDown -@funindex arpeggioArrowDown @funindex \arpeggioNormal -@funindex arpeggioNormal 和音の @notation{アルペジオ} (変則和音とも呼ばれます) は和音構造の後に @code{\arpeggio} を付けることによって記述されます: -@lilypond[verbatim,quote,relative=1] -1\arpeggio +@lilypond[verbatim,quote] +\relative { 1\arpeggio } @end lilypond 異なるタイプのアルペジオを描くこともできます。@c @code{\arpeggioNormal} は通常のアルペジオに戻します: -@lilypond[verbatim,quote,relative=1] -2\arpeggio +@lilypond[verbatim,quote] +\relative { + 2\arpeggio -\arpeggioArrowUp -2\arpeggio + \arpeggioArrowUp + 2\arpeggio -\arpeggioArrowDown -2\arpeggio + \arpeggioArrowDown + 2\arpeggio -\arpeggioNormal -2\arpeggio + \arpeggioNormal + 2\arpeggio +} @end lilypond @cindex arpeggio symbols, special (特殊なアルペジオ シンボル) @cindex special arpeggio symbols (特殊なアルペジオ シンボル) @funindex \arpeggioBracket -@funindex arpeggioBracket @funindex \arpeggioParenthesis -@funindex arpeggioParenthesis @funindex \arpeggioParenthesisDashed -@funindex arpeggioParenthesisDashed 特殊な @emph{括弧スタイル} のアルペジオ シンボルを作成することができます: -@lilypond[verbatim,quote,relative=1] -2 +@lilypond[verbatim,quote] +\relative { + 2 -\arpeggioBracket -2\arpeggio + \arpeggioBracket + 2\arpeggio -\arpeggioParenthesis -2\arpeggio + \arpeggioParenthesis + 2\arpeggio -\arpeggioParenthesisDashed -2\arpeggio + \arpeggioParenthesisDashed + 2\arpeggio -\arpeggioNormal -2\arpeggio + \arpeggioNormal + 2\arpeggio +} @end lilypond -括弧スタイルのアルペジオの破線プロパティは @code{'dash-details} プロパティで@c +括弧スタイルのアルペジオの破線プロパティは @code{'dash-definition} プロパティで@c 制御します。@c -@code{'dash-details} プロパティについては @ref{スラー} で説明しています。 +@code{'dash-definition} プロパティについては @ref{スラー} で説明しています。 アルペジオをタイを用いて明示的に描き出すことができます。@c 詳細は @ref{タイ} を参照してください。 @@ -1293,11 +1274,8 @@ c1\glissando | @cindex trills (トリル) @funindex \trill -@funindex trill @funindex \startTrillSpan -@funindex startTrillSpan @funindex \stopTrillSpan -@funindex stopTrillSpan 延長線を持たない短い @notation{トリル} は @code{\trill} で譜刻されます。@c @ref{アーティキュレーションと装飾} を参照してください。 @@ -1305,60 +1283,69 @@ c1\glissando | 延長線を持つ長いトリルは @code{\startTrillSpan} と @code{\stopTrillSpan} で@c 作成されます: -@lilypond[verbatim,quote,relative=2] -d1\startTrillSpan -d1 -c2\stopTrillSpan -r2 +@lilypond[verbatim,quote] +\relative { + d''1\startTrillSpan + d1 + c2\stopTrillSpan + r2 +} @end lilypond 改行を跨ぐトリルは、次行の最初の音符の上から再開されます。 -@lilypond[ragged-right,verbatim,quote,relative=2] -d1\startTrillSpan -\break -d1 -c2\stopTrillSpan -r2 +@lilypond[ragged-right,verbatim,quote] +\relative { + d''1\startTrillSpan + \break + d1 + c2\stopTrillSpan + r2 +} @end lilypond 連続したトリルには、明示的な @code{\stopTrillSpan} コマンドは必要ありません。@c なぜなら、自動的に次のトリルが前のトリルの右端となるからです。 -@lilypond[verbatim,quote,relative=2] -d1\startTrillSpan -d1 -b1\startTrillSpan -d2\stopTrillSpan -r2 +@lilypond[verbatim,quote] +\relative { + d''1\startTrillSpan + d1 + b1\startTrillSpan + d2\stopTrillSpan + r2 +} @end lilypond トリルを装飾小音符と組み合わせることもできます。@c この組み合わせの構文と装飾小音符を正確に配置する方法については、@c @ref{装飾小音符} で説明しています。 -@lilypond[verbatim,quote,relative=2] -d1~\afterGrace -d1\startTrillSpan { c32[ d]\stopTrillSpan } -c2 r2 +@lilypond[verbatim,quote] +\relative { + d''1~\afterGrace + d1\startTrillSpan { c32[ d]\stopTrillSpan } + c2 r2 +} @end lilypond @cindex pitched trills (ピッチを持つトリル) @cindex trills, pitched (ピッチを持つトリル) @funindex \pitchedTrill -@funindex pitchedTrill 明示的なピッチを持つ予備の音符を必要とするトリルは @code{\pitchedTrill} コマンドを用いて譜刻することができます。@c 最初の引数は主音符です。2 番目の引数は @emph{トリル} の音符であり、@c 括弧で囲まれた符幹を持たない符頭として譜刻されます。 -@lilypond[verbatim,quote,relative=2] -\pitchedTrill -d2\startTrillSpan fis -d2 -c2\stopTrillSpan -r2 +@lilypond[verbatim,quote] +\relative { + \pitchedTrill + d''2\startTrillSpan fis + d2 + c2\stopTrillSpan + r2 +} @end lilypond @c 未訳 diff --git a/Documentation/ja/notation/fretted-strings.itely b/Documentation/ja/notation/fretted-strings.itely index 016491cf3e..da57b16580 100644 --- a/Documentation/ja/notation/fretted-strings.itely +++ b/Documentation/ja/notation/fretted-strings.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.28" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -102,10 +102,10 @@ 音符の後に @code{\@var{number}} を付けることによって、演奏する音符の弦を@c 指示することができます。 -@lilypond[verbatim,quote,relative=0] +@lilypond[verbatim,quote,fragment] \clef "treble_8" c4\5 e\4 g2\3 -1 +1 @end lilypond 運指と弦の指示を一緒に使う場合、@c @@ -114,7 +114,7 @@ c4\5 e\4 g2\3 和音全体や和音の @emph{中にない} 単独の音符に適用される場合、@c 運指記号は異なるメカニズムで配置されます。 -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef "treble_8" g4\3-0 g-0\3 @@ -168,7 +168,7 @@ g-0\3 筆記体のタブ譜の音部記号が自動的に付け加えられます。 @lilypond[quote,ragged-right,verbatim] -\new TabStaff \relative c' { +\new TabStaff \relative { a,8 a' a d,8 a' a } @@ -184,7 +184,7 @@ symbols = { c4-.^"Allegro" d( e) f4-.\f g a^\fermata \mark \default - c8_.\<\( c16 c~ c2\! + c8_.\<\( c16 c~ 2\! c'2.\prall\) } @@ -210,7 +210,7 @@ symbols = { c4-.^"Allegro" d( e) f4-.\f g a^\fermata \mark \default - c8_.\<\( c16 c~ c2\! + c8_.\<\( c16 c~ 2\! c'2.\prall\) } @@ -245,14 +245,14 @@ symbols = { @lilypond[quote,ragged-right,verbatim] \layout { \omit Voice.StringNumber } \new StaffGroup << - \new Staff \relative c { + \new Staff \relative { \clef "treble_8" \time 2/4 c16 d e f g4 c,16\5 d\5 e\4 f\4 g4\4 c,16 d e f g4 } - \new TabStaff \relative c { + \new TabStaff \relative { c16 d e f g4 c,16\5 d\5 e\4 f\4 g4\4 \set TabStaff.minimumFret = #5 @@ -278,8 +278,8 @@ symbols = { @code{\tabChordRepeats} でも用いることができます。 @lilypond[quote,verbatim] -guitar = \relative c' { - r8 ~ q4 q8~ q q4 +guitar = \relative { + r8 ~ q4 q8~ 8 q4 } \new StaffGroup << @@ -297,10 +297,10 @@ guitar = \relative c' { 繰り返しの差し替え部分でも同様です。 @lilypond[quote,ragged-right,verbatim] -ties = \relative c' { +ties = \relative { \repeat volta 2 { - e2. f4~ - f2 g2~ + e'2. f4~ + 2 g2~ } \alternative { { g4 f2. } @@ -337,10 +337,10 @@ ties = \relative c' { 括弧付きフレット番号の譜刻をキャンセルします: @lilypond[quote,ragged-right,verbatim] -ties = \relative c' { +ties = \relative { \repeat volta 2 { - e2. f4~ - f2 g2~ } + e'2. f4~ + 2 g2~ } \alternative { { g4 f2. } { g4\repeatTie c,2. } @@ -550,15 +550,15 @@ LilyPond は、あらかじめ定義されたチューニングに対して、@c \omit StringNumber } { \clef "bass_8" - \relative c, { - c4 d e f + \relative { + c,4 d e f } } \new TabStaff \with { stringTunings = #bass-tuning } { - \relative c, { - c4 d e f + \relative { + c,4 d e f } } >> @@ -572,7 +572,6 @@ LilyPond は、あらかじめ定義されたチューニングに対して、@c あらかじめ定義された弦チューニングは @file{ly/string-tunings-init.ly} の中に@c あります。 -@funindex stringTunings @funindex \stringTunings @cindex tablature, custom string tunings (カスタム弦チューニングのタブ譜) @cindex custom string tunings (カスタム弦チューニング) @@ -779,7 +778,6 @@ fret-diagram マークアップ文字列のダイアグラムに、@c @cindex fret-diagram markup (フレット ダイアグラムのマークアップ) @cindex ukulele (ウクレレ) -@funindex fret-diagram @funindex \fret-diagram フレット ダイアグラムのサイズ、それにダイアグラムの中のフレット数を@c @@ -870,7 +868,6 @@ fret-diagram マークアップ文字列でドットの大きさと位置を制 @cindex fret-diagram-terse markup (fret-diagram-terse マークアップ) -@funindex fret-diagram-terse @funindex \fret-diagram-terse fret-diagram-terse マークアップ文字列は弦番号を省略します。@c @@ -950,7 +947,6 @@ fret-diagram-terse マークアップを使っている時、@c @cindex fret-diagram-verbose markup (fret-diagram-verbose マークアップ) @cindex capo (カポ) -@funindex fret-diagram-verbose @funindex \fret-diagram-verbose fret-diagram-verbose マークアップ文字列のフォーマットは Scheme リストです。@c @@ -1209,7 +1205,6 @@ myChords = \chordmode { c1 c:m7.5- c:aug } @cindex fret diagrams with chord names @funindex ChordNames -@funindex chordmode @funindex \chordmode コード ネームとフレット ダイアグラムを一緒に表示させることが@c @@ -1364,8 +1359,6 @@ mychords = \chordmode { @cindex chord shapes for fretted instruments (フレットのある楽器のコード シェイプ) @funindex \addChordShape -@funindex addChordShape -@funindex storePredefinedDiagram @funindex \storePredefinedDiagram @ignore @@ -1491,9 +1484,7 @@ mychords = \chordmode{ >> @end lilypond -@funindex predefinedFretboardsOff @funindex \predefinedFretboardsOff -@funindex predefinedFretboardsOn @funindex \predefinedFretboardsOn デフォルトではあらかじめ定義されたダイアグラムは読み込まれないため、@c @@ -1627,7 +1618,6 @@ property. @cindex fingerings, right hand for fretted instruments (フレットのある楽器での右手の運指) @cindex right hand fingerings for fretted instruments (フレットのある楽器での右手の運指) -@funindex rightHandFinger @funindex \rightHandFinger 右手の運指 @var{p-i-m-a} は後に数字が続く @code{\rightHandFinger} を用いて@c @@ -1636,14 +1626,14 @@ property. @warning{Scheme 表記で数字を入力する場合、数字の後にくるもの (閉じ括弧 @code{>} 等であっても) の前にスペースを置くことを忘れないで下さい。} -@lilypond[quote,verbatim,relative=0] +@lilypond[quote,verbatim,fragment] \clef "treble_8" c4\rightHandFinger #1 e\rightHandFinger #2 g\rightHandFinger #3 -c\rightHandFinger #4 -1 +c'\rightHandFinger #4 +1 @end lilypond 入力しやすくするために、@code{\rightHandFinger} を短縮することができます。 @@ -1699,14 +1689,16 @@ LilyPond は楽譜譜刻プログラムなので、@c 以下の例は、楽譜にギターのポジションとバレーの指示を含める方法を示しています。 -@lilypond[quote,ragged-right,verbatim,relative=0] -\clef "treble_8" -b16 d g b e -\textSpannerDown -\override TextSpanner.bound-details.left.text = #"XII " -g16\startTextSpan -b16 e g e b g\stopTextSpan -e16 b g d +@lilypond[quote,ragged-right,verbatim,fragment] +\relative { + \clef "treble_8" + b,16 d g b e + \textSpannerDown + \override TextSpanner.bound-details.left.text = #"XII " + g16\startTextSpan + b16 e g e b g\stopTextSpan + e16 b g d +} @end lilypond @seealso @@ -1731,10 +1723,10 @@ e16 b g d 通常、ハーモニクスにはテキスト マークアップによる説明も付け加えます。 @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \clef "treble_8" \override Staff.NoteHead.style = #'harmonic-mixed - d^\markup { \italic { \fontsize #-2 { "harm. 12" }}} 1 + d'^\markup { \italic { \fontsize #-2 { "harm. 12" }}} 1 } @end lilypond @@ -1742,7 +1734,7 @@ e16 b g d 通常の譜とタブ譜でサポートされます: @lilypond[quote,ragged-right,verbatim] -music = \relative c' { +music = \relative { < a\3 \deadNote c\2 a'\1 >4 < b\3 \deadNote d\2 b'\1 > < c\3 \deadNote e\2 c'\1 > @@ -1799,7 +1791,6 @@ LilyPond は、符頭を三角形に変更することで、@c @unnumberedsubsubsec パワー コードの指示 @translationof Indicating power chords -@funindex powerChords @funindex \powerChords @cindex power chords (パワー コード) @@ -1812,11 +1803,11 @@ LilyPond は、符頭を三角形に変更することで、@c ChordsAndSymbols = { \chordmode { \powerChords - e,,1:1.5 - a,,1:1.5.8 + e,,1:5 + a,,1:5.8 \set minimumFret = #8 - c,1:1.5 - f,1:1.5.8 + c,1:5 + f,1:5.8 } \set minimumFret = #5 1 @@ -1845,8 +1836,8 @@ ChordsAndSymbols = { mixedChords = \chordmode { c,1 \powerChords - b,,1:1.5 - fis,,1:1.5.8 + b,,1:5 + fis,,1:5.8 g,,1:m } \score { diff --git a/Documentation/ja/notation/input.itely b/Documentation/ja/notation/input.itely index 0f02c9a922..c7429f51f8 100644 --- a/Documentation/ja/notation/input.itely +++ b/Documentation/ja/notation/input.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.15" +@c \version "2.19.22" @c Translators: Yoshiki Sawada @@ -596,10 +596,10 @@ book が単一の score しか持たない場合、@c } \score { - \new Staff \relative g, { + \new Staff \relative { \clef bass \key g \major - \repeat unfold 2 { g16( d' b') a b d, b' d, } | + \repeat unfold 2 { g,16( d' b') a b d, b' d, } | \repeat unfold 2 { g,16( e' c') b c e, c' e, } | } \header { @@ -608,7 +608,7 @@ book が単一の score しか持たない場合、@c } \score { - \new Staff \relative b { + \new Staff \relative { \clef bass \key g \major \partial 16 b16 | @@ -837,8 +837,8 @@ book のメイン タイトル ブロックのテキスト フィールドはす @lilypond[papersize=a8landscape] \book { \score { - \relative c' { - c4 d e f + \relative { + c'4 d e f } } } @@ -853,8 +853,8 @@ book のメイン タイトル ブロックのテキスト フィールドはす tagline = "... music notation for Everyone" } \score { - \relative c' { - c4 d e f + \relative { + c'4 d e f } } } @@ -1015,7 +1015,7 @@ scoreTitleMarkup = \markup @{ \column @{ { s1 } \header { piece = "RONDEAU" - composer = "François Couperin" + composer = "François Couperin" } } } @@ -1292,7 +1292,7 @@ scoreTitleMarkup = \markup @{ \column @{ @lilypond[verbatim,quote,ragged-right,papersize=a8] \book { \header { copyright = \markup { "Copyright 1970" } } - \relative c' { + \relative { a'4-\footnote #'(-3 . 0) \markup { \bold Forte } \f -\footnote #'(0 . 1.5) \markup { スラー } ( b8)-\footnote #'(0 . -2) \markup { 連桁 } [ e] @@ -1315,7 +1315,7 @@ scoreTitleMarkup = \markup @{ \column @{ \book { \header { tagline = ##f } \markup { \auto-footnote "A simple tune" \italic "By me" } - \relative c' { + \relative { a'4 b8 e c4 d } } @@ -1386,7 +1386,7 @@ LilyPond は対応するマークアップを同じページの下に表示す @lilypond[verbatim,quote,ragged-right,papersize=a8] \book { \header { tagline = ##f } - \relative c' { + \relative { a'4-\footnote \markup { \teeny 1 } #'(-3 . 0) \markup { 1. \bold フォルテ } \f @@ -1422,7 +1422,7 @@ LilyPond は対応するマークアップを同じページの下に表示す \book { \header { tagline = ##f } \markup { "A simple tune" \footnote "*" \italic "* By me" } - \relative c' { + \relative { a'4 b8 e c4 d4 } } @@ -1656,7 +1656,7 @@ book のページ数が 10 から 99 までの範囲であるのなら、ゲー } tocAct = -#(define-music-function (parser location text) (markup?) +#(define-music-function (text) (markup?) (add-toc-item! 'tocActMarkup text)) @end verbatim @@ -1671,7 +1671,7 @@ tocAct = } tocAct = -#(define-music-function (parser location text) (markup?) +#(define-music-function (text) (markup?) (add-toc-item! 'tocActMarkup text)) \book { @@ -1892,10 +1892,10 @@ LilyPond が使用するパスとファイルのリストを表示します。@c ここに例を挙げます: @lilypond[verbatim,quote] -sopranoMusic = \relative c'' { a4 b c b8( a) } -altoMusic = \relative g' { e4 e e f } -tenorMusic = \relative c' { c4 b e d8( c) } -bassMusic = \relative c' { a4 gis a d, } +sopranoMusic = \relative { a'4 b c b8( a) } +altoMusic = \relative { e'4 e e f } +tenorMusic = \relative { c'4 b e d8( c) } +bassMusic = \relative { a4 gis a d, } allLyrics = \lyricmode {King of glo -- ry } << \new Staff = "Soprano" \sopranoMusic @@ -1986,8 +1986,8 @@ allLyrics = \lyricmode {King of glo -- ry } もう 1 つはトリルを明示的に展開しています: @lilypond[verbatim,quote] -music = \relative g' { - g8. c32 d +music = \relative { + g'8. c32 d \tag #'trills {d8.\trill } \tag #'expand {\repeat unfold 3 {e32 d} } c32 d @@ -2006,8 +2006,8 @@ music = \relative g' { 音楽セクションを排除する方が楽な場合もあります: @lilypond[verbatim,quote] -music = \relative g' { - g8. c32 d +music = \relative { + g'8. c32 d \tag #'trills {d8.\trill } \tag #'expand {\repeat unfold 3 {e32 d} } c32 d @@ -2216,6 +2216,17 @@ FT_Get_Glyph_Name () error: invalid argument @c KEEP LY @lilypond[quote] %c No verbatim here as the code does not display correctly in PDF +% Font settings for Cyrillic and Hebrew +% Linux Libertine fonts contain Cyrillic and Hebrew glyphs. +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + #:sans "Linux Biolinum O,sans-serif" + #:typewriter "Linux Libertine Mono O,monospace" + )) +} + % キリル文字 bulgarian = \lyricmode { Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон. @@ -2231,8 +2242,8 @@ portuguese = \lyricmode { à vo -- cê uma can -- ção legal } -\relative c' { - c2 d e f g f e +\relative { + c'2 d e f g f e } \addlyrics { \bulgarian } \addlyrics { \hebrew } @@ -2280,13 +2291,13 @@ Unicode U+03BE の文字を入力します @lilypond[quote,verbatim] \score { - \relative c'' { - c1 \mark \markup { \char ##x03EE } + \relative { + c''1 \mark \markup { \char ##x03EE } c1_\markup { \tiny { \char ##x03B1 " to " \char ##x03C9 } } } \addlyrics { O \markup { \concat { Ph \char ##x0153 be! } } } } -\markup { "Copyright 2008--2012" \char ##x00A9 } +\markup { "Copyright 2008--2015" \char ##x00A9 } @end lilypond @cindex copyright sign (著作権記号) @@ -2440,12 +2451,14 @@ showLastLength = R1*5 スキップするということに注意してください。@c くれぐれも注意してください。 -@lilypond[quote,relative=2,ragged-right,verbatim] -c8 d -\set Score.skipTypesetting = ##t -e8 e e e e e e e -\set Score.skipTypesetting = ##f -c8 d b bes a g c2 +@lilypond[quote,ragged-right,verbatim] +\relative { + c''8 d + \set Score.skipTypesetting = ##t + e8 e e e e e e e + \set Score.skipTypesetting = ##f + c8 d b bes a g c2 +} @end lilypond 多声の音楽では、@code{Score.skipTypesetting} はすべてのボイスと譜に@c @@ -2919,8 +2932,8 @@ MIDI ボリュームに影響を与えません。@c \set Staff.midiInstrument = #"cello" \set Score.dynamicAbsoluteVolumeFunction = #myDynamics \new Voice { - \relative c'' { - a4\pp b c-\rfz + \relative { + a'4\pp b c-\rfz } } } @@ -2959,17 +2972,17 @@ midiMinimumVolume + (midiMaximumVolume - midiMinimumVolume) * fraction \key g \major \time 2/2 \set Staff.midiInstrument = #"flute" - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 + \new Voice \relative { + r2 g''\mp g fis~ + 4 g8 fis e2~ + 4 d8 cis d2 } } \new Staff { \key g \major \set Staff.midiInstrument = #"clarinet" - \new Voice \relative c'' { - b1\p a2. b8 a + \new Voice \relative { + b'1\p a2. b8 a g2. fis8 e fis2 r } @@ -3010,10 +3023,10 @@ MIDI 出力の品質を著しく高めることができます。 \set Staff.midiInstrument = #"flute" \set Staff.midiMinimumVolume = #0.7 \set Staff.midiMaximumVolume = #0.9 - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 + \new Voice \relative { + r2 g''\mp g fis~ + 4 g8 fis e2~ + 4 d8 cis d2 } } \new Staff { @@ -3021,8 +3034,8 @@ MIDI 出力の品質を著しく高めることができます。 \set Staff.midiInstrument = #"clarinet" \set Staff.midiMinimumVolume = #0.3 \set Staff.midiMaximumVolume = #0.6 - \new Voice \relative c'' { - b1\p a2. b8 a + \new Voice \relative { + b'1\p a2. b8 a g2. fis8 e fis2 r } @@ -3079,17 +3092,17 @@ MIDI 最小/最大ボリューム プロパティが設定されていない場 \time 2/2 \set Score.instrumentEqualizer = #my-instrument-equalizer \set Staff.midiInstrument = #"flute" - \new Voice \relative c''' { - r2 g\mp g fis ~ - fis4 g8 fis e2 ~ - e4 d8 cis d2 + \new Voice \relative { + r2 g''\mp g fis ~ + 4 g8 fis e2 ~ + 4 d8 cis d2 } } \new Staff { \key g \major \set Staff.midiInstrument = #"clarinet" - \new Voice \relative c'' { - b1\p a2. b8 a + \new Voice \relative { + b'1\p a2. b8 a g2. fis8 e fis2 r } @@ -3120,8 +3133,8 @@ MIDI 最小/最大ボリューム プロパティが設定されていない場 @lilypond[verbatim,quote] \score { - \relative c' { - c cih cis cisih + \relative { + c' cih cis cisih d dih ees eeh e eih f fih fis fisih g gih diff --git a/Documentation/ja/notation/keyboards.itely b/Documentation/ja/notation/keyboards.itely index 9827d26632..0a28ca77a8 100644 --- a/Documentation/ja/notation/keyboards.itely +++ b/Documentation/ja/notation/keyboards.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.21" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -116,7 +116,7 @@ @c @snippets @c @lilypondfile[verbatim,quote,texidoc,doctitle] @c {forcing-visibility-of-systems-with-multi-bar-rests-when-using-\RemoveEmptyStaffContext.ly} -@c http://lsr.dsi.unimi.it/LSR/Item?u=1&id=312 +@c http://lsr.di.unimi.it/LSR/Item?u=1&id=312 @seealso 学習マニュアル: @@ -155,7 +155,6 @@ @cindex beams, cross-staff (譜を跨ぐ連桁) @funindex \change -@funindex change 以下のコマンドを用いて、ボイスの譜を手動で切り換えることができます: @@ -271,7 +270,6 @@ @cindex staff changes, automatic (譜の自動変更) @funindex \autochange -@funindex autochange @funindex PianoStaff 譜の上端と下端の間で、ボイスを自動的に切り換えることができます。@c @@ -301,7 +299,6 @@ @cindex autochange and relative music (自動変更と相対モード) @funindex \relative -@funindex relative @code{\autochange} の外側にある @code{\relative} セクションは、@c @code{\autochange} の内部にある音符のピッチに影響を与えません。@c @@ -324,7 +321,7 @@ \new Staff = "up" { \new Voice = "melOne" { \key g \major - \autochange \relative c' { + \autochange \relative { g8 b a c b d c e d8 r fis, g a2 } @@ -376,17 +373,15 @@ @funindex followVoice @funindex \showStaffSwitch -@funindex showStaffSwitch @funindex \hideStaffSwitch -@funindex hideStaffSwitch ボイスが他の譜に切り替わる時に、音符を繋げる線を自動的に譜刻することができます: -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim] \new PianoStaff << \new Staff = "one" { \showStaffSwitch - c1 + c'1 \change Staff = "two" b2 a } @@ -478,30 +473,26 @@ @cindex U.C. @funindex \sustainOn -@funindex sustainOn @funindex \sustainOff -@funindex sustainOff @funindex \sostenutoOn -@funindex sostenutoOn @funindex \sostenutoOff -@funindex sostenutoOff @funindex \unaCorda -@funindex unaCorda @funindex \treCorde -@funindex treCorde 一般的に、ピアノは音を変化させるために 3 本のペダルを持ちます: @notation{サステイン}, @notation{ソステヌート} (@notation{sos.}), それに @notation{ウナ コルダ} (@notation{una corda}, @notation{U.C.}) です。@c サステイン ペダルは、ビブラフォンやチェレスタにもあります。 -@lilypond[quote,verbatim,relative=2] -c4\sustainOn d e g -1\sustainOff -c4\sostenutoOn e g c, -1\sostenutoOff -c4\unaCorda d e g -1\treCorde +@lilypond[quote,verbatim] +\relative { + c''4\sustainOn d e g + 1\sustainOff + c4\sostenutoOn e g c, + 1\sostenutoOff + c4\unaCorda d e g + 1\treCorde +} @end lilypond @cindex pedal indication styles (ペダル指示スタイル) @@ -522,15 +513,17 @@ c4\unaCorda d e g サステイン ペダルとウナ コルダ ペダルの指示はテキスト スタイルですが、@c ソステヌート ペダル指示は混合スタイルです。 -@lilypond[quote,verbatim,relative=2] -c4\sustainOn g c2\sustainOff -\set Staff.pedalSustainStyle = #'mixed -c4\sustainOn g c d -d\sustainOff\sustainOn g, c2\sustainOff -\set Staff.pedalSustainStyle = #'bracket -c4\sustainOn g c d -d\sustainOff\sustainOn g, c2 -\bar "|." +@lilypond[quote,verbatim] +\relative { + c''4\sustainOn g c2\sustainOff + \set Staff.pedalSustainStyle = #'mixed + c4\sustainOn g c d + d\sustainOff\sustainOn g, c2\sustainOff + \set Staff.pedalSustainStyle = #'bracket + c4\sustainOn g c d + d\sustainOff\sustainOn g, c2 + \bar "|." +} @end lilypond ペダル コマンドの配置は、@c @@ -663,20 +656,20 @@ d\sustainOff\sustainOn g, c2 右のペダルは E, F, G, それに A です。@c ペダルのポジションをテキスト記号で指示することがあります: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \textLengthOn -cis1_\markup \concat \vcenter { +cis''1_\markup \concat \vcenter { [D \flat C \sharp B|E \sharp F \sharp G A \flat] } -c!1_\markup \concat \vcenter { +c''!1_\markup \concat \vcenter { [ C \natural ] } @end lilypond あるいはペダル ダイアグラムで指示することもあります: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \textLengthOn -cis1_\markup { \harp-pedal #"^v-|vv-^" } -c!1_\markup { \harp-pedal #"^o--|vv-^" } +cis''1_\markup { \harp-pedal #"^v-|vv-^" } +c''!1_\markup { \harp-pedal #"^o--|vv-^" } @end lilypond @code{\harp-pedal} コマンドは文字列を受け取ります。@c diff --git a/Documentation/ja/notation/percussion.itely b/Documentation/ja/notation/percussion.itely index 9968a12829..b308244015 100644 --- a/Documentation/ja/notation/percussion.itely +++ b/Documentation/ja/notation/percussion.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.2" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -523,7 +523,7 @@ bellstaff = { \drummode { \time 2/4 rb8 rb cb cb16 rb-> ~ | - rb16 rb8 rb16 cb8 cb | + 16 rb8 rb16 cb8 cb | } } @end lilypond diff --git a/Documentation/ja/notation/pitches.itely b/Documentation/ja/notation/pitches.itely index eb6713859b..b5e85815e1 100644 --- a/Documentation/ja/notation/pitches.itely +++ b/Documentation/ja/notation/pitches.itely @@ -6,7 +6,7 @@ version that you are working on. See TRANSLATION for details. @end ignore -@c \version "2.17.18" +@c \version "2.19.22" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -104,23 +104,25 @@ @unnumberedsubsubsec 相対オクターブ入力 @translationof Relative octave entry +@c 本項目のみ先に翻訳 2015-12-31 +@c ドキュメント全体的に相対モードの開始ピッチ指定方法が変更されており、 +@c 従前のままの内容だと混乱をきたす可能性があるため。 + @cindex relative (相対) @cindex relative octave entry (相対オクターブ入力) @cindex octave entry, relative (相対オクターブ入力) @cindex relative octave specification (相対オクターブ指定) @cindex ocatve specification, relative (相対オクターブ指定) -@funindex relative @funindex \relative -オクターブが絶対モードで指定されている場合、@c -ピッチを間違ったオクターブに置くことは容易に起こりえます。@c -相対オクターブ モードはそのようなエラーを減らします。@c -なぜなら、相対オクターブ モードでは、たいていの場合、@c -オクターブを指定する必要が無いからです。@c -さらに、絶対モードでは 1 つのミスを見つけることが@c -困難であるかもしれないのに対し、@c -相対モードでは 1 つのミスが楽曲の残りの部分を 1 オクターブずらします。 +絶対オクターブ入力は、一つ一つの音符のオクターブを指定する必要があります。@c +相対オクターブ入力は、対照的に、@c +すぐ前の音符との関係で各オクターブを指定します。@c +1 つの音符のオクターブを変更すると、続く音符のすべてに影響します。 + +相対音符モードは @code{\relative} コマンドを使って@c +明示的に入力する必要があります。 @example \relative @var{startpitch} @var{musicexpr} @@ -148,15 +150,35 @@ @item 最初の音符のピッチは @code{@var{startpitch}} と相対関係で決定されます。@c -@var{startpitch} は絶対オクターブ モードで指定され、@c -@code{c} のオクターブにしておくことを推奨します。 +@var{startpitch} は絶対オクターブ モードで指定されます。@c +どの選択肢がわかりやすですか? + +@table @asis +@item @code{c} のオクターブ +@code{c'} でミドル C を指定することは極めて基本的なため、@c +@code{c} のオクターブは、どちらかといえば素直です。@c +あなたの音楽が @code{c'''} より高い @code{gis} で始まる場合、@c +@code{\relative c''' @{ gis' @dots{} @}} のように書くことができます。 + +@item 内部の最初の音符のオクターブ +@code{\relative gis''' @{ gis @dots{} @}} と書くことで、@c +内部の最初の音符の絶対ピッチを簡単に決めることができます。 + +@item 明示的な開始ピッチ無し +@code{\relative @{ gis''' @dots{} @}} の形式は@c +前の選択肢のコンパクト版として機能します。@c +内部の最初の音符は絶対ピッチで書かれます。@c +(これは基準ピッチとして @code{f} を選択したのと同じです。) +@end table + +このドキュメントは通常、最後の選択肢を使用します。 @end itemize ここで、実際に相対モードの例を挙げます: @lilypond[verbatim,quote] -\relative c { +\relative { \clef bass c d e f g a b c @@ -167,11 +189,9 @@ オクターブ変更記号は 4 度よりも大きな音程に対して使用されます: @lilypond[verbatim,quote] -\relative c { - \clef bass - c d e f - g a b c - d e f g +\relative { + c'' g c f, + c' a, e'' c } @end lilypond @@ -179,20 +199,21 @@ 大きな音程に広がる可能性があります: @lilypond[verbatim,quote] -\relative c { +\relative { c f b e a d g c } @end lilypond @code{\relative} ブロックがネストされている場合、@c -最も内側の @code{\relative} ブロックが適用されます。 +最も内側の @code{\relative} ブロックが、外側の @code{\relative} +とは独立した自身の参照ピッチで開始します。 @lilypond[verbatim,quote] -\relative c' { - c d e f - \relative c'' { - c d e f +\relative { + c' d e f + \relative { + c'' d e f } } @end lilypond @@ -215,12 +236,12 @@ 絶対モードになります。 @lilypond[verbatim,quote] -\relative c' { - d e +\relative { + d' e \transpose f g { d e - \relative c' { - d e + \relative { + d' e } } } @@ -235,8 +256,8 @@ 次の例を、@code{c} の音符に気を付けて、注意深く検証してください。 @lilypond[verbatim,quote] -\relative c' { - c +\relative { + c' @@ -247,21 +268,18 @@ いかなる変更にも影響を受けません。@c そのため、B の後の E ダブル シャープは B よりも上に配置され、@c B の後の F ダブル フラットは B よりも下に配置されます。@c -言い換えると、4 度の 2 重増音の音程は 5 度の 2 重減音の音程よりも小さい +言い換えると、重増 4 度は重減 5 度よりも小さい -- それぞれの音程に含まれる半音の数に関係無く -- と見なされます。 @lilypond[verbatim,quote] -\relative c'' { - c2 fis +\relative { + c''2 fis c2 ges b2 eisis b2 feses } @end lilypond -これらの規則から導き出される結論の 1 つは、@c -@code{@w{\relative f}} ブロックの中の最初の音符は絶対ピッチ モードで記述された@c -音符と全く同様に解釈されるということです。 @seealso 音楽用語集: @@ -283,18 +301,8 @@ B の後の F ダブル フラットは B よりも下に配置されます。@c @cindex transposition and relative octave entry (移調と相対オクターブ入力) @funindex \transpose -@funindex transpose @funindex \chordmode -@funindex chordmode @funindex \relative -@funindex relative - -@c DEPRECATED -@code{\relative} に対して @code{@var{startpitch}} が指定されていない場合、@c -@code{c'} であると見なされます。@c -しかしながら、これは使用を推奨されなくなったオプションであり、@c -将来のバージョンでは無くなるかもしれないので、@c -@code{@var{startpitch}} を指定しないことはお勧めできません。 @node 臨時記号 @@ -336,16 +344,16 @@ LilyPond では、音符名は未加工の入力です 臨時記号に他の名前を使うには、@c @ref{Note names in other languages} を参照してください。 -@lilypond[verbatim,quote,relative=2] -ais1 aes aisis aeses +@lilypond[verbatim,quote,fragment] +\relative c'' { ais1 aes aisis aeses } @end lilypond ナチュラルは臨時記号や調号の効果をキャンセルします。@c しかしながら、ナチュラルは接尾辞として音符名構文にエンコードされてはいません。@c そのため、ナチュラルのピッチは単に音符名で入力されます: -@lilypond[verbatim,quote,relative=2] -a4 aes a2 +@lilypond[verbatim,quote,fragment] +\relative c'' { a4 aes a2 } @end lilypond @cindex quarter tones (4 分音) @@ -355,8 +363,8 @@ a4 aes a2 4 分音が付け加えられるかもしれません。@c 以下の一連の C は左から順にピッチが増えていっています: -@lilypond[verbatim,quote,relative=2] -ceseh1 ces ceh c cih cis cisih +@lilypond[verbatim,quote,fragment] +\relative c'' { ceseh1 ces ceh c cih cis cisih } @end lilypond @@ -379,8 +387,8 @@ ceseh1 ces ceh c cih cis cisih 譜刻することができます。@c これら追加の臨時記号を使ってナチュラル記号を作り出すこともできます。 -@lilypond[verbatim,quote,relative=2] -cis cis cis! cis? c c c! c? +@lilypond[verbatim,quote,fragment] +\relative c'' { cis cis cis! cis? c c c! c? } @end lilypond @cindex accidental on tied note (タイで結ばれた音符への臨時記号) @@ -389,10 +397,12 @@ cis cis cis! cis? c c c! c? タイで結ばれた音符に付ける臨時記号は@c 新しいシステム (訳者: 譜 1 行分のこと) の開始点でのみ譜刻されます: -@lilypond[verbatim,quote,relative=2] -cis1 ~ cis ~ -\break -cis +@lilypond[verbatim,quote,fragment,ragged-right] +\relative c'' { + cis1~ 1~ + \break + cis +} @end lilypond @@ -454,8 +464,8 @@ LilyPond の記号はいかなる標準にも準拠しません。 @lilypond[quote,verbatim] \language "italiano" -\relative do' { - do re mi sib +\relative { + do' re mi sib } @end lilypond @@ -530,8 +540,8 @@ LilyPond ではどちらの形式も認められます。@c @code{eeses}@tie{}/@tie{}@code{eses} にも適用されます。@c 他の言語ファイルでは短縮名だけが定義されている場合があります。 -@lilypond[verbatim,quote,relative=2] -a2 as e es a ases e eses +@lilypond[verbatim,quote,fragment] +\relative c'' { a2 as e es a ases e eses } @end lilypond @@ -617,7 +627,6 @@ a2 as e es a ases e eses @funindex = @funindex \octaveCheck -@funindex octaveCheck @funindex controlpitch 相対モードでは、オクターブ変更記号を付け忘れることが容易に起こり得ます。@c @@ -632,8 +641,8 @@ a2 as e es a ases e eses 警告を発し (そしてピッチを変更し) ます。 @lilypond[verbatim,quote] -\relative c'' { - c2 d='4 d +\relative { + c''2 d='4 d e2 f } @end lilypond @@ -650,8 +659,8 @@ a2 as e es a ases e eses その後に続く音符は @code{@var{controlpitch}} から算出されます。 @lilypond[verbatim,quote] -\relative c'' { - c2 d +\relative { + c''2 d \octaveCheck c' e2 f } @@ -662,8 +671,8 @@ a2 as e es a ases e eses 2 番目のチェックは失敗していません。 @lilypond[verbatim,quote] -\relative c'' { - c4 f g f +\relative { + c''4 f g f c4 \octaveCheck c' @@ -696,7 +705,6 @@ a2 as e es a ases e eses @cindex notes, transposition of (音符の移調) @funindex \transpose -@funindex transpose 音楽表記は @code{\transpose} で移調させることができます。@c 構文は以下の通りです: @@ -723,9 +731,9 @@ D-メジャーの調で書かれた楽曲を思い浮かべてください。@c @lilypond[verbatim,quote] \transpose d e { - \relative c' { + \relative { \key d \major - d4 fis a d + d'4 fis a d } } @end lilypond @@ -740,9 +748,9 @@ A のクラリネットで演奏する @lilypond[verbatim,quote] \transpose a c' { - \relative c' { + \relative { \key c \major - c4 d e g + c'4 d e g } } @end lilypond @@ -759,7 +767,7 @@ A のクラリネットで演奏する 2 番目の移調はフラットを譜刻し、音符の五線譜上での位置は上に上がります。 @lilypond[verbatim,quote] -music = \relative c' { c d e f } +music = \relative { c' d e f } \new Staff { \transpose c cis { \music } \transpose c des { \music } @@ -815,11 +823,8 @@ musicInBflat = @{ e4 @dots{} @} @rinternals{TransposedMusic} @funindex \transpose -@funindex transpose @funindex \chordmode -@funindex chordmode @funindex \relative -@funindex relative @knownissues 相対変換コマンドはその引数の中にある @code{\transpose}, @code{\chordmode}, @@ -851,7 +856,7 @@ The @code{@var{musicexpr}} の音程は @code{@var{around-pitch}} を中心に@c マッピングされるように移調されます。 @lilypond[verbatim,quote] -music = \relative c' { c d e f } +music = \relative { c' d e f } \new Staff { \music \inversion d' d' \music @@ -878,12 +883,11 @@ music = \relative c' { c d e f } @cindex transformation, retrograde (逆行変換) @cindex operation, retrograde (逆行操作) @funindex \retrograde -@funindex retrograde 音楽表記を後ろから前に演奏する逆行を作り出すことができます: @lilypond[verbatim,quote] -music = \relative c' { c8. ees16( fis8. a16 b8.) gis16 f8. d16 } +music = \relative { c'8. ees16( fis8. a16 b8.) gis16 f8. d16 } \new Staff { \music @@ -925,7 +929,6 @@ music = \relative c' { c8. ees16( fis8. a16 b8.) gis16 f8. d16 } @cindex transposition, modal (様式的な移調) @cindex operation, transposition (移調操作) @funindex \modalTranspose -@funindex modalTranspose 以下により、与えられた音階でモチーフを移調させることができます: @@ -937,8 +940,8 @@ music = \relative c' { c8. ees16( fis8. a16 b8.) gis16 f8. d16 } 間の音程の度数の分だけシフトされます: @lilypond[verbatim,quote] -diatonicScale = \relative c' { c d e f g a b } -motif = \relative c' { c8 d e f g a b c } +diatonicScale = \relative { c' d e f g a b } +motif = \relative { c'8 d e f g a b c } \new Staff { \motif @@ -950,8 +953,8 @@ motif = \relative c' { c8 d e f g a b c } 上昇する音階の長さは任意であり、指定する音程も任意です: @lilypond[verbatim,quote] -pentatonicScale = \relative c' { ges aes bes des ees } -motif = \relative c' { ees8 des ges,4 } +pentatonicScale = \relative { ges aes bes des ees } +motif = \relative { ees'8 des ges,4 } \new Staff { \motif @@ -964,8 +967,8 @@ motif = \relative c' { ees8 des ges,4 } できます: @lilypond[verbatim,quote] -chromaticScale = \relative c' { c cis d dis e f fis g gis a ais b } -motif = \relative c' { c8 d e f g a b c } +chromaticScale = \relative { c' cis d dis e f fis g gis a ais b } +motif = \relative { c'8 d e f g a b c } \new Staff { \motif @@ -980,7 +983,6 @@ motif = \relative c' { c8 d e f g a b c } @cindex inversion, modal (様式的な反転) @cindex operation, modal inversion (様式的な反転操作) @funindex \modalInversion -@funindex modalInversion モチーフを与えられた音階に従って与えられた旋回点 (音符) で反転させて、 移調させることを 1 つの操作でできます: @@ -1001,8 +1003,8 @@ motif = \relative c' { c8 d e f g a b c } @var{to-pitch} で同じ値を使用します: @lilypond[verbatim,quote] -octatonicScale = \relative c' { ees f fis gis a b c d } -motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } +octatonicScale = \relative { ees' f fis gis a b c d } +motif = \relative { c'8. ees16 fis8. a16 b8. gis16 f8. d16 } \new Staff { \motif @@ -1015,8 +1017,8 @@ motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } 指定された 2 つの音符が旋回点を囲んでいると解釈することができます: @lilypond[verbatim,quote] -scale = \relative c' { c g' } -motive = \relative c' { c c g' c, } +scale = \relative { c' g' } +motive = \relative { c' c g' c, } \new Staff { \motive @@ -1027,8 +1029,8 @@ motive = \relative c' { c c g' c, } 反転と逆行の操作を組み合わせると逆行-反転になります: @lilypond[verbatim,quote] -octatonicScale = \relative c' { ees f fis gis a b c d } -motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } +octatonicScale = \relative { ees' f fis gis a b c d } +motif = \relative { c'8. ees16 fis8. a16 b8. gis16 f8. d16 } \new Staff { \motif @@ -1096,53 +1098,52 @@ motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } @cindex clef, subbass (低バス音部記号) @funindex \clef -@funindex clef 音部記号を変えることができます。@c 以下のそれぞれの例の中にある音符はすべてミドル C です。@c 例の中にある音部名をダブル クォートで囲むことができます (必須ではありません)。 -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef treble -c2 c +c'2 c' \clef alto -c2 c +c'2 c' \clef tenor -c2 c +c'2 c' \clef bass -c2 c +c'2 c' @end lilypond 他の音部記号もあります: @c KEEP LY -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef french -c2 c +c'2 c' \clef soprano -c2 c +c'2 c' \clef mezzosoprano -c2 c +c'2 c' \clef baritone -c2 c +c'2 c' \break \clef varbaritone -c2 c +c'2 c' \clef subbass -c2 c +c'2 c' \clef percussion -c2 c +c'2 c' \break \clef G % treble と同義です -c2 c +c'2 c' \clef F % bass と同義です -c2 c +c'2 c' \clef C % alto と同義です -c2 c +c'2 c' @end lilypond @cindex transposing clefs (音部を移調する) @@ -1160,29 +1161,29 @@ c2 c 音部名にアルファベット以外の文字が含まれる場合、@c 音部名をダブル クォートで囲む必要があります。 -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef treble -c2 c +c'2 c' \clef "treble_8" -c2 c +c'2 c' \clef "bass^15" -c2 c +c'2 c' \clef "alto_2" -c2 c +c'2 c' \clef "G_8" -c2 c +c'2 c' \clef "F^5" -c2 c +c'2 c' @end lilypond 数字の引数を括弧や角括弧で囲むことで、オプションのオクターブを@c 表示させることができます: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef "treble_(8)" -c2 c +c'2 c' \clef "bass^[15]" -c2 c +c'2 c' @end lilypond ピッチは数字の引数が括弧で囲まれていない場合と同じです。 @@ -1223,13 +1224,13 @@ c2 c 別の @code{\override} で @var{ClefModifier} グラフィカル オブジェクトに@c 適用する必要があります。 -@lilypond[fragment,quote,relative=1] +@lilypond[fragment,quote,verbatim] \new Staff \with { \override ClefModifier.color = #red \override Clef.color = #blue } -\clef "treble_8" c4 +\clef "treble_8" c'4 @end lilypond @@ -1240,7 +1241,6 @@ c2 c @cindex key signature (調号) @funindex \key -@funindex key @c duplicated in Key signature and Accidentals @warning{LilyPond を始めたばかりのユーザは@c @@ -1260,23 +1260,14 @@ LilyPond では、音符名は未加工の入力です。@c @end example @funindex \major -@funindex major @funindex \minor -@funindex minor @funindex \ionian -@funindex ionian @funindex \locrian -@funindex locrian @funindex \aeolian -@funindex aeolian @funindex \mixolydian -@funindex mixolydian @funindex \lydian -@funindex lydian @funindex \phrygian -@funindex phrygian @funindex \dorian -@funindex dorian @cindex church modes (チャーチ モード) @cindex modes (モード) @@ -1300,11 +1291,13 @@ LilyPond では、音符名は未加工の入力です。@c @code{\ionian}, @code{\dorian}, @code{\phrygian}, @code{\lydian}, @code{\mixolydian}, @code{\aeolian} それに @code{\locrian} です。 -@lilypond[verbatim,quote,relative=2] -\key g \major -fis1 -f -fis +@lilypond[verbatim,quote,fragment] +\relative { + \key g \major + fis''1 + f + fis +} @end lilypond 新たにモードを定義することができます @@ -1315,8 +1308,8 @@ fis freygish = #`((0 . ,NATURAL) (1 . ,FLAT) (2 . ,NATURAL) (3 . ,NATURAL) (4 . ,NATURAL) (5 . ,FLAT) (6 . ,FLAT)) -\relative c' { - \key c\freygish c4 des e f +\relative { + \key c\freygish c'4 des e f \bar "||" \key d\freygish d es fis g } @end lilypond @@ -1329,14 +1322,14 @@ freygish = #`((0 . ,NATURAL) (1 . ,FLAT) (2 . ,NATURAL) 1 つの値だけを渡した場合、その譜ポジションで終了するオクターブの範囲@c に臨時記号が配置されます。 -@lilypond[verbatim, quote,relative=0] +@lilypond[verbatim, quote,fragment] \override Staff.KeySignature.flat-positions = #'((-5 . 5)) \override Staff.KeyCancellation.flat-positions = #'((-5 . 5)) -\clef bass \key es\major es g bes d -\clef treble \bar "||" \key es\major es g bes d +\clef bass \key es \major es g bes d' +\clef treble \bar "||" \key es \major es' g' bes' d'' \override Staff.KeySignature.sharp-positions = #'(2) -\bar "||" \key b\major b fis b2 +\bar "||" \key b \major b' fis' b'2 @end lilypond @snippets @@ -1379,22 +1372,23 @@ freygish = #`((0 . ,NATURAL) (1 . ,FLAT) (2 . ,NATURAL) @funindex set-octavation @funindex \ottava -@funindex ottava @notation{オッターバ囲み} は譜をオクターブ単位で移調します: -@lilypond[verbatim,quote,relative=2] -a2 b -\ottava #-2 -a2 b -\ottava #-1 -a2 b -\ottava #0 -a2 b -\ottava #1 -a2 b -\ottava #2 -a2 b +@lilypond[verbatim,quote] +\relative a' { + a2 b + \ottava #-2 + a2 b + \ottava #-1 + a2 b + \ottava #0 + a2 b + \ottava #1 + a2 b + \ottava #2 + a2 b +} @end lilypond @snippets @@ -1426,7 +1420,6 @@ a2 b @cindex MIDI transposition (MIDI の移調) @funindex \transposition -@funindex transposition 楽器の移調を含む楽器を譜刻するとき、いくつかのパートは@c @notation{コンサート ピッチ} とは異なるピッチで譜刻される可能性があります。@c @@ -1555,12 +1548,12 @@ LilyPond はどの臨時記号スタイルを使用するのかを指定する @lilypond[verbatim,quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1570,8 +1563,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1637,12 +1630,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1652,8 +1645,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1709,12 +1702,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1724,8 +1717,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1778,12 +1771,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1793,8 +1786,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1842,12 +1835,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1857,8 +1850,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1910,12 +1903,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1925,8 +1918,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1972,12 +1965,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1987,8 +1980,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2038,12 +2031,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2053,8 +2046,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2097,12 +2090,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2112,8 +2105,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2160,12 +2153,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2175,8 +2168,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2217,12 +2210,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2232,8 +2225,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2276,12 +2269,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2291,8 +2284,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2333,12 +2326,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2348,8 +2341,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2395,12 +2388,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2410,8 +2403,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2457,12 +2450,12 @@ musicB = { @lilypond[quote,staffsize=18] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2472,8 +2465,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2518,12 +2511,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2533,8 +2526,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2577,12 +2570,12 @@ musicB = { @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2592,8 +2585,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2676,7 +2669,7 @@ musicB = { 局部的に臨時記号スタイルを @code{forget} に変更する関数を定義します: @lilypond[verbatim,quote] -forget = #(define-music-function (parser location music) (ly:music?) #{ +forget = #(define-music-function (music) (ly:music?) #{ \accidentalStyle forget #music \accidentalStyle modern @@ -2724,8 +2717,8 @@ forget = #(define-music-function (parser location music) (ly:music?) #{ } } -\relative c'' { - aes c e2 +\relative { + aes' c e2 cis,1 } @end lilypond @@ -2800,16 +2793,18 @@ forget = #(define-music-function (parser location music) (ly:music?) #{ 符頭を変更することができます: -@lilypond[verbatim,quote,relative=2] -c4 b -\override NoteHead.style = #'cross -c4 b -\revert NoteHead.style -a b -\override NoteHead.style = #'harmonic -a b -\revert NoteHead.style -c4 d e f +@lilypond[verbatim,quote] +\relative c'' { + c4 b + \override NoteHead.style = #'cross + c4 b + \revert NoteHead.style + a b + \override NoteHead.style = #'harmonic + a b + \revert NoteHead.style + c4 d e f +} @end lilypond すべての符頭スタイルを調べるには、@ref{Note head styles} を参照してください。 @@ -2818,21 +2813,25 @@ c4 d e f 以下の定義済みコマンドは符頭を譜コンテキストとタブ譜コンテキストで変更し、@c 何らかの音楽的意味を表すために使用することができます: -@lilypond[verbatim,quote,relative=2] -c4 b -\xNotesOn - a b c4 b -\xNotesOff -c4 d +@lilypond[verbatim,quote] +\relative { + c''4 b + \xNotesOn + a b c4 b + \xNotesOff + c4 d +} @end lilypond この定義済みコマンドの音楽関数は、譜コンテキストやタブ譜コンテキストの@c 和音の内外で使用して、符頭を×の形にすることができます: -@lilypond[verbatim,quote,relative=2] -c4 b -\xNote { e f } -c b < g \xNote c f > b +@lilypond[verbatim,quote] +\relative { + c''4 b + \xNote { e f } + c b < g \xNote c f > b +} @end lilypond @code{\xNote}, @code{\xNotesOn} それに @code{\xNotesOff} の同義語として @@ -2842,8 +2841,10 @@ c b < g \xNote c f > b また、和音の中でのみ使用できるダイアモンド形のための短縮記法があります: -@lilypond[verbatim,quote,relative=2] -2 4 +@lilypond[verbatim,quote] +\relative c'' { + 2 4 f\harmonic +} @end lilypond @predefined @@ -2887,9 +2888,7 @@ c b < g \xNote c f > b @cindex note heads, easy play (演奏を容易にする符頭) @funindex \easyHeadsOn -@funindex easyHeadsOn @funindex \easyHeadsOff -@funindex easyHeadsOff @q{演奏を容易にする} 符頭は、符頭の中に音符名を含みます。@c これは、初心者のための楽譜で使用されます。@c @@ -2956,15 +2955,10 @@ c b < g \xNote c f > b @cindex note heads, Walker @funindex \aikenHeads -@funindex aikenHeads @funindex \sacredHarpHeads -@funindex sacredHarpHeads @funindex \southernHarmonyHeads -@funindex southernHarmonyHeads @funindex \funkHeads -@funindex funkHeads @funindex \walkerHeads -@funindex walkerHeads シェイプ ノート記譜法では、@c 符頭の形状は音階の中での音符の位置付けに対応します。@c @@ -2973,52 +2967,49 @@ c b < g \xNote c f > b Funk (Harmonica Sacra)、Walker、それに Aiken (Christian Harmony) スタイルで@c 使用されます: -@lilypond[verbatim,quote,relative=2] -\aikenHeads -c, d e f g2 a b1 c \break -\sacredHarpHeads -c,4 d e f g2 a b1 c \break -\southernHarmonyHeads -c,4 d e f g2 a b1 c \break -\funkHeads -c,4 d e f g2 a b1 c \break -\walkerHeads -c,4 d e f g2 a b1 c \break +@lilypond[verbatim,quote] +\relative c'' { + \aikenHeads + c, d e f g2 a b1 c \break + \sacredHarpHeads + c,4 d e f g2 a b1 c \break + \southernHarmonyHeads + c,4 d e f g2 a b1 c \break + \funkHeads + c,4 d e f g2 a b1 c \break + \walkerHeads + c,4 d e f g2 a b1 c \break +} @end lilypond @funindex \key -@funindex key @funindex \aikenHeadsMinor -@funindex aikenHeadsMinor @funindex \sacredHarpHeadsMinor -@funindex sacredHarpHeadsMinor @funindex \southernHarmonyHeadsMinor -@funindex southernHarmonyHeadsMinor @funindex \funkHeadsMinor -@funindex funkHeadsMinor @funindex \walkerHeadsMinor -@funindex walkerHeadsMinor 符頭の形状は音階の中での位置に対応し、@c 音階のベースは @code{\key} コマンドによって決まります。@c マイナーで記述している場合、@c 符頭の形状を決定する音階ステップはメジャーの場合との相対関係になります: -@lilypond[verbatim,quote,relative=2] -\key a \minor -\aikenHeads -a b c d e2 f g1 a \break -\aikenHeadsMinor -a,4 b c d e2 f g1 a \break -\sacredHarpHeadsMinor -a,2 b c d \break -\southernHarmonyHeadsMinor -a2 b c d \break -\funkHeadsMinor -a2 b c d \break -\walkerHeadsMinor -a2 b c d \break - +@lilypond[verbatim,quote] +\relative c'' { + \key a \minor + \aikenHeads + a b c d e2 f g1 a \break + \aikenHeadsMinor + a,4 b c d e2 f g1 a \break + \sacredHarpHeadsMinor + a,2 b c d \break + \southernHarmonyHeadsMinor + a2 b c d \break + \funkHeadsMinor + a2 b c d \break + \walkerHeadsMinor + a2 b c d \break +} @end lilypond @predefined @@ -3065,24 +3056,22 @@ a2 b c d \break @cindex note heads, slashed (スラッシュ形の符頭) @funindex \improvisationOn -@funindex improvisationOn @funindex \improvisationOff -@funindex improvisationOff 即興はしばしばスラッシュ形の符頭で記されます。@c そのような表記では、演奏者は好みのピッチを選ぶことができますが、@c 指定されたリズムに従って演奏する必要があります。@c このような符頭は以下のようにして作成することができます: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Voice \with { \consists "Pitch_squash_engraver" -} { - e8 e g a a16( bes) a8 g +} \relative { + e''8 e g a a16( bes) a8 g \improvisationOn e8 ~ - e2 ~ e8 f4 f8 ~ - f2 + 2 ~ 8 f4 f8 ~ + 2 \improvisationOff a16( bes) a8 g e } diff --git a/Documentation/ja/notation/repeats.itely b/Documentation/ja/notation/repeats.itely index 9df79cd8f1..9767b8bb47 100644 --- a/Documentation/ja/notation/repeats.itely +++ b/Documentation/ja/notation/repeats.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.21" @c Translators: Yoshiki Sawada @@ -98,10 +98,12 @@ LilyPond は以下の種類の繰り返しをサポートします: 入れ替えを持たない 1 回の繰り返しは以下のようになります: -@lilypond[verbatim,quote,relative=2] -\repeat volta 2 { c4 d e f } -c2 d -\repeat volta 2 { d4 e f g } +@lilypond[verbatim,quote] +\relative { + \repeat volta 2 { c''4 d e f } + c2 d + \repeat volta 2 { d4 e f g } +} @end lilypond 繰り返し時に入れ替えて演奏する部分は @code{\alternative} を@c @@ -123,37 +125,43 @@ c2 d 繰り返しが 1 回で、入れ替えも 1 つの場合は以下のようになります: -@lilypond[verbatim,quote,relative=2] -\repeat volta 2 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 2 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + } + c1 } -c1 @end lilypond 複数の入れ替え部分を 1 回ずつ演奏する繰り返しは以下のようになります: -@lilypond[verbatim,quote,relative=2] -\repeat volta 4 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 4 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + } + c1 } -c1 @end lilypond 繰り返し部分を複数回繰り返す場合は以下のようになります: -@lilypond[verbatim,quote,relative=2] -\repeat volta 3 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } - { a2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 3 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + { a2 g | } + } + c1 } -c1 @end lilypond @warning{入れ替えが複数ある場合、入れ替えの閉じ波括弧と次の入れ替えの@c @@ -181,20 +189,22 @@ c1 使わないで下さい: @c KEEP LY -@lilypond[verbatim,quote,relative=1] -% ここで \partial を使わないで下さい -c4 e g % ここで小節チェックを行わないで下さい -% ここで \partial を使わないで下さい -\repeat volta 4 { - e4 | - c2 e | +@lilypond[verbatim,quote] +\relative { + % ここで \partial を使わないで下さい + c'4 e g % ここで小節チェックを行わないで下さい % ここで \partial を使わないで下さい - g4 g g % ここで小節チェックを行わないで下さい + \repeat volta 4 { + e4 | + c2 e | + % ここで \partial を使わないで下さい + g4 g g % ここで小節チェックを行わないで下さい + } + % ここで \partial を使わないで下さい + g4 | + a2 a | + g1 | } -% ここで \partial を使わないで下さい -g4 | -a2 a | -g1 | @end lilypond 同様に、繰り返しが楽譜の先頭の部分小節から始まり、入れ替え部分を持たない場合、@c @@ -202,18 +212,20 @@ g1 | 上の例と同じ条件が適用されます: @c KEEP LY -@lilypond[verbatim,quote,relative=1] -\partial 4 % \partial が必要です -\repeat volta 4 { - e4 | - c2 e | +@lilypond[verbatim,quote] +\relative { + \partial 4 % \partial が必要です + \repeat volta 4 { + e'4 | + c2 e | + % ここで \partial を使わないで下さい + g4 g g % ここで小節チェックを行わないで下さい + } % ここで \partial を使わないで下さい - g4 g g % ここで小節チェックを行わないで下さい + g4 | + a2 a | + g1 | } -% ここで \partial を使わないで下さい -g4 | -a2 a | -g1 | @end lilypond 完全な長さを持たない小節で始まる小節に入れ替え部分を付け加える場合、@c @@ -230,21 +242,23 @@ g1 | 最初の入れ替え部分を除く、各入れ替え部分の開始点。 @end itemize -@lilypond[verbatim,quote,relative=1] -\partial 4 -\repeat volta 2 { e4 | c2 e | } -\alternative { - { - f2 d | - \set Timing.measureLength = #(ly:make-moment 3/4) - g4 g g % optional bar check is allowed here - } - { - \set Timing.measureLength = #(ly:make-moment 4/4) - a2 a | +@lilypond[verbatim,quote] +\relative { + \partial 4 + \repeat volta 2 { e'4 | c2 e | } + \alternative { + { + f2 d | + \set Timing.measureLength = #(ly:make-moment 3/4) + g4 g g % optional bar check is allowed here + } + { + \set Timing.measureLength = #(ly:make-moment 4/4) + a2 a | + } } + g1 | } -g1 | @end lilypond @code{measureLength} プロパティについての説明は @ref{Time administration} @@ -259,13 +273,13 @@ g1 | @code{doubleRepeatSegnoType} を必要に応じてオーバライドすることにより@c 設定することができます。 -@lilypond[verbatim,quote,relative=1] -e1 -\repeat volta 2 { +@lilypond[verbatim,quote] +\relative { + e'1 \inStaffSegno f2 g a b + c1_"D.S." \bar "|." } -c1_"D.S." \bar "|." @end lilypond @cindex repeats, with ties (タイを持つ繰り返し) @@ -276,12 +290,14 @@ c1_"D.S." \bar "|." 繰り返しの 2 回目の部分にタイを付け加えることもできます: -@lilypond[verbatim,quote,relative=2] -c1 -\repeat volta 2 { c4 d e f~ } -\alternative { - { f2 d } - { f2\repeatTie f, } +@lilypond[verbatim,quote] +\relative { + c''1 + \repeat volta 2 { c4 d e f~ } + \alternative { + { f2 d } + { f2\repeatTie f, } + } } @end lilypond @@ -407,11 +423,13 @@ c1 @item start-repeat @code{|:} 小節線を譜刻します。 -@lilypond[verbatim,quote,relative=2] -c1 -\set Score.repeatCommands = #'(start-repeat) -d4 e f g -c1 +@lilypond[verbatim,quote] +\relative { + c''1 + \set Score.repeatCommands = #'(start-repeat) + d4 e f g + c1 +} @end lilypond 標準の譜刻習慣に従い、楽曲の先頭では繰り返し記号は譜刻されません。 @@ -419,11 +437,13 @@ c1 @item end-repeat @code{:|.} 小節線を譜刻します。 -@lilypond[verbatim,quote,relative=2] -c1 -d4 e f g -\set Score.repeatCommands = #'(end-repeat) -c1 +@lilypond[verbatim,quote] +\relative { + c''1 + d4 e f g + \set Score.repeatCommands = #'(end-repeat) + c1 +} @end lilypond @item (volta @var{number}) ... (volta #f) @@ -431,26 +451,30 @@ c1 Volta 囲みは明示的に終了させる必要があります。@c さもなければ、譜刻されません。 -@lilypond[verbatim,quote,relative=2] -f4 g a b -\set Score.repeatCommands = #'((volta "2")) -g4 a g a -\set Score.repeatCommands = #'((volta #f)) -c1 +@lilypond[verbatim,quote] +\relative { + f''4 g a b + \set Score.repeatCommands = #'((volta "2")) + g4 a g a + \set Score.repeatCommands = #'((volta #f)) + c1 +} @end lilypond @end table 複数の繰り返しコマンドが同時に発生することもあります: -@lilypond[verbatim,quote,relative=2] -f4 g a b -\set Score.repeatCommands = #'((volta "2, 5") end-repeat) -g4 a g a -c1 -\set Score.repeatCommands = #'((volta #f) (volta "95") end-repeat) -b1 -\set Score.repeatCommands = #'((volta #f)) +@lilypond[verbatim,quote] +\relative { + f''4 g a b + \set Score.repeatCommands = #'((volta "2, 5") end-repeat) + g4 a g a + c1 + \set Score.repeatCommands = #'((volta #f) (volta "95") end-repeat) + b1 + \set Score.repeatCommands = #'((volta #f)) +} @end lilypond @cindex volta bracket with text (テキストを持つ volta 囲み) @@ -464,8 +488,8 @@ b1 @lilypond[verbatim,quote] voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } -\relative c'' { - c1 +\relative { + c''1 \set Score.repeatCommands = #(list(list 'volta voltaAdLib) 'start-repeat) c4 b d e @@ -476,11 +500,6 @@ voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } @end lilypond -@snippets - -@lilypondfile[verbatim,quote,texidoc,doctitle] -{printing-a-repeat-sign-at-the-beginning-of-a-piece.ly} - @seealso 記譜法リファレンス: @ref{Bar lines}, @@ -520,9 +539,11 @@ voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } ここで、@code{@var{musicexpr}} は音楽表記であり、@code{@var{repeatcount}} は @code{@var{musicexpr}} を繰り返す回数です。 -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -c1 +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + c1 +} @end lilypond いくつかのケースでは、特に @code{\relative} コンテキストの中では、@c @@ -541,53 +562,61 @@ a'4 b c | a'4 b c 入れ替え部分がある繰り返しを展開することもできます。@c -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + } + c1 } -c1 @end lilypond 繰り返し回数が入れ替え部分の数よりも多い場合、@c 最初の入れ替え部分だけが適用されます。@c 残りの入れ替えは無視されて譜刻されません。 -@lilypond[verbatim,quote,relative=2] -\repeat unfold 4 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } - { e2 d } - } -c1 +@lilypond[verbatim,quote] +\relative { + \repeat unfold 4 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + { e2 d } + } + c1 +} @end lilypond 入れ替え部分の数が繰り返し回数よりも多い場合、@c 最初の入れ替え部分が使用され、残りの繰り返し部分は無視され、譜刻されません。 -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } - { e2 d } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + { e2 d } + } + c1 } -c1 @end lilypond 複数の @code{unfold} 関数をネストすることも可能です。@c (@code{unfold} は入れ替え部分を持っていても、持っていなくても構いません。) -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { - \repeat unfold 2 { c4 d e f } - \alternative { - { c2 g' } - { c,2 b } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + } } + c1 } -c1 @end lilypond 和音構造は和音の繰り返し記号 @code{q} で繰り返すことができます。@c @@ -651,34 +680,42 @@ c1 1 小節よりも短いパターンはスラッシュで置き換えられます。 -@lilypond[verbatim,quote,relative=2] -\repeat percent 4 { c128 d e f } -\repeat percent 4 { c64 d e f } -\repeat percent 5 { c32 d e f } -\repeat percent 4 { c16 d e f } -\repeat percent 4 { c8 d } -\repeat percent 4 { c4 } -\repeat percent 2 { c2 } +@lilypond[verbatim,quote] +\relative c'' { + \repeat percent 4 { c128 d e f } + \repeat percent 4 { c64 d e f } + \repeat percent 5 { c32 d e f } + \repeat percent 4 { c16 d e f } + \repeat percent 4 { c8 d } + \repeat percent 4 { c4 } + \repeat percent 2 { c2 } +} @end lilypond 1 または 2 小節のパターンはパーセントのような記号で置き換えられます。 -@lilypond[verbatim,quote,relative=2] -\repeat percent 2 { c4 d e f } -\repeat percent 2 { c2 d } -\repeat percent 2 { c1 } +@lilypond[verbatim,quote] +\relative c'' { + \repeat percent 2 { c4 d e f } + \repeat percent 2 { c2 d } + \repeat percent 2 { c1 } +} @end lilypond -@lilypond[verbatim,quote,relative=2] -\repeat percent 3 { c4 d e f | c2 g' } +@lilypond[verbatim,quote] +\relative { + \repeat percent 3 { c''4 d e f | c2 g' } +} @end lilypond 1 小節よりも短いけれども異なる演奏時間が含まれるパターンは@c 2 重線のパーセント記号を用います。 -@lilypond[verbatim,quote,relative=2] -\repeat percent 4 { c8. 16 } -\repeat percent 2 { \tuplet 3/2 { r8 c d } e4 } +@lilypond[verbatim,quote] +\relative { + \repeat percent 4 { c''8. 16 } + \repeat percent 2 { \tuplet 3/2 { r8 c d } e4 } +} @end lilypond @snippets @@ -736,10 +773,12 @@ c1 2 つの音符の間にトレモロ記号を配置するには、トレモロ スタイルの @code{\repeat} を使用します: -@lilypond[quote,verbatim,relative=2] -\repeat tremolo 8 { c16 d } -\repeat tremolo 6 { c16 d } -\repeat tremolo 2 { c16 d } +@lilypond[quote,verbatim] +\relative c'' { + \repeat tremolo 8 { c16 d } + \repeat tremolo 6 { c16 d } + \repeat tremolo 2 { c16 d } +} @end lilypond @code{\repeat tremolo} の構文では、@c @@ -773,9 +812,11 @@ c1 @code{@var{N}} が省略された場合、 最後の値 (@code{tremoloFlags} に保存されています) が使用されます: -@lilypond[quote,verbatim,relative=2] -c2:8 c:32 -c: c: +@lilypond[quote,verbatim] +\relative { + c''2:8 c:32 + c: c: +} @end lilypond @snippets diff --git a/Documentation/ja/notation/rhythms.itely b/Documentation/ja/notation/rhythms.itely index fdffd7a251..2f91192bb6 100644 --- a/Documentation/ja/notation/rhythms.itely +++ b/Documentation/ja/notation/rhythms.itely @@ -6,7 +6,7 @@ version that you are working on. See TRANSLATION for details. @end ignore -@c \version "2.17.30" +@c \version "2.19.40" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -51,11 +51,8 @@ @cindex note lengths (音符の長さ) @funindex \longa -@funindex longa @funindex \breve -@funindex breve @funindex \maxima -@funindex maxima 演奏時間は数とドットで指定されます。@c 演奏時間はその演奏時間の逆数で入力されます。@c @@ -67,21 +64,25 @@ それよりも短い音価を指定することも可能ですが、必ず連桁付きの音符となります。 @c Two 64th notes are needed to obtain beams -@lilypond[quote,verbatim,relative=2] -\time 8/1 -c\longa c\breve c1 c2 -c4 c8 c16 c32 c64 c128 c128 +@lilypond[quote,verbatim] +\relative { + \time 8/1 + c''\longa c\breve c1 c2 + c4 c8 c16 c32 c64 c128 c128 +} @end lilypond 同じ例で自動連桁を off にしてみます。 @c not strictly "writing rhythms"; more of a "displaying" thing, @c but it's ok here. -gp -@lilypond[quote,verbatim,relative=2] -\time 8/1 -\autoBeamOff -c\longa c\breve c1 c2 -c4 c8 c16 c32 c64 c128 c128 +@lilypond[quote,verbatim] +\relative { + \time 8/1 + \autoBeamOff + c''\longa c\breve c1 c2 + c4 c8 c16 c32 c64 c128 c128 +} @end lilypond 全音符の 8 倍の演奏時間を持つ音符は @@ -96,8 +97,8 @@ c4 c8 c16 c32 c64 c128 c128 演奏時間を省略した場合、前に入力された演奏時間にセットされます。@c 最初の音符のデフォルト値は 4 分音符です。 -@lilypond[quote,verbatim,relative=2] -a a a2 a a4 a a1 a +@lilypond[quote,verbatim] +\relative { a' a a2 a a4 a a1 a } @end lilypond @cindex notes, dotted (付点音符) @@ -110,8 +111,8 @@ a a a2 a a4 a a1 a 付点音符の演奏時間を得るには、演奏時間の後にドット (@code{.}) を置きます。@c 2 重付点音符は 2 つのドットを置き、3 重付点音符は 3 つのドットなどとなります。 -@lilypond[quote,verbatim,relative=2] -a4 b c4. b8 a4. b4.. c8. +@lilypond[quote,verbatim] +\relative { a'4 b c4. b8 a4. b4.. c8. } @end lilypond 演奏時間の中には 2の倍数の演奏時間とドットだけでは表せないものもあります。@c @@ -127,11 +128,8 @@ a4 b c4. b8 a4. b4.. c8. 詳細は @ref{Proportional notation} を参照してください。 @funindex \dotsUp -@funindex dotsUp @funindex \dotsDown -@funindex dotsDown @funindex \dotsNeutral -@funindex dotsNeutral 通常、多声でない限り、ドットは譜線を避けるために上に移動させられます。@c ある特定のドットの移動方向を手動で指定するための定義済みコマンドがあります @@ -191,48 +189,72 @@ a4 b c4. b8 a4. b4.. c8. @unnumberedsubsubsec 連符 @translationof Tuplets +@c 本項目のみ先に翻訳 2015-12-31 +@c 連符のコマンドが \times から \tuplet に変更されており、 +@c 従前のままの内容だと混乱をきたす可能性があるため。 + @cindex tuplets (連符) @cindex triplets (3 連符) -@funindex \times -@funindex times +@funindex \tuplet -連符はその連符内のすべての音符の演奏時間に分数を掛け合わせる音楽表記によって@c -作られます: +連符は @code{\tuplet} を使った音楽表記から作られ、@c +音楽表記の速度に分数を掛け合わせます。 @example -\times @var{fraction} @{ @var{music} @} +\tuplet @var{fraction} @{ @var{music} @} @end example @noindent -@code{@var{music}} の演奏時間には分数 @code{@var{fraction}} が掛け合わされます。@c -分数の分母が音符の上または下に譜刻され、オプションで囲みが付きます。@c -最も一般的な連符は 3 連符であり、3 連符では 3 つの音符が音符 2 つ分の@c -演奏時間を持ちます。@c -そのため、3 連符で指定する分数は 2/3 です。 +分数 (@var{fraction}) の分子が音符の上または下に譜刻され、@c +オプションで囲みが付きます。@c +最も一般的な連符は 3 連符です。@c +( 3 つの音符が音符 2 つ分の演奏時間を持ちます。) -@lilypond[quote,verbatim,relative=2] -a2 \tuplet 3/2 { b4 b b } -c4 c \tuplet 3/2 { b4 a g } +@lilypond[quote,verbatim] +\relative { + a'2 \tuplet 3/2 { b4 4 4 } + c4 c \tuplet 3/2 { b4 a g } +} +@end lilypond + +@cindex 連符のグルーピング +@noindent +連符の長いパッセージを入力するとき、@c +各グループに別々の @code{\tuplet} コマンドを記述することは不便です。@c +音楽の前に一つの連符グループの長さを直接指定することで、@c +連符を自動的にグループ化することができます: + +@lilypond[quote,verbatim] +\relative { + g'2 r8 \tuplet 3/2 8 { cis16 d e e f g g f e } +} @end lilypond @cindex tuplet bracket placement (連符囲みの配置) @funindex \tupletUp -@funindex tupletUp @funindex \tupletDown -@funindex tupletDown @funindex \tupletNeutral -@funindex tupletNeutral -連符囲みは手動で譜の上または下に配置することができます --- @ref{Direction and placement} を参照してください。 +連符囲みは手動で譜の上または下に配置することができます: + +@lilypond[quote,verbatim] +\relative { + \tupletUp \tuplet 3/2 { c''8 d e } + \tupletNeutral \tuplet 3/2 { c8 d e } + \tupletDown \tuplet 3/2 { f,8 g a } + \tupletNeutral \tuplet 3/2 { f8 g a } +} +@end lilypond 連符はネストすることができます: -@lilypond[quote,verbatim,relative=2] -\autoBeamOff -c4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 +@lilypond[quote,verbatim] +\relative { + \autoBeamOff + c''4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 +} @end lilypond ネストされた連符の演奏開始点が同時である場合に、それらの連符を変更するには @@ -258,7 +280,7 @@ c4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 @funindex tupletSpannerDuration @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] -{entering-several-tuplets-using-only-one--times-command.ly} +{entering-several-tuplets-using-only-one--tuplet-command.ly} @cindex Tuplet number changes (連符の数の変更) @@ -286,6 +308,7 @@ c4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 @rlearning{Tweaking methods} 記譜法リファレンス: +@ref{Direction and placement}, @ref{Time administration}, @ref{Scaling durations}, @ref{The tweak command}, @@ -299,20 +322,6 @@ c4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 @rinternals{TupletNumber}, @rinternals{TimeScaledMusic}. -@cindex grace notes within tuplet brackets (連符囲み内の装飾小音符) - -@knownissues -譜の先頭に装飾小音符とそれに続く連符を配置する場合でない限り、@c -装飾を連符囲みの中に配置することができます。@c -この特殊な場合では、エラーを避けるためにその装飾小音符を -@code{\times} コマンドの前に置かなければなりません。 - -@cindex tempo marks within tuplet brackets (連符囲み内でのテンポ記号) - -@code{\tempo} コマンドを持つ楽曲の先頭で連符を使う場合、@c -@rlearning{音楽を保持するボイス} で説明されているように@c -その音楽を明示的に @code{\new Voice} ブロックの中に入れる必要があります。 - @node 演奏時間を変更する @unnumberedsubsubsec 演奏時間を変更する @@ -353,7 +362,6 @@ b16*4 c4 @cindex expanding music (音楽を伸長する) @funindex \scaleDurations -@funindex scaleDurations 同様の方法で分数を使うことで、長く伸びた音楽を圧縮することができます。@c それによりそれぞれの音符、和音、休符には@c @@ -408,7 +416,7 @@ b16*4 c4 タイはチルド記号 @code{~} を使って入力します: @lilypond[quote,verbatim,relative=2] -a2 ~ a +a2 ~ 2 @end lilypond タイは、音符が小節線をまたがる場合か、リズムを表すためにドットを@c @@ -420,9 +428,9 @@ a2 ~ a @c KEEP LY @lilypond[verbatim,quote] -\relative c' { - r8 c8 ~ c2 r4 | - r8^"こうすべきではありません" c2 ~ c8 r4 +\relative { + r8 c'8 ~ 2 r4 | + r8^"こうすべきではありません" c2 ~ 8 r4 } @end lilypond @@ -449,7 +457,6 @@ a2 ~ a @cindex ties and volta brackets (タイと volta 囲み) @funindex \repeatTie -@funindex repeatTie 繰り返しの 2 回目の差し替え部分はタイで結ばれた音符で始まっています。@c そのような繰り返し部分でのタイは以下のように指定する必要があります: @@ -468,25 +475,21 @@ a2 ~ a @cindex ties, laissez vibrer (レセ ヴィブレのタイ) @funindex \laissezVibrer -@funindex laissezVibrer @notation{L.v.}@: タイ (@notation{レセ ヴィブレ: laissez vibrer}) は@c 音符を終端で途切れさせないということを示します。@c ピアノ、ハープ、他の弦楽器、それに打楽器のための楽譜で使用されます。@c L.v. タイは以下のように入力します: -@lilypond[quote,verbatim,relative=1] -1\laissezVibrer +@lilypond[quote,verbatim,fragment] +1\laissezVibrer @end lilypond @cindex ties, placement (タイの配置) @funindex \tieUp -@funindex tieUp @funindex \tieDown -@funindex tieDown @funindex \tieNeutral -@funindex tieNeutral タイを手動で譜の上または下に配置することができます。 @ref{Direction and placement} を参照してください。 @@ -498,36 +501,33 @@ L.v. タイは以下のように入力します: @cindex dotted ties (点線のタイ) @funindex \tieDotted -@funindex tieDotted @funindex \tieDashed -@funindex tieDashed @funindex \tieSolid -@funindex tieSolid タイを破線、点線、実線と破線の組み合わせにすることができます。 @lilypond[quote, verbatim, relative=1] \tieDotted -c2 ~ c +c2 ~ 2 \tieDashed -c2 ~ c +c2 ~ 2 \tieHalfDashed -c2 ~ c +c2 ~ 2 \tieHalfSolid -c2 ~ c +c2 ~ 2 \tieSolid -c2 ~ c +c2 ~ 2 @end lilypond 破線パターンのカスタマイズを指定することができます: @lilypond[quote, verbatim, relative=1] \tieDashPattern #0.3 #0.75 -c2 ~ c +c2 ~ 2 \tieDashPattern #0.7 #1.5 -c2 ~ c +c2 ~ 2 \tieSolid -c2 ~ c +c2 ~ 2 @end lilypond タイの破線パターン定義の構造は、スラーの破線パターン定義と同じです。@c @@ -537,16 +537,18 @@ c2 ~ c @var{whiteout} レイアウト プロパティと @var{layer} レイアウト プロパティを@c オーバライドしてください。 -@lilypond[verbatim,quote,ragged-right,relative=2] -\override Tie.layer = #-2 -\override Staff.TimeSignature.layer = #-1 -\override Staff.KeySignature.layer = #-1 -\override Staff.TimeSignature.whiteout = ##t -\override Staff.KeySignature.whiteout = ##t -b2 b~ -\time 3/4 -\key a \major -b r4 +@lilypond[verbatim,quote,ragged-right] +\relative { + \override Tie.layer = #-2 + \override Staff.TimeSignature.layer = #-1 + \override Staff.KeySignature.layer = #-1 + \override Staff.TimeSignature.whiteout = ##t + \override Staff.KeySignature.whiteout = ##t + b'2 b~ + \time 3/4 + \key a \major + b r4 +} @end lilypond @predefined @@ -619,14 +621,10 @@ b r4 @cindex breve rest (二全休符) @funindex \rest -@funindex rest @funindex r @funindex \maxima -@funindex maxima @funindex \longa -@funindex longa @funindex \breve -@funindex breve 休符は音符名 @code{r} を持つ音符として入力されます。@c 全休符よりも長い演奏時間を持つ休符には以下に示す定義済みコマンドを使用します: @@ -666,8 +664,8 @@ b r4 これは多声部音楽を手動で精密にフォーマットすることを考慮したものです。@c なぜなら、自動休符フォーマットでは多声部音楽の休符の衝突を回避できないからです。 -@lilypond[quote,verbatim,relative=2] -a4\rest d4\rest +@lilypond[quote,verbatim] +\relative { a'4\rest d4\rest } @end lilypond @snippets @@ -709,14 +707,15 @@ a4\rest d4\rest @funindex s @funindex \skip -@funindex skip 不可視の休符 (@q{空白休符} とも呼ばれます) は音符名@tie{}@code{s} を@c 持つ音符として入力することができます: -@lilypond[verbatim,quote,relative=2] -c4 c s c -s2 c +@lilypond[verbatim,quote] +\relative c'' { + c4 c s c | + s2 c | +} @end lilypond @cindex lyrics, skip (歌詞をスキップする) @@ -728,10 +727,10 @@ s2 c @code{\addlyrics} や @code{\lyricsto} を使っていて、@c 歌詞が関係するメロディーの音符から演奏時間を得ている場合は無視されます。 -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << { - a2 \skip2 a2 a2 + a'2 \skip2 a'2 a'2 } \new Lyrics { \lyricmode { @@ -744,14 +743,14 @@ s2 c @code{\skip} はコマンドであるため、@c @code{s} とは異なり後に続く音符のデフォルト演奏時間には影響を与えません。 -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << { - \repeat unfold 8 { a4 } + \repeat unfold 8 { a'4 } } { - a4 \skip 2 a | - s2 a + a'4 \skip 2 a' | + s2 a' } >> @end lilypond @@ -832,7 +831,7 @@ R4*5*4 | 1 小節分の休符は、拍子次第で全休符または二全休符のどちらかとして、@c 小節の中央に譜刻されます。 -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 4/4 R1 | \time 6/4 @@ -845,9 +844,7 @@ R1*2 | @cindex multi-measure rest, contracting (複数小節にまたがる休符をまとめる) @funindex \expandFullBarRests -@funindex expandFullBarRests @funindex \compressFullBarRests -@funindex compressFullBarRests デフォルトでは、複数小節にまたがる休符は@c 休みの小節すべてを明示的に示すように譜刻される楽譜に展開されます。@c @@ -880,7 +877,6 @@ R2.*2 | @cindex multi-measure rest with markup (マークアップを持つ複数小節にまたがる休符) @funindex \fermataMarkup -@funindex fermataMarkup @funindex MultiMeasureRestText マークアップを複数小節にまたがる休符に付け加えることができます。@c @@ -918,15 +914,11 @@ R1^"right" @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff @funindex textLenthOff @funindex \fermataMarkup -@funindex fermataMarkup @funindex \compressFullBarRests -@funindex compressFullBarRests @funindex \expandFullBarRests -@funindex expandFullBarRests @predefined @code{\textLengthOn}, @@ -1013,13 +1005,12 @@ R1^"right" @cindex meter (拍) @funindex \time -@funindex time 拍子は以下のようにセットします: -@lilypond[quote,verbatim,relative=2] -\time 2/4 c2 -\time 3/4 c2. +@lilypond[quote,verbatim,fragment] +\time 2/4 c''2 +\time 3/4 c''2. @end lilypond @cindex time signature, visibility of (拍子の可視性) @@ -1029,23 +1020,23 @@ R1^"right" デフォルトの振る舞いを変更することができます。@c @ref{Visibility of objects} を参照してください。 -@lilypond[quote,verbatim,relative=2] -\time 2/4 -c2 c -\break -c c -\break -\time 4/4 -c c c c +@lilypond[quote,verbatim] +\relative c'' { + \time 2/4 + c2 c + \break + c c + \break + \time 4/4 + c c c c +} @end lilypond @cindex time signature style (拍子スタイル) @cindex meter style (拍スタイル) @funindex \numericTimeSignature -@funindex numericTimeSignature @funindex \defaultTimeSignature -@funindex defaultTimeSignature 2/2 や 4/4 で使用される拍子は数字を使用するスタイルに変更することができます: @@ -1093,7 +1084,7 @@ c c c c \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 { c8 } | @@ -1138,7 +1129,7 @@ c c c c \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 c8^\markup {"Beamed (2 2)"} @@ -1147,7 +1138,7 @@ c c c c \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 c8^\markup {"Beamed (3 1)"} @@ -1164,12 +1155,12 @@ c c c c @lilypond[quote,verbatim] \score{ - \relative c' { - \repeat unfold 8 { c8 } | + \relative { + \repeat unfold 8 { c'8 } | \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 { c8 } | @@ -1191,7 +1182,7 @@ c c c c \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 {c''8} @@ -1200,7 +1191,7 @@ c c c c \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(1 3) % beatStructure + 1,3 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 {c''8} @@ -1257,54 +1248,65 @@ c c c c @cindex metronome marking with text (テキストを持つメトロノーム記号) @funindex \tempo -@funindex tempo 基本的なメトロノーム記号は単純に以下のように記述します: -@lilypond[verbatim,quote,relative=1] -\tempo 4 = 120 -c2 d -e4. d8 c2 +@lilypond[verbatim,quote] +\relative { + \tempo 4 = 120 + c'2 d + e4. d8 c2 +} @end lilypond メトロノーム記号を 2 つの数の範囲として譜刻することもできます: -@lilypond[verbatim,quote,relative=1] -\tempo 4 = 40 - 46 -c4. e8 a4 g -b,2 d4 r +@lilypond[verbatim,quote] +\relative { + \tempo 4 = 40 - 46 + c'4. e8 a4 g + b,2 d4 r +} @end lilypond テキストを持つテンポ指示にすこともできます: -@lilypond[verbatim,quote,relative=2] -\tempo "Allegretto" -c4 e d c -b4. a16 b c4 r4 +@lilypond[verbatim,quote] +\relative { + \tempo "Allegretto" + c''4 e d c + b4. a16 b c4 r4 +} @end lilypond メトロノーム記号とテキストを組み合わせると、@c メトロノーム記号は自動的に括弧で囲まれます: -@lilypond[verbatim,quote,relative=2] -\tempo "Allegro" 4 = 160 -g4 c d e -d4 b g2 +@lilypond[verbatim,quote] +\relative { + \tempo "Allegro" 4 = 160 + g'4 c d e + d4 b g2 +} @end lilypond 一般に、テキストを任意のマークアップ オブジェクトにすることができます: -@lilypond[verbatim,quote,relative=2] -\tempo \markup { \italic Faster } 4 = 132 -a8-. r8 b-. r gis-. r a-. r +@lilypond[verbatim,quote] +\relative { + \tempo \markup { \italic Faster } 4 = 132 + a'8-. r8 b-. r gis-. r a-. r +} @end lilypond テキストを伴わないメトロノーム記号を括弧で囲むには、@c 空の文字列を含めて記述します: -@lilypond[verbatim,quote,relative=2] -\tempo "" 8 = 96 -d4 g e c +@lilypond[verbatim,quote] +\relative { + \tempo "" 8 = 96 + d''4 g e c +} @end lilypond @@ -1354,7 +1356,6 @@ d4 g e c @funindex measurePosition @funindex \partial -@funindex partial @emph{弱拍} や @emph{上拍} などのような部分小節またはピックアップ小節は、@c @code{\partial} コマンドを使って入力します:@c @@ -1375,10 +1376,12 @@ e8 | a4 c8 b c4 | @var{duration} は、完全な長さを持つ小節より短い演奏時間であれば、@c 任意の値を取ることができます: -@lilypond[quote,verbatim,relative=1] -\time 3/4 -\partial 4. -r4 e8 | a4 c8 b c4 | +@lilypond[quote,verbatim] +\relative { + \time 3/4 + \partial 4. + r4 e'8 | a4 c8 b c4 | +} @end lilypond @code{\partial @var{duration}} を以下のように記述することもできます: @@ -1456,22 +1459,22 @@ r8 e,8 | a4 c8 b[ c b] | @cindex beams, unmetered music (無韻律の音楽での連桁) @funindex \cadenzaOn -@funindex cadenzaOn @funindex \cadenzaOff -@funindex cadenzaOff 韻律のある音楽では、自動的に小節線が挿入され、小節番号が算出されます。@c 無韻律の音楽 (例えばカデンツァ) では、これは望ましくなく、コマンド @code{\cadenzaOn} を用いて @q{スイッチ off} することができます。@c @q{スイッチ on} に戻すには、適切な場所で @code{\cadenzaOff} を用います。 -@lilypond[verbatim,relative=2,quote] -c4 d e d -\cadenzaOn -c4 c d8[ d d] f4 g4. -\cadenzaOff -\bar "|" -d4 e d c +@lilypond[verbatim,quote] +\relative c'' { + c4 d e d + \cadenzaOn + c4 c d8[ d d] f4 g4. + \cadenzaOff + \bar "|" + d4 e d c +} @end lilypond カデンツァが終わると、小節番号が再開されます。 @@ -1511,14 +1514,16 @@ cis4 d cis! d そのため、カデンツァの中に連桁を挿入するには手動で行う必要があります。@c @ref{Manual beams} を参照してください。 -@lilypond[verbatim,relative=2,quote] -\repeat unfold 8 { c8 } -\cadenzaOn -cis8 c c c c -\bar"|" -c8 c c -\cadenzaOff -\repeat unfold 8 { c8 } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 8 { c''8 } + \cadenzaOn + cis8 c c c c + \bar"|" + c8 c c + \cadenzaOff + \repeat unfold 8 { c8 } +} @end lilypond +These predefined commands affect all staves in the score, even when @@ -1600,9 +1605,7 @@ c8 c c @funindex timeSignatureFraction @funindex \scaleDurations -@funindex scaleDurations @funindex \times -@funindex times 多拍子記譜法がサポートされます。 複合拍子記譜法がサポートされます。@c @@ -1629,10 +1632,10 @@ c8 c c 手動で連桁を付ける必要があるかもしれません。 @lilypond[quote,verbatim] -\relative c' << +\relative << \new Staff { \time 3/4 - c4 c c | + c'4 c c | c4 c c | } \new Staff { @@ -1677,10 +1680,10 @@ c8 c c % 以上で、各譜はそれぞれに拍子を持つようになります -\relative c' << +\relative << \new Staff { \time 3/4 - c4 c c | + c'4 c c | c4 c c | } \new Staff { @@ -1716,9 +1719,9 @@ c8 c c リストの @emph{最後の} 数字が拍子記号の分母になります。 @lilypond[quote,verbatim] -\relative c' { +\relative { \compoundMeter #'((2 2 2 8)) - \repeat unfold 6 c8 \repeat unfold 12 c16 + \repeat unfold 6 c'8 \repeat unfold 12 c16 } @end lilypond @@ -1726,14 +1729,14 @@ c8 c c また、この関数で指定された値に基づいて自動連桁の設定は調節されます。 @lilypond[quote,verbatim] -\relative c' { +\relative { \compoundMeter #'((1 4) (3 8)) - \repeat unfold 5 c8 \repeat unfold 10 c16 + \repeat unfold 5 c'8 \repeat unfold 10 c16 } -\relative c' { +\relative { \compoundMeter #'((1 2 3 8) (3 4)) - \repeat unfold 12 c8 + \repeat unfold 12 c'8 } @end lilypond @@ -1787,15 +1790,16 @@ c8 c c 以下の例では、小節線をまたがる音符と休符は分割され、@c 音符はされにタイで結ばれています。 -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim] \new Voice \with { \remove "Note_heads_engraver" \consists "Completion_heads_engraver" \remove "Rest_engraver" \consists "Completion_rest_engraver" } - -{ c2. c8 d4 e f g a b c8 c2 b4 a g16 f4 e d c8. c2 r1*2 } +\relative { + c'2. c8 d4 e f g a b c8 c2 b4 a g16 f4 e d c8. c2 r1*2 +} @end lilypond これらのエングラーバは進行中の音符と休符をすべて小節線のところで分割して、@c @@ -1843,12 +1847,12 @@ c8 c c そのような譜上にある音符のピッチはすべて破棄され、その譜自体は 1 本の@c 線を持ちます: -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << \new RhythmicStaff { - \new Voice = "myRhythm" { + \new Voice = "myRhythm" \relative { \time 4/4 - c4 e8 f g2 + c'4 e8 f g2 r4 g g f g1 } @@ -1868,9 +1872,7 @@ c8 c c @funindex Pitch_squash_engraver @funindex \improvisationOn -@funindex improvisationOn @funindex \improvisationOff -@funindex improvisationOff ギター コード表はしばしばつま弾き (ストラム) のリズムを示します。@c これは @code{Pitch_squash_engraver} と @code{\improvisationOn} を@c @@ -1940,13 +1942,13 @@ c8 c c @cindex beams, customizing rules (連桁の規則をカスタマイズする) @funindex \autoBeamOn -@funindex autoBeamOn @funindex \autoBeamOff -@funindex autoBeamOff -@lilypond[quote,verbatim,relative=2] -\time 2/4 c8 c c c -\time 6/8 c8 c c c8. c16 c8 +@lilypond[quote,verbatim] +\relative c'' { + \time 2/4 c8 c c c + \time 6/8 c8 c c c8. c16 c8 +} @end lilypond 自動的に決定される連桁が満足いかないものである場合、@c @@ -1959,12 +1961,14 @@ c8 c c @code{\autoBeamOff} で off にすることができ、@c @code{\autoBeamOn} で on にすることができます: -@lilypond[quote,relative=1,verbatim] -c4 c8 c8. c16 c8. c16 c8 -\autoBeamOff -c4 c8 c8. c16 c8. -\autoBeamOn -c16 c8 +@lilypond[quote,verbatim] +\relative c' { + c4 c8 c8. c16 c8. c16 c8 + \autoBeamOff + c4 c8 c8. c16 c8. + \autoBeamOn + c16 c8 +} @end lilypond @cindex melismata, with beams (メリスマの連桁) @@ -2044,9 +2048,7 @@ c16 c8 @funindex beatStructure @funindex measureLength @funindex \time -@funindex time @funindex \set -@funindex set たいていの場合、自動連桁は拍の終わりで終了します。@c 拍の終了点はコンテキスト プロパティ @code{baseMoment} と @@ -2059,9 +2061,9 @@ c16 c8 @lilypond[quote,relative=2,verbatim] \time 5/16 c16^"default" c c c c | -\set Timing.beatStructure = #'(2 3) +\set Timing.beatStructure = 2,3 c16^"(2+3)" c c c c | -\set Timing.beatStructure = #'(3 2) +\set Timing.beatStructure = 3,2 c16^"(3+2)" c c c c | @end lilypond @@ -2072,18 +2074,18 @@ c16^"(3+2)" c c c c | @lilypond[quote, verbatim,relative=1] \new Staff { \time 7/8 - \set Staff.beatStructure = #'(2 3 2) + \set Staff.beatStructure = 2,3,2 << \new Voice = one { - \relative c'' { - a8 a a a a a a + \relative { + a'8 a a a a a a } } \new Voice = two { - \relative c' { + \relative { \voiceTwo - \set Voice.beatStructure = #'(1 3 3) - f8 f f f f f f + \set Voice.beatStructure = 1,3,3 + f'8 f f f f f f } } >> @@ -2100,11 +2102,11 @@ c16^"(3+2)" c c c c | % リズム 3-1-1-2 % デフォルトで連桁設定の変更は Voice に適用され、うまくいきません % なぜなら、自動生成されるボイスで、すべての拍は baseMoment (1 . 8) だからです -\set beatStructure = #'(3 1 1 2) +\set beatStructure = 3,1,1,2 << {a8 a a a16 a a a a8 a} \\ {f4. f8 f f f} >> % コンテキスト Staff を指定するとうまくいきます -\set Staff.beatStructure = #'(3 1 1 2) +\set Staff.beatStructure = 3,1,1,2 << {a8 a a a16 a a a a8 a} \\ {f4. f8 f f f} >> @end lilypond @@ -2117,7 +2119,7 @@ c16^"(3+2)" c c c c | @lilypond[quote,verbatim,relative=2] \time 5/8 \set Timing.baseMoment = #(ly:make-moment 1/16) -\set Timing.beatStructure = #'(7 3) +\set Timing.beatStructure = 7,3 \repeat unfold 10 { a16 } @end lilypond @@ -2135,7 +2137,7 @@ Scheme 関数 @code{ly:make-moment} によって作り出されます。@c @c 未訳 @lilypond[quote,relative=2,verbatim] \time 3/16 -\set Timing.beatStructure = #'(2 1) +\set Timing.beatStructure = 2,1 \set Timing.beamExceptions = #'( ;start of alist (end . ;entry for end of beams @@ -2181,7 +2183,7 @@ c16 c c | \time 6/8 \repeat unfold 6 { a8 } % (4 + 2) にグループ化します -\set Timing.beatStructure = #'(4 2) +\set Timing.beatStructure = 4,2 \repeat unfold 6 { a8 } % デフォルトの振る舞いに戻ります \time 6/8 @@ -2204,7 +2206,7 @@ c16 c c | @lilypond[quote,verbatim,relative=2] \time 4/4 \set Timing.baseMoment = #(ly:make-moment 1/8) -\set Timing.beatStructure = #'(3 3 2) +\set Timing.beatStructure = 3,3,2 % 以下は beamExceptions のため、(3 3 2) の連桁にはなりません \repeat unfold 8 {c8} | % 以下は beamExceptions をクリアするため、(3 3 2) の連桁になります @@ -2234,11 +2236,13 @@ c16 c c | この振る舞いはコンテキスト プロパティ @code{beamHalfMeasure} によって@c 制御されます -- これは分子が 3 の拍子記号の場合にのみ効果を持ちます: -@lilypond[quote,verbatim,relative=2] -\time 3/4 -r4. a8 a a | -\set Timing.beamHalfMeasure = ##f -r4. a8 a a | +@lilypond[quote,verbatim] +\relative a' { + \time 3/4 + r4. a8 a a | + \set Timing.beamHalfMeasure = ##f + r4. a8 a a | +} @end lilypond @i{@strong{自動連桁はどのように機能するのか}} @@ -2340,7 +2344,7 @@ r4. a8 a a | \new Staff { \time 3/4 \set Timing.baseMoment = #(ly:make-moment 1/8) - \set Timing.beatStructure = #'(1 5) + \set Timing.beatStructure = 1,5 \repeat unfold 6 { a8 } } \new Staff { @@ -2353,20 +2357,20 @@ r4. a8 a a | 常にお望みの連桁を使うこともできます。@c ある拍子に対する自動連桁設定を変更する方法は @ref{拍子} で説明しています。 -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << \new Staff { \overrideTimeSignatureSettings 3/4 % timeSignatureFraction 1/8 % baseMomentFraction - #'(1 5) % beatStructure + 1,5 % beatStructure #'() % beamExceptions \time 3/4 - \repeat unfold 6 { a8 } + \repeat unfold 6 { a'8 } } \new Staff { \time 3/4 - \repeat unfold 6 { a8 } + \repeat unfold 6 { a'8 } } >> @end lilypond @@ -2388,8 +2392,8 @@ r4. a8 a a | そのような連桁は @code{[} と @code{]} で開始点と終了点を記すことによって@c 手動で指定することができます: -@lilypond[quote,relative=1,verbatim] -r4 r8[ g' a r] r g[ | a] r +@lilypond[quote,verbatim] +\relative { r4 r8[ g' a r] r g[ | a] r } @end lilypond @cindex manual beams, direction shorthand for (手動連桁の向きを指定する短縮記譜法) @@ -2397,30 +2401,33 @@ r4 r8[ g' a r] r g[ | a] r 方向指示子を用いることで、連桁の向きを手動で設定することができます: -@lilypond[quote,relative=2,verbatim] -c8^[ d e] c,_[ d e f g] +@lilypond[quote,verbatim] +\relative { c''8^[ d e] c,_[ d e f g] } @end lilypond @funindex \noBeam -@funindex noBeam 連桁でつながれないようにするために、個々の音符には @code{\noBeam} が記されるかもしれません: -@lilypond[quote,verbatim,relative=2] -\time 2/4 -c8 c\noBeam c c +@lilypond[quote,verbatim] +\relative { + \time 2/4 + c''8 c\noBeam c c +} @end lilypond 装飾小音符の連桁と通常の音符の連桁は同時進行で発生します。@c 通常の音符の連桁の途中に、連桁でつながれない装飾小音符は配置されません。 -@lilypond[quote,verbatim,relative=2] -c4 d8[ -\grace { e32 d c d } -e8] e[ e -\grace { f16 } -e8 e] +@lilypond[quote,verbatim] +\relative { + c''4 d8[ + \grace { e32 d c d } + e8] e[ e + \grace { f16 } + e8 e] +} @end lilypond @funindex stemLeftBeamCount @@ -2435,14 +2442,16 @@ e8 e] -- すなわち、グループ全体をつなげている 8 分音符の連桁を持って -- 譜刻されています。 -@lilypond[quote,relative=2,verbatim] -a8[ r16 f g a] -a8[ r16 -\set stemLeftBeamCount = #2 -\set stemRightBeamCount = #1 -f16 -\set stemLeftBeamCount = #1 -g16 a] +@lilypond[quote,verbatim] +\relative a' { + a8[ r16 f g a] + a8[ r16 + \set stemLeftBeamCount = #2 + \set stemRightBeamCount = #1 + f16 + \set stemLeftBeamCount = #1 + g16 a] +} @end lilypond @@ -2479,7 +2488,6 @@ g16 a] @cindex feathered beams (羽状の連桁) @funindex \featherDurations -@funindex featherDurations @funindex grow-direction 羽状の連桁は、楽曲全体のテンポを変えることなく、音符の小さなグループを@c @@ -2508,16 +2516,18 @@ ritardando (徐々に緩やかに) や accelerando (次第に速く) を@c 最初の 4 つの 32 分音符は徐々にスピード アップしますが、@c 最後の 4 つの 32 分音符は一定のテンポです。 -@lilypond[relative=1,verbatim,quote] -\override Beam.grow-direction = #LEFT -\featherDurations #(ly:make-moment 2/1) -{ c16[ c c c c c c c] } -\override Beam.grow-direction = #RIGHT -\featherDurations #(ly:make-moment 2/3) -{ c32[ d e f] } -% revert to non-feathered beams -\override Beam.grow-direction = #'() -{ g32[ a b c] } +@lilypond[verbatim,quote] +\relative c' { + \override Beam.grow-direction = #LEFT + \featherDurations #(ly:make-moment 2/1) + { c16[ c c c c c c c] } + \override Beam.grow-direction = #RIGHT + \featherDurations #(ly:make-moment 2/3) + { c32[ d e f] } + % revert to non-feathered beams + \override Beam.grow-direction = #'() + { g32[ a b c] } +} @end lilypond @noindent @@ -2562,7 +2572,6 @@ MIDI 出力での演奏時間は正確です。 @cindex repeat bars (繰り返しの小節線) @funindex \bar -@funindex bar 小節線は小節を区切り、繰り返しを示すためにも使用されます。@c 通常、単線の小節線が拍子に基づいて出力に自動的に挿入されます。 @@ -2571,8 +2580,8 @@ MIDI 出力での演奏時間は正確です。 @code{\bar} コマンドで他のタイプに変更することができます。@c 例えば、通常、2 重線の閉じの小節線が楽曲の最後に配置されます: -@lilypond[quote,relative=1,verbatim] -e4 d c2 \bar "|." +@lilypond[quote,verbatim] +\relative { e'4 d c2 \bar "|." } @end lilypond ある小節の最後の音符が、自動的に挿入される小節線の所で終わっていなくても@c @@ -2629,24 +2638,28 @@ e4 d c2 \bar "|." 手動で挿入できる小節線として、単線の小節線は 2 種類あり、@c 2 重線の小節線は 5 種類あります: -@lilypond[quote,relative=1,verbatim] -f1 \bar "|" -f1 \bar "." -g1 \bar "||" -a1 \bar ".|" -b1 \bar ".." -c1 \bar "|.|" -d1 \bar "|." -e1 +@lilypond[quote,verbatim] +\relative { + f'1 \bar "|" + f1 \bar "." + g1 \bar "||" + a1 \bar ".|" + b1 \bar ".." + c1 \bar "|.|" + d1 \bar "|." + e1 +} @end lilypond @noindent さらに、点線と破線の小節線があります: -@lilypond[quote,relative=1,verbatim] -f1 \bar ";" -g1 \bar "!" -a1 +@lilypond[quote,verbatim] +\relative { + f'1 \bar ";" + g1 \bar "!" + a1 +} @end lilypond @noindent @@ -2675,20 +2688,22 @@ to use @code{\divisioMinima} there instead, described in the section 行内のセーニョ記号として、3 タイプの小節線があり、@c 改行での振る舞いがそれぞれ異なります: -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar "S" -c4 c c c \break -\bar "S" -c4 c c c -\bar "S-|" -c4 c c c \break -\bar "S-|" -c4 c c c -\bar "S-S" -c4 c c c \break -\bar "S-S" -c1 +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar "S" + c4 c c c \break + \bar "S" + c4 c c c + \bar "S-|" + c4 c c c \break + \bar "S-|" + c4 c c c + \bar "S-S" + c4 c c c \break + \bar "S-S" + c1 +} @end lilypond @cindex repeats (繰り返し) @@ -2706,42 +2721,46 @@ c1 この小節線は行の終わりに 2 重線の小節線を置き、@c 次の行の始めに繰り返し開始の小節線を置きます。 -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar ".|:-||" -c4 c c c \break -\bar ".|:-||" -c4 c c c +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar ".|:-||" + c4 c c c \break + \bar ".|:-||" + c4 c c c +} @end lilypond 繰り返しとセーニョ記号の組み合わせは 6 種類あります: -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar ":|.S" -c4 c c c \break -\bar ":|.S" -c4 c c c -\bar ":|.S-S" -c4 c c c \break -\bar ":|.S-S" -c4 c c c -\bar "S.|:-S" -c4 c c c \break -\bar "S.|:-S" -c4 c c c -\bar "S.|:" -c4 c c c \break -\bar "S.|:" -c4 c c c -\bar ":|.S.|:" -c4 c c c \break -\bar ":|.S.|:" -c4 c c c -\bar ":|.S.|:-S" -c4 c c c \break -\bar ":|.S.|:-S" -c1 +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar ":|.S" + c4 c c c \break + \bar ":|.S" + c4 c c c + \bar ":|.S-S" + c4 c c c \break + \bar ":|.S-S" + c4 c c c + \bar "S.|:-S" + c4 c c c \break + \bar "S.|:-S" + c4 c c c + \bar "S.|:" + c4 c c c \break + \bar "S.|:" + c4 c c c + \bar ":|.S.|:" + c4 c c c \break + \bar ":|.S.|:" + c4 c c c + \bar ":|.S.|:-S" + c4 c c c \break + \bar ":|.S.|:-S" + c1 +} @end lilypond さらに、@code{\inStaffSegno} コマンドがあります。@c @@ -2754,17 +2773,17 @@ c1 結果として、@code{StaffGroup}, @code{PianoStaff}, あるいは @code{GrandStaff} では、小節線は譜をまたがって 1 本に接続されます。 -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << \new StaffGroup << - \new Staff { - e4 d + \new Staff \relative { + e'4 d \bar "||" f4 e } - \new Staff { \clef bass c4 g e g } + \new Staff \relative { \clef bass c'4 g e g } >> - \new Staff { \clef bass c2 c2 } + \new Staff \relative { \clef bass c'2 c2 } >> @end lilypond @@ -2777,7 +2796,6 @@ c1 @funindex whichBar @funindex defaultBarType @funindex \bar -@funindex bar @funindex bartype コマンド @code{\bar }@var{bartype} は @@ -2965,7 +2983,6 @@ c1 | c | c | c @end lilypond @funindex \barNumberCheck -@funindex barNumberCheck 大きな楽曲をコピーしている場合、LilyPond の小節番号と@c コピー元のオリジナルの小節番号の対応をチェックすると役に立ちます。@c @@ -2993,15 +3010,16 @@ c1 | c | c | c @cindex mark, rehearsal (リハーサル記号) @funindex \mark -@funindex mark リハーサル記号を譜刻するには、@code{\mark} コマンドを使用します: -@lilypond[quote,verbatim,relative=2] -c1 \mark \default -c1 \mark \default -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + c1 \mark \default + c1 \mark \default + c1 \mark \default + c1 \mark \default +} @end lilypond @noindent @@ -3009,12 +3027,14 @@ c1 \mark \default 手動で整数をリハーサル記号にセットすることもできます。@c セットした値は @code{rehearsalMark} に保存されます。 -@lilypond[quote,verbatim,relative=2] -c1 \mark \default -c1 \mark \default -c1 \mark #8 -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + c1 \mark \default + c1 \mark \default + c1 \mark #8 + c1 \mark \default + c1 \mark \default +} @end lilypond @noindent @@ -3029,13 +3049,15 @@ c1 \mark \default \set Score.markFormatter = #format-mark-circle-alphabet @end example -@lilypond[quote,verbatim,relative=2] -\set Score.markFormatter = #format-mark-box-alphabet -c1 \mark \default -c1 \mark \default -c1 \mark #8 -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + \set Score.markFormatter = #format-mark-box-alphabet + c1 \mark \default + c1 \mark \default + c1 \mark #8 + c1 \mark \default + c1 \mark \default +} @end lilypond @cindex rehearsal mark format (リハーサル記号のフォーマット) @@ -3055,16 +3077,18 @@ c1 \mark \default 以下の例では、@code{markFormatter} には定義済みの手続きがセットされています。@c 数小節後では、四角で囲まれた番号を作り出す手続きがセットされています。 -@lilypond[quote,verbatim,relative=2] -\set Score.markFormatter = #format-mark-numbers -c1 \mark \default -c1 \mark \default -\set Score.markFormatter = #format-mark-box-numbers -c1 \mark \default -\set Score.markFormatter = #format-mark-circle-numbers -c1 \mark \default -\set Score.markFormatter = #format-mark-circle-letters -c1 +@lilypond[quote,verbatim] +\relative c'' { + \set Score.markFormatter = #format-mark-numbers + c1 \mark \default + c1 \mark \default + \set Score.markFormatter = #format-mark-box-numbers + c1 \mark \default + \set Score.markFormatter = #format-mark-circle-numbers + c1 \mark \default + \set Score.markFormatter = #format-mark-circle-letters + c1 +} @end lilypond ファイル @file{scm/translation-functions.scm} は @@ -3099,15 +3123,16 @@ c1 @cindex glyphs, music (音楽的図柄) @funindex \musicglyph -@funindex musicglyph 音楽的図柄 (セーニョ記号など) を @code{\mark} の中に譜刻することができます: -@lilypond[quote,verbatim,relative=1] -c1 \mark \markup { \musicglyph #"scripts.segno" } -c1 \mark \markup { \musicglyph #"scripts.coda" } -c1 \mark \markup { \musicglyph #"scripts.ufermata" } -c1 +@lilypond[quote,verbatim] +\relative c' { + c1 \mark \markup { \musicglyph #"scripts.segno" } + c1 \mark \markup { \musicglyph #"scripts.coda" } + c1 \mark \markup { \musicglyph #"scripts.ufermata" } + c1 +} @end lilypond @noindent @@ -3170,9 +3195,11 @@ c1 装飾小音符は装飾の音であり、小さなフォントで表示され、@c 論理的には演奏時間を持ちません。 -@lilypond[quote,relative=2,verbatim] -c4 \grace b16 a4( -\grace { b16 c16 } a2) +@lilypond[quote,verbatim] +\relative { + c''4 \grace b16 a4( + \grace { b16 c16 } a2) +} @end lilypond 装飾音符には他にも 3 つのタイプがあります。@c @@ -3191,38 +3218,39 @@ Lilypond はさらに 2 つ特殊なタイプの装飾小音符をサポート @emph{appoggiatura} (一定の比率で主音符から演奏時間をとり、@c スラッシュを持たない小さな音符で譜刻されます) です。 -@lilypond[quote,relative=2,verbatim] -\acciaccatura d8 c4 -\appoggiatura e8 d4 -\acciaccatura { g16 f } e2 -\slashedGrace a,8 g4 -\slashedGrace b16 a4( -\slashedGrace b8 a2) +@lilypond[quote,verbatim] +\relative { + \acciaccatura d''8 c4 + \appoggiatura e8 d4 + \acciaccatura { g16 f } e2 + \slashedGrace a,8 g4 + \slashedGrace b16 a4( + \slashedGrace b8 a2) +} @end lilypond 装飾小音符の配置は他の譜と同期されます。@c 以下の例では、8 分の装飾小音符 1 つに対して 2 つの 16 分装飾小音符が@c 割り当てられています: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Staff { e2 \grace { c16 d e f } e2 } - \new Staff { c2 \grace { g8 b } c2 } + \new Staff \relative { e''2 \grace { c16 d e f } e2 } + \new Staff \relative { c''2 \grace { g8 b } c2 } >> @end lilypond @cindex grace notes, following (装飾小音符を後ろに配置する) @funindex \afterGrace -@funindex afterGrace 装飾小音符で記譜を終えたいのならば、@c @code{\afterGrace} コマンドを使用します。@c このコマンドは 2 つの引数をとります: 主音符と主音符の後に続く装飾小音符です。 -@lilypond[quote,verbatim,relative=2] -c1 \afterGrace d1 { c16[ d] } c1 +@lilypond[quote,verbatim] +\relative { c''1 \afterGrace d1 { c16[ d] } c1 } @end lilypond これは主音符の長さの 3/4 のスペースをとった後に@c @@ -3232,18 +3260,18 @@ c1 \afterGrace d1 { c16[ d] } c1 以下の例では、スペースをデフォルト、主音符の 15/16、最後は 1/2 に@c 設定した結果を示しています。 -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - \new Staff { - c1 \afterGrace d1 { c16[ d] } c1 + \new Staff \relative { + c''1 \afterGrace d1 { c16[ d] } c1 } - \new Staff { + \new Staff \relative { #(define afterGraceFraction (cons 15 16)) - c1 \afterGrace d1 { c16[ d] } c1 + c''1 \afterGrace d1 { c16[ d] } c1 } - \new Staff { + \new Staff \relative { #(define afterGraceFraction (cons 1 2)) - c1 \afterGrace d1 { c16[ d] } c1 + c''1 \afterGrace d1 { c16[ d] } c1 } >> @end lilypond @@ -3253,10 +3281,10 @@ c1 \afterGrace d1 { c16[ d] } c1 以下の例では、主音符の長さの 7/8 のスペースをとった後に装飾小音符を@c 配置しています。 -@lilypond[quote,verbatim,relative=2] -\new Voice { +@lilypond[quote,verbatim] +\new Voice \relative { << - { d1^\trill_( } + { d''1^\trill_( } { s2 s4. \grace { c16 d } } >> c1) @@ -3276,11 +3304,11 @@ c1 \afterGrace d1 { c16[ d] } c1 以下の例では、装飾小音符の符幹のデフォルトの向きがオーバライドされ、@c それから元に戻されています。 -@lilypond[quote,verbatim,relative=2] -\new Voice { +@lilypond[quote,verbatim] +\new Voice \relative { \acciaccatura { \stemDown - f16-> + f''16-> \stemNeutral } g4 e c2 @@ -3345,10 +3373,10 @@ c1 \afterGrace d1 { c16[ d] } c1 装飾小音符を持つ譜と持たない譜を混在させる場合は気をつけて下さい。@c 例えば: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Staff { e4 \bar ".|:" \grace c16 d2. } - \new Staff { c4 \bar ".|:" d2. } + \new Staff \relative { e''4 \bar ".|:" \grace c16 d2. } + \new Staff \relative { c''4 \bar ".|:" d2. } >> @end lilypond @@ -3357,10 +3385,10 @@ c1 \afterGrace d1 { c16[ d] } c1 装飾小音符を挿入することによって修正することができます。@c 上の例を以下のように修正します: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Staff { e4 \bar ".|:" \grace c16 d2. } - \new Staff { c4 \bar ".|:" \grace s16 d2. } + \new Staff \relative { e''4 \bar ".|:" \grace c16 d2. } + \new Staff \relative { c''4 \bar ".|:" \grace s16 d2. } >> @end lilypond @@ -3441,8 +3469,8 @@ MIDI 出力において装飾小音符はそれぞれ 1/4 の実演奏時間を その音楽表記と同じ長さの複数小節休符または @code{\skip} を生成します。 @lilypond[verbatim,quote] -MyCadenza = \relative c' { - c4 d8 e f g g4 +MyCadenza = \relative { + c'4 d8 e f g g4 f2 g4 g } @@ -3527,9 +3555,9 @@ MyCadenza = \relative c' { 次の小節線は 5/4 ではなく 9/8 の位置で引かれます。 @lilypond[quote,verbatim] -\new Voice \relative c' { +\new Voice \relative { \set Timing.measureLength = #(ly:make-moment 5/4) - c1 c4 | + c'1 c4 | c1 c4 | c4 c \set Timing.measurePosition = #(ly:make-moment 5/8) diff --git a/Documentation/ja/notation/simultaneous.itely b/Documentation/ja/notation/simultaneous.itely index b88b36a319..c89e52bebd 100644 --- a/Documentation/ja/notation/simultaneous.itely +++ b/Documentation/ja/notation/simultaneous.itely @@ -6,7 +6,7 @@ version that you are working on. See TRANSLATION for details. @end ignore -@c \version "2.17.28" +@c \version "2.19.29" @c Translators: Yoshiki Sawada @@ -56,22 +56,28 @@ LilyPond の中で多声部は同じ譜にある複数のボイスを参照し 和音は @code{<} と @code{>} で 1 組のピッチを囲むことによって形成されます。@c 和音の後には -- 普通の音符と同様に -- 演奏時間が続くかもしれません: -@lilypond[verbatim,quote,relative=2] -1 2 4 8. 16 +@lilypond[verbatim,quote] +\relative { + 1 2 4 8. 16 +} @end lilypond さらに、和音の後には -- 普通の音符と同様に -- アーティキュレーションが@c 続くかもしれません: -@lilypond[verbatim,quote,relative=2] -1\fermata 2-> 4\prall 8.^! 16-. +@lilypond[verbatim,quote] +\relative { + 1\fermata 2-> 4\prall 8.^! 16-. +} @end lilypond 和音の中にある音符自体にもアーティキュレーションや装飾を付けることができます。 -@lilypond[verbatim,quote,relative=2] -1 c-^ e>2 4 -8. 16 +@lilypond[verbatim,quote] +\relative { + 1 c-^ e>2 4 + 8. 16 +} @end lilypond しかしながら、いくつかの記譜要素 @@ -79,9 +85,11 @@ LilyPond の中で多声部は同じ譜にある複数のボイスを参照し は和音の中の音符ではなく、和音に付ける必要があります。@c そうしなければ、譜刻されません。 -@lilypond[verbatim,quote,relative=2] -1 \f ( ) -\< \! +@lilypond[verbatim,quote] +\relative { + 1 \f ( ) + \< \! +} @end lilypond @c ここから L2100 @@ -95,10 +103,12 @@ LilyPond の中で多声部は同じ譜にある複数のボイスを参照し タイミングで発生して、組み合わされます (そのような要素の複雑な組み合わせ@c については @ref{Simultaneous expressions} を参照してください): -@lilypond[verbatim,quote,relative=2] -\grace { g8( a b } -<> ) \p \< -. -\markup \italic "sempre staccato" -\repeat unfold 4 { c4 e } c1\f +@lilypond[verbatim,quote] +\relative { + \grace { g'8( a b } + <> ) \p \< -. -\markup \italic "sempre staccato" + \repeat unfold 4 { c4 e } c1\f +} @end lilypond @cindex relative pitch, chords (和音と相対ピッチ) @@ -110,8 +120,10 @@ LilyPond の中で多声部は同じ譜にある複数のボイスを参照し 和音の中にある残りの音符はすべて @emph{同じ和音の中にある} 前の音符との相対関係になります。 -@lilypond[verbatim,quote,relative=2] -1 +@lilypond[verbatim,quote] +\relative { + 1 +} @end lilypond 和音についての更なる情報は、@ref{Chord notation} を参照してください。 @@ -162,33 +174,41 @@ LilyPond の中で多声部は同じ譜にある複数のボイスを参照し 入力の手間を省くために、前の和音を繰り返すための短縮記法があります。@c 和音を繰り返すためのシンボルは @code{q} です: -@lilypond[verbatim,quote,relative=2] -1 q 2 q +@lilypond[verbatim,quote] +\relative { + 1 q 2 q +} @end lilypond 前の和音のピッチが複製されているだけなので、 通常の和音と同様に、和音の繰り返しのシンボルにも演奏時間、@c アーティキュレーション、マークアップ、スラー、連桁などを使うことができます。 -@lilypond[verbatim,quote,relative=2] -1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +@lilypond[verbatim,quote] +\relative { + 1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +} @end lilypond 和音繰り返しのシンボルは常に最後の和音を覚えているため、@c 最後の和音の後に和音ではない音符や休符があったとしても、@c 和音を繰り返すことができます。 -@lilypond[verbatim,quote,relative=2] -1 c'4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1 c'4 q2 r8 q8 | + q2 c, | +} @end lilypond しかしながら、和音繰り返しのシンボルは前の和音の中にある、あるいは付属している@c 強弱記号、アーティキュレーション、あるいは装飾を持ち越しません。 -@lilypond[verbatim,quote,relative=2] -1\sfz c'4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1\sfz c'4 q2 r8 q8 | + q2 c, | +} @end lilypond それらのイベントを持ち越すには、@code{\chordRepeats} 関数を明示的に呼び出し、@c @@ -196,9 +216,9 @@ q2 c, | これにより持ち越されるイベントはすでに和音 @code{q} に存在しているものだけです。 @lilypond[verbatim,quote] -\relative c'' { +\relative { \chordRepeats #'(articulation-event) - { 1\sfz c'4 q2 r8 q8-. } | + { 1\sfz c'4 q2 r8 q8-. } | q2 c, | } @end lilypond @@ -224,8 +244,8 @@ q2 c, | \new Voice \relative c'' { \chordRepeats #'(articulation-event) - \relative c'' - { 1\sfz c'4 q2 r8 q8-. } | + \relative + { 1\sfz c'4 q2 r8 q8-. } | q2 c | } @end lilypond @@ -257,15 +277,19 @@ q2 c, | 以下の例は 1 つの譜の上にある同時進行表記を示しています: @c KEEP LY -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Voice { % 明らかに単一のボイスです - << { a4 b g2 } { d4 g c,2 } >> + << \relative { a'4 b g2 } + \relative { d'4 g c,2 } >> } @end lilypond -@lilypond[quote,verbatim,relative=2] -% 単一の音符で始まります -a << {a4 b g} {d4 g c,} >> +@lilypond[quote,verbatim] +\relative { + % 単一の音符で始まります + a' << \relative { a'4 b g } + \relative { d'4 g c, } >> +} @end lilypond これは同時進行するセクションが同一のリズムを持つ場合に役に立ちます。@c @@ -274,8 +298,10 @@ a << {a4 b g} {d4 g c,} >> @emph{単一の} @samp{Voice} の中にある音符、アーティキュレーション、@c それにプロパティの変更は収集され、音楽的な順序で譜刻されます: -@lilypond[quote,verbatim,relative=2] -4-. <>-. << c a >> << { c-. } { a s-. } >> +@lilypond[quote,verbatim] +\relative { + 4-. <>-. << c a >> << { c-. } { a s-. } >> +} @end lilypond 同時に複数の符幹や連桁、あるいは異なる音符の演奏時間やプロパティが必要な@c @@ -285,9 +311,10 @@ a << {a4 b g} {d4 g c,} >> 以下の例は、同時進行する表記が暗黙的に複数の譜を生成する様子を示しています: @c KEEP LY -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % 単一の音符で始まりません -<< {a4 b g2} {d4 g2 c,4} >> +<< \relative { a'4 b g2 } + \relative { d'4 g2 c,4 } >> @end lilypond ここでは、リズムが異なっていても問題ありません。@c @@ -326,7 +353,6 @@ warning: ignoring too many clashing note columns @cindex note cluster (音符のクラスタ) @funindex \makeClusters -@funindex makeClusters クラスタは演奏すべき連続したピッチの範囲を示します。@c クラスタは 1 組の音符の範囲 (envelope) として表されます。@c @@ -334,8 +360,8 @@ warning: ignoring too many clashing note columns を適用することによって入力されます。@c 例えば以下のように: -@lilypond[quote,relative=2,verbatim] -\makeClusters { 2 } +@lilypond[quote,verbatim] +\relative \makeClusters { 2 } @end lilypond 通常の音符とクラスタを同じ譜に一緒にして配置することができます @@ -393,23 +419,21 @@ warning: ignoring too many clashing note columns @cindex lyrics assigned to one voice (1 つのボイスに代入される歌詞) @funindex \voiceOne -@funindex voiceOne @funindex \voiceOne ... \voiceFour @funindex Voice @funindex \oneVoice -@funindex oneVoice @subsubsubheading 明示的にボイスをインスタンス化する 単一の譜の中に複数の独立したボイスを配置するのに必要とされる基本的な構造が@c 以下の例で示されています: -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] \new Staff << \new Voice = "first" - { \voiceOne r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { \voiceOne r8 r16 g'' e8. f16 g8[ c,] f e16 d } \new Voice= "second" - { \voiceTwo d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { \voiceTwo d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @@ -441,10 +465,10 @@ warning: ignoring too many clashing note columns これと同様に、歌詞は多声セクションの前、最中、後に続いているボイスに@c 代入されます: -@lilypond[quote, verbatim, relative=2] -<< +@lilypond[quote,verbatim] +\relative << \new Voice = "melody" { - a4 + a'4 << { \voiceOne @@ -482,11 +506,11 @@ warning: ignoring too many clashing note columns 最初の例は以下のように書き換えることができます: -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { r8 r16 g'' e8. f16 g8[ c,] f e16 d } \\ - { d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @@ -500,13 +524,13 @@ warning: ignoring too many clashing note columns しています。@c 休符が 2 重に譜刻されることを避けるために、空白休符を使用しています。 -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 g g g g f16 ees f8 d } + \relative { r8 g'' g g g f16 ees f8 d } \\ - { ees,8 r ees r d r d r } + \relative { ees'8 r ees r d r d r } \\ - { d'8 s c s bes s a s } + \relative { d''8 s c s bes s a s } >> @end lilypond @@ -562,10 +586,10 @@ etc. これを実現するには、並行する音楽を明示的にインスタンス化されたボイス内の@c 同時進行音楽構造の中に置きます: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] \new Voice << - { e4 f8 d e16 f g8 d4 } - { c4 d8 b c16 d e8 b4 } + \relative { e''4 f8 d e16 f g8 d4 } + \relative { c''4 d8 b c16 d e8 b4 } >> @end lilypond @@ -610,15 +634,15 @@ etc. ボイス毎に異なる色と形を与えて、容易に見分けられるようにすることができます: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { \voiceOneStyle d4 c2 b4 } + \relative { \voiceOneStyle d''4 c2 b4 } \\ - { \voiceTwoStyle e,2 e } + \relative { \voiceTwoStyle e'2 e } \\ - { \voiceThreeStyle b2. c4 } + \relative { \voiceThreeStyle b2. c4 } \\ - { \voiceFourStyle g'2 g } + \relative { \voiceFourStyle g'2 g } >> @end lilypond @@ -657,21 +681,13 @@ etc. @cindex voices, multiple (複数のボイス) @cindex shift rest, automatic (自動的な休符のシフト) @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn @funindex \shiftOff -@funindex shiftOff @funindex \mergeDifferentlyDottedOn -@funindex mergeDifferentlyDottedOn @funindex \mergeDifferentlyDottedOff -@funindex mergeDifferentlyDottedOff @funindex \mergeDifferentlyHeadedOn -@funindex mergeDifferentlyHeadedOn @funindex \mergeDifferentlyHeadedOff -@funindex mergeDifferentlyHeadedOff 同じピッチ、同じ符頭を持ち、符幹の方向が逆で異なるボイスの中にある符頭は@c 自動的に 1 つの符頭にまとめられます -- マージされます。@c @@ -681,18 +697,20 @@ etc. 以下の例は 3 つの異なる状態を示しています -- 第 1 小節の 1, 3 拍目、それに第 2 小節の 1 拍目で自動マージが失敗しています。 -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { - c8 d e d c d c4 + \relative { + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -701,39 +719,43 @@ etc. -- 例外として、半音符と 4 分音符のマージはできません。@c 第 1 小節の 1 拍目の符頭がマージされました: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond 第 1 小節の 3 拍目のように異なる付点を持つ符頭もマージすることができます: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -748,21 +770,23 @@ etc. 最上段にある @notation{g} を列から外し、@c @code{\mergeDifferentlyHeadedOn} を正しく機能させています。 -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 \shiftOn g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -789,10 +813,10 @@ etc. @c KEEP LY @lilypond[quote,verbatim] -\new Staff \relative c'' { +\new Staff \relative { %% 簡略化された入力 << - { f2 } % 1: 最上段 + { f''2 } % 1: 最上段 \\ { g,2 } % 2: 最下段 \\ @@ -861,11 +885,11 @@ etc. @code{\override NoteColumn.ignore-collision = ##t} を使うと@c 異なるボイスにある符頭が異なる音符を不適切にマージします。 -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim,fragment] \mergeDifferentlyHeadedOn -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> \override NoteColumn.ignore-collision = ##t -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> @end lilypond @ignore @@ -897,7 +921,6 @@ are at the same time differently dotted are not clear. @cindex a due part (二重奏パート) @cindex solo part (ソロ パート) @funindex \partcombine -@funindex partcombine 自動パート結合は 2 つのパートに分かれた音楽を単一の譜にマージします。@c これはオーケストラ譜を譜刻する時に特に有用です。@c @@ -920,17 +943,17 @@ are at the same time differently dotted are not clear. 個々のパート譜と結合譜で同じ変数が使用されています。 @lilypond[quote,verbatim] -instrumentOne = \relative c' { - c4 d e f | +instrumentOne = \relative { + c'4 d e f | R1 | d'4 c b a | b4 g2 f4 | e1 | } -instrumentTwo = \relative g' { +instrumentTwo = \relative { R1 | - g4 a b c | + g'4 a b c | d4 c b a | g4 f( e) d | e1 | @@ -972,17 +995,11 @@ instrumentTwo = \relative g' { と @var{musicexpr2} のピッチには影響を与えません。 @funindex \partcombineChords -@funindex partcombineChords @funindex \partcombineApart -@funindex partcombineApart @funindex \partcombineUnisono -@funindex partcombineUnisono @funindex \partcombineSoloI -@funindex partcombineSoloI @funindex \partcombineSoloII -@funindex partcombineSoloII @funindex \partcombineAutomatic -@funindex partcombineAutomatic プロの楽譜では長いパッセージで、@c 2 つのボイスの音符のいくつかが同じでユニゾンとして譜刻できる場合であっても、@c @@ -997,28 +1014,28 @@ instrumentTwo = \relative g' { @itemize @item -@code{\partcombineApart} と @code{\partcombineApartOnce} は@c +@code{\partcombineApart} と @code{\once \partcombineApart} は@c 音符を 2 つの別個のボイスとして譜刻します -- たとえ和音やユニゾンにできる場合であっても分けて譜刻します。 @item -@code{\partcombineChords} と @code{\partcombineChordsOnce} は@c +@code{\partcombineChords} と @code{\once \partcombineChords} は@c 音符を組み合わせて、和音として譜刻します。 @item -@code{\partcombineUnisono} と @code{\partcombineUnisonoOnce} は@c +@code{\partcombineUnisono} と @code{\once \partcombineUnisono} は@c 音符を組み合わせて、@qq{ユニゾン} として譜刻します。 @item -@code{\partcombineSoloI} と @code{\partcombineSoloIOnce} は@c +@code{\partcombineSoloI} と @code{\once \partcombineSoloI} は@c ボイス 1 だけを譜刻して、@qq{Solo} のマークを付けます。 @item -@code{\partcombineSoloII} と @code{\partcombineSoloIIOnce} は@c +@code{\partcombineSoloII} と @code{\once \partcombineSoloII} は@c ボイス 2 だけを譜刻して、@qq{Solo} のマークを付けます。 @item -@code{\partcombineAutomatic} と @code{\partcombineAutomaticOnce}は@c +@code{\partcombineAutomatic} と @code{\once \partcombineAutomatic}は@c 上記のコマンドの効果を終わらせ、標準の @code{\partcombine} に戻します。 @end itemize @@ -1028,11 +1045,11 @@ instrumentOne = \relative c' { \partcombineAutomatic e2^"auto" e | \partcombineChords e'2^"chord" e | \partcombineAutomatic c2^"auto" c | - \partcombineApart c2^"apart" \partcombineChordsOnce e^"chord once" | + \partcombineApart c2^"apart" \once \partcombineChords e^"chord once" | c2 c | } -instrumentTwo = \relative c' { - c2 c | +instrumentTwo = \relative { + c'2 c | e2 e | a,2 c | c2 c' | @@ -1114,7 +1131,6 @@ instrumentTwo = \relative c' { @cindex interleaved music (間奏) @cindex parallel music (並列な音楽) @funindex \parallelMusic -@funindex parallelMusic 複数のパートを持つ音楽を入力コードの途中に挿入することができます。@c 関数 @code{\parallelMusic} は、@c @@ -1129,12 +1145,12 @@ instrumentTwo = \relative c' { \parallelMusic #'(voiceA voiceB voiceC) { % Bar 1 r8 g'16 c'' e'' g' c'' e'' r8 g'16 c'' e'' g' c'' e'' | - r16 e'8.~ e'4 r16 e'8.~ e'4 | + r16 e'8.~ 4 r16 e'8.~ 4 | c'2 c'2 | % Bar 2 r8 a'16 d'' f'' a' d'' f'' r8 a'16 d'' f'' a' d'' f'' | - r16 d'8.~ d'4 r16 d'8.~ d'4 | + r16 d'8.~ 4 r16 d'8.~ 4 | c'2 c'2 | } @@ -1154,12 +1170,12 @@ instrumentTwo = \relative c' { \parallelMusic #'(voiceA voiceB voiceC) { % Bar 1 r8 g16 c e g, c e r8 g,16 c e g, c e | - r16 e8.~ e4 r16 e8.~ e4 | + r16 e8.~ 4 r16 e8.~ 4 | c2 c | % Bar 2 r8 a,16 d f a, d f r8 a,16 d f a, d f | - r16 d8.~ d4 r16 d8.~ d4 | + r16 d8.~ 4 r16 d8.~ 4 | c2 c | } diff --git a/Documentation/ja/notation/spacing.itely b/Documentation/ja/notation/spacing.itely index 9c16677ce7..a7bcbafe56 100644 --- a/Documentation/ja/notation/spacing.itely +++ b/Documentation/ja/notation/spacing.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.22" @c Translators: Yoshiki Sawada @@ -507,7 +507,7 @@ largest of: @example \paper @{ - system-system-spacing #'basic-distance = #8 + system-system-spacing.basic-distance = #8 score-system-spacing = #'((basic-distance . 12) (minimum-distance . 6) @@ -1028,7 +1028,7 @@ increased by one. Default: @code{#f}. tagline = ##f } \score { - \relative c'' { c1 \break c1 \break c1 } + \relative { c''1 \break c1 \break c1 } } } @end lilypond @@ -1196,11 +1196,11 @@ layoutVariable = \layout @{ @code{\layout} ブロックの構成は以下のようになります: @example - TextScript #'padding = #1 - TextScript #'color = #magenta - Glissando #'thickness = #1.5 - NoteHead #' font-size = #4 - NoteHead #' color = #red + TextScript.padding = #1 + TextScript.color = #magenta + Glissando.thickness = #1.5 + NoteHead.font-size = #4 + NoteHead.color = #red @end example これに @code{indent} と @code{StaffGrouper} の設定がプラスしたものです。 @@ -1209,8 +1209,8 @@ layoutVariable = \layout @{ 場合、カレントの構成は以下だけになってしまいます: @example - NoteHead #' font-size= #4 % (変数定義で記述されたものです) - NoteHead #' color = #red % (変数が使用された後に追加されたものです) + NoteHead.font-size= #4 % (変数定義で記述されたものです) + NoteHead.color = #red % (変数が使用された後に追加されたものです) @end example 注意深く計画を立てれば、@code{\layout} 変数はソースのレイアウト設計を構築@c @@ -1367,9 +1367,11 @@ Feta フォントは 8 つのサイズの音楽シンボルを提供します。 小節線が引かれる場所で手動で強制的に改行を入れるには、@c @code{\break} コマンドを使用します: -@lilypond[quote,ragged-right,relative=2,verbatim] -c4 c c c | \break -c4 c c c | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c c | \break + c4 c c c | +} @end lilypond デフォルトでは、小節の途中での @code{\break} は無視され、@c @@ -1377,11 +1379,13 @@ c4 c c c | 小節の途中で強制的に改行を入れるには、@c @w{@samp{\bar ""}} を用いて不可視の小節線を追加します: -@lilypond[quote,ragged-right,relative=2,verbatim] -c4 c c -\bar "" \break -c | -c4 c c c | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c + \bar "" \break + c | + c4 c c c | +} @end lilypond 連符が開始する小節と終了する小節が異なる場合などのように、@c @@ -1396,9 +1400,9 @@ c4 c c c | @lilypond[quote,ragged-right,verbatim] \new Voice \with { \remove "Forbid_line_break_engraver" -} \relative c'' { +} \relative { << - { c2. \tuplet 3/2 { c4 c c } c2. | } + { c''2. \tuplet 3/2 { c4 c c } c2. | } { s1 | \break s1 | } >> } @@ -1408,10 +1412,12 @@ c4 c c c | この振る舞いは、@code{\override Beam.breakable = ##t} により、@c 変更することができます: -@lilypond[quote,ragged-right,relative=2,verbatim] -\override Beam.breakable = ##t -c2. c8[ c | \break -c8 c] c2. | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \override Beam.breakable = ##t + c2. c8[ c | \break + c8 c] c2. | +} @end lilypond @code{\noBreak} コマンドは、コマンドが配置された小節線での改行を禁止します。 @@ -1762,7 +1768,7 @@ LilyPond は明示的な改ページである ragged-bottom = ##t } -music = \relative c'' { c8 c c c } +music = \relative { c''8 c c c } \score { \new Staff { @@ -1797,7 +1803,7 @@ music = \relative c'' { c8 c c c } 通常、改行/改ページ情報は音符入力部分に直接入力します。 @example -music = \relative c'' @{ c4 c c c @} +music = \relative @{ c''4 c c c @} \score @{ \new Staff @{ @@ -1816,7 +1822,7 @@ music = \relative c'' @{ c4 c c c @} その他の改行/改ページ情報だけを保持します。 @lilypond[quote,verbatim] -music = \relative c'' { c4 c c c } +music = \relative { c''4 c c c } \score { \new Staff << @@ -1847,7 +1853,7 @@ This pattern becomes especially helpful when overriding 他の有用だが長いプロパティを上書きするときに、非常に役に立ちます。 @lilypond[quote,verbatim] -music = \relative c'' { c4 c c c } +music = \relative { c''4 c c c } \score { \new Staff << @@ -2020,7 +2026,7 @@ staffAffinityDown = \with { } labelContext = #(define-music-function - (parser location context) + (context) (string?) #{ s1*0^\markup { \typewriter #context } #}) @@ -2896,13 +2902,13 @@ c2 c4. c8 c4. c16[ c] c4. c8 c8 c8 c4 c4 c4 後半は修正を誇張しています: @lilypond[quote,ragged-right] -{ - c'4 e''4 e'4 b'4 | - b'4 e''4 b'4 e''4 | +\fixed c' { + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | \override Staff.NoteSpacing.stem-spacing-correction = #1.5 \override Staff.StaffSpacing.stem-spacing-correction = #1.5 - c'4 e''4 e'4 b'4 | - b'4 e''4 b'4 e''4 | + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | } @end lilypond @@ -2936,7 +2942,7 @@ Essay on automated music engraving: @node 新しいスペース領域 @subsection 新しいスペース領域 -@translationof New spacing area +@translationof New spacing section @code{newSpacingSection} を用いることで、@c 異なるスペース パラメータを持つ新しいセクションを開始することができます。@c @@ -2946,13 +2952,15 @@ Essay on automated music engraving: 拍子記号が新たしいセクションを導入しています。@c その結果、16 分音符の間隔が広くなっています。 -@lilypond[relative=1,verbatim,quote] -\time 2/4 -c4 c8 c -c8 c c4 c16[ c c8] c4 -\newSpacingSection -\time 4/16 -c16[ c c8] +@lilypond[verbatim,quote] +\relative c' { + \time 2/4 + c4 c8 c + c8 c c4 c16[ c c8] c4 + \newSpacingSection + \time 4/16 + c16[ c c8] +} @end lilypond @code{\newSpacingSection} コマンドは新たに @@ -2983,8 +2991,8 @@ c16[ c c8] @lilypond[verbatim,line-width=12\cm] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | @@ -2994,8 +3002,8 @@ c16[ c c8] @lilypond[verbatim,line-width=12\cm] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | @@ -3678,8 +3686,8 @@ e4 c g-\tweak X-offset #-2.7 -\tweak Y-offset #2.5 \f c @lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | @@ -3697,8 +3705,8 @@ e4 c g-\tweak X-offset #-2.7 -\tweak Y-offset #2.5 \f c @lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | diff --git a/Documentation/ja/notation/staff.itely b/Documentation/ja/notation/staff.itely index 7f048afa84..cfae43a644 100644 --- a/Documentation/ja/notation/staff.itely +++ b/Documentation/ja/notation/staff.itely @@ -6,7 +6,7 @@ version that you are working on. See TRANSLATION for details. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @c Translators: Yoshiki Sawada @@ -65,7 +65,6 @@ @cindex tablature (タブ譜) @funindex \drummode -@funindex drummode @funindex DrumStaff @funindex RhythmicStaff @funindex TabStaff @@ -79,8 +78,8 @@ 基本的な譜コンテキストは @code{Staff} です: -@lilypond[verbatim,quote,relative=2] -\new Staff { c4 d e f } +@lilypond[verbatim,quote] +\new Staff \relative { c''4 d e f } @end lilypond @code{DrumStaff} コンテキストは、一般的なドラム セットのための 5 線譜を@c @@ -100,15 +99,15 @@ (ピッチは無視されますが) 演奏時間が保持されます。@c 詳細は @ref{Showing melody rhythms} を参照してください。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new RhythmicStaff { c4 d e f } @end lilypond @code{TabStaff} は、標準のギター チューニングの 6 弦のタブ譜を作成します。@c 詳細は @ref{Default tablatures} を参照してください。 -@lilypond[verbatim,quote,relative=2] -\new TabStaff { c4 d e f } +@lilypond[verbatim,quote] +\new TabStaff \relative { c''4 d e f } @end lilypond 古代音楽の記譜法のために 2 つの譜コンテキストが用意されています: @@ -119,8 +118,8 @@ 現代グレゴリア聖歌を記譜するための譜を作成します。@c これは小節線を譜刻しません。 -@lilypond[verbatim,quote,relative=2] -\new GregorianTranscriptionStaff { c4 d e f e d } +@lilypond[verbatim,quote] +\new GregorianTranscriptionStaff \relative { c''4 d e f e d } @end lilypond 新たに単一譜コンテキストを定義する場合があります。@c @@ -183,38 +182,38 @@ コンテキストが指定されていない場合、デフォルトのプロパティが使用されます: グループは垂直の線で始まり、小節線はつながりません。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond @code{StaffGroup} コンテキストでは、グループは角括弧で始まり、@c 小節線はすべての譜を貫いて刻譜されます。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond @code{ChoirStaff} では、グループは角括弧で始まりますが、小節線はつながりません。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new ChoirStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond @code{GrandStaff} では、グループは波括弧で始まり、小節線はすべての譜を貫きます。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new GrandStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond @@ -222,11 +221,11 @@ 例外として楽器名を刻譜することができます。@c 詳細は @ref{Instrument names} を参照してください。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new PianoStaff << \set PianoStaff.instrumentName = #"Piano" - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { \clef bass c1 c } >> @end lilypond @@ -363,15 +362,15 @@ turned on with a @code{\paper} option. \score { \new StaffGroup << \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } } \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } @@ -423,17 +422,17 @@ turned on with a @code{\paper} option. @cindex ledger lines, modifying (加線を変更する) @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff @code{\stopStaff} コマンドと @code{\startStaff} コマンドを使って、@c 楽譜内の任意の場所で譜線を停止あるいは (再) 開始させることができます。 -@lilypond[verbatim,quote,relative=2] -\stopStaff f4 d \startStaff g, e -f'4 d \stopStaff g, e -f'4 d \startStaff g, e +@lilypond[verbatim,quote] +\relative { + \stopStaff f''4 d \startStaff g, e + f'4 d \stopStaff g, e + f'4 d \startStaff g, e +} @end lilypond + @predefined @@ -447,14 +446,16 @@ f'4 d \startStaff g, e 譜線の本数を変更することができます: -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-count = #2 -\startStaff g, e | - -f'4 d \stopStaff -\revert Staff.StaffSymbol.line-count -\startStaff g, e | +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-count = #2 + \startStaff g, e | + + f'4 d \stopStaff + \revert Staff.StaffSymbol.line-count + \startStaff g, e | +} @end lilypond 各譜線の位置を変更することもできます。@c @@ -463,13 +464,15 @@ f'4 d \stopStaff 1 つの値に対して 1 本の譜線が譜刻されるので、@c 1 つのオーバライドで譜線の位置と本数を変更することができます。 -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) -\startStaff g, e | -f'4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) -\startStaff g, e +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) + \startStaff g, e | + f'4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) + \startStaff g, e | +} @end lilypond 新しい譜線に対応して、@c @@ -480,42 +483,46 @@ f'4 d \stopStaff デフォルトでは、加線 (訳者注: ledger line, 譜の上下に突き出た符頭と符幹に@c 付けられる短い譜線) と符幹の太さも影響を受けます。@c -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #3 +} \relative { + f''4 d g, e } -{ f4 d g, e } @end lilypond しかしながら、加線の太さを譜線の太さから独立して設定することができます。@c 2 つの値は譜線の太さと譜線の間隔に掛け算され、@c それらを加算した値が加線の太さになります。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #2 \override StaffSymbol.ledger-line-thickness = #'(0.5 . 0.4) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond 加線の垂直方向の位置を変更することができます: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-positions = #'(-3 -2 -1 2 5 6) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond 符頭の位置と加線を持つ他の符頭との関係に応じて、@c 符頭の上または下に追加の加線を配置することできます。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-extra = #4 +} \relative { + f'''4 a, d, f, } -{ f'4 a, d, f, } @end lilypond 譜の内部に加線を表示させることもできます。@c @@ -536,11 +543,12 @@ d4 e f g 譜線の間隔を変えることができます。この設定は加線の間隔にも影響を与えます。 -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.staff-space = #1.5 +} \relative { + f'''4 d, g, e, } -{ f'4 d, g, e, } @end lilypond @snippets @@ -577,16 +585,14 @@ d4 e f g @cindex resizing of staves (譜をリサイズする) @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff 適切な位置で新しく同時進行の譜を作成することによって、@c @notation{オッシア} 譜をセットすることができます: @lilypond[verbatim,quote] -\new Staff \relative c'' { - c4 b d c +\new Staff \relative { + c''4 b d c << { c4 b d c } \new Staff { e4 d f e } @@ -608,8 +614,8 @@ d4 e f g 最も適切な方法です。 @lilypond[verbatim,quote] -\new Staff = main \relative c'' { - c4 b d c +\new Staff = main \relative { + c''4 b d c << { c4 b d c } @@ -646,8 +652,8 @@ d4 e f g } { \stopStaff s1*6 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 << { e4 f e2 } \context Staff = ossia { @@ -683,12 +689,12 @@ d4 e f g fontSize = #-3 \override StaffSymbol.staff-space = #(magstep -3) \override StaffSymbol.thickness = #(magstep -3) - } \relative c'' { + } \relative { R1*3 - c4 e8 d c2 + c''4 e8 d c2 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 e4 f e2 g4 a g2 \break c4 b c2 @@ -748,7 +754,6 @@ d4 e f g @funindex \RemoveEmptyStaves @funindex Staff_symbol_engraver @funindex \stopStaff -@funindex stopStaff @code{Staff} コンテキストから @code{Staff_symbol_engraver} を@c 削除することによって、譜線を隠すことができます。@c @@ -758,7 +763,7 @@ d4 e f g \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c''' { a8 f e16 d c b a2 } +\relative { a''8 f e16 d c b a2 } @end lilypond @c 未訳: Frenched Score @@ -781,9 +786,9 @@ d4 e f g } } -\relative c' << +\relative << \new Staff { - e4 f g a \break + e'4 f g a \break b1 \break a4 b c2 } @@ -895,27 +900,29 @@ d4 e f g @code{shortInstrumentName} の値がそれに続くすべての@c 行の譜に対して使用されます。 -@lilypond[verbatim,quote,ragged-right,relative=1] +@lilypond[verbatim,quote,ragged-right] \new Staff \with { instrumentName = #"Violin " shortInstrumentName = #"Vln. " +} \relative { + c'4.. g'16 c4.. g'16 \break | c1 | } -{ c4.. g'16 c4.. g'16 \break | c1 } @end lilypond @cindex instrument names, complex (複雑な楽器名) @code{\markup} を用いて、より複雑な楽器名を作成することができます: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { instrumentName = \markup { \column { "Clarinetti" \line { "in B" \smaller \flat } } } +} \relative { + c''4 c,16 d e f g2 } -{ c4 c,16 d e f g2 } @end lilypond @cindex instrument names, centering (楽器名を中央揃えする) @@ -925,20 +932,20 @@ d4 e f g 複数行にわたる楽器名を中央揃えするには、@c @code{\center-column} を用いる必要があります: -@lilypond[verbatim,quote,indent=1.5\cm,relative=2] +@lilypond[verbatim,quote,indent=1.5\cm] << \new Staff \with { instrumentName = #"Flute" - } - { f2 g4 f } + } \relative { + f''2 g4 f +} \new Staff \with { instrumentName = \markup { \center-column { "Clarinet" \line { "in B" \smaller \flat } } } - } - { c4 b c2 } + } \relative { c''4 b c2 } >> @end lilypond @@ -951,26 +958,22 @@ d4 e f g を参照してください。 @lilypond[verbatim,quote,ragged-right] -\relative c'' { - << - \new Staff \with { - instrumentName = #"Alto Flute in G" - shortInstrumentName = #"Flt." - } - { - f2 g4 f \break - g4 f g2 - } - \new Staff \with { - instrumentName = #"Clarinet" - shortInstrumentName = #"Clar." - } - { - c,4 b c2 \break - c2 b4 c - } - >> -} +<< + \new Staff \with { + instrumentName = #"Alto Flute in G" + shortInstrumentName = #"Flt." + } \relative { + f''2 g4 f \break + g4 f g2 + } + \new Staff \with { + instrumentName = #"Clarinet" + shortInstrumentName = #"Clar." + } \relative { + c''4 b c2 \break + c2 b4 c + } +>> \layout { indent = 3.0\cm @@ -1011,9 +1014,7 @@ d4 e f g @cindex switching instruments (楽器を切り換える) @funindex \addInstrumentDefinition -@funindex addInstrumentDefinition @funindex \instrumentSwitch -@funindex instrumentSwitch 楽器の @emph{切り替え} が必要な場合、切り替えのために必要とされる@c 変更の詳細なリストを作成するために、@code{\addInstrumentDefinition} を @@ -1043,7 +1044,7 @@ d4 e f g R1*16 \instrumentSwitch "contrabassoon" c,,2 g \break - c,1 ~ | c1 + c,1 ~ | 1 } @end lilypond @@ -1072,11 +1073,8 @@ d4 e f g @cindex cue notes (演奏指示音符) @funindex \addQuote -@funindex addQuote @funindex \quoteDuring -@funindex quoteDuring @funindex \transposition -@funindex transposition あるボイスが他のボイスと同じ音符を演奏することはごく一般的なことです。@c 例えば、第 1 バイオリンと第2バイオリンがあるパッセージで同じフレーズを@c @@ -1093,12 +1091,12 @@ d4 e f g 引用部分の演奏時間を示す音楽表記です。 @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { s1 } } \addQuote "flute" { \fluteNotes } @@ -1116,12 +1114,12 @@ oboeNotes = \relative c'' { 引用は多声となり、予期しない結果となる可能性があります。 @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } } \addQuote "flute" { \fluteNotes } @@ -1146,8 +1144,8 @@ clarinetNotes = \relative c'' { b4 ais a ais | cis4^"quoted" r8 bis\p b4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"clarinet" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"clarinet" { s1 } } \addQuote "clarinet" { \clarinetNotes } @@ -1175,13 +1173,13 @@ oboeNotes = \relative c'' { 引用される音楽から引用するオブジェクトを選択することが可能です。 @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a2 g2 | +fluteNotes = \relative { + a'2 g2 | b4\<^"quoted" r8 ais a4\f( c->) } -oboeNotes = \relative c'' { - c2. b4 | +oboeNotes = \relative { + c''2. b4 | \quoteDuring #"flute" { s1 } } @@ -1234,13 +1232,9 @@ LilyPond がクラッシュする可能性さえあります。 @cindex voices, quoting(ボイスを引用する) @funindex \cueDuring -@funindex cueDuring @funindex \cueClef -@funindex cueClef @funindex \cueDuringWithClef -@funindex cueDuringWithClef @funindex \quoteDuring -@funindex quoteDuring @cindex notes, smaller (小さな音符) @cindex smaller notes (小さな音符) @@ -1249,15 +1243,17 @@ LilyPond がクラッシュする可能性さえあります。 合図音符をフォーマットする最も簡単な方法は、@c パートの中で明示的に @code{CueVoice} コンテキストを作成することです。 -@lilypond[verbatim,relative=1] -R1 -<< - { e2\rest r4. e8 } - \new CueVoice { - \stemUp d'8^"flute" c d e fis2 - } ->> -d,4 r a r +@lilypond[verbatim] +\relative { + R1 + << + { e'2\rest r4. e8 } + \new CueVoice { + \stemUp d'8^"flute" c d e fis2 + } + >> + d,4 r a r +} @end lilypond 音部記号の変更が必要で、合図音符に適切なサイズの音部記号を譜刻する場合、@c @@ -1266,28 +1262,32 @@ d,4 r a r その後、@code{\cueClefUnset} コマンドを用いて、@c オリジナルの音部記号 -- 再度、適切なサイズにされた -- に戻すことができます。 -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -<< - { e2\rest r4. \cueClefUnset e,8 } - \new CueVoice { - \cueClef "treble" \stemUp d''8^"flute" c d e fis2 - } ->> -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + << + { e'2\rest r4. \cueClefUnset e,8 } + \new CueVoice { + \cueClef "treble" \stemUp d''8^"flute" c d e fis2 + } + >> + d,,4 r a r +} @end lilypond 必要があれば、@code{CueVoice} 無しで @code{\cueClef} コマンドと @code{\cueClefUnset} コマンドを用いることもできます。 -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -\cueClef "treble" -d'8^"flute" c d e fis2 -\cueClefUnset -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + \cueClef "treble" + d''8^"flute" c d e fis2 + \cueClefUnset + d,,4 r a r +} @end lilypond もっと複雑な合図音符 @@ -1328,8 +1328,8 @@ d,,4 r a r @code{UP} は第 1 ボイスに相当し、@code{DOWN} は第 2 ボイスに相当します。 @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 | d8 c d e fis2 | g2 d | +fluteNotes = \relative { + r2. c''4 | d8 c d e fis2 | g2 d | } oboeNotes = \relative c'' { @@ -1360,8 +1360,8 @@ tie-event beam-event tuplet-span-event)} であり、音符、休符、タイ、 そうしないと音楽表記全体が @code{CueVoice} コンテキストに属してしまいます。} @lilypond[verbatim,quote] -oboeNotes = \relative c'' { - r2 r8 d16(\f f e g f a) +oboeNotes = \relative { + r2 r8 d''16(\f f e g f a) g8 g16 g g2. } \addQuote "oboe" { \oboeNotes } @@ -1386,8 +1386,8 @@ oboeNotes = \relative c'' { 合図音符が終わったところで手動で元の音部記号に戻す必要がありmす。 @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { @@ -1413,8 +1413,8 @@ bassoonNotes = \relative c { 合図音部が終了したところで元の音部記号を自動的に譜刻します。 @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { @@ -1433,7 +1433,6 @@ bassoonNotes = \relative c { @end lilypond @funindex \transposedCueDuring -@funindex transposedCueDuring @code{\quoteDuring} と同様に、@code{\cueDuring} は楽器の移調を考慮します。@c 合図音符は合図を受け取る楽器のピッチで作り出され、@c @@ -1445,10 +1444,10 @@ bassoonNotes = \relative c { これは、全く別の場所で登録された楽器から合図を取る場合に有用です。 @lilypond[verbatim,quote] -piccoloNotes = \relative c''' { +piccoloNotes = \relative { \clef "treble^8" R1 - c8 c c e g2 + c'''8 c c e g2 c4 g g2 } @@ -1472,9 +1471,7 @@ bassClarinetNotes = \relative c' { @cindex cue notes, removing (合図音符を削除する) @funindex \killCues -@funindex killCues @funindex \addInstrumentDefinition -@funindex addInstrumentDefinition @code{\killCues} コマンドは音楽表記から合図音符を削除します。@c これにより、同じ音楽表記を使って合図を持つ楽器パートと楽譜を作り出すことが@c @@ -1487,8 +1484,8 @@ bassClarinetNotes = \relative c' { @ref{Using tags} を参照してください。 @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { diff --git a/Documentation/ja/notation/text.itely b/Documentation/ja/notation/text.itely index dfcfd646c6..5af7134be3 100644 --- a/Documentation/ja/notation/text.itely +++ b/Documentation/ja/notation/text.itely @@ -1,17 +1,17 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*- @ignore - Translation of GIT committish: c1b0482f63f881bd3f67845e5f76a3e04675ef2a + Translation of GIT committish: 76ee88f5adfc7bcd8eff487543e3605e43a93d80 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.21" -@c Translators: Yoshiki Sawada +@c Translators: Masamichi Hosoda, Yoshiki Sawada @c Translation status: post-GDP @@ -70,8 +70,8 @@ そのような指示は、@ref{Direction and placement} で説明する構文を用いて、@c 手動で譜の上または下に配置することができます。 -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e a4-"scherz." f +@lilypond[quote,verbatim] +\relative { a'8^"pizz." g f e a4-"scherz." f } @end lilypond この構文は実際には短縮記法です。@c @@ -79,9 +79,10 @@ a8^"pizz." g f e a4-"scherz." f @code{\markup} ブロックを用いて明示的に、@c より複雑なテキスト フォーマットを音符に付け加えることができます。 -@lilypond[quote,verbatim,relative=2] -a8^\markup { \italic pizz. } g f e -a4_\markup { \tiny scherz. \bold molto } f +@lilypond[quote,verbatim] +\relative { + a'8^\markup { \italic pizz. } g f e + a4_\markup { \tiny scherz. \bold molto } f } @end lilypond デフォルトでは、テキスト指示は音符の間隔に影響を与えません。@c @@ -89,10 +90,12 @@ a4_\markup { \tiny scherz. \bold molto } f 以下の例では、最初のテキスト文字列は音符の間隔に影響を与えていませんが、@c 2 番目のテキスト文字列は影響を与えています。 -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e -\textLengthOn -a4_"scherzando" f +@lilypond[quote,verbatim] +\relative { + a'8^"pizz." g f e + \textLengthOn + a4_"scherzando" f +} @end lilypond テキスト スクリプトだけでなく、@c @@ -103,9 +106,7 @@ a4_"scherzando" f @rlearning{オブジェクトの配置} を参照してください。 @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff @predefined @code{\textLengthOn}, @@ -156,23 +157,30 @@ a4_"scherzando" f 以下の構文を用いることで、@c ある音符から他の音符までの範囲に作成することができます: -@lilypond[verbatim,quote,relative=2] -\override TextSpanner.bound-details.left.text = "rit." -b1\startTextSpan -e,\stopTextSpan +@lilypond[verbatim,quote] +\relative { + \override TextSpanner.bound-details.left.text = "rit." + b'1\startTextSpan + e,\stopTextSpan +} @end lilypond +@cindex text spanners, formatting (テキスト スパナ フォーマット) +@cindex formatting text spanners (テキスト スパナ フォーマット) + @noindent 譜刻される文字列はオブジェクト プロパティを通じてセットされます。@c デフォルトでは文字列はイタリック体で譜刻されます。@c しかしながら、@ref{テキストをフォーマットする} で記述されているように、@c @code{\markup} ブロックを用いることで他の書体にすることができます。 -@lilypond[quote,relative=2,verbatim] -\override TextSpanner.bound-details.left.text = - \markup { \upright "rit." } -b1\startTextSpan c -e,\stopTextSpan +@lilypond[quote,verbatim] +\relative { + \override TextSpanner.bound-details.left.text = + \markup { \upright "rit." } + b'1\startTextSpan c + e,\stopTextSpan +} @end lilypond テキスト文字列と同様に、@c @@ -180,17 +188,14 @@ e,\stopTextSpan 線スタイルの構文は @ref{Line styles} で記述されています。 @funindex \textSpannerUp -@funindex textSpannerUp @funindex \textSpannerDown -@funindex textSpannerDown @funindex \textSpannerNeutral -@funindex textSpannerNeutral @predefined @code{\textSpannerUp}, @code{\textSpannerDown}, -@code{\textSpannerNeutral}. +@code{\textSpannerNeutral} @endpredefined @knownissues @@ -224,7 +229,7 @@ LilyPond が処理できるテキスト スパナは 1 ボイスにつき、1 @cindex text marks (テキスト マーク) -@cindex marks, tex (テキスト マーク)t +@cindex marks, tex (テキスト マーク) @cindex text on bar line (小節線上のテキスト) @cindex coda on bar line (小節線上のコーダ) @cindex segno on bar line (小節線上のセーニョ) @@ -232,9 +237,7 @@ LilyPond が処理できるテキスト スパナは 1 ボイスにつき、1 @cindex bar lines, symbols on (小節線上のシンボル) @funindex \mark -@funindex mark @funindex \markup -@funindex markup @ref{リハーサル記号} で記述されている構文を用いて、@c さまざまなテキスト要素を楽譜に付け加えることができます: @@ -242,10 +245,12 @@ LilyPond が処理できるテキスト スパナは 1 ボイスにつき、1 @c \mark needs to be placed on a separate line (it's not @c attached to an object like \markup is). -vv -@lilypond[verbatim,quote,relative=2] -c4 -\mark "Allegro" -c c c +@lilypond[verbatim,quote] +\relative { + c''4 + \mark "Allegro" + c c c +} @end lilypond この構文を用いることで、@c @@ -254,11 +259,13 @@ c c c @code{\markup} ブロックを用いてより複雑なテキスト フォーマットを@c 付け加えることもできます: -@lilypond[quote,verbatim,relative=1] -1 -\mark \markup { \italic { colla parte } } -2 -1 +@lilypond[quote,verbatim] +\relative { + 1 + \mark \markup { \italic { colla parte } } + 2 + 1 +} @end lilypond @noindent @@ -266,10 +273,12 @@ c c c この構文で適切なシンボル名を指定することによって、@c 特殊な記号 -- コーダ、セーニョ、フェルマータなど -- を譜刻することが可能です: -@lilypond[quote,verbatim,relative=2] -2 -\mark \markup { \musicglyph #"scripts.ufermata" } -1 +@lilypond[quote,verbatim] +\relative { + 2 + \mark \markup { \musicglyph #"scripts.ufermata" } + 1 +} @end lilypond @noindent @@ -279,13 +288,22 @@ c c c 小節線の上に配置されたり、音符の間に配置されたりします。@c 改行位置で指定した場合、そのマークは次の行の先頭に譜刻されます。 -@lilypond[quote,verbatim,relative=2] -\mark "Allegro" -c1 c -\mark "assai" \break -c c +@lilypond[quote,verbatim,ragged-right] +\relative c'' { + \mark "Allegro" + c1 c + \mark "assai" \break + c c +} @end lilypond +@funindex \markLengthOn +@funindex \markLengthOff + +@predefined +@code{\markLengthOn}, +@code{\markLengthOff} +@endpredefined @snippets @@ -323,7 +341,6 @@ c c @cindex text, top-level (最上位レベルのテキスト) @funindex \markup -@funindex markup @code{\markup} ブロックはそれ自体で、@c すべての @code{\score} ブロックの外側に、@c @@ -362,9 +379,7 @@ c c @funindex \markup -@funindex markup @funindex \markuplist -@funindex markuplist @predefined @code{\markup}, @@ -416,7 +431,6 @@ c c @cindex typeset text (テキストの譜刻) @funindex \markup -@funindex markup @code{\markup} ブロックは @qq{マークアップ モード} と呼ばれる@c 拡張可能な構文でテキストを譜刻するために用いられます。 @@ -436,14 +450,16 @@ c c マークアップ コマンドを保持することができます。@c そのようなコマンドは直後の表記にのみ影響を与えます。 -@lilypond[quote,verbatim,relative=2] -a1-\markup intenso -a2^\markup { poco \italic più forte } -c e1 -d2_\markup { \italic "string. assai" } -e -b1^\markup { \bold { molto \italic agitato } } -c +@lilypond[quote,verbatim] +\relative { + a'1-\markup intenso + a2^\markup { poco \italic più forte } + c e1 + d2_\markup { \italic "string. assai" } + e + b1^\markup { \bold { molto \italic agitato } } + c +} @end lilypond @cindex special characters in markup mode (マークアップ モードでの特殊文字) @@ -464,10 +480,12 @@ c ダブル クォーテーション自体は、@c それ自体の前にバックスラッシュを置くことによって譜刻されます。 -@lilypond[quote,verbatim,relative=2] -a1^"\italic markup..." -a_\markup { \italic "... prints \"italic\" letters!" } -a a +@lilypond[quote,verbatim] +\relative { + a'1^"\italic markup..." + a_\markup { \italic "... prints \"italic\" letters!" } + a a +} @end lilypond 表記をばらばらなものとして扱うには、@c @@ -480,11 +498,13 @@ a a 以下の例では、@c 2 番目の @code{\markup} 表記は 1 番目の表記と同じように扱われています: -@lilypond[quote,verbatim,relative=2] -c1^\markup { \center-column { a bbb c } } -c1^\markup { \center-column { a { bbb c } } } -c1^\markup { \center-column { a \line { bbb c } } } -c1^\markup { \center-column { a "bbb c" } } +@lilypond[quote,verbatim] +\relative c'' { + c1^\markup { \center-column { a bbb c } } + c1^\markup { \center-column { a { bbb c } } } + c1^\markup { \center-column { a \line { bbb c } } } + c1^\markup { \center-column { a "bbb c" } } +} @end lilypond マークアップを変数に格納することができます。@c @@ -526,22 +546,21 @@ allegro = \markup { \bold \large Allegro } @cindex switching fonts (フォントを切り換える) @funindex \italic -@funindex italic @funindex \bold -@funindex bold @funindex \underline -@funindex underline マークアップ モードでは、基本的なフォント切り替えがサポートされています: -@lilypond[quote,verbatim,relative=2] -d1^\markup { - \bold { Più mosso } - \italic { non troppo \underline Vivo } +@lilypond[quote,verbatim] +\relative { + d''1^\markup { + \bold { Più mosso } + \italic { non troppo \underline Vivo } + } + r2 r4 r8 + d,_\markup { \italic quasi \smallCaps Tromba } + f1 d2 r } -r2 r4 r8 -d,_\markup { \italic quasi \smallCaps Tromba } -f1 d2 r @end lilypond @cindex font size (フォント サイズ) @@ -549,59 +568,69 @@ f1 d2 r @funindex \abs-fontsize @funindex \fontsize -@funindex fontsize @funindex \smaller -@funindex smaller @funindex \larger -@funindex larger @funindex \magnify -@funindex magnify フォント サイズをいくつかの方法でグローバル譜サイズとの相対値で変更することができます。 フォント サイズをあらかじめ定義されているサイズに設定することができます: -@lilypond[quote,verbatim,relative=2] -b1_\markup { \huge Sinfonia } -b1^\markup { \teeny da } -b1-\markup { \normalsize camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \huge Sinfonia } + b1^\markup { \teeny da } + b1-\markup { \normalsize camera } +} @end lilypond フォント サイズを前の値との相対関係で設定することができます: -@lilypond[quote,verbatim,relative=2] -b1_\markup { \larger Sinfonia } -b1^\markup { \smaller da } -b1-\markup { \magnify #0.6 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \larger Sinfonia } + b1^\markup { \smaller da } + b1-\markup { \magnify #0.6 camera } +} @end lilypond フォント サイズをグローバル譜サイズによって設定されている値で拡大あるいは縮小させる@c ことができます: -@lilypond[quote,verbatim,relative=2] -b1_\markup { \fontsize #-2 Sinfonia } -b1^\markup { \fontsize #1 da } -b1-\markup { \fontsize #3 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \fontsize #-2 Sinfonia } + b1^\markup { \fontsize #1 da } + b1-\markup { \fontsize #3 camera } +} @end lilypond さらに、フォント サイズをグローバル譜サイズとは無関係に、固定ポイント サイズに設定する@c ことができます: -@lilypond[quote,verbatim,relative=2] -b1_\markup { \abs-fontsize #20 Sinfonia } -b1^\markup { \abs-fontsize #8 da } -b1-\markup { \abs-fontsize #14 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \abs-fontsize #20 Sinfonia } + b1^\markup { \abs-fontsize #8 da } + b1-\markup { \abs-fontsize #14 camera } +} +@end lilypond + +テキストにスペースが含まれる場合、@c +各スペースのサイズが他の文字のサイズに適したものになるので、@c +引用符の内側にすべて置くのがベストです。 + +@lilypond[quote,verbatim] +\markup \fontsize #6 \bold { Sinfonia da camera } +\markup \fontsize #6 \bold { "Sinfonia da camera" } @end lilypond @cindex subscript (下付き文字) @cindex superscript (上付き文字) @funindex \super -@funindex super @funindex \sub -@funindex sub @funindex \normal-size-super -@funindex normal-size-super テキストを下付き文字あるいは上付き文字として譜刻することができます。@c デフォルトでは、それらは小さなサイズで譜刻されますが、@c @@ -642,7 +671,7 @@ b1-\markup { \abs-fontsize #14 camera } すべての文字を提供しないものもあります。 @c \concat is actually documented in Align (it is not -@c a font-switching command). But we need it here. -vv +@c a font-switching command). But we need it here. -vv フォント切り替えやフォーマット コマンドの中には、@c 単語の中で使用されると@c @@ -671,21 +700,13 @@ b1-\markup { \abs-fontsize #14 camera } カスタム フォント セットを定義することも可能です。 @funindex \teeny -@funindex teeny @funindex \tiny -@funindex tiny @funindex \small -@funindex small @funindex \normalsize -@funindex normalsize @funindex \large -@funindex large @funindex \huge -@funindex huge @funindex \smaller -@funindex smaller @funindex \larger -@funindex larger @predefined @code{\teeny}, @@ -743,40 +764,40 @@ b1-\markup { \abs-fontsize #14 camera } @cindex horizontal text alignment (テキストを水平方向に揃える) @funindex \left-align -@funindex left-align @funindex \center-align -@funindex center-align @funindex \right-align -@funindex right-align マークアップ オブジェクトの揃え方はいくつかあります。@c デフォルトでは、テキスト指示はそのテキストの左端で揃えられます: 以下の例では、@c 最初のマークアップと 2 番目のマークアップの揃えられ方はまったく同じです。 -@lilypond[quote,verbatim,relative=2] -d1-\markup { poco } -f -d-\markup { \left-align poco } -f -d-\markup { \center-align { poco } } -f -d-\markup { \right-align poco } +@lilypond[quote,verbatim] +\relative { + d''1-\markup { poco } + f + d-\markup { \left-align poco } + f + d-\markup { \center-align { poco } } + f + d-\markup { \right-align poco } +} @end lilypond @funindex \halign -@funindex halign 水平方向の揃え方は、数値を使って、微調整することができます: -@lilypond[quote,verbatim,relative=2] -a1-\markup { \halign #-1 poco } -e' -a,-\markup { \halign #0 poco } -e' -a,-\markup { \halign #0.5 poco } -e' -a,-\markup { \halign #2 poco } +@lilypond[quote,verbatim] +\relative { + a'1-\markup { \halign #-1 poco } + e' + a,-\markup { \halign #0 poco } + e' + a,-\markup { \halign #0.5 poco } + e' + a,-\markup { \halign #2 poco } +} @end lilypond @noindent @@ -789,11 +810,8 @@ a,-\markup { \halign #2 poco } @cindex vertical text alignment (テキストを垂直方向に揃える) @funindex \raise -@funindex raise @funindex \lower -@funindex lower @funindex \null -@funindex null @c QUERY Should the function of ``\null'' be clarified? rp @@ -807,51 +825,52 @@ a,-\markup { \halign #2 poco } 以下の例では 2 つのケースを示しています。@c 最後のマークアップはアンカ ポイントを持たず、それゆえ移動されません。 -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \raise #2 { Scène 1 } -} -a' -g_\markup { - \null - \lower #4 \bold { Très modéré } -} -a -d,^\markup { - \raise #4 \italic { Une forêt. } +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \raise #2 { Scène 1 } + } + a' + g_\markup { + \null + \lower #4 \bold { Très modéré } + } + a + d,^\markup { + \raise #4 \italic { Une forêt. } + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @funindex \general-align -@funindex general-align @funindex \translate -@funindex translate @funindex \translate-scaled -@funindex translate-scaled コマンドの中にはマークアップ モードの中にあるテキスト オブジェクトの@c 水平方向と垂直方向の両方の揃え方に影響を与えることができるものもあります。@c そのようなコマンドで移動させるオブジェクトの前には@c アンカ ポイントを置く必要があります: -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \translate #'(-1 . 2) "Scène 1" -} -a' -g_\markup { - \null - \general-align #Y #3.2 \bold "Très modéré" -} -a -d,^\markup { - \null - \translate-scaled #'(-1 . 2) \teeny "Une forêt." +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \translate #'(-1 . 2) "Scène 1" + } + a' + g_\markup { + \null + \general-align #Y #3.2 \bold "Très modéré" + } + a + d,^\markup { + \null + \translate-scaled #'(-1 . 2) \teeny "Une forêt." + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @cindex multi-line markup (複数行にわたるマークアップ) @@ -862,9 +881,7 @@ a'4 a g2 a @cindex columns, text (縦に積み重ねたテキスト) @funindex \column -@funindex column @funindex \center-column -@funindex center-column マークアップ オブジェクトに何行かのテキストが含まれる場合もあります。@c 以下の例では、それぞれの要素あるいは表記はそれ自体の行に配置され、@c @@ -888,11 +905,9 @@ a'4 a g2 a @cindex centering text on the page (テキストをページの中央に揃える) @cindex text, centering on the page (テキストをページの中央に揃える) -@cindex centering markup on the page (マークアップをページの中央に揃える) @cindex markup, centering on the page (マークアップをページの中央に揃える) @funindex \fill-line -@funindex fill-line 同様に、要素あるいは表記のリストの広がりが水平の行幅いっぱいを占める@c ことがあります (要素が 1 つだけの場合、その要素はページの中央に揃えられます)。@c @@ -924,9 +939,7 @@ a'4 a g2 a @cindex markup text, justified (両端揃えのマークアップ テキスト) @funindex \wordwrap -@funindex wordwrap @funindex \justify -@funindex justify さらに、長いテキスト指示を自動的に行幅に合わせて折り返すことができます。@c そのようなテキスト指示は、以下の例で示すように、左揃えされるか両端揃えされます。 @@ -938,7 +951,7 @@ a'4 a g2 a \line \bold { Acto I } \wordwrap \italic { (La escena representa el corral de una casa de - gitanos en el Albaicín de Granada. Al fondo una + gitanos en el Albaicín de Granada. Al fondo una puerta por la que se ve el negro interior de una Fragua, iluminado por los rojos resplandores del fuego.) @@ -950,7 +963,7 @@ a'4 a g2 a \justify \italic { (Calle de Granada. Fachada de la casa de Carmela y su hermano Manuel con grandes ventanas abiertas - a través de las que se ve el patio + a través de las que se ve el patio donde se celebra una alegre fiesta) } } @@ -1002,15 +1015,10 @@ a'4 a g2 a @cindex markup text, framing (マークアップ テキストにフレームを付ける) @funindex \box -@funindex box @funindex \circle -@funindex circle @funindex \rounded-box -@funindex rounded-box @funindex \bracket -@funindex bracket @funindex \hbracket -@funindex hbracket 以下の例で示すように、@c マークアップ コマンドの中にはテキスト要素を@c @@ -1038,13 +1046,9 @@ a'4 a g2 a @cindex markup text padding (マークアップ テキスト パディング) @funindex \pad-markup -@funindex pad-markup @funindex \pad-x -@funindex pad-x @funindex \pad-to-box -@funindex pad-to-box @funindex \pad-around -@funindex pad-around コマンドの中にはテキストの周りのパディングを増やすことを必要とするものも@c あります。@c @@ -1079,17 +1083,11 @@ Flute quartet keeps very uneven time." @cindex notation, graphic (グラフィック記譜法) @funindex \combine -@funindex combine @funindex \draw-circle -@funindex draw-circle @funindex \filled-box -@funindex filled-box @funindex \triangle -@funindex triangle @funindex \draw-line -@funindex draw-line @funindex \arrow-head -@funindex arrow-head テキストを持たないグラフィック要素やシンボルを譜刻することもできます。@c 他のマークアップ表記と同様に、@c @@ -1117,9 +1115,7 @@ Flute quartet keeps very uneven time." @cindex postscript @funindex \epsfile -@funindex epsfile @funindex \postscript -@funindex postscript 高度なグラフィック機能として、@c 外部画像ファイルを Encapsulated PostScript フォーマット (@emph{eps}) @@ -1129,8 +1125,8 @@ Flute quartet keeps very uneven time." このような機能を使う場合、以下で示すように、@c 描画サイズを明示的に指定することを推奨します: -@lilypond[quote,verbatim,relative=1] -c1^\markup { +@lilypond[quote,verbatim,fragment] +c'1^\markup { \combine \epsfile #X #10 #"./context-example.eps" \with-dimensions #'(0 . 6) #'(0 . 10) @@ -1146,16 +1142,17 @@ c1^\markup { closepath stroke" } -c +c' @end lilypond @ref{Graphic} にグラフィック特有のコマンドの徹底したリストがあります。 @seealso 記譜法リファレンス: -@ref{Graphic}, +@ref{Align}, +Dimensions, @ref{編集者の注釈}, -@ref{Align} +@ref{Graphic} インストールされているファイル: @file{scm/define-markup-commands.scm}, @@ -1181,37 +1178,39 @@ c 音符と臨時記号はマークアップ コマンドを用いて入力することができます: -@lilypond[quote,verbatim,relative=2] -a2 a^\markup { +@lilypond[quote,verbatim,fragment] +a'2 a'^\markup { \note #"4" #1 = \note-by-number #1 #1 #1.5 } -b1_\markup { +b'1_\markup { \natural \semiflat \flat \sesquiflat \doubleflat } \glissando -a1_\markup { +a'1_\markup { \natural \semisharp \sharp \sesquisharp \doublesharp } -\glissando b +\glissando b' @end lilypond 他の記譜オブジェクトもマークアップ モードの中で譜刻することができます: -@lilypond[quote,verbatim,relative=1] -g1 bes -ees\finger \markup \tied-lyric #"4~1" -fis_\markup { \dynamic rf } -bes^\markup { - \beam #8 #0.1 #0.5 -} -cis -d-\markup { - \markalphabet #8 - \markletter #8 +@lilypond[quote,verbatim] +\relative { + g1 bes + ees\finger \markup \tied-lyric #"4~1" + fis_\markup { \dynamic rf } + bes^\markup { + \beam #8 #0.1 #0.5 + } + cis + d-\markup { + \markalphabet #8 + \markletter #8 + } } @end lilypond @@ -1221,36 +1220,39 @@ d-\markup { @ref{The Feta font} に、@c 音楽シンボルと音楽シンボル名の徹底したリストがあります。 -@lilypond[quote,verbatim,relative=2] -c2 -c'^\markup { \musicglyph #"eight" } -c,4 -c,8._\markup { \musicglyph #"clefs.G_change" } -c16 -c2^\markup { \musicglyph #"timesig.neomensural94" } +@lilypond[quote,verbatim] +\relative { + c''2 + c'^\markup { \musicglyph #"eight" } + c,4 + c,8._\markup { \musicglyph #"clefs.G_change" } + c16 + c2^\markup { \musicglyph #"timesig.neomensural94" } +} @end lilypond -@noindent テキストではない図柄を譜刻するもう 1 つの方法が @ref{フォントの説明} で記述されています。@c この方法はさまざまなサイズの波括弧を譜刻する場合に有用です。 さらに、マークアップ モードは特定の楽器のためのダイアグラムをサポートします: -@lilypond[quote,verbatim,relative=2] -c1^\markup { - \fret-diagram-terse #"x;x;o;2;3;2;" -} -c^\markup { - \harp-pedal #"^-v|--ov^" -} -c -c^\markup { - \combine - \musicglyph #"accordion.discant" +@lilypond[quote,verbatim] +\relative { + c''1^\markup { + \fret-diagram-terse #"x;x;o;2;3;2;" + } + c^\markup { + \harp-pedal #"^-v|--ov^" + } + c + c^\markup { \combine - \raise #0.5 \musicglyph #"accordion.dot" - \raise #1.5 \musicglyph #"accordion.dot" + \musicglyph #"accordion.discant" + \combine + \raise #0.5 \musicglyph #"accordion.dot" + \raise #1.5 \musicglyph #"accordion.dot" + } } @end lilypond @@ -1268,15 +1270,17 @@ c^\markup { ネストされる @code{\score} ブロックには @code{\layout} ブロックを含める必要があります: -@lilypond[quote,verbatim,relative=1] -c4 d^\markup { - \score { - \relative c' { c4 d e f } - \layout { } +@lilypond[quote,verbatim] +\relative { + c'4 d^\markup { + \score { + \relative { c'4 d e f } + \layout { } + } } + e f | + c d e f } -e f | -c d e f @end lilypond @ref{Music} に、音楽記譜法関連のコマンドの徹底したリストがあります。 @@ -1309,11 +1313,8 @@ c d e f @cindex text spread over multiple pages (複数ページに広がるテキスト) @funindex \markuplist -@funindex markuplist @funindex \justified-lines -@funindex justified-lines @funindex \wordwrap-lines -@funindex wordwrap-lines 標準のマークアップ オブジェクトは分割することができません。@c しかしながら、 @@ -1365,7 +1366,6 @@ c d e f @rinternals{TextScript} @funindex \markuplist -@funindex markuplist @predefined @code{\markuplist} @@ -1406,8 +1406,8 @@ FontConfig はシステムで利用可能なフォントを検出するために さまざまな LilyPond @code{feta} 非テキスト フォントを@c マークアップ モードの中で直接使用することが可能になります: -@lilypond[quote,verbatim,relative=2] -a1^\markup { +@lilypond[quote,verbatim,fragment] +a'1^\markup { \vcenter { \override #'(font-encoding . fetaBraces) \lookup #"brace120" @@ -1435,25 +1435,31 @@ a1^\markup { -- @ref{Rotating objects} を参照してください。 3 ファミリのテキスト フォントが利用可能になっています: -@emph{roman} (serif) フォント --- これはデフォルトでは New Century Schoolbook です -- -と、@emph{sans} フォントと単一幅の @emph{typewriter} フォント --- これら 2 つのファミリは Pango のインストール時に決定されます -- -です。 +@itemize +@item +@emph{roman} (serif) フォントの@c +デフォルトは LilyPond Serif (TeX Gyre Schola のエイリアス)です。 +@item +@emph{sans} フォントの@c +デフォルトは LilyPond Sans Serif (TeX Gyre Heros のエイリアス)です。 +@item +@emph{typewriter} (monospaced) フォントの@c +デフォルトは LilyPond Monospace (TeX Gyre Cursor のエイリアス)です。 +@end itemize それぞれのファミリには異なる形状とセットのフォントが保持されています。@c 以下の例は、ファミリ、形状、セットそれにサイズを変更する様子を示しています。@c デフォルト サイズから変更する場合、@c @code{font-size} に提供する値が必要となります。 -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Score.RehearsalMark.font-family = #'typewriter \mark \markup "Ouverture" \override Voice.TextScript.font-shape = #'italic \override Voice.TextScript.font-series = #'bold -d2.^\markup "Allegro" +d''2.^\markup "Allegro" \override Voice.TextScript.font-size = #-3 -c4^smaller +c''4^smaller @end lilypond @noindent @@ -1507,14 +1513,14 @@ c4^smaller FontConfig に認識されている任意のフォントを@c 楽譜の中で使用することができます: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.TimeSignature.font-name = #"Bitstream Charter" \override Staff.TimeSignature.font-size = #2 \time 3/4 -a1_\markup { - \override #'(font-name . "Vera Bold") - { Vera Bold } +a'1_\markup { + \override #'(font-name . "Bitstream Vera Sans,sans-serif, Oblique Bold") + { Vera Oblique Bold } } @end lilypond @@ -1523,9 +1529,16 @@ a1_\markup { @cindex listing available fonts (利用可能なフォントをリストアップする) @cindex available fonts, listing (利用可能なフォントをリストアップする) +@var{font-name} はカンマ区切りの @q{フォント} のリストと、@c +スペース区切りの @q{スタイル} のリストを記述できます。@c +リスト中の @q{フォント} がインストールされていて、@c +要求されたグリフを含んでいれば、それが使われます。@c +そうでないなら代わりにリストの @emph{次} のフォントが使われます。 + @funindex show-available-fonts -以下のコマンドはオペレーティング システムで利用可能な@c +lilypond を以下のオプションを付けて実行すると@c +オペレーティング システムで利用可能な@c すべてのフォントのリストを表示します: @example @@ -1554,6 +1567,9 @@ lilypond -dshow-available-fonts x として使用されるデフォルト フォントを変更することができます。@c この例ではグローバル譜サイズにセットされた値で自動的にフォントのサイズを@c 伸縮しています。@c +@ref{個々に登録するフォント} のように、@c +カンマ区切りの @q{フォント} のリストを記述できます。@c +しかし、フォント @q{スタイル} は記述できません。@c フォントについての説明は、@ref{フォントの説明} を参照してください。 @cindex font families, setting (フォント ファミリを設定する) @@ -1565,7 +1581,7 @@ lilypond -dshow-available-fonts x \paper { #(define fonts (make-pango-font-tree "Times New Roman" - "Nimbus Sans" + "Nimbus Sans,Nimbus Sans L" "Luxi Mono" (/ staff-height pt 20))) } diff --git a/Documentation/ja/notation/unfretted-strings.itely b/Documentation/ja/notation/unfretted-strings.itely index 2525662768..f9caf1aeee 100644 --- a/Documentation/ja/notation/unfretted-strings.itely +++ b/Documentation/ja/notation/unfretted-strings.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.18.0" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -111,8 +111,8 @@ orchestral strings. -- @code{\upbow} と @code{\downbow} -- は、以下のようにスラーと一緒に用います: -@lilypond[verbatim,quote,relative=2] -c4(\downbow d) e(\upbow f) +@lilypond[verbatim,quote] +\relative { c''4(\downbow d) e(\upbow f) } @end lilypond @noindent @@ -156,20 +156,22 @@ a2^\markup { \small "sul A" } 一般的に、ダイアモンド形の符頭は、@c 符頭がダイアモンド形ではない場合に押さえる弦に触れることを意味します。 -@lilypond[verbatim,quote,relative=2] -d4 e4. -\harmonicsOn -d8 e e -d4 e4. -\harmonicsOff -d8 e e +@lilypond[verbatim,quote] +\relative d'' { + d4 e4. + \harmonicsOn + d8 e e + d4 e4. + \harmonicsOff + d8 e e +} @end lilypond 一方、鳴らすピッチに通常の符頭を記譜すると共に、@c 小さな丸を付けることでハーモニクスとして演奏することを示す方法もあります: -@lilypond[verbatim,quote,relative=2] -d2^\flageolet d_\flageolet +@lilypond[verbatim,quote,fragment] +d''2^\flageolet d''_\flageolet @end lilypond より小さな丸を描くこともできます。@c @@ -190,10 +192,12 @@ d2^\flageolet d_\flageolet 符点を付ける必要がある場合は、@c コンテキスト プロパティ @code{harmonicDots} を設定します。 -@lilypond[verbatim,quote,relative=1] -2. 4 -\set harmonicDots = ##t -2. 4 +@lilypond[verbatim,quote] +\relative e' { + 2. 4 + \set harmonicDots = ##t + 2. 4 +} @end lilypond @warning{@code{@bs{}harmonic} は、単一の音符しかない場合であっても、@c @@ -224,9 +228,11 @@ d2^\flageolet d_\flageolet 故意に弦を上 (フィンガーボードと垂直) に引いて、@c 弦をフィンガーボードにぶつけます。 -@lilypond[verbatim,quote,relative=1] -c4\snappizzicato -4\snappizzicato -4^\snappizzicato -4_\snappizzicato +@lilypond[verbatim,quote] +\relative { + c'4\snappizzicato + 4\snappizzicato + 4^\snappizzicato + 4_\snappizzicato +} @end lilypond diff --git a/Documentation/ja/notation/vocal.itely b/Documentation/ja/notation/vocal.itely index 0878902eb9..5d7677b663 100644 --- a/Documentation/ja/notation/vocal.itely +++ b/Documentation/ja/notation/vocal.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -165,7 +165,7 @@ さらなる情報は、@ref{Special characters} を参照してください。 @lilypond[quote,verbatim] -\relative c'' { d8 c16 a bes8 f e' d c4 } +\relative { d''8 c16 a bes8 f e' d c4 } \addlyrics { „Schad’ um das schö -- ne grü -- ne Band, } @end lilypond @@ -176,7 +176,7 @@ 例を挙げます: @lilypond[quote,verbatim] -\relative c' { \time 3/4 e4 e4. e8 d4 e d c2. } +\relative { \time 3/4 e'4 e4. e8 d4 e d c2. } \addlyrics { "\"I" am so lone -- "ly,\"" said she } @end lilypond @@ -254,13 +254,13 @@ << \new Staff << \time 2/4 - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \voiceOne - c4 b8. a16 g4. r8 a4 ( b ) c2 + c''4 b8. a16 g4. r8 a4 ( b ) c2 } - \new Voice = "two" \relative c' { + \new Voice = "two" \relative { \voiceTwo - s2 s4. f8 e4 d c2 + s2 s4. f'8 e4 d c2 } >> @@ -292,9 +292,9 @@ @c KEEP LY @lilypond[quote,ragged-right,verbatim] << - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \time 2/4 - c4 b8. a16 g4. f8 e4 d c2 + c''4 b8. a16 g4. f8 e4 d c2 } % 前で指定された演奏時間 2 を用います @@ -435,7 +435,7 @@ @lilypond[verbatim,quote] { \time 3/4 - \relative c' { c2 e4 g2. } + \relative { c'2 e4 g2. } \addlyrics { play the game } } @end lilypond @@ -447,7 +447,7 @@ @lilypond[ragged-right,verbatim,quote] { \time 3/4 - \relative c' { c2 e4 g2. } + \relative { c'2 e4 g2. } \addlyrics { play the game } \addlyrics { speel het spel } \addlyrics { joue le jeu } @@ -480,13 +480,13 @@ << \new Staff << \time 2/4 - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \voiceOne - c4 b8. a16 g4. r8 a4 ( b ) c2 + c''4 b8. a16 g4. r8 a4 ( b ) c2 } - \new Voice = "two" \relative c' { + \new Voice = "two" \relative { \voiceTwo - s2 s4. f8 e8 d4. c2 + s2 s4. f'8 e8 d4. c2 } >> % 最初は "one" の音符に揃えます @@ -524,11 +524,11 @@ ここで、2 つの例を挙げます: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - c2 e4 g2 f + c'2 e4 g2 f } \new Lyrics \lyricmode { play1 the4 game4 @@ -540,8 +540,8 @@ @lilypond[quote,verbatim,ragged-right] << \new Staff { - \relative c'' { - c2 c2 + \relative { + c''2 c2 d1 } } @@ -551,8 +551,8 @@ } } \new Staff { - \relative c' { - c8 c c c c c c c + \relative { + c'8 c c c c c c c c8 c c c c c c c } } @@ -607,8 +607,8 @@ @lilypond[quote,ragged-right,verbatim] { - \relative c'' { \autoBeamOff - r8 b c fis, fis c' b e, } + \relative { \autoBeamOff + r8 b' c fis, fis c' b e, } \addlyrics { Che_in ques -- ta_e_in quel -- l'al -- tr'on -- da } \addlyrics { "Che in" ques -- "ta e in" quel -- l'al -- tr'on -- da } \addlyrics { Che~in ques -- ta~e~in quel -- l'al -- tr'on -- da } @@ -650,13 +650,13 @@ @item タイで結ばれた音符には、自動的にメリスマが作成されます: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g2 ~ | - g4 e2 ~ | - e8 + f''4 g2 ~ | + 4 e2 ~ | + 8 } \new Lyrics \lyricsto "melody" { Ky -- ri -- e __ @@ -669,11 +669,11 @@ 譜から自動的にメリスマを作成することができます。@c これが歌詞を入力する通常の方法です: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 ( f e f ) + f''4 g8 ( f e f ) e8 ( d e2 ) } \new Lyrics \lyricsto "melody" { @@ -689,12 +689,12 @@ 自動連桁を off にして、手動で連桁を付けられた音符はメリスマと見なされます。@c @ref{Setting automatic beam behavior} を参照してください。 -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \autoBeamOff - f4 g8[ f e f] + f''4 g8[ f e f] e2. } \new Lyrics \lyricsto "melody" { @@ -710,11 +710,11 @@ スラーが付いていない音符でも、@c @code{\melisma} と @code{\melismaEnd} で囲まれていればメリスマとして扱われます。 -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 + f''4 g8 \melisma f e f \melismaEnd @@ -731,11 +731,11 @@ 歌詞の中にアンダースコア @code{_} を記述することで、@c メリスマを定義することができます。 -@lilypond[verbatim, quote, relative=2] +@lilypond[verbatim, quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 f e f + f''4 g8 f e f e8 d e2 } \new Lyrics \lyricsto "melody" { @@ -749,13 +749,13 @@ 旋律の中のタイ、スラー、それに手動連桁をメリスマにしないことも可能です。@c メリスマにしないためには、@code{melismaBusyProperties} を設定します: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \set melismaBusyProperties = #'() - c4 d ( e ) - g8 [ f ] f4 ~ f + c'4 d ( e ) + g8 [ f ] f4 ~ 4 } \new Lyrics \lyricsto "melody" { Ky -- ri -- e e -- le -- i -- son @@ -777,13 +777,13 @@ メリスマを使う必要がある場合、@c メリスマに含める各音符に対して歌詞の中にアンダースコアを記述します: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \set melismaBusyProperties = #'() - c4 d ( e ) - g8 [ f ] ~ f4 ~ f + c'4 d ( e ) + g8 [ f ] ~ 4 ~ f } \new Lyrics \lyricsto "melody" { Ky -- ri -- _ e __ _ _ _ @@ -891,8 +891,8 @@ 歌詞は歌詞モードで入力する必要があります: @lilypond[quote,verbatim] -musicOne = \relative c'' { - c4 b8. a16 g4. f8 e4 d c2 +musicOne = \relative { + c''4 b8. a16 g4. f8 e4 d c2 } verseOne = \lyricmode { Joy to the world, the Lord is come. @@ -922,8 +922,8 @@ verseOne = \lyricmode { 例を挙げます: @lilypond[quote,verbatim] -sopranoMusic = \relative c'' { c4 c c c } -contraltoMusic = \relative c'' { a4 a a a } +sopranoMusic = \relative { c''4 c c c } +contraltoMusic = \relative { a'4 a a a } sopranoWords = \lyricmode { Sop -- ra -- no words } contraltoWords = \lyricmode { Con -- tral -- to words } @@ -981,7 +981,7 @@ contraltoWords = \lyricmode { Con -- tral -- to words } << \new Staff { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics { @@ -1002,7 +1002,7 @@ contraltoWords = \lyricmode { Con -- tral -- to words } << \new Staff = "staff" { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics \with { alignAboveContext = "staff" } { @@ -1031,7 +1031,7 @@ contraltoWords = \lyricmode { Con -- tral -- to words } } \new Staff { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \context Lyrics = "lyrics" { @@ -1053,7 +1053,7 @@ contraltoWords = \lyricmode { Con -- tral -- to words } \new ChoirStaff << \new Staff { \new Voice = "sopranos" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics = "sopranos" @@ -1064,7 +1064,7 @@ contraltoWords = \lyricmode { Con -- tral -- to words } } \new Staff { \new Voice = "contraltos" { - \relative c'' { a4 a a a } + \relative { a'4 a a a } } } \context Lyrics = "sopranos" { @@ -1108,8 +1108,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } 歌詞の間隔を広げるには @code{LyricSpace} の @code{minimum-distance} プロパティを設定します。 -@lilypond[relative=1,verbatim,quote,ragged-right] -{ +@lilypond[verbatim,quote,ragged-right] +\relative c' { c c c c \override Lyrics.LyricSpace.minimum-distance = #1.0 c c c c @@ -1126,8 +1126,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } @lilypond[verbatim,quote,ragged-right] \score { - \relative c' { - c c c c + \relative { + c' c c c c c c c } \addlyrics { @@ -1193,8 +1193,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1217,8 +1217,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1242,8 +1242,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat unfold 2 { b4 b b b } } } @@ -1268,8 +1268,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1295,8 +1295,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } << \new Staff { \new Voice = "singleVoice" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 3 { b4 b b b } c4 c c c } @@ -1334,8 +1334,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 3 { b4 b b b } c4 c c c } @@ -1359,8 +1359,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } The end sec -- tion. } \new Voice = "harmony" { - \relative c' { - f4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 + \relative { + f'4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 } } >> @@ -1386,8 +1386,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b } \alternative { { b b } { b c } } } @@ -1430,8 +1430,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b } + \relative { + \repeat volta 2 { b'4 b } \alternative { { b b } { b c } } c4 c } @@ -1477,9 +1477,9 @@ contraltoWords = \lyricmode { Con -- tral -- to words } \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { + \relative { \set melismaBusyProperties = #'() - \repeat volta 2 { b4 b ~} + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } \unset melismaBusyProperties c4 c @@ -1515,8 +1515,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b ~} + \relative { + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } c4 c } @@ -1549,8 +1549,8 @@ contraltoWords = \lyricmode { Con -- tral -- to words } \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b ~} + \relative { + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } c4 c } @@ -1622,11 +1622,11 @@ contraltoWords = \lyricmode { Con -- tral -- to words } \score { << \new Voice = "melody" { - \relative c' { + \relative { << { \voiceOne - e4 e8 e + e'4 e8 e } \new Voice = "splitpart" { \voiceTwo @@ -1672,9 +1672,9 @@ contraltoWords = \lyricmode { Con -- tral -- to words } @code{stanza} を設定することにより、歌詞の節番号を追加することができます。@c 例を挙げます: -@lilypond[quote,ragged-right,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. +@lilypond[quote,ragged-right,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. } \addlyrics { \set stanza = #"1. " Hi, my name is Bert. @@ -1760,9 +1760,9 @@ text = { @code{vocalName} を設定することにより、歌手名を作成します。@c @code{shortVocalName} として短縮名を入力することができます。 -@lilypond[ragged-right,quote,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. +@lilypond[ragged-right,quote,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. } \addlyrics { \set vocalName = #"Bert " Hi, my name is Bert. @@ -1789,9 +1789,9 @@ text = { @lilypond[verbatim,ragged-right,quote] << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 \slurDotted f8.[( g16]) a4 @@ -1826,8 +1826,8 @@ text = { @lilypond[verbatim,ragged-right,quote] << - \new Voice = melody \relative c' { - f4 \appoggiatura a32 b4 + \new Voice = melody \relative { + f'4 \appoggiatura a32 b4 \grace { f16 a16 } b2 \afterGrace b2 { f16[ a16] } \appoggiatura a32 b4 @@ -1879,9 +1879,9 @@ text = { @c KEEP LY @lilypond[verbatim,quote] << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 << \new Voice = "alternative" { \voiceOne @@ -1954,8 +1954,8 @@ sau -- rus Rex @code{\markup} で 2 つの方法で改行していることに注意してください。 @lilypond[ragged-right,verbatim,quote] -melody = \relative c' { -e d c d | e e e e | +melody = \relative { +e' d c d | e e e e | d d e d | c1 | } @@ -1997,8 +1997,8 @@ its fleece was white as snow. @c KEEP LY @lilypond[ragged-right,quote,verbatim] -melody = \relative c' { - c4 c c c | d d d d +melody = \relative { + c'4 c c c | d d d d } text = \lyricmode { @@ -2296,12 +2296,12 @@ SATB (S: ソプラノ、A: アルト、T: テナー、B: バス) ボーカル譜 \new ChoirStaff << \new Staff { \new Voice { - \relative c'' { g4\f g g g } + \relative { g'4\f g g g } } } \new Staff { \new Voice { - \relative c' { d4 d d\p d } + \relative { d'4 d d\p d } } } >> @@ -2477,9 +2477,9 @@ LilyPond で台詞を譜刻することはできますが、台詞には音楽 \new Staff { \set Staff.vocalName = \markup \smallCaps Kaspar \set Staff.shortVocalName = \markup \smallCaps Kas. - \relative c' { + \relative { \clef "G_8" - c4 c c c + c'4 c c c \break c4 c c c } @@ -2488,7 +2488,7 @@ LilyPond で台詞を譜刻することはできますが、台詞には音楽 \set Staff.vocalName = \markup \smallCaps Melchior \set Staff.shortVocalName = \markup \smallCaps Mel \clef "bass" - \relative c' { + \relative { a4 a a a a4 a a a } @@ -2502,16 +2502,18 @@ LilyPond で台詞を譜刻することはできますが、台詞には音楽 これは、マークアップで実現できます。@c しばしば、この目的のために専用のフォントを用います。 -@lilypond[quote,verbatim,relative=1] -\clef "G_8" -c4^\markup \fontsize #1 \smallCaps Kaspar -c c c -\clef "bass" -a4^\markup \fontsize #1 \smallCaps Melchior -a a a -\clef "G_8" -c4^\markup \fontsize #1 \smallCaps Kaspar -c c c +@lilypond[quote,verbatim] +\relative c' { + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c + \clef "bass" + a4^\markup \fontsize #1 \smallCaps Melchior + a a a + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c +} @end lilypond 役の入れ替えが頻繁にある場合、@c @@ -2584,13 +2586,13 @@ LilyPond の拡張: @c KEEP LY @lilypond[quote,verbatim] -flute = \relative c'' { - s4 s4 e g +flute = \relative { + s4 s4 e'' g } \addQuote "flute" { \flute } -pianoRH = \relative c'' { - c4. g8 +pianoRH = \relative { + c''4. g8 % 合図音符の楽器名を、合図音符の直前、かつ譜の上に配置します \new CueVoice { \override InstrumentSwitch.self-alignment-X = #RIGHT @@ -2598,7 +2600,7 @@ pianoRH = \relative c'' { } \cueDuring "flute" #UP { g4 bes4 } } -pianoLH = \relative c { c4 e, } +pianoLH = \relative { c4 e, } \score { \new PianoStaff << @@ -2645,7 +2647,7 @@ pianoRH = \relative c'' { \cueDuring "clarinet" #DOWN { c4. g8 } g4 bes4 } -pianoLH = \relative c { c4 e, } +pianoLH = \relative { c4 e, } \score { << @@ -2727,10 +2729,12 @@ pianoLH = \relative c { c4 e, } 短いフレーズであれば、単純なマークアップ接尾辞を用います。 -@lilypond[quote,verbatim,relative=2] -a4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a -a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a -a4 a a a +@lilypond[quote,verbatim] +\relative { + a'4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a + a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a + a4 a a a +} @end lilypond 長いフレーズの場合は、@c @@ -2756,8 +2760,8 @@ Lyrics コンテキストを用いると良い結果を得られます。@c @c manually adjusted to suit the imposed line length. -td @lilypond[quote,verbatim,ragged-right] -music = \relative c'' { - \repeat unfold 3 { a4 a a a } +music = \relative { + \repeat unfold 3 { a'4 a a a } } dialogue = \lyricmode { @@ -2861,15 +2865,15 @@ stemOff = { \hide Staff.Stem } \score { \new StaffGroup << \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } } \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -2891,15 +2895,15 @@ stemOff = { \hide Staff.Stem } \new ChoirStaff << \new Staff \with { \remove "Bar_engraver" } { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } } \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -2914,34 +2918,38 @@ stemOff = { \hide Staff.Stem } 改行位置を示すためにダミーの小節線 @code{\bar ""} を挿入する必要が@c あるかもしれません。 -@lilypond[verbatim,quote,relative=2] -a4 b c2 | -\cadenzaOn -a4 b c2 -a4 b c2 -\bar "" -a4 b c2 -a4 b c2 -\cadenzaOff -a4 b c2 | -a4 b c2 | +@lilypond[verbatim,quote] +\relative a' { + a4 b c2 | + \cadenzaOn + a4 b c2 + a4 b c2 + \bar "" + a4 b c2 + a4 b c2 + \cadenzaOff + a4 b c2 | + a4 b c2 | +} @end lilypond 小節線を変更することによって、聖歌の休止や一時停止を示すことができます。 -@lilypond[verbatim, quote,relative=2] -a4 -\cadenzaOn -b c2 -a4 b c2 -\bar "'" -a4 b c2 -a4 b c2 -\bar ";" -a4 b c2 -\bar "!" -a4 b c2 -\bar "||" +@lilypond[verbatim, quote] +\relative a' { + a4 + \cadenzaOn + b c2 + a4 b c2 + \bar "'" + a4 b c2 + a4 b c2 + \bar ";" + a4 b c2 + \bar "!" + a4 b c2 + \bar "||" +} @end lilypond 現代の記譜法を用いながらも、@c @@ -2971,8 +2979,8 @@ finalis = { } \score { - \relative c'' { - g2 a4 g + \relative { + g'2 a4 g \divisioMinima g2 a4 g \divisioMaior @@ -2995,8 +3003,8 @@ finalis = { @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -3023,22 +3031,22 @@ finalis = { @c KEEP LY @lilypond[verbatim,quote] -SopranoMusic = \relative g' { - g1 | c2 b | a1 | \bar "||" +SopranoMusic = \relative { + g'1 | c2 b | a1 | \bar "||" a1 | d2 c | c b | c1 | \bar "||" } -AltoMusic = \relative c' { - e1 | g2 g | f1 | +AltoMusic = \relative { + e'1 | g2 g | f1 | f1 | f2 e | d d | e1 | } -TenorMusic = \relative a { - c1 | c2 c | c1 | +TenorMusic = \relative { + c'1 | c2 c | c1 | d1 | g,2 g | g g | g1 | } -BassMusic = \relative c { +BassMusic = \relative { c1 | e2 e | f1 | d1 | b2 c | g' g | c,1 | } diff --git a/Documentation/ja/notation/wind.itely b/Documentation/ja/notation/wind.itely index 5b6c57ad56..398df05c6a 100644 --- a/Documentation/ja/notation/wind.itely +++ b/Documentation/ja/notation/wind.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.16" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -153,11 +153,8 @@ @cindex Scottish highland bagpipe (スコティッシュ ハイランド バグパイプ) @cindex grace notes (装飾小音符) @funindex \taor -@funindex taor @funindex \hideKeySignature -@funindex hideKeySignature @funindex \showKeySignature -@funindex showKeySignature LilyPond はスコティッシュ、ハイランド バグパイプ音楽のための特殊な定義を@c 保持しています。@c @@ -196,9 +193,9 @@ LilyPond はスコティッシュ、ハイランド バグパイプ音楽のた 現代音楽のなかには、@c C と F をフラットにするためクロス フィンガリングを使うものがあります。@c -これは @code{cflat} や @code{fflat} で示すことができます。@c +これは @code{c-flat} や @code{f-flat} で示すことができます。@c 同様に、軽音楽のピブロホ ハイ G (piobaireachd high g) は、@c -@code{gflat} で示すことができます。 +@code{g-flat} で示すことができます。 @seealso コード断片集: @@ -287,8 +284,8 @@ C と F をフラットにするためクロス フィンガリングを使う 木管楽器のダイアグラムはマークアップとして作成します: -@lilypond[verbatim,quote,relative=2] -c1^\markup { +@lilypond[verbatim,quote,fragment] +c''1^\markup { \woodwind-diagram #'piccolo #'((lh . (gis)) (cc . (one three)) (rh . (ees))) @@ -299,9 +296,9 @@ c1^\markup { できます: @c KEEP LY -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \textLengthOn -c1^\markup { +c''1^\markup { \center-column { "1/4 閉じる" \woodwind-diagram #'flute #'((cc . (one1q)) @@ -310,7 +307,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "1/2閉じる" \woodwind-diagram #'flute #'((cc . (one1h)) @@ -319,7 +316,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "3/4閉じる" \woodwind-diagram #'flute #'((cc . (one3q)) @@ -328,7 +325,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "リング キーを閉じる" \woodwind-diagram #'flute #'((cc . (oneR)) @@ -337,7 +334,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "完全に閉じる" \woodwind-diagram #'flute #'((cc . (oneF two)) @@ -349,8 +346,8 @@ c1^\markup { トリルはグレーで示します: -@lilypond[verbatim,quote,relative=2] -c1^\markup { +@lilypond[verbatim,quote,fragment] +c''1^\markup { \woodwind-diagram #'bass-clarinet #'((cc . (threeT four)) (lh . ()) @@ -361,9 +358,9 @@ c1^\markup { 様々なトリルを表示させることができます: @c KEEP LY -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \textLengthOn -c1^\markup { +c''1^\markup { \center-column { "1/4 閉じるとリング キーを閉じる" \woodwind-diagram #'flute #'((cc . (one1qTR)) @@ -372,7 +369,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "リング キーを閉じると完全に閉じる" \woodwind-diagram #'flute #'((cc . (oneTR)) @@ -381,7 +378,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "リング キーを閉じるとオープン" \woodwind-diagram #'flute #'((cc . (oneRT)) @@ -390,7 +387,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "オープンと完全に閉じる" \woodwind-diagram #'flute #'((cc . (oneT)) @@ -399,7 +396,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "1/4 閉じると3/4 閉じる" \woodwind-diagram #'flute #'((cc . (one1qT3q)) diff --git a/Documentation/ja/notation/world.itely b/Documentation/ja/notation/world.itely index 025f23c841..265905f77c 100644 --- a/Documentation/ja/notation/world.itely +++ b/Documentation/ja/notation/world.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @c Translators: Yoshiki Sawada @@ -191,8 +191,8 @@ @lilypond[quote,verbatim] \include "arabic.ly" -\relative do' { - do re misb fa sol la sisb do sisb la sol fa misb re do +\relative { + do' re misb fa sol la sisb do sisb la sol fa misb re do } @end lilypond @@ -209,9 +209,9 @@ @lilypond[quote,verbatim] \include "arabic.ly" -\relative do' { +\relative { \set Staff.extraNatural = ##f - dod dob dosd \dwn dob dobsb dodsd do do + dod' dob dosd \dwn dob dobsb dodsd do do } @end lilypond @@ -411,13 +411,13 @@ nawa は以下のように示すことができます: @lilypond[quote,verbatim] \include "arabic.ly" \score { - \relative re' { + \relative { \set Staff.extraNatural = ##f \set Staff.autoBeaming = ##f \key re \bayati \time 10/8 - re4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 + re'4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 re16 [misb do re] sisb [do] la [sisb sol8] la [sisb] do [re] misb fa4 fa16 [misb] misb8. [re16] re8 [misb] re [do] sisb do4 sisb8 misb16 [re do sisb] la [do sisb la] la4 r8 diff --git a/Documentation/ja/translations.itexi b/Documentation/ja/translations.itexi index 2bd1429e24..16a47dbd1c 100644 --- a/Documentation/ja/translations.itexi +++ b/Documentation/ja/translations.itexi @@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; } @end html @end ifhtml -@emph{最終更新日 Wed Dec 18 12:23:14 UTC 2013 +@emph{最終更新日 Sat Jul 2 15:06:05 UTC 2016 } @multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 @@ -31,7 +31,9 @@ GNU LilyPond 学習マニュアル セクション タイトル @* 124 -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @@ -58,7 +60,9 @@ GNU LilyPond 学習マニュアル LilyPond --- \TITLE\ @* 1139 -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @@ -84,61 +88,65 @@ LilyPond --- \TITLE\ @item 1 チュートリアル @* -2578 -@tab Yoshiki Sawada +2499 +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @html -一部 (48 %) +はい @end html @end ifhtml @ifnothtml -一部 (48 %) +はい @end ifnothtml @tab @ifhtml @html -partially +はい @end html @end ifhtml @ifnothtml -partially +はい @end ifnothtml @tab post-GDP @item 2 一般的な記譜法 @* -4396 -@tab Yoshiki Sawada +4402 +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @html -一部 (35 %) +はい @end html @end ifhtml @ifnothtml -一部 (35 %) +はい @end ifnothtml @tab @ifhtml @html -partially +はい @end html @end ifhtml @ifnothtml -partially +はい @end ifnothtml @tab post-GDP @item 3 基礎となるコンセプト @* -11144 +11119 @tab Yoshiki Sawada @tab @tab @@ -155,7 +163,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -165,24 +173,24 @@ partially @item 4 出力を調整する @* -16191 +16592 @tab Yoshiki Sawada @tab @tab @ifhtml @html -一部 (98 %) +一部 (95 %) @end html @end ifhtml @ifnothtml -一部 (98 %) +一部 (95 %) @end ifnothtml @tab @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -192,28 +200,28 @@ partially @item A テンプレート @* -372 +1236 @tab Yoshiki Sawada @tab @tab @ifhtml @html -はい +一部 (97 %) @end html @end ifhtml @ifnothtml -はい +一部 (97 %) @end ifnothtml @tab @ifhtml @html -はい +partially @end html @end ifhtml @ifnothtml -はい +partially @end ifnothtml @tab post-GDP @end multitable @@ -248,11 +256,11 @@ LilyPond 記譜法リファレンス @ifhtml @html -はい +partially @end html @end ifhtml @ifnothtml -はい +partially @end ifnothtml @tab post-GDP @item @@ -312,7 +320,7 @@ LilyPond --- \TITLE\ @item 1.1 ピッチ @* -4990 +5169 @tab Yoshiki Sawada @tab @tab @@ -329,7 +337,7 @@ LilyPond --- \TITLE\ @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -339,7 +347,7 @@ partially @item 1.2 リズム @* -6890 +6795 @tab Yoshiki Sawada @tab @tab @@ -356,7 +364,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -366,7 +374,7 @@ partially @item 1.3 発想記号 @* -1793 +1798 @tab Yoshiki Sawada @tab @tab @@ -383,17 +391,17 @@ partially @ifhtml @html -はい +partially @end html @end ifhtml @ifnothtml -はい +partially @end ifnothtml @tab post-GDP @item 1.4 繰り返し @* -1050 +1288 @tab Yoshiki Sawada @tab @tab @@ -410,17 +418,17 @@ partially @ifhtml @html -はい +partially @end html @end ifhtml @ifnothtml -はい +partially @end ifnothtml @tab post-GDP @item 1.5 同時進行する音符 @* -2821 +2919 @tab Yoshiki Sawada @tab @tab @@ -437,7 +445,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -447,7 +455,7 @@ partially @item 1.6 譜の記譜法 @* -2476 +2554 @tab Yoshiki Sawada @tab @tab @@ -464,7 +472,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -474,7 +482,7 @@ partially @item 1.7 編集者の注釈 @* -954 +1477 @tab Yoshiki Sawada @tab @tab @@ -491,18 +499,20 @@ partially @ifhtml @html -はい +partially @end html @end ifhtml @ifnothtml -はい +partially @end ifnothtml @tab post-GDP @item 1.8 テキスト @* -2816 -@tab Yoshiki Sawada +2754 +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @@ -555,7 +565,7 @@ partially @item 2.1 声楽 @* -5190 +4975 @tab Yoshiki Sawada @tab @tab @@ -572,7 +582,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -582,7 +592,7 @@ partially @item 2.2 キーボードと他の複数譜の楽器 @* -888 +904 @tab Yoshiki Sawada @tab @tab @@ -599,17 +609,17 @@ partially @ifhtml @html -はい +partially @end html @end ifhtml @ifnothtml -はい +partially @end ifnothtml @tab post-GDP @item 2.3 フレットの無い弦楽器 @* -281 +303 @tab Yoshiki Sawada @tab @tab @@ -626,17 +636,17 @@ partially @ifhtml @html -はい +partially @end html @end ifhtml @ifnothtml -はい +partially @end ifnothtml @tab post-GDP @item 2.4 フレットのある弦楽器 @* -2662 +2820 @tab Yoshiki Sawada @tab @tab @@ -653,7 +663,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -663,7 +673,7 @@ partially @item 2.5 打楽器 @* -811 +799 @tab Yoshiki Sawada @tab @tab @@ -680,7 +690,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -707,17 +717,17 @@ partially @ifhtml @html -はい +partially @end html @end ifhtml @ifnothtml -はい +partially @end ifnothtml @tab post-GDP @item 2.7 和音記譜法 @* -1972 +1931 @tab Yoshiki Sawada @tab @tab @@ -734,7 +744,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -788,34 +798,34 @@ partially @ifhtml @html -はい +partially @end html @end ifhtml @ifnothtml -はい +partially @end ifnothtml @tab post-GDP @item 3 入出力全般 @* -10392 +12704 @tab Yoshiki Sawada @tab @tab @ifhtml @html -はい +一部 (94 %) @end html @end ifhtml @ifnothtml -はい +一部 (94 %) @end ifnothtml @tab @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -825,7 +835,7 @@ partially @item 4 スペースの問題 @* -12256 +10911 @tab Yoshiki Sawada @tab @tab @@ -842,7 +852,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -852,24 +862,24 @@ partially @item 5 デフォルトを変更する @* -15289 +15598 @tab Yoshiki Sawada @tab @tab @ifhtml @html -一部 (97 %) +一部 (94 %) @end html @end ifhtml @ifnothtml -一部 (97 %) +一部 (94 %) @end ifnothtml @tab @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -896,11 +906,11 @@ A カンニング ペーパー @ifhtml @html -はい +partially @end html @end ifhtml @ifnothtml -はい +partially @end ifnothtml @tab post-GDP @end multitable @@ -919,7 +929,9 @@ GNU LilyPond -- アプリケーション使用方法 セクション タイトル @* 135 -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @@ -946,7 +958,9 @@ GNU LilyPond -- アプリケーション使用方法 LilyPond --- \TITLE\ @* 1139 -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @@ -972,24 +986,26 @@ LilyPond --- \TITLE\ @item 1 @command{lilypond} を実行する @* -4537 -@tab Yoshiki Sawada +5440 +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @html -一部 (97 %) +はい @end html @end ifhtml @ifnothtml -一部 (97 %) +はい @end ifnothtml @tab @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -999,7 +1015,7 @@ partially @item 2 @command{convert-ly} を使ってファイルを更新する @* -1484 +1866 @tab Yoshiki Sawada @tab @tab @@ -1016,7 +1032,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -1026,7 +1042,7 @@ partially @item 3 @command{lilypond-book} を実行する @* -4137 +4211 @tab Yoshiki Sawada @tab @tab @@ -1043,7 +1059,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -1053,7 +1069,7 @@ partially @item 4 外部プログラム @* -2817 +2786 @tab Yoshiki Sawada @tab @tab @@ -1070,7 +1086,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -1080,7 +1096,7 @@ partially @item 5 LilyPond 入力ファイルの記述に対する提案 @* -2692 +2793 @tab Yoshiki Sawada @tab @tab @@ -1097,7 +1113,7 @@ partially @ifhtml @html -partially +partially @end html @end ifhtml @ifnothtml @@ -1119,8 +1135,10 @@ LilyPond -- みんなの楽譜作成 @item セクション タイトル @* -616 -@tab Yoshiki Sawada +629 +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* Yoshinobu Ishizaki @tab @@ -1149,7 +1167,9 @@ Yoshinobu Ishizaki LilyPond --- \TITLE\ @* 1139 -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* Yoshinobu Ishizaki @tab @@ -1177,8 +1197,10 @@ Yoshinobu Ishizaki @item 導入部 @* -4937 -@tab Yoshiki Sawada +5815 +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* Yoshinobu Ishizaki @tab @@ -1196,18 +1218,20 @@ Yoshinobu Ishizaki @ifhtml @html -partially +はい @end html @end ifhtml @ifnothtml -partially +はい @end ifnothtml @tab pre-GDP @item ダウンロード @* -1201 -@tab Yoshiki Sawada +1158 +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @@ -1223,18 +1247,20 @@ partially @ifhtml @html -partially +はい @end html @end ifhtml @ifnothtml -partially +はい @end ifnothtml @tab pre-GDP @item マニュアル @* -1284 -@tab Yoshiki Sawada +1314 +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @@ -1250,38 +1276,40 @@ partially @ifhtml @html -partially +はい @end html @end ifhtml @ifnothtml -partially +はい @end ifnothtml @tab pre-GDP @item コミュニティ @* -3073 -@tab Yoshiki Sawada +3524 +@tab Masamichi Hosoda +@* +Yoshiki Sawada @tab @tab @ifhtml @html -一部 (97 %) +はい @end html @end ifhtml @ifnothtml -一部 (97 %) +はい @end ifnothtml @tab @ifhtml @html -partially +はい @end html @end ifhtml @ifnothtml -partially +はい @end ifnothtml @tab pre-GDP @end multitable diff --git a/Documentation/ja/usage.tely b/Documentation/ja/usage.tely index 3fa8d617f3..c6da8cbd8e 100644 --- a/Documentation/ja/usage.tely +++ b/Documentation/ja/usage.tely @@ -1,13 +1,13 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*- @ignore - Translation of GIT committish: 3c62ac104645533873bba800f7b0f371089f535a + Translation of GIT committish: 2429e825c154f15cda52cf8a44f12e23d9f6a1e6 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@setfilename lilypond-program.info +@setfilename lilypond-usage.info @settitle GNU LilyPond -- アプリケーション使用方法 @documentencoding UTF-8 @documentlanguage ja @@ -15,13 +15,18 @@ @macro manualIntro このマニュアルは LilyPond バージョン @version{} で配布される@c -プログラムの実効方法について説明します。@c +プログラムの実行方法について説明します。@c さらに、効率的な使用方法について提案します。 @end macro -@c `Usage' was born 1999-10-10 with git commit c82c30c... +@c `Usage' was born 1999-10-11 with this commit: +@c release: 1.2.13 +@c author: Han-Wen Nienhuys +@c commit: 0cf97b5cdceecbba937f43ac827f4065aad5001e +@c file: Documentation/user/invoking.itexi + @macro copyrightDeclare -Copyright @copyright{} 1999--2012 by the authors. +Copyright @copyright{} 1999--2015 by the authors. @end macro @set FDL @@ -37,7 +42,7 @@ Copyright @copyright{} 1999--2012 by the authors. @omflanguage Japanese @end ignore -@c Translators: Yoshiki Sawada +@c Translators: Masamichi Hosoda, Yoshiki Sawada @c Translation status: post-GDP diff --git a/Documentation/ja/usage/external.itely b/Documentation/ja/usage/external.itely index bb64233371..ae6ef2e14e 100644 --- a/Documentation/ja/usage/external.itely +++ b/Documentation/ja/usage/external.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -154,8 +154,8 @@ lilypond -dno-point-and-click file.ly @example \pointAndClickTypes #'note-event -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -163,8 +163,8 @@ lilypond -dno-point-and-click file.ly @example #(ly:set-option 'point-and-click 'note-event) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -185,8 +185,8 @@ lilypond -dpoint-and-click=note-event example.ly @example \pointAndClickTypes #'(note-event dynamic-event) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -194,8 +194,8 @@ lilypond -dpoint-and-click=note-event example.ly @example #(ly:set-option 'point-and-click '(note-event dynamic-event)) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -249,7 +249,7 @@ Emacs は @file{lilypond-mode} を持ちます。@c 配置するか、@file{~/.emacs} または @file{~/.emacs.el} に追記する必要があります。 @file{~/.emacs} に以下の行を追記 (あるいは修正) して、@c -ソース パス (例えば @file{~/site-lisp/) を @var{load-path} に@c +ソース パス (例えば @file{~/site-lisp/}) を @var{load-path} に@c 追加した方が良いかもしれません。 @c any reason we do not advise: (push "~/site-lisp" load-path) diff --git a/Documentation/ja/usage/lilypond-book.itely b/Documentation/ja/usage/lilypond-book.itely index e0f3f4bf69..41f141d5ad 100644 --- a/Documentation/ja/usage/lilypond-book.itely +++ b/Documentation/ja/usage/lilypond-book.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.22" @c Translators: Yoshiki Sawada @@ -94,8 +94,8 @@ Windows や Mac OS X のコマンド ラインを用いて @code{lilypond-book} 例えば、以下のように: \begin{lilypond} -\relative c' { - c2 e2 \tuplet 3/2 { f8 a b } a2 e4 +\relative { + c'2 e2 \tuplet 3/2 { f8 a b } a2 e4 } \end{lilypond} @@ -156,8 +156,8 @@ Texinfo で処理されるため、上記の例とはレイアウトが少し異 例えば、以下のように: @lilypond -\relative c' { - c2 e2 \tuplet 3/2 { f8 a b } a2 e4 +\relative { + c'2 e2 \tuplet 3/2 { f8 a b } a2 e4 } @end lilypond @@ -181,8 +181,8 @@ c'4 f16 title = "A scale in LilyPond" } - \relative c' { - c d e f g a b c + \relative { + c' d e f g a b c } } @end lilypond @@ -794,8 +794,8 @@ LilyPond コマンドの引数をそのまま出力ファイルにコピーし つまり、 @example -\relative c' @{ % begin verbatim - c4 e2 g4 +\relative @{ % begin verbatim + c'4 e2 g4 f2 e % end verbatim @} @end example @@ -1186,8 +1186,8 @@ LilyPond 断片を LaTex ドキュメントに組み込むことができます 通常の LaTeX テキスト。 \begin@{lilypond@} -\relative c'' @{ - a4 b c d +\relative @{ + a'4 b c d @} \end@{lilypond@} @@ -1212,7 +1212,7 @@ LilyPond 断片を Texinfo に組み込むことができます。@c Texinfo テキスト @@lilypond -\relative c' @{ +\relative @{ a4 b c d @} @@end lilypond @@ -1240,8 +1240,8 @@ d4 c b a 以下のように、lilypond-book 用のドキュメントには自由に楽譜と テキストを組み合わせることができます。 -\relative c'' @{ - a4 b c d +\relative @{ + a'4 b c d @}

@@ -1345,7 +1345,7 @@ unterst__tzt werden. (format #f "~a, section, 1, @{~a@}, ~a" page text label)))) (formatted-toc-items (map format-line (toc-items))) (whole-string (string-join formatted-toc-items ",\n")) - (output-name (ly:parser-output-name parser)) + (output-name (ly:parser-output-name)) (outfilename (format "~a.toc" output-name)) (outfile (open-output-file outfilename))) (if (output-port? outfile) diff --git a/Documentation/ja/usage/running.itely b/Documentation/ja/usage/running.itely index 23cf063b6c..980d2a5cf0 100644 --- a/Documentation/ja/usage/running.itely +++ b/Documentation/ja/usage/running.itely @@ -1,16 +1,16 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*- @ignore - Translation of GIT committish: fabcd22c8f88ea9a87241597f1e48c0a9adbfc6e + Translation of GIT committish: 2429e825c154f15cda52cf8a44f12e23d9f6a1e6 When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.21" -@c Translators: Yoshiki Sawada +@c Translators: Masamichi Hosoda, Yoshiki Sawada @c Translation status: post-GDP @node lilypond を実行する @@ -47,7 +47,8 @@ lilypond ファイルを書くのに代替のエディタを使用するので コマンド ラインからしか利用できません。 ここで @q{コマンド ライン} とは、OS の中にあるコマンド ラインを意味します。@c -Windows ユーザは @q{DOS シェル} という言葉の方が馴染みがあるかもしれません。@c +Windows ユーザは @q{DOS シェル} や @q{コマンド シェル} @q{コマンド プロンプト} +という言葉の方が馴染みがあるかもしれません。@c MaxOS@tie{}X ユーザは @q{ターミナル} や @q{コンソール} という言葉の方が@c 馴染みがあるかもしれません。@c MaxOS@tie{}X ユーザは追加のセットアップが必要かもしれません。@c @@ -59,14 +60,14 @@ OS のコマンド ラインの使用方法についての説明は@c その内容を扱っている他のドキュメントをあたってください。 @menu -* lilypond を呼び出す:: +* LilyPond を呼び出す:: * LilyPond の基本的なコマンド ライン オプション:: * LilyPond の高度なコマンド ライン オプション:: * 環境変数:: * chroot jail 環境で LilyPond を実行する:: @end menu -@node lilypond を呼び出す +@node LilyPond を呼び出す @unnumberedsubsec @command{lilypond} を呼び出す @translationof Invoking lilypond @@ -91,44 +92,95 @@ lilypond は出力として @file{filename.ps} と @file{filename.pdf} を作り そのため、Scheme 内部からいかなるシステム デフォルトも変更しないよう@c 注意してください。} -@file{filename.ly} が複数の @code{\score} を含んでいる場合、@c -2 つ目以降の score は +@file{filename.ly} が複数の @code{\book} ブロックを含んでいる場合、@c +残りのの score は @file{filename-1.pdf} から始まる番号付きのファイルに出力されます。@c さらに、@code{output-suffix} がベース名と番号の間に挿入されます。@c 以下の内容を含んでいる入力ファイルは @example #(define output-suffix "violin") -\book @{ @dots{} @} +\score @{ @dots{} @} #(define output-suffix "cello") -\book @{ @dots{} @} +\score @{ @dots{} @} @end example @noindent @var{base}@file{-violin.pdf} と @var{base}@file{-cello-1.pdf} を出力します。 -@unnumberedsubsubsec 標準シェル コマンド +@unnumberedsubsubsec 標準シェルで LilyPond を使う -シェル (例えばコマンド ウィンドウ) がリダイレクトをサポートしているのであれば、@c -以下のコマンドでコンソール出力をファイルにリダイレクトすると役に立つかもしれません。 +LilyPond はコマンドラインアプリケーションなので、@c +LilyPond を呼び出すために @q{シェル} の機能をうまく利用することができます。 -@itemize +例えば: -@item -@code{lilypond file.ly 1>stdout.log} 通常出力をリダイレクトします +@example +lilypond *.ly +@end example -@item -@code{lilypond file.ly 2>stderr.log} エラー メッセージをリダイレクトします。 +@noindent +は、カレントディレクトリのすべての LilyPond ファイルを処理できるでしょう。 -@item -@code{lilypond file.ly &>all.log} すべての出力をリダイレクトします +コンソール出力をリダイレクトする(例えばファイルへ)のも@c +有用でしょう。 -@end itemize +@example +lilypond file.ly 1> stdout.txt + +lilypond file.ly 2> stderr.txt + +lilypond file.ly &> all.txt +@end example + +@noindent +それぞれ @q{普通の} 出力、@q{エラー} のみ、@q{すべて} 、 +をファイルにリダイレクトします。@c -あなたの使用しているシェルがこれらのオプションをサポートしているかどうか、@c +あなたの使用しているシェル、コマンドプロンプト (Windows)、@c +ターミナルやコンソール (MacOS X) がリダイレクトをサポートしているか、@c あるいは構文が異なるかどうかは、そのシェルのドキュメントを調べてください。@c -これらはシェル コマンドであり、lilypond とは無関係です。 + +以下は、カレントディレクトリ以下のすべての入力ファイルを再帰的に探し、@c +処理する例です。@c +出力ファイルは元の入力ファイルのあるディレクトリではなく、@c +コマンドを実行したディレクトリに置かれます。 + +@example +find . -name '*.ly' -exec lilypond '@{@}' \; +@end example + +@noindent +これは MacOS@tie{}X ユーザでも使えるでしょう。 + +Windows ユーザは; + +@example +forfiles /s /M *.ly /c "cmd /c lilypond @@file" +@end example + +@noindent +スタートメニューから +@code{スタート > アクセサリ > コマンドプロンプト} +とたどるか、Windows 8 であれば@c +検索ウィンドウで @q{コマンドプロンプト} と入力して、 +@code{コマンド プロンプト} を起動し、@c +これらのコマンドを入力します。 + +または、入力ファイルを含むすべてのサブフォルダを含む、@c +最上位のフォルダを明示的に指定できる @code{/p} オプションもあります; + +@example +forfiles /s /p C:\Documents\MyScores /M *.ly /c "cmd /c lilypond @@file" +@end example + +最上位フォルダ名がスペース文字を含む場合は、@c +パス全体をダブルクオーテーションで囲む必要があります。; + +@example +forfiles /s /p "C:\Documents\My Scores" /M *.ly /c "cmd /c lilypond @@file" +@end example @node LilyPond の基本的なコマンド ライン オプション @@ -144,6 +196,34 @@ lilypond は出力として @file{filename.ps} と @file{filename.pdf} を作り @table @code +@item -b, --bigpdfs +@cindex bigpdfs + +通常より大きい PDF ファイルを生成します。@c +(フォント最適化がほんの少しかまったく無くなるため。)@c +しかし、2 つ以上の PDF ファイルを +@w{@code{pdftex}}、@w{@code{xetex}} や @w{@code{luatex}} +ドキュメントの中に組み込む場合、@c +さらに ghostscript 処理で重複するフォントデータを統合し、@c +@emph{著しく} 小さい PDF ファイルを得ることができます。 + +@example +lilypond -b myfile +@end example + +それから @code{ghostscript} を呼び出します。 + +@example +gs -q -sDEVICE=pdfwrite -o gsout.pdf myfile.pdf +@end example + +@code{pdfsizeopt.py} は、さらにサイズの最適化ができます。 + +@example +pdfsizeopt.py --use-multivalent=no gsout.pdf final.pdf +@end example + + @item -d, --define-default=@var{var}=@var{val} @ref{Advanced command line options for LilyPond} を参照してください。 @@ -211,6 +291,7 @@ init ファイルとして @var{file} をセットします (デフォルト: @f Web サーバ経由で LilyPond 譜刻を提供する時や LilyPond が外部ソースから送られてきたコマンドを実行する時に、@c @code{--dsafe} よりも自由度の高い代替手段を提供します。 +(@ref{Advanced command line options for LilyPond} を参照してください。) @code{--jail} オプションはコンパイル プロセスの開始直前に @command{lilypond} のルート ディレクトリを @var{jail} に変更します。@c @@ -265,7 +346,7 @@ LilyPond インストールの内容すべて (例えば、@file{/usr/share/lily そのため、外部プログラムを必要としないバックエンドで LilyPond を実行しなければなりません。@c すでに述べたように、@c -jail モードでの LilyPond の実行はスーパーユーザ権限で行われならず +jail モードでの LilyPond の実行はスーパーユーザ権限で行われなければならず (もちろん、その権限はすぐに外されます)、@c たぶん @command{sudo} を使います。@c LilyPond が使用可能な CPU 時間を数秒に制限する @@ -298,7 +379,7 @@ LilyPond が使用可能な CPU 時間を数秒に制限する 出力します。 @item PROGRESS -しべての進捗メッセージ、警告とエラー メッセージを出力します。 +すべての進捗メッセージ、警告とエラー メッセージを出力します。 @item INFO (デフォルト) 進捗メッセージ、警告、エラーそれに追加の実行情報を出力します。 @@ -314,7 +395,8 @@ LilyPond が使用可能な CPU 時間を数秒に制限する @item -o, --output=@var{FILE} or @var{FOLDER} デフォルトの出力ファイルとして @var{FILE} をセットします。@c -セットした名前のフォルダが存在する場合、そのフォルダに出力されます。@c +セットした名前のフォルダが存在する場合、そのフォルダに、@c +入力ファイルから取ったファイル名で出力されます。@c 適切な接尾辞が追加されます (つまり、pdf ならば拡張子 @code{.pdf} が追加されます)。 @@ -363,16 +445,18 @@ GNU LilyPond の保証責任を表示します。@c @table @code -@item -d@var{[option-name]}=@var{[value]},--define-default=@var{[option-name]}=@var{[value]} +@item -d@var{[option-name]}=@var{[value]}, +--define-default=@var{[option-name]}=@var{[value]} これは内部 Scheme 関数に @var{value} をセットします。@c +例えば、 @example -dbackend=svg @end example -@var{value} が提供されない場合、デフォルト値が使われます。@c +@var{value} が指定されない場合、デフォルト値が使われます。@c 例えば、@var{option-name} に接頭辞 @code{no-} を付けると、そのオプションは -@q{off} なります +@q{off} になります @cindex point and click, command line (コマンド ラインでポイント&クリックを指定する) @@ -402,44 +486,66 @@ GNU LilyPond の保証責任を表示します。@c @item @code{aux-files} @tab @code{#t} -@tab @code{EPS} バックエンドの中に @code{.tex}, @code{.texi}, +@tab @code{eps} バックエンドを使うときに @code{.tex}, @code{.texi}, @code{.count} ファイルを作成します。 @item @code{backend} @tab @code{ps} -@tab バックエンドを選択します。Postscript ファイル (デフォルト) は@c -@code{TTF}, @code{Type1}, それに @code{OTF} フォントを内包します。@c +@tab デフォルト設定です。Postscript ファイル (デフォルト) は@c +@code{TTF}, @code{Type1}, それに @code{OTF} フォントを埋め込みます。@c フォントのサブセットは作成されません。@c -@q{東洋} の文字セットを用いるとファイルが非常に大きくなる可能性があります。 +@q{東洋} の文字セットを用いるとファイルが非常に大きくなる可能性が@c +あることに注意してください。 @item @tab @code{eps} -@tab Encapsulated PostScript。これはフォントを持たないページ (段) 毎の -@file{EPS} ファイルと、フォントを内包するすべてのページ (段) を 1 つに@c -まとめた @file{EPS} ファイルを吐き出します。@c -@command{lilypond-book} はデフォルトでこのオプションを使用します。 +@tab @command{lilypond-book} コマンドのデフォルトです。@c +これは、1 つのファイルにすべてのページとフォントを埋め込んだものと、@c +ページ毎に分離しフォントを埋め込まない eps ファイルの、両方を吐き出します。 @item @tab @code{null} @tab 楽譜を出力しません。@code{-dno-print-pages} と同じ効果を持ちます。 -@item -@tab @code{svg} -@tab Scalable Vector Graphics。これはページ毎に埋め込みフォントを持たない -@code{SVG} ファイルを作成します。@c -最適な描画を得るために、Century Schoolbook フォントをインストールすること@c -を推奨します。このフォントは LilyPond のインストールに含まれています。@c -UNIX では、このフォントを LilyPond ディレクトリ (通常は、 -@file{/usr/share/lilypond/VERSION/fonts/otf/}) から @file{~/.fonts/} に@c -コピーするだけです。この @code{SVG} 出力は任意の SVG エディタやユーザ -エージェントと互換性があります。@c -SVG バックエンドの中で woff フォント ファイルを使うためのオプション -@code{svg-woff} (この表の下にあります) もあります。 - @item @tab @code{scm} @tab 内部的な Scheme ベースの描画コマンドを吐き出します。 +@item +@tab @code{svg} +@tab ページ毎の SVG ファイルが全ページ分作られます。@c +LilyPond 自身の音楽グリフを除き、フォントは埋め込まれません。@c +そのため、テキストや歌詞の最適な描画を得るためには、@c +SVG ビュアーにフォントが必要となります。@c +SVG ビュアーが対応していないことがあるので、@c +@q{フォントエイリアス} や @q{フォントリスト} を使用しないことをお勧めします。@c +@emph{Web Open Font Format} (WOFF) ファイルを使うときには、@c +追加の @code{svg-woff} スイッチが必要となります。 +@end multitable + +@noindent +@strong{SVG バッグエンド出力の注意:} +LilyPond のデフォルトフォント(@code{LilyPond Serif}, +@code{LilyPond Sans Serif} と @code{LilyPond Monospace})は、@c +まさに @emph{ローカル} フォントエイリアスです。@c +そのため、@code{svg} バックエンドを使う場合は、@c +ソースファイルで明示的にデフォルトフォントを設定する必要があります; + +@quotation +@verbatim +\paper { + #(define fonts + (make-pango-font-tree "TeX Gyre Schola" + "TeX Gyre Heros" + "TeX Gyre Cursor" + (/ staff-height pt 20))) +} +@end verbatim +@end quotation + +@ruser{ドキュメント全体のフォント} も参照してください。 + +@multitable @columnfractions .33 .16 .51 @c 未訳 @item @code{check-internal-types} @tab @code{#f} @@ -447,7 +553,10 @@ SVG バックエンドの中で woff フォント ファイルを使うための @item @code{clip-systems} @tab @code{#f} -@tab Generate cut-out snippets of a score. +@tab Extract music fragments out of a score. This requires that the +@code{clip-regions} function has been defined within the @code{\layout} +block. See @ruser{Extracting fragments of music}. No fragments are +extracted though if used with the @option{-dno-print-pages} option. @item @code{datadir} @tab @@ -512,7 +621,7 @@ for @code{`-ddebug-gc'}. @item @code{gs-load-lily-fonts} @tab @code{#f} -@tab Ghostscript 経由でフォントだけを読み込みます。 +@tab LilyPond のフォントだけを Ghostscript 経由で読み込みます。 @item @code{gui} @tab @code{#f} @@ -570,11 +679,6 @@ for @code{`-ddebug-gc'}. @tab @code{#f} @tab Convert text strings to paths when glyphs belong to a music font. -@item @code{old-relative} -@tab @code{#f} -@tab 同時進行する音楽のための @code{\relative} モードを和音構文と同じように@c -機能させます。 - @item @code{paper-size} @tab @code{\"a4\"} @tab デフォルトの紙面サイズを設定します。文字列をエスケープ記号付の 2 重@c @@ -585,8 +689,8 @@ for @code{`-ddebug-gc'}. @tab 画像出力のための GhostScript の出力フォーマットを設定します。 @item @code{point-and-click} -@tab @code{#f} -@tab @code{PDF} 出力に @q{ポイント&クリック} リンクを付け加えます。@c +@tab @code{#t} +@tab PDF と SVG 出力に @q{ポイント&クリック} リンクを付け加えます。@c @ref{Point and click} を参照してください。 @item @code{preview} @@ -653,9 +757,9 @@ Web サーバ経由で LilyPond 譜刻が利用可能な場合、@option{--safe} @quotation @verbatim -#(system "rm -rf /") +#(s ystem "rm -rf /") % 正しく書くのはあまりにも危険 { - c4^$(ly:gulp-file "/etc/passwd") + c4^$(ly:gulp-file "/etc/passwd") % 破壊的ではないが悪意がある } @end verbatim @end quotation @@ -678,7 +782,7 @@ Web サーバ経由で LilyPond 譜刻が利用可能な場合、@option{--safe} そのため、LilyPond を一般公開する Web サーバで使用する場合、プロセスの@c CPU とメモリ使用を制限すべきです。 -セーフ モードは多くの有用な LilyPond 楽譜断片がコンパイルすることを@c +セーフ モードは多くの有用な LilyPond 楽譜断片がコンパイルされることを@c 妨げます。 @option{--jail} はさらに安全な代替手段ですが、セットアップにかかる手間も@c @@ -687,8 +791,8 @@ CPU とメモリ使用を制限すべきです。 @multitable @columnfractions .33 .16 .51 @item @code{separate-log-files} @tab @code{#f} -@tab 入力ファイル @code{FILE1.ly}, @code{FILE2.ly}, ... に対するログ -データをファイル @code{FILE1.log}, @code{FILE2.log}, ... に出力します。 +@tab 入力ファイル @code{FILE1.ly}, @code{FILE2.ly}, 等に対するログ +データをファイル @code{FILE1.log}, @code{FILE2.log}@dots{} に出力します。 @item @code{show-available-fonts} @tab @code{#f} @@ -704,9 +808,27 @@ CPU とメモリ使用を制限すべきです。 @tab 出力ファイル名を構築する時に入力ファイルのディレクトリを使用@c しません。 +@c 未訳 +@item @code{strokeadjust} +@tab @code{#f} +@tab Force PostScript stroke adjustment. This option is mostly +relevant when a PDF is generated from PostScript output (stroke +adjustment is usually enabled automatically for low-resolution bitmap +devices). Without this option, PDF previewers tend to produce widely +inconsistent stem widths at resolutions typical for screen display. The +option does not noticeably affect print quality and causes large file +size increases in PDF files. + @item @code{svg-woff} @tab @code{#f} -@tab SVG バックエンドの中で woff フォントを使用します。 +@tab このオプションは @code{svg} バックエンドで Web Open Format (WOFF) +フォントを使うために必要となります。@c +ページ毎の SVG ファイルが全ページ分作られます。@c +LilyPond 自身の音楽グリフを除き、フォントは埋め込まれません。@c +そのため、テキストや歌詞の最適な描画を得るためには、@c +SVG ビュアーにフォントが必要となります。@c +SVG ビュアーが対応していないことがあるので、@c +@q{フォントエイリアス} や @q{フォントリスト} を使用しないことをお勧めします。@c @item @code{trace-memory-frequency} @tab @code{#f} @@ -967,6 +1089,11 @@ test.ly:2:19: error: not a duration: 5 入力ファイルの示された行にエラーを見つけることができない場合は、@c 示された位置の 1 行か 2 行上をチェックしてみてください。 +診断は多くの処理段階のあらゆる時点で発生し得ることに注意してください。@c +例えば、入力が複数回処理される(つまり、MIDI とレイアウト出力)@c +または同じ音楽変数がコンテキストで使われると、@c +同じメッセージが何回か現れることがあります。 + エラーについての更なる情報が @ref{一般的なエラー} で提供されています。 @@ -985,6 +1112,8 @@ test.ly:2:19: error: not a duration: 5 * エラー メッセージ Unbound variable %:: * エラー メッセージ FT_Get_Glyph_Name:: * 警告 -- Warning staff affinities should only decrease:: +* Error message unexpected new:: +* Warning this voice needs a voiceXx or shiftXx setting:: @end menu @node 楽譜がページからはみ出る @@ -1031,9 +1160,9 @@ LilyPond マニュアルのほとんどの例はこの手法を用いていま 意図していますが、@c 結果は 2 つの譜が表示され、下の譜の符頭の色はデフォルトの黒のままとなります。 -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.NoteHead.color = #red -\new Staff { a } +\new Staff { a' } @end lilypond これは、(符頭色の) オーバライドが処理される時に @@ -1045,36 +1174,13 @@ LilyPond マニュアルのほとんどの例はこの手法を用いていま そこに音符が配置されます。@c すべての符頭を赤にする正しいコードは以下のようになります: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Staff { \override Staff.NoteHead.color = #red - a -} -@end lilypond - -次の例では、@code{\repeat} コマンドの中に @code{\relative} コマンドが@c -置かれているため、譜が 2 つ生じています。@c -@code{\repeat} コマンドが 2 つの @code{\relative} ブロックを生成し、@c -それぞれが暗黙的に @code{Staff} ブロックと @code{Voice} を作成するため、@c -2 番目の譜は右にずれています。 - -@lilypond[quote,verbatim] -\repeat unfold 2 { - \relative c' { c4 d e f } -} -@end lilypond - -明示的に @code{Voice} をインスタンス化することで、この問題は修正されます: - -@lilypond[quote,verbatim] -\new Voice { - \repeat unfold 2 { - \relative c' { c4 d e f } - } + a' } @end lilypond - @node エラー メッセージ Unbound variable % @unnumberedsubsec エラー メッセージ Unbound variable % @translationof Error message Unbound variable % @@ -1116,3 +1222,88 @@ UTF-8 エンコードで保存されていない場合、@c @noindent 詳細は @ruser{システム内部の可変な垂直方向のスペース} の @qq{譜ではない行のスペース} を参照してください。 + + +@node Error message unexpected new +@unnumberedsubsec Error message unexpected @code{@bs{}new} + +A @code{\score} block must contain a @emph{single} music expression. +If instead it contains several @code{\new Staff}, +@code{\new StaffGroup} or similar contexts introduced with @code{\new} +without them being enclosed in either curly brackets, +@code{@{ @dots{} @}}, or double angle brackets, @code{<< @dots{} >>}, +like this: + +@example +\score @{ + % Invalid! Generates error: syntax error, unexpected \new + \new Staff @{ @dots{} @} + \new Staff @{ @dots{} @} +@} +@end example + +@noindent +the error message will be produced. + +To avoid the error, enclose all the @code{\new} statements in +curly or double angle brackets. + +Using curly brackets will introduce the @code{\new} statements +sequentially: + +@lilypond[quote,verbatim] +\score { + { + \new Staff { a' a' a' a' } + \new Staff { g' g' g' g' } + } +} +@end lilypond + +@noindent +but more likely you should be using double angle brackets so the new +staves are introduced in parallel, i.e. simultaneously: + +@lilypond[quote,verbatim] +\score { + << + \new Staff { a' a' a' a' } + \new Staff { g' g' g' g' } + >> +} +@end lilypond + +@node Warning this voice needs a voiceXx or shiftXx setting +@unnumberedsubsec Warning this voice needs a @code{@bs{}voiceXx} + or @code{@bs{}shiftXx} setting + +If notes from two different voices with stems in the same direction +occur at the same musical moment, but the voices have no +voice-specific shifts specified, the warning message +@samp{warning: this voice needs a \voiceXx or \shiftXx setting} will appear +when compiling the LilyPond file. This warning will appear even when +the notes have no visible stems, e.g. whole notes, if the stems for +shorter notes at the same pitch would be in the same direction. + +Remember that the stem direction depends on the position of the +note on the staff unless the stem direction is specified, for example +by using @code{\voiceOne}, etc. In this case the warning will appear +only when the stems happen to be in the same direction, i.e. when the +notes are in the same half of the staff. + +By placing the notes in voices with stem directions and shifts +specified, for example by using @code{\voiceOne}, etc., these warnings +may be avoided. + +Notes in higher numbered voices, @code{\voiceThree} etc., are +automatically shifted to avoid clashing note columns. This causes a +visible shift for notes with stems, but whole notes are not visibly +shifted unless an actual clash of the note heads occurs, or when the +voices cross over from their natural order (when @code{\voiceThree} +is higher than @code{\voiceOne}, etc.) + +@seealso +@rlearning{Explicitly instantiating voices}, +@rlearning{Real music example}, +@ruser{Single-staff polyphony}, +@ruser{Collision resolution}. diff --git a/Documentation/ja/usage/suggestions.itely b/Documentation/ja/usage/suggestions.itely index 71b94dcadd..1147340047 100644 --- a/Documentation/ja/usage/suggestions.itely +++ b/Documentation/ja/usage/suggestions.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @c Translators: Yoshiki Sawada @c Translation status: post-GDP @@ -185,8 +185,8 @@ LilyPond 入力ファイルの構造をすっきりさせておくことが不 変更される可能性はまずありません。 @example -violin = \relative c'' @{ -g4 c'8. e16 +violin = \relative @{ +g'4 c'8. e16 @} ... \score @{ @@ -206,8 +206,8 @@ g4 c'8. e16 @example fthenp = _\markup@{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} -violin = \relative c'' @{ -g4\fthenp c'8. e16 +violin = \relative @{ +g'4\fthenp c'8. e16 @} @end example @@ -257,9 +257,9 @@ LilyPond が返すメッセージはエラーを見つけ出す@c 外したままにしておきます)。 @example -bass = \relative c' @{ +bass = \relative @{ %@{ - c4 c c c + c'4 c c c d d d d %@} @} diff --git a/Documentation/ja/web.texi b/Documentation/ja/web.texi index a44e2854be..38db614f76 100644 --- a/Documentation/ja/web.texi +++ b/Documentation/ja/web.texi @@ -1,6 +1,6 @@ \input texinfo @c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*- @ignore - Translation of GIT committish: 8e9d9bb49f057ab81be830a5ac16714490130393 + Translation of GIT committish: 7215236a0a49dd112348d2620fa132f7e5f12aff When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -13,16 +13,12 @@ @documentlanguage ja @afourpaper -@c `Web' was imported 2009-08-05 with git commit b938d71... -@c @macro copyrightDeclare -@c Copyright @copyright{} 2009--2012 by the authors. -@c @end macro - @set FDL @set web @include macros.itexi @include weblinks.itexi + @c don't remove this comment. @ignore @omfcreator Graham Percival and Patrick McCarty @@ -32,10 +28,19 @@ @omflanguage Japanese @end ignore -@c Translators: Yoshiki Sawada, Yoshinobu Ishizaki +@c Translators: Masamichi Hosoda, Yoshiki Sawada, Yoshinobu Ishizaki + +@c `Web' was born 2003-03-30 with this commit: +@c Initial revision +@c author: Han-Wen Nienhuys +@c commit: d189a2119004c2f75da2020ea2ed36d817582fc5 + +@c @macro copyrightDeclare +@c Copyright @copyright{} 2003--2015 by the authors. +@c @end macro @copying -Copyright @copyright{} 2009--2012 by the authors. +Copyright @copyright{} 2003--2015 by the authors. @c next line is necessary for broken pre-4.13 texinfo's @c install-info, so leave it there until we officially @@ -119,8 +124,6 @@ LilyPond バージョン @version{} 用 @c @im ageId{cmws,web-snippet-alpha.png,Catchy Musical Web Snippet} @divId{quickSummary} -@subheading LilyPond って? - LilyPond は、可能な限り高品位な楽譜を生み出すことを目的とする、@c オープン ソースの楽譜作成プログラムです。@c このフリー ソフトウェアは、伝統的な彫版の楽譜の美しさを@c @@ -135,9 +138,6 @@ LilyPond はフリーソフトウェアであり、@uref{http://gnu.org,GNU プ @divEnd @divEnd -@divClass{separator} -@divEnd - @divId{news} @@ -150,19 +150,36 @@ LilyPond はフリーソフトウェアであり、@uref{http://gnu.org,GNU プ @divEnd + @ifclear web_version @c do nothing @end ifclear @ifset web_version - @c make the box: -@divId{wildCardBox} + @c make the side bar: +@divId{homePageSideBar} +@subheading 安定版 + +@c TODO: javascript to detect OS and suggest download? + +@ref{ダウンロード, ダウンロード @versionStable} + +@ref{マニュアル, マニュアル @versionStable} + +@subheading 開発版 + +@ref{開発, ダウンロード @versionDevel} + +@ref{開発, マニュアル @versionDevel} + @subheading Pondings -@divId{wildCardText} +@divId{pondingsText} @divEnd + @divEnd @end ifset + @html @end html -@ifset web_version - @c make the box: -@divId{latestVersion} -@subheading クイック リンク - -@c TODO: javascript to detect OS and suggest download? - -@subsubheading 安定版 - -@ref{ダウンロード, ダウンロード @versionStable} - -@ref{マニュアル, マニュアル @versionStable} - -@subsubheading 開発版 - -@ref{開発, ダウンロード @versionDevel} - -@ref{開発, マニュアル @versionDevel} - -@divEnd -@end ifset - @ifnottex @@ -269,6 +264,7 @@ Distributions will want to install lilypond.info in postinstall, doing: @docLink{\base\.pdf,\base\.pdf,\webLink\} @end macro + @macro docLinksBare{name,base,refLink,split,big,bigsize,pdf,pdfsize} @divClass{keep-bullets} @@ -292,6 +288,7 @@ Distributions will want to install lilypond.info in postinstall, doing: @end macro + @c don't add any extra spaces in this macro -gp @macro ifWebLinks{webLink,normalLink} @ifclear web_version @@ -309,8 +306,12 @@ Distributions will want to install lilypond.info in postinstall, doing: @divClass{heading-center} @divClass{contactBox} If you are aware of any other \topic\ which could be listed here, -please let us know by following the instructions on -@ref{Bug reports}. +please let us know by writing a message to the bug-lilypond +mailing list. If you're not subscribed yet you can do so on the list's +@uref{https://lists.gnu.org/mailman/listinfo/bug-lilypond,info page} +or post directly through the +@uref{http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs, +gmane lilypond.bugs web interface}. @divEnd @divEnd diff --git a/Documentation/ja/web/community.itexi b/Documentation/ja/web/community.itexi index d196af2d1c..8be2657353 100644 --- a/Documentation/ja/web/community.itexi +++ b/Documentation/ja/web/community.itexi @@ -1,14 +1,15 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*- @ignore - Translation of GIT committish: 40c0295431d0732747d0e37b7911f03fb9daca16 + Translation of GIT committish: 7215236a0a49dd112348d2620fa132f7e5f12aff When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c Translators: Yoshiki Sawada +@c Translators: Masamichi Hosoda, Yoshiki Sawada +@include included/acknowledge.itexi @include included/authors.itexi @include included/helpus.itexi @@ -45,17 +46,20 @@ @ref{援助が必要です}: あなたの手助けが必要です。 @item -@ref{Sponsoring}: financial contributions. +@ref{スポンサー}: financial contributions. @item @ref{開発}: 貢献者とテスター向けです。 @item -@ref{GSoC 2012}: Google Summer of Code 2012 に対する我々のアイデア。 +@ref{Google Summer of Code}: ideas for Google Summer of Code (GSoC). @item @ref{著者}: 現在の LilyPond を作った人々。 +@item +@ref{謝辞}: LilyPond をサポートするプロジェクトや団体。 + @end itemize @divEnd @@ -86,8 +90,9 @@ * 援助が必要です:: * スポンサー:: * 開発:: -* GSoC 2012:: +* Google Summer of Code:: * 著者:: +* 謝辞:: * 出版物:: * 古いニュース:: * 物置:: @@ -131,7 +136,7 @@ LilyPond コード断片リポジトリ (LSR) はユーザが投稿した例の@ 他の人が書いた楽譜を見て、あなた自身も投稿してください! @example -@uref{http://lsr.dsi.unimi.it} +@uref{http://lsr.di.unimi.it} @end example LSR から、@c @@ -176,8 +181,8 @@ LSR から、@c @subsubheading 他の言語 @quotation -@uref{http://lists.gnu.org/mailman/listinfo/lilypond-es, -スペイン語のメーリング リスト} +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-user-fr, +フランス語のメーリング リスト} @uref{http://www.lilypondforum.de/, ドイツ語のフォーラム} @@ -185,27 +190,19 @@ LSR から、@c @uref{http://groups.google.com/group/lilypond-brasil, ポルトガル語のグループ} -@uref{http://lists.gnu.org/mailman/listinfo/lilypond-user-fr, -フランス語のメーリング リスト} - -@uref{http://www.lilypondforum.nl/, -オランダ語のフォーラム} +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-es, +スペイン語のメーリング リスト} @end quotation - @divEnd @divClass{column-right-top} -@subheading 通知 -@c Stay Informed - -@subsubheading LilyPond レポート +@subheading LilyPond ブログ -LilyPond のことを知る最も簡単な方法は、@c -我々のコミュニティのニュース レター LilyPond レポートを読むことです。 +我々コミュニティのブログ @q{Scores of Beauty} を読んでください。 @example -@uref{http://news.lilynet.net} +@uref{http://lilypondblog.org} @end example @subsubheading リリース メーリング リスト: @code{info-lilypond@@gnu.org} @@ -232,12 +229,12 @@ info-lilypond への登録と情報} @divClass{column-right-bottom} -@subheading 開発者の議論 +@subheading 開発者および翻訳者の議論 @subsubheading 開発者メーリング リスト: @code{lilypond-devel@@gnu.org} -多くの開発者がこのメーリング リストに登録しています。@c -パッチはここに送ってください。 +開発者の議論はこのメーリングリストで行われています。@c +パッチはここに送ることができます。 @quotation @uref{http://lists.gnu.org/mailman/listinfo/lilypond-devel, @@ -257,7 +254,8 @@ gmane で lilypond-devel にメールを送る} @subsubheading バグ メーリング リスト: @code{bug-lilypond@@gnu.org} -バグについての議論はここで行われます。 +バグ報告や議論はここで行われます。@c +このメーリングリストにパッチを送らないでください。 @quotation @uref{http://lists.gnu.org/mailman/listinfo/bug-lilypond, @@ -274,15 +272,18 @@ bug-lilypond への登録と情報} @end quotation @warning{バグ リストにメールを送る前に @ref{バグ報告} の@c -ガイドラインを呼んで下さい。} +ガイドラインを読んで下さい。} -@divEnd -@divClass{column-right-bottom} -@subheading デリケートな内容の email +@subsubheading 翻訳 メーリング リスト: @code{translations@@lilynet.org} + +LilyPond マニュアルの翻訳に関するすべての議論がここで行われます。@c +このメーリングリストにパッチを送らないでください。 -プライベートな問題は Graham Percival (プロジェクト マネージャ) に@c -送るべきです。彼はそのことについて関係者と議論します。 +@quotation +@uref{http://lilypond-translations.3384276.n2.nabble.com/, +アーカイブ} +@end quotation @divEnd @@ -414,10 +415,10 @@ LilyPond への理解不足である可能性が高いです! すでに把握しているバグがあります。以下をチェックしてください: @example -@uref{http://code.google.com/p/lilypond/issues/list} +@uref{http://sourceforge.net/p/testlilyissues/issues/} @end example -@warning{バグ トラッカーに直接バグ報告を @strong{送らないで下さい}。@c +@warning{このバグ トラッカーに直接バグ報告を @strong{送らないで下さい}。@c トラッカーに登録された問題については、自由に追加情報を書き込んでください。} @divEnd @@ -500,7 +501,7 @@ gmane lilypond.bugs web インタフェイス} でバグ報告を送ることが バグにマークを付けて、@c そのバグに対して何かアクションがあったときに自動的に email を受け取ることができます。@c -これには Google アカウントが必要です。 +これには Google アカウントでのログインが必要です。 @divEnd @divClass{column-center-bottom} @@ -515,6 +516,7 @@ email を受け取ることができます。@c @divEnd + @node 援助が必要です @unnumberedsec 援助が必要です @translationof Help us @@ -768,7 +770,7 @@ LilyPond の開発手法はかなり複雑です。@c @itemize @item @uref{http://lilypond.org/test, バージョン間での回帰テストの比較} -@item @uref{http://lilypond.org/download/binaries/test-output/, +@item @uref{http://lilypond.org/downloads/binaries/test-output/, すべての回帰テストのアーカイブ} @end itemize @@ -789,6 +791,7 @@ LilyPond の開発手法はかなり複雑です。@c @divClass{normal-table} @multitable @columnfractions .3 .3 .3 @headitem 導入部 + @item @docLinkSplit{学習,learning,@manualDevelLearningSplit-ja} @tab @@ -809,15 +812,17 @@ LilyPond の開発手法はかなり複雑です。@c @docLinkBig{Essay,essay,@manualDevelEssayBig} @tab @docLinkPdf{Essay,essay,@manualDevelEssayPdf} +@end multitable +@multitable @columnfractions .3 .3 .3 @headitem 常用マニュアル @item -@docLinkSplit{Notation,notation,@manualDevelNotationSplit-ja} +@docLinkSplit{記譜法,notation,@manualDevelNotationSplit-ja} @tab -@docLinkBig{Notation,notation,@manualDevelNotationBig-ja} +@docLinkBig{記譜法,notation,@manualDevelNotationBig-ja} @tab -@docLinkPdf{Notation,notation,@manualDevelNotationPdf} +@docLinkPdf{記譜法,notation,@manualDevelNotationPdf} @item @docLinkSplit{使用方法,usage,@manualDevelUsageSplit-ja} @@ -832,7 +837,9 @@ LilyPond の開発手法はかなり複雑です。@c @docLinkBig{Snippets,snippets,@manualDevelSnippetsBig} @tab @docLinkPdf{Snippets,snippets,@manualDevelSnippetsPdf} +@end multitable +@multitable @columnfractions .3 .3 .3 @headitem 時々使用するマニュアル @item @@ -862,178 +869,275 @@ LilyPond の開発手法はかなり複雑です。@c @docLinkBig{Internals,internals,@manualDevelInternalsBig} @tab @docLinkPdf{Internals,internals,@manualDevelInternalsPdf} +@end multitable @ifset web_version +@multitable @columnfractions .3 @headitem Downloadable @item @doctarballDevel +@end multitable @end ifset -@end multitable @divEnd @divEnd -@node GSoC 2012 -@unnumberedsec GSoC 2012 -@translationof GSoC 2012 + + +@node Google Summer of Code +@unnumberedsec Google Summer of Code + +@c 未訳 @divClass{column-center-top} -@subheading Google Summer of Code とは? +@subheading What is Google Summer of Code? + +@uref{https://developers.google.com/open-source/gsoc/, GSoC} is a global +program that offers students stipends to write code for free software +and open source projects during the summer. It is an excellent +opportunity for students to gain experience with real-world software +development and make a contribution that benefits everyone. It brings +new contributors to LilyPond and enables students who are already +involved to become more involved. LilyPond participates in GSoC as part +of the @uref{http://www.gnu.org/, GNU project}. -これは Google が運営する世界規模のプログラムで、@c -夏休みにオープン ソース プロジェクトのために働く学生に報酬を提供します。 +We have had GSoC participants in 2012 and 2015 and encourage students to +apply for future summers. -LilyPond チーム GSoC を新しい貢献者を見つけ、@c -すでに LilyPond の開発に参加している学生がより熱心に取り組む動機付けを@c -与える絶好の機会だと捉えました。@c -GSoC 2012 では我々の貢献者の一人が @uref{http://www.gnu.org/, -GNU プロジェクト} の一部として認められました。@c -我々は継続的にこのプログラムに参加したいと思っています。 +If you have questions or would like to apply, send us an email on our +developer mailing list (see @ref{Contact}). @divEnd -@divClass{column-center-bottom} -@subheading LilyPond チームからの 2012 年のアイディア リスト +@divClass{column-center-middle-color2} +@subheading Project Ideas List -以下のリストは GSoC 2012 に参加する学生に我々が提案したプロジェクトです。@c -応募期間は終了しましたが、LilyPond の開発に興味を持つ人の激励として@c -この Web ページをオンラインのままにしておくことにしました。@c +Below is a list of suggested projects for GSoC or for anyone who is +interested in helping to improve LilyPond. (Last updated: February 2016) -開発チームにはこれらのプロジェクトに挑戦しようとする人々を積極的に@c -支援するメンバーがいます。 +Mentor availability varies from project to project and from year to year. +Send us an email on our developer mailing list (see @ref{Contact}), and +we will help you find a mentor for a project that fits your interests +and skills. -もちろん、LilyPond には、些細な事も含めてさらに多くに改善すべき事柄があります。@c -既知のすべての問題のリストが -@uref{http://code.google.com/p/lilypond/issues/list, ここ} にあります。 +If you have ideas for a GSoC project that is not listed below you can +send us an email as well. There are a number of areas where LilyPond +could be improved, and our development team is always willing to help +those who would like to tackle a project like those listed below. -@subheading 装飾小音符 +A full list of all the current open issues can be found +@uref{http://sourceforge.net/p/testlilyissues/issues/, here}. -装飾小音符の同期についての問題を、すべての基本的なアーキテクチャも含めて@c -修正してください (@uref{http://code.google.com/p/lilypond/issues/detail?id=34, -バグ トラッカーの問題 34} を参照してください)。@c -装飾小音符は時間を巻き戻すかのように振舞い、LilyPond のタイミングを@c -混乱させています。@c -これにより予期しない効果 -- 特に、ある譜が装飾小音符を持っていて、他の譜が@c -持っていない場合に -- が引き起こされています。 +@divEnd -@strong{難易度:} 中 +@divClass{column-center-middle-color3} +@subheading Improve internal chord structure -@strong{必須スキル:} C++, MIDI +The internal representation of LilyPond chords is not powerful enough +to capture the nomenclature of jazz chords. Currently the chord has +a root, a bass and an inversion. It would be nice to be able to handle +stacked or polychords, minor/major, etc. In order to do this, an +internal representation with the ability to capture the essence of +complex chords must be developed. As a bonus, once the internal +representation is developed, the output formatting of chord names can +be improved. -@strong{推奨スキル:} LilyPond の内部を熟知していること +@strong{Difficulty:} Easy/medium +@strong{Requirements:} Scheme (Guile), but the level necessary can be +easily learned +@strong{Recommended:} Chord theory and naming +@strong{Mentor:} Carl Sorensen -@strong{メンター:} Mike Solomon, Carl Sorensen +@divEnd -@subheading MusicXML +@divClass{column-center-middle-color3} +@subheading ScholarLY + +ScholarLY is a library in +@uref{https://openlilylib.org, openLilyLib} that provides functionality +for annotating scores, making it possible to manage scholarly workflows +completely in the context of the score document. So far it is possible +to enter annotations of different types, produce clickable messages in +the console output and export to text and LaTeX files. + +There are numerous feature requests to turn this library into an +even more powerful and comprehensive tool. Some examples: Inserting +music examples, producing footnotes, automatically applying styles +to the annotated item (e.g. dash a slur, parenthesize an accidental), +creating reports with point-and-click entries. For a full description +of this project suggestion please visit +@uref{https://github.com/openlilylib/scholarly/wiki/GSoC, this Wiki page}. + +@strong{Difficulty:} medium +@strong{Requirements:} Scheme, possibly LaTeX, (optionally Python) +@strong{Recommended:} Experience with or interest in scholarly +edition and collaborative workflows. +@strong{Mentor:} Urs Liska + +@divEnd -広範囲にわたる MusicXML エクスポート機能の追加と、インポート機能の改良、@c -それらが機能することのチェックを行ってください。@c -参加時間に応じて以下のいくつか、または全てを実現してください: +@divClass{column-center-middle-color3} +@subheading Adding variants of font glyphs @divClass{keep-bullets} @itemize @item -MIDI エクスポートのような基本的な音楽コンテンツ エクスポート機能@c -(つまり、翻訳クラスから派生したエクスポート専用のクラス) を扱います。 +Adding @q{on} and @q{between} staff-line variants. @item -基本的な音楽コンテンツの XML ツリーを構築し、音楽イベントと XML タグを@c -結び付けます。 +Shorter and narrower variants of some glyphs for example, accidentals. +Another, more specific example could be an ancient notation breve +notehead coming in two variants one with a small or big @q{hole} within +it. -@item -すべての LilyPond エングラーバにエクスポート処理を実行させます。 +@end itemize +@divEnd -@item -各出力オブジェクト (基本的には各ステンシル / ステンシルのグループ) -を音楽イベントにリンクさせる機能を追加します -(そして、それにより、XML ツリーの XML タグにリンクさせます)。 +@strong{Difficulty:} easy +@strong{Requirements:} MetaFont, C++, good eye for details +@strong{Recommended knowledge:} basic LilyPond knowledge +@strong{Mentor:} Werner Lemberg -@item -XML 出力のバックエンドを追加します。@c -その後、バックエンドには各出力オブジェクトのレイアウト情報を XML タグに@c -追加する機能を持たせます。 +@divEnd + +@divClass{column-center-middle-color3} +@subheading Grace notes + +Fix problems with synchronization of grace notes. Grace notes can +interfere with LilyPond's timing and cause odd effects, especially when +multiple staffs are used where some have grace notes and others don't. +This is one of the longest-standing and one of the more embarrassing +@uref{https://sourceforge.net/p/testlilyissues/issues/34/,bugs} in +LilyPond. + +@strong{Difficulty:} medium +@strong{Requirements:} C++, MIDI +@strong{Recommended:} familiarity with LilyPond internals +@strong{Potential Mentors:} Mike Solomon (not available for GSoC 2016), +Carl Sorensen -@end itemize @divEnd -ゴールは、MusicXML から楽譜をインポートして、データのロス無しにエクスポート@c -することです。 +@divClass{column-center-middle-color3} +@subheading Improve default beam positioning -@strong{難易度:} 中 +For regular, cross-staff, broken and kneed beams. Beaming should depend +on context and neighbor notes (see section 2.2 of +@uref{http://imslp.org/wiki/Repository_of_Music-Notation_Mistakes_%28Coulon%2C_Jean-Pierre%29, +this book}). If possible also reduce beaming-computation time. -@strong{必須スキル:} MusicXML, Python, 基本的な LilyPond の知識 +@strong{Difficulty:} medium +@strong{Requirements:} C++, experience with writing heuristics +@strong{Recommended knowledge:} aesthetic sense +@strong{Potential Mentors:} Mike Solomon (not available for GSoC 2016), +Carl Sorensen -@strong{メンター:} Reinhold Kainhofer, Mike Solomon +@divEnd -他の楽譜ライターの経験 (クロス テストのために) があると尚良しです。 +@divClass{column-center-middle-color3} +@subheading Allow spanners to cross voices -@subheading スラーとタイの改良 +Currently all sorts of spanners (ties, slurs, dynamics, text spanners, +trills etc.) have to be ended in the context they were started. However, +this doesn't reflect the reality of notation in most polyphonic settings. +Awkward workarounds with hidden voices are currently necessary to achieve +cross-voice spanners. -スラーとタイのデフォルトのカーブ形状はしばしば満足いかないものです。@c -同音異名の音符間のタイ (@code{@{ cis'~ des' @}}) はサポートされておらず、@c -音部記号や譜の変更によって「中断」されるタイのサポートも十分ではありません。@c -このプロジェクトでは、不満足な出力例を収集、ソートして、どのような出力に@c -するかを決定して実際にコードを記述します。 +New ways of addressing this issue should be explored, for example by -@strong{難易度:} 高 +@divClass{keep-bullets} +@itemize -@strong{必須スキル:} C++, 試行錯誤によるコード記述の経験 +@item specifying a “target context” where the end of the spanner is +expected -@strong{推奨スキル:} LilyPond の知識, 美的感覚 +@item explicitly specifying the ending object with an ID -@strong{メンター:} Mike Solomon +@end itemize +@divEnd -@subheading フォント図柄の特殊な変体を追加する +This feature would solve many problems that are commonly faced with +piano music and combined parts. -譜上の線、譜間の線、いくつかの図柄 (例えば臨時記号) を短く幅を縮めたものを@c -追加して、それらをサポートするための一般的なインフラを整備します。@c -使用例には古代記譜法の breve (全音符の 2 倍の長さ) の符頭があり、@c -これには符頭の穴が小さいものと大きいものの 2 つの変体があります。 +@strong{Difficulty:} medium (?) +@strong{Requirements:} C++, Scheme +@strong{Potential Mentor:} Urs Liska +@divEnd -@strong{難易度:} 低 +@divClass{column-center-middle-color3} +@subheading Help improve compilation behavior -@strong{必須スキル:} MetaFont, C++, 細部を確認できる眼力 +Automatic code analysis tools, like valgrind memory leak detection or +callgrind code profilers, provide valuable information about possible +flaws in our C++ code. Cleaning up warnings would allow us to automate +the rejection of any patch which introduced extra warnings. -@strong{推奨スキル:} 基本的な LilyPond の知識 +@strong{Difficulty:} medium +@strong{Requirements:} C++ +@strong{Potential Mentors:} Reinhold Kainhofer (not available for GSoC +2016), Joe Neeman -@strong{メンター:} Werner Lemberg +@divEnd -@subheading 連桁の改良 +@divClass{column-center-middle-color3} +@subheading MusicXML -連桁 (通常、譜をまたぐ、中断する、符幹が上下に突き出る連桁) のデフォルトの@c -配置を改良する必要があります。@c -連桁はコンテキストと付近の音符に依存します -(@uref{http://icking-music-archive.org/lists/sottisier/sottieng.pdf, -この PDF のセクション 2.2} を参照してください)。@c -可能であれば、連桁の算出時間を削減してください。 +Improving MusicXML import and export functions: -@strong{難易度:} 中 +@divClass{keep-bullets} +@itemize -@strong{必須スキル:} C++, 試行錯誤によるコード記述の経験 +@item +Handle basic musical content export like the MIDI export (i.e. using +dedicated exporter classes, derived from the translator class). -@strong{推奨スキル:} 美的感覚 +@item +Build the XML tree of the basic musical content, add a connection from +music event to XML tag. -@strong{メンター:} Mike Solomon, Carl Sorensen +@item +Let all LilyPond engravers do their job. -@subheading 様々なコンパイル警告のクリーン アップ +@item +Link each output object (i.e. each stencil or group of stencils) to the +music cause (and thus to the XML tag in the XML tree). -コンパイラ、静的コード分析、それに valgrind の警告をクリーン アップして@c -ください。@c -自動コード分析ツール (@code{g++} と @code{clang} の警告)、valgrind メモリ -リーク検出、それに callgrind コード プロファイラは C++ コードの欠陥に@c -ついての有用な情報を提供してくれます。@c -これらの警告をクリーン アップすることで、警告を発生させるパッチを自動的に@c -拒絶することが可能になります。 +@item +Add an XML output backend, which can then add layout information for +each output object to the XML tags. + +@end itemize +@divEnd + +There are several possibilities for this project, including building upon +the MusicXML export project from GSoC 2015. -@strong{難易度:} 中 +@strong{Difficulty:} medium +@strong{Requirements:} MusicXML, Python, Scheme, basic LilyPond knowledge +@strong{Potential Mentors:} Reinhold Kainhofer, Mike Solomon (both not +available for GSoC 2016) -@strong{必須スキル:} C++ +Familiarity with other scorewriters (for cross-testing) would also help. -@strong{メンター:} Joe Neeman, Reinhold Kainhofer +@divEnd + +@divClass{column-center-middle-color3} +@subheading Improve slurs and ties + +The engraving quality of slurs and ties is often unsatisfactory. Ties +@q{broken} by clef or staff changes are not handled well. The project +could include collecting and sorting examples of bad output, deciding on +the intended output and writing code to improve them. + +@strong{Difficulty:} hard +@strong{Requirements:} C++, experience with writing heuristics +@strong{Recommended knowledge:} LilyPond knowledge, aesthetic sense +@strong{Potential Mentors:} Mike Solomon, Janek Warchoł (both not available for +GSoC 2016) @divEnd @@ -1051,7 +1155,7 @@ XML 出力のバックエンドを追加します。@c @divEnd @divClass{column-right-top} -@subheading 以前のの開発チーム +@subheading 以前の開発チーム @divClass{keep-bullets} @developersPrevious @@ -1123,6 +1227,18 @@ XML 出力のバックエンドを追加します。@c @divEnd @divEnd +@node 謝辞 +@unnumberedsec 謝辞 +@translationof Acknowledgements + +@divClass{column-center-top} +@subheading 謝辞 + +@divClass{keep-bullets} +@acknowledgementsCurrent +@divEnd +@divEnd + @node 出版物 @unnumberedsec 出版物 @@ -1156,7 +1272,7 @@ XML 出力のバックエンドを追加します。@c @translationof Old news @divClass{heading-center} -@warning{多くの古いアナウンスと変更履歴が @ref{Attic} で見つかります。} +@warning{多くの古いアナウンスと変更履歴が @ref{物置} で見つかります。} @divEnd @include web/news-front.itexi @@ -1172,7 +1288,8 @@ XML 出力のバックエンドを追加します。@c @subheading アナウンス バージョン毎のアナウンスとニュース: -@uref{http://lilypond.org/doc/v2.14/Documentation/web/index#LilyPond-2_002e14_0-released_0021-June-6_002c-2011,v2.14}, +@uref{http://lilypond.org/doc/v2.16/Documentation/web/index#Lilypond-2_002e16_002e0-released_0021-August-24_002c-2012-1,v2.16}, +@uref{http://lilypond.org/doc/v2.14/Documentation/web/index#LilyPond-2_002e14_002e0-released_0021-June-6_002c-2011,v2.14}, @miscLink{announce-v2.12,v2.12}, @miscLink{announce-v2.10,v2.10}, @miscLink{announce-v2.8,v2.8}, @@ -1185,6 +1302,7 @@ XML 出力のバックエンドを追加します。@c @miscLink{ANNOUNCE-0.1,v0.1} バージョン毎の変更についての説明リスト: +@uref{http://lilypond.org/doc/v2.16/Documentation/changes/index.html,v2.16}, @uref{http://lilypond.org/doc/v2.14/Documentation/changes/index.html,v2.14}, @uref{http://lilypond.org/doc/v2.12/Documentation/topdocs/NEWS,v2.12}, @uref{http://lilypond.org/doc/v2.10/Documentation/topdocs/NEWS,v2.10}, @@ -1200,6 +1318,23 @@ XML 出力のバックエンドを追加します。@c @divEnd +@divClass{column-center-bottom} +@subheading 感謝 + +開発者、貢献者、バグ発見者および提案に感謝します +@miscLink{THANKS-2.16,v2.16}, +@miscLink{THANKS-2.14,v2.14}, +@miscLink{THANKS-2.12,v2.12}, +@miscLink{THANKS-2.10,v2.10}, +@miscLink{THANKS-2.8,v2.8}, +@miscLink{THANKS-2.6,v2.6}, +@miscLink{THANKS-2.4,v2.4}, +@miscLink{THANKS-2.2,v2.2}, +@miscLink{THANKS-2.0,v2.0}, +@miscLink{THANKS-1.8,v1.8} + +@divEnd + @divClass{column-center-bottom} @subheading 変更履歴 diff --git a/Documentation/ja/web/download.itexi b/Documentation/ja/web/download.itexi index 70abe07a41..f9a8257c34 100644 --- a/Documentation/ja/web/download.itexi +++ b/Documentation/ja/web/download.itexi @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*- @ignore - Translation of GIT committish: 8e9d9bb49f057ab81be830a5ac16714490130393 + Translation of GIT committish: 7215236a0a49dd112348d2620fa132f7e5f12aff When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c Translators: Yoshiki Sawada +@c Translators: Masamichi Hosoda, Yoshiki Sawada @include included/generating-output.itexi @@ -23,7 +23,7 @@ LilyPond をダウンロードする前に、@ref{テキスト入力} を読ん @divClass{heading-center} @ifclear web_version - @c yes, we want verisonDevel here, since the online links + @c yes, we want versionDevel here, since the online links @c for @version won't be up yet! @heading Downloads for LilyPond @versionDevel @@ -42,6 +42,7 @@ LilyPond をダウンロードする前に、@ref{テキスト入力} を読ん @divClass{column-left-top} @subheading ユーザ向け +@c For users @itemize @@ -49,7 +50,7 @@ LilyPond をダウンロードする前に、@ref{テキスト入力} を読ん @c ref is duplicated to avoid underlining ref as image. @ref{Unix, @sourceimage{logo-linux,,,} @sourceimage{logo-freebsd,,,}} -@ref{Unix, Unix (Linux や FreeBSD)} +@ref{Unix, Unix (GNU/Linux や FreeBSD)} @item @ref{MacOS X, @sourceimage{logo-macosx,,,}} @@ -65,6 +66,7 @@ LilyPond をダウンロードする前に、@ref{テキスト入力} を読ん @divClass{column-right-top} @subheading 開発者向け +@c For developers @itemize @@ -84,26 +86,32 @@ LilyPond をダウンロードする前に、@ref{テキスト入力} を読ん @divEnd - -@divClass{column-center-bottom} +@divClass{column-center-middle-color2} @subheading ソフトウェア ライセンス +@c Software License LilyPond は @ref{GPL, GNU General Public License} に基づいて 公開されています。 @divEnd -@divClass{color1} +@divClass{column-center-bottom} @subheading スポンサー +@c Sponsors + 通信帯域を提供してくれている @uref{http://www.vt.edu/, Virgina Tech} と @uref{http://www.linuxaudio.org/, linuxaudio.org} に深謝します。 @sourceimage{VTlogo_ITF,,,} @sourceimage{lao_banner_06_on_white_demo,,,} +@divEnd + +@divClass{column-center-bottom} @subheading 法律用語 +@c Legalese @divClass{legal} すべてのロゴと製品イメージには著作権があり、商標登録されています。 @@ -144,23 +152,23 @@ LilyPond は @ref{GPL, GNU General Public License} に基づいて @subheading 一般パッケージ?それともディストリビューション専用パッケージ? @c Generic Packages or Distribution-Specific Packages? -多くのディストリビューションは、通常パッケージに LilyPond を含めています。@c -そのようなバージョンは一般パッケージよりも@c -容易にインストール/アンインストールできますが、@c -古いバージョンである可能性があります。@c -一般パッケージを使いたければ、@c -お使いのディストリビューションのパッケージ マネージャを用いて、@c -システムから公式バージョンをアンインストールしてください。@c -お使いのディストリビューションのパッケージ マネージャの使い方については、@c -そのディストリビューションのドキュメントを参照してください。 +多くのディストリビューションは、通常パッケージに LilyPond を含めていますが、@c +現在の安定バージョンより、かなり古いことがあります。@c +こういった古いパッケージをインストールする方が簡単かもしれませんが、@c +我々の一般パッケージを使うことを @emph{強く} お勧めします。@c +この場合、LilyPond エディタが@c +正しいバージョンを使っていることを確認してください。 +@ref{より簡単な編集手段} を見てください。 @divEnd @divClass{column-left-top} @subheading 一般パッケージ +@c Generic Packages @subsubheading ダウンロード +@c Download @itemize @@ -172,12 +180,12 @@ LilyPond は @ref{GPL, GNU General Public License} に基づいて @ifset web_version @downloadStableLinuxNormal @end ifset - -(迷っているのなら、こちらを使ってください) +32bit システム @item @sourceimage{logo-linux,,,} @downloadStableLinuxBig +64bit システム @item @sourceimage{logo-linux,,,} @@ -186,15 +194,18 @@ LilyPond は @ref{GPL, GNU General Public License} に基づいて @item @sourceimage{logo-freebsd,,,} @downloadStableFreeBSDNormal +32bit システム @item @sourceimage{logo-freebsd,,,} @downloadStableFreeBSDBig +64bit システム @end itemize @subsubheading インストール +@c Install シェルで、以下を入力してください: @@ -204,6 +215,7 @@ sh lilypond-@versionStable{}-OS-TYPE.sh @end example @subsubheading アンインストール +@c Uninstall シェルで、以下を入力してください: @@ -212,6 +224,7 @@ uninstall-lilypond @end example @subsubheading ヘルプを表示する +@c Help シェルで、以下を入力してください: @@ -222,55 +235,19 @@ sh lilypond-@versionStable{}-OS-TYPE.sh --help @divEnd + @divClass{column-right-top} @subheading ファイルをコンパイルする +@c Compiling a file @lilypadCommandLine @divEnd -@divClass{column-left-top} -@subheading ディストリビューション専用パッケージ -@c Distribution-specific Packages - -これらのバージョンをインストール、あるいはアップグレードする場合、@c -お使いのディストリビューションのパッケージ マネージャを使ってください。 - -@itemize - -@item -@sourceimage{logo-fedora,,,} -@uref{http://koji.fedoraproject.org/koji/packageinfo?packageID=2447, -Fedora: LilyPond 2.14.2} - -@item -@sourceimage{logo-ubuntu,,,} -@uref{http://packages.ubuntu.com/search?keywords=lilypond, -Ubuntu: LilyPond 2.14.2} - -@item -@sourceimage{logo-slackware,,,} -@uref{http://www.johannes-schoepfer.de/lilypond/, -Slackware: LilyPond 2.14.2} - -@item -@sourceimage{logo-debian,,,} -@uref{http://packages.debian.org/search?keywords=lilypond, -Debian: LilyPond 2.12.3} - -@item -@sourceimage{logo-suse,,,} -@uref{http://software.opensuse.org/search?baseproject=openSUSE%3A11.2&p=1&q=lilypond, -openSUSE: LilyPond 2.12.3} - -@end itemize - -@divEnd - - @divClass{column-center-bottom} @subheading 法律用語 +@c Legalese @divClass{legal} すべてのロゴと商品イメージには著作権があり、商標登録されています。 @@ -293,8 +270,10 @@ openSUSE: LilyPond 2.12.3} @divClass{column-left-top} @subheading パッケージ +@c Packages @subsubheading ダウンロード +@c Download @itemize @@ -303,42 +282,37 @@ openSUSE: LilyPond 2.12.3} @downloadStableDarwinNormal Intel CPU の MacOS X 10.4 以上用 (迷っているのなら、こちらを使ってください) -MacOS X 10.7 Lion はまだサポートしていません。 @item @sourceimage{logo-macosx,,,} @downloadStableDarwinPPC G3 と G4 CPU の MacOS X 10.4 以上用 (古い Apple コンピュータ) -MacOS X 10.7 Lion はまだサポートしていません。 @end itemize @subsubheading インストール +@c Install ダウンロードしたファイルをダブルクリックして、@c それをお好みの場所にドラッグしてください。 @subsubheading アンインストール +@c Uninstall LilyPond.app フォルダを削除してください。 @divEnd -@divClass{column-right-top} -@subheading ファイルをコンパイルする - -@lilypadOSX - -@divEnd - -@divClass{column-left-top} +@divClass{column-right-top} @subheading コマンドラインから実行する +@c Running on the command-line @warning{GUI 環境の方を好むのであれば、以下の説明は無視してください。} @subsubheading MacOS X のコマンドライン +@c MacOS X on the command line lilypond スクリプトを実行する最も簡便な方法は、@c あなた自身の @qq{ヘルパー} スクリプトをセットすることです。 @@ -397,6 +371,7 @@ export PATH=$PATH:~/bin @subsubheading 個々のスクリプトを呼び出す +@c Invoking individual scripts スクリプト -- @command{lilypond-book}, @command{convert-ly}, @command{abc2ly}, @@ -419,8 +394,18 @@ export PATH=$PATH:~/bin @divEnd +@divClass{column-center-top} +@subheading ファイルをコンパイルする +@c Compiling a file + +@lilypadOSX + +@divEnd + + @divClass{column-center-bottom} @subheading 法律用語 +@c Legalese @divClass{legal} すべてのロゴと商品イメージには著作権があり、商標登録されています。 @@ -442,19 +427,22 @@ export PATH=$PATH:~/bin @divClass{column-left-top} @subheading パッケージ +@c Packages @subsubheading ダウンロード +@c Download @itemize @item @sourceimage{logo-windows,,,} @downloadStableWindows -Windows ME, NT, 2000, XP, Vista それに 7 用 +Windows 2000, XP, Vista, Windows 7 それに 8 用 @end itemize @subsubheading インストール +@c Install @enumerate @@ -469,6 +457,7 @@ Windows ME, NT, 2000, XP, Vista それに 7 用 @end enumerate @subsubheading アンインストール +@c Uninstall アンインストールする方法は 2 つあります -- @@ -489,19 +478,13 @@ LilyPond までスクロールして、@qq{削除} ボタンをクリックし @divClass{column-right-top} -@subheading ファイルをコンパイルする - -@lilypadWindows - -@divEnd - - -@divClass{column-left-top} @subheading コマンドラインから実行する +@c Running on the command-line @warning{GUI 環境の方を好むのであれば、以下の説明は無視してください。} @subsubheading Windows のコマンドライン +@c Windows on the command line LilyPond を実行する最も簡便な方法は、@c LilyPond 実行可能のファイルを保持しているフォルダを、@c @@ -509,7 +492,6 @@ LilyPond 実行可能のファイルを保持しているフォルダを、@c @enumerate - @item コントロール パネルの @qq{システム} を開き、@c @qq{詳細設定} タブを選択し、@qq{環境変数} ボタンをクリックします。 @@ -525,7 +507,10 @@ LilyPond 実行可能のファイルを保持しているフォルダを、@c [@var{既存の Path}];@var{DIR}\LilyPond\usr\bin @end example -@warning{@var{DIR} は、一般には @code{C:@bs{}Program Files} です。} +@warning{@var{DIR} は、一般的に 64 bit システムでは +@code{C:@bs{}Program Files (x86)} +、32 bit システムでは +@code{C:@bs{}Program Files} です。} @noindent @qq{OK} ボタンをクリックしてウィンドウを閉じます。 @@ -533,6 +518,7 @@ LilyPond 実行可能のファイルを保持しているフォルダを、@c @end enumerate @subsubheading 個々の実行可能ファイルを呼び出す +@c Invoking individual executable files lilypond, lilypond-book, convert-ly などの LilyPond 実行可能ファイルを@c コマンドラインから呼び出すことによって、実行することができます: @@ -544,8 +530,18 @@ lilypond test.ly @divEnd +@divClass{column-center-top} +@subheading ファイルをコンパイルする +@c Compiling a file + +@lilypadWindows + +@divEnd + + @divClass{column-center-bottom} @subheading 法律用語 +@c Legalese @divClass{legal} すべてのロゴと製品イメージには著作権があり、商標登録されています。 @@ -576,15 +572,17 @@ lilypond test.ly @downloadStableSource{} 新旧すべてのバージョンは、@c -@uref{http://download.linuxaudio.org/lilypond/binaries/,ダウンロード サイト} +@uref{http://download.linuxaudio.org/lilypond/source/?C=N;O=D, +download site} でリストアップされています。 @divEnd @divClass{column-right-bottom} @subheading コンパイル方法 +@c Compiling instructions -コンパイル方法は @rcontrib{Compiling LilyPond} に記載されています。 +コンパイル方法は @rcontrib{Compiling} に記載されています。 @divEnd @@ -599,6 +597,7 @@ lilypond test.ly @divClass{column-center-top} @subheading すべてのバージョン +@c All versions 新旧すべてのバージョンは、@c @uref{http://download.linuxaudio.org/lilypond/binaries/,ダウンロード サイト} diff --git a/Documentation/ja/web/introduction.itexi b/Documentation/ja/web/introduction.itexi index f717af2071..7fa0d615ae 100644 --- a/Documentation/ja/web/introduction.itexi +++ b/Documentation/ja/web/introduction.itexi @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*- @ignore - Translation of GIT committish: 3573a92d92728dc8d6452e5cd3cfba73e49e6990 + Translation of GIT committish: 7215236a0a49dd112348d2620fa132f7e5f12aff When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c Translators: Yoshiki Sawada, Yoshinobu Ishizaki +@c Translators: Masamichi Hosoda, Yoshiki Sawada, Yoshinobu Ishizaki @node 導入部 @unnumbered 導入部 @@ -15,6 +15,7 @@ @divClass{column-center-top} @subheading 我々のゴール +@c Our Goal @imageFloat{flat-design,png,right} @@ -24,18 +25,22 @@ LilyPond のきっかけは2人の音楽仲間がコンピュータで印刷し それなら、我々プログラマーは美しい楽譜を作り出すソフトウェアを@c 作ることはできないでしょうか? -答えは、音楽家をレイアウトの細かな問題から解放し、@c -音楽に集中できるようにするシステムです。@c -LilyPond は、@c -音楽家が伝統的な手法で製作された出版物レベルの品質を持つ楽譜を@c -作成することを可能にします。 +答えは、伝統的な手法に従った美しい楽譜を作り出すプログラムです。@c +レイアウトの細かな問題をプログラムで処理することにより、@c +作曲者、編曲者、出版社がソフトウェアの出力を調整して@c +見栄えを良くすることよりも、@emph{音楽} に集中できるようにします。@c +演奏者は音楽を @emph{読む} ことよりも、 +@emph{演奏} に集中できるようになります。 + @divEnd +@divClass{link-headings} + @divClass{column-left-top} @subheading LilyPond の機能 +@c What LilyPond does -@c ここから @itemize @item @@ -55,7 +60,7 @@ LilyPond は、@c @divClass{column-right-top} @subheading LilyPond の使用例 - +@c LilyPond in use @itemize @item @@ -70,7 +75,6 @@ LilyPond は、@c @divClass{column-center-bottom} @subheading LilyPond の使い方 @c How LilyPond works - @itemize @item @@ -82,6 +86,8 @@ LilyPond は、@c @end itemize @divEnd +@divEnd + @c TRANSLATORS, translations are not yet compiled in Info format, so @c it's not worth translating the right column of the following @c menu. -JM @@ -103,11 +109,10 @@ LilyPond は、@c @node 特徴 @unnumberedsec 特徴 @translationof Features - @divClass{column-center-top} -@subheading 優美 -@subsubheading すぐれた伝統的な譜刻 + +@subheading すぐれた伝統的な譜刻 @c Excellent classical engraving @imageFloat{flat-design,png,right} @@ -123,32 +128,67 @@ LilyPond の出力は、最高の職人によって作られた伝統的な楽 これらのことについて、@ref{エッセー} でさらに説明しています。 -@subsubheading 効果的なレイアウト機能 -@c Effective layout choices +@divEnd -出力の調整に時間を無駄にするのは止めましょう。@c -LilyPond は最初から正しいフォーマットで出力します。@c -緻密で統一のとれたレイアウトになるよう、スペースを自動的に決定し、@c -改行、改ページを行います。@c -歌詞、音符、和音の衝突回避、それにスラーや連桁の傾きは自動的に行われます! +@divClass{column-center-top} +@subheading テキスト入力 +@c Text input -@divEnd +@subsubheading すべてが明快 +@c Everything is explicit + +LilyPond は楽譜 @emph{コンテンツ} に関するすべての情報を含み、@c +誰にでも、また他のプログラムでも簡単に読むことのできる、@c +テキスト入力を処理します。@c +メニューやバイナリファイルに隠された不明瞭な設定はありません。 + +@ref{テキスト入力} のコンセプトをもっと読む。 + + +@subsubheading 堅牢で追跡可能な微調整 +@c Tweaks are robust and traceable + +レイアウトを微調整した場合、人間が読める形で明快に見えるため、@c +いつでも何をしたのか、たどることができます。@c +誤って何かを壊してしまった場合でも、@c +@emph{元に戻す} 機能のなすがままに頼ることなく、@c +簡単に元に戻したり修正したりすることができます。 + + +@subsubheading テキストファイルは障害に強く、将来性があります +@c Text files are failure- and future-proof + +テキストファイルは破損に対して非常に堅牢です。@c +人間が読むこともでき、ファイルを作成したプログラムが使えなくても、@c +いつでも解釈できます。 + + +@subsubheading 楽譜をバージョン管理 +@c Manage your scores with version control +テキストファイルはバージョン管理システムで管理できます。@c +楽譜の変更履歴がすべて記録でき、@c +無限に選べる「元に戻す」「やり直す」機能 @c +を使うことができます。@c +新しいコラボレーションの方法にもなるでしょう。 -@divClass{color2} +@divEnd + +@divClass{column-center-top} @subheading 使いやすさ +@c Usability @imageFloat{lilypond-book,png,right} -@subsubheading テキスト ベース入力 -@c Text-based input -LilyPond は ASCII 入力を受け付けます。@c -これは、お好みのテキスト エディタで素早く、快適に作成することができます。@c -マウスを使うわずらわしさはありません。@c -入力にはすべての情報が保持されるため、@c -複雑なコマンドの羅列を覚える必要はありません。@c -後で参照するために、入力を保存しておけば良いだけです。@c +@subsubheading 効果的なレイアウト機能 +@c Effective layout choices + +出力の調整に時間を無駄にするのは止めましょう。@c +LilyPond は最初から正しいフォーマットで出力します。@c +緻密で統一のとれたレイアウトになるよう、スペースを自動的に決定し、@c +改行、改ページを行います。@c +歌詞、音符、和音の衝突回避、それにスラーや連桁の傾きは自動的に行われます! @subsubheading 楽譜と文章の混合 @@ -156,10 +196,12 @@ LilyPond は ASCII 入力を受け付けます。@c 画像のカット&ペーストをせずに、 楽譜の断片をテキストに入れることができます。@c -LaTeX や HTML に楽譜を垣根無く統合できますし、@c -OOoLilyPond を使えば OpenOffice.org に楽譜を追加することも出来ます。@c +@LaTeX{} や HTML に楽譜を垣根無く統合できますし、@c +OOoLilyPond を使えば OpenOffice.org や LibreOffice に@c +@uref{http://extensions.services.openoffice.org/en/project/OOoLilyPond,OOoLilypond}で@c +楽譜を追加することも出来ます。@c LilyPond のコードを様々なブログ、Wiki で使用可能にする@c -プラグインがあります。@c +プラグインがあり、オンラインでコラボレーションできます。@c @subsubheading アクセス性 @@ -171,60 +213,116 @@ LilyPond のコードを様々なブログ、Wiki で使用可能にする@c 音声認識ソフトウェアを使って、LilyPond ファイルを編集することができます。@c 盲目のユーザでさえも、読み上げソフトウェアを使って、@c LilyPond ファイルを記述することができます --- これは、グラフィカル ベースの楽譜作成プログラムでは不可能なことです。 +-- これは、グラフィカル ベースの楽譜作成プログラムでは不可能なことです。@c +壮観な楽譜の @ref{例} を見てください。 + +@subsubheading 多様な編集方法 +@c Editor diversity + +自身が活発な LilyPond ユーザである開発者の何人かは、@c +LilyPond ファイルの編集プロセスをより早く、より効率的に行うための@c +ツールを作っています。@c +一つのユーザインタフェースに縛られていないので、@c +異なるタスクのために様々なツールを使うことができます。@c +自宅では本格的な LilyPond エディタを使い、@c +外出先では携帯電話のメモ帳アプリを使ってファイルを編集することができます。@c +@ref{より簡単な編集手段} で例を挙げます。 +@c TODO: Change this when the new pages have been written and pushed + +@divEnd + +@divClass{column-center-top} -@subsubheading 拡張性の高い設計 +@subheading 拡張性の高い設計 @c Extensible design +@subsubheading スタイルシートによる簡単な管理 +@c Easy management of style sheets + すべての設定は、個人的な写植上の好みに合わせて変更可能です。@c -仮にそれが不十分な場合でも、強力な LISP 言語の変種である@c -組込みのスクリプト言語 Scheme があります。@c -全てはの設定、変数、それに関数は、 +だから、簡単に LilyPond のデフォルトのあらゆる側面を変更する@c +スタイルシートを作ることができます。@c +スタイルシートもテキストであり、複数別々に保存できるので、@c +単にスタイルシートを切り替えるだけで、@c +完全に異なる外観やレイアウトの楽譜を生成することができます。@c +A4用紙に総譜を印刷し、プロジェクターでは1スライドに1段投影したい?@c +LilyPond のレイアウトエンジンは難なく同じ入力から両方を生成できます。 + +@subsubheading あなた自身の機能を追加 +@c Add your own functions + +仮にそれが不十分な場合でも、LilyPond 自身と同じレベルで LilyPond の@c +レイアウトエンジンにアクセスできる内蔵スクリプト言語 Scheme を@c +常に使うことができ、@emph{とても} 強力なツールにできます。@c +全ての設定、変数、それに関数は、@c 広範囲に亘るプログラム リファレンス マニュアルの中に@c ドキュメント化されています。 +@subsubheading プログラムで楽譜を処理 +@c Process scores programmatically + +LilyPond の入力ファイルは、プログラムやスクリプトで完全に編集でき、@c +生成することもできます。@c +これは例えばアルゴリズムで作曲することもできます。@c +分析のために音楽コンテンツにアクセスしたり、@c +データベースで入力の断片を管理することもできます。@c +想像できる限り制限はありません。 + +@subsubheading LilyPond を使った新しいツールを作る +@c Create new tools using LilyPond + +LilyPond は一つの GUI プログラムではなく、コマンドラインツールなので、@c +他のアプリケーションの中から使うこともできます。@c +この方法で、@c +Web アプリケーションに LilyPond の譜刻機能を持たせることができます。@c +LilyPond を使ったオンラインツールがいくつかあります。 + +@c (TBD: Add a link to the new @ref{Applications} page. + + @divEnd -@divClass{color3} +@divClass{column-center-top} @subheading 環境 +@c Environment -@subsubheading フリー ソフトウェア -@c Free software - -LilyPond は無料でダウンロードすることができます!@c -そうです -- 無料です。@c -ダウンロード ページから入手してください。 +@imageFloat{frescobaldi-lilypond-editor-small,png,right} -LilyPond は (口語的な意味でも) フリーなソフトウェアです。@c -ソース コードが公開されており、変更もコピーも認められています。@c -ですから、バグにいらいらしていたり、仕様面で不満があるのなら、@c -自分でそれを追加したり、他の人にそれを注文することが出来ます。 @subsubheading 素晴らしいサポート @c Excellent support LilyPond は一般的なプラットフォーム全て -(GNU/Linux, MacOS, そして Windows) で動きます。 +(GNU/Linux, MacOS, そして Windows) で動きます。@c LilyPond には広範囲のドキュメントと数百の実例ファイルが付属します。@c Lilypond ユーザー メーリング リストで質問に答えてくれる@c -活発なユーザ コミュニティがありますし、@c -開発チームは問題が早期に解決されるよう活動しています。 +活発なユーザ コミュニティがあります。@c +開発チームは問題が早期に解決されるよう活動しています。@c +通常はすぐに回答がありますし、しばしば報告された問題に対する@c +鮮やかな解決策が開発されます。@c +開発チームの密接な対応のおかげで、そのような解決策はきちんと LilyPond へ@c +取り込まれます。@c +@ref{コミュニティ} についてもっと読む。 -@subsubheading Enhanced editors +@subsubheading フリー ソフトウェア +@c Free software -自身が活発な LilyPond ユーザである開発者の何人かは、@c -LilyPond ファイルの編集プロセスをより早く、より効率的に行うための@c -ツールを作っています。@c -@ref{より簡単な編集手段} で例を挙げます。 +LilyPond は無料でダウンロードすることができます!@c +そうです -- 無料です。@c +ダウンロード ページから入手してください。 + +LilyPond は (口語的な意味でも) フリーなソフトウェアです。@c +ソース コードが公開されており、変更もコピーも認められています。@c +ですから、バグにいらいらしていたり、仕様面で不満があるのなら、@c +自分でそれを追加したり、他の人にそれを注文することが出来ます。 +@ref{自由} についてもっと読む。 @divEnd @divClass{column-center-bottom} - - @subheading どうですか? @c Where now? @@ -240,22 +338,29 @@ LilyPond を試してみる決心がついたのなら、@c @unnumberedsec 例 @translationof Examples +@divClass{column-center-top} + +@subheading 美しい例 +@c Beautiful examples + LilyPond は、いかなる種類の譜刻にも対応できる、@c 強力で、自由度の高いツールです。@c 我々の楽譜ギャラリーを見て、楽譜の多様さ、美しさを実感してください! +@divEnd -@newsItem -@subsubheading クラシック音楽 +@divClass{column-center-middle-color2} +@subheading クラシック音楽 +@c Classical Music この J. S. Bach 作のオルガン曲の楽譜は、@c LilyPond の象徴的な例です。 @exampleImage{bach-bwv610} -@newsEnd +@divEnd -@newsItem -@subsubheading 複雑な楽譜 +@divClass{column-center-middle-color2} +@subheading 複雑な楽譜 @c Complex Notation @c 保留 @@ -264,20 +369,20 @@ LilyPond の象徴的な例です。 より高度な写植機能を示しています。 @exampleImage{granados} -@newsEnd +@divEnd -@newsItem -@subsubheading 古楽 +@divClass{column-center-middle-color2} +@subheading 古楽 @c Early Music LilyPond は、以下のグレゴリオ聖歌のパッセージのような、@c さまざまなタイプの古楽もサポートします。 @exampleImage{ancient-headword} -@newsEnd +@divEnd -@newsItem -@subsubheading 現代音楽 +@divClass{column-center-middle-color2} +@subheading 現代音楽 @c Modern Music 現代音楽の作曲家は、@c @@ -286,11 +391,11 @@ LilyPond が標準的でない楽譜を扱うのに適していることを見 抜粋を示します。 @exampleImage{cary} -@newsEnd +@divEnd -@newsItem -@subsubheading 効率的に、自由に演奏資料を作り出します +@divClass{column-center-middle-color2} +@subheading 効率的に、自由に演奏資料を作り出します 同じソース コードからさまざまな演奏資料を作り出すことができます。@c 以下は、@uref{http://nicolas.sceaux.free.fr/,Nicolas Sceaux} が @@ -303,33 +408,44 @@ Handel の @emph{Giulio Cesare} を譜刻したものの抜粋から、@c @exampleImage{sesto-violin} -@newsEnd +@divEnd -@newsItem -@subsubheading タブ譜 +@divClass{column-center-middle-color2} +@subheading タブ譜 @c Tablature -@c ここから LilyPond はタブ譜をサポートします。@c 楽器に合わせてカスタマイズすることが可能です。@c タブ譜は、五線譜用に記述された音符から自動的に生成されます。 @exampleImage{tab-example} -@newsEnd +@divEnd -@newsItem -@subsubheading Schenker Graphs +@divClass{column-center-middle-color2} +@subheading Schenker Graphs 標準出力に様々な変更を加えることができます。@c @uref{http://www.linuxjournal.com/article/8364 , Linux Journal} に掲載された Kris Schaffer が作成したみごとな Schenkerian 分析を@c -示します。 +示します。@c +見やすくするために色を追加しました。 @exampleImage{bach-schenker} -@newsEnd +@divEnd + +@divClass{column-center-middle-color2} +@subheading カスタマイズ +@c Customized Output + +LilyPond のカスタマイズ能力を示すため、 +Stockhausen の Klavierstück II からの短い抜粋です。 + +@exampleImage{Stockhausen_Klavierstueck2} +@divEnd -@newsItem -@subsubheading 声楽 +@divClass{column-center-middle-color2} +@subheading 声楽 +@c Vocal Music LilyPond は聖歌からオペラまですべての種類の声楽に対して卓越した@c 性能を発揮します。@c @@ -341,19 +457,21 @@ Lilypond はこれをすっきりと処理します 符幹、ある特定の音符グループ上の連結線ににも注目してください。 @exampleImage{aucun-snippet} -@newsEnd +@divEnd -@newsItem -@subsubheading 教育 +@divClass{column-center-middle-color2} +@subheading 教育 +@c Educational Applications LilyPond は教育を目的とした使用にも適しています。@c ちょっとした対位法の問題例を挙げます。 @exampleImage{theory} -@newsEnd +@divEnd -@newsItem -@subsubheading ポピュラー音楽 +@divClass{column-center-middle-color2} +@subheading ポピュラー音楽 +@c Popular Music メロディー、歌詞、コード名、フレットボードを持つ@c ポピュラー音楽のリード譜を簡単に作れます。@c @@ -362,18 +480,18 @@ LilyPond は教育を目的とした使用にも適しています。@c 状況に合わせて様々なカスタマイズを行うことができます。 @exampleImage{chart} -@newsEnd +@divEnd -@newsItem -@subsubheading Large Projects +@divClass{column-center-middle-color2} +@subheading 大きなプロジェクト +@c Large Projects LilyPond はオペラや交響楽団のような大きなプロジェクトにも非常に適しています。@c さらに、テキスト ベースの入力は高いアクセス性を提供します -- 以下の例は盲目の作曲家である Hu Haipeng によって作られた例です。 @exampleImage{orchestra} -@newsEnd - +@divEnd @divClass{column-center-bottom} @subheading どうですか? @@ -404,7 +522,7 @@ LilyPond は、すべての人にプログラムの修正、変更、拡張を @c @divClass{column-left-top} -@divClass{color2} +@divClass{column-center-middle-color2} @divClass{keep-bullets} @subheading ユーザにとっての利益は何なのか? @c What are the benefits to users? @@ -445,7 +563,7 @@ LilyPond にはこういったこととは無縁です。@c @c @divClass{column-right-top} -@divClass{color3} +@divClass{column-center-middle-color3} @divClass{keep-bullets} @subheading 何故 LilyPond の開発者たちはこのプログラムを無料にしておくのか? @c Why do LilyPond developers @qq{give away} their work for free? @@ -480,7 +598,7 @@ LilyPond にはこういったこととは無縁です。@c @item 経験: フリー ソフトウェア プロジェクトに貢献することは、@c -プログラミング、ドキュメントの記述、デザインを訓練するための@c +プログラミング、ドキュメントの記述・翻訳、デザインを訓練するための@c 素晴らしい方法です。@c この経験により、仕事の依頼を受けたり、奨学金を得た開発者もいます。 @@ -498,7 +616,6 @@ LilyPond にはこういったこととは無縁です。@c まだ迷っていますか?@c @ref{バックグラウンド} で我々の譜刻哲学についての広範囲な@c エッセーを読んでください。 -ちょっとした @ref{例} をいくつか見てください。@c LilyPond を試してみる決心がついたのなら、@c まず @ref{テキスト入力} を読んでください。 @divEnd @@ -514,10 +631,12 @@ LilyPond を試してみる決心がついたのなら、@c コンピュータ審美学 -- コンピュータで美しいものを作り出す手法 -- について記述した広範囲なエッセーがあります。 +これは、私たちの基本的なアイディアの深い議論に興味があるならば、@c +面白い読み物です。@c +分量があるので「マニュアル」で読むことができます。@c +今、このエッセーを読もうと思うのならば、@ref{エッセー} に進んでください。@c LilyPond についての簡単な紹介を望むのであれば、@c -このエッセーは大きすぎるでしょう。@c -今、このエッセーを読もうと思うのならば、@ref{エッセー} に進んでください。 - +今は飛ばしてください。 @divEnd @divClass{column-center-bottom} @@ -535,6 +654,16 @@ LilyPond を試してみる決心がついたのなら、@c @unnumberedsec 成果物 @translationof Productions +@divClass{column-center-top} + +@subheading LilyPond を使った成果物 +@c Productions using LilyPond + +ここでは、演奏や出版用楽譜といった成果物のため、@c +実際に LilyPond を使う人々について読むことができます。 + +@divEnd + @divClass{column-left-top} @subheading コンサート @@ -545,14 +674,60 @@ LilyPond で生成された楽譜は、世界中の演奏で使用されてい @itemize @item -Mussorgsky's @emph{Pictures at an exhibition}, re-orchestrated and +@uref{http://www.aurelienbello.com/,Aurélien Bello} has arranged a +version of Richard Strauss's @emph{Der Rosenkavalier} for four singers +and a chamber orchestra of thirteen players. This has been commissioned +by the Berlin Philharmonic Orchestra whose members will be the performers on +@uref{http://www.festspielhaus.de/veranstaltung/der-kleine-rosenkavalier-02-04-2015-1100/,April 2nd and 6th} +at the Festspielhaus, Baden-Baden, and on +@uref{http://www.berliner-philharmoniker.de/konzerte/kalender/details/21070/,April 26th} +in the @emph{Philharmonie (großer Saal)}, Berlin. We are pleased to see +musicians of such reputation playing from LilyPond scores -- and they are +reportedly very happy with them. + +Aurélien has also re-orchestrated @emph{Der Ring des Nibelungen} by Richard +Wagner to a +@uref{http://www.rsb-online.de/content/concerts/new-season-1516/family-concerts-age-7-and-above/index_eng.html,100-minute version for children}. +Written for a standard symphony orchestra, but with a reduced cast of +singers, it was performed by the +@uref{http://www.rsb-online.de/,@emph{Radio-Sinfonieorchester Berlin}} +in April 2014 at the Atze Musiktheater, Berlin. The Conductor was Heiko +Matthias Förster. + +@item +Joe Smeets created sheet music for the children's book @emph{Zing Mee} +(@emph{Sing along}) by Annie M.G. published by +@uref{http://www.queridokinderenjeugdboeken.nl/, Querido} +-- ISBN 9789045106205; +choir rehearsal scores for the Dutch translation of Benjamin Britten's +@emph{Saint Nicolas} performed by @emph{Muziektheater Hollands Diep} in +2011; +@uref{http://www.muziektheaterhollandsdiep.nl/nl/voorstellingen/sint_nicolaas_leeft, www.muziektheaterhollandsdiep.nl}. +He has also worked on the score and parts for an arrangement of +Moussurgsky’s @emph{Boris Godounov} for wind quartet, piano and +percussion which was performed in 2014, again by +@emph{Muziektheater Hollands Diep}. + +@item +A critical edition of Tommaso Traetta's @emph{Enea nel Lazio (1760)}, +opera series with libretto by Vittorio Amedeo Cigna-Santi, in four +parts: +@uref{http://www.academia.edu/1987651/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_1_4_, Part One} +@uref{http://www.academia.edu/1994533/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_2_4_, Part Two} +@uref{http://www.academia.edu/1994558/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_3_4_, Part Three} +@uref{http://www.academia.edu/1996242/Enea_nel_Lazio_opera_riformata_prima_lazione_poi_le_parole_-_Partitura_4_4_, Part Four} +Created by +@uref{http://unito.academia.edu/LucaRossettoCasel, Luca Rossetto Casel} +for his Ph.D. Thesis. + +@item +Mussorgsky's @emph{Pictures at an exhibition}, was re-orchestrated and conducted by @uref{http://www.aurelienbello.com/,Aurélien Bello} with -the @uref{http://www.junge-philharmonie-brandenburg.de/, -Junge Philharmonie Brandenburg} -on Oct 10 2011 and again on Apr 15-16 2012. +the @uref{https://junge-philharmonie-brandenburg.de/, +Junge Philharmonie Brandenburg} in October 2011 and April 2012. @item -@uref{http://www.kierenmacmillan.info/, Kieren MacMillan}, composer and +@uref{http://kierenmacmillan.info/, Kieren MacMillan}, composer and musical director. His many, recent works include; @emph{Go Thy Way}, performed by the @uref{http://www.saltlakechoralartists.org/, Salt Lake Choral Artists} in March 2012; The @@ -560,17 +735,16 @@ Salt Lake Choral Artists} in March 2012; The by the @uref{http://www.herald-dispatch.com/news/marshall/x1883873762/Music-duo-Chrysalis-to-perform-at-Marshall-University-on-Jan-19, Chrysalis Duo} ; @emph{thrafsmata} performed in July 2011 by the -@uref{http://www.pnme.org/CurrentSeason/PreviousSeasons.html, Pittsburgh +@uref{http://www.pnme.org/, Pittsburgh New Music Ensemble}. - @item @emph{Anonymous Student Compliment or Complaint}, by @uref{http://www.mikesolomon.org, Mike Solomon}, winner chosen from among 172 entries from 22 countries of the -@uref{http://leftcoastensemble.org/contest, 2011 Left Coast Composition Contest}. +@uref{http://www.leftcoastensemble.org, 2011 Left Coast Composition Contest}. Other works include, Norman (age 1) for clarinet solo, performed at the -@uref{http://emu.music.ufl.edu/fems_concerts.html, University of Florida}'s +@uref{http://arts.ufl.edu/academics/music/, University of Florida}'s Electroacoustic Music Festival (FEMF), October 2010. @item @@ -581,22 +755,22 @@ Italy. @uref{http://www.ascarlatti2010.net, Alessandro Scarlatti 2010}, in celebration of the composer's 350th birthday. @item -@uref{http://www.mercurybaroque.org/02/02109.aspx, Mercury Baroque}'s -performance of Lully's @emph{Armide}, May 15-16, 2009, in Houston, -Texas (engraving by @uref{http://nicolas.sceaux.free.fr/, -Nicolas Sceaux}). +@uref{http://www.mercuryhouston.org/, Mercury Baroque}'s performance of +Lully's @emph{Armide}, May 15-16, 2009, in Houston, Texas (engraving by +@uref{http://nicolas.sceaux.free.fr/, Nicolas Sceaux}). @item Instrumental excerpts from Rameau's @emph{Hippolyte et Aricie} at St. James's Church in Manhattan, May 8, 2009, by Frederick Renz and his ensemble @uref{http://www.earlymusicny.org/, Early Music -New York} (engraving by Nicolas Sceaux). +New York} (engraving by +@uref{http://nicolas.sceaux.free.fr/, Nicolas Sceaux}). @item @emph{Affaire étrangère}, an opera by @uref{http://valentin.villenave.net/,Valentin Villenave} to a French libretto by -@uref{http://en.wikipedia.org/wiki/Lewis_Trondheim, Lewis +@uref{https://en.wikipedia.org/wiki/Lewis_Trondheim, Lewis Trondheim}, premiered February 1, 2009 at @uref{http://www.orchestre-montpellier.com/, L'Opéra National de Montpellier}, France. @@ -627,13 +801,13 @@ including many pieces from Mutopia. The app includes a virtual piano keyboard showing which keys to press to help beginners learn how to read sheet music. -@uref{http://www.adoromusicpub.com/, Adoro Music Publishing}, +@item +@uref{https://twitter.com/adoromusic, Adoro Music Publishing}, high-quality scores of sacred music, available for immediate download or in traditional paper format. @item -@uref{http://theshadylanepublishing.com/, The Shady Lane -Publishing}, +@uref{http://matthieujacquot.com/, The Shady Lane Publishing}, a @qq{micro musical publishing house} whose goal is to promote a new form of musical economy closer to the musicians and music lovers. @@ -644,6 +818,7 @@ lovers. @divEnd +@contactUsAbout{concerts or sheet music} @divClass{column-center-bottom} @subheading どうですか? @@ -662,8 +837,16 @@ LilyPond を試してみる決心がついたのなら、@c @unnumberedsec 人々の評価 @translationof Reviews +@divClass{column-center-top} +@subheading 人々は LilyPond についてなんといっているか? +@c What do people say about LilyPond? + +@divEnd + + @divClass{column-left-top} @subheading 出版された記事 +@c Published articles @divClass{keep-bullets} @itemize @@ -673,7 +856,7 @@ April 2011 @uref{http://www.linux-magazine.com,Linux Magazine} publishes an article titled -@uref{http://www.linux-magazine.com/w3/issue/126/088-090_projects.pdf, +@uref{http://www.linux-magazine.com/content/download/61706/482546/version/1/file/088-090_projects.pdf, Projects on the Move}. It is an introductory article on MuseScore, LilyPond and Chordii. Author Carla Schroder states @qq{LilyPond is driven from the command line, but don’t let the lack of a GUI scare @@ -706,7 +889,7 @@ talk about using software to maintain their libraries. @item June 2009 -In an @uref{http://news.lilynet.net/Free-Music-Now, article} +In an @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/Free-Music-Now, article} published in the French @emph{National Conservatory Parent Association}'s yearly magazine, French composer and LilyPond contributor Valentin Villenave explains how Free licenses, and @@ -767,8 +950,8 @@ October 2004 The editors of Computer!Totaal, a Dutch computer magazine, @uref{http://lilypond.org/website/pdf/computer-totaal.jpeg, describe LilyPond} in the October 2004 issue as: @qq{Wonderful -free (open source) software [..] The sheet music produced by -LilyPond is exceptionally pretty [..] a very powerful system that +free (open source) software [@dots{}] The sheet music produced by +LilyPond is exceptionally pretty [@dots{}] a very powerful system that can do almost anything.} @item @@ -795,7 +978,7 @@ February 2004 Jazz singer Gail Selkirk writes about @uref{http://www.songbirdofswing.com/editorial_page/lilypond/, -Diving into LilyPond}. @qq{... you can make lead sheets or full +Diving into LilyPond}. @qq{@dots{} you can make lead sheets or full orchestral parts, and the results can be stunning.} @uref{http://www.computermusic.co.uk/, Computer Music Special}, issue CMS06. @@ -805,6 +988,7 @@ issue CMS06. @divEnd @divEnd + @divClass{column-right-top} @subheading ユーザからの推薦状 @c User testimonials @@ -817,7 +1001,6 @@ issue CMS06. LilyPond で印刷しました。@c Shirmer に出版を掛け合おうとしていますが、そこで印刷される物は@c 恐らく私の物の半分も良くないでしょう!} - @divEnd @@ -829,7 +1012,6 @@ Shirmer に出版を掛け合おうとしていますが、そこで印刷され 定量記譜法で Josquin Desprez のモテットを入力するのに LilyPond を使いましたが、@c LilyPond が、スピード、使い易さ、見栄えにおいて、 他の全ての楽譜作成プログラムを圧倒していることは間違いありません!} - @divEnd @@ -843,7 +1025,6 @@ LilyPond が、スピード、使い易さ、見栄えにおいて、 Lilypondには楽譜の見栄えをより良くするための数多くの方法があるのですが、@c 私がオーケストラに渡したのは@c 基本的に生の、そのままの出力結果だったということです。} - @divEnd @@ -858,7 +1039,6 @@ Lilypondで得られる結果に近い物は他ではありません 私が比較した最近の @q{プロ} の出版物 (Warner Bros. の楽譜、それから @q{老舗} の最近の楽譜の大多数) よりも良いです。[..]} - @qq{Finale/Sibelius/Igor/他の楽譜ソフトウェアに負けるな!!!} @divEnd @@ -871,7 +1051,7 @@ Lilypondで得られる結果に近い物は他ではありません @divClass{testimonial-item} -@subsubheading Chris Snyder, @uref{http://www.adoromusicpub.com/, Adoro 楽譜出版社} +@subsubheading Chris Snyder, @uref{https://twitter.com/adoromusic, Adoro 楽譜出版社} @qq{ 楽譜作成を LilyPond に任せることで、私はより音楽に集中することができます。@c @@ -881,7 +1061,6 @@ Lilypondで得られる結果に近い物は他ではありません LilyPond を使うことで、@c 私はより容易に編集者と譜刻者の 2 つの役割を果たすことができます。} - @qq{私の拙い楽譜出版ビジネスは、完全に LilyPond に頼っています。@c 作曲家に出版しようとしている楽譜の校正刷りを見せると、@c 例外なく彼らはその質の高さに圧倒されます。@c @@ -940,6 +1119,24 @@ scheme がどう使われているかを良く知るにつれ、@c そのポテンシャルについて友達に夢中で喋っていたよ。} @divEnd + +@divClass{testimonial-item} +@subsubheading @uref{http://webusers.siba.fi/~mkuuskan/, Dr. Mika Kuuskankare}, researcher at the @uref{http://siba.fi, Sibelius Academy Finland}, 作曲家兼 Expressive Notation Package (ENP) 作者 + +@qq{私は、個人的経験からこの種のソフトウェアが、いかに難しいか@c +知っているので、LilyPond とその開発者たちを深く尊敬しています。} +@divEnd + + +@divClass{testimonial-item} +@subsubheading @uref{http://camerondh.blogspot.com, David Cameron}, 音楽家、プロ組版者、そして長期間の SCORE ユーザ + +@qq{このプロジェクトに貢献するすべての人に心から感謝します。@c +私は90年代に大きな組版会社で SCORE を使っていましたが、@c +LilyPond は、特に「標準」的でない場合に、最終的に望み通りの結果を@c +得ることができました。} +@divEnd + @divEnd @contactUsAbout{news articles or testimonals} @@ -957,9 +1154,10 @@ scheme がどう使われているかを良く知るにつれ、@c @unnumberedsec テキスト入力 @translationof Text input -@c TRANSLATORS: so far it's mostly from +@c TRANSLATORS, so far it's mostly from @c http://lilypond.org/web/switch/howto +@divClass{column-center-top} @subheading 楽譜を @qq{コンパイル} する @imageClickable{nereid-shot-small,png, (クリックすると拡大します), nereid-shot,png, right} @@ -1046,13 +1244,15 @@ LilyPondがどこに臨時記号を付けるかを判断します。 学習マニュアルは LilyPond を始めるのにぴったりです。@c ユーザが感じるであろう疑問に対する答えをたくさん含んでいます。 -バグだと不満を漏らす前に、学習マニュアルを読んでください!@c -LilyPond は設計どおりに機能しているのですが、@c -新しいユーザは LilyPond が正しく機能していないと思い込むことが@c -しばしばあります。 +時には新しいユーザが LilyPond の挙動の様子に混乱させられることがあります。@c +LilyPond が正しく動作しているか疑う前に、学習マニュアルを読んでください。@c もっと掘り下げた情報が @ref{マニュアル} にあります。 +LilyPond ユーザの Ben Lemon は、ブログに新規ユーザのための +@uref{http://benlemon.me/blog/music/lilypond/operation-lilypond/,ビデオチュートリアル} +を作りました。 + @subsubheading より簡単な編集環境 @c Easier editing environments @@ -1073,6 +1273,8 @@ GUI を提供しているものもあります。@c 更なる情報は、@ref{より簡単な編集手段} を読んでください。 +@divEnd + @divClass{column-center-bottom} @subheading どうですか? @c Where now? @@ -1097,59 +1299,37 @@ In particular, don't link to: @end ignore - -@divClass{column-center-top} -@subheading LilyPondTool - -@imageClickable{lilypondtool-2.12-screenshot-400wide,png, - (クリックすると拡大します),lilypondtool-2.12-screenshot,png,right} - -@sourceimage{logo-linux,,,} -@sourceimage{logo-freebsd,,,} -@sourceimage{logo-macosx,,,} -@sourceimage{logo-windows,,,} - -@uref{http://lilypondtool.organum.hu} - -テキスト エディタ @uref{http://www.jedit.org,jEdit} 用のプラグインである -LilyPondTool は、LilyPond 楽譜を編集するための最も機能豊富な@c -テキスト ベース ツールの 1 つです。 -歌詞サポート機能を持つ文書ウイザードでより容易に文書を@c -セットアップすることができ、@c -進化したポイント&クリック サポートを持つ埋め込み PDF ビューアを@c -備えています。 - -@divEnd - @divClass{column-center-top} -@subheading Frescobaldi +@subheading フロントエンドアプリケーション +@c Front-end Applications +@subsubheading Frescobaldi @imageClickable{frescobaldi-lilypond-editor-small,png, (クリックすると拡大します),frescobaldi-lilypond-editor,png,right} @sourceimage{logo-linux,,,} -@sourceimage{logo-freebsd,,,} +@sourceimage{logo-macosx,,,} @sourceimage{logo-windows,,,} @uref{http://www.frescobaldi.org} -Frescobaldi はビルドイン PDF ビューアを持つ、軽量でパワフルな -LilyPond 用の楽譜・テキストエディタです。@c -簡単に使うことができ、すべての OS (Linux、Mac OS X、それに Windows) -で実行できます。 - -@divEnd - +Frescobaldi は LilyPond のために追加、強化された多くの機能がある、@c +軽量かつ強力な、音楽・テキストエディタです。@c +主な機能には、楽譜をクリックすると対応するコードが表示される@c +「ポイント・アンド・クリック」、@c +詳細なスコアウィザード、組み込みの LilyPond ドキュメントブラウザ、@c +構文ハイライト、自動コマンド補完があります。@c +Frescobaldi は Python と、@c +ユーザインタフェースのための PyQt4 で書かれており、@c +すべての主要な OS (GNU/Linux、Mac OS X、それに Windows) で実行できます。 - -@divClass{column-center-top} -@subheading グラフィカルな環境: Denemo -@c Graphical environment: Denemo +@subsubheading Denemo @imageClickable{screenshot-denemo-small,png, (クリックすると拡大),screenshot-denemo,png,right} @sourceimage{logo-linux,,,} +@sourceimage{logo-macosx,,,} @sourceimage{logo-windows,,,} @uref{http://denemo.org} @@ -1160,46 +1340,94 @@ LilyPond ソースコードをグラフィカル ビューと並べて表示す 音符や和音等に LilyPond が処理可能な調整を加えることができ、@c それを Denemo ファイルとして保存することができるため、@c ユーザはグラフィカル環境で楽譜を編集することができます。 + LilyPond テキストの中でカーソルを動かすと、@c グラフィカル ビューの中でもカーソルが動きます。@c 調整で構文エラーが起きると、テキスト ビューで該当部分がハイライトされます。 @divEnd +@divClass{column-center-top} +@subheading ブラウザベースのエディタ +@c Browser-based editors + +@subsubheading LilyBin +@uref{http://lilybin.com} + +LilyPond をインストールすることなく、@c +直接オンラインで楽譜を組版することができる、@c +Web ベースの LilyPond エディタです。 + +@subsubheading Tunefl +@uref{http://www.tunefl.com} + +Tunefl を使うと、LilyPond をインストールすることなく、@c +直接オンラインでミニスコアを組版することができます。@c +これは、便利な Web インタフェースを使用して、@c +すべてのプログラムの機能を試すことができます。 + +@divEnd + +@divClass{column-center-top} +@subheading 統合開発環境プラグイン +@c IDE Plug-ins + +@subsubheading Elysium + +@sourceimage{logo-linux,,,} +@sourceimage{logo-freebsd,,,} +@sourceimage{logo-macosx,,,} +@sourceimage{logo-windows,,,} + +@uref{http://elysium.thsoft.hu} + +Elysium はソースとスコアをサイド・バイ・サイドで表示、統合した、@c +Eclipse 向け LilyPond 統合開発環境です。@c +これは、切り替え不要で素早く視覚、聴覚フィードバックができ、@c +たくさんのウィザード方式のテンプレートが付属します。 + +@divEnd @divClass{column-center-top} @subheading テキスト エディタ +@c Text editors @sourceimage{logo-linux,,,} @sourceimage{logo-freebsd,,,} @sourceimage{logo-macosx,,,} @sourceimage{logo-windows,,,} +@subsubheading Emacs @uref{http://www.gnu.org/software/emacs/} - Emacs は、多くのコンピュータ言語に対応する言語検出機能を持つ@c テキスト エディタです。@c Emacs には高い拡張性があり、統合開発環境として使用することができます。@c -LilyPond ソース ファイルに作成するための@c +LilyPond ソース ファイルを作成するための@c 言語定義を提供する @q{lilypond モード} があります。 また、LilyPond 開発者の 1 人が Emacs メジャーモード -@uref{http://nicolas.sceaux.free.fr/lilypond/lyqi.html,lyqi} +@uref{https://github.com/nsceaux/lyqi,lyqi} を作成しています。 +Emacs に慣れていない場合、LilyPond 入力ファイルを書くために、@c +別のエディタを使うこともできます。 -@uref{http://www.vim.org} +Emacs をセットアップするための更なる情報が +@rprogram{テキスト エディタ サポート} にあります。 +@subsubheading Vim +@uref{http://www.vim.org} Vim は最小限度の機能を持つテキスト エディタであり、@c 古い Unix @command{vi} エディタの機能拡張版です。@c このプログラムも拡張やコンフィグレーションを行うことができます。 -一般的に言って、すでに Emacs や Vim に慣れているのでなければ、@c -LilyPond 入力ファイルを記述するために他のエディタを使うべきです。 +Vi に慣れていない場合、LilyPond 入力ファイルを書くために、@c +別のエディタを使うこともできます。 -Emacs と Vim をセットアップするための更なる情報が +Vim をセットアップするための更なる情報が @rprogram{テキスト エディタ サポート} にあります。 @sourceimage{logo-macosx,,,} +@subsubheading TeXShop @uref{http://www.uoregon.edu/~koch/texshop} MacOS@tie{}X 用のエディタ TexShop を拡張して、 @@ -1215,74 +1443,75 @@ MacOS@tie{}X 用のエディタ TexShop を拡張して、 @divClass{column-center-top} @subheading LilyPond コードをエクスポートできるプログラム - +@c Other programs that can export LilyPond code @subsubheading 楽譜、タブ、MIDI エディタ: +@c Score, tab and MIDI editors: @itemize @item +@uref{http://www.jezra.net/projects/bwwtolily,bwwtolily} +は @code{.bww} や @code{.bmw} ファイルを LilyPond へ変換しようとします。@c +すべての装飾が正しく変換されないかもしれませんが@c +(piobaireachd では特にそうです)@c +一覧表示されます。 +@item @uref{http://www.canorus.org,Canorus}: -楽譜エディタで、LilyPond コードをエクスポートできが、まだベータ版です。@c +楽譜エディタで、LilyPond コードをエクスポートできますが、まだベータ版です。@c テスターを歓迎しています。 @item -@uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml, -NtEd}: -@uref{http://www.cairographics.org,Cairo} ライブラリをベースにした@c -楽譜エディタで、試験的に LilyPond へのエクスポートをサポートしています。 +@uref{http://enc2ly.sourceforge.net/en/,Enc2ly} is a GNU/Linux program +which converts an Encore music score into a LilyPond one. @item -@uref{http://www.musescore.org,MuseScore}: -楽譜エディタで、完全ではありませんが LilyPond コードをエクスポートできます。@c -活発に開発が行われています。 +@uref{https://github.com/hanwen/go-enc2ly,go-enc2ly} is a Go tool that +converts Encore files to LilyPond. It was created using Felipe Castro's +research and reverse engineering by tweaking existing .enc files and +loading them using the 4.55 demo version. + +@item +@uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd}, +@uref{http://www.cairographics.org,Cairo} ライブラリをベースにした@c +楽譜エディタで、試験的に LilyPond へのエクスポートをサポートしています。 @item -@uref{http://www.holmessoft.co.uk/homepage/software/NWC2LY/index.htm, -NW2LY}: -@c @uref{http://www.noteworthysoftware.com/,NoteWorthy} -NoteWorthy で記譜した曲を LilyPond に変換する C# プログラムです。 +@uref{http://www.holmessoft.co.uk/homepage/software/NWC2LY/index.htm,NW2LY} +は NoteWorthy で記譜した曲を LilyPond に変換する C# プログラムです。 @item -@uref{https://github.com/ciconia/ripple/blob/master/README.markdown, -Ripple}: -総譜とパート譜の作成を支援するプログラムで、異なる楽譜ソースから@c +@uref{https://github.com/ciconia/ripple/blob/master/README.markdown,Ripple} +は総譜とパート譜の作成を支援するプログラムで、異なる楽譜ソースから@c 総譜やパート譜を作成するモードがあります。 @item @uref{http://www.rosegardenmusic.com,Rosegarden}: オーディオ・MIDI シーケンサであり、単一譜を扱える楽譜エディタでもあります。 -@item -@uref{https://launchpad.net/rumor/,Rumor}: -リアルタイムに単声の MIDI を LilyPond に変換します。 - -@item -@uref{http://www.tuxguitar.com.ar/,TuxGuitar}: -マルチトラックなタブ譜のエディタ・プレイヤで、楽譜ビューアを持ち、@c -LilyPond コードのエクスポートが可能です。 - @end itemize -@subsubheading Algorithmic code generators +@subsubheading アルゴリズムによるコード生成 +@c Algorithmic code generators @itemize @item @uref{http://www.projectabjad.org/,Abjad}, a -@uref{http://www.python.org/,Python} API for Formalized Score -Control designed to help composers build up complex pieces of -LilyPond notation in an iterative and incremental way. +@uref{http://www.python.org/,Python} API for Formalized Score Control +designed to help composers build up complex pieces of LilyPond notation +in an iterative and incremental way. @item -@uref{http://common-lisp.net/project/fomus/,FOMUS}, a LISP library -to generate music notation from computer music software -environments. +@uref{http://common-lisp.net/project/fomus/,FOMUS}, (FOrmat MUSic) is a +music notation tool for computer music composers. It is written in the +Lisp programming language, and has been tested in a variety of +interpreters. A C++ port is also available. @item -@uref{http://strasheela.sourceforge.net,Strasheela}, an -environment built on top of the +@uref{http://strasheela.sourceforge.net/strasheela/doc/index.html,Strasheela}, +an environment built on top of the @uref{http://www.mozart-oz.org/, Mozart/Oz} constraint programming language. @@ -1292,26 +1521,51 @@ language. @divClass{column-center-top} @subheading 活発には開発されていない他のプログラム +@c Other programs no longer being actively developed @itemize +@item +@uref{https://sourceforge.net/projects/lily4jedit,LilyPondTool} +は @uref{http://www.jedit.org,jEdit} テキストエディタ用プラグインでした。 + @item @uref{http://lilykde.googlecode.com/,LilyKDE} は @uref{http://www.frescobaldi.org/,Frescobaldi} に置き換わり、 KDE 3.5 用の LilyKDE3 と KDE 4.1 用の lilypond-KDE4 だけが存在します。 @item -@uref{http://noteedit.berlios.de,NoteEdit}, which imported -@uref{http://www.musicxml.com/xml.html,MusicXML}, has been forked -into +@uref{http://lilycomp.sourceforge.net, LilyComp} is a graphical note +entry program, acting much like a number-pad which produces LilyPond +notes. + +@item +@uref{http://www.musescore.org,MuseScore}: +楽譜エディタです。バージョン 2.0 で LilyPond エクスポートがなくなりましたが、@c +古いバージョンがまだ +@uref{http://sourceforge.net/projects/mscore/files/mscore/,Sourceforge} +でダウンロードできます。 + +@item +@uref{https://sourceforge.net/projects/noteedit.berlios/,NoteEdit}, which imported +@uref{http://www.makemusic.com/musicxml,MusicXML}, has been forked into @uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd} and @uref{http://canorus.org,Canorus}. +@item +@uref{http://extensions.services.openoffice.org/en/project/OOoLilyPond,OOoLilypond}, +OpenOffice.org の拡張機能で、OpenOffice.org ドキュメント中@c +で LilyPond ファイルを画像に変換できます。@c +もう開発されていませんが、まだバージョン 4 で動作すると思われます。 + +@item +@uref{https://launchpad.net/rumor/,Rumor}: +リアルタイムに単声の MIDI を LilyPond に変換します。 @item -@uref{http://lilycomp.sourceforge.net, LilyComp} is a graphical -note entry program, acting much like a number-pad which produces -lilypond notes. +@uref{http://sourceforge.net/projects/tuxguitar/,TuxGuitar}: +マルチトラックなタブ譜のエディタ・プレイヤで、楽譜ビューアを持ち、@c +LilyPond コードのエクスポートが可能です。 @end itemize @@ -1336,7 +1590,10 @@ LilyPond が提供する @ref{特徴}, @ref{例}, あるいは @ref{自由} を@ さらに、伝統的な譜刻の審美性をコンピュータで実現するための@c 我々のアプローチが @ref{バックグラウンド} で説明されています。 +@divEnd + +@divClass{column-center-bottom} @subheading 法律用語 @c Legalese diff --git a/Documentation/ja/web/manuals.itexi b/Documentation/ja/web/manuals.itexi index 1d63b8ffd0..5db210ceb4 100644 --- a/Documentation/ja/web/manuals.itexi +++ b/Documentation/ja/web/manuals.itexi @@ -1,13 +1,13 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: ja -*- @ignore - Translation of GIT committish: cf90af135bc70b57f69fd3e09a9b29814c6358e4 + Translation of GIT committish: 7215236a0a49dd112348d2620fa132f7e5f12aff When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' Guide, node Updating translation committishes.. @end ignore -@c Translators: Yoshiki Sawada +@c Translators: Masamichi Hosoda, Yoshiki Sawada @node マニュアル @unnumbered マニュアル @@ -36,21 +36,25 @@ @itemize -@item @ref{テキスト入力}: +@item +@ref{テキスト入力}: LilyPond は @strong{テキスト ベース} の楽譜作成プログラムです。@c まず最初にこのドキュメントを読んでください! -@item @ifWebLinks{@manualStableLearningSplitNoName-ja,@rlearningnamed{Top,学習}} +@item +@ifWebLinks{@manualStableLearningSplitNoName-ja,@rlearningnamed{Top,学習}} @qq{必読} のやさしい LilyPond 入門書です。 @details{学習} -@item @ifWebLinks{@manualStableGlossarySplitNoName,@rglosnamed{Top,用語集}} +@item +@ifWebLinks{@manualStableGlossarySplitNoName,@rglosnamed{Top,用語集}} @emph{(副読本)} 音楽用語についての説明と、 英語の音楽用語に馴染みの無いユーザのための訳語を提供します。 @details{用語集} -@item @ifWebLinks{@manualStableEssaySplitNoName,@ressaynamed{Top,Essay}} +@item +@ifWebLinks{@manualStableEssaySplitNoName,@ressaynamed{Top,Essay}} @emph{(副読本)} コンピュータによる譜刻についての背景。 @details{エッセー} @@ -64,15 +68,18 @@ LilyPond は @strong{テキスト ベース} の楽譜作成プログラムで @itemize -@item @ifWebLinks{@manualStableNotationSplitNoName-ja,@rusernamed{Top,記譜法}} +@item +@ifWebLinks{@manualStableNotationSplitNoName-ja,@rusernamed{Top,記譜法}} 構文リファレンス。 @details{記譜法} -@item @ifWebLinks{@manualStableUsageSplitNoName-ja,@rprogramnamed{Top,使用方法}} +@item +@ifWebLinks{@manualStableUsageSplitNoName-ja,@rprogramnamed{Top,使用方法}} このプログラムの実行方法。 @details{使用方法} -@item @ifWebLinks{@manualStableSnippetsSplitNoName,@rlsrnamed{Top,Snippets}} +@item +@ifWebLinks{@manualStableSnippetsSplitNoName,@rlsrnamed{Top,Snippets}} ちょっとしたトリック、秘訣。 @details{コード断片集} @@ -86,22 +93,27 @@ LilyPond は @strong{テキスト ベース} の楽譜作成プログラムで @itemize -@item @ref{FAQ}: +@item +@ref{FAQ}: 頻繁に質問されること。 -@item @ref{Top, Web}: +@item +@ref{Top, Web}: このドキュメント。 @details{Web} -@item @ifWebLinks{@manualStableChangesSplitNoName,@rchangesnamed{Top,Changes}} +@item +@ifWebLinks{@manualStableChangesSplitNoName,@rchangesnamed{Top,Changes}} 変更点。 @details{変更点} -@item @ifWebLinks{@manualStableExtendingSplitNoName,@rextendnamed{Top,Extending}} +@item +@ifWebLinks{@manualStableExtendingSplitNoName,@rextendnamed{Top,Extending}} 変則的な調整。 @details{拡張} -@item @ifWebLinks{@manualStableInternalsSplitNoName,@rinternalsnamed{Top,Internals}} +@item +@ifWebLinks{@manualStableInternalsSplitNoName,@rinternalsnamed{Top,Internals}} 調整のためのリファレンス。 @details{内部リファレンス} @@ -115,21 +127,30 @@ LilyPond は @strong{テキスト ベース} の楽譜作成プログラムで @itemize -@item @ref{すべて}: +@item +@ref{すべて}: 圧縮したアーカイブとして提供する以前と現在の安定バージョンの@c ドキュメント。 -@item @ref{翻訳済み}: +@item +@ref{翻訳済み}: 非英語圏の読者のための翻訳状況。 @item -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}: +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond Snippet Repository}: ユーザが作成した例、ヒント、それに TIPS。 -@item @ref{Development}: +@item +@uref{http://benlemon.me/blog/music/lilypond/operation-lilypond/,ビデオチュートリアル}: +LilyPond ユーザの Ben Lemon は、自分のブログで新規ユーザのための@c +ビデオチュートリアルを作成しています。 + +@item +@ref{Development}: 不安定な開発バージョンのマニュアル。 -@item @ref{FDL}: +@item +@ref{FDL}: これらのマニュアルは GNU Free Documentation License に基づいて@c 発行されています。 @@ -137,6 +158,19 @@ LilyPond は @strong{テキスト ベース} の楽譜作成プログラムで @divEnd +@divClass{column-center-bottom} +@subheading マニュアルの形式 + +LilyPond のマニュアルは通常 3 つの形式があります: +ページ毎に分割された HTML, 1 つの大きな HTML そして PDF です。@c +ページ毎に分割された HTML はオンラインで読むのに適しています。@c +1 つの大きな HTML (非常に大きいものもあります)は、@c +単一のページで全体のマニュアルが含まれています。@c +PDF はダウンロードしてオフラインで利用することができます。@c +これら 3 形式を取得するためには、マニュアル名の詳細のリンクをたどってください。 + +@divEnd + @divEnd @@ -188,8 +222,8 @@ LilyPond は @strong{テキスト ベース} の楽譜作成プログラムで @docLinks{学習, learning, @rlearningnamed{Top,学習}, @manualStableLearningSplit-ja, - @manualStableLearningBig-ja, 1.5 MB, - @manualStableLearningPdf, 3 MB} + @manualStableLearningBig-ja, 3 MB, + @manualStableLearningPdf, 5 MB} @divEnd @@ -240,8 +274,8 @@ LilyPond の譜刻テクニックの例を挙げます。@c @docLinks{エッセー, essay, @ressaynamed{Top,エッセー}, @manualStableEssaySplit, - @manualStableEssayBig, 2 MB, - @manualStableEssayPdf, 2.5 MB} + @manualStableEssayBig, 1 MB, + @manualStableEssayPdf, 2 MB} @divEnd @@ -268,8 +302,8 @@ LilyPond の譜刻テクニックの例を挙げます。@c @docLinks{記譜法, notation, @rusernamed{Top,記譜法}, @manualStableNotationSplit-ja, - @manualStableNotationBig-ja, 7 MB, - @manualStableNotationPdf, 18 MB} + @manualStableNotationBig-ja, 9 MB, + @manualStableNotationPdf, 35 MB} @divEnd @@ -293,7 +327,7 @@ LilyPond 記譜法を他のプログラムと統合する方法について説 @rprogramnamed{Top,使用方法}, @manualStableUsageSplit-ja, @manualStableUsageBig-ja, 400 KB, - @manualStableUsagePdf, 600 KB} + @manualStableUsagePdf, 650 KB} @divEnd @@ -305,7 +339,7 @@ LilyPond 記譜法を他のプログラムと統合する方法について説 @divClass{column-left-top} @subheading コード断片集 -これは @uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond コード断片リポジトリ} +これは @uref{http://lsr@/.di@/.unimi@/.it,LilyPond コード断片リポジトリ} (LSR) から選び出した LilyPond のコード断片集です。@c LSR にあるすべてのコード断片はパブリック ドメインにあります (公開されています)。 @@ -325,8 +359,8 @@ LSR は LilyPond の安定版で実行することを前提としているため @docLinks{コード断片集, snippets, @rlsrnamed{Top,コード断片集}, @manualStableSnippetsSplit, - @manualStableSnippetsBig, 2.5 MB, - @manualStableSnippetsPdf, 8 MB} + @manualStableSnippetsBig, 1.5 MB, + @manualStableSnippetsPdf, 12.5 MB} @divEnd @@ -404,8 +438,8 @@ LilyPond を使う理由については、@ref{導入部} に書かれていま @docLinksBare{Web, web, @ref{Top,Web}, @manualDevelWebSplit-ja, - @manualDevelWebBig-ja, 1 MB, - @manualDevelWebPdf, 2 MB} + @manualDevelWebBig-ja, 2.5 MB, + @manualDevelWebPdf, 3.5 MB} @divEnd @@ -427,11 +461,12 @@ LilyPond を使う理由については、@ref{導入部} に書かれていま @docLinks{変更点, changes, @rchangesnamed{Top,変更点}, @manualStableChangesSplit, - @manualStableChangesBig, 6 KB, - @manualStableChangesPdf, 200 KB} + @manualStableChangesBig, 90 KB, + @manualStableChangesPdf, 80 KB} @divEnd + @node 拡張 @unnumberedsec 拡張 @translationof Extending @@ -448,8 +483,8 @@ LilyPond を使う理由については、@ref{導入部} に書かれていま @docLinks{拡張, extending, @rextendnamed{Top,拡張}, @manualStableExtendingSplit, - @manualStableExtendingBig, 200 KB, - @manualStableExtendingPdf, 400 KB} + @manualStableExtendingBig, 300 KB, + @manualStableExtendingPdf, 500 KB} @divEnd @@ -483,9 +518,8 @@ HTML ドキュメントでは、それらサブセクションにはクリック @docLinks{内部リファレンス, internals, @rinternalsnamed{Top,内部リファレンス}, @manualStableInternalsSplit, - @manualStableInternalsBig, 2.5 MB, - @manualStableInternalsPdf, 2.8 MB} - + @manualStableInternalsBig, 3 MB, + @manualStableInternalsPdf, 4 MB} @divEnd @@ -532,6 +566,12 @@ HTML ドキュメントでは、それらサブセクションにはクリック @divClass{keep-bullets} @itemize +@item @uref{http://lilypond.org/doc/v2.16/Documentation/web/manuals, +LilyPond 2.16 ドキュメント} + +@item @uref{http://lilypond.org/doc/v2.14/Documentation/web/manuals, +LilyPond 2.14 ドキュメント} + @item @uref{http://lilypond.org/doc/v2.12/Documentation/, LilyPond 2.12 ドキュメント} @@ -544,19 +584,19 @@ LilyPond 2.8 ドキュメント} @item @uref{http://lilypond.org/doc/v2.6/Documentation/, LilyPond 2.6 ドキュメント} -@item @uref{http://lilypond.org/doc/v2.4/Documentation/, +@item @uref{http://lilypond.org/doc/v2.4/Documentation/out-www/, LilyPond 2.4 ドキュメント} -@item @uref{http://lilypond.org/doc/v2.2/Documentation/, +@item @uref{http://lilypond.org/doc/v2.2/Documentation/out-www/, LilyPond 2.2 ドキュメント} -@item @uref{http://lilypond.org/doc/v2.0/Documentation/, +@item @uref{http://lilypond.org/doc/v2.0/Documentation/out-www/, LilyPond 2.0 ドキュメント} -@item @uref{http://lilypond.org/doc/v1.8/Documentation/, +@item @uref{http://lilypond.org/doc/v1.8/Documentation/out-www/, LilyPond 1.8 ドキュメント} -@item @uref{http://lilypond.org/doc/v1.6/Documentation/, +@item @uref{http://lilypond.org/doc/v1.6/Documentation/out-www/, LilyPond 1.6 ドキュメント} @end itemize diff --git a/Documentation/learning.tely b/Documentation/learning.tely index 98b329cc49..ee5464d342 100644 --- a/Documentation/learning.tely +++ b/Documentation/learning.tely @@ -18,9 +18,14 @@ This file provides an introduction to LilyPond version @version{}. @end macro -@c `Learning Manual' was born 1999-10-10 with git commit b9abaac... +@c `Learning Manual' was born 1998-08-14 with this commit: +@c release: 1.0.2 +@c author: Han-Wen Nienhuys +@c commit: a3a44f9f3c581b6824b3a65f9039656693e09bbf +@c file: Documentation/tex/tutorial.yo + @macro copyrightDeclare -Copyright @copyright{} 1999--2012 by the authors. +Copyright @copyright{} 1998--2015 by the authors. @end macro @set FDL diff --git a/Documentation/learning/common-notation.itely b/Documentation/learning/common-notation.itely index 8c833c76f5..b51766c0a2 100644 --- a/Documentation/learning/common-notation.itely +++ b/Documentation/learning/common-notation.itely @@ -8,16 +8,12 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.28" +@c \version "2.19.21" @ignore Tutorial guidelines: (different from policy.txt!) -- unless you have a really good reason, use either +- unless you have a really good reason, use @lilypond[verbatim,quote] - or - @lilypond[verbatim,quote,relative=2] - - Don't use any other relative=X commands. - use "aes" and "ees" instead of "as" and "es". I know it's not correct Dutch naming, but let's not confuse people with this @@ -52,7 +48,7 @@ on one staff. @menu * Bar lines and bar checks:: -* Accidentals and key signatures:: +* Pitches and key signatures:: * Ties and slurs:: * Articulation and dynamics:: * Adding text:: @@ -79,8 +75,8 @@ lines are added using @code{\bar}, for example for an ending bar line. For a full list of bar lines see the @ruser{Bar lines}. -@lilypond[verbatim,quote,relative=2] -g1 e1 \bar "||" c2. c'4 \bar "|." +@lilypond[verbatim,quote] +\relative { g'1 e1 \bar "||" c2. c'4 \bar "|." } @end lilypond @node Bar checks @@ -95,34 +91,49 @@ durations that make each measure add up to the correct length. Bar checks also make your input code easier to read, since they help to keep things organized. -@lilypond[verbatim,quote,relative=2] -g1 | e1 | c2. c'4 | g4 c g e | c4 r r2 | +@c This example deliberately produces a warning +@lilypond[verbatim,quote] +\relative { + g'1 | e1 | c2. c' | g4 c g e | c4 r r2 | +} @end lilypond +If you compile the code in the example above, you should see a +warning in the console output: + +@example +warning: barcheck failed at: 1/2 + g'1 | e1 | c2. c' + | g4 c g e | c4 r r2 | +@end example + +Although the missing duration is clear in the musical output in this +simple example, the warning in the console output is far more +effective in drawing attention to the missing @code{4} in bar 3. + @seealso Notation Reference: @ruser{Bar and bar number checks}. -@node Accidentals and key signatures -@subsection Accidentals and key signatures +@node Pitches and key signatures +@subsection Pitches and key signatures @menu -* Accidentals:: +* Pitch alterations:: * Key signatures:: * Warning key signatures and pitches:: @end menu -@warning{New users are often confused by these -- please read the -warning at the bottom of this page, especially if you are not -familiar with music theory!} +@warning{New users often misunderstand how LilyPond uses the key +signature -- please read the warning at the bottom of this page.} -@node Accidentals -@unnumberedsubsubsec Accidentals +@node Pitch alterations +@unnumberedsubsubsec Pitch alterations @cindex accidentals -@cindex accidentals and key signatures +@cindex natural @cindex sharp @cindex double sharp @cindex sharp, double @@ -138,16 +149,19 @@ familiar with music theory!} Music Glossary: @rglos{sharp}, @rglos{flat}, @rglos{double sharp}, @rglos{double flat}, @rglos{accidental}. +Note-names in LilyPond identify pitches. For example, @code{c} +always means C-natural, regardless of the key signature. + A @notation{sharp} pitch is made by adding @code{is} to the name, and a @notation{flat} pitch by adding @code{es}. As you might expect, a @notation{double sharp} or @notation{double flat} is made by adding @code{isis} or @code{eses}. This syntax is derived from note naming conventions in Nordic and Germanic languages, like German and Dutch. To use other names for -@notation{accidentals}, see @ruser{Note names in other languages}. +@notation{alterations}, see @ruser{Note names in other languages}. -@lilypond[verbatim,quote,relative=2] -cis4 ees fisis, aeses +@lilypond[verbatim,quote] +\relative { cis''4 ees fisis, aeses } @end lilypond @cindex key signature, setting @@ -164,11 +178,8 @@ cis4 ees fisis, aeses @cindex layout vs. content @funindex \key -@funindex key @funindex \major -@funindex major @funindex \minor -@funindex minor Music Glossary: @rglos{key signature}, @rglos{major}, @rglos{minor}. @@ -176,11 +187,13 @@ Music Glossary: @rglos{key signature}, @rglos{major}, The @notation{key signature} is set with the command @code{\key} followed by a pitch and @code{\major} or @code{\minor}. -@lilypond[verbatim,quote,relative=2] -\key d \major -a1 | -\key c \minor -a1 | +@lilypond[verbatim,quote] +\relative { + \key d \major + d'4 fis a c | + \bar "||" \key c \minor + c,4 ees g b | +} @end lilypond @smallspace @@ -193,28 +206,26 @@ Music Glossary: @rglos{accidental}, @rglos{key signature}, @rglos{pitch}, @rglos{flat}, @rglos{natural}, @rglos{sharp}, @rglos{transposition}, @rglos{Pitch names}. -To determine whether to print an @notation{accidental}, LilyPond -examines the pitches and the @notation{key signature}. The key -signature only affects the @emph{printed} accidentals, not the -note's @notation{pitch}! This is a feature that often causes -confusion to newcomers, so let us explain it in more detail. - -LilyPond makes a clear distinction between musical content and -layout. The alteration (@notation{flat}, @notation{natural sign} or -@notation{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. +LilyPond makes a distinction between musical content and +its printed representation. Input such as @code{d4 e fis2} +defines the pitches and durations of notes, which is musical +content. The @notation{key signature} is part of the printed +representation. The key signature also sets rules for the +printed representations of notes. LilyPond compares each input +pitch to the key signature to determine whether to print an +@notation{accidental}. + +The command @code{\key} sets the @notation{key signature}, which +affects the printed representation, but does @emph{not} change +the pitch assigned to a note such as @code{c} in the input. In this example: -@lilypond[verbatim,quote,relative=2] -\key d \major -cis4 d e fis +@lilypond[verbatim,quote] +\relative { + \key d \major + cis''4 d e fis +} @end lilypond @noindent @@ -226,15 +237,15 @@ the middle line of the staff.} Rather, it means @qq{there is a note with pitch B-natural.} In the key of A-flat major, it @emph{does} get an accidental: -@lilypond[verbatim,quote,relative=2] -\key aes \major -aes4 c b c +@lilypond[verbatim,quote] +\relative { + \key aes \major + aes'4 c b c +} @end lilypond -If the above seems confusing, consider this: if you were playing a -piano, which key would you hit? If you would press a black key, -then you @emph{must} add @w{@code{-is}} or @w{@code{-es}} to the note -name! +Whenever you enter a pitch that is a black key on the piano, you +@emph{must} add @w{@code{-is}} or @w{@code{-es}} to the note name. Adding all alterations explicitly might require a little more effort when typing, but the advantage is that @@ -274,16 +285,31 @@ Notation Reference: @node Ties @unnumberedsubsubsec Ties - Music Glossary: @rglos{tie}. A @notation{tie} is created by appending a tilde @code{~} to the -first note being tied. +first of the two notes being tied. -@lilypond[verbatim,quote,relative=2] -g4~ g c2~ | c4~ c8 a~ a2 | +@lilypond[verbatim,quote] +\relative { g'4~ g c2~ | c4~ c8 a~ a2 | } @end lilypond +@cindex bare duration +@cindex duration, bare + +When the pitch does not change, as is always the case with tied notes, +subsequent pitches may be omitted, specifying just the bare duration: + +@lilypond[verbatim,quote] +\relative { g'4~ 4 c2~ | 4~ 8 a~ 2 | } +@end lilypond + +This shorthand may be useful in other places where the rhythm changes +with an unchanging pitch, but remember that a bare pitch followed by a +space and a bare duration will be interpreted as a single note. In +other words, @code{c4 a 8 8} would be interpreted as @code{c4 a8 a8}, +not as @code{c4 a4 a8 a8}. Write instead @code{c4 a4 8 8 }. + @node Slurs @unnumberedsubsubsec Slurs @@ -294,8 +320,8 @@ A @notation{slur} is a curve drawn across many notes. The starting note and ending note are marked with @code{(} and @code{)} respectively. -@lilypond[verbatim,quote,relative=2] -d4( c16) cis( d e c cis d) e( d4) +@lilypond[verbatim,quote] +\relative { d''4( c16) cis( d e c cis d) e( d4) } @end lilypond @node Phrasing slurs @@ -305,12 +331,11 @@ d4( c16) cis( d e c cis d) e( d4) Music Glossary: @rglos{slur}, @rglos{phrasing}. Slurs to indicate longer @notation{phrasing} can be entered with -@code{\(} and @code{\)}. You can have both @notation{slurs} -and phrasing slurs at the same time, but you cannot have -simultaneous slurs or simultaneous phrasing slurs. +@code{\(} and @code{\)}. You can have both @notation{slurs} and +phrasing slurs at the same time. -@lilypond[verbatim,quote,relative=2] -g4\( g8( a) b( c) b4\) +@lilypond[verbatim,quote] +\relative { g'4\( g8( a) b( c) b4\) } @end lilypond @smallspace @@ -329,8 +354,8 @@ can only be used on pairs of notes with the same pitch. Slurs indicate the @notation{articulation} of notes, and can be used on larger groups of notes. Slurs and ties can be nested. -@lilypond[verbatim,quote,relative=2] -c4~( c8 d~ d4 e) +@lilypond[verbatim,quote] +\relative { c''4(~ c8 d~ 4 e) } @end lilypond @@ -363,9 +388,11 @@ Music Glossary: @rglos{articulation}. Common @notation{articulations} can be added to a note using a dash @code{-} and a single character: -@lilypond[verbatim,quote,relative=2] -c4-^ c-+ c-- c-! -c4-> c-. c2-_ +@lilypond[verbatim,quote] +\relative { + c''4-^ c-+ c-- c-! + c4-> c-. c2-_ +} @end lilypond @node Fingerings @@ -382,8 +409,8 @@ Music Glossary: @rglos{fingering}. Similarly, @notation{fingering} indications can be added to a note using a dash (@code{-}) and the digit to be printed: -@lilypond[verbatim,quote,relative=2] -c4-3 e-5 b-2 a-1 +@lilypond[verbatim,quote] +\relative { c''4-3 e-5 b-2 a-1 } @end lilypond Articulations and fingerings are usually placed automatically, but @@ -392,8 +419,8 @@ you can specify a direction by replacing the dash (@code{-}) with articulations on the same note. However, in most cases it is best to let LilyPond determine the articulation directions. -@lilypond[verbatim,quote,relative=2] -c4_-^1 d^. f^4_2-> e^-_+ +@lilypond[verbatim,quote] +\relative { c''4_-^1 d^. f^4_2-> e^-_+ } @end lilypond @node Dynamics @@ -411,11 +438,8 @@ c4_-^1 d^. f^4_2-> e^-_+ @funindex \mf @funindex \pp @funindex \< -@funindex < @funindex \> -@funindex > @funindex \! -@funindex ! Music Glossary: @rglos{dynamics}, @rglos{crescendo}, @rglos{decrescendo}. @@ -423,8 +447,8 @@ Music Glossary: @rglos{dynamics}, @rglos{crescendo}, @notation{Dynamic} signs are made by adding the markings (with a backslash) to the note: -@lilypond[verbatim,quote,relative=2] -c4\ff c\mf c\p c\pp +@lilypond[verbatim,quote] +\relative { c''4\ff c\mf c\p c\pp } @end lilypond @@ -433,8 +457,8 @@ the commands @code{\<} and @code{\>}. The next dynamics sign, for example @code{\f}, will end the (de)crescendo, or the command @code{\!} can be used: -@lilypond[verbatim,quote,relative=2] -c4\< c\ff\> c c\! +@lilypond[verbatim,quote] +\relative { c''4\< c\ff\> c c\! } @end lilypond @@ -453,19 +477,18 @@ Notation Reference: @cindex markup @funindex \markup -@funindex markup Text may be added to your scores: -@lilypond[verbatim,quote,relative=2] -c2^"espr" a_"legato" +@lilypond[verbatim,quote,fragment] +c''2^"espr" a'_"legato" @end lilypond Extra formatting may be added with the @code{\markup} command: -@lilypond[verbatim,quote,relative=2] -c2^\markup { \bold espr } -a2_\markup { +@lilypond[verbatim,quote,fragment] +c''2^\markup { \bold espr } +a'2_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } @end lilypond @@ -490,24 +513,22 @@ Notation Reference: @funindex [ @funindex ] @funindex \autoBeamOff -@funindex autoBeamOff @funindex \autoBeamOn -@funindex autoBeamOn Music Glossary: @rglos{beam}. All @notation{beams} are drawn automatically: -@lilypond[verbatim,quote,relative=2] -a8 ais d ees r d c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8 ais d ees r d c16 b a8 } @end lilypond If you do not like the automatic beams, they may be overridden manually. To correct just an occasional beam mark the first note to be beamed with @code{[} and the last one with @code{]}. -@lilypond[verbatim,quote,relative=2] -a8[ ais] d[ ees r d] c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8[ ais] d[ ees r d] c16 b a8 } @end lilypond If you want to turn off automatic beaming entirely or for an @@ -515,11 +536,13 @@ extended section of music, use the command @code{\autoBeamOff} to turn off automatic beaming and @code{\autoBeamOn} to turn it on again. -@lilypond[verbatim,quote,relative=2] -\autoBeamOff -a8 c b4 d8. c16 b4 | -\autoBeamOn -a8 c b4 d8. c16 b4 | +@lilypond[verbatim,quote] +\relative { + \autoBeamOff + a'8 c b4 d8. c16 b4 | + \autoBeamOn + a8 c b4 d8. c16 b4 | +} @end lilypond @@ -547,7 +570,6 @@ Notation Reference: @cindex partial measure @funindex \partial -@funindex partial Music Glossary: @rglos{anacrusis}. @@ -555,9 +577,11 @@ A pickup (or @notation{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[verbatim,quote,relative=2] -\partial 8 f8 | -c2 d | +@lilypond[verbatim,quote] +\relative { + \partial 8 f''8 | + c2 d | +} @end lilypond @node Tuplets @@ -568,7 +592,6 @@ c2 d | @cindex triplets @funindex \tuplet -@funindex tuplet Music Glossary: @rglos{note value}, @rglos{triplet}. @@ -579,11 +602,13 @@ of notes normally filling the same duration. For triplets, there are three notes instead of two, so @notation{triplets} have 3/2 as their fraction. -@lilypond[verbatim,quote,relative=2] -\tuplet 3/2 { f8 g a } -\tuplet 3/2 { c8 r c } -\tuplet 3/2 { f,8 g16[ a g a] } -\tuplet 3/2 { d4 a8 } +@lilypond[verbatim,quote] +\relative { + \tuplet 3/2 { f''8 g a } + \tuplet 3/2 { c8 r c } + \tuplet 3/2 { f,8 g16[ a g a] } + \tuplet 3/2 { d4 a8 } +} @end lilypond @node Grace notes @@ -595,9 +620,7 @@ For triplets, there are three notes instead of two, so @cindex appoggiatura @funindex \grace -@funindex grace @funindex \acciaccatura -@funindex acciaccatura @funindex \appoggiatura @funindex acciaccatura @@ -608,10 +631,12 @@ Music Glossary: @rglos{grace notes}, @rglos{acciaccatura}, although they can also be created by prefixing a music expression with the keyword @code{\appoggiatura} or @code{\acciaccatura}: -@lilypond[verbatim,quote,relative=2] -c2 \grace { a32 b } c2 | -c2 \appoggiatura b16 c2 | -c2 \acciaccatura b16 c2 | +@lilypond[verbatim,quote] +\relative { + c''2 \grace { a32 b } c2 | + c2 \appoggiatura b16 c2 | + c2 \acciaccatura b16 c2 | +} @end lilypond @@ -659,24 +684,24 @@ than one voice on the same staff. In LilyPond input files, music is represented by @emph{music expressions}. A single note is a music expression: -@lilypond[verbatim,quote,relative=2] -a4 +@lilypond[verbatim,quote,fragment] +a'4 @end lilypond Enclosing a note in braces creates a @emph{compound music expression}. Here we have created a compound music expression with two notes: -@lilypond[verbatim,quote,relative=2] -{ a4 g4 } +@lilypond[verbatim,quote] +\relative { a'4 g4 } @end lilypond Putting a group of music expressions (e.g. notes) in braces means that they are in sequence (i.e. each one follows the previous one). The result is another music expression: -@lilypond[verbatim,quote,relative=2] -{ { a4 g } f4 g } +@lilypond[verbatim,quote] +\relative { { a'4 g } f4 g } @end lilypond @node Analogy mathematical expressions @@ -738,13 +763,11 @@ following example, three sequences (all containing two separate notes) are combined simultaneously: @lilypond[verbatim,quote] -\relative c'' { - << - { a2 g } - { f2 e } - { d2 b } - >> -} +<< + \relative { a'2 g } + \relative { f'2 e } + \relative { d'2 b } +>> @end lilypond Note that we have indented each level of the input with a @@ -769,8 +792,8 @@ expression, but as it begins with a single note it will be set out on a single staff. @lilypond[verbatim,quote] -\relative c'' { - c2 <> | +\relative { + c''2 <> | << { e2 f } { c2 <> } >> | } @end lilypond @@ -785,10 +808,8 @@ out on a single staff. @cindex notation context @funindex \new Staff -@funindex new Staff @funindex Staff @funindex \new -@funindex new @funindex Score @funindex Voice @funindex Lyrics @@ -806,12 +827,10 @@ staff is marked by adding @code{\new Staff} before it. These and @code{>>}: @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond The command @code{\new} introduces a @q{notation context.} A @@ -836,12 +855,10 @@ is because scores with transposing instruments are more common than polyrhythmic scores. @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" \key d \major \time 3/4 c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" \key d \major \time 3/4 c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond @node Staff groups @@ -880,12 +897,10 @@ inserted inside a @code{PianoStaff}: Here is a small example: @lilypond[verbatim,quote] -\relative c'' { - \new PianoStaff << - \new Staff { \time 2/4 c4 e | g g, | } - \new Staff { \clef "bass" c,,4 c' | e c | } - >> -} +\new PianoStaff << + \new Staff \relative { \time 2/4 c''4 e | g g, | } + \new Staff \relative { \clef "bass" c4 c' | e c | } +>> @end lilypond Other staff groupings are introduced with @code{\new GrandStaff}, @@ -920,8 +935,8 @@ surround the pitches with @emph{single} angle brackets. Note that all the notes in a chord must have the same duration, and that the duration is placed after the closing bracket. -@lilypond[verbatim,quote,relative=2] -r4 2 +@lilypond[verbatim,quote] +\relative { r4 2 } @end lilypond Think of chords as almost equivalent to single notes: @@ -930,11 +945,13 @@ to a chord, and everything must go @emph{outside} the angle brackets. For example, you can combine markings like beams and ties with chords. They must be placed outside the angle brackets. -@lilypond[verbatim,quote,relative=2] -r4 ~ 2 | -8[ ] - 8\>[ ]\! | -r4 8.\p 16( 4-. ) | +@lilypond[verbatim,quote] +\relative { + r4 ~ 2 | + 8[ ] + 8\>[ ]\! | + r4 8.\p 16( 4-. ) | +} @end lilypond @seealso @@ -988,7 +1005,6 @@ This section introduces vocal music and simple song sheets. @cindex songs @funindex \addlyrics -@funindex addlyrics Music Glossary: @rglos{lyrics}. @@ -996,10 +1012,10 @@ Here is the start of the melody to a nursery rhyme, @notation{Girls and boys come out to play}: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } @end lilypond @@ -1009,13 +1025,13 @@ separating each syllable with a space. @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } \addlyrics { - Girls and boys come | out to play, + Girls and boys come out to play, } >> @end lilypond @@ -1043,33 +1059,20 @@ shine as bright as day}. Let's extend it: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c b a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond -If you compile the code in the example above, you should see some -warnings in the console output: - -@example -song.ly:12:29: warning: barcheck failed at: 5/8 - The | moon doth shine as - | bright as day; | -song.ly:12:46: warning: barcheck failed at: 3/8 - The | moon doth shine as | bright as day; - | -@end example - -This is a good example of the usefulness of bar checks. Now, -looking at the music, we see that the extra lyrics do not align +Looking at the music, we see that the extra lyrics do not align properly with the notes. The word @notation{shine} should be sung on two notes, not one. This is called a @notation{melisma}, a single syllable sung to more than one note. There are several @@ -1078,15 +1081,15 @@ to add a slur across them, for details, see @ref{Ties and slurs}: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c( b) a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond @@ -1099,15 +1102,15 @@ manual beams}. @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c([ b]) a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine as | bright as day; | + Girls and boys come out to play, + The moon doth shine as bright as day; } >> @end lilypond @@ -1118,15 +1121,15 @@ that should be included in the melisma: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c[ b] a | d4 b8 g4. | } \addlyrics { - Girls and boys come | out to play, - The | moon doth shine _ as | bright as day; | + Girls and boys come out to play, + The moon doth shine _ as bright as day; } >> @end lilypond @@ -1140,15 +1143,15 @@ first three bars of @notation{Dido's Lament}, from Purcell's @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \minor \time 3/2 - g2 a bes | bes2( a) b2 | + g'2 a bes | bes2( a) b2 | c4.( bes8 a4. g8 fis4.) g8 | fis1 } \addlyrics { - When I am | laid, - am | laid __ in | earth, + When I am laid, + am laid __ in earth, } >> @end lilypond @@ -1164,16 +1167,16 @@ far about aligning lyrics to notes. @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \key g \major \time 3/4 \partial 4 - d4 | g4 g a8( b) | g4 g b8( c) | + d'4 | g4 g a8( b) | g4 g b8( c) | d4 d e | c2 } \addlyrics { - A -- | way in a __ | man -- ger, - no __ | crib for a | bed, __ + A -- way in a __ man -- ger, + no __ crib for a bed, } >> @end lilypond @@ -1190,14 +1193,14 @@ Here's an example from Rossini's @notation{Figaro}, where @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \clef "bass" \key c \major \time 6/8 - c4.~ c8 d b | c8([ d]) b c d b | c8 + c'4.~ 8 d b | c8([ d]) b c d b | c8 } \addlyrics { - Lar -- go_al fac -- | to -- tum del -- la cit -- | tà + Lar -- go_al fac -- to -- tum del -- la cit -- tà } >> @end lilypond @@ -1220,23 +1223,23 @@ example from Handel's @notation{Judas Maccabæus}: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key f \major \time 6/8 \partial 8 - c8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ c4 + c''8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ 4 } \addlyrics { - Let | flee -- cy flocks the | hills a -- | dorn, __ + Let flee -- cy flocks the hills a -- dorn, __ } - \relative c' { + \relative { \key f \major \time 6/8 \partial 8 - r8 | r4. r4 c8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 + r8 | r4. r4 c'8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 } \addlyrics { - Let | flee -- cy flocks the | hills a -- dorn, + Let flee -- cy flocks the hills a -- dorn, } >> @end lilypond @@ -1300,13 +1303,13 @@ later by placing a backslash in front of the name @lilypond[verbatim,quote] violin = \new Staff { - \relative c'' { - a4 b c b + \relative { + a'4 b c b } } cello = \new Staff { - \relative c { + \relative { \clef "bass" e2 d } @@ -1321,8 +1324,7 @@ cello = \new Staff { @end lilypond @noindent -The name of a variable must have alphabetic characters only, no -numbers, underscores, or dashes. +By convention, variable names consist of alphabetic characters only. Variables must be defined @emph{before} the main music expression, but may be used as many times as required anywhere after @@ -1331,12 +1333,10 @@ of another variable, giving a way of shortening the input if a section of music is repeated many times. @lilypond[verbatim,quote] -tripletA = \tuplet 3/2 { c,8 e g } +tripletA = \relative { \tuplet 3/2 { c'8 e g } } barA = { \tripletA \tripletA \tripletA \tripletA } -\relative c'' { - \barA \barA -} +{ \barA \barA } @end lilypond Variables may be used for many other types of objects in @@ -1371,7 +1371,6 @@ places. The following example uses the above variables: @cindex header block @funindex \header -@funindex header The title, composer, opus number, and similar information are entered in the @code{\header} block. This exists outside of the @@ -1407,13 +1406,13 @@ above the music. More information on titling can be found in @cindex pitches, absolute values @cindex absolute note names -So far we have always used @code{\relative} to define pitches. +So far we have used @code{\relative} to define pitches. This is usually the fastest way to enter most music. Without @code{\relative}, pitches are interpreted in absolute mode. In this mode, 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 +@code{c'} will always mean middle@tie{}C, a @code{b} will always mean +the note one step below middle@tie{}C, and a @code{g,} will always mean the note on the bottom staff of the bass clef. @lilypond[verbatim,quote] @@ -1424,44 +1423,39 @@ the note on the bottom staff of the bass clef. } @end lilypond -Here is a four-octave scale: +Writing a melody in the treble clef involves a lot +of quote @code{'} marks. Consider this fragment from Mozart: @lilypond[verbatim,quote] { - \clef "bass" - c,4 d, e, f, | - g,4 a, b, c | - d4 e f g | - a4 b c' d' | - \clef "treble" - e'4 f' g' a' | - b'4 c'' d'' e'' | - f''4 g'' a'' b'' | - c'''1 | + \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 -As you can see, writing a melody in the treble clef involves a lot -of quote @code{'} marks. Consider this fragment from Mozart: +@funindex \fixed +Common octave marks can be indicated just once, using the command +@code{\fixed} followed by a reference pitch: @lilypond[verbatim,quote] -{ +\fixed c'' { \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 | + cis8. d16 cis8 e4 e8 | + b,8. cis16 b,8 d4 d8 | } @end lilypond -All these quotes makes the input less readable and they are a source -of errors. With @code{\relative}, the previous example is much -easier to read and type: +With @code{\relative}, the previous example needs no octave marks +because this melody moves in steps no larger than three staff positions: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key a \major \time 6/8 - cis8. d16 cis8 e4 e8 | + cis''8. d16 cis8 e4 e8 | b8. cis16 b8 d4 d8 | } @end lilypond @@ -1482,16 +1476,18 @@ using @code{\relative} inside of @code{\relative}, the outer and inner relative sections are independent: @lilypond[verbatim,quote] -\relative c { c'4 \relative c'' { f g } c } +\relative { c'4 \relative { f'' g } c } @end lilypond -@funindex \absolute -If you are using absolute music inside of relative, you'll need to -mark the absolute music explicitly with @code{\absolute} to stop -it from becoming part of the relative music: +To use absolute mode inside of @code{\relative}, put the absolute +music inside @code{\fixed c @{ @dots{} @}} and the absolute pitches +will not affect the octaves of the relative music: @lilypond[verbatim,quote] -\relative c { c'4 \absolute { f'' g'' } c } +\relative { + c'4 \fixed c { f'' g'' } c | + c4 \fixed c'' { f g } c +} @end lilypond @node After the tutorial diff --git a/Documentation/learning/fundamental.itely b/Documentation/learning/fundamental.itely index 7a733b5edf..6b74fe954a 100644 --- a/Documentation/learning/fundamental.itely +++ b/Documentation/learning/fundamental.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.29" +@c \version "2.19.22" @node Fundamental concepts @chapter Fundamental concepts @@ -68,9 +68,7 @@ There are many variations of this basic pattern, but this example serves as a useful starting place. @funindex \book -@funindex book @funindex \score -@funindex score @cindex book @cindex score @@ -80,8 +78,8 @@ adds the extra commands which are needed when you give it simple input. LilyPond treats input like this: @example -\relative c'' @{ - c4 a d c +\relative @{ + c''4 a d c @} @end example @@ -93,8 +91,8 @@ as shorthand for this: \score @{ \new Staff @{ \new Voice @{ - \relative c'' @{ - c4 a b c + \relative @{ + c''4 a b c @} @} @} @@ -154,11 +152,8 @@ things, such as @end example @funindex \header -@funindex header @funindex \layout -@funindex layout @funindex \midi -@funindex midi @cindex header @cindex layout @cindex midi @@ -178,13 +173,12 @@ Two more commands you have not previously seen are shown they will cause LilyPond to produce a printed output and a MIDI output respectively. They are described fully in the Notation Reference -- @ruser{Score layout}, and -@ruser{Creating MIDI files}. +@ruser{Creating MIDI output}. @cindex scores, multiple @cindex book block, implicit @cindex implicit book block @funindex \book -@funindex book You may code multiple @code{\score} blocks. Each will be treated as a separate score, but they will be all combined into @@ -222,8 +216,8 @@ shown in @ref{Organizing pieces with variables}. All the templates use this: @example -melody = \relative c' @{ - c4 a b c +melody = \relative @{ + c'4 a b c @} \score @{ @@ -252,7 +246,6 @@ For a complete definition of the input format, see @subsection Score is a (single) compound musical expression @funindex \score -@funindex score @cindex score @cindex contents of a score block @cindex score block, contents of @@ -341,8 +334,8 @@ At this stage, we could start filling in notes. Inside the curly braces next to @code{\new Voice = "vocal"}, we could start writing @example -\relative c'' @{ - r4 d8\noBeam g, c4 r +\relative @{ + r4 d''8\noBeam g, c4 r @} @end example @@ -360,10 +353,10 @@ So, adding a few notes and a bass clef for the left hand, we now have a piece of real music: @lilypond[verbatim,quote,ragged-right] -melody = \relative c'' { r4 d8\noBeam g, c4 r } +melody = \relative { r4 d''8\noBeam g, c4 r } text = \lyricmode { And God said, } -upper = \relative c'' { 2~ } -lower = \relative c { b2 e } +upper = \relative { 2~ } +lower = \relative { b,2 e } \score { << @@ -409,8 +402,8 @@ duration of three notes: @lilypond[verbatim,quote,ragged-right] \new Staff { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -436,8 +429,8 @@ as follows: @lilypond[verbatim,quote,ragged-right] \new Staff = "main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -519,8 +512,8 @@ So, for example, a phrasing slur can start before a manually inserted beam and end before the end of the beam -- not very musical, perhaps, but possible: -@lilypond[quote,verbatim,ragged-right,relative=2] -g8\( a b[ c b\) a] g4 +@lilypond[quote,verbatim,ragged-right] +\relative { g'8\( a b[ c b\) a] g4 } @end lilypond In general, different kinds of brackets, bracket-like constructs, @@ -530,11 +523,13 @@ a slur extending into a tuplet (line 2), a beam and a slur extending into a tuplet, a tie crossing two tuplets, and a phrasing slur extending out of a tuplet (lines 3 and 4). -@lilypond[quote,verbatim,ragged-right,relative=1] -r16[ g \tuplet 3/2 { r16 e'8] } -g,16( a \tuplet 3/2 { b16 d) e } -g,8[( a \tuplet 3/2 { b8 d) e~] } | -\tuplet 5/4 { e32\( a, b d e } a4.\) +@lilypond[quote,verbatim,ragged-right] +\relative { + r16[ g' \tuplet 3/2 { r16 e'8] } + g,16( a \tuplet 3/2 { b16 d) e } + g,8[( a \tuplet 3/2 { b8 d) e~] } | + \tuplet 5/4 { e32\( a, b d e } a4.\) +} @end lilypond @@ -586,9 +581,11 @@ A single voice can contain many notes in a chord, of course, so when exactly are multiple voices needed? Look first at this example of four chords: -@lilypond[quote,verbatim,ragged-right,relative=1] -\key g \major -4 +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + 4 +} @end lilypond This can be expressed using just the single angle bracket chord @@ -621,22 +618,26 @@ of polyphony. Here's how we split the chords above into two voices and add both the passing note and a slur: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key g \major -% Voice "1" Voice "2" -<< { g4 fis8( g) a4 g } \\ { d4 d d d } >> +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + % Voice = "1" Voice = "2" + << { g'4 fis8( g) a4 g } \\ { d4 d d d } >> +} @end lilypond Notice how the stems of the second voice now point down. Here's another simple example: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key d \minor -% Voice "1" Voice "2" -<< { r4 g g4. a8 } \\ { d,2 d4 g } >> | -<< { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> | -<< { a2. r4 } \\ { fis2. s4 } >> | +@lilypond[quote,verbatim,ragged-right] +\relative { + \key d \minor + % Voice = "1" Voice = "2" + << { r4 g' g4. a8 } \\ { d,2 d4 g } >> | + << { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> | + << { a2. r4 } \\ { fis2. s4 } >> | +} @end lilypond It is not necessary to use a separate @code{<< \\ >>} construct @@ -645,19 +646,20 @@ can help the legibility of the code, but if there are many notes in each bar it may be better to split out each voice separately, like this: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key d \minor -<< { - % Voice "1" - r4 g g4. a8 | - bes4 bes c bes | - a2. r4 | -} \\ { - % Voice "2" - d,2 d4 g | - g4 g g8( a) g4 | - fis2. s4 | -} >> +@lilypond[quote,verbatim,ragged-right] +<< + \key d \minor + \relative { % Voice = "1" + r4 g' g4. a8 | + bes4 bes c bes | + a2. r4 | + } \\ + \relative { % Voice = "2" + d'2 d4 g | + g4 g g8( a) g4 | + fis2. s4 | + } +>> @end lilypond @@ -678,12 +680,12 @@ voice in context @code{"1"} and the lowest voice in context of slurs, stems, ties, dynamics etc., is set appropriately. @lilypond[quote,verbatim] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f - % Voice "1" Voice "2" Voice "3" + c'16 d e f + % Voice = "1" Voice = "2" Voice = "3" << { g4 f e } \\ { r8 e4 d c8~ } >> | - << { d2 e } \\ { c8 b16 a b8 g~ g2 } \\ { s4 b c2 } >> | + << { d2 e } \\ { c8 b16 a b8 g~ 2 } \\ { s4 b c2 } >> | } @end lilypond @@ -702,9 +704,9 @@ split across the same voices in two constructs, shown here in the blue triangle voice. @lilypond[quote,verbatim] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f + c'16 d e f << % Bar 1 { \voiceOneStyle @@ -721,7 +723,7 @@ blue triangle voice. { d2 e } \\ % Voice 2 continues - { c8 b16 a b8 g~ g2 } + { c8 b16 a b8 g~ 2 } \\ { \voiceThreeStyle @@ -759,7 +761,7 @@ the note immediately preceding it, or to the first note of the preceding chord. So in @example -\relative c' @{ noteA << < noteB noteC > \\ noteD >> noteE @} +\relative @{ noteA << < noteB noteC > \\ noteD >> noteE @} @end example @noindent @@ -774,13 +776,13 @@ voices are widely separated, is to place a @code{\relative} command at the start of each voice: @example -\relative c' @{ noteA @dots{} @} +\relative @{ noteA @dots{} @} << - \relative c'' @{ < noteB noteC > @dots{} @} + \relative @{ < noteB noteC > @dots{} @} \\ - \relative g' @{ noteD @dots{} @} + \relative @{ noteD @dots{} @} >> -\relative c' @{ noteE @dots{} @} +\relative @{ noteE @dots{} @} @end example Let us finally analyze the voices in a more complex piece of music. @@ -794,14 +796,14 @@ later sections. @c The following should appear as music without code @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << % Voice one - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ % Voice two { % Ignore these for now - they are explained in Ch 4 - \once \override NoteColumn.ignore-collision = ##t + \once \override NoteColumn.force-hshift = #0 2 \once \override NoteColumn.force-hshift = #0.5 des2 @@ -841,17 +843,17 @@ not understand. @c The following should appear as music without code @c The three voice styles should be defined in -init @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << { % Voice one \voiceOneStyle - c2 aes4. bes8 + c''2 aes4. bes8 } \\ % Voice two { \voiceTwoStyle % Ignore these for now - they are explained in Ch 4 - \once \override NoteColumn.ignore-collision = ##t + \once \override NoteColumn.force-hshift = #0 2 \once \override NoteColumn.force-hshift = #0.5 des2 @@ -874,10 +876,10 @@ we have learnt, using the @code{<< \\ >>} construct to enter the music of the first bar in three voices: @lilypond[quote,verbatim,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } + { c''2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } >> | 1 | } @@ -897,10 +899,10 @@ and placing the music in voice four. This is done by simply adding another pair of @code{\\}. @lilypond[quote,verbatim,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << % Voice one - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ % Voice two { 2 des } \\ % Omit Voice three @@ -935,15 +937,10 @@ Notation Reference: @ruser{Multiple voices}. @subsection Explicitly instantiating voices @funindex \voiceOne -@funindex voiceOne @funindex \voiceTwo -@funindex voiceTwo @funindex \voiceThree -@funindex voiceThree @funindex \voiceFour -@funindex voiceFour @funindex \oneVoice -@funindex oneVoice @funindex \new Voice @cindex voice contexts, creating @@ -959,8 +956,8 @@ the previous section: @example \new Staff @{ - \relative c' @{ - << @{ e4 f g a @} \\ @{ c,4 d e f @} >> + \relative @{ + << @{ e'4 f g a @} \\ @{ c,4 d e f @} >> @} @} @end example @@ -970,8 +967,8 @@ is equivalent to @example \new Staff << - \new Voice = "1" @{ \voiceOne \relative c' @{ e4 f g a @} @} - \new Voice = "2" @{ \voiceTwo \relative c' @{ c4 d e f @} @} + \new Voice = "1" @{ \voiceOne \relative @{ e'4 f g a @} @} + \new Voice = "2" @{ \voiceTwo \relative @{ c'4 d e f @} @} >> @end example @@ -980,8 +977,8 @@ Both of the above would produce @c The following example should not display the code @lilypond[ragged-right,quote] \new Staff << - \new Voice = "1" { \voiceOne \relative c' { e4 f g a } } - \new Voice = "2" { \voiceTwo \relative c' { c4 d e f } } + \new Voice = "1" { \voiceOne \relative { e'4 f g a } } + \new Voice = "2" { \voiceTwo \relative { c'4 d e f } } >> @end lilypond @@ -1002,27 +999,27 @@ Let us see in some simple examples exactly what effect markup, ties, slurs, and dynamics: @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { % Default behavior or behavior after \oneVoice - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceOne - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceTwo - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @@ -1038,10 +1035,10 @@ notes demonstrate that the main melody is now in a single voice context, permitting a phrasing slur to be drawn over them. @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { +\new Staff \relative { \voiceOneStyle % This section is homophonic - c16^( d e f + c'16^( d e f % Start simultaneous section of three voices << % Continue the main voice in parallel @@ -1050,7 +1047,7 @@ permitting a phrasing slur to be drawn over them. \new Voice { % Set stems, etc., down \voiceTwo - r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1073,15 +1070,15 @@ voice appears only briefly this might be a more natural way to typeset the music: @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { - c16^( d e f +\new Staff \relative { + c'16^( d e f << { g4 f e | d2 e) | } \new Voice { \voiceTwo r8 e4 d c8~ | << - { c8 b16 a b8 g~ g2 | } + { c8 b16 a b8 g~ 2 | } \new Voice { \voiceThree s4 b c2 | @@ -1102,17 +1099,17 @@ spacing notes to step over sections where the voice is silent, as here: @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' << +\new Staff \relative << % Initiate first voice \new Voice { \voiceOne - c16^( d e f g4 f e | d2 e) | + c'16^( d e f g4 f e | d2 e) | } % Initiate second voice \new Voice { % Set stems, etc, down \voiceTwo - s4 r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + s4 r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1130,13 +1127,9 @@ as here: @cindex collisions, notes @cindex shift commands @funindex \shiftOff -@funindex shiftOff @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn Closely spaced notes in a chord, or notes occurring at the same time in different voices, are arranged in two, occasionally more, @@ -1167,7 +1160,8 @@ with stems up and one note (or chord) from a voice with stems down. If notes from two voices which have their stems in the same direction are placed at the same position and both voices have no shift or the same shift specified, the error message -@qq{Too many clashing note columns} will be produced. +@qq{This voice needs a @code{@bs{}voiceXx} or @code{@bs{}shiftXx} setting} +will be produced. @seealso @@ -1186,7 +1180,6 @@ expressions -- notes and lyrics. @funindex \new Lyrics @funindex \lyricsto -@funindex lyricsto @funindex Lyrics @cindex Lyrics context, creating @cindex lyrics, linking to voice @@ -1202,10 +1195,10 @@ name assigned to the Voice. @lilypond[quote,verbatim] << \new Voice = "one" { - \relative c'' { + \relative { \autoBeamOff \time 2/4 - c4 b8. a16 | g4. f8 | e4 d | c2 | + c''4 b8. a16 | g4. f8 | e4 d | c2 | } } \new Lyrics \lyricsto "one" { @@ -1222,7 +1215,6 @@ explicitly. @cindex lyrics and beaming @cindex beaming and lyrics @funindex \autoBeamOff -@funindex autoBeamOff The automatic beaming which LilyPond uses by default works well for instrumental music, but not so well for music with lyrics, @@ -1233,7 +1225,6 @@ melismata in the lyrics. In the example above we use the command @funindex \new ChoirStaff @funindex ChoirStaff @funindex \lyricmode -@funindex lyricmode @cindex vocal score structure @cindex choir staff @@ -1248,14 +1239,14 @@ rather than music. @lilypond[quote,verbatim] global = { \key f \major \time 6/8 \partial 8 } -SopOneMusic = \relative c'' { - c8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ c4 +SopOneMusic = \relative { + c''8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ 4 } SopOneLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, __ } -SopTwoMusic = \relative c' { - r8 | r4. r4 c8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' +SopTwoMusic = \relative { + r8 | r4. r4 c'8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' } SopTwoLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, @@ -1307,10 +1298,10 @@ examples this is often called @q{global}. @lilypond[quote,verbatim] keyTime = { \key c \major \time 4/4 \partial 4 } -SopMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyricmode { E -- | ter -- nal fa -- ther, | strong to save, } @@ -1373,8 +1364,8 @@ appear explicitly in the input file must be added to the output. For example, compare the input and output of the following example: -@lilypond[quote,verbatim,relative=2] -cis4 cis2. | a4 a2. | +@lilypond[quote,verbatim] +\relative { cis''4 cis2. | a4 a2. | } @end lilypond The input is rather sparse, but in the output, bar lines, @@ -1441,7 +1432,6 @@ Notation Reference: @ruser{Contexts explained}. @subsection Creating contexts @funindex \new -@funindex new @cindex new contexts @cindex creating contexts @cindex contexts, creating @@ -1486,8 +1476,8 @@ annotated real-music example: \clef "treble" \key g \minor \new Voice { % create voice for RH notes - \relative c'' { % start of RH notes - d4 ees16 c8. | + \relative { % start of RH notes + d''4 ees16 c8. | d4 ees16 c8. | } % end of RH notes } % end of RH voice @@ -1497,14 +1487,14 @@ annotated real-music example: \key g \minor \new Voice { % create LH voice one \voiceOne - \relative g { % start of LH voice one notes + \relative { % start of LH voice one notes g8 ees, | g8 ees, | } % end of LH voice one notes } % end of LH voice one \new Voice { % create LH voice two \voiceTwo - \relative g { % start of LH voice two notes + \relative { % start of LH voice two notes g4 ees | g4 ees | } % end of LH voice two notes @@ -1643,9 +1633,7 @@ Internals reference: @rinternals{Engravers and Performers}. @cindex context properties, modifying @cindex modifying context properties @funindex \set -@funindex set @funindex \unset -@funindex unset Contexts are responsible for holding the values of a number of context @emph{properties}. Many of them can be changed to @@ -1724,13 +1712,13 @@ because we omitted the context name. @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { + \new Staff \relative { \set Staff.instrumentName = #"Soprano" - c2 c + c''2 c } - \new Staff \relative c' { + \new Staff \relative { \set instrumentName = #"Alto" % Wrong! - d2 d + d'2 d } >> @end lilypond @@ -1769,12 +1757,12 @@ So this turns off extra naturals in one staff: @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - aeses2 aes + \new Staff \relative { + aeses'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Staff.extraNatural = ##f - aeses2 aes + aeses'2 aes } >> @end lilypond @@ -1784,12 +1772,12 @@ and this turns them off in all staves: @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - aeses2 aes + \new Staff \relative { + aeses'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Score.extraNatural = ##f - aeses2 aes + aeses'2 aes } >> @end lilypond @@ -1813,17 +1801,19 @@ font size, which affects the size of the note heads (among other things) several times. The change is from the default value, not the most recently set value. -@lilypond[quote,verbatim,ragged-right,relative=1] -c4 d -% make note heads smaller -\set fontSize = #-4 -e4 f | -% make note heads larger -\set fontSize = #2.5 -g4 a -% return to default size -\unset fontSize -b4 c | +@lilypond[quote,verbatim,ragged-right] +\relative { + c'4 d + % make note heads smaller + \set fontSize = #-4 + e4 f | + % make note heads larger + \set fontSize = #2.5 + g4 a + % return to default size + \unset fontSize + b4 c | +} @end lilypond We have now seen how to set the values of several different types of @@ -1837,7 +1827,6 @@ general way by using the very powerful @code{\markup} command. @subsubheading Setting context properties with @code{\with} @funindex \with -@funindex with @cindex context properties, setting with \with The default value of context properties may be set at the time the @@ -1859,13 +1848,13 @@ like this: @lilypond[quote,verbatim,ragged-right] << \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } \new Staff \with { extraNatural = ##f } { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } >> @@ -1886,7 +1875,6 @@ with @code{\set}, this new default value may be restored with the @cindex context properties, setting with \context @funindex \context -@funindex context The values of context properties may be set in @emph{all} contexts of a particular type, such as all @code{Staff} contexts, with a single @@ -1902,8 +1890,8 @@ throughout the @code{\score} or @code{\book} block in which the @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - cisis4 e d cis + \relative { + cisis''4 e d cis } } \layout { @@ -1922,13 +1910,13 @@ within the score: \score { << \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } >> @@ -1965,9 +1953,7 @@ Internals Reference: @cindex removing engravers @funindex \consists -@funindex consists @funindex \remove -@funindex remove We have seen that contexts each contain several engravers, each of which is responsible for producing a particular part of the @@ -1990,8 +1976,8 @@ produced by the @code{Staff_symbol_engraver}. \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c' { - c4 d +\relative { + c'4 d \set fontSize = #-4 % make note heads smaller e4 f | \set fontSize = #2.5 % make note heads larger @@ -2021,15 +2007,15 @@ range from that voice only: \new Voice \with { \consists "Ambitus_engraver" } { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @@ -2046,15 +2032,15 @@ the notes in all the voices on that staff: } << \new Voice { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @@ -2063,7 +2049,6 @@ the notes in all the voices on that staff: @subsubheading Changing all contexts of the same type @funindex \layout -@funindex layout The examples above show how to remove or add engravers to individual contexts. It is also possible to remove or add @@ -2076,24 +2061,24 @@ staff in a four-staff score, we could write \score { << \new Staff { - \relative c'' { - c4 a b g + \relative { + c''4 a b g } } \new Staff { - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "G_8" - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "bass" - \relative c { + \relative { c4 a b g } } @@ -2155,7 +2140,7 @@ soprano and cello. In this case, we would start with the @example \version @w{"@version{}"} -melody = \relative c' @{ +melody = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2184,7 +2169,7 @@ Now we want to add a cello part. Let's look at the @q{Notes only} example: @example \version @w{"@version{}"} -melody = \relative c' @{ +melody = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2212,7 +2197,7 @@ section for the soprano @code{sopranoMusic} and the section for the cello @code{celloMusic}. While we're doing this, let's rename @code{text} to be @code{sopranoLyrics}. Remember to rename both instances of all these names -- both the initial definition (the -@code{melody = \relative c' @{ } part) and the name's use (in the +@code{melody = \relative @{ } part) and the name's use (in the @code{\score} section). While we're doing this, let's change the cello part's staff -- @@ -2222,7 +2207,7 @@ different notes. @example \version @w{"@version{}"} -sopranoMusic = \relative c' @{ +sopranoMusic = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2233,7 +2218,7 @@ sopranoLyrics = \lyricmode @{ Aaa Bee Cee Dee @} -celloMusic = \relative c @{ +celloMusic = \relative @{ \clef "bass" \key c \major \time 4/4 @@ -2290,7 +2275,7 @@ This looks a bit messy; the indentation is messed up now. That is easily fixed. Here's the complete soprano and cello template. @lilypond[quote,verbatim,ragged-right,addversion] -sopranoMusic = \relative c' { +sopranoMusic = \relative { \clef "treble" \key c \major \time 4/4 @@ -2301,7 +2286,7 @@ sopranoLyrics = \lyricmode { Aaa Bee Cee Dee } -celloMusic = \relative c { +celloMusic = \relative { \clef "bass" \key c \major \time 4/4 @@ -2347,44 +2332,44 @@ from Handel's Messiah: @lilypond[quote,ragged-right] global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis e2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis e2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4
2 4 | + r4 2 4 | 4. 8 2 | 4 2 | } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 | + 4 2 4 | 4. 8 2 | 4 2 | } @@ -2438,7 +2423,15 @@ lower = \relative c, { } @end lilypond -None of the templates provides this layout exactly. The nearest is +@warning{This layout can be achieved very easily using the built-in +template: @code{satb.ly}, see @ref{Built-in templates}. But for ease +of use this template deliberately hides the necessary context +structure, instead providing it automatically. So for purposes of +learning let us see how to build this up from scratch. You may need +to do this if the built-in template does not meet your needs +adequately.} + +The nearest copy-and-edit template to this layout is @ref{SATB vocal score and automatic piano reduction} -- but we need to change the layout and add a piano accompaniment which is not derived automatically from the vocal parts. @@ -2578,39 +2571,39 @@ for the three bars of the example above gives: @lilypond[quote,verbatim,ragged-right,addversion] global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis fis2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis fis2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4 2 4 | + r4 2 4 | 4. 8 2 | 4 2 | } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 | + 4 2 4 | 4. 8 2 | 4 2 | } @@ -2909,20 +2902,20 @@ is to add the music, and combine all the parts together. composer = "J S Bach" } keyTime = { \key c \minor \time 4/4 } -ManualOneVoiceOneMusic = \relative g' { - g4 g f ees | +ManualOneVoiceOneMusic = \relative { + g'4 g f ees | d2 c | } -ManualOneVoiceTwoMusic = \relative c' { - ees16 d ees8~ ees16 f ees d c8 d~ d c~ | - c8 c4 b8 c8. g16 c b c d | +ManualOneVoiceTwoMusic = \relative { + ees'16 d ees8~ 16 f ees d c8 d~ d c~ | + 8 c4 b8 c8. g16 c b c d | } -ManualTwoMusic = \relative c' { - c16 b c8~ c16 b c g a8 g~ g16 g aes ees | - f16 ees f d g aes g f ees d ees8~ ees16 f ees d | +ManualTwoMusic = \relative { + c'16 b c8~ 16 b c g a8 g~ 16 g aes ees | + f16 ees f d g aes g f ees d ees8~ 16 f ees d | } -PedalOrganMusic = \relative c { - r8 c16 d ees d ees8~ ees16 a, b g c b c8 | +PedalOrganMusic = \relative { + r8 c16 d ees d ees8~ 16 a, b g c b c8 | r16 g ees f g f g8 c,2 | } @@ -2975,7 +2968,7 @@ Music Glossary: By this point, you've seen this kind of thing: @lilypond[quote,verbatim,ragged-right] -hornNotes = \relative c'' { c4 b dis c } +hornNotes = \relative { c''4 b dis c } \score { { @@ -2987,8 +2980,8 @@ hornNotes = \relative c'' { c4 b dis c } You may even realize that this could be useful in minimalist music: @lilypond[quote,verbatim,ragged-right] -fragmentA = \relative c'' { a4 a8. b16 } -fragmentB = \relative c'' { a8. gis16 ees4 } +fragmentA = \relative { a'4 a8. b16 } +fragmentB = \relative { a'8. gis16 ees4 } violin = \new Staff { \fragmentA \fragmentA | @@ -3005,21 +2998,21 @@ violin = \new Staff { However, you can also use these variables (also known as macros, or user-defined commands) for tweaks: -@c TODO Avoid padtext - not needed with skylining @lilypond[quote,verbatim,ragged-right] dolce = \markup { \italic \bold dolce } -padText = { \once \override TextScript.padding = #5.0 } +centreText = { \once \override TextScript.self-alignment-X = #CENTER } + fthenp =_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } -violin = \relative c'' { +violin = \relative { \repeat volta 2 { - c4._\dolce b8 a8 g a b | - \padText - c4.^"hi there!" d8 e' f g d | - c,4.\fthenp b8 c4 c-. | + c''4._\dolce b8 a8 g a b | + \centreText + c4.^"hi there!" d8 e f g d | + c4.\fthenp b8 c4 c-. | } } @@ -3027,7 +3020,6 @@ violin = \relative c'' { { \violin } - \layout { ragged-right = ##t } } @end lilypond @@ -3039,12 +3031,12 @@ variables. It's a lot harder to read, especially the last line. @example -violin = \relative c'' @{ +violin = \relative @{ \repeat volta 2 @{ - c4._\markup @{ \italic \bold dolce @} b8 a8 g a b | - \once \override TextScript.padding = #5.0 - c4.^"hi there!" d8 e' f g d | - c,4.\markup @{ + c''4._\markup @{ \italic \bold dolce @} b8 a8 g a b | + \once \override TextScript.self-alignment-X = #CENTER + c4.^"hi there!" d8 e f g d | + c4._\markup @{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} b8 c4 c-. | @@ -3052,13 +3044,10 @@ violin = \relative c'' @{ @} @end example -@c TODO Replace the following with a better example -td -@c Skylining handles this correctly without padText - So far we've seen static substitution -- when LilyPond -sees @code{\padText}, it replaces it with the stuff that +sees @code{\centreText}, it replaces it with the stuff that we've defined it to be (ie the stuff to the right of -@code{padtext=}). +@code{centreText=}). LilyPond can handle non-static substitution, too (you can think of these as functions). @@ -3066,18 +3055,18 @@ can think of these as functions). @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function - (parser location padding) + (padding) (number?) #{ \once \override TextScript.padding = #padding #}) -\relative c''' { - c4^"piu mosso" b a b | +\relative { + c''4^"piu mosso" b a b \padText #1.8 - c4^"piu mosso" d e f | + c4^"piu mosso" b a b \padText #2.6 - c4^"piu mosso" fis a g | + c4^"piu mosso" b a b } @end lilypond @@ -3104,7 +3093,7 @@ suppose that the file @file{horn-music.ly} contains the following part of a horn/@/bassoon duo @example -hornNotes = \relative c @{ +hornNotes = \relative @{ \time 2/4 r4 f8 a | cis4 f | e4 d | @} @@ -3141,7 +3130,7 @@ 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 { +\transpose f c' \relative { \time 2/4 r4 f8 a | cis4 f | e4 d | } @@ -3159,22 +3148,18 @@ takes 3@tie{}measures in 2/4 time R2*3 @end example -When printing the part, multi-rests -must be condensed. This is done by setting a run-time variable +When printing the part, multi-measure rests must be compressed. There +is a music function available to do this: @example -\set Score.skipBars = ##t +\compressMMRests @{ ... @} @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 +Applying this to @code{hornNotes} gives: @lilypond[quote,ragged-right] -\transpose f c' \relative c { +\compressMMRests \transpose f c' \relative { \time 2/4 - \set Score.skipBars = ##t R2*3 | r4 f8 a | cis4 f | e4 d | } @@ -3199,7 +3184,7 @@ that the other voice is in @code{bassoonNotes} in the file leading to @lilypond[quote,ragged-right] -\relative c << +\relative << \new Staff { \clef "treble" \time 2/4 @@ -3215,5 +3200,13 @@ leading to >> @end lilypond +@seealso +Learning Manual: +@ref{Organizing pieces with variables}. +Notation Reference: +@ruser{Transpose}, +@ruser{Writing parts}, +@ruser{Full measure rests}, +@ruser{Including LilyPond files}. diff --git a/Documentation/learning/templates.itely b/Documentation/learning/templates.itely index 2370ff1f3b..2f04fae957 100644 --- a/Documentation/learning/templates.itely +++ b/Documentation/learning/templates.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.25" @node Templates @appendix Templates @@ -18,6 +18,7 @@ already set up for you. Just add notes, run LilyPond, and enjoy beautiful printed scores! @menu +* Built-in templates:: * Single staff templates:: * Piano templates:: * String quartet templates:: @@ -28,6 +29,315 @@ beautiful printed scores! @end menu +@node Built-in templates +@appendixsec Built-in templates + +Some templates, suitable for a range of choral music, are built into +LilyPond. These may be used to create simple choral music, with or +without piano accompaniment, in two, four or eight staves. Unlike +other templates, these templates are @q{built-in}, which means they do +not need to be copied and edited: instead they are simply +@code{@bs{}include}'d in the input file. + +@warning {Unlike most included files, these built-in templates must be +@code{@bs{}include}'d at the @emph{end} of the input file.} + +The required music expressions are entered by defining values for +specific variables. These definitions must come before the +@code{@bs{}include}'d file. + +@menu +* SATB template:: +* SSAATTBB template:: +@end menu + +@node SATB template +@appendixsubsec SATB template + +The music may be set out with one or two voices per staff by setting +@code{TwoVoicesPerStaff} to @code{##f} or @code{##t} respectively. + +Here's the complete input file for producing a full four-part SATB +arrangement with individual lyrics and piano accompaniment: + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a'4\f a8 a a4 a } + SopranoLyrics = \lyricmode { Sop -- ra -- no ly -- rics } + AltoMusic = \relative { d'4\f d d d } + AltoLyrics = \lyricmode { Al -- to ly -- rics } + TenorMusic = \relative { a4\p a a a } + TenorLyrics = \lyricmode { Te -- nor ly -- rics } + BassMusic = \relative { c2\p c4 c } + BassLyrics = \lyricmode { Bass ly -- rics } + PianoRHMusic = \relative { c' e g c } + PianoDynamics = { s2\mp s4 s4 } + PianoLHMusic = \relative { c e g c } + \include "satb.ly" +@end lilypond + +The same input can be used to produce a score with two voices +per staff just by setting @code{TwoVoicesPerStaff} to @code{##t}. +Again, each voice has individual lyrics. + + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a'4\f a8 a a4 a } + SopranoLyrics = \lyricmode { Sop -- ra -- no ly -- rics } + AltoMusic = \relative { d'4\f d d d } + AltoLyrics = \lyricmode { Al -- to ly -- rics } + TenorMusic = \relative { a4\p a a a } + TenorLyrics = \lyricmode { Te -- nor ly -- rics } + BassMusic = \relative { c2\p c4 c } + BassLyrics = \lyricmode { Bass ly -- rics } + PianoRHMusic = \relative { c' e g c } + PianoDynamics = { s2\mp s4 s4 } + PianoLHMusic = \relative { c e g c } + TwoVoicesPerStaff = ##t + \include "satb.ly" +@end lilypond + +When @code{TwoVoicesPerStaff} is set to false or allowed to default, +any of the music variables may be omitted to produce arrangements +with fewer voices. Here, for example, is how the input file for a +Soprano/Bass duet might be written: + +@lilypond[verbatim,quote] + SopranoMusic = \relative { c'' c c c } + SopranoLyrics = \lyricmode { High voice ly -- rics } + BassMusic = \relative { a a a a } + BassLyrics = \lyricmode { Low voice ly -- rics } + \include "satb.ly" +@end lilypond + +A second verse or alternative lyrics may be added to each of the +parts: + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a'4 a a a } + SopranoLyricsOne = \lyricmode { + \set stanza = "1." + Words to verse one + } + SopranoLyricsTwo = \lyricmode { + \set stanza = "2." + Words to verse two + } + \include "satb.ly" +@end lilypond + +When the lyrics and rhythms are the same for every part, the vocal +music is best arranged on two staves with two voices in each. Up to +nine verses may be provided. Here's an unaccompanied example with +just three verses. + +@lilypond[verbatim, quote] + SopranoMusic = \relative { a' a a a } + AltoMusic = \relative { f' f f f } + VerseOne = \lyricmode { + \set stanza = "1." + Words to verse one + } + VerseTwo = \lyricmode { + \set stanza = "2." + Words to verse two + } + VerseThree = \lyricmode { + \set stanza = "3." + Words to verse three + } + TenorMusic = \relative { a a a a } + BassMusic = \relative { f f f f } + TwoVoicesPerStaff = ##t + \include "satb.ly" +@end lilypond + +Other variables may be given values. The key signature and +the time signature may be changed from the default: + +@lilypond[verbatim, quote] + Key = \key a \major + Time = { + \time 5/4 + \tempo "Allegro" 4 = 144 + } + SopranoMusic = \relative { gis' gis gis gis gis } + AltoMusic = \relative { cis' cis cis cis cis } + VerseOne = \lyricmode { Words to this du -- et } + TwoVoicesPerStaff = ##t + \include "satb.ly" +@end lilypond + +The instrument names and/or the short instrument names may be +changed: + +@lilypond[verbatim,quote] + SopranoMusic = \relative { c'' c c c } + SopranoLyrics = \lyricmode { High voice ly -- rics } + SopranoInstrumentName = "Soprano 1" + SopranoShortInstrumentName = "S1" + AltoMusic = \relative { a' a a a } + AltoLyrics = \lyricmode { Low voice ly -- rics } + AltoInstrumentName = "Soprano 2" + AltoShortInstrumentName = "S2" + \include "satb.ly" +@end lilypond + +although rather than do this it might be easier to use the +@code{ssaattbb.ly} template, see @ref{SSAATTBB template}. + +A descant may be added by defining values for the variable +@code{DescantMusic} and descant lyrics may be provided by defining +values for @code{DescantLyrics}. In a similar way a solo part may be +added above the grouped choir staves by defining values for +@code{SoloMusic} and @code{SoloLyrics}. + +@code{\header} and @code{\paper} blocks may be added as normal. +A @code{\layout} block may be provided as usual at top level, and +the contents will be combined with (but will not override) the default +settings provided in the template. Alternatively, all the default +settings provided by the template can be discarded by defining a +@code{Layout} variable containing @emph{all} the required settings: + +@example +Layout = \layout @{ ... @} +@end example + +The complete set of variables which may be changed can be seen by +examining the file @file{ly/satb.ly}, see +@ref{Other sources of information}. + +@seealso +Learning Manual: +@ref{Organizing pieces with variables}, +@ref{Vocal ensembles templates}, +@ref{Extending the templates}, +@ref{Other sources of information}. + +@knownissues +The setting of the @code{TwoVoicesPerStaff} variable applies for the +entire duration of the score: it cannot be given different values at +different times. + +More complex arrangements of SATB choral music are not possible with +this simple built-in template. + + +@node SSAATTBB template +@appendixsubsec SSAATTBB template + +All the variables defined for the SATB template, with the exception of +the @code{VerseXxx} variables, are also available for the SSAATTBB +template, see @ref{SATB template}. In addition, music and lyrics for +first and second voices in any or all of the four parts may be specified +by providing values for @code{SopranoOneMusic}, @code{SopranoTwoMusic}, +etc, with lyrics in @code{SopranoOneLyrics} and @code{SopranoTwoLyrics}, +etc. Up to four additional stanzas may be defined for all the voice +parts by using the variables @code{SopranoOneLyricsOne}, with the others +defined in an analogous way. + +Setting @code{TwoVoicesPerStaff} to @code{##t} will cause @emph{all} +voice parts to be placed on single staves as divisi voices. If +@code{TwoVoicesPerStaff} is left to default or set to @code{##f} then +individual voice parts may be set on one or two staves according to +the setting of @code{SopranoTwoVoicesPerStaff}, +@code{MenTwoVoicesPerStaff}, etc. + +As an example, suppose we have a piece for soprano and alto which begins +with all voices in unison, progresses to a section with two parts, +soprano and alto, and ends with a four-part section. This would be +coded like this: + +@lilypond[verbatim,quote] +Time = { s1 \break s1 \break } +WomenMusic = \relative { a'4 a a a } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoMusic = \relative { s1 | c''4 c c c8 c } +SopranoLyrics = \lyricmode{ So -- pra -- no ly -- rics } +AltoMusic = \relative { s1 | g'4 g g g } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +SopranoOneMusic = \relative { s1 | s1 |e''4 e e e } +SopranoOneLyrics = \lyricmode { Sop One ly -- rics } +SopranoTwoMusic = \relative { s1 | s1 | c''4 c c c } +SopranoTwoLyrics = \lyricmode { Sop Two ly -- rics } +AltoOneMusic = \relative { s1 | s1 | g'4 g g g8 g } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { s1 | s1 | e'4 e e e8 e } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +\layout { ragged-right = ##t } +\include "ssaattbb.ly" +@end lilypond + +Male voices may be added in an analogous way. + +To change the layout so that the divisi soprano voices use a shared +staff, we simply set @code{SopranoTwoVoicesPerStaff} to ##t, leaving +all other variables unchanged, like this: + +@lilypond[verbatim,quote] +SopranoTwoVoicesPerStaff = ##t +Time = { s1 \break s1 \break } +WomenMusic = \relative { a'4 a a a } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoMusic = \relative { s1 | c''4 c c c8 c } +SopranoLyrics = \lyricmode{ So -- pra -- no ly -- rics } +AltoMusic = \relative { s1 | g'4 g g g } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +SopranoOneMusic = \relative { s1 | s1 |e''4 e e e } +SopranoOneLyrics = \lyricmode { Sop One ly -- rics } +SopranoTwoMusic = \relative { s1 | s1 | c''4 c c c } +SopranoTwoLyrics = \lyricmode { Sop Two ly -- rics } +AltoOneMusic = \relative { s1 | s1 | g'4 g g g8 g } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { s1 | s1 | e'4 e e e8 e } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +\layout { ragged-right = ##t } +\include "ssaattbb.ly" +@end lilypond + +or, to make all paired voices share a single staff, set +@code{TwoVoicesPerStaff} to ##t: + +@lilypond[verbatim,quote] +TwoVoicesPerStaff = ##t +Time = { s1 \break s1 \break } +WomenMusic = \relative { a'4 a a a } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoMusic = \relative { s1 | c''4 c c c8 c } +SopranoLyrics = \lyricmode{ So -- pra -- no ly -- rics } +AltoMusic = \relative { s1 | g'4 g g g } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +SopranoOneMusic = \relative { s1 | s1 |e''4 e e e } +SopranoOneLyrics = \lyricmode { Sop One ly -- rics } +SopranoTwoMusic = \relative { s1 | s1 | c''4 c c c } +SopranoTwoLyrics = \lyricmode { Sop Two ly -- rics } +AltoOneMusic = \relative { s1 | s1 | g'4 g g g8 g } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { s1 | s1 | e'4 e e e8 e } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +\layout { ragged-right = ##t } +\include "ssaattbb.ly" +@end lilypond + +The complete set of variables which may be changed can be seen by +examining the file @file{ly/ssaattbb.ly}, see +@ref{Other sources of information}. + +@seealso +Learning Manual: +@ref{Organizing pieces with variables}, +@ref{Vocal ensembles templates}, +@ref{Extending the templates}, +@ref{Other sources of information}. + +@knownissues +The setting of the various @code{...TwoVoicesPerStaff} variables apply +for the entire duration of the score: they cannot be given different +values at different times. + +More complex arrangements of 8-part choral music are not possible with +this simple built-in template. + + @node Single staff templates @appendixsec Single staff templates @@ -41,13 +351,13 @@ beautiful printed scores! @node Notes only @appendixsubsec Notes only -@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion] +@lilypondfile[verbatim,quote,ragged-right,texidoc] {single-staff-template-with-only-notes.ly} @node Notes and lyrics @appendixsubsec Notes and lyrics -@lilypondfile[verbatim,quote,ragged-right,texidoc,addversion] +@lilypondfile[verbatim,quote,ragged-right,texidoc] {single-staff-template-with-notes-and-lyrics.ly} @node Notes and chords @@ -115,6 +425,11 @@ beautiful printed scores! @node Vocal ensembles templates @appendixsec Vocal ensembles templates +The templates shown below should be copied into your score and edited +there. If you have a relatively simple SATB layout you may prefer to +use the built-in templates, which can simply be @code{\include}'d, see +@ref{Built-in templates}. + @menu * SATB vocal score:: * SATB vocal score and automatic piano reduction:: @@ -193,9 +508,8 @@ beautiful printed scores! @node Transcription of mensural music @appendixsubsec Transcription of mensural music -@c Line-width below is because of Issue 766. If that's fixed, it can be removed. -@lilypondfile[verbatim,quote,ragged-right,texidoc,line-width=140] -{ancient-notation-template----modern-transcription-of-mensural-music.ly} +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{incipit.ly} @node Gregorian transcription template @appendixsubsec Gregorian transcription template @@ -214,8 +528,7 @@ beautiful printed scores! @node Jazz combo @appendixsubsec Jazz combo -@c Line-width below is because of Issue 766. If that's fixed, it can be removed. -@lilypondfile[verbatim,quote,ragged-right,texidoc,line-width=140] +@lilypondfile[verbatim,quote,ragged-right,texidoc] {jazz-combo-template.ly} @@ -240,7 +553,7 @@ violin concerto as TchaikovskyPI, whereas perhaps you wish to print @ The `line-width' is for \header. @li lypond[quote,verbatim,ragged-right,line-width] -\version "2.16.0" +\version "2.19.25" \header { dedication = "dedication" title = "Title" diff --git a/Documentation/learning/tutorial.itely b/Documentation/learning/tutorial.itely index dfb60fab0b..27084f32ea 100644 --- a/Documentation/learning/tutorial.itely +++ b/Documentation/learning/tutorial.itely @@ -10,7 +10,7 @@ @include included/generating-output.itexi -@c \version "2.16.0" +@c \version "2.19.21" @node Tutorial @chapter Tutorial @@ -206,7 +206,6 @@ values are useful. @cindex relative mode, and accidentals @funindex \relative -@funindex relative @funindex ' @funindex , @@ -214,6 +213,16 @@ Music Glossary: @rglos{pitch}, @rglos{interval}, @rglos{scale}, @rglos{middle C}, @rglos{octave}, @rglos{accidental}. +LilyPond uses lower-case letters for pitches. The letters +@code{c} through@tie{}@code{b} denote pitches in the +@q{small octave} below @notation{middle C}. Added @code{'} +or@tie{}@code{,} suffixes indicate higher or lower octaves. +Here is a scale starting on @notation{middle C}, and an arpeggio: + +@lilypond[verbatim,quote] +{ c' d' e' f' g' a' b' c'' g c' e' g' c'' e'' g'' c''' } +@end lilypond + The easiest way to enter notes is by using @code{\relative} mode. In this mode, the octave is chosen automatically by assuming the following note is always to be placed closest to the previous @@ -223,40 +232,37 @@ elementary piece of music, a @notation{scale}, in which every note is within just one staff space of the previous note. @lilypond[verbatim,quote] -% set the starting point to middle C -\relative c' { - c d e f +\relative { + c' d e f g a b c } @end lilypond -The initial note is @notation{middle C}. Each successive note is +The initial note is @notation{middle C}, denoted by @code{c'}. +Each successive note is placed closest to the previous note -- in other words, the first @code{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, still using only @code{\relative} mode: @lilypond[verbatim,quote] -\relative c' { - d f a g +\relative { + d' f a g c b f d } @end lilypond @noindent -It is not necessary for the first note of the melody to start on -the note which specifies the starting pitch. In the previous -example, the first note -- the @code{d} -- is the closest D to -middle C. +In the previous example, the first note -- the @code{d'} with one +@code{'}-mark -- is the D in the octave starting from middle C +and going up to B. By adding (or removing) quotes @code{'} or commas @code{,} from -the @q{@w{@code{@bs{}relative c'}}} command, we can change the -starting octave: +the first note, we can change the starting octave: @lilypond[verbatim,quote] -% one octave above middle C -\relative c'' { - e c a c +\relative { + e'' c a c } @end lilypond @@ -269,8 +275,8 @@ if the note following a B is a C, D or E it will be assumed to be above the B, and an A, G or F will be assumed to be below. @lilypond[verbatim,quote] -\relative c'' { - b c % c is 1 staff space up, so is the c above +\relative { + b' c % c is 1 staff space up, so is the c above b d % d is 2 up or 5 down, so is the d above b e % e is 3 up or 4 down, so is the e above b a % a is 6 up or 1 down, so is the a below @@ -291,8 +297,8 @@ apostrophe) to the note name. We can lower the octave by adding a comma @code{,} to the note name. @lilypond[verbatim,quote] -\relative c'' { - a a, c' f, +\relative { + a' a, c' f, g g'' a,, f' } @end lilypond @@ -329,8 +335,8 @@ for the next note. The duration of the first note defaults to a quarter note. @lilypond[verbatim,quote] -\relative c'' { - a1 +\relative { + a'1 a2 a4 a8 a a16 a a a a32 a a a a64 a a a a a a a a2 } @@ -341,8 +347,8 @@ duration number. The duration of a dotted note must be stated explicitly (i.e., with a number). @lilypond[verbatim,quote] -\relative c'' { - a4 a a4. a8 +\relative { + a'4 a a4. a8 a8. a16 a a8. a8 a4. } @end lilypond @@ -359,8 +365,8 @@ A @notation{rest} is entered just like a note with the name @code{r}@tie{}: @lilypond[verbatim,quote] -\relative c'' { - a4 r r2 +\relative { + a'4 r r2 r8 a r4 r4. r8 } @end lilypond @@ -372,7 +378,6 @@ A @notation{rest} is entered just like a note with the name @cindex time signature @funindex \time -@funindex time Music Glossary: @rglos{time signature}. @@ -380,9 +385,9 @@ The @notation{time signature} can be set with the @code{\time} command: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 - a4 a a + a'4 a a \time 6/8 a4. a \time 4/4 @@ -397,7 +402,6 @@ command: @cindex metronome marks @funindex \tempo -@funindex tempo Music Glossary: @rglos{tempo indication}, @rglos{metronome}. @@ -405,10 +409,10 @@ The @notation{tempo indication} and @notation{metronome mark} can be set with the @code{\tempo} command: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 \tempo "Andante" - a4 a a + a'4 a a \time 6/8 \tempo 4. = 96 a4. a @@ -429,16 +433,15 @@ set with the @code{\tempo} command: @cindex bass @funindex \clef -@funindex clef Music Glossary: @rglos{clef}. The @notation{clef} can be set using the @code{\clef} command: @lilypond[verbatim,quote] -\relative c' { +\relative { \clef "treble" - c1 + c'1 \clef "alto" c1 \clef "tenor" @@ -455,11 +458,11 @@ The @notation{clef} can be set using the @code{\clef} command: Here is a small example showing all these elements together: @lilypond[verbatim,quote] -\relative c, { +\relative { \clef "bass" \time 3/4 \tempo "Andante" 4 = 120 - c2 e8 c' + c,2 e8 c' g'2. f4 e d c4 c, r @@ -573,7 +576,7 @@ The braces should be surrounded by a space unless they are at the beginning or end of a line to avoid ambiguities. A LilyPond command followed by a simple expression in braces (such -as @q{@w{@code{@bs{}relative c' @{ @dots{} @}}}}) also counts as a +as @q{@w{@code{@bs{}relative @{ @dots{} @}}}}) also counts as a single music expression. @cindex comments @@ -683,29 +686,18 @@ online version. @cindex files, tips for constructing LilyPond input must be surrounded by @code{@{ @}} marks or a -@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}}, as we saw in -@ref{Working on input files}. For the rest of this manual, most -examples will omit this. To replicate the examples, you may copy -and paste the displayed input, but you @strong{must} add the -@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} like this: +@q{@w{@code{@bs{}relative @{ @dots{} @}}}}, as we saw in +@ref{Working on input files}. For the rest of this manual, +some short examples will omit this. To replicate these examples, +you can copy displayed input, but paste it between @code{@{} +and @code{@}} in your input file. @example -\relative c'' @{ +@{ @dots{}example goes here@dots{} @} @end example -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 -@q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} -- you should not -place a @code{\relative} inside another @code{\relative}! If we -included @q{@w{@code{@bs{}relative c'' @{ @dots{} @}}}} around -every example, you would not be able to copy a small documentation -example and paste it inside a longer piece of your own. Most -people want to add material to an existing piece, so we format the -manual this way. - Also, remember that every LilyPond file should have a @code{\version} statement. Because the examples in the manuals are snippets, not files, the @code{\version} statement is omitted. @@ -724,8 +716,8 @@ this image: @c no verbatim here @lilypond[quote] -\relative c'' { - c4-\markup { \bold \huge { Click here. } } +\relative { + c''4-\markup { \bold \huge { Click here. } } } @end lilypond diff --git a/Documentation/learning/tweaks.itely b/Documentation/learning/tweaks.itely index 7d428a57a8..001f4136a3 100644 --- a/Documentation/learning/tweaks.itely +++ b/Documentation/learning/tweaks.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.20" +@c \version "2.19.22" @node Tweaking output @chapter Tweaking output @@ -107,6 +107,20 @@ ending point, and maybe other properties concerned with their shape. Objects with an extended shape like these are called @q{Spanners}. +Spanners cannot be tweaked after their creation. This includes both +@code{StaffSymbol} and @code{LedgerLineSpanner} which continue +throughout the score, except if they are terminated by the +@code{\stopStaff} command and then recreated using @code{\startStaff} +command. + +What is more, there are @q{abstract} grobs which do not print +anything of their own, but rather collect, position and manage +other grobs. Common examples for this are +@code{DynamicLineSpanner}, @code{BreakAlignment}, +@code{NoteColumn}, @code{VerticalAxisGroup}, +@code{NonMusicalPaperColumn} and similar. We will see how some of +these are used later. + It remains to explain what @q{Interfaces} are. Many objects, even though they are quite different, share common features which need to be processed in the same way. For example, all grobs have a color, a @@ -167,6 +181,10 @@ As we shall see shortly, the properties of different types of object are modified by different commands, so it is useful to be able to recognize the types of objects and properties from their names. +@seealso +Notation Reference: +@ruser{Modifying properties}. + @node Tweaking methods @subsection Tweaking methods @@ -179,6 +197,7 @@ the types of objects and properties from their names. * The once prefix:: * The overrideProperty command:: * The tweak command:: +* The single prefix:: @end menu @node The override command @@ -188,7 +207,6 @@ the types of objects and properties from their names. @cindex override syntax @funindex \override -@funindex override We have already met the commands @code{\set} and @code{\with}, used to change the properties of @strong{contexts} and to remove and add @@ -244,12 +262,14 @@ color of the note head: @cindex color property, example @cindex NoteHead, example of overriding -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a b c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a b c | +} @end lilypond @@ -259,7 +279,6 @@ g4 a b c | @cindex revert command @funindex \revert -@funindex revert Once overridden, the property retains its new value until it is overridden again or a @code{\revert} command is encountered. @@ -280,14 +299,16 @@ of the note head to the default value for the final two notes: @cindex color property, example @cindex NoteHead, example of overriding -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a -\revert NoteHead.color -b4 c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a + \revert NoteHead.color + b4 c | +} @end lilypond @@ -295,11 +316,10 @@ b4 c | @unnumberedsubsubsec The @code{@bs{}once} prefix @funindex \once -@funindex once -Both the @code{\override} and the @code{\set} commands may be prefixed -by @code{\once}. This causes the following @code{\override} or -@code{\set} command to be effective only during the current musical +@code{\override}, @code{\revert}, @code{\set}, and @code{\unset} +commands may be prefixed with @code{\once}. This causes such a +command to be effective only during the current musical moment before the property reverts back to its previous value (this can be different from the default if another @code{\override} is still in effect). Using the same example, we can change the color of a single @@ -308,41 +328,40 @@ note like this: @cindex color property, example @cindex NoteHead, example of overriding -@lilypond[quote,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\once \override NoteHead.color = #green -g4 a -\revert NoteHead.color -b c | +@lilypond[quote,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \once \override NoteHead.color = #green + g4 a + \once \revert NoteHead.color + b c | + \revert NoteHead.color + f2 c | +} @end lilypond The @code{\once} prefix may also be used in front of many predefined commands to limit their effect to one musical moment: -@lilypond[quote,verbatim,relative=1] -c4 d -\once \stemDown -e4 f | -g4 a -\once \hideNotes -b c | +@lilypond[quote,verbatim] +\relative { + c'4( d) + \once \slurDashed + e4( f) | + g4( a) + \once \hideNotes + b( c) | +} @end lilypond -However, predefined commands of the form @code{\@dots{}Neutral}, -@code{\@dots{}Off} and @code{\un@dots{}} use @code{\revert} internally -rather than @code{\override} so prefixing these with @code{\once} has no -effect. - - @node The overrideProperty command @unnumberedsubsubsec The @code{@bs{}overrideProperty} command @cindex overrideProperty command @funindex \overrideProperty -@funindex overrideProperty There is another form of the override command, @code{\overrideProperty}, which is occasionally required. @@ -357,7 +376,6 @@ We mention it here for completeness, but for details see @cindex tweak command @funindex \tweak -@funindex tweak The final tweaking command which is available is @code{\tweak}. This should be used when several objects occur at the same musical moment, @@ -373,11 +391,13 @@ middle note head (the E) in a C major chord. Let's first see what @cindex font-size property, example @cindex NoteHead, example of overriding -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -\once \override NoteHead.font-size = #-3 -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + \once \override NoteHead.font-size = #-3 + 4 + 4 +} @end lilypond We see the override affects @emph{all} the note heads in the chord. @@ -398,9 +418,11 @@ a chord would be changed in this way: @cindex font-size property, example @cindex @code{\tweak}, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + 4 +} @end lilypond Note that the syntax of @code{\tweak} is different from that of the @@ -420,8 +442,8 @@ a series of articulations, as shown here: @cindex color property, example @cindex @code{\tweak}, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -a4^"Black" +@lilypond[quote,fragment,ragged-right,verbatim] +a'4^"Black" -\tweak color #red ^"Red" -\tweak color #green _"Green" @end lilypond @@ -441,16 +463,16 @@ directly from the following event. It is still possible to use the layout object, provided that LilyPond can trace its origin back to the original event: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -<\tweak Accidental.color #red cis4 - \tweak Accidental.color #green es - g> +@lilypond[quote,fragment,ragged-right,verbatim] +<\tweak Accidental.color #red cis''4 + \tweak Accidental.color #green es'' + g''> @end lilypond This long form of the @code{\tweak} command can be described as @example -\tweak @var{layout-object}.@var{layout-property} @var{value} +\tweak @var{LayoutObject}.@var{layout-property} #@var{value} @end example @cindex tuplets, nested @@ -477,13 +499,15 @@ printed in red on the first short tuplet bracket. @cindex direction property, example @cindex color property, example -@lilypond[quote,ragged-right,verbatim,fragment,relative=2] -\tweak direction #up -\tuplet 3/4 { - \tweak color #red - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \tweak direction #up + \tuplet 3/4 { + \tweak color #red + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -496,15 +520,17 @@ appearance may be modified in the usual way with @cindex transparent property, example @cindex TupletNumber, example of overriding -@lilypond[quote,ragged-right,verbatim,fragment,relative=1] -\tuplet 3/2 { c8[ c c] } -\once \override TupletNumber.text = #tuplet-number::calc-fraction-text -\tuplet 3/2 { - c8[ c] - c8[ c] - \once \override TupletNumber.transparent = ##t - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative { + \tuplet 3/2 { c'8[ c c] } + \once \override TupletNumber.text = #tuplet-number::calc-fraction-text + \tuplet 3/2 { + c8[ c] + c8[ c] + \once \override TupletNumber.transparent = ##t + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -513,6 +539,60 @@ appearance may be modified in the usual way with Notation Reference: @ruser{The tweak command}. +@node The single prefix +@unnumberedsubsubsec The @code{@bs{}single} prefix + +@funindex \single +@cindex tweak, generated from override + +Suppose we wanted to emphasize particular note heads by coloring them +red and increasing their size, and to make it easy suppose also we +have defined a function to do this: + +@lilypond[quote,verbatim] +emphNoteHead = { + \override NoteHead.color = #red + \override NoteHead.font-size = 2 +} +\relative { + c''4 a \once \emphNoteHead f d | +} +@end lilypond + +The @code{\once} prefix works fine to emphasize single notes or +complete chords, but it cannot be used to emphasize a single note +@emph{within} a chord. Earlier we have seen how @code{\tweak} can +be used to do this, see +@ref{The tweak command,,The @code{@bs{}tweak} command}. But +@code{\tweak} cannot be used with a function; that's where +@code{\single} comes in: + +@lilypond[quote,verbatim] +emphNoteHead = { + \override NoteHead.color = #red + \override NoteHead.font-size = 2 +} +\relative { + 4 +} +@end lilypond + +In summary, @code{\single} converts overrides into tweaks so when +there are several objects at the same point in musical time (like +noteheads in a chord), @code{\single} will only affect a single one, +the one generated by the immediately following music expression, in +contrast to @code{\once} which will affect all of those objects. + +By using @code{\single} in this way any shorthand function +containing just overrides may be applied to individual notes in a +chord. However, @code{\single} does not convert @code{\revert}, +@code{\set} or @code{\unset} into tweaks. + +@seealso +Learning Manual: +@ref{The tweak command,,The @code{@bs{}tweak} command}, +@ref{Using variables for layout adjustments}. + @node The Internals Reference manual @section The Internals Reference manual @@ -563,12 +643,12 @@ music: @c Mozart, Die Zauberflöte Nr.7 Duett -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -648,14 +728,14 @@ close to it.} Let's do that: @cindex Slur example of overriding @cindex thickness property, example -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { + \relative { % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 - r4 bes8 bes[( g]) g | + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -702,7 +782,6 @@ location. @cindex once override @funindex \once -@funindex once As you can see, @emph{all} the slurs are thicker in the final example above. But what if we wanted just the first slur to be thicker? This @@ -717,12 +796,12 @@ repositioned as follows: @cindex Slur, example of overriding @cindex thickness property, example -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes8[( g]) g | @@ -747,7 +826,6 @@ command. @cindex default properties, reverting to @funindex \revert -@funindex revert Finally, what if we wanted just the first two slurs to be heavier? Well, we could use two commands, each preceded by @@ -757,12 +835,12 @@ the slurs begin: @cindex Slur, example of overriding @cindex thickness property, example -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes[( g]) g | @@ -785,12 +863,12 @@ after the second slur: @cindex Slur, example of overriding @cindex thickness property, example -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 bes[( g]) g | @@ -892,12 +970,12 @@ like so: @cindex LyricText, example of overriding @cindex @code{\addlyrics}, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -1062,11 +1140,11 @@ the implied Context, @code{Voice}: @cindex BarLine, example of overriding @cindex stencil property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override BarLine.stencil = ##f - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1087,11 +1165,11 @@ it by adding the correct context: @cindex BarLine, example of overriding @cindex stencil property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.stencil = ##f - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1102,11 +1180,11 @@ property to @code{#f} is such a frequent operation that there is a shorthand for it called @code{\omit}: @funindex \omit -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \omit Staff.BarLine - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1120,9 +1198,9 @@ correct processing. For example, errors will be generated if the @code{point-stencil} function, which sets the stencil to an object with zero size: -@lilypond[quote,verbatim,relative=2] -{ - c4 c +@lilypond[quote,verbatim] +\relative { + c''4 c \once \override NoteHead.stencil = #point-stencil c4 c } @@ -1149,11 +1227,11 @@ required, as always, to precede the value itself in the @cindex BarLine, example of overriding @cindex break-visibility property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.break-visibility = ##(#f #f #f) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1182,11 +1260,11 @@ transparent is: @cindex TimeSignature, example of overriding @cindex transparent property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.TimeSignature.transparent = ##t - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1198,11 +1276,11 @@ frequent operation, so we have a shorthand for it called @code{\hide}: @funindex \hide -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \hide Staff.TimeSignature - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1220,11 +1298,11 @@ instead: @cindex TimeSignature, example of overriding @cindex stencil property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \omit Staff.TimeSignature - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1264,11 +1342,11 @@ we write: @cindex BarLine, example of overriding @cindex color property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #white - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1298,11 +1376,11 @@ converts X11 color symbols into the list of internal values like this: @cindex BarLine, example of overriding @cindex color property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(x11-color 'white) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1329,11 +1407,11 @@ and to white it should be @code{(rgb-color 1 1 1)}: @cindex BarLine, example of overriding @cindex color property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(rgb-color 1 1 1) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1354,8 +1432,8 @@ various shades of grey: @cindex color property, example @cindex x11-color, example of using -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.StaffSymbol.color = #(x11-color 'grey30) \override Staff.TimeSignature.color = #(x11-color 'grey60) @@ -1363,7 +1441,7 @@ various shades of grey: \override Voice.NoteHead.color = #(x11-color 'grey85) \override Voice.Stem.color = #(x11-color 'grey85) \override Staff.BarLine.color = #(x11-color 'grey10) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1395,10 +1473,10 @@ how to introduce a new temporary staff, as in an @rglos{ossia}. @cindex alignAboveContext property, example @cindex @code{\with}, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1422,10 +1500,10 @@ we simply set the stencil of each to @code{#f}, as follows: @cindex Clef, example of overriding @cindex TimeSignature, example of overriding -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1485,10 +1563,10 @@ So we could replace the example above with @cindex Clef, example of overriding @cindex TimeSignature, example of overriding -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1510,10 +1588,10 @@ It turns out that we can also employ the shorthands @code{\hide} and @code{\omit} for setting the @code{transparent} property and clearing the @code{stencil} here, leading to the result -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1574,10 +1652,10 @@ Let's try it in our ossia example: @cindex TimeSignature, example of overriding @cindex fontSize property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1640,10 +1718,10 @@ objects in proportion. It is used like this: @cindex staff-space property, example @cindex stencil property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1747,11 +1825,11 @@ under @q{Text2}. @cindex markup example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" | -c2^"Text3" -c2^"Text4" | +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond Staves are also positioned, by default, as closely together as @@ -1764,10 +1842,10 @@ this @q{nestling} of the notes on adjacent staves: @lilypond[quote,ragged-right,verbatim] << \new Staff { - \relative c' { c4 a, } + \relative { c'4 a, } } \new Staff { - \relative c'''' { c4 a, } + \relative { c''''4 a, } } >> @end lilypond @@ -1806,30 +1884,30 @@ automatically when @code{direction} is set. @cindex center @cindex neutral -The following example shows in bar 1 the default behavior of stems, -with those on high notes pointing down and those on low notes pointing -up, followed by four notes with all stems forced down, four notes with -all stems forced up, and finally four notes reverted back to the -default behavior. +The following example shows the default positioning of slurs in the +first bar, with slurs starting on high notes positioned above the notes +and those starting on low notes positioned below, followed by a bar +with both slurs forced down, a bar with both slurs forced up, and +finally a bar with both slurs reverted back to the default behavior. -@cindex Stem, example of overriding +@cindex Slur, example of overriding @cindex direction property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -a4 g c a | -\override Stem.direction = #DOWN -a4 g c a | -\override Stem.direction = #UP -a4 g c a | -\revert Stem.direction -a4 g c a | +@lilypond[quote,fragment,verbatim] +a'4( g') c''( a') | +\override Slur.direction = #DOWN +a'4( g') c''( a') | +\override Slur.direction = #UP +a'4( g') c''( a') | +\revert Slur.direction +a'4( g') c''( a') | @end lilypond -Here we use the constants @code{DOWN} and @code{UP}. +Here we have used the constants @code{DOWN} and @code{UP}. These have the values @w{@code{-1}} and @code{+1} respectively, and these numerical values may be used instead. The value @code{0} may also be used in some cases. It is simply treated as meaning -@code{UP} for stems, but for some objects it means @q{center}. +@code{UP} for slurs, but for some objects it means @q{center}. There is a constant, @code{CENTER} which has the value @code{0}. However, these explicit overrides are not usually used, as there are @@ -1880,12 +1958,20 @@ the commonest. The meaning of each is stated where it is not obvious. @end multitable The neutral/normal variants of these commands are implemented -using @code{\revert} and may @strong{not} be +using @code{\revert} and these may @strong{not} be preceded by @code{\once}. If you wish to limit the effect of the other commands (which are implemented using @code{\override}) to a single timestep, you can precede them with @code{\once} like you would do with explicit overrides. +Or, if just a single layout object needs to be forced up or down, the +direction indicators, @code{^} or @code{_}, may be used: + +@lilypond[quote,fragment,verbatim] +a'4( g') c''( a') | +a'4^( g') c''_( a') | +@end lilypond + @node Fingering @unnumberedsubsubsec Fingering @@ -1907,12 +1993,14 @@ specifying @code{DOWN} and @code{UP}: @cindex Fingering, example of overriding @cindex direction property, example -@lilypond[quote,verbatim,relative=2] -c4-5 a-3 f-1 c'-5 | -\override Fingering.direction = #DOWN -c4-5 a-3 f-1 c'-5 | -\override Fingering.direction = #UP -c4-5 a-3 f-1 c'-5 | +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #DOWN + c4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #UP + c4-5 a-3 f-1 c'-5 | +} @end lilypond However, overriding the @code{direction} property is not the @@ -1923,10 +2011,12 @@ example using this method: @cindex fingering example -@lilypond[quote,verbatim,relative=2] -c4-5 a-3 f-1 c'-5 | -c4_5 a_3 f_1 c'_5 | -c4^5 a^3 f^1 c'^5 | +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + c4_5 a_3 f_1 c'_5 | + c4^5 a^3 f^1 c'^5 | +} @end lilypond The @code{direction} property is ignored for chords, but the @@ -1936,10 +2026,12 @@ notes of a chord, as shown: @cindex fingering example -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond @noindent @@ -1948,10 +2040,12 @@ individual fingering numbers above or below: @cindex fingering example -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond Even greater control over the placement of fingering of the @@ -1989,22 +2083,24 @@ Here are a few examples: @cindex @code{\set}, example of using @cindex fingeringOrientations property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(left) -4 -4 | -\set fingeringOrientations = #'(up left down) -4 -4 -\set fingeringOrientations = #'(up left) -4 -4 | -\set fingeringOrientations = #'(right) -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} @end lilypond @noindent @@ -2013,23 +2109,25 @@ could be reduced. The default value can be seen from the @code{Fingering} object in the IR to be @w{@code{-5}}, so let's try @w{@code{-7}}: -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\override Fingering.font-size = #-7 -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(left) -4 -4 | -\set fingeringOrientations = #'(up left down) -4 -4 -\set fingeringOrientations = #'(up left) -4 -4 | -\set fingeringOrientations = #'(right) -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + \override Fingering.font-size = #-7 + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} @end lilypond @node Outside-staff objects @@ -2074,7 +2172,7 @@ change @code{outside-staff-priority} of the associated placed at the start of the spanner, which might include several linked hairpins and dynamics. -@multitable @columnfractions .3 .3 .3 +@multitable @columnfractions .3 .15 .45 @headitem Layout Object @tab Priority @tab Controls position of: @@ -2084,15 +2182,33 @@ linked hairpins and dynamics. @item @code{MetronomeMark} @tab @code{1000} @tab Metronome marks +@item @code{SostenutoPedalLineSpanner} + @tab @code{1000} + @tab Pedal indication +@item @code{SustainPedalLineSpanner} + @tab @code{1000} + @tab +@item @code{UnaCordaPedalLineSpanner} + @tab @code{1000} + @tab +@item @code{MeasureCounter} + @tab @code{750} + @tab Measure number @item @code{VoltaBracketSpanner} @tab @code{600} @tab Volta brackets +@item @code{InstrumentSwitch} + @tab @code{500} + @tab Instrument switch text @item @code{TextScript} @tab @code{450} @tab Markup text @item @code{MultiMeasureRestText} @tab @code{450} - @tab Markup text over full-bar rests + @tab Markup text over multimeasure rests +@item @code{CombineTextScript} + @tab @code{450} + @tab Part-combine text @item @code{OttavaBracket} @tab @code{400} @tab Ottava brackets @@ -2103,11 +2219,14 @@ linked hairpins and dynamics. @tab @code{250} @tab All dynamic markings @item @code{BarNumber} - @tab @code{ 100} + @tab @code{100} @tab Bar numbers @item @code{TrillSpanner} @tab @code{50} @tab Spanning trills +@item @code{AccidentalSuggestion} + @tab @code{0} + @tab Annotational accidentals @end multitable Here is an example showing the default placement of some of @@ -2117,14 +2236,12 @@ these. @cindex ottava bracket @funindex \startTextSpan -@funindex startTextSpan @funindex \stopTextSpan -@funindex stopTextSpan @cindex TextSpanner, example of overriding @cindex bound-details property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +@lilypond[quote,fragment,ragged-right,verbatim] % Set details for later Text Spanner \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } @@ -2132,18 +2249,18 @@ these. \dynamicUp % Start Ottava Bracket \ottava #1 -c'4 \startTextSpan +c''4 \startTextSpan % Add Dynamic Text and hairpin -c4\pp\< -c4 +c''4\pp\< +c''4 % Add Text Script -c4^Text | -c4 c +c''4^Text | +c''4 c'' % Add Dynamic Text and terminate hairpin -c4\ff c \stopTextSpan | +c''4\ff c'' \stopTextSpan | % Stop Ottava Bracket \ottava #0 -c,4 c c c | +c'4 c' c' c' | @end lilypond This example also shows how to create Text Spanners -- @@ -2167,14 +2284,14 @@ the placing you want, the priority of any of the objects may be overridden. Suppose we would like the ottava bracket to be placed below the text spanner in the example above. All we need to do is to look up the priority of @code{OttavaBracket} in the IR or in the -tables above, and reduce it to a value lower than that of a +table above, and reduce it to a value lower than that of a @code{TextSpanner}, remembering that @code{OttavaBracket} is created in the @code{Staff} context: @cindex TextSpanner, example of overriding @cindex bound-details property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +@lilypond[quote,fragment,ragged-right,verbatim] % Set details for later Text Spanner \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } @@ -2184,19 +2301,19 @@ in the @code{Staff} context: \once \override Staff.OttavaBracket.outside-staff-priority = #340 % Start Ottava Bracket \ottava #1 -c'4 \startTextSpan +c''4 \startTextSpan % Add Dynamic Text -c4\pp +c''4\pp % Add Dynamic Line Spanner -c4\< +c''4\< % Add Text Script -c4^Text | -c4 c +c''4^Text | +c''4 c'' % Add Dynamic Text -c4\ff c \stopTextSpan | +c''4\ff c'' \stopTextSpan | % Stop Ottava Bracket \ottava #0 -c,4 c c c | +c'4 c' c' c' | @end lilypond Note that some of these objects, in particular bar numbers, @@ -2221,14 +2338,16 @@ can be set to a numerical value to cause it to be placed along with other outside-staff objects according to that value. Here's an example showing the effect of the two methods: -@lilypond[quote,verbatim,relative=2] -c4( c^\markup { \tiny \sharp } d4.) c8 | -c4( -\once \override TextScript.avoid-slur = #'inside -\once \override TextScript.outside-staff-priority = ##f -c4^\markup { \tiny \sharp } d4.) c8 | -\once \override Slur.outside-staff-priority = #500 -c4( c^\markup { \tiny \sharp } d4.) c8 | +@lilypond[quote,verbatim] +\relative c'' { + c4( c^\markup { \tiny \sharp } d4.) c8 | + c4( + \once \override TextScript.avoid-slur = #'inside + \once \override TextScript.outside-staff-priority = ##f + c4^\markup { \tiny \sharp } d4.) c8 | + \once \override Slur.outside-staff-priority = #500 + c4( c^\markup { \tiny \sharp } d4.) c8 | +} @end lilypond Changing the @code{outside-staff-priority} can also be used to @@ -2243,12 +2362,12 @@ in the IR or in the tables above, and increase the priority of @cindex TextScript, example of overriding @cindex outside-staff-priority property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" | +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | \once \override TextScript.outside-staff-priority = #500 -c2^"Text3" -c2^"Text4" | +c''2^"Text3" +c''2^"Text4" | @end lilypond This certainly lifts @qq{Text3} above @qq{Text4} but it also lifts it @@ -2265,21 +2384,19 @@ command. @cindex notes, spreading out with text @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff By default, text produced by markup takes up no horizontal space as far as laying out the music is concerned. The @code{\textLengthOn} command reverses this behavior, causing the notes to be spaced out as far as is necessary to accommodate the text: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,fragment,ragged-right,verbatim] \textLengthOn % Cause notes to space out to accommodate text -c2^"Text1" -c2^"Text2" | -c2^"Text3" -c2^"Text4" | +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond The command to revert to the default behavior is @@ -2300,25 +2417,27 @@ example to show how markup text interacts with such notes. @cindex TextScript, example of overriding @cindex outside-staff-priority property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -% This markup is short enough to fit without collision -c2^"Tex" c'' | -R1 | - -% This is too long to fit, so it is displaced upwards -c,,2^"Text" c'' | -R1 | - -% Turn off collision avoidance -\once \override TextScript.outside-staff-priority = ##f -c,,2^"Long Text " c'' | -R1 | - -% Turn off collision avoidance -\once \override TextScript.outside-staff-priority = ##f -\textLengthOn % and turn on textLengthOn -c,,2^"Long Text " % Spaces at end are honored -c''2 | +@lilypond[quote,ragged-right,verbatim] +\relative { + % This markup is short enough to fit without collision + c''2^"Tex" c'' | + R1 | + + % This is too long to fit, so it is displaced upwards + c,,2^"Text" c'' | + R1 | + + % Turn off collision avoidance + \once \override TextScript.outside-staff-priority = ##f + c,,2^"Long Text " c'' | + R1 | + + % Turn off collision avoidance + \once \override TextScript.outside-staff-priority = ##f + \textLengthOn % and turn on textLengthOn + c,,2^"Long Text " % Spaces at end are honored + c''2 | +} @end lilypond @node Dynamics placement @@ -2335,13 +2454,15 @@ all within-staff objects such as phrasing slurs and bar numbers. This can give quite acceptable results, as this example shows: -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\clef "bass" -\key aes \major -\time 9/8 -\dynamicUp -bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | -ees,2.~\)\mf ees4 r8 | +@lilypond[quote,ragged-right,verbatim] +\relative { + \clef "bass" + \key aes \major + \time 9/8 + \dynamicUp + bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | + ees,2.~\)\mf ees4 r8 | +} @end lilypond However, if the notes and attached dynamics are close @@ -2350,9 +2471,9 @@ by displacing later dynamic markings further away, but this may not be the optimum placement, as this rather artificial example shows: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim,fragment] \dynamicUp -a4\f b\mf a\mp b\p +\relative { a'4\f b\mf a\mp b\p } @end lilypond @noindent @@ -2405,11 +2526,11 @@ Let's see if this works in our previous example: @cindex extra-spacing-width property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim,fragment] \dynamicUp % Extend width by 1 staff space \override DynamicText.extra-spacing-width = #'(-0.5 . 0.5) -a4\f b\mf a\mp b\p +\relative { a'4\f b\mf a\mp b\p } @end lilypond @noindent @@ -2774,13 +2895,9 @@ and notes in different voices. @cindex collisions, notes @cindex shift commands @funindex \shiftOff -@funindex shiftOff @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn Within a voice, all the notes occuring at the same musical moment are grouped into a note column, and a @code{NoteColumn} object is created @@ -2918,8 +3035,8 @@ above or below notes. @cindex Script, example of overriding @cindex padding property, example -@lilypond[quote,fragment,relative=1,verbatim] -c2\fermata +@lilypond[quote,fragment,verbatim] +c'2\fermata \override Script.padding = #3 b2\fermata @end lilypond @@ -2927,15 +3044,15 @@ b2\fermata @cindex MetronomeMark, example of overriding @cindex padding property, example -@lilypond[quote,fragment,relative=1,verbatim] +@lilypond[quote,fragment,verbatim] % This will not work, see below \override MetronomeMark.padding = #3 \tempo 4 = 120 -c1 | +c'1 | % This works \override Score.MetronomeMark.padding = #3 \tempo 4 = 80 -d1 | +d'1 | @end lilypond Note in the second example how important it is to figure out what @@ -2970,8 +3087,8 @@ stencil with a markup containing the desired symbol(s), like this: @lilypond[quote,ragged-right,verbatim] sesquisharp = \markup { \sesquisharp } -\relative c'' { - c4 +\relative { + c''4 % This prints a sesquisharp but the spacing is too small \once \override Accidental.stencil = #ly:text-interface::print \once \override Accidental.text = #sesquisharp @@ -3014,9 +3131,9 @@ example taken from the previous section: @cindex DynamicLineSpanner, example of overriding @cindex staff-padding property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,fragment,ragged-right,verbatim] \override DynamicLineSpanner.staff-padding = #3 -a4\f b\mf a\p b\mp +\relative { a'4\f b\mf a\p b\mp } @end lilypond @@ -3030,11 +3147,11 @@ right edge with the reference point of the parent note: @cindex StringNumber, example of overriding @cindex self-alignment-X property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=3] +@lilypond[quote,fragment,ragged-right,verbatim] \voiceOne - + \once \override StringNumber.self-alignment-X = #RIGHT - + @end lilypond @node The staff-position property @@ -3050,8 +3167,8 @@ handling between notes and between notes and rests is done only for notes and rests that occur at the same time. Here's an example of a collision of this type: -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] -<< { c4 c c c } \\ { R1 } >> +@lilypond[quote,verbatim,ragged-right] +<< \relative { c'4 c c c } \\ { R1 } >> @end lilypond The best solution here is to move the multimeasure rest down, since the @@ -3063,9 +3180,9 @@ to move it, say, four half-staff spaces down to @w{@code{-8}}. @cindex MultiMeasureRest, example of overriding @cindex staff-position property, example -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] +@lilypond[quote,verbatim,ragged-right] << - { c4 c c c } + \relative { c'4 c c c } \\ \override MultiMeasureRest.staff-position = #-8 { R1 } @@ -3092,11 +3209,10 @@ the left, and 1.8 staff space downwards: @cindex Fingering, example of overriding @cindex extra-offset property, example -@lilypond[quote,fragment,relative=1,verbatim] -\stemUp -f4-5 +@lilypond[quote,fragment,verbatim] +f'4-5 \once \override Fingering.extra-offset = #'(-0.3 . -1.8) -f4-5 +f'4-5 @end lilypond @@ -3116,8 +3232,8 @@ manually. Here's an example in which the phrasing slur and slur collide: -@lilypond[quote,verbatim,fragment,ragged-right,relative=2] -a8 \( ( a'16 ) a \) +@lilypond[quote,verbatim,ragged-right] +\relative { a'8 \( ( a'16 ) a \) } @end lilypond @cindex PhrasingSlur, example of overriding @@ -3130,9 +3246,9 @@ centre line and the right end to 4.5 above, and LilyPond will select the phrasing slur from the candidates it has found with its end points closest to these: -@lilypond[quote,verbatim,fragment,ragged-right,relative=2] +@lilypond[quote,verbatim,fragment,ragged-right] \once \override PhrasingSlur.positions = #'(2.5 . 4.5) -a8 \( ( a'16 ) a \) +a'8 \( ( a''16 ) a'' \) @end lilypond This is an improvement, but why not lower the right end of the slur @@ -3146,18 +3262,26 @@ do this, see @ruser{Modifying ties and slurs}. Here's a further example. We see that the beams collide with the ties: -@lilypond[quote,verbatim,fragment,ragged-right] +@lilypond[quote,verbatim,ragged-right] { \time 4/2 << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } + \relative { + e''8 e e e + e e e e + f2 g + } >> << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } + \relative { + e''8 e e e + e e e e + f2 g + } >> } @end lilypond @@ -3170,29 +3294,37 @@ say, 1: @cindex Beam, example of overriding @cindex positions property, example -@lilypond[quote,verbatim,fragment,ragged-right] +@lilypond[quote,verbatim,ragged-right] { \time 4/2 << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { + \relative { \override Beam.positions = #'(-1 . -1) - e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' + e''8 e e e + e e e e + f2 g } >> << - { c'1 ~ c'2. e'8 f' } + \relative { c'1~ 2. e8 f } \\ - { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } + \relative { + e''8 e e e + e e e e + f2 g + \revert Beam.positions + } >> } @end lilypond @noindent -Note that the override continues to apply in the first voice of +Note that the override continues to apply in the second voice of the second measure of eighth notes, but not to any of the beams in the -second voice. +first voice, even those in the later second measure. As soon as the +override should no longer apply it should be reverted, as shown. @node The force-hshift property @unnumberedsubsubsec The @code{force-hshift} property @@ -3202,10 +3334,10 @@ example introduced at the end of @ref{I'm hearing Voices}, which was left looking like this: @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { 2 des } \\ @@ -3219,10 +3351,7 @@ was left looking like this: @noindent The inner note of the first chord (i.e. the A-flat in the fourth Voice) need not be shifted away from the note column of the higher -note. We might expect to correct this by using @code{\shiftOff}, but -this will cause warnings about clashing note columns. Instead, we -set @code{force-hshift}, which is a property of @code{NoteColumn}, -of this note to zero. +note, so we use @code{\shiftOff}. In the second chord we prefer the F to line up with the A-flat and the lowest note to be positioned slightly right to avoid a collision @@ -3240,16 +3369,15 @@ Here's the final result: @cindex force-hshift property, example @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { 2 \once \override NoteColumn.force-hshift = 0.5 des } \\ \\ - { \once \override NoteColumn.force-hshift = 0 aes'2 - \once \override NoteColumn.force-hshift = 0 f4 fes } + { \once \shiftOff aes'2 \once \shiftOff f4 fes } >> | 1 | } @@ -3277,16 +3405,16 @@ dynamics, fingering and pedalling. @c This example should not be indexed @c line-width ensures no break @lilypond[quote,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 << { c,8 d fis bes a } \new Voice { @@ -3319,8 +3447,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3360,9 +3488,9 @@ produces by default: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4. g8 | + r2 c''4. g8 | bes1~ | \time 6/4 bes2. r8 @@ -3371,7 +3499,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3386,8 +3514,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2 | +lhMusic = \relative { + r2 2 | 1 | r2. d,,4 r4 r | r4 @@ -3417,9 +3545,9 @@ since these were all covered in the Tutorial. Doing this gives: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | bes1~ | \time 6/4 bes2. r8 @@ -3428,7 +3556,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3443,8 +3571,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1) | r2. d,,4 r4 r | r4 @@ -3487,9 +3615,9 @@ This completes bar two, giving: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3500,7 +3628,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3515,8 +3643,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3538,8 +3666,8 @@ lhMusic = \relative c' { @end lilypond On to bar three and the start of the Moderato section. The tutorial -showed how to add bold text with the @code{\markup} command, so -adding @qq{Moderato} in bold is easy. But how do we merge notes in +showed how to add a tempo indication with the @code{\tempo} command, so +adding @qq{Moderato} is easy. But how do we merge notes in different voices together? This is where we need to turn again to the Notation Reference for help. A search for @qq{merge} in the Notation Reference index quickly leads us to the commands for merging @@ -3566,14 +3694,14 @@ to the end, giving: @c line-width ensures no break @lilypond[quote,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices @@ -3581,7 +3709,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3598,8 +3726,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3640,14 +3768,14 @@ Applying these changes gives: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices @@ -3675,8 +3803,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3710,14 +3838,14 @@ the @code{force-hshift} property. Here's the final result: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" \time 6/4 - bes2.^\markup { \bold "Moderato" } r8 + bes2.\tempo "Moderato" r8 \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn % Start polyphonic section of four voices @@ -3753,8 +3881,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3795,91 +3923,50 @@ lhMusic = \relative c' { * Simulating a fermata in MIDI:: @end menu -@cindex transparent property, use of -@cindex objects, making invisible @cindex removing objects @cindex objects, removing -@cindex hiding objects -@cindex objects, hiding -@cindex invisible objects -@cindex objects, invisible @node Tying notes across voices @unnumberedsubsubsec Tying notes across voices @cindex tying notes across voices -The following example demonstrates how to connect notes in -different voices using ties. Normally, only two notes in the -same voice can be connected with ties. By using two voices, -with the tied notes in one of them +The following example demonstrates how to connect notes in different +voices using ties. Normally, only notes in the same voice can be +connected with ties. By using two voices, with the tied notes in one +of them -@lilypond[quote,fragment,relative=2] -<< { b8~ b\noBeam } \\ { b8[ g] } >> +@lilypond[quote] +<< { b'8~ 8\noBeam } \\ { b'8[ g'] } >> @end lilypond @noindent -and blanking the first up-stem in that voice, the tie appears to -cross voices: +and removing the first up-stem and its flag in that voice, the tie +appears to cross voices: -@cindex Stem, example of overriding -@cindex transparent property, example - -@lilypond[quote,fragment,relative=2,verbatim] -<< - { - \tweak Stem.transparent ##t - b8~ b\noBeam - } -\\ - { b8[ g] } ->> -@end lilypond - -To make sure that the just-blanked stem doesn't squeeze the tie -too much, we can lengthen the stem by setting the -@code{length} to @code{8}, +@funindex \omit +@cindex Stem, example of removing +@cindex Flag, example of removing +@cindex @code{\omit}, example +@cindex example of @code{\omit} -@lilypond[quote,fragment,relative=2,verbatim] +@lilypond[quote,verbatim] << { - \tweak Stem.transparent ##t - \tweak Stem.length #8 - b8~ b\noBeam + \once \omit Stem + \once \omit Flag + b'8~ 8\noBeam } \\ - { b8[ g] } + { b'8[ g'] } >> @end lilypond -@funindex \single -@cindex tweak, generated from override -Now for @emph{overriding} the transparency of a graphical object, -we could have used the shorthand @code{\hide} as explained above. -Tweaking is a different operation, affecting only properties -generated from a single music expression. It turns out that we -can convert overrides into tweaks using @code{\single}, making it -possible to rewrite the above example as - -@lilypond[quote,fragment,relative=2,verbatim] -<< - { - \single \hide Stem - \single \hide Flag - \tweak Stem.length #8 - b8~ b\noBeam - } -\\ - { b8[ g] } ->> -@end lilypond +@seealso +Learning Manual: +@ref{The once prefix,,The @code{@bs{}once} prefix}, +@ref{The stencil property}. -In this particular case, the difference to @code{\once \hide} is -not apparent. It is important when there are several objects at -the same point in musical time (like noteheads in a chord). In -that case, @code{\once} will affect all of those objects while -@code{\single} will only affect a single one, the one generated by -the immediately following music expression. @node Simulating a fermata in MIDI @unnumberedsubsubsec Simulating a fermata in MIDI @@ -3908,10 +3995,10 @@ We show here the effect of the two methods: @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a + a'4 a a \once \hide Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 @@ -3930,10 +4017,10 @@ We show here the effect of the two methods: @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a + a'4 a a \once \omit Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 @@ -4012,10 +4099,10 @@ normal = { global = { \key c \major \time 4/4 \partial 4 } -SopranoMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopranoMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyrics { E -- | ter -- nal \emphasize Fa -- ther, | \normal strong to save, @@ -4075,13 +4162,13 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4105,7 +4192,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @end example @@ -4122,9 +4209,9 @@ Now let's modify our music (let's save this file as @file{music.ly}). @example \include "definitions.ily" -\relative c'' @{ +\relative @{ \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4140,13 +4227,13 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4172,7 +4259,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -4202,7 +4289,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4223,9 +4310,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4250,7 +4337,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -4281,7 +4368,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4298,9 +4385,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4408,10 +4495,10 @@ Let's begin by looking at some files in @file{ly/}. Open @file{ly/property-init.ly} in a text editor. The one you normally use for @code{.ly} files will be fine. This file contains the definitions of all the standard LilyPond predefined -commands, such as @code{\stemUp} and @code{\slurDotted}. You will +commands, such as @code{\tieUp} and @code{\slurDotted}. You will see that these are nothing more than definitions of variables containing one or a group of @code{\override} commands. For -example, @code{/tieDotted} is defined to be: +example, @code{\tieDotted} is defined to be: @example tieDotted = @{ @@ -4515,7 +4602,7 @@ the staff. ((0) (x11-color 'violet )) ; for B ))) -\relative c' { +\relative { % Arrange to obtain color from color-notehead procedure \override NoteHead.color = #color-notehead a2 b | c2 d | e2 f | g2 a | diff --git a/Documentation/lilypond-texi2html-lang.init b/Documentation/lilypond-texi2html-lang.init new file mode 100644 index 0000000000..dc89070bc3 --- /dev/null +++ b/Documentation/lilypond-texi2html-lang.init @@ -0,0 +1,18 @@ +# Languages minimum initialization for texi2html +# $LANGUAGES will be overwritten by lilypond-texi2html.init. + +use utf8; + +my @langlist = ( + 'ca', 'cs', 'de', 'es', 'fr', 'hu', 'it', 'ja', 'nl', 'po', 'zh' +); + +foreach my $lang (@langlist) +{ + unless (exists($LANGUAGES->{$lang}) && defined($LANGUAGES->{$lang})) + { + $LANGUAGES->{$lang} = {}; + } +} + +return 1; diff --git a/Documentation/lilypond-texi2html.init b/Documentation/lilypond-texi2html.init index cd370bb87d..9cb5772de4 100644 --- a/Documentation/lilypond-texi2html.init +++ b/Documentation/lilypond-texi2html.init @@ -93,6 +93,11 @@ use Encode qw(decode); ############################################################################# my $LY_LANGUAGES = {}; +$LY_LANGUAGES->{'ca'} = { + 'Back to Documentation Index' => '', + '

Gràcies a ${webdev_link} per allotjar ${lily_site}.' => '', +}; + $LY_LANGUAGES->{'cs'} = { 'Back to Documentation Index' => '', '

Thanks to ${webdev_link} for hosting ${lily_site}.' => '', @@ -682,6 +687,141 @@ $LANGUAGES->{'cs'} = { '{title_ref}' => '{title_ref}' }; +$LANGUAGES->{'ca'} = { + ' The buttons in the navigation panels have the following meaning:' => ' Els botons dels plafons de navegació tenen els significat següent:', + ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => ' on l\'@strong{ Exemple } suposa que la posició actual està a @strong{ Subsubsecció U-Dos-tres } d\'un document a l\'estructura següent:', + ' Up ' => ' Amunt ', + '(outside of any element)' => '(fora de qualsevol element)', + '(outside of any node)' => '(fora de qualsevol node)', + '@b{{quotation_arg}:} ' => '@{{quotation_arg}:}', + '@cite{{book}}' => '@cite{{book}}', + '@{No value for `{value}\'@}' => '@{No hi ha cap valor per a `{value}\'@}', + 'About' => 'Quant a', + 'About (help)' => 'Quant a (ajuda)', + 'About This Document' => 'Quant a aquest document', + 'April' => 'Abril', + 'August' => 'Agost', + 'Back' => 'Endarrere', + 'Back section in previous file' => 'Endarrere una secció al fitxer previ', + 'Beginning of this chapter or previous chapter' => 'Inici d\'aquest capítol o capítol previ', + 'Button' => 'Botó', + 'Contents' => 'Continguts', + 'Cover (top) of document' => 'Portada (inici) del document', + 'Current' => 'Actual', + 'Current Position' => 'Posició actual', + 'Current section' => 'Secció actual', + 'December' => 'Desembre', + 'FastBack' => 'Endarrere ràpid', + 'FastForward' => 'Endavant ràpid', + 'February' => 'Febrer', + 'First' => 'Primera', + 'First section in reading order' => 'Primera secció a l\'orde de lectura', + 'Following' => 'Següent', + 'Following node' => 'Node següent', + 'Footnotes' => 'Notes a peu de pàgina', + 'Forward' => 'Endavant', + 'Forward section in next file' => 'Endavant una secció al fitxer següent', + 'From 1.2.3 go to' => 'De 1.2.3 ves a', + 'Go to' => 'Ves a', + 'Index' => 'Índex', + 'Index Entry' => 'Entrada d\'índex', + 'January' => 'Gener', + 'July' => 'Juliol', + 'Jump to' => 'Salta a', + 'June' => 'Juny', + 'Last' => 'Últim', + 'Last section in reading order' => 'Última secció en ordre de lectura', + 'March' => 'Març', + 'May' => 'Maig', + 'Menu:' => 'Menú', + 'Name' => 'Nom', + 'Next' => 'Següent', + 'Next chapter' => 'Capítol següent', + 'Next file' => 'Fitxer següent', + 'Next node' => 'Node següent', + 'Next section in reading order' => 'Secció següent en ordre de lectura', + 'Next section on same level' => 'Secció següent al mateix nivell', + 'NextFile' => 'Fitxer següent', + 'Node following in node reading order' => 'Node següent en ordre de lectura de nodes', + 'Node up' => 'Node amunt', + 'NodeNext' => 'Node següent', + 'NodePrev' => 'Node previ', + 'NodeUp' => 'Node Amunt', + 'November' => 'Novembre', + 'October' => 'Octobre', + 'Overview' => 'Panoràmica', + 'Prev' => 'Previ', + 'PrevFile' => 'Fitxer previ', + 'Previous' => 'Previ', + 'Previous file' => 'Fitxer previ', + 'Previous node' => 'Node previ', + 'Previous section in reading order' => 'Secció prèvia en ordre de lectura', + 'Previous section on same level' => 'Secció prèvia al mateix nivell', + 'Section' => 'Secció', + 'Section One' => 'Secció u', + 'See ' => 'Vegeu ', + 'See @cite{{book}}' => 'Vegeu @cite{{book}}', + 'See section `@asis{}`{section_name}\'@asis{}\' in @cite{{book}}' => 'Vegeu secció @asis{}`{section_name}\'@asis{}\' a @cite{{book}}', + 'See section `{section}\' in @cite{{book}}' => 'Vegeu la secció `{section}\' a @cite{{book}}', + 'See section {reference_name}' => 'Vegeu la secció {reference_name}', + 'See {node_file_href}' => 'Vegeu {node_file_href}', + 'See {node_file_href} @cite{{book}}' => 'Vegeu {node_file_href} @cite{{book}}', + 'See {node_file_href} section `{section}\' in @cite{{book}}' => 'Vegeu {node_file_href} secció `{secion}\' a @cite{{book}}', + 'See {reference_name}' => 'Vegeu {reference_name}', + 'See {ref}' => 'Vegeu {ref}', + 'See {title_ref}' => 'Vegeu {title_ref}', + 'September' => 'Septembre', + 'Short Table of Contents' => 'Taula de continguts breu', + 'Short table of contents' => 'Taula de continguts breu', + 'Subsection One-Four' => 'Subsecció U-Quatre', + 'Subsection One-One' => 'Subsecció U-U', + 'Subsection One-Three' => 'Subsecció U-Tres', + 'Subsection One-Two' => 'Subsecció U-Dos', + 'Subsubsection One-Two-Four' => 'Subsubsecció U-Dos-Quatre', + 'Subsubsection One-Two-One' => 'Subsubsecció U-Dos-U', + 'Subsubsection One-Two-Three' => 'Subsubsecció U-Dos-Tres', + 'Subsubsection One-Two-Two' => 'Subsubsecció U-Dos-Dos', + 'T2H_today' => 'T2H_today', + 'Table of Contents' => 'Taula de contingus', + 'Table of contents' => 'Taula de continguts', + 'The node you are looking for is at {href}.' => 'El node que esteu buscant està a {href}.', + 'This' => 'Aquest', + 'This document was generated on @i{{date}} using @uref{{program_homepage}, @i{{program}}}.' => 'Aquest document es va generar a @i{{date}} usant @uref{{program_homepage}, @i{{program}}}', + 'This document was generated using @uref{{program_homepage}, @emph{{program}}}.' => 'Aquest document es va generar usant @uref{{program_homepage}, @empf{{program}}}.', + 'Top' => 'Part superior', + 'Untitled Document' => 'Document sense títol', + 'Up' => 'Amunt', + 'Up node' => 'Amunt node', + 'Up section' => 'Amunt secció', + 'current' => 'actual', + 'on @emph{{date}}' => 'el @empf{{date}}', + 'section `@asis{}`{section_name}\'@asis{}\' in @cite{{book}}' => 'secció `@asis{}`{secion_name}\'@asis{}\' a @cite{{book}}', + 'section `{section}\' in @cite{{book}}' => 'secció `{section}\' a @cite{{book}}', + 'see ' => 'vegeu ', + 'see @cite{{book}}' => 'vegeu @cite{{book}}', + 'see section `@asis{}`{section_name}\'@asis{}\' in @cite{{book}}' => 'vegeu secció `@asis{}`{secion_name}\'@asis{}\' a @cite{{book}}', + 'see section `{section}\' in @cite{{book}}' => 'vegeu secció `{section}\' a @cite{{book}}', + 'see section {reference_name}' => 'vegeu secció {reference_name}', + 'see {node_file_href}' => 'vegeu {node_file_href}', + 'see {node_file_href} @cite{{book}}' => 'vegeu {node_file_href} @cite{{book}}', + 'see {node_file_href} section `{section}\' in @cite{{book}}' => 'vegeu {node_file_href} secció `{seciont}\' a @cite{{book}}', + 'see {reference_name}' => 'vegeu {reference_name}', + 'see {ref}' => 'vegeu {ref}', + 'see {title_ref}' => 'vegeu {title_ref}', + '{acronym_like} ({explanation})' => '{acronym_lie} ({explanation})', + '{name} of {class}' => '{name} de {class}', + '{name} on {class}' => '{name} a {class}', + '{node_file_href}' => '{node_file_href}', + '{node_file_href} @cite{{book}}' => '{node_file_href} @cite{{book}}', + '{node_file_href} section `{section}\' in @cite{{book}}' => '{node_file_href} secció `{secció}\' a @cite{{book}}', + '{reference_name}' => '{reference_name}', + '{ref}' => '{ref}', + '{style} {number}' => '{style} {number}', + '{style}: {caption_first_line}' => '{style}: {caption_first_line}', + '{style}: {shortcaption_first_line}' => '{style}: {shortcaption_first_line}', + '{title_ref}' => '{title_ref}' + }; + $LANGUAGES->{'zh'} = { ' The buttons in the navigation panels have the following meaning:' => ' 在导航面板上按钮有以下含意:', ' where the @strong{ Example } assumes that the current position is at @strong{ Subsubsection One-Two-Three } of a document of the following structure:' => ' 这里的@strong{ 例子 } 假设当前的位置是在紧接着的结构的文档中的 @strong{ 小分段 1-2-3 }:', @@ -1052,7 +1192,7 @@ sub split_texi_filename ($) ############################################################################# # Include our standard CSS file, not hard-coded CSS code directly in the HTML! -# For IE, conditionally include the lilypond-ie-fixes.css style sheet +# For IE, add a second conditionally included CSS file. sub lilypond_css_lines ($$) { my $import_lines = shift; @@ -1076,10 +1216,13 @@ sub lilypond_css_lines ($$) "{FILENAME}\" title=\"$ref->{TITLE}\">\n"; } - # The ie-fixes stylesheet is needed for the docs, but not the website. - if (not ($web_manual)) { + # Add a conditionally included CSS file for IE, for either the docs or the website + if ($web_manual) { $Texi2HTML::THISDOC{'CSS_LINES'} .= - "\n"; + "\n"; + } else { + $Texi2HTML::THISDOC{'CSS_LINES'} .= + "\n"; } if ($ENV{'AJAX_SEARCH'} == 1) { @@ -1094,6 +1237,25 @@ sub lilypond_css_lines ($$) $Texi2HTML::THISDOC{'CSS_LINES'} .= "\n"; } } + + ## This section makes the manual name visible to CSS through the body tag + ## so that styles can be applied per manual. It will add the manual + ## directory name (e.g., 'notation' or 'learning') as a CSS class, as well + ## as a development status. + + # Parse the input file name to determine the manual we're dealing with. + my ($docu_dir, $docu_name) = split_texi_filename ($Texi2HTML::THISDOC{'input_file_name'}); + + # Hard-coded value to indicate if this is a development version + # ('devStatus') or stable version ('stableStatus') + # TODO: Figure out how to automatically set this value based on the even/odd minor revision number or some other mechanism. + $documentstatus = 'devStatus'; + + # Create the extra information for the tag. + # For example, the development Notation reference in English + # will output in HTML as + $Texi2HTML::Config::BODYTEXT = 'lang="' . $Texi2HTML::THISDOC{current_lang} . '" class="' . $docu_name . ' ' . $documentstatus . '"'; + } @@ -1506,22 +1668,6 @@ sub generate_ly_toc_entries($$$$$) my $is_parent_of_current = $element->{'id'} && $element_path->{$element->{'id'}}; my $ind = ' ' x $level; my $this_css_class = " class=\""; - # color indices for the second navigation bar on the website - if ($web_manual) { - my %color_maps = ( - 'introduction' => [2, 2, 2, 2, 3, 3, 4, 4], - 'download' => [2, 2, 2, 3, 3, 4], - 'manuals' => [1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4], - 'community' => [1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4], - ); - my $addColor = "colorDefault"; - while (($top_section, $color_indices) = each %color_maps) { - if (index ($element->{'sectionup'}->{'file'}, $top_section) >= 0) { - $addColor = "color" . $color_indices->[$child_count]; - } - } - $this_css_class .= $addColor; - } $this_css_class .= $is_parent_of_current ? ' toc_current"' : '"'; my $entry = "$ind" . &$anchor ($element->{'tocid'}, @@ -1594,10 +1740,10 @@ sub lilypond_generate_page_toc_body($) # FIXME: add link to main page, really hackily. if ($element->{'sectionup'}) { # it's not the top element - push (@toc_entries, "

\n"); + push (@toc_entries, "
  • LilyPond
  • \n"); } else { push (@toc_entries, - "
  • Main
  • \n"); + "
  • LilyPond
  • \n"); } } else { push (@toc_entries, "
    \n"); @@ -1675,7 +1821,7 @@ sub lilypond_print_toc_div ($$) if ($have_index_entries) { my ($docu_dir, $docu_name) = split_texi_filename ($Texi2HTML::THISDOC{'input_file_name'}); print $fh '\n"; } } diff --git a/Documentation/ly-examples/Stockhausen_Klavierstueck2.ly b/Documentation/ly-examples/Stockhausen_Klavierstueck2.ly new file mode 100644 index 0000000000..95daf3cc86 --- /dev/null +++ b/Documentation/ly-examples/Stockhausen_Klavierstueck2.ly @@ -0,0 +1,189 @@ +\version "2.18.0" + +\paper { + tagline = ##f + paper-height = 70\mm +} + +measIu = { + \override TupletBracket.outside-staff-priority = #500 + \set subdivideBeams = ##t + \tupletUp + \tweak style #'dashed-line + \tuplet 3/2 { + \tuplet 3/2 { + \override NoteHead.color = #red + \once \override DynamicLineSpanner.outside-staff-priority = ##f + d'4 -\tweak X-offset #-2 -\tweak Y-offset #0 ^\ff r8 + } + r8 + } +} + +measIl = { + \set subdivideBeams = ##t + \tupletDown + \override NoteHead.color = #red + << + { + \voiceOne + \override NoteHead.color = #red + ees4 ^\f + } + \new Voice { + \voiceTwo + \override NoteHead.color = #red + \override TupletBracket.outside-staff-priority = #500 + \tweak style #'dashed-line + \tuplet 3/2 { + f,4~ -\tweak X-offset #-2 _\f + \tuplet 3/2 { + f,16 r8 + } + } + } + >> + \oneVoice + | %1 +} + +measIIu = { + \override TupletBracket.positions = #'(10.5 . 10.5) + \tupletUp + \tuplet 5/4 { + \override NoteHead.color = #blue + b'''16[ -\tweak X-offset #-4.5 ^\mf + a''16.~^\ff + } + \tuplet 5/4 { + \override NoteHead.color = #blue + a''32 + \override NoteHead.color = #red + d'''8^\ff + } + \tuplet 5/4 { + \override NoteHead.color = #blue + r16. << g''16] aes'''16]^\p >> + } + | % 2 +} + +measIIl = { + \set subdivideBeams = ##t + \tupletUp + \clef treble + \tuplet 5/4 { + \override NoteHead.color = #blue + \set stemRightBeamCount = #1 + r16.[ gis'16~_\f + } + \tuplet 5/4 { + gis'32 + \override NoteHead.color = #red + c'8_\pp + } + \tuplet 5/4 { + cis''16. _\mf + \override NoteHead.color = #blue + fis'16] _\p + } +} + +measIIIu = { + \tupletUp + \override TupletBracket.bracket-visibility = ##t + \tweak style #'dashed-line + \tweak text #tuplet-number::calc-fraction-text + \tweak positions #'(20 . 20) + \tuplet 4/3 { + \tweak positions #'(17.5 . 17.5) + \tuplet 5/4 { + \override NoteHead.color = #red + \change Staff = lower + \voiceOne + 8[ _\laissezVibrer + \change Staff = upper + \voiceTwo + f''32^\f\laissezVibrer + } + \override NoteHead.color = #blue + b''32^\ff\laissezVibrer + a'16.^\ff\laissezVibrer + gis''8^\ff\laissezVibrer + \change Staff = lower + \voiceOne + \clef bass + \override NoteHead.color = #red + cis'8]_\pp + \oneVoice + } +} + +measIIIl = { + \textSpannerDown + \override TextSpanner.bound-details.left.text = \markup { \musicglyph #"pedal.Ped" } + \override TextSpanner.bound-details.right.text = \markup { \musicglyph #"pedal.*" } + \override TextSpanner.dash-fraction = #0.05 + \override TextSpanner.dash-period = #1 + s8 _\pp\startTextSpan s8 + s16 s32 s32 \stopTextSpan +} + +measIVu = { + \revert TupletBracket.positions + \override NoteHead.color = #red + \change Staff = upper + \tupletUp + c''4.~_\p + \tuplet 5/4 { + c''32 r8 + } +} + +measIVl = { + \override NoteHead.color = #red + d,4.~_\mf + \tuplet 5/4 { + d,32 r8 + } +} + +\score { + \new PianoStaff << + \new Staff = "upper" + { + \hide Staff.TimeSignature + \override Staff.TimeSignature.extra-spacing-width = #'(0.0 . 3.0) + \accidentalStyle dodecaphonic + \autoBeamOff + \clef treble + \measIu + \measIIu + \measIIIu + \measIVu + } + \new Dynamics \with { \consists "Time_signature_engraver" } + { + \override Dynamics.TimeSignature.font-size = #4 + \override Dynamics.TimeSignature.font-name = "New Century Schoolbook" + \time 2/8 + s4 | + \time 3/8 + s4. | + s4. | + \time 4/8 + s2 + } + \new Staff = "lower" + { + \hide Staff.TimeSignature + \accidentalStyle dodecaphonic + \autoBeamOff + \clef bass + \measIl + \measIIl + \measIIIl + \measIVl + } + >> +} diff --git a/Documentation/ly-examples/aucun-snippet.ly b/Documentation/ly-examples/aucun-snippet.ly index 4ee9f6fd21..e8e6d538fb 100644 --- a/Documentation/ly-examples/aucun-snippet.ly +++ b/Documentation/ly-examples/aucun-snippet.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.22" \include "example-header.ily" \paper { @@ -130,7 +130,7 @@ global = { } %%%%%%%%% MACRO FOR MAKING SLASHES THROUGH STEMS %%%%%%%%%% -MakeSlash = #(define-music-function (parser location angle len-left len-right +MakeSlash = #(define-music-function (angle len-left len-right thick y-factor offset) (number? number? number? number? number? pair?) @@ -178,17 +178,17 @@ triplumWords = \lyricmode { si que m'ès -- tuet fai -- re _ chan -- _ _ çon } -triplumNotes = \relative c' { +triplumNotes = \relative { \clef "treble_8" %\set Staff.midiInstrument = "flute" % \global \override StemTremolo.beam-thickness = #.125 \override StemTremolo.slope = #1.0 - f8 f4 e8 d c f f f | % 1 + f'8 f4 e8 d c f f f | % 1 % the \scaleDurations command below makes 5 notes last the % duration of a dotted quarter e8 c4 \scaleDurations 3/2 { \tuplet 5/4{e16[ d e d e]} } e8 f4 | % 2 - g2. ~ g4. | % 3 + g2. ~ 4. | % 3 f8 d4 f4. \scaleDurations 3/2 { \tuplet 6/4{ g16[ f e f e f]}} % 4 g8 g4 g4. e4. | % 5 fis8 d4 e8\startGroup g4\stopGroup f8[ e d] | % 6 @@ -200,17 +200,17 @@ motetusWords = \lyricmode { mes or ai _ _ } -motetusNotes = \relative c' { +motetusNotes = \relative { \clef "treble_8" - c2. c8\startGroup b8 \slash c\stopGroup | % 1 + c'2. c8\startGroup b8 \slash c\stopGroup | % 1 a2. c4. | d2. e4. | % 2-3 f2. f8 e d | % 4 - c2. ~ c4. | r2. r4. | % 5-6 + c2. ~ 4. | r2. r4. | % 5-6 g'4. g g8 f e | % 7 } -tenorNotes = \relative c { +tenorNotes = \relative { \clef "treble_8" f2. | a2. | g2. | r2. | % 1-4 c2. | b2. | c2. | % 5-7 diff --git a/Documentation/ly-examples/bach-bwv610.ly b/Documentation/ly-examples/bach-bwv610.ly index 863c8594e6..80bdcc890a 100644 --- a/Documentation/ly-examples/bach-bwv610.ly +++ b/Documentation/ly-examples/bach-bwv610.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" %\include "example-header.ily" @@ -99,45 +99,45 @@ alt = { \global \halsdown \repeat volta 2 { - es16 d es8~ es16 f es d c8 d~ d c + es16 d es8~ 16 f es d c8 d~ d c c8 c4 h8 c8. \staffdown g16 \staffup c h c d - es16 d es8~ es16 f es d c8 d16 es f as g f~ - f16 e f8~ f16 g f es d es d8~ d16 es f d + es16 d es8~ 16 f es d c8 d16 es f as g f~ + 16 e f8~ 16 g f es d es d8~ 16 es f d %% Takt 5 ============================================== g8 f es16 g as es f es f d g as g f - e8 f16 g as g as e f g f8~ f16 f es d + e8 f16 g as g as e f g f8~ 16 f es d } - es16 d es8~ es16 f es des c8 \staffdown b~ b16 b c g - as16 g as f b c b as g f g8~ g16 b \staffup c d - es16 d es8~ es16 f es d c8 d16 es f as g f + es16 d es8~ 16 f es des c8 \staffdown b~ 16 b c g + as16 g as f b c b as g f g8~ 16 b \staffup c d + es16 d es8~ 16 f es d c8 d16 es f as g f %% Takt 10 ============================================= es16 d es8 d g~g g4 fis8 g16 d es c \staffdown d h c a h a h c d h g h - c16 h c \staffup d es d es8~ es d4 c8~ - c16 h c8~ c h c16 \staffdown g as8 g4\fermata + c16 h c \staffup d es d es8~ 8 d4 c8~ + 16 h c8~ 8 h c16 \staffdown g as8 g4\fermata } } tenor = { - \new Voice \relative c' { + \new Voice \relative { \global \repeat volta 2 { - c16 h c8~ c16 h c g a8 g~ g16 g as es - f16 es f d g as g f es d \tieDown es8~ es16 \tieNeutral f es d + c'16 h c8~ 16 h c g a8 g~ 16 g as es + f16 es f d g as g f es d \tieDown es8~ 16 \tieNeutral f es d c16 h c g' c h c c, f8. g16 as!4~ - as16 g as b c h c8 d8. c16 h c d h + 16 g as b c h c8 d8. c16 h c d h %% Takt 5 ============================================== - es16 d es d~ d8 c~c c4 h8 - c4~ c8. b16 as b as8 g16 as g f + es16 d es d~ 8 c~c c4 h8 + c4~ 8. b16 as b as8 g16 as g f } - \halsdown es16 f g as b des c b as g f8~ f es + \halsdown es16 f g as b des c b as g f8~ 8 es es8 es4 d8 es8. b16 es d es f - es16 f g8 c16 d c b a g f8~ f4 + es16 f g8 c16 d c b a g f8~ 4 %% Takt 10 ============================================= g16 fis g a b a b g c b c a d es d c h8 c16 a h g a fis g8 d16 es f es f8~ - f16 d es h c h c8 r16 f g d es g as fis - g16 d f! es f as g f e8. f16~ f d e8\fermata + 16 d es h c h c8 r16 f g d es g as fis + g16 d f! es f as g f e8. f16~ 16 d e8\fermata } } @@ -159,20 +159,20 @@ left = { pedal = { \global \clef "bass" - \relative c { + \relative { \repeat volta 2 { - r8 c16 d es d es8~ es16 a, h g c h c8 + r8 c16 d es d es8~ 16 a, h g c h c8 r16 g as f g f g8 c,2 - r8 c'16 d es d es8~ es16 c f es d c d8 - c8 f16 g as g as8~ as16 d, fis d g fis g8 + r8 c'16 d es d es8~ 16 c f es d c d8 + c8 f16 g as g as8~ 16 d, fis d g fis g8 %% Takt 5 ============================================== r8 a16 h c h c8 r16 g as f g f g8 r16 g as e f e f8 r16 e f h, c h c8 } - r8 es16 f g f g8~ g16 c, d! b es d es8 + r8 es16 f g f g8~ 16 c, d! b es d es8 r16 b c as b as b8 es,2 - r8 c'16 d es d es8~ es16 c f es d c d8 + r8 c'16 d es d es8~ 16 c f es d c d8 %% Takt 10 ============================================= c8 es16 f! g fis g8 r16 d es c d c d8 g,1 diff --git a/Documentation/ly-examples/bach-schenker.ly b/Documentation/ly-examples/bach-schenker.ly index 82d2f6d858..06f64306d8 100644 --- a/Documentation/ly-examples/bach-schenker.ly +++ b/Documentation/ly-examples/bach-schenker.ly @@ -15,7 +15,7 @@ I = \once \override NoteColumn.ignore-collision = ##t -\version "2.17.30" +\version "2.19.21" staffPiano = \new PianoStaff { \set Score.timing = ##f @@ -24,14 +24,14 @@ staffPiano = \new PianoStaff { \new Staff = "RH" { % Right hand \clef treble \key g \major - \relative c'' { + \relative { \override Staff.NoteCollision.merge-differently-headed = ##t << { \override Beam.positions = #'(8 . 8) \hide NoteHead \override NoteHead.duration-log = #1 - s1 b8[^\markup { + s1 b'8[^\markup { \override #'(baseline-skip . 0.5) % Add color to markup in top staff \column { \with-color #red \small { ^ 3 } } diff --git a/Documentation/ly-examples/cary-layout.ily b/Documentation/ly-examples/cary-layout.ily index c002e111d0..dd3858b43c 100644 --- a/Documentation/ly-examples/cary-layout.ily +++ b/Documentation/ly-examples/cary-layout.ily @@ -1,5 +1,5 @@ -\version "2.17.30" +\version "2.19.22" \layout { indent = #0 @@ -42,7 +42,7 @@ printfirst-page-number = ##t print-page-number = ##t ragged-last-bottom = ##t - markup-system-spacing #'minimum-distance = #25 + markup-system-spacing.minimum-distance = #25 } #(set-global-staff-size 14) @@ -61,7 +61,7 @@ sfpp = #(make-dynamic-script "sfpp") sffp = #(make-dynamic-script "sffp") sffpp = #(make-dynamic-script "sffpp") -beam = #(define-music-function (parser location left right) (number? number?) +beam = #(define-music-function (left right) (number? number?) (cond ((and (= left 0) (> right 0)) #{ \set stemRightBeamCount = #right @@ -80,32 +80,32 @@ beam = #(define-music-function (parser location left right) (number? number?) ) ) -fraction = #(define-music-function (parser location music) (ly:music?) +fraction = #(define-music-function (music) (ly:music?) #{ \tweak text #tuplet-number::calc-fraction-text #music #}) -triangle = #(define-music-function (parser location music) (ly:music?) +triangle = #(define-music-function (music) (ly:music?) #{ \once \set shapeNoteStyles = ##(do do do do do do do) #music #}) -semicircle = #(define-music-function (parser location music) (ly:music?) +semicircle = #(define-music-function (music) (ly:music?) #{ \once \set shapeNoteStyles = ##(re re re re re re re) #music #}) -blackdiamond = #(define-music-function (parser location music) (ly:music?) +blackdiamond = #(define-music-function (music) (ly:music?) #{ \once \set shapeNoteStyles = ##(mi mi mi mi mi mi mi) #music #}) -tiltedtriangle = #(define-music-function (parser location music) (ly:music?) +tiltedtriangle = #(define-music-function (music) (ly:music?) #{ \once \set shapeNoteStyles = ##(fa fa fa fa fa fa fa) #music #}) -square = #(define-music-function (parser location music) (ly:music?) +square = #(define-music-function (music) (ly:music?) #{ \once \set shapeNoteStyles = ##(la la la la la la la) #music #}) -wedge = #(define-music-function (parser location music) (ly:music?) +wedge = #(define-music-function (music) (ly:music?) #{ \once \set shapeNoteStyles = ##(ti ti ti ti ti ti ti) #music #}) -harmonic = #(define-music-function (parser location music) (ly:music?) +harmonic = #(define-music-function (music) (ly:music?) #{ \once \set shapeNoteStyles = ##(harmonic harmonic harmonic harmonic harmonic harmonic harmonic) #music #}) -cross = #(define-music-function (parser location music) (ly:music?) +cross = #(define-music-function (music) (ly:music?) #{ \once \set shapeNoteStyles = ##(cross cross cross cross cross cross cross) #music #}) -white = #(define-music-function (parser location music) (ly:music?) +white = #(define-music-function (music) (ly:music?) #{ \once \override NoteHead.duration-log = #1 #music #}) diff --git a/Documentation/ly-examples/cary.ly b/Documentation/ly-examples/cary.ly index 1e1d98d461..15494cf51d 100644 --- a/Documentation/ly-examples/cary.ly +++ b/Documentation/ly-examples/cary.ly @@ -46,7 +46,7 @@ \override Score.MetronomeMark.extra-offset = #'(0 . 6) \override Score.MetronomeMark.font-size = #3 \tempo 8=42 - \time 5/16 s4 ~ s16 \noBreak % measure 6 + \time 5/16 s4 s16 \noBreak % measure 6 \time 4/8 s2 \noBreak % measure 7 \time 4/8 s2 \noBreak % measure 8 diff --git a/Documentation/ly-examples/chart.ly b/Documentation/ly-examples/chart.ly index bcf8fd7d2d..f815744705 100644 --- a/Documentation/ly-examples/chart.ly +++ b/Documentation/ly-examples/chart.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \include "example-header.ily" \include "predefined-guitar-fretboards.ly" @@ -12,9 +12,9 @@ global = { \numericTimeSignature } -melody = \relative c' { +melody = \relative { \global - d4 + d'4 g4 b8( a) g4 fis e e e e a c8( b) a4 g diff --git a/Documentation/ly-examples/granados.ly b/Documentation/ly-examples/granados.ly index 1579ac27bf..9f4cf10301 100644 --- a/Documentation/ly-examples/granados.ly +++ b/Documentation/ly-examples/granados.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.40" \include "example-header.ily" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -30,10 +30,10 @@ global = { \override NoteColumn.ignore-collision = ##t } -upperVoiceOne = \relative c'' { +upperVoiceOne = \relative { \voiceOne \hide TupletBracket - 8\([ \tuplet 5/4{g'32( aes g f g]) } + 8\([ \tuplet 5/4{g'32( aes g f g]) } 8[ \tuplet 5/4{32( c' bes aes bes]) } 8 \) | % end m. 1 %--------------------------------------------------% @@ -45,15 +45,15 @@ upperVoiceOne = \relative c'' { 8\([ \tuplet 5/4{32( aes' g f g]) } \set subdivideBeams = ##t \set baseMoment = #(ly:make-moment 1/8) - \set beatStructure = #'(2 2 2) + \set beatStructure = 2,2,2 16 \tuplet 5/4{ bes'32( c bes aes bes]) } \set subdivideBeams = ##f \ottava #1 16 \appoggiatura f8 16\) } -upperVoiceTwo = \relative c'' { +upperVoiceTwo = \relative { \voiceTwo - s8 c8\< [ c' \!] + s8 c''8\< [ c' \!] s32 s32_\appassmolto s8. \voiceOne r8 -> s4 \override Stem.cross-staff = ##t \override Stem.length = #28 @@ -61,11 +61,11 @@ upperVoiceTwo = \relative c'' { s8 \voiceTwo g,8 aes4 s4 } -middleVoiceOne = \relative c' { +middleVoiceOne = \relative { \override Stem.cross-staff = ##t \override Stem.length = #32 \override Flag.style = #'no-flag - d!8\noBeam s8 s8 s8_\crmolto s4 % 1 + d'!8\noBeam s8 s8 s8_\crmolto s4 % 1 s4 8[ ] \voiceOne e,8( dis16 e) | % 2 \revert Stem.length \revert Stem.cross-staff @@ -74,32 +74,32 @@ middleVoiceOne = \relative c' { %s2. % beginning m. 3 } -middleVoiceTwo = \relative c' { +middleVoiceTwo = \relative { s2. | % 1 \override Stem.cross-staff = ##t \override Stem.length = #24 \override Flag.style = #'no-flag - s2 \voiceTwo e!4 | % 2 + s2 \voiceTwo e'!4 | % 2 s4 \voiceTwo 8 16 d' 8 | % 3 } -lowerVoiceOne = \relative c, { +lowerVoiceOne = \relative { \override Staff.NoteCollision.merge-differently-headed = ##t \override Staff.NoteCollision.merge-differently-dotted = ##t - bes8 \csm \stemDown 8 s2 + bes,,8 \csm \stemDown 8 s2 \csl \stemUp \set subdivideBeams = ##t \set baseMoment = #(ly:make-moment 1/16) - \set beatStructure = #'(4 4 4) + \set beatStructure = 4,4,4 s8 \hideNotes \slurUp \stemDown es,,64( bes'' s64 \unHideNotes \stemUp g64[ bes c d c]) s2 \set subdivideBeams = ##f bes,,8 \csm \stemDown 8 s2 } -lowerVoiceTwo = \relative c, { +lowerVoiceTwo = \relative { \voiceTwo - bes2. + bes,,2. \csh \once \override Beam.damping = #+inf.0 8 \csl \slurUp diff --git a/Documentation/ly-examples/orchestra.ly b/Documentation/ly-examples/orchestra.ly index 6b205af903..7654521ebb 100644 --- a/Documentation/ly-examples/orchestra.ly +++ b/Documentation/ly-examples/orchestra.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { tagline = ##f @@ -166,19 +166,19 @@ modern = R1*9/8 | } - flutes = \relative c'''' { + flutes = \relative { \clef treble \key ees \minor \time 6/8 R2. - 16(\mf\< ) ( ) | + 16(\mf\< ) ( ) | 8-.->\!\ff \offCr r r r4 r8 | R2. | \time 9/8 R1*9/8 | } - oboes = \relative c''' { + oboes = \relative { \clef treble \key ees \minor \time 6/8 R2. | - 4(\mf\< 8 4 8) | + 4(\mf\< 8 4 8) | -.->\!\ff \offCr r r r4 r8 | R2. | \time 9/8 R1*9/8 | @@ -194,9 +194,9 @@ modern = R1*9/8 | } - bassoons = \relative c, { + bassoons = \relative { \clef bass \key ees \minor \time 6/8 - 4.\pp\< c'^"a2" | + 4.\pp\< c'^"a2" | bes8-. bes-. bes-. ges-. ges-. ges-. | ees-.->\!\ff \offCr 4\pp ~ 4. ~ | 2. | \time 9/8 @@ -243,7 +243,7 @@ R2. | R1*9/8 | } - trombones = \relative c' { + trombones = \relative { \clef tenor \key ees \minor \time 6/8 r4 r8 4.\mp\< ~ | 8-. -. -. -. -. -. | @@ -252,16 +252,16 @@ R2. | R1*9/8 | } - tuba = \relative c,, { + tuba = \relative { \clef bass \key ees \minor \time 6/8 - 4.(\pp\< | + 4.(\pp\< | 8-.) -. -. -. -. -. | -.->\!\ff \offCr r r r4 r8 | R2. | \time 9/8 R1*9/8 | } - timpani = \relative c { + timpani = \relative { \clef bass \key ees \minor \time 6/8 ees8\< ees ees ees ees ees | bes bes bes bes bes bes | @@ -271,49 +271,49 @@ R2. | ees r r r4 r8 r4 r8 | } - trian = \relative c' { + trian = { \clef percussion \time 6/8 R2.*4 | \time 9/8 R1*9/8 | } - cym = \relative c' { + cym = { \clef percussion \time 6/8 R2.*4 | \time 9/8 R1*9/8 | } - tamt = \relative c' { + tamt = { \clef percussion \time 6/8 R2. | r4 r8 r c4\mf\<^"*" ~ | - c8\!\ff r r r4 r8 | R2. | + 8\!\ff r r r4 r8 | R2. | \time 9/8 R1*9/8 | } - tamb = \relative c' { + tamb = { \clef percussion \time 6/8 R2.*4 | \time 9/8 R1*9/8 | } - snare = \relative c' { + snare = { \clef percussion \time 6/8 R2.*4 | \time 9/8 - c8\pp c c c c c c c c | + c8\pp 8 8 8 8 8 8 8 8 | } - bsdrum = \relative c' { + bsdrum = { \clef percussion \time 6/8 - c2.:32\pp\< ~ | c: ~ | - c8\!\ff \offCr r r r4 r8 | R2. | + c2.:32\pp\< ~ | 2.: ~ | + 8\!\ff \offCr r r r4 r8 | R2. | \time 9/8 - c2.:32\pp ~ c4.: | + 2.:32\pp ~ 4.: | } harprh = \relative c'' { @@ -337,25 +337,25 @@ R2. | } - violinI = \relative c'''' { + violinI = \relative { \clef treble \key ees \minor \time 6/8 - ges,,16(\pp\< ees c ees ges bes) c( bes ges bes c ees) | + ges'16(\pp\< ees c ees ges bes) c( bes ges bes c ees) | ges( ees c ees ges bes) c( bes ges bes c ees) | ges8-.->\!\ff \offCr r r r4 r8 | R2. | \time 9/8 R1*9/8 | } - violinII = \relative c''' { + violinII = \relative { \clef treble \key ees \minor \time 6/8 - c,,16(\pp\< bes ges bes c ees) ges( ees c ees ges bes) | + c'16(\pp\< bes ges bes c ees) ges( ees c ees ges bes) | c( bes ges bes c ees) ges( ees c ees ges bes) | c8-.->\!\ff \offCr r r r4 r8 | R2. | \time 9/8 r4 r8 \repeat tremolo 6 { c,,32->\pp^\pont e } r4 r8 | } - viola = \relative c { + viola = \relative { \clef alto \key ees \minor \time 6/8 8-.\pp\< -. -. -. -. -. | -. -. -. -. -. -. | @@ -364,7 +364,7 @@ R2. | \repeat tremolo 12 { ges,32->^\pont bes } \repeat tremolo 6 {ges->( bes) } | } - cello = \relative c { + cello = \relative { \clef bass \key ees \minor \time 6/8 8-.\pp\< -. -. -. -. -. | -. -. -. -. -. -. | diff --git a/Documentation/ly-examples/sesto-full.ly b/Documentation/ly-examples/sesto-full.ly index 6f10964616..52c6327349 100644 --- a/Documentation/ly-examples/sesto-full.ly +++ b/Documentation/ly-examples/sesto-full.ly @@ -4,7 +4,7 @@ %%% %%% Nicolas Sceaux -\version "2.16.0" +\version "2.19.2" \include "sesto.ily" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -34,7 +34,7 @@ \set Staff.instrumentName = \markup \smallCaps Sesto. \global \clef treble \sesto >> - \lyricsto "sesto" \new Lyrics \sestoLyrics + \new Lyrics \lyricsto "sesto" \sestoLyrics >> \new Staff << \set Staff.instrumentName = "Bassi." diff --git a/Documentation/ly-examples/sesto-piano.ly b/Documentation/ly-examples/sesto-piano.ly index 286746b16d..223040e600 100644 --- a/Documentation/ly-examples/sesto-piano.ly +++ b/Documentation/ly-examples/sesto-piano.ly @@ -4,7 +4,7 @@ %%% %%% Nicolas Sceaux -\version "2.16.0" +\version "2.19.2" \include "sesto.ily" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -25,7 +25,7 @@ \set Staff.instrumentName = \markup \smallCaps Sesto. \global \clef treble \sesto >> - \lyricsto "sesto" \new Lyrics \sestoLyrics + \new Lyrics \lyricsto "sesto" \sestoLyrics >> \new PianoStaff << \new Staff << diff --git a/Documentation/ly-examples/sesto.ily b/Documentation/ly-examples/sesto.ily index e2c4d9e88d..8ab9e4b990 100644 --- a/Documentation/ly-examples/sesto.ily +++ b/Documentation/ly-examples/sesto.ily @@ -4,7 +4,7 @@ %%% %%% Nicolas Sceaux -\version "2.16.0" +\version "2.19.2" \header { title = "Giulio Cesare in Egitto" subtitle = "Sesto: Svegliatevi nel core, furie d'un alma offesa (excerpt)" @@ -19,7 +19,7 @@ sesto = { R1*6 | r4 r8 g' c'' ees''16[ d''] c''8 c'' | - c'' g' ees''4 ~ ees''8 d''16 ees'' f''8 aes' | + c'' g' ees''4 ~ 8 d''16 ees'' f''8 aes' | aes' g' r c'' c'' b'16[ c''] d''8 g' | %{ @@ -39,12 +39,12 @@ sesto = { c'' c'' r c'' f' f''16[ ees''] d''8 c'' | b'16[ a'] g'8 r4 ees''8 ees''16 d'' c''8 bes' | aes' g' r g' aes' f' d'' b' | - f''2 ~ f''8 d'' b' g' | + f''2 ~ 8 d'' b' g' | ees'4 r8 d'' ees'' d''16[ c''] b'4 | %%25 c'' r8 g' c'' g' ees' g' | c'4 r8 g' aes' f' d'' b' | - f''2 ~ f''8 d'' b' g' | + f''2 ~ 8 d'' b' g' | ees'4 r8 g'' ees'' d''16[ c''] b'4 | c''2 r | %%30 @@ -77,14 +77,14 @@ sestoLyrics = \lyricmode { violinoI = { r4 r8 g' c'' ees''16 d'' c''8 c'' | - c'' c' ees''4 ~ ees''8 d''16 ees'' f''8 aes' | + c'' c' ees''4 ~ 8 d''16 ees'' f''8 aes' | aes' g' r c'' c''8.^\trill b'32 c'' d''8 g' | f'4. d''8 ees'' d''16 c'' b'4 | %%5 c''16 g'' f'' g'' ees'' g'' f'' g'' ees'' g'' f'' g'' ees'' g'' f'' g'' | c'' g'' f'' g'' ees'' g'' f'' g'' aes''8 g''16 f'' f''4^\trill | ees'' r8 g'_\p c'' ees''16 d'' c''8 c'' | - c'' g' ees''4 ~ ees''8 d''16 ees'' f''8 aes' | + c'' g' ees''4 ~ 8 d''16 ees'' f''8 aes' | aes' g' r c'' c'' b'16 c'' d''8 g' | %{ %%10 @@ -103,18 +103,18 @@ violinoI = { c'' ees'' ees'' f'' g'' ees'' f'' g'' aes'' f'' g'' ees'' f'' d'' ees'' c'' | \tag #'violin { g'' g' g'' g'' } \tag #'reduction { g'' d'' g'' g'' } g'' b' g'' g'' g'' f'' ees'' d'' c''8 bes' | aes' g' r g' aes' f' d'' b' | - f''2 ~ f''8 d'' b' g' | + f''2 ~ 8 d'' b' g' | ees'16 c' g' ees' c'' g' g'' d'' g'4 r | %%25 c'''16 ees''' d''' ees''' c''' ees''' d''' ees''' g'' c''' b'' c''' g'' c''' b'' c''' | ees'' g'' f'' g'' ees'' g'' f'' g'' \tag #'violin { aes'8 f' } \tag #'reduction { c''8 aes' } d'' b' | - f''2 ~ f''8 d'' b' g' | + f''2 ~ 8 d'' b' g' | ees'4^\fermata r r2 | r4 r8 c'_\f c'' ees''16 d'' c''8 c'' | %%30 - c'' c' ees''4 ~ ees''8 d''16 ees'' f''8 aes' | + c'' c' ees''4 ~ 8 d''16 ees'' f''8 aes' | aes' g' r g' aes' f' d'' b' | - f''2 ~ f''8 d'' b' g' | + f''2 ~ 8 d'' b' g' | c''16 g'' f'' g'' ees'' g'' f'' g'' c'' g'' f'' g'' ees'' g'' f'' g'' | b'8 c''16 d'' ees''8 d'' c''4^\fermata r %} @@ -122,14 +122,14 @@ violinoI = { violinoII = { r4 r8 g' c'' ees''16 d'' c''8 c'' | - c'' c' ees''4 ~ ees''8 d''16 ees'' f''8 aes' | + c'' c' ees''4 ~ 8 d''16 ees'' f''8 aes' | aes' g' r c'' c''8.^\trill b'32 c'' d''8 g' | f'4. d''8 ees'' d''16 c'' b'4 | %%5 c''16 ees'' d'' ees'' c'' ees'' d'' ees'' c'' ees'' d'' ees'' c'' ees'' d'' ees'' | c'' ees'' d'' ees'' c'' ees'' d'' ees'' d''8[ ees''] ees'' d'' | ees''4 r8 g' c'' ees''16 d'' c''8 c'' | - c'' g' ees''4 ~ ees''8 d''16 ees'' f''8 aes' | + c'' g' ees''4 ~ 8 d''16 ees'' f''8 aes' | aes' g' r c'' c'' b'16 c'' d''8 g' | %{ %%10 @@ -148,18 +148,18 @@ violinoII = { aes' c'' c'' d'' ees'' c'' d'' ees'' f'' d'' ees'' c'' d'' b' c'' a' | \tag #'violin { b' d' d' b' } \tag #'reduction { b' g' d'' b' } b' g' b' d'' g'' f'' ees'' d'' c''8 bes' | d' ees' r g' aes' f' d'' b' | - f''2 ~ f''8 d'' b' g' | + f''2 ~ 8 d'' b' g' | ees'16 c' g' ees' c'' g' g'' d'' g'4 r | %%25 ees''16 g'' f'' g'' ees'' g'' f'' g'' ees'' ees'' d'' ees'' c'' ees'' d'' ees'' | g' ees'' d'' ees'' c'' ees'' d'' ees'' \tag #'violin { c''8 aes' } \tag #'reduction { aes'8 f' } f' d' | - f''2 ~ f''8 d'' b' g' | + f''2 ~ 8 d'' b' g' | ees'4^\fermata r r2 | r4 r8 c' c'' ees''16 d'' c''8 c'' | %%30 - c'' c' ees''4 ~ ees''8 d''16 ees'' f''8 aes' | + c'' c' ees''4 ~ 8 d''16 ees'' f''8 aes' | aes' g' r g' aes' f' d'' b' | - f''2 ~ f''8 d'' b' g' | + f''2 ~ 8 d'' b' g' | c''16 ees'' d'' ees'' c'' ees'' d'' ees'' c'' ees'' d'' ees'' c'' ees'' d'' ees'' | d'8 ees'16 f' g'8 b' c''4^\fermata r %} diff --git a/Documentation/ly-examples/tab-example.ly b/Documentation/ly-examples/tab-example.ly index fbccc1f558..1d954efbc6 100644 --- a/Documentation/ly-examples/tab-example.ly +++ b/Documentation/ly-examples/tab-example.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.21" #(define (glissando::calc-extra-dy grob) (let* ((original (ly:grob-original grob)) @@ -18,21 +18,21 @@ upper= \relative c' { \set Staff.midiInstrument = #"acoustic guitar (steel)" \set fingeringOrientations = #'(left) - \partial 4. cis8 e4 + \partial 4. \acciaccatura c16 \glissando cis8 e4 < cis-1 g'-3 >2 s8 \grace a16 ( \glissando < b-2 >8\3 ) < d-1 > ( b ) < e-3 >\2 ( b ) \grace < ais-2 >16 ( \glissando a8 g ) s4. s4. < d'\3 g\2 >8 < gis,\4 d'\3 fis\2 >2\arpeggio ~ < gis\4 d'\3 fis\2 >2 < b'\2\harmonic e\harmonic >2\fermata } -lower= \relative c { +lower= \relative { \set fingeringOrientations = #'(left) \partial 4. s4. s4 e,4 s2 s2 s8 < e'-3 >4. ~ e4 \hideNotes \grace { b8 \glissando s4 } \unHideNotes < e-2 >4\5 e,2 ~ - e2 < e'\6\harmonic > + 2 < e'\6\harmonic > } \score { diff --git a/Documentation/ly-examples/theory.ly b/Documentation/ly-examples/theory.ly index 5dbe0da654..bbf76e3f0a 100644 --- a/Documentation/ly-examples/theory.ly +++ b/Documentation/ly-examples/theory.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \include "example-header.ily" #(ly:set-option 'point-and-click #f) @@ -10,7 +10,7 @@ global = { \key c \major } -cf = \relative c { +cf = \relative { \clef bass \global c4 c' b a | diff --git a/Documentation/misc/announce-v2.0.html b/Documentation/misc/announce-v2.0.html index 8b72cf4a26..6551a677bb 100644 --- a/Documentation/misc/announce-v2.0.html +++ b/Documentation/misc/announce-v2.0.html @@ -153,7 +153,7 @@ and \appoggiatura, \acciaccatura g8 f4 -

    Both reflect the traditional meanings of acciaccatura and appogiatura, +

    Both reflect the traditional meanings of acciaccatura and appoggiatura, and both insert insert a slur from the first grace note to the main note. diff --git a/Documentation/music-glossary.tely b/Documentation/music-glossary.tely index 7d198504b7..0b03549d88 100644 --- a/Documentation/music-glossary.tely +++ b/Documentation/music-glossary.tely @@ -12,9 +12,14 @@ terms used in the documentation manuals for LilyPond version @version{}. @end macro -@c `Music Glossary' was born 1999-10-04 with git commit 280a0bb... +@c `Music Glossary' was born 1999-10-04 with this commit: +@c lilypond-1.2.12 +@c author: fred +@c commit: be4e46f61b1a8dec0922e0fd849c626beb6ab9be +@c file: Documentation/user/glossary.texi + @macro copyrightDeclare -Copyright @copyright{} 1999--2012 by the authors +Copyright @copyright{} 1999--2015 by the authors @end macro @set FDL @@ -245,6 +250,7 @@ Languages in this order. * harmonics:: * harmony:: * hemiola:: +* high bass clef:: * homophony:: * hook:: * hymn meter:: @@ -1225,7 +1231,8 @@ FI: bassoavain. A clef setting with middle C on the first top ledger line. @seealso -@ref{F clef}. +@ref{F clef}, +@ref{high bass clef}. @node beam @@ -3023,7 +3030,7 @@ D: doppelter Vorschlag, NL: dubbele voorslag, DK: dobbelt forslag, S: dubbelslag, -FI: kaksoisappogiatura, kaksoisetuhele. +FI: kaksoisappoggiatura, kaksoisetuhele. @seealso @ref{appoggiatura}. @@ -3618,8 +3625,7 @@ played above the bass notes. @lilypond[quote,line-width=13.0\cm] \new GrandStaff << \new Staff = "rh" \with { - fontSize = #-3 - \override StaffSymbol #'staff-space = #(magstep -3) + \magnifyStaff #2/3 } \relative c'' { \clef treble \key es \major @@ -3889,17 +3895,17 @@ the parallel minor scale, or the incomplete dominant seventh chord. ((thick (* (magstep font-size) (ly:output-def-lookup layout 'line-thickness))) (underline-thick (* thickness thick)) - (markup (interpret-markup layout props arg)) - (x1 (car (ly:stencil-extent markup X))) - (x2 (cdr (ly:stencil-extent markup X))) - (y1 (car (ly:stencil-extent markup Y))) - (y2 (cdr (ly:stencil-extent markup Y))) + (m (interpret-markup layout props arg)) + (x1 (car (ly:stencil-extent m X))) + (x2 (cdr (ly:stencil-extent m X))) + (y1 (car (ly:stencil-extent m Y))) + (y2 (cdr (ly:stencil-extent m Y))) (dx (* extension (- x2 x1))) (dy (* extension (- y2 y1))) (line (make-line-stencil underline-thick (- x1 dx) (- y1 dy) (+ x2 dx) (+ y2 dy)))) - (ly:stencil-add markup line))) + (ly:stencil-add m line))) << { 1 @@ -4288,6 +4294,42 @@ and is therefore a polymeter (second definition) of considerable antiquity. @seealso @ref{mensural notation}, @ref{meter}, @ref{polymeter}, @ref{proportion}. +@node high bass clef +@section high bass clef + +ES: ?, +I: ?, +F: ?, +D: hoher Bassschlüssel, +NL: ?, +DK: ?, +S: ?, +FI: ?. + +Beginning in 18th century the high bass clef used in French Horn parts +for the lowest pitches. This usage of the F clef was then passed down +from the French Horn to the Basset Horn and then to the Bass Clarinet. +It looks identical to the standard bass clef, but is pitched an octave +higher -- octavation indicators on clefs appeared at the beginning of +the 20th Century. + +In LilyPond, the most straightforward way to make a high bass clef is to +print the modern version @code{\clef "baas^8"} but without the @code{8}; + +@lilypond[quote,verbatim,relative=1] +<< + \new Staff { + \clef treble { g4 b d' g' } + } + \new Staff \with { \omit ClefModifier } + { \clef "bass^8" { g4 b d' g' } } +>> +@end lilypond + + +@seealso +@ref{F clef}, @ref{bass clef}. + @node homophony @section homophony @@ -5475,7 +5517,7 @@ The female voice between soprano and contralto. ES: do central, I: do centrale, F: do central, do 3 -D: zweigestrichenes@w{ }c, +D: eingestrichenes@w{ }c, NL: centrale@w{ }c, DK: enstreget@w{ }c, S: ettstruket@w{ }c, @@ -5610,7 +5652,7 @@ theme or subject. @lilypond[quote,line-width=13.0\cm] \score{ \relative c'' { - \set Score.implicitTimeSignatureVisibility = #all-invisible + \set Score.initialTimeSignatureVisibility = #all-invisible \override Score.TimeSignature #'break-visibility = #all-invisible \time 4/4 \key g \major @@ -8170,7 +8212,7 @@ standard. Tuning forks for other pitches are available. ES: grupo de valoración especial, I: gruppi irregolari, -F: ?, +F: N-olet, D: N-tole, NL: Antimetrische figuur, DK: ?, diff --git a/Documentation/nl/learning.tely b/Documentation/nl/learning.tely index 25f36cfcba..c23be1aa0a 100644 --- a/Documentation/nl/learning.tely +++ b/Documentation/nl/learning.tely @@ -26,7 +26,7 @@ This file provides an introduction to LilyPond version @c `Learning Manual' was born 1999-10-10 with git commit b9abaac... @macro copyrightDeclare -Copyright @copyright{} 1999--2012 door de auteurs. +Copyright @copyright{} 1999--2015 door de auteurs. @end macro @set FDL diff --git a/Documentation/nl/learning/common-notation.itely b/Documentation/nl/learning/common-notation.itely index ae89bdba9c..99d69db33a 100644 --- a/Documentation/nl/learning/common-notation.itely +++ b/Documentation/nl/learning/common-notation.itely @@ -12,16 +12,12 @@ @c Translation checker: @c Translation checker committish: -@c \version "2.17.28" +@c \version "2.19.21" @ignore Tutorial guidelines: (different from policy.txt!) -- unless you have a really good reason, use either +- unless you have a really good reason, use @lilypond[verbatim,quote] - or - @lilypond[verbatim,quote,relative=2] - - Don't use any other relative=X commands. - use "aes" and "ees" instead of "as" and "es". I know it's not correct Dutch naming, but let's not confuse people with this @@ -128,8 +124,8 @@ Nederlands. Om andere namen te gebruiken voor @notation{verplaatsingstekens}, zie @ruser{Note names in other languages}. -@lilypond[verbatim,quote,relative=2] -cis4 ees fisis, aeses +@lilypond[verbatim,quote] +\relative { cis''4 ees fisis, aeses } @end lilypond @cindex toonsoort, zetten van @@ -144,11 +140,8 @@ cis4 ees fisis, aeses @cindex layout versus invoer @funindex \key -@funindex key @funindex \major -@funindex major @funindex \minor -@funindex minor Terminologie: @rglos{key signature}, @rglos{major}, @rglos{minor}. @@ -196,9 +189,11 @@ horen. In dit voorbeeld: -@lilypond[verbatim,quote,relative=2] -\key d \major -cis4 d e fis +@lilypond[verbatim,quote] +\relative { + \key d \major + cis''4 d e fis +} @end lilypond @noindent @@ -212,9 +207,11 @@ veelmeer @qq{er is hier een noot met toonhoogte B-stamtoon.} In de toonsoort van A-mol majeur, krijgt hij bij het printen @emph{toch} een toevallig teken: -@lilypond[verbatim,quote,relative=2] -\key aes \major -aes4 c b c +@lilypond[verbatim,quote] +\relative { + \key aes \major + aes'4 c b c +} @end lilypond Als het bovenstaand voorbeeld verwarrend is, ga dan eens na: @@ -262,8 +259,8 @@ Een @notation{overbinding} maak je door het toevoegen van een tilde @code{~} aan de eerste noot die overgebonden wordt. -@lilypond[verbatim,quote,relative=2] -g4~ g c2~ | c4~ c8 a~ a2 | +@lilypond[verbatim,quote] +\relative { g'4~ 4 c2~ | 4~ 8 a~ 2 | } @end lilypond @subheading Legatobogen @@ -275,8 +272,8 @@ Een @notation{legatoboog} is een kromme, getrokken over een aantal noten. De beginnoot en eindnoot worden gemarkeerd met respectievelijk @code{(} en @code{)}. -@lilypond[verbatim,quote,relative=2] -d4( c16) cis( d e c cis d) e( d4) +@lilypond[verbatim,quote] +\relative { d''4( c16) cis( d e c cis d) e( d4) } @end lilypond @subheading Fraseringsbogen @@ -289,8 +286,8 @@ worden ingevoerd met @code{\(} en @code{\)}. Je een tegelijkertijd gebruiken, maar je kunt geen gelijktijdige legatobogen of gelijktijdige fraseringsbogen gebruiken. -@lilypond[verbatim,quote,relative=2] -g4\( g8( a) b( c) b4\) +@lilypond[verbatim,quote] +\relative { g'4\( g8( a) b( c) b4\) } @end lilypond @smallspace @@ -309,8 +306,8 @@ toonhoogte. Legatobogen geven de speelwijze of gebruikt over grotere nootgroepen. Legatobogen en overbindingen kunnen worden genest. -@lilypond[verbatim,quote,relative=2] -c4~( c8 d~ d4 e) +@lilypond[verbatim,quote] +\relative { c''4(~ c8 d~ 4 e) } @end lilypond @@ -339,9 +336,11 @@ Algemene @notation{articulaties} kunnen worden toegevoegd aan een noot met een streepje @code{-} en een enkel karakter: -@lilypond[verbatim,quote,relative=2] -c4-^ c-+ c-- c-! -c4-> c-. c2-_ +@lilypond[verbatim,quote] +\relative { + c''4-^ c-+ c-- c-! + c4-> c-. c2-_ +} @end lilypond @subheading Vingerzetting @@ -357,8 +356,8 @@ Op soortgelijke manier wordt een @notation{vingerzetting} aan een noot toegevoegd met een streepje (@code{-}) en het cijfer dat moet worden geprint: -@lilypond[verbatim,quote,relative=2] -c4-3 e-5 b-2 a-1 +@lilypond[verbatim,quote] +\relative { c''4-3 e-5 b-2 a-1 } @end lilypond Je kunt meerdere articulaties bij dezelfde noot gebruiken. @@ -369,8 +368,8 @@ streepje (@code{-}) te vervangen door @code{^} (boven) or beter om LilyPond de richting van de articulaties te laten uitzoeken. -@lilypond[verbatim,quote,relative=2] -c4_-^1 d^. f^4_2-> e^-_+ +@lilypond[verbatim,quote] +\relative { c''4_-^1 d^. f^4_2-> e^-_+ } @end lilypond @subheading Dynamiek @@ -386,11 +385,8 @@ c4_-^1 d^. f^4_2-> e^-_+ @funindex \mf @funindex \pp @funindex \< -@funindex < @funindex \> -@funindex > @funindex \! -@funindex ! Terminologie: @rglos{dynamics}, @rglos{crescendo}, @rglos{decrescendo}. @@ -398,8 +394,8 @@ Terminologie: @rglos{dynamics}, @rglos{crescendo}, @notation{Dynamische} tekens maak je door het teken (met een backslash) aan de noot toe te voegen: -@lilypond[verbatim,quote,relative=2] -c4\ff c\mf c\p c\pp +@lilypond[verbatim,quote] +\relative { c''4\ff c\mf c\p c\pp } @end lilypond @@ -409,8 +405,8 @@ dynamische teken, bijvoorbeeld @code{\f}, beïndigt de (de)crescendo maar je kunt ook het commando @code{\!} gebruiken: -@lilypond[verbatim,quote,relative=2] -c4\< c\ff\> c c\! +@lilypond[verbatim,quote] +\relative { c''4\< c\ff\> c c\! } @end lilypond @@ -431,20 +427,19 @@ Notatiehandleiding: @cindex markup @funindex \markup -@funindex markup Je kunt tekst aan je muziek toevoegen door: -@lilypond[verbatim,quote,relative=2] -c2^"espr" a_"legato" +@lilypond[verbatim,quote,fragment] +c''2^"espr" a'_"legato" @end lilypond Extra formattering kan worden toegevoegd met het @code{\markup}-commando: -@lilypond[verbatim,quote,relative=2] -c2^\markup { \bold espr } -a2_\markup { +@lilypond[verbatim,quote,fragment] +c''2^\markup { \bold espr } +a'2_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } @end lilypond @@ -470,16 +465,14 @@ Notatiehandleiding: @funindex [ @funindex ] @funindex \autoBeamOff -@funindex autoBeamOff @funindex \autoBeamOn -@funindex autoBeamOn Terminologie: @rglos{beam}. Alle @notation{waardestrepen} worden automatisch getekend: -@lilypond[verbatim,quote,relative=2] -a8[ ais] d[ ees r d] c16 b a8 +@lilypond[verbatim,quote] +\relative { a'8[ ais] d[ ees r d] c16 b a8 } @end lilypond Als de automatische waardestrepen je niet bevallen, kun je @@ -496,11 +489,13 @@ zetten voor een bepaald stuk muziek, gebruik je het commando @code{\autoBeamOff} om de automatische waardestrepen uit te zetten en @code{\autoBeamOn} om ze weer aan te zetten. -@lilypond[verbatim,quote,relative=2] -\autoBeamOff -a8 c b4 d8. c16 b4 | -\autoBeamOn -a8 c b4 d8. c16 b4 | +@lilypond[verbatim,quote] +\relative { + \autoBeamOff + a'8 c b4 d8. c16 b4 | + \autoBeamOn + a8 c b4 d8. c16 b4 | +} @end lilypond @@ -521,7 +516,6 @@ Notatiehandleiding: @cindex onvolledige maat @funindex \partial -@funindex partial Terminologie: @rglos{anacrusis}. @@ -530,9 +524,11 @@ sleutelwoord @code{\partial}. Het wordt gevolgd door een nootlengte: @code{\partial 4} is een opmaat van een kwart en @code{\partial 8} een achtste. -@lilypond[verbatim,quote,relative=2] -\partial 8 f8 | -c2 d | +@lilypond[verbatim,quote] +\relative { + \partial 8 f''8 | + c2 d | +} @end lilypond @c Note bene: duolen, triolen, kwartolen etc. worden anti-metrische @@ -544,7 +540,6 @@ c2 d | @cindex triolen @funindex \times -@funindex times Terminologie: @rglos{note value}, @rglos{triplet}. @@ -555,11 +550,13 @@ stuk muziek wordt vermenigvuldigd met de fractie. Een triol maakt dat de noten 2/3 van hun lengte duren, dus een @notation{triool} heeft als fractie 2/3 -@lilypond[verbatim,quote,relative=2] -\tuplet 3/2 { f8 g a } -\tuplet 3/2 { c8 r c } -\tuplet 3/2 { f,8 g16[ a g a] } -\tuplet 3/2 { d4 a8 } +@lilypond[verbatim,quote] +\relative { + \tuplet 3/2 { f''8 g a } + \tuplet 3/2 { c8 r c } + \tuplet 3/2 { f,8 g16[ a g a] } + \tuplet 3/2 { d4 a8 } +} @end lilypond @subheading Versieringen @@ -571,9 +568,7 @@ maakt dat de noten 2/3 van hun lengte duren, dus een @cindex appoggiatura @funindex \grace -@funindex grace @funindex \acciaccatura -@funindex acciaccatura @funindex \appoggiatura @funindex acciaccatura @@ -585,10 +580,12 @@ commando, hoewel ze ook gemaakt kunenn worden door een het sleutelwoord @code{\appoggiatura} of @code{\acciaccatura} voor een muziekuitdrukking te zetten -@lilypond[verbatim,quote,relative=2] -c2 \grace { a32 b } c2 | -c2 \appoggiatura b16 c2 | -c2 \acciaccatura b16 c2 | +@lilypond[verbatim,quote] +\relative { + c''2 \grace { a32 b } c2 | + c2 \appoggiatura b16 c2 | + c2 \acciaccatura b16 c2 | +} @end lilypond @@ -634,7 +631,8 @@ In LilyPond-invoerbestanden wordt muziek gerepresenteerd door @emph{muziekuitdrukkingen}. Een enkele noot is een muziekuitdrukking: -@lilypond[verbatim,quote,relative=2] a4 +@lilypond[verbatim,quote,fragment] +a'4 @end lilypond Een noot tussen accolades zetten maakt er een @@ -642,8 +640,8 @@ Een noot tussen accolades zetten maakt er een een samengestelde muziekuitdrukking gemaakt die twee noten bevat: -@lilypond[verbatim,quote,relative=2] -{ a4 g4 } +@lilypond[verbatim,quote] +\relative { a'4 g4 } @end lilypond Een groep muziekuitdrukkingen (bijv. noten) tussen accolades @@ -651,8 +649,8 @@ zetten betekent dat ze een sequentie zijn (d.w.z. de ene volgt op de vorige). Het resultaat is een nieuwe muziekuitdrukking: -@lilypond[verbatim,quote,relative=2] -{ { a4 g } f4 g } +@lilypond[verbatim,quote] +\relative { { a'4 g } f4 g } @end lilypond @subheading Analogie: wiskundige uitdrukkingen @@ -716,13 +714,11 @@ sequenties (die allemaal enkele noten bevatten) simultaan samengesteld: @lilypond[verbatim,quote] -\relative c'' { - << - { a2 g } - { f2 e } - { d2 b } - >> -} +<< + \relative { a'2 g } + \relative { f'2 e } + \relative { d'2 b } +>> @end lilypond Merk op dat we elk niveau van de invoer met een ander aantal @@ -747,8 +743,8 @@ maar omdat het begint met een enkele noot wordt het genoteerd op een enkele notenbalk. @lilypond[verbatim,quote] -\relative c'' { - c2 <> | +\relative { + c''2 <> | << { e2 f } { c2 <> } >> | } @end lilypond @@ -764,10 +760,8 @@ genoteerd op een enkele notenbalk. @cindex notatiecontext @funindex \new Staff -@funindex new Staff @funindex Staff @funindex \new -@funindex new @funindex Score @funindex Voice @funindex Lyrics @@ -787,12 +781,10 @@ muziek dat een op een notebalk hoort gemarkeerd door er met @code{<<} en @code{>>}: @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond Het commando @code{\new} opent een @q{notatiecontext.} Een @@ -822,12 +814,10 @@ instrumenten veel meer voorkomen dan polyritmische partituren. @lilypond[verbatim,quote] -\relative c'' { - << - \new Staff { \clef "treble" \key d \major \time 3/4 c4 } - \new Staff { \clef "bass" c,,4 } - >> -} +<< + \new Staff { \clef "treble" \key d \major \time 3/4 c''4 } + \new Staff { \clef "bass" c4 } +>> @end lilypond @@ -870,9 +860,9 @@ uitdrukking in een @code{PianoStaff} gestopt: Hier is een voorbeeldje: @lilypond[verbatim,quote] -\relative c'' { +\relative { \new PianoStaff << - \new Staff { \time 2/4 c4 e | g g, | } + \new Staff { \time 2/4 c''4 e | g g, | } \new Staff { \clef bass c,,4 c' | e c | } >> } @@ -915,8 +905,8 @@ zetten. Merk op dat alle noten in een accoord dezelfde lengte moeten hebben, en dat die lengte na de afsluitende haak komt. -@lilypond[verbatim,quote,relative=2] -r4 2 +@lilypond[verbatim,quote] +\relative { r4 2 } @end lilypond Beschouw accoorden als vrijwel identiek aan enkele noten: @@ -989,7 +979,6 @@ liedjes. @cindex liedjes @funindex \addlyrics -@funindex addlyrics Terminologie: @rglos{lyrics}. @@ -997,10 +986,10 @@ Hier is het begin van de melodie van een slaapliedje, @notation{Girls and boys come out to play}: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } @end lilypond @@ -1012,10 +1001,10 @@ een spatie. @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } \addlyrics { Girls and boys come | out to play, @@ -1054,10 +1043,10 @@ doth shine as bright as day}. Laten we die ook invoeren: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c b a | d4 b8 g4. | } \addlyrics { @@ -1092,10 +1081,10 @@ legatoboog over de noten te zetten, voor details, zie @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c( b) a | d4 b8 g4. | } \addlyrics { @@ -1115,10 +1104,10 @@ waardestrepen te overschrijven, voor details, see @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c([ b]) a | d4 b8 g4. | } \addlyrics { @@ -1135,10 +1124,10 @@ worden opgenomen in de melisma: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 g8 | + d''4 b8 c4 a8 | d4 b8 g4 g8 | a4 b8 c[ b] a | d4 b8 g4. | } \addlyrics { @@ -1158,10 +1147,10 @@ Lament}, van Purcells @notation{Dido and Æneas}: @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key g \minor \time 3/2 - g2 a bes | bes2( a) b2 | + g'2 a bes | bes2( a) b2 | c4.( bes8 a4. g8 fis4.) g8 | fis1 } \addlyrics { @@ -1185,11 +1174,11 @@ noten. notes. @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \key g \major \time 3/4 \partial 4 - d4 | g4 g a8( b) | g4 g b8( c) | + d'4 | g4 g a8( b) | g4 g b8( c) | d4 d e | c2 } \addlyrics { @@ -1213,11 +1202,11 @@ in Figaro's aria @notation{Largo al factotum}: @c but the example is long enough to avoid looking strange. @lilypond[verbatim,quote,noragged-right] << - \relative c' { + \relative { \clef "bass" \key c \major \time 6/8 - c4.~ c8 d b | c8([ d]) b c d b | c8 + c'4.~ 8 d b | c8([ d]) b c d b | c8 } \addlyrics { Lar -- go_al fac -- | to -- tum del -- la cit -- | tà @@ -1245,20 +1234,20 @@ notenbalk. Hier is een voorbeeld uit Handels @lilypond[verbatim,quote] << - \relative c'' { + \relative { \key f \major \time 6/8 \partial 8 - c8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ c4 + c''8 | c8([ bes]) a a([ g]) f | f'4. b, | c4.~ 4 } \addlyrics { Let | flee -- cy flocks the | hills a -- | dorn, __ } - \relative c' { + \relative { \key f \major \time 6/8 \partial 8 - r8 | r4. r4 c8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 + r8 | r4. r4 c'8 | a'8([ g]) f f([ e]) d | e8([ d]) c bes'4 } \addlyrics { Let | flee -- cy flocks the | hills a -- dorn, @@ -1332,13 +1321,13 @@ LilyPond-commando). @c KEEP LY @lilypond[verbatim,quote] viool = \new Staff { - \relative c'' { - a4 b c b + \relative { + a'4 b c b } } cello = \new Staff { - \relative c { + \relative { \clef "bass" e2 d } @@ -1406,7 +1395,6 @@ gebruik van de bovenstaande variabelen: @cindex titelblok @funindex \header -@funindex header De titel, componist, opusnummer, en soortgelijke informatie worden ingevoerd in het @code{\header}-blok. Deze bevindt @@ -1497,10 +1485,10 @@ van fouten. met @code{\relative} is bovenstaand voorbeeld een stuk leesbaarder en ook eenvoudiger in te voeren: @lilypond[verbatim,quote] -\relative c'' { +\relative { \key a \major \time 6/8 - cis8. d16 cis8 e4 e8 | + cis''8. d16 cis8 e4 e8 | b8. cis16 b8 d4 d8 | } @end lilypond diff --git a/Documentation/nl/learning/fundamental.itely b/Documentation/nl/learning/fundamental.itely index c68c506cf2..8d5e90aea4 100644 --- a/Documentation/nl/learning/fundamental.itely +++ b/Documentation/nl/learning/fundamental.itely @@ -12,7 +12,7 @@ @c Translation checker: @c Translation checker committish: -@c \version "2.17.29" +@c \version "2.19.22" @node Fundamentele concepten @translationof Fundamental concepts @@ -91,8 +91,8 @@ als je het eenvoudige invoer geeft. LilyPond behandelt invoer zoals dit: @example -\relative c'' @{ - c4 a d c +\relative @{ + c''4 a d c @} @end example @@ -104,8 +104,8 @@ als een afkorting voor dit: \score @{ \new Staff @{ \new Voice @{ - \relative c'' @{ - c4 a b c + \relative @{ + c''4 a b c @} @} @} @@ -173,9 +173,7 @@ allerlei andere dingen bevatten, zoals @funindex \header @funindex kop @funindex \layout -@funindex layout @funindex \midi -@funindex midi @cindex kop @cindex opmaak @cindex midi @@ -246,8 +244,8 @@ variabelen, zoals getoond in @ref{Stukken organiseren met variabelen}. Alle sjablonen gebruiken dat: @example -melodie = \relative c' @{ - c4 a b c +melodie = \relative @{ + c'4 a b c @} \score @{ @@ -278,7 +276,6 @@ Voor een volledige definitie van het invoerformaat, zie @subsection Score is a (single) compound musical expression @funindex \score -@funindex score @cindex score @cindex contents of a score block @cindex score block, contents of @@ -367,8 +364,8 @@ At this stage, we could start filling in notes. Inside the curly braces next to @code{\new Voice = "vocal"}, we could start writing @example -\relative c'' @{ - r4 d8\noBeam g, c4 r +\relative @{ + r4 d''8\noBeam g, c4 r @} @end example @@ -386,10 +383,10 @@ So, adding a few notes and a bass clef for the left hand, we now have a piece of real music: @lilypond[verbatim,quote,ragged-right] -melody = \relative c'' { r4 d8\noBeam g, c4 r } +melody = \relative { r4 d''8\noBeam g, c4 r } text = \lyricmode { And God said, } -upper = \relative c'' { 2~ } -lower = \relative c { b2 e } +upper = \relative { 2~ } +lower = \relative { b,2 e } \score { << @@ -435,8 +432,8 @@ duration of three notes: @lilypond[verbatim,quote,ragged-right] \new Staff { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -462,8 +459,8 @@ as follows: @lilypond[verbatim,quote,ragged-right] \new Staff = "main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -545,8 +542,8 @@ So, for example, a phrasing slur can start before a manually inserted beam and end before the end of the beam -- not very musical, perhaps, but possible: -@lilypond[quote,verbatim,ragged-right,relative=2] -g8\( a b[ c b\) a] g4 +@lilypond[quote,verbatim,ragged-right] +\relative { g'8\( a b[ c b\) a] g4 } @end lilypond In general, different kinds of brackets, bracket-like constructs, @@ -556,11 +553,13 @@ a slur extending into a tuplet (line 2), a beam and a slur extending into a tuplet, a tie crossing two tuplets, and a phrasing slur extending out of a tuplet (lines 3 and 4). -@lilypond[quote,verbatim,ragged-right,relative=1] -r16[ g \tuplet 3/2 { r16 e'8] } -g,16( a \tuplet 3/2 { b16 d) e } -g,8[( a \tuplet 3/2 { b8 d) e~] } | -\tuplet 5/4 { e32\( a, b d e } a4.\) +@lilypond[quote,verbatim,ragged-right] +\relative { + r16[ g' \tuplet 3/2 { r16 e'8] } + g,16( a \tuplet 3/2 { b16 d) e } + g,8[( a \tuplet 3/2 { b8 d) e~] } | + \tuplet 5/4 { e32\( a, b d e } a4.\) +} @end lilypond @@ -612,9 +611,11 @@ A single voice can contain many notes in a chord, of course, so when exactly are multiple voices needed? Look first at this example of four chords: -@lilypond[quote,verbatim,ragged-right,relative=1] -\key g \major -4 +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + 4 +} @end lilypond This can be expressed using just the single angle bracket chord @@ -647,22 +648,26 @@ of polyphony. Here's how we split the chords above into two voices and add both the passing note and a slur: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key g \major -% Voice "1" Voice "2" -<< { g4 fis8( g) a4 g } \\ { d4 d d d } >> +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + % Voice = "1" Voice = "2" + << { g'4 fis8( g) a4 g } \\ { d4 d d d } >> +} @end lilypond Notice how the stems of the second voice now point down. Here's another simple example: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key d \minor -% Voice "1" Voice "2" -<< { r4 g g4. a8 } \\ { d,2 d4 g } >> | -<< { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> | -<< { a2. r4 } \\ { fis2. s4 } >> | +@lilypond[quote,verbatim,ragged-right] +\relative { + \key d \minor + % Voice = "1" Voice = "2" + << { r4 g' g4. a8 } \\ { d,2 d4 g } >> | + << { bes4 bes c bes } \\ { g4 g g8( a) g4 } >> | + << { a2. r4 } \\ { fis2. s4 } >> | +} @end lilypond It is not necessary to use a separate @code{<< \\ >>} construct @@ -671,19 +676,20 @@ can help the legibility of the code, but if there are many notes in each bar it may be better to split out each voice separately, like this: -@lilypond[quote,verbatim,ragged-right,relative=2] -\key d \minor -<< { - % Voice "1" - r4 g g4. a8 | - bes4 bes c bes | - a2. r4 | -} \\ { - % Voice "2" - d,2 d4 g | - g4 g g8( a) g4 | - fis2. s4 | -} >> +@lilypond[quote,verbatim,ragged-right] +<< + \key d \minor + \relative { % Voice = "1" + r4 g' g4. a8 | + bes4 bes c bes | + a2. r4 | + } \\ + \relative { % Voice = "2" + d'2 d4 g | + g4 g g8( a) g4 | + fis2. s4 | + } +>> @end lilypond @@ -704,12 +710,12 @@ voice in context @code{"1"} and the lowest voice in context of slurs, stems, ties, dynamics etc., is set appropriately. @lilypond[quote,verbatim] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f - % Voice "1" Voice "2" Voice "3" + c'16 d e f + % Voice = "1" Voice = "2" Voice = "3" << { g4 f e } \\ { r8 e4 d c8~ } >> | - << { d2 e } \\ { c8 b16 a b8 g~ g2 } \\ { s4 b c2 } >> | + << { d2 e } \\ { c8 b16 a b8 g~ 2 } \\ { s4 b c2 } >> | } @end lilypond @@ -728,9 +734,9 @@ split across the same voices in two constructs, shown here in the blue triangle voice. @lilypond[quote,verbatim] -\new Staff \relative c' { +\new Staff \relative { % Main voice - c16 d e f + c'16 d e f << % Bar 1 { \voiceOneStyle @@ -747,7 +753,7 @@ blue triangle voice. { d2 e } \\ % Voice 2 continues - { c8 b16 a b8 g~ g2 } + { c8 b16 a b8 g~ 2 } \\ { \voiceThreeStyle @@ -820,10 +826,10 @@ later sections. @c The following should appear as music without code @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << % Voice one - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ % Voice two { % Ignore these for now - they are explained in Ch 4 @@ -867,12 +873,12 @@ not understand. @c The following should appear as music without code @c The three voice styles should be defined in -init @lilypond[quote,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << { % Voice one \voiceOneStyle - c2 aes4. bes8 + c''2 aes4. bes8 } \\ % Voice two { \voiceTwoStyle @@ -900,10 +906,10 @@ we have learnt, using the @code{<< \\ >>} construct to enter the music of the first bar in three voices: @lilypond[quote,verbatim,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } + { c''2 aes4. bes8 } \\ { 2 des } \\ { aes'2 f4 fes } >> | 1 | } @@ -923,10 +929,10 @@ and placing the music in voice four. This is done by simply adding another pair of @code{\\}. @lilypond[quote,verbatim,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << % Voice one - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ % Voice two { 2 des } \\ % Omit Voice three @@ -961,15 +967,10 @@ Notation Reference: @ruser{Multiple voices}. @subsection Explicitly instantiating voices @funindex \voiceOne -@funindex voiceOne @funindex \voiceTwo -@funindex voiceTwo @funindex \voiceThree -@funindex voiceThree @funindex \voiceFour -@funindex voiceFour @funindex \oneVoice -@funindex oneVoice @funindex \new Voice @cindex voice contexts, creating @@ -985,8 +986,8 @@ the previous section: @example \new Staff @{ - \relative c' @{ - << @{ e4 f g a @} \\ @{ c,4 d e f @} >> + \relative @{ + << @{ e'4 f g a @} \\ @{ c,4 d e f @} >> @} @} @end example @@ -996,8 +997,8 @@ is equivalent to @example \new Staff << - \new Voice = "1" @{ \voiceOne \relative c' @{ e4 f g a @} @} - \new Voice = "2" @{ \voiceTwo \relative c' @{ c4 d e f @} @} + \new Voice = "1" @{ \voiceOne \relative @{ e'4 f g a @} @} + \new Voice = "2" @{ \voiceTwo \relative @{ c'4 d e f @} @} >> @end example @@ -1006,8 +1007,8 @@ Both of the above would produce @c The following example should not display the code @lilypond[ragged-right,quote] \new Staff << - \new Voice = "1" { \voiceOne \relative c' { e4 f g a } } - \new Voice = "2" { \voiceTwo \relative c' { c4 d e f } } + \new Voice = "1" { \voiceOne \relative { e'4 f g a } } + \new Voice = "2" { \voiceTwo \relative { c'4 d e f } } >> @end lilypond @@ -1028,27 +1029,27 @@ Let us see in some simple examples exactly what effect markup, ties, slurs, and dynamics: @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { % Default behavior or behavior after \oneVoice - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceOne - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \voiceTwo - c4 d8~ d e4( f | g4 a) b-> c | + c'4 d8~ 8 e4( f | g4 a) b-> c | \oneVoice - c,4 d8~ d e4( f | g4 a) b-> c | + c,4 d8~ 8 e4( f | g4 a) b-> c | } @end lilypond @@ -1064,10 +1065,10 @@ notes demonstrate that the main melody is now in a single voice context, permitting a phrasing slur to be drawn over them. @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { +\new Staff \relative { \voiceOneStyle % This section is homophonic - c16^( d e f + c'16^( d e f % Start simultaneous section of three voices << % Continue the main voice in parallel @@ -1076,7 +1077,7 @@ permitting a phrasing slur to be drawn over them. \new Voice { % Set stems, etc., down \voiceTwo - r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1099,15 +1100,15 @@ voice appears only briefly this might be a more natural way to typeset the music: @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' { - c16^( d e f +\new Staff \relative { + c'16^( d e f << { g4 f e | d2 e) | } \new Voice { \voiceTwo r8 e4 d c8~ | << - { c8 b16 a b8 g~ g2 | } + { c8 b16 a b8 g~ 2 | } \new Voice { \voiceThree s4 b c2 | @@ -1128,17 +1129,17 @@ spacing notes to step over sections where the voice is silent, as here: @lilypond[quote,ragged-right,verbatim] -\new Staff \relative c' << +\new Staff \relative << % Initiate first voice \new Voice { \voiceOne - c16^( d e f g4 f e | d2 e) | + c'16^( d e f g4 f e | d2 e) | } % Initiate second voice \new Voice { % Set stems, etc, down \voiceTwo - s4 r8 e4 d c8~ | c8 b16 a b8 g~ g2 | + s4 r8 e4 d c8~ | 8 b16 a b8 g~ 2 | } % Initiate third voice \new Voice { @@ -1156,13 +1157,9 @@ as here: @cindex collisions, notes @cindex shift commands @funindex \shiftOff -@funindex shiftOff @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn Closely spaced notes in a chord, or notes occurring at the same time in different voices, are arranged in two, occasionally more, @@ -1208,7 +1205,6 @@ expressions -- notes and lyrics. @funindex \new Lyrics @funindex \lyricsto -@funindex lyricsto @funindex Lyrics @cindex Lyrics context, creating @cindex lyrics, linking to voice @@ -1224,10 +1220,10 @@ name assigned to the Voice. @lilypond[quote,verbatim] << \new Voice = "one" { - \relative c'' { + \relative { \autoBeamOff \time 2/4 - c4 b8. a16 | g4. f8 | e4 d | c2 | + c''4 b8. a16 | g4. f8 | e4 d | c2 | } } \new Lyrics \lyricsto "one" { @@ -1244,7 +1240,6 @@ explicitly. @cindex lyrics and beaming @cindex beaming and lyrics @funindex \autoBeamOff -@funindex autoBeamOff The automatic beaming which LilyPond uses by default works well for instrumental music, but not so well for music with lyrics, @@ -1255,7 +1250,6 @@ melismata in the lyrics. In the example above we use the command @funindex \new ChoirStaff @funindex ChoirStaff @funindex \lyricmode -@funindex lyricmode @cindex vocal score structure @cindex choir staff @@ -1270,14 +1264,14 @@ rather than music. @lilypond[quote,verbatim] global = { \key f \major \time 6/8 \partial 8 } -SopOneMusic = \relative c'' { - c8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ c4 +SopOneMusic = \relative { + c''8 | c8([ bes)] a a([ g)] f | f'4. b, | c4.~ 4 } SopOneLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, __ } -SopTwoMusic = \relative c' { - r8 | r4. r4 c8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' +SopTwoMusic = \relative { + r8 | r4. r4 c'8 | a'8([ g)] f f([ e)] d | e8([ d)] c bes' } SopTwoLyrics = \lyricmode { Let | flee -- cy flocks the | hills a -- dorn, @@ -1329,10 +1323,10 @@ examples this is often called @q{global}. @lilypond[quote,verbatim] keyTime = { \key c \major \time 4/4 \partial 4 } -SopMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyricmode { E -- | ter -- nal fa -- ther, | strong to save, } @@ -1395,8 +1389,8 @@ appear explicitly in the input file must be added to the output. For example, compare the input and output of the following example: -@lilypond[quote,verbatim,relative=2] -cis4 cis2. | a4 a2. | +@lilypond[quote,verbatim] +\relative { cis''4 cis2. | a4 a2. | } @end lilypond The input is rather sparse, but in the output, bar lines, @@ -1463,7 +1457,6 @@ Notation Reference: @ruser{Contexts explained}. @subsection Creating contexts @funindex \new -@funindex new @cindex new contexts @cindex creating contexts @cindex contexts, creating @@ -1508,8 +1501,8 @@ annotated real-music example: \clef "treble" \key g \minor \new Voice { % create voice for RH notes - \relative c'' { % start of RH notes - d4 ees16 c8. | + \relative { % start of RH notes + d''4 ees16 c8. | d4 ees16 c8. | } % end of RH notes } % end of RH voice @@ -1519,14 +1512,14 @@ annotated real-music example: \key g \minor \new Voice { % create LH voice one \voiceOne - \relative g { % start of LH voice one notes + \relative { % start of LH voice one notes g8 ees, | g8 ees, | } % end of LH voice one notes } % end of LH voice one \new Voice { % create LH voice two \voiceTwo - \relative g { % start of LH voice two notes + \relative { % start of LH voice two notes g4 ees | g4 ees | } % end of LH voice two notes @@ -1665,9 +1658,7 @@ Internals reference: @rinternals{Engravers and Performers}. @cindex context properties, modifying @cindex modifying context properties @funindex \set -@funindex set @funindex \unset -@funindex unset Contexts are responsible for holding the values of a number of context @emph{properties}. Many of them can be changed to @@ -1746,13 +1737,13 @@ because we omitted the context name. @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { + \new Staff \relative { \set Staff.instrumentName = #"Soprano" - c2 c + c''2 c } - \new Staff \relative c' { + \new Staff \relative { \set instrumentName = #"Alto" % Wrong! - d2 d + d'2 d } >> @end lilypond @@ -1791,12 +1782,12 @@ So this turns off extra naturals in one staff: @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - aeses2 aes + \new Staff \relative { + aeses'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Staff.extraNatural = ##f - aeses2 aes + aeses'2 aes } >> @end lilypond @@ -1806,12 +1797,12 @@ and this turns them off in all staves: @lilypond[quote,verbatim,ragged-right] << - \new Staff \relative c'' { - aeses2 aes + \new Staff \relative { + aeses'2 aes } - \new Staff \relative c'' { + \new Staff \relative { \set Score.extraNatural = ##f - aeses2 aes + aeses'2 aes } >> @end lilypond @@ -1835,17 +1826,19 @@ font size, which affects the size of the note heads (among other things) several times. The change is from the default value, not the most recently set value. -@lilypond[quote,verbatim,ragged-right,relative=1] -c4 d -% make note heads smaller -\set fontSize = #-4 -e4 f | -% make note heads larger -\set fontSize = #2.5 -g4 a -% return to default size -\unset fontSize -b4 c | +@lilypond[quote,verbatim,ragged-right] +\relative { + c'4 d + % make note heads smaller + \set fontSize = #-4 + e4 f | + % make note heads larger + \set fontSize = #2.5 + g4 a + % return to default size + \unset fontSize + b4 c | +} @end lilypond We have now seen how to set the values of several different types of @@ -1859,7 +1852,6 @@ general way by using the very powerful @code{\markup} command. @subsubheading Setting context properties with @code{\with} @funindex \with -@funindex with @cindex context properties, setting with \with The default value of context properties may be set at the time the @@ -1881,13 +1873,13 @@ like this: @lilypond[quote,verbatim,ragged-right] << \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } \new Staff \with { extraNatural = ##f } { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } >> @@ -1908,7 +1900,6 @@ with @code{\set}, this new default value may be restored with the @cindex context properties, setting with \context @funindex \context -@funindex context The values of context properties may be set in @emph{all} contexts of a particular type, such as all @code{Staff} contexts, with a single @@ -1924,8 +1915,8 @@ throughout the @code{\score} or @code{\book} block in which the @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - cisis4 e d cis + \relative { + cisis''4 e d cis } } \layout { @@ -1944,13 +1935,13 @@ within the score: \score { << \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } \new Staff { - \relative c'' { - gisis4 gis aeses aes + \relative { + gisis'4 gis aeses aes } } >> @@ -1987,9 +1978,7 @@ Internals Reference: @cindex removing engravers @funindex \consists -@funindex consists @funindex \remove -@funindex remove We have seen that contexts each contain several engravers, each of which is responsible for producing a particular part of the @@ -2012,8 +2001,8 @@ produced by the @code{Staff_symbol_engraver}. \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c' { - c4 d +\relative { + c'4 d \set fontSize = #-4 % make note heads smaller e4 f | \set fontSize = #2.5 % make note heads larger @@ -2043,15 +2032,15 @@ range from that voice only: \new Voice \with { \consists "Ambitus_engraver" } { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @@ -2068,15 +2057,15 @@ the notes in all the voices on that staff: } << \new Voice { - \relative c'' { + \relative { \voiceOne - c4 a b g + c''4 a b g } } \new Voice { - \relative c' { + \relative { \voiceTwo - c4 e d f + c'4 e d f } } >> @@ -2085,7 +2074,6 @@ the notes in all the voices on that staff: @subsubheading Changing all contexts of the same type @funindex \layout -@funindex layout The examples above show how to remove or add engravers to individual contexts. It is also possible to remove or add @@ -2098,24 +2086,24 @@ staff in a four-staff score, we could write \score { << \new Staff { - \relative c'' { - c4 a b g + \relative { + c''4 a b g } } \new Staff { - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "G_8" - \relative c' { - c4 a b g + \relative { + c'4 a b g } } \new Staff { \clef "bass" - \relative c { + \relative { c4 a b g } } @@ -2177,7 +2165,7 @@ soprano and cello. In this case, we would start with the @example \version @w{"@version{}"} -melody = \relative c' @{ +melody = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2206,7 +2194,7 @@ Now we want to add a cello part. Let's look at the @q{Notes only} example: @example \version @w{"@version{}"} -melody = \relative c' @{ +melody = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2244,7 +2232,7 @@ different notes. @example \version @w{"@version{}"} -sopranoMusic = \relative c' @{ +sopranoMusic = \relative @{ \clef "treble" \key c \major \time 4/4 @@ -2255,7 +2243,7 @@ sopranoLyrics = \lyricmode @{ Aaa Bee Cee Dee @} -celloMusic = \relative c @{ +celloMusic = \relative @{ \clef "bass" \key c \major \time 4/4 @@ -2312,7 +2300,7 @@ This looks a bit messy; the indentation is messed up now. That is easily fixed. Here's the complete soprano and cello template. @lilypond[quote,verbatim,ragged-right,addversion] -sopranoMusic = \relative c' { +sopranoMusic = \relative { \clef "treble" \key c \major \time 4/4 @@ -2323,7 +2311,7 @@ sopranoLyrics = \lyricmode { Aaa Bee Cee Dee } -celloMusic = \relative c { +celloMusic = \relative { \clef "bass" \key c \major \time 4/4 @@ -2369,44 +2357,44 @@ from Handel's Messiah: @lilypond[quote,ragged-right] global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis e2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis e2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4 2 4 | + r4 2 4 | 4. 8 2 | 4 2 | } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 | + 4 2 4 | 4. 8 2 | 4 2 | } @@ -2600,39 +2588,39 @@ for the three bars of the example above gives: @lilypond[quote,verbatim,ragged-right,addversion] global = { \key d \major \time 4/4 } -sopranoMusic = \relative c'' { +sopranoMusic = \relative { \clef "treble" - r4 d2 a4 | d4. d8 a2 | cis4 d cis2 | + r4 d''2 a4 | d4. d8 a2 | cis4 d cis2 | } sopranoWords = \lyricmode { Wor -- thy | is the lamb | that was slain | } -altoMusic = \relative a' { +altoMusic = \relative { \clef "treble" - r4 a2 a4 | fis4. fis8 a2 | g4 fis fis2 | + r4 a'2 a4 | fis4. fis8 a2 | g4 fis fis2 | } altoWords = \sopranoWords -tenorMusic = \relative c' { +tenorMusic = \relative { \clef "G_8" - r4 fis2 e4 | d4. d8 d2 | e4 a, cis2 | + r4 fis'2 e4 | d4. d8 d2 | e4 a, cis2 | } tenorWords = \sopranoWords -bassMusic = \relative c' { +bassMusic = \relative { \clef "bass" - r4 d2 cis4 | b4. b8 fis2 | e4 d a'2 | + r4 d'2 cis4 | b4. b8 fis2 | e4 d a'2 | } bassWords = \sopranoWords -upper = \relative a' { +upper = \relative { \clef "treble" \global - r4 2 4 | + r4 2 4 | 4. 8 2 | 4 2 | } -lower = \relative c, { +lower = \relative { \clef "bass" \global - 4 2 4 | + 4 2 4 | 4. 8 2 | 4 2 | } @@ -2931,20 +2919,20 @@ is to add the music, and combine all the parts together. composer = "J S Bach" } keyTime = { \key c \minor \time 4/4 } -ManualOneVoiceOneMusic = \relative g' { - g4 g f ees | +ManualOneVoiceOneMusic = \relative { + g'4 g f ees | d2 c | } -ManualOneVoiceTwoMusic = \relative c' { - ees16 d ees8~ ees16 f ees d c8 d~ d c~ | - c8 c4 b8 c8. g16 c b c d | +ManualOneVoiceTwoMusic = \relative { + ees'16 d ees8~ 16 f ees d c8 d~ d c~ | + 8 c4 b8 c8. g16 c b c d | } -ManualTwoMusic = \relative c' { - c16 b c8~ c16 b c g a8 g~ g16 g aes ees | - f16 ees f d g aes g f ees d ees8~ ees16 f ees d | +ManualTwoMusic = \relative { + c'16 b c8~ 16 b c g a8 g~ 16 g aes ees | + f16 ees f d g aes g f ees d ees8~ 16 f ees d | } -PedalOrganMusic = \relative c { - r8 c16 d ees d ees8~ ees16 a, b g c b c8 | +PedalOrganMusic = \relative { + r8 c16 d ees d ees8~ 16 a, b g c b c8 | r16 g ees f g f g8 c,2 | } @@ -2997,7 +2985,7 @@ Music Glossary: By this point, you've seen this kind of thing: @lilypond[quote,verbatim,ragged-right] -hornNotes = \relative c'' { c4 b dis c } +hornNotes = \relative { c''4 b dis c } \score { { @@ -3009,8 +2997,8 @@ hornNotes = \relative c'' { c4 b dis c } You may even realize that this could be useful in minimalist music: @lilypond[quote,verbatim,ragged-right] -fragmentA = \relative c'' { a4 a8. b16 } -fragmentB = \relative c'' { a8. gis16 ees4 } +fragmentA = \relative { a'4 a8. b16 } +fragmentB = \relative { a'8. gis16 ees4 } violin = \new Staff { \fragmentA \fragmentA | @@ -3036,9 +3024,9 @@ fthenp =_\markup { \dynamic f \italic \small { 2nd } \hspace #0.1 \dynamic p } -violin = \relative c'' { +violin = \relative { \repeat volta 2 { - c4._\dolce b8 a8 g a b | + c''4._\dolce b8 a8 g a b | \padText c4.^"hi there!" d8 e' f g d | c,4.\fthenp b8 c4 c-. | @@ -3061,9 +3049,9 @@ variables. It's a lot harder to read, especially the last line. @example -violin = \relative c'' @{ +violin = \relative @{ \repeat volta 2 @{ - c4._\markup @{ \italic \bold dolce @} b8 a8 g a b | + c''4._\markup @{ \italic \bold dolce @} b8 a8 g a b | \once \override TextScript.padding = #5.0 c4.^"hi there!" d8 e' f g d | c,4.\markup @{ @@ -3088,14 +3076,14 @@ can think of these as functions). @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function - (parser location padding) + (padding) (number?) #{ \once \override TextScript.padding = #padding #}) -\relative c''' { - c4^"piu mosso" b a b | +\relative { + c'''4^"piu mosso" b a b | \padText #1.8 c4^"piu mosso" d e f | \padText #2.6 @@ -3126,7 +3114,7 @@ suppose that the file @file{horn-music.ly} contains the following part of a horn/@/bassoon duo @example -hornNotes = \relative c @{ +hornNotes = \relative @{ \time 2/4 r4 f8 a | cis4 f | e4 d | @} @@ -3163,7 +3151,7 @@ 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 { +\transpose f c' \relative { \time 2/4 r4 f8 a | cis4 f | e4 d | } @@ -3194,7 +3182,7 @@ This command sets the property @code{skipBars} in the this option to the music above, leads to the following result @lilypond[quote,ragged-right] -\transpose f c' \relative c { +\transpose f c' \relative { \time 2/4 \set Score.skipBars = ##t R2*3 | @@ -3221,7 +3209,7 @@ that the other voice is in @code{bassoonNotes} in the file leading to @lilypond[quote,ragged-right] -\relative c << +\relative << \new Staff { \clef "treble" \time 2/4 diff --git a/Documentation/nl/learning/templates.itely b/Documentation/nl/learning/templates.itely index 7f7d1c93fa..36fcf4ee7f 100644 --- a/Documentation/nl/learning/templates.itely +++ b/Documentation/nl/learning/templates.itely @@ -193,9 +193,8 @@ beautiful printed scores! @node Transcription of mensural music @appendixsubsec Transcription of mensural music -@c Line-width below is because of Issue 766. If that's fixed, it can be removed. -@lilypondfile[verbatim,quote,ragged-right,texidoc,line-width=140] -{ancient-notation-template----modern-transcription-of-mensural-music.ly} +@lilypondfile[verbatim,quote,ragged-right,texidoc] +{incipit.ly} @node Gregorian transcription template @appendixsubsec Gregorian transcription template @@ -214,8 +213,7 @@ beautiful printed scores! @node Jazz combo @appendixsubsec Jazz combo -@c Line-width below is because of Issue 766. If that's fixed, it can be removed. -@lilypondfile[verbatim,quote,ragged-right,texidoc,line-width=140] +@lilypondfile[verbatim,quote,ragged-right,texidoc] {jazz-combo-template.ly} diff --git a/Documentation/nl/learning/tutorial.itely b/Documentation/nl/learning/tutorial.itely index d428ec33fb..8075c98beb 100644 --- a/Documentation/nl/learning/tutorial.itely +++ b/Documentation/nl/learning/tutorial.itely @@ -13,7 +13,7 @@ @include included/generating-output.itexi -@c \version "2.16.0" +@c \version "2.19.21" @node Leerboek @translationof Tutorial @@ -208,7 +208,6 @@ zijn deze automatische waarden heel handig. @cindex relatieve modus, en toevallige tekens @funindex \relative -@funindex relative @funindex ' @funindex , @@ -228,8 +227,8 @@ muziek, een @notation{toonladder}, waarin elke noot precies @lilypond[verbatim,quote] % zet het beginpunt op de centrale C -\relative c' { - c d e f +\relative { + c' d e f g a b c } @end lilypond @@ -244,8 +243,8 @@ steeds uitsluitend gebruikmakend van de @code{\relative} modus: @lilypond[verbatim,quote] -\relative c' { - d f a g +\relative { + d' f a g c b f d } @end lilypond @@ -262,8 +261,8 @@ c'}}}-commando, kunnen we het beginoctaaf veranderen: @lilypond[verbatim,quote] % één octaaf boven de centrale C -\relative c'' { - e c a c +\relative { + e'' c a c } @end lilypond @@ -279,8 +278,8 @@ dan de B, en van een A, G of F wordt aangenomen dat hij lager is. @lilypond[verbatim,quote] -\relative c'' { - b c % c is 1 notenbalk-ruimte omhoog, dus de c hoger +\relative { + b' c % c is 1 notenbalk-ruimte omhoog, dus de c hoger b d % d is 2 omhoog of 5 omlaag, dus de d hoger b e % e is 3 omhoog of 4 omlaag, dus de e hoger b a % a is 6 omhoog of 1 omlaag, dus de a lager @@ -303,8 +302,8 @@ notenaam toe te voegen. We kunnen het octaaf verlagen door een komma @code{,} aan de notenaam toe toe voegen. @lilypond[verbatim,quote] -\relative c'' { - a a, c' f, +\relative { + a' a, c' f, g g'' a,, f' } @end lilypond @@ -342,8 +341,8 @@ gebruikt voor de volgende noot. De lengte van de eerste noot is standaard een kwartnoot. @lilypond[verbatim,quote] -\relative c'' { - a1 +\relative { + a'1 a2 a4 a8 a a16 a a a a32 a a a a64 a a a a a a a a2 } @@ -355,8 +354,8 @@ gepuncteerde noot moet expliciet worden aangegeven (d.w.z., altijd ook met een getal). @lilypond[verbatim,quote] -\relative c'' { - a4 a a4. a8 +\relative { + a'4 a a4. a8 a8. a16 a a8. a8 a4. } @end lilypond @@ -373,8 +372,8 @@ Een @notation{rust} voer je in net zoals een noot met de naam @code{r}@tie{}: @lilypond[verbatim,quote] -\relative c'' { - a4 r r2 +\relative { + a'4 r r2 r8 a r4 r4. r8 } @end lilypond @@ -385,16 +384,15 @@ naam @code{r}@tie{}: @cindex maatsoort @funindex \time -@funindex time Terminologie: @rglos{time signature}. De @notation{maatsoort} kun je aangeven met het @code{\time}-commando: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 - a4 a a + a'4 a a \time 6/8 a4. a \time 4/4 @@ -408,7 +406,6 @@ De @notation{maatsoort} kun je aangeven met het @code{\time}-commando: @cindex metronome marks @funindex \tempo -@funindex tempo Terminologie: @rglos{tempo indication}, @rglos{metronome}. @@ -416,10 +413,10 @@ De @notation{tempo indication} en @notation{metronome mark} worden gezet met het @code{\tempo}-commando: @lilypond[verbatim,quote] -\relative c'' { +\relative { \time 3/4 \tempo "Andante" - a4 a a + a'4 a a \time 6/8 \tempo 4. = 96 a4. a @@ -440,7 +437,6 @@ gezet met het @code{\tempo}-commando: @cindex bas @funindex \clef -@funindex clef Terminologie: @rglos{clef}. @@ -448,9 +444,9 @@ De @notation{sleutel} kun je aangeven met het @code{\clef} commando: @lilypond[verbatim,quote] -\relative c' { +\relative { \clef "treble" - c1 + c'1 \clef "alto" c1 \clef "tenor" @@ -467,12 +463,12 @@ Hier is een klein voorbeeld dat al deze onderdelen samen toont: @lilypond[verbatim,quote] -\relative c, { +\relative { \clef "bass" \time 3/4 \tempo "Andante" 4 = 120 \clef "bass" - c2 e8 c' + c,2 e8 c' g'2. f4 e d c4 c, r @@ -761,8 +757,8 @@ afbeelding: @c no verbatim here @lilypond[quote] -\relative c'' { - c4-\markup { \bold \huge { Klik hier. } } +\relative { + c''4-\markup { \bold \huge { Klik hier. } } } @end lilypond diff --git a/Documentation/nl/learning/tweaks.itely b/Documentation/nl/learning/tweaks.itely index 80881daf55..51bac2fbc2 100644 --- a/Documentation/nl/learning/tweaks.itely +++ b/Documentation/nl/learning/tweaks.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.20" +@c \version "2.19.22" @node Tweaking output @chapter Tweaking output @@ -187,7 +187,6 @@ the types of objects and properties from their names. @cindex override syntax @funindex \override -@funindex override We have already met the commands @code{\set} and @code{\with}, used to change the properties of @strong{contexts} and to remove and add @@ -243,12 +242,14 @@ color of the note head: @cindex color property, example @cindex NoteHead, example of overriding -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a b c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a b c | +} @end lilypond @@ -258,7 +259,6 @@ g4 a b c | @cindex revert command @funindex \revert -@funindex revert Once overridden, the property retains its new value until it is overridden again or a @code{\revert} command is encountered. @@ -279,14 +279,16 @@ of the note head to the default value for the final two notes: @cindex color property, example @cindex NoteHead, example of overriding -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -c4 d -\override NoteHead.color = #red -e4 f | -\override NoteHead.color = #green -g4 a -\revert NoteHead.color -b4 c | +@lilypond[quote,ragged-right,verbatim] +\relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \override NoteHead.color = #green + g4 a + \revert NoteHead.color + b4 c | +} @end lilypond @@ -294,7 +296,6 @@ b4 c | @unnumberedsubsubsec The @code{\once} prefix @funindex \once -@funindex once Both the @code{\override} and the @code{\set} commands may be prefixed by @code{\once}. This causes the following @code{\override} or @@ -324,7 +325,6 @@ b c | @cindex overrideProperty command @funindex \overrideProperty -@funindex overrideProperty There is another form of the override command, @code{\overrideProperty}, which is occasionally required. @@ -339,7 +339,6 @@ We mention it here for completeness, but for details see @cindex tweak command @funindex \tweak -@funindex tweak The final tweaking command which is available is @code{\tweak}. This should be used when several objects occur at the same musical moment, @@ -355,11 +354,13 @@ middle note head (the E) in a C major chord. Let's first see what @cindex font-size property, example @cindex NoteHead, example of overriding -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -\once \override NoteHead.font-size = #-3 -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + \once \override NoteHead.font-size = #-3 + 4 + 4 +} @end lilypond We see the override affects @emph{all} the note heads in the chord. @@ -380,9 +381,11 @@ a chord would be changed in this way: @cindex font-size property, example @cindex @code{\tweak}, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + 4 + 4 +} @end lilypond Note that the syntax of @code{\tweak} is different from that of the @@ -402,8 +405,8 @@ a series of articulations, as shown here: @cindex color property, example @cindex @code{\tweak}, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -a4^"Black" +@lilypond[quote,fragment,ragged-right,verbatim] +a'4^"Black" -\tweak color #red ^"Red" -\tweak color #green _"Green" @end lilypond @@ -423,10 +426,10 @@ directly from the following event. It is still possible to use the layout object, provided that LilyPond can trace its origin back to the original event: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -<\tweak Accidental.color #red cis4 - \tweak Accidental.color #green es - g> +@lilypond[quote,fragment,ragged-right,verbatim] +<\tweak Accidental.color #red cis''4 + \tweak Accidental.color #green es'' + g''> @end lilypond This long form of the @code{\tweak} command can be described as @@ -459,13 +462,15 @@ printed in red on the first short tuplet bracket. @cindex direction property, example @cindex color property, example -@lilypond[quote,ragged-right,verbatim,fragment,relative=2] -\tweak direction #up -\tuplet 3/4 { - \tweak color #red - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \tweak direction #up + \tuplet 3/4 { + \tweak color #red + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -478,15 +483,17 @@ appearance may be modified in the usual way with @cindex transparent property, example @cindex TupletNumber, example of overriding -@lilypond[quote,ragged-right,verbatim,fragment,relative=1] -\tuplet 3/2 { c8[ c c] } -\once \override TupletNumber.text = #tuplet-number::calc-fraction-text -\tuplet 3/2 { - c8[ c] - c8[ c] - \once \override TupletNumber.transparent = ##t - \tuplet 3/2 { c8[ c c] } - \tuplet 3/2 { c8[ c c] } +@lilypond[quote,ragged-right,verbatim] +\relative { + \tuplet 3/2 { c'8[ c c] } + \once \override TupletNumber.text = #tuplet-number::calc-fraction-text + \tuplet 3/2 { + c8[ c] + c8[ c] + \once \override TupletNumber.transparent = ##t + \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c8[ c c] } + } } @end lilypond @@ -545,12 +552,12 @@ music: @c Mozart, Die Zauberflöte Nr.7 Duett -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -630,14 +637,14 @@ close to it.} Let's do that: @cindex Slur example of overriding @cindex thickness property, example -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { + \relative { % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 - r4 bes8 bes[( g]) g | + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -684,7 +691,6 @@ location. @cindex once override @funindex \once -@funindex once As you can see, @emph{all} the slurs are thicker in the final example above. But what if we wanted just the first slur to be thicker? This @@ -699,12 +705,12 @@ repositioned as follows: @cindex Slur, example of overriding @cindex thickness property, example -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes8[( g]) g | @@ -729,7 +735,6 @@ command. @cindex default properties, reverting to @funindex \revert -@funindex revert Finally, what if we wanted just the first two slurs to be heavier? Well, we could use two commands, each preceded by @@ -739,12 +744,12 @@ the slurs begin: @cindex Slur, example of overriding @cindex thickness property, example -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of immediately following slur only \once \override Slur.thickness = #5.0 bes[( g]) g | @@ -767,12 +772,12 @@ after the second slur: @cindex Slur, example of overriding @cindex thickness property, example -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] { \key es \major \time 6/8 - { - r4 bes8 + \relative { + r4 bes'8 % Increase thickness of all following slurs from 1.2 to 5.0 \override Slur.thickness = #5.0 bes[( g]) g | @@ -874,12 +879,12 @@ like so: @cindex LyricText, example of overriding @cindex @code{\addlyrics}, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] { \key es \major \time 6/8 - { - r4 bes8 bes[( g]) g | + \relative { + r4 bes'8 bes[( g]) g | g8[( es]) es d[( f]) as | as8 g } @@ -1044,11 +1049,11 @@ the implied Context, @code{Voice}: @cindex BarLine, example of overriding @cindex stencil property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override BarLine.stencil = ##f - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1069,11 +1074,11 @@ it by adding the correct context: @cindex BarLine, example of overriding @cindex stencil property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.stencil = ##f - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1084,11 +1089,11 @@ property to @code{#f} is such a frequent operation that there is a shorthand for it called @code{\omit}: @funindex \omit -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \omit Staff.BarLine - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1102,9 +1107,9 @@ correct processing. For example, errors will be generated if the @code{point-stencil} function, which sets the stencil to an object with zero size: -@lilypond[quote,verbatim,relative=2] -{ - c4 c +@lilypond[quote,verbatim] +\relative { + c''4 c \once \override NoteHead.stencil = #point-stencil c4 c } @@ -1131,11 +1136,11 @@ required, as always, to precede the value itself in the @cindex BarLine, example of overriding @cindex break-visibility property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.break-visibility = ##(#f #f #f) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1164,11 +1169,11 @@ transparent is: @cindex TimeSignature, example of overriding @cindex transparent property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.TimeSignature.transparent = ##t - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1180,11 +1185,11 @@ frequent operation, so we have a shorthand for it called @code{\hide}: @funindex \hide -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \hide Staff.TimeSignature - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1202,11 +1207,11 @@ instead: @cindex TimeSignature, example of overriding @cindex stencil property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \omit Staff.TimeSignature - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1246,11 +1251,11 @@ we write: @cindex BarLine, example of overriding @cindex color property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #white - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1280,11 +1285,11 @@ converts X11 color symbols into the list of internal values like this: @cindex BarLine, example of overriding @cindex color property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(x11-color 'white) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1311,11 +1316,11 @@ and to white it should be @code{(rgb-color 1 1 1)}: @cindex BarLine, example of overriding @cindex color property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.BarLine.color = #(rgb-color 1 1 1) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1336,8 +1341,8 @@ various shades of grey: @cindex color property, example @cindex x11-color, example of using -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -{ +@lilypond[quote,ragged-right,verbatim] +\relative { \time 12/16 \override Staff.StaffSymbol.color = #(x11-color 'grey30) \override Staff.TimeSignature.color = #(x11-color 'grey60) @@ -1345,7 +1350,7 @@ various shades of grey: \override Voice.NoteHead.color = #(x11-color 'grey85) \override Voice.Stem.color = #(x11-color 'grey85) \override Staff.BarLine.color = #(x11-color 'grey10) - c4 b8 c d16 c d8 | + c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 } @@ -1377,10 +1382,10 @@ how to introduce a new temporary staff, as in an @rglos{ossia}. @cindex alignAboveContext property, example @cindex @code{\with}, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1404,10 +1409,10 @@ we simply set the stencil of each to @code{#f}, as follows: @cindex Clef, example of overriding @cindex TimeSignature, example of overriding -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1467,10 +1472,10 @@ So we could replace the example above with @cindex Clef, example of overriding @cindex TimeSignature, example of overriding -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1492,10 +1497,10 @@ It turns out that we can also employ the shorthands @code{\hide} and @code{\omit} for setting the @code{transparent} property and clearing the @code{stencil} here, leading to the result -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1556,10 +1561,10 @@ Let's try it in our ossia example: @cindex TimeSignature, example of overriding @cindex fontSize property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1622,10 +1627,10 @@ objects in proportion. It is used like this: @cindex staff-space property, example @cindex stencil property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] \new Staff ="main" { - \relative g' { - r4 g8 g c4 c8 d | + \relative { + r4 g'8 g c4 c8 d | e4 r8 << { f8 c c } @@ -1729,11 +1734,11 @@ under @q{Text2}. @cindex markup example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" | -c2^"Text3" -c2^"Text4" | +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond Staves are also positioned, by default, as closely together as @@ -1746,10 +1751,10 @@ this @q{nestling} of the notes on adjacent staves: @lilypond[quote,ragged-right,verbatim] << \new Staff { - \relative c' { c4 a, } + \relative { c'4 a, } } \new Staff { - \relative c'''' { c4 a, } + \relative { c''''4 a, } } >> @end lilypond @@ -1889,12 +1894,14 @@ specifying @code{DOWN} and @code{UP}: @cindex Fingering, example of overriding @cindex direction property, example -@lilypond[quote,verbatim,relative=2] -c4-5 a-3 f-1 c'-5 | -\override Fingering.direction = #DOWN -c4-5 a-3 f-1 c'-5 | -\override Fingering.direction = #UP -c4-5 a-3 f-1 c'-5 | +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #DOWN + c4-5 a-3 f-1 c'-5 | + \override Fingering.direction = #UP + c4-5 a-3 f-1 c'-5 | +} @end lilypond However, overriding the @code{direction} property is not the @@ -1905,10 +1912,12 @@ example using this method: @cindex fingering example -@lilypond[quote,verbatim,relative=2] -c4-5 a-3 f-1 c'-5 | -c4_5 a_3 f_1 c'_5 | -c4^5 a^3 f^1 c'^5 | +@lilypond[quote,verbatim] +\relative { + c''4-5 a-3 f-1 c'-5 | + c4_5 a_3 f_1 c'_5 | + c4^5 a^3 f^1 c'^5 | +} @end lilypond The @code{direction} property is ignored for chords, but the @@ -1918,10 +1927,12 @@ notes of a chord, as shown: @cindex fingering example -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond @noindent @@ -1930,10 +1941,12 @@ individual fingering numbers above or below: @cindex fingering example -@lilypond[quote,verbatim,relative=2] -4 -4 -4 +@lilypond[quote,verbatim] +\relative { + 4 + 4 + 4 +} @end lilypond Even greater control over the placement of fingering of the @@ -1971,22 +1984,24 @@ Here are a few examples: @cindex @code{\set}, example of using @cindex fingeringOrientations property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(left) -4 -4 | -\set fingeringOrientations = #'(up left down) -4 -4 -\set fingeringOrientations = #'(up left) -4 -4 | -\set fingeringOrientations = #'(right) -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} @end lilypond @noindent @@ -1995,23 +2010,25 @@ could be reduced. The default value can be seen from the @code{Fingering} object in the IR to be @w{@code{-5}}, so let's try @w{@code{-7}}: -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\override Fingering.font-size = #-7 -\set fingeringOrientations = #'(left) -4 -4 -\set fingeringOrientations = #'(left) -4 -4 | -\set fingeringOrientations = #'(up left down) -4 -4 -\set fingeringOrientations = #'(up left) -4 -4 | -\set fingeringOrientations = #'(right) -4 -4 +@lilypond[quote,ragged-right,verbatim] +\relative { + \override Fingering.font-size = #-7 + \set fingeringOrientations = #'(left) + 4 + 4 + \set fingeringOrientations = #'(left) + 4 + 4 | + \set fingeringOrientations = #'(up left down) + 4 + 4 + \set fingeringOrientations = #'(up left) + 4 + 4 | + \set fingeringOrientations = #'(right) + 4 + 4 +} @end lilypond @node Outside-staff objects @@ -2099,14 +2116,12 @@ these. @cindex ottava bracket @funindex \startTextSpan -@funindex startTextSpan @funindex \stopTextSpan -@funindex stopTextSpan @cindex TextSpanner, example of overriding @cindex bound-details property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +@lilypond[quote,fragment,ragged-right,verbatim] % Set details for later Text Spanner \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } @@ -2114,18 +2129,18 @@ these. \dynamicUp % Start Ottava Bracket \ottava #1 -c'4 \startTextSpan +c''4 \startTextSpan % Add Dynamic Text and hairpin -c4\pp\< -c4 +c''4\pp\< +c''4 % Add Text Script -c4^Text | -c4 c +c''4^Text | +c''4 c'' % Add Dynamic Text and terminate hairpin -c4\ff c \stopTextSpan | +c''4\ff c'' \stopTextSpan | % Stop Ottava Bracket \ottava #0 -c,4 c c c | +c'4 c' c' c' | @end lilypond This example also shows how to create Text Spanners -- @@ -2156,7 +2171,7 @@ in the @code{Staff} context: @cindex TextSpanner, example of overriding @cindex bound-details property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] +@lilypond[quote,fragment,ragged-right,verbatim] % Set details for later Text Spanner \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } @@ -2166,19 +2181,19 @@ in the @code{Staff} context: \once \override Staff.OttavaBracket.outside-staff-priority = #340 % Start Ottava Bracket \ottava #1 -c'4 \startTextSpan +c''4 \startTextSpan % Add Dynamic Text -c4\pp +c''4\pp % Add Dynamic Line Spanner -c4\< +c''4\< % Add Text Script -c4^Text | -c4 c +c''4^Text | +c''4 c'' % Add Dynamic Text -c4\ff c \stopTextSpan | +c''4\ff c'' \stopTextSpan | % Stop Ottava Bracket \ottava #0 -c,4 c c c | +c'4 c' c' c' | @end lilypond Note that some of these objects, in particular bar numbers, @@ -2203,14 +2218,16 @@ can be set to a numerical value to cause it to be placed along with other outside-staff objects according to that value. Here's an example showing the effect of the two methods: -@lilypond[quote,verbatim,relative=2] -c4( c^\markup { \tiny \sharp } d4.) c8 | -c4( -\once \override TextScript.avoid-slur = #'inside -\once \override TextScript.outside-staff-priority = ##f -c4^\markup { \tiny \sharp } d4.) c8 | -\once \override Slur.outside-staff-priority = #500 -c4( c^\markup { \tiny \sharp } d4.) c8 | +@lilypond[quote,verbatim] +\relative c'' { + c4( c^\markup { \tiny \sharp } d4.) c8 | + c4( + \once \override TextScript.avoid-slur = #'inside + \once \override TextScript.outside-staff-priority = ##f + c4^\markup { \tiny \sharp } d4.) c8 | + \once \override Slur.outside-staff-priority = #500 + c4( c^\markup { \tiny \sharp } d4.) c8 | +} @end lilypond Changing the @code{outside-staff-priority} can also be used to @@ -2225,12 +2242,12 @@ in the IR or in the tables above, and increase the priority of @cindex TextScript, example of overriding @cindex outside-staff-priority property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -c2^"Text1" -c2^"Text2" | +@lilypond[quote,fragment,ragged-right,verbatim] +c''2^"Text1" +c''2^"Text2" | \once \override TextScript.outside-staff-priority = #500 -c2^"Text3" -c2^"Text4" | +c''2^"Text3" +c''2^"Text4" | @end lilypond This certainly lifts @qq{Text3} above @qq{Text4} but it also lifts it @@ -2247,21 +2264,19 @@ command. @cindex notes, spreading out with text @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff By default, text produced by markup takes up no horizontal space as far as laying out the music is concerned. The @code{\textLengthOn} command reverses this behavior, causing the notes to be spaced out as far as is necessary to accommodate the text: -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] +@lilypond[quote,fragment,ragged-right,verbatim] \textLengthOn % Cause notes to space out to accommodate text -c2^"Text1" -c2^"Text2" | -c2^"Text3" -c2^"Text4" | +c''2^"Text1" +c''2^"Text2" | +c''2^"Text3" +c''2^"Text4" | @end lilypond The command to revert to the default behavior is @@ -2279,25 +2294,27 @@ example to show how markup text interacts with such notes. @cindex TextScript, example of overriding @cindex outside-staff-priority property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=2] -% This markup is short enough to fit without collision -c2^"Tex" c'' | -R1 | - -% This is too long to fit, so it is displaced upwards -c,,2^"Text" c'' | -R1 | - -% Turn off collision avoidance -\once \override TextScript.outside-staff-priority = ##f -c,,2^"Long Text " c'' | -R1 | - -% Turn off collision avoidance -\once \override TextScript.outside-staff-priority = ##f -\textLengthOn % and turn on textLengthOn -c,,2^"Long Text " % Spaces at end are honored -c''2 | +@lilypond[quote,ragged-right,verbatim] +\relative { + % This markup is short enough to fit without collision + c''2^"Tex" c'' | + R1 | + + % This is too long to fit, so it is displaced upwards + c,,2^"Text" c'' | + R1 | + + % Turn off collision avoidance + \once \override TextScript.outside-staff-priority = ##f + c,,2^"Long Text " c'' | + R1 | + + % Turn off collision avoidance + \once \override TextScript.outside-staff-priority = ##f + \textLengthOn % and turn on textLengthOn + c,,2^"Long Text " % Spaces at end are honored + c''2 | +} @end lilypond @node Dynamics placement @@ -2314,13 +2331,15 @@ all within-staff objects such as phrasing slurs and bar numbers. This can give quite acceptable results, as this example shows: -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\clef "bass" -\key aes \major -\time 9/8 -\dynamicUp -bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | -ees,2.~\)\mf ees4 r8 | +@lilypond[quote,ragged-right,verbatim] +\relative { + \clef "bass" + \key aes \major + \time 9/8 + \dynamicUp + bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! | + ees,2.~\)\mf ees4 r8 | +} @end lilypond However, if the notes and attached dynamics are close @@ -2686,8 +2705,8 @@ above or below notes. @cindex Script, example of overriding @cindex padding property, example -@lilypond[quote,fragment,relative=1,verbatim] -c2\fermata +@lilypond[quote,fragment,verbatim] +c'2\fermata \override Script.padding = #3 b2\fermata @end lilypond @@ -2695,15 +2714,15 @@ b2\fermata @cindex MetronomeMark, example of overriding @cindex padding property, example -@lilypond[quote,fragment,relative=1,verbatim] +@lilypond[quote,fragment,verbatim] % This will not work, see below \override MetronomeMark.padding = #3 \tempo 4 = 120 -c1 | +c'1 | % This works \override Score.MetronomeMark.padding = #3 \tempo 4 = 80 -d1 | +d'1 | @end lilypond Note in the second example how important it is to figure out what @@ -2738,8 +2757,8 @@ stencil with a markup containing the desired symbol(s), like this: @lilypond[quote,ragged-right,verbatim] sesquisharp = \markup { \sesquisharp } -\relative c'' { - c4 +\relative { + c''4 % This prints a sesquisharp but the spacing is too small \once \override Accidental.stencil = #ly:text-interface::print \once \override Accidental.text = #sesquisharp @@ -2802,11 +2821,11 @@ right edge with the reference point of the parent note: @cindex StringNumber, example of overriding @cindex self-alignment-X property, example -@lilypond[quote,fragment,ragged-right,verbatim,relative=3] +@lilypond[quote,fragment,ragged-right,verbatim] \voiceOne - + \once \override StringNumber.self-alignment-X = #RIGHT - + @end lilypond @node The staff-position property @@ -2822,8 +2841,8 @@ handling between notes and between notes and rests is done only for notes and rests that occur at the same time. Here's an example of a collision of this type: -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] -<< { c4 c c c } \\ { R1 } >> +@lilypond[quote,verbatim,ragged-right] +<< \relative { c'4 c c c } \\ { R1 } >> @end lilypond The best solution here is to move the multimeasure rest down, since @@ -2835,9 +2854,9 @@ move it, say, four half-staff spaces down to @w{@code{-8}}. @cindex MultiMeasureRest, example of overriding @cindex staff-position property, example -@lilypond[quote,verbatim,fragment,ragged-right, relative=1] +@lilypond[quote,verbatim,ragged-right] << - { c4 c c c } + \relative { c'4 c c c } \\ \override MultiMeasureRest.staff-position = #-8 { R1 } @@ -2888,8 +2907,8 @@ manually. Here's an example in which the phrasing slur and slur collide: -@lilypond[quote,verbatim,fragment,ragged-right,relative=2] -a8 \( ( a'16 ) a \) +@lilypond[quote,verbatim,ragged-right] +\relative { a'8 \( ( a'16 ) a \) } @end lilypond @cindex PhrasingSlur, example of overriding @@ -2902,9 +2921,9 @@ centre line and the right end to 4.5 above, and LilyPond will select the phrasing slur from the candidates it has found with its end points closest to these: -@lilypond[quote,verbatim,fragment,ragged-right,relative=2] +@lilypond[quote,verbatim,fragment,ragged-right] \once \override PhrasingSlur.positions = #'(2.5 . 4.5) -a8 \( ( a'16 ) a \) +a'8 \( ( a''16 ) a'' \) @end lilypond This is an improvement, but why not lower the right end of the slur @@ -2922,12 +2941,12 @@ collide with the ties: { \time 4/2 << - { c'1 ~ c'2. e'8 f' } + { c'1 ~ 2. e'8 f' } \\ { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } >> << - { c'1 ~ c'2. e'8 f' } + { c'1 ~ 2. e'8 f' } \\ { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } >> @@ -2946,7 +2965,7 @@ say, 1: { \time 4/2 << - { c'1 ~ c'2. e'8 f' } + { c'1 ~ 2. e'8 f' } \\ { \override Beam.positions = #'(-1 . -1) @@ -2954,7 +2973,7 @@ say, 1: } >> << - { c'1 ~ c'2. e'8 f' } + { c'1 ~ 2. e'8 f' } \\ { e''8 e'' e'' e'' e'' e'' e'' e'' f''2 g'' } >> @@ -2974,10 +2993,10 @@ example introduced at the end of @ref{I'm hearing Voices}, which was left looking like this: @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { 2 des } \\ @@ -3006,10 +3025,10 @@ Here's the final result: @cindex force-hshift property, example @lilypond[quote,verbatim,fragment,ragged-right] -\new Staff \relative c'' { +\new Staff \relative { \key aes \major << - { c2 aes4. bes8 } + { c''2 aes4. bes8 } \\ { 2 @@ -3049,9 +3068,9 @@ dynamics, fingering and pedalling. @c This example should not be indexed @c line-width ensures no break @lilypond[quote,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3091,8 +3110,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3132,9 +3151,9 @@ produces by default: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4. g8 | + r2 c''4. g8 | bes1~ | \time 6/4 bes2. r8 @@ -3143,7 +3162,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3158,8 +3177,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2 | +lhMusic = \relative { + r2 2 | 1 | r2. d,,4 r4 r | r4 @@ -3189,9 +3208,9 @@ since these were all covered in the Tutorial. Doing this gives: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | bes1~ | \time 6/4 bes2. r8 @@ -3200,7 +3219,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3215,8 +3234,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1) | r2. d,,4 r4 r | r4 @@ -3259,9 +3278,9 @@ This completes bar two, giving: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3272,7 +3291,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3287,8 +3306,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3338,9 +3357,9 @@ to the end, giving: @c line-width ensures no break @lilypond[quote,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3353,7 +3372,7 @@ rhMusic = \relative c'' { { c,8 d fis bes a } % continuation of main voice \new Voice { \voiceTwo - c,8~ c2 + c,8~ 2 } \new Voice { \voiceThree @@ -3370,8 +3389,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3412,9 +3431,9 @@ Applying these changes gives: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3447,8 +3466,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3482,9 +3501,9 @@ the @code{force-hshift} property. Here's the final result: @c line-width ensures no break @lilypond[quote,verbatim,ragged-right,line-width=6\in] -rhMusic = \relative c'' { +rhMusic = \relative { \new Voice { - r2 c4.\( g8 | + r2 c''4.\( g8 | \once \override Tie.staff-position = #3.5 bes1~ | \bar "||" @@ -3525,8 +3544,8 @@ rhMusic = \relative c'' { } } -lhMusic = \relative c' { - r2 2( | +lhMusic = \relative { + r2 2( | 1)\arpeggio | r2. d,,4 r4 r | r4 @@ -3586,8 +3605,8 @@ different voices using ties. Normally, only two notes in the same voice can be connected with ties. By using two voices, with the tied notes in one of them -@lilypond[quote,fragment,relative=2] -<< { b8~ b\noBeam } \\ { b8[ g] } >> +@lilypond[quote] +<< { b'8~ 8\noBeam } \\ { b'8[ g'] } >> @end lilypond @noindent @@ -3601,7 +3620,7 @@ cross voices: << { \tweak Stem.transparent ##t - b8~ b\noBeam + b8~ 8\noBeam } \\ { b8[ g] } @@ -3617,7 +3636,7 @@ too much, we can lengthen the stem by setting the { \tweak Stem.transparent ##t \tweak Stem.length #8 - b8~ b\noBeam + b8~ 8\noBeam } \\ { b8[ g] } @@ -3639,7 +3658,7 @@ possible to rewrite the above example as \single \hide Stem \single \hide Flag \tweak Stem.length #8 - b8~ b\noBeam + b8~ 8\noBeam } \\ { b8[ g] } @@ -3680,10 +3699,10 @@ We show here the effect of the two methods: @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a + a'4 a a \once \hide Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 @@ -3702,10 +3721,10 @@ We show here the effect of the two methods: @lilypond[quote,verbatim,ragged-right] \score { - \relative c'' { + \relative { % Visible tempo marking \tempo 4=120 - a4 a a + a'4 a a \once \omit Score.MetronomeMark % Invisible tempo marking to lengthen fermata in MIDI \tempo 4=80 @@ -3783,10 +3802,10 @@ normal = { global = { \key c \major \time 4/4 \partial 4 } -SopranoMusic = \relative c' { c4 | e4. e8 g4 g | a4 a g } -AltoMusic = \relative c' { c4 | c4. c8 e4 e | f4 f e } -TenorMusic = \relative c { e4 | g4. g8 c4. b8 | a8 b c d e4 } -BassMusic = \relative c { c4 | c4. c8 c4 c | f8 g a b c4 } +SopranoMusic = \relative { c'4 | e4. e8 g4 g | a4 a g } +AltoMusic = \relative { c'4 | c4. c8 e4 e | f4 f e } +TenorMusic = \relative { e4 | g4. g8 c4. b8 | a8 b c d e4 } +BassMusic = \relative { c4 | c4. c8 c4 c | f8 g a b c4 } VerseOne = \lyrics { E -- | ter -- nal \emphasize Fa -- ther, | \normal strong to save, @@ -3849,13 +3868,13 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -3882,7 +3901,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @end example @@ -3899,9 +3918,9 @@ Now let's modify our music (let's save this file as @file{music.ly}). @example \include "definitions.ily" -\relative c'' @{ +\relative @{ \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -3920,13 +3939,13 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -3955,7 +3974,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -3988,7 +4007,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4009,9 +4028,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4039,7 +4058,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #@{ <>^\markup \bold \box #string #@}) @@ -4073,7 +4092,7 @@ mpdolce = inst = #(define-music-function - (parser location string) + (string) (string?) #{ <>^\markup \bold \box #string #}) @@ -4090,9 +4109,9 @@ inst = } } -\relative c'' { +\relative { \tempo 4=50 - a4.\mpdolce d8 cis4--\glissando a | + a'4.\mpdolce d8 cis4--\glissando a | b4 bes a2 | \inst "Clarinet" cis4.\< d8 e4 fis | @@ -4307,7 +4326,7 @@ the staff. ((0) (x11-color 'violet )) ; for B ))) -\relative c' { +\relative { % Arrange to obtain color from color-notehead procedure \override NoteHead.color = #color-notehead a2 b | c2 d | e2 f | g2 a | diff --git a/Documentation/nl/search-box.ihtml b/Documentation/nl/search-box.ihtml index 25bdd7665b..588bf20e56 100644 --- a/Documentation/nl/search-box.ihtml +++ b/Documentation/nl/search-box.ihtml @@ -16,11 +16,11 @@ search for a while and have a redirection from "v2.15" to "v2.17". diff --git a/Documentation/nl/translations.itexi b/Documentation/nl/translations.itexi index 6e28d6897d..0cfb744377 100644 --- a/Documentation/nl/translations.itexi +++ b/Documentation/nl/translations.itexi @@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; } @end html @end ifhtml -@emph{Meest recente update Wed Dec 18 12:23:14 UTC 2013 +@emph{Meest recente update Sat Jul 2 15:06:05 UTC 2016 } @multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 @@ -47,11 +47,11 @@ ja @ifhtml @html -ja +gedeeltelijk @end html @end ifhtml @ifnothtml -ja +gedeeltelijk @end ifnothtml @tab na-GDP @item @@ -84,24 +84,24 @@ ja @item 1 Leerboek @* -2578 +2499 @tab Jan Nieuwenhuizen @tab @tab @ifhtml @html -gedeeltelijk (48 %) +gedeeltelijk (50 %) @end html @end ifhtml @ifnothtml -gedeeltelijk (48 %) +gedeeltelijk (50 %) @end ifnothtml @tab @ifhtml @html -gedeeltelijk +gedeeltelijk @end html @end ifhtml @ifnothtml @@ -111,24 +111,24 @@ gedeeltelijk @item 2 Algemene muzieknotatie @* -4396 +4402 @tab Jan Nieuwenhuizen @tab @tab @ifhtml @html -gedeeltelijk (35 %) +gedeeltelijk (37 %) @end html @end ifhtml @ifnothtml -gedeeltelijk (35 %) +gedeeltelijk (37 %) @end ifnothtml @tab @ifhtml @html -gedeeltelijk +gedeeltelijk @end html @end ifhtml @ifnothtml @@ -138,7 +138,7 @@ gedeeltelijk @item 3 Fundamentele concepten @* -11144 +11119 @tab Jan Nieuwenhuizen @tab @tab @@ -155,7 +155,7 @@ ja @ifhtml @html -gedeeltelijk +gedeeltelijk @end html @end ifhtml @ifnothtml @@ -165,24 +165,24 @@ gedeeltelijk @item 4 Tweaking output @* -16191 +16592 @tab Jan Nieuwenhuizen @tab @tab @ifhtml @html -gedeeltelijk (98 %) +gedeeltelijk (95 %) @end html @end ifhtml @ifnothtml -gedeeltelijk (98 %) +gedeeltelijk (95 %) @end ifnothtml @tab @ifhtml @html -gedeeltelijk +gedeeltelijk @end html @end ifhtml @ifnothtml @@ -192,28 +192,28 @@ gedeeltelijk @item A Templates @* -372 +1236 @tab Jan Nieuwenhuizen @tab @tab @ifhtml @html -ja +gedeeltelijk (97 %) @end html @end ifhtml @ifnothtml -ja +gedeeltelijk (97 %) @end ifnothtml @tab @ifhtml @html -ja +gedeeltelijk @end html @end ifhtml @ifnothtml -ja +gedeeltelijk @end ifnothtml @tab voor-GDP @end multitable @@ -231,7 +231,7 @@ LilyPond -- Muzieknotatie voor iedereen @item Paragraaftitels @* -616 +629 @tab Jan Nieuwenhuizen @tab Tineke de Munnik @tab @@ -248,11 +248,11 @@ ja @ifhtml @html -ja +gedeeltelijk @end html @end ifhtml @ifnothtml -ja +gedeeltelijk @end ifnothtml @tab na-GDP @item @@ -285,7 +285,7 @@ ja @item Inleiding @* -4937 +5815 @tab Jan Nieuwenhuizen @tab Tineke de Munnik @tab @@ -302,7 +302,7 @@ ja @ifhtml @html -gedeeltelijk +gedeeltelijk @end html @end ifhtml @ifnothtml @@ -312,7 +312,7 @@ gedeeltelijk @item Download @* -1201 +1158 @tab Jan Nieuwenhuizen @tab Tineke de Munnik @tab @@ -329,7 +329,7 @@ ja @ifhtml @html -gedeeltelijk +gedeeltelijk @end html @end ifhtml @ifnothtml @@ -339,7 +339,7 @@ gedeeltelijk @item Handleidingen @* -1284 +1314 @tab Jan Nieuwenhuizen @tab Tineke de Munnik @tab @@ -356,7 +356,7 @@ ja @ifhtml @html -gedeeltelijk +gedeeltelijk @end html @end ifhtml @ifnothtml diff --git a/Documentation/nl/web.texi b/Documentation/nl/web.texi index b682396f9f..e977208b10 100644 --- a/Documentation/nl/web.texi +++ b/Documentation/nl/web.texi @@ -35,7 +35,7 @@ @copying -Copyright @copyright{} 2009--2012 by the authors. +Copyright @copyright{} 2009--2015 by the authors. @c next line is necessary for broken pre-4.13 texinfo's @c install-info, so leave it there until we officially diff --git a/Documentation/nl/web/introduction.itexi b/Documentation/nl/web/introduction.itexi index 6d0ecef888..d45ea1361b 100644 --- a/Documentation/nl/web/introduction.itexi +++ b/Documentation/nl/web/introduction.itexi @@ -623,7 +623,7 @@ toetsen aangeslagen worden om beginners te helpen bladmuziek lezen. @item -@uref{http://www.adoromusicpub.com/, Adoro Music +@uref{https://twitter.com/adoromusic, Adoro Music Publishing}, partituren van hoge kwaliteit van religieuze muziek, beschikbaar voor directe download of ouderwets op papier. @@ -667,7 +667,7 @@ april 2011 @uref{http://www.linux-magazine.com,Linux Magazine} publiceert een artikel getiteld -@uref{http://www.linux-magazine.com/w3/issue/126/088-090_projects.pdf, +@uref{http://www.linux-magazine.com/content/download/61706/482546/version/1/file/088-090_projects.pdf, Projects on the Move}. Het is een inleiding in MuseScore, LilyPond en Chordii. Auteur Carla Schroder schrijft @@ -704,7 +704,7 @@ onderhouden. @item juni 2009 -In een @uref{http://news.lilynet.net/Free-Music-Now, artikel} +In een @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/Free-Music-Now, artikel} gepubliceerd in het Franse @emph{National Conservatory Parent Association}'s jaarblad, legt de Franse componist en LilyPond-bijdrager Valentin Villenave uit waarom Vrije licenties, en in het bijzonder @@ -874,7 +874,7 @@ categorie prachtige muziek zetten].} @divEnd @divClass{testimonial-item} -@subsubheading Chris Snyder, @uref{http://www.adoromusicpub.com/, Adoro Music Publishing} +@subsubheading Chris Snyder, @uref{https://twitter.com/adoromusic, Adoro Music Publishing} @qq{De wijze waarop muziek wordt ingevoerd voor LilyPond laat mij op een muzikalere manier denken -- het is enkele @@ -1360,7 +1360,7 @@ constraint-gebaseerde programmeertaal. LilyKDE3 voor KDE 3.5 en lilypond-KDE4 voor KDE 4.1. @item -@uref{http://noteedit.berlios.de,NoteEdit}, dat +@uref{https://sourceforge.net/projects/noteedit.berlios/,NoteEdit}, dat @uref{http://www.musicxml.com/xml.html,MusicXML} importeerde, is geforkt in @uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd} diff --git a/Documentation/nl/web/manuals.itexi b/Documentation/nl/web/manuals.itexi index 61db2db59e..427b1d210a 100644 --- a/Documentation/nl/web/manuals.itexi +++ b/Documentation/nl/web/manuals.itexi @@ -137,7 +137,7 @@ vorige stabiele versies en huidige als gecomprimeerd archief. status van de vertaling voor niet-Engelstaligen. @item -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippers Repository}: +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond Snippers Repository}: voorbeelden door gebruikers, hints en tips. @item @@ -330,7 +330,7 @@ lectuur indien je een groot project wilt beginnen. Dit toont een geselecteerde set LilyPond-snippers (codefragementen) uit de -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond Snippet Repository} (LSR). Al deze snippers zijn publiek domein. Let op dat dit document geen exacte deelverzameling is van diff --git a/Documentation/notation.tely b/Documentation/notation.tely index 517c4dc046..c055ab1e5f 100644 --- a/Documentation/notation.tely +++ b/Documentation/notation.tely @@ -20,9 +20,14 @@ the reader is familiar with the material in the @rlearningnamed{Top, Learning Manual}. @end macro -@c `Notation Reference' was born 1999-10-11 with git commit 940dda0... +@c `Notation Reference' was born 1998-08-14 with this commit: +@c release: 1.0.2 +@c author: Han-Wen Nienhuys +@c commit: a3a44f9f3c581b6824b3a65f9039656693e09bbf +@c file: Documentation/tex/refman.yo + @macro copyrightDeclare -Copyright @copyright{} 1999--2012 by the authors. +Copyright @copyright{} 1998--2015 by the authors. @end macro diff --git a/Documentation/notation/ancient.itely b/Documentation/notation/ancient.itely index 67aefbd86d..714584210a 100644 --- a/Documentation/notation/ancient.itely +++ b/Documentation/notation/ancient.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @node Ancient notation @@ -220,8 +220,8 @@ specific for this particular type of ligature. By default, the above the ligature. @lilypond[quote,ragged-right,verbatim] -\relative c'' { - \[ g c, a' f d' \] +\relative { + \[ g' c, a' f d' \] a g f \[ e f a g \] } @@ -294,8 +294,8 @@ desired, as shown in the following example: @lilypond[quote,ragged-right] \score { - \relative c'' { - a1 + \relative { + a'1 \break g } @@ -363,8 +363,8 @@ Internals Reference: @node Mensural contexts @unnumberedsubsubsec Mensural contexts -@cindex MensuralVoiceContext -@cindex MensuralStaffContext +@cindex MensuralVoice +@cindex MensuralStaff The predefined @code{MensuralVoice} and @code{MensuralStaff} contexts can be used to engrave a piece in mensural style. These @@ -375,9 +375,9 @@ entering the chant, as the following excerpt demonstrates: @lilypond[quote,ragged-right,verbatim] \score { << - \new MensuralVoice = "discantus" \relative c'' { + \new MensuralVoice = "discantus" \relative { \hide Score.BarNumber { - c1\melisma bes a g\melismaEnd + c''1\melisma bes a g\melismaEnd f\breve \[ f1\melisma a c\breve d\melismaEnd \] c\longa @@ -430,10 +430,10 @@ mensural C clef @code{mensural-c3}, @code{mensural-c4},@* @code{mensural-c5} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "mensural-c2" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item @@ -441,10 +441,10 @@ mensural F clef @tab @code{mensural-f} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "mensural-f" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item @@ -452,10 +452,10 @@ mensural G clef @tab @code{mensural-g} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "mensural-g" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item @@ -465,10 +465,10 @@ black mensural C clef @code{blackmensural-c3}, @code{blackmensural-c4},@* @code{blackmensural-c5} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "blackmensural-c2" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item @@ -477,8 +477,8 @@ neomensural C clef @code{neomensural-c1}, @code{neomensural-c2},@* @code{neomensural-c3}, @code{neomensural-c4} @tab -@lilypond[relative=1,notime] - \clef "neomensural-c2" c1 +@lilypond[fragment,notime] + \clef "neomensural-c2" c'1 @end lilypond @item @@ -489,10 +489,10 @@ petrucci style C clefs, for use on different staff lines @code{petrucci-c3}, @code{petrucci-c4},@* @code{petrucci-c5} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "petrucci-c2" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item @@ -502,10 +502,10 @@ petrucci style F clefs, for use on different staff lines @code{petrucci-f3}, @code{petrucci-f4},@* @code{petrucci-f5} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "petrucci-f3" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @item @@ -513,10 +513,10 @@ petrucci style G clef @tab @code{petrucci-g} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \clef "petrucci-g" \override NoteHead.style = #'mensural - c1 + c'1 @end lilypond @end multitable @@ -536,7 +536,8 @@ The mensural g clef is mapped to the Petrucci g clef. @unnumberedsubsubsec Mensural time signatures @cindex mensuration sign -@cindex time signatures +@cindex time signature, mensural +@cindex time signature style There is limited support for mensuration signs (which are similar to, but not exactly the same as time signatures). The glyphs are hard-wired @@ -595,8 +596,8 @@ to select ancient time signatures. Supported styles are @code{neomensural} style. The following examples show the differences in style: -@lilypond[ragged-right,relative=1,quote] -{ +@lilypond[ragged-right,quote] +\relative c' { \textLengthOn \time 2/2 @@ -681,7 +682,7 @@ mensural notation or coloratio sections in white mensural notation. Because note head style does not influence flag count, in this style a semiminima should be notated as @code{a8*2}, not @code{a4}, otherwise it will look like a minima. -The multiplyer can be different if coloratio is used e.g. to notate +The multiplier can be different if coloratio is used e.g. to notate triplets. Use @code{semipetrucci} style to draw half-colored @@ -728,13 +729,15 @@ Use the @code{flag-style} property of grob @code{Stem} to select ancient flags. Besides the @code{default} flag style, only the @code{mensural} style is supported. -@lilypond[quote,fragment,ragged-right,verbatim,relative=1] -\override Flag.style = #'mensural -\override Stem.thickness = #1.0 -\override NoteHead.style = #'mensural -\autoBeamOff -c8 d e f c16 d e f c32 d e f s8 -c'8 d e f c16 d e f c32 d e f +@lilypond[quote,fragment,ragged-right,verbatim] +\relative c' { + \override Flag.style = #'mensural + \override Stem.thickness = #1.0 + \override NoteHead.style = #'mensural + \autoBeamOff + c8 d e f c16 d e f c32 d e f s8 + c'8 d e f c16 d e f c32 d e f +} @end lilypond Note that the innermost flare of each mensural flag is @@ -762,29 +765,21 @@ scope for mensural notation). @cindex rests, ancient Use the @code{style} property of grob @code{Rest} to select -ancient rests. Supported styles are @code{classical}, -@code{neomensural}, and @code{mensural}. @code{classical} differs -from the @code{default} style only in that the quarter rest looks -like a horizontally mirrored 8th rest. The @code{mensural} and -the @code{neomensural} styles mimic the appearance of rests in -manuscripts and prints up to the 16th century. +ancient rests. Supported ancient styles are +@code{neomensural}, and @code{mensural}. -The following example demonstrates the @code{mensural} and -@code{neomensural} styles: +The following example demonstrates these styles: @lilypond[quote,fragment,ragged-right,verbatim] \set Score.skipBars = ##t -\override Rest.style = #'classical -r\longa^"classical" r\breve r1 r2 r4 r8 r16 s \break \override Rest.style = #'mensural r\longa^"mensural" r\breve r1 r2 r4 r8 r16 s \break \override Rest.style = #'neomensural r\longa^"neomensural" r\breve r1 r2 r4 r8 r16 @end lilypond -There are no 32th and 64th rests specifically for the mensural or -neo-mensural style. Instead, the rests from the default style will be -taken. +There are no 32nd and 64th rests specifically for the mensural or +neo-mensural styles. Rests from the default style are used. @seealso Music Glossary: @@ -810,8 +805,11 @@ using pitched rests. @cindex key signature The @code{mensural} style provides a sharp and a flat sign -different from the default style. If called for, the natural sign -will be taken from the @code{vaticana} style. +different from the default style. Mensural notation rarely used a natural +sign: instead the appropriate sharp or flat is used. For example, a B +natural in the key of F major would be indicated with a sharp. However, +if specifically called for, the natural sign is taken from the @code{vaticana} +style. @lilypond[quote,ragged-right,staffsize=26] \markup { @@ -866,10 +864,12 @@ switched on by setting @code{suggestAccidentals} to true. @funindex suggestAccidentals -@lilypond[verbatim,relative=1] -fis gis -\set suggestAccidentals = ##t -ais bis +@lilypond[verbatim] +\relative { + fis' gis + \set suggestAccidentals = ##t + ais bis +} @end lilypond This will treat @emph{every} subsequent accidental as @@ -880,10 +880,10 @@ defined as a convenient shorthand: @lilypond[quote,verbatim] ficta = { \once \set suggestAccidentals = ##t } -\score { \relative c'' +\score { \relative \new MensuralVoice { \once \set suggestAccidentals = ##t - bes4 a2 g2 \ficta fis8 \ficta e! fis2 g1 + bes'4 a2 g2 \ficta fis8 \ficta e! fis2 g1 } } @end lilypond @@ -934,31 +934,20 @@ head. The length of a flexa can be set by the note head property For example, -@c @example -@c \set Score.timing = ##f -@c \set Score.defaultBarType = "-" -@c \override NoteHead.style = #'neomensural -@c \override Staff.TimeSignature.style = #'neomensural -@c \clef "petrucci-g" -@c \[ c'\maxima g \] -@c \[ d\longa c\breve f e d \] -@c \[ c'\maxima d'\longa \] -@c \[ e'1 a g\breve \] -@c @end example @lilypond[quote,ragged-right,verbatim] \score { - \relative c' { + \relative { \set Score.timing = ##f \set Score.defaultBarType = "-" \override NoteHead.style = #'petrucci \override Staff.TimeSignature.style = #'mensural \clef "petrucci-g" - \[ c'\maxima g \] - \[ d\longa + \[ c''\maxima g \] + \[ d'\longa \override NoteHead.ligature-flexa = ##t \once \override NoteHead.flexa-width = #3.2 c\breve f e d \] - \[ c'\maxima d\longa \] + \[ c\maxima d\longa \] \[ e1 a, g\breve \] } \layout { @@ -972,22 +961,21 @@ For example, @end lilypond Without replacing @code{Ligature_bracket_engraver} with -@code{Mensural_ligature_engraver}, the same music transcribes -to the following +@code{Mensural_ligature_engraver}, the same music looks as follows: @lilypond[quote,ragged-right] -\relative c' { +\relative { \set Score.timing = ##f \set Score.defaultBarType = "-" \override NoteHead.style = #'petrucci \override Staff.TimeSignature.style = #'mensural \clef "petrucci-g" - \[ c'\maxima g \] - \[ d\longa + \[ c''\maxima g \] + \[ d'\longa \override NoteHead.ligature-flexa = ##t \once \override NoteHead.flexa-width = #3.2 c\breve f e d \] - \[ c'\maxima d\longa \] + \[ c\maxima d\longa \] \[ e1 a, g\breve \] } @end lilypond @@ -1001,7 +989,7 @@ Notation Reference: @ref{Ligatures}. @knownissues -Horizontal spacing of ligatures is poor. +Horizontal spacing of ligatures may be poor. Accidentals may collide with previous notes. @@ -1038,11 +1026,11 @@ Notation Reference: @node Gregorian chant contexts @unnumberedsubsubsec Gregorian chant contexts -@cindex VaticanaVoiceContext -@cindex VaticanaStaffContext +@cindex VaticanaVoice +@cindex VaticanaStaff -The predefined @code{VaticanaVoiceContext} and -@code{VaticanaStaffContext} can be used to engrave a piece of +The predefined @code{VaticanaVoice} and +@code{VaticanaStaff} can be used to engrave a piece of Gregorian chant in the style of the Editio Vaticana. These contexts initialize all relevant context properties and grob properties to proper values, so you can immediately go ahead entering the chant, as @@ -1102,14 +1090,14 @@ Editio Vaticana style do clef @code{vaticana-do1}, @code{vaticana-do2},@* @code{vaticana-do3} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'vaticana.punctum \clef "vaticana-do2" - c + c' @end lilypond @item @@ -1117,14 +1105,14 @@ Editio Vaticana style fa clef @tab @code{vaticana-fa1}, @code{vaticana-fa2} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'vaticana.punctum \clef "vaticana-fa2" - c + c' @end lilypond @item @@ -1133,14 +1121,14 @@ Editio Medicaea style do clef @code{medicaea-do1}, @code{medicaea-do2},@* @code{medicaea-do3} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'medicaea.punctum \clef "medicaea-do2" - c + c' @end lilypond @item @@ -1148,14 +1136,14 @@ Editio Medicaea style fa clef @tab @code{medicaea-fa1}, @code{medicaea-fa2} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'medicaea.punctum \clef "medicaea-fa2" - c + c' @end lilypond @item @@ -1164,14 +1152,14 @@ hufnagel style do clef @code{hufnagel-do1}, @code{hufnagel-do2},@* @code{hufnagel-do3} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'hufnagel.punctum \clef "hufnagel-do2" - c + c' @end lilypond @item @@ -1179,14 +1167,14 @@ hufnagel style fa clef @tab @code{hufnagel-fa1}, @code{hufnagel-fa2} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.line-count = #4 \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'hufnagel.punctum \clef "hufnagel-fa2" - c + c' @end lilypond @item @@ -1194,13 +1182,13 @@ hufnagel style combined do/fa clef @tab @code{hufnagel-do-fa} @tab -@lilypond[relative=1,notime] +@lilypond[fragment,notime] \override Staff.StaffSymbol.color = #red \override Staff.LedgerLineSpanner.color = #red \hide Voice.Stem \override NoteHead.style = #'hufnagel.punctum \clef "hufnagel-do-fa" - c + c' @end lilypond @end multitable @@ -1628,9 +1616,9 @@ code} @lilypond[staffsize=26,line-width=1.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum - \[ b \] + \[ b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1642,9 +1630,9 @@ code} @lilypond[staffsize=26,line-width=1.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum - \[ \cavum b \] + \[ \cavum b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1656,9 +1644,9 @@ code} @lilypond[staffsize=26,line-width=1.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum - \[ \linea b \] + \[ \linea b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1671,9 +1659,9 @@ code} @lilypond[staffsize=26,line-width=2.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum Auctum Ascendens - \[ \auctum \ascendens b \] + \[ \auctum \ascendens b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1686,9 +1674,9 @@ code} @lilypond[staffsize=26,line-width=2.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum Auctum Descendens - \[ \auctum \descendens b \] + \[ \auctum \descendens b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1701,9 +1689,9 @@ code} @lilypond[staffsize=26,line-width=1.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum Inclinatum - \[ \inclinatum b \] + \[ \inclinatum b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1716,9 +1704,9 @@ code} @lilypond[staffsize=26,line-width=2.5\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum Inclinatum Auctum - \[ \inclinatum \auctum b \] + \[ \inclinatum \auctum b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1731,9 +1719,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Punctum Inclinatum Parvum - \[ \inclinatum \deminutum b \] + \[ \inclinatum \deminutum b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1746,9 +1734,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Virga - \[ \virga b \] + \[ \virga b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1767,9 +1755,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Clivis vel Flexa - \[ b \flexa g \] + \[ b' \flexa g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1783,9 +1771,9 @@ code} @lilypond[staffsize=26,line-width=2.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Clivis Aucta Descendens - \[ b \flexa \auctum \descendens g \] + \[ b' \flexa \auctum \descendens g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1798,9 +1786,9 @@ code} @lilypond[staffsize=26,line-width=2.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Clivis Aucta Ascendens - \[ b \flexa \auctum \ascendens g \] + \[ b' \flexa \auctum \ascendens g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1813,9 +1801,9 @@ code} @lilypond[staffsize=26,line-width=2.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Cephalicus - \[ b \flexa \deminutum g \] + \[ b' \flexa \deminutum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1828,9 +1816,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Podatus vel Pes - \[ g \pes b \] + \[ g' \pes b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1843,9 +1831,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Auctus Descendens - \[ g \pes \auctum \descendens b \] + \[ g' \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1858,9 +1846,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Auctus Ascendens - \[ g \pes \auctum \ascendens b \] + \[ g' \pes \auctum \ascendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1873,9 +1861,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Epiphonus - \[ g \pes \deminutum b \] + \[ g' \pes \deminutum b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1888,9 +1876,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Initio Debilis - \[ \deminutum g \pes b \] + \[ \deminutum g' \pes b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1903,9 +1891,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Auctus Descendens Initio Debilis - \[ \deminutum g \pes \auctum \descendens b \] + \[ \deminutum g' \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1925,9 +1913,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus - \[ a \pes b \flexa g \] + \[ a' \pes b \flexa g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1940,9 +1928,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus Auctus Descendens - \[ a \pes b \flexa \auctum \descendens g \] + \[ a' \pes b \flexa \auctum \descendens g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1955,9 +1943,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus Deminutus - \[ a \pes b \flexa \deminutum g \] + \[ a' \pes b \flexa \deminutum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1970,9 +1958,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus Initio Debilis - \[ \deminutum a \pes b \flexa g \] + \[ \deminutum a' \pes b \flexa g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -1985,9 +1973,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus Auctus Descendens Initio Debilis - \[ \deminutum a \pes b \flexa \auctum \descendens g \] + \[ \deminutum a' \pes b \flexa \auctum \descendens g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2000,9 +1988,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Torculus Deminutus Initio Debilis - \[ \deminutum a \pes b \flexa \deminutum g \] + \[ \deminutum a' \pes b \flexa \deminutum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2015,9 +2003,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Porrectus - \[ a \flexa g \pes b \] + \[ a' \flexa g \pes b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2030,9 +2018,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Porrectus Auctus Descendens - \[ a \flexa g \pes \auctum \descendens b \] + \[ a' \flexa g \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2045,9 +2033,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Porrectus Deminutus - \[ a \flexa g \pes \deminutum b \] + \[ a' \flexa g \pes \deminutum b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2060,9 +2048,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Climacus - \[ \virga b \inclinatum a \inclinatum g \] + \[ \virga b' \inclinatum a \inclinatum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2075,9 +2063,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Climacus Auctus - \[ \virga b \inclinatum a \inclinatum \auctum g \] + \[ \virga b' \inclinatum a \inclinatum \auctum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2090,9 +2078,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Climacus Deminutus - \[ \virga b \inclinatum a \inclinatum \deminutum g \] + \[ \virga b' \inclinatum a \inclinatum \deminutum g \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2105,9 +2093,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Scandicus - \[ g \pes a \virga b \] + \[ g' \pes a \virga b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2120,9 +2108,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Scandicus Auctus Descendens - \[ g \pes a \pes \auctum \descendens b \] + \[ g' \pes a \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2135,9 +2123,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Scandicus Deminutus - \[ g \pes a \pes \deminutum b \] + \[ g' \pes a \pes \deminutum b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2157,9 +2145,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Quilisma - \[ g \pes \quilisma a \pes b \] + \[ g' \pes \quilisma a \pes b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2172,9 +2160,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Quilisma Pes Auctus Descendens - \[ g \quilisma a \pes \auctum \descendens b \] + \[ g' \quilisma a \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2187,9 +2175,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Oriscus - \[ \oriscus b \] + \[ \oriscus b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2202,9 +2190,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Quassus - \[ \oriscus g \pes \virga b \] + \[ \oriscus g' \pes \virga b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2217,9 +2205,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Pes Quassus Auctus Descendens - \[ \oriscus g \pes \auctum \descendens b \] + \[ \oriscus g' \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2232,9 +2220,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Salicus - \[ g \oriscus a \pes \virga b \] + \[ g' \oriscus a \pes \virga b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2247,9 +2235,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Salicus Auctus Descendens - \[ g \oriscus a \pes \auctum \descendens b \] + \[ g' \oriscus a \pes \auctum \descendens b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2262,9 +2250,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Stropha - \[ \stropha b \] + \[ \stropha b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2277,9 +2265,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Stropha Aucta - \[ \stropha \auctum b \] + \[ \stropha \auctum b' \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2292,9 +2280,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Bistropha - \[ \stropha b \stropha b \] + \[ \stropha b' \stropha b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2307,9 +2295,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Tristropha - \[ \stropha b \stropha b \stropha b \] + \[ \stropha b' \stropha b \stropha b \] } \layout { \neumeDemoLayout }} @end lilypond @@ -2322,9 +2310,9 @@ code} @lilypond[staffsize=26,line-width=1.0\cm] \include "gregorian.ly" \score { - \relative c'' { + \relative { % Trigonus - \[ \stropha b \stropha b \stropha a \] + \[ \stropha b' \stropha b \stropha a \] } \layout { \neumeDemoLayout } } @@ -2410,8 +2398,8 @@ with head prefixes in arbitrary order. @node Kievan contexts @unnumberedsubsubsec Kievan contexts -@cindex KievanVoiceContext -@cindex KievanStaffContext +@cindex KievanVoice +@cindex KievanStaff As with Mensural and Gregorian notation, the predefined @code{KievanVoice} and @code{KievanStaff} contexts can be used @@ -2420,6 +2408,14 @@ all relevant context properties and grob properties to proper values, so you can immediately go ahead entering the chant: @lilypond[quote,ragged-right,verbatim] +% Font settings for Cyrillic +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + )) +} + \score { << \new KievanVoice = "melody" \relative c' { @@ -2453,10 +2449,10 @@ Kievan notation that were used in Galicia to notate Rusyn plainchant. There is only one clef used in Kievan notation (the Tse-fa-ut Clef). It is used to indicate the position of @code{c}: -@lilypond[quote,relative=1,notime,verbatim] +@lilypond[quote,fragment,notime,verbatim] \clef "kievan-do" \kievanOn - c + c' @end lilypond @seealso @@ -2524,11 +2520,11 @@ in Kievan notation. The sharp sign is not used in Synodal music but may occur in earlier manuscripts. It has been included primarily for the sake of compatibility. -@lilypond[quote,relative=1,notime,verbatim] +@lilypond[quote,fragment,notime,verbatim] \clef "kievan-do" \override Accidental.glyph-name-alist = #alteration-kievan-glyph-name-alist -bes' dis, +bes' dis' @end lilypond @seealso @@ -2548,10 +2544,10 @@ A decorative figure is commonly placed at the end of a piece of Kievan notation, which may be called the Kievan final bar line. It can be invoked as @code{\bar "k"}. -@lilypond[quote,relative=1,notime,verbatim] +@lilypond[quote,fragment,notime,verbatim] \kievanOn \clef "kievan-do" - c \bar "k" + c' \bar "k" @end lilypond @seealso @@ -2590,6 +2586,14 @@ by setting the @code{padding} property of the @code{KievanLigature}. The following example demonstrates the use of Kievan ligatures: @lilypond[quote,ragged-right,verbatim] +% Font settings for Cyrillic +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + )) +} + \score { << \new KievanVoice = "melody" \relative c' { @@ -2646,11 +2650,42 @@ same source. @node Incipits @unnumberedsubsubsec Incipits +@funindex \incipit +@cindex incipits, adding -@c TODO Add text -@c clefs, mensuration signs etc from lsr and -user -@c use snippet Transcription-of-ancient-music-with-incipit -TBC +It is customary when transcribing mensural music into modern notation to place +an indication of how the initial rests and note or notes of the original version +appeared - including the original clefs. This is called an @emph{incipit}. The +@code{\incipit} command uses the @code{indent} of the main staff to set the +width occupied by the incipit, and @code{incipit-width} to set the width of the +incipit staff. + +@lilypond[verbatim,quote,ragged-right] +\score { + \new Staff << + \new Voice = Tenor { + \set Staff.instrumentName = #"Tenor" + \override Staff.InstrumentName.self-alignment-X = #RIGHT + \incipit { \clef "mensural-c4" \key f \major r\breve r1 c'1 } + \clef "treble_8" + \key f \major + R1 r2 c'2 | + a4. c'8 + } + \new Lyrics \lyricsto Tenor { Cyn -- thia your } + >> + \layout + { + indent = 5\cm + incipit-width = 3\cm + } +} +@end lilypond + +@knownissues +Note that instrumentName must be set in the music for the incipit to be +produced. If no instrument name is required then use +@code{\set Staff.instrumentName = #""}. @c @seealso @c ... and reference to other sections ... @@ -2699,13 +2734,6 @@ the @code{Stem_engraver} from the Voice context: @} @end example -However, in some transcription styles, stems are used -occasionally, for example to indicate the transition from a -single-tone recitative to a fixed melodic gesture. In these cases, -one can use either @code{\hide Stem} or -@code{\override Stem.length = #0} instead, and restore the stem -when needed with the corresponding @code{\once \override Stem.transparent = ##f} (see example below). - @b{Timing.} For unmetered chant, there are several alternatives. The Time_signature_engraver can be removed from the Staff context @@ -2729,9 +2757,9 @@ either set as a single, left-aligned syllable: @lilypond[verbatim,ragged-right] \include "gregorian.ly" -chant = \relative c' { +chant = \relative { \clef "G_8" - c\breve c4 b4 a c2 c4 \divisioMaior + c'\breve c4 b4 a c2 c4 \divisioMaior c\breve c4 c f, f \finalis } @@ -2751,7 +2779,10 @@ verba = \lyricmode { \Staff \remove "Time_signature_engraver" \remove "Bar_engraver" - \hide Stem + } + \context { + \Voice + \remove "Stem_engraver" } } } @@ -2759,17 +2790,25 @@ verba = \lyricmode { This works fine, as long as the text doesn't span a line break. If that is the case, an alternative is to add hidden notes to the -score, here in combination with changing stem visibility: +score, as below. +In some transcription styles, stems are used +occasionally, for example to indicate the transition from a +single-tone recitative to a fixed melodic gesture. In these cases, +one can use either @code{\hide Stem} or +@code{\override Stem.length = #0} instead of @code{\remove}-ing +the @code{Stem_engraver} and restore the stem +when needed with the corresponding @code{\undo \hide Stem}. @lilypond[verbatim,ragged-right] \include "gregorian.ly" -chant = \relative c' { +chant = \relative { \clef "G_8" \set Score.timing = ##f - c\breve \hide NoteHead c c c c c + \hide Stem + c'\breve \hide NoteHead c c c c c \undo \hide NoteHead - \override Stem.transparent = ##f \stemUp c4 b4 a + \undo \hide Stem \stemUp c4 b4 a \hide Stem c2 c4 \divisioMaior c\breve \hide NoteHead c c c c c c c \undo \hide NoteHead c4 c f, f \finalis @@ -2790,7 +2829,6 @@ verba = \lyricmode { \Staff \remove "Time_signature_engraver" \hide BarLine - \hide Stem } } } @@ -2817,10 +2855,10 @@ adjustments are necessary, this can be easily done with @code{s} @q{notes}. @lilypond[verbatim,quote] -spiritus = \relative c' { +spiritus = \relative { \time 1/4 \override Lyrics.LyricText.X-extent = #'(0 . 3) - d4 \tuplet 3/2 { f8 a g } g a a4 g f8 e + d'4 \tuplet 3/2 { f8 a g } g a a4 g f8 e d4 f8 g g8 d f g a g f4 g8 a a4 s \tuplet 3/2 { g8 f d } e f g a g4 } @@ -2858,9 +2896,8 @@ spirLyr = \lyricmode { @node Ancient and modern from one source @unnumberedsubsubsec Ancient and modern from one source -@c TODO Add text -@c Here among others the snippets about reducing note length -TBC +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{using-tags-to-produce-mensural-and-modern-music-from-the-same-source.ly} @c @seealso @c ... and reference to other sections ... diff --git a/Documentation/notation/changing-defaults.itely b/Documentation/notation/changing-defaults.itely index 39928b6061..7cca8e59af 100644 --- a/Documentation/notation/changing-defaults.itely +++ b/Documentation/notation/changing-defaults.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.22" @node Changing defaults @chapter Changing defaults @@ -91,18 +91,12 @@ Internals Reference: >> > > - list of contexts: my *danger unmaintainable* >> > > alarm just went off. I'm - I knew it would... And leaving out some of them is perfectly fine -with me. -I do think that a list like this, with the main contexts and a -brief -description of what they do (perhaps also with a note about what -default -behavior is associated with each of them, but this may be -unmanageable), -should be there, and then we could simply list the remaining ones -without -further explanation and with links to the IR. +with me. I do think that a list like this, with the main contexts and a +brief description of what they do (perhaps also with a note about what +default behavior is associated with each of them, but this may be +unmanageable), should be there, and then we could simply list the +remaining ones without further explanation and with links to the IR. @end ignore @c TODO Improve layout, order and consistency of wording -td @@ -224,7 +218,7 @@ expression out as a guitar tablature, printed on six lines. @strong{@emph{DrumStaff}} -Handles typesetting for percussion. Can contain @code{DrumVoice} +Handles typesetting for percussion. Can contain @code{DrumVoice}. @strong{@emph{VaticanaStaff}} @@ -347,14 +341,14 @@ context. The @code{\new} prefix without a name is commonly used to create scores with many staves: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - \new Staff { + \new Staff \relative { % leave the Voice context to be created implicitly - c4 c + c''4 c } - \new Staff { - d4 d + \new Staff \relative { + d''4 d } >> @end lilypond @@ -362,18 +356,16 @@ scores with many staves: @noindent and to place several voices into one staff: -@lilypond[quote,verbatim,relative=2] -<< - \new Staff << - \new Voice { - \voiceOne - c8 c c4 c c - } - \new Voice { - \voiceTwo - g4 g g g - } - >> +@lilypond[quote,verbatim] +\new Staff << + \new Voice \relative { + \voiceOne + c''8 c c4 c c + } + \new Voice \relative { + \voiceTwo + g'4 g g g + } >> @end lilypond @@ -388,18 +380,16 @@ action taken: @code{\new} with or without a name will always create a fresh, distinct, context, even if one with the same name already exists: -@lilypond[quote,verbatim,relative=2] -<< - \new Staff << - \new Voice = "A" { - \voiceOne - c8 c c4 c c - } - \new Voice = "A" { - \voiceTwo - g4 g g g - } - >> +@lilypond[quote,verbatim] +\new Staff << + \new Voice = "A" \relative { + \voiceOne + c''8 c c4 c c + } + \new Voice = "A" \relative { + \voiceTwo + g'4 g g g + } >> @end lilypond @@ -428,13 +418,13 @@ from the musical content. Either of these two forms is valid: % musical content \context Voice = "one" { - \relative c'' { - c4 c c c + \relative { + c''4 c c c } } \context Voice = "two" { - \relative c'' { - g8 g g4 g g + \relative { + g'8 g g4 g g } } >> @@ -456,13 +446,13 @@ from the musical content. Either of these two forms is valid: % musical content \context Voice = "one" { - \relative c'' { - c4 c c c + \relative { + c''4 c c c } } \context Voice = "two" { - \relative c'' { - g8 g g4 g g + \relative { + g'8 g g4 g g } } >> @@ -483,8 +473,8 @@ is used to set the context in which a Scheme procedure specified with @code{\applyContext} is executed: @example -\new Staff \relative c' @{ - c1 +\new Staff \relative @{ + c'1 \context Timing \applyContext #(lambda (ctx) (newline) @@ -540,14 +530,19 @@ have to be referenced, for example, when changing staves with @code{\lyricsto} commands, or when adding further musical events to an earlier context. -There is an exception to this general rule: just one of the -@code{Voice} contexts in a @code{Staff} context or in a -@code{<<@dots{}>>} construct will always persist to the end of the -enclosing @code{Staff} context or @code{<<@dots{}>>} construct, even -though there may be periods when it has nothing to do. The context -to persist in this way will be the first one encountered in the -first enclosed @code{@{@dots{}@}} construct, ignoring any in enclosed -@code{<<@dots{}>>} constructs. +There is an exception to this general rule: inside of an +@code{@{@dots{}@}} construct (sequential music), the construct's +notion of the ``current context'' will descend whenever an element +of the sequence ends in a subcontext of the previous current +context. This avoids spurious creation of implicit contexts in a +number of situations but means that the first context descended +into will be kept alive until the end of the expression. + +In contrast, the contexts of a @code{<<@dots{}>>} construct's +(simultaneous music) expression are not carried forth, so +enclosing a context creating command in an extra pair of +@code{<<@dots{}>>} will keep the context from persisting through +all of the enclosing @code{@{@dots{}@}} sequence. Any context can be kept alive by ensuring it has something to do at every musical moment. @code{Staff} contexts are kept alive by @@ -562,8 +557,8 @@ In the following example, both voice A and voice B are kept alive in this way for the duration of the piece: @lilypond[quote,verbatim] -musicA = \relative c'' { d4 d d d } -musicB = \relative c'' { g4 g g g } +musicA = \relative { d''4 d d d } +musicB = \relative { g'4 g g g } keepVoicesAlive = { << \new Voice = "A" { s1*5 } % Keep Voice "A" alive for 5 bars @@ -601,8 +596,8 @@ melody and accompaniment would consist of several different sections, of course. @lilypond[quote,verbatim] -melody = \relative c'' { a4 a a a } -accompaniment = \relative c' { d4 d d d } +melody = \relative { a'4 a a a } +accompaniment = \relative { d'4 d d d } words = \lyricmode { These words fol -- low the mel -- o -- dy } \score { << @@ -640,14 +635,14 @@ to keep the melody line alive by simply including spacer notes to line it up correctly with the accompaniment: @lilypond[quote,verbatim] -melody = \relative c'' { +melody = \relative { s1 % skip a bar - a4 a a a + a'4 a a a s1 % skip a bar a4 a a a } -accompaniment = \relative c' { - d4 d d d +accompaniment = \relative { + d'4 d d d d4 d d d d4 d d d d4 d d d @@ -727,16 +722,16 @@ where the @dots{} should be the name of an engraver. Here is a simple example which removes @code{Time_signature_engraver} and @code{Clef_engraver} from a @code{Staff} context, -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << - \new Staff { - f2 g + \new Staff \relative { + f'2 g } \new Staff \with { \remove "Time_signature_engraver" \remove "Clef_engraver" - } { - f2 g2 + } \relative { + f'2 g2 } >> @end lilypond @@ -756,7 +751,7 @@ within the measure, etc. By moving these engraver from @code{Score} to time signature. @cindex polymetric scores -@cindex Time signatures, multiple +@cindex time signature, multiple @lilypond[quote,verbatim] \score { @@ -765,17 +760,17 @@ time signature. \consists "Timing_translator" \consists "Default_bar_line_engraver" } - \relative c'' { + \relative { \time 3/4 - c4 c c c c c + c''4 c c c c c } \new Staff \with { \consists "Timing_translator" \consists "Default_bar_line_engraver" } - \relative c'' { + \relative { \time 2/4 - c4 c c c c c + c''4 c c c c c } >> \layout { @@ -882,8 +877,8 @@ An @code{\override} command, but with the context name omitted @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Thicker stems" a a a + \relative { + a'4^"Thicker stems" a a a a4 a a\ff a } \layout { @@ -900,8 +895,8 @@ Directly setting a context property @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a\ff a } \layout { @@ -919,8 +914,8 @@ expression like @code{\accidentalStyle dodecaphonic} @lilypond[quote,verbatim] \score { - \relative c'' { - a4^"Dynamics above" a a a + \relative { + a'4^"Dynamics above" a a a a4 a a\ff a } \layout { @@ -948,8 +943,8 @@ StaffDefaults = \with { \score { \new Staff { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -976,8 +971,8 @@ the same command written in the music stream. @lilypond[quote,verbatim] \score { \new Staff { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -1025,8 +1020,8 @@ An @code{\override} command, but with the context name omitted \new Staff { \new Voice \with { \override Stem.thickness = #4.0 } { - \relative c'' { - a4^"Thick stems" a a a + \relative { + a'4^"Thick stems" a a a a4 a a a } } @@ -1041,15 +1036,15 @@ Directly setting a context property \score { << \new Staff { - \relative c'' { - a4^"Default font" a a a + \relative { + a'4^"Default font" a a a a4 a a a } } \new Staff \with { fontSize = #-4 } { - \relative c'' { - a4^"Smaller font" a a a + \relative { + a'4^"Smaller font" a a a a4 a a a } } @@ -1065,8 +1060,8 @@ A predefined command such as @code{\dynamicUp} << \new Staff { \new Voice { - \relative c'' { - a4^"Dynamics below" a a a + \relative { + a'4^"Dynamics below" a a a a4 a a\ff a } } @@ -1075,8 +1070,8 @@ A predefined command such as @code{\dynamicUp} { \new Voice \with { \dynamicUp } { - \relative c'' { - a4^"Dynamics above" a a a + \relative { + a'4^"Dynamics above" a a a a4 a a\ff a } } @@ -1130,17 +1125,11 @@ Notation Reference: @cindex engravers, including in contexts @funindex \alias -@funindex alias @funindex \name -@funindex name @funindex \type -@funindex type @funindex \consists -@funindex consists @funindex \accepts -@funindex accepts @funindex \denies -@funindex denies Specific contexts, like @code{Staff} and @code{Voice}, are made from simple building blocks. It is possible to create new types of @@ -1168,8 +1157,8 @@ to indicate improvisation in jazz pieces, \accepts "ImproVoice" }} -\relative c'' { - a4 d8 bes8 \new ImproVoice { c4^"ad lib" c +\relative { + a'4 d8 bes8 \new ImproVoice { c4^"ad lib" c c4 c^"undress" c_"while playing :)" c } a1 } @@ -1278,11 +1267,39 @@ contexts. Therefore, we modify the @code{Staff} definition with the @} @end example +@funindex \inherit-acceptability +Often when reusing an existing context definition, the resulting +context can be used anywhere where the original context would have +been useful. + +@example +\layout @{ + @dots{} + \inherit-acceptability @var{to} @var{from} +@} +@end example + +@noindent +will arrange to have contexts of type @var{to} accepted by all +contexts also accepting @var{from}. For example, using + +@example +\layout @{ + @dots{} + \inherit-acceptability "ImproVoice" "Voice" +@} +@end example + +@noindent +will add an @code{\accepts} for @code{ImproVoice} to both +@code{Staff} and @code{RhythmicStaff} definitions. + @funindex \denies The opposite of @code{\accepts} is @code{\denies}, which is sometimes needed when reusing existing context definitions. -Putting both into a @code{\layout} block, like +Arranging the required pieces into a @code{\layout} block leaves +us with @example \layout @{ @@ -1290,18 +1307,15 @@ Putting both into a @code{\layout} block, like \name ImproVoice @dots{} @} - \context @{ - \Staff - \accepts "ImproVoice" - @} + \inherit-acceptability "ImproVoice" "Voice" @} @end example Then the output at the start of this subsection can be entered as @example -\relative c'' @{ - a4 d8 bes8 +\relative @{ + a'4 d8 bes8 \new ImproVoice @{ c4^"ad lib" c c4 c^"undress" @@ -1318,7 +1332,6 @@ depends on the same context relations. @seealso Internals Reference: -@rinternals{Engraver_group}, @rinternals{Note_heads_engraver}, @rinternals{Text_engraver}, @rinternals{Rhythmic_column_engraver}, @@ -1470,10 +1483,8 @@ Installed Files: Suppose we want to move the fingering indication in the fragment below: -@lilypond[quote,relative=2,verbatim] -c-2 -\stemUp -f +@lilypond[quote,fragment,verbatim] +c''-2 @end lilypond If you visit the documentation on fingering instructions (in @@ -1688,10 +1699,8 @@ is directly generated from this definition. Recall that we wanted to change the position of the @b{2} in -@lilypond[quote,relative=2,verbatim] -c-2 -\stemUp -f +@lilypond[quote,fragment,verbatim] +c''-2 @end lilypond Since the @b{2} is vertically positioned next to its note, we have to @@ -1720,28 +1729,24 @@ Add this much extra space between objects that are next to each other. @end table @end quotation -By increasing the value of @code{padding}, we can move the -fingering away from the note head. The following command inserts -3 staff spaces of white -between the note and the fingering: +By increasing the value of @code{padding}, we can move the fingering +away from the note head. The following command will insert @qq{three +staff spaces} worth of distance between the note and a fingering mark: + @example \once \override Voice.Fingering.padding = #3 @end example -Inserting this command before the Fingering object is created, -i.e., before @code{c2}, yields the following result: +Inserting the padding before the fingering object is created results in +the following: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,fragment,verbatim] \once \override Voice.Fingering.padding = #3 -c-2 -\stemUp -f +c''-2 @end lilypond - -In this case, the context for this tweak is @code{Voice}. This -fact can also be deduced from the program reference, for the page for -the @rinternals{Fingering_engraver} plug-in says +In this case, the context for this tweak is @code{Voice}. See +@rinternals{Fingering_engraver} plug-in, which says: @quotation Fingering_engraver is part of contexts: @dots{} @rinternals{Voice} @@ -1755,25 +1760,33 @@ Another thing that is needed, is an overview of the various naming conventions: @itemize -@item scheme functions: lowercase-with-hyphens (incl. one-word +@item scheme functions: lowercase-with-hyphens (also includes one-word names) -@item scheme functions: ly:plus-scheme-style + +@item LilyPond-specific scheme functions: ly:plus-scheme-style + @item music events, music classes and music properties: as-scheme-functions + @item Grob interfaces: scheme-style + @item backend properties: scheme-style (but X and Y!) + @item contexts (and MusicExpressions and grobs): Capitalized or CamelCase + @item context properties: lowercaseFollowedByCamelCase -@item engravers: -Capitalized_followed_by_lowercase_and_with_underscores + +@item engravers: Capitalized_followed_by_lowercase_and_with_underscores @end itemize Questions to be answered: @itemize + @item Which of these are conventions and which are rules? + @item Which are rules of the underlying language, and which are -LP-specific? +LilyPond-specific? @end itemize @node Modifying properties @@ -1839,12 +1852,12 @@ unit). Since the command specifies @code{Staff} as context, it only applies to the current staff. Other staves will keep their normal appearance. Here we see the command in action: -@lilypond[quote,verbatim,relative=2] -c4 +@lilypond[quote,fragment,verbatim] +c''4 \override Staff.Stem.thickness = #4.0 -c4 -c4 -c4 +c''4 +c''4 +c''4 @end lilypond The @code{\override} command changes the definition of the @code{Stem} @@ -1855,11 +1868,11 @@ Analogous to @code{\set}, the @var{context} argument may be left out, causing the default context @code{Voice} to be used. Adding @code{\once} applies the change during one timestep only. -@lilypond[quote,verbatim,relative=2] -c4 +@lilypond[quote,fragment,verbatim] +c''4 \once \override Stem.thickness = #4.0 -c4 -c4 +c''4 +c''4 @end lilypond The @code{\override} must be done before the object is @@ -1867,11 +1880,11 @@ started. Therefore, when altering @emph{Spanner} objects such as slurs or beams, the @code{\override} command must be executed at the moment when the object is created. In this example, -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \override Slur.thickness = #3.0 -c8[( c +c''8[( c'' \override Beam.beam-thickness = #0.6 -c8 c]) +c''8 c'']) @end lilypond @noindent @@ -1939,7 +1952,7 @@ the @code{#}@tie{}character. Contexts properties are usually named in @code{studlyCaps}. They mostly control the translation from -music to notation, e.g. @code{localKeySignature} (for determining +music to notation, e.g. @code{localAlterations} (for determining whether to print accidentals), or @code{measurePosition} (for determining when to print a bar line). Context properties can change value over time while interpreting a piece of music; @@ -1949,7 +1962,7 @@ this. Context properties are modified with @code{\set}. For example, multimeasure rests will be combined into a single bar if the context property @code{skipBars} is set to @code{#t}: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] R1*2 \set Score.skipBars = ##t R1*2 @@ -1959,17 +1972,16 @@ If the @var{context} argument is left out, then the property will be set in the current bottom context (typically @code{ChordNames}, @code{Voice}, @code{TabVoice}, or @code{Lyrics}). -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \set Score.autoBeaming = ##f -<< - { - e8 e e e - \set autoBeaming = ##t - e8 e e e - } \\ { - c8 c c c c8 c c c - } ->> +\relative { + e''8 e e e + \set autoBeaming = ##t + e8 e e e +} \\ +\relative { + c''8 c c c c8 c c c +} @end lilypond The change is applied @q{on-the-fly}, during the music, so that the @@ -1981,7 +1993,7 @@ that you wish to change -- for example, attempting to set the @code{Voice}, will have no effect, because skipBars is a property of the @code{Score} context. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] R1*2 \set skipBars = ##t R1*2 @@ -2006,18 +2018,17 @@ the definition only if it is set in @var{context}. Properties that have been set in enclosing contexts will not be altered by an unset in an enclosed context: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \set Score.autoBeaming = ##t -<< - { - \unset autoBeaming - e8 e e e - \unset Score.autoBeaming - e8 e e e - } \\ { - c8 c c c c8 c c c - } ->> +\relative { + \unset autoBeaming + e''8 e e e + \unset Score.autoBeaming + e8 e e e +} \\ +\relative { + c''8 c c c c8 c c c +} @end lilypond Like @code{\set}, the @var{context} argument does not have to be @@ -2033,14 +2044,14 @@ are equivalent if the current bottom context is @code{Voice}. @cindex \once -Preceding a @code{\set} command by @code{\once} makes the -setting apply to only a single time-step: +Preceding a @code{\set} or @code{\unset} command by @code{\once} +makes the setting apply to only a single time-step: -@lilypond[quote,verbatim,relative=2] -c4 +@lilypond[quote,fragment,verbatim] +c''4 \once \set fontSize = #4.7 -c4 -c4 +c''4 +c''4 @end lilypond A full description of all available context properties is in the @@ -2082,27 +2093,27 @@ For example, we can increase the thickness of a note stem by overriding the @code{thickness} property of the @code{Stem} object: -@lilypond[quote,verbatim,relative=2] -c4 c +@lilypond[quote,fragment,verbatim] +c''4 c'' \override Voice.Stem.thickness = #3.0 -c4 c +c''4 c'' @end lilypond If no context is specified in an @code{\override}, the bottom context is used: -@lilypond[quote,verbatim,relative=2] -{ \override Staff.Stem.thickness = #3.0 - << - { - e4 e - \override Stem.thickness = #0.5 - e4 e - } \\ { - c4 c c c - } - >> -} +@lilypond[quote,fragment,verbatim] +\override Staff.Stem.thickness = #3.0 +<< + \relative { + e''4 e + \override Stem.thickness = #0.5 + e4 e + } \\ + \relative { + c''4 c c c + } +>> @end lilypond Some tweakable options are called @q{subproperties} and reside inside @@ -2133,52 +2144,52 @@ The syntax for the @code{\revert} command is For example, -@lilypond[quote,verbatim,relative=2] -c4 -\override Voice.Stem.thickness = #3.0 -c4 c -\revert Voice.Stem.thickness -c4 +@lilypond[quote,verbatim] +\relative { + c''4 + \override Voice.Stem.thickness = #3.0 + c4 c + \revert Voice.Stem.thickness + c4 +} @end lilypond The effects of @code{\override} and @code{\revert} apply to all grobs in the affected context from the current time forward: -@lilypond[quote,verbatim,relative=2] -{ - << - { - e4 - \override Staff.Stem.thickness = #3.0 - e4 e e - } \\ { - c4 c c - \revert Staff.Stem.thickness - c4 - } - >> -} +@lilypond[quote,verbatim] +<< + \relative { + e''4 + \override Staff.Stem.thickness = #3.0 + e4 e e + } \\ + \relative { + c''4 c c + \revert Staff.Stem.thickness + c4 + } +>> @end lilypond @funindex \once @cindex overriding for only one moment -@code{\once} can be used with @code{\override} +@code{\once} can be used with @code{\override} or @code{\revert} to affect only the current time step: -@lilypond[quote,verbatim,relative=2] -{ - << - { - \override Stem.thickness = #3.0 - e4 e e e - } \\ { - c4 - \once \override Stem.thickness = #3.0 - c4 c c - } - >> -} +@lilypond[quote,verbatim] +<< + \relative c { + \override Stem.thickness = #3.0 + e''4 e e e + } \\ + \relative { + c''4 + \once \override Stem.thickness = #3.0 + c4 c c + } +>> @end lilypond @@ -2248,16 +2259,18 @@ graphical objects. For objects that are created directly from an item in the input file, you can use the @code{\tweak} command. For example: -@lilypond[relative=2,verbatim,quote] -< c - \tweak color #red - d - g - \tweak duration-log #1 - a -> 4 --\tweak padding #8 --^ +@lilypond[verbatim,quote] +\relative { + < c'' + \tweak color #red + d + g + \tweak duration-log #1 + a + > 4 + -\tweak padding #8 + -^ +} @end lilypond @@ -2283,15 +2296,15 @@ note, and able to modify it. So, this works: -@lilypond[relative=2,verbatim,quote] -<\tweak color #red c>4 +@lilypond[verbatim,fragment,quote] +<\tweak color #red c''>4 @end lilypond @noindent but this does not: -@lilypond[relative=2,verbatim,quote] -\tweak color #red c4 +@lilypond[verbatim,fragment,quote] +\tweak color #red c''4 @end lilypond @end ignore @@ -2320,20 +2333,20 @@ include the following: In this example, the color of one note head and the type of another note head are modified within a single chord: -@lilypond[relative=2,verbatim,quote] -< c +@lilypond[verbatim,fragment,quote] +< c'' \tweak color #red - d - g + d'' + g'' \tweak duration-log #1 - a + a'' > 4 @end lilypond @code{\tweak} can be used to modify slurs: -@lilypond[verbatim,quote,relative=1] -c-\tweak thickness #5 ( d e f) +@lilypond[verbatim,quote] +\relative { c'-\tweak thickness #5 ( d e f) } @end lilypond @@ -2344,10 +2357,10 @@ Tweaking a whole chord does not do anything since its music event only acts as a container, and all layout objects are created from events inside of the @code{EventChord}: -@lilypond[relative=2,verbatim,quote] -\tweak color #red c4 -\tweak color #red 4 -<\tweak color #red c e>4 +@lilypond[verbatim,fragment,quote] +\tweak color #red c''4 +\tweak color #red 4 +<\tweak color #red c'' e''>4 @end lilypond The simple @code{\tweak} command cannot be used to modify any object @@ -2361,10 +2374,10 @@ Such indirectly created layout objects can be tweaked using the form of the @code{\tweak} command in which the grob name is specified explicitly: -@lilypond[relative=2,verbatim,quote] +@lilypond[fragment,verbatim,quote] \tweak Stem.color #red -\tweak Beam.color #green c8 e -4 +\tweak Beam.color #green c''8 e'' +4 @end lilypond @code{\tweak} cannot be used to modify clefs or time @@ -2375,14 +2388,14 @@ insertion of extra elements required to specify the context. Several @code{\tweak} commands may be placed before a notational element -- all affect it: -@lilypond[verbatim,quote,relative=1] -c --\tweak style #'dashed-line --\tweak dash-fraction #0.2 --\tweak thickness #3 --\tweak color #red - \glissando -f' +@lilypond[verbatim,fragment,quote] +c' + -\tweak style #'dashed-line + -\tweak dash-fraction #0.2 + -\tweak thickness #3 + -\tweak color #red + \glissando +f'' @end lilypond The music stream which is generated from a section of an input file, @@ -2415,56 +2428,59 @@ one encountered in the input file. @funindex \set @funindex \override -Both @code{\set} and @code{\override} manipulate properties -associated with contexts. In either case, properties heed the -hierarchy of contexts: properties not set in a context itself show -the values of the respective parent context. - -Values and lifetime of context properties are dynamic and only -available when music is being interpreted, @q{iterated}. At the -time of context creation, properties are initialized from the -corresponding context definition and possible context -modifications. Afterwards, changes are achieved with -property-setting commands in the music itself. - -Now grob definitions are a special category of context properties. -Since their structure, bookkeeping and use is different from -ordinary context properties, they are accessed with a different -set of commands, and treated separately in the documentation. - -As opposed to plain context properties, grob definitions are -subdivided into grob properties. A @qq{grob} (graphical object) -is usually created by an engraver at the time of interpreting a -music expression and receives its initial properties from the -current grob definition of the engraver's context. The engraver -(or other @q{backend} parts of LilyPond) may subsequently add or -change properties to the grob, but that does not affect the -context's grob definition. - -What we call @q{grob properties} in the context of user-level -tweaking are actually the properties of a context's grob -definition. In contrast to ordinary context properties, grob -definitions have the bookkeeping required to keep track of its -parts, the individual grob properties (and even subproperties of -them) separately so that it is possible to define those parts in -different contexts and have the overall grob definition at the -time of grob creation be assembled from pieces provided in -different contexts among the current context and its parents. - -Grob definitions are manipulated using @code{\override} and -@code{\revert} and have a name starting with a capital letter -(like @samp{NoteHead}) whereas ordinary context properties are -manipulated using @code{\set} and @code{\unset} and are named -starting with a lowercase letter. + +The @code{\set} and @code{\override} commands manipulate properties +associated with contexts. In both cases, the properties follow a +@emph{hierarchy of contexts}; properties that are not set themselves in +a context will still show the values of their respective parent's +context. + +The lifetime and value of a context property is dynamic and only +available when music is being interpreted (i.e. @q{iterated}). At the +time of the context's creation, properties are initialized from its +corresponding definitions (along with any other modifications) of that +context. Any subsequent changes are achieved with any +@q{property-setting} commands that are within the music itself. + +Graphical Object (or @qq{grob}) definitions are a @emph{special} +category of context properties as their structure and use is different +from that of normal context properties. Unlike normal context +properties, grob definitions are subdivided into @emph{grob properties}. + +Also, in contrast to normal context properties, grob definitions have +their own internal @q{bookkeeping} used to keep track of their own +individual grob properties and any sub-properties. This means that it +is possible to define those parts within different contexts and yet +still have the overall grob definition at the time of grob creation from +all the pieces provided amongst the current context and its parent(s). + +A grob is usually created by an engraver at the time of interpreting a +music expression and receives its initial properties from the current +grob definition of the engraver's context. The engraver (or other +@q{backend} parts of LilyPond) can then change (or add to) the grob's +initial properties. However, this does not affect the context's own +grob definition. + +What LilyPond calls @emph{grob properties} in the context of +@q{user-level} tweaks are really the properties of a @emph{context's} +own grob definition. + +Grob definitions are accessed with a different set of commands and are +manipulated using @code{\override} and @code{\revert} and have a name +starting with a capital letter (e.g. @samp{NoteHead}); whereas normal +context properties are manipulated using @code{\set} and @code{\unset} +and are named starting with a lowercase letter. @cindex tweak, relation to @code{\override} @funindex \tweak @funindex \overrideProperty -The special commands @code{\tweak} and @code{\overrideProperty} -change grob properties bypassing context properties completely. -Instead they catch grobs as they are being created and then -directly set properties on them when they originate from a tweaked -music event or are of a particular kind, respectively. + +The commands @code{\tweak} and @code{\overrideProperty} change grob +properties by bypassing all context properties completely and, instead, +catch grobs as they are being created, setting properties on them for +a music event (@code{\tweak}) or, in the case of +@code{\overrideProperty} for a specific override. + @node Modifying alists @subsection Modifying alists @@ -2573,7 +2589,7 @@ values. Unless this is the intended result, it is safer to update key-values individually with a nested declaration. @warning{Nested declarations will not work for context property -alists (such as @code{beamExceptions}, @code{keySignature}, +alists (such as @code{beamExceptions}, @code{keyAlterations}, @code{timeSignatureSettings}, etc.). These properties can only be modified by completely re-defining them as alists.} @@ -2586,6 +2602,7 @@ modified by completely re-defining them as alists.} * Input modes:: * Direction and placement:: * Distances and measurements:: +* Dimensions:: * Staff symbol properties:: * Spanners:: * Visibility of objects:: @@ -2599,7 +2616,7 @@ modified by completely re-defining them as alists.} The way in which the notation contained within an input file is interpreted is determined by the current input mode. -@strong{Chord mode} +@subsubsubheading Chord mode This is activated with the @code{\chordmode} command, and causes input to be interpreted with the syntax of chord notation, see @@ -2611,7 +2628,7 @@ causes the following input to be interpreted with the syntax of chord notation and rendered as chord names in the @code{ChordNames} context, see @ref{Printing chord names}. -@strong{Drum mode} +@subsubsubheading Drum mode This is activated with the @code{\drummode} command, and causes input to be interpreted with the syntax of drum notation, see @@ -2620,10 +2637,10 @@ input to be interpreted with the syntax of drum notation, see Drum mode is also activated with the @code{\drums} command. This also creates a new @code{DrumStaff} context and causes the following input to be interpreted with the syntax of drum notation -and rendered as drum symbols on a drum staff, see @ref{Basic -percussion notation}. +and rendered as drum symbols on a drum staff, see +@ref{Basic percussion notation}. -@strong{Figure mode} +@subsubsubheading Figure mode This is activated with the @code{\figuremode} command, and causes input to be interpreted with the syntax of figured bass, see @@ -2635,7 +2652,7 @@ following input to be interpreted with the figured bass syntax and rendered as figured bass symbols in the @code{FiguredBass} context, see @ref{Introduction to figured bass}. -@strong{Fret and tab modes} +@subsubsubheading Fret and tab modes There are no special input modes for entering fret and tab symbols. @@ -2645,11 +2662,11 @@ render them in a @code{TabStaff} context, see To create fret diagrams above a staff, you have two choices. You can either use the @code{FretBoards} context (see -@ref{Automatic fret diagrams} or you can enter them as a markup +@ref{Automatic fret diagrams}) or you can enter them as a markup above the notes using the @code{\fret-diagram} command (see @ref{Fret diagram markups}). -@strong{Lyrics mode} +@subsubsubheading Lyrics mode This is activated with the @code{\lyricmode} command, and causes input to be interpreted as lyric syllables with optional durations @@ -2660,15 +2677,13 @@ This also creates a new @code{Lyrics} context and an implicit @code{\lyricsto} command which associates the following lyrics with the preceding music. -@strong{Markup mode} +@subsubsubheading Markup mode This is activated with the @code{\markup} command, and causes input to be interpreted with the syntax of markup, see @ref{Text markup commands}. -@c silly work-around for texinfo broken-ness -@c (@strong{Note...} causes a spurious cross-reference in Info) -@b{Note mode} +@subsubsubheading Note mode This is the default mode or it may be activated with the @code{\notemode} command. Input is interpreted as pitches, @@ -2679,23 +2694,6 @@ it may be useful to do so in certain situations, for example if you are in lyric mode, chord mode or any other mode and want to insert something that only can be done with note mode syntax. -For example, to indicate dynamic markings for the verses of a -choral pieces it is necessary to enter note mode to interpret -the markings: - -@lilypond[verbatim,relative=2,quote] -{ c4 c4 c4 c4 } -\addlyrics { - \notemode{\set stanza = \markup{ \dynamic f 1. } } - To be sung loudly -} -\addlyrics { - \notemode{\set stanza = \markup{ \dynamic p 2. } } - To be sung quietly -} -@end lilypond - - @node Direction and placement @subsection Direction and placement @@ -2713,6 +2711,7 @@ be desirable to force a particular direction or placement. * The direction property:: @end menu + @node Articulation direction indicators @unnumberedsubsubsec Articulation direction indicators @@ -2740,13 +2739,16 @@ but a direction indicator is @strong{always} required before Direction indicators affect only the next note: -@lilypond[verbatim,quote,relative=2] -c2( c) -c2_( c) -c2( c) -c2^( c) +@lilypond[verbatim,quote] +\relative { + c''2( c) + c2_( c) + c2( c) + c2^( c) +} @end lilypond + @node The direction property @unnumberedsubsubsec The direction property @@ -2786,18 +2788,20 @@ TrillPitchGroup - not tried These indications affect all notes until they are canceled. -@lilypond[verbatim,quote,relative=2] -c2( c) -\slurDown -c2( c) -c2( c) -\slurNeutral -c2( c) +@lilypond[verbatim,quote] +\relative { + c''2( c) + \slurDown + c2( c) + c2( c) + \slurNeutral + c2( c) +} @end lilypond In polyphonic music, it is generally better to specify an explicit -@code{voice} than change an object's direction. For more information. -See @ref{Multiple voices}. +@code{voice} than change an object's direction. For more information, +see @ref{Multiple voices}. @seealso Learning Manual: @@ -2864,6 +2868,35 @@ Notation Reference: @ref{Setting the staff size}. +@node Dimensions +@subsection Dimensions + +@cindex dimensions +@cindex bounding box + +The dimensions of a graphical object specify the positions of the left +and right edges and the bottom and top edges of the objects' bounding +box as distances from the objects' reference point in units of +staff-spaces. These positions are usually coded as two Scheme pairs. +For example, the text markup command @code{\with-dimensions} takes +three arguments, the first two of which are a Scheme pair giving the +left and right edge positions and a Scheme pair giving the bottom and +top edge positions: + +@example +\with-dimensions #'(-5 . 10) #'(-3 . 15) @var{arg} +@end example + +This specifies a bounding box for @var{arg} with its left edge at -5, +its right edge at 10, its bottom edge at -3 and its top edge at 15, +all measured from the objects' reference point in units of +staff-spaces. + +@seealso +Notation Reference: +@ref{Distances and measurements}. + + @node Staff symbol properties @subsection Staff symbol properties @@ -2885,22 +2918,22 @@ note positions are not influenced by the staff line positions. implicitly defined by the number of elements in the list of values for @code{'line-positions}.} -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.line-positions = #'(7 3 0 -4 -6 -7) } -{ a4 e' f b | d1 } +\relative { a4 e' f b | d1 } @end lilypond The width of a staff can be modified. The units are staff spaces. The spacing of objects inside the staff is not affected by this setting. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.width = #23 } -{ a4 e' f b | d1 } +\relative { a4 e' f b | d1 } @end lilypond @@ -2958,44 +2991,49 @@ Works not at all for: @end ignore -@lilypond[verbatim,quote,relative=2] -a~ a -a +@lilypond[verbatim,quote,fragment] +a'~ a' +a' % increase the length of the tie -\tweak minimum-length #5 -~ a +~ a' @end lilypond -@lilypond[verbatim,quote,relative=2] -a1 -\compressFullBarRests -R1*23 -% increase the length of the rest bar -\once \override MultiMeasureRest.minimum-length = #20 -R1*23 -a1 +@lilypond[verbatim,quote] +\relative \compressMMRests { + a'1 + R1*23 + % increase the length of the rest bar + \once \override MultiMeasureRest.minimum-length = #20 + R1*23 + a1 +} @end lilypond -@lilypond[verbatim,quote,relative=2] -a \< a a a \! -% increase the length of the hairpin -\override Hairpin.minimum-length = #20 -a \< a a a \! +@lilypond[verbatim,quote] +\relative { + a' \< a a a \! + % increase the length of the hairpin + \override Hairpin.minimum-length = #20 + a \< a a a \! +} @end lilypond This override can also be used to increase the length of slurs and phrasing slurs: -@lilypond[verbatim,quote,relative=2] -a( g) -a --\tweak minimum-length #5 -( g) +@lilypond[verbatim,quote] +\relative { + a'( g) + a + -\tweak minimum-length #5 + ( g) -a\( g\) -a --\tweak minimum-length #5 -\( g\) + a\( g\) + a + -\tweak minimum-length #5 + \( g\) +} @end lilypond For some layout objects, the @code{minimum-length} property becomes @@ -3005,31 +3043,31 @@ be set to @code{ly:spanner::set-spacing-rods}. For example, the minimum length of a glissando has no effect unless the @code{springs-and-rods} property is set: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,fragment,quote] % default -e \glissando c' +e' \glissando c'' % not effective alone \once \override Glissando.minimum-length = #20 -e, \glissando c' +e' \glissando c'' % effective only when both overrides are present \once \override Glissando.minimum-length = #20 \once \override Glissando.springs-and-rods = #ly:spanner::set-spacing-rods -e, \glissando c' +e' \glissando c'' @end lilypond The same is true of the @code{Beam} object: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,fragment,quote] % not effective alone \once \override Beam.minimum-length = #20 -e8 e e e +e'8 e' e' e' % effective only when both overrides are present \once \override Beam.minimum-length = #20 \once \override Beam.springs-and-rods = #ly:spanner::set-spacing-rods -e8 e e e +e'8 e' e' e' @end lilypond @subsubsubheading The @code{to-barline} property @@ -3041,10 +3079,12 @@ end instead on the immediately preceding bar line. If set to false, the spanner will extend beyond the bar line and end on the note itself: -@lilypond[verbatim,quote,relative=2] -a \< a a a a \! a a a \break -\override Hairpin.to-barline = ##f -a \< a a a a \! a a a +@lilypond[verbatim,quote] +\relative { + a' \< a a a a \! a a a \break + \override Hairpin.to-barline = ##f + a \< a a a a \! a a a +} @end lilypond This property is not effective for all spanners. For example, @@ -3066,7 +3106,7 @@ Objects which support the @code{line-spanner-interface} include @end itemize The routine responsible for drawing the stencils for these spanners is -@code{ly:line-interface::print}. This routine determines the +@code{ly:line-spanner::print}. This routine determines the exact location of the two end points and draws a line between them, in the style requested. The locations of the two end points of the spanner are computed on-the-fly, but it is @@ -3075,11 +3115,11 @@ properties which need to be specified are nested two levels down within the property hierarchy, but the syntax of the @code{\override} command is quite simple: -@lilypond[relative=2,quote,verbatim] -e2 \glissando b +@lilypond[quote,fragment,verbatim] +e''2 \glissando b' \once \override Glissando.bound-details.left.Y = #3 \once \override Glissando.bound-details.right.Y = #-2 -e2 \glissando b +e''2 \glissando b' @end lilypond The units for the @code{Y} property are @code{staff-space}s, @@ -3095,11 +3135,11 @@ In case of a line break, the values for the end points are specified by the @code{left-broken} and @code{right-broken} sub-lists of @code{bound-details}. For example: -@lilypond[relative=2,ragged-right,verbatim,quote] +@lilypond[ragged-right,fragment,verbatim,quote] \override Glissando.breakable = ##t \override Glissando.bound-details.right-broken.Y = #-3 -c1 \glissando \break -f1 +c''1 \glissando \break +f''1 @end lilypond @@ -3136,10 +3176,10 @@ recommended that @code{text} be used instead. This is a markup that is evaluated to yield the stencil. It is used to put @i{cresc.}, @i{tr} and other text on horizontal spanners. -@lilypond[quote,ragged-right,relative=2,verbatim] +@lilypond[quote,ragged-right,fragment,verbatim] \override TextSpanner.bound-details.left.text = \markup { \small \bold Slower } -c2\startTextSpan b c a\stopTextSpan +\relative { c''2\startTextSpan b c a\stopTextSpan } @end lilypond @item stencil-align-dir-y @@ -3150,13 +3190,14 @@ end-point, centered on the line, as defined by the @code{X} and or @code{stencil-offset} will move the symbol at the edge vertically relative to the end point of the line: -@lilypond[relative=1,quote,verbatim] +@lilypond[quote,fragment,verbatim] \override TextSpanner.bound-details.left.stencil-align-dir-y = #-2 \override TextSpanner.bound-details.right.stencil-align-dir-y = #UP \override TextSpanner.bound-details.left.text = #"ggg" \override TextSpanner.bound-details.right.text = #"hhh" -c4^\startTextSpan c c c \stopTextSpan + +\relative { c'4^\startTextSpan c c c \stopTextSpan } @end lilypond Note that negative values move the text @emph{up}, contrary to the @@ -3167,7 +3208,7 @@ the top edge of the text with the spanner line. @item arrow Setting this sub-property to @code{#t} produces an arrowhead at the -end of the line. +end-points of the line. @item padding This sub-property controls the space between the specified @@ -3182,11 +3223,13 @@ is terminated after exactly one note, or at the following bar line if @code{to-barline} is true and a bar line occurs before the next note. -@lilypond[verbatim,quote,ragged-right,relative=2] -\endSpanners -c2 \startTextSpan c2 c2 -\endSpanners -c2 \< c2 c2 +@lilypond[verbatim,quote,ragged-right] +\relative c'' { + \endSpanners + c2 \startTextSpan c2 c2 + \endSpanners + c2 \< c2 c2 +} @end lilypond When using @code{\endSpanners} it is not necessary to close @@ -3242,7 +3285,7 @@ is overridden to @code{#f} no function will be called and the object will not be drawn. The default action can be recovered with @code{\revert}. -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,fragment,verbatim] a1 a \override Score.BarLine.stencil = ##f a a @@ -3252,7 +3295,7 @@ a a a This rather common operation has a shortcut @code{\omit}: -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,fragment,verbatim] a1 a \omit Score.BarLine a a @@ -3270,18 +3313,18 @@ Every layout object has a transparent property which by default is set to @code{#f}. If set to @code{#t} the object still occupies space but is made invisible. -@lilypond[quote,verbatim,relative=2] -a4 a +@lilypond[quote,fragment,verbatim] +a'4 a' \once \override NoteHead.transparent = ##t -a a +a' a' @end lilypond This rather common operation has a shortcut @code{\hide}: -@lilypond[quote,verbatim,relative=2] -a4 a +@lilypond[quote,fragment,verbatim] +a'4 a' \once \hide NoteHead -a a +a' a' @end lilypond @node Painting objects white @@ -3303,9 +3346,9 @@ points will be determined by the order in which they are drawn, and this may leave a ghostly image of the white object, as shown here: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \override Staff.Clef.color = #white -a1 +a'1 @end lilypond This may be avoided by changing the order of printing the objects. @@ -3324,10 +3367,10 @@ value of @code{1}, is drawn after the staff lines (default the @code{Clef} object must be given in a lower value of @code{layer}, say @w{@code{-1}}, so that it is drawn earlier: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,fragment,verbatim] \override Staff.Clef.color = #white \override Staff.Clef.layer = #-1 -a1 +a'1 @end lilypond @node Using break-visibility @@ -3369,18 +3412,18 @@ by pre-defined functions, defined in @file{scm/output-lib.scm}, where the last three columns indicate whether the layout objects will be visible in the positions shown at the head of the columns: -@multitable {@code{begin-of-line-invisible}} {@code{'#(#t #t #t)}} {Before} {At no} {After} -@headitem Function @tab Vector @tab Before @tab At no @tab After -@headitem form @tab form @tab break @tab break @tab break - -@item @code{all-visible} @tab @code{'#(#t #t #t)} @tab yes @tab yes @tab yes -@item @code{begin-of-line-visible} @tab @code{'#(#f #f #t)} @tab no @tab no @tab yes -@item @code{center-visible} @tab @code{'#(#f #t #f)} @tab no @tab yes @tab no -@item @code{end-of-line-visible} @tab @code{'#(#t #f #f)} @tab yes @tab no @tab no -@item @code{begin-of-line-invisible} @tab @code{'#(#t #t #f)} @tab yes @tab yes @tab no -@item @code{center-invisible} @tab @code{'#(#t #f #t)} @tab yes @tab no @tab yes -@item @code{end-of-line-invisible} @tab @code{'#(#f #t #t)} @tab no @tab yes @tab yes -@item @code{all-invisible} @tab @code{'#(#f #f #f)} @tab no @tab no @tab no +@multitable {@code{begin-of-line-invisible}} {@code{#(#t #t #t)}} {Before} {At no} {After} +@headitem Function @tab Vector @tab Before @tab At no @tab After +@headitem form @tab form @tab break @tab break @tab break + +@item @code{all-visible} @tab @code{#(#t #t #t)} @tab yes @tab yes @tab yes +@item @code{begin-of-line-visible} @tab @code{#(#f #f #t)} @tab no @tab no @tab yes +@item @code{center-visible} @tab @code{#(#f #t #f)} @tab no @tab yes @tab no +@item @code{end-of-line-visible} @tab @code{#(#t #f #f)} @tab yes @tab no @tab no +@item @code{begin-of-line-invisible} @tab @code{#(#t #t #f)} @tab yes @tab yes @tab no +@item @code{center-invisible} @tab @code{#(#t #f #t)} @tab yes @tab no @tab yes +@item @code{end-of-line-invisible} @tab @code{#(#f #t #t)} @tab no @tab yes @tab yes +@item @code{all-invisible} @tab @code{#(#f #f #f)} @tab no @tab no @tab no @end multitable The default settings of @code{break-visibility} depend on the @@ -3415,14 +3458,16 @@ default setting of this property: The example below shows the use of the vector form to control the visibility of bar lines: -@lilypond[quote,verbatim,relative=1,ragged-right] -f4 g a b -f4 g a b -% Remove bar line at the end of the current line -\once \override Score.BarLine.break-visibility = ##(#f #t #t) -\break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + f'4 g a b + f4 g a b + % Remove bar line at the end of the current line + \once \override Score.BarLine.break-visibility = ##(#f #t #t) + \break + f4 g a b + f4 g a b +} @end lilypond Although all three components of the vector used to override @@ -3431,17 +3476,23 @@ effective with every layout object, and some combinations may even give errors. The following limitations apply: @itemize @bullet -@item Bar lines cannot be printed at start of line. -@item A bar number cannot be printed at the start of the first -line unless it is set to be different from 1. -@item Clef -- see below -@item Double percent repeats are either all printed or all -suppressed. Use begin-of line-invisible to print and -all-invisible to suppress. -@item Key signature -- see below -@item ClefModifier -- see below +@item Bar lines cannot be printed at the start of line. + +@item A bar number cannot be printed at the start of the @emph{first} +line unless it is set to be different from @code{1}. + +@item Clef -- see the next section. + +@item Double percent repeats are either @emph{all printed} or +@emph{all suppressed}. Use @code{begin-of-line-invisible} +to print them and @code{all-invisible} to suppress them. + +@item Key signature -- see the next section. + +@item ClefModifier -- see the next section. @end itemize + @node Special considerations @unnumberedsubsubsec Special considerations @@ -3461,16 +3512,18 @@ following example the key signature following the explicit change to B-flat major is still visible, even though @code{all-invisible} is set. -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -% Try to remove all key signatures -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b -\break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + % Try to remove all key signatures + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b + \break + f4 g a b + f4 g a b +} @end lilypond The visibility of such explicit key signature and clef changes is @@ -3487,15 +3540,17 @@ signatures and clefs at the beginning of lines; @code{break-visibility} must still be overridden in the appropriate object to remove these. -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond @subsubsubheading Visibility of cancelling accidentals @@ -3504,16 +3559,18 @@ To remove the cancelling accidentals printed at an explicit key change, set the Staff context property @code{printKeyCancellation} to @code{#f}: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\set Staff.printKeyCancellation = ##f -\override Staff.KeySignature.break-visibility = #all-invisible -\key bes \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \set Staff.printKeyCancellation = ##f + \override Staff.KeySignature.break-visibility = #all-invisible + \key bes \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond With these overrides only the accidentals before the notes remain @@ -3524,30 +3581,34 @@ the cancelling accidentals would be the @emph{only} indication of the key change. In this case setting @code{printKeyCancellation} to @code{#f} has no effect: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\set Staff.printKeyCancellation = ##f -\key c \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \set Staff.printKeyCancellation = ##f + \key c \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond To suppress the cancelling accidentals even when the key is changed to C@tie{}major or A@tie{}minor, override the visibility of the @code{KeyCancellation} grob instead: -@lilypond[quote,verbatim,relative=1,ragged-right] -\key g \major -f4 g a b -\set Staff.explicitKeySignatureVisibility = #all-invisible -\override Staff.KeyCancellation.break-visibility = #all-invisible -\key c \major -f4 g a b \break -f4 g a b -f4 g a b +@lilypond[quote,verbatim,ragged-right] +\relative { + \key g \major + f'4 g a b + \set Staff.explicitKeySignatureVisibility = #all-invisible + \override Staff.KeyCancellation.break-visibility = #all-invisible + \key c \major + f4 g a b \break + f4 g a b + f4 g a b +} @end lilypond @c TODO Add visibility of cautionary accidentals before notes @@ -3600,23 +3661,25 @@ These all use the same routines as the glissando for drawing the texts and the lines, and tuning their behavior is therefore also done in the same way. It is done with a spanner, and the routine responsible for drawing the spanners is -@code{ly:line-interface::print}. This routine determines the +@code{ly:line-spanner::print}. This routine determines the exact location of the two @i{span points} and draws a line between them, in the style requested. Here is an example showing the different line styles available, and how to tune them. -@lilypond[relative=2,ragged-right,verbatim,quote] -d2 \glissando d'2 -\once \override Glissando.style = #'dashed-line -d,2 \glissando d'2 -\override Glissando.style = #'dotted-line -d,2 \glissando d'2 -\override Glissando.style = #'zigzag -d,2 \glissando d'2 -\override Glissando.style = #'trill -d,2 \glissando d'2 +@lilypond[ragged-right,verbatim,quote] +\relative { + d''2 \glissando d'2 + \once \override Glissando.style = #'dashed-line + d,2 \glissando d'2 + \override Glissando.style = #'dotted-line + d,2 \glissando d'2 + \override Glissando.style = #'zigzag + d,2 \glissando d'2 + \override Glissando.style = #'trill + d,2 \glissando d'2 +} @end lilypond The locations of the end-points of the spanner are computed @@ -3624,10 +3687,12 @@ on-the-fly for every graphic object, but it is possible to override these: @c TODO Complete -@lilypond[relative=2,ragged-right,verbatim,quote] -e2 \glissando f -\once \override Glissando.bound-details.right.Y = #-2 -e2 \glissando f +@lilypond[ragged-right,verbatim,quote] +\relative { + e''2 \glissando f + \once \override Glissando.bound-details.right.Y = #-2 + e2 \glissando f +} @end lilypond The value for @code{Y} is set to @w{@code{-2}} for the right end @@ -3675,10 +3740,10 @@ There are only a few situations where the rotation of layout objects is useful; the following example shows one situation where they may be: -@lilypond[quote,verbatim,relative=1] -g4\< e' d' f\! +@lilypond[quote,fragment,verbatim] +g4\< e' d'' f''\! \override Hairpin.rotation = #'(20 -1 0) -g,,4\< e' d' f\! +g4\< e' d'' f''\! @end lilypond @node Rotating markup @@ -3694,12 +3759,12 @@ rotated text. In the following example the to disable the automatic collision avoidance, which would push some of the text too high. -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,fragment,verbatim] \override TextScript.outside-staff-priority = ##f g4^\markup { \rotate #30 "a G" } b^\markup { \rotate #30 "a B" } -des^\markup { \rotate #30 "a D-Flat" } -fis^\markup { \rotate #30 "an F-Sharp" } +des'^\markup { \rotate #30 "a D-Flat" } +fis'^\markup { \rotate #30 "an F-Sharp" } @end lilypond @node Advanced tweaks @@ -3800,13 +3865,13 @@ properties of many objects. The following example shows three notes with the default fingering position and the positions with @code{X-offset} and @code{Y-offset} modified. -@lilypond[verbatim,quote,relative=2] -a-3 -a +@lilypond[verbatim,fragment,quote] +a'-3 +a' -\tweak X-offset #0 -\tweak Y-offset #0 -3 -a +a' -\tweak X-offset #-1 -\tweak Y-offset #1 -3 @@ -3881,7 +3946,7 @@ value of @code{self-alignment-X}, but the @code{\tweak} command can be used to separately align several annotations on a single note: -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim,fragment] a' -\tweak self-alignment-X #-1 ^"left-aligned" @@ -3919,8 +3984,8 @@ be aligned in both directions simultaneously. The following example shows how to adjust a fingering mark so that it nestles close to the note head. -@lilypond[quote,verbatim,relative=2] -a +@lilypond[quote,verbatim,fragment] +a' -\tweak self-alignment-X #0.5 % move horizontally left -\tweak Y-offset #ly:self-alignment-interface::y-aligned-on-self -\tweak self-alignment-Y #-1 % move vertically up @@ -3971,26 +4036,26 @@ objects other than bar lines. These objects include @code{ambitus}, Each type of object has its own default reference point, to which rehearsal marks are aligned: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % The rehearsal mark will be aligned to the right edge of the Clef \override Score.RehearsalMark.break-align-symbols = #'(clef) \key a \major \clef treble \mark "↓" -e1 +e'1 % The rehearsal mark will be aligned to the left edge of the Time Signature \override Score.RehearsalMark.break-align-symbols = #'(time-signature) \key a \major \clef treble \time 3/4 \mark "↓" -e2. +e'2. % The rehearsal mark will be centered above the Breath Mark \override Score.RehearsalMark.break-align-symbols = #'(breathing-sign) \key a \major \clef treble \time 4/4 -e1 +e'1 \breathe \mark "↓" @end lilypond @@ -4004,20 +4069,20 @@ list are visible the object is aligned to the bar line. If the bar line is invisible the object is aligned to the place where the bar line would be. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % The rehearsal mark will be aligned to the right edge of the Key Signature \override Score.RehearsalMark.break-align-symbols = #'(key-signature clef) \key a \major \clef treble \mark "↓" -e1 +e'1 % The rehearsal mark will be aligned to the right edge of the Clef \set Staff.explicitKeySignatureVisibility = #all-invisible \override Score.RehearsalMark.break-align-symbols = #'(key-signature clef) \key a \major \clef bass \mark "↓" -gis,,1 +gis,1 % The rehearsal mark will be centered above the Bar Line \set Staff.explicitKeySignatureVisibility = #all-invisible \set Staff.explicitClefVisibility = #all-invisible @@ -4025,50 +4090,50 @@ gis,,1 \key a \major \clef treble \mark "↓" -e''1 +e'1 @end lilypond The alignment of the rehearsal mark relative to the notation object can be changed, as shown in the following example. In a score with multiple staves, this setting should be done for all the staves. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % The RehearsalMark will be aligned with the right edge of the Key Signature \override Score.RehearsalMark.break-align-symbols = #'(key-signature) \key a \major \clef treble \time 4/4 \mark "↓" -e1 +e'1 % The RehearsalMark will be centered above the Key Signature \once \override Score.KeySignature.break-align-anchor-alignment = #CENTER \mark "↓" \key a \major -e1 +e'1 % The RehearsalMark will be aligned with the left edge of the Key Signature \once \override Score.KeySignature.break-align-anchor-alignment = #LEFT \key a \major \mark "↓" -e1 +e'1 @end lilypond The rehearsal mark can also be offset to the right or left of the left edge by an arbitrary amount. The units are staff-spaces: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] % The RehearsalMark will be aligned with the left edge of the Key Signature % and then shifted right by 3.5 staff-spaces \override Score.RehearsalMark.break-align-symbols = #'(key-signature) \once \override Score.KeySignature.break-align-anchor = #3.5 \key a \major \mark "↓" -e1 +e'1 % The RehearsalMark will be aligned with the left edge of the Key Signature % and then shifted left by 2 staff-spaces \once \override Score.KeySignature.break-align-anchor = #-2 \key a \major \mark "↓" -e1 +e'1 @end lilypond @@ -4120,24 +4185,26 @@ XinO = { \musicglyph #"noteheads.s2cross" } } -\relative c'' { - a a \XinO a a +\relative { + a' a \XinO a a } @end lilypond -Any of the glyphs in the feta Font can be supplied to the +Any of the glyphs in the Feta Font can be supplied to the @code{\musicglyph} markup command -- see @ref{The Feta font}. -@c TODO Add inserting eps files or ref to later +@file{EPS} files and Postscript commands can both be inserted inline +using the @code{\epsfile} and @code{\postscript} markup commands +respectively -- see @ref{Graphic}. -@c TODO Add inserting Postscript or ref to later @seealso Notation Reference: @ref{Graphic notation inside markup}, @ref{Formatting text}, @ref{Text markup commands}, -@ref{The Feta font}. +@ref{The Feta font}, +@ref{Graphic}. @node Modifying shapes @@ -4200,11 +4267,11 @@ the same operations on the curve. In this example the automatic placement of the tie is not optimum, and @code{\tieDown} would not help. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] << - { e1~ e } + { e'1~ 1 } \\ - { r4 } + \relative { r4 } >> @end lilypond @@ -4240,14 +4307,14 @@ is being used. So, using the same example as above and the @code{\once\override} form of @code{\shape}, this will raise the tie by half a staff-space: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] << { \shape #'((0 . 0.5) (0 . 0.5) (0 . 0.5) (0 . 0.5)) Tie - e1~ e + e'1~ 1 } \\ - { r4 } + \relative { r4 } >> @end lilypond @@ -4255,13 +4322,13 @@ This positioning of the tie is better, but maybe it should be raised more in the center. The following example does this, this time using the alternative @code{\tweak} form: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] << { - e1-\shape #'((0 . 0.5) (0 . 1) (0 . 1) (0 . 0.5)) ~ e + e'1-\shape #'((0 . 0.5) (0 . 1) (0 . 1) (0 . 0.5)) ~ e' } \\ - { r4 } + \relative { r4 } >> @end lilypond @@ -4269,11 +4336,13 @@ Changes to the horizontal positions of the control points may be made in the same way, and two different curves starting at the same musical moment may also be shaped: -@lilypond[verbatim,quote,ragged-right,relative=2] -c8(\( a) a'4 e c\) -\shape #'((0.7 . -0.4) (0.5 . -0.4) (0.3 . -0.3) (0 . -0.2)) Slur -\shape #'((0 . 0) (0 . 0.5) (0 . 0.5) (0 . 0)) PhrasingSlur -c8(\( a) a'4 e c\) +@lilypond[verbatim,quote,ragged-right] +\relative { + c''8(\( a) a'4 e c\) + \shape #'((0.7 . -0.4) (0.5 . -0.4) (0.3 . -0.3) (0 . -0.2)) Slur + \shape #'((0 . 0) (0 . 0.5) (0 . 0.5) (0 . 0)) PhrasingSlur + c8(\( a) a'4 e c\) +} @end lilypond The @code{\shape} function can also displace the control points of @@ -4283,35 +4352,41 @@ particular segment are not needed, the empty list can serve as a placeholder. In this example the line break makes the single slur look like two: -@lilypond[verbatim,quote,ragged-right,relative=1] -c4( f g c -\break -d,4 c' f, c) +@lilypond[verbatim,quote,ragged-right] +\relative { + c'4( f g c + \break + d,4 c' f, c) +} @end lilypond Changing the shapes of the two halves of the slur makes it clearer that the slur continues over the line break: -@lilypond[verbatim,quote,ragged-right,relative=1] +@lilypond[verbatim,quote,ragged-right] % () may be used as a shorthand for ((0 . 0) (0 . 0) (0 . 0) (0 . 0)) % if any of the segments does not need to be changed -\shape #'( - (( 0 . 0) (0 . 0) (0 . 0) (0 . 1)) - ((0.5 . 1.5) (1 . 0) (0 . 0) (0 . -1.5)) - ) Slur -c4( f g c -\break -d,4 c' f, c) +\relative c' { + \shape #'( + (( 0 . 0) (0 . 0) (0 . 0) (0 . 1)) + ((0.5 . 1.5) (1 . 0) (0 . 0) (0 . -1.5)) + ) Slur + c4( f g c + \break + d,4 c' f, c) +} @end lilypond If an S-shaped curve is required the control points must always be adjusted manually --- LilyPond will never select such shapes automatically. -@lilypond[verbatim,quote,relative=2] -c8( e b-> f d' a e-> g) -\shape #'((0 . -1) (5.5 . -0.5) (-5.5 . -10.5) (0 . -5.5)) PhrasingSlur -c8\( e b-> f d' a e-> g\) +@lilypond[verbatim,quote] +\relative c'' { + c8( e b-> f d' a e-> g) + \shape #'((0 . -1) (5.5 . -0.5) (-5.5 . -10.5) (0 . -5.5)) PhrasingSlur + c8\( e b-> f d' a e-> g\) +} @end lilypond @subsubsubheading Specifying control points explicitly @@ -4333,23 +4408,25 @@ specified relative to a single note. Here is an example of this. It shows one way of indicating a slur extending into alternative sections of a volta repeat. -@lilypond[verbatim,quote,relative=2] -c1 -\repeat volta 3 { c4 d( e f } -\alternative { - { g2) d } - { - g2 - % create a slur and move it to a new position - % the <> is just an empty chord to carry the slur termination - -\tweak control-points #'((-2 . 3.8) (-1 . 3.9) (0 . 4) (1 . 3.4)) ( <> ) - f, - } - { - e'2 - % create a slur and move it to a new position - -\tweak control-points #'((-2 . 3) (-1 . 3.1) (0 . 3.2) (1 . 2.4)) ( <> ) - f, +@lilypond[verbatim,quote] +\relative { + c''1 + \repeat volta 3 { c4 d( e f } + \alternative { + { g2) d } + { + g2 + % create a slur and move it to a new position + % the <> is just an empty chord to carry the slur termination + -\tweak control-points #'((-2 . 3.8) (-1 . 3.9) (0 . 4) (1 . 3.4)) ( <> ) + f, + } + { + e'2 + % create a slur and move it to a new position + -\tweak control-points #'((-2 . 3) (-1 . 3.1) (0 . 3.2) (1 . 2.4)) ( <> ) + f, + } } } @end lilypond @@ -4388,12 +4465,14 @@ each of its segments. In the example below, overriding @code{thickness} affects the slur on either side of the line break. -@lilypond[verbatim,quote,ragged-right,relative=2] -r2 -\once\override Slur.thickness = 10 -c8( d e f -\break -g8 f e d) r2 +@lilypond[verbatim,quote,ragged-right] +\relative c'' { + r2 + \once\override Slur.thickness = 10 + c8( d e f + \break + g8 f e d) r2 +} @end lilypond Independently modifying the appearance of individual pieces @@ -4425,12 +4504,14 @@ using @code{\revert} with @var{property}. The following code applies an independent @code{\override} to each of the slur segments in the previous example: -@lilypond[verbatim,quote,ragged-right,relative=2] -r2 -\alterBroken thickness #'(10 1) Slur -c8( d e f -\break -g8 f e d) r2 +@lilypond[verbatim,quote,ragged-right] +\relative c'' { + r2 + \alterBroken thickness #'(10 1) Slur + c8( d e f + \break + g8 f e d) r2 +} @end lilypond The @code{\alterBroken} command may be used with any spanner @@ -4441,12 +4522,14 @@ phrasing slur in a source by dashing only the segment which has been added. The following example illustrates how this can be done, in this case using the @code{\tweak} form of the command: -@lilypond[verbatim,quote,ragged-right,relative=2] +@lilypond[verbatim,quote,ragged-right] % The empty list is conveniently used below, because it is the % default setting of dash-definition, resulting in a solid curve. -c2-\alterBroken dash-definition #'(() ((0 1.0 0.4 0.75))) \(e -\break -g2 e\) +\relative { + c''2-\alterBroken dash-definition #'(() ((0 1.0 0.4 0.75))) \(e + \break + g2 e\) +} @end lilypond It is important to understand that @code{\alterBroken} will set @@ -4532,6 +4615,10 @@ value needed which is then used by the first function to get the real value which is then used for fine-tuning much later during the spacing process. +@c TODO: The following example supposedly showing a collision no longer +@c 'works' since 2.18.x. Another example of a collision is needed. +@c Issue #3512 + @lilypond[verbatim,quote,ragged-right] #(define (square-line-circle-space grob) (let* ((pitch (ly:event-property (ly:grob-property grob 'cause) 'pitch)) @@ -4568,9 +4655,12 @@ the accidentals. In the second measure, with unpure-pure containers, the spacing engine knows the width of the note heads and avoids the collision by lengthening the line accordingly. -Usually for simple calculations nearly-identical functions for both the -@q{unpure} and @q{pure} parts can be used, by only changing the number -of arguments passed to, and the scope of, the function. +Usually for simple calculations nearly-identical functions for +both the @q{unpure} and @q{pure} parts can be used, by only +changing the number of arguments passed to, and the scope of, the +function. This use case is frequent enough that +@code{ly:make-unpure-pure-container} constructs such a second +function by default when called with only one function argument. @warning{If a function is labeled as @q{pure} and it turns out not to be, the results can be unexpected.} @@ -4602,7 +4692,7 @@ code is easy. The general form of these functions is @example function = #(define-music-function - (parser location @var{arg1} @var{arg2} @dots{}) + (@var{arg1} @var{arg2} @dots{}) (@var{type1?} @var{type2?} @dots{}) #@{ @var{@dots{}music@dots{}} @@ -4628,13 +4718,8 @@ reference arguments (eg. @samp{#arg1}). @end multitable -The @code{parser} and @code{location} arguments are mandatory, and -are used in some advanced situations as described in the -@q{Extending} manual (see @rextend{Music functions}). For -substitution functions, just be sure to include them. - -The list of type predicates is also required. Some of the most -common type predicates used in music functions are: +The list of type predicates is required. Some of the most common +type predicates used in music functions are: @example boolean? @@ -4680,14 +4765,14 @@ setting the padding of a TextScript: @lilypond[quote,verbatim,ragged-right] padText = #(define-music-function - (parser location padding) + (padding) (number?) #{ \once \override TextScript.padding = #padding #}) -\relative c'' { - c4^"piu mosso" b a b +\relative { + c''4^"piu mosso" b a b \padText #1.8 c4^"piu mosso" b a b \padText #2.6 @@ -4701,7 +4786,7 @@ as notes for arguments to music functions: @lilypond[quote,verbatim,ragged-right] custosNote = #(define-music-function - (parser location note) + (note) (ly:music?) #{ \tweak NoteHead.stencil #ly:text-interface::print @@ -4711,24 +4796,57 @@ custosNote = #note #}) -\relative c' { c4 d e f \custosNote g } +\relative { c'4 d e f \custosNote g } @end lilypond +@funindex \etc +Both of those functions are simple single expressions where only +the last element of a function call or override is missing. For +those particular function definitions, there is a simpler +alternative syntax, namely just writing out the constant part of +the expression and replacing its final missing element with +@code{\etc}: + +@lilypond[quote,verbatim,ragged-right] +padText = + \once \override TextScript.padding = \etc + +\relative { + c''4^"piu mosso" b a b + \padText #1.8 + c4^"piu mosso" b a b + \padText #2.6 + c4^"piu mosso" b a b +} +@end lilypond + +@lilypond[quote,verbatim,ragged-right] +custosNote = + \tweak NoteHead.stencil #ly:text-interface::print + \tweak NoteHead.text + \markup \musicglyph #"custodes.mensural.u0" + \tweak Stem.stencil ##f + \etc + +\relative { c'4 d e f \custosNote g } +@end lilypond + + Substitution functions with multiple arguments can be defined: @lilypond[quote,verbatim,ragged-right] tempoPadded = #(define-music-function - (parser location padding tempotext) + (padding tempotext) (number? markup?) #{ \once \override Score.MetronomeMark.padding = #padding \tempo \markup { \bold #tempotext } #}) -\relative c'' { +\relative { \tempo \markup { "Low tempo" } - c4 d e f g1 + c''4 d e f g1 \tempoPadded #4.0 "High tempo" g4 f e d c1 } diff --git a/Documentation/notation/cheatsheet.itely b/Documentation/notation/cheatsheet.itely index 711be9782a..20a258a359 100644 --- a/Documentation/notation/cheatsheet.itely +++ b/Documentation/notation/cheatsheet.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.16" @c TODO: add tablature. @@ -127,7 +127,7 @@ c c, @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f c( d e) @end lilypond @@ -138,7 +138,7 @@ c( d e) @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f c\( c( d) e\) @end lilypond @@ -149,7 +149,7 @@ c\( c( d) e\) @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a8-[ b-] @end lilypond @@ -160,11 +160,11 @@ a8-[ b-] @tab @lilypond[relative=1] << \new Staff { - \set Staff.implicitTimeSignatureVisibility = #all-invisible + \set Staff.initialTimeSignatureVisibility = #all-invisible c1 } \new Staff { - \set Staff.implicitTimeSignatureVisibility = #all-invisible + \set Staff.initialTimeSignatureVisibility = #all-invisible c1 } >> @end lilypond @@ -174,7 +174,7 @@ a8-[ b-] @tab articulations @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible c-> c-. @end lilypond @@ -183,7 +183,7 @@ c-> c-. @tab dynamics @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible c2\mf c\sfz @end lilypond @@ -193,7 +193,7 @@ c2\mf c\sfz @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a\< a a\! @end lilypond @@ -203,7 +203,7 @@ a\< a a\! @tab @lilypond[relative=2] \set Score.timing = ##f -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \set Staff.autoBeaming = ##f a\> a a\! @end lilypond @@ -213,7 +213,7 @@ a\> a a\! @tab chord @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible @end lilypond @@ -231,7 +231,7 @@ f8 c2 d e @tab triplets @tab @lilypond[relative=1] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \tuplet 3/2 { f8 g a } @end lilypond @@ -240,7 +240,7 @@ f8 c2 d e @tab grace notes @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \context Voice { \grace b16 c4 } @end lilypond @@ -261,7 +261,7 @@ twinkle @tab lyric hyphen @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible << { g'1 g } \new Lyrics \lyricsto "" { twin -- kle } @@ -272,11 +272,11 @@ twinkle @tab chords @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \chordmode { c:dim f:maj7 } @end lilypond -@item @code{\context ChordNames} +@item @code{\new ChordNames} @tab printing chord names @tab @lilypond[relative=2] @@ -287,7 +287,7 @@ twinkle @tab polyphony @tab @lilypond[relative=2] -\set Staff.implicitTimeSignatureVisibility = #all-invisible +\set Staff.initialTimeSignatureVisibility = #all-invisible \context Staff <<{e f} \\ {c d}>> @end lilypond diff --git a/Documentation/notation/chords.itely b/Documentation/notation/chords.itely index f8340dadac..7e2e1e3544 100644 --- a/Documentation/notation/chords.itely +++ b/Documentation/notation/chords.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.28" @node Chord notation @@ -68,11 +68,13 @@ absolute pitches are one octave higher than in note mode. Chord mode and note mode can be mixed in sequential music: -@lilypond[verbatim,quote,ragged-right,relative=1] -2 -\chordmode { c2 f } -2 -\chordmode { f2 g } +@lilypond[verbatim,quote,ragged-right] +\relative { + 2 + \chordmode { c2 f } + 2 + \chordmode { f2 g } +} @end lilypond @seealso @@ -90,25 +92,6 @@ Snippets: Predefined shorthands for articulations and ornaments cannot be used on notes in chord mode, see @ref{Articulations and ornamentations}. -When chord mode and note mode are mixed in sequential music, and -chord mode comes first, the note mode will create a new @code{Staff} -context: - -@lilypond[verbatim,quote,ragged-right,relative=1] -\chordmode { c2 f } -2 -@end lilypond - -@noindent -To avoid this behavior, explicitly create the @code{Staff} context: - -@lilypond[verbatim,quote,ragged-right,relative=1] -\new Staff { - \chordmode { c2 f } - 2 -} -@end lilypond - @node Common chords @unnumberedsubsubsec Common chords @@ -275,7 +258,8 @@ larger value is interpreted as 13. @end lilypond @noindent -Note that both @code{c:5} and @code{c} produce a C major triad. +As a special exception, @code{c:5} produces a @q{power chord} only +consisting of root and fifth. Since an unaltered 11 does not sound good when combined with an unaltered 13, the 11 is removed from a @code{:13} chord (unless it @@ -296,7 +280,7 @@ the major seventh. @lilypond[quote,verbatim] \chordmode { - c1:5.6 c:3.7.8 c:3.6.13 + c1:3.5.6 c:3.7.8 c:3.6.13 } @end lilypond @@ -304,7 +288,7 @@ Added steps can be as high as desired. @lilypond[quote,verbatim] \chordmode { - c4:5.15 c:5.20 c:5.25 c:5.30 + c4:3.5.15 c:3.5.20 c:3.5.25 c:3.5.30 } @end lilypond @@ -339,14 +323,15 @@ initial @code{^}. @funindex sus The modifier @code{sus} can be added to the modifier string to -create suspended chords. This removes the 3rd step from the chord. -Append either @code{2} or @code{4} to add the 2nd or 4th step to the -chord. @code{sus} is equivalent to @code{^3}; @code{sus4} is -equivalent to @code{.4^3}. +create suspended chords. This removes the 3rd step from the +chord. Append either @code{2} or @code{4} to add the 2nd or 4th +step to the chord. When @code{sus} is followed by either a 2nd or +4th step, it is equivalent to @code{^3}, otherwise to @code{sus4}, +namely @code{5.4}. @lilypond[quote,ragged-right,verbatim] \chordmode { - c1:sus c:sus2 c:sus4 c:5.4^3 + c1:sus c:sus2 c:sus4 c:5.4 } @end lilypond @@ -360,7 +345,7 @@ chord) and added bass notes can be specified by appending @lilypond[quote,ragged-right,verbatim] \chordmode { - c1 c/g c/f + c'1 c'/e c'/f } @end lilypond @@ -371,7 +356,7 @@ moved as part of an inversion, by using @code{/+}@var{pitch}. @lilypond[quote,ragged-right,verbatim] \chordmode { - c1 c/g c/+g + c'1 c'/g c'/+e } @end lilypond @@ -392,17 +377,7 @@ simply produces the augmented chord, since @code{5+} is interpreted last. @lilypond[quote,ragged-right,verbatim] -\chordmode { c1:5.5-.5+ } -@end lilypond - -Only the second inversion can be created by adding a bass -note. The first inversion requires changing the root of -the chord. - -@lilypond[quote,ragged-right,verbatim] -\chordmode { - c'1: c':/g e:6-3-^5 e:m6-^5 -} +\chordmode { c1:3.5.5-.5+ } @end lilypond @@ -439,8 +414,8 @@ chord mode. The displayed chord name will be the same, regardless of the mode of entry, unless there are inversions or added bass notes: @lilypond[verbatim,quote] -chordmusic = \relative c' { - 2 +chordmusic = \relative { + 2 1 \chordmode { c2 f:sus4 c1:/f @@ -463,7 +438,7 @@ of the mode of entry, unless there are inversions or added bass notes: Rests passed to a @code{ChordNames} context will cause the @code{noChordSymbol} markup to be displayed. -@lilypond[verbatim, quote, relative=1] +@lilypond[verbatim,quote] << \new ChordNames \chordmode { c1 @@ -1053,8 +1028,8 @@ of the figures is independent of the notes on the staff. @lilypond[verbatim,ragged-right,quote] << - \relative c'' { - c4 c'8 r8 c,4 c' + \relative { + c''4 c'8 r8 c,4 c' } \new FiguredBass { \figuremode { diff --git a/Documentation/notation/editorial.itely b/Documentation/notation/editorial.itely index 630aa6690f..e329810ae5 100644 --- a/Documentation/notation/editorial.itely +++ b/Documentation/notation/editorial.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.21" @node Editorial annotations @section Editorial annotations @@ -49,62 +49,218 @@ inside the staff. @funindex fontSize @funindex font-size +@funindex magnification->font-size @funindex magstep -@funindex \huge -@funindex \large +@funindex magnifyMusic +@funindex teeny +@funindex tiny +@funindex small +@funindex normalsize +@funindex large +@funindex huge +@funindex \magnifyMusic +@funindex \teeny +@funindex \tiny @funindex \normalsize @funindex \small -@funindex \tiny -@funindex \teeny -@funindex huge -@funindex large -@funindex normalsize -@funindex small -@funindex tiny -@funindex teeny +@funindex \large +@funindex \huge + +@warning{@* +For font sizes of text, see @ref{Selecting font and font size}.@* +For staff size, see @ref{Setting the staff size}.@* +For cue notes, see @ref{Formatting cue notes}.@* +For ossia staves, see @ref{Ossia staves}.} + +To change the size of the notation without changing the staff +size, specify a magnification factor with the @code{\magnifyMusic} +command: + +@c Grieg Piano Concerto (mvt.1 cadenza) +@lilypond[verbatim,quote] +\new Staff << + \new Voice \relative { + \voiceOne + 4 8. 16 8 4 r8 + } + \new Voice \relative { + \voiceTwo + \magnifyMusic 0.63 { + \override Score.SpacingSpanner.spacing-increment = #(* 1.2 0.63) + r32 c'' a c a c a c r c a c a c a c + r c a c a c a c a c a c a c a c + } + } +>> +@end lilypond + +The @code{\override} in the example above is a bug workaround. +See the @qq{Known issues and warnings} at the end of this section. + +If a normal sized note head is merged with a smaller one, the size +of the smaller note may need to be reset (with +@w{@samp{\once@tie{}\normalsize}}) so that the stems and +accidentals align properly: + +@c Chopin Prelude op.28 no.8 +@lilypond[verbatim,quote] +\new Staff << + \key fis \minor + \mergeDifferentlyDottedOn + \new Voice \relative { + \voiceOne + \magnifyMusic 0.63 { + \override Score.SpacingSpanner.spacing-increment = #(* 1.2 0.63) + \once \normalsize cis'32( cis' gis b a fis \once \normalsize d d' + \once \normalsize cis, cis' gis b a gis \once \normalsize fis fis' + \once \normalsize fis, fis' ais, cis b gis \once \normalsize eis eis' + \once \normalsize a, a' bis, d cis b \once \normalsize gis gis') + } + } + \new Voice \relative { + \voiceTwo + cis'8. d16 cis8. fis16 fis8. eis16 a8. gis16 + } +>> +@end lilypond + +The @code{\magnifyMusic} command is not intended for cue notes, +grace notes, or ossia staves---there are more appropriate methods +of entering each of those constructs. Instead, it is useful when +the notation size changes in a single instrumental part on one +staff, and where grace notes are not appropriate, such as in +cadenza-like passages or in cases such as the above examples. +Setting the @code{\magnifyMusic} value to 0.63 duplicates the +dimensions of the @code{CueVoice} context. + +@warning{The @code{@bs{}magnifyMusic} command should @i{not} be +used when also resizing the staff. See @ref{Setting the staff +size}.} + + +@subsubsubheading Resizing individual layout objects + +An individual layout object can be resized by using the +@code{\tweak} or @code{\override} commands to adjust its +@code{font-size} property: + +@lilypond[quote,verbatim] +\relative { + % resize a note head + -5 + % resize a fingering + bes-\tweak font-size 0 -3 + % resize an accidental + \once \override Accidental.font-size = -4 bes!-^ + % resize an articulation + \once \override Script.font-size = 4 bes!-^ +} +@end lilypond + +The default @code{font-size} value for each layout object is +listed in the Internals Reference. The @code{font-size} property +can only be set for layout objects that support the +@code{font-interface} layout interface. If @code{font-size} is +not specified in the object's @q{Standard@tie{}settings} list, its +value is 0. See @rinternals{All layout objects}. + + +@subsubsubheading Understanding the @code{fontSize} property + +The @code{fontSize} context property adjusts the relative size of +all glyph-based notational elements in a context: + +@lilypond[verbatim,quote] +\relative { + \time 3/4 + d''4---5 c8( b a g) | + \set fontSize = -6 + e'4-- c!8-4( b a g) | + \set fontSize = 0 + fis4---3 e8( d) fis4 | + g2. +} +@end lilypond -The font size of notation elements may be altered. It does not -change the size of variable symbols, such as beams or slurs. - -@warning{For font sizes of text, see -@ref{Selecting font and font size}.} - -@lilypond[verbatim,quote,relative=2] -\huge -c4.-> d8---3 -\large -c4.-> d8---3 -\normalsize -c4.-> d8---3 -\small -c4.-> d8---3 -\tiny -c4.-> d8---3 -\teeny -c4.-> d8---3 +The @code{fontSize} value is a number indicating the size relative +to the standard size for the current staff height. The default +@code{fontSize} is 0; adding 6 to any @code{fontSize} value +doubles the printed size of the glyphs, and subtracting 6 halves +the size. Each step increases the size by approximately 12%. + +The scheme function @code{magnification->font-size} is provided +for convenience since the logarithmic units of the +@code{font-size} property are not entirely intuitive. For +example, to adjust the musical notation to 75% of the default +size, use: + +@example +\set fontSize = #(magnification->font-size 0.75) +@end example + +The scheme function @code{magstep} does the opposite: it converts +a @code{font-size} value into a magnification factor. + +The @code{fontSize} property will only affect notational elements +that are drawn with glyphs, such as noteheads, accidentals, +scripts, etc. It will not affect the size of the staff itself, +nor will it scale stems, beams, or horizontal spacing. To scale +stems, beams, and horizontal spacing along with the notation size +(without changing the staff size), use the @code{\magnifyMusic} +command discussed above. To scale everything, including the staff +size, see @ref{Setting the staff size}. + +Whenever the @code{fontSize} @i{context property} is set, its +value is added to the value of the @code{font-size} @i{grob +property} for individual layout objects, before any glyphs are +printed. This can cause confusion when setting individual +@code{font-size} properties while @code{fontSize} is already set: + +@lilypond[verbatim,quote,fragment] +% the default font-size for NoteHead is 0 +% the default font-size for Fingering is -5 +c''4-3 + +\set fontSize = -3 +% the effective font size for NoteHead is now -3 +% the effective font size for Fingering is now -8 +c''4-3 + +\override Fingering.font-size = 0 +% the effective font size for Fingering is now -3 +c''4-3 @end lilypond -Internally, this sets the @code{fontSize} property. This in turn -causes the @code{font-size} property to be set in all layout -objects. The value of @code{font-size} is a number indicating the -size relative to the standard size for the current staff height. -Each step up is an increase of approximately 12% of the font size. -Six steps is exactly a factor of two. The Scheme function -@code{magstep} converts a @code{font-size} number to a scaling -factor. The @code{font-size} property can also be set directly, -so that only certain layout objects are affected. - -@lilypond[verbatim,quote,relative=2] -\set fontSize = #3 -c4.-> d8---3 -\override NoteHead.font-size = #-4 -c4.-> d8---3 -\override Script.font-size = #2 -c4.-> d8---3 -\override Stem.font-size = #-5 -c4.-> d8---3 +The following shorthand commands are also available: + +@multitable @columnfractions .2 .4 .4 +@item @b{Command} @tab @b{Equivalent to} @tab @b{Relative size} +@item @code{\teeny} @tab @code{\set fontSize = -3} @tab 71% +@item @code{\tiny} @tab @code{\set fontSize = -2} @tab 79% +@item @code{\small} @tab @code{\set fontSize = -1} @tab 89% +@item @code{\normalsize} @tab @code{\set fontSize = 0} @tab 100% +@item @code{\large} @tab @code{\set fontSize = 1} @tab 112% +@item @code{\huge} @tab @code{\set fontSize = 2} @tab 126% +@end multitable + +@lilypond[verbatim,quote] +\relative c'' { + \teeny + c4.-> d8---3 + \tiny + c4.-> d8---3 + \small + c4.-> d8---3 + \normalsize + c4.-> d8---3 + \large + c4.-> d8---3 + \huge + c4.-> d8---3 +} @end lilypond + @cindex standard font size (notation) @cindex font size (notation), standard @@ -113,15 +269,12 @@ c4.-> d8---3 Font size changes are achieved by scaling the design size that is closest to the desired size. The standard font size (for -@w{@code{font-size = #0}}) depends on the standard staff height. -For a 20pt staff, a 10pt font is selected. - -The @code{font-size} property can only be set on layout objects -that use fonts. These are the ones supporting the -@code{font-interface} layout interface. +@w{@code{font-size = 0}}) depends on the standard staff height. +For a 20pt staff, a 11pt font is selected. @predefined +@code{\magnifyMusic}, @code{\teeny}, @code{\tiny}, @code{\small}, @@ -131,12 +284,44 @@ that use fonts. These are the ones supporting the @endpredefined @seealso +Notation Reference: +@ref{Selecting font and font size}, +@ref{Setting the staff size}, +@ref{Formatting cue notes}, +@ref{Ossia staves}. + +Installed Files: +@file{ly/music-functions-init.ly}, +@file{ly/property-init.ly}. + Snippets: @rlsr{Editorial annotations}. Internals Reference: @rinternals{font-interface}. +@c The two issues mentioned below: +@c http://code.google.com/p/lilypond/issues/detail?id=3987 +@c http://code.google.com/p/lilypond/issues/detail?id=3990 +@knownissues +There are currently two bugs that are preventing proper horizontal +spacing when using @code{\magnifyMusic}. There is only one +available workaround, and it is not guaranteed to work in every +case. In the example below, replace the @var{mag} variable with +your own value. You may also try removing one or both of the +@code{\newSpacingSection} commands, and/or the @code{\override} +and @code{\revert} commands: + +@example +\magnifyMusic @var{mag} @{ + \newSpacingSection + \override Score.SpacingSpanner.spacing-increment = #(* 1.2 @var{mag}) + [@var{music}] + \newSpacingSection + \revert Score.SpacingSpanner.spacing-increment +@} +@end example + @node Fingering instructions @unnumberedsubsubsec Fingering instructions @@ -145,31 +330,31 @@ Internals Reference: @cindex finger change @funindex \finger -@funindex finger Fingering instructions can be entered using @samp{@var{note}-@var{digit}}: -@lilypond[verbatim,quote,relative=2] -c4-1 d-2 f-4 e-3 +@lilypond[verbatim,quote] +\relative { c''4-1 d-2 f-4 e-3 } @end lilypond Markup texts or strings may be used for finger changes. -@lilypond[verbatim,quote,relative=2] -c4-1 d-2 f\finger \markup \tied-lyric #"4~3" c\finger "2 - 3" +@lilypond[verbatim,quote] +\relative { + c''4-1 d-2 f\finger \markup \tied-lyric #"4~3" c\finger "2 - 3" +} @end lilypond @cindex thumb-script @funindex \thumb -@funindex thumb A thumb-script can be added (e.g. cello music) to indicate that a note should be played with the thumb. -@lilypond[verbatim,quote,relative=2] -2 +@lilypond[verbatim,quote] +\relative { 2 } @end lilypond @cindex fingering chords @@ -179,8 +364,10 @@ that a note should be played with the thumb. Fingerings for chords can also be added to individual notes by adding them after the pitches. -@lilypond[verbatim,quote,relative=2] -2 +@lilypond[verbatim,quote] +\relative { + 2 +} @end lilypond Fingering instructions may be manually placed above or below the @@ -223,33 +410,35 @@ Internals Reference: @cindex notes, transparent @funindex \hideNotes -@funindex hideNotes @funindex \unHideNotes -@funindex unHideNotes Hidden (or invisible or transparent) notes can be useful in preparing theory or composition exercises. -@lilypond[verbatim,quote,relative=2] -c4 d -\hideNotes -e4 f -\unHideNotes -g a -\hideNotes -b -\unHideNotes -c +@lilypond[verbatim,quote] +\relative { + c''4 d + \hideNotes + e4 f + \unHideNotes + g a + \hideNotes + b + \unHideNotes + c +} @end lilypond Note heads, stems, and flags, and rests are invisible. Beams are invisible if they start on a hidden note. Objects that are attached to invisible notes are still visible. -@lilypond[verbatim,quote,relative=2] -e8(\p f g a)-- -\hideNotes -e8(\p f g a)-- +@lilypond[verbatim,quote] +\relative c'' { + e8(\p f g a)-- + \hideNotes + e8(\p f g a)-- +} @end lilypond @@ -291,19 +480,18 @@ Internals Reference: @funindex color @funindex \with-color -@funindex with-color @funindex x11-color Individual objects may be assigned colors. Valid color names are listed in the @ref{List of colors}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \override NoteHead.color = #red -c4 c +c''4 c'' \override NoteHead.color = #(x11-color 'LimeGreen) -d +d'' \override Stem.color = #blue -e +e'' @end lilypond @@ -318,22 +506,24 @@ its name. If @code{x11-color} cannot make sense of the parameter then the color returned defaults to black. -@lilypond[verbatim,quote,relative=2] -\override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) -\set Staff.instrumentName = \markup { - \with-color #(x11-color 'navy) "Clarinet" -} +@lilypond[verbatim,quote] +\relative c'' { + \override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) + \set Staff.instrumentName = \markup { + \with-color #(x11-color 'navy) "Clarinet" + } -gis8 a -\override Beam.color = #(x11-color "medium turquoise") -gis a -\override Accidental.color = #(x11-color 'DarkRed) -gis a -\override NoteHead.color = #(x11-color "LimeGreen") -gis a -% this is deliberate nonsense; note that the stems remain black -\override Stem.color = #(x11-color 'Boggle) -b2 cis + gis8 a + \override Beam.color = #(x11-color "medium turquoise") + gis a + \override Accidental.color = #(x11-color 'DarkRed) + gis a + \override NoteHead.color = #(x11-color "LimeGreen") + gis a + % this is deliberate nonsense; note that the stems remain black + \override Stem.color = #(x11-color 'Boggle) + b2 cis +} @end lilypond @cindex rgb-color @@ -345,18 +535,20 @@ b2 cis Exact RGB colors can be specified using the Scheme function @code{rgb-color}. -@lilypond[verbatim,quote,relative=2] -\override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) -\set Staff.instrumentName = \markup { - \with-color #(x11-color 'navy) "Clarinet" -} +@lilypond[verbatim,quote] +\relative c'' { + \override Staff.StaffSymbol.color = #(x11-color 'SlateBlue2) + \set Staff.instrumentName = \markup { + \with-color #(x11-color 'navy) "Clarinet" + } -\override Stem.color = #(rgb-color 0 0 0) -gis8 a -\override Stem.color = #(rgb-color 1 1 1) -gis8 a -\override Stem.color = #(rgb-color 0 0 0.5) -gis4 a + \override Stem.color = #(rgb-color 0 0 0) + gis8 a + \override Stem.color = #(rgb-color 1 1 1) + gis8 a + \override Stem.color = #(rgb-color 0 0 0.5) + gis4 a +} @end lilypond @seealso @@ -383,8 +575,10 @@ a web browser might not display a difference between @code{LimeGreen} and @code{ForestGreen}. For web use normal colors are recommended (i.e., @code{blue}, @code{green}, @code{red}). -Notes in a chord cannot be colored with @code{\override}; use -@code{\tweak} instead, see @ref{The tweak command}. +Notes in a chord cannot be separately colored with +@code{\override}; use @code{\tweak} or the equivalent +@code{\single\override} before the respective note instead, see +@ref{The tweak command}. @node Parentheses @@ -397,24 +591,27 @@ Notes in a chord cannot be colored with @code{\override}; use @cindex brackets @funindex \parenthesize -@funindex parenthesize Objects may be parenthesized by prefixing @code{\parenthesize} to the music event. When prefixed to a chord, it parenthesizes every note. Individual notes inside a chord may also be parenthesized. -@lilypond[verbatim,quote,relative=2] -c2 \parenthesize d -c2 \parenthesize -c2 +@lilypond[verbatim,quote] +\relative { + c''2 \parenthesize d + c2 \parenthesize + c2 +} @end lilypond Non-note objects may be parenthesized as well. For articulations, a hyphen is needed before the @code{\parenthesize} command. -@lilypond[verbatim,quote,relative=2] -c2-\parenthesize -. d -c2 \parenthesize r +@lilypond[verbatim,quote] +\relative { + c''2-\parenthesize -. d + c2 \parenthesize r +} @end lilypond @seealso @@ -440,11 +637,8 @@ chord. @cindex invisible stem @funindex \stemUp -@funindex stemUp @funindex \stemDown -@funindex stemDown @funindex \stemNeutral -@funindex stemNeutral @cindex stem, direction @cindex stem, up @cindex stem, down @@ -512,17 +706,15 @@ from outside of the staff. @funindex balloonGrobText @funindex balloonText @funindex \balloonLengthOn -@funindex balloonLengthOn @funindex \balloonLengthOff -@funindex balloonLengthOff Elements of notation can be marked and named with the help of a square balloon. The primary purpose of this feature is to explain notation. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Voice \with { \consists "Balloon_engraver" } -{ +\relative c'' { \balloonGrobText #'Stem #'(3 . 4) \markup { "I'm a Stem" } a8 \balloonGrobText #'Rest #'(-4 . -4) \markup { "I'm a rest" } @@ -540,9 +732,9 @@ attach text to an individual note. Balloon text does not influence note spacing, but this can be altered: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Voice \with { \consists "Balloon_engraver" } -{ +\relative c'' { \balloonGrobText #'Stem #'(3 . 4) \markup { "I'm a Stem" } a8 \balloonGrobText #'Rest #'(-4 . -4) \markup { "I'm a rest" } @@ -605,11 +797,11 @@ lines. \score { \new ChoirStaff << - \new Staff \relative c'' { + \new Staff \relative { \stemUp - c4. d8 e8 f g4 + c''4. d8 e8 f g4 } - \new Staff \relative c { + \new Staff \relative { \clef bass \stemDown c4 g' f e @@ -650,9 +842,7 @@ Internals Reference: @funindex Horizontal_bracket_engraver @funindex \startGroup -@funindex startGroup @funindex \stopGroup -@funindex stopGroup Brackets are used in musical analysis to indicate structure in musical pieces. Simple horizontal brackets are supported. @@ -664,8 +854,8 @@ pieces. Simple horizontal brackets are supported. \consists "Horizontal_bracket_engraver" } } -\relative c'' { - c2\startGroup +\relative { + c''2\startGroup d\stopGroup } @end lilypond @@ -679,8 +869,8 @@ Analysis brackets may be nested. \consists "Horizontal_bracket_engraver" } } -\relative c'' { - c4\startGroup\startGroup +\relative { + c''4\startGroup\startGroup d4\stopGroup e4\startGroup d4\stopGroup\stopGroup diff --git a/Documentation/notation/expressive.itely b/Documentation/notation/expressive.itely index 96c1449e91..defe8ad946 100644 --- a/Documentation/notation/expressive.itely +++ b/Documentation/notation/expressive.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.25" +@c \version "2.19.21" @node Expressive marks @section Expressive marks @@ -127,9 +127,11 @@ this syntax: The possible values for @code{@var{name}} are listed in @ref{List of articulations}. For example: -@lilypond[verbatim,quote,relative=2] -c4\staccato c\mordent b2\turn -c1\fermata +@lilypond[verbatim,quote] +\relative { + c''4\staccato c\mordent b2\turn + c1\fermata +} @end lilypond @cindex marcato @@ -147,9 +149,11 @@ articulation. Predefined shorthands exist for @notation{marcato}, @notation{accent}, @notation{staccato}, and @notation{portato}. Their corresponding output appears as follows: -@lilypond[verbatim,quote,relative=2] -c4-^ c-+ c-- c-! -c4-> c-. c2-_ +@lilypond[verbatim,quote] +\relative { + c''4-^ c-+ c-- c-! + c4-> c-. c2-_ +} @end lilypond The rules for the default placement of articulations are defined @@ -166,10 +170,10 @@ command, @code{\fermataMarkup}, is available for attaching a fermata to a multi-measure rest (and only a multi-measure rest). This creates a @code{MultiMeasureRestText} object. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \override Script.color = #red \override MultiMeasureRestText.color = #blue -a2\fermata r\fermata +a'2\fermata r\fermata R1\fermataMarkup @end lilypond @@ -225,43 +229,24 @@ Internals Reference: @cindex dynamics, absolute @funindex \ppppp -@funindex ppppp @funindex \pppp -@funindex pppp @funindex \ppp -@funindex ppp @funindex \pp -@funindex pp @funindex \p -@funindex p @funindex \mp -@funindex mp @funindex \mf -@funindex mf @funindex \f -@funindex f @funindex \ff -@funindex ff @funindex \fff -@funindex fff @funindex \ffff -@funindex ffff @funindex \fffff -@funindex fffff @funindex \fp -@funindex fp @funindex \sf -@funindex sf @funindex \sff -@funindex sff @funindex \sp -@funindex sp @funindex \spp -@funindex spp @funindex \sfz -@funindex sfz @funindex \rfz -@funindex rfz Absolute dynamic marks are specified using a command after a note, such as @code{c4\ff}. The available dynamic marks are @@ -272,10 +257,12 @@ such as @code{c4\ff}. The available dynamic marks are marks may be manually placed above or below the staff; see @ref{Direction and placement}. -@lilypond[verbatim,quote,relative=2] -c2\ppp c\mp -c2\rfz c^\mf -c2_\spp c^\ff +@lilypond[verbatim,quote] +\relative c'' { + c2\ppp c\mp + c2\rfz c^\mf + c2_\spp c^\ff +} @end lilypond @cindex hairpin @@ -287,9 +274,7 @@ c2_\spp c^\ff @funindex \> @funindex \! @funindex \cr -@funindex cr @funindex \decr -@funindex decr A @notation{crescendo} mark is started with @code{\<} and terminated with @code{\!}, an absolute dynamic, or an additional @@ -300,14 +285,16 @@ absolute dynamic, or another crescendo or decrescendo mark. @code{\>}. @notation{Hairpins} are engraved by default using this notation. -@lilypond[verbatim,quote,relative=2] -c2\< c\! -d2\< d\f -e2\< e\> -f2\> f\! -e2\> e\mp -d2\> d\> -c1\! +@lilypond[verbatim,quote] +\relative c'' { + c2\< c\! + d2\< d\f + e2\< e\> + f2\> f\! + e2\> e\mp + d2\> d\> + c1\! +} @end lilypond A hairpin that is terminated with @code{\!} will end at the @@ -319,8 +306,10 @@ hairpin will then start at the right edge of the same note instead of the usual left edge had it been terminated with @code{\!} before. -@lilypond[verbatim,quote,relative=2] -c1\< | c4 a c\< a | c4 a c\! a\< | c4 a c a\! +@lilypond[verbatim,quote] +\relative { + c''1\< | c4 a c\< a | c4 a c\! a\< | c4 a c a\! +} @end lilypond Hairpins that are terminated with absolute dynamic marks instead of @@ -328,8 +317,10 @@ Hairpins that are terminated with absolute dynamic marks instead of of the absolute dynamic itself can alter where the preceding hairpin ends. -@lilypond[verbatim,quote,relative=2] -c1\< | c4 a c\mf a | c1\< | c4 a c\ffff a +@lilypond[verbatim,quote] +\relative { + c''1\< | c4 a c\mf a | c1\< | c4 a c\ffff a +} @end lilypond @cindex multiple dynamic marks on one note @@ -338,68 +329,66 @@ Spacer rests are needed to engrave multiple marks on one note. This is particularly useful when adding a @notation{crescendo} and @notation{decrescendo} to the same note: -@lilypond[verbatim,quote,relative=2] -c4\< c\! d\> e\! -<< f1 { s4 s4\< s4\> s4\! } >> +@lilypond[verbatim,quote] +\relative { + c''4\< c\! d\> e\! + << f1 { s4 s4\< s4\> s4\! } >> +} @end lilypond @cindex espressivo articulation @funindex \espressivo -@funindex espressivo The @code{\espressivo} command can be used to indicate a crescendo and decrescendo on the same note. However, be warned that this is implemented as an articulation, not a dynamic. -@lilypond[verbatim,quote,relative=2] -c2 b4 a -g1\espressivo +@lilypond[verbatim,quote] +\relative { + c''2 b4 a + g1\espressivo +} @end lilypond @funindex \cresc -@funindex cresc @funindex \decresc -@funindex decresc @funindex \dim -@funindex dim Textual crescendo marks begin with @code{\cresc}. Textual decrescendos begin with @code{\decresc} or @code{\dim}. Extender lines are engraved as required. -@lilypond[verbatim,quote,relative=2] -g8\cresc a b c b c d e\mf | -f8\decresc e d c e\> d c b | -a1\dim ~ | -a2. r4\! | +@lilypond[verbatim,quote] +\relative { + g'8\cresc a b c b c d e\mf | + f8\decresc e d c e\> d c b | + a1\dim ~ | + a2. r4\! | +} @end lilypond @funindex \crescTextCresc -@funindex crescTextCresc @funindex \dimTextDecresc -@funindex dimTextDecresc @funindex \dimTextDecr -@funindex dimTextDecr @funindex \dimTextDim -@funindex dimTextDim @funindex \crescHairpin -@funindex crescHairpin @funindex \dimHairpin -@funindex dimHairpin Textual marks for dynamic changes can also replace hairpins: -@lilypond[verbatim,quote,relative=2] -\crescTextCresc -c4\< d e f\! | -\dimTextDecresc -g4\> e d c\! | -\dimTextDecr -e4\> d c b\! | -\dimTextDim -d4\> c b a\! | -\crescHairpin -\dimHairpin -c4\< d\! e\> d\! | +@lilypond[verbatim,quote] +\relative c'' { + \crescTextCresc + c4\< d e f\! | + \dimTextDecresc + g4\> e d c\! | + \dimTextDecr + e4\> d c b\! | + \dimTextDim + d4\> c b a\! | + \crescHairpin + \dimHairpin + c4\< d\! e\> d\! | +} @end lilypond @@ -415,11 +404,8 @@ aligned with dynamics, see @ref{New dynamic marks}. Vertical positioning of dynamics is handled by @rinternals{DynamicLineSpanner}. @funindex \dynamicUp -@funindex dynamicUp @funindex \dynamicDown -@funindex dynamicDown @funindex \dynamicNeutral -@funindex dynamicNeutral A @code{Dynamics} context is available to engrave dynamics on their own horizontal line. Use spacer rests to indicate timing. @@ -430,8 +416,8 @@ items such as text scripts, text spanners, and piano pedal marks. @lilypond[verbatim,quote] << - \new Staff \relative c' { - c2 d4 e | + \new Staff \relative { + c'2 d4 e | c4 e e,2 | g'4 a g a | c1 | @@ -504,7 +490,7 @@ Learning Manual: Notation Reference: @ref{Direction and placement}, @ref{New dynamic marks}, -@ref{What goes into the MIDI output?}, +@ref{Enhancing MIDI output}, @ref{Controlling MIDI dynamics}. Snippets: @@ -529,8 +515,8 @@ The easiest way to create dynamic indications is to use @lilypond[verbatim,quote] moltoF = \markup { molto \dynamic f } -\relative c' { - 16_\moltoF +\relative { + 16_\moltoF 2.. } @end lilypond @@ -539,9 +525,7 @@ moltoF = \markup { molto \dynamic f } @cindex dynamics, parenthesis @cindex editorial dynamics @funindex \bracket -@funindex bracket @funindex \dynamic -@funindex dynamic In markup mode, editorial dynamics (within parentheses or square brackets) can be created. The syntax for markup mode is described @@ -552,8 +536,8 @@ roundF = \markup { \center-align \concat { \bold { \italic ( } \dynamic f \bold { \italic ) } } } boxF = \markup { \bracket { \dynamic f } } -\relative c' { - c1_\roundF +\relative { + c'1_\roundF c1_\boxF } @end lilypond @@ -566,8 +550,8 @@ Simple, centered dynamic marks are easily created with the @lilypond[verbatim,quote] sfzp = #(make-dynamic-script "sfzp") -\relative c' { - c4 c c\sfzp c +\relative { + c'4 c c\sfzp c } @end lilypond @@ -592,8 +576,8 @@ mfEspress = \markup { \center-align \line { roundFdynamic = #(make-dynamic-script roundF) boxFdynamic = #(make-dynamic-script boxF) mfEspressDynamic = #(make-dynamic-script mfEspress) -\relative c' { - c4_\roundFdynamic\< d e f +\relative { + c'4_\roundFdynamic\< d e f g,1~_\boxFdynamic\> g1 g'1~\mfEspressDynamic @@ -608,8 +592,8 @@ explained in @rextend{Markup construction in Scheme}. moltoF = #(make-dynamic-script (markup #:normal-text "molto" #:dynamic "f")) -\relative c' { - 16 +\relative { + 16 2..\moltoF } @end lilypond @@ -622,8 +606,8 @@ moltoF = \tweak DynamicText.self-alignment-X #LEFT #(make-dynamic-script (markup #:normal-text "molto" #:dynamic "f")) -\relative c' { - 16 +\relative { + 16 2..\moltoF 1 } @end lilypond @@ -635,7 +619,7 @@ Font settings in markup mode are described in Notation Reference: @ref{Formatting text}, @ref{Selecting font and font size}, -@ref{What goes into the MIDI output?}, +@ref{Enhancing MIDI output}, @ref{Controlling MIDI dynamics}. Extending LilyPond: @@ -669,19 +653,19 @@ doits. @warning{In polyphonic music, a slur must be terminated in the same voice it began.} -@lilypond[verbatim,quote,relative=2] -f4( g a) a8 b( -a4 g2 f4) -2( 2) +@lilypond[verbatim,quote] +\relative { + f''4( g a) a8 b( + a4 g2 f4) + 2( 2) +} @end lilypond @cindex slurs, manual placement @cindex slurs, below notes @cindex slurs, above notes @funindex \slurDown -@funindex slurDown @funindex \slurNeutral -@funindex slurNeutral Slurs may be manually placed above or below the staff; see @ref{Direction and placement}. @@ -692,10 +676,20 @@ Slurs may be manually placed above or below the staff; see @cindex slur, phrasing @cindex slurs, multiple @cindex slurs, simultaneous +@funindex \= + +Simultaneous or overlapping slurs require special attention. Most +occurences of outer slurs actually indicate phrasing, and phrasing +slurs may overlap a regular slur, see @ref{Phrasing slurs}. When +multiple regular slurs are needed in a single @code{Voice}, +matching slur starts and ends need to be labelled by preceding +them with @code{\=} followed by an identifying number or string. -Simultaneous or overlapping slurs are not permitted, but a phrasing -slur can overlap a slur. This permits two slurs to be printed at -once. For details, see @ref{Phrasing slurs}. +@lilypond[verbatim,quote] +\fixed c' { + 2 +} +@end lilypond @cindex slur style @cindex slur, solid @@ -706,65 +700,64 @@ once. For details, see @ref{Phrasing slurs}. @cindex dashed slur @cindex style, slur @funindex \slurDashed -@funindex slurDashed @funindex \slurDotted -@funindex slurDotted @funindex \slurSolid -@funindex slurSolid Slurs can be solid, dotted, or dashed. Solid is the default slur style: -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurDashed -g4( e c2) -\slurDotted -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurDashed + g4( e c2) + \slurDotted + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @funindex \slurHalfDashed -@funindex slurHalfDashed @funindex \slurHalfSolid -@funindex slurHalfSolid @cindex slur, half dashed and half solid Slurs can also be made half-dashed (the first half dashed, the second half solid) or half-solid (the first half solid, the second half dashed): -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurHalfDashed -g4( e c2) -\slurHalfSolid -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurHalfDashed + g4( e c2) + \slurHalfSolid + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @funindex \slurDashPattern -@funindex slurDashPattern @cindex slur, defining dash patterns Custom dash patterns for slurs can be defined: -@lilypond[verbatim,quote,relative=1] -c4( e g2) -\slurDashPattern #0.7 #0.75 -g4( e c2) -\slurDashPattern #0.5 #2.0 -c4( e g2) -\slurSolid -g4( e c2) +@lilypond[verbatim,quote] +\relative { + c'4( e g2) + \slurDashPattern #0.7 #0.75 + g4( e c2) + \slurDashPattern #0.5 #2.0 + c4( e g2) + \slurSolid + g4( e c2) +} @end lilypond @funindex \slurUp -@funindex slurUp @predefined @@ -823,17 +816,16 @@ Internals Reference: musical sentence are written using the commands @code{\(} and @code{\)} respectively: -@lilypond[verbatim,quote,relative=2] -c4\( d( e) f( -e2) d\) +@lilypond[verbatim,quote] +\relative { + c''4\( d( e) f( + e2) d\) +} @end lilypond @funindex \phrasingSlurUp -@funindex phrasingSlurUp @funindex \phrasingSlurDown -@funindex phrasingSlurDown @funindex \phrasingSlurNeutral -@funindex phrasingSlurNeutral Typographically, a phrasing slur behaves almost exactly like a normal slur. However, they are treated as different objects; a @@ -848,14 +840,12 @@ may be manually placed above or below the staff; see @cindex phrasing slur, simultaneous @cindex phrasing slur, multiple -Simultaneous or overlapping phrasing slurs are not permitted. +Simultaneous or overlapping phrasing slurs are entered using +@code{\=} as with regular slurs, see @ref{Slurs}. -@funindex phrasingSlurDashed @funindex \phrasingSlurDashed @funindex \phrasingSlurDotted -@funindex phrasingSlurDotted @funindex \phrasingSlurSolid -@funindex phrasingSlurSolid @cindex phrasing slur, dashed @cindex dashed phrasing slur @cindex phrasing slur, dotted @@ -866,20 +856,20 @@ Simultaneous or overlapping phrasing slurs are not permitted. Phrasing slurs can be solid, dotted, or dashed. Solid is the default style for phrasing slurs: -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurDashed -g4\( e c2\) -\phrasingSlurDotted -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurDashed + g4\( e c2\) + \phrasingSlurDotted + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond -@funindex phrasingSlurHalfDashed @funindex \phrasingSlurHalfDashed @funindex \phrasingSlurHalfSolid -@funindex phrasingSlurHalfSolid @cindex phrasing slur, half solid and half dashed @cindex slur, half solid and half dashed phrasing @@ -887,32 +877,35 @@ Phrasing slurs can also be made half-dashed (the first half dashed, the second half solid) or half-solid (the first half solid, the second half dashed): -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurHalfDashed -g4\( e c2\) -\phrasingSlurHalfSolid -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurHalfDashed + g4\( e c2\) + \phrasingSlurHalfSolid + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond @funindex \phrasingSlurDashPattern -@funindex phrasingSlurDashPattern @cindex phrasing slur, defining dash patterns @cindex slur, phrasing, defining dash patterns @cindex slur, defining dash patterns for phrasing Custom dash patterns for phrasing slurs can be defined: -@lilypond[verbatim,quote,relative=1] -c4\( e g2\) -\phrasingSlurDashPattern #0.7 #0.75 -g4\( e c2\) -\phrasingSlurDashPattern #0.5 #2.0 -c4\( e g2\) -\phrasingSlurSolid -g4\( e c2\) +@lilypond[verbatim,quote] +\relative { + c'4\( e g2\) + \phrasingSlurDashPattern #0.7 #0.75 + g4\( e c2\) + \phrasingSlurDashPattern #0.5 #2.0 + c4\( e g2\) + \phrasingSlurSolid + g4\( e c2\) +} @end lilypond Dash pattern definitions for phrasing slurs have the same structure @@ -952,19 +945,24 @@ Internals Reference: @cindex breath marks @cindex pause mark @funindex \breathe -@funindex breathe Breath marks are entered using @code{\breathe}: -@lilypond[verbatim,quote,relative=2] -c2. \breathe d4 +@lilypond[verbatim,quote] +{ c''2. \breathe d''4 } @end lilypond +Unlike other expressive marks, a breath mark is not associated with +the preceding note but is a separate music event. So all the +expressive marks which are attached to the preceding note, any square +brackets indicating manual beams, and any brackets indicating slurs +and phrasing slurs must be placed before @code{\breathe}. + A breath mark will end an automatic beam; to override this behavior, see @ref{Manual beams}. -@lilypond[verbatim,quote,relative=2] -c8 \breathe d e f g2 +@lilypond[verbatim,quote] +\relative { c''8 \breathe d e f g2 } @end lilypond Musical indicators for breath marks in ancient notation, @@ -1009,7 +1007,6 @@ Internals Reference: @cindex falls @cindex doits @funindex \bendAfter -@funindex bendAfter @notation{Falls} and @notation{doits} can be added to notes using the @code{\bendAfter} command. The direction of the fall or doit @@ -1017,13 +1014,15 @@ is indicated with a plus or minus (up or down). The number indicates the pitch interval that the fall or doit will extend @emph{beyond} the main note. -@lilypond[verbatim,quote,relative=2] -c2\bendAfter #+4 -c2\bendAfter #-4 -c2\bendAfter #+6.5 -c2\bendAfter #-6.5 -c2\bendAfter #+8 -c2\bendAfter #-8 +@lilypond[verbatim,quote] +\relative c'' { + c2\bendAfter #+4 + c2\bendAfter #-4 + c2\bendAfter #+6.5 + c2\bendAfter #-6.5 + c2\bendAfter #+8 + c2\bendAfter #-8 +} @end lilypond @snippets @@ -1057,15 +1056,16 @@ follow a linear path: glissandos, arpeggios, and trills. @cindex glissando @funindex \glissando -@funindex glissando A @notation{glissando} is created by appending @code{\glissando} to a note: -@lilypond[verbatim,quote,relative=2] -g2\glissando g' -c2\glissando c, -\afterGrace f,1\glissando f'16 +@lilypond[verbatim,quote] +\relative { + g'2\glissando g' + c2\glissando c, + \afterGrace f,1\glissando f'16 +} @end lilypond A glissando can connect notes across staves: @@ -1093,20 +1093,22 @@ the connections between the notes are defined by setting numbered from zero in the order in which they appear in the input @file{.ly} file. -@lilypond[verbatim,quote,relative=2] -1\glissando g' | -1\glissando | - | -\break -\set glissandoMap = #'((0 . 1) (1 . 0)) -1\glissando | - | -\set glissandoMap = #'((0 . 0) (0 . 1) (0 . 2)) -c1\glissando | - | -\set glissandoMap = #'((2 . 0) (1 . 0) (0 . 1)) -1\glissando | - | +@lilypond[verbatim,quote] +\relative { + 1\glissando g' | + 1\glissando | + | + \break + \set glissandoMap = #'((0 . 1) (1 . 0)) + 1\glissando | + | + \set glissandoMap = #'((0 . 0) (0 . 1) (0 . 2)) + c1\glissando | + | + \set glissandoMap = #'((2 . 0) (1 . 0) (0 . 1)) + 1\glissando | + | +} @end lilypond Different styles of glissandi can be created. For details, see @@ -1152,67 +1154,65 @@ supported. @cindex chord, broken @funindex \arpeggio -@funindex arpeggio @funindex \arpeggioArrowUp -@funindex arpeggioArrowUp @funindex \arpeggioArrowDown -@funindex arpeggioArrowDown @funindex \arpeggioNormal -@funindex arpeggioNormal An @notation{arpeggio} on a chord (also known as a broken chord) is denoted by appending @code{\arpeggio} to the chord construct: -@lilypond[verbatim,quote,relative=1] -1\arpeggio +@lilypond[verbatim,quote] +\relative { 1\arpeggio } @end lilypond Different types of arpeggios may be written. @code{\arpeggioNormal} reverts to a normal arpeggio: -@lilypond[verbatim,quote,relative=1] -2\arpeggio +@lilypond[verbatim,quote] +\relative { + 2\arpeggio -\arpeggioArrowUp -2\arpeggio + \arpeggioArrowUp + 2\arpeggio -\arpeggioArrowDown -2\arpeggio + \arpeggioArrowDown + 2\arpeggio -\arpeggioNormal -2\arpeggio + \arpeggioNormal + 2\arpeggio +} @end lilypond @cindex arpeggio symbols, special @cindex special arpeggio symbols @funindex \arpeggioBracket -@funindex arpeggioBracket @funindex \arpeggioParenthesis -@funindex arpeggioParenthesis @funindex \arpeggioParenthesisDashed -@funindex arpeggioParenthesisDashed Special @emph{bracketed} arpeggio symbols can be created: -@lilypond[verbatim,quote,relative=1] -2 +@lilypond[verbatim,quote] +\relative { + 2 -\arpeggioBracket -2\arpeggio + \arpeggioBracket + 2\arpeggio -\arpeggioParenthesis -2\arpeggio + \arpeggioParenthesis + 2\arpeggio -\arpeggioParenthesisDashed -2\arpeggio + \arpeggioParenthesisDashed + 2\arpeggio -\arpeggioNormal -2\arpeggio + \arpeggioNormal + 2\arpeggio +} @end lilypond The dash properties of the parenthesis arpeggio are controlled -with the @code{'dash-details} property, which is described at @ref{Slurs}. +with the @code{'dash-definition} property, which is described at +@ref{Slurs}. Arpeggios can be explicitly written out with ties. For more information, see @ref{Ties}. @@ -1275,11 +1275,8 @@ cross-staff arpeggios; see @ref{Cross-staff stems}. @cindex trills @funindex \trill -@funindex trill @funindex \startTrillSpan -@funindex startTrillSpan @funindex \stopTrillSpan -@funindex stopTrillSpan Short trills without an extender line are printed with @code{\trill}; see @ref{Articulations and ornamentations}. @@ -1287,62 +1284,71 @@ Short trills without an extender line are printed with Longer trills with an extender line are made with @code{\startTrillSpan} and @code{\stopTrillSpan}: -@lilypond[verbatim,quote,relative=2] -d1\startTrillSpan -d1 -c2\stopTrillSpan -r2 +@lilypond[verbatim,quote] +\relative { + d''1\startTrillSpan + d1 + c2\stopTrillSpan + r2 +} @end lilypond A trill spanner crossing a line break will restart exactly above the first note on the new line. -@lilypond[ragged-right,verbatim,quote,relative=2] -d1\startTrillSpan -\break -d1 -c2\stopTrillSpan -r2 +@lilypond[ragged-right,verbatim,quote] +\relative { + d''1\startTrillSpan + \break + d1 + c2\stopTrillSpan + r2 +} @end lilypond Consecutive trill spans will work without explicit @code{\stopTrillSpan} commands, since successive trill spanners will automatically become the right bound of the previous trill. -@lilypond[verbatim,quote,relative=2] -d1\startTrillSpan -d1 -b1\startTrillSpan -d2\stopTrillSpan -r2 +@lilypond[verbatim,quote] +\relative { + d''1\startTrillSpan + d1 + b1\startTrillSpan + d2\stopTrillSpan + r2 +} @end lilypond Trills can also be combined with grace notes. The syntax of this construct and the method to precisely position the grace notes are described in @ref{Grace notes}. -@lilypond[verbatim,quote,relative=2] -d1~\afterGrace -d1\startTrillSpan { c32[ d]\stopTrillSpan } -c2 r2 +@lilypond[verbatim,quote] +\relative { + d''1~\afterGrace + d1\startTrillSpan { c32[ d]\stopTrillSpan } + c2 r2 +} @end lilypond @cindex pitched trills @cindex trills, pitched @funindex \pitchedTrill -@funindex pitchedTrill Trills that require an auxiliary note with an explicit pitch can be typeset with the @code{\pitchedTrill} command. The first argument is the main note, and the second is the @emph{trilled} note, printed as a stemless note head in parentheses. -@lilypond[verbatim,quote,relative=2] -\pitchedTrill -d2\startTrillSpan fis -d2 -c2\stopTrillSpan -r2 +@lilypond[verbatim,quote] +\relative { + \pitchedTrill + d''2\startTrillSpan fis + d2 + c2\stopTrillSpan + r2 +} @end lilypond @cindex pitched trill with accidental @@ -1352,19 +1358,21 @@ Subsequent accidentals of the same note in the same measure will need to be added manually. Only the accidental of the first pitched trill in a measure is printed. -@lilypond[verbatim,quote,relative=2] -\pitchedTrill -eis4\startTrillSpan fis -eis4\stopTrillSpan -\pitchedTrill -eis4\startTrillSpan cis -eis4\stopTrillSpan -\pitchedTrill -eis4\startTrillSpan fis -eis4\stopTrillSpan -\pitchedTrill -eis4\startTrillSpan fis! -eis4\stopTrillSpan +@lilypond[verbatim,quote] +\relative { + \pitchedTrill + eis''4\startTrillSpan fis + eis4\stopTrillSpan + \pitchedTrill + eis4\startTrillSpan cis + eis4\stopTrillSpan + \pitchedTrill + eis4\startTrillSpan fis + eis4\stopTrillSpan + \pitchedTrill + eis4\startTrillSpan fis! + eis4\stopTrillSpan +} @end lilypond @predefined diff --git a/Documentation/notation/fretted-strings.itely b/Documentation/notation/fretted-strings.itely index 121dfc0580..a69f678735 100644 --- a/Documentation/notation/fretted-strings.itely +++ b/Documentation/notation/fretted-strings.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.28" @node Fretted string instruments @section Fretted string instruments @@ -27,6 +27,7 @@ to fretted string instruments. * Common notation for fretted strings:: * Guitar:: * Banjo:: +* Lute:: @end menu @node Common notation for fretted strings @@ -99,10 +100,10 @@ Notation Reference: The string on which a note should be played may be indicated by appending @code{\@var{number}} to a note. -@lilypond[verbatim,quote,relative=0] +@lilypond[verbatim,quote,fragment] \clef "treble_8" c4\5 e\4 g2\3 -1 +1 @end lilypond When fingerings and string indications are used together, their @@ -111,7 +112,7 @@ in the code @emph{only} if they appear inside of an explicit chord: applied to whole chords or single notes @emph{outside} of chords, fingerings are placed using a different mechanism. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef "treble_8" g4\3-0 g-0\3 @@ -119,6 +120,22 @@ g-0\3 @end lilypond +String numbers may also, as is customary with unfretted strings, +be printed in Roman numerals and placed below the staff rather +than above. + +@lilypond[verbatim,quote,fragment] +\clef "treble_8" +c'2\2 +a\3 +\romanStringNumbers +c'\2 +\set stringNumberOrientations = #'(down) +a\3 +\arabicStringNumbers +g1\4 +@end lilypond + @snippets @lilypondfile[verbatim,quote,texidoc,doctitle] @@ -127,6 +144,11 @@ g-0\3 @lilypondfile[verbatim,quote,texidoc,doctitle] {allowing-fingerings-to-be-printed-inside-the-staff.ly} +@predefined +@code{\arabicStringNumbers}, +@code{\romanStringNumbers}. +@endpredefined + @seealso Notation Reference: @ref{Fingering instructions}. @@ -165,7 +187,7 @@ tablature, by using @code{TabStaff} and @code{TabVoice} contexts. A calligraphic tablature clef is added automatically. @lilypond[quote,ragged-right,verbatim] -\new TabStaff \relative c' { +\new TabStaff \relative { a,8 a' a d,8 a' a } @@ -180,7 +202,7 @@ symbols = { c4-.^"Allegro" d( e) f4-.\f g a^\fermata \mark \default - c8_.\<\( c16 c~ c2\! + c8_.\<\( c16 c~ 2\! c'2.\prall\) } @@ -206,7 +228,7 @@ symbols = { c4-.^"Allegro" d( e) f4-.\f g a^\fermata \mark \default - c8_.\<\( c16 c~ c2\! + c8_.\<\( c16 c~ 2\! c'2.\prall\) } @@ -239,14 +261,14 @@ to @code{#t}. @lilypond[quote,ragged-right,verbatim] \layout { \omit Voice.StringNumber } \new StaffGroup << - \new Staff \relative c { + \new Staff \relative { \clef "treble_8" \time 2/4 c16 d e f g4 c,16\5 d\5 e\4 f\4 g4\4 c,16 d e f g4 } - \new TabStaff \relative c { + \new TabStaff \relative { c16 d e f g4 c,16\5 d\5 e\4 f\4 g4\4 \set TabStaff.minimumFret = #5 @@ -258,8 +280,9 @@ to @code{#t}. @funindex \tabChordRepeats @funindex \chordRepeats -@cindex Chord, repetition +@cindex chord, repetition @cindex repetition, using @code{q} +@cindex @code{q}, chord repetition Chord constructs can be repeated by the chord repetition symbol @code{q}. In combination with tabulatures, its behavior of removing @@ -273,8 +296,8 @@ repetition}. This particular command is so common that it is available as @code{\tabChordRepeats}. @lilypond[quote,verbatim] -guitar = \relative c' { - r8 ~ q4 q8~ q q4 +guitar = \relative { + r8 ~ q4 q8~ 8 q4 } \new StaffGroup << @@ -292,10 +315,10 @@ Ties over a line break are parenthesized by default. The same holds for the second alternative of a repeat. @lilypond[quote,ragged-right,verbatim] -ties = \relative c' { +ties = \relative { \repeat volta 2 { - e2. f4~ - f2 g2~ + e'2. f4~ + 2 g2~ } \alternative { { g4 f2. } @@ -332,10 +355,10 @@ The command @code{\hideSplitTiedTabNotes} cancels the behavior of engraving fret numbers in parentheses: @lilypond[quote,ragged-right,verbatim] -ties = \relative c' { +ties = \relative { \repeat volta 2 { - e2. f4~ - f2 g2~ } + e'2. f4~ + 2 g2~ } \alternative { { g4 f2. } { g4\repeatTie c,2. } @@ -554,15 +577,15 @@ written. \omit StringNumber } { \clef "bass_8" - \relative c, { - c4 d e f + \relative { + c,4 d e f } } \new TabStaff \with { stringTunings = #bass-tuning } { - \relative c, { - c4 d e f + \relative { + c,4 d e f } } >> @@ -574,7 +597,6 @@ is the standard EADGBE tuning. Some other predefined tunings are @code{banjo-open-g-tuning}. The predefined string tunings are found in @file{ly/string-tunings-init.ly}. -@funindex stringTuning @funindex \stringTuning @cindex tablature, custom string tunings @cindex custom string tunings @@ -691,6 +713,44 @@ A modern tab clef can also be used. The modern tab clef supports tablatures from 4 to 7 strings. +@cindex micro-tones, tab +@cindex quarter-tones, tab +@cindex tab micro-tones +@cindex tab quarter-tones + +@code{TabStaff} may support micro-tones like quarter-tones, which +can be played using bendings. +@code{supportNonIntegerFret = ##t} needs to be set in +Score-context. However, micro-tones are not supported in @code{FretBoards}. + +@lilypond[quote,ragged-right,verbatim] +\layout { + \context { + \Score + supportNonIntegerFret = ##t + } +} + +custom-tuning = \stringTuning + +mus = \relative { + eeses'4 + eeseh + ees + eeh + e + eih + eis + eisih + eisis +} + +<< + \new Staff << \clef "G_8" \mus >> + \new TabStaff \with { stringTunings = \custom-tuning } \mus +>> +@end lilypond + @seealso Notation Reference: @ref{Absolute octave entry}, @@ -782,7 +842,6 @@ the fret-diagram markup string. @cindex fret-diagram markup @cindex ukulele -@funindex fret-diagram @funindex \fret-diagram The size of the fret diagram, and the number of frets in the diagram @@ -873,7 +932,6 @@ markup string. @cindex fret-diagram-terse markup -@funindex fret-diagram-terse @funindex \fret-diagram-terse The fret-diagram-terse markup string omits string numbers; the string @@ -951,7 +1009,6 @@ Other fret diagram properties must be adjusted using @cindex fret-diagram-verbose markup @cindex capo -@funindex fret-diagram-verbose @funindex \fret-diagram-verbose The fret-diagram-verbose markup string is in the format of a Scheme list. Each @@ -997,12 +1054,17 @@ can be placed on the fret diagram. The capo indication is a thick bar that covers all strings. The fret with the capo will be the lowest fret in the fret diagram. +Fingering indication dots can be colored as well as parenthesized; +the parenthesis's color can also be altered independently. + +Markups can be placed into the dots as well. + @c \override is necessary to make fingering visible @lilypond[quote, verbatim] << \new ChordNames { \chordmode { - f1 g c + f1 g c c b } } \new Staff { @@ -1038,6 +1100,35 @@ capo will be the lowest fret in the fret diagram. (place-fret 2 5 3) ) } + \override Voice.TextScript.size = 1.4 + 1^\markup { + \fret-diagram-verbose #'( + (place-fret 6 3 1 red parenthesized default-paren-color) + (place-fret 5 3 1 inverted) + (place-fret 4 5 2 blue parenthesized) + (place-fret 3 5 3 blue) + (place-fret 2 5 4 blue) + (place-fret 1 3 1 inverted) + ) + } + \override Voice.TextScript.size = 1.5 + 1^\markup { + \override #'(fret-diagram-details . ((finger-code . in-dot))) + \fret-diagram-verbose #`( + (place-fret 5 2 1) + (place-fret 4 4 "fis" red) + (place-fret 3 4 "b" red) + (place-fret + 2 4 + ,#{ \markup + \concat { + \vcenter "d" + \fontsize #-5 + \musicglyph #"accidentals.sharp"} #} + red) + (place-fret 1 2 1) + ) + } } >> @end lilypond @@ -1204,7 +1295,6 @@ either as simultaneous music or using chord mode (see @cindex fret diagrams with chord names @funindex ChordNames -@funindex chordmode @funindex \chordmode It is common that both chord names and fret diagrams are displayed together. @@ -1348,8 +1438,6 @@ mychords = \chordmode { @cindex chord shapes for fretted instruments @funindex \addChordShape -@funindex addChordShape -@funindex storePredefinedDiagram @funindex \storePredefinedDiagram In addition to fret diagrams, LilyPond stores an internal list of chord @@ -1466,9 +1554,7 @@ calculates strings and frets that can be used to play the notes. >> @end lilypond -@funindex predefinedFretboardsOff @funindex \predefinedFretboardsOff -@funindex predefinedFretboardsOn @funindex \predefinedFretboardsOn As no predefined diagrams are loaded by default, automatic calculation @@ -1603,7 +1689,6 @@ with non-monotonic tunings. @cindex fingerings, right hand for fretted instruments @cindex right hand fingerings for fretted instruments -@funindex rightHandFinger @funindex \rightHandFinger Right-hand fingerings @var{p-i-m-a} must be entered using @@ -1612,14 +1697,14 @@ Right-hand fingerings @var{p-i-m-a} must be entered using @warning{If the number is entered in Scheme notation, remember to append a space before following it with a closing @code{>} or similar.} -@lilypond[quote,verbatim,relative=0] +@lilypond[quote,verbatim,fragment] \clef "treble_8" c4\rightHandFinger #1 e\rightHandFinger #2 g\rightHandFinger #3 -c\rightHandFinger #4 -1 +c'\rightHandFinger #4 +1 @end lilypond For convenience, you can abbreviate @code{\rightHandFinger} to something @@ -1673,14 +1758,16 @@ or, for experienced users, a typesetter like GuitarTeX. This example demonstrates how to include guitar position and barring indications. -@lilypond[quote,ragged-right,verbatim,relative=0] -\clef "treble_8" -b16 d g b e -\textSpannerDown -\override TextSpanner.bound-details.left.text = #"XII " -g16\startTextSpan -b16 e g e b g\stopTextSpan -e16 b g d +@lilypond[quote,ragged-right,verbatim,fragment] +\relative { + \clef "treble_8" + b,16 d g b e + \textSpannerDown + \override TextSpanner.bound-details.left.text = #"XII " + g16\startTextSpan + b16 e g e b g\stopTextSpan + e16 b g d +} @end lilypond @seealso @@ -1705,10 +1792,10 @@ harmonics. Harmonics are normally further explained with a text markup. @lilypond[quote,ragged-right,verbatim] -\relative c' { +\relative { \clef "treble_8" \override Staff.NoteHead.style = #'harmonic-mixed - d^\markup { \italic { \fontsize #-2 { "harm. 12" }}} 1 + d'^\markup { \italic { \fontsize #-2 { "harm. 12" }}} 1 } @end lilypond @@ -1716,7 +1803,7 @@ Dampened notes (also called @notation{dead notes}) are supported within normal and tablature staves: @lilypond[quote,ragged-right,verbatim] -music = \relative c' { +music = \relative { < a\3 \deadNote c\2 a'\1 >4 < b\3 \deadNote d\2 b'\1 > < c\3 \deadNote e\2 c'\1 > @@ -1772,7 +1859,6 @@ Notation Reference: @node Indicating power chords @unnumberedsubsubsec Indicating power chords -@funindex powerChords @funindex \powerChords @cindex power chords @@ -1785,11 +1871,11 @@ constructs: ChordsAndSymbols = { \chordmode { \powerChords - e,,1:1.5 - a,,1:1.5.8 + e,,1:5 + a,,1:5.8 \set minimumFret = #8 - c,1:1.5 - f,1:1.5.8 + c,1:5 + f,1:5.8 } \set minimumFret = #5 1 @@ -1818,8 +1904,8 @@ other common chord modifier is used: mixedChords = \chordmode { c,1 \powerChords - b,,1:1.5 - fis,,1:1.5.8 + b,,1:5 + fis,,1:5.8 g,,1:m } \score { @@ -1914,3 +2000,56 @@ Installed Files: Snippets: @rlsr{Fretted strings}. + + +@node Lute +@subsection Lute + +@menu +* Lute tablatures:: +@end menu + +@node Lute tablatures +@unnumberedsubsubsec Lute tablatures + +@cindex lute tablatures +@cindex tablature, lute + +LilyPond supports tablature for lute. + +To get additional bass strings use @code{additionalBassStrings}, where the +pitches of those strings are set. They will be printed below lowest line as: +a, /a, //a, ///a, 4, 5 etc. + +@code{fret-letter-tablature-format} for @code{tablatureFormat} should be used, +probably @code{fretLabels} for further customizing. + +@lilypond[quote,ragged-right,verbatim] +m = { f'4 d' a f d a, g, fis, e, d, c, \bar "|." } + +\score { + << + \new Staff { \clef bass \cadenzaOn \m } + \new TabStaff \m + >> + \layout { + \context { + \Score + tablatureFormat = #fret-letter-tablature-format + } + \context { + \TabStaff + stringTunings = \stringTuning + additionalBassStrings = \stringTuning + fretLabels = #'("a" "b" "r" "d" "e" "f" "g" "h" "i" "k") + } + } +} +@end lilypond + +@cindex lute tunings +@cindex tunings, lute + +@knownissues +Using @code{FretBoards} with @code{additionalBassStrings} is not supported and +will yield unsatisfying results. diff --git a/Documentation/notation/input.itely b/Documentation/notation/input.itely index 0663c9c617..ce33708eac 100644 --- a/Documentation/notation/input.itely +++ b/Documentation/notation/input.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.22" @node General input and output @chapter General input and output @@ -21,7 +21,7 @@ rather than specific notation. * Titles and headers:: * Working with input files:: * Controlling output:: -* MIDI output:: +* Creating MIDI output:: * Extracting musical information:: @end menu @@ -277,7 +277,7 @@ Lilypond provides facilities to allow you to control what file names are used by the various back-ends when producing output files. In the previous section, we saw how Lilypond prevents name-clashes when -producing several ouputs from a single source file. You also have the +producing several outputs from a single source file. You also have the ability to specify your own suffixes for each @code{\book} block, so for example you can produce files called @file{eightminiatures-Romanze.pdf}, @file{eightminiatures-Menuetto.pdf} @@ -521,12 +521,17 @@ Notation Reference: @node Titles and headers @section Titles and headers +@cindex titles +@cindex headers +@cindex footers + Almost all printed music includes a title and the composer's name; some pieces include a lot more information. @menu * Creating titles headers and footers:: * Custom titles headers and footers:: +* Creating PDF metadata:: * Creating footnotes:: * Reference to page numbers:: * Table of contents:: @@ -643,10 +648,10 @@ suitable, as here: } \score { - \new Staff \relative g, { + \new Staff \relative { \clef bass \key g \major - \repeat unfold 2 { g16( d' b') a b d, b' d, } | + \repeat unfold 2 { g,16( d' b') a b d, b' d, } | \repeat unfold 2 { g,16( e' c') b c e, c' e, } | } \header { @@ -655,7 +660,7 @@ suitable, as here: } \score { - \new Staff \relative b { + \new Staff \relative { \clef bass \key g \major \partial 16 b16 | @@ -681,7 +686,7 @@ suppressed: \header { title = "DAS WOHLTEMPERIRTE CLAVIER" subtitle = "TEIL I" - % Do not display the tagline for this book + % Do not display the default LilyPond footer for this book tagline = ##f } \markup { \vspace #1 } @@ -723,7 +728,7 @@ Notation Reference: @node Default layout of bookpart and score titles @unnumberedsubsubsec Default layout of bookpart and score titles -This example demonstrates all @code{\header} variables: +This example demonstrates all printed @code{\header} variables: @lilypond[papersize=a6landscape,quote,verbatim,noragged-right] \book { @@ -742,8 +747,8 @@ This example demonstrates all @code{\header} variables: meter = "Meter" arranger = "Arranger" % The following fields are centered at the bottom - tagline = "tagline goes at the bottom of the last page" - copyright = "copyright goes at the bottom of the first page" + tagline = "The tagline goes at the bottom of the last page" + copyright = "The copyright goes at the bottom of the first page" } \score { { s1 } @@ -875,8 +880,8 @@ the @code{copyright} text if there is only a single page. @end itemize -The default tagline can be changed by adding a @code{tagline} in the -top-level @code{\header} block. +The default LilyPond footer text can be changed by adding a +@code{tagline} in the top-level @code{\header} block. @lilypond[papersize=a8landscape,verbatim] \book { @@ -884,14 +889,15 @@ top-level @code{\header} block. tagline = "... music notation for Everyone" } \score { - \relative c' { - c4 d e f + \relative { + c'4 d e f } } } @end lilypond -To remove the @code{tagline} set the value to @code{##f}. +To remove the default LilyPond footer text, the @code{tagline} can be +set to @code{##f}. @node Custom titles headers and footers @@ -1194,6 +1200,44 @@ Notation Reference: Installed Files: @file{../ly/titling-init.ly}. +@node Creating PDF metadata +@subsection Creating PDF metadata + +@cindex PDF metadata + +In addition to being shown in the printed output, @code{\header} variables +are also used to set PDF metadata (the information displayed by PDF readers +as the @code{properties} of the PDF file). For example, setting the +@code{title} property of the @code{header} block @q{Symphony I} will also give +this title to the PDF document. + +@example + @code{\header@{} + @code{title = "Symphony I"} + @code{@}} +@end example + +If you want to set the title of the printed output to one value, but have the +title property of the PDF to have a different value, you can use +@code{pdftitle}, as below. + +@example + @code{\header@{} + @code{title = "Symphony I"} + @code{pdftitle = "Symphony I by Beethoven"} + @code{@}} +@end example + +The variables @code{title}, @code{subject}, @code{keywords}, +@code{subtitle}, @code{composer}, @code{arranger}, @code{poet}, @code{author} +and @code{copyright} all set PDF properties and can all be prefixed with +@q{pdf} to set a PDF property to a value different from the printed output. + +The PDF property @code{Creator} is automatically set to @q{LilyPond} plus +the current LilyPond version, and @code{CreationDate} and @code{ModDate} are +both set to the current date and time. @code{ModDate} can be overridden by +setting the header variable @code{moddate} (or @code{pdfmoddate}) to a +valid PDF date string. @node Creating footnotes @subsection Creating footnotes @@ -1283,7 +1327,7 @@ left/bottom edge and zero implies the mark is centered on the edge. is the context in which the grob being footnoted is created. It may be omitted if the grob is in a bottom context, e.g. a @code{Voice} context. - + @item GrobName specifies a type of grob to mark (like @samp{Flag}). If it is specified, the footnote is not attached to a music expression in @@ -1354,8 +1398,8 @@ is: @lilypond[quote,verbatim,papersize=a8landscape] \book { \header { tagline = ##f } - \relative c'' { - a4_\footnote #'(0 . -1) "A slur forced down" ( + \relative { + a'4_\footnote #'(0 . -1) "A slur forced down" ( b8^\footnote #'(1 . 0.5) "A manual beam forced up" [ b8 ] c4 ) @@ -1537,7 +1581,7 @@ For example: \auto-footnote "recent" \italic " Aug 2012" "composition." } - \relative c' { + \relative { a'4 b8 e c4 d } } @@ -1583,7 +1627,7 @@ aliases may be used (see @ref{ASCII aliases}): } "composition." } - \relative c' { + \relative { a'4 b8 e c4 d } } @@ -1606,7 +1650,7 @@ Unicode character codes may also be used to specify marks } "composition." } - \relative c' { + \relative { a'4 b8 e c4 d } } @@ -1693,10 +1737,11 @@ ie. a two digit number. @node Table of contents @subsection Table of contents -A table of contents is included using the @code{\markuplist \table-of-contents} -command. The elements which should appear in the table of contents are -entered with the @code{\tocItem} command, which may be used either at -top-level, or inside a music expression. +A table of contents is included using the +@code{\markuplist \table-of-contents} command. The elements which +should appear in the table of contents are entered with the +@code{\tocItem} command, which may be used either at top-level, or +inside a music expression. @verbatim \markuplist \table-of-contents @@ -1719,39 +1764,89 @@ top-level, or inside a music expression. } @end verbatim -The markups which are used to format the table of contents are defined -in the @code{\paper} block. The default ones are @code{tocTitleMarkup}, -for formatting the title of the table, and @code{tocItemMarkup}, for -formatting the toc elements, composed of the element title and page -number. These variables may be changed by the user: +Markups used for formatting the table of contents are defined in the +@code{\paper} block. There are two @q{pre-defined} markups already +available; + +@itemize + +@item +@code{tocTitleMarkup} + +@noindent +Used for formatting the title of the table of contents. + +@verbatim +tocTitleMarkup = \markup \huge \column { + \fill-line { \null "Table of Contents" \null } + \null +} +@end verbatim + +@item +@code{tocItemMarkup} + +@noindent +Used for formatting the elements within the table of contents. + +@verbatim +tocItemMarkup = \markup \fill-line { + \fromproperty #'toc:text \fromproperty #'toc:page +} +@end verbatim + +@end itemize + +@noindent +Both of these variables can be changed. + +Here is an example changing the table of contents' title into French; @verbatim \paper { - %% Translate the toc title into French: tocTitleMarkup = \markup \huge \column { \fill-line { \null "Table des matières" \null } \hspace #1 } - %% use larger font size - tocItemMarkup = \markup \large \fill-line { - \fromproperty #'toc:text \fromproperty #'toc:page - } +@end verbatim + +Here is an example changing the font-size of the elements in the table +of contents; + +@verbatim +tocItemMarkup = \markup \large \fill-line { + \fromproperty #'toc:text \fromproperty #'toc:page } @end verbatim -Note how the toc element text and page number are referred to in -the @code{tocItemMarkup} definition. +Note how the element text and page numbers are referred to in the +@code{tocItemMarkup} definition. -New commands and markups may also be defined to build more elaborated -table of contents: -@itemize -@item first, define a new markup variable in the @code{\paper} block -@item then, define a music function which aims at adding a toc element -using this markup paper variable. -@end itemize +The @code{\tocItemWithDotsMarkup} command can be included within the +@code{tocItemMarkup} to fill the line, between a table of contents item +and its corresponding page number, with dots; -In the following example, a new style is defined for entering act names -in the table of contents of an opera: +@lilypond[verbatim,line-width=10.0\cm] +\header { tagline = ##f } +\paper { + tocItemMarkup = \tocItemWithDotsMarkup +} + +\book { + \markuplist \table-of-contents + \tocItem \markup { Allegro } + \tocItem \markup { Largo } + \markup \null +} +@end lilypond + +Custom commands with their own markups can also be defined to build a +more complex table of contents. In the following example, a new style +is defined for entering act names in a table of contents of an opera; + +@noindent +A new markup variable (called @code{tocActMarkup}) is defined in the +@code{\paper} block; @verbatim \paper { @@ -1761,12 +1856,22 @@ in the table of contents of an opera: \hspace #1 } } +@end verbatim + +@noindent +A custom music function (@code{tocAct}) is then created -- which uses +the new @code{tocActMarkup} markup definition. +@verbatim tocAct = -#(define-music-function (parser location text) (markup?) - (add-toc-item! 'tocActMarkup text)) + #(define-music-function (text) (markup?) + (add-toc-item! 'tocActMarkup text)) @end verbatim +@noindent +A LilyPond input file, using these customer definitions, could look +something like this; + @lilypond[line-width=10.0\cm] \header { tagline = ##f } \paper { @@ -1778,14 +1883,14 @@ tocAct = } tocAct = -#(define-music-function (parser location text) (markup?) +#(define-music-function (text) (markup?) (add-toc-item! 'tocActMarkup text)) \book { \markuplist \table-of-contents \tocAct \markup { Atto Primo } \tocItem \markup { Coro. Viva il nostro Alcide } - \tocItem \markup { Cesare. Presti omai l'Egizzia terra } + \tocItem \markup { Cesare. Presti omai l'Egizia terra } \tocAct \markup { Atto Secondo } \tocItem \markup { Sinfonia } \tocItem \markup { Cleopatra. V'adoro, pupille, saette d'Amore } @@ -1793,21 +1898,19 @@ tocAct = } @end lilypond -Dots can be added to fill the line between an item and its page number: -@lilypond[verbatim,line-width=10.0\cm] -\header { tagline = ##f } -\paper { - tocItemMarkup = \tocItemWithDotsMarkup -} +Here is an example of the @code{\fill-with-pattern} command used within +the context of a table of contents; -\book { - \markuplist \table-of-contents - \tocItem \markup { Allegro } - \tocItem \markup { Largo } - \markup \null +@verbatim +\paper { + tocItemMarkup = \markup { \fill-line { + \override #'(line-width . 70) + \fill-with-pattern #1.5 #CENTER . \fromproperty #'toc:text \fromproperty #'toc:page + } + } } -@end lilypond +@end verbatim @seealso Installed Files: @@ -2019,11 +2122,11 @@ may be combined on one staff, see @ref{Automatic part combining}. Here is an example: @lilypond[verbatim,quote] -sopranoMusic = \relative c'' { a4 b c b8( a) } -altoMusic = \relative g' { e4 e e f } -tenorMusic = \relative c' { c4 b e d8( c) } -bassMusic = \relative c' { a4 gis a d, } -allLyrics = \lyricmode {King of glo -- ry } +sopranoMusic = \relative { a'4 b c b8( a) } +altoMusic = \relative { e'4 e e f } +tenorMusic = \relative { c'4 b e d8( c) } +bassMusic = \relative { a4 gis a d, } +allLyrics = \lyricmode { King of glo -- ry } << \new Staff = "Soprano" \sopranoMusic \new Lyrics \allLyrics @@ -2041,17 +2144,11 @@ allLyrics = \lyricmode {King of glo -- ry } \new Lyrics \allLyrics \new PianoStaff << \new Staff = "RH" { - \set Staff.printPartCombineTexts = ##f - \partcombine - \sopranoMusic - \altoMusic + \partcombine \sopranoMusic \altoMusic } \new Staff = "LH" { - \set Staff.printPartCombineTexts = ##f \clef "bass" - \partcombine - \tenorMusic - \bassMusic + \partcombine \tenorMusic \bassMusic } >> >> @@ -2071,12 +2168,9 @@ LilyPond files}. @funindex \tag @funindex \keepWithTag @funindex \removeWithTag -@funindex \pushToTag -@funindex \appendToTag @cindex tag @cindex keep tagged music @cindex remove tagged music -@cindex splice into tagged music The @code{\tag #'@var{partA}} command marks a music expression with the name @var{partA}. @@ -2091,7 +2185,7 @@ to tagged music is as follows: Tagged music preceded by @code{\keepWithTag #'@var{name}} or @code{\keepWithTag #'(@var{name1} @var{name2}@dots{})} @tab Untagged music and music tagged with any of the given tag - names is included; + names is included; music tagged with any other tag name is excluded. @item Tagged music preceded by @code{\removeWithTag #'@var{name}} or @@ -2106,17 +2200,23 @@ Tagged music not preceded by either @code{\keepWithTag} or @end multitable The arguments of the @code{\tag}, @code{\keepWithTag} and -@code{\removeWithTag} commands should be a symbol -(such as @code{#'score} or @code{#'part}), followed -by a music expression. +@code{\removeWithTag} commands should be a symbol or list of +symbols (such as @code{#'score} or @code{#'(violinI violinII}), +followed by a music expression. If @emph{and only if} the symbols +are valid LilyPond identifiers (alphabetic characters only, no +numbers, underscores, or dashes) which cannot be confused with notes, +the @code{#'} may be omitted and, as a shorthand, a list of symbols +can use the dot separator: i.e. @code{\tag #'(violinI violinII)} can +be written @code{\tag violinI.violinII}. The same applies to +@code{\keepWithTag} and @code{\removeWithTag}. In the following example, we see two versions of a piece of music, one showing trills with the usual notation, and one with trills explicitly expanded: @lilypond[verbatim,quote] -music = \relative g' { - g8. c32 d +music = \relative { + g'8. c32 d \tag #'trills { d8.\trill } \tag #'expand { \repeat unfold 3 { e32 d } } c32 d @@ -2134,8 +2234,8 @@ music = \relative g' { Alternatively, it is sometimes easier to exclude sections of music: @lilypond[verbatim,quote] -music = \relative g' { - g8. c32 d +music = \relative { + g'8. c32 d \tag #'trills { d8.\trill } \tag #'expand {\repeat unfold 3 { e32 d } } c32 d @@ -2185,8 +2285,8 @@ music = \relative c'' { Multiple @code{\removeWithTag} filters may be applied to a single music expression to remove several differently named tagged -sections. Alternatively, you can use a single -@code{\removeWithTag} with a list of tags. +sections. Alternatively, you can use a single @code{\removeWithTag} +with a list of tags. @lilypond[verbatim,quote] music = \relative c'' { @@ -2204,13 +2304,77 @@ music = \relative c'' { } @end lilypond -Two or more @code{\keepWithTag} filters applied to a single music -expression will cause @emph{all} tagged sections to be removed, as -the first filter will remove all tagged sections except the one -named, and the second filter will remove even that tagged section. -Usually you would rather want to use a single @code{\keepWithTag} -command with a list of multiple tags: this will only remove tagged -sections not given in @emph{any} of the tags. +Using two or more @code{\keepWithTag} filters on a single music +expression will cause @emph{all} of the tagged sections to be removed. +The first filter will remove all except the one named and any subsequent +filters will remove the rest. Using one @code{\keepWithTag} command +with a list of multiple tags will only remove tagged sections that are +not specified in that list. + +@lilypond[verbatim,quote] +music = \relative c'' { + \tag #'violinI { a4 a a a } + \tag #'violinII { b4 b b b } + \tag #'viola { c4 c c c } + \tag #'cello { d4 d d d } +} + +\new Staff { + \keepWithTag #'(violinI violinII) + \music +} +@end lilypond + +@noindent +will print @code{\tag}s @var{violinI} and @var{violinII} but not +@var{viola} or @var{cello}. + +@cindex tag groups +@funindex \tagGroup + +While @code{\keepWithTag} is convenient when dealing with @emph{one} set +of alternatives, the removal of music tagged with @emph{unrelated} tags +is problematic when using them for more than one purpose. In that case +@q{groups} of tags can be declared: + +@example +\tagGroup #'(violinI violinII viola cello) +@end example + +@noindent +Now all the different tags belong to a single @q{tag group}. Note that +individual tags cannot be members of more than one @emph{tag group}. + +@example +\keepWithTag #'violinI @dots{} +@end example + +@noindent +will now only show music tagged from @code{violinI}'s tag group and any +music tagged with one of the @emph{other} tags will removed. + +@lilypond[verbatim,quote] +music = \relative { + \tagGroup #'(violinI violinII viola cello) + \tag #'violinI { c''4^"violinI" c c c } + \tag #'violinII { a2 a } + \tag #'viola { e8 e e2. } + \tag #'cello { d'2 d4 d } + R1^"untagged" +} + +\new Voice { + \keepWithTag #'violinI + \music +} +@end lilypond + +When using the @code{\keepWithTag} command, only tags from the tag +groups of the tags given in the command are visible. + +@funindex \pushToTag +@funindex \appendToTag +@cindex splice into tagged music Sometimes you want to splice some music at a particular place in an existing music expression. You can use @code{\pushToTag} and @@ -2220,22 +2384,20 @@ construct has @code{elements}, but sequential and simultaneous music are safe bets: @lilypond[verbatim,quote] -test = { \tag #'here { \tag #'here <> } } +music = { \tag #'here { \tag #'here <> } } { \pushToTag #'here c' \pushToTag #'here e' - \pushToTag #'here g' \test + \pushToTag #'here g' \music \appendToTag #'here c' \appendToTag #'here e' - \appendToTag #'here g' \test + \appendToTag #'here g' \music } @end lilypond Both commands get a tag, the material to splice in at every occurence of -the tag, and the tagged expression. The commands make sure to -copy everything that they change so that the original @code{\test} -retains its meaning. +the tag, and the tagged expression. @seealso Learning Manual: @@ -2322,7 +2484,7 @@ instruction containing non-ASCII characters, must be encoded in UTF-8. The easiest way to enter such text is by using a Unicode-aware editor and saving the file with UTF-8 encoding. Most popular modern editors have UTF-8 support, for example, vim, Emacs, -jEdit, and GEdit do. All MS Windows systems later than NT use +jEdit, and Gedit do. All MS Windows systems later than NT use Unicode as their native character encoding, so even Notepad can edit and save a file in UTF-8 format. A more functional alternative for Windows is BabelPad. @@ -2339,8 +2501,20 @@ will be generated. Here is an example showing Cyrillic, Hebrew and Portuguese text: +@c NOTE: No verbatim in the following example as the code does not +@c display correctly in PDF Font settings for Cyrillic and Hebrew + @lilypond[quote] -%c No verbatim here as the code does not display correctly in PDF +% Linux Libertine fonts contain Cyrillic and Hebrew glyphs. +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + #:sans "Linux Biolinum O,sans-serif" + #:typewriter "Linux Libertine Mono O,monospace" + )) +} + % Cyrillic bulgarian = \lyricmode { Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон. @@ -2356,8 +2530,8 @@ portuguese = \lyricmode { à vo -- cê uma can -- ção legal } -\relative c' { - c2 d e f g f e +\relative { + c'2 d e f g f e } \addlyrics { \bulgarian } \addlyrics { \hebrew } @@ -2399,13 +2573,13 @@ lyrics and as stand-alone text below the score: @lilypond[quote,verbatim] \score { - \relative c'' { - c1 \mark \markup { \char ##x03EE } + \relative { + c''1 \mark \markup { \char ##x03EE } c1_\markup { \tiny { \char ##x03B1 " to " \char ##x03C9 } } } \addlyrics { O \markup { \concat { Ph \char ##x0153 be! } } } } -\markup { "Copyright 2008--2012" \char ##x00A9 } +\markup { "Copyright 2008--2015" \char ##x00A9 } @end lilypond @cindex copyright sign @@ -2481,40 +2655,54 @@ Installed Files: * Replacing the notation font:: @end menu +@funindex clip-regions +@cindex Fragments, music +@cindex Music fragments + @node Extracting fragments of music @subsection Extracting fragments of music -It is possible to quote small fragments of a large score directly from -the output. This can be compared to clipping a piece of a paper score -with scissors. - -This is done by defining the measures that need to be cut out -separately. For example, including the following definition - +It is possible to output one or more fragments of a score by defining +the explicit location of the music to be extracted within the +@code{\layout} block of the input file using the @code{clip-regions} +function, and then running LilyPond with the @option{-dclip-systems} +option; -@verbatim -\layout { +@example +\layout @{ clip-regions = #(list (cons (make-rhythmic-location 5 1 2) (make-rhythmic-location 7 3 4))) -} -@end verbatim +@} +@end example @noindent -will extract a fragment starting halfway the fifth measure, ending in -the seventh measure. The meaning of @code{5 1 2} is: after a 1/2 note -in measure 5, and @code{7 3 4} after 3 quarter notes in measure 7. +This example will extract a single fragment of the input file +@emph{starting} after a half-note duration in fifth measure +(@code{5 1 2}) and @emph{ending} after the third quarter-note in the +seventh measure (@code{7 3 4}). + +Additional fragments can be extracted by adding more pairs of +@code{make-rhythmic-location} entries to the @code{clip-regions} list in +the @code{\layout} block. + +By default, each music fragment will be output as a separate @code{EPS} +file, but other formats such as @code{PDF} or @code{PNG} can also be +created if required. The extracted music is output as if had been +literally @q{cut} from the original printed score so if a fragment runs +over one or more lines, a separate output file for each line will be +generated. + +@seealso +Notation Reference: +@ref{The layout block}. -More clip regions can be defined by adding more pairs of -rhythmic-locations to the list. +Application Usage: +@rprogram{Command-line usage}. -In order to use this feature, LilyPond must be invoked with -@option{-dclip-systems}. The clips are output as EPS files, and are -converted to PDF and PNG if these formats are switched on as well. -For more information on output formats, see @rprogram{Invoking lilypond}. @node Skipping corrected music @subsection Skipping corrected music @@ -2551,12 +2739,15 @@ This property is also used to control output to the MIDI file. Note that it skips all events, including tempo and instrument changes. You have been warned. -@lilypond[quote,relative=2,ragged-right,verbatim] -c8 d -\set Score.skipTypesetting = ##t -e8 e e e e e e e -\set Score.skipTypesetting = ##f -c8 d b bes a g c2 +@lilypond[quote,ragged-right,verbatim] +\relative c' { + c1 + \set Score.skipTypesetting = ##t + \tempo 4 = 80 + c4 c c c + \set Score.skipTypesetting = ##f + d4 d d d +} @end lilypond In polyphonic music, @code{Score.skipTypesetting} will affect all @@ -2571,11 +2762,10 @@ voices and staves, saving even more time. @cindex EPS output The default output formats for the printed score are Portable -Document Format (PDF) and PostScript (PS). Scalable Vector -Graphics (SVG), Encapsulated PostScript (EPS) and Portable -Network Graphics (PNG) output formats are also available through -command line options, see -@rprogram{Basic command line options for LilyPond}. +Document Format (PDF) and PostScript (PS). Portable +Network Graphics (PNG), Scalable Vector Graphics (SVG) and Encapsulated +PostScript (EPS) output is available through the command line option, +see @rprogram{Basic command line options for LilyPond}. @node Replacing the notation font @@ -2618,635 +2808,768 @@ information on these and other specifics, including licensing of Gonville. -@node MIDI output -@section MIDI output +@node Creating MIDI output +@section Creating MIDI output @cindex Sound @cindex MIDI -MIDI (Musical Instrument Digital Interface) is a standard for -connecting and controlling digital instruments. A MIDI file is a -series of notes in a number of tracks. It is not an actual -sound file; you need special software to translate between the -series of notes and actual sounds. +LilyPond can produce files that conform to the MIDI (Musical Instrument +Digital Interface) standard and so allow for the checking of the music +output aurally (with the help of an application or device that +understands MIDI). Listening to MIDI output may also help in spotting +errors such as notes that have been entered incorrectly or are missing +accidentals and so on. -Pieces of music can be converted to MIDI files, so you can listen to -what was entered. This is convenient for checking the music; octaves -that are off or accidentals that were mistyped stand out very much -when listening to the MIDI output. - -Standard MIDI output is somewhat crude; optionally, an enhanced and -more realistic MIDI output is available by means of -@ref{The Articulate script}. - -The MIDI output allocates a channel for each staff, and reserves channel -10 for drums. There are only 16 MIDI channels per device, so if the -score contains more than 15 staves, MIDI channels will be reused. +MIDI files do not contain sound (like AAC, MP3 or Vorbis files) but +require additional software to produce sound from them. @menu -* Creating MIDI files:: -* MIDI Instruments:: -* What goes into the MIDI output?:: -* Repeats in MIDI:: +* Supported notation for MIDI:: +* Unsupported notation for MIDI:: +* The MIDI block:: * Controlling MIDI dynamics:: -* Percussion in MIDI:: -* The Articulate script:: +* Using MIDI instruments:: +* Using repeats with MIDI:: +* MIDI channel mapping:: +* Context properties for MIDI effects:: +* Enhancing MIDI output:: @end menu -@node Creating MIDI files -@subsection Creating MIDI files +@cindex MIDI, Supported notation + +@node Supported notation for MIDI +@subsection Supported notation for MIDI + +The following musical notation can be used with LilyPond's default +capabilities to produce MIDI output; + +@itemize +@item Breath marks +@item Chords entered as chord names +@item Crescendi, decrescendi over multiple notes. The volume is altered +linearly between the two extremes +@item Dynamic markings from @code{ppppp} to @code{fffff}, including +@code{mp}, @code{mf} and @code{sf} +@item Microtones but @emph{not} microtonal chords. A MIDI player that +supports pitch bending will also be required. +@item Lyrics +@item Pitches +@item Rhythms entered as note durations, including tuplets +@item @q{Simple} articulations; staccato, staccatissimo, accent, marcato +and portato +@item Tempo changes using the @code{\tempo} function +@item Ties +@item Tremolos that are @emph{not} entered with a +@q{@code{:}[@var{number}]} value +@end itemize + +Panning, balance, expression, reverb and chorus effects can also be +controlled by setting context properties, +see @ref{Context properties for MIDI effects}. + +When combined with the @file{articulate} script the following, +additional musical notation can be output to MIDI; + +@itemize +@item Appoggiaturas. These are made to take half the value of the note +following (without taking dots into account). For example; + +@example +\appoggiatura c8 d2. +@end example + +@noindent +The c will take the value of a crotchet. + +@item Ornaments (i.e. mordents, trills and turns et al.) +@item Rallentando, accelerando, ritardando and a tempo +@item Slurs, including phrasing slurs +@item Tenuto +@end itemize + +@noindent +See @ref{Enhancing MIDI output}. + +@cindex MIDI, Unsupported notation + +@node Unsupported notation for MIDI +@subsection Unsupported notation for MIDI + +The following items of musical notation cannot be output to MIDI; + +@itemize +@item Articulations other than staccato, staccatissimo, accent, marcato +and portato +@item Crescendi and decrescendi over a @emph{single} note +@item Fermata +@item Figured bass +@item Glissandi +@item Falls and doits +@item Microtonal chords +@item Rhythms entered as annotations, e.g. swing +@item Tempo changes without @code{\tempo} (e.g. entered as annotations) +@item Tremolos that @emph{are} entered with a @q{@code{:}[@var{number}]} +value +@end itemize + + +@node The MIDI block +@subsection The MIDI block @cindex MIDI block -To create a MIDI output file from a LilyPond file, insert a @code{\midi} -block inside a @code{\score} block; + +To create a MIDI output file from a LilyPond input file, insert a +@code{\midi} block, which can be empty, within the @code{\score} block; @example \score @{ - @var{@dots{}music@dots{}} + @var{@dots{} music @dots{}} \layout @{ @} \midi @{ @} @} @end example -If there is @emph{only} a @code{\midi} block in a @code{\score} (i.e. -without any @code{\layout} block), then @emph{only} MIDI output will be -produced. No musical notation will be typeset. +@warning{ A @code{@bs{}score} block that, as well as the music, contains +only a @code{@bs{}midi} block (i.e. @emph{without} the @code{@bs{}layout} +block), will only produce MIDI output files. No notation will be +printed.} + +The default output file extension (@code{.midi}) can be changed by using +the @code{-dmidi-extension} option with the @code{lilypond} command: @example -\score @{ - @var{@dots{}music@dots{}} - \midi @{ @} -@} +lilypond -dmidi-extension=mid MyFile.ly +@end example + +Alternatively, add the following Scheme expression before the start of +either the @code{\book}, @code{\bookpart} or @code{\score} blocks. See +@ref{File structure}. + +@example +#(ly:set-option 'midi-extension "mid") @end example -Dynamics, pitches, rhythms, tempo changes and ties are all interpreted -and translated correctly. Dynamic @q{marks} translate into volume -levels with a @q{fixed fraction} of the available MIDI volume range; -crescendi and decrescendi make the volume vary linearly between their -two extremes. +@seealso +Notation Reference: +@ref{File structure}. + +Installed Files: +@file{scm/midi.scm}. + +@knownissues +There are fifteen MIDI channels available and one additional channel +(#10) for drums. Staves are assigned to channels in sequence, so a +score that contains more than fifteen staves will result in the extra +staves sharing (but not overwriting) the same MIDI channel. This may be +a problem if the sharing staves have conflicting, channel-based, MIDI +properties -- such as different MIDI instruments -- set. + + +@node Controlling MIDI dynamics +@subsection Controlling MIDI dynamics + +It is possible to control the overall MIDI volume, the relative volume +of dynamic markings and the relative volume of different instruments. + +Dynamic marks translate automatically into volume levels in the +available MIDI volume range whereas crescendi and decrescendi vary the +volume linearly between their two extremes. It is possible to control +the relative volume of dynamic markings, and the overall volume levels +of different instruments. + +@menu +* Dynamic marks in MIDI:: +* Setting MIDI volume:: +* Setting MIDI block properties:: +@end menu + +@cindex MIDI volume +@cindex MIDI equalization +@cindex MIDI dynamics +@cindex Dynamics in MIDI + + +@node Dynamic marks in MIDI +@unnumberedsubsubsec Dynamic marks in MIDI + +Only the dynamic markings from @code{ppppp} to @code{fffff}, including +@code{mp}, @code{mf} and @code{sf} have values assigned to them. This +value is then applied to the value of the overall MIDI volume range to +obtain the final volume included in the MIDI output for that particular +dynamic marking. The default fractions range from 0.25 for +@notation{ppppp} to 0.95 for @notation{fffff}. The complete set of +dynamic marks and their associated fractions can be found in +@file{scm/midi.scm}. + + +@snippets +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{creating-custom-dynamics-in-midi-output.ly} + +Installed Files: +@file{ly/script-init.ly} +@file{scm/midi.scm}. + +Snippets: +@rlsr{MIDI}. + +Internals Reference: +@rinternals{Dynamic_performer}. + -All @code{\tempo} indications, including all subsequent tempo changes, -specified within the music notation will be reflected in the MIDI -output. +@node Setting MIDI volume +@unnumberedsubsubsec Setting MIDI volume -Usually it is enough to leave the @code{\midi} block empty, but it -can contain context rearrangements, new context definitions or code -to set the values of properties. Here the tempo is set to 72 -quarter-note beats per minute, but @emph{only} for the MIDI's -audio playback. +The minimum and maximum overall volume of MIDI dynamic markings is +controlled by setting the properties @code{midiMinimumVolume} and +@code{midiMaximumVolume} at the @code{Score} level. These properties +have an effect only at the start of a voice and on dynamic marks. The +fraction corresponding to each dynamic mark is modified with this +formula + +@example +midiMinimumVolume + (midiMaximumVolume - midiMinimumVolume) * fraction +@end example + +In the following example the dynamic range of the overall MIDI +volume is limited to the range @code{0.2} - @code{0.5}. @example \score @{ - @var{@dots{}music@dots{}} + << + \new Staff @{ + \set Staff.midiInstrument = #"flute" + @var{@dots{} music @dots{}} + @} + \new Staff @{ + \set Staff.midiInstrument = #"clarinet" + @var{@dots{} music @dots{}} + @} + >> \midi @{ - \tempo 4 = 72 + \context @{ + \Score + midiMinimumVolume = #0.2 + midiMaximumVolume = #0.5 + @} @} @} @end example -Note that @code{\tempo} is actually a command for setting properties -during the interpretation of the music and in the context of output definitions, like a @code{\midi} block, is reinterpreted as if it -were a context modification. +Simple MIDI instrument equalization can be achieved by setting +@code{midiMinimumVolume} and @code{midiMaximumVolume} properties within +the @code{Staff} context. -@cindex MIDI context definitions +@example +\score @{ + \new Staff @{ + \set Staff.midiInstrument = #"flute" + \set Staff.midiMinimumVolume = #0.7 + \set Staff.midiMaximumVolume = #0.9 + @var{@dots{} music @dots{}} + @} + \midi @{ @} +@} +@end example -Context definitions follow the same syntax as those in a @code{\layout} -block; +For scores with multiple staves and multiple MIDI instruments, the +relative volumes of each instrument can be set individually; @example \score @{ - @var{@dots{}music@dots{}} - \midi @{ - \context @{ - \Voice - \remove "Dynamic_performer" + << + \new Staff @{ + \set Staff.midiInstrument = #"flute" + \set Staff.midiMinimumVolume = #0.7 + \set Staff.midiMaximumVolume = #0.9 + @var{@dots{} music @dots{}} @} - @} + \new Staff @{ + \set Staff.midiInstrument = #"clarinet" + \set Staff.midiMinimumVolume = #0.3 + \set Staff.midiMaximumVolume = #0.6 + @var{@dots{} music @dots{}} + @} + >> + \midi @{ @} @} @end example -removes the effect of dynamics from the MIDI output. Translation -modules for sound are called @q{performers}. +In this example the volume of the clarinet is reduced relative to the +volume of the flute. +If these volumes properties are not set then LilyPond still applies a +@q{small degree} of equalization to certain instruments. See +@file{scm/midi.scm}. -@snippets +Installed Files: +@file{scm/midi.scm}. +@seealso +Notation Reference: +@ref{Score layout}. + +Internals Reference: +@rinternals{Dynamic_performer}. + +@snippets @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] -{changing-midi-output-to-one-channel-per-voice.ly} +{replacing-default-midi-instrument-equalization.ly} @knownissues +Changes in the MIDI volume take place only on starting a note, so +crescendi and decrescendi cannot affect the volume of a single note. -Some operating systems require a @emph{specific} file extension for -MIDI files. If a different extension is preferred insert the following -line at the top-level of the input file, before the start of any -@code{\book}, @code{\bookpart} or @code{\score} blocks; + +@node Setting MIDI block properties +@unnumberedsubsubsec Setting MIDI block properties + +The @code{\midi} block can contain context rearrangements, new context +definitions or code that sets the values of certain properties. @example -#(ly:set-option 'midi-extension "mid") +\score @{ + @var{@dots{} music @dots{}} + \midi @{ + \tempo 4 = 72 + @} +@} @end example -This will set the default extension for MIDI files to @code{.mid}. +Here the tempo is set to 72 quarter-note beats per minute. The tempo +mark in the @code{\midi} block will not appear in the printed score. +Although any other @code{\tempo} indications specified within the +@code{\score} block will also be reflected in the MIDI output. -Alternatively, an option can be supplied on the command line: +In a @code{\midi} block the @code{\tempo} command is setting properties +during the interpretation of the music and in the context of output +definitions; so it is interpreted @emph{as if} it were a context +modification. + +@cindex MIDI context definitions +@cindex context definitions with MIDI + +Context definitions follow the same syntax as those in a @code{\layout} +block; @example -lilypond -dmidi-extension=mid MyFile.ly +\score @{ + @var{@dots{} music @dots{}} + \midi @{ + \context @{ + \Voice + \remove "Dynamic_performer" + @} + @} +@} @end example -Changes in the MIDI volume take place only on starting a note, so -crescendi and decrescendi cannot affect the volume of a single note. - -Some MIDI players may not always correctly handle tempo changes in the -midi output. +This example removes the effect of dynamics from the MIDI output. Note: +LilyPond's translation modules used for sound are called @q{performers}. @seealso -Installed Files: -@file{../ly/performer-init.ly}. - Learning Manual: @rlearning{Other sources of information}. +Notation Reference: +@ref{Expressive marks}, +@ref{Score layout}. -@node MIDI Instruments -@subsection MIDI Instruments - -@cindex instrument names -@cindex MIDI, instruments -@funindex Staff.midiInstrument - -The MIDI instrument to be used is specified by setting the -@code{Staff.midiInstrument} property to the instrument name. -The name should be chosen from the list in @ref{MIDI instruments}. +Installed Files: +@file{ly/performer-init.ly}. -@example -\new Staff @{ - \set Staff.midiInstrument = #"glockenspiel" - @var{@dots{}notes@dots{}} -@} -@end example +Snippets: +@rlsr{MIDI}. -@example -\new Staff \with @{midiInstrument = #"cello"@} @{ - @var{@dots{}notes@dots{}} -@} -@end example +Internals Reference: +@rinternals{Dynamic_performer}. -If the selected instrument does not exactly match an instrument from -the list of MIDI instruments, the Grand Piano (@code{"acoustic grand"}) -instrument is used. +@knownissues +Some MIDI players do not always correctly handle tempo changes in the +midi output. +Changes to the @code{midiInstrument}, as well as some MIDI options, at +the @emph{beginning} of a staff may appear twice in the MIDI output. -@node What goes into the MIDI output? -@subsection What goes into the MIDI output? -@c TODO Check grace notes - timing is suspect? -@menu -* Supported in MIDI:: -* Unsupported in MIDI:: -@end menu +@node Using MIDI instruments +@subsection Using MIDI instruments -@node Supported in MIDI -@unnumberedsubsubsec Supported in MIDI - -@cindex Pitches in MIDI -@cindex MIDI, Pitches -@cindex Quarter tones in MIDI -@cindex MIDI, quarter tones -@cindex Microtones in MIDI -@cindex MIDI, microtones -@cindex Chord names in MIDI -@cindex MIDI, chord names -@cindex Rhythms in MIDI -@cindex MIDI, Rhythms -@cindex Articlulate scripts -@cindex MIDI, articulations -@cindex articulations in MIDI -@cindex trills in MIDI -@cindex turns in MIDI -@cindex rallentando in MIDI -@cindex accelerando in MIDI -@c TODO etc - -The following items of notation are reflected in the MIDI output: +MIDI instruments are set using the @code{midiInstrument} property within +a @code{Staff} context. -@itemize -@item Pitches -@item Microtones (See @ref{Accidentals}. Rendering needs a -player that supports pitch bend.) -@item Chords entered as chord names -@item Rhythms entered as note durations, including tuplets -@item Tremolos entered without @q{@code{:}[@var{number}]} -@item Ties -@item Dynamic marks -@item Crescendi, decrescendi over multiple notes -@item Tempo changes entered with a tempo marking -@item Lyrics -@end itemize +@example +\score @{ + \new Staff @{ + \set Staff.midiInstrument = #"glockenspiel" + @var{@dots{} music @dots{}} + @} + \midi @{ @} +@} +@end example -Using @ref{The Articulate script}, a number of items are added to the -above list: +or -@itemize -@item Articulations (slurs, staccato, etc) -@item Trills, turns -@item Rallentando and accelerando -@end itemize +@example +\score @{ + \new Staff \with @{midiInstrument = #"cello"@} @{ + @var{@dots{} music @dots{}} + @} + \midi @{ @} +@} +@end example +If the instrument name does not match any of the instruments listed in +the @q{MIDI instruments} section, the @code{acoustic grand} instrument +will be used instead. See @ref{MIDI instruments}. -@node Unsupported in MIDI -@unnumberedsubsubsec Unsupported in MIDI +@seealso +Learning Manual: +@rlearning{Other sources of information}. -@c TODO index as above +Notation Reference: +@ref{MIDI instruments}, +@ref{Score layout}. -The following items of notation have no effect on the MIDI output, -unless you use @ref{The Articulate script}: +Installed Files: +@file{scm/midi.scm}. -@itemize -@item Rhythms entered as annotations, e.g. swing -@item Tempo changes entered as annotations with no tempo marking -@item Staccato and other articulations and ornamentations -@item Slurs and Phrasing slurs -@item Crescendi, decrescendi over a single note -@item Tremolos entered with @q{@code{:}[@var{number}]} -@item Figured bass -@item Microtonal chords -@end itemize +@knownissues +Percussion instruments that are notated in a @code{DrumStaff} +context will be output, correctly, to MIDI channel@tie{}10 but some +pitched, percussion instruments like the xylophone, marimba, vibraphone +or timpani, are treated as @qq{normal} instruments so the music for +these should be entered in a @code{Staff} (not @code{DrumStaff}) context +to obtain correct MIDI output. A full list of +@code{channel 10 drum-kits} entries can be found in @file{scm/midi.scm}. +See @rlearning{Other sources of information}. -@node Repeats in MIDI -@subsection Repeats in MIDI +@node Using repeats with MIDI +@subsection Using repeats with MIDI @cindex repeats in MIDI +@cindex MIDI using repeats @funindex \unfoldRepeats -With a few minor additions, all types of repeats can be represented -in the MIDI output. This is achieved by applying the -@code{\unfoldRepeats} music function. This function changes all -repeats to unfold repeats. +Repeats can be represented in the MIDI output by applying the +@code{\unfoldRepeats} command. -@lilypond[quote,verbatim] -\unfoldRepeats { - \repeat tremolo 8 { c'32 e' } - \repeat percent 2 { c''8 d'' } - \repeat volta 2 { c'4 d' e' f' } - \alternative { - { g' a' a' g' } - { f' e' d' c' } - } -} -\bar "|." -@end lilypond - -In scores containing multiple voices, unfolding of repeats in MIDI -output will only occur correctly if @emph{each} voice contains fully -notated repeat indications. +@example +\score @{ + \unfoldRepeats @{ + \repeat tremolo 8 @{ c'32 e' @} + \repeat percent 2 @{ c''8 d'' @} + \repeat volta 2 @{ c'4 d' e' f' @} + \alternative @{ + @{ g' a' a' g' @} + @{ f' e' d' c' @} + @} + @} + \midi @{ @} +@} +@end example -When creating a score file using @code{\unfoldRepeats} for MIDI, -it is necessary to make two @code{\score} blocks: one for MIDI -(with unfolded repeats) and one for notation (with volta, tremolo, -and percent repeats). For example, +In order to restrict the effect of @code{\unfoldRepeats} to the MIDI +output only, while also generating printable scores, it is necessary to +make @emph{two} @code{\score} blocks; one for MIDI (with unfolded +repeats) and one for the notation (with volta, tremolo, and percent +repeats); @example \score @{ - @var{@dots{}music@dots{}} - \layout @{ @dots{} @} + @var{@dots{} music @dots{}} + \layout @{ @} @} \score @{ - \unfoldRepeats @var{@dots{}music@dots{}} - \midi @{ @dots{} @} + \unfoldRepeats @{ + @var{@dots{} music @dots{}} + @} + \midi @{ @} @} @end example -@node Controlling MIDI dynamics -@subsection Controlling MIDI dynamics +When using multiple voices, each of the voices must contain completely +unfolded repeats for correct MIDI output. -MIDI dynamics are implemented by the Dynamic_performer which lives -by default in the Voice context. It is possible to control the -overall MIDI volume, the relative volume of dynamic markings and -the relative volume of different instruments. +@seealso +Notation Reference: +@ref{Repeats}. + + +@node MIDI channel mapping +@subsection MIDI channel mapping + +@cindex MIDI Channels +@cindex MIDI Tracks +@funindex midiChannelMapping + +When generating a MIDI file from a score, LilyPond will automatically +assign every note in the score to a MIDI channel, the one on which it +should be played when it is sent to a MIDI device. A MIDI channel has +a number of controls available to select, for example, the instrument +to be used to play the notes on that channel, or to request the MIDI +device to apply various effects to the sound produced on the channel. +At all times, every control on a MIDI channel can have only a single +value assigned to it (which can be modified, however, for example, +to switch to another instrument in the middle of a score). + +The MIDI standard supports only 16 channels per MIDI device. This +limit on the number of channels also limits the number of different +instruments which can be played at the same time. + +LilyPond creates separate MIDI tracks for each staff, (or discrete +instrument or voice, depending on the value of +@code{Score.midiChannelMapping}), and also for each lyrics context. +There is no limit to the number of tracks. + +To work around the limited number of MIDI channels, LilyPond supports +a number of different modes for MIDI channel allocation, selected using +the @code{Score.midiChannelMapping} context property. In each case, +if more MIDI channels than the limit are required, the allocated +channel numbers wrap around back to 0, possibly causing the incorrect +assignment of instruments to some notes. This context property can be +set to one of the following values: -@menu -* Dynamic marks:: -* Overall MIDI volume:: -* Equalizing different instruments (i):: -* Equalizing different instruments (ii):: -@end menu +@table @var -@node Dynamic marks -@unnumberedsubsubsec Dynamic marks - -Dynamic marks are translated to a fixed fraction of the available -MIDI volume range. The default fractions range from 0.25 for -@notation{ppppp} to 0.95 for @notation{fffff}. The set of dynamic -marks and the associated fractions can be seen in -@file{../scm/midi.scm}, see @rlearning{Other sources of information}. -This set of fractions may be changed or extended by providing a -function which takes a dynamic mark as its argument and returns the -required fraction, and setting -@code{Score.dynamicAbsoluteVolumeFunction} to this function. - -For example, if a @notation{rinforzando} dynamic marking, -@code{\rfz}, is required, this will not by default -have any effect on the MIDI volume, as this dynamic marking is not -included in the default set. Similarly, if a new dynamic marking -has been defined with @code{make-dynamic-script} that too will not -be included in the default set. The following example shows how the -MIDI volume for such dynamic markings might be added. The Scheme -function sets the fraction to 0.9 if a dynamic mark of rfz is -found, or calls the default function otherwise. +@item @code{'staff} -@lilypond[verbatim,quote] -#(define (myDynamics dynamic) - (if (equal? dynamic "rfz") - 0.9 - (default-dynamic-absolute-volume dynamic))) +Allocate a separate MIDI channel to each staff in the score (this is +the default). All notes in all voices contained within each staff will +share the MIDI channel of their enclosing staff, and all are encoded +in the same MIDI track. -\score { - \new Staff { - \set Staff.midiInstrument = #"cello" - \set Score.dynamicAbsoluteVolumeFunction = #myDynamics - \new Voice { - \relative c'' { - a4\pp b c-\rfz - } - } - } - \layout {} - \midi {} -} -@end lilypond +The limit of 16 channels is applied to the total number of staff and +lyrics contexts, even though MIDI lyrics do not take up a MIDI channel. -Alternatively, if the whole table of fractions needs to be -redefined, it would be better to use the -@notation{default-dynamic-absolute-volume} procedure in -@file{../scm/midi.scm} and the associated table as a model. -The final example in this section shows how this might be done. +@item @code{'instrument} -@node Overall MIDI volume -@unnumberedsubsubsec Overall MIDI volume +Allocate a separate MIDI channel to each distinct MIDI instrument +specified in the score. This means that all the notes played with the +same MIDI instrument will share the same MIDI channel (and track), even +if the notes come from different voices or staves. -The minimum and maximum overall volume of MIDI dynamic markings is -controlled by setting the properties @code{midiMinimumVolume} and -@code{midiMaximumVolume} at the @code{Score} level. These properties -have an effect only at the start of a voice and on dynamic marks. The -fraction corresponding to each dynamic mark is modified with this -formula +In this case the lyrics contexts do not count towards the MIDI channel +limit of 16 (as they will not be assigned to a MIDI instrument), so +this setting may allow a better allocation of MIDI channels when the +number of staves and lyrics contexts in a score exceeds 16. -@example -midiMinimumVolume + (midiMaximumVolume - midiMinimumVolume) * fraction -@end example +@item @code{'voice} -In the following example the dynamic range of the overall MIDI -volume is limited to the range 0.2 - 0.5. +Allocate a separate MIDI channel to each voice in the score that has a +unique name among the voices in its enclosing staff. Voices in +different staves are always assigned separate MIDI channels, but any two +voices contained within the same staff will share the same MIDI channel +if they have the same name. Because @code{midiInstrument} and the +several MIDI controls for effects are properties of the staff context, +they cannot be set separately for each voice. The first voice will be +played with the instrument and effects specified for the staff, and +voices with a different name from the first will be assigned the default +instrument and effects. -@lilypond[verbatim,quote] -\score { - << - \new Staff { - \key g \major - \time 2/2 - \set Staff.midiInstrument = #"flute" - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 - } - } - \new Staff { - \key g \major - \set Staff.midiInstrument = #"clarinet" - \new Voice \relative c'' { - b1\p a2. b8 a - g2. fis8 e - fis2 r - } - } - >> - \layout {} - \midi { - \tempo 2 = 72 - \context { - \Score - midiMinimumVolume = #0.2 - midiMaximumVolume = #0.5 - } - } -} -@end lilypond +Note: different instruments and/or effects can be assigned to several +voices on the same staff by moving the @code{Staff_performer} from the +@code{Staff} to the @code{Voice} context, and leaving +@code{midiChannelMapping} to default to @code{'staff} or set to +@code{'instrument}; see the snippet below. -@node Equalizing different instruments (i) -@unnumberedsubsubsec Equalizing different instruments (i) +@end table -If the minimum and maximum MIDI volume properties are set in -the @code{Staff} context the relative volumes of the MIDI -instruments can be controlled. This gives a basic instrument -equalizer, which can enhance the quality of the MIDI output -remarkably. +For example, the default MIDI channel mapping of a score can be changed +to the @code{'instrument} setting as shown: -In this example the volume of the clarinet is reduced relative -to the volume of the flute. +@example +\score @{ + ...music... + \midi @{ + \context @{ + \Score + midiChannelMapping = #'instrument + @} + @} +@} +@end example -@lilypond[verbatim,quote] -\score { - << - \new Staff { - \key g \major - \time 2/2 - \set Staff.midiInstrument = #"flute" - \set Staff.midiMinimumVolume = #0.7 - \set Staff.midiMaximumVolume = #0.9 - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 - } - } - \new Staff { - \key g \major - \set Staff.midiInstrument = #"clarinet" - \set Staff.midiMinimumVolume = #0.3 - \set Staff.midiMaximumVolume = #0.6 - \new Voice \relative c'' { - b1\p a2. b8 a - g2. fis8 e - fis2 r - } - } - >> - \layout {} - \midi { - \tempo 2 = 72 - } -} -@end lilypond +@snippets +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{changing-midi-output-to-one-channel-per-voice.ly} -@node Equalizing different instruments (ii) -@unnumberedsubsubsec Equalizing different instruments (ii) +@node Context properties for MIDI effects +@subsection Context properties for MIDI effects + +@cindex Effects in MIDI +@cindex Pan position in MIDI +@cindex Stereo balance in MIDI +@cindex Balance in MIDI +@cindex Expression in MIDI +@cindex Reverb in MIDI +@cindex Chorus level in MIDI +@funindex midiPanPosition +@funindex midiBalance +@funindex midiExpression +@funindex midiReverbLevel +@funindex midiChorusLevel + +The following context properties can be used to apply various MIDI +effects to notes played on the MIDI channel associated with the +current staff, MIDI instrument or voice (depending on the value of the +@code{Score.midiChannelMapping} context property and the context in +which the @code{Staff_performer} is located; see +@ref{MIDI channel mapping}). + +Changing these context properties will affect all notes played on the +channel after the change, however some of the effects may even apply +also to notes which are already playing (depending on the +implementation of the MIDI output device). + +The following context properties are supported: -If the MIDI minimum and maximum volume properties are not set -LilyPond will, by default, apply a small degree of equalization -to a few instruments. The instruments and the equalization -applied are shown in the table @notation{instrument-equalizer-alist} -in @file{../scm/midi.scm}. +@table @var -This basic default equalizer can be replaced by setting -@code{instrumentEqualizer} in the @code{Score} context to a new -Scheme procedure which accepts a MIDI instrument name as its only -argument and returns a pair of fractions giving the minimum and -maximum volumes to be applied to that instrument. This replacement -is done in the same way as shown for resetting the -@code{dynamicAbsoluteVolumeFunction} at the start of this section. -The default equalizer, @notation{default-instrument-equalizer}, in -@file{../scm/midi.scm} shows how such a procedure might be written. +@item @code{Staff.midiPanPosition} -The following example sets the relative flute and clarinet volumes -to the same values as the previous example. +The pan position controls how the sound on a MIDI channel is +distributed between left and right stereo outputs. The context +property accepts a number between -1.0 (@code{#LEFT}) and 1.0 +(@code{#RIGHT}); the value -1.0 will put all sound power to the left +stereo output (keeping the right output silent), the value 0.0 +(@code{#CENTER}) will distribute the sound evenly between the left and +right stereo outputs, and the value 1.0 will move all sound to the +right stereo output. Values between -1.0 and 1.0 can be used to obtain +mixed distributions between left and right stereo outputs. -@lilypond[verbatim,quote] -#(define my-instrument-equalizer-alist '()) +@item @code{Staff.midiBalance} -#(set! my-instrument-equalizer-alist - (append - '( - ("flute" . (0.7 . 0.9)) - ("clarinet" . (0.3 . 0.6))) - my-instrument-equalizer-alist)) +The stereo balance of a MIDI channel. Similarly to the pan position, +this context property accepts a number between -1.0 (@code{#LEFT}) and +1.0 (@code{#RIGHT}). It varies the relative volume sent to the two +stereo speakers without affecting the distribution of the stereo +signals. -#(define (my-instrument-equalizer s) - (let ((entry (assoc s my-instrument-equalizer-alist))) - (if entry - (cdr entry)))) +@item @code{Staff.midiExpression} -\score { - << - \new Staff { - \key g \major - \time 2/2 - \set Score.instrumentEqualizer = #my-instrument-equalizer - \set Staff.midiInstrument = #"flute" - \new Voice \relative c''' { - r2 g\mp g fis~ - fis4 g8 fis e2~ - e4 d8 cis d2 - } - } - \new Staff { - \key g \major - \set Staff.midiInstrument = #"clarinet" - \new Voice \relative c'' { - b1\p a2. b8 a - g2. fis8 e - fis2 r - } - } - >> - \layout { } - \midi { - \tempo 2 = 72 - } -} -@end lilypond +Expression level (as a fraction of the maximum available level) to +apply to a MIDI channel. A MIDI device combines the MIDI channel's +expression level with a voice's current dynamic level (controlled using +constructs such as @code{\p} or @code{\ff}) to obtain the total volume +of each note within the voice. The expression control could be used, for +example, to implement crescendo or decrescendo effects over single +sustained notes (not supported automatically by LilyPond). -@ignore -@c Delete when satisfied this is adequately covered elsewhere -td +@c Issue 4059 contains an attached snippet which shows how this might +@c be done, but this is too large and complex for the NR, even as a +@c referenced snippet. It could be added to the LSR. -@n ode Microtones in MIDI -@s ubsection Microtones in MIDI +The expression level ranges from 0.0 (no expression, meaning zero +volume) to 1.0 (full expression). -@cindex microtones in MIDI +@item @code{Staff.midiReverbLevel} -Microtones consisting of half sharps and half flats are exported -to the MIDI file and render correctly in MIDI players which support -pitch bending. See @ref{Note names in other languages}. Here is -an example showing all the half sharps and half flats. It can be -copied out and compiled to test microtones in your MIDI player. +Reverb level (as a fraction of the maximum available level) to apply +to a MIDI channel. This property accepts numbers between 0.0 (no +reverb) and 1.0 (full effect). -@lilypond[verbatim,quote] -\score { - \relative c' { - c4 cih cis cisih - d4 dih ees eeh - e4 eih f fih - fis4 fisih g gih - gis4 gisih a aih - bes4 beh b bih - } - \layout {} - \midi {} -} -@end lilypond -@end ignore +@item @code{Staff.midiChorusLevel} +Chorus level (as a fraction of the maximum available level) to apply to +a MIDI channel. This property accepts numbers between 0.0 (no chorus +effect) and 1.0 (full effect). -@node Percussion in MIDI -@subsection Percussion in MIDI +@end table -Percussion instruments are generally notated in a @code{DrumStaff} -context and when notated in this way they are outputted correctly -to MIDI channel@tie{}10, but some pitched percussion instruments, -like the xylophone, marimba, vibraphone, timpani, etc., are -treated like @qq{normal} instruments and music for these instruments -should be entered in a normal @code{Staff} context, not a -@code{DrumStaff} context, to obtain the correct MIDI output. -Some non-pitched percussion sounds included in the general MIDI -standard, like melodic tom, taiko drum, synth drum, etc., cannot -be reached via MIDI channel@tie{}10, so the notation for such -instruments should also be entered in a normal @code{Staff} -context, using suitable normal pitches. +@knownissues -Many percussion instruments are not included in the general MIDI -standard, e.g. castanets. The easiest, although unsatisfactory, -method of producing some MIDI output when writing for such -instruments is to substitute the nearest sound from the standard -set. +As MIDI files do not contain any actual audio data, changes in these +context properties translate only to requests for changing MIDI channel +controls in the outputted MIDI files. Whether a particular MIDI device +(such as a software MIDI player) can actually handle any of these +requests in a MIDI file is entirely up to the implementation of the +device: a device may choose to ignore some or all of these requests. +Also, how a MIDI device will interpret different values for these +controls (generally, the MIDI standard fixes the behavior only at the +endpoints of the value range available for each control), and whether a +change in the value of a control will affect notes already playing on +that MIDI channel or not, is also specific to the MIDI device +implementation. + +When generating MIDI files, LilyPond will simply transform the +fractional values within each range linearly into values in a +corresponding (7-bit, or 14-bit for MIDI channel controls which support +fine resolution) integer range (0-127 or 0-32767, respectively), +rounding fractional values towards the nearest integer away from zero. +The converted integer values are stored as-is in the generated MIDI +file. Please consult the documentation of your MIDI device for +information about how the device interprets these values. + + +@node Enhancing MIDI output +@subsection Enhancing MIDI output -@c TODO Expand with examples, and any other issues +@menu +* The articulate script:: +@end menu -@knownissues +The default MIDI output is basic but can be improved by setting MIDI +instruments, @code{\midi} block properties and/or using the +@file{articulate} script. -Because the general MIDI standard does not contain rim shots, the -sidestick is used for this purpose instead. +@cindex instrument names +@cindex MIDI, instruments +@cindex articulate script +@cindex articulate.ly +@funindex Staff.midiInstrument -@node The Articulate script -@subsection The Articulate script -A more realistic MIDI output is possible when using the Articulate -script. It tries to take articulations (slurs, staccato, etc) into -account, by replacing notes with sequential music of suitably -time-scaled note plus skip. It also tries to unfold trills turns -etc., and take rallentando and accelerando into account. +@node The articulate script +@unnumberedsubsubsec The @file{articulate} script -To use the Articulate script, you have to include it at the top of -your input file, +To use the @file{articulate} script add the appropriate @code{\include} +command at the top of the input file; @example \include "articulate.ly" @end example -and in the @code{\score} section do +The script creates MIDI output into appropriately @q{time-scaled} notes +to match many articulation and tempo indications. Engraved output +however, will also be altered to literally match the MIDI output. @example -\unfoldRepeats \articulate << - all the rest of the score@dots{} ->> +\score @{ + \articulate << + @var{@dots{} music @dots{}} + >> + \midi @{ @} +@} @end example -After altering your input file this way, the visual output is heavily -altered, but the standard @code{\midi} block will produce a better -MIDI file. +The @code{\articulate} command enables abbreviatures (such as trills and +turns) to be processed. A full list of supported items can be found in +the script itself. See @file{ly/articulate.ly}. -Although not essential for the Articulate script to work, you may want -to insert the @code{\unfoldRepeats} command as it appears in the -example shown above as it enables performing abbreviatures such as -@notation{trills}. +@seealso +Learning Manual: +@rlearning{Other sources of information}. -@knownissues +Notation Reference: +@ref{Score layout}. + +Installed Files: +@file{ly/articulate.ly}. + +@warning{The @file{articulate} script may shorten chords, which might +not be appropriate for some types of instrument, such as organ music. +Notes that do not have any articulations attached to them may also be +shortened; so to allow for this, restrict the use of the +@code{\articulate} function to shorter segments of music, or modify the +values of the variables defined in the @file{articulate} script to +compensate for the note-shortening behavior.} -Articulate shortens chords and some music (esp. organ music) could -sound worse. @node Extracting musical information @@ -3279,7 +3602,7 @@ line. For example, will display @example -@{ a,4 cis e fis g @} +@{ a,4 cis4 e4 fis4 g4 @} @end example By default, LilyPond will print these messages to the console @@ -3294,15 +3617,16 @@ lilypond file.ly >display.txt @funindex \void Note that Lilypond does not just display the music expression, but also interprets it (since @code{\displayLilyMusic} returns it in -addition to displaying it). This is convenient since you can just -insert @code{\displayLilyMusic} into existing music in order to get -information about it. If you don't actually want Lilypond to -interpret the displayed music as well as display it, use @code{\void} -in order to have it ignored: +addition to displaying it). Just insert @code{\displayLilyMusic} into +the existing music in order to get information about it. + +To interpret and display a music section in the console but, at the same +time, remove it from the output file use the @code{\void} command. @example @{ \void \displayLilyMusic \transpose c a, @{ c4 e g a bes @} + c1 @} @end example diff --git a/Documentation/notation/keyboards.itely b/Documentation/notation/keyboards.itely index a8405b5274..db8057b67f 100644 --- a/Documentation/notation/keyboards.itely +++ b/Documentation/notation/keyboards.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.25" @node Keyboard and other multi-staff instruments @section Keyboard and other multi-staff instruments @@ -112,7 +112,7 @@ as shown in @rlearning{Other uses for tweaks}. @c @snippets @c @lilypondfile[verbatim,quote,texidoc,doctitle] @c {forcing-visibility-of-systems-with-multi-bar-rests-when-using-\RemoveEmptyStaffContext.ly} -@c http://lsr.dsi.unimi.it/LSR/Item?u=1&id=312 +@c http://lsr.di.unimi.it/LSR/Item?u=1&id=312 @seealso Learning Manual: @@ -150,7 +150,6 @@ Snippets: @cindex beams, cross-staff @funindex \change -@funindex change Voices can be switched between staves manually, using the command @@ -262,7 +261,6 @@ right before a change in staff. In this case use manual beams. @cindex staff changes, automatic @funindex \autochange -@funindex autochange @funindex PianoStaff Voices can be made to switch automatically between the top and the @@ -289,11 +287,25 @@ in advance. } @end lilypond +@noindent +It is possible to specify other pitches for the turning point. +If the staves are not instantiated explicitly, other clefs may be used. + +@lilypond[quote,verbatim] +music = { + g8 b a c' b8 d' c'8 e' + d'8 r f' g' a'2 +} + +\autochange d' \music +\autochange b \with { \clef soprano } \music +\autochange d' \with { \clef alto } \with { \clef tenor } \music +@end lilypond + @cindex relative music and autochange @cindex autochange and relative music @funindex \relative -@funindex relative A @code{\relative} section that is outside of @code{\autochange} has no effect on the pitches of the music, so if necessary, put @@ -315,7 +327,7 @@ key signature in the lower staff: \new Staff = "up" { \new Voice = "melOne" { \key g \major - \autochange \relative c' { + \autochange \relative { g8 b a c b d c e d8 r fis, g a2 } @@ -366,18 +378,16 @@ staff based on the first note named in the chord construct. @funindex followVoice @funindex \showStaffSwitch -@funindex showStaffSwitch @funindex \hideStaffSwitch -@funindex hideStaffSwitch Whenever a voice switches to another staff, a line connecting the notes can be printed automatically: -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim] \new PianoStaff << \new Staff = "one" { \showStaffSwitch - c1 + c'1 \change Staff = "two" b2 a } @@ -470,30 +480,26 @@ piano. @cindex U.C. @funindex \sustainOn -@funindex sustainOn @funindex \sustainOff -@funindex sustainOff @funindex \sostenutoOn -@funindex sostenutoOn @funindex \sostenutoOff -@funindex sostenutoOff @funindex \unaCorda -@funindex unaCorda @funindex \treCorde -@funindex treCorde Pianos generally have three pedals that alter the way sound is produced: @notation{sustain}, @notation{sostenuto} (@notation{sos.}), and @notation{una corda} (@notation{U.C.}). Sustain pedals are also found on vibraphones and celestas. -@lilypond[quote,verbatim,relative=2] -c4\sustainOn d e g -1\sustainOff -c4\sostenutoOn e g c, -1\sostenutoOff -c4\unaCorda d e g -1\treCorde +@lilypond[quote,verbatim] +\relative { + c''4\sustainOn d e g + 1\sustainOff + c4\sostenutoOn e g c, + 1\sostenutoOff + c4\unaCorda d e g + 1\treCorde +} @end lilypond @cindex pedal indication styles @@ -512,15 +518,17 @@ There are three styles of pedal indications: text, bracket, and mixed. The sustain pedal and the una corda pedal use the text style by default while the sostenuto pedal uses mixed by default. -@lilypond[quote,verbatim,relative=2] -c4\sustainOn g c2\sustainOff -\set Staff.pedalSustainStyle = #'mixed -c4\sustainOn g c d -d\sustainOff\sustainOn g, c2\sustainOff -\set Staff.pedalSustainStyle = #'bracket -c4\sustainOn g c d -d\sustainOff\sustainOn g, c2 -\bar "|." +@lilypond[quote,verbatim] +\relative { + c''4\sustainOn g c2\sustainOff + \set Staff.pedalSustainStyle = #'mixed + c4\sustainOn g c d + d\sustainOff\sustainOn g, c2\sustainOff + \set Staff.pedalSustainStyle = #'bracket + c4\sustainOn g c d + d\sustainOff\sustainOn g, c2 + \bar "|." +} @end lilypond The placement of the pedal commands matches the physical movement of the @@ -580,7 +588,7 @@ come into use to simplify the performance instructions. @snippets @lilypondfile[verbatim,quote,texidoc,doctitle] -{accordion-registers.ly} +{accordion-register-symbols.ly} @seealso Snippets: @@ -641,20 +649,20 @@ is controlled by a single pedal. From the player's left to right, the pedals are D, C, and B on the left and E, F, G, and A on the right. The position of the pedals may be indicated with text marks: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \textLengthOn -cis1_\markup \concat \vcenter { +cis''1_\markup \concat \vcenter { [D \flat C \sharp B|E \sharp F \sharp G A \flat] } -c!1_\markup \concat \vcenter { +c''!1_\markup \concat \vcenter { [ C \natural ] } @end lilypond or pedal diagrams: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \textLengthOn -cis1_\markup { \harp-pedal #"^v-|vv-^" } -c!1_\markup { \harp-pedal #"^o--|vv-^" } +cis''1_\markup { \harp-pedal #"^v-|vv-^" } +c''!1_\markup { \harp-pedal #"^o--|vv-^" } @end lilypond The @code{\harp-pedal} command accepts a string of characters, where diff --git a/Documentation/notation/notation-appendices.itely b/Documentation/notation/notation-appendices.itely index 2e8ff7841c..3d8bf79f43 100644 --- a/Documentation/notation/notation-appendices.itely +++ b/Documentation/notation/notation-appendices.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.28" @node Notation manual tables @appendix Notation manual tables @@ -23,6 +23,7 @@ * List of colors:: * The Feta font:: * Note head styles:: +* Clef styles:: * Text markup commands:: * Text markup list commands:: * List of special characters:: @@ -203,7 +204,7 @@ Augmented triad, @*minor seventh @tab @code{aug7} @tab -@code{c1:aug} +@code{c1:aug7} @tab @lilypond[line-width=2.1\cm,noragged-right,notime] << @@ -235,7 +236,7 @@ Minor triad, @*major seventh @tab @code{m7+} @tab -@code{m7+} +@code{c1:m7+} @tab @lilypond[line-width=2.1\cm,noragged-right,notime] << @@ -475,10 +476,10 @@ Perfect fifth @tab @code{1.5} @tab -@code{\powerChords c1:1.5} +@code{\powerChords c1:5} @tab @lilypond[line-width=2.1\cm,noragged-right,notime] -\chordmode { \powerChords c1:1.5 } +\chordmode { \powerChords c1:5 } @end lilypond @item @@ -488,10 +489,10 @@ Perfect fifth, @*octave @tab @code{1.5.8} @tab -@code{\powerChords c1:1.5.8} +@code{\powerChords c1:5.8} @tab @lilypond[line-width=2.1\cm,noragged-right,notime] - \chordmode { \powerChords c1:1.5.8 } + \chordmode { \powerChords c1:5.8 } @end lilypond @end multitable @@ -1227,6 +1228,7 @@ see @ref{Formatting text}. \doc-chars #kievan @end lilypond + @node Note head styles @appendixsec Note head styles @@ -1236,6 +1238,241 @@ The following styles may be used for note heads. @lilypondfile[noindent]{note-head-style.ly} +@node Clef styles +@appendixsec Clef styles + +The following table shows all the different clef styles possible +(including where @emph{middle C} sits relative to the clef). + +@multitable @columnfractions .30 .2 .30 .2 + +@headitem +Example +@tab +Output +@tab +Example +@tab +Output + + +@item +@code{\clef G} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef G c1 +@end lilypond + +@tab +@code{\clef "G2"} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef "G2" +c1 +@end lilypond + +@item +@code{\clef treble} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef treble +c1 +@end lilypond + +@tab +@code{\clef violin} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef violin +c1 +@end lilypond + +@item +@code{\clef french} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef french +c1 +@end lilypond + +@tab +@code{\clef GG} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef GG +c1 +@end lilypond + +@item +@code{\clef tenorG} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef tenorG +c1 +@end lilypond + +@tab +@code{\clef soprano} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef soprano +c1 +@end lilypond + +@item +@code{\clef mezzosoprano} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef mezzosoprano +c1 +@end lilypond + +@tab +@code{\clef C} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef C +c1 +@end lilypond + +@item +@code{\clef alto} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef alto +c1 +@end lilypond + +@tab +@code{\clef tenor} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef tenor +c1 +@end lilypond + +@item +@code{\clef baritone} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef baritone +c1 +@end lilypond + +@tab +@code{\clef varC} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef varC +c1 +@end lilypond + +@item +@code{\clef altovarC} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef altovarC +c1 +@end lilypond + +@tab +@code{\clef tenorvarC} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef tenorvarC +c1 +@end lilypond + +@item +@code{\clef baritonevarC} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef baritonevarC +c1 +@end lilypond + +@tab +@code{\clef varbaritone} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef varbaritone +c1 +@end lilypond + +@item +@code{\clef baritonevarF} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef baritonevarF +c1 +@end lilypond + +@tab +@code{\clef F} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef F +c1 +@end lilypond + +@item +@code{\clef bass} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef bass +c1 +@end lilypond + +@tab +@code{\clef subbass} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef subbass +c1 +@end lilypond + +@item +@code{\clef percussion} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\clef percussion +c1 +@end lilypond + +@tab +@c @example does not work as expected within multitables +@code{ +\new TabStaff @{ @* +@ @ \clef tab @* +@} +} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\new TabStaff { + \clef tab + c1 +} +@end lilypond + +@item +@c @example does not work as expected within multitables +@code{ +\new TabStaff @{ @* +@ @ \clef moderntab @* +@} +} +@tab +@lilypond[line-width=3\cm,notime,ragged-right,relative=1] +\new TabStaff { + \clef moderntab + c1 +} +@end lilypond + + +@end multitable + + @node Text markup commands @appendixsec Text markup commands @@ -1272,54 +1509,10 @@ for more readability. @appendixsec List of articulations -@cindex accent -@cindex accentus -@cindex circulus -@cindex coda -@cindex downbow -@cindex downmordent -@cindex downprall -@cindex espressivo -@cindex fermata -@cindex flageolet -@cindex halfopen -@cindex ictus -@cindex lheel -@cindex lineprall -@cindex longfermata -@cindex ltoe -@cindex marcato -@cindex mordent -@cindex open -@cindex portato -@cindex prall -@cindex pralldown -@cindex prallmordent -@cindex prallprall -@cindex prallup -@cindex reverseturn -@cindex rheel -@cindex rtoe -@cindex segno -@cindex semicirculus -@cindex shortfermata -@cindex signumcongruentiae -@cindex snappizzicato -@cindex staccatissimo -@cindex staccato -@cindex stopped -@cindex tenuto -@cindex thumb -@cindex trill -@cindex turn -@cindex upbow -@cindex upmordent -@cindex upprall -@cindex varcoda -@cindex verylongfermata - -The following scripts are available in the Feta font and may be -attached to notes (eg. @samp{c\accent}). +The following lists show all the scripts in the Feta font that may be +attached to notes (eg. @samp{f\accent} or @samp{f->}). Each example +shows the script in the @emph{up}, @emph{down} and @emph{neutral} +positions respectively. @c Articulations and ornamentations @c Fingering instructions (for "thumb") @@ -1340,61 +1533,802 @@ attached to notes (eg. @samp{c\accent}). * Ancient scripts:: @end menu +@ignore +The @multitable @columnfraction value discrepancy between the first and +the remaining columns is deliberate; it seems (at least visually +anyway) the gap (after building the documentation) between first and +second column examples was always larger than between the remaining +columns - JL +@end ignore + +@cindex accent +@cindex espressivo +@cindex marcato +@cindex portato +@cindex staccatissimo +@cindex staccato +@cindex tenuto +@cindex thumb @node Articulation scripts @unnumberedsubsec Articulation scripts -@lilypond[quote] -\include "script-chart.ly" -\new RhythmicStaff { \scriptStaff #articulations } +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\accent} or @code{->} +@lilypond[notime,relative=2] +f^\accent e,_\accent b'\accent +@end lilypond +@tab +@code{\espressivo} +@lilypond[notime,relative=2] +f^\espressivo e,_\espressivo b'\espressivo +@end lilypond +@tab +@code{\marcato} or @code{-^} +@lilypond[notime,relative=2] +f^\marcato e,_\marcato b'\marcato +@end lilypond +@tab +@code{\portato} or @code{-_} +@lilypond[notime,relative=2] +f^\portato e,_\portato b'\portato +@end lilypond + +@item +@code{\staccatissimo} @* or @code{-!} +@lilypond[notime,relative=2] +f^\staccatissimo e,_\staccatissimo b'\staccatissimo +@end lilypond +@tab +@code{\staccato} or @code{-.} +@lilypond[notime,relative=2] +f^\staccato e,_\staccato b'\staccato +@end lilypond +@tab +@code{\tenuto} or @code{--} +@lilypond[notime,relative=2] +f^\tenuto e,_\tenuto b'\tenuto @end lilypond +@end multitable + +@cindex prall +@cindex prallup +@cindex pralldown +@cindex upprall +@cindex downprall +@cindex prallprall +@cindex lineprall +@cindex prallmordent +@cindex mordent +@cindex upmordent +@cindex downmordent +@cindex trill +@cindex turn +@cindex reverseturn + @node Ornament scripts @unnumberedsubsec Ornament scripts -@lilypond[quote] -\include "script-chart.ly" -\new RhythmicStaff { \scriptStaff #ornaments } +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\prall} +@lilypond[notime,relative=2] +f^\prall e,_\prall b'\prall +@end lilypond +@tab +@code{\prallup} +@lilypond[notime,relative=2] +f^\prallup e,_\prallup b'\prallup +@end lilypond +@tab +@code{\pralldown} +@lilypond[notime,relative=2] +f^\pralldown e,_\pralldown b'\pralldown +@end lilypond +@tab +@code{\upprall} +@lilypond[notime,relative=2] +f^\upprall e,_\upprall b'\upprall +@end lilypond + +@item +@code{\downprall} +@lilypond[notime,relative=2] +f^\downprall e,_\downprall b'\downprall +@end lilypond +@tab +@code{\prallprall} +@lilypond[notime,relative=2] +f^\prallprall e,_\prallprall b'\prallprall +@end lilypond +@tab +@code{\lineprall} +@lilypond[notime,relative=2] +f^\lineprall e,_\lineprall b'\lineprall +@end lilypond +@tab +@code{\prallmordent} +@lilypond[notime,relative=2] +f^\prallmordent e,_\prallmordent b'\prallmordent @end lilypond +@item +@code{\mordent} +@lilypond[notime,relative=2] +f^\mordent e,_\mordent b'\mordent +@end lilypond +@tab +@code{\upmordent} +@lilypond[notime,relative=2] +f^\upmordent e,_\upmordent b'\upmordent +@end lilypond +@tab +@code{\downmordent} +@lilypond[notime,relative=2] +f^\downmordent e,_\downmordent b'\downmordent +@end lilypond +@tab +@code{\trill} +@lilypond[notime,relative=2] +f^\trill e,_\trill b'\trill +@end lilypond + +@item +@code{\turn} +@lilypond[notime,relative=2] +f^\turn e,_\turn b'\reverseturn +@end lilypond +@tab +@code{\reverseturn} +@lilypond[notime,relative=2] +f^\reverseturn e,_\reverseturn b'\reverseturn +@end lilypond + +@end multitable + +@cindex fermata +@cindex shortfermata +@cindex longfermata +@cindex verylongfermata + @node Fermata scripts @unnumberedsubsec Fermata scripts -@lilypond[quote] -\include "script-chart.ly" -\new RhythmicStaff { \scriptStaff #fermatas } +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\shortfermata} +@lilypond[notime,relative=2] +f^\shortfermata e,_\shortfermata b'\shortfermata @end lilypond +@tab +@code{\fermata} +@lilypond[notime,relative=2] +f^\fermata e,_\fermata b'\fermata +@end lilypond +@tab +@code{\longfermata} +@lilypond[notime,relative=2] +f^\longfermata e,_\longfermata b'\longfermata +@end lilypond +@tab +@code{\verylongfermata} +@lilypond[notime,relative=2] +f^\verylongfermata e,_\verylongfermata b'\verylongfermata +@end lilypond + +@end multitable + +@cindex upbow +@cindex downbow +@cindex flageolet +@cindex open +@cindex halfopen +@cindex lheel +@cindex rheel +@cindex ltoe +@cindex rtoe +@cindex snappizzicato +@cindex stopped @node Instrument-specific scripts @unnumberedsubsec Instrument-specific scripts -@lilypond[quote] -\include "script-chart.ly" -\new RhythmicStaff { \scriptStaff #instrument-specific } +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\upbow} +@lilypond[notime,relative=2] +f^\upbow e,_\upbow b'\upbow +@end lilypond +@tab +@code{\downbow} +@lilypond[notime,relative=2] +f^\downbow e,_\downbow b'\downbow +@end lilypond +@tab +@code{\flageolet} +@lilypond[notime,relative=2] +f^\flageolet e,_\flageolet b'\flageolet +@end lilypond +@tab +@code{\open} +@lilypond[notime,relative=2] +f^\open e,_\open b'\open +@end lilypond + +@item +@code{\halfopen} +@lilypond[notime,relative=2] +f^\halfopen e,_\halfopen b'\halfopen +@end lilypond +@tab +@code{\lheel} +@lilypond[notime,relative=2] +f^\lheel e,_\lheel b'\lheel +@end lilypond +@tab +@code{\rheel} +@lilypond[notime,relative=2] +f^\rheel e,_\rheel b'\rheel +@end lilypond +@tab +@code{\ltoe} +@lilypond[notime,relative=2] +f^\ltoe e,_\ltoe b'\ltoe +@end lilypond + +@item +@code{\rtoe} +@lilypond[notime,relative=2] +f^\rtoe e,_\rtoe b'\rtoe +@end lilypond +@tab +@code{\snappizzicato} +@lilypond[notime,relative=2] +f^\snappizzicato e,_\snappizzicato b'\snappizzicato +@end lilypond +@tab +@code{\stopped} or @code{-+} +@lilypond[notime,relative=2] +f^\stopped e,_\stopped b'\stopped @end lilypond +@end multitable + +@cindex segno +@cindex coda +@cindex varcoda + @node Repeat sign scripts @unnumberedsubsec Repeat sign scripts -@lilypond[quote] -\include "script-chart.ly" -\new RhythmicStaff { \scriptStaff #repeats } +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\segno} +@lilypond[notime,relative=2] +f^\segno e,_\segno b'\segno +@end lilypond +@tab +@code{\coda} +@lilypond[notime,relative=2] +f^\coda e,_\coda b'\coda @end lilypond +@tab +@code{\varcoda} +@lilypond[notime,relative=2] +f^\varcoda e,_\varcoda b'\varcoda +@end lilypond + +@end multitable + +@cindex accentus +@cindex circulus +@cindex ictus +@cindex semicirculus +@cindex signumcongruentiae @node Ancient scripts @unnumberedsubsec Ancient scripts -@lilypond[quote] -\include "script-chart.ly" +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{\accentus} +@lilypond[notime] +\include "gregorian.ly" +\new VaticanaStaff { e'^\accentus s4 f_\accentus s4 b\accentus} +@end lilypond +@tab +@code{\circulus} +@lilypond[notime] \include "gregorian.ly" -\new VaticanaStaff { \scriptStaffAncient #ancient } +\new VaticanaStaff { e'^\circulus s4 f_\circulus s4 b\circulus } @end lilypond +@tab +@code{\ictus} +@lilypond[notime] +\include "gregorian.ly" +\new VaticanaStaff { e'^\ictus s4 f_\ictus s4 b\ictus} +@end lilypond + +@item +@code{\semicirculus} +@lilypond[notime] +\include "gregorian.ly" +\new VaticanaStaff { + e'^\semicirculus s4 f_\semicirculus s4 b\semicirculus +} +@end lilypond +@tab +@code{\signumcongruentiae} +@lilypond[notime] +\include "gregorian.ly" +\new VaticanaStaff { + e'^\signumcongruentiae s4 + f_\signumcongruentiae s4 + b\signumcongruentiae +} +@end lilypond + +@end multitable +@cindex drums, various +@cindex acoustic bass +@cindex bass +@cindex snare +@cindex electric snare +@cindex acoustic snare +@cindex tom tom +@cindex bongo +@cindex conga +@cindex timbale +@cindex sidestick +@cindex floor tom tom +@cindex low tom tom +@cindex high tom tom +@cindex mid tom tom +@cindex high hat +@cindex pedal high hat +@cindex open high hat +@cindex half-open high hat +@cindex cymbal, various +@cindex crash cymbal +@cindex ride cymbal +@cindex chinese cymbal +@cindex splash cymbal +@cindex ride bell +@cindex cowbell +@cindex agogo +@cindex high bongo +@cindex low bongo +@cindex mute bongo +@cindex open bongo +@cindex high conga +@cindex low conga +@cindex mute conga +@cindex open conga +@cindex high timbale +@cindex low timbale +@cindex mute timbale +@cindex open timbale +@cindex sidestick +@cindex guiro +@cindex cabasa +@cindex maracas +@cindex whistle +@cindex handclap +@cindex tambourine +@cindex vibraslap +@cindex tam tam +@cindex claves +@cindex woodblock +@cindex cuica +@cindex triangle @node Percussion notes @appendixsec Percussion notes -@lilypondfile[quote]{percussion-chart.ly} +@multitable @columnfractions .22 .25 .25 .25 + +@item +@code{bassdrum @* bd @*} +@lilypond[notime,ragged-right] +\drums { bd4 bd1 } +@end lilypond +@tab +@code{acousticbassdrum @* bda @*} +@lilypond[notime,ragged-right] +\drums { bda4 bda1 } +@end lilypond +@tab +@code{snare @* sn @*} +@lilypond[notime,ragged-right] +\drums { sn4 sn1 } +@end lilypond +@tab +@code{acousticsnare @* sna @*} +@lilypond[notime,ragged-right] +\drums { sna4 sna1 } +@end lilypond + +@item +@code{electricsnare @* sne @*} +@lilypond[notime,ragged-right] +\drums { sne4 sne1 } +@end lilypond +@tab +@code{lowfloortom @* tomfl @*} +@lilypond[notime,ragged-right] +\drums { tomfl4 tomfl1 } +@end lilypond +@tab +@code{highfloortom @* tomfh @*} +@lilypond[notime,ragged-right] +\drums { tomfh4 tomfh1 } +@end lilypond +@tab +@code{lowtom @* toml @*} +@lilypond[notime,ragged-right] +\drums { toml4 toml1 } +@end lilypond + +@item +@code{hightom @* tomh @*} +@lilypond[notime,ragged-right] +\drums { tomh4 tomh1 } +@end lilypond +@tab +@code{lowmidtom @* tomml @*} +@lilypond[notime,ragged-right] +\drums { tomml4 tomml1 } +@end lilypond +@tab +@code{highmidtom @* tommh @*} +@lilypond[notime,ragged-right] +\drums { tommh4 tommh1 } +@end lilypond +@tab +@code{highhat @* hh @*} +@lilypond[notime,ragged-right] +\drums { hh4 hh1 } +@end lilypond + +@item +@code{closedhihat @* hhc @*} +@lilypond[notime,ragged-right] +\drums { hhc4 hhc1 } +@end lilypond +@tab +@code{openhighhat @* hho @*} +@lilypond[notime,ragged-right] +\drums { hho4 hho1 } +@end lilypond +@tab +@code{halfopenhihat @* hhho @*} +@lilypond[notime,ragged-right] +\drums { hhho4 hhho1 } +@end lilypond +@tab +@code{pedalhihat @* hhp @*} +@lilypond[notime,ragged-right] +\drums { hhp4 hhp1 } +@end lilypond + + +@item +@code{crashcymbal @* cymc @*} +@lilypond[notime,ragged-right] +\drums { cymc4 cymc1 } +@end lilypond +@tab +@code{crashcymbala @* cymca @*} +@lilypond[notime,ragged-right] +\drums { cymca4 cymca1 } +@end lilypond +@tab +@code{crashcymbalb @* cymcb @*} +@lilypond[notime,ragged-right] +\drums { cymcb4 cymcb1 } +@end lilypond +@tab +@code{ridecymbal @* cymr @*} +@lilypond[notime,ragged-right] +\drums { cymr4 cymr1 } +@end lilypond + +@item +@code{ridecymbala @* cymra @*} +@lilypond[notime,ragged-right] +\drums { cymra4 cymra1 } +@end lilypond +@tab +@code{ridecymbalb @* cymrb @*} +@lilypond[notime,ragged-right] +\drums { cymrb4 cymrb1 } +@end lilypond +@tab +@code{chinesecymbal @* cymch @*} +@lilypond[notime,ragged-right] +\drums { cymch4 cymch1 } +@end lilypond +@tab +@code{splashcymbal @* cyms @*} +@lilypond[notime,ragged-right] +\drums { cyms4 cyms1 } +@end lilypond + +@item +@code{ridebell @* rb @*} +@lilypond[notime,ragged-right] +\drums { rb4 rb1 } +@end lilypond +@tab +@code{cowbell @* cb @*} +@lilypond[notime,ragged-right] +\drums { cb4 cb1 } +@end lilypond +@tab +@code{hibongo @* boh @*} +@lilypond[notime,ragged-right] +\drums { boh4 boh1 } +@end lilypond +@tab +@code{openhibongo @* boho @*} +@lilypond[notime,ragged-right] +\drums { boho4 boho1 } +@end lilypond + +@item +@code{mutehibongo @* bohm @*} +@lilypond[notime,ragged-right] +\drums { bohm4 bohm1 } +@end lilypond +@tab +@code{lobongo @* bol @*} +@lilypond[notime,ragged-right] +\drums { bol4 bol1 } +@end lilypond +@tab +@code{openlobongo @* bolo @*} +@lilypond[notime,ragged-right] +\drums { bolo4 bolo1 } +@end lilypond +@tab +@code{mutelobongo @* bolm @*} +@lilypond[notime,ragged-right] +\drums { bolm4 bolm1 } +@end lilypond + + +@item +@code{hiconga @* cgh @*} +@lilypond[notime,ragged-right] +\drums { cgh4 cgh1 } +@end lilypond +@tab +@code{openhiconga @* cgho @*} +@lilypond[notime,ragged-right] +\drums { cgho4 cgho1 } +@end lilypond +@tab +@code{mutehiconga @* cghm @*} +@lilypond[notime,ragged-right] +\drums { cghm4 cghm1 } +@end lilypond +@tab +@code{loconga @* cgl @*} +@lilypond[notime,ragged-right] +\drums { cgl4 cgl1 } +@end lilypond + +@item +@code{openloconga @* cglo @*} +@lilypond[notime,ragged-right] +\drums { cglo4 cglo1 } +@end lilypond +@tab +@code{muteloconga @* cglm @*} +@lilypond[notime,ragged-right] +\drums { cglm4 cglm1 } +@end lilypond +@tab +@code{hitimbale @* timh @*} +@lilypond[notime,ragged-right] +\drums { timh4 timh1 } +@end lilypond +@tab +@code{lotimbale @* timl @*} +@lilypond[notime,ragged-right] +\drums { timl4 timl1 } +@end lilypond + +@item +@code{hiagogo @* agh @*} +@lilypond[notime,ragged-right] +\drums { agh4 agh1 } +@end lilypond +@tab +@code{loagogo @* agl @*} +@lilypond[notime,ragged-right] +\drums { agl4 agl1 } +@end lilypond +@tab +@code{sidestick @* ss @*} +@lilypond[notime,ragged-right] +\drums { ss4 ss1 } +@end lilypond +@tab +@code{hisidestick @* ssh @*} +@lilypond[notime,ragged-right] +\drums { ssh4 ssh1 } +@end lilypond + +@item +@code{losidestick @* ssl @*} +@lilypond[notime,ragged-right] +\drums { ssl4 ssl1 } +@end lilypond +@tab +@code{guiro @* gui @*} +@lilypond[notime,ragged-right] +\drums { gui4 gui1 } +@end lilypond +@tab +@code{shortguiro @* guis @*} +@lilypond[notime,ragged-right] +\drums { guis4 guis1 } +@end lilypond +@tab +@code{longguiro @* guil @*} +@lilypond[notime,ragged-right] +\drums { guil4 guil1 } +@end lilypond + +@item +@code{cabasa @* cab @*} +@lilypond[notime,ragged-right] +\drums { cab4 cab1 } +@end lilypond +@tab +@code{maracas @* mar @*} +@lilypond[notime,ragged-right] +\drums { mar4 mar1 } +@end lilypond +@tab +@code{shortwhistle @* whs @*} +@lilypond[notime,ragged-right] +\drums { whs4 whs1 } +@end lilypond +@tab +@code{longwhistle @* whl @*} +@lilypond[notime,ragged-right] +\drums { whl4 whl1 } +@end lilypond + +@item +@code{handclap @* hc @*} +@lilypond[notime,ragged-right] +\drums { hc4 hc1 } +@end lilypond +@tab +@code{tambourine @* tamb @*} +@lilypond[notime,ragged-right] +\drums { tamb4 tamb1 } +@end lilypond +@tab +@code{vibraslap @* vibs @*} +@lilypond[notime,ragged-right] +\drums { vibs4 vibs1 } +@end lilypond +@tab +@code{tamtam @* tt @*} +@lilypond[notime,ragged-right] +\drums { tt4 tt1 } +@end lilypond + +@item +@code{claves @* cl @*} +@lilypond[notime,ragged-right] +\drums { cl4 cl1 } +@end lilypond +@tab +@code{hiwoodblock @* wbh @*} +@lilypond[notime,ragged-right] +\drums { wbh4 wbh1 } +@end lilypond +@tab +@code{lowoodblock @* wbl @*} +@lilypond[notime,ragged-right] +\drums { wbl4 wbl1 } +@end lilypond +@tab +@code{opencuica @* cuio @*} +@lilypond[notime,ragged-right] +\drums { cuio4 cuio1 } +@end lilypond + +@item +@code{mutecuica @* cuim @*} +@lilypond[notime,ragged-right] +\drums { cuim4 cuim1 } +@end lilypond +@tab +@code{triangle @* tri @*} +@lilypond[notime,ragged-right] +\drums { tri4 tri1 } +@end lilypond +@tab +@code{opentriangle @* trio @*} +@lilypond[notime,ragged-right] +\drums { trio4 trio1 } +@end lilypond +@tab +@code{mutetriangle @* trim} +@lilypond[notime,ragged-right] +\drums { trim4 trim1 } +@end lilypond + +@item +@code{oneup @* ua @*} +@lilypond[notime,ragged-right] +\drums { ua4 ua1 } +@end lilypond +@tab +@code{twoup @* ub @*} +@lilypond[notime,ragged-right] +\drums { ub4 ub1 } +@end lilypond +@tab +@code{threeup @* uc @*} +@lilypond[notime,ragged-right] +\drums { uc4 uc1 } +@end lilypond +@tab +@code{fourup @* ud @*} +@lilypond[notime,ragged-right] +\drums { ud4 ud1 } +@end lilypond + +@item +@code{fiveup @* ue @*} +@lilypond[notime,ragged-right] +\drums { ue4 ue1 } +@end lilypond +@tab +@code{onedown @* da @*} +@lilypond[notime,ragged-right] +\drums { da4 da1 } +@end lilypond +@tab +@code{twodown @* db @*} +@lilypond[notime,ragged-right] +\drums { db4 db1 } +@end lilypond +@tab +@code{threedown @* dc @*} +@lilypond[notime,ragged-right] +\drums { dc4 dc1 } +@end lilypond + +@item +@code{fourdown @* dd @*} +@lilypond[notime,ragged-right] +\drums { dd4 dd1 } +@end lilypond +@tab +@code{fivedown @* de @*} +@lilypond[notime,ragged-right] +\drums { de4 de1 } +@end lilypond + + +@end multitable @node Technical glossary @@ -1418,7 +2352,6 @@ or in the source code. * parser:: * parser variable:: * prob:: -* simple closure:: * smob:: * stencil:: @end menu @@ -1455,7 +2388,6 @@ performed. @unnumberedsubsec closure @cindex closure -@cindex simple closure In Scheme, a @strong{closure} is created when a function, usually a lambda expression, is passed as a variable. The closure contains @@ -1468,13 +2400,6 @@ variables to be used in the calculation. One useful property of closures is the retention of internal variable values between invocations, so permitting state to be maintained. -A @strong{simple closure} is a closure whose expression has no free -variables and hence no free variable bindings. - -A simple closure is represented in LilyPond by a smob containing -the expression and a method to apply the expression to a passed -list of arguments. - @node glyph @unnumberedsubsec glyph @@ -1695,12 +2620,6 @@ to hold the formatted content of system grobs and titling blocks during page layout. -@node simple closure -@unnumberedsubsec simple closure - -See @ref{closure}. - - @node smob @unnumberedsubsec smob diff --git a/Documentation/notation/percussion.itely b/Documentation/notation/percussion.itely index f97af1ccef..be6bc04c35 100644 --- a/Documentation/notation/percussion.itely +++ b/Documentation/notation/percussion.itely @@ -44,7 +44,7 @@ discussed in @ref{Showing melody rhythms}, and @ref{Instantiating new staves}. @item MIDI output is discussed in a separate section; please see -@ref{Percussion in MIDI}. +@ref{MIDI instruments}. @end itemize @@ -52,7 +52,7 @@ discussed in @ref{Showing melody rhythms}, and Notation Reference: @ref{Showing melody rhythms}, @ref{Instantiating new staves}. -@ref{Percussion in MIDI}. +@ref{MIDI instruments}. Snippets: @rlsr{Percussion}. @@ -100,19 +100,19 @@ be set explicitly. Other clefs may be used as well. @lilypond[quote,ragged-right,verbatim] \drums { \clef percussion - bd4 bd bd bd + bd4 4 4 4 \clef treble - hh4 hh hh hh + hh4 4 4 4 } @end lilypond There are a few issues concerning MIDI support for percussion -instruments; for details please see @ref{Percussion in MIDI}. +instruments; for details please see @ref{MIDI instruments}. @seealso Notation Reference: -@ref{Percussion in MIDI}, +@ref{MIDI instruments}, @ref{Percussion notes}. Installed Files: @@ -135,10 +135,10 @@ as described in @ref{Tremolo repeats}. @lilypond[quote,verbatim] \drums { \time 2/4 - sn16 sn8 sn16 sn8 sn8:32 ~ - sn8 sn8 sn4:32 ~ - sn4 sn8 sn16 sn16 - sn4 r4 + sn16 8 16 8 8:32 ~ + 8 8 4:32 ~ + 4 8 16 16 + 4 r4 } @end lilypond @@ -150,9 +150,9 @@ may be overridden to achieve a pleasing baseline. @lilypond[quote,verbatim] \drums { \repeat unfold 2 { - sn16^"L" sn^"R" sn^"L" sn^"L" sn^"R" sn^"L" sn^"R" sn^"R" + sn16^"L" 16^"R" 16^"L" 16^"L" 16^"R" 16^"L" 16^"R" 16^"R" \stemUp - sn16_"L" sn_"R" sn_"L" sn_"L" sn_"R" sn_"L" sn_"R" sn_"R" + sn16_"L" 16_"R" 16_"L" 16_"L" 16_"R" 16_"L" 16_"R" 16_"R" } } @end lilypond @@ -173,11 +173,8 @@ vibraphone, and timpani) are written using normal staves. This is covered in other sections of the manual. @seealso -@c TODO: possibly link to an alternate section of NR 3.5, if -@c "percussion in MIDI" gets a separate subsubsection for -@c pitched percussion sounds. -gp Notation Reference: -@ref{Percussion in MIDI}. +@ref{MIDI instruments}. Snippets: @rlsr{Percussion}. @@ -267,6 +264,37 @@ toms, simply select the toms that produce the desired result. For example, to get toms on the three middle lines you use @code{tommh}, @code{tomml}, and @code{tomfh}. +@item agostini-drums-style +Invented by the French percussionist Dante Agostini in 1965, this notation is +commonly employed in France but also elsewhere. + +@lilypond[quote,line-width=10.0\cm] +nam = \lyricmode { + cymc cyms cymr hh hhc hho hhho hhp + cb hc bd sn ss tomh tommh tomml toml tomfh tomfl } +mus = \drummode { + cymc cyms cymr hh hhc hho hhho hhp \break + cb hc bd sn ss tomh tommh tomml toml tomfh tomfl s16 } +\score { + << \new DrumStaff \with { + \remove "Bar_engraver" + \remove "Time_signature_engraver" + \hide Stem + \override Stem.Y-extent = ##f + drumStyleTable = #agostini-drums-style + } \mus + \new Lyrics \nam + >> + \layout { + \context { + \Score + \override LyricText.font-family = #'typewriter + \override BarNumber.transparent =##T + } + } +} +@end lilypond + @item timbales-style This typesets timbales on a two line staff: @@ -426,8 +454,8 @@ woodstaff = { \drummode { \time 2/4 - wbl8 wbl16 wbl wbh8-> wbl | - wbl8 wbl16 wbh-> ~ wbh wbl16 r8 | + wbl8 16 16 8-> 8 | + wbl8 16 16-> ~ 16 16 r8 | } } @end lilypond @@ -455,8 +483,8 @@ tambustaff = { \drummode { \time 6/8 - tamb8. tamb16 tamb8 tamb tamb tamb | - tamb4. tamb8 tamb tamb | + tamb8. 16 8 8 8 8 | + tamb4. 8 8 8 | % the trick with the scaled duration and the shorter rest % is neccessary for the correct ending of the trill-span! tamb2.*5/6 \startTrillSpan s8 \stopTrillSpan | @@ -502,8 +530,8 @@ bellstaff = { \bellstaff \drummode { \time 2/4 - rb8 rb cb cb16 rb-> ~ | - rb16 rb8 rb16 cb8 cb | + rb8 8 cb8 16 rb16-> ~ | + 16 8 16 cb8 8 | } } @end lilypond @@ -593,12 +621,12 @@ Ghost notes for drums and percussion may be created using the \drummode { << { - hh8[ hh] hh16 + hh8[ 8] hh16 \parenthesize sn hh \parenthesize sn hh8 hh } \\ { - bd4 r4 bd8 bd r8 bd + bd4 r4 bd8 8 r8 bd } >> } diff --git a/Documentation/notation/pitches.itely b/Documentation/notation/pitches.itely index 4c41302c4f..3aa7738e2b 100644 --- a/Documentation/notation/pitches.itely +++ b/Documentation/notation/pitches.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.18" +@c \version "2.19.22" @node Pitches @@ -79,25 +79,37 @@ octave. @lilypond[verbatim,quote] { \clef treble - c'4 c'' e' g - d''4 d' d c + c'4 e' g' c'' + c'4 g b c' \clef bass - c,4 c,, e, g - d,,4 d, d c + c,4 e, g, c + c,4 g,, b,, c, } @end lilypond -@funindex absolute -@funindex \absolute -Music can be marked explicitly as being in absolute octave -notation by preceding it with @code{\absolute}: +@funindex \fixed +Common octave marks can be entered just once on a reference pitch +after @code{\fixed} placed before the music. Pitches inside +@code{\fixed} only need @code{'} or@tie{}@code{,} marks +when they are above or below the octave of the reference pitch. -@example -\absolute @var{musicexpr} -@end example +@lilypond[verbatim,quote] +{ + \fixed c' { + \clef treble + c4 e g c' + c4 g, b, c + } + \clef bass + \fixed c, { + c4 e g c' + c4 g, b, c + } +} +@end lilypond -will be interpreted in absolute octave entry mode regardless of -the context it appears in. +Pitches in the music expression following @code{\fixed} are +unaffected by any enclosing @code{\relative}, discussed next. @seealso Music Glossary: @@ -116,7 +128,6 @@ Snippets: @cindex relative octave specification @cindex octave specification, relative -@funindex relative @funindex \relative Absolute octave entry requires specifying the octave for every @@ -169,19 +180,19 @@ Writing @code{\relative gis''' @{ gis @dots{} @}} makes it easy to determine the absolute pitch of the first note inside. @item no explicit starting pitch -This (namely writing @code{\relative @{ gis''' @dots{} @}}) can be -viewed as a compact version of the previous option: the first note -inside is written in absolute pitch itself. This happens to be -equivalent to choosing @code{f} as the reference pitch. +The form @code{\relative @{ gis''' @dots{} @}} serves +as a compact version of the previous option: the first note +inside is written in absolute pitch itself. (This happens to be +equivalent to choosing @code{f} as the reference pitch.) @end table -The documentation will usually employ the first option. +The documentation will usually employ the last option. @end itemize Here is the relative mode shown in action: @lilypond[verbatim,quote] -\relative c { +\relative { \clef bass c d e f g a b c @@ -193,8 +204,8 @@ Octave changing marks are used for intervals greater than a fourth: @lilypond[verbatim,quote] -\relative c'' { - c g c f, +\relative { + c'' g c f, c' a, e'' c } @end lilypond @@ -203,20 +214,21 @@ A note sequence without a single octave mark can nevertheless span large intervals: @lilypond[verbatim,quote] -\relative c { +\relative { c f b e a d g c } @end lilypond When @code{\relative} blocks are nested, the innermost -@code{\relative} block applies. +@code{\relative} block starts with its own reference pitch +independently of the outer @code{\relative}. @lilypond[verbatim,quote] -\relative c' { - c d e f - \relative c'' { - c d e f +\relative { + c' d e f + \relative { + c'' d e f } } @end lilypond @@ -238,12 +250,12 @@ Music inside a @code{\transpose} block is absolute unless a @code{\relative} is included. @lilypond[verbatim,quote] -\relative c' { - d e +\relative { + d' e \transpose f g { d e - \relative c' { - d e + \relative { + d' e } } } @@ -260,8 +272,8 @@ relative to the preceding one. Examine the next example carefully, paying attention to the @code{c} notes. @lilypond[verbatim,quote] -\relative c' { - c +\relative { + c' @@ -277,17 +289,14 @@ double-diminished fifth, regardless of the number of semitones that each interval contains. @lilypond[verbatim,quote] -\relative c'' { - c2 fis +\relative { + c''2 fis c2 ges b2 eisis b2 feses } @end lilypond -One consequence of these rules is that the first note inside -@code{@w{\relative f}} music is interpreted just the same as -if it was written in absolute pitch mode. @seealso Music Glossary: @@ -308,11 +317,8 @@ Internals Reference: @cindex transposition and relative octave entry @funindex \transpose -@funindex transpose @funindex \chordmode -@funindex chordmode @funindex \relative -@funindex relative @node Accidentals @@ -324,11 +330,11 @@ Internals Reference: @c duplicated in Key signature and Accidentals @warning{New users are sometimes confused about accidentals and -key signatures. In LilyPond, note names are the raw input; key -signatures and clefs determine how this raw input is displayed. +key signatures. In LilyPond, note names specify pitches; key +signatures and clefs determine how these pitches are displayed. An unaltered note like@tie{}@code{c} means @q{C natural}, regardless of the key signature or clef. For more information, -see @rlearning{Accidentals and key signatures}.} +see @rlearning{Pitches and key signatures}.} @cindex note names, Dutch @cindex note names, default @@ -349,17 +355,16 @@ is made by adding @code{isis} or @code{eses}. This syntax is derived from Dutch note naming conventions. To use other names for accidentals, see @ref{Note names in other languages}. -@lilypond[verbatim,quote,relative=2] -ais1 aes aisis aeses +@lilypond[verbatim,quote,fragment] +\relative c'' { ais1 aes aisis aeses } @end lilypond -A natural will cancel the effect of an accidental or key -signature. However, naturals are not encoded into the note name -syntax with a suffix; a natural pitch is shown as a simple note -name: +A natural pitch is entered as a simple note name; no suffix is +required. A natural sign will be printed when needed to cancel +the effect of an earlier accidental or key signature. -@lilypond[verbatim,quote,relative=2] -a4 aes a2 +@lilypond[verbatim,quote,fragment] +\relative c'' { a4 aes a2 } @end lilypond @cindex quarter tones @@ -369,8 +374,8 @@ a4 aes a2 Quarter tones may be added; the following is a series of Cs with increasing pitches: -@lilypond[verbatim,quote,relative=2] -ceseh1 ces ceh c cih cis cisih +@lilypond[verbatim,quote,fragment] +\relative c'' { ceseh1 ces ceh c cih cis cisih } @end lilypond @@ -391,11 +396,10 @@ print them manually. A reminder accidental can be forced by adding an exclamation mark@tie{}@code{!} after the pitch. A cautionary accidental (i.e., an accidental within parentheses) can be obtained by adding the question mark@tie{}@code{?} after the -pitch. These extra accidentals can also be used to produce -natural signs. +pitch. -@lilypond[verbatim,quote,relative=2] -cis cis cis! cis? c c c! c? +@lilypond[verbatim,quote,fragment] +\relative c'' { cis cis cis! cis? c c c! c? } @end lilypond @cindex accidental on tied note @@ -404,10 +408,12 @@ cis cis cis! cis? c c c! c? Accidentals on tied notes are only printed at the beginning of a new system: -@lilypond[verbatim,quote,relative=2,ragged-right] -cis1~ cis~ -\break -cis +@lilypond[verbatim,quote,fragment,ragged-right] +\relative c'' { + cis1~ 1~ + \break + cis +} @end lilypond @@ -429,7 +435,7 @@ Music Glossary: @rglos{quarter tone}. Learning Manual: -@rlearning{Accidentals and key signatures}. +@rlearning{Pitches and key signatures}. Notation Reference: @ref{Automatic accidentals}, @@ -470,15 +476,15 @@ using Italian note names: @lilypond[quote,verbatim] \language "italiano" -\relative do' { - do re mi sib +\relative { + do' re mi sib } @end lilypond The available languages and the note names they define are: @quotation -@multitable {@code{nederlands}} {do re mi fa sol la sib si} +@multitable {@code{nederlands}} {do re/re mi fa sol la sib si} @headitem Language @tab Note Names @item @code{nederlands} @@ -491,7 +497,9 @@ The available languages and the note names they define are: @tab c d e f g a bf b @item @code{espanol} or @code{español} @tab do re mi fa sol la sib si -@item @code{italiano} or @code{français} +@item @code{français} + @tab do ré/re mi fa sol la sib si +@item @code{italiano} @tab do re mi fa sol la sib si @item @code{norsk} @tab c d e f g a b h @@ -510,33 +518,35 @@ In addition to note names, accidental suffixes may also vary depending on the language: @quotation -@multitable {@code{nederlands}} {-s/-sharp} {-ess/-es} {-ss/-x/-sharpsharp} {-essess/-eses} +@multitable {@code{nederlands}} {-@code{s}/-@code{-sharp}} {-@code{ess}/-@code{es}} {-@code{ss}/-@code{x}/-@code{-sharpsharp}} {-@code{essess}/-@code{eses}} @headitem Language @tab sharp @tab flat @tab double sharp @tab double flat @item @code{nederlands} - @tab -is @tab -es @tab -isis @tab -eses + @tab -@code{is} @tab -@code{es} @tab -@code{isis} @tab -@code{eses} @item @code{catalan} - @tab -d/-s @tab -b @tab -dd/-ss @tab -bb + @tab -@code{d}/-@code{s} @tab -@code{b} @tab -@code{dd}/-@code{ss} @tab -@code{bb} @item @code{deutsch} - @tab -is @tab -es @tab -isis @tab -eses + @tab -@code{is} @tab -@code{es} @tab -@code{isis} @tab -@code{eses} @item @code{english} - @tab -s/-sharp @tab -f/-flat @tab -ss/-x/-sharpsharp - @tab -ff/-flatflat + @tab -@code{s}/-@code{-sharp} @tab -@code{f}/-@code{-flat} @tab -@code{ss}/-@code{x}/-@code{-sharpsharp} + @tab -@code{ff}/-@code{-flatflat} @item @code{espanol} or @code{español} - @tab -s @tab -b @tab -ss/-x @tab -bb -@item @code{italiano} or @code{français} - @tab -d @tab -b @tab -dd @tab -bb + @tab -@code{s} @tab -@code{b} @tab -@code{ss}/-@code{x} @tab -@code{bb} +@item @code{français} + @tab -@code{d} @tab -@code{b} @tab -@code{dd}/-@code{x} @tab -@code{bb} +@item @code{italiano} + @tab -@code{d} @tab -@code{b} @tab -@code{dd} @tab -@code{bb} @item @code{norsk} - @tab -iss/-is @tab -ess/-es @tab -ississ/-isis - @tab -essess/-eses + @tab -@code{iss}/-@code{is} @tab -@code{ess}/-@code{es} @tab -@code{ississ}/-@code{isis} + @tab -@code{essess}/-@code{eses} @item @code{portugues} - @tab -s @tab -b @tab -ss @tab -bb + @tab -@code{s} @tab -@code{b} @tab -@code{ss} @tab -@code{bb} @item @code{suomi} - @tab -is @tab -es @tab -isis @tab -eses + @tab -@code{is} @tab -@code{es} @tab -@code{isis} @tab -@code{eses} @item @code{svenska} - @tab -iss @tab -ess @tab -ississ @tab -essess + @tab -@code{iss} @tab -@code{ess} @tab -@code{ississ} @tab -@code{essess} @item @code{vlaams} - @tab -k @tab -b @tab -kk @tab -bb + @tab -@code{k} @tab -@code{b} @tab -@code{kk} @tab -@code{bb} @end multitable @end quotation @@ -547,8 +557,8 @@ are accepted in LilyPond. Similarly, both @code{es} and @code{eeses}@tie{}/@tie{}@code{eses}. Sometimes only these contracted names are defined in the corresponding language files. -@lilypond[verbatim,quote,relative=2] -a2 as e es a ases e eses +@lilypond[verbatim,quote,fragment] +\relative c'' { a2 as e es a ases e eses } @end lilypond @@ -578,7 +588,9 @@ appear in this table do not provide special note names yet. @tab -qs @tab -qf @tab -tqs @tab -tqf @item @code{espanol} or @code{español} @tab -cs @tab -cb @tab -tcs @tab -tcb -@item @code{italiano} or @code{français} +@item @code{français} + @tab -sd @tab -sb @tab -dsd @tab -bsb +@item @code{italiano} @tab -sd @tab -sb @tab -dsd @tab -bsb @item @code{portugues} @tab -sqt @tab -bqt @tab -stqt @tab -btqt @@ -628,7 +640,6 @@ This section discusses how to modify pitches. @funindex = @funindex \octaveCheck -@funindex octaveCheck @funindex controlpitch In relative mode, it is easy to forget an octave changing mark. @@ -643,8 +654,8 @@ octave @code{d''} instead of @code{d'} as indicated by the octave correction. @lilypond[verbatim,quote] -\relative c'' { - c2 d='4 d +\relative { + c''2 d='4 d e2 f } @end lilypond @@ -655,12 +666,12 @@ The octave of notes may also be checked with the checks that the interval between the previous note and the @code{@var{controlpitch}} is within a fourth (i.e., the normal calculation of relative mode). If this check fails, a warning is -printed, but the previous note is not changed. Future notes are -relative to the @code{@var{controlpitch}}. +printed. While the previous note itself is not changed, future +notes are relative to the corrected value. @lilypond[verbatim,quote] -\relative c'' { - c2 d +\relative { + c''2 d \octaveCheck c' e2 f } @@ -670,8 +681,8 @@ Compare the two bars below. The first and third @code{\octaveCheck} checks fail, but the second one does not fail. @lilypond[verbatim,quote] -\relative c'' { - c4 f g f +\relative { + c''4 f g f c4 \octaveCheck c' @@ -703,7 +714,6 @@ Internals Reference: @cindex notes, transposition of @funindex \transpose -@funindex transpose A music expression can be transposed with @code{\transpose}. The syntax is @@ -729,9 +739,9 @@ automatically transposed as well. @lilypond[verbatim,quote] \transpose d e { - \relative c' { + \relative { \key d \major - d4 fis a d + d'4 fis a d } } @end lilypond @@ -746,9 +756,9 @@ part will be produced with: @lilypond[verbatim,quote] \transpose a c' { - \relative c' { + \relative { \key c \major - c4 d e g + c'4 d e g } } @end lilypond @@ -765,7 +775,7 @@ the notes will remain on the same scale step, the second version will print flats on the scale step above. @lilypond[verbatim,quote] -music = \relative c' { c d e f } +music = \relative { c' d e f } \new Staff { \transpose c cis { \music } \transpose c des { \music } @@ -821,11 +831,8 @@ Internals Reference: @rinternals{TransposedMusic}. @funindex \transpose -@funindex transpose @funindex \chordmode -@funindex chordmode @funindex \relative -@funindex relative @knownissues The relative conversion will not affect @code{\transpose}, @@ -857,7 +864,7 @@ The @code{@var{musicexpr}} is inverted interval-by-interval around @code{@var{around-pitch}} is mapped to @code{@var{to-pitch}}. @lilypond[verbatim,quote] -music = \relative c' { c d e f } +music = \relative { c' d e f } \new Staff { \music \inversion d' d' \music @@ -883,12 +890,11 @@ Notation Reference: @cindex transformation, retrograde @cindex operation, retrograde @funindex \retrograde -@funindex retrograde A music expression can be reversed to produce its retrograde: @lilypond[verbatim,quote] -music = \relative c' { c8. ees16( fis8. a16 b8.) gis16 f8. d16 } +music = \relative { c'8. ees16( fis8. a16 b8.) gis16 f8. d16 } \new Staff { \music @@ -931,7 +937,6 @@ left untransformed.} @cindex transposition, modal @cindex operation, transposition @funindex \modalTranspose -@funindex modalTranspose A motif can be transposed within a given scale with: @@ -944,8 +949,8 @@ number of scale degrees given by the interval between @var{to-pitch} and @var{from-pitch}: @lilypond[verbatim,quote] -diatonicScale = \relative c' { c d e f g a b } -motif = \relative c' { c8 d e f g a b c } +diatonicScale = \relative { c' d e f g a b } +motif = \relative { c'8 d e f g a b c } \new Staff { \motif @@ -958,8 +963,8 @@ An ascending scale of any length and with any intervals may be specified: @lilypond[verbatim,quote] -pentatonicScale = \relative c' { ges aes bes des ees } -motif = \relative c' { ees8 des ges,4 } +pentatonicScale = \relative { ges aes bes des ees } +motif = \relative { ees'8 des ges,4 } \new Staff { \motif @@ -972,8 +977,8 @@ similar effect to @code{\transpose}, but with the ability to specify the names of the notes to be used: @lilypond[verbatim,quote] -chromaticScale = \relative c' { c cis d dis e f fis g gis a ais b } -motif = \relative c' { c8 d e f g a b c } +chromaticScale = \relative { c' cis d dis e f fis g gis a ais b } +motif = \relative { c'8 d e f g a b c } \new Staff { \motif @@ -988,7 +993,6 @@ motif = \relative c' { c8 d e f g a b c } @cindex inversion, modal @cindex operation, modal inversion @funindex \modalInversion -@funindex modalInversion A motif can be inverted within a given scale around a given pivot note and transposed in a single operation with: @@ -1007,8 +1011,8 @@ So to simply invert around a note in the scale use the same value for @var{around-pitch} and @var{to-pitch}: @lilypond[verbatim,quote] -octatonicScale = \relative c' { ees f fis gis a b c d } -motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } +octatonicScale = \relative { ees' f fis gis a b c d } +motif = \relative { c'8. ees16 fis8. a16 b8. gis16 f8. d16 } \new Staff { \motif @@ -1021,8 +1025,8 @@ one of the notes and then transpose by one scale degree. The two notes specified can be interpreted as bracketing the pivot point: @lilypond[verbatim,quote] -scale = \relative c' { c g' } -motive = \relative c' { c c g' c, } +scale = \relative { c' g' } +motive = \relative { c' c g' c, } \new Staff { \motive @@ -1034,8 +1038,8 @@ The combined operation of inversion and retrograde produce the retrograde-inversion: @lilypond[verbatim,quote] -octatonicScale = \relative c' { ees f fis gis a b c d } -motif = \relative c' { c8. ees16 fis8. a16 b8. gis16 f8. d16 } +octatonicScale = \relative { ees' f fis gis a b c d } +motif = \relative { c'8. ees16 fis8. a16 b8. gis16 f8. d16 } \new Staff { \motif @@ -1102,52 +1106,40 @@ This section discusses how to alter the output of pitches. @funindex \clef -@funindex clef -The clef may be altered. Middle C is shown in every example. The -following clef names can (but do not need to) be enclosed in quotes. +Without any explicit command, the default clef for LilyPond is the +treble (or @emph{G}) clef. + +@lilypond[verbatim,quote,fragment,ragged-right] +c'2 c' +@end lilypond + +However, the clef can be changed by using the @code{\clef} command and +an appropriate clef name. @emph{Middle C} is shown in each of the +following examples. -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef treble -c2 c +c'2 c' \clef alto -c2 c +c'2 c' \clef tenor -c2 c +c'2 c' \clef bass -c2 c +c'2 c' @end lilypond -Other clefs include: - -@lilypond[verbatim,quote,relative=1] -\clef french -c2 c -\clef soprano -c2 c -\clef mezzosoprano -c2 c -\clef baritone -c2 c +For the full range of possible clef names see @ref{Clef styles}. -\break +Specialized clefs, such as those used in @emph{Ancient} music, are +described in @ref{Mensural clefs} and @ref{Gregorian clefs}. Music that +requires tablature clefs is discussed in @ref{Default tablatures} and +@ref{Custom tablatures}. -\clef varbaritone -c2 c -\clef subbass -c2 c -\clef percussion -c2 c - -\break - -\clef G % synonym for treble -c2 c -\clef F % synonym for bass -c2 c -\clef C % synonym for alto -c2 c -@end lilypond +@cindex Cue clefs +@cindex Clefs with cue notes +For mixing clefs when using cue notes, see the @code{\cueClef} and +@code{\cueDuringWithClef} commands in @ref{Formatting cue notes}. @cindex transposing clef @cindex clef, transposing @@ -1163,42 +1155,88 @@ and@tie{}@code{_15} and@tie{}@code{^15} transpose by two octaves. Other integers can be used if required. Clef names containing non-alphabetic characters must be enclosed in quotes -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef treble -c2 c +c'2 c' \clef "treble_8" -c2 c +c'2 c' \clef "bass^15" -c2 c +c'2 c' \clef "alto_2" -c2 c +c'2 c' \clef "G_8" -c2 c +c'2 c' \clef "F^5" -c2 c +c'2 c' @end lilypond Optional octavation can be obtained by enclosing the numeric argument in parentheses or brackets: -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote,fragment] \clef "treble_(8)" -c2 c +c'2 c' \clef "bass^[15]" -c2 c +c'2 c' @end lilypond The pitches are displayed as if the numeric argument were given without parentheses/brackets. -Some special purpose clefs are described in @ref{Mensural clefs}, -@ref{Gregorian clefs}, @ref{Default tablatures}, and @ref{Custom -tablatures}. For mixing different clefs when using cue notes within a -score, see the @code{\cueClef} and @code{\cueDuringWithClef} functions -in @ref{Formatting cue notes}. +By default, a clef change taking place at a line break will cause +the new clef symbol to be printed at the end of the previous line, +as a @emph{warning} clef, as well as the beginning of the next. +This @emph{warning} clef can be suppressed. -@snippets +@lilypond[verbatim,quote,fragment] +\clef treble { c'2 c' } \break +\clef bass { c'2 c' } \break +\clef alto + \set Staff.explicitClefVisibility = #end-of-line-invisible + { c'2 c' } \break + \unset Staff.explicitClefVisibility +\clef bass { c'2 c' } \break +@end lilypond + +By default, a clef that has previously been printed will not be +re-printed if the same @code{\clef} command is issued again and +will be ignored. The command +@code{\set Staff.forceClef = ##t} changes this behaviour. + +@lilypond[verbatim,quote,fragment] + \clef treble + c'1 + \clef treble + c'1 + \set Staff.forceClef = ##t + c'1 + \clef treble + c'1 +@end lilypond + +When there is a manual clef change, the glyph of the changed clef +will be smaller than normal. This behaviour can be overridden. + +@lilypond[verbatim,quote,fragment] + \clef "treble" + c'1 + \clef "bass" + c'1 + \clef "treble" + c'1 + \override Staff.Clef.full-size-change = ##t + \clef "bass" + c'1 + \clef "treble" + c'1 + \revert Staff.Clef.full-size-change + \clef "bass" + c'1 + \clef "treble" + c'1 +@end lilypond +@snippets @lilypondfile[verbatim,quote,texidoc,doctitle] {tweaking-clef-properties.ly} @@ -1210,6 +1248,9 @@ Notation Reference: @ref{Custom tablatures}, @ref{Formatting cue notes}. +Installed Files: +@file{scm/parser-clef.scm}. + Snippets: @rlsr{Pitches}. @@ -1220,18 +1261,18 @@ Internals Reference: @rinternals{clef-interface}. @knownissues -Ottavation numbers attached to clefs are treated as separate grobs. So -any @code{\override} done to the @var{Clef} will also need to be -applied, as a separate @code{\override}, to the @var{ClefModifier} -grob. +Ottavation numbers attached to clefs are treated as separate +grobs. So any @code{\override} done to the @var{Clef} will also +need to be applied, as a separate @code{\override}, to the +@var{ClefModifier} grob. -@lilypond[fragment,quote,relative=1] +@lilypond[fragment,quote,verbatim] \new Staff \with { - \override ClefModifier.color = #red \override Clef.color = #blue + \override ClefModifier.color = #red } -\clef "treble_8" c4 +\clef "treble_8" c'4 @end lilypond @@ -1241,7 +1282,6 @@ grob. @cindex key signature @funindex \key -@funindex key @c duplicated in Key signature and Accidentals @warning{New users are sometimes confused about accidentals and @@ -1249,7 +1289,7 @@ key signatures. In LilyPond, note names are the raw input; key signatures and clefs determine how this raw input is displayed. An unaltered note like@tie{}@code{c} means @q{C natural}, regardless of the key signature or clef. For more information, -see @rlearning{Accidentals and key signatures}.} +see @rlearning{Pitches and key signatures}.} The key signature indicates the tonality in which a piece is played. It is denoted by a set of alterations (flats or sharps) @@ -1260,23 +1300,14 @@ at the start of the staff. The key signature may be altered: @end example @funindex \major -@funindex major @funindex \minor -@funindex minor @funindex \ionian -@funindex ionian @funindex \locrian -@funindex locrian @funindex \aeolian -@funindex aeolian @funindex \mixolydian -@funindex mixolydian @funindex \lydian -@funindex lydian @funindex \phrygian -@funindex phrygian @funindex \dorian -@funindex dorian @cindex church modes @cindex modes @@ -1298,11 +1329,13 @@ standard mode names, also called @notation{church modes}: @code{\ionian}, @code{\dorian}, @code{\phrygian}, @code{\lydian}, @code{\mixolydian}, @code{\aeolian}, and @code{\locrian}. -@lilypond[verbatim,quote,relative=2] -\key g \major -fis1 -f -fis +@lilypond[verbatim,quote,fragment] +\relative { + \key g \major + fis''1 + f + fis +} @end lilypond Additional modes can be defined, by listing the alterations @@ -1312,8 +1345,8 @@ for each scale step when the mode starts on C. freygish = #`((0 . ,NATURAL) (1 . ,FLAT) (2 . ,NATURAL) (3 . ,NATURAL) (4 . ,NATURAL) (5 . ,FLAT) (6 . ,FLAT)) -\relative c' { - \key c \freygish c4 des e f +\relative { + \key c \freygish c'4 des e f \bar "||" \key d \freygish d es fis g } @end lilypond @@ -1327,14 +1360,14 @@ printed. If a single position is specified in an entry, the accidentals are placed within the octave ending at that staff position. -@lilypond[verbatim, quote,relative=0] +@lilypond[verbatim, quote,fragment] \override Staff.KeySignature.flat-positions = #'((-5 . 5)) \override Staff.KeyCancellation.flat-positions = #'((-5 . 5)) -\clef bass \key es \major es g bes d -\clef treble \bar "||" \key es \major es g bes d +\clef bass \key es \major es g bes d' +\clef treble \bar "||" \key es \major es' g' bes' d'' \override Staff.KeySignature.sharp-positions = #'(2) -\bar "||" \key b \major b fis b2 +\bar "||" \key b \major b' fis' b'2 @end lilypond @snippets @@ -1345,13 +1378,14 @@ position. @lilypondfile[verbatim,quote,texidoc,doctitle] {non-traditional-key-signatures.ly} + @seealso Music Glossary: @rglos{church mode}, @rglos{scordatura}. Learning Manual: -@rlearning{Accidentals and key signatures}. +@rlearning{Pitches and key signatures}. Snippets: @rlsr{Pitches}. @@ -1376,23 +1410,24 @@ Internals Reference: @funindex set-octavation @funindex \ottava -@funindex ottava @notation{Ottava brackets} introduce an extra transposition of an octave for the staff: -@lilypond[verbatim,quote,relative=2] -a2 b -\ottava #-2 -a2 b -\ottava #-1 -a2 b -\ottava #0 -a2 b -\ottava #1 -a2 b -\ottava #2 -a2 b +@lilypond[verbatim,quote] +\relative a' { + a2 b + \ottava #-2 + a2 b + \ottava #-1 + a2 b + \ottava #0 + a2 b + \ottava #1 + a2 b + \ottava #2 + a2 b +} @end lilypond @snippets @@ -1403,6 +1438,9 @@ a2 b @lilypondfile[verbatim,quote,texidoc,doctitle] {adding-an-ottava-marking-to-a-single-voice.ly} +@lilypondfile[verbatim,quote,texidoc,doctitle] +{modifying-the-ottava-spanner-slope.ly} + @seealso Music Glossary: @rglos{octavation}. @@ -1426,7 +1464,6 @@ Internals Reference: @cindex MIDI transposition @funindex \transposition -@funindex transposition When typesetting scores that involve transposing instruments, some parts can be typeset in a different pitch than the @@ -1567,12 +1604,12 @@ each style, we use the following example: @lilypond[verbatim,quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1582,8 +1619,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1650,12 +1687,12 @@ last@tie{}@code{c}: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1665,8 +1702,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1723,12 +1760,12 @@ individual musicians. If the staff is to be used by one musician @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1738,8 +1775,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1789,12 +1826,12 @@ the upper staff: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1804,8 +1841,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1843,22 +1880,20 @@ musicB = { @funindex modern-cautionary -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 by default printed with -parentheses, but they can also be printed in reduced size by -defining the @code{cautionary-style} property of -@code{AccidentalSuggestion}. +This rule is similar to @code{modern}, but the @q{extra} accidentals +are printed as cautionary accidentals (with parentheses). They can also +be printed at a different size by overriding +@code{AccidentalCautionary}'s @code{font-size} property. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1868,8 +1903,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1920,12 +1955,12 @@ accidental in a different voice in the previous measure: @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1935,8 +1970,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -1981,12 +2016,12 @@ typeset as cautionaries. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -1996,8 +2031,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2046,12 +2081,12 @@ This accidental style applies to the current @code{GrandStaff} or @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2061,8 +2096,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2106,12 +2141,12 @@ typeset as cautionaries. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2121,8 +2156,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2165,12 +2200,12 @@ if the note is immediately repeated. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2180,8 +2215,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2216,18 +2251,20 @@ musicB = { @funindex neo-modern-cautionary -This rule is similar to @code{neo-modern}, but the extra -accidentals are printed as cautionary accidentals. +This rule is similar to @code{neo-modern}, but the @q{extra} accidentals +are printed as cautionary accidentals (with parentheses). They can also +be printed at a different size by overriding +@code{AccidentalCautionary}'s @code{font-size} property. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2237,8 +2274,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2282,12 +2319,12 @@ but they are canceled across voices in the same @code{Staff}. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2297,8 +2334,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2339,12 +2376,12 @@ accidentals are printed as cautionary accidentals. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2354,8 +2391,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2399,12 +2436,12 @@ including natural signs. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2414,8 +2451,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2443,6 +2480,124 @@ musicB = { } @end lilypond +@item dodecaphonic-no-repeat + +@cindex dodecaphonic accidental style +@cindex dodecaphonic style, neo-modern + +@funindex dodecaphonic-no-repeat + +Like with the dodecaphonic accidental style @emph{every} note +gets an accidental sign by default, but accidentals are +suppressed for pitches immediately repeated within the same staff. + +@lilypond[quote] +musicA = { + << + \relative { + cis''8 fis, bes4 8 f bis4 | + cis2. 4 | + } + \\ + \relative { + ais'2 cis, | + fis8 b a4 cis2 | + } + >> +} + +musicB = { + \clef bass + \new Voice { + \voiceTwo \relative { + 8[ + \change Staff = up + cis' cis + \change Staff = down + ] + \showStaffSwitch + \change Staff = up + dis'4 | + \change Staff = down + 4 gis 2 | + } + } +} + +\new PianoStaff { + << + \context Staff = "up" { + \accidentalStyle dodecaphonic-no-repeat + \musicA + } + \context Staff = "down" { + \accidentalStyle dodecaphonic-no-repeat + \musicB + } + >> +} +@end lilypond + + +@item dodecaphonic-first + +@cindex dodecaphonic accidental style +@cindex dodecaphonic style, neo-modern + +@funindex dodecaphonic-first + +Similar to the dodecaphonic accidental style @emph{every} pitch +gets an accidental sign, but only the first time it is encountered +in a measure. Accidentals are only remembered for the actual octave +but throughout voices. + +@lilypond[quote] +musicA = { + << + \relative { + cis''8 fis, bes4 8 f bis4 | + cis2. 4 | + } + \\ + \relative { + ais'2 cis, | + fis8 b a4 cis2 | + } + >> +} + +musicB = { + \clef bass + \new Voice { + \voiceTwo \relative { + 8[ + \change Staff = up + cis' cis + \change Staff = down + ] + \showStaffSwitch + \change Staff = up + dis'4 | + \change Staff = down + 4 gis 2 | + } + } +} + +\new PianoStaff { + << + \context Staff = "up" { + \accidentalStyle dodecaphonic-first + \musicA + } + \context Staff = "down" { + \accidentalStyle dodecaphonic-first + \musicB + } + >> +} +@end lilypond + @item teaching @@ -2460,12 +2615,12 @@ key signature, except if the note is immediately repeated. @lilypond[quote,staffsize=18] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2475,8 +2630,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2521,12 +2676,12 @@ This is the same as @code{default} but with accidentals lasting @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2536,8 +2691,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2580,12 +2735,12 @@ the music. @lilypond[quote] musicA = { << - \relative c' { - cis'8 fis, bes4 8 f bis4 | + \relative { + cis''8 fis, bes4 8 f bis4 | cis2. 4 | } \\ - \relative c' { + \relative { ais'2 cis, | fis8 b a4 cis2 | } @@ -2595,8 +2750,8 @@ musicA = { musicB = { \clef bass \new Voice { - \voiceTwo \relative c' { - 8[ + \voiceTwo \relative { + 8[ \change Staff = up cis' cis \change Staff = down @@ -2676,7 +2831,7 @@ The following work-around can be used: define a function that locally changes the accidental style to @code{forget}: @lilypond[verbatim,quote] -forget = #(define-music-function (parser location music) (ly:music?) #{ +forget = #(define-music-function (music) (ly:music?) #{ \accidentalStyle forget #music \accidentalStyle modern @@ -2721,8 +2876,8 @@ printed if they are not part of the key signature. } } -\relative c'' { - aes c e2 +\relative { + aes' c e2 cis,1 } @end lilypond @@ -2795,16 +2950,18 @@ This section suggests ways of altering note heads. The appearance of note heads may be altered: -@lilypond[verbatim,quote,relative=2] -c4 b -\override NoteHead.style = #'cross -c4 b -\revert NoteHead.style -a b -\override NoteHead.style = #'harmonic -a b -\revert NoteHead.style -c4 d e f +@lilypond[verbatim,quote] +\relative c'' { + c4 b + \override NoteHead.style = #'cross + c4 b + \revert NoteHead.style + a b + \override NoteHead.style = #'harmonic + a b + \revert NoteHead.style + c4 d e f +} @end lilypond To see all note head styles, see @ref{Note head styles}. @@ -2814,22 +2971,26 @@ intentions. The following generic predefined commands modify the note head in both staff and tablature contexts and can be used to represent any musical meaning: -@lilypond[verbatim,quote,relative=2] -c4 b -\xNotesOn - a b c4 b -\xNotesOff -c4 d +@lilypond[verbatim,quote] +\relative { + c''4 b + \xNotesOn + a b c4 b + \xNotesOff + c4 d +} @end lilypond The music function form of this predefined command may be used inside and outside chords to generate crossed note heads in both staff and tablature contexts: -@lilypond[verbatim,quote,relative=2] -c4 b -\xNote { e f } -c b < g \xNote c f > b +@lilypond[verbatim,quote] +\relative { + c''4 b + \xNote { e f } + c b < g \xNote c f > b +} @end lilypond As synonyms for @code{\xNote}, @code{\xNotesOn} and @code{\xNotesOff}, @@ -2838,8 +2999,10 @@ be used. The term @notation{dead note} is commonly used by guitarists. There is also a similar shorthand for diamond shapes: -@lilypond[verbatim,quote,relative=2] -2 4 f\harmonic +@lilypond[verbatim,quote] +\relative c'' { + 2 4 f\harmonic +} @end lilypond @predefined @@ -2881,9 +3044,7 @@ Internals Reference: @cindex note heads, easy play @funindex \easyHeadsOn -@funindex easyHeadsOn @funindex \easyHeadsOff -@funindex easyHeadsOff The @q{easy play} note head includes a note name inside the head. It is used in music for beginners. To make the letters readable, @@ -2948,15 +3109,10 @@ Internals Reference: @cindex note heads, Walker @funindex \aikenHeads -@funindex aikenHeads @funindex \sacredHarpHeads -@funindex sacredHarpHeads @funindex \southernHarmonyHeads -@funindex southernHarmonyHeads @funindex \funkHeads -@funindex funkHeads @funindex \walkerHeads -@funindex walkerHeads In shape note head notation, the shape of the note head corresponds to the harmonic function of a note in the scale. This @@ -2964,52 +3120,49 @@ notation was popular in nineteenth-century American song books. Shape note heads can be produced in Sacred Harp, Southern Harmony, Funk (Harmonica Sacra), Walker, and Aiken (Christian Harmony) styles: -@lilypond[verbatim,quote,relative=2] -\aikenHeads -c, d e f g2 a b1 c \break -\sacredHarpHeads -c,4 d e f g2 a b1 c \break -\southernHarmonyHeads -c,4 d e f g2 a b1 c \break -\funkHeads -c,4 d e f g2 a b1 c \break -\walkerHeads -c,4 d e f g2 a b1 c \break +@lilypond[verbatim,quote] +\relative c'' { + \aikenHeads + c, d e f g2 a b1 c \break + \sacredHarpHeads + c,4 d e f g2 a b1 c \break + \southernHarmonyHeads + c,4 d e f g2 a b1 c \break + \funkHeads + c,4 d e f g2 a b1 c \break + \walkerHeads + c,4 d e f g2 a b1 c \break +} @end lilypond @funindex \key -@funindex key @funindex \aikenHeadsMinor -@funindex aikenHeadsMinor @funindex \sacredHarpHeadsMinor -@funindex sacredHarpHeadsMinor @funindex \southernHarmonyHeadsMinor -@funindex southernHarmonyHeadsMinor @funindex \funkHeadsMinor -@funindex funkHeadsMinor @funindex \walkerHeadsMinor -@funindex walkerHeadsMinor Shapes are typeset according to the step in the scale, where the base of the scale is determined by the @code{\key} command. When writing in a minor key, the scale step can be determined from the relative major: -@lilypond[verbatim,quote,relative=2] -\key a \minor -\aikenHeads -a b c d e2 f g1 a \break -\aikenHeadsMinor -a,4 b c d e2 f g1 a \break -\sacredHarpHeadsMinor -a,2 b c d \break -\southernHarmonyHeadsMinor -a2 b c d \break -\funkHeadsMinor -a2 b c d \break -\walkerHeadsMinor -a2 b c d \break - +@lilypond[verbatim,quote] +\relative c'' { + \key a \minor + \aikenHeads + a b c d e2 f g1 a \break + \aikenHeadsMinor + a,4 b c d e2 f g1 a \break + \sacredHarpHeadsMinor + a,2 b c d \break + \southernHarmonyHeadsMinor + a2 b c d \break + \funkHeadsMinor + a2 b c d \break + \walkerHeadsMinor + a2 b c d \break +} @end lilypond @@ -3057,23 +3210,21 @@ Internals Reference: @cindex note heads, slashed @funindex \improvisationOn -@funindex improvisationOn @funindex \improvisationOff -@funindex improvisationOff Improvisation is sometimes denoted with slashed note heads, where the performer may choose any pitch but should play the specified rhythm. Such note heads can be created: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Voice \with { \consists "Pitch_squash_engraver" -} { - e8 e g a a16( bes) a8 g +} \relative { + e''8 e g a a16( bes) a8 g \improvisationOn e8 ~ - e2 ~ e8 f4 f8 ~ - f2 + 2 ~ 8 f4 f8 ~ + 2 \improvisationOff a16( bes) a8 g e } diff --git a/Documentation/notation/repeats.itely b/Documentation/notation/repeats.itely index f3c4c5ac6c..3a3fcb44c3 100644 --- a/Documentation/notation/repeats.itely +++ b/Documentation/notation/repeats.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.21" @node Repeats @section Repeats @@ -88,10 +88,24 @@ where @code{@var{musicexpr}} is a music expression. A single repeat without an alternate ending: -@lilypond[verbatim,quote,relative=2] -\repeat volta 2 { c4 d e f } -c2 d -\repeat volta 2 { d4 e f g } +@lilypond[verbatim,quote] +\relative { + \repeat volta 2 { c''4 d e f } + c2 d + \repeat volta 2 { d4 e f g } +} +@end lilypond + +An @q{opening} repeat mark is not, by default, printed in the first full +measure. However it is possible to add one by using @code{\bar ".|:"} +before the first note. + +@lilypond[verbatim,fragment,quote] +\relative { + \repeat volta 2 { \bar ".|:" c''4 d e f } + c2 d + \repeat volta 2 { d4 e f g } +} @end lilypond Alternative endings can be produced using @code{\alternative}. Each @@ -112,36 +126,42 @@ repeats are given the first alternative. A single repeat with one alternate ending: -@lilypond[verbatim,quote,relative=2] -\repeat volta 2 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 2 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + } + c1 } -c1 @end lilypond Multiple repeats with one alternate ending: -@lilypond[verbatim,quote,relative=2] -\repeat volta 4 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 4 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + } + c1 } -c1 @end lilypond Multiple repeats with more than one alternate ending: -@lilypond[verbatim,quote,relative=2] -\repeat volta 3 { c4 d e f | } -\alternative { - { c2 e | } - { f2 g | } - { a2 g | } +@lilypond[verbatim,quote] +\relative { + \repeat volta 3 { c''4 d e f | } + \alternative { + { c2 e | } + { f2 g | } + { a2 g | } + } + c1 } -c1 @end lilypond @warning{If there are two or more alternatives, nothing should appear @@ -161,84 +181,43 @@ expected number of endings.} @cindex repeat with pickup @cindex pickup in a repeat @funindex \partial +@cindex bar checks with repeats +@cindex repeats with bar checks -If a repeat starts in the middle of a measure and has no alternate -endings, normally the end of the repeat will also fall in the -middle of a measure, so that the two ends add up to one complete -measure. In such cases, the repeat signs do not constitute true -bar lines. Do not use @code{\partial} commands or bar checks -where these repeat signs are printed: +If a repeat that has no alternate endings starts in the middle of a +measure, it will usually end at a corresponding place in the middle of a +later measure (so that the two ends add up to one complete measure). In +this case the repeat signs are not @q{true} bar lines so neither bar +checks nor @code{\partial} commands should be placed there: @lilypond[verbatim,quote,relative=1] -% no \partial here -c4 e g % no bar check here -% no \partial here +c'4 e g \repeat volta 4 { e4 | c2 e | - % no \partial here - g4 g g % no bar check here + g4 g g } -% no \partial here -g4 | -a2 a | -g1 | + g4 | + a2 a | + g1 | @end lilypond -Similarly, if a repeat begins with the initial partial measure of -a score and has no alternate endings, the same conditions apply as -in the above example, except that in this case the @code{\partial} -command is required at the beginning of the score: +If a repeat that has no alternate endings starts with a partial measure, +then the same principles apply, except that a @code{\partial} command is +required at the start of the measure: @lilypond[verbatim,quote,relative=1] -\partial 4 % required +\partial 4 \repeat volta 4 { - e4 | + e'4 | c2 e | - % no \partial here - g4 g g % no bar check here -} -% no \partial here -g4 | -a2 a | -g1 | -@end lilypond - -When alternate endings are added to a repeat that begins with an -incomplete measure, it becomes necessary to set the -@code{Timing.measureLength} context property manually, in the -following specific places: - -@itemize -@item -at the start of any incomplete measures in the @code{\alternative} -block, which normally occur at the end of each alternative, except -(in most cases) the last. - -@item -at the start of each alternative, except the first. -@end itemize - -@lilypond[verbatim,quote,relative=1] -\partial 4 -\repeat volta 2 { e4 | c2 e | } -\alternative { - { - f2 d | - \set Timing.measureLength = #(ly:make-moment 3/4) - g4 g g % optional bar check is allowed here - } - { - \set Timing.measureLength = #(ly:make-moment 4/4) - a2 a | - } + g4 g g } -g1 | + g4 | + a2 a | + g1 | @end lilypond -The @code{measureLength} property is described in @ref{Time -administration}. - @cindex repeats, with ties @cindex alternative endings, with ties @cindex ties, in repeats @@ -247,12 +226,14 @@ administration}. Ties may be added to a second ending: -@lilypond[verbatim,quote,relative=2] -c1 -\repeat volta 2 { c4 d e f~ } -\alternative { - { f2 d } - { f2\repeatTie f, } +@lilypond[verbatim,quote] +\relative { + c''1 + \repeat volta 2 { c4 d e f~ } + \alternative { + { f2 d } + { f2\repeatTie f, } + } } @end lilypond @@ -269,48 +250,56 @@ corresponding @qq{D.S.} mark must be added manually. Away from a repeat: -@lilypond[verbatim,quote,relative=1] -e1 -\inStaffSegno -f2 g a b -c1_"D.S." \bar "|." +@lilypond[verbatim,quote] +\relative { + e'1 + \inStaffSegno + f2 g a b + c1_"D.S." \bar "|." +} @end lilypond At the start of a repeat: -@lilypond[verbatim,quote,relative=1] -e1 -\repeat volta 2 { - \inStaffSegno % start repeat - f2 g a b +@lilypond[verbatim,quote] +\relative { + e'1 + \repeat volta 2 { + \inStaffSegno % start repeat + f2 g a b + } + c1_"D.S." \bar "|." } -c1_"D.S." \bar "|." @end lilypond At the end of a repeat: -@lilypond[verbatim,quote,relative=1] -e1 -\repeat volta 2 { +@lilypond[verbatim,quote] +\relative { + e'1 + \repeat volta 2 { + f2 g a b + \inStaffSegno % end repeat + } f2 g a b - \inStaffSegno % end repeat + c1_"D.S." \bar "|." } -f2 g a b -c1_"D.S." \bar "|." @end lilypond Between two repeats: -@lilypond[verbatim,quote,relative=1] -e1 -\repeat volta 2 { - f2 g a b -} -\inStaffSegno % double repeat -\repeat volta 2 { - f2 g a b +@lilypond[verbatim,quote] +\relative { + e'1 + \repeat volta 2 { + f2 g a b + } + \inStaffSegno % double repeat + \repeat volta 2 { + f2 g a b + } + c1_"D.S." \bar "|." } -c1_"D.S." \bar "|." @end lilypond Alternative bar line symbols can be obtained by setting (in the Score @@ -320,17 +309,19 @@ required bar line type. The alternative bar line types must be selected from the pre-defined types or types previously defined with the @code{\defineBarLine} command (see @ref{Bar lines}). -@lilypond[verbatim,quote,relative=1] +@lilypond[verbatim,quote] \defineBarLine ":|.S[" #'(":|." "S[" "") \defineBarLine "]" #'("]" "" "") -e1 -\repeat volta 2 { - f2 g a b - \once \set Score.endRepeatSegnoType = ":|.S[" - \inStaffSegno +\relative { + e'1 + \repeat volta 2 { + f2 g a b + \once \set Score.endRepeatSegnoType = ":|.S[" + \inStaffSegno + } + f2 g \bar "]" a b + c1_"D.S." \bar "|." } -f2 g \bar "]" a b -c1_"D.S." \bar "|." @end lilypond @snippets @@ -360,6 +351,9 @@ Notation Reference: @ref{Modifying ties and slurs}, @ref{Time administration}. +Installed Files: +@file{ly/engraver-init.ly}. + Snippets: @rlsr{Repeats}. @@ -452,11 +446,13 @@ layout of repeats. Its value is a Scheme list of repeat commands. @item start-repeat Print a @code{.|:} bar line. -@lilypond[verbatim,quote,relative=2] -c1 -\set Score.repeatCommands = #'(start-repeat) -d4 e f g -c1 +@lilypond[verbatim,quote] +\relative { + c''1 + \set Score.repeatCommands = #'(start-repeat) + d4 e f g + c1 +} @end lilypond As per standard engraving practice, repeat signs are not printed @@ -465,37 +461,43 @@ at the beginning of a piece. @item end-repeat Print a @code{:|.} bar line: -@lilypond[verbatim,quote,relative=2] -c1 -d4 e f g -\set Score.repeatCommands = #'(end-repeat) -c1 +@lilypond[verbatim,quote] +\relative { + c''1 + d4 e f g + \set Score.repeatCommands = #'(end-repeat) + c1 +} @end lilypond @item (volta @var{number}) @dots{} (volta #f) Create a new volta with the specified number. The volta bracket must be explicitly terminated, or it will not be printed. -@lilypond[verbatim,quote,relative=2] -f4 g a b -\set Score.repeatCommands = #'((volta "2")) -g4 a g a -\set Score.repeatCommands = #'((volta #f)) -c1 +@lilypond[verbatim,quote] +\relative { + f''4 g a b + \set Score.repeatCommands = #'((volta "2")) + g4 a g a + \set Score.repeatCommands = #'((volta #f)) + c1 +} @end lilypond @end table Multiple repeat commands may occur at the same point: -@lilypond[verbatim,quote,relative=2] -f4 g a b -\set Score.repeatCommands = #'((volta "2, 5") end-repeat) -g4 a g a -c1 -\set Score.repeatCommands = #'((volta #f) (volta "95") end-repeat) -b1 -\set Score.repeatCommands = #'((volta #f)) +@lilypond[verbatim,quote] +\relative { + f''4 g a b + \set Score.repeatCommands = #'((volta "2, 5") end-repeat) + g4 a g a + c1 + \set Score.repeatCommands = #'((volta #f) (volta "95") end-repeat) + b1 + \set Score.repeatCommands = #'((volta #f)) +} @end lilypond @cindex volta bracket with text @@ -508,8 +510,8 @@ then include the markup in a Scheme list. @lilypond[verbatim,quote] voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } -\relative c'' { - c1 +\relative { + c''1 \set Score.repeatCommands = #(list(list 'volta voltaAdLib) 'start-repeat) c4 b d e @@ -519,12 +521,6 @@ voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } } @end lilypond - -@snippets - -@lilypondfile[verbatim,quote,texidoc,doctitle] -{printing-a-repeat-sign-at-the-beginning-of-a-piece.ly} - @seealso Notation Reference: @ref{Bar lines}, @@ -564,9 +560,11 @@ where @code{@var{musicexpr}} is a music expression and @code{@var{repeatcount}} is the number of times @code{@var{musicexpr}} is repeated. -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -c1 +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + c1 +} @end lilypond In some cases, especially in a @code{\relative} context, the @@ -585,55 +583,63 @@ a'4 b c | a'4 b c Unfold repeats can be made with alternate endings. -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + } + c1 } -c1 @end lilypond If there are more repeats than there are alternate endings, the first alternative is applied multiple times until the remaining alternatives make up the total number of repeats. -@lilypond[verbatim,quote,relative=2] -\repeat unfold 4 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } - { e2 d } - } -c1 +@lilypond[verbatim,quote] +\relative { + \repeat unfold 4 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + { e2 d } + } + c1 +} @end lilypond If there are more alternate endings than repeats then only the first alternatives are applied. The remaining alternatives will be ignored and not printed. -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { c4 d e f } -\alternative { - { c2 g' } - { c,2 b } - { e2 d } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + { e2 d } + } + c1 } -c1 @end lilypond It is also possible to nest multiple @code{unfold} functions (with or without alternate endings). -@lilypond[verbatim,quote,relative=2] -\repeat unfold 2 { - \repeat unfold 2 { c4 d e f } - \alternative { - { c2 g' } - { c,2 b } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 2 { + \repeat unfold 2 { c''4 d e f } + \alternative { + { c2 g' } + { c,2 b } + } } + c1 } -c1 @end lilypond Chord constructs can be repeated by the chord repetition symbol @@ -692,34 +698,42 @@ where @code{@var{musicexpr}} is a music expression. Patterns that are shorter than one measure are replaced by slashes. -@lilypond[verbatim,quote,relative=2] -\repeat percent 4 { c128 d e f } -\repeat percent 4 { c64 d e f } -\repeat percent 5 { c32 d e f } -\repeat percent 4 { c16 d e f } -\repeat percent 4 { c8 d } -\repeat percent 4 { c4 } -\repeat percent 2 { c2 } +@lilypond[verbatim,quote] +\relative c'' { + \repeat percent 4 { c128 d e f } + \repeat percent 4 { c64 d e f } + \repeat percent 5 { c32 d e f } + \repeat percent 4 { c16 d e f } + \repeat percent 4 { c8 d } + \repeat percent 4 { c4 } + \repeat percent 2 { c2 } +} @end lilypond Patterns of one or two measures are replaced by percent-like symbols. -@lilypond[verbatim,quote,relative=2] -\repeat percent 2 { c4 d e f } -\repeat percent 2 { c2 d } -\repeat percent 2 { c1 } +@lilypond[verbatim,quote] +\relative c'' { + \repeat percent 2 { c4 d e f } + \repeat percent 2 { c2 d } + \repeat percent 2 { c1 } +} @end lilypond -@lilypond[verbatim,quote,relative=2] -\repeat percent 3 { c4 d e f | c2 g' } +@lilypond[verbatim,quote] +\relative { + \repeat percent 3 { c''4 d e f | c2 g' } +} @end lilypond Patterns that are shorter than one measure but contain mixed durations use a double-percent symbol. -@lilypond[verbatim,quote,relative=2] -\repeat percent 4 { c8. 16 } -\repeat percent 2 { \tuplet 3/2 { r8 c d } e4 } +@lilypond[verbatim,quote] +\relative { + \repeat percent 4 { c''8. 16 } + \repeat percent 2 { \tuplet 3/2 { r8 c d } e4 } +} @end lilypond @snippets @@ -755,6 +769,26 @@ Internals Reference: @rinternals{Double_percent_repeat_engraver}, @rinternals{Slash_repeat_engraver}. +@knownissues +Percent repeats will not contain anything else apart from the percent +sign itself; in particular, timing changes will not be repeated. + +@lilypond[quote,verbatim,relative=2] +\repeat percent 3 { \time 5/4 c2. 2 \time 4/4 2 2 } +@end lilypond + +@noindent +Any meter changes or @code{\partial} commands need to occur in parallel +passages @emph{outside} of any percent repeat, e.g in a separate +timing track. + +@lilypond[quote,verbatim,relative=2] +<< + \repeat percent 3 { c2. 2 2 2 } + \repeat unfold 3 { \time 5/4 s4*5 \time 4/4 s1 } +>> +@end lilypond + @node Tremolo repeats @unnumberedsubsubsec Tremolo repeats @@ -775,10 +809,12 @@ slashes to a single note. To place tremolo marks between notes, use @code{\repeat} with tremolo style: -@lilypond[quote,verbatim,relative=2] -\repeat tremolo 8 { c16 d } -\repeat tremolo 6 { c16 d } -\repeat tremolo 2 { c16 d } +@lilypond[quote,verbatim] +\relative c'' { + \repeat tremolo 8 { c16 d } + \repeat tremolo 6 { c16 d } + \repeat tremolo 2 { c16 d } +} @end lilypond The @code{\repeat tremolo} syntax expects exactly two notes within @@ -801,18 +837,19 @@ the note should not be surrounded by braces: @end lilypond @cindex tremolo marks -@funindex tremoloFlags @funindex : The same output can be obtained by adding @code{:@var{N}} after the note, where @code{@var{N}} indicates the duration of the subdivision (it must be at least 8). If @code{@var{N}} is 8, one beam is added to the note's stem. If @code{@var{N}} is omitted, -the last value (stored in @code{tremoloFlags}) is used: +the last value is used: -@lilypond[quote,verbatim,relative=2] -c2:8 c:32 -c: c: +@lilypond[quote,verbatim] +\relative { + c''2:8 c:32 + c: c: +} @end lilypond @snippets diff --git a/Documentation/notation/rhythms.itely b/Documentation/notation/rhythms.itely index a32975c1a8..05d71edc49 100644 --- a/Documentation/notation/rhythms.itely +++ b/Documentation/notation/rhythms.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.40" @node Rhythms @section Rhythms @@ -45,11 +45,8 @@ This section discusses rhythms, rests, durations, beaming and bars. @cindex note lengths @funindex \longa -@funindex longa @funindex \breve -@funindex breve @funindex \maxima -@funindex maxima Durations are designated by numbers and dots. Durations are entered as their reciprocal values. For example, a quarter note is entered @@ -60,21 +57,25 @@ whole you must use the @code{\longa} (a double breve) and specified. Shorter values are possible, but only as beamed notes. @c Two 64th notes are needed to obtain beams -@lilypond[quote,verbatim,relative=2] -\time 8/1 -c\longa c\breve c1 c2 -c4 c8 c16 c32 c64 c128 c128 +@lilypond[quote,verbatim] +\relative { + \time 8/1 + c''\longa c\breve c1 c2 + c4 c8 c16 c32 c64 c128 c128 +} @end lilypond Here are the same durations with automatic beaming turned off. @c not strictly "writing rhythms"; more of a "displaying" thing, @c but it's ok here. -gp -@lilypond[quote,verbatim,relative=2] -\time 8/1 -\autoBeamOff -c\longa c\breve c1 c2 -c4 c8 c16 c32 c64 c128 c128 +@lilypond[quote,verbatim] +\relative { + \time 8/1 + \autoBeamOff + c''\longa c\breve c1 c2 + c4 c8 c16 c32 c64 c128 c128 +} @end lilypond A note with the duration of a quadruple breve may be entered with @@ -89,8 +90,19 @@ If the duration is omitted, it is set to the previously entered duration. The default for the first note is a quarter note. -@lilypond[quote,verbatim,relative=2] -a a a2 a a4 a a1 a +@lilypond[quote,verbatim] +\relative { a' a a2 a a4 a a1 a } +@end lilypond + +Durations occuring on their own within a music sequence will take +their pitches from the preceding note or chord. + +@lilypond[quote,verbatim] +\relative { + \time 8/1 + c'' \longa \breve 1 2 + 4 8 16 32 64 128 128 +} @end lilypond @cindex notes, dotted @@ -104,8 +116,8 @@ To obtain dotted note lengths, place a dot (@code{.}) after the duration. Double-dotted notes are specified by appending two dots, and so on. -@lilypond[quote,verbatim,relative=2] -a4 b c4. b8 a4. b4.. c8. +@lilypond[quote,verbatim] +\relative { a'4 b c4. b8 a4. b4.. c8. } @end lilypond Some durations cannot be represented with just binary durations @@ -120,11 +132,8 @@ duration. For details of this and other settings which control proportional notation, see @ref{Proportional notation}. @funindex \dotsUp -@funindex dotsUp @funindex \dotsDown -@funindex dotsDown @funindex \dotsNeutral -@funindex dotsNeutral Dots are normally moved up to avoid staff lines, except in polyphonic situations. Dots may be manually placed above or below @@ -187,64 +196,70 @@ rests from 128th to maxima (8 x whole) may be printed. @cindex triplets @funindex \tuplet -@funindex tuplet Tuplets are made from a music expression with the @code{\tuplet} -command, multiplying the speed of the music expression by a -fraction: +command, multiplying the speed of the music expression by a fraction: @example \tuplet @var{fraction} @{ @var{music} @} @end example @noindent -The fraction's numerator will be printed over or -under the notes, optionally with a bracket. The most common -tuplets are triplets: 3@tie{}notes sound within the duration -normally allowed for@tie{}2: +The fraction's numerator will be printed over or under the notes, +optionally with a bracket. The most common tuplets are triplets +(3@tie{}notes sound within the duration normally allowed for@tie{}2). -@lilypond[quote,verbatim,relative=2] -a2 \tuplet 3/2 { b4 b b } -c4 c \tuplet 3/2 { b4 a g } +@lilypond[quote,verbatim] +\relative { + a'2 \tuplet 3/2 { b4 4 4 } + c4 c \tuplet 3/2 { b4 a g } +} @end lilypond @cindex tuplet grouping @noindent When entering long passages of tuplets, having to write a separate -@code{\tuplet} command for each group is inconvenient. It is -possible to specify the duration of one tuplet group directly -before the music in order to have the tuplets grouped -automatically: +@code{\tuplet} command for each group is inconvenient. It is possible +to specify the duration of one tuplet group directly before the music +in order to have the tuplets grouped automatically: -@lilypond[quote,verbatim,relative=2] -g2 r8 \tuplet 3/2 8 { cis16 d e e f g g f e } +@lilypond[quote,verbatim] +\relative { + g'2 r8 \tuplet 3/2 8 { cis16 d e e f g g f e } +} @end lilypond @cindex tuplet bracket placement @funindex \tupletUp -@funindex tupletUp @funindex \tupletDown -@funindex tupletDown @funindex \tupletNeutral -@funindex tupletNeutral -Tuplet brackets may be manually placed above or below the staff; -see @ref{Direction and placement}. +Tuplet brackets may be manually placed above or below the staff: + +@lilypond[quote,verbatim] +\relative { + \tupletUp \tuplet 3/2 { c''8 d e } + \tupletNeutral \tuplet 3/2 { c8 d e } + \tupletDown \tuplet 3/2 { f,8 g a } + \tupletNeutral \tuplet 3/2 { f8 g a } +} +@end lilypond Tuplets may be nested: -@lilypond[quote,verbatim,relative=2] -\autoBeamOff -c4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 +@lilypond[quote,verbatim] +\relative { + \autoBeamOff + c''4 \tuplet 5/4 { f8 e f \tuplet 3/2 { e[ f g] } } f4 +} @end lilypond -Modifying nested tuplets which begin at the same musical moment -must be done with @code{\tweak}. - -To modify the duration of notes without printing a tuplet bracket, -see @ref{Scaling durations}. +Modifying nested tuplets which begin at the same musical moment must be +done with @code{\tweak}. +To modify the duration of notes without printing a tuplet bracket, see +@ref{Scaling durations}. @predefined @code{\tupletUp}, @@ -262,7 +277,7 @@ see @ref{Scaling durations}. @funindex tupletSpannerDuration @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] -{entering-several-tuplets-using-only-one--times-command.ly} +{entering-several-tuplets-using-only-one--tuplet-command.ly} @cindex Tuplet number changes @@ -290,6 +305,7 @@ Learning Manual: @rlearning{Tweaking methods}. Notation Reference: +@ref{Direction and placement}, @ref{Time administration}, @ref{Scaling durations}, @ref{The tweak command}, @@ -303,20 +319,6 @@ Internals Reference: @rinternals{TupletNumber}, @rinternals{TimeScaledMusic}. -@cindex grace notes within tuplet brackets - -@knownissues -Grace notes may be placed within tuplet brackets, @emph{except} -when a staff begins with a grace note followed by a tuplet. In this -particular case, the grace note must be placed before the @code{\tuplet} -command to avoid errors. - -@cindex tempo marks within tuplet brackets - -When using a tuplet at the beginning of a piece with a @code{\tempo} -mark, the music must be explicitly entered in a @code{\new Voice} -block, as discussed in @rlearning{Voices contain music}. - @node Scaling durations @unnumberedsubsubsec Scaling durations @@ -337,16 +339,18 @@ the preceding note will include any scaling factor. In the following example, the first three notes take up exactly two beats, but no triplet bracket is printed. -@lilypond[quote,relative=2,verbatim] -\time 2/4 -% Alter durations to triplets -a4*2/3 gis a -% Normal durations -a4 a -% Double the duration of chord -4*2 -% Duration of quarter, appears like sixteenth -b16*4 c4 +@lilypond[quote,verbatim] +\relative { + \time 2/4 + % Alter durations to triplets + a'4*2/3 gis a + % Normal durations + a4 a + % Double the duration of chord + 4*2 + % Duration of quarter, appears like sixteenth + b16*4 c4 +} @end lilypond The duration of spacer rests may also be modified by @@ -357,7 +361,6 @@ a multiplier. This is useful for skipping many measures, e.g., @cindex expanding music @funindex \scaleDurations -@funindex scaleDurations Longer stretches of music may be compressed by a fraction in the same way, as if every note, chord or rest had the fraction as a @@ -366,17 +369,19 @@ the internal duration of the notes will be multiplied by the fraction @emph{num}/@emph{den}. Here is an example showing how music can be compressed and expanded: -@lilypond[quote,relative=2,verbatim] -\time 2/4 -% Normal durations -4 c8 a -% Scale music by *2/3 -\scaleDurations 2/3 { - 4. c8 a f -} -% Scale music by *2 -\scaleDurations 2/1 { - 4 c8 b +@lilypond[quote,verbatim] +\relative { + \time 2/4 + % Normal durations + 4 c8 a + % Scale music by *2/3 + \scaleDurations 2/3 { + 4. c8 a f + } + % Scale music by *2 + \scaleDurations 2/1 { + 4 c8 b + } } @end lilypond @@ -421,8 +426,15 @@ A tie is entered by appending a tilde symbol (@code{~}) to the first of each pair of notes being tied. This indicates that the note should be tied to the following note, which must be at the same pitch. -@lilypond[quote,verbatim,relative=2] -a2~ a4~ a16 r r8 +@lilypond[quote,verbatim] +{ a'2~ 4~ 16 r r8 } +@end lilypond + +Ties can make use of the @q{last explicit pitch} interpretation of +isolated durations: + +@lilypond[quote,verbatim] +{ a'2~ 4~ 16 r r8 } @end lilypond Ties are used either when the note crosses a bar line, or when @@ -430,9 +442,9 @@ dots cannot be used to denote the rhythm. Ties should also be used when note values cross larger subdivisions of the measure: @lilypond[verbatim,quote] -\relative c' { - r8 c~ c2 r4 | - r8^"not" c2~ c8 r4 +\relative { + r8 c'~ 2 r4 | + r8^"not" c2~ 8 r4 } @end lilypond @@ -449,9 +461,12 @@ match are connected. When no note heads match, no ties will be created. Chords may be partially tied by placing the ties inside the chord. -@lilypond[quote,verbatim,relative=1] -~ - +@lilypond[quote,verbatim] +\relative c' { + 2~ 2 | + 4~ + | +} @end lilypond @cindex repeating ties @@ -460,43 +475,41 @@ the chord. @cindex ties and volta brackets @funindex \repeatTie -@funindex repeatTie When a second alternative of a repeat starts with a tied note, you have to specify the repeated tie as follows: -@lilypond[quote,relative=2,verbatim] -\repeat volta 2 { c g 2~ } -\alternative { - % First alternative: following note is tied normally - { 2. r4 } - % Second alternative: following note has a repeated tie - { 2\repeatTie d4 c } } +@lilypond[quote,verbatim] +\relative { + \repeat volta 2 { c'' g 2~ } + \alternative { + % First alternative: following note is tied normally + { 2. r4 } + % Second alternative: following note has a repeated tie + { 2\repeatTie d4 c } + } +} @end lilypond @cindex laissez vibrer @cindex ties, laissez vibrer @funindex \laissezVibrer -@funindex laissezVibrer @notation{L.v.}@: ties (@notation{laissez vibrer}) indicate that notes must not be damped at the end. It is used in notation for piano, harp and other string and percussion instruments. They can be entered as follows: -@lilypond[quote,verbatim,relative=1] -1\laissezVibrer +@lilypond[quote,verbatim,fragment] +1\laissezVibrer @end lilypond @cindex ties, placement @funindex \tieUp -@funindex tieUp @funindex \tieDown -@funindex tieDown @funindex \tieNeutral -@funindex tieNeutral Ties may be made to curve up or down manually; see @ref{Direction and placement}. @@ -508,56 +521,59 @@ Ties may be made to curve up or down manually; see @cindex dotted ties @funindex \tieDotted -@funindex tieDotted @funindex \tieDashed -@funindex tieDashed @funindex \tieSolid -@funindex tieSolid Ties may be made dashed, dotted, or a combination of solid and dashed. -@lilypond[quote, verbatim, relative=1] -\tieDotted -c2~ c -\tieDashed -c2~ c -\tieHalfDashed -c2~ c -\tieHalfSolid -c2~ c -\tieSolid -c2~ c +@lilypond[quote, verbatim] +\relative c' { + \tieDotted + c2~ 2 + \tieDashed + c2~ 2 + \tieHalfDashed + c2~ 2 + \tieHalfSolid + c2~ 2 + \tieSolid + c2~ 2 +} @end lilypond Custom dash patterns can be specified: -@lilypond[quote, verbatim, relative=1] -\tieDashPattern #0.3 #0.75 -c2~ c -\tieDashPattern #0.7 #1.5 -c2~ c -\tieSolid -c2~ c +@lilypond[quote, verbatim] +\relative c' { + \tieDashPattern #0.3 #0.75 + c2~ 2 + \tieDashPattern #0.7 #1.5 + c2~ 2 + \tieSolid + c2~ 2 +} @end lilypond Dash pattern definitions for ties have the same structure as dash pattern definitions for slurs. For more information about complex dash patterns, see @ref{Slurs}. -Override @var{whiteout} and @var{layer} layout properties for ties that -collide with other objects in a staff. - -@lilypond[verbatim,quote,ragged-right,relative=2] -\override Tie.layer = #-2 -\override Staff.TimeSignature.layer = #-1 -\override Staff.KeySignature.layer = #-1 -\override Staff.TimeSignature.whiteout = ##t -\override Staff.KeySignature.whiteout = ##t -b2 b~ -\time 3/4 -\key a \major -b r4 +Override @var{whiteout} and @var{layer} layout properties of objects +that should cause a gap in ties. + +@lilypond[verbatim,quote,ragged-right] +\relative { + \override Tie.layer = #-2 + \override Staff.TimeSignature.layer = #-1 + \override Staff.KeySignature.layer = #-1 + \override Staff.TimeSignature.whiteout = ##t + \override Staff.KeySignature.whiteout = ##t + b'2 b~ + \time 3/4 + \key a \major + b r4 +} @end lilypond @predefined @@ -627,14 +643,10 @@ Rests are entered as part of the music in music expressions. @cindex breve rest @funindex \rest -@funindex rest @funindex r @funindex \maxima -@funindex maxima @funindex \longa -@funindex longa @funindex \breve -@funindex breve Rests are entered like notes with the note name @code{r}. Durations longer than a whole rest use the following predefined @@ -642,7 +654,7 @@ commands: @c \time 16/1 is used to avoid spurious bar lines @c and long tracts of empty measures -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Staff { % These two lines are just to prettify this example \time 16/1 @@ -673,8 +685,8 @@ be placed at the staff position where the note would appear. This allows for precise manual formatting of polyphonic music, since the automatic rest collision formatter will not move these rests. -@lilypond[quote,verbatim,relative=2] -a4\rest d4\rest +@lilypond[quote,verbatim] +\relative { a'4\rest d4\rest } @end lilypond @snippets @@ -715,14 +727,15 @@ are rests from 128th to maxima (8 x whole). @funindex s @funindex \skip -@funindex skip An invisible rest (also called a @q{spacer rest}) can be entered like a note with the note name@tie{}@code{s}: -@lilypond[verbatim,quote,relative=2] -c4 c s c -s2 c +@lilypond[verbatim,quote] +\relative c'' { + c4 c s c | + s2 c | +} @end lilypond @cindex lyrics, skip @@ -734,10 +747,10 @@ command @code{\skip} is used to skip a musical moment. the lyrics derive their durations from the notes in an associated melody through @code{\addlyrics} or @code{\lyricsto}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << { - a2 \skip2 a2 a2 + a'2 \skip2 a'2 a'2 } \new Lyrics { \lyricmode { @@ -750,14 +763,14 @@ melody through @code{\addlyrics} or @code{\lyricsto}. Because @code{\skip} is a command, it does not affect the default durations of following notes, unlike@tie{}@code{s}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << { - \repeat unfold 8 { a4 } + \repeat unfold 8 { a'4 } } { - a4 \skip 2 a | - s2 a + a'4 \skip 2 a' | + s2 a' } >> @end lilypond @@ -767,16 +780,16 @@ A spacer rest implicitly causes @code{Staff} and @code{Voice} contexts to be created if none exist, just like notes and rests do: -@lilypond[quote,verbatim,relative=2] -s1 s s +@lilypond[quote,verbatim] +{ s1 s s } @end lilypond @code{\skip} simply skips musical time; it creates no output of any kind. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % This is valid input, but does nothing -\skip 1 \skip1 \skip 1 +{ \skip 1 \skip1 \skip 1 } @end lilypond @seealso @@ -804,18 +817,20 @@ Internals Reference: @cindex whole rest for a full measure @cindex rest, whole for a full measure +@funindex \compressMMRests @funindex R Rests for one or more full measures are entered like notes with the note name uppercase @code{R}: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % Rest measures contracted to single measure -\compressFullBarRests -R1*4 -R1*24 -R1*4 -b2^"Tutti" b4 a4 +\compressMMRests { + R1*4 + R1*24 + R1*4 + b'2^"Tutti" b'4 a'4 +} @end lilypond The duration of full-measure rests is identical to the duration @@ -823,22 +838,23 @@ notation used for notes. The duration in a multi-measure rest must always be an integral number of measure-lengths, so augmentation dots or fractions must often be used: -@lilypond[quote,verbatim,relative=2] -\compressFullBarRests -\time 2/4 -R1 | R2 | -\time 3/4 -R2. | R2.*2 | -\time 13/8 -R1*13/8 | R1*13/8*12 | -\time 10/8 -R4*5*4 | +@lilypond[quote,verbatim] +\compressMMRests { + \time 2/4 + R1 | R2 | + \time 3/4 + R2. | R2.*2 | + \time 13/8 + R1*13/8 | R1*13/8*12 | + \time 10/8 + R4*5*4 | +} @end lilypond A full-measure rest is printed as either a whole or breve rest, centered in the measure, depending on the time signature. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 4/4 R1 | \time 6/4 @@ -850,26 +866,21 @@ R1*2 | @cindex multi-measure rest, expanding @cindex multi-measure rest, contracting -@funindex \expandFullBarRests -@funindex expandFullBarRests -@funindex \compressFullBarRests -@funindex compressFullBarRests - By default a multi-measure rest is expanded in the printed score to show all the rest measures explicitly. Alternatively, a multi-measure rest can be shown as a single measure containing a multi-measure rest symbol, with the number of measures of rest printed above the measure: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] % Default behavior \time 3/4 r2. | R2.*2 | \time 2/4 R2 | \time 4/4 % Rest measures contracted to single measure -\compressFullBarRests -r1 | R1*17 | R1*4 | -% Rest measures expanded -\expandFullBarRests +\compressMMRests { + r1 | R1*17 | R1*4 | +} +% Rest measures expanded again \time 3/4 R2.*2 | @end lilypond @@ -885,18 +896,18 @@ R2.*2 | @cindex multi-measure rest with markup @funindex \fermataMarkup -@funindex fermataMarkup @funindex MultiMeasureRestText Markups can be added to multi-measure rests. The predefined command @code{\fermataMarkup} is provided for adding fermatas. -@lilypond[quote,verbatim,relative=2] -\compressFullBarRests -\time 3/4 -R2.*10^\markup { \italic "ad lib." } -R2.^\fermataMarkup +@lilypond[quote,verbatim] +\compressMMRests { + \time 3/4 + R2.*10^\markup { \italic "ad lib." } + R2.^\fermataMarkup +} @end lilypond @warning{Markups attached to a multi-measure rest are objects of type @@ -904,7 +915,7 @@ R2.^\fermataMarkup be directed to the correct object, or they will be ignored. See the following example:} -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] % This fails, as the wrong object name is specified \override TextScript.padding = #5 R1^"wrong" @@ -918,22 +929,15 @@ setting, resulting bar-check warnings may not be displayed. @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff @funindex \fermataMarkup -@funindex fermataMarkup -@funindex \compressFullBarRests -@funindex compressFullBarRests -@funindex \expandFullBarRests -@funindex expandFullBarRests +@funindex \compressMMRests @predefined @code{\textLengthOn}, @code{\textLengthOff}, @code{\fermataMarkup}, -@code{\compressFullBarRests}, -@code{\expandFullBarRests}. +@code{\compressMMRests}. @endpredefined @@ -1012,16 +1016,17 @@ Multi-measure rests do not take part in rest collisions. @cindex meter @funindex \time -@funindex time The time signature is set as follows: -@lilypond[quote,verbatim,relative=2] -\time 2/4 c2 -\time 3/4 c2. +@lilypond[quote,verbatim,fragment] +\time 2/4 c''2 +\time 3/4 c''2. @end lilypond -@cindex time signature, visibility of +Mid-measure time signature changes are covered in @ref{Upbeats}. + +@cindex time signature visibility Time signatures are printed at the beginning of a piece and whenever the time signature changes. If a change takes place @@ -1029,39 +1034,41 @@ at the end of a line a warning time signature sign is printed there. This default behavior may be changed, see @ref{Visibility of objects}. -@lilypond[quote,verbatim,relative=2] -\time 2/4 -c2 c -\break -c c -\break -\time 4/4 -c c c c +@lilypond[quote,verbatim] +\relative c'' { + \time 2/4 + c2 c + \break + c c + \break + \time 4/4 + c c c c +} @end lilypond @cindex time signature style @cindex meter style @funindex \numericTimeSignature -@funindex numericTimeSignature @funindex \defaultTimeSignature -@funindex defaultTimeSignature The time signature symbol that is used in 2/2 and 4/4 time can be changed to a numeric style: -@lilypond[quote,verbatim,relative=2] -% Default style -\time 4/4 c1 -\time 2/2 c1 -% Change to numeric style -\numericTimeSignature -\time 4/4 c1 -\time 2/2 c1 -% Revert to default style -\defaultTimeSignature -\time 4/4 c1 -\time 2/2 c1 +@lilypond[quote,verbatim] +\relative c'' { + % Default style + \time 4/4 c1 + \time 2/2 c1 + % Change to numeric style + \numericTimeSignature + \time 4/4 c1 + \time 2/2 c1 + % Revert to default style + \defaultTimeSignature + \time 4/4 c1 + \time 2/2 c1 +} @end lilypond @@ -1086,10 +1093,10 @@ argument: @lilypond[quote,verbatim] \score { \new Staff { - \relative c' { - \time #'(2 2 3) 7/8 - \repeat unfold 7 { c8 } | - \time #'(3 2 2) 7/8 + \relative { + \time 2,2,3 7/8 + \repeat unfold 7 { c'8 } | + \time 3,2,2 7/8 \repeat unfold 7 { c8 } | } } @@ -1110,7 +1117,7 @@ signature is executed: \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 { c8 } | @@ -1151,12 +1158,12 @@ to the original values: @lilypond[quote,verbatim] \score{ - \relative c' { - \repeat unfold 8 { c8 } | + \relative { + \repeat unfold 8 { c'8 } | \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 { c8 } | @@ -1179,7 +1186,7 @@ for different staves by moving the @code{Timing_translator} and the \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 {c''8} @@ -1188,7 +1195,7 @@ for different staves by moving the @code{Timing_translator} and the \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(1 3) % beatStructure + 1,3 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 {c''8} @@ -1252,60 +1259,69 @@ Internals Reference: @cindex metronome marking with text @funindex \tempo -@funindex tempo A basic metronome mark is simple to write: -@lilypond[verbatim,quote,relative=1] -\tempo 4 = 120 -c2 d -e4. d8 c2 +@lilypond[verbatim,quote] +\relative { + \tempo 4 = 120 + c'2 d + e4. d8 c2 +} @end lilypond Metronome marks may also be printed as a range of two numbers: -@lilypond[verbatim,quote,relative=1] -\tempo 4 = 40 - 46 -c4. e8 a4 g -b,2 d4 r +@lilypond[verbatim,quote] +\relative { + \tempo 4 = 40 - 46 + c'4. e8 a4 g + b,2 d4 r +} @end lilypond Tempo indications with text can be used instead: -@lilypond[verbatim,quote,relative=2] -\tempo "Allegretto" -c4 e d c -b4. a16 b c4 r4 +@lilypond[verbatim,quote] +\relative { + \tempo "Allegretto" + c''4 e d c + b4. a16 b c4 r4 +} @end lilypond Combining a metronome mark and text will automatically place the metronome mark within parentheses: -@lilypond[verbatim,quote,relative=2] -\tempo "Allegro" 4 = 160 -g4 c d e -d4 b g2 +@lilypond[verbatim,quote] +\relative { + \tempo "Allegro" 4 = 160 + g'4 c d e + d4 b g2 +} @end lilypond In general, the text can be any markup object: -@lilypond[verbatim,quote,relative=2] -\tempo \markup { \italic Faster } 4 = 132 -a8-. r8 b-. r gis-. r a-. r +@lilypond[verbatim,quote] +\relative { + \tempo \markup { \italic Faster } 4 = 132 + a'8-. r8 b-. r gis-. r a-. r +} @end lilypond A parenthesized metronome mark with no textual indication may be written by including an empty string in the input: -@lilypond[verbatim,quote,relative=2] -\tempo "" 8 = 96 -d4 g e c +@lilypond[verbatim,quote] +\relative { + \tempo "" 8 = 96 + d''4 g e c +} @end lilypond @funindex \markLengthOn -@funindex markLengthOn @funindex \markLengthOff -@funindex markLengthOff In a part for an instrument with long periods of rests, tempo indications sometimes follow each other closely. @@ -1314,16 +1330,17 @@ to prevent tempo indications from overlapping, and @code{\markLengthOff} restores the default behavior of ignoring tempo marks for horizontal spacing. -@lilypond[verbatim,quote,relative=0] -\compressFullBarRests -\markLengthOn -\tempo "Molto vivace" -R1*12 -\tempo "Meno mosso" -R1*16 -\markLengthOff -\tempo "Tranquillo" -R1*20 +@lilypond[verbatim,quote] +\compressMMRests { + \markLengthOn + \tempo "Molto vivace" + R1*12 + \tempo "Meno mosso" + R1*16 + \markLengthOff + \tempo "Tranquillo" + R1*20 +} @end lilypond @snippets @@ -1350,7 +1367,7 @@ Music Glossary: Notation Reference: @ref{Formatting text}, -@ref{MIDI output}. +@ref{Creating MIDI output}. Snippets: @rlsr{Staff notation}. @@ -1368,56 +1385,69 @@ Internals Reference: @cindex measure, partial @cindex measure, pickup @cindex pickup measure +@cindex time signature, mid-measure @funindex measurePosition @funindex \partial -@funindex partial Partial or pick-up measures, such as an @emph{anacrusis} or an -@emph{upbeat}, are entered using the @code{\partial} command, +@emph{upbeat}, are entered using the @code{\partial} command: @example \partial @var{duration} @end example -@noindent -where @code{@var{duration}} is the @emph{remaining} length of the -partial measure @emph{before} the start of the next full measure. +When @code{\partial} is used at the beginning of a score, +@code{@var{duration}} is the length of the music preceding the +first bar. -@lilypond[quote,verbatim,relative=1] -\time 3/4 -\partial 8 -e8 | a4 c8 b c4 | +@lilypond[quote,verbatim] +\relative { + \time 3/4 + \partial 4. + r4 e'8 | a4 c8 b c4 | +} @end lilypond -The @var{duration} can be any value less than a full measure: +When @code{\partial} is used after the beginning of a score, +@code{@var{duration}} is the @emph{remaining} length of the +current measure. It does not create a new numbered bar. -@lilypond[quote,verbatim,relative=1] -\time 3/4 -\partial 4. -r4 e8 | a4 c8 b c4 | +@lilypond[quote,verbatim] +\relative { + \set Score.barNumberVisibility = #all-bar-numbers-visible + \override Score.BarNumber.break-visibility = + #end-of-line-invisible + \time 9/8 + d''4.~ 4 d8 d( c) b | c4.~ 4. \bar "||" + \time 12/8 + \partial 4. + c8( d) e | f2.~ 4 f8 a,( c) f | +} @end lilypond -@code{\partial @var{duration}} can also be written as: +The @code{\partial} command is @emph{required} when the time +signature changes in mid measure, but it may also be used alone. -@example -\set Timing.measurePosition -@var{duration} -@end example - -So the first example above could be written: - -@lilypond[quote,verbatim,relative=1] -\time 3/4 -\set Timing.measurePosition = #(ly:make-moment -1/8) -e8 | a4 c8 b c4 | +@lilypond[quote,verbatim] +\relative { + \set Score.barNumberVisibility = #all-bar-numbers-visible + \override Score.BarNumber.break-visibility = + #end-of-line-invisible + \time 6/8 + \partial 8 + e'8 | a4 c8 b[ c b] | + \partial 4 + r8 e,8 | a4 \bar "||" + \partial 4 + r8 e8 | a4 + c8 b[ c b] | +} @end lilypond -The property @code{measurePosition} contains a rational number, which -is usually positive and indicates how much of the measure has passed -at this point. The @code{\partial @var{duration}} command sets it to -a negative number, when it has a different meaning: it then says that -the current (first) bar will be @emph{preceded} by a bar 0 (the partial -bar) with a duration given by @var{duration}. +The @code{\partial} command sets the @code{Timing.measurePosition} +property, which is a rational number that indicates how much of +the measure has passed. @seealso Music Glossary: @@ -1432,19 +1462,6 @@ Snippets: Internal Reference: @rinternals{Timing_translator}. -@knownissues -The @code{\partial} command should be used only at the beginning of a -piece. If you use it after the beginning, warnings or problems may -occur, so use @code{\set Timing.measurePosition} instead. - -@lilypond[quote,verbatim,relative=1] -\time 6/8 -\partial 8 -e8 | a4 c8 b[ c b] | -\set Timing.measurePosition = #(ly:make-moment -1/4) -r8 e,8 | a4 c8 b[ c b] | -@end lilypond - @node Unmetered music @unnumberedsubsubsec Unmetered music @@ -1469,9 +1486,7 @@ r8 e,8 | a4 c8 b[ c b] | @cindex beams, unmetered music @funindex \cadenzaOn -@funindex cadenzaOn @funindex \cadenzaOff -@funindex cadenzaOff In metered music bar lines are inserted and bar numbers are calculated automatically. In unmetered music (i.e. cadenzas), this is not @@ -1479,26 +1494,30 @@ desirable and can be @q{switched off} using the command @code{\cadenzaOn}, then @q{switched back on} at the appropriate place using @code{\cadenzaOff}. -@lilypond[verbatim,relative=2,quote] -c4 d e d -\cadenzaOn -c4 c d8[ d d] f4 g4. -\cadenzaOff -\bar "|" -d4 e d c +@lilypond[verbatim,quote] +\relative c'' { + c4 d e d + \cadenzaOn + c4 c d8[ d d] f4 g4. + \cadenzaOff + \bar "|" + d4 e d c +} @end lilypond Bar numbering is resumed at the end of the cadenza. -@lilypond[verbatim,relative=2,quote] -% Show all bar numbers -\override Score.BarNumber.break-visibility = #all-visible -c4 d e d -\cadenzaOn -c4 c d8[ d d] f4 g4. -\cadenzaOff -\bar "|" -d4 e d c +@lilypond[verbatim,quote] +\relative c'' { + % Show all bar numbers + \override Score.BarNumber.break-visibility = #all-visible + c4 d e d + \cadenzaOn + c4 c d8[ d d] f4 g4. + \cadenzaOff + \bar "|" + d4 e d c +} @end lilypond Inserting a @code{\bar} command within a cadenza does not start a new @@ -1509,28 +1528,32 @@ subsequent accidentals should be printed, forced accidentals or reminder accidentals need to be inserted manually, see @ref{Accidentals}. -@lilypond[verbatim,relative=2,quote] -c4 d e d -\cadenzaOn -cis4 d cis d -\bar "|" -% First cis is printed without alteration even if it's after a \bar -cis4 d cis! d -\cadenzaOff -\bar "|" +@lilypond[verbatim,quote] +\relative c'' { + c4 d e d + \cadenzaOn + cis4 d cis d + \bar "|" + % First cis is printed without alteration even if it's after a \bar + cis4 d cis! d + \cadenzaOff + \bar "|" +} @end lilypond Automatic beaming is disabled by @code{\cadenzaOn}. Therefore, all beaming in cadenzas must be entered manually. See @ref{Manual beams}. -@lilypond[verbatim,relative=2,quote] -\repeat unfold 8 { c8 } -\cadenzaOn -cis8 c c c c -\bar"|" -c8 c c -\cadenzaOff -\repeat unfold 8 { c8 } +@lilypond[verbatim,quote] +\relative { + \repeat unfold 8 { c''8 } + \cadenzaOn + cis8 c c c c + \bar"|" + c8 c c + \cadenzaOff + \repeat unfold 8 { c8 } +} @end lilypond These predefined commands affect all staves in the score, even when @@ -1584,16 +1607,14 @@ stretches of unmetered music to permit breaking: @cindex double time signatures @cindex signatures, polymetric -@cindex time signatures, polymetric -@cindex time signatures, double +@cindex time signature, polymetric +@cindex time signature, double @cindex polymetric signatures @cindex meter, polymetric @funindex timeSignatureFraction @funindex \scaleDurations -@funindex scaleDurations @funindex \tuplet -@funindex tuplet Polymetric notation is supported explicitly or by manually modifying the visible time signature symbol and/or scaling note durations. @@ -1616,10 +1637,10 @@ may be necessary to insert beams manually, as the duration scaling will affect the autobeaming rules. @lilypond[quote,verbatim] -\relative c' << +\relative << \new Staff { \time 3/4 - c4 c c | + c'4 c c | c4 c c | } \new Staff { @@ -1662,10 +1683,10 @@ moving the @code{Timing_translator} and the % Now each staff has its own time signature. -\relative c' << +\relative << \new Staff { \time 3/4 - c4 c c | + c'4 c c | c4 c c | } \new Staff { @@ -1702,9 +1723,9 @@ indicates the bottom number of the time signature and those that come before it, the top numbers. @lilypond[quote,verbatim] -\relative c' { +\relative { \compoundMeter #'((2 2 2 8)) - \repeat unfold 6 c8 \repeat unfold 12 c16 + \repeat unfold 6 c'8 \repeat unfold 12 c16 } @end lilypond @@ -1712,14 +1733,14 @@ More complex meters can be constructed using additional lists. Also, automatic beaming settings will be adjusted depending on the values. @lilypond[quote,verbatim] -\relative c' { +\relative { \compoundMeter #'((1 4) (3 8)) - \repeat unfold 5 c8 \repeat unfold 10 c16 + \repeat unfold 5 c'8 \repeat unfold 10 c16 } -\relative c' { +\relative { \compoundMeter #'((1 2 3 8) (3 4)) - \repeat unfold 12 c8 + \repeat unfold 12 c'8 } @end lilypond @@ -1772,15 +1793,16 @@ overrun bar lines are split automatically by replacing the following example, notes and rests crossing the bar lines are split, notes are also tied. -@lilypond[quote,verbatim,relative=1] +@lilypond[quote,verbatim] \new Voice \with { \remove "Note_heads_engraver" \consists "Completion_heads_engraver" \remove "Rest_engraver" \consists "Completion_rest_engraver" } - -{ c2. c8 d4 e f g a b c8 c2 b4 a g16 f4 e d c8. c2 r1*2 } +\relative { + c'2. c8 d4 e f g a b c8 c2 b4 a g16 f4 e d c8. c2 r1*2 +} @end lilypond These engravers split all running notes and rests at the bar line, and @@ -1788,6 +1810,37 @@ inserts ties for notes. One of its uses is to debug complex scores: if the measures are not entirely filled, then the ties show exactly how much each measure is off. +The property @code{completionUnit} sets a preferred duration for +the split notes. + +@lilypond[quote,verbatim] +\new Voice \with { + \remove "Note_heads_engraver" + \consists "Completion_heads_engraver" +} \relative { + \time 9/8 g\breve. d''4. \bar "||" + \set completionUnit = #(ly:make-moment 3 8) + g\breve. d4. +} +@end lilypond + +These engravers split notes with scaled duration, such as those in tuplets, +into notes with the same scale-factor as in the input note. + +@lilypond[quote,verbatim] +\new Voice \with { + \remove "Note_heads_engraver" + \consists "Completion_heads_engraver" +} \relative { + \time 2/4 r4 + \tuplet 3/2 {g'4 a b} + \scaleDurations 2/3 {g a b} + g4*2/3 a b + \tuplet 3/2 {g4 a b} + r4 +} +@end lilypond + @seealso Music Glossary: @rglos{tie} @@ -1807,12 +1860,12 @@ Internals Reference: @rinternals{Forbid_line_break_engraver}. @knownissues -Not all durations (especially those containing tuplets) can be -represented exactly with normal notes and dots, but the -@code{Completion_heads_engraver} will not insert tuplets. - -The @code{Completion_heads_engraver} only affects notes; it does not -split rests. +For consistency with previous behavior, notes and rests with +duration longer than a measure, such as @code{c1*2}, are split into +notes without any scale factor, @code{@{ c1 c1 @}}. The property +@code{completionFactor} controls this behavior, and setting it to +@code{#f} cause split notes and rest to have the scale factor +of the input durations. @node Showing melody rhythms @@ -1825,12 +1878,12 @@ Sometimes you might want to show only the rhythm of a melody. This can be done with the rhythmic staff. All pitches of notes on such a staff are squashed, and the staff itself has a single line -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << \new RhythmicStaff { - \new Voice = "myRhythm" { + \new Voice = "myRhythm" \relative { \time 4/4 - c4 e8 f g2 + c'4 e8 f g2 r4 g g f g1 } @@ -1850,9 +1903,7 @@ staff are squashed, and the staff itself has a single line @funindex Pitch_squash_engraver @funindex \improvisationOn -@funindex improvisationOn @funindex \improvisationOff -@funindex improvisationOff Guitar chord charts often show the strumming rhythms. This can be done with the @code{Pitch_squash_engraver} and @@ -1919,13 +1970,13 @@ By default, beams are inserted automatically: @cindex beams, customizing rules @funindex \autoBeamOn -@funindex autoBeamOn @funindex \autoBeamOff -@funindex autoBeamOff -@lilypond[quote,verbatim,relative=2] -\time 2/4 c8 c c c -\time 6/8 c8 c c c8. c16 c8 +@lilypond[quote,verbatim] +\relative c'' { + \time 2/4 c8 c c c + \time 6/8 c8 c c c8. c16 c8 +} @end lilypond If these automatic decisions are not satisfactory, beaming can be @@ -1935,12 +1986,14 @@ entered manually if beams are to be extended over rests. If automatic beaming is not required, it may be turned off with @code{\autoBeamOff} and on with @code{\autoBeamOn}: -@lilypond[quote,relative=1,verbatim] -c4 c8 c8. c16 c8. c16 c8 -\autoBeamOff -c4 c8 c8. c16 c8. -\autoBeamOn -c16 c8 +@lilypond[quote,verbatim] +\relative c' { + c4 c8 c8. c16 c8. c16 c8 + \autoBeamOff + c4 c8 c8. c16 c8. + \autoBeamOn + c16 c8 +} @end lilypond @cindex melismata, with beams @@ -2014,13 +2067,11 @@ new beam starts. @funindex autoBeaming @funindex baseMoment -@funindex beamExceptions +@funindex \beamExceptions @funindex beatStructure @funindex measureLength @funindex \time -@funindex time @funindex \set -@funindex set When automatic beaming is enabled, the placement of automatic beams is determined by three context properties: @@ -2060,50 +2111,62 @@ units of @code{baseMoment}. By default, @code{baseMoment} is one over the denominator of the time signature. By default, each unit of length @code{baseMoment} is a single beat. -@lilypond[quote,relative=2,verbatim] -\time 5/16 -c16^"default" c c c c | -% beamExceptions are unlikely to be defined for 5/16 time, -% but let's disable them anyway to be sure -\set Timing.beamExceptions = #'() -\set Timing.beatStructure = #'(2 3) -c16^"(2+3)" c c c c | -\set Timing.beatStructure = #'(3 2) -c16^"(3+2)" c c c c | +Note that there are separate @code{beatStructure} and @code{baseMoment} +values for each time signature. Changes to these variables apply only +to the time signature that is currently in force, hence those changes +must be placed after the @code{\time} command which starts a new time +signature section, not before it. New values given to a particular +time signature are retained and reinstated whenever that time signature +is re-established. + +@lilypond[quote,verbatim] +\relative c'' { + \time 5/16 + c16^"default" c c c c | + % beamExceptions are unlikely to be defined for 5/16 time, + % but let's disable them anyway to be sure + \set Timing.beamExceptions = #'() + \set Timing.beatStructure = 2,3 + c16^"(2+3)" c c c c | + \set Timing.beatStructure = 3,2 + c16^"(3+2)" c c c c | +} @end lilypond -@lilypond[quote,relative=2,verbatim] -\time 4/4 -a8^"default" a a a a a a a -% Disable beamExceptions because they are definitely -% defined for 4/4 time -\set Timing.beamExceptions = #'() -\set Timing.baseMoment = #(ly:make-moment 1/4) -\set Timing.beatStructure = #'(1 1 1 1) -a8^"changed" a a a a a a a +@lilypond[quote,verbatim] +\relative { + \time 4/4 + a'8^"default" a a a a a a a + % Disable beamExceptions because they are definitely + % defined for 4/4 time + \set Timing.beamExceptions = #'() + \set Timing.baseMoment = #(ly:make-moment 1/4) + \set Timing.beatStructure = 1,1,1,1 + a8^"changed" a a a a a a a +} @end lilypond Beam setting changes can be limited to specific contexts. If no setting is included in a lower-level context, the setting of the enclosing context will apply. -@lilypond[quote, verbatim,relative=1] +@lilypond[quote, verbatim] \new Staff { \time 7/8 % No need to disable beamExceptions % as they are not defined for 7/8 time - \set Staff.beatStructure = #'(2 3 2) + \set Staff.beatStructure = 2,3,2 << \new Voice = one { - \relative c'' { - a8 a a a a a a + \relative { + a'8 a a a a a a } } \new Voice = two { - \relative c' { + \relative { \voiceTwo - \set Voice.beatStructure = #'(1 3 3) - f8 f f f f f f + \set Voice.beatStructure = 1,3,3 + f'8 f f f f f f } } >> @@ -2114,18 +2177,18 @@ When multiple voices are used the @code{Staff} context must be specified if the beaming is to be applied to all voices in the staff: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 7/8 % rhythm 3-1-1-2 % Change applied to Voice by default -- does not work correctly % Because of autogenerated voices, all beating will % be at baseMoment (1 . 8) -\set beatStructure = #'(3 1 1 2) -<< {a8 a a a16 a a a a8 a} \\ {f4. f8 f f f} >> +\set beatStructure = 3,1,1,2 +<< \relative {a'8 a a a16 a a a a8 a} \\ \relative {f'4. f8 f f f} >> % Works correctly with context Staff specified -\set Staff.beatStructure = #'(3 1 1 2) -<< {a8 a a a16 a a a a8 a} \\ {f4. f8 f f f} >> +\set Staff.beatStructure = 3,1,1,2 +<< \relative {a'8 a a a16 a a a a8 a} \\ \relative {f'4. f8 f f f} >> @end lilypond The value of @code{baseMoment} can be adjusted to change @@ -2133,13 +2196,13 @@ the beaming behavior, if desired. When this is done, the value of @code{beatStructure} must be set to be compatible with the new value of @code{baseMoment}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 5/8 % No need to disable beamExceptions % as they are not defined for 5/8 time \set Timing.baseMoment = #(ly:make-moment 1/16) -\set Timing.beatStructure = #'(7 3) -\repeat unfold 10 { a16 } +\set Timing.beatStructure = 7,3 +\repeat unfold 10 { a'16 } @end lilypond @code{baseMoment} is a @i{moment}; a unit of musical duration. A @@ -2156,42 +2219,26 @@ the time signature. Any exceptions to this default can be found in Special autobeaming rules (other than ending a beam on a beat) are defined in the @code{beamExceptions} property. -@lilypond[quote,relative=2,verbatim] -\time 3/16 -\set Timing.beatStructure = #'(2 1) -\set Timing.beamExceptions = - #'( ;start of alist - (end . ;entry for end of beams - ( ;start of alist of end points - ((1 . 32) . (2 2 2)) ;rule for 1/32 beams -- end each 1/16 - ))) %close all entries -c16 c c | -\repeat unfold 6 { c32 } | -@end lilypond - -@code{beamExceptions} is an alist with a key of rule-type and a value -of beaming-rules. - -At this time the only available value of rule-type is -@code{'end} for beam ending. +The value for @code{beamExceptions}, a somewhat complex Scheme +data structure, is easiest generated with the +@code{\beamExceptions} function. This function is given one or +more manually beamed measure-length rhythmic patterns (measures +have to be separated by a bar check@tie{}@code{|} since the +function has no other way to discern the measure length). Here is +a simple example: -Beaming-rules is a scheme alist (or list of pairs) that indicates the -beam type and the grouping to be applied to beams containing notes with -a shortest duration of that beam type. - -@example -#'((beam-type1 . grouping-1) - (beam-type2 . grouping-2) - (beam-type3 . grouping-3)) -@end example - -Beam type is a scheme pair indicating the duration of the beam, -e.g., @code{(1 . 16)}. - -Grouping is a scheme list indicating the grouping to be applied to -the beam. The grouping is in units of the beam type. +@lilypond[quote,verbatim] +\relative c'' { + \time 3/16 + \set Timing.beatStructure = 2,1 + \set Timing.beamExceptions = + \beamExceptions { 32[ 32] 32[ 32] 32[ 32] } + c16 c c | + \repeat unfold 6 { c32 } | +} +@end lilypond -@warning{ A @code{beamExceptions} value must be @emph{complete} +@warning{A @code{beamExceptions} value must be @emph{complete} exceptions list. That is, every exception that should be applied must be included in the setting. It is not possible to add, remove, or change only one of the exceptions. While this may seem cumbersome, @@ -2204,15 +2251,17 @@ and @code{Timing.beamExceptions} are set. Setting the time signature will reset the automatic beaming settings for the @code{Timing} context to the default behavior. -@lilypond[quote,verbatim,relative=2] -\time 6/8 -\repeat unfold 6 { a8 } -% group (4 + 2) -\set Timing.beatStructure = #'(4 2) -\repeat unfold 6 { a8 } -% go back to default behavior -\time 6/8 -\repeat unfold 6 { a8 } +@lilypond[quote,verbatim] +\relative a' { + \time 6/8 + \repeat unfold 6 { a8 } + % group (4 + 2) + \set Timing.beatStructure = 4,2 + \repeat unfold 6 { a8 } + % go back to default behavior + \time 6/8 + \repeat unfold 6 { a8 } +} @end lilypond The default automatic beaming settings for a time signature @@ -2226,28 +2275,28 @@ beam the measure in two if there are only eighth notes. The @code{beamExceptions} rule can override the @code{beatStructure} setting if @code{beamExceptions} is not reset. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 4/4 \set Timing.baseMoment = #(ly:make-moment 1/8) -\set Timing.beatStructure = #'(3 3 2) +\set Timing.beatStructure = 3,3,2 % This won't beam (3 3 2) because of beamExceptions -\repeat unfold 8 {c8} | +\repeat unfold 8 {c''8} | % This will beam (3 3 2) because we clear beamExceptions \set Timing.beamExceptions = #'() -\repeat unfold 8 {c8} +\repeat unfold 8 {c''8} @end lilypond In a similar fashion, eighth notes in 3/4 time are beamed as a full measure by default. To beam eighth notes in 3/4 time on the beat, reset @code{beamExceptions}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \time 3/4 % by default we beam in (6) due to beamExceptions -\repeat unfold 6 {a8} | +\repeat unfold 6 {a'8} | % This will beam (1 1 1) due to default baseMoment and beatStructure \set Timing.beamExceptions = #'() -\repeat unfold 6 {a8} +\repeat unfold 6 {a'8} @end lilypond In engraving from the Romantic and Classical periods, @@ -2257,11 +2306,13 @@ but modern practice is to avoid the false impression of 6/8 time This behavior is controlled by the context property @code{beamHalfMeasure}, which has effect only in time signatures with 3 in the numerator: -@lilypond[quote,verbatim,relative=2] -\time 3/4 -r4. a8 a a | -\set Timing.beamHalfMeasure = ##f -r4. a8 a a | +@lilypond[quote,verbatim] +\relative a' { + \time 3/4 + r4. a8 a a | + \set Timing.beamHalfMeasure = ##f + r4. a8 a a | +} @end lilypond @subsubsubheading How automatic beaming works @@ -2360,16 +2411,17 @@ beaming that was set in an earlier staff. One way to avoid this problem is to set the time signature in only one staff. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << \new Staff { \time 3/4 \set Timing.baseMoment = #(ly:make-moment 1/8) - \set Timing.beatStructure = #'(1 5) - \repeat unfold 6 { a8 } + \set Timing.beatStructure = 1,5 + \set Timing.beamExceptions = #'() + \repeat unfold 6 { a'8 } } \new Staff { - \repeat unfold 6 { a8 } + \repeat unfold 6 { a'8 } } >> @end lilypond @@ -2379,20 +2431,20 @@ that the desired beaming will always be used. Changes in automatic beaming settings for a time signature are described in @ref{Time signature}. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << \new Staff { \overrideTimeSignatureSettings 3/4 % timeSignatureFraction 1/8 % baseMomentFraction - #'(1 5) % beatStructure + 1,5 % beatStructure #'() % beamExceptions \time 3/4 - \repeat unfold 6 { a8 } + \repeat unfold 6 { a'8 } } \new Staff { \time 3/4 - \repeat unfold 6 { a8 } + \repeat unfold 6 { a'8 } } >> @end lilypond @@ -2414,8 +2466,8 @@ often set to follow the meter of the lyrics rather than the notes. Such beams can be specified manually by marking the begin and end point with @code{[} and @code{]}. -@lilypond[quote,relative=1,verbatim] -r4 r8[ g' a r] r g[ | a] r +@lilypond[quote,verbatim] +\relative { r4 r8[ g' a r] r g[ | a] r } @end lilypond @cindex manual beams, direction shorthand for @@ -2423,30 +2475,33 @@ r4 r8[ g' a r] r g[ | a] r Beaming direction can be set manually using direction indicators: -@lilypond[quote,relative=2,verbatim] -c8^[ d e] c,_[ d e f g] +@lilypond[quote,verbatim] +\relative { c''8^[ d e] c,_[ d e f g] } @end lilypond @funindex \noBeam -@funindex noBeam Individual notes may be marked with @code{\noBeam} to prevent them from being beamed: -@lilypond[quote,verbatim,relative=2] -\time 2/4 -c8 c\noBeam c c +@lilypond[quote,verbatim] +\relative { + \time 2/4 + c''8 c\noBeam c c +} @end lilypond Grace note beams and normal note beams can occur simultaneously. Unbeamed grace notes are not put into normal note beams. -@lilypond[quote,verbatim,relative=2] -c4 d8[ -\grace { e32 d c d } -e8] e[ e -\grace { f16 } -e8 e] +@lilypond[quote,verbatim] +\relative { + c''4 d8[ + \grace { e32 d c d } + e8] e[ e + \grace { f16 } + e8 e] +} @end lilypond @funindex stemLeftBeamCount @@ -2461,14 +2516,16 @@ then it is erased. In this example, the last @code{f} is printed with only one beam on the left side, i.e., the eighth-note beam of the group as a whole. -@lilypond[quote,relative=2,verbatim] -a8[ r16 f g a] -a8[ r16 -\set stemLeftBeamCount = #2 -\set stemRightBeamCount = #1 -f16 -\set stemLeftBeamCount = #1 -g16 a] +@lilypond[quote,verbatim] +\relative a' { + a8[ r16 f g a] + a8[ r16 + \set stemLeftBeamCount = #2 + \set stemRightBeamCount = #1 + f16 + \set stemLeftBeamCount = #1 + g16 a] +} @end lilypond @@ -2505,7 +2562,6 @@ Internals Reference: @cindex feathered beams @funindex \featherDurations -@funindex featherDurations @funindex grow-direction Feathered beams are used to indicate that a small group of notes @@ -2533,16 +2589,18 @@ as the last one, with the intermediate notes gradually lengthening. The first four 32nd notes gradually speed up, while the last four 32nd notes are at a constant tempo. -@lilypond[relative=1,verbatim,quote] -\override Beam.grow-direction = #LEFT -\featherDurations #(ly:make-moment 2/1) -{ c16[ c c c c c c c] } -\override Beam.grow-direction = #RIGHT -\featherDurations #(ly:make-moment 2/3) -{ c32[ d e f] } -% revert to non-feathered beams -\override Beam.grow-direction = #'() -{ g32[ a b c] } +@lilypond[verbatim,quote] +\relative c' { + \override Beam.grow-direction = #LEFT + \featherDurations #(ly:make-moment 2/1) + { c16[ c c c c c c c] } + \override Beam.grow-direction = #RIGHT + \featherDurations #(ly:make-moment 2/3) + { c32[ d e f] } + % revert to non-feathered beams + \override Beam.grow-direction = #'() + { g32[ a b c] } +} @end lilypond @noindent @@ -2584,7 +2642,6 @@ music snippets, and when numbers in the fraction are small. @cindex repeat bars @funindex \bar -@funindex bar Bar lines delimit measures, and are also used to indicate repeats. Normally, simple bar lines are automatically inserted @@ -2595,8 +2652,8 @@ The simple bar lines inserted automatically can be changed to other types with the @code{\bar} command. For example, a closing double bar line is usually placed at the end of a piece: -@lilypond[quote,relative=1,verbatim] -e4 d c2 \bar "|." +@lilypond[quote,verbatim] +\relative { e'4 d c2 \bar "|." } @end lilypond It is not invalid if the final note in a measure does not @@ -2651,45 +2708,51 @@ exists, the effects of the original bar line are not altered. Two types of simple bar lines and five types of double bar lines are available for manual insertion: -@lilypond[quote,relative=1,verbatim] -f1 \bar "|" -f1 \bar "." -g1 \bar "||" -a1 \bar ".|" -b1 \bar ".." -c1 \bar "|.|" -d1 \bar "|." -e1 +@lilypond[quote,verbatim] +\relative { + f'1 \bar "|" + f1 \bar "." + g1 \bar "||" + a1 \bar ".|" + b1 \bar ".." + c1 \bar "|.|" + d1 \bar "|." + e1 +} @end lilypond @noindent together with dotted and dashed bar lines: -@lilypond[quote,relative=1,verbatim] -f1 \bar ";" -g1 \bar "!" -a1 +@lilypond[quote,verbatim] +\relative { + f'1 \bar ";" + g1 \bar "!" + a1 +} @end lilypond @noindent and nine types of repeat bar lines: -@lilypond[quote,relative=1,verbatim] -f1 \bar ".|:" -g1 \bar ":..:" -a1 \bar ":|.|:" -b1 \bar ":|.:" -c1 \bar ":.|.:" -d1 \bar "[|:" -e1 \bar ":|][|:" -f1 \bar ":|]" -g1 \bar ":|." -a1 +@lilypond[quote,verbatim] +\relative { + f'1 \bar ".|:" + g1 \bar ":..:" + a1 \bar ":|.|:" + b1 \bar ":|.:" + c1 \bar ":.|.:" + d1 \bar "[|:" + e1 \bar ":|][|:" + f1 \bar ":|]" + g1 \bar ":|." + a1 +} @end lilypond Additionally, a bar line can be printed as a simple tick: -@lilypond[quote,relative=1,verbatim] -f1 \bar "'" g1 +@lilypond[quote,fragment,verbatim] +f'1 \bar "'" g'1 @end lilypond However, as such ticks are typically used in Gregorian chant, it is preferable to use @code{\divisioMinima} there instead, described in @@ -2697,8 +2760,8 @@ the section @ref{Divisiones} in Gregorian chant. Lilypond supports kievan notation and provides a special kievan bar line: -@lilypond[quote,relative=1,verbatim] -f1 \bar "k" +@lilypond[quote,fragment,verbatim] +f'1 \bar "k" @end lilypond Further details of this notation are explained in @ref{Typesetting Kievan square notation}. @@ -2708,20 +2771,22 @@ Further details of this notation are explained in For in-line segno signs, there are three types of bar lines which differ in their behavior at line breaks: -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar "S" -c4 c c c \break -\bar "S" -c4 c c c -\bar "S-|" -c4 c c c \break -\bar "S-|" -c4 c c c -\bar "S-S" -c4 c c c \break -\bar "S-S" -c1 +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar "S" + c4 c c c \break + \bar "S" + c4 c c c + \bar "S-|" + c4 c c c \break + \bar "S-|" + c4 c c c + \bar "S-S" + c4 c c c \break + \bar "S-S" + c1 +} @end lilypond @cindex repeats @@ -2737,43 +2802,47 @@ In addition, you can specify @code{".|:-||"}, which is equivalent to line at the end of the line and a start repeat at the beginning of the next line. -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar ".|:-||" -c4 c c c \break -\bar ".|:-||" -c4 c c c +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar ".|:-||" + c4 c c c \break + \bar ".|:-||" + c4 c c c +} @end lilypond For combinations of repeats with the segno sign, there are six different variations: -@lilypond[quote,relative=2,verbatim] -c4 c c c -\bar ":|.S" -c4 c c c \break -\bar ":|.S" -c4 c c c -\bar ":|.S-S" -c4 c c c \break -\bar ":|.S-S" -c4 c c c -\bar "S.|:-S" -c4 c c c \break -\bar "S.|:-S" -c4 c c c -\bar "S.|:" -c4 c c c \break -\bar "S.|:" -c4 c c c -\bar ":|.S.|:" -c4 c c c \break -\bar ":|.S.|:" -c4 c c c -\bar ":|.S.|:-S" -c4 c c c \break -\bar ":|.S.|:-S" -c1 +@lilypond[quote,verbatim] +\relative c'' { + c4 c c c + \bar ":|.S" + c4 c c c \break + \bar ":|.S" + c4 c c c + \bar ":|.S-S" + c4 c c c \break + \bar ":|.S-S" + c4 c c c + \bar "S.|:-S" + c4 c c c \break + \bar "S.|:-S" + c4 c c c + \bar "S.|:" + c4 c c c \break + \bar "S.|:" + c4 c c c + \bar ":|.S.|:" + c4 c c c \break + \bar ":|.S.|:" + c4 c c c + \bar ":|.S.|:-S" + c4 c c c \break + \bar ":|.S.|:-S" + c1 +} @end lilypond Additionally there is an @code{\inStaffSegno} command which creates @@ -2782,7 +2851,6 @@ when used with a @code{\repeat volta} command, see @ref{Normal repeats}. @funindex \defineBarLine -@funindex defineBarLine @cindex bar lines, defining @cindex defining bar lines @@ -2834,16 +2902,16 @@ but different behavior at line breaks and/or different span bars. The part following the @code{"-"} sign is not used for building up the bar line. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] \defineBarLine "||-dashedSpan" #'("||" "" "!!") \new StaffGroup << - \new Staff { + \new Staff \relative c'' { c1 \bar "||" c1 \bar "||-dashedSpan" c1 } - \new Staff { + \new Staff \relative c'' { c1 c1 c1 @@ -2854,17 +2922,17 @@ the bar line. Furthermore, the space character @code{" "} serves as a placeholder for defining span bars correctly aligned to the main bar lines: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] \defineBarLine ":|.-wrong" #'(":|." "" "|.") \defineBarLine ":|.-right" #'(":|." "" " |.") \new StaffGroup << - \new Staff { + \new Staff \relative c'' { c1 \bar ":|.-wrong" c1 \bar ":|.-right" c1 } - \new Staff { + \new Staff \relative c'' { c1 c1 c1 @@ -2881,17 +2949,17 @@ automatically applied to all staves. The resulting bar lines are connected between different staves of a @code{StaffGroup}, @code{PianoStaff}, or @code{GrandStaff}. -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim] << \new StaffGroup << - \new Staff { - e4 d + \new Staff \relative { + e'4 d \bar "||" f4 e } - \new Staff { \clef bass c4 g e g } + \new Staff \relative { \clef bass c'4 g e g } >> - \new Staff { \clef bass c2 c2 } + \new Staff \relative { \clef bass c'2 c2 } >> @end lilypond @@ -2902,7 +2970,6 @@ connected between different staves of a @code{StaffGroup}, @funindex whichBar @funindex defaultBarType @funindex \bar -@funindex bar @funindex bartype The command @samp{\bar @var{bartype}} is a shortcut for @@ -2946,11 +3013,13 @@ the first line. The number itself is stored in the @code{currentBarNumber} property, which is normally updated automatically for every measure. It may also be set manually: -@lilypond[verbatim,quote,relative=1] -c1 c c c -\break -\set Score.currentBarNumber = #50 -c1 c c c +@lilypond[verbatim,quote] +\relative c' { + c1 c c c + \break + \set Score.currentBarNumber = #50 + c1 c c c +} @end lilypond @cindex bar numbers, regular spacing @@ -2958,25 +3027,27 @@ c1 c c c @funindex barNumberVisibility @funindex BarNumber -Bar numbers can be typeset at regular intervals instead of just at -the beginning of every line. To do this the default behavior -must be overridden to permit bar numbers to be printed at places -other than the start of a line. This is controlled by the -@code{break-visibility} property of @code{BarNumber}. This takes -three values which may be set to @code{#t} or @code{#f} to specify -whether the corresponding bar number is visible or not. The order -of the three values is @code{end of line visible}, @code{middle of -line visible}, @code{beginning of line visible}. In the following -example bar numbers are printed at all possible places: - -@lilypond[verbatim,quote,relative=1] -\override Score.BarNumber.break-visibility = ##(#t #t #t) -\set Score.currentBarNumber = #11 -% Permit first bar number to be printed -\bar "" -c1 | c | c | c -\break -c1 | c | c | c +Bar numbers can be typeset at regular intervals instead of just at the +beginning of every line. To do this the default behavior must be +overridden to permit bar numbers to be printed at places other than the +start of a line. This is controlled by the @code{break-visibility} +property of @code{BarNumber}. This takes three values which may be set +to @code{#t} or @code{#f} to specify whether the corresponding bar +number is visible or not. The order of the three values is +@code{end of line visible}, @code{middle of line visible}, +@code{beginning of line visible}. In the following example bar numbers +are printed at all possible places: + +@lilypond[verbatim,quote] +\relative c' { + \override Score.BarNumber.break-visibility = ##(#t #t #t) + \set Score.currentBarNumber = #11 + % Permit first bar number to be printed + \bar "" + c1 | c | c | c | + \break + c1 | c | c | c | +} @end lilypond @snippets @@ -2986,6 +3057,9 @@ c1 | c | c | c @lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] {printing-bar-numbers-at-regular-intervals.ly} +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{printing-bar-numbers-with-changing-regular-intervals.ly} + @cindex measure number, format @cindex bar number, format @@ -3046,15 +3120,6 @@ next example, the second bar check will signal an error. \time 3/4 c2 e4 | g2 | @end example -Bar checks can also be used in lyrics: - -@example -\lyricmode @{ - \time 2/4 - Twin -- kle | Twin -- kle | -@} -@end example - An incorrect duration can result in a completely garbled score, especially if the score is polyphonic, so a good place to start correcting input is by scanning for failed bar checks and @@ -3064,6 +3129,22 @@ If successive bar checks are off by the same musical interval, only the first warning message is displayed. This allows the warning to focus on the source of the timing error. +Bar checks can also be inserted in lyrics: + +@example +\lyricmode @{ + \time 2/4 + Twin -- kle | Twin -- kle | +@} +@end example + +Note that bar check marks in lyrics are evaluated at the musical +moment when the syllable @emph{following} the check mark is processed. +If the lyrics are associated with the notes of a voice which has a +rest at the beginning of a bar, then no syllable can be located at the +start of that bar and a warning will be issued if a bar check mark is +placed in the lyrics at that position. + @funindex | @funindex "|" @@ -3087,7 +3168,6 @@ for end of bar. @end lilypond @funindex \barNumberCheck -@funindex barNumberCheck When copying large pieces of music, it can be helpful to check that the LilyPond bar number corresponds to the original that you are @@ -3114,15 +3194,16 @@ Snippets: @cindex mark, rehearsal @funindex \mark -@funindex mark To print a rehearsal mark, use the @code{\mark} command. -@lilypond[quote,verbatim,relative=2] -c1 \mark \default -c1 \mark \default -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + c1 \mark \default + c1 \mark \default + c1 \mark \default + c1 \mark \default +} @end lilypond @noindent @@ -3131,12 +3212,14 @@ The mark is incremented automatically if you use @code{\mark mark manually. The value to use is stored in the property @code{rehearsalMark}. -@lilypond[quote,verbatim,relative=2] -c1 \mark \default -c1 \mark \default -c1 \mark #8 -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + c1 \mark \default + c1 \mark \default + c1 \mark #8 + c1 \mark \default + c1 \mark \default +} @end lilypond @noindent @@ -3152,13 +3235,15 @@ hollow circle). \set Score.markFormatter = #format-mark-circle-alphabet @end example -@lilypond[quote,verbatim,relative=2] -\set Score.markFormatter = #format-mark-box-alphabet -c1 \mark \default -c1 \mark \default -c1 \mark #8 -c1 \mark \default -c1 \mark \default +@lilypond[quote,verbatim] +\relative c'' { + \set Score.markFormatter = #format-mark-box-alphabet + c1 \mark \default + c1 \mark \default + c1 \mark #8 + c1 \mark \default + c1 \mark \default +} @end lilypond @cindex rehearsal mark format @@ -3179,16 +3264,18 @@ following example, @code{markFormatter} is set to a pre-defined procedure. After a few measures, it is set to a procedure that produces a boxed number. -@lilypond[quote,verbatim,relative=2] -\set Score.markFormatter = #format-mark-numbers -c1 \mark \default -c1 \mark \default -\set Score.markFormatter = #format-mark-box-numbers -c1 \mark \default -\set Score.markFormatter = #format-mark-circle-numbers -c1 \mark \default -\set Score.markFormatter = #format-mark-circle-letters -c1 +@lilypond[quote,verbatim] +\relative c'' { + \set Score.markFormatter = #format-mark-numbers + c1 \mark \default + c1 \mark \default + \set Score.markFormatter = #format-mark-box-numbers + c1 \mark \default + \set Score.markFormatter = #format-mark-circle-numbers + c1 \mark \default + \set Score.markFormatter = #format-mark-circle-letters + c1 +} @end lilypond The file @file{scm/translation-functions.scm} contains the @@ -3225,16 +3312,17 @@ string. @cindex glyphs, music @funindex \musicglyph -@funindex musicglyph Music glyphs (such as the segno sign) may be printed inside a @code{\mark} -@lilypond[quote,verbatim,relative=1] -c1 \mark \markup { \musicglyph #"scripts.segno" } -c1 \mark \markup { \musicglyph #"scripts.coda" } -c1 \mark \markup { \musicglyph #"scripts.ufermata" } -c1 +@lilypond[quote,verbatim] +\relative c' { + c1 \mark \markup { \musicglyph #"scripts.segno" } + c1 \mark \markup { \musicglyph #"scripts.coda" } + c1 \mark \markup { \musicglyph #"scripts.ufermata" } + c1 +} @end lilypond @noindent @@ -3294,9 +3382,11 @@ Internals Reference: Grace notes are musical ornaments, printed in a smaller font, that take up no additional logical time in a measure. -@lilypond[quote,relative=2,verbatim] -c4 \grace b16 a4( -\grace { b16 c16 } a2) +@lilypond[quote,verbatim] +\relative { + c''4 \grace b16 a4( + \grace { b16 c16 } a2) +} @end lilypond There are three other types of grace notes possible; the @@ -3308,37 +3398,38 @@ like the @emph{acciaccatura} but without the slur, so as to place it between notes that are slurred themselves, using the @code{\slashedGrace} function. -@lilypond[quote,relative=2,verbatim] -\acciaccatura d8 c4 -\appoggiatura e8 d4 -\acciaccatura { g16 f } e2 -\slashedGrace a,8 g4 -\slashedGrace b16 a4( -\slashedGrace b8 a2) +@lilypond[quote,verbatim] +\relative { + \acciaccatura d''8 c4 + \appoggiatura e8 d4 + \acciaccatura { g16 f } e2 + \slashedGrace a,8 g4 + \slashedGrace b16 a4( + \slashedGrace b8 a2) +} @end lilypond The placement of grace notes is synchronized between different staves. In the following example, there are two sixteenth grace notes for every eighth grace note -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Staff { e2 \grace { c16 d e f } e2 } - \new Staff { c2 \grace { g8 b } c2 } + \new Staff \relative { e''2 \grace { c16 d e f } e2 } + \new Staff \relative { c''2 \grace { g8 b } c2 } >> @end lilypond @cindex grace notes, following @funindex \afterGrace -@funindex afterGrace If you want to end a note with a grace, use the @code{\afterGrace} command. It takes two arguments: the main note, and the grace notes following the main note. -@lilypond[quote,verbatim,relative=2] -c1 \afterGrace d1 { c16[ d] } c1 +@lilypond[quote,verbatim] +\relative { c''1 \afterGrace d1 { c16[ d] } c1 } @end lilypond This will put the grace notes after a space lasting 3/4 of the @@ -3347,18 +3438,18 @@ setting @code{afterGraceFraction}. The following example shows the results from setting the space at the default, at 15/16, and finally at 1/2 of the main note. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - \new Staff { - c1 \afterGrace d1 { c16[ d] } c1 + \new Staff \relative { + c''1 \afterGrace d1 { c16[ d] } c1 } - \new Staff { + \new Staff \relative { #(define afterGraceFraction (cons 15 16)) - c1 \afterGrace d1 { c16[ d] } c1 + c''1 \afterGrace d1 { c16[ d] } c1 } - \new Staff { + \new Staff \relative { #(define afterGraceFraction (cons 1 2)) - c1 \afterGrace d1 { c16[ d] } c1 + c''1 \afterGrace d1 { c16[ d] } c1 } >> @end lilypond @@ -3367,10 +3458,10 @@ The space between the main note and the grace note may also be specified using spacers. The following example places the grace note after a space lasting 7/8 of the main note. -@lilypond[quote,verbatim,relative=2] -\new Voice { +@lilypond[quote,verbatim] +\new Voice \relative { << - { d1^\trill_( } + { d''1^\trill_( } { s2 s4. \grace { c16 d } } >> c1) @@ -3389,11 +3480,11 @@ the grace expression. The overrides should also be reverted inside the grace expression. Here, the grace note's default stem direction is overridden and then reverted. -@lilypond[quote,verbatim,relative=2] -\new Voice { +@lilypond[quote,verbatim] +\new Voice \relative { \acciaccatura { \stemDown - f16-> + f''16-> \stemNeutral } g4 e c2 @@ -3458,10 +3549,10 @@ notation, such as key signatures, bar lines, etc., are also synchronized. Take care when you mix staves with grace notes and staves without, for example, -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Staff { e4 \bar ".|:" \grace c16 d2. } - \new Staff { c4 \bar ".|:" d2. } + \new Staff \relative { e''4 \bar ".|:" \grace c16 d2. } + \new Staff \relative { c''4 \bar ".|:" d2. } >> @end lilypond @@ -3469,39 +3560,18 @@ staves without, for example, This can be remedied by inserting grace skips of the corresponding durations in the other staves. For the above example -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Staff { e4 \bar ".|:" \grace c16 d2. } - \new Staff { c4 \bar ".|:" \grace s16 d2. } + \new Staff \relative { e''4 \bar ".|:" \grace c16 d2. } + \new Staff \relative { c''4 \bar ".|:" \grace s16 d2. } >> @end lilypond -The use of grace notes within voice contexts confuses the way the voice -is typeset. This can be overcome by inserting a rest or note between the -voice command and the grace note. - -@lilypond[quote,verbatim] -accMusic = { - \acciaccatura { f8 } e8 r8 \acciaccatura { f8 } e8 r4 -} - -\new Staff { - << - \new Voice { - \relative c'' { - r8 r8 \voiceOne \accMusic \oneVoice r8 | - r8 \voiceOne r8 \accMusic \oneVoice r8 | - } - } - \new Voice { - \relative c' { - s8 s8 \voiceTwo \accMusic \oneVoice s8 | - s8 \voiceTwo r8 \accMusic \oneVoice s8 | - } - } - >> -} -@end lilypond +Please make sure that you use the @code{\grace} command for the +spacer part, even if the visual part uses @code{\acciaccatura} or +@code{\appoggiatura} because otherwise an ugly slur fragment will +be printed, connecting the invisible grace note with the following +note. Grace sections should only be used within sequential music expressions. Nesting or juxtaposing grace sections is not supported, and might @@ -3550,8 +3620,8 @@ functions take a defined piece of music as an argument and generate a multi-measure rest or @code{\skip} exactly as long as the piece. @lilypond[verbatim,quote] -MyCadenza = \relative c' { - c4 d8 e f g g4 +MyCadenza = \relative { + c'4 d8 e f g g4 f2 g4 g } @@ -3635,9 +3705,9 @@ advanced by 1/8 to 5/8, shortening that bar by 1/8. The next bar line then falls at 9/8 rather than 5/4. @lilypond[quote,verbatim] -\new Voice \relative c' { +\new Voice \relative { \set Timing.measureLength = #(ly:make-moment 5/4) - c1 c4 | + c'1 c4 | c1 c4 | c4 c \set Timing.measurePosition = #(ly:make-moment 5/8) diff --git a/Documentation/notation/simultaneous.itely b/Documentation/notation/simultaneous.itely index 4725ecf0de..a29dd9c4ae 100644 --- a/Documentation/notation/simultaneous.itely +++ b/Documentation/notation/simultaneous.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.28" +@c \version "2.19.29" @node Simultaneous notes @@ -52,32 +52,42 @@ A chord is formed by enclosing a set of pitches between @code{<} and @code{>}. A chord may be followed by a duration just like simple notes. -@lilypond[verbatim,quote,relative=2] -1 2 4 8. 16 +@lilypond[verbatim,quote] +\relative { + 1 2 4 8. 16 +} @end lilypond Chords may also be followed by articulations, again just like simple notes. -@lilypond[verbatim,quote,relative=2] -1\fermata 2-> 4\prall 8.^! 16-. +@lilypond[verbatim,quote] +\relative { + 1\fermata 2-> 4\prall 8.^! 16-. +} @end lilypond The notes within the chord themselves can also be followed by articulation and ornamentation. -@lilypond[verbatim,quote,relative=2] -1 c-^ e>2 4 -8. 16 +@lilypond[verbatim,quote] +\relative { + 1 c-^ e>2 4 + 8. 16 +} @end lilypond -However some notation, such as dynamics, hairpins and slurs must be -attached to the chord, rather than notes within the chord, otherwise -they will not print. +However some notation, such as dynamics and hairpins must be +attached to the chord rather than to notes within the chord, +otherwise they will not print. Other notation like fingerings and +slurs will get placed markedly different when attached to notes +within a chord rather than to whole chords or single notes. -@lilypond[verbatim,quote,relative=2] -1 \f ( ) -\< \! +@lilypond[verbatim,quote] +\relative { + 1 \f ( ) + \< \! +} @end lilypond @cindex chords, empty @@ -90,10 +100,12 @@ happen at the same musical time as the next following note or chord and be combined with them (for more complex possibilities of combining such elements, see @ref{Simultaneous expressions}): -@lilypond[verbatim,quote,relative=2] -\grace { g8( a b } -<> ) \p \< -. -\markup \italic "sempre staccato" -\repeat unfold 4 { c4 e } c1\f +@lilypond[verbatim,quote] +\relative { + \grace { g'8( a b } + <> ) \p \< -. -\markup \italic "sempre staccato" + \repeat unfold 4 { c4 e } c1\f +} @end lilypond @cindex relative pitch, chords @@ -106,8 +118,10 @@ pitch of the last note that came before the chord. All remaining notes in the chord are relative to the note that came before it @emph{within the same chord}. -@lilypond[verbatim,quote,relative=2] -1 +@lilypond[verbatim,quote] +\relative { + 1 +} @end lilypond For more information about chords, see @ref{Chord notation}. @@ -152,40 +166,49 @@ enharmonic transcription of one or more pitches, @node Chord repetition @unnumberedsubsubsec Chord repetition -@cindex Chord, repetition +@cindex chord, repetition @cindex repetition, using @code{q} +@cindex @code{q}, chord repetition In order to save typing, a shortcut can be used to repeat the preceding chord. The chord repetition symbol is @code{q}: -@lilypond[verbatim,quote,relative=2] -1 q 2 q +@lilypond[verbatim,quote] +\relative { + 1 q 2 q +} @end lilypond As with regular chords, the chord repetition symbol can be used with durations, articulations, markups, slurs, beams, etc. as only the pitches of the previous chord are duplicated. -@lilypond[verbatim,quote,relative=2] -1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +@lilypond[verbatim,quote] +\relative { + 1\p^"text" q2\<( q8)[-! q8.]\! q16-1-2-3 q8\prall +} @end lilypond The chord repetition symbol always remembers the last instance of a chord so it is possible to repeat the most recent chord even if other non-chorded notes or rests have been added since. -@lilypond[verbatim,quote,relative=2] -1 c'4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1 c'4 q2 r8 q8 | + q2 c, | +} @end lilypond However, the chord repetition symbol does not retain any dynamics, articulation or ornamentation within, or attached to, the previous chord. -@lilypond[verbatim,quote,relative=2] -1\sfz c'4 q2 r8 q8 | -q2 c, | +@lilypond[verbatim,quote] +\relative { + 1\sfz c'4 q2 r8 q8 | + q2 c, | +} @end lilypond To have some of them retained, the @code{\chordRepeats} function can be @@ -194,9 +217,9 @@ be called explicitly with an extra argument specifying a list of present on the @code{q} chord itself. @lilypond[verbatim,quote] -\relative c'' { +\relative { \chordRepeats #'(articulation-event) - { 1\sfz c'4 q2 r8 q8-. } | + { 1\sfz c'4 q2 r8 q8-. } | q2 c, | } @end lilypond @@ -213,14 +236,12 @@ In that case, the whole content of the inner @code{\relative} does not affect the outer one; hence the different octave entry of the final note in this example. -@c Without \new Voice, implicit voice creation does the dumbest thing. @lilypond[verbatim,quote] -\new Voice -\relative c'' { +\relative { \chordRepeats #'(articulation-event) - \relative c'' - { 1\sfz c'4 q2 r8 q8-. } | - q2 c | + \relative + { 1\sfz c'4 q2 r8 q8-. } | + q2 c'' | } @end lilypond @@ -250,15 +271,19 @@ expression are placed on separate staves. The following examples show simultaneous expressions on one staff: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Voice { % explicit single voice - << { a4 b g2 } { d4 g c,2 } >> + << \relative { a'4 b g2 } + \relative { d'4 g c,2 } >> } @end lilypond -@lilypond[quote,verbatim,relative=2] -% single first note -a << { a4 b g } { d4 g c, } >> +@lilypond[quote,verbatim] +\relative { + % single first note + a' << \relative { a'4 b g } + \relative { d'4 g c, } >> +} @end lilypond This can be useful if the simultaneous sections have identical @@ -267,8 +292,10 @@ the same stem will cause errors. Notes, articulations, and property changes in a @emph{single} @samp{Voice} are collected and engraved in musical order: -@lilypond[quote,verbatim,relative=2] -4-. <>-. << c a >> << { c-. } { a s-. } >> +@lilypond[quote,verbatim] +\relative { + 4-. <>-. << c a >> << { c-. } { a s-. } >> +} @end lilypond Multiple stems or beams or different note durations or properties at @@ -277,24 +304,23 @@ the same musical time require the use of multiple voices. The following example shows how simultaneous expressions can generate multiple staves implicitly: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] % no single first note -<< { a4 b g2 } { d4 g2 c,4 } >> +<< \relative { a'4 b g2 } + \relative { d'4 g2 c,4 } >> @end lilypond Here different rhythms cause no problems because they are interpreted in different voices. -@cindex collisions, clashing note columns @cindex collisions, ignoring @knownissues -If notes from two or more voices, with stems in the same direction, are -placed at the same position on the staff and have no shift (or have the -same shift specified), the message: +If notes from two or more voices, with no shifts specified, +have stems in the same direction, the message @example -warning: ignoring too many clashing note columns +warning: This voice needs a \voiceXx or \shiftXx setting @end example will appear during compilation. This message can be suppressed by: @@ -315,15 +341,14 @@ collision resolution whatsover and may have other unintended effects @cindex note cluster @funindex \makeClusters -@funindex makeClusters A cluster indicates a continuous range of pitches to be played. They can be denoted as the envelope of a set of notes. They are entered by applying the function @code{\makeClusters} to a sequence of chords, e.g., -@lilypond[quote,relative=2,verbatim] -\makeClusters { 2 } +@lilypond[quote,verbatim] +\relative \makeClusters { 2 } @end lilypond Ordinary notes and clusters can be put together in the same staff, @@ -378,23 +403,21 @@ multiple staves. @cindex lyrics assigned to one voice @funindex \voiceOne -@funindex voiceOne @funindex \voiceOne ... \voiceFour @funindex Voice @funindex \oneVoice -@funindex oneVoice @subsubsubheading Explicitly instantiating voices The basic structure needed to achieve multiple independent voices in a single staff is illustrated in the following example: -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] \new Staff << \new Voice = "first" - { \voiceOne r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { \voiceOne r8 r16 g'' e8. f16 g8[ c,] f e16 d } \new Voice= "second" - { \voiceTwo d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { \voiceTwo d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @@ -428,10 +451,10 @@ the angle brackets are assigned to distinct temporary voices. This allows lyrics to be assigned to one continuing voice before, during and after a polyphonic section: -@lilypond[quote, verbatim, relative=2] -<< +@lilypond[quote,verbatim] +\relative << \new Voice = "melody" { - a4 + a'4 << { \voiceOne @@ -467,11 +490,11 @@ are created implicitly and are given the fixed names @code{"1"}, The first example could be typeset as follows: -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 r16 g e8. f16 g8[ c,] f e16 d } + \relative { r8 r16 g'' e8. f16 g8[ c,] f e16 d } \\ - { d16 c d8~ d16 b c8~ c16 b c8~ c16 b8. } + \relative { d''16 c d8~ 16 b c8~ 16 b c8~ 16 b8. } >> @end lilypond @@ -486,13 +509,13 @@ therefore we enter it in the third place, so it becomes voice three, which has the stems up as desired. Spacer rests are used to avoid printing doubled rests. -@lilypond[quote,relative=3,verbatim] +@lilypond[quote,verbatim] << - { r8 g g g g f16 ees f8 d } + \relative { r8 g'' g g g f16 ees f8 d } \\ - { ees,8 r ees r d r d r } + \relative { ees'8 r ees r d r d r } \\ - { d'8 s c s bes s a s } + \relative { d''8 s c s bes s a s } >> @end lilypond @@ -546,10 +569,10 @@ that have the same rhythm, we can combine them into a single @code{Voice} context, thus forming chords. To achieve this, enclose them in a simple simultaneous music construct within an explicit voice: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] \new Voice << - { e4 f8 d e16 f g8 d4 } - { c4 d8 b c16 d e8 b4 } + \relative { e''4 f8 d e16 f g8 d4 } + \relative { c''4 d8 b c16 d e8 b4 } >> @end lilypond @@ -594,15 +617,15 @@ Snippets: Voices may be given distinct colors and shapes, allowing them to be easily identified: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { \voiceOneStyle d4 c2 b4 } + \relative { \voiceOneStyle d''4 c2 b4 } \\ - { \voiceTwoStyle e,2 e } + \relative { \voiceTwoStyle e'2 e } \\ - { \voiceThreeStyle b2. c4 } + \relative { \voiceThreeStyle b2. c4 } \\ - { \voiceFourStyle g'2 g } + \relative { \voiceFourStyle g'2 g } >> @end lilypond @@ -641,21 +664,13 @@ Snippets: @cindex voices, multiple @cindex shift rest, automatic @funindex \shiftOn -@funindex shiftOn @funindex \shiftOnn -@funindex shiftOnn @funindex \shiftOnnn -@funindex shiftOnnn @funindex \shiftOff -@funindex shiftOff @funindex \mergeDifferentlyDottedOn -@funindex mergeDifferentlyDottedOn @funindex \mergeDifferentlyDottedOff -@funindex mergeDifferentlyDottedOff @funindex \mergeDifferentlyHeadedOn -@funindex mergeDifferentlyHeadedOn @funindex \mergeDifferentlyHeadedOff -@funindex mergeDifferentlyHeadedOff The note heads of notes in different voices with the same pitch, same note head and opposite stem direction are automatically @@ -665,18 +680,20 @@ are shifted vertically. The following example shows three different circumstances, on beats 1 and 3 in bar 1 and beat 1 in bar 2, where the automatic merging fails. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { - c8 d e d c d c4 + \relative { + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -684,19 +701,21 @@ in bar 2, where the automatic merging fails. Notes with different note heads may be merged as shown below. In this example the note heads on beat 1 of bar 1 are now merged: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -707,20 +726,22 @@ to tell them apart. Note heads with different dots as shown in beat 3 of bar 1 may be also be merged: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -735,21 +756,23 @@ merged. Here, @code{\shiftOn} is applied to move the top @notation{g} out of the column, and @code{\mergeDifferentlyHeadedOn} then works properly. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - { + \relative { \mergeDifferentlyHeadedOn \mergeDifferentlyDottedOn - c8 d e d c d c4 + c''8 d e d c d c4 \shiftOn g'2 fis - } \\ { - c2 c8. b16 c4 + } \\ + \relative { + c''2 c8. b16 c4 e,2 r - } \\ { + } \\ + \relative { \oneVoice s1 - e8 a b c d2 + e'8 a b c d2 } >> @end lilypond @@ -777,10 +800,10 @@ of voices in your input file should not be the same as the vertical order of voices on the staff!} @lilypond[quote,verbatim] -\new Staff \relative c'' { +\new Staff \relative { %% abbreviated entry << - { f2 } % 1: highest + { f''2 } % 1: highest \\ { g,2 } % 2: lowest \\ @@ -849,11 +872,11 @@ Internals Reference: Using @code{\override NoteColumn.ignore-collision = ##t} will cause differently headed notes in different voices to merge incorrectly. -@lilypond[quote,relative=1,verbatim] +@lilypond[quote,verbatim,fragment] \mergeDifferentlyHeadedOn -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> \override NoteColumn.ignore-collision = ##t -<< { c16 a' b a } \\ { c,2 } >> +<< \relative { c'16 a' b a } \\ \relative { c'2 } >> @end lilypond @ignore @@ -873,7 +896,6 @@ are at the same time differently dotted are not clear. @cindex a due part @cindex solo part @funindex \partcombine -@funindex partcombine Automatic part combining is used to merge two separate parts of music onto a single staff. This can be especially helpful when typesetting @@ -895,17 +917,17 @@ accordingly. The same variables are used for the independent parts and the combined staff. @lilypond[quote,verbatim] -instrumentOne = \relative c' { - c4 d e f | +instrumentOne = \relative { + c'4 d e f | R1 | d'4 c b a | b4 g2 f4 | e1 | } -instrumentTwo = \relative g' { +instrumentTwo = \relative { R1 | - g4 a b c | + g'4 a b c | d4 c b a | g4 f( e) d | e1 | @@ -928,6 +950,37 @@ and second parts get marked with @qq{Solo} and @qq{Solo II}, respectively. The unison (@notation{a due}) parts are marked with the text @qq{a2}. +By default, the partcombiner merges two notes of the same pitch as an +@notation{a due} note, combines notes with the same +rhythm less than a ninth apart as chords and separates notes more than +a ninth apart (or when the voices cross) into +separate voices. This can be overridden with an optional argument of a pair +of numbers after the @code{\partcombine} command: the first specifies +the interval where notes start to be combined (the default is zero) and the +second where the notes are split into separate voices. Setting the second +argument to zero means that the partcombiner splits notes with an interval of +a second or more, setting it to one splits notes of a third or more, and so on. + +@lilypond[quote,verbatim] +instrumentOne = \relative { + a4 b c d | + e f g a | + b c d e | +} + +instrumentTwo = \relative { + c'4 c c c | + c c c c | + c c c c | +} + +<< + \new Staff \partcombine \instrumentOne \instrumentTwo + \new Staff \partcombine #'(2 . 3) \instrumentOne \instrumentTwo +>> +@end lilypond + + Both arguments to @code{\partcombine} will be interpreted as separate @code{Voice} contexts, so if the music is being specified in relative mode then @emph{both} parts must contain a @code{\relative} function, @@ -945,54 +998,47 @@ effect on the pitches of @code{@var{musicexpr1}} or @code{@var{musicexpr2}}. @funindex \partcombineChords -@funindex partcombineChords @funindex \partcombineApart -@funindex partcombineApart @funindex \partcombineUnisono -@funindex partcombineUnisono @funindex \partcombineSoloI -@funindex partcombineSoloI @funindex \partcombineSoloII -@funindex partcombineSoloII @funindex \partcombineAutomatic -@funindex partcombineAutomatic In professional scores, voices are often kept apart from each other for long passages of music even if some of the notes are the same in both voices, and could just as easily be printed as unison. Combining notes into a chord, or showing one voice as solo is, therefore, not ideal as the @code{\partcombine} function considers each note separately. In this -case the @code{\partcombine} function can be overriden with the -following commands: - -Commands ending in @code{@dots{}Once} apply only to the next note in the -music expression. +case the @code{\partcombine} function can be overridden with one of the +following commands. All of the commands may be preceded with +@code{\once} in order to have them only apply to the next note in +the music expression. @itemize @item -@code{\partcombineApart} and @code{\partcombineApartOnce} keep the +@code{\partcombineApart} keeps the notes as two separate voices, even if they can be combined into a chord or unison. @item -@code{\partcombineChords} and @code{\partcombineChordsOnce} combine the +@code{\partcombineChords} combines the notes into a chord. @item -@code{\partcombineUnisono} and @code{\partcombineUnisonoOnce} combine +@code{\partcombineUnisono} combines both voices as @qq{unison}. @item -@code{\partcombineSoloI} and @code{\partcombineSoloIOnce} print only -voice one, and mark it as a @qq{Solo}. +@code{\partcombineSoloI} prints only +voice one, and marks it as a @qq{Solo}. @item -@code{\partcombineSoloII} or @code{\partcombineSoloIIOnce} print only -voice two and mark it as a @qq{Solo}. +@code{\partcombineSoloII} prints only +voice two and marks it as a @qq{Solo}. @item -@code{\partcombineAutomatic} and @code{\partcombineAutomaticOnce} end -the functions of the commands above, and revert back to the standard +@code{\partcombineAutomatic} ends +the functions of the commands above, and reverts back to the standard @code{\partcombine} functionality. @end itemize @@ -1002,11 +1048,11 @@ instrumentOne = \relative c' { \partcombineAutomatic e2^"auto" e | \partcombineChords e'2^"chord" e | \partcombineAutomatic c2^"auto" c | - \partcombineApart c2^"apart" \partcombineChordsOnce e^"chord once" | + \partcombineApart c2^"apart" \once \partcombineChords e^"chord once" | c2 c | } -instrumentTwo = \relative c' { - c2 c | +instrumentTwo = \relative { + c'2 c | e2 e | a,2 c | c2 c' | @@ -1095,7 +1141,6 @@ Refer also to @emph{Known issues and warnings} when using @cindex interleaved music @cindex parallel music @funindex \parallelMusic -@funindex parallelMusic Music for multiple parts can be interleaved in input code. The function @code{\parallelMusic} accepts a list with the names of a @@ -1111,12 +1156,12 @@ be of the same length.} \parallelMusic #'(voiceA voiceB voiceC) { % Bar 1 r8 g'16 c'' e'' g' c'' e'' r8 g'16 c'' e'' g' c'' e'' | - r16 e'8.~ e'4 r16 e'8.~ e'4 | + r16 e'8.~ 4 r16 e'8.~ 4 | c'2 c'2 | % Bar 2 r8 a'16 d'' f'' a' d'' f'' r8 a'16 d'' f'' a' d'' f'' | - r16 d'8.~ d'4 r16 d'8.~ d'4 | + r16 d'8.~ 4 r16 d'8.~ 4 | c'2 c'2 | } @@ -1136,12 +1181,12 @@ note in the input -- in other words, relative notes for \parallelMusic #'(voiceA voiceB voiceC) { % Bar 1 r8 g16 c e g, c e r8 g,16 c e g, c e | - r16 e8.~ e4 r16 e8.~ e4 | + r16 e8.~ 4 r16 e8.~ 4 | c2 c | % Bar 2 r8 a,16 d f a, d f r8 a,16 d f a, d f | - r16 d8.~ d4 r16 d8.~ d4 | + r16 d8.~ 4 r16 d8.~ 4 | c2 c | } diff --git a/Documentation/notation/spacing.itely b/Documentation/notation/spacing.itely index 7f3a50f1f3..bd6d4d4b78 100644 --- a/Documentation/notation/spacing.itely +++ b/Documentation/notation/spacing.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.22" @ignore GDP TODO list @@ -21,30 +21,6 @@ Negative numbers are allowed: > and prints page number -1 on the second page, for example. -In 5.2.1 the @refbugs (line 495 in spacing.itely on master) it -states: - -"@code{layout-set-staff-size} does not change the distance between -the -staff lines." - -Could we add a sentence: -"Use instead the pair fontSize = #@var{N} - \override StaffSymbol.staff-space = #(magstep -@var{N}) -inside the Staff context to change the size of the font and the -distance between -staff lines accordingly." - -Actually I found, that the @internalsref{StaffSymbol} at line 481 -sends to an incomplete -documentation. The property staff-space is not explained here. I -thought Y-extent might be of -help, but it is in turn explained by x-space which again is -missing from the list. Who has the -knowledge to fix this? - - Clarify http://code.google.com/p/lilypond/issues/detail?id=68 @@ -532,7 +508,7 @@ redefines the variable: @example \paper @{ - system-system-spacing #'basic-distance = #8 + system-system-spacing.basic-distance = #8 score-system-spacing = #'((basic-distance . 12) (minimum-distance . 6) @@ -658,14 +634,27 @@ Also see @code{check-consistency}. @item line-width @funindex line-width -The horizontal extent of the staff lines in unindented, non-ragged -systems, equal to -@code{(paper-width@tie{}@minus{}@tie{}left-margin@tie{}@minus{}@tie{}right-margin)} -when unset. If @code{line-width} is set, and both -@code{left-margin} and @code{right-margin} are unset, then the -margins will be updated to center the systems on the page -automatically. Also see @code{check-consistency}. This variable -can also be set in a @code{\layout} block. +When specified in a @code{\paper} block this defines the horizontal +extent available for the staff lines in un-indented systems. If left +unspecified, the paper's @code{line-width} is determined from +@code{(paper-width@tie{}@minus{}@tie{}left-margin@tie{}@minus{}@tie{}right-margin)}. +If the paper's @code{line-width} is specified, and both +@code{left-margin} and @code{right-margin} are not, then the margins +will be updated to center the systems on the page automatically. Also +see @code{check-consistency}. + +@code{line-width}s for individual scores can be specified in the +scores' @code{\layout} blocks. These values control the width of the +lines produced on a score-by-score basis. If @code{line-width} is not +specified for a score, it defaults to the paper's @code{line-width}. +Setting a score's @code{line-width} has no effect on the paper margins. +Staff lines, of a length determined by the score's @code{line-width}, +are left-aligned within the paper area defined by the paper's +@code{line-width}. If the score and paper @code{line-width}s are equal, +the staff lines will extend exactly from the left margin to the right +margin, but if the score's @code{line-width} is greater than the +paper's @code{line-width} the staff lines will run over into the right +margin. @item left-margin @funindex left-margin @@ -698,12 +687,12 @@ and the systems are consequently centered on the page. Also see @item check-consistency @funindex check-consistency -If set to true, print a warning if @code{left-margin}, -@code{line-width}, and @code{right-margin} do not exactly add up -to @code{paper-width}, and replace each of these (except -@code{paper-width}) with its default value (scaled to the paper -size if necessary). If set to false, ignore any inconsistencies -and allow systems to run off the edge of the page. +If this is true (the default value), print a warning if +@code{left-margin}, @code{line-width}, and @code{right-margin} do not +exactly add up to @code{paper-width}, and replace each of these +(except @code{paper-width}) with their default values (scaled to the +paper size if necessary). If set to false, ignore any +inconsistencies and allow systems to run off the edge of the page. @item ragged-right @funindex ragged-right @@ -810,16 +799,21 @@ separators) are shifted to the right. Default: @code{0.0\mm}. The level of indentation for the first system in a score. If the paper size is modified, this dimension's default value is scaled -accordingly. This variable can also be set in a @code{\layout} -block. +accordingly. The space within @code{line-width} available for +the first system is reduced by this amount. @code{indent} may also +be specified in @code{\layout} blocks to set indents on a +score-by-score basis. @item short-indent @funindex short-indent The level of indentation for all systems in a score besides the first system. If the paper size is modified, this dimension's -default value is scaled accordingly. This variable can also be -set in a @code{\layout} block. +default value is scaled accordingly. The space within +@code{line-width} available for systems other than the first is +reduced by this amount. @code{short-indent} may also be specified in +@code{\layout} blocks to set short indents on a score-by-score +basis. @end table @@ -898,8 +892,8 @@ Default values not listed here are defined in The page-breaking algorithm to use. Choices are @code{ly:minimal-breaking}, @code{ly:page-turn-breaking}, -@code{ly:one-line-breaking} and @code{ly:optimal-breaking} -(the default). +@code{ly:one-line-breaking}, @code{ly:one-line-auto-height-breaking}, +and @code{ly:optimal-breaking} (the default). @item page-breaking-system-system-spacing @funindex page-breaking-system-system-spacing @@ -1015,6 +1009,14 @@ If set to true, a page number is printed on the first page. If set to false, page numbers are not printed. +@cindex page numbers in roman numerals +@item page-number-type +@funindex page-number-type + +The type of numerals used for page numbers. Choices include +@code{roman-lower}, @code{roman-upper} and @code{arabic}. +Default: @code{'arabic}. + @end table @seealso @@ -1065,7 +1067,7 @@ sensible default, for example: tagline = ##f } \score { - \relative c'' { c1 \break c1 \break c1 } + \relative { c''1 \break c1 \break c1 } } } @end lilypond @@ -1120,8 +1122,10 @@ The @code{layout-set-staff-size} function is discussed in the next section, @ref{Setting the staff size}. Context modifications are discussed in a separate chapter; see @ref{Modifying context plug-ins} and -@ref{Changing context default settings}. The @code{\paper} -variables that can appear in a @code{\layout} block are: +@ref{Changing context default settings}. + +The @code{\paper} variables that can appear in a @code{\layout} +block, with default values taken from the @code{\paper} block are: @itemize @@ -1267,92 +1271,101 @@ Snippets: @cindex font size, setting @cindex staff size, setting @funindex layout file +@funindex magnification->font-size +@funindex magstep +@funindex set-global-staff-size +@funindex layout-set-staff-size -The default @strong{staff size} is set to 20 points. -This may be changed in two ways: +The default @strong{staff size} is 20 points, which corresponds to +a staff height of 7.03mm (one point is equal to 100/7227 of an +inch, or 2540/7227 mm). The staff size may be changed in three +ways: -To set the staff size globally for all scores in a file (or -in a @code{book} block, to be precise), use @code{set-global-staff-size}. +@enumerate + +@item +To set the staff size globally for all scores in a file (or in a +@code{\book} block, to be precise), use +@code{set-global-staff-size}: @example #(set-global-staff-size 14) @end example @noindent -This sets the global default size to 14pt staff height and scales all -fonts accordingly. +The above example sets the global default staff size to 14pt +(4.92mm) and scales all fonts accordingly. + +@item +To set the staff size for a single score within a book, use +@code{layout-set-staff-size} inside that score's @code{\layout} +block: -To set the staff size individually for each score, use @example -\score@{ +\score @{ @dots{} \layout @{ - #(layout-set-staff-size 15) + #(layout-set-staff-size 14) @} @} @end example +@item +To set the staff size for a single staff within a system, use the +@code{\magnifyStaff} command. For example, traditionally engraved +chamber music scores with piano often used 7mm piano staves while +the other staves were typically between 3/5 and 5/7 as large +(between 60% and 71%). To achieve the 5/7 proportion, use: + +@example +\score @{ + << + \new Staff \with @{ + \magnifyStaff #5/7 + @} @{ @dots{} @} + \new PianoStaff @{ @dots{} @} + >> +@} +@end example + +If you happen to know which @code{fontSize} you wish to use, you +could use the following form: + +@example +\score @{ + << + \new Staff \with @{ + \magnifyStaff #(magstep -3) + @} @{ @dots{} @} + \new PianoStaff @{ @dots{} @} + >> +@} +@end example + +To emulate the look of traditional engraving, it is best to avoid +reducing the thickness of the staff lines. + +@end enumerate + + +@subheading Automatic font weight at different sizes + The Feta font provides musical symbols at eight different sizes. Each font is tuned for a different staff size: at a smaller size the font becomes heavier, to match the relatively heavier staff lines. The recommended font sizes are listed in the following table: -@quotation @multitable @columnfractions .15 .2 .22 .2 - -@item @b{font name} -@tab @b{staff height (pt)} -@tab @b{staff height (mm)} -@tab @b{use} - -@item feta11 -@tab 11.22 -@tab 3.9 -@tab pocket scores - -@item feta13 -@tab 12.60 -@tab 4.4 -@tab - -@item feta14 -@tab 14.14 -@tab 5.0 -@tab - -@item feta16 -@tab 15.87 -@tab 5.6 -@tab - -@item feta18 -@tab 17.82 -@tab 6.3 -@tab song books - -@item feta20 -@tab 20 -@tab 7.0 -@tab standard parts - -@item feta23 -@tab 22.45 -@tab 7.9 -@tab - -@item feta26 -@tab 25.2 -@tab 8.9 -@tab -@c modern rental material? - +@item @b{font name} @tab @b{staff height (pt)} @tab @b{staff height (mm)} @tab @b{use} +@item feta11 @tab 11.22 @tab 3.9 @tab pocket scores +@item feta13 @tab 12.60 @tab 4.4 @tab +@item feta14 @tab 14.14 @tab 5.0 @tab +@item feta16 @tab 15.87 @tab 5.6 @tab +@item feta18 @tab 17.82 @tab 6.3 @tab song books +@item feta20 @tab 20 @tab 7.0 @tab standard parts +@item feta23 @tab 22.45 @tab 7.9 @tab +@item feta26 @tab 25.2 @tab 8.9 @tab @c modern rental material? @end multitable -@end quotation - -These fonts are available in any sizes. The context property -@code{fontSize} and the layout property @code{staff-space} (in -@rinternals{StaffSymbol}) can be used to tune the size for individual -staves. The sizes of individual staves are relative to the global size. @seealso Notation Reference: @@ -1372,76 +1385,96 @@ staff lines. @menu * Line breaking:: * Page breaking:: -* Optimal page breaking:: -* Optimal page turning:: -* Minimal page breaking:: -* One-line page breaking:: -* Explicit breaks:: -* Using an extra voice for breaks:: @end menu @node Line breaking @subsection Line breaking -@cindex line breaks +@funindex \break +@funindex \noBreak +@funindex \autoBreaksOff +@funindex \autoBreaksOn +@funindex \autoLineBreaksOff +@funindex \autoLineBreaksOn +@cindex manual line breaks @cindex breaking lines -Line breaks are normally determined automatically. They are chosen -so that lines look neither cramped nor loose, and consecutive -lines have similar density. +Line breaks are normally determined automatically. They are +chosen so that lines look neither cramped nor loose, and +consecutive lines have similar density. To manually force a line break at a bar line, use the @code{\break} command: -@lilypond[quote,ragged-right,relative=2,verbatim] -c4 c c c | \break -c4 c c c | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c c | \break + c4 c c c | +} @end lilypond -By default, a @code{\break} in the middle of a measure is ignored, -and a warning is printed. To force a line break in the middle of -a measure, add an invisible bar line with @w{@samp{\bar ""}}: +By default, a @code{\break} command inserted in the @q{middle} of a +measure will be ignored (and a warning message will be output during the +compilation of the LilyPond file). Adding an invisible bar line +-- @w{@samp{\bar ""}} -- before the @code{\break} command will force the +issue: -@lilypond[quote,ragged-right,relative=2,verbatim] -c4 c c -\bar "" \break -c | -c4 c c c | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4 c c + \bar "" + \break + c | + c4 c c c | +} @end lilypond -A @code{\break} occurring at a bar line is also ignored if the -previous measure ends in the middle of a note, such as when a -tuplet begins and ends in different measures. To allow -@code{\break} commands to work in these situations, remove the -@code{Forbid_line_break_engraver} from the @code{Voice} context. -Note that manually forced line breaks have to be added in parallel -with the music: +A @code{\break} command that occurrs at a bar line will also ignored if +the previous measure ends in the middle of a note (e.g. when a tuplet +begins in one measure and ends in another). In this case remove the +@code{Forbid_line_break_engraver} from the @code{Voice} context and, +use a simultaneous music construction inserting the @code{\break} at the +appropriate place in the second @q{voice}: @lilypond[quote,ragged-right,verbatim] \new Voice \with { \remove "Forbid_line_break_engraver" -} \relative c'' { +} \relative { << - { c2. \tuplet 3/2 { c4 c c } c2. | } + { c''2. \tuplet 3/2 { c4 c c } c2. | } { s1 | \break s1 | } >> } @end lilypond -Similarly, line breaks are normally forbidden when beams cross bar -lines. This behavior can be changed by setting -@code{\override Beam.breakable = ##t}: +Similarly, by default, line breaks are ignored when beams cross bar +lines. Use the @code{\override Beam.breakable = ##t} command to force +this: -@lilypond[quote,ragged-right,relative=2,verbatim] -\override Beam.breakable = ##t -c2. c8[ c | \break -c8 c] c2. | +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + \override Beam.breakable = ##t + c2. c8[ c | \break + c8 c] c2. | +} @end lilypond -The @code{\noBreak} command forbids a line break at the bar line +The @code{\noBreak} command will prevent a line break at the bar line where it is inserted. +Within a score, automatic line breaking is prevented within music +lying between @code{\autoLineBreaksOff} and @code{\autoLineBreaksOn} +commands. If automatic page breaks should also be prevented, the +commands @code{\autoBreaksOff} and @code{\autoBreaksOn} should be +used. Manual breaks are unaffected by these commands. Note that +inhibiting automatic line breaks may cause music to run over the +right margin if it cannot all be contained within one line. + +Automatic line breaks (but not page breaks) may be enabled at single +bar lines by using @code{\once \autoLineBreaksOn} at a bar line. +This identifies a permitted rather than a forced line break. + The most basic settings influencing line spacing are @code{indent} and @code{line-width}. They are set in the @code{\layout} block. They control the indentation of the first line of music, and the @@ -1466,15 +1499,13 @@ but affects only the last line of the piece. @} @end example - - @cindex regular line breaks @cindex four bar music. -For line breaks at regular intervals use @code{\break} separated by -skips and repeated with @code{\repeat}. For example, this would -cause the following 28 measures (assuming 4/4 time) to be broken -every 4 measures, and only there: +For line breaks at regular intervals use @code{\break} separated +by skips and repeated with @code{\repeat}. For example, this +would cause the following 28 measures (assuming 4/4 time) to be +broken every 4 measures, and only there: @example << @@ -1488,15 +1519,23 @@ every 4 measures, and only there: @predefined -@funindex \break @code{\break}, -@funindex \noBreak -@code{\noBreak}. +@code{\noBreak}, +@code{\autoBreaksOff}, +@code{\autoBreaksOn}, +@code{\autoLineBreaksOff}, +@code{\autoLineBreaksOn}. @endpredefined +@snippets + +@lilypondfile[verbatim,quote,ragged-right,texidoc,doctitle] +{using-an-extra-voice-for-breaks.ly} + @seealso Notation Reference: -@ref{paper variables for line breaking,,@code{@bs{}paper} variables for line breaking}. +@ref{paper variables for line breaking} +@ref{The layout block}. Snippets: @rlsr{Spacing}. @@ -1504,20 +1543,52 @@ Snippets: Internals Reference: @rinternals{LineBreakEvent}. +@knownissues + +Placing @code{\autoLineBreaksOff} or @code{\autoBreaksOff} before +any music will cause error messages to appear. Always place these +commands after some music. + @node Page breaking @subsection Page breaking +This section describes the different page breaking methods, and +how to modify them. + +@menu +* Manual page breaking:: +* Optimal page breaking:: +* Minimal page breaking:: +* One-line page breaking:: +* One-line-auto-height page breaking:: +* Optimal page turning:: +@end menu + + +@node Manual page breaking +@unnumberedsubsubsec Manual page breaking + +@funindex \pageBreak +@funindex \noPageBreak +@funindex \autoPageBreaksOn +@funindex \autoPageBreaksOff +@cindex page breaking, manual + The default page breaking may be overridden by inserting -@code{\pageBreak} or @code{\noPageBreak} commands. These commands are -analogous to @code{\break} and @code{\noBreak}. They should be -inserted at a bar line. These commands force and forbid a page-break -from happening. Of course, the @code{\pageBreak} command also forces -a line break. +@code{\pageBreak} or @code{\noPageBreak} commands. These commands +are analogous to @code{\break} and @code{\noBreak}. They should +be inserted at a bar line. These commands force and forbid a +page-break from happening at that bar line. Of course, the +@code{\pageBreak} command also forces a line break. The @code{\pageBreak} and @code{\noPageBreak} commands may also be inserted at top-level, between scores and top-level markups. +Within a score, automatic page breaks are prevented within music +lying between @code{\autoPageBreaksOff} and @code{\autoPageBreaksOn} +commands. Manual page breaks are unaffected by these commands. + There are also analogous settings to @code{ragged-right} and @code{ragged-last} which have the same effect on vertical spacing. If @code{ragged-bottom} is set to @code{#t} the systems will not @@ -1527,11 +1598,12 @@ bottom of the final page (or the final page in each @code{\bookpart}). See @ref{Fixed vertical spacing paper variables,,Fixed vertical spacing @code{@bs{}paper} variables}. -Page breaks are computed by the @code{page-breaking} function. LilyPond -provides three algorithms for computing page breaks, -@code{ly:optimal-breaking}, @code{ly:page-turn-breaking} and -@code{ly:minimal-breaking}. The default is @code{ly:optimal-breaking}, -but the value can be changed in the @code{\paper} block: +Page breaks are computed by the @code{page-breaking} function. +LilyPond provides several algorithms for computing page breaks, +including @code{ly:optimal-breaking}, @code{ly:page-turn-breaking} and +@code{ly:minimal-breaking}. The default is +@code{ly:optimal-breaking}, but the value can be changed in the +@code{\paper} block: @example \paper @{ @@ -1541,12 +1613,12 @@ but the value can be changed in the @code{\paper} block: @funindex \bookpart -When a book has many scores and pages, the page breaking problem may be -difficult to solve, requiring large processing time and memory. To ease -the page breaking process, @code{\bookpart} blocks are used to divide -the book into several parts: the page breaking occurs separately on each -part. Different page breaking functions may also be used in different -book parts. +When a book has many scores and pages, the page breaking problem +may be difficult to solve, requiring large processing time and +memory. To ease the page breaking process, @code{\bookpart} +blocks are used to divide the book into several parts: the page +breaking occurs separately on each part. Different page breaking +functions may also be used in different book parts. @example \bookpart @{ @@ -1574,73 +1646,143 @@ book parts. @predefined -@funindex \pageBreak @code{\pageBreak}, -@funindex \noPageBreak -@code{\noPageBreak}. +@code{\noPageBreak}, +@code{\autoPageBreaksOn}, +@code{\autoPageBreaksOff}. @endpredefined @seealso Notation Reference: -@ref{paper variables for page breaking,,@code{@bs{}paper} variables for page breaking}. +@ref{paper variables for page breaking}. Snippets: @rlsr{Spacing}. +@knownissues + +The @code{\once} prefix is ineffective with @code{\autoPageBreaksOn} +and @code{\autoPageBreaksOff}. If auto page breaking is off and is +then turned on to permit a page break, it must remain on for a few +bars (the precise number of bars depends on the score) before being +turned off, else the opportunity to break the page will not be taken. @node Optimal page breaking -@subsection Optimal page breaking +@unnumberedsubsubsec Optimal page breaking @funindex ly:optimal-breaking -The @code{ly:optimal-breaking} function is LilyPond's default method of -determining page breaks. It attempts to find a page breaking that minimizes -cramping and stretching, both horizontally and vertically. Unlike -@code{ly:page-turn-breaking}, it has no concept of page turns. +The @code{ly:optimal-breaking} function is LilyPond's default +method of determining page breaks. It attempts to find a page +breaking that minimizes cramping and stretching, both horizontally +and vertically. Unlike @code{ly:page-turn-breaking}, it has no +concept of page turns. @seealso Snippets: @rlsr{Spacing}. +@node Minimal page breaking +@unnumberedsubsubsec Minimal page breaking + +@funindex ly:minimal-breaking + +The @code{ly:minimal-breaking} function performs minimal +computations to calculate the page breaking: it fills a page with +as many systems as possible before moving to the next one. Thus, +it may be preferred for scores with many pages, where the other +page breaking functions could be too slow or memory demanding, or +a lot of texts. It is enabled using: + +@example +\paper @{ + page-breaking = #ly:minimal-breaking +@} +@end example + +@seealso +Snippets: +@rlsr{Spacing}. + + +@node One-line page breaking +@unnumberedsubsubsec One-line page breaking + +@funindex ly:one-line-breaking + +The @code{ly:one-line-breaking} function is a special-purpose +page breaking algorithm that puts each score on its own page, and +on a single line. No titles or margins are typeset; only the score is +displayed. + +The page width is adjusted so that the longest score fits on +one line. In particular, @code{paper-width}, @code{line-width} +and @code{indent} variables in the @code{\paper} block are ignored, +although @code{left-margin} and @code{right-margin} are still honored. +The height of the page is left unmodified. + + +@node One-line-auto-height page breaking +@unnumberedsubsubsec One-line-auto-height page breaking + +@funindex ly:one-line-auto-height-breaking + +The @code{ly:one-line-auto-height-breaking} function works just like +@code{ly:one-line-breaking} except the page height is automatically +modified to fit the height of the music. Specifically, the +@code{paper-height} variable in the @code{\paper} block is set so that +it spans the height of the tallest score plus the @code{top-margin} and +@code{bottom-margin}. + +Note that the @code{top-system-spacing} setting will affect the +vertical position of the music. Set it to @code{##f} in a paper block +to simply place the music between the top and bottom margins. + + @node Optimal page turning -@subsection Optimal page turning +@unnumberedsubsubsec Optimal page turning @funindex ly:page-turn-breaking -Often it is necessary to find a page breaking configuration so that there is -a rest at the end of every second page. This way, the musician can turn the -page without having to miss notes. The @code{ly:page-turn-breaking} function -attempts to find a page breaking minimizing cramping and stretching, but with -the additional restriction that it is only allowed to introduce page turns -in specified places. - -There are two steps to using this page breaking function. First, you -must enable it in the @code{\paper} block, as explained in @ref{Page -breaking}. Then you must tell the function where you would like to allow -page breaks. - -There are two ways to achieve the second step. First, you can specify each -potential page turn manually, by inserting @code{\allowPageTurn} into your -input file at the appropriate places. - -If this is too tedious, you can add a @code{Page_turn_engraver} to a Staff or -Voice context. The @code{Page_turn_engraver} will scan the context for -sections without notes (note that it does not scan for rests; it scans for -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 bar line in that section, unless -there is a @q{special} bar line (such as a double bar), in which case the -@code{\allowPageTurn} will be inserted at the final @q{special} bar line in -the section. +Often it is necessary to find a page breaking configuration so +that there is a rest at the end of every second page. This way, +the musician can turn the page without having to miss notes. The +@code{ly:page-turn-breaking} function attempts to find a page +breaking minimizing cramping and stretching, but with the +additional restriction that it is only allowed to introduce page +turns in specified places. + +There are two steps to using this page breaking function. First, +you must enable it in the @code{\paper} block, as explained in +@ref{Page breaking}. Then you must tell the function where you +would like to allow page breaks. + +There are two ways to achieve the second step. First, you can +specify each potential page turn manually, by inserting +@code{\allowPageTurn} into your input file at the appropriate +places. + +If this is too tedious, you can add a @code{Page_turn_engraver} to +a Staff or Voice context. The @code{Page_turn_engraver} will scan +the context for sections without notes (note that it does not scan +for rests; it scans for 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 bar line in that section, unless there is a @q{special} +bar line (such as a double bar), in which case the +@code{\allowPageTurn} will be inserted at the final @q{special} +bar line in the section. @funindex minimumPageTurnLength The @code{Page_turn_engraver} reads the context property -@code{minimumPageTurnLength} to determine how long a note-free section must -be before a page turn is considered. The default value for -@code{minimumPageTurnLength} is @code{(ly:make-moment 1/1)}. If you want -to disable page turns, you can set it to something very large. +@code{minimumPageTurnLength} to determine how long a note-free +section must be before a page turn is considered. The default +value for @code{minimumPageTurnLength} is +@code{(ly:make-moment 1/1)}. If you want to disable page turns, +set it to something @q{very large}. @example \new Staff \with @{ \consists "Page_turn_engraver" @} @@ -1657,16 +1799,19 @@ to disable page turns, you can set it to something very large. @end example @funindex minimumRepeatLengthForPageTurn -The @code{Page_turn_engraver} detects volta repeats. It will only allow a page -turn during the repeat if there is enough time at the beginning and end of the -repeat to turn the page back. The @code{Page_turn_engraver} can also disable -page turns if the repeat is very short. If you set the context property -@code{minimumRepeatLengthForPageTurn} then the @code{Page_turn_engraver} will -only allow turns in repeats whose duration is longer than this value. + +When using volta repeats, the @code{Page_turn_engraver} will only allow +a page turn during the repeat if there is enough time at the beginning +and end of the repeat to turn the page back. If the repeat is too +short then the @code{Page_turn_engraver} can be used to @emph{disable} +page turns by setting an appropriate value for the context property +@code{minimumRepeatLengthForPageTurn}. In this case the +@code{Page_turn_engraver} will only allows turns in repeats whose +duration is longer than the value specified. The page turning commands, @code{\pageTurn}, @code{\noPageTurn} and -@code{\allowPageTurn}, may also be used at top-level, between scores and -top-level markups. +@code{\allowPageTurn}, may also be used at top-level, in top-level +markups and between scores. @predefined @funindex \pageTurn @@ -1679,194 +1824,15 @@ top-level markups. @seealso Notation Reference: -@ref{paper variables for line breaking,,@code{@bs{}paper} variables for line breaking}. +@ref{paper variables for line breaking}. Snippets: @rlsr{Spacing}. @knownissues -There should only be one @code{Page_turn_engraver} in a score. If there is more -than one, they will interfere with each other. - - -@node Minimal page breaking -@subsection Minimal page breaking - -@funindex ly:minimal-breaking - -The @code{ly:minimal-breaking} function performs minimal computations to -calculate the page breaking: it fills a page with as many systems as -possible before moving to the next one. Thus, it may be preferred for -scores with many pages, where the other page breaking functions could be -too slow or memory demanding, or a lot of texts. It is enabled using: - -@example -\paper @{ - page-breaking = #ly:minimal-breaking -@} -@end example - -@seealso -Snippets: -@rlsr{Spacing}. - -@node One-line page breaking -@subsection One-line page breaking - -@funindex ly:one-line-breaking - -The @code{ly:one-line-breaking} function is a special-purpose -page breaking algorithm that puts each score on its own page, -and on a single line. This page breaking function does not -typeset titles or margins; only the score will be displayed. - -The page width will be adjusted so that -the longest score fits on one line. In particular, -@code{paper-width}, @code{line-width} and @code{indent} -variables in the @code{\paper} block will be ignored, although -@code{left-margin} and @code{right-margin} will -still be honored. The height of the page will -be left unmodified. - -@node Explicit breaks -@subsection Explicit breaks - -Lily sometimes rejects explicit @code{\break} and @code{\pageBreak} -commands. There are two commands to override this behavior: - -@example -\override NonMusicalPaperColumn.line-break-permission = ##f -\override NonMusicalPaperColumn.page-break-permission = ##f -@end example - -When @code{line-break-permission} is overridden to false, Lily will insert -line breaks at explicit @code{\break} commands and nowhere else. When -@code{page-break-permission} is overridden to false, Lily will insert -page breaks at explicit @code{\pageBreak} commands and nowhere else. - -@lilypond[quote,verbatim] -\paper { - indent = #0 - ragged-right = ##t - ragged-bottom = ##t -} - -music = \relative c'' { c8 c c c } - -\score { - \new Staff { - \repeat unfold 2 { \music } \break - \repeat unfold 4 { \music } \break - \repeat unfold 6 { \music } \break - \repeat unfold 8 { \music } \pageBreak - \repeat unfold 8 { \music } \break - \repeat unfold 6 { \music } \break - \repeat unfold 4 { \music } \break - \repeat unfold 2 { \music } - } - \layout { - \context { - \Score - \override NonMusicalPaperColumn.line-break-permission = ##f - \override NonMusicalPaperColumn.page-break-permission = ##f - } - } -} -@end lilypond - -@seealso -Snippets: -@rlsr{Spacing}. - - -@node Using an extra voice for breaks -@subsection Using an extra voice for breaks - -Line- and page-breaking information usually appears within note entry directly. - -@example -music = \relative c'' @{ c4 c c c @} - -\score @{ - \new Staff @{ - \repeat unfold 2 @{ \music @} \break - \repeat unfold 3 @{ \music @} - @} -@} -@end example - -This makes @code{\break} and @code{\pageBreak} commands easy to enter but mixes -music entry with information that specifies how music should lay out -on the page. You can keep music entry and line- and page-breaking -information in two separate places by introducing an extra voice to -contain the breaks. This extra voice -contains only skips together with @code{\break}, @code{pageBreak} and other -breaking layout information. - -@lilypond[quote,verbatim] -music = \relative c'' { c4 c c c } - -\header { tagline = ##f } -\paper { left-margin = 0\mm } -\book { - \score { - \new Staff << - \new Voice { - s1 * 2 \break - s1 * 3 \break - s1 * 6 \break - s1 * 5 \break - } - \new Voice { - \repeat unfold 2 { \music } - \repeat unfold 3 { \music } - \repeat unfold 6 { \music } - \repeat unfold 5 { \music } - } - >> - } -} -@end lilypond - -This pattern becomes especially helpful when overriding -@code{line-break-system-details} and the other useful but long properties of -@code{NonMusicalPaperColumnGrob}, as explained in @ref{Vertical spacing}. +Use only one @code{Page_turn_engraver} per score. If there are +more, they will interfere with each other. -@lilypond[quote,verbatim] -music = \relative c'' { c4 c c c } - -\header { tagline = ##f } -\paper { left-margin = 0\mm } -\book { - \score { - \new Staff << - \new Voice { - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 0)) - s1 * 2 \break - - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 5)) - s1 * 3 \break - - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 15)) - s1 * 6 \break - - \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details - #'((Y-offset . 30)) - s1 * 5 \break - } - \new Voice { - \repeat unfold 2 { \music } - \repeat unfold 3 { \music } - \repeat unfold 6 { \music } - \repeat unfold 5 { \music } - } - >> - } -} -@end lilypond @seealso Notation Reference: @@ -1884,8 +1850,8 @@ Snippets: Vertical spacing is controlled by three things: the amount of space available (i.e., paper size and margins), the amount of -space between systems, and the amount of space between -staves inside a system. +space between systems, and the amount of space between staves +inside a system. @menu * Flexible vertical spacing within systems:: @@ -2010,7 +1976,7 @@ lowerCaseChords = \with { } labelContext = #(define-music-function - (parser location context) + (context) (string?) #{ s1*0^\markup { \upright {\typewriter #context } } #}) @@ -2368,8 +2334,8 @@ Internals Reference: @emph{Non-staff lines} (such as @code{Lyrics}, @code{ChordNames}, etc.) are contexts whose layout objects are engraved like staves (i.e. in horizontal lines within systems). Specifically, -non-staff lines are non-staff contexts that create the -@code{VerticalAxisGroup} layout object. +non-staff lines are non-staff contexts that contain the +@rinternals{Axis_group_engraver}. The following properties affect the spacing of non-staff lines: @@ -2521,16 +2487,16 @@ by looking at an example that includes no overrides at all. } @end lilypond -This score isolates line- and page-breaking information in a dedicated -voice. This technique of creating a breaks voice will help keep layout -separate from music entry as our example becomes more complicated. -See @ref{Using an extra voice for breaks}. +This score isolates both line-breaking and page-breaking information in +a dedicated voice. This technique of creating a breaks voice will help +keep layout separate from music entry as our example becomes more +complicated. Also see @ref{Breaks}. -Explicit @code{\breaks} evenly divide the music into six measures per -line. Vertical spacing results from LilyPond's defaults. To set -the vertical startpoint of each system explicitly, we can set -the @code{Y-offset} pair in the @code{line-break-system-details} -attribute of the @code{NonMusicalPaperColumn} grob: +By using explicit @code{\break} commands, the music is divided into five +measures per line. Vertical spacing is from LilyPond's own defaults but +the vertical startpoint of each system is set explicitly using the +@code{Y-offset} pair in the @code{line-break-system-details} attribute +of the @code{NonMusicalPaperColumn} grob: @lilypond[verbatim,quote,staffsize=16] \header { tagline = ##f } @@ -2697,30 +2663,37 @@ is, if two outside-staff grobs are competing for the same space, the one with the lower @code{outside-staff-priority} will be placed closer to the staff. -@lilypond[quote,ragged-right,relative=2,verbatim] -c4_"Text"\pp -r2. -\once \override TextScript.outside-staff-priority = #1 -c4_"Text"\pp % this time the text will be closer to the staff -r2. -% by setting outside-staff-priority to a non-number, -% we disable the automatic collision avoidance -\once \override TextScript.outside-staff-priority = ##f -\once \override DynamicLineSpanner.outside-staff-priority = ##f -c4_"Text"\pp % now they will collide +A listing of outside-staff-priorities may be found in +@rlearning{The outside-staff-priority property}. + +@lilypond[quote,ragged-right,verbatim] +\relative c'' { + c4_"Text"\pp + r2. + \once \override TextScript.outside-staff-priority = #1 + c4_"Text"\pp % this time the text will be closer to the staff + r2. + % by setting outside-staff-priority to a non-number, + % we disable the automatic collision avoidance + \once \override TextScript.outside-staff-priority = ##f + \once \override DynamicLineSpanner.outside-staff-priority = ##f + c4_"Text"\pp % now they will collide +} @end lilypond The vertical padding around outside-staff objects can be controlled with @code{outside-staff-padding}. -@lilypond[quote,ragged-right,relative=2,verbatim,staffsize=18] -\once \override TextScript.outside-staff-padding = #0 -a4-"outside-staff-padding = #0" -\once \override TextScript.outside-staff-padding = #3 -d-"outside-staff-padding = #3" -c-"default outside-staff-padding" -b-"default outside-staff-padding" -R1 +@lilypond[quote,ragged-right,verbatim,staffsize=18] +\relative { + \once \override TextScript.outside-staff-padding = #0 + a'4-"outside-staff-padding = #0" + \once \override TextScript.outside-staff-padding = #3 + d-"outside-staff-padding = #3" + c-"default outside-staff-padding" + b-"default outside-staff-padding" + R1 +} @end lilypond @@ -2732,11 +2705,13 @@ As shown in the example below, setting @code{outside-staff-horizontal-padding} increases the horizontal spacing required, and in this case moves the text up to prevent it from getting too close to the ledger lines. -@lilypond[quote,ragged-right,relative=2,verbatim] -c4^"Word" c c''2 -R1 -\once \override TextScript.outside-staff-horizontal-padding = #1 -c,,4^"Word" c c''2 +@lilypond[quote,ragged-right,verbatim] +\relative { + c''4^"Word" c c''2 + R1 + \once \override TextScript.outside-staff-horizontal-padding = #1 + c,,4^"Word" c c''2 +} @end lilypond @seealso @@ -2752,9 +2727,9 @@ Snippets: @menu * Horizontal spacing overview:: -* New spacing area:: +* New spacing section:: * Changing horizontal spacing:: -* Line length:: +* Line width:: * Proportional notation:: @end menu @@ -2768,17 +2743,18 @@ 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 @rinternals{SpacingSpanner} object). The longer the duration, the more space it gets: doubling a -duration adds a fixed amount (this amount is controlled by -@code{spacing-increment}) of space to the note. +duration adds @code{spacing-increment} of space to the note. For example, the following piece contains lots of half, quarter, and 8th notes; the eighth note is followed by 1 note head width (NHW). The quarter note is followed by 2 NHW, the half by 3 NHW, etc. -@lilypond[quote,verbatim,relative=1] -c2 c4. c8 -c4. c8 c4. c8 -c8 c c4 c c +@lilypond[quote,verbatim] +\relative c' { + c2 c4. c8 + c4. c8 c4. c8 + c8 c c4 c c +} @end lilypond Normally, @code{spacing-increment} is set to 1.2 staff space, which is @@ -2801,8 +2777,7 @@ The most common shortest duration is determined as follows: in every measure, the shortest duration is determined. The most common shortest duration is taken as the basis for the spacing, with the stipulation that this shortest duration should always be equal to or shorter than -an 8th note. The shortest duration is printed when you run -@code{lilypond} with the @option{--verbose} option. +an 8th note. These durations may also be customized. If you set the @code{common-shortest-duration} in @rinternals{SpacingSpanner}, then @@ -2819,30 +2794,30 @@ followed by a space that is proportional to their duration relative to the common shortest note. So if we were to add only a few 16th notes to the example above, they would be followed by half a NHW: -@lilypond[quote,verbatim,relative=2] -c2 c4. c8 | c4. c16[ c] c4. c8 | c8 c c4 c c +@lilypond[quote,verbatim] +\relative { c''2 c4. c8 | c4. c16[ c] c4. c8 | c8 c c4 c c } @end lilypond +As explained in the @emph{Essay on automated music engraving}, stem +directions will influence spacing (see @ressay{Optical spacing}) and can +be adjusted using the @code{stem-spacing-correction} property of the +@rinternals{NoteSpacing} object (which are generated for every +@rinternals{Voice} context). -In the @emph{Essay on automated music engraving}, it was explained -that stem directions influence spacing (see -@ressay{Optical spacing}). This is controlled with the -@code{stem-spacing-correction} property in the -@rinternals{NoteSpacing}, object. These are generated for every -@rinternals{Voice} context. The @code{StaffSpacing} object -(generated in @rinternals{Staff} context) contains the same -property for controlling the stem/bar line spacing. The following -example shows these corrections, once with default settings, and -once with exaggerated corrections: +The @code{StaffSpacing} object (generated in @rinternals{Staff} context) +contains the same property for controlling the stem/bar line spacing. + +The following example shows this; once with the default settings and +once with an exaggerated adjustment: @lilypond[quote,ragged-right] -{ - c'4 e''4 e'4 b'4 | - b'4 e''4 b'4 e''4 | +\fixed c' { + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | \override Staff.NoteSpacing.stem-spacing-correction = #1.5 \override Staff.StaffSpacing.stem-spacing-correction = #1.5 - c'4 e''4 e'4 b'4 | - b'4 e''4 b'4 e''4 | + c4 e'4 e4 b4 | + b4 e'4 b4 e'4 | } @end lilypond @@ -2873,49 +2848,53 @@ adjusting the padding value as necessary. No work-around exists for decreasing the amount of space. -@node New spacing area -@subsection New spacing area +@node New spacing section +@subsection New spacing section @funindex \newSpacingSection -@cindex new spacing area -@cindex spacing area, new +@cindex new spacing section +@cindex spacing section, new @cindex notes, spacing horizontally -New sections with different spacing parameters can be started with -@code{newSpacingSection}. This is useful when there are -sections with a different notions of long and short notes. - -In the following example, the time signature change introduces a new -section, and hence the 16ths notes are automatically spaced slightly -wider. - -@lilypond[relative=1,verbatim,quote] -\time 2/4 -c4 c8 c -c8 c c4 c16[ c c8] c4 -\newSpacingSection -\time 4/16 -c16[ c c8] +New sections with different spacing parameters can be started with the +@code{newSpacingSection} command. This is useful for sections with +different notions of @q{long} and @q{short} notes. The +@code{\newSpacingSection} command creates a new @code{SpacingSpanner} +object at that musical moment. + +In the following example the time signature change introduces a new +section, and the 16ths notes are automatically spaced slightly wider +apart. + +@lilypond[verbatim,quote] +\relative c' { + \time 2/4 + c4 c8 c + c8 c c4 c16[ c c8] c4 + \newSpacingSection + \time 4/16 + c16[ c c8] +} @end lilypond -The @code{\newSpacingSection} command creates a new -@code{SpacingSpanner} object at that musical moment. If the automatic spacing adjustments do not give the required spacing, manual @code{\override}s may be applied to its properties. These must be applied at the same musical moment as the @code{\newSpacingSection} -command itself. They will then affect the spacing of all the following +command itself and will then affect the spacing of all the following music until the properties are changed in a new spacing section, for -example, - -@lilypond[relative=1,verbatim,quote] -\time 4/16 -c16[ c c8] -\newSpacingSection -\override Score.SpacingSpanner.spacing-increment = #2 -c16[ c c8] -\newSpacingSection -\revert Score.SpacingSpanner.spacing-increment -c16[ c c8] +example: + +@lilypond[verbatim,quote] +\relative c' { + \time 4/16 + c16[ c c8] + \newSpacingSection + \override Score.SpacingSpanner.spacing-increment = #2 + c16[ c c8] + \newSpacingSection + \revert Score.SpacingSpanner.spacing-increment + c16[ c c8] +} @end lilypond @@ -2941,8 +2920,8 @@ than @code{1 16}. @lilypond[verbatim,line-width=12\cm] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | @@ -2952,8 +2931,8 @@ than @code{1 16}. @lilypond[verbatim,line-width=12\cm] \score { - \relative c'' { - g4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | d4 d d d | d4 e f2 | e4 e e e | e4 f g2 | g4 e e2 | f4 d d2 | c4 e g g | c,1 | @@ -2998,9 +2977,10 @@ property can only be changed at the beginning of a score, When @code{strict-note-spacing} is set, notes are spaced without regard for clefs, bar lines, and grace notes, -@lilypond[quote,ragged-right,relative=2,verbatim] +@lilypond[quote,ragged-right,fragment,verbatim] \override Score.SpacingSpanner.strict-note-spacing = ##t -\new Staff { c8[ c \clef alto c \grace { c16 c } c8 c c] c32[ c] } +\new Staff \relative { + c''8[ c \clef alto c \grace { c16 c } c8 c c] c32[ c] } @end lilypond @seealso @@ -3008,8 +2988,8 @@ Snippets: @rlsr{Spacing}. -@node Line length -@subsection Line length +@node Line width +@subsection Line width @cindex page breaks @cindex breaking pages @@ -3089,11 +3069,14 @@ proportional notation settings and examine how these settings interact. We start with the following one-measure example, which uses classical spacing with ragged-right turned on. +@c The initial pitch is not necessary as long as RhythmicStaff is +@c not preceded by other material in the score, but we don't want +@c to explain that. @lilypond[quote,verbatim,ragged-right] \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> } @@ -3118,7 +3101,7 @@ setting. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3162,7 +3145,7 @@ larger reference durations space music tightly. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3176,7 +3159,7 @@ larger reference durations space music tightly. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3190,7 +3173,7 @@ larger reference durations space music tightly. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } >> \layout { @@ -3218,10 +3201,10 @@ tuplet. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } \new RhythmicStaff { - \tuplet 9/8 { c'8 c' c' c' c' c' c' c' c' } + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } } >> } @@ -3236,10 +3219,10 @@ result. Setting @code{proportionalNotationDuration} fixes this. \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } \new RhythmicStaff { - \tuplet 9/8 { c'8 c' c' c' c' c' c' c' c' } + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } } >> \layout { @@ -3261,10 +3244,10 @@ turn on @code{uniform-stretching}, which is a property of \score { << \new RhythmicStaff { - c'2 c'16 c' c' c' \tuplet 5/4 { c'16 c' c' c' c' } + c2 16 16 16 16 \tuplet 5/4 { 16 16 16 16 16 } } \new RhythmicStaff { - \tuplet 9/8 { c'8 c' c' c' c' c' c' c' c' } + \tuplet 9/8 { c8 8 8 8 8 8 8 8 8 } } >> \layout { @@ -3300,7 +3283,7 @@ means that, by default, @code{uniform-stretching} is either turned on for the entire score or turned off for the entire score. We can, however, override this behavior and turn on different spacing features at different places in the score. We do this with the command -@code{\newSpacingSection}. See @ref{New spacing area}, for more info. +@code{\newSpacingSection}. See @ref{New spacing section}, for more info. Next we examine the effects of the @code{Separating_line_group_engraver} and see why proportional scores frequently remove this engraver. The following @@ -3360,13 +3343,13 @@ property of @code{SpacingSpanner}. Compare the two scores below: @lilypond[quote,verbatim,ragged-right] \new Staff { \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) - c''8 c'' c'' \clef alto d' d'2 + c''8 8 8 \clef alto d'2 2 } \new Staff { \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) \override Score.SpacingSpanner.strict-note-spacing = ##t - c''8 c'' c'' \clef alto d' d'2 + c''8 8 8 \clef alto d'2 2 } @end lilypond @@ -3396,7 +3379,7 @@ for these related settings. @seealso Notation Reference: -@ref{New spacing area}. +@ref{New spacing section}. Snippets: @rlsr{Spacing}. @@ -3525,15 +3508,17 @@ assignment will force a layout with 2 pages. @item Avoid (or reduce) objects that increase the vertical size of a -system. For example, volta repeats (or alternate repeats) 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. For example, dynamics that @q{stick out} of -a system can be moved closer to the staff: - -@lilypond[verbatim,quote,relative=1] -e4 c g\f c -e4 c g-\tweak X-offset #-2.7 \f c +system. For example, volta brackets for alternative repeat endings +require extra space. If these endings are spread over two systems, +they take up more space than if they were on the same system. +As another example, dynamics that @q{stick out} of a system +can be moved closer to the staff: + +@lilypond[verbatim,quote] +\relative e' { + e4 c g\f c + e4 c g-\tweak X-offset #-2.7 \f c +} @end lilypond @item @@ -3543,8 +3528,8 @@ example illustrates the default spacing: @lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | @@ -3561,8 +3546,8 @@ duration longer, a @q{squeezing} effect occurs: @lilypond[verbatim,quote] \score { - \relative c'' { - g4 e e2 | + \relative { + g'4 e e2 | f4 d d2 | c4 d e f | g4 g g2 | diff --git a/Documentation/notation/staff.itely b/Documentation/notation/staff.itely index e7133e3d4f..ce859e2bb5 100644 --- a/Documentation/notation/staff.itely +++ b/Documentation/notation/staff.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @node Staff notation @section Staff notation @@ -59,7 +59,6 @@ grouping staves. @cindex tablature @funindex \drummode -@funindex drummode @funindex DrumStaff @funindex RhythmicStaff @funindex TabStaff @@ -73,8 +72,8 @@ the @code{\new} or @code{\context} commands. For details, see The basic staff context is @code{Staff}: -@lilypond[verbatim,quote,relative=2] -\new Staff { c4 d e f } +@lilypond[verbatim,quote] +\new Staff \relative { c''4 d e f } @end lilypond The @code{DrumStaff} context creates a five-line staff set up for @@ -93,15 +92,15 @@ For details, see @ref{Percussion staves}. displays the rhythmic values of the input. Real durations are preserved. For details, see @ref{Showing melody rhythms}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new RhythmicStaff { c4 d e f } @end lilypond @code{TabStaff} creates a tablature with six strings in standard guitar tuning. For details, see @ref{Default tablatures}. -@lilypond[verbatim,quote,relative=2] -\new TabStaff { c4 d e f } +@lilypond[verbatim,quote] +\new TabStaff \relative { c''4 d e f } @end lilypond There are two staff contexts specific for the notation of ancient @@ -111,8 +110,8 @@ described in @ref{Pre-defined contexts}. The @code{GregorianTranscriptionStaff} context creates a staff to notate modern Gregorian chant. It does not show bar lines. -@lilypond[verbatim,quote,relative=2] -\new GregorianTranscriptionStaff { c4 d e f e d } +@lilypond[verbatim,quote] +\new GregorianTranscriptionStaff \relative { c''4 d e f e d } @end lilypond New single staff contexts may be defined. For details, see @@ -174,40 +173,40 @@ If no context is specified, the default properties will be used: the group is started with a vertical line, and the bar lines are not connected. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond In the @code{StaffGroup} context, the group is started with a bracket and bar lines are drawn through all the staves. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond In a @code{ChoirStaff}, the group starts with a bracket, but bar lines are not connected. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new ChoirStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond In a @code{GrandStaff}, the group begins with a brace, and bar lines are connected between the staves. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new GrandStaff << - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { c''1 c } >> @end lilypond @@ -215,11 +214,11 @@ The @code{PianoStaff} is identical to a @code{GrandStaff}, except that it supports printing the instrument name directly. For details, see @ref{Instrument names}. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new PianoStaff << \set PianoStaff.instrumentName = #"Piano" - \new Staff { c1 c } - \new Staff { c1 c } + \new Staff \relative { c''1 c } + \new Staff \relative { \clef bass c1 c } >> @end lilypond @@ -274,9 +273,6 @@ Internals Reference: @rinternals{SystemStartBracket}, @rinternals{SystemStartSquare}. -@knownissues -@code{PianoStaff} does not, by default, accept @code{ChordNames}. - @node Nested staff groups @unnumberedsubsubsec Nested staff groups @@ -293,17 +289,17 @@ Staff-group contexts can be nested to arbitrary depths. In this case, each child context creates a new bracket adjacent to the bracket of its parent group. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new StaffGroup << - \new Staff { c2 c | c2 c } + \new Staff \relative { c''2 c | c2 c } \new StaffGroup << - \new Staff { g2 g | g2 g } + \new Staff \relative { g'2 g | g2 g } \new StaffGroup \with { systemStartDelimiter = #'SystemStartSquare } << - \new Staff { e2 e | e2 e } - \new Staff { c2 c | c2 c } + \new Staff \relative { e'2 e | e2 e } + \new Staff \relative { c'2 c | c2 c } >> >> >> @@ -353,15 +349,15 @@ turned on with a @code{\paper} option. \score { \new StaffGroup << \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } } \new Staff { - \relative c'' { - c4 c c c + \relative { + c''4 c c c \break c4 c c c } @@ -412,18 +408,18 @@ sections are also described. @cindex ledger lines, modifying @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff The @code{\stopStaff} and @code{\startStaff} commands can be used to stop or (re)start the staff lines respectively, from being printed at any point witin a score. -@lilypond[verbatim,quote,relative=2] -\stopStaff f4 d \startStaff g, e -f'4 d \stopStaff g, e -f'4 d \startStaff g, e +@lilypond[verbatim,quote] +\relative { + \stopStaff f''4 d \startStaff g, e + f'4 d \stopStaff g, e + f'4 d \startStaff g, e +} @end lilypond @predefined @@ -437,14 +433,16 @@ these modifications must be made before the staff is (re)started. The number of staff lines can be altered: -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-count = #2 -\startStaff g, e | - -f'4 d \stopStaff -\revert Staff.StaffSymbol.line-count -\startStaff g, e | +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-count = #2 + \startStaff g, e | + + f'4 d \stopStaff + \revert Staff.StaffSymbol.line-count + \startStaff g, e | +} @end lilypond The position of each staff line can also be altered. A list of @@ -454,13 +452,15 @@ center line, and the normal line positions are printed for every value entered so that the number of staff lines, as well as their position, can be changed with a single override. -@lilypond[verbatim,quote,relative=2] -f4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) -\startStaff g, e | -f'4 d \stopStaff -\override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) -\startStaff g, e +@lilypond[verbatim,quote] +\relative { + f''4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(1 3 5 -1 -3) + \startStaff g, e | + f'4 d \stopStaff + \override Staff.StaffSymbol.line-positions = #'(8 6.5 -6 -8 -0.5) + \startStaff g, e | +} @end lilypond To preserve typical stem directions (in the bottom half of the staff @@ -473,22 +473,24 @@ lines. See @ref{Clef}. Staff line thickness can be altered. Ledger lines and note stems, by default, are also affected. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #3 +} \relative { + f''4 d g, e } -{ f4 d g, e } @end lilypond It is also possible to set ledger line thickness independently of staff lines. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.thickness = #2 \override StaffSymbol.ledger-line-thickness = #'(0.5 . 0.4) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond @noindent @@ -498,22 +500,24 @@ new thickness of the ledger line. The vertical positions of ledger lines can be altered, -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-positions = #'(-3 -2 -1 2 5 6) +} \relative { + f'''4 a, a,, f } -{ f'4 a, a,, f } @end lilypond Additional ledger lines can be made to appear above or below note heads depending on the current position relative to other note heads that also have their own ledger lines. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.ledger-extra = #4 +} \relative { + f'''4 a, d, f, } -{ f'4 a, d, f, } @end lilypond Ledger lines can also be made to appear inside the staff where custom @@ -522,23 +526,26 @@ ledger lines when the explicit @code{ledger-position} is and is not set. The @code{\stopStaff} is needed in the example to revert the @code{\override} for the whole @code{StaffSymbol}. -@lilypond[verbatim,quote,relative=1] -\override Staff.StaffSymbol.line-positions = #'(-8 0 2 4) -d4 e f g -\stopStaff -\startStaff -\override Staff.StaffSymbol.ledger-positions = #'(-8 -6 (-4 -2) 0) -d4 e f g +@lilypond[verbatim,quote] +\relative d' { + \override Staff.StaffSymbol.line-positions = #'(-8 0 2 4) + d4 e f g + \stopStaff + \startStaff + \override Staff.StaffSymbol.ledger-positions = #'(-8 -6 (-4 -2) 0) + d4 e f g +} @end lilypond The distance between staff lines can be altered. This affects ledger line spacing as well. -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { \override StaffSymbol.staff-space = #1.5 +} \relative { + f'''4 d, g, e, } -{ f'4 d, g, e, } @end lilypond @snippets @@ -572,16 +579,14 @@ Internals Reference: @cindex resizing of staves @funindex \startStaff -@funindex startStaff @funindex \stopStaff -@funindex stopStaff @notation{Ossia} staves can be set by creating a new simultaneous staff in the appropriate location: @lilypond[verbatim,quote] -\new Staff \relative c'' { - c4 b d c +\new Staff \relative { + c''4 b d c << { c4 b d c } \new Staff { e4 d f e } @@ -603,17 +608,15 @@ to align the ossia staff. This method is most appropriate when only a few ossia staves are needed. @lilypond[verbatim,quote] -\new Staff = "main" \relative c'' { - c4 b d c +\new Staff = "main" \relative { + c''4 b d c << { c4 b d c } \new Staff \with { \remove "Time_signature_engraver" alignAboveContext = #"main" - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) + \magnifyStaff #2/3 firstClef = ##f } { e4 d f e } @@ -635,14 +638,12 @@ example. \new Staff = "ossia" \with { \remove "Time_signature_engraver" \hide Clef - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) + \magnifyStaff #2/3 } { \stopStaff s1*6 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 << { e4 f e2 } \context Staff = "ossia" { @@ -663,26 +664,25 @@ example. @end lilypond -Using the @code{\Staff \RemoveEmptyStaves} command to create ossia +Using the @code{\RemoveAllEmptyStaves} command to create ossia staves may be used as an alternative. This method is most convenient when ossia staves occur immediately following a line break. For more information about -@code{\Staff \RemoveEmptyStaves}, see @ref{Hiding staves}. +@code{\RemoveAllEmptyStaves}, see @ref{Hiding staves}. @lilypond[verbatim,quote,ragged-right] << \new Staff = "ossia" \with { \remove "Time_signature_engraver" \hide Clef - fontSize = #-3 - \override StaffSymbol.staff-space = #(magstep -3) - \override StaffSymbol.thickness = #(magstep -3) - } \relative c'' { + \magnifyStaff #2/3 + \RemoveAllEmptyStaves + } \relative { R1*3 - c4 e8 d c2 + c''4 e8 d c2 } - \new Staff \relative c' { - c4 b c2 + \new Staff \relative { + c'4 b c2 e4 f e2 g4 a g2 \break c4 b c2 @@ -690,13 +690,6 @@ break. For more information about e4 d c2 } >> - -\layout { - \context { - \Staff \RemoveEmptyStaves - \override VerticalAxisGroup.remove-first = ##t - } -} @end lilypond @@ -733,13 +726,16 @@ Internals Reference: @cindex Frenched staff @cindex staff, hiding @cindex staff, empty -@cindex hiding of staves +@cindex hiding staves +@cindex hiding ancient staves +@cindex hiding rhythmic staves +@cindex hiding vaticana staves @cindex empty staves @funindex \RemoveEmptyStaves +@funindex \RemoveAllEmptyStaves @funindex Staff_symbol_engraver @funindex \stopStaff -@funindex stopStaff Staff lines can be hidden by removing the @@ -750,15 +746,18 @@ alternative, @code{\stopStaff} may be used. \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c''' { a8 f e16 d c b a2 } +\relative { a''8 f e16 d c b a2 } @end lilypond -Empty staves can be hidden by setting the -@code{\Staff \RemoveEmptyStaves} command in the @code{\layout} -block. In orchestral scores, this style is known as @q{Frenched -Score}. By default, this command hides and removes all empty -staves in a score except for those in the first system. +Empty staves can be hidden (for a so-called @q{Frenched Score}) +by applying the @code{\RemoveEmptyStaves} command on a context, which +can be done globally (in a @code{\layout} block) as well as for +specific staves only (in a @code{\with} block). This command removes +all empty staves in a score except for those in the first system. If +you want those in the first system to be hidden also, use +@code{\RemoveAllEmptyStaves}. Supported contexts are @code{Staff}, +@code{RhythmicStaff} and @code{VaticanaStaff}. @warning{A staff is considered empty when it contains only multi-measure rests, rests, skips, spacer rests, or a combination of these @@ -767,13 +766,14 @@ elements.} @lilypond[verbatim,quote,ragged-right] \layout { \context { - \Staff \RemoveEmptyStaves + \Staff + \RemoveEmptyStaves } } -\relative c' << +\relative << \new Staff { - e4 f g a \break + e'4 f g a \break b1 \break a4 b c2 } @@ -788,32 +788,15 @@ elements.} @cindex ossia @noindent -@code{\Staff \RemoveEmptyStaves} can also be used to create ossia +@code{\RemoveAllEmptyStaves} can also be used to create ossia sections for a staff. For details, see @ref{Ossia staves}. -@cindex hiding ancient staves -@cindex hiding rhythmic staves - -@funindex \RemoveEmptyStaves - -The @code{\VaticanaStaff \RemoveEmptyStaves} command may be used to -hide empty staves in ancient music contexts. Similarly, -@code{\RhythmicStaff \RemoveEmptyStaves} may be used to hide empty -@code{RhythmicStaff} contexts. - @predefined -@code{\Staff \RemoveEmptyStaves}, -@code{\VaticanaStaff \RemoveEmptyStaves}, -@code{\RhythmicStaff \RemoveEmptyStaves}. +@code{\RemoveEmptyStaves}, +@code{\RemoveAllEmptyStaves}. @endpredefined - -@snippets - -@lilypondfile[verbatim,quote,texidoc,doctitle] -{removing-the-first-empty-line.ly} - @seealso Music Glossary: @rglos{Frenched staff}. @@ -881,27 +864,29 @@ and @code{ChoirStaff} contexts. The value of @code{instrumentName} is used for the first staff, and the value of @code{shortInstrumentName} is used for all succeeding staves. -@lilypond[verbatim,quote,ragged-right,relative=1] +@lilypond[verbatim,quote,ragged-right] \new Staff \with { instrumentName = #"Violin " shortInstrumentName = #"Vln. " +} \relative { + c'4.. g'16 c4.. g'16 \break | c1 | } -{ c4.. g'16 c4.. g'16 \break | c1 } @end lilypond @cindex instrument names, complex @code{\markup} can be used to create more complex instrument names: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote] \new Staff \with { instrumentName = \markup { \column { "Clarinetti" \line { "in B" \smaller \flat } } } +} \relative { + c''4 c,16 d e f g2 } -{ c4 c,16 d e f g2 } @end lilypond @cindex instrument names, centering @@ -910,20 +895,20 @@ When two or more staff contexts are grouped together, the instrument names and short instrument names are centered by default. To center multi-line instrument names, @code{\center-column} must be used: -@lilypond[verbatim,quote,indent=1.5\cm,relative=2] +@lilypond[verbatim,quote,indent=1.5\cm] << \new Staff \with { instrumentName = #"Flute" - } - { f2 g4 f } + } \relative { + f''2 g4 f +} \new Staff \with { instrumentName = \markup { \center-column { "Clarinet" \line { "in B" \smaller \flat } } } - } - { c4 b c2 } + } \relative { c''4 b c2 } >> @end lilypond @@ -936,26 +921,22 @@ staff group may not be centered unless the @code{indent} and settings, see @ref{paper variables for shifts and indents,,@code{@bs{}paper} variables for shifts and indents}. @lilypond[verbatim,quote,ragged-right] -\relative c'' { - << - \new Staff \with { - instrumentName = #"Alto Flute in G" - shortInstrumentName = #"Flt." - } - { - f2 g4 f \break - g4 f g2 - } - \new Staff \with { - instrumentName = #"Clarinet" - shortInstrumentName = #"Clar." - } - { - c,4 b c2 \break - c2 b4 c - } - >> -} +<< + \new Staff \with { + instrumentName = #"Alto Flute in G" + shortInstrumentName = #"Flt." + } \relative { + f''2 g4 f \break + g4 f g2 + } + \new Staff \with { + instrumentName = #"Clarinet" + shortInstrumentName = #"Clar." + } \relative { + c''4 b c2 \break + c2 b4 c + } +>> \layout { indent = 3.0\cm @@ -972,67 +953,49 @@ that context. For details, see @ref{Modifying context plug-ins}. @cindex instrument names, changing @cindex changing instrument names -The @code{shortInstrumentName} may be changed in the middle of a piece. +The @code{shortInstrumentName} may be changed in the middle of a piece, +along with other settings as needed for the new instrument. However, only the first instance of @code{instrumentName} will be printed and subsequent changes will be ignored: -@lilypond[verbatim,quote,ragged-right,relative=1] -\new Staff \with { - instrumentName = #"Flute" - shortInstrumentName = #"Flt." -} -{ - c1 c c c \break - c1 c c c \break - \set Staff.instrumentName = #"Clarinet" - \set Staff.shortInstrumentName = #"Clt." - c1 c c c \break - c1 c c c \break +@lilypond[verbatim,quote,ragged-right] +prepPiccolo = <>^\markup \italic { muta in Piccolo } + +setPiccolo = { + \set Staff.instrumentName = #"Piccolo" + \set Staff.shortInstrumentName = #"Picc." + \set Staff.midiInstrument = #"piccolo" + <>^\markup \bold { Piccolo } + \transposition c'' } -@end lilypond - -@cindex instrument switch -@cindex switching instruments -@funindex \addInstrumentDefinition -@funindex addInstrumentDefinition -@funindex \instrumentSwitch -@funindex instrumentSwitch +prepFlute = <>^\markup \italic { muta in Flauto } -If an instrument @emph{switch} is needed, -@code{\addInstrumentDefinition} may be used in combination with -@code{\instrumentSwitch} to create a detailed list of the -necessary changes for the switch. The -@code{\addInstrumentDefinition} command has two arguments: an -identifying string, and an association list of context properties -and values to be used for the instrument. It must be placed in -the toplevel scope. @code{\instrumentSwitch} is used in the music -expression to declare the instrument switch: - -@lilypond[verbatim,quote,ragged-right] -\addInstrumentDefinition #"contrabassoon" - #`((instrumentTransposition . ,(ly:make-pitch -1 0 0)) - (shortInstrumentName . "Cbsn.") - (clefGlyph . "clefs.F") - (middleCPosition . 6) - (clefPosition . 2) - (instrumentCueName . ,(make-bold-markup "cbsn.")) - (midiInstrument . "bassoon")) +setFlute = { + \set Staff.instrumentName = #"Flute" + \set Staff.shortInstrumentName = #"Flt." + \set Staff.midiInstrument = #"flute" + <>^\markup \bold { Flute } + \transposition c' +} \new Staff \with { - instrumentName = #"Bassoon" + instrumentName = #"Flute" + shortInstrumentName = #"Flt." + midiInstrument = #"flute" } -\relative c' { - \clef tenor - \compressFullBarRests - c2 g' - R1*16 - \instrumentSwitch "contrabassoon" - c,,2 g \break - c,1 ~ | c1 +\relative { + g'1 g g g \break + g1 g \prepPiccolo R R \break + \setPiccolo + g1 g g g \break + g1 g \prepFlute R R \break + \setFlute + g1 g g g } @end lilypond + @seealso Notation Reference: @ref{paper variables for shifts and indents,,@code{@bs{}paper} variables for shifts and indents}, @@ -1056,11 +1019,8 @@ Internals Reference: @cindex cue notes @funindex \addQuote -@funindex addQuote @funindex \quoteDuring -@funindex quoteDuring @funindex \transposition -@funindex transposition It is very common for one voice to use the same notes as those from another voice. For example, first and second violins playing the same @@ -1077,12 +1037,12 @@ quoted voice, as defined with @code{\addQuote}, and a music expression for the duration of the quote. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { s1 } } \addQuote "flute" { \fluteNotes } @@ -1100,12 +1060,12 @@ instead of spacer or multimeasure rests then the quote will appear as polyphony and may produce unexpected results. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a4 gis g gis | b4^"quoted" r8 ais\p a4( f) +fluteNotes = \relative { + a'4 gis g gis | b4^"quoted" r8 ais\p a4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"flute" { e4 r8 ais b4 a } } \addQuote "flute" { \fluteNotes } @@ -1118,6 +1078,41 @@ oboeNotes = \relative c'' { } @end lilypond +If an @code{\unfoldRepeat} command in a music expression is required to +be printed when using @code{\quoteDuring}, then it too must also contain +its own @code{\unfoldRepeat} command; + +@lilypond[verbatim,quote] +fluteNotes = \relative { + \repeat volta 2 { a'4 gis g gis } +} + +oboeNotesDW = \relative { + \repeat volta 2 \quoteDuring #"incorrect" { s1 } +} + +oboeNotesW = \relative { + \repeat volta 2 \quoteDuring #"correct" { s1 } +} + + +\addQuote "incorrect" { \fluteNotes } + +\addQuote "correct" { \unfoldRepeats \fluteNotes } + +\score { + \unfoldRepeats + << + \new Staff \with { instrumentName = "Flute" } + \fluteNotes + \new Staff \with { instrumentName = "Oboe (incorrect)" } + \oboeNotesDW + \new Staff \with { instrumentName = "Oboe (correct)" } + \oboeNotesW + >> +} +@end lilypond + The @code{\quoteDuring} command uses the @code{\transposition} settings of both quoted and quoting parts to produce notes for the quoting part that have the same sounding pitch as those in the quoted part. @@ -1129,8 +1124,8 @@ clarinetNotes = \relative c'' { b4 ais a ais | cis4^"quoted" r8 bis\p b4( f) } -oboeNotes = \relative c'' { - c4 cis c b \quoteDuring #"clarinet" { s1 } +oboeNotes = \relative { + c''4 cis c b \quoteDuring #"clarinet" { s1 } } \addQuote "clarinet" { \clarinetNotes } @@ -1160,13 +1155,13 @@ of these objects from the quoted music are displayed by using the @code{quotedEventTypes} context property. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - a2 g2 | +fluteNotes = \relative { + a'2 g2 | b4\<^"quoted" r8 ais a4\f( c->) } -oboeNotes = \relative c'' { - c2. b4 | +oboeNotes = \relative { + c''2. b4 | \quoteDuring #"flute" { s1 } } @@ -1221,13 +1216,9 @@ triplets may result in poor notation. @funindex \cueDuring -@funindex cueDuring @funindex \cueClef -@funindex cueClef @funindex \cueDuringWithClef -@funindex cueDuringWithClef @funindex \quoteDuring -@funindex quoteDuring @cindex notes, smaller @cindex smaller notes @@ -1236,15 +1227,17 @@ triplets may result in poor notation. The simplest way to format cue notes is to explicitly create a @code{CueVoice} context within the part. -@lilypond[verbatim,relative=1] -R1 -<< - { e2\rest r4. e8 } - \new CueVoice { - \stemUp d'8^"flute" c d e fis2 - } ->> -d,4 r a r +@lilypond[verbatim] +\relative { + R1 + << + { e'2\rest r4. e8 } + \new CueVoice { + \stemUp d'8^"flute" c d e fis2 + } + >> + d,4 r a r +} @end lilypond The @code{\cueClef} command can also be used with an explict @@ -1253,28 +1246,32 @@ an appropriately sized clef for the cue notes. The @code{\cueClefUnset} command can then be used to switch back to the original clef, again with an appropriately sized clef. -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -<< - { e2\rest r4. \cueClefUnset e,8 } - \new CueVoice { - \cueClef "treble" \stemUp d''8^"flute" c d e fis2 - } ->> -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + << + { e'2\rest r4. \cueClefUnset e,8 } + \new CueVoice { + \cueClef "treble" \stemUp d''8^"flute" c d e fis2 + } + >> + d,,4 r a r +} @end lilypond The @code{\cueClef} and @code{\cueClefUnset} command can also be used without a @code{CueVoice} if required. -@lilypond[verbatim,noragged-right,relative=1] -\clef "bass" -R1 -\cueClef "treble" -d'8^"flute" c d e fis2 -\cueClefUnset -d,,4 r a r +@lilypond[verbatim,noragged-right] +\relative { + \clef "bass" + R1 + \cueClef "treble" + d''8^"flute" c d e fis2 + \cueClefUnset + d,,4 r a r +} @end lilypond For more complex cue note placement, e.g including transposition, or @@ -1303,13 +1300,13 @@ corresponds to the first and second voices respectively, determining how the cue notes are printed in relation to the other voice. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 | d8 c d e fis2 | g2 d | +fluteNotes = \relative { + r2. c''4 | d8 c d e fis2 | g2 d | } oboeNotes = \relative c'' { R1 - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } \cueDuring #"flute" #UP { R1 } g2 c, } @@ -1337,8 +1334,8 @@ or else the entire music expression would belong to the @code{CueVoice} context.} @lilypond[verbatim,quote] -oboeNotes = \relative c'' { - r2 r8 d16(\f f e g f a) +oboeNotes = \relative { + r2 r8 d''16(\f f e g f a) g8 g16 g g2. } \addQuote "oboe" { \oboeNotes } @@ -1352,24 +1349,21 @@ oboeNotes = \relative c'' { } @end lilypond -The name of the instrument playing the cue can be printed by setting -the @code{instrumentCueName} property in a temporary @code{CueVoice} -context. The placement and style of the @code{instrumentCueName} is -controlled by the @code{InstrumentSwitch} object, see -@ref{Instrument names}. If the cue notes require a change in clef, +Markup can be used to show the name of the quoted instrument. +If the cue notes require a change in clef, this can be done manually but the original clef should also be restored manually at the end of the cue notes. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { \clef bass R1 \clef treble - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } \cueDuring #"flute" #UP { R1 } \clef bass g4. b8 d2 @@ -1388,14 +1382,14 @@ clef that needs to be printed for the cue notes but will automatically print the original clef once the cue notes have finished. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { \clef bass R1 - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup { \tiny "flute" } \cueDuringWithClef #"flute" #UP #"treble" { R1 } g4. b8 d2 } @@ -1408,7 +1402,6 @@ bassoonNotes = \relative c { @end lilypond @funindex \transposedCueDuring -@funindex transposedCueDuring Like @code{\quoteDuring}, @code{\cueDuring} takes instrument transpositions into account. Cue notes are produced at the @@ -1422,10 +1415,10 @@ represent the sound of a concert middle C. This is useful for taking cues from an instrument in a completely different register. @lilypond[verbatim,quote] -piccoloNotes = \relative c''' { +piccoloNotes = \relative { \clef "treble^8" R1 - c8 c c e g2 + c'''8 c c e g2 c4 g g2 } @@ -1449,9 +1442,6 @@ bassClarinetNotes = \relative c' { @cindex cue notes, removing @funindex \killCues -@funindex killCues -@funindex \addInstrumentDefinition -@funindex addInstrumentDefinition The @code{\killCues} command removes cue notes from a music expression, so the same music expression can be used to produce @@ -1462,8 +1452,8 @@ changes and a label identifying the source instrument, can be tagged for selective inclusion in the score; see @ref{Using tags}. @lilypond[verbatim,quote] -fluteNotes = \relative c'' { - r2. c4 d8 c d e fis2 g2 d2 +fluteNotes = \relative { + r2. c''4 d8 c d e fis2 g2 d2 } bassoonNotes = \relative c { @@ -1471,7 +1461,7 @@ bassoonNotes = \relative c { R1 \tag #'part { \clef treble - \new CueVoice { \set instrumentCueName = "flute" } + <>^\markup \tiny { flute } } \cueDuring #"flute" #UP { R1 } \tag #'part \clef bass diff --git a/Documentation/notation/text.itely b/Documentation/notation/text.itely index 62aac77931..22471b86b3 100644 --- a/Documentation/notation/text.itely +++ b/Documentation/notation/text.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.6" +@c \version "2.19.21" @node Text @section Text @@ -59,27 +59,30 @@ demonstrated in the following example. Such indications may be manually placed above or below the staff, using the syntax described in @ref{Direction and placement}. -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e a4-"scherz." f +@lilypond[quote,verbatim] +\relative { a'8^"pizz." g f e a4-"scherz." f } @end lilypond This syntax is actually a shorthand; more complex text formatting may be added to a note by explicitly using a @code{\markup} block, as described in @ref{Formatting text}. -@lilypond[quote,verbatim,relative=2] -a8^\markup { \italic pizz. } g f e -a4_\markup { \tiny scherz. \bold molto } f +@lilypond[quote,verbatim] +\relative { + a'8^\markup { \italic pizz. } g f e + a4_\markup { \tiny scherz. \bold molto } f } @end lilypond By default, text indications do not influence the note spacing. However, their widths can be taken into account: in the following example, the first text string does not affect spacing, whereas the second one does. -@lilypond[quote,verbatim,relative=2] -a8^"pizz." g f e -\textLengthOn -a4_"scherzando" f +@lilypond[quote,verbatim] +\relative { + a'8^"pizz." g f e + \textLengthOn + a4_"scherzando" f +} @end lilypond In addition to text scripts, articulations can be attached to notes. @@ -89,9 +92,7 @@ For more information about the relative ordering of text scripts and articulations, see @rlearning{Placement of objects}. @funindex \textLengthOn -@funindex textLengthOn @funindex \textLengthOff -@funindex textLengthOff @predefined @code{\textLengthOn}, @@ -139,10 +140,12 @@ multiple notes with dotted lines. Such objects, called @qq{spanners}, may be created from one note to another using the following syntax: -@lilypond[verbatim,quote,relative=2] -\override TextSpanner.bound-details.left.text = "rit." -b1\startTextSpan -e,\stopTextSpan +@lilypond[verbatim,quote] +\relative { + \override TextSpanner.bound-details.left.text = "rit." + b'1\startTextSpan + e,\stopTextSpan +} @end lilypond @cindex text spanners, formatting @@ -154,22 +157,21 @@ it is printed in italic characters, but different formatting can be obtained using @code{\markup} blocks, as described in @ref{Formatting text}. -@lilypond[quote,relative=2,verbatim] -\override TextSpanner.bound-details.left.text = - \markup { \upright "rit." } -b1\startTextSpan c -e,\stopTextSpan +@lilypond[quote,verbatim] +\relative { + \override TextSpanner.bound-details.left.text = + \markup { \upright "rit." } + b'1\startTextSpan c + e,\stopTextSpan +} @end lilypond The line style, as well as the text string, can be defined as an object property. This syntax is described in @ref{Line styles}. @funindex \textSpannerUp -@funindex textSpannerUp @funindex \textSpannerDown -@funindex textSpannerDown @funindex \textSpannerNeutral -@funindex textSpannerNeutral @predefined @@ -216,9 +218,7 @@ Internals Reference: @cindex bar lines, symbols on @funindex \mark -@funindex mark @funindex \markup -@funindex markup Various text elements may be added to a score using the syntax described in @ref{Rehearsal marks}: @@ -226,21 +226,28 @@ in @ref{Rehearsal marks}: @c \mark needs to be placed on a separate line (it's not @c attached to an object like \markup is). -vv -@lilypond[verbatim,quote,relative=2] -c4 -\mark "Allegro" -c c c +@lilypond[verbatim,quote] +\relative { + \mark "Verse" + c'2 g' + \bar "||" + \mark "Chorus" + g2 c, + \bar "|." +} @end lilypond This syntax makes it possible to put any text on a bar line; more complex text formatting may be added using a @code{\markup} block, as described in @ref{Formatting text}: -@lilypond[quote,verbatim,relative=1] -1 -\mark \markup { \italic { colla parte } } -2 -1 +@lilypond[quote,verbatim] +\relative { + 1 + \mark \markup { \italic { colla parte } } + 2 + 1 +} @end lilypond @noindent @@ -248,10 +255,12 @@ This syntax also allows to print special signs, like coda, segno or fermata, by specifying the appropriate symbol name as explained in @ref{Music notation inside markup}: -@lilypond[quote,verbatim,relative=2] -2 -\mark \markup { \musicglyph #"scripts.ufermata" } -1 +@lilypond[quote,verbatim] +\relative { + 2 + \mark \markup { \musicglyph #"scripts.ufermata" } + 1 +} @end lilypond @noindent @@ -261,17 +270,17 @@ bar, they can be placed above the bar line or between notes. When specified at a line break, the mark will be printed at the beginning of the next line. -@lilypond[quote,verbatim,relative=2,ragged-right] -\mark "Allegro" -c1 c -\mark "assai" \break -c c +@lilypond[quote,verbatim,ragged-right] +\relative c'' { + \mark "Allegro" + c1 c + \mark "assai" \break + c c +} @end lilypond @funindex \markLengthOn -@funindex markLengthOn @funindex \markLengthOff -@funindex markLengthOff @predefined @code{\markLengthOn}, @@ -313,7 +322,6 @@ Internals Reference: @cindex text, standalone @funindex \markup -@funindex markup A @code{\markup} block can exist by itself, outside of any @code{\score} block, as a @qq{top-level expression}. This syntax @@ -349,9 +357,7 @@ requires, are described in @ref{Multi-page markup}. @funindex \markup -@funindex markup @funindex \markuplist -@funindex markuplist @predefined @code{\markup}, @@ -402,7 +408,6 @@ using the @code{\markup} mode specific syntax. @cindex typeset text @funindex \markup -@funindex markup A @code{\markup} block is used to typeset text with an extensible syntax called @qq{markup mode}. @@ -422,14 +427,16 @@ contain nested expressions or markup commands, entered using the backslash @code{\} character. Such commands only affect the first following expression. -@lilypond[quote,verbatim,relative=2] -a1-\markup intenso -a2^\markup { poco \italic più forte } -c e1 -d2_\markup { \italic "string. assai" } -e -b1^\markup { \bold { molto \italic agitato } } -c +@lilypond[quote,verbatim] +\relative { + a'1-\markup intenso + a2^\markup { poco \italic più forte } + c e1 + d2_\markup { \italic "string. assai" } + e + b1^\markup { \bold { molto \italic agitato } } + c +} @end lilypond @cindex special characters in markup mode @@ -447,10 +454,12 @@ will be printed verbatim without affecting the formatting of the text. Double quotation marks themselves may be printed by preceding them with backslashes. -@lilypond[quote,verbatim,relative=2] -a1^"\italic markup..." -a_\markup { \italic "... prints \"italic\" letters!" } -a a +@lilypond[quote,verbatim] +\relative { + a'1^"\italic markup..." + a_\markup { \italic "... prints \"italic\" letters!" } + a a +} @end lilypond To be treated as a distinct expression, a list of words needs to be @@ -459,11 +468,13 @@ expressions are defined affects how these expressions will be stacked, centered and aligned; in the following example, the second @code{\markup} expression is treated the same as the first one: -@lilypond[quote,verbatim,relative=2] -c1^\markup { \center-column { a bbb c } } -c1^\markup { \center-column { a { bbb c } } } -c1^\markup { \center-column { a \line { bbb c } } } -c1^\markup { \center-column { a "bbb c" } } +@lilypond[quote,verbatim] +\relative c'' { + c1^\markup { \center-column { a bbb c } } + c1^\markup { \center-column { a { bbb c } } } + c1^\markup { \center-column { a \line { bbb c } } } + c1^\markup { \center-column { a "bbb c" } } +} @end lilypond Markups can be stored in variables. Such variables may be @@ -505,22 +516,21 @@ Syntax errors for markup mode can be confusing. @cindex switching fonts @funindex \italic -@funindex italic @funindex \bold -@funindex bold @funindex \underline -@funindex underline Basic font switching is supported in markup mode: -@lilypond[quote,verbatim,relative=2] -d1^\markup { - \bold { Più mosso } - \italic { non troppo \underline Vivo } +@lilypond[quote,verbatim] +\relative { + d''1^\markup { + \bold { Più mosso } + \italic { non troppo \underline Vivo } + } + r2 r4 r8 + d,_\markup { \italic quasi \smallCaps Tromba } + f1 d2 r } -r2 r4 r8 -d,_\markup { \italic quasi \smallCaps Tromba } -f1 d2 r @end lilypond @cindex font size @@ -528,60 +538,70 @@ f1 d2 r @funindex \abs-fontsize @funindex \fontsize -@funindex fontsize @funindex \smaller -@funindex smaller @funindex \larger -@funindex larger @funindex \magnify -@funindex magnify The font size can be altered, relative to the global staff size, in a number of different ways It can be set to predefined size, -@lilypond[quote,verbatim,relative=2] -b1_\markup { \huge Sinfonia } -b1^\markup { \teeny da } -b1-\markup { \normalsize camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \huge Sinfonia } + b1^\markup { \teeny da } + b1-\markup { \normalsize camera } +} @end lilypond It can be set relative to its previous value, -@lilypond[quote,verbatim,relative=2] -b1_\markup { \larger Sinfonia } -b1^\markup { \smaller da } -b1-\markup { \magnify #0.6 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \larger Sinfonia } + b1^\markup { \smaller da } + b1-\markup { \magnify #0.6 camera } +} @end lilypond It can be increased or decreased relative to the value set by the global staff size, -@lilypond[quote,verbatim,relative=2] -b1_\markup { \fontsize #-2 Sinfonia } -b1^\markup { \fontsize #1 da } -b1-\markup { \fontsize #3 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \fontsize #-2 Sinfonia } + b1^\markup { \fontsize #1 da } + b1-\markup { \fontsize #3 camera } +} @end lilypond It can also be set to a fixed point-size, regardless of the global staff size, -@lilypond[quote,verbatim,relative=2] -b1_\markup { \abs-fontsize #20 Sinfonia } -b1^\markup { \abs-fontsize #8 da } -b1-\markup { \abs-fontsize #14 camera } +@lilypond[quote,verbatim] +\relative b' { + b1_\markup { \abs-fontsize #20 Sinfonia } + b1^\markup { \abs-fontsize #8 da } + b1-\markup { \abs-fontsize #14 camera } +} +@end lilypond + +If the text includes spaces, then it is best to put it all inside quote +marks, so that the size of each space is appropriate for the size of the +other characters. + +@lilypond[quote,verbatim] +\markup \fontsize #6 \bold { Sinfonia da camera } +\markup \fontsize #6 \bold { "Sinfonia da camera" } @end lilypond @cindex subscript @cindex superscript @funindex \super -@funindex super @funindex \sub -@funindex sub @funindex \normal-size-super -@funindex normal-size-super Text may be printed as subscript or superscript. By default these are printed in a smaller size, but a normal size can be used as well: @@ -648,21 +668,13 @@ Defining custom font sets is also possible, as explained in @ref{Fonts}. @funindex \teeny -@funindex teeny @funindex \tiny -@funindex tiny @funindex \small -@funindex small @funindex \normalsize -@funindex normalsize @funindex \large -@funindex large @funindex \huge -@funindex huge @funindex \smaller -@funindex smaller @funindex \larger -@funindex larger @predefined @@ -720,39 +732,39 @@ objects can also be moved as a whole, using the syntax described in @cindex horizontal text alignment @funindex \left-align -@funindex left-align @funindex \center-align -@funindex center-align @funindex \right-align -@funindex right-align Markup objects may be aligned in different ways. By default, a text indication is aligned on its left edge: in the following example, there is no difference between the first and the second markup. -@lilypond[quote,verbatim,relative=2] -d1-\markup { poco } -f -d-\markup { \left-align poco } -f -d-\markup { \center-align { poco } } -f -d-\markup { \right-align poco } +@lilypond[quote,verbatim] +\relative { + d''1-\markup { poco } + f + d-\markup { \left-align poco } + f + d-\markup { \center-align { poco } } + f + d-\markup { \right-align poco } +} @end lilypond @funindex \halign -@funindex halign Horizontal alignment may be fine-tuned using a numeric value: -@lilypond[quote,verbatim,relative=2] -a1-\markup { \halign #-1 poco } -e' -a,-\markup { \halign #0 poco } -e' -a,-\markup { \halign #0.5 poco } -e' -a,-\markup { \halign #2 poco } +@lilypond[quote,verbatim] +\relative { + a'1-\markup { \halign #-1 poco } + e' + a,-\markup { \halign #0 poco } + e' + a,-\markup { \halign #0.5 poco } + e' + a,-\markup { \halign #2 poco } +} @end lilypond @noindent @@ -765,11 +777,8 @@ markup objects as a whole, as shown for instance in @cindex vertical text alignment @funindex \raise -@funindex raise @funindex \lower -@funindex lower @funindex \null -@funindex null @c QUERY Should the function of ``\null'' be clarified? rp @@ -781,50 +790,51 @@ another markup element or an invisible object. The following example demonstrates these two possibilities; the last markup in this example has no anchor point, and therefore is not moved. -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \raise #2 { Scène 1 } -} -a' -g_\markup { - \null - \lower #4 \bold { Très modéré } -} -a -d,^\markup { - \raise #4 \italic { Une forêt. } +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \raise #2 { Scène 1 } + } + a' + g_\markup { + \null + \lower #4 \bold { Très modéré } + } + a + d,^\markup { + \raise #4 \italic { Une forêt. } + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @funindex \general-align -@funindex general-align @funindex \translate -@funindex translate @funindex \translate-scaled -@funindex translate-scaled Some commands can affect both the horizontal and vertical alignment of text objects in markup mode. Any object affected by these commands must be preceded with an anchor point: -@lilypond[quote,verbatim,relative=1] -d2^\markup { - Acte I - \translate #'(-1 . 2) "Scène 1" -} -a' -g_\markup { - \null - \general-align #Y #3.2 \bold "Très modéré" -} -a -d,^\markup { - \null - \translate-scaled #'(-1 . 2) \teeny "Une forêt." +@lilypond[quote,verbatim] +\relative { + d'2^\markup { + Acte I + \translate #'(-1 . 2) "Scène 1" + } + a' + g_\markup { + \null + \general-align #Y #3.2 \bold "Très modéré" + } + a + d,^\markup { + \null + \translate-scaled #'(-1 . 2) \teeny "Une forêt." + } + a'4 a g2 a } -a'4 a g2 a @end lilypond @cindex multi-line markup @@ -835,9 +845,7 @@ a'4 a g2 a @cindex columns, text @funindex \column -@funindex column @funindex \center-column -@funindex center-column A markup object may include several lines of text. In the following example, each element or expression is placed on its own line, either @@ -864,7 +872,6 @@ left-aligned or centered: @cindex markup, centering on the page @funindex \fill-line -@funindex fill-line Similarly, a list of elements or expressions may be spread to fill the entire horizontal line width (if there is only one element, it will be @@ -896,9 +903,7 @@ multi-line text or any other markup expression: @cindex markup text, justified @funindex \wordwrap -@funindex wordwrap @funindex \justify -@funindex justify Long text indications can also be automatically wrapped accordingly to the given line width. These will be either left-aligned or justified, @@ -975,15 +980,10 @@ commands. @cindex markup text, framing @funindex \box -@funindex box @funindex \circle -@funindex circle @funindex \rounded-box -@funindex rounded-box @funindex \bracket -@funindex bracket @funindex \hbracket -@funindex hbracket Some markup commands allow decoration of text elements with graphics, as demonstrated in the following example. @@ -1010,13 +1010,9 @@ as demonstrated in the following example. @cindex markup text padding @funindex \pad-markup -@funindex pad-markup @funindex \pad-x -@funindex pad-x @funindex \pad-to-box -@funindex pad-to-box @funindex \pad-around -@funindex pad-around Some commands may require an increase in the padding around the text; this is achieved with some markup commands exhaustively described in @@ -1050,17 +1046,11 @@ Flute quartet keeps very uneven time." @cindex notation, graphic @funindex \combine -@funindex combine @funindex \draw-circle -@funindex draw-circle @funindex \filled-box -@funindex filled-box @funindex \triangle -@funindex triangle @funindex \draw-line -@funindex draw-line @funindex \arrow-head -@funindex arrow-head Other graphic elements or symbols may be printed without requiring any text. As with any markup expression, such objects can be combined. @@ -1087,9 +1077,7 @@ text. As with any markup expression, such objects can be combined. @cindex postscript @funindex \epsfile -@funindex epsfile @funindex \postscript -@funindex postscript Advanced graphic features include the ability to include external image files converted to the Encapsulated PostScript format @@ -1097,8 +1085,8 @@ image files converted to the Encapsulated PostScript format native PostScript code. In such a case, it may be useful to explicitly specify the size of the drawing, as demonstrated below: -@lilypond[quote,verbatim,relative=1] -c1^\markup { +@lilypond[quote,verbatim,fragment] +c'1^\markup { \combine \epsfile #X #10 #"./context-example.eps" \with-dimensions #'(0 . 6) #'(0 . 10) @@ -1114,7 +1102,7 @@ c1^\markup { closepath stroke" } -c +c' @end lilypond An exhaustive list of graphics-specific commands can be found in @@ -1122,9 +1110,10 @@ An exhaustive list of graphics-specific commands can be found in @seealso Notation Reference: -@ref{Graphic}, +@ref{Align}, +@ref{Dimensions}, @ref{Editorial annotations}, -@ref{Align}. +@ref{Graphic}. Installed Files: @file{scm/define-markup-commands.scm}, @@ -1149,38 +1138,40 @@ markup object. Notes and accidentals can be entered using markup commands: -@lilypond[quote,verbatim,relative=2] -a2 a^\markup { +@lilypond[quote,verbatim,fragment] +a'2 a'^\markup { \note #"4" #1 = \note-by-number #1 #1 #1.5 } -b1_\markup { +b'1_\markup { \natural \semiflat \flat \sesquiflat \doubleflat } \glissando -a1_\markup { +a'1_\markup { \natural \semisharp \sharp \sesquisharp \doublesharp } -\glissando b +\glissando b' @end lilypond Other notation objects may also be printed in markup mode: -@lilypond[quote,verbatim,relative=1] -g1 bes -ees\finger \markup \tied-lyric #"4~1" -fis_\markup { \dynamic rf } -bes^\markup { - \beam #8 #0.1 #0.5 -} -cis -d-\markup { - \markalphabet #8 - \markletter #8 +@lilypond[quote,verbatim] +\relative { + g1 bes + ees\finger \markup \tied-lyric #"4~1" + fis_\markup { \dynamic rf } + bes^\markup { + \beam #8 #0.1 #0.5 + } + cis + d-\markup { + \markalphabet #8 + \markletter #8 + } } @end lilypond @@ -1189,13 +1180,15 @@ separately in a markup object, as demonstrated below; an exhaustive list of these symbols and their names can be found in @ref{The Feta font}. -@lilypond[quote,verbatim,relative=2] -c2 -c'^\markup { \musicglyph #"eight" } -c,4 -c,8._\markup { \musicglyph #"clefs.G_change" } -c16 -c2^\markup { \musicglyph #"timesig.neomensural94" } +@lilypond[quote,verbatim] +\relative { + c''2 + c'^\markup { \musicglyph #"eight" } + c,4 + c,8._\markup { \musicglyph #"clefs.G_change" } + c16 + c2^\markup { \musicglyph #"timesig.neomensural94" } +} @end lilypond Another way of printing non-text glyphs is described in @@ -1205,20 +1198,22 @@ sizes. The markup mode also supports diagrams for specific instruments: -@lilypond[quote,verbatim,relative=2] -c1^\markup { - \fret-diagram-terse #"x;x;o;2;3;2;" -} -c^\markup { - \harp-pedal #"^-v|--ov^" -} -c -c^\markup { - \combine - \musicglyph #"accordion.discant" +@lilypond[quote,verbatim] +\relative { + c''1^\markup { + \fret-diagram-terse #"x;x;o;2;3;2;" + } + c^\markup { + \harp-pedal #"^-v|--ov^" + } + c + c^\markup { \combine - \raise #0.5 \musicglyph #"accordion.dot" - \raise #1.5 \musicglyph #"accordion.dot" + \musicglyph #"accordion.discant" + \combine + \raise #0.5 \musicglyph #"accordion.dot" + \raise #1.5 \musicglyph #"accordion.dot" + } } @end lilypond @@ -1234,15 +1229,17 @@ A whole score can even be nested inside a markup object. In such a case, the nested @code{\score} block must contain a @code{\layout} block, as demonstrated here: -@lilypond[quote,verbatim,relative=1] -c4 d^\markup { - \score { - \relative c' { c4 d e f } - \layout { } +@lilypond[quote,verbatim] +\relative { + c'4 d^\markup { + \score { + \relative { c'4 d e f } + \layout { } + } } + e f | + c d e f } -e f | -c d e f @end lilypond An exhaustive list of music notation related commands can be found in @@ -1275,11 +1272,8 @@ Internals Reference: @cindex text spread over multiple pages @funindex \markuplist -@funindex markuplist @funindex \justified-lines -@funindex justified-lines @funindex \wordwrap-lines -@funindex wordwrap-lines Although standard markup objects are not breakable, a specific syntax makes it possible to enter lines of text that can spread over multiple @@ -1329,7 +1323,6 @@ Internals Reference: @rinternals{TextScript}. @funindex \markuplist -@funindex markuplist @predefined @code{\markuplist}. @@ -1368,8 +1361,8 @@ ordered in several families. The following syntax allows various LilyPond @code{feta} non-text fonts to be used directly in markup mode: -@lilypond[quote,verbatim,relative=2] -a1^\markup { +@lilypond[quote,verbatim,fragment] +a'1^\markup { \vcenter { \override #'(font-encoding . fetaBraces) \lookup #"brace120" @@ -1394,32 +1387,32 @@ value must be determined by trial and error. These glyphs are all left braces; right braces may be obtained by rotation, see @ref{Rotating objects}. -Three families of text fonts are made available: the @emph{roman} -(serif) font, that defaults to New Century Schoolbook, the -@emph{sans} font and the monospaced @emph{typewriter} font -- these -last two families are determined by the Pango installation. - -@warning{There are no default fonts associated with the @emph{sans} -and @emph{typewriter} font-families. An input file that specifies -either of these can lead to different output on different computers. -To ensure consistent output among multiple platforms, fonts must be -specified by name, and those fonts must be available on any system -that processes the file. See @ref{Single entry fonts} and -@ref{Entire document fonts}.} +Three families of text fonts are made available: +@itemize +@item +The @emph{roman} (serif) font, +which defaults to LilyPond Serif (an alias of TeX Gyre Schola). +@item +The @emph{sans} font, +which defaults to LilyPond Sans Serif (an alias of TeX Gyre Heros). +@item +The @emph{typewriter} (monospaced) font, +which defaults to LilyPond Monospace (an alias of TeX Gyre Cursor). +@end itemize Each family may include different shapes and series. The following example demonstrates the ability to select alternate families, shapes, series and sizes. The value supplied to @code{font-size} is the required change from the default size. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Score.RehearsalMark.font-family = #'typewriter \mark \markup "Ouverture" \override Voice.TextScript.font-shape = #'italic \override Voice.TextScript.font-series = #'bold -d2.^\markup "Allegro" +d''2.^\markup "Allegro" \override Voice.TextScript.font-size = #-3 -c4^smaller +c''4^smaller @end lilypond @noindent @@ -1468,14 +1461,14 @@ Notation Reference: Any font that is installed on the operating system and recognized by FontConfig may be used in a score, using the following syntax: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.TimeSignature.font-name = #"Bitstream Charter" \override Staff.TimeSignature.font-size = #2 \time 3/4 -a1_\markup { - \override #'(font-name . "Vera Bold") - { Vera Bold } +a'1_\markup { + \override #'(font-name . "Bitstream Vera Sans,sans-serif, Oblique Bold") + { Vera Oblique Bold } } @end lilypond @@ -1484,10 +1477,16 @@ a1_\markup { @cindex listing available fonts @cindex available fonts, listing +@var{font-name} can be described using a comma-separated list of @q{fonts} +and a white-space separated list of @q{styles}. +As long as the @q{font} in the list is installed +and contains requested glyph, it will be used, +otherwise the @emph{next} font in the list will be used instead. + @funindex show-available-fonts -The following command displays a list of all available fonts on the -operating system: +Running lilypond with the following option displays a list of all +available fonts on the operating system: @example lilypond -dshow-available-fonts x @@ -1513,7 +1512,9 @@ It is possible to change the fonts to be used as the default fonts in the @emph{roman}, @emph{sans} and @emph{typewriter} font families by specifying them, in that order, as shown in the example below, which automatically scales the fonts with the value set for the global staff -size. For an explanation of fonts, see @ref{Fonts explained}. +size. Similar to @ref{Single entry fonts}, it can be described using a +comma-separated list of @q{fonts}. However, font @q{styles} can not be +described. For an explanation of fonts, see @ref{Fonts explained}. @cindex font families, setting @cindex fonts, changing for entire document @@ -1524,7 +1525,7 @@ size. For an explanation of fonts, see @ref{Fonts explained}. \paper { #(define fonts (make-pango-font-tree "Times New Roman" - "Nimbus Sans" + "Nimbus Sans,Nimbus Sans L" "Luxi Mono" (/ staff-height pt 20))) } diff --git a/Documentation/notation/unfretted-strings.itely b/Documentation/notation/unfretted-strings.itely index fcaff9d4dc..becdc6f3e1 100644 --- a/Documentation/notation/unfretted-strings.itely +++ b/Documentation/notation/unfretted-strings.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.18.0" @node Unfretted string instruments @section Unfretted string instruments @@ -85,12 +85,14 @@ Snippets: @funindex \upbow @funindex \downbow @funindex \open +@funindex \romanStringNumbers @cindex bowing indications @cindex up bow indication @cindex down bow indication @cindex open string indication @cindex string, indicating open +@cindex string numbers Bowing indications are created as articulations, which are described in @ref{Articulations and ornamentations}. @@ -98,30 +100,39 @@ described in @ref{Articulations and ornamentations}. The bowing commands, @code{\upbow} and @code{\downbow}, are used with slurs as follows: -@lilypond[verbatim,quote,relative=2] -c4(\downbow d) e(\upbow f) +@lilypond[verbatim,quote] +\relative { c''4(\downbow d) e(\upbow f) } @end lilypond @noindent -and the following example shows three ways in which an open A -string on a violin might be indicated: -@lilypond[verbatim,quote,relative=2] -a4 \open -a^\markup { \teeny "II" } -a2^\markup { \small "sul A" } +Roman numerals can be added as strings numbers (rather +than the default circled Arabic numbers), as explained in +@ref{String number indications}. + +Alternatively, string indications may be printed using +markup commands; articulation scripts may also indicate +open strings. + +@lilypond[verbatim,quote,fragment] +a'4 \open +\romanStringNumbers +a'\2 +a'2^\markup { \small "sul A" } @end lilypond @predefined @code{\downbow}, @code{\upbow}, -@code{\open}. +@code{\open}, +@code{\romanStringNumbers}. @endpredefined @seealso Notation Reference: @ref{Articulations and ornamentations}, +@ref{String number indications}, @ref{Slurs}. @@ -143,21 +154,23 @@ Natural harmonics can be notated in several ways. A diamond-shaped note head generally means to touch the string where you would stop the note if it were not a diamond. -@lilypond[verbatim,quote,relative=2] -d4 e4. -\harmonicsOn -d8 e e -d4 e4. -\harmonicsOff -d8 e e +@lilypond[verbatim,quote] +\relative d'' { + d4 e4. + \harmonicsOn + d8 e e + d4 e4. + \harmonicsOff + d8 e e +} @end lilypond Alternatively a normal note head is shown at the pitch to be sounded together with a small circle to indicate it should be played as a harmonic: -@lilypond[verbatim,quote,relative=2] -d2^\flageolet d_\flageolet +@lilypond[verbatim,quote,fragment] +d''2^\flageolet d''_\flageolet @end lilypond A smaller circle may be created, see the snippet list in @@ -177,10 +190,12 @@ Artificial harmonics indicated with @code{\harmonic} do not show the dots. The context property @code{harmonicDots} should be set if dots are required. -@lilypond[verbatim,quote,relative=1] -2. 4 -\set harmonicDots = ##t -2. 4 +@lilypond[verbatim,quote] +\relative e' { + 2. 4 + \set harmonicDots = ##t + 2. 4 +} @end lilypond @warning{@code{@bs{}harmonic} @strong{must} be placed inside a @@ -208,11 +223,13 @@ A @notation{snap pizzicato} (also known as @qq{Bartok pizz}) is a type of pizzicato where the string is deliberately plucked upwards (rather than sideways) such that it hits the fingerboard. -@lilypond[verbatim,quote,relative=1] -c4\snappizzicato -4\snappizzicato -4^\snappizzicato -4_\snappizzicato +@lilypond[verbatim,quote] +\relative { + c'4\snappizzicato + 4\snappizzicato + 4^\snappizzicato + 4_\snappizzicato +} @end lilypond diff --git a/Documentation/notation/vocal.itely b/Documentation/notation/vocal.itely index 06aa65d46d..b06de6f40b 100644 --- a/Documentation/notation/vocal.itely +++ b/Documentation/notation/vocal.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.30" +@c \version "2.19.21" @node Vocal music @section Vocal music @@ -156,7 +156,7 @@ into the input file, providing it is saved with UTF-8 encoding. For more information, see @ref{Special characters}. @lilypond[quote,verbatim] -\relative c'' { d8 c16 a bes8 f e' d c4 } +\relative { d''8 c16 a bes8 f ees' d c4 } \addlyrics { „Schad’ um das schö -- ne grü -- ne Band, } @end lilypond @@ -165,7 +165,7 @@ with a backslash character and the whole syllable has to be enclosed between additional quotes. For example, @lilypond[quote,verbatim] -\relative c' { \time 3/4 e4 e4. e8 d4 e d c2. } +\relative { \time 3/4 e'4 e4. e8 d4 e d c2. } \addlyrics { "\"I" am so lone -- "ly,\"" said she } @end lilypond @@ -218,13 +218,22 @@ Snippets: @funindex \addlyrics @funindex \lyricsto -Lyrics are printed by interpreting them in the context called -@code{Lyrics}, see @ref{Contexts explained}. +Lyrics are interpreted in @code{\lyricmode} and printed in a +@code{Lyrics} context, see @ref{Contexts explained}. @example \new Lyrics \lyricmode @{ @dots{} @} @end example +Two variants of @code{\lyricmode} additionally set an associated +context used to synchronise the lyric syllables to music. The more +convenient @code{\addlyrics} immediately follows the musical content +of the Voice context with which it should be synchronised, implicitly +creating a Lyrics context of its own. The more versatile +@code{\lyricsto} requires both specifying the associated Voice context +by name and explicitly creating a containing Lyrics context. For +details see @ref{Automatic syllable durations}. + Lyrics can be aligned with melodies in two main ways: @itemize @@ -240,13 +249,13 @@ For more details, see @ref{Automatic syllable durations}. << \new Staff << \time 2/4 - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \voiceOne - c4 b8. a16 g4. r8 a4 ( b ) c2 + c''4 b8. a16 g4. r8 a4 ( b ) c2 } - \new Voice = "two" \relative c' { + \new Voice = "two" \relative { \voiceTwo - s2 s4. f8 e4 d c2 + s2 s4. f'8 e4 d c2 } >> @@ -280,9 +289,9 @@ and entered with @code{\lyricmode}. @lilypond[quote,ragged-right,verbatim] << - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \time 2/4 - c4 b8. a16 g4. f8 e4 d c2 + c''4 b8. a16 g4. f8 e4 d c2 } % uses previous explicit duration of 2; @@ -309,11 +318,6 @@ see @ref{Manual syllable durations}. This technique is also useful when setting dialogue over music; for examples showing this, see @ref{Dialogue over music}. -When entered in this way the words are left-aligned to the notes -by default, but may be center-aligned to the notes of a melody by -specifying an associated voice, if one exists. For details, see -@ref{Manual syllable durations}. - @end itemize @seealso @@ -380,10 +384,10 @@ Lyrics can be aligned under a melody automatically by specifying the named Voice context containing the melody with @code{\lyricsto}: -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] << - \new Voice = "melody" { - a1 a4. a8 a2 + \new Voice = "melody" \relative { + a'1 a4. a8 a2 } \new Lyrics \lyricsto "melody" { These are the words @@ -397,9 +401,9 @@ context, which must already exist. Therefore normally the @code{Voice} context is specified first, followed by the @code{Lyrics} context. The lyrics themselves follow the @code{\lyricsto} command. The @code{\lyricsto} command -invokes lyric mode automatically, so the @code{\lyricmode} keyword -may be omitted. By default, the lyrics are placed underneath the -notes. For other placements, see @ref{Placing lyrics vertically}. +invokes lyric mode automatically. By default, the lyrics are placed +underneath the notes. For other placements, see +@ref{Placing lyrics vertically}. @subheading Using @code{\addlyrics} @@ -428,7 +432,7 @@ Here is an example, @lilypond[verbatim,quote] { \time 3/4 - \relative c' { c2 e4 g2. } + \relative { c'2 e4 g2. } \addlyrics { play the game } } @end lilypond @@ -440,7 +444,7 @@ More stanzas can be added by adding more @lilypond[ragged-right,verbatim,quote] { \time 3/4 - \relative c' { c2 e4 g2. } + \relative { c'2 e4 g2. } \addlyrics { play the game } \addlyrics { speel het spel } \addlyrics { joue le jeu } @@ -473,13 +477,13 @@ Here is an example demonstrating its use: << \new Staff << \time 2/4 - \new Voice = "one" \relative c'' { + \new Voice = "one" \relative { \voiceOne - c4 b8. a16 g4. r8 a4 ( b ) c2 + c''4 b8. a16 g4. r8 a4 ( b ) c2 } - \new Voice = "two" \relative c' { + \new Voice = "two" \relative { \voiceTwo - s2 s4. f8 e8 d4. c2 + s2 s4. f'8 e8 d4. c2 } >> % takes durations and alignment from notes in "one" initially @@ -509,21 +513,19 @@ completely independently of notes. In this case do not use but with pitches replaced by text -- and the duration of each syllable is entered explicitly after the syllable. -By default, syllables will be left-aligned to the corresponding -musical moment. Hyphenated lines may be drawn between syllables +Hyphenated lines may be drawn between syllables as usual, but extender lines cannot be drawn when there is no associated voice. Here are two examples: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { - \time 3/4 - c2 e4 g2 f + \new Voice = "melody" \relative { + c''2 a f f e e } \new Lyrics \lyricmode { - play1 the4 game4 + c4. -- a -- f -- f -- e2. -- e } >> @end lilypond @@ -532,8 +534,8 @@ Here are two examples: @lilypond[quote,verbatim,ragged-right] << \new Staff { - \relative c'' { - c2 c2 + \relative { + c''2 c2 d1 } } @@ -543,8 +545,8 @@ Here are two examples: } } \new Staff { - \relative c' { - c8 c c c c c c c + \relative { + c'8 c c c c c c c c8 c c c c c c c } } @@ -554,27 +556,22 @@ Here are two examples: This technique is useful when writing dialogue over music, see @ref{Dialogue over music}. -To center-align syllables on the notes at the corresponding musical -moments, set @code{associatedVoice} to the name of the Voice context -containing those notes. When @code{associatedVoice} is set, both -double hyphens and double underscores can be used to draw -hyphenated lines and extenders under melismata correctly. +To change syllable alignment, simply override the @code{self-alignment-X} +property: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - c2 e4 g f g + c'2 e4 g2 f } \new Lyrics \lyricmode { - \set associatedVoice = #"melody" - play2 the4 game2. __ + \override LyricText.self-alignment-X = #LEFT + play1 a4 game4 } >> @end lilypond -@c TODO see also feature request 707 - show how to do this with manual durations - @seealso Notation Reference: @ref{Dialogue over music}. @@ -597,10 +594,11 @@ spaces between the syllables, you can surround the phrase with quotes or use a @code{_} character. Alternatively, you can use the tilde symbol (@code{~}) to get a lyric tie. -@lilypond[quote,ragged-right,verbatim,relative=2] +@lilypond[quote,ragged-right,verbatim] { - { \autoBeamOff - r8 b c fis, fis c' b e, + \relative { + \autoBeamOff + r8 b' c fis, fis c' b e, } \addlyrics { @@ -649,13 +647,13 @@ There are five ways in which melismata can be indicated: Melismata are created automatically over notes which are tied together: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g2 ~ | - g4 e2 ~ | - e8 + f''4 g2 ~ | + 4 e2 ~ | + 8 } \new Lyrics \lyricsto "melody" { Ky -- ri -- e __ @@ -668,11 +666,11 @@ Melismata can be created automatically from the music by placing slurs over the notes of each melisma. This is the usual way of entering lyrics: -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 ( f e f ) + f''4 g8 ( f e f ) e8 ( d e2 ) } \new Lyrics \lyricsto "melody" { @@ -688,12 +686,12 @@ Notes are considered a melisma if they are manually beamed, providing automatic beaming is switched off. See @ref{Setting automatic beam behavior}. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \autoBeamOff - f4 g8[ f e f] + f''4 g8[ f e f] e2. } \new Lyrics \lyricsto "melody" { @@ -709,11 +707,11 @@ than eighth notes. An unslurred group of notes will be treated as a melisma if they are bracketed between @code{\melisma} and @code{\melismaEnd}. -@lilypond[quote,relative=2,verbatim] +@lilypond[quote,verbatim] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 + f''4 g8 \melisma f e f \melismaEnd @@ -730,11 +728,11 @@ A melisma can be defined entirely in the lyrics by entering a single underscore character, @code{_}, for every extra note that has to be added to the melisma. -@lilypond[verbatim, quote, relative=2] +@lilypond[verbatim, quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 - f4 g8 f e f + f''4 g8 f e f e8 d e2 } \new Lyrics \lyricsto "melody" { @@ -749,13 +747,13 @@ It is possible to have ties, slurs and manual beams in the melody without their indicating melismata. To do this, set @code{melismaBusyProperties}: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \set melismaBusyProperties = #'() - c4 d ( e ) - g8 [ f ] f4 ~ f + c'4 d ( e ) + g8 [ f ] f4 ~ 4 } \new Lyrics \lyricsto "melody" { Ky -- ri -- e e -- le -- i -- son @@ -777,13 +775,13 @@ If a melisma is required during a passage in which placing a single underscore in the lyrics for each note which should be included in the melisma: -@lilypond[relative=1,verbatim,quote] +@lilypond[verbatim,quote] << - \new Voice = "melody" { + \new Voice = "melody" \relative { \time 3/4 \set melismaBusyProperties = #'() - c4 d ( e ) - g8 [ f ] ~ f4 ~ f + c'4 d ( e ) + g8 [ f ] ~ 4 ~ f } \new Lyrics \lyricsto "melody" { Ky -- ri -- _ e __ _ _ _ @@ -887,8 +885,8 @@ Variables containing lyrics can be created, but the lyrics must be entered in lyric mode: @lilypond[quote,verbatim] -musicOne = \relative c'' { - c4 b8. a16 g4. f8 e4 d c2 +musicOne = \relative { + c''4 b8. a16 g4. f8 e4 d c2 } verseOne = \lyricmode { Joy to the world, the Lord is come. @@ -917,8 +915,8 @@ voices referenced by @code{\lyricsto} have always been defined earlier. For example: @lilypond[quote,verbatim] -sopranoMusic = \relative c'' { c4 c c c } -contraltoMusic = \relative c'' { a4 a a a } +sopranoMusic = \relative { c''4 c c c } +contraltoMusic = \relative { a'4 a a a } sopranoWords = \lyricmode { Sop -- ra -- no words } contraltoWords = \lyricmode { Con -- tral -- to words } @@ -976,7 +974,7 @@ context: << \new Staff { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics { @@ -998,7 +996,7 @@ specify the position of the lyrics: << \new Staff = "staff" { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics \with { alignAboveContext = "staff" } { @@ -1025,7 +1023,7 @@ follows: } \new Staff { \new Voice = "melody" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \context Lyrics = "lyrics" { @@ -1046,7 +1044,7 @@ is an example of the second method: \new ChoirStaff << \new Staff { \new Voice = "sopranos" { - \relative c'' { c4 c c c } + \relative { c''4 c c c } } } \new Lyrics = "sopranos" @@ -1056,7 +1054,7 @@ is an example of the second method: } \new Staff { \new Voice = "contraltos" { - \relative c'' { a4 a a a } + \relative { a'4 a a a } } } \context Lyrics = "sopranos" { @@ -1099,8 +1097,8 @@ Notation Reference: To increase the spacing between lyrics, set the @code{minimum-distance} property of @code{LyricSpace}. -@lilypond[relative=1,verbatim,quote,ragged-right] -{ +@lilypond[verbatim,quote,ragged-right] +\relative c' { c c c c \override Lyrics.LyricSpace.minimum-distance = #1.0 c c c c @@ -1117,8 +1115,8 @@ To make this change for all lyrics in the score, set the property in the @lilypond[verbatim,quote,ragged-right] \score { - \relative c' { - c c c c + \relative { + c' c c c c c c c } \addlyrics { @@ -1182,8 +1180,8 @@ unchanged. << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1207,8 +1205,8 @@ unfolded. << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1232,8 +1230,8 @@ simply enter all the words: << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat unfold 2 { b4 b b b } } } @@ -1258,8 +1256,8 @@ correctly nested in parallel sections: << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b b b } } } @@ -1285,8 +1283,8 @@ More verses may be added in a similar way: << \new Staff { \new Voice = "singleVoice" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 3 { b4 b b b } c4 c c c } @@ -1325,8 +1323,8 @@ To position them correctly use @code{alignBelowContext}: << \new Staff { \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 3 { b4 b b b } c4 c c c } @@ -1350,8 +1348,8 @@ To position them correctly use @code{alignBelowContext}: The end sec -- tion. } \new Voice = "harmony" { - \relative c' { - f4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 + \relative { + f'4 f f f \repeat volta 2 { g8 g g4 g2 } a4 a8. a16 a2 } } >> @@ -1368,8 +1366,11 @@ To position them correctly use @code{alignBelowContext}: @cindex repeating lyrics with alternative endings @cindex alternative endings and lyrics -If the words of the repeated section are the same, exactly the -same structure can be used for both the lyrics and music. +If the words of the repeated section are the same, and none of the +@code{\alternative} blocks start with a rest, exactly the same +structure can be used for both the lyrics and music. This has the +advantage that @code{\unfoldRepeats} will expand both music and +lyrics correctly. @lilypond[quote,verbatim] \score { @@ -1377,8 +1378,8 @@ same structure can be used for both the lyrics and music. \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - a4 a a a + \relative { + a'4 a a a \repeat volta 2 { b4 b } \alternative { { b b } { b c } } } @@ -1399,7 +1400,8 @@ same structure can be used for both the lyrics and music. @cindex skipping notes in lyrics @cindex lyrics, skipping notes -But when the repeated section has different words, a repeat +But when the repeated section has different words, or when one +of the @code{\alternative} blocks starts with a rest, a repeat construct cannot be used around the words and @code{\skip} commands have to be inserted manually to skip over the notes in the alternative sections which do not apply. @@ -1420,8 +1422,8 @@ value, irrespective of the value of the following number.} \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b } + \relative { + \repeat volta 2 { b'4 b } \alternative { { b b } { b c } } c4 c } @@ -1467,9 +1469,9 @@ melismata over the volta section and insert manual skips. \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { + \relative { \set melismaBusyProperties = #'() - \repeat volta 2 { b4 b ~} + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } \unset melismaBusyProperties c4 c @@ -1504,8 +1506,8 @@ be inserted manually, as before. \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b ~} + \relative { + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } c4 c } @@ -1537,8 +1539,8 @@ alternative sections these must be inserted manually. \new Staff { \time 2/4 \new Voice = "melody" { - \relative c'' { - \repeat volta 2 { b4 b ~} + \relative { + \repeat volta 2 { b'4 b ~} \alternative { { b b } { b \repeatTie c } } c4 c } @@ -1609,11 +1611,11 @@ attaching lyrics to those specific contexts: \score { << \new Voice = "melody" { - \relative c' { + \relative { << { \voiceOne - e4 e8 e + e'4 e8 e } \new Voice = "splitpart" { \voiceTwo @@ -1694,13 +1696,6 @@ words = \lyricmode { la __ la __ } >> @end lilypond -The @code{NullVoice} context must be placed within a @code{Staff} -context and contain notes that are already being displayed in that staff and that are also in the same octave. Otherwise the -@code{NullVoice} may interact with the printed voices in -unexpected ways. For example, arbitrary notes in the -@code{NullVoice} may cause accidentals to appear (or disappear) on -the staff. - This method also can be used with the @code{\partcombine} function, which does not allow lyrics on its own: @@ -1735,24 +1730,14 @@ altoTwo = \relative { d'2 g4( fis8 g) } aligner = \relative { b'8( c d c) d( d d d) } words = \lyricmode { la __ la __ } -\new ChoirStaff << - \new Staff << - \soprano - \new NullVoice = "aligner" \aligner - >> +\new ChoirStaff \with {\accepts NullVoice } << + \new Staff \soprano + \new NullVoice = "aligner" \aligner \new Lyrics \lyricsto "aligner" \words \new Staff \partcombine \altoOne \altoTwo >> @end lilypond -However, note that in the second half of the measure above, the -notes in the @code{NullVoice} context reflect the rhythm of the -lower staff, but they do not deviate from the single pitch being -displayed in the staff to which the @code{NullVoice} belongs. -While not actually required in this particular example, it is a -good idea in general to enter the notes in this way. - - @node Stanzas @subsection Stanzas @@ -1773,9 +1758,9 @@ good idea in general to enter the notes in this way. Stanza numbers can be added by setting @code{stanza}, e.g., -@lilypond[quote,ragged-right,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. +@lilypond[quote,ragged-right,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. } \addlyrics { \set stanza = #"1. " Hi, my name is Bert. @@ -1858,9 +1843,9 @@ the line, just like instrument names. They are created by setting @code{vocalName}. A short version may be entered as @code{shortVocalName}. -@lilypond[ragged-right,quote,verbatim,relative=2] -\new Voice { - \time 3/4 g2 e4 a2 f4 g2. +@lilypond[ragged-right,quote,verbatim] +\new Voice \relative { + \time 3/4 g'2 e4 a2 f4 g2. } \addlyrics { \set vocalName = #"Bert " Hi, my name is Bert. @@ -1886,9 +1871,9 @@ voice ignore the melisma. This is done by setting @lilypond[verbatim,ragged-right,quote] << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 \slurDotted f8.[( g16]) a4 @@ -1923,8 +1908,8 @@ changed: @lilypond[verbatim,ragged-right,quote] << - \new Voice = melody \relative c' { - f4 \appoggiatura a32 b4 + \new Voice = melody \relative { + f'4 \appoggiatura a32 b4 \grace { f16 a16 } b2 \afterGrace b2 { f16[ a16] } \appoggiatura a32 b4 @@ -1975,9 +1960,9 @@ within the lyrics by setting the @code{associatedVoice} property: @lilypond[verbatim,quote] << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 << \new Voice = "alternative" { \voiceOne @@ -2051,8 +2036,8 @@ different ways to force linebreaks when using @code{\markup}. @lilypond[ragged-right,verbatim,quote] -melody = \relative c' { -e d c d | e e e e | +melody = \relative { +e' d c d | e e e e | d d e d | c1 | } @@ -2093,8 +2078,8 @@ introduces each verse. The following example shows how to produce such output in LilyPond. @lilypond[ragged-right,quote,verbatim] -melody = \relative c' { - c4 c c c | d d d d +melody = \relative { + c'4 c c c | d d d d } text = \lyricmode { @@ -2282,6 +2267,8 @@ Several common topics in choral music are described fully elsewhere: @item An introduction to creating an SATB vocal score can be found in the Learning Manual, see @rlearning{Four-part SATB vocal score}. +There is also a built-in template which simplifies the entry of +SATB vocal music, see @rlearning{Built-in templates}. @item Several templates suitable for various styles of choral music can @@ -2385,12 +2372,12 @@ above their respective staves, as shown here: \new ChoirStaff << \new Staff { \new Voice { - \relative c'' { g4\f g g g } + \relative { g'4\f g g g } } } \new Staff { \new Voice { - \relative c' { d4 d d\p d } + \relative { d'4 d d\p d } } } >> @@ -2416,7 +2403,7 @@ Notation Reference: @ref{Score layout}, @ref{Separating systems}, @ref{Setting the staff size}, -@ref{Using an extra voice for breaks}, +@ref{Breaks}, @ref{Vertical spacing}. Internals Reference: @@ -2562,9 +2549,9 @@ staff is dedicated to that character alone: \new Staff { \set Staff.vocalName = \markup \smallCaps Kaspar \set Staff.shortVocalName = \markup \smallCaps Kas. - \relative c' { + \relative { \clef "G_8" - c4 c c c + c'4 c c c \break c4 c c c } @@ -2573,7 +2560,7 @@ staff is dedicated to that character alone: \set Staff.vocalName = \markup \smallCaps Melchior \set Staff.shortVocalName = \markup \smallCaps Mel \clef "bass" - \relative c' { + \relative { a4 a a a a4 a a a } @@ -2587,64 +2574,57 @@ usually printed above the staff at the start of every section applying to that character. This can be done with markup. Often a specific font is used for this purpose. -@lilypond[quote,verbatim,relative=1] -\clef "G_8" -c4^\markup \fontsize #1 \smallCaps Kaspar -c c c -\clef "bass" -a4^\markup \fontsize #1 \smallCaps Melchior -a a a -\clef "G_8" -c4^\markup \fontsize #1 \smallCaps Kaspar -c c c +@lilypond[quote,verbatim] +\relative c' { + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c + \clef "bass" + a4^\markup \fontsize #1 \smallCaps Melchior + a a a + \clef "G_8" + c4^\markup \fontsize #1 \smallCaps Kaspar + c c c +} @end lilypond -Alternatively, if there are many character changes, it may be -easier to set up @qq{instrument} definitions for each character at -the top level so that @code{\instrumentSwitch} can be used to -indicate each change. +Alternatively, if there are many character changes, it may be easier +to set up variables to hold the definitions for each character so +that the switch of characters can be indicated easily and concisely. @lilypond[quote,verbatim] -\addInstrumentDefinition #"kaspar" - #`((instrumentTransposition . ,(ly:make-pitch -1 0 0)) - (shortInstrumentName . "Kas.") - (clefGlyph . "clefs.G") - (clefTransposition . -7) - (middleCPosition . 1) - (clefPosition . -2) - (instrumentCueName . ,(markup #:fontsize 1 #:smallCaps "Kaspar")) - (midiInstrument . "voice oohs")) - -\addInstrumentDefinition #"melchior" - #`((instrumentTransposition . ,(ly:make-pitch 0 0 0)) - (shortInstrumentName . "Mel.") - (clefGlyph . "clefs.F") - (clefTransposition . 0) - (middleCPosition . 6) - (clefPosition . 2) - (instrumentCueName . ,(markup #:fontsize 1 #:smallCaps "Melchior")) - (midiInstrument . "choir aahs")) +kaspar = { + \clef "G_8" + \set Staff.shortVocalName = "Kas." + \set Staff.midiInstrument = "voice oohs" + <>^\markup \smallCaps "Kaspar" +} + +melchior = { + \clef "bass" + \set Staff.shortVocalName = "Mel." + \set Staff.midiInstrument = "choir aahs" + <>^\markup \smallCaps "Melchior" +} \relative c' { - \instrumentSwitch "kaspar" + \kaspar c4 c c c - \instrumentSwitch "melchior" + \melchior a4 a a a - \instrumentSwitch "kaspar" + \kaspar c4 c c c } @end lilypond @seealso +Learning Manual: +@rlearning{Organizing pieces with variables}. + Notation Reference: -@ref{Instrument names}, -@ref{Scheme functions}, @ref{Text}, @ref{Text markup commands}. -Extending LilyPond: -@rextend{Markup construction in Scheme}. - @node Musical cues @unnumberedsubsubsec Musical cues @@ -2668,22 +2648,19 @@ close to the start of the cue notes. The following example shows how this is done. @lilypond[quote,verbatim] -flute = \relative c'' { - s4 s4 e g +flute = \relative { + s4 s4 e'' g } \addQuote "flute" { \flute } -pianoRH = \relative c'' { - c4. g8 +pianoRH = \relative { + c''4. g8 % position name of cue-ing instrument just before the cue notes, % and above the staff - \new CueVoice { - \override InstrumentSwitch.self-alignment-X = #RIGHT - \set instrumentCueName = "Flute" - } + <>^\markup { \right-align { \tiny "Flute" } } \cueDuring "flute" #UP { g4 bes4 } } -pianoLH = \relative c { c4 e, } +pianoLH = \relative { c4 e, } \score { \new PianoStaff << @@ -2703,11 +2680,7 @@ specify its key so the conversion of its cue notes will be done automatically. The example below shows this transposition for a B-flat clarinet. The notes in this example are low on the staff so @code{DOWN} is specified in @code{\cueDuring} (so the stems are -down) and the instrument name is positioned below the staff. Note -also that the piano right-hand voice is explicitly declared. This -is because the cue notes in this example begin at the start of the -first bar and this would otherwise cause the entire piano right-hand -notes to be placed in a @code{CueVoice} context. +down) and the instrument name is positioned below the staff. @lilypond[quote,verbatim] clarinet = \relative c' { @@ -2719,15 +2692,11 @@ clarinet = \relative c' { pianoRH = \relative c'' { \transposition c' % position name of cue-ing instrument below the staff - \new CueVoice { - \override InstrumentSwitch.self-alignment-X = #RIGHT - \override InstrumentSwitch.direction = #DOWN - \set instrumentCueName = "Clar." - } + <>_\markup { \right-align { \tiny "Clar." } } \cueDuring "clarinet" #DOWN { c4. g8 } g4 bes4 } -pianoLH = \relative c { c4 e, } +pianoLH = \relative { c4 e, } \score { << @@ -2771,7 +2740,6 @@ Snippets: @rlsr{Vocal music}. Internals Reference: -@rinternals{InstrumentSwitch}, @rinternals{CueVoice}. @knownissues @@ -2807,10 +2775,12 @@ moment. For short interjections a simple markup suffices. -@lilypond[quote,verbatim,relative=2] -a4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a -a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a -a4 a a a +@lilypond[quote,verbatim] +\relative { + a'4^\markup { \smallCaps { Alex - } \italic { He's gone } } a a a + a4 a a^\markup { \smallCaps { Bethan - } \italic Where? } a + a4 a a a +} @end lilypond For longer phrases it may be necessary to expand the music to make @@ -2837,8 +2807,8 @@ Here is an example illustrating how this might be done. @c manually adjusted to suit the imposed line length. -td @lilypond[quote,verbatim,ragged-right] -music = \relative c'' { - \repeat unfold 3 { a4 a a a } +music = \relative { + \repeat unfold 3 { a'4 a a a } } dialogue = \lyricmode { @@ -2939,15 +2909,15 @@ all staves remove the bar line engraver completely: \score { \new StaffGroup << \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } } \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -2969,15 +2939,15 @@ Bar lines can also be removed on a staff-by-staff basis: \new ChoirStaff << \new Staff \with { \remove "Bar_engraver" } { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } } \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -2990,34 +2960,38 @@ To remove bar lines from just a section of music treat it as a cadenza. If the section is long you may need to insert dummy bar lines with @code{\bar ""} to show where the line should break. -@lilypond[verbatim,quote,relative=2] -a4 b c2 | -\cadenzaOn -a4 b c2 -a4 b c2 -\bar "" -a4 b c2 -a4 b c2 -\cadenzaOff -a4 b c2 | -a4 b c2 | +@lilypond[verbatim,quote] +\relative a' { + a4 b c2 | + \cadenzaOn + a4 b c2 + a4 b c2 + \bar "" + a4 b c2 + a4 b c2 + \cadenzaOff + a4 b c2 | + a4 b c2 | +} @end lilypond Rests or pauses in chants can be indicated by modified bar lines. -@lilypond[verbatim, quote,relative=2] -a4 -\cadenzaOn -b c2 -a4 b c2 -\bar "'" -a4 b c2 -a4 b c2 -\bar ";" -a4 b c2 -\bar "!" -a4 b c2 -\bar "||" +@lilypond[verbatim, quote] +\relative a' { + a4 + \cadenzaOn + b c2 + a4 b c2 + \bar "'" + a4 b c2 + a4 b c2 + \bar ";" + a4 b c2 + \bar "!" + a4 b c2 + \bar "||" +} @end lilypond Alternatively, the notation used in Gregorian chant for pauses or @@ -3047,8 +3021,8 @@ finalis = { } \score { - \relative c'' { - g2 a4 g + \relative { + g'2 a4 g \divisioMinima g2 a4 g \divisioMaior @@ -3071,8 +3045,8 @@ Chants usually omit the time signature and often omit the clef too. @lilypond[verbatim,quote] \score { \new Staff { - \relative c'' { - a4 b c2 | + \relative { + a'4 b c2 | a4 b c2 | a4 b c2 | } @@ -3097,22 +3071,22 @@ in each half always contains a single chord of whole notes. This is the @qq{reciting note}. Chants are usually centered on the page. @lilypond[verbatim,quote] -SopranoMusic = \relative g' { - g1 | c2 b | a1 | \bar "||" +SopranoMusic = \relative { + g'1 | c2 b | a1 | \bar "||" a1 | d2 c | c b | c1 | \bar "||" } -AltoMusic = \relative c' { - e1 | g2 g | f1 | +AltoMusic = \relative { + e'1 | g2 g | f1 | f1 | f2 e | d d | e1 | } -TenorMusic = \relative a { - c1 | c2 c | c1 | +TenorMusic = \relative { + c'1 | c2 c | c1 | d1 | g,2 g | g g | g1 | } -BassMusic = \relative c { +BassMusic = \relative { c1 | e2 e | f1 | d1 | b2 c | g' g | c,1 | } diff --git a/Documentation/notation/wind.itely b/Documentation/notation/wind.itely index 64fee0f3ca..73d8c36b38 100644 --- a/Documentation/notation/wind.itely +++ b/Documentation/notation/wind.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.16" @node Wind instruments @section Wind instruments @@ -143,11 +143,8 @@ This section discusses notation common bagpipes. @cindex Scottish highland bagpipe @cindex grace notes @funindex \taor -@funindex taor @funindex \hideKeySignature -@funindex hideKeySignature @funindex \showKeySignature -@funindex showKeySignature LilyPond contains special definitions for Scottish, Highland Bagpipe music; to use them, add @@ -182,8 +179,8 @@ reason want to show the key signature, you can use @code{\showKeySignature} instead. Some modern music use cross fingering on c and f to flatten those notes. -This can be indicated by @code{cflat} or @code{fflat}. Similarly, the -piobaireachd high g can be written @code{gflat} when it occurs in light +This can be indicated by @code{c-flat} or @code{f-flat}. Similarly, the +piobaireachd high g can be written @code{g-flat} when it occurs in light music. @seealso @@ -272,8 +269,8 @@ for specific notes and are available for the following instruments: Woodwind diagrams are created as markups: -@lilypond[verbatim,quote,relative=2] -c1^\markup { +@lilypond[verbatim,quote,fragment] +c''1^\markup { \woodwind-diagram #'piccolo #'((lh . (gis)) (cc . (one three)) (rh . (ees))) @@ -282,9 +279,9 @@ c1^\markup { Keys can be open, partially-covered, ring-depressed, or fully covered: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \textLengthOn -c1^\markup { +c''1^\markup { \center-column { "one quarter" \woodwind-diagram #'flute #'((cc . (one1q)) @@ -293,7 +290,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "one half" \woodwind-diagram #'flute #'((cc . (one1h)) @@ -302,7 +299,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "three quarter" \woodwind-diagram #'flute #'((cc . (one3q)) @@ -311,7 +308,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "ring" \woodwind-diagram #'flute #'((cc . (oneR)) @@ -320,7 +317,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "full" \woodwind-diagram #'flute #'((cc . (oneF two)) @@ -332,8 +329,8 @@ c1^\markup { Trills are indicated as shaded keys: -@lilypond[verbatim,quote,relative=2] -c1^\markup { +@lilypond[verbatim,quote,fragment] +c''1^\markup { \woodwind-diagram #'bass-clarinet #'((cc . (threeT four)) (lh . ()) @@ -343,9 +340,9 @@ c1^\markup { A variety of trills can be displayed: -@lilypond[verbatim,quote,relative=2] +@lilypond[verbatim,quote,fragment] \textLengthOn -c1^\markup { +c''1^\markup { \center-column { "one quarter to ring" \woodwind-diagram #'flute #'((cc . (one1qTR)) @@ -354,7 +351,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "ring to shut" \woodwind-diagram #'flute #'((cc . (oneTR)) @@ -363,7 +360,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "ring to open" \woodwind-diagram #'flute #'((cc . (oneRT)) @@ -372,7 +369,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "open to shut" \woodwind-diagram #'flute #'((cc . (oneT)) @@ -381,7 +378,7 @@ c1^\markup { } } -c1^\markup { +c''1^\markup { \center-column { "one quarter to three quarters" \woodwind-diagram #'flute #'((cc . (one1qT3q)) diff --git a/Documentation/notation/world.itely b/Documentation/notation/world.itely index 741d6702ac..379b83246c 100644 --- a/Documentation/notation/world.itely +++ b/Documentation/notation/world.itely @@ -7,7 +7,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @node World music @section World music @@ -190,8 +190,8 @@ notated: @lilypond[quote,verbatim] \include "arabic.ly" -\relative do' { - do re misb fa sol la sisb do sisb la sol fa misb re do +\relative { + do' re misb fa sol la sisb do sisb la sol fa misb re do } @end lilypond @@ -209,9 +209,9 @@ signature cannot be altered by using this method. @lilypond[quote,verbatim] \include "arabic.ly" -\relative do' { +\relative { \set Staff.extraNatural = ##f - dod dob dosd \dwn dob dobsb dodsd do do + dod' dob dosd \dwn dob dobsb dodsd do do } @end lilypond @@ -342,7 +342,7 @@ Notation Reference: @ref{Key signature}. Learning Manual: -@rlearning{Accidentals and key signatures}. +@rlearning{Pitches and key signatures}. Internals Reference: @rinternals{KeySignature}. @@ -407,13 +407,13 @@ intervals and unusual modes that are discussed in this section. @lilypond[quote,verbatim] \include "arabic.ly" \score { - \relative re' { + \relative { \set Staff.extraNatural = ##f \set Staff.autoBeaming = ##f \key re \bayati \time 10/8 - re4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 + re'4 re'8 re16 [misb re do] sisb [la sisb do] re4 r8 re16 [misb do re] sisb [do] la [sisb sol8] la [sisb] do [re] misb fa4 fa16 [misb] misb8. [re16] re8 [misb] re [do] sisb do4 sisb8 misb16 [re do sisb] la [do sisb la] la4 r8 diff --git a/Documentation/pictures/GNUmakefile b/Documentation/pictures/GNUmakefile index 131de3e323..ef72775059 100644 --- a/Documentation/pictures/GNUmakefile +++ b/Documentation/pictures/GNUmakefile @@ -19,7 +19,7 @@ include $(depth)/make/stepmake.make default: ifeq ($(out),www) -local-WWW-1: $(OUT_BITMAP_IMAGES) $(OUT_PDF_IMAGES) +local-WWW-1: $(OUT_BITMAP_IMAGES) $(OUT_PDF_IMAGES) $(outdir)/pdf endif ######### @@ -43,3 +43,5 @@ $(outdir)/%.png: %.eps $(outdir)/%.pdf: %.eps gs -dAutoRotatePages=/None -q -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=$@ -dEPSCrop -c .setpdfwrite -f $< +$(outdir)/pdf: + ln -sf $(top-src-dir)/Documentation/pictures/pdf $@ diff --git a/Documentation/pictures/background-image.png b/Documentation/pictures/background-image.png deleted file mode 100644 index 202cf8bd31afb91550293790cf252f1d4fad8c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57877 zcmV*TKwQ6xP)00Hy}0ssI2M6^iV00001b5ch_0Itp) z=>Px#32;bRa{vGf6951U69E94oEQKA;krpgK~#9!?7i8tBsY>Js0T1JU+xkc$z(EX zD!XeIk)CgzPnoZomVRiF>6*@}ELL%eVBFQ+7C`3#wi{Fd50aT&?v*NLEFSLWW`IKV z=+SfVfB%pFi(Y;%`2m56K_FoGlj(mk{*H(iufY6ei&p}(H;KJq@$a{PJN$b7VbUvs z&8KXx9LtN3U(E8ik@ptQ?Shx@6Mdz0!P{FGf6%dKz5U{`|E$*`4^MOPKE+G0{itOu+1MS@+zgsUC zM4xLUvddd^yI!TwUmrH{S8ifx?CVCu%5*(UtQ``Yqex!&kS+<3E+UQ-2 zJZcDU2W>Gx2#)K>PFiG#^a!+29y$CVu9^AyAw4NMvPZ904sg+wL%W%PkjKbJ5%RYG z{Hr4p92U1OzN5nrFK!%^kRU{MqL66D7TQa2zc8lDS=HwB&UrAA#TwmU^S_z}#P#k{ zqOiUt^4|v#uTA*d_;<%Lz16ck^(azeE-5)X;%^Zzo3>e=64@c$e?VOfP|^V5Jt3S$ zkPiF!>8-32BwwN&V3azfmB_yNYOw+r>B>Nfkja!nNThN?#QIQ#5F55@CK_ARHM6P= zhrfLZ?w=g!mAx0MV&jirkL=i#c2T&1Qs~h9P3Eha7cY)QcBsiL68A*DMNnQSh4sxP zK>%vsMD?^*ktsR7EQT4b^!G?mr@JmlEyF%|ieu4vA>}E#iRl zU+`G0ZB7vd>x_jMsQDL!1P(nAxV`ubD`IG6F|zidRtl4fHLEAU9P3PP)I<=0l5WO9 zC#FdAAo|4x=wCzd*6T$BW-dTuC>xF0ED7e>8zFCTQufW1t~Rzxlezo)<{}CF#Y)e} zWyU{SMtom_`z4V*g~n*jI<12m-<%50u9V(Wzc*GKAdwGlu}+S5P-6jJ$>79xS@?id zg+b9SmK3vMh`89Nx&)0`y)nmNx)>|~Ks=Zs=E<>T0~JqDfi*yVfs!cbm1P3@k3Y?A zN&)pi)QZSY?w~?@AHA+h;_SJnxB$R%vYOCy_Lty(dCs25@(|l#Dk87E0HlR=A{kUA zDYBE8v$Gt+pp}i0e}QCiAYqF@UTJ&@&aQl1BC8_i6RPNn087?ib#O;bwAIVjRjhgPPi_RC9fzW|Lv zP6`7RYS3|(G^8->VOBHo)Sl_PvRLHiV$?_!s#;{%C}P?!k491@$4nhyBp-lkWS2-d za^AG6wiM6_$xKf{0x6DfKwNWTbla3BNF7UBZzf&msl{$Gvga^mW92oVpkqo_0Tl@p z3J$TUF5~QSlR#QvNVj=kf_qlNuHx(xrU?Dki#Q;(0&tF$kc`HVinCLk`j$^dgo4Jz z*Y{>)uu8y>(}^?y8v;;ZM zxE0?=OKTwWU$w<4ZNxYrmdlONa(1X`TYT*yN=pT)75_FNz)R--Bf~t9P8H*9Uql%k za>1o!_Nxh-)g|TQ>@l7L<#EDDn%YV9MIqO@smQLt-x*Mho)*Ptn&jCQeRl!!oykkv z<9v1kGA|y90w{sACs>cd387~LLeEJ#P+6#Pk-?3L9biZxLCI4#8c9_k3&~G}T&E$4 z+hA6FzrZq|p0?|=BqC)viN>V)?DP{%Dy92odAoEAjI86AmZGMBR%pRXO8nQ=I&++7 z5UZ@yC`e+LUl1FzxXD^%S94?uBpI7>%7C^`4}T#v~>!(&uy* z&dyorqLPqFX;323iG3(8Sg$X^{Q^KH6T|&c>H_Okt0Ou2kzGJ$DSP5+&i0e?IzX#1 z5;(gsG`j_KJs9e#N@yArt&Ulr2H1R_{d z-&99xK_OWHi3f=MG*cZ^q;Ynrq%0DT$yn|}nS@|{O711NUliGqRiMi8CA)(Pq^>81 zvy--7FAQ6eUCJ_l8&bT^JSO$ZT8QkC(7zx+=W>&giUm?-p6t`AmBL z&qZUhsw6BK+ekd}3;67tZA>|;0P_@;veX6Am???v{wz=xA{xU&+JaOzb8@-Fq7IEX{h<$oPq@B4<86e&06a49G|^X_^tx53qE=B{8E0 zrG}9*xG_1?Cs21v^l9b{Dl6?VB-0=)H#aAd1H{M9UxIt?&zeW5>8K%{LJ5BTDk5_{vPZMUXk^dRxgs@UM;`(7l>gHsyIxi!{V3%OLmOVx zYM0eYi2d6%J67+ya|}~UzUQZ+F&t%l;u3xg2y0$^Lc*7}9aMc%iJ}UQ6Ui-_zNAr| zm*9SR+J51rl6Zi}SdaN~MLO$IfZF3Vgfh*akC|R_0~7joLhiQJRo75aRRCG2*3;?O z1)Sm~28SeIDoVY?yY5+>MDa{YF3zZ6airLR^6Z2QfLMS^ksXPZNeQjs#hT#=#HY{V zQ3^s?*Ne=Fa$m*SAr+LV@xV{{`Mn4C{7I!`tqOTynl8cF5!r?c!8W&kN5-O`WfPP_ zW8#2Jp8J8CiKj4Z8OVY-T_1g#8gX8c1H)pd7wNMQV(f+j=|n=a*m{XXc8Fmev2&L< z+!*OhQgmaI0Nr+^;4&3oT3>AvJ&!MPu}n|Qpwhs&6kiKt(=8j7ud+cr@ zk%_0W0i?n9ECF}DJs7(tz0az4P~-7hL1Q#UFp@?wV~ccF4>1vxP7+iy}KV@mf~no4*0lJAaxELPDKbl@(ki zjPc_H7w}L;5E=UBNiun|bz@THJn3mKWz6WOarOj|qqd+o%NW}r8~GAQN(tpmlf|G* z7FFaDJmF8{vyCvi!&gPNX65hMHZZ9!6I zq~JEv%}E3CmrRS0Ci$TZJ!p6K7W_ z_Ci=^x@@KiVss}Jyj7|$kS@X_SA;8_Q6-g5TKMK0enIZKC#mSz9QC=}7}0qH`TW<5 z-SS?7`zN6>Dl&^`hLmxB?=iUZ%q(1=6sIKunYT-`o=wK25+wsA$(U(A8l&27kjAKs zRm6EJzMEG<CMKVM4{DvmWIHT|TFCtQ;d*g%sJ4$7k0y zi&PhK`ceAqk;GlNq>Ef%#DFWZt+FcGO*2VcGoPj#^Ag+@Fd?n6zFDuy4k|8LBHM)X zf=ML>yn~8$rtIO>ji)%BEnlE}HBfYJglIW2o8ZO>nQUx#C3|j>bXz*+wa5-RXIEAl zmW@RDu*W8{=j+A@WrWPQy##bhvU*rL8Z#ntzCcZu)$sJMIZ+}fccRQ`L3}J)+0?+# z5%GSPn0wBIk?8E6Xb-Bhqfmh8JZ?<7?KXQ~zRY=JF`j}j3fk~%IOlbEvd9OrN6HLZ%Eg9N!FuKA|UrBE2`@{HwGfMcA1Lr^cK81 z+_KP^R86*s?3@w}M2-*YOK{Il+Y|V>Bq@G@^F|g_9nb17itG{RGXXKk_Ee%p<52$M zLN=s9F`KWMA=3zCWmS4POet1t7MC%_VC(;%IWephPv_!U#YUf90-hB!uTOEfR*`GU z(2b#}=6l|>or=al!r+n=SEVQI<*IU7u$1C-4TD4wYyW6x}GsyM`&DKCw!*w}LQ&AGyJr4=N>G(G%&m#Ie!0t(dbTu6ZX7 zAjGhNsZjnoBKz+QmPxtg#rVm*$&r&D3*+IR^i)C;-OFS>>e3wPv?x#OF{SsCnpza{ zFR0%q4rNk;ejp@hVr0+BD8&$yltoPC?6D=0AP8y)L%f3;9Wu(v*@X-=a|U%&D|6bM z8Ywg;IWfD{(9fUyPXe%F=MzHW6kjt_fqOP=Ir9dBXf5t7;c2YmLT>Jq|KAy5vD!`>H1yQ zdQ{Mu=msV+<=o`#q9T}3(jY24oaMs>Y274FEJ%q{6b*{sjUS{;Ovm+ z3bQ!ct9^)6V^hr8StsftA!86lts{?5=&sNu+!$rD6l<6-Bdf^HwIx}r_z{xs^((1# z&J1eoNMkV~L;TPSS&xwYSn?*7RGdBSu$Wk!e}fL{?;^Oza_zM9hJHLG*^_d3(s0QH zkS)he;n$oE_=+i^!i|xWuSlfQK2HS`C~+}DfYa)C-TeTxL}TcpVMsO0ixeMXz=gJ& zWOOL`xMPt$(_t}rXeLjJOnaFm&aSHg%Zj9_UQrST%`Ar#tgwb-Nxux^A_}Ue)df@;`b0R0o0%aCt(H$mPU$^RMiC<^ zg6ZgaIyuhrPZw@cn$IrYJq?AD>qQwc(~v0SEpq9cMt%oXExEMu-Ai?2Ry8T7A0ht6 zk?^+`-19_QVp4k1{k&eOEHJWDr;EnZZ z2ai}rueWM7=MB2R2bHAwC7jag90R1K0Vp6~mK2>L7o3jlaRX8)2{Pn6gN(>7Rb^rZ zkfGvBsorLmt%6eLQB+tUPsR6dleYh6VVP7nOjBi5#ZJ?Pd7q{(plh7=G?nnlg8zwho-KC1Okp^ z=ENj4bEUi?!Do-A6w1O=ahuenlHNhh%LXzeram24cnR*?y9N-mO6fzE8Xpm1&dH5W zDk;NkIvSJFL5;spUe%x9K~3iDNOr>@M@VIcNY9%THlOZCj0-B_Xv(R~Kx8OJA%Vz` zhjc1uA6L}Uu65nLPkJgv>jp7rXBi39R~IoW;xI}zNm;ae>F&xPV&Z)$O+`(1P)RQ+ z@pr-5e}lnY5e3sbr~yt|Nx#^iLTv3Vew9aJq-PQ+`Z;!BprpNLRFl+V*nM=|tA{td@yHVGlz ztel;4^w}u~4ozY{LS$E@fM0_9Cr5VZk6BXG%ZltVEH1x;nmoPZ?gs)97#AwCN>-?p z43v2|J1#Nr*!pqvkfLT9IOtcK#7w2g9xo1b3Jvly(B;#NV<4GrH$g%UYMrOk%!x$Z zQ#HV)Rz)@%vx@9G-l$@0S!j%Sgd=BvP_hZclmHlCg8R=A*>O>FA#Zr3(@E9PGB4dm z76UT9c~ovpN=Y>yRzB6!Qc?s)yhep84jqEvEkCMPZ z2Eh&)ksTStWMNgMH;)c&=T3{rksTR6^zld_PAchclbH_JleM>m9VIB(%4BJ3SrR2Q zC#Je3Ma)MgoOolw>njv;R=>w}Y*GV67wE=Fli8HWn@B|=#erVA+*t~6 zA|;zHhu|dhOqYz;cWL(8i$?aix`423kg@h+7q4A(TKSo>C+}i66B*}+RG%g70~G{Z zD&sC=J<2&ZgiHhSE&BV1^}D!#duHKiQOD4z1<&!EP^=;8HDSs=+pm0(`S zNq|u30;7`TP}ugB^VDnlCkwZ{1Oq1lrYT3(C#nkoP++*FqvrBTwpAn&t-RU4Ffhzs zIYOkvMwwK)R5wOvJ*t%fWvUD0O)6zZb|?THlF@_cSJ6TJEd=*$b%D4D>BZ;Aw9=CP z@#z#qm1$JWR4J2YzFBAbX#Y$&Ga&@8HFb5h5V}O4UEj|MoIPGyrze%xOC~R}#}VXp zRRmJ(H=*RV@yJd@x8=LL=6m6T#D%Z(5hGZMly@U_#>;mm!-p$ve<~AfE{g2Y`N*(u98leXgWP-$nNt)Y^5@w~)*^X6rA z+4MBkK`HCCE=5XujObEsvJ5^5o=TZT98!~(y2P|PZbL*=nq3T7ql~~rm$>DLksTL+ z?35zZ#uG2(0BdQF0c}0YJoG5zS%eDz?tJ#&NO0E#`(;z(JT!(f)X9~Hhh%Y(Q1ML% zqD22{le4oTIJM2nSq;Y!@-O8k$kO&wDouHcU_ahdN%hB(s-*q7dRRZ*!T@^o( ziUXRNU?jwKNi^V9o)Od|P2V+85X>A0%GldNE|%jGtMRcFvkq((8cKnEQ+yvw_jIKtPJ0 zM#@u3iR>{x)wHAevdA6}xFqRu#&UL@HY1li7qK2S72gXZ`&w6h?z|zZ3#`5ltFC*p z6hT&G*L`>OIxoxL`0u3%_FD_?sRt1C5tb(pKWS1)D7`bFe_Ujaldi0@Cl4j~XnV(! zTH8dbO*X|@k3W{IEoW{?xD&CMl0@*LVN$U?7M~_b+?X_LYBXBGL4&G?eY>7YV& z#2q3#pjt@jJ{a+HNYssygTs$e1S87TmmcrlFNO8^D-Q0eb_W!Q@1hx0og0I+zfu;? zo~O#q7poNHDT3*3U&Z2M9W_aRc zTgKYkE-(O`I)jlkV?ioGmg@yd7}3OMP-pcbtCoRDeK)9)JqetWdd8;-ZokY9>aQ=j z=cxkRWC200cVLb{#N zbHiqXYLuk3v_0iON)XiK<9LhCdSsz+*}lJ^iI{lM6lXd?0D5I`A%bPaA3^MDFUSUz z$W9wHCXun?Q{rr%ntWGbQY90#Xqk|3EK9^=DY6SkW<-uEfwO12wnDARv}_>Z2B^wNC@9=2Y(-kX zX(y13$j(b#=96=FA$E%@z8P*`X}7#Qnk+?Uh@{A_>c%7^`#25`P3V+}$I|2%$&L9n z1@}#4pI1ys;b0fA9xs#cxZHU|*6v{4o*T&TK0zm($@KidoN0kUK z>xL;fJ5=LXp--0-d5_Y!Shy>s&%`Q6)wX*-eoQ`}J(df}>PAA1t89sk4!ORDwJ@+M zxmJ^R$(#g41k=|ei@9Q~u*dPf^71*xeCJbr$r6NZ;o=T}XOkq{=I%){h zZM6?WyA%eVZ^IrQF2G^xk+MPki%Q@SfUJ*#Uz~rI!?H~pGss0 zQDqOzRJ*6qUJ-;kVFTKfp-To;_(o5ln@QW1>G~kW!GNqrKR8n#dl1^?UL|Pz<{l#@-`g|M& zGQ+Pii{BVBai$>QKkGH~Qr3R}TP~jz`L#v%UsiD64uYpVEmM0>fDSL_vnNOn2?QJ| z$}keBj^?}}e{n5>s!0aDL!vn$Q6<+}BCX{uM%=VN3iA_M!X`uwTAJ9Q6BgC|ffpB-}Wk_$NXOop6N z=<##i+k_dA@d;WPUe=GndiDVMPy#LU@y$2j#CL~EOU+9uUV?jmm{&*zshTn6yrIyi zC`%D6`Iuu{LeqK_(;_JEol+ObQ&N?%>8K(r=Q)<8OA}SaR|t^FNu?Zp(0B-w){LAt zh^)s|$^li4E+mwZ`?R-L7RA{;diFQv+hcKSG3`^woo9F7yszD}4u9*B9XW}-z-Jei zF;>r4%qq}_Z!<)2GaL5=gVE>V%;Xmb^YB5;JZdQm%BG}YEHTx!8DyVTslNpGi*xpD zoL!r6%Z}{H8Pv-rl@jG|UPcp#suM=3(KY!gfK@EA6D3pu6c+^|xjn8NU)wJ(u9KAM z@y2ye0eojttTeeTIWwjVp+Ja_jXTotbX6JB}l9t~{g8%oIy zWv=Js8Wl#Yv(zI@-_GoVIAAv5I59CXGkH%;ASQyJZY*zGFJR%u#(Fd{hz#qj0>ZxI zUvJv}iwN#|-UKl%THC10Xw1bqdn}E)bW#bF=Eal1+}H;0%qdD4i-;k!A{wJW9~(4A z*85GL(>m;vBbXC?)}P3a%yiy>6x6oqhoToR2FJ=AKsdX{j$0<~eDmBr6sFpl17MiF zCtqL(m|0Uo83o9Q>~ZLlWI^`mg9Qi%W|5Mw)mNB_n7t?N@f4x~SE0VG$xM1hn5sIk z4C@%lGMa(Roc=gAPJWd*`!5xiK}y(~;<{Jcz4v2sc8Yr{MJwx!ya|-%qNotOJj;&k z8Ys$hkRv-(*PDcH%r>Gx!hA?|DWklcoisE?@>G&OXe*Nmp@x^H+mJ3j)rb7t-5Hp| zR0XP*&qQc_ec!ylt={eI5imF9TV`LF(vxHMq)2rl4U})!565+(G1FQ#A$*%Yh?{_{ z^uTwId@~b!4k%*Zap0!{02DU`ZJ0N0^M7N(CB{`uxj$V&7mPxuU}IpIj9 zl^#6R9=(XJlH}SMuk%tWuhDuh>$;SBab4tj@=x8}yWLke<=gxAd*?d?v$Mz2?B*A| zvqvIod`&%JCdV2#tsApyM+X$ekO9mX)3Jb4LLB$xc`^0FV=g?$!z8c>BHL?zp}c6Z z&fuLH>v8-A6R*a+dhR;YB`Uu7HOKkl?;qAlcTre1s5sktEz7Yi)j`dQ>~TaM37oyB za|xP}5R=NR;VDuhJLCdf7QoUFB&-2w<@ihwyUJ;M{tPN&9n?4)qeo>(XHX1{(Hjf^ zQHJl8L19oB*aB5y%bh(Qi(3Ob51j?dhA=f4W2uQYmb|zlk_ zG^b<^fVi=C%ESjKqYvB6%pP4x#(5UQ*M~QV;^gt{>7@P?3IEn$c_+twKM-b^W}No^ z&!@R%UfhJ(BpSBQY|#(cM3NV_%#TUiWBzKJ$#u=|Bs;RNKP>_6Wvx-@^*d$zRsroShWt-3p2XJB5kZlV|UkJkv1wGl0??sWXw!zPe8l0fynD z4NN~$I{TUvD9^qR-(c>AU8c-?ssk`Z`0d=Un)t022q41!v2yM=(og-{2KW2~SqQia zq@#hnieMq)a9qCDVf zB;-73y6|F%l(oV&(&?D0{B;?j=3z@!NzNo+yae~W$PT0`{Wxxu*RjkBPch6i=NThU z5sY+@B-THO;_SJ)F&RqiYp1&L$B=3Kd5y?Gd=sq$5X0GZH0IMLm5`pniF0FUjRZ=| zg0Ya-rERvDq5Pc1;F|x&`KB<%4hPS^^NoQy7Pr=v^Vc)6aeID8Zxrrh$0wrvuPmpDOxNLy(|(S`wByu zUAM8O^zIR}MUNy!L}*gQw6^K;$evIaAni@$2MyKabMcjU)|x{!o6NWNj=mDWfQefJ zYXaSns4zQ&!m~GI04hv1=Rq>D^IhlL*4Kv2NL0as5x9)(5N>;)$QuIsPoHp=d0TQ& zbb%kLfH~`N`d`eY7?&#n@kDw1V+=x)KdTd_e;b={7>a?}Z!r56v(Ux)jd5fC{+RnH z+obCD(NX|9>AVqtJj^K@uupg1$aX7AIB!78^pSNvn;nZ(f*gBKL)MTPab9Q`OIqc8 z1?Z=9b|H6zfTCn?MMe2pR|HefB;>Dz`8O~DMF~ONkTu3kt{Xj3+QmVU*OY3@AcNlgK+B2Qc~s+=I#U3_XuhKQo#Z z7+M9>(;c_@Ivd}7kr_0<5R;%~Z#F(|_FLt%|J{PSGT|-fbkNXhfD*)*JcsL~d6T+E zd%uN+Y8^?Ci|)KZDjK6ZZz!0ASe$O&$HFjqzaEECvgw#dw>B{JBXV{q5@`?`6={0v zx{FBbQA{KNw)iaq!N3}04GKfnzy#I`^`LV=#=WDibIioVexMtM4yQL{55-OE8^>+9 z#@07y_gI+9v#Z_nse3#Yw>=R&o*rSCAnlWJ(<9@HNXW#VJyVeA>Ye)vl%A>eUHB)S zorSIJ!LjrHyaF_&?){P+IX-AJ7Y2Z~-7rVXn0PZj!E6_^@j|hz0^8IbJ=d^L#x065k}g6g`;NO1Lz#n$N+7U|0Q7n< zH2(D1{!p2HVJhdkAV2Wfb_GgL-1!Ex8`w`C1vmu;WCo$G5$p~h7vx+#^H3>FR!{+F zVPovxTd z0vigH?)}Q6Gru*~C+-wmqIP7vKpJBGimfuMp=)>!Wc6I@qYHlqMwK4 zQ1o=Z3(yK7OycuAeDQj+n&%+$TmsLtKfA}BJzkfunYr<2FfsX-S`Z3Tf=uANGm#0S zn>9j{KMtTf&s(2Zcy=!yqd`GL7RBCP0mgM55tw|(jc4!srs&Wu7$!)u*2Y-K z#f;t8;3+lvX;A-X;mXnTHj!x8kYdHP>ZAZdHW29=y#)6k9qTElFDj2>Chh0*6v3pl zH(P&3(Rr6+?wY2uok1lPjZu}nkcy9xM7b=A%I*)v&8d5&oSZ$Ox)blCL<}^NN~*}9 z03n}X{9mt;<#+Z-hB|JYZ|Cn?n6fZs?M~wAS~h_&&||{<5hk%*RQ6zD&+fT( zXV13Y4vHtSJqwXO|S$%^CGw1d?P;7W<$?otG4xK<^Y0a&QZ4P=x;)GUI?fllSa8 zZrRr(GCooLxF4aUg`agmWBlrJ3RCUuq4TZdZY8W}VF6=$NT-Lzhxijf6z{lW_5|MB z>zz4t+)TVDtK`cT~L?Q#5$o?YmEvvAnYxr3N^RKxT?(>Ou8YP5E~0bo#gcAk8% z2++rLo{`&mC1^TtqUtz%3`Cu-ZEl*neB6`L%p~4B^|g3;!f`x7`8`GUpC!1*%6X3U zF{JuQ&)K8+xL%bb3(!}k6J@YI(b!B0zvlDVN&X;g6QJ&%JHR3!aGHQ&!=)HFSMlzB#)`i(*K|X@r&g#wK?zTo3Vp zGV?ea%*+j)TT?p@TJ2zBi*jd=bL}w4ZO8SZ78!4s=|6M`mj)Avfep?-evx4iYUmYr z+&SOQwa@3p0T9i^L8SWyPZ4~jGqd{P5$U0I-+89&#)|X06xn|#Vf|;$+*8gQyxl|D zlS-?IyyCM9kzI%O5@9r+#Kt1O_fy{AQSUA%6&M!oougT4Cf@V~s> zeOa0+M2d&@hll1v>(5HhR-<(%W>B~H;*%65`?v&S3X8&`Fs3L_7_y@UT`(&0>^klm zcFY{oPnyE(QudMcvn28jED8%-nw>>yP2h~%5Nirk?(7kS#-AK_y-IGM;POHVAhKQh z_iz09zWuPbM{CNq>i{ZERm{dyJ-gbSI^P-;m|B`615&~^L*l(?^nMe`QVi{`7C1Z{{(&^UZU6e^b6I%#PVV zcMtc?_mAxlaX>}j#y}-T=KG*3TQr1Gi_)U7rWjz2fUbs2+;_h9d>#Mva^RUGTQl;hyyeqLgCIHEsDaFkL?eh9VU5kZ63Q#$SlLAG&dSF&T`ojnfu{+xTmJRcujD7P^4;-wT-)FD_?@Px)ds!F$7k7GW* z_;TT``txnc+kx1JlOwyNYDc16-R}>L`RRju%)eCTx#hY8`kKw(h^lsx32Bhk>a>-@?0lU9B}#z&(D@I=AX3XV-=Cj*0i+9;s& zgX_@9+Y4hy+y!7KOnBDrx#MQUQkeKy+#Kx<6FYW8uFmpGz)bQAgGF3FHCmZHV4QCm z#!>+?jXzgJg{cAnb+FfsKcBm&8LfT{=gd4$%olUZtOzR(zbQ~Mv1dnP>OFXO3^HMp zJ?X4L;F`z2UK$mB_Yz7rV8lq}F&LCsJ6W9LKxYKri4@4a|wR>{h6{b4irZ81$s>YwA zGpJg{lTsI$U*;&HQkc@BEPBSF335Xrpm_GJuSdt9KvM}pX+RHndp*3JIgi|aV=2sz z&Kc_?p3^rrJv-0s*j63G^Z;piZ@p*dxE%(12}C<{cwPMgFlYDl*nD8}^G7*1lQaEq z16dyP#wJf>9$T3mnSJd~oo_l{Gx-ALth-=ZUpwx=+f$A74u3o@hH)rDpjv{tH2cw& zbXEZHrsvF2e?D5e-ihi-}&-I&PfpD_7Mc@XE{&)mqqtuyNG>C`vhV4niF}J+=F0=+kfub;#HHGbyaWlf=%&z0k`#M16gBxd$^MbdvdrEbE zstHHBde4v#xU8<Ml zYIFZloL%R$e_CWG75XQY7oRa28pQ>n9a>oD?5u8s_;E6lCSdmVSel(7J0hf&IT+Yi z)#vZ_U+wLY2%T?g_x#v?Z2Vb2ujdZe2w(=mkR@VksscrUGQ@EVQYs;Edv=XK_qyak z{dE@0)&Rnk^g%#%rt1l3hJm#v%p6%0%!Y<7A7C8s+rWC{S^7C^Bx2TA?L`5Ww2~F$ zc7!QHTrrBhiqTzb(y`LD6x~ak3~%yC0%35mCoY|GZ*# zXCTpoV2m9Fd*@R>6Wr80F%8t6zCHmq*3ydcp|W8lvhvtvT@fDzT10=}ux2=_z|QX# zXaC89dv*skiCj;p4kujhAV1eApg}pFO7T~MlA7_#n~=zQq#RGBMV*VJHQnNd7}z(v zKOTyk_vf!`eXOChys|+;C5G z42<?mwtA1jk!7cFuGJP zoZo?+JzSTsK{#~}t*=2aWG$wB+WPvry?4H|w!q9nF9^%bmFy-jJ?_Kzc&g2$)#m|| z7iq7y$SKKZHMH}Fp`$}`^~HP{*8jW;9n}lDVZGyS#o-d zJ74Z_ot{*ZeNd(BK3el89Ih$Tc}fQ#Qd*DUeJZnmRegTy9`EXJ16}%9+&XS7O2_`G zySrb~VRB%QtK{Va@5#lXDdhk1FvP6aT_$b+NM2;+na z(%JYAdG>*T*mqI~P##3*?y0hSgQ9j%G)fjMJV-Z(T8u6g{z=Dei0lF53MqELQY?x? zaZ}knPtKz~eaH>@I8V(9if7_9zdfn~mzuNp_Xi8sBNlU{^LbI~nW^(X(som%50#jR zdCA#-WN=^HHO+ZL6`uXX$gU>r8Ic`HnmOV*GUjk|f;zdaWX0lO>u#awd}ZcMOw_pN z#-D?l2Vi#g(0X&Q*NrlLfICeqxzVo#oP?o}!SLLfPWK^JR2!U!sDXpQ^AZuvwT9lq0V2;IY z$8C5|&(4!8sUpC@mS)G^J+^lSm|T}OLZmT=)YXd7j1Qx%$AMFCuoQx)HSWaIV_LnH zRO7~u5U2&~%M9wziMbR8-b6#L@ZaTjpv(o`V_Ja>-<){}3!;V$T?@Myxxb9Nn+ zFBwr6n87Kf?Wh0kP?)plVfugIsxNw*h-c!P4~)-wjq#d>1l&wgjcY<6Lr3ww13I&i>uZ*r|!|hmbR+hIhF$V02g{#DJTX{*=|21%Kq%0_V%i> z2iJAAdvYlD#dSfuk=rxaB=t4RJhJO+Moxe+JKo0A&J6Y$n9!~Marpkc#n{f|$R0#B5$>JqDtB(a-(&+!!-70R1rf-}(KBpev0ixoT((bO0&quLxEb^u z^vxGJ@~nx;On%OE93^vS$BBH1_JMW!6Axdz=h~egn)ktHd{C4$rY}nR>sd~Oh5;x) z(Jlv_nIO75G-IYG^oP=Iz!cf06qZ^Z@eAmd1jY1zv~(fbz&cHh$6G{zEG&#EvGeQ;Qy$A( zi(*cf?3=yhc+j*NE@_&!Un%DT2u>ZHZvtCp1z{7B^IhXl5}H3G-D3nd(-hKjAN73; zcJn(k_=`m&GGsrmxFT30tW$gjl}2hKkWe3aL1TX6%sr*zs{jbe$bONEZ#0igMs~TQ z%L3Gp9oeDyJ7b*(s{qjeDHKDSu?UHIAa2trU&ZX%IcmMHnO&H6d5bS=fBsPaTkXz{ z+o$fnc2Ayt?Vb(ntKAm|dmS+M+Ml{Xx;E_pKyVzmG1kBYUY+d~REUW!Sx>Ix*88(( zzZ#PC+zoIBYd3QNf?=c?jtudDT?FzEmOKzlO0#}EF^1MIO^I+!tz`E9I;c1XN^1s* zU=Vip0N|#2GtN&jbBMwLVxr-a`srCrW1LH(=eq6;i=wiJtMWAwow|ph8?kbk^X#6x zJI{VN;TB$cm>l(nl7u`ndurJeW8te8X8rV zMXzQxh5VN}IA!}0crma6i}&Q2*n3x)U1@f6WyguM?)^wxV&dpJ32}=xDY7r6s|7~R%%qOu z65HroYOr=7iuAfvRLt<$5X7AYtSL|J53M_ovp-|1IL`-Hu(I>*seAnV@DIo0RoA`; znZlHn+1*y36(}2D2VRHguJJVyRpv0{zwCV14(LG;t6EAvF_w}k*X5i4<>tSbUKx>y z=wtouUGrTC%zYY;i7AhvkvM}0##1qbYEORr#6g=dG@-y>Rs z{b|p4oFf&z2tgNu^<-kl92C2lxa}2php`}bL{7Fk686!Qun%+pWC~L{b{6)kd_B0B zT4sOtwdc;0ckF1Ujv$~Yn_GlvT|ycDFo}5)AsZ7s(=~O0sFh>%t1+d`R9}8Ff_tpf zn4hyJJuP)^%y#*hy}fE(?WkQgUUZzD^vJH$HzUhdLu2|hFwEK%eUH(O`S?8j^z1s{ zc@9nyZWhsST^8PVb@$Y97q0NCxOME#{%NVE4YTMg7KJIU%G+acdnz88cxMmqc3)Xj zwyth`-TCIR{b*4ZraTl^5ABDOd-Uvh3fw*YVTk6dw&dd89Lw8L^CVn(TKc}rI=PHS z^=gK$1}B;aNxQY9LBUihpoxLi}uI=iRdn`>=qB{HMa9={Fnj`k> z>+JxsVV0~)A*IsF8IW`_xID7!Rr^a!|7l^FtjM0QJ=^B&hRkfSifO{$UIoeQyPj$$ z>yD*#V-RnfC7m}`A7O$H)SxgvdA5!1&7ov=j$O-5$O>0n!yciX6pmqG3KWi8PmTtj zgEdu!!gVb(&*w!=52x7BcRbje*VX4w?cJ$+0O3{jd10!vd;VB|^RfP>G`rXMgALZ8 zOwZkYyWs7O-?G;!9IzuA#I1N7YXWR(cAalrFD>9Z-*&z&%^oA=8J;G-MTnjQBt6Wp zMs1Zq`oSDDWCjT^SYv|xz$7Ob*p{C9(OD)xu`Ow7H4&kQ$NS;oYQyP^*hv%U>c$NI zs{?IjJa~q~EJ$6p!}#dfYYn&C?(7waJo(Wi0p-_4)*G)yAOLtT51->b@>JaYb>Mp z08TE}j8>kWbIlMHG66*ivb24l(-aspsc{b8H@=^CVb7j1K-b4=zRO#>94hWs@=0^e_g$~ zDc=N|-N`-F?rGU4H#B(LW6nq!Dg%phe%d{E56|6w@Rkcy8H14)Gg4)?YE!eI!-}9I z5s@)AAXghed_MH#n0?0$lk+^b1V&9j60`?Kv8=h(t87j(jYwfS#i_rZxyIyJ$9VFN z+t#~Ktn}v@lyN_R5YqOJTgTn_g3|1E_E4H#_*bXy;q0DB@R){-4rX^yqarR!E=3ul zQc;L}>*pmlEnc`WKTU9-Zrp?>r=2%+G-ew~E$lyB{U3XK{O9}sr{!k;Dg(1K$J#xI z&`_EEp}5}JW5+F0ieO0U>q6+P^`qy;zzm9p)}ZLg61~EB;E?%_o$qQ-&NEX#R~dr1 zpCna!D0setdG?!t!kgaP9!03xE3>~UUIW&m7_s%ey}B-6KX>={-TM$JhK46Gakw;# z^0~e5eABp-y`9A#NC^Z!{yJxB(3*H3? zj=L~A)At6t`@Za03%)5JUc|u95KJ%PSPbJ%#V|YCf4V0(wUmb`R-#Ema(O_;Gs;W4 z_kDFTMsQ<{A-gk2CN?N$vNq29wjE5MX5Mv?K0mZ^KM+xAc6)n8#LwNM3sgwhUX;z0 z9iP0`ZHRg_dOckTXT#vM>Gk6VM65R-L*{w zN2In~Tu)dAc7Sy3ti>9Dl#w#;$#uRX>MV+mo5%JpnymbI%_1fag-9R*SrnzI3RBIs z!-&YSE6vV(PwbX#g2ktO63!mM>$R#K8d^)5>J(3r9f=zHh4uIo1o!QPH-y>Z+zzS? z*;n@P)z$yr__}syW6UTqWngd0x0TtS2fyY+ar4#H|5n+<$NHNO=fCoL)JRAuW{3(C zm!`6&9GEISR@#y&(8C{8D<)a#W3lE-W_6`qUmF3%kAp3 zi1?~7wR=8w56*W?w6ptn`#{miHzIGWP%(eHE^{U5@m^X!~&+QpGM zP8eZErrZq2%_F;2LX|V+1bNr(~;`U zD8i_sc9^5??4AmggK9!ipq#s76H(`zvwLLbg_dW;>m^1eOhE0xoQaPMaCW+E26Z9V zE<^T^@7~MLCBa?ip+nd_pMb`MWcIWDpDgVEy#KF<;>ORC@trvwiks`=H8b92q7IJh!2>Xi!>X2d^IsLI`=oP_++DHqTuj+JwJ-u=yjt|t7O^=7yX}NfOPyN*q+M2qoK>%Pd8XYdl zJMP+m?F8OBd4b4_d1N1*@FKldRci<`b$h|$MX*Tqtvh?;LZZ<68pMI!)aUi=&hB~8 zj6{_6NXg-C;YSRU48M*^IuNx z@pkvwh?*MMxBEYSdHl~7#ryi}fb}}+KAgV}*>jH$4<-qAmLUcv^&rRUnc1-mwrwYJ zq23>7tY>{bmh-Q{nSqRfEntlal$a1Ttbv)p8TOvI^8tnTqhG{;N>3A$Sfd!@pP69( zP?)OqjWyO%QJ_2&*Ph*D`w>LP;(88Y4YbI9hQ+fpu*c%nUGqM)D<-phqTBMbtMZkF zC8D!?eroUfBy_2TFyKfOrd30{wzeGfzXp%fSwGXUYklMRnc4YauD#ERSF%>T>bXPB zF;^>Xz_nnl37u_g$pU@LmnXYE7dn}a9nUHQ0cTg{mRDC}X3GUR8wBE1b)@bYbqhM* z1f^e47)T2W@6P}Fhr^$p@BF~#zA4}Q@%T@b+5gA$|997XXN(2R&K&o})ouCi zWAj~5h#jWkNBIulaqGSFv(4-$vqxTL;$veI!x;LIiHBKpl!G;d8FT;9a%>zR^nCWC z&N%tG%g<=Ov!PeQU||6<@ZvGd_@FZTy}e@c2YVBCV&m(l?ymK9=;(UtMib)ML}IXM zzTMla+C81Sht@ZtoY|R!XXlBp%GZ@S5TW(W$NHO-ds<8wO_0S@3WOP>!tO%E^z2$+ z55EorqLa&6%$JU2LyUN-H$DZ^*94&$DrQjlV6nu``L5-22!G*F*}#Q*8&I1&i-7gO z>TA++N=}LFF%F4VDEshT2mxVlxfu>Ew+ZDW(2x^2d%8O%!S3Sdc#_Xfn~_6GsD;09 zV}4|C&+|duMs^8X6g#LR72#m7KQ`Zja8tc|fBu>X1**anud2_P`D6XT`ZrP%=p{6Z!!QH3iZqQ;&4q_aBB z+Kk1}o86ZN_S^bj8s896RU8Twl|9t%xghN9!Ex7dd+weZUmuF=ak7TOX)&B$jvaFo zSU@h=YKA%c{u3jNmvkPx>~+uE61G>AoLlAfj7HC$Qu{MtRjZphSRebC*@;ve1 zVk*6N&!Dh9Cg34t+l92#Ks20oX21~0bI)e%Kh&6_cF!mG*!h|WH|5)#@{MCxpkNw% zXe+(}flQDbIdu=Mt9N#9jJ+w}f=p?u0+od&;*a&Wj@!ncJKr*S=RI@1^@;AK4{2&^ z5-og1gvh>e$>=8oim{b#2XbLg=inX$cigr9?0nE~aa$B6#$knejEExRN@S1FKsMK~ znGO{+l;p_1{OhQo1vU$tRUy(yT+SQEL-rX!iYQ2QRm3nBtep0SHw8~^>gj?9OR1Om z{v$E>>5g;M%O;kCi9YnJ7aZ(0VD|QCQ3hk6V{r?@m&bqlQ2+aL_u#p6?3lbYu*p0a_$}P?yL2bxb ziD<1!J1(>EmF+mIIS|9=)8su*hWcU7nN>4!Fc_OUx1pyx7(|TTmM}OHI_^5(c;*83 zP+U9i?waqMcgzS))IRfF4%wGxN5ngGxUJqbToe19J$m0AiW?@b-Sfx#yT|rpI5j(J zF-=0PPGpQ2c_Q%)EcM|^LIj_w0b39l{ZzdlBlxJ?!n^?`WW-ibql*%^<}iKi%EibI zK<3hPfg%+2Lor2w+^3D+qNIcdbTo!G8v2SMhHQnVTWPO@hk=>7f{%kV%l`Qb z8uQZx_YB>bEO<`npk9@)Z;Cetw)J((XXiT4oq@eBUN`>q_0#`*c2A+|zbapUw*S+s z>Wd$mZ#?_T>`SwM?jBm-5Rv1~q8x&F5d;(qQ;t2rkX-vgG10T{T*E}pH;y|V5EY(j z4aWCR&@T_^wlOmlC1m1u9N?Vb^}&;EfG}qATLI*mSqrh$)c^-Mn$EWYdbXxu=97DD z+}WbIDsTIVC+hi~qvjX0tGlO@*}d9*;o9!G{aBiPfzlNF%Ixp``+)Npm}7BkU?005 znnA^3ouDrh#*q>p&d$OV7G;6bOigSv+;G?9;J$X;g$V8`K7+c%*)wnwIp%83phWwW zBo_hc6||{Jv(aiDjfwV<^$XD>d%kW=yos8p;!7EP_SLyMRo+|e@YzM5~(n8J`L&90{*^|(9-TBi$K6jz4{$ze`v!-$Zj zq&B@7MQTb?@x_MluFN+=i;o-32VztsRASAXs-{&&0~Al_~$pfFFxD}I_VfOwA{jMI_(1e+ZSZ zcD(rza&1~LDOZqAtVYrDQXLD@f#axSR|J+&xG^epGh*(#;8MI5L~;vSVk<6B1;i5f zxezXpI39%CmCo74$0y_Ll+=2h|J^vMnt8yy{NyxLi55wL)YfNFLjq!*dtJP)%;DS9 zU*7D#to_r@9t?`g?7uktBeQ>MKi*cK4Gd)unCI@^v$H7P?*91H-rY6d{rmGjJMJdm zOQv11f4Bcr>*|O0B; z^-N*NeqgB+&uk+krv=O_fMJlmu*UX@@L;4layP@9cicMfcqHHt&56f0j3CW-^5koT zr8`gfYir75anra{pu<}f9k*@w;J7Qy?xxyZmv8p=+5k+{x*CL?+53K^s~HB4yk{4) z#GBh7Aqi*zYP)jrB2@w!+tgKjW5kzn1X6(fK~T`4xsQl?!3olLZq7cVmjVfBD+=i6 z8B-941%;K@I=caGb}o#vW?#+cXDA8yKbe>wlR z%Iprs&3*G8F#F=lkcBaZOl1zI?(w<1?|jqv^F#B)IG*a+F?U2kzuPUq@yQ%{CKa>r z!5E=uGYEby<{<%Vd)o^1Zwq2}!F|nBkEINH<(_6%)cr4D3<}4c<8~6C0&i|CMg~sL z#5Z-`*hB439k+$4LX7Bq^S=K2uKte6jTX@hjciU(_n<+{$yz?1 zOe={UM9`T8Rk92rD-DgAU(bRVGsGk0c>_cdBMDc@5mbq{nAOBz>Lui}9<@S><0DaV z_#Mj%W5||3X*H3TpPvkK2h2+tTd5dH&0>ysrKEzJ1TkZ+BnbR&O8L z58s{s^|`z2)f2%)R8aNUerVl!Z~5Fk9*XO_dom~nJ0A;}((K;t{}c}V%I-ea-#&Nu zJ9`-O*+2{VpAY|a*3cuGdYgW9{+XBU+aqdB!|gCl(>wT#T48jg`k zxn`wENfO9dQ+VG6*>qr3sbHs6Q^&6Zj2VVK_aIG@=46g*8Oto=_SPf#KAq1v-8%AUWn`@ z>;Jvm{qfX2I&Kd3=CS$V+&vwNn=cN3zH7cebq|i)FkKy}Q6UfYzAMb`wtDw=|Hp&9 z{`T}Q$MUvE#$iCTx7Rn-+jIBW`MUG%5B?j+?I2p>J$sOG+>X-lyj4!0c4pt34Pn%h zwWctp91Yk4M>{ZZ1Ci0QcfM<>4$%LQh6gI{YgL!aTN|%X72bqL#FZP!c>K+f_U=DJ&t!t z;WFrxLUi zA~A!ip-hQvfGDftfBE@&GIs%ui6-TXXT$PtyDDDqi<@uHe=)FyseWj_wWj>)_`d?? z+ta^Xm#<6gP#A!MT;k~6ek@*nb^NEw9v+$x&)owEy&SoB!NJmy`B;DZ*nafv_r+D? zP6LR6Xg-NvoqQZ>w}VE?=(k`9qid2M3^&Fhdp~QUjz-MunI;x0fF4NcXHbK-K@nU& zdOT-PyaJIyv9rh4H$=v9+j{S3T$JJRmR=wIOf9afSGU!>$M%PF_he1+cK_AhUbVgn ze{xm6>Y1HHfsk|R9#8IRnAcBXEJ&OIv5;^v>oJwHBfC8dO8Ky?6u~kg`|xpmQG$$E z&aNANZGXYcZuI}=2)iWTuZA+lKB2gwkqWYJTeJ~R@LnOx$nW#=^OH4HA)MB{@e&hR zT&pDx*th#H8~=QE&wG1qU<;J5cYk`j|Kkt!H?OPD-|W7;E?z%$A0FGgaX8bnCw51B z%|!3dU%x+peb;;!%*F-*6WlU+c2C`1=bJ-u4TAG6gTuK0XxcdqwWFMg1sV$4zCF&) z9k~uPSP;!*47~Gg%Wkx(+u0+tzpKA% zd@T%&tkv6efICq z|IEzSN%aKk)xcW3w1ar@MM?0hp{ zZHCEnSG$vEe<-f6ir2M&K9;w==fj{E*qfJfFg*xDdTmfC@x6s+pu=O*qM3k{RUli5 z#snsK?`v#O7L(rZDEZqvZ!mji=PAtAhdQ9^j}{ubsxwj@2)3|}ou@9g9U%mveu}?w z=ivBE#GUV+x;rLzz9aTKdsW$EpnE#*?%Vfw&G&Wp#OzaU#YCAZa`EC_O=h=e0B9-b zCef3SkU!G39+z(d`HO7T1&04(mHXJhKSxjLm8F$p_?bg+Y%)=$-GL{jE0_5ZD z&>$P6k^D`u!mG^b@A`w^oG)u3bT)+j3}{d(5fK@fH~T*r*r)a`IL6&I-ye!=&;GIf z_;&x*Q+NN^eXPvEkZpb4`DW&n&8@G``~*TEc#OJ?K{PyQU>%E_khTNCfZ6dV((QX? zk_ipR*v`bZnZt_&4g)xfk&DtN;ATq02Nhh?J3P?v>HUPgn>_G%f^lfkbc=*hz!a#M zI=`Sff)aQ$2fL-m_J^H41a!!8*ZGc!gVUZT>U>k6@a&$t`w!=TKXs23{}gG8QqfdL zBJCA(c9GJzYDglUbHuoJan>VkBD(@2BZgeB!n=0skX9E^U?0jE)1^yhP^Hdigx3hl z7*H1#Dg@cN_w;jj|J2^~Oc?4_XL+X2K5JzTih4Z9 z-{)Jxm_Ui?)x?4>$|ThiSTViB1N9v6+Bb7)l=%@N|3;K*!?MvAF&I{8wgwEMB#~E={$whv)8oR~+BBUtblk96L+aqIk9YVytsR zP;UIW2?dMp)_3W7&4&7Bk?Vek1n8^?sn8)^qQ}@{Qy7^2Ay9Pb7 zN3Ms3GEP?nQ^W(L^cu4+NNff*sp2aQ5Gf?_&HFH=PYXa_06NqzlpET6rX=YN7R4IjjiLF zw9GOpA;it!^TPLvi-8p;^Ag#AHq1Stku8a=MwUons@J>EYyVukQ;Eu=cyvD;ar@NW zJ$Ls8_Nluo&F-mtu%`O{{MXu@unbHw2cNk zY@8ifqb|}>nWgo(wsc1v+fs4%*zvZt>d5<1bYn!Q8bqobW`@=yaw0pB0_(-dj@Tu~ z7w2~2y#O+Qli(hoy-r}J(#XTXUf+~&zdikngV< z?AJHt+sf=8+aH+eP+UKE51xF-wK2A|`^WaftLpRX^7Y61+lTf;X)4oG32gvUOmCQJ zdM9G$ApXVd8a}(W3vQV_nQV*(F7p}G2u3_zBJ(O|$0w4(i`2xFdP8r*;>{IP$9ctmF2ny|bn$v1{FT zB`PLZRG;tv;kkQwReerG7R9^WA4gfZ5WzjW#y5_iClsaEXdFG?w!|{dL=1IwRz+hH z^Ms;W2=q%@?5=RCb?a^_qL+n?DrPcqO*@~-K4c`d zEfd@rq*I}sutEh&5CsQhVbes!Y@@cBbCk&t3bMR157Z*59AA=$y*N80#Y!QvLj`kU zhf)0S1Eu-bNeQzJFwe|#fXh#}g-gOGM)qW3Cq;HB682D`EhuXyH=TO<`PpHaD9-`f zPDTu3z`nTJ+2arOe>m=rVSut~YCDLpRa!QFsP9VdEgFtWFX(jfHB5&P(5v^)$#y>>f@-VSq$;|X8 zk$v?WPE5D8aTjZ~F>i4fSjV>A*qATr;56~te}kR-Rnoho4Qboy2hGLNJcCH1_%@g$A7*Hj_fkjt+{V5GgoX+;WDnmbW(@C=aBK8x zdEtEjLRc*`$5izgKN&K=Sup<)iE03;ngjhUhW^d3tJ$%JPwBF3vO##sRCEy0YO%`= z*}tsHeZ3E7(j%Lp_WB(Nr{<+l8zE`zb*JzD$Nm3(UwnMN{;avsD4y)=N|Gn#q)H26 zF_ac^WgB$J6=-YRomO~lBf2AIQcT)P-3ol-jns9HyW_iyp+rQ&4Z%onxUdgc#j{gN zW0P-9=VM{=6E|6HOwQ|ZfniLrF$foFncyjsy0Rs0Ws+N?H|yEooT-%L*%w%pxNs|_ zXTKr)e>vyA*z2cQ7A0nTPu}T=#$8Y5Wmi1Z?gFBB!#(_No2};8N|*=J=n- z|4D>O?VhhcFBKyhuW4Yp_Db|zmnOV(1h6mud%HQ^K4A+?N4{a zBCc^4HxK1NzVU$dj$kw%3(8{Us`EZuCMltMj7};6V{iR*H4Q{p2qc%f5ws&GF9Fsh zB}H}LSXZ-;-?>oMq8*8BdKLMck2f8Bt}-eRT(wQg;Hg+Utj_ zJzdP}L;202dGrrEn^!MpukA(1#WZ2GxPM=A)yS|hX*gJ+XHVhvM0qw>d}KrCg*mMMjsiUh|0X3>2&R7fj014eY#0Muzmsa7T+Jh0v;w zd7_BTBl{{n`??v_=yqo@88ObrtK_z^oLj#+<|V8OzB`!*!N3 zU8iS%OQsUA%ipzrHxKC$CZ;p-2=CMQ1vw$*(Divv2Ww z#4?N~_KR!g6{0*l<%*uKrGxsFIS=b~iDlUhAgJP9#hV}Ne=XId-VD-vh!k0$Uhm`X0)075i#y#ovS(c6-Yi+kRw`JO)3#B z%>l-NBTJIxw>xu67*LuED@Mp=tJFkS5i7Jt02c33WR1E8jZGGA(vD!X+QpX^IiF-3 zHnqi0NMCZZ6uGg!j6ZuWDt5_fRea&7D7X;_59P;0^Jr{cmYc`x4~u)% z#Lk+=3CO8=!iD6G6=`|1?R+kN2w1f|AYFf@D4ov6os@NrkWhRHL4Kv2`~9w@dJ~yS z^X<-p5qXSTlc~W#5=oFN0akKI%jV;e%9NJED`Ihji*`c`i_Z${mKCnl^EC;}d*V!X zZiYo0U&iu};LrY5sb#{?H5tA`e1AW>$u*Z7b@%i6KQxy_baiJ+I-W=BuNaC*%y%hP z7Om9AP^JpburV}A-oT;1S87&vs1b=oQo-(_h}Ftkj7v@@Y`}w>CJ3R8%VQ0;Tn{6eazM_^cLyx?f9dB zdxlbo@ACR9;jVaZTytn1?~4zOyAVkhlou^?v7-KpSClK+n3a=C>78{(^_bZrL>OZx zXq1kuZNVLLh5KrsFIt(rG2f<1YK~lF)vIGw%OsP*LP@U)%(f(0jqJ$Sicwx7g6Yhf zj4iK!GqSJrXV2Fk8Es5P2)kxIUReF;rj7Z-R_>{*Bz9x;tOD=#`{(*6E2dJr=lYiv zC}Y*Ob=hAR3ji9K6whI0dWW&JSB>2`(>EY9vyYZ!IL&;pL>pq;*|#w;U(LB)tmy!2%~%Vz8cPg4S^?nGVMqo*k?8?2~#V zAwOMYV<;cei?2IV=_?ytnt(gcs-`bE~Kh~udi&!*K2mB^TTZE*?MBAeewR-JR8?Ml%I?=!6Xi?aGRo-@d&M> zP?jH%sZ)TQ;$=lNFfC?LW;VPC^28b1%0U)iXw8oJjqU;~TzvBk4@G%)N^oasc%n6q z6v(ZwT^tygp%t+|vF!f}1u&ChaGRz@u+k6?A|u~mTCx!6yk#WEgDv^SAi1@|QsiE4 zQYleGEl!6_Uvf!Lbz@`xfR%d^*^w+uw`$Me*XA=3ZT0=hyu@mmt}uy}xo^qD2%lgn z!VxRifRu`PjixxUW0)3txmsMI0LY3>zdfO>CrQFvG4a}qoyI6Ur^&GBC?i&}G1+w_ zPiV9N&Av8QtbJ|nah$<`Vq$%r; zgF-<|;_J>OZ^V#&k*~iUe++Pse{*v^d-y8_z10uL=GjW4RjF8??IEd0%(*3IrbCw; z+jBg5a{IhI>`EDJGA%hLrnrph9Rh;l!isfb(o6^P+L#!!FK16De;)UG%&Q(#SPd)} zo|KtbjXntzD!ngx(?PjnsJ7J!%&%b~v10rHu#k0PtvC=d)JU(1Ra9Yj9m|TEJrEAA zVq}@kgQQ^*SDEa(!c8yeFcQeIcTa+B>nKog^8gaWE+VI3r31r z9{%+m)co{KpLoq%bzi9+#!&97a_@=nV^5qoN7hOE|3V_-gh<3G=u&MYy)@=+3?zCT zPHT2SZcI2=wy)5$uh>iGY0QOCzgrIK(i#4P(Da&?tyiW;rFNCt9-2q*h_cmpXLFP> zf~Vy%NH2qn04K=Ul4P|pz@l(4UbE9$)uT{Wf;}r;SwR`s^hrsfPu1M3Dc~AzOD>Fyacv7mD2Y8v+-pc?Uk*cQE*R{@T5>&hJ26(A6XV2s%0&Xb%;eM!Bc_OU zM51L!aK{UEoSRJ7RmH#H%2)pwidj2=)~VVBQAqOFpELD`2PZh1}Ji zh=`#JR4?||jCwLt7A?C(A@6Uu$dAW22XS__y?JHU<07KPu^^<%BE;I045gqia+2A$ zCV!K!&Owb0FDz0?ON@N#Y@|rA_y#QXRB4;v4vg7~X-sXU_Bigu5jiK$-_o+ef)RlM z+G3wJS&2`t^t4eWk_v^@Jo|D7b)BbwIN6Y2Y3O%A_P-wl-;g~*%Ov>mNomi3>Vz>U z)mBIvdxmWxb|#iDTAdM=Rr3p3lo{U`&zYti{_+wa{~rZSgn)3T z=?6z9;v?_RPBZfvO4fZ?@#f=X3r3m9BkYm%SnP79V@7TX;A~zy|DrS>g(W171W+Ke zEG13KkS4X``$bF`9{g2$_QkDIbP1v51eo8&VBiM9zZ1A;CY55Wqie&0Nw(^)wik)r z&k3Gg(v>2jgz|!mZ%&GyA!^W0b|=g2XvsNz#+V42vh?@xZhc2u$XRjmTNt1vZOj5; znncz4u4oNMHGf4JEp|iPYoa7Xet(uE+`|sR;HjRvB+@gelVxe#(41Ym3-ixdgY0=$ zJR6JnHq~Q>MakPd{^Lw4{o{iBLK8C58tT&Zpf+mvRR0vqp+}thnBG5$TOt?Dkzy(H zaSaqwx0TuvQEg97gqGZ3GO41;9sWEmZ&W!!bLqrMtAnI$7i+!h5%J|{AyX+u&L9Bp zSq;5FQY9$`EOW;>xlUI`$hvLZ>`AqGEX-b->(temn0KYL>3Z;@+@b;6%nrXOj+yH->PS)MY5POwpMXBU}C8I;?qvw zJF$<>IJz!aFplQ{WeN%*3y~s@Vme4@7ewo=;yU9zRgytT+hj(EhVodM%0Z>&F9pee z8FPM42SPC~twXD-iczz6Aya8oe{>^Enbr3#X?bxbFsY4M?4Z)JaBIoC;*X5%e?5c$ z^|fI&(Q*ehyw(`1;Ob(JAZ+!0^JkBzy(<)o3k5|4Beii&CymW*Bl;~7 zlGS}Os3h%qiF`gI=Fu^7BQU;FT4veDd0YiEl;+B~Mx#(r7jsNGf>93HW5bZyQOpe0 zo{?8##6XoFt3U7b{nPQsvpqEK>e_y0Y&0~!O)xlZ*toBvPc-Z>1|e2?pWqf zgG*VTcBA&z87KBFdUjgDv*&;eYdt`wuTt{%+wFh*Zu{Sbgjv_krOSFnf{j_h znJ&hG#xs?mQTT3ZqGn&v#$;5Fv)x2=!ai@#6J-Q)?h%Nuw^`S9Ap#iKsI75LEf-qV zUul~TD{@fdJXPndERx<(_9Z^Tr(gy#kz-Q8@Bku|YEy89L1m!56e@W6joLHR52t^9y8hUwc+-;JIol0e+VI9IaiDXRA-AMp%TFq$Tzr@9 zxAOEiWqO+nlT*`$CYh(vG2ogDzkf<6Z}hL|)weEPv(H-{n4PJXy=SlxF~-zKiaCJ* z%zzX2+)IDT7^*-y_CjzVNXqdPqqaQS1*_%q+qv3q0h0mE#~vP-clf8e-o(YZsIj>n zUn%E~w82(?Dc=_#&*s2D!R1r^W7_Kx=?yR9q-#dCf(XN%*uPWaEuqr8vw3~I{?G(9 zdu(mUjAdhNE|TBp#QAuin`-2msGG1p;hL7FLgUO@j$O(-g00xw<$QW0-kl7s*^$jK zcymuI1iS`Nq2lci=l^|mCyEOYA(FI?iOF;lHG3j_x&ON& z#jLFL0Zb8O2SM`Q-pS~aWz{1x+m%Sojf8K^GS9v)HxUXN++PIj2cQFDWB^>n1w$)n z2KTQNV)}$p=^x|8yPi1#7{racGV$#5_c~JniIdT9gvhr^+9te*VN80FVq9(8V1uxf z9t1X%nmxYZSe{)-+dm*b9yO^O{?Uu~ubbY{E7=%-+!r5+=xh)B;@#DrCyn-XdiIp% zVY&cCc0?sNuGxzj^ttBu+lF+FF3X*&TVqERSP zj{}69muUz4Xh{5m6@2>W2#T2}GZGOn1Dl&Ns z6EMI!-amptdEc1+&s%-BFWx`bzg)~Q+d*9}de+UCN8d*mip_;1*A54a-#iGV+B$N^ zniX$lzR}aZu*EmWQ9aLig>&{5Mqd!7or2i&+WbbP8;8ipV5huhOeHX~Crr%~q zJ&TZY;)HBZL-$06g!f&SNbCQ+)m6z=XkFmFB*Pby@oV=b_h>sX#_2AY$u;gOB1F!% zPdhc&P47X|O`>VhF!9`u+&FnX)!VP!TkZUZf7?1=2!~fhrS^B_ho8>>uDBGU#$BQi zw&>43L3Ya4>@qR~09GS=FF+QO`|<;ke7^ogrbX0Z79|jc_h?x(%L$n`1^`y@Ekuc& z3$W(0ahIGQI<4rSA~oA@12M`ww&V(lrpcxf3ro3qk!9--F zfmok+YFsS?fJ#@AOFQZX2#Jx}iQ_?8AFvFg*L1zqtrq{WHEiKIDb3e0^apZE%p zh<{6V_PwJec&3ASsrd{<=WH?U4CjVR6CWz-1$XPFe*K5e@Ea2{^#eIgTizLYV8 z8&}IYu87D_bKNdR!h`U)vtJGs@B*bo=Bq1ej0CZMN>l2dWvZ&ijOqOR$O_MZ;o zkd6vz(WEQ4(Gw|%t&5nO&Lafeu(WM|5+Zfaa|95AZXRD~QbBjJ5Q#Q*{VWngX)Z6# zNplJC+@y@5w(71@TZVGvtZ8E2KDmQQg%9)%PYkCWNGbK z_DRT*_-bDqxyD@q)+l;79w=>KV&pJ<*CGrJ0z*x*PrZ{&tETBi_~@8_k#xrd!AYK; z;Y6NBs)I^7A;2vy?^d}dG7SU(L%lD*XXuya*Glb-YdY#6uCd9FDKQj?J6{*1sTf)_ zJ)7w%)%JXBo-X!$G|vgb2-%hisOK_>y^xNH84O~EVrXWipc;E^+;t$c1fUsa*#wk*L01winYx?i=Y_To<6CPaL?p+GPU zLrLfEE<_!%G#&#L5zPX?NE42~DJUYc(m0XPl`Esug|rn1QgQIW!j^hX4(iRt_a7YG zfo$465fN2t_o4dJ*}R_2%ZKv2qj^ocFy{2^45gqp>dv_OVr`aWr}U6fj1!MJsb1~L zh^gJBCuGJBvy1>E26hzyDTZQZ<^RyitCfOQ9@C-xXJIHIdZ~XQI}?h`mJtv%mz`^% zc+_@neJ6gT#kjh0*ACNL0;7A5-d6=ZxTCMX!%}dHs^RQn57rW2fJ1FduzQPb&SsV= z{h~PZ0YhpCp&yoF4MO9t1y>9fp@OTfhY5z-=>4SYqftU}g6EK7Arx`_&z&cXWMFAn zYIhZJG7#D=d!MN)x(eORcsWd{|Mi(lN%+PpSK)=O``2~+KGMUlY^F)iupn}+Jrtkz z#ryv_{68X&QC#gIh3v5lZoq}Dx&u_DcC|e((%ZB!2s6=ywNvFiRSkfMt(d~sdhJca z9rAFe4(XqY8LH%pp%rTdtypX59@+hdqlKprCzQ^11%0QhO)H zI+J0*2hJ3%xagsZp||?piP2ohWXC$-Z2#jHc01#}ekhT9n%jeQk2u5jeCUl$gbEms z_D^|<`|{&M`H4v}*fTJ#mRY2qPIS&$F^;Si?raWMdy2KtMjz8_RgAk@AJY+x zoD)F-B4URG4_{19NbT4vh(Pf&{WgJVoGLKN-(VnQhq!02yOoSZ9Dsgazb{&OIw#yt z)VHnJZg!G({qvts;RUvgFQrr@$t``7xBdYOkmhy(oPP88A+ z)5G8*k9qA07ZdOoz22kUr<3=K?S9pD4LdB-C`#TGDE)+ylSaf@v3{D|y2gsJV*H?r ze~gG_=t^xHcNMWR?H)_OTuV=;TWMrA{7Kzxs)*|+efp`P5DPF#=x$F112UX9V!yU= z_lJ%v>6c6%ULXcNZ4Z)2NJ_O6lB+!fa886AlXB#oGhNG2+V-hP&CI?l94bb#1X3Q|LKh>cIsU!Khl|r%_&vyVZ z7tHbZI0NWa`2iy!3g4>qLZe#;^;W!xm3tzsm>BAP`JLwS^YsT3(I{W+uim#B;9$^> z**~0!01drWcct3a?rg;{6cHYZj~}Z)Rcd#(hl)2EMJV0N&Dx;{jTT3|*27CdI(9?) zfko+*3N)gMgP|Dm?k(XY3zRAvcm475Z^qTu8AndU2{{o7{@cG$`+iEbbuzLe@7JVo z$KX-5;L_tfL(Tb(f-8U-n$fD%hiZSsBelz$7v}}6NNmp5Hw(KHBdtot37Ozri9e0K zKF~xd_ju^jN<%zp4f))Pm0N8Iukha>F0dOV6;z0T- z0{GKDyAOp%YWHa!CXu%7?YJHO=FO6TmD;|qzQ35`OZ`iwwu-evp;Y0!VML_46pwBJ z4YE=DQf*7MAp<8)h)S-$-~EqD?XLFpc>T$>3J($Z?pF{_)I-X4DcO63Bs69g$ zYNM$_U_a~sT&bOqkd}x=d#EsPb3ECJBe5NW?3Xep0gm@;Vb)z>&K)D9AnwW!1y==M z_QgZVo2UBcjoQB}zk6*ypUshCHU=vzq=7f@GRnJYtoAvr7%S+D4Db0BxQx*_;}pRr zFDRce+VpteF^y6nAf63Y!~t4JT9Qi81wv6*V6XW0M=i z7mM^7cdOZN$Ap&2bTIFVk30SF)A`@8_V}Utvj~;EVOD$n(6}oRe*j-WpuVWSKbq&) z`q$R7gB+1)E;o9=Rd0(bruH=ms^V9j?&gS@Z{n5{q%b*-oD~?)CpIXT=3WX)c5aBO&Ibg%HnF zl3^#x0hcAgsU`@yVEr5#BGMb{u#vh`J^BeQ#iE?puzU`~HiSk4q;sBK;<89uG}Q|p zEMo`I8?4`sX+w361*A~CFTWF!r|S7b!{*HK6P#3-0}K-ZAT&` zUVd{i$BRAmo9+IyX)YN0YLAV(MhRsKrAJud-#x|LROyE)3J+^1yhi2FJUVe3y=&Zs z!B)&m{i|o&`lT*-UIro^f_6m&O5SvX0@{l441U3-5maMm_V7(AKOoA5blHT%)@10h z3IXJTEzXG75D*j>AT)B#Yh%KVQs}@gq3ThlK1va;9Le71#5ruCsT*H1n9+I(Y*E$R29CmOLFxWf%j3cgT(r%8YwZ z1M)JIvzA(G7m^;S$^u)2X+2uL~3?~HekU*K1!(IK?~o4aqZ4ltly0(6sl7zmb}5p(Kp<+L}-(~MX^!) zzT`ZaS0}DemA8oK`HhZl8>Y833NY995}NQvKzTazi79*S-ns?RvMrtAYQ2ps+^{0zH z9GcIb3>6~d>XUgE&_?Zc`r+8ToXpGP3Uo(I(HJ95px~N9DCBHr!Klda3OMJ+ZLg7-9x&jXg7^7Xk{}cZ$;c|^V!?`jW~BC z_sgE_cV7L1i~%}<;9=1QZs6g<#!v(jNRK-KeH3PFdeUiV*mB5+AT$LFkT*Pg!;BFJ z3dqsS=X`@-sSS~oYKsv(2?e7){_OWk$o8-3!P+St@DBGLNp&)wfAOBuor&=dv43xCTR+Hb94Ds^yFCtU;`xow$C46w`ss zq4Nsj0+oME%Vu;m5t9PA(mN5Spo5~j$LL|mzEjbJ>VC!q&Bu8cvu}JLnn7Lu1UVrI zoG)cUB9-dCgCXqcQdk?ME zrR&^={QJ-tK+GP_N2e+-RWCpUwSG8*)lFn5VS?Q<ci-Anz;#T*N+Dz&TK`M&tH*AGGtr0$AOAFA(s(0i%2C2fhQ;1Yz5 z+8Ni}74IFnoxZ;-J{G(=nCD+F|L0_0J>#LEKU9ACW3QS^bmj0)zq>C! zC@zS^6BJe&3Dx<%sK!q>kqwkHGu%qbo00E>K zJT~UE!CKX8oaX+S6Mr|%oDfD|&>i*cgT811Vppnmk7C%H-WQbIJ}9lV)Or_xB!%M)>mgPRO?GSvFVkL(ndz8 zlX(K_~So8vE$I3<*YiG199sY%s1$A+I z?c^C+g3gKFM}gq{5Eu~bhdTEgVj^OmAbb1mW8m~t!7T|g9Wx`g(bAI%X1X1> zW7<%S)GH-#cE!V?dA!=QA6z<{pG54zJRQx86RWxSwEdT>J)X?7cX?#+hwA%pHvb~x zemMVYZ7(HPcg2U3eXZ@8NUUpmeZ_t8VPCxa`TQRuqPTc%KA-KO;3~vx5In?nyW+#e9=rj8AJ-haymqUIGp?Q09AxM+s5XX@ zngNE=w6W40o9BS>4}H)_>Oci;#Tr+)Nqaxo6>#-8Hs*G`t)V(C2{(GLpkJF`MO>xsy=PYMH=v+DR)4Cdhf-}w=xCk-WHQLh@{kVJ} z3FTftUa6gk_0=(kbUh#lI9(!7`mSA1AczPVR~vV=-bN;jpO`TkGIUTwGu>hEs&RE| zx+U!jBO_=IR)&$Cqt~wc`02UhZri1hIk(a(i@;#bmG^@a5^HUu6C3l_odz?-LAyU( z@Ft_CVEIXeDN`#%h7jl)_^^S}?egEzDzn|@) zc4y5c2>1HEH{kXrA>VHQ<-Yi6#U7eR<7x%HQTzUG*IexNgK>=?gt?fbSF`klhO~ny zQmNg=9-r!;Tx%F3{doNZS`f$yLPDTY+fHb2=d4AijpwVY{l-3Pij7ijK5qW$uK2)E zS9^MCejSkyq4#6pxyYmnwSgyRqySKIRdD4S%Z;mzG>S_v01wia1}OJZjdWm?$E)l-EXzlH$0jY>7wXptk-IR~Fo_~3tAsolrwPgi?>s(%701@3g^?rP6I3vH+GpX*<0 zcX_FQzS{G6R?}_O18wQG`StPogOx_1V5r7kXwZSQu1q`qa4=7oxB{9+JM^H43-6YK zH{K{5%;d)QQXOvtVkg#*O;X^}6_ifxi2S?q+jr%6zVF)DYr!S-Lq8=uE4R_v7^scf z8`o57>pz@=uHD7B+KCT-^C_K7{qogTxNU@{MdL*-Vcb%WJv*gO&9m{-VIfXq{Kyfx zj1iU&Cve8d_cQVxDJ@g%X{%rv8L`En6F#n_@Xp3D42xU%c3|q}@E3=}pz5yFu2S2H zs%ohFLVCRvHnh^v<|Z@Uj2zM(-8tbA7;^MDB0Dk@o<#siYmDthlJuu5q>I za-;SZMaO%z@jac;Pc9)TQILH zmog|~KSK0T-FfDYjTt|3YNg#1+ik9)v^iNA_tHmHUZ7P6Kt38Iwo_3iO%-5u~)_V>Q0)=Qf-9XIJlr~f;O(M-Gzv@`awZm z+|gIiL!%FTuRjV&$rVx6O{?;lbfz)CJThe@qJpb^@&0UHH5Xg8Z@Q8SL>qm#QFjVT zhz`wDKSe17>LzPK8k&g<{#bD38J?>>oy_aSo`&JrkW84AX9`B@+MXMC@gn?iCts+I zk*0AM<4j8vOQI4Dt7!s}Xy}5gqj?TYE~iB;l5;NE`J-u4M09zWjO=4F@=9SUR_Dd$ zi{D_9YZ%uG*4J+50-`pqmK9HQkRtP;AqgXrJ~+rpfGEx8=dKzy?J( z4d_C+rbY|B#|BMxt5KePblUx8EPdqq4cTwUU&Xlxmt3JXPR!Mw7%0{5wf+@^t-gCG zzp-MTENo{o|5>24>LoQaV5z}=JNT!%8-2g3R z_+Xc?(BjIpc!M5r+0gu3me%YmEf%j94z78DD3N`@YQz|dNXUbf#! zW2hg?^1bUy?K)?C7Z?5&smECyZ4A9<@O!+b@ho2uq}kP4 z9ZB8q5;n!1aWzP+*xH_baI5C>uK2js_X^61)b4V%r!ET+F>maa`tsjxV+etbGHA`p|D?w zw(3rIUIjv8#TeH_87CR-XvXsJAd}CHk$nQ#GNS6&CtL^C)59QA6p>Tif_{%OY(42# zv)_)t4d;%j{z`M%xT}zC^}WvzDtP0>UhS(B+h+`WSqqU^XWBa&@+T&cZ~ z>sqo*Ln9X&nmUi-fv@Nqp!?$8$-I83zV9GLMq8V{g*|9SrLFN>6Ez7GrM)wO^hAHR zkCD!1V63gdyda%XIx&w%fV_aJ z^Rh+yv^){VP!HudKc4>0kqM`<1pSPr zL}yTE@H8j)G3Ek>(9syHlZKup6Iv@x!BwFuJM_{AK})Gd8$L(QI+HUzK-5G5)|r|v zAa-QaY|Layihi_=Lxa#XJC`Uwsg%&OcLMKx9=dkS0e9SS%0%PbQ3{+)0yeV;N^NRC0XuXfM`J;?z1HqBEs&F+0%`6j z$>8OAb}RsR*ONh}n4xxJ zF81KJ+6Bju9>6Z>rgs*_i2y)$YEXu{ALjsF>M`@ht%> z#<<$6+8bA2?Mb@qsyTBV7`e>mKjX+gv|;CGIbB&IU$)1PJsL_*lTfgcnEi(Ax8rYK zxsNGtajsEZY}C$*Db=6 zFSIx{&qSoTG_G+2e?81G7AUMU-Yv2le35z0j?hs6C{QXW$vZeEY||CA^2X&}Ku%n! zt?~8);WXkbDyl%S)enyB$-GLSLCFPV$7qTyIgUir4|!xyvoWz{Z^o)RF|~8v`vvfw zPh*|2u$1b$BfVi*P4-S1#T6}ziJl$fxn4?7DorA~0u^t#%-jI|cKm&48483EU2cX@ zd^B-hstw+CG;N~Jp$>7tkEKM82QEjgvT^{*O*MtL$X zekg{a`w1O}D%G}jXG$$V-4j=;VlQC?m{6*%f@Wwdc3sWh|CqP>uH;Q`TEb8TmuDg- zw&bG7E<&X$x9VPV@l^jjEJcW&hqaVKM`!@q5*W+)NV&>)j_lE|TSTt*thp?>^ht^i zwrk@@AeQp6Aqk(a*kYJ3}zrElHAEUG_ppZS$u283ix*1j=updGr3I$*X#r| zEanl$QMB+0IZ?%LRl|Z8qx8!!$q&y5y~G ztRFp1X_E^s_r?1nurk+Nc{9uPH9H0UUe6Bs_JE=Sg2rAPxo8I!L>s-|>3b{o@%kez zxdJ3Q^-Xxcc9u$!kQLK9zf)cvxQOiIMN4wIdO&9N z8q5tCNE1XLbm3eQ&Tt86!SnKV+>XBk=Pr^`2IM`Y5~UMzw={CRb{g5^g<`>*_vQER ztM5v+1;Hy}KuV~&+M|f`zOS8Yv5!V77;L4PeCioIiE)i{*6U}OSV*q+JeYh9br-Vl zk%XjnmqxBc6VM6o@58ldD^GSE}vRo-gK*uBRoPgPH;+nYC(@r+Z-shE;^d zd{Sw``FOj3+jYy^R8pVd1STRUuIr9WsH7ZLCaUR$nmxT(j`z6T5MN*j!y`gJob8Pa z+|exu^>+L&l{*sCblH7(dPf}LSSWdS0c-gLBt-E7p!aJ$G*6G$A5ZqBadl6Q8+SdL zXLS7mzYJW>QL@rKE9PuosU^jsQ3%n+9Ap;AkX-5lNNwEJ*ZxYC1qy&`d$!KbtKgEW zO6@ett393VQOF@OpNXh^Fv(<0L3wU3zUJGE_HdEeC=ha|sMoi49Uo_;29zT4OQ41p zA}glr&9oh$xtr-y&Ay19^KkI=4i$q8U@Y*347e_1v(02wzzx}N$KM6q#}x#SM)O2L zh$TiA3DzRMLr>gbAri@?YBa8??ZvnTuxIo7%lSV~=GBo6ZShu4J=O5-v+f5sDJO194J60$JklXN5+-W3^?Ae-q4otCW z@7ZLK_uzf0f3;!`&EwI$j7wc=6`q}>2ha?@wide?EC6@@@BU#0SJTA?*#bHENE(Ia zYG1s&FFyJSOe=;vr_9!#2Ku4+q@ZedIh#WpxJuD7csb#kazjQ)O7^moN?Bx|7tgH# zR7OpOIGaC*Kq2yGnU0(iC2$ZwsH|FpXd*|>Pyfn5=_DlfSb))42Q?t9I!mKAWh)$- z>u29u@bg4E>ZSRz!Dz&vft(z>?e8vti7+mSQt-9M6@BFx|hy$^L zX21)R_WFILwodHH9BOy=W;ii5X}s`6Tp)lzXklf0Z+FtERa_dKm zAZn-EWUz7o6Ei75QOA2IC?X}0juq*RDF@h>)_*1&!vP2jj}XUd{K$B^XFf zwAf=lVK+i1b=>S_{vP0tBrk~sb)Kqz5|2dI^)y3wE=)tVlzL-bBe7XgrdET9F5Ogf z2_NFmf)V*>Bnn5M0VCOkCUX#CefhF+g)L4dx7{Ej$&2vrsPe>ghF#+Ttg!9 zam}%LIyTRaY^gT)#V0HF z*gSbJvw3xw=fpAcT&D%zX0f_Y;B^Msqc^BVvC(&ptBF{#E_q{I?Z-`#?%rpnvBpO8 z0+15{iIdO@pS%rG&!@4k!5LVvHltB0lLWT)J`pOWXo?wCCa>We8*@8;Z*X4>$i#A$ zm#N=V%flL;9Y`bld>`P8V&kq8?$wDqnU^yi`lREn++EzMlQYI4Pe^KaE!?J5mEr;f zE9PuoW&)dJ;Xj(W5@%d(UE|mqS09?klX>+C;2Oni^SQCtz-=6{ZG5f`2rQ@NmAomqI-5fS#VrA)d>%jw9Mj7U(mGI~!Qah4z%h~SLs|t0{4xXSB!s5M z^OJqw8+J>`3(Rgc`|bEIqh;34psql31g=a`O)(KAOPLw6BL$-)Vja}?*^JaQQp!QZ zYYK^zEe=Oy`0S}_j5h5f1A;? z{=JtTw9m>|1kYVBBol5(?8cHM8s?f6}3nG_q7Vo{bSRF}=c^EG>_ERNl2 z9fmovC2tFqwbYm>(nPk!yZ7aH8?|%fUg}?5=MSDi_L4W-j*zipj?H7(gUvKiqq}tx zcd^GpD$Rw0CU9dS)!LnPN+i^R7m&!fi&mOC_a|}$5 zK!`$BzSk;CeX5b~s}8&k(EYEOb)~kSHvjZceDZTcPMpYMtxXEL*DSu)pP%br zTs#MLBz&AByPvmI(3RS4)ZURj+e2-AI8+AN7tT_wW)EhX(%cbJ+m+PkLY9%3JqrNM zrQ!mj{M;7v27u47UBGL+%{L}n2*ifX@}^EdL>t^x8Yk#a2JOE5ErfK6O6>E(`q0n52$km>%_GHBbCpor)BFUVj z*@EN@D&~w&8XQx}q-kvGKDbD9_Xc7G;TYXpiV%c4-7!vY^VwXPeBEiOtDo}BG7nClKn-vs87hIOS(OgOE zi16aXwv+K#!j#C8IUT-PsM!%`w=&-*XdDBTwR?<>yvF5B#x=+0MRTE05S`EF-~~&O z2PcMRSJv$L*;&k0h`HK7qK)YnO7CKZwpW87{-C`kfuM_jL-yP8MSwe25VcrjLi4J} zX*H7|e-;P0BL&*ko_6})xU2Wr5~A9k3D~NA$r}w#M2F_lxaPHaJe$`J&5-v+h@nEy zq_YQfX2oDX!s=~jtQc<#BjlVo=|Z&=r!J)nO$2ggTiYp4Bk%PXAu*7l%SJz#e7`cX zz;sp`agK;;cZEzg63I7^A&C4^hqO92Q{87+rpVPf`d&C>&%sQ=dXKR%w=L&y$bLJ% zoXS1J#$;8Gpfo5WOA`mb5=z(XnMAdIktR}d4RNO_Y&#f5?b*z>U7Uf8(W$W??CbitK3y=vT5 zL>O?RCTfI@Nn$Rd=QdumztP1vYAZH9WU;|JE4Mw{F3x+rNZwswjgn_#8I)mTmdw=iFe3Sb7qPq%Yx zHRHs3THi=R;)sY*Xx3i)XsOXu2*ib1*JV2Wx6b_cJa-QS>>kWvNe16D!sQ%=R*J}&$G30=Yd;UzpC9}<#v1#;2zS) z8SB2xJYm`qY}MU0E7%tOBm3upf)*knab&xaeAvQUX`FK+)ZoHUn#+ne01JtTj7zYf zQfr%|ZMDuml@DNIA#!4jG_}2YrxgF{=!#Pxi%LXJTq9RYW~=TMJ91D^3PtTMqxS4V zd4~jFysV9(+}zm`^BnQeU;JmOecl=t1xv4i+}lh&GN)%>cJk^B$H;ZWy0kW7LlbrK z%q=-{tJ!bImsYvU(!G)5qZ7A#zGeqyvvQ)U$9c_Vq&YNC47RR`-lZb0kxN6Qpq*I5 znh6AE0>GX<@2r4_SCaPsoD*wBoLq!lYa>hI$cb1tEBT2?qfpRBnu04MO@Ylu?T)5# zViZ)t6~Je6K!mxDRpN-^^_-1aP^QLs_9XFztjz?{dya&*QkJY^Kua>s_;vV}v^>hX z8|4=|A=lp;ZS6iH729s=tzf?$Um&<6atkik>>x?Ga<8H?!v!TB-;B(}tdKPJ(%5Uu zduEe2ELrPLaNZ%1{q(8#4)ilnp=%A1I1wV}3w$SbU~iB#G6c9(TLsOeDz!VCSD&oy z#DZX@DX7}(ca6Q+sjuYnW+fx0Mw~rMr$`5X_AcpJ_9Ho~yyO*}d}OGSqJ@cB#Ce-s z&7Nss#QCITw0G1IUnIbGglS8+n*DZsiIqFvaF-4@SnMvP-h>ud@NQjFHe*T2;~m08 zg6W|pyo8X5SP`+*jP?)+#cl1DeAH`2)Y)}76sdwM#mczaH&jL3)t*3HsH(PCN3P_m zP#bHHwCK$n@3(@ot^g~vF_dx^i~F=hYH83KlbXat7Nrt#bI48uvd87Nh=XuA69imQ^Gpe9XX8 zlvPjGars?2;>ex|-A+vOAa0BmUG{uG&0Xx#ku$ETcuRm2TdIwSh{#UgJF2 z!k?WMZQ8<9Ac?|1`rtXTXOdNxc)8)VCi}ch%^rJ|RTjkQM=rbgBDG%k8#|FsBojC( zjHUOt<92*;v`nr(UYC!PP0MTHC2AEPzYk|_@)9*XKz7HygzWQYKqBEfLv9Rv0g|gb zdkAZ~5uTE_7khHjZ1vr9{mWL}dzYJR2Q^it&s}^Mb5Qdv{4yIuDgA3QJ2%w@PFMG< zRgViRdR9r3&o4!GivvQh*6-Y9ZrYgJ@kapnF&0R2G;wKXoy|eTtn@^N_Q(vof-=)0 zO9VpN0BeQZFIltq4#gsti3={7xR$!$N^?o(K+Fo-itz&c?6xL_I7wtjlH6FFc*+Tu z<~;lI8T#vx9jP|*f{R?_+KYd&xejX96s|2TIwyCG22*dD&bQ+W1^0B_v`|VT4k_6j z)EJ0N=9rdt`hn*7Eo@BW{b12DHLGs?A32OSL5nCT2n-*E{}5?JyLd+&QKa zT5<%-&$Is3IjA{%p%rN@@xiyHh>x{NjkG3qW38S&zd~g@6JbAOjbr8QxE)^#EtB(S zPm74>_c@Yx&C=*MEqMiJ{PtqV{^ofZ%05XNE87PbyxFKbD~1RaZ;h(~epi0mxGRx7 z6dwrK=?CK)zJY!aCDPT}a)f0OsB~t%yVVD@XZL+yyek4iKx^m%%PIBA2V~ zbIBXDCUj4d=62C!6y)C04cTwU9}wKJF7_;jxw#H%Zo8j%@qNqPgA5xJSuGO&<14f= zG-G2TY8m4iA4wt72#5$C*@@(A4*p?{y^O&rO>-ehXk@W6QkgECy5y!OitL#CE@aa3 z=*>JkmS#Tlx-42^Q4pI!U36``9k=6;Ov|7(MVepO$g?q&N_ALF1V#RK%Jb}qm6UI) zu-4=SruG37Bg5W0s&l8A?uRCJW^K&kVuQu;^f~7cdoZxB-i-b>TJA5l0n^j7@vOnj*MQZ@8?zS}4d5(f z=TbVzCGfnB@650~8j5TOHUC8~CvU{gNcx3tddJ)GwN&nFYW947JTk~WB_)7-IhoxN z=lot`Y|zAoE6&DDUPaQ$qO?@Ak8voPa2@@~pBh>5z=i}CkVbZxzBU^TCbBx_>w6y!pwoS3()xqXU@F@REizcvRT2$O(ke0 zs6OC5-q!BN|0c&}Hn0>|UcWCjKRz3)Y-i6)|1{Z8WO##$KBW@Vehu@S*F8{%*@M@! zWx8J_muV#?Vr(&={`K^#ikve#+*SU6?$y-nbB=s=CsEanF1%(Z-@p=nmwf`;b6EUr z%ypjK_~ZWils8;6lU-ask5YUG*U`gU_b_|#0=7&yk2sh-1F>YbCLKK|=M!0}S3`f{ zvHhx_Qhe*20&k`si<>PlAD}dQsYrQtN}6z8|abUUb4#5L^`qWS6aZ7L_`=vrXt4*BuQCKXw{Y?m?yv`10tL)4`B&Y2zU z0e$_?uM0cFs4CXa#vpD?@RH;%Mg>TxlDVWRTj*i87ER7qle!M-WdrV{K~r;4e9|1s zLAmUpGBv9YKWOF4xl-ITxJ`hzT}!zr#s902ZcNMU`{7{KJ?v8;`Oi>Pj&w=XLRAF8 zODOmKmuA|KiQjM?Y=y^-y~>yf(|J2R0QgUCV_#?2J)JYAsN zrLONCt!4*RyE-WA$h7pd9TM`SFkERZ9U(}YG&D>8EXB9{8s{+UQL2I8AG%h22b=(O~6{)P7=!+)f!N~ZzFPsC;il}fqBNkgb^z`{$yvgkDdVik$90V_D%TNh6??K(^#;Clq z^X$IRff+pmWjduEbiEBGq-7BlgzM_BG|?6RRo9x}U41Vh*5 zGR+#=o@=}t6QU1ZpWFeg<-7>Ke!30+QR+7N>}BGDCxhOwPwQyH(BT|!B|dACu485^ z**R3D4~ao}#V(Ks5t|t7D|9!g8ut>x{JT2H^gpheWcVl-pmws2D9X7*Y z?8cPcI=SDLS8_s}oj^<`H<9r`brU#($~CiV?Qczq>qiZnH^@A@h{qwWj?0_t=GnXB zK{2v=d;7iRX!hWzko!Dcz!Thzh^l|Gp3FJSxPV<>65fNBoTGSmOuo&&<7s1d`7Js% z4Lj{Va$~x7x*@YS8rjUVzkkHK;rS@dzRnX<#}g|EUfq`I6T#ZJL>m_jS%A>Yvy;!+ zYIY-^Ws!HOi^N9ngT6~9R;}F%cqls!*)GR;QL2Zw;E)gtkdBIOt?)u5P8X*bu>(o@`UDRMrJ@K+W$uwzl zVk7Cth^uBNZ_(lFFJC0<2}m&e{(?QTi!Qy!ZM)TjdigWGgKAm;7mM~3&t&lFZ%B%7 z5OVjw>c%3lIjdbFtC?r#njM|T0+?z#aV%`}i-UP~@%^p=UHI*v z%uWfhRB48BW1yQ}{Q~MSjm}Qo+J=(I89nSnSRYs6 z-_}2YG5Zp((0&CcCe=l{Kxu!Ur7({2*&+O{w+~)gv-^|VJSvra0_%$F+F-X!d#zUk zUbFlE_JZIiDtCyj_K6#FaXHrIq1gNEeYz9+;yKtqV|)N{ih)fQ@@qij#>k*sX_B<_ z?DWCos@d0#FLe1?KH$cj5Bodm0$U`2iD;+MIxhJOm-w+D_`&3k*_wE%MDI}r{pPdV z`z|m$o<3K=43D#MbyKyrB=2vpW#HRXw?O1AF-ve5EF}yzdmr6~k@evNLLs@BK82{P z$4ihj|8M5q`iW)_el)qGtY){&etigfgX3_Vc z3X+BAN8gsGZ6M*sRKL$fPnxyA-{?#G{Lg>%jn79m!|XwDAa~dYUX*>H#_0LI{L~{l zY2A7hUGLiE3*pv_$AFP1EG9<6VXTJsnB+b?G=IA0Ca2lgVS>J;(XNKDbMVaK^Y%cQ zsmCA?_DR#0TJq|BB*E9$=8bChmc#5pK*;^xCD`fz zKC~^Oe0IZ;gU@3U*u`Lvb7S;M6v~};@86RdZt*9An|>*~5`_XAV>QX0cjnn0?~`}L zmf_iKhGYJYae>0@K`>D6O>PW2xy|`*;>Q0>+~s1Gy?P)-CFH%&qdMfLGT#4qv@~S=}G!FPKjFaRmK5F z<7;DJg_m%F=bF7pbPT#Ppt(UUU3ElNKcso2TQZ=m5A$RIa+aXUdi0x0-o%4`U=Z{5 zVfG*xEBDJU3)=8;*vrP@Y|L8Dk>_Qq+b{oU2Xzqd-sZ-*hU;Cni$?@sT}ZxnPW@}G zw=ZOpFxv+ab%}b;ckANJP?Ke2^{_H~RLYuC5Ijik{&&yM##D6;*8@vO={F1>1u$9m zafgkbjS+6XcVo;uzzmHO>ys)g?Xx!pe&)$Wmu8#~&egs6Ner5srviP7^Scz+X7(Tm zoN~ut_Pp<*hrWWNPu4ZFo86>247;ImnE~g(VN6W!f>KV z2b0YjBH&HNmhg^RH)c1-<&u&2e1K-NRPCUWhU>H6vUFO@xGm2$Z^+fqB3X~V;kuFI zX&5E|QnDH2(vE9tnBghZ7+&xPAP=nwxa`${~o~(EEsv=e{Aq0ymwb{PE zZn$1GP6XS(+MSwD21=`e`0PROVdRd9 z9YB6d-7Ly}JZS0$`gwMJ{U++#dN;;5ZHhG85f|du~j-fI1lwna;D$8h5$8%C34$k-gb26-;Cnh&?T<7ah+o$TMT`^&HSzhWi`~If%sYGG+AoyEy-^Ne+ z9#mLo;Py__jihfFAwFPsEo>RH-!PHgzd)G%^0r)p>Hp-$z&%F1pL?81VOKhFwh>{`C0CN3WOaDmnA(q-CS035Sl zzmRCSuASK*CC959qo*GKymYuxAB@z%z5iyS*@NICZ5d;C9-{~^7C8~fmJc2Z9yLz5~}cWbsBS zXY6d0x5R|F9oIRS8|ze%H)M7I=3w@-szvi=pw5r$`x9mlg3q&MG+(P)K{JE(%$x9>~eplac-o*$-DkJYCOlQEq_Oi~3{OaZ&axfcHEg5ac!(=Z> zGGNWtbiLlcSl|bb1+$~5_Nhnv1BJf%Y^T)AJYDU1zv{dXg5Z-tK zQ9_hsu2nO&lKVbF%#qA}<{n}~hndKoqcCTv<(M-m=aAc&kh$m1kn8tZkKg|M?6ddh z^?JTv@8|3FdcHr8z0Glh-xafqGd7HpQiIN5q)k?mtw$O{G&uVs1O5iwqhS({igN^v zH%z{B#-_@PWvTtiJ_UCEi;*l`Y70mOpV-r|r0Oo`T@rmZVa+u%I3ol)8wF0*<6F?3r!WE zltwXsdjjXnq6n4?1i@3c6P1*15ymC@bzxQA93+5G2o|lpgy@*Qz2fKOPTAUhbr^VB zu>03DXE%54{yKxh^8YZCn{KHSyaYP8!2C0(sR8+bnYl8xXK=+~ZTKnK)I^hQc)@%L zZqY;NSjj{?Q38rL)}HQ~W!uW_Yw#V@V?!bXh6~R_ML`W|lqtbE$fEJ0VX#=dW#sAM zd6q;@UeN~ZEiF-!uGNWl>~2C&gUS;no%P7emYeZ)sK$zjMZGlqrL!+wIWT3F_PX+y zrO%AzyIzR>#U`u>FSrjySsOjN3V-9_yKzqIksvM3Hu}4t-fQ!3qi`syU}Xz$XrXI3 zjP@{|Ta6xyn1qeUVl-BvmePd_t`?cLbo5Ib!>H>}ywh4rR~xs;O!p>n7sli6`_nfRi83biX_kirsv; z$&#z{^q^)$qzDv5DRYLM;L9*!6Gkpg1=E{c&%jOuWg$a|V+2SJg~y`jd;%QQkS{6x zZ0wfT*XJMpI0p&i(CL~T55%+l!dg|!KQ+n`0Od#iqjTDp*}=f6+bF>T@9AEDtw;Yk za9~!|SDxR@9+I|oJ%z`s5g;>aE;h#HIMT;$SD$J{4zGwuNO$eT&Y(K5q&`qZ?gjg~ z;g|2raSEL7p4y-ne+P!}D5MNJ!-&csZT0XDep|Gj{!?24c_2;?)pD}fS&Xq0ePg)M zaPh-#+Z%91dw+}aQhU9`wwj}wWHiTJ1ZVJZV%2*QqcFuI&!GZ8)`}??9ucb{EKxj; zm9&EXvc)ceI@>TNUR{I?Vxra-ZCV*`My(FM1_EZah*CdzTaWqNmGoLj6gm7+am>l@ z&S8(TzLP>m^v@T%rN5Q=`+I#}bB=;N?ykNdYN!)>wXg0h^F#&(VN&7K<6F10igU{s z4_4ljQnHZcBSKKg6}`08CYU`~jwT`}wTz$7lo8Ng-`b@8a&R!mA)_@N0kq4!qi2?! ze}C;JH5@JGxHj{@uQRxklI9?08K{A;dr!`o3R`>?H?mA9Kn;>s?0!@Z_j|6ydq7k; ziUKs&Z84MLuBo+5i70pVRj55k&126Me3vfTZ#X3kTqng3OKe zlCs&Vb&o!+iAVol@D=@@ELWS;uz7Jd1N4!#$tVszO!|6At{MD}YV8%iob>HM`O&Gi zye9eIkPjKyv&ws;S4JHcm^yMLe$YCUF;W*wng((j$N6(lTQeXm;5FBiwvx?Dq7N43=M=0{`XAvMu0@ z(|fGkl=tL+438?j0Fqw5=r)!da%m(|w35sds4y=v(fvTz2$f77ag%UbwnmoT<{x(I zOrKA-%{qq-j7-{ICLa$~ecd!f0?2tY9`>X{pO6!fisj8et$sSvPeMU~J1nR7GNF0v z=y>S8^$isKH^EcvdJUy*GC`xZ0)RNYO91Pe!=4RhMyK_Zy z4T4iCPf{2-wX@IBd^3&mIk@du0X>UD_@SJkA$lx7b!LLE)I}C-^pH?Su)m|l?I@K6 z!`a^!(nyD5gaXcb4~zbn8+HMjh1~g1!EnHpR0F|Abc@F?Fy*m|kI5A-qFzbgE}hX+ zmw>W3W~;JzrxDwYy`QnhiUvUd0RhGKAP^kvE$RPwIeD>5`GnjjuKk=EFo z;U_`1g8N)39K{yao4BMV7A&Qod&Ge;{bH|@5kK=eihXoo>rfb5n>|N{^wSR2uP?T| z7>*Dp_+Q8S9#l)oQH>=z~e<(h-kKB^doUl=r$pDbyw}?s{QP6#$rdOG5H%Um|U{@4% zF1-$9VN-wf-QEY*U_Qx%Rt_^2t(lcBEKmA#vRyJXK$cyw$eC*c< z8LK-(iuRn}SRONd`sU`d1Q1>^k!7{4_SHP)y+7elCPWa}M~H_N#W?+1%~o_jv!~|7 zCU_L!WcbuSVtl~P*SyIwHZL@je~G>7%p_|Zte3XOzF4IE z#L`G0hD#dd{gqUZbd_2^PlW* zwbuxN^mHR!xzVC&SA(S=kAN04?4suTp%A?3h-*kUg;?DqW= z{qc@y&Vp>rXQX=FR87d0PcamcL^ixY1^9&6P#)s^bx~00JMSu4)6WApek3orY~B(% z9xn5_0#!L?TS1g*Z|cDrITRs8 zRkpFK5Dt8C?YQ}VVMFKR9Hkw(uP$`1M;3Qft2eMq`LgW`vn+{hF^X=1E!gm%8!Nn* zK^Q^JmFi@0KOboSKJ{q4pIS^(`fX#huyZZ^o;eg%9VLp(`_T(p@UK0^>)$e=a&kA!;Ql{~Jwq}kT!@h{^4@QMPQV`Sq zXtrZ*&C<$fPUdvUX8Rq*DpQ9GXX0gA)B`d>e!Ig})v`00)`y2F;O23js=H{^Sf^`@ zQ>WcDq(9hiBI40I^4Pg6fU(*u&L4EGGtyLK?pKfIdeD z-%c-|v8nrVJnxSX%BIHFoO6kM+Pj&}nUf-1=B^Jh8;o`%UO#+L8|9LX%ydqN2EUR% zX!ySDA_q?39}ohybcE!betf!ICojlT!Kb=#fXv>4P1V~vRw=%)+>;b2wtc%u^hXu# z*42)O5An zrAj>~M+l{i$jT2Dk=PbzLw5rGI?@$wRZ(!R>#DN^Yx_NHWu4@$aauOteSG4W&CC$} z44~^EWGd``EeV4f*J8WRy^$;;zx>@2M(!;k1pT6@ADqoPIB;Saq-PHu`t>%m{I&Y> z=O;>@VO#v3M!>I{U8SxrGdmRsx+)?_+MrJx9@M40)3L8}>}ZV6l2{E9J$}Uqhv1}$ z`u|+f>w4(6{%8EWbz?*gZKe3Ot`Y$qz8`LcL$MAX8J9{c3j=p5;VJ&Vh}!TP-V0qc z&*L?)_3LUZ>2rjE!l%Pn2y2{2=cW zMB+=3`l)D{GaARcD|&`nsmFa&&`jBSi>b7vj61;DH_651vWbRkG>_RXQHY=7hKxh?_bChJkzjaOw)2H$Xw*05HHf6w`L=_gg4jTZ_Q zUS3@!2>fs*UCYWiON?EcfnP>&GH&Q{NYds_JxyjiOvH`rE~Jf%glK;hFRm zJyL)j#M%VCSbTK!XMn5b^(`81(Fu6Iy@!inGJ~YpqU=z>_gxyT|=NvFM=7 z4!`Ka;pOTL0z@sLoon9EO`7sj@2jWD2Uptq&P!a#z+P^RgheyMCdkI#?;%piuYy|r zp3_1gOnPNZ`luqyw?Dg?HY9`~PHrHl;(^hJ$OO9rTz0v7Iyc5|Ln^ z2eg3$XD6YFPmH+Iv5>?1I!k^3+>*Qz?%(a1-gDmT?v6&cEcbwdt zlHOC1k=wY|EqQyZx&SQaTCK?HFc8Gaob`e7lK9Q3M|SxId4lg`=1U{&4HJ?!G^9EU z3zYp!YML@9o@D}6Gf3Hhn6rMp^3KA=XVtE=BzHnHm3^@;aJuC1$7y$H;zR!`5>6vX zU8Ry0vBuF>Z}HICU!NR&HOnEHOw6P3z+g8sf_&Vy2d!sXehTdxH2ZQgH;Kj9&RTw5 z$KUw=lVmmY${c1ZVEMWQR-~9q3clKr#aSGv$_u~$1*gJru$ZD#^Ysg>iHn~}uj!mh z`GbS?<}>Xz6(x7F9F7PIGnrhTIYxy=wNY#UYpmg1d6%&ACLcP`*#kXaDoNSTS2Lsh zdK^fh#F)JA^*4nR_L=NNA{ntH>%Hx!rb=kur8!`t2|9ne=9JEsq+-dA^`oO~>$e8% zn6q$a0L+-YkCuY{R$GjxLp@sCtA}(Uuw4t$5tlx0b$i$tqN330Ur;1^=WAXHaZxM* z8~H81ArX#h5DNEia=x6~1L4ww>I@QF{i@A4l_(Z(8L&3=C5g8fm9kd+VP8}YU47P= zGS!6RL=w06?C$=@*L7Bb>Frjd3q9WY8n8XZ87xkOMg(E?K38lwL0c~DeA;bWoc-;> z5%fv^mBl7aq`0_DMVg6+kq?9UiASl^hjBoB3FK7n`ghjY(k-9`+1xcK5OPk6gcm4t zuwu|hnc<3IepMRsDkl7tn?4kujul@ZK$*x}^2`4v0-Aw3_T@pF48W-q;gquHAl=yL zMzr-|YBeNJ&U2}IV0yju!Vne$FEDmY4;RwDQ+MYw22kEah&gQ%x;eGj2Mtimh%8R2 zmf{*fPIM>v(R?6DYj2il4;2UyfKXq114?fRt1q?1vMoh?9R@F0bJvEvIZFZu1n(89!}UBGAN2@FLizi&bB zg$Fzp8~#|gitERx5v33A-S-vVFIrY+S?eXB!crLMn9eAZu;jcVysxceN@ZOjvt2q! z@fRY}x5uFieD>cR-pSu3pOkM%@!?MRfLba2nraO$owd88cxb_Xx%um@LKa}06W)yp zQZ_v1Sfvln2lhibUUsN1us3UBhROVgld@Yp%uQ8d{)$&HOM=(Pugw!BT;3}F9i?Tn zr$Jp$1#2vB8{zUM-uy$?n3zQ@SvD?e$M=a&3I3$*+_nX%w278;My_ ziEI7oPMl9z?4UWO!hv0zCa9SIj$~+h?~6WLo9B_lHB&+J8~XlF^`6vx-9p@N_Zy8! zJ3k==%1o#DLseZR0#S{It^k?vn}*)4x!XzO+@7djA%&92KHGupX&&%2(r|K1WmDBVohnt%&NnuqAn`m!bstb# z5o@_rcC)RJWrPAiSYX}=oxD3wB?;6M>EN6m99J?keM$%@l$(s=VLN88Z2azmh0#|= z-jSDNRvbg<_&_^7W}`0+IAxTgC-|IzgyFd}W^ z4)R5nbrqjba$w;*-bgmypC7LF&=!p+1vQvMX94C3fX|fjnD@_%|47Cfbnre6Fj!Ut z@8S)2$vi)`WfGRbjMUqoP-`|9jk^1V>S&|fPH+4Afk~dwLrHN~Kr^gOHdrZF(XQ@; zdVt7>O>Ti0vPrXVuS)qT2C5&Z4LvO-hC~QX56*=ecGqrMAP{lHf68rV%1ptVq2_mho?B?AklJk&tTQzI#-QqL*#et$`qnj+o!PrR;#WQSSIh{`{hKq& z_I~91rvzoz+VF;NSdT0BSk*3{14IQ(mhOrt$=z$R-#&p->l5zB&TrEE3J2`Pax$B2 zH4=e{?JM$DKi%M{T-(2pKu%#$)N!pysyhj? z6myR+(2DK2Z7dbaD|v^frYdMCB8}0-Fcnd7F(rHQZ;gL}s*sn)oh*Ow(AMMEfwcpQ zqAG8g#XeKa?rpkzTANki@Qj(&=UE8nA>cvN7}q&Vj|#znx8LgeX|h@T)TPhh@mBy} z3B^%=;ZI*uALy-8=Z-VSy&~ri=idd?2+UV;|GbLiZY^Mr9{(`zaBHURmpA2ImjGde zZYI>a|GIgQx`6oTB3LPf;ID>gaff{Y>oFc>LL|)eRZfi-Y|=NLW>Q0g#b3t$hY{jQ zsCE72`2F*#lMz?!-LkVzmpS<$@B)D0v%pE*mrZ;~O+A6Rk{(ObNhEfuec(Ei&I-z? zy#^9Dni;AHy|@rXCKR3r@X7WT3tmRqb+GKl>xcwKj6%@Zx>K=i?d{?K(wu2_rX(C z51TXKK{K^9<*jR~E?!`&S*R;UWLNXeGT_;>9LkvadCFry{JgYxh6VkZ;mLMP6O*1Ng|xFq}I+-l^y7WpH>df zkVxzY=iXqyD`Og|z@rgs1>RL8siVpp1i^qy=vUI__jQ1mjO~&-KUf&)Sv(s)@&=%4j{!*pjp~65a zSb&(`Vr+&I6K}BZNdNciLpI_GxA8vF+AUXYa`mJmu#7R!3MrifhD#-_C+pFRXnjV7 z#+;?I^47ruWttJ(6{f>j$&=O++bI7p0q)vB0$m>l3~7j^c-0%#t9#t;QJ(LOWrXDp zmv{d2+L{;iQpvK<7+^)MZFL~sB*sS(^`RKUQe6gCxVCx+KRj8)E1Ka=!#hgI-<8Tj z`NDCtrC~9kum`+Jjzdpa1G_dbl-7s75=QhSb|Ayeq~QdIzYxHb&i0T_ulzt;o1?n% zibF5PY+}lOJWC_@Jj2A2i=98ld|`NhdPd6fyy@r^G?7tBGEan2c!jMuz6Ny(G%@Cr ztvw^Ji4)M_lraqd!11*dBi!RV%5%c1{*b1nXZr=Oo7u-8DHIc3lk+B&h?mz{9!mM{&vrx+T)})cNESWfH&ZZ z_Z%tqCyuR13nrLbX7|4*On{004OS-*$zDyywT{ zVj}s2#@)o=F5usPufmS<4Dz0Q0DzwTzYPdL=kkzu(mpjZ)2CgeU}uq{tt>uJ z0sw>oMt5~>p3QD|K(nQkKMS@nv%D>v3kF}b8j!#ZjfBM^S7cYIy@Sc@z>{;F|n`>x-mYpZ{T_3piPhF)s@e?Odd#cLz_-2JIbh93%en z!9MS-ZkJEP1v8Ea9ki@Y8623!Qz*V5)K3t;p4ajs^z&!f=gD`wS#syQ2a63v%|8p0 zVneiaP8qu{61B>DzDTI=Ysl`a*eSV70old$3nBKf-7Lu2@C(u2e?t00*WZS}zR`Im zM*O^29U6MyU@G%cOE39k8FRdu_->H~`QtRE=v>9DPgdCXD=`XlTIDB~Dm1hcktiYZT5}ai@GY{%OAI&ed4r3Il1$$pQ~Jki@8`+a!Y9PyQ++Z-2WT6xsu zw&N&vB&`KQu;cie?y8c8e=N>g=wj; zC%lE$xVrpsurNvStAs7T8$sYa$6D@wG`sq4fx>Pk9YrILM{Ilr^ z$DuM*gzJ#}42Wz5?RAI?#cCv%7?;}+5Hj@5E$~UA=82oNlEpxnn!Frw!cB$(FCnWk zbQ{(Jgo!(*QxXIufN9!>xed0>PubiFw|0xcy+V{EMN|b32+wF}g2e2iUhPcLu40|` znn&$r4z{;=kk&U^S}6WL92oM*0n-qQ(3qJ_%{v<*gA0e2wngHgXIG~Fd~p+sRDcVg zOklqzM0=r~^-*3k%kOYYnnwo$OUWSCS9U(yaU<~qnzdht#6{fVy&~$FdhdjoqiA1< zuNNjkvmIp%V%e!L1L&}^C(on7VS5*H_csZ*uo}-@zI7`C2z79eNN3-n+PSU!zpoEb z!EdXG)I?oo0TH)RQXcf%%)@}@j}Y@4mY`IUvO7?e(?5!yVvGSxud<$=r@yN>gpEj6 z=#0J2vHA@lGXdbHAbFu9P7xe#1g(&KxZw5f!K;^|kEQocpVEL%<~_KO26ko55GE!i z)T^QRc49^~D(=Mfqy2t8V_+uYccVfDQyuAjyVHB%kdt+VhCQ2|6YxUv%s99n-=oo- z6LCHt9(DWUHD>_!ttTP3GOh|1LyE@4m;L#r%T$F8_{O(1If11dc_E6Fd|W8pUa9bH zkP!(Fuzeqoa}~li)WB#6q-|#EfEb+_R0Ru?2ta@vERYaoH}eDrvrUk-n-E=~u@9lM zF){$%k=b3MmD;f?K0k+c1a(pTy_TDoom6_OXO7+eM|wqr@N;lenUmZJ5L5G3Usv@g zD23#eQmc}3SjruX`8WI?D}BwKI2I+G0M< z{9n2;(-0(t?5PO7NAGR?jqmo%{r1KKNpp>bQGnPCemN=vp->tKzuA+U&OiO4U_-P; z9w!v3bqWh%r7p_-D&4&Nkq1l9)b?wRi?!RSd;Oy4&R%Og-Smg9ocTSldHWR0C;eZ; z_i!zNaV+^iB@17C!p@BWvekXfCArdp zB$G+({EiDp$#le&3mPKJYxYK-*j;xLWk#!VzhL(VE&{^G@{QNeP$YTZ!8>6z_{gSySsv*G8$38 zI#^|qVL;^AwnpgC9PO%V0g9q4*S8oORYJZY^*~Wvz9MwzobeixC`Yoh@amrP>dY0) zFN>~iEY?)U2~p@VIU!Og=Fn(WXeADgRAs{o*l!s=tNCZ;`cUWJ*YK*a583OG0)c1L z9-_n;RRt8{d&VPCmM0uoF~IBKQIS)uhKSvu)jx%$3^5|Prk3*b9g8BN&nEe}qY5uQ6vLs@hn78@0HmvjhogeYyju!NlKj7g`d&i7n| z48rL5^?%Qa4+=Zp<^2~MOe?M_C|V_hqI#PEoCf!jOb-^`-R_hlD5+dLz?N*}b4MMk zahY=9OSm2)V~j)qu&e+Q7{u+8=RY{7dW%=|Ay9^M$%*2>-P3TU`Ns(|XAW}Z^f8zp zSk<>cV|mhW*xDCRWlN=sBkhgaOLvj-55gn?VRDk}9_e#<>RuwOergk`8phV+cJe7 z)=-}Bd=(jIwY_b>yU%g7W-#WC7cZmePr#>2bYt8iQIedn-gLXa_znMvJ0~DGj(~TvcN88swY9q+;DOI|_>`D|qT7zTb zwm9@_UO6uR>mZ4Li2{&Q#|!6NvYOrQmFT%!CVC%CXr>{tQMbgXd6xM)qnu)`I+)pQ4(ry$aV$6O zix0WJ2SRskX>J@TtDe|%(e?ki4E&g*IixVQn`cXg{)@Tw(2cRhkGuqHkPT^hqD@_DEDckz8KaDu8;_5N3_d4PcgWM|>i z3RK9EmV{Q7wQIJcS?_6cf;L(W>foDn^1A-n@%&t!gE(e;KiJapzlW@S?Zwd=uG%? zZBW6rm!!qK6L!xtl=bsIRa$H;V_?DvSQxzUK$Pgf#Y2Q%ukX<)!f9Oy(w)Osmke6j zHA2DC+`?9(x9Si(77k%rZ?tGhqckmS#aSk>24eoBrN^4kckD>5EtQ`J5{J?yj}I z;94ZJ+<(y#k2-c1N0;bS|Z%g*+Qg$@YuN0Ub7xp9(BwQFp83t(5A+lNnDC z>5lDA*aAFi*))wrVV$1$#{0849pTjq3|^d-E(1xVN|vA>p98!F9qSAcb3LN@o~KAq zt1R+yk%2u4N-!gd)MQ+2ugo?ug`X_tfXZzmE|e+$1MFxdqT1I%Lfy3(x1-c$Ir*C) zPs$x>L>|F5axnvogOZ(AA52*fK?VO7eB{I&p7bt=!I)%_(6LaCpiX2n)%FM)SEV`gYGX3k^LY7>)3>O^Wlj zbItTs^O#BIfkI~xdr&srm4gebo`q{il%s{UL*8owBgjHG^Cc4e0viEjS`JrzxYQ0l zbASxRr{)lJ1S&0R*v9x6GWRufXix@;~dC&HLIaw-MFeb5%4_o#Y0DXfF}vNu%Jf4R7?W zP*B@U*Q)pIIhxS0Qi>&~M`ARlCP$N)d!gBVPPfkOzDDG!D(Tjc;e+41yQ}Ki#euBx zB5bSz%(|W2k_#~6)!8Bdf`sjgR!$SYRxnRiQrW4NY&pb*iqH_N+OI0jp^+<1bm+#; zKQ7^0x&tSah6OSr&nV(@v5$<06tf_yUfDrNL|T^E&WXSX&!Pj1uGhCUt&5ITr~fKK zc-9oQqZ&5j7U_bX_lqGj74uAKx``bIWSsJ2fdQg+7-9tZlKamykqoFHd$Q5vKY_|& zGNAj^NK8;QaU2^#3pd9JP`h<{zPy2mx__dBpmg$!5y>1J@~3ppft*}a*8t5uTgrOX z4tSpwXU);HOl#(DLGzEoHQk23M=6M`CuLr#j=JQmC6Nmca{9;6)YFEuQR_Ois$@*t zaedQ_qB@?}OwvCR6jvE9|BJr0EQ>};3&I*?_J&$bpQ|ET<{+H9Io$vvTd0bV-uf=-RusDN zt5EBd_yxAtG^E9h|L6*Xoa`gQcl4>T9DZi6uArlY!YM%=DM@rlhZMw~s#e2Fd9y42 zTK8c$XUQ4wd!k;R#b1@H43!xqVnt5SzB=hYaRE^p8oq+G@Rar`xdu+C0LaT;86Igt zb*|biY7LRE1BV$EE`^nqV$T(bp9@g^QWmhaGjd8^JOAW~aOT32xa>Arobn)D!?~FI zLyAX!5m*gI!kQ>}fNgD0x#yHgN&fpv{JJ1sSNud!8g+W0`J}IiV-$kV1K~{?WTzs; z>DfF8GxsFFchsNXGt8Mk5%SOx?*xESow>zI4D~)7r_-n`q9y#JNHjgJhF}QOs=TVh zi|_Y13Tnvp;5G^&q>iU1?T3#2d{*U){)tPWQg;mx5k>ZoZofv6aZmOk=)_Z@9-U>} zH1joY>9iPjd%zFQ)NFy)yfXSW;Mi$*YZ%^^>1|q#56$eU5itAVAC==+Sbg=6EIBN% z_F=acB;=lc4NCFMHoiAz)p4yW%iDA`HBTk|)!9n@fn;F~RnXfyuLge$O*rA!d-+nj zz*}xwvCXPKf5Moc zZKZrh<_xhlzgiJopp)8k3b_J2id!DeW)!$ATx&Xm@Mh2a*j+_V)UPBB)rU9X90@Fh zZB^2mrbS@Y8j#`oV=3u~mNm&>>Z!ox-IqG5t7t-u`Yj}4y}?A<0`_XuUP7HYB9ct@ z5=M-xefeU57U3PP4mlC^oe7pcK#~C!85g<36F_#Sw|oe`jWZv{pS_oJerGOL-Xp;4 zR$Xte;q@YviBMV$qrdlN4jg8W)A)wX#_M_77ye~>K<9a-9_3<$)3(UK8);`_QE@s$ zw1iu*kZjnym{Y#b-262R!426_r{P{fs{$(%_A;qghaY=3vhkad6uU22r7XzUP}&(k z6c9yUSF0iHT0`;hHgWS4>Z~)#<#o2GPn5H-3cRl${yjp&Xm9IfclAveb}ko zy9?s>OrZN!V!Nc|C`90Wuj-RbCG}d*UzpwAazJ+Ll;Y>II;ak>PCk2kS>EEg@ATBU zEgix4-dMfC6Z+UG9%R8;Cm9iFseG9bQI^y$ciu&2+&F!@F2L?i;flMG844=(3^KslFOu- zw|J2Ttux$k!j{ zx9&nLuY=b{lGi}S2;+#+c^UaV<1Knu9jN{U1NJuwF-#+jQcBUMnPD#w@e8)5>US9D0UC z_<*IUUJg{ea!o|xL4q9njj~1!XWhAaD8@|5+kHCn+*rIl<@KpX9^ev+cZ_rRAC;RB z#X<1=_DZ^1=umis@fLP`)|h_$AmF&kEnkAqIt`*+aQ~Ko%=?Bs8o2h)dRU;r#SdD7 zR^Sp=ShR!b;2dl1ydeJ|wn55*zFQ;pq8e@{Nqwm*d2)Gn1u637zfLAIV*UyZ^WDtf zN_KxutqQ)YXyYQO4UC{jt=|1carL}A~0<1X8O72=t z>7A2x*5vQoS7c#P#ruy8)}-}9D&JcS9pzGaRwIp{ketX0k?eFt4Kbyx>S~H!F)SVc z-E=TE7^_W3;kAqJE^3@W;f*t@wKedbb6?{ISKvG);nqD#BU^H*-59C=k2edST;%6K z?nj@t1BZ59b0Gx8>~=QDp~w^>adS#-rP=AjvL@ z=Y%g;qEEBEqa+iSJltd^9q9ftDa!>l&4gpgU!S6P3E+I;A_#vMz`u8Z1Qr<@*OtHVGP2PJ`Lpr z4E*FJ=0Gv1y7ayL{)6CXRZ=(c6lCe;cG;xx9}o>-UPpxk2~eF4KI)cU2u8;sEI}!Z z0b4v}DaDsj06B?P^%A)Eb@%OwaDjG0AWnmUfQfTlw}0kKXuzL*$5gW?vo0JpPAW2@ zuo`GVqjBt8AOWyv(bZE<=ulo^qrj3OY+K8O!YZ5LsM!0oR#Ly z(A(Fg;pTFnY(l_BRKv97PO4VeRHtrAHt(jB9xTxb{tAkjvg3xQj10a+ZN2E?bd*KL z<--HIyZRKRsRNJl9X&wD{0nOksqJ_7LVs{C-Y?ADD25O@ICdi)1lF75W zn=Gu+Y6qGxPugNlmDqrAGgV{{p@<26SmxW>$T%KGM6AHwwi$TNqA|x(%#^JP+7^tz z;3s#)yHIHmGY*xVREF}+RUcX-$EKpgcOd*_3}yh)lOR>RH?i~(u+#p|)k>MnNaQDX zo6n^mMxAkWpX0Btv(Dfjxb0kAfK{seqxhK`!ELTmHf-NKniFnId%jOD(vIGIMg7CCngl z?{T8%a1aw21+W=g;x~wi-C@b)Gw_86m_hqa4|LZu2)w{ajv(H|xVpmLX6CLEr7$KW z+|5;XI&`Tc!bIniNO{OmoaJ}aJagwv`W(xhvv!9u@N3`Fdyj24#=z_fRC(hJ+=n2c zI>mu37y~qW65T1V)=PSU;NRr$byCz_(fg}Whz|v);dyH%Gt1PQ?KA_jJy<<}phtI+ zZ;o;g>nL4dlKh1Em7J=Q8p&*MgsSQkVsA5ttfc=}tQZ4H<5O##OTVxhm|;5x^mS+y zq8%u6`BY{Z{n}5id|Pig>`(RFIEkj^Pwpu~5l%@U^Jhaj(h+S)oPxV|_%HzjNAp=nFjc zI=N#q5-yM@u^l!4%Cs(03j5%T4x@^vN+VY>Uug^Y->cy|cB42U5{Rq_n#j4jgo;Px ztE1m-zP=*wX%0Xb4KI5TI=cjA*l*q&)9`?iA6VIScooGQA7qE}U>Ls^<-b1P*C$N| zP1U1=y}#m6f<2s&Z__55qs0Ak5S9ARw&(mO?IDBzant-Z;ghTzvDD24O&FvmSq>@6 zPVZk6uhVu`g9>&2$o=Y%BN-+1{b4p`r7E(TYGeTsDax$UZ(ZrY{An;f5m^-|l$SGD z`iqj7dDTIKor(G|W^-JM!kl2JJ)cJ~23{|79mK+uZLOvX96_?ul4ad<(!5coJ#Os{ zitGYp-n!X6CzzHfut!FQUnAhe7zEd+@3|my@~lMMUZv|_Z7u5+7&AsDG~UFw~FV(dP9mY;O;05*!}uDk8btcWD7adJTc!LNB^j^G5NzMmNjG0 zRQVG4y|JKCT^g+Hqv+PTrG2n^MqHkgJATwBIgMx^>z@Vb%q#{sR}1>xW8+lX-T}Pw$rg2l~Bj3?)NRAg$Awn zT+O$Rh9!1OHmy{WGbKTugc#2LM8TbbGBffd4xw_o2OeDI$mssr5h-Tqrl`e#<7~Ig zJo?-1`J;IIoM8kx+Bn81hkxYIIUBf9NtXGAVqRMDem{(WOk(5s_xbIg zF%{XcJDD4@dFYelCFxJDD%A5zMaf&{Ei%&aIHya9k|nh6T!7!I5I>-Qhq|(9A9ptQ zoqukEd3xA3c3^Ke>~Nu0sj)!jQR9~csk;nV{ktl!xx>OxKKF4bu^Gfp{uGd%+G)59 zZ#5I~5eYoZmnYMN#(Dwui%HI|swLztWBuxHA2LkhWh z#Z&kSfT_$?H1K5~vG0Q9DSbHiYB0eV2(d z=_yX*CP@7u3~ulbi*J?i4=Q{<^v=GZW*eZ)uB$r3*{UOV3Z*7JW*(MSzaNWuH)0%O zaE5>rNU_Ik^V?cc4jJLMso}54R0^EN4R8Qp^-R^E8q(B3MT@BuSXna9hTd;jnqa;8 zoh&eIX*hx*oy|zmf8h}9EC&dT^Y`J^pm$M4 zy}I)Iw_VgBl=9#)J(+p#cn~b*w8!x0x!|zVjyG>4x?fRw7@uQJ+Ga=`OTRXL%`xt3 zU4^ssmBBocg806z+7-&YP>w^vZvYChG@UBy_Z#veBi} zP>$b;Rg}JqdJ4Jkh*KbylvNF@XHe)dhMPXCWn>D<_fPP~hClu{#p4k}lm`DAuG04-yP7k?+85emW4?Ht@mBc+ zuD>q8)VSO~{!tVbBb;EaXv7tofJSVi;!3Rh@s97_Sj}&5S6_c`^xSEkDd+{C>xQDj z;Ya4dpeT!k?{r}oPM6yhiXjh;0@d>0{hN7V8*+I>`L_fZ;Ec{ocu3dp6ptchvnKQI zD87|pCTm9-6sMq#B9W>RpiJEFKhw;QoGG1b0nzm%jTHq5Dq#;SN@45r5&bwAgue=K zcNy=Ift9&^RLz2fzIZGWA`Fnd067Ezbz)m}q?M)<`1!{VEh@Yzb=fW|CAG4S3h!L! z0ioZ0q9C4WFjdh&3-3{(1eTF?McY}(iuHBq36xA^H3I6A4?BCM{qb5rOF2p zEoFdGx649I{NBe%O2}&t&gV~+;JUnLO`eQ#$D;TK-iA;$T5(+}3SIBdnk5BS1Ennx z99YZNNSvtMh$%mIWJ_TwpzrSh|KBWX)i1nZC5EEzh|9pInkhZ;tz|#Ecy;h;@T^kV zFdBjioSrDei^=nI(q(E;ItZMsKxn$(urJz5KA7Hn z+gwu}8R|b)8UJL(AdJBfp_@|elL?}J57MG^G&h8<#X_jvV`BKwgB-<kh<8lpvHucXF7GwtOz_I!)_@C!JMOI?;NMKu*gc}ms^=eJE^ zEy(hjDV6fIDJ&`9^DHu(|JbQ=){g8Z}+ujVGrE7{;c{PW2CQ0#YZ2LZ4pJET#A})di1li z`U(9p)?zMp#CLdQt<{Yx_91C5NXkM2nx~HI^GHn{KjGJgz4im%AKf-qo;2e#6wE+v z)8HjR|Ly@UC=^LHXiX+U*ZhB?ZTRyVGJX2j^=8lSzVaDb>YiHbP^j5gDMh4$Lqc#v zKUUY>t-4)Q=5l5^llmj~O?u9y$tYEQWS}3D8lpuMvLFGEe%U?O{?Lf6W^;<=?w@I` z_tuOd6O6|PAwWX^B_IS%9L!sMhf6Or314q!6&_9cS<k@x)A#b*O?Kvy(VqG z8DFMdNaVu*788ePj5AwX@|K@U8h~FbiU>x{;v3DZtAJ{dd$iO#(VUKASJ8ETijdO`x%u6FV)d86e6L9pNo~hHIZMbaDg~)QJB5xhPqK~ z{!GYk8|&6*OJCiK0PW~|d___}%%g$I*+~F8ycSjg@9EQhBAHZx)cW}#mJ<+n!wA?& zL4|sGvJQ3jod^Q->=X2Iy!Yf*N4rxriIl3PUj**ImX!QA2-Kv-zL`-SyueO56t;di zHo=trHv;Jmh{??btJinW6)gPN@H~uHTkiQnF45gy@?%8`eyFu zFT#ge>J!O`yK(5vowv6QnEitvBN8Rqzv&E!5skr0xkk=!luxu5_ZhqxO_1M#dkYG` zqld-YXr3jdimkwYVddq}m5*NFQ)>?IMw3?l9wh@?4Y4qXvV)x3ot zmAYxtcF*B+uUOfr9Ord>nZRnK%?_P}y3i7~)|@V|8vXLpYs&e?{zIHtE4+djdA^Os z1z-6nWzDIk88Gd0%g69z5%PKw|M<&qeUyZ}&EXG1c|OAN=eo;&o{13qjx|l`a)nB> zPcB`e{BoW&-XqFIrYizRv)y;4K`Nai;0sqf$GFz5$#U*%6eN8}vR(E{*+CtAKJ?n@ zf#R6-LiO+O7H_tPn{qB3DW5`!a;D`oCVivEcRg5UsBV!pBf|!$ycx5)EUyVE`joFY z3%pZEZWCra(lk4Ps=*wy(++IKgM}=k;+&LkdjxBg{SxxAgWCDEWe^0CQk)!QLI(V04Sr3OJR^Zu~-#$6i`~3)~GKdmxZwCkw&%=WI8x(^gQ-m z;1|G6M!{a1VOr|yr^;dRmV^?42(Ail4}v}H*dCoRWWD+Z7u=@9Z5>Uo`IQC4J^cLF zopsefd5Y$h123yyY*I>?PF)@>#D1$VYEm!#Wz3yVe1{HyC*<~tm#j_GI!{tPUVN(y z>*;J2%ts96VrZbg2Y0B9zKHOF%C-LhctRWQlI989VVua(774!T*tg*Dklu{Rv?5B_? z@n5A#00Mk*jq)a-oG4$n8R<+uj$s`Q=`59``(}Kt41oQY8)myfc2$YI{g=Gzn6D8R z0LZ=K6k9}g zQCVCftZ96?k{|sj(UO(!e70c~kIGP29P9MQu02^#75NeJ()Lhx)^98Gv|f3O@Hjmu zkK@=uInBmHL}~gVV+mVG$5lQn0zv4u!Ap&X`d^1WYe_IH@q zy-$3G>2BhVH{`aWGt}KqZab=|Z!7f7^$$sObD1RB-kFNT zpb-+#`?@QE!?z>$7=8^$PBm7|{R+Mi6xy6hd;ew8Rp_BSe6eB3q~XnnQSL8_aBi%u zJk;g9()zvp-3m)a8JG9<5<$8_Y6sss%wn78ypL7Ruh}{JDlp#@bAR*B@##lrs#jJv z)A5WcYMe~67Wef%=6pZDmwn#RvJuv>5E>Mhc$4V@G}{^N?uFVcYwh(9R*vX8f0^<# zfpS(LH?BcXf2=2)zDE|Cpc_%yx; z4NLWfp9^x5ZDlBK<5YTRGOiafH(>-~d>*lmo$DBUy z#ag@VlnKGRHJ&+Z@E*46pd%2aWM29R^G`$HE`c%NlVk2UOl8|hI`_j(Dj)k5*|vX- zyCK@|%lMLgULQ()9}!i^KtUybol@Lm*1NImfNRjfDZVeP^yPkYar46@_CbS{zk`DP zi`IaumTTeP9(YVl-qQywdoSx}uzPF=2dd{f7iT&6S^SXZo6vdE#ZZykst&7VZ+-it zon9o$v-Kw}Dg8PNS#H_>#^?~RKc}_v^eoWqY?CVtQxJ`KJa(Bo=%nHsQQiMI7ASq8 zR)IB}Seq-u*ebU67fuTPHSUUCc*kq1@D=dcvdLO#3QUS@x2mSTVFY&*y;0+f=5II8 zB<7kj;85D92a*rv{y}(K#iO$3)DHL{E_AChAXyweY=ju#fSRz`Y z^erbd7xsG253&G#t##JPXv&V#NuTZHNV4%`&l#cM4ZiiQ`g!dc|3W}lgWJNBH~8OB zjizhuhW|H^dz63=pp67cf4X~voMEK}Cw$Dd0-$+RP9oG2KULY}VbAL|r zS7&5$G7r-Vap&r_9M}En$dtw4_c;;2`c0RgbPFTJ?v16nJ)pTl{T)bk{kp!_)^u_0 zo6kR2g{nrI9x+b(C}dPs9ucDCZ*Pdc^J!{q%jBULlLwEv(E#`{y3$JC`pmy3L!z5C zN~WWW`lN&PX06WHP3iZ7$5zG^s6-nMc20aP8S{zpsb$i}(!eP&cZHZ|Hx;i^1;5We`<{q!)5+F3*R$08(lv<=tn-X{>aZX=Jo#bETJYg zK0owj)a(1^YT?uG_LR4Rfo#R$P(<9&5!1Ybb)%=XA_FQ9VwpTuUOMzO|%=nshSNx$L}=FZX>!R z6MHm{ay&ktj1IvEu|=1T(xECx`1MmppSm7t%_Yr?7-O5~<6>O_ z`42(&|Df$Y}o21#-QAxQDtW5$r|7qs~+q+=LgW(9)tD;*p`5~Cy^J;qR$K1`nP>vDkNoiq3 z+bha2%lJnfkLAF(*y#OwL)efl_FU{pMtr?<{f=-$LD?lyx~VtfPCh7PK}wl12)Y8x z09ilxd}L{}*&cb(!}C0$08s%Pl2mVbpVJ}5by`2WZCc8SJuMsfH{bLk);0#C&1s+# zLMzZJw!Ow!QZcNK^S@ILKOtLUj(!%k&3|~cFyN?>V9@yShi#PO7F5PR`&pHJ;me!y zg8SqSxY*;>JLY%2cYfM`@hUZ)oS@H0S>Kl<+vposoEoY_tiOsj^gYY85CpU|IPb`u zJ>=P%T`BOWDf#qMKuM9Bx05Wd+_o&TWE9G|zmADx`4W>{8ztTNuI&nh-HB!WDE=L) zpU~OwvST^MMSB!u9-6s0DyS6H_9p^#;@_1g7|e4^_ShVK}J%a9ne37{s?^wXLC)&sBpW z;!v)1Sj|HfpPgg&ul??xd=P8>qTA!7Ww<@1l%@kk4O}DC8=W>WO)Vwrnme4pOB z9w|DefBl9HmXr8VUCI;*m@a(eIREDsRNf(bwpIu4BhTt>8~Qp-8*m#FSMq$_ZEAic zmSrSlznM>~XoPfNx^HPZ_S@XO^3mD&>|7-6WU;sLKYU^KUGs{*OHCesaZP3{@s47E zbL77A`_A8bsJmvy+K+mh)A;5%2go2Ko2y6`X_a&84Dz+YY@d&wJOB_>>4P1VU7^wF z6p`~{*dsaS@)ecmX{&8z7{3D?A#D4T<9X2eOns@tBum=#6q#w^RSspnZDJk#hCeVB z{7h9jq7CK_!8R^~0^gY!0(twO)rmkMzD)AGW_enW4CujzU+*lHwZ{FjrGE^# zKQHE&BWOMk#9y$dTmVNu`fh}lj5W%5XB6KS6}alejSQP8S_Aq`KRMt_krX8e5M z{7krcvkc~$J;AzBrt;{d1f!)?AsnR_+I^2{Ez$a)f_TNgO|Ku{-bpk^^NTJt-Wwyh z`D^G*&Tl5^uTgr-hk%jqxK-ZSaZQlJQ@z=oY_rz^Ws=CJLkjeCv3~KWpZOH!$2%Ug zJ59sqs`8>MNgv>%p4n(Lh?(Ld3-zKjYG@m<)JoH0fxcjKizK_boJNomX>o9_K1E!~ zPqKqpL=u<3i@ul8caJU#gIBEDV27%#U+7Q{;|R8DClwWa)w9KGlVwG|A1y6kMFhuroKP9DX}%tB z*?e9ef^9H&@S-fVd>HnenF9#p#^MaKQT*KIwo!h~EqqpoYK#jXxst|M8dcyul`~4F z4m0%3k%V2ZDVYJ3BDTa{aigw&u=6W|NV=Phqoxg+SUlv(j!emTD{}$Q+Z1j1oqqFp zB3Vc~{GL8V)0_-=o+t`dvV(iNnOR5+I9g9iAbRO!FX#hS8OcgbweQHGf%v8_XHnl| zPKeOLm{gv>7}Kw&;F<@wPm^Dn?t#(o2I_pTS<`BUD9}I{Pq1!P+HR{4oLPmIufF!i zx!_rnQ6Tu>)y*2WOHN9)wP2?>A3`0Wc|VlI4U<5&b-7jove}X)w#joTh|6t0J>K-< z8MgqW>IS+*Yf1Md?uJD z%KyH3oY{k}PxCFcFA!bq$wN*|b>hvE4M_iZ?YCOOqe_#a6(%v~{?8$3NaP&Nqx_jY zduOD=WR$u)#A>M)A_Q(NLLh&8W`3vmJSyVjgKky+_gXdgM!s|14WXM*=+uH9x#tgD zPbJff_iQ;uKuhg0Si)T>ixcOApN2G0@Q{SAN|H?))oOAGcnrnF2mUQtr}0Z|Lcilm zP}H2_Z6GkqMV26lV|0AhSM9I#9YI?h{!z@MXJxlL;%}#3`JfB$AEI?6cb|9SW0J6fwT<&w`!=vOG5NR$AN2z2daQ zTGCMQZ^E-$&GDKi59e1rNRs)j27YT?XFjRL&vnQ0_Bt=9Wq-5pY|^&Rw)gl4)5dfg zm2a34_nb;bvu}Xsw;_-@z<_x1ZK*41)Z0ZS?FPy%NxZwk-eG2;DQML#e+yynr^ydq zl7!|m>%X&1i;58`%Ob|~zP=Mo7`t^Ph=QJ)iLa`~*PnOqE>ocB{4-^zFnu<1>plCP zD8z5MQr20Z0afmBDkJUgLLu$?5 zJr4CYxB7nbiW%$|hU7&NA6ma7KF z#s0*|Shr33eYl}Y!6|=}UYw8TvsFj6qpV`3!6Q!jJofy38)Lf`x*u9sX@p)@JxI-; z|1#$6-@a*DJAz05l4^tNpj87B-zqrRhqPyO@Mln0SZoA+72YzwyM&8%UM?%|X_xK2 z5bodf1ThTYb`c*#MBm#h-?$^){H(&25*dOy%a8dblsYfQeR(m_6HCc=J zATlzQ0E3u5bN9@r4H?|EuQIrl(LZA=1})U9D?T^5WmGF36jZ61ZKl5VO8&4{H1zSl zu|{w~TtKj5i-%wqd5W6!?tV*F=yakcPq%-tukPviwZQGv3jO4&3f)#wDei+3>#~x< zz)`h*xatE^)7!8svkZCbX|1X?y>WyB`eupHh@sxX+IZssy#RV8l*69=tEThg6H7vi zmHRzHM^_j(R3DWQN2$ar@OmLB}5QdVCfd5B?Ku+moAs?P(V5amImpT z?gpt{8fihmrMvq*-`{n;f5FCi&O9^s-1C{Eh_dUdy}W>!z>Yg&eCoQZV$x9+6cNg2l*!#zFtz zW&lzxg^`~TeaLFB{pU0WeM@LBA7m>e2@T~C^;~Qwt!jI=)GCXWFF1^XtV7tmrSh=y zV|#(D(|K;Td(&NR-r?@wI^Mi5gAGMyhr6{=L9ybjD-o@V7Q)~{|JcmEbgX7?f8ZrG zeU@t)kv3>N{aKX%AMbOj`B9^KKZUrl5bu`*+2rQo-R%k?{BzTOr6@}BS?@!m6$)uD zbGZ%$9Ko};M2C78D4st35ftVe z5kKB4;Py5nr}8b)G@5Qq2Z7$Bdt(zr&bh|Lt;toRe4y3vqy1l6FPhLKw-KRE>iz;L z$;jRK$=ta;-^tBENume*%Tp}iJL+7~0$1-#Ept_R2KUgywsGHan?;6Zk_(Yna7Z@4_m33l3Ivynn_C!p-B-y8-;bJ zF6tY)+J~~-1q@)(CvLX|+tM|HhZ0pXNcr-`)S^3@2bK`x5)GOnm#;}kygIzY4IO|y zXQOY2`oBC-(c#1g#95pscm#d=QgtNZ5LQ8#zJ&9J=F9u%Hd+=m+QXrxD&=%0QrkRx z&hJCh8qo8n_X*U*9j;^d5D+?}Cri;}WlVAU z6`*CnOxQZ&KKu;Wl6g_^aWu5tF;HO!FLC}GMFCR~!wTk!ms z@qk{2hnjUNRs{^U3tYF*FOL{WlxmWb#?JSq#5Y%ev?VDE^Zti#U#I!EZJ90@CL_n~ zE?Vk}z8Hd|{npnxKM2ph?i*7Fmc!oWn}-5TksPI}Itv(`s>$D=z(da@Ndi~(Zzj2!OWHPS(8uKLnzc>zCz zE|#U&XQVZWW$A*o5`XSO^j;0vWo5K%`enw$R`%VEIj^iSNw z1rps_iV;}{sqd@F#lIW>cfII zs1*}Myk^kkA*lF}RP!O9l0B_XZz@Kaa@Na9I$wt{_94DgzoQp=wNMtrb*L3ZM|?pq zF72nS~{;8uM5j+drmAkCNIHsA+qC#)gMw*QWJ%*FFG zUW@jHDR&wB&ha<#<$n4Oz!~V{lzoqnUi-@-Jl3#lJ>`wkDKc}r_$3xlj zo&6Ala4r#6?QDqYD17|p=G}^Ev;8VMa;~P{8EBV8>qWx6Wz!j1{JL(qA6E_nyLIkt zOBTkY0=Tc{r+HqM@#NxDd6lfLhp(&xeT>J!vq04HP9SGOMat>def?gOBQ`9q{5dFzZnDI)UkReMQLEit4e9mM@K~Usp!i0($ zUZq`b?$7Be`!jS~iXEEyY)t7aE%{a*2L+DcOrK2l+&fZau=xWrQx&%JI^+?uY3|Xv+ZLr| zD}1rJ%iNto<=N%qX2w+hNI5$n(Q~Rdb*j7542VxI?_OUr7D?=F^tB(Z64$+V; z1{r`8&T^|oy9x_#2}RCTI}=WDxIc5B6!g`Q=uGy#KR~V;Y2mQ;Z=OYPOALYMBN>Sv zhQ_W=sRG+>R<%ZXq=dTGA9jkZIPMsRRuHVphL!H%7az4M)8<`d=!)cgn3@L7+7>Rd zbm*;2jx1pw&$Xu)a|6c!%7#^2ec`iImBzY`T6Nw{k*{g3cH@$JfOcmND}%`WBH4*%c_!keNWl{dHqfgFB%O~u9 z{ZYuqEq-d;?tr~-AR%;RCec4ShuloW*3Y8$fwIvpbn-PL(S{Yhar|MM%|^ZUhU zGG=i$fkYhomb7M%e<-4OJrchtC@DVPT6Z9oYMy}tz)yDXL9kN*5Fqo+j0t1D*Xhzb zt|zrDLkB4;ewl&u8fI#bTxH9BtzfyHu=K(n2^j^BH2!nt`_#dwh>Tq-6?MjmtIu&J z?xEqkl+CDCcTAE#`3rnc9BH5?Wbf z;t*m8%O?^JrEIVLCQmJ`2bpS~@Y~*I)F6 zSU7=(BnpWn)vT5@?X&U$EXF21uP}(Mtf$FTbTIrt!i0r77Cn6?#!p)}>Cokl0b#>% zB~rG5@;l|CPA~ph1}RP%E(zw;%8A3Igu0`Gts1DHjn`Q6d{SW6%0JBAXC@}7Bkftv z%=iPBL3*&LHx1NI(2)?Bs7YwhL^5sDs&LZVT$J^ZzHY?s7w|rG-6ytrzvpO|5m)qe zYUaD^K@aVLLYZV!Mu*jyUqE%eL@s#_(06ry{g3G;anfM#!qx+2K7tW&WdAMhd+L{! z+>q_e>VD?>wQ1?-cs@8S7%nH+DA}C zy>-q6SH+AyM|mGrF1v6oEVqz~Ua)Mk^oI54!YKXuGI1d>O4DpWn$0YW)d$-+R0*bS zq03nwsrn<=ebaNH4mF~TxeKG^-=4y6MbF2*c9{lwoleEwaZS*v_{g%z$b#ZS`C=y_ zIZ>0%rN@d5+pZImc(7}axsAU zpILE}yM6cMx;%lKG5BgKdDY~s7nNhp4aR_Ief?6&R^ zBlTI#&eyEzUP2d&VcrUJLM`Kqq9K5kR`+D6i3-T$$ogdFt5S5I?@>%2jH%S^iUvE%*poL&rkIq#@82wUr z@x-FqfXt=4Fv?HaNg(G2Zt@vs*Zu5?Qm1PpwE1tcS8doERX(4@6X|Ey`gT(DqJN}q z{o1xm`XVDVGD-KltZk(yTE*$2ZqL2(hikVpj;O;%=0-1N5|qbse%j!S|BOF2ujS)T zRUS4fxn5;`_#KLF7Eh*Eauj)+Vg9ocFI;($Y7+rSb z(m#3j1#3utARMvqK~dvierQaQi?WFxx0>fIc;6eL3^Mqp5`CHmc{R*XRF#ozp;#^^ z7BkC&JXKWbUKjr+x|FF0#rB}+_l5s z_`}U<|Fd)P8D_#{4QbUbbig%ciwQPt@nq5k&%!IG2jBG!Z9DCArrN)o(wv$1$-GS( zBZ$^6%zV2t7P=YVQGA4@oo@?;Fx~BcUvW~|siJ_(6L@|07aVE6T=t#*!wYLGb(u!d zuUMu+J%j!S<-wqZ`<>DXh6%R(7elHkCqTcZBDj@JtQi2XS?4WZapJy~PsIfCGphWmtpfx4B={T&wg;K;*|4o0XBV$(ROjwgqi8ad1BvY!UG3)ATZXy2LuG*Au!e+b* zXH*9*d>?^)C>y5ZGjl}4L7(AiGRxY1FKn}yzq9#i#h4{Ux$Y?0R$DtSn!-0)wzUo! zQBd$+*SnH|MNZv?VMlfirKHs0*UJKwL7FZ2n|H|XwTDo`<6r1M{D65aSe%>;(m-uB zZF2bvD-I}BR8ajB?evEQeTQufBePbAg1s3T{qm|YOZXt z%2rXpXtZ%020Vf0!Aa?znNC@Z-SOE;;NN-44Zv&m(R~#0d~>Mc1IUnnsMxTm(4dq8 zo!c{G3;;syf9noMi+j0#shk)&c=!C5rIN<4u}zV2hez>*jS%*RnO$8~6Mmy?umrhC zBqU$!+vo59)a)}!`jAI%W%?&91W=$*-=NA_yxP_U7kId%GcZu|HyPN|?9u7YHClx0 zUlbKEXyCAaFv-*M3K{%avRI6fi=#LEk%Teh4hS9+qdQ` zo@J9|7Wq0U_BaBX)h${3-7Fh+(YhG;GVp~b&Qv=hCw|)30-)i2HzRVfK~*1ZYmSaL z=w>291~lo&=NK<*YV^J)b`&eLOINw>}HZnShVtr zRHAOx_I^ViyXHJ{uqwheo&px5(>QetyCsUoKklXr=YW*3KuTZS>G?F5%|+ggG>-$Y zfWvWQ!GM3yTV7c8EW~rQaP`dz+Twoj_{Q4BNq?_!^6&p@!uZeQ3oO(O>Pr(;K%@nF zmx<2<>;h{(zjWTjBA%shFEicfl6v5fC|7Dz;VwG?@{RQ>CgZjM$;W6Q|0BMzf17wc z(TUyqcgys>bJl{vw+tVWH@3Iv!k?owi{pS9mG6+>ztY{fv6D;v-9rs$SlI8+&WY`{ zEj*%N?sZ0OYB($2JnW3;KeN}Xa6>YvbQ|e%88!(1Sz#B^t>>rDug9CsD|C(qL?eoE zXNK&);Lm&xrS}eh7Tdh~*1p~%{q$wcBmwgnytZ~OFY}`NUCF>Z4t?M%ln!kf^nal8 zyg3_+coBLEnK8dz#?c>bwpF)>?&H2bY%SFF~e>{I2y87;>$FCNh8Y=ZEPf8scoOBfv{d z*G_lOC_n*Hgr%1{fwiUY(0>EV^QU7&AW{44y%!{TIrC7koiPwC4PYgr*gt!yXf?L}CXxddD!i6?vhey*x zoB!kYxst@$#`R%K4nv6TC1?9tud-gYZ!>$3f>q)6R)t?4kH%ZHWr=siK@ufL(Pq{> z#Z^L>E}5vvnmtpx%4jsTsx_eTdiOPA1m>*~#Hy!({wiBuAwzObi16Fg_{APK#<^>N zZly-UR?#rh^y-vS*di)NGjK5D)|X)xzwtBiFy%|F4dCxWg-A3qW2YRriI9_iyyf7# zir3v(xx|)e(!8GU9DMS*0iQ2AFIJK|_fxGp1}YRA`t3@sJ+(h{0e+Y^LWBr)P4^0t zGGO_E5`6l5jElLIL)Ri)r8}0X#bk4Y)VgLvaodqvIJy*1^uoiUZOb^6z)ScwB51j? zT3-=lOweaEg;x+^VBP#X6uj%cTMsi@9c4rbF1`dAW_jc=-#h8`qP1-uC&;ZAwaQO} zz4oPSjlzS!D?w*FbG3h1tEZ<<>==fJ^numydwtO!fs(Mx}CZ{o|i4HrLH zam|0x786%QSb7WatX9b>fAR!&=wnLzUXoSNj*^-6+FsHCtS(|^ico02cqytOvbC` z@}urbxx$9=uGL5U|H_xukB|6Ljm#+1I|P{QLTU_2{WW*dG0n2Xg`eIUWnPzvHz7U| zx}P;=9J!iy^*mjj=lm>Wyqsl}YGRg+pSO9kpR(PGDRJE&SjX{y&6EY#)J2Fj2qYQ9C0K}9-$$_c;>9$N2 zsk>JSr6h36xq)xBnAXccV`SOuHA{lUYuod-ejCHjSym!NZ+ezfR_1Me+U*(x^MgMA z8UbXElgawOTY#^4K7!}b^B=ZAQtguB*TeEUBha_G;?|D6F} zS8G01JIqMAslTddhI%fgvn8u6>0TDwgJ2S=;(=Z2xwm<>La8OGYJMFR$2xW7SsSUG&`2 zkxMt|V|T8 z1vUH{+c)D0%5~WWP6t;jbZwu73mxrPCF=(^QarJ9IZ=>05Xqnm#hLjiNkhBiAZ#N` z>Y@Ni35?NmgQyLHNQclDFX(G%ADV>4;>Aj=1^q)a?Beba+z$N^63lfXGBgf%IUeDX zuMBDin}peS#U-h}WN`ec{d$xq36IW3R9@FZ?lt>E64%3}X*%rU)L&_%mMc^QX>hO8Oj++VhbDm3qDH=0sg?9l zqrJDPwNE-WFnkR!x#W0CQvTi7u9f>E7Pfo0`y8(l=6CtO02lWU`!ct5Z>y-LS;@!7 zr>l~GSaAqIHw%}IeLvcCX_)N5aTQPU-`@`eIUi0yKU#c@$QG-_=8@QGIT0awrO2hv zPmn_kF`->jBb-(C|2GK|$|V0>;5ieU}FpxP!2Mni85g z*S8M;nADd-SSO(3WdkQOp;_`Wsu=5keXlb9*NoS>Gq_@T+rILM2|o3RPjCdzBeRSC zisqpucT;mElgqZL%XSX-(Jl^X+`Q3XEmOi_F0SYwK%z~TG*)Cedi@K-Jmhm#iV2XQ#1>H}uq#aiO0vArZ^W!&ghNoB44U^|7YTSd8M588o z^U8|ecn;+tQF4oLbE9*m&3Qu@h}RlfF-UvS zvs?F%iIH0zuPI5KQ}24_UW}$r0o)#e2FNMsLBv1+)QziL&iz66zfNAZ%Q_Z)O%Kp% z1kBvrN%s4O+*-l63@J$5mxL@}#!4(QSibAJJ>;Eiu*YxX=K(^*7z0^~I+6#5u|Z*~Z(YzcT{ zx1A|^xK^|PT|WUDWAYDF|D|($ASPkrc$Q`Tt83RMFd&1^)DL*J9n~cJ0_cV9IJ~aR zfJSvg%h2zDEE!?>6den+)0nZ1G|qk?B(7PK!WyMz`7JpB=e*=vL9AhS|IfL}>1EwT ztZt@$BcH>`G9r%53iUEd?O;0X3p1P*jN<59df!dsj&?JV^8vM}m0N?oFcH~?4h{X! zZk&wg+x3%bTW+EBc?|ku$&iH3prDF^WKP1+790WG^g}Vh2W9SE!j;p?-Q#)xncS7o zNlWg_`B8d&q~z80OhA9}rDW{N=!93ZO>+Ss4E>E+_Tz}vB+gvIiamu!sP;Yy0A>S# zbW%mbOnOq-MVYh*KM7y97e+2`ty==T90VyjiGod-yUDy@4?=d4#*fdKYwl!g=rbC>`5fi!qOVD8ZE5Qt zC!)ZAR_s1blVU!9M}(8i7b(E2L)n7d2;px9ba*RPjUr&jUEKVWdH-IG!>nBSyy;Kz zOpNJ|C|~o+O%lJXGik1X{^SJwQoRy1{~*N@SI7lzU4S+WLSf#!M_;uM%6lXP(!)?- z;i#+R`xth^8+1PeNQN=a02hk)D}HUa-X77@$XgKKi=D64i%#z1#CZWZ7BH+ z3|8E^p1*YXnIwL0xLrWCx};lgzf#&f2-r8aE^U9l{l^qp|FtN^#r*+}tvX{%p1H*N z3Ba{oc$n+LhiLiBg>2%?9Fcv5K{b?Vw7WA|bPfXEAFaXg#e80BD<%ze2C@o0vu$gU z%kbRCdS_#9FEezT8PrJM`c@+oThBH{Mn@|1zUU+|z)v+<@{FlXQ^fr>I*h{(nJ4Ie zKS7aZ7Qh4o&ryhf;i4mcvuR8oOy!Hhx?;s%tG$2r`i-$f8)G6Am=@lmDiI~LDkOBd z4!Jm`5Z|J-y|f443H{5q;w*$OGi3XEhcE3ibxAy-OZv2vc>=d1q2tda-*&g0no6hR zmIv&^GGDifdfTw>z1urwyLrAL#RmD}R=W2+KAiD%gGFkV85y-YWA|4Qo+b4;Hxi#- zDt}1fd6P@4p=%i~i4{uzOnk8htz0WWS5(MDWao~7G{!9kq?ru=gr-fF6faf5CNL5#MEVS3TJOAwVe+bgJxDL2`=3znn!WS55^!1Kf+7-%fiz9h{QbJ$y zp{*iqk_S^ighEws$L-)lxl$b4ACx~9-=QyppK?0Dj)@FSwF=`MEIUT8(hO8pL6Q*5 zv%e2dPiOFK^$bI8)%Pv^>-5TNox~{0@fdF>o~iJ>ClgRk%VuI4Bizbv%S_UV&BPz9 z&+rjys6Od`zp-TmY)H)&^vhQW zV{RhtB9coTcF=4_@shb*CsP+h&&)hnmB)nqG{Yo2M872z+NDgh6%lWpFb(^WB%(FE zLm2-s%l`F2-eDZ8jeVq^KM9hPn4X1pMj{?qJ~?76bDENVL)J@i2QREURh`=BhCRii z_)m>XkQkJIS+W&;t%fN@Aw7TS0Ub~@_$jet&9F^WeM?(>i>ZbOjB|e;J27NVa1A!) zefk<@+}`>FcQs-r5XWEo>=#`F?O(g|5&w$@c1owfaF4`lVMZsnPZ_7iRJr`|wl9BM z^_O+$nHq7NOP1*{jn63A3v0?{VHrf4D`?P<+m5aBs*}N#-1n5RIp*+vB2@Y&#oimqZHR~r1D#hQQ2kUW>_ zf&j}UjJDw6T}M1nq;oQq5Ob#v!)!ghYR{8kJ85M<3MQ)lXCB+VTmF$Wu^=yGp@icyrvueP)yOvDjhC$6!whhc)^WUULNbC4VWW-{-5AFF|V zhFrZT`%q@TSnC_mi5kn1)40U*E;VQ!u|}(07bh!SSur^}R9Sj{6qkpcc9WaouY6`? zBWcB4^Ox{rxpg^E%lvH!2xAS!d(j^EnXJM=G_t$0`U=Qk#^j)v_!hG4#`QIj@H=7M6nJ_^l6p`m^@xbcHxs~VTO z0R?{+O^t|KMUm}PTPr`Pzcq=vh|wEMCS6M?LPO;RahH-E`mzKJdR(WI=3R!y@B+x! zz`na3eAdAuAcLrz1nHwy3G{+OGbxKaQb@x628;wiWd{5E zV5e{2y+TVNh#OGS)dqeLS~-E}r-`Ck2#1AG$CKloQs%C&#AePiWc)hsx^((ANpH3$$lZSVOBoMMCIe31PB&hYH~ZWoU7iY`ju#(B+XY zR)8=qMiVGg@cFXHRIEV>4M66^3qkE$qJ zp%r<}H&+wtgPqSHQu9`#sPJ&Eo0)*^7c2XMNo>)M-yiS1Z31`vwH0Y`TsA&s66E&P z(QDL&Z~aN0ZcR-ibn+(5;6R5{@D+cBGjN${)Zf$oa0R!qRAxL-@#X9-G7G4gf+YXJ ziZ&s|u+#XoriD6Bw6kG{iRCL}K5MCV>J*@u+pPth%vtES08lp)j{%`jO5gA%ukrfx z17?Gb-w^YOu7A(mDTw7uCe%hJub&dzJ+4k_P4xmldd^W@uwYhV;rpjF6$W^Cg&!{L z3WT)+snaDFi%H`My2(wF#LA5*;KYrN#xI_&QmT-kgrk!zbPCklImYTF$bF?-><}{m zYiiUD_IMm-{8_i|d_EvP2w$>K3h^R^FiDNn*VG%$e~iquR{`HqfQW;=C883EkbTjl zEi5mJOmc3G$5C%|A*>7(rw;M;AvdieGn3iB5mHwZZXesi_s8gd+SrGtC-kQ7RdZg@ z-t7kgd93sPsW|s&8Bz00F(2$15mL&maO5|yKMtMV;T(KAC?~PI-S+gXi9`h+qE>j2 zj(CQ&CSuz(p4V-g_#q0-Nh5As_-nk3W4Y>ndMHF1j25GPK+&?7s9>2gU17r>#Ib4o z>9`|gf4SxHqAKCtl)o~0(lbj(k662|;vnziI~~9E!bx?U14h<3&))W*`05bqTX_2< zI7!@W7H>{dl{yC%9Xr{Lf7w7V)I5WQ3S#E*aZdV~{ zhFbK;@s+30@O$*^D%1EnA^DaeSG@Nd#Dv2Rf{f*<#R6x*;+@Y^q*{E;PUdxunE+m# zc+;Wdp_w=PU~FPO>7DcJW6tQFKI8!GXwCtON=EuG3@ zi(gd#Tab6eY!M_)dwSoW#o-_uf1WCO#@j~E_PGyuCv6g>-cLpPqXex)01)Z=GD zHL)5G(X_>2)tfIDH%3qn-eQK|GwJJup!y9-uh(2hr0&uJ7trBMelqUtziY)8*`K09 zmZtYhWu!2m>A@@WMGX}24Iydq4F&)!nV)7sA4x-P5{~L_Q3#AGbhjHM8!L^tsZuOh zEJPOqD{Z>Qt&!c)ncM@(%e|{YL`W_|my>6N&iDQRGv3z2>8Oh)eh@9@g&8mInos%K zNair!aii$j_i=_5rEfBaIaieMIU&e)9sIsA0}{nZbR(&8!TqxAB%$eA&mXI%SMk8L zY#gAdJYjeHm<6^47`WyCisneE0AAFlqJ@P1kYD8cI#486)(q5)XxE6YCE`UNT&a%ZY zK1NaOC-4u{S_dS;6x8;UG`K zn$XxtD(X4UQNx8lRza*?UHAu2^lWAAD&-2{ffJrb243?mRfHarf>@`=?|rb5zCf<3 zX4;;APv+N}(JK;CiTC64*5bNF_3nm~UR+(Q;c{c5AIq%Uw~KSX@6GhFzdd@(3>*Qt z-_XcbkA%M0~_(dYX0+J!;+{EQPMJ zzuNlN_?pK%wUoc>`JABK=lGg0Sv)%sOTu_y*E8>)k*iIoWaK>uDm;XG*ir13Fyb-!(Z;SBLNKgw}z!G8MRUsEY1b8k` zv&Y}S7?a8)6+~)`w_rT2+N`t6N=6f_nsp<3L;&}pqD4#_G6g|J8VFg!{uE;7_Hijy@Er)pXc<>1;NIV_H-^8 zn08ZF=_O}V^i%t+d^vQg`D346EFzdjnnmV9zNOy?z8wrnEHvX)IJ|Sy97_BTwhxDC z))D9Q6js@)_V5WIvb9^&(9XVFe(3R&nz%hg_2)%AreNpg@-(&&1ilXhvXTgXz9Kqf zilmAULKUok00-Jz=O9(|Q%n`DZ)Q>qrnrt@DCWRzx3h?sVxpaj{Gk#n;W`2w-;KUp@ z3s_n{@X9B2C`u3%S9hSx-0jrxH_wd*(eVG)5H78BC~EU75D}T~2k(h?7GQ~?oV|^4 ztWxzE8^34ApIOV<=&=XEn+k4t8tBD8jWM9|X%enk>;!zXvQN)pRfF$v_&t)qKmGk! zcith7WG=tC%0@(l^^c6qUBv$PC2vUJX*lBU*rYwG7nIl+5m8b`;q`n!G`PF9w#E^p zeAEIwCE-*1?8kNTEY5$RdzqqSup5UmQ6L4vM4p@o5($j6+CSs7YY9S6EPx6@bFz5o z)akLPN?$?qevW>J+%Uk3i}alxgYt)dy#~<-@SWAJiEIg|l^Wt^#*6*{vdQYNhpRNO zVl3-Y-+7=`;R;TU13B%e1)AW>&Mwk`G2B|YMsj?g+BEwOpZ{u1#i~W970g}u!F=eA`D-)&uBJ}GijyaMMM{? zOS|j<+}_{c+2}0Ug%e7ZZX^{fwPD^4f;?$yZG^l9s`?XHbad|3eT<;EroqAOvi146SHIsaikL$S%FLB?B@nPywh#IB0% zkb-?5IeI8Z?U4bwvgCv*z(>_TM@V@!>f_HeRX2RhM%h*!oW9p>Bi=-a9ZN>wXkJin z4&_C-CaY2m$p;CgLgFM*RADz>`5%5A{1Hg^P)(N{(28XINbm;O>Nfs9HG z-MkgeIGwur=`4~)0q>V?u==$Jgh@mc2urH15@X9w)oI0k0fHX>D zA=)SbEg|{%{r9#mateW;=+{VV`%;w54Ryo;kVQ&(JDoF|VpQORZ*~oAi6el6gzR*YMmTK#(2{@=Z``h<>C`Nc? z-`Q0?!xFhuWxJuoR|y$QGGj`DsvBf-hDY`zWVMLcxo=c-49NSfkpQf{&>=Glc0^pjcX3KXngxs0i+JA7!#=xzg*VX;Ua?{CD$5! zWF22_*314XyO7E$a|9Nxyfxcm%i@EZ6+fO#2PHAYVl@;KfSaO8gN zU@J(E24(vtyMm6Qaf*gAU&2#QGgAUlu-v!Im_h{DBkr3lkpE$<7x&2|U)u&Cxg135 zTNc7Zf|(+|X$vO5)$))UfZHNzaJUefqjpGO=jGB+U=&vKL_^jzKuz19WfFIfaFSqK zPp2hRD8O_^-*|K|1@i@cczpFEPegvKkLb>2EtxGtYnz z1hAIA{+MS^*%!XjM+?RUyP&iA#R)2UKxld({AEMJf4RV@alv)Hc0tSeqE1k{)o==B z5G?fzSR1gl(rNV@BvFZ4MgL0G^>#hNf+3VqK6N3;3J(rM{;iON`gCu@eA7tGU0(s{ zmk(k^_DK0>Nh~aha$}egHYih!dsPEy?q_t1qL>Q7Ur=aHUU{Jp(xIPCd@zKXYRQ=M zrI;kX^{`Y1-xX(Sjrfmj0G|)mzqL zf^p;?kUXI~aUu@u3Ii3ucYa@}t$q8_TdJj~RO^Zz)g%_aN?x3WVPNtLj2Jrmq?@ty zCF3E11vk!G*hT>tQ+HI_|BQ7$*aIMBiDHBqpIzy@-!ERa7-sn=#3r|qeG@@SazIs3 zQ^nZOtOBydVU+Uo{no%jy_c|J44R{XA-VDCDbcf1Gb_yBLa>`~{&SXc{%^z~dnv!Q z!8Vc6!YC7H_wl9YO+Rf}m@%odag=a|2HcDWjf|%``#B-?3p)15Zl1+`be1mEiFDEb z1TdEO>UH0HaHb0;RT6W&Jqc`E_ZjZ*bs^ccxH_-uWTrxHjbJVQ>WVq!$?`9H0nzYB z9PaN79ol>^Dg|~Kj;}kK#)T!qzMcf54GTI!_Z=qF76|7&8GpLvC((>GJ+lW56n_Au zi}uooxLbB*qil2-+sSV93TT;D*w&&+m1L~$rl+6@TJl{@|7Dk`MBo)rAZ4p}B z-$Xo%OV4ME7H`P#_kkMqYEOw@ZFMt1%{nK>+ebErE+T#w zKea#Id9(GG@pMX%w;lVxj#uxT8P@<}Ox=wxKKgP+|>5Jfrt(syCv& z@Qqwbv=bvcB-ZHcD)Iwj2EFvHdA@_*j~RU$T%|*3h}baPj}763)m!=O0{oxU@x5}- zkI4}RZY?TAaT62Iu|`hrlZ9o?oXwdJXWo2RBA7+Z?d zMM23}R}01{;*1ers#Dhv{&(&yWDkwem#6$KP4;dbQB9~8dB|k@f%wakqD6$3pJ=}p zeCN0Ym%n#vae*(RFJSAx!MnP_-k(K93w@2$r!lr}Sa^`(XaR0A8J!CRQ2`}E{oG$E z)7QiTbO{)MYF1&5j*?ACpp1}cUBt?%&6)R*^x7bTc@a|h`dl>A7RNy` zN@3S?$fRF3@?P9DTLTG+qo{DG2Iwv4-kzHgE{^Fmt{Mi^8)HeT56cD*> zfg1ukjqwuEan2NgR0oS=AFfbL!j464(ZoFcP(|l>M+Xm%goB;#7et@HLEa8}*XcId0YjPZkJwx76bGMjsUjT*JP%;K~^Sm!*M}1X+7BMC0 zD+Vh@8RK1A-#U0wu;p#u#s6Y8V?%W&m}4J+59&YP6TAc+3E&Ydkx-+bQRGvmuS~RB zeyBk4lt<5mcW}65=82xc7)qb6hH3u=y8tgQ@wmZ6oPXZK&hhmDgP&(~sTq?r)&^R_ z@dbiYehia>3#Ve=;nRpRgq}RC8y2!xwyo}Ii<4K#=F7^0wEVgPU>#xj^HR``jMgLvv-bc%Obk9w{Zr*;T zqSHWpx-_+K&SDBw?~7jZj#Z0IbS5_SiN6uqi~dg@e40dmQvgc~wfySa5ZSLHmfzdK z7F2{Dif0ePmG=GZs*8G5=gb5>0AlY=gc+NqLnO`D#oSzVeF%RLtGMba2K9y+9Q%Wc zinXRe;q6Ng!J#mMIGa*ppOW!l_ROb%@$!W$J>>l=!FG)OA_I&#xV>fA(=IAnfX2pQ zmZ@QqZvwRJK?irX4f3rP^u>cYdqw3m26i)hJP`#41M8s5bfQ3-)ZS> z`F@{?D)Kv)0>mDf=bKwR@oTdxJUC=G1|mFH_Kx1cOMHY#Xv{fDHg#gZnWM#e7;i}p zysV7@uo{cBB*2qaS}6jzt9ypQ_c>qlUVlQO3C_BIgM=U zcyVNuVv(at3=Ui^N2lPrzd6sj_IYT)gsKI3JM^VtoZ*Z{2H(tV8Gx$@3@aSAGwm0p z;b`ty@jww?gscx=eWC(zEPMcen68xM?aUgd_oEclWIO(=UJEG;Gj9F7=~Pj7IO7tJ zJywYAIhDefy!~)_879j+Jc0pQx0RTRf$q#6 z$zNUl<9?4l8BFT=3J?t_{gL<#eCvz49Kte^qI*TiT%W_KP@j<;If-LM#O@pOL3gIc zsYC?q*0(1h5FHZrJ1?fYL=Be`qi@1B-GhPh;CVD^-|w-Q=@ieW39OjB_i1Dex_mzd zgVECd$le&@WiA8eYU?p_5HXV z6=xH!M(JWV+j~@}9UHop<9Fj+-2(wiDu`ui>H~iyJNkXB4c*Uw$fL;5R^Rj2czAaS zRwAyve(=%+xg=?fMI^9>vZBkgA2$>bV)-y##C8Z))9Ww&Ic}`9Bqy!6G1kg=0w^7p z$vdyIywty^69^Q)cBa3!Ni<0Q{N~e$O_JHmJHuBrpn+?-o()f%`cp}P)zve8>!!zC zwy$wF#3FkjK|2SpP}8!mRR%|%_d#uisJxi);(6iVnsJZ$El;nPUF-YHn=T;OMiIhh zc)Y2CRF73d971UyWXUINhm9VpGN-)yq949mhC*Gg$sSWIbYZ;X$#51_xMt*bg9Czga~Y=1CYOHg%(yV-?g!Ph9Owe10rt-yKSp?>MwoESl~zAWB0yRovT^Q zK6v73eMe*e2K54mM+GPJOoSwqF zBQ`$90TWG7|0mZ_Wg@S47#JQcpsURuU3_vXdiKTX(tM?B?&Q^sDi?9JEBdxNSU7G> zo94OV&VGqux~u0}^GEKVFa46;dQ~vOgg*hJ*ILED>M|o_;GC?EcK=7ySFlCdb#2q# zB3**CARW>mAl;ox4Bg$KbSeTvcXxLS0}S2W-QDnA_wya^KbYCqjW~Gb!1{L= zj${i@thZx&^|cXJdCIb=PV!40U6iB>==nkKOL<^!k_cAbl@Z?}pMRxdw52+!^(G(R zy{mbD`sHcy5r023*;)`iN%#0Jd!0{5B=Se)ibEe1iGqp*QFg_93dRqp)C$e_oh_#@ z_=O2XHgm?B_Bn-Z{rVa&t?}Xj7E6BARYuyIBzepqFAxCrfyWqug`}SGV&^e(rAwOh zIQmdI9J(y;)6vI)VcVh;C?j?xcLtgc5MpLsWZf+24wu5q_Z4v?VRO9fch8(SUdV)~)?eB4mpe(gf(FaVCU(;n2ljMyJ&_muwLqc*j$VJ;P|Ev?`$Wz8aTc>{7hTIn`IBtrT#5GSIO1&eC zgGNl)?%cc1!@y-Kb#FCBx3@3AAXjm>HYId<6-CKiI)T*2cAaQ-oiMGh%Pa;#}fkslATLKOcQk zHoNz_OaB7nY`G0_bSu=Y-!tt6#NI!L)HOX2H&kkE8+uJ%s|T_qL|3ODz1_n^v|=~H zz?P)`U;Az)lJUO&Oslc8vAxH@i9UQkFO*`TDSzwIWN9PB{uUY>EPEWYkBXI3`~f3 z({sL&4)(%L{%ppjX1rRant36v1Z<_48}{F?^7a8&y!e!#Ql%(%`b5^-hQSHsW^lPY zw6e|zd@K)Cz3rpNNXIBqEcRupgdA+{Bl^dj%E-^Jo;D)BSrEj}RWNz*&q!(VD^K2k z4!PM>q@-4xkF`(g$UvlvabKmU^7fddBc-N7DlB{NqOC5m{CV2M%$VqRbF&cJYh*{4 zD3YJpGn|~4@o`ChjDJgy7GjnC%9pB!-qmlWhtKGqi4|i2VdkH{U5>2tSUPIP5gQd% z{Aranf~EarN}8t5X86aj6}v98I2YE&;!OK6g}_V6=96s&u^l1+oe#r2`bel{1`=3B z#{N^{o0BFx0{Jlcby@qS`BJIvK?n1X-3|kW5}HWTA)QG8mze7C9NO`4rIA#$L!3|A zu7Uz$d%nJk`{3{db~B+hH#Np7PP|~#QHhbF{zI0mr(8vPtMc1eK3% z_W`N~Q{vd4-_;i@%tVf!G%1PkhdCuDVm=ltSs{K+7)vA@UcDrM5pxVlb7BKQNN!I^ zauU>>Xp)%jc=HM-WR1O6dKG-<;eOSTwsdCWG1_S7a)AWE+2PqPWEN_$2&=phDN-;1R7apYf!vf`>$xi|ZI#l}_GZvtOpf zfXw|&Wpb-I`s?X=@f8bsd;7!(DJp6_hAez8=9_lb>u!1@&eI8csmF+3?t`xBLU&0GgbkoIiHJM!qa&8 zWcecOnUuQ01mqS^9B1k+=B%^aCYTi7dh8N*UC%TZ zAy=)0sS6A*mMTm^Y=Yp1Kz^aeR4jr0I6*=@Hd*N-w2KOc-U=F+=+rR$W(*$Iu626N z@>`}(0uS=GRu;UidUAiTc*{9c%og;f3x38|H$f66WT&b$#6Nv1cXn74z@&_N;?rlb`ZbEGeizweT?>WyYLA|~rw-#Iq_;Ekl` zNUqk3#9}!GX@Hf>VcY^bauy_NP2D>@h(4^St*rjYzlia!|G-=pZl|F~!xc3tW{O@c z5MO^W=mNneK)aD2G0Q=lE>Ivg*b2za5}b zq>#&-KGy$2>It*r+vIUz*2w-%+e$NGrR(kJ5;U!Bjfq8*%kKsez%JE2{ z-86xe>BmgVd|m!FmewmxzL1y@$%eUqJd>_-{chcj(H^THm#7S{Xfwa69S|kkH(RAb zsc7pK&h{wDUnR&*3ar@&Sp=01XGYm+9M9k1I?q)**VQ|7lu7l(scM}574&P2u3Egi z^F#JNxM5_YWY<(}Hw4~M75`&7--hn0)&gSCpjlq_q%KO^24Z%!0LjywbKG|lP7noe z-AzpGFwcWX<+3%k4h|DP2QMqW?3(+)Gy;vnK&K=5^+rqMS}*&`2rDOTlxz8s5!!em zcW{2u1E?YHMBP5UsB}T_=`R3g+;)YeB9pFWZQklkK@x z&=3RELVInH>_XMoTCI3%x+%#i&(WPlU}4sLYB0>ZA$@r%uW2AI97S(+L4|9Tx=>*_ zk%h|T;IMr0CYjOXxO4?-P3k}88f6%XgnCR?-&(=*4Y!bL)=cnugiB+T8^NJhiVta{ z;yxe^-G*=AL#Om8V#d(t`C@qC_aYm`j}dAwBn-^$TLq`lrtB&LGULx3x+QMZeVv-O zojU%eEIq2B`8bXX#Hf&YCc?b;>UGCFlFJNvVRL?32WPknakTs1F;C(w=`6~8TkleB z_RS_fl945El!**}(yrvba($^FevAY29zV;&&F{7uFm3l?qLk*$vO=DPh85q zb9JI~T8UAW@3Hgbt5UJ17hp${clHBgowgDsKftDD9R6Jc+W^I?S__FslCGv-M)zM# z$QeA9lZnOc4LRkfKVzpswLQI3Y)0wj$^t}cG@vC{+csQID-L)Ztzi}wxdqFxMoZnP z$)fLzhUW7h`3IWkT_g0g+(bEnDZvk{i1zXC5jzYzo9?XB4z=`;uJ-*3#i-==trMTt zQjusGnX7vsjAu0j2&M_yiHnLHS!>?i@S>{A@?1ofTpws~_5!)=zOmbTutLTtlsO^1 z1p6OguZ?-qijE5GrO?AquC%;!Ek|7O<^$%q+DZHxnBvljb+Z)%`A3=xRM;YU(l7QI z_W)r`#Tt6nU48shY~*hY$}37L>U+)C&E#98&oi8|&fTHMG*K3U8f#S>LQeH!-;a~k z`_U?QIANjz!GMHYEC3G1(AnRBE{9OL0bSzAcr899ZYIuX!tNg5TfMiT4w;+B*NW z491cU^)d^JAtyO{{YN}{Lkzk)l(uVMr`y6X#jn_1j)?0M^};_@AS#FIWU+q#SIvJ# z2emTJ=Ag|etz@H~H}g)|ootB~`fF4^`lUENM;Dv*hvwZI7#JOiok3aWy}Q`=%054FyE7Hv2tmF!e_O5CD^{DGYgfr_N^!hN z4z>TR{afPFi}p8%7!D$v`Ny=ChkBWq!uR*R3t^b;;eh`Wlw69gTPN2zd){7Pt5tu^ zffKFvm*qQt0F3kt+DZRl7zzoVi^7rZPaUK%(Oz>@FWp(caiqDp9oOhlxCeyfP-1r@ zWsvF9p=(m?USvB4f~UwDk8n-;4V}0p>xqTYsHDKs8e4x5@5#;kSRsyeFGjxKmj$cf zr4kmm!*PL#xkq9tgyx~|U$?9(Yzc~`X5=BsCq>K;8GIa>4M1*%$p4|IS0=4!&ONsr;Txc76zL@3J z>k->RZL7lLDAk50JWxcg45^_W++}rAN8Z`Oaly15ILg z)9|UIvitnr-Tl&z5=1?wZQv&-az|iF68ug_3xRjkoIu3}B)PHqQ9);#E(f!&3A2G% z%_-VO;a#fbmt}+Urthqzt1xUH6&=wnRjJ%Ox(9G^<~s_%)tR0IET3gQB+gDNBJ%u| zjpxay3&5>8xc6&t(pNo~!^}?EV}Q9D=t`ReV;7v0lqR=`mZEq1lunJ$8++8QmcYRU z_b8~}-_VMXFC*!~L=jb8gZGtJr^7-v;oKK|&u(;?(vCRm)FJaN6&jBu2t5~O5Z&%f zoYDluGMhl*A zh=fgtoJ=O5H1|W8II1l&($%fP6Uu5W@3d>wC=Bd}Py!gV)lFgVK8;L07{1xhEWv-x zg9*e&5pNH%q+hIPEz>{ziW9f2;8DO_(g(H0SRx$uaNRrC>VR)wvehYW(uSE1zSNt+ zY+IHkrU{i>u4I3*h*9fF$0M%aGUmU$6?oJMHJ7l4qg|4$)ce&!agTFjD~BAy?B^M@ z;{RMG1A)-i1=4gyEJ@MFYxd)h=N2$uh_(!Jm|lm~3U5p<^V-&n<%s?UP;}$t=>}VM zo5V`OaTJ(*7>xK7R`!n^AV7F2ZV{8dh=Cm4MI_dBV)m{JqW!qmYd@aH`iB~IJ#zet zr%n$mD&2FrCTnDt&P)Zf&diIl|fZYd?R(VL)l~Ci~mZ z*5h>yo+fgEVTRDaEM-JAe1k=zE=5~F-r)WK&xLUdcuk*a&{o&$g*TIqj2udgbbT!) z(M0gyLWY{tR^G=3z!(jW8Pq0P|E6K{TYSY0J%&}9;Uy||D2u(fe3HfqFnO7jP3h+$ z={#!w9>*fenY)e&+=_S?W4CXo=zCG*Ek5Jc^HyD0Q^gUe82BLDbVI}f+>qMkcO{Z#m~Cum?n;1wf7j_IZ6&vt%OQ>FA%19>vvD9+`MYX&E%E3-1W6nvt{l zeRd5F%%1#94*c{!jzkASQva;ZSqttl;? zcMH9DG7R`1VZB~B4fgpEuKt26kKCc-TgHk#eB162hTg_QEp*6&fxUByd^n&iHYy#1 z!2sy@m>YD(-S;40F-uk)n7aj`hPGb1PHBVoEG}9mXV+Bwn94`31gC#1b>3lR}**_DC)0Z_YW$hIS>T@6km2qfY_HlR>mo(huW;{63Ofmr zk^CY48J>SD0MOn=qk_w$TFo`hJ1WlDb|~ibeh8XUsvP2dzCnl4OM2Gz>vw*^T%4cy zTX;lBc0}m2{2Ug=;lmkZ@4JhD1zCqMd zwuiSH%jX0lwyyz;3490d0H|@DwX=8blCTkc9gIt7rZM-`q*u>p*8dj{;Bo;}71JbH z_pv@oRp#oS^3-T>qKp4PDMA#pqrC_{SkJWkh~ShMPSWI8uXDo>CM&nYPR?A7|IgGyN)XDiF)7EzW{oN0(? zJx!=apj0XZ&(%JoJ_Jz4GL}roK+N|Z6Q9eu%C7SQ4aQ&|Yd3Dai{d-)aM(CCebeD4 zit^#qu>Rrx!Hz$T@)C=@ZaZZ|DR4p89%uZKUZj45*MQb%EPsKwe|AJ^8_iz*DxE)im*OXo zf-mZy5epyZ3pT+hg^vrmze{Y<+c2A|=J@8&yrY)q^|uUP10scQxH~62z3$rT2GPo= z3*0KTx{S-p-gjPD-D3t@+VEnYC?Am&J~pr5ywvgjVDu+cx0ooBKTv(U^*F2bCets- zSNN4OSu24V>M6Ip|MKXQyYTMN>+D$XsT~#psVVc{xpe=0t0D)R4x>8kKTRk1DUSt{ zPhwZ0iSJ5Vc?R>YV@(kWgd-Y(a|tW z(^k$$^FP0ttjkj5WdFNPpR)M0Z1cn5)^uPpWXKCf*T4&7_gZc8euIkF=k3=Jf=PF} zuz*pZkHOk|3GBdTh03#dm6)VQ<~|hQYN-pmk-s%H1QUzc`Sk;}ZfC|DeBt4H!Y>lN z##_^ahC}q$p}Lts`373v!KPvxovWqau_P}c!Z7bI92rv#gc@h^pWHp7^6ymy`zW8e zk`61LIL^|OU52ijPlOp`SU20QXhzL|?sO`xrIw1|IaC>L-Yd;$2~eED+I%*{?*Gs_ zAgRbVH_$*qX~j#z1ILa+THg)4x>6^i)E+ZqLW6VJOopB4D^up7?|xqd=*IWZE!AU` zB%*2gx=|caNJw_#I`p}uD5$o43KkI?*O$YMmW^0FBE#tiUy{Ybc0u5#4I&pUES&A0 z2veN(8t>dcouDg)Ly;`K5_}pmB??p~oNMasK9%vR&X_A&xQx79#s=~!_!DdYR{iW@ zqV=D^*fV1-$iEGFQ2!B1~c1*YSumz^=7+SV_}A%`=6W zvTeg+*ae9zRp5<-BxgGR|} zy!toEa0272J=?9?acV%SG>|Qdt8h=Q&r$hznvx?|)+Ke} zaW5we3fQYG)jFa`-hV^k)+l#tz2Iu`4#dU9Vj5`n5<5XKd|W-9EO~tR!6LDdczb3@ zoFm6fGr7Er5TM`go?MTGsKt^@50{SJ)QlcuHHPFdUBzSKf5=<>FTiT3$bBBRQ|)PX z1ZTDO`&hK)%Y;Pt&^V!SUfv#e>yCbu)SG&qo816PrqGOp*Qh){qL!P%CW`8}%olOB@~bLW?IbK_w|tOfX(8_rj!*LSRsg0fykRN9Wge*uvsmInR zsv^*(=_|fqV@O@(eKXy`w?k-5oO;AXExMr!7fa==x4gb$t#0 zm=9JYD#q2ZI&HU`{C>~INey?rC|8b9rChmV1EKAm(pDQ6wL-8Mab&T{|d?THG`|WM zKUwUpk%DS8|3X0|%Q0vZFyp>5+NTdcK>)AbG!0@Ht=c1J;tgK$xhr2ZDa9(+x~uj& zAS$yivl^f0O|eX74YqY}Sc;0a04{-~$Dg(QclqMsqMOYFsL?sJ0qbuad+aL32d&BpCDO=`D<6I-i}^Ro5WQoQC7CDUh+^u&PxLQ1)v zlv{Zv{)&;btg{TlqnGt?JcPh(6@H<|?=1T6bH5(7;^}KF+2`uAsbVmO=z$yIF4c)r z5TsT*IvB$#WT08b=O zq1b>A8I<0CPc$htEy_mAbp2J(U%;{91Oetx<}xk#Y_n7LwivcrCUYJzX;;UUTKAjAQ3IpIE?^5UIzjgq-U5&n&wWX6{@@dwsCJyV@U@h7?BuXc)Cg(8C zH#1mla%4uAei?w3wS4$1Bpah65HFJ1`%`@Ox?%x3$p*u3$-Jo$zFHVgi=5{@6BZYa;G6Tp;?o0Hd~{}scT!?${V5|y}H zK0F@NIPunXaEtNC4o4yimbZA=GTN$u1yiBw|fvpYnLO_WfRRVtCeA@p@K?38dyZ_@j84SXd z+m{=@t-J7*WWxnA{|b^O!a0Y+Q=0q0A8^G|@gf=^d=j)R>58gR|B~FaIn#r z-MmRM1y-5uvP@MftTzS{sV#F=gu@L#1qTYd1p9|9Q-+X5l*H$#63y?VX;ODbkhZnh zjOK>Mk&RDzaNx?4F>HMA^==SBzJ0`nqYNKmB8FymN%pFDFMJ`^J{`|NfA}|bGabqd z`$_lvY;2&zO$%SR>jtc@i*i?z=rKovk*6XRn9>lWUm}#OKnA;lyKa!vYL!%;`UgNA zm-AVf3dKy!){TMzib^zeH9u+@nZ{w`Va;o`>b7z$lsez-Zm)6TWNH-*orZYV`%y3k zG5+l(3dVHL^=&5+iT^wA%4inmY-$ao-FN#LpYkGUD$|Ck@#NFp$@kQj8hPd}-2O5_ zIE#*amgb{Xc7;EABN>x}88uNvre((JSnPBRoEX$LGd$7RKBZY%+DHL%LmNahJ+=XIM;pn)+`)*wsT zi=Gx$MFU=G~`+T{zrs!xKFPI|?>Kj9mwB(ps%O)+QK% zMxGtpXUx>bOW}YlH&@-y`SMy-!&zOP<*_TnWq2!64R&Q!$DDm(_Yw92OKE4`H(_&! z#D8n2F>N;$9FlTIgy+(Q$@u#|2JhrWi@3({^GIo?;$>l?F)6FgFuy$B=}A4HJj?pJ zqS>D#cT-xO2OK89wlGkbMk ziM=nJjLmzU{zWvmp;!=ko1HDzj*`0J)`n@jOc^{`d--*2ppBUQsx@kGYQwHy-(ov( z^aOf0F4t=5b2%{3vfzpZ|4ZPt{EN1pN_Ca40~W^$#*I#upQYX$*JQjo|hK<0d2Px&A92 zvh#heGN(^O_JSODE_vPrd4R@$+7C?8Sq)180c zhv$|vQ!U_VWsh?p^|yI!dZDICEW;z1L$ET}TdFxD-Y>!zG0U}_8E*drn>|HB6p>_u zgl$@p+*HI=)KVSQU{SvKM#`3tvN=vNCxCW1a)Y$~jIi4z_jLJ|MfMkGMqC$<1$gqL zYUPs5HOYm;#MOWn7&{nbnPII3VF;`VXplfxi-~v{C7&4-5Uo0-S8Okd-veZr;*GPw zln_NX@e>$Zta%X2VtQ0Qw^CdWB| zKZu?oSl$~XKd6Rq2!ZU3qogE%2BA&cq#xDo#jhgx!UazzH0{gzf5bHmrt|59A%?$z zW22O5W<@*zQ_&~ygatH15!Ex)RT=(u01*kZ+}-2B6$1rQ{fG@#pq1e?uA}jHsoxd8 zk+knSqAdh`+profO8){b|2OMa%Q0Cp^uSThg2PuuU_V7B+l026gD(aQWX!QmuBHEk;;=CZ`k1O3g89)-$mNW7vhP6PJ(qqkKYPU-ovW&iJXqk_=&{m)M3rU|IZnZqdO&AE10AjLQGz8+BIpWu$XW;_9^cj@*ZX*QZxPt} zlBv@(a?Mpepd$6ImnLQg^#EFw+Rt`PI+-_Ov8|aVi4;VZp_)t*O;WA3)kykX%2NO? zsfVDDmp2u6@SDy?+$=aMu9VzLZE@}+CX~~(N$qYt2e9D>$Jh(8WhQfDhxbRprbsu3 zZ&=LT4_&qfd6qHCGw8eEO)x}@ZIs!A@vWxWe(1hSR2JRj?Hc?EE3==LU!f;8rP}So zcS_t5VlqJ_qJ4Q6>nP;ss;D>DVov;cUrg7gsRV;s2U_^XS#EVsRO);GZ0AhAAPDM8 z>(~1#uTutlbr3y>pcXvD-{uSP?;2YY`B8|)cSHlIXCaKiK{xO1hfw8xyYVE^5beF9 zzki4$wTt+*sO|ds&JeFh$~N6A8BXe|S1!5vjehl6pu%mJw@Mb9LjAsPL{ z9tN^&XcRigZwq!R4Rr_y!ibp+%~E0N)8zl4EoYt>e)gAm+ZAS;1B|{O60gc0Qu;&eFItBd^i52TuRPGoS+&6yIs;1bJjJ@ zy<+yCy7xbV14l|8dt03QDhM6O(kO>~V>THE|3T8QH{Klq?_0&Wm6e(Z{zYN(Jvp*L z?pkgcv2{!m0uTm5El%wG1t8)CZM$&tnB5!;ItT3)y%xrFn7~l|*gKAb$-aPx{HI5% zxS^rq-?i1Qv%Dv2GV++M>8J2Dl(ZMi-^J^Zu$QFj3ie|M_(#wdfl6xwdsr9tN%$Mj zQHjV`T7+G$8%}uoy7|3A_N#Tm8smSY&v9>2*r`h7$&n3;rmQ3W69bwo$H(62k;C$eizXj^c@YXcAygF6Ldv7bHszyCUg z7u+I>N}&k|0}mI#;IKY&r3O;j&-wt9-`(s|&Q6TxlvC0{!BSB3&xsuO$reyHD$CZI z?^%ex$l&HNjIbiJA?hH&d~a0QxoK*s0vbqr!n-dzYO9vW*d4$;Ji0O!(XneQ|CMSgZ>EvAu7#@2!_y?1mbZS6jzd2QofCb zN0p1202novQ`Yut%O9jGW3Z?rRwIq&y6JlWb# z=@FlyP(5>^iz;D-@`Q4YfvKGALD6R8Uov7UyW4)QN=IvRE|dj}No>wKO&>l@m|+Vk zZQcx4@robL^`{aiY~1DMcRCvY{T0!8sBwmFc$=$2^`-I%SyXw$v!lSb1^sw%4QOvLk1D4;(T8e=Vo^KVx`yV!dX;oyTotjFm`ks8 zccQxH&q@23@Om8iqK>DvyMW>bdO#4`@*ZWj1N)wZ=r(+cymlWJVDKKm!HW)u zSJQp9uq5ZnPxbW}8#JxxlM{-}BESqm`V-=2^;3Q*CIqjW&);=R_3|o!bc|@7*L=79 zLBamGZVkE{`*X4L2uyX;5a0XXeTjUH!--4~)-P{^wG|rwu8T~?TzJ*g%rQa;()Lw3 zg*jumay;ikRRoA@a@Ih^x3 z4`nj|K}cZ(&l0JxW%*9;Z#%>Z|MW=Q;u16JkNk%%r(VR?Od(7p(?WfiwtB;%J~AUd zhj-!bMp&fv1yV;pjOVAJEZR%Q@~m(Y2yV0)Qn739pQm#S>?1R(({3_S-IW85tjp8{ zHhQ4l&U>{E?#@wMAAj%^$^G{PSR25G2rt_t7A#Dux-&XeTtNl@>O{?ZB0y8eTJ~v# z<#zB-DgxytYbO@jtLXkR7~|^$#GI^igx}kTWKaT)7HL&chLr*59kx&!-Zy9@#_j>H zRc!hffTuY6i=V>pLKoy_bg3u=oG3QCk0(|YLa-S)0+c*m`Lobmj>6!mNT|c5|4%sm zD^F65tm&P3D;Fe;!oybuuXb@vJSVg;n_pqY-b(P70YPzSO*P?2R(A=4A~mz<_t3YexsttC0hnt~{<({-B*VQ3&MU_J;`kt4 zRbcAnJyIzT$zs~~@!A6l2k{=(RtYglW&=4Gr_~^tjlYILK*mcGa747Ql@n;3#W_Zh zJSt*G^(E--?7sWjBOYya0M-Ks5Sr@H%weM(B6UwldTFXxvC-NV5%N<3GY z8FOrQ=TdUEm641dXyDz6xmMn?KajA5C1qIlJ-T?)>yFcyV#=HsC+?l$kFmgLB4g8a zI-%IM+7w$2?DxmS*9FXZ6DG>Jq61@g(bfwY>yh{Mj!B=+in%8l+OhTs*$|u~czP?K z&zY9xdv8WWQ>d!<(bhT9A)8vtCCWHV7CrxFS=-BgI0@O3%%q|GnLY@>Twv z@3HnWtaKs9qMNs@2`*g%>fJ4;E3>u_Gx+=Gw+(t)l@() z5w*hgKbYjvy!qFu3DtM;Fr-5Ey7&~%B4ll*3lx4WA=S~aKH}rBf-#DF&u{@-w}o17 z6?d#>afV}w(aGKDY4*2`=Eo4(r0!{(eZirwF~K2d`0p-#B&+ZC2j-o>Y?Tq9umY1! z8!Rz5xU}g@s*+oOgb}WiZBCR^(~-K5(%|&HmBL-Xq-+Q+m;`0c#+Z0_LZ&EbbYv)s zrb_*L7K>9pedmOxmzqE~+OmqW-xLoX6Y=82bchE+dhYx4*m8}9t0#ClM^DzsIql89 z&%ORuF@Xym?7HwQiVWv(zK-mdNy?AvFdjX3hGZ`spY zfOLxCM>0xsXw3H^IPUk$;?M?@*M2Zw{G8;eKlZ_nop@(3(pkg`a{C^K3prhd^*+Bg zK=~Yb(TnO1q4F(45Pt9EF_c_l_($-Z>`C$-;t-sJ>XQ zo;M_r=Sxw|o^|cmL5lkv6H6;MEzuQ0?Oz$0xv*>2n^(J_v76rsZ!NR+74F9S#Y?7( z@WlTG5SC)D4X^Kq;Gjk%bIr>C)Vu;7uzeR{Hn?K-2(z~HG?8HKp<20`LCf4l-q>*$991_kI+y3qbVp|Fk z0K~@&7=@~K(l`h-Amu<0Q@g}Z2x)=|cjI;;4a1E;Q4no27bZ+#oiWc8FkRIH9DmKA&nL#Kx0M2v?zXZvp0R0- zXjdG-#?^iQf{ToC;A(22KpakZ`X4%1q zIIS92mW4&}&???=G8G%(87d*Gb8=tdn^VB?D<)f@1U}g7a1!RQ?T2Me6B1P)w>kJ? z{}WIbwD?Jg z#s+(q@OTgPvm@^o1G!+B4$j7kc@E0%fP{7-O$96m4A=OohwYBSa~J@WcpeZ+Jx7A! z&2mD)R-}A&B%Ks=KtY*!LOgJ(R!bGkKT)87-3oQ5~q~i6ML1YA)87DeK|}lR^ZXgQLBf_LkmXF+jIWt7TyjcxAVJT>KbPIcKDj5=lQ3!Si0Y-qH$J zA3DMA4Tg25sP&^}FeQL44275{&}{W^KpuZi>Z^Ee+5aTYO(hlqg6cwr?R8=8psH#c zW|kv@B=2woztWkhp_-CzY)32`T+xlAlheZy7qC;Yii|4jz6s&4(~Yr23mv}KN#cVK zj#A${I?Xd8RUsBJMK3-o|KAo;fPG;x2J!&0psfYr&M>tH_A(~B??}y1pf7ZMPAyYX zb+!b~7!4fnD;^`r&j1=qT{U|elu+Q3m_#x*!wCrR)>S(JB8#(&|0gRAM{Rek>oSmK zh);yZzXbN!#rPN$DZB-!aYu2m+xygDo#tV92`F^>p|r|+`Ba>-wO6bt-zvdlD+4Bb zb;9r!(Ew37$@9+8p{LkS(y~NF`OD0RFn0ua2+DW?x-ah{J}|#K`&m#%GuoKdy7o^< zVpHBn-^$>BH|nccKu4LU1sW6=_KKg%p4Tr-ZcugF#wQuuvDKGh6Qns>!bASh>($M|0LP70|Z6+tY=6Mw-q~4 zy?Rp$x{HB8s^XM@ra(^u1T7TJ0as>@h*PN)^=hQTvf8=@A42)6Ts>{J0F>KS;z{n=xuTg%U!bb_<%AscdoRo5} z#otKf8;AU$;vWI|NDuzH=*jvd!5I1Cxzn8rH8<)|?z4k0t#@AGgyR;l`1eZTb8+@m zn`wO~SzxIf#Y^tIJJI2(_DU(+N~!^VWrbr2f|$7sZ{A3Z`C( z{teFaH;s?2&p!7Gy4IK46rW=}zW7U7Cpi`+Z6K|{nRfJ0YvgtCpFh+id*U$eq!`mv z?NfI<$;=!4BWNITdPV;!)FSy5=NKk5%=2TS z;*&TOy-UZb$hyrrhR1EY#u)QzqE?9ICp~U+%(Vl7GlkK zSEd)5QU*J?1w_^6ZfVnhr1FQl0!6?uS9_5EYM<{qINN)*sc~FEXI#_1AA&j zP{W<1t@v3EIsT5!`fTtbc;EZ3Np*X#_bkcIA@=h6T&-a4;LHBbGETn!(19O>GWJcv zP_c9SW8v~NmxM*{dGo>g&A$)SyZ_4L8&{gO;0nTYVQNpC)Va{W}fs;*+o6?h1Z({7EU z{z*-zt~$sNrW?$v`1r9h75Qvw^`s6(WNw&W{)cNoWDcIvrN^jSrG}~3-vOr#U)J)$ z;e#an;{Sejh7#~2|2&t8Y#(eCrWJHLfI2*?84M;;@EofVsQ-*);9eE+dc&?oe$qeO zy+4Y;u(#5!<1=I_`!hp&AavFBH*l+Y#zh}Fw|9E+?;y*J|4KpRUNx@{I1#n- zw!cF!KfZl=VH}$xvwBld%vLFq_&+Ux)9=E|kNJX-t$*!uRJ-kQGzXz0mIusP$%Ono z(9@MA^XJ`M&)qAxZwC$PZC@w9K}%I(19IrjC4W$yrq0d0%`N8S7^Xm>3T7xD+_%Tu zL(6W@R-s$AgjHTI*u_{5G3!#~>z@jL2yx}Id3WyVM}2w7_pVOM@G2P1dhh$dHfU7& z){-!uem9V4)f_}rSdtzozrDQH-;>&;F$0+zGO@I2#)Ka*`0Szr@T zwT^j3(r;X2(NCoDNOgRRyNVq}Z4aexUOg^7Q;LitQkzN~^{L>b|GAu<<=ta-)5ImZxe10k2 z@IJUc$|+8jKHuKkUmA_QF?NbPrwST!Y{nz-IexW$rKrO#V$n4wkAn$~5uF(wVNp=4 zbjGcAY`_<8;bPeusyCrlgIkkjSSlG6)NR5MUsV}z{C>-rVPca|aDcr)&=QpsM)nvs z{-p~%@$0nviVCp>X&Ri1CE%rm-(l;-s^J~Sq_h(%`0a1!(%NP2Yr?=Im49bO-ZT?- z{?NhibU_7rC|Hh+I;OAf%N~&45T95-o8j5NpgUJ34VA+IGyEH-8|0n7$kD%j0KV4J zZI0dI&zs1_v@lFF6i;`tG1}>U1rw6xH9!A*i3|$AZvyFeu9SI0&fbY{I&Wh)8&6akuPLuw%p_&0F$o1g+S8V@w@ia` zbXxPxYSHMj^6ng$p==Pf)_d&;h=zxQ5 zi&ErO!mt2jc}evK%xs{}hn&UwL$0nrRZb1hrql0%_0Hm{YS>&lO>GdYrn5&^uZ-xs zEJtUD%%w-IUDHUpqr)3Ycuw_+v)-kP{7Q{$C2*19cRquS=5sb3M>7P)L^j_TOCZd( zxEWPddGE4N)ZumMQfyBvUiv&9{dV>FJ$FmpDf0TkKlAlz(Y{0WuYdcq8U;m0#mjDz zcm?X818u@iSP`h+pV^IM+*Tno5mx9)nk-32Fh zQ-l&8Q?r{TLF1e>+F3-G-T36x@G5*~@l%a)>$DBDYx9Ach3HVP$#iM*bty`}1vYQ1 zF+qrVqkh~R^Ye7U5ysu@>gmg;-F&WxtDCW-HNni+Rl$V%9ZAj{mUcEz83$?FuAPA_ zyRo+u-J_D|3P{66^v-DPJg5C{LJ6(`M4(%%7U;_Up@`D#9eNsWD+pKbe;)gDVWNPY z+aY*AqnU2Ent4rH*t;Whe&%yY!I7)t9D6=`w*mBYwx#RC_uG6Ts~?oUlqv{t?Hm*QghY-|&YT^t zX5?1L@hwM6lrv&8cjjn@7+f8KwaC`cZ^!l((>cJ)^U_T5nfQ!{rT6bOLt}U zP?(uXin-?e-?bsst?@vW4q+{e*K367knGDh<>Fsn%wF?e^n*y)6BF%%r$fUjI-C(Z zCNABRk z;@wzmQJcuEm#=m5JGC&&dXpPZ#n*$dWUTWhChc8sTb?*>LZ8OO|Q~x1VHlkM0rj8lD-*qo+g+ z&L^wmcEY%-4I=E;jFB7NS`oC^sMb)3qsYSF4>s5r5e!~=Hkd0O@^FJ^r|W;}F@pD) zyuXUWODLy4s|k#pZgku-mC8Ch(PtFX;qMjs8i$tO{v%7`um13U<(Jj=V6k*NoDus_ zAhgXRHrn+!srrRGB$wlC|eY{mot3r@yE?UyA?q z{=r|9F6Ot$`X32g!eNWdCX&%fa#M73fX>wKQq&sp_eQ1cQJO8@NxOKq8k!T`93pQ1 zGQz)==74aKOWRc7XKZY2>RO-fiF6BjQSvC#%%ss=!mmJQs@Pq^;IZ!R8Y!<5QUJaE zd|!qh=YqQR{uL*lKDU77bUmbL$<9(T=g(8NL@OE=UUKZyAuFr0ba~q7xc1@KOF6LZ0mC?Fs5iS>(AP$_o#`J3gKfcpK2 z8t`2Az0>$;nfW#}sS%Uo)4ZC&A6SZSovXEwsBLQb!)l7+I(d?o+8gc7P`A{wy}>K* zNqmF`TJuf)y@$n-DVb1Rck7X2cjR&^=0-5L+?M}r1D@Z_RCX}~i6|5dZ8mHd=_u#9 zrAhl^^p%BZ8H*GIYEJdl<4G!aE4)1tEbhv+oR5s(dwaw68_dwztS751K&JO+Wc`!; zqkMuJ9J(T~4P5Oq(MuwLH(cMESfLhTP0TW2;`f%slid1b?-U6$6{qp#3OU=R?Za~X z&G0^>bn$a9Sgzsmt}^Cnoi~R|azj3iwEq3#e9+`F@mpR&DW>A>jG@lZ6trD3e(h!& zZCSm~ZB?D&z8p5(y@xSV1NAI@xbFY<)!H9Iqtx4~X`}Q|jn`97k=^33Gq13kXPA@T z9+9c~O_=gr(anCY+1>S?q28%2E9D8yi^<(|%9_(V zuaY4~VWm9lR5vLZgXSbB4Eue`IlI+oB<{+mcqA30xqG-bZ@)QlVoq}8cb3qmfOPZ* z(G{Vf?!RpCQf9uk65?SfY!*IWx*%w|S|8b3Tm6ys_+f0;Ff_;A z?TGbvvl2Y7Q&C&@U7A~>N|MFzfLPj8RN33rrtY;qbf z1KF#IZ9dK^?pI^s9FPkgPJh~NE9QLeBbqi?CzGx(@98+w8q18n=!Ap~&%```6hXsb z6iMA@Nz$Hbx87MUBq-B4;1L>9!pzaY?R$ri?ZP(T$%tYhx2Hsz3U5J$Wf5Jt$|GnM zOyU)Yv$%$@m3FewCbx97k>8WM3hAjRZnysi4Va7J)trX;I5h2E$nr_UzL_cVR%PWi zZ;xI}ql(L8>2#U-Zl~jMr+aX}+9TTx`;A76jn!#y%ETHOX-y%dQ-<<$ZX*{?kdIk% z_n(65*hbNoqXL*jf?z0!+C962yNn|ZP*w@*f!-C%68v@LD^3{qoSe+8vssLkW3=21 z-O3sZuSlgmf`ol}ji##f-x+;w0?mnhp`Z}6KQJQX*(tH2z8HIF1?0r z<5gk`N70*G_0sOwMa+6S%5vI}7IML&m^(GX*=Lh;t}r#~uD)71qvv{*M*X%+T`R)8 zb#}4!n$o!D4H@Rg8*_@?{6_s&erormR-;Sqp&ybNn`nFGYbpl4I?G*`SBa)@s?R4I zuQcm=-Dk9$d)w&r(T4jgnrSmQdWv_ryqb_`ftjcHwI7r{UIyvTt2jUFd$QEr9i9 zq~jws#p~S!L<{v^-HD7}y+5B_0?$_Jb+6!!hqg;7+TjSbt5c)>DHGcJvfO<7UPSPB zjdJO2uq>nOc)5RDdVA#a(6?WL-nA8;ZNrj`a5)08U&lr*H~2P5SP=6BL#@`aIi1~^ zP;!s+V^X&Sv!^>un@H7^eNT$4AF=-UDW_HJU5FQP`Gd>nu}rX3b=p9pfEcoG&owj+ zqaE^kZJ|tT`3HcSKR6gq6LhZ2wa>4+5zrW!mU|JjRMidluO4vfj8M28aiT=<>z@Zc z@K>%jwyv|y8f*5vJ8cQ|WNXD79so|nUu^AV$gf22Gu9)U^@N|C<~}DNpLcrPyP|H_erU;y ztS^AF#37Vth*sB*AG<^Pkd49DeK*^60=w@^sXcZ#A16(?A9o<~$p@tL#Qi8+GMF51 z@lI=Lgx4Ef)GL;W${#gi4q&a&xa~4bL{)6_@~R&5&mUHuTPr$6sTWH=$a^k)ZU*6Z z_H>sMoMB-wf*d+0zw(l>K5;{3`1T@{Pkzo}ga`PS*ET3>f!my?3Hl1fGPWIqYgm@I zi6o3Xg+DzJTi?K%1nG+`?952RN3NqQE5$Z+C4Nz%-t`uKBb5;9Zx~Kro-2}$HD=QH zq!=)3FH=)hKdSjS5?hlK@bJE|C+g}X-(KaO5JY2I`-k;WSMzh`3)s{Tgg-cWwM$!iOsoWCjVCY{+1BAf9Cer;1c||(ufbm z#!T+^k{S6Vj zmDl)>fx5kTDy2RRHN+dT=YIFTCd#tMgdc`*Aay2`r^A{kN}%jMLpY2bc3sStx>G%C z81$%d?U-zk=vCVr<-F-ETr}ZRGbyG;*AO|vCm*FuFTIsIPg(n<_ahSnH(&Sdjd<;~ z?Lj1*>QbO_rsLh8%8;?}fC8Ow6I1w3ti=OE2U-tp(#`6$G{8{);P zbc3h${p##U6`emK9h2vZmXzWokXW9?fPl-nXwXfAjz$bY@ukvv_rKPe4+}cd@n2brlP`2qy$~QMK@cK z+M;Ovgtu?A&x(C}n^44X`0mr(9@(*tbzOI>>z9iT2DE}sNvSUFeIe_~KCkUO9}6>H z$_e^}#EK6>vS_G2zcNT}dpdACux2=JpEQ|^ho)$yY=PhvmQWK1 zsVP-aN}w5Sdm|c>^J>j171aV~WSv#7$E=Pf(|7|e7+k4=&I+%)=PNA!JU7tUV4aeyh4KXa# z!yyefn>;^Y;jCPps2(HDklT_&u!c*%AMTNrNH8nIv8+@S0N*0advuP%I{MM1+}VVB z0}XQ`U}I4%kyO;r5biL?NpmAb8hP^Z=IH}Is--xgt2ytCK{A`= z?c5Gso!z0moS2%xStUBPnL!vt<@H^WZ0N@9O{gLj{5KG$e+#VgIBA1uB|4=okh5u z8Jv+I&XjCA-0?Gg@Op(~d7_-mm}}kCe!LWXQ{e=7hdIS2GW_|-7E9nR(otek8*NAzX zn4Kvp;NHXBn3%QF&@WVP50Xqw#s4(qH0Xsuve}o(ZZoh*Mv=lbuD;A;m7S9g;FqoT zufmI+sNp(hp82?g6P`?2uc>_m9p)`)_Y|~!hP?N-+nDKV*(Kiptpra#MdO9YeHoHX zL;bhbFoqK~GZ}xR7(v4*K1;iEBCZavI~=3F$b4ZRO>1n-G3r8U?jd#E9Tg14@}B!n z{e$+0F-*q|srH{%S;QLoU!%N^%|~o65u3&KDC^NIi7#to*}=fzniXUADhF}Nk7=uf z{_zOAVlGQF<&<_QsuXa+_78<^zz%WFFmt4jYv~M$B3t&B9HR{mXEssLqtY^W43ubz z>u$e4hYf>+gC}IG^jbvFCe^~1->s$QZp0HA?j-Z>5J|;EZz@0D6KcJ)QY{=X`G@{7UJ(Xhw9e+LK_JRNzas-zefajIk!>4ZNx=!B23LW}xJy&$PP^L!B$cOpiP&95Ojc zTk+-%rzz|NMvmt<)E^rwmXU5T3OKM6V22vqW_DUTBq8l-z{|OrVj;Yon0E&HX9%dhu^Z7 zvW<5g=o7FiQ^-rU;Ve-()eLRdqU3RPRP@b=%G78FmBLLl?+QWMCERcDg%0?61UhJ& z=nRnv*Ry~}^7BRSkqzZMU?^-gqqX(LA@-~K>ovdEhimq_RRVHEsR%lpy5n+nJvK1F z^>sB=?!S0*9IDz$uH&Jb*%jz!t5INRw}-!+GWpOI5wvzYaO(_8r}&p+yQeApEP8s% zG$T`?OyXX+tnafF?_fSB)lQ7W;ImcEv4bv0o`Q;NWum#q&c_oId+q?g z5%jF*M+E=9_Rpt(btDOGMsOJ`(sr*!#`C|f!F`pRD0VM~n`rqdGf=m?LE86mKopUS zW!zJ*l1E6M#868#y%LJ1*O!LY;0pQlx)!-TFJ5*z&qtU1_QmNS3g-aNOg~)eeS^i6T)jy3} zDIMY7J$%Lo1zk=QK0fu>(zQ!h{REBL+J5w#5cVR>{dJhD*R@ioeI+Ql$umvR(nw|0Jq>XJ*ZY7e|CGXOMv89;UQG^?D|k}>W1+fYgl}8kf$3=FV+|WzRdkpN~#* zy{Y0&xjZ)Y>7lAT9ahvnADu(zaDE`f`hbH^w2`g|B^ zY9zBr2R9*p!aBR*NS%hZ!-`g&4;P-w3Xf+d zb?cQ=`tABYR{ssmoWY+D$u;ahfvRC@2P)c;O1OZ{Axi5C? zu;IJ4kAk78_p?2uuy95)1vL4}z3UM)z}BGoLjUDXDN`0s|5Jj?qW@m!;5fUNmSx*a zVi3eAvJ|fzN(qcq(soN6ZWEc;ikNS&g_7fVbQ*KN<_uOsl5#^d=~pqaQK!2$a|H~0 z(@NiY2nsQ6xD=%Bv8b!b6as52(P=yN5m}p-O1h=&u<3{UTMW&a)fWYj{ZROG+^XN{ zU28+)#OPnSR&QkYyPD4-oo}q_7v1gIdpiug>g52zuadI4#@-m zoilZuvb(KFGXt4L=;I?EMMLAfj3!F!4S#_fLU0COrm~VX=Zv~RFTO5tuY9Js(!^}B z>@>9Sv7!C3L6k$$b%$O60(nij-NTr~LIUNr((^vB+4)%L;V(1Q5-_X2neYriyn)G> zZRM2=rwOcQLwnU|UP*7yun}_=e+1A+&k&U(Y&dhAzJsDQR)ozQ&K;7)BkT5-La0 z!mr5>Ybc$(^vX%{m+=VLc&Z}Z;djLMj@CYDY!NIXeice@HD=Zc+0|P`xqdKM@Co3m zJ_cToFn(I0{0w&H}RCF9HCxc+nJeF3Uv~e@}lR))_E~r8{&~ISI5<`#N0L zF?pDb#={@Do&VM^?V zNO@3+U_Is{&Degw?}l(uqG3%{shpg`Ac@Cr86QYucNjuiN9oOm!#>ScInzPj&JJ=v zCl0@9e5#AqukuAW!c9Kxsn-A+jfFK=K^O2IsZzW6#B#j|R+I&={G7+gLg4l}o(>y~ z`#DEA)$s_+-S@s*mGNab!yRzb{X)nKyy|e-G%rVuW&CD1Pe*^q%bvRttadu6eP)sS zqZf${2fy8clq-DX9k0r-QTc4;(+rJ4}H-48mnCSd=L8XrJ;GAoV8V+^;L@o4T|IB+Bz*Mk14(S7=X9zFL zE>ZXAD@5ILTaYDkrS!hKuR#o}kv-2Jcw<i285W z@cisRtGibS*MktL(pLZ3eNTu9UiEcE=FZ7`0n5=Dsr%)VgkC=ao=+dwb~l=~EGZA% zCKwOAM(VnS9)ht{UZB?9SO;88|ENf{4y2>BpYxw@#R+ZCHYlVC5ot$aUBL6AH$E%Gx=Uu7M2~~?YYjS&8}H3y*r6DuLZ=uY zLq^iE9PI!~Wa-0l&S| z=kI?AT+U%6z*C~G+Bt|K10dyTJDb0X6=Gb%1jT!$nVF>x&PDl^JPjNrPYy?;)Cf7V?g;=NwfUg5Uv85=dqp*dnB-vSL`^-w|sV*n` zhO`~EMRXJ8b#7Fpt|5lQihZ&NMZ$+?H3mO)GeSx+7v|sRh%n1L=oB2hnF3~M4w%>$ zlG`9m?h8ku7}MDHh8pB4kcH(QJoKH4Q}m{u`GJPC&m|gmXrC1_e%p}$ z^xA((4t>{K_PRM4K`)PK5kSM2G?QlD-e)9YHiXUCH0i^-DnL5nJx>vt6F*=e9|G~n z8#Aw%Z{W#$($|hwdDm-aeXGAi0twON>L4`u!{-4tgsjB>g(>rIa7s^(;0I^=Gv|~ z)lpBIYU>E7UzoNuJ-3TBGrfte#c~k-mQ(G z?B*;Qc9_v^eN7GarUbu@1-wj^p;dIVt5@XQH+HkSsKNa^NHj`yu>iA6YD-ru353-m zzEf>@^dJ@cK9(zhCQg_+kx+IhZ}KR_YGaOu1XO7QA~Qk&%xHP>mrcnoozaO-YEQv{ z_`db?r+`nckeUB!VYx_bAG#@iy9)^@G^)58lNz|~SBaN^ErV8+cc)g6@B_ORU>a1p z8=E6s<;T;ZLjA>DQIq_>n%yTI(YoOP_{Vs2hlV?VV3vAO6)Q=Krje5=UvVW4jOhlc-h%1 zNxJa@13L`pF0!iaSl@|hZ55XmKeLbfdP=^V@r2Ss7JlgM$(D}<3rtF&9!PnbU-_jJ zOfBHFkB>mW;3qrE#s{*hAAD6qTZ80}VlvsWK zrwPx>1je;IQNU%CJ34ZC>iQ8tQ=}>IlX%BFp(S-`s4Z#Ti*S<=TQ=$#I41hN76V4^ zmT&#V=Ob2Ue!fw~Ds?ELn*$iPHWZF^+AoyiZ`%Cs(c%N!GQpJvcr&^-KVsqiMv`~Z z4VX*tL+vf32B=jNg+Ek44mTvbj)kM?qQF8((+$I3`Q4?_#J{{i-SYDrj2CtPoqO(8 zKn9@>-KhHSrubpdSgs5S>M?!kMg|)4K)s_upDbNP=T}}+7~3djkv@o$R%~no?i{vc z5_L7C{UECvK3W^GyNWDB)tVb`{|i0P$lilQ_+yfEkR(*$Dg{d`P$i4=c%1H9YRkwJ zaKX1iH}0=}>gR0>v3mN)TTg<$9heAqZPWcKS1g=4=2 z~w}_lHarXx3oDqw}?iLQv6gsoSBCxBTf2b|``+f1G`z zdmSMOcA!ZciDgNpP^^mHl*!Bs6|Ux!hlXt7^6gENRyfpYqDlBcQwWetb9aLQvzf`W zGS}FlJmD%UL*$n}g#N_Dlx_~|cZ74#q1S6=`J5gBuscW$hDY6v?Y8p7fP2 zTtxw)0ABZq)cvlZa3#HEDfHfAS^mI|CF57>2kmpj6Vt#cY`NU;D?lv9Z{Frv!=lY* z$yi12U|Uqti66ar6+xxq|aQcDJzEFBAQ}PpuP-+{|EwtumMgm{z!`PGPRO=>+@=j0(1_a#V^j63x=x8w|OBX4+FmY z_3E+#fwIghdl$lv@Euq}JSV;3GE1(6Ps{M-m1 zIWK$$6@rrCmQGFVE(F#pMAC0W&=j}EfgJA7twB@O*w4j1xK*XGE7x0phn+hBCAlG& z2Jh|*dTk(W@I!ovJVS#tfIy(d(IM_;a>xRkv@-ve48ag<@3LAyuD}$E_&JYb`FY0 zrH1dd`v9~FQuS+~6h$nhiN${*fg-sSf1Hc$Fl!^iqnqadr|V(#P2gu!0IB=D`#QEk zs{YXB`SHM?jP8r3Ht;4xZ)z<)Rh~vU4yt8t$Wb~-b{FB)7jsj(XO8uL`Mp%!{Nwp6 zARl2Zci(*b&Y0=oTrV@WIwU)b+z)nmapY~wJ1o4OAifuEZQOlr|>ew}ry^|Vgi zJA>j`lfoDregG0dEBLzo*?y@1<>uihX{P}mF=0Ef{E-v}KIqFVUj9RBsEc>cV@+Gt zdmBU4+a9nNzx*H}2|495N3LA}V#H$p=*lx_q$q6?h~xx~Ank9;yuG`OS*{0NOfPQy zhj@m30+51G`F?|`>23*RL(+aQdh6`l^6m-hOh_woBF7B^J%XWg@f$s_$SuRNT(HMR zuGq)AUB`afKBumM%Bx0;&N@A*{l-Ak{!rAg)<%-iA>>yNcIiv%6_mNTlxLVD-EQ?@ zC_8oMmxp?BY`A~X0ndZ?I8rk3sn!8m<-pUFj?sbgjY({!uGy{`Gl4!sN{mSWe2Yc) zX-+ZWf0oT{DFaGfg^S;=z5l$Zhs^u-458??4I3Y;$SA!vJaY#2eU2A+%*7Ef1fT1}eQCu{?M`m+| z)EaLVrwVC!31GF(KjXemkWB-_PjNy+R6{BTG`d!X(>92r{2_p@*nA={>Y!;z_UkMy ziaJCtNb+;q&Zy!=E5qJrZ#jzJu-n6=nR6qqDud{6RJ?PiF6V^H(ah6XC$y;f8uy1} z)deMwPA({%i`h$A!#+cRg$)=Q zez)r``S!@^bk~;$JoeRx6D0q*hrIx5B=FGgPN#oXk^3}K;nS>e1278EoEf}0Y?uTc z){xYOIE>J&RH?YCU2&a z9#R44-~=w4)SY2YF4?>UMwYaxIY5&YygKaLEY}2=4UeCWvC|^jrLf)NHMem!)Uy+e z5aGAoGm98`#><2{w~AA{(O!@`ttrB(-4bnUKwt`mNhD-%!#DcfM7*gPUN@6WRB4Yc z@_20rAtc3NFQ~d~aG$$-lOBgd<#$d=4L_(1O1>?{_fe7NXGmUxxQ1qa(s09Yu{W$C z)9DU3fxc6^;$Qeq&|q;-o~+Dme|_fYGX%R#%0ILmX*E@y0s>&qV7?NvX`M1RWXt0$ zn>tY42^!u3&6)g$0{sHyVRGQ5^FUgucu^R#VLl6p{>kT%Cq)=VhrOzMNa?))kC3`D zz)x|9Rxe$5W(Z`Y^%;dPo1Wf%)B4Y4W@^g71I7k@SZ~S{ygdxsjXOgGw_pd8x`7;V zG#^CZPPky~Mp?dhYT#pG=;bJ5S;Ly|dE- z$sPT?S2hsK)k9hhB(&8E@dP08*bp`6E~SpEqe?pnS%PB{)#3GNVD1jgmlR`Q>Y4rs zWKN)p7q&XJqrUtnqFUHQP7K-k?bij=T2)lNMmLub!D!c%V|5M#>`qM2={PC`LW(> z-fXohDD%qn5Kd?5Mu9)Zqs8tMD@hpFtQ#$-4F5%kZW#T?DbYIJT@U?puR#qj+ygkN z!|VuLj-bawA9|YKqi>V6J=0No!_q>?f+xb@s5cWz5zFZv)5ph6fYMilX|pNC23fh9 zUq;m7JzxH)+$+M|P1kpUXQ$#N`2JO>oqGwg`IYiIw3PInvlzmya(niv=%#oafE!+d znPoZQ=&$DbW z_im8{ZTDd7ZP*m+#yY!ZH{n)y9@-kiAP3omn2?!`>5HwheA`VKA=q*$dlg#qBgWqj z@YEe=h7FZ4Lg%LsW_01TF8}@=@kpC|w?lFe-)}IefVw33dJ{Lz;vyE4( zaI2MjrLPvT2_zx2ebSxBO3)(nG*)dz znNSZe5Bau2)PV=fWO)56K4(o?ZegM^mH0xA9m=&`A@D}O2tf}iiY24qE*vco^QOi^^~w71DAzhnlmH!q4OrG8ZV z?a==#&TrnIor|>?aI=EHCNUTU-9HbSDUeLtsYGO^8u<0A+6L5(vaK)Q9!~$n8#Jf= z=Di<$>@fIXv4T6+m%K#?4dFV;jw@cgqUpxq*a(VNg!xwy*f*~}M-a`3I;?tq_F=Pm zCr<-rxl-@7@}bCj_U>i)qA$C(i^1Uk-&ION+&K)64GNNC%F04st>JPjezW-?q0O6) zjzs?de~%{+-|4TiAx5q}Z3G%p`Oj6NRz{A%*yiiOm|OL+7bMT3kMuV{*(?;u7incy z-v4(ChTBL(c~D2#za@#JkevQ4Ww|oUAM}(!KF>8P^8XyQc%RR}stimU(uX1_DkufiR#7kn5M?Ta1{DVg4sC5q1qCA*NB~8}@-!+a zT9ly>(`X^J4hS>^t28Zx;BPclfv6zRpothSkxaaOZo;6x_kI6ol-zUAJ^Spn*Is*{ zD+eRO1I^9s%rFcy4-N{TV%WHs=CR9{SgeB?hFoFVJdxR()fw*&T8|VfnknVaDd;cl>5)xgO54&>^{(M`%_6x z_0sGs!TW7?jkl%kXq?nLd6{KF&!gFCQDdm#pE#BiqB}w2We0HJhn`>>W{%S(zDRfRsg zV0p8Lty`}XJyuO(C%9RYef7JT>zev4iUK}4 zj-*Jm%e@;poz}MEGu`JjOR5fM=lt`%D85uDa{LkhE$5rhDmGB6PTrUm ze?rRFllU8AYhEclt#;7TpY=^)msjmq27eYWvuyiVC_jt;mYw}z3VTt-qqF_g^ZZT! z$NcU}%F|ssm3KjW)&2+F3fmS^!P69TReMobkKJP3wD^3sMA)qkc zH_7%jH3KzMB-?GRZikT%)HIU|{+TuBP+azXdb?ZEMaiNz#ejsHWS&#h9HU(Npkk9= zRLpo+OLtv7O5AtC0wn5M;@@`uKXG2;;zOHss8+QaqRMd8|_TxZd~D6uDg&D zks8)}F-i)NkZVq^2uKqgc}3}e{$+XvOV^liXG?7Tbr0##v_ttr3uo$;s_rdAy2W3` ziXC3fe4N1FGLTT-r|y5I?bEN)>A8JR`qF4RHCeJChms$wTo<5~YPwaLp6pkmFy)2V z_{{^s0XLi*MJ&O=dk*U*&o|(72g#E(@ARjoGV+JQ^j9BzV8!3SW`1Cmu%0cb%DLB= z->gs#xPMiC;PEz`?yTx`4>8UNLSoSY}B^XV;(cO^c5l4i#D@tIYRFD#O5_s+SuqSLzm zMV~wDCVNS2|JqJFcRP>EYP+x6MRRgQHzn!98Vv-mL#umSm3+~jzv;g2-p-0mw_6^i z4W{T)3ndlIXNyi(vMkCaOCKbfCtr>uZ`fhJ)oO?EpPubk2Dc`WbJlg*{kSV;Yh%w- zy7}#Py&4|xzqmBcXX}GStBw_{xE-yDxqe9_;j+wcn@i~AoO@S_G!1dtGP|>VL({9+ z&5{VFZ~QX8UN2AwFJBjgo~3E>VkCs!I34_e0c#s46rT!*j(S9an$vPkavy zh>lHmh%^kBoKSyy_eb$@^`D_SDi7B2>7vG7Sj4Unm#&dbHG?NdmgeNCE&QG7RO1IP z31!-OZ(?~03#848?qp@nAoEY9=J3AZogk|-^3`t*I88!#;(7dYiNm`lA zS3g19MMgDlIB8$FtjzH7iRO9g-M)1?szi z_>A~~BYtzy5%oh(ZO>d4eTi=Rqn8@(?abSXa?kl(sncmzEZsa@n4s%R`sudf&``~- zEUwgYRqyZ)08#RnJcp~T$JH}J1hkQz9ap<^ShGrUs|N`yU`Ugv&U8i)v}@yyh;UCz z*=xrxr8qBsYarESCx?|yO^ygR0q*GP{w*^>~#sJqqF4d>X)eza`j%h-#eyH=H2pgsnjYT6}L6SZI7tfWp3)_l6*yG zXXfML8ACU>XjsIOiEqp|7_>~}tsAn)UBUkfHk7{7bNoj7ALItc#-K|WWinw=M>+{?| za9|Iz?tPqLlWCwoTT^@*zC8#L96?ib8616u=A_|XK25f7BA98{8faA;BHQIM-#op1Gjn&kDelFAeESo*M z_|YlqU&YHu^n`nT@9uO zk@Sq`R2Y~BOr&!Pi^WsaSHeeAkTDMKSJFrEq51Nxy?FVv@gAcV0Y&Bj^G+!>HB%yo zbDo{TavlxLc&cZW!)})47)eMyDV;L9D3~>d7NSea6o<)4Hx=QdTB=*CtQny*@F1_+ zpX|pwVBjn;ob`|zH5xO<9=O_<#~4LqYDi4UsCG|;D`$5+0_p=Ejeuozzyl_8amBa7 z(L8n7ATwh+a`cx+tmw0-&M*Br`a4c#EP3%X9yzY|%HBkPVX!Pdag6elu4yY;n-wAL zS|X__5wbC*QNGn-!H&<)S7OFmOOUHY)jrAR)= zN5zV-7EJwJi{d!y(8TU!WZDNjBzWQN64+Zt`&+9&Wvq3~a>U!5qt%24;ncF}&Ai`i zkrmr0SqY(4%!gERz2DLUk0<927DW!F;&Gbdw)Pb&JGm`;sY_3B+jTC<^vQ<_ljHc; z{Hpd&%ZrP>zQD4!V6P)7qCJIu{jdxkJ0dFenyMkc5Bg)GozV&%^Mz50A|%4zMFUNWGxwG@De$58 znkKYJ4A0?`p`Njhfks5goZRUIRazot$i@wh&*umo?p*pl3&>4})v|>3EuYH{xZ#bf zSEE{H!3pnmq*IF|7xyOaJ*u8pa?FdDkPCryuGi9ZemkL7b?EC_)q+80{i2i7g34AK zFQ8(=ZwX6WxDcSDMzZZq1T#n@kQw{DsVO{fxSwpaTNEwx$WwnFs$;A^4pP}+90n1# zRCOFj31m7vM3s3k=HUbB5N1*w;k|jPfbyvUr60Kq8o05*tVwZ4(>>9mf!=X(!a`vs|C%uEEW=HisdX}qzYG!4DACWxs1-1eUb9IPM0SyH9dEdPP06e zFEx)Z#Doi5)|{@}r4~$7 zDfCZ1!6_M?KLF~*kdSqu#L*)ZKp(S&nLUU%DN&y!3t>X9)C%n&MET-blz`#A7}0h> z&r#5pX|e^V9^Ir^aZ{0x+nNDTyREJl0_DI#01~yK-rECE__H>?5L?}W6+ zi4hh0Ik#SERuSw$9UNjhfKCTxjvmE8H<2p*+GD-*F<8LmJ!LBHgE~M@pWP@?AY@3s zf}y@44#KmjcQ*_>e8~&^6=d0n4YXMvXUpdS?}vjy-Xo5R5iQ`vCz_gxv^2q~Q}EW} z5GA@3M8M$fSoh$NVEV*n*di%UeZdmSD6wBS&PK>CY~e}UD$i-_{s%VRt7$1bk=5u< zYfHrZgf(If2Bp-vc^LATgrwLIG<9YuvtR53nMk1Mj5`G}XGm+I&o*6|g`{mU)TOCK zR})b+dNWeQ-U;sKGHy|YRU2kJ&kWW*wxY60Lx&RQBya3OVUJLz_A52@_rB)|9^O`* zhxb*W%S5EBsSaQBL{4bG#L~bme^U_Ra2e7Y3>2+L()!^Np6zV9s&(9_vmY0#waq)S zRAO%Of+UKdEfop|g1%cd9_0wkhdu;t{g)3Rh%3J#g81zHB&iUH$lD~x} zh#3IKLz7eOCr zLT0M$j^=7A2)U;Z{**=eufUE%0ai+nF*IG?ps%RRj(h*amYa%a|B!yy>YwYH6iI`D z>!84zAPvLOG1lZGREV4J8@95pUzJ@siP$LM_F6a$4gE&(BToGs_I z?4XcVCjCFW9>uown$}08ojw=I@NjTO0UG7Xuq_^y%|R4dd1#P%c#!n{7#f03)%7kA zM)}Vd+L91wAbp^=T6Pym(rP2@oEt1e&?4j)aHU$$3Rxh3e}%rMU{>54kq!sQT<) z$Z{-YR<~+tx9TG?%4_he;q-{uX=y%6ca%^> zJ$Um=mIY!5p&Ote9hKtF=fv(Ae~|E{a-PUf0n%^8>5VT;5tT1dwIXdmYO>q~pI5JP zGon=zB$%x6L4>TsfEd)ohW)|5k>Kkf&Br*i_ZVX;RT?IfmzelwUgi3TAVuwNZualRz)?fm zy4a}1u18NvdnCn%2)r;XnH=GcPLTiIZK4?)!yE>@>>KL*u1p>=4J(_Y(RLJeIQ>B= zl7U@suQQf!EB6mF!>^!54S7P8jDx^Rvjj^o_pjA@lfgnbRC74VRdeJqb5<>=#77r3Z>#9Z*&P+jTud{A^O2$%-c z^EJ>1L#cA$F@~jf7PpB5EOG=i#oNXdTjFBT(EJa)?j;s}pCeBoVHhvp z191q=0nxyg%mdX}IzU2xqAfwbVV!x5F4S~jty3X|MDVK43)|Sn(XTj+I71j6c7#~z z5EXS2*l8Q3<}~*v;$SiHjt;p)^iRWpWr!ugx|~E*3$gbPUu#y7o6`UF0-;aL0JJiU zX@nLS#sI`7W9EEe%Q{aXgf;_o4@J&pf--fsVhU1c0x4n^h)b2qhT@`U{YY3i6jqt*_YUgEM904V;k3-J;=LWD2_k}iSY zBb3g9>WN{lA3fIUMfpl8ANA+(f8$iizEhE-75H~Ky$k{2eT0DxV<44crf1vLklFVUS~v(R}ST_C(B z6XEvt`?&x$JS<_78~l2}eDu2j8RLg1kYJu!8530tgbUgMI?2M1alpom@mjLj?Ckp~ T_8Y3;SuA)(ctC~!#y$T5lGmqe literal 0 HcmV?d00001 diff --git a/Documentation/pictures/color1-active.png b/Documentation/pictures/color1-active.png deleted file mode 100644 index 37b464ae4a32dc27fd5f59c744d5b0af1e3e3047..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr87>k44ofy`glX(f`uqAoByD-dQ zIKxn*vspP7D8gCb5n0T@z%2~Ij105pNB{-dOFVsD*>7^P3295Y>aBbZ6p}1)jVN)> z&&^HED`9XhN=+X%h`U+f4t@^rq=@6tH;&oj7G^=CX>z}0Y5als*V-k$a6rY`w=d9A*5>+X5>Jz2AN fv%Qdg$7?S8knQWTt-q^*<}!G?`njxgN@xNA0EtWa diff --git a/Documentation/pictures/color1-hover.png b/Documentation/pictures/color1-hover.png deleted file mode 100644 index 23f29cec91493e32d6adc7de75da8a26b0b4974c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!2~4BB#S`;jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfO%7>ZekGB$n-YLR6`n4RArhBsCmiHGYQW)~YmoAC-6!)` z9-%KAoln_M@$h%L;qc(S%?GZDc14kWHad+=H>T8FyZh+;`n7B#XOto`yzIWd+gu-& zSMK=gpUdX2#rN(^uViL35#46@^^@r{>#vpk-y`Fk44ofy`glX(f`a29w(7Bet# z3xhBt!>l+aJvrMdqf4%KCSUk}R>)oHSh$3rQ=sJu_hTN7 V>8V^ZrGQRi@O1TaS?83{1OW2cQ}F-* diff --git a/Documentation/pictures/color3-active.png b/Documentation/pictures/color3-active.png deleted file mode 100644 index b2aed09810615330472082b75eaa0d2cf1d706cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr87>k44ofy`glX(f`a29w(7Bet# z3xhBt!>l&bV@mOZm)mP$xWN=Z8)l9H6D;HPSAHnr!**_1g<*wPtpPc`m#!xll`TA=7`)&2uf}|NcMEz|gGC&bWGp(?Xzm44$rjF6*2UngA#P BE{y;H diff --git a/Documentation/pictures/color3-hover.png b/Documentation/pictures/color3-hover.png deleted file mode 100644 index b070274ad18299e79a15715b3cc947550a13e554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!2~4BB#S`;jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pkS}3i(?4K_1NBnyoVfkSjzX7G1<$BI3||3i)%JXRRk~uosi{cZ+S1L z+`DJj!`z*Z-d8T~I=$@R-W{3i?C!PyZz@jSer}2P#O5WzhwrIPcwzhU7z2aS%aAF1 z`D+cO5*#ia-TCF1ttgAtgge#uW#+80E!M7kurd4bvL$o<#q%%s*Vw$5dtKc-SD({Y bV3K@doZ71Jo$oIL9me44>gTe~DWM4f+D25* diff --git a/Documentation/pictures/color4-active.png b/Documentation/pictures/color4-active.png deleted file mode 100644 index 0daee7f7064acb94702bdfb5fca6509ee06cd8b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr87>k44ofy`glX(f`a29w(7Bet# z3xhBt!>l`7sn8Z%S$I1@*ObXVBV;>|J?gs&-_zfipX@X>Y0{Wd~9>ttwP5g zp%VjLHI{FmtKcfwmX&TC{O{*v535+=ug0nucdTy-_i$~=KP|q<=k~OB>>Ov#3UUCA OX7F_Nb6Mw<&;$Tb3^!B& diff --git a/Documentation/pictures/color4-hover.png b/Documentation/pictures/color4-hover.png deleted file mode 100644 index a966248b15bbb263445488edec811a4f8e5ef67b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!2~4BB#S`;jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pkR-ui(`ny<=6>Har#b8W6T|LUgl^wyQG4R0^WHA&XAj<=4lSN_z`;N>a_#%S9ZQm4*z@Mix!1t# zDH*MoQ9Ca&E=x_oA*g|gLBLl2{lcpC$JpN9xcakV?dhVwlfFMK%eY;f?YZ{d>$(=@ apNuzbtVGp!6zT!p#o+1c=d#Wzp$Py&j#sk) diff --git a/Documentation/pictures/lily-home-32x32.png b/Documentation/pictures/lily-home-32x32.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Documentation/pictures/lily-home-nav-active.png b/Documentation/pictures/lily-home-nav-active.png deleted file mode 100644 index f3fe2f237c3e95c1d8604b17831e3881fa5aa346..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2704 zcmbVOX*|>m7ygeSbGb5xG}%>ZXe7%GS?^#n_J)+bB8_EYjIE)}RW7ncM7D@gW0}OI ztTDF4SgvIz#tb>vB_tX13zjK~*p0j*BzbD?#=DdiIln?*_A{cX1>^_F? zyBCCSKhj~I*Y^QL#GXe1v_6^n{o=qi%k!qd-cKuNdiHRi`6bZYiMYSc{OKSRBIoA; z!C;KFnc(|hg+)(j=Asei03Za#nEvj7<1FR4_{)qO>3TzaJWjf?G2OHktsUzBnM|10 zF*bP(!I4p*8c=+?1qG`XSKz2}ky2~>ky7eFwY}(Zss=kEgovxf+QW=h56`g0AGQ-B zlhhhG>&qlHPTph9XQDIZvJia-l;(y0z3ytFH#c|k&ey$W;v9V4FqN-R&Hb_hv_Jr- z2y!M%7R2!5K+fj-$$tshe)2EzpAK2_C-FZ0Z6fGC zX0(Rj<8?;7V8aX4*FEiyMaL!TfMW^Efm6)frkzo}H$hx+V0EP7&F-t0%-2K{Q!TXN z=SRr0?J)gE6-evZuCQW3VZSnQ&BL$TKnl=d_sF%A>Da!lS_j)O=Ei&-ReDO9{l!01 zv?1f>l5XI5H82H4d@77pQrTIk$xM;kKB>TCn@k#nue_p>Alc53e+;D>HQt`C+%p(U z85Og0aZM(*K%Rr{4fN;l3Uq#(Id$X7Sl9z-H1uiuyQ;<>)@`48y56(NH9g!a<$MmS z9WIV?xYz+db`PRx6!rZhwWB8+)&lRTLSkUtTw?Rhify6LY}5eYR7fW)YB}}X6Fp}uhTuuRt-z`_^S8;))uta zLz9Q(x;~mUXgDv^MUaUl_Q9)>!k#|{-$itwTTg_IqAQ0uc~RS~ygN)uws9vM z3`{?S-QvU8S01c9&;mfot_2IitXo6V{hp0Xf(+ALhbt^BT;t3rp7ZzQoGbzZ_mx(n z0-rvxLpVQYYG$}kRrlzQm;AapocH`%_z(JhBV z>{<5mo8FAt^W3E6+$9NP-)_YWx9{#LMpD=87G?P_0I#|E5z9Dv&fvskuuB&K zqL}pr5HA2#-Z>NokO6+cDzHG_vlm|GppvN0EyWJbS_(!5YG^lOJ(kYiJpF#l>L%!Q z?C1x#dSm|e6E_EoB{u_$BbbbC_r6<14LaNe0t(P-lZOHVEdU$<(g?n4!4b!;B~ z#+3m{ovD2>d`S$o(@8@e3t;+-F5>#jO+@@;gX(XEU)xPAJfPRM^rIALA;>)Zfz}`e z?({#erctSJ?S<>9V=689Twm`fYGP(ZkO<~z*OHF z-)!$DcWvux%vSI4H+`2A3v*wyJ^J%q4K|{*1-c{zt--Sl+Y^0mS=p~6&2kn;^&)E5 zgF`~*>z8$s8zNiZ+B};PQRZo|4p|y`6^`q2*&lMNT~Bj6oBb9O>ONjd-d&$&E1~A! zatz{YlQae&(B){_;Z7W7tM??<&}4%n(qJI$m1!}BLdnR;utV(s%D6#M@YOo;vg2YJ+o9< zG({iom7OyLMNzO+=Ze0*zR=*{$_a{RG@>M#yEeui3y0dy35w@0%lorPfeA*N>G<&)XM9M= zNENa(t55)>kZ-{g-H0tpt(aWVVb9fGnpyX!M+{Qs1F5BD5 z@obK&WI{zn1*79{Qd2&|d!h{PdG%Nj6C8HlbI^8@P+`X}t2movZ9jccHmM+PH2Y$; z*R{|7kNO#oCHT3XvKZg_)P{`)KdTa-)2gb}($dBH5}(IbowZBe0t(P;-85x=!VJ7kt zhB8}%$N`el()Ne?Xi;jNjtVC+_rpHQe)(1Fm(*@z<_z_CCoa@`gFUawoJ0TiC@yT{ zS=%54FfzC`Dv+l-yBowC=^eYDSo~qRu-PHSPe;1CwI9xy?Z8lNzXVpwy?K`wJ1orY z3^*c{u0&O09WAR8I~YSR#OX^8yJRzTT3q%F*>Zj^eK*kk@{0?Y$yb}Zq^3J-ZQ@0T zQ$&J!>#sJcX?(yBQXMTz&C3ogD(z0oHwfX4b7=CCM!jK{^Z45nPbNRJqR^R#HQ^sx zQ^)H`e=|_i!=Ju%Y?(!4&fT#;Dr0#tR3nJdNAa!GICoZR$2mHpE?iJTJcU_Qw4G)j z`)u*X;?7;L%OpMul{eu=p^vR{CI&ArdMCvVu4ba2A7@xIY_5Cz{v~#7$>oJJqe5;Q zSHAv5f-d)F>DgPsmD4jRp-4HW(nz}_Qty>dt%ZyipBqbCqT24kAcf=TKOL+e!=K<* z7FY{siJ3P}yMEW%4L_OmEuNb`Uc-Obh-b>WMq+yZGdf9Nx=8=PrFE6wv$tDpLPF7i@E_$ zmO9+5`MvDD=376Y-z*@$Lm4$gG3!)|M%7gF6Z8tPV_uOqi7%L=30o+`OpjcbKrNam zI?+w6)XqaBA$qTN=>UoM$Q>->aPDzVV{qM_P+2{5(IZtVJ!wc~SSQOjtHj5t#Hqqz zVNpa`g_@^2cygT2?cCaooOS_ZJ0wEk&jE9!77QG#?I@LG#VEb(Smb>PAFF%(XeywT z&6dJn8oz6fo(j0I`sNHatu)Qy1Nzao7s#Lb>0i0@f9k2`z@5XJN}dVrtIVHr5x|() Kn9@*JqW=L|fd}9K diff --git a/Documentation/pictures/lily-home-nav-bg.png b/Documentation/pictures/lily-home-nav-bg.png deleted file mode 100644 index 9a3e4e8c41113f109282f018931fc6b582ff4120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2626 zcma);c{~&TAIE1YVr!20mix}WVPTFr!g6heEKy@3(dd#H895?Nj)kR|W5pbm`&jNf zEs-UcirB?JHfz$jZw%x=H6 zo0kNEyR}Ws%X_!+5imALKuNF6!tQ6^#gjIcfZujOZNNQo+khR!s36D50H_0 zXcr0uqU@{$*dSqumKp+S{d`x}hO)G9!gH2s-8ZDWWV@PmE9*bZctJ5@R_F@#H)%5+ zNy;`M3gw9k&<}a@y7Nb)#$Dqj?ULojn(2>#R#Dma|RsdkdVA&Z{rBIEZWuAv1pFYuM_ckvq1N)vHwK!wX#l3Usv4%Dx z{J6g8xmP2fH3vO%C|P9dT+AB~iBKLTooEI19*thF?FyH&qv5zMe+-aQHRPDsy3K~-apwKXM&`6O$))}f$!pcA7+ zD1%yIHztA!3NGvCpTijz=ljF$yb`Q(`vGvp7!1~S1~HfBEsCs>t)qL0aMqD;(?qX5 zP8h)6=#GlldJhDDTO^%cmd~7ihl6BjJ47UXRN>>Dlw+iD-v> z*?J}?72kQNfQkW(c77fna&tKc=N=f<_M}8uo3yqlw5oU|_=f7)4PG4|fomSSjD~g+ zV{-tDcYcwl@czqWJ)XwTiz+_nZaaSkKTc0SkHf9Sm=(Z+SU^3FtYqVWTXgNmB`()N zMXatw;3kFsYC4|(a^bp5nFPS8A#VMhAp**P2Tr}7L@CCIAki$uh6zRFd()Z)?#5GN zx7>ZDN7XQ#zq3aR~?Pgyh^qucwYC0yGoHaP|%|f(Q2u+XOn7?@AaG_rTTzj zkpMLjg70@qZ1~6;Ogvza5}NIz^{94wZnnTRF-@D!jCI9{f*A5U*ynl@d#xYN;zZkw>sau)N z^&U%adp)nW(XM67ZFs;mzCYjCA6@5jDIk6A;o9I|zrRJ#WjhoMjGK0-!Xu^1_Fv`G zqVwI11ciT375JU!E6FhYqjhI^_Wf8QlLuqn9CJ8V% z4V;#dbO@p93sv7r&n^DIAaUC3XNi%{erXsp%*@WCU22NeK& z^FZIPAju+6+p%br`GNPL@xA-_4#%HrXe7@5hEql!>tB>K>Jb*^j`@VWynLD?22ix5 zZM!kM3RjH>G}`u^G8ecQxz{%zVJyQtr6Lx!IA6HTEWO&h&w#0E{Ba&ucSR8!h(B+G zeuvNC_>N@F!rV89$)>!exKbX2WK2gKPU+97Fg>ETu8FM!$(MarT7^5vTwBbM&>1fr z9b2xMGBn0@)sJeyzMl2*%i5abeZby^HkcSSyiit5HKyr4+96(>ZMRyqR@64pH`3S9 zNwHOl5wSQ-sod)9%i&E^CPy1PR^>u$(a^iplt*ZW$4MZw$ql>RzVN7o^CQxCY$zAv z6JRjdk(YkpW_gAnjFPluA`J8r->P{=b4ZdOOmC{Fz-UOOvM%YRMFs^GX*61*wO4p}I3BN_%IcW<_9>ShaW8<5Ep{$;o=Yncpzc@vS^g_(3$h}E zteI5KT#F6yxGB4#zbCkgoO|<4^o!ioP+MsCOh6@jh-mr{&90GEiDYtN-Z3pq4CR(`G_A zo13I+?DFnAcv80O{DljUlFykN?~A&!P106QP9WTh>sWUkkVg73`$^SJ>N8FrwImv* zJnMMyX4Q63ZH=Sv)#KamaJ17?1Tv1b%A=}I6pKjJ%jz676a3_2r7B~{V3|kW`%O&V+V;y~M9Zos#IYGWf z{J}WuRnG@|&d2L7x$iW4$mj6!!4@%Q2KDWQoM!m;%5r)CQa2CcFdaGo zHMf7)^jD;NDK$J|v$MMRsRd8@Zu=Cwyk+u(3AmyjLiFC;mMm827(9%;4RBmbM z`;yyZOS(R5x5JmRFI5~#U*X0dxj4=Se*I$R0A8PQ?!I!lG*kX?x7p6Tc+!+x*lHX5 z`5Xk4=m1Khk@zErSXsGO4|cnlWm*r|+*0)nm|$+ix{eIcSVgSd+^M@1ZqQC*<@4?< z)V>pEHWCwNjN>|tFHg9;pYx&4Y;9a3ZSFe&CIrzI;5B}wjoW5PIN1v0b4s5s0Pf0HHosX64hcdFKjO^=|4cCfEmF$$ZwY;h1SjtG3 z<&X#i#mUNSZACo0=G5BSU|an}{Fo5B1z;6yg0}BO?^`$NK!gPUk;TUfkk@#Epo1(Ag6ob`2f?Wo2(!g7moa53h>(IsgCw diff --git a/Documentation/pictures/lily-home-nav-hover.png b/Documentation/pictures/lily-home-nav-hover.png deleted file mode 100644 index aaf1c2e10346ad552833e6babab633e08028cba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2652 zcmZvec{tST8^*swG4{zi*@wtPL>PNaV~vp|YlUN9jyOY8cA1#6hsM6dq-0HqF{7lU zoMsT&*QCjwWo+@A&iVa$uJ?N0=YBu;eO=G<=X>um+LVV=loJ2|9&|y3s z#_S{9TzqhaOwzAFW^CLXWn}L+xm;i!B{3d$~7h)t{t)@P2_Vxk8G3CWb9;8d#Vaz*lB*gX_-KpjrZR-@h7 zPh)|}n=3rNl0Gq2bh(81DF@(<*;V++-%?U+u1}! z*&*oqA-}f7C=&V}2LTLQOZ!AFlQ_lzS3n#9@oS!sG3=U(+Kom^iXd^@GQ_Lbt}Tb@ z#J^Vb(U31^1%$ials8E?wA+hHO^RF2S7bN;xv;UT`%(2v#^f=vQjU5a2p}B?qRl<% zb>km3M&w=`Uk{yPJR3YiIGCNCe-|W>WGI^ zOX}1s1#?I?TvU?`mna&lPM9=O_oL*h5I)?v9<$%ALLUDz)-s0dMKbrJ0mCdIAgCcH z015*zq8y-UB>pBzVsw+9WX-d^5X;zG?Y0)TXo_gZb##i9qZ5s?(}h54l9n>IfEIRT zJg+Q^FV#AH!U1dqm-~xN4-j$R=Uq7k95-XRCGCD6(y4u;$)ykzYI>LQx}<%x{9^$| zsM2BWzH7zxg_{*8&bEU|QrWUP=R1!onR7(-q=`#t6Rib2xPPMP8w_BT295zBu%VNR z-F-X~uN(-MW07o@S48swCOa=vbHF^fT{V2rJzg`LmBrvs)mNKRK2w%5+GPO<^42CI zU&E--vB3_+^$MT?5rAceiBx5G=R1~vHym{pOu3N{*#$l9@U&8>RHlZb}c zKf=P)i_l4zRPpcWp{fUtXE!ilmzX_oDXAP=3mEZhK|z7XQc^Rex%IFTaTFE3EAU}> zbFOmZZIN07VGA>3suAmP)#O{B{AN^uutB){v&maOrn5u`Er_;6+a52qyGR(}Bfaet z^rBK5eaZr!APvCVc;9GGIltq&)6s#Q>14mLWFKi166sIm%5OOK7dT2qCVjhHaW!h3 zRMuV0Q8 zak1^O{~pCnnXtGO5gQweZTK8o_*bjAdB^QT^&{h5=AndnNZf$`yC@SRduBfhWf`42JF z70oKSywsq2OSV2|)BZ^(R~2p%&@19=+vS^g{0cW74+Lm0KOU%RSxnt_*y*xLLtCaw zE}86Yxt7GK7_JD5>Dme1zTrDvSQjSjbw-C~Q#&cQ+l{FGmV6u;;vee2{bA60!9C(zM1z3|qlGJpN2#kkD+=XsWz1Bi@EL~QZ}jx{P)nS1{J;$Uj>7v)rRO7#4C zolY8N_g7x>7ZnLf11*g(8Z8XS5RGXjL<~}{7sK}T`6ry#zt+i@UmKE19(vkvdRr=g z=fH<>7#@_>RS#?Qezx2=95D*aNkEhNc zPct(!++c#)P<8L`?{IK%U|?X6kB{JRj!;lgpP!%K-`~v4%a~DCoG@n7+L39#N5q&@%-Im)xB!La1?`I>*NVi$FlQ8KHwG+`$_)73t%G^!^sL!b)hpqf5ib2XcHWL9AIt?y7 zPcPn1bf9f!!r3_K#(pl|T$P^3cN|{2DKE$e;!F&RT*k#J5?e%{A*&wI)@9;Gq7_-J zOKth?FCg&3Wh|=2Ml=I@EImW&xu-b3T6k5ylh|rgZ88hO)IO+nyn}eNdJsm7t339^ zUhC`4xl~c)Nj`ma#r};UR-ZWPh+01rvB&)YZmPLq>>!YgzzsZgLJRaumCkL5r zeEu!u=T-5;%_?@aptH&|0WX}XfN6jx2ibmT77ADjYZ-&- zlQ0S+N^b_aVIr{ggVKiFse(5~rqEr)hFxbCfm&K$?IY#JWJT`@3^Mw1Cf1tC9m}5)sO5<& zX20wcxzX&=DC1a%$2UDJ!97HJ(tp+RvL$5bqv~#8vhrKp9eprIgeu*0P)WME3DS6;b6Vo~|BorEmg(NG& z77`Vf3>Xj+=yC74XFt~0A6p!*B^gh%{^&f``M$N*UhCWYibY_V0!M5>X>y8`bwW}M zn4O&!R?wIk{OK!K_aD6Q(vh)C7c-9ju{zbq7!G1KK`%2I`DE()O8JwvlrhyZ^?V2xOBO1aO`B? z<*UP0&C5UfwZB++&)SJ-G*gieNm)h+MZ`=XViExiU?C!6MM@@eX51DaA5W$#@j`bY->?2QB-1hWMAG+||Pa!C{l8A#?h(I7B07wI3 z;4CymtU#lvBMTY(&$jQ*zv~%w`f8jBGWwhjq7}Gy!{{3B*&F&Zd03tD-Ktx2KLQ4cv zLZL7baXO@Pzff$!RSDxMh4CvIsDT5KY4#$>+eccplQNZtJ=>zFuSfs{`Wi+ zrBY#r!g!(x=77ND0f~r01Z0RpA|^N?Vj4MnfjP+DQcpw@27nY^>z!vaw>JF-DqyWn zaf(&S&Z@kkEb3~(RJd?ildhgu!yqOWCSn2+F)0=beaS!>A|fK=vMQg>=a@LdiYZ9t z=fo6`jEse5gqC}{+;jFtz0p0 z-D(1*SSex!QeXlp$K*UV`_wRZL5+~H=Z3+Q;#BP7Y{UH9H{3hW^-ABP-%vwwx^ni~ z2R_mKxy@8H>*@=~fBffv7Z*x*{lV|i{0cb9fD`~CW@4f+00|R7!~iJ}*Dq<96;`>< z*GcZm5NWZxBD-?SLnE*D{Kq$TujoI${Qi&3o;zn)7Y2`ZzPbO<)zRVK`r>DA{-cju zWdjvJh!qnNfxyHtKtRMKfMZHKlHTEG@BZ|>Y_8?-o~SPCSUEAXRmQwJ_{(k2oc!*K zHo7vGW{;B|CA(zJ+BJXp;Cnvx@nX)3;yecoIASJJL?B{lARs7WfQVonBRsz4(GySa z-LQMxO@I7RF_Gd>oC~s9x>_3P=qoiwG%2 z1TY-25Cuf+h(OMdf&rWW7GfY)#7V)#+B&>hIQTnX`UhIt|CL>sK*>d=XdFh1E;$#A ziN(cYEeu4&05MPkv=7_?GMNOy0S2NWRzw6=v@sK<$N~D)#g{+ynH_ZNYg>0n6a%ou z$d)2wBj}QtlC#DMVv$H-1tM^Q2q*z!0Rs_`IEVur;2GT z-o3432RbnU02|Vd20Li=bn4^p$8wb#$3E`AzzUb=g7(IT;<~WML+zn7w@_6-p!jg6HzLax(-^# z@iv0VB6?8*d~v%@cK_+;wu}ystXZ?>rrHG+LF&S}bFcUHExdW*Uw`dyZ(Y7Tj^i*4 zz5fhJpv+{l{Y6BqwbojrHGpDV`tV2YE>HY{4WFFUB5nL9#u$H;lWQ{NZ7PBH^WQk< zoO6YV0)WFmKU_6?b~=?x1>xK|b5Hm7!AY@L)J8k!j4@hkxn}Q3FeML9V68RU6bpr0 z-n-a`-`v~`fwR`T`A^EN9Id>~uCIize$wD7R28{gUHw9T+tAP;5D+o59~yqUl><&C z@E;`WOhiEtKmcIj!byUvsw&T&peJiNeTLNZM@barO~uUB)z#i12!iQw(_?=}f+?R( zzqZyU#i4gIbz|rR6u|KC@C{i1-vmB75%D!4qM@N7|EgFlPMQB-hoGFvImgTi!QkNF zy9RzEg7Pl%qpy^@diCmCZ@uLm`uqE>wMmKIHdZ$#@J{9Z;7deA?d|R3qP6xj7)8;sW5?*)R3wPwohXJ{{14NwYJuJ0_WU2uHlSo>TgS>5`caC_IdO~4ASZJ!Gi|@Xgw)*_L?-! zAa+x9%4?j~I*K9y0|Nt%jg1L`&xwfEu3bAcGz6enEKX6=@(`(<(`TTyHpciTJv}{5 zO-*!7_&f&@rPFC5+OT26z`#HfY_V9JqOaHG+V3z4lQE{Nt84rA?TZ#IBBE3(mBgMj zOg5V(qE)L_?cTk+tEzg837!je#o$Ff2ZEbB^w{Bg(etkZlpKJp)gW^tkmCxtz zyz|bjTeo(1cYB;dq2MDX=bR_+=;+wEabtq(1NR~^UG9_XAPBPAY&p}WO`AG9JAEo5 zLRxD8d-m+9s;cr;PNh=WY&HzTWar_TtUMLZq?Gb!i<+96UAuPqQj>^m+qTX7g<+U1 zV|mx#7~R)ODHVocCX)%n(9=Bj*kb_b#EBDCRaJh`rtf)E3NoD_$uglyvY9n&R!2vN z>g?>ia^*@ko3++@d7-lHX~xqay?viZdCo+uOr142j4&H{&Vz1{_ly z0Qin5#|eUfy1ToptE-tgm&=v6`II%Bem!H+JVH91X6Bljnv*9_5`b;nws{ZVIpsjp zp=UgsB+>XL^oy}`=S~0=$FbIW@7}#NH8s=YEytaXIEBwwn}}*_YoCAqd4FglFA@Mw zojTRp+PYxDf}~Ksrca_f}U|*V@|J+uQ4fc5;%n)?StYoH=u*rKKgAohe}| zr4m+;n}{njx3si)Xuq%cV=g5!8^^J8?#U;g^xm0F#!E#qZZp;=2!eDvoyko8t7*rM z9nQH@sg&#uDhxxv8Tp7B8yi=zUY*b9eF%PUNPa6Mt&&KzFF+i}`Fy^qscF%oMF2eJ zD3u(6ipApbJ$p8aB7b5`oU_?%eSLjxZSAsU%T}&j pdB+`htXsD(m&+Mr5{V?D{{to$`x72(R)PQk002ovPDHLkV1lc+-SPkc diff --git a/Documentation/pictures/nav-active-2.png b/Documentation/pictures/nav-active-2.png deleted file mode 100644 index af41a69eafefef3ad308347a4b04d2b4e58e788e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqU!3HF!2nc=vQjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sfO&)H34Uy&NH>?E;#e2FqhDcm~ zJ8`3ELjVV}y}$)QnFFZRU3<*Hh`N8BTB!)L2^U!`{Dl+L)guy^65cJpLmP3|ey z8jDZt6)F-E*?FAJOTYK<| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sfO&)H3ErCf>#LR#~MV>B>AsXl3 zPTDPcz<`5!qssdUj7I+7?yJ3gtS!NCs#>8g>U;6tuiZM=1p`YCEoC)e%h1rjw8ioA z%W2)av>A8YZP^jHZB{Rr`>o7%CyUd9)4t0dvs^jx?K^9Y;A7Q`re7(Ud!n>8jOFZP h9vO>*2M756Fx-`3Uiq<7LlI~@gQu&X%Q~loCIH8}RI&g7 diff --git a/Documentation/pictures/nav-bg-2.png b/Documentation/pictures/nav-bg-2.png deleted file mode 100644 index e1ce8278f13bf173e8226a52a6cc7bdd836bc489..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqU!2~3wi`te0DaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#79)$8nXLUG&IF)Ps;7%%h{WZ) z6CL>)95|RS{_x%ZAikDAV9%);8_K_%E!@Jpd+ztt_2pBp+z9D)UtO_&&hM+Q>Sy06+Z_Lyd5d7O VNzH!$i$Dt*JYD@<);T3K0RYHhR+#_* diff --git a/Documentation/pictures/nav-bg.png b/Documentation/pictures/nav-bg.png deleted file mode 100644 index b893d07b1a1a0b6b323ca0f7656dca379da58068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^tU#Q?!2~1^F3t4?QjEnx?oJHr&dIz4a@dl*-CY>| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sfO&)H3b<-TXJvKn0EKe855Q)og zCm!T&FyLWkPVx;)2!H1J_=9Tu6h4RF)<-w4EwO%oI_|y4$_<*_-8NU=sXyyl@$W%{ z-HP&8?4Mr6oZHt|IbVPMKezfP{MVP9Z+WQxM*98do#ESl_3Vp3_iy`&T=VEX6(9Y7 ZGG=Hc&j?LxcnY+Y!PC{xWt~$(699b5SStVk diff --git a/Documentation/pictures/nav-hover-2.png b/Documentation/pictures/nav-hover-2.png deleted file mode 100644 index 84c436badfdbb1d5eae875d24cc55c05efb808d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqU!2~3wi`te0DaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#79)$8DN8}ir(~c|iKmNWh{WZ) z6E6xj81Oi)yzV*oVC`IIVWE1~_f`#mtHl?X$o{T;P?{FXxmeLB=()(jobTytKkN1{ zyp#JY`g!KR#JXF5=iZuL%I&`VY5Xd8jqN`V|C;tpF(=;V_4L!| zgW!U_%O?XxI14-?iy0WWg+Z8+Vb&Z8pdfpRr>`sfO&)H3O>0rsJzIf7Rh}-6ArhD0 zPQ1u_#DK@ibE;>4+wJYeTg=Mpxz$q}z5mVQX|Z@*T=&sx^QxAM0%|LZyArnj-hA!n zwBrHq%>J(ZZ1Ug0{_Q`%x2JctF24Lp|Elto+kX;ky*~?V(_i-W^wZzV-s;zVn$rHV r`&9e?^shnuE8CfG?5X@b{}b~Et*A5gRslPJu3+$V^>bP0l+XkKFA-y# diff --git a/Documentation/pictures/nav1-active.png b/Documentation/pictures/nav1-active.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Documentation/pictures/nav1-bg.png b/Documentation/pictures/nav1-bg.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Documentation/pictures/nav1-hover.png b/Documentation/pictures/nav1-hover.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Documentation/pictures/nav2-active.png b/Documentation/pictures/nav2-active.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Documentation/pictures/nav2-bg.png b/Documentation/pictures/nav2-bg.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Documentation/pictures/nav2-hover.png b/Documentation/pictures/nav2-hover.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Documentation/pictures/squiggle.jpg b/Documentation/pictures/squiggle.jpg deleted file mode 100644 index 68adf60223d58e0b227abcbe92e45dcaa8c46ea9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3052 zcmb7Gc{J2*8~)8;hN&=&G8nQ9gG`o$G=vHxYnHM$_9ZgbViZY)!q`f7#u!G6b&{nd zL}bZ2Qkn{76kcSBPo3}m&ikG7{qx<=KleG;IoEwX&;2~leeI0xd;s|Ir;SeoAP@*J z+Fig76EFZEoLmqtP6&hx0);}jVf-){4-X8%%eR;R076*!0Al}s5foZNL{wUA|NeuA z4ob_)$t%bsC6ttvFv@6*JmxnE2nvP5xM6}Ym>@=EzX<04j-6)!oEwk<32=bm02mJ9 zfP;400WkmsaO|qx)%$mFa6vf1ASm}Ps>=_6I5;@KARh1@oYDtdxY zgp?(L7?W0{sxKssHaKnNdY$}u`hc8TP;gvv_24c6@(=Yt$N>Pv$pPltg*10nfWTk~ z6vD;z@8Y}Ua85}96+KI0j39!LR`hs)OG=ged|FN4p!kQhjFoH9$DIjaF9&FM0~~Nb z7ucp1BEZoWFwhAM7w|iM&@v@CE{QxlIYAC9;t|dIm~xVWd-XuQvMo7;x<&%s5BgrY zfZs|ZxN?T>rF^?TrhvNhR-jaZU`!{|l4(B!EnVgpHnVAJT1*{_51B0+7e^t_UlFLh zOE}|hejTqFXGh|XwTu#MkNV_7hi8fD)L091Yx+hNmA`uEwWe}?F3QS~Zrh|IX?K%s z8<8_{&(hESk23mOjk_b-K@|LCu{HmY5z?U&Cy+LoGoA2IgnuY2GHYZFGVfvAiqQbF zSsLE;wPpr{9*ZV92s<~Q@5rPWRmn%i1V9)50LonAMRYc?uk7gB{wamn;8aTdyC z)!0ukGHM=t_{aJEk5qZh`dXxIs0lLJf8k2~4p762Lou)U`AFbjXg+8_nglnXN+$vo ziKjs1Coyg#M69u-^1>#eoAZY_@YCdH^w}S#?m4rS3Q5-0q%d77ai6~*=69=JwM)c@ z(r@A03dara*TkmM_5f9m5{+aC_t%oI^fV_WFS!aWtTsvYyCl8J0|Aj$bK7*tDtFtL z=J1!Ze$X70I|)bjdY*-s+a$LAuNP@!veCABfoUL!+WmKKFIO9YX}zq%W_sz@|a1f9K{ z8$MB{2A3EIk0sgi^@qRN%)R!@PR>EN)tK~t{eV}duakAEb;$ACvEQ%4z1BGjD5nxS z>=zQ(vkPCx+4pS>K1(aX@)$2L<6bP`b@R;X676Sotn}xSU!muP>6FLCJK!W8w;$;n0=zy`b|t|JU`1slw2zo$9GPu zmL{)AO~bR#`fEh#9uv^K;!o~wfY-gB&ABr49}SZo6F2@zE}9nj2F~;nf^l zgs9ZH#qr%$S6(@0?;CmbslHO>BLtTxrBTD@IxV7|*f;Om~P zgZ-Z%sOI*w?OuK|Pj`S5e(_Ev)ppb2pMxB~1iKh0N}&oY%r1t6sXy`4`?<1V7oXhv z+{`?4w`IZmyhx$G@LK=p-eT83_85wPmY#EL9FgBTBB6Dd@f2-VHjD=u7<7$YU7Ox- z*gx%pZ+1iaRVaROj#V2B6|dASTmn`nOO|&4g^GHWZSs1{3svt%@9x8)*pu$3JEhy7BJ7enwJ4ok`{fzuQ`1D{!+SE6NGnQKlIYOUEZT<6T9P;8|) za%-Qk&LiZ44CjM~ZN4SNm3`MaBgdkWFmrB^zJ3yyaJ-k_7%*}1Z4YnU(S|F8PG;6Q z*fg;FX0jgiLT+kkpPF*ceTthgBHZXo+|YY|v79QFe#ek!M)-JI;!rfzflr?B6(>_; zUK1`=Nx$73rGJ+l^sbL{_Q0n0Y5k(2j#5K_%)(Dx?mP}>jzz%M$38prs?RDiroKg7 zb4=*Ex0GI%&2189kW81EhIywiz>wyesBg)*hB$I>?b`Xt9HUPHE7-^9_$}Cp-4R`Z zSGA@K8a1VpgP+Y*G+J+e6K%=W4gPBxSz}2JdABR0{+$?lc(3NhFFD7x%HjM#W#|RP zS&J7|FFH??8K{(QH5d`FnQw1(7dQ9CXLBy{@3SzKwza<_sFc`}=C29CnG zECPHZPr7ewX?M#nK^1CgglA7p7Z#zufmuzgJ`wT18WC4d+R4S+Ps={}g&H`d@AeJj zUw^Y~Jb?CwB_tWwabCQrmZqz>JG+3C*gh9)Lbv^+`p11uY=Ob8R##{5FK`~-TfT`Ci;NiIV)rWa zAwJBY?r5}z-YOMesu*ulK{AY8l|#@gO~sBTQGM;n*LAe!*rmT1EL-I~4Q_T&YwDoV zCnw>N25x2gwqiYFP*B#La@1;~UW}58z)9KErV?X%18i8gGi(lh$YZ{(ew($`6M5Ue zs%#uxv9Ii?1cUBjZ`DsV?WrG++S0uFdQx8G<~l|pC~*Wi&UEU{URm^qc@r6AdC?}QY^>y z|1n1(%km>D)!WYkW{_Ch#761QVVNoFk8E@mzWIh>y`P zpgMH%NY*|7ef7~`idkAM8z|7beZIyf<;g6n_!<)+j~o{?b`1U=5lvSVmh K#GJUcGyX6Bt7;_x diff --git a/Documentation/pictures/summary-gradient.png b/Documentation/pictures/summary-gradient.png deleted file mode 100644 index bb723265cbbacdf23862f57d9bd1ea770add4795..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 504 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXT7 z5-T#|x~FLX000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0003~Nklv1;C8Vv2)X`6yhRFlzzNElGgih^ zOCWHN7h9%{vRDon`pPNo%Fjl(Mw z7;alKxY?CbTZRA};-xCdo7t25ayaVCA0JNNurp_Xzu`;E$* u`z?E1X%G3r+3ru^^?cHXhQpBwvjqRVCt?1qOxQ{Q0000$YFx~X|1VTh)^{SXd~ZZV_V(lad(9y+AwFl# zdvWJU>NH|X4XOyN70jp>EO8JU zlsO&PFb#qg8*DQ6gxk|L>0-o||86GBGkfWS3)5&SJ^!5(Tt<;BUEpaKV~0 z#K%nVI@S_bi3>Y)a4J1T4Z_7@H<8$`x2jlYFsD;{zh}41r;t7G30T*l{^VEqh^0JN*6ToVPZOOWz11BqI;&T`W!#qt^YBoz6c` zi#{;ZnMKvrt@0nSac=|2oP3?@}*Ts=P-MHurLx5G82Z7 zBAZ9RnI0Qe@i?P^=WYa?QIxwTSOUD8MwKdyF6BOtS4`_ zE^b?PzHq$Ut%nB&3elK(c`pTAK(GGJW#PPAeSIm|*!UE?e|L6P?M^?|n=iqH6u^?c zL6`?dR~eG z4-q#Z;K?1FTDwM58M2w~%{Zx=X!pr-;EEm;V-;?5(f8@|^IurBLE_@KNArtx`lSo) zJ{#>m+!hlobo8kV3}UHay}c=Y;nJqHJ(`BvPmj3Bgrkws6Wl&Y_mw48=A|7SL&eHE z$jAjbIdYVgd1#~nAVmfrFU`raS&(nZ%d`9NAT3U!(dkbHAB=&ee*gFD)L<+d6qNXq znU+>c#79+arLKUxarZv>5O$kU!H3@Gc*T8eY$1vf9U~r|-PJZ~Ix40QTrs%?eG{Xm zH^){yW?=_^YI++bdcHIBx|PCvURwfx`}=AhZ_U&L-XMh*N0OaJk`WLP2`rJ_%dHZK*y0f~bXI&#)|8f#n!ngmBOuU6iB39cf)PLrJ1#_@ z+I@O}2>yLIBRRT}5FC=s=V#65?Yc6Yh=_oo5l#5}w}^tNskT_q;`Wdb3HwI;VuFCO zlpwDp1VPl)H{%_))*g<$5=MaN(CIQI(V@z`j$7l~PeA zhDLSa0zNS?Cd(AKX^0fg3?ae*K&aT&PNLqUOZe5m^cJ=m*QbFBn@z1{N2`;yr_2GnIo%da# zt`;CPULcDuux|9?z1cHXUA+(b*L9m0lBPo8OhaboLu%?J?EwV^M@L7Wuy8O6VZ!$y zt*1ww@l4sa#CkWIjexhEx2LMrQuW@n@5=@Iht@}jD%aP*7kl$UdJhSMj>Nba)T@uI zw#kf?YhlE3Az6g#iqU^={kjmpH`cMv4HoxD{g9Da^M7j>`{cOVq`2Ju^@muKE~l~+ zGbNAC1&fF{=OknGl^ArEv1mt& z6yF0SQrEk66Td=3oys&88FVGKZPN>6^UTLK`}-0H`VZZYC~OL*6wTuw#bVoSE+lM7 z1?t&INdYRKhuV=G(Q*O5A5DmlH$MCh2K}+5k5DkEZz9xaDw)~0JO_72lIBbxo^jap z34cqeQ4`TpQ%lV@{CB16{`;P+Ib^Phjg3w%LxWzzD+I1((M7THSQX{jqnomJYIoPy zOHB>S@83bQ#=3vnTWzzdbEO7;goQ&0b(xR65|G9Y-5UC-C%Ptz=c8Sblz3lS8w#bT66;k}1r$(xM_W3(cD| z?r?Flnjg?CkrIVdAi#pKQJyCX`RUcGX#X&7d)#@}QjG-lAIOj}G+C1;(_(=uM1m=E z?+X`Ai5A+cSE)va?ZO56%IKE#JIE5DuIg&bSU*N21SlZ0Qs1V0!PyZ26vWj-uHn*M1`yfDE)WG?H7>`rOFSV8>HoE_!3#qzAT6Zd+z%Y)`zOL_~rR+UvO} z>tzm+vc~~euEU|AM!;&EQTadukAgQQZtCWo3K2HOp}2&Y{b0tP%T&tA(b3AX_!-VR z@pnW48Cpn>*G=hhUwEx%m8X@JSk|XWIXPE7{R4AzL>CuujH{y&_C~^->~`024HTuO zbr7G9?k|qF26h%Oiddj+IWDG+cSnZ@+RZx(_!LfePlwYPTd$r6zD3ccn23f5|e{-ZP2aqG0x8MPO%wgkY+CMfDiR5))Ri7%SWC$$SMFS$@A!&Ee;M6)7`&`?bzD?3H%f z!EqSiQ@op=p4Q7FXtakn`%|Og%(!9q5!3W^@3^^pe|(YP%=w6?JDzF7?ZLpv&hGd2 z8aFwaK)~z0+MIXTsXN!8>o%@&3X50D2suRRU2^+am}F(ToSTb#6uLBs2qRx2+EjQ8 z8pqFE%OhLyZpFe)ESgJM+iuVh%I8AB^#y*Wr#9$FeHZ<1iqF#<8fJWRS`qeW)1{q; z+wJwjWAySkXf;#&`l_3f?Z9QL1y28IrFqN$Fky8#vDfmW+dwf)Mse}p+FEWLx^X!x zCr6_MM5qvItFPC1FhcLhF{{P!?;f)=YhIp~=V#X7Al*bi!!Q2k-uf2vSMR^6X!k1q z6d8vm2C3lTNn(d~1q9fCYv@ZY-QManHufoIvDFbmH%RoS@%!AKuD0go<#FRjiEV_3 zS(7D7Ige+AW^q>CUznKhjb{eDGz=8TV$T$*3bs8I5@48`UBt!r`3eBA2nb$7L+t*g z<57@GNQipwCnPfm7iF3_Fz?iMcfdxh(S&1Mo|EQ7=nrTz!4MD!oo@!QDO%b}N`x3! zx62OXd|5Y}eMtEEGBmVcPrZFcPF~!M+}c`dWLV)g=ecEEq4l%qs3 z?N-({M*`2B#a?e1MQ}TVR}&XI$>T(4B@9a?XVUz^`GGlTI9P43s9gZ`Db)23VGg-$ zDt?^BjR`9&dLxH#75xz(Sxx#8vBP(EcFbn3iGNp!j&6|IEvlg7%FNBw8P@fiK6@5h z_Cm9?< zOG=uKh)5Y9$7Z$Q;QJc*yv_WsOi{2Qh5cx5fM}%3b*XLfdMny6l87-tXWe*L?y0In zrC7g&4dg)2>72pP(5|YgSK4)Sg^D=X*z=ab1h0oHgEEcD=-G6-y17)Nh&P-uC`v(t^k71p9#Sx?Z#2CB{ZjU+Ayoe z=g)u7H+mqxNaQ6ZBrxqrJT?jc-rW3^Nb5yS?alA)`gk!gpTP+7XiTyZEw|D8g-5cu z@fz9cU9s0hu zw(^V1Ncd}My2``8yVFgVp*IF)qm`dktH)Jbe57Qw`%+u;+-bZJEU~~S~u4H9pL(M!q?jrFx{T~mCXspW~JP!^q2?+4Vqd?6=+XgYr=W2IsvCaYk zE5%hzpNx-CTvBpX85BaSf0VLlNJ~pwSsf(OYF=Mo=c^pF``o!7|H;X1)cK;e1W{!C zPyWdLZ9)fn&em3)aUcBVPMyVs+JXk_l$=~paB!I5BL;Dh(vj+eb~j<|o_s<=aSMF` zGaX$%iE;rA(JZK<6sM|X)zmjMghF40Ojy~ey0*AM0Sc!1El|R+#A=KgQLuo}L=O~T zE%*Zk>}omZGJ-rkLz)b|1nlX+{Y+tQh87t<4nFuW3L5;98H*7lux-$s z``@*e-IyUy3|lsS!u89zx$)FTpNgSxh?9I#o0Oxd!3GnC zpkN5T_4bwU;)8aF564$~_9{T}E%cyN9#p@SBwa~2zt1!&^iE{?_~2?SLKI-m?)RUmnufGxVSjS$$tTwyY!s@%gsU(0#SE; z&y1<|*L&{!^Up^i%(Wv@Z|tw^9kEAxi)44kXD_dR@9tOb&EFR*=sq{PHXOIO3@f<3 z&yBgA+Jm>gTBzBkJ6gUQ7>K3~`t6sKBS|5rWE!8+)^_ssYweiZfh$)30u3RbCzJgO z*8_WBUmx**UXoGx%^qi2b#*R1>|_)auTN*4K(+UcHBCblija!RbhO~>pFn0(FCUBJ z3RDf>s|ikKZDv^*#?%#?+SDxVqmZ1Uf})}Vi(H%O{b7pcx7}C4s@EFMMvpp28~2FA z3y0ZGhed}Mjfbg{vzTfpw~a$sPfYLNoOm#Qkp@V-+0zsHMp zD1>}U;(uU?XXVmdBcOrIhzN?-X8q`JUQEJ{spWL#1!;O9#qss|q_-EBmVT#lp!|5@ z?CTOU0)!e(9zK? z+0twyD=JPLI$tPcb)1}>zP(4Obhsjwj5_z^qe*P>zBybv!^Xj>(rrQp+S=MKFE3S8 zR1y%-8-5l^D>`&`ys*5OX*gj6T&Z00r|e!EUBQ?v;vHHt{=*wxJ&e-^+etfzOs*>x zD+8{0tm7sb#52_eB+~R!{LlN2jw+7CO_M^)KcoG!3q+G{Ymda+d`LI@mqu(tcN&rx zhLa5Ky;HR_xF04>H+OM) z|8D%v|Ld#JQJG{<)G7da^Aq00D?MACZroBY$d;;Z1pzS1YSvEUZLhCyo#odItOJgPF3kHT6n2 zKR>?*SMlnGhD7?AqfQM)pK4-8#%P%WLVoXh`ia_gryt~- zif^yi>W^hr1O6wS{cppyv|D`rC%5bE*P|+-Y9zGS=@`5hUA+m<3E<=myIQ_<;yhQ3 zOs=|`%*1w)(qj$H{LVMvasxu}D(mqb4z=rY2kd6mBY!E_bFQ;!YSpEj2k&3DvMKmi z`HZf5ZcyG*?j)(JTyG8QqTdry!VjJWi_vKNS~IsMoXjj2HTj(tM-)#e_$Os#uQ(EM zG<=s3wf;GwzFKgYYc!w*{I#=KSnsExV|8(`+_z}=o_pv!G%}ZnKpfq2-YPwVCH!n7 zTcq})duVJ*X1FG!=urF(3iv@D_xJkxJJcWz?U9XHqJd7@zz)1vZhkI_18=J(N2}Z? zs*S5`Gjn7QS27uf%PRyKS<)nWS2y~b>$tEmE=UOA7zM$Fm0A1rpv08Xmx_x^tMOPn zAk$(Z%dBn@5W<(5I|sMBt$}E$E^w#f=i}2MV~V7Rm2sAFnTDUf9pDVZ9f~FAPcg zWGX}8hH*NuMl@rGSaT_M4wn_vDB;qn;bN=U4$dC#i#hm(xzV(>fcfM7*^USw768-kg3ZLt65G z9fq}1FLZ3;PEiI|^CiN>>kW@ROzYPN4A!SZb>oMn(Nye~7B>y9p*gp>GFl)(Q{(Vt zY0mMekcVf&*Uy21Os>@x4robFe;;tW_*%`hS$$xqj22rHI5ShFx&E!qW_!>928kqA zY9}%As>+aZ{_Xs}#^G#@4Zh&D5cBue1&70$99{GW=3HI==)44(0-w86=zk%}^~rKm zf2&B2<6^CuO35q;;Wm<)9^ZQQ#PTJ@%*Fb5dJ8b~+h~0?sjW{5&~(@;s?UC3*Iy?r zXNVNOt3)ZUiQ_7`qI!*`Gr@93fcVtPmVQ4?%(22^BrCi6;w^COD=j|6v|!YWL)5Lc z;2H6hf``V*5N!BpeXR+vAx;siiKt8L!U{J!^0 zs?gt~U~8EqMH_*pSUt}P^(2{_Ma*8^L<1B>K~kg)*p z!eSPA`y`!h9qElT^qKU)#e8Y@Y{ONYAO0+2`Ktida74q zSMnedEXw+rJb~D>lEu-Y?x?~9Tvt~tdV8dw0_Su)sahmSosNGN+gM{Q;dbd<0IIEI z_Lirxh5v0q>EKh_`bTVTR$C#csg;|X`RV9%>fC5j5rL&SocMY$MG%weu&ucs|HMZd zu0@3f>&sx6WXB+={hI##Y;Ioeb~La5%Mk*g!W?dP+0)b4Kca26m>>l9SDLSSL)j%y zDJUt=R+=#Y^YILBkQMCq=23f!tOYQ?twuIKu^m{6n?VCi#Sv@n?LNylr*`YDA$BMT z8W;j#+R$jKWv+91Fb?=T)k3oEaLP5dzz3v_x?+xK@CDXkqJ#2lD>!wIpo{?xG zIpmyYuB^$asbmJugP#L0As;BLS863zn#q%X;H~=g*;rajHI&rL&WV$enHK;8ubq{<2SKi?-% zs~*yR#KOWt1=VOnzZ>-v+5kKb+rL*2FfcHkFSoibn^Uli>+Nlimxm_{O(W1dz~@2> zj^@4XDSb&4SHeFqXCGcpUL8OqlIEuzn&?#Or7u;Ekjb%s^qkof73f6s+FBnBFsU{1 z4>*6Sp&URS6<`{5(~^a*v;9*m%}+6Buznu!C{MFu`OgQ#?-b+RwZ++~q{ROrSXzzi z!S%$`?F%>8y|LWrn?zK7<>I^G-0M-fIn1l zC=?wAMm#hE_N+fAKR*E=BO^mcPjA!NYSi-`36CR#%gK1-cd(3PnY&8Kwb65rXf(38 zxftXZh?&n>3vJZxh1c~b(i9ENXmzz10vl()AwK^YK^1RgnPb&w@f?clmR;Lze_79b zgQj>_*;y-a+*-XGz^(I9%M9Csr8ok2;Z|2EK26D95${i!W#+G3(yFv`nZN(57NEEd z7O1z>8B2XH#yy5og4I%g)6m?h-sd+}MHDH57S{JZi*tj`yDV0Ih`1WiZU~;o%m~3lf0NutTr)COdl?=J{^7Gx{!|ZTmWI zFkC5?B_R91MZaV1rl2Xn; zjtjz5M`FDsT|e-MuaG>9=*y6P&*>a5_Y#CN9L#oeonP+`7@42t3fzPL)exe=Q3SVh zTR&BCXp^b6wX;3)i;>3vSQk}sYN5uZ&MA}3f zWfy)$KY@e4`8yWLont<{4GXiaWoKD8{Ji6SdU$*gT9lhCPcNKzJDQK;k8@Pms5p)r z56}LnuTDHxC-yNcWM z{9hDvQWLOjMVi4)nKt(Z46EZW<4ny!d?+}VHAVM&sNM-X78z0D%YS^-D*#OuH>2j~ zqx~kjz?-L-SSB=L!y3w@@AIiXZ7?(dh;cxFiI|>Ve0z@9P!VavlqK8H)-F3;Ie6L2 zmQj0J4|p5P~-{`&7W4PO&$^)1@PW4=_S{Msp-o4vi*wpgV zT)aJ5zPh>s!=ehYdTTX3<+hFC?~4IrQA1%L|MLCqAI9@BKXz&;_Ar$xlV+4rG^Nyl zr3HR|QH>c?D8GnT&LF03v+kv#$n;{oT>}A2R8>SYPPC)#+{{yl3pfvI6LU8<@|vr9 zx;1zq`8^*SjM2ym?fs#J>moaKN3(nFY3mfuC2Rem~(U zj~*QwWi3Xi?28!2<@)b;ed(5mU{IS_e$z*Z^S&1v)eJjZFGD}=<>cNWl<{uKN7z+C z#$U$UhzEcb3j~KNK-t;xAx-TY2{HTRUd3dAwQw9!%RDywE#js!m^97L=lY1-@p38a zT)_+37#u3AUdg;y5;{86d0*1Lq2 z9Ee<7>!p)_v9ry3c%;C>YCc{^0bE)=1bOY!0#v4d)mcFNJre%rU)q6ZyRumKDt-3G z5?SAH(@_6sX9r7!82G@N3XR7(zmna58l1*%GhZN^j7xPs!q{1E*lBQk+4U95(EouP z=+kHNIq~X{&=^(Ja4()Z1Zc!>YHT{`(Nc zQs_kFx{t%z)$AVDZ+Ke2G7y%1c)S^S>msNcy|)j+NU;c~a6O{sW6FmV^$hi1dN3Mr zYH-xwZZGc7N59;ryeB@sU6dzRwW+#3*b=2H!YLqv zG9zQ649a`L4t#&^=y;1thYriXxzJEJ+b)++XNQc25z-d@w$UX7>Ur{1HAP_#;&P$a z+b8kQm%jYp4IG}<{?R^O4RHe>#vkJccP4@)0~pv|j7xk*E}2GD%A!5QXotrx>K-L6 zmcIQhPq!!cE_=Y=!-$XBt`#P@$IT$%3GlS^%RG2NSM~QRB;)xR6s4Y?QWnWsS@+ZI zUKHxLU~2K7h$B(RnRkS-CW(=N#2J+TKJvOBuTqR76y$s?%dOp9wpoA0yJ1WedGQ_G zGmN+wQB?p)f^Z8;OrXvBn}4~oviig)H&L?Hk4L!qUYde&+R?>DXmBw8SE1>!k4s9r zyq~)R%W7)&3_AT|Gv!zGY)kWI=4M@k^0r0`@h_8GvIrBy|ruJ1NV5FDlmv zsB&7y%KNO#isJG=EKVb9AAOkhiDwzCp0$O6&q^f&6!PBSz=>nU(BT@oDbL;U&CJYn zo9xNshw9A7R6OWP-Oe|<{ZMYLX6jMKxxxK?S`xM);nq>3TK}NkXQsVud>>DEiuZZxrF^?k0bM+_CB&8Dd@YDGR1gosk%~3Opq|n~nZ!XB2 z@|v)2_?}=das|cCI}eF{Sbcc?_8;cV5?XqMVH*fXwWNBU9iKw>NB5am`{@YU)K+Ug z1?ga!)8$KpQR@UhuZ4we)3SxfNeDG*&=O}`6f}(Bi`wJH%+W_Rnt++YB)dLA>VqbW z2@+@LFi*ZsY5n-s6??XqwY9&0|8{>X+f|GD@natpnMe8;ldzI-z)e3(CWkP?MG2&p zs~h0G(kaZ!^%b*xiBQ3`-KJ*6p{;HCsbkt-ZS&oMz43-!vbK}y(>He3gN5V~jPY zrD)z3u*nT~hab zJD0>5>|FHk@8D9)T)%iJ^5y47>4Isy_{I&oCRjJE|43o~r?{5(g%KSM0py5>kz%5& z{(ig^yykLE%%Z#~pw+<=H%#T5&;k3VrfiF2C*FE1Ip^mfSRz`JULf>s#>d9um>3(> zEt30o#5TGU(Uu+Pw~n8zWh&%Q;e68~;l{#pqoASTVT>k4O<_tk;NTeH=a=N>26=m{ z4Ng<7ivL(aN{TGAItqfO{kAw#lf(L2o0p58UPehtNp$oCxDDQ1uc1hPu3Oxj$VP#M zm6Dbo8XKc$WaMOGa`f=X7VvwFBbO~Ex-}3M?#|-(v0v}VjEf_|gqN3>x3jhVj`)$q zWp@;8HEY=<9h@#rhj!N9nJiN1%YS>6RPm8GUz?521fr`20;+PLuV!RqqQk%am&X~5 zOzp@BWrpAz39oJ=Mf6BJ2v@634kPaZ=L`&F>J5hX6gxbbsp#b!DbjnIv2i@;8BRxD zUjm3Y6+(Fu-NF1QnD&q*Lk9*22mdrV7%C}E##1V$%pt!z8#emi526zg5O{ca*x1;xq~hb?-0hCx0iNf7yFmxSq0PbM+>1hf_(nR%dMOhk6k;bZC<^ z-kz_b=}bUw9-{?5)AdsIGSlF1fq|f&YhAyb|9fm3=O9@J56yl~j+0i~jn>+IsAr8UcN^^b<9Y#++x(|WbI zwxFL3AJYAolvgANL|uWTTw_E_wNNhBaLwSQ&0M>`1*DUbP4o#M+;~3 z6}rIr-Fm=!i<`}6Zzw2v^-lHH{AUSCknmO+u0YF% z(a`~_iz-_~3skIx#i47Cr=1P+y!04qVw80r6>ZCp_jGPbL;$J>$KRBRwKZM=xuZ)< zkA8^cc5R|@%{`cxz@St}@aO7Oi-)JJ z$j{xLKhnjfL-5Uq75VWq)&d&N@cO8UlTD2Zo5=I^xk#DFwK85=uq_QEZ$ zYTgjIadUGM2>L%)b-sp$hQh(Za=9JOg4r*KPi$=0-QV7WNTktH?F?$8dk7Dz?L{hs zGHcu+sMZ#2Hy;pya_w^MQ&8F23&&Z}A*JT4DE|T7d4Iq3-l*5}8uz+X67>f;`XZc= zmtWZt;?UqhJtG$H?d zrT)|9j%?APPp(PnnYX>dMqvwv-+Q3&I%C>WI!Nh#PWMLyU>@lM0Fe8>UL0=0rE(Jz z_Cgwxr8!?1dum_c0DXqEij+}3eKz>uNRx*Cy-)+@BSaGY~!S*)cxUd2b@2Y zkf-N8=p{cAH8eED`oUBd={y-3+4jy3+6V~NU@Auaq*SBI!0%**WWw$@Fy|o%VbPsuvw`n zfjN0KH8sQ!OrIaG4{SNW5-b-tjT_JvUY_piw7{a?CmmhgtA}S$blBeAML!$P8Y~bq z+Tn``ph6GtZ;7_^SBK4U7p;p1c`p-f!LR$4l`s6j&$yuli}7Q7dj?%n)KJqNlEb!d zTFDA;OUt^qEH%|kRP^-VrFZ&!;z3d1xkC98FGk47^WNUvJ3C+qQ_a(!daz$!{Cc=h zIJFCM^Rdx#6}nwD4ftMT_*C1RqCGQ{x_rg#^?@k%Sr4lvtP%`w;UgMh3(9ou)yC?$Q zj;GUB+;2*0YFcpUC8k%AV=aiQXM(RC4-LdYOGqlRk>VPOhponVj(jA>HQ7W!5S_t_ zwZ~cMaEL0TyBzZ(b3C$K+N9s_*Tttf0tAs_q^bM5K!9nXr$r@n%jD{5+;3MF}qYp(rR9X@R_i?yP zUd84N>gV_^y8 ztc6R}XiiM$rB}ax3R=SF0}o@!x?6Ds%hj;fs(O5a&EY5-i?){}h}I&(mhE*dWtm_S zg>5kTpT}PKXu$#mDc1UjSR7D>iwhG|2`+?LAhD4y=)wt0R})N>D^zyk_;eE^MQ&{Q z`z%}{ms&-x8wC-F`AQcX(~BOgz@aoqMguKK16vYeZd%@z+l6E1#`l`n$bM^+PqGxi zn0|Zg?!#JPFkUVZ{*w5h8JwTH!6L`v5;_(qQN|PF|5HWfD%Bt|H~zrzkKdHg*KE~* zB%15uZIqZV*9}_>k=RevH${c>&yic4kx6hg$ndmCs%_(L$Va&HIwU3g3-yLr<&(1O zBh~ea)(ncVzoW31`0;Nr%Rds&*0PbBu&*b^KaCSrJpR_NwmwSWrcEf$7g6cPpuKLN zFP4!mP|_J-CB`GR+V&%#PMp?lU^T9xdcCD6n#IL4|JPgAlKdJ{y`Y$|hBuS)pKp~C z!Gandm{L$Fx{HySEt5Xmrm6^d0M%!Ux7s1ji!oV1O4b_#=cUaCh0$%`hf+vk>_=HT z^v;$?n#1+tm3uvdkI`0L^|#fxAI_#+oF{O}N4Uu;Zylh&jITZ>VB=KRt(WitW|Tc9 zl(jD&Pes8+5MRC(_55<^56(b@<0XOt3Ka@%h|2AF=aO&|B-bM3{L}OjlzWHv)SPJ> zv~+eWcL}%nAIA2{zoTnY->ju?O$KeT4%rUu2?2Kc)NG?vsK(XiRvwK29J1M{^_E zcTB?`3FvO-9pijFPsK5s?AWBQM!rkoY^?@knI%%4rB zb^F^SJGJ3qrRvofDJ^b@*zC+rarCMs@R6mGVD;2@GrCYMXZJ|p+LzVEFr2SCOzAJ&Gp_!Pfpm%n80E}}R4gt$~_|aPnaog9SEC2GP+Z-K_D=t-$BOs`AYW%Yym~o3Km)z^160X1YRYyl zJUJ>|f^Q2Gy|t3r!tPO(@^%FO+=0$S{81boK@G<3b?V^}`wqKFmyNu;Hw(a2UoW_RUWZ;m z8l;o--K>1HxOB!zU($`dHkgm6&bskzrM!NG@(!}=r*gcHSES_&kQS6VNP&IKf8rM5 z`oqi*!EZUM@yvimP)$sH4pQhj@BV0ApV1_F?!jK%iF78g-WjV4c&Y3|cAUi{Pj>uX#QvOSIlysPUCPSsjT5|Ac#t8e?+>{Dk) z{|JYQorc_eYJtV!2rckwo70a0B~iUhk5W&d=5Du75aNp%Mb+bL)2nDd^%R>(ai7&6 z=A^*OMQxyqo>8A|D(|)x>|D^z@d;=BO<;3NyMj=MAb-xKI!=m6?>%X3I{Q{>SSivg zua>(&#X^FCXfg_WBWoc`v0@Z|bKQ}GZka}?!Y{v_DujR+IosOJBmSO&F{Ku_Af=J% z{0MQ9*c2E!do&yXex2Q}a=8)zOHvkgjZ)H6H=2Z%y%kVgrX-;{fkVqKo`-mQsx#!Z zNrNUaPAY$b^O%s|%D^QJl=HZdMzm_R>BS(YQYR)%JI3DuC2DCe6i=5eBfU(Pz@M78 z!xCO6cK^|eQhVIYlh%vb%wOF^@~ZlP{Ir$QoVp*e;r?4)rx;!A4{{IxHd1W%6KcZ> z)rw9`~%4!ws~_j zD{v?dhNy65QCH7Znb)1}wGt2oL@M7h-biO?P`sOinKN`mlz;v=V!+fJj(W&$BSG3)yVm+`GuVg7yn-vR$9PP48HZT#yTi84=z|@%GjzI+2!SVdQV@1 z-G-13OC5pcNEa;loT;u0dP<~*nA@;aa) zcoz-}7V2ZoO{ZQ@*+@nk@ap&%=sUDRT)n5#%#kUB?&C39jmkT6$G0;Vg(Xg$9*mfK z6e)2hk0umMG zn5Q?eox~GKHtFFbr)^5(>b{p1>x>0veo<=u`mxLoO+9Se!Jb@oFuqBVqn_C|ea;&D z_+1d2KJTcO8q4CET$yzGhdRubXMq*RUs5#I`EGG6`b%b}IQD3FtKl96%>`}fgsBqd zsWtd~1Z@I0wHMXOxgv=gW!lvksMefPDkUn4#J2h*CB;)}!jmMN^qM6j;k7u%R`F-s z1u;~9+J1Oc=k?nq&KI6|p0rIySJL_D%xpQdmSn+M(B*&M!vKRqNm5eAp&|jWm@J_( z-Dns838elVLzcQa9Z(TbK+7J{ycV_2+8PrcyhGOp%55-R5G? ziIitMKK1BI3$2q6Bu>M-#A#D-{OPqQiczO(0+gy7)d5ELSqFTZ|qVKvMFos)Dx%4Wsr zH*DqioIlH)Hu)7yokNSt;wIk2U>oQXquam=2i6)TjrpZ-BivZIA!uHicGu?#pHxHw zI7tE6a7LAX@iGm~gcc&qH!algbUtcj*42PMY*=!PHagvA{aFDuvvMx*sCWa`iI=O7 z&^tV!-%E#02R&zr5C0|=QD*YUH)9YnheKrNW4M|hUV_;4l4dngC&N$Gp|w>xoqs({ z7H?Cp&3}Br`l{^pufF)*B>cy4g(~kDNq_&2(&aeK-V)!d%KE189FA|(X(ze2rnio~ z0M{Lp{=Wbp&>=QiT+-lAvOuQ3$U}K*<@e4g+2&4X1 zT`Ne*4xG%|+8X#c|J4D&Amjfs8Hl>tna0&*PewNjg;)$Gmh?L1XwA0rh zZoA}C{g)hu44vk7P>p|3{ z39f%IjS%|Lgie}oUcsz!4xWSY_xG>hYvE^Tmy-;)26JFz63S0o#ucsSq#@UBVJ05B zXBiwK#R}jMLDjlUfnIJpYQ znHpdv5i%zzxy*L2I0*eJPPI@EC&8NXA9=LEK3FqHyGA2s>82xTun2%?EG-k@0KKC|q=qJAJak4KQ$mQeaM*Kdcn`Dqu$WPFBN9Ekc@vZYE-+u{I`HE{Ibb=Qz+}vi>wHwd;)`}_! z4zJ}PGeB#9{Aa^NcN1&_+Q}8l=ro97&fyP-$nP2~$k31Vwh7Nil<-tf3>hdrD}BGb z*M%)ndm7ck7VD?^9TBW%uZ1$RASsx}IW54`;5xV@nQeKWuwjV%Zn{5;JIcv{ts^~G+4AO_2Eh-hp^Z{rhM*<9xO#qMMO0XF@AyiO z#;M2$n+Wi@0l^P38h*F4RdCSS(0uTzY<4j>j|Y|D)0ic|5jhb9#{x{+EWYf|POEfM z^XQb~>IW)i-Y0I(+^wIyP%;yPRiS=*h=K%mf;K7i$bpi@sY`bKI@hxILq1mBok(}5 z=DDX@N|I!;GH*y@4<|atAhwiX7Gq9J`q34lG^FmEnT=W(gnalkJ6^vW;l}ZIwMdZv z&AoBCa)J*u*TYGb|Iy7=e?|30dqM<3>5!IGq!~H|Nh#@}zqE9BjEYE%fRw}#(jYJ+ zAq}HaQUlD84k6tP(#^ZBx86VT);epi`_sPr?t4C;z0W>pAO98?wstxHTUJrdXcgWE zn_jX`pC`cjP?Y2uiPXEC&vVYzoO-3_M=T3!~ zsC8pwh30O}@vj}mIwA`p4-WUd0IL89E-u)-@ssmidPeSELRY=`N7^_qs zHReS^b$Ck)F2S%j`fSRc)^0+l=2mvbey%%hb<;<6<1Fy2*(~v=GpG-nuL_@ENrR0A zmnl`peH+$+@33W!zuNtcO=Fg4h*fz-kBqf*$%Nf*lFmqfnF;3wAMpmCC{#ct;gN*f`)MkB5W(`OeZC3fVIB{dS z5is7@#f@!S1ozd~(MZg!(7#||(l5B=LU&L{8iJdqGbd`VCa?*!QDcI^vPY`^PO~y) z?AX^}hw~?@(h8f}YF%8omu8QmUEyX;8PH zBWl3Nueo;9Ny~iIUTcC~G4Tc4^h8K?dCwhT?O@`_V|D1uuHTT}w_D25U13>@(+cS- zy;NNl#WW;5wYUMBPC;@g|NTV%h&0nc$nhayq%&g&a5bx71id2HI7)@7B7vZT~nKj@i)A`*y( z?X`24%Qv5ZCYQp-CjgkSn^IG6>$C1BERf?2I)*1$sZ`iEo&c3@0?vb8$mu(E9;J)G zigJEMJc7bjYcf<${WfE^PFSF0156MV5%>Eex%jU@N8x&h?F&;9RT@bmn&danNG2o! z0RKJCmwyw2iGLW__jZ(6_9al1)7O}}ZT`iDP!)09E&jDa9T*$^l360W+1f08a(L7u zrMWmaTA8WP0Z7Bo0PrOjw5(^4yhl((T$DZgNAvV4nxk`Cwog(^)=esaz3usJAHdX3 z*xc&T)b&7Uk=-@{q>~o0=R@fRC4Iq<|GKAJBcxcegv%LF7?6IQjkpB8O7~7u6TZAI zeFpBkF9qyI+s7XTzKCxr{1mVF{2%meh=;*=BJRze8#h!!ldX{X7mWK(&s3>xCRHj1 z63fj)dEVCM(*xXDND(j#{0_FHi^W)VU3Pn#6l1jaL^Li*V=Dh4b0PT??nX+y&Rq1r zV&c&o@&F}MLb%efMa!*;9u+bzV^6=6t>Av6L9i-G<;>w(QIuB*meb8r#KDA*k0B~@ z=eSm`lDcxd4c3n+2tM7iuipC%bU<~)GHw&bXXolZwuj3Di$I(gZ&i7V4zpuo+PYg& zTnRPuV>L=L%wK)FQjY$?cLeRNpUfLo&YHu`4;1Xmp7hSuvS+dDUNXnL@`WULVY1BC z$D8sF6@t-|g@|)k`a(^#`}y@ygw6Du6u9)rM}o%uu=-_>oz7K-DII?UU@v}x3}o72 z(;;{R;QWvR(?iV%)q+XP2K8{e5Job%UpEu>N>ddm}2p|qOueR3}jDNGZK|~xRIAy;b{X+Jy zvzKN1#c)&K-?o$Vuh<<|o^-y;x}->l5GMG!1Z5KZ6c*GT-J-{5mX%`r_jGQ20p4Na z&>PkV-)NnN9Ja$3hWw1Q@t9nWrjljoetz!gGKu7TW5f}b+1Ifz;xH8>t=kWV>2T&#ec4bCG4cB5pT93tfSk~t6A)YfX`_uXCvWAyK0BW4%S z^SPCK4^1|Pq^?^cQgHbU!VC0>f<4(_$6cjsss^$X=|yx2R!TBkq)^ z6?OegSH@3d9g=>-TXWR2Xi(!bZ<(wW7(Ch}jxq~;F1T^SAEebHB3*_DGPQiosLdg3 zF|OvoLZ9fXi4sE6ru*`VEZaHGcl~P5ApQ(xb+=N2ibe|FZG$x+wI_iIi}$%omk7_D zW;Y+j=;nZI8}X0mlc|)Wyz`o|sxr4G00}^-ZN_>D zJ?JGre1lW-()3uIuZj;x@S-an_05WZu<=IE>bAFKKioi%vwFC10OdDnr5|YUaGwcD zWgM)AO_95L_xp#^5}}}KV0gQ<`94*p;5yvv7*5_V!Qu)rhbM%}?r?sM<5mVG+(rrTBM18c5bo)nH4fA>T%O2GIWwdt~ zDw;CCQM0dIA0X~N7_w`GL{6M;J0NaDQ_W2|w)RSHmpOya`<8Ef`9sffh`3eI!Vydg z&4!oXLq~pgz)^bughtp}P^I|tke*MP ze~LTTF3nEr#J^-G(|}|Edln%5C}FyXn`6X567$j+lORIdMAIb1>1>49n%_(HAbeZS zi~;yQk4xq)&i?8;b7z)QQ9D-hYt>&M0gDaEk}O}yX|U_U7vD4+eT}t~0kSjp6yu@K z2JLf+5UUk~whw6J582C;AN(h)pNBq9zYX3Yt)#W`JYGxsdg=FtEW_|nG9#U3?^dXL zF1#Pbw*+EL2RsdsHhsj(X#b0*AWH`1Y3f3wQ@H-7ZGgt}nMO}otHY?reWsaVQyf70 z{Jen|_6dXk1slnMc=5QMKWXr0-ceo2gJgA{7IZHlkR3PT+gbt29$}1a;77DtSr)W+ zbwMc3{PxU~Bx})0jLHps>+C+N^!o?F!`4)#c3VN|vPX|Nz2jmx<7}L}bAGL)-c%7h zaYWPg}>kq(db94Q8cpuC^n0I;N|53C58<+3=y!95@A(!m+ zWndXEs$N2{Q1^}3PU*m8%uf>FN&%)pLj^tMJHE@0nnh4P>MxZY>F|4erMDQ>eC?RU zP2Sk?J)*N<)t+=UmG?UOUkL=La>vC~W?(rhJIUE$Yv<&yK>#LzM39&NLuACR>f1 zdpoaM-enpt|7_Ky_iCk_H%YZDLMn9Z^S_36nJTj14sl&` zb1v3-o3!ve06jjU^SOJl5z2(WtpvPL>M@_E2Tm+;Gi|OEn`Ar+{XF+P+F5TyuEcxe z$81hF_&klGQ7DFHdgEMvG?FwOxg@ZySc0PW-+4y)@8U=8R>ZyWW;Rx-cku37;_lyZ<-cH(4;DTG%j?=an(F zE5J#*ibfpHq%tT<>(UO)rrvGr-t*xdQfS^kJY>ZMPa(|WRA!F<7DzsU&ipiY_m5LK z?`2?^eTwPukSkiFhffy)8rraASdWvmxy)Bu&|%S~j4steo!syz3RMa8IRcHH`Zz99 zCp`m&wi?v;0DY|B3oYR<9*$(+!pgL_k~u1sOkWM>hnpWvs5Sa@^T%dJ<&8)dJ(a4{ z&lYHmsz15Mt~=5R-gcRlof{n_Z}##bnYDsTYCXPv6k;5jK=b`D^SCHIpy*{-Cn>x7 zD5x(RL%~2AC`cuOuIsUVjnMwl zic9F_N#u&^uE9L$*ufiY;y62amOZf+;iyU*9Qkvlc|Sd6jIrEZc7BrCv)7cHHr*?G z$22XUS=z?}6zJh?QRfOV&l{5ktQw87o6Ql{V|w}7YbOMWpPXMn{EL-{aeFdlkeiD* z&;i0%>0DK;V9mh+fh3C3V@)6LNN%O=xiASpRw-<9PB3}BDgGkOtdTT;&^L0 zxRzL+V@1{OIzfW;u?P=@^T)E*|=O5lNQi%waS5jk8T0zfcICcVAul z!Tr9A`2Aqd-cOW86CfPK)=#9V%y3Ev*ZT|^5cUoA(^N4+T^rtE19x4%2xz4Y`d+-g zj_;?T+h2!jTV+$L6|EC8Op$^L328Eetw$nS%LC?6 zOM!CG*b_3CXeX|nk1*_b-%T+M39cajeYk zs<{Wz`nsb}RY$^ynq;7>vz7KV{*flgOY zBi-*cQOMx9xQMV4y_Ba1yT#)sRi*VVt36+3F3L^J^;1GN1tp4)a-?FDw{4GVMGS?G zcSl<*_x2_N$Bur?kEh4Quy>?htrpV z$4ZBtJ7%YrvY+QiH6vVFz$;OTlLe?t7AYmdy-f=hBS_{!+tFP6e)}v!qh7Do>E-8 z_FNZQcYjmoKSjSSSP{F&QBt_ss*lNp=MYRNW{8R9Py$gVn7;|kO3@LuQ_LQ9SWaaj zrYMt|UwACzmFKnLM0}-+%uP31QLKG}oSk;Qe*NL|;Hv$tlXa!Pl4ZCc!CoXbv)G_L zyL2)~Zd&boaj-l2M=YTj{aMc{C(%}~di~|9IK1Prgzb*-@+XoQg7UO?nris+SS=)3 zk9AX%j)P*D&D0HjXNZghTmwA%10>O7qC0yqa$d1(W2m`02?rXF7X+ce9_7`d)`4BFNkD-934t6nO}G~6f& z`!-&QW;gwGE&Q&Qtux6BCZbx)#hrXlxF8Ak&#f1xFBmesxi;vr!TF3&$>?!6 zxCt5dH8usr;1FgwLO3@6sW_;{AaS=wq>!akq)%W z)AlI%(phz6{Y@w4j~CY{l`u}S?sTp;d2T8#93rp|K^NIRU;kRrAd&j<{{PY%+A@$FZ>a)EjqsHU zq9#B7qc)9w7k$YCosK4#@VrbSsBSoB)`rV^ZGE57Gco_(HfN`jqW$8LGQ|VvifQv$ z^W5lr*5L0=9QzHo>CU^TqISb*F!w`WvnC#W3cec2>tl@kMKxA|JMy9O$h3_BNa)fu zBhS{|nI#hFSi5?L^Npu+<<}o|F_ULN9-QB4B6)SJqjUO4^smAvC1&=8+f#3IUo(rM z`5aNl>)Ddm8vi^;$l-vGho|(X`Vk)9J^-oz$Fl1dF9|`KDCY4OxD^=>PfJZt6|VB% G+y4PYI=#67 literal 0 HcmV?d00001 diff --git a/Documentation/pictures/text-input-2-annotate-ca.png b/Documentation/pictures/text-input-2-annotate-ca.png new file mode 100644 index 0000000000000000000000000000000000000000..ccab4bc6e7c382d95707a71f8f38e5e681de04ca GIT binary patch literal 43206 zcmce;g;!Ny)HQtRZlqHbDM<zA_a`dx9Dpm1N*fTp)frd3OZMN-xZ-3)NO1r2`Wr4n#Q%A5eDD*lDELiWaTzWN zF$nAjRN5iT|G$4RCu(?r35pN{^{rjh0X@sVwrA31u+P;3$zG`E$ zGfE5IgFTyhu8yBi9J87qbk%2IbM5AA`{HxJ94Z=Ghx4*$uUBPNm5TPu8oS*|MxOGs zlasyh~$aVDcpIKjfDv`?R|ZyT*ia#)ZX{Li%rgk-C@tzIXDWVvds@B3zhay zcc+Rg9R4Xj`Jv9SaY zy}Qc;8+&{IPYeMvFT@KzrrE4@g({kT8QShue$elM^v;0evGQM0t7n#H6Gw-8Qe8YBPdd#X?0gYHI4sJNZ<;&t@5c zfq{xBn_w9enC#EChQ2x(Z`tr&@0GR5QjV}=4h{{?8VcX-S1I;(b$2svRyiLnDfYfO zZ$R?#^MkjXuf=+}y9zEWWW4qe)~Gi1&5{T<*d9*n8yP7}uu~DEkF6L;PEKa}{eJzF z<~e05Tre$}E5%#a@qPkGV)HKc-&-MQc7@fk<+dKhb&&v-WbUe}x~$N&>MXB-gdX25 zBJ0uz(^0#<{?HWblg0E;f?jc-4>^kNBcVbpCr0z4EEMZAD_;{PC(F2Lb8iZ#$9##{ zbTCD2bDFJ}TgkSoOvj!NCUaw49WF|I{D=)!>-hS_Fd%?IymzIjCpVhTUQ3lhZ?g9CKbIV{62~CKDyjudN087cVkRM$!|7+<8j1 z8vHgkjAZf@U(nO9?ax+SulVEayjJ2WfB2o9@iAUK3_886>~>#VPm$V4iE>pdmAGz* zL(WBczGoSfVbYKp+al(vruL`%4ozl+Ra8{Q&OcsL?IU8(+Fgsj3q_L7e^YbY=)pI? zn-iF|D{XJFJDrR>em}Wqq~GFpAr9ujc6*re{&av1c5863i{hl^pnstV2lDh`gcsVM_w zWjyc0Or14#zCs2zWM`&=Zl3fl2M6Bj>Z+x%klXnuH}w4-^;@)ryu6pUmj@W4C+B=L zG@0YKH`mvCV6#AcKuDr}{aW5kv0_ckCpZ`-JR%})ocFvT?vD`(mocWFzkgh(1V%|R8rSx0~4(_BckgL z!HQY#Y^`MN%G5A_A=P{fx9PUXxWUPL49n!GNB=MG9Wq-})|=oX^=A%L;8bEOjojbg zlRz*bTZ2hlDzaQA!xTJN5Ge@>|C`<7vc%(K8+tCTSl5#^q$=YfGGlPmER)H3zcJ)} zX|Q`qmoPvYq@VcvH;eK4&e*;%1_lPbh)A1qL$PX!K@=V;qROKeF`EtxS6dR7N#zX| zwQ%#`ISLMya*;C#w{iWif5ye-{q&lzwc4b5g^N0~4t8UH_441p@r!llQ%rfDj<(;5 zi#J?t9UZ?OE;K;dF`<1%oLgWn1~>l1CSj5DOg8@RF#zXy|LR~g%fG02f?>byKAD5U z(eEwQagc8vHG;LsmYIWbpc#5p+VOe`a#7xGa_bf=c-iU2d%=Oc$%>AViIvCCpO=5Om36NiS#Usn{>F<-?z7(3ZQrD@{1&_>BtCjc z!zckyCnSGvX&uf+UmYkdu&(He(Ed-rR^9QK5ri!<|K7mj9Jtox8SIfIqt*3g>hj)_ zjCs=ZVR~7|q?IZB;MPlqs&s;84TD~jL-kr_M6XAV5cy&MRQ=Ap5}W?ePc1 z>zg()J#|iU0Mq#BBVo zO|RZHo$gJ&sSX>h`UIc)Nx>ad7gG~Dzq(@5e4Oe)|2*6jg_f>`h^yH*?rr-)j1QV{ zkZ-{SnZ2*xSu?3MAB9`f*A*W(Po7guMqz4%N>v&x$IFF zY{j~Dc=I)inYqm>qf!5lZj|kL54llTo=wGcuL4)<>cL#L^4k%E%JNe^K6vpTCp>S7 z-S|D~`APJ`3%GkODuOCPZprb)33r81S592i>uqR>Sk!$664=(qa-?@aMvj{}yYT=4 zyLiyEJ4J4xMf03mSxO4ICxX1dfki2MR>suSGz}51Kp~?CL{B_&a?Mp+Mn z1fZd)Ts1<%$OF4nP_B!uHLYXQhTXoLvUQO%Oo&)_y?~VR!(#K>`LJVO`K*IK?H+ zk1c*jJ?`w|6J0n*0?@)ds`R!$oz>jVs|E!)5Et*v*F;g)2pDu$JLV@pcNJ6fDv070 ztfC4yzFgmFV3Hso-_S!ap?b1UsxH@@l-qu5%t9iHr2cRpN};o=)Ws%^?Xw>P!c*Z> z8wjHE<}+6Mp_2Di*~Ilv4+3A(>@WltysEemUm+M)m>Wx9yQr6cCEqm@|5ft&(3!>I zLjSoGYa5!O5FF3o9;OWKIAEp=Vkkqut_!`*+F&T1KRm z(w5_o0n%#^0tf;v^$||xyW^@iTCRy9`no79V}E^Z%nN(t&yK(HyS=XWi*&l3sqMom zc^wd@sy%;@#Kw0yIZp44}rjPSh>fIU2Z{v;bNoXOqGd3+=Pa@ zy66jh6*nydgXc{Y1O)zxiHYb@3JPp(IhrZ}1mfgKMKE#SDtxiCx3|#Nu>vueBE#bp z4bmOq20k)4IQY}gM;{s#Cp$g59j{OF;uW!DDRZ%IKw~106&WXIn3RsKlT#0|u7_`- zQUPrHK!?vh+gMv561#WHU!wRQ96v0vcNJ`{o~QAJ@0%4mG{@894AkxD9@Nx z*XLrQ(cim}|A2qXdcP3d;%iq<*x6Eox1XOH1fKJF*Qo!J(dAi!KiF)LV1!idS@Oly za0mq2sF|rt%;j*>f(l_LGGmHUYi8~KLT0hvWJYPTwxxOR`5M{euxEAsGq(DTnDiyd zbOSNiClrxuSiKcTZk=OA3?zp}){wW*m6SAEK3gs#L&1_F?b23O>f6R!c3h@(GR+k8 z1pb6({OzV(kUy6mPI&BIa;Dx45gb?&K1J4!g@~&4^C#UYc11b)fPK^na5^qS@A7|S=^XwS7$InUUJ?)RxmHjkyLI{ z+|D7SWwR;Y-Q$T*YPLjTE6Xqt8h}6#@sS9|UOkwvQ~6k&r&9BoT2?rsR8HmF0&|tu zgIk_QzFd-DbTn@5+tH`Tt2VOfGU1uIxoq&6{oAQxwYWz_LSOOsAe{`U06cSfFh9+( zL{a!7Rlj`CgHV`4WAe{Dh2B2)bh>Z@ZrJ8QD}GZUVGp{OV^)-Sz7|INglD&+^x8--gTx zN&efa{iGk8&*i+n+q_UTXLtMT2iJ>ZC##MnNn&0Qiq0Kx92Hev&D|n*D-Q$P8XmO= zXCRr;rSZtdSQQ|Bl<$6WN&0sq$hsBf@M(^xwr*``CnupFN9)JE6e3rfLO8Wm5@yp7dkcPgJON0dJGu?aKY$oKL zuAGD=W6I=>%UXL;3o@9aSQ;4kr3pC0CeCt2@e2X13d7RU6F|H$B&e0TCL)&g36+hl zOwnw2Z9x?!82Xtkjp6z8Y}FfXV^CH0_4T!{LW8pk3Q&UdZB{#x?vJ53MWxBI+RX_* z)%zaJ+f#~W?)sl>w!TrUDV`Oj9R<3FZLuC&VGS%C8Rej2mJ+8Z@81%1+eKY|y?XZR zpgf22;5@4!=U(w|ha#$l(t+#*eeS0I*p{@Z$eCaOG)ls76wefs-_Q3$DFS4PKH&+u zl4n!3J5aCN<>t^TqJKf8wvJopi0xskqI7D5V(RN6#x@oMsVET>%lcf-3z@HZPb0Rq z1Y#dz3#y0uC2b?d?a_bMwoQB)tJB-v6}UF+!@9**Pt8DX#g+pTx|4LZ52!V9PhOaN-{6=Dtok-EopeKroLV_T z!5c1gf z$Mr=g>hPDpw!lV&(>>9x`z<+Iu2)SbOgWE?#ED#tE&L7?%cEXft{!c?m=%mg)<0xX z&9ul^P$6OTI3E-gdI9>~eRI?aLHJaynZak9Js!f#nS?1OCYC7TEv%)jJunDe(sA|J z9!lX=Q#U@r(@Ga|&nJA7%I}DNb+pXJob+SO@B*RzVsDyRUWpu(B6=B>Z7wI`X2vU( z$?$NF_TP#v#&h5A+v(^~NkxzaW@ger!nWSyPzknIn@#NAJLk%F3k*)b%ZSToddWo% zOQ7po%7rNo9nm@aLxYj_+!pwV5Z%`8t|d&OC&4-X|8iqeT+80>o^n`k$!sd_z*WF= zR&Jcw+gZIczfzLX8l+UKi&e{F90B`9H)b^z^YQG;+U;K)zlI&xENo7`TfdS#q7JI5 z(q7p$4LRPC^Qe18_>nrbxZITlRJdl*ksX2jj=KSm4|nUQn*%fD`Ut|eJ9IV;js(Fj z?(T-iD;<2!hZKMT-GR6^`t_bz}H0jJOhwx z_ccQSW@8@e+B-Um+8juz+Iwm8T&KyYWPE=Rltj?FWv_wKGZ#TjQqBOOt>H8Q2%)@9 z|1KfsG9Gzbiex$!oIJ+-A+mkG@$_}d($lBvNv7+Le)WR| z)e!SZmO@s-VL5@m5+_gm-4Ck`AN!+~-^#B(eEaii0a6sFkd^#jrmFmJuf}J+UWvP_ z&1@Wus6Gan=-SdlGoWR-%S4lUb$`*Nxs4vx)(e`V1(885q{h0XhcLL2AMZ{vJ6YZ| z+O4$vDq77cDJkKRlKxrBh2Om50t^*k&_c&+w?{Id%gfY{kB|FUW?8OhTa4VAt{1z{ zU}e+(Tn&a@0|f#y=CA7E{QP`bg}F_;w};DZBk^B6O5sGu7V>Q}+S+9$Bv%JNDWSX8%WWW2zQGhXZxuBX56oec}ErLxAI*}mUGKpP zC*jDJy;!O+L{Tl(LUVR@-r3umo}G_5#iSA>@n}8mBl?Pj+&$IZP{PX0%#4VHv3wYXK>spn0oI*S8J^y*Zr^oS4 z+XZ#(N+{r^{6Lu}dN*Xp|3JL3=vw4)_Q1r7qDHN{AYIG?0y1}@yUHng)Ufj0tN6a- z=~=a}k(0^I$fc&uC`}=yK(Xn{4 zOEHDly0luz%e7vMb;Z3d%U8tu~EIk07>UyM&I8 zPF!%G)h>FjouGSc;POYw_U>Uw(i(j3*KKHdxb1olzTL{{a)_WoC}vwmczXy{e7RND z_g?`NwRFZ(AK}Ea2^IcPvILHfZ*%|#2s+@Vw{e<6a=z*KJMF+P{XjlCJr+mgiC5i` zonl$xDDw?dcuOEFsCvR1$d3$<$H~=s8YojOC0!orG03A@+JhwyDsFzBzEE|&;gsw$ zPAK|b*b3=+4wv3z6hGIyZr4u{St+dB<2;{Ze4Y}9OrxF zGkj$jjeI0D;9ZOR^i?lOveKv1NJZBi_b>W?YJ2(ipO6nMJK6h6knqP}sC(`((qGke zq<=4qNlXup{)JinM&;f!^gTWut^C*|J)?vlcuhTJr(LwK?D8$sey(O(quRD0<{dwT zTx2)AG&1Z@XZ$yBza2@AN8Tm^au?aJa!J#L#{xp%|8x$hcWcHp!@paUmxNDznig9e z5kdZ&KbN?>hz?+{Lo#H zxlK473;n&Oc?JO0l~0t~#gABjn+! zq1L1o1gA=c*?Ui|x99)-0k!#a&g*zZEU%R=_e9;5okI5rwIhlv_2eRVj`tr8 z&_>97iu(_nJv}^_tb#wv*xLi$Y z^G0@Tc)q*UJO>LVQAPOnFChX2O=*?q2;a^5O~-9RT3qd`{0}Sa510WOWFZT@;b~o= zK!!2fP`;w~!4*&bp&KRLE~7vImIX{elyuqn$USw1Pm*g(2W2nb8)Dc z^01=v*gG|#eo_n2RqRv5D`~^|*QY`SObUWhK!|#SU$jRe_n#z&`Wa2l%^Rjp{jZ|; z*#abKT3XuuSFc}}oJs~LudEI@7;Pwf#;-NntjNC6P!K>6c}hfnod86q+iV)2U)&Yy z;Q+Z-W&pyns8Kc-%^h$yM;=aCu#~CGWL<8zu6T9~f;5t%dCPlL+T3rSa3P`$gfK-7 zx~g}vJ5^MQO`D77hMR>7;j}|v*_$9sCd0ZK*{(`tfrwgsSVU%y1vhh3N}_NL+tH=?kA&D zM7}(j3pj0paR;m0tCvzNO`-6G6nF7XP_1VR0c8UB6wVp>1`ce@Kq2|NvPl4RI$iT; zhG753X7H@3H@zkHc$p?7t4-M`YQF@Lr-l7SN=g9u2;>zf-|78Xpv zK?TRh6Q!o6f)Y4T(baOPIcX?oW4o;Fk*UrS3k&PAe%bqplGl1kGDFyth7euf+&t{9 z{T2-~bMeAC*o^aa*3#e|Js|B_Sy_Q+UCD_O7I$!PX!z&h={akcmP)9QTxY$E&CAOR zIP?(7=MKA*Xs#ih za&zOKsI%6+tgjRXlv=1_vasiE`CX&afd{)!V#GCTDyU*6PJBk zpaS1NtP}rVFF<&FylUY&om4mjmz9$f&-%fE_O}KAO9lfmi2LOPfP`~d4?fMA;dN`4 z%t`{71(o*XH+@Mn7;VlJr?YG6St0nicNn0Q|`?R%*G=2N_ zEs|BcQB*-8YVi{2sZ88~Ny47|O&&)}Ld|X$vWz2!y^$3IJUl!*U`s@_O1uZPtzl2N zn2k;OxDyQVnwpmHaSNGj7XIUQy}Nu3aIT(lz9}+oj0`Rwp07@eo7f9{ILP?Kgzep> zRh~n9eEiOQ9UDwyQ&1Qon{oy9bKk&#e{F5;_$45`QL?hK@**<;<{HU$|&Vx{Y{GjWR#`u@{&089WXg^vGo z_()G(HwE<_av1`Mlotg~Vh{+6PBRGvmxw6HetTF&-~n9gc;33L0>JFDUH~UQP!i+f z`haavwa2VhDhZ@kQ0qj^%&3P`2_-Mq8FZr)5;7Q*Qi^y9g1tQB>E-3MZwJoW$29)# zQibF*Lm?)UDQ%CFzY zTVZluiHPedqWk5({xnEz(La9%3=YbH1MEApjR1k^$N>5(tCy;?AV>8=)pR`rfi7rd zY`oU}omjof7%QMNsEyVN+sF=i`2g+R2$I?{JtJ|kiDTE)lWSIBma6~s%Qs8}i`%+A z6NxN9#0~)kKUp(2ENh`nwTAwpRxJEkQB`FKVF&Vh+4=R_kS|EaP*@56&`a&j!kboB z#^#<{Rb^lJfQN@CJMWE#Man|KClWd=^}PubMtT7 zq@0I2E7#7z9%l0ciT~$bQjw?1r;l#}m~rq)a>ibfxZH72-?N3p^zXQVz+K3@J57NK zaS@~!Z&pv2=>}`DqCh|#^SD3h-K28AI@ET0OGk$QC275a#0MPN@&Q3A98i&O#uF0~cCos8Ir2{?d zZ0x3m2Aq{Z!q>Yq;61K)XhEY5n53@3gogkLL)gdH*T8AWaqsUGLloF%EV`}D3lBgO z-M0hUd?b}n(K+K%E%m2rUAD(3rhu|?&Ad__Qc4VkseDkf6{ZyJ3Wt^^jO*S zM(UOmWY#LS6%QN1Mgh{*$9y=F#et%ZJuv{HTovbOAQ0ilYs2Fk58%;Ya6B*RgZW}W z?eF5^0{OI14-Q4!prO2++{`9mpcsbaH2-c7u(c`6>VmBU4aSMv!UO@-x?#xC9AL5b znVCfGsF09fRn5gY^wYT&%oHuCpPKQQ3O8zh30pLKyb2SQc^U(wZ4DvRu9Qct>C`r7BtlVVFKTMUfLOLDZ{&6c zC5O$^4t~#r4Tg2BeT9)9LG~q1x5@gvxc_uHoZ829Lfr!w_^T+^jwf4upt?NQlMrDc zIY142fUW(T8f@3EKi3t!gBAE)#&d-&}*3PO%gqa=fwLF%55)(<}Qu**cfBwAB zlOz`eDAmCX5$e*?(y#GK_g12`zM?+hld27+D%@t{FPz@8vB4BM1A!V&On=~n(3`6^ zo8njC{ybqZuKvurRs|>&I3oAa2T!&eeR%uJZ5fLqfR{XWX+|zHv?stziAdV>8#5VG zK@?GtIEtjNzpxPboj!#ZBtF#7^-DsL6zU|d12p=8IkK7NOy*0Fnmv2 zg9HD+Y%0R1@F!iqQw5dZIxWcuxMak{!GM3#F>9-<<3+}y8Z6Babj5daa$@J<32JE( zl6;N_c*`JwFLM^^5DDnz7^bj202`afpZ_-ywz*ocP_eP4>b@;z=H(%QWM1FcXmGUD za*{1-^!Io~fSYWtWv(wxjl`3VrK(Qsm>aD6!x#+pv@U zB6qW6x_~?VfWq&s@a4+*x;Ln|m~t=0AfL`RZh-hD8|$u;FQ39=DXl8Xab~Tqo;c2d zf=%I*kdQE5J2|Ng3>V@oL{;47^6#(2J>p%FEEI@=zJyG&?K=e_{;kV;>y%$*O4_d_wIrL2GxfEN&G z;%AIvXu7At1A=+>dN47prkYdV>#+WU(>y0Ycy#$%$Uw>S2N&i?sFG@ zLp@#2mbkamG?p4G=!T!6t)Z|=w11q%&xckbC=&=&kRp*cn}8ypr6tEeN0)WP=Xvv{ z3oz9uSIgdp00ER&R|n+h)4$>7)(5~J=J=W_Qjs-0PdFbII4U1NMn)##cQCElRi^}} z6cru46J{c8^}OpG9mNId0Tc*e0Xu=E08LkS*^RmFlNC63xy8lb!2=rt1JCjKc|dEc zFu=0=2L~M1OM(G`f%lyI>&$l!KtZ+&sFGD-C@z|`0YBjsyLD((+vH+W&d^fi_NyJTZbPqECZz4~wp+dwtxCupx z^+P#n9IDOBa7(3|QO(M_mG*fvUaa_S6t0ng5UQuZmb$3y8V^1AH6#M8Kt266vxso` zp@=0KHR9sp@G$U5Cms2#Q5NEZLCmT*nklw_8$r&y^6y_^CmDBYkDI*AIw9_l@Sy^o zH9(9;6ZUni+p#wXzudyMj({tDP394hwryQme%NPEQI8+7uf>mM90Smt*q!dxlfmB zr^rJfZ%Qr1$qE2BNYO~<|B#S_haU$AVdow19PDrcwz{bJe10sQ0vK;F5VOtaz>R#P z_!b0-M3Hg0?>#lXX>S+r0V**gOCCz`>Dd6-r$a&HA-7td26qM6RCoTCq=cEjlUc{j zNJbHPBB5v`@}FO2WVk0TQjk^}Bp)No5h}?n94lW;Iz9c$XSa@3o9-1zuJ8j60_d}A zms~nw3ghV&Xe2&Z#hOVEV9-?sW%$lq4fEgMUnJllX0`a^r^iPJd|>zy7EwQFVnOWE z-oN1JD1J$QZWa1B9!n(Wn~MWI?7G0JLdVTa4H+H!^B)c7L2YqN&PM{{Fm};f&}ahQ z@V)n?;7xzAx;$^o=O{o_wiad_c{tU9xPGT$2+HS~L~alJ3^4oHTA@9F7q&TiM+RvJ z9BLAB~RJG46 zsqPr*UJ-1nbUzTA%>X?cTPH#)UY)}_2#BPERK`(wLM*f^6H2f^wCfM!eRflU3kujn z;b{NVll}4xENbE;j-QWMpYW+3VA@>YDr*F`2WUY0TZwgny`B=|N!nZMfbbp_#qo zeE=W7ZA{EA`_35Tz!mJSNq1b2C78eMoy&=A;=fjYwPtZ|&rAd?8a~+tkHBr3nfFKO z{UW$Wbdb0h#OIg<9Uir?NX_;ws%M(7`^W@r#twxPl-&ApAP1VE?3D#C-5l9{3#!oe zUn@U317V7!iA_p>qmLDfV2s%AU{FONxxVXD9r`a+lmmJ_!9dd*ZobR#s@`V{-q0wOx|yFVPo?|>DabBC5^3}p>b#W}QF zm{q;?!hhMvb8H^~n0;eSi1^d+F6e9YdyMwYQ+BsgX&8w$70(>AY9-6Mrg(Zx|0Vo- zQc&_`$SnC|-!%mwjR)i`^m7A&p<#4bDge9oIbRK7$E+$Mfu|UP_xB=q;DBjK&@nv9 z%ia65=D**D?f5y>LMuFEXV#ieL%mkfHUbrn1X*VICk;?* z|B$}(rvEAvok}ZaXDqy?XmOG6Sp+FWRD!qYx|zC>`uM{n8p(Ej4%AhsBA3 z;mD?P%z~3^#Tf8Z#}~Xa_8jP7SL%`Y^ls|uO%o*wj}ieEUQAOo%>z7j^bZD92IyEz zTg3o^l-y^1c^Ren*jMjbm9ZPNY^#zPSw+E)oo!GAq+{P8qo`9l;agWlqb-@37^P|v z=DIGRo3NI3hO{D!3$uh*j}_Jk|CX!PH_k-DpnIK2Zq@-zC$+B~^bPY7uyoeVI+ZAa zn+99g8#XQLyHH6dr&S$FId&^i=I|qnMI%2FFfo!UU`Vt~&oNh{4k3_pEcuoFIVBMM z-A?oD@{H*L9{Sjd$j}o#(#QBoHa0%*ep160swqZ_bZVDUN!U+FT+SO32{t}`N8F*fDA)N#WCA@fpWrgpUZ+_!`sgtWQY z5M`|ou!a5isfmW>#S6p_39Q{9lRzLX?pHm@+!p1w>r$4pl}M1$S}RRK&)e$3bK;MO zUlW9ygM0^6+Q^I6IJ=Q#hWe$=jfE9C&z=o@xdAeqs3J`;pF)rD*l-`Ck8*zfpE$z4 z{>5o68$KW3(zVd4THqBQUbR`#V?>1Pn4ZwAoIMIe;s{X+JJh(~np=qKCg2Di;O~9i zw=PoH+mjX7pn^q6ptYO;s~SYKecK?s;2H2(cH=tRADcP+w>9S`nNR^>@JmP_?lRzL zg0&i;qM`y{vvl043*p8HYn}5yooz=;RI}L|m)M`*dEYn4$c;#dCnKJixx#+ZlBL2Q zKa2j!DrT-KoLf03Pf|knX<;YKfjhHfy%RWHT9Jvx53)0eq6U0r3QW^Lts>f|*551I zhl28sxB0nt1p2Gk@yQic{(;{z!8kghDW=2TU*nW3hXbp*UH4-hC4{^Rt$@>WTXvTG zNmHLOnhO(TdV!<_1!oNNZ3S2){Q;O*z()ZX+Nua?UuXPA2;-T6=UDbkM&Z4r<@pDv z#VqaZ#xhgNzTvnvvv32F-h_&`A@A|m4a*$6-a}B0 zd?%WD3RKPZNIR~bE-Td``-UQr25r4!Tvg-%eZ^*RNNiA|fkkd%|*EueU zK_oQ?G=lbVbqr%<4O4vv(@Ch{kFCwGmOQm-pM&{rwjQ)<7)a&UYjDL{@lSBKv*CJT&BRx^qJ+81PsKg-Wa%6zHp zQlw}mivW~EMb)+WG2ih?d3!ZnEy9MY-kkh=~F}QPcjve`vs&;Iue5M+RiJ zde<}KKvyH<-0}hO7_mjQ%0!Ps3g=EG+fDuFrNVMu2gig?#!8SCJ3gCgqHGZ5wJ5Px z@0SDQfzcxK&SRW#5nG|76yq~6rH<_gmuT$h-9j|w$Vbsjp7uWd*U@uZ0PbvO$Ju0Q zXsBe~77-zzC*~ukF&UrUTb!X3%N(OWd71)f#UORXbK_1B-&zEc0dg4g=6yuQ{rB^* zT~_Zab~|AM|`H<;b%f$!py+EG2g~E#ZNtcJ9RE+YqDL@>4p52{9;NZ!bv=Ru~<6ca(y(Y>Zt2 ztzY^(S(pmz?%}Ap$xzqT&CvD&RBGXa^-^=;8=ROdj;7SKBpq;ZXpN)J=yYDey<`ia z@Ws=f+>7T1&lDc41|8U~B`xF*r_lkd`=31^j$SB_yRxwn;Nt^D6rI5|0I+G*at zB?bPkxGjCdqb}C%u&S733LH9uGyXDWB#5LoFlP-fL_n9mm)UZ%69Fjt#)TsM$S`6S zx<6L-ozzkF70Bddv^7cQ_U%4!`*wgVk7xM;pCpG|s2m1J$DGW}(OpVL0c6-hJq5yrKvU(0`xRgv)suo z`S!jTI(-X^@4tRAK*IFJqJXQUL92Aqte$hYv<27ZA0lMMb;r|TPpDqF=z~nG127^0 z_}MLdv29`VuMiXnxZ{Y0Ln#nY<7+oLi76??F2*M&hJc$ALc5OVqa&waeSa*? zg`CnChR+w@xgw%gOlWwK3J_t+vh08CiMUp7j&h z(4l|-){dWRySuFSiYSO`e1d2TxnYP-Vn89U;Fk@$TiFFeKFNh|j}4P#L|FTerK?W< z0eU0qXM1oZOyIW$Ocn@5^h?dI{(xZse4V<6M(4x?0k!8j9w5PrQgwreg?1}y1Ku

    Hc)OFsb&?FWSma#vs5dw&3GB$=rxSc{+x)J~-sR?&>JE_`U87D%T7t^kk+ z>0N5N)ClG~x^;A?RQ~HF3>n0UJ7ce!iKLJ>`YdbH5)sKkpa%7*-Q|9uM7nD|;=UqoPo zaAj8mCsk1rB}aB}UQsbj#EzEAH$#GpiScRkUfi6nV?%;-jL>1>=1WTLIC@1_ZlFs7 zV3Gc}+`u7>MuV_AEUXKlJqJW{a+lC#;x#0BDZSjhoVW&d7tAf~bZjVHlV0fH( z#j#zLp`x89_3AkfIrSrcI4DK|4AFa(LGci2K?py8qoU0XfLp*D146{f(THktCdN7r z(4_G(t@C&l3I~A(VL^dwa5s-a(;da-oHR^x`r~S6XbXwpt!K6QVyRBQxj7I@fX%eG zu1O+>IVKC#d-u1Wi5<%GLJz=&aTVW|7BP#;yzBXRhX|ob7%2CAm}V-KU&lRXd8X~b zwsuw$MLRj}vs_74-(1V~pZJej$cYXwlk<13kie3X9|B2VXbVkHpf0SJDxxzX`7KC- zJrbyP0vKB0A6NzL2PDhA8vnD{G6WMW{t#O+I0H^jWo@jQt2b{OKAxVOQ~hDh5NfRY zcxq|BM8Dm6_kHi$O&S$5zylb%eb<*S0s>>=|92tie|@1u@cQ> zrn3z%1@m3nvl1kd{@IP&;g-LKD3l4mGnZpBLgL&Z+Y?{bqIO!`Us+p+XErJ37se0; zqM6gdTp-L655yfA1qBd(@PG;%2L5Gu3hXSCzdd`$SyOm(QsSO%H8vT_H93uLoS6Sq zD0`%M?R&z(w z%N_Xpz$an$c0wx{`A9%3)mN%m5bgj|*xA-~oKsOz!RNG30vr)R3c@#tKwM*q<6&dQ zaW_5^+enkiJ4ixHLKUJ88$HX~x$#oKd~&KEf1KP=woEEV0&n&ITjPo$%?M2l=D;oZ z&f#=1L*}t}`trq#_TF9;;8>BJ2eW8AmuV=icQKJSdlzk=ufx3?rdHebEaz+MJ6P;$C z=B^=2XA6twi9nAO-?{n3bC5ZLl2vA{Yr{ve@%?PIZYFBcd$W$&CSwIVJt+JA;D9FEtb_1? z$EcwOPF|zbQmEv3ac(0&H^c{sGj#0i(b~?Aj@^K)9xc)2?c20l0Np%bJ0TW~epM~| zzg~bJt4JI55YcDrspQduTL!$X8T4V~T!m3;Hh>Dd51 z58*egxS%jiKNo3gjx!Pb|0`*!tVIE^FIaSuHu zb)m&QL3qmy;h%%TtaQ)&sBVz3xXhxv(qFl_!@s)*O%PAoQ zcb_=CKrKC6`^m|4v5K2Qh%(FYmr~x5Hf49)9`OBwE|(YjFBLW|#DhnA35kj2Y;DEl zq>!CN+yaE6s8-*}qN5ve-c#bkE0Cw0`a?c{7V!(O{>fjaYiM&L_B@CULsX{~Q$+5_ z2Q)XLa6iESw2bGc6q?NX^w*keLMA5XRaM2+L$3dCpI9XF`1cmGzW2lW30!NO(RgYn z^h{pbW@t^Kaj@9W!%zb%~)4 ziVvIS$wW|hrwt9+ZV!<|+T;3Uv_iuJLL;&19rr{2r3pZ%I-Nbxx|SP-bMnU)PkuNyH!5DF^xM*ZgOc7JACoj>>@(&TH(K?(cLXVnxn7N56f2QUwebAZNqCi0Vv+ zIv4A#D?l*t4i0)=mkIe}z~R+mkJ7f(fMCMKC3mzy8Y|!w@U9}p7r3d8FAp>!?Ez>6 zKpxIwN+`7W^?lH#8&!l=m^JZwugiRDwyy_u{ckulQN=L&SP+g4L3eFw%ss@L33lUT$unb-ElC%t!Z=0C6P(L_QcyL9I#Vs0WG9DUvL3 zru%z^*Rft+WIJtW==FUkQngkamBi%%6zb9)QJa!N?k)%F4$vt$Fw}O8+!(FWn;qJ$ zv+N$>*X(CEv6Z{^vngs|y)!!vNzlY?ZQWZWC`NuP_Ap=@Z8N`^6`0JOZa`nQ<*}0D zYWc64nvJ!0>QAQ_K?ln?ZKI!fAfsDnCm?LppRESh^O|4_gO-3!@IRgyWT#gR@LX=< ze3<*${Jy_C@d$x-I97j}_;3<21Qvs^q)PmJ#E~^L)OS{Wk8jRwzup39ISP0GWLzBg zXOoW@&(~+i6w>Z~)Y6;(9r${>LJ9CxEEPHaKZ306rUThhsP=HkKzkNaaP(#Vuh}py z`redY>*JAA@8gsaYgx0WhgIExbeuprCZ##nI2qc6ehX*#evbb~xfTBe!124PU;nG! z0>xcA?PuM|Fl84px!JFhP_(}|RN-~siB_NX7hScKHy_(ia0DuIo)=r9ulX_fF^Ap7 zZzLyAD-H}!@_;r=v$>M$>gHrKjk@a6t$5AD{A@pR)Nh%7m28zE`*)aaB2x6opY%yc z+P4qBCve%<9=Y-b+qaseZ%*5;@0e+xjYS_V-4?vcXI;E2dLiuC&-R0TYXYK3MO0}} zD=-nv_ep2yJs<8%R}9WTeRVI%hir_zL%J7} zlK$bn@BX}RKb8l9^$R<%GuQL*^K$z-Xjgy0|Do)yqpFU&u2B>Oky23U?(QxHq`SL2 zr8^8jx;qZtA>AP@-Q6kOUEe;>Gv4vNcij8W9Ycp>7{~M5zrEL5d#*X>8qZQR{BGDM zala$coL!gQ-*4C-OAQjGsLuu=9-j0_I{(_%^yFOCF69eHRRl+Rnix#@+0!Q^{7L-q?~7U5(`lN$K_?hwCKLuG zcG3vNsB~D(e!8+PllbYQ$cIQvy&Y*tTgN+S$s?YfE5&tN$(59c=T+(iL;g2Qh_S3vZLZeU6B`uY0h^u+R^pqOz$6^o;C%&aHqq0 z73P2}5`XxSBFkS7$De=v^1aq^X+8NqjtJA9TP3zx-sEwaANOUVjI-_54OvUBXKcCW zm&~!ploe-&frJ5Y55%U5Cf@YYT1@x8RSou=@M_n3GdT=uNF~=nwU~n zXZ5|by>OfsggRNKIeXMs5~oF{A~3S{{x3V3gemGEjBEsf!+0<8?XiGn`SwuC%<4i}DMF#dVm-MF;)w*>m z%9>qIqmPNW$>&VR#JoRT1=taPNkqIb=6w1fb5-={uAo+|tKOZ&YnHgK!+!e_F7x#5 zPEiK3{bB(`{N+#4!}jnn@!ZOu3Dy%9%#~Fv+^xs1FpHiyqYJLp;Q!Foz^1#~<$PBhQ6lP-H zn>m|27oC{YSGKC-#kJQ-bG|HI|7Vu4r+&LB$tch$5Ul0Bl zuCQ*A*DzHdO)tLw`;+>@@t^HV%e=bmiolS^^W{%U|LoktFPIAqgScD~1s7ED1nM-9 z;|XTS`r&Hn+kwO~BlY`rO_*BU`Tlk9kgbWuCvLjT*z(_9gVrmrjqloHpJT&J~IeNI8X9cS2z6rrWH2 zKUKC}Q|rUZzvs@L!GN4WvR1we@^7xNQSlPH$K#NZ^yh<$sl9cAu8L*7k7Am#IHGr= z7r&4H96VL+?oKMz_~(#J#Yx;YXv(G{pg0mxDGk@~Z(CM|^|uxK^J3C8x1H^NKqsK! zyQ(iNdq|K|9}do@WVdX<^IW7B~nqy}^;mTf4 zjT7)@+C$CiF*GFNP<7sSbc%hXA|_JeN73*a#C30JU^Uxo4HpZmHi{uI+!&AfmQBIx z@PMp|g*9bfkuYSA`;)^wc8Q7|S`*TYjODj?> zwYR${M zoOS+svBbogX$WQT^!y|{l*N{8F+;9NfTqd4=+GySGLZEt@YLMGvZBil(GJBuBojZ- zf%TLkW!N@)<-I^yX#+jjlK^B*7`>6NX0Ms^@?rHM@R2^|$9L6oeK@|Uy6?BWaK1cs zI8jt@t+mJ9#Wpao{wyL1#}LnOP~ZGxGF2JA5vA+XjNdFm#f8(J#EMJAai$bW9FzGJ zQ80P87uT8aGQk}OID}usqyp_Cdbb%JwlrV-SH+FYQpB$mE+ zzUaXbE%l0eDV-nE&8`@G*9jZDBF1XwYWq*`B9cIMKbrd`V!m1XhWSLK-Mo(}XD z+!m>g-oXZG0n~%#`K5v2s57G(!f24Pt4VdkUtqgqH{bTAyq5~TJ)BzE)Z5^xcE~8! zQG@ql^^?2ymbBYhKI3?0k8SVebK=Ox#&+YpUG7#L$L>PdMRZra-OMbV?9`(+>9JQlM%+wrD1#+Emp1R*82D{ zE32n4)vccIm{|2Ru3DE^-|4YN(s35*6@uq@j5SKEF?W%$ zfy}%o|5qojiKx9Q?QGYt+^-e zj`hoI)p>DnY$V=8$xnVNmqPx|OIj%$t(N@#^&X5EO2YWM*o6=3h&AutVt-Qo{LzOX zSgttlDz(3GA^)UpL(Wpxvb5=e57QkL2CZqYsf@m@T{pay?z!ZlCSUjxcC$v9#DqiFeRBG;SHz32po(LQ^<%^}dK=_(uRYnx)oo zKc3^|Ws?_sQD+~`k@XsjLCo7-s zIS$>+_8p}!(`nj%O~w1$U#^hF`Kss;Sar|T1T~SE_;Lm%1xafQMuEHm;(SlvFsX$R ziPp^J&waZ2mS5-+f0d@QQUmB9d*K!`GDE$x6XTIf%~AxHE~;f-j}g3Ln%I8@80o0V z_&IfUjl?wMcm>l%{?~!s+jqTXn+i+GD5m%1Qoq%TAJoA~XiqaZ4(BQUf_K2hEjL(-NN=8en(MntRV9(#nn~<4h(Q7NTP%xNz-j`*&K> zJZPKChkUH8EY5cwA!m1fGjp!aguXhDAt@4^8t2zIJ_6UQD{VLY&||8S+OK$ZoqKS6 zDoFVxY$;1K;_8{s*yEkaL{G{nTM>HmTt&QQ@V%K?Uq(Gy6BNNz<#L)D z;55`g1ZCVKaH3g2ivcQt%_6%%oD#||HRJ~mH3v+M3Z<3trk(Fr!=J@Y;_ zx9xi~Jg($w>aC7DP82`$$z3(n6xK+tmxW}^62ZXNvpv-1%4B-c&_-<7_u7b-9Rw)o ziRsa2{}niVC_uC)U<*x-chm{zR(WPnDJ+}8Rnb*T4i;T<9WzQ3C{2d^Gj~3gh>=&_ z)w4HXE*2|`e_rJB$nNKJzRT|?$Vg{y`tHj7$MI!ZeA(0!vIDLN<-V+6$-KNxtShrC z|C&e51d`O7q(%#xXOx@rhpIC&QZ|O_dEn{Src{j8A9vjo83$1@(Y!6_Ey^17d4?X; z6<*LNmcqs4kY4f2OeY4}LUIbhN84Q|tm#cgv)UzJE5uo^W}zrYB36!E zE+qTm9F!%vLrP=G=sTY~QxR(D%}l}@=54bZ8T`(J&p=rxZ-{1<2OiO+oOW+kO~oQv z;u9|fC z8n?m`Dd%9V5B<0w(qHo`n9M&F->Wp1_Los=+g)raX}IHo`$9vChnj)rXNhlKbl*AQ zTQj2%UoE3_-5Qzol>45oAga9mf3D#}08bm2-qYOZaX{tXEX|hd1@)dsi^5f7R=BrH zT%HDgK~e+IL67iX<0%#@FJ6& zYkjS9Ag!ZHDEUq&t(B;n#0d_>1Deifi5G2Y&taKq0fuI_VjZ1u?msG0JMc&pjg4@* zsvSPbX`wj^J5E1Z;XC@IbcX7go}3m$?5>UeIOwoO)e-ChH@0Th3;f$|wD#6q{*Yce z)6>@O!5e3IJ5-+-aBcl18?impu9vjOA6J@COVg#UtSNHvW0t0(n$4Q}+0sK~=be}L zg%#=wmvj@yA=WC(r)7-ZSzDtyjLJX+ceG#PLGAOCI7Z$^7S~0wO?d$nhYQu^_Mu4djH{D}N_c33!&yrqSjXJym6a^Dddsr%p(Vj0 zV1eFIzpG}k{z99ry7_)PGBu8_d^;*C0eS}j_mZirC7rS}hn6%?R=a&ZUECARA8`?J zg&*K~;6-x9qLS&0ZBLk?q`^FbOQ`_8AoT6tE zw1VC^>p~2&W?ZjobZlJLbJ&yMt;}9bza(r}e*DG{ZH=0M{v{KdY>J&CE;LIQf`69# zG|s58#WK*+UC9)8S$6pW{RWA$LyoE483r?(Av!v(1LV7Ox5Y% zYd%=0lVe{fgLam!7wZ+CmVswfJiQ5aO+*Bm9#G6}e6)E>o25q8%s9-rUBv+TyCSD9 z@Zy-d$TN7|Xgm9&ukXc+7Z=CRBYnSsXw+$c`tTI#=6;4B5sNEw;ne*y8ZLDI{9+jy z+=!W0al1Y82Po;xg0Ev~&Sjt7J>trpUif(JifupXdJC^To?p{mAmM{o403O37?+fX zEe}14*1F+tM@efH)~4zsVGH!$^Wzx}3RM*6hUEXCJVx=2SWVQAf2;}RhTZN%@Gj)D z_G)Nob<|*UhOSlQ7~gv6Bvw^Ki{8%Ak+Nq8_1|pu;Nj7)>m!QV8yyC#i>7F+J^5wV0dFt*e0r*%paFOm5tUIf`^#CFW=GLdTunRc^H$-q1hG>REj_zZj*YxvH2=)O-{X9!yVSZZiI$y!9`|4=_=R!xA*k@0r z2_xAg8{jYtJ&L?PT%wa>f^!Q?0yD9_&G=61lcwyZjYg^@_$kKD2hvsMe-7?(hIAW! z99Wsz_E1VFI;B@Zo~pR62u!ZnP|T} z>&M;85}wxJ>wvc2htKCz__En5r`tO%YsZDWc$q=Lo^N~m*hzPdCxX(-k42QSEv8<7 z-1#Ptx$dFlZ#HpTJpdXF3AQq(XL~aFS zB_KxzF4_jBrU4KLA<%Uhg0ppI)7YTG|Czz2rK@+CQ0*S0n)F}L!k}kjZ-rfWh3O=Y z!2TIF#N{S-%R8aUr^6$>giC0BNF?sa$RrRIA26O`KGJLI+u4nD_#^%O`&S_`|2{%+ z{eHjPy3IYtP-5!n58RdwcboqTzWCn{8!LO{`~NW zBCwiB#P;64r7+EOg{fYI#9*XU%lb9yHt5FHoP!t;)!_JC2mzw5UZ4YP08nz(UKtA& z)i0o&iH1DOAzcCS9s1k1pN^O12yeb%W7}g}r&dNCyzgFXsX8``@fJ+EDL&ma+h(=@ zGR0F>^cBbofz>vhofAGG;RvAO0fPc$;N_g{CB4M53bfs3Mn)D!=6%KK>4UptuwtxL z9zpvWRkshO(kRl{%NATccRk>;)D6xYbzE%ap1;c3JEB)#G+t?tnNsxM*U65^Q1Wr( zfs-|e+*Lt6IUE@-Jc<8ZvCExkGN68WQoBm#r6DWpoYU5uXA~52arfMO z)Ymot!v!d9jERZSsF$x`4i5+b%}x_MUKeDYr8{o*yX#}d=R9IIw%7yfIhjg-|5s@| z&e0 zH$Dy{J~Uu-+u-Ph|F)e96Lb0G%rG_tDS7JR6&>G_Vq5M(TP*|tp%vU;S-HP(Lz5Z+ zN=m%#OEnQJEe`;&TRN)#RcsU$;7$b!MxQ^MGe8$67A%Zxl_aoBGQk7=c$Ckd@xntz zG8FZK?5}Zvg0f&!v5v%RA2e(AKAsQ&^S%5`9gI=pPV+8@XgUHi- zZ*O3G`zIKv@)0m8R9ahr)DMGzfWa3kzO1#L`>sr50+gC~0$w*k1Fm@UQQ^Y8FI7Ad zJfb}@pLP@62iKV|+#4b~F8)c4<$TGVa^kdu99(34D zFepS`PhP{_J(ah6DlYzkF-pomt4l(K-@U^N{?-0xFqE6$IIvPpnbMwOP_zs^cFH_lTygWO*6BrIN`&`)cfnV*N zoJ17SoY!iqpRw0isQH4%*A=UspScfGJ-Gk285E!ay15}(2^eH7CONvgyW!ZGsp)F2-~1-<%4z z-Oxc}67IA4n`9aE-&~Wr{%uD`$7VUOD*!yC$hNwws%&7^e`ZIj{CBuBd?DW!_H8q3BKUQ}UR-Sc z(k3t@0ttQ_UQR=JN!eDN-*%D99UbQFJ3>aem;KoP{xP*!spYvIN_we&)GE{2sI!{+ z<#pnR9`qA9ldK!r>5(JWzeDefYcI+ce)+G4X|;PUq$rJoPX|EjpoZeAap~w86kS?- z{hjEwP|S>Vv|sRDt<3<~fmjEd7n2@~NgrCdf7jHMva~diz1aQG*j`;%SI)AuyxgiA z?H5HDPIl+O_NCzq%x2yWdNt{<4E)dLmKN)4JAV?pjrQoVe^*s0x#``yrY5Bzd3Z$V zw3Zf9EAhDI{jQFE)@~NpwLdl52}5q`coO7L<{g@y)Fyl3{FP!IIm89<1uGz|E!R%Y zfuwv60DuEP5Wq<=b!6XsCt_nBqCos-YSNwi6Ani9ijsawN7tji;)J;K>RQvX1k8!W zCFYWR-Rz%xCYvTO`tuzZ)Q)dZ$d5kb0kCz|;+Ps8=JVU16a{l+FJSm>Y<4ZI2KJ&z z=e#ayaDV*RBK@;0EwlAwqxbgTaU1sb!Qfe@@Gd+MNjm^@2N=K=6t%FRo}aHYL_|Tc z;gIl4NlEdNuLL(vK(5;i`V5R_fVE=zH5OY9Tg8!in6sGG-SELcop38TsjQ1*0(z7p zqeMG!=t<&puY7m}N$!1KQ>_h>f`XUZI$WDhQ_rL1(%;(AF$2k+;pVkNnGwsP5EZty z+`7b*aV^PSkE>Zo4q5Ntl?beBmQm5&OLoe?8h>HbQv@Dy`7;e3u+Jz#HjzF<*I|Qh znlD4yWm4p(cX!PbO`LTf=~gF0v71L5Sa~Aux)Q{5p~2XXYi?+|{TuAoKyF@MC74SQ z916F?5Eh3G#a(0m(QMW(`8BGegkX*@=oNxQ1}?@SvZYPi_JoSEcK*E*L!`l)bhmq8Gf~<@>aInJ1ma_0%yZ zV}`hdN#naxCdV7lOpcqx0&?gMCq!&S9F5nNSGq)+ik^m?f+`@j8t;}Rd^y~Cv2)MD z!h+eL1McGTlA4ZAIgtZc{P=Ug@@Q&?Iy!EkFfzh(PwCa=3LW}W1{#@I`Zr`YGz!1- zYb$&F0Z*f%jk z>K+PjB8i2mXlXZqn9DLqBktnjVz$|x74Q=CZxqlt3kxfWXSJ%$KbPyaoLpZc6mjGY z4fK)TDP9=Oq!FaadRzzw{jBh}k8=-p2zd{WTHNOu%;|FEG9_DF3`ns*bEOhgC1CjY z_}rc!uZgK%`}v~bbPW&?7!v&!rCKw13F;z4m_$(_lDHE{%=2d{r4aWY+n|(&rVELo zN}kaeb4zoko~aLdVq&*uP$yuZf(9aq%<}RGFm=PO^_Bu?`U?^WtR}l>W)grzoz-%Z z3e<*7Y;49rl%6W!jbmnJcIy=o5J0oAJv-9N;xHzz?X6>RIE%wi$`6hiv!%&TDPPRI z2eUUDZ8+tXhbr4UJH5*-p1Wh&2*6}kT}zAA7i95N?(E+X!i#-MbU#s=ld_Wi`E*(S zDZC(=T1xdsJ(fU0oO!mDOwoqJfg@BVJ zm)FhLxRDj_Yn@vwV9M!lp(E;S;6CY)TdTJGcGk75TybC~9$aZnOoFH4fFDB-ph>I{ zEtH3tSh*JS{uGr+hvNz+`?N%+h`9ealbxCQXCGEq&6NupQ}KV1tzuVN%`kw7g2nH_ z#=%jkphk|4xIbOG0m|{STaU}V+_JZ?K7V#G-~cyueb8DH(?W9&JRe-}u%LB4S}~}; zHy@)f0H1|H8SQ7*m&WU=-t5LqWJRiPVDMQ}Gg+w93}{t!J$A{R{bx_SyiEk1H>al~ zQC$E}oV*XO$vqUn?maHJw4ymGRj~)}RSC3$Dq5K#x88aGIex<@{{~k`>OQM2+kUN<3#y(=TUiMGBHWh^a=Z#rEbK33PYN z3jKGJJ5RF3z}VO2z6UNWqK)DAd0Bvk-shBjhntJ21 z4cF4obNsvd*+UIrj)Ad+UGt@P2^>X);<5z|ND7!-Uk_nGgP?iw-UMV(kmCzJO-R3l z%LQ!q-=;&!nv9(7UZ40yNMFlcO*B9v<0X;~*l%}PkuE7%1!JyVS_1*7GtkQ@rX{7# z0U}K@tioT_w?9QG!B*E|wCSFoOvdzVEjap`t^vX<-C{%Jy~ee>**{*x5_phQOho`r zPQ=E8J7S#!`fJVK&PS)FRb077N_5m*)_i*jGbm8qO3R zto>cmrPb(Rp%5sR0Rt_e4GlPUY1P@v=^X9Fy=>wh<9DElt?kO@`22R#R<4hr7QrUpJLRgG_do}F ze87c|#dpC=_9vu0yA(l7ckX*@cxz)PwD{eN5`PKzS-u$1YXD0nI6NLzPwqj}330wX z$3#(J{`?&{h^v;n{fw+Wf5b<`mkgk5etD22{qjso^4CbeqAQjVsRJ*+&JrIaDD0puSPxL=3CsIU-179#C0C(_m+Ab1NQU(I$)wDZS(bo8W{sO21t8MG0#85HU6%oT9;aVG z^5+Qbd4ZKvBAW#|5Px;f&er!g_s7#tmRQ^0nLQl|K8ed|X)T{znF{rW|FaAd7{l$z zzZW2<;12*04|CZ)7kC%af9dZyg3hvtfk=umSsKv!(OoYn&T#k~GXe{TN=jvdY{#xJy9>1ok2 zvlUFBY8i7i)q9A)p_U%`HK4x{8)lquOv~UZm~wDG*QFOmDaZ;5qNSjzn3)1DEruW! z0SCnaL0-2LA}9iRw4`OS;GPQ7Y?a%oVU8j-%<1VV)S(BAW%_!w$c>DQym?NeRVII4 zncI=Z&KV#$NP3oPY|?%PcB})f(DrEIaP$!jnyR z@JikwLOuS0c2CWXrv_e0q!S*ZA-!L#i$Qr zo1BHon#oYwXgOx{KfWwhQ;wpx(^zpbVBDfa{9<%`Tu4eP1Q>upEx*oeRKYcyB}dUB zjzA1pt*AFRAdNZw8oD%rKZn(S!4Cy&m2mevg9o6(Q9b|=NnRj!Em46!mVLXmXtM*SAx2#WgsAf z2vtl}wZVSh#H@GFb}4Z_7s>RlGM(||%a^l2r|6Yl-g*}tA#nE^xCa7Kv^&szY)w2r z9{aL-URgUi885N-!1ca$p_6Vs_=P6A$~%Jz{$lWX$lUF+?Cpip3Zw&+J(}~CmK1;) z8pFtGdWv<|yeLLI{a=)zu*jUt=Yb2%4LiGrx*maT4Q8bQy+;pFP^#3H_C|@5SuZul z0W}$bs{8;BH#b+AatX|fDvbZ41NO+Ca#@DT7>X0mGT_?&ho2pO*~7=|kF#jDS=C z#W`;Gfs@?HX)oabL>YjJ)O?x17_t$}C~NuIzFG&KPOb!o2-P?l zs1G?3F;LGa;HUjx4B|1Lwhw4PNk~Zi8sliG^lBgR@otW1D;9m9y?r1|--w5Y%?0Ld zx9sANeg$+%a$~xOL#a4OX&4$9Keex*h%sQ(3J~5mh{J#& zoo+C+o#IEHFQ=qT(=<0RGi{ohg3H?EY^2`ga)#Tmr`_tM@x((*8zK=yK`qT#d|@L5 zB>LWWed%<)dLaqEx`|4C)9zZ3dTUAJH&^MEDFnP|yta^N_EwZ-?7>5&x?Qdu(!;yj z&hFk8c+@z>kuhu&0!5b*AKx8aX zY7kl)nEoUd2t|DWhOu5%IqPtU1MYmHn?Df1X*;NQ#~}3dq(L)tCMAoc{YF`&ldp>e ztDD*auv?p>@I}53-i4LVVBj0X^nuLdr6m#Q0C@erhXqs#P*HuqeAbjh3nch&%8;)z zje%31th3R|bJ^|Cr_86MfPpD2EIgY5feH+$6g05y0~3YXhNYg(VrNS>=_;cki-+b0 zE|~ztK@&sw=1$I9B!O|5a73JcCo&pN1S;**lXHE5pV3IckJIus)Yg^XT}%O3WH|DAW4RP zYbAv#wajz#F@HLZT$$#rIt2E`&yVVM+7{_u{CeZS3Aed|!b zHpQ7*t-yVb0ZI32wsPoy0VKIyqat!>lw(%%VUIXBw0d}VFNJl4eUeWxT2egt| z+qfXz_aCdkwUtMchmN2sG0EGkXwxnT`tA9kI3Sp@s4XjPEG++)x1$3zx{3J(AvFmM z6<6crjnx*Np|(pm2~E7yA3Po{mKxcEf+~5opca~7fE@dBUSkLf*WbrMfXcG%mQ6B$V?~)&12Cn#0+t%4(A&NVnId)X(UQ@?RPjNZqnK_>Nosx#yJJgp z;`UK^W*OF0Erk!_gFhphcTi>-vEax}Qo3xB)eedBvE_q`z{9yPi4sYLoyCZ2Ok3x~ zAEp1+LSfQX5-(vq=I6&JrsJnb#h{2P2Ry=n*!PyCFsXvR>0q2E7~rXJcsDUV{(f(Kp>ZMFix%5&mbN1HeSAiCxzb^!JGMJkEnA68 za$Y>eG=3=nUSw91yl-9l>WsTgU?S0@vZBe_hlaucO!H})6g1=G`Iv$Fbm!sr+cNC5}(FvS}`v$GOO>;pWCo*X#6)Ax$VXQIt4vcrgSsLft%Q1Z2)n z&Li7~C5H{~7Z%(TPvoDHz`kGec!?mu+kS1-s-}KbKJrX*ppF%-*j+@I`z2RgDz`wh zn{xU84fs$~E8KF>E;KmiH#bcI^F-BhU3!SAkrAof%RNPCb}MUek{|}r9X+c@YY`_K4^$R5q8H4@qQYb?^vko-~E+ZWuiMMA} z<;N}g2_~KvcjftIniv16RTK;qr;V5@X+~FwwVaYXEwsM(IkdlYCSMONu^KqRSo;Zi-3!DF z{6_pByirp}E@`XTuBNz=MxCdOWSiv#rZwSHs8Ym!j6=tGFD$DW?j;~*Cl(jm2{r9> za*Czo0@_Yvpc4T#fWK(xB|ytUfU{yodAXcHrlHX?=s5N5)6V2-XKtG;fNI%)%c;5= zYiGL$S63I=q3Cn5L1u7Ythny|A^SSZI@YuWR&jpGM_7faY*6{B;%WT(vyU+L=?7?j zp8WZRCXxijBjlzIV*DK9MMb?>^kE3Ek4M(}#6xK(cb98zaDmBV`^t*mlLk<~U}Iyy z*)J$lSOVggEnmBbh=LG>vyn5_^S>j5YKd|`_HcpF;v+S(txDAOd%J_h!=f}*Ee{V5 zsMj~BWt1KY0#nY?qricKB1W6{dU|09g14I(Kr*UH{^I21WEBiMR=X)F+j=9%sKv<0 zczgeU5g{I~cRt_Io*yCyAEckA?)B&{wP@}#%PIZI{jGVLg2K!=6y+8DLUNJx!k#6a z9;v~rot$Njfs37(9MvDpwxrwwQ+>JJ&&YsbyD2~u;1Cc7AmLi->Z659l+cb(EVWWm zNjacynLgWbaE33gf`Wx?S)7bfc)C0H|EGlIWA+jqUH~YmG2TDWQ8Cb)c1L}% zZutGmM#d(dzb!Q3t~uxEcXBS^fi`$rpZ66Dcpazp`2*&5zh~egr-vTLAlk;k#aR#N%`Oty_0ZhN4n? z#!||puTiSZ<#VMY?tRwmyb6XmYc2F>)ZGt1@cYk<=ko0u>I`yy*=YZ#5r9RQ{N z#enhCZ4nVX>X?A4wW1%T`sn*j0NNBUrygF>dOCsm-f|24&t8rPxS$t^@`-Rqz>DwB z2(VHV9F4&?7E+@4{{p0NzI^#|<_;{}-FL|q;)LCr!9fsMK4&%~9X8CcYA?c61(db# zjh&V*hT}#zYZqt-C`%#L(vp}d49$Y;-thIP@~-C4k7p$UAFm87UgQ2WR##U;$H4;M z;XTB?C@6U3@&h)uxlqxOyRZ`+vD<@oGrmF3UrlMe#T2C--HOW33b~Q>Z>J%;BfGr$ z)U>qOG0v0%1dq&*^C2#@;N!pVu?=y&C_>iwoBp-meAduYk&%nt`EZ`y=XMJdxZz5O zixUC&XMB8ouw*B|+xqF@_6`5`Yj!n=nF7D_v@$K41L1GuXLPV1z5@sW%5VZyE@GVQ zB6)e~x3~|S&_)mdmbkRI&U@N9vG$oi+R&diivkEho_ZuN2@cc`M3Q9WC4w#Kkl{xW zkVKZlmrGKs(eG8S_E1YTsOYGT?f&ULxt{uhCibgOuJ=cDc(w9;x0p~2BgPzy?zPZm zS+}0i=~MTjbaPN^xWF;0X9A$FjE#*exSGr8${L{Zes}r3_3#m$730N;(}{7}v35W` zN?~0E5BLnY%+&t?Ay7sVZA6)|*@-LwKt!Dg{!os11H(E?_%hG@p^y9?5c;5aq^i$R(M9_)YkfNxgMDj$}xBh*>-Qd_m&6ntB9NqzBuQ?!> zIb_*Ass=z_I~yyANSv~ZFSt`e0N>#NdHHX8 zBtPGv@9Vyz2Php|v?(IbUlxg7j0(gkz5x;R(NF7yJ&wG$9GyHUO0HBx(f$>$V6Ll< zin*ingh}GQp4@#_g{aE_(Ftf&Gz+XcZ=Z7wx-cl!B> z#=*r3ezox6m;yx)ez=Y50{dtd$d zI0~dHV5xH6$G>*~MZqbXwN)^^0m#4vZ83cw(6Yo~kkh|rnw z+}zy2y|x0hLx9se6$67Q@VE5>V>B)+haURGqkW$7@f{uURy@mfYcop}EvWtKxl1WE zlQogQVz)=7h}EZm)w!rv{0z>Kr_j~Oc>^S9;FqwLR0;s1PQd~EYI&Fg7Af>$-3#2Y zw)%!h-*7(J3@xyLCT;rh6<=BjZy~oN_(Goxl02kdg4uNRzK^SaV5iIV(At3lbITp6YzuF{?M{6+&9h)WxaK9P;l5V6JAp!Qi#@YGF2KaRAmTDEU7oQAG zNuZQU{Lj3741=NoCIy&tAK;l=SS_nAt+69sR~KO%I+J*X&`mul^MmXKs58!H z(1S#__7gs0#++G8q?>0pYsZ5I-x58uimf<$tX=Fv-V)O~oSvY%RFWAsQMJCo=8XW0!(AP1Auh;@0<8{Kdk>QNA)K*8F zAm#71@f^aus3w3udee9(z$zhc168&X?|pyh5#-_56c}0@O=Z^UUENsk)UW$f&0$&E zBM#ltnNMuu=<=tcA~bPDPD|0>U!wcozLN3ww$^q3lDn_U4w?X}avEVlt%yJovT@x) z2$iC#-L-tLRjumlos`Ii-eO+5xF~UQ?RwX5!knn~dsj2zN#j9LO1rvH{z>V|ZXK9xOt0FRG}fl^}3^k$u9A&n9@J`(~-#wZ7Sq{?1<_f~| zP%tU&EOv7YCqmm_Am$t$pHy`HC6f*s9nWc}dU=m*VQ4PiK-ux89L=reufPY!s93Bgq*kMp z$>JjSxAnZru(Hs&cILaDe-(6h0J|R!Xp_sS&?3VGc$?3^_Bi1Sw_QDojK2or$9L$s zLgL!5i7SW~B^pS5$I&w2X&(VJ1(hKgtV!*Hv1`yi^ zQ#d04+X*_t1`i)UPV>04$}C8|`j={Fz}VBuv#LQC3N64-L4oZ6B$ATkxmf>jnC89N zF!(4(Ckpcm(&Z6ATL`M*vO1k%8sjwhv-(Qa#pPY*47wDuR*5iJ1bEt1t zOP&@j1qvt=x1BYxhqH=H?_+D&^*|y46$5qK8d?w%G5rq24zq@>=AZuD3q~~ zhYKjLChQ&bwjz{0$s_^u$;pWgn5CM4O8yN$9CUccU^>56q4To)F+U3|>~6gQEX7h& zF^zJK#E^u^{nnv%TXWj|-1Un&r9p5+nEGtqE~74I9r~ezlIMYQwGFC|0WVwBLsa@S zy<@;zPgTqJRw7AaQM&OjVCZXyw+@zWYMtfJfC%q4>(2DM^Ao%amN*bv$<)#)>40&ttT+6=CVH$*91rpr_zJ$5O()o=hJM z4t-d8ek9b;(0Bu(O@WIwHAO#Lbo@6rw+5(~MIF}f!8roO>X}&|B(>RDQQ%WlRQkKe z`D>%d1tI|ASFl-VPC+K=L5~qihF$Pq5g(Fx)jl;I_o56IP}X7O5af`ZP?Q^o04d&Z z!l)s^Mb3v6Hyuyb)F;o20GxfE1*e{cu@v3mmJ^4Qj=>Cj6c@D>f=vM;KJL`tIZU?X zDJYmjhp~ZF}egI z^DgsQ4k&CxwIu2`SG?jT#wR<#!5rpD+cjPalI2MIXS}qVBo+Rj>NK5A8vQr0oCjpS zH-1S;*wob2k}D4hO_$p##t5&*oO@9uifQXoTvH=KA_U$e>LCotMX?B zHNehi9EOL7#z*ZUo-KMAP2y_ec7@ zCu5%b{tx|V58L?cn8-o#v{qGNW%CDH<&J_a5}$?sH< z55RUg>w-Q7xW^>^ODQno#K8wrS?eL|Dg1!>5ApA#PnbSGVL;w7dZs0P5)%FHl~LJW zB3%NCorI->Iv21Zuy>}1XOkC#^Y5X1eN>$7Z<%SOun-K>>6xMZKrE$R+x$;<5r2Nr#+*{FsU$#K*%vhE`KE!i7S}L2F*>LDI(YCGU)92Mj#gqsp%jwD`Qb_+r z_60rKFeZ{p?x$$xH_b9p2Wyr`n9$z@W@zBMCCdzrYB-rQ*VaF?*JMmB2CF*Kg6|7{ zPk?c9PmWr}FxdsC`c$*cm!#GFz2koz`s8urWIs7O*IYj>oBMn7ZHg|i%8>z zz3+ez?EI|hg)_cB(Oie_K8x=%={%XKs}}(t`gm@Q#~a`BvZh|%(V)*p3J%@ekX?RY zQhs3SS4`K^Jw`9FE_#Hz1l>CM=`W0?e7P>>lfVrpZiC-A`oFRDt8ol|V>d%&IAT`Z zMN`Ji{*C=1>qC!BNkj@0f{l~*7x8b(E(n_;kx7ELX?E!dRRzOLp`R| z8uO!uP7o7Y4)$!YIHJO&MGHlbWycZuMno9>M40`==)Z`zL*CJb`>PWLBr*mlQ~7IC zx%z(mmHC#M=$&|T9TlP>+;Y_fAH&E_rgnokK_!A5zAQq?k}Awmls{iKt41Ro7{dkT zB~mo~HPfhCLQd&~_pHOGXhNK}rL{)I6pn^#i!ZZF^M~PQnKpA&G$Ypz4YDfZ2UBJ zf<%Q#{Fk`siGLRBuQ#rl-x9&iUU>DDeLugoEPG(=20FALxlA=mSLKK&?D9!qLaEIh zjttS6w+;<;3(}G3z_po+&@vpB35q>rd6E9yPMb71i=p5*r&M>4@CT85HRIF3l5yxW zZ?(qL@W*+F?zTpZ__DS>{dl9i;Y1gLgb+Aonp!k~h!963&v{j8q zFQ|>40Fc2|p+vcp?k_$S=^U3y+$krKbrkT5Oe>zDq6O@K@N4A&VIUM#;rh3Siug$i zu`O^=?JId*kaGaZ$CUM^z&IET#&X&Z^4fz8gV^IJm(|raW>b!=T2Kwto_d z0qNu{K2_4D`Zhc*oscB+&B0-dMwaOK<-2?1I@Y3lmm z+UOL8RqA#c>fb6JXWaPx?WKGgt2^UOD@#?{CsZ!S>bf-(Q+CN{u=bHQa)fQf>&G40O^L1M}$CqWdFHNu)gN?&HVBg_oyhlZGfLWNJV5 zi4_&e^FMd|%l%%JC;Bai?jwb=mZrOj7bgV=-+6}76L*H18yZ}?cFZq3gSQA1*OcXe z4yxHVEAjn!6XH|m$D(F@7kYrSqVJHw7mdxFDOcxPIF+IslgL{j1{6HzdO*_-fMqY!5qsA+j{{PJEmT}8rCu*(eamJzJ+IXo20+!x#Evn zl!CbJkM`A9PD4Q3YukIw<>iZNpHtS>6`TBoKP1aUWKK#sLS@eMiaQ`OAm|m^SM`{ z%gk@z>HHr`Rl*duZMff4H5qZ|=sVn}ormDy=z1;{i)MEm3kKk^azDKctM6LcAM*K4 zD^<{gFd@@MPzHKe0>1QR z%Xv#X4K_E*{5pI9~`PFhgy+(v3o}|em5%Z9{rT6Z|Vml~@{I9?tA*Ues zCMsh?Nw0{Ax2?b*n*{DF0Xp@r$(D3P+)a6Iu1P3IHsQ_5yy9D3lIgKh&>ZD>Svs&i zS{CTl#&tTPknM`-DfFBgpOIX$)s~a9`cFYz_nu{x8w&19!d(Tqp z0>lbadAi(>1#VOzSBnUka>y3p?a`1`mG^1U6Hx433K)gQ;d&$wO^2EJUc>W!o)qxb zl4HY@(o%;xB%2569d^g@FYzfB_9ua6mBjeoK`yePtle=X*Nh#2yWe5G!h6INK&)a*#B zqi@*%7`ul(hwXWSv)l|S?VP`T!&@6iVj(w8b#SnlMecQFsO=9D(yYS-deKC-pheNW zH6}M9+vsTZU($Q0>J5{Vfh(?Uo;~(v_Ih+W;=UDutvj=XK?~*P*YElG1#D)LSXqQB zUH8n2zE-7_hVIEC{f`PUYsjnYg|kRU-iQDEd9!ItP?4{%m(YU1%gzs|>^{T2c?_(0 zQk0HTwp&-gsM||Sj9eADx~T_WHPztJIXfB+Ih0`#uReKtxHAhm%+cq6?Xjv>$UM7g~(rqShP^b_PE=A37SX914w)|;`v*}G{Jg*t6D)^%d&FYO`koVjI>UL8@ZYq zJ@4r>yrQ=*E3^LgJT%8gxD?8Hh0~w4=+=P`f+qbpVtdUaHeiF|MZp7_JA*LDVO!{K6OKzf)OqWx1pM`Sk|dmr zHn({mdWWn0S@0xNMMzDeV74{9pdj+hZbQ2W*xT0|us#@usc@U_%n^KW5MtLtsqzt8 z@1n#zYavoW_cp;E_xzbj6HV&Lb~rm9@$=A2t~TQa3ZRfMC+sVSRJp#SOMQx4M%Sv< zIS*X!L%O&{F5=`z_|o=t$7FJx{0Ob)sk#p2QV7%@a9D&onusJ^@|4WWlx3>9*gMJM z`97csJZWDKgl3GOSGQ&F(^{<$vbeY4LLsa_dJ>j4Hx;(v*lpPS=r9iGkCWs6%iOM2 z&Xv^+YNVe>`vwv3ajT>L&n!F-pL&!`h2h)oK2|)FM~~CfZ+&>9+Go`$LbpBrRnCg} zOHlPM+U#Iq=HltM6DS~CA^Z|QO;aZP&B=mF@-Wf(!D{B^ZVT_}k&c6e3#0pmqEMp( z2Tl5;o?vO8yv0TNLYH~67iuI&#TxmW;|3n3jSOOL$i%@f5A(_)7sj| zH91f-WRN~&3*CmXdZ{;=6keY8K~g=jE6|k208G^eS^c2e;h{K&2zo$#^G)TEqk z&Pl-!;lXcMBXO!E zxQhp}_Ll<5%~TF!s4%R|GG_#!p06)&%;T(a!>89fMkNUe9BP_`Ve)$mY#QvR!Avv2izdJ7g``a4`BcY zF2?n6%_|E5zE(Rol$8$!r5s4(A7X)!q3O-@&I*!;E{9ckCB6Dvpvq2FOMIZMVM^S&~={LmJ&QN}kd5Rm(cJU@5{9q}jm4%5N|H3`< zvf72e(?f=HWwa3h(jd(TO1=D*av0yxm}Z!?rGQ{x;zMKhAN_L6Khm_y4TTrmHr+k{ zV1!JY@eiX(g-j7dv*?z2|Mxk}?w?0eLhTJ+i&lL2(4Ifa;W7TeM&?oozm*F}UTUg{ zsdsUgf<;#Bxv4w3?kR?=BVRydxZZS=i6n`cf3`}C8J<7~9v3dPo(!GN2jZ;-Qm_Z3 zY8)milo~W*((wp~42|M@N3>%_Mc@7XQ=kRCmc$o0VAa~r&c-35zBu&*g_V_&0iF~t2xO?+|(9glCws59#~jW9yMd#eOWH)8@Cw|#tP8co~{ z$@sxju@1T5A@q8Td6h7E(ItVgJ>K{A*b!Q10o;;jTy*L|)65r$i$aMvUBm%w|63O) zVIWEX2JX(bv8=fvy`lT&W=S(F(po3GEh*2lA{wJf^E1Ur-#<-7B4dT)H*gsPld@MSqrFT@26g%9HIbReLQ0{<@Bo6UJub|qRR6;!fKHD zgjYh;E=-!lepX;1gcP)EoY$$Ir(aOkbXPW@b>WNx<~rmpTcFd9(j!J)B^D^<4d<1W z5}SmBmUD8#CRTa4+5ORA?n-0AS(tPQx*88K;aXP%=ARb(-&Kj7=RT&q6R1hnq>z8I zt;;@}s4Eb`r?W)k+%~nwml-U~K#?5NNI*)}V1X0x)9w%Q6xT&1son4ej?UdJS%(Bi?>Y;0s9AQ;nBLzB*LfUw_*q%P39iR8JZq*8vbD}o(q01!y+&li8f z+zhYX2seAgnuN#$t?eOWRu62Ehq8o0p)!=lm`ruNwdt)*h17QH_=f^fXCwE#%vv{n z+kl5_vcXyY@{^M4Zt$Ce{S#!&cH2eXpV!FGlKiCp$ZN4jkBo1{bbwS|@#8Z-Hym|t z^7*wFg!1b7nFTrd?0I=v^4h3;(Y}Lbo_Z{Z8D4e85O&(UO5nQ^ir2ldPby2Q~S~(;QNHf`1RRc zuY=&J0v!wjA-R4hEDf@A!Ym}S;4NxZNci6|O!eDe)j&Sh8&5E*!p3p24vi6#lKK-Y z$qe|D!ekZh0QFPXJiw)I_5o?tw<@h?;MY;peaY58uCMw751$tzk7%@W11aLl^f@fQ z(*U6+B9vH3N!6(K*35evo9j`ixPXriVV$`%#j=g|p3YtcILiw${sYEJo*~7^V)4P^{r2g*Fozx5VjOrhs z)6qd1U^rm|t}3$~ks&Id{(7~U1S=Pv?|$cb(eNq*<-B|arl#~`uNuC2$6K=KUv_weMO24)>UQP93Z ziG?SCN^op}K)b&2nf(00MS$|;VK@2R8%?;&U#`F)ABA_4U0|3$hyd^IGyG1S$vzSB zK8PmS+jUgeJoMHhddAQbX~~%xc6E*8m$^F-W{TN*&XGPY8rk0Qflh^R{@V(9+VVMB z8zDG-k(8VvOA5Sf{`kbL&}-TNX!|PfmGne&mn%YTu!~L9>Hw9!ox+El?O$95+!5Q?7x_?s znsc3EcC9jMuGD;hApua<+c&L&`49QzJ4ZgxyVSFQ@fBa*HG#nv`O^RrxPH@V41u}h zJU%`IBv7!BL|!u#r+RN+6g90JITGpUbfl_UlvOALKDuhYIr<2GMMiwJi}9Y`845kS zx9Ft+2?m4P&PkfB`|A*}8Ra&a`$c*gQ%r~my;x5N(_Uok>JaDxo5Xb^#nGJRe$?1I+ z(9i0}{u{;UXZGnczz{wpqzLnnT&$V4_);Q=sSF_~p56}G*MSe4;wElbc-QsWkocv< z$!$4feVze2U<6d{0loRfLv`LfSl_zb-HmSoo$i(xvS!m1Xrqs$<;jBv&#=%}GaP?p z9J^eT5HfF$y2M_)?Uks6?{>)zPy%}Q!A0oqa} zpsx+C`5`FQ%(kmLkFv=l3b}a!Uk$i8U5vlQgKvfSPs{X|tUUI^cI=SX;IW>b#zw22 zu)r5$uO@F$dMo@N-sogc1qjt7adCd@6v@tVE9tQ9)t9tX4{xjF zNoJil=*!6H%Abs6VKn4!=2N}~=wC{mmdqPhb;{o?XU+d2zsn-*+ZU3g`3yX21tMcvyV@4n4VLQu z{K+mOy;a{vOW@X%AyFLeZ8H18#on??ip+UzxQYT1@t7*x5m4M^Ig*v^{=Yp$6lJLuwbC2x355cn1B5#rKkl^6p-inC|$-}`tcZY*}R)_c;ydoI;G8#O< z>q&?R!970x%V^1ufrI-1Cnoeo(IsVX!C4hc1Rw6Gfx8S&vf7FN!VFu0hzkNy9TYy2sN+Y9SNT(K2>WvWaTzr=&ef@~ zvWPNZ?j7W^l0I{T+l1#!LN5QwjcQ+>iv$Zl$>CSI93( z(WM`WFzr83!jt5D$?ft!$Cm5**{dkE3O?pQ*!Q#EjQ@ce4GA4`OC|Zv#H^8zcF$EV zsxe9Z+fr*2-;HRfG%f=zRDmF%`#D_cwI!SVY5UT_HNk zDs|j6JHo=k%3oi}eE2*%UOhfZWNOJf_|G=7fs=l$|Ic@7>w-)lOmd9Eh)i9H``<@5 z=VZ3Fh?$E40p$twybpKRnf3KkhK2?hy~--ir(6G?dEWFazJBY`dJ|8Fm|42G_=;d? z8!F`KcuvU2C*9R$|8PxJkpmT0abCJQCO+Q_MsrI^<|ZY7S^n#{jjol_L3$AMTHmJ!t7Z9*ezU%pc5=4K8UM<|PnIshorSNpK5rvr+FaMHVgCE+ z=Ap46I;ZvYp0CA4Arv}dI_BYap=i;B-_c=PKo&bW$u}_M^()nrllAd~*gZY`$vyaEehGJqEq5foL&8apY*lIHx z@kpSi7I!=>)q%B6l*wUe;-5YxUrg!v7poL26vEcao4r~%Ng?DIBz`-t%}e@vM4KCY zY1}HO_jF(vB!t5eP*{*&j`myNv6{t)hBmXlfD=%eqDN;ZC-M1&R-jOL&OQ#tF8>LN8)#2Y?$hLZFlkgnNWq}<-v+gu`p#s zWktp4zd{R>pii^|rA6|}{A)@|`(fc$riFW{-?0@{ni7*Ym6a;Y%<-@9B-z}5#Z44P zNAGlX^#ufM-QE4Gt%a@E2@8h^kxJo}#`kw}GK7RWfBkAnz$)JS>*oSRHaj+Um`Cdw zQ(S4-Jv`iZt3oZ(GQ>=cDx>S!IpVO0$DLW$l=q3rp=1Z(x?{n?9Am@nD-nMLwBT3E z*VYmf7*1b4m)2hewn6p$xs8vdem4wyos*LxkzjLkQf-O%Vfvt(Veq=eal;TAtsA|d_Gw(m8~A5 zL9RlmAzL2u7}ByIWAz^%8sES}wlGDyH4+o4Ffh;{-nlt1Z*M=@5FcZTh_uSSi;9Vn z)f^})E!{j8LNshfO)nQ0haxL1O+9AS*GCQK7q{#pG2r8ad&6bJtG27Fl9My2DIJ&R z{%_qYrt;^h-*U4BNn-Yw(#KZu2iO`Luk_WlQlWYLjt*ys3-}~!W=6H6W2d(WsAv#> z0%>L3gvi?5HvLXRH3+k# zv_ujrt(1SU8|W)VmyoQkzGI2tzr`uS5gphm8NDZAzyQTE1#g0rL*FAQj>F(YEL&oSQsV_ z{rt(6oQW9?W4y=*tTfl_6REGAF%9;|y(Su;$JO_=bDe*PnuW`fH)t*%L`U7XdP)t~ zQdqoa-axJwd;@oNDE9@*IynvvZoYJOO7>!j@|F(v%OXwrJU+sKjwXy^Blg#Vbm~!g5fol)GgK+GT!4B+ ztFouO%*wIEZt%8Z3=ZxnJ?n=W%KV}X{V@l7T~1y=&*LY~_f#yV)vZz+324NE<9jtD zH?SQ-tXV*x8uyta=`lLw3vQW^ufW6U|`y`J|^`DsZq!W5aE585O6FKVkgOj~6|h47^C_DA#6#RqEq-kX|9JKOy= z%@jRrE}#a^3EX`LyAneYP>C#bea6(VvDvm3fauFjE^VNS-AC72A_DQ?Fw?9hon zn;Isj!1=O!#`x4nip8Y-3=`C8lV)JpWMLEk*=AT!$eY6Je!JR@8xvzs^NF=!Jd@YW z;vFYbYr)oHGP{&H_h;R|`vU_ErFvqbT|4?o>G;0YR*i|FT82v=;vQBcl>><-~HW!!|cn6cl{X`UVFF zhlYd^|81WI1i%|k055u-ae2Cji;bOFdl3y+U!;xhI?dTARAPPgv zk}r&li^IdiE3!g|gDZ$;I$SMNt@t5HIW;v^yhecQz(#+6advk0{`T^5Gu<1CjQsLPWMm|m zDn1_G=(Ynga_C2ey!kfoHo8)}j~{2Mj3d(1b=th{&(6X*DV~&vpc&#w2k#?fr6jA0=vFW)^~5s#YcJAtxt?UNK4R zefMuM^*b8u*rmO_eQ|LS(kaV!4VEQpAJCRxh6$VND}l`*42s=3 zUhS@*)$a}$W4NAB(OHRZalh1Vu*(%H_PW`o$}%uC%uPs8sS10%*)30=Y_^V`nCRw>jxYczc5>+4HV%V#`9&}_2&#|L(8Je1OYZNSt} zQX;t`9VusPTalcsQ8jU}(4?|rRxvUntEn`c#yh79jKkrDxEGhn^l#mRg9F4&9q)T3 z@;O3Sb8|BollaHa;7UP3h$(EWtb`mk9~enZms&k7n}3uR7H%IL5WRcH;kctHA|jIF z`uN~Udcw)g?e6+?JKvv6Q0*TZ8{2KsZgC4%F|o1=KMh1BrZ;Q?Ys?Y#>zAsW+?O?e zmm@eT9v+@I(7a2t2x&CLmp(o|wzjrHC}F}13hwM4T3sDf{<752*BHU$T}9vsaLc;A zX>&OyExX*}``1IJXjeH8Izw>}7n-Ol4w_w0j~X$lq+_X{EC_?{BMpsN4RKJ@ zuYv}9O_V^v{ITQF{sachYc@7E4*R)UOQF2ysUMJ!dF>n>JumhWMaeM`UotW>G8+$B z+;SeQbOhS2hlht-mVny0@!7hFCSSU>xp^qs$;Cyyyd)3oV6jC*?;{EgX_N^t=K7y8 zF)=Pa0|SzJ=LH4S$6uL*HKRnKtH%dRZJ+=fsxhCU2ZyUSnu1Iu9J)I@JuQl*Yz4&* z79#dML)UJ!m|;qZiHrMMa#UY-&Di2cmzUk=5ybqhVM@>7 z1lTj~E?4ELW3fLe)9SSH(9+T}GFEs$K8*G&6prT&7hz11=nF<84E+3UP0oj;6`y*A{&sbB_4Wo+&q${V zDDEB}E}gws^UuGkcRM$8b-fP5XD`!k39;w9KU3%|0*Ct`M{7}(-}zu3yrZnF3|8g# zYX$*|TRb{b-8usi}UA{ANn&l&kY8 z9WuY@m>4zM_=*ZfbX$r5^BNJVAfc?vN~V;M2vzLhYvPEwiuX|99(O^Cw#(Mr zr1sn-2RVE$M;};OYYGYwNuUNyB4KzG+LAufCSdDHyC9)Us8&rNSQHf%wLRQOfEzi+ z0ywnY#NLWe)BDf_+kw@m)bCYVD6zlHya=tw!ND2Jf69_M?Q&{sl~>$?^1o(hWhJ$Y zYN)HzL<#b+k)a_5?N(p}6}g>lec?g%MMFYGwJxN9b;deE#DwO-0mev(?G7iDc%$Ei zwe?c%4H3^fsxr-n(KC6!s~!edQ*(2fR4&J3Sm%|#gG2S-Cxg=%`FO_aU7G0ejVW}@ zgJVl{|EjiiqF9B@kLJ@SK?nq^>}8;(pRBgFwydnIv@{C9ED-hd^%Ll|c6N4XDne3I z38N^9WTU$xB#9D@jf_0H-b}AsFVKZ%aK5stelb$wjqy;SVIBCm-`b=x zF}SUnVV{(nU+8=nx{85fid%M-#*Btb*vN=7h|r2uzVDYrQ>n@O3vu=098kXo4W}F^^H)5)(rVVAxeKp zR6%^FUR3Ylg8)fPZ&_Jcz54N{az{r;a3Ukr_|J#g<@NO%*HfcoGvmP|idJU;lhoJO z?}M{V6d{tbq36Jr$`MCJ6s)Xj{L9|##HY7*X}0!;A%gDOM$vuF(OBhC>Yi+jjN7G2 zD_lrKX-Xv@JOAEcpK8w9(s^MfceXZ|YsNNql+!u-aId9~y@tAGTRqhbcXl{tfa+pt zX35P_qGr$}p`y{Ot?zad!sfB@-4rmq#^L#f=j@7{@O9vW87Sg<9l&YrP-j_JMI zNVaCPob}_+%YV9&`2}S*AZ7v|o6he|ls*A2aDURzfJlPm4_jTeKU{1vO4c; z13r$#&ksUk%SQX~PR7*qBO`MxN7h?JlHdfC>+5UuQw+9G;-aLY0u#|#2`UD)6Aq5k_GoUE@i0i; zR{oe87>t+ev@z;;NhY(EZqwkiTd}aS^Shmyh>MGBX=#l;e*?b?A_d6NKseKrmJSaH z=o-lsWVe_`BPL#whkix$_w(c6rq@>?C9VCk~QFD#~SQ6X_Tpaf@Ww4L@f19e9=a8OiBGD9VBlO&lQv; z$oFmxRD{%_)$K?`^^f7wi*l*Wu9aKxO&_wiee-X*Zi*BpG#F;RW^c)Fu8vn-1d${| zUN*Auv>`x(gtJ!y%M}f8qPBtE5qWzwZ<7+Gt0<~LagVrLl>~GHiHLT{RpPiajkt{m zJ6XYp0{Bpsl#1adTQ}K}R89+K?%c zh=@pPvray^>7z65L&fLS%{L0E-ddZ(G=p64ygt)YmDM+@#*}Rv9Iy=8&bw?LyWtTB z46Rq%qxutv3=U?c3O@LUnYH939i=#ihbm7gjS3!kmqafFD~Z9 z>df)XZhoDso&HM#LsI8`IohPIhgqMU6Vuv{RIS$M6W`*BK~V>9b${J8>>P6#5@}*G zoVg@*HKaM!{JZjK6Q7^I*Mk)6wa6J>#Xs-tig-rtuNS_fPyS2I(RQLK8dn8<`|9oS zHTLz%#qTq|YuP-W%Wqfh-H8zroVk+l_K_1A*JK;06@*!_DCkSs6xj(s518F_rdx3v z80w#w`386VKu6|tx}JIikzq=ocX1`-V{gsKf+I07Heoki&S41f`a+@r4edSgU2?*L zc^PxdDJblYLdfMNwpO?3^QO59jP$`7SQxgA@BvJ7Cb=5Jos1vcz%~tqf zdn-Hps+%amHR+sX%S85LzJu>lfMe?}pWPjGM5;5*j^ftoh=2Ct;P=5C=CJCYqY|U; ziD!*y_CB4uVLQy?zIn&Bccn7?>7_mz`#<+cN682z3A(r=L=e^RRb_}c8gd%Ri&@N5 zR_pnUKuO_-=Z1MJgGKVM_)aB_mp52PRi1`ekJ|w31!5*uqRfwQ__)bftFxv0KI6FL znz;#RaeGvIyj#5IAYbz zRCdj_r1$vcva)}J=uBmuhQ=M*TiI_{qjuvHKiZrJt#c>2c%CS9@%yx(tlaBlqt~|@ z0az^a4`bCWwfdR*xQW=#H7HNN7n|pigNKfAneS+|J?$Cob9ngWiK#G+%X{ddvFkw6 zI%B_Nx1@}M%!O8Du8d7$0lVB-gfzo?tk>b?z4}s(Hi|Z?4*&e)w>BKD(5q(_5`oLS zS#lL;86S!A_=lqsOOhk%DrR(tb&44RW~cs z7v&^tp=j>z!hNZ?JFXMjQNJ(Q*Q+>6$%5Z~9fF`uxq*1JiL#5(CR` z`+D0NF67OG|><*TKmGZTOud5J*A_Vacy16;EtI0GuEA&NdvFhDfuYy>=zP?PsC%kw0 zz712K<0k1GJH)T)@Srup&N^k4BV}f%PEKw4CuTL7pkN0`9zjG~^)Vui3UaBfUj-SF z`$+s3Xxjv?3Ok*GwnjJ_P07vY^LPG|*X@T0Fsf6{frgOTkd=#$V{3xH`Bv#>jMYiX zqLfj%5$cj2cb;8`%nQaehR!*PUI#M`eT{wSEyBywzVAQ3?cxkGUuM+|YRM>p|E7q9 z{n!OPV(1&sQrtGLnVqnUa!$~&tZGJ37j|HE8;SgoqMTjedU-C4X!}ZY9?mZkUaF(N z9hoFn^H<4{@@z0zB~<80nxJicCyNQ*7`zN-h+p7eilw!ME)?5J8`8gYke;EQ1G4Uj zmymX1nI$P}0TPAET0^lniO~F6a0tllVs9;Dv&e>QpKZM{avL~vygO30zni;ixx5sQ zJ>J`XpN7-A^S6j0z?0E&L{URf!!Pn`zoqA=s9$7gZYVUQRk{`23xXH(T3EM}pd!ca zT9#At>-AChbQC&s{@HSpPCqf`zN6WFw#_K^{6#S+H20E3aY2^OvsAfBo&My&uGljE zQlP&8>@UrFhy5db5&@99Gnk*Mh{#9n{Go1=TON z{hb_9z7y$@AC^zeqxZtZC1Ek%N{QZy9+QzFM&fs%zKd+BxbLPXmLcXLd=wT$>3 z^~+hx#1eUPX@W|pq^+prhc^58?eP%R8+W+7&E$xlItuzCgM}3jBKiSKRHt~NEIzck zY2GY(op*%kFS`Ht?ix`8c~LBKL4;b&*6;j}XKmW)H@z7$N2=s%H!l;Srpf#wpN+wh zjQ=sGF8+wg54GGwBcme=Ch*85^d?4wyo!6JfFiAHtI9lYe8qKxXO2(ir@hgp>1;|U z^M`Cw{=cWj-#7awsXk0ZHoL&`%B4evtnFsAlYdHEQ-VhFX8*yun>1n{b(X*AlKNFG zDI<~mGtzO`p!Ief13}G5TU%RYQjQI?de&K)@X4OtTtui|(n8tauqZoOEK0Q3K^14e z0!sr&>magLfh;wbi`qDW>->MbCH~-$#%T4&Q%@2tbs2quz7mLzivI^m zBTn_YJ3bCK4R9!Rs?nUS@2^xTh<#D|os9@9SWLql-+b3~u-RXdOYJ5nmx-ghV@R+; z1$Q)LjNDFptyKWg(?#fIX3zi70%(f+J>E`reuow51=l>C!sn#)Ma9MTUWbQmkIIhr z0wVp?y#=Nv?c2Y{fAi}4J(pLz0^mesR+BObaPGBKIynXj<;?K}=9gG|H=Fg(f zxU>l&1wR$ywWAl$(xEi$+KX2pC09pJ$X0G;p2SJM#si)JvR;= zSa0TI?1`JbWHq(!m>xlv+aHY_F;u#` zIK!F0;mvzEp4R?n)Pjp?G*U%vp&YGs479DB^TH1`XY`N za?jxwUQi|KFgkr5tH{H^GKVMHN>)mW(@2xpGx{hpo1C2M>{vxev8WG>rb0{2Nv({n z&MhOCK;-qHRRY6uenL)Fks4xVNMp#;WUaJ7)CS|z!R^$Nf{Lo4h)bmUqTyL^zaw#A zSl9OY`T#NuF!OBphUi3);pm@SE^0_+<+A_?!&d_zeRt~F(+5~J!3~nrq_I8 zrnJ@Z3EmSVqPv2PeBaLO@_cb8LK##4S3R1<8+6 zD#_t|XM%{=4dA%w48Sssudh^vV8+k7TKvIB&Y%{R$pjE8U1p!7^+l_hxtqWwJ+eU6EjmD*j0L;|$y zv5nS_xD4fA#zbdR{KjAk^Sa0_IAy0=fn%nfru<8H*Vl8KC{dtqykT>3h6%|;3CeS{>jDz|;V|GV15>+u2p=08T=a%s zTL!Q(I+I;=H}eNQyC@~X@{^TFCBq0t2_SBM=N{Fmo4ECB;60b|#mG$M;SY{&9j{=f zT-IE52Raq=DNv|1%{6|i5JU+iUbHptj{YY>iJH=UIy7WFGrZGqj*^F>6MiMH7vDYA zS?=9(YcA;|NmxFl**%}1KKyO29r@9PU2xLwaJ|2qKH(Ta=d~hhX4TKW{{CZ)Z@BcD z)T=b!57#R&0RZ9`uX7Th$boIHx7@eHt+QG%+di6^nK3jns#O)9#>Msh04lGP%o4CZ49TEmo5wx z{~Au=vJ@sTk&#i(Wjy`; z6mlsFF`uLvY`Q`pW(Y=Q^H6I!7f-JR!~vH2`t|_Ri;cx{c6NsM{g*F845Rz~(nkOd z1A_@b8iIm?T&Y&Nx{P3owSFuzGQ)u80=TuhMq6@MIpBTVFTH+cer8pgC8!NVAuK8{ z2egw$tB31YE;crHu}ZlxqN|I`^vul1c~O9!!YQ3A0e?t~f=r^QtPn3BE3c+fxFg(K zge(NqC@8N1ZUATrIk6Wg1ROTYf1aTPo?h(F4f8*GjOK^|96l^84B&)gc~ZsYk4FX? zN=k8cb(a9-2OLy?e}97}80pG-e}bonN77rD%8`HnGUW>~5_#RuK8&*9mF7C)r1;x*Y*6Zs$dfjg0`$=Hddttn(_#=0GAQI=atT zUS1y9zr@5u7n{je&)b``?JAQfyEIWu>(k|SIzB6xje*4IXpFOma-7#uQBfo$B#4fnSVt*qBKE_c!N)h+zbrmD}?4384vqyn`i7UF=;SNEv@t zZs<6A--b)ad9R>KyG075WI;ZUDKsL&Vu~sf)H+kKdHGN&99vGQjE$C*VBFT1G?W zM~&4Ng8eC;L5BzjC;r#3>9)4DTiiM9G$x3a7NIvZq6}lIIC#@cPj69b7+4-FpvUwa zqo!HNdV71*(ulP)OTGg{b@kK*$=~i`Z)UN@y-pG1(Gj-1{Mi;J6#UhCv3aJ_5E)`J zTW#9f8q#)%S^br_{2@W3O|~c2P(Qw~kq+*=)0818J;dZ-z5&3BB_$>EpmN(D%U4=R zL3L?%K2$TPQ00h9c)Cqltn~Gh^3kh zmD{O@;JmW2ux#z@ghaT)6Ykkut^DZwp+;1-7q+jofCDGcw9BLthYpdXJS{G7g&?N# zd$(p}2uuuKf9LSW?)_{?nLe!IB6xeTf4dS05_WQo?X7>=fO=_&{d@ItYGlL)e7{t} z#>NKe6Y$?joZ)u5u|RtS&K5`yZ zS0<&%N`m>#+ohHpTd+oS3!IM^bJp0!cOW!>QZ5ldj1tWOMA<+xyNvkCj~_n(Q9$O0 zL#HmJ`350XgsjaL;E^8B9=pZ(|DqYfJ&-l3LTi5i{>A6X1=;F}A_L6!U_5$yUK<@% zERv1AeMj&UCl~1OIyZMzJD0RGS0Vv;T0jN?{ykGLP(7(6>bLi!7eM9n#}a7OvZisq zG|i$lt~ef>KR$Z^uuYK_GF*nQLq$;NB5G4E(035y0FBzQvC}vj(4rt(%*hM-cIb zpe1qI=LH9gRXGOu`^T~Qi1?EEu~{!_0!oL^9alDMH6r5i{_aqlvZYpfvFPbMamga^ z`sXMDvKoux>2V`NRV`InmWr!pS3JR}goxp+k^XJde zkFruR4tn@Fv>|FRAKN#dyoTCOVZgtStVGjdRy66ZmPsJybQWd4f=xD$Vb- zr>dz*;15|jy@tuWyiZV4QL&z{j{>Y`cAk%!VXQ$({clo0|CFmOk);z>j8`c-hQh(o zj474Vycp?y{q=8THwnOttk&4Q_D+r&6ukarwC|F_UCH<=2*SlOw2XFi5{;}7RB zdm~+$?qn2}mcM}8I`{y4o+0Tt-?&8l;6;1#PUjD?5x>Q4>^@E-PLUNBT!sP=-F&xW zIl_|`PUX4TGBMOLL~SABm%M9lDz7WTe+9QCw9H2jXW6-KFNg_2<>UFK5|uBll+J5$ z5iKVHO4cGPT(}H-A8-{I$J>;uf5tMxsQ~mh!>Td08jBBCGs{}I)0_nQLJlD7p(btk zd~Izxf9Tkn=0_y1I4$!spO^SbtL69bB@@Zd74e4`ZLs>`C5-lgF@$o%C;9V4>4*2D;2 zGu`C$>^ZXyUo|mfQL00M8)0?02)ZR->piEN3XTA&SCRAt+hnaxtxYOy=kutKDmfP7 zQdf)ATZzGtAsTOuq0-gSM2FS1uJBcY1>?psmYjR_`OD+htnn-gm3UPyc4mr^{#}MD z{mN6!(_*!Wn)MniysyKMVW*(dZet=!6r1ic?o}3>zhi$7$(LTsAeXOBlK9b{(^8?P z5NzQgT0cC4>nW}h(R>YnK8%rI~*-%$OE_yt|P(j(FahL7tsMo=v{t@$=Eh`||xkh!Qea=^N#)>@yMc zZS>*FwBwgNevz$t56}lps<*#bpiYR1<4VS42yg|;xS{nJX{nwYpGPy(W%z?Vq&%fq zlhj#@)yc6){H7cBszQh8n`(awd0o1xTM=GPm*|siMA)P)(^k-PCwSV=Nm1$KKZ}7E zU22s5(A;=jbpP4?h50Le&MhACB8fCZUiYN)Gr61WtRm7BQ^RlTV^f;|{L?Je{Adtj zrhy2zwbLjMT}Y`;6r!|MO(__YlYyiy4?v59g`g9=nVXDb9qanITF6>{vPyCj4Y`|k zn0DxpuZ3T&SC?kr)V5Q^SW&IF^l;amr3`*c4qlRhCWf(w)p<2wJCcSBuiJ}r3PBx@ z?JMw13=d4o3`=s$N{4i9(^B1WJSp*jA441?&UN>KFGt>U^CQ(&Hk|}80^> z?E13D+oUc~6AE+vB$zSJ3Cj$lNd_a<1|wF=E{^(W;Q8r3;_=dU=U&l?9-jp2*6~-O zRI^k$ur#m0lLP%9p0mcgLF*n&F9* zQn}oEP0Ia=wF_~o8AO}kC*35)c%_^HU^`$3-VZJD`P926cmll`r08g*Xl?9faeB$F zIwN$*j^cSHZy-tqAxw9Zam4IH97M@d;Thb5yh=#@ON`(gH^>7vyP-ZzeBL^@_9!>*$MFJ|(0k%SA`E_w^WVZd9BW?Gy(+cVKOd@sFwU zXMR|k9KnImf~fA8tHX6C%-0%myS5e+(u|Zcf^mOqn=dcp5PaPp2sh%_eejwyFZBpP*()GuI&XjXn5c;;jyvn?}|Ewc}P z1E~YIZkG$pRx*ZPa=%jry$L^C+ACkSazF+<$Qs646IR3emK8h!cPV?C9Uw3JWFr|@ zfA`7fi{X~();ZI*VVSvAk)>Ilxlx|})4fRF49a4*jY|6@B?9|;&$+s(?zEpD>xULBgfx%0g|{_pHV8&XmqPdJM)JJ|WGsU-!a1A= zCm4-Jl0Md&olEvbd1ln3uBIwkTZPY*fXCWvm-BhIwC^h2rK`x-V64wGGx92gsWI&E zI7I!9f+>l-pNI;KV2-y0nWCaX3esfxwH3-;U9vq`yl;8&U*Pjf@q#BW@_YcpSr$;% z8u0YLPo58-f{u(J>Ot*uxW?lDWbx|4>R)bsox*07G~`0j8rv=(=Ev+ik)b*vZ4YCP zPg6*`J2j}2SuiM^yfwFW)yOI<4#!Mk3UA)U(Db%bI%rDXsdpS5{t)N?#qjgCq+niV zX=W*#V6vDo(|bv&M#`9>aXk}L#_H-V^&|(Wl)}N0Nj;No(?2!NpaD!B1RX?@037|b z1TyP;J3t>DbC9uFBN;LT&%(pFsae@(>m=T)6v}HzYr8qWj0`vwjvN*^@hACJX%2YARm_!H4 zL?JMOC{gnH&xDSIevx3TLZmAmbd5OluP>#5I!arM0Y>UKZ`{bwbM@P2>^mCL94^}? zl)z8+Cj0F4(-872h+pLG8)tm>4k03NKn_-E8-G6N& zceyUlWWFN{rH6&{;nP)2`kiA6)4t36vmw3|8*q;^xkt*Hl(cE_OYuF>Kkqi~r2G-w ze3Q$xsKsabk)W2nh|6(y(G;oeCE8Pqop=II_g6&5x4*2?>v`{2KSHSKc<3ILytpk* zu9{bborK> z8gtf43opUzG?P#HD0rd;ARzGY|JKFl5TEZ0KKA|KEnxJXl-eUon<>wWNU@L<nWrcpXQ(WG2ID@HFvV(X!4bj8>*_z^gY+(@*@4Mq}plj5vQ1#$z z%hdyTRFl&_9+N>(d^}E=a8+$BkQO@0%gfKWoBjusHE}wr0dC= zSf*^y*wE0>&CLxW2^AI9F%wX?f{N`)94l>QbpVQ@VNeYLp>}T!)u%eKh2SC-utg3( zt?+Ge>D0$ZMl$BPmYQ9CF+nZ2va&K5fBkTK7;Ga!83Qf^N=I}E5Zer;aDun561=85 z4VdP(7u){(A_uNY*8_>nmxoI#ZZ$$YpIKQg3kN_gAB_3s%NL;EW@Tl)JXp~G{0=b_ z$Pbg*t!Y}67JQLV|1*LzbXx$i1|9C7Z;v66INV*?va_>O#uS#8F0^?+f*Fc5+kE}n zxie9W4gn$`CnqP%C9arWsD}6572{BY&B}AzCOHoac$E)ATH<|2IPJ@vgZT9wG(~j_J9%xt^XN@!X_eza)QsUI9u?O?s8)X`s3ilOo`D zDw*K|mF8r*&LIr;*MMo;p%E07fq~tC7XT8qWV-Udf|R)b_Za76rpq_I{wE6)+ z24F8X0t7D>C56Q_+C>+ZWeenwQJerWN^yljUw6(5oCzoZmH7JUb%>INrsm$p#-v3J zD9o`LT(?Ft^9+CZ`X)~TAvC_d{i)Gz3cIy-)u8M?NsQco3&^p(fbs^39Y|F>FlvCx z)(RkSmZmhIZrahiv^_mJxj0z(lq�YEe-{h{;5e60kV&nXMpnvLjOw2n6Ej$O`G{ z=_vqud6z=y=M(^{t}Isrt=S6%ly`V|52wTYSG1ZyIxsw3PDl4|eB8m#4yc1a#Pouh z0>le3^Y-#Eozvb3U_U35lxT?0U%coFZ;wnmJI0uZ9VH_#jP?Tw}G+ z2+pQoWKz;>fm}8~wg6JJ3WM3%+k@>m5v0uKwBHaC5?ZbXmrqPoGcuwK?D&ERPHDMJ zIv=25qU(mTva$feiB2p=9xY1VXutWSB+u}N`#vN+L83zmGj;(m?vm%F7I*+%7sA3o zQP2H^jD^}ZXx?c|OitDUX)HO$$92Ep&lc04HRq~L$JA*Qw6p*|yp?xfQdsD^-iPha z?g;>Kuod99jwLMj0A+CqRtcwA;I!SHAj|Co zo&b#Z~wW=>r*pH7AX>t6d3zOe&vbQ_|Kh6G#P&0LRMVVMIqM2k=4y zsfd{*f&rRsUW8A+=@>N8$fR)m1HPiWyZg@{fh+?mPJ_x1H^8rj)PIV2@Z9I+ zlDHdO+ufD8%Y|)h80qTD$;yu8;kQc_YvLNC2o)`2I27Dj6VFZ1I0b9JOTM3Ps+bs_(ySU;F3PIz8w)(aSo zV0}e-dAq&oij0g8n3yrce7BM?2Hzo@9s{Ueg$*eK!=W`}0)q}^pQ5sIp9Wn;h`+zT zODj|aPT+E+la$`;ca56MH)-Gt5)R<;arVto%Pbt@URHt`RxsIOL?OWB-^UzS_A@7?rQ+G-Gf6su0*+TjdORU@Ol^4x`{?!Ho!()1AdJEdI0PZ^1 zi(Utdj*f;7hX8<$0;$Kp-ef*o1eLW0wQg~a!;*xNXA_7Nr4I2zBE*#6_(Qgr+8&FP zioxy#yV5mo;S&bs$NxtrA0RW}L5hojfRIuT{EBTzN@OG)Ixgrrz7?7WEfJ%X7M7OB zqW~jKh>wSV^{U1kAO6j|@0h?>0bu%1L=z7HQab|PV!T?@`)@5f^lc}wKM=;7=}J=> z_2H#iSXf@Ze7W2{0RUDKk`>@zyN7#dzFnWJgN@!eb`g>WTw9fjCU*x(%)ckw0#?94 zO-)Tjh2V{a_!7{25()Ic)RZ!2<+6oWUWRt6*I5xJ^n>(9tJWeBL;Vfhmf!6CHJKq= zy1jTAHuu$vw2#2@)|TiQU7}>X3v3-QBuEy{z#xR)f>j5=?jWv?2Z>jsWTq@uL45bB z7>_?Be=OME1oqK5N)(HT=-_-2#FyX`kUa@KfZy(P7t_#i2azV-^J0c7-Gh`b-`2vS zbUgP(Kqc=3*;HGu7zOuJ%grlzcnp=3 zCvp2AWjqbr-#-Hb7E@(f67jU{#K->6Kr29$=y>%d$P%?K8;a(|fXTLcT%R-@w(f$S zoxD8CIB`~XcGNd-nn7dDWT^&raZLNSWr;DcL@anxDk{#PHw@5mmWlE&s($|t3Jc@4 zS^f^#nzS?`f5^Y7DPmT$@pfMXkVO@!rh>+|=~mAs&}UGt-2w=(iShBDVPX6?TiJl@ z0xE;*u(!%2yu2;I0+Dg)uWoOXlat3xSn$Gtms(j}tpeR+Fdr>fI_>7G^0o&MN6-MHfXNdt`R}){z2;wIQZ5UDt|G8Z=n!zi{>OW>hHJ6DzAvN|RaELkKo<<0 zK*AV3dV+NRs-M6IlZczAYJeUg4dv;NgK$AWuQx`pA0{O8H}4Jtc%?A~G^4ZNy`>VD zkeJK%02#k}L*WPEc3;AU%uAoo_mSaKYq}i3Vx3?4r9}Q2Ooq6~Bg@X|`I(p6f z_cz(Xrqgr9jdTmo&WsacysvDIm%J};u8mVk1Pyc~tgmbms*Kg9%COV<%S)n9aw&umbH6|A*%j&Oy(B=PVw5WjlF((ENR%vUZN-r2lSo9r>}P1BrKbMC z2U^?SGaFG?c#VWHx}6Ci%8gH;Ls-bj-Xb6<)gi)-h|O5et72mtf|R=mpOk%FN9q6Q z?ybYB?7MDJY!IbHx%Q+_jXCESV`i%409FDVf`CO_|Mp6xuIS-wmGWXz=RL;3A4-F_ zFQH|}RF#&(pD)@e=tfc#r>E}pL)X#NadE@Wdw3<1gi?q}XA{PL{YvMzvmVo5(;VMh zweva&BFBCEm}b4<}C#U#lxgSlCt%KjbjA-tkog`=! zR!Bl`JyXEeoAbJ+@I7OzUZl@!>Q8mkKVBiV9zwzeef}VT-*1l!$2GTia&;M@b zKvtLL3m8R^-ZU=r#`EAVii7jnC@@)}f6MBQ3*^V9~0 zjH@bQ`r=ybZCBcR!$$m(A8tbpKf>3?rmHhl$z;2QFbb292Z`HJ1~_?gv#yv@1pn8N z*~qvyt5!Ov^Vep^+t;r7!0WX%Z*_J(h>O$e?KS2!HmMQ46Z$jR444Y`!_^$1U{4Te zc_KgeP4gw-yvdq9>7bvKoKgzXS);TxhHTsc4qz4%OwNb28@MN-r{}GtprW#K@_d!0 z?zq#Sm#n2q?(IDcz63r>%5Ad6fvj!rFNZd>hntJW^$M0Jgc5ySa^K&aMX}uEtp%F- z=I@4;L+2L~?_K+nj5%MCIJ?O$A7L|fZbh147!91T5u-6`IL=BL+I%bU^*tOepI#r| zIXPfi=%Edp!p>(1yH7&G<#BeL$Lydz{*y@q$0t?TB=k*FPH<4Z`%ZIx8-qg!UR6$x zy|ZnI7ik8%?{$yI zdHz8PI^Sd3jI|4OEsy4-wOCo_oi+&)`6YNc2kO&U1v2fL%TiyMcU8GYYN%%l+TZtS zFlp}_rg->hyeB_)v#oBtwaQkqdC?r3SUgpU&(ClEU~|>YO?66I)?3NJ!eS*=5^g{K zE|V*>Zr3%{-nF?%DgP<>5L@UU0e+!Qa(9$ z=#S+*>e#DT7Y}GD9=GUF}Ol z4EuL~|KkL**(c$y=UZ2r#z=1P*M!mLT)*zHyc|qT-R*fMgD*Q?M|3{tuOz-W!`_OKvHN%B$t8SM^X=g@Zdz0p@LzF2-* zQhCpu7jA{cZZ~1~Z*07V?78u)sqfSr*Bl)B7!>^X|KvTDq2h>NR~)UzEYuDEL^FBC zPfTp4t^7e{u(N7U89$^>;6aGeJr+`J-7qr@|1vY1hD6@Ed___`#o4p-XU1r?V~4g^ zuHG#K)vVWr>gR3PTO_NirQMv>T3T>p_xSnyK45z-EI*GAqgGZq9lw8~s3fO<{nn4= zIZ6?-O$eggid~8$8tF)S_^5vCXelT-HKTine(a(@KcvsiU3CSkjFq21BT5DQF9VlFTveq zSLYao2Vc|37H1D9Gyj%@>?ZKqP-Al0+B5pj}9iFS|v-S1r z2hr)7#ycGh&C+N6X}IDJ#Kd@lxx&t0s}hmE3OTu?CnvNiU$=hcsPj@AI&CvC;)n;) z(^HN~-P0~aT8(1$jwRi~d)!N{R1o`+3+Ss(-VPMp(6Vkio z!Zf^w)OPzpHACAprsXv!6Q-nTyZk8v8F9dno#W_2LHMTZA;zs=q{4BBn!7tj=O>Fj zad05fD(5sye@UVcm)V_?NZh{fCE}abJm_NKI1Q3tVUICQm7R*JI{m@o`bHnEpe#g{$VKW{@QNaF5Z9 zD(4M4O%eK)E8VS$CnvMbF0VP6i?QGL9YDSjXehlx2fB096K)%oB`SV6jo8yF8fu|D zMQaw`q2ayPDB6;QGoo2dpREkMAdO+yINxdt|6`vNue~LD-XN5$4$~c-8khFWu<TkWRGd+dXo{5>+ zWrZ;-mDO~8qHI0g%$na)sULLMbrZeNrxKSrz{_F16H*~IhSbUY&}`t++7@jwssd}^ z(}HE8kSF3-F5zzNm4I`7qM^#(MEw~NkE8_Q+>^pL9Y4Ips;Fk)VM!AawV(RXZ|xaj z`dn0hJkj90jZ;Cau_`5ib%XjbFWZ6Taa&{vFL*TQ}5oW z&b<%K2V2&j)7O?;0^nDU#@##bav9B=lP(67D8@E%Kna)ApYA057Ahq)`6ap z!fo-76YoZ71}?5ObU)CiGznUO^|fM`(R}lqO!m}4CdEzU=G4LSor(fp1=z6FDTZj|#nP$jAp(Oi80f z6(;2P!np?r*_rOr)4O_3;89b1Bd%jFR913NRx`kDFEn23^S-*fKXqL~aQKY(<3*xC zX{A~C^2Ix<*~@}r13Qi4Us4)|Y^Xr|6#EKCe6a4cG0)w0B|@FE&}Mc-NO!%|{I=Jr z7$cyD;T8G#pT!clF3JYm=MU%eHFO`07DF()aRu9BvtMj`x#8>6h{%n&QDB2 z#@dUd(Kjsy{aif+=oR_cX>fywLy8Mcq7jhw94=TsvXS%l#xbzrqcCix^1i8FfDfqf zJg$cM`27o$#oOhtyR0VZ*x+FdF7_3VSZqECA3G#KjoeM5&k{;eQD2ytl21>ItG>wo zDrT5M*5qVi4_3JZT?Mj|x!)G$~Ki=_SWA zb@hTGeC9_6=6J&;Q!f7-*e{0*dFST&uiwD@Uc--t^|6O%ewLY{FU5SglhP|NODQFU*x6kHNVzBaJj z%cN%O%Tc5(5`ULOKGRC#lPVxgt{kEI_;JtCF083*-}ltFHT1X_76td#R}*8}CtkxK zr8sZZn@{k0<7nT<_x+%LacZ|$X$MQHKr_$vwBmGY8q^GLBJg1=5J!)#c)d5lZy}<$ zsvWno5|hhblHD>ga{28{!xa}Bo4wIugx}+xwc?MN{K3I54b44|B!6%A+1N*bB)&jv zFeaI@LjSGctN;S@WOu#X=luM5jn!Le9$Qp~O>c;cYinY{Brb}OKt!`nS67p0Yk$1^ zM6ra(zS#le?3B^#Fy%Z%RFkV`VVCs$aJGR^PbSH$c6(CToq5DvM8piX#{r4Pt0E%v zzF4OCH>Yw`6VKz`cJI7TQO?1alf)ddojM4i z>ohMr&5*3b@jRN}Zp%Ye%|qC983&*4&t6OQ(>_W+p07(oY-LyUxm`u_3x}&5SS3DW zCks`I7~d)uIc&nF4-4aM4Y`n;4I-^HV1IswwOV5uZfO1W0cG26HtFszrPa8))9eQ+ z)f7Wif7Xhf;$K-FW~E={@=^kGpAg4Qs|vU1mPJ7y-y7XYEY&W%4aa-6s#({2 zLeZyWK6lMx~#=ieevI1UKTd;UkzZJG^w>wkLF`$wpe_+qw-wqcq#sMdfgeY ztQUaUef7o(9ew33iohvuo2ivbyYFow!^Z@$sX%5+Yuua1V3&+@!4*NaTa=)vqB86> z)iN)t;c~jpThy7>XI^L;RAYaTg*`hoSO&U#e+JPrwfNW^W+v6)p`D2dvTCP;C$eUS z4G+5C&`!>@VcztwI~3nP*<>c@dO$;CeSXRydV#1iyy01X;(xdI?3lQ!TK*PBwXnJR zS-v()!8@yC?CW;KGTpDoN?7d{R|YB{QoUiGTNd@G+Wjn+A?WyPalW51QsQ6(9>S+* z6tP`i98Tn{4dCXLPBH0tH7mt`P&n|x4PZ%9^u!_EfB|q z$33?QctM<(8+BNZ1YX0xgr<1q?+bT$UYvC-4>*jD!YT75BTCbsv@W!Q*Y)%e(h+IV@zYUl3#zPfyz$dGPq9Yak zLvPW3V4;5cB-8y6hnfx@{i_2NTFDi7z53b*6vE=@7-wgeNr`@f%;Mza-@lQmCImtkFf++}X+3nl{TE7=xt!ko~P@=B5 zhH<3~mmaa9e$p}Lc%rf@kJ-i~n~t$_=o{K+!oRm6F*r<^uiZ9d`~KqG zso7vufDG+V<6!O}M1fdW>~;Hueev)t$geJ0P`GdV9CzH=>OVMq9#ch36os zTJ~BGwgo=>^)aI%W*FQzm*C(*TYJ*ugGnFHW0RO5K9oQE@o^c}4YVtNZ#anIRqup$ z*{yGy!s>;v+ZwD|qdg4t9EPi`A7Tt9tE{skk8fMu?qKNs+K&HK!ZF;&j*$^-sy3+0 z%We7^d-Chj!j0|u=xc+6mRzB1daQGfdBUbm$ZKy#l{ubI$8iseUUWOyET0`Mrv6aU zmcIIiT|hm_MB=GrOK0FMMAF^6*B+!>eyx6#)gP0bT<2c-JzIu|XvA*Mtc^n0f*co3 zswf@?%Xut2*#C5FA-PdZ{9vT`H@n!cNwegxB=~l zUq6Y$px+&O?K1F^aVaQxi%H=8{j@0m{pEVKh3<-p5YbF767L_G6%~u_?oo-tZZ&z` zZ@Ut=x;a;+LLBkXV}iK3YM2Be56lZUJ7-o}_jpI;U_;LL7KXi}F%RiU@M7-sxGd0PcDqP&u-Xv;Y)`ts(3kpT!668s^veo=f4#0ZlQ{20imBQTI zx=NSb>hyHwR#uu_WvS~=H69yDG*zA)^a1mLj&1YTuN*R|M!0qtc9!)pc_}m5)fM>T z>2~;4i*@S78po64w$Nu<0u~1wQl%tdjd-xpGBfiQ)Dn*7DZ-gqUwh&s@dq8_?>2o< zSRWrweetF@{|RIM@pfC$l^bdyl*N2xAKQHlh1Nq_p}-fV!}3|bztR53BJA1)AT z^%;x+rj2f0FwXI7T?)?GbN34oR*R28iNkfGIih-M_KO|i1m&yxRvQfyi2P1?r+TvS zW#T5qYuC!-IcE-EB^}*kSC$wkJU^&o*hCJT>7E_Lh=BtuX)2IDAg&=~m0{C?|9gjK zYp{i|8w%;V`kf5R$)VYk5Oh>*Q&Yp8QF$AS986SaJ)I6inCg&wI(a?CV%_3PAjiO9 z6{i+AvDF+2IXbE?D#jJ}wVHaWAoHVUZLFZ<#R~ zT=3LnxWzP3T3A~GaW}Br&y>y5ByzolP$w-- zvc|1xcE4V=k%oBK$3`do*7v1_IR6jV5lb{-4@FztpNuVSj-^S%>gHX(g@a+MOnhQL z*RDq)l$D-L^=V1eG0&6$92&r>YyDI(HwgGmoTMzhtCZ^nKpU%ufImMj?G5D>ih zviksY{af&7{g#`{g>|+G37TYB(sTy9&K4=5>%Z$~wkr(S3tny?!KbwNMb1LVC=1qT zwJ}$7G!1;+GN$QLjWM0bVB zWFNa~r71^55Rv{)4wM_Q2>aMFZ7oUDY;2d9fD_--kj%YqA-$MckfZ!eExWTTa(@2H zj_os-%GC77+rKaE4Rb!Ztf#kl=?a8=5eg~#itwC}@A$>X7d~O%#yu4NujBL{AI*bpVurYJZ zM3J5uT3gi$R{kk`EquBv(!gBO_UGVhK>@O|bFb$W=54&wVWws-N#&rR64?yp`&>7D zr1CRKNKO4=?P;Z@tgJ5Al5I@=n+uS6PnI<+QZ`8C$picnEd_3_A0)S*X-J!MsYzVP zS678!&QTj0RJP?u>W)|%Zab5ugwo@Dy>_`wseNG^;w5I*Xj(jKEMF!9TAq0LD`Bh> z5&XU>xe`I8k8#y2(*?*izD*55i3#$4ZMIxyrBbX}FFD{n=WO$BRTYA?7%ji#C=0v1 z>#7or>Y2s3eA)Z$+eTI$?@O29Z!!sSfwle1`geHRE0jGwMepKMd9xA_0u3x&%_iH0 z0g6!J}T%vzNH&!>8>F zlykXJPa-{1HsR9~fnhFg(>Ys69VzE<-M-Bw$vrqcfbVmsvZ?^<0$2Y-%!oyS3@RY5 zw2+qmB_tq?KK(ryr;+xxHx7k6={Egg2sUDfi)V)H3GHLxVUd&(dz~-Z?zp5f%yzxbr5<_cn)>ZL&x%8{!dq&V!W;&%^2Q?O7e~#-{Su zn`dWE6Z*C$_oWw;3z%ldw%D*KzK>;vsK0;oYVm}d8$Cr3j2Um=c1Ad#ZXj2CW}mWP zdY!Th+`lhE=RMJyW@5&{&c96Al)Zs;Lcj^|DR)qAV1T!+r5~L|#6t`DQ~Zw9+BZk1 zXt6cd0uE_rFo?Nu#hAeN!m5s!9`wqz_IanCv-PI>$-T4(vJ#V@y0{e-VE$0#%|1Pk z{{Fz<%;YnXa6D75%>E zh8Ae_K9F={e$Vys)!K$XzJg9dq9=iQi{R{nhklMro_~^4J2`1VfT?$$;5gTQ+%4}e z-E%luLx@ENtlOo*Rd;1v@oeRMiW0-NxvyV$j$J>6+v_kfo$QoP(Onjc01){&6?!#* z@ND+j^>iaZr<&xO>2ce`0*yi{!f2WteCm?*mBG!O9WE|~OjT2MgOJkd>NovcdpZG0 zY(`j$4`OfimsrJT9v>5|Vz|qaMQ@i{B0g}|ppE!jCcWI+i(${;7#)RBLMdEI;*;;k zKGD-oCZv{@d8;a293I7a@|2e}x~WNAAW2h)fcn|-dS6EeBMUINhJKx{&PaOW`1Vi? z)||w?dpAUrqsrK!LiAYnTuliwNWo0@ul|5xGw)0}Nz&35ZfiiE@j@`x-rK#6F$c+rQL6A#!7-^zPz zY?6b?h@oPy=;Y-0sNSf!=5cC2vU)R-&&JLDyUnDjllCBY-&EBEr6HI@bL@=`mzi@bM8 zA0by6-^9gN)&xs^S!4b;>Hb3-%A2)mzW3PE9lE^qNo5CP5#QT4U1%2|3s|^ zY4q9InU1zr6&_siz?IgDC>1@u&0pVXtbl|lE9-AL3oHtK?Zj6L5kSORE%Xj#7`hZ6 zDht|JRumT#81B}5%mn7(LQsYU9=H}w7Ox_KRd{w#cahj)aJJn>32d%~m9p9Pjt+kJ z!-uRF>#x1;@QM;plu+~YAAyZRSuotLz}4c!XF#Uh_?aOGEZe;2#Xtu%h!VNY0feCA zV^?n_8=GzLea02P{Pt1*X{hqR`c$1LKR*4P1b-R!|O@4O)s-dH`HDv7fx3(T?lz%t|lj~>}?GF}-He$dL z1%eZ25E0sQam3ytgtw&vV)+|>PAd@S zwg!><;*5QFDOSm`sNRMf*gDMwUNEgUNL7i!-JBqR9`DKH$IS;*UVRqw%4%9#WAIjB zt$p?K+q$|7;0c0-vVvdP_wVjN90MvaxS2ZG+0E`A0d1RBDsZI8NKSQ^(;Y_~zSm;& z=@P4W`|xmdcV8UuYl`A=V3Zcw1Ap-S=!Z;GN=nMpp{etI-UV$S(#@%Y_emW~%^e(Z zvr+-zbKkqy3a$igvo3CKZ7nT8WtYoPi5=mTRIaFB+*MeEVHCJBmdC35{bMyK<)z12 zrXZY~D1u?#tUW1ESGzb}6n!F>qeenbjx^Z9Bw+rr?$Q&-eW>&H(Pu@pDyd+y(OSmoI^n7_P2B9#>OS z3qV>;RP--deS^2cavH30bGlOv&-iJ5x6_T=6hhARZ!V#yfd50n(B@4Wpy|M4A2)eu z*cyl;hZR9*AiF+cX=6GMD2d-oY5dKXWrPnKO9DKuq9`*gH8f>_v@W z;7ck1%^b=P=^y$Q?JB*V>J9I1m5QbH|Gpg1!tsp>R_3klq$X?%p^t7NE;}ztdtxNy zS))%HZcu_*Gw^wkV226r#N%IIT(NSTZoKx>0*quxf?)7s<#{|$oe|5ctGOyUF~Y0- zt-{V*zhM_E5fQXokUt$gJao?A2bDE#SVUxGX*Fg0Gx=XXi8StoW5f}XiP+Ae=V0Hw z*%)a)lt&#YwRY9xVflRy4mfl?(@f)1vw?l|eSge6GsFh`Py7Y3F)=y+UhdWIWSjW7 zI4C51!14Fg2;9SVwGi_qj`MUkY~*baBOzCgKw60Q8F zii&z5dT`sU0sn~aU_}ZR>-b(g_wUQ(eskeuRTxN<4r$%&O%|mb#wQ^76mkmcg!Bwt zK{3jg2`u9) z`+)>x1&X3)-bAlHJ)s63rI1iUNy(3=RLFaDbW4-8=6~=g!Clo241U0y8JOZ9%ynJn z@6J}i?CWi&QRHym?coI~9&L_V6_^qO1GQ|uwH7!@e(9x7OpJ`yDd~SdT6log`~$sE zry4vX+7rU_Bw3?L$Ffp@V@k-Z`37acpP!w*wX;J*tYKaiMelf7VE{^g6?qO1#vTJ} z&(+eBh1J*Bm+g7cOVHFCuK^KmEkbhW89_kHVfyy@*$LP`k6TUbue6m=>^hCfB;n>)V|oHdFxCx#4#di}>-u#$UB%SW zavkV$2?+@%ap&MrAp%4Q&V8^~aqLtf9-f-=>Wp}Ro?`o-f&GVO(&DzM}$s6KJy{z?- zB;sN|TJP4F|IjTGE_7@zFq@ZFkNGK(5g0gzaqPS|s9__PqC^J@0V5-7Z<9FCUZC_E z3jAh7v0Sg3eH>vVyu10gpG$*LhxmOyzL?be`Q1#iR*J_ZLvF9Q1Faq!{gC=YHi5cWJB`IGn=yHrczLuCvo zH6&bY z-Cgfqf$a#`&T}LMcaf=*bPf*g0qGKGu`)6;Tf4h(7`ls0!DNBgMs07rksKa>`lZ2G zImF-JY(0!yJY@@p2HcUcF)+Xeft8gNL{z}7r3&CFxzEC4341I&C_6{Td$T%sT3TB< z+J@#j3kYZ(--(=_ofQ`qftv={vaheKbWU4?5%q`Lr2F9O6K=#CD7Db+(CzXIo`cbX zyNFf5&!0cHe)@qQk5r!OrL|$$pSP;CKm!Jvl64f`_&iYT-1>|$Qm5LHg^ewl&t?X0 zmgQLIvjp@UXk7K6@rI+2)AT3ZH%%ey-;a=c`M~)!)!z;bz!3n-GdRcall2xEb;TTv zym|T>G(g>L52?ICDj=Pydj+jtwS|P3P^c873+nk=4xrVTnVErx9&wq}kVa3^LM89f z(9FNCA&lT(H2r^ljw&wzG`s@oen3PdsFXXfP|=`x05Io67T0W5Ma9?iPCRp*BmoCT z9-g7`@%Xmc>DN!><+)OmVX=JT151e)`+V@~nqty@72x7w{7ut>=LGsqlm)ju1nN2k zr*St()?iE2f8YhLOD;Uy8^_(%-yfE_e4CUf=G!=EGJa$frNznCZ=mzk< zj#Wr#LR=4^^XK=gOT@!HJ(lo<&{M!nJ@d<#P6U!d)Kdtohrnn!zkHHIBU$U_&70QL z0s_ZCyFOfn$6%BKeiUdw8XW$>Lv;N&V4Es33dlEPeQb(fxo0`hk25479hlM!$6nQDOov9EP>p zy1KO>Bm-apB-ELK6^F@1Ae@}&O{J!?XuXTNA*Ba1*aKX zNV_99xwF~fXrzF1RpI=@=<-YqR5eV&w1C>6JVtueiIr2bq;c@JOnJ7a&r7ifL9Ca%>3It zNCHa@9{znxo&D{SF(6-K6FvM5DB|RFw-2-e3IqXz2Auw>_vB-&_g0>%G%fCOlia2l z?{5{MH-&)%;&Yo3Ja0X{Dd5lw6`g{72}D%Db+-6<*g~im(KU~r0zDi-58xe|mG#QR z~v*k;jqgCh)ZvUgia zU;pL-!oJI&C0y~3UGrF^Jj@RtDltYvJCf3h3e5wz+h(_5%&(O_JvtVEJ_}ffU?7xV zI$Hjka+G`+2Wv6!Ld8DxhoRa7U@t7}0Z@Lk<^W=x-35>w+Ak?h zz<7S-0`*^GBoMmP?&Djw=_?t+G^$#g&EpXN*fb43dxD@P5CTL1SeKTD#(o@hVAlxo z@bE5QzFabSH=sqzooyL}td4MkrY9LEr1kdnkaL-Y;wF;5!BSlVZTOC z0SvNSo7->F9+6siaklBYKe|Dr!E3jwRqdF+af5}cwFYFPIfdETRC_RRED8fKQuDUs z$4vfR^PfT%=jK9pe_r)%iWP7$13NhNTi3avndav%tPL!hW&`%5kJTX505QU<`-A*8 zcP4Yznf3(kOm0(R>JsQvhu8hzVN_FOcMk^G6!rEdfoA7i@Os*PGZ6e8+OieDdQXDd zZHyF&!BiKTiU2BA&*iloOWy;eM)Qg$J7?r751Y@%pBwD}-Z2UurMTPg*Sk zm1DfjpgbHJVMEgmi0Z|^5Eb|em4_e0gNR+@ZZM_a*qSE}w`4?xTMZR-7nCtB|&kkDqu@AXN) z%Jb)@_19z8z^p6XeQktY1q%a13_T3J+J3oFs3svStY0b_DEBlp2K}j$Ac8>=_#^rG z`7?Rp2|gNm-YSU>(h?$Sx=7%*{VbVu{XgLvhjChOnchd}mdL7S<(Hmrp{Kxtfu1R; zsWhjbQnNwq2{TkuN-C~G@;X1P6{jf=UmWOfLZj#eyH67_@56^U!zhe(ddcP=-QKEW zsr7Utn0;jrngKuPzLubb)!&KC^0gDTp#VQWG4yLUZm8n7JhrBaF0`q z|J{mtaF%;w^gl3_zY*?0D9Z&f>HpxWK_R5p7cX93)N9g3b!)E(MbO91v+jx?=*| z^32bA-WIQcHdd>vf<^Yp6H`mOKc=vcJ&M*b23Xb9*oY(k{`&2o9uSFJO@8NxY{lSU zWYaX53c@kFwpv(cWr+L$Ng8QM$*>o>>a7{5@DE~GIy$<;qa!$cM3Oh*7&H5o&22se zky+VDmJf%OqvJj_)JldvIw?v^tE(XEMC7P-S|IfF>Ol7t8j1tIH8X=pNEjU(`{Z66 zJLd+djZr-)Mn*n=-&#~Qr~{fIz93s!ZX?&bxWqb_>*B5JXe4d%7;d?WNf%FP!+ z0TiMhUCsiPoHY{Rqh5i#UWJRK2cCuv6uYJXxR!0hn^-m=#p+d7R#!Wk zaNy_%#{dgbh)G5W5}xt=1dF)m%&?ZBV{VB9bG`tGwL#ogUd|iRwtCp_NCHh0UvgK& z*?VJ?08O7ek$<*8tJMGW1IX|a^P5cHs^lQbt#lwW1}aGKuRSG4_v+S+v-?mOC8gUvy- z$IFT5#m3W2jxY_R(AOs_IT;ycnF-|RKEWIZ!{?;Y3b3>UX*GJv+bcJ&-?$M^{|5Fi zEKmqD6F_S*7DR;-YjpfbidKFBctIAthi_f!#%?y7NERfluZ zCLT}?$=Nzw)ZlSzw63dZ^GDnYA%JMJRrCx&0sj6n^N_Eyo(Jq1xC#pOQk#mP;C)c8 z!e-T706kxzX;Oy`HA}h0XzED~Na9!=wUv~9FD?!nWWzcC%kuU9``io19hB{*;I9HTc7(zng^I&m`^d&TXGQsL#Z55Rw0K_~bhze_J7M9!8B_{o; zU_Tdg9t3GbcnUOZupkt`!7h1W_vqe!LPUgj_y8CK0)Sqdp58t?n3~G87P>Q#4) z&H1SdVjl#edwZ~++Gc;FI+;0bPJ$}$UJbE5J{nqUu}$kRHt{TtHwd?HP`Zag6Fv}Y zLW>`eURyu{wjx$GqcJA~hUjq9W58GJ;&`~OT?3B(Y5;HB4X~sj>VvfL1AhUp^Y4#o8Y1DTkOZ~bB002SCm_)PNXT(%a(GxH zLnSO}PZVaI>WE&e4x}N5s^_AILCkC&4@U{^aLl<}?CJU5))rM=Iv5Ab_f>EyL`OtG zW+Wum3f=^^)xeF=jzD6khIiL0m?%QPJN_*bB;&R||A+{L9o&bsJAq#{MX3b$Jv~-| z&G;azaiige`#*^DE26yExTlc~+E~R3&n+&7M?oZ zX$M+N{UkTt>zSB9Ac(+DB`b@8b+&{1-oAV%F}_R50VTgF2>QhGhPEt&7Uo;ed)D zZ`jq;8?uTKWIw>N0h~+d7#M(_0bbw6Y<<8r6E)~Ebg+p@_+rs7K852;VR`C%``EJuBnEm4XoO+ufj$zNiG|Agr^0D) z2Lh4n#{>cuQRA%dMvDil1{bel*i9?`*EN)Sa%#OTF6Ly7h>GG^wW;MIsZ0gq%hrke z9MLf@9X$)oC3n95{{0&)pCR#pGNje3tA&lU;vCXWQM${GspA>roWj#{<#pj1z@sfzIyz~E^NRMS~spq1DFz7ZvSUOkb!3h2*@SS zVOO;r`FaTzHpa%-jBhwX60{;SJ)Mr9zY>(jb?NuP6vZ6kIoP?oC;z}BL{oikBvq0F znL*+|Vgs+KAm$AN4fLpv5Cyg#&mHuu6`7^g?_->}o~f&w)yOHUX=)OgK3ZVB1B--< zRlhON>Ba+me=wQAi;s>b?R;XSl@%l>9cV=j!7jEtNr4}(^GvMOatbU0`t@3x zn@g%YX^CwsD=OOOZIRa@qR1CE)CcclDQUSF_Sv6YiD6+WrQK0*Bm9?sR6D(%ScCRx zELOO8I4SVb3nC&S$|N|t8V2pEZ#BvX{RPV1ng0M~IVWu$9fdOSXkXtO#jjMMl=#Ri zaWSt5mA_bo7Xjy0@suCq<8I)d1W6NfCoIC}zaf(FVR`xu>}RVTR)=8s$HB#=#`A+M zD>-?}8{-b-6(FXxJnwm^U~g}4Y`lOH9EZs~rs)UJ4uQ2a>t1P1j2$T)d#8}f2J>!M zT&gr-)|Cjz=Ky+!^sf^XXcjQ*o)L_((ujzh!*IKuA1(TbrxX@$LSzFL1h0LpASnPR zireq{w_wa7Dk>_H+_$(3ksY*ugl?21woR1Emg~=-@T_p^u082|taEJA5 zza^=x=dpM9sT_LBr7PD*xCCY$hSo2m**^-kVY&PY0UOSVg_xiNMC;h1r@&RlL5FM@ z6BARUEWKwy-y-a6J(>N)g~cdO)+_H;D+s;;5RJ=(E^ZLeL!ON@L*)pfo=;JHWW5@C z9xVym=2-%(j+f8`uzJBx+k*Vc*DH|zhD>Qr&Xcr$aN9~z8UZ{6HoSn&!I))S;J+^E zp&iU5AX@X~LJ09c)0R#*-uBA>Z)I#99ZNv(zfG@mW<7eP4t4CgIqxn&M-Lu6C=0rQ zw#D_nxRbmQc2Iy%H8nLZAmC_$?Gq9&WmugFsIujQayiPx^WT@z{`?x{fWYKG0QexR zbD4F>Fo!_Tb#UbXyBk-L2z&5T$}@(tOR>Foy@?bV0`1YO!5nDrF*pd*A5r5P`3s+r z5Y-6u9|V5^{xz0F+N6$~laOSxt^`8_SVQP3TU%R0V~dN6UZ71>zljyo`U7zIQnSFb z*0Zf9>?c*wh7lksfH-t&@ST8RUs^IbJt;_gaQ}Y2&(hLTU|^u*I7}(+6eUfb%wBP3 zf^o;pcPTdrfokmVrMMF&Ws?uIc+FAM($n)==q5h3fD>{I;@B~+D)q2GqhnWAVqr3e zCnZ@;e|$4aWDih2F`oS81e|UVRR)p^f^qn-o}Qq-MS$o*5C(&}L^r0PSt)qd<3)>t zxI{?80jy=f-K9Aal2}r0kN#7wTcO(>(x!SJ>H7*qA!%AEFg`N}@m(DF4AFW+)m|nk z&dMKh7*OjZM14db9v;HRiwY>vTn{!Z?aRTRpIpfKt0wdQ&W=`vbqa!&S6J=cHnn>uQ&=?7z5;*$*s&u14rTd|4^sqsyD{SZe)6!^n<-q3|W|~bUY$mM^u+^yNTe>V~L`ww{^|w043Xee;va|u> z8#SaA=FOX1;WiFE3H$>UN~UR8tf=}y{A$JjCF=<`+lLzK{|$koY&4*qlyn=UnMn=? zAsJ7l7<2G%EF9hO5bC3sIebYaKWit)b2=MNLe&o?m4anD#g)MY;M66X9>K59s zYkU;XmR)z|Fdm>fkE2R%6hmJ}EnqK(rqjx5va+2}iv~}%rvw2;OXYf~l(3n(c?bOq zZ=9ZrMLJ&I;Z)-C&!6>S<3oqaH=XVL&&P))LgFUvq0}&mDgqg9pTP@DImw;l`3D8j zcQ7+Dc1}&z0d!2048U0d<0WXUiYpHJB_W_Y0GCEyz8jKV6G)`OG69&zIQ*&Xgos>D zUfzNQN#orvqzOBoQ73+a6UHqf#4k<}&W6=DY1R3ukEiiggy2U@ZSqf|Zk zBqTr#a0OF0gKr@+=J=oLO=}w&d$UO@hEj?h(0u#hoEkD zdnKINJDq#uRdLTQ?Tbk(7D7u+O-;zdL5>DueHnU5WtgH3s#oPvT!4>o9Wdi;8k(96 z;rT#1(OD7`sr=g0Q-syq$A{gEE!-s~{jC@jWvx?!V%Z?mQj04*9)*JSCW&h;UZq0x zNQ3`Vj#>X3F4`MnD4@wbC2?B*>C<&K_3Rb$+HU)^ri28tg&%VO>9lU&!n=Fd2NNPb zmV&uQQOK`sFFQU$aS*yB%|H?B891apKz{J{{@n<>LB|hKLBa9nUnVIgv3z7tfdK^$ zcaYeSQYT#g-B%CEwrIGc4xcKR388XdphN)1HdX3fuaZ3o2;tP3bXg>K$Ls-G33TEp z7_6sK&6ICIjq`uVCzJH&i}k|kmy?Ey+mR3fLbGw`b4dDY5vG>47;7|}PE|x|HaIcD zL6bXZrYcU(V?o3Uyd&o4MUOL705tPN zL*mqx>31;8_!oc|DFd%-?v&qn;;aJbW46}TREb;8Lhd<{6Ap&(wd<1cVPUvP3s_I- z3J@~oz#62t3UsP{Ohe3W&+k0*K(G$iM20s_hl*i$ zK*$gEkdiXpQ>ZHj27~uj+%2R%^xui82;xC~7m|J^EZ63L|9(_f0?7|JrJxaYz7GDK zJBG)MA;;2gP4FGZKQTT99>b;`6x{HCtLm?fB?6X#m<`B4&%w9; zaVi95C>jf*(ZbE>H_v~@_M9_MO;#Vn4J<%B&c(x1281qfeCnEa1)u`vS+MH@QGl1- z7#6cZzxBlxedlQ(Lg15lWu&lv_=9_x+Do zatp05OQ7E-dRU*?Z~FHq9}&Ks$Qp(V6FJ?IKsEN+`tt|kNGKN{vWO&$!qyQlmDN+5 z3MN}1!oQ@#7}~b*W?&_4A)Gjh~`Y=R-gGH~+D=y79m15Yf=`F8xcT_^*=x!&j}h z(b4t4X^N*j1PH{=z70>6-Ea|J;*AdHB2w(qrAv_0oTE?fs{`jImnc5?&K4KvA`vQt z0l0br$aDLS$}`46uk&5XznmSk5jMMm9U?+PUrfa$p(EJmam8I+T>f&E(7x&s#PZ+8 z!+VDbxs#|R*s{>R3W7%E@>?{*`~F3bFHrA{d|Uk<{so4DOe^$Ts`%V*!rTu_3{BsO z`I8NlCRoAfP%G67zEZ!TNjD2UQmzqNP1WjXYMS^JqJDENKr$(WDY^?XO1kRmA8>Z| z_menZJ%y#D3*!nAZm}1N)u2zvy!ZGRZlh51n*mILmsPg^Fk9(sQB(-vKXGduwNZLO zw(l+n|km-Xc7sdTqR)g==tF|ZP3gKxKAR3m3T3Y6zc6pECjs4^53G$Rz$2Q&~g@E2r!%pPC|XDlNj z3ibZqS58N90u&S(l$7XKRkw_jHD@nOb5f`a+LeN{Ge}3FCcT~B^wt^SXT#5&jhFIE zv0qG02y4lE)&EAU(kbSgot@c95l%i2Hb_XW#248rKY9zjZaa9NW$kB;?z-Opb(};G zgpmJt>7D43ga7si#bnSQpr90yLxq9guwW>_z^?x%2o?%T_{;xahidbXfU5|9;l{>3 z*)k4K#u@*sOa74z6a)z}MFtMkxHU9{Wqb9MSG#sO1m%@8zC#N$5*^T6ZFHg#3KBh! z3OR^Q_aAC8Wb^-FEWYSN5W_9L_d~S7)>4^$ixC1tTHw(b3ZTG#Pi?_VOD7$k+c=*> ziG&1=Zw~MbHtH*NB3N`SMkbOSrRLyJ9NL_Q-R2p1_E*`kv$)X@PxWv~qP^z`I7Uuq zsC&gCuyh!djHypHS4z9ny1RR3iwW7-sNd(?8kIPmkRm>K-Y>MftGr$nzBq<}=6o;H z(^xy7ncZJKCpizteop)`ge3H_w@!y!EYPyO|OgiM`R3#>E z*kgldXL&1vrB5FD)@-cA$9Z$}Zy7^;cz9ZQ`E)$B6$#0bZz?@~ShtF0Wy8)+Ae7IWC(iJYLmLDJwZS#zI179=vf7C1+PIovzNxtKV1G5ic)Cy*(=Ejcc&Q!zWqhEE@yL@{P^U3lCrYe zb#UpHPlv@cOvfpzk2_Ke6PZg+z_*8+f3ylq)YQalNT(VrZ45_KU+4ZHqOVaTsFkxz zM1SIU430~r+WCIK$tfOU5 z%IZZ{)?DArXDcg4&eyT8+>UyK(IpFlo14q_CmU$x3oNX*7(d zOcPUA8s>8dtSB3il~Qtap1-*1Q&|ubEwK4JR9V&daKt$4d_4E}Z&{WAV~d;8@Q~#4 zgnV!X;p{A?&|{!5mA21g;cyy@uURvEXmk)~5)V7as|?wvH$%`WF7~CaI8OQ@7?f3`T#$#Z6gjR(gD>xeUh!vEc@zK-ELh-8RssG_?HwwD&$7c)ife0`I%@M^LLE}fd?81gMx;bp zxmy~AJyrGEtE>9KD3!(rTjs1LE=Xue%TxZ1aWq^;!_{sfftVjEkO9B+%{DC38P!D5u2tZ)$9+XwJCsuB?c z@nR(9C!?n?ZD}(J`qR1dG9Z2(MJTseHJ{1flEl(t)28MDnR+*UyHP1AHt#7@n_=lG zEe*T5L%qJT8XM^`zak{eH=jVhy()_d`(v)&<$-;4i2ub-_p(3YVJtG+2l4i1jL!or zyO-e;GARdx)5Aq@0hJdGn}ERBDC68L+xf+&dhNuxH&@FEpqGzFJP zh*>L2c`v$}b324o6!+8BHPY=3mY!pZ25M6g&CDRJO<(9h2GMkdO4kF0@s{W?3NBMF z`|3PHyG`L@H5bd!F3l$c5?}~Trc%Jd=1kaF!aF@CJUU#C{YBTxoowH~J($OaB%cY4 z>l44Hx>J$q$HoRXoz*14cnCs=rcj*(mefGx_yP zifP%HuqWGa7bU&Nd>*-ej)iKZw!x`>13;ovEy zMDs33k{)PRJ3Mdq$1JH+omyn7M;VJxCW!TID+i`>on&ODKi+zIOO=(K;ua;WisdNZ znveI4mhyP8LnMbb|1FY=^6EK0d=FGK(N1G$OeCadtn7tX+Gh~$|MS)R!tjN1ya(br zhL=yGj#%_~JUIi{w3aZb5RZBFFdsJACfR|6b>FXEp4Epw^M!WB(5!A z(drVoRP}{YO#zLZYGtvGoCc1(V8Njpy4c2CgAn6Nf5FJeO+3#cIr+gu)cdn_VC>Vs zKMjBWXz{tS;xf;rbD|K&i=McEnp#^QdV+uz?4p$lFdWFJH{|>1XdLV}Lc;jktG3#X zjT;v6w7-ROyGgSPhya}p_Nejkw&*!oTSEu=`xaPOk_W1;zkBz!s$B1^TQ++ut80g# z7QHwGV8JBrS zRXrI%mXm#rlYNP%`ngngDf@*_UYJXTg;LfF-x(Qi%_kf2gh)K4!{XxOJIrH#PD)_# zvgZxMJErKTXvkkjFU%ZSNGTRKMO^t5!BU`0`G`nTQPptmiVtlUdcQUt5Ov_QInl@` z*3R&Hft{-$bQm!UMvOc4qPX;3J9-b!NwDZ8LdwoARbE$tNhu+LJ&hg|P8fbm{V44N zjOvC>DgAN%UA;4=a%2fijW%EO8!N7c6Uxjde_2`v6)U9ZcG|R=$LxiogK~RRikp*? zcm)O3-=9f4v6`x?#<5*YJ%xUGN;uo@4pk(q&RZ>;vV7-?bfd=t9YI9I_Dj$R=5|~D zwKhYjBp<2Iud2)GLWN)B7Jhwkmx#Vdl@(WxFB9d%DxNxf6)^h}`~ z56`1S^jvVD>G}HU4ES#c?pYT_hxw35LRu7#5G7-k83I=O_R!OhEYJ>khQ4f z^+y|*t6&srTN}u8IE!vcOlY^zOl8FhDiIkyqocKT4bH{h_5S^2K2PP^hok7fg^T~o zXzPtmx#jj$J>{8+TD@jHV*j<%{rSa+2~%t=$rkR-S2HLdll-6kM~WW`D(abqLRV5M`M-%jEZfm>gz1jI3YT@>N`-?egR=!@tt=OEbS=er*xBaz8W`KiAQuaV8hDXcB# zLPEH9_c~>UjMe^jFfO3TNN@=_90nm3UC;N zGhI(p6PF;Z!`?v8qU2AzJ5D;+wrf}@dsMuZ`r`Oii-Je*Fjj_MK zI09VzpZYN0-TBPMdIW(a-rTC4oP=T_DoKSUr7R|98xVtq0ZB~C4Mqr}`u451l~+uq z?(TH;NTWJbl_C322@=Baa+ksUa;l!HC>K|8Y8r+l6-89Ax!&s)wVFZ9xk6kLF6$K(+lbVC%{6-Nn?*DY8bFQS(xjrOzL%S{&sK_(}(~=yad~F za>$vZ<9z@G4jTUto$-G%W z>&9y{5&DT515*(nPhf0pVP@vU#zv7D4GXQVuP@@n4g_R*MSHmWr)aT>Ucbe_0QUVk zo3aW5ggj3ATT#&-v0#Ou+jkRjxa4@rLPVYnbw)5bm0?X;wvdEZXIh)5oT1@v0&P*Y zkM#VkwKJj48lojbB^$hw1S72Hg}Up}TrDA2pl(%8X{jJT|8t7L0}6^6A=lR0b-`o& zXroRcynV^>IZ#e9oUN6|MD41plI6yhRaYOKRS8)qr=_QxZtZ;#>*=}pAcma6+@H;} zudXJhkWQ1f{xnE>TO=2e#j92?weo!v62a2dS7aUFAO8NDlA0w?7MFN>8l_QXii@@L z_QrQ-Fs-DL9>R}+w5_h8!p?rMun>%dYZXmIud`5*mj@u`k$(UHOn+N>!y6lGqoOu@ zg7Oq7In2y(viP+~2^lS{006Ow!O!RXZs;*8pp(F1jchiFGnyz_jFw~^`h4ezOPuo2 zq}_{WZGh(ZH9^bFr2;#GSIW_z937e&rnr!(u6;gIO zmphy3)VmPWI5oA)8kf(g5;0re{)Bb4S7@Yml9FU#kk#4QUOJaXhnteq6Z@S(dL|z_ z#8y2=QFCWsRn@RI`BMLvFDm&ZtQm?LSB1hTaX<%G|Vv1o{l-|LZo~ptlDH z58ODN|MRXcM|Ll~zc@@T+CSeo+i;_*bA_M^(89P63 zdw*tIPRax&?3aU$dZU#TL-Hj)9%RZINDAda6DpizkHOA?O(Y~wmN3p`tL&r&1yvaU zf_*C5iooSbO7dVcn-bMugM&IyB7^o53{B0@1-N)&>a$*(`t-LCQ1u8D-~;Q2s3`o^ zCM0+M)}8Nd;WKp!kv+%D?V2X8X6p( zCWh8eP(RTCE9EJAL?Y%YhA7v4dsL!8HM6O=$CV}JKBRutNHPxD8sx>FC5^1fcli~QR=+puQ#p(}&_25-kQqq%@98c#$nVyDbPLa$#@Vbec zuKni3$S8)30yRbN(2Az2qtj-;(K#4Hy1%!_nkwrj{C#&MNh|_qnAUYl4OW-AxFS+T zeW1Kj4219zS}-B(Jw>z_vqUw%j3G{(Qn}PrP0c?Z13=x1G6q}5RN?N*^6kXL-{BF< zVq%erSmF@qrZU85+O-w!{rs34^KpM2L8u!Phj8HtTo#|JoiMK}Xgx_f@Mjg}BTC9t zOUto(b{C~Mn`3fCIx2#wf;@josz7jW0xC>Cv$jFGp5Y|uy^QVf79Vu}KR!C??QPK8kC67ZvS$=+eD!w16m-_=$Ya~B~ zqKF6#r;&vPXtS8s1RHzz_07}v`)3L;dob#Jwt$ZH7#=h}2>}e06O#K&^Tnf=jlXo^ z2ss~F`q9syCjy=ia&iEq;23xpvKs!(lYxag*#38eLl&qwygT~n`zl5T9^A>*;tn!Yysm%cV}awz<&EAmvv$fv6Pny4To@-%U>;AXweW{9>6{Mu3a9Q*# ztnmLK(PjMXXSlisGDm&2@lQDl6cplg6naTxV`Ej-*+3Mbm6a7F_hPxuyv_Cetn)-T zBvHR@pt6Gf7oP?KoDK{Wo#eefOlf)fWIC7q_CVCq;MCNV-8ibG)X+ZQMSLxoj?C4= zg395(vIuf?bseO!vbNrhC4R^OoE`aZg%br*Sj5C)DIcMxe1YkmK6J8yCe4DUQ|}Le z2a$Ii&SL9Ig?CBOsOacCHf z3Sj;Y_`&fKuss_?Kp1+AYj$EOEhO~ZxFM3gqd*n;0qVx}3J-T;Vgfb&-*@ioJz(YA zXO)#Pv{R}n9rgBxu@kWW`2d9_PqHYSoSd955i?Nq-`eoFJ$k&}@A7_DN7aJ)k`a!m zZj_r=&WOG~4-2Kp&T}i;?EQR~%%qc%k)f)lwn>bFIQJ_n8m#=oMcwHu;1TQFm(0%3 z3pgFb0*m?70;qpM^s7sBtz>|++)?wKI#BT`5ZoU60cr|U81~3uslOi<+i=})RO8VJPF=G+V{1G@IEMSM{kU1QMK?y4WDnH@sf>u|Sgx;^9({%R3 zRi%6^JtC-|pFFf+SDyFA(LQ{Dg(i2NE&71y-6Uu1{y3g|mr*SdsdySr4p&A%h!zsG zrXVv~QDt`h*g7(D1_!s!$tk0&hoYv&*X1*%*6IEB()}FZp(sg3%)2IL;Okd+ZH0!$ zitdrxczFNsUv;*C2aKIh5`Yr#o$0Q!&wON8)o2=e3Z z?XfuX{bX$HHllaOe|J))QGKE8{3esFsD3vcgj9$OCs4#J$BaQ=Vy9(8za8tRui>=5->7 zh+v2cRaShmAoW29Fy9c6_ZP2+%g|67=6g5Mz8I51hE{I9Z83Ry4>fGgj+I`M{pKGu zR#s|qa@E&YZ&6X+zp|>9w)`5oj}H5*3}WQWRn_D!t{E$;B|wkGMG#mkHA8)ph(Qt1 zn~ z4Q9Q<#n)7jql1HZ}Fv`*zbx%Ac2( zUhL=S98pkeu&aD8{+XImL5B1-xPUBWo1Pw|q*P&K41@JgD%z{M+&1Uob}DH#oyygt zDT^B=_B_)y{qY47DoeGl-8{9pPV&4MHZ+8SMiN?>a)NZvDdc;zT({&j_H_H`?A!(e zlfcMOZ&A+^9qmaYJ7sY%rO!v4NnKUd1^1CWa3ocB+BfM7UJ51#w1Y#fwUsnJGF(W$ zRDR3B@uaJRHlN$?rHRui{n(b)9h><~KA)PJJV!IV4u+>6BmEJe-0j)o5F8xo)T^%^ z9=l+a(#Ll@wt z=}kTt8FWUz{xcp)9UH{Qj{)k!+w%{up73@2nfqJs0e)RjDvx>8`MM@Y3C@8{yz0WE@l1%p(8$6m&ZA*GuE8}Od zwVL&o!#g6HZ+iCo-FA%HO2=R~Ht073CI`p#BcFapk3V9S|FBnT!Zj=HK5)+o-$o^E zZ*(nuS%!4=PQSlB+jC}b_@rfS4=_18CK&BPg&roMTNJdk6qj0R8f}u2laqS7)!(*; z*uKAp5NDWD{KzOQYzY=;ion*=%`niQO?A6nYkN2^%`Gd7OVc)Uc7{oh0`p?v?B$fV z867AF#+G*q1^}R!#Fk2rjjidy!p8QJ)+@hdSH_-kd-EHiQ~2}Y%j1UN)6nWlYv!Wn z#Ycah#j3DiQid=pFk+1v;8nrswHg zkX*$e>Ha4#%0Oco88kTfb3Cr9`I{(RJ7Cn0&DA*p_4Zy@%ay`*z=3{=ES@f4s(AZG_CdTk2) z&OJ0VG~W$HZd#ompocD^jB4265!rkuV&Q@M+w3%~OB_K92!9g4>2iuhH zS|`@_F?twbf^jQ?e|{o92{LCf%VvabWBWyHHC#X zBxv@B1lE>endsZh{evc$%ui1n4eb+ZNz$+5tAx)|OqLd*pP28CCddoznRJ^E_T(zA z(I9l?tsaA;DMIjYRfPNx8us=z1ElTU?5vMxTm3~xM<8+vzt3}hJ6jn%k;$`nK_fq@_0^iNesbr@iN? zUzvLaCWg9MtnXxh{p4i7xcR@m09-;YGtlPdpDa*VS)XP`j|XvCz>t0vltVSOyVh1) zrb0+z6#@4}ag9koFYKhN%N_!(UrWoE!opoyGt3l5QM!C;Nvg!8hK3%OJLve*R>9B) z?=~AGY09$QGVkAU=n%TH0@!CDgC+M8b2N@C(L+V4d;s=L9*lvht=pECSwlggo<(N+ z;vNf#FkVdJS26+bfuA2RD=RxHE1jvHzK7sq8(})z+_fJsUOwhYcq)sDHHnj%a5QwQ zmA|N{palhQ{RpK66GeoE(lPsVcyP!SOn%fiH1PCP35%e5*=Nby{Y>)B&W_B%n0s;< zAwpOdm9{Vs+Ij&jMjl5cQSoQ;wXM3fVB=f!B9n7rRYCpoY+XK2qu32+e07Hajvp9e zj1D@F8vpkl;1QaTYgf02$L411>%FinJONn+1K0P?0~A6ffb1(L?0s3tQp;p&@?@mJ z5Fh|c+dG=Slr)rUlPs7M0QE5MVf`O-oNU%??~ZEY9N)*rUe}q+&@2gA&K$S5dvFqx zs}2}uL`Mq}6U$Lx;I=grrSWUs(Di#VW6#ZF*G~sCi>$gzpo0Q|By=PqW-BY3=pP`7 z2rV(G0YlKm#C(H7d%6Gv2;2!nvdcz@e-3` zsp;|`AF1if(0-JX)3qzVUfn<{ahxv%YwBKpX7AggbNR;hdpF;P{%iF@1Z6Bk($irq zIsAHON7}Dud*C_RGxfyN)0gALbNAO3A?lCsoBxntaksbYtgQS6-|*f!Wv=VZ`MSvT zCgdf|0jN5LLnC>b6w>_7Ly8+BL3TLo^?PRJbbI}O`HacYGlty8c&Fj^KpOxDF!^X~ z1KzZ4;?)mB0qi8q+2Rd3IWf?DjpkcvDL_GFfp5qt{njR_>8nlo;>#A+vqPp{L#d4m z>u>tPwdxwrHZep--X*j>SqPZw4KCYdO!WeuqMlss6Qh_N?!mqlk9Rt~0q}*gr3mNE zN0=TzfH>NcaGu1(f|;{@+4;SEWk^3LEof_-n@{j_n1~y@y9>)l8`#)*0ncja3UdCr zyKt`KYH4V-lys7i*H88D9<{q){S9={w6bD$cH|=>2nUZ;R1NH7f?$ci?IO~s*mP38 zChM<#yuHo4784?y8S(|y}uGuA544jHhHox~r zLe#d!D2=r!!|3qbcpT05w6sLiCVa>#D{PQEDYmeX@jEXn!s#H@14A^cEvRbs?60p! zMT1{j;t~VpN)$_@Z8tRRBar8Vz^z!MUHiAzC)M+?d4kQOqDUfCV4vp$$`cbqyR+Ru z*u$nmCLoHH@=Zb{c5*5zCNe?)G&tp$gbvII2=WZlH7FERoa1kRJRDv7tBy((sz&T5 zthssC>F`guEjfk}9<}eSgev}qUTkrr0iH6pc-%k8E9Pzxp#f{P^?Kk25#V)aiUYwKJTYmIfm46b9=lZ{gy)a&a^m9;;7_ z)r(F98SL*e{ct`VQ{P#fxAnQPXf8c${Sz>#qm^1#&h>j)0|T?V-pLHpT1y+?7CK6p z)jTbYYLawL+mf&_MY>2PrdKw0Cjc!MsBLP>kJq{E!4O?R-_zIUee=nMf@wP%S_7-c zsI2pyxrMse)7acrFl67@1V%ecHf{GG+1(tI_>&%uSz^m0AUY~&*B2+V#_>MqB)|l$ zOUrkHahsOrZ{_sYHHQLv zREV)_;fzlmo1c$9J3w+BS;Qr0zZy%uDPzF(_U>A)Lx=P#WQ&7Z@bO+4ulRog6YKmx za$J-k1JWgIVd2B_GQiwIgq)FdGvCqGlpUx($?8d2hSt=Cwem&`dM2cV#JusW^gt`{ z46k_9R-Pt|$p%iX&CRuymaaIp!bPbM7#bGW$8$NaAtQ&vLc4?*KAx_2!NZ#fxz`aB znVx}(v^7HoFsP&|6y_kfDZNHU0QiA&hqktiisk9!hQ0ito^StnRY$|rT_LEe8>@Y#!O(bkuD-a(&1`X*BCAQR*$GD+6$t@D0NMA=gmRrQR-9(L zAn*J4{r8#eHkC(|Og6?M zF_4xq`lJBa7`VHCG&MJ0oCAuzF=q#iXM2J4D52&M9X5-p*n5fbR({vB4C}><;JBlr zBC9yT+W6B;4+e$^UESYsq<)H_*^?tKgt`h^_(FkH0MU@+_zj8Xz4rvEu;_)`yC;g) zpX%4w4;INWT3K{63%WsnAn{QxnM+5)splp0XXn+{Bc|A8#$*$g*qoKSCavV`>G$E^)#%H+n)!E{6t<2Ob)h(&E>WxC&=J6x7{Mur9|S(M-Lc$OA1*uSSy?@4LK#5`n&{Q9TucZ)Dc!J@%_4 zK3-ltM_xUJzhi7%3{DS~G)Pb}s#AAdHU0A`S zqLO_~|1S6UQvnIC-`)O+h7-DQOf1PS5+~*o?$YL(Mx}0CvcQb?%;ap{sso3P>&p42 zaAs(z4xN|?;Zsldlij+2Nf2z$!oH4kWr0V7ww8xh&-Py2#b5=oh+2`0`G>EILovhe z_X)m1&_T`#Qr>Y#O#^`a^LgE97k^oTTMV>z!{>FlqYv$Ov6w_=a*f(mUyrnFUJTdO z9wRrYT^lEEzl$xmW_l>$5`}!JK_9;Sa7wz~DYL6WG9_|T`z)L#!%y!Nu1M$Qc~_Yj zkyw-jM}*q_wj}G)goEakbf7cs_VA^itNyCK_Nty0&oF06dD!ggBuSdRRgtdU^|ZiP zCO$jU<8wn5K%h zTD!F*XHxImIAa-VLN(`cgjpQQKz+ehbpxGBz>S^?xT#g=4xAc_kqFjD+^uak!tJH8 z$;vs{`f2yagsbbjf}Da}4fP=g8%~wy);mkcxX0G}x&QpuImxT1F78e{yQ_J?^?ZDGzxd zUQ*=+#(J@M&2%X>b%;c(&fxjIhR zDliVm=y$KZo;xpQD5VRdF!#8#M;oBlQy|qeo$h8XQhc!=a7D8wq@*3I~p}6 z(2~<4uzwAoy@<02M}$B(`Kj1?D$_ed=;??ujX=(+0pj=h$V_#vvZVHgl{uo^D94Cv z!0zO!CT$?i_?Gh9htJTRWKS+mk-oB)+Vtsv)Th)xtQvPU_XtU1yT|H+C7Y zK+q)m-j4^`J}wODYX$k{JDWT{cUR*caOZc6S=A|GAKz&k{~h61J=`R=kXAoik-pV5 zwr<_ltzO32kAyo~moucL{bDFP!dXD2quzi7C%5 zEzh^#VV|;|>r3TCJv+DR9wW$BUz{7D0fHD7q*s3XeQVJ^Yn>+s%=)G2_1J3a`Z*>0 z;aw*&Lj`qr@vcc-AV%o3H9%l5Fd5CBsu>ML|^ye24bd2(KCT=9b@O2zf@#C~9hCy$f2mN&413W}vD)uVo0&PJ-slnX~n2XD~& z1R(^S@2P&7(Jw6QkT&7?EnbD=`|6UC-r^<#B+1HAcsDH%lEg2h*2ZT zKux)*$us?uO6K>oZue>SilTwnjjG59x2Q>arV($i=f9(ai=Aut)z80cYO!yR4h?Dy ze09BT)gVraz-IBUH~Xz!nu-(tq;{+QeDPUbBYBIyoI$#bL3$=35C4`U+xx!Q<|Ekg zY)Ik0sS8@|a1CIg;4@JvsDd0bKR0~)g+*(LO_v8ZN_6JFw zz#Pgveo`cm_EZknVUgn?!W4RD^(^%VqQI$2dwVhc7*PjXgW-OCZG( zrl#MpBc$Iw4wwU|4-4%Fq`=#}v&~yXK1(n&5rejnvbMJ!2j>stx3KmS{=nFAP;UsXoln-cJv$mKPy|MV|HMaf2xEjMa^sSlrwQ#fHk;#R@J3@b z(~wjQg7=ppYvbpzAjr)usRn`?sZ*xXEo!4%VvdXYXsY5Ol~W*UL|8&*ztkb0P0=Ip4PPjG|~ktEko3Y5i^U zW;eIEp>z3PZ|nEF04$?J$g4>rvs=OGso?p)@)wuMYbyKR{)D?#B_CKC4xFTWS{jT-g&id+?~K(ELv=~GCW-zTm&UGJI9Sm zAeibJ2cM^nx|cqHa><7>vD>^Z-2+NrRtD zZR3mXa4^UNws;|ODoLd(o$3B!Il))Kc@GrVU-xXWbtW#L6Ox7)-?Va#O8meSV1y#O zBBXa+I+y*@XJk^Y@$RMe3hwu_q;1kjVG#-MoiAR{5Q~{eYIC&rAu|s0z~4AjW2^h) z`(LP7ck9mIRF&q1K~cZ{5fWcf{M*C^Bz%M?Vb`l(@G}@7=&Q%}f?u&GH-W8b(x~aw zSco!+X)Ny7waOQXz*-t{WW{LFMfLGTYO6o8=(N?Uxs=%GKd!NCtv#wJ%r=70N9M>e zw~(fakCaXCniMZu0Fevy?y;1aD)h%;dWS^aeFbT)wmmXy`#xsBf^v^WX14r4VP5Y& zXU=Hg#?I+bg5yMq8a(D+*Y4~5>!g*XBZ;C~zwc79S|0S|8na!hWX+|NzHK~5z@aHc zaYR*4aJg^}(1cRug*QsuDltJqNB6c6WY^?W3<@X$DXJxkIwhSm4lLMu2J8|uYm*(y z8T$-3;kViU^Kn7spP;b^xSII1kQ)@|yRh^r-4D!Fmul&X>B zUpPx)RjG=Sb||>V4#|jBIjy%WVfC}zsjFO&K4y_gR~NvZJ%5pr(p@*e^ni?VwRvC6 zb9EKvnCq}^X>hy>MSemfzj=Av9m;tRj(!@l9m2cMHJN9x=S{QJku)8l3L8|d2~Y|q zAd8a(k+<6>Rh4Q+b`;=$mLo|XCEfdd7QsRO zBY(7!;dA|`k2tTWI(Q=ltdgkdWV9C4*nG3%6^ML#L&Z73RnJND7HDe75BKw)WA`|Bi4LA_EBvK47LD^$ zYq?!gPfBkqLG%U9KCKsN3KQsXc$uzov3naH>^qeCt#aFz64R8eELPBq?SsQYuzg&{ zSc9;3f8KU*)b*^Xp|U)UVOBVB`n*xr=%auRA-Zc5X!F{RS(3vFRJ3*O_q}I+eVZ*V zFXACxxz*Bmy|Ow!*wzX?ydwB_>1OQcbQ7taX~uf=I}B9~NU#V>uv+R-OCKgVmakA} z=M4;uj}u6%bX=yl$$Z_oqZ}PVQpexv_S8Q~FLXY-&UO1-nmIPtJ@F3^^k`XJcu3`V z9}K{bv;+2)20HguV*5?;MGbsJnJhnl&wJjVZ(lzW54CONOsjdBRSJVT+N`z#-*Fy+^CJ$tn5qz(#yTwZR?iQVNh;;-_S$oBI`Y95Pd~3>Zpjo%~!3z zQhpn~DS!TB-_4daSzv5yZtE&CSD@n3?(fDk+K9WM9u@=BV6IwAJnK-w`vl_TwPB8J z01M*sr%M#XZ9BWPR@)z!J8FSK6*Gdc}eGdn{teM3wd8ord2^&<4tLm3mMlVfzPZ}L9=%Nk3Q_JWxkGj_j6AR=|Czz230#(SQl~tYh zZGa7NdiK3+G+K3~&!X0s2eIp=eD>B_i+k%paNNzAX7}XZ{(qI?txq(0_ZOJ?0ju=L zagw$5&Ubq4Z~t1}kt3OYr@Ak1#RR%C;alb8LtscZXN@Rk2lmEa7r&J=|2$s%&k^w$ zw+IB6XJNZj*3QE^MY(brI`lYd%TWrvJpKwlL40ABIf|Iu>f36>jUNGEGa-xS(*2yE z+RY~G=e=KS>I2o60U_~jT+h^Lu*Zs;N9zormnWAwR9=3j8LKa9o~8D znEV;sZg25xt7GY-D!UeKm8HL1EdP)Yw~@|In_ZorrlW1WxCpr&$vFR*Tr+!ld^pY_ z$3l!q2(R{aCO#HtQD9545e9w1cLvnvXnXwhy5nyI!5B}QclDDA(TmY%Aghh8C1fwK zJ#m!PPS;Mm3zinLmuEOEq8G#-Qy=6K0i>&)-J-_KeslCZC=c;kZ>s|{hcH=CHaheC zZ-(>*+-`T^vL|IiQ9ZuDVsWZSOb#toxJO?9Z*jNjY=R-;(c+wxHnskBfGTolx~Bm5 zS1+RwBO{1Hb530Wum!+gfB@g&OI#hYLJyyuLr+%U4(E@UNr5w91_;w~uL+eC6|r9I zf5(@_mzI~d=JLjjk46pImRNMZS@X=*&KHJKZQWK^8N4609*h|wg&3iP0rU+wjvpw1 zk%$p{b^R}!o*mI=q`DxF{l|5i;2&U8T?$Tr*1*ib%%Vepe4>3%si-KeC@AVHF*WQM zTRrch^|hN_18&&JulRHB#krPmLaFHogP(es>D;cnn29sL>z!Q)S$PGo#$T=9Wiy|@ z_|c7q<+L>PKF}lmhBu~I7u4bD4=WS3wz3gq%wsHP)_hG8?UaY5P@)5q1)`q5odEJ+ zi87;iP(HKMkSW=0i7va~mti0{eg3AaK}ACTqO!8I+jq9#w6I^G{fD%c*!aL7J&DQC zUL)GUpape~uKY>MoMPlvYJvaaAW1c|xt5N4zD~tEyXuO+uDAh|$nhSp9AK*!SQjF@8LT?FOR;KM;|G+*e7dqX%WS zxWPb5D!5s0Zu8M->_%Iw(V9{4qvWn1`CkT8#5L9%?<4(c-0a<)<%laj0KNZMARs9d zjQxQv0%^U0Tp_h>WufLVzNUiv{H{Nrg+w145%%=&w52I0m1u|e?T$F0sN5bd@ARyW zKP&FZB`8Z+=j7v5FVnbSf3rR3v_3R{kiaiP3O%}A1VqU5k2^RQxNrF1?B%>wXBi(qe#K6k{*9f;jS+Q2!@Wv4&{eOD_v<$_RxKuZsTvhrSLV+7CEG@KwOD_^Nl1iRjqQfO>$$_bj~Jb z-@qMuw_Q4*Tof*@8=$Oi3tL)R z5|`I|WM_`mFSkGJ#8hV9-2!0mz2ROaaO%yMWTlOc4AEabEGo+O+v12+rA=f*Qt)zw z5O{6!Ht0X!v^y0BaK`oCoEV_iOd}`xE2=Nxv*kbLR3H7%BWF$GcYXic69}P*qx*-X z?JWciC4d+Nc|B{4C52N0tp8uj932Gs=*BnA`+iUd z^Q;lyNNuogY|EVDbJdSoNRFHS&;MJn2!i?Vgll+yvT||=u+UM!N6a}gIjk3s7pvP? zSb(c_$Tu0l)GPy?&Uru|v4^K;agob8VL5Mp*y;}HcJ+ZW)Kq^U1S_N9fvXpKieY8~ zXs5KCM@2>L?Cgw=jz&jE2i(BPeQRs$7*e6m^x9)&oRo$I`_t4WbJ=>?jL6LYnpRuK zN+p)-T;V7K2U?C9fe$l;9uLqe7t3dc%K;CqiTPZR$rIz_XS|n(E8=FGuTDlv+DpRz zpVq#@Daxp8d;tkT>5yCy>5`W225FF%jwK|Q4go1C5s(&;?pA7*?#@M)?uMo7_xQfw z{O0=uzL}lbnP+aCxc8iM&pqedI3ioz%#weOYwOx*@})bXszO!M1IvQ#TF@A_4^sBU z>-Qi5O*1pDh<)L(ZtDQAojRafVk3P#yEu>|Cf@oC)F#CdDzeu5{YL)K1+vKT%y-5J zg7O_UE|O$^F@wQ- zPbYU~z@{LO+%{~jV?%$V>P^#27;6w>+2?k1pT6yp(-h>(g{%G=s^1qgcbYiT+}rf* zUjl|*lBnSd))Q0#x&&{A>O3o5D-N+XKA>mR79p0zcP@LYv#tGSfyAb(JKyh*Q#F-| zy*KfY#-~3q^0Z3kWaZ?-scLV(+xCw(nl8Y*oNioi;>#2&|BbxOlkB-qE`bqVsN*BF zBZ?3)ltDj)e56sM*;25vv6+)~b93|ZYNT>=?4572m1sedM~u$%Lh!=CW2v&XQ{K+F zSZXEd55h($%F2Mx4g&*&QqZ}+p@Ev)BCMdm8fwcC-MQun ztGlkH3Eyi~vYZ6|)2MU6(IwckI zZOE*x_1xn{jJ8jiHyvVucUOmtEz!HN)R`oA*U6)0Y185(;+R`t9ZfAwMQ+fxp){TF zquJpMk?ZvHOmkc~*@K{Ca7lU|4!R^}-x>uo6H{+b55}M!kTWF$J*;nR>}g^0U<=Xs zaJ=&;sY?Az>*;#rf)c`k1PK!pYJrvY^;b>DXFTT{jYbQlFLV!W4i!kj+><;>>g^zp zvIuhqfUpH*0^1PQ`{o&^@FoTiVNhGD=u7+uTGp($K#oFeW)Jx2ZX3L&PNx}|`LH%X z00h{2GvgtB1x?8w{JDkbisFt(RiZiZk(e-pnuCF9QwO^lu@>h|f0G?Q z`ku_1aXk`Zp_j>*!v%aOKl5Sxwg8mNBKuMa1Fj*$vvJ|Kvp-|qXSD&Gw|Pz@C9mFK zv9c~sKX0yYM`lniJ+a2HXMr4~wb@1wesvze0$um9SRb}0_^BmL|I6|kV&ySDiYOPhsK7reVgLa2YI!E#9d>p~HIVQZ&ow6P1^Z-gi-Q8(V zfWFqK*s!@fdZ91!h*YRD%|R}F4(&!*C>Ce7fiQ;X5qcKH!oUJ&g}2xqX738?jx(T2 z%KKQy`c?h7yX8ymB>J|)64cVSlEk8StOXuZN7f?dsA#sv&SZ*~vNunBVj?&Y0zMfS zCNe-qmLzH3rQiPWRG{ew548R%L3*N8&_u>d4GY)R%O;pQyYiIo^di4InTI!8n~ps{ zWNCUTh{mSwjlZ_o%>~2TGA1MG49e{YUxg&l-yU`q z$*Y%207leuk*L@E&WkEC@*~c0#f3g*;fwe$dl1vnjQ1w(N-m zln;r?OOTbvvf=KfEuqpY)K*zskdhc1D#;Y_esj~F+%67wRITgZ9#6~Jah9=nD86OX zfl4i0jC=OXi*Rm>dN$)55N%~qeTS=e=2}%;j(@AC zcZ}r|nN%$2+Jg*>mLcDjqXST=J#i+0%dWG)pj_;Drh+>G^ z99s`v+F`!y4uFD-cdgY>z-o&w)A(;&IMIqOyo?$OC7vRF;qc-CAcprCCQ>(-Mb|V3 z_QI-&#NQjW)d3~Av5y5cc_!HzP&fdoUxxhbfOMxK%u2_n))Tlu(X}7cx6gln1lAar zzsP6Vu=Xraecl3nf(A1({$%Oaj%#LZIdvZPxte^uLI`z?=ykexKFpsyLw9e_+J7Tr zWkC7$4?56lvmok*?nXes+Fo%hGehk}ijvXHXG63mf62%3u|A_KmA8-NsiQCTEDB0l&9{|P?q!wRN}lV`|+3$I^{5Kypw6-(9H*Oxf) zOJPgMTUqI7%I0Qj#asYtShQ!mfZaPpHp8G(HA)XH@~Y$x+h83&o4vt7uG5x=W9Y{i zsEK0SXi4(jY|yxM!!u4AbbcLX&J+p^!+N~JyXExTWIeX6PlU&jVYsy_OB(rAsfpGSzR~4ujQ;3?_@65LC6i znsQhr6a83pL?$va(2DMjnk9PV%6#d@P#HKwLI-~M#H7@K&Mimb1 z4XGdU?PjX`fu3ruj`rcP`8KdVE|lKtiZKaQA%+c6&>r7>D-rspG@Ye;^YtEI=WVLo zcR_NO_T~p&hWv@{xsBzIp=0|P!LKlR8z2i2w#3}H#wu;cW{ARkZa|M3Z&+TZRSknC zaqkFMMqg+y1`QVGZDQi&3eqS~EDIPD) zIquECI z8F`+PT~+}3^{=5rG0IlWK_$CSx3(;FwK)4JQP3EE0D6;r8id5HvkI z#R2KNHJ$IuGETRpHLErsayKc8mVeJt2>D7Aa0HzIQADVWi~BB0=w5Jzg5C&cjebK4x*?)H&G^wwk9 z_lvqCnlff>nKq8t^nc2_2H7Hr+7iclZk;3=xE4YeMmH@lq zs{7rYql<(p?==hL1i3PYt{#~B{Sqb8iRw!Oy>OC_@78af(fEf$2~*2h`Jj}aYek}9 zGRvo_w*API!gLzW5y8ar(UY%>Ae5DVj?sea?O2ru1GY)!cL`7ZeUK%! zP|=IgSKDwzPL3Qq_% z6Ogt7<+}_AVtv=c&FbT>FAgJ%R5Q^A$UrPfct`KMz12=U=|1OgHo+O>FqPxZ>AXXM z5JVB;<*n`au)8ph)W#1Bzoa;&%!aR()1rj1CMVpW8F+PVn-P` z;ZF^wt=T!Nvf}YOvR$g)H$|riMOUi%&&Zq}O=~gR{lW|ARrg_fWKVm5;T0A+C&$&y zbb}SXLO>IwoHtUo6N+symrII>wIg+xMAs)b+#9`UPciKV>N}+(w*2{uTr5#R_~dxG z=46FbKzM)VGbX3jvq(+Y_4eeXIj48FV7Xq{SkQ>r67)gH)ntENw`cVN($&_(?1H$G z!43a7;^;|mBRmLUgiiE`=z6wJx2K#j;_;6InK-rBd#T`|-R*rs4(vfmgcjGCNzqx5 zdReiH{p_^H4k6atCDz6EvGyR;gvJkRbRFTAWIBW0&-H&^7B%(ppi=*GU++7hH{=6O z(s8jx@keLhK%hlUy}W%hA>W>v+bw4pf|_SyVm)gRy7K1&rzpw?SJ|K>V(;Moja=X; zT%_eAJN9^D18cUzra8}-CiR;r>k)_%M)2IOFw9Vk_bn631Zn`E%qOOT1*=0 zehZ%vBrQ%g+QAo&_y_nw_Bcn+)BIGxUwofLx03sao&&L!Cp%-4$9?>udza?A74KWR zG_GA-Q`XOmZ!lD-oQw4a*2i>;^DZyK-*3r?KW1?k71pSU{~36BCu{1Z+4+KUv5zEQ z_Az>xmR6YOJU6+H{omYobyhOL=lx+{t`B7zrk4U6G%HaQjo#FmdiT~)!11MJ&M{Tq z#rV4<3hwkYhelz>7tsjL^1@m#c%Dgsmb~RpTGtRO z;py(CBZ{W}=WU_q@KI|;Aj{#r0C4{~{P(RhCG7H#3g`9c&~E3Wb@Alapha#ex$7e$ z9VPy)nS5AIUJs)-X}Z?0%*9l)I2-lX+!F<29L`s~bvF*a3=hwwC7#eat@to>xbInu zR>@(hkvq`>MX&r~T9vp_yAd(5ZDf#AOJC;=AtEQD>+UC@1oq#m>8^R(2)XqFEW|q7u+^HGHI@+)riN zf0H)LbOP1qsmpHKUr-GJ$yGra1LXt{$o)psZ08_kEp%A9Y++S=bYUY)JA*8zUz3?t z+J*?ERdB6v1$8oR4(E;kQPx|}oZ8j!S1JhyOrlsLPitnlCZ(F>v`r4t7bmHNt`zYF zm)wpb)5vv1RpBbl10=b`TDiKODq!JmuRnWoszMoc8Bs#4JclY0rm^3Ux1aavZbF{= zd9q3iqR_r zpgR$dOdTADZ^3^Ij7up*{qF6hCI*1T4oQLP2*A|jhKf3-Z^!U!@7J-Jalkw_Vt7Fz z_@(xagIrFIc02eP+S2`~D2AtMjAgmQ!%|D#Zv|oX1dsZrXBX`^Bi-~<_5=D8tSR83 z=G4ySq+#s1zTYDqR5TK>`o!t6nSL@XryC!GB%K3TM+5+dVB^yO&~6#18A8PqPITt? zhJ5Jp(hQS}gi+jvrtM+CUB%7MR=>+lVV_*6<`$jqM^%M#ZBrj*$r7f;YjStXE$k;B zV<4Qu--MAe??BH!5DEUJ3sjZD8qR+27O-UHU(;3>L*rIgdvT=gK8-H1M#r~rbkan_ zopvq?MAc#9RH%gr)G=Y1)%3C1-<|dr?Tk8<=3$lzf(evK0Pn8w;+LiIA1w1Rlxj_EzLHVX($)ux`hcvE$K>1oJwDDN zm+qsZ=0N2Q&{)%}Sjkpg#IK00dOJfpBIz5Be~xgpupb1>`ET;GwU3VWt14OTR{<|A zND||V{P*$+_OOJE2BRQ!zz6;wl*os=k+StNEHgsrQvWs32m@b&~_VG}VEw`?zfPiT=p2<+1D`Aqm1&3Jt9AUe53Q z-=%&p3$g$pc#V&|Gs$5{O7VvK*(BRI#VpBhV(R`Q9FJnag2&_E`_A)EW`S-(H_r8~ zX#YA$CQyVt<9i;6dv9PS^LTvF$)u&;C&Ks-QYk!GqB64lbbfU$Cc|5ej!5R>>OeD( zRjHxiSB<+nVm+b%*ZtZ-*TJUm*%gBsU0zxV`l1Ov+?V*`^NdkI8J`S{UWUk z=FxBNkgL_)E*Y*gu27SYV*6spT_*ZoO1hg8rW18P2Guz;_R?Syy?2-^QsbeFrjz-z z@#}o3&;K)z@NN>bGp693n|Gkx1M8*k!^lIP&z)u0tB;o<#Ps;meFMLDZ$9m11TJ`7 zcAFe^A|k|v_(H@(?sh!_nr9Wc{7_!atXn?>lY*lP4PY zNndJsJG!)@i5xYZ)ek4W39BC;(NHH6d=U^&-SeLbKdmbVODW2v--dPlja`AB^q1Q? z**O9HvJ~*6_d|P*W}lBL8JQe1ecC^`vK4?L&FpEkJCw*vLXD0u6MZWwtz}l|9J@5& zXc5N`z8!9LVSmnEz+t{p6ON}sbC^{J?f=0b9W=l;diJ<-gg4Tj9{@{xRMWATifyGV zXVgpm4$0bT=4xwKWm9fR^jmYCUyHuM4ofI#FM!oO^2}OaJ!j38ez_%os6LmIkTcc+ zsS&JMT5XU+ZkfeEqAimw!O7yK&ZT<#x==n(q}Opaze7r8`eE`uTLzbNPi@7S@s|D3 z^?lZn`+yt#`k+z15m*PqG-5`@^|kQYx%D|rIXs7S2%jB=WkkHmPP?0EfM~z4A^E!% zqgTGIXEl}0oYIPLQv8L_(&2*|!-QT+`)&W}Bh(-q>e-VXfA2V8JJOkD9fvY&iQY{J zU%kYEk*V$1@Fwg(m5qmrb5?Ps8XH(TS>6e|Pcdnti~zBH`?dQ%u4mO#q5iF%I=%I^xjd`#vWA+5sow_|djdu?#XhBfYMU1!OqY|c zs6otSwPQ>2>|51NLbu$SHoPswiURlBYsmD?sBF1$RT3){P_8xMK&>A~NcvtHW;~wr zvcN0SSJ^?{?I8=Vd;C9_*0Np`a!Rxtk87-$Z>{hRDIu#UN+~eXF`hAY_VjH^Z=&n* z4t64B)Z`945B5%wCq&ysqIkZIXA4c&jthL2NskH-pOJ8jfxkI(^|s%snh1?Y zpXHm~KV2l*BodhR+HE7d%sY~Ylsc?NHv z+vfxhjA#AW(G!}JC+??peATU^KV2YJB9JL|dl9s>Y+5gv1~YMg@^cz6)izaR#oocP zlZ!<>{)F!2x%(**t(2(`;#HZ_l^?OiZ?alW4VI~>6rv2n3?LMKk)w4_1P&cPk+W&G zS!3_1F`7#&NCP$xM#~c-Bl*%c`dxR#`uM!tq29{d|n zU6z-z-H&P#d|6le*XPW%ygS+9dvWQ}hToubt=wmoVr>F8SKq{0h-_^g6Efta*&*J32Q4@A(@mU= z)L$I`Ob3&kIDA4sazmu1&eqC^pqq?Gn+e1gD&6YfCF$fCcTvMU@fw zZm&IQH^*nE6tMUk+AG5A{UV0AUnW1`y+7&d7RMF8vQRM^gu6qc$k(UxgNJTxo^-sU zc;}p6Q-X)n6^SsG!_wu`8H&m3b+F+`ukP#p)2lIvPxsX*yM;dxf(eu1gSCGWch!_L zK&N|!BsMFCFxN$0pP5PYGV}sGGoUmar4bXEV|XD#82OAZJZEN7e^voYmtW63Ci!{t zc91RhOMru6_*J33&gMihBt`&||2PaFSwl7s&9^-4#;-G1;Ge7{i-@81LT$ny!)3rl?;_7g#^~~^eq$vrqN_7> zv4hkwW*Er#0pxSF93aw8Z`}61P&G|dsHGzXA{mih>KLaG6smrQQr0p!#r(zf%x&(+ zFNr%(YyZ%+tl}Vipj>bxU!_XFtxzn<$PPbZ{Ao<}m&~6)w?|n`vD2~BZ7iqT_xb-s zl^mr^#?OQ|fc+!wyi1mHYS9IM?yrfb3w@`ly98UX&aB zO$BuYR(}C{Sf8<)DJIv|yW@ULCcg%sYyD~wD_`lR+wdnG>7>%di3^IV?AEClj5eC5 zb0S*PhV6?o7}0y0-$lT?SYeA3>b@zms(18T@rbWJTi01;yg>|w8Z0^?l9H6NL^tx% zrgDh<356>QmKNkposqImfjUz_bOAdBOi^D=u!6bbpP+;s*mbv0*UYSCwd8*>w`Fq{ zAv4M(;9py=2vrp4pbfL)KjJ-vmHNmTpWJnxr7@&&l5)1q`%38i2UO^7__KY8WY;y{ z;O+oVG_NmMC{gqxP6sG`cbO1^>PNgCXCeQ+7S4l_^ygstW!Sr6c8ny=(Gn(`W#|dH zDu!28ZQAV6d!EQ5x3IAr`@LzMDMB2=rXH93va2ej{tji(;y2y&aD0aYJL}iv4IB-5 z;qOPMiD!u|C4><(^F8l*0DJ4$!et#1`IA6XL-)6%g-xn;P~d~Rvj}vpKDJ(pZ*>MO z3$1gtGp>k6Js{2ZVdYw`m(256q#b!f804+0Zz5>p3Ro|@(UWY4qOj29##LnWK+nJd z*rhkFjb<;>HMfN}>sa4&Dhw`{L$o~GbAHIE2?{?vzhr2Jv*ZjS>-(uv6g z^!D-ZWA|sSYBbZ$7kxS!`_XgG49hSJnAX^ZMkS0H$1xk zej3Peclu`fQ!^OvRtX@EAM}sPPxEf%bS!iLMcNb!DRmNdUsok-9!#$bBCEB(DU>53 zeM;i?{vqVraw|Umg?eiz!7gd@Ae0PWVBxoaYR{@MDK=vE;zn`j zyWS2l!kqD`#PPtryO?PL?2pFACOE}H;O2t?wC?mryK04f$+*rmm8G~%!L71Cr#_FT zEFkhf0w#2f0hz%tJH1oB#_Sky2()%asmZ`+FyY@DSpBl5^@3%e^aB5!PC#BDw=y^T zB3nyWyPSrN`C?vWRhH`;zxHfcbNH8|XI8!+=kBH3Ys06*2?Xi0TLXb|RmSYbjid0m z=ZbS?`QlM-bzVfzz4JD@STGU4VqIC0UrE()a;7ldy}AwV5?|Y2#;se*O1td8UBaMM z-ml^%Rv-oL<&6N!=6@sD?hMaKXBe`%zuwL==bN|O U4YATwz{nsaxwo>F((gb1Kc;7W^Z)<= literal 0 HcmV?d00001 diff --git a/Documentation/pictures/text-input-pop-annotate-ca.png b/Documentation/pictures/text-input-pop-annotate-ca.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7483dc4919606e82cddd96e393be75975f455a GIT binary patch literal 43667 zcmce;bySqm+ct^;BHbMl(hS|{NJ)1NAl==K(jq0@-2x)rBHbX}NH@|AXY+gC_gm|H zXPxh_v(9o{k2CYke)isXU-z{QQ@2lqS%4({0$;&bpx)}8ny zxF8tHNQ%KdKK;pRDU5}Kdjt1D?47E6+Ww-OCQi>S+`k6BofbEyH*}v3d+>-EE{Kf6 zm5gL$IYh7{*ix<{-qL*O{_?i+^2_3zoKQ`3%0FJGE4<~)_YVY`Be|rKe0)nIYq4gw zZmt)Lx{gN&hx<$)id8AWgWl{MwEVziy!|@S=t2yx-vlrlM^J3i^T(WHZ|9}5+$E%boMn=Y}pFdOTXuups3w-SP z1SlvBW`CO0*4A!~WZIRdfY1HOvUd6X8I+6929r6mv$HP`7p?y53*j-J;o;uitJ|Zt z%Y%6hMMY6rWA{*v*8S(CZnFnxyk>GMGQ8)_CY&Ywm_4qJ19Cj zdbY|8os>ULwmkoR+9ns+ak%?}we{&Hx1(Z}LNp@IqIS;j9&+GgQI?%eK>=3Qe`C3l zosv#Yr#s_?ekXmjzP`TyJeIlFvhomjp=gT@X*lF@~8dIN)(QJfW3HyCg`v#rmjA9bH10JmX?zLpYIf$ zy=|J+k%CtH;~5bU5MCglnEz+bMRhJIHlH*GZsIH(M*Qk&efR(0s!|yyL%cL)j1=`B zeZTwsJ&(hUJRe-Na%u^)tt|8v$lU%A0$PhGbs zr|#tRv_iKjcmNDAUuU=67fXA4aZoy61hz?Nv^34e(vsh7m?Th9Q&ZEyp|ZSVOyR?a z5A~wCW5a2D9BzjTVc4{D^YeS$48XL|<?80@c53zN3i^f*P2c7nK{0DR>K$<9{zJ zo3*aB4R{9U?<&6RSliTeJ5y_qy086mty1y!wX(=hO8TUq~pgQuV{rmSX zh0Xh7)~p^Hf=1eUwTfJm@B46V2D1U`X;~GFO3ZCO`UXZO;QHM%)o!V|vZkiYrD=00 zwQxvS&EaBSYauQ*RR=p2nC>XujcY~(#_o8b!bpY?CRC@^T8SavMJ;wr!1^y(Gg>uilmIqQN4zTFAGGT?e?$5lFy*p}qwEw#?kO;Qt_r}V~N={A=mmo=BLrPTU47Lu9FKYR^jb?x3p}!D z@A<>Qe4T^A-c%Wn?ZOODbKr?M*x3)4TIO>lqZ*%&Dk>>qLRbmD(s08A#dmP_$yufZ z9yL518EXD-rQK!nH5yvCmw%tJsfkJP(8lR?33-^+8d!dhN}e)(c-L=ijS9U8THnX} zOLwFQiGh(3TD+c?SxhJinj}MfNv$l5SQ61@sacB|B?y|W${-m@62_R6nkqw$CCJFn zpQ5RFFjt?S|29L|Zb>jkYGQQBGL6lsd!<|QE5TSZGcewwOy3MM6}mWFM)fy=wu_DD zch{%ddxE}q1o*&Js+=ml_5Q4*QfIqp|4BL@t5}H|>+kazNnp!XCMM!cT)@-8Fc4pc zg@x7B%I1!3j$~GFV`d(<`Q8)xkqCS93Y$nGUfKLd99 z_U+pm^{G+dI?zaXSshk8k?|ob^s%%Gw$cGW=0q|gPTWv)pby>M-H6#ksXWtZrK${J zuj+*a1v%~T>cS?QuXQywLy^(Y&`M;AeW`bgDl045I61$&;6?Rxz}HagY79S|PwR&j zAR!?Es}iu8<78wkjS_j#+#3|Kn)=@0w3Q+3LqxHDaNx5&nhipb)ie%x^ue~x@TOzK z)z8yPqaH^`M{Towxt)YAV|L%#hUb4XZN*!>1*W0>th z#P7A^{{DXX3_**JAG1^$IyyS`b`(Ga$$Go(G+bL%mCEnJ05u2U{rM+R8(UFPI7pg^ zU+ZR=`%sKB=R3gzQcO&xrx-8daY7BT=S`DO=jW=`QczHU)%)Hz%F=Xf%*@PqI&w>7 zD|-9*wB4NyBqb4OXlMwsK_KOo&prkR2Lls=HM_Gt5a8nG>k5FKtIi$aBUTeR>smX$ zI9jgYwz@gnsegkN28BZHFWK^y35kgXz{aPXbFl$oz@nw|GktI9ThV=XCyIg1tnS3p z$Wbrfb2veQ}~=oO;67k7#le{Eb>xPSKGN!)k|Nx!tud_{wyzN_8DtyX#piZ`yGVra{mLEZcjzq1Hbo`Jvur% zNF46yt|iHRoX@t$+8!Tt_6S%F^M_n2f&TjkOUe12Y<1N6JwAAxZc+qNQc-!G@8<8> z&(#w1*shS1JM*`E|1KLVIRSKsGu$<%s>`r4Hdf``yY|4>*gzrwbL-ie^D5F~ky0*= zd|K~@`v2tcXKl;8;O;E)x$*SHOy55)FX1Lk zhlq3~pA!5P!T)2Te^880WKJ`!tXwND-nF?Aj}*in^qhjT)~LtnpEsx+s#$wyhrVa! ztV&q!ww#@L5fWC&NdN0B>j5UN#@qKTPIwR+Mwt zb7O+k6)-p$-q+_gKCU7y1CJH_sdS@fv#1Ehgd$}?}4#nR+Q=n!yscf8|liywN2#!Ke zhqk-;l5v`^MN`x_udH?zRH#zNR!&ubut^}u8!{qtcGo~3USqMXXeTqkw>2!pLTAs- zy(DbdDQRn4-^!P2Gi+MQ_49s=3TDsBPNc0{rBqMMjYy3(N#C=!8rjqJ_opR!wcf== zMFLZ{+7U+cADfPlSBHz?A~bmTRx$J1=1qvGWD9t6<*wp-N)!;f==F`T)6=f&>u))f z9^yf;H*X#o*G|LwjS&KVZz$Kp7!n75)SB}1vXYX_kn;b4>3%SFUxBYyiLT;OQ&hsd z8xc`(bPA&ndfq-cT~X2Ms|&$nsW>#0nB1K=?#+H*r>x>|y|LO=QWx@CASc(Ue*hEe zUFkkGTZI-JOrM{Rn61&(r6Qj(sN3*O4a^=XY~9#f5aPGGH~(kaE+T0#1)KEi*HCud zw+EPgQ}Un%-6vVVIaAjgJQr66SnGQBqH+&l1&BQnE6^N|ycWNFN-G zqNAhgLxM{g^F0UpEt3T+oUsI*6B_#auYHp<+y2y0y#je{lb4k>3LH5~?<`RaBhFeB zxyC)nC+U##u|#$z`0XSH=vgl7YKE8?8F3Ih*|nrCEXXB$65-)D4A~T@zW{^SURB=v z47Q$u8Y>VZOe|%*EY;QOXlt7;t`7rR>EQuxg!X>!*s(VFw8fodNX5<(=ICEm=E_!N zk#GQ&6Q~DzV-u5CuNjv>BddU4kpG&4LwslF+p6It5;c3WsqL_~nqn&!Qsm`aY@{TvOBM|15!m;yeGt)w59!ASg$6 z3JP{c36l)Tsyn|k6 zw|4RdAD;zvIGbyXX+9{$-d@MNN!VVx0hX4@(m#k(P=Lh29%y0l`^>qapUWl?WAXRz zA6{++xm4rrpLVu;9i5G5=Drna`_4yOa3-V@%WN!#P>W<<{`)(BdpVFP*eBvE_;}?I zP_A1>Bg;xENB~KFagV^KLnW!-{0p8Y-qUxE)9d~FK#XKDq#soR?7rSzw>+LYp}8@b zL9(tDzFEB;gD4d1*4AG|@HEt?8da4Y*kYnLudi#olXl~zH=2?0zsX2rK&^>vwu+R7 z{#bL^Cc3_=3##1<$Wf)E_VCF0&ZOj8OUHH!;P@$vTCn-w0^dWG*`3))lGnw|P=*b+HNopc6*wVy zF#jkgM|%U=5VR`+UEI39HH*Q^Q{vU#F9R;;J>72oVX0HH47kM$?{SO0BT6XcC4gb5 zZ)@p}_y7Cnr{5}usMNcji%sLq%2QF3LgOW>_Md5MbR69LqZgz6V33`cC#J0Uh8dE8 zgZtsjmppOt)f`HT4`Ip-YGtxq+?&q(nl2an>z$4c2K>C{KF=4OanN4T+PyP0Jj{Nd ze|gxVRR`HxdAC*3#*KtHs-_B8P0~Ays=^T8sl_DRWaFyR(vmv!Srt;jr&ORw;`xxK zDXyD7p*=iud1&Kvg+U=k6LS$oO8lqNNSBMa<`ppFYJvI`I}MfQB;oYm#>%Lu#S#*o zB3SX#29;8(49P<@O2s(bO;b+N`LZ~bU4aSRiv8x;KX9m>3c%*Y5b?A~8(tRA_X6KL5IX z(y%EdR4o6`;Gj9PlcYpc3>{AD&UnQ0=gR68kVfaQ$Nl83$A?!V0ndcsfH{meIk)TY zQ6@93&s3)8O27k`72j`meXWz5(>OnaVN}vg&y1_?_9~VUr#@O=2~$HebU0Q=EY1^$h-W0T%S{kIN>`6x&y#kSp@bjZfUzlt!birRm(u zq9!e2rkvZ&{+*GQLi!v%XI%eAfz3ivjnS);+k+!G?-j6={^3zp&-Txxxe}=MuG|Kd zbjCmF!*SR5o1G?#f*u|kBjp!c3l$vNr+$5`CyVG?fX+|WqCrMKf2y!6Bo)}++-wLz zH@iE2m1i?55fgW?Wp`Pa=}h_zu12d$Vj8m=e>E+w(`2BNj}NcC9kT4VjF)Nl;(+9? z?>XEYa&UV3^im6n!bpxx;?mt2c1i1t=b}2#0CGJVIVvm5Z@WC~=s@4#D`a(P3ot#= zwI__bnnl%UO+GuDiMDXz$B%^{tWV!i{pTA2P9vj{p;QY~Q>`Y~_`r}oeiArN_^08> z*bWW^9*$oH4aw`aWjvnbmv=l9rFufp4{+ue7md~=@?jaxj`?&PD${@AMnO&t=YKI! zB#B;#%V@l@QPFw@RTo+nf+PQaarTroPtdsB-+)=m-dvpDEk9zs?rwcS4&faE({qC? z`wpC6_!48rxSat=@L87df1X1cCULq@9cF5q(comJ6;am)_wVm$U7C%ZodRV{l59as zi;t94FQ}?rNHO8EP_vR#8Y^@pDPxwtYf&*nrd)X8CghhLxoPmiog5v9Getz4w?_ds z{DgIyzd*Ua+ut0FNl3u!z@A@uFAmmUR&Hc24@xZ(4pZ4e`ShIJTod+W7=(w5iP zxA_s_cJnf)yD^~|85#A8dV1yaQlK#LH_fi&OKtzS@)?w*Hq_t~(W=q;|8yF*30sC{ z^LE?6;{4P00$+H(vvcB3m+uM6$)Q}7ctYhlk-;4RDyauxdvr=l$^1v~p?|^nyjvh* z5R`|fuDMw-FgiYda zzI5r1q>qckv`fsK&Z3q!_W`K*RwiMk6j7x>_DKe%rHo^2sQwq-HV4{4ib;(I0dMI0 zOuJD|4LT+m5IHzh)GKW7fAy1zB%EH~ZH-Wv)e#}34mmpIiujc5iKc{P*vQ|Xahr(% z;EUGU$Y||-2->?^gaeZC_Gc7g29+345OG}3ML+RxHJZw48RvD)R5qf$^ye0}b8^+v zB7`^}E)ZgI!=V~BG`cp~e=@aQn%i@6H00x}Igx&5o(qP?eqa1UlL?68*Q>*W7O%c# z-}$xn7mfM(yUt1y67re^kJnBX1{BF1f1S5K65$y0n`2D&h89r`_w}J7uL=1wF+*rL zl9|lRa{b{>m2#6VE)Xd|!myCWS6?t2O;KK|VRp2n>$sPYS5H8XBk}2ziIP$$?DBjM z6B=YToM$r^NZVMZ8?IlehKY}_zvwmbP&EQn+2V&o(`?lNKIHpc^x$CHj~^$JQF(%7 zlcUjlYeoW2G}H4<89q5v^#hm7X7}eBJLv+BpZpIFZQIP1hBU%L0XWw2`)OMf;uLvF z0wB891qwXdQ)L$j8fE==Yf*o^E~Aw#2ryQvo#_|nw7+F$R{D5pIddx0ef7L>emIe- z$y7`siD~>tCfJLLj7?1&Yr$DwQSttK*g{du*?DIu^)8X+t%rwnpk`#GX-9~TLWXRP z;)LbYV^3C>UddLHWecB8dTUE~?7#KC*nvbAsz8{oF2HpFZ~%Ap1_yw^!y`OsD5^u6 zIbXkiOXWG(9HNR@Mx9YiP9x#5BMXyteON_qx;~Y=Imf1cyFtqLdHi*`3K@26y?IP^ zUZ+PFQb!6TB=plF}#z_e9m5Ym*P*p0b)9m+{(9fM> z@BRGV-{I=ptv&gPn_H^D{+wKFe3pcS1pYFZMcc-@dr9Xz zB!tWSy*`yr9{eGRjurIV@1c2pQ*OLHz@ocb?EGZgd{WndgrGP4>)>o#X8%(SRy_N0 z?D{km%C^6xJG_-BDS1jJ$V$x5d3-toYMtQL)<55{K*GFHSqY+F&MpNh7ayeyy`UHO zMh`hIG<&hx15`PxXtYMRt_+EcQnH-ef5csmKdTf*!)%3I7#@n^1~L`WilX~S@L6ha z&s2czNvT=_-1T$dOR&n8V*xK5P_&v;fT}s<7t&2-&%Vq5UFvrZm<*~v`mN#o?2>V&3HZ8-&nngsQh=QU@ z`;8CL>vz=3AvW{%=>k-NikZT}4-XER-pW;uTce73H*lMJMP zZpDUz_^Y^xff8@PagZQSaXmPwm`AEmCpZuzg7|VT1VdSxn%7{>B;v&jOlW+C9;OVJ zyV$O>`$IF7f$QwDqTe2oBG4Fy>i0iffEhBfnvAGFvT`5`DJlIYt9aOGE@@~?1T?jLHu`aeGaq*+OF`gTp(i_sJv`6S{YfOUWV|A}Y6QT} z*~!N?43s9fEpdrfttNF=lP_IGO0trYfzi8i3qK{JFrXyyM{jpKd4gNP9roi;*S5GUmO6=QWu6Isvhdb|+S z=I4hj1C#M$xtQb@G&G15!?!}$76k=}6v_SCM1qtq?Wq=uYY#&69RZjB3iZI12oN!F&6(>wvQ)=SBmsoBz*EwXdcgAeSqWR+uEp5n^RJLM)LS}h~JKPl< z8!4$;+aBn78`G$qn{q>YJ^OJ!I5@QT#WolifES1-RTS@;pwR8fmK^HqYeb5Yu&`i8 zn=!H-7cK}rohahQ{&HrMU)!#8nv3d))}Gbfz14{^5h_KVs)xbH$#VBLq7wOTP%qwG zFzddB&fN;29(kO1(c{$AZ~_5R(le9@38F@Z@`{M~K6nE^3CeT%7q9*d4Prn6l2W`k z&8Qk&`Ui+>%&QozC2(l$#Z5vL8&QO*t?g2oP9135xs@KqAi@>ljxS}@YstJ(DwZEe zoF7ip@;=c1;9kEnS-Riib^37K<8$x1w$xIi89rzC+-5>()bT!IemEtl=|^#{!}%8G}7t%`z@^nT;Pi_!m;s~`vLk*(^=G-@TF6%X2<X^%*&>{&5ld&-nSl!}rzAU^C0YHbG_ZXtDqxN||4Jb%X zl9IY>0|M5?#b2uhh!w3268c(y&#tgj`K+oVbG_CBU@5~KC^ZAWpI+Iilgg9A81lI? zB}*`dhhb8`#l#M>ut+(ZS#{kF#9(Og(|0lKtFf}2t%HdDU^(59agT4o8`pieTl`B5f-Z#c4ub`&%PCrN=oq(4pQwPNL*? z3=?CJyUN%t<`5APxgLCplLkKL`^LfjEsB5uQYy2ooSbf3EBo6nhgtTj?DuVbaj9umBl3S}QWKT6Qz_$@WK#^yB;jK!d0s-2mc{j% z7Zf1q>4kz^NE4{Bd0nC<+4z(0jBZ^5E)*hBYj_pdIpWKMa15-C^|-*0L~#kAuz4mX zoGL1{sj262^p*Zsz^+cDMEai*rGD+e|pCmZO3ABj(h6C~x5t`Sb|LaKLqm8kZr zq|;jDVdn4Yh(p84Q0kz_!%Ca?2g(=}Zy(Y`2y=svfZ36r;5118bN&52i8R!>3TV*& z^oDNiS_+wbaR3dp{g9NHriXt4z^f}rM#hyae5lD_@7f7xnQ#+7FG`!@FeOmG{8U!+ z?!8Ex*;;q8{QeIc;`o8L2$o&^57&iCqW-~>d64E;=#J=QI3Q7_!*LBktIhPL9PXE1 zZYCUY(XRYVa4RckA}tMao{fc2YSMw6^nxuBt{9!P}%8s&*09|04E3VKBA=nrk$3S_I*!N zTMPzUn6m_P`W?o&vd4y;kqOty5fv0JUduq61^4Y-)h> zay7ux28a=W8oI1nt%aPH^sx|pOBcD=~s5+ zkZ8~mESDiTJ37kB%BuKOB%WpHZCI_bi`A^Gd?eYbwipi$1DrB3g*s4?7I8OOO+%DXy-LZgyW*ttYihVM&L=hW zi--FM2B;FAdZyur&tw_mpTr6%Ab5CqoJ2#waRUm$D>M=yFFCvBx4or3?FFUHIhbJ4 zY05`pVqz4rnjnW6)ur`)M)&I?Sbd7^)Q@k++$zom4RZeRRM<=r937A|_6ai^K8$%h| z;%Vz1?(Rk0=2lkWr=>6mt#A7T4hf0(%CBdEqo-RVK*%y*>m6?|Y+#5eC?JSijS0O; z901&)$MrsJL!@+h4LY1F_JE&}smC-lG$0)mL;Q+8~`o3d*rCh ztDRxk?tA6124w}V$#ED%{0+dDX=!K@5)%Q%#S>5*b?R)pCLeB(L~`Z;&kER}a`F1< z^;*d*((1}efH{{iTe)ZWfN?;(yNFo;&~Tdf0e&*M`&fEHl+)bYjBxqFVIFtVHDhS& zln@0W!)tSp(6F(piX)@mVNIg!(mzsbLigb*C zyVvS{4U)MG5x>LvQQ}K;PVFHFp|F9BC~}eRpr1c~0=^#>ZXAP#?b_NJkn!XUFQ9rf ze{BB@kbUi~gt$1)+V*ZFfL@`aOEOG%gnb5ctE=OI)Gd&`(I(?C{R-F|a|`GP&&~je z2rz44;CX8Y`6<90SgCoQ&m3`Vq)U=?>ibd@zmQ^ zgaCgQ5QL`q1<5KZF}neAA~3M%0$qa&2Z?yz)F^^X$PgsKk zEd=N{;o;#9S_cVtAr@2LwMh}*0?g7=$`|h}>5%o3PX!-VhmEKE8VmONrxqvGZ z;6Xj~pGP5;Pkhw;=BaF_TWh;0&BW!jIapuMo2^)+%Ha2S?>00&FE%_p41`?oy){g_ z+J=}7Gy!{3+Z?^x;`sO&Fup8;tSA5w2ynm%4DCi|`Ur_w>3l!H|GVefJGz(oTF7nE zAJ=%u=6$*7RuZmAhXeaHVl_EuZEejo_5iq$KnedTgfv3p>o8U$PXMD08yg!CoG_pO z!=$4NEz0d88+{ojMtPH8xDGt zMLb8ltYO$HEY0U>mA|i|Dc*-dHl#|0va?P%T|@U^}O zZ&?S90&XoP6nMkOhkI?F&)6bRIz~pTxoQhQLcYp{L82lffqI8!W@gS&0DQ+lp%Ia;I`a^&+$vx&S-nfXj^b4E@hadjKXBJkGHJ zW|OeXYktnd4uZgBx~Zk*?&>NOh115=v_L&`WUES(DW|otaLfN0U)+z$fp4rtHyT9aEzM@uaNS=zw)S#`61{N)d5 zRUc|*0qwfPmNZPPe`LgNm25OxmEo;?4I4thJDB_%vY5xwU%cjUaOtCuX;0K4Mwmz)D+ql&JswNX(DWkbF{j7pxm2HSxd`XGEq5U@RWi%=J; zuwlZ+js^acRK(YNFo_M&%$@nu76g@H=gNVy=0z{AonC-`pABVCRKxRky|70wwW+pus6#z+yhK~ypbbHzF@h$%h zCAfO_5$c&sTo^)M)wh-z4#Xhs*!4#?Suug9oDlH$rU% z_a%E6aOTxVFrs^9E;v!0ms|h$Qwu9|yrU9ImSf}{kI@6`LS| znWcl+?Il)bGC?zp1S}XKx+*mmTHfpaEykUZjfZmd0%gx5dL;Zfut~y^M$23u{JEUc>tqi|yL@Y?jhZxnL4@Z_IcK<3i(J zIH48EVSz1OO&L?FH>a7R<>@@8l)u_Re#1=MEBcg)v)31W zGK23Cg#^#+R|~?JNfHyPd67U5?zLlW0n#_*a+}5kvh+v{M>Kn~nAP8*GMZ?^U0YlQL@ zkc5<@ed2hrcw0aHoynasbOt-dnYNg-R235MG{`G4B>@qFd4KlVZ$7XmZIFe~;jWw% zP397iAV7OtqM9!4kIc3*DFXXX`Ymhku9kc1SGX3!Wi2xHI31Jkc8Uu}ScFFu`tcKx zXS=PNAg;O+t~>m-j6o7grA$oNde<9B(B8^aBk>R77N!}#dbb&NMQQ9!;vpVP`>_VH)^6mE4G;#Q+R)W!bE%oA{RQZ4P~{5S=h>g^7t zn;sM;!a5cY!6T9Oij$C~XQ7K~BO~_{YQ5ZF%Jm~D({A9ba=wgP+<@OWV%SPd+)6YP z8Yo#;lfQC-s@qa_>vxtZbp@5)+UKgaD%bg(f}DCvYrUl1 z#f2~5zG%4Vw=~{LcjBKXk4u(4#7Af_NHg@}oYbSPMS8pDJ#-I|452WgT#0)ZOQn#d zFHsb|SAkC6(V4p=M%PL{gBulYzuyn0U;h%TpGl3yoeZT>>CJJ(JPet9au1U z60EYEMyVY1Dd`~# z+&vHG_>T3>gpCRx4M~lZqn`TtdJcP$>G06#tA~yFL_!4)``M{^?)5E4|jJl0v@HAUP#Wm9|qx%q_B=p9B@H#xBI zCitycRGC(N7h$<<e+nHdglhF(_j`TnJyN)XFRECHneZ`rNJ2 z8|xxQh>zRjTC3D*|C2*ei~ZkZq8<(NN0xskPcmK-OGafy1q_>zjqseweIt<(n4u(M z4E=hsPN8&HbCRK=JsB zylu;(;Em@Gxfx4lvrc1@Bp*>G45~ojN8{hcBjqDCte&|Qj%Vg6T-kiqHl*>Csf?IN z{Ud*ITH>@k{GOj!i@115jWno$x@!GGzYY^B+%BB)LXb-z9a*6eI#!Y9x-I|P#aVqj{f*Llxz#s9gVVt z{L!pF+dlJ4d>CL^?MeIMuy;^!5f=kfpZxGe)+U&d6I5{jYAwf!n*aE^tf?hyc5@no zaTbbdFtV}QtqPSS-*vqAujc=cC6q_-d?i2>KX48qV9754j+m!*=~wvIW!5FTX8qXb zMYH&&2n~0-(4Qwiv|TNC24ijo^<91&I2pizCXgjiJ=#%& zz!M_{T&}S8HD)=650kbHb7#xs6!~^QV#j;Luzqo3Pq0UgNRNztOzln;*3CcrUDO7P zlTwhevbm4D?QRh3lJuD?#L{s6i^Qq)+$fmYN_!!(>Q6V!sFUsj}d zlflcOJ^Qmu2kK2`-VxiRAe~8{?K9dPO5e#Yg?62HrU1k2chFcH{?4DP%J6~u4@hPZ zfH1~{!V2Tr4cYT3EryUfZA`h0k!A~G<(55s67^uxC@As^8MF{0d}{onjO)LjIuvd2 ze}NhZFI0_Oc#3H3nBlL)=Q#z+=7fTZoNYNZkpr4myZ24GijNec+E4Mk310sds?(7U zS7*E`b<4#(R}d^anz8)OF@N)ZZ2h*cN1a5a7Z))*W891XR^aI|4^*}hJYSB?^zcvLO(b6D)U+B+`!3&MSnZ1&W58#5gkNU@sFPTzjW z7b{jR5SB$}*YE6c3TszMZxqn-(8O(qh$4!U zef4(VrZ}vWtyVcLrVfk-zJGyGcuz}xD|^oEdk4rK$VlA%Ra`Cx_DLxOikul9)Ihd! z>dDh>R%SF9^Fd97e}~DltgaN^4*n{GCrr%JaM%`j<$wPx?4RxjEA32tcuW;T5ztmr zrf_G>VzVg!G|88>k=dEtXtUciNukYaL?aAit6iT9}-p5k@a-faOYB>?Aur=>IT{JI7X1O(fSo;>!YD+ zljO~fg;{l;n5D|g}=e#n1G9|KYaFa66(kx38QrHQ_?*=w`k>;@b2(nkhMo%xPs zZ1rFL`<{Vp|C@AJJ@k7ty`}^c2o?7td&@?aQ8%y3!vqP!nvy1Kj4JM3%Q#DMC^&Z? zB{1)?stZ6Wc8Bq%Eb?b_q4&L!XOWJA(=Uj^~tQ( zR3uO9{m~mPqAP}Yep|iVt48HQDxcneGQfR4pBK$2ODdqqv3h**Zxte-F@e zgqC|eD?K2!ufU0)#i{q=qN54^dQD8RK05i%Eqh0Fgiz=>$u{cIN7gy-5l(zR{8!?v zWI0iB&udU{`HGTrM&RV*{nhYM+)<6BmsDhUgAh|NO1IcuQ(;g-r`iv4SF~Xvx^fIj z(g-ANg1o&@OA03JRSln}bH`Jn%_l|*C;&x=ZAp^F3i#uYlA&a`|0Y% z7O~|SnhM;nSBQ?a68xx#)O5JUf_-!YEZ8T3#zeEDe@6L!@%>v9ofQ6c@I?k4UpGXN zJd(Z#-|giyMWL@JG5Oeh=S5$cYm#m60+t%IX|@(GHfT(0IcV*lEgH{cAu zlFumImFUFyt1@Nfe&I~!AbCqD;b?`YrRQ!5~*W5ky{d?N<@w)QH$hy-tz>-JBt z8jc&{o23N@fd@)I&i!>Tw3O@xj-kCfa7W)J=T5($4_x*>@R^2bp7uQ`xDL8W=sAuE)e$!9nabLDm1Wqa zspGK_5)F1tcen;ix4vdLbL&n&<1XA0DilZp+Ex9rPekToXlZ)Btgf8u&!4OGwM-Ks zs~>asc8Bw+)w`m|sU1AzzV25QJAUWq=59xBgbNn`YH+9J#WH6eKl)X1&Wz`8f%g!> zwjZa%@-YG5U>OeY7ijQ^6e;3CfnRU%V zqI>*nQLd5``Vf~B=eU|Rb9Sa=TTAACIzG3Z@5~)`X8OO{(lN7uDDJsYdHvD_MS(a@IH}^}WUMkNEw)ruH3jb>=y`5?m2y8!Ci)wzK zB9AzW+X!qCX(+$F%`_rEDkuQ{kf{b?ccOD$M4<`Z^7Bo1?#HW|)9NH9_NI z8xunwC0Y>Z4$oL{ zGB>x~l30+3mw(vYbo${Y_U^`v z(3I~*ekqK7N5h-UM-ixJ+D6ipyG!Z)L*bttw%&D5zK+r}IQhrXG+2d{BWmv;} zp^YRWDL4ul;v}*XrbA=*dI#?_#+RY5=@|Ua6z&|i6J-#X0p)TMqHED*A#k++RVs`Q zGmfC@Ym{fR^JYmM8DTj=o*wJc6Ce3QFlvIGu(-Zw*wpcWO;&$ zbh!6|H)VuX1)Jg)%N|K>K; zIAOqqI)CVtshXu%!#-?~bH?sDNe z{$G5*zLsj#9ZXWMzm-KwpZLG{`s%1Sf@j@@1PL14-QC?if#4QAKyV8XoW-30!QF#f zfS`*8cXxMpmxVX^-6!{-`_7re0d{t}yQaFU>g%enJDaMCi*=x!GtieS=bNYF?-2One7{TdjxQ`c(^k+x z&++8j^hUm_TzL2mpOS{x&&w~Jxp2L&Uy+!i}HErV!pRhnPbjIoFUdFpA6 z*36fRzYg0*c6MHTpm$bYh0wMB*YqVfR@IYixz}>hhQ$=S=bmvkV3JQpOyQCm&ac(B zTdQZyX3c5ot1pcK$(E8Y7i}>j6~gT#FBL_JbVl9nPlu<4HtCdW(x<6)p`RYdvwcG{ zDlqmy79}4d-Va8N;b?~eyaVdd1#&Z03NxaX02-7RElUwJ3jJn(++0npuH^0RE$I#` z8P=QULR`LMlb{54j`%PSj|&etgfs^d$f^vfyFz|Q_HFv)O&$9|zJT+=$7!lIL9&v+<~+>0=GQpAd@!b%^c-{h zJ6-M&AkdRuSk-n|JD(jWoO*7%a$8xtS*ly(Rb2jc^z9FI0^%CdDkd46iNuH?0wo$^ z!QbrO=jom{WXb-~dHbh7CsYkF)Ql}SEe4lkn6Vmvd~bc+6x{TS%B1GhBp5DUxS6EN zcBGO*>4JQVU6fDwMw_b;WNBp`&>WN=@t6=0RR2Ip4JpM+}9g;bm;e8B#bU18(Ts{<^6W23c`cGD=o6!o? z{GPAYb3_txV7taqsIOenE!g$G&4zZLF57aWI7WB8jw?5EhOwTevP(IyBkFMh%XcXE^H_*WEC?Rp%(cEk^I)ST!X%6 zr-Q(sN-OGp5;9J(~{hBAb)Zb$mo#9uJC&EUq*B+v%4wMmEyJcEK zkfu=gL3xS&Sk^pvIkx4yinNM$PV9%pYh3dRRH<#Jp~ijO?vaQLkMUJ}jg&CsHe=$p zdIo0LIirUJNq~mKPMYILhzGh5p4X}S^#xmq&%~E46h>3sn9?eK#$dt5srCD1_i+6H zAlM62v_L;6{>J?H+1p+?wl=-Sy2Vy3#;4RF)pTkB@Cs~Ot9h>NEjx}uLF3i?rkJU} z8uT1y+Pjo^Gao&!Ay0?)flD$J>Zd*hhNwmj?eX6coLnJY>+G}+S>9ha0O0y;bO{JC z_sQhk2q!;6crRMN0ks@On&Wxo`h~RzfIK?{(*NOyv0M9lVHOwzLVOh3w6UrOnsN&T zMUe{1c7~prkMuZr{InVCJe}B#!J~ySI(+7R^CXLQ82NbdY~YuHGu zISflc3{n{}3UYUlE07()aRNfLmND51UAgq=v~AlU6-SwiN-xMM-P+jBPJ|gS5Fc$V z2@ikT$RphCWAh}8c*ifdFy1q1(zL1s8YL>FKbe$#-2|Z@AA{CtEicUEGDair^YSCt zRuOcb+I2?_)2d!O`LJ-@h7kti2Znxy%g5|Z1?Uqb1 zm$MuDGT33&Ys%%bHWMBbkv0*H;=7_$oWj}BZ?!HBH0|&4@7T4D^0bolX77EBk_Zf+ zMtY4K-^4Npzhl#I`Z5forE?O<#E8UblHJoQ8rk}AHNskNfFJQABZXK?z~(vWf?RaM z^!@H#nbG~qH&D)GG1qHKiOs^|n;5-pNQDrG&!J&=t7G(5TZn?m6c3kxtBkfO+B6Cve@OQo?bZEofYA7W3j4suE#RQZHJT zdfFS1ujtcN)t>J=2f7!N_hcK9VbnmXdC3jmBt181{X#5i#cH%9-0dg>78FK-&5Tx- zlP7MZn5{Et`#UWxS+I=SW^jYSW5>hj?$uMHLDkdR6ZAfop!)Vv7cGWr5aTPdb3OM3 ze~ZEp8^*gOm$tG!M&%GnDjx2e$xDTuhn=&^_FAXvxG$C3W)de+4U-v@y|P*H4=5nn z3Zg{JILT$VD*9r?R!l-qngscL!Dwe@u< za&gxPf1%sVkpVj*t1hc1+DXPo#z(D9oP52e>F-@G0n!iJ=<#R#4`VOhx0l(;An{za z!sFCU_PmPWM>{K`K3n2Ue$P3mK^I8~6DPJAiBfHfRXU54o`wZgrtBKO`PODu36PuhTKS3x zl4J{&2R4cCvy-~Fz>lS64*9Rp*0XHr4fCNYcIwcBu+MzO@4wfQ**2n>ZnkQo?U1E3 zg|O@MLyqUr4c)@Jlk|vyh;ztB>>ZV}iPKwHe`CHbnAJDLeRaLy+4ZT;m{)fc5H^z8 z<>&yIHgbh%%}3`*XY5;=cja^=H#{Ab?_CX!0(K5a$GY-vpj(% zXWKD>nO?vr?X$hLU(UMe|;+_<;CT=o2d+FCJ)et%weuX0dV6`vUPVwgyg^$6mqk znC`7gjP{hQb}U3N*8!4vD%y8BZMv zk>h%dM?`q$raGPdk6^e;Hz{B}Tjsi(FZ&!Q*b&z_$%tsR>jDTC?BU#@hd z=o`4Te}R|$>P7J?z`2t)Rdifg4BoW@bhJfEaMk!X#RhORCkBKZJLPCj6v@pO zsQP$~tnH8t+g#4A9#V^3Q&piQY6|vTS9ol3R}J2Yl5yf*5u4Wz8L{ZfwGpLdGfS(y zzV{wtm%Yk-Z((7AB~yQc1ExL|X(3isOlVEqI^LCh)h6|JJs+xD3VdrW2?q(F7mM=n zWY~^7hiD*alE0^C#}4zFHxlx#DEalkd12<{!>JR>woY~-7N?yxH;fQ9Pc;9=?_5f8 zGIEl}ostpbtGKtgnor#MEwTe^(66BPT!p$HoRt)hi4yP=Qj$N|m+xvAy=#>$P)T-Y zrl=qOp2i@T?3H-U$jKB}p7b;M{d+u>yD(G=**_xDp3E&5x1mdU$4j_hMw4izLKjOy zfk6JQeyyye6a(??Kvf*s30R{j;B!Cg8nDs~F|p!V%#L#GT-~Q)q`L90Jvbj{|Ghc0 zhY;PcNA%(7P6v>Y3$?n_G#MN9~aFW}66X&V8FC*)2e<5J< zyH%XLKYFmO`SEb6%pu(u$*Si)8NTmB=uo$I(u>g@-ujgw^6 zJCMp}9sIE$Y!-=p;BT-5+Zn#Q_pKKQzQu7_L<_NgJoGRA|JxUX~K%4Hu;_f z-@GErIx^Z1(T-2WcKvZ%y#q+jucH)URk5!H? z$vyu5VZod9wLgLC@73nM(|6Gr!P001Avga-QrbNQ5Ru1)zz!gw-nNL_N`c)6xT@$u=1U1w;Qb$wHB$+EA1+Y zMZJW7*yx5l6`m1&6)6r6^u_(E`Up4}{ulmmIB>dyy1b9PSNglC)nt?1F2!UI4(h%{ zUj)9KJ7ljwMR?8<(gFyZDj7GH1Dv;iKNl*qJU`oBGOIr+Rjk~#+oT)CRxwsB_LYxG zHUvXiL?e+vS$(2n+rIRILTR!EE?md;-KHOPjTe)I^upZuqF466?oQ9UM2|$R+*uj{ zi!DykpvublROi&d-+?{-llvbyU0UV%ZF%8k)OsnkVpGFF-OcdZ-H&JSUjwjrtGi9N zV=$HGt5_>U+qb~>K_D}5e-VpQknJEc@b?GHdIyo%W3LWy>H(w%hd;?6f`)~_!F0I`M7YAuuKf(KO zjStFP_6^aOG69J2`4%*W%-*;EF-2y%Lu*!Rwqds6d-ZqXs|ELicT2S02;Fq;A6ey@ z7}@CeG@KK-6Htgz9zPvWUGyIU243TjCTukPcJCfzG2=Dyl=JkWss(Ol>^)ZObaOEa zq?P$v-ZIER+TNBG5>Sy-I^NT!5W^wzsAyAwVQ5DY;%aepUqQh@(FYsTwA4K38ziMb zUryh0voTxOFc*e)!g^@X^5ix4J&WPd)+%UG$kxJlH}b?bXpubiPc6*4;vmr()@mtI zsWz?=g;z*Hbl28>--D5_8`NXjnKecse^S4~ph!rOY=b?IW%y2}n8z5Pq@vD!!G+!_ zuHAJdk`{NS`j+-H{f75Z|1_fWJ~MO0^h+p#dBAJI};c&Is9M#rH{DkH*J$p{Z3!O1*; z7AhZ#lw^vgzolUK3*`D*7O*(orrswMO=ijS{;30l@(WPU&olRHHQqDzTKDd(xuL|NRoQ*XrTXe{ zW5@W&INw1^v`6hT4TQ6mUIe%Vg#?+Yj-?(EoHVhx>}osf14V2_;C0aB^7)?qaDxO{ zhy!m4hyz0wsdSNfUG-HNmreLO^N3+Le_K0_a z`@n3mEL*1?cv`{JANe3bd|QC&^_Th2n;ePRz=*PlY-ur%^jltDK3-8i(TejaYZxRH zI37423uFstJ7;GSXFc$eA#Llo8eB=re=>>VRHPZPf)*+s@kO~0;GGZY?0|CmRk}~@ zgVNprA}=;mWzfjT4F0LH&L#O?5;6A{rZ0yg=)L5Ll$?zPkP5C&j}36b0*R$SLOQ?% zI4DR7eE307P*-Saex9F+DbkyPjt-BM)ZW49?j0CNN>G7JO)M_-MUz0hA1;9+8f+XK zn4H4GU4TTP1`P>#bX-6*ul@4SP$WGzE-tC4H$KS3#N;a>h9n{dH3>;YreaN99SstY zFkTb&_TTLhXz8^(J3Ha9F@5oN)IbYAHNMXSLz6^wVJG3Wh)2HwctZdCz1!BwJfmY{ z$^Y+WI};O0Y=DO%K0e-z2nA?p+MC2q5l79%r4C5dS5iU)0j#w^)y?$c;$lxv&+@YV zZ0bGy-I)Z?)6~6(RPS=+YcJBb5N-@3a^52FG6o}-BvzkNzPpq@~Cjy&n z1}3HjNe)e;%4E%0BGe|i9PQIbTn@1HILzo75_`=A)y z@t>Dahi>OtIoDcI6Af}fGvyl+gbjL+DUm+9P&|Y9_WAnRGOxVC`d3~t!;(AD-n^j(^v6;`f{ ztU%HsM>e|sf=RB0jg-ls=E3E1K4Kf&j|X$apA5{1aDZ?BL7N%X(wrt-^~!SS&n?=p zXbH8~R-cS@kyd=zIr5U;cpO@>$ah)7*%cDiwd;)Z@{^; z6S<2EAa>&pbZn%$5cLy0PwCm}oFugoRyrg?Mgw+ZsvyA_pe1?zZkqO^{ic7Iy~)dKoSW!+{4$+=uRoTHD{EBb*G6QSYA(SIcsVu z8l*qSW! zC--?gZhZf;y`y0+O;aW zx_4z59^#U2Y&YK^fcF-34@;{0#oI?M=>6fmpzbKV-^VxF?Ga5nYMs|H{AUXm5~ee( z_YSl*ge8AC#VB_?qzA9GIr!>5#d6fFw)N0gU%>lW=&I&38mnMu_A>U$&c3oRLv`uL zG~AU>E0j~PFzaU1nj0BV(F2Ou-!L8dMSw{7FTN$7qrL#0)-|LCC^yyAI+tA?Z6$B@ zoD{6gRv|%8XPBqj)kD4LpC#t|C5XouK+;gQ)Gm0MDT2|tdry(}T`-9J=@aFSx zL+3C-nH>Q-(n?CVTorm)|8?-DlxM4K);>=U=bt%ZN((yk_8}If(>$w>w&>AK64>8o z6d|e2JdF+#R=t^XPeejBNu|ba&TgRfD~}1orqr1KlM8UbmLBFmws+FPsl#tPW#t45 zlijxm>jx5jQgb@I(4{nb!=!Prm-&%9J{(h(z>W*Qs1nVJS0}XPBU?INx5xUbK2}@%db>&F+d0DlhSdwxnie# z#Z(bJS^wSDm?*wxsI&>?_sOrY)=(Sp#&M3nU6VU?;A?ANaR+^w(fG7fvM7zhmS5HL z^(~eeQ=q6qA89p@6E5O?_`=y~i-7opu$$~JVJakKIVi`h2SJkvCl7foyV5hVinflK zsH)}WDgt0agh{w8Am1~~tE@Vim6{%`9ZUt5>Xx`kvx!m(e`XMAsikUnmEii37qR=h z^CdpSmJ_5BiepbFe8-Iv6ffey-cA7b66?AQmyB}AR59SncxWb9#%IfAAowM#&V^+_ zIc_{;TsTxa^Y_YWU9*pxEH*ndw{vOHA5{a|JYU0*r6r;(e_xa>0rLPrvsCPUWN0ai zj+K_Yul$rh>qGZp6xy*-GcYVaY=?C>ebcIVPK5-#sSz(Ba99{6vBB%Y$_^c|U z|7~X1Vpk*Wd$VAP#$phR7%`-sQux72-o8-=ukX=Catr+0{8Vu+qHVl06Z};GQp_8B zS4S$tJ7|aUWK~9hlVtYpjK)*Z5%q*8w145Fz?pMI9Lk^afc#gQRnECHtHQa~YLWwP zStyK|;u@Rf`vuK)TfVFh^M8RwF34z+Pyh=IidoA>iE7`o6&jsz`s|>ftVv_%IL36W zxSV-e`gi>88lR(E7>oT%A>W=KVAR_BZ7cD(nszUHTMEqI>4g@qE*iYY`kaW{nY0Pe zDUE4sjf4Est8Qm~`8b|ds*>q=lYYbGgs3YfG3n4qOX!V!XpF8uv|#HgWnh(y%oRMO zm3{ywx4+-3;3@Bg(}%76F_5@=kN8K!ic||c#J9leBfX%qv>SP|hqk7e_2*Z>!#*^8 zt;%-?Dh37fwJ}sN+Ip_hK07+!`Y&CDvoQg)Ra;R|sC-U8JSGJ2iK0=QT-7XZ$fmfo z=4n^&dD`hC^BoxY%nNP{`*wTLCR_MQ$cs3e*Gxd}7#>YNM0dAGVqu-?AogEHcew?z zulD6_5E*vg?$@v=7kEwRUhOVJ@MQN4R%_u0dhEmTthM($$*S7&t6roRb>SU*S6OlyYpz!M&axBnlUMn`Uk;;uAi$S!)8(g~~}Uki~(<<7V-GNNfliY?g{Shb>z$t;D!>(WJOtoBJ9St}qHc zcNlk&Zi1wGL9-6W!q!k%$2sV&UtMhWuxTP{6z~*>aIjvQ8td0{#zNt!?$VC#sO$U8 zTac7}D0T3Y=aTgwO1?v{Z6Yp9Vg1RO4<-uy?BYlOA8|2XYj6Qp^qz!Xe}U&>W`GAuV9`*kv9TVV1l_tNw6SRa?t0*5A^;3Fj0rX*q~?WT@dNCy~9Q zy>*59AUhe?2o`Ik0rMvOjrNJrb96>tQW746Bfk8lHL&1CJL<}}{220PxyS|lpcSjA z41=Ge3%tTN*XT{h@-H0+)=#Dt?GFY<2JJi{?TUnrgdj#8nwYK^j8&y*zEQ?7s;RG* z&#k{Q?rzX0yOsm#6SQ_SJzJ87$`~q!#XNmIoUM_l;t4>@zFvRA)4GWF5Zk|w?-&pl za)ZBFIi6kcs1|S3__PXhP%vSG-oi>aDb2T~*BmWUI{Fq>ZQgIES>KXT)O-VkdcW_DHyJk4>{l#^eb1#(8*T}flz2^p9PlHV zIC<6sUd{7{_pbU+_yTX)YP;G6#g<~#tW^r04(AMAJqS}`=@DFG zh&q{!LLd%kj00slM7L8~T$|r?RIS(|n4H4hNQMawUu3>Jq4X^NhHELb0gRX2WX;KO z5nV)sS79RF`Qr~&s8Ns$6P+#W#PleOk`G{4miKr5O!pSo*YY*+KRgbJD2rw6BHy=` z3m=h5D9n86^fjFV0RSK3TW`4`V*^F_kNWB<0U3kS5=Z^XI>8sQB{0DCZXwsjnvuy8 z@La{)Y)x9#R1>szu;?N_p}seK8-+p+7#|U_wD}MDlfGGw@hvQov&dcG?L>Y5~r$#+&T zU_06LLzloYI`F^*j_at0sOh;Zm7SiTqLPk8ess8~l^HmQH2R&OWWXn^XB<>|> zF{#=qKUBAq0FzlXLW6d7+RedeV_~KVn~_=6od3IjVGzOsW9ApqP^k0yEiC9BEWs}D zqbzgryM1@)uRaia-q_!rt(YM};)VO4*X~nI7$EVY0fUE=kJgGsIp?x*Y3*v1`FP!R zkh6cJh(0QZn2RR`!QteD1~l^5a;q z{Z>|RHtM~5bzXCdcX?8su@Qp0_JS;plqcct%J6dDq#;P$vc1s$%4J6K z&qk9oSX4c0jQUq`dJuOeC^l2IPsN>frgsgvmdBrb){&#gE&qFe7mhxVjMDrJ2-gf> zS?{-TZxoZi(BC-Hz2w4Lfkc+?kqCesv8{G((e!>h=*r4qRJ~%?9q8Tsa{ns*(}EtD z2bp^h=@qfH<)*P5z#=Y_PY7lOm||T%OcDpWTFab51A}Q-cHG+P6SR~5W;$6#Nk|o2 z@x!B1OtXGqv55;x}S6qV^X+;I02t1hbty)=vUAtb!D-)GZ4c~$Y zqkQ%UnZQ!&3)11h@{DDvB_zaFKzlDwU=Yn|6&U>o*4n0UOixBQF;cy&&1apKg2NsSQDRS49F%FV03oF`| z(=&N|e-c)8B?EQ<#y@Fo{F4whb^AN$rX&L-;*4Ldr?{-;-}i>gn{VCjJWtM$L2gyV zM0}4anlPz;^CW#IjnFs$Ed+8Q%=dcnB!*Eq)rG}O& zSM47+0>M@10KTZ(1vcougP3TG3ohu#r;68R;_L0x9$@$u1vD!38eplZROGoh|BHu~ zJs<67GJOSwh?2@u74^CLlU29rUro_Ufi#Gi0ASNdJ-h%5BP^`(7L*lf_UeAD#cuj? z$Oq#C>!0(B{Ves&>@HRvT$N3}>O>~c(=i`VK2Tb@*y^L?Zb{xm!^d><5~V(NW~9@8 z^e4a8i%Ht+q1!>4kTx+9+sB*i`T{(D1X?qCY5Y_$Nw|D5-Dz~H|B~*Vnued5MXa!W zTpCf6d9*7X3>SZfi?iK!dj~!_6Ea`S3ubcrGb{%{57*&A;4Q0-^77C1X{@bd_?ids z)4ZvAZqBYmG6@bw!q4Zksh5)`ARxk=+O5Q{^f>lC>JL)PpTJ4f2;(ekwjK+47(Tw% ziqw%%9jMpKh9Nc85Bb4W_nV40BorQAxN-FhG@zwiFz`4C`f!BAX>4P8q_cQSE|zvy zw}oz>kz~FPz*>Zq#zIdwH=H1ReuIiDW^Z0FAR_-e7;-wUo#zRo@F@GNc$81f1AERg$`u(4Npf((>R_%yl1FOczI5{n5A*PUuQmLa|irOA|Gn2=b8R=2l zMzr)VU#(g6DJXW|sD9f&U~YLF?8r3@&loAK9Q>rnUVFHh=h%kq=(brcC&=SXy4)(#hqfGv z%2c|{c^VBA^prm~ZA`rTIt({_3~TNh=)%Y(-}3_-m`Lu_1cA6twNoxX;>#g|m~b9& zGN#Vyf@hc&Y75QII}V)2keCe5b;)(j*X#7o;ijR6_e9~Rr;qrTQDXNku?9gGM6XG} zy83~!+ukC1*D-!gYlunR3q{*L+;5S`Wn_^@A2~(m?-KH*Xe;&8a4?o|su|OuLK=aT z{IgtMPGN4H_ZH0Ms)wn;4mA?@W3ZH_K^eOk0!Tkp`EzThC#Xp1TlyLHa2!*|ExeDg`5^WLpeCfQr`P3mnk`<&E@(> z5CTM|4c-203>%f0_Ho}hJY;rA9*IU2ux1n(;hAn*0i~c0dzC#xFfAqD*nqTu-wu#+ z717v3^!#k!(Y5F}$12qqf0SBmZ8Q=FeG@%v(3IO!P44(&YRkM|W zI#zL`CT z<0ot59?Ur*0EwoK9x&Ie(%a^-+`o_8^uAOG{7Re&e@DvBeSE_OLiD&G-|l&X!-Hyu zQx})#&09tY(wGtIadHQcTfNP?+OnaC60*-gIH%~_gNsz$`s6y2l?7c68JYKmX?-}KuT?wJ7ot>EG!|Q42PbcyngwsQ z)l^N{x35u0WRpdM!U?_RFWmcUClA^_14IycuiI5t7QFbk_N{~QE{KQ}3@Q97%Ci*Y z)2`uj`by9aSdfjyF}~bCg-mxB5aJ3!1@)qlJo_&I|4|{LmL1)7eA^Vxqe0lyfeUPe z04*$b_b&`@6Ozj1*z|ts-y%2uhjQ12$JW-G*nm354NoI^{L_TW-K zG*Qw_c*z){;SmxLr-H^>vW@sQKpvNkwYKHO@a-EGI3X-eJyT60DjXrKnJipF^T);( zD(fR)SiuCupz+!-e?GGV;{+MFc+d$c+G%>|nc@KVE4 zh|*PY6SZ(NwQ!R@VvHPK+-+a*MI_Ky(?#iwnFZ?~|m)sAR@iv|? zrhy&Ou{!lR2WKmyIlzs50F0CoYAyAk!ra*vu~^xS>CY2EOQ6%n;WTGh5rKI~tKGPo z8gruat15bq(ne4W=ymAb1YUt-j0!Ra&lA$UO43;VBz>tM|F?Vwb$!$aZ&DDmZrzm4 zA*@d56&&#FFPhpg9efHtSi?$IT z7L-hfsKAUC!H5#p?~9w{_NaPzAO|ok7Q{sLQfucARQBG|mexe$xd`U%9$!kbX49$6 z<*Qp|x;eReI@z9IL8Lu4=M-?T6U~UwC5v~)t+45YSm=Z*$Y__oc?7KQ2ZZJhhdMZ~ z(IvD*vAsNGe?Z`>8>p03M<5c?tQLk)K54 zG-?jKR0A@hUW~)vz{>3a55zVydPN0{d`nZd^+g1=DK1>}M-jfVU!*&;n5x^2qKKB& zEnes&4^C+>QM`3ItTBL*9&(C;=xzROvjXf)U`4p>YAsRIim;@+CORwSt`tDIhF(z8 z1-idJNFSZ<9@a!-xNzqI5l=cgDAT#%g2bi;u%wl>j;oENUp=l99@Z*XHGTW;i`^{H z&pt#z$?2-tJHW%sJ9^lO8i&&xR~~>@40!cPN!aQJnz@CQc1x{i#UGtXGU55?c5CAD zmXf1ekbQt9amz{IkWg^Z6CSMqOkkOKtzPG)gzz0kUb|qA= z=1>NZ`;#sG@YqeeucnNm>8M+Kimog4YVJ%OEAJZR6JF(GU2-h~mr&~tD;|g#deRr# zFbeAzTXJKR9GJD-dcVGVQ2ysFQgEq*rJ(c1;!B_$7LQDOJ-S1dz~j@RAf2`Ca^vUr zV5Ir%FnQ5Z*BLAzP_w?p@Iu^xyt1H| zyHL6&DyaOhRIXtx5qk&vXRrKQ=Ku4v^&*g*jGmqVSDS>(ZsKpE5Va5wmyliH*nM7r zzLSEnj}mZsPd`P}Y@Yc%=2w#dVNBadWOxw31mQdH-M;`(`SbImg*~1lfdaBtFq9;X z9kQ?p5JAgwiizaYLv%h=obOA@f1PhV<;0u?8Y0}kT=tnU*7;XvUMDn8`P%JF|IUrI zc{-n6$Zv;!NYI(lY@3U=08k*&it2ZFuOgZ$*>6CAvkW-5QxklH1D|00%CEa$?VfM5 zAsCM#g)DAOhx{(*$wJAmv_^%rvPE=#aRPcZHcZWIFSvram4((%$+wG5Iej>04+u*db$C{a5O*48ZBRJ`zr#P1Pcn5)M>V_Iyw*UzNIjn3YS!~<>wNL zDt}#EOQzpHBog39`^l^eQc=;UIhnQa>%&i`*!skB92T{a>koro$@ls7pfxgsus-7% zNY)IhvU8-k0>Y{O26}8HP*AG}Db|JTCgR872Z7n!)@dFWkY88Hz`&>KvxD+qfbK=H{EGM))@@_qHrjUKko5cs+fcNr?k>4U+5=jtPPnMZ@&aJr ze5bAB79GEVP?YRx&C|qmICO4%Z6xKKujGl<}Clfujxnu$6Ys}e__%*>>kygdw?OjI!hd^rwg2t#6$zQUL zH^+Ot-})O*TM>|ahovA|qD@{HAj5|>qD`Ls7eiQ>=bAIMGZ-nd6;ZdZV}vGD9(K?( zBPvNaKh^lX(Fc2HGmn8R)GMsKF6yw~XgsJVB6QD^hQiBNQ^Fwj2G@C)>q;Ojq8MgOYkmwj%A4P6w3L{STB1kGtY_W9CuO;`)8?;l#51vOqZ+X3<}knrXb657SZxB( zy(B_jWKfvBresIHZ+O7}7+fhYt55CMwa+F5eLyP;=`03&GfpH~e@nir%944VL&>~3 zQ8q1N!}QTs{b=U*l;RgU2SdKUU_ki}>`kVjYAC7kjZ8phnfx8#pkKK!7ys5CxFA!A zM7Ex1_80#dA1m3Co`gNMZm3jA<%y1u1nL6#tH=BmrCq73>@?G5HooV4cvAMKV=q-Uh4~ ziTED{b|>UKgi)21CGpwm??BxnVz3LxW&a5Ri)Md=M4=0c%F*%U7EAosv}xY~5XzhA zdVat~ddw$~By(AFhKFb=xbYPUBtKYcI7Rrm%`R*Xh4LLupUk#-fhz~6@69vmMN(5; zU`au1qXgzE9DulZMV(i;8SfPIpxV<_u_Vf?PmNbP+tqT#hfAKlNDa^y)`8jV3<7s8 zunD8!L0?1Jr3^_y_^&H48`HnTB#{j&$0&2TLgt95XqUZ{j~62<57uByyE;Fe92WWm z+QFL{-Et>r(f!x~I1XN5;*lH2R0L{x)idR*Mi59taMxCqq0HN}7$hL8-AJIJt1pg? zl(JCud=@LVZJ-P)E~igipI&2LkzO{2^NY)S?sH>3hMHY0bFADtKu;rmOUf9B*s|{{ zUT(9%1}@jA;ZEaIORzv*V9%S)f~ODfLe*({Le6yg8mfQ6f~5DP!HPypgO`hug%vjB zEy+ptcmtc*B*}UZVHXAcO2I#WZu-}pz?epQ6W|LY{?e-C#NL&Y%CXnIi77Q`?+|k+ z9C|}mq`C7sEgxoLu|WDh&fe_$>(5E5zeaqbF-)EQiY&*snI3|+!`g$4*@dB(4=sRl z`a&ll)$OIXA{k);Yd5}=@uo*D3b|?`vWirL63S=Y-Y7u8iU5S}o4W!Z1IS_4M-$sU zUcur3R)wyQ*m9Wd!<8c7_JC_*>WtN~*MP#1kVGc&VAR3l*mU@%pYP^ZKW=+{F@Z3# zix@G9qj^Pb8m8&c0zJ^#EZ>eIVv5+XN9`ZE;xHgIRL9lenXlCTrUSO+S}H%D`1`y8%&u|oALkFcPaK9TynqDPmI zAC)9E332Z|uAYsgoAl277d=Db;DFM6z=`=UUVv20*I4>uD@&F&_m1hm(G+y(AjLmu zG7|N#5u#`B9Cq|7)Bye(m7Ef#D%|G!54!Z&DJNFA9^T#M#)Sg{iCIUmbEGlF=2u@y z@T`xdM;4sw1R(0Zd_|L@BNjU!r(to;SL$5t;^$*>QC&5X60v!&ur(M*mYbLEtGr*_ z4y)U83930N42jYZLnI4E4eC?f32<F@y}Dg6=tZMk2Q%1)dr0y zF6>*`x3jN=JH)B0c+~p&=&HN_W_GWKKHb;%-M~ z^*_Y_`ZZM9_oiDmzDA_UQue^?k~uIxJDm6RgW#!(0xRcXX@nro;c$xy`!+lp0hP{A z(EmjkAW#1nVF2x~7P;C2Z2z4LQcI1*N;)4mF2F=-&YuQ8+&P681Xoskz4s=42n1i= zpq}Oud0IB!vDe-YJIy7IRloK9q~of^0iPis1s)iitPb7O;&=_C8NhJKpQ+Op7Dy0bQ6lTt6k zz_P&F@tRZm`l}ncy$rx6e9!4G&A39vWBvn~*s%{E{~_9Y_1^W;>DUtzgz)YCPFsBZ zYsBNOAMH1GwlFr*R^$xmBFupyYjv29oq_^VxNk2oLXM5>q=+FUWy%JNU%WOhwWWhj zc{$~ImBm5o>4bIe*5!Hx%8X(FM@&qS>yI8iU1NTDXuv|J5jx)Ffwb#1SKs;N z!qX-Jrl$Mt1%S*jH4y96oDPi@q%?g&

    W0(6Tj1+b9I!AjE_-!?|f=#k^g``u~75 zylxlq6Y+b{`=fU@PlhN09;hrU98cxRs!fjz=s!comh4x3}7jqoBwCoX>lg9{8Du9|2_s^X4c$jg$l=f5mR$CJTV<;ER1(8IO-9 zw*1vSz>F!k5O-m8ZwkT~YGiB^W zvnjKpSUyoZPb>N2BFU95Au|^HcGpAlJ3fbbR_9N>7W0_$Kx@dk)4M01txf=~RZxzn z$wHX0;@F?INr!K~n{Is)^y&-V6`g`}K{5G}r#6)j!&@iB2Y|i^eK103Yc-DhEId|WU^IA^yue%x=Lr5?^PzXV```H=zYOPG&lY<|tWlZBh(Ews%+QDIY z11E#yUVb~LnH(c3ATJesu|uNLMGZW~BkJQpV}~;jF+)qi|<* z82nbo67f)e!m=7cXz23Oy1MQg3fBaOye= z3QB^@zqUzgLsHe~zipW%mA{eTq>>%g(#S78n$W>{t`|dz8ZoypGh1l`FHQY>fY$5= zdC*U60P$ELENfF{-o0G>HuSEJ`XcL-rk4Ul(KQAu8lYu=xZF`p=Vf4IgcVm*905+o zF(Uys89vI9*^F58va#mt&-#-uygzf~FtFX;3@CHLv_3XS)TPfc2Xb&Jk%EJRL($3L z{ZjDtuh1!`CHPZHV8p$(Joub>{>fFm#kJl)iWu~@uRbt$tG>R@lzVXSn;?~Bap2E< zbr`=;@K$D`yTDRj3?+!VwZcC2%dd}yhFSFI?)UgY076OP4}4ft1q=GsVo|q~y9EGz zs)<@oAaT_!+9Pp5V#&2LH~YG>KL#-k4V{)qLS%DPth0HB_O8r`-T|W+f&`g>_U$St z{`bu=9eDu#Cw03;ojCg>H65KC_T|-oyH(0gM(Tw3?i)bD)jhh91P(jBsP|D=0+_++ zrRC)4=;(%c@qx{dw!3#da0SONx4JcGZwG$N3oNxXP=bE_d2qeWkq87{7RYaG57O9Z zyHtMyWQLcNl+;86d&Sh>H+_&mpPc!UT*yC|cb^fRRe(SY#&#kWOpJ`caqS~nBI&aE z9I3-2>3qOh^G5^mbpQ1|)z4baw~lF9A(dz?{WIylaqlf2_xyZFp}@^p6w za6uF8c>-A#e%VSs%PfJ%93B+YS z92OpKT)Xg(McqXo(64&Avy?t)oR^MOd8#?x(dVDcALD8vsH*UO#d~&w7NJ2wh;Ly* zz?PxAjo6wx{kL<->UTmJK=E|qge~L{H0pK|HN$Xu0lb6% zOT8>&ow|P3m)@!>%o;}TUfrgf@mLrB553d_3y(=o&E`L9y#H5kSHTt4_q9h61eFpI z0SQ4yN)V9l?v|90Zg7C1JEXfykdSVW2I(3~y1ToS9Nxq4{~g|0vu4d&_ujM4-DmG} zc0bm}pJtnKWEpaVc$NUgW=Omt#)lYnWYOH2rAY6bCg6;W=9RPs13FQo2pG;Dkb*o1 z2di%XE$N}rec4Zpw>(~g2}eV$I}&ei#D~+iNdMV1aHg~`DIQ-k?OLGNB~`X#}a_ha#q3Ix4LWdhB_ zjp@}h6ciLjMn;e#ztH3g5={JXu6$_OY>ttRK)pSYo(7&Bm*zdtQi&L?8vB6(rajcKw!1X_*@ zAUG}!GA_sDehTlDR68|b7rv(zxrfh#yU*Cs`Pm-gv6%~1LT@<79U>B>X@Jn|&|f@k z^-jTfx#02G20HaBpJ##PVgXAHxa&2#{bxS*-m8DD+8UB+@h@BZ7SBnWiY-)UW zE0YY%6YLg~Lsg3$g@qMDl}Ms2xlE0H%lg+jL$B~5POu*$Qui~-UHT(?O<)rcXh7-k ze#;w!I4F?9bfN4pLY@{RNbMxEAf+mDmik=ogCrql*2(*PpEM>zqtg3=uq+#P6Yq;Z zNCfQc*!-XPnpi-*?#%W8dw~#3s0K{m9!qWM9#g47V>3zN=`VTb8HzvCpJ<|;| z<#d;&rEzR`rr>TI^GN$|Va|y0M_!w`Wv)OzaLj4`^iHGv%J}_sLqmgZvs>NIpJJN#kr~#Fo6(QKo2)A) ztNA@IxiZFve0EF^ZY-5_qz3-61%2eYiPJAMJMuq&0OF5RmTZu%?d|vKWlOU*Ev)S9 zHpa4mJj`D%N7>6ob&KL{7y7kYRMH6=k3X&b;0{t_$2!|9Tuk1y(ln!bN7=Hob{l)k z{@epuzZ>p6|9Qo0fWN;uqX=7)Dn>iZRkMJdr438cygy@0qlZ&gVZ97B0?YIAjsid= zWJV?=)BsEr&@~;jhrhbII=O_4e-F{YdjlYkJ}>g`<(cRb%R`2Kk z5sNI+v>c3-qC57MtUG<7z(anOtmKMj;QQDTsbP(3V#7;766KSXMFbtl>F+9;K=TR+ z2$_o0mB<54-a$7kCX7`|o3e-DIW4Cdr8#eHfJ1La}Zuti>?Z6=Q3nh*=*y({u%ME_-z`#Dh zl&Gt#1D)uJ0i<}G6si|MBTe^2PIq(|ZXl9iFxbkyTA;+vQXLv%AZs6|dD#d;AauD? z1+>f0S0t{oZ%WPQ%=ep=3*GLh&$NoD`c77*q@))9`w$Wm0>~Rq(EeXY=wU#6o$Y#X zVPRofTG}J9=xK9+=#rm(II({c?b1H6iRhsqg?CI`!ihgCjT^q;Tso|+37f3+7Rs+1y!fJmK&uxv}Z zp>VF^TkbCg$ynDnqg6Hz0XXa6CvyE}cU3t_B~vR&^_rad?RvM%SxQEM#bA$Q9!8Tk zbRrx8wtzD#kxSq)**AGNQD)dWw3iCE+UB3Sc<}I1Z2gYRx9;LkyWxP@ z;pj?H#)>|3or4IU2<>YQ-w)go@v|V6TJ7gJU!bLAU7Bo`GPGop_aMgINLdGLv!8IA z=kEbdnq1BiNh|=IXibcjmG$Y;e zC4HG7y3#H4eDIPtum;e$h+KTvy5xJJ${RNwS$t0L#l+`a4huf10s`tnbkatg!pEW5 z!)P=#b(}n~%s<02wIG5IDZ*4q-K(N+ba%&UJpDSxI*xa!1Mz>T`i++TS1s82aX!C( z&k9b1F6F2ipNe-4L_zSXuE6KN>Y0VLHPUJoy6S`H2l&H?3D*0n1|LUpZZE|0(DQ_*6_oB!_JnCXu7ykvtve z<_sSdKt(I&Oc#pvy>n-*%WLfFpZ=|5>X!y|Fd%ZL@}qKd^3!a&DeCVs6={M@#3rXD z&eVX-CP6nY$+Xv1BD3p;lN94I`123-DBJEqdXlr1Me{B_<~KJK*?j<^lE&-G#?GEF zmzkHx0qW=gmJ|m!x3ntQCe7Xxno!+{b8^&wJx$8vf`2>vbN;mV()eFWO^nq>_=g%+ zRaCEKcRqLtpG*HE2nd~Wam&G2zONW--DUIAkNH1N#$|8J$tm~ccS(2(k#m5j2><;F z&g)lEjIDKvokhHAE2MrKKQ~p%&7B|uXH+KmpQN9=2xq@?z)NVt=LAVq(T>&oX-c{}oP}3|H}4o@+v8@KUnxCn zD5o3cA`{urd~2di{lTDN;h=o`?tuCzF*iSN=C=epnlBS~+-U0bN zqmY9su+ zx|po_EopLiuIk4dm5Q9AMWq4Bq}n41bLt8+6c(b=RQD@x;ekVFo=@o4)bz>fiVoVC z?_r;9+NPPtb!ZKAbAZBib)~B_B@bBh&6%in)r$$4%Fo~!Q)lP-bfAta zTr3AzY&pzyr_!P>!%?+?BJHd0@i|l+1i0BguT`7^Rqb$gtHbstMQOz?LdV)mO5tG1 zB%MnLf`q)2xX&IeZ4COXq}Cg7c-|a~(I(vw9;UY$9V=MkxSr%OSIhvnB(DNvUwxaP>Z${a15e5~@l=+?#eO+$ta zYEQiK%~f(5J>%D_<}^UwiQvNrB02GKDigm551RWpH&W=eyrpuEE;Fd*DG&4*Ne%Lg zq5sx+Ss1cXi`og$LAYmt!I1S-kTP7A2tt0N5VMxrw@G$Fw3wwQ5{bRA(e(rs10sF^ zMfE^9?kd(OpN0f7Io9}8`m^geB{LkrlEKtE5>onhW_Yal?^?gbkco1N-b<)OE2zLf z#Ui54A6=NEc6H6Y>8}RlG6ZL7RDMnzJp*LzWjTei^zMyFPTa)wy178tPD?xg+c-l4 z)s}FY)cSK3s*vlD8Wg5^Y2cWh`RV<{_G4+fE=W6wQBfcvQu}Doz56ey(`0gdP-*$( z5g4>1G5?R0oT0gy%vG-0mm(saG{>Y)`juiy-%yY;Q;KS6%}a30_4CN#>)#@68)Hls zRIkS8s^ESzs@!c~Jmk}8E?f7daj#Is%}&qQAKgKbVs6}WxLnPZ?}B98@mfL!rLr{8 zrXXc7RW&2jE1*JL-aU0kzBx2gUqI;U;@u+R=ykw&I+E=q7nr1F<&}Y?zdmDYLu&C; zx1zg6V|~eld5tYwhIOpIV_Xrf3Iz$VN2vH5^;wF z>OFl_cB+Kvy{6$5rKcq6#E-Fzm#?zEs)%`eO};N3vT4aDU-rXO>ZD=kn19FV?wjM! z``jsvYNz%DsVukang?-W$G2G@&QS_;C87D}8(xOIoyGlV`r`XXet;sOzT~PnHJQARedqg^Wa%F*k}2;qxj3sA z1gu@va%hO*kK8!6(lnxHf5!j-FL23EHO-CnoS?~CI957ouKl!vYnTP}dInCZ;R4PS zA%7#2uus)yWTc-!@sZ_#@_oVczP1IUZKf4M{c8^d!eG@SjnSU33yhM;Jj1dNN&U~x z^`5eVH2D^J8ODKj;@SHv5{8wDTW#%V^8vI3*>)b+p019hFFWJjLvHNZn@0CA(J7$j zBCT+rAd5NJSzQS6>gZZ0RaYpJSlH(=5z+MCkfC)dF#{+AlYXX5SMBoiksz_}f;qTG ziVj3XTkg8%Na~+vDG!qe4x&%5Z*I!+>fwiVl4%D8uDfy!ABm59|I26N__t>HGNt@R zL>%^(d-E4^_z&~z|I9MhKC2Li3pCeaWF6jOfb)LY&DaK%QR1Ga)$9jargRnThwYPqY zoosaFHXaxYZ|_%pN8f6pae5w}hs!Ip)oCPEVmdlx#=&DehU48}aX%Gj9JFP-nMyFU>@g((fa5nlOB>sO-*QLJ$ zE`=WH(ZkeFd6Akz4YqtdBqR9*L-VYFMf~Ov!l2x>=Lv%Q-OHE8uWE%hGEww|@!aOM z@42BTjfdR?#Y@qG`$A4*M-dg$@gDP{zXYe`w=!D&{S8A&;+vL#!dClyrKK>5QaGZU z&TN)P+Wiko?j>Li?IU<+g;=vW_RC=PS)!y~X)se>MJonQ2Lm zB=Es$8m0tjvoW2CjnJ)8&*m{WME6bgUb=1t+!7hn;NmzLA~bU|(~dkcLay)1eyqseiDN5$w9=#-8XHq*E!ZS( z8)B)K(|%WSU8ovSNr$S$R;Hqv7GK0yU6;A!{e#M%+)qm|B~^Ckgw}JmIDx>E1p36# zNNb`b%)P=DbjS(soj)(o8=m4zSFAFdQr7S`n{he53W>595*?hQU?UD(C5tN!?bROT zAId1_t+_&X)4*lYTEt-__~#j!IYL_$VZAd`rTRTTzuf$VZbxX~@|9x-b=mmpo|Jbi zre&P!qNHlt3TMK#@+UHg}|Jb$F{#+A;LT3Tb}Nli@OXURS!p2%v#dDCI_m9y-Y$NP-_j9x&W+r~bQ*e|>;~}UR99VOMY_4Qp_qsXIIG?ZF*;;NJ3AueNa}4VzmX9cj z-pJY3O*s&D&V}`8EuPt#W9wRe)kENZl5;zZjRN85+$YEm+(YN-mqB!Q>f0 zNE(NPe7VZ$o(_nsO0h6lSg~aesUNccv(IQGdkXoZHTut@pQY3+jEjQe8~1kmZ*LZN z8u>FMHVMt3$A`U(JqwMTvqGuXmWEmr$oOmoQuZC)2fRmq@XcqkN7tvi zDC#=T`YIdkIQG`Mf?pD5`I_x^R@R_R7CTs={-B?=cWKxY3>KrR1n*mq{ai+e zWNaVq;eNaB!ajX_9C9V2Z{$(m8qyy~M4#9+P{$byb6|3bC891{CkmSiGYD=vmFh|V zH%M20*LdKz_LrYv%0fj~oV~Ocz1oDdszj|4c7gcb?zb9`>gTXtP*{``AzSBoriR^H zdMB%>t-tKda?9<+lw{?KFTtC6vs#qQsE?dPmR<2tKXTjvv*}o#gzksZ%?z}k;w$z0 z%>S_a6>vuKPU=qdcJ&>zH}-Cv_e01Rh%cl5m48JDa~O%MZRu;J4;nbUZJ+6CjI~CP z$007m^o#E)PdcMg^WHqn8B2~U=&vs!t{z@2#{%rlTw*F*|5eVWbdO)~qjAt(f9c8S zP=2X<;SzeHqAx0h{K*j!&n!Dnu-%~#l;YdJt7qx;CM|9X)~t9<;;t+jq2lcDmb6dJ zq=&0`pJIrLU#^tS+tQ~W>)AmdPo7DN2!4Xfd|#JXJ3BIOu%v?YpsNH!4_w=Tr5s*~J&O)i*T zzHr_--MOV$Q2P5yfi1FroIyn9buVf1(mO`h1U|L_*=HJM4Z?GOylQhE2;y3L%Ttof z??EZYN^ludSLoZzS^pSmSF8#OA(J+5zglP^xA&QQS;ORvtU_WAB&mZR_llQp)OiF} zwA~mBOwg+u|LFL#XgaLExP9gXRX+KkVzKB17~it zzk_7Qs#B!l;sodSEtyPu(zh&x&wEwE+zomu+h5CVfZ>qtO`}20i7IPOwYPixhtbpQ z$iulzr^wgZRMj@+nwI_bh6%>RBoVh}7NR^7)_2+2^hej#)d8gk39kC?&M3>~k~n)m z7zPV4t25_r2wK}8A%!)(dudd|Sz+ZV+0I>cbBLs8l7olUn*%Mm>79L{k9(uyjNr2? zuS_PhCI!Bxa)m3+qp{8Hh*65+bTnUf9+OM*(&iSaxRcDc0Xp%Gfc#FnwyatVZlS*$ z4%dfg45RG94IL-4E-OgUfgt$$XR$TLqkhd17Dss@*q@)l7K^mZrDpxMGCQ;u?v+il zE-5$lN#hT$%=>1BepnFupawge^@#Q}24 zmnp}&K@^a(R~Xl7bS06~j;ZXBwOnNxZ`XW&eixDbn!K`uxhWbxHaZy0vzo5jsGM*$ zethAtr&T>Rlt&FZ}r8VG+^a5!Cy}YOqvu)uTrEC zHT{~14&=-)&EhTYMIU+Cly1UaWT&gM+1#j+{>TDJ z$KQkA>2G+dj!~rs2F&CyGPktK<-BLQDm=kSDM6hNVu&oL)I{%o>`IbVr;|G4d4=Zs zKw#5j==A}?3Mzz%voj#HXJODFR)?^sB`zBw1vl$b%zag|+SBayl?`HwuiEV%yB@!m z7Wa?Al=kU>G0FqTBSDA&JSZviw+>Hp-d{=sQ#HAH_Z@Q`98#@65P?bcO@#n)7$jpE zy>?30@J)D4pJbG~)ApuzpMY$z&SwkBj?|CCBc$Voex}Q!gVPQ`g zzw(#71(PkJHhunYXP9 zo)mf}CX708Lqq0z3K~X?b85|&2&CLI3-l98BIJ~vrnS%@9AaXsUlu+b1vMg=jmz&W zM%{0?%N~%k%igVjrcz}Qb>AVTo|Irs#`o)^V1e9RMk6i=hL&m13};Eh+j`p!5<``i9$x`M~f!&<}XsnjvTW! zv~Bs&v(RC`%k^_1;~2EbYLr-h2#F0(V09}}W{=WCH1FSJ)O={KPC&S-pC!Lw+Ne~+ zZJIG2t2^@1!M0!)s`BD&7)QuH3nHSZjms|Lex6d+s`ga6Fc=Y|iu%nypU{`Z7zVkV zuF%tkwl3($z(B&hp7yIsYA}U?=PF6qB2YU4T&zc^Cs`C6?$89dCd_ms5L(>w zp0&s;sZi>=KU&dpn;-6GT7ID{w*H{+pePJB)A*w3^%S5-L?&onbvU!nj0{*a3+)s7 z{x-_{Je!qLU%1!<)@eM)n4CO=lH0uO%NfPpfiF$-P!wZlqo-t6q~;?&gc=$KwB*^| zrPx5Wj{jIiUb{i}ZGs0eDIm>(^mI7!WLm_FtMUnKx0PC$fs~2=n5AdhTGjbV^J=5K zRep~&OJdkBIi^O*!n{RospLkeY1_3oe2CA@d$Db}J3L75=HxeOgYbilCGTaRBNly1 z6SR05{H0qC_xu&@9BXyt+M literal 0 HcmV?d00001 diff --git a/Documentation/pictures/text-input-score-annotate-ca.png b/Documentation/pictures/text-input-score-annotate-ca.png new file mode 100644 index 0000000000000000000000000000000000000000..465df1cfe6b4729a5737d1d2e60142042ea46ae6 GIT binary patch literal 19046 zcmcG$WmH{3(=NCP2>}8jKyY_=cL~AW-6goYCO~it?hxGFEx0=bcX#LD%+B|IBWv!R zJM(82dvQ2hdUsbGO$000FG3;qUvD}T@jKVS@{ z#6*DCe?M7m1+f4?2uO$sDZ8bethjoiI==$va=+NkQ%>7lKj6u0YJOXQHL;Z!L>3Z6 z_6m5feV6r{|2LA2@~5w#?JJQ#E##CYB%HQEWX*n&oButFs)2m4UL-dc{lb5S!JwOX z#NnFxxVppdx^{*bDoqX@@JYBYwD=78Bn*3inhzE5iP<6v=9BP1p#ioaEK$x+bATuy z9Q*&*3#Px%fN1-T+yaj0XATNJotYU@)G!$<>rv=8v?Rn<{ZVEQ_Xj-O{*%}Q<22OO zsm#5+go0~Tg#JP1z(H`pID_}=b3!UdSx(N%T&aPZ$54QcH!u{mawtaAMe+ zccPj)B`Q4BG$7m@=nXB7LEZ6^l9+1A;cO9wD_EJyHEpmfy&@L)=?wsia@rMPpJ{G( zKB?U}M4I;F{l@!YWRlMb2jVhxi&Z2~J#eTrG`hOFw~KW>ZjT4k&n~B>{B~LQ4>$De zIJt@tHcMW1o40_FiOJ|jHy#px@ZzF$X(_E}q?1YIn#xozufAFW>$Cy@%BVMWV0TM6qh#a+(~1h=Xf7mYbBM zOu+ePc+@#K?2!V6Y&VZk69XeCnT5)Un}a7+IEM|F$CLnLuhkfihO_bH#rsyzcM=m} z_}s4g>Cfa)VCVIXHLs^CIl5K^)|c!_PAsg^x$*^>R8tG1FJsMNqv*=YZZ?bCHO?hh zQ+Z=jiBme-l%GQt!w>)Dz+MMr{NQ&$Rhf0HA$%Skl? zQb9^GqB>WxD)aPQ!@;pe)?}$@RDvBR-r%4$x5O7vN~>Ryxj}W|T4*+C-kHJZ~(3Pjz)@uX_U3 z<>ecm5S07Ak#2u9lwa*`_6x5sW@uOvuJ%wsmi)-_ia-C${K$0dU9-D>mNa?E%V`TZ zMNjgj6-;&ECuwPu(9!c?7AKa=z?TF%(@+LxVPTIYrtVr%j>G~WO#gCPfJuj0m%w9Ejkr3E$rD=uZ6 zfu4^!GRhl((Wg~KS^4kbETC^_EhFo)KBQ3fYw2tavRpfOKS%*3NRGb8`^sBU$#}Mt z$j4z*>$wRBoV#rVhNIEAxx0gQ8#W;ypYWmR{q&!$C{BmZ$|`V{mVwUBU5lCq)@6lt zbrqM&-06LW$&2$z?jBRLwBKmaN0-xv^yRS-sMBTHSaK!~Sjl4z4MF>*kQ)rS=wa+0 zl<@h{(<)6%Hye^6>FjyRb*c2{bVZrF?P3JWUMy&|(f)D|H^08#MJd0MLC1pEbqq9T zz)v{uXD0Wokw-#yHZbAx+Wx~k=(jr}CZXk>9rJtOpXyd}B}V5eIMR3z9(PlLEaO_z z&=9z)MACVg^hK|G2Q!69zZk!%uw}Q~Qf1QW(8w2x_W;SVGKPI#kMYRW(OFKzmG$6eV2Dc0TqA>& zWXTsHsHv4q<|MbbgFfnKD$Yu8;OTzh7T&W!hXuV_`WgSCocO-QH^49DOOOQ;-Y){V zV~hYq#2zsNZ||{(8)Eh)^9#eXA|+5Bz@O1!n&&g$Jd}`MSJ<4wo{t$uR$yPWktIbR zU-cSlVqeAC*xmuj%Ei)*lJpL0N~k~*FE`141I)ui>`=UwCCzJ$a2|DVfT+J1hQ@3Y zVZ1&zqd0R+aBTc+Ov;di#K!KncuRBe1*?=4*k=tPpAofL+wry z@(NJQ$;EB%JvPEb4YMV9o134XvUvtoUeEo5N9)1R2Z`Vq5C~mdnoXKpN5m`>?UHwn ziJwzb#xB~1!qD&>4g{wC3=S-;tfa)hNr~@^OA@DgB(=Az#>6DV#GrQvu`I9L;A9Ke z$C9fYuh48?f1F@Bmr|j< zvAc_61jeD`e7T0m$okOm;}uG#nThoD^hCOn*R7}rffv}j^X}Dm#)kHw0|}i!j_Hr0 zVG%m2GU75fZ#`WklnCs4D$}y2ka5syLTT30S)b%FYGz%DTh>sVGD5I7i8B!ikenbQH zRywunbDtzewLGft5%KvN_;mMkx&Z8~>I%lO*4y{cg2N|EmnJC;I*OiDpEq}Q?3tMd zqJ9(?C)~Ng#~-#@CI9QKsR0zA$e($abU&k{@(A&t3OlZ~BbuG5XE zI48@mIVlbPmr$4bfBvRtZvi8w)T(FHGh_{PaxAW{dj%PnOI6+0Hx?zquwZEDTwwrX z9Vl&#zcVw>4>SxELBe_epqaC?r=j727(pEcIX8pWE(jTrhsk2a-U@309IB;h+3RX*5D?$N2TB$|1S)*&n3=hM#p3Obm~+|-lcPx7 zKSk!|P9X`z*>Ps1vMnz9>RwX{Cj(!A9Z02`+IdBU=8V7sF*b z|KjqJRxG>{pGP$rE!%}mNk)c>H6^PwJTTn46+M11yxqN~KR1Altu6?ufzOT5!knqD z-t^(ViB`{s#i!LPd2Dm@5c)m$)O4N~|H{IG%@padLJoXO3)ae9g{y9>da^r}^5Zar z%HwTQg~k@6r_0XEGuY=M!9Uj!SDm_INH^(2R6T_FvF*8jYq_b&ad!a1*GQ{(3VJkX zV8ECy2#F(|hr+PtATn}{Mzzst&4O{A*t1km4xwSCMeXrwytPXhKHUZjefMHYDlI%b zbe!K&r!KTnMP?8!Ta@fyyDG-U51YN0BthQyc_D#cWnJ9@HuQXDc*Vcm?+6!nu`((L z^Ke`EJQQ7An-|G{v#>mB^=g{_@h-oO{@}}(_sKAy`CSJ-&AvQ2&bqF-TP^Rmn?|%7 z2{rrc^gK|+iet-Wl=8dDcWq4I;V!>E+k!A_$F@pHd}|(qUOgZP()hK!rWE1x%BLWF z+a#E4X?X>O%T-Sh1B4b8EgjB+NO@qbBqTavCX>@ZLwUQ+nTAVrW^vJFFS5wrpG`N> z+?Ww@Uuha_RnLoP=PHEaC}oh(5eCu3@MA$qd1T{|?#$GbhPt?`JyTWnl&f}ek$}%~ z&(M&|r7^6f?ti2n8IQFbpX$wo8 zbeg7);?)pN=@|niw%$+sor=4)wyNnOD=Rnh-o(u%&^>&7PZR*0Cku0v#EOT$ToL$4 zgmkBIy)MIseiHryVy}Uf$_J|C}ka)Wu|EVVon3(u(E{M^%u;45fnY6eFtc)${q6WaY!Fhoif2@Md{`bHO9*@r<3scyKaH^1EXa1^oOd4ZTQ) z25a#VKQ|=>Meg(~Y<4!xw4Y1W>xqcE%i_5^uy>FGQZ=ozaG1KYm{ z!4ma?uR-SE(UMm%U@>^pJt_kxodMB?NiemA_lGKg-M$YSy)Z1I(7zKmV|c~M$)f>q z4eYETr zO^Gas94>0E*OaBL?FJ7P9D*Q*EkSHB8CRkMimw!{r+j|VuPY-W2zR3tYA9#9sqIbe>X*AE=V4awn{Jk#8$Pg`dylu zq~A0061UCC>F&vng@#2%3Om7f$}e7MmoXq(VbTk`(RA1Rwrm@d2BReSD{@X^ zq|3Fdaz$=ujFS^coPY`Vw}EN!&WBzV`$SAY8k0PmMVKT}6h;;{S01g^TkZZAj9Awm zG!QX3<4Ooi#0t>qQf=cM@HwoCzuLb*pDx5Rm@^tze;)?zXOu4UB3*bl%L#Pl&aLq3{e&KGf-?pXMy4w~4vMY|HeV|+~GL836X*>Gjb{}$^?9@LvaNvxM1yU_&PACzFuJ@D`0pS)gc zeyUH7?0yl#u-QaN)8LnB4nH&K|NgSR00tj#A9}|nhV!`XUBICgQOkJAq5%CuL z{z({`C7M-U<(>6U4=+#VbM{+=HQreZEE@#W+tYx^76oO45>Vz((dkDK&=$h%K-Ey z#*F6rkaV8cCZBZS?Cp*xhv>Gp_U_5b-LbI>d|pmHdHLlj;y7{KkF_M9g98Rj`3Dhov>;%5c^q;Qv zc7xu1_$wxQNRDr;j6jZP6(0I$~1C1yPiF@)#!y`I`yXjz$zkSAv0|RBjlEXqJz)98k9>oj)_U&=xEP5 z*tCvPexsHq`_+8|4YiM~T!*}R;jsQ&LnfxIN-_(^!1vec<=Q)Bw)2DsV~{mcGVj#5 zx4>?GJ{3c|c!K?`2p`EzDpB5dfTty}J1BE-_>rCK{^nu}i`*N=_VVQsrRX!zp20%V z)oap!b5!K)ER7mV*4ddkmSixve=o`sqU^y*vL!Ams%k_cM(M=J5p{9yM#b&XoJpYY z=O9)t#f?{syk;kY_fmuFY9ka71k#;&_~lQ+JFM&|&*_LwcU+to zl9B_txcIP8stvBc-4ALWua0_N8x;0e*F>3^p?33mc&kvC@}87w7fIhLX)bPrhadNe zwu^7un6OQ+y+**Hww9I+GJ_g>(^7L)^9W)1j22&CA4-ZMhCbXqWbvy3aycdWw_k$K{&F+-JqQU(Kgs{g%P_-hQcCmdMz##Hxv#29kG(IJNM0W>slO<=2up+L^wzy%7X&t@o_xK87jUHKeMqo zrlYKwa79E^=rjrAHe5D0x64Ts?KzB>Yg6gv>kz8DU4Qd(=iqXR+J2LNxD3{v?X!3ArAUxmdizEUUFxM`i^EXnW+uBTeMO1oRKFq*oHCQJy_{KyF`ixk88?dn=o$@PY zJGXXlkP&+i*adXWnvJ<>YM?dL0)kMfZBIQRiziFT`T3VSD746cC!kCjS?$6jOyc7TWg<(8}Mfj4vv`&dlV@z53a}X9ucA~1mzCMs(aqj zCPQn}(h_Uy43Z4BA>ki`^r+v&X}YI^tG^qP2zHhtWv4emJJsjIeQ^Zw+^GZ5J>})* zX6|5bY_l%(n^i~2*+Cir!oSn8m|P3}6cc0R{c7q?59&x!;7l1779PlJRMmX2G$q$C z{hf$$;aqb1&egbT!2DL+iW*HdgkAMC{{zMVUlv@vWVwc}+T7Gu|FEW3NEB$1fZOw- z3i10S`J(CPr;Mmzbrf7$Urc^Cm6H>_+h&okVuh1>@Uq``ex8TB_I235h{g4Y6?9X#`s5s z3@9Ej;{odg88?p<=O(sC+pJm`GEz3SReLnEY*CO9ntFLI&_|9C z?`>@jDp^2E9MevYNr3X3svrQAh6Ue2@}$yV+{SLZc5S64EgB5-FJoicNOfmEViL?xt~8n^QP`DFKZtjMDe2-PzIZ~-uspQgt;Lv`6oZI7EfAf z^IHE8=<`X*P=8{xvoXTLd?lrz{ZN~l1ZdT>ES72|(Ja9n_xiyjTV1*y3WWlTdbEMy zH7sli9Y+d5iy5;bf)#eOhBZ$ z`Gtr5_5_Cm$V%v@va-Sd>uqWkocddVsg+eQN3o%=$EwNg!o%EL)Z4o;OiCb-1e~O{ zT-EAm*4BisAs+zJ*_lt!C&C+GEFHYKj6mU%k&*KE4>8y*6v(SjxJy#dV~CObFmr-Q z*r=h|SE1oZF7P_sBf^XooHyk?I5=2W*DzPkcGS{QOMn6YL66f{w_Qb3mnE~JkF`#w zhK8fblTGIQ(jkGTTn`;Z`1q~6j*h#G3`ttL3cO-oDBjlTi<$uu@RXGDpk}b~l$B-f z<74mR1MitMV9c1I9op9?fW&|milwO*F`3KV)yK?4l<)05)u~DjCu7g zpnLXyKL6(_i!h4o&5d?E_!nErUt?%!X zcp4@Bvt3=qb2kcaBj)_Xi4U0iR;Cm;?6e>-v(mK}#LYE&4iQLBO;uEz`?K@L4=#RjTxFH| zqN>W>bbFuz1r;i*G0HObAyHLL41qH#^|kgJvU}z7xX{8xc2WG%jQ5T8Y|eqmOHNHF z#JEVI%BQ|Q2%Y}P;N=NKsz)X!LDSPLIM@JTcJZO6d65T3*$|1Rq35(H;pW`$jnmq?b7Z74`APlM<*D&n0V`}cKu&6Gt{A{Pz-97p@*Owr{j#+p>_)OJcr z;_C~~k=cJ@P1W>Pd^<-`IQ1jd#j%nSNk?k|4zy z%cRgOk=xyU`TMMUMDaz~W4ST+B6P*!V)LMt_nzGOyLu^O=Qn?Bwya{MrY13FW)Ope zAf}?(Ru4p7#M6G+wxNB0HhuT@69-fp zW`d;0|6U6)Ixdi!Y1?nCnVQUI*VOYacpDAR7{X9R6?JnCA_ovQZU=7oA7F}?mY;eX zeH7ZL2^8bzQKI_%o9Y&vUIHz?nT>ScF3vZ!3=IMO&PszGKKpcHh2u_t&{4D7HEl=v z?oSU4Av!u};^E6Wm8UUK+AY@vnOh7Y!-sTeGGm@yd$`5)(Xi*0+no8oS49wwOHBpU zDoER|q#(pEVfVYC0ed))m(4;@1q^Ip*jCNtA`x)-VobWAY_gyFn~8C~25O(*l-Ams zkHpm=s@O-b*(r1xZJEx?N5j(6%oQ5B>9NX~abOGk19v*7IK^Th>|r`0XG$uhCd!ka zSl9sD4n#9om_^bFnraw&y7+p!va8#zRNUN)E9sc@*4EE!D=j^a+3(j-%2=>9njUw@ z(*Hi|Q&uTUo3J5o40`VNnH zfx&W_aBILYkdvE#yVMYx)cj3a{w(mp;0jx1u7$M!KllS2ka_c9*uPFJ?L zxIoJV6DtrayUM1-DXO{F<%&dbI?IvJBz`T>)2%x!xW4W_IM9fQcvCgMGUcEuC>Zs= zWN_N5*N4Y!EN^pDYiEb7tgMGBA1{_`sCTDHAxG6^52s8q2S%BhhEPAZ=4uRw1B7d7 z>ZN&|oo6!X7WA$R&qkG0{I`_YO~z#^GagwFf7T0fK7o7{-7LWaXBcl>LjCEn2GH1H zqjOA%-}Cb)p?1?3r6`K<$U_LdKs=qsn-v{waSntQ1y~>hi|I$>ruCnei0IDF_^{}Y zm@YY=07hx)kM!#2mGudt*}-{=UM}}rZ^7J@TmKx4VY~0%jedZia{Vk$W4A+`YwhM1 z2qyd|_MA9^um@9b85kDIbsi$$n1_GQg=&?2OGGmHYy+Lk0`m*zcMcJ^=9&=5`WV4J z{#RWK*1&?G7wB*`YZ`%X0cJszE-TRE?0ic@?i$DFh3o0@o_DNAcK@L;HfwEtvCsd4OlVsk&IXwT?vHzl z_7|yOsmPi~2}EiXeB)Y+a~S3-CR$!mCc(v9eM7f^ni{-VIBx+#t-P*h9BvvlDYVDN zu0s!AOlj;&Bj!0#5wFxZCot#sr^p~&o448jADDy~v7G-8Ji>khIU+I$f#FkALpJJ= zkz4Ym?Hg*XcCT#Jl%LWve1s+~L+ivQo)^^v=@k5_c(eK)c8bk3#0PxIWe)i=vL8~* zkrjV_Z?n}OtTHmYyiB8`rLMOzxn7aA_+QcnLanOu86wntX)*SsBqSwOF(jY4lTyLt zq4hH!U)y7yjBKXYRL|A|b26Q6Yqnh^!D@TkRUab2+3I$2cy70ocnVTAV6q4eboT_* z7zG{V2;6`X(P(*Pkiv2dQTIl#%r|Z=*73y01B{cymU7z5YDoCFZg-!6 zpIn?E!BwqVa`dX9{^$1OnE_+!!xwHG!0)803KS%E+T86848j8B$-I(W~A@$%`WqbebLZY%Sz*X-HUmxl`*g%5NHv@A(z-k z8y8v44_5&JdnCk^&}~IeVDVg{NEa*Hj_WJJ7~1D;R`#I|exH+t8sm?4Rh4#iwX`k_afo}X^#VtFT>$LVc42g z?0xg+NUZ{e>ra4W`sUV_iS-KkC*IOBvQ^V!d78}3mHBz2+=BS{y5!_yCXh>D^L>%n z1&BHRlR2Y}X?o5E{$z%h`v0Dt%h@+n|MJ?pKQ*6TO=J8noNd?A3`Y1b;jinrCpR%M z+pA@jO5dKq}85n{@mm!ke~nNPf;tc zgRQguEVZG2SN0bOH4W4{oZec_Z~_&AdR|xY)bY@$#kV^$5`WALjL%NSgD5yGHK<%% z<7xbKzr;C(Hy$r81n4y1YL=)2jS8xw2wqH-66H!BPCbNp$~wM@yGKJ9MT8f}Ug&i{~oC8duPhjzvt z>t58nOlkvHT7dHS1Qadb(t^Eb=cC|0VgOd=8&H0qoY7WrUe+z|KggWB(GFRU@i;S z;zW5EZSg1V9rRzkG8sBZAJn$Zi<&1U%-qcVMDuJw(ilX(AcPHncsTdb3&Pttl=K;n z=`H?d3Ed>64GgeYrf+4KXQ zqf^X2qbV%+_h7*NH7H0Me<~#_TVB@I=2GUtfv7`C>$UOZey?ioKI+wuJw3xdTE4t} zI?LKQJgjjl=&T_QTcx+_u3DkO@=J-|nOto8 zNG=Yr75oxox=a*hyL9UjRPppwAsDT*e)F9!_Q1kiqkrR*H-Kbm83N}LD&lU%?*3Uc zgS9YJIGYykqb>@r_RR8=lE*{)_O{D+0QhBT(JmqB;k?YLLXo7X)v~{@U|&JPkFt=# zKlAN>%$LDf`6-04P}{J^XRZ0r z7qLyJZ0uMj*)A?k>WW$-8ac9B8`9xeU^Q1RXEs78dU%?_ie_%N^KqiL6kUae9fZc# zTYX@Bzm$+7j(=6a11m}$}0y2l*wMDkRAr=kF9VK4rG_4Z%B>E|1Pb>%MnL!9`Y zo9bZe^dk)$nB$^8rtBCPJVP9Ra&zm_QEk8m!u?}zeF|fz5qw|4J|(Zx%b;&K&;Ad?~Wq z0^B9@B}JmW4-1R<^V38NX-xXJd8QzBi zi?8=8IJ1EWKZG(60l${`+0aTxfb;y^K){s+k@A1flb0k?n#X_qzvjt2_9-oLduaGM zgRaw5R=De~95J4nTEiIaWUih)(Rml~o(y;FrVb{L7) zRaM|x%D$PURQR#CK_PQo)OTL`CM^vKR+cvaxS-JfyT9Htr#V`PafTHDmW+&`Ko*BH zE+PL`BzOf8P_ApJ;B_u;EsMCLjFF7Bw9tKdJR5+1UB;7fc}2mv>UDDq;O5d`#yq&W z5n1!|ca9FT@mTEnMUA|k%i>}j`N8<22w z(#;SjChCXn*%UfuiU-FtyB;QDtKC8#BiRd91`a3gY!R9NXGo$%0IaKh^6s8%TkZ95 zPY<|CLuqx2JK-eIp#cTe+tOH9dsO-(@~v4G)k}0nwx@QdgU?MgjUe8s2G8_KIY5jC^`pfM(4DyLqv?H>+C9vmBX@V7 zkGDX=UOov1SA+JFSCl$7@9%7HVq$+{B8Iaosa0rXq>C%XPbn>}S62xAh4wdS4}3pS z)zkJS#{y>oOi9}KUp#E+={}c51zs&UX5yN~^B=R%MKu;;!o$JPY5Y;001Jx@B2BbI zMF8F1v%U8}jrVst)^f-;j4Oc(3^+_V?T zcfb9^pnI8??tm3LUDUCmI`j(i`t9L57ZGRR*Y<@^Tq;i0S!BHDZj^^w7(LPl8jqcL zqzpI1;))8?u&>LVXJ(cy4n4uc= zlZgFsd~(2=5|O-+_U8|eOOe9QiZ&y}?{LtE~;q-#|EzyGotq>DgDS`TFtxYF3Lf-Z1HS%h7kGdExta zRRowY+04x?$E&8jfw2&L4hoCbe>1O=BK+2clFoW%p$4!6Z=Dz74Ms#1YILYGUXBtV zS5|@gvz(RHk>R5$=GaRS{!!(pH#-1~hhqw9_pm1!iL$b84B@qcVt=osG-xS7rg)$h z5(2lP1|M-^qb=Mw;@1)k2d-m+_!q=_c?y(=O-@)rjx-YA~5FfWEH$L~9lyxZYm-My)&_w%72!rSF^aA&2Ac-TeGM z6Dg|*??-UE$4uhAkPryi+lq@1BO}rI*Wx6dYiiThcj~|ujGJ;L;V1%d@ttq1OGi7H zW1naS!^-OG|7xd*DWMv?Oa_92!o$ZmM69sI9TCt6Kfy%Z)3dT+?%%@xHD;G6(f_&e z#GD@ytcEaeB^8Dxq65oA=6P(-AT;gcoS8((RBmfU9%RVEu;wA?&A}$}3CgMo%BBXk z$T!L}N%2Njd>-vBvOB+Ei2`cBT$w?;=(_X(4auICuVr%iUJh<68&9eC%;w{BX;gYB zL;=wW-*(92b_RE-D3q#S#!xN;w#9K=Q<-S`MFh~SH}ta=C9nf;Q^qa*k-)pO9 z9}@1t9BSTuTzIr^brdIIf*6Px=@Xf;ks+CIjlILRYWlS9F9J(6lS+SzQ|VHN&tm(Bop3X&H^iB%M`V#F<#B!r-@zvrT*Dr(4%9~^NuhEzPC6j2?sect9%}Q|| z)NBxo@=ZwmZBiSnN@+Ej|946qOy1v0q8enG`<$znD z5V@MApg*F21SST|XBKclLqimIHUE=gBFB+ES2uTH6$zRaOl}LSV79z=srKRGzXFtr zPrs*wBpTIQ>;kpRqf3U9iNT_)AlYfZns^pqreW^LAs>9|A$yv2-RKM&Ad?|$PNM?L zWPJ8n5d#_n0YMj;dU`Xk2(FO8Lmaxvx#|DB>^ASF&Qj)R$@K3v@?Z<#dw(_|Snhw* zcU)*rV*p!e-+wqUQs4&{MGE#KBlp5UT@dLMd~aOm1R4`OW%{qc$(b8nKK%za3RyNm z);07rn3NcA9Q&U^H_JjR!#gWZkd{Y3Rz77%nni$};Ls_60+O(}Q32Wfw3+8pPzX0! zL9C3UtULpp5|ab&otk(|5p@T zuW;L2P}sp)nXLMjHZ7zMaH+#D2d8o#aNxeOPv41S2d|m8$YrNdGx>y|hU!k{(rDAK zQJ}%8|C|N_uAICrnrYn)_@=WAZ#6w8La-!J3mfp;>lYx{#dqP_y9^1UxW&s>6+Ugiksu1}qPG^8!Z0Y`uz$5sUz~zC1z`>FJj%H&@|^7U%-J&eIZ5! z{v;e|>1N(|;B=fM`;V`$^d8=`oXB zXFA*T;%b*}Voc*wGefAlNWtWE@l@YkB-Wll`Riq-&b`%iMQYb_ck6MR6Kb|l<1f#h zitrAr5o=spT(HQHSs(0%%JYuJVGAiLTYC;)O}FWL?sx4jmvvGLiTH7R^Y{(k?$-|3 z@%d+spO20Yy>5C+5~~>^kT5&k4^0U?39{AIS2Ul^9x^@YPZk`_I9xtInq@N!8=48^yy@PIF`5zv0Mh-_b3~D^Kfvz74AJ8K;3m*%WH_!H8 zp91zY5EA~?%pFWe^WYG2X>fa2?)zKYFZoE^?bvl~FqHdT^v*K8Nq@5!o>XHuBTVp~ zfUi$=P50Gv>I|s#>3V1%qK(q^X*p*P6pkU#SkP`d``Zr6CzVqM-4s2iO|&Aj(I@;2 zbF)HYR^vm*GllyI4wo(D*9w8|-MQo#8rDGHeUzu=n3fH@O`Ub!zq7g*d_~eAN3z-S zVfExFL>g@r4OE5%t;}}V9cWPCaFci(%Db>mbeb9<15pWH*B5zF3?_P;@QvL%K^@#% zvlmcXI|aTKcdLOTAE@G~*vi;|^}Y25M#GI1d&>dQR(#Z_wdz-IpPj1@8W`9-*m=wc zyG5xDeu6=35vff}Z z{1*SYD;I;fmH6||$#I9lagU`7>utNCvCmowWz1pH&B?xwYh~U|bxo|)bR&FL({VC+ z$5T3cF37$sT()MluC>hZITmCkZKKzEK><_wQ{D}?d|*A}n!>nYW!G|->Cdq=KEwL5 zChN1C!U(k7=wh63W*UWL8MXTegXlO7Hh9RcDB(E@GogTg$k9;oIq)1v(7!)0pYYEOB+b^MK zYOMAts~M16%NpHOT-JNjm(dDaFYCcdQnliD-CdJYRh8L{f2h{gFPW$Vv9~a$JI@-` z9L_{LBiu>$_@29`PwP*?NpD5ZQ^b29wBV06NwaO_rv7rSJIH72d1hEO-fvtz<34YG*z!;FH;qbK@jMlajS3~(go8pYR6gv! z4DvO3VKeK&Kr{LZn zBZ+=&t_Y={a!duOYOHG4v*~1OJ0`+x_xCU3SKWIRp&GNERIrfHv$7{26V!%-m3L=0 zV8O)>o-_T{GLoy$dF2hP3!JX~aMAq^cAic$gs=!oTnfy#^eae5)o73o#&M)7GM zFFcj=uT%{rOf2N`nkdOxDAA5XpE)4oYdmWZ8NE%tb>BCMr&)@SNt@x7$ACtK<)ke|sH$2LFCIId9Q($i&r{ zQb)PY%mN#}JiPQ6+1KlMm3leaUhe34=Hqf0o}>fs^|^+KZDUr6@ZQG`n#h=3u08Me zae(J_huU-Pet@%_NNjA0=WKd7^HxcxNAa%xVChvcx=wRhT^ilUah}LF=xqm{_Oxcs zp~IkYwOUli;bZ<;@(c@~u%bf@O$yD=6WrZ~ZiY7IblhaE)T4&(afr+s5`$Nv*G{3r zpoJBSqlmPIX)ppLbm4mZ_h0YHEg|2lMrKfx7^Yc9+2 z<#o_5rAh`IlSGulat@2P|vHP$?51@?bAjebm(@o{ySFa`#SMi2N}m zN*#z=<9!|lqXiaYI3uL;CGkh$Y{+-iXT0Y@!&~%QmTpscksn5b{mMG!KHyF>a1y$N zv=}}ccJp-)#&ni<_6#W&RtzcB{hD1ejVt|Pm|9_75nmDQy4&`pRkM|$Sz9Qp2PVfN zUYNjAEaG6`abpZA_EsAE9EM88QqKBIgKd^Cy(;~c=vXR;13q9ExO_cy-Sx9e(Z$?c z$y`E7!ol4E9M&BGz(fE0zX0IZsEUa~RMt*%YOHNLy!lXs_H!-#7`%SY? ze&cwp#qN=u|E68b3j^48MGT0+CxIfYVpSlHA84S4;eJ2F;j&P33`ICYr~K0LF#$xp zooD-eEvpzjqHbTc2U??*6LO_%!Qg^`3UfcXFoXqgzl|CR9yRgBcwIT^S^^_ekJh#^ zGZw(=#Cn~v&X{O$={>o6yE+uWw63^J)eH@6;PY9=-z{A0s+%N~5Dd{WGfj)14P*>& zazCkd(gntX6-Ua&#y9m?WJipD1#VS4%dGqB%dk33LGRH1u^pK3Eor+%r9gCeM^&>> zqMSDYSyXW5zVvB)hE5&kciYo{egCESZ^j}58{$BXzPdDQ8lmrnXHZs7ZBcD@PIh}+ z#;6JED+t@!u2Q(PWxqNGGRLNWW-Y2<71Yivv3p%gT&&mJe=!*%v0*|DerrXaI=}yl z_4-YMI)2fUG(s2}2vMH$bcsxe&a}e8!ZMQlFCdn85CUoe6sH z(g_V&RaqcfBmMqiaPBLL!WmpK#55Z!@dxG|h&$GnpG4a+FZ@XlwexlkgMNiAPpkr= zs!jrI6LXo$W&e?Z-AQ8|A|7G~=~MOV-VO1^uRwqFdYdvC~`}J5fE|=jxd0M*W!|uk;TLT-AYd zzi;2ZH`b zqxp8WljnVh?)^=iff5Xty-JQsDmIORfw=!Nrf&MhVF`<_N_FLBT|s?63nD`Bw~y8D z*$8ewVW2=Z0+E`8Z9G&w^wey~5-Ij(cOowEz+EWK3ymrbs;G#imzs@qfWE0k{(=}r zWz%tnk((7@SLZT2a2-qY3rb&coiswai~*Ydok9r$s%W%hv?>Wy9>&7LVpD!uJ|xs; zo7KWR(mz)bk6V-5CaKY&y9e=W#8-mn=gG1kS``^?H=SBY4~t|64)4CB;DqNFJHeKx zbTU@bZxVIQF5WE6n?bElw0(j95KOjNCf49{KKFh%|8-edT3b0$BYh!PVmbe76M_N78`Zf)7a$^XfsjY zIXq=l4&*i2z<*;QC{r=+#WzH8D7+iEI=3orGKE**I#V~-#(41VvdCI4%6;+g@~!Sg z+h(6(HK|??1^u;;`H)l!B0~+g(o4+B&hh0iSE9Kxc1#;g)c!(yild6p_QG`yb}}bb z33MFWUE$|qX>t}8wxhk@KGvmKJ_wDS z--;!JX8yOWlH9Yf?)Qxeu8S`{>zfmOGwA2vx9^Qt83WY^=&Z?D*P-8Yzp(1~+eNp} zAG6z?e2(wag-M?2eP3jLmS4LcUcA2QX5~hSHH+F7nfvXX7(f62wK>~6yyvL|c@`!Y z=EdgKB<@+gHM=9aV`ZmiuakD3mfw0Ge=YA%g&#haen`DEQ)uOqDY3I6rp*YQEBZv} zN!sIMON?2S99@fDfrV~VXjD)9nTbb~9U9NAI|pn^-naRh*1q8J)|u1(J+Yjq>#uQmR+~A=Uv_m9iZQPk% z6^6eTZJxS$>desG>bLrw`)dl{cI#f=rX#U+!TPAT**k&jE+568*rPDfYf;Ujbx-1e z{nGQm-V3mMI3+Trc-Kx~cXC>4wetUCOXqk4%Xaqzo%+B@-1Yp=dS*-xohG!u z*S=NdPgjJW)XFtpW)htGN`S%7#zrt+;=E{)td8swqs&0(i|an`=91>xel)lHWBWGZN39uJL}w)a0KU+I5o0NTz`1z@N+S|^L-7~j5pQv_X{=zdK$^O4EP`=R!h z8K1(h??1KX+#8{C)}1VS4L-8A@=sRCnX{+x?T@W{pYO~0vdK`sZ(@E?taaVn+n?{T zHT?PY=luGbc_GuTXuc}hT-MFq+5N5eUPX#>V9x0+y8ivOyN`_yKkeY?Nj zop-w0%>V8li=>b0)9ot*zJW^GjUr1YupPx0(H5xp#5u`U1E{XgHXZ3lLfN~CNr zSr`58c?%4zedYi5imUDY@a&DbsN2#FMORj&Ox-5=sq6f|*8&V$v$fBs&e(e5n5L?=xr}X2-}b%cKdYz2ue*2fv_1dg z@{|9v*Z+U7#d(=Qs_R7j)@cIeXLrcsL9LgQu&X%Q~loCII5iGTZ, 2014. +# Algunes decisions de traducció: +# engraver: Gravador +# grob: Objecte gràfic de tipografia +msgid "" +msgstr "" +"Project-Id-Version: ca\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-04-25 19:39+0200\n" +"PO-Revision-Date: 2014-06-09 09:09+0200\n" +"Last-Translator: Walter Garcia-Fontes \n" +"Language-Team: Catalan \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: postprocess_html.py:55 +#, python-format +msgid "This page is for %(package_name)s-%(package_version)s (%(branch_str)s)." +msgstr "Aquesta pàgina correspon a %(package_name)s-%(package_version)s (%(branch_str)s)." + +#: postprocess_html.py:57 +#, python-format +msgid "" +"We welcome your aid; please help us by " +"reporting errors to our bug list." +msgstr "Agraïm la vostra ajuda: sisplau ajudeu-nos informant d'errors a la nostra llista de correu d'errors." + +#: postprocess_html.py:69 +#, python-format +msgid "Other languages: %s." +msgstr "Altres idiomes: %s." + +#: postprocess_html.py:70 +#, python-format +msgid "About automatic language selection." +msgstr "Quant a selecció automàtica de l'idioma." + +#: postprocess_html.py:327 +msgid "stable-branch" +msgstr "branca estable" + +#: postprocess_html.py:329 +msgid "development-branch" +msgstr "branca de desenvolupament" + +#: translations-status.py:72 +msgid "Section titles" +msgstr "Títols de secció" + +#: translations-status.py:73 +#, python-format +msgid "Last updated %s" +msgstr "Actualitzat el %s" + +#: translations-status.py:74 +msgid "Translators" +msgstr "Traductors" + +#: translations-status.py:74 +msgid "Translation checkers" +msgstr "Revisors" + +#: translations-status.py:75 +msgid "Translated" +msgstr "Traduït" + +#: translations-status.py:75 +msgid "Up to date" +msgstr "Actualitzat" + +#: translations-status.py:76 +msgid "Other info" +msgstr "Més inf." + +#: translations-status.py:78 +msgid "no" +msgstr "no" + +#: translations-status.py:79 +msgid "not translated" +msgstr "no traduït" + +#: translations-status.py:81 +#, python-format +msgid "partially (%(p)d %%)" +msgstr "parcialment (%(p)d %%)" + +#: translations-status.py:83 +#, python-format +msgid "partially translated (%(p)d %%)" +msgstr "parcialment. traduït (%(p)d %%)" + +#: translations-status.py:84 translations-status.py:86 +msgid "yes" +msgstr "si" + +#: translations-status.py:85 +msgid "translated" +msgstr "traduït" + +#: translations-status.py:86 translations-status.py:87 +msgid "up to date" +msgstr "actualitzat" + +#: translations-status.py:88 +msgid "partially" +msgstr "parcialment" + +#: translations-status.py:89 +msgid "partially up to date" +msgstr "parcialment actualitzat" + +#: translations-status.py:90 +msgid "N/A" +msgstr "N/D" + +#: translations-status.py:91 +msgid "pre-GDP" +msgstr "pre-GDP" + +#: translations-status.py:92 +msgid "post-GDP" +msgstr "post-GDP" + +#. -*- coding: utf-8 -*- +#. Documentation/changes.tely:147 (variable) +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "tonic" +msgstr "tònica" + +#. Documentation/changes.tely:240 (variable) +#. Documentation/extending/programming-interface.itely:495 (variable) +msgid "dyn" +msgstr "matisos" + +#. @node in Documentation/changes.tely +#. @node in Documentation/macros.itexi +#. @node in Documentation/cs/macros.itexi +msgid "Top" +msgstr "A dalt" + +#. @top in Documentation/changes.tely +msgid "New features in 2.16 since 2.14" +msgstr "Noves funcionalitats a 2.16 respecte a 2.14" + +#. @top in Documentation/macros.itexi +msgid "LilyPond --- \\\\TITLE\\\\" +msgstr "LilyPond: \\\\TÍTOL\\\\" + +#. @subsubheading in Documentation/macros.itexi +msgid "Predefined commands" +msgstr "Instruccions predefinides" + +#. @subsubheading in Documentation/macros.itexi +msgid "Selected Snippets" +msgstr "Fragments de codi seleccionats" + +#. @subsubheading in Documentation/macros.itexi +msgid "See also" +msgstr "Vegeu també" + +#. @subsubheading in Documentation/macros.itexi +msgid "Known issues and warnings" +msgstr "Fallades i problemes coneguts" + +#. @node in Documentation/essay.tely +#. @appendix in Documentation/essay.tely +#. @node in Documentation/extending.tely +#. @appendix in Documentation/extending.tely +#. @node in Documentation/learning.tely +#. @appendix in Documentation/learning.tely +#. @node in Documentation/notation.tely +#. @appendix in Documentation/notation.tely +#. @node in Documentation/usage.tely +#. @appendix in Documentation/usage.tely +msgid "LilyPond index" +msgstr "Índex del LilyPond" + +#. @node in Documentation/essay/engraving.itely +#. @chapter in Documentation/essay/engraving.itely +msgid "Music engraving" +msgstr "Gravat musical" + +#. @node in Documentation/essay/engraving.itely +#. @section in Documentation/essay/engraving.itely +msgid "The LilyPond story" +msgstr "Història del LilyPond" + +#. @node in Documentation/essay/engraving.itely +#. @section in Documentation/essay/engraving.itely +msgid "Engraving details" +msgstr "Detalls del gravat musical" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "Music fonts" +msgstr "Tipus de lletres de música" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "Optical spacing" +msgstr "Espaiat òptic" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "Ledger lines" +msgstr "Línies addicionals" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "Optical sizing" +msgstr "Ajust òptic de la mida" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "Why work so hard?" +msgstr "Per a què treballar tan durament?" + +#. @node in Documentation/essay/engraving.itely +#. @section in Documentation/essay/engraving.itely +msgid "Automated engraving" +msgstr "Gravat automàtic" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "Beauty contests" +msgstr "Concursos de bellesa" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "Improvement by benchmarking" +msgstr "Millores mitjançant proves" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "Getting things right" +msgstr "Fer les coses bé" + +#. @node in Documentation/essay/engraving.itely +#. @section in Documentation/essay/engraving.itely +msgid "Building software" +msgstr "Construcció del programari" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "Music representation" +msgstr "Representació musical" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "What symbols to engrave?" +msgstr "Quins símbols gravar?" + +#. @node in Documentation/essay/engraving.itely +#. @unnumberedsubsec in Documentation/essay/engraving.itely +msgid "Flexible architecture" +msgstr "Arquitectura flexible" + +#. @node in Documentation/essay/engraving.itely +#. @section in Documentation/essay/engraving.itely +msgid "Putting LilyPond to work" +msgstr "Posar al LilyPond a treballar" + +#. @node in Documentation/essay/engraving.itely +#. @section in Documentation/essay/engraving.itely +msgid "Engraved examples (BWV 861)" +msgstr "Exemples gravats (BWV 861)" + +#. @node in Documentation/essay/literature.itely +#. @chapter in Documentation/essay/literature.itely +msgid "Literature list" +msgstr "Llista bibliogràfica" + +#. @node in Documentation/essay/literature.itely +#. @section in Documentation/essay/literature.itely +msgid "Short literature list" +msgstr "Breu llista bibliogràfica" + +#. @node in Documentation/essay/literature.itely +#. @section in Documentation/essay/literature.itely +msgid "Long literature list" +msgstr "Llista bibliogràfica extensa" + +#. @subheading in Documentation/essay/literature.itely +msgid "University of Colorado Engraving music bibliography" +msgstr "Bibliografia sobre tipografia musical de la Universitat de Colorado" + +#. @subheading in Documentation/essay/literature.itely +msgid "Computer notation bibliography" +msgstr "Bibliografia sobre notació per ordinador" + +#. @subheading in Documentation/essay/literature.itely +msgid "Engraving bibliography" +msgstr "Bibliografia sobre tipografia musical" + +#. @node in Documentation/fdl.itexi +#. @appendix in Documentation/fdl.itexi +#. @node in Documentation/fdl.itexi +#. @appendix in Documentation/fdl.itexi +#. @node in Documentation/fdl.itexi +#. @appendix in Documentation/fdl.itexi +#. @node in Documentation/fdl.itexi +#. @appendix in Documentation/fdl.itexi +#. @node in Documentation/fdl.itexi +#. @appendix in Documentation/fdl.itexi +#. @node in Documentation/fdl.itexi +#. @appendix in Documentation/fdl.itexi +msgid "GNU Free Documentation License" +msgstr "Llicència de Documentació Lliure de GNU" + +#. @heading in Documentation/fdl.itexi +msgid "ADDENDUM: How to use this License for your documents" +msgstr "AFEGITÓ: Com usar aquesta llicència per als vostres documents" + +#. Documentation/extending/scheme-tutorial.itely:796 (variable) +msgid "traLaLa" +msgstr "traLaLa" + +#. Documentation/extending/scheme-tutorial.itely:1472 (variable) +#. Documentation/learning/fundamental.itely:3013 (variable) +#. Documentation/learning/fundamental.itely:3068 (variable) +#. Documentation/notation/changing-defaults.itely:3897 (variable) +#. Documentation/cs/learning/fundamental.itely:3258 (variable) +#. Documentation/cs/learning/fundamental.itely:3312 (variable) +msgid "padText" +msgstr "padText" + +#. Documentation/extending/scheme-tutorial.itely:1495 (variable) +#. Documentation/notation/changing-defaults.itely:3939 (variable) +msgid "tempoPadded" +msgstr "tempoPadded" + +#. Documentation/extending/scheme-tutorial.itely:1514 (variable) +msgid "pattern" +msgstr "patró" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @chapter in Documentation/extending/scheme-tutorial.itely +msgid "Scheme tutorial" +msgstr "Tutorial del Scheme" + +# ?? FVD +#. @node in Documentation/extending/scheme-tutorial.itely +#. @section in Documentation/extending/scheme-tutorial.itely +msgid "Introduction to Scheme" +msgstr "Introducció al Scheme" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Scheme sandbox" +msgstr "Entorn de proves del Scheme" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Scheme variables" +msgstr "Variables del Scheme" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Scheme simple data types" +msgstr "Tipus de dades simples del Scheme" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Scheme compound data types" +msgstr "Tipus de dades compostes del Scheme" + +# También Líneas divisorias. FVD +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Pairs" +msgstr "Parelles" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Lists" +msgstr "Llistes" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Association lists (alists)" +msgstr "Llistes associatives (alists)" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Hash tables" +msgstr "Taules de dispersió" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Calculations in Scheme" +msgstr "Càlculs en Scheme" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Scheme procedures" +msgstr "Procedimients del Scheme" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Defining procedures" +msgstr "Definició de procediments" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Predicates" +msgstr "Predicats" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Return values" +msgstr "Valors de retorn" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Scheme conditionals" +msgstr "Condicionals del Scheme" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "if" +msgstr "if" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "cond" +msgstr "cond" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @section in Documentation/extending/scheme-tutorial.itely +msgid "Scheme in LilyPond" +msgstr "Scheme al LilyPond" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "LilyPond Scheme syntax" +msgstr "Sintaxi del Scheme del LilyPond" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "LilyPond variables" +msgstr "Variables del LilyPond" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Input variables and Scheme" +msgstr "Variables d'entrada i el Scheme" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Object properties" +msgstr "Propietats dels objectes" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "LilyPond compound variables" +msgstr "Variables compostes del LilyPond" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Offsets" +msgstr "Desplaçaments" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Fractions" +msgstr "Fraccions" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Extents" +msgstr "Dimensions" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Property alists" +msgstr "alists de propietats" + +#. @subheading in Documentation/extending/scheme-tutorial.itely +msgid "Alist chains" +msgstr "Cadenes d'alists" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Internal music representation" +msgstr "Representació interna de la música" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @section in Documentation/extending/scheme-tutorial.itely +msgid "Building complicated functions" +msgstr "Construcció de funcions complexes" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Displaying music expressions" +msgstr "Presentació de expressions musicals" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Music properties" +msgstr "Propietats de la música" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Doubling a note with slurs (example)" +msgstr "Doblar una nota amb lligadures d'unió (exemple)" + +#. @node in Documentation/extending/scheme-tutorial.itely +#. @subsection in Documentation/extending/scheme-tutorial.itely +msgid "Adding articulation to notes (example)" +msgstr "Addició d'una articulació a les notes (exemple)" + +#. Documentation/extending/programming-interface.itely:376 (variable) +msgid "manualBeam" +msgstr "manualBeam" + +#. Documentation/extending/programming-interface.itely:397 (variable) +#. Documentation/snippets/score-for-diatonic-accordion.ly:197 (variable) +msgid "AltOn" +msgstr "AltOn" + +#. Documentation/extending/programming-interface.itely:407 (variable) +#. Documentation/snippets/score-for-diatonic-accordion.ly:203 (variable) +msgid "AltOff" +msgstr "AltOff" + +#. Documentation/extending/programming-interface.itely:422 (variable) +msgid "withAlt" +msgstr "withAlt" + +#. @node in Documentation/extending/programming-interface.itely +#. @chapter in Documentation/extending/programming-interface.itely +msgid "Interfaces for programmers" +msgstr "Interfícies per a programadors" + +#. @node in Documentation/extending/programming-interface.itely +#. @section in Documentation/extending/programming-interface.itely +msgid "Lilypond code blocks" +msgstr "Blocs de codi del LilyPond" + +#. @node in Documentation/extending/programming-interface.itely +#. @section in Documentation/extending/programming-interface.itely +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Scheme functions" +msgstr "Funcions del Scheme" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Scheme function definitions" +msgstr "Definicions de funcions del Scheme" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Scheme function usage" +msgstr "Ús de les funcions del Scheme" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Void scheme functions" +msgstr "Funcions del Scheme buides" + +#. @node in Documentation/extending/programming-interface.itely +#. @section in Documentation/extending/programming-interface.itely +msgid "Music functions" +msgstr "Funcions musicals" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Music function definitions" +msgstr "Definició de funcions musicals" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Music function usage" +msgstr "Ús de les funcions musicals" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Simple substitution functions" +msgstr "Funcions simples de substitució" + +# fuzzy. FVD +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Intermediate substitution functions" +msgstr "Funcions intermèdies de substitució" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Mathematics in functions" +msgstr "Matemàtiques a les funcions" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Functions without arguments" +msgstr "Funcions sense arguments" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Void music functions" +msgstr "Funcions musicals buides" + +#. @node in Documentation/extending/programming-interface.itely +#. @section in Documentation/extending/programming-interface.itely +msgid "Event functions" +msgstr "Funcions d'esdeveniments" + +#. @node in Documentation/extending/programming-interface.itely +#. @section in Documentation/extending/programming-interface.itely +msgid "Markup functions" +msgstr "Funcions d'etiquetatge" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Markup construction in Scheme" +msgstr "Construcció d'etiquetatge al Scheme" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "How markups work internally" +msgstr "Com funciona internament l'etiquetatge" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "New markup command definition" +msgstr "Definició d'una instrucció d'etiquetatge nova" + +#. @node in Documentation/extending/programming-interface.itely +#. @unnumberedsubsubsec in Documentation/extending/programming-interface.itely +msgid "Markup command definition syntax" +msgstr "Sintaxi de definició d'ordre d'etiquetatge" + +#. @node in Documentation/extending/programming-interface.itely +#. @unnumberedsubsubsec in Documentation/extending/programming-interface.itely +msgid "On properties" +msgstr "Quant a les propietats" + +#. @node in Documentation/extending/programming-interface.itely +#. @unnumberedsubsubsec in Documentation/extending/programming-interface.itely +msgid "A complete example" +msgstr "Un exemple complet" + +#. @node in Documentation/extending/programming-interface.itely +#. @unnumberedsubsubsec in Documentation/extending/programming-interface.itely +msgid "Adapting builtin commands" +msgstr "Adaptació d'ordres predefinides" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "New markup list command definition" +msgstr "Definició de noves instruccions de llista d'etiquetatge" + +#. @node in Documentation/extending/programming-interface.itely +#. @section in Documentation/extending/programming-interface.itely +msgid "Contexts for programmers" +msgstr "Contextos per a programadors" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Context evaluation" +msgstr "Avaluació de contextos" + +#. @node in Documentation/extending/programming-interface.itely +#. @subsection in Documentation/extending/programming-interface.itely +msgid "Running a function on all layout objects" +msgstr "Execució d'una funció sobre tots els objectes de format" + +#. @node in Documentation/extending/programming-interface.itely +#. @section in Documentation/extending/programming-interface.itely +msgid "Callback functions" +msgstr "Funcions de crida de retorn" + +#. @node in Documentation/extending/programming-interface.itely +#. @section in Documentation/extending/programming-interface.itely +msgid "Inline Scheme code" +msgstr "Codi del Scheme en línia" + +# ??FVD +#. @node in Documentation/extending/programming-interface.itely +#. @section in Documentation/extending/programming-interface.itely +msgid "Difficult tweaks" +msgstr "Apanyos difícils" + +#. @node in Documentation/extending/programming-interface.itely +#. @chapter in Documentation/extending/programming-interface.itely +msgid "LilyPond Scheme interfaces" +msgstr "Interfícies del Scheme del LilyPond" + +#. Documentation/learning/tutorial.itely:210 (comment) +msgid "set the starting point to middle C" +msgstr "estableix el punt inicial al Do central" + +#. Documentation/learning/tutorial.itely:241 (comment) +msgid "one octave above middle C" +msgstr "una octava per sobre del Do central" + +#. Documentation/learning/tutorial.itely:257 (comment) +msgid "c is 1 staff space up, so is the c above" +msgstr "el Do està un espai del pentagrama amunt, així com també el Do amunt" + +#. Documentation/learning/tutorial.itely:258 (comment) +msgid "d is 2 up or 5 down, so is the d above" +msgstr "el Re està 2 amunt o 5 a sota, així com també el Re a sobre" + +#. Documentation/learning/tutorial.itely:259 (comment) +msgid "e is 3 up or 4 down, so is the e above" +msgstr "el Mi està 3 amunt o 4 a sota, així com també el Mi a sobre" + +#. Documentation/learning/tutorial.itely:260 (comment) +msgid "a is 6 up or 1 down, so is the a below" +msgstr "el La està 6 amunt o 1 a sota, això com també el La a sota" + +#. Documentation/learning/tutorial.itely:261 (comment) +msgid "g is 5 up or 2 down, so is the g below" +msgstr "el Sol està 5 a dalt o 2 a sota, això com també el Sol a sota" + +#. Documentation/learning/tutorial.itely:262 (comment) +msgid "f is 4 up or 3 down, so is the f below" +msgstr "el Fa està 4 a dalt o 3 a sota, així com també el Fa a sota" + +#. @node in Documentation/learning/tutorial.itely +#. @chapter in Documentation/learning/tutorial.itely +msgid "Tutorial" +msgstr "Tutorial" + +#. @node in Documentation/learning/tutorial.itely +#. @section in Documentation/learning/tutorial.itely +msgid "Compiling a file" +msgstr "Compilació d'un fitxer" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +msgid "Entering input" +msgstr "Introducció de codi d'entrada" + +#. @subheading in Documentation/learning/tutorial.itely +msgid "Producing output" +msgstr "Producció de la sortida" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "MacOS X" +msgstr "MacOS X" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Windows" +msgstr "Windows" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +msgid "Command-line" +msgstr "Línia d'ordres" + +#. @node in Documentation/learning/tutorial.itely +#. @section in Documentation/learning/tutorial.itely +msgid "How to write input files" +msgstr "Com escriure fitxers d'entrada" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +msgid "Simple notation" +msgstr "Notació senzilla" + +#. @subheading in Documentation/learning/tutorial.itely +msgid "Pitches" +msgstr "Tons" + +#. @rglos in Documentation/learning/tutorial.itely +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "pitch" +msgstr "to" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "interval" +msgstr "interval" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +#. Documentation/snippets/changing-the-interval-of-lines-on-the-stave.ly:23 (variable) +#. Documentation/snippets/printing-note-names-with-and-without-an-octave-marker.ly:33 (variable) +msgid "scale" +msgstr "escala" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "middle C" +msgstr "Do central" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "octave" +msgstr "octava" + +#. @rglos in Documentation/learning/tutorial.itely +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "accidental" +msgstr "alteració accidental" + +#. @subheading in Documentation/learning/tutorial.itely +msgid "Durations (rhythms)" +msgstr "Duracions (valors rítmics)" + +#. @rglos in Documentation/learning/tutorial.itely +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "beam" +msgstr "barra" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "duration" +msgstr "duració" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "whole note" +msgstr "rodona" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "half note" +msgstr "blanca" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "quarter note" +msgstr "negra" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "dotted note" +msgstr "figura amb puntet" + +#. @subheading in Documentation/learning/tutorial.itely +msgid "Rests" +msgstr "Silencis" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "rest" +msgstr "silenci" + +#. @subheading in Documentation/learning/tutorial.itely +msgid "Time signature" +msgstr "Indicació de compàs" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "time signature" +msgstr "indicació de compàs" + +#. @subheading in Documentation/learning/tutorial.itely +msgid "Tempo marks" +msgstr "Indicacions de tempo" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "tempo indication" +msgstr "indicació del tempo" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "metronome" +msgstr "metrònom" + +#. @subheading in Documentation/learning/tutorial.itely +msgid "Clef" +msgstr "Clau" + +#. @rglos in Documentation/learning/tutorial.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tutorial.itely +msgid "clef" +msgstr "clau" + +#. @subheading in Documentation/learning/tutorial.itely +msgid "All together" +msgstr "Tot plegat" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +msgid "Working on input files" +msgstr "Treball sobre fitxers d'entrada" + +#. @node in Documentation/learning/tutorial.itely +#. @section in Documentation/learning/tutorial.itely +msgid "Dealing with errors" +msgstr "Gestió d'errors" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +msgid "General troubleshooting tips" +msgstr "Consells generals per a la resolució de problemes" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +msgid "Some common errors" +msgstr "Alguns errors comuns" + +#. @node in Documentation/learning/tutorial.itely +#. @section in Documentation/learning/tutorial.itely +msgid "How to read the manuals" +msgstr "Com llegir els manuals" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +msgid "Omitted material" +msgstr "Material omès" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +msgid "Clickable examples" +msgstr "Exemples que es poden clicar" + +#. @node in Documentation/learning/tutorial.itely +#. @subsection in Documentation/learning/tutorial.itely +msgid "Overview of manuals" +msgstr "Panoràmica dels manuals" + +#. Documentation/learning/common-notation.itely:1224 (variable) +#. Documentation/learning/fundamental.itely:2994 (variable) +#. Documentation/learning/fundamental.itely:3018 (variable) +#. Documentation/cs/learning/common-notation.itely:1314 (variable) +#. Documentation/cs/learning/fundamental.itely:3239 (variable) +#. Documentation/cs/learning/fundamental.itely:3263 (variable) +msgid "violin" +msgstr "violí" + +#. Documentation/learning/common-notation.itely:1230 (variable) +#. Documentation/cs/learning/common-notation.itely:1320 (variable) +#. Documentation/snippets/string-quartet-template-simple.ly:95 (variable) +msgid "cello" +msgstr "violoncel" + +#. Documentation/learning/common-notation.itely:1256 (variable) +#. Documentation/cs/learning/common-notation.itely:1346 (variable) +msgid "tripletA" +msgstr "tripletA" + +#. Documentation/learning/common-notation.itely:1257 (variable) +#. Documentation/cs/learning/common-notation.itely:1347 (variable) +msgid "barA" +msgstr "barA" + +#. @rglos in Documentation/learning/common-notation.itely +#. Documentation/snippets/measure-counter.ly:30 (context id) +#. Documentation/snippets/measure-counter.ly:37 (context id) +msgid "foo" +msgstr "bla" + +#. @node in Documentation/learning/common-notation.itely +#. @chapter in Documentation/learning/common-notation.itely +msgid "Common notation" +msgstr "Notació comuna" + +#. @node in Documentation/learning/common-notation.itely +#. @section in Documentation/learning/common-notation.itely +msgid "Single staff notation" +msgstr "Notació d'un sol pentagrama" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Bar checks" +msgstr "Comprovació de compàs" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Accidentals and key signatures" +msgstr "Alteracions accidentals i armadures" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Accidentals" +msgstr "Alteracions accidentals" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "sharp" +msgstr "sostingut" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "flat" +msgstr "bemol" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "double sharp" +msgstr "doble sostingut" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "double flat" +msgstr "doble bemol" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Key signatures" +msgstr "Armadures" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "key signature" +msgstr "armadura de la tonalitat" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "major" +msgstr "major" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "minor" +msgstr "menor" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Warning: key signatures and pitches" +msgstr "Advertiment: armadures i tons" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "natural" +msgstr "becaire" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "transposition" +msgstr "transposició" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @chapter in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "Pitch names" +msgstr "Noms de les notes" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Ties and slurs" +msgstr "Lligadures d'unió i d'expressió" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Ties" +msgstr "Lligadures d'unió" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "tie" +msgstr "lligadura d'unió" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Slurs" +msgstr "Lligadures d'expressió" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "slur" +msgstr "lligadura d'expresió" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Phrasing slurs" +msgstr "Lligadures de fraseig" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "phrasing" +msgstr "fraseig" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Warnings: slurs vs. ties" +msgstr "Advertiments: lligadures d'expressió contra lligadures d'unió" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "articulation" +msgstr "articulació" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Articulation and dynamics" +msgstr "Articulacions i matissos dinàmics" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Articulations" +msgstr "Articulacions" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Fingerings" +msgstr "Digitacions" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "fingering" +msgstr "digitacions" + +#. @subheading in Documentation/learning/common-notation.itely +#. @subheading in Documentation/learning/tweaks.itely +msgid "Dynamics" +msgstr "Matisos dinàmics" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "dynamics" +msgstr "matisos dinàmics" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "crescendo" +msgstr "crescendo" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "decrescendo" +msgstr "decrescendo" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Adding text" +msgstr "Addicció de text" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Automatic and manual beams" +msgstr "Barres automàtiques i manuals" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Advanced rhythmic commands" +msgstr "Instruccions rítmiques avançades" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Partial measure" +msgstr "Compàs parcial" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "anacrusis" +msgstr "anacrusi" + +#. @subheading in Documentation/learning/common-notation.itely +#. Documentation/snippets/unfretted-headword.ly:93 (comment) +msgid "Tuplets" +msgstr "Tuplets" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "note value" +msgstr "figura" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "triplet" +msgstr "triplet" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Grace notes" +msgstr "Notes de adorn" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "grace notes" +msgstr "notes de adorn" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "acciaccatura" +msgstr "acciaccatura" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "appoggiatura" +msgstr "appoggiatura" + +#. @node in Documentation/learning/common-notation.itely +#. @section in Documentation/learning/common-notation.itely +msgid "Multiple notes at once" +msgstr "Diverses notes a l'hora" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Music expressions explained" +msgstr "Explicació de les expressions musicals" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Analogy: mathematical expressions" +msgstr "Analogia: expressions matemàtiques" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Simultaneous music expressions: multiple staves" +msgstr "Expressions musicals simultànees: diversos pentagrames" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "polyphony" +msgstr "polifonia" + +#. @subheading in Documentation/learning/common-notation.itely +msgid "Simultaneous music expressions: single staff" +msgstr "Expressions musicals simultànies: un sol pentagrama" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Multiple staves" +msgstr "Diversos pentagrames" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Staff groups" +msgstr "Grups de pentagrames" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "brace" +msgstr "claudàtor" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "staff" +msgstr "pentagrama" + +#. @rglos in Documentation/learning/common-notation.itely +#. @rglos in Documentation/learning/fundamental.itely +#. @rglos in Documentation/learning/tweaks.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/fundamental.itely +#. @rglos in Documentation/cs/learning/tweaks.itely +msgid "system" +msgstr "sistema" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Combining notes into chords" +msgstr "Combinar notes per formar acords" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "chord" +msgstr "acord" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Single staff polyphony" +msgstr "Polifonia en un sol pentagrama" + +#. @node in Documentation/learning/common-notation.itely +#. @section in Documentation/learning/common-notation.itely +msgid "Songs" +msgstr "Cançons" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Setting simple songs" +msgstr "Elaborar cançons senzilles" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "lyrics" +msgstr "lletra" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Aligning lyrics to a melody" +msgstr "Alineació de la lletra d'una melodia" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "melisma" +msgstr "melisma" + +#. @rglos in Documentation/learning/common-notation.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/common-notation.itely +msgid "extender line" +msgstr "línia extensora" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Lyrics to multiple staves" +msgstr "Lletra en diversos pentagrames" + +#. @node in Documentation/learning/common-notation.itely +#. @section in Documentation/learning/common-notation.itely +msgid "Final touches" +msgstr "Retocs finals" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Organizing pieces with variables" +msgstr "Organitzar les peces mitjançant variables" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Adding titles" +msgstr "Afegir títols" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "Absolute note names" +msgstr "Noms absoluts de nota" + +#. @node in Documentation/learning/common-notation.itely +#. @subsection in Documentation/learning/common-notation.itely +msgid "After the tutorial" +msgstr "Més enllà del tutorial" + +#. Documentation/learning/fundamental.itely:320 (context id) +#. Documentation/learning/fundamental.itely:371 (context id) +#. Documentation/cs/learning/fundamental.itely:383 (context id) +#. Documentation/cs/learning/fundamental.itely:443 (context id) +#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:116 (variable) +#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:129 (context id) +#. Documentation/snippets/piano-template-with-centered-lyrics.ly:82 (context id) +msgid "singer" +msgstr "cantant" + +#. Documentation/learning/fundamental.itely:321 (context id) +#. Documentation/learning/fundamental.itely:372 (context id) +#. Documentation/cs/learning/fundamental.itely:384 (context id) +#. Documentation/cs/learning/fundamental.itely:444 (context id) +msgid "vocal" +msgstr "veu" + +#. Documentation/learning/fundamental.itely:324 (context id) +#. Documentation/learning/fundamental.itely:375 (context id) +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/cs/learning/fundamental.itely:387 (context id) +#. Documentation/cs/learning/fundamental.itely:447 (context id) +#. Documentation/snippets/jazz-combo-template.ly:250 (variable) +#. Documentation/snippets/jazz-combo-template.ly:310 (context id) +#. Documentation/snippets/staff-headword.ly:122 (context id) +msgid "piano" +msgstr "piano" + +#. Documentation/learning/fundamental.itely:325 (context id) +#. Documentation/learning/fundamental.itely:366 (variable) +#. Documentation/learning/fundamental.itely:376 (context id) +#. Documentation/learning/fundamental.itely:2602 (variable) +#. Documentation/learning/fundamental.itely:2664 (context id) +#. Documentation/cs/learning/fundamental.itely:388 (context id) +#. Documentation/cs/learning/fundamental.itely:438 (variable) +#. Documentation/cs/learning/fundamental.itely:448 (context id) +#. Documentation/cs/learning/fundamental.itely:2822 (variable) +#. Documentation/cs/learning/fundamental.itely:2884 (context id) +#. Documentation/snippets/changing-the-number-of-lines-in-a-staff.ly:24 (variable) +#. Documentation/snippets/chords-headword.ly:75 (context id) +#. Documentation/snippets/fretted-headword.ly:144 (context id) +#. Documentation/snippets/jazz-combo-template.ly:253 (context id) +#. Documentation/snippets/piano-template-simple.ly:50 (variable) +#. Documentation/snippets/piano-template-simple.ly:69 (context id) +#. Documentation/snippets/piano-template-with-centered-lyrics.ly:60 (variable) +#. Documentation/snippets/piano-template-with-centered-lyrics.ly:82 (context id) +#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:72 (variable) +#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:93 (context id) +#. Documentation/snippets/polyphony-in-tablature.ly:47 (variable) +#. Documentation/snippets/polyphony-in-tablature.ly:65 (context id) +#. Documentation/snippets/polyphony-in-tablature.ly:69 (context id) +#. Documentation/snippets/staff-headword.ly:71 (variable) +msgid "upper" +msgstr "superior" + +#. Documentation/learning/fundamental.itely:326 (context id) +#. Documentation/learning/fundamental.itely:367 (variable) +#. Documentation/learning/fundamental.itely:377 (context id) +#. Documentation/learning/fundamental.itely:2609 (variable) +#. Documentation/learning/fundamental.itely:2665 (context id) +#. Documentation/cs/learning/fundamental.itely:389 (context id) +#. Documentation/cs/learning/fundamental.itely:439 (variable) +#. Documentation/cs/learning/fundamental.itely:449 (context id) +#. Documentation/cs/learning/fundamental.itely:2829 (variable) +#. Documentation/cs/learning/fundamental.itely:2885 (context id) +#. Documentation/snippets/changing-the-number-of-lines-in-a-staff.ly:28 (variable) +#. Documentation/snippets/chords-headword.ly:85 (context id) +#. Documentation/snippets/fretted-headword.ly:145 (context id) +#. Documentation/snippets/jazz-combo-template.ly:254 (context id) +#. Documentation/snippets/piano-template-simple.ly:58 (variable) +#. Documentation/snippets/piano-template-simple.ly:70 (context id) +#. Documentation/snippets/piano-template-with-centered-lyrics.ly:68 (variable) +#. Documentation/snippets/piano-template-with-centered-lyrics.ly:84 (context id) +#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:80 (variable) +#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:94 (context id) +#. Documentation/snippets/polyphony-in-tablature.ly:54 (variable) +#. Documentation/snippets/polyphony-in-tablature.ly:66 (context id) +#. Documentation/snippets/polyphony-in-tablature.ly:70 (context id) +#. Documentation/snippets/staff-headword.ly:82 (variable) +msgid "lower" +msgstr "inferior" + +#. Documentation/learning/fundamental.itely:364 (variable) +#. Documentation/notation/changing-defaults.itely:488 (variable) +#. Documentation/notation/changing-defaults.itely:495 (context id) +#. Documentation/notation/changing-defaults.itely:505 (context id) +#. Documentation/notation/changing-defaults.itely:510 (context id) +#. Documentation/notation/changing-defaults.itely:527 (variable) +#. Documentation/notation/changing-defaults.itely:545 (context id) +#. Documentation/notation/changing-defaults.itely:740 (variable) +#. Documentation/cs/learning/fundamental.itely:436 (variable) +#. Documentation/snippets/adjusting-lyrics-vertical-spacing.ly:39 (context id) +#. Documentation/snippets/adjusting-lyrics-vertical-spacing.ly:47 (context id) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly:81 (context id) +#. Documentation/snippets/demo-midiinstruments.ly:33 (variable) +#. Documentation/snippets/formatting-lyrics-syllables.ly:47 (context id) +#. Documentation/snippets/fretted-headword.ly:64 (variable) +#. Documentation/snippets/guitar-strum-rhythms.ly:72 (context id) +#. Documentation/snippets/heavily-customized-polymetric-time-signatures.ly:38 (variable) +#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:60 (variable) +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly:61 (variable) +#. Documentation/snippets/single-staff-template-with-notes-and-chords.ly:61 (variable) +#. Documentation/snippets/single-staff-template-with-notes-and-lyrics.ly:80 (variable) +#. Documentation/snippets/single-staff-template-with-only-notes.ly:69 (variable) +#. Documentation/snippets/vertically-centered-common-lyrics.ly:48 (variable) +msgid "melody" +msgstr "melodia" + +#. Documentation/learning/fundamental.itely:365 (variable) +#. Documentation/cs/learning/fundamental.itely:437 (variable) +#. Documentation/snippets/piano-template-with-centered-lyrics.ly:76 (variable) +#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:68 (variable) +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly:69 (variable) +#. Documentation/snippets/single-staff-template-with-notes-and-lyrics.ly:88 (variable) +msgid "text" +msgstr "text" + +#. Documentation/learning/fundamental.itely:439 (context id) +#. Documentation/cs/learning/fundamental.itely:515 (context id) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:104 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:139 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:155 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:176 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:191 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:212 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:227 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:243 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:259 (comment) +msgid "main" +msgstr "principal" + +#. Documentation/learning/fundamental.itely:627 (comment) +#. Documentation/cs/learning/fundamental.itely:719 (comment) +msgid "Voice \\\"1\\\" Voice \\\"2\\\"" +msgstr "Veu \\\"1\\\" Veu \\\"2\\\"" + +#. Documentation/learning/fundamental.itely:637 (comment) +#. Documentation/cs/learning/fundamental.itely:729 (comment) +msgid "Voice \\\"1\\\" Voice \\\"2\\\"" +msgstr "Veu \\\"1\\\" Veu \\\"2\\\"" + +#. Documentation/learning/fundamental.itely:652 (comment) +#. Documentation/cs/learning/fundamental.itely:744 (comment) +msgid "Voice \\\"1\\\"" +msgstr "Veu \\\"1\\\"" + +#. Documentation/learning/fundamental.itely:657 (comment) +#. Documentation/cs/learning/fundamental.itely:749 (comment) +msgid "Voice \\\"2\\\"" +msgstr "Veu \\\"2\\\"" + +#. Documentation/learning/fundamental.itely:683 (comment) +#. Documentation/learning/fundamental.itely:707 (comment) +#. Documentation/cs/learning/fundamental.itely:766 (comment) +#. Documentation/cs/learning/fundamental.itely:790 (comment) +msgid "Main voice" +msgstr "Veu principal" + +#. Documentation/learning/fundamental.itely:685 (comment) +#. Documentation/cs/learning/fundamental.itely:768 (comment) +msgid "Voice \\\"1\\\" Voice \\\"2\\\" Voice \\\"3\\\"" +msgstr "Veu \\\"1\\\" Veu \\\"2\\\" Veu \\\"3\\\"" + +#. Documentation/learning/fundamental.itely:709 (comment) +#. Documentation/cs/learning/fundamental.itely:792 (comment) +msgid "Bar 1" +msgstr "Compàs 1" + +# También Líneas divisorias. FVD +#. Documentation/learning/fundamental.itely:720 (comment) +#. Documentation/cs/learning/fundamental.itely:803 (comment) +msgid "Bar 2" +msgstr "Compàs 2" + +#. Documentation/learning/fundamental.itely:721 (comment) +#. Documentation/cs/learning/fundamental.itely:804 (comment) +msgid "Voice 1 continues" +msgstr "Continua la veu 1" + +#. Documentation/learning/fundamental.itely:724 (comment) +#. Documentation/cs/learning/fundamental.itely:807 (comment) +msgid "Voice 2 continues" +msgstr "Continua la veu 2" + +#. Documentation/learning/fundamental.itely:903 (comment) +#. Documentation/cs/learning/fundamental.itely:984 (comment) +msgid "Voice one" +msgstr "Veu u" + +#. Documentation/learning/fundamental.itely:905 (comment) +#. Documentation/cs/learning/fundamental.itely:986 (comment) +msgid "Voice two" +msgstr "Veu dos" + +#. Documentation/learning/fundamental.itely:907 (comment) +#. Documentation/cs/learning/fundamental.itely:988 (comment) +msgid "Omit Voice three" +msgstr "Omet la veu tres" + +#. Documentation/learning/fundamental.itely:908 (comment) +#. Documentation/cs/learning/fundamental.itely:989 (comment) +msgid "Voice four" +msgstr "Veu quatre" + +#. Documentation/learning/fundamental.itely:1007 (comment) +#. Documentation/cs/learning/fundamental.itely:1091 (comment) +msgid "Default behavior or behavior after \\oneVoice" +msgstr "Comportament predeterminat o comportament després de \\oneVoice" + +#. Documentation/learning/fundamental.itely:1045 (comment) +#. Documentation/cs/learning/fundamental.itely:1130 (comment) +msgid "The following notes are monophonic" +msgstr "Les notes següents són monofòniques" + +#. Documentation/learning/fundamental.itely:1047 (comment) +#. Documentation/cs/learning/fundamental.itely:1132 (comment) +msgid "Start simultaneous section of three voices" +msgstr "Inici de la secció de tres veus simultànies" + +#. Documentation/learning/fundamental.itely:1049 (comment) +#. Documentation/cs/learning/fundamental.itely:1134 (comment) +msgid "Continue the main voice in parallel" +msgstr "Continuar la veu principal en paral·lel" + +#. Documentation/learning/fundamental.itely:1051 (comment) +#. Documentation/learning/fundamental.itely:1113 (comment) +#. Documentation/cs/learning/fundamental.itely:1136 (comment) +#. Documentation/cs/learning/fundamental.itely:1202 (comment) +msgid "Initiate second voice" +msgstr "Inicia la segona veu" + +#. Documentation/learning/fundamental.itely:1053 (comment) +#. Documentation/cs/learning/fundamental.itely:1138 (comment) +msgid "Set stems, etc., down" +msgstr "Estableix vírgules, etc., cap a baix" + +#. Documentation/learning/fundamental.itely:1057 (comment) +#. Documentation/learning/fundamental.itely:1119 (comment) +#. Documentation/cs/learning/fundamental.itely:1142 (comment) +#. Documentation/cs/learning/fundamental.itely:1208 (comment) +msgid "Initiate third voice" +msgstr "Inicia la tercera veu" + +#. Documentation/learning/fundamental.itely:1059 (comment) +#. Documentation/learning/fundamental.itely:1121 (comment) +#. Documentation/cs/learning/fundamental.itely:1144 (comment) +#. Documentation/cs/learning/fundamental.itely:1210 (comment) +msgid "Set stems, etc, up" +msgstr "Poser les vírgules, etc., cap amunt" + +#. Documentation/learning/fundamental.itely:1108 (comment) +#. Documentation/cs/learning/fundamental.itely:1197 (comment) +msgid "Initiate first voice" +msgstr "Inicia la primera veu" + +#. Documentation/learning/fundamental.itely:1115 (comment) +#. Documentation/cs/learning/fundamental.itely:1204 (comment) +msgid "Set stems, etc, down" +msgstr "Posar les vírgules, etc., cap a baix" + +#. Documentation/learning/fundamental.itely:1202 (context id) +#. Documentation/learning/fundamental.itely:2313 (context id) +#. Documentation/cs/learning/fundamental.itely:1303 (context id) +#. Documentation/cs/learning/fundamental.itely:2522 (context id) +#. Documentation/snippets/adding-fingerings-to-tablatures.ly:39 (variable) +#. Documentation/snippets/jazz-combo-template.ly:236 (context id) +#. Documentation/snippets/jazz-combo-template.ly:245 (context id) +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly:83 (context id) +#. Documentation/snippets/single-staff-template-with-notes-and-lyrics.ly:94 (context id) +msgid "one" +msgstr "u" + +#. Documentation/learning/fundamental.itely:1247 (variable) +#. Documentation/learning/fundamental.itely:2579 (variable) +#. Documentation/learning/tweaks.itely:3630 (variable) +#. Documentation/cs/learning/fundamental.itely:1352 (variable) +#. Documentation/cs/learning/fundamental.itely:2796 (variable) +#. Documentation/cs/learning/tweaks.itely:3964 (variable) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:83 (variable) +#. Documentation/snippets/anglican-psalm-template.ly:85 (variable) +#. Documentation/snippets/hymn-template.ly:90 (variable) +#. Documentation/snippets/incipit.ly:73 (variable) +#. Documentation/snippets/jazz-combo-template.ly:106 (variable) +#. Documentation/snippets/mensurstriche-layout-bar-lines-between-the-staves.ly:57 (variable) +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:22 (variable) +#. Documentation/snippets/printing-music-with-different-time-signatures.ly:36 (variable) +#. Documentation/snippets/satb-choir-template---four-staves.ly:53 (variable) +#. Documentation/snippets/string-quartet-template-simple.ly:62 (variable) +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:132 (variable) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:36 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:86 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:67 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:70 (variable) +#. Documentation/snippets/vocal-ensemble-template.ly:84 (variable) +msgid "global" +msgstr "global" + +#. Documentation/learning/fundamental.itely:1249 (variable) +#. Documentation/cs/learning/fundamental.itely:1354 (variable) +msgid "SopOneMusic" +msgstr "SopOneMusic" + +#. Documentation/learning/fundamental.itely:1252 (variable) +#. Documentation/cs/learning/fundamental.itely:1357 (variable) +msgid "SopOneLyrics" +msgstr "SopOneLyrics" + +#. Documentation/learning/fundamental.itely:1255 (variable) +#. Documentation/cs/learning/fundamental.itely:1360 (variable) +msgid "SopTwoMusic" +msgstr "SopTwoMusic" + +#. Documentation/learning/fundamental.itely:1258 (variable) +#. Documentation/cs/learning/fundamental.itely:1363 (variable) +msgid "SopTwoLyrics" +msgstr "SopTwoLyrics" + +#. Documentation/learning/fundamental.itely:1265 (context id) +#. Documentation/cs/learning/fundamental.itely:1370 (context id) +msgid "SopOne" +msgstr "SopOne" + +#. Documentation/learning/fundamental.itely:1274 (context id) +#. Documentation/cs/learning/fundamental.itely:1379 (context id) +msgid "SopTwo" +msgstr "SopTwo" + +#. Documentation/learning/fundamental.itely:1306 (variable) +#. Documentation/learning/fundamental.itely:2911 (variable) +#. Documentation/cs/learning/fundamental.itely:1415 (variable) +#. Documentation/cs/learning/fundamental.itely:3155 (variable) +msgid "keyTime" +msgstr "keyTime" + +#. Documentation/learning/fundamental.itely:1308 (variable) +#. Documentation/cs/learning/fundamental.itely:1417 (variable) +msgid "SopMusic" +msgstr "SopMusic" + +#. Documentation/learning/fundamental.itely:1309 (variable) +#. Documentation/learning/tweaks.itely:3633 (variable) +#. Documentation/cs/learning/fundamental.itely:1418 (variable) +#. Documentation/cs/learning/tweaks.itely:3967 (variable) +#. Documentation/snippets/anglican-psalm-template.ly:70 (variable) +#. Documentation/snippets/hymn-template.ly:75 (variable) +msgid "AltoMusic" +msgstr "AltoMusic" + +#. Documentation/learning/fundamental.itely:1310 (variable) +#. Documentation/learning/tweaks.itely:3634 (variable) +#. Documentation/cs/learning/fundamental.itely:1419 (variable) +#. Documentation/cs/learning/tweaks.itely:3968 (variable) +#. Documentation/snippets/anglican-psalm-template.ly:75 (variable) +#. Documentation/snippets/hymn-template.ly:80 (variable) +msgid "TenorMusic" +msgstr "TenorMusic" + +#. Documentation/learning/fundamental.itely:1311 (variable) +#. Documentation/learning/tweaks.itely:3635 (variable) +#. Documentation/cs/learning/fundamental.itely:1420 (variable) +#. Documentation/cs/learning/tweaks.itely:3969 (variable) +#. Documentation/snippets/anglican-psalm-template.ly:80 (variable) +#. Documentation/snippets/hymn-template.ly:85 (variable) +msgid "BassMusic" +msgstr "BassMusic" + +#. Documentation/learning/fundamental.itely:1313 (variable) +#. Documentation/learning/tweaks.itely:3637 (variable) +#. Documentation/cs/learning/fundamental.itely:1422 (variable) +#. Documentation/cs/learning/tweaks.itely:3971 (variable) +msgid "VerseOne" +msgstr "VerseOne" + +#. Documentation/learning/fundamental.itely:1315 (variable) +#. Documentation/learning/tweaks.itely:3641 (variable) +#. Documentation/cs/learning/fundamental.itely:1424 (variable) +#. Documentation/cs/learning/tweaks.itely:3975 (variable) +msgid "VerseTwo" +msgstr "VerseTwo" + +#. Documentation/learning/fundamental.itely:1317 (variable) +#. Documentation/learning/tweaks.itely:3645 (variable) +#. Documentation/cs/learning/fundamental.itely:1426 (variable) +#. Documentation/cs/learning/tweaks.itely:3979 (variable) +msgid "VerseThree" +msgstr "VerseThree" + +#. Documentation/learning/fundamental.itely:1319 (variable) +#. Documentation/learning/tweaks.itely:3649 (variable) +#. Documentation/cs/learning/fundamental.itely:1428 (variable) +#. Documentation/cs/learning/tweaks.itely:3983 (variable) +msgid "VerseFour" +msgstr "VerseFour" + +#. Documentation/learning/fundamental.itely:1326 (context id) +#. Documentation/cs/learning/fundamental.itely:1435 (context id) +msgid "Sop" +msgstr "Sop" + +#. Documentation/learning/fundamental.itely:1327 (context id) +#. Documentation/learning/tweaks.itely:3658 (context id) +#. Documentation/notation/input.itely:1610 (context id) +#. Documentation/cs/learning/fundamental.itely:1436 (context id) +#. Documentation/cs/learning/tweaks.itely:3992 (context id) +#. Documentation/snippets/anglican-psalm-template.ly:110 (context id) +#. Documentation/snippets/chords-headword.ly:52 (variable) +#. Documentation/snippets/hymn-template.ly:105 (context id) +msgid "Alto" +msgstr "Alto" + +#. Documentation/learning/fundamental.itely:1335 (context id) +#. Documentation/learning/tweaks.itely:3666 (context id) +#. Documentation/notation/input.itely:1612 (context id) +#. Documentation/cs/learning/fundamental.itely:1444 (context id) +#. Documentation/cs/learning/tweaks.itely:4000 (context id) +#. Documentation/snippets/anglican-psalm-template.ly:118 (context id) +#. Documentation/snippets/chords-headword.ly:58 (variable) +#. Documentation/snippets/hymn-template.ly:114 (context id) +msgid "Tenor" +msgstr "Tenor" + +# También Líneas divisorias. FVD +#. Documentation/learning/fundamental.itely:1336 (context id) +#. Documentation/learning/tweaks.itely:3667 (context id) +#. Documentation/notation/input.itely:1617 (context id) +#. Documentation/cs/learning/fundamental.itely:1445 (context id) +#. Documentation/cs/learning/tweaks.itely:4001 (context id) +#. Documentation/snippets/anglican-psalm-template.ly:122 (context id) +#. Documentation/snippets/chords-headword.ly:65 (variable) +#. Documentation/snippets/hymn-template.ly:119 (context id) +#. Documentation/snippets/jazz-combo-template.ly:259 (variable) +msgid "Bass" +msgstr "Baix" + +#. Documentation/learning/fundamental.itely:1480 (comment) +#. Documentation/cs/learning/fundamental.itely:1613 (comment) +msgid "start of single compound music expression" +msgstr "inici d'expressió única de música composta" + +#. Documentation/learning/fundamental.itely:1481 (comment) +#. Documentation/cs/learning/fundamental.itely:1614 (comment) +msgid "start of simultaneous staves section" +msgstr "inici de secció de pentagrames simultanis" + +#. Documentation/learning/fundamental.itely:1483 (comment) +#. Documentation/cs/learning/fundamental.itely:1616 (comment) +msgid "create RH staff" +msgstr "crea un pentagrama per a la mà dreta" + +#. Documentation/learning/fundamental.itely:1486 (comment) +#. Documentation/cs/learning/fundamental.itely:1619 (comment) +msgid "create voice for RH notes" +msgstr "crea una veu per a notes de la mà dreta" + +#. Documentation/learning/fundamental.itely:1487 (comment) +#. Documentation/cs/learning/fundamental.itely:1620 (comment) +msgid "start of RH notes" +msgstr "inici de notes de la mà dreta" + +#. Documentation/learning/fundamental.itely:1490 (comment) +#. Documentation/cs/learning/fundamental.itely:1623 (comment) +msgid "end of RH notes" +msgstr "fin de notes de la mà dreta" + +#. Documentation/learning/fundamental.itely:1491 (comment) +#. Documentation/cs/learning/fundamental.itely:1624 (comment) +msgid "end of RH voice" +msgstr "fi de la veu de la mà dreta" + +#. Documentation/learning/fundamental.itely:1492 (comment) +#. Documentation/cs/learning/fundamental.itely:1625 (comment) +msgid "end of RH staff" +msgstr "fi del pentagrama de la mà dreta" + +#. Documentation/learning/fundamental.itely:1493 (comment) +#. Documentation/cs/learning/fundamental.itely:1626 (comment) +msgid "create LH staff; needs two simultaneous voices" +msgstr "crea un pentagrama de la mà esquerra; calen dues veus simultànies" + +#. Documentation/learning/fundamental.itely:1496 (comment) +#. Documentation/cs/learning/fundamental.itely:1629 (comment) +msgid "create LH voice one" +msgstr "crea la veu u de la mà esquerra" + +#. Documentation/learning/fundamental.itely:1498 (comment) +#. Documentation/cs/learning/fundamental.itely:1631 (comment) +msgid "start of LH voice one notes" +msgstr "inici de les notes de la veu u de la mà esquerra" + +#. Documentation/learning/fundamental.itely:1501 (comment) +#. Documentation/cs/learning/fundamental.itely:1634 (comment) +msgid "end of LH voice one notes" +msgstr "fi de la veu u de la mà esquerra" + +#. Documentation/learning/fundamental.itely:1502 (comment) +#. Documentation/cs/learning/fundamental.itely:1635 (comment) +msgid "end of LH voice one" +msgstr "fi de la veu u de la mà esquerra" + +#. Documentation/learning/fundamental.itely:1503 (comment) +#. Documentation/cs/learning/fundamental.itely:1636 (comment) +msgid "create LH voice two" +msgstr "crea la veu dos de la mà esquerra" + +#. Documentation/learning/fundamental.itely:1505 (comment) +#. Documentation/cs/learning/fundamental.itely:1638 (comment) +msgid "start of LH voice two notes" +msgstr "inici de les notes de la veu dos de la mà esquerra" + +#. Documentation/learning/fundamental.itely:1508 (comment) +#. Documentation/cs/learning/fundamental.itely:1641 (comment) +msgid "end of LH voice two notes" +msgstr "fi de les notes de la veu dos de la mà esquerra" + +#. Documentation/learning/fundamental.itely:1509 (comment) +#. Documentation/cs/learning/fundamental.itely:1642 (comment) +msgid "end of LH voice two" +msgstr "fi de la veu to de la mà esquerra" + +#. Documentation/learning/fundamental.itely:1510 (comment) +#. Documentation/cs/learning/fundamental.itely:1643 (comment) +msgid "end of LH staff" +msgstr "fi del pentagrama de la mà esquerra" + +#. Documentation/learning/fundamental.itely:1511 (comment) +#. Documentation/cs/learning/fundamental.itely:1644 (comment) +msgid "end of simultaneous staves section" +msgstr "fi de la secció de pentagrames simultanis" + +#. Documentation/learning/fundamental.itely:1512 (comment) +#. Documentation/cs/learning/fundamental.itely:1645 (comment) +msgid "end of single compound music expression" +msgstr "fi de l'expressió única de música composta" + +#. Documentation/learning/fundamental.itely:1731 (comment) +#. Documentation/cs/learning/fundamental.itely:1894 (comment) +msgid "Wrong!" +msgstr "Malament!" + +# Fuzzy.FVD +#. Documentation/learning/fundamental.itely:1817 (comment) +#. Documentation/learning/fundamental.itely:1994 (comment) +#. Documentation/cs/learning/fundamental.itely:1983 (comment) +#. Documentation/cs/learning/fundamental.itely:2176 (comment) +msgid "make note heads smaller" +msgstr "fes els caps de les notes més petits" + +# Fuzzy.FVD +#. Documentation/learning/fundamental.itely:1820 (comment) +#. Documentation/learning/fundamental.itely:1996 (comment) +#. Documentation/cs/learning/fundamental.itely:1986 (comment) +#. Documentation/cs/learning/fundamental.itely:2178 (comment) +msgid "make note heads larger" +msgstr "fes el cap de les notes més grans" + +#. Documentation/learning/fundamental.itely:1823 (comment) +#. Documentation/learning/fundamental.itely:1998 (comment) +#. Documentation/cs/learning/fundamental.itely:1989 (comment) +#. Documentation/cs/learning/fundamental.itely:2180 (comment) +msgid "return to default size" +msgstr "retorna a la mida predeterminada" + +#. Documentation/learning/fundamental.itely:2292 (variable) +#. Documentation/learning/fundamental.itely:2580 (variable) +#. Documentation/notation/input.itely:1602 (variable) +#. Documentation/cs/learning/fundamental.itely:2501 (variable) +#. Documentation/cs/learning/fundamental.itely:2800 (variable) +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:88 (variable) +msgid "sopranoMusic" +msgstr "sopranoMusic" + +#. Documentation/learning/fundamental.itely:2299 (variable) +#. Documentation/cs/learning/fundamental.itely:2508 (variable) +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:89 (variable) +msgid "sopranoLyrics" +msgstr "sopranoLyrics" + +#. Documentation/learning/fundamental.itely:2303 (variable) +#. Documentation/cs/learning/fundamental.itely:2512 (variable) +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:101 (variable) +msgid "celloMusic" +msgstr "celloMusic" + +#. Documentation/learning/fundamental.itely:2584 (variable) +#. Documentation/cs/learning/fundamental.itely:2804 (variable) +msgid "sopranoWords" +msgstr "sopranoWords" + +#. Documentation/learning/fundamental.itely:2587 (variable) +#. Documentation/notation/input.itely:1603 (variable) +#. Documentation/cs/learning/fundamental.itely:2807 (variable) +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:33 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:98 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:79 (variable) +#. Documentation/snippets/vocal-ensemble-template.ly:96 (variable) +msgid "altoMusic" +msgstr "altoMusic" + +#. Documentation/learning/fundamental.itely:2591 (variable) +#. Documentation/cs/learning/fundamental.itely:2811 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:101 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:82 (variable) +#. Documentation/snippets/vocal-ensemble-template.ly:99 (variable) +msgid "altoWords" +msgstr "altoWords" + +#. Documentation/learning/fundamental.itely:2592 (variable) +#. Documentation/notation/input.itely:1604 (variable) +#. Documentation/cs/learning/fundamental.itely:2812 (variable) +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:39 (variable) +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:94 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:105 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:86 (variable) +#. Documentation/snippets/vocal-ensemble-template.ly:103 (variable) +msgid "tenorMusic" +msgstr "tenorMusic" + +#. Documentation/learning/fundamental.itely:2596 (variable) +#. Documentation/cs/learning/fundamental.itely:2816 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:108 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:89 (variable) +#. Documentation/snippets/vocal-ensemble-template.ly:106 (variable) +msgid "tenorWords" +msgstr "tenorWords" + +#. Documentation/learning/fundamental.itely:2597 (variable) +#. Documentation/notation/input.itely:1605 (variable) +#. Documentation/cs/learning/fundamental.itely:2817 (variable) +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:44 (variable) +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:102 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:112 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:93 (variable) +#. Documentation/snippets/vocal-ensemble-template.ly:110 (variable) +msgid "bassMusic" +msgstr "bassMusic" + +#. Documentation/learning/fundamental.itely:2601 (variable) +#. Documentation/cs/learning/fundamental.itely:2821 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:115 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:96 (variable) +#. Documentation/snippets/vocal-ensemble-template.ly:113 (variable) +msgid "bassWords" +msgstr "bassWords" + +#. Documentation/learning/fundamental.itely:2618 (comment) +#. Documentation/cs/learning/fundamental.itely:2838 (comment) +msgid "combine ChoirStaff and PianoStaff in parallel" +msgstr "combina ChoirStaff i PianoStaff en paral·lel" + +#. Documentation/learning/fundamental.itely:2620 (context id) +#. Documentation/learning/fundamental.itely:2622 (context id) +#. Documentation/cs/learning/fundamental.itely:2840 (context id) +#. Documentation/cs/learning/fundamental.itely:2842 (context id) +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:57 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:127 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:103 (context id) +#. Documentation/snippets/vocal-ensemble-template.ly:124 (context id) +msgid "sopranos" +msgstr "sopranos" + +#. Documentation/learning/fundamental.itely:2630 (context id) +#. Documentation/learning/fundamental.itely:2632 (context id) +#. Documentation/cs/learning/fundamental.itely:2850 (context id) +#. Documentation/cs/learning/fundamental.itely:2852 (context id) +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:61 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:128 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:104 (context id) +#. Documentation/snippets/vocal-ensemble-template.ly:128 (context id) +msgid "altos" +msgstr "alts" + +#. Documentation/learning/fundamental.itely:2640 (context id) +#. Documentation/learning/fundamental.itely:2642 (context id) +#. Documentation/cs/learning/fundamental.itely:2860 (context id) +#. Documentation/cs/learning/fundamental.itely:2862 (context id) +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:70 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:138 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:116 (context id) +#. Documentation/snippets/vocal-ensemble-template.ly:140 (context id) +msgid "tenors" +msgstr "tenors" + +#. Documentation/learning/fundamental.itely:2650 (context id) +#. Documentation/learning/fundamental.itely:2652 (context id) +#. Documentation/cs/learning/fundamental.itely:2870 (context id) +#. Documentation/cs/learning/fundamental.itely:2872 (context id) +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:74 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:139 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:117 (context id) +#. Documentation/snippets/vocal-ensemble-template.ly:144 (context id) +msgid "basses" +msgstr "baixos" + +#. Documentation/learning/fundamental.itely:2660 (comment) +#. Documentation/cs/learning/fundamental.itely:2880 (comment) +msgid "end ChoirStaff" +msgstr "fi del ChoirStaff" + +#. Documentation/learning/fundamental.itely:2912 (variable) +#. Documentation/cs/learning/fundamental.itely:3156 (variable) +msgid "ManualOneVoiceOneMusic" +msgstr "ManualOneVoiceOneMusic" + +#. Documentation/learning/fundamental.itely:2916 (variable) +#. Documentation/cs/learning/fundamental.itely:3160 (variable) +msgid "ManualOneVoiceTwoMusic" +msgstr "ManualOneVoiceTwoMusic" + +#. Documentation/learning/fundamental.itely:2920 (variable) +#. Documentation/cs/learning/fundamental.itely:3164 (variable) +msgid "ManualTwoMusic" +msgstr "ManualTwoMusic" + +#. Documentation/learning/fundamental.itely:2924 (variable) +#. Documentation/cs/learning/fundamental.itely:3168 (variable) +msgid "PedalOrganMusic" +msgstr "PedalOrganMusic" + +#. Documentation/learning/fundamental.itely:2930 (comment) +#. Documentation/cs/learning/fundamental.itely:3174 (comment) +msgid "PianoStaff and Pedal Staff must be simultaneous" +msgstr "PianoStaff i PedalStaff han de ser simultanis" + +#. Documentation/learning/fundamental.itely:2932 (context id) +#. Documentation/cs/learning/fundamental.itely:3176 (context id) +msgid "ManualOne" +msgstr "ManualOne" + +#. Documentation/learning/fundamental.itely:2933 (comment) +msgid "set key and time signature" +msgstr "estableix l'armadura i el temps del compàs" + +#. Documentation/learning/fundamental.itely:2943 (comment) +#. Documentation/cs/learning/fundamental.itely:3187 (comment) +msgid "end ManualOne Staff context" +msgstr "fi del context de pentagrama ManualOne" + +#. Documentation/learning/fundamental.itely:2944 (context id) +#. Documentation/cs/learning/fundamental.itely:3188 (context id) +msgid "ManualTwo" +msgstr "ManualTwo" + +#. Documentation/learning/fundamental.itely:2953 (comment) +#. Documentation/cs/learning/fundamental.itely:3197 (comment) +msgid "end ManualTwo Staff context" +msgstr "fi del context de pentagrama ManualTwo" + +#. Documentation/learning/fundamental.itely:2954 (comment) +#. Documentation/cs/learning/fundamental.itely:3198 (comment) +msgid "end PianoStaff context" +msgstr "fi del context PianoStaff" + +#. Documentation/learning/fundamental.itely:2955 (context id) +#. Documentation/cs/learning/fundamental.itely:3199 (context id) +msgid "PedalOrgan" +msgstr "PedalOrgan" + +#. Documentation/learning/fundamental.itely:2961 (comment) +#. Documentation/cs/learning/fundamental.itely:3205 (comment) +msgid "end PedalOrgan Staff context" +msgstr "fi del context de pentagrama PedalOrgan" + +#. Documentation/learning/fundamental.itely:2963 (comment) +#. Documentation/cs/learning/fundamental.itely:3207 (comment) +msgid "end Score context" +msgstr "fi del context Score" + +#. Documentation/learning/fundamental.itely:2979 (variable) +#. Documentation/cs/learning/fundamental.itely:3224 (variable) +msgid "hornNotes" +msgstr "hornNotes" + +#. Documentation/learning/fundamental.itely:2991 (variable) +#. Documentation/cs/learning/fundamental.itely:3237 (variable) +msgid "fragmentA" +msgstr "fragmentA" + +#. Documentation/learning/fundamental.itely:2992 (variable) +#. Documentation/cs/learning/fundamental.itely:3238 (variable) +msgid "fragmentB" +msgstr "fragmentB" + +#. Documentation/learning/fundamental.itely:3011 (variable) +#. Documentation/cs/learning/fundamental.itely:3257 (variable) +msgid "dolce" +msgstr "dolce" + +#. Documentation/learning/fundamental.itely:3014 (variable) +#. Documentation/cs/learning/fundamental.itely:3259 (variable) +msgid "fthenp" +msgstr "fthenp" + +#. @node in Documentation/learning/fundamental.itely +#. @chapter in Documentation/learning/fundamental.itely +msgid "Fundamental concepts" +msgstr "Conceptes fonamentals" + +#. @node in Documentation/learning/fundamental.itely +#. @section in Documentation/learning/fundamental.itely +msgid "How LilyPond input files work" +msgstr "Com funcionen els fitxers d'entrada del LilyPond" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Introduction to the LilyPond file structure" +msgstr "Introducció a l'estructura dels fitxers del LilyPond" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Score is a (single) compound musical expression" +msgstr "La partitura és una (única) expressió musical composta" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Nesting music expressions" +msgstr "Niuat d'expressions musicals" + +#. @rglos in Documentation/learning/fundamental.itely +#. @rglos in Documentation/learning/tweaks.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/tweaks.itely +msgid "ossia" +msgstr "ossia" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "On the un-nestedness of brackets and ties" +msgstr "Quant al no niuat de claudàtors i lligadures d'unió" + +#. @node in Documentation/learning/fundamental.itely +#. @section in Documentation/learning/fundamental.itely +msgid "Voices contain music" +msgstr "Les veus contenen música" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "I'm hearing Voices" +msgstr "Sento veus" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Explicitly instantiating voices" +msgstr "Creació explícita d'instància de veus" + +#. @subsubheading in Documentation/learning/fundamental.itely +msgid "Note columns" +msgstr "Columnes de notes" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Voices and vocals" +msgstr "Veus i música vocal" + +#. @node in Documentation/learning/fundamental.itely +#. @section in Documentation/learning/fundamental.itely +msgid "Contexts and engravers" +msgstr "Contextos i gravadors" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Contexts explained" +msgstr "Els contextos explicats" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Creating contexts" +msgstr "Creació de contextos" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Engravers explained" +msgstr "Els gravadors explicats" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Modifying context properties" +msgstr "Modificació de propietats dels contextos" + +#. @subsubheading in Documentation/learning/fundamental.itely +msgid "Setting context properties with @code{\\\\with}" +msgstr "Establiment de les propietats de context amb @code{\\\\with}" + +#. @subsubheading in Documentation/learning/fundamental.itely +msgid "Setting context properties with @code{\\\\context}" +msgstr "Establiment de propietats de context amb @code{\\\\context}" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Adding and removing engravers" +msgstr "Addicció i supressió de gravadors" + +#. @subsubheading in Documentation/learning/fundamental.itely +msgid "Changing a single context" +msgstr "Canvi d'un context únic" + +#. @rglos in Documentation/learning/fundamental.itely +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. @rglos in Documentation/cs/learning/fundamental.itely +msgid "ambitus" +msgstr "tessitura" + +#. @subsubheading in Documentation/learning/fundamental.itely +msgid "Changing all contexts of the same type" +msgstr "Canvi de tots els contextos del mateix tipus" + +#. @node in Documentation/learning/fundamental.itely +#. @section in Documentation/learning/fundamental.itely +msgid "Extending the templates" +msgstr "Extensió de les plantilles" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Soprano and cello" +msgstr "Soprano i violoncel" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Four-part SATB vocal score" +msgstr "Partitura vocal a quatre veus SATB" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Building a score from scratch" +msgstr "Construcció d'una partitura des de zero" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Saving typing with variables and functions" +msgstr "Estalvi d'escriptura amb variables i funcions" + +#. @node in Documentation/learning/fundamental.itely +#. @subsection in Documentation/learning/fundamental.itely +msgid "Scores and parts" +msgstr "Partitures i parts" + +#. Documentation/learning/tweaks.itely:604 (comment) +#. Documentation/learning/tweaks.itely:742 (comment) +#. Documentation/cs/learning/tweaks.itely:680 (comment) +#. Documentation/cs/learning/tweaks.itely:825 (comment) +msgid "Increase thickness of all following slurs from 1.2 to 5.0" +msgstr "Augment del gruix de totes les lligadures següents d'1.2 a 5.0" + +#. Documentation/learning/tweaks.itely:674 (comment) +#. Documentation/learning/tweaks.itely:714 (comment) +#. Documentation/learning/tweaks.itely:717 (comment) +#. Documentation/cs/learning/tweaks.itely:755 (comment) +#. Documentation/cs/learning/tweaks.itely:797 (comment) +#. Documentation/cs/learning/tweaks.itely:800 (comment) +msgid "Increase thickness of immediately following slur only" +msgstr "Augmenta el gruix únicament de la lligadura que segueix immediatament" + +#. Documentation/learning/tweaks.itely:746 (comment) +#. Documentation/cs/learning/tweaks.itely:829 (comment) +msgid "Revert thickness of all following slurs to default of 1.2" +msgstr "Reverteix el gruix de totes les lligadures següents al valor predeterminat de 1.2" + +#. Documentation/learning/tweaks.itely:1423 (comment) +#. Documentation/cs/learning/tweaks.itely:1584 (comment) +msgid "Don't print clefs in this staff" +msgstr "No imprimeixis les claus a aquest pentagrama" + +#. Documentation/learning/tweaks.itely:1425 (comment) +#. Documentation/cs/learning/tweaks.itely:1586 (comment) +msgid "Don't print time signatures in this staff" +msgstr "No imprimeixis el compàs a aquest pentagrama" + +#. Documentation/learning/tweaks.itely:1489 (comment) +#. Documentation/cs/learning/tweaks.itely:1657 (comment) +msgid "Reduce all font sizes by ~24%" +msgstr "Redueix totes les mides dels tipus de lletra un 24%" + +#. Documentation/learning/tweaks.itely:1556 (comment) +#. Documentation/cs/learning/tweaks.itely:1731 (comment) +msgid "Reduce stem length and line spacing to match" +msgstr "Redueix la longitud de les vírgules i l'espaiat de la línia perquè concordi" + +#. Documentation/learning/tweaks.itely:2007 (comment) +#. Documentation/learning/tweaks.itely:2057 (comment) +#. Documentation/cs/learning/tweaks.itely:2207 (comment) +#. Documentation/cs/learning/tweaks.itely:2285 (comment) +msgid "Set details for later Text Spanner" +msgstr "Estableix el detalls per a l'extensor posterior de text" + +#. Documentation/learning/tweaks.itely:2010 (comment) +#. Documentation/learning/tweaks.itely:2060 (comment) +#. Documentation/cs/learning/tweaks.itely:2210 (comment) +#. Documentation/cs/learning/tweaks.itely:2288 (comment) +msgid "Place dynamics above staff" +msgstr "Posa la dinàmica a sobre del pentagrama" + +# fuzzy. FVD +#. Documentation/learning/tweaks.itely:2012 (comment) +#. Documentation/learning/tweaks.itely:2064 (comment) +#. Documentation/cs/learning/tweaks.itely:2212 (comment) +#. Documentation/cs/learning/tweaks.itely:2292 (comment) +msgid "Start Ottava Bracket" +msgstr "Comença un claudator d'octava" + +#. Documentation/learning/tweaks.itely:2015 (comment) +#. Documentation/cs/learning/tweaks.itely:2215 (comment) +msgid "Add Dynamic Text and hairpin" +msgstr "Afegeix un indicador de dinàmica i inicia un regulador" + +#. Documentation/learning/tweaks.itely:2018 (comment) +#. Documentation/learning/tweaks.itely:2071 (comment) +#. Documentation/cs/learning/tweaks.itely:2218 (comment) +#. Documentation/cs/learning/tweaks.itely:2299 (comment) +msgid "Add Text Script" +msgstr "Afegeix un fragment de text" + +#. Documentation/learning/tweaks.itely:2021 (comment) +#. Documentation/cs/learning/tweaks.itely:2221 (comment) +msgid "Add Dynamic Text and terminate hairpin" +msgstr "Afegeix un indicador de dinàmica i finalitza un regulador" + +#. Documentation/learning/tweaks.itely:2023 (comment) +#. Documentation/learning/tweaks.itely:2076 (comment) +#. Documentation/cs/learning/tweaks.itely:2223 (comment) +#. Documentation/cs/learning/tweaks.itely:2304 (comment) +msgid "Stop Ottava Bracket" +msgstr "Atura el claudator d'octava" + +#. Documentation/learning/tweaks.itely:2062 (comment) +#. Documentation/cs/learning/tweaks.itely:2290 (comment) +msgid "Place following Ottava Bracket below Text Spanners" +msgstr "Posa el claudator d'octava següent a sota dels extensors de text" + +#. Documentation/learning/tweaks.itely:2067 (comment) +#. Documentation/learning/tweaks.itely:2074 (comment) +#. Documentation/cs/learning/tweaks.itely:2295 (comment) +#. Documentation/cs/learning/tweaks.itely:2302 (comment) +msgid "Add Dynamic Text" +msgstr "Afegeix indicador textual de dinàmica" + +#. Documentation/learning/tweaks.itely:2069 (comment) +#. Documentation/cs/learning/tweaks.itely:2297 (comment) +msgid "Add Dynamic Line Spanner" +msgstr "Afegeix un extensor de línia d'indicació de dinàmica" + +#. Documentation/learning/tweaks.itely:2156 (comment) +#. Documentation/cs/learning/tweaks.itely:2380 (comment) +msgid "Cause notes to space out to accommodate text" +msgstr "Fes que les notes estiguin més espaiades per acomodar el text" + +#. Documentation/learning/tweaks.itely:2179 (comment) +#. Documentation/cs/learning/tweaks.itely:2406 (comment) +msgid "This markup is short enough to fit without collision" +msgstr "Aquesta disposició de text és suficientment curt per ajustar-se sense provocar col·lisions" + +#. Documentation/learning/tweaks.itely:2183 (comment) +#. Documentation/cs/learning/tweaks.itely:2410 (comment) +msgid "This is too long to fit, so it is displaced upwards" +msgstr "Aquest text és molt llarga, així que es reubicarà cap amunt" + +#. Documentation/learning/tweaks.itely:2187 (comment) +#. Documentation/learning/tweaks.itely:2192 (comment) +#. Documentation/cs/learning/tweaks.itely:2414 (comment) +#. Documentation/cs/learning/tweaks.itely:2419 (comment) +msgid "Turn off collision avoidance" +msgstr "Deshabilita el detector de col·lisions" + +#. Documentation/learning/tweaks.itely:2194 (comment) +#. Documentation/cs/learning/tweaks.itely:2421 (comment) +msgid "and turn on textLengthOn" +msgstr "i habilita textLengthOn" + +#. Documentation/learning/tweaks.itely:2195 (comment) +#. Documentation/cs/learning/tweaks.itely:2422 (comment) +msgid "Spaces at end are honored" +msgstr "Es respecten els espais al final" + +#. Documentation/learning/tweaks.itely:2302 (comment) +#. Documentation/cs/learning/tweaks.itely:2537 (comment) +msgid "Extend width by 1 staff space" +msgstr "Estén l'amplada en un espai de pentagrama" + +#. Documentation/learning/tweaks.itely:2582 (comment) +#. Documentation/cs/learning/tweaks.itely:2863 (comment) +msgid "This will not work, see below" +msgstr "Això no funcionarà, mireu a sota" + +#. Documentation/learning/tweaks.itely:2586 (comment) +#. Documentation/cs/learning/tweaks.itely:2867 (comment) +msgid "This works" +msgstr "Això funcionarà" + +#. Documentation/learning/tweaks.itely:2622 (variable) +#. Documentation/cs/learning/tweaks.itely:2909 (variable) +msgid "sesquisharp" +msgstr "sesqui sostingut" + +#. Documentation/learning/tweaks.itely:2625 (comment) +#. Documentation/cs/learning/tweaks.itely:2912 (comment) +msgid "This prints a sesquisharp but the spacing is too small" +msgstr "Això imprimeix un sesqui sostingut però l'espaiat és massa petit" + +#. Documentation/learning/tweaks.itely:2630 (comment) +#. Documentation/cs/learning/tweaks.itely:2917 (comment) +msgid "This improves the spacing" +msgstr "Això millora l'espaiat" + +#. Documentation/learning/tweaks.itely:2670 (comment) +#. Documentation/cs/learning/tweaks.itely:2961 (comment) +msgid "Extend width by 1 unit" +msgstr "Augmenta l'amplada en una unitat" + +#. Documentation/learning/tweaks.itely:2672 (comment) +#. Documentation/cs/learning/tweaks.itely:2963 (comment) +msgid "Align dynamics to a base line 2 units above staff" +msgstr "Alinea la dinàmica a una línia de base 2 unitats a sobre del pentagrama" + +#. Documentation/learning/tweaks.itely:3015 (variable) +#. Documentation/learning/tweaks.itely:3072 (variable) +#. Documentation/learning/tweaks.itely:3142 (variable) +#. Documentation/learning/tweaks.itely:3295 (variable) +#. Documentation/learning/tweaks.itely:3365 (variable) +#. Documentation/cs/learning/tweaks.itely:3319 (variable) +#. Documentation/cs/learning/tweaks.itely:3379 (variable) +#. Documentation/cs/learning/tweaks.itely:3453 (variable) +#. Documentation/cs/learning/tweaks.itely:3537 (variable) +#. Documentation/cs/learning/tweaks.itely:3611 (variable) +#. Documentation/cs/learning/tweaks.itely:3681 (variable) +msgid "rhMusic" +msgstr "rhMusic" + +#. Documentation/learning/tweaks.itely:3021 (comment) +#. Documentation/learning/tweaks.itely:3078 (comment) +#. Documentation/learning/tweaks.itely:3150 (comment) +#. Documentation/learning/tweaks.itely:3305 (comment) +#. Documentation/learning/tweaks.itely:3375 (comment) +#. Documentation/cs/learning/tweaks.itely:3324 (comment) +#. Documentation/cs/learning/tweaks.itely:3385 (comment) +#. Documentation/cs/learning/tweaks.itely:3461 (comment) +#. Documentation/cs/learning/tweaks.itely:3547 (comment) +#. Documentation/cs/learning/tweaks.itely:3621 (comment) +#. Documentation/cs/learning/tweaks.itely:3691 (comment) +msgid "Start polyphonic section of four voices" +msgstr "Inicia una secció polifònica de quatre veus" + +#. Documentation/learning/tweaks.itely:3023 (comment) +#. Documentation/learning/tweaks.itely:3037 (comment) +#. Documentation/learning/tweaks.itely:3080 (comment) +#. Documentation/learning/tweaks.itely:3094 (comment) +#. Documentation/learning/tweaks.itely:3152 (comment) +#. Documentation/learning/tweaks.itely:3166 (comment) +#. Documentation/learning/tweaks.itely:3307 (comment) +#. Documentation/learning/tweaks.itely:3326 (comment) +#. Documentation/learning/tweaks.itely:3377 (comment) +#. Documentation/learning/tweaks.itely:3405 (comment) +#. Documentation/cs/learning/tweaks.itely:3326 (comment) +#. Documentation/cs/learning/tweaks.itely:3340 (comment) +#. Documentation/cs/learning/tweaks.itely:3387 (comment) +#. Documentation/cs/learning/tweaks.itely:3401 (comment) +#. Documentation/cs/learning/tweaks.itely:3463 (comment) +#. Documentation/cs/learning/tweaks.itely:3477 (comment) +#. Documentation/cs/learning/tweaks.itely:3549 (comment) +#. Documentation/cs/learning/tweaks.itely:3565 (comment) +#. Documentation/cs/learning/tweaks.itely:3623 (comment) +#. Documentation/cs/learning/tweaks.itely:3641 (comment) +#. Documentation/cs/learning/tweaks.itely:3693 (comment) +#. Documentation/cs/learning/tweaks.itely:3720 (comment) +msgid "continuation of main voice" +msgstr "continuació de la veu principal" + +#. Documentation/learning/tweaks.itely:3041 (variable) +#. Documentation/learning/tweaks.itely:3098 (variable) +#. Documentation/learning/tweaks.itely:3170 (variable) +#. Documentation/learning/tweaks.itely:3330 (variable) +#. Documentation/learning/tweaks.itely:3409 (variable) +#. Documentation/cs/learning/tweaks.itely:3344 (variable) +#. Documentation/cs/learning/tweaks.itely:3405 (variable) +#. Documentation/cs/learning/tweaks.itely:3481 (variable) +#. Documentation/cs/learning/tweaks.itely:3569 (variable) +#. Documentation/cs/learning/tweaks.itely:3645 (variable) +#. Documentation/cs/learning/tweaks.itely:3724 (variable) +msgid "lhMusic" +msgstr "lhMusic" + +#. Documentation/learning/tweaks.itely:3050 (context id) +#. Documentation/learning/tweaks.itely:3107 (context id) +#. Documentation/learning/tweaks.itely:3179 (context id) +#. Documentation/learning/tweaks.itely:3339 (context id) +#. Documentation/learning/tweaks.itely:3418 (context id) +#. Documentation/notation/input.itely:1623 (context id) +#. Documentation/cs/learning/tweaks.itely:3353 (context id) +#. Documentation/cs/learning/tweaks.itely:3414 (context id) +#. Documentation/cs/learning/tweaks.itely:3490 (context id) +#. Documentation/cs/learning/tweaks.itely:3578 (context id) +#. Documentation/cs/learning/tweaks.itely:3654 (context id) +#. Documentation/cs/learning/tweaks.itely:3733 (context id) +#. Documentation/snippets/repeats-headword.ly:28 (context id) +#. Documentation/snippets/simultaneous-headword.ly:51 (comment) +msgid "RH" +msgstr "RH" + +#. Documentation/learning/tweaks.itely:3054 (context id) +#. Documentation/learning/tweaks.itely:3111 (context id) +#. Documentation/learning/tweaks.itely:3183 (context id) +#. Documentation/learning/tweaks.itely:3343 (context id) +#. Documentation/learning/tweaks.itely:3422 (context id) +#. Documentation/notation/input.itely:1629 (context id) +#. Documentation/cs/learning/tweaks.itely:3357 (context id) +#. Documentation/cs/learning/tweaks.itely:3418 (context id) +#. Documentation/cs/learning/tweaks.itely:3494 (context id) +#. Documentation/cs/learning/tweaks.itely:3582 (context id) +#. Documentation/cs/learning/tweaks.itely:3658 (context id) +#. Documentation/cs/learning/tweaks.itely:3737 (context id) +#. Documentation/snippets/repeats-headword.ly:90 (context id) +#. Documentation/snippets/text-headword.ly:129 (comment) +msgid "LH" +msgstr "LH" + +#. Documentation/learning/tweaks.itely:3310 (comment) +#. Documentation/learning/tweaks.itely:3383 (comment) +msgid "Move the c2 out of the main note column" +msgstr "Treu el Do blanca fora de la columna princal de notes" + +#. Documentation/learning/tweaks.itely:3311 (comment) +#. Documentation/learning/tweaks.itely:3384 (comment) +msgid "so the merge will work" +msgstr "perquè la fusió funcioni" + +#. Documentation/learning/tweaks.itely:3316 (comment) +#. Documentation/learning/tweaks.itely:3391 (comment) +#. Documentation/cs/learning/tweaks.itely:3631 (comment) +#. Documentation/cs/learning/tweaks.itely:3706 (comment) +msgid "Stem on the d2 must be down to permit merging" +msgstr "La vírgula del Re blanca ha d'anar cap abaix perquè es pugui permetre la fusió" + +#. Documentation/learning/tweaks.itely:3381 (comment) +#. Documentation/cs/learning/tweaks.itely:3697 (comment) +msgid "Reposition the c2 to the right of the merged note" +msgstr "Mou el Do blanca a la dreta de la nota fusionada" + +#. Documentation/learning/tweaks.itely:3393 (comment) +#. Documentation/cs/learning/tweaks.itely:3708 (comment) +msgid "Stem on the d2 should be invisible" +msgstr "La vírgula del Re blanca ha de ser invisible" + +#. Documentation/learning/tweaks.itely:3530 (comment) +#. Documentation/learning/tweaks.itely:3552 (comment) +#. Documentation/cs/learning/tweaks.itely:3859 (comment) +#. Documentation/cs/learning/tweaks.itely:3878 (comment) +msgid "Visible tempo marking" +msgstr "Indicació metronòmica visible" + +#. Documentation/learning/tweaks.itely:3534 (comment) +#. Documentation/learning/tweaks.itely:3556 (comment) +#. Documentation/cs/learning/tweaks.itely:3863 (comment) +#. Documentation/cs/learning/tweaks.itely:3882 (comment) +msgid "Invisible tempo marking to lengthen fermata in MIDI" +msgstr "Indicació metronòmica invisible per allargar el calderó al MIDI" + +#. Documentation/learning/tweaks.itely:3537 (comment) +#. Documentation/learning/tweaks.itely:3559 (comment) +#. Documentation/cs/learning/tweaks.itely:3866 (comment) +#. Documentation/cs/learning/tweaks.itely:3885 (comment) +msgid "New tempo for next section" +msgstr "Nou tempo per a la secció següent" + +#. Documentation/learning/tweaks.itely:3620 (variable) +#. Documentation/cs/learning/tweaks.itely:3955 (variable) +msgid "emphasize" +msgstr "emfatitza" + +#. Documentation/learning/tweaks.itely:3625 (variable) +#. Documentation/cs/learning/tweaks.itely:3959 (variable) +msgid "normal" +msgstr "normal" + +#. Documentation/learning/tweaks.itely:3632 (variable) +#. Documentation/cs/learning/tweaks.itely:3966 (variable) +#. Documentation/snippets/anglican-psalm-template.ly:65 (variable) +#. Documentation/snippets/hymn-template.ly:70 (variable) +msgid "SopranoMusic" +msgstr "SopranoMusic" + +#. Documentation/learning/tweaks.itely:3657 (context id) +#. Documentation/notation/input.itely:1608 (context id) +#. Documentation/cs/learning/tweaks.itely:3991 (context id) +#. Documentation/snippets/anglican-psalm-template.ly:106 (context id) +#. Documentation/snippets/chords-headword.ly:44 (variable) +#. Documentation/snippets/hymn-template.ly:100 (context id) +msgid "Soprano" +msgstr "Soprano" + +#. Documentation/learning/tweaks.itely:3688 (variable) +#. Documentation/cs/learning/tweaks.itely:4024 (variable) +msgid "mpdolce" +msgstr "mpdolce" + +#. Documentation/learning/tweaks.itely:3696 (variable) +#. Documentation/cs/learning/tweaks.itely:4031 (variable) +msgid "inst" +msgstr "inst" + +#. Documentation/learning/tweaks.itely:4157 (comment) +#. Documentation/cs/learning/tweaks.itely:4557 (comment) +msgid "Arrange to obtain color from color-notehead procedure" +msgstr "Organitza-ho per obtenir color a partir del procediment color-notehead" + +#. @node in Documentation/learning/tweaks.itely +#. @chapter in Documentation/learning/tweaks.itely +msgid "Tweaking output" +msgstr "Fent apanyos amb la sortida" + +#. @node in Documentation/learning/tweaks.itely +#. @section in Documentation/learning/tweaks.itely +msgid "Tweaking basics" +msgstr "Conceptes bàsics per fer apanyos" + +# ?? FVD +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Introduction to tweaks" +msgstr "Introducció per fer apanyos" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Objects and interfaces" +msgstr "Objectes i interfícies" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Naming conventions of objects and properties" +msgstr "Convencions per anomenar objects i propietats" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Tweaking methods" +msgstr "Mètodes per fer apanyos" + +#. @node in Documentation/learning/tweaks.itely +#. @section in Documentation/learning/tweaks.itely +msgid "The Internals Reference manual" +msgstr "Manual de referència del funcionament intern" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Properties of layout objects" +msgstr "Propietats dels objectes de format" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "Finding the context" +msgstr "Cerca del context" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "Overriding once only" +msgstr "Anul·lació una única vegada" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "Reverting" +msgstr "Reversió" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Properties found in interfaces" +msgstr "Propietats de les interfícies" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "Specifying the context in lyric mode" +msgstr "Especificació del context en mode lletra" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Types of properties" +msgstr "Tipus de propietats" + +#. @node in Documentation/learning/tweaks.itely +#. @section in Documentation/learning/tweaks.itely +msgid "Appearance of objects" +msgstr "Aparença dels objectes" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Visibility and color of objects" +msgstr "Visibilitat i color dels objectes" + +#. @subheading in Documentation/learning/tweaks.itely +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "stencil" +msgstr "patró" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "break-visibility" +msgstr "break-visibility" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "transparent" +msgstr "transparent" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "color" +msgstr "color" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Size of objects" +msgstr "Mida dels objectes" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Length and thickness of objects" +msgstr "Longitud i gruix dels objectes" + +#. @node in Documentation/learning/tweaks.itely +#. @section in Documentation/learning/tweaks.itely +msgid "Placement of objects" +msgstr "Col·locació dels objectes" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Automatic behavior" +msgstr "Comportament automàtic" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Within-staff objects" +msgstr "Objectes interiors al pentagrama" + +#. @unnumberedsubsubsec in Documentation/learning/tweaks.itely +msgid "Fingering" +msgstr "Digitacions" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Outside-staff objects" +msgstr "Objectes fora del pentagrama" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "\\\\textLengthOn" +msgstr "\\\\textLengthOn" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "Grob sizing" +msgstr "Escalat d'objecte gràfic" + +#. @node in Documentation/learning/tweaks.itely +#. @section in Documentation/learning/tweaks.itely +msgid "Collisions of objects" +msgstr "Col·lisions d'objectes" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Moving objects" +msgstr "Trasllat d'objectes" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Fixing overlapping notation" +msgstr "Correcció de notació solapada" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "padding property" +msgstr "propietat padding" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "right-padding" +msgstr "right-padding" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "staff-padding property" +msgstr "propietat de staff-padding" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "self-alignment-X property" +msgstr "propietat de self-alignment-X" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "staff-position property" +msgstr "propietat staff-position" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "extra-offset property" +msgstr "propietat extra-offset" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "positions property" +msgstr "propietat positions" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "force-hshift property" +msgstr "propietat force-hshift" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Real music example" +msgstr "Exemple de música real" + +#. @node in Documentation/learning/tweaks.itely +#. @section in Documentation/learning/tweaks.itely +msgid "Further tweaking" +msgstr "Apanyos addicionals" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Other uses for tweaks" +msgstr "Altres aplicacions pels apanyos" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "Tying notes across voices" +msgstr "Notes unides per lligadures a través de veus" + +#. @subheading in Documentation/learning/tweaks.itely +msgid "Simulating a fermata in MIDI" +msgstr "Simulació d'un calderó al MIDI" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Using variables for tweaks" +msgstr "Ús de variables per fer apanyos" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Style sheets" +msgstr "Fulls d'estil" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Other sources of information" +msgstr "Altres fonts d'informació" + +#. @node in Documentation/learning/tweaks.itely +#. @subsection in Documentation/learning/tweaks.itely +msgid "Advanced tweaks with Scheme" +msgstr "Apanyos avançats amb el Scheme" + +#. @node in Documentation/learning/templates.itely +#. @appendix in Documentation/learning/templates.itely +msgid "Templates" +msgstr "Plantilles" + +#. @node in Documentation/learning/templates.itely +#. @appendixsec in Documentation/learning/templates.itely +msgid "Single staff" +msgstr "Pentagrama únic" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Notes only" +msgstr "Sols notes" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Notes and lyrics" +msgstr "Notes i lletra" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Notes and chords" +msgstr "Notes i acords" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Notes, lyrics, and chords." +msgstr "Notes, lletres i acords" + +#. @node in Documentation/learning/templates.itely +#. @appendixsec in Documentation/learning/templates.itely +msgid "Piano templates" +msgstr "Plantilles de piano" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Solo piano" +msgstr "Piano sol" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Piano and melody with lyrics" +msgstr "Piano i melodia amb lletra" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Piano centered lyrics" +msgstr "Piano amb lletra centrada" + +#. @node in Documentation/learning/templates.itely +#. @appendixsec in Documentation/learning/templates.itely +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "String quartet" +msgstr "Quartet de corda" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "String quartet parts" +msgstr "Particelles de quartet de corda" + +#. @node in Documentation/learning/templates.itely +#. @appendixsec in Documentation/learning/templates.itely +msgid "Vocal ensembles" +msgstr "Conjunts vocals" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "SATB vocal score" +msgstr "Partitura vocal SATB" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "SATB vocal score and automatic piano reduction" +msgstr "Partitura vocal SATB i reducció per a piano automàtica" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "SATB with aligned contexts" +msgstr "SATB amb contextos alineats" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "SATB on four staves" +msgstr "SATB sobre quatre pentagrames" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Solo verse and two-part refrain" +msgstr "Estrofa per a solista i tornadas de dues parts" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Hymn tunes" +msgstr "Melodies d'himnes" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Psalms" +msgstr "Salms" + +#. @node in Documentation/learning/templates.itely +#. @appendixsec in Documentation/learning/templates.itely +msgid "Orchestral templates" +msgstr "Plantilles orquestrals" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Orchestra, choir and piano" +msgstr "Orquestra, cor i piano" + +#. @node in Documentation/learning/templates.itely +#. @appendixsec in Documentation/learning/templates.itely +msgid "Ancient notation templates" +msgstr "Plantilles per a notació antiga" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Transcription of mensural music" +msgstr "Transcripció de música mensural" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Gregorian transcription template" +msgstr "Plantilla per a transcripció de cant gregorià" + +#. @node in Documentation/learning/templates.itely +#. @appendixsec in Documentation/learning/templates.itely +msgid "Other templates" +msgstr "Otres plantilles" + +#. @appendixsubsec in Documentation/learning/templates.itely +msgid "Jazz combo" +msgstr "Combo de jazz" + +#. @node in Documentation/music-glossary.tely +#. @chapter in Documentation/music-glossary.tely +msgid "Musical terms A-Z" +msgstr "Termes musicals de l'A a la Z" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/notation/changing-defaults.itely:453 (context id) +#. Documentation/notation/changing-defaults.itely:459 (context id) +#. Documentation/notation/changing-defaults.itely:467 (context id) +#. Documentation/notation/changing-defaults.itely:469 (context id) +msgid "A" +msgstr "A" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "a due" +msgstr "a due" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "accelerando" +msgstr "accelerando" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "accent" +msgstr "accent" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "accessory" +msgstr "accessori" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "adagio" +msgstr "adagio" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "al niente" +msgstr "al niente" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "alla breve" +msgstr "alla breve" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "allegro" +msgstr "allegro" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "alteration" +msgstr "alteració" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/snippets/jazz-combo-template.ly:130 (variable) +#. Documentation/snippets/satb-choir-template---four-staves.ly:87 (context id) +msgid "alto" +msgstr "alto" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "alto clef" +msgstr "clau de do en tercera línia" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "ancient minor scale" +msgstr "escala menor antiga" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "andante" +msgstr "andante" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "arpeggio" +msgstr "arpegio" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "ascending interval" +msgstr "interval ascendent" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "augmentation" +msgstr "augmentació" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "augmented interval" +msgstr "interval augmentat" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "autograph" +msgstr "autògraf" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/notation/changing-defaults.itely:454 (context id) +#. Documentation/notation/changing-defaults.itely:463 (context id) +#. Documentation/notation/changing-defaults.itely:468 (context id) +msgid "B" +msgstr "B" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "backfall" +msgstr "appoggiatura de caiguda" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "bar" +msgstr "compàs" + +# También Líneas divisorias. FVD +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "bar line" +msgstr "barra de compàs" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "baritone" +msgstr "baríton" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "baritone clef" +msgstr "clau de do en quinta línia" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly:49 (variable) +#. Documentation/snippets/fretted-headword.ly:108 (variable) +#. Documentation/snippets/jazz-combo-template.ly:263 (variable) +#. Documentation/snippets/jazz-combo-template.ly:311 (context id) +#. Documentation/snippets/satb-choir-template---four-staves.ly:101 (context id) +msgid "bass" +msgstr "baix" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "bass clef" +msgstr "clau de fa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "beat" +msgstr "puls" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "beat repeat" +msgstr "repetició de pulsos" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "bind" +msgstr "lligadura d'unió" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "bracket" +msgstr "claudàtor" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "brass" +msgstr "metalls" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "breath mark" +msgstr "marca de respiració" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "breve" +msgstr "breve" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "C" +msgstr "Do" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "C clef" +msgstr "Clau de do" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "cadence" +msgstr "cadència" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "cadenza" +msgstr "cadenza" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/snippets/breathing-signs.ly:40 (comment) +msgid "caesura" +msgstr "cesura" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "canon" +msgstr "cànon" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "cent" +msgstr "cent" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "central C" +msgstr "do central" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "chromatic scale" +msgstr "escala cromàtica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "chromaticism" +msgstr "cromatisme" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "church mode" +msgstr "mode eclesiàstic" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "cluster" +msgstr "clúster" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "comma" +msgstr "coma" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "common meter" +msgstr "compàs comú" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "Common Practice Period" +msgstr "Període de la Pràctica Comuna" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "common time" +msgstr "temps comú" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "complement" +msgstr "complement" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "compound interval" +msgstr "interval compost" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "compound meter" +msgstr "compàs compost" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "compound time" +msgstr "temps compost" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "concert pitch" +msgstr "altura de concert" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "conjunct movement" +msgstr "moviment conjunt" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "consonance" +msgstr "consonància" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "contralto" +msgstr "contralto" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "copying music" +msgstr "còpia de música" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "counterpoint" +msgstr "contrapunt" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "countertenor" +msgstr "contratenor" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "cue-notes" +msgstr "notes guia" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "custos" +msgstr "custos" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "cut time" +msgstr "compàs binari" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "D" +msgstr "Re" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "da capo" +msgstr "da capo" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "dal niente" +msgstr "dal niente" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "dal segno" +msgstr "dal segno" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "descending interval" +msgstr "interval descendent" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "diatonic scale" +msgstr "escala diatònica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "didymic comma" +msgstr "coma de Dídim" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "diminished interval" +msgstr "interval disminuït" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "diminuendo" +msgstr "diminuendo" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "diminution" +msgstr "disminució" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "direct" +msgstr "directe" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "disjunct movement" +msgstr "moviment disjunt" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "dissonance" +msgstr "dissonància" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "dissonant interval" +msgstr "interval dissonant" + +# ? FVD +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "divisio" +msgstr "divisio" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "doit" +msgstr "elevació" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "dominant" +msgstr "dominant" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "dominant ninth chord" +msgstr "acord de novena dominant" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "dominant seventh chord" +msgstr "acord de sèptima dominant" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "dorian mode" +msgstr "mode dòric" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "dot (augmentation dot)" +msgstr "puntet (puntet d'augment)" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "double appoggiatura" +msgstr "appoggiatura doble" + +# También Líneas divisorias. FVD +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "double bar line" +msgstr "doble línia divisòria" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "double dotted note" +msgstr "figura amb doble puntet" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "double time signature" +msgstr "compàs polimètric" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "double trill" +msgstr "doble trinat" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "duple meter" +msgstr "temps binari" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "duplet" +msgstr "doset" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "E" +msgstr "Mi" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "eighth note" +msgstr "corxera" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "eighth rest" +msgstr "silenci de corxera" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "elision" +msgstr "elisió" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "embellishment" +msgstr "adorn" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "engraving" +msgstr "gravat musical" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "enharmonic" +msgstr "enharmònic" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "equal temperament" +msgstr "temperament igual" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "expression mark" +msgstr "marca de expressió" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "F" +msgstr "Fa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "F clef" +msgstr "clau de Fa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "fall" +msgstr "caiguda" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "feathered beam" +msgstr "barra progressiva" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "fermata" +msgstr "calderó" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "fifth" +msgstr "quinta" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "figured bass" +msgstr "baix xifrat" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "flag" +msgstr "etiqueta" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "flageolet" +msgstr "harmònic" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "forefall" +msgstr "appoggiatura de caiguda" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "forte" +msgstr "forte" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "fourth" +msgstr "quarta" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "Frenched score" +msgstr "Partitura a la francesa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "Frenched staff" +msgstr "Sistema a la francesa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "Frenched staves" +msgstr "Sistemes a la francesa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "fugue" +msgstr "fuga" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "functional harmony" +msgstr "harmonia funcional" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "G" +msgstr "Sol" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "G clef" +msgstr "clau de sol" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "glissando" +msgstr "glissando" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "grand staff" +msgstr "sistema de piano" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "grave" +msgstr "grave" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "gruppetto" +msgstr "gruppetto" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "H" +msgstr "Si" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "hairpin" +msgstr "regulador" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "half rest" +msgstr "silenci de blanca" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "harmonic cadence" +msgstr "cadència harmònica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:53 (variable) +msgid "harmonics" +msgstr "harmònics" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "harmony" +msgstr "harmonia" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "hemiola" +msgstr "hemiola" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "homophony" +msgstr "homofonia" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "hook" +msgstr "claudàtor" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "hymn meter" +msgstr "compàs de himne" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "inversion" +msgstr "inversió" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "inverted interval" +msgstr "interval invertit" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "just intonation" +msgstr "entonació justa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "key" +msgstr "tonalitat" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "laissez vibrer" +msgstr "laissez vibrer" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "largo" +msgstr "largo" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "leading note" +msgstr "sensible" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "ledger line" +msgstr "línia addicional" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "legato" +msgstr "legato" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "legato curve" +msgstr "corba de legato" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "leger line" +msgstr "línia addicional" + +# de neuma? FVD +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "ligature" +msgstr "lligadura" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "lilypond" +msgstr "LilyPond" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "line" +msgstr "línia" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "loco" +msgstr "loco" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "long appoggiatura" +msgstr "appoggiatura llarga" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "longa" +msgstr "longa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "lyric tie" +msgstr "lligadura de lletra" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "major interval" +msgstr "interval major" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "maxima" +msgstr "maxima" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "meantone temperament" +msgstr "temperament mesotònic" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "measure" +msgstr "compàs" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "measure repeat" +msgstr "repetició de compàs" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "mediant" +msgstr "mediant" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "melisma line" +msgstr "línia de melisma" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "melodic cadence" +msgstr "cadència melòdica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "mensural notation" +msgstr "notació mensural" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "mensuration sign" +msgstr "signe de mensuració" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "meter" +msgstr "metre" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "metronome mark" +msgstr "indicació metronòmica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "metronomic indication" +msgstr "indicació metronòmica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "mezzo" +msgstr "mezzo" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "mezzo-soprano" +msgstr "mezzosoprano" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "minor interval" +msgstr "interval menor" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "mixolydian mode" +msgstr "mode mixolidi" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "mode" +msgstr "mode" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "modulation" +msgstr "modulació" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "mordent" +msgstr "mordent" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "motif" +msgstr "motiu" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "motive" +msgstr "motivo" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "movement" +msgstr "moviment" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "multi-measure rest" +msgstr "silencis multicompàs" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "neighbor tones" +msgstr "tons veïns" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "ninth" +msgstr "novena" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "non-legato" +msgstr "non-legato" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "note" +msgstr "nota" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "note head" +msgstr "cap de nota" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "note names" +msgstr "noms de nota" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "octavation" +msgstr "octavació" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "octave mark" +msgstr "indicació d'octava" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "octave marking" +msgstr "marca d'octava" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "octave sign" +msgstr "signe d'octava" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "ornament" +msgstr "ornament" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/snippets/flamenco-notation.ly:169 (variable) +#. Documentation/snippets/flamenco-notation.ly:266 (context id) +msgid "part" +msgstr "part" + +# fuzzy. FVD +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "pause" +msgstr "pausa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "pennant" +msgstr "banderí" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "percent repeat" +msgstr "repetició d'estil percentatge" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "percussion" +msgstr "percussió" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "perfect interval" +msgstr "interval perfecte" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "phrase" +msgstr "frase" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "pickup" +msgstr "anacrusa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "pizzicato" +msgstr "pizzicato" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "polymeter" +msgstr "polimetria" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "polymetric" +msgstr "polimètrica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "polymetric time signature" +msgstr "compàs polimètric" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "portato" +msgstr "portato" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "power chord" +msgstr "acord de quinta buida" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "presto" +msgstr "presto" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "proportion" +msgstr "proporció" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "Pythagorean comma" +msgstr "coma pitagòrica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "quadruplet" +msgstr "quatret" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "quality" +msgstr "qualitat" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "quarter rest" +msgstr "silenci de negra" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "quarter tone" +msgstr "quart de to" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "quintuplet" +msgstr "cinquet" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "rallentando" +msgstr "rallentando" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "relative key" +msgstr "to relatiu" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "repeat" +msgstr "repetició" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/snippets/creating-a-sequence-of-notes-on-various-pitches.ly:39 (variable) +#. Documentation/snippets/jazz-combo-template.ly:307 (context id) +msgid "rhythm" +msgstr "duracions" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "ritardando" +msgstr "ritardando" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "ritenuto" +msgstr "ritenuto" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "scale degree" +msgstr "grau de l'escala" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "scordatura" +msgstr "scordatura" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "score" +msgstr "partitura" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "second" +msgstr "segona" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "semibreve" +msgstr "semibreve" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "semitone" +msgstr "semitó" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "seventh" +msgstr "sèptima" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sextolet" +msgstr "siset" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sextuplet" +msgstr "siset" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "shake" +msgstr "tri" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "simile" +msgstr "simile" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "simple meter" +msgstr "compàs senzill" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sixteenth note" +msgstr "semicorxera" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sixteenth rest" +msgstr "silenci de semicorxera" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sixth" +msgstr "sisena" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sixty-fourth note" +msgstr "semifusa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sixty-fourth rest" +msgstr "silenci de semifusa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "slash repeat" +msgstr "repetició de tipus percentatge" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "solmization" +msgstr "solfeig" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sonata" +msgstr "sonata" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sonata form" +msgstr "forma sonata" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "song texts" +msgstr "textos de cançons" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/snippets/satb-choir-template---four-staves.ly:80 (context id) +msgid "soprano" +msgstr "soprano" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "staccato" +msgstr "staccato" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "staves" +msgstr "pentagrames" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "stem" +msgstr "vírgula" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "stringendo" +msgstr "stringendo" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "strings" +msgstr "cordes" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "strong beat" +msgstr "pulsació forta" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "subdominant" +msgstr "subdominant" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "submediant" +msgstr "submediant" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "subtonic" +msgstr "subtònica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sul G" +msgstr "sul G" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "superdominant" +msgstr "superdominant" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "supertonic" +msgstr "supertònica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "symphony" +msgstr "simfonia" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "syncopation" +msgstr "síncopa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "syntonic comma" +msgstr "coma sintònica" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "temperament" +msgstr "temperament" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +#. Documentation/snippets/satb-choir-template---four-staves.ly:94 (context id) +msgid "tenor" +msgstr "tenor" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "tenth" +msgstr "desena" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "tenuto" +msgstr "tenuto" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "third" +msgstr "tercera" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "thirty-second note" +msgstr "fusa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "thirty-second rest" +msgstr "silenci de fusa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "thorough bass" +msgstr "baix xifrat" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "time" +msgstr "compàs" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "tone" +msgstr "tonalitat" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "transposing instrument" +msgstr "instrument que es transposa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "treble clef" +msgstr "clau de sol" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "tremolo" +msgstr "trèmol" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "triad" +msgstr "tríada" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "trill" +msgstr "tri" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "triple meter" +msgstr "compàs de tres parts" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "tritone" +msgstr "tritó" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "tuning fork" +msgstr "diapasó de forquilla" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "tuplet" +msgstr "tuplet" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "turn" +msgstr "mordent circular" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "unison" +msgstr "uníson" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "upbeat" +msgstr "anacrusa" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "voice" +msgstr "veu" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "volta" +msgstr "primera i segona vegada" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "weak beat" +msgstr "pulsació feble" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "whole rest" +msgstr "silenci de rodona" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "whole tone" +msgstr "to sencer" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "woodwind" +msgstr "vent fusta" + +#. @node in Documentation/music-glossary.tely +#. @chapter in Documentation/music-glossary.tely +msgid "Duration names notes and rests" +msgstr "Nom de les duracions de notes i silencis" + +#. @node in Documentation/music-glossary.tely +#. @chapter in Documentation/music-glossary.tely +msgid "Non-Western terms A-Z" +msgstr "Termes de la música no occidental de l'A a la Z" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "bayati" +msgstr "bayati" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "iraq" +msgstr "irac" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "kurd" +msgstr "kurd" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "makam" +msgstr "makam" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "makamlar" +msgstr "makamlar" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "maqam" +msgstr "maqam" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "rast" +msgstr "rast" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "semai" +msgstr "semai" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "sikah" +msgstr "sikah" + +#. @node in Documentation/music-glossary.tely +#. @section in Documentation/music-glossary.tely +msgid "taqasim" +msgstr "taqasim" + +#. @node in Documentation/music-glossary.tely +#. @appendix in Documentation/music-glossary.tely +msgid "Literature used" +msgstr "Bibliografia" + +#. @node in Documentation/notation.tely +#. @appendix in Documentation/notation.tely +msgid "LilyPond grammar" +msgstr "Gramàtica del LilyPond" + +#. @node in Documentation/notation.tely +#. @appendix in Documentation/notation.tely +msgid "LilyPond command index" +msgstr "Índex d'instruccions del LilyPond" + +#. @node in Documentation/notation/notation.itely +#. @chapter in Documentation/notation/notation.itely +msgid "Musical notation" +msgstr "Notació musical" + +#. @node in Documentation/notation/specialist.itely +#. @chapter in Documentation/notation/specialist.itely +msgid "Specialist notation" +msgstr "Notació especialitzada" + +#. Documentation/notation/input.itely:597 (comment) +msgid "Do not display the tagline for this book" +msgstr "No imprimeixes la línia d'etiqueta en aquest llibre" + +#. Documentation/notation/input.itely:609 (comment) +#. Documentation/notation/input.itely:622 (comment) +msgid "Do not display the subtitle for this score" +msgstr "No imprimeixes el subtítol en aquesta partitura" + +#. Documentation/notation/input.itely:645 (comment) +msgid "The following fields are centered" +msgstr "Els camps següents estan centrats" + +#. Documentation/notation/input.itely:652 (comment) +msgid "The following fields are left-aligned on the left side" +msgstr "Els camps següents estan alineats a l'esquerra a la part esquerra" + +#. Documentation/notation/input.itely:656 (comment) +msgid "The following fields are right-aligned on the right side" +msgstr "Els camps següents estan alineats a la dreta a la part dreta" + +#. Documentation/notation/input.itely:664 (comment) +msgid "The following fields are placed at opposite ends of the same line" +msgstr "Els camps següents estan posats als extrems de la mateixa línia" + +#. Documentation/notation/input.itely:939 (comment) +#. Documentation/notation/input.itely:953 (comment) +msgid "User-defined field" +msgstr "Camp definit per l'usuari" + +#. Documentation/notation/input.itely:1606 (variable) +msgid "allLyrics" +msgstr "allLyrics" + +#. Documentation/notation/input.itely:1695 (variable) +#. Documentation/notation/input.itely:1714 (variable) +#. Documentation/notation/input.itely:1751 (variable) +#. Documentation/notation/input.itely:1766 (variable) +#. Documentation/notation/spacing.itely:1570 (variable) +#. Documentation/notation/spacing.itely:1623 (variable) +#. Documentation/notation/spacing.itely:1648 (variable) +#. Documentation/notation/changing-defaults.itely:458 (variable) +#. Documentation/notation/changing-defaults.itely:493 (context id) +#. Documentation/notation/changing-defaults.itely:543 (context id) +#. Documentation/snippets/automatically-change-durations.ly:24 (variable) +#. Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly:35 (variable) +#. Documentation/snippets/controlling-tuplet-bracket-visibility.ly:54 (variable) +#. Documentation/snippets/guitar-slides.ly:47 (variable) +#. Documentation/snippets/letter-tablature-formatting.ly:28 (variable) +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:164 (variable) +#. Documentation/snippets/transposing-pitches-with-minimum-accidentals-smart-transpose.ly:199 (variable) +#. Documentation/snippets/vertically-aligned-dynamics-and-textscripts.ly:72 (variable) +msgid "music" +msgstr "música" + +#. Documentation/notation/input.itely:1792 (variable) +msgid "test" +msgstr "prova" + +#. @node in Documentation/notation/input.itely +#. @chapter in Documentation/notation/input.itely +msgid "General input and output" +msgstr "Entrada i sortida generals" + +#. @node in Documentation/notation/input.itely +#. @section in Documentation/notation/input.itely +msgid "Input structure" +msgstr "Estructura del codi d'entrada" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Structure of a score" +msgstr "Estructura d'una partitura" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Multiple scores in a book" +msgstr "Diverses partitures a un llibre" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Multiple output files from one input file" +msgstr "Diversos fitxers de sortida a partir d'un sol fitxer d'entrada" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Output file names" +msgstr "Noms dels fitxers de sortida" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "File structure" +msgstr "Estructura de fitxers" + +#. @node in Documentation/notation/input.itely +#. @section in Documentation/notation/input.itely +msgid "Titles and headers" +msgstr "Títols i capçaleres" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Creating titles headers and footers" +msgstr "Creació de títols, capçaleres i peus de pàgina" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Title blocks explained" +msgstr "Explicació dels blocs de títol" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Default layout of book and score title blocks" +msgstr "Format predeterminat dels blocs de títol de llibre i de partitura" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Default layout of headers and footers" +msgstr "Format predeterminat de capçaleres i peus de pàgina" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Custom headers footers and titles" +msgstr "Títols, capçaleres i peus de pàgina personalitzats" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Custom text formatting for title blocks" +msgstr "Format personalitzat de text per a blocs de títol" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Custom layout for title blocks" +msgstr "Format personalitzat per a blocs de títol" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Custom layout for headers and footers" +msgstr "Format personalitzat per a capçaleres i peus de pàgina" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Creating footnotes" +msgstr "Creació de notes a peu de pàgina" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Footnotes overview" +msgstr "Panoràmica de les notes a peu de pàgina" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Automatic footnotes" +msgstr "Notes a peu de pàgina automàtiques" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Manual footnotes" +msgstr "Notes a peu de pàgina manuals" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Reference to page numbers" +msgstr "Referència a números de pàgina" + +# this is the same translation that babel LaTex package uses . FVD +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Table of contents" +msgstr "Índex general" + +#. @node in Documentation/notation/input.itely +#. @section in Documentation/notation/input.itely +msgid "Working with input files" +msgstr "Treball amb fitxers d'entrada" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Including LilyPond files" +msgstr "Inclusió de fitxers del LilyPond" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Different editions from one source" +msgstr "Diferents edicions d'una sola font" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Using variables" +msgstr "Ús de variables" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Using tags" +msgstr "Ús d'etiquetes" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Using global settings" +msgstr "Ús d'ajustos globals" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Special characters" +msgstr "Caràcters especials" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Text encoding" +msgstr "Codificació del text" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Unicode" +msgstr "Unicode" + +#. @node in Documentation/notation/input.itely +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "ASCII aliases" +msgstr "Àlias d'ASCII" + +#. @node in Documentation/notation/input.itely +#. @section in Documentation/notation/input.itely +msgid "Controlling output" +msgstr "Control de la sortida" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Extracting fragments of music" +msgstr "Extracció de fragments de música" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Skipping corrected music" +msgstr "Ignorar la música corregida" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Alternative output formats" +msgstr "Formats de sortida alternatius" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Replacing the notation font" +msgstr "Substitució de la tipografia per a la notació" + +#. @subsubheading in Documentation/notation/input.itely +msgid "Installation Instructions for MacOS" +msgstr "Instruccions d'instal·lació per a MacOS" + +#. @node in Documentation/notation/input.itely +#. @section in Documentation/notation/input.itely +msgid "MIDI output" +msgstr "Sortida del MIDI" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Creating MIDI files" +msgstr "Creació de fitxers MIDI" + +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Instrument names" +msgstr "Noms d'instruments" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "MIDI block" +msgstr "El bloc MIDI" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "What goes into the MIDI output?" +msgstr "Què hi ha a la sortida MIDI?" + +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Supported in MIDI" +msgstr "Suportat al MIDI" + +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Unsupported in MIDI" +msgstr "No suportat al MIDI" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Repeats in MIDI" +msgstr "Repeticions al MIDI" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Controlling MIDI dynamics" +msgstr "Control de la dinàmica al MIDI" + +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Dynamic marks" +msgstr "Indicacions dinàmiques" + +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Overall MIDI volume" +msgstr "Volum general del MIDI" + +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Equalizing different instruments (i)" +msgstr "Equalització de diferents instruments (i)" + +#. @unnumberedsubsubsec in Documentation/notation/input.itely +msgid "Equalizing different instruments (ii)" +msgstr "Equalització de diferents instruments (ii)" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Percussion in MIDI" +msgstr "Percussió al MIDI" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "The Articulate script" +msgstr "L'script Articulate" + +#. @node in Documentation/notation/input.itely +#. @section in Documentation/notation/input.itely +msgid "Extracting musical information" +msgstr "Extracció d'informació musical" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Displaying LilyPond notation" +msgstr "Visualització de la notació del LilyPond" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Displaying scheme music expressions" +msgstr "Visualització d'expressions musicals de l'scheme" + +#. @node in Documentation/notation/input.itely +#. @subsection in Documentation/notation/input.itely +msgid "Saving music events to a file" +msgstr "Desament d'esdeveniments de música a un fitxer" + +#. Documentation/notation/spacing.itely:2091 (comment) +msgid "The very low note here needs more room than 'basic-distance" +msgstr "A la nota més baixa d'aquí li cal més espai que 'basic-distance" + +#. Documentation/notation/spacing.itely:2092 (comment) +msgid "can provide, so the distance between this staff and the next" +msgstr "es pot oferir, de manera que la distància entre aquest pentagrama i el següent" + +#. Documentation/notation/spacing.itely:2093 (comment) +msgid "is determined by 'padding." +msgstr "està determinat per 'padding." + +#. Documentation/notation/spacing.itely:2096 (comment) +msgid "Here, 'basic-distance provides enough room, and there is no" +msgstr "Aquí, 'basic-distance proveeix prou espai, i no hi ha" + +#. Documentation/notation/spacing.itely:2097 (comment) +msgid "need to compress the space (towards 'minimum-distance) to make" +msgstr "es necessita comprimir l'espai (cap a 'minimum-distance) per fer" + +#. Documentation/notation/spacing.itely:2098 (comment) +msgid "room for anything else on the page, so the distance between" +msgstr "espai per qualsevol altra cosa a la pàgina, de manera que la distància entre" + +#. Documentation/notation/spacing.itely:2099 (comment) +msgid "this staff and the next is determined by 'basic-distance." +msgstr "aquest pentagrama i el següent estigui determinada per 'basic-distance." + +#. Documentation/notation/spacing.itely:2102 (comment) +msgid "By setting 'padding to a negative value, staves can be made to" +msgstr "Mitjançant l'establiment de 'padding a un valor negative, els pentagrames poden fer-se" + +#. Documentation/notation/spacing.itely:2103 (comment) +msgid "collide. The lowest acceptable value for 'basic-distance is 0." +msgstr "xocar. El valor acceptable més baix per a 'basic-distance és 0." + +#. Documentation/notation/spacing.itely:2532 (comment) +msgid "this time the text will be closer to the staff" +msgstr "aquest cop el text estarà més a prop del pentagrama" + +#. Documentation/notation/spacing.itely:2534 (comment) +msgid "by setting outside-staff-priority to a non-number," +msgstr "establint outside-staff-priority a un valor no numèric," + +#. Documentation/notation/spacing.itely:2535 (comment) +msgid "we disable the automatic collision avoidance" +msgstr "desactivarem la detecció automàtica de col·lision" + +#. Documentation/notation/spacing.itely:2538 (comment) +msgid "now they will collide" +msgstr "ara es produirà la col·lisió" + +#. Documentation/notation/spacing.itely:2564 (comment) +msgid "the markup is too close to the following note" +msgstr "l'etiquetatge està massa a prop de la nota següent" + +#. Documentation/notation/spacing.itely:2568 (comment) +msgid "setting outside-staff-horizontal-padding fixes this" +msgstr "l'ajust d'outside-staff-horizontal-padding arregla això" + +#. @node in Documentation/notation/spacing.itely +#. @chapter in Documentation/notation/spacing.itely +msgid "Spacing issues" +msgstr "Problemes d'espaiat" + +#. @node in Documentation/notation/spacing.itely +#. @section in Documentation/notation/spacing.itely +msgid "Page layout" +msgstr "Format de la pàgina" + +#. @node in Documentation/notation/spacing.itely +msgid "The \\\\paper block" +msgstr "El bloc \\\\paper" + +#. @subsection in Documentation/notation/spacing.itely +msgid "The @code{\\\\paper} block" +msgstr "El bloc @code{\\\\override}" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Paper size and automatic scaling" +msgstr "Mida del paper i escalat automàtic" + +#. @node in Documentation/notation/spacing.itely +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "Setting the paper size" +msgstr "S'està establint la mida del paper" + +#. @node in Documentation/notation/spacing.itely +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "Automatic scaling to paper size" +msgstr "Escalat automàtica a la mida de la pàgina" + +#. @node in Documentation/notation/spacing.itely +msgid "Fixed vertical spacing \\\\paper variables" +msgstr "Variables de \\\\paper d'espaiat vertical fix" + +#. @subsection in Documentation/notation/spacing.itely +msgid "Fixed vertical spacing @code{\\\\paper} variables" +msgstr "Variables de @code{\\\\paper} d'espaiat vertical flexible" + +#. @node in Documentation/notation/spacing.itely +msgid "Flexible vertical spacing \\\\paper variables" +msgstr "Variables de \\\\paper d'espaiat vertical flexible" + +#. @subsection in Documentation/notation/spacing.itely +msgid "Flexible vertical spacing @code{\\\\paper} variables" +msgstr "Variables de @code{\\\\paper} d'espaiat vertical flexible" + +#. @node in Documentation/notation/spacing.itely +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "Structure of flexible vertical spacing alists" +msgstr "Estructura de les alist d'espaiat vertical flexible" + +#. @node in Documentation/notation/spacing.itely +msgid "List of flexible vertical spacing \\\\paper variables" +msgstr "Llista de variables de \\\\paper d'espaiat vertical flexible" + +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "List of flexible vertical spacing @code{\\\\paper} variables" +msgstr "Llista de variables de @code{\\\\paper} d'espaiat vertical flexible" + +#. @node in Documentation/notation/spacing.itely +msgid "Horizontal spacing \\\\paper variables" +msgstr "Variables de \\\\paper d'espaiat horitzontal" + +#. @subsection in Documentation/notation/spacing.itely +msgid "Horizontal spacing @code{\\\\paper} variables" +msgstr "Variables de @code{\\\\paper} d'espaiat horitzontal" + +#. @node in Documentation/notation/spacing.itely +msgid "\\\\paper variables for widths and margins" +msgstr "Variables de \\\\paper per a amplades i marges" + +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "@code{\\\\paper} variables for widths and margins" +msgstr "Variables de @code{\\\\paper} per a amplades i marges" + +#. @node in Documentation/notation/spacing.itely +msgid "\\\\paper variables for two-sided mode" +msgstr "variables de \\\\paper para al mode de doble cara" + +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "@code{\\\\paper} variables for two-sided mode" +msgstr "variables de @code{\\\\paper} para al mode de doble cara" + +#. @node in Documentation/notation/spacing.itely +msgid "\\\\paper variables for shifts and indents" +msgstr "variables de \\\\paper per a desplaçaments i sagnats" + +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "@code{\\\\paper} variables for shifts and indents" +msgstr "variables de @code{\\\\paper} per a desplaçaments i sagnats" + +#. @node in Documentation/notation/spacing.itely +msgid "Other \\\\paper variables" +msgstr "Altres variables de \\\\paper" + +#. @subsection in Documentation/notation/spacing.itely +msgid "Other @code{\\\\paper} variables" +msgstr "Altres variables de @code{\\\\paper}" + +#. @node in Documentation/notation/spacing.itely +msgid "\\\\paper variables for line breaking" +msgstr "variables de \\\\paper per a salts de línia" + +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "@code{\\\\paper} variables for line breaking" +msgstr "variables de @code{\\\\paper} per a salts de línia" + +#. @node in Documentation/notation/spacing.itely +msgid "\\\\paper variables for page breaking" +msgstr "variables de \\\\paper per a salts de pàgina" + +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "@code{\\\\paper} variables for page breaking" +msgstr "variables de @code{\\\\paper} per a salts de pàgina" + +#. @node in Documentation/notation/spacing.itely +msgid "\\\\paper variables for page numbering" +msgstr "variables de \\\\paper per a la numeració de les pàgines" + +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "@code{\\\\paper} variables for page numbering" +msgstr "variables de @code{\\\\paper} per a la numeració de pàgines" + +#. @node in Documentation/notation/spacing.itely +msgid "Miscellaneous \\\\paper variables" +msgstr "Variables de \\\\paper diverses" + +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "Miscellaneous @code{\\\\paper} variables" +msgstr "Variables de @code{\\\\paper} diverses" + +#. @node in Documentation/notation/spacing.itely +#. @section in Documentation/notation/spacing.itely +msgid "Score layout" +msgstr "Format de la partitura" + +#. @node in Documentation/notation/spacing.itely +msgid "The \\\\layout block" +msgstr "El bloc \\\\layout" + +#. @subsection in Documentation/notation/spacing.itely +msgid "The @code{\\\\layout} block" +msgstr "El bloc @code{\\\\layout}" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Setting the staff size" +msgstr "Establiment de la mida del pentagrama" + +#. @node in Documentation/notation/spacing.itely +#. @section in Documentation/notation/spacing.itely +msgid "Breaks" +msgstr "Salts" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Line breaking" +msgstr "Salts de línia" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Page breaking" +msgstr "Salts de pàgina" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Optimal page breaking" +msgstr "Salts de pàgina òptims" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Optimal page turning" +msgstr "Pas de pàgina òptim" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Minimal page breaking" +msgstr "Salts de pàgina mínims" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Explicit breaks" +msgstr "Salts de línia explícits" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Using an extra voice for breaks" +msgstr "Ús d'una veu extra per a salts" + +#. @node in Documentation/notation/spacing.itely +#. @section in Documentation/notation/spacing.itely +msgid "Vertical spacing" +msgstr "Espaiat vertical" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Flexible vertical spacing within systems" +msgstr "Espaiat vertical flexible entre sistemes" + +#. @node in Documentation/notation/spacing.itely +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "Within-system spacing properties" +msgstr "Propietats d'espaiat dins dels sistemes" + +#. @subsubheading in Documentation/notation/spacing.itely +msgid "Properties of the @code{VerticalAxisGroup} grob" +msgstr "Propietats del grob @code{VerticalAxisGroup}" + +#. @subsubheading in Documentation/notation/spacing.itely +msgid "Properties of the @code{StaffGrouper} grob" +msgstr "Propietats del grob @code{StaffGrouper}" + +#. @node in Documentation/notation/spacing.itely +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "Spacing of ungrouped staves" +msgstr "Espaiat de pentagrames no agrupats" + +#. @node in Documentation/notation/spacing.itely +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "Spacing of grouped staves" +msgstr "Espaiat de pentagrames agrupats" + +#. @node in Documentation/notation/spacing.itely +#. @unnumberedsubsubsec in Documentation/notation/spacing.itely +msgid "Spacing of non-staff lines" +msgstr "Espaiat de línies que no són pautes" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Explicit staff and system positioning" +msgstr "Posicionament explícit dels pentagrames i els sistemes" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Vertical collision avoidance" +msgstr "Detecció de col·lisions verticals" + +#. @node in Documentation/notation/spacing.itely +#. @section in Documentation/notation/spacing.itely +msgid "Horizontal spacing" +msgstr "Espaiat horitzontal" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Horizontal spacing overview" +msgstr "Panoràmica de l'espaiat horitzontal" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "New spacing area" +msgstr "àrea d'espaiat nova" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Changing horizontal spacing" +msgstr "Canvi de l'espaiat horitzontal" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Line length" +msgstr "Longitud de la línia" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Proportional notation" +msgstr "Notació proporcional" + +#. @node in Documentation/notation/spacing.itely +#. @section in Documentation/notation/spacing.itely +msgid "Fitting music onto fewer pages" +msgstr "Ajust de la música dins de menys pàgines" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Displaying spacing" +msgstr "Visualització de l'espaiat" + +#. @node in Documentation/notation/spacing.itely +#. @subsection in Documentation/notation/spacing.itely +msgid "Changing spacing" +msgstr "Canvi de l'espaiat" + +#. Documentation/notation/changing-defaults.itely:449 (variable) +msgid "musicA" +msgstr "musicA" + +#. Documentation/notation/changing-defaults.itely:450 (variable) +msgid "musicB" +msgstr "musicB" + +#. Documentation/notation/changing-defaults.itely:451 (variable) +msgid "keepVoicesAlive" +msgstr "keepVoicesAlive" + +#. Documentation/notation/changing-defaults.itely:453 (comment) +msgid "Keep Voice \\\"A\\\" alive for 5 bars" +msgstr "Manté viva la veu \\\"A\\\" durant 5 compassos" + +#. Documentation/notation/changing-defaults.itely:454 (comment) +msgid "Keep Voice \\\"B\\\" alive for 5 bars" +msgstr "Manté viva la veu \\\"B\\\" durant 5 compassos" + +#. Documentation/notation/changing-defaults.itely:489 (variable) +#. Documentation/notation/changing-defaults.itely:500 (context id) +#. Documentation/notation/changing-defaults.itely:506 (context id) +#. Documentation/notation/changing-defaults.itely:508 (context id) +#. Documentation/notation/changing-defaults.itely:511 (context id) +#. Documentation/notation/changing-defaults.itely:533 (variable) +#. Documentation/notation/changing-defaults.itely:549 (context id) +msgid "accompaniment" +msgstr "acompanyament" + +#. Documentation/notation/changing-defaults.itely:490 (variable) +#. Documentation/notation/changing-defaults.itely:539 (variable) +#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:117 (variable) +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:49 (variable) +msgid "words" +msgstr "lletra" + +#. Documentation/notation/changing-defaults.itely:497 (comment) +msgid "Keep Voice \\\"melody\\\" alive for 4 bars" +msgstr "Manté viva la veu \\\"melodia\\\" durant 4 compassos" + +#. Documentation/notation/changing-defaults.itely:528 (comment) +#. Documentation/notation/changing-defaults.itely:530 (comment) +msgid "skip a bar" +msgstr "salta un compàs" + +#. Documentation/notation/changing-defaults.itely:729 (variable) +msgid "blubb" +msgstr "blubb" + +#. Documentation/notation/changing-defaults.itely:735 (variable) +msgid "bla" +msgstr "bla" + +#. Documentation/notation/changing-defaults.itely:2027 (comment) +msgid "default space between staves" +msgstr "espai predeterminat entre pentagrames" + +#. Documentation/notation/changing-defaults.itely:2033 (comment) +msgid "reduced space between staves" +msgstr "espai reduït entre pentagrames" + +#. Documentation/notation/changing-defaults.itely:2035 (comment) +msgid "this is the nested declaration" +msgstr "aquesta és la declaració niada" + +#. Documentation/notation/changing-defaults.itely:2471 (comment) +msgid "increase the length of the tie" +msgstr "augmenta la longitud de la lligadura d'unió" + +#. Documentation/notation/changing-defaults.itely:2480 (comment) +msgid "increase the length of the rest bar" +msgstr "augmenta la longitud del compàs del silenci" + +#. Documentation/notation/changing-defaults.itely:2488 (comment) +msgid "increase the length of the hairpin" +msgstr "augmenta la longitud de l'interval" + +#. Documentation/notation/changing-defaults.itely:2516 (comment) +msgid "default" +msgstr "predeterminat" + +#. Documentation/notation/changing-defaults.itely:2519 (comment) +#. Documentation/notation/changing-defaults.itely:2532 (comment) +msgid "not effective alone" +msgstr "no és efectiu per sí sol" + +#. Documentation/notation/changing-defaults.itely:2523 (comment) +#. Documentation/notation/changing-defaults.itely:2536 (comment) +msgid "effective only when both overrides are present" +msgstr "és efectiu sols quan els dos overrides estan presents" + +#. Documentation/notation/changing-defaults.itely:2912 (comment) +msgid "Remove bar line at the end of the current line" +msgstr "Suprimeix la línia de barra de compàs al final de la línia actual" + +#. Documentation/notation/changing-defaults.itely:2958 (comment) +msgid "Try to remove all key signatures" +msgstr "Intenta suprimir totes les armadures" + +#. Documentation/notation/changing-defaults.itely:3383 (comment) +msgid "move horizontally left" +msgstr "desplaçament cap a l'esquerra" + +#. Documentation/notation/changing-defaults.itely:3385 (comment) +msgid "move vertically up" +msgstr "desplaçament cap a dalt" + +#. Documentation/notation/changing-defaults.itely:3386 (comment) +msgid "third finger" +msgstr "tercer dit" + +#. Documentation/notation/changing-defaults.itely:3434 (comment) +#. Documentation/notation/changing-defaults.itely:3473 (comment) +msgid "The rehearsal mark will be centered above the Clef" +msgstr "La marca d'assaig se centrarà sobre la clau" + +#. Documentation/notation/changing-defaults.itely:3440 (comment) +msgid "The rehearsal mark will be centered above the Time Signature" +msgstr "La marca d'assaig se centrarà sobre la indicació de compàs" + +#. Documentation/notation/changing-defaults.itely:3447 (comment) +msgid "The rehearsal mark will be centered above the Breath Mark" +msgstr "La marca d'assaig se centrarà sobre la respiració" + +#. Documentation/notation/changing-defaults.itely:3467 (comment) +msgid "The rehearsal mark will be centered above the Key Signature" +msgstr "La marca d'assaig se centrarà sobre l'armadura de tonalitat" + +#. Documentation/notation/changing-defaults.itely:3480 (comment) +msgid "The rehearsal mark will be centered above the Bar Line" +msgstr "La marca d'assaig se centrar+a sobre la línia divisòria" + +#. Documentation/notation/changing-defaults.itely:3495 (comment) +msgid "The RehearsalMark will be centered above the Key Signature" +msgstr "La marca d'assaig se centrarà sobre l'armadura de tonalitat" + +#. Documentation/notation/changing-defaults.itely:3502 (comment) +#. Documentation/notation/changing-defaults.itely:3518 (comment) +#. Documentation/notation/changing-defaults.itely:3525 (comment) +msgid "The RehearsalMark will be aligned with the left edge of the Key Signature" +msgstr "La RehearsalMark s'alinearà amb el cantó esquerre de l'armadura" + +#. Documentation/notation/changing-defaults.itely:3507 (comment) +msgid "The RehearsalMark will be aligned with the right edge of the Key Signature" +msgstr "La RehearsalMark s'alinearà amb el cantó dret de l'armadura" + +#. Documentation/notation/changing-defaults.itely:3519 (comment) +msgid "and then shifted right by 3.5 staff-spaces" +msgstr "i es desplaçarà després 3,5 espais a la dreta" + +#. Documentation/notation/changing-defaults.itely:3526 (comment) +msgid "and then shifted left by 2 staff-spaces" +msgstr "i es desplaçarà després 2 espais cap a l'esquerra" + +#. Documentation/notation/changing-defaults.itely:3574 (variable) +msgid "XinO" +msgstr "XinO" + +#. Documentation/notation/changing-defaults.itely:3761 (variable) +msgid "squareLineCircleSpace" +msgstr "squareLineCircleSpace" + +#. Documentation/notation/changing-defaults.itely:3765 (variable) +msgid "smartSquareLineCircleSpace" +msgstr "smartSquareLineCircleSpace" + +#. Documentation/notation/changing-defaults.itely:3920 (variable) +msgid "custosNote" +msgstr "custosNote" + +#. @node in Documentation/notation/changing-defaults.itely +#. @chapter in Documentation/notation/changing-defaults.itely +msgid "Changing defaults" +msgstr "Canvi dels valors predeterminats" + +#. @node in Documentation/notation/changing-defaults.itely +#. @section in Documentation/notation/changing-defaults.itely +msgid "Interpretation contexts" +msgstr "Contextos d'interpretació" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Score - the master of all contexts" +msgstr "Score: el context mestre de tots els contextos" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Top-level contexts - staff containers" +msgstr "Contextos de nivell superior: contenidors de pentagrames" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Intermediate-level contexts - staves" +msgstr "Contextos de nivell intermedi: pentagrames" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Bottom-level contexts - voices" +msgstr "Contextos de nivell inferior: veus" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Keeping contexts alive" +msgstr "Manteniment dels contextos amb vida" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Modifying context plug-ins" +msgstr "Modificació dels connectors de contextos" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Changing context default settings" +msgstr "Canvi dels paràmetres predeterminats de configuració de contextos" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Defining new contexts" +msgstr "Definició de contextos nous" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Context layout order" +msgstr "Ordre de formats de contextos" + +#. @node in Documentation/notation/changing-defaults.itely +#. @section in Documentation/notation/changing-defaults.itely +msgid "Explaining the Internals Reference" +msgstr "Explicació del manual de referències internes" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Navigating the program reference" +msgstr "Navegació del manual de referència del programa" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Layout interfaces" +msgstr "Interfícies de format" + +# grob??? FVD +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Determining the grob property" +msgstr "Determinació de la propietat de l'objecte gràfic" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Naming conventions" +msgstr "Convencions dels noms" + +#. @node in Documentation/notation/changing-defaults.itely +#. @section in Documentation/notation/changing-defaults.itely +msgid "Modifying properties" +msgstr "Modificació de les propietats" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Overview of modifying properties" +msgstr "Panoràmica de la modificació de les propietats" + +#. @node in Documentation/notation/changing-defaults.itely +msgid "The set command" +msgstr "L'ordre set" + +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "The @code{@bs{}set} command" +msgstr "L'ordre @code{@bs{}set}" + +#. @node in Documentation/notation/changing-defaults.itely +msgid "The override command" +msgstr "L'ordre override" + +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "The @code{\\\\override} command" +msgstr "L'ordre @code{\\\\override}" + +#. @node in Documentation/notation/changing-defaults.itely +msgid "The tweak command" +msgstr "L'ordre tweak" + +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "The @code{\\\\tweak} command" +msgstr "L'ordre @code{\\\\tweak}" + +#. @node in Documentation/notation/changing-defaults.itely +msgid "set versus override" +msgstr "set contra override" + +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "@code{\\\\set} vs. @code{\\\\override}" +msgstr "@code{\\\\set} contra @code{\\\\override}" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Modifying alists" +msgstr "Modificació d'alists" + +#. @node in Documentation/notation/changing-defaults.itely +#. @section in Documentation/notation/changing-defaults.itely +msgid "Useful concepts and properties" +msgstr "Conceptes i propietats útils" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Input modes" +msgstr "Modes d'entrada" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Direction and placement" +msgstr "Direcció i posicionament" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Distances and measurements" +msgstr "Distàncies i mides" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Staff symbol properties" +msgstr "Propietats de símbols de pentagrama" + +# fuzzy. FVD +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Spanners" +msgstr "Objectes d'extensió" + +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Using the @code{spanner-interface}" +msgstr "Ús del @code{spanner-interface}" + +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Using the @code{line-spanner-interface}" +msgstr "Ús del @code{line-spanner-interface}" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Visibility of objects" +msgstr "Visibilitat dels objectes" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Removing the stencil" +msgstr "Supressió del patró" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Making objects transparent" +msgstr "Fer transparent els objectes" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Painting objects white" +msgstr "Pintura en blanc dels objectes" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Using break-visibility" +msgstr "Ús de break-visibility" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Special considerations" +msgstr "Consideracions especials" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Line styles" +msgstr "Estils de línia" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Rotating objects" +msgstr "Rotació d'objectes" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Rotating layout objects" +msgstr "Rotació d'objectes de presentació" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Rotating markup" +msgstr "Rotació de l'etiquetatge" + +#. @node in Documentation/notation/changing-defaults.itely +#. @section in Documentation/notation/changing-defaults.itely +msgid "Advanced tweaks" +msgstr "Apanyos avançats" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Aligning objects" +msgstr "Alineació d'objectes" + +#. @node in Documentation/notation/changing-defaults.itely +msgid "Setting X-offset and Y-offset directly" +msgstr "Establiment directe de X-offset i Y-offset" + +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Setting @code{X-offset} and @code{Y-offset} directly" +msgstr "Establiment directe de @code{X-offset} i @code{Y-offset}" + +#. @node in Documentation/notation/changing-defaults.itely +msgid "Using the side-position-interface" +msgstr "Ús del side-position-interface" + +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Using the @code{side-position-interface}" +msgstr "Ús del @code{side-position-interface}" + +#. @node in Documentation/notation/changing-defaults.itely +msgid "Using the self-alignment-interface" +msgstr "Ús del self-alignment-interface" + +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Using the @code{self-alignment-interface}" +msgstr "Ús del @code{self-alignment-interface}" + +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Using the @code{aligned-on-parent} procedures" +msgstr "Ús dels procediments @code{aligned-on-parent}" + +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Using the @code{centered-on-parent} procedures" +msgstr "Ús dels procediments @code{centered-on-parent}" + +#. @node in Documentation/notation/changing-defaults.itely +msgid "Using the break-alignable-interface" +msgstr "Ús del break-alignable-interface" + +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Using the @code{break-alignable-interface}" +msgstr "Ús del @code{break-alignable-interface}" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Vertical grouping of grobs" +msgstr "Agrupació vertical d'objectes gràfics" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Modifying stencils" +msgstr "Modificació dels patrons" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Modifying shapes" +msgstr "Modificació de les formes" + +#. @node in Documentation/notation/changing-defaults.itely +#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely +msgid "Modifying ties and slurs" +msgstr "Modificació de lligadures d'unió i d'expressió" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Unpure-pure containers" +msgstr "Contenidors unpure-pure" + +#. @node in Documentation/notation/changing-defaults.itely +#. @section in Documentation/notation/changing-defaults.itely +msgid "Using music functions" +msgstr "Ús de funcions musicals" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Substitution function syntax" +msgstr "Sintaxi de funcions de substitució" + +#. @node in Documentation/notation/changing-defaults.itely +#. @subsection in Documentation/notation/changing-defaults.itely +msgid "Substitution function examples" +msgstr "Exemples de funcions de substitució" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendix in Documentation/notation/notation-appendices.itely +msgid "Notation manual tables" +msgstr "Taules del manual sobre notació" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Chord name chart" +msgstr "Diagrama dels noms d'acord" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Common chord modifiers" +msgstr "Modificadors d'acords més habituals" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Predefined string tunings" +msgstr "Afinació de cordes predeterminades" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Predefined fretboard diagrams" +msgstr "Diagrames predefinits de trastos" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Predefined paper sizes" +msgstr "Mides predefinides de paper" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "MIDI instruments" +msgstr "Instruments MIDI" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "List of colors" +msgstr "Llista de colors" + +#. @subsubheading in Documentation/notation/notation-appendices.itely +msgid "Normal colors" +msgstr "Colors normals" + +#. @subsubheading in Documentation/notation/notation-appendices.itely +msgid "X color names" +msgstr "Noms de color de l'X" + +#. @subsubheading in Documentation/notation/notation-appendices.itely +msgid "Color Names without a numerical suffix:" +msgstr "Noms de color sense un sufix numèric:" + +#. @subsubheading in Documentation/notation/notation-appendices.itely +msgid "Color names with a numerical suffix" +msgstr "Nom de color amb un sufix numèric" + +#. @subsubheading in Documentation/notation/notation-appendices.itely +msgid "Grey Scale" +msgstr "Escala de grisos" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "The Feta font" +msgstr "El tipus de lletra Feta" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Clef glyphs" +msgstr "Glifs de clau" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Time Signature glyphs" +msgstr "Glifs de compàs" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Number glyphs" +msgstr "Glifs de números" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Accidental glyphs" +msgstr "Glifs de alteracions accidentals" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Default Notehead glyphs" +msgstr "Glifs predeterminats per al cap de les notes" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Special Notehead glyphs" +msgstr "Glifs especials per al cap de les notes" + +# Fuzzy.FVD +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Shape-note Notehead glyphs" +msgstr "Glifs Shape-note per al cap de les notes" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Rest glyphs" +msgstr "Glifs de silencis" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Flag glyphs" +msgstr "Glifs de claudators" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Dot glyphs" +msgstr "Glifs de puntet" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Dynamic glyphs" +msgstr "Glifs de matissos de dinàmica" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Script glyphs" +msgstr "Glifs d'scripts" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Arrowhead glyphs" +msgstr "Glifs de cap de fletxa" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Bracket-tip glyphs" +msgstr "Glifos d'extrems de claudators" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Pedal glyphs" +msgstr "Glifos de pedal" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Accordion glyphs" +msgstr "Glifos de acordió" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Tie glyphs" +msgstr "Glifos de lligadura" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Vaticana glyphs" +msgstr "Glifos de notació estil Vaticana" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Medicaea glyphs" +msgstr "Glifos de notació estil Medicaea" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Hufnagel glyphs" +msgstr "Glifos de notació estil Hufnagel" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Mensural glyphs" +msgstr "Glifos de notació estil Mensural" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Neomensural glyphs" +msgstr "Glifos de notació estil Neomensural" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Petrucci glyphs" +msgstr "Glifos de notació estil Petrucci" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Solesmes glyphs" +msgstr "Glifos de notació estil Solesmes" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Kievan Notation glyphs" +msgstr "Glifos de la notació del cant kievà" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Note head styles" +msgstr "Estils de cap de nota" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Text markup commands" +msgstr "Ordres d'etiquetatge de text" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Text markup list commands" +msgstr "Ordres de llista d'etiquetatge de text" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "List of special characters" +msgstr "Llista de caràcters especials" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "List of articulations" +msgstr "Llista d'articulacions" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Articulation scripts" +msgstr "Inscripcions d'articulació" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Ornament scripts" +msgstr "Scripts d'adorns" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Fermata scripts" +msgstr "Scripts de calderó" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Instrument-specific scripts" +msgstr "Scripts específics d'instruments" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Repeat sign scripts" +msgstr "Scripts de signes de repetició" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "Ancient scripts" +msgstr "Scripts de música antiga" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Percussion notes" +msgstr "Notes de percussió" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Technical glossary" +msgstr "Glossari tècnic" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "alist" +msgstr "alist" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "callback" +msgstr "callback" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "closure" +msgstr "tancament" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "glyph" +msgstr "glif" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "grob" +msgstr "objecte gràfic" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "immutable" +msgstr "immutable" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "interface" +msgstr "interfície" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "lexer" +msgstr "analitzador lèxic" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "mutable" +msgstr "mutable" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "output-def" +msgstr "output-def" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "parser" +msgstr "analitzador" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "parser variable" +msgstr "variable de l'analitzador" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "prob" +msgstr "prob" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "simple closure" +msgstr "tancament simple" + +#. @node in Documentation/notation/notation-appendices.itely +#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely +msgid "smob" +msgstr "smob" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "All context properties" +msgstr "Totes les propietats de context" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Layout properties" +msgstr "Propietats de format" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Available music functions" +msgstr "Funcions musicals disponibles" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Context modification identifiers" +msgstr "Identificadors de modificació de contextos" + +#. @node in Documentation/notation/notation-appendices.itely +#. @appendixsec in Documentation/notation/notation-appendices.itely +msgid "Predefined type predicates" +msgstr "Predicats predefinits de tipus" + +# Hoja para copiar en un examen. Chuleta?? FVD +#. @node in Documentation/notation/cheatsheet.itely +#. @appendix in Documentation/notation/cheatsheet.itely +msgid "Cheat sheet" +msgstr "Full de referència ràpida" + +#. @unnumberedsec in Documentation/snippets.tely +msgid "\\\\TEXT\\\\" +msgstr "\\\\TEXT\\\\" + +#. @node in Documentation/snippets.tely +msgid "\\\\PRE\\\\: \\\\\\\\TEXT\\\\\\\\" +msgstr "\\\\PRE\\\\: \\\\\\\\TEXT\\\\\\\\" + +#. @unnumberedsec in Documentation/snippets.tely +msgid "\\\\\\\\TEXT\\\\\\\\" +msgstr "\\\\\\\\TEXT\\\\\\\\" + +#. @node in Documentation/usage/running.itely +msgid "Running lilypond" +msgstr "Execució del lilypond" + +#. @chapter in Documentation/usage/running.itely +msgid "Running @command{lilypond}" +msgstr "Execució de l'ordre @command{lilypond}" + +#. @node in Documentation/usage/running.itely +#. @section in Documentation/usage/running.itely +msgid "Normal usage" +msgstr "Utilització normal" + +#. @node in Documentation/usage/running.itely +#. @section in Documentation/usage/running.itely +msgid "Command-line usage" +msgstr "Utilització des de la línia d'ordres" + +#. @node in Documentation/usage/running.itely +msgid "Invoking lilypond" +msgstr "Invocació del LilyPond" + +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "Invoking @command{lilypond}" +msgstr "Invocació de l'ordre @command{lilypond}" + +#. @unnumberedsubsubsec in Documentation/usage/running.itely +msgid "Standard shell commands" +msgstr "Ordres estàndard de l'intèrpret d'ordres" + +#. @node in Documentation/usage/running.itely +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "Basic command line options for LilyPond" +msgstr "Opcions bàsiques de línies d'ordre per al LilyPond" + +#. @node in Documentation/usage/running.itely +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "Advanced command line options for LilyPond" +msgstr "Opcions avançades de línies d'ordre per al LilyPond" + +#. @node in Documentation/usage/running.itely +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "Environment variables" +msgstr "Variables d'entorn" + +#. @node in Documentation/usage/running.itely +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "LilyPond in chroot jail" +msgstr "LilyPonde a una gàbia chroot" + +#. @subheading in Documentation/usage/running.itely +msgid "Example script for 32-bit Ubuntu 8.04" +msgstr "Guió d'exemple per a l'Ubuntu 8.04 de 32 bits" + +#. @node in Documentation/usage/running.itely +#. @section in Documentation/usage/running.itely +msgid "Error messages" +msgstr "Missatges d'error" + +#. @node in Documentation/usage/running.itely +#. @section in Documentation/usage/running.itely +msgid "Common errors" +msgstr "Errors més habituals" + +#. @node in Documentation/usage/running.itely +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "Music runs off the page" +msgstr "La música se surt de la pàgina" + +#. @node in Documentation/usage/running.itely +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "An extra staff appears" +msgstr "Hi apareix un pentagrama de més" + +#. @node in Documentation/usage/running.itely +msgid "Apparent error in ../ly/init.ly" +msgstr "Error aparent a ../ly/init.ly" + +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "Apparent error in @code{../ly/init.ly}" +msgstr "Error aparent a @code{../ly/init.ly}" + +#. @node in Documentation/usage/running.itely +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "Error message Unbound variable %" +msgstr "Missatge d'error de Variable % sense afitar" + +#. @node in Documentation/usage/running.itely +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "Error message FT_Get_Glyph_Name" +msgstr "Missatge d'error FT_Get_Glyph_Name" + +#. @node in Documentation/usage/running.itely +#. @unnumberedsubsec in Documentation/usage/running.itely +msgid "Warning staff affinities should only decrease" +msgstr "Advertiment les afinitats de pentagrama sols han de disminuir" + +#. @node in Documentation/usage/updating.itely +msgid "Updating files with convert-ly" +msgstr "Actualitzar fitxers amb convert-ly" + +#. @chapter in Documentation/usage/updating.itely +msgid "Updating files with @command{convert-ly}" +msgstr "Actualitzar fitxers amb @command{convert-ly}" + +#. @node in Documentation/usage/updating.itely +#. @section in Documentation/usage/updating.itely +msgid "Why does the syntax change?" +msgstr "Perquè canvia la sintaxi?" + +#. @node in Documentation/usage/updating.itely +msgid "Invoking convert-ly" +msgstr "Invocació de convert-ly" + +#. @section in Documentation/usage/updating.itely +msgid "Invoking @command{convert-ly}" +msgstr "Invocació de @command{convert-ly}" + +#. @node in Documentation/usage/updating.itely +msgid "Command line options for convert-ly" +msgstr "Opcions de la línia d'ordres per convert-ly" + +#. @section in Documentation/usage/updating.itely +msgid "Command line options for @command{convert-ly}" +msgstr "Opcions de la línia de ordres para @command{convert-ly}" + +#. @node in Documentation/usage/updating.itely +msgid "Problems running convert-ly" +msgstr "Problemes a executar convert-ly" + +#. @section in Documentation/usage/updating.itely +msgid "Problems running @code{convert-ly}" +msgstr "Problemes a executar @code{convert-ly}" + +#. @node in Documentation/usage/updating.itely +#. @section in Documentation/usage/updating.itely +msgid "Manual conversions" +msgstr "Conversions manuals" + +#. @node in Documentation/usage/lilypond-book.itely +msgid "lilypond-book" +msgstr "lilypond-book" + +#. @chapter in Documentation/usage/lilypond-book.itely +msgid "Running @command{lilypond-book}" +msgstr "Execució de @command{lilypond-book}" + +#. @node in Documentation/usage/lilypond-book.itely +#. @section in Documentation/usage/lilypond-book.itely +msgid "An example of a musicological document" +msgstr "Un exemple de document musicològic" + +#. @subheading in Documentation/usage/lilypond-book.itely +msgid "Input" +msgstr "Entrada" + +#. @subheading in Documentation/usage/lilypond-book.itely +msgid "Processing" +msgstr "Procés" + +#. @subheading in Documentation/usage/lilypond-book.itely +msgid "Output" +msgstr "Sortida" + +#. @node in Documentation/usage/lilypond-book.itely +#. @section in Documentation/usage/lilypond-book.itely +msgid "Integrating music and text" +msgstr "Integració de música i text" + +#. @node in Documentation/usage/lilypond-book.itely +#. @subsection in Documentation/usage/lilypond-book.itely +msgid "LaTeX" +msgstr "LaTeX" + +#. @subsection in Documentation/usage/lilypond-book.itely +#. @subsubheading in Documentation/usage/lilypond-book.itely +msgid "@LaTeX{}" +msgstr "@LaTeX{}" + +#. @node in Documentation/usage/lilypond-book.itely +#. @subsection in Documentation/usage/lilypond-book.itely +#. @subsubheading in Documentation/usage/lilypond-book.itely +#. @subsection in Documentation/usage/lilypond-book.itely +msgid "Texinfo" +msgstr "Texinfo" + +#. @node in Documentation/usage/lilypond-book.itely +#. @subsection in Documentation/usage/lilypond-book.itely +msgid "HTML" +msgstr "HTML" + +#. @node in Documentation/usage/lilypond-book.itely +#. @subsection in Documentation/usage/lilypond-book.itely +msgid "DocBook" +msgstr "DocBook" + +#. @subheading in Documentation/usage/lilypond-book.itely +msgid "Common conventions" +msgstr "Convencions habituals" + +#. @subheading in Documentation/usage/lilypond-book.itely +msgid "Including a LilyPond file" +msgstr "Incloure un fitxer del LilyPond" + +#. @subheading in Documentation/usage/lilypond-book.itely +msgid "Including LilyPond code" +msgstr "Inclusió de codi del LilyPond" + +#. @subheading in Documentation/usage/lilypond-book.itely +msgid "Processing the DocBook document" +msgstr "Procés del document del DocBook" + +#. @node in Documentation/usage/lilypond-book.itely +#. @section in Documentation/usage/lilypond-book.itely +msgid "Music fragment options" +msgstr "Opcions de fragment de música" + +#. @node in Documentation/usage/lilypond-book.itely +msgid "Invoking lilypond-book" +msgstr "Invocació de lilypond-book" + +#. @section in Documentation/usage/lilypond-book.itely +msgid "Invoking @command{lilypond-book}" +msgstr "Invocació de @command{lilypond-book}" + +#. @subheading in Documentation/usage/lilypond-book.itely +msgid "Format-specific instructions" +msgstr "Instruccions específiques de format" + +#. @subheading in Documentation/usage/lilypond-book.itely +msgid "Command line options" +msgstr "Opcions de la línia d'ordres" + +#. @node in Documentation/usage/lilypond-book.itely +#. @section in Documentation/usage/lilypond-book.itely +msgid "Filename extensions" +msgstr "Extensions de noms de fitxer" + +#. @node in Documentation/usage/lilypond-book.itely +#. @section in Documentation/usage/lilypond-book.itely +msgid "lilypond-book templates" +msgstr "plantilles de lilypond-book" + +#. @subsection in Documentation/usage/lilypond-book.itely +msgid "html" +msgstr "html" + +#. @subsection in Documentation/usage/lilypond-book.itely +msgid "xelatex" +msgstr "xelatex" + +# this is the same translation that babel LaTex package uses . FVD +#. @node in Documentation/usage/lilypond-book.itely +#. @section in Documentation/usage/lilypond-book.itely +msgid "Sharing the table of contents" +msgstr "Compartir l'índex general" + +#. @subsubheading in Documentation/usage/lilypond-book.itely +msgid "Exporting the ToC from LilyPond" +msgstr "Exportar l'índex general des del LilyPond" + +#. @subsubheading in Documentation/usage/lilypond-book.itely +msgid "Importing the ToC into LaTeX" +msgstr "Importar l'índex general dins del LaTeX" + +#. @node in Documentation/usage/lilypond-book.itely +msgid "Alternate methods of mixing text and music" +msgstr "Mètodes alternatius per barrejar text i música" + +#. @section in Documentation/usage/lilypond-book.itely +msgid "Alternative methods of mixing text and music" +msgstr "Altres mètodes per barrejar text i música" + +#. @node in Documentation/usage/external.itely +#. @chapter in Documentation/usage/external.itely +msgid "External programs" +msgstr "Programes externs" + +#. @node in Documentation/usage/external.itely +#. @section in Documentation/usage/external.itely +msgid "Point and click" +msgstr "Apuntar i clicar" + +#. @node in Documentation/usage/external.itely +#. @unnumberedsubsec in Documentation/usage/external.itely +msgid "Enabling point and click" +msgstr "Activació d'apuntar i clicar" + +#. @node in Documentation/usage/external.itely +#. @unnumberedsubsec in Documentation/usage/external.itely +msgid "Selective point-and-click" +msgstr "Apuntar i clicar selectiu" + +#. @node in Documentation/usage/external.itely +#. @section in Documentation/usage/external.itely +msgid "Text editor support" +msgstr "Suport d'editors de text" + +#. @node in Documentation/usage/external.itely +#. @unnumberedsubsec in Documentation/usage/external.itely +msgid "Emacs mode" +msgstr "Mode d'Emacs" + +#. @node in Documentation/usage/external.itely +#. @unnumberedsubsec in Documentation/usage/external.itely +msgid "Vim mode" +msgstr "Mode de Vim" + +#. @node in Documentation/usage/external.itely +#. @unnumberedsubsec in Documentation/usage/external.itely +msgid "Other editors" +msgstr "Altres editors" + +#. @node in Documentation/usage/external.itely +#. @section in Documentation/usage/external.itely +msgid "Converting from other formats" +msgstr "Conversió des d'altres formats" + +#. @node in Documentation/usage/external.itely +msgid "Invoking midi2ly" +msgstr "Invocació de midi2ly" + +#. @subsection in Documentation/usage/external.itely +msgid "Invoking @command{midi2ly}" +msgstr "Invocació de @command{midi2ly}" + +#. @node in Documentation/usage/external.itely +msgid "Invoking musicxml2ly" +msgstr "Invocar musicxml2ly" + +#. @subsection in Documentation/usage/external.itely +msgid "Invoking @code{musicxml2ly}" +msgstr "Invocació de @command{musicxml2ly}" + +#. @node in Documentation/usage/external.itely +msgid "Invoking abc2ly" +msgstr "Invocació d'abc2ly" + +#. @subsection in Documentation/usage/external.itely +msgid "Invoking @code{abc2ly}" +msgstr "Invocació d'@code{abc2ly}" + +#. @node in Documentation/usage/external.itely +msgid "Invoking etf2ly" +msgstr "Invocació d'etf2ly" + +#. @subsection in Documentation/usage/external.itely +msgid "Invoking @command{etf2ly}" +msgstr "Invocació d'@command{etf2ly}" + +#. @node in Documentation/usage/external.itely +#. @subsection in Documentation/usage/external.itely +msgid "Other formats" +msgstr "Altres formats" + +#. @node in Documentation/usage/external.itely +#. @section in Documentation/usage/external.itely +msgid "LilyPond output in other programs" +msgstr "Sortida del LilyPond a altres programes" + +#. @node in Documentation/usage/external.itely +#. @unnumberedsubsec in Documentation/usage/external.itely +msgid "Many quotes from a large score" +msgstr "Moltes cites d'una partitura extensa" + +#. @node in Documentation/usage/external.itely +#. @unnumberedsubsec in Documentation/usage/external.itely +msgid "Inserting LilyPond output into OpenOffice.org" +msgstr "Inserció de la sortida del LilyPond dins d'altres programes" + +#. @node in Documentation/usage/external.itely +#. @unnumberedsubsec in Documentation/usage/external.itely +msgid "Inserting LilyPond output into other programs" +msgstr "Inserció de la sortida del Lilypond dins d'altres programes" + +#. @node in Documentation/usage/external.itely +msgid "Independent includes" +msgstr "Fitxers independents d'inclusió" + +#. @section in Documentation/usage/external.itely +msgid "Independent @code{include}s" +msgstr "Fitxers d'inclusió independents amb @code{include}" + +#. @node in Documentation/usage/external.itely +#. @subsection in Documentation/usage/external.itely +msgid "MIDI articulation" +msgstr "Articulació MIDI" + +#. @node in Documentation/usage/suggestions.itely +#. @chapter in Documentation/usage/suggestions.itely +msgid "Suggestions for writing files" +msgstr "Suggeriments per escriure fitxers" + +#. @node in Documentation/usage/suggestions.itely +#. @section in Documentation/usage/suggestions.itely +msgid "General suggestions" +msgstr "Suggeriments generals" + +#. @node in Documentation/usage/suggestions.itely +#. @section in Documentation/usage/suggestions.itely +msgid "Typesetting existing music" +msgstr "Escriptura de música existent" + +#. @node in Documentation/usage/suggestions.itely +#. @section in Documentation/usage/suggestions.itely +msgid "Large projects" +msgstr "Projectes grans" + +#. @node in Documentation/usage/suggestions.itely +#. @section in Documentation/usage/suggestions.itely +msgid "Troubleshooting" +msgstr "Solució de problemes" + +#. @node in Documentation/usage/suggestions.itely +#. @section in Documentation/usage/suggestions.itely +msgid "Make and Makefiles" +msgstr "Make i els Makefiles" + +#. @node in Documentation/cs/learning.tely +#. @appendix in Documentation/cs/learning.tely +msgid "Rejstřík k LilyPondu" +msgstr "" + +#. @top in Documentation/cs/macros.itexi +msgid "LilyPond -- \\\\TITLE\\\\" +msgstr "LilyPond -- \\\\TITLE\\\\" + +#. @subsubheading in Documentation/cs/macros.itexi +msgid "Předem stanovené příkazy" +msgstr "" + +#. @subsubheading in Documentation/cs/macros.itexi +msgid "Vybrané úryvky" +msgstr "" + +#. @subsubheading in Documentation/cs/macros.itexi +msgid "Podívejte se také na" +msgstr "" + +#. @subsubheading in Documentation/cs/macros.itexi +msgid "Známé potíže a upozornění" +msgstr "" + +#. Documentation/cs/learning/tutorial.itely:250 (comment) +msgid "Počáteční bod napsat na jednočárkovaném C" +msgstr "" + +#. Documentation/cs/learning/tutorial.itely:284 (comment) +msgid "dvoučárkované C" +msgstr "" + +#. Documentation/cs/learning/tutorial.itely:301 (comment) +msgid "c je 1 řádek nahoru, tedy c nad b" +msgstr "" + +#. Documentation/cs/learning/tutorial.itely:302 (comment) +msgid "d je 2 řádky nahoru, nebo 5 dolů, tedy d nad b" +msgstr "" + +#. Documentation/cs/learning/tutorial.itely:303 (comment) +msgid "e je 3 nahoru, nebo 4 dolů, tedy e pod b" +msgstr "" + +#. Documentation/cs/learning/tutorial.itely:304 (comment) +msgid "a je 6 nahoru, nebo 1 dolů, tedy a pod b" +msgstr "" + +#. Documentation/cs/learning/tutorial.itely:305 (comment) +msgid "g je 5 nahoru, nebo 2 dolů, tedy g pod b" +msgstr "" + +#. Documentation/cs/learning/tutorial.itely:306 (comment) +msgid "f je 4 nahoru, nebo 3 dolů, tedy f pod b" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @chapter in Documentation/cs/learning/tutorial.itely +msgid "Cvičení" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Přeložení zdrojového souboru" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Zadání not" +msgstr "" + +#. @subheading in Documentation/cs/learning/tutorial.itely +msgid "Pohled na výsledky" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Příkazový řádek" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @section in Documentation/cs/learning/tutorial.itely +msgid "Jak se píší vstupní soubory" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Jednoduchý notový zápis" +msgstr "" + +#. @subheading in Documentation/cs/learning/tutorial.itely +msgid "Výšky tónů" +msgstr "" + +#. @subheading in Documentation/cs/learning/tutorial.itely +msgid "Délky tónů (rytmy)" +msgstr "" + +#. @subheading in Documentation/cs/learning/tutorial.itely +msgid "Pomlky" +msgstr "" + +#. @subheading in Documentation/cs/learning/tutorial.itely +msgid "Taktové označení" +msgstr "" + +#. @subheading in Documentation/cs/learning/tutorial.itely +msgid "Vyznačení tempa" +msgstr "" + +#. @subheading in Documentation/cs/learning/tutorial.itely +msgid "Notový klíč" +msgstr "" + +#. @subheading in Documentation/cs/learning/tutorial.itely +msgid "Vše dohromady" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Práce na vstupních souborech" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @section in Documentation/cs/learning/tutorial.itely +msgid "Vypořádání se s chybami" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Obecné rady k řešení chyb" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Některé časté chyby" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @section in Documentation/cs/learning/tutorial.itely +msgid "Jak číst příručky" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Vypuštěný materiál" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Klepnutelné příklady" +msgstr "" + +#. @node in Documentation/cs/learning/tutorial.itely +#. @subsection in Documentation/cs/learning/tutorial.itely +msgid "Přehled o příručkách" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @chapter in Documentation/cs/learning/common-notation.itely +msgid "Běžný notový zápis" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @section in Documentation/cs/learning/common-notation.itely +msgid "Notový zápis v jedné notové osnově" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Přezkoušení taktů" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Předznamenání a označení tóniny (předznamenání)" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Předznamenání" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Označení tóniny (předznamenání)" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Varování: označení tóniny a výšky tónů" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Ligatury a legatové obloučky" +msgstr "" + +# de neuma? FVD +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Ligatury" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Legatové obloučky" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Frázovací obloučky" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Varování: ligatury nejsou legatovými obloučky" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Artikulační znaménka a hlasitost" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Artikulační znaménka" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Prstoklad" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Dynamika" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Přidání textu" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Automatické a ruční trámce" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Dodatečné rytmické příkazy" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Předtaktí" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Jiná rytmická rozdělení" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Ozdoby" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @section in Documentation/cs/learning/common-notation.itely +msgid "Více not najednou" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Vysvětlení hudebních výrazů" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Obdoba: matematické výrazy" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Souběžné hudební výrazy: více notových osnov" +msgstr "" + +#. @subheading in Documentation/cs/learning/common-notation.itely +msgid "Souběžné hudební výrazy: jedna notová osnova" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Více notových osnov" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Seskupení notových osnov" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Spojení not do akordů" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Vícehlasost v jedné notové osnově" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @section in Documentation/cs/learning/common-notation.itely +msgid "Písničky" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Zápis jednoduchých písní" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Vyrovnání textu s melodií" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Text pro více osnov" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @section in Documentation/cs/learning/common-notation.itely +msgid "Poslední úpravy" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Pořádání děl pomocí proměnných" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Přidání názvu" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Absolutní označení not" +msgstr "" + +#. @node in Documentation/cs/learning/common-notation.itely +#. @subsection in Documentation/cs/learning/common-notation.itely +msgid "Po cvičení" +msgstr "" + +#. Documentation/cs/learning/fundamental.itely:3177 (comment) +msgid "set time signature and key" +msgstr "estableix l'armadura i la duració del compàs" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @chapter in Documentation/cs/learning/fundamental.itely +msgid "Základní pojmy" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @section in Documentation/cs/learning/fundamental.itely +msgid "Jak pracují vstupní soubory LilyPondu" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Uvedení do stavby souboru v LilyPondu" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Notový zápis je jedním (jediným) složeným hudebním výrazem" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Naskládání hudebních výrazů do sebe" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "O ne-naskládatelnosti závorek a ligatur" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @section in Documentation/cs/learning/fundamental.itely +msgid "Hlasy obsahují noty" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Slyším hlasy" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Přímo vyjádřené začátky hlasů" +msgstr "" + +#. @subsubheading in Documentation/cs/learning/fundamental.itely +msgid "Notenkolumnen" +msgstr "Columnes de notes" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Hlasy a zpěvy" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @section in Documentation/cs/learning/fundamental.itely +msgid "Prostředí a rytci" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Vysvětlení prostředí" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Vytvoření prostředí" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Vysvětlení rytců" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Změna vlastností prostředí" +msgstr "" + +#. @subsubheading in Documentation/cs/learning/fundamental.itely +msgid "Kontexteigenschaften mit @code{\\\\with} setzen" +msgstr "Establiment de propietats de context amb @cod{\\\\with}" + +#. @subsubheading in Documentation/cs/learning/fundamental.itely +msgid "Kontexteigenschaften mit @code{\\\\context} setzen" +msgstr "Establiment de propietats de context amb @cod{\\\\with}" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Přidání a odstranění rytců" +msgstr "" + +#. @subsubheading in Documentation/cs/learning/fundamental.itely +msgid "Einen einzelnen Kontext verändern" +msgstr "Canviar un context únic" + +#. @subsubheading in Documentation/cs/learning/fundamental.itely +msgid "Alle Kontexte des gleichen Typs verändern" +msgstr "Canviar tots els contextos del mateix tipus" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @section in Documentation/cs/learning/fundamental.itely +msgid "Rozšíření příkladů" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Soprán a violoncello" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Čtyřhlasý notový zápis SATB" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Vytvoření notového zápisu od základu" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Úspora psaní na stroji pomocí proměnných a funkcí" +msgstr "" + +#. @node in Documentation/cs/learning/fundamental.itely +#. @subsection in Documentation/cs/learning/fundamental.itely +msgid "Notové zápisy a hlasy" +msgstr "" + +#. Documentation/cs/learning/tweaks.itely:3626 (comment) +#. Documentation/cs/learning/tweaks.itely:3699 (comment) +msgid "Move the c2 out of the main note column so the merge will work" +msgstr "Treure el Do blanca fora de la columna principal de notes perquè funcioni la funció" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @chapter in Documentation/cs/learning/tweaks.itely +msgid "Ladění výstupu" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @section in Documentation/cs/learning/tweaks.itely +msgid "Základy pro ladění" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Úvod do ladění" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Předměty a rozhraní" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Pravidla pro pojmenovávání předmětů a vlastností" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Postupy při ladění" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @section in Documentation/cs/learning/tweaks.itely +msgid "Vnitřní referenční příručka" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Vlastnosti předmětů v rozvržení" +msgstr "" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "Den Kontext finden" +msgstr "Cerca del context" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "Nur einmal mit \\\\override verändern" +msgstr "Canvi d'una sola vegada amb \\\\override" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "Rückgängig machen" +msgstr "Retrocedeix" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Vlastnosti nacházející se v rozhraních" +msgstr "" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "Den Kontext im Liedtextmodus bestimmen" +msgstr "Establir el context a mode de lletra" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Typy vlastností" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @section in Documentation/cs/learning/tweaks.itely +msgid "Vzhled předmětů" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Viditelnost a barva předmětů" +msgstr "" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "stencil (Matrize)" +msgstr "stencil (Patró)" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "break-visibility (unsichtbar machen)" +msgstr "break-visibility (fes-lo invisible)" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "transparent (durchsichtig)" +msgstr "transparent" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "color (Farbe)" +msgstr "color" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Velikost předmětů" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Délka a tloušťka předmětů" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @section in Documentation/cs/learning/tweaks.itely +msgid "Umístění předmětů" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Automatické chování" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Předměty uvnitř notové osnovy" +msgstr "" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "Fingersatz" +msgstr "Digitació" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Předměty vně notové osnovy" +msgstr "" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "\\\\textLengthOn (Textlänge berücksichtigen)" +msgstr "\\\\textLengthOn (confirmar l'amplada del text)" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "Dynamik" +msgstr "Dinàmica" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "Verändern der Größe von grobs" +msgstr "Canviar la mida dels objectes gràfics textuals" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @section in Documentation/cs/learning/tweaks.itely +msgid "Střety předmětů" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Přesouvání předmětů" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Oprava překrývajících se not" +msgstr "" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "padding (Fülleigenschafte)" +msgstr "padding (Propietat de farciment)" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "right-padding (Verschieben nach links)" +msgstr "right-padding (Desplaçar cap a l'esquerra)" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "staff-padding (Systemfüllungseigenschaft)" +msgstr "staff-padding (Propietat de farciment del pentagrama)" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "self-alignment-X (Selbstausrichtung-X-Eigenschaft)" +msgstr "self-alignment-X (Propietat d'alineació automàtica)" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "staff-position (Position innerhalb des Systems)" +msgstr "staff-position (Posició del pentagrama)" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "extra-offset (Genaues Positionieren)" +msgstr "extra-offset (Posicionament exacte)" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "Ausrichtungseigenschaft" +msgstr "Propietat d'orientació" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "force-hshift (vertikale Verschiebunseigenschaft)" +msgstr "force-hshift (Propietat de desplaçament horitzontal)" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Příklady ze života" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @section in Documentation/cs/learning/tweaks.itely +msgid "Další ladění" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Jiné využití ladění" +msgstr "" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "Noten zwischen unterschiedlichen Stimmen überbinden" +msgstr "Lligar notes entre veus diferents" + +#. @subheading in Documentation/cs/learning/tweaks.itely +msgid "Eine Fermate in MIDI simulieren" +msgstr "Simular una fermata al MIDI" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Použití proměnných pro ladění" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Celkové formátování" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Více informací" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Vyhnutí se ladění s pomalejším překladem" +msgstr "" + +#. @node in Documentation/cs/learning/tweaks.itely +#. @subsection in Documentation/cs/learning/tweaks.itely +msgid "Pokročilá ladění se Scheme" +msgstr "" + +#. @node in Documentation/cs/learning/templates.itely +#. @appendix in Documentation/cs/learning/templates.itely +msgid "Předlohy" +msgstr "" + +#. @node in Documentation/cs/learning/templates.itely +#. @appendixsec in Documentation/cs/learning/templates.itely +msgid "Jednotlivá notová osnova" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Pouze noty" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Noty a text" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Noty a názvy akordů" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Noty, text a názvy akordů" +msgstr "" + +#. @node in Documentation/cs/learning/templates.itely +#. @appendixsec in Documentation/cs/learning/templates.itely +msgid "Klavírní předlohy" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Klavírní sólo" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Klavír a hlas zpěvu" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Klavír s vystředěným textem" +msgstr "" + +#. @node in Documentation/cs/learning/templates.itely +#. @appendixsec in Documentation/cs/learning/templates.itely +msgid "Smyčcový kvartet" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Jednoduchá smyčcový kvartet" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Hlasy smyčcového kvartetu" +msgstr "" + +#. @node in Documentation/cs/learning/templates.itely +#. @appendixsec in Documentation/cs/learning/templates.itely +msgid "Vokální soubor" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Notový zápis SATB" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Notový zápis SATB a automatický klavírní výtah" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "SATB s příslušnými prostředími" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Sólový zpěv a dvojhlasný refrén" +msgstr "" + +#. @node in Documentation/cs/learning/templates.itely +#. @appendixsec in Documentation/cs/learning/templates.itely +msgid "Orchestrální předloha" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Orchestr, sbor a klavír" +msgstr "" + +#. @node in Documentation/cs/learning/templates.itely +#. @appendixsec in Documentation/cs/learning/templates.itely +msgid "Předlohy pro starý notový zápis" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Přepis menzurální hudby" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Předlohy pro přepis gregorianik" +msgstr "" + +#. @node in Documentation/cs/learning/templates.itely +#. @appendixsec in Documentation/cs/learning/templates.itely +msgid "Jiné předlohy" +msgstr "" + +#. @appendixsubsec in Documentation/cs/learning/templates.itely +msgid "Džezová skupina" +msgstr "" + +#. Documentation/snippets/accordion-discant-symbols.ly:42 (variable) +msgid "discant" +msgstr "discanto" + +#. Documentation/snippets/accordion-discant-symbols.ly:45 (variable) +#. Documentation/snippets/anglican-psalm-template.ly:89 (variable) +msgid "dot" +msgstr "punt" + +#. Documentation/snippets/accordion-discant-symbols.ly:51 (comment) +msgid "16 voets register" +msgstr "registre de 16 peus" + +#. Documentation/snippets/accordion-discant-symbols.ly:52 (variable) +msgid "accBasson" +msgstr "accBasson" + +#. Documentation/snippets/accordion-discant-symbols.ly:58 (comment) +msgid "een korig 8 en 16 voets register" +msgstr "registre d'een korig 8 en 16 peus" + +#. Documentation/snippets/accordion-discant-symbols.ly:59 (variable) +msgid "accBandon" +msgstr "accBandon" + +#. Documentation/snippets/accordion-discant-symbols.ly:67 (variable) +msgid "accVCello" +msgstr "accVCello" + +#. Documentation/snippets/accordion-discant-symbols.ly:77 (comment) +msgid "4-8-16 voets register" +msgstr "registre de 4-8-16 pies" + +#. Documentation/snippets/accordion-discant-symbols.ly:78 (variable) +msgid "accHarmon" +msgstr "accHarmon" + +#. Documentation/snippets/accordion-discant-symbols.ly:88 (variable) +msgid "accTrombon" +msgstr "accTrombon" + +#. Documentation/snippets/accordion-discant-symbols.ly:100 (comment) +msgid "eenkorig 4 en 16 voets register" +msgstr "registre d'eenkorig 4 i 16 peus" + +#. Documentation/snippets/accordion-discant-symbols.ly:101 (variable) +msgid "accOrgan" +msgstr "accOrgan" + +#. Documentation/snippets/accordion-discant-symbols.ly:109 (variable) +msgid "accMaster" +msgstr "accMaster" + +#. Documentation/snippets/accordion-discant-symbols.ly:123 (variable) +msgid "accAccord" +msgstr "accAccord" + +#. Documentation/snippets/accordion-discant-symbols.ly:135 (variable) +msgid "accMusette" +msgstr "accMusette" + +#. Documentation/snippets/accordion-discant-symbols.ly:145 (variable) +msgid "accCeleste" +msgstr "accCeleste" + +#. Documentation/snippets/accordion-discant-symbols.ly:153 (variable) +msgid "accOboe" +msgstr "accOboe" + +#. Documentation/snippets/accordion-discant-symbols.ly:161 (variable) +msgid "accClarin" +msgstr "accClarin" + +#. Documentation/snippets/accordion-discant-symbols.ly:167 (variable) +msgid "accPiccolo" +msgstr "accPiccolo" + +#. Documentation/snippets/accordion-discant-symbols.ly:173 (variable) +msgid "accViolin" +msgstr "accViolin" + +#. Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly:54 (variable) +msgid "continuo" +msgstr "continuo" + +#. Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly:57 (comment) +msgid "\\bassFigureStaffAlignmentUp" +msgstr "\\bassFigureStaffAlignmentUp" + +#. Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly:61 (comment) +msgid "\\bassFigureStaffAlignmentDown" +msgstr "\\bassFigureStaffAlignmentDown" + +#. Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly:66 (context id) +#. Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly:67 (context id) +msgid "bassStaff" +msgstr "bassStaff" + +#. Documentation/snippets/adding-drum-parts.ly:53 (variable) +msgid "drh" +msgstr "drh" + +#. Documentation/snippets/adding-drum-parts.ly:54 (variable) +msgid "drl" +msgstr "drl" + +#. Documentation/snippets/adding-drum-parts.ly:55 (variable) +msgid "timb" +msgstr "timb" + +#. Documentation/snippets/adding-extra-fingering-with-scheme.ly:44 (variable) +msgid "addScript" +msgstr "addScript" + +#. Documentation/snippets/adding-fingerings-to-tablatures.ly:40 (variable) +#. Documentation/snippets/jazz-combo-template.ly:237 (context id) +#. Documentation/snippets/jazz-combo-template.ly:246 (context id) +msgid "two" +msgstr "dos" + +#. Documentation/snippets/adding-fingerings-to-tablatures.ly:41 (variable) +msgid "threeTwo" +msgstr "threeTwo" + +#. Documentation/snippets/adding-fingerings-to-tablatures.ly:48 (variable) +msgid "threeFour" +msgstr "threeFour" + +#. Documentation/snippets/adding-indicators-to-staves-which-get-split-after-a-break.ly:39 (variable) +msgid "splitStaffBarLineMarkup" +msgstr "splitStaffBarLineMarkup" + +#. Documentation/snippets/adding-indicators-to-staves-which-get-split-after-a-break.ly:45 (variable) +msgid "splitStaffBarLine" +msgstr "splitStaffBarLine" + +#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:91 (variable) +msgid "cueWhile" +msgstr "cueWhile" + +#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:104 (variable) +msgid "flute" +msgstr "flauta" + +#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:110 (variable) +msgid "clarinet" +msgstr "clarinet" + +#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:119 (variable) +msgid "pianoRH" +msgstr "pianoRH" + +#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:124 (variable) +msgid "pianoLH" +msgstr "pianoLH" + +#. Documentation/snippets/adding-the-current-date-to-a-score.ly:36 (comment) +msgid "first, define a variable to hold the formatted date:" +msgstr "primer definim una variable per desar la data amb format:" + +#. Documentation/snippets/adding-the-current-date-to-a-score.ly:37 (variable) +msgid "date" +msgstr "data" + +#. Documentation/snippets/adding-the-current-date-to-a-score.ly:37 (comment) +msgid "d-%m-%Y\\\" (localtime (current-time)))" +msgstr "d-%m-%Y\\\" (localtime (current-time)))" + +#. Documentation/snippets/adding-the-current-date-to-a-score.ly:39 (comment) +msgid "use it in the title block:" +msgstr "usa-la al bloc petit:" + +#. Documentation/snippets/adding-the-current-date-to-a-score.ly:50 (comment) +msgid "and use it in a \\markup block:" +msgstr "i usa-la a un bloc \\markup:" + +#. Documentation/snippets/additional-voices-to-avoid-collisions.ly:55 (variable) +msgid "voiceFive" +msgstr "voiceFive" + +#. Documentation/snippets/adjusting-grace-note-spacing.ly:30 (variable) +msgid "graceNotes" +msgstr "graceNotes" + +#. Documentation/snippets/adjusting-lyrics-vertical-spacing.ly:37 (comment) +msgid "Default layout:" +msgstr "Format predeterminat" + +#. Documentation/snippets/adjusting-lyrics-vertical-spacing.ly:53 (comment) +msgid "Reducing the minimum space below the staff and above the lyrics:" +msgstr "Reducció de l'espai mínim a sota del pentagrama i a sobre de la lletra:" + +#. Documentation/snippets/aligning-bar-numbers.ly:65 (comment) +#. Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly:51 (comment) +msgid "Increase the size of the bar number by 2" +msgstr "Augmenta en 2 la mida del número del compàs" + +#. Documentation/snippets/aligning-bar-numbers.ly:67 (comment) +#. Documentation/snippets/printing-bar-numbers-at-regular-intervals.ly:63 (comment) +msgid "Print a bar number every second measure" +msgstr "Imprimeix el número de compàs cada dos compassos" + +#. Documentation/snippets/aligning-bar-numbers.ly:70 (comment) +msgid "Center-align bar numbers" +msgstr "Alinea els números de compàs al centre" + +#. Documentation/snippets/aligning-bar-numbers.ly:73 (comment) +msgid "Left-align bar numbers" +msgstr "Alinea els números de compàs a l'esquerra" + +#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:90 (comment) +msgid "the RehearsalMark will be centered above the Clef" +msgstr "la RehearsalMark se centrarà sobre la clau" + +#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:97 (comment) +msgid "the RehearsalMark will be centered above the TimeSignature" +msgstr "la RehearsalMark se centrarà sobre el compàs" + +#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:105 (comment) +msgid "the RehearsalMark will be centered above the KeySignature" +msgstr "la RehearsalMark se centrarà sobre l'armadura" + +#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:116 (comment) +#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:128 (comment) +msgid "the RehearsalMark will be aligned with the left edge of the KeySignature" +msgstr "la RehearsalMark s'alinearà per l'esquerra amb l'armadura" + +#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:122 (comment) +msgid "the RehearsalMark will be aligned with the right edge of the KeySignature" +msgstr "la RehearsalMark se alinearà per la dreta amb l'armadura" + +#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:129 (comment) +msgid "and then shifted right by one unit." +msgstr "i es desplaçarà una unitat cap a la dreta." + +#. Documentation/snippets/ancient-fonts.ly:40 (variable) +#. Documentation/snippets/ancient-fonts.ly:40 (context id) +msgid "upperStaff" +msgstr "upperStaff" + +#. Documentation/snippets/ancient-fonts.ly:52 (comment) +msgid "\\break % 1 (8*1)" +msgstr "\\break % 1 (8*1)" + +#. Documentation/snippets/ancient-fonts.ly:63 (comment) +msgid "\\break %2 (8*1)" +msgstr "\\break %2 (8*1)" + +#. Documentation/snippets/ancient-fonts.ly:75 (comment) +msgid "\\break % 3 (8*1)" +msgstr "\\break % 3 (8*1)" + +#. Documentation/snippets/ancient-fonts.ly:90 (comment) +msgid "\\break % 4 (8*1)" +msgstr "\\break % 4 (8*1)" + +#. Documentation/snippets/ancient-fonts.ly:99 (comment) +#. Documentation/snippets/ancient-fonts.ly:161 (comment) +msgid "\\break % 5 (8*1)" +msgstr "\\break % 5 (8*1)" + +#. Documentation/snippets/ancient-fonts.ly:113 (comment) +#. Documentation/snippets/ancient-fonts.ly:176 (comment) +msgid "\\break % 6 (8*1)" +msgstr "\\break % 6 (8*1)" + +#. Documentation/snippets/ancient-fonts.ly:122 (comment) +#. Documentation/snippets/ancient-fonts.ly:186 (comment) +msgid "\\break % 7 (8*1)" +msgstr "\\break % 7 (8*1)" + +#. Documentation/snippets/ancient-fonts.ly:129 (comment) +msgid "\\break % 8 (8*1)" +msgstr "\\break % 8 (8*1)" + +#. Documentation/snippets/ancient-fonts.ly:132 (comment) +msgid "\\break % 12 (32*1)" +msgstr "\\break % 12 (32*1)" + +#. Documentation/snippets/ancient-fonts.ly:137 (variable) +#. Documentation/snippets/ancient-fonts.ly:137 (context id) +msgid "lowerStaff" +msgstr "lowerStaff" + +#. Documentation/snippets/ancient-fonts.ly:147 (comment) +msgid "\\break % 2 (16*1)" +msgstr "\\break % 2 (16*1)" + +#. Documentation/snippets/ancient-fonts.ly:152 (comment) +msgid "\\break % 4 (16*1)" +msgstr "\\break % 4 (16*1)" + +#. Documentation/snippets/ancient-fonts.ly:191 (comment) +msgid "\\break % 9 (16*1)" +msgstr "\\break % 9 (16*1)" + +#. Documentation/snippets/ancient-fonts.ly:193 (comment) +msgid "lig" +msgstr "lig" + +#. Documentation/snippets/ancient-fonts.ly:197 (comment) +msgid "\\break % 11 (16*1)" +msgstr "\\break % 11 (16*1)" + +#. Documentation/snippets/ancient-fonts.ly:208 (comment) +msgid "\\break % 12 (8*1)" +msgstr "\\break % 12 (8*1)" + +#. Documentation/snippets/ancient-headword.ly:38 (context id) +msgid "cantus" +msgstr "cantus" + +#. Documentation/snippets/ancient-headword.ly:40 (comment) +msgid "Verse 1 — Salve, Regína" +msgstr "Vers 1 — Salve, Regína" + +#. Documentation/snippets/ancient-headword.ly:51 (comment) +msgid "Verse 2 — Vita, dulcédo" +msgstr "Vers 2 — Vita, dulcédo" + +#. Documentation/snippets/ancient-headword.ly:52 (comment) +msgid "a\\melisma \\[ a \\flexa g \\pes a\\melismaEnd \\] d" +msgstr "a\\melisma \\[ a \\flexa g \\pes a\\melismaEnd \\] d" + +#. Documentation/snippets/ancient-headword.ly:53 (comment) +msgid "\\divisioMinima" +msgstr "\\divisioMinima" + +#. Documentation/snippets/ancient-headword.ly:54 (comment) +msgid "\\[ a\\melisma \\flexa g\\melismaEnd \\]" +msgstr "\\[ a\\melisma \\flexa g\\melismaEnd \\]" + +#. Documentation/snippets/ancient-headword.ly:55 (comment) +msgid "\\[ f\\melisma \\flexa e f \\pes g \\flexa f\\melismaEnd \\]" +msgstr "\\[ f\\melisma \\flexa e f \\pes g \\flexa f\\melismaEnd \\]" + +#. Documentation/snippets/ancient-headword.ly:56 (comment) +msgid "\\[ e\\melisma \\flexa d\\melismaEnd \\]" +msgstr "\\[ e\\melisma \\flexa d\\melismaEnd \\]" + +#. Documentation/snippets/ancient-headword.ly:57 (comment) +msgid "\\divisioMaior" +msgstr "\\divisioMaior" + +#. Documentation/snippets/ancient-headword.ly:58 (comment) +msgid "c d \\[e\\melisma \\pes f\\melismaEnd \\] g" +msgstr "c d \\[e\\melisma \\pes f\\melismaEnd \\] g" + +#. Documentation/snippets/ancient-headword.ly:59 (comment) +msgid "\\[d\\melisma \\pes e \\flexa c\\melismaEnd \\] d" +msgstr "\\[d\\melisma \\pes e \\flexa c\\melismaEnd \\] d" + +#. Documentation/snippets/ancient-headword.ly:60 (comment) +msgid "\\finalis" +msgstr "\\finalis" + +#. Documentation/snippets/ancient-headword.ly:61 (comment) +msgid "Verse 3 — Ad te clamámus" +msgstr "Vers 3 — Ad te clamámus" + +#. Documentation/snippets/ancient-headword.ly:70 (comment) +msgid "Verse 4 — Ad te suspirámus" +msgstr "Vers 4 — Ad te suspirámus" + +#. Documentation/snippets/ancient-headword.ly:83 (comment) +msgid "Verse 5 — Eia ergo, Advocáta nostra" +msgstr "Vers 5 — Eia ergo, Advocáta nostra" + +#. Documentation/snippets/ancient-headword.ly:99 (comment) +msgid "Verse 6 — Et Jesum" +msgstr "Verso 6 — Et Jesum" + +#. Documentation/snippets/ancient-headword.ly:113 (comment) +msgid "Verse 7 ad finem — O clemens: O pia: O dulcis Virgo María" +msgstr "Vers 7 ad finem — O clemens: O pia: O dulcis Virgo María" + +#. Documentation/snippets/ancient-headword.ly:131 (comment) +msgid "Vi- ta, dul- cé- do, et spes no- stra, sal- ve." +msgstr "Vi- ta, dul- cé- do, et spes no- stra, sal- ve." + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly:68 (variable) +msgid "chant" +msgstr "cant" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly:75 (variable) +msgid "verba" +msgstr "verba" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:86 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:133 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:152 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:169 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:188 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:203 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:224 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:237 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:256 (comment) +#. Documentation/snippets/incipit.ly:28 (variable) +#. Documentation/snippets/incipit.ly:204 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:219 (comment) +msgid "incipit" +msgstr "incipit" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:88 (comment) +msgid "Set tight spacing" +msgstr "Estableix l'espaiat atapeït" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:96 (comment) +msgid "turn off bar lines" +msgstr "deshabilita les línies de compàs" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:100 (comment) +msgid "need this extra \\skip such that clef change comes" +msgstr "cal aquest \\skip addicional perquè apareguin els canvis de clau" + +# También Líneas divisorias. FVD +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:101 (comment) +msgid "after bar line" +msgstr "després de la barra de compàs" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:105 (comment) +msgid "turn bar lines on again" +msgstr "activa les línies de compàs un altre cop" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:113 (comment) +msgid "Setting printKeyCancellation back to #t must not" +msgstr "L'establiment de printKeyCancellation a #t no ha d'" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:114 (comment) +msgid "occur in the first bar after the incipit. Dto. for forceClef." +msgstr "ocórrer al primer compàs després de l'incipit. El mateix per a forceClef." + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:115 (comment) +msgid "Therefore, we need an extra \\skip." +msgstr "Per tant, cal un \\skip addicional." + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:120 (comment) +#. Documentation/snippets/incipit.ly:78 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:42 (comment) +msgid "the actual music" +msgstr "la música real" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:122 (comment) +#. Documentation/snippets/incipit.ly:81 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:43 (comment) +msgid "let finis bar go through all staves" +msgstr "fes que la barra de finalització travessi totes les pautes" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:125 (comment) +#. Documentation/snippets/incipit.ly:84 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:45 (comment) +msgid "finis bar" +msgstr "linia de barra de finalització" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:129 (variable) +#. Documentation/snippets/incipit.ly:101 (variable) +#. Documentation/snippets/incipit.ly:235 (context id) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:49 (variable) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:238 (context id) +msgid "discantusNotes" +msgstr "discantusNotes" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:135 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:172 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:178 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:192 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:206 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:208 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:217 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:228 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:240 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:75 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:85 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:98 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:105 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:140 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:166 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:192 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:194 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:221 (comment) +msgid "two bars" +msgstr "dos compassos" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:136 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:239 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:141 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:220 (comment) +msgid "eight bars" +msgstr "vuit compassos" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:137 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:171 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:174 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:207 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:209 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:210 (comment) +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:241 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:165 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:193 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:195 (comment) +msgid "one bar" +msgstr "un compàs" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:151 (variable) +#. Documentation/snippets/incipit.ly:115 (variable) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:62 (variable) +msgid "discantusLyrics" +msgstr "discantusLyrics" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:165 (variable) +#. Documentation/snippets/incipit.ly:138 (variable) +#. Documentation/snippets/incipit.ly:242 (context id) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:72 (variable) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:245 (context id) +msgid "altusNotes" +msgstr "altusNotes" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:173 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:167 (comment) +msgid "seven bars" +msgstr "set compassos" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:187 (variable) +#. Documentation/snippets/incipit.ly:152 (variable) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:84 (variable) +msgid "altusLyrics" +msgstr "altusLyrics" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:199 (variable) +#. Documentation/snippets/incipit.ly:176 (variable) +#. Documentation/snippets/incipit.ly:249 (context id) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:92 (variable) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:252 (context id) +msgid "tenorNotes" +msgstr "tenorNotes" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:205 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:191 (comment) +msgid "four bars" +msgstr "quatre compassos" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:223 (variable) +#. Documentation/snippets/incipit.ly:190 (variable) +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:95 (variable) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:104 (variable) +msgid "tenorLyrics" +msgstr "tenorLyrics" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:233 (variable) +#. Documentation/snippets/incipit.ly:212 (variable) +#. Documentation/snippets/incipit.ly:256 (context id) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:110 (variable) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:259 (context id) +msgid "bassusNotes" +msgstr "bassusNotes" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:255 (variable) +#. Documentation/snippets/incipit.ly:226 (variable) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:123 (variable) +msgid "bassusLyrics" +msgstr "bassusLyrics" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:266 (context id) +#. Documentation/snippets/incipit.ly:234 (context id) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:237 (context id) +msgid "choirStaff" +msgstr "choirStaff" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:288 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:273 (comment) +msgid "no bars in staves" +msgstr "no posis barres als pentagrames" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:291 (comment) +msgid "incipit should not start with a start delimiter" +msgstr "l'incipit no hauria de començar amb un delimitador d'inici" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:297 (comment) +#. Documentation/snippets/incipit.ly:279 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:288 (comment) +msgid "no slurs" +msgstr "sense lligadures d'expressió" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:300 (comment) +msgid "The command below can be commented out in" +msgstr "L'ordre de baix es pot eliminar amb un comentari a" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:301 (comment) +msgid "short scores, but especially for large scores you" +msgstr "partitures curtes, però especialment a partitures llargues" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:302 (comment) +msgid "will typically yield better line breaking and improve" +msgstr "obtindreu en general un millor salt de línies i millorareu" + +#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:303 (comment) +msgid "overall spacing if you do not comment the command out." +msgstr "l'espaiat general si no elimineu l'ordre." + +#. Documentation/snippets/anglican-psalm-template.ly:93 (variable) +msgid "tick" +msgstr "puls" + +#. Documentation/snippets/anglican-psalm-template.ly:97 (comment) +msgid "Use markup to center the chant on the page" +msgstr "Useu etiquetatge per centrar el cant a la pàgina" + +#. Documentation/snippets/anglican-psalm-template.ly:100 (comment) +msgid "centered" +msgstr "centrat" + +#. Documentation/snippets/anglican-psalm-template.ly:140 (comment) +#. Documentation/snippets/hymn-template.ly:127 (comment) +msgid "End score" +msgstr "Fi de la partitura" + +#. Documentation/snippets/anglican-psalm-template.ly:142 (comment) +msgid "End markup" +msgstr "Fi de l'etiquetatge" + +#. Documentation/snippets/applying-note-head-styles-depending-on-the-step-of-the-scale.ly:123 (variable) +#. Documentation/snippets/clusters.ly:29 (variable) +msgid "fragment" +msgstr "fragment" + +#. Documentation/snippets/asymmetric-slurs.ly:31 (variable) +msgid "slurNotes" +msgstr "slurNotes" + +#. Documentation/snippets/avoiding-collisions-with-chord-fingerings.ly:44 (comment) +msgid "Default behavior" +msgstr "Comportament predeterminat" + +#. Documentation/snippets/avoiding-collisions-with-chord-fingerings.ly:50 (comment) +msgid "Corrected to avoid collisions" +msgstr "Corregit per evitar col·lisions" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:35 (comment) +msgid "%%%%%%% Cut here ----- Start 'bbarred.ly'" +msgstr "%%%%%%% Talla aquí ----- Inici de 'bbarred.ly'" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:37 (comment) +msgid "C with slash -------------------------------" +msgstr "Do amb barra inclinada -------------------------------" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:38 (variable) +msgid "cWithSlash" +msgstr "cWithSlash" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:41 (comment) +msgid "Span -----------------------------------" +msgstr "Extensió -----------------------------------" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:42 (comment) +msgid "Syntax: \\bbarre #\\\"text\\\" { notes } - text = any number of box" +msgstr "Sintaxi: \\bbarre #\\\"text\\\" { notes } - text = qualsevol número de caixa" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:43 (variable) +msgid "bbarre" +msgstr "bbarre" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:72 (comment) +msgid "uncomment this line for make full barred" +msgstr "traieu el comentari a aquesta línia per habilitar la barra completa" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:73 (comment) +msgid "" +"\\once \\override TextSpanner #'bound-details #'left #'text = \\markup { \\" +"\"B\\\" #str }" +msgstr "" +"\\once \\override TextSpanner #'bound-details #'left #'text = \\markup { \\" +"\"B\\\" #str }" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:77 (comment) +msgid "%%%%%%% Cut here ----- End 'bbarred.ly'" +msgstr "%%%%%%% Talla per aquí ----- Fi de 'bbarred.ly'" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:78 (comment) +msgid "Copy and change the last line for full barred. Rename in 'fbarred.ly'" +msgstr "Copia i canvia l'última línia per barra completa. Canvieu el nom a 'fbarred.ly'" + +#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:81 (comment) +msgid "Syntaxe: \\bbarre #\\\"text\\\" { notes } - text = any number of box" +msgstr "Sintaxi: \\bbarre #\\\"text\\\" { notes } - text = qualsevol número de caixa" + +#. Documentation/snippets/beam-endings-in-score-context.ly:55 (comment) +msgid "Set default beaming for all staves" +msgstr "Estableix les línies d'unió de notes per a tots els pentagrames" + +#. Documentation/snippets/beam-endings-in-score-context.ly:63 (comment) +msgid "Modify beaming for just this staff" +msgstr "Modifica les línies d'unió de notes sols per a aquest pentagrama" + +#. Documentation/snippets/beam-endings-in-score-context.ly:68 (comment) +msgid "Inherit beaming from Score context" +msgstr "Hereta les línies d'unió de notes del context Score" + +#. Documentation/snippets/beam-endings-in-score-context.ly:74 (comment) +msgid "Modify beaming for this voice only" +msgstr "Modifica les línies d'unió de notes per a aquesta veu" + +#. Documentation/snippets/beam-grouping-in-7-8-time.ly:57 (comment) +msgid "rhythm 2-3-2" +msgstr "ritme 2-3-2" + +#. Documentation/snippets/book-parts.ly:26 (comment) +msgid "book paper, which is inherited by all children bookparts" +msgstr "bloc paper del book, que s'hereta por a totes les bookparts" + +#. Documentation/snippets/book-parts.ly:29 (comment) +msgid "Page footer: add a different part-tagline at part last page" +msgstr "" +"Peu de pàgina: afegeix una part-tagline diferent per a la part de\n" +"l'última pàgina" + +#. Documentation/snippets/book-parts.ly:33 (comment) +msgid "Copyright header field only on book first page." +msgstr "Camp de capçalera de copyright sols a la primera pàgina del llibre." + +#. Documentation/snippets/book-parts.ly:37 (comment) +msgid "Part tagline header field only on each part last page." +msgstr "Camp de capçalera d'etiqueta de part sols a l'ultima pàgina de cada part." + +#. Documentation/snippets/book-parts.ly:41 (comment) +msgid "Tagline header field only on book last page." +msgstr "Camp de capçalera d'etiqueta sols a l'última pàgina del book." + +#. Documentation/snippets/book-parts.ly:48 (comment) +msgid "book header, which is inherited by the first bookpart" +msgstr "Capçalera de book, que s'herda per la primera bookpart" + +#. Documentation/snippets/book-parts.ly:57 (comment) +msgid "a different page breaking function may be used on each part" +msgstr "es pot fer serfir un funció diferent de salt de pàgina a cada part" + +#. Documentation/snippets/breathing-signs.ly:24 (comment) +msgid "this bar contains no \\breathe" +msgstr "aquest compàs no conté cap \\breathe" + +#. Documentation/snippets/breathing-signs.ly:26 (comment) +msgid "Modern notation:" +msgstr "Notació moderna:" + +#. Documentation/snippets/breathing-signs.ly:27 (comment) +msgid "by default, \\breathe uses the rcomma, just as if saying:" +msgstr "de forma predeterminada, \\breathe usa la rcomma, com si diguéssim:" + +#. Documentation/snippets/breathing-signs.ly:28 (comment) +msgid "" +"\\override BreathingSign #'text = #(make-musicglyph-markup \\\"scripts.rcomma" +"\\\")" +msgstr "" +"\\override BreathingSign #'text = #(make-musicglyph-markup \\\"scripts.rcomma" +"\\\")" + +#. Documentation/snippets/breathing-signs.ly:31 (comment) +msgid "rvarcomma and lvarcomma are variations of the default rcomma and lcomma" +msgstr "rvarcomma i lvarcomma són variacions de les rcomma i lcomma predeterminades" + +#. Documentation/snippets/breathing-signs.ly:32 (comment) +msgid "N.B.: must use Staff context here, since we start a Voice below" +msgstr "Nota: aquí cal usar el context de Staff ja que iniciem una Veu més abaix" + +#. Documentation/snippets/breathing-signs.ly:36 (comment) +msgid "vee" +msgstr "vee" + +#. Documentation/snippets/caesura-railtracks-with-fermata.ly:34 (comment) +msgid "construct the symbol" +msgstr "construeix el símbol" + +#. Documentation/snippets/caesura-railtracks-with-fermata.ly:43 (comment) +msgid "set the breathe mark back to normal" +msgstr "torna a posar la respiració normal" + +#. Documentation/snippets/center-text-below-hairpin-dynamics.ly:33 (variable) +msgid "hairpinWithCenteredText" +msgstr "hairpinWithCenteredText" + +#. Documentation/snippets/center-text-below-hairpin-dynamics.ly:45 (variable) +msgid "hairpinMolto" +msgstr "hairpinMolto" + +#. Documentation/snippets/center-text-below-hairpin-dynamics.ly:46 (variable) +msgid "hairpinMore" +msgstr "hairpinMore" + +#. Documentation/snippets/changing--flageolet-mark-size.ly:47 (variable) +#. Documentation/snippets/showing-the-same-articulation-above-and-below-a-note-or-chord.ly:33 (variable) +msgid "smallFlageolet" +msgstr "smallFlageolet" + +#. Documentation/snippets/changing-the-ambitus-gap.ly:53 (comment) +msgid "Default setting" +msgstr "Configuració predeterminada" + +#. Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly:40 (comment) +msgid "The following is only here to print the names of the" +msgstr "El que segueix és aquí únicament per imprimir els noms dels" + +#. Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly:41 (comment) +msgid "chords styles; it can be removed if you do not need to" +msgstr "estils d'acord; traieu-los si no els voleu" + +#. Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly:42 (comment) +msgid "print them." +msgstr "imprimir." + +#. Documentation/snippets/changing-the-default-text-font-family.ly:22 (comment) +msgid "change for other default global staff size." +msgstr "commuta a una altra mida predeterminada global de pentagrama." + +#. Documentation/snippets/changing-the-default-text-font-family.ly:24 (comment) +#. Documentation/snippets/engravers-one-by-one.ly:186 (comment) +#. Documentation/snippets/score-for-diatonic-accordion.ly:116 (comment) +#. Documentation/snippets/stem-cross-staff-engraver.ly:19 (comment) +#. Documentation/snippets/utf-8.ly:27 (comment) +msgid "{" +msgstr "{" + +#. Documentation/snippets/changing-the-default-text-font-family.ly:28 (comment) +#. Documentation/snippets/engravers-one-by-one.ly:188 (comment) +#. Documentation/snippets/expressive-headword.ly:37 (comment) +#. Documentation/snippets/expressive-headword.ly:38 (comment) +#. Documentation/snippets/score-for-diatonic-accordion.ly:117 (comment) +#. Documentation/snippets/score-for-diatonic-accordion.ly:247 (comment) +#. Documentation/snippets/stem-cross-staff-engraver.ly:28 (comment) +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:229 (comment) +#. Documentation/snippets/utf-8.ly:41 (comment) +msgid "}" +msgstr "}" + +#. Documentation/snippets/changing-the-text-for-sustain-markings.ly:36 (variable) +msgid "sustainNotes" +msgstr "sustainNotes" + +#. Documentation/snippets/chant-or-psalms-notation.ly:49 (variable) +msgid "stemOn" +msgstr "stemOn" + +#. Documentation/snippets/chant-or-psalms-notation.ly:50 (variable) +msgid "stemOff" +msgstr "stemOff" + +#. Documentation/snippets/chord-glissando-in-tablature.ly:55 (variable) +msgid "myMusic" +msgstr "myMusic" + +#. Documentation/snippets/chord-name-exceptions.ly:47 (comment) +msgid "modify maj9 and 6(add9)" +msgstr "commuta a maj9 i 6(add9)" + +#. Documentation/snippets/chord-name-exceptions.ly:48 (comment) +msgid "Exception music is chords with markups" +msgstr "La música Exception són acords amb etiquetatge" + +#. Documentation/snippets/chord-name-exceptions.ly:49 (variable) +msgid "chExceptionMusic" +msgstr "chExceptionMusic" + +#. Documentation/snippets/chord-name-exceptions.ly:54 (comment) +msgid "Convert music to list and prepend to existing exceptions." +msgstr "Converteix la música a una llista i adjunta-la davant d'excepcions existents." + +#. Documentation/snippets/chord-name-exceptions.ly:55 (variable) +msgid "chExceptions" +msgstr "chExceptions" + +#. Documentation/snippets/chord-name-exceptions.ly:59 (variable) +msgid "theMusic" +msgstr "theMusic" + +#. Documentation/snippets/chordchanges-for-fretboards.ly:50 (variable) +msgid "myChords" +msgstr "myChords" + +#. Documentation/snippets/chords-headword.ly:24 (variable) +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:40 (variable) +msgid "theChords" +msgstr "theChords" + +#. Documentation/snippets/chords-headword.ly:26 (comment) +#. Documentation/snippets/pitches-headword.ly:130 (comment) +msgid "\\break" +msgstr "\\break" + +#. Documentation/snippets/chords-headword.ly:30 (variable) +msgid "verseOne" +msgstr "verseOne" + +#. Documentation/snippets/chords-headword.ly:37 (variable) +msgid "verseTwo" +msgstr "verseTwo" + +#. Documentation/snippets/chords-headword.ly:76 (context id) +msgid "sop" +msgstr "sop" + +#. Documentation/snippets/clip-systems.ly:67 (variable) +msgid "origScore" +msgstr "origScore" + +#. Documentation/snippets/clip-systems.ly:85 (comment) +msgid "Each clip-region is a (START . END) pair" +msgstr "Cada clip-region és una parella (START . END)" + +#. Documentation/snippets/clip-systems.ly:86 (comment) +msgid "where both are rhythmic-locations." +msgstr "on ambdues són rhythmic-locations." + +#. Documentation/snippets/clip-systems.ly:88 (comment) +msgid "(make-rhythmic-locations BAR-NUMBER NUM DEN)" +msgstr "(make-rhythmic-locations NUM-COMPÀS NUMERADOR DENOMINADOR)" + +#. Documentation/snippets/clip-systems.ly:89 (comment) +msgid "means NUM/DEN whole-notes into bar numbered BAR-NUMBER" +msgstr "vol dir NUMERADOR/DENOMINADOR rodones al compàs número NUM-COMPAS" + +#. Documentation/snippets/coloring-notes-depending-on-their-pitch.ly:21 (comment) +msgid "Association list of pitches to colors." +msgstr "Llista associativa d'alturas a colors." + +#. Documentation/snippets/coloring-notes-depending-on-their-pitch.ly:41 (comment) +msgid "Compare pitch and alteration (not octave)." +msgstr "Compara l'altura y l'alteració (no l'octava)." + +#. Documentation/snippets/combining-dynamics-with-markup-texts.ly:31 (variable) +msgid "piuF" +msgstr "piuF" + +#. Documentation/snippets/combining-two-parts-on-the-same-staff.ly:98 (variable) +msgid "musicUp" +msgstr "musicUp" + +#. Documentation/snippets/combining-two-parts-on-the-same-staff.ly:105 (variable) +msgid "musicDown" +msgstr "musicDown" + +#. Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly:55 (comment) +msgid "show hairpin" +msgstr "mostra el regulador" + +#. Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly:57 (comment) +msgid "hide text span" +msgstr "amaga l'extensió de text" + +#. Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly:61 (comment) +msgid "show glissando" +msgstr "mostra el glissando" + +#. Documentation/snippets/creating-double-digit-fingerings.ly:23 (variable) +msgid "ten" +msgstr "ten" + +#. Documentation/snippets/creating-double-digit-fingerings.ly:27 (variable) +msgid "fifty" +msgstr "fifty" + +#. Documentation/snippets/creating-double-digit-fingerings.ly:31 (variable) +msgid "finger" +msgstr "finger" + +#. Documentation/snippets/creating-double-digit-fingerings.ly:42 (comment) +msgid "optional override to remove warnings for fingerings larger than 5" +msgstr "override opcional per suprimir els advertiments per a digitacions més grans que 5" + +#. Documentation/snippets/creating-real-parenthesized-dynamics.ly:49 (variable) +msgid "parenF" +msgstr "parenF" + +#. Documentation/snippets/creating-simultaneous-rehearsal-marks.ly:47 (comment) +msgid "the hidden measure and bar line" +msgstr "el compàs i la barra de compàs amagats" + +#. Documentation/snippets/creating-simultaneous-rehearsal-marks.ly:48 (comment) +msgid "\\cadenzaOn turns off automatic calculation of bar numbers" +msgstr "\\cadenzaOn desactiva el càlcul automàtic de números de compàs" + +#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:32 (comment) +msgid "this is in half-spaces," +msgstr "això està a semi-espais," + +#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:33 (comment) +msgid "so it makes stems 9.5 staffspaces long" +msgstr "de manera que les vírgules tinguin 9,5 espais de longitud" + +#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:34 (comment) +msgid "stems are normally lengthened" +msgstr "les vírgules normalment s'allarguen" + +#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:35 (comment) +msgid "upwards, so here we must lower the stem by the amount" +msgstr "cap amunt, per això hem de escurçar la vírgula per una magnitud" + +#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:36 (comment) +msgid "equal to the lengthening - in this case (19 - 7) / 2" +msgstr "igual al allargament: en aquest cas (19 - 7) / 2" + +#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:37 (comment) +msgid "(7 is default stem length)" +msgstr "(7 és la longitud de vírgula predeterminada)" + +#. Documentation/snippets/cross-staff-tremolos.ly:48 (context id) +#. Documentation/snippets/jazz-combo-template.ly:273 (variable) +#. Documentation/snippets/screech-and-boink.ly:21 (context id) +msgid "up" +msgstr "amunt" + +#. Documentation/snippets/cross-staff-tremolos.ly:53 (context id) +#. Documentation/snippets/jazz-combo-template.ly:279 (variable) +#. Documentation/snippets/screech-and-boink.ly:51 (context id) +msgid "down" +msgstr "abaix" + +#. Documentation/snippets/customizing-fretboard-fret-diagrams.ly:72 (comment) +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:61 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:31 (comment) +msgid "Set global properties of fret diagram" +msgstr "Estableix les propietats globals del diagrama de trastos" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:59 (context id) +#. Documentation/snippets/formatting-lyrics-syllables.ly:40 (variable) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:29 (context id) +#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:90 (context id) +msgid "mel" +msgstr "mel" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:68 (comment) +msgid "C major for guitar, no barre, using defaults" +msgstr "Do major per a la guitarra, sense celleta, usa el paràmetres predeterminats" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:69 (comment) +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:119 (comment) +msgid "terse style" +msgstr "estil concís" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:72 (comment) +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:94 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:60 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:81 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:160 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:181 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:259 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:280 (comment) +msgid "C major for guitar, barred on third fret" +msgstr "C major per a la guitarra, amb celleta al tercer trast" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:73 (comment) +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:95 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:61 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:83 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:110 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:161 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:183 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:210 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:260 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:282 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:309 (comment) +msgid "verbose style" +msgstr "estil amb emissió de missatges" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:74 (comment) +msgid "size 1.0" +msgstr "mida 1,0" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:75 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:62 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:162 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:261 (comment) +msgid "roman fret label, finger labels below string, straight barre" +msgstr "etiqueta de trast en números romans, les etiquetes de digitació a sota de la corda, celleta recta" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:77 (comment) +msgid "standard size" +msgstr "mida estàndard" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:96 (comment) +msgid "landscape orientation, arabic numbers, M for mute string" +msgstr "orientació apaïsada, números aràbics, M per a corda muda" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:97 (comment) +msgid "no barre, fret label down or left, small mute label font" +msgstr "sense celleta, l'etiqueta de trast a sota o a l'esquerra, tipus de lletra petita d'etiqueta de corda muda" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:118 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:132 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:232 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:331 (comment) +msgid "simple D chord" +msgstr "acord de Re senzill" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:120 (comment) +msgid "larger dots, centered dots, fewer frets" +msgstr "punts més grans, punts centrats, menys trastos" + +#. Documentation/snippets/customizing-markup-fret-diagrams.ly:121 (comment) +msgid "label below string" +msgstr "l'etiqueta a sota de la corda" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:29 (comment) +msgid "Grob utilities" +msgstr "Utilitats d'objectes tipogràfics gràfics" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:31 (comment) +msgid "These are literal rewrites of some C++ methods used by the ambitus engraver." +msgstr "Aquests són noves versions d'alguns mètodes C++ usats pel gravador de tessitures" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:62 (comment) +msgid "Ambitus data structure" +msgstr "Estructura de dades de tessitura" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:65 (comment) +msgid "The class holds the various grobs that are created" +msgstr "La classe emmagatzama els diferents objectes gràfics de tipografia que es creen" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:66 (comment) +msgid "to print an ambitus:" +msgstr "per imprimir una tessitura:" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:67 (comment) +msgid "- ambitus-group: the grob that groups all the components of an ambitus" +msgstr "- ambitus-group: l'objecte gràfic de tipografia que agrupa tots els components d'una tessitura" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:68 (comment) +msgid "(Ambitus grob);" +msgstr "(Ambitus grob);" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:69 (comment) +msgid "- ambitus-line: the vertical line between the upper and lower ambitus" +msgstr "- ambitus-line: la línia vertical entre les notes alta i baixa de la tessitura" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:70 (comment) +msgid "notes (AmbitusLine grob);" +msgstr "notes (AmbitusLine grob);" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:71 (comment) +msgid "- ambitus-up-note and ambitus-down-note: the note head and accidental" +msgstr "- ambitus-up-note i ambitus-down-note: el cap i la seva alteració" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:72 (comment) +msgid "for the lower and upper note of the ambitus (see class" +msgstr "per a les notes inferior i superior de la tessitura (vegeu la classe " + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:73 (comment) +msgid "below)." +msgstr "més abaix)." + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:74 (comment) +msgid "The other slots define the key and clef context of the engraver:" +msgstr "" +"Els altres espais defineixen els contextos de tonalitat i de clau per\n" +"al gravador:" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:75 (comment) +msgid "- start-c0: position of middle c at the beginning of the piece. It" +msgstr "- start-c0: posició del Do central al principi de la peça." + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:76 (comment) +msgid "is used to place the ambitus notes according to their pitch;" +msgstr "S'usa per col·locar les notes de tessitura d'acord amb la seva altura;" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:77 (comment) +msgid "- start-key-sig: the key signature at the beginning of the piece. It" +msgstr "- start-key-sig: armadura al principi de la peça." + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:78 (comment) +msgid "is used to determine if accidentals shall be printed next to ambitus" +msgstr "S'usa per determinar si s'han d'imprimir alteracoins junt a les" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:79 (comment) +msgid "notes." +msgstr "notes de la tessitura." + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:93 (comment) +msgid "Accessor for the lower and upper note data of an ambitus" +msgstr "Mecanisme d'accés per a les dades de nota inferior i superior d'una tessitura" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:101 (comment) +msgid "The class holds the grobs that are specific to ambitus" +msgstr "" +"La classe emmagatzema els objectes gràfics de\n" +"tipografia de les" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:102 (comment) +msgid "(lower and upper) notes:" +msgstr "notes (inferior i superior):" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:103 (comment) +msgid "- head: an AmbitusNoteHead grob;" +msgstr "- head: un objecte gràfic de tipografia AmbitusNoteHead;" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:104 (comment) +msgid "- accidental: an AmbitusAccidental grob, to be possibly printed next" +msgstr "- accidental: un objecte gràfic de tipografia AmbitusAccidental a imprimir possiblement junt amb" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:105 (comment) +msgid "to the ambitus note head." +msgstr "el cap de la nota de tessitura." + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:106 (comment) +msgid "Moreover:" +msgstr "A més a més:" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:107 (comment) +msgid "- pitch is the absolute pitch of the note" +msgstr "- pitch és l'altura absoluta de la nota" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:108 (comment) +msgid "- cause is the note event that causes this ambitus note, i.e. the lower" +msgstr "" +"- cause és l'esdeveniment que produeix aquesta nota de tessitura, és a\n" +"dir, la nota" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:109 (comment) +msgid "or upper note of the considered music sequence." +msgstr "inferior o superior de la seqüència musical considerada." + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:122 (comment) +msgid "Ambitus engraving logics" +msgstr "Lògica del gravat de la tessitura" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:124 (comment) +msgid "Rewrite of the code from @file{lily/ambitus-engraver.cc}." +msgstr "Reescriptura del codi de @file{lily/ambitus-engraver.cc}." + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:293 (comment) +msgid "Ambitus engraver definition" +msgstr "Definició del gravador de tessitura" + +#. Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly:319 (comment) +msgid "Example" +msgstr "Exemple" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:88 (comment) +msgid "add FretBoards for the Cuatro" +msgstr "afegeix FretBoards per al Cuatro" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:89 (comment) +msgid "Note: This section could be put into a separate file" +msgstr "Nota: aquesta secció es pot posar en un fitxer apart" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:90 (comment) +msgid "predefined-cuatro-fretboards.ly" +msgstr "predefined-cuatro-fretboards.ly" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:91 (comment) +msgid "and \\included into each of your compositions" +msgstr "i \\\\included a cadascuna de les vostres composicions" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:93 (variable) +msgid "cuatroTuning" +msgstr "cuatroTuning" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:98 (variable) +msgid "dSix" +msgstr "dSix" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:99 (variable) +msgid "dMajor" +msgstr "dMajor" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:100 (variable) +msgid "aMajSeven" +msgstr "aMajSeven" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:101 (variable) +msgid "dMajSeven" +msgstr "dMajSeven" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:102 (variable) +msgid "gMajor" +msgstr "gMajor" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:120 (comment) +msgid "end of potential include file /predefined-cuatro-fretboards.ly" +msgstr "fi del fitxer potencial d'inclusió /predefined-cuatro-freboards.ly" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:125 (variable) +msgid "primerosNames" +msgstr "primerosNames" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:129 (variable) +msgid "primeros" +msgstr "primeros" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:152 (comment) +msgid "\\override FretBoard" +msgstr "\\override FretBoard" + +#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:153 (comment) +msgid "#'(fret-diagram-details string-count) = #'4" +msgstr "#'(fret-diagram-details string-count) = #'4" + +#. Documentation/snippets/demo-midiinstruments.ly:28 (variable) +msgid "baseMelody" +msgstr "baseMelody" + +#. Documentation/snippets/display-bracket-with-only-one-staff-in-a-system.ly:77 (comment) +msgid "Must be lower than the actual number of staff lines" +msgstr "Ha de ser inferior al nombre real de línies de pentagrama" + +#. Documentation/snippets/displaying-complex-chords.ly:29 (variable) +msgid "fixA" +msgstr "fixA" + +#. Documentation/snippets/displaying-complex-chords.ly:32 (variable) +msgid "fixB" +msgstr "fixB" + +#. Documentation/snippets/displaying-grob-ancestry.ly:182 (comment) +msgid "~a~&\\\"" +msgstr "~a~&\\\"" + +#. Documentation/snippets/double-glissando.ly:25 (comment) +msgid "new voice ( = \\voiceOne), hidden" +msgstr "new voice ( = \\voiceOne), oculta" + +#. Documentation/snippets/double-glissando.ly:27 (comment) +msgid "attach glissando to note heads" +msgstr "aplica glissando al cap de les notes" + +#. Documentation/snippets/double-glissando.ly:32 (comment) +msgid "original voice with chords rearranged so that" +msgstr "voz original con acordes rehecha de forma que" + +#. Documentation/snippets/double-glissando.ly:33 (comment) +msgid "glissando is attached to a & c" +msgstr "el glissando s'adjunta al La i al Do" + +#. Documentation/snippets/drawing-circles-around-note-heads.ly:19 (variable) +msgid "circle" +msgstr "cercle" + +#. Documentation/snippets/dynamics-custom-text-spanner-postfix.ly:58 (comment) +msgid "Two functions for (de)crescendo spanners where you can explicitly give the" +msgstr "Dues funcions per a extensors de (de)crescendo on podem donar el" + +#. Documentation/snippets/dynamics-custom-text-spanner-postfix.ly:59 (comment) +msgid "spanner text." +msgstr "text d'extensió explícitament" + +#. Documentation/snippets/dynamics-custom-text-spanner-postfix.ly:60 (variable) +msgid "mycresc" +msgstr "mycresc" + +#. Documentation/snippets/dynamics-custom-text-spanner-postfix.ly:66 (variable) +msgid "mydecresc" +msgstr "mydecresc" + +#. Documentation/snippets/dynamics-text-spanner-postfix.ly:62 (comment) +msgid "Some sample text dynamic spanners, to be used as postfix operators" +msgstr "Alguns extensors dinàmics de text de mostra, a usar com a operadors sufix" + +#. Documentation/snippets/dynamics-text-spanner-postfix.ly:63 (variable) +msgid "crpoco" +msgstr "crpoco" + +#. Documentation/snippets/editorial-headword.ly:38 (comment) +msgid "NR 1.7 Editorial annotations" +msgstr "NR 1.7 anotacions editorials" + +#. Documentation/snippets/editorial-headword.ly:40 (comment) +msgid "Beethoven, Op. 31, No. 3" +msgstr "Beethoven, Op. 31, No. 3" + +#. Documentation/snippets/editorial-headword.ly:41 (comment) +msgid "Piano sonata 18, Movt II, Scherzo" +msgstr "Sonata per a piano núm. 18, Mov. II, Scherzo" + +#. Documentation/snippets/editorial-headword.ly:42 (comment) +msgid "Measures 9 - 14" +msgstr "Compassos 9 a 14" + +#. Documentation/snippets/editorial-headword.ly:46 (comment) +#. Documentation/snippets/expressive-headword.ly:42 (comment) +#. Documentation/snippets/pitches-headword.ly:27 (comment) +#. Documentation/snippets/rhythms-headword.ly:37 (comment) +msgid "RH Staff" +msgstr "Pentagrama MD" + +#. Documentation/snippets/editorial-headword.ly:84 (comment) +#. Documentation/snippets/expressive-headword.ly:174 (comment) +#. Documentation/snippets/pitches-headword.ly:100 (comment) +#. Documentation/snippets/rhythms-headword.ly:126 (comment) +msgid "LH Staff" +msgstr "Pentagrama MI" + +#. Documentation/snippets/embedding-native-postscript-in-a--markup-block.ly:29 (comment) +msgid "PostScript is a registered trademark of Adobe Systems Inc." +msgstr "PostScript és una marca registrada d'Adobe Systems Inc." + +#. Documentation/snippets/engravers-one-by-one.ly:74 (comment) +msgid "sample music" +msgstr "música d'exemple" + +#. Documentation/snippets/engravers-one-by-one.ly:75 (variable) +msgid "topVoice" +msgstr "topVoice" + +#. Documentation/snippets/engravers-one-by-one.ly:83 (variable) +msgid "botVoice" +msgstr "botVoice" + +#. Documentation/snippets/engravers-one-by-one.ly:91 (variable) +msgid "hoom" +msgstr "hoom" + +#. Documentation/snippets/engravers-one-by-one.ly:102 (variable) +msgid "pah" +msgstr "pah" + +#. Documentation/snippets/engravers-one-by-one.ly:112 (comment) +msgid "setup for Request->Element conversion. Guru-only" +msgstr "Sols per a gurús: configuració per a Request->Element" + +#. Documentation/snippets/engravers-one-by-one.ly:115 (variable) +#. Documentation/snippets/engravers-one-by-one.ly:213 (variable) +#. Documentation/snippets/engravers-one-by-one.ly:226 (variable) +#. Documentation/snippets/engravers-one-by-one.ly:282 (variable) +#. Documentation/snippets/engravers-one-by-one.ly:296 (variable) +msgid "MyStaff" +msgstr "MyStaff" + +#. Documentation/snippets/engravers-one-by-one.ly:143 (comment) +msgid "explicitly set instrumentName, so we don't get" +msgstr "establir instrumentName específicament, per no obtenir" + +#. Documentation/snippets/engravers-one-by-one.ly:144 (comment) +msgid "weird effects when doing instrument names for" +msgstr "efectes estranys en fer noms d'instruments per a" + +#. Documentation/snippets/engravers-one-by-one.ly:145 (comment) +msgid "piano staves" +msgstr "sistemes de piano" + +#. Documentation/snippets/engravers-one-by-one.ly:154 (variable) +#. Documentation/snippets/engravers-one-by-one.ly:240 (variable) +#. Documentation/snippets/engravers-one-by-one.ly:253 (variable) +#. Documentation/snippets/engravers-one-by-one.ly:266 (variable) +msgid "MyVoice" +msgstr "MyVoice" + +#. Documentation/snippets/engravers-one-by-one.ly:169 (comment) +msgid "must come before all" +msgstr "ha d'anar abans de tot" + +#. Documentation/snippets/engravers-one-by-one.ly:179 (comment) +msgid "\\consists \\\"Rest_engraver\\\"" +msgstr "\\consists \\\"Rest_engraver\\\"" + +#. Documentation/snippets/expressive-headword.ly:26 (comment) +msgid "NR 1.3 Expressive marks" +msgstr "Referència de la notació 1.3 Marques expressives" + +#. Documentation/snippets/expressive-headword.ly:28 (comment) +msgid "L. v. Beethoven, Op. 49 no. 1" +msgstr "L. v. Beethoven, Op. 49 no. 1" + +#. Documentation/snippets/expressive-headword.ly:29 (comment) +msgid "Piano sonata 19 - \\\"Leichte Sonate\\\"" +msgstr "Sonata per a piano núm. 19 - \\\"Leichte Sonate\\\"" + +#. Documentation/snippets/expressive-headword.ly:30 (comment) +msgid "measures 1 - 12" +msgstr "Compassos 1 a 12" + +#. Documentation/snippets/expressive-headword.ly:32 (comment) +msgid "\\layout {" +msgstr "\\layout {" + +#. Documentation/snippets/expressive-headword.ly:33 (comment) +msgid "\\context {" +msgstr "\\context {" + +#. Documentation/snippets/expressive-headword.ly:34 (comment) +msgid "\\Score" +msgstr "\\Score" + +#. Documentation/snippets/expressive-headword.ly:35 (comment) +msgid "\\override SpacingSpanner #'base-shortest-duration =" +msgstr "\\override SpacingSpanner #'base-shortest-duration =" + +#. Documentation/snippets/expressive-headword.ly:36 (comment) +msgid "#(ly:make-moment 1 20)" +msgstr "#(ly:make-moment 1 20)" + +#. Documentation/snippets/figured-bass-headword.ly:26 (comment) +msgid "NR 2.7.3 Figured bass" +msgstr "Referència de la notació 2.7.3 sota xifrat" + +#. Documentation/snippets/figured-bass-headword.ly:28 (comment) +msgid "Arcangelo Corelli, 12 Sonate da Camera, Op. 2" +msgstr "Arcangelo Corelli, 12 Sonate da Camera, Op. 2" + +#. Documentation/snippets/figured-bass-headword.ly:29 (comment) +msgid "Sonata II, Allemanda" +msgstr "Sonata II, Allemanda" + +#. Documentation/snippets/figured-bass-headword.ly:30 (comment) +msgid "measures 1 - 88" +msgstr "compassos 1 a 88" + +#. Documentation/snippets/figured-bass-headword.ly:31 (comment) +msgid "Coded by Neil Puttock; modified by Carl Sorensen" +msgstr "Codificat per Neil Puttock; modificat per Carl Sorensen" + +#. Documentation/snippets/figured-bass-headword.ly:33 (variable) +msgid "extendOn" +msgstr "extendOn" + +#. Documentation/snippets/figured-bass-headword.ly:34 (variable) +msgid "extendOff" +msgstr "extendOff" + +#. Documentation/snippets/figured-bass-headword.ly:42 (context id) +msgid "violinoI" +msgstr "violinI" + +#. Documentation/snippets/figured-bass-headword.ly:60 (context id) +msgid "violinoII" +msgstr "violinII" + +#. Documentation/snippets/figured-bass-headword.ly:78 (context id) +msgid "violone" +msgstr "violone" + +#. Documentation/snippets/fingering-symbols-for-wind-instruments.ly:37 (variable) +#. Documentation/snippets/recorder-fingering-chart.ly:41 (variable) +msgid "centermarkup" +msgstr "centermarkup" + +#. Documentation/snippets/flamenco-notation.ly:79 (comment) +msgid "Cut here ----- Start 'flamenco.ly'" +msgstr "Talla per aquí ----- Inici 'flamenco.ly'" + +#. Documentation/snippets/flamenco-notation.ly:81 (comment) +msgid "Text indicators" +msgstr "Indicadors de text" + +#. Documentation/snippets/flamenco-notation.ly:82 (variable) +msgid "abanico" +msgstr "ventall" + +#. Documentation/snippets/flamenco-notation.ly:83 (variable) +msgid "rasgueaso" +msgstr "rasgueao" + +#. Documentation/snippets/flamenco-notation.ly:84 (variable) +msgid "alzapua" +msgstr "alzapua" + +#. Documentation/snippets/flamenco-notation.ly:86 (comment) +msgid "Finger stroke symbols" +msgstr "Símbols de cops de dit" + +#. Documentation/snippets/flamenco-notation.ly:87 (variable) +msgid "strokeUp" +msgstr "strokeUp" + +#. Documentation/snippets/flamenco-notation.ly:97 (variable) +msgid "strokeDown" +msgstr "strokeDown" + +#. Documentation/snippets/flamenco-notation.ly:107 (comment) +msgid "Golpe symbol" +msgstr "Símbol de golpe" + +#. Documentation/snippets/flamenco-notation.ly:108 (variable) +msgid "golpe" +msgstr "golpe" + +#. Documentation/snippets/flamenco-notation.ly:122 (variable) +msgid "strokeUpGolpe" +msgstr "strokeUpGolpe" + +#. Documentation/snippets/flamenco-notation.ly:123 (variable) +msgid "iUpGolpe" +msgstr "iUpGolpe" + +#. Documentation/snippets/flamenco-notation.ly:125 (comment) +msgid "Strokes for all fingers" +msgstr "Cops per a tots els dits" + +#. Documentation/snippets/flamenco-notation.ly:126 (variable) +msgid "pUp" +msgstr "pUp" + +#. Documentation/snippets/flamenco-notation.ly:127 (variable) +msgid "pDown" +msgstr "pDown" + +#. Documentation/snippets/flamenco-notation.ly:128 (variable) +msgid "iUp" +msgstr "iUp" + +#. Documentation/snippets/flamenco-notation.ly:129 (variable) +msgid "iDown" +msgstr "iDown" + +#. Documentation/snippets/flamenco-notation.ly:130 (variable) +msgid "mUp" +msgstr "mUp" + +#. Documentation/snippets/flamenco-notation.ly:131 (variable) +msgid "mDown" +msgstr "mDown" + +#. Documentation/snippets/flamenco-notation.ly:132 (variable) +msgid "aUp" +msgstr "aUp" + +#. Documentation/snippets/flamenco-notation.ly:133 (variable) +msgid "aDown" +msgstr "aDown" + +#. Documentation/snippets/flamenco-notation.ly:134 (variable) +msgid "xUp" +msgstr "xUp" + +#. Documentation/snippets/flamenco-notation.ly:135 (variable) +msgid "xDown" +msgstr "xDown" + +#. Documentation/snippets/flamenco-notation.ly:138 (comment) +msgid "Just handy :)" +msgstr "Simplement còmode :)" + +#. Documentation/snippets/flamenco-notation.ly:139 (variable) +msgid "tupletOff" +msgstr "tupletOff" + +#. Documentation/snippets/flamenco-notation.ly:144 (variable) +msgid "tupletsOff" +msgstr "tupletsOff" + +#. Documentation/snippets/flamenco-notation.ly:149 (variable) +msgid "tupletsOn" +msgstr "tupletsOn" + +#. Documentation/snippets/flamenco-notation.ly:154 (variable) +msgid "headsOff" +msgstr "headsOff" + +#. Documentation/snippets/flamenco-notation.ly:160 (variable) +msgid "headsOn" +msgstr "headsOn" + +#. Documentation/snippets/flamenco-notation.ly:166 (comment) +msgid "Cut here ----- End 'flamenco.ly'" +msgstr "Talla per aquí ----- Fi 'flamenco.ly'" + +#. Documentation/snippets/flat-flags-and-beam-nibs.ly:160 (comment) +msgid "Example 1" +msgstr "Exemple 1" + +#. Documentation/snippets/flat-flags-and-beam-nibs.ly:166 (comment) +msgid "Example 2" +msgstr "Exemple 2" + +#. Documentation/snippets/flat-flags-and-beam-nibs.ly:172 (comment) +msgid "Example 3" +msgstr "Exemple 3" + +#. Documentation/snippets/flat-flags-and-beam-nibs.ly:180 (comment) +msgid "Example 4" +msgstr "Exemple 4" + +#. Documentation/snippets/flute-slap-notation.ly:22 (variable) +msgid "slap" +msgstr "slap" + +#. Documentation/snippets/forcing-measure-width-to-adapt-to-metronomemarks-width.ly:24 (variable) +msgid "example" +msgstr "exemple" + +#. Documentation/snippets/formatting-lyrics-syllables.ly:41 (variable) +msgid "lyr" +msgstr "lyr" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:37 (comment) +msgid "A chord for ukulele" +msgstr "Un acord d'ukelele" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:47 (comment) +msgid "A chord for ukulele, with formatting defined in definition string" +msgstr "Acord per a l'ukelele, amb el format definit a la cadena de de definició" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:48 (comment) +msgid "1.2 * size, 4 strings, 4 frets, fingerings below string" +msgstr "1.2 * mida, 4 cordes, 4 trastos, digitació a sota de les cordes" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:49 (comment) +msgid "dot radius .35 of fret spacing, dot position 0.55 of fret spacing" +msgstr "radi del punt 0.35 de l'espaiat del trast, posició del punt 0.55 de l'espaiat del trast" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:58 (comment) +msgid "These chords will be in normal orientation" +msgstr "Aquests acords estaran a l'orientació normal" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:64 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:85 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:112 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:164 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:185 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:212 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:263 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:284 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:311 (comment) +#, python-format +msgid "110% of default size" +msgstr "110% de la mida predeterminada" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:82 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:182 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:281 (comment) +msgid "Double barre used to test barre function" +msgstr "Doble barra utilitzada per a provar la funció de barra" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:109 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:209 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:308 (comment) +msgid "C major for guitar, with capo on third fret" +msgstr "Do major per a la guitarra, amb celleta el tercer trast" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:144 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:243 (comment) +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:342 (comment) +msgid "simple D chord, large top fret thickness" +msgstr "acord senzill de Re, gruix del trast gran superior" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:156 (comment) +msgid "These chords will be in landscape orientation" +msgstr "Aquests acords estaran en orientació apaïsada" + +#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:255 (comment) +msgid "These chords will be in opposing-landscape orientation" +msgstr "Aquests acords estaran en orientació apaïsada oposada" + +#. Documentation/snippets/fretboards-alternate-tables.ly:90 (comment) +msgid "Make a blank new fretboard table" +msgstr "Fes una nova taula de diapasó buida" + +#. Documentation/snippets/fretboards-alternate-tables.ly:93 (comment) +msgid "Make a new fretboard table as a copy of default-fret-table" +msgstr "Fes una nova taula de diapasó com a còpia de default-fret-table" + +#. Documentation/snippets/fretboards-alternate-tables.ly:96 (comment) +msgid "Add a chord to custom-fretboard-table-one" +msgstr "Afegeix un acord a custom-fretboard-table-one" + +#. Documentation/snippets/fretboards-alternate-tables.ly:102 (comment) +msgid "Add a chord to custom-fretboard-table-two" +msgstr "Afegeix un acord a custom-fretboard-table-two" + +#. Documentation/snippets/fretted-headword.ly:36 (comment) +msgid "shortcuts" +msgstr "dreceres" + +#. Documentation/snippets/fretted-headword.ly:37 (comment) +msgid "fingering orientations" +msgstr "orientacions de digitació" + +#. Documentation/snippets/fretted-headword.ly:38 (variable) +msgid "sfol" +msgstr "sfoiz" + +#. Documentation/snippets/fretted-headword.ly:39 (variable) +msgid "sfor" +msgstr "sfor" + +#. Documentation/snippets/fretted-headword.ly:40 (variable) +msgid "sfod" +msgstr "sfoder" + +#. Documentation/snippets/fretted-headword.ly:41 (variable) +msgid "sfou" +msgstr "sfou" + +#. Documentation/snippets/fretted-headword.ly:43 (comment) +msgid "string number orientations" +msgstr "orientacions dels números de corda" + +#. Documentation/snippets/fretted-headword.ly:44 (variable) +msgid "ssnol" +msgstr "ssnol" + +#. Documentation/snippets/fretted-headword.ly:44 (comment) +msgid "(down right up)" +msgstr "(abaix dreta amunt)" + +#. Documentation/snippets/fretted-headword.ly:45 (variable) +msgid "ssnou" +msgstr "ssnou" + +#. Documentation/snippets/fretted-headword.ly:46 (variable) +msgid "ssnod" +msgstr "ssnod" + +#. Documentation/snippets/fretted-headword.ly:47 (variable) +msgid "ssnor" +msgstr "ssnor" + +#. Documentation/snippets/fretted-headword.ly:49 (comment) +msgid "define fingering offset" +msgstr "defineix el desplaçament de la digitació" + +#. Documentation/snippets/fretted-headword.ly:50 (variable) +msgid "FO" +msgstr "FO" + +#. Documentation/snippets/fretted-headword.ly:55 (comment) +msgid "markups" +msgstr "etiquetatges" + +#. Documentation/snippets/fretted-headword.ly:56 (variable) +msgid "rit" +msgstr "rit" + +#. Documentation/snippets/fretted-headword.ly:57 (variable) +msgid "dimin" +msgstr "dimin" + +#. Documentation/snippets/fretted-headword.ly:58 (variable) +msgid "andantino" +msgstr "andantino" + +#. Documentation/snippets/fretted-headword.ly:59 (variable) +msgid "benmarcato" +msgstr "benmarcato" + +#. Documentation/snippets/fretted-headword.ly:60 (variable) +msgid "pdolce" +msgstr "pdolce" + +#. Documentation/snippets/fretted-headword.ly:62 (comment) +msgid "THE MUSIC %%%" +msgstr "LA MÚSICA %%%" + +#. Documentation/snippets/fretted-headword.ly:74 (comment) +#. Documentation/snippets/fretted-headword.ly:113 (comment) +msgid "m. 1" +msgstr "m. 1" + +#. Documentation/snippets/fretted-headword.ly:80 (comment) +msgid "m. 2" +msgstr "m. 2" + +#. Documentation/snippets/fretted-headword.ly:82 (comment) +#. Documentation/snippets/fretted-headword.ly:118 (comment) +msgid "m. 3" +msgstr "m. 3" + +#. Documentation/snippets/fretted-headword.ly:83 (comment) +#. Documentation/snippets/fretted-headword.ly:120 (comment) +msgid "m. 4" +msgstr "m. 4" + +#. Documentation/snippets/fretted-headword.ly:87 (comment) +#. Documentation/snippets/fretted-headword.ly:125 (comment) +msgid "m. 5" +msgstr "m. 5" + +#. Documentation/snippets/fretted-headword.ly:90 (comment) +msgid "end of m. 6" +msgstr "fi de m. 6" + +#. Documentation/snippets/fretted-headword.ly:93 (comment) +#. Documentation/snippets/fretted-headword.ly:130 (comment) +msgid "m. 7" +msgstr "m. 7" + +#. Documentation/snippets/fretted-headword.ly:96 (comment) +msgid "beg of m. 8" +msgstr "inici de m. 8" + +#. Documentation/snippets/fretted-headword.ly:97 (comment) +msgid "end of m. 8" +msgstr "fi de m. 8" + +#. Documentation/snippets/fretted-headword.ly:99 (comment) +msgid "end of m. 9" +msgstr "fi de m. 9" + +#. Documentation/snippets/fretted-headword.ly:101 (comment) +#. Documentation/snippets/fretted-headword.ly:137 (comment) +msgid "m. 10" +msgstr "m. 10" + +#. Documentation/snippets/fretted-headword.ly:103 (comment) +msgid "beg of m. 11" +msgstr "inici de m. 11" + +#. Documentation/snippets/fretted-headword.ly:105 (comment) +msgid "end of m. 11" +msgstr "fi de m. 11" + +#. Documentation/snippets/fretted-headword.ly:115 (comment) +msgid "beg m. 2" +msgstr "inici de m. 2" + +#. Documentation/snippets/fretted-headword.ly:116 (comment) +msgid "end m. 2" +msgstr "fi de m. 2" + +#. Documentation/snippets/fretted-headword.ly:122 (comment) +msgid "new section starts here in A minor" +msgstr "la nova secció comença aquí en La menor" + +#. Documentation/snippets/fretted-headword.ly:127 (comment) +msgid "beg m. 6" +msgstr "inici de m. 6" + +#. Documentation/snippets/fretted-headword.ly:128 (comment) +msgid "end m. 6" +msgstr "fi de m. 6" + +#. Documentation/snippets/fretted-headword.ly:132 (comment) +msgid "m. 8" +msgstr "m. 8" + +#. Documentation/snippets/fretted-headword.ly:134 (comment) +msgid "beg m. 9" +msgstr "inici de m. 9" + +#. Documentation/snippets/fretted-headword.ly:135 (comment) +msgid "end m. 9" +msgstr "fi de m. 9" + +#. Documentation/snippets/fretted-headword.ly:139 (comment) +msgid "m. 11" +msgstr "m. 11" + +#. Documentation/snippets/fretted-headword.ly:143 (context id) +#. Documentation/snippets/jazz-combo-template.ly:199 (variable) +#. Documentation/snippets/jazz-combo-template.ly:309 (context id) +#. Documentation/snippets/polyphony-in-tablature.ly:63 (context id) +#. Documentation/snippets/polyphony-in-tablature.ly:68 (context id) +msgid "guitar" +msgstr "guitarra" + +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:40 (variable) +msgid "pinchedHarmonics" +msgstr "pinchedHarmonics" + +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:54 (comment) +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:73 (comment) +msgid "artificial harmonics (AH)" +msgstr "harmònics artificials (AH)" + +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:59 (comment) +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:77 (comment) +msgid "pinched harmonics (PH)" +msgstr "harmònics pizzicato (PH)" + +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:64 (comment) +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:81 (comment) +msgid "tapped harmonics (TH)" +msgstr "harmònics copejats (TH)" + +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:68 (comment) +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:85 (comment) +msgid "touch harmonics (TCH)" +msgstr "harmònics tocats (TCH)" + +#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:72 (variable) +msgid "frettedStrings" +msgstr "frettedStrings" + +#. Documentation/snippets/generating-custom-flags.ly:35 (comment) +msgid "Create a flag stencil by looking up the glyph from the font" +msgstr "Crea un segell d'etiqueta buscant el glif del tipus de lletra" + +#. Documentation/snippets/generating-custom-flags.ly:50 (variable) +msgid "snippetexamplenotes" +msgstr "snippetexamplenotes" + +#. Documentation/snippets/generating-whole-scores-also-book-parts-in-scheme-without-using-the-parser.ly:74 (comment) +msgid "Just some example score to show how to use these functions:" +msgstr "Una partitura simple d'exemple per mostrar la forma d'ús d'aquestes funcions:" + +#. Documentation/snippets/generating-whole-scores-also-book-parts-in-scheme-without-using-the-parser.ly:100 (variable) +msgid "oneNoteScore" +msgstr "oneNoteScore" + +#. Documentation/snippets/generating-whole-scores-also-book-parts-in-scheme-without-using-the-parser.ly:117 (comment) +msgid "Top-level scores are also handled correctly" +msgstr "També es gestionen correctament les partitures de nivell superior" + +#. Documentation/snippets/grid-lines--changing-their-appearance.ly:57 (comment) +msgid "this moves them up one staff space from the default position" +msgstr "això les mou un espai de pauta amunt respecte la posició predeterminada" + +#. Documentation/snippets/grid-lines--changing-their-appearance.ly:75 (comment) +msgid "set up grids" +msgstr "estableix quadrícules" + +#. Documentation/snippets/grid-lines--changing-their-appearance.ly:77 (comment) +msgid "set the grid interval to one quarter note" +msgstr "estableix l'interval de quadrícula a un quart de nota" + +#. Documentation/snippets/grid-lines--changing-their-appearance.ly:83 (comment) +msgid "this moves them to the right half a staff space" +msgstr "això les mou cap a la dreta mig espai de pauta" + +#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:42 (comment) +msgid "hides staff and notes so that only the grid lines are visible" +msgstr "amaga les pautes i les notes de manera que sols es vegin les línies de quadrícula" + +#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:49 (comment) +msgid "dummy notes to force regular note spacing" +msgstr "notes fictícies per forçar l'espaiat regular de les notes" + +#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:65 (comment) +msgid "center grid lines horizontally below note heads" +msgstr "centra les línies de quadrícula horitzontalment a sota del cap de les notes" + +#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:72 (comment) +msgid "set line length and positioning:" +msgstr "estableix la longitud de les línies i la seva posició:" + +#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:73 (comment) +msgid "two staff spaces above center line on hidden staff" +msgstr "dos espais de pauta a sobre de la línea central a la pauta oculta" + +#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:74 (comment) +msgid "to four spaces below center line on visible staff" +msgstr "fins a quatre espais a sota de la línia central a la pauta visible" + +#. Documentation/snippets/guitar-slides.ly:36 (comment) +msgid "Hide fret number: useful to draw slide into/from a casual point of" +msgstr "Amaga el número de trast: útil per a trazar un desplaçament a/cap a un punt casual" + +#. Documentation/snippets/guitar-slides.ly:37 (comment) +msgid "the fretboard." +msgstr "del màstil." + +#. Documentation/snippets/guitar-slides.ly:38 (variable) +msgid "hideFretNumber" +msgstr "hideFretNumber" + +#. Documentation/snippets/heavily-customized-polymetric-time-signatures.ly:52 (variable) +msgid "drum" +msgstr "percussió" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:60 (comment) +msgid "Solution 1: Using a simple markup with a particular halign value" +msgstr "Solució 1: Usar un etiquetatge simple amb un valor particuluar d'halign" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:61 (comment) +msgid "Drawback: It's a markup, not a dynamic command, so \\dynamicDown" +msgstr "Inconvenient: és un etiquetatge, no una ordre de matís dinàmic," + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:62 (comment) +msgid "etc. will have no effect" +msgstr "per la qual cosa \\dynamicDown, etc., no funcionaran" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:63 (variable) +msgid "semppMarkup" +msgstr "semppMarkup" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:65 (comment) +msgid "Solution 2: Using a dynamic script & shifting with" +msgstr "Solució 2: usar una indicació de dinàmica i desplaçar-la amb" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:66 (comment) +msgid "\\once \\override ... #'X-offset = .." +msgstr "\\once \\override ... #'X-offset = .." + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:67 (comment) +msgid "Drawback: \\once \\override needed for every invocation" +msgstr "Inconvenient: es necessita \\once \\override per a cada invocació" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:68 (variable) +msgid "semppK" +msgstr "semppK" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:75 (comment) +msgid "Solution 3: Padding the dynamic script so the center-alignment" +msgstr "Solució 3: S'està omplint l'script dinàmic de manera que center-alignment" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:76 (comment) +msgid "puts it at the correct position" +msgstr "el posa a la posició correcta" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:77 (comment) +msgid "Drawback: the padding really reserves the space, nothing else can be there" +msgstr "Inconvenient: el farcit en realitat reserva l'espai, no pot haver-hi res més" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:78 (variable) +msgid "semppT" +msgstr "semppT" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:86 (comment) +msgid "Solution 4: Dynamic, setting the dimensions of the additional text to 0" +msgstr "Solució 4: indicació dinàmica, establir les dimensions del text addicional a 0" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:87 (comment) +msgid "Drawback: To lilypond \\\"sempre\\\" has no extent, so it might put" +msgstr "Inconvenient: al LilyPond \\\"sempre\\\" no té dimensions, així que pot posar " + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:88 (comment) +msgid "other stuff there => collisions" +msgstr "aquí altres elments => col·lisions" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:89 (comment) +msgid "Drawback: Also, there seems to be some spacing, so it's not exactly the" +msgstr "Inconvenient: tanmateix, sembla haver-hi una mica d'espaiat, així que no és exactament" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:90 (comment) +msgid "same alignment as without the additional text" +msgstr "la mateixa alineació que sense el text addicional" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:91 (variable) +msgid "semppM" +msgstr "semppM" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:100 (comment) +msgid "Solution 5: Dynamic with explicit shifting inside the scheme function" +msgstr "Solució 5: indicació dinàmica amb desplaçament explícit dins de la funció del Scheme" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:101 (variable) +msgid "semppG" +msgstr "semppG" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:109 (comment) +msgid "Solution 6: Dynamic with explicit alignment. This has only effect" +msgstr "Soluci 6: indicació dinàmica amb alineació explícita. Sols té efecte" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:110 (comment) +msgid "if one sets X-offset!" +msgstr "si s'estableix X-offset!" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:111 (comment) +msgid "Drawback: One needs to set DynamicText #'X-offset!" +msgstr "Inconvenient: Cal fixar DynamicText #'X-offset!" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:112 (comment) +msgid "Drawback: Aligned at the right edge of the additional text," +msgstr "Inconvenient: alineat amb el cantó dret del text addicional," + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:113 (comment) +msgid "not at the center of pp" +msgstr "no al centre del pp" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:114 (variable) +msgid "semppMII" +msgstr "semppMII" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:122 (context id) +msgid "s" +msgstr "s" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:129 (context id) +msgid "sMarkup" +msgstr "sMarkup" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:136 (context id) +msgid "sK" +msgstr "sK" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:147 (context id) +msgid "sT" +msgstr "sT" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:154 (context id) +msgid "sM" +msgstr "sM" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:161 (context id) +msgid "sG" +msgstr "sG" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:168 (context id) +msgid "sMII" +msgstr "sMII" + +#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:172 (comment) +msgid "Setting to ##f (false) gives the same result" +msgstr "Establint-lo a ##f (fals) dóna el mateix resultat" + +#. Documentation/snippets/how-to-change-fret-diagram-position.ly:33 (variable) +#. Documentation/snippets/score-for-diatonic-accordion.ly:67 (variable) +#. Documentation/snippets/showing-chords-at-changes.ly:46 (variable) +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly:73 (variable) +#. Documentation/snippets/single-staff-template-with-notes-and-chords.ly:70 (variable) +msgid "harmonies" +msgstr "harmonies" + +#. Documentation/snippets/how-to-change-fret-diagram-position.ly:36 (comment) +msgid "THE FOLLOWING IS THE COMMAND TO MOVE THE CHORD NAME" +msgstr "LA SEGÜENT ÉS L'ORDRE PER MOURE EL NOM DE L'ACORD" + +#. Documentation/snippets/how-to-change-fret-diagram-position.ly:39 (comment) +msgid "THIS LINE IS THE SECOND METHOD" +msgstr "AQUESTA LÍNIA ÉS EL SEGON MÈTODE" + +#. Documentation/snippets/how-to-change-fret-diagram-position.ly:49 (comment) +msgid "THE FOLLOWING IS THE COMMAND TO MOVE THE FRET DIAGRAM" +msgstr "LA SEGÜENT ÉS L'ORDRE PER MOURE EL DIAGRAMA DE POSICIONS" + +#. Documentation/snippets/how-to-change-fret-diagram-position.ly:52 (comment) +msgid "HERE IS THE SECOND METHOD" +msgstr "AQUÍ ESTÀ EL SEGON MÈTODE" + +#. Documentation/snippets/hymn-template.ly:62 (variable) +msgid "Timeline" +msgstr "Timeline" + +#. Documentation/snippets/hymn-template.ly:94 (comment) +msgid "Start score" +msgstr "Inici de la partitura" + +#. Documentation/snippets/hymn-template.ly:96 (comment) +msgid "Start pianostaff" +msgstr "Inicia pianostaff" + +#. Documentation/snippets/hymn-template.ly:97 (comment) +msgid "Start Staff = RH" +msgstr "Inicia el pentagrama = RH" + +#. Documentation/snippets/hymn-template.ly:100 (comment) +msgid "Start Voice = \\\"Soprano\\\"" +msgstr "Inicia la veu = \\\"Soprano\\\"" + +#. Documentation/snippets/hymn-template.ly:104 (comment) +msgid "End Voice = \\\"Soprano\\\"" +msgstr "Finalitza la veu = \\\"Soprano\\\"" + +#. Documentation/snippets/hymn-template.ly:105 (comment) +msgid "Start Voice = \\\"Alto\\\"" +msgstr "Inicia la veu = \\\"Alto\\\"" + +#. Documentation/snippets/hymn-template.ly:109 (comment) +msgid "End Voice = \\\"Alto\\\"" +msgstr "Finalitza la veu = \\\"Alto\\\"" + +#. Documentation/snippets/hymn-template.ly:110 (comment) +msgid "End Staff = RH" +msgstr "Fi del pentagrama = RH" + +#. Documentation/snippets/hymn-template.ly:111 (comment) +msgid "Start Staff = LH" +msgstr "Inicia el pentagrama = LH" + +#. Documentation/snippets/hymn-template.ly:114 (comment) +msgid "Start Voice = \\\"Tenor\\\"" +msgstr "Inicia la veu = \\\"Tenor\\\"" + +#. Documentation/snippets/hymn-template.ly:118 (comment) +msgid "End Voice = \\\"Tenor\\\"" +msgstr "Finalitza la veu = \\\"Tenor\\\"" + +#. Documentation/snippets/hymn-template.ly:119 (comment) +msgid "Start Voice = \\\"Bass\\\"" +msgstr "Inicia la veu = \\\"Bass\\\"" + +#. Documentation/snippets/hymn-template.ly:123 (comment) +msgid "End Voice = \\\"Bass\\\"" +msgstr "Finalitza la veu = \\\"Bass\\\"" + +#. Documentation/snippets/hymn-template.ly:124 (comment) +msgid "End Staff = LH" +msgstr "Fi del pentagrama = LH" + +#. Documentation/snippets/hymn-template.ly:125 (comment) +msgid "End pianostaff" +msgstr "FI pianostaff" + +#. Documentation/snippets/hymn-template.ly:146 (comment) +msgid "Start paper block" +msgstr "Inicia el bloc de paper" + +#. Documentation/snippets/hymn-template.ly:147 (comment) +msgid "don't indent first system" +msgstr "no facis sagnat a la primera pauta" + +#. Documentation/snippets/hymn-template.ly:148 (comment) +msgid "shorten line length to suit music" +msgstr "redueix la longitud de la línia per adequar-se a la música" + +#. Documentation/snippets/hymn-template.ly:149 (comment) +msgid "End paper block" +msgstr "Fi del bloc de paper" + +#. Documentation/snippets/incipit.ly:88 (variable) +#. Documentation/snippets/incipit.ly:89 (context id) +msgid "discantusIncipit" +msgstr "discantusIncipit" + +#. Documentation/snippets/incipit.ly:125 (variable) +#. Documentation/snippets/incipit.ly:126 (context id) +msgid "altusIncipit" +msgstr "altusIncipit" + +#. Documentation/snippets/incipit.ly:141 (comment) +#. Documentation/snippets/incipit.ly:153 (comment) +#. Documentation/snippets/incipit.ly:182 (comment) +#. Documentation/snippets/incipit.ly:191 (comment) +msgid "two measures" +msgstr "dos compassos" + +#. Documentation/snippets/incipit.ly:161 (variable) +#. Documentation/snippets/incipit.ly:162 (context id) +msgid "tenorIncipit" +msgstr "tenorIncipit" + +#. Documentation/snippets/incipit.ly:197 (variable) +#. Documentation/snippets/incipit.ly:198 (context id) +msgid "bassusIncipit" +msgstr "bassusIncipit" + +#. Documentation/snippets/incipit.ly:268 (comment) +msgid "no bar lines in staves or lyrics" +msgstr "sense línies divisòries als pentagrames o a la lletra" + +#. Documentation/snippets/incipit.ly:271 (comment) +msgid "the next two instructions keep the lyrics between the bar lines" +msgstr "les dues instruccions següents mantenen la lletra entre les barres de compàs" + +#. Documentation/snippets/incipit.ly:281 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:290 (comment) +msgid "Comment in the below \\\"\\remove\\\" command to allow line" +msgstr "Suprimeixi el comentaria a l'ordre \\\"\\remove\\\" de sota per permetre" + +#. Documentation/snippets/incipit.ly:282 (comment) +msgid "breaking also at those bar lines where a note overlaps" +msgstr "el salt de línia també a aquelles línies de barra on se superposa una nota" + +#. Documentation/snippets/incipit.ly:283 (comment) +msgid "into the next measure. The command is commented out in this" +msgstr "al compàs següent. L'ordre està cancel·lada amb un comentari a aquesta" + +#. Documentation/snippets/incipit.ly:284 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:293 (comment) +msgid "short example score, but especially for large scores, you" +msgstr "partitura curta de exemple, però especialment per a partitures extenses," + +#. Documentation/snippets/incipit.ly:285 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:294 (comment) +msgid "will typically yield better line breaking and thus improve" +msgstr "generalment obtindreu salts de pàgina millors i això millorareu" + +#. Documentation/snippets/incipit.ly:286 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:295 (comment) +msgid "overall spacing if you comment in the following command." +msgstr "l'espaiat general si elimineu el comentari de l'ordre següent." + +#. Documentation/snippets/incipit.ly:287 (comment) +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:296 (comment) +msgid "\\remove \\\"Forbid_line_break_engraver\\\"" +msgstr "\\remove \\\"Forbid_line_break_engraver\\\"" + +#. Documentation/snippets/inserting-score-fragments-above-a-staff,-as-markups.ly:21 (variable) +msgid "tuning" +msgstr "afinació" + +#. Documentation/snippets/isolated-percent-repeats.ly:46 (variable) +msgid "makePercent" +msgstr "makePercent" + +#. Documentation/snippets/jazz-combo-template.ly:82 (comment) +msgid "#(set-global-staff-size 16)" +msgstr "#(set-global-staff-size 16)" + +#. Documentation/snippets/jazz-combo-template.ly:85 (comment) +msgid "Some macros %%%%%%%%%%%%%%%%%%%" +msgstr "Alguns macros %%%%%%%%%%%%%%%%%%%" + +#. Documentation/snippets/jazz-combo-template.ly:87 (variable) +msgid "sl" +msgstr "sl" + +#. Documentation/snippets/jazz-combo-template.ly:92 (variable) +msgid "nsl" +msgstr "nsl" + +#. Documentation/snippets/jazz-combo-template.ly:97 (variable) +msgid "crOn" +msgstr "crOn" + +#. Documentation/snippets/jazz-combo-template.ly:98 (variable) +msgid "crOff" +msgstr "crOff" + +#. Documentation/snippets/jazz-combo-template.ly:100 (comment) +msgid "insert chord name style stuff here." +msgstr "insereix aquí el codi per a l'estil de noms de l'acord" + +#. Documentation/snippets/jazz-combo-template.ly:102 (variable) +msgid "jazzChords" +msgstr "jazzChords" + +#. Documentation/snippets/jazz-combo-template.ly:104 (comment) +msgid "Keys'n'thangs %%%%%%%%%%%%%%%%%" +msgstr "Keys'n'thangs %%%%%%%%%%%%%%%%%" + +#. Documentation/snippets/jazz-combo-template.ly:108 (variable) +msgid "Key" +msgstr "To" + +#. Documentation/snippets/jazz-combo-template.ly:110 (comment) +msgid "############ Horns ############" +msgstr "############ Trompes ############" + +#. Documentation/snippets/jazz-combo-template.ly:112 (comment) +msgid "------ Trumpet ------" +msgstr "------ Trompeta ------" + +#. Documentation/snippets/jazz-combo-template.ly:113 (variable) +msgid "trpt" +msgstr "trpt" + +#. Documentation/snippets/jazz-combo-template.ly:117 (variable) +msgid "trpHarmony" +msgstr "trpHarmony" + +#. Documentation/snippets/jazz-combo-template.ly:120 (variable) +#. Documentation/snippets/jazz-combo-template.ly:300 (context id) +#. Documentation/snippets/staff-headword.ly:96 (context id) +#. Documentation/snippets/staff-headword.ly:115 (context id) +msgid "trumpet" +msgstr "trompeta" + +#. Documentation/snippets/jazz-combo-template.ly:129 (comment) +msgid "------ Alto Saxophone ------" +msgstr "------ Saxofó alt ------" + +#. Documentation/snippets/jazz-combo-template.ly:134 (variable) +msgid "altoHarmony" +msgstr "altoHarmony" + +#. Documentation/snippets/jazz-combo-template.ly:137 (variable) +msgid "altoSax" +msgstr "altoSax" + +#. Documentation/snippets/jazz-combo-template.ly:146 (comment) +msgid "------ Baritone Saxophone ------" +msgstr "------ Saxofó baríton ------" + +#. Documentation/snippets/jazz-combo-template.ly:147 (variable) +msgid "bari" +msgstr "bari" + +#. Documentation/snippets/jazz-combo-template.ly:155 (variable) +msgid "bariHarmony" +msgstr "bariHarmony" + +#. Documentation/snippets/jazz-combo-template.ly:158 (variable) +msgid "bariSax" +msgstr "bariSax" + +#. Documentation/snippets/jazz-combo-template.ly:167 (comment) +msgid "------ Trombone ------" +msgstr "------ Trombó ------" + +#. Documentation/snippets/jazz-combo-template.ly:168 (variable) +msgid "tbone" +msgstr "tbone" + +#. Documentation/snippets/jazz-combo-template.ly:172 (variable) +msgid "tboneHarmony" +msgstr "tboneHarmony" + +#. Documentation/snippets/jazz-combo-template.ly:175 (variable) +#. Documentation/snippets/jazz-combo-template.ly:304 (context id) +msgid "trombone" +msgstr "trombó" + +#. Documentation/snippets/jazz-combo-template.ly:184 (comment) +msgid "############ Rhythm Section #############" +msgstr "############ Secció rítmica #############" + +#. Documentation/snippets/jazz-combo-template.ly:186 (comment) +msgid "------ Guitar ------" +msgstr "------ Guitarra ------" + +#. Documentation/snippets/jazz-combo-template.ly:187 (variable) +msgid "gtr" +msgstr "gtr" + +#. Documentation/snippets/jazz-combo-template.ly:195 (variable) +msgid "gtrHarmony" +msgstr "gtrHarmony" + +#. Documentation/snippets/jazz-combo-template.ly:208 (comment) +msgid "------ Piano ------" +msgstr "------ Piano ------" + +#. Documentation/snippets/jazz-combo-template.ly:209 (variable) +msgid "rhUpper" +msgstr "rhUpper" + +#. Documentation/snippets/jazz-combo-template.ly:214 (variable) +msgid "rhLower" +msgstr "rhLower" + +#. Documentation/snippets/jazz-combo-template.ly:220 (variable) +msgid "lhUpper" +msgstr "lhUpper" + +#. Documentation/snippets/jazz-combo-template.ly:225 (variable) +msgid "lhLower" +msgstr "lhLower" + +#. Documentation/snippets/jazz-combo-template.ly:231 (variable) +msgid "PianoRH" +msgstr "PianoRH" + +#. Documentation/snippets/jazz-combo-template.ly:240 (variable) +msgid "PianoLH" +msgstr "PianoLH" + +#. Documentation/snippets/jazz-combo-template.ly:258 (comment) +msgid "------ Bass Guitar ------" +msgstr "------ Guitarra baix ------" + +#. Documentation/snippets/jazz-combo-template.ly:272 (comment) +msgid "------ Drums ------" +msgstr "------ Percussió ------" + +#. Documentation/snippets/jazz-combo-template.ly:286 (variable) +msgid "drumContents" +msgstr "drumContents" + +#. Documentation/snippets/jazz-combo-template.ly:295 (comment) +#, python-format +msgid "It All Goes Together Here %%%%%%%%%%%%%%%%%%%%%%" +msgstr "Aquí va tot plegat %%%%%%%%%%%%%%%%%%%%%%" + +#. Documentation/snippets/jazz-combo-template.ly:299 (context id) +msgid "horns" +msgstr "trompes" + +#. Documentation/snippets/jazz-combo-template.ly:301 (context id) +msgid "altosax" +msgstr "altosax" + +#. Documentation/snippets/jazz-combo-template.ly:302 (context id) +msgid "barichords" +msgstr "barichords" + +#. Documentation/snippets/jazz-combo-template.ly:303 (context id) +msgid "barisax" +msgstr "barisax" + +#. Documentation/snippets/jazz-combo-template.ly:308 (context id) +msgid "chords" +msgstr "acordes" + +#. Documentation/snippets/keyboard-headword.ly:19 (comment) +msgid "M. Ravel, Sonatine (1905)" +msgstr "M. Ravel, Sonatine (1905)" + +#. Documentation/snippets/keyboard-headword.ly:20 (comment) +msgid "First movement" +msgstr "Primer moviment" + +#. Documentation/snippets/keyboard-headword.ly:30 (variable) +msgid "fermataLong" +msgstr "fermataLong" + +#. Documentation/snippets/makam-example.ly:58 (comment) +msgid "Initialize makam settings" +msgstr "Inicia els paràmetres de configuració de makam" + +#. Documentation/snippets/manually-break-figured-bass-extenders-for-only-some-numbers.ly:24 (variable) +msgid "bassfigures" +msgstr "bassfigures" + +#. Documentation/snippets/manually-controlling-beam-positions.ly:26 (comment) +msgid "from upper staff-line (position 2) to center (position 0)" +msgstr "des de la línia de pauta superior (posició 2) al centre (posició 0)" + +#. Documentation/snippets/manually-controlling-beam-positions.ly:29 (comment) +msgid "from center to one above center (position 1)" +msgstr "des del centre a una sobre el centre (posició 1)" + +#. Documentation/snippets/marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly:22 (variable) +msgid "speakOn" +msgstr "speakOn" + +#. Documentation/snippets/marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly:39 (variable) +msgid "speakOff" +msgstr "speakOff" + +#. Documentation/snippets/markup-lines.ly:27 (comment) +msgid "Candide, Voltaire" +msgstr "Candide, Voltaire" + +#. Documentation/snippets/mensurstriche-layout-bar-lines-between-the-staves.ly:60 (comment) +msgid "the final bar line is not interrupted" +msgstr "la línia de barra final no s'interromp" + +#. Documentation/snippets/merging-multi-measure-rests-in-a-polyphonic-part.ly:22 (variable) +msgid "normalPos" +msgstr "normalPos" + +#. Documentation/snippets/modifying-default-values-for-articulation-shorthand-notation.ly:75 (variable) +msgid "dashPlus" +msgstr "dashPlus" + +#. Documentation/snippets/modifying-tuplet-bracket-length.ly:28 (comment) +msgid "Set tuplets to be extendable..." +msgstr "Fer els grups especials extensibles..." + +#. Documentation/snippets/modifying-tuplet-bracket-length.ly:30 (comment) +msgid "...to cover all items up to the next note" +msgstr "... per a què cobreixin tots els elements fins la nota següent" + +#. Documentation/snippets/modifying-tuplet-bracket-length.ly:34 (comment) +msgid "...or to cover just whitespace" +msgstr "... o per cobrir sols l'espai buit" + +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:27 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:91 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:72 (variable) +#. Documentation/snippets/vocal-ensemble-template.ly:89 (variable) +msgid "sopMusic" +msgstr "sopMusic" + +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:28 (comment) +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:34 (comment) +msgid "VERSE ONE" +msgstr "ESTROFA U" + +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:56 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:126 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:102 (context id) +#. Documentation/snippets/vocal-ensemble-template.ly:123 (context id) +msgid "women" +msgstr "dones" + +#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:68 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:136 (context id) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:114 (context id) +#. Documentation/snippets/vocal-ensemble-template.ly:138 (context id) +msgid "men" +msgstr "homes" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:41 (variable) +msgid "openStringHarmonics" +msgstr "openStringHarmonics" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:42 (comment) +msgid "first harmonic" +msgstr "primer harmònic" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:45 (comment) +msgid "second harmonic" +msgstr "segon harmònic" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:50 (comment) +msgid "\\harmonicByFret #19 < e,\\6 a,\\5 d\\4 >" +msgstr "\\harmonicByFret #19 < e,\\6 a,\\5 d\\4 >" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:51 (comment) +msgid "\\harmonicByRatio #2/3 < e,\\6 a,\\5 d\\4 >" +msgstr "\\harmonicByRatio #2/3 < e,\\6 a,\\5 d\\4 >" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:52 (comment) +msgid "third harmonic" +msgstr "tercer harmònic" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:58 (comment) +msgid "fourth harmonic" +msgstr "quart harmònic" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:65 (comment) +msgid "fifth harmonic" +msgstr "cinquè harmònic" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:69 (comment) +msgid "sixth harmonic" +msgstr "sisè harmònic" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:72 (comment) +msgid "seventh harmonic" +msgstr "setè harmònic" + +#. Documentation/snippets/open-string-harmonics-in-tablature.ly:75 (comment) +msgid "eighth harmonic" +msgstr "vuitè harmònic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:74 (comment) +msgid "space for instrumentName" +msgstr "espai per a instrumentName" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:75 (comment) +msgid "space for shortInstrumentName" +msgstr "espai per a shortInstrumentName" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:78 (variable) +msgid "fluteMusic" +msgstr "fluteMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:79 (comment) +msgid "Pitches as written on a manuscript for Clarinet in A" +msgstr "Les tonalitats tal com s'escriuen a un manuscrit per a clarinet en La" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:80 (comment) +msgid "are transposed to concert pitch." +msgstr "es transcriuen al to de concert." + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:81 (variable) +msgid "clarinetMusic" +msgstr "clarinetMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:83 (variable) +msgid "trumpetMusic" +msgstr "trumpetMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:84 (comment) +msgid "Key signature is often omitted for horns" +msgstr "Se sol ometre l'armadura per a les trompes" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:85 (variable) +msgid "hornMusic" +msgstr "hornMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:87 (variable) +msgid "percussionMusic" +msgstr "percussionMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:90 (variable) +msgid "altoIMusic" +msgstr "altoIMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:91 (variable) +msgid "altoIIMusic" +msgstr "altoIIMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:92 (variable) +msgid "altoILyrics" +msgstr "altoILyrics" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:93 (variable) +msgid "altoIILyrics" +msgstr "altoIILyrics" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:96 (variable) +msgid "pianoRHMusic" +msgstr "pianoRHMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:97 (variable) +msgid "pianoLHMusic" +msgstr "pianoLHMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:98 (variable) +msgid "violinIMusic" +msgstr "violinIMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:99 (variable) +msgid "violinIIMusic" +msgstr "violinIIMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:100 (variable) +msgid "violaMusic" +msgstr "violaMusic" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:109 (comment) +msgid "shortInstrumentName, midiInstrument, etc." +msgstr "shortInstrumentName, midiInstrument, etc." + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:110 (comment) +msgid "may be set here as well" +msgstr "es pot establir també aquí" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:116 (comment) +msgid "Declare that written Middle C in the music" +msgstr "Declara que el Do central escrit a la música" + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:117 (comment) +msgid "to follow sounds a concert B flat, for" +msgstr "següent sona com si fos un Si bemoll de concert, per " + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:118 (comment) +msgid "output using sounded pitches such as MIDI." +msgstr "a la sortida que usa tonalitats sonores tal com el MIDI." + +#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:120 (comment) +msgid "Print music for a B-flat clarinet" +msgstr "Imprimeix música per al clarinet en Si bemoll" + +#. Documentation/snippets/partcombine-and-autobeamoff.ly:150 (comment) +msgid "\\set Staff.autoBeaming = ##f % turns off all autobeaming" +msgstr "\\set Staff.autoBeaming = ##f % desactiva tot el barrat automàtic" + +#. Documentation/snippets/partcombine-and-autobeamoff.ly:153 (comment) +msgid "applies to split up stems" +msgstr "és rellevant per a dividir les vírgules" + +#. Documentation/snippets/partcombine-and-autobeamoff.ly:155 (comment) +msgid "\\autoBeamOff % applies to combined up stems" +msgstr "\\autoBeamOff % s'aplica a les vírgules cap amunt combinades" + +#. Documentation/snippets/partcombine-and-autobeamoff.ly:160 (comment) +msgid "applies to down stems" +msgstr "s'aplica a les vírgules cap abaix" + +#. Documentation/snippets/percussion-beaters.ly:23 (variable) +msgid "stick" +msgstr "baqueta" + +#. Documentation/snippets/permitting-line-breaks-within-beamed-tuplets.ly:57 (comment) +msgid "Permit line breaks within tuplets" +msgstr "Permetre saltes de línia dins de grups especials" + +#. Documentation/snippets/permitting-line-breaks-within-beamed-tuplets.ly:59 (comment) +msgid "Allow beams to be broken at line breaks" +msgstr "Permet que les vírgules es divideixin als salts de línia" + +#. Documentation/snippets/permitting-line-breaks-within-beamed-tuplets.ly:66 (comment) +msgid "Insert a manual line break within a tuplet" +msgstr "Insereix un salt de línia manual dins d'un grup especial" + +#. Documentation/snippets/pitches-headword.ly:19 (comment) +msgid "L. v. Beethoven" +msgstr "L. van Beethoven" + +#. Documentation/snippets/pitches-headword.ly:20 (comment) +msgid "Piano sonata 21 - Dem Grafen von Waldstein Gewidmet" +msgstr "Sonata per a piano núm. 21 - Dem Grafen von Waldstein Gewidmet" + +#. Documentation/snippets/pitches-headword.ly:21 (comment) +msgid "chorale at measures 34 - 40+" +msgstr "coral als compassoss 34 a 40 i següents" + +#. Documentation/snippets/pitches-headword.ly:30 (comment) +msgid "RH Voice 1" +msgstr "Veu 1 de la mà dreta" + +#. Documentation/snippets/pitches-headword.ly:58 (comment) +msgid "(" +msgstr "(" + +#. Documentation/snippets/pitches-headword.ly:63 (comment) +msgid ")" +msgstr ")" + +#. Documentation/snippets/pitches-headword.ly:67 (comment) +msgid "RH Voice 2" +msgstr "Veu 2 de la mà dreta" + +#. Documentation/snippets/polyphony-in-tablature.ly:62 (context id) +msgid "tab" +msgstr "tab" + +#. Documentation/snippets/positioning-multi-measure-rests.ly:66 (comment) +msgid "Multi-measure rests by default are set under the fourth line" +msgstr "Els silencis de compassos múltiples s'estableixen de forma predeterminada a la quarta línia" + +#. Documentation/snippets/positioning-multi-measure-rests.ly:68 (comment) +msgid "They can be moved using an override" +msgstr "Es poden moure usant un override" + +#. Documentation/snippets/positioning-multi-measure-rests.ly:82 (comment) +msgid "In two Voices, odd-numbered voices are under the top line" +msgstr "En dos veus. les veus senars van a sota de la línia superior" + +#. Documentation/snippets/positioning-multi-measure-rests.ly:84 (comment) +msgid "Even-numbered voices are under the bottom line" +msgstr "Les veus parells van a sota de la línia inferior" + +#. Documentation/snippets/positioning-multi-measure-rests.ly:86 (comment) +msgid "Multi-measure rests in both voices remain separate" +msgstr "Els silencis de compassos múltiples a ambdues veus romanen separades" + +#. Documentation/snippets/positioning-multi-measure-rests.ly:89 (comment) +msgid "Separating multi-measure rests in more than two voices" +msgstr "Per separar els silencis de compassos múltiples a més de dues veus" + +#. Documentation/snippets/positioning-multi-measure-rests.ly:90 (comment) +msgid "requires an override" +msgstr "es requereix una ordre override" + +#. Documentation/snippets/positioning-multi-measure-rests.ly:96 (comment) +msgid "Using compressed bars in multiple voices requires another override" +msgstr "Per usar barres comprimides a múltiples veus es requereix un altre override" + +#. Documentation/snippets/positioning-multi-measure-rests.ly:97 (comment) +msgid "in all voices to avoid multiple instances being printed" +msgstr "a totes les veus per evitar que s'imprimeixi més d'una instància" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:33 (comment) +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:54 (comment) +msgid "Set segno sign as rehearsal mark and adjust size if needed" +msgstr "Estableix una marca de segno com a marca de pràctica i ajusta la mida si és necessari" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:34 (comment) +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:56 (comment) +msgid "\\once \\override Score.RehearsalMark #'font-size = #3" +msgstr "\\once \\override Score.RehearsalMark #'font-size = #3" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:40 (comment) +msgid "Set coda sign as rehearsal mark and adjust size if needed" +msgstr "Estableix el símbol coda com a marca de pràctica i ajusta la mida si fa falta" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:47 (comment) +msgid "Should Coda be on anew line?" +msgstr "Ha d'anar la Coda a una nova línia?" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:48 (comment) +msgid "Coda NOT on new line: use \\nobreak" +msgstr "La coda NO està a una línia nova: useu \\nobreak" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:49 (comment) +msgid "Coda on new line: DON'T use \\nobreak" +msgstr "La coda a una línia nova: NO useu \\nobreak" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:50 (comment) +msgid "\\noBreak" +msgstr "\\noBreak" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:59 (comment) +msgid "Here begins the trickery!" +msgstr "Ací comencen les enganyifes!" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:60 (comment) +msgid "" +"\\cadenzaOn will suppress the bar count and \\stopStaff removes the staff " +"lines." +msgstr "\\cadenzaOn suprimeix el recompte de compassos i \\stopStaff els pentagrames" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:63 (comment) +msgid "Some examples of possible text-displays" +msgstr "Alguns exemples de text-displays possibles" + +# fuzzy. FVD +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:65 (comment) +msgid "text line-aligned" +msgstr "text line-aligned" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:66 (comment) +msgid "==================" +msgstr "==================" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:67 (comment) +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:73 (comment) +msgid "Move text to the desired position" +msgstr "Mou el text a la posició desitjada" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:68 (comment) +msgid "\\once \\override TextScript #'extra-offset = #'( 2 . -3.5 )" +msgstr "\\once \\override TextScript #'extra-offset = #'( 2 . -3.5 )" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:69 (comment) +msgid "| s1*0^\\markup { D.S. al Coda } }" +msgstr "| s1*0^\\markup { D.S. al Coda } }" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:71 (comment) +msgid "text center-aligned" +msgstr "text center-aligned" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:72 (comment) +msgid "====================" +msgstr "====================" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:74 (comment) +msgid "\\once \\override TextScript #'extra-offset = #'( 6 . -5.0 )" +msgstr "\\once \\override TextScript #'extra-offset = #'( 6 . -5.0 )" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:75 (comment) +msgid "| s1*0^\\markup { \\center-column { D.S. \\\"al Coda\\\" } }" +msgstr "| s1*0^\\markup { \\center-column { D.S. \\\"al Coda\\\" } }" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:77 (comment) +msgid "text and symbols center-aligned" +msgstr "el text i els símbols center-aligned" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:78 (comment) +msgid "===============================" +msgstr "===============================" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:79 (comment) +msgid "" +"Move text to the desired position and tweak spacing for optimum text " +"alignment" +msgstr "Mou el text a la posició desitjada i ajusta l'espaiat per un alineament òptim del text" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:80 (comment) +msgid "\\once \\override TextScript #'extra-offset = #'( 8 . -5.5 )" +msgstr "\\once \\override TextScript #'extra-offset = #'( 8 . -5.5 )" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:86 (comment) +msgid "Increasing the unfold counter will expand the staff-free space" +msgstr "L'increment del comptador de desplegament expandirà l'espai sense pentagrama" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:91 (comment) +msgid "Resume bar count and show staff lines again" +msgstr "Continua amb el recompte de compassos i mostra les línies de compàs un altre cop" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:95 (comment) +msgid "Should Coda be on new line?" +msgstr "Voleu que la coda aparegui en una nova línia?" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:96 (comment) +msgid "Coda NOT on new line: DON'T use \\break" +msgstr "La coda NO hi és a una línia nova: NO useu \\break" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:97 (comment) +msgid "Coda on new line: use \\break" +msgstr "Coda a línia nova. useu \\break" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:100 (comment) +msgid "Show up, you clef and key!" +msgstr "Mostreu-vos, clau i armadura!" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:104 (comment) +msgid "Set coda sign as rehearsal mark and adjust size and position" +msgstr "Estableix el símbol de coda com a marca de pràctica i ajusta la mida i la posició" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:106 (comment) +msgid "" +"Put the coda sign ontop of the (treble-)clef dependend on coda's line-" +"position" +msgstr "Posa el símbol de coda de la clau (de sol) depenent de la posició de línia de la coda" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:108 (comment) +msgid "Coda NOT on new line, use this:" +msgstr "La coda NO hi és a una nova línia, useu això:" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:109 (comment) +msgid "\\once \\override Score.RehearsalMark #'extra-offset = #'( -2 . 1.75 )" +msgstr "\\once \\override Score.RehearsalMark #'extra-offset = #'( -2 . 1.75 )" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:111 (comment) +msgid "Coda on new line, use this:" +msgstr "La coda és a una nova linia, feu això:" + +#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:117 (comment) +msgid "The coda" +msgstr "La coda" + +#. Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly:31 (comment) +#. Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly:49 (comment) +msgid "due to issue 2362 the following line is commented" +msgstr "a causa de l'error número 2362, la línia següent està comentada" + +#. Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly:32 (comment) +#. Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly:50 (comment) +msgid "\\mark \\\"Composed Feb 2007 - Feb 2008\\\"" +msgstr "\\mark \\\"Composat entre feb. de 2007 i feb. de 2008\\\"" + +#. Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly:33 (comment) +#. Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly:51 (comment) +msgid "and a shorter mark is used." +msgstr "i s'usa una marca més curta." + +#. Documentation/snippets/printing-bar-numbers-at-regular-intervals.ly:61 (comment) +msgid "Permit first bar number to be printed" +msgstr "Permet que el número del primer compàs s'imprimeixi" + +#. Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly:47 (comment) +msgid "Prevent bar numbers at the end of a line and permit them elsewhere" +msgstr "No posis número de compàs al final d'una línia però posal's a tot els altres llocs" + +#. Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly:54 (comment) +msgid "Draw a box round the following bar number(s)" +msgstr "Dibuixa una caixa al voltant del(s) següent(s) número(s) de compàs" + +#. Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly:59 (comment) +msgid "Draw a circle round the following bar number(s)" +msgstr "Dibuixa un cercle al voltant del(s) següent(s) número(s) de compàs" + +#. Documentation/snippets/printing-metronome-and-rehearsal-marks-below-the-staff.ly:59 (comment) +msgid "Metronome marks below the staff" +msgstr "Marques de metrònom a sota del pentagrama" + +#. Documentation/snippets/printing-metronome-and-rehearsal-marks-below-the-staff.ly:64 (comment) +msgid "Rehearsal marks below the staff" +msgstr "Marques de pràctica a sota del pentagrama" + +#. Documentation/snippets/printing-music-with-different-time-signatures.ly:60 (variable) +msgid "Bassklarinette" +msgstr "Bassklarinette" + +#. Documentation/snippets/printing-music-with-different-time-signatures.ly:104 (variable) +msgid "Perkussion" +msgstr "Percussió" + +#. Documentation/snippets/putting-lyrics-inside-the-staff.ly:24 (context id) +msgid "voc" +msgstr "voc" + +#. Documentation/snippets/quoting-another-voice-with-transposition.ly:73 (variable) +msgid "quoteTest" +msgstr "quoteTest" + +#. Documentation/snippets/quoting-another-voice-with-transposition.ly:74 (comment) +msgid "french horn" +msgstr "trompa" + +#. Documentation/snippets/quoting-another-voice.ly:80 (variable) +msgid "quoteMe" +msgstr "quoteMe" + +#. Documentation/snippets/quoting-another-voice.ly:85 (variable) +msgid "original" +msgstr "original" + +#. Documentation/snippets/recorder-fingering-chart.ly:39 (comment) +msgid "range chart for paetzold contrabass recorder" +msgstr "quadre de rangs per a la flauta dolça contrabaix paetzold" + +#. Documentation/snippets/redefining-grace-note-global-defaults.ly:69 (variable) +msgid "startAcciaccaturaMusic" +msgstr "startAcciaccaturaMusic" + +#. Documentation/snippets/redefining-grace-note-global-defaults.ly:75 (variable) +msgid "stopAcciaccaturaMusic" +msgstr "stopAcciaccaturaMusic" + +#. Documentation/snippets/removing-the-first-empty-line.ly:85 (comment) +msgid "To use the setting globally, uncomment the following line:" +msgstr "Per usar aquest paràmetre de configuració globalment traieu el comentari de la següent línia:" + +#. Documentation/snippets/removing-the-first-empty-line.ly:86 (comment) +msgid "\\override VerticalAxisGroup #'remove-first = ##t" +msgstr "\\override VerticalAxisGroup #'remove-first = ##t" + +#. Documentation/snippets/removing-the-first-empty-line.ly:95 (comment) +msgid "To use the setting globally, comment this line," +msgstr "Per usar aquest paràmetre d'ajust globalment, comenteu la línia següent:" + +#. Documentation/snippets/removing-the-first-empty-line.ly:96 (comment) +msgid "uncomment the line in the \\layout block above" +msgstr "traieu el comentari de la línia del bloc \\layout de dalt" + +#. Documentation/snippets/repeats-headword.ly:19 (comment) +msgid "Beethoven, Op. 57" +msgstr "Beethoven, Op. 57" + +#. Documentation/snippets/repeats-headword.ly:20 (comment) +msgid "Piano sonata 23 - Dem Grafen Franz von Brunswick Gewidmet" +msgstr "Sonata per a piano núm. 23; dedicada a Franz von Brunswick" + +#. Documentation/snippets/repeats-headword.ly:21 (comment) +msgid "Movt II, Andante con moto" +msgstr "Mov. II, Andante con moto" + +#. Documentation/snippets/repeats-headword.ly:22 (comment) +msgid "Measures 9 - 16" +msgstr "Compassos 9 a 16" + +#. Documentation/snippets/reverting-default-beam-endings.ly:55 (comment) +msgid "Default beaming" +msgstr "Barrat predeterminat" + +#. Documentation/snippets/reverting-default-beam-endings.ly:58 (comment) +msgid "Set new values for beam endings" +msgstr "Estableix valors nous per als finals de barra" + +#. Documentation/snippets/rhythmic-slashes.ly:30 (comment) +msgid "Macro to print single slash" +msgstr "Macro per imprimir una barra inclinada única" + +#. Documentation/snippets/rhythmic-slashes.ly:31 (variable) +msgid "rs" +msgstr "rs" + +#. Documentation/snippets/rhythmic-slashes.ly:38 (comment) +msgid "Function to print a specified number of slashes" +msgstr "Funció per imprimir un nombre especificat de barres inclinades" + +#. Documentation/snippets/rhythmic-slashes.ly:39 (variable) +msgid "comp" +msgstr "comp" + +#. Documentation/snippets/rhythms-headword.ly:19 (comment) +msgid "Beethoven, Op. 81a" +msgstr "Beethoven, Op. 81a" + +#. Documentation/snippets/rhythms-headword.ly:20 (comment) +msgid "Piano sonata 26 - Das Lebewohl" +msgstr "Sonata per a piano núm. 26 - Das Lebewohl" + +#. Documentation/snippets/rhythms-headword.ly:21 (comment) +msgid "Movt II - Abwesenheit" +msgstr "Mov. II - Abwesenheit" + +#. Documentation/snippets/rhythms-headword.ly:22 (comment) +msgid "Measures 31 - 34" +msgstr "Compassos 31 a 34" + +#. Documentation/snippets/rhythms-headword.ly:31 (comment) +msgid "\\override SpacingSpanner #'strict-grace-spacing = ##t" +msgstr "\\override SpacingSpanner #'strict-grace-spacing = ##t" + +#. Documentation/snippets/satb-choir-template---four-staves.ly:58 (variable) +msgid "sopranonotes" +msgstr "sopranonotes" + +#. Documentation/snippets/satb-choir-template---four-staves.ly:61 (variable) +msgid "sopranowords" +msgstr "sopranowords" + +#. Documentation/snippets/satb-choir-template---four-staves.ly:62 (variable) +msgid "altonotes" +msgstr "altonotes" + +#. Documentation/snippets/satb-choir-template---four-staves.ly:65 (variable) +msgid "altowords" +msgstr "altowords" + +#. Documentation/snippets/satb-choir-template---four-staves.ly:66 (variable) +msgid "tenornotes" +msgstr "tenornotes" + +#. Documentation/snippets/satb-choir-template---four-staves.ly:70 (variable) +msgid "tenorwords" +msgstr "tenorwords" + +#. Documentation/snippets/satb-choir-template---four-staves.ly:71 (variable) +msgid "bassnotes" +msgstr "bassnotes" + +#. Documentation/snippets/satb-choir-template---four-staves.ly:75 (variable) +msgid "basswords" +msgstr "basswords" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:65 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:73 (comment) +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:87 (comment) +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:103 (comment) +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:119 (comment) +msgid "verse" +msgstr "estrofa" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:75 (variable) +msgid "NoStem" +msgstr "NoStem" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:76 (variable) +msgid "NoNoteHead" +msgstr "NoNoteHead" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:77 (variable) +msgid "ZeroBeam" +msgstr "ZeroBeam" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:79 (variable) +msgid "staffTabLine" +msgstr "staffTabLine" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:84 (comment) +msgid "" +"Shows one horizontal line. The vertical line (simulating a bar-line) is " +"simulated with a gridline" +msgstr "Mostra una línia horitzontal. La línia vertical (simulant una línia divisòria) se simula amb una línia d'entramat" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:89 (comment) +msgid "disable the following line to see the the noteheads while writing the song" +msgstr "deshabiliteu la línia següent per veure els caps de les notes escriu la cancó" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:93 (comment) +msgid "The beam between 8th-notes is used to draw the push-line" +msgstr "La barra entre les corxeres s'usa per traçar la línia de tancar" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:94 (comment) +msgid "How to fast write the push-lines:" +msgstr "Com escriure de forma ràpida les push-lines:" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:95 (comment) +msgid "1. write repeatedly 'c c c c c c c c |' for the whole length of the song" +msgstr "1. escriviu repetidament 'c c c c c c c c |' a tota la cançó" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:96 (comment) +msgid "2. uncomment the line \\NoNoteHead" +msgstr "2. traieu el comentari de la línia \\NoNoteHead" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:97 (comment) +msgid "3. compile" +msgstr "3. compileu" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:98 (comment) +msgid "4. Mark the positions on which push/pull changes." +msgstr "4. Marqueu les posicions a les quals canvia pujar/baixar." + +#. Documentation/snippets/score-for-diatonic-accordion.ly:99 (comment) +msgid "In the score-picture click on the position the push- or pull-part starts" +msgstr "A la imatge de la partitura polsi sobre la posició on s'inicien les parts de pujar i baixar" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:100 (comment) +msgid "(on the noteHead, the cursor will change to a hand-icon)." +msgstr "(sobre el cap de la nota, el cursor canviarà a una icona que és una mà)" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:101 (comment) +msgid "The cursor in the source code will jump just at this position." +msgstr "El cursor al codi font saltarà just a aquesta posició." + +#. Documentation/snippets/score-for-diatonic-accordion.ly:102 (comment) +msgid "a) If a push-part starts there, replace the 'c' by an 'e['" +msgstr "a) Si en aquest lloc comença una part de pujar, canvieu la 'c' per una 'e['" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:103 (comment) +msgid "b) If a pull-part starts there, replace the 'c' by an 's'" +msgstr "b) Si en aquest lloc comença una part de baixar, substituïu la 'c' per uns 's'" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:104 (comment) +msgid "5. Switch into 'overwrite-mode' by pressing the 'ins' key." +msgstr "5. Canvia mode de sobreescriure prement la tecla 'ins'." + +#. Documentation/snippets/score-for-diatonic-accordion.ly:105 (comment) +msgid "6. For the pull-parts overwrite the 'c' with 's'" +msgstr "6. Per a les parts de baixar sobreescriviu la 'c' amb 's'" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:106 (comment) +msgid "7. For every push-part replace the last 'c' with 'e]'" +msgstr "7. Per a cada part de pujar substituïu l'última 'c' amb 'e]'" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:107 (comment) +msgid "8. Switch into 'insert-mode' again" +msgstr "8. Canvia a mode d'inserció un altre cop" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:108 (comment) +msgid "" +"9. At last it should look lik e.g. (s s e[ c | c c c c c c c c | c c c c c c " +"e] s s)" +msgstr "9. Al final es veurà como per exemple. (s s e[ c | c c c c c c c c | c c c c c c e] s s)" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:109 (comment) +msgid "10. re-enable the line \\NoNoteHead" +msgstr "10. reactiva la línia \\NoNoteHead" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:119 (comment) +msgid "Accordion melody in tabulator score" +msgstr "Melodia de acordió en partitura de tablatura" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:120 (comment) +msgid "1. Place a copy of the piano melody below" +msgstr "1. Posa una còpia de la melodia del piano a sota" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:121 (comment) +#. Documentation/snippets/score-for-diatonic-accordion.ly:140 (comment) +msgid "" +"2. Separate piano melody into pull- and push-parts according to the " +"staffTabLine you've already made" +msgstr "2. Separa la melodia de piano en parts de baixar i pujar d'acord amb la staffTabLine que ja heu fet" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:122 (comment) +msgid "" +"3. For each line: Double the line. Remark the 1st one (Keeps unchanged as " +"reference) and then change the second line using the transformation paper" +msgstr "3. Per a cada línia: duplica la línia. Remarca la primera (es manté sense canvi com a referència) i després canvia la segona línia usant el paper de transformació" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:123 (comment) +msgid "or the macros 'conv2diaton push.bsh' and 'conv2diaton pull.bsh'" +msgstr "o els macros 'conv2diaton push.bsh' i 'conv2diaton pull.bsh' " + +#. Documentation/snippets/score-for-diatonic-accordion.ly:124 (comment) +#. Documentation/snippets/score-for-diatonic-accordion.ly:143 (comment) +msgid "Tips:" +msgstr "Consells:" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:125 (comment) +#. Documentation/snippets/score-for-diatonic-accordion.ly:144 (comment) +msgid "- In jEdit Search & Replace mark the Option 'Keep Dialog'" +msgstr "- En la cerca y substitució de jEdit marca l'opció 'Keep Dialog'" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:127 (variable) +msgid "AccordionTabTwoCBesDur" +msgstr "AccordionTabTwoCBesDur" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:128 (comment) +msgid "pull 1" +msgstr "puja 1" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:129 (comment) +msgid "8 8 8 |" +msgstr "8 8 8 |" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:131 (comment) +msgid "push 2" +msgstr "baixa 2" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:132 (comment) +msgid "4 |" +msgstr "4 |" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:134 (comment) +msgid "pull 3" +msgstr "baixa 3" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:135 (comment) +msgid "2 r8 }" +msgstr "2 r8 }" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:138 (variable) +msgid "AccordionTab" +msgstr "AccordionTab" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:139 (comment) +msgid "1. Place a copy of the piano melody above" +msgstr "1. Posa una còpia del la melodia del piano a sobre" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:141 (comment) +msgid "" +"3. For each line: Double the line. Remark the 1st one (Keeps unchanged as " +"reference) and then" +msgstr "3 Per a cada línia: Duplica la línia. Remarca la primera (Es manté sense canvi com a referència) i després" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:142 (comment) +msgid "change the second line using the transformation paper" +msgstr "canvia la segona línia usant el paper de transformació" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:145 (comment) +msgid "-" +msgstr "-" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:154 (comment) +msgid "The vertical line (simulating a bar-line) in" +msgstr "La línia vertical (que simula una barra) a " + +#. Documentation/snippets/score-for-diatonic-accordion.ly:155 (comment) +msgid "the staffBassRhytm is a gridline" +msgstr "la staffBassRhytm és un entramat" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:161 (comment) +msgid "4/4 - tact. How many beats per bar" +msgstr "4/4 - tact. Quants polsos per compàs" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:162 (comment) +msgid "The following line has to be adjusted O-F-T-E-N." +msgstr "La línia següent s'ha de ajustar S-O-V-I-N-T." + +#. Documentation/snippets/score-for-diatonic-accordion.ly:171 (variable) +msgid "staffVoice" +msgstr "staffVoice" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:171 (context id) +msgid "astaffvoice" +msgstr "astaffvoice" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:185 (variable) +msgid "staffAccordionMel" +msgstr "staffAccordionMel" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:187 (comment) +msgid "Set the accidentals (Vorzeichen) for each note," +msgstr "Estableix les alteracions (Vorzeichen) per a cada nota," + +#. Documentation/snippets/score-for-diatonic-accordion.ly:188 (comment) +msgid "do not remember them for the rest of the measure." +msgstr "no les recordis per a la resta del compàs." + +#. Documentation/snippets/score-for-diatonic-accordion.ly:208 (variable) +msgid "BassRhytm" +msgstr "BassRhytm" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:209 (variable) +msgid "LyricBassRhythmI" +msgstr "LyricBassRhythmI" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:211 (variable) +msgid "staffBassRhytm" +msgstr "staffBassRhytm" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:212 (context id) +msgid "staffbass" +msgstr "staffbass" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:213 (comment) +msgid "This is not a RhythmicStaff because it must be possible to append lyrics." +msgstr "Això no és un RhytmicStaff perquè ha de ser possible adjuntar la lletra." + +#. Documentation/snippets/score-for-diatonic-accordion.ly:215 (comment) +msgid "x.y" +msgstr "x.y" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:217 (comment) +msgid "" +"Shows one horizontal line. The vertical line (simulating a bar-line) is " +"simulated by a grid" +msgstr "Mostra una línia horitzontal. La línia vertical (que simula una divisòria) està simulada per un entramat" + +#. Documentation/snippets/score-for-diatonic-accordion.ly:218 (comment) +msgid "Search for 'grid' in this page to find all related functions" +msgstr "Busqueu per 'grid' a aquesta pàgina per trobar totes les funcions relacionades" + +#. Documentation/snippets/setting-system-separators.ly:38 (variable) +msgid "notes" +msgstr "notes" + +#. Documentation/snippets/showing-the-same-articulation-above-and-below-a-note-or-chord.ly:32 (comment) +msgid "The same as \\flageolet, just a little smaller" +msgstr "Igual que \\flageolet, sols una mica més petit" + +#. Documentation/snippets/showing-the-same-articulation-above-and-below-a-note-or-chord.ly:42 (comment) +msgid "The second fermata is ignored!" +msgstr "S'ignorarà el segon calderó!" + +#. Documentation/snippets/simultaneous-headword.ly:21 (comment) +msgid "NR 1.5 Simultaneous notes" +msgstr "NR 1.5 Notes simultànies" + +#. Documentation/snippets/simultaneous-headword.ly:23 (comment) +msgid "L. v. Beethoven, Op. 111" +msgstr "L. v. Beethoven, Op. 111" + +#. Documentation/snippets/simultaneous-headword.ly:24 (comment) +msgid "Piano sonata 32" +msgstr "Sonata per a piano núm. 32" + +#. Documentation/snippets/simultaneous-headword.ly:25 (comment) +msgid "Movt II - Arietta - Adagio molto semplice e cantabile" +msgstr "Movt. II - Arietta - Adagio molto semplice e cantabile" + +#. Documentation/snippets/simultaneous-headword.ly:26 (comment) +msgid "measures 108 - 118" +msgstr "compassos 108 a 118" + +#. Documentation/snippets/simultaneous-headword.ly:38 (variable) +msgid "trillFlat" +msgstr "trillFlat" + +#. Documentation/snippets/simultaneous-headword.ly:58 (comment) +msgid "RH voice 1" +msgstr "Veu MD 1" + +#. Documentation/snippets/simultaneous-headword.ly:135 (comment) +msgid "RH voice 2" +msgstr "Veu MD 2" + +#. Documentation/snippets/simultaneous-headword.ly:210 (comment) +msgid "LH staff" +msgstr "pentagrama ME" + +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:30 (variable) +msgid "verseI" +msgstr "verseI" + +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:35 (variable) +msgid "verseII" +msgstr "verseII" + +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:41 (comment) +msgid "insert chords for chordnames and fretboards here" +msgstr "insereix els acords per als noms d'acord i el màstil aquí" + +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:45 (variable) +msgid "staffMelody" +msgstr "staffMelody" + +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:48 (comment) +msgid "Type notes for melody here" +msgstr "Escrigui les notes per a la melodia aquí" + +#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:58 (context id) +msgid "voiceMelody" +msgstr "voiceMelody" + +#. Documentation/snippets/slides-in-tablature.ly:45 (variable) +msgid "slides" +msgstr "lliscaments" + +#. Documentation/snippets/staff-headword.ly:34 (comment) +msgid "title = \\\"Le Lac des Cygnes\\\"" +msgstr "title = \\\"Le Lac des Cygnes\\\"" + +#. Documentation/snippets/staff-headword.ly:35 (comment) +msgid "subtitle = \\\"Danse Napolitaine\\\"" +msgstr "subtitle = \\\"Danse Napolitaine\\\"" + +#. Documentation/snippets/staff-headword.ly:36 (comment) +msgid "composer = \\\"Piotr Ilitch Tchaïkovski\\\"" +msgstr "composer = \\\"Piotr Ilitch Tchaïkovski\\\"" + +#. Documentation/snippets/staff-headword.ly:37 (comment) +msgid "arranger = \\\"arr. Laurence Sardain\\\"" +msgstr "arranger = \\\"arr. Laurence Sardain\\\"" + +#. Documentation/snippets/staff-headword.ly:38 (comment) +msgid "footer = \\\"Mutopia-2006/12/22-896\\\"" +msgstr "footer = \\\"Mutopia-2006/12/22-896\\\"" + +#. Documentation/snippets/staff-headword.ly:41 (variable) +msgid "trompette" +msgstr "trompeta" + +#. Documentation/snippets/staff-headword.ly:53 (variable) +#. Documentation/snippets/staff-headword.ly:101 (context id) +#. Documentation/snippets/staff-headword.ly:119 (context id) +msgid "tambourin" +msgstr "pandereta" + +#. Documentation/snippets/staff-headword.ly:62 (variable) +msgid "tambourinMidi" +msgstr "panderetaMidi" + +#. Documentation/snippets/staff-headword.ly:105 (context id) +msgid "prima" +msgstr "prima" + +#. Documentation/snippets/staff-headword.ly:107 (context id) +msgid "uppera" +msgstr "uppera" + +#. Documentation/snippets/staff-headword.ly:108 (context id) +msgid "lowera" +msgstr "lowera" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:30 (comment) +msgid "Values are close enough to ignore the difference" +msgstr "Els valors són suficientment propers com per ignorar la diferència" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:34 (comment) +msgid "Combine a list of extents" +msgstr "Combina una llista d'extensions" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:40 (comment) +msgid "Check if the stem is connectable to the root" +msgstr "Comprova si la vírgula es pot connectar amb l'arrel" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:53 (comment) +msgid "Connect stems if we have at least one stems connectable to the root" +msgstr "Connecta les vírgules si tenim al menys una vírgula que es pugui connectar amb l'arrel" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:74 (comment) +msgid "Create a stem span as a child of the cross-staff stem (the root)" +msgstr "Crea una extensió de vírgula com a filla d'una vírgula de pauta creuada (l'arrel)" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:83 (comment) +msgid "Set cross-staff property of the stem to this function to connect it to" +msgstr "Estableix la propietat cross-staff de la vírgula a aquesta funció per connectar a " + +#. Documentation/snippets/stem-cross-staff-engraver.ly:84 (comment) +msgid "other stems automatically" +msgstr "altres vírgules automàticament" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:88 (comment) +msgid "Check if automatic connecting of the stem was requested. Stems connected" +msgstr "Comprova si es va demanar que la vírgula es connectés automàticament. Les vírgules connectades" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:89 (comment) +msgid "to cross-staff beams are cross-staff, but they should not be connected to" +msgstr "a barres de pauta creuada són de pauta creuada, però no han d'estar connectades a" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:90 (comment) +msgid "other stems just because of that." +msgstr "alters vírgules per això." + +#. Documentation/snippets/stem-cross-staff-engraver.ly:94 (comment) +msgid "Create stem spans for cross-staff stems" +msgstr "Crea extensions de vírgula per a vírgules de pauta creuada" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:102 (comment) +msgid "Connect cross-staff stems to the stems above in the system" +msgstr "Connecta les vírgules de pauta creuada a les vírgules sobre el sistema" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:115 (variable) +msgid "crossStaff" +msgstr "crossStaff" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:130 (comment) +msgid "Bar 1 - durations, beams, flags" +msgstr "Compàs 1: duracions, barres, etiquetes" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:135 (comment) +msgid "Bar 2 - direction" +msgstr "Compàs 2: direcció" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:140 (comment) +msgid "Bar 3 - multiple voice styles" +msgstr "Compàs 3: estils de veu diversos" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:145 (comment) +msgid "Bar 4 - grace notes" +msgstr "Compàs 4: notes de adorn" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:150 (comment) +msgid "Bar 5 - cross-staff beams" +msgstr "Compàs 5: barres de pauta creuda" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:159 (context id) +msgid "staffone" +msgstr "staffone" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:164 (context id) +msgid "stafftwo" +msgstr "stafftwo" + +#. Documentation/snippets/stem-cross-staff-engraver.ly:169 (context id) +msgid "staffthree" +msgstr "staffthree" + +#. Documentation/snippets/stemlets.ly:40 (comment) +msgid "N.B. use Score.Stem to set for the whole score." +msgstr "Nota: useu Score.Stem per establir-lo per a tota la partitura." + +#. Documentation/snippets/string-number-extender-lines.ly:22 (variable) +msgid "stringNumberSpanner" +msgstr "stringNumberSpanner" + +#. Documentation/snippets/string-quartet-template-simple.ly:67 (variable) +msgid "violinOne" +msgstr "violinOne" + +#. Documentation/snippets/string-quartet-template-simple.ly:76 (variable) +msgid "violinTwo" +msgstr "violinTwo" + +#. Documentation/snippets/string-quartet-template-simple.ly:85 (variable) +msgid "viola" +msgstr "viola" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:129 (comment) +msgid "piece.ly" +msgstr "pieza.ly" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:130 (comment) +msgid "(This is the global definitions file)" +msgstr "(Aquest és el fitxer de definicions globals)" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:137 (variable) +msgid "Violinone" +msgstr "Violinone" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:142 (comment) +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:148 (comment) +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:155 (comment) +msgid "*********************************" +msgstr "*********************************" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:143 (variable) +msgid "Violintwo" +msgstr "Violintwo" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:149 (variable) +msgid "Viola" +msgstr "Viola" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:156 (variable) +msgid "Cello" +msgstr "Cello" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:162 (comment) +msgid "**********************************" +msgstr "**********************************" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:173 (comment) +msgid "These are the other files you need to save on your computer" +msgstr "Aquests on els altres fitxers que heu de desar al vostre ordinador" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:175 (comment) +msgid "score.ly" +msgstr "score.ly" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:176 (comment) +msgid "(This is the main file)" +msgstr "(Aquest és el fitxer principal)" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:178 (comment) +msgid "uncomment the line below when using a separate file" +msgstr "traieu el comentari de la línia a sota quan s'estigui usant un fitxer separat" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:179 (comment) +msgid "\\include \\\"piece.ly\\\"" +msgstr "\\include \\\"pieza.ly\\\"" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:188 (comment) +msgid "{ Uncomment this block when using separate files" +msgstr "{ Traieu el comentari a aquest bloc quan s'estigui usant un altre fitxer" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:190 (comment) +msgid "vn1.ly" +msgstr "vn1.ly" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:191 (comment) +msgid "(This is the Violin 1 part file)" +msgstr "(Aquest el fitxer de la part del violí 1)" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:200 (comment) +msgid "vn2.ly" +msgstr "vn2.ly" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:201 (comment) +msgid "(This is the Violin 2 part file)" +msgstr "(Aquest és el fitxer de particella del violí 2)" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:210 (comment) +msgid "vla.ly" +msgstr "vla.ly" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:211 (comment) +msgid "(This is the Viola part file)" +msgstr "(Aquest és el fitxer de la part de la viola)" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:220 (comment) +msgid "vlc.ly" +msgstr "vlc.ly" + +#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:221 (comment) +msgid "(This is the Cello part file)" +msgstr "(Aquest és el fitxer de particella del violoncel)" + +#. Documentation/snippets/subdividing-beams.ly:79 (comment) +msgid "Set beam sub-group length to an eighth note" +msgstr "Estableix la longitud del subgrup de barres a una corxera" + +#. Documentation/snippets/subdividing-beams.ly:84 (comment) +msgid "Set beam sub-group length to a sixteenth note" +msgstr "Estableix la longitud del subgrup de barres a una semicorxera" + +#. Documentation/snippets/suppressing-warnings-for-clashing-note-columns.ly:28 (variable) +#. Documentation/snippets/unfretted-headword.ly:59 (variable) +msgid "ignore" +msgstr "ignora" + +#. Documentation/snippets/text-headword.ly:21 (comment) +msgid "NR 1.8 Text" +msgstr "NR 1.8 Text" + +#. Documentation/snippets/text-headword.ly:23 (comment) +msgid "L. v. Beethoven, Op. 110" +msgstr "L. v. Beethoven, Op. 110" + +#. Documentation/snippets/text-headword.ly:24 (comment) +msgid "Piano sonata 31" +msgstr "Sonata per a piano núm. 31" + +#. Documentation/snippets/text-headword.ly:25 (comment) +msgid "measures 1 - 7" +msgstr "compassos 1 a 7" + +#. Documentation/snippets/text-headword.ly:37 (comment) +msgid "RH staff" +msgstr "pentagrama MD" + +#. Documentation/snippets/three-sided-box.ly:21 (comment) +msgid "New command to add a three sided box, with sides north, west and south" +msgstr "Nova ordre per afegir una caixa amb tres costats, amb el costat nord, oest i sud" + +#. Documentation/snippets/three-sided-box.ly:22 (comment) +msgid "Based on the box-stencil command defined in scm/stencil.scm" +msgstr "Basat en la instrucció box-stencil definida a scm/stencil.scm" + +#. Documentation/snippets/three-sided-box.ly:23 (comment) +msgid "Note that \\\";;\\\" is used to comment a line in Scheme" +msgstr "Observeu que utilitzem \\\";\\\" per comentar una línia a l'Scheme" + +#. Documentation/snippets/three-sided-box.ly:37 (comment) +msgid "The corresponding markup command, based on the \\box command defined" +msgstr "La instrucció de marcat corresponent, basada en la instrucció \\box definida" + +#. Documentation/snippets/three-sided-box.ly:38 (comment) +msgid "in scm/define-markup-commands.scm" +msgstr "a scm/define-markup-commands.scm" + +#. Documentation/snippets/three-sided-box.ly:50 (comment) +msgid "Test it:" +msgstr "Prova-la:" + +#. Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly:60 (comment) +msgid "Change the style permanently" +msgstr "Canvia l'estil permanentment" + +#. Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly:66 (comment) +msgid "Revert to default style:" +msgstr "Retorna a l'estil predeterminat:" + +#. Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly:70 (comment) +msgid "single-digit style only for the next time signature" +msgstr "l'estil d'un sol dígit sols per a la propera indicació de temps" + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:40 (comment) +msgid "make the staff lines invisible on staves" +msgstr "fes que les línies de les pautes siguin invisibles al pentagrama" + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:129 (variable) +msgid "incipitDiscantus" +msgstr "incipitDiscantus" + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:154 (variable) +msgid "incipitAltus" +msgstr "incipitAltus" + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:180 (variable) +msgid "incipitTenor" +msgstr "incipitTenor" + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:208 (variable) +msgid "incipitBassus" +msgstr "incipitBassus" + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:234 (comment) +msgid "StaffGroup is used instead of ChoirStaff to get bar lines between systems" +msgstr "Es fa servir StaffGroup en comptes de ChoirStaff per tenir barres entre els sistemes" + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:266 (comment) +msgid "Keep the bass lyrics outside of the staff group to avoid bar lines" +msgstr "Manté la lletra del baix fora del grup de pentagrama per evitar les barres de compàs" + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:267 (comment) +msgid "between the lyrics." +msgstr "en mid de la lletra." + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:276 (comment) +msgid "the next three instructions keep the lyrics between the bar lines" +msgstr "les tres ordres següents mantenen la lletra entre las barres de compàs" + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:291 (comment) +msgid "breaking also at those barlines where a note overlaps" +msgstr "fent un salt a les línies de barra on se sol·lapi una nota" + +#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:292 (comment) +msgid "into the next bar. The command is commented out in this" +msgstr "a la pròxima barra. L'ordre està cancel·lada amb un comentari a aquesta" + +#. Documentation/snippets/transposing-pitches-with-minimum-accidentals-smart-transpose.ly:194 (variable) +msgid "naturalizeMusic" +msgstr "naturalizeMusic" + +#. Documentation/snippets/tweaking-clef-properties.ly:191 (comment) +msgid "The default treble clef" +msgstr "La clau de sol predeterminada" + +#. Documentation/snippets/tweaking-clef-properties.ly:193 (comment) +msgid "The standard bass clef" +msgstr "La clau de Fa estàndard" + +#. Documentation/snippets/tweaking-clef-properties.ly:198 (comment) +msgid "The baritone clef" +msgstr "Clau de baríton (do en quinta)" + +#. Documentation/snippets/tweaking-clef-properties.ly:203 (comment) +msgid "The standard choral tenor clef" +msgstr "Clau estàndard de tenor coral" + +#. Documentation/snippets/tweaking-clef-properties.ly:209 (comment) +msgid "A non-standard clef" +msgstr "Clau no estàndard" + +#. Documentation/snippets/tweaking-clef-properties.ly:215 (comment) +msgid "The following clef changes do not preserve" +msgstr "Els següents canvis de clau no preserven" + +#. Documentation/snippets/tweaking-clef-properties.ly:216 (comment) +msgid "the normal relationship between notes and clefs:" +msgstr "la relació normal entre notes i claus:" + +#. Documentation/snippets/tweaking-clef-properties.ly:231 (comment) +msgid "Return to the normal clef:" +msgstr "Tornar a la clau normal:" + +#. Documentation/snippets/unfretted-headword.ly:19 (comment) +msgid "#!lilypond lcp-extract.ly -*- coding: utf-8; -*-" +msgstr "#!lilypond lcp-extract.ly -*- coding: utf-8; -*-" + +#. Documentation/snippets/unfretted-headword.ly:22 (comment) +msgid "les-cinq-pieds:" +msgstr "les-cinq-pieds:" + +#. Documentation/snippets/unfretted-headword.ly:23 (comment) +msgid "extract for the lilypond documentaton project" +msgstr "extracte per al Projecte de Documentació del LilyPond" + +#. Documentation/snippets/unfretted-headword.ly:26 (comment) +msgid "Title:\tLes cinq pieds" +msgstr "Títol:\tLes cinq pieds" + +#. Documentation/snippets/unfretted-headword.ly:27 (comment) +msgid "Composer: \tDavid Séverin" +msgstr "Autor: \tDavid Séverin" + +#. Documentation/snippets/unfretted-headword.ly:28 (comment) +msgid "Date:\tJuillet 2007" +msgstr "Data:\tJuliol 2007" + +#. Documentation/snippets/unfretted-headword.ly:29 (comment) +msgid "Instrument:\tViolon Solo" +msgstr "Instrument:\tViolon Solo" + +#. Documentation/snippets/unfretted-headword.ly:30 (comment) +msgid "Dedication:\tA mon épouse Lívia De Souza Vidal" +msgstr "Dedicatòria:\tA mon épouse Lívia De Souza Vidal" + +#. Documentation/snippets/unfretted-headword.ly:31 (comment) +msgid "Additional:\tavec l'aide de Krzysztof Wagenaar" +msgstr "Addicional:\tavec l'aide de Krzysztof Wagenaar" + +#. Documentation/snippets/unfretted-headword.ly:33 (comment) +msgid "Statement:" +msgstr "Declaració:" + +#. Documentation/snippets/unfretted-headword.ly:35 (comment) +msgid "Here by, I, the composer, agree that this extract of my composition" +msgstr "Per la present, jo, l'autor, autoritzo que aquest extracte de la meva obra" + +#. Documentation/snippets/unfretted-headword.ly:36 (comment) +msgid "be in the public domain and can be part of, used and presented in" +msgstr "estigui al domini públic i pugui formar part, usar-se i presentar-se dins del" + +#. Documentation/snippets/unfretted-headword.ly:37 (comment) +msgid "the LilyPond Documention Project." +msgstr "Projecte de Documentació del Lilypond." + +#. Documentation/snippets/unfretted-headword.ly:39 (comment) +msgid "Statement Date: Octber the 9th, 2008" +msgstr "Data de la declaració: 9 d'octubre de 2008" + +#. Documentation/snippets/unfretted-headword.ly:43 (comment) +msgid "Abbreviations" +msgstr "Abreviatures" + +#. Documentation/snippets/unfretted-headword.ly:46 (variable) +msgid "db" +msgstr "db" + +#. Documentation/snippets/unfretted-headword.ly:47 (variable) +msgid "dub" +msgstr "dub" + +#. Documentation/snippets/unfretted-headword.ly:48 (variable) +msgid "dubetc" +msgstr "dubetc" + +#. Documentation/snippets/unfretted-headword.ly:50 (variable) +msgid "ub" +msgstr "ub" + +#. Documentation/snippets/unfretted-headword.ly:51 (variable) +msgid "udb" +msgstr "udb" + +#. Documentation/snippets/unfretted-headword.ly:52 (variable) +msgid "udbetc" +msgstr "udbetc" + +#. Documentation/snippets/unfretted-headword.ly:54 (variable) +msgid "fermaTa" +msgstr "fermaTa" + +#. Documentation/snippets/unfretted-headword.ly:56 (variable) +msgid "accel" +msgstr "accel" + +#. Documentation/snippets/unfretted-headword.ly:57 (variable) +msgid "ritar" +msgstr "ritar" + +#. Documentation/snippets/unfretted-headword.ly:63 (comment) +msgid "Strings" +msgstr "Cordes" + +#. Documentation/snippets/unfretted-headword.ly:66 (variable) +msgid "svib" +msgstr "svib" + +#. Documentation/snippets/unfretted-headword.ly:67 (variable) +msgid "pvib" +msgstr "pvib" + +#. Documentation/snippets/unfretted-headword.ly:68 (variable) +msgid "mvib" +msgstr "mvib" + +#. Documentation/snippets/unfretted-headword.ly:69 (variable) +msgid "sulp" +msgstr "sulp" + +#. Documentation/snippets/unfretted-headword.ly:70 (variable) +msgid "norm" +msgstr "norm" + +#. Documentation/snippets/unfretted-headword.ly:72 (variable) +msgid "quatre" +msgstr "quatre" + +#. Documentation/snippets/unfretted-headword.ly:76 (comment) +msgid "Shifting Notes" +msgstr "Desplaçar les notes" + +#. Documentation/snippets/unfretted-headword.ly:79 (variable) +msgid "shift" +msgstr "shift" + +#. Documentation/snippets/unfretted-headword.ly:80 (variable) +msgid "shifta" +msgstr "shifta" + +#. Documentation/snippets/unfretted-headword.ly:81 (variable) +msgid "shiftb" +msgstr "shiftb" + +#. Documentation/snippets/unfretted-headword.ly:85 (comment) +msgid "Hairpin" +msgstr "Regulador" + +#. Documentation/snippets/unfretted-headword.ly:88 (comment) +msgid "aniente = \\\"a niente\\\"" +msgstr "aniente = \\\"a niente\\\"" + +#. Documentation/snippets/unfretted-headword.ly:89 (variable) +msgid "aniente" +msgstr "aniente" + +#. Documentation/snippets/unfretted-headword.ly:96 (variable) +msgid "tupletbp" +msgstr "tupletbp" + +#. Documentation/snippets/unfretted-headword.ly:100 (comment) +msgid "Flag [Note Head - Stem]" +msgstr "Etiqueta [Cap - Vírgula]" + +#. Documentation/snippets/unfretted-headword.ly:103 (variable) +msgid "noflag" +msgstr "noflag" + +#. Documentation/snippets/unfretted-headword.ly:106 (comment) +msgid "Functions" +msgstr "Funcions" + +#. Documentation/snippets/unfretted-headword.ly:121 (comment) +msgid "Instruments" +msgstr "Instruments" + +#. Documentation/snippets/unfretted-headword.ly:124 (variable) +msgid "ViolinSolo" +msgstr "ViolinSolo" + +#. Documentation/snippets/unfretted-headword.ly:134 (comment) +msgid "Measure 1" +msgstr "Compàs 1" + +#. Documentation/snippets/unfretted-headword.ly:144 (comment) +msgid "Measure 2" +msgstr "Compàs 2" + +#. Documentation/snippets/unfretted-headword.ly:154 (comment) +msgid "Measure 3" +msgstr "Compàs 3" + +#. Documentation/snippets/unfretted-headword.ly:162 (comment) +msgid "Measure 4" +msgstr "Compàs 4" + +#. Documentation/snippets/unfretted-headword.ly:171 (comment) +msgid "Measure 5" +msgstr "Compàs 5" + +#. Documentation/snippets/unfretted-headword.ly:179 (comment) +msgid "Measure 6" +msgstr "Compàs 6" + +#. Documentation/snippets/unfretted-headword.ly:181 (comment) +msgid "\\featherDurations #(ly:make-moment 2 3)" +msgstr "\\featherDurations #(ly:make-moment 2 3)" + +#. Documentation/snippets/unfretted-headword.ly:188 (comment) +msgid "Measure 7" +msgstr "Compàs 7" + +#. Documentation/snippets/unfretted-headword.ly:197 (comment) +msgid "Measure 8" +msgstr "Compàs 8" + +#. Documentation/snippets/unfretted-headword.ly:202 (comment) +msgid "Measure 9" +msgstr "Compàs 9" + +#. Documentation/snippets/unfretted-headword.ly:213 (comment) +msgid "Score" +msgstr "Partitura" + +#. Documentation/snippets/using-alternative-flag-styles.ly:36 (variable) +msgid "testnotes" +msgstr "testnotes" + +#. Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly:110 (comment) +msgid "display grobs for each note head:" +msgstr "mostra els objectes gràfics per a tots els caps:" + +#. Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly:111 (comment) +msgid "\\override NoteHead #'before-line-breaking = #display-grobs" +msgstr "\\override NoteHead #'before-line-breaking = #display-grobs" + +#. Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly:113 (comment) +msgid "or just for one:" +msgstr "o soles per a una:" + +#. Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly:32 (variable) +msgid "parallelogram" +msgstr "paralelograma" + +#. Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly:47 (variable) +msgid "myNoteHeads" +msgstr "myNoteHeads" + +#. Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly:48 (variable) +msgid "normalNoteHeads" +msgstr "normalNoteHeads" + +#. Documentation/snippets/utf-8.ly:22 (comment) +msgid "end verbatim - this comment is a hack to prevent texinfo.tex" +msgstr "fi del bloc literal. Aquest comentari és un enginy per prevenir que texinfo.tex" + +#. Documentation/snippets/utf-8.ly:23 (comment) +msgid "from choking on non-European UTF-8 subsets" +msgstr "tingui problemes amb subconjunts UTF-8 no europeus" + +#. Documentation/snippets/utf-8.ly:25 (comment) +msgid "Edit this file using a Unicode aware editor, such as GVIM, GEDIT, Emacs" +msgstr "Editeu aquest fitxer amb un editor preparat per a Unicode, com ara GVIM, GEDIT o Emacs" + +#. Documentation/snippets/utf-8.ly:43 (comment) +msgid "Cyrillic font" +msgstr "Tipus de lletra ciríl·lica" + +#. Documentation/snippets/utf-8.ly:44 (variable) +msgid "bulgarian" +msgstr "búlgar" + +#. Documentation/snippets/utf-8.ly:48 (variable) +msgid "hebrew" +msgstr "hebreu" + +# fuzzy. FVD +#. Documentation/snippets/utf-8.ly:52 (variable) +msgid "japanese" +msgstr "japonès" + +#. Documentation/snippets/utf-8.ly:59 (comment) +msgid "\\\"a legal song to you\\\"" +msgstr "\\\"una cancó legal per a vos\\\"" + +#. Documentation/snippets/utf-8.ly:60 (variable) +msgid "portuguese" +msgstr "portuguès" + +#. Documentation/snippets/vertical-line-as-a-baroque-articulation-mark.ly:23 (variable) +msgid "upline" +msgstr "upline" + +#. Documentation/snippets/vertically-centered-common-lyrics.ly:23 (variable) +msgid "leftbrace" +msgstr "leftbrace" + +#. Documentation/snippets/vertically-centered-common-lyrics.ly:24 (variable) +msgid "rightbrace" +msgstr "rightbrace" + +#. Documentation/snippets/vertically-centered-common-lyrics.ly:26 (variable) +msgid "dropLyrics" +msgstr "dropLyrics" + +#. Documentation/snippets/vertically-centered-common-lyrics.ly:33 (variable) +msgid "raiseLyrics" +msgstr "raiseLyrics" + +#. Documentation/snippets/vertically-centered-common-lyrics.ly:40 (variable) +msgid "skipFour" +msgstr "skipFour" + +#. Documentation/snippets/vertically-centered-common-lyrics.ly:42 (variable) +msgid "lyricsA" +msgstr "lyricsA" + +#. Documentation/snippets/vertically-centered-common-lyrics.ly:44 (variable) +msgid "lyricsB" +msgstr "lyricsB" + +#. Documentation/snippets/vertically-centered-common-lyrics.ly:45 (variable) +msgid "lyricsC" +msgstr "lyricsC" + +#. Documentation/snippets/vertically-centered-common-lyrics.ly:46 (variable) +msgid "lyricsD" +msgstr "letraD" + +#. Documentation/snippets/vertically-centered-common-lyrics.ly:53 (context id) +msgid "m" +msgstr "m" + +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:94 (variable) +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:75 (variable) +#. Documentation/snippets/vocal-ensemble-template.ly:92 (variable) +msgid "sopWords" +msgstr "sopWords" + +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:123 (comment) +#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:132 (comment) +msgid "This is needed for lyrics above a staff" +msgstr "Això és necessari per a la lletra a sobre del pentagrama" + +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:110 (comment) +msgid "we could remove the line about this with the line below, since" +msgstr "podríem treure la línia anterior i substituir-la per la següent, ja que volem" + +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:111 (comment) +msgid "we want the alto lyrics to be below the alto Voice anyway." +msgstr "que la lletra de la contralto estigui a sota de la veu de contralto de totes maneres." + +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:112 (comment) +msgid "\\new Lyrics \\lyricsto \\\"altos\\\" \\altoWords" +msgstr "\\new Lyrics \\lyricsto \\\"altos\\\" \\altoWords" + +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:123 (comment) +msgid "again, we could replace the line above this with the line below." +msgstr "un altre cop, podríem substituir la línia a sobre d'aquesta amb la línia a sota." + +#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:124 (comment) +msgid "\\new Lyrics \\lyricsto \\\"basses\\\" \\bassWords" +msgstr "\\new Lyrics \\lyricsto \\\"basses\\\" \\bassWords" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:78 (comment) +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:91 (comment) +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:106 (comment) +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:122 (comment) +msgid "refrain" +msgstr "tornada" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:84 (variable) +msgid "SoloNotes" +msgstr "SoloNotes" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:95 (variable) +msgid "SoloLyrics" +msgstr "SoloLyrics" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:100 (variable) +msgid "SopranoNotes" +msgstr "SopranoNotes" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:111 (variable) +msgid "SopranoLyrics" +msgstr "SopranoLyrics" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:116 (variable) +msgid "BassNotes" +msgstr "BassNotes" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:127 (variable) +msgid "BassLyrics" +msgstr "BassLyrics" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:134 (context id) +msgid "SoloVoice" +msgstr "SoloVoice" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:138 (context id) +msgid "SopranoVoice" +msgstr "SopranoVoice" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:141 (context id) +msgid "BassVoice" +msgstr "BassVoice" + +#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:148 (comment) +msgid "these lines prevent empty staves from being printed" +msgstr "aquestes línies eviten que s'imprimeixin els pentagrames buits" + +#. Documentation/snippets/vocal-ensemble-template.ly:120 (comment) +#. Documentation/snippets/vocal-ensemble-template.ly:135 (comment) +msgid "this is needed for lyrics above a staff" +msgstr "això és necessita per a la lletra a sobre del pentagrama" + +#. Documentation/snippets/vocal-headword.ly:27 (comment) +msgid "L. van Beethoven. Symphony No. 9 in D minor, op.125; Finale" +msgstr "L. van Beethoven. Simfonia Núm. 9 en Re menor, op.125; Finale" + +#. Documentation/snippets/vocal-headword.ly:28 (comment) +msgid "mm. 216 -- 236" +msgstr "mm. 216 -- 236" + +#. Documentation/snippets/vocal-headword.ly:29 (comment) +msgid "Text: F. von Schiller" +msgstr "Text: F. von Schiller" + +#. Documentation/snippets/vocal-headword.ly:34 (comment) +msgid "make first bar number be shown" +msgstr "fes que el número del primer compàs es mostri" + +#. Documentation/snippets/vocal-headword.ly:36 (comment) +msgid "\\tempo \\\"Presto\\\"" +msgstr "\\tempo \\\"Presto\\\"" + +#. Documentation/snippets/vocal-headword.ly:37 (comment) +msgid "\\compressFullBarRests R2.*8" +msgstr "\\compressFullBarRests R2.*8" + +#. Documentation/snippets/vocal-headword.ly:59 (comment) +msgid "put fermata closer to staff" +msgstr "posa el calderó més a prop del pentagrama" + +#. Documentation/snippets/vocal-headword.ly:63 (comment) +msgid "\\time 4/4 \\tempo \\\"Allegro assai\\\"" +msgstr "\\time 4/4 \\tempo \\\"Allegro assai\\\"" + +#. Documentation/snippets/vocal-headword.ly:64 (comment) +#. Documentation/snippets/vocal-headword.ly:66 (comment) +msgid "R1" +msgstr "R1" + +#. Documentation/snippets/vocal-headword.ly:65 (comment) +msgid "e''4^\\f d r2" +msgstr "e''4^\\f d r2" + +#. Documentation/snippets/vocal-headword.ly:67 (comment) +msgid "e4( ^\\f d2) a8([ g)]" +msgstr "e4( ^\\f d2) a8([ g)]" + +#. Documentation/snippets/vocal-headword.ly:73 (comment) +msgid "Freu -- de, Freu -- de,__" +msgstr "Freu -- de, Freu -- de,__" + +#. Documentation/snippets/volta-multi-staff.ly:21 (variable) +msgid "voltaMusic" +msgstr "voltaMusic" + +#. Documentation/snippets/volta-text-markup-using-repeatcommands.ly:29 (variable) +msgid "voltaAdLib" +msgstr "voltaAdLib" + +#. Documentation/snippets/wind-headword.ly:19 (comment) +msgid "NR 2.whatever Wind" +msgstr "Núm. 2.escaig vent" + +#. Documentation/snippets/wind-headword.ly:20 (comment) +msgid "Tchaikovsky" +msgstr "Tchaikovsky" + +#. Documentation/snippets/wind-headword.ly:21 (comment) +msgid "Nutcracker Suite, VII Dance of the Merlitons" +msgstr "Suite El Trencanous, VII Dansa dels Mirlitons" + +msgid "Up:" +msgstr "Amunt:" + +msgid "Next:" +msgstr "Següent:" + +msgid "Previous:" +msgstr "Anterior:" + +msgid "Appendix " +msgstr "Annex " + +msgid "Footnotes" +msgstr "Notes al peu" + +# this is the same translation that babel LaTex package uses . FVD +msgid "Table of Contents" +msgstr "Índex general" + diff --git a/Documentation/po/cs.po b/Documentation/po/cs.po index b308bbe35d..466ac3afaa 100644 --- a/Documentation/po/cs.po +++ b/Documentation/po/cs.po @@ -13032,7 +13032,7 @@ msgstr "Obsah" #~ msgstr "Unterstützung für Generalbass" #~ msgid "Typesetting mensural music" -#~ msgstr "Mesurale Musik setzen" +#~ msgstr "Mensurale Musik setzen" #~ msgid "Mensural contexts" #~ msgstr "Mensural-Kontexte" diff --git a/Documentation/po/de.po b/Documentation/po/de.po index cdc50927d7..9d2033aa3a 100644 --- a/Documentation/po/de.po +++ b/Documentation/po/de.po @@ -12869,7 +12869,7 @@ msgstr "Inhaltsverzeichnis" #~ msgstr "Unterstützung für Generalbass" #~ msgid "Typesetting mensural music" -#~ msgstr "Mesurale Musik setzen" +#~ msgstr "Mensurale Musik setzen" #~ msgid "Mensural contexts" #~ msgstr "Mensural-Kontexte" diff --git a/Documentation/po/it.po b/Documentation/po/it.po index 4304b73819..710e4b35a1 100644 --- a/Documentation/po/it.po +++ b/Documentation/po/it.po @@ -1,5 +1,5 @@ # translation of LilyPond documentation to Italian -# Copyright (C) 2009--2012 Han-Wen Nienhuys, Jan Nieuwenhuizen +# Copyright (C) 2009--2015 Han-Wen Nienhuys, Jan Nieuwenhuizen # This file is distributed under the same license as the lilypond package. # Federico Bruni , 2009, 2012. # diff --git a/Documentation/po/lilypond-doc.pot b/Documentation/po/lilypond-doc.pot index ab5444e930..87888b87b5 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: 2012-01-27 13:12+0100\n" +"POT-Creation-Date: 2014-03-30 13:32+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,11507 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: postprocess_html.py:55 -#, python-format -msgid "This page is for %(package_name)s-%(package_version)s (%(branch_str)s)." -msgstr "" - -#: postprocess_html.py:57 -#, python-format -msgid "" -"We welcome your aid; please help us by " -"reporting errors to our bug list." -msgstr "" - -#: postprocess_html.py:69 -#, python-format -msgid "Other languages: %s." -msgstr "" - -#: postprocess_html.py:70 -#, python-format -msgid "About automatic language selection." -msgstr "" - -#: postprocess_html.py:330 -msgid "stable-branch" -msgstr "" - -#: postprocess_html.py:332 -msgid "development-branch" -msgstr "" - -#: translations-status.py:72 -msgid "Section titles" -msgstr "" - -#: translations-status.py:73 -#, python-format -msgid "Last updated %s" -msgstr "" - -#: translations-status.py:74 -msgid "Translators" -msgstr "" - -#: translations-status.py:74 -msgid "Translation checkers" -msgstr "" - -#: translations-status.py:75 -msgid "Translated" -msgstr "" - -#: translations-status.py:75 -msgid "Up to date" -msgstr "" - -#: translations-status.py:76 -msgid "Other info" -msgstr "" - -#: translations-status.py:78 -msgid "no" -msgstr "" - -#: translations-status.py:79 -msgid "not translated" -msgstr "" - -#: translations-status.py:81 -#, python-format -msgid "partially (%(p)d %%)" -msgstr "" - -#: translations-status.py:83 -#, python-format -msgid "partially translated (%(p)d %%)" -msgstr "" - -#: translations-status.py:84 translations-status.py:86 -msgid "yes" -msgstr "" - -#: translations-status.py:85 -msgid "translated" -msgstr "" - -#: translations-status.py:86 translations-status.py:87 -msgid "up to date" -msgstr "" - -#: translations-status.py:88 -msgid "partially" -msgstr "" - -#: translations-status.py:89 -msgid "partially up to date" -msgstr "" - -#: translations-status.py:90 -msgid "N/A" -msgstr "" - -#: translations-status.py:91 -msgid "pre-GDP" -msgstr "" - -#: translations-status.py:92 -msgid "post-GDP" -msgstr "" - #. -*- coding: utf-8 -*- -#. Documentation/changes.tely:158 (variable) -#. Documentation/extending/programming-interface.itely:496 (variable) -msgid "dyn" -msgstr "" - -#. @node in Documentation/changes.tely -#. @node in Documentation/macros.itexi -#. @node in Documentation/cs/macros.itexi -msgid "Top" -msgstr "" - -#. @top in Documentation/changes.tely -msgid "New features in 2.16 since 2.14" -msgstr "" - -#. @top in Documentation/macros.itexi -msgid "LilyPond --- \\\\TITLE\\\\" -msgstr "" - -#. @subsubheading in Documentation/macros.itexi -msgid "Predefined commands" -msgstr "" - -#. @subsubheading in Documentation/macros.itexi -msgid "Selected Snippets" -msgstr "" - -#. @subsubheading in Documentation/macros.itexi -msgid "See also" -msgstr "" - -#. @subsubheading in Documentation/macros.itexi -msgid "Known issues and warnings" -msgstr "" - -#. @node in Documentation/essay.tely -#. @appendix in Documentation/essay.tely -#. @node in Documentation/extending.tely -#. @appendix in Documentation/extending.tely -#. @node in Documentation/learning.tely -#. @appendix in Documentation/learning.tely -#. @node in Documentation/notation.tely -#. @appendix in Documentation/notation.tely -#. @node in Documentation/usage.tely -#. @appendix in Documentation/usage.tely -msgid "LilyPond index" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @chapter in Documentation/essay/engraving.itely -msgid "Music engraving" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @section in Documentation/essay/engraving.itely -msgid "The LilyPond story" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @section in Documentation/essay/engraving.itely -msgid "Engraving details" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "Music fonts" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "Optical spacing" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "Ledger lines" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "Optical sizing" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "Why work so hard?" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @section in Documentation/essay/engraving.itely -msgid "Automated engraving" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "Beauty contests" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "Improvement by benchmarking" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "Getting things right" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @section in Documentation/essay/engraving.itely -msgid "Building software" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "Music representation" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "What symbols to engrave?" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @unnumberedsubsec in Documentation/essay/engraving.itely -msgid "Flexible architecture" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @section in Documentation/essay/engraving.itely -msgid "Putting LilyPond to work" -msgstr "" - -#. @node in Documentation/essay/engraving.itely -#. @section in Documentation/essay/engraving.itely -msgid "Engraved examples (BWV 861)" -msgstr "" - -#. @node in Documentation/essay/literature.itely -#. @chapter in Documentation/essay/literature.itely -msgid "Literature list" -msgstr "" - -#. @node in Documentation/essay/literature.itely -#. @section in Documentation/essay/literature.itely -msgid "Short literature list" -msgstr "" - -#. @node in Documentation/essay/literature.itely -#. @section in Documentation/essay/literature.itely -msgid "Long literature list" -msgstr "" - -#. @subheading in Documentation/essay/literature.itely -msgid "University of Colorado Engraving music bibliography" -msgstr "" - -#. @subheading in Documentation/essay/literature.itely -msgid "Computer notation bibliography" -msgstr "" - -#. @subheading in Documentation/essay/literature.itely -msgid "Engraving bibliography" -msgstr "" - -#. @node in Documentation/fdl.itexi -#. @appendix in Documentation/fdl.itexi -#. @node in Documentation/fdl.itexi -#. @appendix in Documentation/fdl.itexi -#. @node in Documentation/fdl.itexi -#. @appendix in Documentation/fdl.itexi -#. @node in Documentation/fdl.itexi -#. @appendix in Documentation/fdl.itexi -#. @node in Documentation/fdl.itexi -#. @appendix in Documentation/fdl.itexi -#. @node in Documentation/fdl.itexi -#. @appendix in Documentation/fdl.itexi -msgid "GNU Free Documentation License" -msgstr "" - -#. @heading in Documentation/fdl.itexi -msgid "ADDENDUM: How to use this License for your documents" -msgstr "" - -#. Documentation/extending/scheme-tutorial.itely:791 (variable) -msgid "traLaLa" -msgstr "" - -#. Documentation/extending/scheme-tutorial.itely:1435 (variable) -#. Documentation/learning/fundamental.itely:3006 (variable) -#. Documentation/learning/fundamental.itely:3061 (variable) -#. Documentation/notation/changing-defaults.itely:3798 (variable) -#. Documentation/cs/learning/fundamental.itely:3258 (variable) -#. Documentation/cs/learning/fundamental.itely:3312 (variable) -msgid "padText" -msgstr "" - -#. Documentation/extending/scheme-tutorial.itely:1458 (variable) -#. Documentation/notation/changing-defaults.itely:3840 (variable) -msgid "tempoPadded" -msgstr "" - -#. Documentation/extending/scheme-tutorial.itely:1477 (variable) -msgid "pattern" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @chapter in Documentation/extending/scheme-tutorial.itely -msgid "Scheme tutorial" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @section in Documentation/extending/scheme-tutorial.itely -msgid "Introduction to Scheme" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Scheme sandbox" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Scheme variables" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Scheme simple data types" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Scheme compound data types" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Pairs" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Lists" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Association lists (alists)" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Hash tables" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Calculations in Scheme" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Scheme procedures" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Defining procedures" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Predicates" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Return values" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Scheme conditionals" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "if" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "cond" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @section in Documentation/extending/scheme-tutorial.itely -msgid "Scheme in LilyPond" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "LilyPond Scheme syntax" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "LilyPond variables" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Input variables and Scheme" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Object properties" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "LilyPond compound variables" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Offsets" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Extents" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Property alists" -msgstr "" - -#. @subheading in Documentation/extending/scheme-tutorial.itely -msgid "Alist chains" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Internal music representation" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @section in Documentation/extending/scheme-tutorial.itely -msgid "Building complicated functions" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Displaying music expressions" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Music properties" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Doubling a note with slurs (example)" -msgstr "" - -#. @node in Documentation/extending/scheme-tutorial.itely -#. @subsection in Documentation/extending/scheme-tutorial.itely -msgid "Adding articulation to notes (example)" -msgstr "" - -#. Documentation/extending/programming-interface.itely:377 (variable) -msgid "manualBeam" -msgstr "" - -#. Documentation/extending/programming-interface.itely:398 (variable) -#. Documentation/snippets/score-for-diatonic-accordion.ly:197 (variable) -msgid "AltOn" -msgstr "" - -#. Documentation/extending/programming-interface.itely:408 (variable) -#. Documentation/snippets/score-for-diatonic-accordion.ly:203 (variable) -msgid "AltOff" -msgstr "" - -#. Documentation/extending/programming-interface.itely:423 (variable) -msgid "withAlt" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @chapter in Documentation/extending/programming-interface.itely -msgid "Interfaces for programmers" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @section in Documentation/extending/programming-interface.itely -msgid "Lilypond code blocks" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @section in Documentation/extending/programming-interface.itely -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Scheme functions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Scheme function definitions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Scheme function usage" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Void scheme functions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @section in Documentation/extending/programming-interface.itely -msgid "Music functions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Music function definitions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Music function usage" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Simple substitution functions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Intermediate substitution functions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Mathematics in functions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Functions without arguments" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Void music functions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @section in Documentation/extending/programming-interface.itely -msgid "Event functions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @section in Documentation/extending/programming-interface.itely -msgid "Markup functions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Markup construction in Scheme" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "How markups work internally" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "New markup command definition" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @unnumberedsubsubsec in Documentation/extending/programming-interface.itely -msgid "Markup command definition syntax" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @unnumberedsubsubsec in Documentation/extending/programming-interface.itely -msgid "On properties" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @unnumberedsubsubsec in Documentation/extending/programming-interface.itely -msgid "A complete example" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @unnumberedsubsubsec in Documentation/extending/programming-interface.itely -msgid "Adapting builtin commands" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "New markup list command definition" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @section in Documentation/extending/programming-interface.itely -msgid "Contexts for programmers" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Context evaluation" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @subsection in Documentation/extending/programming-interface.itely -msgid "Running a function on all layout objects" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @section in Documentation/extending/programming-interface.itely -msgid "Callback functions" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @section in Documentation/extending/programming-interface.itely -msgid "Inline Scheme code" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @section in Documentation/extending/programming-interface.itely -msgid "Difficult tweaks" -msgstr "" - -#. @node in Documentation/extending/programming-interface.itely -#. @chapter in Documentation/extending/programming-interface.itely -msgid "LilyPond Scheme interfaces" -msgstr "" - -#. Documentation/learning/tutorial.itely:210 (comment) -msgid "set the starting point to middle C" -msgstr "" - -#. Documentation/learning/tutorial.itely:241 (comment) -msgid "one octave above middle C" -msgstr "" - -#. Documentation/learning/tutorial.itely:257 (comment) -msgid "c is 1 staff space up, so is the c above" -msgstr "" - -#. Documentation/learning/tutorial.itely:258 (comment) -msgid "d is 2 up or 5 down, so is the d above" -msgstr "" - -#. Documentation/learning/tutorial.itely:259 (comment) -msgid "e is 3 up or 4 down, so is the e above" -msgstr "" - -#. Documentation/learning/tutorial.itely:260 (comment) -msgid "a is 6 up or 1 down, so is the a below" -msgstr "" - -#. Documentation/learning/tutorial.itely:261 (comment) -msgid "g is 5 up or 2 down, so is the g below" -msgstr "" - -#. Documentation/learning/tutorial.itely:262 (comment) -msgid "f is 4 up or 3 down, so is the f below" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @chapter in Documentation/learning/tutorial.itely -msgid "Tutorial" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @section in Documentation/learning/tutorial.itely -msgid "Compiling a file" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -msgid "Entering input" -msgstr "" - -#. @subheading in Documentation/learning/tutorial.itely -msgid "Producing output" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "MacOS X" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Windows" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -msgid "Command-line" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @section in Documentation/learning/tutorial.itely -msgid "How to write input files" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -msgid "Simple notation" -msgstr "" - -#. @subheading in Documentation/learning/tutorial.itely -msgid "Pitches" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "pitch" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "interval" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -#. Documentation/snippets/changing-the-interval-of-lines-on-the-stave.ly:22 (variable) -#. Documentation/snippets/printing-note-names-with-and-without-an-octave-marker.ly:32 (variable) -msgid "scale" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "middle C" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "octave" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "accidental" -msgstr "" - -#. @subheading in Documentation/learning/tutorial.itely -msgid "Durations (rhythms)" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "beam" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "duration" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "whole note" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "half note" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "quarter note" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "dotted note" -msgstr "" - -#. @subheading in Documentation/learning/tutorial.itely -msgid "Rests" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "rest" -msgstr "" - -#. @subheading in Documentation/learning/tutorial.itely -msgid "Time signature" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "time signature" -msgstr "" - -#. @subheading in Documentation/learning/tutorial.itely -msgid "Tempo marks" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "tempo indication" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "metronome" -msgstr "" - -#. @subheading in Documentation/learning/tutorial.itely -msgid "Clef" -msgstr "" - -#. @rglos in Documentation/learning/tutorial.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tutorial.itely -msgid "clef" -msgstr "" - -#. @subheading in Documentation/learning/tutorial.itely -msgid "All together" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -msgid "Working on input files" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @section in Documentation/learning/tutorial.itely -msgid "Dealing with errors" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -msgid "General troubleshooting tips" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -msgid "Some common errors" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @section in Documentation/learning/tutorial.itely -msgid "How to read the manuals" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -msgid "Omitted material" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -msgid "Clickable examples" -msgstr "" - -#. @node in Documentation/learning/tutorial.itely -#. @subsection in Documentation/learning/tutorial.itely -msgid "Overview of manuals" -msgstr "" - -#. Documentation/learning/common-notation.itely:1224 (variable) -#. Documentation/learning/fundamental.itely:2987 (variable) -#. Documentation/learning/fundamental.itely:3011 (variable) -#. Documentation/cs/learning/common-notation.itely:1314 (variable) -#. Documentation/cs/learning/fundamental.itely:3239 (variable) -#. Documentation/cs/learning/fundamental.itely:3263 (variable) -msgid "violin" -msgstr "" - -#. Documentation/learning/common-notation.itely:1230 (variable) -#. Documentation/cs/learning/common-notation.itely:1320 (variable) -#. Documentation/snippets/string-quartet-template-simple.ly:94 (variable) -msgid "cello" -msgstr "" - -#. Documentation/learning/common-notation.itely:1256 (variable) -#. Documentation/cs/learning/common-notation.itely:1346 (variable) -msgid "tripletA" -msgstr "" - -#. Documentation/learning/common-notation.itely:1257 (variable) -#. Documentation/cs/learning/common-notation.itely:1347 (variable) -msgid "barA" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. Documentation/snippets/measure-counter.ly:30 (context id) -#. Documentation/snippets/measure-counter.ly:37 (context id) -msgid "foo" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @chapter in Documentation/learning/common-notation.itely -msgid "Common notation" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @section in Documentation/learning/common-notation.itely -msgid "Single staff notation" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Bar checks" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Accidentals and key signatures" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Accidentals" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "sharp" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "flat" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "double sharp" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "double flat" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Key signatures" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "key signature" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "major" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "minor" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Warning: key signatures and pitches" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "natural" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "transposition" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @chapter in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "Pitch names" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Ties and slurs" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Ties" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "tie" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Slurs" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "slur" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Phrasing slurs" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "phrasing" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Warnings: slurs vs. ties" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "articulation" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Articulation and dynamics" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Articulations" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Fingerings" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "fingering" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -#. @subheading in Documentation/learning/tweaks.itely -msgid "Dynamics" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "dynamics" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "crescendo" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "decrescendo" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Adding text" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Automatic and manual beams" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Advanced rhythmic commands" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Partial measure" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "anacrusis" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -#. Documentation/snippets/unfretted-headword.ly:93 (comment) -msgid "Tuplets" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "note value" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "triplet" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Grace notes" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "grace notes" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "acciaccatura" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "appoggiatura" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @section in Documentation/learning/common-notation.itely -msgid "Multiple notes at once" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Music expressions explained" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Analogy: mathematical expressions" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Simultaneous music expressions: multiple staves" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "polyphony" -msgstr "" - -#. @subheading in Documentation/learning/common-notation.itely -msgid "Simultaneous music expressions: single staff" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Multiple staves" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Staff groups" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "brace" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "staff" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @rglos in Documentation/learning/fundamental.itely -#. @rglos in Documentation/learning/tweaks.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/fundamental.itely -#. @rglos in Documentation/cs/learning/tweaks.itely -msgid "system" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Combining notes into chords" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "chord" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Single staff polyphony" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @section in Documentation/learning/common-notation.itely -msgid "Songs" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Setting simple songs" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "lyrics" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Aligning lyrics to a melody" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "melisma" -msgstr "" - -#. @rglos in Documentation/learning/common-notation.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/common-notation.itely -msgid "extender line" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Lyrics to multiple staves" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @section in Documentation/learning/common-notation.itely -msgid "Final touches" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Organizing pieces with variables" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Adding titles" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "Absolute note names" -msgstr "" - -#. @node in Documentation/learning/common-notation.itely -#. @subsection in Documentation/learning/common-notation.itely -msgid "After the tutorial" -msgstr "" - -#. Documentation/learning/fundamental.itely:320 (context id) -#. Documentation/learning/fundamental.itely:371 (context id) -#. Documentation/cs/learning/fundamental.itely:383 (context id) -#. Documentation/cs/learning/fundamental.itely:443 (context id) -#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:116 (variable) -#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:129 (context id) -#. Documentation/snippets/piano-template-with-centered-lyrics.ly:81 (context id) -msgid "singer" -msgstr "" - -#. Documentation/learning/fundamental.itely:321 (context id) -#. Documentation/learning/fundamental.itely:372 (context id) -#. Documentation/cs/learning/fundamental.itely:384 (context id) -#. Documentation/cs/learning/fundamental.itely:444 (context id) -msgid "vocal" -msgstr "" - -#. Documentation/learning/fundamental.itely:324 (context id) -#. Documentation/learning/fundamental.itely:375 (context id) -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/cs/learning/fundamental.itely:387 (context id) -#. Documentation/cs/learning/fundamental.itely:447 (context id) -#. Documentation/snippets/jazz-combo-template.ly:250 (variable) -#. Documentation/snippets/jazz-combo-template.ly:310 (context id) -#. Documentation/snippets/staff-headword.ly:122 (context id) -msgid "piano" -msgstr "" - -#. Documentation/learning/fundamental.itely:325 (context id) -#. Documentation/learning/fundamental.itely:366 (variable) -#. Documentation/learning/fundamental.itely:376 (context id) -#. Documentation/learning/fundamental.itely:2595 (variable) -#. Documentation/learning/fundamental.itely:2657 (context id) -#. Documentation/cs/learning/fundamental.itely:388 (context id) -#. Documentation/cs/learning/fundamental.itely:438 (variable) -#. Documentation/cs/learning/fundamental.itely:448 (context id) -#. Documentation/cs/learning/fundamental.itely:2822 (variable) -#. Documentation/cs/learning/fundamental.itely:2884 (context id) -#. Documentation/snippets/changing-the-number-of-lines-in-a-staff.ly:23 (variable) -#. Documentation/snippets/chords-headword.ly:75 (context id) -#. Documentation/snippets/fretted-headword.ly:144 (context id) -#. Documentation/snippets/jazz-combo-template.ly:253 (context id) -#. Documentation/snippets/piano-template-simple.ly:49 (variable) -#. Documentation/snippets/piano-template-simple.ly:68 (context id) -#. Documentation/snippets/piano-template-with-centered-lyrics.ly:59 (variable) -#. Documentation/snippets/piano-template-with-centered-lyrics.ly:81 (context id) -#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:71 (variable) -#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:92 (context id) -#. Documentation/snippets/polyphony-in-tablature.ly:46 (variable) -#. Documentation/snippets/polyphony-in-tablature.ly:64 (context id) -#. Documentation/snippets/polyphony-in-tablature.ly:68 (context id) -#. Documentation/snippets/staff-headword.ly:71 (variable) -msgid "upper" -msgstr "" - -#. Documentation/learning/fundamental.itely:326 (context id) -#. Documentation/learning/fundamental.itely:367 (variable) -#. Documentation/learning/fundamental.itely:377 (context id) -#. Documentation/learning/fundamental.itely:2602 (variable) -#. Documentation/learning/fundamental.itely:2658 (context id) -#. Documentation/cs/learning/fundamental.itely:389 (context id) -#. Documentation/cs/learning/fundamental.itely:439 (variable) -#. Documentation/cs/learning/fundamental.itely:449 (context id) -#. Documentation/cs/learning/fundamental.itely:2829 (variable) -#. Documentation/cs/learning/fundamental.itely:2885 (context id) -#. Documentation/snippets/changing-the-number-of-lines-in-a-staff.ly:27 (variable) -#. Documentation/snippets/chords-headword.ly:85 (context id) -#. Documentation/snippets/fretted-headword.ly:145 (context id) -#. Documentation/snippets/jazz-combo-template.ly:254 (context id) -#. Documentation/snippets/piano-template-simple.ly:57 (variable) -#. Documentation/snippets/piano-template-simple.ly:69 (context id) -#. Documentation/snippets/piano-template-with-centered-lyrics.ly:67 (variable) -#. Documentation/snippets/piano-template-with-centered-lyrics.ly:83 (context id) -#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:79 (variable) -#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:93 (context id) -#. Documentation/snippets/polyphony-in-tablature.ly:53 (variable) -#. Documentation/snippets/polyphony-in-tablature.ly:65 (context id) -#. Documentation/snippets/polyphony-in-tablature.ly:69 (context id) -#. Documentation/snippets/staff-headword.ly:82 (variable) -msgid "lower" -msgstr "" - -#. Documentation/learning/fundamental.itely:364 (variable) -#. Documentation/notation/changing-defaults.itely:489 (variable) -#. Documentation/notation/changing-defaults.itely:496 (context id) -#. Documentation/notation/changing-defaults.itely:506 (context id) -#. Documentation/notation/changing-defaults.itely:511 (context id) -#. Documentation/notation/changing-defaults.itely:528 (variable) -#. Documentation/notation/changing-defaults.itely:546 (context id) -#. Documentation/notation/changing-defaults.itely:742 (variable) -#. Documentation/cs/learning/fundamental.itely:436 (variable) -#. Documentation/snippets/adjusting-lyrics-vertical-spacing.ly:40 (context id) -#. Documentation/snippets/adjusting-lyrics-vertical-spacing.ly:49 (context id) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly:81 (context id) -#. Documentation/snippets/demo-midiinstruments.ly:32 (variable) -#. Documentation/snippets/formatting-lyrics-syllables.ly:40 (context id) -#. Documentation/snippets/fretted-headword.ly:64 (variable) -#. Documentation/snippets/guitar-strum-rhythms.ly:71 (context id) -#. Documentation/snippets/heavily-customized-polymetric-time-signatures.ly:37 (variable) -#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:59 (variable) -#. Documentation/snippets/single-staff-template-with-notes-and-chords.ly:60 (variable) -#. Documentation/snippets/single-staff-template-with-notes-and-lyrics.ly:79 (variable) -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly:60 (variable) -#. Documentation/snippets/single-staff-template-with-only-notes.ly:68 (variable) -#. Documentation/snippets/vertically-centered-common-lyrics.ly:48 (variable) -msgid "melody" -msgstr "" - -#. Documentation/learning/fundamental.itely:365 (variable) -#. Documentation/cs/learning/fundamental.itely:437 (variable) -#. Documentation/snippets/piano-template-with-centered-lyrics.ly:75 (variable) -#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:67 (variable) -#. Documentation/snippets/single-staff-template-with-notes-and-lyrics.ly:87 (variable) -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly:68 (variable) -msgid "text" -msgstr "" - -#. Documentation/learning/fundamental.itely:439 (context id) -#. Documentation/cs/learning/fundamental.itely:515 (context id) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:103 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:138 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:154 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:175 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:190 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:211 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:226 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:242 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:258 (comment) -msgid "main" -msgstr "" - -#. Documentation/learning/fundamental.itely:627 (comment) -#. Documentation/cs/learning/fundamental.itely:719 (comment) -msgid "Voice \\\"1\\\" Voice \\\"2\\\"" -msgstr "" - -#. Documentation/learning/fundamental.itely:637 (comment) -#. Documentation/cs/learning/fundamental.itely:729 (comment) -msgid "Voice \\\"1\\\" Voice \\\"2\\\"" -msgstr "" - -#. Documentation/learning/fundamental.itely:652 (comment) -#. Documentation/cs/learning/fundamental.itely:744 (comment) -msgid "Voice \\\"1\\\"" -msgstr "" - -#. Documentation/learning/fundamental.itely:657 (comment) -#. Documentation/cs/learning/fundamental.itely:749 (comment) -msgid "Voice \\\"2\\\"" -msgstr "" - -#. Documentation/learning/fundamental.itely:680 (comment) -#. Documentation/learning/fundamental.itely:704 (comment) -#. Documentation/cs/learning/fundamental.itely:766 (comment) -#. Documentation/cs/learning/fundamental.itely:790 (comment) -msgid "Main voice" -msgstr "" - -#. Documentation/learning/fundamental.itely:682 (comment) -#. Documentation/cs/learning/fundamental.itely:768 (comment) -msgid "Voice \\\"1\\\" Voice \\\"2\\\" Voice \\\"3\\\"" -msgstr "" - -#. Documentation/learning/fundamental.itely:706 (comment) -#. Documentation/cs/learning/fundamental.itely:792 (comment) -msgid "Bar 1" -msgstr "" - -#. Documentation/learning/fundamental.itely:717 (comment) -#. Documentation/cs/learning/fundamental.itely:803 (comment) -msgid "Bar 2" -msgstr "" - -#. Documentation/learning/fundamental.itely:718 (comment) -#. Documentation/cs/learning/fundamental.itely:804 (comment) -msgid "Voice 1 continues" -msgstr "" - -#. Documentation/learning/fundamental.itely:721 (comment) -#. Documentation/cs/learning/fundamental.itely:807 (comment) -msgid "Voice 2 continues" -msgstr "" - -#. Documentation/learning/fundamental.itely:896 (comment) -#. Documentation/cs/learning/fundamental.itely:984 (comment) -msgid "Voice one" -msgstr "" - -#. Documentation/learning/fundamental.itely:898 (comment) -#. Documentation/cs/learning/fundamental.itely:986 (comment) -msgid "Voice two" -msgstr "" - -#. Documentation/learning/fundamental.itely:900 (comment) -#. Documentation/cs/learning/fundamental.itely:988 (comment) -msgid "Omit Voice three" -msgstr "" - -#. Documentation/learning/fundamental.itely:901 (comment) -#. Documentation/cs/learning/fundamental.itely:989 (comment) -msgid "Voice four" -msgstr "" - -#. Documentation/learning/fundamental.itely:1000 (comment) -#. Documentation/cs/learning/fundamental.itely:1091 (comment) -msgid "Default behavior or behavior after \\oneVoice" -msgstr "" - -#. Documentation/learning/fundamental.itely:1038 (comment) -#. Documentation/cs/learning/fundamental.itely:1130 (comment) -msgid "The following notes are monophonic" -msgstr "" - -#. Documentation/learning/fundamental.itely:1040 (comment) -#. Documentation/cs/learning/fundamental.itely:1132 (comment) -msgid "Start simultaneous section of three voices" -msgstr "" - -#. Documentation/learning/fundamental.itely:1042 (comment) -#. Documentation/cs/learning/fundamental.itely:1134 (comment) -msgid "Continue the main voice in parallel" -msgstr "" - -#. Documentation/learning/fundamental.itely:1044 (comment) -#. Documentation/learning/fundamental.itely:1106 (comment) -#. Documentation/cs/learning/fundamental.itely:1136 (comment) -#. Documentation/cs/learning/fundamental.itely:1202 (comment) -msgid "Initiate second voice" -msgstr "" - -#. Documentation/learning/fundamental.itely:1046 (comment) -#. Documentation/cs/learning/fundamental.itely:1138 (comment) -msgid "Set stems, etc., down" -msgstr "" - -#. Documentation/learning/fundamental.itely:1050 (comment) -#. Documentation/learning/fundamental.itely:1112 (comment) -#. Documentation/cs/learning/fundamental.itely:1142 (comment) -#. Documentation/cs/learning/fundamental.itely:1208 (comment) -msgid "Initiate third voice" -msgstr "" - -#. Documentation/learning/fundamental.itely:1052 (comment) -#. Documentation/learning/fundamental.itely:1114 (comment) -#. Documentation/cs/learning/fundamental.itely:1144 (comment) -#. Documentation/cs/learning/fundamental.itely:1210 (comment) -msgid "Set stems, etc, up" -msgstr "" - -#. Documentation/learning/fundamental.itely:1101 (comment) -#. Documentation/cs/learning/fundamental.itely:1197 (comment) -msgid "Initiate first voice" -msgstr "" - -#. Documentation/learning/fundamental.itely:1108 (comment) -#. Documentation/cs/learning/fundamental.itely:1204 (comment) -msgid "Set stems, etc, down" -msgstr "" - -#. Documentation/learning/fundamental.itely:1195 (context id) -#. Documentation/learning/fundamental.itely:2306 (context id) -#. Documentation/cs/learning/fundamental.itely:1303 (context id) -#. Documentation/cs/learning/fundamental.itely:2522 (context id) -#. Documentation/snippets/adding-fingerings-to-tablatures.ly:37 (variable) -#. Documentation/snippets/jazz-combo-template.ly:236 (context id) -#. Documentation/snippets/jazz-combo-template.ly:245 (context id) -#. Documentation/snippets/single-staff-template-with-notes-and-lyrics.ly:93 (context id) -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly:82 (context id) -msgid "one" -msgstr "" - -#. Documentation/learning/fundamental.itely:1240 (variable) -#. Documentation/learning/fundamental.itely:2572 (variable) -#. Documentation/learning/tweaks.itely:3629 (variable) -#. Documentation/cs/learning/fundamental.itely:1352 (variable) -#. Documentation/cs/learning/fundamental.itely:2796 (variable) -#. Documentation/cs/learning/tweaks.itely:3964 (variable) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:82 (variable) -#. Documentation/snippets/anglican-psalm-template.ly:84 (variable) -#. Documentation/snippets/hymn-template.ly:89 (variable) -#. Documentation/snippets/incipit.ly:73 (variable) -#. Documentation/snippets/jazz-combo-template.ly:106 (variable) -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:48 (variable) -#. Documentation/snippets/mensurstriche-layout-bar-lines-between-the-staves.ly:56 (variable) -#. Documentation/snippets/printing-music-with-different-time-signatures.ly:36 (variable) -#. Documentation/snippets/satb-choir-template---four-staves.ly:52 (variable) -#. Documentation/snippets/string-quartet-template-simple.ly:61 (variable) -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:131 (variable) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:35 (variable) -#. Documentation/snippets/vocal-ensemble-template.ly:84 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:86 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:66 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:69 (variable) -msgid "global" -msgstr "" - -#. Documentation/learning/fundamental.itely:1242 (variable) -#. Documentation/cs/learning/fundamental.itely:1354 (variable) -msgid "SopOneMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:1245 (variable) -#. Documentation/cs/learning/fundamental.itely:1357 (variable) -msgid "SopOneLyrics" -msgstr "" - -#. Documentation/learning/fundamental.itely:1248 (variable) -#. Documentation/cs/learning/fundamental.itely:1360 (variable) -msgid "SopTwoMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:1251 (variable) -#. Documentation/cs/learning/fundamental.itely:1363 (variable) -msgid "SopTwoLyrics" -msgstr "" - -#. Documentation/learning/fundamental.itely:1258 (context id) -#. Documentation/cs/learning/fundamental.itely:1370 (context id) -msgid "SopOne" -msgstr "" - -#. Documentation/learning/fundamental.itely:1267 (context id) -#. Documentation/cs/learning/fundamental.itely:1379 (context id) -msgid "SopTwo" -msgstr "" - -#. Documentation/learning/fundamental.itely:1299 (variable) -#. Documentation/learning/fundamental.itely:2904 (variable) -#. Documentation/cs/learning/fundamental.itely:1415 (variable) -#. Documentation/cs/learning/fundamental.itely:3155 (variable) -msgid "keyTime" -msgstr "" - -#. Documentation/learning/fundamental.itely:1301 (variable) -#. Documentation/cs/learning/fundamental.itely:1417 (variable) -msgid "SopMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:1302 (variable) -#. Documentation/learning/tweaks.itely:3632 (variable) -#. Documentation/cs/learning/fundamental.itely:1418 (variable) -#. Documentation/cs/learning/tweaks.itely:3967 (variable) -#. Documentation/snippets/anglican-psalm-template.ly:69 (variable) -#. Documentation/snippets/hymn-template.ly:74 (variable) -msgid "AltoMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:1303 (variable) -#. Documentation/learning/tweaks.itely:3633 (variable) -#. Documentation/cs/learning/fundamental.itely:1419 (variable) -#. Documentation/cs/learning/tweaks.itely:3968 (variable) -#. Documentation/snippets/anglican-psalm-template.ly:74 (variable) -#. Documentation/snippets/hymn-template.ly:79 (variable) -msgid "TenorMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:1304 (variable) -#. Documentation/learning/tweaks.itely:3634 (variable) -#. Documentation/cs/learning/fundamental.itely:1420 (variable) -#. Documentation/cs/learning/tweaks.itely:3969 (variable) -#. Documentation/snippets/anglican-psalm-template.ly:79 (variable) -#. Documentation/snippets/hymn-template.ly:84 (variable) -msgid "BassMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:1306 (variable) -#. Documentation/learning/tweaks.itely:3636 (variable) -#. Documentation/cs/learning/fundamental.itely:1422 (variable) -#. Documentation/cs/learning/tweaks.itely:3971 (variable) -msgid "VerseOne" -msgstr "" - -#. Documentation/learning/fundamental.itely:1308 (variable) -#. Documentation/learning/tweaks.itely:3640 (variable) -#. Documentation/cs/learning/fundamental.itely:1424 (variable) -#. Documentation/cs/learning/tweaks.itely:3975 (variable) -msgid "VerseTwo" -msgstr "" - -#. Documentation/learning/fundamental.itely:1310 (variable) -#. Documentation/learning/tweaks.itely:3644 (variable) -#. Documentation/cs/learning/fundamental.itely:1426 (variable) -#. Documentation/cs/learning/tweaks.itely:3979 (variable) -msgid "VerseThree" -msgstr "" - -#. Documentation/learning/fundamental.itely:1312 (variable) -#. Documentation/learning/tweaks.itely:3648 (variable) -#. Documentation/cs/learning/fundamental.itely:1428 (variable) -#. Documentation/cs/learning/tweaks.itely:3983 (variable) -msgid "VerseFour" -msgstr "" - -#. Documentation/learning/fundamental.itely:1319 (context id) -#. Documentation/cs/learning/fundamental.itely:1435 (context id) -msgid "Sop" -msgstr "" - -#. Documentation/learning/fundamental.itely:1320 (context id) -#. Documentation/learning/tweaks.itely:3657 (context id) -#. Documentation/notation/input.itely:1610 (context id) -#. Documentation/cs/learning/fundamental.itely:1436 (context id) -#. Documentation/cs/learning/tweaks.itely:3992 (context id) -#. Documentation/snippets/anglican-psalm-template.ly:109 (context id) -#. Documentation/snippets/chords-headword.ly:52 (variable) -#. Documentation/snippets/hymn-template.ly:104 (context id) -msgid "Alto" -msgstr "" - -#. Documentation/learning/fundamental.itely:1328 (context id) -#. Documentation/learning/tweaks.itely:3665 (context id) -#. Documentation/notation/input.itely:1612 (context id) -#. Documentation/cs/learning/fundamental.itely:1444 (context id) -#. Documentation/cs/learning/tweaks.itely:4000 (context id) -#. Documentation/snippets/anglican-psalm-template.ly:117 (context id) -#. Documentation/snippets/chords-headword.ly:58 (variable) -#. Documentation/snippets/hymn-template.ly:113 (context id) -msgid "Tenor" -msgstr "" - -#. Documentation/learning/fundamental.itely:1329 (context id) -#. Documentation/learning/tweaks.itely:3666 (context id) -#. Documentation/notation/input.itely:1617 (context id) -#. Documentation/cs/learning/fundamental.itely:1445 (context id) -#. Documentation/cs/learning/tweaks.itely:4001 (context id) -#. Documentation/snippets/anglican-psalm-template.ly:121 (context id) -#. Documentation/snippets/chords-headword.ly:65 (variable) -#. Documentation/snippets/hymn-template.ly:118 (context id) -#. Documentation/snippets/jazz-combo-template.ly:259 (variable) -msgid "Bass" -msgstr "" - -#. Documentation/learning/fundamental.itely:1473 (comment) -#. Documentation/cs/learning/fundamental.itely:1613 (comment) -msgid "start of single compound music expression" -msgstr "" - -#. Documentation/learning/fundamental.itely:1474 (comment) -#. Documentation/cs/learning/fundamental.itely:1614 (comment) -msgid "start of simultaneous staves section" -msgstr "" - -#. Documentation/learning/fundamental.itely:1476 (comment) -#. Documentation/cs/learning/fundamental.itely:1616 (comment) -msgid "create RH staff" -msgstr "" - -#. Documentation/learning/fundamental.itely:1479 (comment) -#. Documentation/cs/learning/fundamental.itely:1619 (comment) -msgid "create voice for RH notes" -msgstr "" - -#. Documentation/learning/fundamental.itely:1480 (comment) -#. Documentation/cs/learning/fundamental.itely:1620 (comment) -msgid "start of RH notes" -msgstr "" - -#. Documentation/learning/fundamental.itely:1483 (comment) -#. Documentation/cs/learning/fundamental.itely:1623 (comment) -msgid "end of RH notes" -msgstr "" - -#. Documentation/learning/fundamental.itely:1484 (comment) -#. Documentation/cs/learning/fundamental.itely:1624 (comment) -msgid "end of RH voice" -msgstr "" - -#. Documentation/learning/fundamental.itely:1485 (comment) -#. Documentation/cs/learning/fundamental.itely:1625 (comment) -msgid "end of RH staff" -msgstr "" - -#. Documentation/learning/fundamental.itely:1486 (comment) -#. Documentation/cs/learning/fundamental.itely:1626 (comment) -msgid "create LH staff; needs two simultaneous voices" -msgstr "" - -#. Documentation/learning/fundamental.itely:1489 (comment) -#. Documentation/cs/learning/fundamental.itely:1629 (comment) -msgid "create LH voice one" -msgstr "" - -#. Documentation/learning/fundamental.itely:1491 (comment) -#. Documentation/cs/learning/fundamental.itely:1631 (comment) -msgid "start of LH voice one notes" -msgstr "" - -#. Documentation/learning/fundamental.itely:1494 (comment) -#. Documentation/cs/learning/fundamental.itely:1634 (comment) -msgid "end of LH voice one notes" -msgstr "" - -#. Documentation/learning/fundamental.itely:1495 (comment) -#. Documentation/cs/learning/fundamental.itely:1635 (comment) -msgid "end of LH voice one" -msgstr "" - -#. Documentation/learning/fundamental.itely:1496 (comment) -#. Documentation/cs/learning/fundamental.itely:1636 (comment) -msgid "create LH voice two" -msgstr "" - -#. Documentation/learning/fundamental.itely:1498 (comment) -#. Documentation/cs/learning/fundamental.itely:1638 (comment) -msgid "start of LH voice two notes" -msgstr "" - -#. Documentation/learning/fundamental.itely:1501 (comment) -#. Documentation/cs/learning/fundamental.itely:1641 (comment) -msgid "end of LH voice two notes" -msgstr "" - -#. Documentation/learning/fundamental.itely:1502 (comment) -#. Documentation/cs/learning/fundamental.itely:1642 (comment) -msgid "end of LH voice two" -msgstr "" - -#. Documentation/learning/fundamental.itely:1503 (comment) -#. Documentation/cs/learning/fundamental.itely:1643 (comment) -msgid "end of LH staff" -msgstr "" - -#. Documentation/learning/fundamental.itely:1504 (comment) -#. Documentation/cs/learning/fundamental.itely:1644 (comment) -msgid "end of simultaneous staves section" -msgstr "" - -#. Documentation/learning/fundamental.itely:1505 (comment) -#. Documentation/cs/learning/fundamental.itely:1645 (comment) -msgid "end of single compound music expression" -msgstr "" - -#. Documentation/learning/fundamental.itely:1724 (comment) -#. Documentation/cs/learning/fundamental.itely:1894 (comment) -msgid "Wrong!" -msgstr "" - -#. Documentation/learning/fundamental.itely:1810 (comment) -#. Documentation/learning/fundamental.itely:1987 (comment) -#. Documentation/cs/learning/fundamental.itely:1983 (comment) -#. Documentation/cs/learning/fundamental.itely:2176 (comment) -msgid "make note heads smaller" -msgstr "" - -#. Documentation/learning/fundamental.itely:1813 (comment) -#. Documentation/learning/fundamental.itely:1989 (comment) -#. Documentation/cs/learning/fundamental.itely:1986 (comment) -#. Documentation/cs/learning/fundamental.itely:2178 (comment) -msgid "make note heads larger" -msgstr "" - -#. Documentation/learning/fundamental.itely:1816 (comment) -#. Documentation/learning/fundamental.itely:1991 (comment) -#. Documentation/cs/learning/fundamental.itely:1989 (comment) -#. Documentation/cs/learning/fundamental.itely:2180 (comment) -msgid "return to default size" -msgstr "" - -#. Documentation/learning/fundamental.itely:2285 (variable) -#. Documentation/learning/fundamental.itely:2573 (variable) -#. Documentation/notation/input.itely:1602 (variable) -#. Documentation/cs/learning/fundamental.itely:2501 (variable) -#. Documentation/cs/learning/fundamental.itely:2800 (variable) -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:87 (variable) -msgid "sopranoMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:2292 (variable) -#. Documentation/cs/learning/fundamental.itely:2508 (variable) -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:88 (variable) -msgid "sopranoLyrics" -msgstr "" - -#. Documentation/learning/fundamental.itely:2296 (variable) -#. Documentation/cs/learning/fundamental.itely:2512 (variable) -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:100 (variable) -msgid "celloMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:2577 (variable) -#. Documentation/cs/learning/fundamental.itely:2804 (variable) -msgid "sopranoWords" -msgstr "" - -#. Documentation/learning/fundamental.itely:2580 (variable) -#. Documentation/notation/input.itely:1603 (variable) -#. Documentation/cs/learning/fundamental.itely:2807 (variable) -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:59 (variable) -#. Documentation/snippets/vocal-ensemble-template.ly:96 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:98 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:78 (variable) -msgid "altoMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:2584 (variable) -#. Documentation/cs/learning/fundamental.itely:2811 (variable) -#. Documentation/snippets/vocal-ensemble-template.ly:99 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:101 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:81 (variable) -msgid "altoWords" -msgstr "" - -#. Documentation/learning/fundamental.itely:2585 (variable) -#. Documentation/notation/input.itely:1604 (variable) -#. Documentation/cs/learning/fundamental.itely:2812 (variable) -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:65 (variable) -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:93 (variable) -#. Documentation/snippets/vocal-ensemble-template.ly:103 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:105 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:85 (variable) -msgid "tenorMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:2589 (variable) -#. Documentation/cs/learning/fundamental.itely:2816 (variable) -#. Documentation/snippets/vocal-ensemble-template.ly:106 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:108 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:88 (variable) -msgid "tenorWords" -msgstr "" - -#. Documentation/learning/fundamental.itely:2590 (variable) -#. Documentation/notation/input.itely:1605 (variable) -#. Documentation/cs/learning/fundamental.itely:2817 (variable) -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:70 (variable) -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:101 (variable) -#. Documentation/snippets/vocal-ensemble-template.ly:110 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:112 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:92 (variable) -msgid "bassMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:2594 (variable) -#. Documentation/cs/learning/fundamental.itely:2821 (variable) -#. Documentation/snippets/vocal-ensemble-template.ly:113 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:115 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:95 (variable) -msgid "bassWords" -msgstr "" - -#. Documentation/learning/fundamental.itely:2611 (comment) -#. Documentation/cs/learning/fundamental.itely:2838 (comment) -msgid "combine ChoirStaff and PianoStaff in parallel" -msgstr "" - -#. Documentation/learning/fundamental.itely:2613 (context id) -#. Documentation/learning/fundamental.itely:2615 (context id) -#. Documentation/cs/learning/fundamental.itely:2840 (context id) -#. Documentation/cs/learning/fundamental.itely:2842 (context id) -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:83 (context id) -#. Documentation/snippets/vocal-ensemble-template.ly:124 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:127 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:102 (context id) -msgid "sopranos" -msgstr "" - -#. Documentation/learning/fundamental.itely:2623 (context id) -#. Documentation/learning/fundamental.itely:2625 (context id) -#. Documentation/cs/learning/fundamental.itely:2850 (context id) -#. Documentation/cs/learning/fundamental.itely:2852 (context id) -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:87 (context id) -#. Documentation/snippets/vocal-ensemble-template.ly:128 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:128 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:103 (context id) -msgid "altos" -msgstr "" - -#. Documentation/learning/fundamental.itely:2633 (context id) -#. Documentation/learning/fundamental.itely:2635 (context id) -#. Documentation/cs/learning/fundamental.itely:2860 (context id) -#. Documentation/cs/learning/fundamental.itely:2862 (context id) -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:96 (context id) -#. Documentation/snippets/vocal-ensemble-template.ly:140 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:138 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:115 (context id) -msgid "tenors" -msgstr "" - -#. Documentation/learning/fundamental.itely:2643 (context id) -#. Documentation/learning/fundamental.itely:2645 (context id) -#. Documentation/cs/learning/fundamental.itely:2870 (context id) -#. Documentation/cs/learning/fundamental.itely:2872 (context id) -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:100 (context id) -#. Documentation/snippets/vocal-ensemble-template.ly:144 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:139 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:116 (context id) -msgid "basses" -msgstr "" - -#. Documentation/learning/fundamental.itely:2653 (comment) -#. Documentation/cs/learning/fundamental.itely:2880 (comment) -msgid "end ChoirStaff" -msgstr "" - -#. Documentation/learning/fundamental.itely:2905 (variable) -#. Documentation/cs/learning/fundamental.itely:3156 (variable) -msgid "ManualOneVoiceOneMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:2909 (variable) -#. Documentation/cs/learning/fundamental.itely:3160 (variable) -msgid "ManualOneVoiceTwoMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:2913 (variable) -#. Documentation/cs/learning/fundamental.itely:3164 (variable) -msgid "ManualTwoMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:2917 (variable) -#. Documentation/cs/learning/fundamental.itely:3168 (variable) -msgid "PedalOrganMusic" -msgstr "" - -#. Documentation/learning/fundamental.itely:2923 (comment) -#. Documentation/cs/learning/fundamental.itely:3174 (comment) -msgid "PianoStaff and Pedal Staff must be simultaneous" -msgstr "" - -#. Documentation/learning/fundamental.itely:2925 (context id) -#. Documentation/cs/learning/fundamental.itely:3176 (context id) -msgid "ManualOne" -msgstr "" - -#. Documentation/learning/fundamental.itely:2926 (comment) -msgid "set key and time signature" -msgstr "" - -#. Documentation/learning/fundamental.itely:2936 (comment) -#. Documentation/cs/learning/fundamental.itely:3187 (comment) -msgid "end ManualOne Staff context" -msgstr "" - -#. Documentation/learning/fundamental.itely:2937 (context id) -#. Documentation/cs/learning/fundamental.itely:3188 (context id) -msgid "ManualTwo" -msgstr "" - -#. Documentation/learning/fundamental.itely:2946 (comment) -#. Documentation/cs/learning/fundamental.itely:3197 (comment) -msgid "end ManualTwo Staff context" -msgstr "" - -#. Documentation/learning/fundamental.itely:2947 (comment) -#. Documentation/cs/learning/fundamental.itely:3198 (comment) -msgid "end PianoStaff context" -msgstr "" - -#. Documentation/learning/fundamental.itely:2948 (context id) -#. Documentation/cs/learning/fundamental.itely:3199 (context id) -msgid "PedalOrgan" -msgstr "" - -#. Documentation/learning/fundamental.itely:2954 (comment) -#. Documentation/cs/learning/fundamental.itely:3205 (comment) -msgid "end PedalOrgan Staff context" -msgstr "" - -#. Documentation/learning/fundamental.itely:2956 (comment) -#. Documentation/cs/learning/fundamental.itely:3207 (comment) -msgid "end Score context" -msgstr "" - -#. Documentation/learning/fundamental.itely:2972 (variable) -#. Documentation/cs/learning/fundamental.itely:3224 (variable) -msgid "hornNotes" -msgstr "" - -#. Documentation/learning/fundamental.itely:2984 (variable) -#. Documentation/cs/learning/fundamental.itely:3237 (variable) -msgid "fragmentA" -msgstr "" - -#. Documentation/learning/fundamental.itely:2985 (variable) -#. Documentation/cs/learning/fundamental.itely:3238 (variable) -msgid "fragmentB" -msgstr "" - -#. Documentation/learning/fundamental.itely:3004 (variable) -#. Documentation/cs/learning/fundamental.itely:3257 (variable) -msgid "dolce" -msgstr "" - -#. Documentation/learning/fundamental.itely:3007 (variable) -#. Documentation/cs/learning/fundamental.itely:3259 (variable) -msgid "fthenp" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @chapter in Documentation/learning/fundamental.itely -msgid "Fundamental concepts" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @section in Documentation/learning/fundamental.itely -msgid "How LilyPond input files work" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Introduction to the LilyPond file structure" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Score is a (single) compound musical expression" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Nesting music expressions" -msgstr "" - -#. @rglos in Documentation/learning/fundamental.itely -#. @rglos in Documentation/learning/tweaks.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/tweaks.itely -msgid "ossia" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "On the un-nestedness of brackets and ties" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @section in Documentation/learning/fundamental.itely -msgid "Voices contain music" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "I'm hearing Voices" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Explicitly instantiating voices" -msgstr "" - -#. @subsubheading in Documentation/learning/fundamental.itely -msgid "Note columns" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Voices and vocals" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @section in Documentation/learning/fundamental.itely -msgid "Contexts and engravers" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Contexts explained" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Creating contexts" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Engravers explained" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Modifying context properties" -msgstr "" - -#. @subsubheading in Documentation/learning/fundamental.itely -msgid "Setting context properties with @code{\\\\with}" -msgstr "" - -#. @subsubheading in Documentation/learning/fundamental.itely -msgid "Setting context properties with @code{\\\\context}" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Adding and removing engravers" -msgstr "" - -#. @subsubheading in Documentation/learning/fundamental.itely -msgid "Changing a single context" -msgstr "" - -#. @rglos in Documentation/learning/fundamental.itely -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. @rglos in Documentation/cs/learning/fundamental.itely -msgid "ambitus" -msgstr "" - -#. @subsubheading in Documentation/learning/fundamental.itely -msgid "Changing all contexts of the same type" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @section in Documentation/learning/fundamental.itely -msgid "Extending the templates" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Soprano and cello" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Four-part SATB vocal score" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Building a score from scratch" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Saving typing with variables and functions" -msgstr "" - -#. @node in Documentation/learning/fundamental.itely -#. @subsection in Documentation/learning/fundamental.itely -msgid "Scores and parts" -msgstr "" - -#. Documentation/learning/tweaks.itely:605 (comment) -#. Documentation/learning/tweaks.itely:743 (comment) -#. Documentation/cs/learning/tweaks.itely:680 (comment) -#. Documentation/cs/learning/tweaks.itely:825 (comment) -msgid "Increase thickness of all following slurs from 1.2 to 5.0" -msgstr "" - -#. Documentation/learning/tweaks.itely:675 (comment) -#. Documentation/learning/tweaks.itely:715 (comment) -#. Documentation/learning/tweaks.itely:718 (comment) -#. Documentation/cs/learning/tweaks.itely:755 (comment) -#. Documentation/cs/learning/tweaks.itely:797 (comment) -#. Documentation/cs/learning/tweaks.itely:800 (comment) -msgid "Increase thickness of immediately following slur only" -msgstr "" - -#. Documentation/learning/tweaks.itely:747 (comment) -#. Documentation/cs/learning/tweaks.itely:829 (comment) -msgid "Revert thickness of all following slurs to default of 1.2" -msgstr "" - -#. Documentation/learning/tweaks.itely:1424 (comment) -#. Documentation/cs/learning/tweaks.itely:1584 (comment) -msgid "Don't print clefs in this staff" -msgstr "" - -#. Documentation/learning/tweaks.itely:1426 (comment) -#. Documentation/cs/learning/tweaks.itely:1586 (comment) -msgid "Don't print time signatures in this staff" -msgstr "" - -#. Documentation/learning/tweaks.itely:1490 (comment) -#. Documentation/cs/learning/tweaks.itely:1657 (comment) -msgid "Reduce all font sizes by ~24%" -msgstr "" - -#. Documentation/learning/tweaks.itely:1557 (comment) -#. Documentation/cs/learning/tweaks.itely:1731 (comment) -msgid "Reduce stem length and line spacing to match" -msgstr "" - -#. Documentation/learning/tweaks.itely:2008 (comment) -#. Documentation/learning/tweaks.itely:2058 (comment) -#. Documentation/cs/learning/tweaks.itely:2207 (comment) -#. Documentation/cs/learning/tweaks.itely:2285 (comment) -msgid "Set details for later Text Spanner" -msgstr "" - -#. Documentation/learning/tweaks.itely:2011 (comment) -#. Documentation/learning/tweaks.itely:2061 (comment) -#. Documentation/cs/learning/tweaks.itely:2210 (comment) -#. Documentation/cs/learning/tweaks.itely:2288 (comment) -msgid "Place dynamics above staff" -msgstr "" - -#. Documentation/learning/tweaks.itely:2013 (comment) -#. Documentation/learning/tweaks.itely:2065 (comment) -#. Documentation/cs/learning/tweaks.itely:2212 (comment) -#. Documentation/cs/learning/tweaks.itely:2292 (comment) -msgid "Start Ottava Bracket" -msgstr "" - -#. Documentation/learning/tweaks.itely:2016 (comment) -#. Documentation/cs/learning/tweaks.itely:2215 (comment) -msgid "Add Dynamic Text and hairpin" -msgstr "" - -#. Documentation/learning/tweaks.itely:2019 (comment) -#. Documentation/learning/tweaks.itely:2072 (comment) -#. Documentation/cs/learning/tweaks.itely:2218 (comment) -#. Documentation/cs/learning/tweaks.itely:2299 (comment) -msgid "Add Text Script" -msgstr "" - -#. Documentation/learning/tweaks.itely:2022 (comment) -#. Documentation/cs/learning/tweaks.itely:2221 (comment) -msgid "Add Dynamic Text and terminate hairpin" -msgstr "" - -#. Documentation/learning/tweaks.itely:2024 (comment) -#. Documentation/learning/tweaks.itely:2077 (comment) -#. Documentation/cs/learning/tweaks.itely:2223 (comment) -#. Documentation/cs/learning/tweaks.itely:2304 (comment) -msgid "Stop Ottava Bracket" -msgstr "" - -#. Documentation/learning/tweaks.itely:2063 (comment) -#. Documentation/cs/learning/tweaks.itely:2290 (comment) -msgid "Place following Ottava Bracket below Text Spanners" -msgstr "" - -#. Documentation/learning/tweaks.itely:2068 (comment) -#. Documentation/learning/tweaks.itely:2075 (comment) -#. Documentation/cs/learning/tweaks.itely:2295 (comment) -#. Documentation/cs/learning/tweaks.itely:2302 (comment) -msgid "Add Dynamic Text" -msgstr "" - -#. Documentation/learning/tweaks.itely:2070 (comment) -#. Documentation/cs/learning/tweaks.itely:2297 (comment) -msgid "Add Dynamic Line Spanner" -msgstr "" - -#. Documentation/learning/tweaks.itely:2157 (comment) -#. Documentation/cs/learning/tweaks.itely:2380 (comment) -msgid "Cause notes to space out to accommodate text" -msgstr "" - -#. Documentation/learning/tweaks.itely:2180 (comment) -#. Documentation/cs/learning/tweaks.itely:2406 (comment) -msgid "This markup is short enough to fit without collision" -msgstr "" - -#. Documentation/learning/tweaks.itely:2184 (comment) -#. Documentation/cs/learning/tweaks.itely:2410 (comment) -msgid "This is too long to fit, so it is displaced upwards" -msgstr "" - -#. Documentation/learning/tweaks.itely:2188 (comment) -#. Documentation/learning/tweaks.itely:2193 (comment) -#. Documentation/cs/learning/tweaks.itely:2414 (comment) -#. Documentation/cs/learning/tweaks.itely:2419 (comment) -msgid "Turn off collision avoidance" -msgstr "" - -#. Documentation/learning/tweaks.itely:2195 (comment) -#. Documentation/cs/learning/tweaks.itely:2421 (comment) -msgid "and turn on textLengthOn" -msgstr "" - -#. Documentation/learning/tweaks.itely:2196 (comment) -#. Documentation/cs/learning/tweaks.itely:2422 (comment) -msgid "Spaces at end are honored" -msgstr "" - -#. Documentation/learning/tweaks.itely:2303 (comment) -#. Documentation/cs/learning/tweaks.itely:2537 (comment) -msgid "Extend width by 1 staff space" -msgstr "" - -#. Documentation/learning/tweaks.itely:2583 (comment) -#. Documentation/cs/learning/tweaks.itely:2863 (comment) -msgid "This will not work, see below" -msgstr "" - -#. Documentation/learning/tweaks.itely:2587 (comment) -#. Documentation/cs/learning/tweaks.itely:2867 (comment) -msgid "This works" -msgstr "" - -#. Documentation/learning/tweaks.itely:2623 (variable) -#. Documentation/cs/learning/tweaks.itely:2909 (variable) -msgid "sesquisharp" -msgstr "" - -#. Documentation/learning/tweaks.itely:2626 (comment) -#. Documentation/cs/learning/tweaks.itely:2912 (comment) -msgid "This prints a sesquisharp but the spacing is too small" -msgstr "" - -#. Documentation/learning/tweaks.itely:2631 (comment) -#. Documentation/cs/learning/tweaks.itely:2917 (comment) -msgid "This improves the spacing" -msgstr "" - -#. Documentation/learning/tweaks.itely:2671 (comment) -#. Documentation/cs/learning/tweaks.itely:2961 (comment) -msgid "Extend width by 1 unit" -msgstr "" - -#. Documentation/learning/tweaks.itely:2673 (comment) -#. Documentation/cs/learning/tweaks.itely:2963 (comment) -msgid "Align dynamics to a base line 2 units above staff" -msgstr "" - -#. Documentation/learning/tweaks.itely:3014 (variable) -#. Documentation/learning/tweaks.itely:3071 (variable) -#. Documentation/learning/tweaks.itely:3141 (variable) -#. Documentation/learning/tweaks.itely:3294 (variable) -#. Documentation/learning/tweaks.itely:3364 (variable) -#. Documentation/cs/learning/tweaks.itely:3319 (variable) -#. Documentation/cs/learning/tweaks.itely:3379 (variable) -#. Documentation/cs/learning/tweaks.itely:3453 (variable) -#. Documentation/cs/learning/tweaks.itely:3537 (variable) -#. Documentation/cs/learning/tweaks.itely:3611 (variable) -#. Documentation/cs/learning/tweaks.itely:3681 (variable) -msgid "rhMusic" -msgstr "" - -#. Documentation/learning/tweaks.itely:3020 (comment) -#. Documentation/learning/tweaks.itely:3077 (comment) -#. Documentation/learning/tweaks.itely:3149 (comment) -#. Documentation/learning/tweaks.itely:3304 (comment) -#. Documentation/learning/tweaks.itely:3374 (comment) -#. Documentation/cs/learning/tweaks.itely:3324 (comment) -#. Documentation/cs/learning/tweaks.itely:3385 (comment) -#. Documentation/cs/learning/tweaks.itely:3461 (comment) -#. Documentation/cs/learning/tweaks.itely:3547 (comment) -#. Documentation/cs/learning/tweaks.itely:3621 (comment) -#. Documentation/cs/learning/tweaks.itely:3691 (comment) -msgid "Start polyphonic section of four voices" -msgstr "" - -#. Documentation/learning/tweaks.itely:3022 (comment) -#. Documentation/learning/tweaks.itely:3036 (comment) -#. Documentation/learning/tweaks.itely:3079 (comment) -#. Documentation/learning/tweaks.itely:3093 (comment) -#. Documentation/learning/tweaks.itely:3151 (comment) -#. Documentation/learning/tweaks.itely:3165 (comment) -#. Documentation/learning/tweaks.itely:3306 (comment) -#. Documentation/learning/tweaks.itely:3325 (comment) -#. Documentation/learning/tweaks.itely:3376 (comment) -#. Documentation/learning/tweaks.itely:3404 (comment) -#. Documentation/cs/learning/tweaks.itely:3326 (comment) -#. Documentation/cs/learning/tweaks.itely:3340 (comment) -#. Documentation/cs/learning/tweaks.itely:3387 (comment) -#. Documentation/cs/learning/tweaks.itely:3401 (comment) -#. Documentation/cs/learning/tweaks.itely:3463 (comment) -#. Documentation/cs/learning/tweaks.itely:3477 (comment) -#. Documentation/cs/learning/tweaks.itely:3549 (comment) -#. Documentation/cs/learning/tweaks.itely:3565 (comment) -#. Documentation/cs/learning/tweaks.itely:3623 (comment) -#. Documentation/cs/learning/tweaks.itely:3641 (comment) -#. Documentation/cs/learning/tweaks.itely:3693 (comment) -#. Documentation/cs/learning/tweaks.itely:3720 (comment) -msgid "continuation of main voice" -msgstr "" - -#. Documentation/learning/tweaks.itely:3040 (variable) -#. Documentation/learning/tweaks.itely:3097 (variable) -#. Documentation/learning/tweaks.itely:3169 (variable) -#. Documentation/learning/tweaks.itely:3329 (variable) -#. Documentation/learning/tweaks.itely:3408 (variable) -#. Documentation/cs/learning/tweaks.itely:3344 (variable) -#. Documentation/cs/learning/tweaks.itely:3405 (variable) -#. Documentation/cs/learning/tweaks.itely:3481 (variable) -#. Documentation/cs/learning/tweaks.itely:3569 (variable) -#. Documentation/cs/learning/tweaks.itely:3645 (variable) -#. Documentation/cs/learning/tweaks.itely:3724 (variable) -msgid "lhMusic" -msgstr "" - -#. Documentation/learning/tweaks.itely:3049 (context id) -#. Documentation/learning/tweaks.itely:3106 (context id) -#. Documentation/learning/tweaks.itely:3178 (context id) -#. Documentation/learning/tweaks.itely:3338 (context id) -#. Documentation/learning/tweaks.itely:3417 (context id) -#. Documentation/notation/input.itely:1623 (context id) -#. Documentation/cs/learning/tweaks.itely:3353 (context id) -#. Documentation/cs/learning/tweaks.itely:3414 (context id) -#. Documentation/cs/learning/tweaks.itely:3490 (context id) -#. Documentation/cs/learning/tweaks.itely:3578 (context id) -#. Documentation/cs/learning/tweaks.itely:3654 (context id) -#. Documentation/cs/learning/tweaks.itely:3733 (context id) -#. Documentation/snippets/repeats-headword.ly:33 (context id) -#. Documentation/snippets/simultaneous-headword.ly:54 (comment) -msgid "RH" -msgstr "" - -#. Documentation/learning/tweaks.itely:3053 (context id) -#. Documentation/learning/tweaks.itely:3110 (context id) -#. Documentation/learning/tweaks.itely:3182 (context id) -#. Documentation/learning/tweaks.itely:3342 (context id) -#. Documentation/learning/tweaks.itely:3421 (context id) -#. Documentation/notation/input.itely:1629 (context id) -#. Documentation/cs/learning/tweaks.itely:3357 (context id) -#. Documentation/cs/learning/tweaks.itely:3418 (context id) -#. Documentation/cs/learning/tweaks.itely:3494 (context id) -#. Documentation/cs/learning/tweaks.itely:3582 (context id) -#. Documentation/cs/learning/tweaks.itely:3658 (context id) -#. Documentation/cs/learning/tweaks.itely:3737 (context id) -#. Documentation/snippets/repeats-headword.ly:95 (context id) -#. Documentation/snippets/text-headword.ly:132 (comment) -msgid "LH" -msgstr "" - -#. Documentation/learning/tweaks.itely:3309 (comment) -#. Documentation/learning/tweaks.itely:3382 (comment) -msgid "Move the c2 out of the main note column" -msgstr "" - -#. Documentation/learning/tweaks.itely:3310 (comment) -#. Documentation/learning/tweaks.itely:3383 (comment) -msgid "so the merge will work" -msgstr "" - -#. Documentation/learning/tweaks.itely:3315 (comment) -#. Documentation/learning/tweaks.itely:3390 (comment) -#. Documentation/cs/learning/tweaks.itely:3631 (comment) -#. Documentation/cs/learning/tweaks.itely:3706 (comment) -msgid "Stem on the d2 must be down to permit merging" -msgstr "" - -#. Documentation/learning/tweaks.itely:3380 (comment) -#. Documentation/cs/learning/tweaks.itely:3697 (comment) -msgid "Reposition the c2 to the right of the merged note" -msgstr "" - -#. Documentation/learning/tweaks.itely:3392 (comment) -#. Documentation/cs/learning/tweaks.itely:3708 (comment) -msgid "Stem on the d2 should be invisible" -msgstr "" - -#. Documentation/learning/tweaks.itely:3529 (comment) -#. Documentation/learning/tweaks.itely:3551 (comment) -#. Documentation/cs/learning/tweaks.itely:3859 (comment) -#. Documentation/cs/learning/tweaks.itely:3878 (comment) -msgid "Visible tempo marking" -msgstr "" - -#. Documentation/learning/tweaks.itely:3533 (comment) -#. Documentation/learning/tweaks.itely:3555 (comment) -#. Documentation/cs/learning/tweaks.itely:3863 (comment) -#. Documentation/cs/learning/tweaks.itely:3882 (comment) -msgid "Invisible tempo marking to lengthen fermata in MIDI" -msgstr "" - -#. Documentation/learning/tweaks.itely:3536 (comment) -#. Documentation/learning/tweaks.itely:3558 (comment) -#. Documentation/cs/learning/tweaks.itely:3866 (comment) -#. Documentation/cs/learning/tweaks.itely:3885 (comment) -msgid "New tempo for next section" -msgstr "" - -#. Documentation/learning/tweaks.itely:3619 (variable) -#. Documentation/cs/learning/tweaks.itely:3955 (variable) -msgid "emphasize" -msgstr "" - -#. Documentation/learning/tweaks.itely:3624 (variable) -#. Documentation/cs/learning/tweaks.itely:3959 (variable) -msgid "normal" -msgstr "" - -#. Documentation/learning/tweaks.itely:3631 (variable) -#. Documentation/cs/learning/tweaks.itely:3966 (variable) -#. Documentation/snippets/anglican-psalm-template.ly:64 (variable) -#. Documentation/snippets/hymn-template.ly:69 (variable) -msgid "SopranoMusic" -msgstr "" - -#. Documentation/learning/tweaks.itely:3656 (context id) -#. Documentation/notation/input.itely:1608 (context id) -#. Documentation/cs/learning/tweaks.itely:3991 (context id) -#. Documentation/snippets/anglican-psalm-template.ly:105 (context id) -#. Documentation/snippets/chords-headword.ly:44 (variable) -#. Documentation/snippets/hymn-template.ly:99 (context id) -msgid "Soprano" -msgstr "" - -#. Documentation/learning/tweaks.itely:3687 (variable) -#. Documentation/cs/learning/tweaks.itely:4024 (variable) -msgid "mpdolce" -msgstr "" - -#. Documentation/learning/tweaks.itely:3694 (variable) -#. Documentation/cs/learning/tweaks.itely:4031 (variable) -msgid "inst" -msgstr "" - -#. Documentation/learning/tweaks.itely:4172 (comment) -#. Documentation/cs/learning/tweaks.itely:4557 (comment) -msgid "Arrange to obtain color from color-notehead procedure" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @chapter in Documentation/learning/tweaks.itely -msgid "Tweaking output" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @section in Documentation/learning/tweaks.itely -msgid "Tweaking basics" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Introduction to tweaks" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Objects and interfaces" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Naming conventions of objects and properties" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Tweaking methods" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @section in Documentation/learning/tweaks.itely -msgid "The Internals Reference manual" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Properties of layout objects" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "Finding the context" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "Overriding once only" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "Reverting" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Properties found in interfaces" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "Specifying the context in lyric mode" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Types of properties" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @section in Documentation/learning/tweaks.itely -msgid "Appearance of objects" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Visibility and color of objects" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "stencil" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "break-visibility" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "transparent" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "color" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Size of objects" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Length and thickness of objects" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @section in Documentation/learning/tweaks.itely -msgid "Placement of objects" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Automatic behavior" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Within-staff objects" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/learning/tweaks.itely -msgid "Fingering" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Outside-staff objects" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "\\\\textLengthOn" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "Grob sizing" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @section in Documentation/learning/tweaks.itely -msgid "Collisions of objects" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Moving objects" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Fixing overlapping notation" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "padding property" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "right-padding" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "staff-padding property" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "self-alignment-X property" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "staff-position property" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "extra-offset property" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "positions property" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "force-hshift property" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Real music example" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @section in Documentation/learning/tweaks.itely -msgid "Further tweaking" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Other uses for tweaks" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "Tying notes across voices" -msgstr "" - -#. @subheading in Documentation/learning/tweaks.itely -msgid "Simulating a fermata in MIDI" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Using variables for tweaks" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Style sheets" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Other sources of information" -msgstr "" - -#. @node in Documentation/learning/tweaks.itely -#. @subsection in Documentation/learning/tweaks.itely -msgid "Advanced tweaks with Scheme" -msgstr "" - -#. @node in Documentation/learning/templates.itely -#. @appendix in Documentation/learning/templates.itely -msgid "Templates" -msgstr "" - -#. @node in Documentation/learning/templates.itely -#. @appendixsec in Documentation/learning/templates.itely -msgid "Single staff" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Notes only" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Notes and lyrics" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Notes and chords" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Notes, lyrics, and chords." -msgstr "" - -#. @node in Documentation/learning/templates.itely -#. @appendixsec in Documentation/learning/templates.itely -msgid "Piano templates" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Solo piano" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Piano and melody with lyrics" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Piano centered lyrics" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Piano centered dynamics" -msgstr "" - -#. @node in Documentation/learning/templates.itely -#. @appendixsec in Documentation/learning/templates.itely -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "String quartet" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "String quartet parts" -msgstr "" - -#. @node in Documentation/learning/templates.itely -#. @appendixsec in Documentation/learning/templates.itely -msgid "Vocal ensembles" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "SATB vocal score" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "SATB vocal score and automatic piano reduction" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "SATB with aligned contexts" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "SATB on four staves" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Solo verse and two-part refrain" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Hymn tunes" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Psalms" -msgstr "" - -#. @node in Documentation/learning/templates.itely -#. @appendixsec in Documentation/learning/templates.itely -msgid "Orchestral templates" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Orchestra, choir and piano" -msgstr "" - -#. @node in Documentation/learning/templates.itely -#. @appendixsec in Documentation/learning/templates.itely -msgid "Ancient notation templates" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Transcription of mensural music" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Gregorian transcription template" -msgstr "" - -#. @node in Documentation/learning/templates.itely -#. @appendixsec in Documentation/learning/templates.itely -msgid "Other templates" -msgstr "" - -#. @appendixsubsec in Documentation/learning/templates.itely -msgid "Jazz combo" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @chapter in Documentation/music-glossary.tely -msgid "Musical terms A-Z" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/notation/changing-defaults.itely:454 (context id) -#. Documentation/notation/changing-defaults.itely:460 (context id) -#. Documentation/notation/changing-defaults.itely:468 (context id) -#. Documentation/notation/changing-defaults.itely:470 (context id) -msgid "A" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "a due" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "accelerando" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "accent" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "accessory" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "adagio" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "al niente" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "alla breve" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "allegro" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "alteration" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/snippets/jazz-combo-template.ly:130 (variable) -#. Documentation/snippets/satb-choir-template---four-staves.ly:86 (context id) -msgid "alto" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "alto clef" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "ancient minor scale" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "andante" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "arpeggio" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "ascending interval" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "augmentation" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "augmented interval" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "autograph" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/notation/changing-defaults.itely:455 (context id) -#. Documentation/notation/changing-defaults.itely:464 (context id) -#. Documentation/notation/changing-defaults.itely:469 (context id) -msgid "B" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "backfall" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "bar" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "bar line" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "baritone" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "baritone clef" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly:48 (variable) -#. Documentation/snippets/fretted-headword.ly:108 (variable) -#. Documentation/snippets/jazz-combo-template.ly:263 (variable) -#. Documentation/snippets/jazz-combo-template.ly:311 (context id) -#. Documentation/snippets/satb-choir-template---four-staves.ly:100 (context id) -msgid "bass" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "bass clef" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "beat" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "beat repeat" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "bind" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "bracket" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "brass" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "breath mark" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "breve" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "C" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "C clef" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "cadence" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "cadenza" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/snippets/breathing-signs.ly:39 (comment) -msgid "caesura" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "canon" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "cent" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "central C" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "chromatic scale" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "chromaticism" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "church mode" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "cluster" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "comma" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "common meter" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "Common Practice Period" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "common time" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "complement" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "compound interval" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "compound meter" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "compound time" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "concert pitch" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "conjunct movement" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "consonance" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "contralto" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "copying music" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "counterpoint" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "countertenor" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "cue-notes" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "custos" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "cut time" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "D" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "da capo" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "dal niente" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "dal segno" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "descending interval" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "diatonic scale" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "didymic comma" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "diminished interval" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "diminuendo" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "diminution" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "direct" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "disjunct movement" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "dissonance" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "dissonant interval" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "divisio" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "doit" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "dominant" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "dominant ninth chord" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "dominant seventh chord" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "dorian mode" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "dot (augmentation dot)" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "double appoggiatura" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "double bar line" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "double dotted note" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "double time signature" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "double trill" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "duple meter" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "duplet" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "E" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "ecclesiastical mode" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "eighth note" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "eighth rest" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "elision" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "embellishment" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "engraving" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "enharmonic" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "equal temperament" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "expression mark" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "F" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "F clef" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "fall" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "feathered beam" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "fermata" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "fifth" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "figured bass" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "flag" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "flageolet" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "forefall" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "forte" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "fourth" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "Frenched score" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "Frenched staff" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "Frenched staves" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "fugue" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "functional harmony" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "G" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "G clef" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "glissando" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "grand staff" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "grave" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "gruppetto" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "H" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "hairpin" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "half rest" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "harmonic cadence" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:53 (variable) -msgid "harmonics" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "harmony" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "hemiola" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "homophony" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "hook" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "hymn meter" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "inversion" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "inverted interval" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "just intonation" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "key" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "laissez vibrer" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "largo" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "leading note" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "ledger line" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "legato" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "legato curve" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "leger line" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "ligature" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "lilypond" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "line" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "loco" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "long appoggiatura" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "longa" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "lyric tie" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "major interval" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "maxima" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "meantone temperament" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "measure" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "measure repeat" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "mediant" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "melisma line" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "melodic cadence" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "mensural notation" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "mensuration sign" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "meter" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "metronome mark" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "metronomic indication" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "mezzo" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "mezzo-soprano" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "minor interval" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "mixolydian mode" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "mode" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "modulation" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "mordent" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "motif" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "motive" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "movement" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "multi-measure rest" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "neighbor tones" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "ninth" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "non-legato" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "note" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "note head" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "note names" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "octavation" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "octave mark" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "octave marking" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "octave sign" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "ornament" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/snippets/flamenco-notation.ly:187 (variable) -#. Documentation/snippets/flamenco-notation.ly:284 (context id) -msgid "part" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "pause" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "pennant" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "percent repeat" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "percussion" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "perfect interval" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "phrase" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "pickup" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "pizzicato" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "polymeter" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "polymetric" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "polymetric time signature" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "portato" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "power chord" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "presto" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "proportion" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "Pythagorean comma" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "quadruplet" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "quality" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "quarter rest" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "quarter tone" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "quintuplet" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "rallentando" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "relative key" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "repeat" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/snippets/creating-a-sequence-of-notes-on-various-pitches.ly:39 (variable) -#. Documentation/snippets/jazz-combo-template.ly:307 (context id) -msgid "rhythm" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "ritardando" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "ritenuto" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "scale degree" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "scordatura" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "score" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "second" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "semibreve" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "semitone" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "seventh" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sextolet" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sextuplet" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "shake" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "simile" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "simple meter" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sixteenth note" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sixteenth rest" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sixth" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sixty-fourth note" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sixty-fourth rest" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "slash repeat" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "solmization" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sonata" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sonata form" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "song texts" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/snippets/satb-choir-template---four-staves.ly:79 (context id) -msgid "soprano" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "staccato" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "staves" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "stem" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "stringendo" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "strings" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "strong beat" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "subdominant" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "submediant" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "subtonic" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sul G" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "superdominant" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "supertonic" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "symphony" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "syncopation" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "syntonic comma" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "temperament" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -#. Documentation/snippets/satb-choir-template---four-staves.ly:93 (context id) -msgid "tenor" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "tenth" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "tenuto" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "third" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "thirty-second note" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "thirty-second rest" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "thorough bass" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "time" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "tone" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "tonic" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "transposing instrument" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "treble clef" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "tremolo" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "triad" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "trill" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "triple meter" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "tritone" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "tuning fork" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "tuplet" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "turn" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "unison" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "upbeat" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "voice" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "volta" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "weak beat" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "whole rest" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "whole tone" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "woodwind" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @chapter in Documentation/music-glossary.tely -msgid "Duration names notes and rests" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @chapter in Documentation/music-glossary.tely -msgid "Non-Western terms A-Z" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "bayati" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "iraq" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "kurd" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "makam" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "makamlar" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "maqam" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "rast" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "semai" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "sikah" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @section in Documentation/music-glossary.tely -msgid "taqasim" -msgstr "" - -#. @node in Documentation/music-glossary.tely -#. @appendix in Documentation/music-glossary.tely -msgid "Literature used" -msgstr "" - -#. @node in Documentation/notation.tely -#. @appendix in Documentation/notation.tely -msgid "LilyPond grammar" -msgstr "" - -#. @node in Documentation/notation.tely -#. @appendix in Documentation/notation.tely -msgid "LilyPond command index" -msgstr "" - -#. @node in Documentation/notation/notation.itely -#. @chapter in Documentation/notation/notation.itely -msgid "Musical notation" -msgstr "" - -#. @node in Documentation/notation/specialist.itely -#. @chapter in Documentation/notation/specialist.itely -msgid "Specialist notation" -msgstr "" - -#. Documentation/notation/input.itely:598 (comment) -msgid "Do not display the tagline for this book" -msgstr "" - -#. Documentation/notation/input.itely:610 (comment) -#. Documentation/notation/input.itely:623 (comment) -msgid "Do not display the subtitle for this score" -msgstr "" - -#. Documentation/notation/input.itely:646 (comment) -msgid "The following fields are centered" -msgstr "" - -#. Documentation/notation/input.itely:653 (comment) -msgid "The following fields are left-aligned on the left side" -msgstr "" - -#. Documentation/notation/input.itely:657 (comment) -msgid "The following fields are right-aligned on the right side" -msgstr "" - -#. Documentation/notation/input.itely:665 (comment) -msgid "The following fields are placed at opposite ends of the same line" -msgstr "" - -#. Documentation/notation/input.itely:939 (comment) -#. Documentation/notation/input.itely:953 (comment) -msgid "User-defined field" -msgstr "" - -#. Documentation/notation/input.itely:1606 (variable) -msgid "allLyrics" -msgstr "" - -#. Documentation/notation/input.itely:1695 (variable) -#. Documentation/notation/input.itely:1714 (variable) -#. Documentation/notation/input.itely:1751 (variable) -#. Documentation/notation/input.itely:1766 (variable) -#. Documentation/notation/spacing.itely:1563 (variable) -#. Documentation/notation/spacing.itely:1617 (variable) -#. Documentation/notation/spacing.itely:1642 (variable) -#. Documentation/notation/changing-defaults.itely:459 (variable) -#. Documentation/notation/changing-defaults.itely:494 (context id) -#. Documentation/notation/changing-defaults.itely:544 (context id) -#. Documentation/snippets/automatically-change-durations.ly:23 (variable) -#. Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly:34 (variable) -#. Documentation/snippets/controlling-tuplet-bracket-visibility.ly:53 (variable) -#. Documentation/snippets/guitar-slides.ly:47 (variable) -#. Documentation/snippets/letter-tablature-formatting.ly:29 (variable) -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:163 (variable) -#. Documentation/snippets/transposing-pitches-with-minimum-accidentals-smart-transpose.ly:172 (variable) -#. Documentation/snippets/vertically-aligned-dynamics-and-textscripts.ly:71 (variable) -msgid "music" -msgstr "" - -#. Documentation/notation/input.itely:1792 (variable) -msgid "test" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @chapter in Documentation/notation/input.itely -msgid "General input and output" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @section in Documentation/notation/input.itely -msgid "Input structure" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Structure of a score" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Multiple scores in a book" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Multiple output files from one input file" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Output file names" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "File structure" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @section in Documentation/notation/input.itely -msgid "Titles and headers" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Creating titles headers and footers" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Title blocks explained" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Default layout of book and score title blocks" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Default layout of headers and footers" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Custom headers footers and titles" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Custom text formatting for title blocks" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Custom layout for title blocks" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Custom layout for headers and footers" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Creating footnotes" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Footnotes overview" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Automatic footnotes" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Manual footnotes" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Reference to page numbers" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Table of contents" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @section in Documentation/notation/input.itely -msgid "Working with input files" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Including LilyPond files" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Different editions from one source" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Using variables" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Using tags" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Using global settings" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Special characters" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Text encoding" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Unicode" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "ASCII aliases" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @section in Documentation/notation/input.itely -msgid "Controlling output" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Extracting fragments of music" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Skipping corrected music" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Alternative output formats" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Replacing the notation font" -msgstr "" - -#. @subsubheading in Documentation/notation/input.itely -msgid "Installation Instructions for MacOS" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @section in Documentation/notation/input.itely -msgid "MIDI output" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Creating MIDI files" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Instrument names" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "MIDI block" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "What goes into the MIDI output?" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Supported in MIDI" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Unsupported in MIDI" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Repeats in MIDI" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Controlling MIDI dynamics" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Dynamic marks" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Overall MIDI volume" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Equalizing different instruments (i)" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/input.itely -msgid "Equalizing different instruments (ii)" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Percussion in MIDI" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "The Articulate script" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @section in Documentation/notation/input.itely -msgid "Extracting musical information" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Displaying LilyPond notation" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Displaying scheme music expressions" -msgstr "" - -#. @node in Documentation/notation/input.itely -#. @subsection in Documentation/notation/input.itely -msgid "Saving music events to a file" -msgstr "" - -#. Documentation/notation/spacing.itely:2086 (comment) -msgid "The very low note here needs more room than 'basic-distance" -msgstr "" - -#. Documentation/notation/spacing.itely:2087 (comment) -msgid "can provide, so the distance between this staff and the next" -msgstr "" - -#. Documentation/notation/spacing.itely:2088 (comment) -msgid "is determined by 'padding." -msgstr "" - -#. Documentation/notation/spacing.itely:2091 (comment) -msgid "Here, 'basic-distance provides enough room, and there is no" -msgstr "" - -#. Documentation/notation/spacing.itely:2092 (comment) -msgid "need to compress the space (towards 'minimum-distance) to make" -msgstr "" - -#. Documentation/notation/spacing.itely:2093 (comment) -msgid "room for anything else on the page, so the distance between" -msgstr "" - -#. Documentation/notation/spacing.itely:2094 (comment) -msgid "this staff and the next is determined by 'basic-distance." -msgstr "" - -#. Documentation/notation/spacing.itely:2097 (comment) -msgid "By setting 'padding to a negative value, staves can be made to" -msgstr "" - -#. Documentation/notation/spacing.itely:2098 (comment) -msgid "collide. The lowest acceptable value for 'basic-distance is 0." -msgstr "" - -#. Documentation/notation/spacing.itely:2529 (comment) -msgid "this time the text will be closer to the staff" -msgstr "" - -#. Documentation/notation/spacing.itely:2531 (comment) -msgid "by setting outside-staff-priority to a non-number," -msgstr "" - -#. Documentation/notation/spacing.itely:2532 (comment) -msgid "we disable the automatic collision avoidance" -msgstr "" - -#. Documentation/notation/spacing.itely:2535 (comment) -msgid "now they will collide" -msgstr "" - -#. Documentation/notation/spacing.itely:2561 (comment) -msgid "the markup is too close to the following note" -msgstr "" - -#. Documentation/notation/spacing.itely:2565 (comment) -msgid "setting outside-staff-horizontal-padding fixes this" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @chapter in Documentation/notation/spacing.itely -msgid "Spacing issues" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @section in Documentation/notation/spacing.itely -msgid "Page layout" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "The \\\\paper block" -msgstr "" - -#. @subsection in Documentation/notation/spacing.itely -msgid "The @code{\\\\paper} block" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Paper size and automatic scaling" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "Setting paper size" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "Automatic scaling to paper size" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "Fixed vertical spacing \\\\paper variables" -msgstr "" - -#. @subsection in Documentation/notation/spacing.itely -msgid "Fixed vertical spacing @code{\\\\paper} variables" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "Flexible vertical spacing \\\\paper variables" -msgstr "" - -#. @subsection in Documentation/notation/spacing.itely -msgid "Flexible vertical spacing @code{\\\\paper} variables" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "Structure of flexible vertical spacing alists" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "List of flexible vertical spacing \\\\paper variables" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "List of flexible vertical spacing @code{\\\\paper} variables" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "Horizontal spacing \\\\paper variables" -msgstr "" - -#. @subsection in Documentation/notation/spacing.itely -msgid "Horizontal spacing @code{\\\\paper} variables" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "\\\\paper variables for widths and margins" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "@code{\\\\paper} variables for widths and margins" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "\\\\paper variables for two-sided mode" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "@code{\\\\paper} variables for two-sided mode" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "\\\\paper variables for shifts and indents" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "@code{\\\\paper} variables for shifts and indents" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "Other \\\\paper variables" -msgstr "" - -#. @subsection in Documentation/notation/spacing.itely -msgid "Other @code{\\\\paper} variables" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "\\\\paper variables for line breaking" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "@code{\\\\paper} variables for line breaking" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "\\\\paper variables for page breaking" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "@code{\\\\paper} variables for page breaking" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "\\\\paper variables for page numbering" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "@code{\\\\paper} variables for page numbering" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "Miscellaneous \\\\paper variables" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "Miscellaneous @code{\\\\paper} variables" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @section in Documentation/notation/spacing.itely -msgid "Score layout" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -msgid "The \\\\layout block" -msgstr "" - -#. @subsection in Documentation/notation/spacing.itely -msgid "The @code{\\\\layout} block" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Setting the staff size" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @section in Documentation/notation/spacing.itely -msgid "Breaks" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Line breaking" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Page breaking" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Optimal page breaking" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Optimal page turning" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Minimal page breaking" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Explicit breaks" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Using an extra voice for breaks" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @section in Documentation/notation/spacing.itely -msgid "Vertical spacing" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Flexible vertical spacing within systems" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "Within-system spacing properties" -msgstr "" - -#. @subsubheading in Documentation/notation/spacing.itely -msgid "Properties of the @code{VerticalAxisGroup} grob" -msgstr "" - -#. @subsubheading in Documentation/notation/spacing.itely -msgid "Properties of the @code{StaffGrouper} grob" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "Spacing of ungrouped staves" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "Spacing of grouped staves" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @unnumberedsubsubsec in Documentation/notation/spacing.itely -msgid "Spacing of non-staff lines" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Explicit staff and system positioning" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Vertical collision avoidance" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @section in Documentation/notation/spacing.itely -msgid "Horizontal spacing" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Horizontal spacing overview" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "New spacing area" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Changing horizontal spacing" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Line length" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Proportional notation" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @section in Documentation/notation/spacing.itely -msgid "Fitting music onto fewer pages" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Displaying spacing" -msgstr "" - -#. @node in Documentation/notation/spacing.itely -#. @subsection in Documentation/notation/spacing.itely -msgid "Changing spacing" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:450 (variable) -msgid "musicA" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:451 (variable) -msgid "musicB" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:452 (variable) -msgid "keepVoicesAlive" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:454 (comment) -msgid "Keep Voice \\\"A\\\" alive for 5 bars" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:455 (comment) -msgid "Keep Voice \\\"B\\\" alive for 5 bars" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:490 (variable) -#. Documentation/notation/changing-defaults.itely:501 (context id) -#. Documentation/notation/changing-defaults.itely:507 (context id) -#. Documentation/notation/changing-defaults.itely:509 (context id) -#. Documentation/notation/changing-defaults.itely:512 (context id) -#. Documentation/notation/changing-defaults.itely:534 (variable) -#. Documentation/notation/changing-defaults.itely:550 (context id) -msgid "accompaniment" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:491 (variable) -#. Documentation/notation/changing-defaults.itely:540 (variable) -#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:117 (variable) -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:75 (variable) -msgid "words" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:498 (comment) -msgid "Keep Voice \\\"melody\\\" alive for 4 bars" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:529 (comment) -#. Documentation/notation/changing-defaults.itely:531 (comment) -msgid "skip a bar" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:731 (variable) -msgid "blubb" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:737 (variable) -msgid "bla" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2038 (comment) -msgid "default space between staves" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2044 (comment) -msgid "reduced space between staves" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2046 (comment) -msgid "this is the nested declaration" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2473 (comment) -msgid "increase the length of the tie" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2482 (comment) -msgid "increase the length of the rest bar" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2490 (comment) -msgid "increase the length of the hairpin" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2518 (comment) -msgid "default" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2521 (comment) -#. Documentation/notation/changing-defaults.itely:2534 (comment) -msgid "not effective alone" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2525 (comment) -#. Documentation/notation/changing-defaults.itely:2538 (comment) -msgid "effective only when both overrides are present" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2915 (comment) -msgid "Remove bar line at the end of the current line" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:2961 (comment) -msgid "Try to remove all key signatures" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3384 (comment) -msgid "move horizontally left" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3386 (comment) -msgid "move vertically up" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3387 (comment) -msgid "third finger" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3435 (comment) -#. Documentation/notation/changing-defaults.itely:3474 (comment) -msgid "The rehearsal mark will be centered above the Clef" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3441 (comment) -msgid "The rehearsal mark will be centered above the Time Signature" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3448 (comment) -msgid "The rehearsal mark will be centered above the Breath Mark" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3468 (comment) -msgid "The rehearsal mark will be centered above the Key Signature" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3481 (comment) -msgid "The rehearsal mark will be centered above the Bar Line" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3496 (comment) -msgid "The RehearsalMark will be centered above the Key Signature" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3503 (comment) -#. Documentation/notation/changing-defaults.itely:3519 (comment) -#. Documentation/notation/changing-defaults.itely:3526 (comment) -msgid "" -"The RehearsalMark will be aligned with the left edge of the Key Signature" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3508 (comment) -msgid "" -"The RehearsalMark will be aligned with the right edge of the Key Signature" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3520 (comment) -msgid "and then shifted right by 3.5 staff-spaces" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3527 (comment) -msgid "and then shifted left by 2 staff-spaces" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3575 (variable) -msgid "XinO" -msgstr "" - -#. Documentation/notation/changing-defaults.itely:3821 (variable) -msgid "custosNote" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @chapter in Documentation/notation/changing-defaults.itely -msgid "Changing defaults" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @section in Documentation/notation/changing-defaults.itely -msgid "Interpretation contexts" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Score - the master of all contexts" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Top-level contexts - staff containers" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Intermediate-level contexts - staves" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Bottom-level contexts - voices" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Keeping contexts alive" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Modifying context plug-ins" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Changing context default settings" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Defining new contexts" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Context layout order" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @section in Documentation/notation/changing-defaults.itely -msgid "Explaining the Internals Reference" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Navigating the program reference" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Layout interfaces" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Determining the grob property" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Naming conventions" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @section in Documentation/notation/changing-defaults.itely -msgid "Modifying properties" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Overview of modifying properties" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -msgid "The set command" -msgstr "" - -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "The @code{@bs{}set} command" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -msgid "The override command" -msgstr "" - -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "The @code{\\\\override} command" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -msgid "The tweak command" -msgstr "" - -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "The @code{\\\\tweak} command" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -msgid "set versus override" -msgstr "" - -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "@code{\\\\set} vs. @code{\\\\override}" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Modifying alists" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @section in Documentation/notation/changing-defaults.itely -msgid "Useful concepts and properties" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Input modes" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Direction and placement" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Distances and measurements" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Staff symbol properties" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Spanners" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Using the @code{spanner-interface}" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Using the @code{line-spanner-interface}" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Visibility of objects" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Removing the stencil" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Making objects transparent" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Painting objects white" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Using break-visibility" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Special considerations" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Line styles" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Rotating objects" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Rotating layout objects" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Rotating markup" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @section in Documentation/notation/changing-defaults.itely -msgid "Advanced tweaks" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Aligning objects" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -msgid "Setting X-offset and Y-offset directly" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Setting @code{X-offset} and @code{Y-offset} directly" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -msgid "Using the side-position-interface" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Using the @code{side-position-interface}" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -msgid "Using the self-alignment-interface" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Using the @code{self-alignment-interface}" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Using the @code{aligned-on-parent} procedures" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Using the @code{centered-on-parent} procedures" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -msgid "Using the break-alignable-interface" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Using the @code{break-alignable-interface}" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Vertical grouping of grobs" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Modifying stencils" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Modifying shapes" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @unnumberedsubsubsec in Documentation/notation/changing-defaults.itely -msgid "Modifying ties and slurs" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @section in Documentation/notation/changing-defaults.itely -msgid "Using music functions" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Substitution function syntax" -msgstr "" - -#. @node in Documentation/notation/changing-defaults.itely -#. @subsection in Documentation/notation/changing-defaults.itely -msgid "Substitution function examples" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendix in Documentation/notation/notation-appendices.itely -msgid "Notation manual tables" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Chord name chart" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Common chord modifiers" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Predefined string tunings" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Predefined fretboard diagrams" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "MIDI instruments" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "List of colors" -msgstr "" - -#. @subsubheading in Documentation/notation/notation-appendices.itely -msgid "Normal colors" -msgstr "" - -#. @subsubheading in Documentation/notation/notation-appendices.itely -msgid "X color names" -msgstr "" - -#. @subsubheading in Documentation/notation/notation-appendices.itely -msgid "Color Names without a numerical suffix:" -msgstr "" - -#. @subsubheading in Documentation/notation/notation-appendices.itely -msgid "Color names with a numerical suffix" -msgstr "" - -#. @subsubheading in Documentation/notation/notation-appendices.itely -msgid "Grey Scale" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "The Feta font" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Clef glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Time Signature glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Number glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Accidental glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Default Notehead glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Special Notehead glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Shape-note Notehead glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Rest glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Flag glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Dot glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Dynamic glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Script glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Arrowhead glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Bracket-tip glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Pedal glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Accordion glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Tie glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Vaticana glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Medicaea glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Hufnagel glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Mensural glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Neomensural glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Petrucci glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Solesmes glyphs" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Note head styles" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Text markup commands" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Text markup list commands" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "List of special characters" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "List of articulations" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Articulation scripts" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Ornament scripts" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Fermata scripts" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Instrument-specific scripts" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Repeat sign scripts" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "Ancient scripts" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Percussion notes" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Technical glossary" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "alist" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "callback" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "closure" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "glyph" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "grob" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "immutable" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "interface" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "lexer" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "mutable" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "output-def" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "parser" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "parser variable" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "prob" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "simple closure" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @unnumberedsubsec in Documentation/notation/notation-appendices.itely -msgid "smob" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "All context properties" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Layout properties" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Available music functions" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Context modification identifiers" -msgstr "" - -#. @node in Documentation/notation/notation-appendices.itely -#. @appendixsec in Documentation/notation/notation-appendices.itely -msgid "Predefined type predicates" -msgstr "" - -#. @node in Documentation/notation/cheatsheet.itely -#. @appendix in Documentation/notation/cheatsheet.itely -msgid "Cheat sheet" -msgstr "" - -#. @unnumberedsec in Documentation/snippets.tely -msgid "\\\\TEXT\\\\" -msgstr "" - -#. @node in Documentation/snippets.tely -msgid "\\\\PRE\\\\: \\\\\\\\TEXT\\\\\\\\" -msgstr "" - -#. @unnumberedsec in Documentation/snippets.tely -msgid "\\\\\\\\TEXT\\\\\\\\" -msgstr "" - -#. @node in Documentation/usage/running.itely -msgid "Running lilypond" -msgstr "" - -#. @chapter in Documentation/usage/running.itely -msgid "Running @command{lilypond}" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @section in Documentation/usage/running.itely -msgid "Normal usage" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @section in Documentation/usage/running.itely -msgid "Command-line usage" -msgstr "" - -#. @node in Documentation/usage/running.itely -msgid "Invoking lilypond" -msgstr "" - -#. @unnumberedsubsec in Documentation/usage/running.itely -msgid "Invoking @command{lilypond}" -msgstr "" - -#. @unnumberedsubsubsec in Documentation/usage/running.itely -msgid "Standard shell commands" -msgstr "" - -#. @node in Documentation/usage/running.itely -msgid "Command line options for lilypond" -msgstr "" - -#. @unnumberedsubsec in Documentation/usage/running.itely -msgid "Command line options for @command{lilypond}" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @unnumberedsubsec in Documentation/usage/running.itely -msgid "Environment variables" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @unnumberedsubsec in Documentation/usage/running.itely -msgid "LilyPond in chroot jail" -msgstr "" - -#. @subheading in Documentation/usage/running.itely -msgid "Example script for 32-bit Ubuntu 8.04" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @section in Documentation/usage/running.itely -msgid "Error messages" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @section in Documentation/usage/running.itely -msgid "Common errors" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @unnumberedsubsec in Documentation/usage/running.itely -msgid "Music runs off the page" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @unnumberedsubsec in Documentation/usage/running.itely -msgid "An extra staff appears" -msgstr "" - -#. @node in Documentation/usage/running.itely -msgid "Apparent error in ../ly/init.ly" -msgstr "" - -#. @unnumberedsubsec in Documentation/usage/running.itely -msgid "Apparent error in @code{../ly/init.ly}" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @unnumberedsubsec in Documentation/usage/running.itely -msgid "Error message Unbound variable %" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @unnumberedsubsec in Documentation/usage/running.itely -msgid "Error message FT_Get_Glyph_Name" -msgstr "" - -#. @node in Documentation/usage/running.itely -#. @unnumberedsubsec in Documentation/usage/running.itely -msgid "Warning staff affinities should only decrease" -msgstr "" - -#. @node in Documentation/usage/updating.itely -msgid "Updating files with convert-ly" -msgstr "" - -#. @chapter in Documentation/usage/updating.itely -msgid "Updating files with @command{convert-ly}" -msgstr "" - -#. @node in Documentation/usage/updating.itely -#. @section in Documentation/usage/updating.itely -msgid "Why does the syntax change?" -msgstr "" - -#. @node in Documentation/usage/updating.itely -msgid "Invoking convert-ly" -msgstr "" - -#. @section in Documentation/usage/updating.itely -msgid "Invoking @command{convert-ly}" -msgstr "" - -#. @node in Documentation/usage/updating.itely -msgid "Command line options for convert-ly" -msgstr "" - -#. @section in Documentation/usage/updating.itely -msgid "Command line options for @command{convert-ly}" -msgstr "" - -#. @node in Documentation/usage/updating.itely -msgid "Problems running convert-ly" -msgstr "" - -#. @section in Documentation/usage/updating.itely -msgid "Problems running @code{convert-ly}" -msgstr "" - -#. @node in Documentation/usage/updating.itely -#. @section in Documentation/usage/updating.itely -msgid "Manual conversions" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -msgid "lilypond-book" -msgstr "" - -#. @chapter in Documentation/usage/lilypond-book.itely -msgid "Running @command{lilypond-book}" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -#. @section in Documentation/usage/lilypond-book.itely -msgid "An example of a musicological document" -msgstr "" - -#. @subheading in Documentation/usage/lilypond-book.itely -msgid "Input" -msgstr "" - -#. @subheading in Documentation/usage/lilypond-book.itely -msgid "Processing" -msgstr "" - -#. @subheading in Documentation/usage/lilypond-book.itely -msgid "Output" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -#. @section in Documentation/usage/lilypond-book.itely -msgid "Integrating music and text" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -#. @subsection in Documentation/usage/lilypond-book.itely -msgid "LaTeX" -msgstr "" - -#. @subsection in Documentation/usage/lilypond-book.itely -#. @subsubheading in Documentation/usage/lilypond-book.itely -msgid "@LaTeX{}" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -#. @subsection in Documentation/usage/lilypond-book.itely -#. @subsubheading in Documentation/usage/lilypond-book.itely -#. @subsection in Documentation/usage/lilypond-book.itely -msgid "Texinfo" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -#. @subsection in Documentation/usage/lilypond-book.itely -msgid "HTML" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -#. @subsection in Documentation/usage/lilypond-book.itely -msgid "DocBook" -msgstr "" - -#. @subheading in Documentation/usage/lilypond-book.itely -msgid "Common conventions" -msgstr "" - -#. @subheading in Documentation/usage/lilypond-book.itely -msgid "Including a LilyPond file" -msgstr "" - -#. @subheading in Documentation/usage/lilypond-book.itely -msgid "Including LilyPond code" -msgstr "" - -#. @subheading in Documentation/usage/lilypond-book.itely -msgid "Processing the DocBook document" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -#. @section in Documentation/usage/lilypond-book.itely -msgid "Music fragment options" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -msgid "Invoking lilypond-book" -msgstr "" - -#. @section in Documentation/usage/lilypond-book.itely -msgid "Invoking @command{lilypond-book}" -msgstr "" - -#. @subheading in Documentation/usage/lilypond-book.itely -msgid "Format-specific instructions" -msgstr "" - -#. @subheading in Documentation/usage/lilypond-book.itely -msgid "Command line options" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -#. @section in Documentation/usage/lilypond-book.itely -msgid "Filename extensions" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -#. @section in Documentation/usage/lilypond-book.itely -msgid "lilypond-book templates" -msgstr "" - -#. @subsection in Documentation/usage/lilypond-book.itely -msgid "html" -msgstr "" - -#. @subsection in Documentation/usage/lilypond-book.itely -msgid "xelatex" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -#. @section in Documentation/usage/lilypond-book.itely -msgid "Sharing the table of contents" -msgstr "" - -#. @subsubheading in Documentation/usage/lilypond-book.itely -msgid "Exporting the ToC from LilyPond" -msgstr "" - -#. @subsubheading in Documentation/usage/lilypond-book.itely -msgid "Importing the ToC into LaTeX" -msgstr "" - -#. @node in Documentation/usage/lilypond-book.itely -msgid "Alternate methods of mixing text and music" -msgstr "" - -#. @section in Documentation/usage/lilypond-book.itely -msgid "Alternative methods of mixing text and music" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @chapter in Documentation/usage/external.itely -msgid "External programs" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @section in Documentation/usage/external.itely -msgid "Point and click" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @unnumberedsubsec in Documentation/usage/external.itely -msgid "Enabling point and click" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @unnumberedsubsec in Documentation/usage/external.itely -msgid "Selective point-and-click" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @section in Documentation/usage/external.itely -msgid "Text editor support" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @unnumberedsubsec in Documentation/usage/external.itely -msgid "Emacs mode" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @unnumberedsubsec in Documentation/usage/external.itely -msgid "Vim mode" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @unnumberedsubsec in Documentation/usage/external.itely -msgid "Other editors" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @section in Documentation/usage/external.itely -msgid "Converting from other formats" -msgstr "" - -#. @node in Documentation/usage/external.itely -msgid "Invoking midi2ly" -msgstr "" - -#. @subsection in Documentation/usage/external.itely -msgid "Invoking @command{midi2ly}" -msgstr "" - -#. @node in Documentation/usage/external.itely -msgid "Invoking musicxml2ly" -msgstr "" - -#. @subsection in Documentation/usage/external.itely -msgid "Invoking @code{musicxml2ly}" -msgstr "" - -#. @node in Documentation/usage/external.itely -msgid "Invoking abc2ly" -msgstr "" - -#. @subsection in Documentation/usage/external.itely -msgid "Invoking @code{abc2ly}" -msgstr "" - -#. @node in Documentation/usage/external.itely -msgid "Invoking etf2ly" -msgstr "" - -#. @subsection in Documentation/usage/external.itely -msgid "Invoking @command{etf2ly}" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @subsection in Documentation/usage/external.itely -msgid "Other formats" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @section in Documentation/usage/external.itely -msgid "LilyPond output in other programs" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @unnumberedsubsec in Documentation/usage/external.itely -msgid "Many quotes from a large score" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @unnumberedsubsec in Documentation/usage/external.itely -msgid "Inserting LilyPond output into OpenOffice.org" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @unnumberedsubsec in Documentation/usage/external.itely -msgid "Inserting LilyPond output into other programs" -msgstr "" - -#. @node in Documentation/usage/external.itely -msgid "Independent includes" -msgstr "" - -#. @section in Documentation/usage/external.itely -msgid "Independent @code{include}s" -msgstr "" - -#. @node in Documentation/usage/external.itely -#. @subsection in Documentation/usage/external.itely -msgid "MIDI articulation" -msgstr "" - -#. @node in Documentation/usage/suggestions.itely -#. @chapter in Documentation/usage/suggestions.itely -msgid "Suggestions for writing files" -msgstr "" - -#. @node in Documentation/usage/suggestions.itely -#. @section in Documentation/usage/suggestions.itely -msgid "General suggestions" -msgstr "" - -#. @node in Documentation/usage/suggestions.itely -#. @section in Documentation/usage/suggestions.itely -msgid "Typesetting existing music" -msgstr "" - -#. @node in Documentation/usage/suggestions.itely -#. @section in Documentation/usage/suggestions.itely -msgid "Large projects" -msgstr "" - -#. @node in Documentation/usage/suggestions.itely -#. @section in Documentation/usage/suggestions.itely -msgid "Troubleshooting" -msgstr "" - -#. @node in Documentation/usage/suggestions.itely -#. @section in Documentation/usage/suggestions.itely -msgid "Make and Makefiles" -msgstr "" - -#. @node in Documentation/cs/learning.tely -#. @appendix in Documentation/cs/learning.tely -msgid "Rejstřík k LilyPondu" -msgstr "" - -#. @top in Documentation/cs/macros.itexi -msgid "LilyPond -- \\\\TITLE\\\\" -msgstr "" - -#. @subsubheading in Documentation/cs/macros.itexi -msgid "Předem stanovené příkazy" -msgstr "" - -#. @subsubheading in Documentation/cs/macros.itexi -msgid "Vybrané úryvky" -msgstr "" - -#. @subsubheading in Documentation/cs/macros.itexi -msgid "Podívejte se také na" -msgstr "" - -#. @subsubheading in Documentation/cs/macros.itexi -msgid "Známé potíže a upozornění" -msgstr "" - -#. Documentation/cs/learning/tutorial.itely:250 (comment) -msgid "Počáteční bod napsat na jednočárkovaném C" -msgstr "" - -#. Documentation/cs/learning/tutorial.itely:284 (comment) -msgid "dvoučárkované C" -msgstr "" - -#. Documentation/cs/learning/tutorial.itely:301 (comment) -msgid "c je 1 řádek nahoru, tedy c nad b" -msgstr "" - -#. Documentation/cs/learning/tutorial.itely:302 (comment) -msgid "d je 2 řádky nahoru, nebo 5 dolů, tedy d nad b" -msgstr "" - -#. Documentation/cs/learning/tutorial.itely:303 (comment) -msgid "e je 3 nahoru, nebo 4 dolů, tedy e pod b" -msgstr "" - -#. Documentation/cs/learning/tutorial.itely:304 (comment) -msgid "a je 6 nahoru, nebo 1 dolů, tedy a pod b" -msgstr "" - -#. Documentation/cs/learning/tutorial.itely:305 (comment) -msgid "g je 5 nahoru, nebo 2 dolů, tedy g pod b" -msgstr "" - -#. Documentation/cs/learning/tutorial.itely:306 (comment) -msgid "f je 4 nahoru, nebo 3 dolů, tedy f pod b" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @chapter in Documentation/cs/learning/tutorial.itely -msgid "Cvičení" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Přeložení zdrojového souboru" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Zadání not" -msgstr "" - -#. @subheading in Documentation/cs/learning/tutorial.itely -msgid "Pohled na výsledky" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Příkazový řádek" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @section in Documentation/cs/learning/tutorial.itely -msgid "Jak se píší vstupní soubory" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Jednoduchý notový zápis" -msgstr "" - -#. @subheading in Documentation/cs/learning/tutorial.itely -msgid "Výšky tónů" -msgstr "" - -#. @subheading in Documentation/cs/learning/tutorial.itely -msgid "Délky tónů (rytmy)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tutorial.itely -msgid "Pomlky" -msgstr "" - -#. @subheading in Documentation/cs/learning/tutorial.itely -msgid "Taktové označení" -msgstr "" - -#. @subheading in Documentation/cs/learning/tutorial.itely -msgid "Vyznačení tempa" -msgstr "" - -#. @subheading in Documentation/cs/learning/tutorial.itely -msgid "Notový klíč" -msgstr "" - -#. @subheading in Documentation/cs/learning/tutorial.itely -msgid "Vše dohromady" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Práce na vstupních souborech" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @section in Documentation/cs/learning/tutorial.itely -msgid "Vypořádání se s chybami" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Obecné rady k řešení chyb" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Některé časté chyby" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @section in Documentation/cs/learning/tutorial.itely -msgid "Jak číst příručky" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Vypuštěný materiál" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Klepnutelné příklady" -msgstr "" - -#. @node in Documentation/cs/learning/tutorial.itely -#. @subsection in Documentation/cs/learning/tutorial.itely -msgid "Přehled o příručkách" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @chapter in Documentation/cs/learning/common-notation.itely -msgid "Běžný notový zápis" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @section in Documentation/cs/learning/common-notation.itely -msgid "Notový zápis v jedné notové osnově" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Přezkoušení taktů" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Předznamenání a označení tóniny (předznamenání)" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Předznamenání" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Označení tóniny (předznamenání)" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Varování: označení tóniny a výšky tónů" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Ligatury a legatové obloučky" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Ligatury" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Legatové obloučky" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Frázovací obloučky" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Varování: ligatury nejsou legatovými obloučky" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Artikulační znaménka a hlasitost" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Artikulační znaménka" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Prstoklad" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Dynamika" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Přidání textu" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Automatické a ruční trámce" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Dodatečné rytmické příkazy" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Předtaktí" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Jiná rytmická rozdělení" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Ozdoby" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @section in Documentation/cs/learning/common-notation.itely -msgid "Více not najednou" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Vysvětlení hudebních výrazů" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Obdoba: matematické výrazy" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Souběžné hudební výrazy: více notových osnov" -msgstr "" - -#. @subheading in Documentation/cs/learning/common-notation.itely -msgid "Souběžné hudební výrazy: jedna notová osnova" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Více notových osnov" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Seskupení notových osnov" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Spojení not do akordů" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Vícehlasost v jedné notové osnově" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @section in Documentation/cs/learning/common-notation.itely -msgid "Písničky" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Zápis jednoduchých písní" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Vyrovnání textu s melodií" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Text pro více osnov" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @section in Documentation/cs/learning/common-notation.itely -msgid "Poslední úpravy" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Pořádání děl pomocí proměnných" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Přidání názvu" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Absolutní označení not" -msgstr "" - -#. @node in Documentation/cs/learning/common-notation.itely -#. @subsection in Documentation/cs/learning/common-notation.itely -msgid "Po cvičení" -msgstr "" - -#. Documentation/cs/learning/fundamental.itely:3177 (comment) -msgid "set time signature and key" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @chapter in Documentation/cs/learning/fundamental.itely -msgid "Základní pojmy" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @section in Documentation/cs/learning/fundamental.itely -msgid "Jak pracují vstupní soubory LilyPondu" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Uvedení do stavby souboru v LilyPondu" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Notový zápis je jedním (jediným) složeným hudebním výrazem" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Naskládání hudebních výrazů do sebe" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "O ne-naskládatelnosti závorek a ligatur" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @section in Documentation/cs/learning/fundamental.itely -msgid "Hlasy obsahují noty" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Slyším hlasy" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Přímo vyjádřené začátky hlasů" -msgstr "" - -#. @subsubheading in Documentation/cs/learning/fundamental.itely -msgid "Notenkolumnen" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Hlasy a zpěvy" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @section in Documentation/cs/learning/fundamental.itely -msgid "Prostředí a rytci" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Vysvětlení prostředí" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Vytvoření prostředí" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Vysvětlení rytců" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Změna vlastností prostředí" -msgstr "" - -#. @subsubheading in Documentation/cs/learning/fundamental.itely -msgid "Kontexteigenschaften mit @code{\\\\with} setzen" -msgstr "" - -#. @subsubheading in Documentation/cs/learning/fundamental.itely -msgid "Kontexteigenschaften mit @code{\\\\context} setzen" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Přidání a odstranění rytců" -msgstr "" - -#. @subsubheading in Documentation/cs/learning/fundamental.itely -msgid "Einen einzelnen Kontext verändern" -msgstr "" - -#. @subsubheading in Documentation/cs/learning/fundamental.itely -msgid "Alle Kontexte des gleichen Typs verändern" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @section in Documentation/cs/learning/fundamental.itely -msgid "Rozšíření příkladů" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Soprán a violoncello" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Čtyřhlasý notový zápis SATB" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Vytvoření notového zápisu od základu" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Úspora psaní na stroji pomocí proměnných a funkcí" -msgstr "" - -#. @node in Documentation/cs/learning/fundamental.itely -#. @subsection in Documentation/cs/learning/fundamental.itely -msgid "Notové zápisy a hlasy" -msgstr "" - -#. Documentation/cs/learning/tweaks.itely:3626 (comment) -#. Documentation/cs/learning/tweaks.itely:3699 (comment) -msgid "Move the c2 out of the main note column so the merge will work" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @chapter in Documentation/cs/learning/tweaks.itely -msgid "Ladění výstupu" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @section in Documentation/cs/learning/tweaks.itely -msgid "Základy pro ladění" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Úvod do ladění" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Předměty a rozhraní" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Pravidla pro pojmenovávání předmětů a vlastností" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Postupy při ladění" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @section in Documentation/cs/learning/tweaks.itely -msgid "Vnitřní referenční příručka" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Vlastnosti předmětů v rozvržení" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "Den Kontext finden" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "Nur einmal mit \\\\override verändern" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "Rückgängig machen" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Vlastnosti nacházející se v rozhraních" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "Den Kontext im Liedtextmodus bestimmen" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Typy vlastností" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @section in Documentation/cs/learning/tweaks.itely -msgid "Vzhled předmětů" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Viditelnost a barva předmětů" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "stencil (Matrize)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "break-visibility (unsichtbar machen)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "transparent (durchsichtig)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "color (Farbe)" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Velikost předmětů" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Délka a tloušťka předmětů" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @section in Documentation/cs/learning/tweaks.itely -msgid "Umístění předmětů" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Automatické chování" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Předměty uvnitř notové osnovy" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "Fingersatz" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Předměty vně notové osnovy" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "\\\\textLengthOn (Textlänge berücksichtigen)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "Dynamik" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "Verändern der Größe von grobs" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @section in Documentation/cs/learning/tweaks.itely -msgid "Střety předmětů" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Přesouvání předmětů" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Oprava překrývajících se not" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "padding (Fülleigenschafte)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "right-padding (Verschieben nach links)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "staff-padding (Systemfüllungseigenschaft)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "self-alignment-X (Selbstausrichtung-X-Eigenschaft)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "staff-position (Position innerhalb des Systems)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "extra-offset (Genaues Positionieren)" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "Ausrichtungseigenschaft" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "force-hshift (vertikale Verschiebunseigenschaft)" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Příklady ze života" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @section in Documentation/cs/learning/tweaks.itely -msgid "Další ladění" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Jiné využití ladění" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "Noten zwischen unterschiedlichen Stimmen überbinden" -msgstr "" - -#. @subheading in Documentation/cs/learning/tweaks.itely -msgid "Eine Fermate in MIDI simulieren" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Použití proměnných pro ladění" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Celkové formátování" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Více informací" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Vyhnutí se ladění s pomalejším překladem" -msgstr "" - -#. @node in Documentation/cs/learning/tweaks.itely -#. @subsection in Documentation/cs/learning/tweaks.itely -msgid "Pokročilá ladění se Scheme" -msgstr "" - -#. @node in Documentation/cs/learning/templates.itely -#. @appendix in Documentation/cs/learning/templates.itely -msgid "Předlohy" -msgstr "" - -#. @node in Documentation/cs/learning/templates.itely -#. @appendixsec in Documentation/cs/learning/templates.itely -msgid "Jednotlivá notová osnova" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Pouze noty" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Noty a text" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Noty a názvy akordů" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Noty, text a názvy akordů" -msgstr "" - -#. @node in Documentation/cs/learning/templates.itely -#. @appendixsec in Documentation/cs/learning/templates.itely -msgid "Klavírní předlohy" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Klavírní sólo" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Klavír a hlas zpěvu" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Klavír s vystředěným textem" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Klavír s vystředěným označením hlasitosti" -msgstr "" - -#. @node in Documentation/cs/learning/templates.itely -#. @appendixsec in Documentation/cs/learning/templates.itely -msgid "Smyčcový kvartet" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Jednoduchá smyčcový kvartet" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Hlasy smyčcového kvartetu" -msgstr "" - -#. @node in Documentation/cs/learning/templates.itely -#. @appendixsec in Documentation/cs/learning/templates.itely -msgid "Vokální soubor" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Notový zápis SATB" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Notový zápis SATB a automatický klavírní výtah" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "SATB s příslušnými prostředími" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Sólový zpěv a dvojhlasný refrén" -msgstr "" - -#. @node in Documentation/cs/learning/templates.itely -#. @appendixsec in Documentation/cs/learning/templates.itely -msgid "Orchestrální předloha" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Orchestr, sbor a klavír" -msgstr "" - -#. @node in Documentation/cs/learning/templates.itely -#. @appendixsec in Documentation/cs/learning/templates.itely -msgid "Předlohy pro starý notový zápis" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Přepis menzurální hudby" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Předlohy pro přepis gregorianik" -msgstr "" - -#. @node in Documentation/cs/learning/templates.itely -#. @appendixsec in Documentation/cs/learning/templates.itely -msgid "Jiné předlohy" -msgstr "" - -#. @appendixsubsec in Documentation/cs/learning/templates.itely -msgid "Džezová skupina" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:41 (variable) -msgid "discant" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:44 (variable) -#. Documentation/snippets/anglican-psalm-template.ly:88 (variable) -msgid "dot" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:50 (comment) -msgid "16 voets register" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:51 (variable) -msgid "accBasson" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:57 (comment) -msgid "een korig 8 en 16 voets register" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:58 (variable) -msgid "accBandon" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:66 (variable) -msgid "accVCello" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:76 (comment) -msgid "4-8-16 voets register" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:77 (variable) -msgid "accHarmon" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:87 (variable) -msgid "accTrombon" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:99 (comment) -msgid "eenkorig 4 en 16 voets register" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:100 (variable) -msgid "accOrgan" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:108 (variable) -msgid "accMaster" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:122 (variable) -msgid "accAccord" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:134 (variable) -msgid "accMusette" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:144 (variable) -msgid "accCeleste" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:152 (variable) -msgid "accOboe" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:160 (variable) -msgid "accClarin" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:166 (variable) -msgid "accPiccolo" -msgstr "" - -#. Documentation/snippets/accordion-discant-symbols.ly:172 (variable) -msgid "accViolin" -msgstr "" - -#. Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly:53 (variable) -msgid "continuo" -msgstr "" - -#. Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly:65 (context id) -#. Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly:66 (context id) -msgid "bassStaff" -msgstr "" - -#. Documentation/snippets/adding-drum-parts.ly:52 (variable) -msgid "drh" -msgstr "" - -#. Documentation/snippets/adding-drum-parts.ly:53 (variable) -msgid "drl" -msgstr "" - -#. Documentation/snippets/adding-drum-parts.ly:54 (variable) -msgid "timb" -msgstr "" - -#. Documentation/snippets/adding-fingerings-to-tablatures.ly:38 (variable) -#. Documentation/snippets/jazz-combo-template.ly:237 (context id) -#. Documentation/snippets/jazz-combo-template.ly:246 (context id) -msgid "two" -msgstr "" - -#. Documentation/snippets/adding-fingerings-to-tablatures.ly:39 (variable) -msgid "threeTwo" -msgstr "" - -#. Documentation/snippets/adding-fingerings-to-tablatures.ly:46 (variable) -msgid "threeFour" -msgstr "" - -#. Documentation/snippets/adding-indicators-to-staves-which-get-split-after-a-break.ly:39 (variable) -msgid "splitStaffBarLineMarkup" -msgstr "" - -#. Documentation/snippets/adding-indicators-to-staves-which-get-split-after-a-break.ly:45 (variable) -msgid "splitStaffBarLine" -msgstr "" - -#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:91 (variable) -msgid "cueWhile" -msgstr "" - -#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:104 (variable) -msgid "flute" -msgstr "" - -#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:110 (variable) -msgid "clarinet" -msgstr "" - -#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:119 (variable) -msgid "pianoRH" -msgstr "" - -#. Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly:124 (variable) -msgid "pianoLH" -msgstr "" - -#. Documentation/snippets/adding-the-current-date-to-a-score.ly:35 (comment) -msgid "first, define a variable to hold the formatted date:" -msgstr "" - -#. Documentation/snippets/adding-the-current-date-to-a-score.ly:36 (variable) -msgid "date" -msgstr "" - -#. Documentation/snippets/adding-the-current-date-to-a-score.ly:36 (comment) -msgid "d-%m-%Y\\\" (localtime (current-time)))" -msgstr "" - -#. Documentation/snippets/adding-the-current-date-to-a-score.ly:38 (comment) -msgid "use it in the title block:" -msgstr "" - -#. Documentation/snippets/adding-the-current-date-to-a-score.ly:49 (comment) -msgid "and use it in a \\markup block:" -msgstr "" - -#. Documentation/snippets/additional-voices-to-avoid-collisions.ly:54 (variable) -msgid "voiceFive" -msgstr "" - -#. Documentation/snippets/adjusting-grace-note-spacing.ly:29 (variable) -msgid "graceNotes" -msgstr "" - -#. Documentation/snippets/adjusting-lyrics-vertical-spacing.ly:38 (comment) -msgid "Default layout:" -msgstr "" - -#. Documentation/snippets/adjusting-lyrics-vertical-spacing.ly:47 (comment) -msgid "Reducing the minimum space below the staff and above the lyrics:" -msgstr "" - -#. Documentation/snippets/aligning-bar-numbers.ly:64 (comment) -#. Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly:50 (comment) -msgid "Increase the size of the bar number by 2" -msgstr "" - -#. Documentation/snippets/aligning-bar-numbers.ly:66 (comment) -#. Documentation/snippets/printing-bar-numbers-at-regular-intervals.ly:62 (comment) -msgid "Print a bar number every second measure" -msgstr "" - -#. Documentation/snippets/aligning-bar-numbers.ly:69 (comment) -msgid "Center-align bar numbers" -msgstr "" - -#. Documentation/snippets/aligning-bar-numbers.ly:72 (comment) -msgid "Left-align bar numbers" -msgstr "" - -#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:89 (comment) -msgid "the RehearsalMark will be centered above the Clef" -msgstr "" - -#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:96 (comment) -msgid "the RehearsalMark will be centered above the TimeSignature" -msgstr "" - -#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:104 (comment) -msgid "the RehearsalMark will be centered above the KeySignature" -msgstr "" - -#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:115 (comment) -#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:127 (comment) -msgid "" -"the RehearsalMark will be aligned with the left edge of the KeySignature" -msgstr "" - -#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:121 (comment) -msgid "" -"the RehearsalMark will be aligned with the right edge of the KeySignature" -msgstr "" - -#. Documentation/snippets/aligning-marks-with-various-notation-objects.ly:128 (comment) -msgid "and then shifted right by one unit." -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:40 (variable) -#. Documentation/snippets/ancient-fonts.ly:40 (context id) -msgid "upperStaff" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:52 (comment) -msgid "\\break % 1 (8*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:63 (comment) -msgid "\\break %2 (8*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:75 (comment) -msgid "\\break % 3 (8*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:90 (comment) -msgid "\\break % 4 (8*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:99 (comment) -#. Documentation/snippets/ancient-fonts.ly:161 (comment) -msgid "\\break % 5 (8*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:113 (comment) -#. Documentation/snippets/ancient-fonts.ly:176 (comment) -msgid "\\break % 6 (8*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:122 (comment) -#. Documentation/snippets/ancient-fonts.ly:186 (comment) -msgid "\\break % 7 (8*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:129 (comment) -msgid "\\break % 8 (8*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:132 (comment) -msgid "\\break % 12 (32*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:137 (variable) -#. Documentation/snippets/ancient-fonts.ly:137 (context id) -msgid "lowerStaff" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:147 (comment) -msgid "\\break % 2 (16*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:152 (comment) -msgid "\\break % 4 (16*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:191 (comment) -msgid "\\break % 9 (16*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:193 (comment) -msgid "lig" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:197 (comment) -msgid "\\break % 11 (16*1)" -msgstr "" - -#. Documentation/snippets/ancient-fonts.ly:208 (comment) -msgid "\\break % 12 (8*1)" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:29 (context id) -msgid "cantus" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:31 (comment) -msgid "Verse 1 — Salve, Regína" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:42 (comment) -msgid "Verse 2 — Vita, dulcédo" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:43 (comment) -msgid "a\\melisma \\[ a \\flexa g \\pes a\\melismaEnd \\] d" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:44 (comment) -msgid "\\divisioMinima" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:45 (comment) -msgid "\\[ a\\melisma \\flexa g\\melismaEnd \\]" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:46 (comment) -msgid "\\[ f\\melisma \\flexa e f \\pes g \\flexa f\\melismaEnd \\]" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:47 (comment) -msgid "\\[ e\\melisma \\flexa d\\melismaEnd \\]" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:48 (comment) -msgid "\\divisioMaior" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:49 (comment) -msgid "c d \\[e\\melisma \\pes f\\melismaEnd \\] g" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:50 (comment) -msgid "\\[d\\melisma \\pes e \\flexa c\\melismaEnd \\] d" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:51 (comment) -msgid "\\finalis" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:52 (comment) -msgid "Verse 3 — Ad te clamámus" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:61 (comment) -msgid "Verse 4 — Ad te suspirámus" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:74 (comment) -msgid "Verse 5 — Eia ergo, Advocáta nostra" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:90 (comment) -msgid "Verse 6 — Et Jesum" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:104 (comment) -msgid "Verse 7 ad finem — O clemens: O pia: O dulcis Virgo María" -msgstr "" - -#. Documentation/snippets/ancient-headword.ly:122 (comment) -msgid "Vi- ta, dul- cé- do, et spes no- stra, sal- ve." -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly:68 (variable) -msgid "chant" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly:75 (variable) -msgid "verba" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:85 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:132 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:151 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:168 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:187 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:202 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:223 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:236 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:255 (comment) -#. Documentation/snippets/incipit.ly:28 (variable) -#. Documentation/snippets/incipit.ly:204 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:218 (comment) -msgid "incipit" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:87 (comment) -msgid "Set tight spacing" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:95 (comment) -msgid "turn off bar lines" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:99 (comment) -msgid "need this extra \\skip such that clef change comes" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:100 (comment) -msgid "after bar line" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:104 (comment) -msgid "turn bar lines on again" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:112 (comment) -msgid "Setting printKeyCancellation back to #t must not" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:113 (comment) -msgid "occur in the first bar after the incipit. Dto. for forceClef." -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:114 (comment) -msgid "Therefore, we need an extra \\skip." -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:119 (comment) -#. Documentation/snippets/incipit.ly:78 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:41 (comment) -msgid "the actual music" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:121 (comment) -#. Documentation/snippets/incipit.ly:81 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:42 (comment) -msgid "let finis bar go through all staves" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:124 (comment) -#. Documentation/snippets/incipit.ly:84 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:44 (comment) -msgid "finis bar" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:128 (variable) -#. Documentation/snippets/incipit.ly:101 (variable) -#. Documentation/snippets/incipit.ly:235 (context id) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:48 (variable) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:237 (context id) -msgid "discantusNotes" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:134 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:171 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:177 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:191 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:205 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:207 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:216 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:227 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:239 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:74 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:84 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:97 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:104 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:139 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:165 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:191 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:193 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:220 (comment) -msgid "two bars" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:135 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:238 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:140 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:219 (comment) -msgid "eight bars" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:136 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:170 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:173 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:206 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:208 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:209 (comment) -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:240 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:164 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:192 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:194 (comment) -msgid "one bar" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:150 (variable) -#. Documentation/snippets/incipit.ly:115 (variable) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:61 (variable) -msgid "discantusLyrics" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:164 (variable) -#. Documentation/snippets/incipit.ly:138 (variable) -#. Documentation/snippets/incipit.ly:242 (context id) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:71 (variable) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:244 (context id) -msgid "altusNotes" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:172 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:166 (comment) -msgid "seven bars" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:186 (variable) -#. Documentation/snippets/incipit.ly:152 (variable) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:83 (variable) -msgid "altusLyrics" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:198 (variable) -#. Documentation/snippets/incipit.ly:176 (variable) -#. Documentation/snippets/incipit.ly:249 (context id) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:91 (variable) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:251 (context id) -msgid "tenorNotes" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:204 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:190 (comment) -msgid "four bars" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:222 (variable) -#. Documentation/snippets/incipit.ly:190 (variable) -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:94 (variable) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:103 (variable) -msgid "tenorLyrics" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:232 (variable) -#. Documentation/snippets/incipit.ly:212 (variable) -#. Documentation/snippets/incipit.ly:256 (context id) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:109 (variable) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:258 (context id) -msgid "bassusNotes" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:254 (variable) -#. Documentation/snippets/incipit.ly:226 (variable) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:122 (variable) -msgid "bassusLyrics" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:265 (context id) -#. Documentation/snippets/incipit.ly:234 (context id) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:236 (context id) -msgid "choirStaff" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:287 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:272 (comment) -msgid "no bars in staves" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:290 (comment) -msgid "incipit should not start with a start delimiter" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:296 (comment) -#. Documentation/snippets/incipit.ly:279 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:287 (comment) -msgid "no slurs" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:299 (comment) -msgid "The command below can be commented out in" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:300 (comment) -msgid "short scores, but especially for large scores you" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:301 (comment) -msgid "will typically yield better line breaking and improve" -msgstr "" - -#. Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly:302 (comment) -msgid "overall spacing if you do not comment the command out." -msgstr "" - -#. Documentation/snippets/anglican-psalm-template.ly:92 (variable) -msgid "tick" -msgstr "" - -#. Documentation/snippets/anglican-psalm-template.ly:96 (comment) -msgid "Use markup to center the chant on the page" -msgstr "" - -#. Documentation/snippets/anglican-psalm-template.ly:99 (comment) -msgid "centered" -msgstr "" - -#. Documentation/snippets/anglican-psalm-template.ly:139 (comment) -#. Documentation/snippets/hymn-template.ly:126 (comment) -msgid "End score" -msgstr "" - -#. Documentation/snippets/anglican-psalm-template.ly:141 (comment) -msgid "End markup" -msgstr "" - -#. Documentation/snippets/applying-note-head-styles-depending-on-the-step-of-the-scale.ly:100 (variable) -#. Documentation/snippets/clusters.ly:28 (variable) -msgid "fragment" -msgstr "" - -#. Documentation/snippets/asymmetric-slurs.ly:30 (variable) -msgid "slurNotes" -msgstr "" - -#. Documentation/snippets/avoiding-collisions-with-chord-fingerings.ly:43 (comment) -msgid "Default behavior" -msgstr "" - -#. Documentation/snippets/avoiding-collisions-with-chord-fingerings.ly:49 (comment) -msgid "Corrected to avoid collisions" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:28 (comment) -msgid "%%%%%%% Cut here ----- Start 'bbarred.ly'" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:30 (comment) -msgid "C with slash -------------------------------" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:31 (variable) -msgid "cWithSlash" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:34 (comment) -msgid "Span -----------------------------------" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:35 (comment) -msgid "Syntax: \\bbarre #\\\"text\\\" { notes } - text = any number of box" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:36 (variable) -msgid "bbarre" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:71 (comment) -msgid "uncomment this line for make full barred" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:72 (comment) -msgid "" -"\\once \\override TextSpanner #'bound-details #'left #'text = \\markup { \\" -"\"B\\\" #str }" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:76 (comment) -msgid "%%%%%%% Cut here ----- End 'bbarred.ly'" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:77 (comment) -msgid "Copy and change the last line for full barred. Rename in 'fbarred.ly'" -msgstr "" - -#. Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly:80 (comment) -msgid "Syntaxe: \\bbarre #\\\"text\\\" { notes } - text = any number of box" -msgstr "" - -#. Documentation/snippets/beam-endings-in-score-context.ly:54 (comment) -msgid "Set default beaming for all staves" -msgstr "" - -#. Documentation/snippets/beam-endings-in-score-context.ly:62 (comment) -msgid "Modify beaming for just this staff" -msgstr "" - -#. Documentation/snippets/beam-endings-in-score-context.ly:67 (comment) -msgid "Inherit beaming from Score context" -msgstr "" - -#. Documentation/snippets/beam-endings-in-score-context.ly:73 (comment) -msgid "Modify beaming for this voice only" -msgstr "" - -#. Documentation/snippets/beam-grouping-in-7-8-time.ly:57 (comment) -msgid "rhythm 2-3-2" -msgstr "" - -#. Documentation/snippets/book-parts.ly:25 (comment) -msgid "book paper, which is inherited by all children bookparts" -msgstr "" - -#. Documentation/snippets/book-parts.ly:28 (comment) -msgid "Page footer: add a different part-tagline at part last page" -msgstr "" - -#. Documentation/snippets/book-parts.ly:32 (comment) -msgid "Copyright header field only on book first page." -msgstr "" - -#. Documentation/snippets/book-parts.ly:36 (comment) -msgid "Part tagline header field only on each part last page." -msgstr "" - -#. Documentation/snippets/book-parts.ly:40 (comment) -msgid "Tagline header field only on book last page." -msgstr "" - -#. Documentation/snippets/book-parts.ly:47 (comment) -msgid "book header, which is inherited by the first bookpart" -msgstr "" - -#. Documentation/snippets/book-parts.ly:56 (comment) -msgid "a different page breaking function may be used on each part" -msgstr "" - -#. Documentation/snippets/breathing-signs.ly:23 (comment) -msgid "this bar contains no \\breathe" -msgstr "" - -#. Documentation/snippets/breathing-signs.ly:25 (comment) -msgid "Modern notation:" -msgstr "" - -#. Documentation/snippets/breathing-signs.ly:26 (comment) -msgid "by default, \\breathe uses the rcomma, just as if saying:" -msgstr "" - -#. Documentation/snippets/breathing-signs.ly:27 (comment) -msgid "" -"\\override BreathingSign #'text = #(make-musicglyph-markup \\\"scripts.rcomma" -"\\\")" -msgstr "" - -#. Documentation/snippets/breathing-signs.ly:30 (comment) -msgid "rvarcomma and lvarcomma are variations of the default rcomma and lcomma" -msgstr "" - -#. Documentation/snippets/breathing-signs.ly:31 (comment) -msgid "N.B.: must use Staff context here, since we start a Voice below" -msgstr "" - -#. Documentation/snippets/breathing-signs.ly:35 (comment) -msgid "vee" -msgstr "" - -#. Documentation/snippets/caesura-railtracks-with-fermata.ly:33 (comment) -msgid "construct the symbol" -msgstr "" - -#. Documentation/snippets/caesura-railtracks-with-fermata.ly:42 (comment) -msgid "set the breathe mark back to normal" -msgstr "" - -#. Documentation/snippets/center-text-below-hairpin-dynamics.ly:32 (variable) -msgid "hairpinWithCenteredText" -msgstr "" - -#. Documentation/snippets/center-text-below-hairpin-dynamics.ly:44 (variable) -msgid "hairpinMolto" -msgstr "" - -#. Documentation/snippets/center-text-below-hairpin-dynamics.ly:45 (variable) -msgid "hairpinMore" -msgstr "" - -#. Documentation/snippets/changing--flageolet-mark-size.ly:46 (variable) -#. Documentation/snippets/showing-the-same-articulation-above-and-below-a-note-or-chord.ly:27 (variable) -msgid "smallFlageolet" -msgstr "" - -#. Documentation/snippets/changing-the-ambitus-gap.ly:45 (comment) -msgid "Default setting" -msgstr "" - -#. Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly:39 (comment) -msgid "The following is only here to print the names of the" -msgstr "" - -#. Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly:40 (comment) -msgid "chords styles; it can be removed if you do not need to" -msgstr "" - -#. Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly:41 (comment) -msgid "print them." -msgstr "" - -#. Documentation/snippets/changing-the-default-text-font-family.ly:21 (comment) -msgid "change for other default global staff size." -msgstr "" - -#. Documentation/snippets/changing-the-default-text-font-family.ly:23 (comment) -#. Documentation/snippets/engravers-one-by-one.ly:188 (comment) -#. Documentation/snippets/score-for-diatonic-accordion.ly:116 (comment) -#. Documentation/snippets/utf-8.ly:27 (comment) -msgid "{" -msgstr "" - -#. Documentation/snippets/changing-the-default-text-font-family.ly:27 (comment) -#. Documentation/snippets/engravers-one-by-one.ly:190 (comment) -#. Documentation/snippets/expressive-headword.ly:35 (comment) -#. Documentation/snippets/expressive-headword.ly:36 (comment) -#. Documentation/snippets/score-for-diatonic-accordion.ly:117 (comment) -#. Documentation/snippets/score-for-diatonic-accordion.ly:247 (comment) -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:228 (comment) -#. Documentation/snippets/utf-8.ly:41 (comment) -msgid "}" -msgstr "" - -#. Documentation/snippets/changing-the-text-for-sustain-markings.ly:35 (variable) -msgid "sustainNotes" -msgstr "" - -#. Documentation/snippets/chant-or-psalms-notation.ly:49 (variable) -msgid "stemOn" -msgstr "" - -#. Documentation/snippets/chant-or-psalms-notation.ly:50 (variable) -msgid "stemOff" -msgstr "" - -#. Documentation/snippets/chordchanges-for-fretboards.ly:48 (variable) -msgid "myChords" -msgstr "" - -#. Documentation/snippets/chord-glissando-in-tablature.ly:54 (variable) -msgid "myMusic" -msgstr "" - -#. Documentation/snippets/chord-name-exceptions.ly:49 (comment) -msgid "modify maj9 and 6(add9)" -msgstr "" - -#. Documentation/snippets/chord-name-exceptions.ly:50 (comment) -msgid "Exception music is chords with markups" -msgstr "" - -#. Documentation/snippets/chord-name-exceptions.ly:51 (variable) -msgid "chExceptionMusic" -msgstr "" - -#. Documentation/snippets/chord-name-exceptions.ly:56 (comment) -msgid "Convert music to list and prepend to existing exceptions." -msgstr "" - -#. Documentation/snippets/chord-name-exceptions.ly:57 (variable) -msgid "chExceptions" -msgstr "" - -#. Documentation/snippets/chord-name-exceptions.ly:61 (variable) -msgid "theMusic" -msgstr "" - -#. Documentation/snippets/chords-headword.ly:24 (variable) -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:39 (variable) -msgid "theChords" -msgstr "" - -#. Documentation/snippets/chords-headword.ly:26 (comment) -#. Documentation/snippets/pitches-headword.ly:136 (comment) -msgid "\\break" -msgstr "" - -#. Documentation/snippets/chords-headword.ly:30 (variable) -msgid "verseOne" -msgstr "" - -#. Documentation/snippets/chords-headword.ly:37 (variable) -msgid "verseTwo" -msgstr "" - -#. Documentation/snippets/chords-headword.ly:76 (context id) -msgid "sop" -msgstr "" - -#. Documentation/snippets/clip-systems.ly:68 (variable) -msgid "origScore" -msgstr "" - -#. Documentation/snippets/clip-systems.ly:86 (comment) -msgid "Each clip-region is a (START . END) pair" -msgstr "" - -#. Documentation/snippets/clip-systems.ly:87 (comment) -msgid "where both are rhythmic-locations." -msgstr "" - -#. Documentation/snippets/clip-systems.ly:89 (comment) -msgid "(make-rhythmic-locations BAR-NUMBER NUM DEN)" -msgstr "" - -#. Documentation/snippets/clip-systems.ly:90 (comment) -msgid "means NUM/DEN whole-notes into bar numbered BAR-NUMBER" -msgstr "" - -#. Documentation/snippets/coloring-notes-depending-on-their-pitch.ly:21 (comment) -msgid "Association list of pitches to colors." -msgstr "" - -#. Documentation/snippets/coloring-notes-depending-on-their-pitch.ly:41 (comment) -msgid "Compare pitch and alteration (not octave)." -msgstr "" - -#. Documentation/snippets/combining-dynamics-with-markup-texts.ly:30 (variable) -msgid "piuF" -msgstr "" - -#. Documentation/snippets/combining-two-parts-on-the-same-staff.ly:97 (variable) -msgid "musicUp" -msgstr "" - -#. Documentation/snippets/combining-two-parts-on-the-same-staff.ly:104 (variable) -msgid "musicDown" -msgstr "" - -#. Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly:55 (comment) -msgid "show hairpin" -msgstr "" - -#. Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly:57 (comment) -msgid "hide text span" -msgstr "" - -#. Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly:61 (comment) -msgid "show glissando" -msgstr "" - -#. Documentation/snippets/creating-double-digit-fingerings.ly:22 (variable) -msgid "ten" -msgstr "" - -#. Documentation/snippets/creating-double-digit-fingerings.ly:26 (variable) -msgid "fifty" -msgstr "" - -#. Documentation/snippets/creating-double-digit-fingerings.ly:30 (variable) -msgid "finger" -msgstr "" - -#. Documentation/snippets/creating-double-digit-fingerings.ly:41 (comment) -msgid "optional override to remove warnings for fingerings larger than 5" -msgstr "" - -#. Documentation/snippets/creating-real-parenthesized-dynamics.ly:48 (variable) -msgid "parenF" -msgstr "" - -#. Documentation/snippets/creating-simultaneous-rehearsal-marks.ly:47 (comment) -msgid "the hidden measure and bar line" -msgstr "" - -#. Documentation/snippets/creating-simultaneous-rehearsal-marks.ly:48 (comment) -msgid "\\cadenzaOn turns off automatic calculation of bar numbers" -msgstr "" - -#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:31 (comment) -msgid "this is in half-spaces," -msgstr "" - -#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:32 (comment) -msgid "so it makes stems 9.5 staffspaces long" -msgstr "" - -#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:33 (comment) -msgid "stems are normally lengthened" -msgstr "" - -#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:34 (comment) -msgid "upwards, so here we must lower the stem by the amount" -msgstr "" - -#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:35 (comment) -msgid "equal to the lengthening - in this case (19 - 7) / 2" -msgstr "" - -#. Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly:36 (comment) -msgid "(7 is default stem length)" -msgstr "" - -#. Documentation/snippets/cross-staff-tremolos.ly:47 (context id) -#. Documentation/snippets/jazz-combo-template.ly:273 (variable) -#. Documentation/snippets/screech-and-boink.ly:18 (context id) -msgid "up" -msgstr "" - -#. Documentation/snippets/cross-staff-tremolos.ly:52 (context id) -#. Documentation/snippets/jazz-combo-template.ly:279 (variable) -#. Documentation/snippets/screech-and-boink.ly:48 (context id) -msgid "down" -msgstr "" - -#. Documentation/snippets/customizing-fretboard-fret-diagrams.ly:71 (comment) -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:60 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:30 (comment) -msgid "Set global properties of fret diagram" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:58 (context id) -#. Documentation/snippets/formatting-lyrics-syllables.ly:33 (variable) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:28 (context id) -#. Documentation/snippets/piano-template-with-melody-and-lyrics.ly:89 (context id) -msgid "mel" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:67 (comment) -msgid "C major for guitar, no barre, using defaults" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:68 (comment) -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:118 (comment) -msgid "terse style" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:71 (comment) -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:93 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:59 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:80 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:159 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:180 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:258 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:279 (comment) -msgid "C major for guitar, barred on third fret" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:72 (comment) -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:94 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:60 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:82 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:109 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:160 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:182 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:209 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:259 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:281 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:308 (comment) -msgid "verbose style" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:73 (comment) -msgid "size 1.0" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:74 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:61 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:161 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:260 (comment) -msgid "roman fret label, finger labels below string, straight barre" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:76 (comment) -msgid "standard size" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:95 (comment) -msgid "landscape orientation, arabic numbers, M for mute string" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:96 (comment) -msgid "no barre, fret label down or left, small mute label font" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:117 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:131 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:231 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:330 (comment) -msgid "simple D chord" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:119 (comment) -msgid "larger dots, centered dots, fewer frets" -msgstr "" - -#. Documentation/snippets/customizing-markup-fret-diagrams.ly:120 (comment) -msgid "label below string" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:42 (comment) -msgid "Grob utilities" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:44 (comment) -msgid "" -"These are literal rewrites of some C++ methods used by the ambitus engraver." -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:79 (comment) -msgid "Ambitus data structure" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:82 (comment) -msgid "The class holds the various grobs that are created" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:83 (comment) -msgid "to print an ambitus:" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:84 (comment) -msgid "- ambitus-group: the grob that groups all the components of an ambitus" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:85 (comment) -msgid "(Ambitus grob);" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:86 (comment) -msgid "- ambitus-line: the vertical line between the upper and lower ambitus" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:87 (comment) -msgid "notes (AmbitusLine grob);" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:88 (comment) -msgid "- ambitus-up-note and ambitus-down-note: the note head and accidental" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:89 (comment) -msgid "for the lower and upper note of the ambitus (see class" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:90 (comment) -msgid "below)." -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:91 (comment) -msgid "The other slots define the key and clef context of the engraver:" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:92 (comment) -msgid "- start-c0: position of middle c at the beginning of the piece. It" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:93 (comment) -msgid "is used to place the ambitus notes according to their pitch;" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:94 (comment) -msgid "- start-key-sig: the key signature at the beginning of the piece. It" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:95 (comment) -msgid "is used to determine if accidentals shall be printed next to ambitus" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:96 (comment) -msgid "notes." -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:110 (comment) -msgid "Accessor for the lower and upper note data of an ambitus" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:118 (comment) -msgid "The class holds the grobs that are specific to ambitus" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:119 (comment) -msgid "(lower and upper) notes:" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:120 (comment) -msgid "- head: an AmbitusNoteHead grob;" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:121 (comment) -msgid "- accidental: an AmbitusAccidental grob, to be possibly printed next" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:122 (comment) -msgid "to the ambitus note head." -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:123 (comment) -msgid "Moreover:" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:124 (comment) -msgid "- pitch is the absolute pitch of the note" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:125 (comment) -msgid "- cause is the note event that causes this ambitus note, i.e. the lower" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:126 (comment) -msgid "or upper note of the considered music sequence." -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:139 (comment) -msgid "Ambitus engraving logics" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:141 (comment) -msgid "Rewrite of the code from @file{lily/ambitus-engraver.cc}." -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:310 (comment) -msgid "Ambitus engraver definition" -msgstr "" - -#. Documentation/snippets/defining-an-engraver-in-scheme-ambitus-engraver.ly:335 (comment) -msgid "Example" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:89 (comment) -msgid "add FretBoards for the Cuatro" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:90 (comment) -msgid "Note: This section could be put into a separate file" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:91 (comment) -msgid "predefined-cuatro-fretboards.ly" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:92 (comment) -msgid "and \\included into each of your compositions" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:94 (variable) -msgid "cuatroTuning" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:99 (variable) -msgid "dSix" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:100 (variable) -msgid "dMajor" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:101 (variable) -msgid "aMajSeven" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:102 (variable) -msgid "dMajSeven" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:103 (variable) -msgid "gMajor" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:121 (comment) -msgid "end of potential include file /predefined-cuatro-fretboards.ly" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:126 (variable) -msgid "primerosNames" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:130 (variable) -msgid "primeros" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:153 (comment) -msgid "\\override FretBoard" -msgstr "" - -#. Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly:154 (comment) -msgid "#'(fret-diagram-details string-count) = #'4" -msgstr "" - -#. Documentation/snippets/demo-midiinstruments.ly:27 (variable) -msgid "baseMelody" -msgstr "" - -#. Documentation/snippets/display-bracket-with-only-one-staff-in-a-system.ly:76 (comment) -msgid "Must be lower than the actual number of staff lines" -msgstr "" - -#. Documentation/snippets/displaying-complex-chords.ly:29 (variable) -msgid "fixA" -msgstr "" - -#. Documentation/snippets/displaying-complex-chords.ly:32 (variable) -msgid "fixB" -msgstr "" - -#. Documentation/snippets/displaying-grob-ancestry.ly:200 (comment) -msgid "\\\" (make-string 36 #\\-))" -msgstr "" - -#. Documentation/snippets/double-glissando.ly:24 (comment) -msgid "new voice ( = \\voiceOne), hidden" -msgstr "" - -#. Documentation/snippets/double-glissando.ly:26 (comment) -msgid "attach glissando to note heads" -msgstr "" - -#. Documentation/snippets/double-glissando.ly:31 (comment) -msgid "original voice with chords rearranged so that" -msgstr "" - -#. Documentation/snippets/double-glissando.ly:32 (comment) -msgid "glissando is attached to a & c" -msgstr "" - -#. Documentation/snippets/drawing-circles-around-note-heads.ly:19 (variable) -msgid "circle" -msgstr "" - -#. Documentation/snippets/dynamics-custom-text-spanner-postfix.ly:57 (comment) -msgid "" -"Two functions for (de)crescendo spanners where you can explicitly give the" -msgstr "" - -#. Documentation/snippets/dynamics-custom-text-spanner-postfix.ly:58 (comment) -msgid "spanner text." -msgstr "" - -#. Documentation/snippets/dynamics-custom-text-spanner-postfix.ly:59 (variable) -msgid "mycresc" -msgstr "" - -#. Documentation/snippets/dynamics-custom-text-spanner-postfix.ly:65 (variable) -msgid "mydecresc" -msgstr "" - -#. Documentation/snippets/dynamics-text-spanner-postfix.ly:61 (comment) -msgid "Some sample text dynamic spanners, to be used as postfix operators" -msgstr "" - -#. Documentation/snippets/dynamics-text-spanner-postfix.ly:62 (variable) -msgid "crpoco" -msgstr "" - -#. Documentation/snippets/editorial-headword.ly:25 (comment) -msgid "NR 1.7 Editorial annotations" -msgstr "" - -#. Documentation/snippets/editorial-headword.ly:27 (comment) -msgid "Beethoven, Op. 31, No. 3" -msgstr "" - -#. Documentation/snippets/editorial-headword.ly:28 (comment) -msgid "Piano sonata 18, Movt II, Scherzo" -msgstr "" - -#. Documentation/snippets/editorial-headword.ly:29 (comment) -msgid "Measures 9 - 14" -msgstr "" - -#. Documentation/snippets/editorial-headword.ly:33 (comment) -#. Documentation/snippets/expressive-headword.ly:40 (comment) -#. Documentation/snippets/pitches-headword.ly:33 (comment) -#. Documentation/snippets/rhythms-headword.ly:42 (comment) -msgid "RH Staff" -msgstr "" - -#. Documentation/snippets/editorial-headword.ly:71 (comment) -#. Documentation/snippets/expressive-headword.ly:172 (comment) -#. Documentation/snippets/pitches-headword.ly:106 (comment) -#. Documentation/snippets/rhythms-headword.ly:131 (comment) -msgid "LH Staff" -msgstr "" - -#. Documentation/snippets/embedding-native-postscript-in-a--markup-block.ly:28 (comment) -msgid "PostScript is a registered trademark of Adobe Systems Inc." -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:76 (comment) -msgid "sample music" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:77 (variable) -msgid "topVoice" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:85 (variable) -msgid "botVoice" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:93 (variable) -msgid "hoom" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:104 (variable) -msgid "pah" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:114 (comment) -msgid "setup for Request->Element conversion. Guru-only" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:117 (variable) -#. Documentation/snippets/engravers-one-by-one.ly:215 (variable) -#. Documentation/snippets/engravers-one-by-one.ly:228 (variable) -#. Documentation/snippets/engravers-one-by-one.ly:284 (variable) -#. Documentation/snippets/engravers-one-by-one.ly:298 (variable) -msgid "MyStaff" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:145 (comment) -msgid "explicitly set instrumentName, so we don't get" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:146 (comment) -msgid "weird effects when doing instrument names for" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:147 (comment) -msgid "piano staves" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:156 (variable) -#. Documentation/snippets/engravers-one-by-one.ly:242 (variable) -#. Documentation/snippets/engravers-one-by-one.ly:255 (variable) -#. Documentation/snippets/engravers-one-by-one.ly:268 (variable) -msgid "MyVoice" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:171 (comment) -msgid "must come before all" -msgstr "" - -#. Documentation/snippets/engravers-one-by-one.ly:181 (comment) -msgid "\\consists \\\"Rest_engraver\\\"" -msgstr "" - -#. Documentation/snippets/expressive-headword.ly:26 (comment) -msgid "L. v. Beethoven, Op. 49 no. 1" -msgstr "" - -#. Documentation/snippets/expressive-headword.ly:27 (comment) -msgid "Piano sonata 19 - \\\"Leichte Sonate\\\"" -msgstr "" - -#. Documentation/snippets/expressive-headword.ly:28 (comment) -msgid "measures 1 - 12" -msgstr "" - -#. Documentation/snippets/expressive-headword.ly:30 (comment) -msgid "\\layout {" -msgstr "" - -#. Documentation/snippets/expressive-headword.ly:31 (comment) -msgid "\\context {" -msgstr "" - -#. Documentation/snippets/expressive-headword.ly:32 (comment) -msgid "\\Score" -msgstr "" - -#. Documentation/snippets/expressive-headword.ly:33 (comment) -msgid "\\override SpacingSpanner #'base-shortest-duration =" -msgstr "" - -#. Documentation/snippets/expressive-headword.ly:34 (comment) -msgid "#(ly:make-moment 1 20)" -msgstr "" - -#. Documentation/snippets/figured-bass-headword.ly:26 (comment) -msgid "Arcangelo Corelli, 12 Sonate da Camera, Op. 2" -msgstr "" - -#. Documentation/snippets/figured-bass-headword.ly:27 (comment) -msgid "Sonata II, Allemanda" -msgstr "" - -#. Documentation/snippets/figured-bass-headword.ly:28 (comment) -msgid "measures 1 - 88" -msgstr "" - -#. Documentation/snippets/figured-bass-headword.ly:29 (comment) -msgid "Coded by Neil Puttock; modified by Carl Sorensen" -msgstr "" - -#. Documentation/snippets/figured-bass-headword.ly:31 (variable) -msgid "extendOn" -msgstr "" - -#. Documentation/snippets/figured-bass-headword.ly:32 (variable) -msgid "extendOff" -msgstr "" - -#. Documentation/snippets/figured-bass-headword.ly:40 (context id) -msgid "violinoI" -msgstr "" - -#. Documentation/snippets/figured-bass-headword.ly:58 (context id) -msgid "violinoII" -msgstr "" - -#. Documentation/snippets/figured-bass-headword.ly:76 (context id) -msgid "violone" -msgstr "" - -#. Documentation/snippets/fingering-symbols-for-wind-instruments.ly:37 (variable) -#. Documentation/snippets/recorder-fingering-chart.ly:41 (variable) -msgid "centermarkup" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:97 (comment) -msgid "Cut here ----- Start 'flamenco.ly'" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:99 (comment) -msgid "Text indicators" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:100 (variable) -msgid "abanico" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:101 (variable) -msgid "rasgueaso" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:102 (variable) -msgid "alzapua" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:104 (comment) -msgid "Finger stroke symbols" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:105 (variable) -msgid "strokeUp" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:115 (variable) -msgid "strokeDown" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:125 (comment) -msgid "Golpe symbol" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:126 (variable) -msgid "golpe" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:140 (variable) -msgid "strokeUpGolpe" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:141 (variable) -msgid "iUpGolpe" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:143 (comment) -msgid "Strokes for all fingers" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:144 (variable) -msgid "pUp" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:145 (variable) -msgid "pDown" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:146 (variable) -msgid "iUp" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:147 (variable) -msgid "iDown" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:148 (variable) -msgid "mUp" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:149 (variable) -msgid "mDown" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:150 (variable) -msgid "aUp" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:151 (variable) -msgid "aDown" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:152 (variable) -msgid "xUp" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:153 (variable) -msgid "xDown" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:156 (comment) -msgid "Just handy :)" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:157 (variable) -msgid "tupletOff" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:162 (variable) -msgid "tupletsOff" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:167 (variable) -msgid "tupletsOn" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:172 (variable) -msgid "headsOff" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:178 (variable) -msgid "headsOn" -msgstr "" - -#. Documentation/snippets/flamenco-notation.ly:184 (comment) -msgid "Cut here ----- End 'flamenco.ly'" -msgstr "" - -#. Documentation/snippets/flat-flags-and-beam-nibs.ly:160 (comment) -msgid "Example 1" -msgstr "" - -#. Documentation/snippets/flat-flags-and-beam-nibs.ly:166 (comment) -msgid "Example 2" -msgstr "" - -#. Documentation/snippets/flat-flags-and-beam-nibs.ly:172 (comment) -msgid "Example 3" -msgstr "" - -#. Documentation/snippets/flat-flags-and-beam-nibs.ly:180 (comment) -msgid "Example 4" -msgstr "" - -#. Documentation/snippets/flute-slap-notation.ly:21 (variable) -msgid "slap" -msgstr "" - -#. Documentation/snippets/forcing-measure-width-to-adapt-to-metronomemarks-width.ly:23 (variable) -msgid "example" -msgstr "" - -#. Documentation/snippets/formatting-lyrics-syllables.ly:34 (variable) -msgid "lyr" -msgstr "" - -#. Documentation/snippets/fretboards-alternate-tables.ly:92 (comment) -msgid "Make a blank new fretboard table" -msgstr "" - -#. Documentation/snippets/fretboards-alternate-tables.ly:95 (comment) -msgid "Make a new fretboard table as a copy of default-fret-table" -msgstr "" - -#. Documentation/snippets/fretboards-alternate-tables.ly:98 (comment) -msgid "Add a chord to custom-fretboard-table-one" -msgstr "" - -#. Documentation/snippets/fretboards-alternate-tables.ly:104 (comment) -msgid "Add a chord to custom-fretboard-table-two" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:36 (comment) -msgid "A chord for ukulele" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:46 (comment) -msgid "A chord for ukulele, with formatting defined in definition string" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:47 (comment) -msgid "1.2 * size, 4 strings, 4 frets, fingerings below string" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:48 (comment) -msgid "dot radius .35 of fret spacing, dot position 0.55 of fret spacing" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:57 (comment) -msgid "These chords will be in normal orientation" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:63 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:84 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:111 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:163 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:184 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:211 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:262 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:283 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:310 (comment) -#, python-format -msgid "110% of default size" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:81 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:181 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:280 (comment) -msgid "Double barre used to test barre function" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:108 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:208 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:307 (comment) -msgid "C major for guitar, with capo on third fret" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:143 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:242 (comment) -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:341 (comment) -msgid "simple D chord, large top fret thickness" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:155 (comment) -msgid "These chords will be in landscape orientation" -msgstr "" - -#. Documentation/snippets/fret-diagrams-explained-and-developed.ly:254 (comment) -msgid "These chords will be in opposing-landscape orientation" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:36 (comment) -msgid "shortcuts" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:37 (comment) -msgid "fingering orientations" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:38 (variable) -msgid "sfol" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:39 (variable) -msgid "sfor" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:40 (variable) -msgid "sfod" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:41 (variable) -msgid "sfou" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:43 (comment) -msgid "string number orientations" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:44 (variable) -msgid "ssnol" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:44 (comment) -msgid "(down right up)" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:45 (variable) -msgid "ssnou" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:46 (variable) -msgid "ssnod" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:47 (variable) -msgid "ssnor" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:49 (comment) -msgid "define fingering offset" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:50 (variable) -msgid "FO" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:55 (comment) -msgid "markups" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:56 (variable) -msgid "rit" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:57 (variable) -msgid "dimin" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:58 (variable) -msgid "andantino" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:59 (variable) -msgid "benmarcato" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:60 (variable) -msgid "pdolce" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:62 (comment) -msgid "THE MUSIC %%%" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:74 (comment) -#. Documentation/snippets/fretted-headword.ly:113 (comment) -msgid "m. 1" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:80 (comment) -msgid "m. 2" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:82 (comment) -#. Documentation/snippets/fretted-headword.ly:118 (comment) -msgid "m. 3" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:83 (comment) -#. Documentation/snippets/fretted-headword.ly:120 (comment) -msgid "m. 4" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:87 (comment) -#. Documentation/snippets/fretted-headword.ly:125 (comment) -msgid "m. 5" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:90 (comment) -msgid "end of m. 6" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:93 (comment) -#. Documentation/snippets/fretted-headword.ly:130 (comment) -msgid "m. 7" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:96 (comment) -msgid "beg of m. 8" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:97 (comment) -msgid "end of m. 8" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:99 (comment) -msgid "end of m. 9" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:101 (comment) -#. Documentation/snippets/fretted-headword.ly:137 (comment) -msgid "m. 10" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:103 (comment) -msgid "beg of m. 11" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:105 (comment) -msgid "end of m. 11" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:115 (comment) -msgid "beg m. 2" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:116 (comment) -msgid "end m. 2" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:122 (comment) -msgid "new section starts here in A minor" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:127 (comment) -msgid "beg m. 6" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:128 (comment) -msgid "end m. 6" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:132 (comment) -msgid "m. 8" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:134 (comment) -msgid "beg m. 9" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:135 (comment) -msgid "end m. 9" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:139 (comment) -msgid "m. 11" -msgstr "" - -#. Documentation/snippets/fretted-headword.ly:143 (context id) -#. Documentation/snippets/jazz-combo-template.ly:199 (variable) -#. Documentation/snippets/jazz-combo-template.ly:309 (context id) -#. Documentation/snippets/polyphony-in-tablature.ly:62 (context id) -#. Documentation/snippets/polyphony-in-tablature.ly:67 (context id) -msgid "guitar" -msgstr "" - -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:40 (variable) -msgid "pinchedHarmonics" -msgstr "" - -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:54 (comment) -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:73 (comment) -msgid "artificial harmonics (AH)" -msgstr "" - -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:59 (comment) -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:77 (comment) -msgid "pinched harmonics (PH)" -msgstr "" - -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:64 (comment) -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:81 (comment) -msgid "tapped harmonics (TH)" -msgstr "" - -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:68 (comment) -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:85 (comment) -msgid "touch harmonics (TCH)" -msgstr "" - -#. Documentation/snippets/fretted-string-harmonics-in-tablature.ly:72 (variable) -msgid "frettedStrings" -msgstr "" - -#. Documentation/snippets/generating-custom-flags.ly:35 (comment) -msgid "Create a flag stencil by looking up the glyph from the font" -msgstr "" - -#. Documentation/snippets/generating-custom-flags.ly:50 (variable) -msgid "snippetexamplenotes" -msgstr "" - -#. Documentation/snippets/grid-lines--changing-their-appearance.ly:56 (comment) -msgid "this moves them up one staff space from the default position" -msgstr "" - -#. Documentation/snippets/grid-lines--changing-their-appearance.ly:74 (comment) -msgid "set up grids" -msgstr "" - -#. Documentation/snippets/grid-lines--changing-their-appearance.ly:76 (comment) -msgid "set the grid interval to one quarter note" -msgstr "" - -#. Documentation/snippets/grid-lines--changing-their-appearance.ly:82 (comment) -msgid "this moves them to the right half a staff space" -msgstr "" - -#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:41 (comment) -msgid "hides staff and notes so that only the grid lines are visible" -msgstr "" - -#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:48 (comment) -msgid "dummy notes to force regular note spacing" -msgstr "" - -#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:64 (comment) -msgid "center grid lines horizontally below note heads" -msgstr "" - -#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:71 (comment) -msgid "set line length and positioning:" -msgstr "" - -#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:72 (comment) -msgid "two staff spaces above center line on hidden staff" -msgstr "" - -#. Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly:73 (comment) -msgid "to four spaces below center line on visible staff" -msgstr "" - -#. Documentation/snippets/guitar-slides.ly:36 (comment) -msgid "Hide fret number: useful to draw slide into/from a casual point of" -msgstr "" - -#. Documentation/snippets/guitar-slides.ly:37 (comment) -msgid "the fretboard." -msgstr "" - -#. Documentation/snippets/guitar-slides.ly:38 (variable) -msgid "hideFretNumber" -msgstr "" - -#. Documentation/snippets/heavily-customized-polymetric-time-signatures.ly:51 (variable) -msgid "drum" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:59 (comment) -msgid "Solution 1: Using a simple markup with a particular halign value" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:60 (comment) -msgid "Drawback: It's a markup, not a dynamic command, so \\dynamicDown" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:61 (comment) -msgid "etc. will have no effect" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:62 (variable) -msgid "semppMarkup" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:64 (comment) -msgid "Solution 2: Using a dynamic script & shifting with" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:65 (comment) -msgid "\\once \\override ... #'X-offset = .." -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:66 (comment) -msgid "Drawback: \\once \\override needed for every invocation" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:67 (variable) -msgid "semppK" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:74 (comment) -msgid "Solution 3: Padding the dynamic script so the center-alignment" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:75 (comment) -msgid "puts it at the correct position" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:76 (comment) -msgid "" -"Drawback: the padding really reserves the space, nothing else can be there" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:77 (variable) -msgid "semppT" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:85 (comment) -msgid "Solution 4: Dynamic, setting the dimensions of the additional text to 0" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:86 (comment) -msgid "Drawback: To lilypond \\\"sempre\\\" has no extent, so it might put" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:87 (comment) -msgid "other stuff there => collisions" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:88 (comment) -msgid "Drawback: Also, there seems to be some spacing, so it's not exactly the" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:89 (comment) -msgid "same alignment as without the additional text" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:90 (variable) -msgid "semppM" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:99 (comment) -msgid "Solution 5: Dynamic with explicit shifting inside the scheme function" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:100 (variable) -msgid "semppG" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:108 (comment) -msgid "Solution 6: Dynamic with explicit alignment. This has only effect" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:109 (comment) -msgid "if one sets X-offset!" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:110 (comment) -msgid "Drawback: One needs to set DynamicText #'X-offset!" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:111 (comment) -msgid "Drawback: Aligned at the right edge of the additional text," -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:112 (comment) -msgid "not at the center of pp" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:113 (variable) -msgid "semppMII" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:121 (context id) -msgid "s" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:128 (context id) -msgid "sMarkup" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:135 (context id) -msgid "sK" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:146 (context id) -msgid "sT" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:153 (context id) -msgid "sM" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:160 (context id) -msgid "sG" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:167 (context id) -msgid "sMII" -msgstr "" - -#. Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly:171 (comment) -msgid "Setting to ##f (false) gives the same result" -msgstr "" - -#. Documentation/snippets/how-to-change-fret-diagram-position.ly:32 (variable) -#. Documentation/snippets/score-for-diatonic-accordion.ly:67 (variable) -#. Documentation/snippets/showing-chords-at-changes.ly:48 (variable) -#. Documentation/snippets/single-staff-template-with-notes-and-chords.ly:69 (variable) -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly:72 (variable) -msgid "harmonies" -msgstr "" - -#. Documentation/snippets/how-to-change-fret-diagram-position.ly:35 (comment) -msgid "THE FOLLOWING IS THE COMMAND TO MOVE THE CHORD NAME" -msgstr "" - -#. Documentation/snippets/how-to-change-fret-diagram-position.ly:38 (comment) -msgid "THIS LINE IS THE SECOND METHOD" -msgstr "" - -#. Documentation/snippets/how-to-change-fret-diagram-position.ly:48 (comment) -msgid "THE FOLLOWING IS THE COMMAND TO MOVE THE FRET DIAGRAM" -msgstr "" - -#. Documentation/snippets/how-to-change-fret-diagram-position.ly:51 (comment) -msgid "HERE IS THE SECOND METHOD" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:61 (variable) -msgid "Timeline" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:93 (comment) -msgid "Start score" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:95 (comment) -msgid "Start pianostaff" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:96 (comment) -msgid "Start Staff = RH" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:99 (comment) -msgid "Start Voice = \\\"Soprano\\\"" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:103 (comment) -msgid "End Voice = \\\"Soprano\\\"" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:104 (comment) -msgid "Start Voice = \\\"Alto\\\"" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:108 (comment) -msgid "End Voice = \\\"Alto\\\"" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:109 (comment) -msgid "End Staff = RH" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:110 (comment) -msgid "Start Staff = LH" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:113 (comment) -msgid "Start Voice = \\\"Tenor\\\"" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:117 (comment) -msgid "End Voice = \\\"Tenor\\\"" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:118 (comment) -msgid "Start Voice = \\\"Bass\\\"" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:122 (comment) -msgid "End Voice = \\\"Bass\\\"" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:123 (comment) -msgid "End Staff = LH" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:124 (comment) -msgid "End pianostaff" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:145 (comment) -msgid "Start paper block" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:146 (comment) -msgid "don't indent first system" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:147 (comment) -msgid "shorten line length to suit music" -msgstr "" - -#. Documentation/snippets/hymn-template.ly:148 (comment) -msgid "End paper block" -msgstr "" - -#. Documentation/snippets/incipit.ly:88 (variable) -#. Documentation/snippets/incipit.ly:89 (context id) -msgid "discantusIncipit" -msgstr "" - -#. Documentation/snippets/incipit.ly:125 (variable) -#. Documentation/snippets/incipit.ly:126 (context id) -msgid "altusIncipit" -msgstr "" - -#. Documentation/snippets/incipit.ly:141 (comment) -#. Documentation/snippets/incipit.ly:153 (comment) -#. Documentation/snippets/incipit.ly:182 (comment) -#. Documentation/snippets/incipit.ly:191 (comment) -msgid "two measures" -msgstr "" - -#. Documentation/snippets/incipit.ly:161 (variable) -#. Documentation/snippets/incipit.ly:162 (context id) -msgid "tenorIncipit" -msgstr "" - -#. Documentation/snippets/incipit.ly:197 (variable) -#. Documentation/snippets/incipit.ly:198 (context id) -msgid "bassusIncipit" -msgstr "" - -#. Documentation/snippets/incipit.ly:268 (comment) -msgid "no bar lines in staves or lyrics" -msgstr "" - -#. Documentation/snippets/incipit.ly:271 (comment) -msgid "the next two instructions keep the lyrics between the bar lines" -msgstr "" - -#. Documentation/snippets/incipit.ly:281 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:289 (comment) -msgid "Comment in the below \\\"\\remove\\\" command to allow line" -msgstr "" - -#. Documentation/snippets/incipit.ly:282 (comment) -msgid "breaking also at those bar lines where a note overlaps" -msgstr "" - -#. Documentation/snippets/incipit.ly:283 (comment) -msgid "into the next measure. The command is commented out in this" -msgstr "" - -#. Documentation/snippets/incipit.ly:284 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:292 (comment) -msgid "short example score, but especially for large scores, you" -msgstr "" - -#. Documentation/snippets/incipit.ly:285 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:293 (comment) -msgid "will typically yield better line breaking and thus improve" -msgstr "" - -#. Documentation/snippets/incipit.ly:286 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:294 (comment) -msgid "overall spacing if you comment in the following command." -msgstr "" - -#. Documentation/snippets/incipit.ly:287 (comment) -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:295 (comment) -msgid "\\remove \\\"Forbid_line_break_engraver\\\"" -msgstr "" - -#. Documentation/snippets/inserting-score-fragments-above-a-staff,-as-markups.ly:20 (variable) -msgid "tuning" -msgstr "" - -#. Documentation/snippets/isolated-percent-repeats.ly:45 (variable) -msgid "makePercent" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:82 (comment) -msgid "#(set-global-staff-size 16)" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:85 (comment) -msgid "Some macros %%%%%%%%%%%%%%%%%%%" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:87 (variable) -msgid "sl" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:92 (variable) -msgid "nsl" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:97 (variable) -msgid "crOn" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:98 (variable) -msgid "crOff" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:100 (comment) -msgid "insert chord name style stuff here." -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:102 (variable) -msgid "jazzChords" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:104 (comment) -msgid "Keys'n'thangs %%%%%%%%%%%%%%%%%" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:108 (variable) -msgid "Key" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:110 (comment) -msgid "############ Horns ############" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:112 (comment) -msgid "------ Trumpet ------" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:113 (variable) -msgid "trpt" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:117 (variable) -msgid "trpHarmony" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:120 (variable) -#. Documentation/snippets/jazz-combo-template.ly:300 (context id) -#. Documentation/snippets/staff-headword.ly:96 (context id) -#. Documentation/snippets/staff-headword.ly:115 (context id) -msgid "trumpet" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:129 (comment) -msgid "------ Alto Saxophone ------" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:134 (variable) -msgid "altoHarmony" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:137 (variable) -msgid "altoSax" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:146 (comment) -msgid "------ Baritone Saxophone ------" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:147 (variable) -msgid "bari" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:155 (variable) -msgid "bariHarmony" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:158 (variable) -msgid "bariSax" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:167 (comment) -msgid "------ Trombone ------" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:168 (variable) -msgid "tbone" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:172 (variable) -msgid "tboneHarmony" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:175 (variable) -#. Documentation/snippets/jazz-combo-template.ly:304 (context id) -msgid "trombone" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:184 (comment) -msgid "############ Rhythm Section #############" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:186 (comment) -msgid "------ Guitar ------" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:187 (variable) -msgid "gtr" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:195 (variable) -msgid "gtrHarmony" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:208 (comment) -msgid "------ Piano ------" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:209 (variable) -msgid "rhUpper" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:214 (variable) -msgid "rhLower" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:220 (variable) -msgid "lhUpper" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:225 (variable) -msgid "lhLower" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:231 (variable) -msgid "PianoRH" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:240 (variable) -msgid "PianoLH" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:258 (comment) -msgid "------ Bass Guitar ------" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:272 (comment) -msgid "------ Drums ------" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:286 (variable) -msgid "drumContents" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:295 (comment) -#, python-format -msgid "It All Goes Together Here %%%%%%%%%%%%%%%%%%%%%%" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:299 (context id) -msgid "horns" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:301 (context id) -msgid "altosax" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:302 (context id) -msgid "barichords" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:303 (context id) -msgid "barisax" -msgstr "" - -#. Documentation/snippets/jazz-combo-template.ly:308 (context id) -msgid "chords" -msgstr "" - -#. Documentation/snippets/keyboard-headword.ly:27 (comment) -msgid "M. Ravel, Sonatine (1905)" -msgstr "" - -#. Documentation/snippets/keyboard-headword.ly:28 (comment) -msgid "First movement" -msgstr "" - -#. Documentation/snippets/keyboard-headword.ly:37 (variable) -msgid "fermataLong" -msgstr "" - -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:53 (variable) -#. Documentation/snippets/vocal-ensemble-template.ly:89 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:91 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:71 (variable) -msgid "sopMusic" -msgstr "" - -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:54 (comment) -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:60 (comment) -msgid "VERSE ONE" -msgstr "" - -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:82 (context id) -#. Documentation/snippets/vocal-ensemble-template.ly:123 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:126 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:101 (context id) -msgid "women" -msgstr "" - -#. Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly:94 (context id) -#. Documentation/snippets/vocal-ensemble-template.ly:138 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:136 (context id) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:113 (context id) -msgid "men" -msgstr "" - -#. Documentation/snippets/makam-example.ly:58 (comment) -msgid "Initialize makam settings" -msgstr "" - -#. Documentation/snippets/manually-break-figured-bass-extenders-for-only-some-numbers.ly:23 (variable) -msgid "bassfigures" -msgstr "" - -#. Documentation/snippets/manually-controlling-beam-positions.ly:25 (comment) -msgid "from upper staff-line (position 2) to center (position 0)" -msgstr "" - -#. Documentation/snippets/manually-controlling-beam-positions.ly:28 (comment) -msgid "from center to one above center (position 1)" -msgstr "" - -#. Documentation/snippets/marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly:21 (variable) -msgid "speakOn" -msgstr "" - -#. Documentation/snippets/marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly:38 (variable) -msgid "speakOff" -msgstr "" - -#. Documentation/snippets/markup-lines.ly:26 (comment) -msgid "Candide, Voltaire" -msgstr "" - -#. Documentation/snippets/mensurstriche-layout-bar-lines-between-the-staves.ly:59 (comment) -msgid "the final bar line is not interrupted" -msgstr "" - -#. Documentation/snippets/merging-multi-measure-rests-in-a-polyphonic-part.ly:21 (variable) -msgid "normalPos" -msgstr "" - -#. Documentation/snippets/modifying-default-values-for-articulation-shorthand-notation.ly:74 (variable) -msgid "dashPlus" -msgstr "" - -#. Documentation/snippets/modifying-tuplet-bracket-length.ly:27 (comment) -msgid "Set tuplets to be extendable..." -msgstr "" - -#. Documentation/snippets/modifying-tuplet-bracket-length.ly:29 (comment) -msgid "...to cover all items up to the next note" -msgstr "" - -#. Documentation/snippets/modifying-tuplet-bracket-length.ly:33 (comment) -msgid "...or to cover just whitespace" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:41 (variable) -msgid "openStringHarmonics" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:42 (comment) -msgid "first harmonic" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:45 (comment) -msgid "second harmonic" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:50 (comment) -msgid "\\harmonicByFret #19 < e,\\6 a,\\5 d\\4 >" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:51 (comment) -msgid "\\harmonicByRatio #2/3 < e,\\6 a,\\5 d\\4 >" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:52 (comment) -msgid "third harmonic" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:58 (comment) -msgid "fourth harmonic" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:65 (comment) -msgid "fifth harmonic" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:69 (comment) -msgid "sixth harmonic" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:72 (comment) -msgid "seventh harmonic" -msgstr "" - -#. Documentation/snippets/open-string-harmonics-in-tablature.ly:75 (comment) -msgid "eighth harmonic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:73 (comment) -msgid "space for instrumentName" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:74 (comment) -msgid "space for shortInstrumentName" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:77 (variable) -msgid "fluteMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:78 (comment) -msgid "Pitches as written on a manuscript for Clarinet in A" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:79 (comment) -msgid "are transposed to concert pitch." -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:80 (variable) -msgid "clarinetMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:82 (variable) -msgid "trumpetMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:83 (comment) -msgid "Key signature is often omitted for horns" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:84 (variable) -msgid "hornMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:86 (variable) -msgid "percussionMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:89 (variable) -msgid "altoIMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:90 (variable) -msgid "altoIIMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:91 (variable) -msgid "altoILyrics" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:92 (variable) -msgid "altoIILyrics" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:95 (variable) -msgid "pianoRHMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:96 (variable) -msgid "pianoLHMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:97 (variable) -msgid "violinIMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:98 (variable) -msgid "violinIIMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:99 (variable) -msgid "violaMusic" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:108 (comment) -msgid "shortInstrumentName, midiInstrument, etc." -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:109 (comment) -msgid "may be set here as well" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:115 (comment) -msgid "Declare that written Middle C in the music" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:116 (comment) -msgid "to follow sounds a concert B flat, for" -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:117 (comment) -msgid "output using sounded pitches such as MIDI." -msgstr "" - -#. Documentation/snippets/orchestra,-choir-and-piano-template.ly:119 (comment) -msgid "Print music for a B-flat clarinet" -msgstr "" - -#. Documentation/snippets/partcombine-and-autobeamoff.ly:149 (comment) -msgid "\\set Staff.autoBeaming = ##f % turns off all autobeaming" -msgstr "" - -#. Documentation/snippets/partcombine-and-autobeamoff.ly:152 (comment) -msgid "applies to split up stems" -msgstr "" - -#. Documentation/snippets/partcombine-and-autobeamoff.ly:154 (comment) -msgid "\\autoBeamOff % applies to combined up stems" -msgstr "" - -#. Documentation/snippets/partcombine-and-autobeamoff.ly:159 (comment) -msgid "applies to down stems" -msgstr "" - -#. Documentation/snippets/percussion-beaters.ly:22 (variable) -msgid "stick" -msgstr "" - -#. Documentation/snippets/permitting-line-breaks-within-beamed-tuplets.ly:56 (comment) -msgid "Permit line breaks within tuplets" -msgstr "" - -#. Documentation/snippets/permitting-line-breaks-within-beamed-tuplets.ly:58 (comment) -msgid "Allow beams to be broken at line breaks" -msgstr "" - -#. Documentation/snippets/permitting-line-breaks-within-beamed-tuplets.ly:65 (comment) -msgid "Insert a manual line break within a tuplet" -msgstr "" - -#. Documentation/snippets/pitches-headword.ly:27 (comment) -msgid "L. v. Beethoven" -msgstr "" - -#. Documentation/snippets/pitches-headword.ly:28 (comment) -msgid "Piano sonata 21 - Dem Grafen von Waldstein Gewidmet" -msgstr "" - -#. Documentation/snippets/pitches-headword.ly:29 (comment) -msgid "chorale at measures 34 - 40+" -msgstr "" - -#. Documentation/snippets/pitches-headword.ly:36 (comment) -msgid "RH Voice 1" -msgstr "" - -#. Documentation/snippets/pitches-headword.ly:64 (comment) -msgid "(" -msgstr "" - -#. Documentation/snippets/pitches-headword.ly:69 (comment) -msgid ")" -msgstr "" - -#. Documentation/snippets/pitches-headword.ly:73 (comment) -msgid "RH Voice 2" -msgstr "" - -#. Documentation/snippets/polyphony-in-tablature.ly:61 (context id) -msgid "tab" -msgstr "" - -#. Documentation/snippets/positioning-multi-measure-rests.ly:66 (comment) -msgid "Multi-measure rests by default are set under the fourth line" -msgstr "" - -#. Documentation/snippets/positioning-multi-measure-rests.ly:68 (comment) -msgid "They can be moved using an override" -msgstr "" - -#. Documentation/snippets/positioning-multi-measure-rests.ly:82 (comment) -msgid "In two Voices, odd-numbered voices are under the top line" -msgstr "" - -#. Documentation/snippets/positioning-multi-measure-rests.ly:84 (comment) -msgid "Even-numbered voices are under the bottom line" -msgstr "" - -#. Documentation/snippets/positioning-multi-measure-rests.ly:86 (comment) -msgid "Multi-measure rests in both voices remain separate" -msgstr "" - -#. Documentation/snippets/positioning-multi-measure-rests.ly:89 (comment) -msgid "Separating multi-measure rests in more than two voices" -msgstr "" - -#. Documentation/snippets/positioning-multi-measure-rests.ly:90 (comment) -msgid "requires an override" -msgstr "" - -#. Documentation/snippets/positioning-multi-measure-rests.ly:96 (comment) -msgid "Using compressed bars in multiple voices requires another override" -msgstr "" - -#. Documentation/snippets/positioning-multi-measure-rests.ly:97 (comment) -msgid "in all voices to avoid multiple instances being printed" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:32 (comment) -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:53 (comment) -msgid "Set segno sign as rehearsal mark and adjust size if needed" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:33 (comment) -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:55 (comment) -msgid "\\once \\override Score.RehearsalMark #'font-size = #3" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:39 (comment) -msgid "Set coda sign as rehearsal mark and adjust size if needed" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:46 (comment) -msgid "Should Coda be on anew line?" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:47 (comment) -msgid "Coda NOT on new line: use \\nobreak" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:48 (comment) -msgid "Coda on new line: DON'T use \\nobreak" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:49 (comment) -msgid "\\noBreak" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:58 (comment) -msgid "Here begins the trickery!" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:59 (comment) -msgid "" -"\\cadenzaOn will suppress the bar count and \\stopStaff removes the staff " -"lines." -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:62 (comment) -msgid "Some examples of possible text-displays" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:64 (comment) -msgid "text line-aligned" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:65 (comment) -msgid "==================" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:66 (comment) -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:72 (comment) -msgid "Move text to the desired position" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:67 (comment) -msgid "\\once \\override TextScript #'extra-offset = #'( 2 . -3.5 )" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:68 (comment) -msgid "| s1*0^\\markup { D.S. al Coda } }" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:70 (comment) -msgid "text center-aligned" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:71 (comment) -msgid "====================" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:73 (comment) -msgid "\\once \\override TextScript #'extra-offset = #'( 6 . -5.0 )" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:74 (comment) -msgid "| s1*0^\\markup { \\center-column { D.S. \\\"al Coda\\\" } }" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:76 (comment) -msgid "text and symbols center-aligned" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:77 (comment) -msgid "===============================" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:78 (comment) -msgid "" -"Move text to the desired position and tweak spacing for optimum text " -"alignment" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:79 (comment) -msgid "\\once \\override TextScript #'extra-offset = #'( 8 . -5.5 )" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:85 (comment) -msgid "Increasing the unfold counter will expand the staff-free space" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:90 (comment) -msgid "Resume bar count and show staff lines again" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:94 (comment) -msgid "Should Coda be on new line?" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:95 (comment) -msgid "Coda NOT on new line: DON'T use \\break" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:96 (comment) -msgid "Coda on new line: use \\break" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:99 (comment) -msgid "Show up, you clef and key!" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:103 (comment) -msgid "Set coda sign as rehearsal mark and adjust size and position" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:105 (comment) -msgid "" -"Put the coda sign ontop of the (treble-)clef dependend on coda's line-" -"position" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:107 (comment) -msgid "Coda NOT on new line, use this:" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:108 (comment) -msgid "\\once \\override Score.RehearsalMark #'extra-offset = #'( -2 . 1.75 )" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:110 (comment) -msgid "Coda on new line, use this:" -msgstr "" - -#. Documentation/snippets/positioning-segno-and-coda-with-line-break.ly:116 (comment) -msgid "The coda" -msgstr "" - -#. Documentation/snippets/printing-bar-numbers-at-regular-intervals.ly:60 (comment) -msgid "Permit first bar number to be printed" -msgstr "" - -#. Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly:46 (comment) -msgid "Prevent bar numbers at the end of a line and permit them elsewhere" -msgstr "" - -#. Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly:53 (comment) -msgid "Draw a box round the following bar number(s)" -msgstr "" - -#. Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly:58 (comment) -msgid "Draw a circle round the following bar number(s)" -msgstr "" - -#. Documentation/snippets/printing-metronome-and-rehearsal-marks-below-the-staff.ly:58 (comment) -msgid "Metronome marks below the staff" -msgstr "" - -#. Documentation/snippets/printing-metronome-and-rehearsal-marks-below-the-staff.ly:63 (comment) -msgid "Rehearsal marks below the staff" -msgstr "" - -#. Documentation/snippets/printing-music-with-different-time-signatures.ly:60 (variable) -msgid "Bassklarinette" -msgstr "" - -#. Documentation/snippets/printing-music-with-different-time-signatures.ly:104 (variable) -msgid "Perkussion" -msgstr "" - -#. Documentation/snippets/putting-lyrics-inside-the-staff.ly:24 (context id) -msgid "voc" -msgstr "" - -#. Documentation/snippets/quoting-another-voice.ly:79 (variable) -msgid "quoteMe" -msgstr "" - -#. Documentation/snippets/quoting-another-voice.ly:84 (variable) -msgid "original" -msgstr "" - -#. Documentation/snippets/quoting-another-voice-with-transposition.ly:72 (variable) -msgid "quoteTest" -msgstr "" - -#. Documentation/snippets/quoting-another-voice-with-transposition.ly:73 (comment) -msgid "french horn" -msgstr "" - -#. Documentation/snippets/recorder-fingering-chart.ly:39 (comment) -msgid "range chart for paetzold contrabass recorder" -msgstr "" - -#. Documentation/snippets/redefining-grace-note-global-defaults.ly:69 (variable) -msgid "startAcciaccaturaMusic" -msgstr "" - -#. Documentation/snippets/redefining-grace-note-global-defaults.ly:75 (variable) -msgid "stopAcciaccaturaMusic" -msgstr "" - -#. Documentation/snippets/removing-the-first-empty-line.ly:84 (comment) -msgid "To use the setting globally, uncomment the following line:" -msgstr "" - -#. Documentation/snippets/removing-the-first-empty-line.ly:85 (comment) -msgid "\\override VerticalAxisGroup #'remove-first = ##t" -msgstr "" - -#. Documentation/snippets/removing-the-first-empty-line.ly:94 (comment) -msgid "To use the setting globally, comment this line," -msgstr "" - -#. Documentation/snippets/removing-the-first-empty-line.ly:95 (comment) -msgid "uncomment the line in the \\layout block above" -msgstr "" - -#. Documentation/snippets/reverting-default-beam-endings.ly:53 (comment) -msgid "Default beaming" -msgstr "" - -#. Documentation/snippets/reverting-default-beam-endings.ly:56 (comment) -msgid "Set new values for beam endings" -msgstr "" - -#. Documentation/snippets/rhythmic-slashes.ly:29 (comment) -msgid "Macro to print single slash" -msgstr "" - -#. Documentation/snippets/rhythmic-slashes.ly:30 (variable) -msgid "rs" -msgstr "" - -#. Documentation/snippets/rhythmic-slashes.ly:37 (comment) -msgid "Function to print a specified number of slashes" -msgstr "" - -#. Documentation/snippets/rhythmic-slashes.ly:38 (variable) -msgid "comp" -msgstr "" - -#. Documentation/snippets/rhythms-headword.ly:26 (comment) -msgid "Beethoven, Op. 81a" -msgstr "" - -#. Documentation/snippets/rhythms-headword.ly:27 (comment) -msgid "Piano sonata 26 - Das Lebewohl" -msgstr "" - -#. Documentation/snippets/rhythms-headword.ly:28 (comment) -msgid "Movt II - Abwesenheit" -msgstr "" - -#. Documentation/snippets/rhythms-headword.ly:29 (comment) -msgid "Measures 31 - 34" -msgstr "" - -#. Documentation/snippets/rhythms-headword.ly:36 (comment) -msgid "\\override SpacingSpanner #'strict-grace-spacing = ##t" -msgstr "" - -#. Documentation/snippets/satb-choir-template---four-staves.ly:57 (variable) -msgid "sopranonotes" -msgstr "" - -#. Documentation/snippets/satb-choir-template---four-staves.ly:60 (variable) -msgid "sopranowords" -msgstr "" - -#. Documentation/snippets/satb-choir-template---four-staves.ly:61 (variable) -msgid "altonotes" -msgstr "" - -#. Documentation/snippets/satb-choir-template---four-staves.ly:64 (variable) -msgid "altowords" -msgstr "" - -#. Documentation/snippets/satb-choir-template---four-staves.ly:65 (variable) -msgid "tenornotes" -msgstr "" - -#. Documentation/snippets/satb-choir-template---four-staves.ly:69 (variable) -msgid "tenorwords" -msgstr "" - -#. Documentation/snippets/satb-choir-template---four-staves.ly:70 (variable) -msgid "bassnotes" -msgstr "" - -#. Documentation/snippets/satb-choir-template---four-staves.ly:74 (variable) -msgid "basswords" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:65 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:72 (comment) -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:86 (comment) -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:102 (comment) -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:118 (comment) -msgid "verse" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:75 (variable) -msgid "NoStem" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:76 (variable) -msgid "NoNoteHead" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:77 (variable) -msgid "ZeroBeam" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:79 (variable) -msgid "staffTabLine" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:84 (comment) -msgid "" -"Shows one horizontal line. The vertical line (simulating a bar-line) is " -"simulated with a gridline" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:89 (comment) -msgid "" -"disable the following line to see the the noteheads while writing the song" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:93 (comment) -msgid "The beam between 8th-notes is used to draw the push-line" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:94 (comment) -msgid "How to fast write the push-lines:" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:95 (comment) -msgid "" -"1. write repeatedly 'c c c c c c c c |' for the whole length of the song" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:96 (comment) -msgid "2. uncomment the line \\NoNoteHead" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:97 (comment) -msgid "3. compile" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:98 (comment) -msgid "4. Mark the positions on which push/pull changes." -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:99 (comment) -msgid "" -"In the score-picture click on the position the push- or pull-part starts" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:100 (comment) -msgid "(on the noteHead, the cursor will change to a hand-icon)." -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:101 (comment) -msgid "The cursor in the source code will jump just at this position." -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:102 (comment) -msgid "a) If a push-part starts there, replace the 'c' by an 'e['" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:103 (comment) -msgid "b) If a pull-part starts there, replace the 'c' by an 's'" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:104 (comment) -msgid "5. Switch into 'overwrite-mode' by pressing the 'ins' key." -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:105 (comment) -msgid "6. For the pull-parts overwrite the 'c' with 's'" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:106 (comment) -msgid "7. For every push-part replace the last 'c' with 'e]'" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:107 (comment) -msgid "8. Switch into 'insert-mode' again" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:108 (comment) -msgid "" -"9. At last it should look lik e.g. (s s e[ c | c c c c c c c c | c c c c c c " -"e] s s)" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:109 (comment) -msgid "10. re-enable the line \\NoNoteHead" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:119 (comment) -msgid "Accordion melody in tabulator score" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:120 (comment) -msgid "1. Place a copy of the piano melody below" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:121 (comment) -#. Documentation/snippets/score-for-diatonic-accordion.ly:140 (comment) -msgid "" -"2. Separate piano melody into pull- and push-parts according to the " -"staffTabLine you've already made" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:122 (comment) -msgid "" -"3. For each line: Double the line. Remark the 1st one (Keeps unchanged as " -"reference) and then change the second line using the transformation paper" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:123 (comment) -msgid "or the macros 'conv2diaton push.bsh' and 'conv2diaton pull.bsh'" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:124 (comment) -#. Documentation/snippets/score-for-diatonic-accordion.ly:143 (comment) -msgid "Tips:" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:125 (comment) -#. Documentation/snippets/score-for-diatonic-accordion.ly:144 (comment) -msgid "- In jEdit Search & Replace mark the Option 'Keep Dialog'" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:127 (variable) -msgid "AccordionTabTwoCBesDur" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:128 (comment) -msgid "pull 1" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:129 (comment) -msgid "8 8 8 |" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:131 (comment) -msgid "push 2" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:132 (comment) -msgid "4 |" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:134 (comment) -msgid "pull 3" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:135 (comment) -msgid "2 r8 }" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:138 (variable) -msgid "AccordionTab" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:139 (comment) -msgid "1. Place a copy of the piano melody above" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:141 (comment) -msgid "" -"3. For each line: Double the line. Remark the 1st one (Keeps unchanged as " -"reference) and then" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:142 (comment) -msgid "change the second line using the transformation paper" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:145 (comment) -msgid "-" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:154 (comment) -msgid "The vertical line (simulating a bar-line) in" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:155 (comment) -msgid "the staffBassRhytm is a gridline" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:161 (comment) -msgid "4/4 - tact. How many beats per bar" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:162 (comment) -msgid "The following line has to be adjusted O-F-T-E-N." -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:171 (variable) -msgid "staffVoice" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:171 (context id) -msgid "astaffvoice" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:185 (variable) -msgid "staffAccordionMel" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:187 (comment) -msgid "Set the accidentals (Vorzeichen) for each note," -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:188 (comment) -msgid "do not remember them for the rest of the measure." -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:208 (variable) -msgid "BassRhytm" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:209 (variable) -msgid "LyricBassRhythmI" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:211 (variable) -msgid "staffBassRhytm" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:212 (context id) -msgid "staffbass" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:213 (comment) -msgid "" -"This is not a RhythmicStaff because it must be possible to append lyrics." -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:215 (comment) -msgid "x.y" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:217 (comment) -msgid "" -"Shows one horizontal line. The vertical line (simulating a bar-line) is " -"simulated by a grid" -msgstr "" - -#. Documentation/snippets/score-for-diatonic-accordion.ly:218 (comment) -msgid "Search for 'grid' in this page to find all related functions" -msgstr "" - -#. Documentation/snippets/setting-system-separators.ly:37 (variable) -msgid "notes" -msgstr "" - -#. Documentation/snippets/showing-the-same-articulation-above-and-below-a-note-or-chord.ly:26 (comment) -msgid "The same as \\flageolet, just a little smaller" -msgstr "" - -#. Documentation/snippets/showing-the-same-articulation-above-and-below-a-note-or-chord.ly:36 (comment) -msgid "The second fermata is ignored!" -msgstr "" - -#. Documentation/snippets/simultaneous-headword.ly:24 (comment) -msgid "NR 1.5 Simultaneous notes" -msgstr "" - -#. Documentation/snippets/simultaneous-headword.ly:26 (comment) -msgid "L. v. Beethoven, Op. 111" -msgstr "" - -#. Documentation/snippets/simultaneous-headword.ly:27 (comment) -msgid "Piano sonata 32" -msgstr "" - -#. Documentation/snippets/simultaneous-headword.ly:28 (comment) -msgid "Movt II - Arietta - Adagio molto semplice e cantabile" -msgstr "" - -#. Documentation/snippets/simultaneous-headword.ly:29 (comment) -msgid "measures 108 - 118" -msgstr "" - -#. Documentation/snippets/simultaneous-headword.ly:41 (variable) -msgid "trillFlat" -msgstr "" - -#. Documentation/snippets/simultaneous-headword.ly:61 (comment) -msgid "RH voice 1" -msgstr "" - -#. Documentation/snippets/simultaneous-headword.ly:138 (comment) -msgid "RH voice 2" -msgstr "" - -#. Documentation/snippets/simultaneous-headword.ly:213 (comment) -msgid "LH staff" -msgstr "" - -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:29 (variable) -msgid "verseI" -msgstr "" - -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:34 (variable) -msgid "verseII" -msgstr "" - -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:40 (comment) -msgid "insert chords for chordnames and fretboards here" -msgstr "" - -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:44 (variable) -msgid "staffMelody" -msgstr "" - -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:47 (comment) -msgid "Type notes for melody here" -msgstr "" - -#. Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly:57 (context id) -msgid "voiceMelody" -msgstr "" - -#. Documentation/snippets/slides-in-tablature.ly:44 (variable) -msgid "slides" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:34 (comment) -msgid "title = \\\"Le Lac des Cygnes\\\"" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:35 (comment) -msgid "subtitle = \\\"Danse Napolitaine\\\"" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:36 (comment) -msgid "composer = \\\"Piotr Ilitch Tchaïkovski\\\"" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:37 (comment) -msgid "arranger = \\\"arr. Laurence Sardain\\\"" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:38 (comment) -msgid "footer = \\\"Mutopia-2006/12/22-896\\\"" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:41 (variable) -msgid "trompette" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:53 (variable) -#. Documentation/snippets/staff-headword.ly:101 (context id) -#. Documentation/snippets/staff-headword.ly:119 (context id) -msgid "tambourin" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:62 (variable) -msgid "tambourinMidi" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:105 (context id) -msgid "prima" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:107 (context id) -msgid "uppera" -msgstr "" - -#. Documentation/snippets/staff-headword.ly:108 (context id) -msgid "lowera" -msgstr "" - -#. Documentation/snippets/stemlets.ly:39 (comment) -msgid "N.B. use Score.Stem to set for the whole score." -msgstr "" - -#. Documentation/snippets/string-number-extender-lines.ly:22 (variable) -msgid "stringNumberSpanner" -msgstr "" - -#. Documentation/snippets/string-quartet-template-simple.ly:66 (variable) -msgid "violinOne" -msgstr "" - -#. Documentation/snippets/string-quartet-template-simple.ly:75 (variable) -msgid "violinTwo" -msgstr "" - -#. Documentation/snippets/string-quartet-template-simple.ly:84 (variable) -msgid "viola" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:128 (comment) -msgid "piece.ly" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:129 (comment) -msgid "(This is the global definitions file)" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:136 (variable) -msgid "Violinone" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:141 (comment) -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:147 (comment) -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:154 (comment) -msgid "*********************************" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:142 (variable) -msgid "Violintwo" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:148 (variable) -msgid "Viola" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:155 (variable) -msgid "Cello" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:161 (comment) -msgid "**********************************" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:172 (comment) -msgid "These are the other files you need to save on your computer" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:174 (comment) -msgid "score.ly" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:175 (comment) -msgid "(This is the main file)" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:177 (comment) -msgid "uncomment the line below when using a separate file" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:178 (comment) -msgid "\\include \\\"piece.ly\\\"" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:187 (comment) -msgid "{ Uncomment this block when using separate files" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:189 (comment) -msgid "vn1.ly" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:190 (comment) -msgid "(This is the Violin 1 part file)" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:199 (comment) -msgid "vn2.ly" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:200 (comment) -msgid "(This is the Violin 2 part file)" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:209 (comment) -msgid "vla.ly" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:210 (comment) -msgid "(This is the Viola part file)" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:219 (comment) -msgid "vlc.ly" -msgstr "" - -#. Documentation/snippets/string-quartet-template-with-separate-parts.ly:220 (comment) -msgid "(This is the Cello part file)" -msgstr "" - -#. Documentation/snippets/subdividing-beams.ly:81 (comment) -msgid "Set beam sub-group length to an eighth note" -msgstr "" - -#. Documentation/snippets/subdividing-beams.ly:86 (comment) -msgid "Set beam sub-group length to a sixteenth note" -msgstr "" - -#. Documentation/snippets/suppressing-warnings-for-clashing-note-columns.ly:27 (variable) -#. Documentation/snippets/unfretted-headword.ly:59 (variable) -msgid "ignore" -msgstr "" - -#. Documentation/snippets/text-headword.ly:24 (comment) -msgid "NR 1.8 Text" -msgstr "" - -#. Documentation/snippets/text-headword.ly:26 (comment) -msgid "L. v. Beethoven, Op. 110" -msgstr "" - -#. Documentation/snippets/text-headword.ly:27 (comment) -msgid "Piano sonata 31" -msgstr "" - -#. Documentation/snippets/text-headword.ly:28 (comment) -msgid "measures 1 - 7" -msgstr "" - -#. Documentation/snippets/text-headword.ly:40 (comment) -msgid "RH staff" -msgstr "" - -#. Documentation/snippets/three-sided-box.ly:20 (comment) -msgid "New command to add a three sided box, with sides north, west and south" -msgstr "" - -#. Documentation/snippets/three-sided-box.ly:21 (comment) -msgid "Based on the box-stencil command defined in scm/stencil.scm" -msgstr "" - -#. Documentation/snippets/three-sided-box.ly:22 (comment) -msgid "Note that \\\";;\\\" is used to comment a line in Scheme" -msgstr "" - -#. Documentation/snippets/three-sided-box.ly:36 (comment) -msgid "The corresponding markup command, based on the \\box command defined" -msgstr "" - -#. Documentation/snippets/three-sided-box.ly:37 (comment) -msgid "in scm/define-markup-commands.scm" -msgstr "" - -#. Documentation/snippets/three-sided-box.ly:49 (comment) -msgid "Test it:" -msgstr "" - -#. Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly:59 (comment) -msgid "Change the style permanently" -msgstr "" - -#. Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly:65 (comment) -msgid "Revert to default style:" -msgstr "" - -#. Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly:69 (comment) -msgid "single-digit style only for the next time signature" -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:39 (comment) -msgid "make the staff lines invisible on staves" -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:128 (variable) -msgid "incipitDiscantus" -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:153 (variable) -msgid "incipitAltus" -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:179 (variable) -msgid "incipitTenor" -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:207 (variable) -msgid "incipitBassus" -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:233 (comment) -msgid "" -"StaffGroup is used instead of ChoirStaff to get bar lines between systems" -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:265 (comment) -msgid "Keep the bass lyrics outside of the staff group to avoid bar lines" -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:266 (comment) -msgid "between the lyrics." -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:275 (comment) -msgid "the next three instructions keep the lyrics between the bar lines" -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:290 (comment) -msgid "breaking also at those barlines where a note overlaps" -msgstr "" - -#. Documentation/snippets/transcription-of-ancient-music-with-incipit.ly:291 (comment) -msgid "into the next bar. The command is commented out in this" -msgstr "" - -#. Documentation/snippets/transposing-pitches-with-minimum-accidentals-smart-transpose.ly:167 (variable) -msgid "naturalizeMusic" -msgstr "" - -#. Documentation/snippets/tweaking-clef-properties.ly:154 (comment) -msgid "The default treble clef" -msgstr "" - -#. Documentation/snippets/tweaking-clef-properties.ly:156 (comment) -msgid "The standard bass clef" -msgstr "" - -#. Documentation/snippets/tweaking-clef-properties.ly:161 (comment) -msgid "The baritone clef" -msgstr "" - -#. Documentation/snippets/tweaking-clef-properties.ly:166 (comment) -msgid "The standard choral tenor clef" -msgstr "" - -#. Documentation/snippets/tweaking-clef-properties.ly:172 (comment) -msgid "A non-standard clef" -msgstr "" - -#. Documentation/snippets/tweaking-clef-properties.ly:178 (comment) -msgid "The following clef changes do not preserve" -msgstr "" - -#. Documentation/snippets/tweaking-clef-properties.ly:179 (comment) -msgid "the normal relationship between notes and clefs:" -msgstr "" - -#. Documentation/snippets/tweaking-clef-properties.ly:194 (comment) -msgid "Return to the normal clef:" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:43 (comment) -msgid "Abreviations" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:46 (variable) -msgid "db" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:47 (variable) -msgid "dub" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:48 (variable) -msgid "dubetc" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:50 (variable) -msgid "ub" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:51 (variable) -msgid "udb" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:52 (variable) -msgid "udbetc" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:54 (variable) -msgid "fermaTa" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:56 (variable) -msgid "accel" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:57 (variable) -msgid "ritar" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:63 (comment) -msgid "Strings" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:66 (variable) -msgid "svib" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:67 (variable) -msgid "pvib" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:68 (variable) -msgid "mvib" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:69 (variable) -msgid "sulp" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:70 (variable) -msgid "norm" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:72 (variable) -msgid "quatre" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:76 (comment) -msgid "Shifting Notes" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:79 (variable) -msgid "shift" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:80 (variable) -msgid "shifta" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:81 (variable) -msgid "shiftb" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:85 (comment) -msgid "Hairpin" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:88 (comment) -msgid "aniente = \\\"a niente\\\"" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:89 (variable) -msgid "aniente" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:96 (variable) -msgid "tupletbp" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:100 (comment) -msgid "Flag [Note Head - Stem]" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:103 (variable) -msgid "noflag" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:106 (comment) -msgid "Functions" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:121 (comment) -msgid "Instruments" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:124 (variable) -msgid "ViolinSolo" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:134 (comment) -msgid "Measure 1" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:144 (comment) -msgid "Measure 2" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:154 (comment) -msgid "Measure 3" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:162 (comment) -msgid "Measure 4" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:171 (comment) -msgid "Measure 5" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:179 (comment) -msgid "Measure 6" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:181 (comment) -msgid "\\featherDurations #(ly:make-moment 2 3)" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:188 (comment) -msgid "Measure 7" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:197 (comment) -msgid "Measure 8" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:202 (comment) -msgid "Measure 9" -msgstr "" - -#. Documentation/snippets/unfretted-headword.ly:213 (comment) -msgid "Score" -msgstr "" - -#. Documentation/snippets/using-alternative-flag-styles.ly:36 (variable) -msgid "testnotes" -msgstr "" - -#. Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly:116 (comment) -msgid "display grobs for each note head:" -msgstr "" - -#. Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly:117 (comment) -msgid "\\override NoteHead #'before-line-breaking = #display-grobs" -msgstr "" - -#. Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly:119 (comment) -msgid "or just for one:" -msgstr "" - -#. Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly:31 (variable) -msgid "parallelogram" -msgstr "" - -#. Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly:46 (variable) -msgid "myNoteHeads" -msgstr "" - -#. Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly:47 (variable) -msgid "normalNoteHeads" -msgstr "" - -#. Documentation/snippets/utf-8.ly:22 (comment) -msgid "end verbatim - this comment is a hack to prevent texinfo.tex" -msgstr "" - -#. Documentation/snippets/utf-8.ly:23 (comment) -msgid "from choking on non-European UTF-8 subsets" -msgstr "" - -#. Documentation/snippets/utf-8.ly:25 (comment) -msgid "Edit this file using a Unicode aware editor, such as GVIM, GEDIT, Emacs" -msgstr "" - -#. Documentation/snippets/utf-8.ly:43 (comment) -msgid "Cyrillic font" -msgstr "" - -#. Documentation/snippets/utf-8.ly:44 (variable) -msgid "bulgarian" -msgstr "" - -#. Documentation/snippets/utf-8.ly:48 (variable) -msgid "hebrew" -msgstr "" - -#. Documentation/snippets/utf-8.ly:52 (variable) -msgid "japanese" -msgstr "" - -#. Documentation/snippets/utf-8.ly:59 (comment) -msgid "\\\"a legal song to you\\\"" -msgstr "" - -#. Documentation/snippets/utf-8.ly:60 (variable) -msgid "portuguese" -msgstr "" - -#. Documentation/snippets/vertical-line-as-a-baroque-articulation-mark.ly:22 (variable) -msgid "upline" -msgstr "" - -#. Documentation/snippets/vertically-centered-common-lyrics.ly:23 (variable) -msgid "leftbrace" -msgstr "" - -#. Documentation/snippets/vertically-centered-common-lyrics.ly:24 (variable) -msgid "rightbrace" -msgstr "" - -#. Documentation/snippets/vertically-centered-common-lyrics.ly:26 (variable) -msgid "dropLyrics" -msgstr "" - -#. Documentation/snippets/vertically-centered-common-lyrics.ly:33 (variable) -msgid "raiseLyrics" -msgstr "" - -#. Documentation/snippets/vertically-centered-common-lyrics.ly:40 (variable) -msgid "skipFour" -msgstr "" - -#. Documentation/snippets/vertically-centered-common-lyrics.ly:42 (variable) -msgid "lyricsA" -msgstr "" - -#. Documentation/snippets/vertically-centered-common-lyrics.ly:44 (variable) -msgid "lyricsB" -msgstr "" - -#. Documentation/snippets/vertically-centered-common-lyrics.ly:45 (variable) -msgid "lyricsC" -msgstr "" - -#. Documentation/snippets/vertically-centered-common-lyrics.ly:46 (variable) -msgid "lyricsD" -msgstr "" - -#. Documentation/snippets/vertically-centered-common-lyrics.ly:53 (context id) -msgid "m" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template.ly:92 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:94 (variable) -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:74 (variable) -msgid "sopWords" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template.ly:120 (comment) -#. Documentation/snippets/vocal-ensemble-template.ly:135 (comment) -msgid "this is needed for lyrics above a staff" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:123 (comment) -#. Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly:132 (comment) -msgid "This is needed for lyrics above a staff" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:109 (comment) -msgid "we could remove the line about this with the line below, since" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:110 (comment) -msgid "we want the alto lyrics to be below the alto Voice anyway." -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:111 (comment) -msgid "\\new Lyrics \\lyricsto \\\"altos\\\" \\altoWords" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:122 (comment) -msgid "again, we could replace the line above this with the line below." -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly:123 (comment) -msgid "\\new Lyrics \\lyricsto \\\"basses\\\" \\bassWords" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:77 (comment) -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:90 (comment) -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:105 (comment) -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:121 (comment) -msgid "refrain" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:83 (variable) -msgid "SoloNotes" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:94 (variable) -msgid "SoloLyrics" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:99 (variable) -msgid "SopranoNotes" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:110 (variable) -msgid "SopranoLyrics" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:115 (variable) -msgid "BassNotes" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:126 (variable) -msgid "BassLyrics" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:133 (context id) -msgid "SoloVoice" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:137 (context id) -msgid "SopranoVoice" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:140 (context id) -msgid "BassVoice" -msgstr "" - -#. Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly:147 (comment) -msgid "these lines prevent empty staves from being printed" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:32 (comment) -msgid "L. van Beethoven. Symphony No. 9 in D minor, op.125; Finale" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:33 (comment) -msgid "mm. 216 -- 236" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:34 (comment) -msgid "Text: F. von Schiller" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:39 (comment) -msgid "make first bar number be shown" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:41 (comment) -msgid "\\tempo \\\"Presto\\\"" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:42 (comment) -msgid "\\compressFullBarRests R2.*8" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:64 (comment) -msgid "put fermata closer to staff" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:68 (comment) -msgid "\\time 4/4 \\tempo \\\"Allegro assai\\\"" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:69 (comment) -#. Documentation/snippets/vocal-headword.ly:71 (comment) -msgid "R1" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:70 (comment) -msgid "e''4^\\f d r2" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:72 (comment) -msgid "e4( ^\\f d2) a8([ g)]" -msgstr "" - -#. Documentation/snippets/vocal-headword.ly:78 (comment) -msgid "Freu -- de, Freu -- de,__" -msgstr "" - -#. Documentation/snippets/volta-multi-staff.ly:20 (variable) -msgid "voltaMusic" -msgstr "" - -#. Documentation/snippets/volta-text-markup-using-repeatcommands.ly:28 (variable) -msgid "voltaAdLib" -msgstr "" - -#. Documentation/snippets/wind-headword.ly:24 (comment) -msgid "Tchaikovsky" -msgstr "" - -#. Documentation/snippets/wind-headword.ly:25 (comment) -msgid "Nutcracker Suite, VII Dance of the Merlitons" -msgstr "" - msgid "Up:" msgstr "" diff --git a/Documentation/search-box.ihtml b/Documentation/search-box.ihtml index 0d09633e16..988033c8a6 100644 --- a/Documentation/search-box.ihtml +++ b/Documentation/search-box.ihtml @@ -9,11 +9,11 @@ search for a while and have a redirection from "v2.15" to "v2.17". diff --git a/Documentation/snippets.tely b/Documentation/snippets.tely index 2d30fa92ae..a6426b5f3f 100644 --- a/Documentation/snippets.tely +++ b/Documentation/snippets.tely @@ -8,7 +8,7 @@ @macro manualIntro This document shows a selected set of LilyPond snippets from the -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository} +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond Snippet Repository} (LSR). It is in the public domain. We would like to address many thanks to Sebastiano Vigna for maintaining diff --git a/Documentation/snippets/README b/Documentation/snippets/README index f91aacb1dd..48bd30b50e 100644 --- a/Documentation/snippets/README +++ b/Documentation/snippets/README @@ -1,5 +1,5 @@ This directory contains examples generated automatically from LSR -http://lsr.dsi.unimi.it/ +http://lsr.di.unimi.it/ To update this directory and find additional information, see the Contributor's Guide, section "LSR to Git". diff --git a/Documentation/snippets/accordion-discant-symbols.ly b/Documentation/snippets/accordion-discant-symbols.ly index 505bda3c57..0cecbfdc91 100644 --- a/Documentation/snippets/accordion-discant-symbols.ly +++ b/Documentation/snippets/accordion-discant-symbols.ly @@ -1,28 +1,27 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "keyboards, specific-notation, symbols-and-glyphs, workaround" texidoc = " This snippet has been obsoleted by predefined markup commands, see -@ruser{Accordion Registers}. It's still useful as a simple -demonstration of how to combine symbols: the placement of the symbols -added with @code{\\markup} can be tweaked by changing the -@code{\\translate-scaled} arguments. @code{\\translate-scaled} is -used here rather than @code{\\translate} in order to let the -positioning of the symbol parts adapt to changes of @code{font-size}. +'Accordion Registers' in the Notation Reference. It's still useful as +a simple demonstration of how to combine symbols: the placement of the +symbols added with @code{\\markup} can be tweaked by changing the +@code{\\translate-scaled} arguments. @code{\\translate-scaled} is used +here rather than @code{\\translate} in order to let the positioning of +the symbol parts adapt to changes of @code{font-size}. + " doctitle = "Accordion-discant symbols" } % begin verbatim - discant = \markup { \musicglyph #"accordion.discant" } diff --git a/Documentation/snippets/accordion-register-symbols.ly b/Documentation/snippets/accordion-register-symbols.ly new file mode 100644 index 0000000000..deba1eeb93 --- /dev/null +++ b/Documentation/snippets/accordion-register-symbols.ly @@ -0,0 +1,46 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "keyboards, specific-notation, symbols-and-glyphs" + + texidoc = " +Accordion register symbols are available as @code{\\markup} as well as +as standalone music events (as register changes tend to occur between +actual music events. Bass registers are not overly standardized. The +available commands can be found in 'Accordion Registers' in the +Notation Reference. + +" + doctitle = "Accordion register symbols" +} % begin verbatim + +#(use-modules (scm accreg)) + +\new PianoStaff +<< + \new Staff \relative { + \clef treble \discant "10" r8 s32 f'[ bes f] s e[ a e] s d[ g d] s16 e32[ a] + << + { r16 r r } + \\ + { d r a r bes r } + >> | + 1 + } + \new Staff \relative { + \clef treble \freeBass "1" r8 d'32 s16. c32 s16. bes32 s16. a32[ cis] s16 + \clef bass \stdBass "Master" + << + { r16 ^"b" r ^"am" r ^"gm" | + 1^"a" } + \\ + { d8_"D" c_"C" bes_"B" | a1_"A" } + >> + } +>> diff --git a/Documentation/snippets/accordion-registers.ly b/Documentation/snippets/accordion-registers.ly deleted file mode 100644 index 00df0215a7..0000000000 --- a/Documentation/snippets/accordion-registers.ly +++ /dev/null @@ -1,40 +0,0 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.23 -\version "2.17.23" - -\header { - lsrtags = "keyboards, specific-notation, symbols-and-glyphs" - - texidoc = "Accordion register symbols are available as -@code{\\markup} as well as as standalone music events (as register -changes tend to occur between actual music events. Bass registers are -not overly standardized. The available commands can be found in -@ruser{Accordion Registers}." - - doctitle = "Accordion register symbols" -} % begin verbatim - - -\layout { ragged-right = ##t } - -#(use-modules (scm accreg)) - -\new PianoStaff -<< - \new Staff \relative - { \clef treble \discant "10" r8 s32 f'[ bes f] s e[ a e] s d[ g d] s16 e32[ a] - << { r16 r r } \\ { d r a r bes r } >> | 1 } - \new Staff \relative - { \clef treble \freeBass "1" r8 d'32 s16. c32 s16. bes32 s16. a32[ cis] s16 - \clef bass \stdBass "Master" - << { r16 ^"b" r ^"am" r ^"gm" | - 1^"a" } \\ - { d8_"D" c_"C" bes_"B" | a1_"A" } - >> - } ->> diff --git a/Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly b/Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly index d0e13e5adc..35f23de0a5 100644 --- a/Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly +++ b/Documentation/snippets/adding-a-figured-bass-above-or-below-the-notes.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "ancient-notation, chords, contexts-and-engravers" @@ -14,10 +13,10 @@ When writing a figured bass, you can place the figures above or below the bass notes, by defining the @code{BassFigureAlignmentPositioning.direction} property (exclusively -in a @code{Staff} context). Choices are @code{#UP} (or @code{#1}), +in a @code{Staff} context). Choices are @code{#UP} (or @code{#1}), @code{#CENTER} (or @code{#0}) and @code{#DOWN} (or @code{#-1}). -This property can be changed as many times as you wish. Use +This property can be changed as many times as you wish. Use @code{\\once \\override} if you don't want the override to apply to the whole score. @@ -25,13 +24,12 @@ whole score. doctitle = "Adding a figured bass above or below the notes" } % begin verbatim - - bass = { \clef bass g4 b, c d e d8 c d2 } + continuo = \figuremode { <_>4 <6>4 <5/>4 \override Staff.BassFigureAlignmentPositioning.direction = #UP @@ -42,6 +40,7 @@ continuo = \figuremode { %\bassFigureStaffAlignmentDown <4>4. <4>8 <_+>4 } + \score { << \new Staff = bassStaff \bass diff --git a/Documentation/snippets/adding-ambitus-per-voice.ly b/Documentation/snippets/adding-ambitus-per-voice.ly index 6f05ed94ed..5223ba116e 100644 --- a/Documentation/snippets/adding-ambitus-per-voice.ly +++ b/Documentation/snippets/adding-ambitus-per-voice.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "pitches, staff-notation, vocal-music" @@ -17,7 +17,6 @@ manually to prevent collisions. doctitle = "Adding ambitus per voice" } % begin verbatim - \new Staff << \new Voice \with { \consists "Ambitus_engraver" diff --git a/Documentation/snippets/adding-an-extra-staff-at-a-line-break.ly b/Documentation/snippets/adding-an-extra-staff-at-a-line-break.ly index f4a9963b3f..ef1d5ad8ae 100644 --- a/Documentation/snippets/adding-an-extra-staff-at-a-line-break.ly +++ b/Documentation/snippets/adding-an-extra-staff-at-a-line-break.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.30" +\version "2.18.0" \header { lsrtags = "breaks, contexts-and-engravers, staff-notation, workaround" @@ -21,7 +21,6 @@ workaround is to add a setting of doctitle = "Adding an extra staff at a line break" } % begin verbatim - \score { \new StaffGroup \relative c'' { \new Staff diff --git a/Documentation/snippets/adding-an-extra-staff.ly b/Documentation/snippets/adding-an-extra-staff.ly index 430371a644..7bf2674b7a 100644 --- a/Documentation/snippets/adding-an-extra-staff.ly +++ b/Documentation/snippets/adding-an-extra-staff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.30" +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, really-simple, staff-notation" @@ -17,7 +17,6 @@ piece. doctitle = "Adding an extra staff" } % begin verbatim - \score { << \new Staff \relative c'' { diff --git a/Documentation/snippets/adding-an-ottava-marking-to-a-single-voice.ly b/Documentation/snippets/adding-an-ottava-marking-to-a-single-voice.ly index fce68d84b7..99971e914a 100644 --- a/Documentation/snippets/adding-an-ottava-marking-to-a-single-voice.ly +++ b/Documentation/snippets/adding-an-ottava-marking-to-a-single-voice.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "pitches, tweaks-and-overrides" diff --git a/Documentation/snippets/adding-bar-lines-to-chordnames-context.ly b/Documentation/snippets/adding-bar-lines-to-chordnames-context.ly index ee14a8aff5..893733a42d 100644 --- a/Documentation/snippets/adding-bar-lines-to-chordnames-context.ly +++ b/Documentation/snippets/adding-bar-lines-to-chordnames-context.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "chords, specific-notation" @@ -17,11 +17,11 @@ To add bar line indications in the @code{ChordNames} context, add the doctitle = "Adding bar lines to ChordNames context" } % begin verbatim - \new ChordNames \with { \override BarLine.bar-extent = #'(-2 . 2) \consists "Bar_engraver" } + \chordmode { f1:maj7 f:7 bes:7 } diff --git a/Documentation/snippets/adding-beams,-slurs,-ties-etc.-when-using-tuplet-and-non-tuplet-rhythms.ly b/Documentation/snippets/adding-beams,-slurs,-ties-etc.-when-using-tuplet-and-non-tuplet-rhythms.ly index 5912d2d8aa..e295281286 100644 --- a/Documentation/snippets/adding-beams,-slurs,-ties-etc.-when-using-tuplet-and-non-tuplet-rhythms.ly +++ b/Documentation/snippets/adding-beams,-slurs,-ties-etc.-when-using-tuplet-and-non-tuplet-rhythms.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "expressive-marks, rhythms" @@ -24,7 +24,6 @@ sections (enclosed within curly braces). doctitle = "Adding beams slurs ties etc. when using tuplet and non-tuplet rhythms" } % begin verbatim - { r16[ g16 \tuplet 3/2 { r16 e'8] } g16( a \tuplet 3/2 { b d e') } diff --git a/Documentation/snippets/adding-drum-parts.ly b/Documentation/snippets/adding-drum-parts.ly index 7f354029fe..7ce432bcfc 100644 --- a/Documentation/snippets/adding-drum-parts.ly +++ b/Documentation/snippets/adding-drum-parts.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "percussion, preparing-parts, really-simple, rhythms, specific-notation" @@ -21,10 +21,18 @@ lines is possible. doctitle = "Adding drum parts" } % begin verbatim - -drh = \drummode { cymc4.^"crash" hhc16^"h.h." hh hhc8 hho hhc8 hh16 hh hhc4 r4 r2 } -drl = \drummode { bd4 sn8 bd bd4 << bd ss >> bd8 tommh tommh bd toml toml bd tomfh16 tomfh } -timb = \drummode { timh4 ssh timl8 ssh r timh r4 ssh8 timl r4 cb8 cb } +drh = \drummode { + cymc4.^"crash" hhc16^"h.h." hh hhc8 hho hhc8 hh16 hh + hhc4 r4 r2 + } +drl = \drummode { + bd4 sn8 bd bd4 << bd ss >> + bd8 tommh tommh bd toml toml bd tomfh16 tomfh + } +timb = \drummode { + timh4 ssh timl8 ssh r timh r4 + ssh8 timl r4 cb8 cb + } \score { << diff --git a/Documentation/snippets/adding-extra-fingering-with-scheme.ly b/Documentation/snippets/adding-extra-fingering-with-scheme.ly index 9e3f6072cb..c93557a36b 100644 --- a/Documentation/snippets/adding-extra-fingering-with-scheme.ly +++ b/Documentation/snippets/adding-extra-fingering-with-scheme.ly @@ -1,29 +1,28 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.19.22" \header { lsrtags = "scheme-language" texidoc = " -You can add additional elements to notes using @code{map-some-music}. In this -example, an extra script is attached to a note. +You can add additional elements to notes using @code{map-some-music}. +In this example, an extra script is attached to a note. In general, first do a @code{\\displayMusic} of the music you want to create, then write a function that will work on the appropriate parts of the music for you. + " doctitle = "Adding extra fingering with scheme" } % begin verbatim - addScript = -#(define-music-function (parser location script music) +#(define-music-function (script music) (ly:event? ly:music?) (map-some-music (lambda (mus) diff --git a/Documentation/snippets/adding-fingerings-to-a-score.ly b/Documentation/snippets/adding-fingerings-to-a-score.ly index 0d32b04f1c..6231619a91 100644 --- a/Documentation/snippets/adding-fingerings-to-a-score.ly +++ b/Documentation/snippets/adding-fingerings-to-a-score.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "editorial-annotations, fretted-strings, really-simple" @@ -16,7 +16,6 @@ Fingering instructions can be entered using a simple syntax. doctitle = "Adding fingerings to a score" } % begin verbatim - \relative c'' { c4-1 d-2 f-4 e-3 } diff --git a/Documentation/snippets/adding-fingerings-to-tablatures.ly b/Documentation/snippets/adding-fingerings-to-tablatures.ly index af261ba71d..1ff5fc74fd 100644 --- a/Documentation/snippets/adding-fingerings-to-tablatures.ly +++ b/Documentation/snippets/adding-fingerings-to-tablatures.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings, specific-notation" @@ -17,8 +17,6 @@ and @code{\\finger}. doctitle = "Adding fingerings to tablatures" } % begin verbatim - - one = \markup { \finger 1 } two = \markup { \finger 2 } threeTwo = \markup { diff --git a/Documentation/snippets/adding-indicators-to-staves-which-get-split-after-a-break.ly b/Documentation/snippets/adding-indicators-to-staves-which-get-split-after-a-break.ly index 80df7dc6d0..4faff7b0bb 100644 --- a/Documentation/snippets/adding-indicators-to-staves-which-get-split-after-a-break.ly +++ b/Documentation/snippets/adding-indicators-to-staves-which-get-split-after-a-break.ly @@ -1,19 +1,20 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "staff-notation, symbols-and-glyphs, vocal-music" texidoc = " -This snippet defines the @code{\\splitStaffBarLine} command, which adds -arrows in north-east and south-east directions at a bar line, to denote -that several voices sharing a staff will each continue on a staff of -their own in the next system. +This snippet defines the @code{\\splitStaffBarLine}, +@code{convUpStaffBarLine} and @code{convDownStaffBarLine} commands. +These add arrows at a bar line, to denote that several voices sharing a +staff will each continue on a staff of their own in the next system, or +that voices split in this way recombine. " doctitle = "Adding indicators to staves which get split after a break" @@ -22,77 +23,159 @@ their own in the next system. #(define-markup-command (arrow-at-angle layout props angle-deg length fill) (number? number? boolean?) (let* ( - ;; PI-OVER-180 and degrees->radians are taken from flag-styles.scm - (PI-OVER-180 (/ (atan 1 1) 45)) - (degrees->radians (lambda (degrees) (* degrees PI-OVER-180))) - (angle-rad (degrees->radians angle-deg)) - (target-x (* length (cos angle-rad))) - (target-y (* length (sin angle-rad)))) + (PI-OVER-180 (/ (atan 1 1) 34)) + (degrees->radians (lambda (degrees) (* degrees PI-OVER-180))) + (angle-rad (degrees->radians angle-deg)) + (target-x (* length (cos angle-rad))) + (target-y (* length (sin angle-rad)))) (interpret-markup layout props - (markup - #:translate (cons (/ target-x 2) (/ target-y 2)) - #:rotate angle-deg - #:translate (cons (/ length -2) 0) - #:concat (#:draw-line (cons length 0) - #:arrow-head X RIGHT fill))))) + (markup + #:translate (cons (/ target-x 2) (/ target-y 2)) + #:rotate angle-deg + #:translate (cons (/ length -2) 0) + #:concat (#:draw-line (cons length 0) + #:arrow-head X RIGHT fill))))) + splitStaffBarLineMarkup = \markup \with-dimensions #'(0 . 0) #'(0 . 0) { \combine - \arrow-at-angle #45 #(sqrt 8) ##f - \arrow-at-angle #-45 #(sqrt 8) ##f + \arrow-at-angle #45 #(sqrt 8) ##t + \arrow-at-angle #-45 #(sqrt 8) ##t } splitStaffBarLine = { \once \override Staff.BarLine.stencil = - #(lambda (grob) - (ly:stencil-combine-at-edge - (ly:bar-line::print grob) - X RIGHT - (grob-interpret-markup grob splitStaffBarLineMarkup) - 0)) + #(lambda (grob) + (ly:stencil-combine-at-edge + (ly:bar-line::print grob) + X RIGHT + (grob-interpret-markup grob splitStaffBarLineMarkup) + 0)) + \break +} + +convDownStaffBarLine = { + \once \override Staff.BarLine.stencil = + #(lambda (grob) + (ly:stencil-combine-at-edge + (ly:bar-line::print grob) + X RIGHT + (grob-interpret-markup grob #{ + \markup\with-dimensions #'(0 . 0) #'(0 . 0) { + \translate #'(0 . -.13)\arrow-at-angle #-45 #(sqrt 8) ##t + }#}) + 0)) + \break +} + +convUpStaffBarLine = { + \once \override Staff.BarLine.stencil = + #(lambda (grob) + (ly:stencil-combine-at-edge + (ly:bar-line::print grob) + X RIGHT + (grob-interpret-markup grob #{ + \markup\with-dimensions #'(0 . 0) #'(0 . 0) { + \translate #'(0 . .14)\arrow-at-angle #45 #(sqrt 8) ##t + }#}) + 0)) \break } + \paper { ragged-right = ##t - short-indent = 5\mm + short-indent = 10\mm +} + +separateSopranos = { + \set Staff.instrumentName = "AI AII" + \set Staff.shortInstrumentName = "AI AII" + \splitStaffBarLine + \change Staff = "up" +} +convSopranos = { + \convDownStaffBarLine + \change Staff = "shared" + \set Staff.instrumentName = "S A" + \set Staff.shortInstrumentName = "S A" +} + +sI = { + \voiceOne + \repeat unfold 4 f''2 + \separateSopranos + \repeat unfold 4 g''2 + \convSopranos + \repeat unfold 4 c''2 +} +sII = { + s1*2 + \voiceTwo + \change Staff = "up" + \repeat unfold 4 d''2 +} +aI = { + \voiceTwo + \repeat unfold 4 a'2 + \voiceOne + \repeat unfold 4 b'2 + \convUpStaffBarLine + \voiceTwo + \repeat unfold 4 g'2 +} +aII = { + s1*2 + \voiceTwo + \repeat unfold 4 g'2 +} +ten = { + \voiceOne + \repeat unfold 4 c'2 + \repeat unfold 4 d'2 + \repeat unfold 4 c'2 +} +bas = { + \voiceTwo + \repeat unfold 4 f2 + \repeat unfold 4 g2 + \repeat unfold 4 c2 } \score { << \new ChoirStaff << - \new Staff \with { instrumentName = #"High I + II" } { - << - \repeat unfold 4 f''1 - \\ - \repeat unfold 4 d''1 - >> - \splitStaffBarLine - } - \new Staff \with { instrumentName = #"Low" } { - << - \repeat unfold 4 b'1 - \\ - \repeat unfold 4 g'1 - >> + \new Staff = up \with { + instrumentName = "SI SII" + shortInstrumentName = "SI SII" + } { + s1*4 } - \new Staff \with { shortInstrumentName = #"H I" } { - R1*4 - \repeat unfold 2 { r4 f''2 r4 } \repeat unfold 2 e''1 - } - \new Staff \with { shortInstrumentName = #"H II" } { - R1*4 - \repeat unfold 4 b'2 \repeat unfold 2 c''1 - } - \new Staff \with { shortInstrumentName = #"L" } { - R1*4 - << - \repeat unfold 4 g'1 - \\ - \repeat unfold 4 c'1 - >> + \new Staff = shared \with { + instrumentName = "S A" + shortInstrumentName = "S A" + } << + \new Voice = sopI \sI + \new Voice = sopII \sII + \new Voice = altI \aI + \new Voice = altII \aII + >> + \new Lyrics \with { + alignBelowContext = up } + \lyricsto sopII { e f g h } + \new Lyrics \lyricsto altI { a b c d e f g h i j k l } + + \new Staff = men \with { + instrumentName = "T B" + shortInstrumentName = "T B" + } << + \clef F + \new Voice = ten \ten + \new Voice = bas \bas + >> + \new Lyrics \lyricsto bas { a b c d e f g h i j k l } >> >> \layout { diff --git a/Documentation/snippets/adding-links-to-objects.ly b/Documentation/snippets/adding-links-to-objects.ly index a2d214337d..16db39cfc1 100644 --- a/Documentation/snippets/adding-links-to-objects.ly +++ b/Documentation/snippets/adding-links-to-objects.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, scheme-language, tweaks-and-overrides" @@ -22,10 +22,6 @@ The linked objects are colored with a separate command. doctitle = "Adding links to objects" } % begin verbatim -% Code by Thomas Morley -% Contributed by harm6 -% Tested with 2.14.2 up to 2.17.9 - #(define (add-link url-strg) (lambda (grob) (let* ((stil (ly:grob-property grob 'stencil))) @@ -35,7 +31,8 @@ The linked objects are colored with a separate command. (x-ext (ly:stencil-extent stil X)) (y-ext (ly:stencil-extent stil Y)) (url-expr (list 'url-link url-strg `(quote ,x-ext) `(quote ,y-ext))) - (new-stil (ly:stencil-add (ly:make-stencil url-expr x-ext y-ext) stil))) + (new-stil (ly:stencil-add + (ly:make-stencil url-expr x-ext y-ext) stil))) (ly:grob-set-property! grob 'stencil new-stil))) #f)))) diff --git a/Documentation/snippets/adding-markups-in-a-tablature.ly b/Documentation/snippets/adding-markups-in-a-tablature.ly new file mode 100644 index 0000000000..a751f70739 --- /dev/null +++ b/Documentation/snippets/adding-markups-in-a-tablature.ly @@ -0,0 +1,48 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "editorial-annotations, fretted-strings, text, tweaks-and-overrides" + + texidoc = " +By default markups does not show in a tablature. To make them appear, +simply use the command @code{\\revert TabStaff.TextScript.stencil} + +" + doctitle = "Adding markups in a tablature" +} % begin verbatim + +%% http://lsr.di.unimi.it/LSR/Item?id=919 +% by P.P.Schneider on June 2014 + +high = { r4 r8 q r8 r4 } + +low = { c4 r4 c8 r8 g,8 b, } + +pulse = { s8^"1" s^"&" s^"2" s^"&" s^"3" s^"&" s^"4" s^"&" } + +\score { + \new TabStaff { + \repeat unfold 2 << \high \\ \low \\ \pulse >> + } + \layout { + \context { + \TabStaff + \clef moderntab + \revert TextScript.stencil + \override TextScript.font-series = #'bold + \override TextScript.font-size = #-2 + \override TextScript.color = #red + + } + \context { + \Score + proportionalNotationDuration = #(ly:make-moment 1/8) + } + } +} diff --git a/Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly b/Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly index 92c4fc31e5..a03e901d16 100644 --- a/Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly +++ b/Documentation/snippets/adding-orchestral-cues-to-a-vocal-score.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.19.22" \header { lsrtags = "staff-notation, vocal-music" @@ -26,10 +25,9 @@ can be cued, but they cannot overlap each other in time. doctitle = "Adding orchestral cues to a vocal score" } % begin verbatim - cueWhile = #(define-music-function - (parser location instrument name dir music) + (instrument name dir music) (string? string? ly:dir? ly:music?) #{ \cueDuring $instrument #dir { diff --git a/Documentation/snippets/adding-parentheses-around-an-expressive-mark-or-chordal-note.ly b/Documentation/snippets/adding-parentheses-around-an-expressive-mark-or-chordal-note.ly index 05b4e9ba07..151b11cfa5 100644 --- a/Documentation/snippets/adding-parentheses-around-an-expressive-mark-or-chordal-note.ly +++ b/Documentation/snippets/adding-parentheses-around-an-expressive-mark-or-chordal-note.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, workaround" @@ -18,7 +18,6 @@ objects in parentheses. The associated grob is @code{ParenthesesItem}. doctitle = "Adding parentheses around an expressive mark or chordal note" } % begin verbatim - \relative c' { c2-\parenthesize -> \override ParenthesesItem.padding = #0.1 diff --git a/Documentation/snippets/adding-the-current-date-to-a-score.ly b/Documentation/snippets/adding-the-current-date-to-a-score.ly index 32fd66cdfd..9b79e4f447 100644 --- a/Documentation/snippets/adding-the-current-date-to-a-score.ly +++ b/Documentation/snippets/adding-the-current-date-to-a-score.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "really-cool, scheme-language, text, titles" @@ -17,7 +17,6 @@ score. doctitle = "Adding the current date to a score" } % begin verbatim - % first, define a variable to hold the formatted date: date = #(strftime "%d-%m-%Y" (localtime (current-time))) diff --git a/Documentation/snippets/adding-timing-marks-to-long-glissandi.ly b/Documentation/snippets/adding-timing-marks-to-long-glissandi.ly index 0cbcfeb719..3b4472e9bd 100644 --- a/Documentation/snippets/adding-timing-marks-to-long-glissandi.ly +++ b/Documentation/snippets/adding-timing-marks-to-long-glissandi.ly @@ -1,28 +1,26 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.30 -\version "2.17.30" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "expressive-marks, staff-notation, tweaks-and-overrides" texidoc = " -Skipped beats in very long glissandi are sometimes indicated by -timing marks, often consisting of stems without noteheads. Such -stems can also be used to carry intermediate expression markings. +Skipped beats in very long glissandi are sometimes indicated by timing +marks, often consisting of stems without noteheads. Such stems can +also be used to carry intermediate expression markings. -If the stems do not align well with the glissando, they may need to -be repositioned slightly. -" +If the stems do not align well with the glissando, they may need to be +repositioned slightly. +" doctitle = "Adding timing marks to long glissandi" } % begin verbatim - glissandoSkipOn = { \override NoteColumn.glissando-skip = ##t \hide NoteHead diff --git a/Documentation/snippets/adding-volta-brackets-to-additional-staves.ly b/Documentation/snippets/adding-volta-brackets-to-additional-staves.ly index fc0d3673d1..1826ea194d 100644 --- a/Documentation/snippets/adding-volta-brackets-to-additional-staves.ly +++ b/Documentation/snippets/adding-volta-brackets-to-additional-staves.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "repeats" @@ -20,7 +20,6 @@ should appear; see also the @qq{Volta multi staff} snippet. doctitle = "Adding volta brackets to additional staves" } % begin verbatim - << \new Staff { \repeat volta 2 { c'1 } \alternative { c' } } \new Staff { \repeat volta 2 { c'1 } \alternative { c' } } diff --git a/Documentation/snippets/additional-voices-to-avoid-collisions.ly b/Documentation/snippets/additional-voices-to-avoid-collisions.ly index e8d2f55187..7587f35e48 100644 --- a/Documentation/snippets/additional-voices-to-avoid-collisions.ly +++ b/Documentation/snippets/additional-voices-to-avoid-collisions.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "simultaneous-notes" diff --git a/Documentation/snippets/adjusting-grace-note-spacing.ly b/Documentation/snippets/adjusting-grace-note-spacing.ly index d442d817ec..69e2658b3c 100644 --- a/Documentation/snippets/adjusting-grace-note-spacing.ly +++ b/Documentation/snippets/adjusting-grace-note-spacing.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -17,7 +17,6 @@ The space given to grace notes can be adjusted using the doctitle = "Adjusting grace note spacing" } % begin verbatim - graceNotes = { \grace { c4 c8 c16 c32 } c8 diff --git a/Documentation/snippets/adjusting-lyrics-vertical-spacing.ly b/Documentation/snippets/adjusting-lyrics-vertical-spacing.ly index e7bcf160f1..472e089ef5 100644 --- a/Documentation/snippets/adjusting-lyrics-vertical-spacing.ly +++ b/Documentation/snippets/adjusting-lyrics-vertical-spacing.ly @@ -1,13 +1,13 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { - lsrtags = "correction-wanted, spacing, text, vocal-music, workaround" + lsrtags = "spacing, text, tweaks-and-overrides, vocal-music, workaround" texidoc = " This snippet shows how to bring the lyrics line closer to the staff. @@ -34,7 +34,8 @@ This snippet shows how to bring the lyrics line closer to the staff. } % Reducing the minimum space below the staff and above the lyrics: \new Lyrics \with { - \override VerticalAxisGroup.nonstaff-relatedstaff-spacing = #'((basic-distance . 1)) + \override VerticalAxisGroup.nonstaff-relatedstaff-spacing = + #'((basic-distance . 1)) } \lyricsto melody { aa aa aa aa aa aa aa aa aa } >> diff --git a/Documentation/snippets/adjusting-the-shape-of-falls-and-doits.ly b/Documentation/snippets/adjusting-the-shape-of-falls-and-doits.ly index 6b0b03478d..89f013ced6 100644 --- a/Documentation/snippets/adjusting-the-shape-of-falls-and-doits.ly +++ b/Documentation/snippets/adjusting-the-shape-of-falls-and-doits.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks" diff --git a/Documentation/snippets/aligning-and-centering-instrument-names.ly b/Documentation/snippets/aligning-and-centering-instrument-names.ly index b67aeac03a..4aa325956f 100644 --- a/Documentation/snippets/aligning-and-centering-instrument-names.ly +++ b/Documentation/snippets/aligning-and-centering-instrument-names.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "paper-and-layout, text, titles" @@ -20,7 +20,6 @@ and the following systems, respectively. doctitle = "Aligning and centering instrument names" } % begin verbatim - \paper { left-margin = 3\cm } diff --git a/Documentation/snippets/aligning-bar-numbers.ly b/Documentation/snippets/aligning-bar-numbers.ly index 321f4cb3d7..c65d4fa4af 100644 --- a/Documentation/snippets/aligning-bar-numbers.ly +++ b/Documentation/snippets/aligning-bar-numbers.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -19,7 +19,6 @@ positioned directly over the bar line or left-aligned to the bar line. doctitle = "Aligning bar numbers" } % begin verbatim - \relative c' { \set Score.currentBarNumber = #111 \override Score.BarNumber.break-visibility = #all-visible diff --git a/Documentation/snippets/aligning-objects-created-with-the--mark-command.ly b/Documentation/snippets/aligning-objects-created-with-the--mark-command.ly index c25eccd8a1..dac50af89f 100644 --- a/Documentation/snippets/aligning-objects-created-with-the--mark-command.ly +++ b/Documentation/snippets/aligning-objects-created-with-the--mark-command.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "text" @@ -17,7 +17,6 @@ This behavior can be modified to align at right or left. doctitle = "Aligning objects created with the \\mark command" } % begin verbatim - \relative c' { c1 \mark "(Center)" c1 diff --git a/Documentation/snippets/aligning-syllables-with-melisma.ly b/Documentation/snippets/aligning-syllables-with-melisma.ly index 7acef57d56..1fd2703869 100644 --- a/Documentation/snippets/aligning-syllables-with-melisma.ly +++ b/Documentation/snippets/aligning-syllables-with-melisma.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.19.2" \header { lsrtags = "text, vocal-music" @@ -29,7 +29,7 @@ their note. The alignment can be altered using the c d~^\markup "reset to default" d e } } - \new Lyrics \lyricsto "vocal" \lyricmode { + \new Lyrics \lyricsto "vocal" { word word word \set lyricMelismaAlignment = #RIGHT word word word diff --git a/Documentation/snippets/allowing-fingerings-to-be-printed-inside-the-staff.ly b/Documentation/snippets/allowing-fingerings-to-be-printed-inside-the-staff.ly index d4a211ffe5..3afb47f27a 100644 --- a/Documentation/snippets/allowing-fingerings-to-be-printed-inside-the-staff.ly +++ b/Documentation/snippets/allowing-fingerings-to-be-printed-inside-the-staff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, fretted-strings, spacing, specific-notation" @@ -18,7 +18,6 @@ chord construct <>, even if it is only a single note. doctitle = "Allowing fingerings to be printed inside the staff" } % begin verbatim - \relative c' { 2 \override Fingering.staff-padding = #'() diff --git a/Documentation/snippets/altering-the-length-of-beamed-stems.ly b/Documentation/snippets/altering-the-length-of-beamed-stems.ly index 719aa97ea1..4a35b1c8cd 100644 --- a/Documentation/snippets/altering-the-length-of-beamed-stems.ly +++ b/Documentation/snippets/altering-the-length-of-beamed-stems.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "pitches, tweaks-and-overrides" @@ -22,7 +22,6 @@ of the final argument. Non-integer arguments may also be used. doctitle = "Altering the length of beamed stems" } % begin verbatim - \relative c'' { \override Stem.details.beamed-lengths = #'(2) a8[ a] a16[ a] a32[ a] diff --git a/Documentation/snippets/alternative-bar-numbering.ly b/Documentation/snippets/alternative-bar-numbering.ly index 017551b62b..f69ecd3391 100644 --- a/Documentation/snippets/alternative-bar-numbering.ly +++ b/Documentation/snippets/alternative-bar-numbering.ly @@ -1,20 +1,22 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "editorial-annotations, staff-notation, tweaks-and-overrides" - texidoc = "Two alternative methods for bar numbering can be set, - especially for when using repeated music." + + texidoc = " +Two alternative methods for bar numbering can be set, especially for +when using repeated music. + +" doctitle = "Alternative bar numbering" } % begin verbatim - \relative c'{ \set Score.alternativeNumberingStyle = #'numbers \repeat volta 3 { c4 d e f | } diff --git a/Documentation/snippets/alternative-breve-notes.ly b/Documentation/snippets/alternative-breve-notes.ly index d735931c31..cb104d169f 100644 --- a/Documentation/snippets/alternative-breve-notes.ly +++ b/Documentation/snippets/alternative-breve-notes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, rhythms" diff --git a/Documentation/snippets/ambitus-with-multiple-voices.ly b/Documentation/snippets/ambitus-with-multiple-voices.ly index 229d08a66a..df6ccf010c 100644 --- a/Documentation/snippets/ambitus-with-multiple-voices.ly +++ b/Documentation/snippets/ambitus-with-multiple-voices.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "pitches, vocal-music" @@ -18,7 +18,6 @@ voices. doctitle = "Ambitus with multiple voices" } % begin verbatim - \new Staff \with { \consists "Ambitus_engraver" } diff --git a/Documentation/snippets/ambitus.ly b/Documentation/snippets/ambitus.ly index 0111acda59..0d5e38b43b 100644 --- a/Documentation/snippets/ambitus.ly +++ b/Documentation/snippets/ambitus.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "pitches, vocal-music" @@ -20,7 +20,6 @@ Accidentals only show up if they are not part of the key signature. doctitle = "Ambitus" } % begin verbatim - \layout { \context { \Voice diff --git a/Documentation/snippets/analysis-brackets-above-the-staff.ly b/Documentation/snippets/analysis-brackets-above-the-staff.ly index 02a153baf7..f823565e62 100644 --- a/Documentation/snippets/analysis-brackets-above-the-staff.ly +++ b/Documentation/snippets/analysis-brackets-above-the-staff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, really-simple, tweaks-and-overrides" @@ -18,13 +18,13 @@ staff instead. doctitle = "Analysis brackets above the staff" } % begin verbatim - \layout { \context { \Voice \consists "Horizontal_bracket_engraver" } } + \relative c'' { \once \override HorizontalBracket.direction = #UP c2\startGroup diff --git a/Documentation/snippets/ancient-fonts.ly b/Documentation/snippets/ancient-fonts.ly index e0d6f54f92..70537f2681 100644 --- a/Documentation/snippets/ancient-fonts.ly +++ b/Documentation/snippets/ancient-fonts.ly @@ -1,24 +1,22 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "ancient-notation, symbols-and-glyphs" texidoc = " -Shown here are many (all?) of the symbols that are included in -LilyPond's support for ancient notation. +Shown here are many of the symbols that are included in LilyPond's +ancient notation. + " doctitle = "Ancient fonts" } % begin verbatim - upperStaff = \new VaticanaStaff = "upperStaff" << \context VaticanaVoice << \transpose c c { @@ -31,7 +29,6 @@ upperStaff = \new VaticanaStaff = "upperStaff" << \override NoteHead.style = #'vaticana.inclinatum a! b ces' \bar "|" - % \break % 1 (8*1) \override NoteHead.style = #'vaticana.quilisma b! des'! ges! fes! @@ -42,7 +39,6 @@ upperStaff = \new VaticanaStaff = "upperStaff" << \override NoteHead.style = #'vaticana.reverse.plica c d \bar "|" - % \break %2 (8*1) \override NoteHead.style = #'vaticana.punctum.cavum es f @@ -54,7 +50,6 @@ upperStaff = \new VaticanaStaff = "upperStaff" << g f \override NoteHead.style = #'vaticana.linea.punctum \once \override Staff.BarLine.bar-extent = #'(-1 . 1) \bar "|" - % \break % 3 (8*1) es d \override NoteHead.style = #'vaticana.epiphonus @@ -62,14 +57,15 @@ upperStaff = \new VaticanaStaff = "upperStaff" << \override NoteHead.style = #'vaticana.cephalicus es f - \override Staff.KeySignature.glyph-name-alist = #alteration-medicaea-glyph-name-alist - \override Staff.Accidental.glyph-name-alist = #alteration-medicaea-glyph-name-alist + \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" ces des \bar "|" - % \break % 4 (8*1) e! f! ges \clef "medicaea-do2" @@ -78,21 +74,21 @@ upperStaff = \new VaticanaStaff = "upperStaff" << \override NoteHead.style = #'medicaea.virga b! a! \bar "|" - % \break % 5 (8*1) ges fes \clef "medicaea-fa1" \override NoteHead.style = #'medicaea.rvirga e des ces - \override Staff.KeySignature.glyph-name-alist = #alteration-hufnagel-glyph-name-alist - \override Staff.Accidental.glyph-name-alist = #alteration-hufnagel-glyph-name-alist + \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" ces des es \bar "|" - % \break % 6 (8*1) fes ges \clef "hufnagel-do2" @@ -101,17 +97,14 @@ upperStaff = \new VaticanaStaff = "upperStaff" << \override NoteHead.style = #'hufnagel.virga bes! as! \bar "|" - % \break % 7 (8*1) ges! fes! \clef "hufnagel-do-fa" \override NoteHead.style = #'hufnagel.punctum es! des ces des! es! fes! \bar "||" - % \break % 8 (8*1) s32*1 - % \break % 12 (32*1) } >> >> @@ -126,12 +119,10 @@ lowerStaff = \new MensuralStaff = "lowerStaff" << \clef "neomensural-c2" cis1 \bar "|" - % \break % 2 (16*1) \[ g\breve dis''\longa \] b\breve \[ a\longa d\longa \] \clef "petrucci-c2" - % \break % 4 (16*1) fis1 ces1 \clef "petrucci-c2" @@ -140,7 +131,6 @@ lowerStaff = \new MensuralStaff = "lowerStaff" << \clef "mensural-c2" r\breve \bar "|" - % \break % 5 (8*1) r2 \clef "mensural-g" @@ -155,7 +145,6 @@ lowerStaff = \new MensuralStaff = "lowerStaff" << \clef "petrucci-f" r\breve \bar "|" - % \break % 6 (8*1) r\breve \clef "mensural-f" @@ -165,18 +154,15 @@ lowerStaff = \new MensuralStaff = "lowerStaff" << \clef "mensural-f" e\breve f g a1 \clef "mensural-g" - % \break % 7 (8*1) \[ bes'!\longa a'!\longa c''!\longa \] e'1 d' c' d' \bar "|" \bar "|" - % \break % 9 (16*1) bes'!\longa fis'!1 as'!1 ges'!\longa % lig \set Staff.forceClef = ##t \clef "mensural-g" e'2 d' c' \bar "|" - % \break % 11 (16*1) \set Staff.forceClef = ##t \clef "petrucci-g" @@ -187,7 +173,6 @@ lowerStaff = \new MensuralStaff = "lowerStaff" << \set Staff.forceClef = ##t \clef "mensural-g" es'! des'! cis'!1 \bar "||" - % \break % 12 (8*1) } >> >> @@ -203,7 +188,6 @@ lowerStaff = \new MensuralStaff = "lowerStaff" << >> \layout { indent = 0.0 - line-width = 17.25\cm \context { \Score timing = ##f @@ -218,14 +202,16 @@ lowerStaff = \new MensuralStaff = "lowerStaff" << \context { \MensuralStaff \revert BarLine.transparent - \override KeySignature.glyph-name-alist = #alteration-mensural-glyph-name-alist + \override KeySignature.glyph-name-alist = + #alteration-mensural-glyph-name-alist clefGlyph = #"clefs.petrucci.c2" } \context { \VaticanaStaff \revert BarLine.transparent \override StaffSymbol.thickness = #2.0 - \override KeySignature.glyph-name-alist = #alteration-vaticana-glyph-name-alist + \override KeySignature.glyph-name-alist = + #alteration-vaticana-glyph-name-alist \override Custos.neutral-position = #4 } } diff --git a/Documentation/snippets/ancient-headword.ly b/Documentation/snippets/ancient-headword.ly index a0117699c4..4b02168205 100644 --- a/Documentation/snippets/ancient-headword.ly +++ b/Documentation/snippets/ancient-headword.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "headword" diff --git a/Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly b/Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly index fbab93e75f..afffd25ad0 100644 --- a/Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly +++ b/Documentation/snippets/ancient-notation-template----modern-transcription-of-gregorian-music.ly @@ -1,14 +1,13 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.30 -\version "2.17.30" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { - lsrtags = "vocal-music, ancient-notation, template" + lsrtags = "ancient-notation, template, vocal-music" texidoc = " This example demonstrates how to do modern transcription of Gregorian @@ -20,7 +19,6 @@ length. doctitle = "Ancient notation template -- modern transcription of gregorian music" } % begin verbatim - \include "gregorian.ly" chant = \relative c' { diff --git a/Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly b/Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly deleted file mode 100644 index f9867cb5d6..0000000000 --- a/Documentation/snippets/ancient-notation-template----modern-transcription-of-mensural-music.ly +++ /dev/null @@ -1,251 +0,0 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.17.30" - -\header { - lsrtags = "ancient-notation, real-music, really-cool, template" - - texidoc = " -When transcribing mensural music, an incipit at the beginning of the -piece is useful to indicate the original key and tempo. While today -musicians are used to bar lines in order to faster recognize rhythmic -patterns, bar lines were not yet invented during the period of mensural -music; in fact, the meter often changed after every few notes. As a -compromise, bar lines are often printed between the staves rather than -on the staves. - -" - doctitle = "Ancient notation template -- modern transcription of mensural music" -} % begin verbatim - - -global = { - \set Score.skipBars = ##t - - % incipit - \once \hide Score.SystemStartBracket - % Set tight spacing - \override Score.SpacingSpanner.spacing-increment = #1.0 - \key f \major - \time 2/2 - \once \override Staff.TimeSignature.style = #'neomensural - \override Voice.NoteHead.style = #'neomensural - \override Voice.Rest.style = #'neomensural - \set Staff.printKeyCancellation = ##f - \cadenzaOn % turn off bar lines - \skip 1*10 - \once \override Staff.BarLine.transparent = ##f - \bar "||" - \skip 1*1 % need this extra \skip such that clef change comes - % after bar line - \bar "" - - % main - \cadenzaOff % turn bar lines on again - \once \override Staff.Clef.full-size-change = ##t - \set Staff.forceClef = ##t - \key g \major - \time 4/4 - \override Voice.NoteHead.style = #'default - \override Voice.Rest.style = #'default - - % Setting printKeyCancellation back to #t must not - % occur in the first bar after the incipit. Dto. for forceClef. - % Therefore, we need an extra \skip. - \skip 1*1 - \set Staff.printKeyCancellation = ##t - \set Staff.forceClef = ##f - - \skip 1*7 % the actual music - - % let finis bar go through all staves - \override Staff.BarLine.transparent = ##f - - % finis bar - \bar "|." -} - -discantusNotes = { - \transpose c' c'' { - \set Staff.instrumentName = #"Discantus " - - % incipit - \clef "neomensural-c1" - c'1. s2 % two bars - \skip 1*8 % eight bars - \skip 1*1 % one bar - - % main - \clef "treble" - d'2. d'4 | - b e' d'2 | - c'4 e'4.( d'8 c' b | - a4) b a2 | - b4.( c'8 d'4) c'4 | - \once \hide NoteHead c'1 | - b\breve | - } -} - -discantusLyrics = \lyricmode { - % incipit - IV- - - % main - Ju -- bi -- | - la -- te De -- | - o, om -- - nis ter -- | - ra, __ om- | - "..." | - -us. | -} - -altusNotes = { - \transpose c' c'' { - \set Staff.instrumentName = #"Altus " - - % incipit - \clef "neomensural-c3" - r1 % one bar - f1. s2 % two bars - \skip 1*7 % seven bars - \skip 1*1 % one bar - - % main - \clef "treble" - r2 g2. e4 fis g | % two bars - a2 g4 e | - fis g4.( fis16 e fis4) | - g1 | - \once \hide NoteHead g1 | - g\breve | - } -} - -altusLyrics = \lyricmode { - % incipit - IV- - - % main - Ju -- bi -- la -- te | % two bars - De -- o, om -- | - nis ter -- ra, | - "..." | - -us. | -} - -tenorNotes = { - \transpose c' c' { - \set Staff.instrumentName = #"Tenor " - - % incipit - \clef "neomensural-c4" - r\longa % four bars - r\breve % two bars - r1 % one bar - c'1. s2 % two bars - \skip 1*1 % one bar - \skip 1*1 % one bar - - % main - \clef "treble_8" - R1 | - R1 | - R1 | - r2 d'2. d'4 b e' | % two bars - \once \hide NoteHead e'1 | - d'\breve | - } -} - -tenorLyrics = \lyricmode { - % incipit - IV- - - % main - Ju -- bi -- la -- te | % two bars - "..." | - -us. | -} - -bassusNotes = { - \transpose c' c' { - \set Staff.instrumentName = #"Bassus " - - % incipit - \clef "bass" - r\maxima % eight bars - f1. s2 % two bars - \skip 1*1 % one bar - - % main - \clef "bass" - R1 | - R1 | - R1 | - R1 | - g2. e4 | - \once \hide NoteHead e1 | - g\breve | - } -} - -bassusLyrics = \lyricmode { - % incipit - IV- - - % main - Ju -- bi- | - "..." | - -us. | -} - -\score { - \new StaffGroup = choirStaff << - \new Voice = - "discantusNotes" << \global \discantusNotes >> - \new Lyrics = - "discantusLyrics" \lyricsto discantusNotes { \discantusLyrics } - \new Voice = - "altusNotes" << \global \altusNotes >> - \new Lyrics = - "altusLyrics" \lyricsto altusNotes { \altusLyrics } - \new Voice = - "tenorNotes" << \global \tenorNotes >> - \new Lyrics = - "tenorLyrics" \lyricsto tenorNotes { \tenorLyrics } - \new Voice = - "bassusNotes" << \global \bassusNotes >> - \new Lyrics = - "bassusLyrics" \lyricsto bassusNotes { \bassusLyrics } - >> - \layout { - \context { - \Score - - % no bars in staves - \hide BarLine - - % incipit should not start with a start delimiter - \remove "System_start_delimiter_engraver" - } - \context { - \Voice - - % no slurs - \hide Slur - - % The command below can be commented out in - % short scores, but especially for large scores you - % will typically yield better line breaking and improve - % overall spacing if you do not comment the command out. - - \remove "Forbid_line_break_engraver" - } - } -} diff --git a/Documentation/snippets/ancient-notation.snippet-list b/Documentation/snippets/ancient-notation.snippet-list index 79f96b4454..93be5c69db 100644 --- a/Documentation/snippets/ancient-notation.snippet-list +++ b/Documentation/snippets/ancient-notation.snippet-list @@ -1,12 +1,11 @@ adding-a-figured-bass-above-or-below-the-notes.ly ancient-fonts.ly ancient-notation-template----modern-transcription-of-gregorian-music.ly -ancient-notation-template----modern-transcription-of-mensural-music.ly ancient-time-signatures.ly chant-or-psalms-notation.ly custodes.ly incipit.ly mensurstriche-layout-bar-lines-between-the-staves.ly rest-styles.ly -transcription-of-ancient-music-with-incipit.ly +using-tags-to-produce-mensural-and-modern-music-from-the-same-source.ly vertical-line-as-a-baroque-articulation-mark.ly diff --git a/Documentation/snippets/ancient-time-signatures.ly b/Documentation/snippets/ancient-time-signatures.ly index 84e12ce3dc..1fb3e32a4a 100644 --- a/Documentation/snippets/ancient-time-signatures.ly +++ b/Documentation/snippets/ancient-time-signatures.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "ancient-notation" @@ -18,7 +18,6 @@ Time signatures may also be engraved in an old style. doctitle = "Ancient time signatures" } % begin verbatim - { \override Staff.TimeSignature.style = #'neomensural s1 diff --git a/Documentation/snippets/anglican-psalm-template.ly b/Documentation/snippets/anglican-psalm-template.ly index 81f5816c0a..252138644d 100644 --- a/Documentation/snippets/anglican-psalm-template.ly +++ b/Documentation/snippets/anglican-psalm-template.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "template, vocal-music" @@ -19,7 +19,6 @@ more possibilities. doctitle = "Anglican psalm template" } % begin verbatim - SopranoMusic = \relative g' { g1 | c2 b | a1 | \bar "||" a1 | d2 c | c b | c1 | \bar "||" diff --git a/Documentation/snippets/applying-note-head-styles-depending-on-the-step-of-the-scale.ly b/Documentation/snippets/applying-note-head-styles-depending-on-the-step-of-the-scale.ly index 8cefbedea7..a340ac0028 100644 --- a/Documentation/snippets/applying-note-head-styles-depending-on-the-step-of-the-scale.ly +++ b/Documentation/snippets/applying-note-head-styles-depending-on-the-step-of-the-scale.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "editorial-annotations, pitches" diff --git a/Documentation/snippets/arabic-improvisation.ly b/Documentation/snippets/arabic-improvisation.ly index 3d1708e455..60b3b0ae83 100644 --- a/Documentation/snippets/arabic-improvisation.ly +++ b/Documentation/snippets/arabic-improvisation.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "world-music" @@ -20,7 +20,6 @@ of what could be the start of a hijaz improvisation: doctitle = "Arabic improvisation" } % begin verbatim - \include "arabic.ly" \relative sol' { diff --git a/Documentation/snippets/arranging-separate-lyrics-on-a-single-line.ly b/Documentation/snippets/arranging-separate-lyrics-on-a-single-line.ly new file mode 100644 index 0000000000..f3fa10eb30 --- /dev/null +++ b/Documentation/snippets/arranging-separate-lyrics-on-a-single-line.ly @@ -0,0 +1,71 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "paper-and-layout, vocal-music" + + texidoc = " +Sometimes you may want to put lyrics for different performers on a +single line: where there is rapidly alternating text, for example. +This snippet shows how this can be done with @code{\\override +VerticalAxisGroup.nonstaff-nonstaff-spacing.minimum-distance = ##f}. + +" + doctitle = "Arranging separate lyrics on a single line" +} % begin verbatim + +\layout { + \context { + \Lyrics + \override VerticalAxisGroup.nonstaff-nonstaff-spacing.minimum-distance = ##f + } +} + +aliceSings = \markup { \smallCaps "Alice" } +eveSings = \markup { \smallCaps "Eve" } + +<< + \new Staff << + \new Voice = "alice" { + f'4^\aliceSings g' r2 | + s1 | + f'4^\aliceSings g' r2 | + s1 | \break + % ... + + \voiceOne + s2 a'8^\aliceSings a' b'4 | + \oneVoice + g'1 + } + \new Voice = "eve" { + s1 | + a'2^\eveSings g' | + s1 | + a'2^\eveSings g' + % ... + + \voiceTwo + f'4^\eveSings a'8 g' f'4 e' | + \oneVoice + s1 + } + >> + \new Lyrics \lyricsto "alice" { + may -- be + sec -- ond + % ... + Shut up, you fool! + } + \new Lyrics \lyricsto "eve" { + that the + words are + % ... + …and then I was like– + } +>> diff --git a/Documentation/snippets/asymmetric-slurs.ly b/Documentation/snippets/asymmetric-slurs.ly index 2ff6e85ab8..eda9c7fb29 100644 --- a/Documentation/snippets/asymmetric-slurs.ly +++ b/Documentation/snippets/asymmetric-slurs.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" @@ -17,7 +17,6 @@ better. doctitle = "Asymmetric slurs" } % begin verbatim - slurNotes = { d,8( a' d f a f' d, a) } \relative c' { diff --git a/Documentation/snippets/automatic-beam-subdivisions.ly b/Documentation/snippets/automatic-beam-subdivisions.ly index 40e9e04d68..926a1729e5 100644 --- a/Documentation/snippets/automatic-beam-subdivisions.ly +++ b/Documentation/snippets/automatic-beam-subdivisions.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.19.40" \header { lsrtags = "automatic-notation, connecting-notes, rhythms" @@ -35,10 +35,10 @@ specified in @code{baseMoment}). >> \oneVoice \set baseMoment = #(ly:make-moment 1/8) - \set beatStructure = #'(2 2 2 2) + \set beatStructure = 2,2,2,2 b32^"baseMoment 1 8"[ a g f c' b a g] \set baseMoment = #(ly:make-moment 1/16) - \set beatStructure = #'(4 4 4 4) + \set beatStructure = 4,4,4,4 b32^"baseMoment 1 16"[ a g f c' b a g] } } diff --git a/Documentation/snippets/automatically-change-durations.ly b/Documentation/snippets/automatically-change-durations.ly index 5f5f7c05e3..de773e60c0 100644 --- a/Documentation/snippets/automatically-change-durations.ly +++ b/Documentation/snippets/automatically-change-durations.ly @@ -1,24 +1,23 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "rhythms" texidoc = " -shiftDurations can be used to change the note lengths of a -piece of music. It takes two arguments - the scaling factor as a power -of two, and the number of dots to be added as a positive integer. +@code{shiftDurations} can be used to change the note lengths of a piece +of music. It takes two arguments - the scaling factor as a power of +two, and the number of dots to be added as a positive integer. " doctitle = "Automatically change durations" } % begin verbatim - \paper { indent = 0 } music = \relative c'' { a1 b2 c4 d8 r } diff --git a/Documentation/snippets/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.ly b/Documentation/snippets/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.ly index 6ff6b99856..4f7a59cae6 100644 --- a/Documentation/snippets/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.ly +++ b/Documentation/snippets/automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, pitches" @@ -20,15 +20,15 @@ Voice context and overriding the @code{neutral-direction} of Stem. \relative c'' { \time 3/4 - \autoBeamOff a8 b g f b g | - c b d c b c + c b d c b c | } \layout { \context { \Voice \consists "Melody_engraver" + \autoBeamOff \override Stem.neutral-direction = #'() } } diff --git a/Documentation/snippets/avoiding-collisions-with-chord-fingerings.ly b/Documentation/snippets/avoiding-collisions-with-chord-fingerings.ly index 9af5fffa99..f522582080 100644 --- a/Documentation/snippets/avoiding-collisions-with-chord-fingerings.ly +++ b/Documentation/snippets/avoiding-collisions-with-chord-fingerings.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "chords, editorial-annotations, rhythms, tweaks-and-overrides" @@ -20,7 +20,6 @@ overridden. doctitle = "Avoiding collisions with chord fingerings" } % begin verbatim - \relative c' { \set fingeringOrientations = #'(up) \set stringNumberOrientations = #'(up) @@ -32,12 +31,11 @@ overridden. 8 8 - % Corrected to avoid collisions + % No tweak needed r8 - \override Fingering.add-stem-support = ##t 8 - \override StringNumber.add-stem-support = ##t 8 + % Corrected to avoid collisions \override StrokeFinger.add-stem-support = ##t 8 } diff --git a/Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly b/Documentation/snippets/bar-chords-notation-for-guitar-with-text-spanner.ly similarity index 79% rename from Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly rename to Documentation/snippets/bar-chords-notation-for-guitar-with-text-spanner.ly index a1e7232187..d0028da2a8 100644 --- a/Documentation/snippets/bar-chords-notation-for-guitar--with-text-spanner.ly +++ b/Documentation/snippets/bar-chords-notation-for-guitar-with-text-spanner.ly @@ -1,25 +1,28 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "chords, fretted-strings" texidoc = " -Here is how to print bar chords, or half-bar chords (just uncomment the -appropriate line for to select either one). +Here is how to print bar chords (or barre chords) or half-bar chords +(just uncomment the appropriate line for to select either one). The +syntax is : @code{\\bbarre #'fret_number' note(s)} + + + + + -The syntax is @code{\\bbarre #\"@var{fret number}\" @{ notes @} }. " doctitle = "Bar chords notation for Guitar (with Text Spanner)" } % begin verbatim - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %%%%%%% Cut here ----- Start 'bbarred.ly' @@ -59,8 +62,8 @@ bbarre = (padding . 0.25) (attach-dir . 2))) %% uncomment this line for make full barred - % \once \override TextSpanner.bound-details.left.text = \markup { "B" #str } - $music + % \once \override TextSpanner.bound-details.left.text = \markup{"B" #str} + $music #}) %% %%%%%%% Cut here ----- End 'bbarred.ly' diff --git a/Documentation/snippets/beam-endings-in-score-context.ly b/Documentation/snippets/beam-endings-in-score-context.ly index a09e8853d0..c517b35ecf 100644 --- a/Documentation/snippets/beam-endings-in-score-context.ly +++ b/Documentation/snippets/beam-endings-in-score-context.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.19.40" \header { lsrtags = "rhythms" @@ -18,19 +18,18 @@ levels: doctitle = "Beam endings in Score context" } % begin verbatim - \relative c'' { \time 5/4 % Set default beaming for all staves \set Score.baseMoment = #(ly:make-moment 1/8) - \set Score.beatStructure = #'(3 4 3) + \set Score.beatStructure = 3,4,3 << \new Staff { c8 c c c c c c c c c } \new Staff { % Modify beaming for just this staff - \set Staff.beatStructure = #'(6 4) + \set Staff.beatStructure = 6,4 c8 c c c c c c c c c } \new Staff { @@ -43,7 +42,7 @@ levels: % Modify beaming for this voice only \new Voice { \voiceTwo - \set Voice.beatStructure = #'(6 4) + \set Voice.beatStructure = 6,4 a8 a a a a a a a a a } >> diff --git a/Documentation/snippets/beam-grouping-in-7-8-time.ly b/Documentation/snippets/beam-grouping-in-7-8-time.ly deleted file mode 100644 index 5d77375ddc..0000000000 --- a/Documentation/snippets/beam-grouping-in-7-8-time.ly +++ /dev/null @@ -1,28 +0,0 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.16.0" - -\header { - lsrtags = "rhythms" - - texidoc = " -There are no default automatic beam groupings specified for 7/8 time, -so if automatic beams are required the grouping must be specified using -beatStructure. For example, to group all beams 2-3-2 in -7/8 time, specify beam endings at 2/8 and 5/8: - -" - doctitle = "Beam grouping in 7/8 time" -} % begin verbatim - -\relative c'' { - \time 7/8 - % rhythm 2-3-2 - a8 a a a a a a - \set Score.beatStructure = #'(2 3 2) - a8 a a a a a a -} diff --git a/Documentation/snippets/beams-across-line-breaks.ly b/Documentation/snippets/beams-across-line-breaks.ly index 1b60a49d41..755e676815 100644 --- a/Documentation/snippets/beams-across-line-breaks.ly +++ b/Documentation/snippets/beams-across-line-breaks.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -17,7 +17,6 @@ behavior can be changed as shown: doctitle = "Beams across line breaks" } % begin verbatim - \relative c'' { \override Beam.breakable = ##t c8 c[ c] c[ c] c[ c] c[ \break diff --git a/Documentation/snippets/blanking-staff-lines-using-the--whiteout-command.ly b/Documentation/snippets/blanking-staff-lines-using-the--whiteout-command.ly index c9139bafb1..6e49f9e5ec 100644 --- a/Documentation/snippets/blanking-staff-lines-using-the--whiteout-command.ly +++ b/Documentation/snippets/blanking-staff-lines-using-the--whiteout-command.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, really-cool, text" @@ -18,8 +18,10 @@ white box will not overlap any other grob. doctitle = "Blanking staff lines using the \\whiteout command" } % begin verbatim +\layout { + ragged-right = ##f +} -\layout { ragged-right = ##f } \relative c' { \override TextScript.extra-offset = #'(2 . 4) c2-\markup { \whiteout \pad-markup #0.5 "middle C" } c diff --git a/Documentation/snippets/book-parts.ly b/Documentation/snippets/book-parts.ly index 52f1e4b469..07c4822696 100644 --- a/Documentation/snippets/book-parts.ly +++ b/Documentation/snippets/book-parts.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "paper-and-layout" @@ -19,7 +19,6 @@ with the book last page. doctitle = "Book parts" } % begin verbatim - #(set-default-paper-size "a6") \book { diff --git a/Documentation/snippets/breathing-signs.ly b/Documentation/snippets/breathing-signs.ly index c1af6d24da..f19e650a3c 100644 --- a/Documentation/snippets/breathing-signs.ly +++ b/Documentation/snippets/breathing-signs.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, symbols-and-glyphs" @@ -17,7 +17,6 @@ ticks, vees and @qq{railroad tracks} (caesura). doctitle = "Breathing signs" } % begin verbatim - \new Staff \relative c'' { \key es \major \time 3/4 @@ -30,7 +29,8 @@ ticks, vees and @qq{railroad tracks} (caesura). % rvarcomma and lvarcomma are variations of the default rcomma and lcomma % N.B.: must use Staff context here, since we start a Voice below - \override Staff.BreathingSign.text = \markup { \musicglyph #"scripts.rvarcomma" } + \override Staff.BreathingSign.text = + \markup { \musicglyph #"scripts.rvarcomma" } << { g4 as g } \\ { es4 \breathe bes es } >> | % vee @@ -38,7 +38,8 @@ ticks, vees and @qq{railroad tracks} (caesura). es8[ d es f g] \breathe f | % caesura - \override BreathingSign.text = \markup { \musicglyph #"scripts.caesura.curved" } + \override BreathingSign.text = + \markup { \musicglyph #"scripts.caesura.curved" } es8[ d] \breathe es[ f g f] | es2 r4 \bar "||" } diff --git a/Documentation/snippets/broken-crescendo-hairpin.ly b/Documentation/snippets/broken-crescendo-hairpin.ly index 68960a5840..8272553331 100644 --- a/Documentation/snippets/broken-crescendo-hairpin.ly +++ b/Documentation/snippets/broken-crescendo-hairpin.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.27 -\version "2.17.27" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "contemporary-notation, expressive-marks, symbols-and-glyphs" @@ -13,21 +12,21 @@ texidoc = " In order to make parts of a crescendo hairpin invisible, the following method is used: A white rectangle is drawn on top of the respective -part of the crescendo hairpin, making it invisible. +part of the crescendo hairpin, making it invisible. The rectangle is +defined as postscript code within a text markup. -The markup command @code{with-dimensions} tells LilyPond to consider only -the bottom edge of the rectangle when spacing it against the hairpin. -The property @code{staff-padding} prevents the rectangle from fitting -between the hairpin and staff. +The markup command @code{with-dimensions} tells LilyPond to consider +only the bottom edge of the rectangle when spacing it against the +hairpin. The property @code{staff-padding} prevents the rectangle from +fitting between the hairpin and staff. -Make sure to put the hairpin in a lower layer than the text markup to -draw the rectangle over the hairpin. +Make sure the hairpin is in a lower layer than the text markup to draw +the rectangle over the hairpin. " doctitle = "Broken Crescendo Hairpin" } % begin verbatim - \relative c' { << { @@ -44,7 +43,7 @@ draw the rectangle over the hairpin. des16_\markup \with-dimensions #'(2 . 7) #'(0 . 0) \with-color #white \filled-box #'(2 . 7) #'(0 . 2) #0 - r8. des4 ~ des16->\sff + r8. des4 ~ des16->\sff r8. } >> } diff --git a/Documentation/snippets/caesura-railtracks-with-fermata.ly b/Documentation/snippets/caesura-railtracks-with-fermata.ly index c42000b8af..219fa11bf9 100644 --- a/Documentation/snippets/caesura-railtracks-with-fermata.ly +++ b/Documentation/snippets/caesura-railtracks-with-fermata.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, symbols-and-glyphs, tweaks-and-overrides" @@ -18,15 +18,16 @@ pleasing combination of railtracks and fermata. doctitle = "Caesura (\"railtracks\") with fermata" } % begin verbatim - \relative c'' { c2. % construct the symbol \override BreathingSign.text = \markup { - \line { - \musicglyph #"scripts.caesura.curved" - \translate #'(-1.75 . 1.6) - \musicglyph #"scripts.ufermata" + \override #'(direction . 1) + \override #'(baseline-skip . 1.8) + \dir-column { + \translate #'(0.155 . 0) + \center-align \musicglyph #"scripts.caesura.curved" + \center-align \musicglyph #"scripts.ufermata" } } \breathe c4 diff --git a/Documentation/snippets/center-text-below-hairpin-dynamics.ly b/Documentation/snippets/center-text-below-hairpin-dynamics.ly index 67e1972270..40810e6a19 100644 --- a/Documentation/snippets/center-text-below-hairpin-dynamics.ly +++ b/Documentation/snippets/center-text-below-hairpin-dynamics.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.19.22" \header { lsrtags = "expressive-marks, really-cool, scheme-language, text" @@ -23,42 +23,43 @@ normally printed, using some Scheme code. } % begin verbatim hairpinWithCenteredText = -#(define-music-function (parser location text) (markup?) -#{ - \once \override Voice.Hairpin.after-line-breaking = - #(lambda (grob) - (let* ((stencil (ly:hairpin::print grob)) - (par-y (ly:grob-parent grob Y)) - (dir (ly:grob-property par-y 'direction)) - (new-stencil (ly:stencil-aligned-to - (ly:stencil-combine-at-edge - (ly:stencil-aligned-to stencil X CENTER) - Y dir - (ly:stencil-aligned-to (grob-interpret-markup grob text) X CENTER)) - X LEFT)) - (staff-space (ly:output-def-lookup (ly:grob-layout grob) 'staff-space)) - (staff-line-thickness - (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness)) - (grob-name (lambda (x) (assq-ref (ly:grob-property x 'meta) 'name))) - (par-x (ly:grob-parent grob X)) - (dyn-text (eq? (grob-name par-x) 'DynamicText )) - (dyn-text-stencil-x-length - (if dyn-text - (interval-length - (ly:stencil-extent (ly:grob-property par-x 'stencil) X)) - 0)) - (x-shift - (if dyn-text - (- - (+ staff-space dyn-text-stencil-x-length) - (* 0.5 staff-line-thickness)) 0))) +#(define-music-function (text) (markup?) + #{ + \once \override Voice.Hairpin.after-line-breaking = + #(lambda (grob) + (let* ((stencil (ly:hairpin::print grob)) + (par-y (ly:grob-parent grob Y)) + (dir (ly:grob-property par-y 'direction)) + (new-stencil (ly:stencil-aligned-to + (ly:stencil-combine-at-edge + (ly:stencil-aligned-to stencil X CENTER) + Y dir + (ly:stencil-aligned-to + (grob-interpret-markup grob text) X CENTER)) + X LEFT)) + (staff-space (ly:output-def-lookup + (ly:grob-layout grob) 'staff-space)) + (staff-line-thickness + (ly:output-def-lookup (ly:grob-layout grob) 'line-thickness)) + (par-x (ly:grob-parent grob X)) + (dyn-text (grob::has-interface par-x 'dynamic-text-interface)) + (dyn-text-stencil-x-length + (if dyn-text + (interval-length + (ly:stencil-extent (ly:grob-property par-x 'stencil) X)) + 0)) + (x-shift + (if dyn-text + (- + (+ staff-space dyn-text-stencil-x-length) + (* 0.5 staff-line-thickness)) 0))) - (ly:grob-set-property! grob 'Y-offset 0) - (ly:grob-set-property! grob 'stencil - (ly:stencil-translate-axis - new-stencil - x-shift X)))) -#}) + (ly:grob-set-property! grob 'Y-offset 0) + (ly:grob-set-property! grob 'stencil + (ly:stencil-translate-axis + new-stencil + x-shift X)))) + #}) hairpinMolto = \hairpinWithCenteredText \markup { \italic molto } diff --git a/Documentation/snippets/centered-measure-numbers.ly b/Documentation/snippets/centered-measure-numbers.ly index 490fde1580..26e962dc6e 100644 --- a/Documentation/snippets/centered-measure-numbers.ly +++ b/Documentation/snippets/centered-measure-numbers.ly @@ -1,28 +1,25 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.7 -\version "2.17.7" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, repeats, staff-notation" texidoc = " -Scores of large ensemble works often have bar numbers placed beneath the -system, centered horizontally on the measure's extent. This snippet shows -how the @code{Measure_counter_engraver} may be used to simulate this -notational practice. Here, the engraver has been added to a @code{Dynamics} -context. +Scores of large ensemble works often have bar numbers placed beneath +the system, centered horizontally on the measure's extent. This +snippet shows how the @code{Measure_counter_engraver} may be used to +simulate this notational practice. Here, the engraver has been added +to a @code{Dynamics} context. " - doctitle = "Centered measure numbers" } % begin verbatim - \layout { \context { \Dynamics diff --git a/Documentation/snippets/centering-markup-on-note-heads-automatically.ly b/Documentation/snippets/centering-markup-on-note-heads-automatically.ly deleted file mode 100644 index b5342b4131..0000000000 --- a/Documentation/snippets/centering-markup-on-note-heads-automatically.ly +++ /dev/null @@ -1,65 +0,0 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" - -\header { - lsrtags = "text, tweaks-and-overrides, contexts-and-engravers" - texidoc = " -For technical reasons, text scripts attached to note heads cannot -easily be centered on a note head's width, unlike articulations. - -Instead of using trial-and-error offset tweaks, this snippet uses a -Scheme engraver to reset the horizontal parent of each markup to a -@code{NoteColumn}. This also allows text to follow note heads which have -been shifted via @code{force-hshift}. -" - doctitle = "Centering markup on note heads automatically" -} % begin verbatim - - -#(define (Text_align_engraver ctx) - (let ((scripts '()) - (note-column #f)) - (make-engraver - (acknowledgers - ((note-column-interface trans grob source) - ;; cache NoteColumn in this Voice context - (set! note-column grob)) - ((text-script-interface trans grob source) - ;; whenever a TextScript is acknowledged, - ;; add it to `scripts' list - (set! scripts (cons grob scripts)))) - ((stop-translation-timestep trans) - ;; if any TextScript grobs exist, - ;; set NoteColumn as X-parent - (for-each (lambda (script) - (set! (ly:grob-parent script X) note-column)) - scripts) - ;; clear scripts ready for next timestep - (set! scripts '()))))) - -\layout { - \context { - \Voice - \consists #Text_align_engraver - \override TextScript.X-offset = - #ly:self-alignment-interface::aligned-on-x-parent - \override TextScript.self-alignment-X = #CENTER - } -} - -\new Staff << - \relative c'' { - \override NoteColumn.force-hshift = #3 - c1-\markup { \arrow-head #Y #DOWN ##t } - } - \\ - \relative c' { - a4 a-\markup { \huge ^ } a a - } ->> diff --git a/Documentation/snippets/changing--flageolet-mark-size.ly b/Documentation/snippets/changing--flageolet-mark-size.ly index cc835b9e5d..c97cb8d439 100644 --- a/Documentation/snippets/changing--flageolet-mark-size.ly +++ b/Documentation/snippets/changing--flageolet-mark-size.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "expressive-marks, scheme-language, specific-notation, symbols-and-glyphs, unfretted-strings" @@ -17,7 +17,6 @@ function. doctitle = "Changing \\flageolet mark size" } % begin verbatim - smallFlageolet = #(let ((m (make-articulation "flageolet"))) (set! (ly:music-property m 'tweaks) diff --git a/Documentation/snippets/changing-a-single-notes-size-in-a-chord.ly b/Documentation/snippets/changing-a-single-notes-size-in-a-chord.ly index 741edb8388..869d6b5f98 100644 --- a/Documentation/snippets/changing-a-single-notes-size-in-a-chord.ly +++ b/Documentation/snippets/changing-a-single-notes-size-in-a-chord.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, really-simple, simultaneous-notes, specific-notation, tweaks-and-overrides" @@ -26,7 +26,8 @@ note head). doctitle = "Changing a single note's size in a chord" } % begin verbatim - \relative c' { - <\tweak font-size #+2 c e g c \tweak font-size #-2 e>1^\markup { A tiny e }_\markup { A big c } + <\tweak font-size #+2 c e g c + \tweak font-size #-2 e>1 + ^\markup { A tiny e }_\markup { A big c } } diff --git a/Documentation/snippets/changing-beam-knee-gap.ly b/Documentation/snippets/changing-beam-knee-gap.ly index 6409e4b15d..190be19f39 100644 --- a/Documentation/snippets/changing-beam-knee-gap.ly +++ b/Documentation/snippets/changing-beam-knee-gap.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -22,7 +22,6 @@ spaces. doctitle = "Changing beam knee gap" } % begin verbatim - { f8 f''8 f8 f''8 \override Beam.auto-knee-gap = #6 diff --git a/Documentation/snippets/changing-beam-thickness-and-spacing.ly b/Documentation/snippets/changing-beam-thickness-and-spacing.ly new file mode 100644 index 0000000000..6725d75177 --- /dev/null +++ b/Documentation/snippets/changing-beam-thickness-and-spacing.ly @@ -0,0 +1,32 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "tweaks-and-overrides" + + texidoc = " +To make beams thicker or thinner alter the @code{Beam.beam-thickness} +property. To adjust the spacing between beams alter the +@code{Beam.length-fraction} property. + +" + doctitle = "Changing beam thickness and spacing" +} % begin verbatim + +\relative f' { + \time 1/8 + \override Beam.beam-thickness = #0.4 + \override Beam.length-fraction = #0.8 + c32 c c c + \revert Beam.beam-thickness % 0.48 is default thickness + \revert Beam.length-fraction % 1.0 is default spacing + c32 c c c + \override Beam.beam-thickness = #0.6 + \override Beam.length-fraction = #1.3 + c32 c c c +} diff --git a/Documentation/snippets/changing-chord-separator.ly b/Documentation/snippets/changing-chord-separator.ly index 3e02b65b43..1fd367c3d6 100644 --- a/Documentation/snippets/changing-chord-separator.ly +++ b/Documentation/snippets/changing-chord-separator.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords" @@ -17,7 +17,6 @@ markup. doctitle = "Changing chord separator" } % begin verbatim - \chords { c:7sus4 \set chordNameSeparator diff --git a/Documentation/snippets/changing-form-of-multi-measure-rests.ly b/Documentation/snippets/changing-form-of-multi-measure-rests.ly index 118341b7a8..3e4c3fcb2e 100644 --- a/Documentation/snippets/changing-form-of-multi-measure-rests.ly +++ b/Documentation/snippets/changing-form-of-multi-measure-rests.ly @@ -1,10 +1,12 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.17.6" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.20 + +\version "2.19.20" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -22,8 +24,9 @@ default number of ten may be changed by overriding the \relative c'' { - \compressFullBarRests - R1*2 | R1*5 | R1*9 - \override MultiMeasureRest.expand-limit = #3 - R1*2 | R1*5 | R1*9 + \compressMMRests { + R1*2 | R1*5 | R1*9 + \override MultiMeasureRest.expand-limit = #3 + R1*2 | R1*5 | R1*9 + } } diff --git a/Documentation/snippets/changing-fret-orientations.ly b/Documentation/snippets/changing-fret-orientations.ly index b174cb5bd8..51ca53c65c 100644 --- a/Documentation/snippets/changing-fret-orientations.ly +++ b/Documentation/snippets/changing-fret-orientations.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "fretted-strings" @@ -17,7 +17,6 @@ or fret in the different orientations will be aligned. doctitle = "Changing fret orientations" } % begin verbatim - \include "predefined-guitar-fretboards.ly" << diff --git a/Documentation/snippets/changing-midi-output-to-one-channel-per-voice.ly b/Documentation/snippets/changing-midi-output-to-one-channel-per-voice.ly index aded2070cb..f817d558bb 100644 --- a/Documentation/snippets/changing-midi-output-to-one-channel-per-voice.ly +++ b/Documentation/snippets/changing-midi-output-to-one-channel-per-voice.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, midi, real-music" @@ -13,8 +13,7 @@ When outputting MIDI, the default behavior is for each staff to represent one MIDI channel, with all the voices on a staff amalgamated. This minimizes the risk of running out of MIDI channels, since there -are only 16 available per MIDI port, and most devices support only one -port. +are only 16 available per track. However, by moving the @code{Staff_performer} to the @code{Voice} context, each voice on a staff can have its own MIDI channel, as is @@ -26,7 +25,6 @@ two MIDI channels are created, each with a different doctitle = "Changing MIDI output to one channel per voice" } % begin verbatim - \score { \new Staff << \new Voice \relative c''' { diff --git a/Documentation/snippets/changing-ottava-text.ly b/Documentation/snippets/changing-ottava-text.ly new file mode 100644 index 0000000000..11101d4f7d --- /dev/null +++ b/Documentation/snippets/changing-ottava-text.ly @@ -0,0 +1,34 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "pitches, text" + + texidoc = " +Internally, @code{\\ottava} sets the properties @code{ottavation} (for +example, to @code{8va} or @code{8vb}) and @code{middleCPosition}. To +override the text of the bracket, set @code{ottavation} after invoking +@code{\\ottava}. + +Short text is especially useful when a brief ottava is used. + +" + doctitle = "Changing ottava text" +} % begin verbatim + +{ + c'2 + \ottava #1 + \set Staff.ottavation = #"8" + c''2 + \ottava #0 + c'1 + \ottava #1 + \set Staff.ottavation = #"Text" + c''1 +} diff --git a/Documentation/snippets/changing-partcombine-texts.ly b/Documentation/snippets/changing-partcombine-texts.ly index 4cd8109965..eafe5679cb 100644 --- a/Documentation/snippets/changing-partcombine-texts.ly +++ b/Documentation/snippets/changing-partcombine-texts.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "simultaneous-notes" @@ -17,7 +17,6 @@ the solo and unison sections may be changed: doctitle = "Changing partcombine texts" } % begin verbatim - \new Staff << \set Staff.soloText = #"girl" \set Staff.soloIIText = #"boy" diff --git a/Documentation/snippets/changing-properties-for-individual-grobs.ly b/Documentation/snippets/changing-properties-for-individual-grobs.ly index 7005946043..bce3cd9c92 100644 --- a/Documentation/snippets/changing-properties-for-individual-grobs.ly +++ b/Documentation/snippets/changing-properties-for-individual-grobs.ly @@ -1,10 +1,11 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.16.0" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.24 +\version "2.19.24" \header { lsrtags = "really-cool, scheme-language, tweaks-and-overrides" @@ -18,22 +19,20 @@ arguments. doctitle = "Changing properties for individual grobs" } % begin verbatim - #(define (mc-squared grob grob-origin context) - (let ((sp (ly:grob-property grob 'staff-position))) - (if (grob::has-interface grob 'note-head-interface) - (begin - (ly:grob-set-property! grob 'stencil - (grob-interpret-markup grob - (make-lower-markup 0.5 - (case sp - ((-5) "m") - ((-3) "c ") - ((-2) (make-smaller-markup (make-bold-markup "2"))) - (else "bla"))))))))) + (let ((sp (ly:grob-property grob 'staff-position))) + (ly:grob-set-property! + grob 'stencil + (grob-interpret-markup grob + #{ \markup \lower #0.5 + #(case sp + ((-5) "m") + ((-3) "c ") + ((-2) #{ \markup \teeny \bold 2 #}) + (else "bla")) #})))) \relative c' { 2 - \applyOutput #'Voice #mc-squared + \applyOutput Voice.NoteHead #mc-squared 2 } diff --git a/Documentation/snippets/changing-stanza-fonts.ly b/Documentation/snippets/changing-stanza-fonts.ly index 4ef7475f41..dcbd1f99d3 100644 --- a/Documentation/snippets/changing-stanza-fonts.ly +++ b/Documentation/snippets/changing-stanza-fonts.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "really-simple, vocal-music" @@ -17,7 +17,7 @@ used for printing the stanza number. doctitle = "Changing stanza fonts" } % begin verbatim -\new Voice { +\relative c'' { \time 3/4 g2 e4 a2 f4 @@ -28,7 +28,7 @@ used for printing the stanza number. Hi, my name is Bert. } \addlyrics { - \override StanzaNumber.font-name = #"DejaVu" + \override StanzaNumber.font-name = #"DejaVu Sans" \set stanza = #"2. " \override LyricText.font-family = #'typewriter Oh, ché -- ri, je t'aime diff --git a/Documentation/snippets/changing-text-and-spanner-styles-for-text-dynamics.ly b/Documentation/snippets/changing-text-and-spanner-styles-for-text-dynamics.ly index 002aaf7216..77c5a40eb5 100644 --- a/Documentation/snippets/changing-text-and-spanner-styles-for-text-dynamics.ly +++ b/Documentation/snippets/changing-text-and-spanner-styles-for-text-dynamics.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" @@ -23,7 +23,6 @@ is @code{'dashed-line}, and other possible values include @code{'line}, doctitle = "Changing text and spanner styles for text dynamics" } % begin verbatim - \relative c'' { \set crescendoText = \markup { \italic { cresc. poco } } \set crescendoSpanner = #'text diff --git a/Documentation/snippets/changing-the-ambitus-gap.ly b/Documentation/snippets/changing-the-ambitus-gap.ly index 7d13dc3b06..ade2d8e63b 100644 --- a/Documentation/snippets/changing-the-ambitus-gap.ly +++ b/Documentation/snippets/changing-the-ambitus-gap.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "pitches" diff --git a/Documentation/snippets/changing-the-appearance-of-a-slur-from-solid-to-dotted-or-dashed.ly b/Documentation/snippets/changing-the-appearance-of-a-slur-from-solid-to-dotted-or-dashed.ly index 4da9c337f5..45e60243b2 100644 --- a/Documentation/snippets/changing-the-appearance-of-a-slur-from-solid-to-dotted-or-dashed.ly +++ b/Documentation/snippets/changing-the-appearance-of-a-slur-from-solid-to-dotted-or-dashed.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "connecting-notes, editorial-annotations, expressive-marks, really-simple" @@ -16,7 +16,6 @@ The appearance of slurs may be changed from solid to dotted or dashed. doctitle = "Changing the appearance of a slur from solid to dotted or dashed" } % begin verbatim - \relative c' { c4( d e c) \slurDotted diff --git a/Documentation/snippets/changing-the-breath-mark-symbol.ly b/Documentation/snippets/changing-the-breath-mark-symbol.ly index 33978945b0..45fbff7ce0 100644 --- a/Documentation/snippets/changing-the-breath-mark-symbol.ly +++ b/Documentation/snippets/changing-the-breath-mark-symbol.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks" diff --git a/Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly b/Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly index 26cc5d92ec..fdd185ca79 100644 --- a/Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly +++ b/Documentation/snippets/changing-the-chord-names-to-german-or-semi-german-notation.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords, really-simple" @@ -21,17 +21,14 @@ The english naming of chords (default) can be changed to german doctitle = "Changing the chord names to German or semi-German notation" } % begin verbatim - -music = \chordmode { +scm = \chordmode { c1/c | cis/cis b1/b | bis/bis | bes/bes } -%% The following is only here to print the names of the -%% chords styles; it can be removed if you do not need to -%% print them. \layout { + ragged-right = ##t \context { \ChordNames \consists "Instrument_name_engraver" @@ -40,14 +37,24 @@ music = \chordmode { << \new ChordNames { - \set ChordNames.instrumentName = #"default" - \music + \set instrumentName = #"default" + \scm + } + \new ChordNames { + \set instrumentName = #"german" + \germanChords \scm } \new ChordNames { - \set ChordNames.instrumentName = #"german" - \germanChords \music } + \set instrumentName = #"semi-german" + \semiGermanChords \scm + } \new ChordNames { - \set ChordNames.instrumentName = #"semi-german" - \semiGermanChords \music } - \context Voice { \music } + \set instrumentName = #"italian" + \italianChords \scm + } + \new ChordNames { + \set instrumentName = #"french" + \frenchChords \scm + } + \context Voice { \scm } >> diff --git a/Documentation/snippets/changing-the-default-bar-lines.ly b/Documentation/snippets/changing-the-default-bar-lines.ly new file mode 100644 index 0000000000..c2c04ea6fb --- /dev/null +++ b/Documentation/snippets/changing-the-default-bar-lines.ly @@ -0,0 +1,48 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "repeats, staff-notation" + + texidoc = " +Default bar lines can be changed when re-defined in a score context. + +" + doctitle = "Changing the default bar lines" +} % begin verbatim + +% http://lsr.di.unimi.it/LSR/Item?id=964 +%%=> http://lists.gnu.org/archive/html/lilypond-user/2014-03/msg00126.html +%%=> http://lilypond.1069038.n5.nabble.com/Changing-the-default-end-repeat-bracket-tc169357.html + +\layout { + \context { + \Score + %% Changing the defaults from engraver-init.ly + defaultBarType = #"!" + startRepeatType = #"[|:" + endRepeatType = #":|]" + doubleRepeatType = #":|][|:" + } +} + +%% example: +{ + c'1 + \repeat volta 2 { \repeat unfold 2 c' } + \repeat volta 2 { \repeat unfold 2 c' } + \alternative { + { c' } + { + %% v2.18 workaround + \once\override Score.VoltaBracket.shorten-pair = #'(1 . -1) + c' + } + } + \bar "|." +} diff --git a/Documentation/snippets/changing-the-default-text-font-family.ly b/Documentation/snippets/changing-the-default-text-font-family.ly index 0fff98a94f..0b0097158b 100644 --- a/Documentation/snippets/changing-the-default-text-font-family.ly +++ b/Documentation/snippets/changing-the-default-text-font-family.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "text, tweaks-and-overrides" @@ -17,7 +17,6 @@ The default font families for text can be overridden with doctitle = "Changing the default text font family" } % begin verbatim - \paper { % change for other default global staff size. myStaffSize = #20 @@ -29,7 +28,7 @@ The default font families for text can be overridden with #(define fonts (make-pango-font-tree "Times New Roman" - "Nimbus Sans" + "Nimbus Sans,Nimbus Sans L" "Luxi Mono" ;; "Helvetica" ;; "Courier" diff --git a/Documentation/snippets/changing-the-interval-of-lines-on-the-stave.ly b/Documentation/snippets/changing-the-interval-of-lines-on-the-stave.ly index bb52c169ff..9e5b0c7ef0 100644 --- a/Documentation/snippets/changing-the-interval-of-lines-on-the-stave.ly +++ b/Documentation/snippets/changing-the-interval-of-lines-on-the-stave.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "pitches" @@ -19,7 +19,6 @@ and line of the stave equal to one semitone. doctitle = "Changing the interval of lines on the stave" } % begin verbatim - scale = \relative c' { a4 ais b c cis4 d dis e diff --git a/Documentation/snippets/changing-the-number-of-augmentation-dots-per-note.ly b/Documentation/snippets/changing-the-number-of-augmentation-dots-per-note.ly index 38764d36f3..422a855169 100644 --- a/Documentation/snippets/changing-the-number-of-augmentation-dots-per-note.ly +++ b/Documentation/snippets/changing-the-number-of-augmentation-dots-per-note.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, rhythms" diff --git a/Documentation/snippets/changing-the-number-of-lines-in-a-staff.ly b/Documentation/snippets/changing-the-number-of-lines-in-a-staff.ly index c4c53e5c32..08a8d99202 100644 --- a/Documentation/snippets/changing-the-number-of-lines-in-a-staff.ly +++ b/Documentation/snippets/changing-the-number-of-lines-in-a-staff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "specific-notation, staff-notation" @@ -20,7 +20,6 @@ The number of lines in a staff may changed by overriding the doctitle = "Changing the number of lines in a staff" } % begin verbatim - upper = \relative c'' { c4 d e f } diff --git a/Documentation/snippets/changing-the-positions-of-figured-bass-alterations.ly b/Documentation/snippets/changing-the-positions-of-figured-bass-alterations.ly index 7c7bafcbb1..7a6f6fb5bb 100644 --- a/Documentation/snippets/changing-the-positions-of-figured-bass-alterations.ly +++ b/Documentation/snippets/changing-the-positions-of-figured-bass-alterations.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords" @@ -18,7 +18,6 @@ depending on the @code{figuredBassAlterationDirection} and doctitle = "Changing the positions of figured bass alterations" } % begin verbatim - \figures { <6\+> <5+> <6 4-> r \set figuredBassAlterationDirection = #RIGHT diff --git a/Documentation/snippets/changing-the-size-of-woodwind-diagrams.ly b/Documentation/snippets/changing-the-size-of-woodwind-diagrams.ly index 589ce235fa..548544273e 100644 --- a/Documentation/snippets/changing-the-size-of-woodwind-diagrams.ly +++ b/Documentation/snippets/changing-the-size-of-woodwind-diagrams.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "winds" diff --git a/Documentation/snippets/changing-the-staff-size.ly b/Documentation/snippets/changing-the-staff-size.ly index ed30920b49..e605413ea2 100644 --- a/Documentation/snippets/changing-the-staff-size.ly +++ b/Documentation/snippets/changing-the-staff-size.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "paper-and-layout, staff-notation, tweaks-and-overrides" @@ -19,7 +19,6 @@ changed by scaling the properties @code{'staff-space} and doctitle = "Changing the staff size" } % begin verbatim - << \new Staff { \relative c'' { diff --git a/Documentation/snippets/changing-the-tempo-without-a-metronome-mark.ly b/Documentation/snippets/changing-the-tempo-without-a-metronome-mark.ly index 66879b4f68..5ee5d34f28 100644 --- a/Documentation/snippets/changing-the-tempo-without-a-metronome-mark.ly +++ b/Documentation/snippets/changing-the-tempo-without-a-metronome-mark.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "midi, rhythms, tweaks-and-overrides" @@ -17,7 +17,6 @@ metronome mark invisible. doctitle = "Changing the tempo without a metronome mark" } % begin verbatim - \score { \new Staff \relative c' { \tempo 4 = 160 diff --git a/Documentation/snippets/changing-the-text-for-sustain-markings.ly b/Documentation/snippets/changing-the-text-for-sustain-markings.ly index 6f6871ef37..5345cd9242 100644 --- a/Documentation/snippets/changing-the-text-for-sustain-markings.ly +++ b/Documentation/snippets/changing-the-text-for-sustain-markings.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "keyboards, tweaks-and-overrides" @@ -19,7 +19,6 @@ exhaustive list. doctitle = "Changing the text for sustain markings" } % begin verbatim - sustainNotes = { c4\sustainOn d e\sustainOff\sustainOn f\sustainOff } \relative c' { diff --git a/Documentation/snippets/changing-the-tuplet-number.ly b/Documentation/snippets/changing-the-tuplet-number.ly index e0257869b7..9ac1693c96 100644 --- a/Documentation/snippets/changing-the-tuplet-number.ly +++ b/Documentation/snippets/changing-the-tuplet-number.ly @@ -1,26 +1,26 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.30 -\version "2.17.30" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "rhythms" texidoc = " By default, only the numerator of the tuplet number is printed over the -tuplet bracket. Alternatively, num:den of the tuplet number may -be printed, or the tuplet number may be suppressed altogether. +tuplet bracket, i.e., the numerator of the argument to the +@code{\\tuplet} command. + +Alternatively, num:den of the tuplet number may be printed, or the +tuplet number may be suppressed altogether. " doctitle = "Changing the tuplet number" } % begin verbatim - - \relative c'' { \tuplet 3/2 { c8 c c } \tuplet 3/2 { c8 c c } diff --git a/Documentation/snippets/changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly b/Documentation/snippets/changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly index 74a6d43c10..6b37d262db 100644 --- a/Documentation/snippets/changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly +++ b/Documentation/snippets/changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly @@ -1,20 +1,27 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.11 -\version "2.17.11" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { - lsrtags = "workaround, contexts-and-engravers, contemporary-notation, rhythms" + lsrtags = "contemporary-notation, contexts-and-engravers, rhythms, workaround" + texidoc = " +The @code{measureLength} property, together with +@code{measurePosition}, determines when a bar line is needed. However, +when using @code{\\scaleDurations}, the scaling of durations makes it +difficult to change time signatures. In this case, +@code{measureLength} should be set manually, using the +@code{ly:make-moment} callback. The second argument must be the same +as the second argument of @code{\\scaleDurations}. + +" doctitle = "Changing time signatures inside a polymetric section using \\scaleDurations" } % begin verbatim - - \layout { \context { \Score diff --git a/Documentation/snippets/chant-or-psalms-notation.ly b/Documentation/snippets/chant-or-psalms-notation.ly index 864374ec3f..643e25c95a 100644 --- a/Documentation/snippets/chant-or-psalms-notation.ly +++ b/Documentation/snippets/chant-or-psalms-notation.ly @@ -1,24 +1,22 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { - lsrtags = "rhythms, vocal-music, ancient-notation, contexts-and-engravers, specific-notation" + lsrtags = "ancient-notation, contexts-and-engravers, rhythms, specific-notation, vocal-music" texidoc = " -This form of notation is used for the chant of the Psalms, where verses -aren't always the same length. +This form of notation is used for Psalm chant, where verses aren't +always the same length. " doctitle = "Chant or psalms notation" } % begin verbatim - stemOff = \hide Staff.Stem stemOn = \undo \stemOff diff --git a/Documentation/snippets/chord-glissando-in-tablature.ly b/Documentation/snippets/chord-glissando-in-tablature.ly index a5b221cf28..9b61674539 100644 --- a/Documentation/snippets/chord-glissando-in-tablature.ly +++ b/Documentation/snippets/chord-glissando-in-tablature.ly @@ -1,16 +1,16 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings" texidoc = " -Slides for chords can be indicated in both @code{Staff} and +Slides for chords are indicated by default in both @code{Staff} and @code{TabStaff}. String numbers are necessary for @code{TabStaff} because automatic string calculations are different for chords and for single notes. @@ -20,7 +20,7 @@ single notes. } % begin verbatim myMusic = \relative c' { - 1 \glissando + 1 \glissando } \score { @@ -29,7 +29,17 @@ myMusic = \relative c' { \clef "treble_8" \myMusic } - \new TabStaff { + \new TabStaff \myMusic + >> +} + +\score { + << + \new Staff { + \clef "treble_8" + \myMusic + } + \new TabStaff \with { \override Glissando.style = #'none } { \myMusic } >> diff --git a/Documentation/snippets/chord-name-exceptions.ly b/Documentation/snippets/chord-name-exceptions.ly index 759c02140d..914c06f1e6 100644 --- a/Documentation/snippets/chord-name-exceptions.ly +++ b/Documentation/snippets/chord-name-exceptions.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords, specific-notation" @@ -17,7 +17,6 @@ special notations for specific chords. doctitle = "Chord name exceptions" } % begin verbatim - % modify maj9 and 6(add9) % Exception music is chords with markups chExceptionMusic = { diff --git a/Documentation/snippets/chord-name-major7.ly b/Documentation/snippets/chord-name-major7.ly index b4a345d464..832dda877d 100644 --- a/Documentation/snippets/chord-name-major7.ly +++ b/Documentation/snippets/chord-name-major7.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords, specific-notation" @@ -16,7 +16,6 @@ The layout of the major 7 can be tuned with @code{majorSevenSymbol}. doctitle = "chord name major7" } % begin verbatim - \chords { c:7+ \set majorSevenSymbol = \markup { j7 } diff --git a/Documentation/snippets/chordchanges-for-fretboards.ly b/Documentation/snippets/chordchanges-for-fretboards.ly index ffac03d80b..89b2ea95e6 100644 --- a/Documentation/snippets/chordchanges-for-fretboards.ly +++ b/Documentation/snippets/chordchanges-for-fretboards.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings" diff --git a/Documentation/snippets/chords-headword.ly b/Documentation/snippets/chords-headword.ly index c335944a5a..db4e80b032 100644 --- a/Documentation/snippets/chords-headword.ly +++ b/Documentation/snippets/chords-headword.ly @@ -1,19 +1,20 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "headword" - texidoc = "" - doctitle = "headword" -} % begin verbatim + texidoc = " +. +" + doctitle = "Chords headword" +} % begin verbatim theChords = \chordmode { \time 2/2 @@ -100,4 +101,3 @@ Bass = { } } } -\paper { } diff --git a/Documentation/snippets/chords.snippet-list b/Documentation/snippets/chords.snippet-list index 86bdaefd0e..c774f57f8b 100644 --- a/Documentation/snippets/chords.snippet-list +++ b/Documentation/snippets/chords.snippet-list @@ -1,7 +1,7 @@ adding-a-figured-bass-above-or-below-the-notes.ly adding-bar-lines-to-chordnames-context.ly avoiding-collisions-with-chord-fingerings.ly -bar-chords-notation-for-guitar--with-text-spanner.ly +bar-chords-notation-for-guitar-with-text-spanner.ly changing-chord-separator.ly changing-the-chord-names-to-german-or-semi-german-notation.ly changing-the-positions-of-figured-bass-alterations.ly diff --git a/Documentation/snippets/clefs-can-be-transposed-by-arbitrary-amounts.ly b/Documentation/snippets/clefs-can-be-transposed-by-arbitrary-amounts.ly index e7155b5355..541c2d67ba 100644 --- a/Documentation/snippets/clefs-can-be-transposed-by-arbitrary-amounts.ly +++ b/Documentation/snippets/clefs-can-be-transposed-by-arbitrary-amounts.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "pitches" @@ -16,7 +16,6 @@ Clefs can be transposed by arbitrary amounts, not just by octaves. doctitle = "Clefs can be transposed by arbitrary amounts" } % begin verbatim - \relative c' { \clef treble c4 c c c diff --git a/Documentation/snippets/clip-systems.ly b/Documentation/snippets/clip-systems.ly index ee58d574b6..736586bb94 100644 --- a/Documentation/snippets/clip-systems.ly +++ b/Documentation/snippets/clip-systems.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.19.22" \header { lsrtags = "paper-and-layout" @@ -33,7 +33,6 @@ are generated. doctitle = "Clip systems" } % begin verbatim - #(ly:set-option 'clip-systems) #(define output-suffix "1") @@ -89,7 +88,7 @@ origScore = \score { \markup { from-2.0.1-to-4.0.1-clip.eps } \markup { \epsfile #X #30.0 #(format #f "~a-1-from-2.0.1-to-4.0.1-clip.eps" - (ly:parser-output-name parser)) } + (ly:parser-output-name)) } } } } diff --git a/Documentation/snippets/clusters.ly b/Documentation/snippets/clusters.ly index 50bc544ad0..82974911e1 100644 --- a/Documentation/snippets/clusters.ly +++ b/Documentation/snippets/clusters.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords, contemporary-notation, keyboards, really-cool, simultaneous-notes, specific-notation" @@ -17,7 +17,6 @@ played. doctitle = "Clusters" } % begin verbatim - fragment = \relative c' { c4 f 4 8 a4 c2 4 diff --git a/Documentation/snippets/coloring-notes-depending-on-their-pitch.ly b/Documentation/snippets/coloring-notes-depending-on-their-pitch.ly index 16ed079f6e..23b25a5523 100644 --- a/Documentation/snippets/coloring-notes-depending-on-their-pitch.ly +++ b/Documentation/snippets/coloring-notes-depending-on-their-pitch.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, pitches, really-cool" diff --git a/Documentation/snippets/combining-dynamics-with-markup-texts.ly b/Documentation/snippets/combining-dynamics-with-markup-texts.ly index b778e8b394..14fc861c1c 100644 --- a/Documentation/snippets/combining-dynamics-with-markup-texts.ly +++ b/Documentation/snippets/combining-dynamics-with-markup-texts.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "expressive-marks, really-simple, text" @@ -18,9 +18,10 @@ block. doctitle = "Combining dynamics with markup texts" } % begin verbatim - piuF = \markup { \italic più \dynamic f } + \layout { ragged-right = ##f } + \relative c'' { c2\f c-\piuF } diff --git a/Documentation/snippets/combining-two-parts-on-the-same-staff.ly b/Documentation/snippets/combining-two-parts-on-the-same-staff.ly index 0a8477adc5..643dacbe86 100644 --- a/Documentation/snippets/combining-two-parts-on-the-same-staff.ly +++ b/Documentation/snippets/combining-two-parts-on-the-same-staff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "simultaneous-notes, syntax-and-expressions, text" @@ -30,6 +30,7 @@ staff: standard polyphony, @code{\\partcombine} without texts, and doctitle = "Combining two parts on the same staff" } % begin verbatim +%% Combining pedal notes with clef changes musicUp = \relative c'' { \time 4/4 diff --git a/Documentation/snippets/compound-time-signatures.ly b/Documentation/snippets/compound-time-signatures.ly index 9b1a047a5b..4734934723 100644 --- a/Documentation/snippets/compound-time-signatures.ly +++ b/Documentation/snippets/compound-time-signatures.ly @@ -1,27 +1,27 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.15 -\version "2.17.15" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "rhythms" texidoc = " -Odd 20th century time signatures (such as \\\"5/8\\\") can often be -played as compound time signatures (e.g. \\\"3/8 + 2/8\\\"), which -combine two or more inequal metrics. LilyPond can make such music quite -easy to read and play, by explicitly printing the compound time -signatures and adapting the automatic beaming behavior. +Odd 20th century time signatures (such as \"5/8\") can often be played +as compound time signatures (e.g. \"3/8 + 2/8\"), which combine two or +more inequal metrics. + +LilyPond can make such music quite easy to read and play, by explicitly +printing the compound time signatures and adapting the automatic +beaming behavior. " doctitle = "Compound time signatures" } % begin verbatim - \relative c' { \compoundMeter #'((2 8) (3 8)) c8 d e fis gis diff --git a/Documentation/snippets/conducting-signs,-measure-grouping-signs.ly b/Documentation/snippets/conducting-signs,-measure-grouping-signs.ly index b30f7e7393..eea44b0fbc 100644 --- a/Documentation/snippets/conducting-signs,-measure-grouping-signs.ly +++ b/Documentation/snippets/conducting-signs,-measure-grouping-signs.ly @@ -1,49 +1,46 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.19.40" \header { lsrtags = "rhythms" + texidoc = " Beat grouping within a measure is controlled by the context property -@code{beatStructure}. Values of @code{beatStructure} are -established for many time signatures in -@file{scm/time-signature-settings.scm}. Values of @code{beatStructure} -can be changed or set with @code{\\set}. -Alternatively, @code{\\time} can be used to both -set the time signature and establish the beat structure. -For this, you specify the internal grouping of beats in a measure -as a list of numbers (in Scheme syntax) before the time signature. +@code{beatStructure}. Values of @code{beatStructure} are established +for many time signatures in @code{scm/time-signature-settings.scm}. +Values of @code{beatStructure} can be changed or set with @code{\\set}. +Alternatively, @code{\\time} can be used to both set the time signature +and establish the beat structure. For this, you specify the internal +grouping of beats in a measure as a list of numbers (in Scheme syntax) +before the time signature. @code{\\time} applies to the @code{Timing} context, so it will not reset values of @code{beatStructure} or @code{baseMoment} that are set in other lower-level contexts, such as @code{Voice}. -If the @code{Measure_grouping_engraver} is included -in one of the display contexts, measure grouping signs will be -created. Such signs ease reading rhythmically complex modern music. -In the example, the 9/8 measure is grouped in two different -patterns using the two different methods, while the 5/8 measure -is grouped according to the default setting in -@file{scm/time-signature-settings.scm}: +If the @code{Measure_grouping_engraver} is included in one of the +display contexts, measure grouping signs will be created. Such signs +ease reading rhythmically complex modern music. In the example, the 9/8 +measure is grouped in two different patterns using the two different +methods, while the 5/8 measure is grouped according to the default +setting in @code{scm/time-signature-settings.scm}: + " doctitle = "Conducting signs measure grouping signs" } % begin verbatim - - \score { \new Voice \relative c'' { \time 9/8 g8 g d d g g a( bes g) | - \set Timing.beatStructure = #'(2 2 2 3) + \set Timing.beatStructure = 2,2,2,3 g8 g d d g g a( bes g) | - \time #'(4 5) 9/8 + \time 4,5 9/8 g8 g d d g g a( bes g) | \time 5/8 a4. g4 | diff --git a/Documentation/snippets/consistently-left-aligned-bar-numbers.ly b/Documentation/snippets/consistently-left-aligned-bar-numbers.ly index f2b61e8e8d..c37bc7240e 100644 --- a/Documentation/snippets/consistently-left-aligned-bar-numbers.ly +++ b/Documentation/snippets/consistently-left-aligned-bar-numbers.ly @@ -1,17 +1,17 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms" texidoc = " When left aligning bar numbers, overlapping problems may occur with -Staves brackets. The snippet solves this by keeping right aligned the +Staves brackets. The snippet solves this by keeping right aligned the first bar number following line breaks. " diff --git a/Documentation/snippets/contemporary-glissando.ly b/Documentation/snippets/contemporary-glissando.ly index 7d9d563318..1585518199 100644 --- a/Documentation/snippets/contemporary-glissando.ly +++ b/Documentation/snippets/contemporary-glissando.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "contemporary-notation, expressive-marks, specific-notation" @@ -17,7 +17,6 @@ hidden note and cadenza timing. doctitle = "Contemporary glissando" } % begin verbatim - \relative c'' { \time 3/4 \override Glissando.style = #'zigzag diff --git a/Documentation/snippets/contemporary-notation.snippet-list b/Documentation/snippets/contemporary-notation.snippet-list index 098532b961..b12e5980dd 100644 --- a/Documentation/snippets/contemporary-notation.snippet-list +++ b/Documentation/snippets/contemporary-notation.snippet-list @@ -4,6 +4,7 @@ clusters.ly contemporary-glissando.ly double-glissando.ly flat-flags-and-beam-nibs.ly +flat-ties.ly flute-slap-notation.ly heavily-customized-polymetric-time-signatures.ly laissez-vibrer-ties.ly diff --git a/Documentation/snippets/contexts-and-engravers.snippet-list b/Documentation/snippets/contexts-and-engravers.snippet-list index c752cf87ed..3b3c016eb3 100644 --- a/Documentation/snippets/contexts-and-engravers.snippet-list +++ b/Documentation/snippets/contexts-and-engravers.snippet-list @@ -3,11 +3,11 @@ adding-an-extra-staff-at-a-line-break.ly adding-an-extra-staff.ly automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.ly centered-measure-numbers.ly -centering-markup-on-note-heads-automatically.ly changing-midi-output-to-one-channel-per-voice.ly changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly chant-or-psalms-notation.ly creating-blank-staves.ly +creating-custom-key-signatures.ly cross-staff-stems.ly defining-an-engraver-in-scheme--ambitus-engraver.ly displaying-a-whole-grandstaff-system-if-only-one-of-its-staves-is-alive.ly diff --git a/Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly b/Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly index 4df07c679e..a434f35d75 100644 --- a/Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly +++ b/Documentation/snippets/controlling-spanner-visibility-after-a-line-break.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" diff --git a/Documentation/snippets/controlling-the-placement-of-chord-fingerings.ly b/Documentation/snippets/controlling-the-placement-of-chord-fingerings.ly index 4e264c604e..9c29cba1eb 100644 --- a/Documentation/snippets/controlling-the-placement-of-chord-fingerings.ly +++ b/Documentation/snippets/controlling-the-placement-of-chord-fingerings.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords, editorial-annotations, fretted-strings, keyboards, specific-notation" @@ -18,7 +18,6 @@ if it is a single note. doctitle = "Controlling the placement of chord fingerings" } % begin verbatim - \relative c' { \set fingeringOrientations = #'(left) 4 diff --git a/Documentation/snippets/controlling-the-vertical-ordering-of-scripts.ly b/Documentation/snippets/controlling-the-vertical-ordering-of-scripts.ly index d4091b033d..9c03616528 100644 --- a/Documentation/snippets/controlling-the-vertical-ordering-of-scripts.ly +++ b/Documentation/snippets/controlling-the-vertical-ordering-of-scripts.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" @@ -23,7 +23,6 @@ comes first. doctitle = "Controlling the vertical ordering of scripts" } % begin verbatim - \relative c''' { \once \override TextScript.script-priority = #-100 a2^\prall^\markup { \sharp } diff --git a/Documentation/snippets/controlling-tuplet-bracket-visibility.ly b/Documentation/snippets/controlling-tuplet-bracket-visibility.ly index 9c74de6b45..37def33224 100644 --- a/Documentation/snippets/controlling-tuplet-bracket-visibility.ly +++ b/Documentation/snippets/controlling-tuplet-bracket-visibility.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -21,7 +21,6 @@ bracket), @code{#f} (never print a bracket) or @code{#'if-no-beam} doctitle = "Controlling tuplet bracket visibility" } % begin verbatim - music = \relative c'' { \tuplet 3/2 { c16[ d e } f8] \tuplet 3/2 { c8 d e } @@ -37,5 +36,8 @@ music = \relative c'' { << \music s4^"#t" >> \override TupletBracket.bracket-visibility = ##f << \music s4^"#f" >> + %% v2.18 : + \omit TupletBracket + << \music s4^"omit" >> } } diff --git a/Documentation/snippets/correction-wanted.snippet-list b/Documentation/snippets/correction-wanted.snippet-list deleted file mode 100644 index b551d6eaca..0000000000 --- a/Documentation/snippets/correction-wanted.snippet-list +++ /dev/null @@ -1,2 +0,0 @@ -adjusting-lyrics-vertical-spacing.ly -horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly diff --git a/Documentation/snippets/creating-a-delayed-turn.ly b/Documentation/snippets/creating-a-delayed-turn.ly index 98c4a150a0..0787bc8b0c 100644 --- a/Documentation/snippets/creating-a-delayed-turn.ly +++ b/Documentation/snippets/creating-a-delayed-turn.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.97 -\version "2.17.97" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "editorial-annotations, expressive-marks, tweaks-and-overrides" @@ -15,14 +14,13 @@ Creating a delayed turn, where the lower note of the turn uses the accidental, requires several overrides. The @code{outside-staff-priority} property must be set to @code{#f}, as otherwise this would take precedence over the @code{avoid-slur -property}. Changing the fractions @code{2/3} and @code{1/3} adjusts the -horizontal position. +property}. Changing the fractions @code{2/3} and @code{1/3} adjusts +the horizontal position. + " doctitle = "Creating a delayed turn" } % begin verbatim - - \relative c'' { c2*2/3 ( s2*1/3\turn d4) r << @@ -34,10 +32,10 @@ horizontal position. { s4 \once \set suggestAccidentals = ##t - \once \override AccidentalSuggestion #'outside-staff-priority = ##f - \once \override AccidentalSuggestion #'avoid-slur = #'inside - \once \override AccidentalSuggestion #'font-size = #-3 - \once \override AccidentalSuggestion #'script-priority = #-1 + \once \override AccidentalSuggestion.outside-staff-priority = ##f + \once \override AccidentalSuggestion.avoid-slur = #'inside + \once \override AccidentalSuggestion.font-size = -3 + \once \override AccidentalSuggestion.script-priority = -1 \single \hideNotes b8-\turn \noBeam s8 diff --git a/Documentation/snippets/creating-a-sequence-of-notes-on-various-pitches.ly b/Documentation/snippets/creating-a-sequence-of-notes-on-various-pitches.ly index 22476cebfb..837c03d30d 100644 --- a/Documentation/snippets/creating-a-sequence-of-notes-on-various-pitches.ly +++ b/Documentation/snippets/creating-a-sequence-of-notes-on-various-pitches.ly @@ -4,8 +4,8 @@ % and then run scripts/auxiliar/makelsr.py % % This file is in the public domain. -%% Note: this file works from version 2.17.11 -\version "2.17.11" +%% Note: this file works from version 2.19.22 +\version "2.19.22" \header { lsrtags = "pitches, real-music, really-cool, scheme-language" @@ -23,9 +23,9 @@ Planets. rhythm = -#(define-music-function (parser location p) (ly:pitch?) +#(define-music-function (p) (ly:pitch?) "Make the rhythm in Mars (the Planets) at the given pitch" - #{ \tuplet 3/2 { $p 8 $p $p } $p 4 $p $p 8 $p $p 4 #}) + #{ \tuplet 3/2 { $p 8 8 8 } 4 4 8 8 4 #}) \new Staff { \time 5/4 diff --git a/Documentation/snippets/creating-arpeggios-across-notes-in-different-voices.ly b/Documentation/snippets/creating-arpeggios-across-notes-in-different-voices.ly index 52b16bbb59..bdf4cee328 100644 --- a/Documentation/snippets/creating-arpeggios-across-notes-in-different-voices.ly +++ b/Documentation/snippets/creating-arpeggios-across-notes-in-different-voices.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "expressive-marks" @@ -18,7 +18,6 @@ context: doctitle = "Creating arpeggios across notes in different voices" } % begin verbatim - \new Staff \with { \consists "Span_arpeggio_engraver" } diff --git a/Documentation/snippets/creating-blank-staves.ly b/Documentation/snippets/creating-blank-staves.ly index f264ed64f2..69d3626554 100644 --- a/Documentation/snippets/creating-blank-staves.ly +++ b/Documentation/snippets/creating-blank-staves.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, editorial-annotations, paper-and-layout, specific-notation, staff-notation" @@ -19,7 +19,6 @@ To create blank staves, generate empty measures then remove the doctitle = "Creating blank staves" } % begin verbatim - #(set-global-staff-size 20) \score { @@ -41,6 +40,8 @@ To create blank staves, generate empty measures then remove the } } +% uncomment these lines for "letter" size +%{ \paper { #(set-paper-size "letter") ragged-last-bottom = ##f @@ -49,3 +50,16 @@ To create blank staves, generate empty measures then remove the bottom-margin = 0.25\in top-margin = 0.25\in } +%} + +% uncomment these lines for "A4" size +%{ +\paper { + #(set-paper-size "a4") + ragged-last-bottom = ##f + line-width = 180 + left-margin = 15 + bottom-margin = 10 + top-margin = 10 +} +%} diff --git a/Documentation/snippets/creating-cross-staff-arpeggios-in-a-piano-staff.ly b/Documentation/snippets/creating-cross-staff-arpeggios-in-a-piano-staff.ly index a46b5a8dbc..d49f35abc7 100644 --- a/Documentation/snippets/creating-cross-staff-arpeggios-in-a-piano-staff.ly +++ b/Documentation/snippets/creating-cross-staff-arpeggios-in-a-piano-staff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "expressive-marks" @@ -18,7 +18,6 @@ the staves by setting the property @code{PianoStaff.connectArpeggios}. doctitle = "Creating cross-staff arpeggios in a piano staff" } % begin verbatim - \new PianoStaff \relative c'' << \set PianoStaff.connectArpeggios = ##t \new Staff { diff --git a/Documentation/snippets/creating-cross-staff-arpeggios-in-other-contexts.ly b/Documentation/snippets/creating-cross-staff-arpeggios-in-other-contexts.ly index 168043d7e9..87beb1f21f 100644 --- a/Documentation/snippets/creating-cross-staff-arpeggios-in-other-contexts.ly +++ b/Documentation/snippets/creating-cross-staff-arpeggios-in-other-contexts.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "expressive-marks" @@ -18,7 +18,6 @@ Cross-staff arpeggios can be created in contexts other than doctitle = "Creating cross-staff arpeggios in other contexts" } % begin verbatim - \score { \new ChoirStaff { \set Score.connectArpeggios = ##t diff --git a/Documentation/snippets/creating-custom-dynamics-in-midi-output.ly b/Documentation/snippets/creating-custom-dynamics-in-midi-output.ly new file mode 100644 index 0000000000..e013e7af98 --- /dev/null +++ b/Documentation/snippets/creating-custom-dynamics-in-midi-output.ly @@ -0,0 +1,41 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "midi, scheme-language" + + texidoc = " +The following example shows how to create a dynamic marking, not +included in the default list, and assign it a specific value so that it +can be used to affect MIDI output. + + +The dynamic mark @code{\\rfz} is assigned a value of @code{0.9}. + +" + doctitle = "Creating custom dynamics in MIDI output" +} % begin verbatim + +#(define (myDynamics dynamic) + (if (equal? dynamic "rfz") + 0.9 + (default-dynamic-absolute-volume dynamic))) + +\score { + \new Staff { + \set Staff.midiInstrument = #"cello" + \set Score.dynamicAbsoluteVolumeFunction = #myDynamics + \new Voice { + \relative { + a'4\pp b c-\rfz + } + } + } + \layout {} + \midi {} +} diff --git a/Documentation/snippets/creating-custom-key-signatures.ly b/Documentation/snippets/creating-custom-key-signatures.ly new file mode 100644 index 0000000000..0488ff23a0 --- /dev/null +++ b/Documentation/snippets/creating-custom-key-signatures.ly @@ -0,0 +1,43 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "contexts-and-engravers, pitches, staff-notation, tweaks-and-overrides" + + texidoc = " +LilyPond supports custom key signatures. In this example, print for D +minor with an extended range of printed flats. + +" + doctitle = "Creating custom key signatures" +} % begin verbatim + +\new Staff \with { + \override StaffSymbol.line-count = #8 + \override KeySignature.flat-positions = #'((-7 . 6)) + \override KeyCancellation.flat-positions = #'((-7 . 6)) + % presumably sharps are also printed in both octaves + \override KeySignature.sharp-positions = #'((-6 . 7)) + \override KeyCancellation.sharp-positions = #'((-6 . 7)) + + \override Clef.stencil = # + (lambda (grob)(grob-interpret-markup grob + #{ \markup\combine + \musicglyph #"clefs.C" + \translate #'(-3 . -2) + \musicglyph #"clefs.F" + #})) + clefPosition = #3 + middleCPosition = #3 + middleCClefPosition = #3 +} + +{ + \key d\minor + f bes, f bes, +} diff --git a/Documentation/snippets/creating-double-digit-fingerings.ly b/Documentation/snippets/creating-double-digit-fingerings.ly index aaf9962842..7949e5aec4 100644 --- a/Documentation/snippets/creating-double-digit-fingerings.ly +++ b/Documentation/snippets/creating-double-digit-fingerings.ly @@ -1,22 +1,21 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.15 -\version "2.17.15" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "editorial-annotations, expressive-marks, scheme-language, staff-notation, tweaks-and-overrides" texidoc = " Creating fingerings larger than 5 is possible. + " doctitle = "Creating double-digit fingerings" } % begin verbatim - \relative c' { c1-10 c1-50 diff --git a/Documentation/snippets/creating-metronome-marks-in-markup-mode.ly b/Documentation/snippets/creating-metronome-marks-in-markup-mode.ly index a234b65082..62ebc5e726 100644 --- a/Documentation/snippets/creating-metronome-marks-in-markup-mode.ly +++ b/Documentation/snippets/creating-metronome-marks-in-markup-mode.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -17,7 +17,6 @@ change the tempo in MIDI output. doctitle = "Creating metronome marks in markup mode" } % begin verbatim - \relative c' { \tempo \markup { \concat { diff --git a/Documentation/snippets/creating-real-parenthesized-dynamics.ly b/Documentation/snippets/creating-real-parenthesized-dynamics.ly index d6299a8ca8..5fbbe1f34f 100644 --- a/Documentation/snippets/creating-real-parenthesized-dynamics.ly +++ b/Documentation/snippets/creating-real-parenthesized-dynamics.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.19.22" \header { lsrtags = "expressive-marks, text, workaround" @@ -27,9 +26,8 @@ commands such as @code{\\dynamicUp} or @code{\\dynamicDown}. doctitle = "Creating \"real\" parenthesized dynamics" } % begin verbatim - paren = -#(define-event-function (parser location dyn) (ly:event?) +#(define-event-function (dyn) (ly:event?) (make-dynamic-script #{ \markup \concat { \normal-text \italic \fontsize #2 ( diff --git a/Documentation/snippets/creating-simultaneous-rehearsal-marks.ly b/Documentation/snippets/creating-simultaneous-rehearsal-marks.ly index eefa6f5917..c93fc9ed82 100644 --- a/Documentation/snippets/creating-simultaneous-rehearsal-marks.ly +++ b/Documentation/snippets/creating-simultaneous-rehearsal-marks.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.30" +\version "2.18.0" \header { lsrtags = "expressive-marks, text, tweaks-and-overrides" @@ -32,7 +32,7 @@ end of one system and the start of the following system. % the hidden measure and bar line % \cadenzaOn turns off automatic calculation of bar numbers \cadenzaOn - \once \omit Score.TimeSignature + \once \override Score.TimeSignature.stencil = ##f \time 1/16 s16 \bar "" \cadenzaOff diff --git a/Documentation/snippets/creating-slurs-across-voices.ly b/Documentation/snippets/creating-slurs-across-voices.ly index 74e82c55e2..847de5949a 100644 --- a/Documentation/snippets/creating-slurs-across-voices.ly +++ b/Documentation/snippets/creating-slurs-across-voices.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "connecting-notes, expressive-marks, keyboards, real-music, unfretted-strings" @@ -23,7 +23,6 @@ solo violin, BWV 1004. doctitle = "Creating slurs across voices" } % begin verbatim - \relative c' { << { diff --git a/Documentation/snippets/creating-text-spanners.ly b/Documentation/snippets/creating-text-spanners.ly index 5e18e550e2..d0c209273e 100644 --- a/Documentation/snippets/creating-text-spanners.ly +++ b/Documentation/snippets/creating-text-spanners.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, text, tweaks-and-overrides" @@ -19,7 +19,6 @@ to modify its output. doctitle = "Creating text spanners" } % begin verbatim - \paper { ragged-right = ##f } \relative c'' { diff --git a/Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly b/Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly index cb4ec966af..f0929dc32c 100644 --- a/Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly +++ b/Documentation/snippets/cross-staff-chords---beaming-problems-workaround.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "chords, keyboards, tweaks-and-overrides, workaround" @@ -15,14 +15,13 @@ cross-staff chords, because no problems with automatic beam collision avoidance then arise. If the stems from the lower staff were used in the following example, it would be necessary to change the automatic beam collision avoidance settings so that it doesn't detect collisions -between staves using @code{\\override Staff.Beam.collision-voice-only -= ##t} +between staves using @code{\\override Staff.Beam.collision-voice-only = +##t} " doctitle = "Cross-staff chords - beaming problems workaround" } % begin verbatim - \new PianoStaff << \new Staff = up \relative c' { diff --git a/Documentation/snippets/cross-staff-stems.ly b/Documentation/snippets/cross-staff-stems.ly index cfcc9ef0d0..448187f8ec 100644 --- a/Documentation/snippets/cross-staff-stems.ly +++ b/Documentation/snippets/cross-staff-stems.ly @@ -1,24 +1,25 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { - lsrtags = "staff-notation, tweaks-and-overrides, contexts-and-engravers" + lsrtags = "contexts-and-engravers, staff-notation, tweaks-and-overrides" + texidoc = " -This snippet shows the use of the @code{Span_stem_engraver} -and @code{\\crossStaff} to connect stems across staves automatically. -The stem length need not be specified, as the variable distance -between noteheads and staves is calculated automatically. +This snippet shows the use of the @code{Span_stem_engraver} and +@code{\\crossStaff} to connect stems across staves automatically. + +The stem length need not be specified, as the variable distance between +noteheads and staves is calculated automatically. + " doctitle = "Cross staff stems" } % begin verbatim - \layout { \context { \PianoStaff diff --git a/Documentation/snippets/cross-staff-tremolos.ly b/Documentation/snippets/cross-staff-tremolos.ly index 980feb5310..83808e2757 100644 --- a/Documentation/snippets/cross-staff-tremolos.ly +++ b/Documentation/snippets/cross-staff-tremolos.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "keyboards, real-music, repeats" @@ -19,7 +19,6 @@ its @code{\\change Staff} command. doctitle = "Cross-staff tremolos" } % begin verbatim - \new PianoStaff << \new Staff = "up" \relative c'' { \key a \major diff --git a/Documentation/snippets/custodes.ly b/Documentation/snippets/custodes.ly index b653e146ac..e22f5a69f3 100644 --- a/Documentation/snippets/custodes.ly +++ b/Documentation/snippets/custodes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "ancient-notation, specific-notation, symbols-and-glyphs, tweaks-and-overrides" @@ -16,7 +16,6 @@ Custodes may be engraved in various styles. doctitle = "Custodes" } % begin verbatim - \layout { ragged-right = ##t } \new Staff \with { \consists "Custos_engraver" } \relative c' { diff --git a/Documentation/snippets/customize-drumpitchnames,-drumstyletable-and-drumpitchtable-in-layout-and-midi.ly b/Documentation/snippets/customize-drumpitchnames,-drumstyletable-and-drumpitchtable-in-layout-and-midi.ly new file mode 100644 index 0000000000..0d2a8cee6a --- /dev/null +++ b/Documentation/snippets/customize-drumpitchnames,-drumstyletable-and-drumpitchtable-in-layout-and-midi.ly @@ -0,0 +1,151 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "midi, percussion, pitches, specific-notation" + + texidoc = " +If you want to use customized drum-pitch-names for an own drum-style +with proper output for layout and midi, follow the steps as +demonstrated in the code below. In short: + +* define the names * define the appearence * tell LilyPond to use it +for layout * assign pitches to the names * tell LilyPond to use them +for midi + +" + doctitle = "Customize drumPitchNames drumStyleTable and drumPitchTable in layout and midi" +} % begin verbatim + +%% This snippet tries to amend +%% NR 2.5.1 Common notation for percussion - Custom percussion staves +%% http://lilypond.org/doc/v2.18/Documentation/notation/common-notation-for-percussion#custom-percussion-staves + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% To use custom drum-pitch-names for your score and midi you need to follow +%% this route: +%% +%%%%%%%%%%%% +%% LAYOUT: +%%%%%%%%%%%% +%% +%% (1) Define a name and put it in `drumPitchNames' +%% This can be done at toplevel with +%% drumPitchNames #'my-name = #'my-name +%% or shorter: +%% drumPitchNames.my-name = #'my-name +%% It's possible to add an alias as well. +%% (2) Define how it should be printed +%% Therefore put them into a toplevel-list, where each entry should look: +%% (my-name +%% note-head-style-or-default +%% articulation-string-or-#f +%% staff-position) +%% Example: +%% #(define my-style +%% '( +%% (my-name default "tenuto" -1) +%% ; ... +%% )) +%% (3) Tell LilyPond to use this custom-definitions, with +%% drumStyleTable = #(alist->hash-table my-style) +%% in a \layout or \with +%% +%% Now we're done for layout, here a short, but complete example: +%% \new DrumStaff +%% \with { drumStyleTable = #(alist->hash-table my-style) } +%% \drummode { my-name } +%% +%%%%%%%%%%%% +%% MIDI: +%%%%%%%%%%%% +%% +%% (1) Again at toplvel, assign a pitch to your custom-note-name +%% midiDrumPitches #'my-name = #(ly:make-pitch -1 4 FLAT) +%% or shorter: +%% midiDrumPitches.my-name = ges +%% Note that you have to use the name, which is in drumPitchNames, no alias +%% (2) Tell LilyPond to use this pitch(es), with +%% drumPitchTable = #(alist->hash-table midiDrumPitches) +%% +%% Example: +%% \score { +%% \new DrumStaff +%% \with { +%% drumStyleTable = #(alist->hash-table my-style) +%% drumPitchTable = #(alist->hash-table midiDrumPitches) +%% } +%% \drummode { my-name4 } +%% \layout {} +%% \midi {} +%% } +%% +%%%%%%%%%%%% +%% TESTING +%%%%%%%%%%%% +%% +%% To test whether all is fine, run the following sequence in terminal: +%% lilypond my-file.ly +%% midi2ly my-file.midi +%% gedit my-file-midi.ly +%% +%% Which will do: +%% 1. create pdf and midi +%% 2. transform the midi back to a .ly-file +%% (note: midi2ly is not always good in correctly identifying enharmonic pitches) +%% 3. open this file in gedit (or use another editor) +%% Now watch what you've got. +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% FULL EXAMPLE +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +drumPitchNames.dbass = #'dbass +drumPitchNames.dba = #'dbass % 'db is in use already +drumPitchNames.dbassmute = #'dbassmute +drumPitchNames.dbm = #'dbassmute +drumPitchNames.do = #'dopen +drumPitchNames.dopenmute = #'dopenmute +drumPitchNames.dom = #'dopenmute +drumPitchNames.dslap = #'dslap +drumPitchNames.ds = #'dslap +drumPitchNames.dslapmute = #'dslapmute +drumPitchNames.dsm = #'dslapmute + +#(define djembe + '((dbass default #f -2) + (dbassmute default "stopped" -2) + (dopen default #f 0) + (dopenmute default "stopped" 0) + (dslap default #f 2) + (dslapmute default "stopped" 2))) + +midiDrumPitches.dbass = g +midiDrumPitches.dbassmute = fis +midiDrumPitches.dopen = a +midiDrumPitches.dopenmute = gis +midiDrumPitches.dslap = b +midiDrumPitches.dslapmute = ais + +one = \drummode { r4 dba4 do ds r dbm dom dsm } + +\score { + \new DrumStaff + \with { + \override StaffSymbol.line-count = #3 + instrumentName = #"Djembe " + drumStyleTable = #(alist->hash-table djembe) + drumPitchTable = #(alist->hash-table midiDrumPitches) + } + \one + \layout {} + \midi {} +} diff --git a/Documentation/snippets/customizing-fretboard-fret-diagrams.ly b/Documentation/snippets/customizing-fretboard-fret-diagrams.ly index f9d5816c37..f619e246a3 100644 --- a/Documentation/snippets/customizing-fretboard-fret-diagrams.ly +++ b/Documentation/snippets/customizing-fretboard-fret-diagrams.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "fretted-strings, tweaks-and-overrides" @@ -20,7 +20,6 @@ can be omitted in property overrides. doctitle = "Customizing fretboard fret diagrams" } % begin verbatim - \include "predefined-guitar-fretboards.ly" \storePredefinedDiagram #default-fret-table \chordmode { c' } #guitar-tuning diff --git a/Documentation/snippets/customizing-markup-fret-diagrams.ly b/Documentation/snippets/customizing-markup-fret-diagrams.ly index 57032ef0fd..b48ecb6058 100644 --- a/Documentation/snippets/customizing-markup-fret-diagrams.ly +++ b/Documentation/snippets/customizing-markup-fret-diagrams.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "fretted-strings, tweaks-and-overrides" @@ -19,7 +19,6 @@ markup. doctitle = "Customizing markup fret diagrams" } % begin verbatim - << \chords { c1 | c | c | d } diff --git a/Documentation/snippets/customizing-the-position-and-number-of-dots-in-repeat-sign-bar-lines.ly b/Documentation/snippets/customizing-the-position-and-number-of-dots-in-repeat-sign-bar-lines.ly new file mode 100644 index 0000000000..8f733ad73e --- /dev/null +++ b/Documentation/snippets/customizing-the-position-and-number-of-dots-in-repeat-sign-bar-lines.ly @@ -0,0 +1,76 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "scheme-language, symbols-and-glyphs" + + texidoc = " +If you want to customize the position and/or number of dots in repeat +sign bar lines, you can define new custom bar lines or redefine the way + default repeat signs are drawn. This snippet shows how. This may be +particularly helpful when using a staff with custom line-positions, as +shown in this snippet. + +" + doctitle = "Customizing the position and number of dots in repeat sign bar lines" +} % begin verbatim + +% \version "2.18.0" + +#(define ((make-custom-dot-bar-line dot-positions) grob extent) + + "Draw dots (repeat sign dots) at @var{dot-positions}. The +coordinates of @var{dot-positions} are equivalent to the +coordinates of @code{StaffSymbol.line-positions}, a dot-position +of X and a line-position of X indicate the same vertical position." + + (let* ((staff-space (ly:staff-symbol-staff-space grob)) + (dot (ly:font-get-glyph (ly:grob-default-font grob) "dots.dot")) + (stencil empty-stencil)) + (for-each + (lambda (dp) + (set! stencil (ly:stencil-add stencil + (ly:stencil-translate-axis dot (* dp (/ staff-space 2)) Y)))) + dot-positions) + stencil)) + +% With the procedure above we can define custom bar-lines, for example, +% one that resembles standard repeat sign bar lines except it has +% three dots at staff positions -3, 0, and 3. + +#(add-bar-glyph-print-procedure "*" (make-custom-dot-bar-line '(-3 0 3))) +\defineBarLine ".|*" #'("" "*" "") +\defineBarLine "*|." #'("" "*" "") + +% We can also customize the dot positions used in all default repeat signs +% by redefining the print procedure of the colon bar glyph (":"). On a staff +% with line-positions of '(-4 -2 2 4) the default repeat sign dots appear +% at '(-3 3), but we can put them at '(-1 1) instead. + +#(add-bar-glyph-print-procedure ":" (make-custom-dot-bar-line '(-1 1))) + + +\new Staff \with { + \override StaffSymbol.line-positions = #'(-4 -2 2 4) + \override StaffSymbol.staff-space = #1.3 +} { + \relative f' { + g1 + \bar ".|*" + g + \bar "*|." + g + \bar ".|:" + g + \bar ":|." + g + \repeat volta 2 { + g + } + } +} diff --git a/Documentation/snippets/default-direction-of-stems-on-the-center-line-of-the-staff.ly b/Documentation/snippets/default-direction-of-stems-on-the-center-line-of-the-staff.ly index 50ff9bc0cd..07471da72d 100644 --- a/Documentation/snippets/default-direction-of-stems-on-the-center-line-of-the-staff.ly +++ b/Documentation/snippets/default-direction-of-stems-on-the-center-line-of-the-staff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations" @@ -17,7 +17,6 @@ by the @code{Stem} property @code{neutral-direction}. doctitle = "Default direction of stems on the center line of the staff" } % begin verbatim - \relative c'' { a4 b c b \override Stem.neutral-direction = #up diff --git a/Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly b/Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly index 88efc8c20f..f6f6672e2c 100644 --- a/Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly +++ b/Documentation/snippets/defining-an-engraver-in-scheme--ambitus-engraver.ly @@ -4,25 +4,23 @@ % and then run scripts/auxiliar/makelsr.py % % This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% Note: this file works from version 2.19.28 +\version "2.19.28" \header { - lsrtags = "contexts-and-engravers" + texidoc = " +This example demonstrates how the ambitus engraver may be defined on +the user side, with a Scheme engraver. - texidoc = "This example demonstrates how the ambitus engraver may be - defined on the user side, with a Scheme engraver. +This is basically a rewrite in Scheme of the code from +@code{lily/ambitus-engraver.cc}. - This is basically a rewrite in Scheme of the code from - @file{lily/ambitus-engraver.cc}. " - doctitle = "Defining an engraver in Scheme: ambitus engraver" } % begin verbatim - #(use-modules (oop goops)) %%% @@ -48,8 +46,6 @@ grob. Rewrite of @code{Accidental_placement::add_accidental} from @file{lily/accidental-placement.cc}." (let ((pitch (ly:accidental-placement::accidental-pitch accidental-grob))) (set! (ly:grob-parent accidental-grob X) grob) - (set! (ly:grob-property accidental-grob 'X-offset) - ly:grob::x-parent-positioning) (let* ((accidentals (ly:grob-object grob 'accidental-grobs)) (handle (assq (ly:pitch-notename pitch) accidentals)) (entry (if handle (cdr handle) '()))) @@ -184,7 +180,7 @@ position of middle C and key signature from @var{translator}'s context." 0)) (set! (ambitus-start-key-sig ambitus) (ly:context-property (ly:translator-context translator) - 'keySignature))))) + 'keyAlterations))))) #(define-method (update-ambitus-notes (ambitus ) note-grob) "Update the upper and lower ambitus pithes of @var{ambitus}, using @@ -297,23 +293,23 @@ position of middle C and key signature from @var{translator}'s context." (let ((ambitus #f)) ;; when music is processed: make the ambitus object, if not already built (make-engraver - ((process-music translator) - (if (not ambitus) - (set! ambitus (make-ambitus translator)))) - ;; set the ambitus clef and key signature state - ((stop-translation-timestep translator) - (if ambitus - (initialize-ambitus-state ambitus translator))) - ;; when a note-head grob is built, update the ambitus notes - (acknowledgers + ((process-music translator) + (if (not ambitus) + (set! ambitus (make-ambitus translator)))) + ;; set the ambitus clef and key signature state + ((stop-translation-timestep translator) + (if ambitus + (initialize-ambitus-state ambitus translator))) + ;; when a note-head grob is built, update the ambitus notes + (acknowledgers ((note-head-interface engraver grob source-engraver) - (if ambitus - (update-ambitus-notes ambitus grob)))) - ;; finally, typeset the ambitus according to its upper and lower notes - ;; (if any). - ((finalize translator) - (if ambitus - (typeset-ambitus ambitus translator))))))) + (if ambitus + (update-ambitus-notes ambitus grob)))) + ;; finally, typeset the ambitus according to its upper and lower notes + ;; (if any). + ((finalize translator) + (if ambitus + (typeset-ambitus ambitus translator))))))) %%% %%% Example diff --git a/Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly b/Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly index 6ba7858cca..6a3b029cd3 100644 --- a/Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly +++ b/Documentation/snippets/defining-predefined-fretboards-for-other-instruments.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "fretted-strings" @@ -27,7 +27,6 @@ information. This is planned to be corrected in the future. doctitle = "Defining predefined fretboards for other instruments" } % begin verbatim - % add FretBoards for the Cuatro % Note: This section could be put into a separate file % predefined-cuatro-fretboards.ly @@ -108,7 +107,7 @@ primeros = { \layout { \context { \Score - \override SpacingSpanner.base-shortest-duration = #(ly:make-moment 1/16) + \override SpacingSpanner.base-shortest-duration = #(ly:make-moment 1 16) } } \midi { } diff --git a/Documentation/snippets/demo-midiinstruments.ly b/Documentation/snippets/demo-midiinstruments.ly index 434587651f..44199d8fd9 100644 --- a/Documentation/snippets/demo-midiinstruments.ly +++ b/Documentation/snippets/demo-midiinstruments.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "midi, real-music, specific-notation" @@ -19,7 +19,6 @@ composition? Solution: A LilyPond demo file. doctitle = "Demo MidiInstruments" } % begin verbatim - \header { title = "Demo of all midi sounds" arranger = "Myself " diff --git a/Documentation/snippets/demonstrating-all-headers.ly b/Documentation/snippets/demonstrating-all-headers.ly index 38b3bc30a9..a99002b0bf 100644 --- a/Documentation/snippets/demonstrating-all-headers.ly +++ b/Documentation/snippets/demonstrating-all-headers.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "paper-and-layout, text, titles" @@ -16,7 +16,6 @@ A demonstration of all headers. doctitle = "Demonstrating all headers" } % begin verbatim - \header { copyright = "copyright" title = "title" diff --git a/Documentation/snippets/display-bracket-with-only-one-staff-in-a-system.ly b/Documentation/snippets/display-bracket-with-only-one-staff-in-a-system.ly index 94d61a4be5..a7d99645bc 100644 --- a/Documentation/snippets/display-bracket-with-only-one-staff-in-a-system.ly +++ b/Documentation/snippets/display-bracket-with-only-one-staff-in-a-system.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "staff-notation, tweaks-and-overrides" diff --git a/Documentation/snippets/displaying-a-whole-grandstaff-system-if-only-one-of-its-staves-is-alive.ly b/Documentation/snippets/displaying-a-whole-grandstaff-system-if-only-one-of-its-staves-is-alive.ly index bb20ae2d0e..72aa7ec0ae 100644 --- a/Documentation/snippets/displaying-a-whole-grandstaff-system-if-only-one-of-its-staves-is-alive.ly +++ b/Documentation/snippets/displaying-a-whole-grandstaff-system-if-only-one-of-its-staves-is-alive.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.15" +\version "2.18.0" \header { lsrtags = "contexts-and-engravers" @@ -35,8 +35,10 @@ the second violin is also displayed. << \new Staff = "Staff_flute" \with { instrumentName = "Flute" - shortInstrumentName = "Fl"} - \relative c' { \repeat unfold 3 { c'4 c c c | c c c c | c c c c | \break } + shortInstrumentName = "Fl" + } + \relative c' { + \repeat unfold 3 { c'4 c c c | c c c c | c c c c | \break } } >> \new StaffGroup = "StaffGroup_Strings" @@ -65,6 +67,8 @@ the second violin is also displayed. >> } \layout { + indent = 3.0\cm + short-indent = 1.5\cm \context { \GrandStaff \consists Keep_alive_together_engraver diff --git a/Documentation/snippets/displaying-complex-chords.ly b/Documentation/snippets/displaying-complex-chords.ly index 902541ce0c..b90be17083 100644 --- a/Documentation/snippets/displaying-complex-chords.ly +++ b/Documentation/snippets/displaying-complex-chords.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "chords, simultaneous-notes, workaround" @@ -18,16 +18,19 @@ with different accidentals. } % begin verbatim fixA = { - \once \override Stem.length = #9 + \once \override Stem.length = #11 } + fixB = { \once \override NoteHead.X-offset = #1.7 + \once \override Stem.length = #7 \once \override Stem.rotation = #'(45 0 0) - \once \override Stem.extra-offset = #'(-0.2 . -0.2) + \once \override Stem.extra-offset = #'(-0.1 . -0.2) \once \override Flag.style = #'no-flag - \once \override Accidental.extra-offset = #'(4 . 0) + \once \override Accidental.extra-offset = #'(4 . -.1) } + \relative c' { << { \fixA 8 } \\ { \voiceThree \fixB dis } >> s } diff --git a/Documentation/snippets/displaying-grob-ancestry.ly b/Documentation/snippets/displaying-grob-ancestry.ly index d6c8d46a2a..dc55c346f2 100644 --- a/Documentation/snippets/displaying-grob-ancestry.ly +++ b/Documentation/snippets/displaying-grob-ancestry.ly @@ -1,29 +1,33 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "devel, scheme-language, tweaks-and-overrides" texidoc = " When working with grob callbacks, it can be helpful to understand a -grob's @qq{ancestry}. Most grobs have @qq{parents} which influence the +grob’s ancestry. Most grobs have parents which influence the positioning of the grob. X- and Y-parents influence the horizontal and vertical positions for the grob, respectively. Additionally, each parent may have parents of its own. -Unfortunately, there are several aspects of a grob's ancestry that can +Unfortunately, there are several aspects of a grob’s ancestry that can lead to confusion: -* The types of parents a grob has may depend on context. * For some -grobs, the X- and Y-parents are the same. * A particular @qq{ancestor} -may be related to a grob in multiple ways. * The concept of -@qq{generations} is misleading. + +* The types of parents a grob has may depend on context. + +* For some grobs, the X- and Y-parents are the same. + +* A particular “ancestor” may be related to a grob in multiple ways. + +* The concept of “generations” is misleading. For example, the @code{System} grob can be both parent (on the Y-side) @@ -31,51 +35,46 @@ and grandparent (twice on the X-side) to a @code{VerticalAlignment} grob. -This macro prints (to the console) a textual representation of a grob's +This macro prints (to the console) a textual representation of a grob’s ancestry. +When called this way: -When called this way - - -@{ - \\once \\override NoteHead.before-line-breaking = #display-ancestry - c @} - +@code{@{ \\once \\override NoteHead.before-line-breaking = +#display-ancestry c @}} The following output is generated: ------------------------------------- - -NoteHead X,Y: NoteColumn - X: PaperColumn - X,Y: System - Y: VerticalAxisGroup - X: NonMusicalPaperColumn - X,Y: System - Y: VerticalAlignment - X: NonMusicalPaperColumn - X,Y: System - Y: System - - +@code{NoteHead X,Y: NoteColumn + X: PaperColumn + X,Y: System + Y: VerticalAxisGroup + X: NonMusicalPaperColumn + X,Y: System + Y: VerticalAlignment + X: NonMusicalPaperColumn + X,Y: System + Y: System} " doctitle = "Displaying grob ancestry" } % begin verbatim -#(define (grob-name grob) - (if (ly:grob? grob) - (assoc-ref (ly:grob-property grob 'meta) 'name) - #f)) +%% http://lsr.di.unimi.it/LSR/Item?id=622 +%% see also http://www.lilypond.org/doc/v2.18/Documentation/snippets/tweaks-and-overrides#tweaks-and-overrides-displaying-grob-ancestry + +%% Remark: +%% grob::name is in the source since 2.19.x could be deleted during next LSR-upgrade +#(define (grob::name grob) + (assq-ref (ly:grob-property grob 'meta) 'name)) #(define (get-ancestry grob) - (if (not (null? (ly:grob-parent grob X))) - (list (grob-name grob) - (get-ancestry (ly:grob-parent grob X)) - (get-ancestry (ly:grob-parent grob Y))) - (grob-name grob))) + (if (not (null? (ly:grob-parent grob X))) + (list (grob::name grob) + (get-ancestry (ly:grob-parent grob X)) + (get-ancestry (ly:grob-parent grob Y))) + (grob::name grob))) #(define (format-ancestry lst padding) (string-append @@ -111,7 +110,9 @@ NoteHead X,Y: NoteColumn (format (current-error-port) "~3&~a~2%~a~&" (make-string 36 #\-) - (format-ancestry (get-ancestry grob) 0))) + (if (ly:grob? grob) + (format-ancestry (get-ancestry grob) 0) + (format #f "~a is not a grob" grob)))) \relative c' { \once \override NoteHead.before-line-breaking = #display-ancestry diff --git a/Documentation/snippets/dotted-harmonics.ly b/Documentation/snippets/dotted-harmonics.ly index aa453021e4..8f2fb4946c 100644 --- a/Documentation/snippets/dotted-harmonics.ly +++ b/Documentation/snippets/dotted-harmonics.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "real-music, tweaks-and-overrides, unfretted-strings" @@ -17,7 +17,6 @@ override this behavior, set the context property @code{harmonicDots}. doctitle = "Dotted harmonics" } % begin verbatim - \relative c''' { \time 3/4 \key f \major diff --git a/Documentation/snippets/double-glissando.ly b/Documentation/snippets/double-glissando.ly index 316dc5fb00..289bee432f 100644 --- a/Documentation/snippets/double-glissando.ly +++ b/Documentation/snippets/double-glissando.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "contemporary-notation, expressive-marks, simultaneous-notes, workaround" @@ -17,7 +17,6 @@ hidden voice. doctitle = "Double glissando" } % begin verbatim - \relative c { \clef bass << diff --git a/Documentation/snippets/drawing-boxes-around-grobs.ly b/Documentation/snippets/drawing-boxes-around-grobs.ly index a95c7739b5..8059c2d011 100644 --- a/Documentation/snippets/drawing-boxes-around-grobs.ly +++ b/Documentation/snippets/drawing-boxes-around-grobs.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, scheme-language, tweaks-and-overrides" @@ -17,7 +17,6 @@ arbitrary grob. doctitle = "Drawing boxes around grobs" } % begin verbatim - \relative c'' { \override TextScript.stencil = #(make-stencil-boxer 0.1 0.3 ly:text-interface::print) @@ -30,7 +29,6 @@ arbitrary grob. b8 \revert Stem.stencil - \revert Flag.stencil c4. c4 \mark "F" diff --git a/Documentation/snippets/drawing-circles-around-note-heads.ly b/Documentation/snippets/drawing-circles-around-note-heads.ly index 44cfe8c7a1..b178fa7f01 100644 --- a/Documentation/snippets/drawing-circles-around-note-heads.ly +++ b/Documentation/snippets/drawing-circles-around-note-heads.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations" @@ -26,4 +26,4 @@ circle = (ly:stencil-extent note X) (ly:stencil-extent note Y)))) -{ \circle c' } +{ \circle c'' } diff --git a/Documentation/snippets/drawing-circles-around-various-objects.ly b/Documentation/snippets/drawing-circles-around-various-objects.ly index 196a3d8c81..a86e85f237 100644 --- a/Documentation/snippets/drawing-circles-around-various-objects.ly +++ b/Documentation/snippets/drawing-circles-around-various-objects.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, scheme-language, tweaks-and-overrides" diff --git a/Documentation/snippets/dynamics-custom-text-spanner-postfix.ly b/Documentation/snippets/dynamics-custom-text-spanner-postfix.ly index b673f2165f..d88f5fbb50 100644 --- a/Documentation/snippets/dynamics-custom-text-spanner-postfix.ly +++ b/Documentation/snippets/dynamics-custom-text-spanner-postfix.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.19.22" \header { lsrtags = "expressive-marks, tweaks-and-overrides" @@ -22,13 +22,13 @@ next note. % Two functions for (de)crescendo spanners where you can explicitly give the % spanner text. mycresc = -#(define-music-function (parser location mymarkup) (markup?) +#(define-music-function (mymarkup) (markup?) (make-music 'CrescendoEvent 'span-direction START 'span-type 'text 'span-text mymarkup)) mydecresc = -#(define-music-function (parser location mymarkup) (markup?) +#(define-music-function (mymarkup) (markup?) (make-music 'DecrescendoEvent 'span-direction START 'span-type 'text diff --git a/Documentation/snippets/dynamics-text-spanner-postfix.ly b/Documentation/snippets/dynamics-text-spanner-postfix.ly index 3a57f5a214..b7f84a1392 100644 --- a/Documentation/snippets/dynamics-text-spanner-postfix.ly +++ b/Documentation/snippets/dynamics-text-spanner-postfix.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" diff --git a/Documentation/snippets/editorial-annotations.snippet-list b/Documentation/snippets/editorial-annotations.snippet-list index c8d2a9a51c..bfe4bfffdc 100644 --- a/Documentation/snippets/editorial-annotations.snippet-list +++ b/Documentation/snippets/editorial-annotations.snippet-list @@ -1,5 +1,6 @@ adding-fingerings-to-a-score.ly adding-links-to-objects.ly +adding-markups-in-a-tablature.ly allowing-fingerings-to-be-printed-inside-the-staff.ly alternative-bar-numbering.ly analysis-brackets-above-the-staff.ly diff --git a/Documentation/snippets/editorial-headword.ly b/Documentation/snippets/editorial-headword.ly index e6b962a557..169e808c6c 100644 --- a/Documentation/snippets/editorial-headword.ly +++ b/Documentation/snippets/editorial-headword.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "headword" @@ -21,8 +21,6 @@ Beethoven, Op. 31, No. 3 Piano sonata 18, Movt II, Scherzo Measures 9 - \include "english.ly" -% NR 1.7 Editorial annotations - % Beethoven, Op. 31, No. 3 % Piano sonata 18, Movt II, Scherzo % Measures 9 - 14 diff --git a/Documentation/snippets/embedding-native-postscript-in-a--markup-block.ly b/Documentation/snippets/embedding-native-postscript-in-a--markup-block.ly index 77354ead09..6aa000eb5f 100644 --- a/Documentation/snippets/embedding-native-postscript-in-a--markup-block.ly +++ b/Documentation/snippets/embedding-native-postscript-in-a--markup-block.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "editorial-annotations, really-cool, specific-notation, text" @@ -17,7 +17,6 @@ block. doctitle = "Embedding native PostScript in a \\markup block" } % begin verbatim - % PostScript is a registered trademark of Adobe Systems Inc. \relative c'' { diff --git a/Documentation/snippets/engravers-one-by-one.ly b/Documentation/snippets/engravers-one-by-one.ly index bae30fb440..5d1bcf060c 100644 --- a/Documentation/snippets/engravers-one-by-one.ly +++ b/Documentation/snippets/engravers-one-by-one.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.29" +\version "2.19.7" \header { lsrtags = "contexts-and-engravers, specific-notation" @@ -41,7 +41,6 @@ line, etc. form a @code{Staff} context. doctitle = "Engravers one-by-one" } % begin verbatim - %% sample music topVoice = \relative c' { \key d \major @@ -109,7 +108,7 @@ MyStaff = \context { \consists "Pitch_squash_engraver" - localKeySignature = #'() + localAlterations = #'() % explicitly set instrumentName, so we don't get % weird effects when doing instrument names for @@ -135,7 +134,7 @@ MyVoice = \context { You have to instantiate this explicitly if you want to have multiple voices on the same staff." - localKeySignature = #'() + localAlterations = #'() \consists "Font_size_engraver" % must come before all diff --git a/Documentation/snippets/engraving-ties-manually.ly b/Documentation/snippets/engraving-ties-manually.ly index 76bf91d1ce..f2a49ce9c3 100644 --- a/Documentation/snippets/engraving-ties-manually.ly +++ b/Documentation/snippets/engraving-ties-manually.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -19,7 +19,6 @@ second number indicates the direction (1 = up, -1 = down). doctitle = "Engraving ties manually" } % begin verbatim - \relative c' { 2~ \override TieColumn.tie-configuration = diff --git a/Documentation/snippets/engraving-tremolos-with-floating-beams.ly b/Documentation/snippets/engraving-tremolos-with-floating-beams.ly index 1338e8c175..48e2f42a0c 100644 --- a/Documentation/snippets/engraving-tremolos-with-floating-beams.ly +++ b/Documentation/snippets/engraving-tremolos-with-floating-beams.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "repeats, rhythms" @@ -25,7 +25,6 @@ the @code{'gap} property. doctitle = "Engraving tremolos with floating beams" } % begin verbatim - \relative c'' { \repeat tremolo 8 { a32 f } \override Beam.gap-count = #1 diff --git a/Documentation/snippets/entering-several-tuplets-using-only-one--times-command.ly b/Documentation/snippets/entering-several-tuplets-using-only-one--tuplet-command.ly similarity index 53% rename from Documentation/snippets/entering-several-tuplets-using-only-one--times-command.ly rename to Documentation/snippets/entering-several-tuplets-using-only-one--tuplet-command.ly index 5e67e60d47..5d005077fc 100644 --- a/Documentation/snippets/entering-several-tuplets-using-only-one--times-command.ly +++ b/Documentation/snippets/entering-several-tuplets-using-only-one--tuplet-command.ly @@ -1,31 +1,29 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.11 -\version "2.17.11" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "rhythms, syntax-and-expressions" texidoc = " The property @code{tupletSpannerDuration} sets how long each of the -tuplets contained within the brackets after @code{\\tuplet} should last. -Many consecutive tuplets can then be placed within a single +tuplets contained within the brackets after @code{\\tuplet} should +last. Many consecutive tuplets can then be placed within a single @code{\\tuplet} expression, thus saving typing. -There are several ways to set @code{tupletSpannerDuration}. The command -@code{\\tupletSpan} sets it to a given duration, and clears it when -instead of a duration @code{\\default} is specified. Another way is -to use an optional argument with @code{\\tuplet}. +There are several ways to set @code{tupletSpannerDuration}. The +command @code{\\tupletSpan} sets it to a given duration, and clears it +when instead of a duration @code{\\default} is specified. Another way +is to use an optional argument with @code{\\tuplet}. + " doctitle = "Entering several tuplets using only one \\tuplet command" } % begin verbatim - - \relative c' { \time 2/4 \tupletSpan 4 diff --git a/Documentation/snippets/expressive-headword.ly b/Documentation/snippets/expressive-headword.ly index b7caf83f1e..2c86cc87f6 100644 --- a/Documentation/snippets/expressive-headword.ly +++ b/Documentation/snippets/expressive-headword.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.27 -\version "2.17.27" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "headword" @@ -17,21 +16,13 @@ Expressive headword doctitle = "Expressive headword" } % begin verbatim -\include "english.ly" - % NR 1.3 Expressive marks % L. v. Beethoven, Op. 49 no. 1 % Piano sonata 19 - "Leichte Sonate" % measures 1 - 12 -%\layout { -% \context { -% \Score -% \override SpacingSpanner.base-shortest-duration = -% #(ly:make-moment 1/20) -% } -%} +\include "english.ly" \new PianoStaff << @@ -272,5 +263,4 @@ Expressive headword 4 \fermata r8 r4 r8 } - >> diff --git a/Documentation/snippets/extending-a-trillspanner.ly b/Documentation/snippets/extending-a-trillspanner.ly new file mode 100644 index 0000000000..af3abd0ade --- /dev/null +++ b/Documentation/snippets/extending-a-trillspanner.ly @@ -0,0 +1,33 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "staff-notation, syntax-and-expressions, tweaks-and-overrides" + + texidoc = " +For @code{TrillSpanner}, the @code{minimum-length} property becomes +effective only if the @code{set-spacing-rods} procedure is called +explicitly. To do this, the @code{springs-and-rods} property should be +set to @code{ly:spanner::set-spacing-rods}. + +" + doctitle = "Extending a TrillSpanner" +} % begin verbatim + +\relative c' { +\key c\minor + \time 2/4 + c16( as') c,-. des-. + \once\override TrillSpanner.minimum-length = #15 + \once\override TrillSpanner.springs-and-rods = #ly:spanner::set-spacing-rods + \afterGrace es4 + \startTrillSpan { d16[( \stopTrillSpan es)] } + c( c' g es c g' es d + \hideNotes + c8) +} diff --git a/Documentation/snippets/extending-glissandi-across-repeats.ly b/Documentation/snippets/extending-glissandi-across-repeats.ly index 4656fac443..698fc4a723 100644 --- a/Documentation/snippets/extending-glissandi-across-repeats.ly +++ b/Documentation/snippets/extending-glissandi-across-repeats.ly @@ -1,30 +1,30 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.19.22" \header { lsrtags = "staff-notation, tweaks-and-overrides" + texidoc = " -A glissando which extends into several @code{\\alternative} blocks -can be simulated by adding a hidden grace note with a glissando -at the start of each @code{\\alternative} block. The grace note -should be at the same pitch as the note which starts the initial -glissando. This is implemented here with a music function which -takes the pitch of the grace note as its argument. +A glissando which extends into several @code{\\alternative} blocks can +be simulated by adding a hidden grace note with a glissando at the +start of each @code{\\alternative} block. The grace note should be at +the same pitch as the note which starts the initial glissando. This is +implemented here with a music function which takes the pitch of the +grace note as its argument. Note that in polyphonic music the grace note must be matched with corresponding grace notes in all other voices. + " doctitle = "Extending glissandi across repeats" } % begin verbatim - -repeatGliss = #(define-music-function (parser location grace) +repeatGliss = #(define-music-function (grace) (ly:pitch?) #{ % the next two lines ensure the glissando is long enough @@ -54,7 +54,7 @@ music = \relative c' { } \alternative { { d1 } - { \repeatGliss c e1 } + { \repeatGliss c \once \omit StringNumber e1\2 } } } @@ -67,4 +67,4 @@ music = \relative c' { \context TabVoice { \clef "moderntab" \music } >> >> -} \ No newline at end of file +} diff --git a/Documentation/snippets/faking-a-hammer-in-tablatures.ly b/Documentation/snippets/faking-a-hammer-in-tablatures.ly index fff3fddafb..9a4a8fcc17 100644 --- a/Documentation/snippets/faking-a-hammer-in-tablatures.ly +++ b/Documentation/snippets/faking-a-hammer-in-tablatures.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings, specific-notation, workaround" @@ -16,7 +16,6 @@ A hammer in tablature can be faked with slurs. doctitle = "Faking a hammer in tablatures" } % begin verbatim - \score { \new TabStaff { \relative c'' { diff --git a/Documentation/snippets/figured-bass-headword.ly b/Documentation/snippets/figured-bass-headword.ly index 8b76e0204d..190cec94a0 100644 --- a/Documentation/snippets/figured-bass-headword.ly +++ b/Documentation/snippets/figured-bass-headword.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "headword" diff --git a/Documentation/snippets/fine-tuning-pedal-brackets.ly b/Documentation/snippets/fine-tuning-pedal-brackets.ly index b9cdf44f71..e10d870258 100644 --- a/Documentation/snippets/fine-tuning-pedal-brackets.ly +++ b/Documentation/snippets/fine-tuning-pedal-brackets.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "keyboards, tweaks-and-overrides" @@ -16,7 +16,6 @@ The appearance of pedal brackets may be altered in different ways. doctitle = "Fine-tuning pedal brackets" } % begin verbatim - \paper { ragged-right = ##f } \relative c'' { c2\sostenutoOn c diff --git a/Documentation/snippets/fingering-symbols-for-wind-instruments.ly b/Documentation/snippets/fingering-symbols-for-wind-instruments.ly index e4ea09092f..4274440b67 100644 --- a/Documentation/snippets/fingering-symbols-for-wind-instruments.ly +++ b/Documentation/snippets/fingering-symbols-for-wind-instruments.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "symbols-and-glyphs, winds" @@ -19,22 +19,27 @@ useful for wind instruments. centermarkup = { \once \override TextScript.self-alignment-X = #CENTER - \once \override TextScript.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)))) + \once \override TextScript.X-offset =#(lambda (g) + (+ (ly:self-alignment-interface::centered-on-x-parent g) + (ly:self-alignment-interface::x-aligned-on-self g))) } -\score -{\relative c' - { + +\score { + \relative c'{ g\open - \once \override TextScript.staff-padding = #-1.0 \centermarkup - g^\markup{\combine \musicglyph #"scripts.open" \musicglyph - #"scripts.tenuto"} - \centermarkup g^\markup{\combine \musicglyph #"scripts.open" - \musicglyph #"scripts.stopped"} + \once \override TextScript.staff-padding = #-1.0 + \centermarkup + g^\markup { + \combine + \musicglyph #"scripts.open" + \musicglyph #"scripts.tenuto" + } + \centermarkup + g^\markup { + \combine + \musicglyph #"scripts.open" + \musicglyph #"scripts.stopped" + } g\stopped } } diff --git a/Documentation/snippets/fingerings,-string-indications,-and-right-hand-fingerings.ly b/Documentation/snippets/fingerings,-string-indications,-and-right-hand-fingerings.ly index f57ab20dee..0b5bc43a1a 100644 --- a/Documentation/snippets/fingerings,-string-indications,-and-right-hand-fingerings.ly +++ b/Documentation/snippets/fingerings,-string-indications,-and-right-hand-fingerings.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings" @@ -17,7 +17,6 @@ right-hand fingering. doctitle = "Fingerings string indications and right-hand fingerings" } % begin verbatim - #(define RH rightHandFinger) \relative c { diff --git a/Documentation/snippets/flamenco-notation.ly b/Documentation/snippets/flamenco-notation.ly index db142cd9d2..c3cfd54623 100644 --- a/Documentation/snippets/flamenco-notation.ly +++ b/Documentation/snippets/flamenco-notation.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.30" +\version "2.18.0" \header { lsrtags = "fretted-strings, specific-notation, stylesheet, version-specific" @@ -34,66 +34,34 @@ This snippet contains some header-like code that can be copied as doctitle = "Flamenco notation" } % begin verbatim - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%% Cut here ----- Start 'flamenco.ly' -% Text indicators -abanico = \markup { \italic Abanico } -rasgueaso = \markup { \italic Ras. } -alzapua = \markup { \italic Alzapua } - -% Finger stroke symbols -strokeUp = \markup { \postscript #" - 0.1 setlinewidth - 0.5 0 moveto - 0.5 2 lineto - 0.2 1.4 lineto - 0.5 2 moveto - 0.8 1.4 lineto - stroke -"} - -strokeDown = \markup { \postscript #" - 0.1 setlinewidth - 0.5 2 moveto - 0.5 0 lineto - 0.2 0.6 lineto - 0.5 0 moveto - 0.8 0.6 lineto - stroke -"} - -% Golpe symbol -golpe = \markup { \postscript #" - 0.2 setlinewidth - 0 0 moveto - 1 0 lineto - 1 1 lineto - stroke - "\postscript #" - 0.1 setlinewidth - -0.6 -0.1 moveto - -0.6 1.0 lineto - 0.5 1.0 lineto - stroke -"} - -strokeUpGolpe = \markup { \column { \golpe \line { \strokeUp } } } -iUpGolpe = \markup { \column { \golpe \line { \small i } \line { \strokeUp } } } - -% Strokes for all fingers -pUp = \markup { \column { \small p \line { \strokeUp } } } -pDown = \markup { \column { \small p \line { \strokeDown } } } -iUp = \markup { \column { \small i \line { \strokeUp } } } -iDown = \markup { \column { \small i \line { \strokeDown } } } -mUp = \markup { \column { \small m \line { \strokeUp } } } -mDown = \markup { \column { \small m \line { \strokeDown } } } -aUp = \markup { \column { \small a \line { \strokeUp } } } -aDown = \markup { \column { \small a \line { \strokeDown } } } -xUp = \markup { \column { \small x \line { \strokeUp } } } -xDown = \markup { \column { \small x \line { \strokeDown } } } +% Text indicators : +abanico = ^\markup\small { \italic Abanico } +rasgueado = ^\markup\small { \italic Ras. } +alzapua = ^\markup\small { \italic Alzapua } + +% Finger stroke symbols : +strokeUp = \markup\combine\override #'(thickness . 1.3) \draw-line #'(0 . 2)\raise #2 \arrow-head #Y #UP ##f +strokeDown = \markup\combine\arrow-head #Y #DOWN ##f \override #'(thickness . 1.3) \draw-line #'(0 . 2) + +% Golpe symbol : +golpe = \markup { + \filled-box #'(0 . 1) #'(0 . 1) #0 + \hspace #-1.6 + \with-color #white + \filled-box #'(0.15 . 0.85) #'(0.15 . 0.85) #0 +} +% Strokes, fingers and golpe command : +RHp = \rightHandFinger #1 +RHi = \rightHandFinger #2 +RHm = \rightHandFinger #3 +RHa = \rightHandFinger #4 +RHx = \rightHandFinger #5 +RHu = \rightHandFinger \strokeUp +RHd = \rightHandFinger \strokeDown +RHg = \rightHandFinger \golpe % Just handy :) tupletOff = { @@ -127,105 +95,98 @@ headsOn = { %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% part = \relative c' { - 8^\iUp - 8^\iDown + \set strokeFingerOrientations = #'(up) + \override StrokeFinger.add-stem-support = ##t + \key a\major + 8 + 8 r4 - r2^\golpe - - 8^\iUp - 8^\iDown - 8^\iUpGolpe - 8^\iDown + r2^\markup\golpe + 8 + 8 + 8 + 8 r2 - - 16^\aUp + 16\rasgueado \headsOff - ^\mUp - ^\iUp - ^\iDown~ + + + ~ \headsOn 2 r4 - \tupletOff \tuplet 5/4 { - 16^\xUp + 16\rasgueado \headsOff - ^\aUp - ^\mUp - ^\iUp - ^\iDown~ + + + + ~ \headsOn } 2 r4 - \tupletsOff \tuplet 3/2 { - 8^\pDown + 8\abanico \headsOff - ^\xUp - ^\iUp + + \headsOn } - \tuplet 3/2 { - 8^\pDown + 8 \headsOff - ^\xUp - ^\iUp + + \headsOn } - \tuplet 3/2 { - 8^\pDown + 8 \headsOff - ^\xUp - ^\iUp + + \headsOn } \tuplet 3/2 { - 8^\pDown + 8 \headsOff - ^\xUp - ^\iUp + + \headsOn } - \tupletsOff \override Beam.positions = #'(2 . 2) \tuplet 3/2 { - a8^\markup{ \small p } - ^\strokeUpGolpe - ^\strokeDown + a8\RHp\alzapua + + } \tuplet 3/2 { - a,8^\markup{ \small p } - ^\strokeUpGolpe - ^\strokeDown + a,8\RHp + + } \tuplet 3/2 { - a,8^\markup{ \small p } - ^\strokeUpGolpe - ^\strokeDown + a,8\RHp + + } \tuplet 3/2 { - a,8^\markup{ \small p } - ^\strokeUpGolpe - ^\strokeDown + a,8\RHp + + } \tupletsOn - - \once \override TextScript.extra-offset = #'(0 . -1) - 1_\golpe^\mUp + 1 \bar "|." } \score { \new StaffGroup << \context Staff = "part" << - \clef G - \transpose c c' + \clef "G_8" { \part } diff --git a/Documentation/snippets/flat-flags-and-beam-nibs.ly b/Documentation/snippets/flat-flags-and-beam-nibs.ly index 9657cfe775..96a6bcc153 100644 --- a/Documentation/snippets/flat-flags-and-beam-nibs.ly +++ b/Documentation/snippets/flat-flags-and-beam-nibs.ly @@ -1,10 +1,11 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.16.0" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.0 +\version "2.19.0" \header { lsrtags = "contemporary-notation, rhythms" @@ -47,7 +48,7 @@ carry both a left- and right-pointing flat flag. Do this with paired (Note that @code{\\set stemLeftBeamCount} is always equivalent to @code{\\once \\set}. In other words, the beam count settings are not @qq{sticky}, so the pair of flat flags attached to the lone -@code{c'16[]} in the last example have nothing to do with the +@code{16[]} in the last example have nothing to do with the @code{\\set} two notes prior.) @@ -69,25 +70,25 @@ carry both a left- and right-pointing flat flag. Do this with paired \new RhythmicStaff { r8. \set stemRightBeamCount = #0 - c16[] + 16[] } % Example 3 \new RhythmicStaff { - c16 c + 16 16 \set stemRightBeamCount = #2 - c16 r r + 16 r r \set stemLeftBeamCount = #2 - c16 c c + 16 16 16 } % Example 4 \new RhythmicStaff { - c16 c + 16 16 \set stemRightBeamCount = #2 - c16 r - c16[] + 16 r16 + 16[] r16 \set stemLeftBeamCount = #2 - c16 c + 16 16 } >> } diff --git a/Documentation/snippets/flat-ties.ly b/Documentation/snippets/flat-ties.ly new file mode 100644 index 0000000000..db63fb42fb --- /dev/null +++ b/Documentation/snippets/flat-ties.ly @@ -0,0 +1,117 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "contemporary-notation, scheme-language, staff-notation, tweaks-and-overrides" + + texidoc = " +The function takes the default @code{Tie.stencil} as an argument, +calculating the result relying on the extents of this default. Further +tweaking is possible by overriding @code{Tie.details.height-limit} or +with @code{\\shape}. It's also possible to change the custom-definition +on the fly. + +" + doctitle = "Flat Ties" +} % begin verbatim + +%% http://lsr.di.unimi.it/LSR/Item?id=1031 + +#(define ((flared-tie coords) grob) + + (define (pair-to-list pair) + (list (car pair) (cdr pair))) + + (define (normalize-coords goods x y dir) + (map + (lambda (coord) + ;(coord-scale coord (cons x (* y dir))) + (cons (* x (car coord)) (* y dir (cdr coord)))) + goods)) + + (define (my-c-p-s points thick) + (make-connected-path-stencil + points + thick + 1.0 + 1.0 + #f + #f)) + + ;; outer let to trigger suicide + (let ((sten (ly:tie::print grob))) + (if (grob::is-live? grob) + (let* ((layout (ly:grob-layout grob)) + (line-thickness (ly:output-def-lookup layout 'line-thickness)) + (thickness (ly:grob-property grob 'thickness 0.1)) + (used-thick (* line-thickness thickness)) + (dir (ly:grob-property grob 'direction)) + (xex (ly:stencil-extent sten X)) + (yex (ly:stencil-extent sten Y)) + (lenx (interval-length xex)) + (leny (interval-length yex)) + (xtrans (car xex)) + (ytrans (if (> dir 0)(car yex) (cdr yex))) + (uplist + (map pair-to-list + (normalize-coords coords lenx (* leny 2) dir)))) + + (ly:stencil-translate + (my-c-p-s uplist used-thick) + (cons xtrans ytrans))) + '()))) + +#(define flare-tie + (flared-tie '((0 . 0)(0.1 . 0.2) (0.9 . 0.2) (1.0 . 0.0)))) + +\layout { + \context { + \Voice + \override Tie.stencil = #flare-tie + } +} + +\paper { ragged-right = ##f } + +\relative c' { + a4~a + \override Tie.height-limit = 4 + a'4~a + a'4~a + ~ q + + \break + + a'4~a + \once \override Tie.details.height-limit = 14 + a4~a + + \break + + a4~a + \once \override Tie.details.height-limit = 0.5 + a4~a + + \break + + a4~a + \shape #'((0 . 0) (0 . 0.4) (0 . 0.4) (0 . 0)) Tie + a4~a + + \break + + a4~a + \once \override Tie.stencil = + #(flared-tie '((0 . 0)(0.1 . 0.4) (0.9 . 0.4) (1.0 . 0.0))) + a4~a + + a4~a + \once \override Tie.stencil = + #(flared-tie '((0 . 0)(0.06 . 0.1) (0.94 . 0.1) (1.0 . 0.0))) + a4~a +} diff --git a/Documentation/snippets/flute-slap-notation.ly b/Documentation/snippets/flute-slap-notation.ly index fb387f9b69..0f1627b324 100644 --- a/Documentation/snippets/flute-slap-notation.ly +++ b/Documentation/snippets/flute-slap-notation.ly @@ -1,10 +1,11 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.17.6" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.22 +\version "2.19.22" \header { lsrtags = "contemporary-notation, winds" @@ -18,15 +19,14 @@ glyph. doctitle = "Flute slap notation" } % begin verbatim - slap = -#(define-music-function (parser location music) (ly:music?) +#(define-music-function (music) (ly:music?) #{ - \override NoteHead.stencil = + \temporary \override NoteHead.stencil = #(lambda (grob) (grob-interpret-markup grob (markup #:musicglyph "scripts.sforzato"))) - \override NoteHead.stem-attachment = + \temporary \override NoteHead.stem-attachment = #(lambda (grob) (let* ((thickness (ly:staff-symbol-line-thickness grob)) (stem (ly:grob-object grob 'stem)) @@ -35,7 +35,7 @@ slap = 0.5 0) (/ thickness 2))))) - $music + #music \revert NoteHead.stencil \revert NoteHead.stem-attachment #}) diff --git a/Documentation/snippets/forcing-a-clef-symbol-to-be-displayed.ly b/Documentation/snippets/forcing-a-clef-symbol-to-be-displayed.ly index 2d02d9aa93..7f0dcb1686 100644 --- a/Documentation/snippets/forcing-a-clef-symbol-to-be-displayed.ly +++ b/Documentation/snippets/forcing-a-clef-symbol-to-be-displayed.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "pitches" @@ -20,7 +20,6 @@ Staff.forceClef = ##t}. doctitle = "Forcing a clef symbol to be displayed" } % begin verbatim - \relative c' { \clef treble c1 diff --git a/Documentation/snippets/forcing-horizontal-shift-of-notes.ly b/Documentation/snippets/forcing-horizontal-shift-of-notes.ly index e2413c73b2..07554c25f0 100644 --- a/Documentation/snippets/forcing-horizontal-shift-of-notes.ly +++ b/Documentation/snippets/forcing-horizontal-shift-of-notes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "simultaneous-notes, tweaks-and-overrides" @@ -18,7 +18,6 @@ are staff spaces. doctitle = "Forcing horizontal shift of notes" } % begin verbatim - \relative c' << { 2 diff --git a/Documentation/snippets/forcing-hyphens-to-be-shown.ly b/Documentation/snippets/forcing-hyphens-to-be-shown.ly index 6ab4f3706f..cf44f33171 100644 --- a/Documentation/snippets/forcing-hyphens-to-be-shown.ly +++ b/Documentation/snippets/forcing-hyphens-to-be-shown.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "vocal-music" @@ -18,7 +18,6 @@ omitted. The behaviour can be overridden with the doctitle = "Forcing hyphens to be shown" } % begin verbatim - \relative c'' { c32 c c c c32 c c c diff --git a/Documentation/snippets/forcing-measure-width-to-adapt-to-metronomemarks-width.ly b/Documentation/snippets/forcing-measure-width-to-adapt-to-metronomemarks-width.ly index 244eefef50..ff5451109d 100644 --- a/Documentation/snippets/forcing-measure-width-to-adapt-to-metronomemarks-width.ly +++ b/Documentation/snippets/forcing-measure-width-to-adapt-to-metronomemarks-width.ly @@ -1,20 +1,20 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.17.6" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.20 + +\version "2.19.20" \header { lsrtags = "staff-notation, workaround" texidoc = " -By default, metronome marks do not influence horizontal spacing. This -has one downside: when using compressed rests, some metronome marks may -be too close and therefore are printed vertically stacked, as -demonstrated in the first part of this example. This can be solved -through a simple override, as shown in the second half of the example. +By default, metronome marks do not influence horizontal spacing. This +can be solved through a simple override, as shown in the second half of +the example. " doctitle = "Forcing measure width to adapt to MetronomeMark's width" @@ -31,13 +31,11 @@ example = { } { - \compressFullBarRests - - \example - - R1 - R1 - - \override Score.MetronomeMark.extra-spacing-width = #'(0 . 0) - \example + \compressMMRests { + \example + R1 + R1 + \override Score.MetronomeMark.extra-spacing-width = #'(-3 . 0) + \example + } } diff --git a/Documentation/snippets/forcing-rehearsal-marks-to-start-from-a-given-letter-or-number.ly b/Documentation/snippets/forcing-rehearsal-marks-to-start-from-a-given-letter-or-number.ly index 7304d1a9b3..5551a36b1c 100644 --- a/Documentation/snippets/forcing-rehearsal-marks-to-start-from-a-given-letter-or-number.ly +++ b/Documentation/snippets/forcing-rehearsal-marks-to-start-from-a-given-letter-or-number.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "automatic-notation, preparing-parts, really-simple, rhythms" @@ -17,7 +17,6 @@ marks, but from the letter or number desired. doctitle = "Forcing rehearsal marks to start from a given letter or number" } % begin verbatim - \relative c'' { c1 \mark \default c1 \mark \default @@ -26,7 +25,7 @@ marks, but from the letter or number desired. c1 \mark \default c1 \mark \default c1 \mark \default - c1 \mark \default + c1 \break \set Score.markFormatter = #format-mark-numbers c1 \mark #1 @@ -37,5 +36,5 @@ marks, but from the letter or number desired. c1 \mark \default c1 \mark \default c1 \mark \default - c1 \mark \default + c1 } diff --git a/Documentation/snippets/formatting-lyrics-syllables.ly b/Documentation/snippets/formatting-lyrics-syllables.ly index aa5df6fa83..983c0b98bc 100644 --- a/Documentation/snippets/formatting-lyrics-syllables.ly +++ b/Documentation/snippets/formatting-lyrics-syllables.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "text, vocal-music" diff --git a/Documentation/snippets/fret-diagrams-explained-and-developed.ly b/Documentation/snippets/fret-diagrams-explained-and-developed.ly index 7ae4dead64..4f6ea0daf2 100644 --- a/Documentation/snippets/fret-diagrams-explained-and-developed.ly +++ b/Documentation/snippets/fret-diagrams-explained-and-developed.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "fretted-strings, tweaks-and-overrides" @@ -17,7 +17,6 @@ diagrams. doctitle = "Fret diagrams explained and developed" } % begin verbatim - << \chords { a2 a diff --git a/Documentation/snippets/fretboards-alternate-tables.ly b/Documentation/snippets/fretboards-alternate-tables.ly index 68965a6ee5..8458350411 100644 --- a/Documentation/snippets/fretboards-alternate-tables.ly +++ b/Documentation/snippets/fretboards-alternate-tables.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings" diff --git a/Documentation/snippets/fretted-headword.ly b/Documentation/snippets/fretted-headword.ly index 6b8f910d87..22de249b5e 100644 --- a/Documentation/snippets/fretted-headword.ly +++ b/Documentation/snippets/fretted-headword.ly @@ -1,31 +1,20 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.30 -% INSPIRATIONAL HEADER FOR LILYPOND DOCUMENTATION fretted-strings % -% Passage from Johann Kaspar Mertz "Opern Revue, Op. 8, no. 17" % -% on melodies from Bellini's "Norma" % -%*****************************************************************% - -\version "2.17.30" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.19.22" \header { lsrtags = "headword" - texidoc = "" - doctitle = "headword" -} % begin verbatim - + texidoc = " +Fretted headword -\layout { - \context { - \Score - \remove "Bar_number_engraver" - } -} +" + doctitle = "Fretted headword" +} % begin verbatim %%%% shortcuts % fingering orientations @@ -41,7 +30,7 @@ ssnod = \set stringNumberOrientations = #'(down) ssnor = \set stringNumberOrientations = #'(right) % define fingering offset -FO = #(define-music-function (parser location offsetX offsetY) (number? number?) +FO = #(define-music-function (offsetX offsetY) (number? number?) #{ \once \override Voice.Fingering.extra-offset = #(cons offsetX offsetY) #}) @@ -141,10 +130,10 @@ bass = \relative c { \layout { \context { \Score + \remove "Bar_number_engraver" \override Fingering.staff-padding = #'() \omit TupletNumber \override TupletBracket.bracket-visibility = ##f } } - \midi { } } diff --git a/Documentation/snippets/fretted-string-harmonics-in-tablature.ly b/Documentation/snippets/fretted-string-harmonics-in-tablature.ly index a62c85dddd..ea58f737f6 100644 --- a/Documentation/snippets/fretted-string-harmonics-in-tablature.ly +++ b/Documentation/snippets/fretted-string-harmonics-in-tablature.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "fretted-strings" @@ -67,7 +67,8 @@ frettedStrings = { \score { << - \new Staff { + \new Staff + \with { \omit StringNumber } { \new Voice { \clef "treble_8" \harmonics diff --git a/Documentation/snippets/fretted-strings.snippet-list b/Documentation/snippets/fretted-strings.snippet-list index 35ad8bda09..36db6ac1ea 100644 --- a/Documentation/snippets/fretted-strings.snippet-list +++ b/Documentation/snippets/fretted-strings.snippet-list @@ -1,7 +1,8 @@ adding-fingerings-to-a-score.ly adding-fingerings-to-tablatures.ly +adding-markups-in-a-tablature.ly allowing-fingerings-to-be-printed-inside-the-staff.ly -bar-chords-notation-for-guitar--with-text-spanner.ly +bar-chords-notation-for-guitar-with-text-spanner.ly changing-fret-orientations.ly chord-glissando-in-tablature.ly chordchanges-for-fretboards.ly @@ -23,6 +24,7 @@ hammer-on-and-pull-off.ly how-to-change-fret-diagram-position.ly jazz-combo-template.ly laissez-vibrer-ties.ly +let-tabstaff-print-the-topmost-string-at-bottom.ly letter-tablature-formatting.ly open-string-harmonics-in-tablature.ly placement-of-right-hand-fingerings.ly diff --git a/Documentation/snippets/generating-custom-flags.ly b/Documentation/snippets/generating-custom-flags.ly index 99579b27f4..3ba7022e5b 100644 --- a/Documentation/snippets/generating-custom-flags.ly +++ b/Documentation/snippets/generating-custom-flags.ly @@ -1,24 +1,22 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "rhythms, tweaks-and-overrides" texidoc = " -The @code{stencil} property of the Flag grob can be set to a custom scheme -function to generate the glyph for the flag. +The @code{stencil} property of the @code{Flag} grob can be set to a +custom scheme function to generate the glyph for the flag. " doctitle = "Generating custom flags" } % begin verbatim - #(define-public (weight-flag grob) (let* ((stem-grob (ly:grob-parent grob X)) (log (- (ly:grob-property stem-grob 'duration-log) 2)) @@ -47,7 +45,10 @@ function to generate the glyph for the flag. (rotated-flag (ly:stencil-rotate-absolute stencil 180 0 0))) (ly:stencil-translate rotated-flag (cons (- (/ stem-width 2)) 0)))) -snippetexamplenotes = { \autoBeamOff c'8 d'16 c'32 d'64 \acciaccatura {c'8} d'64 } +snippetexamplenotes = +{ + \autoBeamOff c'8 d'16 c'32 d'64 \acciaccatura {c'8} d'64 +} { \override Score.RehearsalMark.self-alignment-X = #LEFT diff --git a/Documentation/snippets/generating-random-notes.ly b/Documentation/snippets/generating-random-notes.ly index cf2bfb23e9..d979660dfa 100644 --- a/Documentation/snippets/generating-random-notes.ly +++ b/Documentation/snippets/generating-random-notes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "pitches, really-cool, scheme-language" @@ -19,7 +19,6 @@ get different random note patterns, just change this number. doctitle = "Generating random notes" } % begin verbatim - \score { { $(let ((random-state (seed->random-state (current-time)))) diff --git a/Documentation/snippets/generating-whole-scores-also-book-parts-in-scheme-without-using-the-parser.ly b/Documentation/snippets/generating-whole-scores-also-book-parts-in-scheme-without-using-the-parser.ly index cc30a8b2bf..b710ea507d 100644 --- a/Documentation/snippets/generating-whole-scores-also-book-parts-in-scheme-without-using-the-parser.ly +++ b/Documentation/snippets/generating-whole-scores-also-book-parts-in-scheme-without-using-the-parser.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.19.22" \header { lsrtags = "automatic-notation, really-cool, scheme-language" @@ -13,8 +13,7 @@ A lilypond score internally is just a Scheme expression, generated by the lilypond parser. Using scheme, one can also automatically generate a score without an input file. If you have the music expression in -scheme, a score can be generated by simply calling (scorify-music music -parser) on your music. This will generate a score object, for which you +scheme, a score can be generated by simply calling (scorify-music music) on your music. This will generate a score object, for which you can then set a custom layout block with (let* ((layout (ly:output-def-clone $defaultlayout))) ; modify the layout here, then assign it: @@ -23,8 +22,8 @@ can then set a custom layout block with (let* ((layout Finally, all you have to do it to pass this score to lilypond for -typesetting. This snippet defines functions @code{(add-score parser -score)}, @code{(add-text parser text)} and @code{(add-music parser +typesetting. This snippet defines functions @code{(add-score +score)}, @code{(add-text text)} and @code{(add-music music)} to pass a complete score, some markup or some music to lilypond for typesetting. @@ -38,35 +37,35 @@ modified to inser all collected scores so far to the book. " doctitle = "Generating whole scores (also book parts) in scheme without using the parser" } % begin verbatim +%% -#(define-public (add-score parser score) - (ly:parser-define! parser 'toplevel-scores - (cons score (ly:parser-lookup parser 'toplevel-scores)))) +#(define-public (add-score score) + (ly:parser-define! 'toplevel-scores + (cons score (ly:parser-lookup 'toplevel-scores)))) -#(define-public (add-text parser text) - (add-score parser (list text))) +#(define-public (add-text text) + (add-score (list text))) -#(define-public (add-music parser music) +#(define-public (add-music music) (collect-music-aux (lambda (score) - (add-score parser score)) - parser + (add-score score)) music)) -#(define-public (toplevel-book-handler parser book) +#(define-public (toplevel-book-handler book) (map (lambda (score) (ly:book-add-score! book score)) - (reverse! (ly:parser-lookup parser 'toplevel-scores))) - (ly:parser-define! parser 'toplevel-scores (list)) - (print-book-with-defaults parser book)) + (reverse! (ly:parser-lookup 'toplevel-scores))) + (ly:parser-define! 'toplevel-scores (list)) + (print-book-with-defaults book)) #(define-public (book-score-handler book score) - (add-score parser score)) + (add-score score)) #(define-public (book-text-handler book text) - (add-text parser text)) + (add-text text)) -#(define-public (book-music-handler parser book music) - (add-music parser music)) +#(define-public (book-music-handler book music) + (add-music music)) %%% @@ -80,7 +79,7 @@ modified to inser all collected scores so far to the book. 'elements (list (make-music 'NoteEvent 'duration (ly:make-duration 2 0 1/1) 'pitch (ly:make-pitch 0 pitch 0))))) - (score (scorify-music music parser)) + (score (scorify-music music)) (layout (ly:output-def-clone $defaultlayout)) (note-name (case pitch ((0) "do") @@ -93,13 +92,13 @@ modified to inser all collected scores so far to the book. (else "huh"))) (title (markup #:large #:line ("Score with a" note-name)))) (ly:score-add-output-def! score layout) - (add-text parser title) - (add-score parser score)) + (add-text title) + (add-score score)) (set! pitch (modulo (1+ pitch) 7))))) oneNoteScore = -#(define-music-function (parser location) () - (add-one-note-score parser) +#(define-music-function () () + (add-one-note-score (*parser*)) (make-music 'Music 'void #t)) %%% diff --git a/Documentation/snippets/glissandi-can-skip-grobs.ly b/Documentation/snippets/glissandi-can-skip-grobs.ly index 32caca079c..f9e7632cad 100644 --- a/Documentation/snippets/glissandi-can-skip-grobs.ly +++ b/Documentation/snippets/glissandi-can-skip-grobs.ly @@ -1,19 +1,21 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "expressive-marks, staff-notation, tweaks-and-overrides" + + texidoc = " +@code{NoteColumn} grobs can be skipped over by glissandi. + +" doctitle = "Glissandi can skip grobs" - texidoc = "@code{NoteColumn} grobs can be skipped over by glissandi." } % begin verbatim - \relative c' { a2 \glissando \once \override NoteColumn.glissando-skip = ##t diff --git a/Documentation/snippets/graphical-and-text-woodwind-diagrams.ly b/Documentation/snippets/graphical-and-text-woodwind-diagrams.ly index 5233a96703..524a742b51 100644 --- a/Documentation/snippets/graphical-and-text-woodwind-diagrams.ly +++ b/Documentation/snippets/graphical-and-text-woodwind-diagrams.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "winds" diff --git a/Documentation/snippets/grid-lines--changing-their-appearance.ly b/Documentation/snippets/grid-lines--changing-their-appearance.ly index 254a266304..561a346a3f 100644 --- a/Documentation/snippets/grid-lines--changing-their-appearance.ly +++ b/Documentation/snippets/grid-lines--changing-their-appearance.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "editorial-annotations" @@ -17,7 +17,6 @@ properties. doctitle = "Grid lines: changing their appearance" } % begin verbatim - \score { \new ChoirStaff << \new Staff { diff --git a/Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly b/Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly index 927ad32969..f6c1dc3593 100644 --- a/Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly +++ b/Documentation/snippets/grid-lines--emphasizing-rhythms-and-notes-synchronization.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.30" +\version "2.18.0" \header { lsrtags = "editorial-annotations" @@ -19,7 +19,6 @@ this snippet. doctitle = "Grid lines: emphasizing rhythms and notes synchronization" } % begin verbatim - \score { \new ChoirStaff { \relative c'' << diff --git a/Documentation/snippets/guitar-slides.ly b/Documentation/snippets/guitar-slides.ly index e2e2b802f2..c77388cf87 100644 --- a/Documentation/snippets/guitar-slides.ly +++ b/Documentation/snippets/guitar-slides.ly @@ -1,25 +1,24 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.30 -\version "2.17.30" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "fretted-strings" texidoc = " Unlike glissandos, slides may go from an imprecise point of the -fretboard to a specific fret. A good way to do that is to add a grace -hidden note before the note which is actually played, as demonstrated -in the following example. +fretboard to a specific fret. A good way to do this is to add a hidden +grace note before the note which is actually played, as demonstrated in +the following example. + " doctitle = "Guitar slides" } % begin verbatim - %% Hide fret number: useful to draw slide into/from a casual point of %% the fretboard. hideFretNumber = { diff --git a/Documentation/snippets/guitar-strum-rhythms.ly b/Documentation/snippets/guitar-strum-rhythms.ly index 7de010c2b6..2e52aeb090 100644 --- a/Documentation/snippets/guitar-strum-rhythms.ly +++ b/Documentation/snippets/guitar-strum-rhythms.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings, rhythms" @@ -17,7 +17,6 @@ melody notes, chord names and fret diagrams. doctitle = "Guitar strum rhythms" } % begin verbatim - \include "predefined-guitar-fretboards.ly" << \new ChordNames { diff --git a/Documentation/snippets/hairpins-with-different-line-styles.ly b/Documentation/snippets/hairpins-with-different-line-styles.ly index ebfcda0513..2de50e5d30 100644 --- a/Documentation/snippets/hairpins-with-different-line-styles.ly +++ b/Documentation/snippets/hairpins-with-different-line-styles.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" @@ -17,7 +17,6 @@ dotted-line, line, trill or zigzag. doctitle = "Hairpins with different line styles" } % begin verbatim - \relative c' { c2\< c\! \override Hairpin.style = #'dashed-line diff --git a/Documentation/snippets/hammer-on-and-pull-off-using-chords.ly b/Documentation/snippets/hammer-on-and-pull-off-using-chords.ly index 880a2cf8fd..569e77bded 100644 --- a/Documentation/snippets/hammer-on-and-pull-off-using-chords.ly +++ b/Documentation/snippets/hammer-on-and-pull-off-using-chords.ly @@ -1,25 +1,23 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "editorial-annotations, fretted-strings" texidoc = " When using hammer-on or pull-off with chorded notes, only a single arc -is drawn. However @q{double arcs} are possible by setting the +is drawn. However @qq{double arcs} are possible by setting the @code{doubleSlurs} property to @code{#t}. " doctitle = "Hammer on and pull off using chords" } % begin verbatim - \new TabStaff { \relative c' { % chord hammer-on and pull-off diff --git a/Documentation/snippets/hammer-on-and-pull-off-using-voices.ly b/Documentation/snippets/hammer-on-and-pull-off-using-voices.ly index df84036ae8..e44c81786a 100644 --- a/Documentation/snippets/hammer-on-and-pull-off-using-voices.ly +++ b/Documentation/snippets/hammer-on-and-pull-off-using-voices.ly @@ -1,24 +1,22 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "editorial-annotations, fretted-strings" texidoc = " -The arc of hammer-on and pull-off is upwards in voices one and three and -downwards in voices two and four: +The arc of hammer-on and pull-off is upwards in voices one and three +and downwards in voices two and four: " doctitle = "Hammer on and pull off using voices" } % begin verbatim - \new TabStaff { \relative c' { << { \voiceOne g2( a) } diff --git a/Documentation/snippets/hammer-on-and-pull-off.ly b/Documentation/snippets/hammer-on-and-pull-off.ly index 57c830a2ce..fbc12b9f6b 100644 --- a/Documentation/snippets/hammer-on-and-pull-off.ly +++ b/Documentation/snippets/hammer-on-and-pull-off.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "editorial-annotations, fretted-strings" @@ -17,7 +16,6 @@ Hammer-on and pull-off can be obtained using slurs. doctitle = "Hammer on and pull off" } % begin verbatim - \new TabStaff { \relative c' { d4( e\2) diff --git a/Documentation/snippets/heavily-customized-polymetric-time-signatures.ly b/Documentation/snippets/heavily-customized-polymetric-time-signatures.ly index 8c939d25c1..53d7f2120e 100644 --- a/Documentation/snippets/heavily-customized-polymetric-time-signatures.ly +++ b/Documentation/snippets/heavily-customized-polymetric-time-signatures.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.15 -\version "2.17.15" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "contemporary-notation, percussion, real-music, rhythms" @@ -19,7 +18,6 @@ is the template of a real Balkan song!). doctitle = "Heavily customized polymetric time signatures" } % begin verbatim - melody = \relative c'' { \set Staff.instrumentName = #"Bb Sop." \key g \major diff --git a/Documentation/snippets/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly b/Documentation/snippets/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly index 1c3c4ea4ea..98fa6bc099 100644 --- a/Documentation/snippets/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly +++ b/Documentation/snippets/hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "pitches" diff --git a/Documentation/snippets/hiding-the-extender-line-for-text-dynamics.ly b/Documentation/snippets/hiding-the-extender-line-for-text-dynamics.ly index 682e2d5421..b92da64840 100644 --- a/Documentation/snippets/hiding-the-extender-line-for-text-dynamics.ly +++ b/Documentation/snippets/hiding-the-extender-line-for-text-dynamics.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks" @@ -18,7 +18,6 @@ following way: doctitle = "Hiding the extender line for text dynamics" } % begin verbatim - \relative c'' { \override DynamicTextSpanner.style = #'none \crescTextCresc diff --git a/Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly b/Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly index 724062ec24..5e43ce5333 100644 --- a/Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly +++ b/Documentation/snippets/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly @@ -1,14 +1,13 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { - lsrtags = "correction-wanted, expressive-marks, tweaks-and-overrides, version-specific" + lsrtags = "expressive-marks, tweaks-and-overrides, version-specific" texidoc = " Some dynamic expressions involve additional text, like @qq{sempre pp}. @@ -23,13 +22,13 @@ before the note with the dynamics to manually shift it to the correct position. Drawback: This has to be done manually each time you use that dynamic markup... -* Add some padding (@code{#:hspace 7.1}) into the -definition of your custom dynamic mark, so that after lilypond -center-aligns it, it is already correctly aligned. Drawback: The -padding really takes up that space and does not allow any other markup -or dynamics to be shown in that position. +* Add some padding (@code{#:hspace 7.1}) into the definition of your +custom dynamic mark, so that after lilypond center-aligns it, it is +already correctly aligned. Drawback: The padding really takes up that +space and does not allow any other markup or dynamics to be shown in +that position. -* Shift the dynamic script @code{\\once\\override ...X-offset = ..}. +* Shift the dynamic script @code{\\once\\override ... .X-offset = ..}. Drawback: @code{\\once\\override} is needed for every invocation! * Set the dimensions of the additional text to 0 (using @@ -44,17 +43,21 @@ dynamic-script. * Set an explicit alignment inside the dynamic-script. By default, this won't have any effect, only if one sets X-offset! Drawback: One needs -to set @code{DynamicText #'X-offset}, which will apply to all dynamic +to set @code{DynamicText.X-offset}, which will apply to all dynamic texts! Also, it is aligned at the right edge of the additional text, not at the center of pp. + + + + " doctitle = "Horizontally aligning custom dynamics (e.g. \"sempre pp\" \"piu f\" \"subito p\")" } % begin verbatim - -\header { title = "Horizontally aligning custom dynamics" } - -\paper { ragged-right = ##f } +\paper { + ragged-right = ##f + indent = 2.5\cm +} % Solution 1: Using a simple markup with a particular halign value % Drawback: It's a markup, not a dynamic command, so \dynamicDown @@ -121,6 +124,7 @@ semppMII = \context Staff = "s" << \set Staff.instrumentName = #"Normal" \relative c'' { + \override Staff.InstrumentName.self-alignment-X = #LEFT \key es \major c4\pp c\p c c | c\ff c c\pp c } @@ -128,6 +132,7 @@ semppMII = \context Staff = "sMarkup" << \set Staff.instrumentName = \markup \column { Normal markup } \relative c'' { + \override Staff.InstrumentName.self-alignment-X = #LEFT \key es \major c4-\semppMarkup c\p c c | c\ff c c-\semppMarkup c } @@ -135,6 +140,7 @@ semppMII = \context Staff = "sK" << \set Staff.instrumentName = \markup \column { Explicit shifting } \relative c'' { + \override Staff.InstrumentName.self-alignment-X = #LEFT \key es \major \once \override DynamicText.X-offset = #-9.2 c4\semppK c\p c c @@ -146,6 +152,7 @@ semppMII = \context Staff = "sT" << \set Staff.instrumentName = \markup \column { Right padding } \relative c'' { + \override Staff.InstrumentName.self-alignment-X = #LEFT \key es \major c4\semppT c\p c c | c\ff c c\semppT c } @@ -153,6 +160,7 @@ semppMII = \context Staff = "sM" << \set Staff.instrumentName = \markup \column { Setting dimension "to zero" } \relative c'' { + \override Staff.InstrumentName.self-alignment-X = #LEFT \key es \major c4\semppM c\p c c | c\ff c c\semppM c } @@ -160,6 +168,7 @@ semppMII = \context Staff = "sG" << \set Staff.instrumentName = \markup \column { Shifting inside dynamics } \relative c'' { + \override Staff.InstrumentName.self-alignment-X = #LEFT \key es \major c4\semppG c\p c c | c\ff c c\semppG c } @@ -167,6 +176,7 @@ semppMII = \context Staff = "sMII" << \set Staff.instrumentName = \markup \column { Alignment inside dynamics } \relative c'' { + \override Staff.InstrumentName.self-alignment-X = #LEFT \key es \major % Setting to ##f (false) gives the same result \override DynamicText.X-offset = #0 diff --git a/Documentation/snippets/how-to-change-fret-diagram-position.ly b/Documentation/snippets/how-to-change-fret-diagram-position.ly index cbcd2bc9c7..e1b3dd9b74 100644 --- a/Documentation/snippets/how-to-change-fret-diagram-position.ly +++ b/Documentation/snippets/how-to-change-fret-diagram-position.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "fretted-strings, specific-notation, tweaks-and-overrides" @@ -29,7 +29,6 @@ itself. doctitle = "How to change fret diagram position" } % begin verbatim - harmonies = \chordmode { a8:13 @@ -43,8 +42,8 @@ harmonies = \chordmode \score { << - \context ChordNames \harmonies - \context Staff + \new ChordNames \harmonies + \new Staff {a8^\markup { \fret-diagram #"6-x;5-0;4-2;3-0;2-0;1-2;" } % THE FOLLOWING IS THE COMMAND TO MOVE THE FRET DIAGRAM \once \override TextScript.extra-offset = #'(10 . 0) diff --git a/Documentation/snippets/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-1.ly b/Documentation/snippets/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-1.ly index 1a84268db6..9993627f73 100644 --- a/Documentation/snippets/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-1.ly +++ b/Documentation/snippets/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-1.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.24 -\version "2.17.24" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "editorial-annotations, expressive-marks, staff-notation, tweaks-and-overrides" @@ -31,25 +30,22 @@ affecting the other. It may also give some problems with vertical spacing, since using @code{extra-offset} does not change the bounding box of the mark from its original value. - - " doctitle = "How to print two rehearsal marks above and below the same barline (method 1)" } % begin verbatim - \relative c'{ - c d e f | - \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5) - \once \override Score.RehearsalMark.baseline-skip = #9 - \mark \markup \center-column { \circle 1 \box A } - g f e d | - \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5) - \once \override Score.RehearsalMark.baseline-skip = #9 - \mark \markup \center-column { \flat { \bold \small \italic Fine. } } - g f e d | - \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5) - \once \override Score.RehearsalMark.baseline-skip = #9 - \override Score.RehearsalMark.break-visibility = #begin-of-line-invisible - \mark \markup \center-column { \fermata \box z } + c d e f | + \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5) + \once \override Score.RehearsalMark.baseline-skip = #9 + \mark \markup \center-column { \circle 1 \box A } + g f e d | + \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5) + \once \override Score.RehearsalMark.baseline-skip = #9 + \mark \markup \center-column { \flat { \bold \small \italic Fine. } } + g f e d | + \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5) + \once \override Score.RehearsalMark.baseline-skip = #9 + \override Score.RehearsalMark.break-visibility = #begin-of-line-invisible + \mark \markup \center-column { \fermata \box z } } diff --git a/Documentation/snippets/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-2.ly b/Documentation/snippets/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-2.ly index 12d760f3ff..4e22c3caf0 100644 --- a/Documentation/snippets/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-2.ly +++ b/Documentation/snippets/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-2.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, expressive-marks, staff-notation, tweaks-and-overrides" @@ -23,7 +23,6 @@ independently of the other. doctitle = "How to print two rehearsal marks above and below the same barline (method 2)" } % begin verbatim - \score { \relative c' << diff --git a/Documentation/snippets/how-to-put-ties-between-syllables-in-lyrics.ly b/Documentation/snippets/how-to-put-ties-between-syllables-in-lyrics.ly index c43b550c9d..0191bbba97 100644 --- a/Documentation/snippets/how-to-put-ties-between-syllables-in-lyrics.ly +++ b/Documentation/snippets/how-to-put-ties-between-syllables-in-lyrics.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "specific-notation, symbols-and-glyphs, text, vocal-music" @@ -16,7 +16,6 @@ This can be achieved by separating those syllables by tildes. doctitle = "How to put ties between syllables in lyrics" } % begin verbatim - \lyrics { wa~o~a } diff --git a/Documentation/snippets/hymn-template.ly b/Documentation/snippets/hymn-template.ly index a6b6004a43..d748938d09 100644 --- a/Documentation/snippets/hymn-template.ly +++ b/Documentation/snippets/hymn-template.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "template, vocal-music" @@ -18,7 +18,6 @@ verses as stand-alone text under the music. doctitle = "Hymn template" } % begin verbatim - Timeline = { \time 4/4 \tempo 4=96 diff --git a/Documentation/snippets/incipit.ly b/Documentation/snippets/incipit.ly index b078cc0f53..522bf1d730 100644 --- a/Documentation/snippets/incipit.ly +++ b/Documentation/snippets/incipit.ly @@ -4,54 +4,27 @@ % and then run scripts/auxiliar/makelsr.py % % This file is in the public domain. -%% Note: this file works from version 2.17.30 -\version "2.17.30" +%% Note: this file works from version 2.19.16 +\version "2.19.16" \header { - lsrtags = "staff-notation, ancient-notation, really-cool" + lsrtags = "ancient-notation, staff-notation" + texidoc = " -Incipits can be added using the instrument name grob, but keeping -separate the instrument name definition and the incipit definition. +When transcribing mensural music, an incipit at the beginning of the piece is +useful to indicate the original key and tempo. Musicians today are used +to bar lines, but these were not known during the period of mensural music. As +a compromise, bar lines are often printed between the staves, a layout style +called mensurstriche layout. " + doctitle = "Incipit" } % begin verbatim -incipit = -#(define-music-function (parser location incipit-music) (ly:music?) - #{ - \once \override Staff.InstrumentName.self-alignment-X = #RIGHT - \once \override Staff.InstrumentName.self-alignment-Y = ##f - \once \override Staff.InstrumentName.padding = #0.3 - \once \override Staff.InstrumentName.stencil = - #(lambda (grob) - (let* ((instrument-name (ly:grob-property grob 'long-text))) - (set! (ly:grob-property grob 'long-text) - #{ \markup - \score - { - { \context MensuralStaff \with { - instrumentName = #instrument-name - } $incipit-music - } - \layout { $(ly:grob-layout grob) - line-width = \indent - indent = - % primitive-eval is probably easiest for - % escaping lexical closure and evaluating - % everything respective to (current-module). - #(primitive-eval - '(or (false-if-exception (- indent incipit-width)) - (* 0.5 indent))) - ragged-right = ##f - ragged-last = ##f - system-count = #1 } - } - #}) - (system-start-text::print grob))) - #}) - -%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% A short excerpt from the Jubilate Deo by Orlande de Lassus +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% global = { \set Score.skipBars = ##t @@ -68,18 +41,12 @@ global = { \bar "|." } -discantusIncipit = << - \new MensuralVoice = "discantusIncipit" << - \repeat unfold 9 { s1 \noBreak } - { - \clef "neomensural-c1" - \key f \major - \time 2/2 - c''1. - } - >> - \new Lyrics \lyricsto discantusIncipit { IV- } ->> +discantusIncipit = { + \clef "neomensural-c1" + \key f \major + \time 2/2 + c''1. +} discantusNotes = { \transpose c' c'' { @@ -96,32 +63,22 @@ discantusNotes = { } discantusLyrics = \lyricmode { - Ju -- bi -- | - la -- te De -- | - o, om -- - nis ter -- | - ra, __ om- | - "..." | - -us. | + Ju -- bi -- la -- te De -- o, + om -- nis ter -- ra, __ om- + "..." + -us. } -altusIncipit = << - \new MensuralVoice = "altusIncipit" << - \repeat unfold 9 { s1 \noBreak } - { - \clef "neomensural-c3" - \key f \major - \time 2/2 - r1 f'1. - } - >> - \new Lyrics \lyricsto altusIncipit { IV- } ->> +altusIncipit = { + \clef "neomensural-c3" + \key f \major + \time 2/2 + r1 f'1. +} altusNotes = { \transpose c' c'' { \clef "treble" - % two measures r2 g2. e4 fis g | a2 g4 e | fis g4.( fis16 e fis4) | @@ -133,28 +90,20 @@ altusNotes = { } altusLyrics = \lyricmode { - % two measures - Ju -- bi -- la -- te | - De -- o, om -- | - nis ter -- ra, | - "..." | - -us. | + Ju -- bi -- la -- te + De -- o, om -- nis ter -- ra, + "..." + -us. } -tenorIncipit = << - \new MensuralVoice = "tenorIncipit" << - \repeat unfold 9 { s1 \noBreak } - { - \clef "neomensural-c4" - \key f \major - \time 2/2 - r\longa - r\breve - r1 c'1. - } - >> - \new Lyrics \lyricsto tenorIncipit { IV- } ->> +tenorIncipit = { + \clef "neomensural-c4" + \key f \major + \time 2/2 + r\longa + r\breve + r1 c'1. +} tenorNotes = { \transpose c' c' { @@ -171,26 +120,18 @@ tenorNotes = { } tenorLyrics = \lyricmode { - % two measures - Ju -- bi -- la -- te | - "..." | + Ju -- bi -- la -- te + "..." -us. } -bassusIncipit = << - \new MensuralVoice = "bassusIncipit" << - \repeat unfold 9 { s1 \noBreak } - { - \clef "bass" - \key f \major - \time 2/2 - %% incipit - r\maxima - f1. - } - >> - \new Lyrics \lyricsto bassusIncipit { IV- } ->> +bassusIncipit = { + \clef "mensural-f" + \key f \major + \time 2/2 + r\maxima + f1. +} bassusNotes = { \transpose c' c' { @@ -207,8 +148,8 @@ bassusNotes = { } bassusLyrics = \lyricmode { - Ju -- bi- | - "..." | + Ju -- bi- + "..." -us. } @@ -216,33 +157,33 @@ bassusLyrics = \lyricmode { << \new StaffGroup = choirStaff << \new Voice = "discantusNotes" << - \global \set Staff.instrumentName = #"Discantus" \incipit \discantusIncipit + \global \discantusNotes >> - \new Lyrics = "discantusLyrics" \lyricsto discantusNotes { \discantusLyrics } + \new Lyrics \lyricsto discantusNotes { \discantusLyrics } \new Voice = "altusNotes" << - \global \set Staff.instrumentName = #"Altus" + \global \incipit \altusIncipit \altusNotes >> - \new Lyrics = "altusLyrics" \lyricsto altusNotes { \altusLyrics } + \new Lyrics \lyricsto altusNotes { \altusLyrics } \new Voice = "tenorNotes" << - \global \set Staff.instrumentName = #"Tenor" + \global \incipit \tenorIncipit \tenorNotes >> - \new Lyrics = "tenorLyrics" \lyricsto tenorNotes { \tenorLyrics } + \new Lyrics \lyricsto tenorNotes { \tenorLyrics } \new Voice = "bassusNotes" << - \global \set Staff.instrumentName = #"Bassus" + \global \incipit \bassusIncipit \bassusNotes >> - \new Lyrics = "bassusLyrics" \lyricsto bassusNotes { \bassusLyrics } + \new Lyrics \lyricsto bassusNotes { \bassusLyrics } >> >> \layout { diff --git a/Documentation/snippets/indicating-cross-staff-chords-with-arpeggio-bracket.ly b/Documentation/snippets/indicating-cross-staff-chords-with-arpeggio-bracket.ly index bbb2f9fbd6..19422b6c24 100644 --- a/Documentation/snippets/indicating-cross-staff-chords-with-arpeggio-bracket.ly +++ b/Documentation/snippets/indicating-cross-staff-chords-with-arpeggio-bracket.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "keyboards, real-music" @@ -23,7 +23,6 @@ context. doctitle = "Indicating cross-staff chords with arpeggio bracket" } % begin verbatim - \new PianoStaff << \set PianoStaff.connectArpeggios = ##t \override PianoStaff.Arpeggio.stencil = #ly:arpeggio::brew-chord-bracket diff --git a/Documentation/snippets/inserting-a-caesura.ly b/Documentation/snippets/inserting-a-caesura.ly index c8378a2f1d..2ba8a35fa7 100644 --- a/Documentation/snippets/inserting-a-caesura.ly +++ b/Documentation/snippets/inserting-a-caesura.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" @@ -18,7 +18,6 @@ available. doctitle = "Inserting a caesura" } % begin verbatim - \relative c'' { \override BreathingSign.text = \markup { \musicglyph #"scripts.caesura.straight" diff --git a/Documentation/snippets/inserting-score-fragments-above-a-staff,-as-markups.ly b/Documentation/snippets/inserting-score-fragments-above-a-staff,-as-markups.ly index 388398c02d..a79375f8e4 100644 --- a/Documentation/snippets/inserting-score-fragments-above-a-staff,-as-markups.ly +++ b/Documentation/snippets/inserting-score-fragments-above-a-staff,-as-markups.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.15 -\version "2.17.15" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "real-music, staff-notation" @@ -18,7 +17,6 @@ contains a @code{\\score} block instead of texts or marks. doctitle = "Inserting score fragments above a staff as markups" } % begin verbatim - tuning = \markup { \score { \new Staff \with { \remove "Time_signature_engraver" } diff --git a/Documentation/snippets/isolated-percent-repeats.ly b/Documentation/snippets/isolated-percent-repeats.ly index a3fc4d0bb0..45fe68edd7 100644 --- a/Documentation/snippets/isolated-percent-repeats.ly +++ b/Documentation/snippets/isolated-percent-repeats.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.19.22" \header { lsrtags = "repeats" @@ -16,9 +16,8 @@ Isolated percents can also be printed. doctitle = "Isolated percent repeats" } % begin verbatim - makePercent = -#(define-music-function (parser location note) (ly:music?) +#(define-music-function (note) (ly:music?) "Make a percent repeat the same length as NOTE." (make-music 'PercentEvent 'length (ly:music-length note))) diff --git a/Documentation/snippets/jazz-combo-template.ly b/Documentation/snippets/jazz-combo-template.ly index 4f0570da2c..9d0dc82fc3 100644 --- a/Documentation/snippets/jazz-combo-template.ly +++ b/Documentation/snippets/jazz-combo-template.ly @@ -1,14 +1,13 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.30 -\version "2.17.30" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { - lsrtags = "keyboards, percussion, fretted-strings, template, real-music" + lsrtags = "fretted-strings, keyboards, percussion, real-music, template" texidoc = " This is quite an advanced template, for a jazz ensemble. Note that all @@ -20,7 +19,6 @@ music is within a @code{\\transpose} section. doctitle = "Jazz combo template" } % begin verbatim - \header { title = "Song" subtitle = "(tune)" @@ -34,7 +32,10 @@ music is within a @code{\\transpose} section. } } } - +% To make the example display in the documentation +\paper { + paper-width = 130 +} %#(set-global-staff-size 16) \include "english.ly" diff --git a/Documentation/snippets/keep-change-clefs-full-sized.ly b/Documentation/snippets/keep-change-clefs-full-sized.ly index 1504747297..6d6ae87a8e 100644 --- a/Documentation/snippets/keep-change-clefs-full-sized.ly +++ b/Documentation/snippets/keep-change-clefs-full-sized.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "pitches, tweaks-and-overrides" @@ -17,7 +17,6 @@ initial clef. This can be overridden with @code{full-size-change}. doctitle = "Keep change clefs full sized" } % begin verbatim - \relative c' { \clef "treble" c1 diff --git a/Documentation/snippets/keyboard-headword.ly b/Documentation/snippets/keyboard-headword.ly index 177675afc5..07d4f34ea1 100644 --- a/Documentation/snippets/keyboard-headword.ly +++ b/Documentation/snippets/keyboard-headword.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.24 -\version "2.17.24" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "headword" diff --git a/Documentation/snippets/keyboards.snippet-list b/Documentation/snippets/keyboards.snippet-list index f834227dfc..29aac3541e 100644 --- a/Documentation/snippets/keyboards.snippet-list +++ b/Documentation/snippets/keyboards.snippet-list @@ -1,5 +1,5 @@ accordion-discant-symbols.ly -accordion-registers.ly +accordion-register-symbols.ly changing-the-text-for-sustain-markings.ly clusters.ly controlling-the-placement-of-chord-fingerings.ly @@ -13,5 +13,6 @@ laissez-vibrer-ties.ly piano-template-simple.ly piano-template-with-centered-lyrics.ly piano-template-with-melody-and-lyrics.ly +removing-brace-on-first-line-of-piano-score.ly using-autochange-with-more-than-one-voice.ly vocal-ensemble-template-with-automatic-piano-reduction.ly diff --git a/Documentation/snippets/laissez-vibrer-ties.ly b/Documentation/snippets/laissez-vibrer-ties.ly index d125dc8038..63f92466b5 100644 --- a/Documentation/snippets/laissez-vibrer-ties.ly +++ b/Documentation/snippets/laissez-vibrer-ties.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "connecting-notes, contemporary-notation, expressive-marks, fretted-strings, keyboards, specific-notation" @@ -17,7 +17,6 @@ using @code{'tie-configuration}. doctitle = "Laissez vibrer ties" } % begin verbatim - \relative c' { 4\laissezVibrer r \laissezVibrer r 4\laissezVibrer r 4.\laissezVibrer r8 diff --git a/Documentation/snippets/let-tabstaff-print-the-topmost-string-at-bottom.ly b/Documentation/snippets/let-tabstaff-print-the-topmost-string-at-bottom.ly new file mode 100644 index 0000000000..691fad451a --- /dev/null +++ b/Documentation/snippets/let-tabstaff-print-the-topmost-string-at-bottom.ly @@ -0,0 +1,49 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "fretted-strings, staff-notation" + + texidoc = " +In tablatures usually the first string is printed topmost. If you want +to have it at the bottom change the +@code{stringOneTopmost}-context-property. For a context-wide setting +this could be done in @code{layout} as well. + +" + doctitle = "Let TabStaff print the topmost string at bottom" +} % begin verbatim + +% +%\layout { +% \context { +% \Score +% stringOneTopmost = ##f +% } +% \context { +% \TabStaff +% tablatureFormat = #fret-letter-tablature-format +% } +%} + +m = { + \cadenzaOn + e, b, e gis! b e' + \bar "||" +} + +<< + \new Staff { \clef "G_8" <>_"default" \m <>_"italian (historic)"\m } + \new TabStaff + { + \m + \set Score.stringOneTopmost = ##f + \set TabStaff.tablatureFormat = #fret-letter-tablature-format + \m + } +>> diff --git a/Documentation/snippets/letter-tablature-formatting.ly b/Documentation/snippets/letter-tablature-formatting.ly index d08607014d..c6e9215d72 100644 --- a/Documentation/snippets/letter-tablature-formatting.ly +++ b/Documentation/snippets/letter-tablature-formatting.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings, staff-notation" @@ -16,7 +16,6 @@ Tablature can be formatted using letters instead of numbers. doctitle = "Letter tablature formatting" } % begin verbatim - music = \relative c { c4 d e f g4 a b c diff --git a/Documentation/snippets/line-arrows.ly b/Documentation/snippets/line-arrows.ly index 93086da94c..d3cbe37f38 100644 --- a/Documentation/snippets/line-arrows.ly +++ b/Documentation/snippets/line-arrows.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" @@ -17,7 +17,6 @@ Glissando). doctitle = "Line arrows" } % begin verbatim - \relative c'' { \override TextSpanner.bound-padding = #1.0 \override TextSpanner.style = #'line diff --git a/Documentation/snippets/lyrics-alignment.ly b/Documentation/snippets/lyrics-alignment.ly index 9167330fe6..48d2a94611 100644 --- a/Documentation/snippets/lyrics-alignment.ly +++ b/Documentation/snippets/lyrics-alignment.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "really-simple, text, vocal-music" diff --git a/Documentation/snippets/makam-example.ly b/Documentation/snippets/makam-example.ly index b170052daa..8d616e36c9 100644 --- a/Documentation/snippets/makam-example.ly +++ b/Documentation/snippets/makam-example.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.19.7" \header { lsrtags = "pitches, version-specific, world-music" @@ -18,12 +18,11 @@ details of pitch names and alterations. doctitle = "Makam example" } % begin verbatim - % Initialize makam settings \include "makam.ly" \relative c' { - \set Staff.keySignature = #`((6 . ,(- KOMA)) (3 . ,BAKIYE)) + \set Staff.keyAlterations = #`((6 . ,(- KOMA)) (3 . ,BAKIYE)) c4 cc db fk gbm4 gfc gfb efk fk4 db cc c diff --git a/Documentation/snippets/making-an-object-invisible-with-the-transparent-property.ly b/Documentation/snippets/making-an-object-invisible-with-the-transparent-property.ly index c7ad7b10a5..b39f9375c2 100644 --- a/Documentation/snippets/making-an-object-invisible-with-the-transparent-property.ly +++ b/Documentation/snippets/making-an-object-invisible-with-the-transparent-property.ly @@ -4,8 +4,8 @@ % and then run scripts/auxiliar/makelsr.py % % This file is in the public domain. -%% Note: this file works from version 2.17.30 -\version "2.17.30" +%% Note: this file works from version 2.19.21 +\version "2.19.21" \header { lsrtags = "rhythms, simultaneous-notes, tweaks-and-overrides" @@ -27,16 +27,16 @@ in that voice, the tie appears to cross voices. } % begin verbatim -\relative c'' { +\relative { \time 2/4 << { \once \hide Stem \once \override Stem.length = #8 - b8 ~ b\noBeam + b'8 ~ 8\noBeam \once \hide Stem \once \override Stem.length = #8 - g8 ~ g\noBeam + g8 ~ 8\noBeam } \\ { diff --git a/Documentation/snippets/making-glissandi-breakable.ly b/Documentation/snippets/making-glissandi-breakable.ly index 16799a19cf..d469078f5d 100644 --- a/Documentation/snippets/making-glissandi-breakable.ly +++ b/Documentation/snippets/making-glissandi-breakable.ly @@ -1,25 +1,23 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.30 -\version "2.17.30" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "staff-notation, tweaks-and-overrides" texidoc = " Setting the @code{breakable} property to @code{#t} in combination with -@code{after-line-breaking} allows a glissando to break if it occurs -at a line break: -" +@code{after-line-breaking} allows a glissando to break if it occurs at +a line break: +" doctitle = "Making glissandi breakable" } % begin verbatim - glissandoSkipOn = { \override NoteColumn.glissando-skip = ##t \hide NoteHead diff --git a/Documentation/snippets/making-slurs-with-complex-dash-structure.ly b/Documentation/snippets/making-slurs-with-complex-dash-structure.ly index b4d11b13d7..92a2d97c1f 100644 --- a/Documentation/snippets/making-slurs-with-complex-dash-structure.ly +++ b/Documentation/snippets/making-slurs-with-complex-dash-structure.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, rhythms" diff --git a/Documentation/snippets/making-some-staff-lines-thicker-than-the-others.ly b/Documentation/snippets/making-some-staff-lines-thicker-than-the-others.ly index 1cf8befaa0..1bacee8404 100644 --- a/Documentation/snippets/making-some-staff-lines-thicker-than-the-others.ly +++ b/Documentation/snippets/making-some-staff-lines-thicker-than-the-others.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, really-cool, staff-notation, workaround" diff --git a/Documentation/snippets/manually-break-figured-bass-extenders-for-only-some-numbers.ly b/Documentation/snippets/manually-break-figured-bass-extenders-for-only-some-numbers.ly index f543c44a18..fe5e530109 100644 --- a/Documentation/snippets/manually-break-figured-bass-extenders-for-only-some-numbers.ly +++ b/Documentation/snippets/manually-break-figured-bass-extenders-for-only-some-numbers.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords" @@ -20,7 +20,6 @@ extender attributed to that number right before the number. doctitle = "Manually break figured bass extenders for only some numbers" } % begin verbatim - bassfigures = \figuremode { \set useBassFigureExtenders = ##t <6 4>4 <6 4\!> <6 4\!> <6 4\!> | <6\! 4\!> <6 4> <6 4\!> <6 4> diff --git a/Documentation/snippets/manually-controlling-beam-positions.ly b/Documentation/snippets/manually-controlling-beam-positions.ly index fe44415234..8fe39d8f22 100644 --- a/Documentation/snippets/manually-controlling-beam-positions.ly +++ b/Documentation/snippets/manually-controlling-beam-positions.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "connecting-notes, rhythms, tweaks-and-overrides" @@ -20,7 +20,6 @@ Beam positions may be controlled manually, by overriding the doctitle = "Manually controlling beam positions" } % begin verbatim - \relative c' { \time 2/4 % from upper staff-line (position 2) to center (position 0) diff --git a/Documentation/snippets/marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly b/Documentation/snippets/marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly index a836fd38d1..31d0b8505b 100644 --- a/Documentation/snippets/marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly +++ b/Documentation/snippets/marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "contemporary-notation, editorial-annotations, vocal-music, workaround" @@ -18,7 +18,6 @@ a spoken section with the @code{\\speakOn} keyword, and end it with the doctitle = "Marking notes of spoken parts with a cross on the stem" } % begin verbatim - speakOn = { \override Stem.stencil = #(lambda (grob) diff --git a/Documentation/snippets/markup-lines.ly b/Documentation/snippets/markup-lines.ly index 474f13f19d..6ff040e986 100644 --- a/Documentation/snippets/markup-lines.ly +++ b/Documentation/snippets/markup-lines.ly @@ -1,22 +1,23 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "text" texidoc = " Text that can spread over pages is entered with the -@code{\\markuplist} command. +@code{\\markuplines} command. " doctitle = "Markup lines" } % begin verbatim +%% updated/modified by P.P.Schneider on Feb. 2014 #(set-default-paper-size "a6") @@ -31,7 +32,8 @@ Text that can spread over pages is entered with the Il y avait en Westphalie, dans le château de M. le baron de Thunder-ten-tronckh, un jeune garçon à qui la nature avait donné les mœurs les plus douces. Sa physionomie annonçait son âme. - Il avait le jugement assez droit, avec l'esprit le plus simple ; + Il avait le jugement assez droit, avec l'esprit le plus + \concat { simple \hspace #.3 ; } c'est, je crois, pour cette raison qu'on le nommait Candide. Les anciens domestiques de la maison soupçonnaient qu'il était fils de la sœur de monsieur le baron et d'un bon et honnête @@ -40,12 +42,16 @@ Text that can spread over pages is entered with the quartiers, et que le reste de son arbre généalogique avait été perdu par l'injure du temps. } + \vspace #.3 \paragraph { Monsieur le baron était un des plus puissants seigneurs de la Westphalie, car son château avait une porte et des fenêtres. Sa grande salle même était ornée d'une tapisserie. Tous les chiens - de ses basses-cours composaient une meute dans le besoin ; ses - palefreniers étaient ses piqueurs; le vicaire du village était + de ses basses-cours composaient une meute dans le + \concat { besoin \hspace #.3 ; } + ses palefreniers étaient ses + \concat { piqueurs \hspace #.3 ; } + le vicaire du village était son grand-aumônier. Ils l'appelaient tous monseigneur, et ils riaient quand il faisait des contes. } diff --git a/Documentation/snippets/measure-counter.ly b/Documentation/snippets/measure-counter.ly index 688ba96a07..93317e27d2 100644 --- a/Documentation/snippets/measure-counter.ly +++ b/Documentation/snippets/measure-counter.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.30" +\version "2.18.0" \header { lsrtags = "editorial-annotations, repeats, staff-notation, workaround" diff --git a/Documentation/snippets/mensurstriche-layout-bar-lines-between-the-staves.ly b/Documentation/snippets/mensurstriche-layout-bar-lines-between-the-staves.ly index dfb597b9a7..88638a0c62 100644 --- a/Documentation/snippets/mensurstriche-layout-bar-lines-between-the-staves.ly +++ b/Documentation/snippets/mensurstriche-layout-bar-lines-between-the-staves.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.30" +\version "2.18.0" \header { lsrtags = "ancient-notation, contexts-and-engravers, staff-notation, tweaks-and-overrides" @@ -12,14 +12,13 @@ texidoc = " The mensurstriche-layout where the bar lines do not show on the staves but between staves can be achieved with a @code{StaffGroup} instead of -a @code{ChoirStaff}. The bar line on staves is blanked out by setting -the @code{transparent} property. +a @code{ChoirStaff}. The bar line on staves is blanked out using +@code{\\hide}. " doctitle = "Mensurstriche layout (bar lines between the staves)" } % begin verbatim - global = { \hide Staff.BarLine s1 s @@ -27,6 +26,7 @@ global = { \undo \hide Staff.BarLine \bar "|." } + \new StaffGroup \relative c'' { << \new Staff { << \global { c1 c } >> } diff --git a/Documentation/snippets/merging-multi-measure-rests-in-a-polyphonic-part.ly b/Documentation/snippets/merging-multi-measure-rests-in-a-polyphonic-part.ly index 8cacc7ba90..7d4be06b86 100644 --- a/Documentation/snippets/merging-multi-measure-rests-in-a-polyphonic-part.ly +++ b/Documentation/snippets/merging-multi-measure-rests-in-a-polyphonic-part.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.18 -\version "2.17.18" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "really-simple, rhythms, version-specific" @@ -19,7 +18,6 @@ can be printed on the same staff line, using the following setting. doctitle = "Merging multi-measure rests in a polyphonic part" } % begin verbatim - normalPos = \revert MultiMeasureRest.direction { diff --git a/Documentation/snippets/midi.snippet-list b/Documentation/snippets/midi.snippet-list index 4c94738982..243a5a03a0 100644 --- a/Documentation/snippets/midi.snippet-list +++ b/Documentation/snippets/midi.snippet-list @@ -1,3 +1,6 @@ changing-midi-output-to-one-channel-per-voice.ly changing-the-tempo-without-a-metronome-mark.ly +creating-custom-dynamics-in-midi-output.ly +customize-drumpitchnames,-drumstyletable-and-drumpitchtable-in-layout-and-midi.ly demo-midiinstruments.ly +replacing-default-midi-instrument-equalization.ly diff --git a/Documentation/snippets/modifying-default-values-for-articulation-shorthand-notation.ly b/Documentation/snippets/modifying-default-values-for-articulation-shorthand-notation.ly index a2553ad84e..fe6be59c12 100644 --- a/Documentation/snippets/modifying-default-values-for-articulation-shorthand-notation.ly +++ b/Documentation/snippets/modifying-default-values-for-articulation-shorthand-notation.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.25" +\version "2.18.0" \header { lsrtags = "expressive-marks" @@ -12,7 +12,7 @@ texidoc = " The shorthands are defined in @samp{ly/script-init.ly}, where the variables @code{dashHat}, @code{dashPlus}, @code{dashDash}, -@code{dashBang}, @code{dashLarger}, @code{dashDot}, and +@code{dashBar}, @code{dashLarger}, @code{dashDot}, and @code{dashUnderscore} are assigned default values. The default values for the shorthands can be modified. For example, to associate the @code{-+} (@code{dashPlus}) shorthand with the trill symbol instead of @@ -23,7 +23,6 @@ the default + symbol, assign the value @code{trill} to the variable doctitle = "Modifying default values for articulation shorthand notation" } % begin verbatim - \relative c'' { c1-+ } dashPlus = "trill" diff --git a/Documentation/snippets/modifying-the-ottava-spanner-slope.ly b/Documentation/snippets/modifying-the-ottava-spanner-slope.ly new file mode 100644 index 0000000000..3010e3107c --- /dev/null +++ b/Documentation/snippets/modifying-the-ottava-spanner-slope.ly @@ -0,0 +1,37 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "pitches, staff-notation, tweaks-and-overrides" + + texidoc = " +It is possible to change the slope of the Ottava spanner. + +" + doctitle = "Modifying the Ottava spanner slope" +} % begin verbatim + +\relative c'' { + \override Staff.OttavaBracket.stencil = #ly:line-spanner::print + \override Staff.OttavaBracket.bound-details = + #`((left . ((Y . 0) ; Change the integer here + (attach-dir . ,LEFT) + (padding . 0) + (stencil-align-dir-y . ,CENTER))) + (right . ((Y . 5) ; Change the integer here + (padding . 0) + (attach-dir . ,RIGHT) + (text . ,(make-draw-dashed-line-markup (cons 0 -1.2)))))) + \override Staff.OttavaBracket.left-bound-info = + #ly:line-spanner::calc-left-bound-info-and-text + \override Staff.OttavaBracket.right-bound-info = + #ly:line-spanner::calc-right-bound-info + \ottava #1 + c1 + c'''1 +} diff --git a/Documentation/snippets/modifying-tuplet-bracket-length.ly b/Documentation/snippets/modifying-tuplet-bracket-length.ly index bde66e6168..f19f6bc318 100644 --- a/Documentation/snippets/modifying-tuplet-bracket-length.ly +++ b/Documentation/snippets/modifying-tuplet-bracket-length.ly @@ -1,10 +1,11 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.17.11" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.0 +\version "2.19.0" \header { lsrtags = "really-simple, rhythms" @@ -30,11 +31,11 @@ modify what material they cover. % ...to cover all items up to the next note \set tupletFullLengthNote = ##t \time 2/4 - \tuplet 3/2 { c4 c c } + \tuplet 3/2 { c4 4 4 } % ...or to cover just whitespace \set tupletFullLengthNote = ##f \time 4/4 - \tuplet 5/4 { c4 c1 } + \tuplet 5/4 { 4 1 } \time 3/4 - c2. + 2. } diff --git a/Documentation/snippets/moving-dotted-notes-in-polyphony.ly b/Documentation/snippets/moving-dotted-notes-in-polyphony.ly index 8a225d29ff..e2a2a00af6 100644 --- a/Documentation/snippets/moving-dotted-notes-in-polyphony.ly +++ b/Documentation/snippets/moving-dotted-notes-in-polyphony.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms, simultaneous-notes, tweaks-and-overrides" @@ -19,14 +19,14 @@ the right. This behaviour can be over-ridden by using the doctitle = "Moving dotted notes in polyphony" } % begin verbatim - \new Staff \relative c' << - { f2. f4 + { + f2. f4 \override Staff.NoteCollision.prefer-dotted-right = ##f f2. f4 \override Staff.NoteCollision.prefer-dotted-right = ##t f2. f4 } \\ - { e4 e e e e e e e e e e e} + { e4 e e e e e e e e e e e } >> diff --git a/Documentation/snippets/moving-slur-positions-vertically.ly b/Documentation/snippets/moving-slur-positions-vertically.ly index d2b93bb89c..efee38d890 100644 --- a/Documentation/snippets/moving-slur-positions-vertically.ly +++ b/Documentation/snippets/moving-slur-positions-vertically.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" @@ -24,7 +24,6 @@ slurs further down. doctitle = "Moving slur positions vertically" } % begin verbatim - \relative c' { \stemDown e4( a) diff --git a/Documentation/snippets/multi-measure-rest-markup.ly b/Documentation/snippets/multi-measure-rest-markup.ly index e1d8deea44..6ee5046d9e 100644 --- a/Documentation/snippets/multi-measure-rest-markup.ly +++ b/Documentation/snippets/multi-measure-rest-markup.ly @@ -1,10 +1,12 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.16.0" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.20 + +\version "2.19.20" \header { lsrtags = "rhythms, text" @@ -25,14 +27,16 @@ appear to be centered. doctitle = "Multi-measure rest markup" } % begin verbatim + \relative c' { - \compressFullBarRests - \textLengthOn - <>^\markup { [MAJOR GENERAL] } - R1*19 - <>_\markup { \italic { Cue: ... it is yours } } - <>^\markup { A } - R1*30^\markup { [MABEL] } - \textLengthOff - c4^\markup { CHORUS } d f c + \compressMMRests { + \textLengthOn + <>^\markup { [MAJOR GENERAL] } + R1*19 + <>_\markup { \italic { Cue: ... it is yours } } + <>^\markup { A } + R1*30^\markup { [MABEL] } + \textLengthOff + c4^\markup { CHORUS } d f c + } } diff --git a/Documentation/snippets/nesting-staves.ly b/Documentation/snippets/nesting-staves.ly index 3d05329e1c..9f03ad7882 100644 --- a/Documentation/snippets/nesting-staves.ly +++ b/Documentation/snippets/nesting-staves.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, preparing-parts, staff-notation, tweaks-and-overrides" @@ -25,7 +25,6 @@ staves. The possibilities are @code{SystemStartBar}, doctitle = "Nesting staves" } % begin verbatim - \new StaffGroup \relative c'' << \set StaffGroup.systemStartDelimiterHierarchy diff --git a/Documentation/snippets/new/accordion-discant-symbols.ly b/Documentation/snippets/new/accordion-discant-symbols.ly deleted file mode 100644 index 7ec2129a63..0000000000 --- a/Documentation/snippets/new/accordion-discant-symbols.ly +++ /dev/null @@ -1,176 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "keyboards, specific-notation, symbols-and-glyphs, workaround" - - texidoc = " -This snippet has been obsoleted by predefined markup commands, see -@ruser{Accordion Registers}. It's still useful as a simple -demonstration of how to combine symbols: the placement of the symbols -added with @code{\\markup} can be tweaked by changing the -@code{\\translate-scaled} arguments. @code{\\translate-scaled} is -used here rather than @code{\\translate} in order to let the -positioning of the symbol parts adapt to changes of @code{font-size}. -" - doctitle = "Accordion-discant symbols" -} - -discant = \markup { - \musicglyph #"accordion.discant" -} -dot = \markup { - \musicglyph #"accordion.dot" -} - -\layout { ragged-right = ##t } - -% 16 voets register -accBasson = ^\markup { - \combine - \discant - \translate-scaled #'(0 . 0.5) \dot -} - -% een korig 8 en 16 voets register -accBandon = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 0.5) \dot - \translate-scaled #'(0 . 1.5) \dot -} - -accVCello = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 0.5) \dot - \combine - \translate-scaled #'(0 . 1.5) \dot - \translate-scaled #'(1 . 1.5) \dot -} - -% 4-8-16 voets register -accHarmon = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 0.5) \dot - \combine - \translate-scaled #'(0 . 1.5) \dot - \translate-scaled #'(0 . 2.5) \dot -} - -accTrombon = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 0.5) \dot - \combine - \translate-scaled #'(0 . 1.5) \dot - \combine - \translate-scaled #'(1 . 1.5) \dot - \translate-scaled #'(-1 . 1.5) \dot -} - -% eenkorig 4 en 16 voets register -accOrgan = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 0.5) \dot - \translate-scaled #'(0 . 2.5) \dot -} - -accMaster = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 0.5) \dot - \combine - \translate-scaled #'(0 . 1.5) \dot - \combine - \translate-scaled #'(1 . 1.5) \dot - \combine - \translate-scaled #'(-1 . 1.5) \dot - \translate-scaled #'(0 . 2.5) \dot -} - -accAccord = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 1.5) \dot - \combine - \translate-scaled #'(1 . 1.5) \dot - \combine - \translate-scaled #'(-1 . 1.5) \dot - \translate-scaled #'(0 . 2.5) \dot -} - -accMusette = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 1.5) \dot - \combine - \translate-scaled #'(1 . 1.5) \dot - \translate-scaled #'(-1 . 1.5) \dot -} - -accCeleste = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 1.5) \dot - \translate-scaled #'(-1 . 1.5) \dot -} - -accOboe = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 1.5) \dot - \translate-scaled #'(0 . 2.5) \dot -} - -accClarin = ^\markup { - \combine - \discant - \translate-scaled #'(0 . 1.5) \dot -} - -accPiccolo = ^\markup { - \combine - \discant - \translate-scaled #'(0 . 2.5) \dot -} - -accViolin = ^\markup { - \combine - \discant - \combine - \translate-scaled #'(0 . 1.5) \dot - \combine - \translate-scaled #'(1 . 1.5) \dot - \translate-scaled #'(0 . 2.5) \dot -} - -\relative c'' { - c4 d\accBasson e f - c4 d\accBandon e f - c4 d\accVCello e f - c4 d\accHarmon e f - c4 d\accTrombon e f - \break - c4 d\accOrgan e f - c4 d\accMaster e f - c4 d\accAccord e f - c4 d\accMusette e f - c4 d\accCeleste e f - \break - c4 d\accOboe e f - c4 d\accClarin e f - c4 d\accPiccolo e f - c4 d\accViolin e f -} diff --git a/Documentation/snippets/new/accordion-registers.ly b/Documentation/snippets/new/accordion-registers.ly deleted file mode 100644 index 26a6e9df52..0000000000 --- a/Documentation/snippets/new/accordion-registers.ly +++ /dev/null @@ -1,32 +0,0 @@ -\version "2.17.23" - -\header { - lsrtags = "keyboards, specific-notation, symbols-and-glyphs" - - texidoc = "Accordion register symbols are available as -@code{\\markup} as well as as standalone music events (as register -changes tend to occur between actual music events. Bass registers are -not overly standardized. The available commands can be found in -@ruser{Accordion Registers}." - - doctitle = "Accordion register symbols" -} - -\layout { ragged-right = ##t } - -#(use-modules (scm accreg)) - -\new PianoStaff -<< - \new Staff \relative - { \clef treble \discant "10" r8 s32 f'[ bes f] s e[ a e] s d[ g d] s16 e32[ a] - << { r16 r r } \\ { d r a r bes r } >> | 1 } - \new Staff \relative - { \clef treble \freeBass "1" r8 d'32 s16. c32 s16. bes32 s16. a32[ cis] s16 - \clef bass \stdBass "Master" - << { r16 ^"b" r ^"am" r ^"gm" | - 1^"a" } \\ - { d8_"D" c_"C" bes_"B" | a1_"A" } - >> - } ->> diff --git a/Documentation/snippets/new/adding-a-figured-bass-above-or-below-the-notes.ly b/Documentation/snippets/new/adding-a-figured-bass-above-or-below-the-notes.ly deleted file mode 100644 index 811df579ac..0000000000 --- a/Documentation/snippets/new/adding-a-figured-bass-above-or-below-the-notes.ly +++ /dev/null @@ -1,42 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "ancient-notation, chords, contexts-and-engravers" - - texidoc = " -When writing a figured bass, you can place the figures above or below -the bass notes, by defining the -@code{BassFigureAlignmentPositioning.direction} property (exclusively -in a @code{Staff} context). Choices are @code{#UP} (or @code{#1}), -@code{#CENTER} (or @code{#0}) and @code{#DOWN} (or @code{#-1}). - -This property can be changed as many times as you wish. Use -@code{\\once \\override} if you don't want the override to apply to the -whole score. - -" - doctitle = "Adding a figured bass above or below the notes" -} - - -bass = { - \clef bass - g4 b, c d - e d8 c d2 -} -continuo = \figuremode { - <_>4 <6>4 <5/>4 - \override Staff.BassFigureAlignmentPositioning.direction = #UP - %\bassFigureStaffAlignmentUp - < _+ >4 <6> - \set Staff.useBassFigureExtenders = ##t - \override Staff.BassFigureAlignmentPositioning.direction = #DOWN - %\bassFigureStaffAlignmentDown - <4>4. <4>8 <_+>4 -} -\score { - << - \new Staff = bassStaff \bass - \context Staff = bassStaff \continuo - >> -} diff --git a/Documentation/snippets/new/adding-extra-fingering-with-scheme.ly b/Documentation/snippets/new/adding-extra-fingering-with-scheme.ly deleted file mode 100644 index b4d32ff1ea..0000000000 --- a/Documentation/snippets/new/adding-extra-fingering-with-scheme.ly +++ /dev/null @@ -1,39 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "scheme-language" - - texidoc = " -You can add additional elements to notes using @code{map-some-music}. In this -example, an extra script is attached to a note. - -In general, first do a @code{\\displayMusic} of the music you want to -create, then write a function that will work on the appropriate parts -of the music for you. -" - doctitle = "Adding extra fingering with scheme" -} - -addScript = -#(define-music-function (parser location script music) - (ly:event? ly:music?) - (map-some-music - (lambda (mus) - (define (append-script-at! prop) - (set! (ly:music-property mus prop) - (append (ly:music-property mus prop) - (list (ly:music-deep-copy script)))) - mus) - (case (ly:music-property mus 'name) - ((EventChord) - (append-script-at! 'elements)) - ((NoteEvent) - (append-script-at! 'articulations)) - (else #f))) - music)) - -\score { - { - \addScript _6 { c'4-3 } - } -} diff --git a/Documentation/snippets/new/adding-orchestral-cues-to-a-vocal-score.ly b/Documentation/snippets/new/adding-orchestral-cues-to-a-vocal-score.ly deleted file mode 100644 index fcc5778c84..0000000000 --- a/Documentation/snippets/new/adding-orchestral-cues-to-a-vocal-score.ly +++ /dev/null @@ -1,80 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "staff-notation, vocal-music" - - texidoc = " -This shows one approach to simplify adding many orchestral cues to the -piano reduction in a vocal score. The music function @code{\\cueWhile} -takes four arguments: the music from which the cue is to be taken, as -defined by @code{\\addQuote}, the name to be inserted before the cue -notes, then either @code{#UP} or @code{#DOWN} to specify either -@code{\\voiceOne} with the name above the staff or @code{\\voiceTwo} -with the name below the staff, and finally the piano music in parallel -with which the cue notes are to appear. The name of the cued -instrument is positioned to the left of the cued notes. Many passages -can be cued, but they cannot overlap each other in time. - -" - doctitle = "Adding orchestral cues to a vocal score" -} - -cueWhile = -#(define-music-function - (parser location instrument name dir music) - (string? string? ly:dir? ly:music?) - #{ - \cueDuring $instrument #dir { - \once \override TextScript.self-alignment-X = #RIGHT - \once \override TextScript.direction = $dir - <>-\markup { \tiny #name } - $music - } - #}) - -flute = \relative c'' { - \transposition c' - s4 s4 e g -} -\addQuote "flute" { \flute } - -clarinet = \relative c' { - \transposition bes - fis4 d d c -} -\addQuote "clarinet" { \clarinet } - -singer = \relative c'' { c4. g8 g4 bes4 } -words = \lyricmode { here's the lyr -- ics } - -pianoRH = \relative c'' { - \transposition c' - \cueWhile "clarinet" "Clar." #DOWN { c4. g8 } - \cueWhile "flute" "Flute" #UP { g4 bes4 } -} -pianoLH = \relative c { c4 e, } - -\score { - << - \new Staff { - \new Voice = "singer" { - \singer - } - } - \new Lyrics { - \lyricsto "singer" - \words - } - \new PianoStaff << - \new Staff { - \new Voice { - \pianoRH - } - } - \new Staff { - \clef "bass" - \pianoLH - } - >> - >> -} diff --git a/Documentation/snippets/new/adding-timing-marks-to-long-glissandi.ly b/Documentation/snippets/new/adding-timing-marks-to-long-glissandi.ly deleted file mode 100644 index 3bb2d02119..0000000000 --- a/Documentation/snippets/new/adding-timing-marks-to-long-glissandi.ly +++ /dev/null @@ -1,48 +0,0 @@ -\version "2.17.30" - -\header { - lsrtags = "expressive-marks, staff-notation, tweaks-and-overrides" - - texidoc = " -Skipped beats in very long glissandi are sometimes indicated by -timing marks, often consisting of stems without noteheads. Such -stems can also be used to carry intermediate expression markings. - -If the stems do not align well with the glissando, they may need to -be repositioned slightly. -" - - doctitle = "Adding timing marks to long glissandi" -} - -glissandoSkipOn = { - \override NoteColumn.glissando-skip = ##t - \hide NoteHead - \override NoteHead.no-ledgers = ##t -} - -glissandoSkipOff = { - \revert NoteColumn.glissando-skip - \undo \hide NoteHead - \revert NoteHead.no-ledgers -} - -\relative c'' { - r8 f8\glissando - \glissandoSkipOn - f4 g a a8\noBeam - \glissandoSkipOff - a8 - - r8 f8\glissando - \glissandoSkipOn - g4 a8 - \glissandoSkipOff - a8 | - - r4 f\glissando \< - \glissandoSkipOn - a4\f \> - \glissandoSkipOff - b8\! r | -} diff --git a/Documentation/snippets/new/alternative-bar-numbering.ly b/Documentation/snippets/new/alternative-bar-numbering.ly deleted file mode 100644 index 78903e3095..0000000000 --- a/Documentation/snippets/new/alternative-bar-numbering.ly +++ /dev/null @@ -1,27 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "editorial-annotations, staff-notation, tweaks-and-overrides" - texidoc = "Two alternative methods for bar numbering can be set, - especially for when using repeated music." - doctitle = "Alternative bar numbering" -} - -\relative c'{ - \set Score.alternativeNumberingStyle = #'numbers - \repeat volta 3 { c4 d e f | } - \alternative { - { c4 d e f | c2 d \break } - { f4 g a b | f4 g a b | f2 a | \break } - { c4 d e f | c2 d } - } - c1 \break - \set Score.alternativeNumberingStyle = #'numbers-with-letters - \repeat volta 3 { c,4 d e f | } - \alternative { - { c4 d e f | c2 d \break } - { f4 g a b | f4 g a b | f2 a | \break } - { c4 d e f | c2 d } - } - c1 -} diff --git a/Documentation/snippets/new/ancient-fonts.ly b/Documentation/snippets/new/ancient-fonts.ly deleted file mode 100644 index 159bed3fae..0000000000 --- a/Documentation/snippets/new/ancient-fonts.ly +++ /dev/null @@ -1,225 +0,0 @@ -%% This file is in the public domain. -\version "2.17.6" - -\header { - lsrtags = "ancient-notation, symbols-and-glyphs" - - texidoc = " -Shown here are many (all?) of the symbols that are included in -LilyPond's support for ancient notation. -" - doctitle = "Ancient fonts" -} - -upperStaff = \new VaticanaStaff = "upperStaff" << - \context VaticanaVoice << - \transpose c c { - - \override NoteHead.style = #'vaticana.punctum - \key es \major - \clef "vaticana-fa2" - c1 des e f ges - - \override NoteHead.style = #'vaticana.inclinatum - a! b ces' - \bar "|" - % \break % 1 (8*1) - - \override NoteHead.style = #'vaticana.quilisma - b! des'! ges! fes! - \breathe - \clef "vaticana-fa1" - \override NoteHead.style = #'vaticana.plica - es d - \override NoteHead.style = #'vaticana.reverse.plica - c d - \bar "|" - % \break %2 (8*1) - - \override NoteHead.style = #'vaticana.punctum.cavum - es f - \override NoteHead.style = #'vaticana.lpes - g as - \override NoteHead.style = #'vaticana.upes - bes as - \override NoteHead.style = #'vaticana.vupes - g f - \override NoteHead.style = #'vaticana.linea.punctum - \once \override Staff.BarLine.bar-extent = #'(-1 . 1) \bar "|" - % \break % 3 (8*1) - - es d - \override NoteHead.style = #'vaticana.epiphonus - c d - \override NoteHead.style = #'vaticana.cephalicus - es f - - \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" - ces des - \bar "|" - % \break % 4 (8*1) - - e! f! ges - \clef "medicaea-do2" - \override NoteHead.style = #'medicaea.inclinatum - a! b! ces' - \override NoteHead.style = #'medicaea.virga - b! a! - \bar "|" - % \break % 5 (8*1) - - ges fes - \clef "medicaea-fa1" - \override NoteHead.style = #'medicaea.rvirga - e des ces - - \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" - ces des es - \bar "|" - % \break % 6 (8*1) - - fes ges - \clef "hufnagel-do2" - \override NoteHead.style = #'hufnagel.lpes - as! bes! ces' - \override NoteHead.style = #'hufnagel.virga - bes! as! - \bar "|" - % \break % 7 (8*1) - - ges! fes! - \clef "hufnagel-do-fa" - \override NoteHead.style = #'hufnagel.punctum - es! des ces des! es! fes! - \bar "||" - % \break % 8 (8*1) - - s32*1 - % \break % 12 (32*1) - } - >> ->> - -lowerStaff = \new MensuralStaff = "lowerStaff" << - \context MensuralVoice << - \transpose c c { - - \key a \major - cis'1 d'\breve gis'\breve e'\breve \[ e'\longa fis'\longa \] - \set Staff.forceClef = ##t - \clef "neomensural-c2" - cis1 - \bar "|" - % \break % 2 (16*1) - - \[ g\breve dis''\longa \] - b\breve \[ a\longa d\longa \] - \clef "petrucci-c2" - % \break % 4 (16*1) - - fis1 ces1 - \clef "petrucci-c2" - r\longa - \set Staff.forceClef = ##t - \clef "mensural-c2" - r\breve - \bar "|" - % \break % 5 (8*1) - - r2 - \clef "mensural-g" - r4 r8 r16 r16 - \override NoteHead.style = #'mensural - \override Rest.style = #'mensural - \clef "petrucci-f" - c8 b, c16 b, c32 b, c64 b, c64 b, - d8 e d16 e d32 e d64 e d64 e - r\longa - \set Staff.forceClef = ##t - \clef "petrucci-f" - r\breve - \bar "|" - % \break % 6 (8*1) - - r\breve - \clef "mensural-f" - r2 r4 r8 r16 r16 - - \set Staff.forceClef = ##t - \clef "mensural-f" - e\breve f g a1 - \clef "mensural-g" - % \break % 7 (8*1) - - \[ bes'!\longa a'!\longa c''!\longa \] - e'1 d' c' d' \bar "|" - \bar "|" - % \break % 9 (16*1) - - bes'!\longa fis'!1 as'!1 ges'!\longa % lig - \set Staff.forceClef = ##t - \clef "mensural-g" - e'2 d' c' \bar "|" - % \break % 11 (16*1) - - \set Staff.forceClef = ##t - \clef "petrucci-g" - c'2 d' e' f' - \clef "petrucci-g" - g' as'! bes'! cis''! - bes'! as'! gis'! fis'! - \set Staff.forceClef = ##t - \clef "mensural-g" - es'! des'! cis'!1 \bar "||" - % \break % 12 (8*1) - } - >> ->> - -\paper { - line-thickness = #(/ staff-space 5.0) -} - -\score { - << - \upperStaff - \lowerStaff - >> - \layout { - indent = 0.0 - line-width = 17.25\cm - \context { - \Score - timing = ##f - } - \context { - \MensuralVoice - \override NoteHead.style = #'neomensural - \override Rest.style = #'neomensural - \override Flag.style = #'mensural - \override Stem.thickness = #1.0 - } - \context { - \MensuralStaff - \revert BarLine.transparent - \override KeySignature.glyph-name-alist = #alteration-mensural-glyph-name-alist - clefGlyph = #"clefs.petrucci.c2" - } - \context { - \VaticanaStaff - \revert BarLine.transparent - \override StaffSymbol.thickness = #2.0 - \override KeySignature.glyph-name-alist = #alteration-vaticana-glyph-name-alist - \override Custos.neutral-position = #4 - } - } -} - diff --git a/Documentation/snippets/new/ancient-notation-template----modern-transcription-of-gregorian-music.ly b/Documentation/snippets/new/ancient-notation-template----modern-transcription-of-gregorian-music.ly deleted file mode 100644 index 2fe51d97a2..0000000000 --- a/Documentation/snippets/new/ancient-notation-template----modern-transcription-of-gregorian-music.ly +++ /dev/null @@ -1,51 +0,0 @@ -\version "2.17.30" - -\header { - lsrtags = "vocal-music, ancient-notation, template" - - texidoc = " -This example demonstrates how to do modern transcription of Gregorian -music. Gregorian music has no measure, no stems; it uses only half and -quarter note heads, and special marks, indicating rests of different -length. - -" - doctitle = "Ancient notation template -- modern transcription of gregorian music" -} - -\include "gregorian.ly" - -chant = \relative c' { - \set Score.timing = ##f - f4 a2 \divisioMinima - g4 b a2 f2 \divisioMaior - g4( f) f( g) a2 \finalis -} - -verba = \lyricmode { - Lo -- rem ip -- sum do -- lor sit a -- met -} - -\score { - \new Staff << - \new Voice = "melody" \chant - \new Lyrics = "one" \lyricsto melody \verba - >> - \layout { - \context { - \Staff - \remove "Time_signature_engraver" - \remove "Bar_engraver" - \hide Stem - } - \context { - \Voice - \override Stem.length = #0 - } - \context { - \Score - barAlways = ##t - } - } -} - diff --git a/Documentation/snippets/new/bar-chords-notation-for-guitar--with-text-spanner.ly b/Documentation/snippets/new/bar-chords-notation-for-guitar--with-text-spanner.ly deleted file mode 100644 index c74d392002..0000000000 --- a/Documentation/snippets/new/bar-chords-notation-for-guitar--with-text-spanner.ly +++ /dev/null @@ -1,63 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "chords, fretted-strings" - - texidoc = " -Here is how to print bar chords, or half-bar chords (just uncomment the -appropriate line for to select either one). - -The syntax is @code{\\bbarre #\"@var{fret number}\" @{ notes @} }. -" - doctitle = "Bar chords notation for Guitar (with Text Spanner)" -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% %%%%%%% Cut here ----- Start 'bbarred.ly' - -%% C with slash ------------------------------- -cWithSlash = \markup { - \combine \roman C \translate #'(0.6 . -0.4) \draw-line #'(0 . 2.0) -} -%% Span ----------------------------------- -%% Syntax: \bbarre #"text" { notes } - text = any number of box -bbarre = -#(define-music-function (barre location str music) (string? ly:music?) - (let ((elts (extract-named-music music '(NoteEvent EventChord)))) - (if (pair? elts) - (let ((first-element (first elts)) - (last-element (last elts))) - (set! (ly:music-property first-element 'articulations) - (cons (make-music 'TextSpanEvent 'span-direction -1) - (ly:music-property first-element 'articulations))) - (set! (ly:music-property last-element 'articulations) - (cons (make-music 'TextSpanEvent 'span-direction 1) - (ly:music-property last-element 'articulations)))))) - #{ - \once \override TextSpanner.font-size = #-2 - \once \override TextSpanner.font-shape = #'upright - \once \override TextSpanner.staff-padding = #3 - \once \override TextSpanner.style = #'line - \once \override TextSpanner.to-barline = ##f - \once \override TextSpanner.bound-details = - #`((left - (text . ,#{ \markup { \draw-line #'( 0 . -.5) } #}) - (Y . 0) - (padding . 0.25) - (attach-dir . -2)) - (right - (text . ,#{ \markup { \cWithSlash #str } #}) - (Y . 0) - (padding . 0.25) - (attach-dir . 2))) -%% uncomment this line for make full barred - % \once \override TextSpanner.bound-details.left.text = \markup { "B" #str } - $music - #}) - -%% %%%%%%% Cut here ----- End 'bbarred.ly' -%% Copy and change the last line for full barred. Rename in 'fbarred.ly' -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% Syntaxe: \bbarre #"text" { notes } - text = any number of box -\relative c'{ \clef "G_8" \stemUp \bbarre #"III" { 16[ c' d c d8] } } diff --git a/Documentation/snippets/new/broken-crescendo-hairpin.ly b/Documentation/snippets/new/broken-crescendo-hairpin.ly deleted file mode 100644 index 27df9446ad..0000000000 --- a/Documentation/snippets/new/broken-crescendo-hairpin.ly +++ /dev/null @@ -1,42 +0,0 @@ -\version "2.17.27" - -\header { - lsrtags = "contemporary-notation, expressive-marks, symbols-and-glyphs" - - texidoc = " -In order to make parts of a crescendo hairpin invisible, the following -method is used: A white rectangle is drawn on top of the respective -part of the crescendo hairpin, making it invisible. - -The markup command @code{with-dimensions} tells LilyPond to consider only -the bottom edge of the rectangle when spacing it against the hairpin. -The property @code{staff-padding} prevents the rectangle from fitting -between the hairpin and staff. - -Make sure to put the hairpin in a lower layer than the text markup to -draw the rectangle over the hairpin. - -" - doctitle = "Broken Crescendo Hairpin" -} - -\relative c' { - << - { - \dynamicUp - r2 r16 c'8.\pp r4 - } - \\ - { - \override DynamicLineSpanner.layer = #0 - des,2\mf\< ~ - \override TextScript.layer = #2 - \once\override TextScript.staff-padding = #6 - \once\override TextScript.vertical-skylines = #'() - des16_\markup \with-dimensions #'(2 . 7) #'(0 . 0) - \with-color #white - \filled-box #'(2 . 7) #'(0 . 2) #0 - r8. des4 ~ des16->\sff - } - >> -} diff --git a/Documentation/snippets/new/centered-measure-numbers.ly b/Documentation/snippets/new/centered-measure-numbers.ly deleted file mode 100644 index 6fa6ee9e3b..0000000000 --- a/Documentation/snippets/new/centered-measure-numbers.ly +++ /dev/null @@ -1,48 +0,0 @@ -\version "2.17.7" - -\header { - lsrtags = "contexts-and-engravers, repeats, staff-notation" - - texidoc = " -Scores of large ensemble works often have bar numbers placed beneath the -system, centered horizontally on the measure's extent. This snippet shows -how the @code{Measure_counter_engraver} may be used to simulate this -notational practice. Here, the engraver has been added to a @code{Dynamics} -context. - -" - - doctitle = "Centered measure numbers" -} - -\layout { - \context { - \Dynamics - \consists #Measure_counter_engraver - \override MeasureCounter.direction = #DOWN - \override MeasureCounter.font-encoding = #'latin1 - \override MeasureCounter.font-shape = #'italic - % to control the distance of the Dynamics context from the staff: - \override VerticalAxisGroup.nonstaff-relatedstaff-spacing.padding = #2 - } - \context { - \Score - \remove "Bar_number_engraver" - } -} - -pattern = \repeat unfold 7 { c'4 d' e' f' } - -\new StaffGroup << - \new Staff { - \pattern - } - \new Staff { - \pattern - } - \new Dynamics { - \startMeasureCount - s1*7 - \stopMeasureCount - } ->> diff --git a/Documentation/snippets/new/centering-markup-on-note-heads-automatically.ly b/Documentation/snippets/new/centering-markup-on-note-heads-automatically.ly deleted file mode 100644 index 641f2861c7..0000000000 --- a/Documentation/snippets/new/centering-markup-on-note-heads-automatically.ly +++ /dev/null @@ -1,57 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "text, tweaks-and-overrides, contexts-and-engravers" - texidoc = " -For technical reasons, text scripts attached to note heads cannot -easily be centered on a note head's width, unlike articulations. - -Instead of using trial-and-error offset tweaks, this snippet uses a -Scheme engraver to reset the horizontal parent of each markup to a -@code{NoteColumn}. This also allows text to follow note heads which have -been shifted via @code{force-hshift}. -" - doctitle = "Centering markup on note heads automatically" -} - -#(define (Text_align_engraver ctx) - (let ((scripts '()) - (note-column #f)) - (make-engraver - (acknowledgers - ((note-column-interface trans grob source) - ;; cache NoteColumn in this Voice context - (set! note-column grob)) - ((text-script-interface trans grob source) - ;; whenever a TextScript is acknowledged, - ;; add it to `scripts' list - (set! scripts (cons grob scripts)))) - ((stop-translation-timestep trans) - ;; if any TextScript grobs exist, - ;; set NoteColumn as X-parent - (for-each (lambda (script) - (set! (ly:grob-parent script X) note-column)) - scripts) - ;; clear scripts ready for next timestep - (set! scripts '()))))) - -\layout { - \context { - \Voice - \consists #Text_align_engraver - \override TextScript.X-offset = - #ly:self-alignment-interface::aligned-on-x-parent - \override TextScript.self-alignment-X = #CENTER - } -} - -\new Staff << - \relative c'' { - \override NoteColumn.force-hshift = #3 - c1-\markup { \arrow-head #Y #DOWN ##t } - } - \\ - \relative c' { - a4 a-\markup { \huge ^ } a a - } ->> diff --git a/Documentation/snippets/new/changing-form-of-multi-measure-rests.ly b/Documentation/snippets/new/changing-form-of-multi-measure-rests.ly new file mode 100644 index 0000000000..3a7c2c7259 --- /dev/null +++ b/Documentation/snippets/new/changing-form-of-multi-measure-rests.ly @@ -0,0 +1,24 @@ + +\version "2.19.20" + +\header { + lsrtags = "rhythms, tweaks-and-overrides" + + texidoc = " +If there are ten or fewer measures of rests, a series of longa and +breve rests (called in German @qq{Kirchenpausen} - church rests) is +printed within the staff; otherwise a simple line is shown. This +default number of ten may be changed by overriding the +@code{expand-limit} property. + +" + doctitle = "Changing form of multi-measure rests" +} + +\relative c'' { + \compressMMRests { + R1*2 | R1*5 | R1*9 + \override MultiMeasureRest.expand-limit = #3 + R1*2 | R1*5 | R1*9 + } +} diff --git a/Documentation/snippets/new/changing-properties-for-individual-grobs.ly b/Documentation/snippets/new/changing-properties-for-individual-grobs.ly new file mode 100644 index 0000000000..51dfb84bb9 --- /dev/null +++ b/Documentation/snippets/new/changing-properties-for-individual-grobs.ly @@ -0,0 +1,30 @@ +\version "2.19.24" + +\header { + lsrtags = "really-cool, scheme-language, tweaks-and-overrides" + + texidoc = " +The @code{\\applyOutput} command allows the tuning of any layout +object, in any context. It requires a Scheme function with three +arguments. + +" + doctitle = "Changing properties for individual grobs" +} +#(define (mc-squared grob grob-origin context) + (let ((sp (ly:grob-property grob 'staff-position))) + (ly:grob-set-property! + grob 'stencil + (grob-interpret-markup grob + #{ \markup \lower #0.5 + #(case sp + ((-5) "m") + ((-3) "c ") + ((-2) #{ \markup \teeny \bold 2 #}) + (else "bla")) #})))) + +\relative c' { + 2 + \applyOutput Voice.NoteHead #mc-squared + 2 +} diff --git a/Documentation/snippets/new/changing-the-tuplet-number.ly b/Documentation/snippets/new/changing-the-tuplet-number.ly deleted file mode 100644 index 346d12e0e6..0000000000 --- a/Documentation/snippets/new/changing-the-tuplet-number.ly +++ /dev/null @@ -1,23 +0,0 @@ -\version "2.17.30" - -\header { - lsrtags = "rhythms" - - texidoc = " -By default, only the numerator of the tuplet number is printed over the -tuplet bracket. Alternatively, num:den of the tuplet number may -be printed, or the tuplet number may be suppressed altogether. - -" - doctitle = "Changing the tuplet number" -} - - -\relative c'' { - \tuplet 3/2 { c8 c c } - \tuplet 3/2 { c8 c c } - \override TupletNumber.text = #tuplet-number::calc-fraction-text - \tuplet 3/2 { c8 c c } - \omit TupletNumber - \tuplet 3/2 { c8 c c } -} diff --git a/Documentation/snippets/new/changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly b/Documentation/snippets/new/changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly deleted file mode 100644 index cedf58cd32..0000000000 --- a/Documentation/snippets/new/changing-time-signatures-inside-a-polymetric-section-using--scaledurations.ly +++ /dev/null @@ -1,39 +0,0 @@ -\version "2.17.11" - -\header { - lsrtags = "workaround, contexts-and-engravers, contemporary-notation, rhythms" - - doctitle = "Changing time signatures inside a polymetric section using \\scaleDurations" -} - - -\layout { - \context { - \Score - \remove "Timing_translator" - \remove "Default_bar_line_engraver" - } - \context { - \Staff - \consists "Timing_translator" - \consists "Default_bar_line_engraver" - } -} - -<< - \new Staff { - \scaleDurations 8/5 { - \time 6/8 - \set Timing.measureLength = #(ly:make-moment 6/5) - b8 b b b b b - \time 2/4 - \set Timing.measureLength = #(ly:make-moment 4/5) - b4 b - } - } - \new Staff { - \clef bass - \time 2/4 - c2 d e f - } ->> diff --git a/Documentation/snippets/new/chant-or-psalms-notation.ly b/Documentation/snippets/new/chant-or-psalms-notation.ly deleted file mode 100644 index 8edb405b0d..0000000000 --- a/Documentation/snippets/new/chant-or-psalms-notation.ly +++ /dev/null @@ -1,30 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "rhythms, vocal-music, ancient-notation, contexts-and-engravers, specific-notation" - - texidoc = " -This form of notation is used for the chant of the Psalms, where verses -aren't always the same length. - -" - doctitle = "Chant or psalms notation" -} - -stemOff = \hide Staff.Stem -stemOn = \undo \stemOff - -\score { - \new Staff \with { \remove "Time_signature_engraver" } - { - \key g \minor - \cadenzaOn - \stemOff a'\breve bes'4 g'4 - \stemOn a'2 \bar "||" - \stemOff a'\breve g'4 a'4 - \stemOn f'2 \bar "||" - \stemOff a'\breve^\markup { \italic flexe } - \stemOn g'2 \bar "||" - } -} - diff --git a/Documentation/snippets/new/chords-headword.ly b/Documentation/snippets/new/chords-headword.ly deleted file mode 100644 index 4f625ddbc8..0000000000 --- a/Documentation/snippets/new/chords-headword.ly +++ /dev/null @@ -1,95 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "headword" - texidoc = "" - doctitle = "headword" -} - - -theChords = \chordmode { - \time 2/2 - f1 | c2 f2 | f1 | c2 f2| %\break - f2 bes2 | f1 | c2:7 f | c1 | \break -} - -verseOne = \lyricmode { - \set stanza = #"1." - Fair is the sun - shine, - Fair - er the moon - light - And all the stars __ _ in heav'n a -- bove; -} - -verseTwo = \lyricmode { - \set stanza = #"2." - Fair are the mead - ows, - Fair - er the wood - land, - Robed in the flow -- ers of bloom -- ing spring; -} - -Soprano = { - \time 2/2 - \key f \major - \stemUp - f'2 f'4 f' | g'4 e' f'2 | a'4. a'8 a'4 a' | bes'4 g' a'2 | - c''2 f''4 d'' | c''2 bes'4 a' | bes'2 a' | g'1 | -} - -Alto = { - \key f \major - c'2 c'4 c' | d'4 c' c'2 | f'4. f'8 f'4 fis' | g'4 e' f'2 | - f'2 f'4 f' | f'2 g'4 f' | e'2 f' | e'1 | -} - -Tenor = { - \key f \major - \stemDown - a2 a4 a | bes4 g a2 | c'4. c'8 d'4 d' | d'4 c' c'2 | - a2 d'4 bes | a2 c'4 c' | c'2 c' | c'1 | -} - -Bass = { - \key f \major - f2 f4 f | bes,4 c f2 | f4. e8 d4 c | bes,4 c f2 | - f2 bes,4 d | f2 e4 f | g2 f | c1 | -} - - -\score { - << - \new ChordNames { \theChords } - \context Staff = upper { - \context Voice = sop { - << - \Soprano - \Alto - >> - } - } - \context Lyrics = "LyrOne" \lyricsto "sop" { \verseOne } - \context Lyrics = "LyrTwo" \lyricsto "sop" { \verseTwo } - \context Staff = lower { - \new Voice { - \clef bass - \accidentalStyle modern-cautionary - << - \Tenor - \Bass - >> - } - } - >> - - \layout { - indent = 0 - \context { - \Score - \remove "Bar_number_engraver" - } - \context { - \Voice - \override StanzaNumber.padding = #1.8 - } - } -} -\paper { } diff --git a/Documentation/snippets/new/compound-time-signatures.ly b/Documentation/snippets/new/compound-time-signatures.ly deleted file mode 100644 index 693ed00469..0000000000 --- a/Documentation/snippets/new/compound-time-signatures.ly +++ /dev/null @@ -1,22 +0,0 @@ -\version "2.17.15" - -\header { - lsrtags = "rhythms" - - texidoc = " -Odd 20th century time signatures (such as \\\"5/8\\\") can often be -played as compound time signatures (e.g. \\\"3/8 + 2/8\\\"), which -combine two or more inequal metrics. LilyPond can make such music quite -easy to read and play, by explicitly printing the compound time -signatures and adapting the automatic beaming behavior. - -" - doctitle = "Compound time signatures" -} - -\relative c' { - \compoundMeter #'((2 8) (3 8)) - c8 d e fis gis - c8 fis, gis e d - c8 d e4 gis8 -} diff --git a/Documentation/snippets/new/conducting-signs,-measure-grouping-signs.ly b/Documentation/snippets/new/conducting-signs,-measure-grouping-signs.ly deleted file mode 100644 index c833826109..0000000000 --- a/Documentation/snippets/new/conducting-signs,-measure-grouping-signs.ly +++ /dev/null @@ -1,49 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "rhythms" - texidoc = " -Beat grouping within a measure is controlled by the context property -@code{beatStructure}. Values of @code{beatStructure} are -established for many time signatures in -@file{scm/time-signature-settings.scm}. Values of @code{beatStructure} -can be changed or set with @code{\set}. -Alternatively, @code{\time} can be used to both -set the time signature and establish the beat structure. -For this, you specify the internal grouping of beats in a measure -as a list of numbers (in Scheme syntax) before the time signature. - -@code{\time} applies to the @code{Timing} context, so it will not -reset values of @code{beatStructure} or @code{baseMoment} that are set -in other lower-level contexts, such as @code{Voice}. - -If the @code{Measure_grouping_engraver} is included -in one of the display contexts, measure grouping signs will be -created. Such signs ease reading rhythmically complex modern music. -In the example, the 9/8 measure is grouped in two different -patterns using the two different methods, while the 5/8 measure -is grouped according to the default setting in -@file{scm/time-signature-settings.scm}: -" - doctitle = "Conducting signs, measure grouping signs" -} - - -\score { - \new Voice \relative c'' { - \time 9/8 - g8 g d d g g a( bes g) | - \set Timing.beatStructure = #'(2 2 2 3) - g8 g d d g g a( bes g) | - \time #'(4 5) 9/8 - g8 g d d g g a( bes g) | - \time 5/8 - a4. g4 | - } - \layout { - \context { - \Staff - \consists "Measure_grouping_engraver" - } - } -} diff --git a/Documentation/snippets/new/creating-a-delayed-turn.ly b/Documentation/snippets/new/creating-a-delayed-turn.ly deleted file mode 100644 index 87223e9442..0000000000 --- a/Documentation/snippets/new/creating-a-delayed-turn.ly +++ /dev/null @@ -1,38 +0,0 @@ -\version "2.17.97" - -\header { - lsrtags = "editorial-annotations, expressive-marks, tweaks-and-overrides" - - texidoc = " -Creating a delayed turn, where the lower note of the turn uses the -accidental, requires several overrides. The -@code{outside-staff-priority} property must be set to @code{#f}, as -otherwise this would take precedence over the @code{avoid-slur -property}. Changing the fractions @code{2/3} and @code{1/3} adjusts the -horizontal position. -" - doctitle = "Creating a delayed turn" -} - - -\relative c'' { - c2*2/3 ( s2*1/3\turn d4) r - << - { c4.( d8) } - { s4 s\turn } - >> - \transpose c d \relative c'' << - { c4.( d8) } - { - s4 - \once \set suggestAccidentals = ##t - \once \override AccidentalSuggestion #'outside-staff-priority = ##f - \once \override AccidentalSuggestion #'avoid-slur = #'inside - \once \override AccidentalSuggestion #'font-size = #-3 - \once \override AccidentalSuggestion #'script-priority = #-1 - \single \hideNotes - b8-\turn \noBeam - s8 - } - >> -} diff --git a/Documentation/snippets/new/creating-a-sequence-of-notes-on-various-pitches.ly b/Documentation/snippets/new/creating-a-sequence-of-notes-on-various-pitches.ly index 8e9a8c65b4..f24f238ecb 100644 --- a/Documentation/snippets/new/creating-a-sequence-of-notes-on-various-pitches.ly +++ b/Documentation/snippets/new/creating-a-sequence-of-notes-on-various-pitches.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.22" \header { lsrtags = "pitches, real-music, really-cool, scheme-language" @@ -15,9 +15,9 @@ Planets. } rhythm = -#(define-music-function (parser location p) (ly:pitch?) +#(define-music-function (p) (ly:pitch?) "Make the rhythm in Mars (the Planets) at the given pitch" - #{ \tuplet 3/2 { $p 8 $p $p } $p 4 $p $p 8 $p $p 4 #}) + #{ \tuplet 3/2 { $p 8 8 8 } 4 4 8 8 4 #}) \new Staff { \time 5/4 diff --git a/Documentation/snippets/new/creating-double-digit-fingerings.ly b/Documentation/snippets/new/creating-double-digit-fingerings.ly deleted file mode 100644 index f9bf74b8d5..0000000000 --- a/Documentation/snippets/new/creating-double-digit-fingerings.ly +++ /dev/null @@ -1,17 +0,0 @@ -\version "2.17.15" - -\header { - lsrtags = "editorial-annotations, expressive-marks, scheme-language, staff-notation, tweaks-and-overrides" - - texidoc = " -Creating fingerings larger than 5 is possible. -" - doctitle = "Creating double-digit fingerings" -} - -\relative c' { - c1-10 - c1-50 - c1-36 - c1-29 -} diff --git a/Documentation/snippets/new/creating-real-parenthesized-dynamics.ly b/Documentation/snippets/new/creating-real-parenthesized-dynamics.ly deleted file mode 100644 index bfdd1bdfbe..0000000000 --- a/Documentation/snippets/new/creating-real-parenthesized-dynamics.ly +++ /dev/null @@ -1,35 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "expressive-marks, text, workaround" - - texidoc = " -Although the easiest way to add parentheses to a dynamic mark is to use -a @code{\\markup} block, this method has a downside: the created -objects will behave like text markups, and not like dynamics. - -However, it is possible to create a similar object using the equivalent -Scheme code (as described in the Notation Reference), combined with the -@code{make-dynamic-script} function. This way, the markup will be -regarded as a dynamic, and therefore will remain compatible with -commands such as @code{\\dynamicUp} or @code{\\dynamicDown}. - - - -" - doctitle = "Creating \"real\" parenthesized dynamics" -} - -paren = -#(define-event-function (parser location dyn) (ly:event?) - (make-dynamic-script - #{ \markup \concat { - \normal-text \italic \fontsize #2 ( - \pad-x #0.2 #(ly:music-property dyn 'text) - \normal-text \italic \fontsize #2 ) - } - #})) - -\relative c'' { - c4\paren\f c c \dynamicUp c\paren\p -} diff --git a/Documentation/snippets/new/cross-staff-stems.ly b/Documentation/snippets/new/cross-staff-stems.ly deleted file mode 100644 index ed3650496a..0000000000 --- a/Documentation/snippets/new/cross-staff-stems.ly +++ /dev/null @@ -1,36 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "staff-notation, tweaks-and-overrides, contexts-and-engravers" - texidoc = " -This snippet shows the use of the @code{Span_stem_engraver} -and @code{\crossStaff} to connect stems across staves automatically. -The stem length need not be specified, as the variable distance -between noteheads and staves is calculated automatically. -" - doctitle = "Cross staff stems" -} - -\layout { - \context { - \PianoStaff - \consists #Span_stem_engraver - } -} - -{ - \new PianoStaff << - \new Staff { - 4 r d'16\> e'8. g8 r\! - e'8 f' g'4 e'2 - } - \new Staff { - \clef bass - \voiceOne - \autoBeamOff - \crossStaff { 4 e, g16 a8. c8} d - \autoBeamOn - g8 f g4 c2 - } - >> -} diff --git a/Documentation/snippets/new/defining-an-engraver-in-scheme--ambitus-engraver.ly b/Documentation/snippets/new/defining-an-engraver-in-scheme--ambitus-engraver.ly index 84642a20da..cb19340ca9 100644 --- a/Documentation/snippets/new/defining-an-engraver-in-scheme--ambitus-engraver.ly +++ b/Documentation/snippets/new/defining-an-engraver-in-scheme--ambitus-engraver.ly @@ -1,20 +1,18 @@ -\version "2.16.0" +\version "2.19.28" \header { - lsrtags = "contexts-and-engravers" + texidoc = " +This example demonstrates how the ambitus engraver may be defined on +the user side, with a Scheme engraver. - texidoc = "This example demonstrates how the ambitus engraver may be - defined on the user side, with a Scheme engraver. +This is basically a rewrite in Scheme of the code from +@code{lily/ambitus-engraver.cc}. - This is basically a rewrite in Scheme of the code from - @file{lily/ambitus-engraver.cc}. " - doctitle = "Defining an engraver in Scheme: ambitus engraver" } - #(use-modules (oop goops)) %%% @@ -40,8 +38,6 @@ grob. Rewrite of @code{Accidental_placement::add_accidental} from @file{lily/accidental-placement.cc}." (let ((pitch (ly:accidental-placement::accidental-pitch accidental-grob))) (set! (ly:grob-parent accidental-grob X) grob) - (set! (ly:grob-property accidental-grob 'X-offset) - ly:grob::x-parent-positioning) (let* ((accidentals (ly:grob-object grob 'accidental-grobs)) (handle (assq (ly:pitch-notename pitch) accidentals)) (entry (if handle (cdr handle) '()))) @@ -176,7 +172,7 @@ position of middle C and key signature from @var{translator}'s context." 0)) (set! (ambitus-start-key-sig ambitus) (ly:context-property (ly:translator-context translator) - 'keySignature))))) + 'keyAlterations))))) #(define-method (update-ambitus-notes (ambitus ) note-grob) "Update the upper and lower ambitus pithes of @var{ambitus}, using @@ -289,23 +285,23 @@ position of middle C and key signature from @var{translator}'s context." (let ((ambitus #f)) ;; when music is processed: make the ambitus object, if not already built (make-engraver - ((process-music translator) - (if (not ambitus) - (set! ambitus (make-ambitus translator)))) - ;; set the ambitus clef and key signature state - ((stop-translation-timestep translator) - (if ambitus - (initialize-ambitus-state ambitus translator))) - ;; when a note-head grob is built, update the ambitus notes - (acknowledgers + ((process-music translator) + (if (not ambitus) + (set! ambitus (make-ambitus translator)))) + ;; set the ambitus clef and key signature state + ((stop-translation-timestep translator) + (if ambitus + (initialize-ambitus-state ambitus translator))) + ;; when a note-head grob is built, update the ambitus notes + (acknowledgers ((note-head-interface engraver grob source-engraver) - (if ambitus - (update-ambitus-notes ambitus grob)))) - ;; finally, typeset the ambitus according to its upper and lower notes - ;; (if any). - ((finalize translator) - (if ambitus - (typeset-ambitus ambitus translator))))))) + (if ambitus + (update-ambitus-notes ambitus grob)))) + ;; finally, typeset the ambitus according to its upper and lower notes + ;; (if any). + ((finalize translator) + (if ambitus + (typeset-ambitus ambitus translator))))))) %%% %%% Example diff --git a/Documentation/snippets/new/entering-several-tuplets-using-only-one--times-command.ly b/Documentation/snippets/new/entering-several-tuplets-using-only-one--times-command.ly deleted file mode 100644 index 0b6af1b368..0000000000 --- a/Documentation/snippets/new/entering-several-tuplets-using-only-one--times-command.ly +++ /dev/null @@ -1,28 +0,0 @@ -\version "2.17.11" - -\header { - lsrtags = "rhythms, syntax-and-expressions" - - texidoc = " -The property @code{tupletSpannerDuration} sets how long each of the -tuplets contained within the brackets after @code{\\tuplet} should last. -Many consecutive tuplets can then be placed within a single -@code{\\tuplet} expression, thus saving typing. - -There are several ways to set @code{tupletSpannerDuration}. The command -@code{\\tupletSpan} sets it to a given duration, and clears it when -instead of a duration @code{\\default} is specified. Another way is -to use an optional argument with @code{\\tuplet}. -" - doctitle = "Entering several tuplets using only one \\tuplet command" -} - - -\relative c' { - \time 2/4 - \tupletSpan 4 - \tuplet 3/2 { c8^"\\tupletSpan 4" c c c c c } - \tupletSpan \default - \tuplet 3/2 { c8^"\\tupletSpan \\default" c c c c c } - \tuplet 3/2 4 { c8^"\\tuplet 3/2 4 {...}" c c c c c } -} diff --git a/Documentation/snippets/new/expressive-headword.ly b/Documentation/snippets/new/expressive-headword.ly deleted file mode 100644 index 1f9cf0f33c..0000000000 --- a/Documentation/snippets/new/expressive-headword.ly +++ /dev/null @@ -1,268 +0,0 @@ -\version "2.17.27" - -\header { - lsrtags = "headword" - - texidoc = " -Expressive headword - -" - doctitle = "Expressive headword" -} -\include "english.ly" - -% NR 1.3 Expressive marks - -% L. v. Beethoven, Op. 49 no. 1 -% Piano sonata 19 - "Leichte Sonate" -% measures 1 - 12 - -%\layout { -% \context { -% \Score -% \override SpacingSpanner.base-shortest-duration = -% #(ly:make-moment 1/20) -% } -%} - -\new PianoStaff << - - % RH Staff - \new Staff { - \clef treble - \key g \major - \time 6/8 - \partial 2 - \once \override TextScript.padding = #2 - d'8 \staccato - ^ \markup { \column { - RONDO - \italic Allegro } } - d'8 \staccato - g'8 \staccato - a'8 \staccato - - | - - b'8 [ ( - g'8 ] ) - e'8 \staccato - e' \staccato - a'8 \staccato - b'8 \staccato - - | - - c''8 [ ( - a'8 ] ) - e''8 \staccato - d''8 \staccato - c''8 \staccato - b'8 \staccato - - | - - a'8 \staccato - g'8 \staccato - a'8 \staccato - \acciaccatura { g'16 [ a'16 ] } - bf'8 - a'8 \staccato - g'8 \staccato - - | - - fs'8 [ ( - d'8 ] ) - d'8 \staccato - d'8 \staccato - g'8 \staccato - a'8 \staccato - - | - - b'8 [ ( - g'8 ] ) - e'8 \staccato - e'8 \staccato - a'8 \staccato - b'8 \staccato - - | - - c''8 [ ( - a'8 ] ) - e''8 \staccato - d''8 \staccato - c''8 \staccato - b'8 \staccato - - | - - a'8 \staccato - g'8 \staccato - a'8 \staccato - << - { - \voiceOne - d'8 - g'8 - fs'8 - \oneVoice - } - \new Voice { - \voiceTwo - d'4 - c'8 - \oneVoice - } - >> - - | - - 4 \tenuto - d'8 \staccato - g'8 \staccato - b'8 \staccato - d''8 \staccato - - | - - d''8 ( - 8 \staccato ) - 8 \staccato - d''8 ( - 8 \staccato ) - 8 \staccato - - | - - d''8 ( - 8 \staccato ) - 8 \staccato - d''8 ( - 8 \staccato ) - 8 \staccato - - | - - d''8 \staccato - 8 \staccato - 8 \staccato - d'' \staccato - 8 \staccato - 8 \staccato - - | - - 4 \fermata - r8 r4 r8 - } - - % LH Staff - \new Staff { - \clef bass - \key g \major - \time 6/8 - \partial 2 - r8 - r8 - 8 \staccato - 8 \staccato - - | - - 4 - r8 - r8 - 8 \staccato - 8 \staccato - - | - - 4 - r8 - r8 - 8 \staccato - 8 \staccato - - | - - 8 \staccato - 8 \staccato - 8 \staccato - 4. ( - - | - - d'4 ) - r8 - r8 - 8 \staccato - 8 \staccato - - | - - 4 - r8 - r8 - 8 \staccato - 8 \staccato - - | - - 4 - r8 - r8 - 8 \staccato - 8 \staccato - - | - - 8 \staccato - 8 \staccato - 8 \staccato - 4 - 8 \staccato - - | - - 4 \tenuto - r8 - r4 - r8 - - | - - r8 - 8 \staccato - 8 \staccato - r8 - 8 \staccato - 8 \staccato - - | - - r8 - 8 \staccato - 8 \staccato - r8 - 8 \staccato - 8 \staccato - - | - - r8 - 8 \staccato - 8 \staccato - r8 - 8 \staccato - 8 \staccato - - | - - 4 \fermata - r8 r4 r8 - } - ->> diff --git a/Documentation/snippets/new/extending-glissandi-across-repeats.ly b/Documentation/snippets/new/extending-glissandi-across-repeats.ly deleted file mode 100644 index 0c7496c0d2..0000000000 --- a/Documentation/snippets/new/extending-glissandi-across-repeats.ly +++ /dev/null @@ -1,62 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "staff-notation, tweaks-and-overrides" - texidoc = " -A glissando which extends into several @code{\alternative} blocks -can be simulated by adding a hidden grace note with a glissando -at the start of each @code{\alternative} block. The grace note -should be at the same pitch as the note which starts the initial -glissando. This is implemented here with a music function which -takes the pitch of the grace note as its argument. - -Note that in polyphonic music the grace note must be matched with -corresponding grace notes in all other voices. -" - doctitle = "Extending glissandi across repeats" -} - -repeatGliss = #(define-music-function (parser location grace) - (ly:pitch?) - #{ - % the next two lines ensure the glissando is long enough - % to be visible - \once \override Glissando.springs-and-rods - = #ly:spanner::set-spacing-rods - \once \override Glissando.minimum-length = #3.5 - \once \hideNotes - \grace $grace \glissando - #}) - -\score { - \relative c'' { - \repeat volta 3 { c4 d e f\glissando } - \alternative { - { g2 d } - { \repeatGliss f g2 e } - { \repeatGliss f e2 d } - } - } -} - -music = \relative c' { - \voiceOne - \repeat volta 2 { - g a b c\glissando - } - \alternative { - { d1 } - { \repeatGliss c e1 } - } -} - -\score { - \new StaffGroup << - \new Staff << - \context Voice { \clef "G_8" \music } - >> - \new TabStaff << - \context TabVoice { \clef "moderntab" \music } - >> - >> -} \ No newline at end of file diff --git a/Documentation/snippets/new/flat-flags-and-beam-nibs.ly b/Documentation/snippets/new/flat-flags-and-beam-nibs.ly new file mode 100644 index 0000000000..754394be7a --- /dev/null +++ b/Documentation/snippets/new/flat-flags-and-beam-nibs.ly @@ -0,0 +1,86 @@ +\version "2.19.0" + +\header { + lsrtags = "contemporary-notation, rhythms" + + texidoc = " + Flat flags on lone notes and beam nibs at the ends of beamed figures +are both possible with a combination of @code{stemLeftBeamCount}, +@code{stemRightBeamCount} and paired @code{[]} beam indicators. + + + + +For right-pointing flat flags on lone notes, use paired @code{[]} beam +indicators and set @code{stemLeftBeamCount} to zero (see Example 1). + + + + +For left-pointing flat flags, set @code{stemRightBeamCount} instead +(Example 2). + + + + +For right-pointing nibs at the end of a run of beamed notes, set +@code{stemRightBeamCount} to a positive value. And for left-pointing +nibs at the start of a run of beamed notes, set +@code{stemLeftBeamCount} instead (Example 3). + + + + +Sometimes it may make sense for a lone note surrounded by rests to +carry both a left- and right-pointing flat flag. Do this with paired +@code{[]} beam indicators alone (Example 4). + + + + +(Note that @code{\\set stemLeftBeamCount} is always equivalent to +@code{\\once \\set}. In other words, the beam count settings are not +@qq{sticky}, so the pair of flat flags attached to the lone +@code{16[]} in the last example have nothing to do with the +@code{\\set} two notes prior.) + + + + +" + doctitle = "Flat flags and beam nibs" +} +\score { + << + % Example 1 + \new RhythmicStaff { + \set stemLeftBeamCount = #0 + c16[] + r8. + } + % Example 2 + \new RhythmicStaff { + r8. + \set stemRightBeamCount = #0 + 16[] + } + % Example 3 + \new RhythmicStaff { + 16 16 + \set stemRightBeamCount = #2 + 16 r r + \set stemLeftBeamCount = #2 + 16 16 16 + } + % Example 4 + \new RhythmicStaff { + 16 16 + \set stemRightBeamCount = #2 + 16 r16 + 16[] + r16 + \set stemLeftBeamCount = #2 + 16 16 + } + >> +} diff --git a/Documentation/snippets/new/flute-slap-notation.ly b/Documentation/snippets/new/flute-slap-notation.ly new file mode 100644 index 0000000000..b18de49510 --- /dev/null +++ b/Documentation/snippets/new/flute-slap-notation.ly @@ -0,0 +1,38 @@ +\version "2.19.22" + +\header { + lsrtags = "contemporary-notation, winds" + + texidoc = " +It is possible to indicate special articulation techniques such as a +flute @qq{tongue slap} by replacing the note head with the appropriate +glyph. + +" + doctitle = "Flute slap notation" +} +slap = +#(define-music-function (music) (ly:music?) +#{ + \temporary \override NoteHead.stencil = + #(lambda (grob) + (grob-interpret-markup grob + (markup #:musicglyph "scripts.sforzato"))) + \temporary \override NoteHead.stem-attachment = + #(lambda (grob) + (let* ((thickness (ly:staff-symbol-line-thickness grob)) + (stem (ly:grob-object grob 'stem)) + (dir (ly:grob-property stem 'direction UP))) + (cons 1 (+ (if (= dir DOWN) + 0.5 + 0) + (/ thickness 2))))) + #music + \revert NoteHead.stencil + \revert NoteHead.stem-attachment +#}) + +\relative c' { + c4 \slap c d r + \slap { g4 a } b r +} diff --git a/Documentation/snippets/new/forcing-measure-width-to-adapt-to-metronomemarks-width.ly b/Documentation/snippets/new/forcing-measure-width-to-adapt-to-metronomemarks-width.ly new file mode 100644 index 0000000000..f4291fde13 --- /dev/null +++ b/Documentation/snippets/new/forcing-measure-width-to-adapt-to-metronomemarks-width.ly @@ -0,0 +1,33 @@ + +\version "2.19.20" + +\header { + lsrtags = "staff-notation, workaround" + + texidoc = " +By default, metronome marks do not influence horizontal spacing. This +can be solved through a simple override, as shown in the second half of +the example. + +" + doctitle = "Forcing measure width to adapt to MetronomeMark's width" +} + +example = { + \tempo "Allegro" + R1*6 + \tempo "Rall." + R1*2 + \tempo "A tempo" + R1*8 +} + +{ + \compressMMRests { + \example + R1 + R1 + \override Score.MetronomeMark.extra-spacing-width = #'(-3 . 0) + \example + } +} diff --git a/Documentation/snippets/new/fretted-headword.ly b/Documentation/snippets/new/fretted-headword.ly deleted file mode 100644 index 24fe6e20e4..0000000000 --- a/Documentation/snippets/new/fretted-headword.ly +++ /dev/null @@ -1,142 +0,0 @@ -% INSPIRATIONAL HEADER FOR LILYPOND DOCUMENTATION fretted-strings % -% Passage from Johann Kaspar Mertz "Opern Revue, Op. 8, no. 17" % -% on melodies from Bellini's "Norma" % -%*****************************************************************% - -\version "2.17.30" - -\header { - lsrtags = "headword" - texidoc = "" - doctitle = "headword" -} - - -\layout { - \context { - \Score - \remove "Bar_number_engraver" - } -} - -%%%% shortcuts -% fingering orientations -sfol = \set fingeringOrientations = #'(left) -sfor = \set fingeringOrientations = #'(right) -sfod = \set fingeringOrientations = #'(down) -sfou = \set fingeringOrientations = #'(up) - -% string number orientations -ssnol = \set stringNumberOrientations = #'(left) %(down right up) -ssnou = \set stringNumberOrientations = #'(up) -ssnod = \set stringNumberOrientations = #'(down) -ssnor = \set stringNumberOrientations = #'(right) - -% define fingering offset -FO = #(define-music-function (parser location offsetX offsetY) (number? number?) -#{ - \once \override Voice.Fingering.extra-offset = #(cons offsetX offsetY) -#}) - -% markups -rit = \markup \center-align { \bold { \italic { " rit." } } } -dimin = \markup \center-align { \italic { " dim." } } -andantino = \markup \left-align { \italic { \bold { \fontsize #2.5 { "Andantino" } } } } -benmarcato = \markup { \italic { \bold { "il canto ben marcato" } } } -pdolce = #(make-dynamic-script (markup #:line (#:dynamic "p" #:normal-text #:italic "dol."))) - -%%% THE MUSIC %%% - -melody = \relative c { - \clef "treble_8" - \key d \major - \time 4/4 - \voiceOne - \sfol - e,32 a' c e - e, a c e - e,, a' c e - e, a c e - f4\rest 4-> | % m. 1 - - e,,,32 gis' b e - e, gis b e - e,, gis' b e - e, gis b e - f4\rest \FO #'0.4 #'0.5 4 | % m. 2 - - d4\rest -> d4\rest^\rit 4-> | % m. 3 - 1 | % m. 4 - - \bar "||" - \key a \minor - R1 % m. 5 - - e'4^\benmarcato e8. d16-4 - d4-4 \tuplet 3/2 { \sfou \FO #'-0.3 #'0.6 4 b8 } | % end of m. 6 - - \FO #'-0.3 #'0.3 - 4 \tuplet 3/2 { c4 b8 } a4 e'8. e16 | % m. 7 - - \FO #'-0.3 #'0.3 - 4 \tuplet 3/2 { \sfol \FO #'0.3 #'0.0 4 e8 } e4 % beg of m. 8 - \tuplet 3/2 { \sfou 4 c8 } | % end of m. 8 - - b4 \tuplet 3/2 { d4-4 c8 } \sfou \FO #'-1.7 #'-1.5 4 e | % end of m. 9 - - e4 e8. d16-4 d4 \tuplet 3/2 { c4 b8 } | % m. 10 - - \tuplet 3/2 { a4 a8 b4 c8 } % beg of m. 11 - \sfou \FO #'-0.3 #'0.3 - 4^\< \tuplet 3/2 { e4 8\! } | % end of m. 11 -} - -bass = \relative c { - \key d \major - \time 4/4 - \voiceTwo - - e,8\fp[ e'] e,[ e'] e, \sfol c, | % m. 1 - - e,,8\fp[ e'] e,[ e'] e, \sfod \FO #'0.2 #'-0.2 % beg m. 2 - \sfol \FO #'0.3 #'0.0 b | % end m. 2 - - e,,8 e' gis e e, e' gis_\dimin e | % m. 3 - - e,1 | % m. 4 - - %% new section starts here in A minor - \set Score.beamExceptions = #'() - \once \override TextScript.staff-padding = #1.7 - \tuplet 3/2 { a8\p^\andantino e' a c a e a, e' a c a e } | % m. 5 - - \tuplet 3/2 { a,8\pdolce e' a c a e } % beg m. 6 - \tuplet 3/2 { e,8 \sfou c gis e } | % end m. 6 - - \tuplet 3/2 { a,8 a c e, b' a, e' a c a e } | % m. 7 - - \tuplet 3/2 { f,8 f' a \sfol \FO #'0.3 #'-0.5 a f fis, d' a' d a d, } | % m. 8 - - \tuplet 3/2 { 8 d' g d' g, d % beg m. 9 - \sfod \FO #'0.0 #'-2.0 \sfou b gis e } | % end m. 9 - - \tuplet 3/2 { a,8 e' a c a e e, e' gis c gis e } | % m. 10 - - \tuplet 3/2 { a,8 e' a b a e f, f' a d a f } | % m. 11 -} - -\score { - \new Staff = "guitar" << - \context Voice = "upper" { \melody } - \context Voice = "lower" { \bass } - >> - \layout { - \context { - \Score - \override Fingering.staff-padding = #'() - \omit TupletNumber - \override TupletBracket.bracket-visibility = ##f - } - } - \midi { } -} diff --git a/Documentation/snippets/new/generating-custom-flags.ly b/Documentation/snippets/new/generating-custom-flags.ly deleted file mode 100644 index aa54b59bf4..0000000000 --- a/Documentation/snippets/new/generating-custom-flags.ly +++ /dev/null @@ -1,62 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "rhythms, tweaks-and-overrides" - - texidoc = " -The @code{stencil} property of the Flag grob can be set to a custom scheme -function to generate the glyph for the flag. - -" - doctitle = "Generating custom flags" -} - -#(define-public (weight-flag grob) - (let* ((stem-grob (ly:grob-parent grob X)) - (log (- (ly:grob-property stem-grob 'duration-log) 2)) - (is-up? (eqv? (ly:grob-property stem-grob 'direction) UP)) - (yext (if is-up? (cons (* log -0.8) 0) (cons 0 (* log 0.8)))) - (flag-stencil (make-filled-box-stencil '(-0.4 . 0.4) yext)) - (stroke-style (ly:grob-property grob 'stroke-style)) - (stroke-stencil (if (equal? stroke-style "grace") - (make-line-stencil 0.2 -0.9 -0.4 0.9 -0.4) - empty-stencil))) - (ly:stencil-add flag-stencil stroke-stencil))) - - -% Create a flag stencil by looking up the glyph from the font -#(define (inverted-flag grob) - (let* ((stem-grob (ly:grob-parent grob X)) - (dir (if (eqv? (ly:grob-property stem-grob 'direction) UP) "d" "u")) - (flag (retrieve-glyph-flag "" dir "" grob)) - (line-thickness (ly:staff-symbol-line-thickness grob)) - (stem-thickness (ly:grob-property stem-grob 'thickness)) - (stem-width (* line-thickness stem-thickness)) - (stroke-style (ly:grob-property grob 'stroke-style)) - (stencil (if (null? stroke-style) - flag - (add-stroke-glyph flag stem-grob dir stroke-style ""))) - (rotated-flag (ly:stencil-rotate-absolute stencil 180 0 0))) - (ly:stencil-translate rotated-flag (cons (- (/ stem-width 2)) 0)))) - -snippetexamplenotes = { \autoBeamOff c'8 d'16 c'32 d'64 \acciaccatura {c'8} d'64 } - -{ - \override Score.RehearsalMark.self-alignment-X = #LEFT - \time 1/4 - \mark "Normal flags" - \snippetexamplenotes - - \mark "Custom flag: inverted" - \override Flag.stencil = #inverted-flag - \snippetexamplenotes - - \mark "Custom flag: weight" - \override Flag.stencil = #weight-flag - \snippetexamplenotes - - \mark "Revert to normal" - \revert Flag.stencil - \snippetexamplenotes -} - diff --git a/Documentation/snippets/new/glissandi-can-skip-grobs.ly b/Documentation/snippets/new/glissandi-can-skip-grobs.ly deleted file mode 100644 index 039d5b4310..0000000000 --- a/Documentation/snippets/new/glissandi-can-skip-grobs.ly +++ /dev/null @@ -1,13 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "expressive-marks, staff-notation, tweaks-and-overrides" - doctitle = "Glissandi can skip grobs" - texidoc = "@code{NoteColumn} grobs can be skipped over by glissandi." -} - -\relative c' { - a2 \glissando - \once \override NoteColumn.glissando-skip = ##t - f''4 d, -} diff --git a/Documentation/snippets/new/guitar-slides.ly b/Documentation/snippets/new/guitar-slides.ly deleted file mode 100644 index c65a265cf8..0000000000 --- a/Documentation/snippets/new/guitar-slides.ly +++ /dev/null @@ -1,45 +0,0 @@ -\version "2.17.30" - -\header { - lsrtags = "fretted-strings" - - texidoc = " -Unlike glissandos, slides may go from an imprecise point of the -fretboard to a specific fret. A good way to do that is to add a grace -hidden note before the note which is actually played, as demonstrated -in the following example. -" - doctitle = "Guitar slides" -} - -%% Hide fret number: useful to draw slide into/from a casual point of -%% the fretboard. -hideFretNumber = { - \once \hide TabNoteHead - \once \hide NoteHead - \once \hide Stem - \once \override NoteHead.no-ledgers = ##t - \once \override Glissando.bound-details.left.padding = #0.3 -} - -music= \relative c' { - \grace { \hideFretNumber d8\2 \glissando s2 } g2\2 - \grace { \hideFretNumber g8\2 \glissando s2 } d2 | - - \grace { \hideFretNumber c,8 \glissando s } f4\5^\markup \tiny { Slide into } - \grace { \hideFretNumber f8 \glissando s } a4\4 - \grace { \hideFretNumber e'8\3 \glissando s } b4\3^\markup \tiny { Slide from } - \grace { \hideFretNumber b'8 \glissando s2 } g4 | -} - -\score { - << - \new Staff { - \clef "G_8" - \music - } - \new TabStaff { - \music - } - >> -} diff --git a/Documentation/snippets/new/hammer-on-and-pull-off-using-chords.ly b/Documentation/snippets/new/hammer-on-and-pull-off-using-chords.ly deleted file mode 100644 index 980707d334..0000000000 --- a/Documentation/snippets/new/hammer-on-and-pull-off-using-chords.ly +++ /dev/null @@ -1,21 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "editorial-annotations, fretted-strings" - - texidoc = " -When using hammer-on or pull-off with chorded notes, only a single arc -is drawn. However @q{double arcs} are possible by setting the -@code{doubleSlurs} property to @code{#t}. - -" - doctitle = "Hammer on and pull off using chords" -} - -\new TabStaff { - \relative c' { - % chord hammer-on and pull-off - \set doubleSlurs = ##t - 8( ) - } -} diff --git a/Documentation/snippets/new/hammer-on-and-pull-off-using-voices.ly b/Documentation/snippets/new/hammer-on-and-pull-off-using-voices.ly deleted file mode 100644 index d22a7f922c..0000000000 --- a/Documentation/snippets/new/hammer-on-and-pull-off-using-voices.ly +++ /dev/null @@ -1,20 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "editorial-annotations, fretted-strings" - - texidoc = " -The arc of hammer-on and pull-off is upwards in voices one and three and -downwards in voices two and four: - -" - doctitle = "Hammer on and pull off using voices" -} - -\new TabStaff { - \relative c' { - << { \voiceOne g2( a) } - \\ { \voiceTwo a,( b) } - >> \oneVoice - } -} diff --git a/Documentation/snippets/new/hammer-on-and-pull-off.ly b/Documentation/snippets/new/hammer-on-and-pull-off.ly deleted file mode 100644 index c5b283b282..0000000000 --- a/Documentation/snippets/new/hammer-on-and-pull-off.ly +++ /dev/null @@ -1,18 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "editorial-annotations, fretted-strings" - - texidoc = " -Hammer-on and pull-off can be obtained using slurs. - -" - doctitle = "Hammer on and pull off" -} - -\new TabStaff { - \relative c' { - d4( e\2) - a( g) - } -} diff --git a/Documentation/snippets/new/heavily-customized-polymetric-time-signatures.ly b/Documentation/snippets/new/heavily-customized-polymetric-time-signatures.ly deleted file mode 100644 index eefaf6ea2c..0000000000 --- a/Documentation/snippets/new/heavily-customized-polymetric-time-signatures.ly +++ /dev/null @@ -1,35 +0,0 @@ -\version "2.17.15" - -\header { - lsrtags = "contemporary-notation, percussion, real-music, rhythms" - - texidoc = " -Though the polymetric time signature shown was not the most essential -item here, it has been included to show the beat of this piece (which -is the template of a real Balkan song!). - -" - doctitle = "Heavily customized polymetric time signatures" -} - -melody = \relative c'' { - \set Staff.instrumentName = #"Bb Sop." - \key g \major - \compoundMeter #'((3 8) (2 8) (2 8) (3 8) (2 8) (2 8) - (2 8) (2 8) (3 8) (2 8) (2 8)) - c8 c c d4 c8 c b c b a4 g fis8 e d c b' c d e4-^ fis8 g \break - c,4. d4 c4 d4. c4 d c2 d4. e4-^ d4 - c4. d4 c4 d4. c4 d c2 d4. e4-^ d4 \break - c4. d4 c4 d4. c4 d c2 d4. e4-^ d4 - c4. d4 c4 d4. c4 d c2 d4. e4-^ d4 \break -} - -drum = \new DrumStaff \drummode { - \bar ".|:" bd4.^\markup { Drums } sn4 bd \bar ";" sn4. - bd4 sn \bar ";" bd sn bd4. sn4 bd \bar ":|." -} - -{ - \melody - \drum -} diff --git a/Documentation/snippets/new/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly b/Documentation/snippets/new/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly deleted file mode 100644 index 411707896b..0000000000 --- a/Documentation/snippets/new/horizontally-aligning-custom-dynamics-e.g.-sempre-pp,-piu-f,-subito-p.ly +++ /dev/null @@ -1,168 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "correction-wanted, expressive-marks, tweaks-and-overrides, version-specific" - - texidoc = " -Some dynamic expressions involve additional text, like @qq{sempre pp}. -Since dynamics are usually centered under the note, the \\pp would be -displayed way after the note it applies to. - -To correctly align the @qq{sempre pp} horizontally, so that it is -aligned as if it were only the \\pp, there are several approaches: - -* Simply use @code{\\once\\override DynamicText.X-offset = #-9.2} -before the note with the dynamics to manually shift it to the correct -position. Drawback: This has to be done manually each time you use that -dynamic markup... - -* Add some padding (@code{#:hspace 7.1}) into the -definition of your custom dynamic mark, so that after lilypond -center-aligns it, it is already correctly aligned. Drawback: The -padding really takes up that space and does not allow any other markup -or dynamics to be shown in that position. - -* Shift the dynamic script @code{\\once\\override ...X-offset = ..}. -Drawback: @code{\\once\\override} is needed for every invocation! - -* Set the dimensions of the additional text to 0 (using -@code{#:with-dimensions '(0 . 0) '(0 . 0)}). Drawback: To LilyPond -@qq{sempre} has no extent, so it might put other stuff there and create -collisions (which are not detected by the collision detection!). Also, -there seems to be some spacing, so it's not exactly the same alignment -as without the additional text - -* Add an explicit shifting directly inside the scheme function for the -dynamic-script. - -* Set an explicit alignment inside the dynamic-script. By default, this -won't have any effect, only if one sets X-offset! Drawback: One needs -to set @code{DynamicText #'X-offset}, which will apply to all dynamic -texts! Also, it is aligned at the right edge of the additional text, -not at the center of pp. -" - doctitle = "Horizontally aligning custom dynamics (e.g. \"sempre pp\" \"piu f\" \"subito p\")" -} - -\header { title = "Horizontally aligning custom dynamics" } - -\paper { ragged-right = ##f } - -% Solution 1: Using a simple markup with a particular halign value -% Drawback: It's a markup, not a dynamic command, so \dynamicDown -% etc. will have no effect -semppMarkup = \markup { \halign #1.4 \italic "sempre" \dynamic "pp" } - -% Solution 2: Using a dynamic script & shifting with -% \once \override ...X-offset = .. -% Drawback: \once \override needed for every invocation -semppK = -#(make-dynamic-script - (markup #:line - (#:normal-text - #:italic "sempre" - #:dynamic "pp"))) - -% Solution 3: Padding the dynamic script so the center-alignment -% puts it at the correct position -% Drawback: the padding really reserves the space, nothing else can be there -semppT = -#(make-dynamic-script - (markup #:line - (#:normal-text - #:italic "sempre" - #:dynamic "pp" - #:hspace 7.1))) - -% Solution 4: Dynamic, setting the dimensions of the additional text to 0 -% Drawback: To lilypond "sempre" has no extent, so it might put -% other stuff there => collisions -% Drawback: Also, there seems to be some spacing, so it's not exactly the -% same alignment as without the additional text -semppM = -#(make-dynamic-script - (markup #:line - (#:with-dimensions '(0 . 0) '(0 . 0) - #:right-align - #:normal-text - #:italic "sempre" - #:dynamic "pp"))) - -% Solution 5: Dynamic with explicit shifting inside the scheme function -semppG = -#(make-dynamic-script - (markup #:hspace 0 - #:translate '(-18.85 . 0) - #:line (#:normal-text - #:italic "sempre" - #:dynamic "pp"))) - -% Solution 6: Dynamic with explicit alignment. This has only effect -% if one sets X-offset! -% Drawback: One needs to set DynamicText.X-offset! -% Drawback: Aligned at the right edge of the additional text, -% not at the center of pp -semppMII = -#(make-dynamic-script - (markup #:line (#:right-align - #:normal-text - #:italic "sempre" - #:dynamic "pp"))) - -\context StaffGroup << - \context Staff = "s" << - \set Staff.instrumentName = #"Normal" - \relative c'' { - \key es \major - c4\pp c\p c c | c\ff c c\pp c - } - >> - \context Staff = "sMarkup" << - \set Staff.instrumentName = \markup \column { Normal markup } - \relative c'' { - \key es \major - c4-\semppMarkup c\p c c | c\ff c c-\semppMarkup c - } - >> - \context Staff = "sK" << - \set Staff.instrumentName = \markup \column { Explicit shifting } - \relative c'' { - \key es \major - \once \override DynamicText.X-offset = #-9.2 - c4\semppK c\p c c - c4\ff c - \once \override DynamicText.X-offset = #-9.2 - c4\semppK c - } - >> - \context Staff = "sT" << - \set Staff.instrumentName = \markup \column { Right padding } - \relative c'' { - \key es \major - c4\semppT c\p c c | c\ff c c\semppT c - } - >> - \context Staff = "sM" << - \set Staff.instrumentName = \markup \column { Setting dimension "to zero" } - \relative c'' { - \key es \major - c4\semppM c\p c c | c\ff c c\semppM c - } - >> - \context Staff = "sG" << - \set Staff.instrumentName = \markup \column { Shifting inside dynamics } - \relative c'' { - \key es \major - c4\semppG c\p c c | c\ff c c\semppG c - } - >> - \context Staff = "sMII" << - \set Staff.instrumentName = \markup \column { Alignment inside dynamics } - \relative c'' { - \key es \major - % Setting to ##f (false) gives the same result - \override DynamicText.X-offset = #0 - c4\semppMII c\p c c | c\ff c c\semppMII c - } - >> ->> diff --git a/Documentation/snippets/new/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-1.ly b/Documentation/snippets/new/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-1.ly deleted file mode 100644 index d83c178bcc..0000000000 --- a/Documentation/snippets/new/how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-1.ly +++ /dev/null @@ -1,47 +0,0 @@ -\version "2.17.24" - -\header { - lsrtags = "editorial-annotations, expressive-marks, staff-notation, tweaks-and-overrides" - - texidoc = " -This method prints two 'rehearsal marks', one on top of the other. It -shifts the lower rehearsal mark below the staff and then adds padding -above it in order to place the upper rehearsal mark above the staff. - -By adjusting the extra-offset and baseline-skip values you can increase -or decrease the overall space between the rehearsal mark and the staff. - -Because nearly every type of glyph or string can be made to behave like -a rehearsal mark it is possible to centre those above and below a bar -line. - -Adding the appropriate 'break visibility' as shown in snippet 1 will -allow you to position two marks at the end of a line as well. - -Note: Method 1 is less complex than Method 2 but does not really allow -for fine tuning of placement of one of the rehearsal marks without -affecting the other. It may also give some problems with vertical -spacing, since using @code{extra-offset} does not change the bounding -box of the mark from its original value. - - - -" - doctitle = "How to print two rehearsal marks above and below the same barline (method 1)" -} - -\relative c'{ - c d e f | - \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5) - \once \override Score.RehearsalMark.baseline-skip = #9 - \mark \markup \center-column { \circle 1 \box A } - g f e d | - \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5) - \once \override Score.RehearsalMark.baseline-skip = #9 - \mark \markup \center-column { \flat { \bold \small \italic Fine. } } - g f e d | - \once \override Score.RehearsalMark.extra-offset = #'(0 . -8.5) - \once \override Score.RehearsalMark.baseline-skip = #9 - \override Score.RehearsalMark.break-visibility = #begin-of-line-invisible - \mark \markup \center-column { \fermata \box z } -} diff --git a/Documentation/snippets/new/incipit.ly b/Documentation/snippets/new/incipit.ly index 3b85ef170c..584afaa9fc 100644 --- a/Documentation/snippets/new/incipit.ly +++ b/Documentation/snippets/new/incipit.ly @@ -1,49 +1,22 @@ -\version "2.17.30" +\version "2.19.16" \header { - lsrtags = "staff-notation, ancient-notation, really-cool" + lsrtags = "ancient-notation, staff-notation" + texidoc = " -Incipits can be added using the instrument name grob, but keeping -separate the instrument name definition and the incipit definition. +When transcribing mensural music, an incipit at the beginning of the piece is +useful to indicate the original key and tempo. Musicians today are used +to bar lines, but these were not known during the period of mensural music. As +a compromise, bar lines are often printed between the staves, a layout style +called mensurstriche layout. " + doctitle = "Incipit" } -incipit = -#(define-music-function (parser location incipit-music) (ly:music?) - #{ - \once \override Staff.InstrumentName.self-alignment-X = #RIGHT - \once \override Staff.InstrumentName.self-alignment-Y = ##f - \once \override Staff.InstrumentName.padding = #0.3 - \once \override Staff.InstrumentName.stencil = - #(lambda (grob) - (let* ((instrument-name (ly:grob-property grob 'long-text))) - (set! (ly:grob-property grob 'long-text) - #{ \markup - \score - { - { \context MensuralStaff \with { - instrumentName = #instrument-name - } $incipit-music - } - \layout { $(ly:grob-layout grob) - line-width = \indent - indent = - % primitive-eval is probably easiest for - % escaping lexical closure and evaluating - % everything respective to (current-module). - #(primitive-eval - '(or (false-if-exception (- indent incipit-width)) - (* 0.5 indent))) - ragged-right = ##f - ragged-last = ##f - system-count = #1 } - } - #}) - (system-start-text::print grob))) - #}) - -%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% A short excerpt from the Jubilate Deo by Orlande de Lassus +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% global = { \set Score.skipBars = ##t @@ -60,18 +33,12 @@ global = { \bar "|." } -discantusIncipit = << - \new MensuralVoice = "discantusIncipit" << - \repeat unfold 9 { s1 \noBreak } - { - \clef "neomensural-c1" - \key f \major - \time 2/2 - c''1. - } - >> - \new Lyrics \lyricsto discantusIncipit { IV- } ->> +discantusIncipit = { + \clef "neomensural-c1" + \key f \major + \time 2/2 + c''1. +} discantusNotes = { \transpose c' c'' { @@ -88,32 +55,22 @@ discantusNotes = { } discantusLyrics = \lyricmode { - Ju -- bi -- | - la -- te De -- | - o, om -- - nis ter -- | - ra, __ om- | - "..." | - -us. | + Ju -- bi -- la -- te De -- o, + om -- nis ter -- ra, __ om- + "..." + -us. } -altusIncipit = << - \new MensuralVoice = "altusIncipit" << - \repeat unfold 9 { s1 \noBreak } - { - \clef "neomensural-c3" - \key f \major - \time 2/2 - r1 f'1. - } - >> - \new Lyrics \lyricsto altusIncipit { IV- } ->> +altusIncipit = { + \clef "neomensural-c3" + \key f \major + \time 2/2 + r1 f'1. +} altusNotes = { \transpose c' c'' { \clef "treble" - % two measures r2 g2. e4 fis g | a2 g4 e | fis g4.( fis16 e fis4) | @@ -125,28 +82,20 @@ altusNotes = { } altusLyrics = \lyricmode { - % two measures - Ju -- bi -- la -- te | - De -- o, om -- | - nis ter -- ra, | - "..." | - -us. | + Ju -- bi -- la -- te + De -- o, om -- nis ter -- ra, + "..." + -us. } -tenorIncipit = << - \new MensuralVoice = "tenorIncipit" << - \repeat unfold 9 { s1 \noBreak } - { - \clef "neomensural-c4" - \key f \major - \time 2/2 - r\longa - r\breve - r1 c'1. - } - >> - \new Lyrics \lyricsto tenorIncipit { IV- } ->> +tenorIncipit = { + \clef "neomensural-c4" + \key f \major + \time 2/2 + r\longa + r\breve + r1 c'1. +} tenorNotes = { \transpose c' c' { @@ -163,26 +112,18 @@ tenorNotes = { } tenorLyrics = \lyricmode { - % two measures - Ju -- bi -- la -- te | - "..." | + Ju -- bi -- la -- te + "..." -us. } -bassusIncipit = << - \new MensuralVoice = "bassusIncipit" << - \repeat unfold 9 { s1 \noBreak } - { - \clef "bass" - \key f \major - \time 2/2 - %% incipit - r\maxima - f1. - } - >> - \new Lyrics \lyricsto bassusIncipit { IV- } ->> +bassusIncipit = { + \clef "mensural-f" + \key f \major + \time 2/2 + r\maxima + f1. +} bassusNotes = { \transpose c' c' { @@ -199,8 +140,8 @@ bassusNotes = { } bassusLyrics = \lyricmode { - Ju -- bi- | - "..." | + Ju -- bi- + "..." -us. } @@ -208,33 +149,33 @@ bassusLyrics = \lyricmode { << \new StaffGroup = choirStaff << \new Voice = "discantusNotes" << - \global \set Staff.instrumentName = #"Discantus" \incipit \discantusIncipit + \global \discantusNotes >> - \new Lyrics = "discantusLyrics" \lyricsto discantusNotes { \discantusLyrics } + \new Lyrics \lyricsto discantusNotes { \discantusLyrics } \new Voice = "altusNotes" << - \global \set Staff.instrumentName = #"Altus" + \global \incipit \altusIncipit \altusNotes >> - \new Lyrics = "altusLyrics" \lyricsto altusNotes { \altusLyrics } + \new Lyrics \lyricsto altusNotes { \altusLyrics } \new Voice = "tenorNotes" << - \global \set Staff.instrumentName = #"Tenor" + \global \incipit \tenorIncipit \tenorNotes >> - \new Lyrics = "tenorLyrics" \lyricsto tenorNotes { \tenorLyrics } + \new Lyrics \lyricsto tenorNotes { \tenorLyrics } \new Voice = "bassusNotes" << - \global \set Staff.instrumentName = #"Bassus" + \global \incipit \bassusIncipit \bassusNotes >> - \new Lyrics = "bassusLyrics" \lyricsto bassusNotes { \bassusLyrics } + \new Lyrics \lyricsto bassusNotes { \bassusLyrics } >> >> \layout { diff --git a/Documentation/snippets/new/inserting-score-fragments-above-a-staff,-as-markups.ly b/Documentation/snippets/new/inserting-score-fragments-above-a-staff,-as-markups.ly deleted file mode 100644 index 09a13cf667..0000000000 --- a/Documentation/snippets/new/inserting-score-fragments-above-a-staff,-as-markups.ly +++ /dev/null @@ -1,39 +0,0 @@ -\version "2.17.15" - -\header { - lsrtags = "real-music, staff-notation" - - texidoc = " -The @code{\\markup} command is quite versatile. In this snippet, it -contains a @code{\\score} block instead of texts or marks. - -" - doctitle = "Inserting score fragments above a staff as markups" -} - -tuning = \markup { - \score { - \new Staff \with { \remove "Time_signature_engraver" } - { - \clef bass - 1 - } - \layout { ragged-right = ##t indent = 0\cm } - } -} - -\header { - title = "Solo Cello Suites" - subtitle = "Suite IV" - subsubtitle = \markup { Originalstimmung: \raise #0.5 \tuning } -} - -\layout { ragged-right = ##f } - -\relative c'' { - \time 4/8 - \tuplet 3/2 { c8 d e } \tuplet 3/2 { c d e } - \tuplet 3/2 { c8 d e } \tuplet 3/2 { c d e } - g8 a g a - g8 a g a -} diff --git a/Documentation/snippets/new/jazz-combo-template.ly b/Documentation/snippets/new/jazz-combo-template.ly deleted file mode 100644 index 41b62e581f..0000000000 --- a/Documentation/snippets/new/jazz-combo-template.ly +++ /dev/null @@ -1,272 +0,0 @@ -\version "2.17.30" - -\header { - lsrtags = "keyboards, percussion, fretted-strings, template, real-music" - - texidoc = " -This is quite an advanced template, for a jazz ensemble. Note that all -instruments are notated in @code{\\key c \\major}. This refers to the -key in concert pitch; the key will be automatically transposed if the -music is within a @code{\\transpose} section. - -" - doctitle = "Jazz combo template" -} - -\header { - title = "Song" - subtitle = "(tune)" - composer = "Me" - meter = "moderato" - piece = "Swing" - tagline = \markup { - \column { - "LilyPond example file by Amelie Zapf," - "Berlin 07/07/2003" - } - } -} - -%#(set-global-staff-size 16) -\include "english.ly" - -%%%%%%%%%%%% Some macros %%%%%%%%%%%%%%%%%%% - -sl = { - \override NoteHead.style = #'slash - \hide Stem -} -nsl = { - \revert NoteHead.style - \undo \hide Stem -} -crOn = \override NoteHead.style = #'cross -crOff = \revert NoteHead.style - -%% insert chord name style stuff here. - -jazzChords = { } - -%%%%%%%%%%%% Keys'n'thangs %%%%%%%%%%%%%%%%% - -global = { \time 4/4 } - -Key = { \key c \major } - -% ############ Horns ############ - -% ------ Trumpet ------ -trpt = \transpose c d \relative c'' { - \Key - c1 | c | c | -} -trpHarmony = \transpose c' d { - \jazzChords -} -trumpet = { - \global - \set Staff.instrumentName = #"Trumpet" - \clef treble - << - \trpt - >> -} - -% ------ Alto Saxophone ------ -alto = \transpose c a \relative c' { - \Key - c1 | c | c | -} -altoHarmony = \transpose c' a { - \jazzChords -} -altoSax = { - \global - \set Staff.instrumentName = #"Alto Sax" - \clef treble - << - \alto - >> -} - -% ------ Baritone Saxophone ------ -bari = \transpose c a' \relative c { - \Key - c1 - c1 - \sl - d4^"Solo" d d d - \nsl -} -bariHarmony = \transpose c' a \chordmode { - \jazzChords s1 s d2:maj e:m7 -} -bariSax = { - \global - \set Staff.instrumentName = #"Bari Sax" - \clef treble - << - \bari - >> -} - -% ------ Trombone ------ -tbone = \relative c { - \Key - c1 | c | c -} -tboneHarmony = \chordmode { - \jazzChords -} -trombone = { - \global - \set Staff.instrumentName = #"Trombone" - \clef bass - << - \tbone - >> -} - -% ############ Rhythm Section ############# - -% ------ Guitar ------ -gtr = \relative c'' { - \Key - c1 - \sl - b4 b b b - \nsl - c1 -} -gtrHarmony = \chordmode { - \jazzChords - s1 c2:min7+ d2:maj9 -} -guitar = { - \global - \set Staff.instrumentName = #"Guitar" - \clef treble - << - \gtr - >> -} - -%% ------ Piano ------ -rhUpper = \relative c'' { - \voiceOne - \Key - c1 | c | c -} -rhLower = \relative c' { - \voiceTwo - \Key - e1 | e | e -} - -lhUpper = \relative c' { - \voiceOne - \Key - g1 | g | g -} -lhLower = \relative c { - \voiceTwo - \Key - c1 | c | c -} - -PianoRH = { - \clef treble - \global - \set Staff.midiInstrument = #"acoustic grand" - << - \new Voice = "one" \rhUpper - \new Voice = "two" \rhLower - >> -} -PianoLH = { - \clef bass - \global - \set Staff.midiInstrument = #"acoustic grand" - << - \new Voice = "one" \lhUpper - \new Voice = "two" \lhLower - >> -} - -piano = { - << - \set PianoStaff.instrumentName = #"Piano" - \new Staff = "upper" \PianoRH - \new Staff = "lower" \PianoLH - >> -} - -% ------ Bass Guitar ------ -Bass = \relative c { - \Key - c1 | c | c -} -bass = { - \global - \set Staff.instrumentName = #"Bass" - \clef bass - << - \Bass - >> -} - -% ------ Drums ------ -up = \drummode { - \voiceOne - hh4 hh - hh4 hh - hh4 hh -} -down = \drummode { - \voiceTwo - bd4 s bd s - bd4 s bd s - bd4 s bd s -} - -drumContents = { - \global - << - \set DrumStaff.instrumentName = #"Drums" - \new DrumVoice \up - \new DrumVoice \down - >> -} - -%%%%%%%%% It All Goes Together Here %%%%%%%%%%%%%%%%%%%%%% - -\score { - << - \new StaffGroup = "horns" << - \new Staff = "trumpet" \trumpet - \new Staff = "altosax" \altoSax - \new ChordNames = "barichords" \bariHarmony - \new Staff = "barisax" \bariSax - \new Staff = "trombone" \trombone - >> - - \new StaffGroup = "rhythm" << - \new ChordNames = "chords" \gtrHarmony - \new Staff = "guitar" \guitar - \new PianoStaff = "piano" \piano - \new Staff = "bass" \bass - \new DrumStaff \drumContents - >> - >> - \layout { - \context { \Staff \RemoveEmptyStaves } - \context { - \Score - \override BarNumber.padding = #3 - \override RehearsalMark.padding = #2 - skipBars = ##t - } - } - \midi { } -} - diff --git a/Documentation/snippets/new/keyboard-headword.ly b/Documentation/snippets/new/keyboard-headword.ly deleted file mode 100644 index cb2af25e9a..0000000000 --- a/Documentation/snippets/new/keyboard-headword.ly +++ /dev/null @@ -1,242 +0,0 @@ -\version "2.17.24" - -\header { - lsrtags = "headword" - - texidoc = " -Keyboard headword - -" - doctitle = "Keyboard headword" -} -% M. Ravel, Sonatine (1905) -% First movement -\include "english.ly" - -\layout { - \context { - \Score - \remove "Bar_number_engraver" - } -} - -fermataLong = \markup { - \override #'(direction . 1) - \override #'(baseline-skip . 2) { - \dir-column { - \fermata - \text \italic \center-align long - } - } -} - -\new PianoStaff << - \set PianoStaff.connectArpeggios = ##t - \new Staff { - \time 2/4 - \key fs \major - << - \new Voice { - \voiceOne - fs''8 ( ^\markup { - \override #'(baseline-skip . 2.4) \column { - \line \bold { Un peu retenu } - \line \italic { très expressif } - } - } - es''16 - cs''16 - as'4 ) - | - fs''8 ( - es''16 - cs''16 - as'4 ) - | - fs''8 ( - es''16 - cs''16 - as'8 - cs''8 ) - | - } - \new Voice { - \voiceTwo - gs'8\rest \ppp - fs'4 ( - es'8 ) - | - gs'8\rest - fs'4 ( - es'8 ) - | - gs'8\rest - fs'4 ( - es'8 ) - | - } - >> - \clef bass - 4 ( ^ \markup \bold { Rall. } - \override Script.stencil = #(lambda (grob) - (grob-interpret-markup grob fermataLong)) - 8 ) \fermata - \noBeam - \clef treble - \slurUp - \once \override Hairpin.to-barline = ##f - 8 ( \pp \> - | - 4. \! ) ^\markup \bold { a Tempo } - \slurUp - 8 ^\( \> - | - 4. \! \) - << - \new Voice { - \voiceOne - 8 ( - | - cs'8 ^\markup \bold { Rallentando } - b16 - cs'16 - d'8 - e'16 - fs'16 - | - 4. ) - s8 - | - r8 - 4 \arpeggio - e''16 ( ^\markup \bold { Lent } - fs''16 - | - \voiceTwo - 2 ) - | - } - \new Voice { - \voiceTwo - s8 - | - 4 \< - 4 \> - | - s4. \! - \slurUp - \once \override Script.direction = #UP - 8 ( \accent - | - 4. ) - \once \override Hairpin.to-barline = ##f - 8 \ppp \> - | - s8 \! - \stemDown - \once \override Script.direction = #UP - \ottava #1 - \voiceOne - \once \override PianoStaff.Arpeggio.padding = #0.8 - 4. \arpeggio \fermata - \ottava #0 - \bar "|." - } - >> - } - \new Staff << - \set Staff.pedalSustainStyle = #'bracket - \key fs \major - \clef bass - \new Voice { - \voiceOne - ds'4 \tenuto - cs'4 \tenuto - | - ds'4 \tenuto - cs'4 \tenuto - | - ds'4 \tenuto - cs'4 \tenuto - | - s8 - \clef treble - 8 [ - \clef bass - 8 \fermata ] - s8 - | - fs8\rest - \clef treble - 4 \tenuto - s8 - | - fs8\rest - \clef treble - 4 \tenuto - s8 - | - s2 - | - ds8\rest - \clef treble - 4 - \clef bass - s8 - | - s8 - \clef treble - 4 \arpeggio - \clef bass - s8 - | - s8 - \clef treble - 4. \arpeggio \fermata - | - } - \new Voice { - \voiceTwo - ds'8 [ ( - < ds bs >8 - cs'8 - < ds as >8 ] ) - | - ds'8 [ ( - < ds bs >8 - cs'8 - < ds as >8 ] ) - | - ds'8 [ ( - < ds bs >8 - cs'8 - < ds as >8 ] ) - | - \once \override Script.outside-staff-priority = #100 - \once \override TextScript.outside-staff-priority = #500 - 4. \fermata _\markup \italic { ped. } - 8 ( - | - 4. ) \sustainOn - \clef bass - 8 \( \sustainOff - | - 4. \) \sustainOn - \clef bass - 8 ( \sustainOff - | - 4 - 4 - | - 4. ) \sustainOn - 8 ( \sustainOff - | - 4. ) \sustainOn - \slurUp - 8 ( \sustainOff \sustainOn - | - 2 ) \sustainOff \sustainOn - | - } - >> ->> diff --git a/Documentation/snippets/new/making-an-object-invisible-with-the-transparent-property.ly b/Documentation/snippets/new/making-an-object-invisible-with-the-transparent-property.ly index 70b3bf144e..f230a6de80 100644 --- a/Documentation/snippets/new/making-an-object-invisible-with-the-transparent-property.ly +++ b/Documentation/snippets/new/making-an-object-invisible-with-the-transparent-property.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.21" \header { lsrtags = "rhythms, simultaneous-notes, tweaks-and-overrides" @@ -19,16 +19,16 @@ in that voice, the tie appears to cross voices. doctitle = "Making an object invisible with the 'transparent property" } -\relative c'' { +\relative { \time 2/4 << { \once \hide Stem \once \override Stem.length = #8 - b8 ~ b\noBeam + b'8 ~ 8\noBeam \once \hide Stem \once \override Stem.length = #8 - g8 ~ g\noBeam + g8 ~ 8\noBeam } \\ { diff --git a/Documentation/snippets/new/making-glissandi-breakable.ly b/Documentation/snippets/new/making-glissandi-breakable.ly deleted file mode 100644 index bf065ac791..0000000000 --- a/Documentation/snippets/new/making-glissandi-breakable.ly +++ /dev/null @@ -1,31 +0,0 @@ -\version "2.17.30" - -\header { - lsrtags = "staff-notation, tweaks-and-overrides" - - texidoc = " -Setting the @code{breakable} property to @code{#t} in combination with -@code{after-line-breaking} allows a glissando to break if it occurs -at a line break: -" - - doctitle = "Making glissandi breakable" -} - -glissandoSkipOn = { - \override NoteColumn.glissando-skip = ##t - \hide NoteHead - \override NoteHead.no-ledgers = ##t -} - -\relative c'' { - \override Glissando.breakable = ##t - \override Glissando.after-line-breaking = ##t - f1\glissando | - \break - a4 r2. | - f1\glissando - \once \glissandoSkipOn - \break - a2 a4 r4 | -} diff --git a/Documentation/snippets/new/merging-multi-measure-rests-in-a-polyphonic-part.ly b/Documentation/snippets/new/merging-multi-measure-rests-in-a-polyphonic-part.ly deleted file mode 100644 index 3330291ff9..0000000000 --- a/Documentation/snippets/new/merging-multi-measure-rests-in-a-polyphonic-part.ly +++ /dev/null @@ -1,35 +0,0 @@ -\version "2.17.18" - -\header { - lsrtags = "really-simple, rhythms, version-specific" - - texidoc = " -When using multi-measure rests in a polyphonic staff, the rests will be -placed differently depending on the voice they belong to. However they -can be printed on the same staff line, using the following setting. - -" - doctitle = "Merging multi-measure rests in a polyphonic part" -} - -normalPos = \revert MultiMeasureRest.direction - -{ - << - { - c''1 - R1 - c''1 - \normalPos - R1 - } - \\ - { - c'1 - R1 - c'1 - \normalPos - R1 - } - >> -} diff --git a/Documentation/snippets/new/modifying-tuplet-bracket-length.ly b/Documentation/snippets/new/modifying-tuplet-bracket-length.ly new file mode 100644 index 0000000000..6ee36e8201 --- /dev/null +++ b/Documentation/snippets/new/modifying-tuplet-bracket-length.ly @@ -0,0 +1,33 @@ +\version "2.19.0" + +\header { + lsrtags = "really-simple, rhythms" + + texidoc = " +Tuplet brackets can be made to run to prefatory matter or the next +note. Default tuplet brackets end at the right edge of the final note +of the tuplet; full-length tuplet brackets extend farther to the right, +either to cover all the non-rhythmic notation up to the following note, +or to cover only the whitespace before the next item of notation, be +that a clef, time signature, key signature, or another note. The +example shows how to switch tuplets to full length mode and how to +modify what material they cover. + +" + doctitle = "Modifying tuplet bracket length" +} + +\new RhythmicStaff { + % Set tuplets to be extendable... + \set tupletFullLength = ##t + % ...to cover all items up to the next note + \set tupletFullLengthNote = ##t + \time 2/4 + \tuplet 3/2 { c4 4 4 } + % ...or to cover just whitespace + \set tupletFullLengthNote = ##f + \time 4/4 + \tuplet 5/4 { 4 1 } + \time 3/4 + 2. +} diff --git a/Documentation/snippets/new/multi-measure-rest-markup.ly b/Documentation/snippets/new/multi-measure-rest-markup.ly new file mode 100644 index 0000000000..d17b03d4ba --- /dev/null +++ b/Documentation/snippets/new/multi-measure-rest-markup.ly @@ -0,0 +1,34 @@ + +\version "2.19.20" + +\header { + lsrtags = "rhythms, text" + + texidoc = " +Markups attached to a multi-measure rest will be centered above or +below it. Long markups attached to multi-measure rests do not cause +the measure to expand. To expand a multi-measure rest to fit the +markup, use an empty chord with an attached markup before the +multi-measure rest. + +Text attached to a spacer rest in this way is left-aligned to the +position where the note would be placed in the measure, but if the +measure length is determined by the length of the text, the text will +appear to be centered. + +" + doctitle = "Multi-measure rest markup" +} + +\relative c' { + \compressMMRests { + \textLengthOn + <>^\markup { [MAJOR GENERAL] } + R1*19 + <>_\markup { \italic { Cue: ... it is yours } } + <>^\markup { A } + R1*30^\markup { [MABEL] } + \textLengthOff + c4^\markup { CHORUS } d f c + } +} diff --git a/Documentation/snippets/new/non-traditional-key-signatures.ly b/Documentation/snippets/new/non-traditional-key-signatures.ly new file mode 100644 index 0000000000..f89568fa74 --- /dev/null +++ b/Documentation/snippets/new/non-traditional-key-signatures.ly @@ -0,0 +1,44 @@ +\version "2.19.21" + +\header { + lsrtags = "contemporary-notation, pitches, really-cool, staff-notation, version-specific" + + texidoc = " +The commonly used @code{\\key} command sets the @code{keyAlterations} +property, in the @code{Staff} context. + +To create non-standard key signatures, set this property directly. The +format of this command is a list: + +@code{ \\set Staff.keyAlterations = #`(((octave . step) . alter) ((octave +. step) . alter) ...) } where, for each element in the list, +@code{octave} specifies the octave (0 being the octave from middle C to +the B above), @code{step} specifies the note within the octave (0 means +C and 6 means B), and @code{alter} is @code{,SHARP ,FLAT ,DOUBLE-SHARP} +etc. (Note the leading comma.) + + +Alternatively, for each item in the list, using the more concise format +@code{(step . alter)} specifies that the same alteration should hold in +all octaves. + + +For microtonal scales where a @qq{sharp} is not 100 cents, @code{alter} +refers to the alteration as a proportion of a 200-cent whole tone. + + +Here is an example of a possible key signature for generating a +whole-tone scale: + +" + doctitle = "Non-traditional key signatures" +} + + +\relative { + \set Staff.keyAlterations = #`((6 . ,FLAT) + (5 . ,FLAT) + (3 . ,SHARP)) + c'4 d e fis + aes4 bes c2 +} diff --git a/Documentation/snippets/new/numbering-groups-of-measures.ly b/Documentation/snippets/new/numbering-groups-of-measures.ly deleted file mode 100644 index 2722b3d286..0000000000 --- a/Documentation/snippets/new/numbering-groups-of-measures.ly +++ /dev/null @@ -1,53 +0,0 @@ -\version "2.17.7" - -\header { - lsrtags = "contexts-and-engravers, editorial-annotations, repeats, staff-notation" - - texidoc = " -This snippet demonstrates the use of the @code{Measure_counter_engraver} to -number groups of successive measures. Any stretch of measures may be numbered, -whether consisting of repetitions or not. - -The engraver must be added to the appropriate context. Here, a @code{Staff} -context is used; another possibility is a @code{Dynamics} context. - -The counter is begun with @code{\\startMeasureCount} and ended with -@code{\\stopMeasureCount}. Numbering will start by default with @code{1}, but -this behavior may be modified by overriding the @code{count-from} property. - -When a measure extends across a line break, the number will appear twice, the -second time in parentheses. - -" - doctitle = "Numbering groups of measures" -} - -\layout { - \context { - \Staff - \consists #Measure_counter_engraver - } -} - -\new Staff { - \startMeasureCount - \repeat unfold 7 { - c'4 d' e' f' - } - \stopMeasureCount - \bar "||" - g'4 f' e' d' - \override Staff.MeasureCounter.count-from = #2 - \startMeasureCount - \repeat unfold 5 { - g'4 f' e' d' - } - g'4 f' - \bar "" - \break - e'4 d' - \repeat unfold 7 { - g'4 f' e' d' - } - \stopMeasureCount -} diff --git a/Documentation/snippets/new/numbers-as-easy-note-heads.ly b/Documentation/snippets/new/numbers-as-easy-note-heads.ly deleted file mode 100644 index 4b3f02ec8d..0000000000 --- a/Documentation/snippets/new/numbers-as-easy-note-heads.ly +++ /dev/null @@ -1,54 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "pitches" - texidoc = " -Easy notation note heads use the @code{note-names} property -of the @code{NoteHead} object to determine what appears inside -the note head. By overriding this property, it is possible -to print numbers representing the scale-degree. - -A simple engraver can be created to do this for every note head -object it sees. -" - doctitle = "Numbers as easy note heads" -} - -#(define Ez_numbers_engraver - (make-engraver - (acknowledgers - ((note-head-interface engraver grob source-engraver) - (let* ((context (ly:translator-context engraver)) - (tonic-pitch (ly:context-property context 'tonic)) - (tonic-name (ly:pitch-notename tonic-pitch)) - (grob-pitch - (ly:event-property (event-cause grob) 'pitch)) - (grob-name (ly:pitch-notename grob-pitch)) - (delta (modulo (- grob-name tonic-name) 7)) - (note-names - (make-vector 7 (number->string (1+ delta))))) - (ly:grob-set-property! grob 'note-names note-names)))))) - -#(set-global-staff-size 26) - -\layout { - ragged-right = ##t - \context { - \Voice - \consists \Ez_numbers_engraver - } -} - -\relative c' { - \easyHeadsOn - c4 d e f - g4 a b c \break - - \key a \major - a,4 b cis d - e4 fis gis a \break - - \key d \dorian - d,4 e f g - a4 b c d -} diff --git a/Documentation/snippets/new/pitches-headword.ly b/Documentation/snippets/new/pitches-headword.ly deleted file mode 100644 index 70246ce579..0000000000 --- a/Documentation/snippets/new/pitches-headword.ly +++ /dev/null @@ -1,137 +0,0 @@ -\version "2.17.27" - -\header { - lsrtags = "headword" - - texidoc = " -Piches headword - -" - doctitle = "Pitches headword" -} -% L. v. Beethoven -% Piano sonata 21 - Dem Grafen von Waldstein Gewidmet -% chorale at measures 34 - 40+ - -\include "english.ly" - -\new PianoStaff << - - % RH Staff - \new Staff << - - % RH Voice 1 - \new Voice { - \set Score.currentBarNumber = #34 - \voiceOne - gs''2 ( ^ \markup \italic { dolce e molto ligato } - fs''4 - e''4 - | - ds''2 - cs''2 ) - | - ds''2 ( - e''4 - fs''4 - | - 2 - 2 ) - | - \oneVoice - \clef bass - 2 ( - 4 - 4 - | - 2 - 2 ) - | - \voiceOne - b2 %( - cs'4 - ds'4 - | - \clef treble - 4 %) - r4 r2 - } - - % RH Voice 2 - \new Voice { - \voiceTwo - \override Staff.DynamicLineSpanner.staff-padding = #3 - 2 \p - 4 - 4 - | - 2 - e'2 - | - 2 -\tweak #'style #'none \cresc - b'4 - 4 - | - b'2. ( \sf \> - a'4 ) - \clef bass - | \break - s1 \p - | - s1 - | - 4 ( - 2. ) - | - s4 - r4 r2 - } - - >> - - % LH Staff - \new Staff { - \override Staff.SustainPedalLineSpanner.staff-padding = #6 - 2 ( \sustainOn - 4 \sustainOff - 4 - | - 2 - 2 ) \sustainOn - | - \clef bass - \slurDown - 2 ( \sustainOff - 4 - 4 \sustainOn - | - \clef treble - \voiceOne - << - { - 2 - 2 ) - } - \new Voice { - \voiceTwo - b1 \sustainOff - } - >> - \oneVoice - | - %\break - \clef bass - 2 ( - 4 - 4 - | - 2 - 2 ) \sustainOn - | - 1 ( \sustainOff - | - 4 ) - r4 r2 - } - ->> diff --git a/Documentation/snippets/new/positioning-multi-measure-rests.ly b/Documentation/snippets/new/positioning-multi-measure-rests.ly index e908ef14cd..0a533aba26 100644 --- a/Documentation/snippets/new/positioning-multi-measure-rests.ly +++ b/Documentation/snippets/new/positioning-multi-measure-rests.ly @@ -1,4 +1,5 @@ -\version "2.17.18" + +\version "2.19.20" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -48,7 +49,7 @@ follows: % Using compressed bars in multiple voices requires another override % in all voices to avoid multiple instances being printed - \compressFullBarRests + \compressMMRests << \revert MultiMeasureRest.direction { R1*3 } diff --git a/Documentation/snippets/new/printing-a-repeat-sign-at-the-beginning-of-a-piece.ly b/Documentation/snippets/new/printing-a-repeat-sign-at-the-beginning-of-a-piece.ly deleted file mode 100644 index 1bdd351b99..0000000000 --- a/Documentation/snippets/new/printing-a-repeat-sign-at-the-beginning-of-a-piece.ly +++ /dev/null @@ -1,36 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "repeats, tweaks-and-overrides" - - texidoc = " -A @code{.|:} bar line can be printed at the beginning of a piece, by -overriding the relevant property: - -" - doctitle = "Printing a repeat sign at the beginning of a piece" -} - - -\relative c'' { - \once \override Score.BreakAlignment.break-align-orders = - #(make-vector 3 '(instrument-name - left-edge - ambitus - breathing-sign - clef - key-signature - time-signature - staff-bar - custos)) - \once \override Staff.TimeSignature.space-alist = - #'((first-note . (fixed-space . 2.0)) - (right-edge . (extra-space . 0.5)) - ;; free up some space between time signature - ;; and repeat bar line - (staff-bar . (extra-space . 1))) - \bar ".|:" - c1 - d1 - d4 e f g -} diff --git a/Documentation/snippets/new/printing-hairpins-in-various-styles.ly b/Documentation/snippets/new/printing-hairpins-in-various-styles.ly deleted file mode 100644 index b6a18ecc7d..0000000000 --- a/Documentation/snippets/new/printing-hairpins-in-various-styles.ly +++ /dev/null @@ -1,30 +0,0 @@ -\version "2.17.14" - -\header { - lsrtags = "expressive-marks" - - texidoc = " -Hairpin dynamics may be created in a variety of styles - -" - doctitle = "Printing hairpins in various styles" -} - -\relative c'' { - \override Hairpin.stencil = #flared-hairpin - a4\< a a a\f - a4\p\< a a a\ff - a4\sfz\< a a a\! - \override Hairpin.stencil = #constante-hairpin - a4\< a a a\f - a4\p\< a a a\ff - a4\sfz\< a a a\! - \override Hairpin.stencil = #flared-hairpin - a4\> a a a\f - a4\p\> a a a\ff - a4\sfz\> a a a\! - \override Hairpin.stencil = #constante-hairpin - a4\> a a a\f - a4\p\> a a a\ff - a4\sfz\> a a a\! -} diff --git a/Documentation/snippets/new/quoting-another-voice-with-transposition.ly b/Documentation/snippets/new/quoting-another-voice-with-transposition.ly deleted file mode 100644 index a0153d62a2..0000000000 --- a/Documentation/snippets/new/quoting-another-voice-with-transposition.ly +++ /dev/null @@ -1,42 +0,0 @@ -\version "2.17.13" - -\header { - lsrtags = "pitches, staff-notation" - - texidoc = " -Quotations take into account the transposition of both source and -target. In this example, all instruments play sounding middle C; the -target is an instrument in F. The target part may be transposed using -@code{\\transpose}. In this case, the quoted pitches will stay -unchanged. -" - doctitle = "Quoting another voice with transposition" -} - -\addQuote clarinet { - \transposition bes - \repeat unfold 8 { d'16 d' d'8 } -} - -\addQuote sax { - \transposition es' - \repeat unfold 16 { a8 } -} - -quoteTest = { - % french horn - \transposition f - g'4 - << \quoteDuring #"clarinet" { \skip 4 } s4^"clar." >> - << \quoteDuring #"sax" { \skip 4 } s4^"sax." >> - g'4 -} - -{ - \set Staff.instrumentName = - \markup { - \center-column { Horn \line { in F } } - } - \quoteTest - \transpose c' d' << \quoteTest s4_"up a tone" >> -} diff --git a/Documentation/snippets/new/redefining-grace-note-global-defaults.ly b/Documentation/snippets/new/redefining-grace-note-global-defaults.ly deleted file mode 100644 index b4cd68c38c..0000000000 --- a/Documentation/snippets/new/redefining-grace-note-global-defaults.ly +++ /dev/null @@ -1,33 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "rhythms" - - texidoc = " -The global defaults for grace notes are stored in the identifiers -@code{startGraceMusic}, @code{stopGraceMusic}, -@code{startAcciaccaturaMusic}, @code{stopAcciaccaturaMusic}, -@code{startAppoggiaturaMusic} and @code{stopAppoggiaturaMusic}, which -are defined in the file @code{ly/grace-init.ly}. By redefining them -other effects may be obtained. - -" - doctitle = "Redefining grace note global defaults" -} - -startAcciaccaturaMusic = { - <>( - \override Flag.stroke-style = #"grace" - \slurDashed -} - -stopAcciaccaturaMusic = { - \revert Flag.stroke-style - \slurSolid - <>) -} - -\relative c'' { - \acciaccatura d8 c1 -} - diff --git a/Documentation/snippets/new/replacing-default-midi-instrument-equalization.ly b/Documentation/snippets/new/replacing-default-midi-instrument-equalization.ly new file mode 100644 index 0000000000..dbe4e948a1 --- /dev/null +++ b/Documentation/snippets/new/replacing-default-midi-instrument-equalization.ly @@ -0,0 +1,59 @@ +\version "2.19.21" + +\header { + + lsrtags = "scheme-language, midi" + + texidoc = "The default MIDI instrument equalizer can be replaced by + setting the @code{instrumentEqualizer} property in the @code{Score} + context to a user-defined Scheme procedure that uses a MIDI instrument + name as its argument along with a pair of fractions indicating the + minimum and maximum volumes respectively to be applied to that + specific instrument. + + The following example sets the minimum and maximum volumes for flute + and clarinet respectively." + + doctitle = "Replacing default MIDI instrument equalization" +} + +#(define my-instrument-equalizer-alist '()) + +#(set! my-instrument-equalizer-alist + (append + '( + ("flute" . (0.7 . 0.9)) + ("clarinet" . (0.3 . 0.6))) + my-instrument-equalizer-alist)) + +#(define (my-instrument-equalizer s) + (let ((entry (assoc s my-instrument-equalizer-alist))) + (if entry + (cdr entry)))) + +\score { + << + \new Staff { + \key g \major + \time 2/2 + \set Score.instrumentEqualizer = #my-instrument-equalizer + \set Staff.midiInstrument = #"flute" + \new Voice \relative { + r2 g''\mp g fis~ + 4 g8 fis e2~ + 4 d8 cis d2 + } + } + \new Staff { + \key g \major + \set Staff.midiInstrument = #"clarinet" + \new Voice \relative { + b'1\p a2. b8 a + g2. fis8 e + fis2 r + } + } + >> + \layout { } + \midi { } +} diff --git a/Documentation/snippets/new/rest-styles.ly b/Documentation/snippets/new/rest-styles.ly new file mode 100644 index 0000000000..e5ba472bd4 --- /dev/null +++ b/Documentation/snippets/new/rest-styles.ly @@ -0,0 +1,43 @@ +\version "2.19.16" + +\header { + lsrtags = "ancient-notation, rhythms, symbols-and-glyphs, tweaks-and-overrides" + + texidoc = " +Rests may be used in various styles. +" + doctitle = "Rest styles" +} + +\new Staff \relative c { + \omit Score.TimeSignature + \cadenzaOn + + \override Staff.Rest.style = #'mensural + r\maxima^\markup \typewriter { mensural } + r\longa r\breve r1 r2 r4 r8 r16 s32 s64 s128 s128 + \bar "" + \break + + \override Staff.Rest.style = #'neomensural + r\maxima^\markup \typewriter { neomensural } + r\longa r\breve r1 r2 r4 r8 r16 s32 s64 s128 s128 + \bar "" + \break + + \override Staff.Rest.style = #'classical + r\maxima^\markup \typewriter { classical } + r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128 + \bar "" + \break + + \override Staff.Rest.style = #'z + r\maxima^\markup \typewriter { z-style } + r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128 + \bar "" + \break + + \override Staff.Rest.style = #'default + r\maxima^\markup \typewriter { default } + r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128 +} diff --git a/Documentation/snippets/new/score-for-diatonic-accordion.ly b/Documentation/snippets/new/score-for-diatonic-accordion.ly deleted file mode 100644 index bca93b5c6a..0000000000 --- a/Documentation/snippets/new/score-for-diatonic-accordion.ly +++ /dev/null @@ -1,240 +0,0 @@ -\version "2.17.30" - -\header { - lsrtags = "template, real-music, specific-notation" - - texidoc = " -A template to write a score for a diatonic accordion. - -- There is a horizontal staff indicating if the accordion must be -pushed (thick line) or pulled (thin line) - -- There is a small rhythmic staff with lyrics that describes the bass -buttons to press. The bar lines are made from gridlines - -- The tabulator staff for diatonic accordions shows the geographic -position of the buttons and not (as for every other instrument) the -pitch of the notes; the keys on the melody-side of the accordion are -placed in three columns and about 12 rows - - -In the tabulator staff notation the outermost column is described with -notes between lines, the innermost column is described with notes -between lines and a cross as accidental, and the middle column is -described with notes on a line, whereby the row in the middle is -represented on the middle line in the staff. - - -Some words to transpose piano notes to the diatonic accordion: - - -1. Every diatonic accordion is built for some keys only (for example, -for the keys of C major and F major), so it is important to transpose a -piano melody to match one of these keys. Transpose the source code, not -only the output because this code is required later on to translate it -once more to the tabulator staff. This can be done with the command -@code{displayLilyMusic}. - - -2. You have to alternate the push- and pull-direction of the accordion -regularly. If the player has a too long part to pull the accordion gets -broken. On the other hand, some harmonies are only available in one -direction. Considering this, decide which parts of the melody are the -push-parts and which the pull-parts. - - -3. For each pull- or push-part translate the piano notes to the -according tabulature representation. - - -This snippet comes with a useful optional macro for the jEdit text -editor. - -" - doctitle = "Score for diatonic accordion" -} - -verse = \lyricmode { Wie gross bist du! Wie gross bist du! } - -harmonies = \new ChordNames \chordmode { - \germanChords - \set chordChanges = ##t - bes8 bes8 bes8 - es2 f - bes1 -} - -NoStem = { \hide Stem } -NoNoteHead = \hide NoteHead -ZeroBeam = \override Beam.positions = #'(0 . 0) - -staffTabLine = \new Staff \with { - \remove "Time_signature_engraver" - \remove "Clef_engraver" -} { - \override Staff.StaffSymbol.line-positions = #'(0) - % Shows one horizontal line. The vertical line (simulating a bar-line) is simulated with a gridline - \set Staff.midiInstrument = #"choir aahs" - \key c \major - \relative c'' - { - % disable the following line to see the the noteheads while writing the song - \NoNoteHead - \override NoteHead.no-ledgers = ##t - - % The beam between 8th-notes is used to draw the push-line - %How to fast write the push-lines: - % 1. write repeatedly 'c c c c c c c c |' for the whole length of the song - % 2. uncomment the line \NoNoteHead - % 3. compile - % 4. Mark the positions on which push/pull changes. - % In the score-picture click on the position the push- or pull-part starts - % (on the noteHead, the cursor will change to a hand-icon). - % The cursor in the source code will jump just at this position. - % a) If a push-part starts there, replace the 'c' by an 'e[' - % b) If a pull-part starts there, replace the 'c' by an 's' - % 5. Switch into 'overwrite-mode' by pressing the 'ins' key. - % 6. For the pull-parts overwrite the 'c' with 's' - % 7. For every push-part replace the last 'c' with 'e]' - % 8. Switch into 'insert-mode' again - % 9. At last it should look lik e.g. (s s e[ c | c c c c c c c c | c c c c c c e] s s) - % 10. re-enable the line \NoNoteHead - \autoBeamOff - \ZeroBeam - s8 s s e[ c c c c c c e] | s s s s s - } -} - -%{ -%} - -% Accordion melody in tabulator score -% 1. Place a copy of the piano melody below -% 2. Separate piano melody into pull- and push-parts according to the staffTabLine you've already made -% 3. For each line: Double the line. Remark the 1st one (Keeps unchanged as reference) and then change the second line using the transformation paper -% or the macros 'conv2diaton push.bsh' and 'conv2diaton pull.bsh' -% Tips: -% - In jEdit Search & Replace mark the Option 'Keep Dialog' - -AccordionTabTwoCBesDur = { - % pull 1 - %8 8 8 | - 8 8 8 | - % push 2 - %4 | - 4 | - % pull 3 - % 2 r8 } - 2 r8 } - -AccordionTab= { \dynamicUp - % 1. Place a copy of the piano melody above - % 2. Separate piano melody into pull- and push-parts according to the staffTabLine you've already made - % 3. For each line: Double the line. Remark the 1st one (Keeps unchanged as reference) and then - % change the second line using the transformation paper - % Tips: - % - In jEdit Search & Replace mark the Option 'Keep Dialog' - % - - \AccordionTabTwoCBesDur -} - - - -\layout { - \context { - \Score - % The vertical line (simulating a bar-line) in - % the staffBassRhytm is a gridline - \consists "Grid_line_span_engraver" - } - \context { - \Staff - \consists "Grid_point_engraver" - gridInterval = #(ly:make-moment 4/4) % 4/4 - tact. How many beats per bar - % The following line has to be adjusted O-F-T-E-N. - \override GridPoint.Y-extent = #'(-2 . -21) - } - \context { - \ChoirStaff - \remove "System_start_delimiter_engraver" - } -} - -staffVoice = \new Staff = astaffvoice { - \time 4/4 - \set Staff.instrumentName = "Voice" - \set Staff.midiInstrument = "voice oohs" - \key bes \major - \partial 8*3 - \clef treble - { - \context Voice = "melodyVoi" - { 8 8 8 | 4 | 2 r8 } - \bar "|." - } -} - -staffAccordionMel = -\new Staff \with { \remove "Clef_engraver" } { - \accidentalStyle forget %Set the accidentals (Vorzeichen) for each note, - %do not remember them for the rest of the measure. - \time 4/4 - \set Staff.instrumentName="Accordion" - \set Staff.midiInstrument="voice oohs" - \key c \major - \clef treble - { \AccordionTab \bar "|." } -} - -AltOn = -#(define-music-function (parser location mag) (number?) - #{ \override Stem.length = #(* 7.0 mag) - \override NoteHead.font-size = -#(inexact->exact (* (/ 6.0 (log 2.0)) (log mag))) #}) - -AltOff = { - \revert Stem.length - \revert NoteHead.font-size -} - -BassRhytm = {s4 s8 | c2 c2 | c2 s8 } -LyricBassRhythmI= \lyricmode { c b | c } - -staffBassRhytm = -\new Staff = staffbass \with { \remove "Clef_engraver" } { - % This is not a RhythmicStaff because it must be possible to append lyrics. - - \override Score.GridLine.extra-offset = #'( 13.0 . 0.0 ) % x.y - \override Staff.StaffSymbol.line-positions = #'( 0 ) - % Shows one horizontal line. The vertical line (simulating a bar-line) is simulated by a grid - % Search for 'grid' in this page to find all related functions - \time 4/4 - { - \context Voice = "VoiceBassRhytm" - \stemDown \AltOn #0.6 - \relative c'' - { - \BassRhytm - } - \AltOff - \bar "|." - } -} - -\score { - \new ChoirStaff << - \harmonies - \staffVoice - \context Lyrics = "lmelodyVoi" - \with { alignBelowContext = astaffvoice } - \lyricsto melodyVoi \verse - \staffAccordionMel - \staffTabLine - \staffBassRhytm - \context Lyrics = "lBassRhytmAboveI" - \with { alignAboveContext = staffbass } - \lyricsto VoiceBassRhytm \LyricBassRhythmI - >> -} -%} - diff --git a/Documentation/snippets/new/single-staff-template-with-notes-and-chords.ly b/Documentation/snippets/new/single-staff-template-with-notes-and-chords.ly new file mode 100644 index 0000000000..598f0b94ae --- /dev/null +++ b/Documentation/snippets/new/single-staff-template-with-notes-and-chords.ly @@ -0,0 +1,37 @@ +\version "2.19.28" + +\header { + lsrtags = "chords, really-simple, template" + + texidoc = " +Want to prepare a lead sheet with a melody and chords? Look no further! + + +" + doctitle = "Single staff template with notes and chords" +} +melody = \relative c' { + \clef treble + \key c \major + \time 4/4 + + f4 e8[ c] d4 g + a2 ~ a +} + +harmonies = \chordmode { + c4:m f:min7 g:maj c:aug + d2:dim b4:5 e:sus +} + +\score { + << + \new ChordNames { + \set chordChanges = ##t + \harmonies + } + \new Staff \melody + >> + \layout{ } + \midi { } +} diff --git a/Documentation/snippets/new/staff-headword.ly b/Documentation/snippets/new/staff-headword.ly index 67bc0f6286..4c7aff1f02 100644 --- a/Documentation/snippets/new/staff-headword.ly +++ b/Documentation/snippets/new/staff-headword.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.0" \include "catalan.ly" \header { @@ -35,22 +35,13 @@ trompette = \relative do'' { do8-. r8 sib4-> | } -tambourin = \relative do' { +tambourin = \drummode { \time 2/4 - r8 do16 do do8 do | - r8 do16 do do8 do | - r8 do r do | - r8 do16 do do8 do | - r8 do r do | -} - -tambourinMidi = \drummode { - \time 2/4 - r8 tamb16 tamb tamb8 tamb | - r8 tamb16 tamb tamb8 tamb | - r8 tamb r tamb | - r8 tamb16 tamb tamb8 tamb | - r8 tamb r tamb | + r8 tamb16 16 8 8 | + r8 16 16 8 8 | + r8 8 r8 8 | + r8 16 16 8 8 | + r8 8 r8 8 | } upper = \relative do' { @@ -102,7 +93,7 @@ lower = \relative do { \trompette } \context DrumStaff = "tambourin" { - \tambourinMidi + \tambourin } \context Staff = "piano" << \upper @@ -113,4 +104,3 @@ lower = \relative do { \tempo 4 = 72 } } - diff --git a/Documentation/snippets/new/strict-beat-beaming.ly b/Documentation/snippets/new/strict-beat-beaming.ly deleted file mode 100644 index e61446912a..0000000000 --- a/Documentation/snippets/new/strict-beat-beaming.ly +++ /dev/null @@ -1,21 +0,0 @@ -\version "2.16.0" - -\header { - texidoc = " -Beamlets can be set to point in the direction of the beat to which they -belong. The first beam avoids sticking out flags (the default); -the second beam strictly follows the beat. -" - - doctitle = "Strict beat beaming" - - lsrtags = "rhythms" -} - - -\relative c'' { - \time 6/8 - a8. a16 a a - \set strictBeatBeaming = ##t - a8. a16 a a -} diff --git a/Documentation/snippets/new/string-number-extender-lines.ly b/Documentation/snippets/new/string-number-extender-lines.ly deleted file mode 100644 index 90ea3fc2f1..0000000000 --- a/Documentation/snippets/new/string-number-extender-lines.ly +++ /dev/null @@ -1,34 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "editorial-annotations, text, fretted-strings, tweaks-and-overrides, scheme-language" - - texidoc = " -Make an extender line for string number indications, showing that a -series of notes is supposed to be played all on the same string. - -" - doctitle = "String number extender lines" -} - -stringNumberSpanner = -#(define-music-function (parser location StringNumber) (string?) - #{ - \override TextSpanner.style = #'solid - \override TextSpanner.font-size = #-5 - \override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER - \override TextSpanner.bound-details.left.text = \markup { \circle \number #StringNumber } - #}) - - -\relative c { - \clef "treble_8" - \stringNumberSpanner "5" - \textSpannerDown - a8\startTextSpan - b c d e f\stopTextSpan - \stringNumberSpanner "4" - g\startTextSpan a - bes4 a g2\stopTextSpan -} - diff --git a/Documentation/snippets/new/subdividing-beams.ly b/Documentation/snippets/new/subdividing-beams.ly new file mode 100644 index 0000000000..bd19413306 --- /dev/null +++ b/Documentation/snippets/new/subdividing-beams.ly @@ -0,0 +1,54 @@ +\version "2.19.40" + +\header { + lsrtags = "rhythms" + + texidoc = " +The beams of consecutive 16th (or shorter) notes are, by default, not +subdivided. That is, the three (or more) beams stretch unbroken over +entire groups of notes. This behavior can be modified to subdivide the +beams into sub-groups by setting the property @code{subdivideBeams}. +When set, multiple beams will be subdivided at intervals defined by the +current value of @code{baseMoment} by reducing the multiple beams to +the number of beams that indicates the metric value of the subdivision. +If the group following the division is shorter than the current metric +value (usually because the beam is incomplete) the number of beams +reflects the longest possible subdivision group. However, if there is +only one note left after the division this restriction isn't applied. +Note that @code{baseMoment} defaults to one over the denominator of the +current time signature if not set explicitly. It must be set to a +fraction giving the duration of the beam sub-group using the +@code{ly:make-moment} function, as shown in this snippet. Also, when +@code{baseMoment} is changed, @code{beatStructure} should also be +changed to match the new @code{baseMoment}: + +" + doctitle = "Subdividing beams" +} + +\relative c'' { + c32[ c c c c c c c] + \set subdivideBeams = ##t + c32[ c c c c c c c] + + % Set beam sub-group length to an eighth note + \set baseMoment = #(ly:make-moment 1/8) + \set beatStructure = 2,2,2,2 + c32[ c c c c c c c] + + % Set beam sub-group length to a sixteenth note + \set baseMoment = #(ly:make-moment 1/16) + \set beatStructure = 4,4,4,4 + c32[ c c c c c c c] + + % Shorten beam by 1/32 + \set baseMoment = #(ly:make-moment 1/8) + \set beatStructure = 2,2,2,2 + c32[ c c c c c c] r32 + + % Shorten beam by 3/32 + \set baseMoment = #(ly:make-moment 1/8) + \set beatStructure = 2,2,2,2 + c32[ c c c c] r16. + r2 +} diff --git a/Documentation/snippets/new/unfretted-headword.ly b/Documentation/snippets/new/unfretted-headword.ly index 5c3f8a05dc..19de559c12 100644 --- a/Documentation/snippets/new/unfretted-headword.ly +++ b/Documentation/snippets/new/unfretted-headword.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.2" \header { lsrtags = "headword" @@ -116,10 +116,10 @@ ViolinSolo = \relative c' { \voiceOne - \set Score.markFormatter = #format-mark-box-numbers - \override Score.VoltaBracket.font-name = #"sans" - \override Score.VoltaBracket.extra-offset = #'(0 . 1) - \override SpacingSpanner.uniform-stretching = ##t + \set Score.markFormatter = #format-mark-box-numbers + \override Score.VoltaBracket.font-name = #"LilyPond Sans Serif" + \override Score.VoltaBracket.extra-offset = #'(0 . 1) + \override SpacingSpanner.uniform-stretching = ##t %% Measure 1 @@ -146,7 +146,7 @@ ViolinSolo = \relative c' { \time 15/4 << { \shift d2 \glissando ^\markup \colmark { \quatre \dubetc \pvib \norm } \shifta e1 \glissando d2 } \\ - { d2 \open \mf \< ~ d1 ~ d2 \ff ~ d1 \> ~ d2 ^\markup \colmark { " " " " \svib } ~ d4 \pp} + { d2 \open \mf \< ~ d1 ~ 2 \ff ~ d1 \> ~ d2 ^\markup \colmark { " " " " \svib } ~ d4 \pp} >> \break diff --git a/Documentation/snippets/new/user-defined-time-signatures.ly b/Documentation/snippets/new/user-defined-time-signatures.ly new file mode 100644 index 0000000000..0494666880 --- /dev/null +++ b/Documentation/snippets/new/user-defined-time-signatures.ly @@ -0,0 +1,27 @@ +\version "2.19.16" + +\header { + lsrtags = "rhythms" + + texidoc = " +New time signature styles can be defined. The time signature in +the second measure should be upside down in both staves. +" + + doctitle = "User defined time signatures" +} + +#(add-simple-time-signature-style 'topsy-turvy + (lambda (fraction) + (make-rotate-markup 180 (make-compound-meter-markup fraction)))) + +<< + \new Staff { + \time 3/4 f'2. + \override Score.TimeSignature.style = #'topsy-turvy + \time 3/4 R2. \bar "|." + } + \new Staff { + R2. e'' + } +>> diff --git a/Documentation/snippets/new/using-a-tick-as-the-breath-mark-symbol.ly b/Documentation/snippets/new/using-a-tick-as-the-breath-mark-symbol.ly deleted file mode 100644 index ad440c3c96..0000000000 --- a/Documentation/snippets/new/using-a-tick-as-the-breath-mark-symbol.ly +++ /dev/null @@ -1,25 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "expressive-marks" - - texidoc = " -Vocal and wind music frequently uses a tick mark as a breathing sign. This -indicates a breath that subtracts a little time from the previous note rather -than causing a short pause, which is indicated by the comma breath mark. The -mark can be moved up a little to take it away from the stave. -" - doctitle = "Using a tick as the breath mark symbol" -} - -\relative c'' { - c2 - \breathe - d2 - \override BreathingSign.Y-offset = #2.6 - \override BreathingSign.text = - \markup { \musicglyph #"scripts.tickmark" } - c2 - \breathe - d2 -} diff --git a/Documentation/snippets/new/using-alternative-flag-styles.ly b/Documentation/snippets/new/using-alternative-flag-styles.ly deleted file mode 100644 index 5932ba2565..0000000000 --- a/Documentation/snippets/new/using-alternative-flag-styles.ly +++ /dev/null @@ -1,33 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "rhythms, tweaks-and-overrides" - - texidoc = " -Alternative styles of flag on eighth and shorter notes can be displayed -by overriding the @code{stencil} property of @code{Flag}. Valid values -are @code{modern-straight-flag} and @code{old-straight-flag}. - -" - doctitle = "Using alternative flag styles" -} - -testnotes = { - \autoBeamOff - c8 d16 c32 d64 \acciaccatura { c8 } d64 r4 -} - -\relative c' { - \time 2/4 - \testnotes - - \override Flag.stencil = #modern-straight-flag - \testnotes - - \override Flag.stencil = #old-straight-flag - \testnotes - - \revert Flag.stencil - \testnotes -} - diff --git a/Documentation/snippets/new/using-grace-note-slashes-with-normal-heads.ly b/Documentation/snippets/new/using-grace-note-slashes-with-normal-heads.ly deleted file mode 100644 index 0a53f3d980..0000000000 --- a/Documentation/snippets/new/using-grace-note-slashes-with-normal-heads.ly +++ /dev/null @@ -1,18 +0,0 @@ -\version "2.17.6" - -\header { - lsrtags = "rhythms" - - texidoc = " -The slash through the stem found in acciaccaturas can be applied in -other situations. - -" - doctitle = "Using grace note slashes with normal heads" -} - -\relative c'' { - \override Flag.stroke-style = #"grace" - c8( d2) e8( f4) -} - diff --git a/Documentation/snippets/new/using-the-whiteout-property.ly b/Documentation/snippets/new/using-the-whiteout-property.ly new file mode 100644 index 0000000000..07c2b7288b --- /dev/null +++ b/Documentation/snippets/new/using-the-whiteout-property.ly @@ -0,0 +1,33 @@ +\version "2.19.32" + +\header { + lsrtags = "editorial-annotations, expressive-marks" + + texidoc = " +Any graphical object can be printed over a white background to mask +parts of objects that lie beneath. This can be useful to improve the +appearance of collisions in complex situations when repositioning +objects is impractical. It is necessary to explicitly set the +@code{layer} property to control which objects are masked by the white +background. + +In this example the collision of the tie with the time signature is +improved by masking out the part of the tie that crosses the time +signature by setting the @code{whiteout} property of +@code{TimeSignature}. To do this @code{TimeSignature} is moved to a +layer above @code{Tie}, which is left in the default layer of 1, and +@code{StaffSymbol} is moved to a layer above @code{TimeSignature} so it +is not masked. + +" + doctitle = "Using the whiteout property" +} + +{ + \override Score.StaffSymbol.layer = #4 + \override Staff.TimeSignature.layer = #3 + b'2 b'~ + \once \override Staff.TimeSignature.whiteout = ##t + \time 3/4 + b' r4 +} diff --git a/Documentation/snippets/new/utf-8.ly b/Documentation/snippets/new/utf-8.ly new file mode 100644 index 0000000000..7dcb13ed67 --- /dev/null +++ b/Documentation/snippets/new/utf-8.ly @@ -0,0 +1,78 @@ +\version "2.19.12" + +\header { + lsrtags = "text" + + texidoc = " +Various scripts may be used for texts (like titles and lyrics) by +entering them in UTF-8 encoding, and using a Pango based backend. +Depending on the fonts installed, this fragment will render Bulgarian +(Cyrillic), Hebrew, Japanese and Portuguese. + +" + doctitle = "UTF-8" +} % begin verbatim + +% end verbatim - this comment is a hack to prevent texinfo.tex +% from choking on non-European UTF-8 subsets + +%% Edit this file using a Unicode aware editor, such as GVIM, GEDIT, Emacs + +%{ + +You may have to install additional fonts. + +Red Hat Fedora + + linux-libertine-fonts (Latin, Cyrillic, Hebrew) + ipa-mincho-fonts ipa-gothic-fonts (Japanese) + +Debian GNU/Linux, Ubuntu + + fonts-linuxlibertine (Latin, Cyrillic, Hebrew) + fonts-ipafont (Japanese) + +%} + +% Font settings for Cyrillic and Hebrew +% Linux Libertine fonts contain Cyrillic and Hebrew glyphs. +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + #:sans "Linux Biolinum O,sans-serif" + #:typewriter "Linux Libertine Mono O,monospace" + )) +} + +% Cyrillic font +bulgarian = \lyricmode { + Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон. +} + +hebrew = \lyricmode { + זה כיף סתם לשמוע איך תנצח קרפד עץ טוב בגן. +} + +japanese = \lyricmode { + いろはにほへど ちりぬるを + わがよたれぞ つねならむ + うゐのおくや まけふこえて + あさきゆめみじ ゑひもせず +} + +% "a legal song to you" +portuguese = \lyricmode { + à vo -- cê uma can -- ção legal +} + +\relative c' { + c2 d + e2 f + g2 f + e1 +} +\addlyrics { \bulgarian } +\addlyrics { \hebrew } +\addlyrics { \japanese } +\addlyrics { \portuguese } diff --git a/Documentation/snippets/new/vertically-aligned-dynamics-and-textscripts.ly b/Documentation/snippets/new/vertically-aligned-dynamics-and-textscripts.ly deleted file mode 100644 index 909f09e62d..0000000000 --- a/Documentation/snippets/new/vertically-aligned-dynamics-and-textscripts.ly +++ /dev/null @@ -1,34 +0,0 @@ -\version "2.17.27" - -\header { - lsrtags = "spacing, tweaks-and-overrides, workaround" - - texidoc = " -All @code{DynamicLineSpanner} objects (hairpins and dynamic texts) are -placed with their reference line at least @code{'staff-padding} from -the staff, unless other notation forces them to be farther. -Setting @code{'staff-padding} to a sufficiently large value aligns the -dynamics. - -The same idea, together with @code{\\textLengthOn}, is used to align -the text scripts along their baseline. - -" - doctitle = "Vertically aligned dynamics and textscripts" -} -\markup \vspace #1 %avoid LSR-bug - -music = \relative c' { - a'2\p b\f - e4\p f\f\> g, b\p - c2^\markup { \huge gorgeous } c^\markup { \huge fantastic } -} - -{ - \music - \break - \override DynamicLineSpanner.staff-padding = #3 - \textLengthOn - \override TextScript.staff-padding = #1 - \music -} diff --git a/Documentation/snippets/new/wind-headword.ly b/Documentation/snippets/new/wind-headword.ly new file mode 100644 index 0000000000..eae9e1df18 --- /dev/null +++ b/Documentation/snippets/new/wind-headword.ly @@ -0,0 +1,49 @@ + +\version "2.19.20" + +\header { + lsrtags = "headword" + + texidoc = " +Wind headword + +" + doctitle = "Wind headword" +} + +%% http://lsr.di.unimi.it/LSR/Item?id=833 +%% see also http://lilypond.org/doc/v2.18/Documentation/notation/wind-instruments + +% NR 2.whatever Wind +% Tchaikovsky +% Nutcracker Suite, VII Dance of the Merlitons +\score { + \new StaffGroup << + \new Staff \relative c'' { + \set Staff.instrumentName = "Flauto I,II" + \once \override Score.RehearsalMark.self-alignment-X = #-1 + \once \override Score.RehearsalMark.break-align-symbols = #'(time-signature) + \once \override Score.TimeSignature.break-align-anchor-alignment = #LEFT + \once \override Score.RehearsalMark.padding = #4 + \mark \markup \large \bold {Moderato assai} + \key d \major + \time 2/4 + \compressMMRests R2*2 + 16-.\p -. -. -. 8-. -. + -.\< 32( 4--)\mf + 16-. -. -. -. + (\> ) -. -.\! + 4--\sf \acciaccatura {8} 4--\mf + } + \new Staff \relative c' { + \set Staff.instrumentName = "Flauto III" + \key d \major + \time 2/4 + \compressMMRests R2*2_\markup{Gr.Fl.} + fis16-.\p e-. fis-. e-. fis8-. e-. + g8-.\< fis32( a d fis a4--)\mf + b16-. a-. b-. a-. g(\> fis) d-. a-.\! + g4--\sf \acciaccatura fis'8 g4--\mf + } + >> +} diff --git a/Documentation/snippets/new/woodwind-diagrams-key-lists.ly b/Documentation/snippets/new/woodwind-diagrams-key-lists.ly deleted file mode 100644 index b9eaaa8895..0000000000 --- a/Documentation/snippets/new/woodwind-diagrams-key-lists.ly +++ /dev/null @@ -1,30 +0,0 @@ -\version "2.16.0" - -\header { - lsrtags = "winds" - - texidoc=" -The snippet below produces a list of all possible keys and key -settings for woodwind diagrams as defined in -@file{scm/define-woodwind-diagrams.scm}. The list will be displayed -in the log file, but not in the music. If output to the console -is wanted, omit the @code{(current-error-port)} from the commands. -" - doctitle = "Woodwind diagrams key lists" -} - -#(print-keys-verbose 'piccolo (current-error-port)) -#(print-keys-verbose 'flute (current-error-port)) -#(print-keys-verbose 'flute-b-extension (current-error-port)) -#(print-keys-verbose 'tin-whistle (current-error-port)) -#(print-keys-verbose 'oboe (current-error-port)) -#(print-keys-verbose 'clarinet (current-error-port)) -#(print-keys-verbose 'bass-clarinet (current-error-port)) -#(print-keys-verbose 'low-bass-clarinet (current-error-port)) -#(print-keys-verbose 'saxophone (current-error-port)) -#(print-keys-verbose 'soprano-saxophone (current-error-port)) -#(print-keys-verbose 'alto-saxophone (current-error-port)) -#(print-keys-verbose 'tenor-saxophone (current-error-port)) -#(print-keys-verbose 'baritone-saxophone (current-error-port)) -#(print-keys-verbose 'bassoon (current-error-port)) -#(print-keys-verbose 'contrabassoon (current-error-port)) diff --git a/Documentation/snippets/non-default-tuplet-numbers.ly b/Documentation/snippets/non-default-tuplet-numbers.ly index 65030025a3..059e9241d0 100644 --- a/Documentation/snippets/non-default-tuplet-numbers.ly +++ b/Documentation/snippets/non-default-tuplet-numbers.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -29,7 +29,6 @@ to the tuplet number or tuplet fraction. #(tuplet-number::append-note-wrapper (tuplet-number::non-default-tuplet-fraction-text 12 7) "8") \tuplet 3/2 { c4. c4. c4. c4. } - \once \override TupletNumber.text = #(tuplet-number::append-note-wrapper tuplet-number::calc-denominator-text "4") @@ -38,7 +37,6 @@ to the tuplet number or tuplet fraction. #(tuplet-number::append-note-wrapper tuplet-number::calc-fraction-text "4") \tuplet 3/2 { c8 c8 c8 c8 c8 c8 } - \once \override TupletNumber.text = #(tuplet-number::fraction-with-notes "4." "8") \tuplet 3/2 { c4. c4. c4. c4. } diff --git a/Documentation/snippets/non-traditional-key-signatures.ly b/Documentation/snippets/non-traditional-key-signatures.ly index 188f72b3d6..dd06383aef 100644 --- a/Documentation/snippets/non-traditional-key-signatures.ly +++ b/Documentation/snippets/non-traditional-key-signatures.ly @@ -1,28 +1,28 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.16.0" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.21 +\version "2.19.21" \header { lsrtags = "contemporary-notation, pitches, really-cool, staff-notation, version-specific" texidoc = " -The commonly used @code{\\key} command sets the @code{keySignature} +The commonly used @code{\\key} command sets the @code{keyAlterations} property, in the @code{Staff} context. To create non-standard key signatures, set this property directly. The format of this command is a list: -@code{ \\set Staff.keySignature = #`(((octave . step) . alter) ((octave +@code{ \\set Staff.keyAlterations = #`(((octave . step) . alter) ((octave . step) . alter) ...) } where, for each element in the list, @code{octave} specifies the octave (0 being the octave from middle C to the B above), @code{step} specifies the note within the octave (0 means C and 6 means B), and @code{alter} is @code{,SHARP ,FLAT ,DOUBLE-SHARP} -etc. (Note the leading comma.) The accidentals in the key signature -will appear in the reverse order to that in which they are specified. +etc. (Note the leading comma.) Alternatively, for each item in the list, using the more concise format @@ -42,10 +42,11 @@ whole-tone scale: } % begin verbatim -\relative c' { - \set Staff.keySignature = #`(((0 . 6) . ,FLAT) - ((0 . 5) . ,FLAT) - ((0 . 3) . ,SHARP)) - c4 d e fis + +\relative { + \set Staff.keyAlterations = #`((6 . ,FLAT) + (5 . ,FLAT) + (3 . ,SHARP)) + c'4 d e fis aes4 bes c2 } diff --git a/Documentation/snippets/numbering-groups-of-measures.ly b/Documentation/snippets/numbering-groups-of-measures.ly index 7c082bed1b..17d731c7b6 100644 --- a/Documentation/snippets/numbering-groups-of-measures.ly +++ b/Documentation/snippets/numbering-groups-of-measures.ly @@ -1,35 +1,39 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.7 -\version "2.17.7" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, editorial-annotations, repeats, staff-notation" texidoc = " -This snippet demonstrates the use of the @code{Measure_counter_engraver} to -number groups of successive measures. Any stretch of measures may be numbered, -whether consisting of repetitions or not. +This snippet demonstrates the use of the +@code{Measure_counter_engraver} to number groups of successive +measures. Any stretch of measures may be numbered, whether consisting +of repetitions or not. + + +The engraver must be added to the appropriate context. Here, a +@code{Staff} context is used; another possibility is a @code{Dynamics} +context. -The engraver must be added to the appropriate context. Here, a @code{Staff} -context is used; another possibility is a @code{Dynamics} context. The counter is begun with @code{\\startMeasureCount} and ended with -@code{\\stopMeasureCount}. Numbering will start by default with @code{1}, but -this behavior may be modified by overriding the @code{count-from} property. +@code{\\stopMeasureCount}. Numbering will start by default with +@code{1}, but this behavior may be modified by overriding the +@code{count-from} property. -When a measure extends across a line break, the number will appear twice, the -second time in parentheses. + +When a measure extends across a line break, the number will appear +twice, the second time in parentheses. " doctitle = "Numbering groups of measures" } % begin verbatim - \layout { \context { \Staff diff --git a/Documentation/snippets/numbers-as-easy-note-heads.ly b/Documentation/snippets/numbers-as-easy-note-heads.ly index 70faa4ae4b..b8e9f3421c 100644 --- a/Documentation/snippets/numbers-as-easy-note-heads.ly +++ b/Documentation/snippets/numbers-as-easy-note-heads.ly @@ -1,27 +1,27 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "pitches" + texidoc = " -Easy notation note heads use the @code{note-names} property -of the @code{NoteHead} object to determine what appears inside -the note head. By overriding this property, it is possible -to print numbers representing the scale-degree. +Easy notation note heads use the @code{note-names} property of the +@code{NoteHead} object to determine what appears inside the note head. +By overriding this property, it is possible to print numbers +representing the scale-degree. + +A simple engraver can be created to do this for every note head object +it sees. -A simple engraver can be created to do this for every note head -object it sees. " doctitle = "Numbers as easy note heads" } % begin verbatim - #(define Ez_numbers_engraver (make-engraver (acknowledgers diff --git a/Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly b/Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly index 2ec7ebf8d9..de3e108a48 100644 --- a/Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly +++ b/Documentation/snippets/obtaining-2.12-lyrics-spacing-in-newer-versions.ly @@ -1,19 +1,21 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "vocal-music" texidoc = " -The vertical spacing engine changed for version 2.14. This can cause -lyrics to be spaced differently. It is possible to set properties for -@code{Lyric} and @code{Staff} contexts to get the spacing engine to -behave as it did in version 2.12. +The vertical spacing engine changed since version 2.14. This can cause +lyrics to be spaced differently. + +It is possible to set properties for @code{Lyric} and @code{Staff} +contexts to get the spacing engine to behave as it did in version 2.12. + " doctitle = "Obtaining 2.12 lyrics spacing in newer versions" @@ -47,7 +49,7 @@ bassMusic = \relative c { } words = \lyricmode { - Great is Thy faith- ful- ness, + Great is Thy faith -- ful -- ness, } \score { diff --git a/Documentation/snippets/open-string-harmonics-in-tablature.ly b/Documentation/snippets/open-string-harmonics-in-tablature.ly index 1b1692a02b..019a68bcca 100644 --- a/Documentation/snippets/open-string-harmonics-in-tablature.ly +++ b/Documentation/snippets/open-string-harmonics-in-tablature.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings" @@ -17,47 +17,68 @@ This snippet demonstrates open-string harmonics } % begin verbatim openStringHarmonics = { + \textSpannerDown + \override TextSpanner.staff-padding = #3 + \override TextSpanner.dash-fraction = #0.3 + \override TextSpanner.dash-period = #1 + %first harmonic - \harmonicByFret #12 e,2\6_\markup{"1st harm."} - \harmonicByRatio #1/2 e,\6 + \override TextSpanner.bound-details.left.text = \markup\small "1st harm. " + \harmonicByFret #12 e,2\6\startTextSpan + \harmonicByRatio #1/2 e,\6\stopTextSpan + %second harmonic - \harmonicByFret #7 e,\6_\markup{"2nd harm. - - - -"} + \override TextSpanner.bound-details.left.text = \markup\small "2nd harm. " + \harmonicByFret #7 e,\6\startTextSpan \harmonicByRatio #1/3 e,\6 \harmonicByFret #19 e,\6 - \harmonicByRatio #2/3 e,\6 + \harmonicByRatio #2/3 e,\6\stopTextSpan %\harmonicByFret #19 < e,\6 a,\5 d\4 > %\harmonicByRatio #2/3 < e,\6 a,\5 d\4 > + %third harmonic - \harmonicByFret #5 e,\6_\markup{"3rd harm. - - - -"} + \override TextSpanner.bound-details.left.text = \markup\small "3rd harm. " + \harmonicByFret #5 e,\6\startTextSpan \harmonicByRatio #1/4 e,\6 \harmonicByFret #24 e,\6 - \harmonicByRatio #3/4 e,\6 + \harmonicByRatio #3/4 e,\6\stopTextSpan \break + %fourth harmonic - \harmonicByFret #4 e,\6_\markup{"4th harm. - - - - - - - - - - - - -"} + \override TextSpanner.bound-details.left.text = \markup\small "4th harm. " + \harmonicByFret #4 e,\6\startTextSpan \harmonicByRatio #1/5 e,\6 \harmonicByFret #9 e,\6 \harmonicByRatio #2/5 e,\6 \harmonicByFret #16 e,\6 - \harmonicByRatio #3/5 e,\6 + \harmonicByRatio #3/5 e,\6\stopTextSpan + %fifth harmonic - \harmonicByFret #3 e,\6_\markup{"5th harm."} - \harmonicByRatio #1/6 e,\6 + \override TextSpanner.bound-details.left.text = \markup\small "5th harm. " + \harmonicByFret #3 e,\6\startTextSpan + \harmonicByRatio #1/6 e,\6\stopTextSpan \break + %sixth harmonic - \harmonicByFret #2.7 e,\6_\markup{"6th harm."} - \harmonicByRatio #1/7 e,\6 + \override TextSpanner.bound-details.left.text = \markup\small "6th harm. " + \harmonicByFret #2.7 e,\6\startTextSpan + \harmonicByRatio #1/7 e,\6\stopTextSpan + %seventh harmonic - \harmonicByFret #2.3 e,\6_\markup{"7th harm."} - \harmonicByRatio #1/8 e,\6 + \override TextSpanner.bound-details.left.text = \markup\small "7th harm. " + \harmonicByFret #2.3 e,\6\startTextSpan + \harmonicByRatio #1/8 e,\6\stopTextSpan + %eighth harmonic - \harmonicByFret #2 e,\6_\markup{"8th harm."} - \harmonicByRatio #1/9 e,\6 + \override TextSpanner.bound-details.left.text = \markup\small "8th harm. " + \harmonicByFret #2 e,\6\startTextSpan + \harmonicByRatio #1/9 e,\6\stopTextSpan } \score { << - \new Staff { + \new Staff + \with { \omit StringNumber } { \new Voice { \clef "treble_8" \openStringHarmonics diff --git a/Documentation/snippets/orchestra,-choir-and-piano-template.ly b/Documentation/snippets/orchestra,-choir-and-piano-template.ly index 61fed7dc46..e3b6eff963 100644 --- a/Documentation/snippets/orchestra,-choir-and-piano-template.ly +++ b/Documentation/snippets/orchestra,-choir-and-piano-template.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "pitches, staff-notation, template, vocal-music" @@ -19,9 +19,9 @@ music for transposing instruments at concert pitch. doctitle = "Orchestra choir and piano template" } % begin verbatim - #(set-global-staff-size 17) \paper { + paper-height = 10\cm indent = 3.0\cm % space for instrumentName short-indent = 1.5\cm % space for shortInstrumentName } diff --git a/Documentation/snippets/ottava-text.ly b/Documentation/snippets/ottava-text.ly index 6729c113af..1cd8bdfe14 100644 --- a/Documentation/snippets/ottava-text.ly +++ b/Documentation/snippets/ottava-text.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "pitches, text" @@ -19,7 +19,6 @@ override the text of the bracket, set @code{ottavation} after invoking doctitle = "Ottava text" } % begin verbatim - { \ottava #1 \set Staff.ottavation = #"8" diff --git a/Documentation/snippets/outputting-the-version-number.ly b/Documentation/snippets/outputting-the-version-number.ly index 742e687c93..5e99a2ad33 100644 --- a/Documentation/snippets/outputting-the-version-number.ly +++ b/Documentation/snippets/outputting-the-version-number.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "really-simple, scheme-language, text, titles" @@ -20,7 +20,6 @@ By putting the output of doctitle = "Outputting the version number" } % begin verbatim - \score { \new Lyrics { \override Score.RehearsalMark.self-alignment-X = #LEFT diff --git a/Documentation/snippets/overriding-articulations-of-destinct-type.ly b/Documentation/snippets/overriding-articulations-of-destinct-type.ly index e13154f9a0..98bcefa5dd 100644 --- a/Documentation/snippets/overriding-articulations-of-destinct-type.ly +++ b/Documentation/snippets/overriding-articulations-of-destinct-type.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.25" +\version "2.19.22" \header { lsrtags = "scheme-language, tweaks-and-overrides" @@ -37,7 +37,7 @@ With 2.16.2 it is possible to put the proposed function, tweaks))))) customScripts = -#(define-music-function (parser location settings)(list?) +#(define-music-function (settings)(list?) #{ \override Script.before-line-breaking = #(custom-script-tweaks settings) diff --git a/Documentation/snippets/page-label.ly b/Documentation/snippets/page-label.ly index 727f9d4191..1f7db440ef 100644 --- a/Documentation/snippets/page-label.ly +++ b/Documentation/snippets/page-label.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "spacing" @@ -17,7 +17,6 @@ in markups. doctitle = "Page label" } % begin verbatim - #(set-default-paper-size "a6") #(define-markup-command (toc-line layout props label text) diff --git a/Documentation/snippets/paper-and-layout.snippet-list b/Documentation/snippets/paper-and-layout.snippet-list index e99215262a..8bae8889e1 100644 --- a/Documentation/snippets/paper-and-layout.snippet-list +++ b/Documentation/snippets/paper-and-layout.snippet-list @@ -1,4 +1,5 @@ aligning-and-centering-instrument-names.ly +arranging-separate-lyrics-on-a-single-line.ly book-parts.ly changing-the-staff-size.ly clip-systems.ly diff --git a/Documentation/snippets/partcombine-and-autobeamoff.ly b/Documentation/snippets/partcombine-and-autobeamoff.ly index 691c47f775..38e1386f78 100644 --- a/Documentation/snippets/partcombine-and-autobeamoff.ly +++ b/Documentation/snippets/partcombine-and-autobeamoff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -44,7 +44,6 @@ with @code{\\partcombine}, it will be necessary to use three calls to doctitle = "Partcombine and autoBeamOff" } % begin verbatim - { %\set Staff.autoBeaming = ##f % turns off all autobeaming \partcombine diff --git a/Documentation/snippets/percent-repeat-count-visibility.ly b/Documentation/snippets/percent-repeat-count-visibility.ly index aa6bcadb37..8692564ebf 100644 --- a/Documentation/snippets/percent-repeat-count-visibility.ly +++ b/Documentation/snippets/percent-repeat-count-visibility.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "repeats, tweaks-and-overrides" @@ -17,7 +17,6 @@ the context property @code{repeatCountVisibility}. doctitle = "Percent repeat count visibility" } % begin verbatim - \relative c'' { \set countPercentRepeats = ##t \set repeatCountVisibility = #(every-nth-repeat-count-visible 5) diff --git a/Documentation/snippets/percent-repeat-counter.ly b/Documentation/snippets/percent-repeat-counter.ly index 508bad7462..36180e5b7e 100644 --- a/Documentation/snippets/percent-repeat-counter.ly +++ b/Documentation/snippets/percent-repeat-counter.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "repeats" @@ -17,7 +17,6 @@ convenient property is switched, as shown in this example: doctitle = "Percent repeat counter" } % begin verbatim - \relative c'' { \set countPercentRepeats = ##t \repeat percent 4 { c1 } diff --git a/Documentation/snippets/percussion-beaters.ly b/Documentation/snippets/percussion-beaters.ly index fdea45c4dc..08f56f301b 100644 --- a/Documentation/snippets/percussion-beaters.ly +++ b/Documentation/snippets/percussion-beaters.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "percussion" @@ -19,7 +19,6 @@ demonstrated in this example. doctitle = "Percussion beaters" } % begin verbatim - stick = \markup { \with-dimensions #'(0 . 5) #'(0 . 5) \postscript #" @@ -86,7 +85,9 @@ stick = \markup { 7.5332399 200.42458 7.6444521 200.59122 7.6422017 200.76488 curveto closepath clip - gsave [0.052859054 0.063089841 -0.020912282 0.017521108 5.7334261 189.76443] concat + gsave [ + 0.052859054 0.063089841 -0.020912282 0.017521108 5.7334261 189.76443 + ] concat shfill grestore grestore @@ -135,7 +136,9 @@ stick = \markup { 5.1631598 202.49149 5.2743721 202.65813 5.2721217 202.83181 curveto closepath clip - gsave [0.052859054 0.063089841 -0.020912282 0.017521108 3.363346 191.83136] concat + gsave [ + 0.052859054 0.063089841 -0.020912282 0.017521108 3.363346 191.83136 + ] concat shfill grestore grestore diff --git a/Documentation/snippets/percussion.snippet-list b/Documentation/snippets/percussion.snippet-list index 5a29fb2c15..edef3b78e2 100644 --- a/Documentation/snippets/percussion.snippet-list +++ b/Documentation/snippets/percussion.snippet-list @@ -1,4 +1,5 @@ adding-drum-parts.ly +customize-drumpitchnames,-drumstyletable-and-drumpitchtable-in-layout-and-midi.ly heavily-customized-polymetric-time-signatures.ly jazz-combo-template.ly percussion-beaters.ly diff --git a/Documentation/snippets/permitting-line-breaks-within-beamed-tuplets.ly b/Documentation/snippets/permitting-line-breaks-within-beamed-tuplets.ly index c67206c3aa..9046dfd7c0 100644 --- a/Documentation/snippets/permitting-line-breaks-within-beamed-tuplets.ly +++ b/Documentation/snippets/permitting-line-breaks-within-beamed-tuplets.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "rhythms, version-specific" @@ -18,7 +18,6 @@ tuplets have to be beamed manually. doctitle = "Permitting line breaks within beamed tuplets" } % begin verbatim - \layout { \context { \Voice diff --git a/Documentation/snippets/piano-template-simple.ly b/Documentation/snippets/piano-template-simple.ly index 0b58a54b46..b2728932e4 100644 --- a/Documentation/snippets/piano-template-simple.ly +++ b/Documentation/snippets/piano-template-simple.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "keyboards, really-simple, template" @@ -16,7 +16,6 @@ Here is a simple piano staff with some notes. doctitle = "Piano template (simple)" } % begin verbatim - upper = \relative c'' { \clef treble \key c \major diff --git a/Documentation/snippets/piano-template-with-centered-lyrics.ly b/Documentation/snippets/piano-template-with-centered-lyrics.ly index ccf50e699b..008535e304 100644 --- a/Documentation/snippets/piano-template-with-centered-lyrics.ly +++ b/Documentation/snippets/piano-template-with-centered-lyrics.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "keyboards, really-simple, template, text" @@ -17,7 +17,6 @@ centered between the staves of a piano staff. doctitle = "Piano template with centered lyrics" } % begin verbatim - upper = \relative c'' { \clef treble \key c \major @@ -39,20 +38,11 @@ text = \lyricmode { } \score { - \new GrandStaff << + \new PianoStaff << \new Staff = upper { \new Voice = "singer" \upper } \new Lyrics \lyricsto "singer" \text \new Staff = lower { \lower } >> - \layout { - \context { - \GrandStaff - \accepts "Lyrics" - } - \context { - \Lyrics - \consists "Bar_engraver" - } - } + \layout { } \midi { } } diff --git a/Documentation/snippets/piano-template-with-melody-and-lyrics.ly b/Documentation/snippets/piano-template-with-melody-and-lyrics.ly index c44b64ba22..57466a0a3e 100644 --- a/Documentation/snippets/piano-template-with-melody-and-lyrics.ly +++ b/Documentation/snippets/piano-template-with-melody-and-lyrics.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "keyboards, really-simple, template, vocal-music" @@ -17,7 +17,6 @@ with piano accompaniment underneath. doctitle = "Piano template with melody and lyrics" } % begin verbatim - melody = \relative c'' { \clef treble \key c \major diff --git a/Documentation/snippets/pitches-headword.ly b/Documentation/snippets/pitches-headword.ly index ad09b5755b..16859e9431 100644 --- a/Documentation/snippets/pitches-headword.ly +++ b/Documentation/snippets/pitches-headword.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.27 -\version "2.17.27" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "headword" @@ -76,7 +75,7 @@ Piches headword 2 e'2 | - 2 -\tweak #'style #'none \cresc + 2 -\tweak style #'none \cresc b'4 4 | @@ -141,5 +140,4 @@ Piches headword 4 ) r4 r2 } - >> diff --git a/Documentation/snippets/pitches.snippet-list b/Documentation/snippets/pitches.snippet-list index 87368cd7cf..ce27407d67 100644 --- a/Documentation/snippets/pitches.snippet-list +++ b/Documentation/snippets/pitches.snippet-list @@ -5,16 +5,20 @@ ambitus-with-multiple-voices.ly ambitus.ly applying-note-head-styles-depending-on-the-step-of-the-scale.ly automatically-changing-the-stem-direction-of-the-middle-note-based-on-the-melody.ly +changing-ottava-text.ly changing-the-ambitus-gap.ly changing-the-interval-of-lines-on-the-stave.ly clefs-can-be-transposed-by-arbitrary-amounts.ly coloring-notes-depending-on-their-pitch.ly creating-a-sequence-of-notes-on-various-pitches.ly +creating-custom-key-signatures.ly +customize-drumpitchnames,-drumstyletable-and-drumpitchtable-in-layout-and-midi.ly forcing-a-clef-symbol-to-be-displayed.ly generating-random-notes.ly hiding-accidentals-on-tied-notes-at-the-start-of-a-new-system.ly keep-change-clefs-full-sized.ly makam-example.ly +modifying-the-ottava-spanner-slope.ly non-traditional-key-signatures.ly numbers-as-easy-note-heads.ly orchestra,-choir-and-piano-template.ly diff --git a/Documentation/snippets/placement-of-right-hand-fingerings.ly b/Documentation/snippets/placement-of-right-hand-fingerings.ly index 51ac129a33..bea1e6510e 100644 --- a/Documentation/snippets/placement-of-right-hand-fingerings.ly +++ b/Documentation/snippets/placement-of-right-hand-fingerings.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings" @@ -18,7 +18,6 @@ in the following example. Note: you must use a chord construct doctitle = "Placement of right-hand fingerings" } % begin verbatim - #(define RH rightHandFinger) \relative c { diff --git a/Documentation/snippets/polyphony-in-tablature.ly b/Documentation/snippets/polyphony-in-tablature.ly index 1aa24cb2bb..5a9c845a9b 100644 --- a/Documentation/snippets/polyphony-in-tablature.ly +++ b/Documentation/snippets/polyphony-in-tablature.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "fretted-strings" @@ -17,7 +17,6 @@ staff. doctitle = "Polyphony in tablature" } % begin verbatim - upper = \relative c' { \time 12/8 \key e \minor diff --git a/Documentation/snippets/positioning-arpeggios.ly b/Documentation/snippets/positioning-arpeggios.ly index 68861a1dc3..6f3d878fad 100644 --- a/Documentation/snippets/positioning-arpeggios.ly +++ b/Documentation/snippets/positioning-arpeggios.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" @@ -17,7 +17,6 @@ and lower start positions independently. doctitle = "Positioning arpeggios" } % begin verbatim - \relative c' { 1\arpeggio \once \override Arpeggio.positions = #'(-5 . 0) diff --git a/Documentation/snippets/positioning-fingering-indications-precisely.ly b/Documentation/snippets/positioning-fingering-indications-precisely.ly index 253b05ec03..7ffa0f16e0 100644 --- a/Documentation/snippets/positioning-fingering-indications-precisely.ly +++ b/Documentation/snippets/positioning-fingering-indications-precisely.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations" @@ -20,18 +20,20 @@ involved. doctitle = "Positioning fingering indications precisely" } % begin verbatim - \relative c' { \set fingeringOrientations = #'(left) 4 - 4 + 4 \set fingeringOrientations = #'(down) 4 - 4 + 4 \set fingeringOrientations = #'(down right up) - 4 + 4 4 \set fingeringOrientations = #'(up) - 4 - 4 + 4 + 4 } diff --git a/Documentation/snippets/positioning-grace-note-beams-at-the-height-of-normal-note-beams.ly b/Documentation/snippets/positioning-grace-note-beams-at-the-height-of-normal-note-beams.ly index d3c6e90dc9..c05f2592a6 100644 --- a/Documentation/snippets/positioning-grace-note-beams-at-the-height-of-normal-note-beams.ly +++ b/Documentation/snippets/positioning-grace-note-beams-at-the-height-of-normal-note-beams.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -19,7 +19,6 @@ beaming for grace notes. doctitle = "Positioning grace note beams at the height of normal note beams" } % begin verbatim - \relative c { f8[ e] \grace { diff --git a/Documentation/snippets/positioning-grace-notes-with-floating-space.ly b/Documentation/snippets/positioning-grace-notes-with-floating-space.ly index 0bbbdf1624..ab8bc4eef1 100644 --- a/Documentation/snippets/positioning-grace-notes-with-floating-space.ly +++ b/Documentation/snippets/positioning-grace-notes-with-floating-space.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.28" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -19,7 +19,6 @@ the) graces are put left of the musical columns for the main notes. doctitle = "Positioning grace notes with floating space" } % begin verbatim - \relative c'' { << \override Score.SpacingSpanner.strict-grace-spacing = ##t diff --git a/Documentation/snippets/positioning-multi-measure-rests.ly b/Documentation/snippets/positioning-multi-measure-rests.ly index b32e5b9a51..f990182ce0 100644 --- a/Documentation/snippets/positioning-multi-measure-rests.ly +++ b/Documentation/snippets/positioning-multi-measure-rests.ly @@ -4,8 +4,9 @@ % and then run scripts/auxiliar/makelsr.py % % This file is in the public domain. -%% Note: this file works from version 2.17.18 -\version "2.17.18" +%% Note: this file works from version 2.19.20 + +\version "2.19.20" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -56,7 +57,7 @@ follows: % Using compressed bars in multiple voices requires another override % in all voices to avoid multiple instances being printed - \compressFullBarRests + \compressMMRests << \revert MultiMeasureRest.direction { R1*3 } diff --git a/Documentation/snippets/positioning-segno-and-coda-with-line-break.ly b/Documentation/snippets/positioning-segno-and-coda-with-line-break.ly index b03aa21b89..80cc874efd 100644 --- a/Documentation/snippets/positioning-segno-and-coda-with-line-break.ly +++ b/Documentation/snippets/positioning-segno-and-coda-with-line-break.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "breaks, repeats, symbols-and-glyphs, workaround" @@ -51,14 +51,16 @@ line. \bar "||" % Set segno sign as rehearsal mark and adjust size if needed - \once \override Score.RehearsalMark.break-visibility = #begin-of-line-invisible + \once \override Score.RehearsalMark.break-visibility = + #begin-of-line-invisible % \once \override Score.RehearsalMark.font-size = #3 \mark \markup { \musicglyph #"scripts.segno" } % Here begins the trickery! - % \cadenzaOn will suppress the bar count and \stopStaff removes the staff lines. + % \cadenzaOn will suppress the bar count + % and \stopStaff removes the staff lines. \cadenzaOn - \stopStaff + \stopStaff % Some examples of possible text-displays % text line-aligned @@ -75,14 +77,19 @@ line. % text and symbols center-aligned % =============================== - % Move text to the desired position and tweak spacing for optimum text alignment + % Move text to the desired position + % and tweak spacing for optimum text alignment \repeat unfold 1 { s1 \bar "" } \once \override TextScript.extra-offset = #'( 0 . -3.0 ) \once \override TextScript.word-space = #1.5 - <>^\markup { \center-column { "D.S. al Coda" \line { \musicglyph #"scripts.coda" \musicglyph #"scripts.tenuto" \musicglyph #"scripts.coda"} } } + <>^\markup { \center-column { "D.S. al Coda" + \line { + \musicglyph #"scripts.coda" + \musicglyph #"scripts.tenuto" + \musicglyph #"scripts.coda"} } } % Increasing the unfold counter will expand the staff-free space \repeat unfold 3 { @@ -90,33 +97,34 @@ line. \bar "" } % Resume bar count and show staff lines again - \startStaff - \cadenzaOff + \startStaff + \cadenzaOff - % Should Coda be on new line? - % Coda NOT on new line: DON'T use \break - % Coda on new line: use \break - \break + % Should Coda be on new line? + % Coda NOT on new line: DON'T use \break + % Coda on new line: use \break + \break - % Show up, you clef and key! - \once \override Staff.KeySignature.break-visibility = #end-of-line-invisible - \once \override Staff.Clef.break-visibility = #end-of-line-invisible + % Show up, you clef and key! + \once \override Staff.KeySignature.break-visibility = #end-of-line-invisible + \once \override Staff.Clef.break-visibility = #end-of-line-invisible - % Set coda sign as rehearsal mark and adjust size and position + % Set coda sign as rehearsal mark and adjust size and position - % Put the coda sign ontop of the (treble-)clef dependend on coda's line-position + % Put the coda sign on top of the (treble-)clef + % depending on coda's line-position - % Coda NOT on new line, use this: - % \once \override Score.RehearsalMark.extra-offset = #'( -2 . 1.75 ) + % Coda NOT on new line, use this: + % \once \override Score.RehearsalMark.extra-offset = #'( -2 . 1.75 ) - % Coda on new line, use this: - \once \override Score.RehearsalMark.extra-offset = #'( -4.5 . 0 ) + % Coda on new line, use this: + \once \override Score.RehearsalMark.extra-offset = #'( -5 . .5 ) - \once \override Score.RehearsalMark.font-size = #5 - \mark \markup { \musicglyph #"scripts.coda" } + \once \override Score.RehearsalMark.font-size = #5 + \mark \markup { \musicglyph #"scripts.coda" } - % The coda - \repeat unfold 5 { + % The coda + \repeat unfold 6 { c4 c c c } \bar"|." diff --git a/Documentation/snippets/positioning-text-markups-inside-slurs.ly b/Documentation/snippets/positioning-text-markups-inside-slurs.ly index 8348981a4e..8be61a74e2 100644 --- a/Documentation/snippets/positioning-text-markups-inside-slurs.ly +++ b/Documentation/snippets/positioning-text-markups-inside-slurs.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, expressive-marks, tweaks-and-overrides" @@ -17,7 +17,6 @@ set to false in order to be printed inside slurs. doctitle = "Positioning text markups inside slurs" } % begin verbatim - \relative c'' { \override TextScript.avoid-slur = #'inside \override TextScript.outside-staff-priority = ##f diff --git a/Documentation/snippets/preventing-extra-naturals-from-being-automatically-added.ly b/Documentation/snippets/preventing-extra-naturals-from-being-automatically-added.ly index b788c3cd10..1ff350eec5 100644 --- a/Documentation/snippets/preventing-extra-naturals-from-being-automatically-added.ly +++ b/Documentation/snippets/preventing-extra-naturals-from-being-automatically-added.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "automatic-notation, pitches" diff --git a/Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly b/Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly index db86ab6d76..d39af579da 100644 --- a/Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly +++ b/Documentation/snippets/preventing-final-mark-from-removing-final-tuplet.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -18,8 +18,6 @@ tuplet marking. This can be overcome by setting @code{TupletBracket doctitle = "Preventing final mark from removing final tuplet" } % begin verbatim -\markup \vspace #1 %% workaround for LSR-problem - \new Staff { \set tupletFullLength = ##t \time 1/8 diff --git a/Documentation/snippets/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.ly b/Documentation/snippets/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.ly index 1d3f050457..ab32f9212f 100644 --- a/Documentation/snippets/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.ly +++ b/Documentation/snippets/preventing-natural-signs-from-being-printed-when-the-key-signature-changes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "automatic-notation, pitches" @@ -19,7 +19,6 @@ property in the @code{Staff} context. doctitle = "Preventing natural signs from being printed when the key signature changes" } % begin verbatim - \relative c' { \key d \major a4 b cis d diff --git a/Documentation/snippets/printing-a-repeat-sign-at-the-beginning-of-a-piece.ly b/Documentation/snippets/printing-a-repeat-sign-at-the-beginning-of-a-piece.ly deleted file mode 100644 index b8590edebf..0000000000 --- a/Documentation/snippets/printing-a-repeat-sign-at-the-beginning-of-a-piece.ly +++ /dev/null @@ -1,44 +0,0 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" - -\header { - lsrtags = "repeats, tweaks-and-overrides" - - texidoc = " -A @code{.|:} bar line can be printed at the beginning of a piece, by -overriding the relevant property: - -" - doctitle = "Printing a repeat sign at the beginning of a piece" -} % begin verbatim - - - -\relative c'' { - \once \override Score.BreakAlignment.break-align-orders = - #(make-vector 3 '(instrument-name - left-edge - ambitus - breathing-sign - clef - key-signature - time-signature - staff-bar - custos)) - \once \override Staff.TimeSignature.space-alist = - #'((first-note . (fixed-space . 2.0)) - (right-edge . (extra-space . 0.5)) - ;; free up some space between time signature - ;; and repeat bar line - (staff-bar . (extra-space . 1))) - \bar ".|:" - c1 - d1 - d4 e f g -} diff --git a/Documentation/snippets/printing-bar-numbers-at-regular-intervals.ly b/Documentation/snippets/printing-bar-numbers-at-regular-intervals.ly index 75c335bdea..085ca0037a 100644 --- a/Documentation/snippets/printing-bar-numbers-at-regular-intervals.ly +++ b/Documentation/snippets/printing-bar-numbers-at-regular-intervals.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -18,7 +18,6 @@ measures except at the end of the line. doctitle = "Printing bar numbers at regular intervals" } % begin verbatim - \relative c' { \override Score.BarNumber.break-visibility = #end-of-line-invisible \set Score.currentBarNumber = #11 diff --git a/Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly b/Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly index 63b65a8372..19b7ee80bc 100644 --- a/Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly +++ b/Documentation/snippets/printing-bar-numbers-inside-boxes-or-circles.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -16,7 +16,6 @@ Bar numbers can also be printed inside boxes or circles. doctitle = "Printing bar numbers inside boxes or circles" } % begin verbatim - \relative c' { % Prevent bar numbers at the end of a line and permit them elsewhere \override Score.BarNumber.break-visibility = #end-of-line-invisible diff --git a/Documentation/snippets/printing-bar-numbers-with-changing-regular-intervals.ly b/Documentation/snippets/printing-bar-numbers-with-changing-regular-intervals.ly new file mode 100644 index 0000000000..a78462a87b --- /dev/null +++ b/Documentation/snippets/printing-bar-numbers-with-changing-regular-intervals.ly @@ -0,0 +1,26 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "rhythms, text" + + texidoc = " +The bar number interval can be changed by changing the context function +@code{@{set-bar-number-visibility@}}. + +" + doctitle = "Printing bar numbers with changing regular intervals" +} % begin verbatim + +\relative c' { + \override Score.BarNumber.break-visibility = #end-of-line-invisible + \context Score \applyContext #(set-bar-number-visibility 4) + \repeat unfold 10 c'1 + \context Score \applyContext #(set-bar-number-visibility 2) + \repeat unfold 10 c +} diff --git a/Documentation/snippets/printing-hairpins-in-various-styles.ly b/Documentation/snippets/printing-hairpins-in-various-styles.ly index 1ce96f79a6..54be1bd351 100644 --- a/Documentation/snippets/printing-hairpins-in-various-styles.ly +++ b/Documentation/snippets/printing-hairpins-in-various-styles.ly @@ -1,23 +1,21 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.14 -\version "2.17.14" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "expressive-marks" texidoc = " -Hairpin dynamics may be created in a variety of styles +Hairpin dynamics may be created in a variety of styles. " doctitle = "Printing hairpins in various styles" } % begin verbatim - \relative c'' { \override Hairpin.stencil = #flared-hairpin a4\< a a a\f diff --git a/Documentation/snippets/printing-hairpins-using-al-niente-notation.ly b/Documentation/snippets/printing-hairpins-using-al-niente-notation.ly index 634017285c..91d1e1b6c0 100644 --- a/Documentation/snippets/printing-hairpins-using-al-niente-notation.ly +++ b/Documentation/snippets/printing-hairpins-using-al-niente-notation.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks" @@ -18,7 +18,6 @@ notation) by setting the @code{circled-tip} property of the doctitle = "Printing hairpins using al niente notation" } % begin verbatim - \relative c'' { \override Hairpin.circled-tip = ##t c2\< c\! diff --git a/Documentation/snippets/printing-marks-at-the-end-of-a-line.ly b/Documentation/snippets/printing-marks-at-the-end-of-a-line.ly index 89e2fbf87a..385a7234b9 100644 --- a/Documentation/snippets/printing-marks-at-the-end-of-a-line.ly +++ b/Documentation/snippets/printing-marks-at-the-end-of-a-line.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "text" @@ -18,7 +18,6 @@ to align the right end of the mark with the bar line. doctitle = "Printing marks at the end of a line" } % begin verbatim - \relative c'' { g2 c d,2 a' diff --git a/Documentation/snippets/printing-marks-on-every-staff.ly b/Documentation/snippets/printing-marks-on-every-staff.ly index 556eea0996..1d4a800d1d 100644 --- a/Documentation/snippets/printing-marks-on-every-staff.ly +++ b/Documentation/snippets/printing-marks-on-every-staff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "text" @@ -17,7 +17,6 @@ they may also be printed on every staff. doctitle = "Printing marks on every staff" } % begin verbatim - \score { << \new Staff { c''1 \mark "molto" c'' } diff --git a/Documentation/snippets/printing-metronome-and-rehearsal-marks-below-the-staff.ly b/Documentation/snippets/printing-metronome-and-rehearsal-marks-below-the-staff.ly index 4c563872b4..afaa08b59f 100644 --- a/Documentation/snippets/printing-metronome-and-rehearsal-marks-below-the-staff.ly +++ b/Documentation/snippets/printing-metronome-and-rehearsal-marks-below-the-staff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, rhythms, tweaks-and-overrides" @@ -18,8 +18,10 @@ of @code{MetronomeMark} or @code{RehearsalMark} appropriately. doctitle = "Printing metronome and rehearsal marks below the staff" } % begin verbatim - -\layout { ragged-right = ##f } +\layout { + indent = 0 + ragged-right = ##f +} { % Metronome marks below the staff diff --git a/Documentation/snippets/printing-music-with-different-time-signatures.ly b/Documentation/snippets/printing-music-with-different-time-signatures.ly index 8d52ffd405..c00d974026 100644 --- a/Documentation/snippets/printing-music-with-different-time-signatures.ly +++ b/Documentation/snippets/printing-music-with-different-time-signatures.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "contemporary-notation, percussion, real-music, really-cool, rhythms" diff --git a/Documentation/snippets/printing-note-names-with-and-without-an-octave-marker.ly b/Documentation/snippets/printing-note-names-with-and-without-an-octave-marker.ly index 96b4d051ad..9e59ce5382 100644 --- a/Documentation/snippets/printing-note-names-with-and-without-an-octave-marker.ly +++ b/Documentation/snippets/printing-note-names-with-and-without-an-octave-marker.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "tweaks-and-overrides" @@ -18,7 +18,6 @@ representation of the octave of the note. doctitle = "Printing note names with and without an octave marker" } % begin verbatim - scale = \relative c' { a4 b c d e4 f g a diff --git a/Documentation/snippets/printing-text-from-right-to-left.ly b/Documentation/snippets/printing-text-from-right-to-left.ly index 49c10706a0..bd7ef3e689 100644 --- a/Documentation/snippets/printing-text-from-right-to-left.ly +++ b/Documentation/snippets/printing-text-from-right-to-left.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "editorial-annotations, text, workaround, world-music" @@ -17,7 +17,6 @@ demonstrated here. doctitle = "Printing text from right to left" } % begin verbatim - { b1^\markup { \line { i n g i r u m i m u s n o c t e } diff --git a/Documentation/snippets/printing-the-bar-number-for-the-first-measure.ly b/Documentation/snippets/printing-the-bar-number-for-the-first-measure.ly index ae6321a6e2..7280abfdf7 100644 --- a/Documentation/snippets/printing-the-bar-number-for-the-first-measure.ly +++ b/Documentation/snippets/printing-the-bar-number-for-the-first-measure.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -20,6 +20,10 @@ must be inserted before the first note for this to work. doctitle = "Printing the bar number for the first measure" } % begin verbatim +\layout { + indent = 0 + ragged-right = ##t +} \relative c' { \set Score.barNumberVisibility = #all-bar-numbers-visible diff --git a/Documentation/snippets/proportional-strict-notespacing.ly b/Documentation/snippets/proportional-strict-notespacing.ly index b5d489208d..5f9744918d 100644 --- a/Documentation/snippets/proportional-strict-notespacing.ly +++ b/Documentation/snippets/proportional-strict-notespacing.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.28" +\version "2.18.0" \header { lsrtags = "spacing, tweaks-and-overrides" @@ -18,13 +18,12 @@ the note that occurs at the same time. This may cause collisions. doctitle = "Proportional strict notespacing" } % begin verbatim - \relative c'' << \override Score.SpacingSpanner.strict-note-spacing = ##t \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) \new Staff { c8[ c \clef alto c c \grace { d16 } c8 c] c4 - c2 \grace { c16 c16 } c2 + c2 \grace { c16[ c16] } c2 } \new Staff { c2 \tuplet 3/2 { c8 \clef bass cis,, c } c4 diff --git a/Documentation/snippets/putting-lyrics-inside-the-staff.ly b/Documentation/snippets/putting-lyrics-inside-the-staff.ly index 4edd6a59e5..d1676ce318 100644 --- a/Documentation/snippets/putting-lyrics-inside-the-staff.ly +++ b/Documentation/snippets/putting-lyrics-inside-the-staff.ly @@ -1,19 +1,19 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "staff-notation, text, vocal-music" texidoc = " Lyrics can be moved vertically to place them inside the staff. The -lyrics are moved with @code{\\override LyricText.extra-offset = #'(0 -. dy)} and there are similar commands to move the extenders and -hyphens. The offset needed is established with trial and error. +lyrics are moved with @code{\\override LyricText.extra-offset = #'(0 . +dy)} and there are similar commands to move the extenders and hyphens. +The offset needed is established with trial and error. " doctitle = "Putting lyrics inside the staff" diff --git a/Documentation/snippets/quoting-another-voice-with-transposition.ly b/Documentation/snippets/quoting-another-voice-with-transposition.ly index df7517fd79..82f02f0f0d 100644 --- a/Documentation/snippets/quoting-another-voice-with-transposition.ly +++ b/Documentation/snippets/quoting-another-voice-with-transposition.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.13 -\version "2.17.13" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "pitches, staff-notation" @@ -14,13 +13,13 @@ Quotations take into account the transposition of both source and target. In this example, all instruments play sounding middle C; the target is an instrument in F. The target part may be transposed using -@code{\\transpose}. In this case, the quoted pitches will stay -unchanged. +@code{\\transpose}. In this case, all the pitches (including the +quoted ones) are transposed. + " doctitle = "Quoting another voice with transposition" } % begin verbatim - \addQuote clarinet { \transposition bes \repeat unfold 8 { d'16 d' d'8 } diff --git a/Documentation/snippets/quoting-another-voice.ly b/Documentation/snippets/quoting-another-voice.ly index b834961374..cbc1ce7534 100644 --- a/Documentation/snippets/quoting-another-voice.ly +++ b/Documentation/snippets/quoting-another-voice.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "staff-notation" @@ -25,7 +25,6 @@ the Internals Reference. doctitle = "Quoting another voice" } % begin verbatim - quoteMe = \relative c' { fis4 r16 a8.-> b4\ff c } diff --git a/Documentation/snippets/real-music.snippet-list b/Documentation/snippets/real-music.snippet-list index 67467c170c..a00d629147 100644 --- a/Documentation/snippets/real-music.snippet-list +++ b/Documentation/snippets/real-music.snippet-list @@ -1,4 +1,3 @@ -ancient-notation-template----modern-transcription-of-mensural-music.ly changing-midi-output-to-one-channel-per-voice.ly creating-a-sequence-of-notes-on-various-pitches.ly creating-slurs-across-voices.ly diff --git a/Documentation/snippets/really-cool.snippet-list b/Documentation/snippets/really-cool.snippet-list index 507d91f7cc..606a423463 100644 --- a/Documentation/snippets/really-cool.snippet-list +++ b/Documentation/snippets/really-cool.snippet-list @@ -1,5 +1,4 @@ adding-the-current-date-to-a-score.ly -ancient-notation-template----modern-transcription-of-mensural-music.ly blanking-staff-lines-using-the--whiteout-command.ly center-text-below-hairpin-dynamics.ly changing-properties-for-individual-grobs.ly @@ -9,7 +8,6 @@ creating-a-sequence-of-notes-on-various-pitches.ly embedding-native-postscript-in-a--markup-block.ly generating-random-notes.ly generating-whole-scores-also-book-parts-in-scheme-without-using-the-parser.ly -incipit.ly making-some-staff-lines-thicker-than-the-others.ly non-traditional-key-signatures.ly printing-music-with-different-time-signatures.ly diff --git a/Documentation/snippets/recorder-fingering-chart.ly b/Documentation/snippets/recorder-fingering-chart.ly index a5cb083c2e..4d8d548bfd 100644 --- a/Documentation/snippets/recorder-fingering-chart.ly +++ b/Documentation/snippets/recorder-fingering-chart.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.30" +\version "2.18.0" \header { lsrtags = "winds" @@ -21,12 +21,9 @@ instruments can be realized. centermarkup = { \once \override TextScript.self-alignment-X = #CENTER - \once \override TextScript.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)))) + \once \override TextScript.X-offset =#(lambda (g) + (+ (ly:self-alignment-interface::centered-on-x-parent g) + (ly:self-alignment-interface::x-aligned-on-self g))) } \score { diff --git a/Documentation/snippets/redefining-grace-note-global-defaults.ly b/Documentation/snippets/redefining-grace-note-global-defaults.ly index ae51b3c9a7..410fdd0fe2 100644 --- a/Documentation/snippets/redefining-grace-note-global-defaults.ly +++ b/Documentation/snippets/redefining-grace-note-global-defaults.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "rhythms" @@ -22,7 +21,6 @@ other effects may be obtained. doctitle = "Redefining grace note global defaults" } % begin verbatim - startAcciaccaturaMusic = { <>( \override Flag.stroke-style = #"grace" diff --git a/Documentation/snippets/removing-bar-numbers-from-a-score.ly b/Documentation/snippets/removing-bar-numbers-from-a-score.ly index 10ff50af8a..55e6503334 100644 --- a/Documentation/snippets/removing-bar-numbers-from-a-score.ly +++ b/Documentation/snippets/removing-bar-numbers-from-a-score.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, rhythms" @@ -17,11 +17,12 @@ Bar numbers can be removed entirely by removing the doctitle = "Removing bar numbers from a score" } % begin verbatim - \layout { \context { \Score - \remove "Bar_number_engraver" + \omit BarNumber + % or: + %\remove "Bar_number_engraver" } } diff --git a/Documentation/snippets/removing-brace-on-first-line-of-piano-score.ly b/Documentation/snippets/removing-brace-on-first-line-of-piano-score.ly new file mode 100644 index 0000000000..12c0c57520 --- /dev/null +++ b/Documentation/snippets/removing-brace-on-first-line-of-piano-score.ly @@ -0,0 +1,44 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "keyboards, staff-notation, tweaks-and-overrides" + + texidoc = " +This snippet removes the first brace from a @code{PianoStaff} or a +@code{GrandStaff}. It may be useful when cutting and pasting the +engraved image into existing music. + +It uses @code{\\alterBroken}. + +" + doctitle = "Removing brace on first line of piano score" +} % begin verbatim + +someMusic = { + \once \override Staff.Clef.stencil = ##f + \once \override Staff.TimeSignature.stencil = ##f + \repeat unfold 3 c1 \break + \repeat unfold 5 c1 \break + \repeat unfold 5 c1 +} + +\score { + \new PianoStaff + << + \new Staff = "right" \relative c'' \someMusic + \new Staff = "left" \relative c' { \clef F \someMusic } + >> + \layout { + indent=75 + \context { + \PianoStaff + \alterBroken transparent #'(#t) SystemStartBrace + } + } +} diff --git a/Documentation/snippets/removing-connecting-bar-lines-on-staffgroup,-pianostaff,-or-grandstaff.ly b/Documentation/snippets/removing-connecting-bar-lines-on-staffgroup,-pianostaff,-or-grandstaff.ly index fd0fdce662..07982c9ba4 100644 --- a/Documentation/snippets/removing-connecting-bar-lines-on-staffgroup,-pianostaff,-or-grandstaff.ly +++ b/Documentation/snippets/removing-connecting-bar-lines-on-staffgroup,-pianostaff,-or-grandstaff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -18,7 +18,6 @@ a staff-by-staff basis. doctitle = "Removing connecting bar lines on StaffGroup PianoStaff or GrandStaff" } % begin verbatim - \relative c' { \new StaffGroup << \new Staff { diff --git a/Documentation/snippets/removing-the-first-empty-line.ly b/Documentation/snippets/removing-the-first-empty-line.ly index 6cad882e87..ed8e432f8b 100644 --- a/Documentation/snippets/removing-the-first-empty-line.ly +++ b/Documentation/snippets/removing-the-first-empty-line.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "breaks, staff-notation, tweaks-and-overrides" @@ -25,7 +25,6 @@ written. doctitle = "Removing the first empty line" } % begin verbatim - \layout { \context { \Staff \RemoveEmptyStaves diff --git a/Documentation/snippets/repeats-headword.ly b/Documentation/snippets/repeats-headword.ly index fa562f980a..b4f73273e7 100644 --- a/Documentation/snippets/repeats-headword.ly +++ b/Documentation/snippets/repeats-headword.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.5" +\version "2.18.0" \header { lsrtags = "headword" @@ -16,6 +16,9 @@ Repeats headword doctitle = "Repeats headword" } % begin verbatim +%% http://lsr.di.unimi.it/LSR/Item?id=821 +%% see also http://www.lilypond.org/doc/v2.18/Documentation/notation/repeats + % Beethoven, Op. 57 % Piano sonata 23 - Dem Grafen Franz von Brunswick Gewidmet % Movt II, Andante con moto diff --git a/Documentation/snippets/repeats.snippet-list b/Documentation/snippets/repeats.snippet-list index 3b55be22a8..2bffa5d033 100644 --- a/Documentation/snippets/repeats.snippet-list +++ b/Documentation/snippets/repeats.snippet-list @@ -1,5 +1,6 @@ adding-volta-brackets-to-additional-staves.ly centered-measure-numbers.ly +changing-the-default-bar-lines.ly cross-staff-tremolos.ly engraving-tremolos-with-floating-beams.ly isolated-percent-repeats.ly @@ -8,7 +9,6 @@ numbering-groups-of-measures.ly percent-repeat-count-visibility.ly percent-repeat-counter.ly positioning-segno-and-coda-with-line-break.ly -printing-a-repeat-sign-at-the-beginning-of-a-piece.ly setting-the-double-repeat-default-for-volte.ly shortening-volta-brackets.ly volta-below-chords.ly diff --git a/Documentation/snippets/replacing-default-midi-instrument-equalization.ly b/Documentation/snippets/replacing-default-midi-instrument-equalization.ly new file mode 100644 index 0000000000..2dcdd90f27 --- /dev/null +++ b/Documentation/snippets/replacing-default-midi-instrument-equalization.ly @@ -0,0 +1,67 @@ +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.21 +\version "2.19.21" + +\header { + + lsrtags = "scheme-language, midi" + + texidoc = "The default MIDI instrument equalizer can be replaced by + setting the @code{instrumentEqualizer} property in the @code{Score} + context to a user-defined Scheme procedure that uses a MIDI instrument + name as its argument along with a pair of fractions indicating the + minimum and maximum volumes respectively to be applied to that + specific instrument. + + The following example sets the minimum and maximum volumes for flute + and clarinet respectively." + + doctitle = "Replacing default MIDI instrument equalization" +} % begin verbatim + + +#(define my-instrument-equalizer-alist '()) + +#(set! my-instrument-equalizer-alist + (append + '( + ("flute" . (0.7 . 0.9)) + ("clarinet" . (0.3 . 0.6))) + my-instrument-equalizer-alist)) + +#(define (my-instrument-equalizer s) + (let ((entry (assoc s my-instrument-equalizer-alist))) + (if entry + (cdr entry)))) + +\score { + << + \new Staff { + \key g \major + \time 2/2 + \set Score.instrumentEqualizer = #my-instrument-equalizer + \set Staff.midiInstrument = #"flute" + \new Voice \relative { + r2 g''\mp g fis~ + 4 g8 fis e2~ + 4 d8 cis d2 + } + } + \new Staff { + \key g \major + \set Staff.midiInstrument = #"clarinet" + \new Voice \relative { + b'1\p a2. b8 a + g2. fis8 e + fis2 r + } + } + >> + \layout { } + \midi { } +} diff --git a/Documentation/snippets/rest-styles.ly b/Documentation/snippets/rest-styles.ly index 789f0b6d34..dc6645b4b1 100644 --- a/Documentation/snippets/rest-styles.ly +++ b/Documentation/snippets/rest-styles.ly @@ -1,49 +1,49 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.17.6" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.16 +\version "2.19.16" \header { lsrtags = "ancient-notation, rhythms, symbols-and-glyphs, tweaks-and-overrides" texidoc = " Rests may be used in various styles. - - - - " doctitle = "Rest styles" } % begin verbatim -\layout { - indent = 0 - \context { - \Staff - \remove "Time_signature_engraver" - } -} - \new Staff \relative c { + \omit Score.TimeSignature \cadenzaOn + \override Staff.Rest.style = #'mensural r\maxima^\markup \typewriter { mensural } r\longa r\breve r1 r2 r4 r8 r16 s32 s64 s128 s128 \bar "" + \break \override Staff.Rest.style = #'neomensural r\maxima^\markup \typewriter { neomensural } r\longa r\breve r1 r2 r4 r8 r16 s32 s64 s128 s128 \bar "" + \break \override Staff.Rest.style = #'classical r\maxima^\markup \typewriter { classical } r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128 \bar "" + \break + + \override Staff.Rest.style = #'z + r\maxima^\markup \typewriter { z-style } + r\longa r\breve r1 r2 r4 r8 r16 r32 r64 r128 s128 + \bar "" + \break \override Staff.Rest.style = #'default r\maxima^\markup \typewriter { default } diff --git a/Documentation/snippets/reverting-default-beam-endings.ly b/Documentation/snippets/reverting-default-beam-endings.ly index f8581769ed..b5f90ce205 100644 --- a/Documentation/snippets/reverting-default-beam-endings.ly +++ b/Documentation/snippets/reverting-default-beam-endings.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.19.40" \header { lsrtags = "rhythms, version-specific" @@ -18,7 +18,6 @@ new beaming endings: doctitle = "Reverting default beam endings" } % begin verbatim - \relative c'' { \time 12/8 @@ -26,6 +25,6 @@ new beaming endings: a8 a a a a a a a a a a a % Set new values for beam endings - \set Score.beatStructure = #'(3 4 3 2) + \set Score.beatStructure = 3,4,3,2 a8 a a a a a a a a a a a } diff --git a/Documentation/snippets/rhythmic-slashes.ly b/Documentation/snippets/rhythmic-slashes.ly index 6d47071c79..70ec77a604 100644 --- a/Documentation/snippets/rhythmic-slashes.ly +++ b/Documentation/snippets/rhythmic-slashes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.19.22" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -26,7 +26,6 @@ the appropriate duration). doctitle = "Rhythmic slashes" } % begin verbatim - % Macro to print single slash rs = { \once \override Rest.stencil = #ly:percent-repeat-item-interface::beat-slash @@ -36,7 +35,7 @@ rs = { } % Function to print a specified number of slashes -comp = #(define-music-function (parser location count) (integer?) +comp = #(define-music-function (count) (integer?) #{ \override Rest.stencil = #ly:percent-repeat-item-interface::beat-slash \override Rest.thickness = #0.48 diff --git a/Documentation/snippets/rhythms-headword.ly b/Documentation/snippets/rhythms-headword.ly index b0c99b7dc4..5a53ef2ed5 100644 --- a/Documentation/snippets/rhythms-headword.ly +++ b/Documentation/snippets/rhythms-headword.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "headword" @@ -16,6 +16,9 @@ Rhythms headword doctitle = "Rhythms headword" } % begin verbatim +%% http://lsr.di.unimi.it/LSR/Item?id=822 +%% see also http://lilypond.org/doc/v2.18/Documentation/notation/rhythms + % Beethoven, Op. 81a % Piano sonata 26 - Das Lebewohl % Movt II - Abwesenheit @@ -215,5 +218,4 @@ Rhythms headword 32 c'32 } - >> diff --git a/Documentation/snippets/rhythms.snippet-list b/Documentation/snippets/rhythms.snippet-list index 99c7a93f80..382302b03f 100644 --- a/Documentation/snippets/rhythms.snippet-list +++ b/Documentation/snippets/rhythms.snippet-list @@ -7,7 +7,6 @@ automatic-beam-subdivisions.ly automatically-change-durations.ly avoiding-collisions-with-chord-fingerings.ly beam-endings-in-score-context.ly -beam-grouping-in-7-8-time.ly beams-across-line-breaks.ly changing-beam-knee-gap.ly changing-form-of-multi-measure-rests.ly @@ -23,7 +22,7 @@ controlling-tuplet-bracket-visibility.ly creating-metronome-marks-in-markup-mode.ly engraving-ties-manually.ly engraving-tremolos-with-floating-beams.ly -entering-several-tuplets-using-only-one--times-command.ly +entering-several-tuplets-using-only-one--tuplet-command.ly flat-flags-and-beam-nibs.ly forcing-rehearsal-marks-to-start-from-a-given-letter-or-number.ly generating-custom-flags.ly @@ -45,6 +44,7 @@ positioning-multi-measure-rests.ly preventing-final-mark-from-removing-final-tuplet.ly printing-bar-numbers-at-regular-intervals.ly printing-bar-numbers-inside-boxes-or-circles.ly +printing-bar-numbers-with-changing-regular-intervals.ly printing-metronome-and-rehearsal-marks-below-the-staff.ly printing-music-with-different-time-signatures.ly printing-the-bar-number-for-the-first-measure.ly @@ -60,8 +60,11 @@ stemlets.ly strict-beat-beaming.ly subdividing-beams.ly three-sided-box.ly +time-signature-in-parentheses---method-3.ly +time-signature-in-parentheses.ly time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly tweaking-grace-layout-within-music.ly +user-defined-time-signatures.ly using-alternative-flag-styles.ly using-grace-note-slashes-with-normal-heads.ly using-ties-with-arpeggios.ly diff --git a/Documentation/snippets/satb-choir-template---four-staves.ly b/Documentation/snippets/satb-choir-template---four-staves.ly index 99d40cc6c6..001e5ed587 100644 --- a/Documentation/snippets/satb-choir-template---four-staves.ly +++ b/Documentation/snippets/satb-choir-template---four-staves.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.19.2" \header { lsrtags = "template, vocal-music" @@ -16,7 +16,6 @@ SATB choir template (four staves) doctitle = "SATB Choir template - four staves" } % begin verbatim - global = { \key c \major \time 4/4 @@ -48,28 +47,28 @@ basswords = \lyricmode { mi mi mi mi } \global \sopranonotes >> - \lyricsto "soprano" \new Lyrics \sopranowords + \new Lyrics \lyricsto "soprano" \sopranowords >> \new Staff << \new Voice = "alto" << \global \altonotes >> - \lyricsto "alto" \new Lyrics \altowords + \new Lyrics \lyricsto "alto" \altowords >> \new Staff << \new Voice = "tenor" << \global \tenornotes >> - \lyricsto "tenor" \new Lyrics \tenorwords + \new Lyrics \lyricsto "tenor" \tenorwords >> \new Staff << \new Voice = "bass" << \global \bassnotes >> - \lyricsto "bass" \new Lyrics \basswords + \new Lyrics \lyricsto "bass" \basswords >> >> } diff --git a/Documentation/snippets/scheme-language.snippet-list b/Documentation/snippets/scheme-language.snippet-list index a7bc17c61b..a963aea6be 100644 --- a/Documentation/snippets/scheme-language.snippet-list +++ b/Documentation/snippets/scheme-language.snippet-list @@ -5,14 +5,18 @@ center-text-below-hairpin-dynamics.ly changing--flageolet-mark-size.ly changing-properties-for-individual-grobs.ly creating-a-sequence-of-notes-on-various-pitches.ly +creating-custom-dynamics-in-midi-output.ly creating-double-digit-fingerings.ly +customizing-the-position-and-number-of-dots-in-repeat-sign-bar-lines.ly displaying-grob-ancestry.ly drawing-boxes-around-grobs.ly drawing-circles-around-various-objects.ly +flat-ties.ly generating-random-notes.ly generating-whole-scores-also-book-parts-in-scheme-without-using-the-parser.ly outputting-the-version-number.ly overriding-articulations-of-destinct-type.ly +replacing-default-midi-instrument-equalization.ly string-number-extender-lines.ly three-sided-box.ly transposing-pitches-with-minimum-accidentals-smart-transpose.ly diff --git a/Documentation/snippets/score-for-diatonic-accordion.ly b/Documentation/snippets/score-for-diatonic-accordion.ly index 46883755e6..9419a6893e 100644 --- a/Documentation/snippets/score-for-diatonic-accordion.ly +++ b/Documentation/snippets/score-for-diatonic-accordion.ly @@ -1,14 +1,13 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.30 -\version "2.17.30" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.19.22" \header { - lsrtags = "template, real-music, specific-notation" + lsrtags = "real-music, specific-notation, template" texidoc = " A template to write a score for a diatonic accordion. @@ -53,15 +52,10 @@ push-parts and which the pull-parts. 3. For each pull- or push-part translate the piano notes to the according tabulature representation. - -This snippet comes with a useful optional macro for the jEdit text -editor. - " doctitle = "Score for diatonic accordion" } % begin verbatim - verse = \lyricmode { Wie gross bist du! Wie gross bist du! } harmonies = \new ChordNames \chordmode { @@ -81,12 +75,13 @@ staffTabLine = \new Staff \with { \remove "Clef_engraver" } { \override Staff.StaffSymbol.line-positions = #'(0) - % Shows one horizontal line. The vertical line (simulating a bar-line) is simulated with a gridline + % Shows one horizontal line. The vertical line + % (simulating a bar-line) is simulated with a gridline \set Staff.midiInstrument = #"choir aahs" \key c \major \relative c'' { - % disable the following line to see the the noteheads while writing the song + % disable the following line to see the noteheads while writing the song \NoNoteHead \override NoteHead.no-ledgers = ##t @@ -96,7 +91,8 @@ staffTabLine = \new Staff \with { % 2. uncomment the line \NoNoteHead % 3. compile % 4. Mark the positions on which push/pull changes. - % In the score-picture click on the position the push- or pull-part starts + % In the score-picture click on the position + % the push- or pull-part starts % (on the noteHead, the cursor will change to a hand-icon). % The cursor in the source code will jump just at this position. % a) If a push-part starts there, replace the 'c' by an 'e[' @@ -105,7 +101,8 @@ staffTabLine = \new Staff \with { % 6. For the pull-parts overwrite the 'c' with 's' % 7. For every push-part replace the last 'c' with 'e]' % 8. Switch into 'insert-mode' again - % 9. At last it should look lik e.g. (s s e[ c | c c c c c c c c | c c c c c c e] s s) + % 9. At last it should look like e.g. + % (s s e[ c | c c c c c c c c | c c c c c c e] s s) % 10. re-enable the line \NoNoteHead \autoBeamOff \ZeroBeam @@ -113,13 +110,13 @@ staffTabLine = \new Staff \with { } } -%{ -%} - % Accordion melody in tabulator score % 1. Place a copy of the piano melody below -% 2. Separate piano melody into pull- and push-parts according to the staffTabLine you've already made -% 3. For each line: Double the line. Remark the 1st one (Keeps unchanged as reference) and then change the second line using the transformation paper +% 2. Separate piano melody into pull- and push-parts +% according to the staffTabLine you've already made +% 3. For each line: Double the line. Remark the 1st one +% (Keeps unchanged as reference) and then change the second +% line using the transformation paper % or the macros 'conv2diaton push.bsh' and 'conv2diaton pull.bsh' % Tips: % - In jEdit Search & Replace mark the Option 'Keep Dialog' @@ -137,9 +134,11 @@ AccordionTabTwoCBesDur = { AccordionTab= { \dynamicUp % 1. Place a copy of the piano melody above - % 2. Separate piano melody into pull- and push-parts according to the staffTabLine you've already made - % 3. For each line: Double the line. Remark the 1st one (Keeps unchanged as reference) and then - % change the second line using the transformation paper + % 2. Separate piano melody into pull- and push-parts + % according to the staffTabLine you've already made + % 3. For each line: Double the line. Remark the 1st one + % (Keeps unchanged as reference) and then + % change the second line using the transformation paper % Tips: % - In jEdit Search & Replace mark the Option 'Keep Dialog' % - @@ -177,7 +176,11 @@ staffVoice = \new Staff = astaffvoice { \clef treble { \context Voice = "melodyVoi" - { 8 8 8 | 4 | 2 r8 } + { + 8 8 8 | + 4 | + 2 r8 + } \bar "|." } } @@ -195,7 +198,7 @@ staffAccordionMel = } AltOn = -#(define-music-function (parser location mag) (number?) +#(define-music-function (mag) (number?) #{ \override Stem.length = #(* 7.0 mag) \override NoteHead.font-size = #(inexact->exact (* (/ 6.0 (log 2.0)) (log mag))) #}) @@ -214,7 +217,8 @@ staffBassRhytm = \override Score.GridLine.extra-offset = #'( 13.0 . 0.0 ) % x.y \override Staff.StaffSymbol.line-positions = #'( 0 ) - % Shows one horizontal line. The vertical line (simulating a bar-line) is simulated by a grid + % Shows one horizontal line. The vertical line + % (simulating a bar-line) is simulated by a grid % Search for 'grid' in this page to find all related functions \time 4/4 { @@ -244,4 +248,3 @@ staffBassRhytm = \lyricsto VoiceBassRhytm \LyricBassRhythmI >> } -%} diff --git a/Documentation/snippets/screech-and-boink.ly b/Documentation/snippets/screech-and-boink.ly index 86b9fba5e5..36d3fc1771 100644 --- a/Documentation/snippets/screech-and-boink.ly +++ b/Documentation/snippets/screech-and-boink.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "headword" diff --git a/Documentation/snippets/separating-key-cancellations-from-key-signature-changes.ly b/Documentation/snippets/separating-key-cancellations-from-key-signature-changes.ly index be7a8967d8..044bd68e61 100644 --- a/Documentation/snippets/separating-key-cancellations-from-key-signature-changes.ly +++ b/Documentation/snippets/separating-key-cancellations-from-key-signature-changes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "pitches, tweaks-and-overrides" diff --git a/Documentation/snippets/setting-hairpin-behavior-at-bar-lines.ly b/Documentation/snippets/setting-hairpin-behavior-at-bar-lines.ly index 067fbbfd2c..b0f930c87c 100644 --- a/Documentation/snippets/setting-hairpin-behavior-at-bar-lines.ly +++ b/Documentation/snippets/setting-hairpin-behavior-at-bar-lines.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides" @@ -18,7 +18,6 @@ by overriding the @code{'to-barline} property. doctitle = "Setting hairpin behavior at bar lines" } % begin verbatim - \relative c'' { e4\< e2. e1\! diff --git a/Documentation/snippets/setting-system-separators.ly b/Documentation/snippets/setting-system-separators.ly index d7d4d2cda2..dd3b47068a 100644 --- a/Documentation/snippets/setting-system-separators.ly +++ b/Documentation/snippets/setting-system-separators.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "paper-and-layout, staff-notation, tweaks-and-overrides" @@ -18,9 +18,9 @@ default. doctitle = "Setting system separators" } % begin verbatim - \paper { system-separator-markup = \slashSeparator + line-width = 120 } notes = \relative c' { diff --git a/Documentation/snippets/setting-the-double-repeat-default-for-volte.ly b/Documentation/snippets/setting-the-double-repeat-default-for-volte.ly index c469c52e64..40ce83508c 100644 --- a/Documentation/snippets/setting-the-double-repeat-default-for-volte.ly +++ b/Documentation/snippets/setting-the-double-repeat-default-for-volte.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.5" +\version "2.18.0" \header { lsrtags = "repeats" diff --git a/Documentation/snippets/setting-the-minimum-length-of-hairpins.ly b/Documentation/snippets/setting-the-minimum-length-of-hairpins.ly index dea361c49c..56430babee 100644 --- a/Documentation/snippets/setting-the-minimum-length-of-hairpins.ly +++ b/Documentation/snippets/setting-the-minimum-length-of-hairpins.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks" @@ -17,9 +17,9 @@ If hairpins are too short, they can be lengthened by modifying the doctitle = "Setting the minimum length of hairpins" } % begin verbatim - \relative c'' { c4\< c\! d\> e\! + << f1 { s4 s\< s\> s\! } >> \override Hairpin.minimum-length = #5 << f1 { s4 s\< s\> s\! } >> } diff --git a/Documentation/snippets/shortening-volta-brackets.ly b/Documentation/snippets/shortening-volta-brackets.ly index 611057d4cb..f1aa919411 100644 --- a/Documentation/snippets/shortening-volta-brackets.ly +++ b/Documentation/snippets/shortening-volta-brackets.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "repeats" @@ -19,7 +19,6 @@ lasts one measure, which is a duration of 3/4. doctitle = "Shortening volta brackets" } % begin verbatim - \relative c'' { \time 3/4 c4 c c diff --git a/Documentation/snippets/showing-chords-at-changes.ly b/Documentation/snippets/showing-chords-at-changes.ly index cc3542bd4f..e946df6b6d 100644 --- a/Documentation/snippets/showing-chords-at-changes.ly +++ b/Documentation/snippets/showing-chords-at-changes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords" @@ -17,10 +17,10 @@ chord changes. doctitle = "Showing chords at changes" } % begin verbatim - harmonies = \chordmode { c1:m c:m \break c:m c:m d } + << \new ChordNames { \set chordChanges = ##t diff --git a/Documentation/snippets/showing-the-same-articulation-above-and-below-a-note-or-chord.ly b/Documentation/snippets/showing-the-same-articulation-above-and-below-a-note-or-chord.ly index ec67a11657..2277eb5f36 100644 --- a/Documentation/snippets/showing-the-same-articulation-above-and-below-a-note-or-chord.ly +++ b/Documentation/snippets/showing-the-same-articulation-above-and-below-a-note-or-chord.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks, tweaks-and-overrides, version-specific" @@ -28,7 +28,6 @@ The direction will always be above, but one can tweak this via a doctitle = "Showing the same articulation above and below a note or chord" } % begin verbatim - % The same as \flageolet, just a little smaller smallFlageolet = #(let ((m (make-articulation "flageolet"))) diff --git a/Documentation/snippets/simple-lead-sheet.ly b/Documentation/snippets/simple-lead-sheet.ly index b6f3b443c8..5a3c190a95 100644 --- a/Documentation/snippets/simple-lead-sheet.ly +++ b/Documentation/snippets/simple-lead-sheet.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords" @@ -16,7 +16,6 @@ When put together, chord names, a melody, and lyrics form a lead sheet: doctitle = "Simple lead sheet" } % begin verbatim - << \chords { c2 g:sus4 f e } \relative c'' { diff --git a/Documentation/snippets/simultaneous-headword.ly b/Documentation/snippets/simultaneous-headword.ly index a08838f8f8..b8462ffaba 100644 --- a/Documentation/snippets/simultaneous-headword.ly +++ b/Documentation/snippets/simultaneous-headword.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "headword" @@ -16,6 +16,9 @@ Simultaneous notes doctitle = "Simultaneous headword" } % begin verbatim +%% http://lsr.di.unimi.it/LSR/Item?id=825 +%% see also http://lilypond.org/doc/v2.18/Documentation/notation/simultaneous-notes + \include "english.ly" % NR 1.5 Simultaneous notes diff --git a/Documentation/snippets/simultaneous-notes.snippet-list b/Documentation/snippets/simultaneous-notes.snippet-list index c2be0bb2e3..cd3e01f1de 100644 --- a/Documentation/snippets/simultaneous-notes.snippet-list +++ b/Documentation/snippets/simultaneous-notes.snippet-list @@ -9,3 +9,4 @@ forcing-horizontal-shift-of-notes.ly making-an-object-invisible-with-the-transparent-property.ly moving-dotted-notes-in-polyphony.ly suppressing-warnings-for-clashing-note-columns.ly +two--partcombine-pairs-on-one-staff.ly diff --git a/Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly b/Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly index f4b72259b9..3cdf85b1de 100644 --- a/Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly +++ b/Documentation/snippets/single-staff-template-with-notes,-lyrics,-and-chords.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords, really-simple, template, vocal-music" @@ -17,7 +17,6 @@ chords. doctitle = "Single staff template with notes lyrics and chords" } % begin verbatim - melody = \relative c' { \clef treble \key c \major diff --git a/Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly b/Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly index 4cd409c667..64357e06b9 100644 --- a/Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly +++ b/Documentation/snippets/single-staff-template-with-notes,-lyrics,-chords-and-frets.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords, template, vocal-music" @@ -17,7 +17,6 @@ fret diagrams. doctitle = "Single staff template with notes lyrics chords and frets" } % begin verbatim - verseI = \lyricmode { \set stanza = #"1." This is the first verse diff --git a/Documentation/snippets/single-staff-template-with-notes-and-chords.ly b/Documentation/snippets/single-staff-template-with-notes-and-chords.ly index 75272f52f7..2853168646 100644 --- a/Documentation/snippets/single-staff-template-with-notes-and-chords.ly +++ b/Documentation/snippets/single-staff-template-with-notes-and-chords.ly @@ -1,10 +1,11 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.16.0" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.28 +\version "2.19.28" \header { lsrtags = "chords, really-simple, template" @@ -17,7 +18,6 @@ Want to prepare a lead sheet with a melody and chords? Look no further! doctitle = "Single staff template with notes and chords" } % begin verbatim - melody = \relative c' { \clef treble \key c \major @@ -29,7 +29,7 @@ melody = \relative c' { harmonies = \chordmode { c4:m f:min7 g:maj c:aug - d2:dim b:sus + d2:dim b4:5 e:sus } \score { diff --git a/Documentation/snippets/single-staff-template-with-notes-and-lyrics.ly b/Documentation/snippets/single-staff-template-with-notes-and-lyrics.ly index 244baef401..8750bbc794 100644 --- a/Documentation/snippets/single-staff-template-with-notes-and-lyrics.ly +++ b/Documentation/snippets/single-staff-template-with-notes-and-lyrics.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "really-simple, template, vocal-music" @@ -19,7 +19,6 @@ beaming, change or comment out the relevant line. doctitle = "Single staff template with notes and lyrics" } % begin verbatim - melody = \relative c' { \clef treble \key c \major diff --git a/Documentation/snippets/single-staff-template-with-only-notes.ly b/Documentation/snippets/single-staff-template-with-only-notes.ly index 40bbd12cb0..9eed6bf220 100644 --- a/Documentation/snippets/single-staff-template-with-only-notes.ly +++ b/Documentation/snippets/single-staff-template-with-only-notes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "really-simple, template" @@ -18,7 +18,6 @@ add notes, and you're finished! doctitle = "Single staff template with only notes" } % begin verbatim - melody = \relative c' { \clef treble \key c \major diff --git a/Documentation/snippets/skips-in-lyric-mode-2.ly b/Documentation/snippets/skips-in-lyric-mode-2.ly index e9e25e9756..90e03b195c 100644 --- a/Documentation/snippets/skips-in-lyric-mode-2.ly +++ b/Documentation/snippets/skips-in-lyric-mode-2.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "really-simple, rhythms, vocal-music" @@ -18,7 +18,6 @@ or underscores (@code{_}) are available.So for example: doctitle = "Skips in lyric mode (2)" } % begin verbatim - << \relative c'' { a4 b c d } \new Lyrics \lyricmode { a4 "" _ gap } diff --git a/Documentation/snippets/skips-in-lyric-mode.ly b/Documentation/snippets/skips-in-lyric-mode.ly index 6cea02f255..eb74ba39c0 100644 --- a/Documentation/snippets/skips-in-lyric-mode.ly +++ b/Documentation/snippets/skips-in-lyric-mode.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "really-simple, rhythms, vocal-music" @@ -18,7 +18,6 @@ mode. In other situations, for example, when entering lyrics, using the doctitle = "Skips in lyric mode" } % begin verbatim - << \relative c'' { a1 | a } \new Lyrics \lyricmode { \skip 1 bla1 } diff --git a/Documentation/snippets/slides-in-tablature.ly b/Documentation/snippets/slides-in-tablature.ly index 760135cda9..d1068720a8 100644 --- a/Documentation/snippets/slides-in-tablature.ly +++ b/Documentation/snippets/slides-in-tablature.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "fretted-strings" @@ -42,6 +42,9 @@ slides = { \override Glissando.springs-and-rods = #ly:spanner::set-spacing-rods \override Glissando.thickness = #2 + \omit StringNumber + % or: + %\override StringNumber.stencil = ##f } } } diff --git a/Documentation/snippets/snap-pizzicato-or-bartok-pizzicato.ly b/Documentation/snippets/snap-pizzicato-or-bartok-pizzicato.ly index 9e3e51fd1a..82694c9b53 100644 --- a/Documentation/snippets/snap-pizzicato-or-bartok-pizzicato.ly +++ b/Documentation/snippets/snap-pizzicato-or-bartok-pizzicato.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "expressive-marks, unfretted-strings" diff --git a/Documentation/snippets/specific-notation.snippet-list b/Documentation/snippets/specific-notation.snippet-list index 218c52f2b9..bc43d7d3ba 100644 --- a/Documentation/snippets/specific-notation.snippet-list +++ b/Documentation/snippets/specific-notation.snippet-list @@ -1,5 +1,5 @@ accordion-discant-symbols.ly -accordion-registers.ly +accordion-register-symbols.ly adding-bar-lines-to-chordnames-context.ly adding-drum-parts.ly adding-fingerings-to-tablatures.ly @@ -15,6 +15,7 @@ contemporary-glissando.ly controlling-the-placement-of-chord-fingerings.ly creating-blank-staves.ly custodes.ly +customize-drumpitchnames,-drumstyletable-and-drumpitchtable-in-layout-and-midi.ly demo-midiinstruments.ly embedding-native-postscript-in-a--markup-block.ly engravers-one-by-one.ly @@ -26,5 +27,5 @@ laissez-vibrer-ties.ly score-for-diatonic-accordion.ly time-signature-in-parentheses---method-3.ly time-signature-in-parentheses.ly -transcription-of-ancient-music-with-incipit.ly +using-an-extra-voice-for-breaks.ly woodwind-diagrams-listing.ly diff --git a/Documentation/snippets/staff-headword.ly b/Documentation/snippets/staff-headword.ly index 6e81017f84..056cfca008 100644 --- a/Documentation/snippets/staff-headword.ly +++ b/Documentation/snippets/staff-headword.ly @@ -4,8 +4,8 @@ % and then run scripts/auxiliar/makelsr.py % % This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% Note: this file works from version 2.19.0 +\version "2.19.0" \include "catalan.ly" \header { @@ -43,22 +43,13 @@ trompette = \relative do'' { do8-. r8 sib4-> | } -tambourin = \relative do' { +tambourin = \drummode { \time 2/4 - r8 do16 do do8 do | - r8 do16 do do8 do | - r8 do r do | - r8 do16 do do8 do | - r8 do r do | -} - -tambourinMidi = \drummode { - \time 2/4 - r8 tamb16 tamb tamb8 tamb | - r8 tamb16 tamb tamb8 tamb | - r8 tamb r tamb | - r8 tamb16 tamb tamb8 tamb | - r8 tamb r tamb | + r8 tamb16 16 8 8 | + r8 16 16 8 8 | + r8 8 r8 8 | + r8 16 16 8 8 | + r8 8 r8 8 | } upper = \relative do' { @@ -110,7 +101,7 @@ lower = \relative do { \trompette } \context DrumStaff = "tambourin" { - \tambourinMidi + \tambourin } \context Staff = "piano" << \upper diff --git a/Documentation/snippets/staff-notation.snippet-list b/Documentation/snippets/staff-notation.snippet-list index 0a2df88f19..bfb3706161 100644 --- a/Documentation/snippets/staff-notation.snippet-list +++ b/Documentation/snippets/staff-notation.snippet-list @@ -6,24 +6,30 @@ adding-orchestral-cues-to-a-vocal-score.ly adding-timing-marks-to-long-glissandi.ly alternative-bar-numbering.ly centered-measure-numbers.ly +changing-the-default-bar-lines.ly changing-the-number-of-lines-in-a-staff.ly changing-the-staff-size.ly creating-blank-staves.ly +creating-custom-key-signatures.ly creating-double-digit-fingerings.ly cross-staff-stems.ly display-bracket-with-only-one-staff-in-a-system.ly +extending-a-trillspanner.ly extending-glissandi-across-repeats.ly +flat-ties.ly forcing-measure-width-to-adapt-to-metronomemarks-width.ly glissandi-can-skip-grobs.ly how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-1.ly how-to-print-two-rehearsal-marks-above-and-below-the-same-barline-method-2.ly incipit.ly inserting-score-fragments-above-a-staff,-as-markups.ly +let-tabstaff-print-the-topmost-string-at-bottom.ly letter-tablature-formatting.ly making-glissandi-breakable.ly making-some-staff-lines-thicker-than-the-others.ly measure-counter.ly mensurstriche-layout-bar-lines-between-the-staves.ly +modifying-the-ottava-spanner-slope.ly nesting-staves.ly non-traditional-key-signatures.ly numbering-groups-of-measures.ly @@ -31,12 +37,14 @@ orchestra,-choir-and-piano-template.ly putting-lyrics-inside-the-staff.ly quoting-another-voice-with-transposition.ly quoting-another-voice.ly +removing-brace-on-first-line-of-piano-score.ly removing-the-first-empty-line.ly setting-system-separators.ly tick-bar-lines.ly time-signature-in-parentheses---method-3.ly time-signature-in-parentheses.ly tweaking-clef-properties.ly +two--partcombine-pairs-on-one-staff.ly use-square-bracket-at-the-start-of-a-staff-group.ly using-autochange-with-more-than-one-voice.ly vertical-aligned-staffgroups-without-connecting-systemstartbar.ly diff --git a/Documentation/snippets/stand-alone-two-column-markup.ly b/Documentation/snippets/stand-alone-two-column-markup.ly index dd0005c432..a5371fab3f 100644 --- a/Documentation/snippets/stand-alone-two-column-markup.ly +++ b/Documentation/snippets/stand-alone-two-column-markup.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "text" diff --git a/Documentation/snippets/stem-and-beam-behavior-in-tablature.ly b/Documentation/snippets/stem-and-beam-behavior-in-tablature.ly index b5960df497..d8636cf383 100644 --- a/Documentation/snippets/stem-and-beam-behavior-in-tablature.ly +++ b/Documentation/snippets/stem-and-beam-behavior-in-tablature.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "fretted-strings" @@ -18,7 +18,6 @@ example. doctitle = "Stem and beam behavior in tablature" } % begin verbatim - \new TabStaff { \relative c { \tabFullNotation diff --git a/Documentation/snippets/stemlets.ly b/Documentation/snippets/stemlets.ly index 0f1ea5e818..da3b382032 100644 --- a/Documentation/snippets/stemlets.ly +++ b/Documentation/snippets/stemlets.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.30" +\version "2.18.0" \header { lsrtags = "contemporary-notation, rhythms" @@ -30,7 +30,6 @@ the different notations. doctitle = "Stemlets" } % begin verbatim - \paper { ragged-right = ##f } { diff --git a/Documentation/snippets/strict-beat-beaming.ly b/Documentation/snippets/strict-beat-beaming.ly index 238479a413..2982663604 100644 --- a/Documentation/snippets/strict-beat-beaming.ly +++ b/Documentation/snippets/strict-beat-beaming.ly @@ -1,26 +1,23 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { + lsrtags = "rhythms" + texidoc = " Beamlets can be set to point in the direction of the beat to which they -belong. The first beam avoids sticking out flags (the default); -the second beam strictly follows the beat. -" +belong. The first beam avoids sticking out flags (the default); the +second beam strictly follows the beat. +" doctitle = "Strict beat beaming" - - lsrtags = "rhythms" } % begin verbatim - - \relative c'' { \time 6/8 a8. a16 a a diff --git a/Documentation/snippets/string-number-extender-lines.ly b/Documentation/snippets/string-number-extender-lines.ly index 726e69b778..286c20bcc9 100644 --- a/Documentation/snippets/string-number-extender-lines.ly +++ b/Documentation/snippets/string-number-extender-lines.ly @@ -1,14 +1,13 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.19.22" \header { - lsrtags = "editorial-annotations, text, fretted-strings, tweaks-and-overrides, scheme-language" + lsrtags = "editorial-annotations, fretted-strings, scheme-language, text, tweaks-and-overrides" texidoc = " Make an extender line for string number indications, showing that a @@ -18,15 +17,15 @@ series of notes is supposed to be played all on the same string. doctitle = "String number extender lines" } % begin verbatim - stringNumberSpanner = -#(define-music-function (parser location StringNumber) (string?) - #{ - \override TextSpanner.style = #'solid - \override TextSpanner.font-size = #-5 - \override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER - \override TextSpanner.bound-details.left.text = \markup { \circle \number #StringNumber } - #}) + #(define-music-function (StringNumber) (string?) + #{ + \override TextSpanner.style = #'solid + \override TextSpanner.font-size = #-5 + \override TextSpanner.bound-details.left.stencil-align-dir-y = #CENTER + \override TextSpanner.bound-details.left.text = + \markup { \circle \number $StringNumber } + #}) \relative c { diff --git a/Documentation/snippets/string-quartet-template-simple.ly b/Documentation/snippets/string-quartet-template-simple.ly index af78c3895d..e435da4877 100644 --- a/Documentation/snippets/string-quartet-template-simple.ly +++ b/Documentation/snippets/string-quartet-template-simple.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "really-simple, template, unfretted-strings" @@ -17,7 +17,6 @@ This template demonstrates a simple string quartet. It also uses a doctitle = "String quartet template (simple)" } % begin verbatim - global= { \time 4/4 \key c \major diff --git a/Documentation/snippets/string-quartet-template-with-separate-parts.ly b/Documentation/snippets/string-quartet-template-with-separate-parts.ly index 66dc41a866..7efde9f3a7 100644 --- a/Documentation/snippets/string-quartet-template-with-separate-parts.ly +++ b/Documentation/snippets/string-quartet-template-with-separate-parts.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "preparing-parts, template, unfretted-strings" @@ -28,7 +28,6 @@ Do not forget to remove specified comments when using separate files! doctitle = "String quartet template with separate parts" } % begin verbatim - %%%%% piece.ly %%%%% (This is the global definitions file) diff --git a/Documentation/snippets/subdividing-beams.ly b/Documentation/snippets/subdividing-beams.ly index e7080e65a5..05f6b9bc9b 100644 --- a/Documentation/snippets/subdividing-beams.ly +++ b/Documentation/snippets/subdividing-beams.ly @@ -1,10 +1,11 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.17.11" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.40 +\version "2.19.40" \header { lsrtags = "rhythms" @@ -16,18 +17,23 @@ entire groups of notes. This behavior can be modified to subdivide the beams into sub-groups by setting the property @code{subdivideBeams}. When set, multiple beams will be subdivided at intervals defined by the current value of @code{baseMoment} by reducing the multiple beams to -just one beam between the sub-groups. Note that @code{baseMoment} -defaults to one over the denominator of the current time signature if -not set explicitly. It must be set to a fraction giving the duration of -the beam sub-group using the @code{ly:make-moment} function, as shown -in this snippet. Also, when @code{baseMoment} is changed, -@code{beatStructure} should also be changed to match the new -@code{baseMoment}: +the number of beams that indicates the metric value of the subdivision. +If the group following the division is shorter than the current metric +value (usually because the beam is incomplete) the number of beams +reflects the longest possible subdivision group. However, if there is +only one note left after the division this restriction isn't applied. +Note that @code{baseMoment} defaults to one over the denominator of the +current time signature if not set explicitly. It must be set to a +fraction giving the duration of the beam sub-group using the +@code{ly:make-moment} function, as shown in this snippet. Also, when +@code{baseMoment} is changed, @code{beatStructure} should also be +changed to match the new @code{baseMoment}: " doctitle = "Subdividing beams" } % begin verbatim + \relative c'' { c32[ c c c c c c c] \set subdivideBeams = ##t @@ -35,11 +41,22 @@ in this snippet. Also, when @code{baseMoment} is changed, % Set beam sub-group length to an eighth note \set baseMoment = #(ly:make-moment 1/8) - \set beatStructure = #'(2 2 2 2) + \set beatStructure = 2,2,2,2 c32[ c c c c c c c] % Set beam sub-group length to a sixteenth note \set baseMoment = #(ly:make-moment 1/16) - \set beatStructure = #'(4 4 4 4) + \set beatStructure = 4,4,4,4 c32[ c c c c c c c] + + % Shorten beam by 1/32 + \set baseMoment = #(ly:make-moment 1/8) + \set beatStructure = 2,2,2,2 + c32[ c c c c c c] r32 + + % Shorten beam by 3/32 + \set baseMoment = #(ly:make-moment 1/8) + \set beatStructure = 2,2,2,2 + c32[ c c c c] r16. + r2 } diff --git a/Documentation/snippets/suppressing-warnings-for-clashing-note-columns.ly b/Documentation/snippets/suppressing-warnings-for-clashing-note-columns.ly index 0ecae8edd5..40b6b8678f 100644 --- a/Documentation/snippets/suppressing-warnings-for-clashing-note-columns.ly +++ b/Documentation/snippets/suppressing-warnings-for-clashing-note-columns.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "simultaneous-notes, tweaks-and-overrides" @@ -24,14 +24,11 @@ used with care. doctitle = "Suppressing warnings for clashing note columns" } % begin verbatim - ignore = \override NoteColumn.ignore-collision = ##t \relative c' { - << - \ignore - { \stemDown f2 g } - \\ - { c2 c, } + \new Staff << + \new Voice{ \ignore \stemDown f2 g } + \new Voice{ c2 \stemDown c, } >> } diff --git a/Documentation/snippets/symbols-and-glyphs.snippet-list b/Documentation/snippets/symbols-and-glyphs.snippet-list index 920987ba49..e8b00227c8 100644 --- a/Documentation/snippets/symbols-and-glyphs.snippet-list +++ b/Documentation/snippets/symbols-and-glyphs.snippet-list @@ -1,5 +1,5 @@ accordion-discant-symbols.ly -accordion-registers.ly +accordion-register-symbols.ly adding-indicators-to-staves-which-get-split-after-a-break.ly ancient-fonts.ly breathing-signs.ly @@ -7,6 +7,7 @@ broken-crescendo-hairpin.ly caesura-railtracks-with-fermata.ly changing--flageolet-mark-size.ly custodes.ly +customizing-the-position-and-number-of-dots-in-repeat-sign-bar-lines.ly fingering-symbols-for-wind-instruments.ly how-to-put-ties-between-syllables-in-lyrics.ly positioning-segno-and-coda-with-line-break.ly diff --git a/Documentation/snippets/syntax-and-expressions.snippet-list b/Documentation/snippets/syntax-and-expressions.snippet-list index f0e653afb0..fe78d91421 100644 --- a/Documentation/snippets/syntax-and-expressions.snippet-list +++ b/Documentation/snippets/syntax-and-expressions.snippet-list @@ -1,3 +1,4 @@ combining-two-parts-on-the-same-staff.ly -entering-several-tuplets-using-only-one--times-command.ly +entering-several-tuplets-using-only-one--tuplet-command.ly +extending-a-trillspanner.ly vertical-aligned-staffgroups-without-connecting-systemstartbar.ly diff --git a/Documentation/snippets/table-of-contents.ly b/Documentation/snippets/table-of-contents.ly index 51542ae679..d96f34540f 100644 --- a/Documentation/snippets/table-of-contents.ly +++ b/Documentation/snippets/table-of-contents.ly @@ -1,16 +1,16 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "paper-and-layout" texidoc = " -A table of contents is included using @code{\\markuplist +A table of contents is included using @code{\\markuplines \\table-of-contents}. The TOC items are added with the @code{\\tocItem} command. @@ -18,7 +18,6 @@ A table of contents is included using @code{\\markuplist doctitle = "Table of contents" } % begin verbatim - #(set-default-paper-size "a6") \book { diff --git a/Documentation/snippets/template.snippet-list b/Documentation/snippets/template.snippet-list index 45be61d85b..a1f03e998d 100644 --- a/Documentation/snippets/template.snippet-list +++ b/Documentation/snippets/template.snippet-list @@ -1,5 +1,4 @@ ancient-notation-template----modern-transcription-of-gregorian-music.ly -ancient-notation-template----modern-transcription-of-mensural-music.ly anglican-psalm-template.ly hymn-template.ly jazz-combo-template.ly diff --git a/Documentation/snippets/text-headword.ly b/Documentation/snippets/text-headword.ly index 0bcd3763ef..29849eb3a3 100644 --- a/Documentation/snippets/text-headword.ly +++ b/Documentation/snippets/text-headword.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.28" +\version "2.18.0" \header { lsrtags = "headword" @@ -16,6 +16,9 @@ Text headword doctitle = "Text headword" } % begin verbatim +%% http://lsr.di.unimi.it/LSR/Item?id=829 +%% see also http://lilypond.org/doc/v2.18/Documentation/notation/text + \include "english.ly" % NR 1.8 Text @@ -96,7 +99,7 @@ Text headword c''32 df''32 ef''32 - \acciaccatura { df'' ef'' } + \acciaccatura { df''[ ef'' ] } f''8 ef''16 df''16 diff --git a/Documentation/snippets/text.snippet-list b/Documentation/snippets/text.snippet-list index e89b570d89..e87e87ed25 100644 --- a/Documentation/snippets/text.snippet-list +++ b/Documentation/snippets/text.snippet-list @@ -1,3 +1,4 @@ +adding-markups-in-a-tablature.ly adding-the-current-date-to-a-score.ly adjusting-lyrics-vertical-spacing.ly aligning-and-centering-instrument-names.ly @@ -5,7 +6,7 @@ aligning-objects-created-with-the--mark-command.ly aligning-syllables-with-melisma.ly blanking-staff-lines-using-the--whiteout-command.ly center-text-below-hairpin-dynamics.ly -centering-markup-on-note-heads-automatically.ly +changing-ottava-text.ly changing-the-default-text-font-family.ly combining-dynamics-with-markup-texts.ly combining-two-parts-on-the-same-staff.ly @@ -22,6 +23,7 @@ multi-measure-rest-markup.ly ottava-text.ly outputting-the-version-number.ly piano-template-with-centered-lyrics.ly +printing-bar-numbers-with-changing-regular-intervals.ly printing-marks-at-the-end-of-a-line.ly printing-marks-on-every-staff.ly printing-text-from-right-to-left.ly diff --git a/Documentation/snippets/three-sided-box.ly b/Documentation/snippets/three-sided-box.ly index 2bde359a6c..3e1080dcb7 100644 --- a/Documentation/snippets/three-sided-box.ly +++ b/Documentation/snippets/three-sided-box.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "rhythms, scheme-language, text" @@ -17,7 +17,6 @@ around some text (or other markup). doctitle = "Three-sided box" } % begin verbatim - % New command to add a three sided box, with sides north, west and south % Based on the box-stencil command defined in scm/stencil.scm % Note that ";;" is used to comment a line in Scheme diff --git a/Documentation/snippets/tick-bar-lines.ly b/Documentation/snippets/tick-bar-lines.ly index 661ee65ee2..decd0f64ad 100644 --- a/Documentation/snippets/tick-bar-lines.ly +++ b/Documentation/snippets/tick-bar-lines.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "staff-notation" @@ -17,7 +17,6 @@ only for coordination and is not meant to imply any rhythmic stress. doctitle = "Tick bar lines" } % begin verbatim - \relative c' { \set Score.defaultBarType = #"'" c4 d e f diff --git a/Documentation/snippets/time-signature-in-parentheses---method-3.ly b/Documentation/snippets/time-signature-in-parentheses---method-3.ly index 5eebaacc09..32d888be0e 100644 --- a/Documentation/snippets/time-signature-in-parentheses---method-3.ly +++ b/Documentation/snippets/time-signature-in-parentheses---method-3.ly @@ -1,13 +1,13 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { - lsrtags = "specific-notation, staff-notation, tweaks-and-overrides" + lsrtags = "rhythms, specific-notation, staff-notation, tweaks-and-overrides" texidoc = " Another way to put the time signature in parenthesis @@ -16,7 +16,6 @@ Another way to put the time signature in parenthesis doctitle = "Time signature in parentheses - method 3" } % begin verbatim - \relative c'' { \override Staff.TimeSignature.stencil = #(lambda (grob) (parenthesize-stencil (ly:time-signature::print grob) 0.1 0.4 0.4 0.1 )) diff --git a/Documentation/snippets/time-signature-in-parentheses.ly b/Documentation/snippets/time-signature-in-parentheses.ly index 257034d959..3461b568e4 100644 --- a/Documentation/snippets/time-signature-in-parentheses.ly +++ b/Documentation/snippets/time-signature-in-parentheses.ly @@ -1,13 +1,13 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { - lsrtags = "specific-notation, staff-notation, tweaks-and-overrides" + lsrtags = "rhythms, specific-notation, staff-notation, tweaks-and-overrides" texidoc = " The time signature can be enclosed within parentheses. @@ -16,7 +16,6 @@ The time signature can be enclosed within parentheses. doctitle = "Time signature in parentheses" } % begin verbatim - \relative c'' { \override Staff.TimeSignature.stencil = #(lambda (grob) (bracketify-stencil (ly:time-signature::print grob) Y 0.1 0.2 0.1)) diff --git a/Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly b/Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly index bee629dc69..f7173e35a8 100644 --- a/Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly +++ b/Documentation/snippets/time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -14,15 +14,14 @@ Sometimes, a time signature should not print the whole fraction (e.g. 7/4), but only the numerator (7 in this case). This can be easily done by using @code{\\override Staff.TimeSignature.style = #'single-digit} to change the style permanently. By using @code{\\revert -Staff.TimeSignature.style}, this setting can be reversed. To apply -the single-digit style to only one time signature, use the +Staff.TimeSignature.style}, this setting can be reversed. To apply the +single-digit style to only one time signature, use the @code{\\override} command and prefix it with a @code{\\once}. " doctitle = "Time signature printing only the numerator as a number (instead of the fraction)" } % begin verbatim - \relative c'' { \time 3/4 c4 c c diff --git a/Documentation/snippets/transcription-of-ancient-music-with-incipit.ly b/Documentation/snippets/transcription-of-ancient-music-with-incipit.ly deleted file mode 100644 index cebe3d2876..0000000000 --- a/Documentation/snippets/transcription-of-ancient-music-with-incipit.ly +++ /dev/null @@ -1,288 +0,0 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.17.30" - -\header { - lsrtags = "ancient-notation, specific-notation, tweaks-and-overrides, workaround" - - texidoc = " -As a workaround to get real incipits which are independent from the -main score these are included as a markup into the field normally used -for the instrument name. As for now lyrics can only be added as a -direct markup. It doesn't unfortunately conform with the spacing of the -main lyrics. - -" - doctitle = "Transcription of Ancient music with incipit" -} % begin verbatim - - -global = { - \set Score.skipBars = ##t - \key g \major - \time 4/4 - %make the staff lines invisible on staves - \hide Staff.BarLine - \skip 1*8 % the actual music - % let finis bar go through all staves - \override Staff.BarLine.transparent = ##f - % finis bar - \bar "|." -} - -discantusNotes = { - \transpose c' c'' { - \clef treble - d'2. d'4 | - b e' d'2 | - c'4 e'4.( d'8 c' b | - a4) b a2 | - b4.( c'8 d'4) c'4 | - \once \hide NoteHead c'1 | - b\breve | - } -} - -discantusLyrics = \lyricmode { - Ju -- bi -- | - la -- te De -- | - o, om -- - nis ter -- | - ra, __ om- | - "..." | - -us. | -} - -altusNotes = { - \transpose c' c'' { - \clef treble - r2 g2. e4 fis g | % two bars - a2 g4 e | - fis g4.( fis16 e fis4) | - g1 | - \once \hide NoteHead g1 | - g\breve | - } -} - -altusLyrics = \lyricmode { - Ju -- bi -- la -- te | % two bars - De -- o, om -- | - nis ter -- ra, | - "..." | - -us. | -} - -tenorNotes = { - \transpose c' c' { - \clef "treble_8" - R1 | - R1 | - R1 | - r2 d'2. d'4 b e' | % two bars - \once \hide NoteHead e'1 | - d'\breve | - } -} - -tenorLyrics = \lyricmode { - Ju -- bi -- la -- te | % two bars - "..." | - -us. -} - -bassusNotes = { - \transpose c' c' { - \clef bass - R1 | - R1 | - R1 | - R1 | - g2. e4 | - \once \hide NoteHead e1 | - g\breve | - } -} - -bassusLyrics = \lyricmode { - Ju -- bi- | - "..." | - -us. -} - -incipitDiscantus = \markup { - \score { - { - \set Staff.instrumentName = #"Discantus " - \override NoteHead.style = #'neomensural - \override Rest.style = #'neomensural - \override Staff.TimeSignature.style = #'neomensural - \cadenzaOn - \clef "neomensural-c1" - \key f \major - \time 2/2 - c''1._"IV-" s2 %two bars - \skip 1*8 % eight bars - } - \layout { - \context { - \Voice - \remove "Ligature_bracket_engraver" - \consists "Mensural_ligature_engraver" - } - line-width = 4.5\cm - } - } -} - -incipitAltus = \markup { - \score { - { - \set Staff.instrumentName = #"Altus " - \override NoteHead.style = #'neomensural - \override Rest.style = #'neomensural - \override Staff.TimeSignature.style = #'neomensural - \cadenzaOn - \clef "neomensural-c3" - \key f \major - \time 2/2 - r1 % one bar - f'1._"IV-" s2 % two bars - \skip 1*7 % seven bars - } - \layout { - \context { - \Voice - \remove "Ligature_bracket_engraver" - \consists "Mensural_ligature_engraver" - } - line-width = 4.5\cm - } - } -} - -incipitTenor = \markup { - \score { - { - \set Staff.instrumentName = #"Tenor " - \override NoteHead.style = #'neomensural - \override Rest.style = #'neomensural - \override Staff.TimeSignature.style = #'neomensural - \cadenzaOn - \clef "neomensural-c4" - \key f \major - \time 2/2 - r\longa % four bars - r\breve % two bars - r1 % one bar - c'1._"IV-" s2 % two bars - \skip 1 % one bar - } - \layout { - \context { - \Voice - \remove "Ligature_bracket_engraver" - \consists "Mensural_ligature_engraver" - } - line-width = 4.5\cm - } - } -} - -incipitBassus = \markup { - \score { - { - \set Staff.instrumentName = #"Bassus " - \override NoteHead.style = #'neomensural - \override Rest.style = #'neomensural - \override Staff.TimeSignature.style = #'neomensural - \cadenzaOn - \clef "bass" - \key f \major - \time 2/2 - % incipit - r\maxima % eight bars - f1._"IV-" s2 % two bars - } - \layout { - \context { - \Voice - \remove "Ligature_bracket_engraver" - \consists "Mensural_ligature_engraver" - } - line-width = 4.5\cm - } - } -} - -%StaffGroup is used instead of ChoirStaff to get bar lines between systems -\score { - << - \new StaffGroup = choirStaff << - \new Voice = "discantusNotes" << - \global - \set Staff.instrumentName = \incipitDiscantus - \discantusNotes - >> - \new Lyrics = "discantusLyrics" \lyricsto discantusNotes { \discantusLyrics } - - \new Voice = "altusNotes" << - \global - \set Staff.instrumentName = \incipitAltus - \altusNotes - >> - \new Lyrics = "altusLyrics" \lyricsto altusNotes { \altusLyrics } - - \new Voice = "tenorNotes" << - \global - \set Staff.instrumentName = \incipitTenor - \tenorNotes - >> - \new Lyrics = "tenorLyrics" \lyricsto tenorNotes { \tenorLyrics } - - \new Voice = "bassusNotes" << - \global - \set Staff.instrumentName = \incipitBassus - \bassusNotes - >> - >> - \new Lyrics = "bassusLyrics" \lyricsto bassusNotes { \bassusLyrics } - %Keep the bass lyrics outside of the staff group to avoid bar lines - %between the lyrics. - >> - - \layout { - \context { - \Score - % no bars in staves - \hide BarLine - } - % the next three instructions keep the lyrics between the bar lines - \context { - \Lyrics - \consists "Bar_engraver" - \hide BarLine - } - \context { - \StaffGroup - \consists "Separating_line_group_engraver" - } - \context { - \Voice - % no slurs - \hide Slur - % Comment in the below "\remove" command to allow line - % breaking also at those barlines where a note overlaps - % into the next bar. The command is commented out in this - % short example score, but especially for large scores, you - % will typically yield better line breaking and thus improve - % overall spacing if you comment in the following command. - %\remove "Forbid_line_break_engraver" - } - indent = 5\cm - } -} diff --git a/Documentation/snippets/transposing-pitches-with-minimum-accidentals-smart-transpose.ly b/Documentation/snippets/transposing-pitches-with-minimum-accidentals-smart-transpose.ly index 2b647d0854..51ebe92078 100644 --- a/Documentation/snippets/transposing-pitches-with-minimum-accidentals-smart-transpose.ly +++ b/Documentation/snippets/transposing-pitches-with-minimum-accidentals-smart-transpose.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.19.22" \header { lsrtags = "pitches, scheme-language, workaround" @@ -35,7 +35,6 @@ In this manner, the most natural enharmonic notes are chosen. doctitle = "Transposing pitches with minimum accidentals (\"Smart\" transpose)" } % begin verbatim - #(define (naturalize-pitch p) (let ((o (ly:pitch-octave p)) (a (* 4 (ly:pitch-alteration p))) @@ -75,7 +74,7 @@ In this manner, the most natural enharmonic notes are chosen. music)) naturalizeMusic = -#(define-music-function (parser location m) +#(define-music-function (m) (ly:music?) (naturalize m)) diff --git a/Documentation/snippets/tuplet-bracket-and-change-staff.ly b/Documentation/snippets/tuplet-bracket-and-change-staff.ly new file mode 100644 index 0000000000..b5fda25f3a --- /dev/null +++ b/Documentation/snippets/tuplet-bracket-and-change-staff.ly @@ -0,0 +1,50 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "tweaks-and-overrides" + + texidoc = " +This snippet shows how to set a tuplet starting in a lower staff and +finishing in the upper one. + +" + doctitle = "Tuplet bracket and change staff" +} % begin verbatim + +aigues = \relative c' { + \time 6/8 + s4. + \stemDown + c16[ bes' e] + \stemUp + g c e + \stemDown + g8 +} + +basses = \relative c { + \time 3/4 + \clef F + \tweak positions #'(4.5 . 9.5) + \tweak edge-height #'(1 . -1) + \tuplet 7/6 { + c16[ bes' e] + \change Staff = md + \stemUp + g[ c e g] + } + s4.s8 +} + +\new PianoStaff +\with { \omit TimeSignature } +<< + \new Staff = md \aigues + \new Staff = mg \basses +>> diff --git a/Documentation/snippets/tweaking-clef-properties.ly b/Documentation/snippets/tweaking-clef-properties.ly index a43faaca38..5d1e69c13a 100644 --- a/Documentation/snippets/tweaking-clef-properties.ly +++ b/Documentation/snippets/tweaking-clef-properties.ly @@ -1,41 +1,30 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.18" +\version "2.18.0" \header { lsrtags = "pitches, staff-notation, tweaks-and-overrides" texidoc = " -The command @code{\\clef \"treble_8\"} is equivalent to setting -@code{clefGlyph}, @code{clefPosition} (which controls the vertical -position of the clef), @code{middleCPosition} and -@code{clefTransposition}. A clef is printed when any of the properties -except @code{middleCPosition} are changed. +Changing the Clef glyph, its position, or the ottavation does not +change the position of subsequent notes on the staff. To get key +signatures on their correct staff lines @code{middleCClefPosition} must +also be specified, with positive or negative values moving @code{middle +C} up or down respectively, relative to the staff's center line. -Note that changing the glyph, the position of the clef, or the -octavation does not in itself change the position of subsequent notes -on the staff: the position of middle C must also be specified to do -this. In order to get key signatures on the correct staff lines, -@code{middleCClefPosition} must also be set. The positional parameters -are relative to the staff center line, positive numbers displacing -upwards, counting one for each line and space. The -@code{clefTransposition} value would normally be set to 7, -7, 15 or -15, -but other values are valid. +For example, @code{\\clef \"treble_8\"} is equivalent to setting the +@code{clefGlyph}, @code{clefPosition} (the vertical position of the +clef itself on the staff), @code{middleCPosition} and +@code{clefTransposition}. Note that when any of these properties +(except @code{middleCPosition}) are changed a new clef symbol is +printed. -When a clef change takes place at a line break the new clef symbol is -printed at both the end of the previous line and the beginning of the -new line by default. If the warning clef at the end of the previous -line is not required it can be suppressed by setting the @code{Staff} -property @code{explicitClefVisibility} to the value -@code{end-of-line-invisible}. The default behavior can be recovered -with @code{\\unset Staff.explicitClefVisibility}. - The following examples show the possibilities when setting these properties manually. On the first line, the manual changes preserve the standard relative positioning of clefs and notes, whereas on the second @@ -45,7 +34,6 @@ line, they do not. doctitle = "Tweaking clef properties" } % begin verbatim -\layout { ragged-right = ##t } { % The default treble clef \key f \major diff --git a/Documentation/snippets/tweaking-grace-layout-within-music.ly b/Documentation/snippets/tweaking-grace-layout-within-music.ly index b038e101b1..65c5449fda 100644 --- a/Documentation/snippets/tweaking-grace-layout-within-music.ly +++ b/Documentation/snippets/tweaking-grace-layout-within-music.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.28" +\version "2.18.0" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -20,7 +20,6 @@ up, and changes the default note heads to crosses. doctitle = "Tweaking grace layout within music" } % begin verbatim - \relative c'' { \new Staff { $(remove-grace-property 'Voice 'Stem 'direction) diff --git a/Documentation/snippets/tweaks-and-overrides.snippet-list b/Documentation/snippets/tweaks-and-overrides.snippet-list index 2e71f5f6e3..b0bf51340d 100644 --- a/Documentation/snippets/tweaks-and-overrides.snippet-list +++ b/Documentation/snippets/tweaks-and-overrides.snippet-list @@ -1,15 +1,17 @@ adding-an-ottava-marking-to-a-single-voice.ly adding-links-to-objects.ly +adding-markups-in-a-tablature.ly adding-timing-marks-to-long-glissandi.ly adjusting-grace-note-spacing.ly +adjusting-lyrics-vertical-spacing.ly altering-the-length-of-beamed-stems.ly alternative-bar-numbering.ly analysis-brackets-above-the-staff.ly asymmetric-slurs.ly avoiding-collisions-with-chord-fingerings.ly caesura-railtracks-with-fermata.ly -centering-markup-on-note-heads-automatically.ly changing-a-single-notes-size-in-a-chord.ly +changing-beam-thickness-and-spacing.ly changing-form-of-multi-measure-rests.ly changing-properties-for-individual-grobs.ly changing-text-and-spanner-styles-for-text-dynamics.ly @@ -21,6 +23,7 @@ controlling-spanner-visibility-after-a-line-break.ly controlling-the-vertical-ordering-of-scripts.ly controlling-tuplet-bracket-visibility.ly creating-a-delayed-turn.ly +creating-custom-key-signatures.ly creating-double-digit-fingerings.ly creating-simultaneous-rehearsal-marks.ly creating-text-spanners.ly @@ -36,8 +39,10 @@ drawing-boxes-around-grobs.ly drawing-circles-around-various-objects.ly dynamics-custom-text-spanner-postfix.ly dynamics-text-spanner-postfix.ly +extending-a-trillspanner.ly extending-glissandi-across-repeats.ly fine-tuning-pedal-brackets.ly +flat-ties.ly forcing-horizontal-shift-of-notes.ly fret-diagrams-explained-and-developed.ly generating-custom-flags.ly @@ -54,6 +59,7 @@ making-an-object-invisible-with-the-transparent-property.ly making-glissandi-breakable.ly manually-controlling-beam-positions.ly mensurstriche-layout-bar-lines-between-the-staves.ly +modifying-the-ottava-spanner-slope.ly moving-dotted-notes-in-polyphony.ly moving-slur-positions-vertically.ly nesting-staves.ly @@ -62,11 +68,11 @@ percent-repeat-count-visibility.ly positioning-arpeggios.ly positioning-multi-measure-rests.ly positioning-text-markups-inside-slurs.ly -printing-a-repeat-sign-at-the-beginning-of-a-piece.ly printing-bar-numbers-inside-boxes-or-circles.ly printing-metronome-and-rehearsal-marks-below-the-staff.ly printing-note-names-with-and-without-an-octave-marker.ly proportional-strict-notespacing.ly +removing-brace-on-first-line-of-piano-score.ly removing-connecting-bar-lines-on-staffgroup,-pianostaff,-or-grandstaff.ly removing-the-first-empty-line.ly rest-styles.ly @@ -80,7 +86,7 @@ suppressing-warnings-for-clashing-note-columns.ly time-signature-in-parentheses---method-3.ly time-signature-in-parentheses.ly time-signature-printing-only-the-numerator-as-a-number-instead-of-the-fraction.ly -transcription-of-ancient-music-with-incipit.ly +tuplet-bracket-and-change-staff.ly tweaking-clef-properties.ly tweaking-grace-layout-within-music.ly using-alternative-flag-styles.ly diff --git a/Documentation/snippets/two--partcombine-pairs-on-one-staff.ly b/Documentation/snippets/two--partcombine-pairs-on-one-staff.ly new file mode 100644 index 0000000000..da3d7b3d44 --- /dev/null +++ b/Documentation/snippets/two--partcombine-pairs-on-one-staff.ly @@ -0,0 +1,101 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.19.22" + +\header { + lsrtags = "simultaneous-notes, staff-notation" + + texidoc = " +The @code{\\partcombine} function takes two music expressions each +containing a part, and distributes them among four @code{Voice}s named +@qq{two} @qq{one} @qq{solo} and @qq{chords} depending on when and how +the parts merged into a common voice. The voices output from +@code{\\partcombine} can have their layout properties adjusted in the +usual way. Here we define extensions of @code{\\partcombine} to make +it easier to put four voices on a staff. + +soprano = @{ d'4 | cis' b e' d'8 cis' | cis'2 b @} alto = @{ fis4 | +e8 fis gis ais b4 b | b ais fis2 @} tenor = @{ a8 b | cis' dis' e'4 b8 +cis' d'4 | gis cis' dis'2 @} bass = @{ fis8 gis | a4 gis g fis | eis +fis b,2 @} + +\\new Staff << + \\key b\\minor + \\clef alto + \\partial 4 + \\transpose b b' + \\partcombineUp \\soprano \\alto + \\partcombineDown \\tenor \\bass >> + +" + doctitle = "Two \\partcombine pairs on one staff" +} % begin verbatim + +\layout { + \context { + \Staff + \accepts "VoiceBox" + } + \context { + \name "VoiceBox" + \type "Engraver_group" + \defaultchild "Voice" + \accepts "Voice" + } +} + +partcombineUp = +#(define-music-function (partOne partTwo) + (ly:music? ly:music?) +"Take the music in @var{partOne} and @var{partTwo} and return +a @code{VoiceBox} named @q{Up} containing @code{Voice}s +that contain @var{partOne} and @var{partTwo} merged into one +voice where feasible. This variant sets the default voicing +in the output to use upward stems." +#{ + \new VoiceBox = "Up" << + \context Voice = "one" { \voiceOne } + \context Voice = "two" { \voiceThree } + \context Voice = "shared" { \voiceOne } + \context Voice = "solo" { \voiceOne } + \partcombine #partOne #partTwo + >> +#}) + +partcombineDown = # +(define-music-function (partOne partTwo) + (ly:music? ly:music?) +"Take the music in @var{partOne} and @var{partTwo} and return +a @code{VoiceBox} named @q{Down} containing @code{Voice}s +that contain @var{partOne} and @var{partTwo} merged into one +voice where feasible. This variant sets the default voicing +in the output to use downward stems." +#{ + \new VoiceBox = "Down" << + \set VoiceBox.soloText = #"Solo III" + \set VoiceBox.soloIIText = #"Solo IV" + \context Voice ="one" { \voiceFour } + \context Voice ="two" { \voiceTwo } + \context Voice ="shared" { \voiceFour } + \context Voice ="solo" { \voiceFour } + \partcombine #partOne #partTwo + >> +#}) + +soprano = { d'4 | cis' b e' d'8 cis' | cis'2 b } +alto = { fis4 | e8 fis gis ais b4 b | b ais fis2 } +tenor = { a8 b | cis' dis' e'4 b8 cis' d'4 | gis cis' dis'2 } +bass = { fis8 gis | a4 gis g fis | eis fis b,2 } + +\new Staff << + \key b\minor + \clef alto + \partial 4 + \transpose b b' + \partcombineUp \soprano \alto + \partcombineDown \tenor \bass +>> diff --git a/Documentation/snippets/unfretted-headword.ly b/Documentation/snippets/unfretted-headword.ly index 6cc02b677d..eb02136cc8 100644 --- a/Documentation/snippets/unfretted-headword.ly +++ b/Documentation/snippets/unfretted-headword.ly @@ -4,8 +4,8 @@ % and then run scripts/auxiliar/makelsr.py % % This file is in the public domain. -%% Note: this file works from version 2.17.30 -\version "2.17.30" +%% Note: this file works from version 2.19.2 +\version "2.19.2" \header { lsrtags = "headword" @@ -124,10 +124,10 @@ ViolinSolo = \relative c' { \voiceOne - \set Score.markFormatter = #format-mark-box-numbers - \override Score.VoltaBracket.font-name = #"sans" - \override Score.VoltaBracket.extra-offset = #'(0 . 1) - \override SpacingSpanner.uniform-stretching = ##t + \set Score.markFormatter = #format-mark-box-numbers + \override Score.VoltaBracket.font-name = #"LilyPond Sans Serif" + \override Score.VoltaBracket.extra-offset = #'(0 . 1) + \override SpacingSpanner.uniform-stretching = ##t %% Measure 1 @@ -154,7 +154,7 @@ ViolinSolo = \relative c' { \time 15/4 << { \shift d2 \glissando ^\markup \colmark { \quatre \dubetc \pvib \norm } \shifta e1 \glissando d2 } \\ - { d2 \open \mf \< ~ d1 ~ d2 \ff ~ d1 \> ~ d2 ^\markup \colmark { " " " " \svib } ~ d4 \pp} + { d2 \open \mf \< ~ d1 ~ 2 \ff ~ d1 \> ~ d2 ^\markup \colmark { " " " " \svib } ~ d4 \pp} >> \break diff --git a/Documentation/snippets/use-square-bracket-at-the-start-of-a-staff-group.ly b/Documentation/snippets/use-square-bracket-at-the-start-of-a-staff-group.ly index 10d57393b7..e7ebc7a0e4 100644 --- a/Documentation/snippets/use-square-bracket-at-the-start-of-a-staff-group.ly +++ b/Documentation/snippets/use-square-bracket-at-the-start-of-a-staff-group.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, staff-notation" @@ -18,7 +18,6 @@ context. doctitle = "Use square bracket at the start of a staff group" } % begin verbatim - \score { \new StaffGroup { << \set StaffGroup.systemStartDelimiter = #'SystemStartSquare diff --git a/Documentation/snippets/user-defined-time-signatures.ly b/Documentation/snippets/user-defined-time-signatures.ly new file mode 100644 index 0000000000..3bf7b76123 --- /dev/null +++ b/Documentation/snippets/user-defined-time-signatures.ly @@ -0,0 +1,35 @@ +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.16 +\version "2.19.16" + +\header { + lsrtags = "rhythms" + + texidoc = " +New time signature styles can be defined. The time signature in +the second measure should be upside down in both staves. +" + + doctitle = "User defined time signatures" +} % begin verbatim + + +#(add-simple-time-signature-style 'topsy-turvy + (lambda (fraction) + (make-rotate-markup 180 (make-compound-meter-markup fraction)))) + +<< + \new Staff { + \time 3/4 f'2. + \override Score.TimeSignature.style = #'topsy-turvy + \time 3/4 R2. \bar "|." + } + \new Staff { + R2. e'' + } +>> diff --git a/Documentation/snippets/using-a-tick-as-the-breath-mark-symbol.ly b/Documentation/snippets/using-a-tick-as-the-breath-mark-symbol.ly index 27c80491e7..bda583ab8c 100644 --- a/Documentation/snippets/using-a-tick-as-the-breath-mark-symbol.ly +++ b/Documentation/snippets/using-a-tick-as-the-breath-mark-symbol.ly @@ -1,25 +1,25 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "expressive-marks" texidoc = " -Vocal and wind music frequently uses a tick mark as a breathing sign. This -indicates a breath that subtracts a little time from the previous note rather -than causing a short pause, which is indicated by the comma breath mark. The -mark can be moved up a little to take it away from the stave. +Vocal and wind music frequently uses a tick mark as a breathing sign. +This indicates a breath that subtracts a little time from the previous +note rather than causing a short pause, which is indicated by the comma +breath mark. The mark can be moved up a little to take it away from +the stave. + " doctitle = "Using a tick as the breath mark symbol" } % begin verbatim - \relative c'' { c2 \breathe diff --git a/Documentation/snippets/using-alternative-flag-styles.ly b/Documentation/snippets/using-alternative-flag-styles.ly index 3338586384..145eab583a 100644 --- a/Documentation/snippets/using-alternative-flag-styles.ly +++ b/Documentation/snippets/using-alternative-flag-styles.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "rhythms, tweaks-and-overrides" @@ -13,28 +12,40 @@ texidoc = " Alternative styles of flag on eighth and shorter notes can be displayed by overriding the @code{stencil} property of @code{Flag}. Valid values -are @code{modern-straight-flag} and @code{old-straight-flag}. +are @code{modern-straight-flag}, @code{old-straight-flag} and +@code{flat-flag}. " doctitle = "Using alternative flag styles" } % begin verbatim - testnotes = { \autoBeamOff c8 d16 c32 d64 \acciaccatura { c8 } d64 r4 } -\relative c' { - \time 2/4 - \testnotes - - \override Flag.stencil = #modern-straight-flag - \testnotes - - \override Flag.stencil = #old-straight-flag - \testnotes - - \revert Flag.stencil - \testnotes +\score { + \relative c' { + \time 2/4 + \testnotes + + \override Flag.stencil = #modern-straight-flag + \testnotes + + \override Flag.stencil = #old-straight-flag + \testnotes + + \override Flag.stencil = #flat-flag + \testnotes + + \revert Flag.stencil + \testnotes + } + \layout { + indent = 0 + \context { + \Score + \override NonMusicalPaperColumn.line-break-permission = ##f + } + } } diff --git a/Documentation/snippets/using-an-extra-voice-for-breaks.ly b/Documentation/snippets/using-an-extra-voice-for-breaks.ly new file mode 100644 index 0000000000..c355a93f75 --- /dev/null +++ b/Documentation/snippets/using-an-extra-voice-for-breaks.ly @@ -0,0 +1,43 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" + +\header { + lsrtags = "specific-notation, workaround" + + texidoc = " +Often it is easier to manage line and page-breaking information by +keeping it separate from the music by introducing an extra voice +containing only skips along with the @code{\\break}, @code{pageBreak} +and other layout information. + +This pattern becomes especially helpful when overriding +@code{line-break-system-details} and the other useful but long +properties of @code{NonMusicalPaperColumnGrob}. + +" + doctitle = "Using an extra voice for breaks" +} % begin verbatim + +music = \relative c'' { c4 c c c } + +\score { + \new Staff << + \new Voice { + s1 * 2 \break + s1 * 3 \break + s1 * 6 \break + s1 * 5 \break + } + \new Voice { + \repeat unfold 2 { \music } + \repeat unfold 3 { \music } + \repeat unfold 6 { \music } + \repeat unfold 5 { \music } + } + >> +} diff --git a/Documentation/snippets/using-arpeggiobracket-to-make-divisi-more-visible.ly b/Documentation/snippets/using-arpeggiobracket-to-make-divisi-more-visible.ly index c316d29d93..86cf689f3f 100644 --- a/Documentation/snippets/using-arpeggiobracket-to-make-divisi-more-visible.ly +++ b/Documentation/snippets/using-arpeggiobracket-to-make-divisi-more-visible.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "expressive-marks, vocal-music" @@ -18,7 +18,6 @@ often seen in choral music. doctitle = "Using arpeggioBracket to make divisi more visible" } % begin verbatim - \include "english.ly" \score { diff --git a/Documentation/snippets/using-autochange-with-more-than-one-voice.ly b/Documentation/snippets/using-autochange-with-more-than-one-voice.ly index cd7f685099..8db1438e7d 100644 --- a/Documentation/snippets/using-autochange-with-more-than-one-voice.ly +++ b/Documentation/snippets/using-autochange-with-more-than-one-voice.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "keyboards, pitches, staff-notation" diff --git a/Documentation/snippets/using-double-slurs-for-legato-chords.ly b/Documentation/snippets/using-double-slurs-for-legato-chords.ly index 0844c8624e..4e1eaf7837 100644 --- a/Documentation/snippets/using-double-slurs-for-legato-chords.ly +++ b/Documentation/snippets/using-double-slurs-for-legato-chords.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "expressive-marks" @@ -17,7 +17,6 @@ be achieved by setting @code{doubleSlurs}. doctitle = "Using double slurs for legato chords" } % begin verbatim - \relative c' { \set doubleSlurs = ##t 4( ) diff --git a/Documentation/snippets/using-grace-note-slashes-with-normal-heads.ly b/Documentation/snippets/using-grace-note-slashes-with-normal-heads.ly index a348603f9a..4d2898ff32 100644 --- a/Documentation/snippets/using-grace-note-slashes-with-normal-heads.ly +++ b/Documentation/snippets/using-grace-note-slashes-with-normal-heads.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.6 -\version "2.17.6" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "rhythms" @@ -18,7 +17,6 @@ other situations. doctitle = "Using grace note slashes with normal heads" } % begin verbatim - \relative c'' { \override Flag.stroke-style = #"grace" c8( d2) e8( f4) diff --git a/Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly b/Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly index c2e4685015..d07271b46a 100644 --- a/Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly +++ b/Documentation/snippets/using-ly-grob-object-to-access-grobs-with--tweak.ly @@ -1,19 +1,19 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "devel, scheme-language, tweaks-and-overrides" texidoc = " -Some grobs can be accessed @qq{laterally} from within another grob's -callback. These are usually listed as @qq{layout objects} in the -@qq{Internal properties} section of a grob-interface. The function -@code{ly:grob-object} is used to access these grobs. +Some grobs can be accessed “laterally” from within another grob’s +callback. These are usually listed as “layout objects” in the “Internal +properties” section of a grob-interface. The function ly:grob-object is +used to access these grobs. Demonstrated below are some ways of accessing grobs from within a @@ -30,7 +30,7 @@ accessed. Example console output: --------------------- #-Grob Accidental - #-Grob Arpeggio - #-Grob Stem - +@code{ #Grob Accidental () #Grob Stem} diff --git a/Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly b/Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly index 976387a0d1..cc628a3b4a 100644 --- a/Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly +++ b/Documentation/snippets/using-postscript-to-generate-special-note-head-shapes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "editorial-annotations, really-cool, scheme-language, tweaks-and-overrides" @@ -18,7 +18,6 @@ This example shows how a parallelogram-shaped note head is generated. doctitle = "Using PostScript to generate special note head shapes" } % begin verbatim - parallelogram = #(ly:make-stencil (list 'embedded-ps "gsave diff --git a/Documentation/snippets/using-tags-to-produce-mensural-and-modern-music-from-the-same-source.ly b/Documentation/snippets/using-tags-to-produce-mensural-and-modern-music-from-the-same-source.ly new file mode 100644 index 0000000000..086b1b6d98 --- /dev/null +++ b/Documentation/snippets/using-tags-to-produce-mensural-and-modern-music-from-the-same-source.ly @@ -0,0 +1,92 @@ +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.19.22" + +\header { + lsrtags = "ancient-notation, vocal-music" + + texidoc = " +By using tags, it's possible to use the same music to produce both +mensural and modern music. In this snippet, a function @code{menrest} +is introduced, allowing mensural rests to be pitched as in the +original, but with modern rests in the standard staff position. Tags +are used to produce different types of bar line at the end of the +music, but tags can also be used where other differences are needed: +for example using @qq{whole measure rests} (R1, R\\breve etc.) in +modern music, but normal rests (r1, r\\breve, etc.) in the mensural +version. Note that converting mensural music to its modern equivalent +is usually referred to as @code{transcription}. + +" + doctitle = "Using tags to produce mensural and modern music from the same source" +} % begin verbatim + +menrest = #(define-music-function (note) + (ly:music?) +#{ + \tag #'mens $(make-music 'RestEvent note) + \tag #'mod $(make-music 'RestEvent note 'pitch '()) +#}) + +MensStyle = { + \autoBeamOff + \override NoteHead.style = #'petrucci + \override Score.BarNumber.transparent = ##t + \override Stem.neutral-direction = #up +} + +finalis = { + \once \override BreathingSign.stencil = #ly:breathing-sign::finalis + \once \override BreathingSign.Y-offset = #0 + \once \override BreathingSign.minimum-X-extent = #'(-1.0 . 0.0) + \once \override BreathingSign.minimum-Y-extent = #'(-2.5 . 2.5) + + \breathe +} + +Music = \relative c'' { + \set Score.tempoHideNote = ##t + \key f \major + \time 4/4 + g1 d'2 \menrest bes4 bes2 a2 r4 g4 fis2. + \tag #'mens { \finalis } + \tag #'mod { \bar "||" } +} + +MenLyr = \lyricmode { So farre, deere life, deare life } +ModLyr = \lyricmode { So far, dear life, dear life } + +\score { + \keepWithTag #'mens { + << + \new MensuralStaff + { + \new MensuralVoice = Cantus \clef "mensural-c1" \MensStyle \Music + } + \new Lyrics \lyricsto Cantus \MenLyr + >> + } +} + +\score { + \keepWithTag #'mod { + \new ChoirStaff << + \new Staff + { + \new Voice = Sop \with { + \remove "Note_heads_engraver" + \consists "Completion_heads_engraver" + \remove "Rest_engraver" + \consists "Completion_rest_engraver" } + { + \shiftDurations #1 #0 { \autoBeamOff \Music } + } + } + \new Lyrics \lyricsto Sop \ModLyr + >> + } +} diff --git a/Documentation/snippets/using-the--tweak-command-to-tweak-individual-grobs.ly b/Documentation/snippets/using-the--tweak-command-to-tweak-individual-grobs.ly index f6bb8ed356..8d5349df02 100644 --- a/Documentation/snippets/using-the--tweak-command-to-tweak-individual-grobs.ly +++ b/Documentation/snippets/using-the--tweak-command-to-tweak-individual-grobs.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "really-simple, tweaks-and-overrides" @@ -17,7 +17,6 @@ Here are some examples of available tweaks. doctitle = "Using the \\tweak command to tweak individual grobs" } % begin verbatim - \relative c' { \time 2/4 \set fingeringOrientations = #'(right) diff --git a/Documentation/snippets/using-the-whiteout-property.ly b/Documentation/snippets/using-the-whiteout-property.ly index 2e9f1a3243..77bc141d21 100644 --- a/Documentation/snippets/using-the-whiteout-property.ly +++ b/Documentation/snippets/using-the-whiteout-property.ly @@ -1,10 +1,11 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.17.6" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.32 +\version "2.19.32" \header { lsrtags = "editorial-annotations, expressive-marks" @@ -29,6 +30,7 @@ is not masked. doctitle = "Using the whiteout property" } % begin verbatim + { \override Score.StaffSymbol.layer = #4 \override Staff.TimeSignature.layer = #3 diff --git a/Documentation/snippets/using-ties-with-arpeggios.ly b/Documentation/snippets/using-ties-with-arpeggios.ly index b1e8bea6fe..dac63bf04c 100644 --- a/Documentation/snippets/using-ties-with-arpeggios.ly +++ b/Documentation/snippets/using-ties-with-arpeggios.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "rhythms" @@ -20,7 +20,6 @@ can also be used for ordinary consecutive notes. doctitle = "Using ties with arpeggios" } % begin verbatim - \relative c' { \set tieWaitForNote = ##t \grace { c16[ ~ e ~ g] ~ } 2 diff --git a/Documentation/snippets/utf-8.ly b/Documentation/snippets/utf-8.ly index c6e1a0536b..7d4dab0aa4 100644 --- a/Documentation/snippets/utf-8.ly +++ b/Documentation/snippets/utf-8.ly @@ -1,10 +1,11 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.16.0" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.12 +\version "2.19.12" \header { lsrtags = "text" @@ -30,15 +31,27 @@ You may have to install additional fonts. Red Hat Fedora - taipeifonts fonts-xorg-truetype ttfonts-ja fonts-arabic \ - ttfonts-zh_CN fonts-ja fonts-hebrew + linux-libertine-fonts (Latin, Cyrillic, Hebrew) + ipa-mincho-fonts ipa-gothic-fonts (Japanese) -Debian GNU/Linux +Debian GNU/Linux, Ubuntu - apt-get install emacs-intl-fonts xfonts-intl-.* \ - ttf-kochi-gothic ttf-kochi-mincho \ - xfonts-bolkhov-75dpi xfonts-cronyx-100dpi xfonts-cronyx-75dpi -%} + fonts-linuxlibertine (Latin, Cyrillic, Hebrew) + fonts-ipafont (Japanese) + +%} % begin verbatim + + +% Font settings for Cyrillic and Hebrew +% Linux Libertine fonts contain Cyrillic and Hebrew glyphs. +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + #:sans "Linux Biolinum O,sans-serif" + #:typewriter "Linux Libertine Mono O,monospace" + )) +} % Cyrillic font bulgarian = \lyricmode { diff --git a/Documentation/snippets/vertical-aligned-staffgroups-without-connecting-systemstartbar.ly b/Documentation/snippets/vertical-aligned-staffgroups-without-connecting-systemstartbar.ly index 6610200af5..19937c8286 100644 --- a/Documentation/snippets/vertical-aligned-staffgroups-without-connecting-systemstartbar.ly +++ b/Documentation/snippets/vertical-aligned-staffgroups-without-connecting-systemstartbar.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.30" +\version "2.18.0" \header { lsrtags = "paper-and-layout, staff-notation, syntax-and-expressions" @@ -237,11 +237,11 @@ simpleBach = cbI = \relative c' { \mark \markup { - \bold "Teacher:" - \column { - "Well, you simply copied and transposed a version of J.S.Bach." - "Do you know this one?" - } + \bold "Teacher:" + \column { + "Well, you simply copied and transposed a version of J.S.Bach." + "Do you know this one?" + } } \key a \minor \time 4/4 diff --git a/Documentation/snippets/vertical-line-as-a-baroque-articulation-mark.ly b/Documentation/snippets/vertical-line-as-a-baroque-articulation-mark.ly index 9dca248702..222c20f0a5 100644 --- a/Documentation/snippets/vertical-line-as-a-baroque-articulation-mark.ly +++ b/Documentation/snippets/vertical-line-as-a-baroque-articulation-mark.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "ancient-notation, expressive-marks" @@ -19,7 +19,6 @@ demonstrates how to achieve such a notation. doctitle = "Vertical line as a baroque articulation mark" } % begin verbatim - upline = #(let ((m (make-articulation "stopped"))) (set! (ly:music-property m 'tweaks) diff --git a/Documentation/snippets/vertically-aligned-dynamics-and-textscripts.ly b/Documentation/snippets/vertically-aligned-dynamics-and-textscripts.ly index 82a609c12f..9e631e1c2f 100644 --- a/Documentation/snippets/vertically-aligned-dynamics-and-textscripts.ly +++ b/Documentation/snippets/vertically-aligned-dynamics-and-textscripts.ly @@ -1,11 +1,10 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.17.27 -\version "2.17.27" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "spacing, tweaks-and-overrides, workaround" @@ -13,9 +12,8 @@ texidoc = " All @code{DynamicLineSpanner} objects (hairpins and dynamic texts) are placed with their reference line at least @code{'staff-padding} from -the staff, unless other notation forces them to be farther. -Setting @code{'staff-padding} to a sufficiently large value aligns the -dynamics. +the staff, unless other notation forces them to be farther. Setting +@code{'staff-padding} to a sufficiently large value aligns the dynamics. The same idea, together with @code{\\textLengthOn}, is used to align the text scripts along their baseline. @@ -24,8 +22,6 @@ the text scripts along their baseline. doctitle = "Vertically aligned dynamics and textscripts" } % begin verbatim -\markup \vspace #1 %avoid LSR-bug - music = \relative c' { a'2\p b\f e4\p f\f\> g, b\p diff --git a/Documentation/snippets/vertically-aligning-dynamics-across-multiple-notes.ly b/Documentation/snippets/vertically-aligning-dynamics-across-multiple-notes.ly index 0adb0dec41..4c057c0998 100644 --- a/Documentation/snippets/vertically-aligning-dynamics-across-multiple-notes.ly +++ b/Documentation/snippets/vertically-aligning-dynamics-across-multiple-notes.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "expressive-marks" @@ -19,7 +19,6 @@ of the @code{DynamicLineSpanner} object. doctitle = "Vertically aligning dynamics across multiple notes" } % begin verbatim - \relative c' { \override DynamicLineSpanner.staff-padding = #4 c2\p f\mf diff --git a/Documentation/snippets/vertically-aligning-ossias-and-lyrics.ly b/Documentation/snippets/vertically-aligning-ossias-and-lyrics.ly index 4a85d9d6a4..bf138f5f07 100644 --- a/Documentation/snippets/vertically-aligning-ossias-and-lyrics.ly +++ b/Documentation/snippets/vertically-aligning-ossias-and-lyrics.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.11" +\version "2.18.0" \header { lsrtags = "spacing, tweaks-and-overrides, vocal-music" @@ -18,7 +18,6 @@ positioning of lyrics and ossias. doctitle = "Vertically aligning ossias and lyrics" } % begin verbatim - \paper { ragged-right = ##t } diff --git a/Documentation/snippets/vertically-centered-common-lyrics.ly b/Documentation/snippets/vertically-centered-common-lyrics.ly index 7c59cd3b16..661b8fe208 100644 --- a/Documentation/snippets/vertically-centered-common-lyrics.ly +++ b/Documentation/snippets/vertically-centered-common-lyrics.ly @@ -1,59 +1,67 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "vocal-music" texidoc = " -In a vocal piece where there are several (two,four or more) lines of -lyrics, and common lyrics for all voices at some point, these common -lyrics may be vertically centered regardingly, as shown in the +In a vocal piece where there are several (two, four or more) lines of +lyrics and common lyrics for all voices at some point, the common +lyrics may be made to appear vertically centered, as shown in the following example: " doctitle = "Vertically centered common lyrics" } % begin verbatim -\include "english.ly" -leftbrace = \markup { \override #'(font-encoding . fetaBraces) \lookup #"brace240" } -rightbrace = \markup { \rotate #180 \leftbrace } - -dropLyrics = -{ - \override LyricText.extra-offset = #'(0 . -5) - \override LyricHyphen.extra-offset = #'(0 . -5) - \override LyricExtender.extra-offset = #'(0 . -5) +dropLyrics = { + \override LyricText.extra-offset = #'(0 . -4.5) + \override LyricHyphen.extra-offset = #'(0 . -4.5) + \override LyricExtender.extra-offset = #'(0 . -4.5) + \override StanzaNumber.extra-offset = #'(0 . -4.5) } -raiseLyrics = -{ - \revert LyricText.extra-offset - \revert LyricHyphen.extra-offset - \revert LyricExtender.extra-offset +raiseLyrics = { + \revert LyricText.extra-offset + \revert LyricHyphen.extra-offset + \revert LyricExtender.extra-offset + \revert StanzaNumber.extra-offset } skipFour = \repeat unfold 4 { \skip 8 } -lyricsA = \lyricmode { The first verse has \dropLyrics the com -- mon -__ words \raiseLyrics used in all four. } -lyricsB = \lyricmode { In stan -- za two, \skipFour al -- so ap -- pear. } -lyricsC = \lyricmode { By the third verse, \skipFour are get -- ting dull. } +lyricsA = \lyricmode { + The first verse has + \dropLyrics + \set stanza = #" All:" + the com -- mon __ words + \raiseLyrics + used in all four. +} + +lyricsB = \lyricmode { In stan -- za two, \skipFour al -- so ap -- pear. } + +lyricsC = \lyricmode { By the third verse, \skipFour are get -- ting dull. } + lyricsD = \lyricmode { Last stan -- za, and \skipFour get used once more. } -melody = \relative c' { c4 d e f g f e8( e f) d4 c e d c } - -\score -{ - << - \new Voice = m \melody - \new Lyrics \lyricsto m \lyricsA - \new Lyrics \lyricsto m \lyricsB - \new Lyrics \lyricsto m \lyricsC - \new Lyrics \lyricsto m \lyricsD - >> +melody = \relative c' { + c4 d e f | + g f e8( e f) d | + c4 e d c | +} + +\score { + << + \new Voice = m \melody + \new Lyrics \lyricsto m \lyricsA + \new Lyrics \lyricsto m \lyricsB + \new Lyrics \lyricsto m \lyricsC + \new Lyrics \lyricsto m \lyricsD + >> } diff --git a/Documentation/snippets/vertically-centering-paired-figured-bass-extenders.ly b/Documentation/snippets/vertically-centering-paired-figured-bass-extenders.ly index a29298b9d9..4816346449 100644 --- a/Documentation/snippets/vertically-centering-paired-figured-bass-extenders.ly +++ b/Documentation/snippets/vertically-centering-paired-figured-bass-extenders.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords, tweaks-and-overrides" @@ -19,7 +19,6 @@ extender lines are vertically centered if doctitle = "Vertically centering paired figured bass extenders" } % begin verbatim - << \relative c' { c8 c b b a a c16 c b b diff --git a/Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly b/Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly index 8e1796fd47..e404d43ee1 100644 --- a/Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly +++ b/Documentation/snippets/vocal-ensemble-template-with-automatic-piano-reduction.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "automatic-notation, keyboards, template, vocal-music" @@ -21,12 +21,11 @@ reduction. doctitle = "Vocal ensemble template with automatic piano reduction" } % begin verbatim - \paper { - top-system-spacing #'basic-distance = #10 - score-system-spacing #'basic-distance = #20 - system-system-spacing #'basic-distance = #20 - last-bottom-spacing #'basic-distance = #10 + top-system-spacing.basic-distance = #10 + score-system-spacing.basic-distance = #20 + system-system-spacing.basic-distance = #20 + last-bottom-spacing.basic-distance = #10 } global = { @@ -34,28 +33,28 @@ global = { \time 4/4 } -sopMusic = \relative c'' { - c4 c c8[( b)] c4 +sopMusic = \relative { + c''4 c c8[( b)] c4 } sopWords = \lyricmode { hi hi hi hi } -altoMusic = \relative c' { - e4 f d e +altoMusic = \relative { + e'4 f d e } altoWords =\lyricmode { ha ha ha ha } -tenorMusic = \relative c' { +tenorMusic = \relative { g4 a f g } tenorWords = \lyricmode { hu hu hu hu } -bassMusic = \relative c { +bassMusic = \relative { c4 c g c } bassWords = \lyricmode { diff --git a/Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly b/Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly index c4c1f61ccb..a13de11a6c 100644 --- a/Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly +++ b/Documentation/snippets/vocal-ensemble-template-with-lyrics-aligned-below-and-above-the-staves.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, template, text, vocal-music" @@ -18,7 +18,6 @@ using @code{alignAboveContext} and @code{alignBelowContext}. doctitle = "Vocal ensemble template with lyrics aligned below and above the staves" } % begin verbatim - global = { \key c \major \time 4/4 diff --git a/Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly b/Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly index 51ffe694b2..fa80dbc076 100644 --- a/Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly +++ b/Documentation/snippets/vocal-ensemble-template-with-verse-and-refrain.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "contexts-and-engravers, template, vocal-music" @@ -20,7 +20,6 @@ score. doctitle = "Vocal ensemble template with verse and refrain" } % begin verbatim - global = { \key g \major diff --git a/Documentation/snippets/vocal-ensemble-template.ly b/Documentation/snippets/vocal-ensemble-template.ly index 100d57e098..4498fd3b40 100644 --- a/Documentation/snippets/vocal-ensemble-template.ly +++ b/Documentation/snippets/vocal-ensemble-template.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "really-simple, template, vocal-music" @@ -20,12 +20,11 @@ regrouped on only two staves. doctitle = "Vocal ensemble template" } % begin verbatim - \paper { - top-system-spacing #'basic-distance = #10 - score-system-spacing #'basic-distance = #20 - system-system-spacing #'basic-distance = #20 - last-bottom-spacing #'basic-distance = #10 + top-system-spacing.basic-distance = #10 + score-system-spacing.basic-distance = #20 + system-system-spacing.basic-distance = #20 + last-bottom-spacing.basic-distance = #10 } global = { @@ -33,28 +32,28 @@ global = { \time 4/4 } -sopMusic = \relative c'' { - c4 c c8[( b)] c4 +sopMusic = \relative { + c''4 c c8[( b)] c4 } sopWords = \lyricmode { hi hi hi hi } -altoMusic = \relative c' { - e4 f d e +altoMusic = \relative { + e'4 f d e } altoWords = \lyricmode { ha ha ha ha } -tenorMusic = \relative c' { +tenorMusic = \relative { g4 a f g } tenorWords = \lyricmode { hu hu hu hu } -bassMusic = \relative c { +bassMusic = \relative { c4 c g c } bassWords = \lyricmode { diff --git a/Documentation/snippets/vocal-headword.ly b/Documentation/snippets/vocal-headword.ly index d09d784396..61137d2eee 100644 --- a/Documentation/snippets/vocal-headword.ly +++ b/Documentation/snippets/vocal-headword.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.17.6" +\version "2.18.0" \header { lsrtags = "headword" @@ -16,13 +16,8 @@ Vocal headword doctitle = "Vocal headword" } % begin verbatim -\layout { - \context { - \Score - \override PaperColumn.keep-inside-line = ##t - \override NonMusicalPaperColumn.keep-inside-line = ##t - } -} +%% http://lsr.di.unimi.it/LSR/Item?id=832 +%% see also http://lilypond.org/doc/v2.18/Documentation/notation/vocal-music % L. van Beethoven. Symphony No. 9 in D minor, op.125; Finale % mm. 216 -- 236 @@ -33,8 +28,6 @@ Vocal headword \set Score.currentBarNumber = 216 \bar "" % make first bar number be shown \clef bass \key d \minor \time 3/4 - % \tempo "Presto" - % \compressFullBarRests R2.*8 \tempo "Recitativo" \autoBeamOff r4^\markup { \small Baritono } r a diff --git a/Documentation/snippets/vocal-music.snippet-list b/Documentation/snippets/vocal-music.snippet-list index b62574ffc0..fd9f3f3cd6 100644 --- a/Documentation/snippets/vocal-music.snippet-list +++ b/Documentation/snippets/vocal-music.snippet-list @@ -7,6 +7,7 @@ ambitus-with-multiple-voices.ly ambitus.ly ancient-notation-template----modern-transcription-of-gregorian-music.ly anglican-psalm-template.ly +arranging-separate-lyrics-on-a-single-line.ly changing-stanza-fonts.ly chant-or-psalms-notation.ly forcing-hyphens-to-be-shown.ly @@ -26,6 +27,7 @@ single-staff-template-with-notes-and-lyrics.ly skips-in-lyric-mode-2.ly skips-in-lyric-mode.ly using-arpeggiobracket-to-make-divisi-more-visible.ly +using-tags-to-produce-mensural-and-modern-music-from-the-same-source.ly vertically-aligning-ossias-and-lyrics.ly vertically-centered-common-lyrics.ly vocal-ensemble-template-with-automatic-piano-reduction.ly diff --git a/Documentation/snippets/volta-below-chords.ly b/Documentation/snippets/volta-below-chords.ly index 1c43944d60..def56665c5 100644 --- a/Documentation/snippets/volta-below-chords.ly +++ b/Documentation/snippets/volta-below-chords.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "chords, repeats, staff-notation" @@ -17,7 +17,6 @@ put under chords. doctitle = "Volta below chords" } % begin verbatim - \score { << \chords { diff --git a/Documentation/snippets/volta-multi-staff.ly b/Documentation/snippets/volta-multi-staff.ly index a16d728f33..db17173d06 100644 --- a/Documentation/snippets/volta-multi-staff.ly +++ b/Documentation/snippets/volta-multi-staff.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "really-simple, repeats, staff-notation" @@ -17,7 +17,6 @@ put over staves other than the topmost one in a score. doctitle = "Volta multi staff" } % begin verbatim - voltaMusic = \relative c'' { \repeat volta 2 { c1 diff --git a/Documentation/snippets/volta-text-markup-using-repeatcommands.ly b/Documentation/snippets/volta-text-markup-using-repeatcommands.ly index 55ef3c14a2..73415a718c 100644 --- a/Documentation/snippets/volta-text-markup-using-repeatcommands.ly +++ b/Documentation/snippets/volta-text-markup-using-repeatcommands.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "repeats, symbols-and-glyphs, text" @@ -25,7 +25,6 @@ separate list elements: doctitle = "Volta text markup using repeatCommands" } % begin verbatim - voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } \relative c'' { diff --git a/Documentation/snippets/wind-headword.ly b/Documentation/snippets/wind-headword.ly index 821403d192..2cd83c1bf5 100644 --- a/Documentation/snippets/wind-headword.ly +++ b/Documentation/snippets/wind-headword.ly @@ -1,10 +1,12 @@ -%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it -%% Make any changes in LSR itself, or in Documentation/snippets/new/ , -%% and then run scripts/auxiliar/makelsr.py -%% -%% This file is in the public domain. -\version "2.17.6" +% DO NOT EDIT this file manually; it is automatically +% generated from Documentation/snippets/new +% Make any changes in Documentation/snippets/new/ +% and then run scripts/auxiliar/makelsr.py +% +% This file is in the public domain. +%% Note: this file works from version 2.19.20 + +\version "2.19.20" \header { lsrtags = "headword" @@ -16,6 +18,10 @@ Wind headword doctitle = "Wind headword" } % begin verbatim + +%% http://lsr.di.unimi.it/LSR/Item?id=833 +%% see also http://lilypond.org/doc/v2.18/Documentation/notation/wind-instruments + % NR 2.whatever Wind % Tchaikovsky % Nutcracker Suite, VII Dance of the Merlitons @@ -30,8 +36,7 @@ Wind headword \mark \markup \large \bold {Moderato assai} \key d \major \time 2/4 - \compressFullBarRests - R2*2 + \compressMMRests R2*2 16-.\p -. -. -. 8-. -. -.\< 32( 4--)\mf 16-. -. -. -. @@ -42,8 +47,7 @@ Wind headword \set Staff.instrumentName = "Flauto III" \key d \major \time 2/4 - \compressFullBarRests - R2*2_\markup{Gr.Fl.} + \compressMMRests R2*2_\markup{Gr.Fl.} fis16-.\p e-. fis-. e-. fis8-. e-. g8-.\< fis32( a d fis a4--)\mf b16-. a-. b-. a-. g(\> fis) d-. a-.\! diff --git a/Documentation/snippets/woodwind-diagrams-key-lists.ly b/Documentation/snippets/woodwind-diagrams-key-lists.ly index 011aa3dcc6..4fe018c92b 100644 --- a/Documentation/snippets/woodwind-diagrams-key-lists.ly +++ b/Documentation/snippets/woodwind-diagrams-key-lists.ly @@ -1,26 +1,25 @@ -% DO NOT EDIT this file manually; it is automatically -% generated from Documentation/snippets/new -% Make any changes in Documentation/snippets/new/ -% and then run scripts/auxiliar/makelsr.py -% -% This file is in the public domain. -%% Note: this file works from version 2.16.0 -\version "2.16.0" +%% DO NOT EDIT this file manually; it is automatically +%% generated from LSR http://lsr.di.unimi.it +%% Make any changes in LSR itself, or in Documentation/snippets/new/ , +%% and then run scripts/auxiliar/makelsr.py +%% +%% This file is in the public domain. +\version "2.18.0" \header { lsrtags = "winds" - texidoc=" -The snippet below produces a list of all possible keys and key -settings for woodwind diagrams as defined in -@file{scm/define-woodwind-diagrams.scm}. The list will be displayed -in the log file, but not in the music. If output to the console -is wanted, omit the @code{(current-error-port)} from the commands. + texidoc = " +The snippet below produces a list of all possible keys and key settings +for woodwind diagrams as defined in +@code{scm/define-woodwind-diagrams.scm}. The list will be displayed in +the log file, but not in the music. If output to the console is +wanted, omit the @code{(current-error-port)} from the commands. + " doctitle = "Woodwind diagrams key lists" } % begin verbatim - #(print-keys-verbose 'piccolo (current-error-port)) #(print-keys-verbose 'flute (current-error-port)) #(print-keys-verbose 'flute-b-extension (current-error-port)) @@ -36,3 +35,5 @@ is wanted, omit the @code{(current-error-port)} from the commands. #(print-keys-verbose 'baritone-saxophone (current-error-port)) #(print-keys-verbose 'bassoon (current-error-port)) #(print-keys-verbose 'contrabassoon (current-error-port)) + +\score {c''1} diff --git a/Documentation/snippets/woodwind-diagrams-listing.ly b/Documentation/snippets/woodwind-diagrams-listing.ly index db8661d843..034f709854 100644 --- a/Documentation/snippets/woodwind-diagrams-listing.ly +++ b/Documentation/snippets/woodwind-diagrams-listing.ly @@ -1,10 +1,10 @@ %% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% %% This file is in the public domain. -\version "2.16.0" +\version "2.18.0" \header { lsrtags = "specific-notation, winds" @@ -17,6 +17,10 @@ defined in LilyPond. doctitle = "Woodwind diagrams listing" } % begin verbatim +\layout { + indent = 0 +} + \relative c' { \textLengthOn c1^ diff --git a/Documentation/snippets/workaround.snippet-list b/Documentation/snippets/workaround.snippet-list index 3d43a69835..d1e641f4a5 100644 --- a/Documentation/snippets/workaround.snippet-list +++ b/Documentation/snippets/workaround.snippet-list @@ -14,6 +14,6 @@ marking-notes-of-spoken-parts-with-a-cross-on-the-stem.ly measure-counter.ly positioning-segno-and-coda-with-line-break.ly printing-text-from-right-to-left.ly -transcription-of-ancient-music-with-incipit.ly transposing-pitches-with-minimum-accidentals-smart-transpose.ly +using-an-extra-voice-for-breaks.ly vertically-aligned-dynamics-and-textscripts.ly diff --git a/Documentation/topdocs/AUTHORS.texi b/Documentation/topdocs/AUTHORS.texi index d802b4310c..10e0827c9b 100644 --- a/Documentation/topdocs/AUTHORS.texi +++ b/Documentation/topdocs/AUTHORS.texi @@ -1,5 +1,5 @@ \input texinfo @c -*-texinfo-*- -@documentencoding utf-8 +@documentencoding UTF-8 @documentlanguage en @setfilename AUTHORS.info @settitle AUTHORS - who did what for GNU LilyPond diff --git a/Documentation/topdocs/INSTALL.texi b/Documentation/topdocs/INSTALL.texi index b562cc4d68..3497e4d4b6 100644 --- a/Documentation/topdocs/INSTALL.texi +++ b/Documentation/topdocs/INSTALL.texi @@ -1,5 +1,5 @@ \input texinfo @c -*-texinfo-*- -@documentencoding utf-8 +@documentencoding UTF-8 @documentlanguage en @setfilename INSTALL.info @settitle INSTALL - compiling and installing GNU LilyPond @@ -25,4 +25,3 @@ @include included/compile.itexi @bye - diff --git a/Documentation/topdocs/README.texi b/Documentation/topdocs/README.texi index 20a051f983..4dce2a313f 100644 --- a/Documentation/topdocs/README.texi +++ b/Documentation/topdocs/README.texi @@ -1,5 +1,5 @@ \input texinfo @c -*-texinfo-*- -@documentencoding utf-8 +@documentencoding UTF-8 @documentlanguage en @setfilename README.info @settitle Toplevel README @@ -24,7 +24,7 @@ denotes a stable version. For development versions 'y' is odd. @section Downloading The primary download site for sourcecode is -@uref{http://lilypond.org/download/}. +@uref{http://lilypond.org/downloads/}. @section Compilation @@ -72,9 +72,8 @@ list. @item @uref{http://lists.gnu.org/mailman/listinfo/bug-lilypond,bug-lilypond@@gnu.org} for sending bugreports. -@item @uref{http://lists.gnu.org/mailman/listinfo/lilypond-cvs,lilypond-cvs@@gnu.org} - for log files from the -autobuild. +@item @uref{http://lists.gnu.org/mailman/listinfo/lilypond-auto,lilypond-auto@@gnu.org} + for notifications from the issue tracking systems of LilyPond. @end itemize You can search the lists from our @uref{http://lilypond.org/search, diff --git a/Documentation/translations.itexi b/Documentation/translations.itexi index 6951c1ce8f..a12eb1c585 100644 --- a/Documentation/translations.itexi +++ b/Documentation/translations.itexi @@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; } @end html @end ifhtml -@emph{Last updated Wed Dec 18 12:23:14 UTC 2013 +@emph{Last updated Sat Jul 2 15:06:05 UTC 2016 } @multitable @columnfractions 0.333333333333 0.333333333333 0.333333333333 @@ -27,7 +27,7 @@ LilyPond Changes @item Section titles @* -(1453) +(2393) @tab Francisco Vila @* @@ -127,13 +127,14 @@ up to date @end multitable -@multitable @columnfractions 0.25 0.25 0.25 0.25 +@multitable @columnfractions 0.2 0.2 0.2 0.2 0.2 @headitem Essay on automated music engraving @tab de @tab es @tab fr +@tab hu @item Section titles @* @@ -155,11 +156,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Francisco Vila @* @@ -220,6 +221,31 @@ translated @ifhtml +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml +@tab Hegyi Tamás +@* +Harmath Dénes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + @html up to date @end html @@ -320,10 +346,35 @@ translated @ifnothtml up to date @end ifnothtml +@tab Hegyi Tamás +@* +Harmath Dénes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @item 1 Music engraving @* -(5296) +(5315) @tab  Till Paala @* @@ -341,7 +392,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -417,10 +468,35 @@ translated @ifnothtml up to date @end ifnothtml +@tab Hegyi Tamás +@* +Harmath Dénes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @item 2 Literature list @* -(326) +(382) @tab Till Paala @* @@ -438,11 +514,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Francisco Vila @* @@ -495,11 +571,36 @@ Jean-Charles Malahieude @ifhtml @html -partially translated (92 %) +partially translated (93 %) +@end html +@end ifhtml +@ifnothtml +partially translated (93 %) +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml +@tab Hegyi Tamás +@* +Harmath Dénes +@* + +@ifhtml + +@html +translated @end html @end ifhtml @ifnothtml -partially translated (92 %) +translated @end ifnothtml @* @@ -598,6 +699,31 @@ not translated @ifhtml +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml +@tab Hegyi Tamás +@* +Harmath Dénes +@* + +@ifhtml + +@html +not translated +@end html +@end ifhtml +@ifnothtml +not translated +@end ifnothtml +@* + +@ifhtml + @html up to date @end html @@ -636,11 +762,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Francisco Vila @* @@ -764,7 +890,7 @@ up to date @item 1 Scheme tutorial @* -(6271) +(6359) @tab Till Paala @* @@ -782,7 +908,7 @@ partially translated (53 %) @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -837,7 +963,7 @@ up to date @item 2 Interfaces for programmers @* -(5925) +(5752) @tab Till Paala @* @@ -855,7 +981,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -1005,10 +1131,11 @@ up to date @end multitable -@multitable @columnfractions 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.111111111111 +@multitable @columnfractions 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 @headitem LilyPond Learning Manual +@tab ca @tab cs @tab de @tab es @@ -1021,6 +1148,29 @@ LilyPond Learning Manual Section titles @* (124) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Pavel Fric @* @@ -1038,7 +1188,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -1046,6 +1196,8 @@ partially up to date @end ifnothtml @tab Till Paala @* +Michael Gerdau +@* @ifhtml @@ -1132,7 +1284,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -1181,7 +1333,9 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @@ -1241,16 +1395,39 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item LilyPond --- \TITLE\ @* (1139) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml @tab Pavel Fric @* @@ -1276,6 +1453,8 @@ partially up to date @end ifnothtml @tab Till Paala @* +Michael Gerdau +@* @ifhtml @@ -1411,7 +1590,9 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @@ -1480,25 +1661,48 @@ up to date @item 1 Tutorial @* -(2578) +(2499) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Pavel Fric @* @ifhtml @html -partially translated (48 %) +partially translated (50 %) @end html @end ifhtml @ifnothtml -partially translated (48 %) +partially translated (50 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -1508,6 +1712,8 @@ partially up to date @* Reinhold Kainhofer @* +Michael Gerdau +@* @ifhtml @@ -1532,22 +1738,22 @@ Hajo Bäß @ifhtml @html -partially translated (48 %) +translated @end html @end ifhtml @ifnothtml -partially translated (48 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Francisco Vila @* @@ -1647,18 +1853,18 @@ up to date @ifhtml @html -partially translated (44 %) +translated @end html @end ifhtml @ifnothtml -partially translated (44 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -1707,28 +1913,30 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @html -partially translated (48 %) +translated @end html @end ifhtml @ifnothtml -partially translated (48 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Jan Nieuwenhuizen @* @@ -1756,18 +1964,18 @@ partially up to date @ifhtml @html -partially translated (48 %) +partially translated (50 %) @end html @end ifhtml @ifnothtml -partially translated (48 %) +partially translated (50 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -1776,53 +1984,78 @@ partially up to date @item 2 Common notation @* -(4396) -@tab Pavel Fric +(4402) +@tab Walter Garcia-Fontes @* @ifhtml @html -partially translated (35 %) +translated @end html @end ifhtml @ifnothtml -partially translated (35 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml partially up to date @end ifnothtml -@tab Till Paala +@tab Pavel Fric @* @ifhtml @html -partially translated (35 %) +partially translated (37 %) @end html @end ifhtml @ifnothtml -partially translated (35 %) +partially translated (37 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml partially up to date @end ifnothtml +@tab ??? +@* +Michael Gerdau +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml @tab Francisco Vila @* @@ -1856,11 +2089,11 @@ Gauvain Pocentek @ifhtml @html -Jean-Charles Malahieude +J.-Charles Malahieude @end html @end ifhtml @ifnothtml -Jean-Charles Malahieude +J.-Charles Malahieude @end ifnothtml @* @@ -1921,18 +2154,18 @@ up to date @ifhtml @html -partially translated (35 %) +translated @end html @end ifhtml @ifnothtml -partially translated (35 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -1981,28 +2214,30 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @html -partially translated (35 %) +translated @end html @end ifhtml @ifnothtml -partially translated (35 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Jan Nieuwenhuizen @* @@ -2030,18 +2265,18 @@ partially up to date @ifhtml @html -partially translated (35 %) +partially translated (37 %) @end html @end ifhtml @ifnothtml -partially translated (35 %) +partially translated (37 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -2050,7 +2285,30 @@ partially up to date @item 3 Fundamental concepts @* -(11144) +(11119) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Pavel Fric @* @@ -2068,7 +2326,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -2078,6 +2336,8 @@ partially up to date @* Reinhold Kainhofer @* +Michael Gerdau +@* @ifhtml @@ -2093,11 +2353,11 @@ translated @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Francisco Vila @* @@ -2167,7 +2427,9 @@ translated @ifnothtml up to date @end ifnothtml -@tab Harmath Dénes +@tab Griechisch Erika +@* +Harmath Dénes @* @ifhtml @@ -2184,7 +2446,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -2250,7 +2512,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -2293,7 +2555,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -2302,52 +2564,77 @@ partially up to date @item 4 Tweaking output @* -(16191) +(16592) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml @tab Pavel Fric @* @ifhtml @html -partially translated (50 %) +partially translated (51 %) @end html @end ifhtml @ifnothtml -partially translated (50 %) +partially translated (51 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml partially up to date @end ifnothtml -@tab Till Paala +@tab ??? +@* +Michael Gerdau @* @ifhtml @html -partially translated (52 %) +translated @end html @end ifhtml @ifnothtml -partially translated (52 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Francisco Vila @* @@ -2447,7 +2734,7 @@ not translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -2502,18 +2789,18 @@ up to date @ifhtml @html -partially translated (98 %) +partially translated (95 %) @end html @end ifhtml @ifnothtml -partially translated (98 %) +partially translated (95 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -2545,18 +2832,18 @@ partially up to date @ifhtml @html -partially translated (98 %) +partially translated (95 %) @end html @end ifhtml @ifnothtml -partially translated (98 %) +partially translated (95 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -2565,25 +2852,48 @@ partially up to date @item A Templates @* -(372) +(1236) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +partially translated (97 %) +@end html +@end ifhtml +@ifnothtml +partially translated (97 %) +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Pavel Fric @* @ifhtml @html -partially translated (38 %) +partially translated (75 %) @end html @end ifhtml @ifnothtml -partially translated (38 %) +partially translated (75 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -2591,26 +2901,28 @@ partially up to date @end ifnothtml @tab Till Paala @* +Michael Gerdau +@* @ifhtml @html -partially translated (38 %) +translated @end html @end ifhtml @ifnothtml -partially translated (38 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Francisco Vila @* @@ -2675,7 +2987,7 @@ not translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -2730,22 +3042,22 @@ up to date @ifhtml @html -translated +partially translated (97 %) @end html @end ifhtml @ifnothtml -translated +partially translated (97 %) @end ifnothtml @* @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Jan Nieuwenhuizen @* @@ -2757,27 +3069,54 @@ up to date @end html @end ifhtml @ifnothtml - + +@end ifnothtml +@* + +@ifhtml + +@html + +@end html +@end ifhtml +@ifnothtml + +@end ifnothtml +@ifhtml + +@html +partially translated (97 %) +@end html +@end ifhtml +@ifnothtml +partially translated (97 %) @end ifnothtml @* @ifhtml @html - +partially up to date @end html @end ifhtml @ifnothtml - +partially up to date @end ifnothtml +@item +B GNU Free Documentation License +@* +(3724) +@tab Walter Garcia-Fontes +@* + @ifhtml @html -translated +not translated @end html @end ifhtml @ifnothtml -translated +not translated @end ifnothtml @* @@ -2790,10 +3129,6 @@ translated @ifnothtml up to date @end ifnothtml -@item -B GNU Free Documentation License -@* -(3724) @tab Pavel Fric @* @@ -2819,6 +3154,8 @@ up to date @end ifnothtml @tab Till Paala @* +Michael Gerdau +@* @ifhtml @@ -2954,7 +3291,9 @@ not translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @@ -3053,11 +3392,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Francisco Vila @* @@ -3147,11 +3486,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item LilyPond --- \TITLE\ @@ -3398,7 +3737,7 @@ up to date @item 1.1 Pitches @* -(4990) +(5169) @tab Till Paala @* @@ -3416,7 +3755,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -3447,6 +3786,8 @@ up to date @end ifnothtml @tab Frédéric Chiasson @* +Jean-Charles Malahieude +@* @ifhtml @@ -3559,7 +3900,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -3568,7 +3909,7 @@ partially up to date @item 1.2 Rhythms @* -(6890) +(6795) @tab Till Paala @* @@ -3586,7 +3927,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -3742,7 +4083,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -3751,7 +4092,7 @@ partially up to date @item 1.3 Expressive marks @* -(1793) +(1798) @tab Till Paala @* @@ -3769,7 +4110,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -3792,11 +4133,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Valentin Villenave @* @@ -3891,11 +4232,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Yoshiki Sawada @* @@ -3914,16 +4255,16 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item 1.4 Repeats @* -(1050) +(1288) @tab Till Paala @* @@ -3941,7 +4282,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -4086,16 +4427,16 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item 1.5 Simultaneous notes @* -(2821) +(2919) @tab Till Paala @* @@ -4113,7 +4454,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -4260,7 +4601,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -4269,7 +4610,7 @@ partially up to date @item 1.6 Staff notation @* -(2476) +(2554) @tab Till Paala @* @@ -4287,7 +4628,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -4421,7 +4762,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -4430,7 +4771,7 @@ partially up to date @item 1.7 Editorial annotations @* -(954) +(1477) @tab Till Paala @* @@ -4448,7 +4789,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -4560,16 +4901,16 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item 1.8 Text @* -(2816) +(2754) @tab Till Paala @* @@ -4587,7 +4928,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -4610,11 +4951,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Jean-Charles Malahieude @* @@ -4707,13 +5048,15 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @@ -4817,11 +5160,11 @@ up to date @ifhtml @html -partially translated (2 %) +translated @end html @end ifhtml @ifnothtml -partially translated (2 %) +translated @end ifnothtml @* @@ -4860,7 +5203,7 @@ up to date @item 2.1 Vocal music @* -(5190) +(4975) @tab Till Paala @* @@ -4878,7 +5221,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -4958,11 +5301,31 @@ up to date @ifhtml @html -not translated + @end html @end ifhtml @ifnothtml -not translated + +@end ifnothtml +@* + +@ifhtml + +@html + +@end html +@end ifhtml +@ifnothtml + +@end ifnothtml +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated @end ifnothtml @* @@ -4992,7 +5355,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -5001,7 +5364,7 @@ partially up to date @item 2.2 Keyboard and other multi-staff instruments @* -(888) +(904) @tab  Till Paala @* @@ -5019,7 +5382,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -5144,16 +5507,16 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item 2.3 Unfretted string instruments @* -(281) +(303) @tab Till Paala @* @@ -5171,7 +5534,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -5296,16 +5659,16 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item 2.4 Fretted string instruments @* -(2662) +(2820) @tab Till Paala @* @@ -5323,7 +5686,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -5435,7 +5798,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -5444,7 +5807,7 @@ partially up to date @item 2.5 Percussion @* -(811) +(799) @tab Till Paala @* @@ -5462,7 +5825,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -5576,7 +5939,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -5603,11 +5966,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Francisco Vila @* @@ -5728,16 +6091,16 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item 2.7 Chord notation @* -(1972) +(1931) @tab Till Paala @* @@ -5755,7 +6118,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -5880,7 +6243,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -6028,7 +6391,7 @@ up to date @item 2.9 Ancient notation @* -(5375) +(5516) @tab Till Paala @* @@ -6046,7 +6409,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -6165,11 +6528,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Francisco Vila @* @@ -6245,11 +6608,31 @@ up to date @ifhtml @html -not translated + @end html @end ifhtml @ifnothtml -not translated + +@end ifnothtml +@* + +@ifhtml + +@html + +@end html +@end ifhtml +@ifnothtml + +@end ifnothtml +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated @end ifnothtml @* @@ -6279,34 +6662,34 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item 3 General input and output @* -(10392) +(12704) @tab Till Paala @* @ifhtml @html -translated +partially translated (94 %) @end html @end ifhtml @ifnothtml -translated +partially translated (94 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -6366,11 +6749,31 @@ up to date @ifhtml @html -not translated + @end html @end ifhtml @ifnothtml -not translated + +@end ifnothtml +@* + +@ifhtml + +@html + +@end html +@end ifhtml +@ifnothtml + +@end ifnothtml +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated @end ifnothtml @* @@ -6389,18 +6792,18 @@ up to date @ifhtml @html -translated +partially translated (94 %) @end html @end ifhtml @ifnothtml -translated +partially translated (94 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -6409,7 +6812,7 @@ partially up to date @item 4 Spacing issues @* -(12256) +(10911) @tab Till Paala @* @@ -6427,7 +6830,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -6487,11 +6890,31 @@ up to date @ifhtml @html -not translated + @end html @end ifhtml @ifnothtml -not translated + +@end ifnothtml +@* + +@ifhtml + +@html + +@end html +@end ifhtml +@ifnothtml + +@end ifnothtml +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated @end ifnothtml @* @@ -6521,7 +6944,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -6530,7 +6953,7 @@ partially up to date @item 5 Changing defaults @* -(15289) +(15598) @tab Till Paala @* @@ -6548,7 +6971,7 @@ partially translated (85 %) @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -6609,30 +7032,50 @@ Gilles Thibault @end html @end ifhtml @ifnothtml -translated +translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml +@tab Federico Bruni +@* + +@ifhtml + +@html + +@end html +@end ifhtml +@ifnothtml + @end ifnothtml @* @ifhtml @html -up to date + @end html @end ifhtml @ifnothtml -up to date -@end ifnothtml -@tab Federico Bruni -@* +@end ifnothtml @ifhtml @html -not translated +translated @end html @end ifhtml @ifnothtml -not translated +translated @end ifnothtml @* @@ -6651,18 +7094,18 @@ up to date @ifhtml @html -partially translated (97 %) +partially translated (94 %) @end html @end ifhtml @ifnothtml -partially translated (97 %) +partially translated (94 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -6671,7 +7114,7 @@ partially up to date @item A Notation manual tables @* -(2176) +(3077) @tab Till Paala @* @@ -6689,11 +7132,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Francisco Vila @* @@ -6749,11 +7192,11 @@ up to date @ifhtml @html -not translated +translated @end html @end ifhtml @ifnothtml -not translated +translated @end ifnothtml @* @@ -6810,7 +7253,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -6888,11 +7331,11 @@ up to date @ifhtml @html -not translated +translated @end html @end ifhtml @ifnothtml -not translated +translated @end ifnothtml @* @@ -6922,11 +7365,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item C GNU Free Documentation License @@ -7052,10 +7495,11 @@ up to date @end multitable -@multitable @columnfractions 0.142857142857 0.142857142857 0.142857142857 0.142857142857 0.142857142857 0.142857142857 0.142857142857 +@multitable @columnfractions 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 @headitem LilyPond Application Usage +@tab ca @tab de @tab es @tab fr @@ -7066,6 +7510,29 @@ LilyPond Application Usage Section titles @* (135) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Till Paala @* @@ -7083,11 +7550,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Francisco Vila @* @@ -7137,7 +7604,7 @@ translated @ifnothtml up to date @end ifnothtml -@tab Team-hu +@tab Harmath Dénes @* @ifhtml @@ -7154,7 +7621,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -7203,7 +7670,9 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @@ -7230,6 +7699,29 @@ up to date LilyPond --- \TITLE\ @* (1139) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml @tab Till Paala @* @@ -7301,7 +7793,7 @@ translated @ifnothtml up to date @end ifnothtml -@tab Team-hu +@tab Harmath Dénes @* @ifhtml @@ -7367,7 +7859,9 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @@ -7393,7 +7887,30 @@ up to date @item 1 Running @command{lilypond} @* -(4537) +(5440) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +partially translated (95 %) +@end html +@end ifhtml +@ifnothtml +partially translated (95 %) +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Reinhold Kainhofer @* Till Paala @@ -7422,18 +7939,18 @@ Till Paala @ifhtml @html -translated +partially translated (95 %) @end html @end ifhtml @ifnothtml -translated +partially translated (95 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -7505,24 +8022,24 @@ translated @ifnothtml up to date @end ifnothtml -@tab Team-hu +@tab Harmath Dénes @* @ifhtml @html -partially translated (94 %) +partially translated (91 %) @end html @end ifhtml @ifnothtml -partially translated (94 %) +partially translated (91 %) @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -7571,24 +8088,26 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @html -partially translated (97 %) +translated @end html @end ifhtml @ifnothtml -partially translated (97 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -7597,7 +8116,30 @@ partially up to date @item 2 Updating files with @command{convert-ly} @* -(1484) +(1866) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Till Paala @* @@ -7615,7 +8157,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -7687,7 +8229,7 @@ translated @ifnothtml up to date @end ifnothtml -@tab Team-hu +@tab Harmath Dénes @* @ifhtml @@ -7704,7 +8246,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -7770,7 +8312,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -7779,7 +8321,30 @@ partially up to date @item 3 Running @command{lilypond-book} @* -(4137) +(4211) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +not translated +@end html +@end ifhtml +@ifnothtml +not translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml @tab Reinhold Kainhofer @* @@ -7817,7 +8382,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -7889,7 +8454,7 @@ translated @ifnothtml up to date @end ifnothtml -@tab Team-hu +@tab Harmath Dénes @* @ifhtml @@ -7906,7 +8471,7 @@ partially translated (13 %) @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -7972,7 +8537,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -7981,7 +8546,30 @@ partially up to date @item 4 External programs @* -(2817) +(2786) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +not translated +@end html +@end ifhtml +@ifnothtml +not translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml @tab Till Paala @* Reinhold Kainhofer @@ -8001,7 +8589,7 @@ partially translated (87 %) @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -8053,7 +8641,7 @@ translated @ifnothtml up to date @end ifnothtml -@tab Team-hu +@tab Harmath Dénes @* @ifhtml @@ -8136,7 +8724,7 @@ partially translated (87 %) @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -8145,7 +8733,30 @@ partially up to date @item 5 Suggestions for writing files @* -(2692) +(2793) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Till Paala @* @@ -8163,7 +8774,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -8259,7 +8870,7 @@ translated @ifnothtml up to date @end ifnothtml -@tab Team-hu +@tab Harmath Dénes @* @ifhtml @@ -8342,7 +8953,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -8352,6 +8963,29 @@ partially up to date A GNU Free Documentation License @* (3724) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +not translated +@end html +@end ifhtml +@ifnothtml +not translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml @tab Till Paala @* @@ -8423,7 +9057,7 @@ not translated @ifnothtml up to date @end ifnothtml -@tab Team-hu +@tab Harmath Dénes @* @ifhtml @@ -8489,7 +9123,9 @@ not translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @@ -8515,10 +9151,11 @@ up to date @end multitable -@multitable @columnfractions 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 +@multitable @columnfractions 0.0909090909091 0.0909090909091 0.0909090909091 0.0909090909091 0.0909090909091 0.0909090909091 0.0909090909091 0.0909090909091 0.0909090909091 0.0909090909091 0.0909090909091 @headitem LilyPond -- Music notation for everyone +@tab ca @tab cs @tab de @tab es @@ -8531,7 +9168,30 @@ LilyPond -- Music notation for everyone @item Section titles @* -(616) +(629) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml @tab Pavel Fric @* @@ -8549,7 +9209,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -8557,6 +9217,8 @@ partially up to date @end ifnothtml @tab Till Paala @* +Michael Gerdau +@* @ifhtml @@ -8641,7 +9303,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -8690,7 +9352,9 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* Yoshinobu Ishizaki @* @@ -8752,11 +9416,11 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @tab Ben Luo @* @@ -8777,16 +9441,39 @@ translated @ifhtml @html -up to date +partially up to date @end html @end ifhtml @ifnothtml -up to date +partially up to date @end ifnothtml @item LilyPond --- \TITLE\ @* (1139) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml @tab Pavel Fric @* @@ -8812,6 +9499,8 @@ partially up to date @end ifnothtml @tab Till Paala @* +Michael Gerdau +@* @ifhtml @@ -8945,7 +9634,9 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* Yoshinobu Ishizaki @* @@ -9032,16 +9723,39 @@ translated @ifhtml @html - +up to date @end html @end ifhtml @ifnothtml - +up to date @end ifnothtml @item Introduction @* -(4937) +(5815) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Pavel Fric @* @@ -9059,7 +9773,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9067,6 +9781,8 @@ partially up to date @end ifnothtml @tab Till Paala @* +Michael Gerdau +@* @ifhtml @@ -9082,7 +9798,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9175,7 +9891,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9224,7 +9940,9 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* Yoshinobu Ishizaki @* @@ -9243,11 +9961,11 @@ translated @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Jan Nieuwenhuizen @* @@ -9286,7 +10004,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9311,16 +10029,39 @@ translated @ifhtml @html - +partially up to date @end html @end ifhtml @ifnothtml - +partially up to date @end ifnothtml @item Download @* -(1201) +(1158) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Pavel Fric @* @@ -9338,7 +10079,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9346,6 +10087,8 @@ partially up to date @end ifnothtml @tab Till Paala @* +Michael Gerdau +@* @ifhtml @@ -9361,7 +10104,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9452,7 +10195,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9501,7 +10244,9 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @@ -9518,11 +10263,11 @@ translated @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Jan Nieuwenhuizen @* @@ -9561,7 +10306,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9586,16 +10331,39 @@ translated @ifhtml @html - +partially up to date @end html @end ifhtml @ifnothtml - +partially up to date @end ifnothtml @item Manuals @* -(1284) +(1314) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab Pavel Fric @* @@ -9613,7 +10381,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9621,6 +10389,8 @@ partially up to date @end ifnothtml @tab Till Paala @* +Michael Gerdau +@* @ifhtml @@ -9636,11 +10406,11 @@ translated @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Francisco Vila @* @@ -9725,7 +10495,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9774,7 +10544,9 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @@ -9791,11 +10563,11 @@ translated @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Jan Nieuwenhuizen @* @@ -9834,7 +10606,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9877,7 +10649,7 @@ translated @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -9887,6 +10659,29 @@ partially up to date A GNU Free Documentation License @* (3724) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +not translated +@end html +@end ifhtml +@ifnothtml +not translated +@end ifnothtml +@* + +@ifhtml + +@html +up to date +@end html +@end ifhtml +@ifnothtml +up to date +@end ifnothtml @tab Pavel Fric @* @@ -9912,6 +10707,8 @@ up to date @end ifnothtml @tab Till Paala @* +Michael Gerdau +@* @ifhtml @@ -10065,7 +10862,9 @@ not translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @@ -10177,7 +10976,30 @@ up to date @item Community @* -(3073) +(3524) +@tab Walter Garcia-Fontes +@* + +@ifhtml + +@html +translated +@end html +@end ifhtml +@ifnothtml +translated +@end ifnothtml +@* + +@ifhtml + +@html +partially up to date +@end html +@end ifhtml +@ifnothtml +partially up to date +@end ifnothtml @tab  Pavel Fric @* @@ -10195,30 +11017,32 @@ partially translated (95 %) @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml partially up to date @end ifnothtml -@tab  Till Paala +@tab Till Paala +@* +Michael Gerdau @* @ifhtml @html -partially translated (97 %) +translated @end html @end ifhtml @ifnothtml -partially translated (97 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -10309,7 +11133,7 @@ partially translated (95 %) @ifhtml @html -partially up to date +partially up to date @end html @end ifhtml @ifnothtml @@ -10358,28 +11182,30 @@ translated @ifnothtml up to date @end ifnothtml -@tab Yoshiki Sawada +@tab Masamichi Hosoda +@* +Yoshiki Sawada @* @ifhtml @html -partially translated (97 %) +translated @end html @end ifhtml @ifnothtml -partially translated (97 %) +translated @end ifnothtml @* @ifhtml @html -partially up to date +up to date @end html @end ifhtml @ifnothtml -partially up to date +up to date @end ifnothtml @tab Jan Nieuwenhuizen @* @@ -10443,11 +11269,11 @@ partially translated (97 %) @ifhtml @html - +partially up to date @end html @end ifhtml @ifnothtml - +partially up to date @end ifnothtml @end multitable diff --git a/Documentation/usage.tely b/Documentation/usage.tely index cd13e6550c..cd2dbffb1c 100644 --- a/Documentation/usage.tely +++ b/Documentation/usage.tely @@ -19,9 +19,14 @@ LilyPond version @version{}. In addition, it suggests some @qq{best practices} for efficient usage. @end macro -@c `Usage' was born 1999-10-10 with git commit c82c30c... +@c `Usage' was born 1999-10-11 with this commit: +@c release: 1.2.13 +@c author: Han-Wen Nienhuys +@c commit: 0cf97b5cdceecbba937f43ac827f4065aad5001e +@c file: Documentation/user/invoking.itexi + @macro copyrightDeclare -Copyright @copyright{} 1999--2012 by the authors. +Copyright @copyright{} 1999--2015 by the authors. @end macro @set FDL diff --git a/Documentation/usage/external.itely b/Documentation/usage/external.itely index 7c386ae733..659abd27ba 100644 --- a/Documentation/usage/external.itely +++ b/Documentation/usage/external.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @node External programs @chapter External programs @@ -26,11 +26,12 @@ LilyPond can interact with other programs in various ways. @node Point and click @section 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. +in the PDF viewer. This makes it easier to find input that causes some +error in the sheet music. @menu * Configuring the system for point and click:: @@ -38,13 +39,14 @@ some error in the sheet music. * Selective point-and-click:: @end menu + @node Configuring the system for point and click @subsection Configuring the system -When this functionality is active, LilyPond adds hyperlinks to the -PDF file. These hyperlinks are sent to a @q{URI helper} or a -web-browser, which opens a text-editor with the cursor in the -right place. +When this functionality is active, LilyPond adds hyperlinks to PDF and +SVG files. These hyperlinks are sent to a @q{URI helper} or a +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 @@ -87,7 +89,6 @@ emacsclient --no-wait +%(line)s:%(column)s %(file)s for @code{LYEDITOR} is equivalent to the standard emacsclient invocation. - @menu * Using Xpdf for point and click:: * Using GNOME 2 for point and click:: @@ -95,8 +96,10 @@ invocation. * Extra configuration for Evince:: @end menu + @node Using Xpdf for point and click @unnumberedsubsubsec Using Xpdf + @cindex Xpdf For Xpdf on UNIX, the following should be present in @@ -114,38 +117,47 @@ mismatches. Your best bet is to install a current @samp{xpdf} package and the corresponding @samp{libpoppler} package from Debian instead. Once you have tested that this works, you might want to use + @example sudo apt-mark hold xpdf @end example + @noindent in order to keep Ubuntu from overwriting it with the next @q{update} of its crashing package. + @node Using GNOME 2 for point and click @unnumberedsubsubsec Using GNOME 2 For using GNOME 2 (and PDF viewers integrated with it), the magic invocation for telling the system about the @samp{textedit:} URI -is -@example +is; + +@smallexample gconftool-2 -t string -s /desktop/gnome/url-handlers/textedit/command "lilypond-invoke-editor %s" gconftool-2 -s /desktop/gnome/url-handlers/textedit/needs_terminal false -t bool gconftool-2 -t bool -s /desktop/gnome/url-handlers/textedit/enabled true -@end example +@end smallexample + +After that invocation; -After that invocation, @example gnome-open textedit:///etc/issue:1:0:0 @end example + @noindent should call @file{lilypond-invoke-editor} for opening files. + @node Using GNOME 3 for point and click @unnumberedsubsubsec Using GNOME 3 In GNOME 3, URIs are handled by the @q{gvfs} layer rather than by @q{gconf}. Create a file in a local directory such as @file{/tmp} -that is called @file{lilypond-invoke-editor.desktop} and has the contents +that is called @file{lilypond-invoke-editor.desktop} and has the +contents; + @example [Desktop Entry] Version=1.0 @@ -165,15 +177,18 @@ xdg-desktop-menu install ./lilypond-invoke-editor.desktop xdg-mime default lilypond-invoke-editor.desktop x-scheme-handler/textedit @end example -After that invocation, +After that invocation; + @example gnome-open textedit:///etc/issue:1:0:0 @end example @noindent should call @file{lilypond-invoke-editor} for opening files. + @node Extra configuration for Evince @unnumberedsubsubsec Extra configuration for Evince + @cindex Evince If @code{gnome-open} works, but Evince still refuses to open point @@ -184,6 +199,7 @@ actions Evince is allowed to perform. For Ubuntu, the process is to edit the file @file{/etc/apparmor.d/local/usr.bin.evince} and append the following lines: + @example # For Textedit links /usr/local/bin/lilypond-invoke-editor Cx -> sanitized_helper, @@ -200,16 +216,17 @@ sudo apparmor_parser -r -T -W /etc/apparmor.d/usr.bin.evince Now Evince should be able to open point and click links. It is likely that similar configurations will work for other viewers. + @node Enabling point and click @unnumberedsubsec Enabling point and click @cindex file size, output Point and click functionality is enabled by default when creating -PDF files. +PDF or SVG files. 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 +reducing the size of these (and PS) files, point and click may +be switched off by issuing @example \pointAndClickOff @@ -231,7 +248,8 @@ lilypond -dno-point-and-click file.ly @warning{You should always turn off point and click in any LilyPond files to be distributed to avoid including path information about -your computer in the .pdf file, which can pose a security risk.} +your computer in the PDF file, which can pose a security risk.} + @node Selective point-and-click @unnumberedsubsec Selective point-and-click @@ -251,8 +269,8 @@ Hard-coded in the @file{.ly} file: @example \pointAndClickTypes #'note-event -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -260,8 +278,8 @@ or @example #(ly:set-option 'point-and-click 'note-event) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -282,8 +300,8 @@ Hard-coded in the @file{.ly} file: @example \pointAndClickTypes #'(note-event dynamic-event) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -291,8 +309,8 @@ or @example #(ly:set-option 'point-and-click '(note-event dynamic-event)) -\relative c' @{ - c2\f( f) +\relative @{ + c'2\f( f) @} @end example @@ -305,7 +323,6 @@ lilypond \ example.ly @end smallexample - @end itemize @@ -327,6 +344,7 @@ There is support for different text editors for LilyPond. * Other editors:: @end menu + @node Emacs mode @unnumberedsubsec Emacs mode @@ -397,7 +415,6 @@ information. If you have MacOS 10.3 or 10.4 and you have trouble running some of these scripts, e.g. @code{convert-ly}, see @rweb{MacOS X}. - @knownissues We unfortunately do not have the resources to maintain these programs; please consider them @qq{as-is}. Patches are appreciated, but @@ -412,14 +429,13 @@ bug reports will almost certainly not be resolved. @end menu - @node Invoking midi2ly @subsection Invoking @command{midi2ly} @cindex MIDI -@command{midi2ly} translates a Type@tie{}1 MIDI file to a LilyPond source -file. +@command{midi2ly} translates a Type@tie{}1 MIDI file to a LilyPond +source file. MIDI (Music Instrument Digital Interface) is a standard for digital instruments: it specifies cabling, a serial protocol and a file @@ -436,12 +452,12 @@ It is possible to record a MIDI file using a digital keyboard, and then convert it to @file{.ly}. However, human players are not rhythmically exact enough to make a MIDI to LY conversion trivial. When invoked with quantizing (@option{-s} and @option{-d} options) -@command{midi2ly} tries to compensate for these timing errors, but is not -very good at this. It is therefore not recommended to use @command{midi2ly} -for human-generated midi files. - +@command{midi2ly} tries to compensate for these timing errors, but is +not very good at this. It is therefore not recommended to use +@command{midi2ly} for human-generated midi files. It is invoked from the command-line as follows, + @example midi2ly [@var{option}]@dots{} @var{midi-file} @end example @@ -492,9 +508,7 @@ Show warranty and copyright. Treat every text as a lyric. @end table - @knownissues - Overlapping notes in an arpeggio will not be correctly rendered. The first note will be read and the others will be ignored. Set them all to a single duration and add phrase markings or pedal indicators. @@ -510,10 +524,8 @@ for representing music notation. @command{musicxml2ly} extracts the notes, articulations, score structure, lyrics, etc. from part-wise MusicXML files, and writes them to a @file{.ly} -file. It is invoked from the command-line. - +file and is invoked from the command-line as follows; -It is invoked from the command-line as follows, @example musicxml2ly [@var{option}]@dots{} @var{xml-file} @end example @@ -538,11 +550,13 @@ print usage and option summary. use LANG for pitch names, e.g. 'deutsch' for note names in German. @item --loglevel=@var{loglevel} -Set the output verbosity to @var{loglevel}. Possible values are @code{NONE}, -@code{ERROR}, @code{WARNING}, @code{PROGRESS} (default) and @code{DEBUG}. +Set the output verbosity to @var{loglevel}. Possible values are +@code{NONE}, @code{ERROR}, @code{WARNING}, @code{PROGRESS} (default) and +@code{DEBUG}. @item --lxml -use the lxml.etree Python package for XML-parsing; uses less memory and cpu time. +use the lxml.etree Python package for XML-parsing; uses less memory and +cpu time. @item -m, --midi activate midi-block. @@ -556,9 +570,9 @@ do not convert beaming information, use LilyPond's automatic beaming instead. @item -o, --output=@var{file} -set output filename to @var{file}. If @var{file} is @file{-}, the output -will be printed on stdout. If not given, @var{xml-file}@file{.ly} will -be used. +set output filename to @var{file}. If @var{file} is @file{-}, the +output will be printed on stdout. If not given, +@var{xml-file}@file{.ly} will be used. @item -r, --relative convert pitches in relative mode (default). @@ -577,18 +591,20 @@ input file is a zip-compressed MusicXML file. @node Invoking abc2ly @subsection Invoking @code{abc2ly} -@warning{This program is not supported, and may be remove from -future versions of LilyPond.} +@warning{This is not currently supported and may eventually be removed +from future versions of LilyPond.} @cindex ABC -ABC is a fairly simple ASCII based format. It is described at the ABC site: +ABC is a fairly simple ASCII based format. It is described at the ABC +site: @quotation @uref{http://@/www@/.walshaw@/.plus@/.com/@/abc/@/learn@/.html}. @end quotation -@command{abc2ly} translates from ABC to LilyPond. It is invoked as follows: +@command{abc2ly} translates from ABC to LilyPond. It is invoked as +follows: @example abc2ly [@var{option}]@dots{} @var{abc-file} @@ -610,7 +626,7 @@ print version information. @end table There is a rudimentary facility for adding LilyPond code to the ABC -source file. If you say: +source file. For example; @example %%LY voices \set autoBeaming = ##f @@ -628,9 +644,7 @@ Similarly, will cause the text following the @q{slyrics} keyword to be inserted into the current line of lyrics. - @knownissues - The ABC standard is not very @q{standard}. For extended features (e.g., polyphonic music) different conventions exist. @@ -645,19 +659,20 @@ ABC synchronizes words and notes at the beginning of a line; @node Invoking etf2ly @subsection Invoking @command{etf2ly} -@warning{This program is not supported, and may be remove from -future versions of LilyPond.} +@warning{This is not currently supported and may eventually be removed +from future versions of LilyPond.} +@cindex Enigma Transport Format @cindex ETF @cindex enigma @cindex Finale @cindex Coda Technology ETF (Enigma Transport Format) is a format used by Coda Music -Technology's Finale product. @command{etf2ly} will convert part of an ETF -file to a ready-to-use LilyPond file. +Technology's Finale product. @command{etf2ly} will convert part of an +ETF file to a ready-to-use LilyPond file. -It is invoked from the command-line as follows. +It is invoked from the command-line as follows; @example etf2ly [@var{option}]@dots{} @var{etf-file} @@ -678,11 +693,10 @@ set output filename to @var{FILE} version information @end table - @knownissues - The list of articulation scripts is incomplete. Empty measures -confuse @command{etf2ly}. Sequences of grace notes are ended improperly. +confuse @command{etf2ly}. Sequences of grace notes are ended +improperly. @node Other formats @@ -695,7 +709,6 @@ but some external tools can also generate LilyPond files. These are listed in @rweb{Easier editing}. - @node LilyPond output in other programs @section LilyPond output in other programs @@ -703,39 +716,49 @@ This section shows methods to integrate text and music, different than the automated method with @command{lilypond-book}. @menu -* Many quotes from a large score:: -* Inserting LilyPond output into OpenOffice and LibreOffice:: -* Inserting LilyPond output into other programs:: +* LuaTex:: +* OpenOffice and LibreOffice:: +* Other programs:: @end menu -@node Many quotes from a large score -@unnumberedsubsec Many quotes from a large score -If you need to quote many fragments from a large score, you can also use -the clip systems feature, see @ruser{Extracting fragments of music}. +@node LuaTex +@subsection LuaTex + +@cindex LuaTex +@cindex lyluatex +As well as @code{lilypond-book} to integrate LilyPond output, +there is an alternative program that can be used when using LuaTex +called +@uref{https://github.com/jperon/lyluatex/blob/master/README.en.md,lyluatex}. -@node Inserting LilyPond output into OpenOffice and LibreOffice -@unnumberedsubsec Inserting LilyPond output into OpenOffice and LibreOffice + +@node OpenOffice and LibreOffice +@subsection OpenOffice and LibreOffice @cindex OpenOffice.org @cindex LibreOffice.org +@cindex OOoLilyPond LilyPond notation can be added to OpenOffice.org and LibreOffice with -@uref{http://@/ooolilypond@/.sourceforge@/.net@/,OOoLilyPond}. +@uref{http://@/ooolilypond@/.sourceforge@/.net@/,OOoLilyPond}, an +OpenOffice.org extension that converts LilyPond files into images within +OpenOffice.org documents. Although this is no longer being developed, +it appears to still work with version 4. -@node Inserting LilyPond output into other programs -@unnumberedsubsec Inserting LilyPond output into other programs +@node Other programs +@subsection Other programs -To insert LilyPond output in other programs, use @code{lilypond} -instead of @code{lilypond-book}. Each example must be created -individually and added to the document; consult the documentation for -that program. Most programs will be able to insert LilyPond output in -@file{PNG}, @file{EPS}, or @file{PDF} formats. +Other programs that can handle @file{PNG}, @file{EPS}, or @file{PDF} +formats should use @code{lilypond} instead of @code{lilypond-book}. +Each LilyPond output file must be created and inserted separately. +Consult the program's own documentation on how to insert files from +other sources. -To reduce the white space around your LilyPond score, use -the following options +To help reduce the white space around your LilyPond score, use the +following options; @example \paper@{ @@ -747,35 +770,44 @@ the following options scoreTitleMarkup = ##f @} -@{ c1 @} +@var{@dots{} music @dots{}} @end example -To produce useful image files: +@noindent +To produce @file{EPS} images; @example -EPS - lilypond -dbackend=eps -dno-gs-load-fonts -dinclude-eps-fonts myfile.ly +@end example -PNG +@noindent +To produce @file{PNG} images; +@example lilypond -dbackend=eps -dno-gs-load-fonts -dinclude-eps-fonts --png myfile.ly +@end example -A transparent PNG +@noindent +For transparent @file{PNG} images -lilypond -dbackend=eps -dno-gs-load-fonts -dinclude-eps-fonts \ - -dpixmap-format=pngalpha --png myfile.ly -@end example +@smallexample +lilypond -dbackend=eps -dno-gs-load-fonts -dinclude-eps-fonts -dpixmap-format=pngalpha --png myfile.ly +@end smallexample + +@cindex fragments, music +@cindex quoting, music fragments +@cindex music fragments, quoting + +If you need to quote many fragments from a large score, you can also use +the clip systems feature, see @ruser{Extracting fragments of music}. @node Independent includes @section Independent @code{include}s -Some people have written large (and useful!) code that can be -shared between projects. This code might eventually make its way -into LilyPond itself, but until that happens, you must download -and @code{\include} them manually. - +Some users have produced files that can be @code{\include}d with +LilyPond to produce certain effects and those listed below are part of +the LilyPond distribution. Also see @ruser{Working with input files}. @menu * MIDI articulation:: @@ -785,27 +817,12 @@ and @code{\include} them manually. @node MIDI articulation @subsection MIDI articulation -LilyPond can be used to produce MIDI output, for -@qq{proof-hearing} what has been written. However, only dynamics, -explicit tempo markings, and the notes and durations themselves -are produced in the output. - -The @emph{articulate} project is one attempt to get more of the -information in the score into MIDI. It works by shortening -notes not under slurs, to @q{articulate} the notes. The amount of -shortening depends on any articulation markings attached to a -note: staccato halves the note value, tenuto gives a note its full -duration, and so on. The script also realises trills and turns, -and could be extended to expand other ornaments such as mordents. - -@example -@uref{http://@/www@/.nicta@/.com@/.au/@/people/@/chubbp/@/articulate} -@end example - -@knownissues - -Its main limitation is that it can only affect things it knows -about: anything that is merely textual markup (instead of a note -property) is still ignored. - - +@cindex MIDI +@cindex Articulate project + +The @uref{http://www.nicta.com.au/articulate,Articulate} project is an +attempt to enhance LilyPond's MIDI output and works by adjusting note +lengths (that are not under slurs) according to the articulation +markings attached to them. For example, a @q{staccato} halves the note +value, @q{tenuto} gives a note its full duration and so on. See +@ruser{Enhancing MIDI output}. diff --git a/Documentation/usage/lilypond-book.itely b/Documentation/usage/lilypond-book.itely index c14c49b43b..9f4f00a936 100644 --- a/Documentation/usage/lilypond-book.itely +++ b/Documentation/usage/lilypond-book.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.17.11" +@c \version "2.19.22" @c Note: keep this node named so that `info lilypond-book' brings you here. @node lilypond-book @@ -85,8 +85,8 @@ Documents for \verb+lilypond-book+ may freely mix music and text. For example, \begin{lilypond} -\relative c' { - c2 e2 \tuplet 3/2 { f8 a b } a2 e4 +\relative { + c'2 e2 \tuplet 3/2 { f8 a b } a2 e4 } \end{lilypond} @@ -144,8 +144,8 @@ Documents for @command{lilypond-book} may freely mix music and text. For example, @lilypond -\relative c' { - c2 e2 \tuplet 3/2 { f8 a b } a2 e4 +\relative { + c'2 e2 \tuplet 3/2 { f8 a b } a2 e4 } @end lilypond @@ -169,8 +169,8 @@ entire snippet must be enclosed in a @code{\book @{ @}} construct. title = "A scale in LilyPond" } - \relative c' { - c d e f g a b c + \relative { + c' d e f g a b c } } @end lilypond @@ -765,8 +765,8 @@ example, the music will be interpreted in relative mode, but the verbatim quote will not show the @code{relative} block, i.e. @example -\relative c' @{ % begin verbatim - c4 e2 g4 +\relative @{ % begin verbatim + c'4 e2 g4 f2 e % end verbatim @} @end example @@ -882,7 +882,7 @@ way you use, you can easily convert between PostScript and PDF with tools, like @command{ps2pdf} and @command{pdf2ps} included in Ghostscript package. -To produce a PDF file through PDF@LaTeX{}, use +To produce a PDF file through PDF@LaTeX{}, use: @example lilypond-book --pdf yourfile.lytex @@ -893,8 +893,7 @@ pdflatex yourfile.tex @cindex type1 fonts @cindex dvips @cindex invoking dvips -To produce PDF output via @LaTeX{}/@command{dvips}/@command{ps2pdf}, you -should do +To produce PDF output via @LaTeX{}/@command{dvips}/@command{ps2pdf}: @example lilypond-book yourfile.lytex @@ -904,16 +903,33 @@ ps2pdf yourfile.ps @end example @noindent -The @file{.dvi} file created by this process will not contain - note heads. This is normal; if you follow the instructions, they -will be included in the @file{.ps} and @file{.pdf} files. +The @file{.dvi} file created by this process will not contain note heads. +This is normal; if you follow the instructions, they will be included in +the @file{.ps} and @file{.pdf} files. Running @command{dvips} may produce some warnings about fonts; these are harmless and may be ignored. If you are running @command{latex} in twocolumn mode, remember to add @option{-t landscape} to the @command{dvips} options. +Environments such as; + +@example +\begin@{lilypond@} @dots{} \end@{lilypond@} +@end example + +@noindent +are not interpreted by @LaTeX{}. Instead, @code{lilypond-book} extracts +those @q{environments} into files of its own and runs LilyPond on them. +It then takes the resulting graphics and creates a @file{.tex} file +where the @code{\begin@{lilypond@}}@dots{}@code{\end@{lilypond@}} macros +are then replaced by @q{graphics inclusion} commands. It is at this +time that @LaTeX{} is run (although @LaTeX{} will have run previously, +it will have been, effectively, on an @q{empty} document in order to +calculate things like @code{\linewidth}). + @knownissues + The @code{\pageBreak} command will not work within a @code{\begin@{lilypond@} @dots{} \end@{lilypond@}} environment. @@ -1137,8 +1153,8 @@ You can include LilyPond fragments in a LaTeX document. Normal LaTeX text. \begin@{lilypond@} -\relative c'' @{ - a4 b c d +\relative @{ + a'4 b c d @} \end@{lilypond@} @@ -1163,7 +1179,7 @@ is written in Texinfo. Texinfo text @@lilypond -\relative c' @{ +\relative @{ a4 b c d @} @@end lilypond @@ -1190,8 +1206,8 @@ d4 c b a Documents for lilypond-book may freely mix music and text. For example, -\relative c'' @{ - a4 b c d +\relative @{ + a'4 b c d @}

    @@ -1296,7 +1312,7 @@ output file. (format #f "~a, section, 1, @{~a@}, ~a" page text label)))) (formatted-toc-items (map format-line (toc-items))) (whole-string (string-join formatted-toc-items ",\n")) - (output-name (ly:parser-output-name parser)) + (output-name (ly:parser-output-name)) (outfilename (format "~a.toc" output-name)) (outfile (open-output-file outfilename))) (if (output-port? outfile) @@ -1377,5 +1393,3 @@ where @code{\includescore} is defined as: Other means of mixing text and music (without @command{lilypond-book}) are discussed in @ref{LilyPond output in other programs}. - - diff --git a/Documentation/usage/running.itely b/Documentation/usage/running.itely index 7e7692c86d..995119e57b 100644 --- a/Documentation/usage/running.itely +++ b/Documentation/usage/running.itely @@ -52,14 +52,14 @@ scope of this manual; please consult other documentation on this topic if you are unfamiliar with the command-line. @menu -* Invoking lilypond:: +* Invoking LilyPond:: * Basic command line options for LilyPond:: * Advanced command line options for LilyPond:: * Environment variables:: * LilyPond in chroot jail:: @end menu -@node Invoking lilypond +@node Invoking LilyPond @unnumberedsubsec Invoking @command{lilypond} The @command{lilypond} executable may be called as follows from @@ -69,7 +69,6 @@ the command line. lilypond [@var{option}]@dots{} @var{file}@dots{} @end example - When invoked with a filename that has no extension, the @file{.ly} extension is tried first. To read input from stdin, use a dash (@code{-}) for @var{file}. @@ -98,28 +97,74 @@ will output @var{base}@file{-violin.pdf} and @var{base}@file{-cello-1.pdf}. -@unnumberedsubsubsec Standard shell commands +@unnumberedsubsubsec Using LilyPond with standard shell features -If your shell (i.e. command window) supports normal redirects, -then you might find it useful to use the following commands to -redirect console output to a file: +Since LilyPond is a command line application, features of the @q{shell} +used for calling LilyPond can also be put to good use. -@itemize +For example: -@item -@code{lilypond file.ly 1>stdout.log} to redirect normal output +@example +lilypond *.ly +@end example -@item -@code{lilypond file.ly 2>stderr.log} to redirect error messages +@noindent +will process all LilyPond files in the current directory. -@item -@code{lilypond file.ly &>all.log} to redirect all output +Redirecting the console output (e.g. to a file) may also be useful: -@end itemize +@example +lilypond file.ly 1> stdout.txt + +lilypond file.ly 2> stderr.txt -Consult the documentation for your shell to see if it supports these -options, or if the syntax is different. Note that these are shell -commands and have nothing to do with lilypond. +lilypond file.ly &> all.txt +@end example + +@noindent +Redirects @q{normal} output, @q{errors} only or @q{everything}, +respectively, to a text file. Consult the documentation for your +particular shell, Command (Windows), Terminal or Console +applications (MacOS X) to see if output redirection is supported or if +the syntax is different. + +The following example searches and processes all input files in the +current directory and all directories below it recursively. The output +files will be located in the same directory that the command was run in, +rather than in the same directories as the original input files. + +@example +find . -name '*.ly' -exec lilypond '@{@}' \; +@end example + +@noindent +This should also work for MacOS@tie{}X users. + +A Windows user would run; + +@example +forfiles /s /M *.ly /c "cmd /c lilypond @@file" +@end example + +@noindent +entering these commands in a @code{command prompt} usually found under +@code{Start > Accessories > Command Prompt} or for version 8 users, +by typing in the search window @q{command prompt}. + +Alternatively, an explicit path to the top-level of your folder +containing all the sub-folders that have input files in them can be +stated using the @code{/p} option; + +@example +forfiles /s /p C:\Documents\MyScores /M *.ly /c "cmd /c lilypond @@file" +@end example + +If there are spaces in the path to the top-level folder, then the whole +path needs to be inside double quotes; + +@example +forfiles /s /p "C:\Documents\My Scores" /M *.ly /c "cmd /c lilypond @@file" +@end example @node Basic command line options for LilyPond @@ -134,6 +179,34 @@ The following options are supported: @table @code +@item -b, --bigpdfs +@cindex bigpdfs + +PDF files generated will be much larger than normal (due to little or no +font optimization). However, if two or more PDF files are included +within @w{@code{pdftex}}, @w{@code{xetex}} or @w{@code{luatex}} +documents they can then be processed further via ghostscript (merging +duplicated font data) resulting in @emph{significantly} smaller PDF +files. + +@example +lilypond -b myfile +@end example + +Then run @code{ghostscript}; + +@example +gs -q -sDEVICE=pdfwrite -o gsout.pdf myfile.pdf +@end example + +@code{pdfsizeopt.py} can then be used to further optimize the size +of file; + +@example +pdfsizeopt.py --use-multivalent=no gsout.pdf final.pdf +@end example + + @item -d, --define-default=@var{var}=@var{val} See @ref{Advanced command line options for LilyPond}. @@ -173,6 +246,10 @@ which formats should be written. Choices for @code{format} are Example: @code{lilypond -fpng @var{filename}.ly} +@noindent +For @code{svg} and @code{eps} formats use the @code{-dbackend} option. +See @ref{Advanced command line options for LilyPond}. + @item -h, --help Show a summary of usage. @@ -338,8 +415,10 @@ Show the warranty with which GNU LilyPond comes. (It comes with @table @code -@item -d@var{[option-name]}=@var{[value]},--define-default=@var{[option-name]}=@var{[value]} -This sets the equivalent internal Scheme function to @var{value}. +@item -d@var{[option-name]}=@var{[value]}, +--define-default=@var{[option-name]}=@var{[value]} +This sets the equivalent internal Scheme function to @var{value}. For +example; @example -dbackend=svg @@ -347,7 +426,7 @@ This sets the equivalent internal Scheme function to @var{value}. If a @var{value} is not supplied, then the default value is used. The prefix @code{no-} may be added to @var{option-name} to switch @q{off} an -option, e.g. +option. For example; @cindex point and click, command line @@ -372,55 +451,83 @@ default values: @item @code{anti-alias-factor} @tab @code{1} -@tab Render at higher resolution (using given factor) and scale down -result to prevent @q{jaggies} in @code{PNG} images. +@tab Render at a higher resolution (using the given factor) and scale +down the result to prevent @q{jaggies} in @code{PNG} images. @item @code{aux-files} @tab @code{#t} -@tab Create @code{.tex}, @code{.texi}, @code{.count} files in the -@code{EPS} backend. +@tab Create @code{.tex}, @code{.texi} and @code{.count} files when used +with the @code{eps} backend option. @item @code{backend} @tab @code{ps} -@tab Select backend. Postscript files (default) include @code{TTF}, -@code{Type1} and @code{OTF} fonts. No subsetting of these fonts is -done. Using @q{oriental} character sets can lead to very large files. +@tab This is the default setting. Postscript files (default) include +@code{TTF}, @code{Type1} and @code{OTF} fonts. No @q{subsetting} of +these fonts is done. Be aware that using @q{oriental} character sets +can lead to very large file sizes. @item @tab @code{eps} -@tab Encapsulated PostScript. This dumps every page (system) as a -separate @file{EPS} file, without fonts, and as one collated @file{EPS} -file with all pages (systems) including fonts. Used as default by -@command{lilypond-book}. +@tab Used as default by the @command{lilypond-book} command. This dumps +every page as both a single file with all pages and fonts included and +as separate encapsulated postscript files for each page but without fonts +included. @item @tab @code{null} -@tab Do not output a printed score; has the same effect as +@tab Do not output a printed score. This has the same effect as @code{-dno-print-pages}. @item -@tab @code{svg} -@tab Scalable Vector Graphics. This creates a single @code{SVG} file, -without embedded fonts, for every page of output. It is recommended to -install the Century Schoolbook fonts, included with your LilyPond -installation, for optimal rendering. Under UNIX, simply copy these -fonts from the LilyPond directory (typically -@file{/usr/share/lilypond/VERSION/fonts/otf/}) to @file{~/.fonts/}. The -@code{SVG} output should be compatible with any SVG editor or user -agent. There is also an option @code{svg-woff} (below) for use of woff -font files in the SVG backend. +@tab @code{scm} +@tab This dumps out the raw, internal Scheme-based drawing commands. @item -@tab @code{scm} -@tab Dump of the raw, internal Scheme-based drawing commands. +@tab @code{svg} +@tab Scalable Vector Graphics. +A single SVG file is created for every page of output. Music glyphs +are encoded as vector graphics, but text fonts are @emph{not} embedded +in the SVG files. Any SVG viewer will therefore need the relevant text +fonts to be available to it for proper rendering of both text and +lyrics. It is recommended to not use font @q{lists} or @q{aliases} +in case an SVG viewer is unable to handle them. When using +@emph{Web Open Font Format} (WOFF) files the additional +@code{--svg-woff} switch is required. +@end multitable + +@noindent +@strong{Note for backend svg output:} +By default in svg output LilyPond will use the generic +@code{font-family} values of @code{serif}, @code{sans-serif}, or +@code{monospace}. Therefore, when using the backend @code{svg} command +you should explicitly define particular default fonts in your source +file; + +@quotation +@verbatim +\paper { + #(define fonts + (make-pango-font-tree "TeX Gyre Schola" + "TeX Gyre Heros" + "TeX Gyre Cursor" + (/ staff-height pt 20))) +} +@end verbatim +@end quotation + +Also see @ruser{Entire document fonts}. +@multitable @columnfractions .33 .16 .51 @item @code{check-internal-types} @tab @code{#f} @tab Check every property assignment for types. @item @code{clip-systems} @tab @code{#f} -@tab Generate cut-out snippets of a score. +@tab Extract music fragments out of a score. This requires that the +@code{clip-regions} function has been defined within the @code{\layout} +block. See @ruser{Extracting fragments of music}. No fragments are +extracted though if used with the @option{-dno-print-pages} option. @item @code{datadir} @tab @@ -473,6 +580,10 @@ compilation. @tab @code{#f} @tab Dump output signatures of each system. Used for regression testing. +@item @code{embed-source-code} +@tab @code{#f} +@tab Embed the LilyPond source files inside the generated PDF document. + @item @code{eps-box-padding} @tab @code{#f} @tab Pad left edge of the output EPS bounding box by the given amount @@ -551,9 +662,9 @@ escaped double quotes. @tab Set GhostScript's output format for pixel images. @item @code{point-and-click} -@tab @code{#f} -@tab Add @q{point & click} links to @code{PDF} output. See -@ref{Point and click}. +@tab @code{#t} +@tab Add @q{point & click} links to PDF and SVG output. +See @ref{Point and click}. @item @code{preview} @tab @code{#f} @@ -616,9 +727,9 @@ havoc, e.g, @quotation @verbatim -#(system "rm -rf /") +#(s ystem "rm -rf /") % too dangerous to write correctly { - c4^$(ly:gulp-file "/etc/passwd") + c4^$(ly:gulp-file "/etc/passwd") % malicious but not destructive } @end verbatim @end quotation @@ -667,17 +778,22 @@ file names. @item @code{strokeadjust} @tab @code{#f} @tab Force PostScript stroke adjustment. This option is mostly -relevant when @code{PDF} is generated from PostScript output -(stroke adjustment is usually enabled automatically for -low-resolution bitmap devices). Without this option, -@code{PDF}@tie{}previewers tend to produce widely inconsistent -stem widths at resolutions typical for screen display. The option -does not noticeably affect print quality and causes large file -size increases in @code{PDF} files. +relevant when a PDF is generated from PostScript output (stroke +adjustment is usually enabled automatically for low-resolution bitmap +devices). Without this option, PDF previewers tend to produce widely +inconsistent stem widths at resolutions typical for screen display. The +option does not noticeably affect print quality and causes large file +size increases in PDF files. @item @code{svg-woff} @tab @code{#f} -@tab Use woff font files in SVG backend. +@tab This option is required when using Web Open Font Format (WOFF) font +files with the backend @code{svg} command. A single SVG file is created +for every page of output. Apart from LilyPond's own music glyphs, no +other font information will be included. Any SVG viewer will therefore +require the fonts be available to it for the proper rendering of both +text and lyrics. It is also recommended not to use any font @q{aliases} +or @q{lists} in case the SVG viewer cannot handle them. @item @code{trace-memory-frequency} @tab @code{#f} @@ -917,6 +1033,13 @@ when something unexpected happens. If you can't see an error in the indicated line of your input file, try checking one or two lines above the indicated position. +Please note that diagnostics can be triggered at any point during the +many stages of processing. For example if there are parts of the input +that are processed multiple times (i.e. in midi and layout output), or +if the same music variable is used in multiple contexts the same message +may appear several times. Diagnostics produced at a @q{late} stage (i.e +bar checks) might also be issued multiple times. + More information about errors is given in @ref{Common errors}. @@ -935,6 +1058,7 @@ are easily handled. * Error message FT_Get_Glyph_Name:: * Warning staff affinities should only decrease:: * Error message unexpected new:: +* Warning this voice needs a voiceXx or shiftXx setting:: @end menu @node Music runs off the page @@ -978,9 +1102,9 @@ would cause all note heads within the following staff to be colored red, but in fact it results in two staves with the note heads remaining the default black in the lower staff. -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim,fragment] \override Staff.NoteHead.color = #red -\new Staff { a } +\new Staff { a' } @end lilypond This is because a @code{Staff} context does not exist when the @@ -989,37 +1113,13 @@ is applied to it, but then the @code{\new Staff} command creates another, separate, staff into which the notes are placed. The correct code to color all note heads red is -@lilypond[quote,verbatim,relative=2] +@lilypond[quote,verbatim] \new Staff { \override Staff.NoteHead.color = #red - a + a' } @end lilypond -As a second example, if a @code{\relative} command is placed inside -a @code{\repeat} command, two staves result, the second offset from -the first, because the @code{\repeat} command generates two -@code{\relative} blocks, which each implicitly create @code{Staff} -and @code{Voice} blocks. - -@lilypond[quote,verbatim] -\repeat unfold 2 { - \relative c' { c4 d e f } -} -@end lilypond - -Explicitly instantiating the @code{Voice} context fixes the -problem: - -@lilypond[quote,verbatim] -\new Voice { - \repeat unfold 2 { - \relative c' { c4 d e f } - } -} -@end lilypond - - @node Error message Unbound variable % @unnumberedsubsec Error message Unbound variable % @@ -1042,6 +1142,7 @@ UTF-8 encoding. For details, see @ruser{Text encoding}. @node Warning staff affinities should only decrease @unnumberedsubsec Warning staff affinities should only decrease + This warning can appear if there are no staves in the printed output, for example if there are just a @code{ChordName} context and a @code{Lyrics} context as in a lead sheet. The warning @@ -1105,3 +1206,37 @@ staves are introduced in parallel, i.e. simultaneously: >> } @end lilypond + +@node Warning this voice needs a voiceXx or shiftXx setting +@unnumberedsubsec Warning this voice needs a @code{@bs{}voiceXx} or @code{@bs{}shiftXx} setting + +If notes from two different voices with stems in the same direction +occur at the same musical moment, but the voices have no +voice-specific shifts specified, the warning message +@samp{warning: this voice needs a \voiceXx or \shiftXx setting} will appear +when compiling the LilyPond file. This warning will appear even when +the notes have no visible stems, e.g. whole notes, if the stems for +shorter notes at the same pitch would be in the same direction. + +Remember that the stem direction depends on the position of the +note on the staff unless the stem direction is specified, for example +by using @code{\voiceOne}, etc. In this case the warning will appear +only when the stems happen to be in the same direction, i.e. when the +notes are in the same half of the staff. + +By placing the notes in voices with stem directions and shifts +specified, for example by using @code{\voiceOne}, etc., these warnings +may be avoided. + +Notes in higher numbered voices, @code{\voiceThree} etc., are +automatically shifted to avoid clashing note columns. This causes a +visible shift for notes with stems, but whole notes are not visibly +shifted unless an actual clash of the note heads occurs, or when the +voices cross over from their natural order (when @code{\voiceThree} +is higher than @code{\voiceOne}, etc.) + +@seealso +@rlearning{Explicitly instantiating voices}, +@rlearning{Real music example}, +@ruser{Single-staff polyphony}, +@ruser{Collision resolution}. diff --git a/Documentation/usage/suggestions.itely b/Documentation/usage/suggestions.itely index 2c6fcaca8f..56ddfe24c8 100644 --- a/Documentation/usage/suggestions.itely +++ b/Documentation/usage/suggestions.itely @@ -8,7 +8,7 @@ Guide, node Updating translation committishes.. @end ignore -@c \version "2.16.0" +@c \version "2.19.21" @node Suggestions for writing files @chapter Suggestions for writing files @@ -53,51 +53,92 @@ structured in order to be easier (or harder) to update. @node General suggestions @section General suggestions -Here are a few suggestions that can help you to avoid or fix -problems: +Here are a few suggestions that can help to avoid (and fix) the most +common problems when typesetting: @itemize -@item @strong{Include @code{\version} numbers in every file}. Note that all -templates contain @code{\version} information. We -highly recommend that you always include the @code{\version}, no matter -how small your file is. Speaking from personal experience, it's -quite frustrating to try to remember which version of LilyPond you were -using a few years ago. @command{convert-ly} requires you to declare -which version of LilyPond you used. - -@item @strong{Include checks}: @ruser{Bar and bar number checks}, -@ruser{Octave checks}. If you include checks every so often, then -if you make a mistake, you can pinpoint 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. - -@item @strong{One bar per line of text}. If there is anything complicated, -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 @q{debug} your input files. - -@item @strong{Comment your input files}. Use either bar numbers -(every so often) or -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 -challenging to determine your intentions or how your file is structured if -you didn't comment the file. - -@item @strong{Indent your braces}. A lot of problems are caused by an -imbalance -in the number of @code{@{} and @code{@}}. - -@item @strong{Explicitly add durations} at the beginnings of sections -and variables. If you specify @code{c4 d e} at the beginning of a -phrase (instead of just @code{c d e}) you can save yourself some -problems if you rearrange your music later. - -@item @strong{Separate tweaks} from music definitions. See +@item +@strong{Always include a @code{\version} number in your input files} no +matter how small they are. This prevents having to remember which +version of LilyPond the file was created with and is especially relevant +when @ref{Updating files with convert-ly} command (which requires the +@code{\version} statement to be present); or if sending your input files +to other users (e.g. when asking for help on the mail lists). Note that +all of the LilyPond templates contain @code{\version} numbers. + +@item +@strong{For each line in your input file, write one bar of music}. This +will make debugging any problems in your input files much simpler. + +@item +@strong{Include @ruser{Bar and bar number checks} as well as +@ruser{Octave checks}}. Including @q{checks} of this type in your input +files will help pinpoint mistakes more quickly. How often checks are +added will depend on the complexity of the music being typeset. For +simple compositions, checks added at a few at strategic points within +the music can be enough but for more complex music, with many voices +and/or staves, checks may be better placed after every bar. + +@item +@strong{Add comments within input files}. References to musical themes +(i.e. @q{second theme in violins}, @q{fourth variation,} etc.), or +simply including bar numbers as comments, will make navigating the input +file much simpler especically if something needs to be altered later +on or if passing on LilyPond input files to another person. + +@item +@strong{Add explicit note durations at the start of @q{sections}}. For +example, @code{c4 d e f} instead of just @code{c d e f} can make +rearranging the music later on simpler. + +@item +@strong{Learn to indent and align braces and parallel music}. Many +problems are often caused by either @q{missing} braces. Clearly +indenting @q{opening} and @q{closing} braces (or @code{<<} and @code{>>} +indicators) will help avoid such problems. For example; + +@example +\new Staff @{ + \relative @{ + r4 g'8 g c8 c4 d | + e4 r8 | + % Ossia section + << + @{ f8 c c | @} + \new Staff @{ + f8 f c | + @} + >> + r4 | + @} +@} +@end example + +@noindent +is much easier to follow than; + +@example +\new Staff @{ \relative @{ r4 g'8 g c4 c8 d | e4 r8 +% Ossia section +<< @{ f8 c c @} \new Staff @{ f8 f c @} >> r4 | @} @} +@end example + + +@item +@strong{Keep music and style separate} by putting overrides in the +@code{\layout} block; + +@example +\score @{ + @var{@dots{}music@dots{}} + \layout @{ + \override TabStaff.Stemstencil = ##f + @} +@} +@end example + +This will not create a new context but it will apply when one is +created. Also see @rlearning{Saving typing with variables and functions}, and @rlearning{Style sheets}. @@ -164,8 +205,8 @@ the @code{violin} definition is extremely unlikely to change in a new version of LilyPond. @example -violin = \relative c'' @{ -g4 c'8. e16 +violin = \relative @{ +g'4 c'8. e16 @} @dots{} \score @{ @@ -186,8 +227,8 @@ need to do this once, and we can still avoid touching anything inside @example fthenp = _\markup@{ \dynamic f \italic \small @{ 2nd @} \hspace #0.1 \dynamic p @} -violin = \relative c'' @{ -g4\fthenp c'8. e16 +violin = \relative @{ +g'4\fthenp c'8. e16 @} @end example @@ -234,9 +275,9 @@ then comment out all of the bass music (but leave @code{\bass} in the @code{\score} uncommented. @example -bass = \relative c' @{ +bass = \relative @{ %@{ - c4 c c c + c'4 c c c d d d d %@} @} diff --git a/Documentation/usage/updating.itely b/Documentation/usage/updating.itely index ad92a834e3..bad4c8c9d8 100644 --- a/Documentation/usage/updating.itely +++ b/Documentation/usage/updating.itely @@ -17,11 +17,13 @@ @cindex Updating a LilyPond file @cindex convert-ly -The LilyPond input syntax is routinely changed to simplify it or improve -it in different ways. As a side effect of this, the LilyPond interpreter -often is no longer compatible with older input files. To remedy this, -the program @command{convert-ly} can be used for upgrading files -to newer versions of LilyPond. +As LilyPond is improved, the syntax (input language) of some commands +and functions can change. This can result in unexpected errors, +warnings or even wrong output when input files, previously created for older +versions of LilyPond are then used with later versions. + +To help with this the @command{convert-ly} command can be used to +upgrade these older input files to use the newer syntax. @menu * Why does the syntax change?:: @@ -38,102 +40,148 @@ to newer versions of LilyPond. @cindex convert-ly @cindex updating old input files -The LilyPond input syntax occasionally changes. As LilyPond -itself improves, the syntax (input language) is modified -accordingly. Sometimes these changes are made to make the input -easier to read and write or sometimes the changes are made to -accommodate new features of LilyPond. - -For example, all @code{\paper} and @code{\layout} property names -are supposed to be written in the form @code{first-second-third}. -However, in version 2.11.60, we noticed that the -@code{printallheaders} property did not follow this convention. -Should we leave it alone (confusing new users who must deal with -an inconsistent input format), or change it (annoying old users -with existing scores)? In this case, we decided to change the -name to @code{print-all-headers}. Fortunately, this change can be -automated with our @command{convert-ly} tool. - -Unfortunately, @command{convert-ly} cannot handle all input changes. -For example, in LilyPond 2.4 and earlier, accents and non-English -letters were entered using LaTeX -- displaying the French word for -Christmas was entered as @code{No\"el}. But in LilyPond -@c keep "-matching straight in fancy editors -2.6 and above, the special @code{ë} must be entered directly into -the LilyPond file as an UTF-8 character. @command{convert-ly} cannot -change all the LaTeX special characters into UTF-8 characters; you -must manually update your old LilyPond input files. - -The conversion rules of @command{convert-ly} work using text pattern -matching and replacement rather than a thorough understanding of -LilyPond. This has several consequences: +Often, syntax changes are made to make the input simpler to both read +and write, but occasionally the changes are made to accommodate new +features or enhancements to existing functions. + +To illustrate this here is a real example: + +All @code{\paper} and @code{\layout} property names were supposed to be +written in the form @code{first-second-third}. However, in LilyPond +version 2.11.60, it was noticed that the @code{printallheaders} property +did not follow this convention. Should this property be left alone +(confusing new users with an inconsistent format)? Or should it be +changed (annoying old users with existing LilyPond input files)? + +The decision was made to change the name of the property to +@code{print-all-headers}, and by using the @command{convert-ly} command +the old users had a way to automatically update their existing input +files. + +However, the @command{convert-ly} command cannot always be used to +manage all syntax changes. In versions of LilyPond before 2.4.2, +accents and non-English characters were entered using standard LaTeX +notation. For example the French word for @q{Christmas} was entered as +@code{No\"el}. But in LilyPond 2.6 onwards, the special @code{ë} must +be entered directly as a UTF-8 character. The @command{convert-ly} +command cannot change LaTeX special characters into UTF-8 characters, so +older LilyPond input files have to edited manually. + +The conversion rules of the @command{convert-ly} command work using text +pattern-matching and replacement (rather than @q{understanding} the +context of what it is changing within a given input file). This has +several consequences: + @itemize @bullet @item -The reliability of the conversion depends on the quality of each -applied rule set and on the complexity of the respective change. -Sometimes conversions may require manual fixes, so the old version -should be kept available for comparison. +The reliability of the conversion depends on the quality of each applied +rule set and on the complexity of the respective change. Sometimes +conversions may require additional, manual fixes, so the original input +files should be kept for comparison just in case. + @item -Only conversions to newer formats are possible: there are no rule -sets for downgrading. So the main working copy of a LilyPond file -should only be upgraded when older versions of LilyPond no longer -need to be supported. Version control systems such as Git might -help with maintaining multiple versions. +Only conversions to newer syntax changes are possible: there are no rule +sets to go back to older versions of LilyPond. So the input file +should only be upgraded when older versions of LilyPond are no longer +being maintained. Again, the original input files should be kept just +in case; perhaps using version control systems (i.e. Git) to help with +maintaining multiple versions of your input files. + @item -LilyPond and Scheme themselves are quite robust against creatively -placed and omitted spaces, but the rules used by -@command{convert-ly} tend to make some stylistic assumptions. -Following the style used in the manuals is the safest bet for -painless upgrades, particularly as the manuals themselves are -upgraded using @command{convert-ly}. +LilyPond is quite robust when processing @q{creatively} placed or +omitted whitespace, but the rules used by @command{convert-ly} often +make some stylistic assumptions. Therefore following the input style as +used in the LilyPond manuals is advised for painless upgrades, +particularly as the examples in the manuals themselves are all upgraded +using the @command{convert-ly} command. @end itemize @node Invoking convert-ly @section Invoking @command{convert-ly} -@command{convert-ly} uses @code{\version} statements in the input -file to detect the old version number. In most cases, to upgrade -your input file it is sufficient to run +The @command{convert-ly} command uses the @code{\version} number in +the input file to detect older versions. In most cases, to upgrade your +input file it is sufficient just to run; @example convert-ly -e myfile.ly @end example @noindent -in the directory containing the file. This will upgrade -@file{myfile.ly} in-place and preserve the original file in -@file{myfile.ly~}. +in the directory containing the input file. This will upgrade +@file{myfile.ly} in-place and preserve the original file by renaming it +@file{myfile.ly~}. The @code{\version} number in the upgraded input +file, along with any required syntax updates, is also changed. + +When run, the @command{convert-ly} command will output the version +numbers of which conversions have been made to. If no version numbers +are listed in the output for the file, it is already up to date and +using the latest LilyPond syntax. + +@warning{For each new version of LilyPond, a new @command{convert-ly} +command is created, however not every version of LilyPond will need +syntax changes for its input files from the version before. This means +that the @command{convert-ly} command will only convert input files up +to the latest syntax change it has and this, in turn, may mean that the +@code{\version} number left in the upgraded input file is sometimes +earlier than the version of @command{convert-ly} command itself.} + +To convert all input files in a single directory use; -@warning{@command{convert-ly} always converts up to the last -syntax change handled by it. This means that the @code{\version} -number left in the file is usually lower than the version of -@command{convert-ly} itself.} +@example +convert-ly -e *.ly +@end example -To convert all the input files in a directory together use +Linux and MacOS@tie{}X users can both use the appropriate terminal +application, but MacOS@tie{}X users can also execute this command +directly under the menu entry @code{Compile > Update syntax}. + +A Windows user would run the command; @example -convert-ly -e *.ly +convert-ly.py -e *.ly @end example -Alternatively, if you want to specify a different name for the -upgraded file, preserving the original file and name unchanged, -use +@noindent +entering these commands in a @code{command prompt} usually found under +@code{Start > Accessories > Command Prompt} or for version 8 users, +by typing in the search window @q{command prompt}. + +To convert all input files that reside in different sets of +subdirectories; @example -convert-ly myfile.ly > mynewfile.ly +find . -name '*.ly' -exec convert-ly -e '@{@}' \; @end example -The program will list the version numbers for which conversions -have been made. If no version numbers are listed the file is -already up to date. +This example searches and converts all input files in the current +directory and all directories below it recursively. The converted files +will be located in the same directory along with their renamed +originals. This should also work for MacOS@tie{}X users, although only +via the terminal app. -MacOS@tie{}X users may execute these commands under the menu entry -@code{Compile > Update syntax}. +Windows user would use; + +@example +forfiles /s /M *.ly /c "cmd /c convert-ly.py -e @@file" +@end example + +Alternatively, an explicit path to the top-level of your folder +containing all the sub-folders that have input files in them can be +stated using the @code{/p} option; + +@example +forfiles /s /p C:\Documents\MyScores /M *.ly /c "cmd /c convert-ly.py -e @@file" +@end example + +If there are spaces in the path to the top-level folder, then the whole +path needs to be inside double quotes; + +@example +forfiles /s /p "C:\Documents\My Scores" /M *.ly /c "cmd /c convert-ly.py -e @@file" +@end example -Windows users should enter these commands in a Command Prompt -window, which is usually found under -@code{Start > Accessories > Command Prompt}. @node Command line options for convert-ly @@ -161,6 +209,19 @@ conversion. Apply the conversions direct to the input file, modifying it in-place. The original file is renamed as @file{myfile.ly~}. This backup file may be a hidden file on some operating systems. +Alternatively, if you want to specify a different name for the +upgraded file without using the @code{-e} options default @code{~} +appended to the old input file, the output can be redirected instead; + +@example +convert-ly myfile.ly > mynewfile.ly +@end example + +Windows user would use; + +@example +convert-ly.py myfile.ly > mynewfile.ly +@end example @item -b, --backup-numbered When used with the @samp{-e} option, number the backup files so that @@ -168,9 +229,9 @@ no previous version is overwritten. The backup files may be hidden on some operating systems. @item -f, --from=@var{from-patchlevel} -Set the version to convert from. If this is not set, @command{convert-ly} -will guess this, on the basis of @code{\version} strings in the file. -E.g. @option{--from=2.10.25} +Set the version to convert from. If this is not set, +@command{convert-ly} will guess this, on the basis of @code{\version} +strings in the file. E.g. @option{--from=2.10.25} @item -h, --help Print usage help. diff --git a/Documentation/web.texi b/Documentation/web.texi index 621488e92f..935f8e8b78 100644 --- a/Documentation/web.texi +++ b/Documentation/web.texi @@ -13,11 +13,6 @@ @documentlanguage en @afourpaper -@c `Web' was imported 2009-08-05 with git commit b938d71... -@c @macro copyrightDeclare -@c Copyright @copyright{} 2009--2012 by the authors. -@c @end macro - @set FDL @set web @include macros.itexi @@ -33,8 +28,17 @@ @omflanguage English @end ignore +@c `Web' was born 2003-03-30 with this commit: +@c Initial revision +@c author: Han-Wen Nienhuys +@c commit: d189a2119004c2f75da2020ea2ed36d817582fc5 + +@c @macro copyrightDeclare +@c Copyright @copyright{} 2003--2015 by the authors. +@c @end macro + @copying -Copyright @copyright{} 2009--2012 by the authors. +Copyright @copyright{} 2003--2015 by the authors. @c next line is necessary for broken pre-4.13 texinfo's @c install-info, so leave it there until we officially @@ -116,8 +120,6 @@ For LilyPond version @version{} @c @im ageId{cmws,web-snippet-alpha.png,Catchy Musical Web Snippet} @divId{quickSummary} -@subheading What is LilyPond? - LilyPond is a music engraving program, devoted to producing the highest-quality sheet music possible. It brings the aesthetics of traditionally engraved music to computer printouts. LilyPond is free @@ -130,9 +132,6 @@ Read more in our @ref{Introduction}! @divEnd @divEnd -@divClass{separator} -@divEnd - @divId{news} @@ -145,19 +144,36 @@ Read more in our @ref{Introduction}! @divEnd + @ifclear web_version @c do nothing @end ifclear @ifset web_version - @c make the box: -@divId{wildCardBox} + @c make the side bar: +@divId{homePageSideBar} +@subheading Stable Release + +@c TODO: javascript to detect OS and suggest download? + +@ref{Download, Download @versionStable} + +@ref{Manuals, Manuals @versionStable} + +@subheading Unstable Release + +@ref{Development, Download @versionDevel} + +@ref{Development, Manuals @versionDevel} + @subheading Pondings -@divId{wildCardText} +@divId{pondingsText} @divEnd + @divEnd @end ifset + @html @end html -@ifset web_version - @c make the box: -@divId{latestVersion} -@subheading Quick links - -@c TODO: javascript to detect OS and suggest download? - -@subsubheading Stable - -@ref{Download, Download @versionStable} - -@ref{Manuals, Manuals @versionStable} - -@subsubheading Unstable - -@ref{Development, Download @versionDevel} - -@ref{Development, Manuals @versionDevel} - -@divEnd -@end ifset - @ifnottex diff --git a/Documentation/web/community.itexi b/Documentation/web/community.itexi index 54723d77f5..31b400fa89 100644 --- a/Documentation/web/community.itexi +++ b/Documentation/web/community.itexi @@ -49,7 +49,7 @@ discussing LilyPond. @ref{Development}: for contributors and testers. @item -@ref{GSoC 2012}: our ideas for 2012 edition of Google Summer of Code. +@ref{Google Summer of Code}: ideas for Google Summer of Code (GSoC). @item @ref{Authors}: the people who made LilyPond what it is today. @@ -87,7 +87,7 @@ discussing LilyPond. * Help us:: * Sponsoring:: * Development:: -* GSoC 2012:: +* Google Summer of Code:: * Authors:: * Acknowledgements:: * Publications:: @@ -134,7 +134,7 @@ in your own works. See what other people have written, and add your own! @example -@uref{http://lsr.dsi.unimi.it} +@uref{http://lsr.di.unimi.it} @end example Particularly instructive examples from LSR are included in our @@ -178,8 +178,8 @@ be useful for others would better be posted to one of the mailing lists. @subsubheading Other languages @quotation -@uref{http://lists.gnu.org/mailman/listinfo/lilypond-es, -Spanish mailing list} +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-user-fr, +French mailing list} @uref{http://www.lilypondforum.de/, German forum} @@ -187,26 +187,19 @@ German forum} @uref{http://groups.google.com/group/lilypond-brasil, Portuguese group} -@uref{http://lists.gnu.org/mailman/listinfo/lilypond-user-fr, -French mailing list} - -@uref{http://www.lilypondforum.nl/, -Dutch forum} +@uref{http://lists.gnu.org/mailman/listinfo/lilypond-es, +Spanish mailing list} @end quotation - @divEnd @divClass{column-right-top} -@subheading Stay Informed - -@subsubheading LilyPond Report +@subheading The LilyPond Blog -The easiest way to keep touch is by reading our community -newsletter, the LilyPond Report: +Read our community blog, @q{Scores of Beauty}: @example -@uref{http://news.lilynet.net} +@uref{http://lilypondblog.org} @end example @subsubheading Releases mailing list: @code{info-lilypond@@gnu.org} @@ -233,12 +226,12 @@ archive3} @divClass{column-right-bottom} -@subheading Developer Discussion +@subheading Developer Discussions and Translations @subsubheading Developer mailing list: @code{lilypond-devel@@gnu.org} -Most developer discussion takes place on this list. Patches -should be sent here. +Developer discussions take place on this list. Patches can also be sent +here. @quotation @uref{http://lists.gnu.org/mailman/listinfo/lilypond-devel, @@ -258,7 +251,8 @@ send to lilypond-devel with gmane} @subsubheading Bug mailing list: @code{bug-lilypond@@gnu.org} -Bug-specific discussion takes place here. +Bug reports and discussions should be sent here. Do not send patches +to this list. @quotation @uref{http://lists.gnu.org/mailman/listinfo/bug-lilypond, @@ -277,13 +271,16 @@ archive3} @warning{Before sending a message to the bug list, please read our guidelines for @ref{Bug reports}.} -@divEnd -@divClass{column-right-bottom} -@subheading Sensitive emails +@subsubheading Translation mailing list: @code{translations@@lilynet.org} + +All discussions about translating LilyPond manuals should be sent here. +Do not send patches to this list. -Private matters should be sent to Graham Percival (project -manager), who will discuss it with those concerned. +@quotation +@uref{http://lilypond-translations.3384276.n2.nabble.com/, +Translation mailing list archive} +@end quotation @divEnd @@ -415,7 +412,7 @@ then that is a bug. We may already know about this bug. Check here: @example -@uref{http://code.google.com/p/lilypond/issues/list} +@uref{http://sourceforge.net/p/testlilyissues/issues/} @end example @warning{Please @strong{DO NOT} add bug reports directly to the @@ -492,14 +489,14 @@ report. Once your bug report has been sent to the list, our Bug Squad will examine it; they may ask you for more information. You will be notified -when the report will be added to the bug tracker. Please allow up to 4 days, -as we have a limited number of volunteers for this task. +when the report will be added to the bug tracker. Please allow up to 4 +days, as we have a limited number of volunteers for this task. Once a bug has been added to the tracker, you can comment it to add more information about it. You may also mark the bug so that you automatically receive emails when -any activity on the bug occurs. This requires you have a google -account. +any activity on the bug occurs. This requires you have a google account +login. @divEnd @divClass{column-center-bottom} @@ -764,7 +761,7 @@ This release's lilypond-book tests. @itemize @item @uref{http://lilypond.org/test, Comparisons between regression tests} -@item @uref{http://lilypond.org/download/binaries/test-output/, +@item @uref{http://lilypond.org/downloads/binaries/test-output/, Archive of all regression tests} @end itemize @@ -881,163 +878,257 @@ manuals can be found at @url{http://lilypond.org}} -@node GSoC 2012 -@unnumberedsec GSoC 2012 +@node Google Summer of Code +@unnumberedsec Google Summer of Code @divClass{column-center-top} @subheading What is Google Summer of Code? -It is a global program run by Google that offers students stipends -for working on open source software projects during summer vacations. +@uref{https://developers.google.com/open-source/gsoc/, GSoC} is a global +program that offers students stipends to write code for free software +and open source projects during the summer. It is an excellent +opportunity for students to gain experience with real-world software +development and make a contribution that benefits everyone. It brings +new contributors to LilyPond and enables students who are already +involved to become more involved. LilyPond participates in GSoC as part +of the @uref{http://www.gnu.org/, GNU project}. + +We have had GSoC participants in 2012 and 2015 and encourage students to +apply for future summers. -The LilyPond Team decided that this is an excellent opportunity to find -new contributors and encourage students already participating in LilyPond -development to become more involved. One of our contributors was accepted -for 2012 edition of the program as part of the -@uref{http://www.gnu.org/, GNU project}; -we hope to participate in future editions as well. +If you have questions or would like to apply, send us an email on our +developer mailing list (see @ref{Contact}). @divEnd -@divClass{column-center-bottom} -@subheading Our 2012 Ideas List +@divClass{column-center-middle-color2} +@subheading Project Ideas List -Below is a list of projects that we suggested for GSoC 2012 students. -Although the application period is over, we decided to keep this webpage -online as an inspiration for anyone who is interested in developing LilyPond. -Some members of the development team are willing to help people who would like -to tackle these projects. +Below is a list of suggested projects for GSoC or for anyone who is +interested in helping to improve LilyPond. (Last updated: February 2016) -Of course, there are many more things to improve in LilyPond, including -very small ones. A full list of all known issues can be found -@uref{http://code.google.com/p/lilypond/issues/list, here}. +Mentor availability varies from project to project and from year to year. +Send us an email on our developer mailing list (see @ref{Contact}), and +we will help you find a mentor for a project that fits your interests +and skills. -@subheading Grace notes +If you have ideas for a GSoC project that is not listed below you can +send us an email as well. There are a number of areas where LilyPond +could be improved, and our development team is always willing to help +those who would like to tackle a project like those listed below. -Fix problems with synchronization of grace notes, -together with all underlying architecture (see -@uref{http://code.google.com/p/lilypond/issues/detail?id=34, -issue 34 in our tracker}). Grace notes are confusing to LilyPond's -timing because they're like going back in time. This causes weird -effects, especially when one staff has a grace note and the other -doesn't. +A full list of all the current open issues can be found +@uref{http://sourceforge.net/p/testlilyissues/issues/, here}. -@strong{Difficulty:} medium +@divEnd -@strong{Requirements:} C++, MIDI +@divClass{column-center-middle-color3} +@subheading Improve internal chord structure -@strong{Recommended:} familiarity with LilyPond internals +The internal representation of LilyPond chords is not powerful enough +to capture the nomenclature of jazz chords. Currently the chord has +a root, a bass and an inversion. It would be nice to be able to handle +stacked or polychords, minor/major, etc. In order to do this, an +internal representation with the ability to capture the essence of +complex chords must be developed. As a bonus, once the internal +representation is developed, the output formatting of chord names can +be improved. -@strong{Mentor(s):} Mike Solomon, Carl Sorensen +@strong{Difficulty:} Easy/medium +@strong{Requirements:} Scheme (Guile), but the level necessary can be +easily learned +@strong{Recommended:} Chord theory and naming +@strong{Mentor:} Carl Sorensen -@subheading MusicXML +@divEnd -Adding comprehensive MusicXML export and improving import, -together with tests checking that it works. Depending on time available, -implement some or all of the following: +@divClass{column-center-middle-color3} +@subheading ScholarLY -@divClass{keep-bullets} -@itemize +ScholarLY is a library in +@uref{https://openlilylib.org, openLilyLib} that provides functionality +for annotating scores, making it possible to manage scholarly workflows +completely in the context of the score document. So far it is possible +to enter annotations of different types, produce clickable messages in +the console output and export to text and LaTeX files. -@item -Handle basic musical content export like the MIDI export (i.e. using -dedicated exporter classes, derived from the translator class) +There are numerous feature requests to turn this library into an +even more powerful and comprehensive tool. Some examples: Inserting +music examples, producing footnotes, automatically applying styles +to the annotated item (e.g. dash a slur, parenthesize an accidental), +creating reports with point-and-click entries. For a full description +of this project suggestion please visit +@uref{https://github.com/openlilylib/scholarly/wiki/GSoC, this Wiki page}. -@item -Build the XML tree of the basic musical content, -add a connection from music event to XML tag +@strong{Difficulty:} medium +@strong{Requirements:} Scheme, possibly LaTeX, (optionally Python) +@strong{Recommended:} Experience with or interest in scholarly +edition and collaborative workflows. +@strong{Mentor:} Urs Liska -@item -Let all LilyPond engravers do their job +@divEnd + +@divClass{column-center-middle-color3} +@subheading Adding variants of font glyphs + +@divClass{keep-bullets} +@itemize @item -Add ability to link each output object -(basically each stencil / group of stencils) to the music cause -(and thus to the XML tag in the XML tree) +Adding @q{on} and @q{between} staff-line variants. @item -Add a XML output backend, which can then add the layout information -for each output object to the XML tags +Shorter and narrower variants of some glyphs for example, accidentals. +Another, more specific example could be an ancient notation breve +notehead coming in two variants one with a small or big @q{hole} within +it. @end itemize @divEnd -The goal will be considered achieved when a (previously chosen) score -could be imported from MusicXML and exported back with no unintentional -loss of data. +@strong{Difficulty:} easy +@strong{Requirements:} MetaFont, C++, good eye for details +@strong{Recommended knowledge:} basic LilyPond knowledge +@strong{Mentor:} Werner Lemberg -@strong{Difficulty:} medium +@divEnd -@strong{Requirements:} MusicXML, Python, basic LilyPond knowledge +@divClass{column-center-middle-color3} +@subheading Grace notes -@strong{Mentor(s):} Reinhold Kainhofer, Mike Solomon +Fix problems with synchronization of grace notes. Grace notes can +interfere with LilyPond's timing and cause odd effects, especially when +multiple staffs are used where some have grace notes and others don't. +This is one of the longest-standing and one of the more embarrassing +@uref{https://sourceforge.net/p/testlilyissues/issues/34/,bugs} in +LilyPond. -Familiarity with other scorewriters (for cross-testing) would be a nice -bonus. +@strong{Difficulty:} medium +@strong{Requirements:} C++, MIDI +@strong{Recommended:} familiarity with LilyPond internals +@strong{Potential Mentors:} Mike Solomon (not available for GSoC 2016), +Carl Sorensen -@subheading Improve slurs and ties +@divEnd -The default shape of slur and tie curves is often unsatisfactory. -Ties on enharmonic notes @code{@{ cis'~ des' @}} are not supported, -ties "broken" by clef or staff change aren't supported well. -The project includes collecting and sorting examples of bad output, -deciding on the intended output and writing the actual code. +@divClass{column-center-middle-color3} +@subheading Improve default beam positioning -@strong{Difficulty:} hard +For regular, cross-staff, broken and kneed beams. Beaming should depend +on context and neighbor notes (see section 2.2 of +@uref{http://imslp.org/wiki/Repository_of_Music-Notation_Mistakes_%28Coulon%2C_Jean-Pierre%29, +this book}). If possible also reduce beaming-computation time. +@strong{Difficulty:} medium @strong{Requirements:} C++, experience with writing heuristics +@strong{Recommended knowledge:} aesthetic sense +@strong{Potential Mentors:} Mike Solomon (not available for GSoC 2016), +Carl Sorensen -@strong{Recommended knowledge:} LilyPond knowledge, aesthetic sense +@divEnd -@strong{Mentor(s):} Mike Solomon +@divClass{column-center-middle-color3} +@subheading Allow spanners to cross voices -@subheading Adding special variant of font glyphs -Adding on-staff-line, between-staff-line, shorter and narrower variants -of some glyphs, for example accidentals, together with a generic -infrastructure to support them. An example is ancient notation breve -notehead coming in two variants, with smaller and bigger hole. +Currently all sorts of spanners (ties, slurs, dynamics, text spanners, +trills etc.) have to be ended in the context they were started. However, +this doesn't reflect the reality of notation in most polyphonic settings. +Awkward workarounds with hidden voices are currently necessary to achieve +cross-voice spanners. -@strong{Difficulty:} easy +New ways of addressing this issue should be explored, for example by -@strong{Requirements:} MetaFont, C++, good eye for details +@divClass{keep-bullets} +@itemize -@strong{Recommended knowledge:} basic LilyPond knowledge +@item specifying a “target context” where the end of the spanner is +expected + +@item explicitly specifying the ending object with an ID -@strong{Mentor(s):} Werner Lemberg +@end itemize +@divEnd + +This feature would solve many problems that are commonly faced with +piano music and combined parts. -@subheading Improve beaming +@strong{Difficulty:} medium (?) +@strong{Requirements:} C++, Scheme +@strong{Potential Mentor:} Urs Liska +@divEnd + +@divClass{column-center-middle-color3} +@subheading Help improve compilation behavior -Default positioning of regular, cross-staff, broken and kneed beams -should be improved. Beaming should depend on context and neighbor notes -(see @uref{http://icking-music-archive.org/lists/sottisier/sottieng.pdf, -section 2.2 here}). If possible, reduce beaming computation time. +Automatic code analysis tools, like valgrind memory leak detection or +callgrind code profilers, provide valuable information about possible +flaws in our C++ code. Cleaning up warnings would allow us to automate +the rejection of any patch which introduced extra warnings. @strong{Difficulty:} medium +@strong{Requirements:} C++ +@strong{Potential Mentors:} Reinhold Kainhofer (not available for GSoC +2016), Joe Neeman -@strong{Requirements:} C++, experience with writing heuristics +@divEnd -@strong{Recommended knowledge:} aesthetic sense +@divClass{column-center-middle-color3} +@subheading MusicXML -@strong{Mentor(s):} Mike Solomon, Carl Sorensen +Improving MusicXML import and export functions: -@subheading Clean up various compilation warnings +@divClass{keep-bullets} +@itemize -Clean up compiler warnings, static code analysis, and valgrind warnings. -Automatic code analysis tools (warnings in @code{g++} and @code{clang}) -and analysis tools like valgrind memory leak detection and callgrind -code profilers provide valuable information about possible flaws in C++ -code. Cleaning these warnings would allow us to automatically reject -any patch which introduced extra warnings. +@item +Handle basic musical content export like the MIDI export (i.e. using +dedicated exporter classes, derived from the translator class). -@strong{Difficulty:} medium +@item +Build the XML tree of the basic musical content, add a connection from +music event to XML tag. -@strong{Requirements:} C++ +@item +Let all LilyPond engravers do their job. -@strong{Mentor(s):} Joe Neeman, Reinhold Kainhofer +@item +Link each output object (i.e. each stencil or group of stencils) to the +music cause (and thus to the XML tag in the XML tree). + +@item +Add an XML output backend, which can then add layout information for +each output object to the XML tags. +@end itemize @divEnd +There are several possibilities for this project, including building upon +the MusicXML export project from GSoC 2015. + +@strong{Difficulty:} medium +@strong{Requirements:} MusicXML, Python, Scheme, basic LilyPond knowledge +@strong{Potential Mentors:} Reinhold Kainhofer, Mike Solomon (both not +available for GSoC 2016) +Familiarity with other scorewriters (for cross-testing) would also help. + +@divEnd + +@divClass{column-center-middle-color3} +@subheading Improve slurs and ties + +The engraving quality of slurs and ties is often unsatisfactory. Ties +@q{broken} by clef or staff changes are not handled well. The project +could include collecting and sorting examples of bad output, deciding on +the intended output and writing code to improve them. + +@strong{Difficulty:} hard +@strong{Requirements:} C++, experience with writing heuristics +@strong{Recommended knowledge:} LilyPond knowledge, aesthetic sense +@strong{Potential Mentors:} Mike Solomon, Janek Warchoł (both not available for +GSoC 2016) + +@divEnd @node Authors diff --git a/Documentation/web/download.itexi b/Documentation/web/download.itexi index 4781d161b7..8adbb98180 100644 --- a/Documentation/web/download.itexi +++ b/Documentation/web/download.itexi @@ -82,7 +82,7 @@ latest unstable version @divEnd -@divClass{column-center-bottom} +@divClass{column-center-middle-color2} @subheading Software License @@ -91,7 +91,7 @@ LilyPond is published under the @divEnd -@divClass{color1} +@divClass{column-center-bottom} @subheading Sponsors @@ -102,6 +102,9 @@ our bandwidth. @sourceimage{VTlogo_ITF,,,} @sourceimage{lao_banner_06_on_white_demo,,,} +@divEnd + +@divClass{column-center-bottom} @subheading Legalese @divClass{legal} @@ -142,13 +145,12 @@ acknowledged. @divClass{column-center-top} @subheading Generic Packages or Distribution-Specific Packages? -Many distributions already include LilyPond within their normal -package repositories and these are often much easier to install than the -generic packages found here. However the version of LilyPond in those -repositories may be @emph{significantly} older than the current stable -version. If you wish to use our generic packages, please check that -your LilyPond editor is using the correct version of lilypond. See -@ref{Easier editing}. +Many distributions include LilyPond within their normal package +repositories that are often @emph{significantly} older than the current +stable version. While these older packages may be easier to install, we +@emph{strongly} recommend that you use our generic packages. In this +case, check that your LilyPond editor is using the correct version. +See @ref{Easier editing}. @divEnd @@ -168,12 +170,12 @@ your LilyPond editor is using the correct version of lilypond. See @ifset web_version @downloadStableLinuxNormal @end ifset - -(if in doubt, use this) +32bit Systems. @item @sourceimage{logo-linux,,,} @downloadStableLinuxBig +64bit Systems. @item @sourceimage{logo-linux,,,} @@ -182,10 +184,12 @@ your LilyPond editor is using the correct version of lilypond. See @item @sourceimage{logo-freebsd,,,} @downloadStableFreeBSDNormal +32bit Systems. @item @sourceimage{logo-freebsd,,,} @downloadStableFreeBSDBig +64bit Systems. @end itemize @@ -220,44 +224,6 @@ sh lilypond-@versionStable{}-OS-TYPE.sh --help @divClass{column-right-top} -@subheading Distribution-specific Packages - -Please use your distribution's package manager to install or -upgrade to these versions. - -@itemize - -@item -@sourceimage{logo-fedora,,,} -@uref{http://koji.fedoraproject.org/koji/packageinfo?packageID=2447, -Fedora: LilyPond 2.14.2} - -@item -@sourceimage{logo-ubuntu,,,} -@uref{http://packages.ubuntu.com/search?keywords=lilypond, -Ubuntu: LilyPond 2.14.2} - -@item -@sourceimage{logo-slackware,,,} -@uref{http://www.johannes-schoepfer.de/lilypond/, -Slackware: LilyPond 2.14.2} - -@item -@sourceimage{logo-debian,,,} -@uref{http://packages.debian.org/search?keywords=lilypond, -Debian: LilyPond 2.12.3} - -@item -@sourceimage{logo-suse,,,} -@uref{http://software.opensuse.org/search?baseproject=openSUSE%3A11.2&p=1&q=lilypond, -openSUSE: LilyPond 2.12.3} - -@end itemize - -@divEnd - - -@divClass{column-center-top} @subheading Compiling a file @lilypadCommandLine @@ -518,7 +484,8 @@ which contains LilyPond executable files like this: [@var{pre-set paths}];@var{DIR}\LilyPond\usr\bin @end example -@warning{@var{DIR} will generally be @code{C:@bs{}Program Files}.} +@warning{@var{DIR} will generally be @code{C:@bs{}Program Files (x86)} +for 64 bit or @code{C:@bs{}Program Files} for 32 bit systems.} @noindent and click @qq{OK} button to close the window. diff --git a/Documentation/web/introduction.itexi b/Documentation/web/introduction.itexi index 76d7e69312..77eda53f3a 100644 --- a/Documentation/web/introduction.itexi +++ b/Documentation/web/introduction.itexi @@ -20,10 +20,14 @@ soulless look of computer-printed sheet music. Musicians prefer reading beautiful music, so why couldn't programmers write software to produce elegant printed parts? -The result is a system which frees musicians from the details of -layout, allowing them to focus on making music. LilyPond works -with them to create publication-quality parts, crafted in the best -traditions of classical music engraving. +The result is a program that creates beautiful sheet music +following the best traditions of classical music engraving. +It takes care of the details of layout programmatically, +allowing composers, transcribers and publishers to focus +on the @emph{music} instead of improving their software's +default output. Performers will get parts that let them +concentrate on @emph{playing} music instead of @emph{reading} it. + @divEnd @@ -100,8 +104,7 @@ traditions of classical music engraving. @divClass{column-center-top} -@subheading Elegance -@subsubheading Excellent classical engraving +@subheading Excellent classical engraving @imageFloat{flat-design,png,right} @@ -115,37 +118,70 @@ best-engraved classical scores. This is further explained in our @ref{Essay}. +@divEnd -@subsubheading Effective layout choices +@divClass{column-center-top} +@subheading Text input -Spend less time with tweaking the output; LilyPond gets the -formatting correct right from the start. It determines spacing by -itself, and breaks lines and pages to provide a tight and uniform -layout. Clashes between lyrics, notes, and chords are resolved -and slurs and beams are sloped, automatically! +@subsubheading Everything is explicit + +LilyPond processes text input, which contains all information +about the @emph{content} of your score and can easily be read +by any human or another program. There are no obscure +settings hidden behind menu items and binary file storage. + +Read more about this concept on @ref{Text input}. +@subsubheading Tweaks are robust and traceable + +If you have to change anything in the layout this tweak will +also be explicitly visible in the input file in human-readable +form, so you will always be able to retrace what you've done. +If you should accidentally break anything you can easily revert +or modify any decision without being at the mercy of an +@emph{Undo} function. + + +@subsubheading Text files are failure- and future-proof + +Text files are very robust against file corruption. And as they are +human-readable, you will always be able to interpret them even if +you don't have access to the programs that created them. + + +@subsubheading Manage your scores with version control + +Text files are applicable to be managed by version control. Go +for it and experience infinite and selective undo/redo mechanisms +and the full development history of your scores. Version control +may also open up new (collaborative) workflows for you. + @divEnd -@divClass{color2} -@subheading Ease of use +@divClass{column-center-top} +@subheading Usability @imageFloat{lilypond-book,png,right} -@subsubheading Text-based input -LilyPond takes ASCII input, which you can produce in your favorite -text editor, quickly and comfortably. The input contains all the -information, so there is no need to remember complex command sequences: -simply save a file for later reference. +@subsubheading Effective layout choices + +Spend less time with tweaking the output; LilyPond gets the +formatting correct right from the start. It determines spacing by +itself, and breaks lines and pages to provide a tight and uniform +layout. Clashes between lyrics, notes, and chords are resolved +and slurs and beams are sloped, automatically! + @subsubheading Mix music and text Put fragments of music into texts without cutting and pasting -pictures. Integrate music into @LaTeX{} and HTML seamlessly, or add -music to OpenOffice.org or LibreOffice with OOoLilyPond. Plugins are -also available to allow LilyPond code in various blogs and wikis, making -online collaboration possible. +pictures. Integrate music into @LaTeX{} or HTML seamlessly, or add +music to OpenOffice.org and LibreOffice with +@uref{http://extensions.services.openoffice.org/en/project/OOoLilyPond,OOoLilypond}. +Plugins are also available to allow LilyPond code in various blogs and +wikis, making online collaboration possible. @subsubheading Accessibility @@ -157,32 +193,74 @@ speech-recognition software to edit LilyPond files. Even users who are totally blind can use screen-reading software to write LilyPond files -- an impossible task in graphical-based score-writing programs. +You can see a spectacular score on @ref{Examples}. + +@subsubheading Editor diversity + +Several developers, themselves active LilyPond users, +have written tools specifically aimed at making the process of editing +LilyPond files faster and more effective; you are not tied to +a single user interface but can use different tools for different tasks. +You can even use a full-fledged LilyPond editor at home and use your +mobile phone's notepad app to edit the files on the go. For some examples, +see @ref{Easier editing}. +@c TODO: Change this when the new pages have been written and pushed + + +@divEnd -@subsubheading Extensible design +@divClass{column-center-top} + +@subheading Extensible design + +@subsubheading Easy management of style sheets -All settings can be changed to suit your personal typographical -taste. If that still is not enough, there is always the built-in -scripting language Scheme, a dialect of the powerful language -LISP. Settings, variables and functions are all documented in the +All layout settings can be changed to suit your personal typographical +taste. So you can easily write style sheets that change every aspect of +LilyPond scores' default appearance. As these are also written as text +and can be stored in separate files you can simply switch between two +stylesheets to produce scores with a completely different appearance or +layout. +You want to print a score on A4 paper and project it with a beamer, +one system per page? LilyPond's layout engine will effortlessly produce +both from the same input. + +@subsubheading Add your own functions + +If that still is not enough, there is always the built-in +scripting language Scheme, which can access LilyPond's layout +engine at the same level as LilyPond itself does, making it +a @emph{very} powerful tool. +Settings, variables and functions are all documented in the comprehensive program reference manual. +@subsubheading Process scores programmatically + +LilyPond input files can fully be edited or even generated by programs +and scripts. This can for example be used for algorithmical composition. +But you can also access the musical content for analysis, or manage +input fragments in a database. There are no limitations except your +imagination. + + +@subsubheading Create new tools using LilyPond + +As LilyPond isn't a monolithic GUI program but a command line tool it +can be used from within other applications too. This way it is possible +to equip tools like e.g. web applications with LilyPond's engraving +power. There already exist several online tools using LilyPond. + +@c (TBD: Add a link to the new @ref{Applications} page. + + @divEnd -@divClass{color3} +@divClass{column-center-top} @subheading Environment @imageFloat{frescobaldi-lilypond-editor-small,png,right} -@subsubheading Free software - -LilyPond can be downloaded free of charge! Yep - It's free. Get -it from the download page. - -It's also free (as in @qq{speech}) software. It comes with source -code, and permission to change and copy it. So, are you irritated -by a bug, or yearning for a feature? Simply add it yourself, or -pay someone else to do it. @subsubheading Excellent support @@ -190,17 +268,24 @@ pay someone else to do it. LilyPond runs on all popular platforms: GNU/Linux, MacOS X, and Windows. LilyPond comes with extensive documentation and hundreds of example files. There is an active user community answering -questions on the lilypond-user mailing list, while the development -team makes sure that problems are solved quickly. +questions on the lilypond-user mailing list, offering you friendly +help. The response time is usually very short, and often brillant +solutions to reported problems are developed. Thanks to the close +interaction with the development team such solutions are regularly +included in LilyPond itself. +Read more in @ref{Community}. -@subsubheading Enhanced editors +@subsubheading Free software +LilyPond can be downloaded free of charge! Yep - It's free. Get +it from the download page. -Several developers, themselves active LilyPond users, have also -written tools specifically aimed at making the process of editing -LilyPond files faster and more effective. For some examples, see -@ref{Easier editing}. +It's also free (as in @qq{speech}) software. It comes with source +code, and permission to change and copy it. So, are you irritated +by a bug, or yearning for a feature? Simply add it yourself, or +pay someone else to do it. +Read more on @ref{Freedom}. @divEnd @divClass{column-center-bottom} @@ -216,51 +301,56 @@ already decided to try LilyPond, first read about our @node Examples @unnumberedsec Examples +@divClass{column-center-top} + +@subheading Beautiful examples + LilyPond is a powerful and flexible tool for engraving tasks of all kinds. Please browse our gallery of examples and be inspired! +@divEnd -@newsItem -@subsubheading Classical Music +@divClass{column-center-middle-color2} +@subheading Classical Music This organ work by J.S. Bach is a fairly typical engraving project in LilyPond. @exampleImage{bach-bwv610} -@newsEnd +@divEnd -@newsItem -@subsubheading Complex Notation +@divClass{column-center-middle-color2} +@subheading Complex Notation This example from @emph{Goyescas} by Enrique Granados shows some of the more advanced features of typesetting, including kneed beams, cross-staff stems, and voice-follow lines. @exampleImage{granados} -@newsEnd +@divEnd -@newsItem -@subsubheading Early Music +@divClass{column-center-middle-color2} +@subheading Early Music LilyPond also supports various types of ancient notation, such as this passage of Gregorian chant. @exampleImage{ancient-headword} -@newsEnd +@divEnd -@newsItem -@subsubheading Modern Music +@divClass{column-center-middle-color2} +@subheading Modern Music Contemporary composers find LilyPond well-suited to displaying unusual notation. Here is an excerpt from Trevor Bača's @emph{Čáry}, for unaccompanied bass flute. @exampleImage{cary} -@newsEnd +@divEnd -@newsItem -@subsubheading Efficient, flexible creation of performance materials +@divClass{column-center-middle-color2} +@subheading Efficient, flexible creation of performance materials Various performance materials can be created from the same source code. This is an excerpt of @uref{http://nicolas.sceaux.free.fr/, @@ -273,10 +363,10 @@ full score, piano-vocal reduction, and a violin part. @exampleImage{sesto-violin} -@newsEnd +@divEnd -@newsItem -@subsubheading Tablature +@divClass{column-center-middle-color2} +@subheading Tablature LilyPond supports tablature notation, which can be customized to suit any instrument that reads from tablature. The tablature @@ -284,10 +374,10 @@ staff is generated automatically from notes entered for the 5-line staff. @exampleImage{tab-example} -@newsEnd +@divEnd -@newsItem -@subsubheading Schenker Graphs +@divClass{column-center-middle-color2} +@subheading Schenker Graphs Standard output can be modified heavily. Here is an impressive Schenkerian analysis, created by Kris Schaffer, for an article @@ -295,10 +385,19 @@ in @uref{http://www.linuxjournal.com/article/8364 , Linux Journal}. The colors have been added for better visibility. @exampleImage{bach-schenker} -@newsEnd +@divEnd + +@divClass{column-center-middle-color2} +@subheading Customized Output + +A short excerpt from Stockhausen's Klavierstück II to demonstrate +Lilypond's ability to provide customised output. + +@exampleImage{Stockhausen_Klavierstueck2} +@divEnd -@newsItem -@subsubheading Vocal Music +@divClass{column-center-middle-color2} +@subheading Vocal Music LilyPond is excellent for vocal music of all kinds, from sacred hymns to opera. Here is a medieval motet with slightly unusual @@ -309,19 +408,19 @@ Vaticana style clefs, the slashed stems indicating plicated notes, and the ligature braces above certain groups of notes. @exampleImage{aucun-snippet} -@newsEnd +@divEnd -@newsItem -@subsubheading Educational Applications +@divClass{column-center-middle-color2} +@subheading Educational Applications LilyPond is perfectly suited for educational purposes as well. Here is an example of a simple counterpoint exercise. @exampleImage{theory} -@newsEnd +@divEnd -@newsItem -@subsubheading Popular Music +@divClass{column-center-middle-color2} +@subheading Popular Music It is simple to create pop lead sheets with melody, lyrics, chord names, and fretboards. In this example you see some of the @@ -329,10 +428,10 @@ predefined fretboard diagrams, but these can be heavily customized to suit nearly any situation. @exampleImage{chart} -@newsEnd +@divEnd -@newsItem -@subsubheading Large Projects +@divClass{column-center-middle-color2} +@subheading Large Projects LilyPond is excellent for large projects like operas or works for full symphony orchestra, as well. In addition, the text-based @@ -340,8 +439,7 @@ input provides greater accessibility -- this example was contributed by Hu Haipeng, a blind composer. @exampleImage{orchestra} -@newsEnd - +@divEnd @divClass{column-center-bottom} @subheading Where now? @@ -368,7 +466,7 @@ not require hundreds of dollars of software! @c @divClass{column-left-top} -@divClass{color2} +@divClass{column-center-middle-color2} @divClass{keep-bullets} @subheading What are the benefits to users? @@ -409,7 +507,7 @@ available for copying, modifications, and distribution. @c @divClass{column-right-top} -@divClass{color3} +@divClass{column-center-middle-color3} @divClass{keep-bullets} @subheading Why do LilyPond developers @qq{give away} their work for free? @@ -471,9 +569,11 @@ LilyPond, first read about our @ref{Text input}. We have an extensive essay describing computational aesthetics: the art of creating beauty with a computer. -If you just want a quick introduction to LilyPond, the essay might -be too much material to read. If you would like to read it now, -please progress to @ref{Essay}. +This is interesting reading if you are interested in an in-depth +discussion of our fundamental ideas. Due to its volume the +essay is available as a "manual". If you would like to read +it now, please progress to @ref{Essay}. However, if you just +want a quick introduction to LilyPond, you might skip it for now. @divEnd @divClass{column-center-bottom} @@ -488,6 +588,16 @@ try LilyPond, first read about our @ref{Text input}. @node Productions @unnumberedsec Productions +@divClass{column-center-top} + +@subheading Productions using LilyPond + +Here you can read about people who actually use LilyPond +in their productions, be it for performances of their +music or as published scores. + +@divEnd + @divClass{column-left-top} @subheading Concerts @@ -498,26 +608,39 @@ Some highlights: @itemize @item -@uref{http://www.aurelienbello.com/,Aurélien Bello} has re-orchestrated -@emph{Der Ring des Nibelungen} by Richard Wagner to a -@uref{http://www.rsb-online.de/content/konzerte/wagnerzyklus-10-13/wagner-fuer-kinder/index_ger.html,100-minute version for children}. -It has been written for a standard symphony orchestra but with a reduced -cast of singers, and will be performed by the -@emph{Radio-Sinfonieorchester Berlin} on the 5th and 6th April 2014 in -the Atze Musiktheater, Berlin. The Conductor is Heiko Matthias Förster. +@uref{http://www.aurelienbello.com/,Aurélien Bello} has arranged a +version of Richard Strauss's @emph{Der Rosenkavalier} for four singers +and a chamber orchestra of thirteen players. This has been commissioned +by the Berlin Philharmonic Orchestra whose members will be the performers on +@uref{http://www.festspielhaus.de/veranstaltung/der-kleine-rosenkavalier-02-04-2015-1100/,April 2nd and 6th} +at the Festspielhaus, Baden-Baden, and on +@uref{http://www.berliner-philharmoniker.de/konzerte/kalender/details/21070/,April 26th} +in the @emph{Philharmonie (großer Saal)}, Berlin. We are pleased to see +musicians of such reputation playing from LilyPond scores -- and they are +reportedly very happy with them. + +Aurélien has also re-orchestrated @emph{Der Ring des Nibelungen} by Richard +Wagner to a +@uref{http://www.rsb-online.de/content/concerts/new-season-1516/family-concerts-age-7-and-above/index_eng.html,100-minute version for children}. +Written for a standard symphony orchestra, but with a reduced cast of +singers, it was performed by the +@uref{http://www.rsb-online.de/,@emph{Radio-Sinfonieorchester Berlin}} +in April 2014 at the Atze Musiktheater, Berlin. The Conductor was Heiko +Matthias Förster. @item Joe Smeets created sheet music for the children's book @emph{Zing Mee} -(@emph{Sing along}) by Annie M.G. published by Querido -- ISBN -9789045106205: -@uref{http://www.queridokinderenjeugdboeken.nl/web/Boek.htm?dbid=18954&typeofpage=134707, www.queridokinderenjeugdboeken.nl}; choir -rehearsal scores for the Dutch translation of Benjamin Britten's +(@emph{Sing along}) by Annie M.G. published by +@uref{http://www.queridokinderenjeugdboeken.nl/, Querido} +-- ISBN 9789045106205; +choir rehearsal scores for the Dutch translation of Benjamin Britten's @emph{Saint Nicolas} performed by @emph{Muziektheater Hollands Diep} in -2011. -@uref{http://www.muziektheaterhollandsdiep.nl/nl/voorstellingen/sint_nicolaas_leeft, www.muziektheaterhollandsdiep.nl}; and is currently -working on the score and parts for an arrangement of Moussurgsky's -@emph{Boris Godounov} for wind quartet, piano and percussion. To be -performed in 2014, again by @emph{Muziektheater Hollands Diep}. +2011; +@uref{http://www.muziektheaterhollandsdiep.nl/nl/voorstellingen/sint_nicolaas_leeft, www.muziektheaterhollandsdiep.nl}. +He has also worked on the score and parts for an arrangement of +Moussurgsky’s @emph{Boris Godounov} for wind quartet, piano and +percussion which was performed in 2014, again by +@emph{Muziektheater Hollands Diep}. @item A critical edition of Tommaso Traetta's @emph{Enea nel Lazio (1760)}, @@ -532,14 +655,13 @@ Created by for his Ph.D. Thesis. @item -Mussorgsky's @emph{Pictures at an exhibition}, re-orchestrated and +Mussorgsky's @emph{Pictures at an exhibition}, was re-orchestrated and conducted by @uref{http://www.aurelienbello.com/,Aurélien Bello} with -the @uref{http://www.junge-philharmonie-brandenburg.de/, -Junge Philharmonie Brandenburg} -on Oct 10 2011 and again on Apr 15-16 2012. +the @uref{https://junge-philharmonie-brandenburg.de/, +Junge Philharmonie Brandenburg} in October 2011 and April 2012. @item -@uref{http://www.kierenmacmillan.info/, Kieren MacMillan}, composer and +@uref{http://kierenmacmillan.info/, Kieren MacMillan}, composer and musical director. His many, recent works include; @emph{Go Thy Way}, performed by the @uref{http://www.saltlakechoralartists.org/, Salt Lake Choral Artists} in March 2012; The @@ -547,16 +669,16 @@ Salt Lake Choral Artists} in March 2012; The by the @uref{http://www.herald-dispatch.com/news/marshall/x1883873762/Music-duo-Chrysalis-to-perform-at-Marshall-University-on-Jan-19, Chrysalis Duo} ; @emph{thrafsmata} performed in July 2011 by the -@uref{http://www.pnme.org/CurrentSeason/PreviousSeasons.html, Pittsburgh +@uref{http://www.pnme.org/, Pittsburgh New Music Ensemble}. @item @emph{Anonymous Student Compliment or Complaint}, by @uref{http://www.mikesolomon.org, Mike Solomon}, winner chosen from among 172 entries from 22 countries of the -@uref{http://leftcoastensemble.org, 2011 Left Coast Composition Contest}. +@uref{http://www.leftcoastensemble.org, 2011 Left Coast Composition Contest}. Other works include, Norman (age 1) for clarinet solo, performed at the -@uref{http://emu.music.ufl.edu/fems_concerts.html, University of Florida}'s +@uref{http://arts.ufl.edu/academics/music/, University of Florida}'s Electroacoustic Music Festival (FEMF), October 2010. @item @@ -567,7 +689,7 @@ Italy. @uref{http://www.ascarlatti2010.net, Alessandro Scarlatti 2010}, in celebration of the composer's 350th birthday. @item -@uref{http://www.mercurybaroque.org, Mercury Baroque}'s performance of +@uref{http://www.mercuryhouston.org/, Mercury Baroque}'s performance of Lully's @emph{Armide}, May 15-16, 2009, in Houston, Texas (engraving by @uref{http://nicolas.sceaux.free.fr/, Nicolas Sceaux}). @@ -582,7 +704,7 @@ New York} (engraving by @emph{Affaire étrangère}, an opera by @uref{http://valentin.villenave.net/,Valentin Villenave} to a French libretto by -@uref{http://en.wikipedia.org/wiki/Lewis_Trondheim, Lewis +@uref{https://en.wikipedia.org/wiki/Lewis_Trondheim, Lewis Trondheim}, premiered February 1, 2009 at @uref{http://www.orchestre-montpellier.com/, L'Opéra National de Montpellier}, France. @@ -613,12 +735,12 @@ piano keyboard showing which keys to press to help beginners learn how to read sheet music. @item -@uref{http://www.adoromusicpub.com/, Adoro Music Publishing}, +@uref{https://twitter.com/adoromusic, Adoro Music Publishing}, high-quality scores of sacred music, available for immediate download or in traditional paper format. @item -@uref{http://www.shadylane.fr, The Shady Lane Publishing}, +@uref{http://matthieujacquot.com/, The Shady Lane Publishing}, a @qq{micro musical publishing house} whose goal is to promote a new form of musical economy closer to the musicians and music lovers. @@ -645,6 +767,12 @@ If you've already decided to try LilyPond, first read about our @node Reviews @unnumberedsec Reviews +@divClass{column-center-top} +@subheading What do people say about LilyPond? + +@divEnd + + @divClass{column-left-top} @subheading Published articles @@ -656,7 +784,7 @@ April 2011 @uref{http://www.linux-magazine.com,Linux Magazine} publishes an article titled -@uref{http://www.linux-magazine.com/w3/issue/126/088-090_projects.pdf, +@uref{http://www.linux-magazine.com/content/download/61706/482546/version/1/file/088-090_projects.pdf, Projects on the Move}. It is an introductory article on MuseScore, LilyPond and Chordii. Author Carla Schroder states @qq{LilyPond is driven from the command line, but don’t let the lack of a GUI scare @@ -689,7 +817,7 @@ talk about using software to maintain their libraries. @item June 2009 -In an @uref{http://news.lilynet.net/Free-Music-Now, article} +In an @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/Free-Music-Now, article} published in the French @emph{National Conservatory Parent Association}'s yearly magazine, French composer and LilyPond contributor Valentin Villenave explains how Free licenses, and @@ -851,7 +979,7 @@ typesetting].} @divClass{testimonial-item} -@subsubheading Chris Snyder, @uref{http://www.adoromusicpub.com/, Adoro Music Publishing} +@subsubheading Chris Snyder, @uref{https://twitter.com/adoromusic, Adoro Music Publishing} @qq{The way that music is entered for LilyPond causes me to think in a more musical way -- there have been times when I've been stumped as @@ -957,6 +1085,7 @@ Read about our @ref{Text input}. @c TRANSLATORS, so far it's mostly from @c http://lilypond.org/web/switch/howto +@divClass{column-center-top} @subheading @qq{Compiling} Music @imageClickable{nereid-shot-small,png, (click to enlarge), nereid-shot,png, right} @@ -1039,9 +1168,9 @@ help new users, beginning with @ref{Learning}. The Learning Manual is the best place to start, as many questions are answered before they come up! -Please read the Learning Manual before complaining about bugs! -New users occasionally believe that LilyPond is not working -correctly, when in fact it is working precisely as designed. +Occasionally new users are unnecessarily confused by some aspects +of LilyPond's behaviour. Please read this manual before doubting +whether LilyPond is working correctly. More in-depth information is available in @ref{Manuals}. @@ -1065,7 +1194,7 @@ command completion, and pre-made templates. Other programs actually provide a GUI which allows direct manipulation of a graphical score. For more information, see @ref{Easier editing}. - +@divEnd @divClass{column-center-bottom} @subheading Where now? @@ -1089,69 +1218,33 @@ In particular, don't link to: @end ignore @divClass{column-center-top} -@subheading Tunefl - -@sourceimage{logo-linux,,,} -@sourceimage{logo-freebsd,,,} -@sourceimage{logo-macosx,,,} -@sourceimage{logo-windows,,,} - -@uref{http://www.tunefl.com} - -With tunefl you can typeset your scores directly online -without needing to install LilyPond locally. It allows -trying out all the program's features using a convenient -web interface. - -@divEnd - -@divClass{column-center-top} -@subheading LilyPondTool - -@imageClickable{lilypondtool-2.12-screenshot-400wide,png, - (click to enlarge),lilypondtool-2.12-screenshot,png,right} - -@sourceimage{logo-linux,,,} -@sourceimage{logo-freebsd,,,} -@sourceimage{logo-macosx,,,} -@sourceimage{logo-windows,,,} - -@uref{http://lilypondtool.organum.hu} - -Created as a plugin for the -@uref{http://www.jedit.org,jEdit} text editor, -LilyPondTool is one of the most feature-rich text-based tools 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. - -@divEnd - -@divClass{column-center-top} -@subheading Frescobaldi +@subheading Front-end Applications +@subsubheading Frescobaldi @imageClickable{frescobaldi-lilypond-editor-small,png, (click to enlarge),frescobaldi-lilypond-editor,png,right} @sourceimage{logo-linux,,,} -@sourceimage{logo-freebsd,,,} +@sourceimage{logo-macosx,,,} @sourceimage{logo-windows,,,} @uref{http://www.frescobaldi.org} -Frescobaldi is lightweight, yet powerful LilyPond music and text editor -with a built-in PDF viewer. It is easy to use and will run on all major +Frescobaldi is a lightweight, yet powerful, music and text editor +with many features added and enhanced particularly for LilyPond. Major +features include point-and-click links between the code and music views, +detailed score wizards, built in LilyPond documentation browser, syntax +highlighting and automatic completion. Frescobaldi is written in +Python, with PyQt4 for its user interface, and will run on all major operating systems (GNU/Linux, Mac OS X and Windows). -@divEnd - -@divClass{column-center-top} -@subheading Denemo +@subsubheading Denemo @imageClickable{screenshot-denemo-small,png, (click to enlarge),screenshot-denemo,png,right} @sourceimage{logo-linux,,,} +@sourceimage{logo-macosx,,,} @sourceimage{logo-windows,,,} @uref{http://denemo.org} @@ -1169,7 +1262,27 @@ the text view when printed from there. @divEnd @divClass{column-center-top} -@subheading Text editors +@subheading Browser-based editors + +@subsubheading LilyBin +@uref{http://lilybin.com} + +A web-based LilyPond editor where you can typeset your scores directly +online without needing to install LilyPond. + +@subsubheading Tunefl +@uref{http://www.tunefl.com} + +With tunefl, you can typeset your mini-scores directly online without +needing to install LilyPond locally. It allows trying out all the +program's features using a convenient web interface. + +@divEnd + +@divClass{column-center-top} +@subheading IDE Plug-ins + +@subsubheading Elysium @sourceimage{logo-linux,,,} @sourceimage{logo-freebsd,,,} @@ -1183,32 +1296,47 @@ view for source and score. It includes rapid visual & auditive feedback without having to switch contexts, and comes with many wizard-driven templates. +@divEnd + +@divClass{column-center-top} +@subheading Text editors + +@sourceimage{logo-linux,,,} +@sourceimage{logo-freebsd,,,} +@sourceimage{logo-macosx,,,} +@sourceimage{logo-windows,,,} + +@subsubheading Emacs @uref{http://www.gnu.org/software/emacs/} +Emacs is a text editor with language-sensitive capabilities for many +different computer languages. Emacs is a highly extensible editor and +can be used as an Integrated Development Environment. There is a +@q{lilypond mode} which supplies the language definitions for working +with LilyPond source files. A developer has written +@uref{https://github.com/nsceaux/lyqi,lyqi}, an Emacs major mode. -Emacs is a text editor with language-sensitive capabilities for -many different computer languages. Emacs is a highly extensible -editor and can be used as an Integrated Development Environment. -There is a @q{lilypond mode} which supplies the language -definitions for working with LilyPond source files. A developer -has written @uref{https://github.com/nsceaux/lyqi,lyqi}, an Emacs major -mode. +If you are not already familiar with Emacs then you may probably prefer +to use a different editor for writing LilyPond input files. -@uref{http://www.vim.org} +More information on setting up Emacs can be found in +@rprogram{Text editor support}. +@subsubheading Vim +@uref{http://www.vim.org} Vim is a minimal text editor and is an extension of the older Unix @command{vi} editor. It is also extensible and configurable. -As a general rule, if you are not already familiar with Emacs or -Vim, then you would probably prefer to use a different editor for -writing LilyPond input files. +If you are not already familiar with Vi then you may probably prefer +to use a different editor for writing LilyPond input files. -More information on setting up Emacs and Vim can be found in +More information on setting up Vim can be found in @rprogram{Text editor support}. @sourceimage{logo-macosx,,,} +@subsubheading TeXShop @uref{http://www.uoregon.edu/~koch/texshop} -The TexShop editor for MacOS@tie{}X can be extended to run LilyPond, +The TeXShop editor for MacOS@tie{}X can be extended to run LilyPond, @command{lilypond-book} and @command{convert-ly} from within the editor, using the extensions available at: @@ -1219,8 +1347,7 @@ using the extensions available at: @divEnd @divClass{column-center-top} -@subheading Programs that can export LilyPond code - +@subheading Other programs that can export LilyPond code @subsubheading Score, tab and MIDI editors: @@ -1238,19 +1365,13 @@ to LilyPond, but is still beta-software. Testers are welcome, though. @item @uref{http://enc2ly.sourceforge.net/en/,Enc2ly} is a GNU/Linux program -which converts an @uref{http://www.gvox.com/,Encore} music score into -a LilyPond one. +which converts an Encore music score into a LilyPond one. @item @uref{https://github.com/hanwen/go-enc2ly,go-enc2ly} is a Go tool that -converts @uref{http://www.gvox.com/,Encore} files to LilyPond. It was -created using Felipe Castro's research and reverse engineering by -tweaking existing .enc files and loading them using the 4.55 demo -version. - -@item -@uref{http://www.musescore.org,MuseScore}, a score editor, has -incomplete LilyPond export but is being actively developed. +converts Encore files to LilyPond. It was created using Felipe Castro's +research and reverse engineering by tweaking existing .enc files and +loading them using the 4.55 demo version. @item @uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd}, @@ -1270,14 +1391,6 @@ mixing different musical works together in a single score or part. @uref{http://www.rosegardenmusic.com,Rosegarden}, an audio and MIDI sequencer, which also has a score editor for single-staff editing. -@item -@uref{https://launchpad.net/rumor/,Rumor}, a realtime monophonic -MIDI-to-LilyPond converter. - -@item -@uref{http://www.tuxguitar.com.ar/,TuxGuitar}, a multitrack tablature -editor and player, includes a score viewer and can export to LilyPond. - @end itemize @subsubheading Algorithmic code generators @@ -1307,27 +1420,51 @@ language. @divClass{column-center-top} -@subheading Other programs not being actively developed +@subheading Other programs no longer being actively developed @itemize +@item +@uref{https://sourceforge.net/projects/lily4jedit,LilyPondTool} was +created as a plugin for the @uref{http://www.jedit.org,jEdit} text +editor. + @item @uref{http://lilykde.googlecode.com/,LilyKDE} has been replaced by @uref{http://www.frescobaldi.org/,Frescobaldi}, and exists as LilyKDE3 for KDE 3.5 and lilypond-KDE4 for KDE 4.1 only. @item -@uref{http://noteedit.berlios.de,NoteEdit}, which imported -@uref{http://www.makemusic.com/musicxml,MusicXML}, has been forked -into +@uref{http://lilycomp.sourceforge.net, LilyComp} is a graphical note +entry program, acting much like a number-pad which produces LilyPond +notes. + +@item +@uref{http://www.musescore.org,MuseScore}, a score editor. LilyPond +export was dropped in version 2.0 but earlier versions are still +available for download at +@uref{http://sourceforge.net/projects/mscore/files/mscore/,Sourceforge}. + +@item +@uref{https://sourceforge.net/projects/noteedit.berlios/,NoteEdit}, which imported +@uref{http://www.makemusic.com/musicxml,MusicXML}, has been forked into @uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd} and @uref{http://canorus.org,Canorus}. +@item +@uref{http://extensions.services.openoffice.org/en/project/OOoLilyPond,OOoLilypond}, +an OpenOffice.org extension that converts LilyPond files into images +within OpenOffice.org documents. Although this is no longer being +developed, it appears to still work with version 4. + +@item +@uref{https://launchpad.net/rumor/,Rumor}, a realtime monophonic +MIDI-to-LilyPond converter. @item -@uref{http://lilycomp.sourceforge.net, LilyComp} is a graphical -note entry program, acting much like a number-pad which produces -LilyPond notes. +@uref{http://sourceforge.net/projects/tuxguitar/,TuxGuitar}, a +multitrack tablature editor and player, includes a score viewer and can +export to LilyPond. @end itemize @@ -1349,7 +1486,10 @@ like to review the @ref{Features}, @ref{Examples}, or the approach to the computational aesthetics of classical engraving is explained in our @ref{Background}. +@divEnd + +@divClass{column-center-bottom} @subheading Legalese @divClass{legal} diff --git a/Documentation/web/manuals.itexi b/Documentation/web/manuals.itexi index 4df4c9a313..07ccb42aa9 100644 --- a/Documentation/web/manuals.itexi +++ b/Documentation/web/manuals.itexi @@ -129,11 +129,11 @@ previous stable versions and current as a compressed archive. translation status for non-English readers. @item -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}: +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond Snippet Repository}: user-created examples, hints and tips. @item -@uref{http://benlemon.me/blog/music/lilypond/operation-lilypond/,Video Tutorials}: +@uref{http://bit.ly/LilyPondBeginners,Video Tutorials}: Ben Lemon, a LilyPond user, has created a range of video tutorials on his blog and which are aimed at new users. @@ -323,7 +323,7 @@ attempting any large projects. @subheading Snippets This shows a selected set of LilyPond snippets from the -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository} +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond Snippet Repository} (LSR). All the snippets are in the public domain. Please note that this document is not an exact subset of LSR. LSR diff --git a/Documentation/web/news-front.itexi b/Documentation/web/news-front.itexi index f82b56a149..349678b75d 100644 --- a/Documentation/web/news-front.itexi +++ b/Documentation/web/news-front.itexi @@ -9,7 +9,19 @@ @c used for news about the upcoming release; see CG 10.2 @newsItem -@subsubheading Lilypond 2.18.2 released! @emph{March 23, 2014} +@subheading LilyPond 2.19.45 released @emph{July 09, 2016} + +We are happy to announce the release of LilyPond +2.19.45. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading Lilypond 2.18.2 released! @emph{March 23, 2014} We are proud to announce the release of GNU LilyPond 2.18.2. LilyPond is a music engraving program devoted to producing the @@ -23,43 +35,25 @@ updated manuals. We recommend all users to upgrade to this version. @newsItem -@subsubheading LilyPond production named BEST EDITION 2014 @emph{March 11, 2014} - -We are thrilled to announce that the new edition of the songs of Oskar -Fried (1871-1941), published recently by our fellow contributors Urs Liska -and Janek Warchoł [1], will receive the "Musikeditionspreis BEST EDITION -2014" of the German Music Publishers' Association [2]! The ceremony will -take place in a few days at the Frankfurt Musikmesse [3]. - -We congratulate Janek and Urs for gaining such public recognition of -typographical and editorial excellence of their work. We are also delighted -to inform you that they intend to make their work available under a Free -license as soon as the publisher expenses are covered. Please support this -initiative by buying the printed volume through the publisher [4] or by -pledging a contribution at the Indiegogo campaign [5]! - -[1] @uref{http://lilypondblog.org/category/fried-songs}@* -[2] @uref{http://www.best-edition.de}@* -[3] @uref{https://musik.messefrankfurt.com/frankfurt/en/besucher/events/awards/best_edition.html}@* -[4] @uref{http://www.sound-rel.de}@* -[5] @uref{http://igg.me/at/free-fried} - -@newsEnd +@subheading Two LilyPond projects in Google Summer of Code 2016 @emph{April 23, 2016} +We are happy to see two students, Nathan Chou and Jeffery Shivers, working on +LilyPond as participants in the Google Summer of Code this year. We hope they +produce great results and stay in the developer community afterwards. -@newsItem -@subsubheading LilyPond 2.19.3 released @emph{March 2, 2014} +Nathan will tackle an annoying limitation, namely the unability of spanners +to cross voices. His work will make a class of ugly workarounds obsolete. +Jeffery will bring the ScholarLY package[1] to production quality and add a +LaTeX package to it, making it possible to create beautiful critical reports +from data encoded directly in the LilyPond score. -We are happy to announce the release of LilyPond 2.19.3. This -release includes a number of enhancements, and contains -some work in progress. You will have access to the very latest features, but -some may be incomplete, and you may encounter bugs and crashes. If you require -a stable version of Lilypond, we recommend using the 2.18 version. +[1] @uref{https://github.com/openlilylib/scholarly}@* @newsEnd + @newsItem -@subsubheading Lilypond 2.18.0 released! @emph{December 29, 2013} +@subheading Lilypond 2.18.0 released! @emph{December 29, 2013} We are proud to announce the release of GNU LilyPond 2.18.0. LilyPond is a music engraving program devoted to producing the @@ -144,118 +138,3 @@ Jean-Charles Malahieude, Till Paala, Yoshiki Sawada and numerous other contributors. @newsEnd - -@newsItem -@subsubheading LilyPond blog. @emph{June 2, 2013} - -Janek Warchoł has created a LilyPond blog. You can find it at -@uref{http://lilypondblog.org/, lilypondblog.org}! - -@newsEnd - -@newsItem -@subsubheading LilyPond 2.16.2 released! @emph{January 4, 2013} - -We are happy to announce the release of LilyPond 2.16.2. This release is mainly -to correct a problem with lilypond-book running on Windows. We recommend that -only people requiring this functionality upgrade to this version. - -@newsEnd - -@newsItem -@subsubheading The LilyPond Report #28. @emph{November 12, 2012} - -The @uref{http://news.lilynet.net/?The-LilyPond-Report-28, October -issue of the @emph{LilyPond Report}} focuses on the -@uref{http://news.lilynet.net/?LilyPond-meeting-in-Waltrop, -meeting of LilyPond developers and users} in Waltrop, Germany last -August. Of course, there are also some musings on LilyPond -triggered by the release of 2.16.0 and 2.17.0 occuring from that -venue. - -There are also two monthly financial reports from David Kastrup -whose work on LilyPond is -@uref{http://news.lilynet.net/?The-LilyPond-Report-24#an_urgent_request_for_funding, -solely paid for} by financial contributions from other developer -and users (thank you!), and a report about experiences from -@uref{http://scorio.com, a web-based music typesetting service} -using LilyPond internally. - -Come @uref{http://news.lilynet.net/?The-LilyPond-Report-28, read -LilyPond Report 28} now; comments and contributions are warmly -encouraged! -@newsEnd - -@newsItem -@subsubheading LilyPond 2.16.1 released! @emph{November 9, 2012} - -We are happy to announce the release of LilyPond 2.16.1. This has a number of -updates to the previous stable version, and should cause no problems. We -recommend that everybody upgrade to this version. -@newsEnd - -@newsItem -@subsubheading Lilypond 2.16.0 released! @emph{August 24, 2012} - -We are proud to announce the release of GNU LilyPond 2.16.1. -LilyPond is a music engraving program, devoted to producing the -highest-quality sheet music possible. It brings the aesthetics of -traditionally engraved music to computer printouts. - -Many improvements have been made in the past year since the previous -main stable version. A few major improvements are: - -@itemize -@item -Support for kievan square notation -@item -User and programming interfaces have greatly improved -@item -Music functions have become quite more versatile -@end itemize - -A full list of new features is given in: - -@example -@uref{http://lilypond.org/doc/v2.16/Documentation/changes/index.html} -@end example - -Happy music typesetting! LilyPond 2.16 was brought to you by... - -Main development team: - -Bertrand Bordage, Trevor Daniels, Colin Hall, Phil Holmes, Ian Hulin, -Reinhold Kainhofer, David Kastrup, Jonathan Kulp, Werner Lemberg, -John Mandereau, Patrick McCarty, Joe Neeman, Han-Wen Nienhuys, -Jan Nieuwenhuizen, Graham Percival, Mark Polesky, Neil Puttock, -Mike Solomon, Carl Sorensen, Francisco Vila, Valentin Villenave, -Jan Warchoł - -Programming contributors: - -Aleksandr Andreev, Sven Axelsson, Peter Chubb, Karin Hoethker, -Marc Hohl, David Nalesnik, Justin Ohmie, Benkő Pál, Julien Rioux, Patrick Schmidt, -Adam Spiers, Heikki Taurainen, Piers Titus van der Torren, -Jan-Peter Voigt, Janek Warchol - -Documentation contributors: - -James Lowe, Pavel Roskin, Alberto Simoes, Stefan Weil - -Bug squad: - -Colin Campbell, Eluze, Phil Holmes, Marek Klein, Ralph Palmer, -James Lowe - -Support: - -Colin Campbell, Christian Hitz, Phil Holmes - -Translation contributors: - -Jean-Charles Malahieude, Till Paala, Yoshiki Sawada - -@newsEnd - - - diff --git a/Documentation/web/news.itexi b/Documentation/web/news.itexi index ec7a73af99..c92da5f534 100644 --- a/Documentation/web/news.itexi +++ b/Documentation/web/news.itexi @@ -11,7 +11,7 @@ NOTE: * avoid putting links in running text. They make text harder to read. Preferably: (@uref{,...}, etc. ) - * use a descriptive title in @subsubheading + * use a descriptive title in @subheading * writing date in "Month DD, YYYY" format is required for generating the RSS feed; in case the message (and thus the date) @@ -27,7 +27,533 @@ NOTE: @end ignore @newsItem -@subsubheading LilyPond 2.18.1 @emph{February 16, 2014} +@subheading LilyPond 2.19.44 released @emph{June 21, 2016} + +We are happy to announce the release of LilyPond +2.19.44. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.43 released @emph{June 8, 2016} + +We are happy to announce the release of LilyPond +2.19.43. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.42 released @emph{May 15, 2016} + +We are happy to announce the release of LilyPond +2.19.42. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.41 released @emph{May 1, 2016} + +We are happy to announce the release of LilyPond +2.19.41. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.40 released @emph{April 17, 2016} + +We are happy to announce the release of LilyPond +2.19.40. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.39 released @emph{March 27, 2016} + +We are happy to announce the release of LilyPond +2.19.39. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.38 released @emph{March 13, 2016} + +We are happy to announce the release of LilyPond +2.19.38. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.37 released @emph{February 28, 2016} + +We are happy to announce the release of LilyPond +2.19.37. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.36 released @emph{January 31, 2016} + +We are happy to announce the release of LilyPond +2.19.36. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.35 released @emph{January 02, 2016} + +We are happy to announce the release of LilyPond +2.19.35. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.34 released @emph{December 22, 2015} + +We are happy to announce the release of LilyPond +2.19.34. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.33 released @emph{December 6, 2015} + +We are happy to announce the release of LilyPond +2.19.33. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.32 released @emph{November 22, 2015} + +We are happy to announce the release of LilyPond +2.19.32. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.31 released @emph{November 8, 2015} + +We are happy to announce the release of LilyPond +2.19.31. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.30 released @emph{October 25, 2015} + +We are happy to announce the release of LilyPond +2.19.30. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.29 released @emph{October 18, 2015} + +We are happy to announce the release of LilyPond +2.19.29. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.28 released @emph{September 27, 2015} + +We are happy to announce the release of LilyPond +2.19.28. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.27 released @emph{September 12, 2015} + +We are happy to announce the release of LilyPond +2.19.27. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.26 released @emph{August 27, 2015} + +We are happy to announce the release of LilyPond +2.19.26. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.25 released @emph{August 9, 2015} + +We are happy to announce the release of LilyPond +2.19.25. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.24 released @emph{July 26, 2015} + +We are happy to announce the release of LilyPond +2.19.24. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.23 released @emph{July 12, 2015} + +We are happy to announce the release of LilyPond +2.19.23. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.22 released @emph{June 28, 2015} + +We are happy to announce the release of LilyPond +2.19.22. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.21 released @emph{May 24, 2015} + +We are happy to announce the release of LilyPond +2.19.21. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.20 released @emph{May 10, 2015} + +We are happy to announce the release of LilyPond +2.19.20. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.19 released @emph{April 26, 2015} + +We are happy to announce the release of LilyPond +2.19.19. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.18 released @emph{April 5, 2015} + +We are happy to announce the release of LilyPond +2.19.18. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.17 released @emph{March 15, 2015} + +We are happy to announce the release of LilyPond +2.19.17. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.16 released @emph{February 28, 2015} + +At long last, we are very happy to announce the release of LilyPond +2.19.16. This release includes a number of enhancements, and contains some +work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +We would like to acknowledge and thank Masamichi Hosoda for making this +release possible with his work on updating GUB, the build tool. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.15 released @emph{September 28, 2014} + +We are happy to announce the release of LilyPond 2.19.15. This +release includes a number of enhancements, and contains some work +in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.14 released @emph{September 14, 2014} + +We are happy to announce the release of LilyPond 2.19.14. This +release includes a number of enhancements, and contains some work +in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.13 released @emph{August 31, 2014} + +We are happy to announce the release of LilyPond 2.19.13. This +release includes a number of enhancements, and contains some work +in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.12 released @emph{August 17, 2014} + +We are happy to announce the release of LilyPond 2.19.12. This +release includes a number of enhancements, and contains some work +in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.11 released @emph{August 3, 2014} + +We are happy to announce the release of LilyPond 2.19.11. This +release includes a number of enhancements, and contains some work +in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.10 released @emph{July 13, 2014} + +We are happy to announce the release of LilyPond 2.19.10. This +release includes a number of enhancements, and contains some work +in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.9 released @emph{June 29, 2014} + +We are happy to announce the release of LilyPond 2.19.9. This +release includes a number of enhancements, and contains some work +in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.8 released @emph{June 15, 2014} + +We are happy to announce the release of LilyPond 2.19.8. This +release includes a number of enhancements, and contains some work +in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.7 released @emph{May 25, 2014} + +We are happy to announce the release of LilyPond 2.19.7. This +release includes a number of enhancements, and contains some work +in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.6 released @emph{May 11, 2014} + +We are happy to announce the release of LilyPond 2.19.6. This +release includes a number of enhancements, and contains some work +in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you +require a stable version of Lilypond, we recommend using the 2.18 +version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.5 released @emph{April 20, 2014} + +We are happy to announce the release of LilyPond 2.19.5. This +release includes a number of enhancements, and contains +some work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you require +a stable version of Lilypond, we recommend using the 2.18 version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.19.4 released @emph{April 6, 2014} + +We are happy to announce the release of LilyPond 2.19.4. This +release includes a number of enhancements, and contains +some work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you require +a stable version of Lilypond, we recommend using the 2.18 version. + +@newsEnd + +@newsItem +@subheading LilyPond production named BEST EDITION 2014 @emph{March 11, 2014} + +We are thrilled that the edition of the songs of Oskar +Fried (1871-1941), published recently by our fellow contributors Urs Liska +and Janek Warchoł [1], received the "Musikeditionspreis BEST EDITION +2014" of the German Music Publishers' Association [2]. The ceremony +took place at the Frankfurt Musikmesse. + +We congratulate Janek and Urs for gaining such public recognition of +typographical and editorial excellence of their work. We are also delighted +to inform you that they intend to make their work available under a Free +license as soon as the publisher expenses are covered. Please support this +initiative by buying the printed volume through the publisher [3]. + +[1] @uref{http://lilypondblog.org/category/fried-songs}@* +[2] @uref{http://www.best-edition.de}@* +[3] @uref{http://www.sound-rel.de}@* + +@newsEnd + + +@newsItem +@subheading LilyPond 2.19.3 released @emph{March 2, 2014} + +We are happy to announce the release of LilyPond 2.19.3. This +release includes a number of enhancements, and contains +some work in progress. You will have access to the very latest features, but +some may be incomplete, and you may encounter bugs and crashes. If you require +a stable version of Lilypond, we recommend using the 2.18 version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.18.1 @emph{February 16, 2014} We have released updated manuals for LilyPond's stable version, 2.18. The manuals are now for 2.18.1 and have a number of updates and improvements @@ -41,7 +567,7 @@ stable LilyPond manuals: 2.18.1; development for both: 2.19.2. @newsEnd @newsItem -@subsubheading LilyPond 2.19.2 released @emph{February 2, 2014} +@subheading LilyPond 2.19.2 released @emph{February 2, 2014} We are happy to announce the release of LilyPond 2.19.2. This release includes a number of enhancements, and contains @@ -52,7 +578,7 @@ a stable version of Lilypond, we recommend using the 2.18 version. @newsEnd @newsItem -@subsubheading LilyPond 2.19.1 released @emph{January 19, 2014} +@subheading LilyPond 2.19.1 released @emph{January 19, 2014} We are happy to announce the release of LilyPond 2.19.1. This release includes a number of enhancements, and contains @@ -63,7 +589,7 @@ a stable version of Lilypond, we recommend using the 2.18 version. @newsEnd @newsItem -@subsubheading LilyPond 2.19.0 released @emph{January 5, 2014} +@subheading LilyPond 2.19.0 released @emph{January 5, 2014} We are happy to announce the release of LilyPond 2.19.0. This release includes a number of enhancements, and contains @@ -74,7 +600,7 @@ a stable version of Lilypond, we recommend using the 2.18 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.97 released! @emph{December 8, 2013} +@subheading LilyPond 2.17.97 released! @emph{December 8, 2013} We are excited to announce the release of LilyPond@tie{}2.17.97 as a potential final beta release for the upcoming stable release@tie{}2.18. The @@ -88,7 +614,7 @@ Please test this release and report back any problems, see @newsEnd @newsItem -@subsubheading LilyPond 2.17.96 released! @emph{November 24, 2013} +@subheading LilyPond 2.17.96 released! @emph{November 24, 2013} We are excited to announce the release of LilyPond@tie{}2.17.96 as a further beta release for the upcoming stable release@tie{}2.18. The @@ -102,7 +628,7 @@ Please test this release and report back any problems, see @newsEnd @newsItem -@subsubheading LilyPond 2.17.95 released! @emph{November 3, 2013} +@subheading LilyPond 2.17.95 released! @emph{November 3, 2013} We are excited to announce the release of LilyPond@tie{}2.17.95 as beta release for the upcoming stable release@tie{}2.18. The @@ -117,7 +643,7 @@ Please test this release and report back any problems, see @newsEnd @newsItem -@subsubheading LilyPond 2.17.29 released! @emph{October 20, 2013} +@subheading LilyPond 2.17.29 released! @emph{October 20, 2013} We are happy to announce the release of LilyPond 2.17.29. This release contains the usual number of bugfixes and enhancements, and contains @@ -128,7 +654,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.28 released! @emph{October 6, 2013} +@subheading LilyPond 2.17.28 released! @emph{October 6, 2013} We are happy to announce the release of LilyPond 2.17.28. This release contains the usual number of bugfixes and enhancements, and contains @@ -139,7 +665,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.27 released! @emph{September 26, 2013} +@subheading LilyPond 2.17.27 released! @emph{September 26, 2013} We are happy to announce the release of LilyPond 2.17.27. This release contains the usual number of bugfixes and enhancements, and contains @@ -150,7 +676,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.26 released! @emph{September 8, 2013} +@subheading LilyPond 2.17.26 released! @emph{September 8, 2013} We are happy to announce the release of LilyPond 2.17.26. This release contains the usual number of bugfixes and enhancements, and contains @@ -161,7 +687,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.25 released! @emph{August 25, 2013} +@subheading LilyPond 2.17.25 released! @emph{August 25, 2013} We are happy to announce the release of LilyPond 2.17.25. This release contains the usual number of bugfixes and enhancements, and contains @@ -172,7 +698,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.24 released! @emph{August 11, 2013} +@subheading LilyPond 2.17.24 released! @emph{August 11, 2013} We are happy to announce the release of LilyPond 2.17.24. This release contains the usual number of bugfixes and enhancements, and contains @@ -183,7 +709,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.23 released! @emph{July 28, 2013} +@subheading LilyPond 2.17.23 released! @emph{July 28, 2013} We are happy to announce the release of LilyPond 2.17.23. This release contains the usual number of bugfixes and enhancements, and contains @@ -194,7 +720,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.22 released! @emph{July 14, 2013} +@subheading LilyPond 2.17.22 released! @emph{July 14, 2013} We are happy to announce the release of LilyPond 2.17.22. This release contains the usual number of bugfixes and enhancements, and contains @@ -208,7 +734,7 @@ with positioning text. @newsEnd @newsItem -@subsubheading LilyPond 2.17.21 released! @emph{June 30, 2013} +@subheading LilyPond 2.17.21 released! @emph{June 30, 2013} We are happy to announce the release of LilyPond 2.17.21. This release contains the usual number of bugfixes and enhancements, and contains @@ -219,7 +745,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.20 released! @emph{June 9, 2013} +@subheading LilyPond 2.17.20 released! @emph{June 9, 2013} We are happy to announce the release of LilyPond 2.17.20. This release contains the usual number of bugfixes and enhancements, and contains @@ -230,7 +756,15 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.19 released! @emph{May 26, 2013} +@subheading LilyPond blog. @emph{June 2, 2013} + +Janek Warchoł has created a LilyPond blog. You can find it at +@uref{http://lilypondblog.org/, lilypondblog.org}! + +@newsEnd + +@newsItem +@subheading LilyPond 2.17.19 released! @emph{May 26, 2013} We are happy to announce the release of LilyPond 2.17.19. This release contains the usual number of bugfixes and enhancements, and contains @@ -241,7 +775,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.18 released! @emph{May 11, 2013} +@subheading LilyPond 2.17.18 released! @emph{May 11, 2013} We are happy to announce the release of LilyPond 2.17.18. This release contains the usual number of bugfixes and enhancements, and contains @@ -252,7 +786,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.17 released! @emph{April 27, 2013} +@subheading LilyPond 2.17.17 released! @emph{April 27, 2013} We are happy to announce the release of LilyPond 2.17.17. This release contains the usual number of bugfixes and enhancements, and contains @@ -263,7 +797,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.16 released! @emph{April 13, 2013} +@subheading LilyPond 2.17.16 released! @emph{April 13, 2013} We are happy to announce the release of LilyPond 2.17.16. This release contains the usual number of bugfixes and enhancements, and contains @@ -274,7 +808,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.15 released! @emph{March 30, 2013} +@subheading LilyPond 2.17.15 released! @emph{March 30, 2013} We are happy to announce the release of LilyPond 2.17.15. This release contains the usual number of bugfixes and enhancements, and contains @@ -285,7 +819,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.14 released! @emph{March 10, 2013} +@subheading LilyPond 2.17.14 released! @emph{March 10, 2013} We are happy to announce the release of LilyPond 2.17.14. This release contains the usual number of bugfixes (including putting span bars back @@ -297,7 +831,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.13 released! @emph{February 23, 2013} +@subheading LilyPond 2.17.13 released! @emph{February 23, 2013} We are happy to announce the release of LilyPond 2.17.13. This release contains the usual number of bugfixes and enhancements, and contains @@ -308,7 +842,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.12 released! @emph{February 8, 2013} +@subheading LilyPond 2.17.12 released! @emph{February 8, 2013} We are happy to announce the release of LilyPond 2.17.12. This release contains the usual number of bugfixes and enhancements, and contains @@ -319,7 +853,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.11 released! @emph{January 26, 2013} +@subheading LilyPond 2.17.11 released! @emph{January 26, 2013} We are happy to announce the release of LilyPond 2.17.11. This release contains the usual number of bugfixes and enhancements, and contains @@ -330,7 +864,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.10 released! @emph{January 12 2013} +@subheading LilyPond 2.17.10 released! @emph{January 12 2013} We are happy to announce the release of LilyPond 2.17.10. This release contains the usual number of bugfixes and enhancements, and contains @@ -341,7 +875,16 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.9 released! @emph{December 15, 2012} +@subheading LilyPond 2.16.2 released! @emph{January 4, 2013} + +We are happy to announce the release of LilyPond 2.16.2. This release is mainly +to correct a problem with lilypond-book running on Windows. We recommend that +only people requiring this functionality upgrade to this version. + +@newsEnd + +@newsItem +@subheading LilyPond 2.17.9 released! @emph{December 15, 2012} We are happy to announce the release of LilyPond 2.17.9. This release contains the usual number of bugfixes and enhancements, and contains @@ -352,7 +895,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.8 released! @emph{December 1, 2012} +@subheading LilyPond 2.17.8 released! @emph{December 1, 2012} We are happy to announce the release of LilyPond 2.17.8. This release contains the usual number of bugfixes and enhancements, and contains @@ -363,7 +906,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.7 released! @emph{November 17, 2012} +@subheading LilyPond 2.17.7 released! @emph{November 17, 2012} We are happy to announce the release of LilyPond 2.17.7. This release contains the usual number of bugfixes and enhancements, and contains @@ -375,7 +918,31 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsItem -@subsubheading LilyPond 2.16.1 released! @emph{November 9, 2012} +@subheading The LilyPond Report #28. @emph{November 12, 2012} + +The @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-28, October +issue of the @emph{LilyPond Report}} focuses on the +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?LilyPond-meeting-in-Waltrop, +meeting of LilyPond developers and users} in Waltrop, Germany last +August. Of course, there are also some musings on LilyPond +triggered by the release of 2.16.0 and 2.17.0 occuring from that +venue. + +There are also two monthly financial reports from David Kastrup +whose work on LilyPond is +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-24#an_urgent_request_for_funding, +solely paid for} by financial contributions from other developer +and users (thank you!), and a report about experiences from +@uref{http://scorio.com, a web-based music typesetting service} +using LilyPond internally. + +Come @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-28, read +LilyPond Report 28} now; comments and contributions are warmly +encouraged! +@newsEnd + +@newsItem +@subheading LilyPond 2.16.1 released! @emph{November 9, 2012} We are happy to announce the release of LilyPond 2.16.1. This has a number of updates to the previous stable version, and should cause no problems. We @@ -383,7 +950,7 @@ recommend that everybody upgrade to this version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.6 released! @emph{November 3, 2012} +@subheading LilyPond 2.17.6 released! @emph{November 3, 2012} We are happy to announce the release of LilyPond 2.17.6. This release contains the usual number of bugfixes and enhancements, and contains @@ -394,7 +961,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.5 released! @emph{October 20, 2012} +@subheading LilyPond 2.17.5 released! @emph{October 20, 2012} We are happy to announce the release of LilyPond 2.17.5. This release contains the usual number of bugfixes and enhancements, and contains @@ -405,7 +972,7 @@ a stable version of Lilypond, we recommend using the 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.4 released! @emph{October 6, 2012} +@subheading LilyPond 2.17.4 released! @emph{October 6, 2012} We are happy to announce the release of LilyPond 2.17.4. This release contains the usual number of bugfixes. It is strongly @@ -415,7 +982,7 @@ and instead use the stable 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.3 released! @emph{September 23, 2012} +@subheading LilyPond 2.17.3 released! @emph{September 23, 2012} We are happy to announce the release of LilyPond 2.17.3. This release contains the usual number of bugfixes. It is strongly @@ -425,7 +992,7 @@ and instead use the stable 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.2 released! @emph{September 10, 2012} +@subheading LilyPond 2.17.2 released! @emph{September 10, 2012} We are happy to announce the release of LilyPond 2.17.2. This release contains the usual number of bugfixes. It is strongly @@ -435,7 +1002,7 @@ and instead use the stable 2.16 version. @newsEnd @newsItem -@subsubheading LilyPond 2.17.1 released! @emph{August 28, 2012} +@subheading LilyPond 2.17.1 released! @emph{August 28, 2012} We are happy to announce the release of LilyPond 2.17.1. This release contains the usual number of bugfixes. It is strongly @@ -446,7 +1013,7 @@ and instead use the stable 2.16 version. @newsItem -@subsubheading LilyPond 2.17.0 released! @emph{August 26, 2012} +@subheading LilyPond 2.17.0 released! @emph{August 26, 2012} We are happy to announce the release of LilyPond 2.17.0. This release contains the usual number of bugfixes. It is strongly @@ -456,7 +1023,7 @@ and instead use the stable 2.16 version. @newsEnd @newsItem -@subsubheading Lilypond 2.16.0 released! @emph{August 24, 2012} +@subheading Lilypond 2.16.0 released! @emph{August 24, 2012} We are proud to announce the release of GNU LilyPond 2.16.0. LilyPond is a music engraving program, devoted to producing the @@ -464,7 +1031,7 @@ highest-quality sheet music possible. It brings the aesthetics of traditionally engraved music to computer printouts. Many improvements have been made in the past year since the previous -main stable version. A few major improvements are: +main stable version. A few major improvements are: @itemize @item @@ -472,7 +1039,7 @@ Support for kievan square notation @item User and programming interfaces have greatly improved @item -Music functions have become quite more versatile +Music functions have become quite more versatile @end itemize A full list of new features is given in: @@ -514,12 +1081,12 @@ Colin Campbell, Christian Hitz, Phil Holmes Translation contributors: -Jean-Charles Malahieude, Till Paala, Yoshiki Sawada +Jean-Charles Malahieude, Till Paala, Yoshiki Sawada @newsEnd @newsItem -@subsubheading Lilypond 2.15.95 released! @emph{August 11, 2012} +@subheading Lilypond 2.15.95 released! @emph{August 11, 2012} We are excited to announce the release of LilyPond 2.15.95. With this release, development on version 2.15 is frozen for the @@ -536,7 +1103,7 @@ on the website section about @ref{Development}. @newsItem -@subsubheading LilyPond 2.15.42 released! @emph{August 02, 2012} +@subheading LilyPond 2.15.42 released! @emph{August 02, 2012} We are happy to announce the release of LilyPond 2.15.42. This release contains the usual number of bugfixes. @@ -550,7 +1117,7 @@ candidate. @newsItem -@subsubheading The LilyPond Report #27. @emph{August 2, 2012} +@subheading The LilyPond Report #27. @emph{August 2, 2012} The @emph{LilyPond Report} is back, with some interesting insights on new Scheme-related features recently added by our community’s only paid @@ -560,13 +1127,13 @@ to be found in this issue are an overview of some lesser-known LilyPond companion projects, and a handful of more shallow factoids. Come -@uref{http://news.lilynet.net/?The-LilyPond-Report-27, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-27, read LilyPond Report 27} now; comments and contributions are warmly encouraged! @newsEnd @newsItem -@subsubheading Release candidate withdrawn @emph{July 11, 2012} +@subheading Release candidate withdrawn @emph{July 11, 2012} We have discovered a regression since 2.14.2, so lilypond 2.15.41 is no longer a candidate for the 2.16.0 release. However, please @@ -578,7 +1145,7 @@ problems, please send us @ref{Bug reports}. @newsItem -@subsubheading Release candidate 8 of 2.16 - LilyPond 2.15.41 released! @emph{July 4, 2012} +@subheading Release candidate 8 of 2.16 - LilyPond 2.15.41 released! @emph{July 4, 2012} LilyPond 2.15.41 is out; this is the eighth release candidate of the upcoming 2.16 stable release. All users are invited to @@ -595,7 +1162,7 @@ on 18 July 2012. If you discover any problems, please send us @newsItem -@subsubheading LilyPond 2.15.40 released! @emph{June 05, 2012} +@subheading LilyPond 2.15.40 released! @emph{June 05, 2012} We are happy to announce the release of LilyPond 2.15.40. This release contains the usual number of bugfixes. @@ -609,7 +1176,7 @@ candidate. @newsItem -@subsubheading Release candidate withdrawn @emph{June 01, 2012} +@subheading Release candidate withdrawn @emph{June 01, 2012} We have discovered a regression since 2.14.2, so lilypond 2.15.39 is no longer a candidate for the 2.16.0 release. However, please @@ -621,7 +1188,7 @@ problems, please send us @ref{Bug reports}. @newsItem -@subsubheading Release candidate 7 of 2.16 - LilyPond 2.15.39 released! @emph{May 22, 2012} +@subheading Release candidate 7 of 2.16 - LilyPond 2.15.39 released! @emph{May 22, 2012} LilyPond 2.15.39 is out; this is the seventh release candidate of the upcoming 2.16 stable release. All users are invited to @@ -638,7 +1205,7 @@ on 05 June 2012. If you discover any problems, please send us @newsItem -@subsubheading The LilyPond Report #26. @emph{May 22, 2012} +@subheading The LilyPond Report #26. @emph{May 22, 2012} The @emph{LilyPond Report} is back, with a new editor on board - Pavel Roskin, who tells us about his adventures in strange lands @@ -648,7 +1215,7 @@ see for yourself how close (or how far?) are we from matching the quality of hand-engraved scores. Come -@uref{http://news.lilynet.net/?The-LilyPond-Report-26, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-26, read LilyPond Report 26} now; comments and contributions are warmly encouraged! @@ -656,7 +1223,7 @@ warmly encouraged! @newsItem -@subsubheading Release candidate 6 of 2.16 - LilyPond 2.15.38 released! @emph{May 3, 2012} +@subheading Release candidate 6 of 2.16 - LilyPond 2.15.38 released! @emph{May 3, 2012} LilyPond 2.15.38 is out; this is the sixth release candidate of the upcoming 2.16 stable release. All users are invited to @@ -671,7 +1238,7 @@ candidate will be required. @newsItem -@subsubheading LilyPond takes part in Google Summer of Code 2012! @emph{April 25, 2012} +@subheading LilyPond takes part in Google Summer of Code 2012! @emph{April 25, 2012} Being a part of @uref{http://www.gnu.org/, GNU project}, we are participating in @uref{http://www.google-melange.com/gsoc/homepage/google/gsoc2012, @@ -685,7 +1252,7 @@ He will be working on advanced lyrics positioning in LilyPond. @newsItem -@subsubheading Release candidate 5 of 2.16 - LilyPond 2.15.37 released! @emph{April 19, 2012} +@subheading Release candidate 5 of 2.16 - LilyPond 2.15.37 released! @emph{April 19, 2012} LilyPond 2.15.37 is out; this is the fifth release candidate of the upcoming 2.16 stable release. All users are invited to @@ -702,7 +1269,7 @@ on 03 May 2012. If you discover any problems, please send us @newsItem -@subsubheading Release candidate 4 of 2.16 - LilyPond 2.15.36 released! @emph{April 6, 2012} +@subheading Release candidate 4 of 2.16 - LilyPond 2.15.36 released! @emph{April 6, 2012} LilyPond 2.15.36 is out; this is the fourth release candidate of the upcoming 2.16 stable release. All users are invited to @@ -719,7 +1286,7 @@ on 20 April 2012. If you discover any problems, please send us @newsItem -@subsubheading The LilyPond Report #25. @emph{Apr 1st, 2012} +@subheading The LilyPond Report #25. @emph{Apr 1st, 2012} The @emph{LilyPond Report} is back, with a rather unusual issue featuring our young Polish contributor Janek Warchoł! @@ -727,7 +1294,7 @@ Also included in this issue are quite a few unexpected items, including (but not limited to)… a cooking recipe! Come -@uref{http://news.lilynet.net/?The-LilyPond-Report-25, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-25, read LilyPond Report 25} now; comments and contributions are warmly encouraged! @@ -735,7 +1302,7 @@ warmly encouraged! @newsItem -@subsubheading LilyPond 2.15.35 released! @emph{Mar 28, 2012} +@subheading LilyPond 2.15.35 released! @emph{Mar 28, 2012} We are happy to announce the release of LilyPond 2.15.35. This release contains the usual number of bugfixes. @@ -749,7 +1316,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.34 released! @emph{Mar 19, 2012} +@subheading LilyPond 2.15.34 released! @emph{Mar 19, 2012} We are happy to announce the release of LilyPond 2.15.34. This release contains the usual number of bugfixes. @@ -763,7 +1330,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.33 released! @emph{Mar 08, 2012} +@subheading LilyPond 2.15.33 released! @emph{Mar 08, 2012} We are happy to announce the release of LilyPond 2.15.33. This release contains the usual number of bugfixes. @@ -777,7 +1344,7 @@ candidate. @newsItem -@subsubheading The LilyPond Report #24. @emph{Mar 5, 2012} +@subheading The LilyPond Report #24. @emph{Mar 5, 2012} A new issue of the @emph{LilyPond Report} is now available for reading; topics include a request for funding, @@ -785,7 +1352,7 @@ an article about exciting new features in LilyPond grammar, and an overview of LilyPond-based web applications. Come -@uref{http://news.lilynet.net/?The-LilyPond-Report-24, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-24, read LilyPond Report 24} now; comments and contributions are warmly encouraged! @@ -793,7 +1360,7 @@ warmly encouraged! @newsItem -@subsubheading LilyPond 2.15.32 released! @emph{Mar 03, 2012} +@subheading LilyPond 2.15.32 released! @emph{Mar 03, 2012} We are happy to announce the release of LilyPond 2.15.32. This release contains the usual number of bugfixes. @@ -807,7 +1374,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.31 released! @emph{Feb 29, 2012} +@subheading LilyPond 2.15.31 released! @emph{Feb 29, 2012} We are happy to announce the release of LilyPond 2.15.31. This release contains the usual number of bugfixes. @@ -821,7 +1388,7 @@ candidate. @newsItem -@subsubheading Release candidate 3 of 2.16 - LilyPond 2.15.30 released! @emph{Feb 17, 2012} +@subheading Release candidate 3 of 2.16 - LilyPond 2.15.30 released! @emph{Feb 17, 2012} LilyPond 2.15.30 is out; this is the third release candidate of the upcoming 2.16 stable release. All users are invited to @@ -838,7 +1405,7 @@ on 02 March 2012. If you discover any problems, please send us @newsItem -@subsubheading LilyPond 2.15.29 released! @emph{Feb 9, 2012} +@subheading LilyPond 2.15.29 released! @emph{Feb 9, 2012} We are happy to announce the release of LilyPond 2.15.29. This release contains the usual number of bugfixes. @@ -852,7 +1419,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.28 released! @emph{Feb 3, 2012} +@subheading LilyPond 2.15.28 released! @emph{Feb 3, 2012} We are happy to announce the release of LilyPond 2.15.28. This release contains the usual number of bugfixes. @@ -866,7 +1433,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.27 released! @emph{Jan 24, 2012} +@subheading LilyPond 2.15.27 released! @emph{Jan 24, 2012} We are happy to announce the release of LilyPond 2.15.27. This release contains the usual number of bugfixes. @@ -880,7 +1447,7 @@ candidate. @newsItem -@subsubheading The LilyPond Report #23. @emph{Jan 20, 2012} +@subheading The LilyPond Report #23. @emph{Jan 20, 2012} The @emph{LilyPond Report} is back, with developer David Kastrup as a new editor! This issue features @@ -889,7 +1456,7 @@ recently added to LilyPond, as well as an interview with LilyPond contributor and composer Mike Solomon. Come -@uref{http://news.lilynet.net/?The-LilyPond-Report-23, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-23, read LilyPond Report 23} now; comments and contributions are warmly encouraged! @@ -897,7 +1464,7 @@ warmly encouraged! @newsItem -@subsubheading LilyPond 2.15.26 released! @emph{Jan 16, 2012} +@subheading LilyPond 2.15.26 released! @emph{Jan 16, 2012} We are happy to announce the release of LilyPond 2.15.26. This release contains the usual number of bugfixes. @@ -913,7 +1480,7 @@ The 2.15.25 has been skipped due to build problems. @newsItem -@subsubheading LilyPond 2.15.24 released! @emph{Jan 07, 2012} +@subheading LilyPond 2.15.24 released! @emph{Jan 07, 2012} We are happy to announce the release of LilyPond 2.15.24. This release contains the usual number of bugfixes. @@ -927,7 +1494,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.23 released! @emph{Dec 21, 2011} +@subheading LilyPond 2.15.23 released! @emph{Dec 21, 2011} We are happy to announce the release of LilyPond 2.15.23. This release contains the usual number of bugfixes. @@ -941,7 +1508,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.22 released! @emph{Dec 15, 2011} +@subheading LilyPond 2.15.22 released! @emph{Dec 15, 2011} We are happy to announce the release of LilyPond 2.15.22. This release contains the usual number of bugfixes. @@ -955,7 +1522,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.21 released! @emph{Dec 6, 2011} +@subheading LilyPond 2.15.21 released! @emph{Dec 6, 2011} We are happy to announce the release of LilyPond 2.15.21. This release contains the usual number of bugfixes. @@ -969,7 +1536,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.20 released! @emph{Nov 24, 2011} +@subheading LilyPond 2.15.20 released! @emph{Nov 24, 2011} We are happy to announce the release of LilyPond 2.15.20. This release contains the usual number of bugfixes. @@ -983,7 +1550,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.19 released! @emph{Nov 18, 2011} +@subheading LilyPond 2.15.19 released! @emph{Nov 18, 2011} We are happy to announce the release of LilyPond 2.15.19. This release contains the usual number of bugfixes. @@ -997,7 +1564,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.18 released! @emph{Nov 12, 2011} +@subheading LilyPond 2.15.18 released! @emph{Nov 12, 2011} We are happy to announce the release of LilyPond 2.15.18. This release contains the usual number of bugfixes. @@ -1011,7 +1578,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.17 released! @emph{Nov 10, 2011} +@subheading LilyPond 2.15.17 released! @emph{Nov 10, 2011} We are happy to announce the release of LilyPond 2.15.17. This release contains the usual number of bugfixes. @@ -1025,7 +1592,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.16 released! @emph{October 28, 2011} +@subheading LilyPond 2.15.16 released! @emph{October 28, 2011} We are happy to announce the release of LilyPond 2.15.16. This release contains the usual number of bugfixes. @@ -1039,7 +1606,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.15 released! @emph{October 24, 2011} +@subheading LilyPond 2.15.15 released! @emph{October 24, 2011} We are happy to announce the release of LilyPond 2.15.15. This release contains the usual number of bugfixes. @@ -1053,7 +1620,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.14 released! @emph{October 7, 2011} +@subheading LilyPond 2.15.14 released! @emph{October 7, 2011} We are happy to announce the release of LilyPond 2.15.14. This release contains the usual number of bugfixes. @@ -1067,7 +1634,7 @@ candidate. @newsItem -@subsubheading LilyPond 2.15.13 released! @emph{September 27, 2011} +@subheading LilyPond 2.15.13 released! @emph{September 27, 2011} We are happy to announce the release of LilyPond 2.15.13. This release contains the usual number of bugfixes. @@ -1081,7 +1648,7 @@ candidate. @newsItem -@subsubheading Release candidate 2 cancelled @emph{Sep 23, 2011} +@subheading Release candidate 2 cancelled @emph{Sep 23, 2011} The release countdown is cancelled due to the discovery of a Critical regression. @@ -1090,7 +1657,7 @@ Critical regression. @newsItem -@subsubheading Release candidate 2 of 2.16 - LilyPond 2.15.12 released! @emph{Sep 20, 2011} +@subheading Release candidate 2 of 2.16 - LilyPond 2.15.12 released! @emph{Sep 20, 2011} LilyPond 2.15.12 is out; this is the second release candidate of the upcoming 2.16 stable release. All users are invited to @@ -1107,7 +1674,7 @@ on 27 Sep 2011. If you discover any problems, please send us @newsItem -@subsubheading LilyPond 2.15.11 released! @emph{September 11, 2011} +@subheading LilyPond 2.15.11 released! @emph{September 11, 2011} We are happy to announce the release of LilyPond 2.15.11. This release contains the usual number of bugfixes. @@ -1121,7 +1688,7 @@ not the next release candidate. @newsItem -@subsubheading LilyPond 2.15.10 released! @emph{September 6, 2011} +@subheading LilyPond 2.15.10 released! @emph{September 6, 2011} We are happy to announce the release of LilyPond 2.15.10. This release contains the usual number of bugfixes. @@ -1135,7 +1702,7 @@ next release candidate. @newsItem -@subsubheading LilyPond 2.15.9 released! @emph{August 30, 2011} +@subheading LilyPond 2.15.9 released! @emph{August 30, 2011} We are happy to announce the release of LilyPond 2.15.9. This release contains the usual number of bugfixes, and also adds @@ -1150,7 +1717,7 @@ next release candidate. @newsItem -@subsubheading Release candidate 1 of 2.16 - LilyPond 2.15.8 released! @emph{Aug 01, 2011} +@subheading Release candidate 1 of 2.16 - LilyPond 2.15.8 released! @emph{Aug 01, 2011} LilyPond 2.15.8 is out; this is the first release candidate of the upcoming 2.16 stable release. All users are invited to @@ -1167,7 +1734,7 @@ on 08 Aug 2011. If you discover any problems, please send us @newsItem -@subsubheading LilyPond 2.15.7 released! @emph{July 29, 2011} +@subheading LilyPond 2.15.7 released! @emph{July 29, 2011} We are happy to announce the release of LilyPond 2.15.7. This release contains the usual number of bugfixes. @@ -1179,7 +1746,7 @@ this release, and instead use the stable 2.14 version. @newsItem -@subsubheading LilyPond 2.15.6 released! @emph{July 26, 2011} +@subheading LilyPond 2.15.6 released! @emph{July 26, 2011} We are happy to announce the release of LilyPond 2.15.6. This release contains the usual number of bugfixes. @@ -1191,7 +1758,7 @@ this release, and instead use the stable 2.14 version. @newsItem -@subsubheading LilyPond 2.14.2 released! @emph{July 25, 2011} +@subheading LilyPond 2.14.2 released! @emph{July 25, 2011} We are happy to announce the release of LilyPond 2.14.2. This fixes a few minor bugs in the stable version, and should cause no @@ -1203,7 +1770,7 @@ problems. We recommend that everybody upgrade to this version. @newsItem -@subsubheading LilyPond 2.15.5 released! @emph{July 12, 2011} +@subheading LilyPond 2.15.5 released! @emph{July 12, 2011} We are happy to announce the release of LilyPond 2.15.5. This release contains the usual number of bugfixes. @@ -1215,7 +1782,7 @@ this release, and instead use the stable 2.14 version. @newsItem -@subsubheading LilyPond 2.15.4 released! @emph{July 4, 2011} +@subheading LilyPond 2.15.4 released! @emph{July 4, 2011} We are happy to announce the release of LilyPond 2.15.4. This release contains the usual number of bugfixes. @@ -1227,7 +1794,7 @@ this release, and instead use the stable 2.14 version. @newsItem -@subsubheading LilyPond 2.15.3 released! @emph{June 27, 2011} +@subheading LilyPond 2.15.3 released! @emph{June 27, 2011} We are happy to announce the release of LilyPond 2.15.3. This release contains the usual number of bugfixes. @@ -1239,7 +1806,7 @@ this release, and instead use the stable 2.14 version. @newsItem -@subsubheading LilyPond 2.15.2 released! @emph{June 18, 2011} +@subheading LilyPond 2.15.2 released! @emph{June 18, 2011} We are happy to announce the release of LilyPond 2.15.2. This release contains the usual number of bugfixes. @@ -1251,7 +1818,7 @@ this release, and instead use the stable 2.14 version. @newsItem -@subsubheading LilyPond 2.14.1 released! @emph{June 12, 2011} +@subheading LilyPond 2.14.1 released! @emph{June 12, 2011} We are happy to announce the release of LilyPond 2.14.1. This fixes a few minor bugs in the stable version, and should cause no @@ -1260,7 +1827,7 @@ problems. We recommend that everybody upgrade to this version. @newsEnd @newsItem -@subsubheading LilyPond 2.15.1 released! @emph{June 11, 2011} +@subheading LilyPond 2.15.1 released! @emph{June 11, 2011} We are happy to announce the release of LilyPond 2.15.1. This is the beginning of a new unstable development effort, and adds the @@ -1272,7 +1839,7 @@ this release, and instead use the stable 2.14 version. @newsEnd @newsItem -@subsubheading LilyPond 2.15.0 released! @emph{June 7, 2011} +@subheading LilyPond 2.15.0 released! @emph{June 7, 2011} We are happy to announce the release of LilyPond 2.15.0. This is the beginning of a new unstable development effort, and adds the @@ -1285,7 +1852,7 @@ this release, and instead use the stable 2.14 version. @newsItem -@subsubheading LilyPond 2.14.0 released! @emph{June 6, 2011} +@subheading LilyPond 2.14.0 released! @emph{June 6, 2011} We are proud to announce the release of GNU LilyPond 2.14. LilyPond is a music engraving program, devoted to producing the @@ -1363,7 +1930,7 @@ Munnik, Till Paala, Ralf Wildenhues, Yoshiki Sawada. @newsItem -@subsubheading Release candidate 7 of 2.14 - LilyPond 2.13.63 released! @emph{May 30, 2011} +@subheading Release candidate 7 of 2.14 - LilyPond 2.13.63 released! @emph{May 30, 2011} LilyPond 2.13.63 is out; this is the seventh release candidate of the upcoming 2.14 stable release. All users are invited to @@ -1380,7 +1947,7 @@ on June 6, 2011. If you discover any problems, please send us @newsItem -@subsubheading LilyPond 2.13.62 released! @emph{May 24, 2011} +@subheading LilyPond 2.13.62 released! @emph{May 24, 2011} We are happy to announce the release of LilyPond 2.13.62. This release contains the usual number of bugfixes. @@ -1392,7 +1959,7 @@ due to a few remaining Critical bugs. @newsItem -@subsubheading LilyPond 2.13.61 released! @emph{May 1, 2011} +@subheading LilyPond 2.13.61 released! @emph{May 1, 2011} We are happy to announce the release of LilyPond 2.13.61. This release contains the usual number of bugfixes. @@ -1404,7 +1971,7 @@ due to a few remaining Critical bugs. @newsItem -@subsubheading LilyPond 2.13.60 released! @emph{April 16, 2011} +@subheading LilyPond 2.13.60 released! @emph{April 16, 2011} We are happy to announce the release of LilyPond 2.13.60. This release contains the usual number of bugfixes. @@ -1416,11 +1983,11 @@ due to a few remaining Critical bugs. @newsItem -@subsubheading Linux Journal Magazine article - @emph{April 2011} +@subheading Linux Journal Magazine article - @emph{April 2011} @uref{http://www.linux-magazine.com,Linux Magazine} publishes an article in the May 2011 issue titled -@uref{http://www.linux-magazine.com/w3/issue/126/088-090_projects.pdf, +@uref{http://www.linux-magazine.com/content/download/61706/482546/version/1/file/088-090_projects.pdf, Projects on the Move}. It is an introduction to MuseScore, LilyPond and Chordii. Author Carla Schroder states @qq{LilyPond is driven from the command line, but don’t let the lack of a GUI scare @@ -1429,7 +1996,7 @@ a hands-on example. @newsEnd @newsItem -@subsubheading LilyPond 2.13.59 released! @emph{April 10, 2011} +@subheading LilyPond 2.13.59 released! @emph{April 10, 2011} We are happy to announce the release of LilyPond 2.13.59. This release contains the usual number of bugfixes. @@ -1441,7 +2008,7 @@ due to a few remaining Critical bugs. @newsItem -@subsubheading Release candidate 6 of 2.14 - LilyPond 2.13.58 released! @emph{April 7, 2011} +@subheading Release candidate 6 of 2.14 - LilyPond 2.13.58 released! @emph{April 7, 2011} LilyPond 2.13.58 is out; this is the sixth release candidate of the upcoming 2.14 stable release. All users are invited to @@ -1458,7 +2025,7 @@ on April 14, 2011. If you discover any problems, please send us @newsItem -@subsubheading Release candidate 5 of 2.14 - LilyPond 2.13.57 released! @emph{April 3, 2011} +@subheading Release candidate 5 of 2.14 - LilyPond 2.13.57 released! @emph{April 3, 2011} LilyPond 2.13.57 is out; this is the fifth release candidate of the upcoming 2.14 stable release. All users are invited to @@ -1475,7 +2042,7 @@ on April 10, 2011. If you discover any problems, please send us @newsItem -@subsubheading Release candidate 4 of 2.14 - LilyPond 2.13.56 released! @emph{Mar 29, 2011} +@subheading Release candidate 4 of 2.14 - LilyPond 2.13.56 released! @emph{Mar 29, 2011} LilyPond 2.13.56 is out; this is the fourth release candidate of the upcoming 2.14 stable release. All users are invited to @@ -1492,7 +2059,7 @@ on April 5, 2011. If you discover any problems, please send us @newsItem -@subsubheading LilyPond 2.13.55 released! @emph{Mar 22, 2011} +@subheading LilyPond 2.13.55 released! @emph{Mar 22, 2011} We are happy to announce the release of LilyPond 2.13.55. This release contains the usual number of bugfixes. @@ -1504,7 +2071,7 @@ due to a few remaining Critical bugs. @newsItem -@subsubheading Release candidate 3 withdrawn @emph{Mar 15, 2011} +@subheading Release candidate 3 withdrawn @emph{Mar 15, 2011} We have discovered a regression since 2.12.3, so lilypond 2.13.54 is no longer a candidate for the 2.14.0 release. However, please @@ -1516,7 +2083,7 @@ problems, please send us @ref{Bug reports}. @newsItem -@subsubheading Release candidate 3 of 2.14 - LilyPond 2.13.54 released! @emph{Mar 13, 2011} +@subheading Release candidate 3 of 2.14 - LilyPond 2.13.54 released! @emph{Mar 13, 2011} LilyPond 2.13.54 is out; this is the third release candidate of the upcoming 2.14 stable release. All users are invited to @@ -1533,7 +2100,7 @@ on March 27, 2011. If you discover any problems, please send us @newsItem -@subsubheading LilyPond 2.13.53 released! @emph{Mar 6, 2011} +@subheading LilyPond 2.13.53 released! @emph{Mar 6, 2011} We are happy to announce the release of LilyPond 2.13.53. This release contains the usual number of bugfixes. @@ -1544,7 +2111,7 @@ due to a few remaining Critical bugs. @newsEnd @newsItem -@subsubheading LilyPond 2.13.52 released! @emph{Mar 1, 2011} +@subheading LilyPond 2.13.52 released! @emph{Mar 1, 2011} We are happy to announce the release of LilyPond 2.13.52. This release contains the usual number of bugfixes. @@ -1555,7 +2122,7 @@ due to a few remaining Critical bugs. @newsEnd @newsItem -@subsubheading LilyPond 2.13.51 released! @emph{Feb 22, 2011} +@subheading LilyPond 2.13.51 released! @emph{Feb 22, 2011} We are happy to announce the release of LilyPond 2.13.51. This release contains the usual number of bugfixes. @@ -1567,7 +2134,7 @@ due to a few remaining Critical bugs. @newsItem -@subsubheading LilyPond 2.13.50 released! @emph{Feb 13, 2011} +@subheading LilyPond 2.13.50 released! @emph{Feb 13, 2011} We are happy to announce the release of LilyPond 2.13.50. This release contains the usual number of bugfixes. @@ -1580,7 +2147,7 @@ cannot be at all confident about the quality of this release. @newsItem -@subsubheading New Chinese and Czech translations of the web page! @emph{Feb 11,2011} +@subheading New Chinese and Czech translations of the web page! @emph{Feb 11,2011} Two new languages are added to our web page: Chinese by Ben Luo, and Czech by Pavel Fric. It is a work in progress but they are fully @@ -1591,7 +2158,7 @@ functional. That makes ten languages to choose from! @newsItem -@subsubheading Release candidate 2 of 2.14 - LilyPond 2.13.49 released! @emph{Feb 9, 2011} +@subheading Release candidate 2 of 2.14 - LilyPond 2.13.49 released! @emph{Feb 9, 2011} LilyPond 2.13.49 is out; this is the second release candidate of the upcoming 2.14 stable release. All users are invited to @@ -1608,7 +2175,7 @@ on Feb 23, 2011. If you discover any problems, please send us @newsItem -@subsubheading LilyPond 2.13.48 released! @emph{Feb 5, 2011} +@subheading LilyPond 2.13.48 released! @emph{Feb 5, 2011} We are happy to announce the release of LilyPond 2.13.48. This release contains the usual number of bugfixes. However, a number @@ -1620,7 +2187,7 @@ developers only. @newsItem -@subsubheading LilyPond 2.13.47 released! @emph{Jan 28, 2011} +@subheading LilyPond 2.13.47 released! @emph{Jan 28, 2011} We are happy to announce the release of LilyPond 2.13.47. This release contains the usual number of bugfixes. However, a number @@ -1632,7 +2199,7 @@ developers only. @newsItem -@subsubheading Release candidate 1 withdrawn @emph{Jan 13, 2011} +@subheading Release candidate 1 withdrawn @emph{Jan 13, 2011} We have discovered a regression since 2.12.3, so lilypond 2.13.46 is no longer a candidate for the 2.14.0 release. However, please @@ -1644,7 +2211,7 @@ problems, please send us @ref{Bug reports}. @newsItem -@subsubheading Release candidate 1 of 2.14 - LilyPond 2.13.46 released! @emph{Jan 12, 2011} +@subheading Release candidate 1 of 2.14 - LilyPond 2.13.46 released! @emph{Jan 12, 2011} LilyPond 2.13.46 is out; this is the first release candidate of the upcoming 2.14 stable release. All users are invited to @@ -1661,7 +2228,7 @@ on 26 Jan 2011. If you discover any problems, please send us @newsItem -@subsubheading LilyPond 2.13.45 released! @emph{Jan 3, 2011} +@subheading LilyPond 2.13.45 released! @emph{Jan 3, 2011} We are happy to announce the release of LilyPond 2.13.45. This release contains the usual number of bugfixes. However, a number @@ -1674,7 +2241,7 @@ developers only. @newsItem -@subsubheading Beta test three of 2.14 -- LilyPond 2.13.44 released! @emph{Dec 25, 2010} +@subheading Beta test three of 2.14 -- LilyPond 2.13.44 released! @emph{Dec 25, 2010} LilyPond 2.13.44 is out; this is the third beta test of the upcoming 2.14 stable release. Users are invited to experiment @@ -1691,7 +2258,7 @@ just send us polite @ref{Bug reports}. @newsItem -@subsubheading Beta test two of 2.14 -- LilyPond 2.13.43 released! @emph{Dec 14, 2010} +@subheading Beta test two of 2.14 -- LilyPond 2.13.43 released! @emph{Dec 14, 2010} LilyPond 2.13.43 is out; this is the second beta test of the upcoming 2.14 stable release. Users are invited to experiment @@ -1708,7 +2275,7 @@ just send us polite @ref{Bug reports}. @newsItem -@subsubheading LilyPond 2.13.42 released! @emph{Dec 8, 2010} +@subheading LilyPond 2.13.42 released! @emph{Dec 8, 2010} We are happy to announce the release of LilyPond 2.13.42. This release contains the usual number of bugfixes. However, a number @@ -1723,7 +2290,7 @@ at all confident about the quality of this release. @newsItem -@subsubheading LilyPond 2.13.41 released! @emph{Dec 4, 2010} +@subheading LilyPond 2.13.41 released! @emph{Dec 4, 2010} We are happy to announce the release of LilyPond 2.13.41. This release contains the usual number of bugfixes. However, a number @@ -1738,7 +2305,7 @@ at all confident about the quality of this release. @newsItem -@subsubheading LilyPond 2.13.40 released! @emph{Nov 21, 2010} +@subheading LilyPond 2.13.40 released! @emph{Nov 21, 2010} We are happy to announce the release of LilyPond 2.13.40. This release contains the usual number of bugfixes. However, a number @@ -1753,7 +2320,7 @@ at all confident about the quality of this release. @newsItem -@subsubheading Beta test one of 2.14 -- LilyPond 2.13.39 released! @emph{Nov 15, 2010} +@subheading Beta test one of 2.14 -- LilyPond 2.13.39 released! @emph{Nov 15, 2010} LilyPond 2.13.39 is out; this is the first beta test of the upcoming 2.14 stable release. Users are invited to experiment @@ -1773,7 +2340,7 @@ be surprised to discover problems; just send us polite @newsItem -@subsubheading The LilyPond Report #22. @emph{Nov 3, 2010} +@subheading The LilyPond Report #22. @emph{Nov 3, 2010} The @emph{LilyPond Report} is back, with some surprises and exciting news for the whole LilyPond community! To be found in this issue is @@ -1784,7 +2351,7 @@ today is LilyPond’s co-founder and core developer read on to find out what for! Come -@uref{http://news.lilynet.net/The-LilyPond-Report-22, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-22, read LilyPond Report 22} now; comments and contributions are warmly encouraged! @@ -1792,7 +2359,7 @@ warmly encouraged! @newsItem -@subsubheading Alpha test four of 2.14 -- LilyPond 2.13.38 released! @emph{Oct 31, 2010} +@subheading Alpha test four of 2.14 -- LilyPond 2.13.38 released! @emph{Oct 31, 2010} LilyPond 2.13.38 is out; this is the fourth alpha test of the upcoming 2.14 stable release. Users are invited to experiment @@ -1810,7 +2377,7 @@ be surprised to discover problems; just send us polite @newsItem -@subsubheading Alpha test three of 2.14 -- LilyPond 2.13.37 released! @emph{Oct 25, 2010} +@subheading Alpha test three of 2.14 -- LilyPond 2.13.37 released! @emph{Oct 25, 2010} LilyPond 2.13.37 is out; this is the third alpha test of the upcoming 2.14 stable release. Users are invited to experiment @@ -1828,7 +2395,7 @@ be surprised to discover problems; just send us polite @newsItem -@subsubheading LilyPond 2.13.36 released! @emph{Oct 19, 2010} +@subheading LilyPond 2.13.36 released! @emph{Oct 19, 2010} We are happy to announce the release of LilyPond 2.13.36. This release contains the usual number of bugfixes. However, a number @@ -1842,7 +2409,7 @@ at all confident about the quality of this release. @newsEnd @newsItem -@subsubheading The LilyPond Report #21. @emph{Oct 3, 2010} +@subheading The LilyPond Report #21. @emph{Oct 3, 2010} The @emph{LilyPond Report} is back, with its two @qq{grumpy-and-fluffy} editors! This issue mainly deals with @@ -1852,7 +2419,7 @@ release news, the bug report of the Report, and some news from the frog pond! Come -@uref{http://news.lilynet.net/The-LilyPond-Report-21, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-21, read LilyPond Report 21} now; comments and contributions are warmly encouraged! @@ -1860,7 +2427,7 @@ warmly encouraged! @newsItem -@subsubheading Alpha test two of 2.14 -- LilyPond 2.13.35 released! @emph{Sep 29, 2010} +@subheading Alpha test two of 2.14 -- LilyPond 2.13.35 released! @emph{Sep 29, 2010} LilyPond 2.13.35 is out; this is the second alpha test of the upcoming 2.14 stable release. Users are invited to experiment @@ -1883,7 +2450,7 @@ to discover problems; just send us polite @ref{Bug reports}. @newsItem -@subsubheading Alpha test of 2.14 -- LilyPond 2.13.34 released! @emph{Sep 21, 2010} +@subheading Alpha test of 2.14 -- LilyPond 2.13.34 released! @emph{Sep 21, 2010} LilyPond 2.13.34 is out; this is the first alpha test of the upcoming 2.14 stable release. Users are invited to experiment @@ -1902,7 +2469,7 @@ discover problems; just send us polite @ref{Bug reports}. @newsItem -@subsubheading LilyPond 2.13.33 released! @emph{Sep 10, 2010} +@subheading LilyPond 2.13.33 released! @emph{Sep 10, 2010} We are happy to announce the release of LilyPond 2.13.33. This release contains the usual number of bugfixes. However, a number @@ -1915,7 +2482,7 @@ developers only. @newsItem -@subsubheading LilyPond 2.13.32 released! @emph{Sep 3, 2010} +@subheading LilyPond 2.13.32 released! @emph{Sep 3, 2010} We are happy to announce the release of LilyPond 2.13.32. This release contains the usual number of bugfixes. However, a number @@ -1926,7 +2493,7 @@ developers only. @newsItem -@subsubheading LilyPond Report #20. @emph{Sep 2, 2010} +@subheading LilyPond Report #20. @emph{Sep 2, 2010} The @emph{LilyPond Report} is back, with its two @qq{grumpy-and-fluffy} editors! This issue contains a review of an @@ -1935,14 +2502,14 @@ release news, snippet of the report, news from the frog pond, and the bug report of the report! Come -@uref{http://news.lilynet.net/The-LilyPond-Report-20, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-20, read LilyPond Report 20} now; comments and contributions are warmly encouraged! @newsEnd @newsItem -@subsubheading LilyPond 2.13.31 released! @emph{Aug 24, 2010} +@subheading LilyPond 2.13.31 released! @emph{Aug 24, 2010} We are happy to announce the release of LilyPond 2.13.31. This release contains the usual number of bugfixes. However, a number @@ -1953,7 +2520,7 @@ developers only. @newsItem -@subsubheading LilyPond 2.13.30 released! @emph{Aug 13, 2010} +@subheading LilyPond 2.13.30 released! @emph{Aug 13, 2010} We are happy to announce the release of LilyPond 2.13.30. This release contains the usual number of bugfixes. However, a number @@ -1964,7 +2531,7 @@ developers only. @newsItem -@subsubheading LilyPond Report #19. @emph{Aug 9, 2010} +@subheading LilyPond Report #19. @emph{Aug 9, 2010} The @emph{LilyPond Report} is back, with its two @qq{grumpy-and-fluffy} editors! This issue contains some @@ -1973,7 +2540,7 @@ the report, news from the frog pond, and the bug report of the report! Come -@uref{http://news.lilynet.net/The-LilyPond-Report-19, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-19, read LilyPond Report 19} now; comments and contributions are warmly encouraged! @newsEnd @@ -1982,7 +2549,7 @@ warmly encouraged! @newsItem -@subsubheading LilyPond 2.13.29 released! @emph{Aug 4, 2010} +@subheading LilyPond 2.13.29 released! @emph{Aug 4, 2010} We are happy to announce the release of LilyPond 2.13.29. This release contains the usual number of bugfixes. However, a number @@ -1995,7 +2562,7 @@ caution and expect breakage. @newsItem -@subsubheading LilyPond 2.13.28 released! @emph{July 13, 2010} +@subheading LilyPond 2.13.28 released! @emph{July 13, 2010} We are happy to announce the release of LilyPond 2.13.28. This release contains the usual number of bugfixes. However, a number @@ -2010,7 +2577,7 @@ warnings and try it anyway, use extra caution. @newsItem -@subsubheading LilyPond 2.13.27 released! @emph{July 5, 2010} +@subheading LilyPond 2.13.27 released! @emph{July 5, 2010} We are happy to announce the release of LilyPond 2.13.27. This release contains the usual number of bugfixes. However, a number @@ -2020,7 +2587,7 @@ developers only. @newsItem -@subsubheading Testing our new website! @emph{June 29, 2010} +@subheading Testing our new website! @emph{June 29, 2010} We're testing our new website! For the next 24 hours, the new website will be the default website; after that, we will switch @@ -2039,7 +2606,7 @@ website at: @newsItem -@subsubheading LilyPond 2.13.26 released! @emph{June 26, 2010} +@subheading LilyPond 2.13.26 released! @emph{June 26, 2010} We are happy to announce the release of LilyPond 2.13.26. This release contains the usual number of bugfixes. However, a number @@ -2048,7 +2615,7 @@ developers only. @newsEnd @newsItem -@subsubheading LilyPond 2.13.25 released! @emph{June 20, 2010} +@subheading LilyPond 2.13.25 released! @emph{June 20, 2010} We are happy to announce the release of LilyPond 2.13.25. This release contains the usual number of bugfixes. However, a number @@ -2058,7 +2625,7 @@ developers only. @newsItem -@subsubheading LilyPond 2.13.24 released! @emph{June 14, 2010} +@subheading LilyPond 2.13.24 released! @emph{June 14, 2010} We are happy to announce the release of LilyPond 2.13.24. This release contains the usual number of bugfixes. However, a number @@ -2068,7 +2635,7 @@ developers only. @newsItem -@subsubheading LilyPond 2.13.23 released! @emph{June 3, 2010} +@subheading LilyPond 2.13.23 released! @emph{June 3, 2010} We are happy to announce the release of LilyPond 2.13.23. This release contains the usual number of bugfixes. However, a number @@ -2077,7 +2644,7 @@ developers only. @newsEnd @newsItem -@subsubheading LilyPond 2.13.22 released! @emph{May 27, 2010} +@subheading LilyPond 2.13.22 released! @emph{May 27, 2010} We are happy to announce the release of LilyPond 2.13.22. This release contains the usual number of bugfixes. However, a number @@ -2086,7 +2653,7 @@ developers only. @newsEnd @newsItem -@subsubheading LilyPond 2.13.21 released! @emph{May 12, 2010} +@subheading LilyPond 2.13.21 released! @emph{May 12, 2010} We are happy to announce the release of LilyPond 2.13.21. This release contains the usual number of bugfixes. However, a number @@ -2102,7 +2669,7 @@ stable release. @newsItem -@subsubheading LilyPond Report #18. @emph{May 11, 2010} +@subheading LilyPond Report #18. @emph{May 11, 2010} The @emph{LilyPond Report} is back, with its two @qq{grumpy-and-fluffy} editors! This issue will be filled @@ -2110,7 +2677,7 @@ with emotion and coolness, paper bags and zigzag-ending staves, plus the usual Frogs and Bugs. Come -@uref{http://news.lilynet.net/The-LilyPond-Report-18, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-18, read LilyPond Report 18} now; comments and contributions are warmly encouraged! @newsEnd @@ -2118,7 +2685,7 @@ warmly encouraged! @newsItem -@subsubheading LilyPond 2.13.20 released! @emph{May 5, 2010} +@subheading LilyPond 2.13.20 released! @emph{May 5, 2010} We are happy to announce the release of LilyPond 2.13.20. This release contains the usual number of bugfixes. However, a number @@ -2133,7 +2700,7 @@ see the Changes document for more information. @newsEnd @newsItem -@subsubheading LilyPond 2.13.19 released! @emph{April 24, 2010} +@subheading LilyPond 2.13.19 released! @emph{April 24, 2010} We are happy to announce the release of LilyPond 2.13.19. This release contains the usual number of bugfixes. However, 11 @@ -2142,7 +2709,7 @@ developers only. @newsEnd @newsItem -@subsubheading LilyPond 2.13.18 released! @emph{April 16, 2010} +@subheading LilyPond 2.13.18 released! @emph{April 16, 2010} We are happy to announce the release of LilyPond 2.13.18. This release contains the usual number of bugfixes, along with improved @@ -2151,7 +2718,7 @@ so this release is intended for developers only. @newsEnd @newsItem -@subsubheading LilyPond 2.13.17 released! @emph{April 2, 2010} +@subheading LilyPond 2.13.17 released! @emph{April 2, 2010} We are happy to announce the release of LilyPond 2.13.17. This release includes bugfixes for 4 critical issues. However, 15 @@ -2160,7 +2727,7 @@ developers only. @newsEnd @newsItem -@subsubheading LilyPond 2.13.16 released! @emph{March 15, 2010} +@subheading LilyPond 2.13.16 released! @emph{March 15, 2010} We are happy to announce the release of LilyPond 2.13.16. This release is intended for developers only, and includes the usual @@ -2168,7 +2735,7 @@ round of bugfixes. @newsEnd @newsItem -@subsubheading LilyPond 2.13.15 released! @emph{March 4, 2010} +@subheading LilyPond 2.13.15 released! @emph{March 4, 2010} We are happy to announce the release of LilyPond 2.13.15. This release is intended for developers only, and includes a few @@ -2178,7 +2745,7 @@ of bugfixes. @newsItem -@subsubheading LilyPond Report #17. @emph{March 1, 2010} +@subheading LilyPond Report #17. @emph{March 1, 2010} Yay, the Report is back, with a new team! It has been said that two heads are better than one — does it apply to newsletters as @@ -2187,13 +2754,13 @@ websites and poetry, frogs and bugs, not to mention an extensive review of the Frescobaldi editor! What are you waiting for? Come -@uref{http://news.lilynet.net/The-LilyPond-Report-17, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-17, read LilyPond Report 17} now! @newsEnd @newsItem -@subsubheading LilyPond 2.13.14 released! @emph{February 27, 2010} +@subheading LilyPond 2.13.14 released! @emph{February 27, 2010} We are happy to announce the release of LilyPond 2.13.14. This release is intended for developers only, and includes a large @@ -2201,7 +2768,7 @@ translation update in addition to the usual round of bugfixes. @newsEnd @newsItem -@subsubheading LilyPond 2.13.13 released! @emph{February 13, 2010} +@subheading LilyPond 2.13.13 released! @emph{February 13, 2010} We are happy to announce the release of LilyPond 2.13.13. This release is intended for developers only, and fixes various @@ -2212,7 +2779,7 @@ binaries are now approximately 6 megabytes smaller. @newsItem -@subsubheading LilyPond 2.13.12 released! @emph{February 2, 2010} +@subheading LilyPond 2.13.12 released! @emph{February 2, 2010} We are happy to announce the release of LilyPond 2.13.12. This release is intended for developers only, and brings more stability @@ -2220,7 +2787,7 @@ and fewer bugs to the build system and Contributor's Guide. @newsEnd @newsItem -@subsubheading LilyPond 2.13.11 released! @emph{January 16, 2010} +@subheading LilyPond 2.13.11 released! @emph{January 16, 2010} We are happy to announce the release of LilyPond 2.13.11. This release is intended for developers only, and brings a number of @@ -2229,7 +2796,7 @@ critical regressions against earlier versions. @newsEnd @newsItem -@subsubheading LilyPond 2.13.10 released! @emph{December 31, 2009} +@subheading LilyPond 2.13.10 released! @emph{December 31, 2009} We are happy to announce the release of LilyPond 2.13.10. This release is intended for developers only, and brings a number of @@ -2240,7 +2807,7 @@ and English names for feta filenames. @newsItem -@subsubheading LilyPond 2.12.3 released! @emph{December 20, 2009} +@subheading LilyPond 2.12.3 released! @emph{December 20, 2009} We are happy to announce the release of LilyPond 2.12.3. This version contains the long-awaited fix for our GUI on MacOS X 10.5 @@ -2256,7 +2823,7 @@ shifts towards the upcoming 2.14 series. @newsItem -@subsubheading LilyPond 2.13.9 released! @emph{December 12, 2009} +@subheading LilyPond 2.13.9 released! @emph{December 12, 2009} LilyPond 2.13.9 is now out. From 2.13.9 onwards, LilyPond is licensed under the GNU GPL v3+ for code, and the GNU FDL 1.3+ for @@ -2269,7 +2836,7 @@ normal users should continue to use 2.12. @newsEnd @newsItem -@subsubheading New Website! @emph{October 3, 2009} +@subheading New Website! @emph{October 3, 2009} As you can see, we have a new website design. Many thanks to texi2html and CSS for being so flexible! @@ -2278,18 +2845,18 @@ texi2html and CSS for being so flexible! @newsItem -@subsubheading LilyPond Report #16. @emph{September 6, 2009} +@subheading LilyPond Report #16. @emph{September 6, 2009} The LilyPond Report is back! This short, informal opinion column is about the LilyPond project: its team, its world, its community. -Read @uref{http://news.lilynet.net/The-LilyPond-Report-16, issue 16} +Read @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-16, issue 16} now! @newsEnd @newsItem -@subsubheading LilyPond 2.13.3. @emph{July 2, 2009} +@subheading LilyPond 2.13.3. @emph{July 2, 2009} This unstable release contains working menus in OSX 10.5; many thanks to Christian Hitz for fixing this long-standing problem! @@ -2306,7 +2873,7 @@ release.@* @newsItem -@subsubheading A LilyPond weboldala magyarul. @emph{May 22, 2009} +@subheading A LilyPond weboldala magyarul. @emph{May 22, 2009} Elkészült a lilypond.org nagy részének magyar fordítása a LilyPond honosítási projekt első lépéseként. A projekt célja a LilyPond @@ -2321,26 +2888,26 @@ vezetője @newsItem -@subsubheading The LilyPond Report #15. @emph{May 18, 2009} +@subheading The LilyPond Report #15. @emph{May 18, 2009} The @emph{LilyPond Report} is a short, informal opinion column about the LilyPond project: its team, its world, its community. -Follow @uref{http://news.lilynet.net/The-LilyPond-Report-15,this link} +Follow @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-15,this link} to read the full issue... @newsEnd @newsItem -@subsubheading The LilyPond Report #14. @emph{April 13, 2009} +@subheading The LilyPond Report #14. @emph{April 13, 2009} The @emph{LilyPond Report} is back, on a new website! This short, informal, weekly opinion column is about the LilyPond project: its team, its world, its community. -Follow @uref{http://news.lilynet.net/The-LilyPond-Report-14,this link} to read the full issue... +Follow @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-14,this link} to read the full issue... @newsEnd @newsItem -@subsubheading LilyPond 2.12.2 and 2.13.0 — @emph{March 21, 2009} +@subheading LilyPond 2.12.2 and 2.13.0 — @emph{March 21, 2009} As a very belated announcement, the stable version of LilyPond is now 2.12.2, and the next development version has begun with @@ -2349,7 +2916,7 @@ now 2.12.2, and the next development version has begun with @newsItem -@subsubheading LilyPond 2.12.0 @qq{Rune} — @emph{December 27, 2008} +@subheading LilyPond 2.12.0 @qq{Rune} — @emph{December 27, 2008} A new stable release of LilyPond is available. @* @@ -2360,7 +2927,7 @@ A new stable release of LilyPond is available. @newsItem -@subsubheading LilyPond 2.11.65 — Release Candidate. @emph{December 2, 2008} +@subheading LilyPond 2.11.65 — Release Candidate. @emph{December 2, 2008} This release has improvements to MusicXML import, contributed by Reinhold Kainhofer, and adds support for splitting a book in several @@ -2378,7 +2945,7 @@ issues.@* @newsItem -@subsubheading LilyPond 2.11.64. @emph{November 18, 2008} +@subheading LilyPond 2.11.64. @emph{November 18, 2008} LilyPond 2.11.64 is available. MusicXML import has been improved, including church modes support, and a few bugs in the compilation @@ -2393,7 +2960,7 @@ which used to cause excessive slowness should be fixed. @newsItem -@subsubheading LilyPond 2.11.63. @emph{October 29, 2008} +@subheading LilyPond 2.11.63. @emph{October 29, 2008} LilyPond 2.11.63 is available. This release has lots of updates to the documentation and translations. @@ -2402,7 +2969,7 @@ documentation and translations. @newsItem -@subsubheading LilyPond 2.11.62 -- Release Candidate. @emph{October 11, 2008} +@subheading LilyPond 2.11.62 -- Release Candidate. @emph{October 11, 2008} LilyPond 2.11.62 is available. This is is one of the last releases before 2.12, so testing it is encouraged. In addition to a bugfix @@ -2416,7 +2983,7 @@ stylesheet for HTML documentation has been improved. @newsItem -@subsubheading LilyPond 2.11.61 available. @emph{October 1, 2008} +@subheading LilyPond 2.11.61 available. @emph{October 1, 2008} LilyPond 2.11.61 has been released. It has updates to documentation translations, and a new automatic accidentals style @@ -2429,7 +2996,7 @@ documentation translations, and a new automatic accidentals style @newsItem -@subsubheading LilyPond 2.11.60 available. @emph{September 25, 2008} +@subheading LilyPond 2.11.60 available. @emph{September 25, 2008} LilyPond 2.11.60 has been released. A new style of double repeat bar line has been added, and @code{printallheaders} variable in @@ -2439,7 +3006,7 @@ score block has been renamed to @code{print-all-headers}. @newsItem -@subsubheading LilyPond 2.11.59 available. @emph{September 20, 2008} +@subheading LilyPond 2.11.59 available. @emph{September 20, 2008} Release 2.11.59 is out. LilyPond now uses 64 bit integers for rational numbers, which allows typesetting more complex polymetric @@ -2450,7 +3017,7 @@ translations of the documentation. @newsItem -@subsubheading LilyPond 2.11.58 available. @emph{September 13, 2008} +@subheading LilyPond 2.11.58 available. @emph{September 13, 2008} LilyPond 2.11.58 is a beta release, which means the next stable release is expected in a few weeks. This release is also special, @@ -2469,7 +3036,7 @@ Reinhold Kainhofer, and a few bugs have been fixed. @newsItem -@subsubheading LilyPond 2.11.57 available. @emph{August 27, 2008} +@subheading LilyPond 2.11.57 available. @emph{August 27, 2008} LilyPond 2.11.57 is out. This release adds support for harp pedal diagrams, contributed by Reinhold Kainhofer, and some changes in @@ -2481,7 +3048,7 @@ markup command names have been made. @newsItem -@subsubheading LilyPond 2.11.56 available. @emph{August 17, 2008} +@subheading LilyPond 2.11.56 available. @emph{August 17, 2008} LilyPond 2.11.56 is out. This release features transposable fret diagrams, contributed by Carl Sorensen. Translations status pages @@ -2495,7 +3062,7 @@ predefined commands @code{\pointAndClickOn}, @newsItem -@subsubheading LilyPond 2.11.55 available. @emph{August 6, 2008} +@subheading LilyPond 2.11.55 available. @emph{August 6, 2008} LilyPond 2.11.55 is out. This release fixes several bugs, and for octavation brackets @code{set-octavation} has been replaced by a more user-friendly command, @code{\ottava}. @@ -2506,7 +3073,7 @@ LilyPond 2.11.55 is out. This release fixes several bugs, and for octavation br @newsItem -@subsubheading LilyPond 2.11.54 available. @emph{July 30, 2008} +@subheading LilyPond 2.11.54 available. @emph{July 30, 2008} LilyPond 2.11.54 is out. This release fixes a bug in tie formatting following a line break, and changes the behavior of @code{short-indent} @@ -2518,7 +3085,7 @@ so that short instrument names are no longer indented in the margin. @newsItem -@subsubheading LilyPond 2.11.53 available. @emph{July 23, 2008} +@subheading LilyPond 2.11.53 available. @emph{July 23, 2008} LilyPond 2.11.53 is out. This release fixes a lot of bugs. @* @@ -2528,7 +3095,7 @@ LilyPond 2.11.53 is out. This release fixes a lot of bugs. @newsItem -@subsubheading LilyPond 2.11.52 available. @emph{July 14, 2008} +@subheading LilyPond 2.11.52 available. @emph{July 14, 2008} Release 2.11.52 fixes wrong offset of a bar number when it follows a breath mark, and syntax changes made in recent development @@ -2541,7 +3108,7 @@ releases are now fully listed on the News page. @newsItem -@subsubheading LilyPond 2.11.51 available. @emph{July 8, 2008} +@subheading LilyPond 2.11.51 available. @emph{July 8, 2008} Release 2.11.51 has a couple of bugfixes, and a lot of changes in predefined command names. Fret diagrams formatting has been @@ -2554,7 +3121,7 @@ by @code{fret-diagram-details} property. @newsItem -@subsubheading LilyPond 2.11.50 available. @emph{July 2, 2008} +@subheading LilyPond 2.11.50 available. @emph{July 2, 2008} Release 2.11.50 adds support for metronome marks with text, and backslashed numbers for figured bass, contributed by @@ -2566,23 +3133,23 @@ Reinhold Kainhofer. @newsItem -@subsubheading The LilyPond Report #13. @emph{June 23, 2008} +@subheading The LilyPond Report #13. @emph{June 23, 2008} This short, informal, weekly opinion column is about the LilyPond project: its team, its world, its community. -Follow @uref{http://valentin.villenave.info/The-LilyPond-Report-13,this link} to read the full issue... +Follow @uref{http://web.archive.org/web/20120220123759/http://news.lilynet.net/?The-LilyPond-Report-13,this link} to read the full issue... @newsEnd @newsItem -@subsubheading The LilyPond Report #12. @emph{June 16, 2008} +@subheading The LilyPond Report #12. @emph{June 16, 2008} This short, informal, weekly opinion column is about the LilyPond project: its team, its world, its community. -Follow @uref{http://valentin.villenave.info/The-LilyPond-Report-12,this link} to read the full issue... +Follow @uref{http://web.archive.org/web/20120220123754/http://news.lilynet.net/?The-LilyPond-Report-12,this link} to read the full issue... @newsEnd @newsItem -@subsubheading LilyPond 2.11.49 released. @emph{June 12, 2008} +@subheading LilyPond 2.11.49 released. @emph{June 12, 2008} LilyPond 2.11.49 is out. It fixes a number of bugs, including bugs in beams formatting. @* @@ -2592,7 +3159,7 @@ LilyPond 2.11.49 is out. It fixes a number of bugs, including bugs in beams for @newsItem -@subsubheading LilyPond 2.11.48 released. @emph{June 9, 2008} +@subheading LilyPond 2.11.48 released. @emph{June 9, 2008} LilyPond 2.11.48 is out. This release fixes a few bugs, and @code{\compressMusic} has been renamed @@ -2604,23 +3171,23 @@ to @code{\scaleDurations}. @newsItem -@subsubheading The LilyPond Report #11. @emph{June 9, 2008} +@subheading The LilyPond Report #11. @emph{June 9, 2008} This short, informal, weekly opinion column is about the LilyPond project: its team, its world, its community. -Follow @uref{http://valentin.villenave.info/The-LilyPond-Report-11,this link} to read the full issue... +Follow @uref{http://web.archive.org/web/20120220123750/http://news.lilynet.net/?The-LilyPond-Report-11,this link} to read the full issue... @newsEnd @newsItem -@subsubheading The LilyPond Report #10. @emph{June 2, 2008} +@subheading The LilyPond Report #10. @emph{June 2, 2008} Welcome to this special tenth issue of the @emph{LilyPond Report}, entirely dedicated to Algorithmic Composition systems.@* -Follow @uref{http://valentin.villenave.info/The-LilyPond-Report-10,this link} to read the full issue... +Follow @uref{http://web.archive.org/web/20120220123743/http://news.lilynet.net/?The-LilyPond-Report-10,this link} to read the full issue... @newsEnd @newsItem -@subsubheading LilyPond 2.11.47 released. @emph{May 28, 2008} +@subheading LilyPond 2.11.47 released. @emph{May 28, 2008} LilyPond now allows all text context properties to be markups, except in @code{\lyricmode}. This release also fixes @@ -2632,7 +3199,7 @@ regression tests maintenance for developers. @newsItem -@subsubheading LilyPond 2.11.46 available. @emph{May 22, 2008} +@subheading LilyPond 2.11.46 available. @emph{May 22, 2008} Release 2.11.46 fixes a lot of bugs and includes a rewrite of dynamics engravers. Support for slur-shaped arpeggios has been added. @@ -2644,7 +3211,7 @@ dynamics engravers. Support for slur-shaped arpeggios has been added. @newsItem -@subsubheading RSS feed - @emph{May 21, 2008} +@subheading RSS feed - @emph{May 21, 2008} A RSS feed is now available on lilypond.org. It contains all news announced on the web site start page: releases, LilyPond @@ -2656,16 +3223,16 @@ announce releases and special events. @newsItem -@subsubheading The LilyPond Report #9. @emph{May 05, 2008} +@subheading The LilyPond Report #9. @emph{May 05, 2008} Welcome to this ninth issue of the @emph{LilyPond Report}!@* This short, informal, weekly opinion column is about the LilyPond project: its team, its world, its community. -Follow @uref{http://valentin.villenave.info/The-LilyPond-Report-9,this link} to read the full issue... +Follow @uref{http://web.archive.org/web/20120220123946/http://news.lilynet.net/?The-LilyPond-Report-9,this link} to read the full issue... @newsEnd @newsItem -@subsubheading LilyPond 2.11.45 available. @emph{April 26, 2008} +@subheading LilyPond 2.11.45 available. @emph{April 26, 2008} Release 2.11.45 fixes a couple of bugs in the formatting engine. @code{lilypond-book} has been improved, with better @@ -2681,7 +3248,7 @@ Villenave. @newsItem -@subsubheading LilyPond 2.11.44 available. @emph{April 14, 2008} +@subheading LilyPond 2.11.44 available. @emph{April 14, 2008} Release 2.11.44 is available. Support for figured bass and chord names has been added to the MusicXML @@ -2693,14 +3260,14 @@ converter. @newsItem -@subsubheading lilypond.org日本語訳 (lilypond.org Japanese translation). @emph{2008å¹´4月8日 (April 4, 2008)} +@subheading lilypond.org日本語訳 (lilypond.org Japanese translation). @emph{2008å¹´4月8日 (April 4, 2008)} lilypond.orgのいくつかのページの日本語訳が出来ました。 @newsEnd @newsItem -@subsubheading LilyPond 2.11.43 available. @emph{March 31, 2008} +@subheading LilyPond 2.11.43 available. @emph{March 31, 2008} Release 2.11.43 has been available since March 27. It fixes a couple of formatting bugs, and the font cache problem with @@ -2713,7 +3280,7 @@ fixed. @newsItem -@subsubheading LilyPond 2.11.42 available. @emph{March 9, 2008} +@subheading LilyPond 2.11.42 available. @emph{March 9, 2008} Release 2.11.42 is out. It fixes some formatting and spacing bugs. @@ -2724,7 +3291,7 @@ bugs. @newsItem -@subsubheading Comparison of music engraving with Finale and LilyPond. @emph{February 25, 2008} +@subheading Comparison of music engraving with Finale and LilyPond. @emph{February 25, 2008} In three articles, Andrew Hawryluk compares Finale and LilyPond in general terms, and evaluates in detail engraving capabilities of @@ -2737,7 +3304,7 @@ the articles}. @newsItem -@subsubheading LilyPond 2.11.41 available. @emph{February 25, 2008} +@subheading LilyPond 2.11.41 available. @emph{February 25, 2008} Release 2.11.41 is available. It has a few bugfixes, updated program messages in French, German, Spanish and Vietnamese, and @@ -2749,7 +3316,7 @@ updates to the MusicXML converter. @newsItem -@subsubheading LilyPond 2.11.37 available. @emph{January 3, 2008} +@subheading LilyPond 2.11.37 available. @emph{January 3, 2008} Release 2.11.37 is available. It has a few bugfixes, and documentation changes. (@ref{Old downloads}) @@ -2757,7 +3324,7 @@ documentation changes. (@ref{Old downloads}) @newsItem -@subsubheading LilyPond 2.11.36 available. @emph{December 13, 2007} +@subheading LilyPond 2.11.36 available. @emph{December 13, 2007} Release 2.11.36 is now available. It has many bugfixes, updates for MusicXML import, and it includes major documentation changes from @@ -2769,7 +3336,7 @@ Grand Documentation Project. @newsItem -@subsubheading LilyPond 2.10.33 and 2.11.33 available. @emph{September 20, 2007} +@subheading LilyPond 2.10.33 and 2.11.33 available. @emph{September 20, 2007} Release 2.11.33 is now available. @* @@ -2780,7 +3347,7 @@ Release 2.11.33 is now available. @newsItem -@subsubheading LilyPond 2.11.32 available. @emph{September 2, 2007} +@subheading LilyPond 2.11.32 available. @emph{September 2, 2007} Release 2.11.32 is now available. @* @@ -2790,7 +3357,7 @@ Release 2.11.32 is now available. @newsItem -@subsubheading LilyPond 2.11.31 available. @emph{August 31, 2007} +@subheading LilyPond 2.11.31 available. @emph{August 31, 2007} Release 2.11.31 is now available. It has more bugfixes, updates for MusicXML import and lots of updates for the translations. @@ -2801,7 +3368,7 @@ for MusicXML import and lots of updates for the translations. @newsItem -@subsubheading LilyPond 2.11.30 available. @emph{August 20, 2007} +@subheading LilyPond 2.11.30 available. @emph{August 20, 2007} Release 2.11.30 is now available. It has various bugfixes among others in the new spacing code, MusicXML import and lots of updates @@ -2813,7 +3380,7 @@ for the translations. @newsItem -@subsubheading LilyPond 2.10.29 and 2.11.29 available. @emph{August 11, 2007} +@subheading LilyPond 2.10.29 and 2.11.29 available. @emph{August 11, 2007} Release 2.11.29 is now available. 2.10.29 has a few small fixes. 2.11.29 has several bugfixes, among others in the new spacing code, @@ -2826,17 +3393,17 @@ and lots of updates for the translations. @newsItem -@subsubheading LilyPond 2.11.28 for FreeBSD x86_64. @emph{August 10, 2007} +@subheading LilyPond 2.11.28 for FreeBSD x86_64. @emph{August 10, 2007} Release 2.11.28 is now available as a binary installer for FreeBSD x86_64. Download -@uref{http://lilypond.org/download/binaries/freebsd-64/lilypond-2.11.28-1.freebsd-64.sh,the installer} and +@uref{http://lilypond.org/downloads/binaries/freebsd-64/,the installer} and do @emph{sh lilypond-2.11.28-1.freebsd-64.sh} in a command window. @newsEnd @newsItem -@subsubheading LilyPond 2.11.28 available - @emph{July 25, 2007} +@subheading LilyPond 2.11.28 available - @emph{July 25, 2007} Release 2.11.28 has several updates to the manual and its translations, an plethora of bugfixes and a complete cleanup of the spacing engine code. @@ -2847,7 +3414,7 @@ spacing engine code. @newsItem -@subsubheading LilyPond 2.11.26 available - @emph{June 8, 2007} +@subheading LilyPond 2.11.26 available - @emph{June 8, 2007} Release 2.11.26 supports page markers, eg. for use in tables-of-contents. In addition, it fixes a number of bugs. Enjoy! @@ -2858,7 +3425,7 @@ tables-of-contents. In addition, it fixes a number of bugs. Enjoy! @newsItem -@subsubheading LilyPond 2.10.25 and 2.11.25 available - @emph{May 20, 2007} +@subheading LilyPond 2.10.25 and 2.11.25 available - @emph{May 20, 2007} Release 2.11.25 has support for toplevel page breaking commands, and page breaking as a whole has been sped up significantly. Enjoy! @@ -2870,7 +3437,7 @@ and page breaking as a whole has been sped up significantly. Enjoy! @newsItem -@subsubheading LilyPond 2.10.23 and 2.11.23 available - @emph{May 1, 2007} +@subheading LilyPond 2.10.23 and 2.11.23 available - @emph{May 1, 2007} This has lots of bugfixes. @* @bugfixes{2_10_23,2.10}, @@ -2880,7 +3447,7 @@ This has lots of bugfixes. @newsItem -@subsubheading Übersetzung der Dokumentation - @emph{10. April 2007} +@subheading Übersetzung der Dokumentation - @emph{10. April 2007} Die Kapitel 1-5 (der Abschnitt für Anfänger) des LilyPond-Benutzerhandbuchs sind auf deutsch übersetzt --- sie sind erhältlich für die @ref{Changes} online und @ref{Old downloads}. @@ -2888,7 +3455,7 @@ online und @ref{Old downloads}. @newsItem -@subsubheading LilyPond 2.11.22 available - @emph{April 10, 2007} +@subheading LilyPond 2.11.22 available - @emph{April 10, 2007} This release has updates of the dot collision code. @* @bugfixes{2_11_22,}, @@ -2898,7 +3465,7 @@ This release has updates of the dot collision code. @newsItem -@subsubheading LilyPond 2.11.21 available - @emph{March 24, 2007} +@subheading LilyPond 2.11.21 available - @emph{March 24, 2007} This release has some documentation updates. @* @bugfixes{2_11_21,}, @@ -2908,7 +3475,7 @@ This release has some documentation updates. @newsItem -@subsubheading Traduction de la documentation en français - @emph{25 février 2007} +@subheading Traduction de la documentation en français - @emph{25 février 2007} Les chapitres 1 à 4 et 6 du manuel de l'utilisateur sont désormais traduits, et disponibles en ligne --- @uref{http://lilypond.org/doc/v2.10/Documentation/user/lilypond/index.fr.html,version 2.10}, @@ -2919,7 +3486,7 @@ Les traductions sont également incluses dans la @newsItem -@subsubheading LilyPond 2.10.20 and 2.11.20 available - @emph{February 25, 2007} +@subheading LilyPond 2.10.20 and 2.11.20 available - @emph{February 25, 2007} This release fixes many bugs. @* @bugfixes{2_10_20,2.10}, @@ -2930,7 +3497,7 @@ This release fixes many bugs. @newsItem -@subsubheading LilyPond 2.10.19 and 2.11.19 available - @emph{February 18, 2007} +@subheading LilyPond 2.10.19 and 2.11.19 available - @emph{February 18, 2007} This release fixes many bugs. @* @bugfixes{2_10_19,2.10}, @@ -2941,7 +3508,7 @@ This release fixes many bugs. @newsItem -@subsubheading LilyPond 2.11.18 available - @emph{February 12, 2007} +@subheading LilyPond 2.11.18 available - @emph{February 12, 2007} This release fixes still more bugs, and included singing support through festival contributed by Milan Zamazal. @* @@ -2952,7 +3519,7 @@ singing support through festival contributed by Milan Zamazal. @newsItem -@subsubheading LilyPond 2.11.17 available - @emph{February 9, 2007} +@subheading LilyPond 2.11.17 available - @emph{February 9, 2007} This release fixes still more bugs. @* @bugfixes{2_11_17,}, @@ -2962,7 +3529,7 @@ This release fixes still more bugs. @newsItem -@subsubheading LilyPond 2.10.16 and 2.11.16 available - @emph{February 4, 2007} +@subheading LilyPond 2.10.16 and 2.11.16 available - @emph{February 4, 2007} This release fixes many bugs. (@bugfixes{2_10_16,2.10}, @bugfixes{2_11_16,2.11}, @@ -2972,7 +3539,7 @@ This release fixes many bugs. @newsItem -@subsubheading LilyPond 2.10.15 and 2.11.15 available - @emph{February 1, 2007} +@subheading LilyPond 2.10.15 and 2.11.15 available - @emph{February 1, 2007} This release will stretch piano staves on a system-by-system basis and add a few glyphs: a black harmonic note head and the slashed mirrored flat. @@ -2985,7 +3552,7 @@ head and the slashed mirrored flat. @newsItem -@subsubheading LilyPond 2.10.14 and 2.11.14 available - @emph{January 26, 2007} +@subheading LilyPond 2.10.14 and 2.11.14 available - @emph{January 26, 2007} This release has a rewrite of the line-spanner code, responsible for among other glissandi and text-crescendos, making them more flexible. @* @@ -2996,7 +3563,7 @@ among other glissandi and text-crescendos, making them more flexible. @newsItem -@subsubheading LilyPond 2.10.13 and 2.11.13 available - @emph{January 17, 2007} +@subheading LilyPond 2.10.13 and 2.11.13 available - @emph{January 17, 2007} This release fixes a few minor but irritating bugs. In addition, the 2.11 release has updates of the tutorial. @* @@ -3007,7 +3574,7 @@ This release fixes a few minor but irritating bugs. In addition, the @newsItem -@subsubheading LilyPond 2.11.12 available - @emph{January 17, 2007} +@subheading LilyPond 2.11.12 available - @emph{January 17, 2007} This release fixes lots of bugs. In particular, the tie formatting has been further improved, and memory usage has been improved enormously. @* @@ -3018,7 +3585,7 @@ been further improved, and memory usage has been improved enormously. @newsItem -@subsubheading LilyPond 2.10.12 available - @emph{January 17, 2007} +@subheading LilyPond 2.10.12 available - @emph{January 17, 2007} This release mirrors 2.11.12. Notably, it has the same memory usage improvements. @* @@ -3029,7 +3596,7 @@ usage improvements. @newsItem -@subsubheading LilyPond 2.10.11 available - @emph{January 12, 2007} +@subheading LilyPond 2.10.11 available - @emph{January 12, 2007} This release mostly has the same fixes as 2.11.11. @* @bugfixes{2_10_11,}, @@ -3039,7 +3606,7 @@ This release mostly has the same fixes as 2.11.11. @newsItem -@subsubheading LilyPond 2.11.11 available - @emph{January 11, 2007} +@subheading LilyPond 2.11.11 available - @emph{January 11, 2007} This release has further fixes for popular bugs. Timing of the MIDI output won't get confused by tuplets and grace notes anymore. Some fat has also been trimmed of the skyline code performance. @@ -3051,7 +3618,7 @@ has also been trimmed of the skyline code performance. @newsItem -@subsubheading LilyPond 2.11.10 available - @emph{January 8, 2007} +@subheading LilyPond 2.11.10 available - @emph{January 8, 2007} LilyPond 2.11.10 has further review of the test-suite, performance and code coverage. This brought to light several problems that were fixed. Notably, 2.11.10 fixes lots of regressions in optical @@ -3065,7 +3632,7 @@ correction spacing and MIDI dynamics. Also, this version is 20 to 50 @newsItem -@subsubheading LilyPond 2.10.10 available - @emph{January 8, 2007} +@subheading LilyPond 2.10.10 available - @emph{January 8, 2007} This release fixes several popular bugs, among others: MIDI files that go silent after (de)crescendi, and tuplets problems with quoting and part-combining. @@ -3077,7 +3644,7 @@ and part-combining. @newsItem -@subsubheading LilyPond 2.11.9 and 2.10.9 available - @emph{January 3, 2007} +@subheading LilyPond 2.11.9 and 2.10.9 available - @emph{January 3, 2007} This release has a couple of bugfixes, and ---in 2.11.9--- further improvements in the regression test suite @* @@ -3088,7 +3655,7 @@ further improvements in the regression test suite @newsItem -@subsubheading LilyPond 2.11.8 and 2.10.8 available - @emph{January 3, 2007} +@subheading LilyPond 2.11.8 and 2.10.8 available - @emph{January 3, 2007} New! Improved! With even more bugfixes! @* @bugfixes{2_11_8,}, @@ -3098,19 +3665,19 @@ New! Improved! With even more bugfixes! @newsItem -@subsubheading @code{lilypond.org} auf deutsch - @emph{31. Dezember 2006} +@subheading @code{lilypond.org} auf deutsch - @emph{31. Dezember 2006} Die LilyPond-Webseiten sind jetzt auch auf deutsch übersetzt! @newsEnd @newsItem -@subsubheading @code{lilypond.org} en español - @emph{December 29, 2006} +@subheading @code{lilypond.org} en español - @emph{December 29, 2006} ¡Ya está disponible la versión en español del sitio web de LilyPond! @newsEnd @newsItem -@subsubheading LilyPond 2.11.7 and 2.10.7 available - @emph{January 1, 2007} +@subheading LilyPond 2.11.7 and 2.10.7 available - @emph{January 1, 2007} New! Improved! With even more bugfixes! @* @bugfixes{2_11_7,}, @@ -3120,7 +3687,7 @@ New! Improved! With even more bugfixes! @newsItem -@subsubheading LilyPond 2.11.6 available - @emph{December 30, 2006} +@subheading LilyPond 2.11.6 available - @emph{December 30, 2006} This release supports arbitrary fractional alterations, allowing music with different microtonal conventions to be typeset. @* @@ -3131,7 +3698,7 @@ music with different microtonal conventions to be typeset. @newsItem -@subsubheading LilyPond 2.10.6 available - @emph{December 30, 2006} +@subheading LilyPond 2.10.6 available - @emph{December 30, 2006} New! Improved! With even more bugfixes! @* @bugfixes{2_10_6,}, @@ -3141,7 +3708,7 @@ New! Improved! With even more bugfixes! @newsItem -@subsubheading LilyPond 2.11.5 available - @emph{December 24, 2006} +@subheading LilyPond 2.11.5 available - @emph{December 24, 2006} These releases complete the translation infrastructure for Documentation. @* @@ -3152,7 +3719,7 @@ Documentation. @newsItem -@subsubheading LilyPond 2.10.5 available - @emph{December 24, 2006} +@subheading LilyPond 2.10.5 available - @emph{December 24, 2006} New! Improved! With even more bugfixes! @* @bugfixes{2_10_5,}, @@ -3162,7 +3729,7 @@ New! Improved! With even more bugfixes! @newsItem -@subsubheading LilyPond 2.11.4 available - @emph{December 21, 2006} +@subheading LilyPond 2.11.4 available - @emph{December 21, 2006} The vertical spacing improvements that were introduced in 2.11.0 now work within a system as well as between systems. @* @@ -3173,7 +3740,7 @@ within a system as well as between systems. @newsItem -@subsubheading LilyPond 2.11.3 available - @emph{December 19, 2006} +@subheading LilyPond 2.11.3 available - @emph{December 19, 2006} This release has @uref{http://lilypond.org/doc/v2.11/compare-v2.10.3/index.html,graphical test results} and several website build improvements. @* @@ -3184,7 +3751,7 @@ test results} and several website build improvements. @newsItem -@subsubheading LilyPond 2.10.3 available - @emph{December 19, 2006} +@subheading LilyPond 2.10.3 available - @emph{December 19, 2006} This release fixes several bugs. @* @bugfixes{2_10_3,}, @@ -3193,13 +3760,13 @@ This release fixes several bugs. @newsItem -@subsubheading LinuxPPC binaries available! - @emph{December 19, 2006} +@subheading LinuxPPC binaries available! - @emph{December 19, 2006} From now on, our GUB binary builds include support for Linux/PPC. (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading Traduction du tutoriel en français. @emph{December 13, 2006} +@subheading Traduction du tutoriel en français. @emph{December 13, 2006} Fruit du travail d'une équipe de traducteurs, le tutoriel en français est maintenant disponible en ligne. @uref{http://lilypond.org/doc/v2.10/Documentation/user/lilypond/Tutorial.fr.html,Version 2.10}, @@ -3208,7 +3775,7 @@ maintenant disponible en ligne. @newsItem -@subsubheading LilyPond 2.11.2 available - @emph{December 12, 2006} +@subheading LilyPond 2.11.2 available - @emph{December 12, 2006} This release supports glissandi and harmonics in tablature. @* @bugfixes{2_11_2,}, @@ -3218,7 +3785,7 @@ This release supports glissandi and harmonics in tablature. @newsItem -@subsubheading LilyPond 2.10.2 available - @emph{December 12, 2006} +@subheading LilyPond 2.10.2 available - @emph{December 12, 2006} A new stable release of LilyPond is available. @* @bugfixes{2_10_2,}, @@ -3227,7 +3794,7 @@ A new stable release of LilyPond is available. @newsItem -@subsubheading LilyPond 2.11.1 available - @emph{December 4, 2006} +@subheading LilyPond 2.11.1 available - @emph{December 4, 2006} This release has improved support for horizontal spacing. @* @bugfixes{2_11_1,}, @@ -3237,7 +3804,7 @@ This release has improved support for horizontal spacing. @newsItem -@subsubheading LilyPond 2.10.1 available - @emph{December 3, 2006} +@subheading LilyPond 2.10.1 available - @emph{December 3, 2006} A new stable release of LilyPond is available. @* @bugfixes{2_10_1,}, @@ -3246,27 +3813,27 @@ A new stable release of LilyPond is available. @newsItem -@subsubheading LilyPond 2.11.0 available - @emph{November 27, 2006} +@subheading LilyPond 2.11.0 available - @emph{November 27, 2006} This release has improved support for vertical spacing. (@ref{Changes}, @ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.10.0 available - @emph{November 11, 2006} +@subheading LilyPond 2.10.0 available - @emph{November 11, 2006} A new stable release of LilyPond is available. (@miscLink{announce-v2.10,Announcement}, @ref{Changes}, @ref{Old downloads}) @newsEnd @newsItem -@subsubheading GIT repository online - @emph{November 11, 2006} +@subheading GIT repository online - @emph{November 11, 2006} LilyPond development has moved over its source code to @uref{http://git.or.cz,GIT}, the fast version control system. Check out our repository at @uref{http://git.sv.gnu.org/gitweb/?p=lilypond.git;a=summary,gnu.org}. @newsEnd @newsItem -@subsubheading LilyPond 2.9.29 available - @emph{November 5, 2006} +@subheading LilyPond 2.9.29 available - @emph{November 5, 2006} This release has many more bugfixes. @* @bugfixes{2_9_29,}, @@ -3275,7 +3842,7 @@ This release has many more bugfixes. @newsItem -@subsubheading LilyPond 2.9.28 available - @emph{November 3, 2006} +@subheading LilyPond 2.9.28 available - @emph{November 3, 2006} This release has many more bugfixes. @* @bugfixes{2_9_28,}, @@ -3284,7 +3851,7 @@ This release has many more bugfixes. @newsItem -@subsubheading LilyPond 2.9.27 available - @emph{October 28, 2006} +@subheading LilyPond 2.9.27 available - @emph{October 28, 2006} This release has a new @code{FretBoards} context, and some further bugfixes. @* @@ -3295,7 +3862,7 @@ bugfixes. @newsItem -@subsubheading Music streams thesis available - @emph{October 21, 2006} +@subheading Music streams thesis available - @emph{October 21, 2006} The last months, Erik Sandberg has been overhauling the internals of Lily. This change introduces a new intermediate format, Music Streams, which will make it easier get music data out of LilyPond. A copy of @@ -3305,7 +3872,7 @@ the thesis is now available from lilypond.org @newsItem -@subsubheading LilyPond 2.9.26 available - @emph{October 20, 2006} +@subheading LilyPond 2.9.26 available - @emph{October 20, 2006} This release has further bugfixes. @* @bugfixes{2_9_26,}, @@ -3314,7 +3881,7 @@ This release has further bugfixes. @newsItem -@subsubheading LilyPond 2.9.25 available - @emph{October 18, 2006} +@subheading LilyPond 2.9.25 available - @emph{October 18, 2006} This release has more bugfixes; from now on, binaries are also available for x86/64. @* @@ -3324,7 +3891,7 @@ available for x86/64. @newsItem -@subsubheading LilyPond 2.9.24 available - @emph{October 15, 2006} +@subheading LilyPond 2.9.24 available - @emph{October 15, 2006} This release has support for right hand guitar fingerings, and offers some bugfixes. (@ref{Changes}, @uref{http://code.google.com/p/lilypond/issues/list?can=1&q=fixed2924&colspec=ID+Type+Status+Priority+Milestone+Owner+Summary,Bugfixes}, @@ -3333,39 +3900,39 @@ some bugfixes. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.9.23 available - @emph{October 12, 2006} +@subheading LilyPond 2.9.23 available - @emph{October 12, 2006} This release cuts fragments of EPS directly from your finished score, and makes it easier to insert ties into lyrics. (@ref{Changes}, @ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.9.22 available - @emph{October 9, 2006} +@subheading LilyPond 2.9.22 available - @emph{October 9, 2006} Test this release candidate for LilyPond 2.10! (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.9.21 available - @emph{October 4, 2006} +@subheading LilyPond 2.9.21 available - @emph{October 4, 2006} Test this release candidate for LilyPond 2.10! (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.9.20 available - @emph{October 3, 2006} +@subheading LilyPond 2.9.20 available - @emph{October 3, 2006} Test this release candidate for LilyPond 2.10! (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.9.17 available - @emph{September 2, 2006} +@subheading LilyPond 2.9.17 available - @emph{September 2, 2006} This release fixes many bugs. Among others, MacOS X QuickTime now honors tempo changes are in the MIDI output. (@ref{Changes}, @ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.9.16 available - @emph{August 25, 2006} +@subheading LilyPond 2.9.16 available - @emph{August 25, 2006} In this release, chords may be partially tied and lyric extenders have tunable padding. Moreover, many bugs were fixed (@ref{Changes}, @ref{Old downloads}) @@ -3373,20 +3940,20 @@ tunable padding. Moreover, many bugs were fixed @newsItem -@subsubheading LilyPond 2.9.15 available - @emph{August 20, 2006} +@subheading LilyPond 2.9.15 available - @emph{August 20, 2006} This releases fixes many bugs in the 2.9.14 release. (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.8.6 available - @emph{August 8, 2006} +@subheading LilyPond 2.8.6 available - @emph{August 8, 2006} This release contains a few minor bugfixes; the source tarball is also available. (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.9.14 available - @emph{August 4, 2006} +@subheading LilyPond 2.9.14 available - @emph{August 4, 2006} This release supports instrument name changes, dotted barlines and better spacing for floating grace notes. In addition, it contains ongoing work by Erik Sandberg to extend the interpretation phase with @@ -3395,14 +3962,14 @@ stream support. (@ref{Changes}, @ref{Old downloads}) @newsItem -@subsubheading LilyPond 2.9.13 available - @emph{July 23, 2006} +@subheading LilyPond 2.9.13 available - @emph{July 23, 2006} This release supports doits and falls, and more tuning options for grace note spacing and tuplet brackets. (@ref{Changes}, @ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.9.12 available - @emph{July 18, 2006} +@subheading LilyPond 2.9.12 available - @emph{July 18, 2006} This release supports pdftex for lilypond-book, and uses PdfTeX for generating manuals, so page numbers and references are now clickable. (@ref{Changes}, @ref{Old downloads}) @@ -3410,7 +3977,7 @@ generating manuals, so page numbers and references are now clickable. @newsItem -@subsubheading LilyPond 2.9.11 available - @emph{July 12, 2006} +@subheading LilyPond 2.9.11 available - @emph{July 12, 2006} This release wraps improvements of the last two weeks. As a new feature, it supports tunable tuplet number formatting for nested tuplets. (@ref{Changes}, @ref{Old downloads}) @@ -3418,7 +3985,7 @@ tuplets. (@ref{Changes}, @ref{Old downloads}) @newsItem -@subsubheading LilyPond 2.9.10 available - @emph{June 15, 2006} +@subheading LilyPond 2.9.10 available - @emph{June 15, 2006} This releases fixes a couple of bugs in 2.9.9. (@ref{Changes}, @ref{Old downloads}) @@ -3426,7 +3993,7 @@ This releases fixes a couple of bugs in 2.9.9. @newsItem -@subsubheading LilyPond 2.9.9 available - @emph{June 15, 2006} +@subheading LilyPond 2.9.9 available - @emph{June 15, 2006} This releases fixes many bugs in 2.9.8 and earlier. (@ref{Changes}, @ref{Old downloads}) @@ -3434,7 +4001,7 @@ This releases fixes many bugs in 2.9.8 and earlier. @newsItem -@subsubheading LilyPond 2.9.8 available - @emph{June 6, 2006} +@subheading LilyPond 2.9.8 available - @emph{June 6, 2006} 2.9.8 has support for different spacing sections within a single score, and better infrastructure for automated regression testing. (@ref{Changes}, @@ -3443,7 +4010,7 @@ score, and better infrastructure for automated regression testing. @newsItem -@subsubheading LilyPond 2.8.4 available - @emph{June 4, 2006} +@subheading LilyPond 2.8.4 available - @emph{June 4, 2006} 2.8.4 fixes some minor bugs, and includes a backport of the infrastructure for automated regression testing. (@ref{Old downloads}) @@ -3451,7 +4018,7 @@ infrastructure for automated regression testing. @newsItem -@subsubheading First test results available - @emph{June 4, 2006} +@subheading First test results available - @emph{June 4, 2006} After a week of frantic tweaking, the first automated testing results are available. You can now see @uref{http://lilypond.org/doc/v2.9/compare-v2.8.4/index.html,in full glory} what features are broken in the development release @@ -3459,7 +4026,7 @@ glory} what features are broken in the development release @newsItem -@subsubheading LilyPond 2.9.7 available - @emph{May 30, 2006} +@subheading LilyPond 2.9.7 available - @emph{May 30, 2006} 2.9.7 has improvements in the formatting for figured bass, and includes a new framework for detecting bugs earlier, which will make the development releases even better @@ -3467,7 +4034,7 @@ the development releases even better @newsItem -@subsubheading LilyPond 2.9.6 available - @emph{May 24, 2006} +@subheading LilyPond 2.9.6 available - @emph{May 24, 2006} This release has new features in beam formatting: beams may now be put on single stems, and obey the @code{beatGrouping} property. MusicXML @@ -3476,7 +4043,7 @@ converter. (@ref{Changes}, @ref{Old downloads}) @newsItem -@subsubheading New essay pages! - @emph{May 22, 2006} +@subheading New essay pages! - @emph{May 22, 2006} The @emph{Automated Engraving} essay has been updated with material from the @uref{http://fisl.softwarelivre.org,FISL} talk, with pages on @uref{about/automated-engraving/problem-statement,modeling @@ -3486,7 +4053,7 @@ esthetics}. Happy reading! @newsItem -@subsubheading LilyPond 2.9.5 available - @emph{May 17, 2006} +@subheading LilyPond 2.9.5 available - @emph{May 17, 2006} This release supports object rotation, hairpins with circled tips, hairpins that run to barlines before notes and improvements in the MusicXML converter. @@ -3495,7 +4062,7 @@ MusicXML converter. @newsItem -@subsubheading LilyPond 2.9.4 available - @emph{May 12, 2006} +@subheading LilyPond 2.9.4 available - @emph{May 12, 2006} This release has support for feathered beaming, and note head styles in the markup @code{\note} command. In addition, it has a lot of updates of the manual and a clean up of the spring spacer. @@ -3504,14 +4071,14 @@ of the manual and a clean up of the spring spacer. @newsItem -@subsubheading LilyPond 2.8.2 available - @emph{May 12, 2006} +@subheading LilyPond 2.8.2 available - @emph{May 12, 2006} This release has fixes for minor bugs and compilation issues. (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.9.3 is out! - @emph{May 7, 2006} +@subheading LilyPond 2.9.3 is out! - @emph{May 7, 2006} This new release has lots of updates of the manual, courtesy Graham and the contributors of the mailing. It handles formatting for ties in arpegiated chords better (feature sponsored by @@ -3521,7 +4088,7 @@ and some cleanups of the PostScript output, courtesy David Feuer. (@ref{Changes} @newsItem -@subsubheading FISL7.0 slides available - @emph{April 22, 2006} +@subheading FISL7.0 slides available - @emph{April 22, 2006} The slides for Han-Wen's talk at @uref{http://fisl.softwarelivre.org,FISL 7} are now online. (@ref{Publications}) @@ -3529,14 +4096,14 @@ The slides for Han-Wen's talk at @newsItem -@subsubheading LilyPond 2.8.1 is out! - @emph{April 3, 2006} +@subheading LilyPond 2.8.1 is out! - @emph{April 3, 2006} Important bugfixes include CJK font handling and a Darwin/x86 port. (@ref{Changes}, @ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.9.1 is out! - @emph{April 3, 2006} +@subheading LilyPond 2.9.1 is out! - @emph{April 3, 2006} It's mostly a bugfix release, and it's almoste the same as 2.8.1. This release mainly fixes problems with CJK font loading. (@ref{Changes}, @ref{Old downloads}) @@ -3544,21 +4111,21 @@ release mainly fixes problems with CJK font loading. @newsItem -@subsubheading LilyPond on MacOS X/Intel - @emph{March 31, 2006} +@subheading LilyPond on MacOS X/Intel - @emph{March 31, 2006} LilyPond now also runs on Intel based macs, offering a 400% speedup over the emulated PowerPC binaries. (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.8.0 is out! - @emph{March 22, 2006} +@subheading LilyPond 2.8.0 is out! - @emph{March 22, 2006} Version 2.8 is here! Read the @miscLink{announce-v2.8,release announcement}. (@ref{Changes}, @ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.7.39 is out - @emph{March 17, 2006} +@subheading LilyPond 2.7.39 is out - @emph{March 17, 2006} This release has even more bug fixes. Please test before 2.8 is released. (@ref{Changes}, @ref{Old downloads}) @@ -3566,7 +4133,7 @@ released. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.38 is out - @emph{March 12, 2006} +@subheading LilyPond 2.7.38 is out - @emph{March 12, 2006} This is likely to be the last release candidate before we release 2.8, so report any bugs that you might find. New attractions include: lilypond postscript files now work with GSView, cut & pasting lily @@ -3578,7 +4145,7 @@ multi-measure rests. @newsItem -@subsubheading LilyPond 2.7.37 is out - @emph{March 4, 2006} +@subheading LilyPond 2.7.37 is out - @emph{March 4, 2006} This release has more bug fixes. Please help us by testing it! (@ref{Changes}, @ref{Old downloads}) @@ -3586,7 +4153,7 @@ This release has more bug fixes. Please help us by testing it! @newsItem -@subsubheading LilyPond 2.7.36 is out - @emph{February 24, 2006} +@subheading LilyPond 2.7.36 is out - @emph{February 24, 2006} This is another release candidate for 2.8. It has lots of bug fixes and polishes to the documentation. It also contains support for creating ties that are only on their right side connected to note @@ -3598,7 +4165,7 @@ from lilypond.org. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.35 is out - @emph{February 19, 2006} +@subheading LilyPond 2.7.35 is out - @emph{February 19, 2006} This release has lots of bugs fixes. The plan is to release 2.8 at the end of this month, so bug reports are @strong{very} welcome. By definition a bug is release critical if it wasn't present in version @@ -3608,7 +4175,7 @@ definition a bug is release critical if it wasn't present in version @newsItem -@subsubheading LilyPond 2.7.34 is out - @emph{February 16, 2006} +@subheading LilyPond 2.7.34 is out - @emph{February 16, 2006} This release has a bunch of bugfixes, and new features. Newly created contexts may also be named with @code{\new Voice = "alto"}. Thicknesses of tie and slurs may be tuned separately for @@ -3619,7 +4186,7 @@ part. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.33 is out - @emph{February 10, 2006} +@subheading LilyPond 2.7.33 is out - @emph{February 10, 2006} Items directly connected with a music input element may be parenthesized, for example, @verbatim @@ -3635,7 +4202,7 @@ This feature was sponsored by Ramana Kumar. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.32 is out - @emph{February 7, 2006} +@subheading LilyPond 2.7.32 is out - @emph{February 7, 2006} This release contains some syntax changes: words inside the \paper and \layout block are henceforth written with dashes, for instance: @@ -3655,7 +4222,7 @@ vector. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.31 is out - @emph{February 2, 2006} +@subheading LilyPond 2.7.31 is out - @emph{February 2, 2006} This release fixes a load of bugs, and has some internal cleanups. Exported C++ members are now named ly:class-name::function-name in Scheme instead of @@ -3668,7 +4235,7 @@ Python scripts too, so you can run convert-ly and midi2ly. @newsItem -@subsubheading LilyPond 2.7.30 is out - @emph{January 30, 2006} +@subheading LilyPond 2.7.30 is out - @emph{January 30, 2006} This release has a few bug fixes, like the solfa note head shape and collisions, the \epsfile command, and in getting No. ligature in normal words. (@ref{Changes}, @@ -3677,7 +4244,7 @@ normal words. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.29 is out - @emph{January 27, 2006} +@subheading LilyPond 2.7.29 is out - @emph{January 27, 2006} This release has the following new features. Alignments of staves may be tuned per system (feature sponsored by Trevor Baca), individual systems may be positioned manually (feature sponsored by Trevor Baca @@ -3691,7 +4258,7 @@ Sceaux). (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.28 is out - @emph{January 22, 2006} +@subheading LilyPond 2.7.28 is out - @emph{January 22, 2006} This release contains numerous small fixes that were already in our GUB binaries. In addition, it has further polish for formatting of tied chords. Theses improvements were sponsored by Steve @@ -3701,7 +4268,7 @@ Doonan. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.27, release 4 - @emph{January 13, 2006} +@subheading LilyPond 2.7.27, release 4 - @emph{January 13, 2006} The fourth release of our Grand Unified Binary for 2.7.27 is available. This release uses Pango 1.11.1, which has support for @@ -3710,7 +4277,7 @@ ligatures and kerning. Enjoy! (@ref{Old downloads}) @newsItem -@subsubheading LilyPond 2.7.27, release 3 - @emph{January 12, 2006} +@subheading LilyPond 2.7.27, release 3 - @emph{January 12, 2006} The third release of our Grand Unified Binaries is available. This release fixes external font-support, the decompression flag for Linux. Also, we have support for @strong{FreeBSD} as well! Jump @@ -3719,21 +4286,21 @@ to the @ref{Old downloads} get them! @newsItem -@subsubheading LilyPond 2.7.27 binaries are out - @emph{January 7, 2006} +@subheading LilyPond 2.7.27 binaries are out - @emph{January 7, 2006} Starting with 2.7.26, the development team has been working on the installers. We're proud to announce another version of these: they are now available for -@uref{http://lilypond.org/download/binaries/linux-x86/lilypond-2.7.27-1.linux.sh, +@uref{http://lilypond.org/downloads/binaries/linux-x86/, Linux/x86}, -@uref{http://lilypond.org/download/binaries/MacOS/lilypond-2.7.27-2.zip, +@uref{http://lilypond.org/downloads/binaries/darwin-ppc/, MacOS X} and -@uref{http://lilypond.org/download/binaries/mingw/lilypond-2.7.27-2.exe, +@uref{http://lilypond.org/downloads/binaries/mingw/, Windows}. @newsEnd @newsItem -@subsubheading LilyPond 2.7.27 is out - @emph{January 7, 2006} +@subheading LilyPond 2.7.27 is out - @emph{January 7, 2006} This release allows you to switch staff lines on and off individually (feature sponsored by Andrea Valle). (@ref{Changes}, @@ -3742,7 +4309,7 @@ Valle). (@ref{Changes}, @newsItem -@subsubheading Linux Journal article - @emph{January 2006} +@subheading Linux Journal article - @emph{January 2006} Linux Journal publishes an article on @uref{http://www.linuxjournal.com/article/8364,@emph{Make Stunning Schenker Graphs with GNU LilyPond}}. It is a @@ -3757,7 +4324,7 @@ This article is now available @uref{http://www.linuxjournal.com/article/8583,on- @newsItem -@subsubheading New binaries for LilyPond 2.7.26 - @emph{January 4, 2006} +@subheading New binaries for LilyPond 2.7.26 - @emph{January 4, 2006} The Development team has been working around the clock to improve to fix the first wave bugs reported by you. The new results for MacOS and Windows are up on the @ref{Old downloads} @@ -3766,7 +4333,7 @@ page. Let us know how you fare! @newsItem -@subsubheading LilyPond 2.7.26 is out - @emph{December 31, 2005} +@subheading LilyPond 2.7.26 is out - @emph{December 31, 2005} This release has an improvement in the MusicXML importer (feature sponsored by Mark vd Borre's Music Academy): now, staves and voices are also setup, so you can readily run LilyPond on the .ly output. @@ -3781,7 +4348,7 @@ A happy 2006 from the LilyPond Development Team! @newsItem -@subsubheading LilyPond 2.7.25 is out - @emph{December 24, 2005} +@subheading LilyPond 2.7.25 is out - @emph{December 24, 2005} This release has various bugfixes. Also, stems on the center line now have their directions interpolated to minimize the number of direction changes (feature sponsored by Basil Crow and Mike @@ -3791,7 +4358,7 @@ Rolish). (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.24 is out - @emph{December 20, 2005} +@subheading LilyPond 2.7.24 is out - @emph{December 20, 2005} This release fixes a couple of bugs, but more importantly, slurs now avoid TupletNumbers, and tuplet numbers may enter the staff (feature sponsored by Trent Johnston), tuplet brackets and numbers are @@ -3805,7 +4372,7 @@ functions. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.23 is out - @emph{December 19, 2005} +@subheading LilyPond 2.7.23 is out - @emph{December 19, 2005} This release has the following new features: @itemize @item @@ -3832,7 +4399,7 @@ Bertalan Fodor. @newsItem -@subsubheading LilyPond 2.7.22 is out - @emph{December 9, 2005} +@subheading LilyPond 2.7.22 is out - @emph{December 9, 2005} This release has better support for MusicXML: it also supports ties, beams and editorial accidentals. It also has more options for spacing Lyrics; it is now possible to separately specify minimum distances for @@ -3844,7 +4411,7 @@ Fodor. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.21 is out - @emph{December 5, 2005} +@subheading LilyPond 2.7.21 is out - @emph{December 5, 2005} Saint Nicholas brings you ... a @uref{http://www.musicxml.org/,MusicXML} convertor for LilyPond! The convertor is basic, but working. Check out the @uref{http://www.lilypond-design.com/sponsor/open-features.html#inputfilter, LilyPond Software Design} pages for MusicXML features that can be @@ -3853,7 +4420,7 @@ sponsored. @newsItem -@subsubheading LilyPond 2.7.20 is out - @emph{December 2, 2005} +@subheading LilyPond 2.7.20 is out - @emph{December 2, 2005} This release contains the following improvements: Texts set in a TrueType font are now kerned. Using the TeX no longer requires linking or dynamically opening the kpathsea library, making the backend more @@ -3865,14 +4432,14 @@ Productions). (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.6.5 is out - @emph{December 1, 2005} +@subheading LilyPond 2.6.5 is out - @emph{December 1, 2005} This release updates the bugreporting address and reorganizes the documentation tree. (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.7.19 is out - @emph{November 26, 2005} +@subheading LilyPond 2.7.19 is out - @emph{November 26, 2005} This version contains a few bugfixes, and now allows the type of brackets in system start bracket hierarchies to be specified. Also, the horizontal alignment of rehearsal marks may be changed: marks can @@ -3883,7 +4450,7 @@ etc. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.18 is out - @emph{November 21, 2005} +@subheading LilyPond 2.7.18 is out - @emph{November 21, 2005} This version features nestable system start delimiters, like bracket, brace. It also adds "square" line bracket (feature sponsored by Trevor Baca). It also has refactored routines for tie formatting. This will @@ -3895,7 +4462,7 @@ fixes. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.17 is out - @emph{November 17, 2005} +@subheading LilyPond 2.7.17 is out - @emph{November 17, 2005} This version has refactored routines for tie formatting. This will make it easier to get better tie formatting for chords (feature sponsored by Steve Doonan). It also has a few bug @@ -3905,7 +4472,7 @@ fixes. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.16 is out - @emph{November 11, 2005} +@subheading LilyPond 2.7.16 is out - @emph{November 11, 2005} This release fixes a large number of bugs. Please upgrade before reporting bugs in the 2.7 series. (@ref{Changes}, @ref{Old downloads}) @@ -3913,7 +4480,7 @@ reporting bugs in the 2.7 series. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.15 is out - @emph{November 3, 2005} +@subheading LilyPond 2.7.15 is out - @emph{November 3, 2005} This release has another massive cleanup of the backend. Each grob property may also be a "grob closure". This means that it is possible to combine functions. Calculation of extent and offset of grob is now @@ -3924,7 +4491,7 @@ properties. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.14 is out - @emph{October 23, 2005} +@subheading LilyPond 2.7.14 is out - @emph{October 23, 2005} This release has more cleanup in the layout-engine. Now, properties that have Procedure values are thought to be procedures that compute said property, i.e. @@ -3940,7 +4507,7 @@ will set a random direction for beams. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.13 is out - @emph{October 18, 2005} +@subheading LilyPond 2.7.13 is out - @emph{October 18, 2005} This release features slashed numerals, plus signs and interruptible extender lines for figured bass. Merging of Figured bass lines has been made switchable with the figuredBassCenterContinuations @@ -3953,7 +4520,7 @@ users. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.6.4 is out - @emph{October 11, 2005} +@subheading LilyPond 2.6.4 is out - @emph{October 11, 2005} This release fixes a few minor problems with the stable series. (@ref{Changes}, @ref{Old downloads}) @@ -3961,7 +4528,7 @@ series. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.12 is out - @emph{October 07, 2005} +@subheading LilyPond 2.7.12 is out - @emph{October 07, 2005} It features more annotations for the page layout engine and some more sponsored features. Beamlets may stick out of the side of beams (feature sponsored by Trevor Baca); new support for figured bass with @@ -3975,7 +4542,7 @@ Sceaux). (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.11 is out - @emph{October 02, 2005} +@subheading LilyPond 2.7.11 is out - @emph{October 02, 2005} Vertical spacing for page layout can now be tuned for each system individually (feature sponsored by Trevor Baca and Nicolas Sceaux). The slope of a stem-tremolo may be set manually (feature @@ -3987,7 +4554,7 @@ fixes. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.10 is out - @emph{September 13, 2005} +@subheading LilyPond 2.7.10 is out - @emph{September 13, 2005} This version adds proper support for "laissez vibrer ties", just enter \laissezVibrer after a chord. This feature was sponsored by Henrik Frisk. It also has a couple of minor @@ -3997,7 +4564,7 @@ bugfixes. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.9 is out - @emph{September 5, 2005} +@subheading LilyPond 2.7.9 is out - @emph{September 5, 2005} This is mainly a bugfix release. (@ref{Changes}, @ref{Old downloads}) @@ -4005,7 +4572,7 @@ release. (@ref{Changes}, @newsItem -@subsubheading Traduction française du site - @emph{September 03, 2005} +@subheading Traduction française du site - @emph{September 03, 2005} Grâce à @uref{about/thanks#website,l'équipe des traducteurs}, de nombreuses pages du site sont maintenant disponibles en français, notamment l'@uref{about/automated-engraving/index.fr.html,essai sur @@ -4014,7 +4581,7 @@ la gravure musicale}. @newsItem -@subsubheading LilyPond 2.7.8 is out - @emph{August 29, 2005} +@subheading LilyPond 2.7.8 is out - @emph{August 29, 2005} This release has support for right-to-left text formatting in markup commands (sponsored by Aaron Mehl). In addition, it fixes a great number of bugs, among others, support for writing MIDI files. (@ref{Changes}, @@ -4023,7 +4590,7 @@ number of bugs, among others, support for writing MIDI files. (@ref{Changes}, @newsItem -@subsubheading Article in `De Standaard' - @emph{August 20, 2005} +@subheading Article in `De Standaard' - @emph{August 20, 2005} The Belgian newspaper @emph{De Standaard} investigates what drives Free Software authors in an article titled @emph{Delen van KENNIS zonder WINSTBEJAG} (Non-profit sharing of @@ -4033,7 +4600,7 @@ LilyPond's first appearance in mainstream printed press. @newsItem -@subsubheading LilyPond 2.7.7 is out - @emph{August 22, 2005} +@subheading LilyPond 2.7.7 is out - @emph{August 22, 2005} This release has a rewriting of tie formatting which was sponsored by Bertalan Fodor, Jay Hamilton, Kieren MacMillan, Steve Doonan, Trevor Baca, and Vicente Solsona Dellá. (@ref{Changes}, @@ -4042,7 +4609,7 @@ Baca, and Vicente Solsona Dellá. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.6 is out - @emph{August 19, 2005} +@subheading LilyPond 2.7.6 is out - @emph{August 19, 2005} This release adds support for numbered percent repeats, a feature sponsored by Yoshinobu Ishizaki. It also has bugfixes for clashes between slurs and symbols, like fingers dynamic @@ -4052,7 +4619,7 @@ signs. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.5 is out - @emph{August 16, 2005} +@subheading LilyPond 2.7.5 is out - @emph{August 16, 2005} Lily 2.7.5 has a large number of bugfixes, among others, in slur formatting, spacing, rest collisions and tuplet bracket formatting. (@ref{Changes}, @@ -4061,7 +4628,7 @@ formatting. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.4 is out - @emph{August 7, 2005} +@subheading LilyPond 2.7.4 is out - @emph{August 7, 2005} LilyPond 2.7.4 has support for proportional notation, where the space for a note is proportional to the time it takes. (@ref{Changes}, @@ -4070,14 +4637,14 @@ takes. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.6.3 is out - @emph{August 4, 2005} +@subheading LilyPond 2.6.3 is out - @emph{August 4, 2005} This release fixes a memory corruption bug that was triggered by \override'ing Beam settings. (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading LilyPond 2.6.2 is out - @emph{August 2, 2005} +@subheading LilyPond 2.6.2 is out - @emph{August 2, 2005} This release has a few bugfixes, among them: the autopackage will run in more platforms, LilyPond will be much quicker for large lilypond-book documents, and the up and down Fa note heads for shaped @@ -4088,7 +4655,7 @@ swapped. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.7.3 is out - @emph{July 25, 2005} +@subheading LilyPond 2.7.3 is out - @emph{July 25, 2005} LilyPond 2.7.3 has improvements in performance which should result in faster operations (15 to 20 percent). It also contains the new "\displayLilyMusic" function. @@ -4098,7 +4665,7 @@ faster operations (15 to 20 percent). It also contains the new @newsItem -@subsubheading LilyPond 2.7.2 is out - @emph{July 21, 2005} +@subheading LilyPond 2.7.2 is out - @emph{July 21, 2005} LilyPond 2.7.2 has support for suggested accidentals for musica ficta notation, easy entry for lyric melismata and improvements for quicker entry of scores. (@ref{Changes}, @@ -4107,7 +4674,7 @@ quicker entry of scores. (@ref{Changes}, @newsItem -@subsubheading LilyPond 2.6 released - @emph{June 27, 2005} +@subheading LilyPond 2.6 released - @emph{June 27, 2005} Version 2.6 is the latest stable release of LilyPond. It now installs in a snap on Windows, MacOS X, and any version of Linux (x86). @@ -4119,7 +4686,7 @@ print @strong{Unicode } lyrics in your favorite script and font. Create @newsItem -@subsubheading LilyPond 2.7.1 is out - @emph{July 20, 2005} +@subheading LilyPond 2.7.1 is out - @emph{July 20, 2005} LilyPond 2.7.1 has no user-visible changes. However, due to restructuring @qq{under the hood}, this version will be 10 to 20 % faster. (@ref{Old downloads}) @@ -4127,7 +4694,7 @@ restructuring @qq{under the hood}, this version will be 10 to @newsItem -@subsubheading LilyPond 2.6.1 is out - @emph{July 11, 2005} +@subheading LilyPond 2.6.1 is out - @emph{July 11, 2005} This version fixes a few minor bugs found in 2.6.0, and also works on DOS-based Windows versions. (@ref{Changes}, @ref{Old downloads}) @@ -4135,7 +4702,7 @@ This version fixes a few minor bugs found in @newsItem -@subsubheading LilyPond 2.7 is out - @emph{July 9, 2005} +@subheading LilyPond 2.7 is out - @emph{July 9, 2005} LilyPond 2.7.0 is out. It has support for paragraph text and pitched trill notation. (@ref{Changes}, @ref{Old downloads}) @@ -4143,7 +4710,7 @@ pitched trill notation. (@ref{Changes}, @newsItem -@subsubheading 2.5.31 released - @emph{June 22, 2005} +@subheading 2.5.31 released - @emph{June 22, 2005} LilyPond 2.5.32 is now available for download (binaries for Fedora + MacOS only). It has a few very minor bugfixes, and a rewrite of the TTF embedding code, which should be a lot more robust now. @@ -4152,7 +4719,7 @@ TTF embedding code, which should be a lot more robust now. @newsItem -@subsubheading Traduction du site de LilyPond - @emph{15 juin 2005} +@subheading Traduction du site de LilyPond - @emph{15 juin 2005} @uref{about/thanks#website,L'équipe des traducteurs} vous présente le site de LilyPond en français. Nous travaillons sur la traduction des pages encore non traduites. Bon surf ! @@ -4160,7 +4727,7 @@ pages encore non traduites. Bon surf ! @newsItem -@subsubheading 2.5.31 for Windows and MacOS - @emph{June 15, 2005} +@subheading 2.5.31 for Windows and MacOS - @emph{June 15, 2005} 2.5.31 is now available for both Windows and MacOS X. The Windows version should now work with embedding TTF fonts, and the MacOS X has better help functionality. @@ -4169,7 +4736,7 @@ better help functionality. @newsItem -@subsubheading 2.5.31 released - @emph{June 15, 2005} +@subheading 2.5.31 released - @emph{June 15, 2005} This release has a few bugfixes. In the MacOS X version, ClickEdit has been renamed to LilyPond, and you can now upgrade your files and compile them directly from @@ -4178,14 +4745,14 @@ LilyPond. (@ref{Old downloads}) @newsItem -@subsubheading 2.5.30 released - @emph{June 10, 2005} +@subheading 2.5.30 released - @emph{June 10, 2005} This is (hopefully) the last Release Candidate before 2.6. Give it a good shake to find those last bugs! (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading 2.5.29 released - @emph{June 7, 2005} +@subheading 2.5.29 released - @emph{June 7, 2005} In this release the documentation also has pictures. In addition, the Mac version can also read native mac fonts (.dfonts and fonts in resource forks). (@ref{Old downloads}) @@ -4193,7 +4760,7 @@ resource forks). (@ref{Old downloads}) @newsItem -@subsubheading 2.5.27 released - @emph{May 31, 2005} +@subheading 2.5.27 released - @emph{May 31, 2005} It has a big bunch of minor bugfixes. This is another release candidate for version 2.6, which should be released within the next 2 weeks. Please send a bug report if you find a critical problem with this @@ -4202,27 +4769,27 @@ release. (@ref{Old downloads}) @newsItem -@subsubheading Windows and MacOS installers available - @emph{May 26, 2005} +@subheading Windows and MacOS installers available - @emph{May 26, 2005} There are now a native, standalone installers for Windows and MacOS. They also support PDF point & click. (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading 2.5.26 released - @emph{May 26, 2005} +@subheading 2.5.26 released - @emph{May 26, 2005} This release has a couple of small bugfixes. @newsEnd @newsItem -@subsubheading 2.5.25 released - @emph{May 20, 2005} +@subheading 2.5.25 released - @emph{May 20, 2005} This release has many small bugfixes and updates to the documentation. (@ref{Old downloads}) @newsEnd @newsItem -@subsubheading 2.5.24 released - @emph{May 12, 2005} +@subheading 2.5.24 released - @emph{May 12, 2005} 2.5.24 fixes a bunch of bugs; in particular, chord symbols (such as slashed o) should now work on all platforms. This release has a new feature: it is now possible to make staves appear in a different order @@ -4231,7 +4798,7 @@ from the order that they were defined. (@ref{Old downloads}) @newsItem -@subsubheading 2.5.23 released - @emph{May 6, 2005} +@subheading 2.5.23 released - @emph{May 6, 2005} This release has a couple of small bugfixes, and a new feature. It is now possible to start and stop the @code{StaffSymbol}, during a piece of music, by doing @code{\stopStaff \startStaff}. This can be used to @@ -4241,7 +4808,7 @@ produce Ossia staves. (@ref{Changes}, @newsItem -@subsubheading 2.5.22 released - @emph{May 3, 2005} +@subheading 2.5.22 released - @emph{May 3, 2005} 2.5.22 is a bugfix release. The most visible improvement is in the PDF : this release will produce smaller PDF files, with symbols that look better on @@ -4251,7 +4818,7 @@ screen. @newsItem -@subsubheading April 25, 2005 - 2.5.21 released! +@subheading April 25, 2005 - 2.5.21 released! 2.5.21 has more bugfixes. It also has support for "grid lines", bar like vertical line, which are aligned with the notes. The auto-beam engraver was rewritten, so it also works with irregular time @@ -4262,7 +4829,7 @@ signatures like 5/8. @newsItem -@subsubheading April 18, 2005 +@subheading April 18, 2005 LilyPond 2.5.20 has lots of bugfixes, in particular, MIDI files of multi-movement pieces don't overwrite each other. Version 2.5.20 also supports putting arrows on lines, such as glissandi. @@ -4273,7 +4840,7 @@ file, or go straight to @ref{Old downloads}. @newsItem -@subsubheading April 15, 2005 +@subheading April 15, 2005 LilyPond 2.5.19 was released. The command `\epsfile' allows inclusion of EPS graphics into markup texts and the music function `\musicDisplay' will display a music expression as indented @@ -4284,7 +4851,7 @@ file and @ref{Old downloads}. @newsItem -@subsubheading April 6, 2005 +@subheading April 6, 2005 2.5.18 is a bugfix release. It has many small cleanups in the web-based documentation, and many small cleanups all over the place. @ref{Old downloads} @@ -4292,7 +4859,7 @@ place. @ref{Old downloads} @newsItem -@subsubheading March 31, 2005 +@subheading March 31, 2005 2.5.17 is out. This release features many small bugfixes. In addition, it has support for string number notation for guitar. This feature was sponsored by Gunther Strube. @ref{Old downloads} @@ -4300,7 +4867,7 @@ sponsored by Gunther Strube. @ref{Old downloads} @newsItem -@subsubheading March 20, 2005 +@subheading March 20, 2005 LilyPond 2.5.16 is out. This release fixes a few minor but irritating errors. A Fedora Core 3 binary is also available. @ref{Old downloads} @@ -4308,7 +4875,7 @@ errors. A Fedora Core 3 binary is also available. @newsItem -@subsubheading March 14, 2005 +@subheading March 14, 2005 LilyPond 2.5.15 is out. This release has clean ups in the SVG output, and now uses the LilyPond number font for time signatures. It is now possible to add text before and after music. This can be used to @@ -4318,7 +4885,7 @@ file and @ref{Old downloads}! @newsItem -@subsubheading March 7, 2005 +@subheading March 7, 2005 LilyPond 2.5.14 is out. It is now possible (and in fact, encouraged), to build LilyPond either without the Kpathsea TeX library or with the Kpathsea dynamically loaded, but only for the -btex backend. This @@ -4330,7 +4897,7 @@ file and download @ref{Old downloads}! @newsItem -@subsubheading March 7, 2005 +@subheading March 7, 2005 LilyPond 2.4.5 is out. This release backports the tieWaitForNote feature and has support for tetex-3.0. @ref{Old downloads} @@ -4338,9 +4905,9 @@ feature and has support for tetex-3.0. @newsItem -@subsubheading February 28, 2005 -LilyPond 2.5.13 is available for Fedora Core 3. You need to install @uref{http://lilypond.org/download/binaries/Fedora-3/ghostscript-8.15rc3-0.i386.rpm,ESP -Ghostscript 8.15rc3}. Unfortunately, this version of Ghostscript +@subheading February 28, 2005 +LilyPond 2.5.13 is available for Fedora Core 3. You need to install +Ghostscript 8.15rc3. Unfortunately, this version of Ghostscript lacks the IJS dynamic library, which means that it will conflict with the gimp-print package. You may install it with --nodeps. Use at your own risk. @@ -4348,7 +4915,7 @@ own risk. @newsItem -@subsubheading February 28, 2005 +@subheading February 28, 2005 LilyPond 2.5.13 is out. This release has Point and click support for PDF output. You can read more about it @uref{http://lilypond.org/doc/v2.5/Documentation/user/out-www/lilypond/Point-and-click.html,here}. Take a look at the @ref{Changes} @@ -4357,8 +4924,8 @@ file and download @ref{Old downloads}! @newsItem -@subsubheading February 26, 2005 -The @uref{http://lsr.dsi.unimi.it/,LilyPond Snippet +@subheading February 26, 2005 +The @uref{http://lsr.di.unimi.it/,LilyPond Snippet Repository (LSR)} is a searchable database of LilyPond code snippets. You can add snippets too, so join the LSR project, and contribute creative ideas for using LilyPond. @@ -4366,7 +4933,7 @@ contribute creative ideas for using LilyPond. @newsItem -@subsubheading February 21, 2005 +@subheading February 21, 2005 LilyPond 2.5.12 is out. The big news is that this release supports TrueType fonts. This means that it is now possible to use @strong{all} fonts available via FontConfig. Also, arpeggios may be written out @@ -4377,7 +4944,7 @@ file and @ref{Old downloads}! @newsItem -@subsubheading February 4, 2005 +@subheading February 4, 2005 LilyPond 2.5.11 is out. In this release, foreign character sets are now supported in lilypond-book too, and it is possible to put system separators between systems. @@ -4386,7 +4953,7 @@ too, and it is possible to put system separators between systems. @newsItem -@subsubheading January 31, 2005 +@subheading January 31, 2005 LilyPond 2.5.10 is out. This release sports as new EPS backend, based on the PS backend. This backend is used in the new and improved lilypond-book script. @@ -4395,7 +4962,7 @@ used in the new and improved lilypond-book script. @newsItem -@subsubheading January 26, 2005 +@subheading January 26, 2005 LilyPond 2.5.9 is out. This release fixes a couple of annoying bugs in the direct PS output for piano braces. @ref{Old downloads} @@ -4403,19 +4970,19 @@ bugs in the direct PS output for piano braces. @newsItem -@subsubheading January 16, 2005 +@subheading January 16, 2005 LilyPond 2.5.8 is out. This release has many internal code cleanups. In addition, accuracy of error reporting has been improved. See the -@uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.3065&content-type=text/vnd.viewcvs-markup, +@uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1, change log } and @ref{Old downloads}! @newsEnd @newsItem -@subsubheading January 11, 2005 +@subheading January 11, 2005 LilyPond 2.5.7 is out. This release has a completely usable Pango integration for the PS backend. The default font is Century Schoolbook from the PS font suite. It also has @@ -4424,12 +4991,12 @@ assorted manual updates by Graham, and an overhaul of the font code by Werner. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.3048&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading January 02, 2005 +@subheading January 02, 2005 LilyPond 2.5.6 was released. This is a "technology preview" release, which means that it has all kinds of nifty features, but is not actually usable for producing nicely @@ -4441,24 +5008,24 @@ backend now offloads all metric computations to LaTeX, the SVG and GNOME backends are broken, most probably. @ref{Old downloads} and check out the -changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.3013&content-type=text/vnd.viewcvs-markup,ChangeLog}. +changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading December 28, 2004 +@subheading December 28, 2004 LilyPond 2.5.5 is out. It is the first one to link against FontConfig and Pango, although it is only available in the "-f ps" output. The default output format has been changed back TeX while we stabilize the Pango/FontConfig integration. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev= 1.3000&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading December 20, 2004 +@subheading December 20, 2004 LilyPond 2.5.4 is out. This release has some major brainsurgery in the font handling. As of now, LilyPond loads the music fonts in OpenType font format using FreeType. @@ -4466,12 +5033,12 @@ This has made a lot of things simpler, including font handling for the GNOME backend and SVG backend. @ref{Old downloads} and check out the -changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2974&content-type=text/vnd.viewcvs-markup,ChangeLog}. +changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading December 3, 2004 +@subheading December 3, 2004 LilyPond 2.5.3 was released. A new script, `\espressivo' has been added, for a combination of crescendo and decrescendo on a single note. In markups, expressions stacked with @@ -4483,12 +5050,12 @@ by letting the grace notes follow a skip in a parallel expression. @ref{Old downloads} and -check out the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2908&content-type=text/vnd.viewcvs-markup,ChangeLog}. +check out the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading November 26, 2004 +@subheading November 26, 2004 LilyPond 2.5.2 was released. It has several goodies, including solfa-notation (shaped noteheads), and an easier mechanism for customizing title, footer and header @@ -4496,12 +5063,12 @@ layout. Don't forget to rebuild the fonts, as they have been changed to accomodate the solfa-notation. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2898&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading November 20, 2004 +@subheading November 20, 2004 LilyPond 2.5.1 is out. This is an experimental release, containing some proof-of-concept code for our graphical layout editor. You can add and remove things from the file, @@ -4513,12 +5080,12 @@ SVG backend, support for the lmodern font set for TeX, various bugfixes. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2881&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading November 12, 2004 +@subheading November 12, 2004 The LilyPond development is OPEN once again! The first release of the 2.5 series has the following new Features: Positioning of slurs can now be adjusted manually, Grace @@ -4536,12 +5103,12 @@ the -f gnome backend. These tweaks can be saved and are applied to the PS and TeX output as well. @ref{Old downloads} and check out -the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2837&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading November 11, 2004 +@subheading November 11, 2004 LilyPond 2.4.2 is out. This release fixes a number of security problems with --safe, and adds a lot of polishing fixes. @ref{Old downloads} @@ -4549,17 +5116,17 @@ problems with --safe, and adds a lot of polishing fixes. @newsItem -@subsubheading November 4, 2004 +@subheading November 4, 2004 LilyPond 2.4.1 is out. This release includes a number of small fixes that were made to 2.4.0 last week. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2780.2&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading October 31, 2004 +@subheading October 31, 2004 LilyPond 2.4.0 was just @miscLink{announce-v2.4,released!} This new stable version has support for page-layout, completely rewritten slur formatting and many other @@ -4570,76 +5137,76 @@ file. @newsItem -@subsubheading October 29, 2004 +@subheading October 29, 2004 LilyPond 2.3.26 is out. This is another 2.4 release candidate. This release fixes a number of minor bugs, and some problems with the conversion scripts. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2773&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading October 29, 2004 +@subheading October 29, 2004 2.3.25 is the final release candidate for LilyPond 2.4. Werner has been overhauling the TeX macros and lilypond-book. In addition, this release contains an important fix for raggedbottom page-layout. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2765&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading October 27, 2004 +@subheading October 27, 2004 LilyPond 2.3.24 is a further polished 2.4 release candidate. This release has more improvements by Werner for the TeX backend, and a bunch of other small fixes. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2752&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading October 24, 2004 +@subheading October 24, 2004 LilyPond 2.3.23 has bugfixes in the documentation, lilypond-book and --preview output. This release can be considered as a release candidate for LilyPond 2.4. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2742&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading October 10, 2004 +@subheading October 10, 2004 LilyPond 2.3.22 fixes a bunch more bugs, to make 2.4 a really stable release. In addition, it renames the \paper@{@} block to \layout@{@}. The \bookpaper@{@} block is now called \paper@{@}. @ref{Old downloads} and -check out the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2709&content-type=text/vnd.viewcvs-markup,ChangeLog}. +check out the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading October 09, 2004 +@subheading October 09, 2004 LilyPond 2.3.21 is out. It is a serious release candidate for the next stable release LilyPond. This version has a cleanup and some small formatting improvements of the slur code. @ref{Old downloads} and check -out the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2692&content-type=text/vnd.viewcvs-markup,ChangeLog}. +out the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading October 02, 2004 +@subheading October 02, 2004 LilyPond 2.3.20 was released. It fixes the biggest problems with encoding and the TeX backend. As a result, latin1 characters (like the german SS) show up correctly in the @@ -4647,13 +5214,13 @@ output once again. Also it has the usual bugfixes and updates in the documentation. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2674&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading September 29, 2004 -The LilyPond development team will be present at the @uref{http://www.nluug.nl/events/sane2004/bazaar/index.html,Free +@subheading September 29, 2004 +The LilyPond development team will be present at the @uref{https://web.archive.org/web/20040811160307/http://www.nluug.nl/events/sane2004/bazaar/index.html,Free Software Bazaar} of the NLUUG SANE 2004 conference today. If you are in the neighborhood, drop by for live contact with the Team or just a friendly chat. Registration is not required to attend. @@ -4661,16 +5228,16 @@ just a friendly chat. Registration is not required to attend. @newsItem -@subsubheading September 26, 2004 +@subheading September 26, 2004 LilyPond 2.3.19 is out. It's mainly a bugfix release. @ref{Old downloads} and check out the changes -in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2652&content-type=text/vnd.viewcvs-markup,ChangeLog}. +in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading September 20, 2004 +@subheading September 20, 2004 LilyPond 2.3.18 was released. It has further improvements in the slur formatting, and a small syntax change: the mode changing commands (`\chords', `\lyrics', etc.) have been @@ -4680,12 +5247,12 @@ renamed to `\chordmode', `\lyricmode', etc. The command similarly. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2614&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading September 11, 2004 +@subheading September 11, 2004 LilyPond 2.3.16 was released. It fixes a couple of annoying bugs, and has an important addition in the slur-formatter. Slurs that pass note heads much closer than the average distance get an extra @@ -4700,12 +5267,12 @@ will get uglier by upgrading to 3.0, so that once 3.0 is out, nothing will hold users back in switching. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2562&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading September 10, 2004 +@subheading September 10, 2004 LilyPond 2.3.15 was released. It fixes for some gaffes with the new vertical spacing engine, has lots of documentation updates, and has support for landscape output in the direct @@ -4714,12 +5281,12 @@ postscript output. Also, the types of events quoted with only notes and rests end up in quotes. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2553&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading September 6, 2004 +@subheading September 6, 2004 LilyPond 2.3.14 was released and has exciting features! LilyPond will try to keep staves at the same distances across a page, but it will stretch distances to prevent collisions; key @@ -4728,12 +5295,12 @@ different voices that all use "\quote" can now refer to each other. @ref{Old downloads} and check out -the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2534&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading August 29, 2004 +@subheading August 29, 2004 LilyPond now has a Documentation Editor, Graham Percival. From now on, he will oversee that useful information flows from the mailiing list into the @@ -4747,7 +5314,7 @@ A lot of cheers for Graham! @newsItem -@subsubheading August 29, 2004 +@subheading August 29, 2004 LilyPond 2.3.13 was released. The new slur code was improved, scripts can be made to avoid slurs, by setting inside-slur to #f. It is no longer necessary to instantiate @@ -4757,44 +5324,44 @@ mensural flags, so they are adjusted for staff lines once again. @ref{Old downloads} and -check out the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2520&content-type=text/vnd.viewcvs-markup,ChangeLog}. +check out the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading August 24, 2004 +@subheading August 24, 2004 LilyPond 2.2.6 fixes a few minor issues, among others, the disappearing metronome mark. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2000.2.33&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading August 23, 2004 +@subheading August 23, 2004 LilyPond 2.3.12 is out. This release has a lot of fixes and a new feature: there is now support for putting two slurs on chords, both above and below. This is switched on with the `doubleSlurs' property. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2489&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading August 3, 2004 +@subheading August 3, 2004 LilyPond 2.3.11 is out. This release basically is 2.3.10 with a few annoying bugs fixed. @ref{Old downloads} and check out -the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2449&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading August 1, 2004 +@subheading August 1, 2004 LilyPond 2.3.10 is out. This release has a major clean-up of the input/test/ directory. Many examples have been moved to the regression test or manual, and the superfluous or outdated ones have been @@ -4812,12 +5379,12 @@ that is dumped as verbatim PostScript @ref{Old downloads} and check out -the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2435&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading July 30, 2004 +@subheading July 30, 2004 LilyPond 2.3.9 is out. The important change is that lilypond now once-again directly runs the binary. The old wrapper script has been renamed to lilypond-latex.py, and should only be used for legacy @@ -4830,24 +5397,24 @@ updating the manual, and after that's done we can release 3.0. The projected date for this to happen is in about a month. @ref{Old downloads} and check out -the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2416&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading July 23, 2004 +@subheading July 23, 2004 LilyPond 2.3.8 fixes a few minor bugs in the new slur code, and has rewritten support for ledger lines. Now, in tight situations, ledger lines will be shortened so they stay separate. This also required a cleanup of the Ambitus implementation. @ref{Old downloads} -and check out the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2395&content-type=text/vnd.viewcvs-markup,ChangeLog}. +and check out the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading July 19, 2004 +@subheading July 19, 2004 LilyPond 2.3.7 was released and has new exciting features! The slur formatting has been rewritten. The new slur code works similar to the Beam formatter: scores are assigned for @@ -4859,102 +5426,102 @@ the LilyPond emacs mode, the `|' will now display the current beat within the measure. @ref{Old downloads} and check out the changes in -the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2383&content-type=text/vnd.viewcvs-markup,ChangeLog}. +the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading July 15, 2004 +@subheading July 15, 2004 LilyPond 2.2.5 was released. It has a few bug fixes from 2.3.x. @ref{Old downloads} and check -out the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2000.2.28&content-type=text/vnd.viewcvs-markup,ChangeLog}. +out the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading July 11, 2004 +@subheading July 11, 2004 An introductory article on LilyPond appeared on @uref{http://www.linuxjournal.com/article.php?sid=7657&mode=thread&order=0,Linux Journal}. @newsEnd @newsItem -@subsubheading July 5, 2004 +@subheading July 5, 2004 LilyPond 2.3.6 was released. This release has more updates for the Fret diagram code (thanks, Carl!), fixes a bunch of bugs, including a serious one that trashed a lot of beam formatting, and was also present in the 2.2 series. @ref{Old downloads} and check out the changes -in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2306&content-type=text/vnd.viewcvs-markup,ChangeLog}. +in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading July 5, 2004 +@subheading July 5, 2004 LilyPond 2.2.4 was released. It is mainly a bug fix release. @ref{Old downloads} and -check out the changes in the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2000.2.23&content-type=text/vnd.viewcvs-markup,ChangeLog}. +check out the changes in the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog}. @newsEnd @newsItem -@subsubheading June 25, 2004 +@subheading June 25, 2004 LilyPond 2.3.5 has numerous small bugfixes and cleanups, and features more work in the experimental GNOME output module. Adventurous hackers can check the instructions at scm/output-gnome.scm and try to run buildscripts/guile-gnome.sh to see what the fuss is all about. Carl Sorensen also provided us with more patches to the -fret-diagram output. Check out the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2293&content-type=text/vnd.viewcvs-markup,ChangeLog} +fret-diagram output. Check out the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog} and @ref{Old downloads}. @newsEnd @newsItem -@subsubheading June 20, 2004 +@subheading June 20, 2004 LilyPond 2.2.3 has a turkish translation and fixes a few minor -bugs that were reported over the past month. Check out the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2000.2.16&content-type=text/vnd.viewcvs-markup,ChangeLog} for a full description and +bugs that were reported over the past month. Check out the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog} for a full description and @ref{Old downloads}. @newsEnd @newsItem -@subsubheading June 13, 2004 +@subheading June 13, 2004 LilyPond 2.3.4 further improves the output backends. As a result, manual page-breaks, multiple output formats and putting -@code{\score} into markups now works. Check out the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2242&content-type=text/vnd.viewcvs-markup,ChangeLog} +@code{\score} into markups now works. Check out the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog} and @ref{Old downloads}. @newsEnd @newsItem -@subsubheading May 31, 2004 +@subheading May 31, 2004 LilyPond 2.3.3 has many internal changes relating to the output backend (PostScript) and page-layout. In addition, it contains a few -bugfixes for recently reported problems. Check out the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2207&content-type=text/vnd.viewcvs-markup,ChangeLog} +bugfixes for recently reported problems. Check out the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog} and @ref{Old downloads}. @newsEnd @newsItem -@subsubheading May 31, 2004 +@subheading May 31, 2004 LilyPond 2.2.2 is out. It has a number of small bugfixes, so upgrade -if any of these errors concern you. Check out the @uref{http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/lilypond/lilypond/ChangeLog?rev=1.2000.2.9,ChangeLog} +if any of these errors concern you. Check out the @uref{http://git.savannah.gnu.org/cgit/lilypond.git/plain/ChangeLog?id=abfdd3c36946e4c341b0abb0f1c6bbdbc12883c1,ChangeLog} or head straight to the @ref{Old downloads}. @newsEnd @newsItem -@subsubheading May 26, 2004 +@subheading May 26, 2004 LilyPond 2.3.2 is out. This release has a lot of internal changes relating to page layout, but also sports experimental fret-diagram code. Check out the @ref{Changes} or head straight to the @@ -4963,7 +5530,7 @@ fret-diagram code. Check out the @ref{Changes} or head straight to the @newsItem -@subsubheading May 9, 2004 +@subheading May 9, 2004 LilyPond 2.3.1 is out. This release has many new and cool features. Check out the @ref{Changes} or head straight to the @ref{Old downloads}. @@ -4971,7 +5538,7 @@ features. Check out the @ref{Changes} or head straight to the @newsItem -@subsubheading May 4, 2004 +@subheading May 4, 2004 Help LilyPond get better, and join in on LilyPond development! This @uref{devel/participating/call-for-help.html,call for @@ -4983,14 +5550,14 @@ Documentation. Of course, any other help is also welcome! @newsItem -@subsubheading May 3, 2004 +@subheading May 3, 2004 LilyPond 2.2.1 has been released. It fixes a handful of bugs. @ref{Old downloads}. @newsEnd @newsItem -@subsubheading April 17, 2004 +@subheading April 17, 2004 LilyPond 2.2.0 is now available on Windows, and should find its way to the Cygwin mirrors soon. @@ -4998,7 +5565,7 @@ soon. @newsItem -@subsubheading April 12, 2004 +@subheading April 12, 2004 LilyPond 2.3.0 is the first release in the 2.3 cycle. The focus for 2.3 is page layout, so instrumentalists can force parts to have page breaks at sane turning @@ -5009,14 +5576,14 @@ More info in the @ref{Changes}. @newsItem -@subsubheading April 8, 2004 +@subheading April 8, 2004 A French article on the new LilyPond release appeared on @uref{http://linuxfr.org/2004/04/08/15968.html,linuxfr.org}. @newsEnd @newsItem -@subsubheading April 8, 2004 +@subheading April 8, 2004 Binaries for LilyPond 2.2.0 are available for MacOS X, Slackware, Mandrake and Debian Woody. @ref{Old downloads} @@ -5024,7 +5591,7 @@ MacOS X, Slackware, Mandrake and Debian Woody. @newsItem -@subsubheading April 1, 2004 +@subheading April 1, 2004 LilyPond 2.2.0 is out! This new stable version has completely revamped support for for orchestral score formatting, cue notes, font size management, lyric formatting, @@ -5035,7 +5602,7 @@ the @miscLink{announce-v2.2,announcement} or skip to the @newsItem -@subsubheading March 31, 2004 +@subheading March 31, 2004 LilyPond 2.1.37 has build fixes for Cygwin and SUSE, bugfixes for part-combining and chord tremolos and even more documentation polish. This should be the final release @@ -5046,7 +5613,7 @@ candidate; expect only regression bugs to be fixed before @newsItem -@subsubheading March 30, 2004 +@subheading March 30, 2004 LilyPond 2.1.36 has many fixes in the user manual. @ref{Old downloads}. @@ -5054,7 +5621,7 @@ the user manual. @newsItem -@subsubheading March 28, 2004 +@subheading March 28, 2004 LilyPond 2.1..35 fixes a slew of bugs, and has the @code{raggedlast} option, which causes paragraph like line breaking for scores. More info in the @@ -5064,14 +5631,14 @@ paragraph like line breaking for scores. More info in the @newsItem -@subsubheading March 22, 2004 +@subheading March 22, 2004 LilyPond 2.1.34 fixes minor bugs, and has more rewriting. @ref{Old downloads}. @newsEnd @newsItem -@subsubheading March 21, 2004 +@subheading March 21, 2004 LilyPond 2.1.33 fixes a serious bug, and a few other irritations. @ref{Old downloads} @@ -5079,7 +5646,7 @@ irritations. @newsItem -@subsubheading March 20, 2004 +@subheading March 20, 2004 LilyPond 2.1.32 has more rewriting in the user manual. There is also an experimental implementation of optimal page breaking (Postscript backend @@ -5089,7 +5656,7 @@ only). @newsItem -@subsubheading March 15, 2004 +@subheading March 15, 2004 LilyPond 2.1.31 is out. It has fixes the alignment of bass figures and spurious dynamic warnings in MIDI. New attractions include rewritten font-selection routines. See @@ -5100,7 +5667,7 @@ the @newsItem -@subsubheading March 14, 2004 +@subheading March 14, 2004 The @uref{http://linuxmusician.com/index.php?option=articles&task=viewarticle&artid=10,linuxmusician.com interview} made the @uref{http://slashdot.org/article.pl?sid=04/03/13/2054227&mode=thread&tid=141&tid=188,slashdot @@ -5109,7 +5676,7 @@ frontpage!}. @newsItem -@subsubheading March 11, 2004 +@subheading March 11, 2004 @uref{http://linuxmusician.com,linuxmusician.com} is running an @uref{http://linuxmusician.com/index.php?option=articles&task=viewarticle&artid=10,interview} @@ -5119,7 +5686,7 @@ authors of LilyPond. @newsItem -@subsubheading March 11, 2004 +@subheading March 11, 2004 LilyPond 2.1.30 has editorial fixes for the manual, and experimental support for page layout in the PostScript backend. See the @@ -5129,7 +5696,7 @@ backend. See the @newsItem -@subsubheading March 9, 2004 +@subheading March 9, 2004 LilyPond 2.1.29 fixes a couple of MIDI bugs, and has experimental support for producing titles with @code{markup}. @@ -5137,7 +5704,7 @@ experimental support for producing titles with @newsItem -@subsubheading February 29, 2004 +@subheading February 29, 2004 In LilyPond 2.1.28 Scheme property functions may be used argument to @code{set!}. In addition, parts of the manual have been proofread and corrected in this release. See the @@ -5147,7 +5714,7 @@ have been proofread and corrected in this release. See the @newsItem -@subsubheading February 24, 2004 +@subheading February 24, 2004 LilyPond 2.1.27 takes into account instrument transpositions when quoting other voices. This release also fixes a number of lyrics related bugs. See the @@ -5157,7 +5724,7 @@ of lyrics related bugs. See the @newsItem -@subsubheading February 23, 2004 +@subheading February 23, 2004 LilyPond 2.1.26 has a new, experimental feature for quoting other voices in instrumental parts. This can be used to produce cue notes. More information in the @@ -5167,7 +5734,7 @@ produce cue notes. More information in the @newsItem -@subsubheading February 18, 2004 +@subheading February 18, 2004 LilyPond 2.1.25 fixes many bugs, and changes the conventions for altering accidental rules. @ref{Old downloads} @@ -5175,7 +5742,7 @@ for altering accidental rules. @newsItem -@subsubheading February 16, 2004 +@subheading February 16, 2004 LilyPond 2.1.24 has a big internal rewrite. One of its practical consequences is that @code{\with} now also works with @code{Score} @@ -5189,7 +5756,7 @@ More information in the @newsItem -@subsubheading February 13, 2004 +@subheading February 13, 2004 LilyPond 2.1.22 has a simplification of the @code{\property} syntax: it is shorter and more consistent now. More information in the @@ -5199,7 +5766,7 @@ shorter and more consistent now. More information in the @newsItem -@subsubheading February 12, 2004 +@subheading February 12, 2004 In LilyPond 2.1.21, output tweaks can be done at multiple levels of the context hierarchy. In addition, it has a bunch of bugfixes, @@ -5210,7 +5777,7 @@ improvements in the documentation. More information in the @newsItem -@subsubheading February 9, 2004 +@subheading February 9, 2004 LilyPond 2.1.20 has MIDI output for drums. It also sports a completely rewritten lilypond-book script, which is cleaner, shorter, and faster. @@ -5222,7 +5789,7 @@ More information in the @newsItem -@subsubheading February 5, 2004 +@subheading February 5, 2004 LilyPond 2.1.19 has rewritten support for drum notation. This release also makes some long-standing cleanups: the removal of @code{Thread} (all @@ -5235,7 +5802,7 @@ More information in the @newsItem -@subsubheading February 4, 2004 +@subheading February 4, 2004 LilyPond 2.1.18 is out. This release has the new part-combiner installed by default, and a similar implementation of @code{autochange}. More information @@ -5246,7 +5813,7 @@ in the @newsItem -@subsubheading February 2, 2004 +@subheading February 2, 2004 LilyPond 2.1.17 is out. It adds texts (solo, a due) for the part combiner. It also reinstates the @option{--safe} option which prevents havoc by Scheme exploits. More @@ -5256,7 +5823,7 @@ information in the @newsItem -@subsubheading January 28, 2004 +@subheading January 28, 2004 LilyPond 2.1.16 is out; its main feature is that it fixes the autobeams gaffe of 2.1.15. The part-combiner has been tested successfully on larger pieces. In the near future, @@ -5269,7 +5836,7 @@ the @newsItem -@subsubheading January 26, 2004 +@subheading January 26, 2004 LilyPond 2.1.15 further improves the part-combiner, and fixes many bugs, among others in pedal brackets and finger positioning. More information in @@ -5279,7 +5846,7 @@ the @newsItem -@subsubheading January 21, 2004 +@subheading January 21, 2004 LilyPond 2.1.14 has the first release of the new part combiner. If you have scores that use part-combining, please consider giving it a test-run. In addition @@ -5291,7 +5858,7 @@ the @newsItem -@subsubheading January 20, 2004 +@subheading January 20, 2004 The lilypond.org domain has been moved to a new server. This will result in better connectivity and more bandwidth. Due to security concerns, the new server does not offer FTP @@ -5300,7 +5867,7 @@ access, but only HTTP downloads. @newsItem -@subsubheading January 20, 2004 +@subheading January 20, 2004 LilyPond 2.1.13 fixes a small but nasty bug in side-positioning placement, and some bugs in tuplet, tie and accidental formatting. This release contains @@ -5310,7 +5877,7 @@ rudimentary work on a new part-combiner. @newsItem -@subsubheading January 19, 2004 +@subheading January 19, 2004 LilyPond 2.1.12 fixes many bugs and improves formatting of ottava brackets. More information in the @@ -5319,15 +5886,15 @@ the @newsItem -@subsubheading January 18, 2004 +@subheading January 18, 2004 LilyPond 2.1.11 is now also available for Windows! For downloading, go -@uref{http://www.inf.bme.hu/~berti/lilypond/,here}. +@uref{https://web.archive.org/web/20040204191423/http://www.inf.bme.hu/~berti/lilypond/,here}. @newsEnd @newsItem -@subsubheading January 17, 2004 +@subheading January 17, 2004 In 2.1.11, the mechanism for setting staff size and page is much simplified. In addition there are improvements in the notehead shape, and there is @@ -5338,7 +5905,7 @@ More information in the @newsItem -@subsubheading January 16, 2004 +@subheading January 16, 2004 LilyPond 2.1.10 has a load of bugfixes and a shorter syntax for octave checks. More information in the @@ -5347,7 +5914,7 @@ information in the @newsItem -@subsubheading January 13, 2004 +@subheading January 13, 2004 LilyPond 2.1.9 has a new mechanism for adding lyrics to melodies. It is now possible to have different melismatic variations for each stanza. More @@ -5357,7 +5924,7 @@ information in the @newsItem -@subsubheading January 9, 2004 +@subheading January 9, 2004 LilyPond 2.1.8 has an important new feature: it is now possible to use @code{\property} to tune the appearance of spanning objects like @code{StaffSymbol} and @@ -5370,7 +5937,7 @@ More information in the @newsItem -@subsubheading January 7, 2004 +@subheading January 7, 2004 An update to the stable branch, version 2.0.2, was released today. It contains a couple of minor bugfixes. @ref{Old downloads} @@ -5378,7 +5945,7 @@ minor bugfixes. @ref{Old downloads} @newsItem -@subsubheading January 6, 2004 +@subheading January 6, 2004 LilyPond 2.1.7 continues to improve the layout of the Schubert test piece; this release focuses on dot placement and multi measure rests centering. @@ -5388,7 +5955,7 @@ More information in the @newsItem -@subsubheading January 4, 2004 +@subheading January 4, 2004 LilyPond 2.1.6 continues to improve the layout of lyrics. More information in the @uref{http://lilypond.org/doc/v2.1/Documentation/topdocs/out-www/NEWS.html,release @@ -5397,7 +5964,7 @@ notes} and download @uref{install/#2.1,here}. @newsItem -@subsubheading January 2, 2004 +@subheading January 2, 2004 In LilyPond 2.1.5, the lyric alignment is completely revamped, and now matches my Edition Peters version of the Schubert song Sängers Morgen. More information in the @ref{Changes} and @@ -5406,7 +5973,7 @@ download @uref{install/#2.1,here}. @newsItem -@subsubheading December 30, 2003 +@subheading December 30, 2003 LilyPond 2.1.4 is released. Font shapes and line thickness are now truly different for different staff sizes, thus lending an engraved look to scores printed in smaller type too. See the @@ -5415,7 +5982,7 @@ an engraved look to scores printed in smaller type too. See the @newsItem -@subsubheading December 23, 2003 +@subheading December 23, 2003 LilyPond 2.1.3 released. Interpreting and formatting is now done while parsing the file. This allows for Scheme manipulation of music, and could @@ -5426,7 +5993,7 @@ to implement this are welcome!) See the @newsItem -@subsubheading December 17, 2003 +@subheading December 17, 2003 LilyPond 2.1.2 released. This release has a new mechanism for setting font sizes, which combines different font design sizes and continuous font @@ -5436,7 +6003,7 @@ scaling. See the @newsItem -@subsubheading December 16, 2003 +@subheading December 16, 2003 LilyPond 2.1.1 released. This release wraps together all the small fixes made during Han-Wen's absence. See the @@ -5445,7 +6012,7 @@ Han-Wen's absence. See the @newsItem -@subsubheading October 11, 2003 +@subheading October 11, 2003 LilyPond 2.1.0 released. See the @ref{Changes} and download @uref{install/#2.1,here}. @@ -5453,16 +6020,16 @@ download @uref{install/#2.1,here}. @newsItem -@subsubheading October 11, 2003 +@subheading October 11, 2003 LilyPond 2.0.1 binaries for Mandrake 9.1 available from -@uref{http://rpm.nyvalls.se/sound9.1.html,here} +@uref{https://web.archive.org/web/20031006165051/http://rpm.nyvalls.se/sound9.1.html,here} thanks to Heikki Junes. @newsEnd @newsItem -@subsubheading October 9, 2003 +@subheading October 9, 2003 LilyPond 2.0.1 binaries for Slackware 9 available from @uref{install/#2.0,here}, thanks to Ricardo Hoffman. @@ -5470,7 +6037,7 @@ thanks to Ricardo Hoffman. @newsItem -@subsubheading October 5, 2003 +@subheading October 5, 2003 LilyPond 2.0.1 binaries are available for Macos X, many thanks to Matthias Neeracher. @ref{Old downloads} @@ -5478,7 +6045,7 @@ Matthias Neeracher. @newsItem -@subsubheading October 4, 2003 +@subheading October 4, 2003 LilyPond 2.0.1 binaries are available for Windows (Cygwin version 1.5). @ref{Old downloads}. Thanks to Bertalan @@ -5487,7 +6054,7 @@ Fodor, our new Cygwin maintainer! @newsItem -@subsubheading September 29, 2003 +@subheading September 29, 2003 LilyPond 2.0.1 is released. It contains minor bugfixes. See the @ref{Changes} @@ -5496,16 +6063,16 @@ or download @uref{install/#2.0,here} directly. @newsItem -@subsubheading September 27, 2003 +@subheading September 27, 2003 PlanetCCRMA has been updated to include LilyPond 2.0. Go -@uref{http://www-ccrma.stanford.edu/planetccrma/software/soundapps.html#lilypond, +@uref{http://ccrma.stanford.edu/planetccrma/software/soundapps.html#SECTION000621700000000000000, here} to download. Thanks to Fernando Pablo Lopez-Lezcano! @newsEnd @newsItem -@subsubheading September 24, 2003 +@subheading September 24, 2003 LilyPond 2.0.0 is released. The focus of this release is cleanups of the syntax: entering music is now much easier and more efficient. Read the announcement @@ -5515,7 +6082,7 @@ now much easier and more efficient. Read the announcement @newsItem -@subsubheading September 24, 2003 +@subheading September 24, 2003 LilyPond 1.9.10 is released. This is the final LilyPond 2.0 release candidate. Check the @ref{Changes} and @@ -5524,7 +6091,7 @@ download @uref{install/,here}. @newsItem -@subsubheading September 23, 2003 +@subheading September 23, 2003 LilyPond 1.9.9 is released. This is the second LilyPond 2.0 prerelease. Check the @ref{Changes} and @@ -5533,7 +6100,7 @@ download @uref{install/,here}. @newsItem -@subsubheading September 19, 2003 +@subheading September 19, 2003 LilyPond 1.9.8 is released. This is the first LilyPond 2.0 prerelease. Check the @ref{Changes} and @@ -5542,7 +6109,7 @@ download @uref{install/,here}. @newsItem -@subsubheading September 17, 2003 +@subheading September 17, 2003 LilyPond 1.9.7 is released. LilyPond now has support for quarter tone accidentals! @ref{Old downloads} @@ -5550,7 +6117,7 @@ now has support for quarter tone accidentals! @newsItem -@subsubheading September 16, 2003 +@subheading September 16, 2003 LilyPond 1.9.6 is released. It has a lot of minor fixes and updates. @ref{Old downloads} @@ -5558,7 +6125,7 @@ It has a lot of minor fixes and updates. @newsItem -@subsubheading September 10, 2003 +@subheading September 10, 2003 LilyPond 1.9.5 is released. With this release, the 1.9 branch is feature complete. After some stabilization and documentation work, 2.0 @@ -5568,7 +6135,7 @@ will be available in a few weeks. @newsItem -@subsubheading September 9, 2003 +@subheading September 9, 2003 LilyPond 1.8.2 is released. This release fixes a couple of minor bugs. @ref{Old downloads} @@ -5576,7 +6143,7 @@ release fixes a couple of minor bugs. @newsItem -@subsubheading September 7, 2003 +@subheading September 7, 2003 LilyPond 1.8 binaries are available for Windows (Cygwin version 1.5). @ref{Old downloads} @@ -5584,7 +6151,7 @@ for Windows (Cygwin version 1.5). @newsItem -@subsubheading August 31, 2003 +@subheading August 31, 2003 LilyPond 1.9.4 is released. @emph{This is an experimental release}: read the @uref{http://lists.gnu.org/archive/html/lilypond-devel/2003-08/msg00133.html,announcement} @@ -5593,14 +6160,14 @@ before trying. @newsItem -@subsubheading August 31, 2003 +@subheading August 31, 2003 LilyPond 1.8 binaries for slackware available. Get them @uref{install/,here}. @newsEnd @newsItem -@subsubheading August 31, 2003 +@subheading August 31, 2003 LilyPond 1.9.3 is released. This release supports tagging for music version control, and has better fingering placement flexibility. Read the @@ -5609,7 +6176,7 @@ fingering placement flexibility. Read the @newsItem -@subsubheading August 28, 2003 +@subheading August 28, 2003 LilyPond 1.9.2 is released. Read the @ref{Changes} and get it @uref{download#1.9,here}. @@ -5617,7 +6184,7 @@ LilyPond 1.9.2 is released. Read the @newsItem -@subsubheading August 26, 2003 +@subheading August 26, 2003 LilyPond 1.9.1 is released. Read the @ref{Changes} and get it @uref{download#1.9,here}. @@ -5625,7 +6192,7 @@ LilyPond 1.9.1 is released. Read the @newsItem -@subsubheading August 25, 2003 +@subheading August 25, 2003 The LilyPond 1.9 development release is available. Read the @ref{Changes} and get it @uref{download#1.9,here}. @@ -5633,54 +6200,54 @@ The LilyPond 1.9 development release is available. Read the @newsItem -@subsubheading August 25, 2003 +@subheading August 25, 2003 Mandrake 9.1 RPMS available, get them -@uref{http://rpm.nyvalls.se/sound9.1.html,here}. +@uref{https://web.archive.org/web/20031006165051/http://rpm.nyvalls.se/sound9.1.html,here}. @newsEnd @newsItem -@subsubheading August 21, 2003 +@subheading August 21, 2003 LilyPond 1.8.1 was released. Get it @uref{install/,here}, or read the @ref{Changes}. @newsEnd @newsItem -@subsubheading August 18, 2003 +@subheading August 18, 2003 PlanetCCRMA (eg. RedHat 8 and 9) has been updated to 1.8. -Download @uref{http://www-ccrma.stanford.edu/planetccrma/software/soundapps.html#lilypond,here.} +Download @uref{http://ccrma.stanford.edu/planetccrma/software/soundapps.html#SECTION000621700000000000000,here.} @newsEnd @newsItem -@subsubheading August 7, 2003 +@subheading August 7, 2003 LilyPond 1.8 is released. Read @ref{Changes} and get it @uref{install/,here}. @newsEnd @newsItem -@subsubheading August 7, 2003 +@subheading August 7, 2003 New website went live! @newsEnd @newsItem -@subsubheading August 6, 2003 +@subheading August 6, 2003 Announced new website. @newsEnd @newsItem -@subsubheading August 1, 2003 +@subheading August 1, 2003 LilyPond 1.7.30 released. @newsEnd @newsItem -@subsubheading July 30, 2003 +@subheading July 30, 2003 Website: present @uref{about/automated-engraving/index.html,treatise} about music engraving, music printing software, and LilyPond's unique faculties. @@ -5688,7 +6255,7 @@ unique faculties. @newsItem -@subsubheading July 29, 2003 +@subheading July 29, 2003 1.7.29 - release candidate 4 has been released. Packages for Red Hat, Debian, Cygwin are @uref{install/,available}. @newsEnd diff --git a/Documentation/web/server/lilypond.org.htaccess b/Documentation/web/server/lilypond.org.htaccess index 5e7dfae3d9..d6bc37fb59 100644 --- a/Documentation/web/server/lilypond.org.htaccess +++ b/Documentation/web/server/lilypond.org.htaccess @@ -16,6 +16,10 @@ RewriteEngine On +# Permanent redirect from www.lilypond.org to lilypond.org +RewriteCond "%{HTTP_HOST}" "^www\.(.+)$" [NC] +RewriteRule "^/?(.*)$" "http://%1/$1" [R=301,L,NE] + # Deny following of symlinks by robots. # HTTrack is a known offender. # better yet, to redirect this to page that tells adminstrator @@ -37,7 +41,6 @@ RedirectMatch ^/documentation/$ /doc # RedirectMatch ^/bugs /bug-reports #RedirectMatch ^/bugs http://code.google.com/p/lilypond/issues/list -RedirectMatch ^/wiki http://wiki.lilynet.net # the new website already has an /authors #RedirectMatch ^/authors /doc/Documentation/topdocs/AUTHORS # the new website has news on the main page @@ -46,14 +49,17 @@ RedirectMatch ^/stable /doc/stable # the new website has a dedicated page for development. #RedirectMatch ^/development /doc/development -#old# default doc dir -RedirectMatch ^/doc/*$ /doc/v2.16 -# make attempt at `latest' symlink avoid ^v catch-all doc fix rule below -RedirectMatch ^/doc//*latest/*(.*)$ /doc/v2.17/$1 -RedirectMatch ^/doc//*development/*(.*)$ /doc/v2.17/$1 -RedirectMatch ^/doc//*stable/*(.*)$ /doc/v2.16/$1 -RedirectMatch ^/doc//*([^v].*)$ /doc/v2.16/$1 -RedirectMatch ^(/Documentation.*)$ /doc/v2.16$1 +# Main doc URL redirects +RedirectMatch ^/doc/?$ /manuals +RedirectMatch ^/doc/stable/?$ /manuals +RedirectMatch ^/doc/development/?$ /development + +# Allow to use deep links to latest stable or development docs +RedirectMatch ^/doc//*latest/*(.*)$ /doc/v2.19/$1 +RedirectMatch ^/doc//*development/*(.*)$ /doc/v2.19/$1 +RedirectMatch ^/doc//*stable/*(.*)$ /doc/v2.18/$1 +RedirectMatch ^/doc//*([^v].*)$ /doc/v2.18/$1 +RedirectMatch ^(/Documentation.*)$ /doc/v2.18$1 RedirectMatch ^/index$ / # fix root calculation: no double slashes @@ -61,7 +67,7 @@ RedirectMatch ^/index$ / ########################################### -## Rewrite all non-existing files at toplevel to the /web/ dir, so our +## Rewrite all non-existing files at toplevel to the /website/ dir, so our ## internal structure for rsync doesn't have to be changed. ## This works for the current/old site as well as the new one. @@ -70,7 +76,7 @@ RewriteBase / SetEnvIf REQUEST_URI .* WEB=/website -# Rewrite empty to /web +# Rewrite empty to /website RewriteCond %{REQUEST_URI} ^/*$ RewriteRule ^(/*)$ %{ENV:WEB}/ [QSA,L] @@ -80,12 +86,12 @@ RewriteCond %{REQUEST_URI} ^/?[^/]+[.]css$ RewriteCond %{REQUEST_FILENAME} !-f # ...and does not match an existing directory RewriteCond %{REQUEST_FILENAME} !-d -# ...prefix with web +# ...prefix with website RewriteRule ^(.+)$ %{ENV:WEB}/$1 [QSA,L] # Request without trailing slash RewriteCond %{REQUEST_URI} !.*/$ -# ...that would access a directory in /web +# ...that would access a directory in /website RewriteCond %{DOCUMENT_ROOT}%{ENV:WEB}%{REQUEST_URI} -d # ...and does not start with /web RewriteCond %{REQUEST_URI} !^%{ENV:WEB} @@ -95,7 +101,7 @@ RewriteCond %{REQUEST_URI} !^/doc$ # ...add trailing slash for [menu] and to avoid /web/ in browser url RewriteRule ^(.+)$ http://%{HTTP_HOST}/$1/ [R,QSA,L] -# Request that does not start with /web +# Request that does not start with /website RewriteCond %{REQUEST_URI} !^/website RewriteCond %{REQUEST_URI} !^%{ENV:WEB} # ...and does not start with /doc/ @@ -109,6 +115,9 @@ RewriteCond %{REQUEST_FILENAME} !-d # ..prefix with /web RewriteRule ^(.+)$ %{ENV:WEB}/$1 [QSA,L] +## Redirect the old web/ to the homepage +RedirectMatch 301 ^/web/.* / + ########################################### # latin1 version copied to web and doc/2.x @@ -121,9 +130,18 @@ AddCharset utf-8 .fr AddCharset utf-8 .nl AddCharset utf-8 .txt -# fix broken auto language selection for Hungarian +# Add extensions for language negotiation +# See: https://www.w3.org/International/questions/qa-apache-lang-neg +AddLanguage ca .ca +AddLanguage cs .cs +AddLanguage de .de +AddLanguage es .es +AddLanguage fr .fr AddLanguage hu .hu - +AddLanguage it .it +AddLanguage ja .ja +AddLanguage nl .nl +AddLanguage zh .zh # FIXME: separate this from the main "root" .htaccess material diff --git a/Documentation/web/server/robots.txt b/Documentation/web/server/robots.txt index ccc8ed800d..d1879c94ce 100644 --- a/Documentation/web/server/robots.txt +++ b/Documentation/web/server/robots.txt @@ -21,3 +21,7 @@ Disallow: /doc/v2.12/ Disallow: /doc/v2.13/ Disallow: /doc/v2.14/ Disallow: /doc/v2.15/ +Disallow: /doc/v2.16/ +Disallow: /doc/v2.17/ + +Disallow: /web/ diff --git a/Documentation/web/server/tweets.xml b/Documentation/web/server/tweets.xml index 33e761d245..5ff901b29c 100644 --- a/Documentation/web/server/tweets.xml +++ b/Documentation/web/server/tweets.xml @@ -4,10 +4,10 @@ href="http://www.lilypondblog.org">here</a>! Anyone can follow and leave comments on the blog. To contribute, contact <a - href="mailto:janek.lilypond@gmail.com">Janek Warchoł</a>. + href="mailto:ul@openlilylib.org">Urs Liska</a>. - Adam Spiers has build a web site which uses LilyPond to dynamically + Adam Spiers has built a web site which uses LilyPond to dynamically generate images of chords and scales called <a href="http://scalematcher.adamspiers.org/">Scale matcher</a>. @@ -22,11 +22,12 @@ Turkish Ebook <a href="http://acim.name.tr/lilypond/my_EBook_Promotion/index.php"> "GNU/LilyPond, Özgür Bir Nota Yazma Programı"</a>. - - Aurélien Bello, has re-orchestrated a 100-minute version of "Der - Ring des Nibelungen" for children, being performed in Berlin on the - 5th and 6th of April 2014. Click - <a href="http://www.rsb-online.de/content/konzerte/wagnerzyklus-10-13/wagner-fuer-kinder/index_ger.html"> - here </a> for more details. - + + Aurélien Bello's reduced version of "Der Rosenkavalier" to be + performed on the + <a href="http://www.festspielhaus.de/veranstaltung/der-kleine-rosenkavalier-02-04-2015-1100/"> + 2nd and 6th of April 2015 </a>in Baden-Baden and again on the + <a href="http://www.berliner-philharmoniker.de/konzerte/kalender/details/21070/"> + 26th April </a>in Berlin. + diff --git a/Documentation/zh/macros.itexi b/Documentation/zh/macros.itexi index 540cafe06e..5289304b13 100644 --- a/Documentation/zh/macros.itexi +++ b/Documentation/zh/macros.itexi @@ -1,6 +1,6 @@ @c -*- coding: utf-8; mode: texinfo; -*- @ignore - Translation of GIT committish: 8052856914abafa960a0518ca8032b681c9d0588 + Translation of GIT committish: 8bc025dac3f085731712be31ec36acd5d08c357d When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' diff --git a/Documentation/zh/search-box.ihtml b/Documentation/zh/search-box.ihtml index 8786852cc7..8ae6c02b0e 100644 --- a/Documentation/zh/search-box.ihtml +++ b/Documentation/zh/search-box.ihtml @@ -14,11 +14,11 @@ search for a while and have a redirection from "v2.15" to "v2.17". diff --git a/Documentation/zh/translations.itexi b/Documentation/zh/translations.itexi index ed86a34394..48e5871a2e 100644 --- a/Documentation/zh/translations.itexi +++ b/Documentation/zh/translations.itexi @@ -16,7 +16,7 @@ td { border: 1px solid black; text-align: center; } @end html @end ifhtml -@emph{最近更新 Wed Dec 18 12:23:14 UTC 2013 +@emph{最近更新 Sat Jul 2 15:06:05 UTC 2016 } @multitable @columnfractions 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 @@ -30,7 +30,7 @@ LilyPond -- 人人的乐谱软件 @item 章节标题 @* -616 +629 @tab Ben Luo @* Anthony Fok @@ -49,11 +49,11 @@ Anthony Fok @ifhtml @html -是 +部分 @end html @end ifhtml @ifnothtml -是 +部分 @end ifnothtml @tab GDP 前 @item @@ -78,17 +78,17 @@ Anthony Fok @ifhtml @html -不适用 +是 @end html @end ifhtml @ifnothtml -不适用 +是 @end ifnothtml @tab GDP 前 @item 简介 @* -4937 +5815 @tab Ben Luo @* Anthony Fok @@ -107,17 +107,17 @@ Anthony Fok @ifhtml @html -不适用 +部分 @end html @end ifhtml @ifnothtml -不适用 +部分 @end ifnothtml @tab GDP 前 @item 下载 @* -1201 +1158 @tab Ben Luo @* Anthony Fok @@ -136,17 +136,17 @@ Anthony Fok @ifhtml @html -不适用 +部分 @end html @end ifhtml @ifnothtml -不适用 +部分 @end ifnothtml @tab GDP 前 @item 手册 @* -1284 +1314 @tab Ben Luo @tab Anthony Fok @tab @@ -163,7 +163,7 @@ Anthony Fok @ifhtml @html -部分 +部分 @end html @end ifhtml @ifnothtml @@ -173,7 +173,7 @@ Anthony Fok @item 社区 @* -3073 +3524 @tab Ben Luo @* Anthony Fok @@ -192,11 +192,11 @@ Anthony Fok @ifhtml @html -不适用 +部分 @end html @end ifhtml @ifnothtml -不适用 +部分 @end ifnothtml @tab GDP 前 @end multitable diff --git a/Documentation/zh/web.texi b/Documentation/zh/web.texi index e0b5afb30a..c2a5daa8ab 100644 --- a/Documentation/zh/web.texi +++ b/Documentation/zh/web.texi @@ -15,7 +15,7 @@ @c `Web' was imported 2009-08-05 with git commit b938d71... @c @macro copyrightDeclare -@c Copyright @copyright{} 2009--2012 by the authors. +@c Copyright @copyright{} 2009--2015 by the authors. @c @end macro @c Translators: Ben Luo, Anthony Fok @@ -36,7 +36,7 @@ @end ignore @copying -Copyright @copyright{} 2009--2012 by the authors. +Copyright @copyright{} 2009--2015 by the authors. @c next line is necessary for broken pre-4.13 texinfo's @c install-info, so leave it there until we officially diff --git a/Documentation/zh/web/community.itexi b/Documentation/zh/web/community.itexi index f073b63069..5e3efa38ca 100644 --- a/Documentation/zh/web/community.itexi +++ b/Documentation/zh/web/community.itexi @@ -1,7 +1,7 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: zh -*- @c This file is part of web.texi @ignore - Translation of GIT committish: 5239637b8f00a0307b860dac05189f297c7c198a + Translation of GIT committish: 8bc025dac3f085731712be31ec36acd5d08c357d When revising a translation, copy the HEAD committish of the version that you are working on. See TRANSLATION for details. @@ -133,7 +133,7 @@ in your own works. See what other people have written, and add your own! @example -@uref{http://lsr.dsi.unimi.it} +@uref{http://lsr.di.unimi.it} @end example Particularly instructive examples from LSR are included in our @@ -205,7 +205,7 @@ The easiest way to keep touch is by reading our community newsletter, the LilyPond Report: @example -@uref{http://news.lilynet.net} +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net} @end example @subsubheading 发行版邮件列表: @code{info-lilypond@@gnu.org} @@ -766,7 +766,7 @@ This release's lilypond-book tests. @itemize @item @uref{http://lilypond.org/test, Comparisons between regression tests} -@item @uref{http://lilypond.org/download/binaries/test-output/, +@item @uref{http://lilypond.org/downloads/binaries/test-output/, Archive of all regression tests} @end itemize diff --git a/Documentation/zh/web/download.itexi b/Documentation/zh/web/download.itexi index 25dcd2133d..ea9a0bdd70 100644 --- a/Documentation/zh/web/download.itexi +++ b/Documentation/zh/web/download.itexi @@ -1,6 +1,6 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: zh -*- @ignore - Translation of GIT committish: 9402161bd6fe04e40ab205054864ebe85c5a4724 + Translation of GIT committish: 8bc025dac3f085731712be31ec36acd5d08c357d When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' diff --git a/Documentation/zh/web/introduction.itexi b/Documentation/zh/web/introduction.itexi index 5876d4cee7..0de0609928 100644 --- a/Documentation/zh/web/introduction.itexi +++ b/Documentation/zh/web/introduction.itexi @@ -1,6 +1,6 @@ @c -*- coding: utf-8; mode: texinfo; documentlanguage: zh -*- @ignore - Translation of GIT committish: 8052856914abafa960a0518ca8032b681c9d0588 + Translation of GIT committish: 8bc025dac3f085731712be31ec36acd5d08c357d When revising a translation, copy the HEAD committish of the version that you are working on. For details, see the Contributors' @@ -582,7 +582,7 @@ piano keyboard showing which keys to press to help beginners learn how to read sheet music. @item -@uref{http://www.adoromusicpub.com/, Adoro Music Publishing}, +@uref{https://twitter.com/adoromusic, Adoro Music Publishing}, high-quality scores of sacred music, available for immediate download or in traditional paper format. @@ -626,7 +626,7 @@ If you've already decided to try LilyPond, first read about our @uref{http://www.linux-magazine.com,Linux Magazine} publishes an article titled -@uref{http://www.linux-magazine.com/w3/issue/126/088-090_projects.pdf, +@uref{http://www.linux-magazine.com/content/download/61706/482546/version/1/file/088-090_projects.pdf, Projects on the Move}. It is an introductory article on MuseScore, LilyPond and Chordii. Author Carla Schroder states @qq{LilyPond is driven from the command line, but don’t let the lack of a GUI scare @@ -659,7 +659,7 @@ talk about using software to maintain their libraries. @item 2009å¹´6月 -In an @uref{http://news.lilynet.net/Free-Music-Now, article} +In an @uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/Free-Music-Now, article} published in the French @emph{National Conservatory Parent Association}'s yearly magazine, French composer and LilyPond contributor Valentin Villenave explains how Free licenses, and @@ -822,7 +822,7 @@ typesetting].} @divClass{testimonial-item} -@subsubheading Chris Snyder, @uref{http://www.adoromusicpub.com/, Adoro Music Publishing} +@subsubheading Chris Snyder, @uref{https://twitter.com/adoromusic, Adoro Music Publishing} @qq{The way that music is entered for LilyPond causes me to think in a more musical way -- there have been times when I've been stumped as @@ -1253,7 +1253,7 @@ language. LilyKDE3 for KDE 3.5 and lilypond-KDE4 for KDE 4.1 only. @item -@uref{http://noteedit.berlios.de,NoteEdit}, which imported +@uref{https://sourceforge.net/projects/noteedit.berlios/,NoteEdit}, which imported @uref{http://www.musicxml.com/xml.html,MusicXML}, has been forked into @uref{http://vsr.informatik.tu-chemnitz.de/staff/jan/nted/nted.xhtml,NtEd} diff --git a/Documentation/zh/web/manuals.itexi b/Documentation/zh/web/manuals.itexi index 63fd22356c..ef23742c99 100644 --- a/Documentation/zh/web/manuals.itexi +++ b/Documentation/zh/web/manuals.itexi @@ -133,7 +133,7 @@ LilyPond 是 @strong{基于文本} 的音乐雕版印刷程序。请您先阅读 针对非英语读者的翻译情况。 @item -@uref{http://lsr@/.dsi@/.unimi@/.it,LilyPond Snippet Repository}: +@uref{http://lsr@/.di@/.unimi@/.it,LilyPond Snippet Repository}: 用户创建的例子、窍门和秘诀。 @item @@ -304,7 +304,7 @@ LilyPond,同时也用简单的术语解释了一些关键的概念。您应该 @subheading 片断 Snippets 这里显示从 -@uref{http://lsr@/.dsi@/.unimi@/.it, +@uref{http://lsr@/.di@/.unimi@/.it, LilyPond 片断库 (LilyPond Snippet Repository@comma{} LSR)} 精选出来的一些 LilyPond 片断。所有的片断都属于公有领域。 diff --git a/Documentation/zh/web/news-front.itexi b/Documentation/zh/web/news-front.itexi index efa7817f57..8373eaf839 100644 --- a/Documentation/zh/web/news-front.itexi +++ b/Documentation/zh/web/news-front.itexi @@ -65,7 +65,7 @@ see for yourself how close (or how far?) are we from matching the quality of hand-engraved scores. Come -@uref{http://news.lilynet.net/?The-LilyPond-Report-26, read +@uref{http://web.archive.org/web/20110325004849/http://news.lilynet.net/?The-LilyPond-Report-26, read LilyPond Report 26} now; comments and contributions are warmly encouraged! diff --git a/GNUmakefile.in b/GNUmakefile.in index 74f2551393..abc7ecaf6a 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -253,12 +253,18 @@ $(tree-share-prefix)/mf-link-tree: $(tree-share-prefix)/lilypond-force -rm -f $(tree-share-prefix)/fonts/otf/* && \ rm -f $(tree-share-prefix)/fonts/svg/* && \ rm -f $(tree-share-prefix)/fonts/fonts.conf && \ + rm -f $(tree-share-prefix)/fonts/00-lilypond-fonts.conf && \ + rm -f $(tree-share-prefix)/fonts/99-lilypond-fonts.conf && \ rm -f $(tree-share-prefix)/fonts/tfm/* && \ rm -f $(tree-share-prefix)/fonts/type1/* && \ cd $(tree-share-prefix)/fonts/otf && \ - ln -s ../../../../../../mf/$(outconfbase)/*.otf . + ln -s ../../../../../../mf/$(outconfbase)/*.otf . && \ + $(foreach i,$(addprefix $(TEXGYRE_DIR)/,$(TEXGYRE_FILES)), \ + ln -s $i . && ) true -cd $(tree-share-prefix)/fonts && \ - ln -s ../../../../../mf/$(outconfbase)/fonts.conf . + ln -s ../../../../../mf/$(outconfbase)/fonts.conf . && \ + ln -s ../../../../../mf/$(outconfbase)/00-lilypond-fonts.conf . && \ + ln -s ../../../../../mf/$(outconfbase)/99-lilypond-fonts.conf . -cd $(tree-share-prefix)/fonts/svg && \ ln -s ../../../../../../mf/$(outconfbase)/*.svg . -cd $(tree-share-prefix)/fonts/svg && \ diff --git a/INSTALL.txt b/INSTALL.txt index dedfe57602..25572a1616 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -10,6 +10,11 @@ INSTALL - compiling and installing GNU LilyPond 1.2 Requirements 1.2.1 Requirements for running LilyPond 1.2.2 Requirements for compiling LilyPond + Fedora + Linux Mint + OpenSUSE + Ubuntu + Other 1.2.3 Requirements for building documentation 1.3 Getting the source code 1.4 Configuring `make' @@ -35,7 +40,6 @@ INSTALL - compiling and installing GNU LilyPond Building documentation without compiling 1.6.3 Testing LilyPond binary 1.7 Problems - Bison 1.875 Compiling on MacOS X Solaris FreeBSD @@ -78,100 +82,378 @@ unsuccessful, though a workaround is available (see *note LilyDev: 1.2.1 Requirements for running LilyPond --------------------------------------- -Running LilyPond requires proper installation of the following software: +This section contains the list of separate software packages that are +required to run LilyPond. - * DejaVu fonts (http://www.dejavu-fonts.org/) (normally installed by - default) + * DejaVu fonts (http://www.dejavu-fonts.org/) These are normally + installed by default. - * FontConfig (http://www.fontconfig.org/) (2.4.0 or newer) + * FontConfig (http://www.fontconfig.org/) Use version 2.4.0 or newer. - * Freetype (http://www.freetype.org/) (2.1.10 or newer) + * Freetype (http://www.freetype.org/) Use version 2.1.10 or newer. - * Ghostscript (http://www.ghostscript.com) (8.60 or newer) + * Ghostscript (http://www.ghostscript.com) Use version 8.60 or newer. - * Guile (http://www.gnu.org/software/guile/guile.html) (1.8.2 or - newer) + * Guile (http://www.gnu.org/software/guile/guile.html) Use version + 1.8.8. Version 2.x of Guile is not currently supported. - * Pango (http://www.pango.org/) (1.12 or newer) + * Pango (http://www.pango.org/) User version 1.12 or newer. - * Python (http://www.python.org) (2.4 or newer) + * Python (http://www.python.org) Use version 2.4 or newer. + + * International fonts. For example: + + Fedora: + + fonts-arabic + fonts-hebrew + fonts-ja + fonts-xorg-truetype + taipeifonts + ttfonts-ja + ttfonts-zh_CN + + Debian based distributions: + + emacs-intl-fonts + fonts-ipafont-gothic + fonts-ipafont-mincho + xfonts-bolkhov-75dpi + xfonts-cronyx-75dpi + xfonts-cronyx-100dpi + xfonts-intl-.* + + These are normally installed by default and are required only to + create music with international text or lyrics. - International fonts are required to create music with international -text or lyrics. 1.2.2 Requirements for compiling LilyPond ----------------------------------------- -Below is a full list of packages needed to build LilyPond. However, -for most common distributions there is an easy way of installing most -all build dependencies in one go: +This section contains instructions on how to quickly and easily get all +the software packages required to build LilyPond. -Distribution Command --------------------------------------------------------------------------- -Debian, Ubuntu `sudo apt-get build-dep lilypond' -Fedora, RHEL `sudo yum-builddep lilypond' -openSUSE, SLED `sudo zypper --build-deps-only - source-install lilypond' + Most of the more popular Linux distributions only require a few +simple commands to download all the software needed. For others, there +is an explicit list of all the individual packages (as well as where to +get them from) for those that are not already included in your +distributions' own repositories. - * Everything listed in *note Requirements for running LilyPond:: +Fedora +...... - * Development packages for the above items (which should include - header files and libraries). +The following instructions were tested on `Fedora' versions 22 & 23 and +will download all the software required to both compile LilyPond and +build the documentation. - Red Hat Fedora: + * Download and install all the LilyPond build-dependencies + (approximately 700MB); - guile-devel-VERSION - fontconfig-devel-VERSION - freetype-devel-VERSION - pango-devel-VERSION - python-devel-VERSION + sudo dnf builddep lilypond --nogpgcheck - Debian GNU/Linux: + * Download and install additional `build' tools required for + compiling; - guile-VERSION-dev - libfontconfig1-dev - libfreetype6-dev - libpango1.0-dev - pythonVERSION-dev + sudo dnf install autoconf gcc-c++ - * Flex (http://flex.sourceforge.net/) + * Download `texi2html 1.82' directly from: + `http://download.savannah.gnu.org/releases/texi2html/texi2html-1.82.tar.gz'; + + `texi2html' is only required if you intend to compile LilyPond's + own documentation (e.g. to help with any document writing). The + version available in the Fedora repositories is too new and will + not work. Extract the files into an appropriate location and then + run the commands; + + ./configure + make + sudo make install + + This should install `texi2html 1.82' into `/usr/local/bin', which + will normally take priority over `/usr/bin' where the later, + pre-installed versions gets put. Now verify that your operating + system is able to see the correct version of `texi2html'. + + texi2html --version + + * Although not `required' to compile LilyPond, if you intend to + contribute to LilyPond (codebase or help improve the + documentation) then it is recommended that you also need to + install `git'. + + sudo dnf install git + + Also see *note Starting with Git: (lilypond-notation)Starting with + Git. + + * To use the `lily-git.tcl' GUI; + + sudo dnf install tk + + See *note lily-git: (lilypond-notation)lily-git. + + + Note: By default, when building LilyPond's documentation, + `pdfTeX' is be used. However ligatures (fi, fl, ff etc.) may + not be printed in the PDF output. In this case XeTeX can be + used instead. Download and install the `texlive-xetex' + package. + + sudo dnf install texlive-xetex + + The scripts used to build the LilyPond documentation will use + `XeTex' instead of `pdfTex' to generate the PDF documents if + it is available. No additional configuration is required. + +Linux Mint +.......... + +The following instructions were tested on `Linux Mint 17.1' and `LMDE - +Betsy' and will download all the software required to both compile +LilyPond and build the documentation.. + + * Enable the _sources_ repository; + + 1. Using the _Software Sources_ GUI (located under + _Administration_). + + 2. Select _Official Repositories_. + + 3. Check the _Enable source code repositories_ box under the + _Source Code_ section. + + 4. Click the _Update the cache_ button and when it has completed, + close the _Software Sources_ GUI. + + + * Download and install all the LilyPond build-dependencies + (approximately 200MB); + + sudo apt-get build-dep lilypond + + * Download and install additional `build' tools required for + compiling; + + sudo apt-get install autoconf fonts-texgyre texlive-lang-cyrillic + + * Although not `required' to compile LilyPond, if you intend to + contribute to LilyPond (codebase or help improve the + documentation) then it is recommended that you also need to + install `git'. + + sudo apt-get install git + + Also see *note Starting with Git: (lilypond-notation)Starting with + Git. + + * To use the `lily-git.tcl' GUI; + + sudo apt-get install tk + + Also see *note lily-git: (lilypond-notation)lily-git. + + + Note: By default, when building LilyPond's documentation, + `pdfTeX' is be used. However ligatures (fi, fl, ff etc.) may + not be printed in the PDF output. In this case XeTeX can be + used instead. Download and install the `texlive-xetex' + package. + + sudo apt-get install texlive-xetex + + The scripts used to build the LilyPond documentation will use + `XeTex' instead of `pdfTex' to generate the PDF documents if + it is available. No additional configuration is required. + +OpenSUSE +........ + +The following instructions were tested on `OpenSUSE 13.2' and will +download all the software required to both compile LilyPond and build +the documentation. + + * Add the _sources_ repository; + + sudo zypper addrepo -f \ + "http://download.opensuse.org/source/distribution/13.2/repo/oss/" sources + + * Download and install all the LilyPond build-dependencies + (approximately 680MB); + + sudo zypper source-install lilypond + + * Download and install additional `build' tools required for + compiling; + + sudo zypper install make + + * Although not `required' to compile LilyPond, if you intend to + contribute to LilyPond (codebase or help improve the + documentation) then it is recommended that you also need to + install `git'. + + sudo zypper install git + + Also see *note Starting with Git: (lilypond-notation)Starting with + Git. - * FontForge (http://fontforge.sf.net/) (20060125 or newer; 20100501 - or newer is recommended; must be compiled with `--enable-double'. - Failure to do so can lead to poor intersection calculations and - poorly-rendered glyphs.) + * To use the `lily-git.tcl' GUI; + + sudo zypper install tk + + Also see *note lily-git: (lilypond-notation)lily-git. + + + Note: By default, when building LilyPond's documentation, + `pdfTeX' is be used. However ligatures (fi, fl, ff etc.) may + not be printed in the PDF output. In this case XeTeX can be + used instead. Download and install the `texlive-xetex' + package. + + sudo zypper install texlive-xetex + + The scripts used to build the LilyPond documentation will use + `XeTex' instead of `pdfTex' to generate the PDF documents if + it is available. No additional configuration is required. + +Ubuntu +...... + +The following commands were tested on Ubuntu versions `14.04 LTS', +`14.10' and `15.04' and will download all the software required to both +compile LilyPond and build the documentation. + + * Download and install all the LilyPond build-dependencies + (approximately 200MB); + + sudo apt-get build-dep lilypond + + * Download and install additional `build' tools required for + compiling; + + sudo apt-get install autoconf fonts-texgyre texlive-lang-cyrillic + + * Although not `required' to compile LilyPond, if you intend to + contribute to LilyPond (codebase or help improve the + documentation) then it is recommended that you also need to + install `git'. + + sudo apt-get install git + + Also see *note Starting with Git: (lilypond-notation)Starting with + Git. + + * To use the `lily-git.tcl' GUI; + + sudo apt-get install tk + + Also see *note lily-git: (lilypond-notation)lily-git. + + + Note: By default, when building LilyPond's documentation, + `pdfTeX' is be used. However ligatures (fi, fl, ff etc.) may + not be printed in the PDF output. In this case XeTeX can be + used instead. Download and install the `texlive-xetex' + package. + + sudo apt-get install texlive-xetex + + The scripts used to build the LilyPond documentation will use + `XeTex' instead of `pdfTex' to generate the PDF documents if + it is available. No additional configuration is required. + +Other +..... + +The following individual software packages are required just to compile +LilyPond. + + * GNU Autoconf (http://www.gnu.org/software/autoconf) * GNU Bison (http://www.gnu.org/software/bison/) - * GNU Compiler Collection (http://gcc.gnu.org/) (3.4 or newer, 4.X - recommended) + Use version `2.0' or newer. + + * GNU Compiler Collection (http://gcc.gnu.org/) + + Use version `3.4' or newer (`4.x' recommended). + + * Flex (http://flex.sourceforge.net/) + + * FontForge (http://fontforge.sf.net/) + + Use version `20060125' or newer (we recommend using at least + `20100501'); it must also be compiled with the `--enable-double' + switch, else this can lead to inaccurate intersection calculations + which end up with poorly-rendered glyphs in the output. * GNU gettext (http://www.gnu.org/software/gettext/gettext.html) - (0.17 or newer) - * GNU Make (http://www.gnu.org/software/make/) (3.78 or newer) + Use version `0.17' or newer. - * MetaFont (http://metafont.tutorial.free.fr/) (mf-nowin, mf, mfw or - mfont binaries), usually packaged with TeX - (http://www.latex-project.org/ftp.html). + * GNU Make (http://www.gnu.org/software/make/) + + Use version `3.78' or newer. - * MetaPost (http://cm.bell-labs.com/who/hobby/MetaPost.html) (mpost - binary), usually packaged with TeX + * MetaFont (http://metafont.tutorial.free.fr/) + + The `mf-nowin', `mf', `mfw' or `mfont' binaries are usually + packaged along with TeX (http://www.latex-project.org/ftp.html). + + * MetaPost (http://cm.bell-labs.com/who/hobby/MetaPost.html) + + The `mpost' binary is also usually packaged with TeX (http://www.latex-project.org/ftp.html). * Perl (http://www.perl.org/) - * Texinfo (http://www.gnu.org/software/texinfo/) (4.11 or newer) + * Texinfo (http://www.gnu.org/software/texinfo/) + + Use version `4.11' or newer. * Type 1 utilities (http://www.lcdf.org/~eddietwo/type/#t1utils) - (1.33 or newer recommended) + + Use version `1.33' or newer. + + * Cyrillic fonts (https://www.ctan.org/pkg/cyrillic?lang=en) + + Often packaged in repositories as `texlive-lang-cyrillic'. + + * TeX Gyre `OTF' font packages. As of LilyPond version `2.19.26', + the previous default serif, san serif and monospace fonts now use + Tex Gyre's _Schola_, _Heros_ and _Cursor_ fonts respectively. + Also See *note Fonts: (lilypond-notation)Fonts. + + Some distributions do not always provide `OTF' font files in the + Tex Gyre packages from their repositories. Use the command + `fc-list | grep texgyre' to list the fonts available to your system + and check that the appropriate `*.otf' files are reported. If they + are not then download and manually extract the `OTF' files to + either your local `~/.fonts/' directory or use the `configure' + command and the `--with-texgyre-dir=/path_to_otf_files/' option. + + The following font families are required: + + Schola (http://www.gust.org.pl/projects/e-foundry/tex-gyre/schola), + Heros (http://www.gust.org.pl/projects/e-foundry/tex-gyre/heros) + and Cursor + (http://www.gust.org.pl/projects/e-foundry/tex-gyre/cursor). + 1.2.3 Requirements for building documentation --------------------------------------------- -You can view the documentation online at -`http://www.lilypond.org/doc/', but you can also build it locally. -This process requires some additional tools and packages: +The entire set of documentation for the most current build of LilyPond +is available online at +`http://lilypond.org/doc/v2.19/Documentation/web/development', but you +can also build them locally from the source code. This process +requires some additional tools and packages. + + Note: If the instructions for one of the previously listed + Linux in the previous section (*note Requirements for + compiling LilyPond: (lilypond-contributor)Requirements for + compiling LilyPond.) have been used, then the following can + be ignored as the software should already be installed. * Everything listed in *note Requirements for compiling LilyPond:: @@ -183,29 +465,46 @@ This process requires some additional tools and packages: * rsync (http://rsync.samba.org/) - * Texi2HTML (http://www.nongnu.org/texi2html/) (1.82) + * Texi2HTML (http://www.nongnu.org/texi2html/) - * International fonts + Use version `1.82'. Later versions will not work. - Red Hat Fedora: + Download `texi2html 1.82' directly from: + `http://download.savannah.gnu.org/releases/texi2html/texi2html-1.82.tar.gz'; - fonts-arabic - fonts-hebrew - fonts-ja - fonts-xorg-truetype - taipeifonts - ttfonts-ja - ttfonts-zh_CN + Extract the files into an appropriate location and then run the + commands; - Debian GNU/Linux: + ./configure + make + sudo make install - emacs-intl-fonts - ttf-kochi-gothic - ttf-kochi-mincho - xfonts-bolkhov-75dpi - xfonts-cronyx-75dpi - xfonts-cronyx-100dpi - xfonts-intl-.* + Now verify that your operating system is able to see the correct + version of `texi2html'. + + texi2html --version + + * Fonts required to build the documentation in addition to those + required to run LilyPond: + + gsfonts + fonts-linuxlibertine + fonts-liberation + fonts-dejavu + fonts-freefont-otf + ttf-bitstream-vera + texlive-fonts-recommended + ttf-xfree86-nonfree + + + Note: By default, when building LilyPond's documentation, + `pdfTeX' is be used. However ligatures (fi, fl, ff etc.) may + not be printed in the PDF output. In this case XeTeX can be + used instead. Download and install the `texlive-xetex' + package. The scripts used to build the LilyPond documentation + will use `XeTex' instead of `pdfTex' to generate the PDF + documents if it is available. No additional configuration is + required. 1.3 Getting the source code =========================== @@ -739,19 +1038,6 @@ to . Bugs that are not fault of LilyPond are documented here. -Bison 1.875 ------------ - -There is a bug in bison-1.875: compilation fails with "parse error -before `goto'" in line 4922 due to a bug in bison. To fix, please -recompile bison 1.875 with the following fix - - $ cd lily; make out/parser.cc - $ vi +4919 out/parser.cc - # append a semicolon to the line containing "__attribute__ ((__unused__)) - # save - $ make - Compiling on MacOS X -------------------- @@ -791,7 +1077,7 @@ location: Now run the `./configure' script. To avoid complications with automatic font detection, add - --with-ncsb-dir=/opt/local/share/ghostscript/fonts + --with-fonts-dir=/opt/local/share/ghostscript/fonts Solaris ------- @@ -841,7 +1127,7 @@ Red Hat Fedora Debian GNU/Linux apt-get install emacs-intl-fonts xfonts-intl-.* \ - ttf-kochi-gothic ttf-kochi-mincho \ + fonts-ipafont-gothic fonts-ipafont-mincho \ xfonts-bolkhov-75dpi xfonts-cronyx-100dpi xfonts-cronyx-75dpi Using lilypond python libraries diff --git a/LICENSE.OFL b/LICENSE.OFL index 41e80d6039..edc3956b8b 100644 --- a/LICENSE.OFL +++ b/LICENSE.OFL @@ -1,5 +1,5 @@ -Copyright (c) 1996--2013, The LilyPond authors (lilypond.org) +Copyright (c) 1996--2015, The LilyPond authors (lilypond.org) with Reserved Font Name "Emmentaler" and "Feta". This Font Software is licensed under the SIL Open Font License, Version 1.1. diff --git a/NEWS.txt b/NEWS.txt index a0cefcd144..33fc4d64f8 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -1,357 +1,766 @@ -New features in 2.18 since 2.16 +New features in 2.20 since 2.18 ******************************* - * The PostScript functionality of stroke adjustment is no longer - applied automatically but left to the discretion of the PostScript - device (by default, Ghostscript uses it for resolutions up to - 150dpi when generating raster images). When it is enabled, a more - complex drawing algorithm designed to benefit from stroke - adjustment is employed mostly for stems and bar lines. + * Blocks introduced with `\header' can be stored in variables and + used as arguments to music and scheme functions and as the body of + `#{...#}' constructs. They are represented as a Guile module. + + While `\book', `\bookpart', `\score', `\with', `\layout', `\midi', + `\paper' blocks can be passed around in similar manner, they are + represented by different data types. + + * Dot-separated symbol lists like `FretBoard.stencil' were already + supported as of version 2.18. They may now also contain unsigned + integers, and may alternatively be separated by commata. This + allows usage such as + + { \time 2,2,1 5/8 g'8 8 8 8 8 } + [image of music] + + + and + \tagGroup violin,oboe,bassoon + + * Such lists may also be used in expressions for assignments, sets, + and overrides. This allows usage such as + + { \unset Timing.beamExceptions + \set Timing.beatStructure = 1,2,1 + g'8 8 8 8 8 8 8 8 } + [image of music] - Stroke adjustment can be forced by specifying the command line - option `-dstrokeadjust' to LilyPond. When generating `PDF' files, - this will usually result in markedly better looking `PDF' previews - but significantly larger file size. Print quality at high - resolutions will be unaffected. - * There is now a new context type called `NullVoice' which, while not - appearing in the printed output, can be used to align lyrics. - This can be particularly convenient when used in parallel with a - `\partcombine' construct. + * Association list elements could previously be assigned values + individually (for example, paper variables like + `system-system-spacing.basic-distance'). They may now be also + referenced in this manner, as with + \paper { + \void \displayScheme \system-system-spacing.basic-distance + } - soprano = \relative c' { c e g c } - alto = \relative c' { a c e g } - verse = \lyricmode { This is my song } + In combination with the previously mentioned changes, this allows + setting and referencing pseudovariables like `violin.1'. + + * LilyPond source files may now be embedded inside the generated PDF + files. This experimental feature is disabled by default and may + be regarded as unsafe, as PDF documents with hidden content tend + to present a security risk. Please note that not all PDF viewers + have the ability to handle embedded documents (if not, the PDF + output will appear normally and source files will remain + invisible). This feature only works with the PDF backend. + + * French note names are now defined specifically instead of being + aliased to Italian note names: in addition to the generic + Italian-derived syntax, the D pitch may be entered as `ré'. + Double sharps may also be entered using the `-x' suffix. + + * Additional bass strings (for lute tablature) are supported. + + m = { f'4 d' a f d a, g, fis, e, d, c, \bar "|." } \score { - \new Staff << - \partcombine \soprano \alto - \new NullVoice = "aligner" \soprano - \new Lyrics \lyricsto "aligner" \verse - >> - \layout {} + \new TabStaff \m + \layout { + \context { + \Score + tablatureFormat = #fret-letter-tablature-format + } + \context { + \TabStaff + stringTunings = \stringTuning + additionalBassStrings = \stringTuning + fretLabels = #'("a" "b" "r" "d" "e" "f" "g" "h" "i" "k") + } + } } [image of music] - * Several articulations can be put into a single variable or - returned from an event function: - - sempreStacc = -. ^\markup \italic sempre - \relative { c''4\sempreStacc c c c } + * The markup-list-command `\table' is now available. Each column + may be aligned differently. + + \markuplist { + \override #'(padding . 2) + \table + #'(0 1 0 -1) + { + \underline { center-aligned right-aligned center-aligned left-aligned } + one "1" thousandth "0.001" + eleven "11" hundredth "0.01" + twenty "20" tenth "0.1" + thousand "1000" one "1.0" + } + } [image of music] - * The baseline of score markups is now taken from the reference - point (usually the middle of the staff) of the first bottom system - rather than the top of the bounding rectangle. The following + * A new markup-command, `\with-dimensions-from', makes + `\with-dimensions' easier to use by taking the new dimensions from + a markup object, given as first argument. \markup { - violin: \score { \new Staff { 1 } - \layout { indent=0 } } , - cello: \score { \new Staff { \clef "bass" } - \layout { indent=0 } } + \pattern #5 #Y #0 "x" + \pattern #5 #Y #0 \with-dimensions-from "x" "f" + \pattern #5 #Y #0 \with-dimensions-from "x" "g" + \override #'(baseline-skip . 2) + \column { + \pattern #5 #X #0 "n" + \pattern #5 #X #0 \with-dimensions-from "n" "m" + \pattern #5 #X #0 \with-dimensions-from "n" "!" + } } [image of music] - previously looked like - - [image of music] + * A new page breaking function `ly:one-line-auto-height-breaking' + places a whole score on a single line and changes the page width + to match, just like `ly:one-line-breaking'. The difference is that + it also automatically modifies the height of the page to fit the + height of the music. + * Markup-command `\draw-squiggle-line' is now available. + Customizing is possible with overrides of `thickness', + `angularity', `height' and `orientation' - without a reliable way to get both scores to line up. + \markup + \overlay { + \draw-squiggle-line #0.5 #'(3 . 3) ##t - * LilyPond no longer automatically infers a `\defaultchild' context - in a context definition with `\accepts' clauses. Any context - definition without an explicit or inherited `\defaultchild' - definition counts as a `Bottom' context and will be eligible for - rhythmic events and overrides without causing the implicit - creation of other contexts. Be sure to specify a `\defaultchild' - for non-`Bottom' contexts when defining them from scratch. + \translate #'(3 . 3) + \override #'(thickness . 4) + \draw-squiggle-line #0.5 #'(3 . -3) ##t - * There is now extensive support for both discant and bass accordion - register symbols in the `scm accreg' module, see *note Accordion - Registers: (lilypond-notation)Accordion Registers. + \translate #'(6 . 0) + \override #'(angularity . -5) + \draw-squiggle-line #0.5 #'(-3 . -3) ##t - #(use-modules (scm accreg)) - \new PianoStaff - << - \new Staff \relative - { \clef "treble" \discant "10" - r8 s32 f'[ bes f] s e[ a e] s d[ g d] s16 e32[ a] - \discant "121" - << { r16 r r } \\ - { d r a r bes r } >> | - 1 + \translate #'(3 . -3) + \override #'(angularity . 2) + \override #'(height . 0.3) + \override #'(orientation . -1) + \draw-squiggle-line #0.2 #'(-3 . 3) ##t } - \new Staff \relative - { \clef "treble" \freeBass "1" - r8 d'32 s16. c32 s16. bes32 s16. a32[ cis] s16 - \clef "bass" \stdBass "Master" - << { r16 ^"b" r ^"am" r ^"gm" | - 1^"a" } \\ - { d8_"D" c_"C" bes_"B" | a1_"A" } - >> + [image of music] + + + * A new command, `\RemoveAllEmptyStaves', has been made available, + which acts exactly like `\RemoveEmptyStaves', except for also + removing empty staves on the first system in a score. + + * Markup-commands `\undertie' and `\overtie' are now available, as + well as the generic markup-command `\tie'. + + \markup { + \undertie "undertied" + \overtie "overtied" + } + + m = { + c''1 \prall -\tweak text \markup \tie "131" -1 + } + + { \voiceOne \m \voiceTwo \m } + [image of music] + + + * `TabStaff' is now able to print micro-tones for bendings etc. + + \layout { + \context { + \Score + supportNonIntegerFret = ##t } + } + + mus = \relative { c'4 cih d dih } + + << + \new Staff << \clef "G_8" \mus >> + \new TabStaff \mus >> [image of music] - * New commands `markLengthOn' and `markLengthOff' control the - allowance of horizontal space for tempo and rehearsal marks. + * Two new styles of whiteout are now available. The `outline' style + approximates the contours of a glyph's outline, and its shape is + produced from multiple displaced copies of the glyph. The + `rounded-box' style produces a rounded rectangle shape. For all + three styles, including the default `box' style, the whiteout + shape's `thickness', as a multiple of staff-line thickness, can be + customized. + + \markup { + \combine + \filled-box #'(-1 . 15) #'(-3 . 4) #1 + \override #'(thickness . 3) + \whiteout whiteout-box + } + \markup { + \combine + \filled-box #'(-1 . 24) #'(-3 . 4) #1 + \override #'(style . rounded-box) + \override #'(thickness . 3) + \whiteout whiteout-rounded-box + } + \markup { + \combine + \filled-box #'(-1 . 18) #'(-3 . 4) #1 + \override #'(style . outline) + \override #'(thickness . 3) + \whiteout whiteout-outline + } + \relative { + \override Staff.Clef.whiteout-style = #'outline + \override Staff.Clef.whiteout = 3 + g'1 + } + [image of music] + + + * All of `\override', `\revert', `\set', and `\unset' now work with + the `\once' prefix for making one-time settings. + + \relative { + c'4 d + \override NoteHead.color = #red + e4 f | + \once \override NoteHead.color = #green + g4 a + \once \revert NoteHead.color + b c | + \revert NoteHead.color + f2 c | + } + [image of music] + + + * When outputting MIDI, LilyPond will now store the `title' defined + in a score's `\header' block (or, if there is no such definition + on the `\score' level, the first such definition found in a + `\header' block of the score's enclosing `\bookpart', `\book', or + top-level scope) as the name of the MIDI sequence in the MIDI + file. Optionally, the name of the MIDI sequence can be overridden + using the new `midititle' `\header' field independently of `title' + (for example, in case `title' contains markup code which does not + render as plain text in a satisfactory way automatically). + + * Music (and scheme and void) functions and markup commands that + just supply the final parameters to a chain of overrides, music + function and markup command calls can now be defined in the form + of just writing the expression cut short with `\etc'. + + bold-red-markup = \markup \bold \with-color #red \etc + highlight = \tweak font-size 3 \tweak color #red \etc + + \markup \bold-red "text" + \markuplist \column-lines \bold-red { One Two } + + { c' \highlight d' e'2-\highlight -! } + [image of music] + + + * LilyPond functions defined with `define-music-function', + `define-event-function', `define-scheme-function' and + `define-void-function' can now be directly called from Scheme as + if they were genuine Scheme procedures. Argument checking and + matching will still be performed in the same manner as when + calling the function through LilyPond input. This includes the + insertion of defaults for optional arguments not matching their + predicates. Instead of using `\default' in the actual argument + list for explicitly skipping a sequence of optional arguments, + `*unspecified*' can be employed. + + * Current input location and parser are now stored in GUILE fluids + and can be referenced via the function calls `(*location*)' and + `(*parser*)'. Consequently, a lot of functions previously taking + an explicit `parser' argument no longer do so. + + Functions defined with `define-music-function', + `define-event-function', `define-scheme-function' and + `define-void-function' no longer use `parser' and `location' + arguments. + + With those particular definitions, LilyPond will try to recognize + legacy use of `parser' and `location' arguments, providing + backwards-compatible semantics for some time. + + * In the "english" notename language, the long notenames for pitches + with accidentals now contain a hyphen for better readability. You + now have to write + \key a-flat \major + instead of the previous + \key aflat \major + + Double accidentals do not get another hyphen, so the Dutch `cisis' + has the long English notename `c-sharpsharp'. + + * The visual style of tremolo slashes (shape, style and slope) is + now more finely controlled. [image of music] - * Rehearsal marks at the beginning of a line are now placed to the - right of the clef and key signature by default. As in previous - versions, the `break-alignable-interface' controls the behavior. + * Multi-measure rests have length according to their total duration, + under the control of `MultiMeasureRest.space-increment'. [image of music] - * Decimal numbers can now be written directly in music, without a - hash sign. Together with the previous change in the way object - properties are specified, the code to change the length of stems - has changed from this: - \override Stem #'length = #5.6 - e' f' g' a' - to this: - \override Stem.length = 5.6 - e' f' g' a' + * Page numbers may now be printed in roman numerals, by setting the + `page-number-type' paper variable. - One has to write a digit on both sides of the dot - values like - `4.' or `-.3' are not allowed. + * It is now possible to use `\time' and `\partial' together to + change the time signature in mid measure. - Decimal fractions are also not accepted in `\chordmode'. + \override Score.BarNumber.break-visibility = #end-of-line-invisible + \partial 4 \time 3/4 f4 | 2 4 | 2 \bar "||" + \time 9/8 \partial 4. f8 8 8 | 2. 8 8 8 | + [image of music] - * A number of shorthands like `(', `)', `|', `[', `]', `~', `\(', - `\)' and others can now freely be redefined like normal commands. - An example would be - "\\{" = ( - "\\}" = ) - "(" = \melisma - ")" = \melismaEnd + * It is now possible to override the `text' property of chord names. - \new Staff << - \relative c' { - c8 \{ d e f \} % slurred - g ( a b c ) % no slur, but with melisma - c,1 \bar "|." - } - \addlyrics { Li -- ly -- pond. } + << + \new ChordNames \chordmode { + a' b c:7 + \once \override ChordName.text = #"foo" + d + } >> [image of music] - * The articulation shorthand for `\staccatissimo' has been renamed - from `-|' to `-!'. + * Improved horizontal alignment when using `TextScript', with + `DynamicText' or `LyricText'. + + * A new command `\magnifyStaff' has been added which scales staff + sizes, staff lines, bar lines, beamlets and horizontal spacing + generally at the `Staff' context level. Staff lines are prevented + from being scaled smaller than the default since the thickness of + stems, slurs, and the like are all based on the staff line + thickness. + + * `InstrumentName' now supports `text-interface'. + + * There is now support for controlling the `expression level' of + MIDI channels using the `Staff.midiExpression' context property. + This can be used to alter the perceived volume of even sustained + notes (albeit in a very `low-level' way) and accepts a number + value between `0.0' and `1.0'. + + \score { + \new Staff \with { + midiExpression = #0.6 + midiInstrument = #"clarinet" + } + << + { a'1~ a'1 } + { + \set Staff.midiExpression = #0.7 s4\f\< + \set Staff.midiExpression = #0.8 s4 + \set Staff.midiExpression = #0.9 s4 + \set Staff.midiExpression = #1.0 s4 + + \set Staff.midiExpression = #0.9 s4\> + \set Staff.midiExpression = #0.8 s4 + \set Staff.midiExpression = #0.7 s4 + \set Staff.midiExpression = #0.6 s4\! + } + >> + \midi { } + } + + * Support for making it easier to use alternative `music' fonts other + than the default Emmentaler in LilyPond has been added. See + `http://fonts.openlilylib.org/' for more information. + + * Grobs and their parents can now be aligned separately allowing + more flexibility for grob positions. For example the `left' edge + of a grob can now be aligned on the `center' of its parent. + + * Improvements to the `\partial' command have been made to avoid + problems when using multiple, parallel contexts. + + * `\chordmode' can now use `< >' and `<< >>' constructs. + + * A new command `\tagGroup' has now been added. This complements + the existing `\keepWithTag' and `\removeWithTag' commands. For + Example: + + \tagGroup #'(violinI violinII viola cello) + + declares a list of `tags' that belong to a single `tag group'. + + \keepWithTag #'violinI + + Is now only concerned with `tags' from `violinI'’s tag group. + + Any element of the included music tagged with one or more tags + from the group, but _not_ with VIOLINI, will be removed. + + * The `\addlyrics' function now works with arbitrary contexts + incuding `Staff'. + + * String numbers can now also be used to print roman numerals (e.g. + for unfretted string instruments). + + c2\2 + \romanStringNumbers + c\2 + \arabicStringNumbers + c1\3 + [image of music] + + + * The `thin-kern' property of the `BarLine' grob has been renamed to + `segno-kern'. + + * `KeyCancellation' grobs now ignore cue clefs (like `KeySignature' + grobs do). + + * Add support for `\once \unset' + + * It is now possible to individually color both the dots and + parentheses in fret diagrams when using the + `\fret-diagram-verbose' markup command. + + \new Voice { + c1^\markup { + \override #'(fret-diagram-details . ( + (finger-code . in-dot))) { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1 red) + (place-fret 4 5 2 inverted) + (place-fret 3 5 3 green) + (place-fret 2 5 4 blue inverted) + (place-fret 1 3 1 violet) + (barre 5 1 3 )) + } + } + c1^\markup { + \override #'(fret-diagram-details . ( + (finger-code . below-string))) { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1 red parenthesized) + (place-fret 4 5 2 yellow + default-paren-color + parenthesized) + (place-fret 3 5 3 green) + (place-fret 2 5 4 blue ) + (place-fret 1 3 1) + (barre 5 1 3)) + } + } + } + [image of music] + + + * Two new properties have been added for use in + `fret-diagram-details' when using the `\fret-diagram-verbose' + markup command; `fret-label-horizontal-offset' which affects the + `fret-label-indication' and `paren-padding' which controls the + space between the dot and the parentheses surrounding it. + + \new Voice { + c1^\markup { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1) + (place-fret 4 5 2) + (place-fret 3 5 3) + (place-fret 1 6 4 parenthesized) + (place-fret 2 3 1) + (barre 5 2 3)) + } + c1^\markup { + \override #'(fret-diagram-details . ( + (fret-label-horizontal-offset . 2) + (paren-padding . 0.25))) { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1) + (place-fret 4 5 2) + (place-fret 3 5 3) + (place-fret 1 6 4 parenthesized) + (place-fret 2 3 1) + (barre 5 2 3)) + } + } + } + [image of music] + - * Tempo change ranges are now written as `\tempo 4 = 60 - 68' rather - than `\tempo 4 = 60 ~ 68'. + * A new markup command `\justify-line' has been added. Similar to + the `\fill-line' markup command except that instead of setting + _words_ in columns, the `\justify-line' command balances the + whitespace between them ensuring that when there are three or more + words in a markup, the whitespace is always consistent. - * Grob `OctavateEight' was renamed to `ClefModifier'. Related - context properties were renamed from `xxxOctavationyyy' to - `xxxTranspositionyyy'. + \markup \fill-line {oooooo oooooo oooooo oooooo} + \markup \fill-line {ooooooooo oooooooo oo ooo} + [image of music] - * There is a new `\absolute' command explicitly marking music as - being entered in absolute pitch. While this has been the default - previously, an explicit `\absolute' also prevents reinterpretation - when the passage is placed inside of `\relative': - \relative c { c'4 \absolute { f'' g'' } c } + \markup \justify-line {oooooo oooooo oooooo oooooo} + \markup \justify-line {ooooooooo oooooooo oo ooo} [image of music] - * When `\relative' is used without an explicit reference pitch, the - reference pitch now is the middle of the first octave, making the - first entered pitch indistinguishable from absolute pitch. - Previously, omitting the reference pitch would have lead to a - default of `c''. Since that choice was somewhat arbitrary, - recommended usage was to always specify the reference pitch. + * A new command `\magnifyMusic' has been added, which allows the + notation size to be changed without changing the staff size, while + automatically scaling stems, beams, and horizontal spacing. + + \new Staff << + \new Voice \relative { + \voiceOne + 4 8. 16 8 4 r8 + } + \new Voice \relative { + \voiceTwo + \magnifyMusic 0.63 { + \override Score.SpacingSpanner.spacing-increment = #(* 1.2 0.63) + r32 c'' a c a c a c r c a c a c a c + r c a c a c a c a c a c a c a c + } + } + >> + [image of music] - * A new command `\single' can be used for converting a property - override into a tweak to be applied on a single music expression: - 1 + * A new flexible template suitable for a range of choral music, is + now provided. This may be used to create simple choral music, + with or without piano accompaniment, in two or four staves. Unlike + other templates, this template is `built-in', which means it does + not need to be copied and edited: instead it is simply `\include''d + in the input file. For details, see *note Built-in templates: + (lilypond-learning)Built-in templates. + + * The positioning of tuplet numbers for kneed beams has been + significantly improved. Previously, tuplet numbers were placed + according to the position of the tuplet bracket, even if it was + not printed. This could lead to stranded tuplet numbers. Now + they are now positioned closer to the kneed-beam when an + appropriate beam segment exists for its placement and when the + bracket is not drawn. + + Collision detection is also added, offsetting horizontally if too + close to an adjoining note column but preserving the number's + vertical distance from the kneed beam. If the number itself is + too large to fit in the available space the original, + bracket-based, positioning system is used instead; and in the + event of a collision (e.g. with an accidental) the tuplet number + is moved vertically away instead. + + \time 3/4 + \override Beam.auto-knee-gap = 3 + \tuplet 3/2 4 { + g8 c'' e, + c'8 g,, e'' + g,,8 e''' c,, + } [image of music] - * Two ways of letting graphical objects not appear in the output are - overriding its `transparent' property with `#t' (retaining the - original spacing) or overriding its `stencil' property with `#f' - (not using any space at all). Those two operations now have the - shorthands `\hide' and `\omit', respectively. They can either be - given a music expression to tweak, or the name of a graphical - object for which an override should be created (for specifying - both, use `\single' on the override form): + The original kneed-beam tuplet behavior is still available through + an `\override' via a new, `knee-to-beam' property. - \new Staff \with { \omit Clef } - \relative c'' 1 + \time 3/4 + \override Beam.auto-knee-gap = 3 + \override TupletNumber.knee-to-beam = ##f + \tuplet 3/2 4 { + g8 c'' e, + c'8 g,, e'' + g,,8 e''' c,, + } [image of music] - * A new command `\temporary' can be applied to overrides in order to - not have them replace previous property settings. If a `\revert' - is applied to the same property subsequently, the previous setting - reappears: + * `\lyricsto' and `\addLyrics' have been `harmonized'. Both now + accept the same kind of delimited argument list that `\lyrics' and + `\chords' accept. Backward compatibility has been added so music + identifiers (i.e. `\mus') are permitted as arguments. A + `convert-ly' rule has been added that removes redundant uses of + `\lyricmode' and rearranges combinations with context starters such + that `\lyricsto' in general is applied last (i.e. like + `\lyricmode' would be). + + * Scheme functions and identifiers can now be used as output + definitions. + + * Scheme expressions can now be used as chord constituents. + + * Improved visual spacing of small and regular `MI' Funk and Walker + noteheads so they are now the same width as other shaped notes in + their respective sets. `SOL' noteheads are also now visually + improved when used with both the normal Aiken and Sacred Harp + heads, as well as with the thin variants. + + * `LeftEdge' now has a definable `Y-extent' (i.e.vertical). See *note + LeftEdge: (lilypond-internals)LeftEdge. + + * Added a new `make-path-stencil' function that supports all `path' + commands both relative and absolute: + + `lineto', `rlineto', `curveto', `rcurveto', `moveto', `rmoveto', + `closepath'. The function also supports `single-letter' syntax + used in standard SVG path commands: + + `L', `l', `C', `c', `M', `m', `Z' and `z'. The new command is + also backward-compatible with the original + `make-connected-path-stencil' function. Also see + `scm/stencil.scm'. + + * Context properties named in the `alternativeRestores' property are + restored to their value at the start of the _first_ alternative in + all subsequent alternatives. + + Currently the default set restores `current meter'; - \override NoteHead.color = #red c4 - \override NoteHead.color = #green d - \revert NoteHead.color e2 - \override NoteHead.color = #red c4 - \temporary\override NoteHead.color = #green d - \revert NoteHead.color e - \revert NoteHead.color c + \time 3/4 + \repeat volta 2 { c2 e4 | } + \alternative { + { \time 4/4 f2 d | } + { f2 d4 | } + } + g2. | [image of music] - This is mainly useful for writing music functions that need to - have some property changed just for the duration of the function. - - * `\tag', `\removeWithTag', and `\keepWithTag' can now accept a list - of symbols rather than just a single symbol for marking, removing, - and keeping music with any of multiple tags. This is particularly - important for `\keepWithTag' since one cannot achieve the same - effect by using multiple consecutive `\keepWithTag' commands. - - * The `-d old-relative' option has been removed. Not actually - accessible from the command line any more, its remaining use was - for interpretating `\relative' in LilyPond files converted - automatically from version 1.8 or older. It is unclear how much - of this was actually still operative. - - * The meaning of `instrumentTransposition' has been reversed. After - \set instrumentTransposition = #{ b #} - a written `c'' now sounds like `b'. Previously, this would have - been the other way round. This and the following change should - make dealing with transposing instruments more straightforward. - - * The music generated by `\set' and `\override' commands is no - longer affected by `\transpose'. The main consequence is that - `\transpose' will transpose audible/concert pitch and printed - pitch by the same amount even when the transposed music contains - `\transposition'. Previously, - \transpose c' f' \transposition bes' - was equivalent to `\transposition f''. Now it stays equivalent to - `\transposition bes''. - - * When checking for collisions, LilyPond no longer treats objects as - rectangles. Instead, the actual shape of objects is approximated - using an integral-like approach. This generally results in more - even and snug positioning of objects and systems: - - [image of music] - - Previously, the above snippet looked like this: - - [image of music] - - Affected objects include `Accidentals', `Beams', `Clefs', - `Dynamics', `FiguredBass', `Flags', `Glissandos', `Lyrics', - `MetronomeMarks', `OttavaBrackets', `Pedals', `RehearsalMarks', - `Rests', `Scripts', `TextScripts', `Ties', `Tuplets' and - `VoltaBrackets'. - - * Tuplets are now created with the `\tuplet' command, which takes a - fraction `T/N' to specify that T notes are played in the time - usually allowed for N. One `\tuplet' command can create several - tuplet groups if their duration is typed after the fraction. - - \tuplet 3/2 { c8 d e } \tuplet 3/2 { f e d } c2 - \tuplet 3/2 4 { c8 d e f e d } c2 + `measure position'; + + \time 3/4 + \repeat volta 2 { c2 e4 | } + \alternative { + { \time 4/4 + \set Timing.measurePosition = #(ly:make-moment -1/2) + f2 | } + { f2 d4 | } + } + g2. | [image of music] - The `\times' command with its inverted fraction order `N/T' is - still available. + and `chord changes'; - * Introducing two new markup-commands; `\draw-dashed-line' and - `\draw-dotted-line'. + << + \new ChordNames { + \set chordChanges = ##t + \chordmode { c1:m d:m c:m d:m } + } + \new Staff { + \repeat volta 2 { \chordmode { c1:m } } + \alternative { + { \chordmode { d:m } } + { \chordmode { c:m } } + } + \chordmode { d:m } + } + >> + [image of music] - The dashed-line extends to the whole length given by DEST, if - `full-length' is set to `#t' (this is the default) without any - space at the beginning or end. `off' will then be altered to fit. - To insist on the given (or default) values of `on', `off' use - `\override #'(full-length . #f)'. Manual settings for `on', `off' - and `phase' are possible. - The dotted-line always extends to the whole length given by DEST, - without any space at the beginning or end. Manual settings for - `off' are possible to get larger or smaller space between the dots. - The given (or default) value of `off' will be altered to fit the - line-length. + * Improved MIDI output for breathe marks. After tied notes, breaths + take time _only_ from the last note of the tie; e.g. `{ c4~ c8 + \breathe }' performs as `{ c4~ c16 r }' instead of `{ c4 r8 }'. + This is more consistent with articulations and how humans + interpret breaths after ties. It now also makes it easier to + align simultaneous breathe marks over multiple parts, all with + different note lengths. + + * A new note head style for Tabulature has been added; + `TabNoteHead.style = #'slash'. + + * Four new Clef glyphs have been added _Double G_, _Tenor G_, + _Varpercussion_ and _varC_ and their related tessitura. + + \override Staff.Clef.full-size-change = ##t + + \clef "GG" c c c c + \clef "tenorG" c c c c + \clef "varC" c c c c + \clef "altovarC" c c c c + \clef "tenorvarC" c c c c + \clef "baritonevarC" c c c c + \clef "varpercussion" c c c c + + \break + \override Staff.Clef.full-size-change = ##f + + \clef "GG" c c c c + \clef "tenorG" c c c c + \clef "varC" c c c c + \clef "altovarC" c c c c + \clef "tenorvarC" c c c c + \clef "baritonevarC" c c c c + \clef "varpercussion" c c c c + [image of music] - \markup { - \draw-dashed-line #'(5.1 . 2.3) - \override #'(on . 0.3) - \override #'(off . 0.5) - \draw-dashed-line #'(5.1 . 2.3) - \draw-dotted-line #'(5.1 . 2.3) - \override #'(thickness . 2) - \override #'(off . 0.2) - \draw-dotted-line #'(5.1 . 2.3) + + * Isolated durations in music sequences now stand for unpitched + notes. This may be useful for specifying rhythms to music or + scheme functions. When encountered in the final score, the + pitches are provided by the preceding note or chord. Here are two + examples where this makes for readable input: + + \new DrumStaff \with { \override StaffSymbol.line-count = 1 } + \drummode { + \time 3/4 + tambourine 8 \tuplet 3/2 { 16 16 16 } + 8 \tuplet 3/2 { 16 16 16 } 8 8 | } [image of music] - * Starting with version 2.17.10, error messages or the `textedit' - URI used for point-and-click functionality specify column numbers - starting with 1 rather than 0. The byte offset (also part of - `textedit' URIs) still starts at 0. + \new Staff { r16 c'16 ~ 8 ~ 4 ~ 2 | } + [image of music] + + + * `\displayLilyMusic' and its underlying Scheme functions no longer + omit redundant note durations. This makes it easier to reliably + recognize and format standalone durations in expressions like + { c4 d4 8 } - * The `\clef' command supports optional transposition: + * Beaming exceptions can now be constructed using the + `\beamExceptions' scheme function. One can now write - \clef "treble_(8)" - c2 c - \clef "bass^[15]" - c2 c + \time #'(2 1) 3/16 + \set Timing.beamExceptions = + \beamExceptions { 32[ 32] 32[ 32] 32[ 32] } + c16 c c | + \repeat unfold 6 { c32 } | [image of music] - * The LilyPond syntax of dot-separated words `Voice.Accidental' has - been made interchangeable with `#'(Voice Accidental)', a Scheme - list of symbols. As one result, code like - \override Voice.TextSpanner #'(bound-details left text) = "rit." - is now equivalent to - \override Voice.TextSpanner bound-details.left.text = "rit." - or even - \override #'(Voice TextSpanner) bound-details.left.text = "rit." - - * Grob and grob property path no longer need to be specified as two - separate arguments to commands like `\override' and `\revert', - allowing for the syntax - \override Voice.TextSpanner.bound-details.left.text = "rit." - Since complementary music functions like `\overrideProperty' - cannot support forms with and without separating space at the same - time, using a single dotted path is now the preferred form. - Specifying grob path and grob property path separately, currently - still supported with `\override' and `\revert' for compatibility - reasons, is deprecated. - - * Due to words now being accepted as symbol function arguments, the - interfaces of `\accidentalStyle', `\alterBroken', `\footnote' and - `\tweak' had to be redesigned where optional symbol arguments were - involved. Please check the respective music function - documentation for details. - - * Several commands now accept symbol lists (conveniently entered as - dot-separated words) for various kinds of arguments. These - include `\accidentalStyle', `\alterBroken', `\footnote', `\hide', - `\omit', `\overrideProperty', `\shape', and `\tweak'. - - * The bar line user interface has changed. Bar glyphs now resemble - the appearance of the bar line, so a left repeat sign has to be - coded as `.|:'. The command `\defineBarLine' provides an easy way - to define additional bar line styles. - - * Accidentals in the key signature may be printed in octaves other - than their traditional positions, or in multiple octaves. + with multiple exceptions separated with `|' bar checks (writing + the exception pattern without pitches is convenient but not + mandatory). Previously, setting the beam exceptions would have + required writing - [image of music] + \set Timing.beamExceptions = + #'( ;start of alist + (end . ;entry for end of beams + ( ;start of alist of end points + ((1 . 32) . (2 2 2)) ;rule for 1/32 beams -- end each 1/16 + ))) + + * The most common articulations are now reflected in MIDI output. + Accent and marcato make notes louder; staccato, staccatissimo and + portato make them shorter. Breath marks shorten the previous note. + + This behavior is customizable through the `midiLength' and + `midiExtraVelocity' properties on `ArticulationEvent'. See + `script-init.ly' for examples. + + * The PostScript functionality of stroke adjustment is no longer + applied automatically but left to the discretion of the PostScript + device (by default, Ghostscript uses it for resolutions up to + 150dpi when generating raster images). When it is enabled, a more + complex drawing algorithm designed to benefit from stroke + adjustment is employed mostly for stems and bar lines. + Stroke adjustment can be forced by specifying the command line + option `-dstrokeadjust' to LilyPond. When generating `PDF' files, + this will usually result in markedly better looking `PDF' previews + but significantly larger file size. Print quality at high + resolutions will be unaffected. diff --git a/README.txt b/README.txt index 6b35be73f5..68e0e1397c 100644 --- a/README.txt +++ b/README.txt @@ -18,7 +18,7 @@ denotes a stable version. For development versions 'y' is odd. =============== The primary download site for sourcecode is -`http://lilypond.org/download/'. +`http://lilypond.org/downloads/'. 1.3 Compilation =============== @@ -63,9 +63,9 @@ list, not to us personally. (http://lists.gnu.org/mailman/listinfo/bug-lilypond) for sending bugreports. - * lilypond-cvs@gnu.org - (http://lists.gnu.org/mailman/listinfo/lilypond-cvs) for log - files from the autobuild. + * lilypond-auto@gnu.org + (http://lists.gnu.org/mailman/listinfo/lilypond-auto) for + notifications from the issue tracking systems of LilyPond. You can search the lists from our searching facilities (http://lilypond.org/search). diff --git a/ROADMAP b/ROADMAP index 2616c11c16..2bf571f72d 100644 --- a/ROADMAP +++ b/ROADMAP @@ -14,17 +14,20 @@ LilyPond's source files. | build bootstrapping, patches | for third party programs | -|-- Documentation/ Top sources for manuals +|-- Documentation/ Top sources for most of the manuals | | | | | | INDIVIDUAL CHAPTERS FOR EACH MANUAL: +| | Note: "Snippets" and "Internals Reference" are +| | auto-generated during the Documentation Build process. +| | | | | |-- contributor/ Contributor's Guide | |-- essay/ Essay on automated music engraving -| |-- extending/ Extending +| |-- extending/ Extending the functionality of LilyPond | |-- learning/ Learning Manual | |-- notation/ Notation Reference -| |-- usage/ Usage +| |-- usage/ Runnning the programs that come with LilyPond | |-- web/ The website | | | | @@ -35,6 +38,7 @@ LilyPond's source files. | | * individual chapters for each manual | | 2) a texidocs/ directory for snippet translations | | +| |-- ca/ Catalan | |-- cs/ Czech | |-- de/ German | |-- es/ Spanish @@ -56,7 +60,7 @@ LilyPond's source files. | |-- pictures/ Images used (eps/jpg/png/svg) | | `-- pdf/ (pdf) | |-- po/ Translated build/maintenance scripts -| |-- snippets/ Auto-generated .ly snippets (from the LSR) +| |-- snippets/ Auto-generated from the LSR and from ./new/ | | `-- new/ Snippets too new for the LSR | `-- topdocs/ AUTHORS, INSTALL, README | diff --git a/VERSION b/VERSION index 3fe728dab9..52ba04b1e7 100644 --- a/VERSION +++ b/VERSION @@ -1,7 +1,7 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=2 -MINOR_VERSION=18 -PATCH_LEVEL=2 +MINOR_VERSION=19 +PATCH_LEVEL=45 MY_PATCH_LEVEL= VERSION_STABLE=2.18.2 -VERSION_DEVEL=2.19.3 +VERSION_DEVEL=2.19.45 diff --git a/aclocal.m4 b/aclocal.m4 index c9f0093381..ed47b8350e 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -42,7 +42,8 @@ AC_DEFUN(STEPMAKE_GET_VERSION, [ if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$1" --version || "$1" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$1" --version || "$1" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -173,6 +174,7 @@ AC_DEFUN(STEPMAKE_COMPILE_BEFORE, [ CXXFLAGS=${CXXFLAGS-$CFLAGS} LDFLAGS=${LDFLAGS-""} optimise_b=yes + checks_b=no profile_b=no debug_b=yes pipe_b=yes @@ -182,6 +184,11 @@ AC_DEFUN(STEPMAKE_COMPILE_BEFORE, [ [compile with debugging info. Default: on])], [debug_b=$enableval]) + AC_ARG_ENABLE(checking, + [AS_HELP_STRING([--enable-checking], + [compile with expensive run-time checks. Default: off])], + [checks_b=$enableval]) + AC_ARG_ENABLE(optimising, [AS_HELP_STRING([--enable-optimising], [compile with optimising. Default: on])], @@ -198,9 +205,17 @@ AC_DEFUN(STEPMAKE_COMPILE_BEFORE, [ [pipe_b=$enableval]) if test "$optimise_b" = yes; then - AC_DEFINE(NDEBUG) - DEFINES="$DEFINES -DNDEBUG" OPTIMIZE=" -O2 -finline-functions" + # following two lines are compatibility while Patchy has not + # yet learnt about --enable-checking. But once it has, we + # don't want -DDEBUG twice, so we omit it here if it is going + # to get added anyway later. + elif test "$checks_b" != yes; then + DEFINES="$DEFINES -DDEBUG" + fi + + if test "$checks_b" = yes; then + DEFINES="$DEFINES -DDEBUG" fi if test $profile_b = yes; then @@ -266,11 +281,9 @@ AC_DEFUN(STEPMAKE_CXX, [ STEPMAKE_OPTIONAL_REQUIRED(CXX, c++, $1) CXXFLAGS="$CXXFLAGS $OPTIMIZE" - LD='$(CXX)' AC_SUBST(CXX) AC_SUBST(CXXFLAGS) - AC_SUBST(LD) ]) @@ -674,7 +687,7 @@ AC_DEFUN(STEPMAKE_GUILE_DEVEL, [ AC_MSG_RESULT([$ver]) GUILE_CONFIG=$found else - STEPMAKE_ADD_ENTRY($1, "$guile_config (guile-devel, guile-dev or libguile-dev package) or guile1-config (guile1-devel package)") + STEPMAKE_ADD_ENTRY($1, "$guile_config (guile-devel, guile-dev or libguile-dev package)") fi AC_SUBST(GUILE_CONFIG) @@ -1128,6 +1141,8 @@ AC_DEFUN(STEPMAKE_PYTHON_DEVEL, [ warn="Python.h (python-devel, python-dev or libpython-dev package)" STEPMAKE_ADD_ENTRY($1, $warn) fi + AC_SUBST(PYTHON_CFLAGS) + AC_SUBST(PYTHON_LDFLAGS) ]) diff --git a/config.make.in b/config.make.in index 9837fc3e49..c681d76199 100644 --- a/config.make.in +++ b/config.make.in @@ -14,6 +14,7 @@ package-depth = @package_depth@ FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ GUILE_CFLAGS = @GUILE_CFLAGS@ PANGO_FT2_CFLAGS = @PANGO_FT2_CFLAGS@ +PYTHON_CFLAGS = @PYTHON_CFLAGS@ CONFIG_CPPFLAGS = @CPPFLAGS@ CONFIG_DEFINES = @DEFINES@ @@ -25,6 +26,7 @@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ GUILE_LIBS = @GUILE_LDFLAGS@ FREETYPE2_LIBS = @FREETYPE2_LIBS@ PANGO_FT2_LIBS = @PANGO_FT2_LIBS@ +PYTHON_LIBS = @PYTHON_LDFLAGS@ CXXABI_LIBS = @CXXABI_LIBS@ CONFIG_LIBS = @LIBS@ @EXTRA_LIBS@ $(GUILE_LIBS) $(PANGO_FT2_LIBS) $(FONTCONFIG_LIBS) $(FREETYPE2_LIBS) @@ -88,9 +90,8 @@ lilypond_omfdir = $(local_package_omfdir) webdir = $(lilypond_docdir)/html vimdir = $(lilypond_datadir)/vim - -NCSB_SOURCE_FILES = @NCSB_SOURCE_FILES@ -NCSB_DIR = @NCSB_DIR@ +TEXGYRE_DIR = @TEXGYRE_DIR@ +TEXGYRE_FILES = @TEXGYRE_FILES@ ################################################################ ## PROGRAMS @@ -128,6 +129,7 @@ MFMODE = @MFMODE@ MSGFMT = @MSGFMT@ PAPERSIZE=a4 PATHSEP = @PATHSEP@ +PDFTEX = @PDFTEX@ PDFLATEX = @PDFLATEX@ PERL = @PERL@ PLATFORM_WINDOWS = @PLATFORM_WINDOWS@ diff --git a/configure b/configure index 33dec6d88f..69f5d89830 100755 --- a/configure +++ b/configure @@ -667,6 +667,8 @@ PKG_CONFIG LIBOBJS T1ASM FONTFORGE +PYTHON_LDFLAGS +PYTHON_CFLAGS PYTHON_CONFIG CXXABI_LIBS GUILE_LDFLAGS @@ -690,8 +692,8 @@ CXXCPP ac_ct_CXX CXXFLAGS CXX -NCSB_DIR -NCSB_SOURCE_FILES +TEXGYRE_FILES +TEXGYRE_DIR FCLIST EXTRA_LIBS DEFINES @@ -786,11 +788,13 @@ ac_user_opts=' enable_option_checking enable_config enable_documentation -with_ncsb_dir +enable_guile2 +with_texgyre_dir enable_relocation enable_rpath enable_static_gxx enable_debugging +enable_checking enable_optimising enable_profiling enable_pipe @@ -1439,10 +1443,12 @@ Optional Features: --enable-config=CONF put settings in config-CONF.make and config-CONF.h; do `make conf=CONF' to get output in ./out-CONF --enable-documentation build Documentation. Default: on + --enable-guile2 highly experimental GUILE 2 support. Default: off --enable-relocation compile with dynamic relocation. Default: off --enable-rpath hardcode runtime library path. Default: off --enable-static-gxx link libstdc++.a statically. Default: off --enable-debugging compile with debugging info. Default: on + --enable-checking compile with expensive run-time checks. Default: off --enable-optimising compile with optimising. Default: on --enable-profiling compile with gprof support. Default: off --enable-pipe compile with -pipe. Default: on @@ -1450,7 +1456,7 @@ Optional Features: Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-ncsb-dir=DIR location of Century Schoolbook fonts. + --with-texgyre-dir=DIR location of TeX Gyre fonts. --with-localedir=DIR location of locales. Default: PREFIX/share/locale --with-lang=LANG use LANG as language to emit messages --with-python-include=DIR @@ -2295,7 +2301,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -2444,7 +2451,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -2594,7 +2602,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -2851,7 +2860,8 @@ $as_echo_n "checking for python... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -3055,12 +3065,19 @@ fi +GUILEv2=no +# Check whether --enable-guile2 was given. +if test "${enable_guile2+set}" = set; then + enableval=$enable_guile2; GUILEv2=$enableval +fi + -# Check whether --with-ncsb-dir was given. -if test "${with_ncsb_dir+set}" = set; then - withval=$with_ncsb_dir; NCSB_DIR=$withval + +# Check whether --with-texgyre-dir was given. +if test "${with_texgyre_dir+set}" = set; then + withval=$with_texgyre_dir; TEXGYRE_DIR=$withval else - NCSB_DIR="" + TEXGYRE_DIR="" fi @@ -3093,6 +3110,7 @@ fi CXXFLAGS=${CXXFLAGS-$CFLAGS} LDFLAGS=${LDFLAGS-""} optimise_b=yes + checks_b=no profile_b=no debug_b=yes pipe_b=yes @@ -3103,6 +3121,12 @@ if test "${enable_debugging+set}" = set; then fi + # Check whether --enable-checking was given. +if test "${enable_checking+set}" = set; then + enableval=$enable_checking; checks_b=$enableval +fi + + # Check whether --enable-optimising was given. if test "${enable_optimising+set}" = set; then enableval=$enable_optimising; optimise_b=$enableval @@ -3122,12 +3146,17 @@ fi if test "$optimise_b" = yes; then - cat >>confdefs.h <<\_ACEOF -#define NDEBUG 1 -_ACEOF - - DEFINES="$DEFINES -DNDEBUG" OPTIMIZE=" -O2 -finline-functions" + # following two lines are compatibility while Patchy has not + # yet learnt about --enable-checking. But once it has, we + # don't want -DDEBUG twice, so we omit it here if it is going + # to get added anyway later. + elif test "$checks_b" != yes; then + DEFINES="$DEFINES -DDEBUG" + fi + + if test "$checks_b" = yes; then + DEFINES="$DEFINES -DDEBUG" fi if test $profile_b = yes; then @@ -4230,23 +4259,22 @@ $as_echo "no" >&6; } fi -{ $as_echo "$as_me:$LINENO: checking for New Century Schoolbook PFB files" >&5 -$as_echo_n "checking for New Century Schoolbook PFB files... " >&6; } +{ $as_echo "$as_me:$LINENO: checking for TeX Gyre fonts OTF files" >&5 +$as_echo_n "checking for TeX Gyre fonts OTF files... " >&6; } -if test "$NCSB_DIR" = ""; then +if test "$TEXGYRE_DIR" = ""; then if test "$FCLIST" != ""; then - NCSB_FILE=`$FCLIST "Century Schoolbook L:foundry=urw:fontformat=Type 1:lang=ru" file \ - | head -n 1` - if test "$NCSB_FILE" != ""; then - NCSB_FILE=`echo $NCSB_FILE | sed 's/\(:.*\)$//g'` - NCSB_FILE=`$PYTHON "$srcdir/scripts/auxiliar/readlink.py" $NCSB_FILE` - NCSB_DIR=`$as_dirname -- $NCSB_FILE || -$as_expr X$NCSB_FILE : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X$NCSB_FILE : 'X\(//\)[^/]' \| \ - X$NCSB_FILE : 'X\(//\)$' \| \ - X$NCSB_FILE : 'X\(/\)' \| . 2>/dev/null || -$as_echo X$NCSB_FILE | + TEXGYRE_FILE=`$FCLIST "TeX Gyre Schola:fontformat=CFF" file | head -n 1` + if test "$TEXGYRE_FILE" != ""; then + TEXGYRE_FILE=`echo $TEXGYRE_FILE | sed 's/\(:.*\)$//g'` + TEXGYRE_FILE=`$PYTHON "$srcdir/scripts/auxiliar/readlink.py" $TEXGYRE_FILE` + TEXGYRE_DIR=`$as_dirname -- $TEXGYRE_FILE || +$as_expr X$TEXGYRE_FILE : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X$TEXGYRE_FILE : 'X\(//\)[^/]' \| \ + X$TEXGYRE_FILE : 'X\(//\)$' \| \ + X$TEXGYRE_FILE : 'X\(/\)' \| . 2>/dev/null || +$as_echo X$TEXGYRE_FILE | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -4267,44 +4295,39 @@ $as_echo X$NCSB_FILE | fi fi fi -if test "$NCSB_DIR" != "" ; then - for f in c059013l.pfb c059016l.pfb c059033l.pfb c059036l.pfb; do - if test ! -f "$NCSB_DIR/$f"; then - MISSING_NCSB_SOURCE_FILES="$f $MISSING_NCSB_SOURCE_FILES" +if test "$TEXGYRE_DIR" != "" ; then + for f in texgyreschola-regular.otf texgyreschola-italic.otf \ + texgyreschola-bold.otf texgyreschola-bolditalic.otf \ + texgyreheros-regular.otf texgyreheros-italic.otf \ + texgyreheros-bold.otf texgyreheros-bolditalic.otf \ + texgyrecursor-regular.otf texgyrecursor-italic.otf \ + texgyrecursor-bold.otf texgyrecursor-bolditalic.otf; do + if test ! -f "$TEXGYRE_DIR/$f"; then + MISSING_TEXGYRE_FILES="$MISSING_TEXGYRE_FILES $f" else - if test "`grep Cyrillic "$NCSB_DIR/$f"`" = ""; then - INCOMPLETE_NCSB_SOURCE_FILES="$f $INCOMPLETE_NCSB_SOURCE_FILES" - else - NCSB_SOURCE_FILES="$NCSB_DIR/$f $NCSB_SOURCE_FILES" - fi + TEXGYRE_FILES="$TEXGYRE_FILES $f" fi done fi -if test "$NCSB_DIR" = "" -o "$MISSING_NCSB_SOURCE_FILES" != "$INCOMPLETE_NCSB_SOURCE_FILES"; then +if test "$TEXGYRE_DIR" = "" -o "$MISSING_TEXGYRE_FILES" != ""; then { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } - eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \"International New Century Schoolbook fonts\"`\" + eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \"TeX Gyre fonts OTF\"`\" - if test "$NCSB_DIR" = ""; then + if test "$TEXGYRE_DIR" = ""; then if test "$FCLIST" = ""; then - eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \"'(install the fc-list utility from FontConfig, or use --with-ncsb-dir)'\"`\" + eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \"'(install the fc-list utility from FontConfig, or use --with-texgyre-dir)'\"`\" else - eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \"'(make sure the fc-list utility can see them, or use --with-ncsb-dir)'\"`\" + eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \""(make sure the fc-list utility can see them, e.g. 'sudo apt-get install fonts-texgyre', or use --with-texgyre-dir)"\"`\" fi - fi - if test "$MISSING_NCSB_SOURCE_FILES" != ""; then - - eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \"'(these files are missing: $MISSING_NCSB_SOURCE_FILES)'\"`\" - - fi - if test "$INCOMPLETE_NCSB_SOURCE_FILES" != ""; then + else - eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \"'(these files do not contain Cyrillic characters: $INCOMPLETE_NCSB_SOURCE_FILES)'\"`\" + eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \"'(these files are missing: $MISSING_TEXGYRE_FILES)'\"`\" fi else @@ -4362,7 +4385,8 @@ $as_echo_n "checking for python... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -5271,7 +5295,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -5717,8 +5742,6 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS="$CXXFLAGS $OPTIMIZE" - LD='$(CXX)' - @@ -5788,7 +5811,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -6094,7 +6118,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -6588,7 +6613,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -6669,7 +6695,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -6826,7 +6853,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -7707,7 +7735,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -7858,7 +7887,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -8007,7 +8037,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -8071,7 +8102,8 @@ $as_echo "$ver" >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$METAPOST" --version || "$METAPOST" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$METAPOST" --version || "$METAPOST" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -8223,7 +8255,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -8277,6 +8310,8 @@ $as_echo "no" >&6; } $as_echo "yes" >&6; } fi +if test "$GUILEv2" = "yes" +then ## First, let's just see if we can find Guile at all. test -n "$target_alias" && target_guile_config=$target_alias-guile-config @@ -8323,7 +8358,8 @@ $as_echo_n "checking for guile-config... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -8339,7 +8375,7 @@ $as_echo_n "checking for guile-config... " >&6; } {printf "%.0f\n", $1*1000000 + $2*1000 + three}' ` req=` - echo "1.8.2" | awk -F. ' + echo "2.0.7" | awk -F. ' { if ($3) {three = $3} else {three = 0} @@ -8347,19 +8383,19 @@ $as_echo_n "checking for guile-config... " >&6; } {printf "%.0f\n", $1*1000000 + $2*1000 + three}' ` sup=` - echo "1.9.0" | awk -F. ' + echo "2.2.0" | awk -F. ' { if ($3) {three = $3} else {three = 0} } {printf "%.0f\n", $1*1000000 + $2*1000 + three}' ` - if test -n "1.8.2" -a "$num" -lt "$req"; then - guile_config="$r >= 1.8.2 (installed: $ver)" + if test -n "2.0.7" -a "$num" -lt "$req"; then + guile_config="$r >= 2.0.7 (installed: $ver)" continue else - if test -n "1.9.0" -a "$num" -ge "$sup"; then - guile_config="$r < 1.9.0 (installed: $ver)" + if test -n "2.2.0" -a "$num" -ge "$sup"; then + guile_config="$r < 2.2.0 (installed: $ver)" continue else guile_config=$r @@ -8378,7 +8414,7 @@ $as_echo "$ver" >&6; } GUILE_CONFIG=$found else - eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \""$guile_config (guile-devel, guile-dev or libguile-dev package) or guile1-config (guile1-devel package)"\"`\" + eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \""$guile_config (guile-devel, guile-dev or libguile-dev package)"\"`\" fi @@ -8764,32 +8800,175 @@ _ACEOF _ACEOF +else -# check for 3 typedefs added in Guile 1.9 -save_CXXFLAGS="$CXXFLAGS" -CXXFLAGS="$GUILE_CFLAGS $CXXFLAGS" -{ $as_echo "$as_me:$LINENO: checking for scm_t_hash_fold_fn" >&5 -$as_echo_n "checking for scm_t_hash_fold_fn... " >&6; } -if test "${ac_cv_type_scm_t_hash_fold_fn+set}" = set; then + ## First, let's just see if we can find Guile at all. + test -n "$target_alias" && target_guile_config=$target_alias-guile-config + test -n "$host_alias" && host_guile_config=$host_alias-guile-config + { $as_echo "$as_me:$LINENO: checking for guile-config" >&5 +$as_echo_n "checking for guile-config... " >&6; } + guile_config="guile-config" + found="no" + for r in $GUILE_CONFIG $target_guile_config $host_guile_config $build_guile_config guile-config guile2-config guile2.0-config guile-2.0-config guile1-config guile1.9-config guile1.8-config guile-1-config guile-1.9-config guile-1.8-config; do + exe=` + ## which doesn't work in ash, if /usr/bin/which isn't installed + ## type -p doesn't work in ash + ## command -v doesn't work in zsh + ## command -v "$r" 2>&1 + ## this test should work in ash, bash, pdksh (ksh), zsh + type -p $r 2>/dev/null | tail -n 1 | awk '{print $NF}' +` + if ! $exe --version > /dev/null 2>&1 ; then + continue + fi + ver=` + ## "$exe" --version 2>&1 | grep -v '^$' | head -n 1 | awk '{print $NF}' + ## + ## ARG. + ## Workaround for broken Debian gcc version string: + ## gcc (GCC) 3.1.1 20020606 (Debian prerelease) + ## + ## -V: Workaround for python + + #dnl + + ## Assume and hunt for dotted version multiplet. + ## use eval trickery, because we cannot use multi-level $() instead of `` + ## for compatibility reasons. + + ## grab the first version number in --version output. + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | + grep -E '(^| )[0-9][0-9]*\.[0-9]' | + head -n 1 | + tr ' ' '\n' | + sed 's/\([0-9][0-9]*\.[0-9][0-9.]*\).*/\1/g' | + grep -E '(^| )[0-9][0-9]*\.[0-9]' | + head -n 1\`\" + + if test -z "$_ver"; then + ## If empty, try date [fontforge] + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ + | head -n 1 \ + | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" + fi + echo "$_ver" + #dnl +` + num=` + echo "$ver" | awk -F. ' + { + if ($3) {three = $3} + else {three = 0} + } + {printf "%.0f\n", $1*1000000 + $2*1000 + three}' +` + req=` + echo "1.8.2" | awk -F. ' + { + if ($3) {three = $3} + else {three = 0} + } + {printf "%.0f\n", $1*1000000 + $2*1000 + three}' +` + sup=` + echo "1.9.0" | awk -F. ' + { + if ($3) {three = $3} + else {three = 0} + } + {printf "%.0f\n", $1*1000000 + $2*1000 + three}' +` + if test -n "1.8.2" -a "$num" -lt "$req"; then + guile_config="$r >= 1.8.2 (installed: $ver)" + continue + else + if test -n "1.9.0" -a "$num" -ge "$sup"; then + guile_config="$r < 1.9.0 (installed: $ver)" + continue + else + guile_config=$r + found=$r + break + fi + fi + done + { $as_echo "$as_me:$LINENO: result: $found" >&5 +$as_echo "$found" >&6; } + if test "$found" != "no"; then + { $as_echo "$as_me:$LINENO: checking $guile_config version" >&5 +$as_echo_n "checking $guile_config version... " >&6; } + { $as_echo "$as_me:$LINENO: result: $ver" >&5 +$as_echo "$ver" >&6; } + GUILE_CONFIG=$found + else + + eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \""$guile_config (guile-devel, guile-dev or libguile-dev package)"\"`\" + + fi + + + + guile_version="$ver" + #dnl + GUILE_MAJOR_VERSION=`expr $guile_version : '\([0-9]*\)'` + GUILE_MINOR_VERSION=`expr $guile_version : '[0-9]*\.\([0-9]*\)'` + GUILE_PATCH_LEVEL=`expr $guile_version : '[0-9]*\.[0-9]*\.\([0-9]*\)'` + #dnl + + exe=` + ## which doesn't work in ash, if /usr/bin/which isn't installed + ## type -p doesn't work in ash + ## command -v doesn't work in zsh + ## command -v "$guile_config" 2>&1 + ## this test should work in ash, bash, pdksh (ksh), zsh + type -p $guile_config 2>/dev/null | tail -n 1 | awk '{print $NF}' +` + if test -x $exe; then + { $as_echo "$as_me:$LINENO: checking guile compile flags" >&5 +$as_echo_n "checking guile compile flags... " >&6; } + GUILE_CFLAGS="`$guile_config compile`" + { $as_echo "$as_me:$LINENO: result: $GUILE_CFLAGS" >&5 +$as_echo "$GUILE_CFLAGS" >&6; } + { $as_echo "$as_me:$LINENO: checking guile link flags" >&5 +$as_echo_n "checking guile link flags... " >&6; } + GUILE_LDFLAGS="`$guile_config link`" + { $as_echo "$as_me:$LINENO: result: $GUILE_LDFLAGS" >&5 +$as_echo "$GUILE_LDFLAGS" >&6; } + fi + + + + save_CPPFLAGS="$CPPFLAGS" + save_LIBS="$LIBS" + CPPFLAGS="$GUILE_CFLAGS $CPPFLAGS" + LIBS="$GUILE_LDFLAGS $LIBS" + +for ac_header in libguile.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } else - ac_cv_type_scm_t_hash_fold_fn=no + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include - -int -main () -{ -if (sizeof (scm_t_hash_fold_fn)) - return 0; - ; - return 0; -} +$ac_includes_default +#include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" @@ -8809,61 +8988,408 @@ $as_echo "$ac_try_echo") >&5 test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - cat >conftest.$ac_ext <<_ACEOF + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include - -int -main () -{ -if (sizeof ((scm_t_hash_fold_fn))) - return 0; - ; - return 0; -} +#include <$ac_header> _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" +if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : + }; then + ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_type_scm_t_hash_fold_fn=yes + ac_header_preproc=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_scm_t_hash_fold_fn" >&5 -$as_echo "$ac_cv_type_scm_t_hash_fold_fn" >&6; } +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +{ $as_echo "$as_me:$LINENO: checking for scm_boot_guile in -lguile" >&5 +$as_echo_n "checking for scm_boot_guile in -lguile... " >&6; } +if test "${ac_cv_lib_guile_scm_boot_guile+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lguile $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char scm_boot_guile (); +int +main () +{ +return scm_boot_guile (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_guile_scm_boot_guile=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_guile_scm_boot_guile=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_guile_scm_boot_guile" >&5 +$as_echo "$ac_cv_lib_guile_scm_boot_guile" >&6; } +if test "x$ac_cv_lib_guile_scm_boot_guile" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGUILE 1 +_ACEOF + + LIBS="-lguile $LIBS" + +fi + + +for ac_func in scm_boot_guile +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + libguile_b=no +fi +done + + if test "$libguile_b" = "no"; then + warn='libguile (libguile-dev, guile-devel or guile-dev + package).' + + eval "REQUIRED"=\"`eval echo \"'$'REQUIRED\" \"$warn\"`\" + + fi + CPPFLAGS="$save_CPPFLAGS" + LIBS="$save_LIBS" + cat >>confdefs.h <<_ACEOF +#define GUILE_MAJOR_VERSION $GUILE_MAJOR_VERSION +_ACEOF + + cat >>confdefs.h <<_ACEOF +#define GUILE_MINOR_VERSION $GUILE_MINOR_VERSION +_ACEOF + + cat >>confdefs.h <<_ACEOF +#define GUILE_PATCH_LEVEL $GUILE_PATCH_LEVEL +_ACEOF + + +fi + +# check for 3 typedefs added in Guile 1.9 +save_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$GUILE_CFLAGS $CXXFLAGS" +{ $as_echo "$as_me:$LINENO: checking for scm_t_hash_fold_fn" >&5 +$as_echo_n "checking for scm_t_hash_fold_fn... " >&6; } +if test "${ac_cv_type_scm_t_hash_fold_fn+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_scm_t_hash_fold_fn=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +if (sizeof (scm_t_hash_fold_fn)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +if (sizeof ((scm_t_hash_fold_fn))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_scm_t_hash_fold_fn=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_scm_t_hash_fold_fn" >&5 +$as_echo "$ac_cv_type_scm_t_hash_fold_fn" >&6; } if test "x$ac_cv_type_scm_t_hash_fold_fn" = x""yes; then cat >>confdefs.h <<_ACEOF @@ -9329,7 +9855,8 @@ $as_echo_n "checking for python... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -9653,6 +10180,8 @@ done + + for ac_prog in fontforge do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -9810,7 +10339,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -10007,7 +10537,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -10921,7 +11452,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -11823,7 +12355,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -11907,7 +12440,8 @@ $as_echo_n "checking for guile... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -12123,7 +12657,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -12323,7 +12858,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -12528,7 +13064,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -12679,7 +13216,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -12828,7 +13366,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -12977,7 +13516,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -13126,7 +13666,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -13164,7 +13705,7 @@ $as_echo "$ver" >&6; } fi - for ac_prog in pdflatex + for ac_prog in xelatex pdflatex do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 @@ -13219,13 +13760,13 @@ test -n "$PDFLATEX" || PDFLATEX="no" if test $? -ne 0; then - eval "$DOCUMENTATION_REQUIRED"=\"`eval echo \"'$'$DOCUMENTATION_REQUIRED\" \"pdflatex\"`\" + eval "$DOCUMENTATION_REQUIRED"=\"`eval echo \"'$'$DOCUMENTATION_REQUIRED\" \"xelatex pdflatex\"`\" if test "$DOCUMENTATION_REQUIRED" = "REQUIRED"; then - command="echo ERROR: pdflatex not found" + command="echo ERROR: xelatex pdflatex not found" # abort configure process here? else - command="- echo pdflatex not found" + command="- echo xelatex pdflatex not found" fi eval "PDFLATEX"='$command' false @@ -13275,7 +13816,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -13312,6 +13854,162 @@ $as_echo "$ver" >&6; } fi +if test "$PDFLATEX" = "xelatex"; then + + for ac_prog in xetex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_PDFTEX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$PDFTEX"; then + ac_cv_prog_PDFTEX="$PDFTEX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PDFTEX="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +PDFTEX=$ac_cv_prog_PDFTEX +if test -n "$PDFTEX"; then + { $as_echo "$as_me:$LINENO: result: $PDFTEX" >&5 +$as_echo "$PDFTEX" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PDFTEX" && break +done +test -n "$PDFTEX" || PDFTEX="no" + + + + r="`eval echo '$'"PDFTEX"`" + if test -n "$r" -a "$r" != "error" -a "$r" != "no" && expr '`eval echo '$'"PDFTEX"`' : '.*\(echo\)' > /dev/null; then + true + else + ##STEPMAKE_WARN(cannot find . ) + false + fi + + if test $? -ne 0; then + + eval "$DOCUMENTATION_REQUIRED"=\"`eval echo \"'$'$DOCUMENTATION_REQUIRED\" \"xetex\"`\" + + if test "$DOCUMENTATION_REQUIRED" = "REQUIRED"; then + command="echo ERROR: xetex not found" + # abort configure process here? + else + command="- echo xetex not found" + fi + eval "PDFTEX"='$command' + false + else + true + fi + + if test $? -eq 0 -a -n ""; then + + r="`eval echo '$'"PDFTEX"`" + { $as_echo "$as_me:$LINENO: checking $r version" >&5 +$as_echo_n "checking $r version... " >&6; } + exe=` + ## which doesn't work in ash, if /usr/bin/which isn't installed + ## type -p doesn't work in ash + ## command -v doesn't work in zsh + ## command -v "$r" 2>&1 + ## this test should work in ash, bash, pdksh (ksh), zsh + type -p $r 2>/dev/null | tail -n 1 | awk '{print $NF}' +` + if test -n ""; then + ver="" + else + ver=` + ## "$exe" --version 2>&1 | grep -v '^$' | head -n 1 | awk '{print $NF}' + ## + ## ARG. + ## Workaround for broken Debian gcc version string: + ## gcc (GCC) 3.1.1 20020606 (Debian prerelease) + ## + ## -V: Workaround for python + + #dnl + + ## Assume and hunt for dotted version multiplet. + ## use eval trickery, because we cannot use multi-level $() instead of `` + ## for compatibility reasons. + + ## grab the first version number in --version output. + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | + grep -E '(^| )[0-9][0-9]*\.[0-9]' | + head -n 1 | + tr ' ' '\n' | + sed 's/\([0-9][0-9]*\.[0-9][0-9.]*\).*/\1/g' | + grep -E '(^| )[0-9][0-9]*\.[0-9]' | + head -n 1\`\" + + if test -z "$_ver"; then + ## If empty, try date [fontforge] + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ + | head -n 1 \ + | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" + fi + echo "$_ver" + #dnl +` + fi + num=` + echo "$ver" | awk -F. ' + { + if ($3) {three = $3} + else {three = 0} + } + {printf "%.0f\n", $1*1000000 + $2*1000 + three}' +` + req=` + echo "" | awk -F. ' + { + if ($3) {three = $3} + else {three = 0} + } + {printf "%.0f\n", $1*1000000 + $2*1000 + three}' +` + { $as_echo "$as_me:$LINENO: result: $ver" >&5 +$as_echo "$ver" >&6; } + if test "$num" -lt "$req"; then + + eval "$DOCUMENTATION_REQUIRED"=\"`eval echo \"'$'$DOCUMENTATION_REQUIRED\" \""$r >= (installed: $ver)"\"`\" + + fi + vervar="`echo PDFTEX | tr 'a-z' 'A-Z'`_VERSION" + eval `echo $vervar=$num` +## AC_SUBST(`eval echo $vervar`) + + fi + + if test "$PDFTEX" = "xetex"; then + # For avoiding PDF destination name replacement. + PDFTEX=$ugh_ugh_autoconf250_builddir/scripts/build/out$CONFIGSUFFIX/xetex-with-options + fi +else for ac_prog in pdfetex pdftex etex do @@ -13424,7 +14122,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -13461,6 +14160,7 @@ $as_echo "$ver" >&6; } fi +fi for ac_prog in texi2pdf do @@ -13573,7 +14273,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -13722,7 +14423,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -13897,7 +14599,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -14046,7 +14749,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -14196,7 +14900,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi @@ -14345,7 +15050,8 @@ $as_echo_n "checking $r version... " >&6; } if test -z "$_ver"; then ## If empty, try date [fontforge] - eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 | grep '[0-9]\{6,8\}' \ + eval _ver=\"\`("$exe" --version || "$exe" -V) 2>&1 \ + | grep '\(^\|[^0-9a-f]\)[0-9]\{6,8\}\([^0-9a-f]\|$\)' \ | head -n 1 \ | sed -e 's/^[^.0-9]*//' -e 's/[^.0-9]*$//'\`\" fi diff --git a/configure.ac b/configure.ac index 008befe4ec..0a753325d1 100644 --- a/configure.ac +++ b/configure.ac @@ -26,11 +26,17 @@ AC_ARG_ENABLE(documentation, [DOCUMENTATION=$enableval]) AC_SUBST(DOCUMENTATION) -AC_ARG_WITH(ncsb-dir, - [AS_HELP_STRING([--with-ncsb-dir=DIR], - [location of Century Schoolbook fonts.])], - [NCSB_DIR=$withval], - [NCSB_DIR=""]) +GUILEv2=no +AC_ARG_ENABLE(guile2, + [AS_HELP_STRING([--enable-guile2], + [highly experimental GUILE 2 support. Default: off])], + [GUILEv2=$enableval]) + +AC_ARG_WITH(texgyre-dir, + [AS_HELP_STRING([--with-texgyre-dir=DIR], + [location of TeX Gyre fonts.])], + [TEXGYRE_DIR=$withval], + [TEXGYRE_DIR=""]) reloc_b=no AC_ARG_ENABLE(relocation, @@ -55,48 +61,44 @@ AC_SUBST(LINK_GXX_STATICALLY) STEPMAKE_COMPILE AC_CHECK_PROG(FCLIST, fc-list, fc-list) -AC_MSG_CHECKING([for New Century Schoolbook PFB files]) -AC_SUBST(NCSB_SOURCE_FILES) -AC_SUBST(NCSB_DIR) -if test "$NCSB_DIR" = ""; then +AC_MSG_CHECKING([for TeX Gyre fonts OTF files]) +AC_SUBST(TEXGYRE_DIR) +AC_SUBST(TEXGYRE_FILES) +if test "$TEXGYRE_DIR" = ""; then if test "$FCLIST" != ""; then - NCSB_FILE=`$FCLIST "Century Schoolbook L:foundry=urw:fontformat=Type 1:lang=ru" file \ - | head -n 1` - if test "$NCSB_FILE" != ""; then - NCSB_FILE=`echo $NCSB_FILE | sed 's/\(:.*\)$//g'` - NCSB_FILE=`$PYTHON "$srcdir/scripts/auxiliar/readlink.py" $NCSB_FILE` - NCSB_DIR=`AS_DIRNAME($NCSB_FILE)` + TEXGYRE_FILE=`$FCLIST "TeX Gyre Schola:fontformat=CFF" file | head -n 1` + if test "$TEXGYRE_FILE" != ""; then + TEXGYRE_FILE=`echo $TEXGYRE_FILE | sed 's/\(:.*\)$//g'` + TEXGYRE_FILE=`$PYTHON "$srcdir/scripts/auxiliar/readlink.py" $TEXGYRE_FILE` + TEXGYRE_DIR=`AS_DIRNAME($TEXGYRE_FILE)` fi fi fi -if test "$NCSB_DIR" != "" ; then - for f in c059013l.pfb c059016l.pfb c059033l.pfb c059036l.pfb; do - if test ! -f "$NCSB_DIR/$f"; then - MISSING_NCSB_SOURCE_FILES="$f $MISSING_NCSB_SOURCE_FILES" +if test "$TEXGYRE_DIR" != "" ; then + for f in texgyreschola-regular.otf texgyreschola-italic.otf \ + texgyreschola-bold.otf texgyreschola-bolditalic.otf \ + texgyreheros-regular.otf texgyreheros-italic.otf \ + texgyreheros-bold.otf texgyreheros-bolditalic.otf \ + texgyrecursor-regular.otf texgyrecursor-italic.otf \ + texgyrecursor-bold.otf texgyrecursor-bolditalic.otf; do + if test ! -f "$TEXGYRE_DIR/$f"; then + MISSING_TEXGYRE_FILES="$MISSING_TEXGYRE_FILES $f" else - if test "`grep Cyrillic "$NCSB_DIR/$f"`" = ""; then - INCOMPLETE_NCSB_SOURCE_FILES="$f $INCOMPLETE_NCSB_SOURCE_FILES" - else - NCSB_SOURCE_FILES="$NCSB_DIR/$f $NCSB_SOURCE_FILES" - fi + TEXGYRE_FILES="$TEXGYRE_FILES $f" fi done fi -if test "$NCSB_DIR" = "" -o "$MISSING_NCSB_SOURCE_FILES" != "$INCOMPLETE_NCSB_SOURCE_FILES"; then +if test "$TEXGYRE_DIR" = "" -o "$MISSING_TEXGYRE_FILES" != ""; then AC_MSG_RESULT(no) - STEPMAKE_ADD_ENTRY(REQUIRED,International New Century Schoolbook fonts) - if test "$NCSB_DIR" = ""; then + STEPMAKE_ADD_ENTRY(REQUIRED,TeX Gyre fonts OTF) + if test "$TEXGYRE_DIR" = ""; then if test "$FCLIST" = ""; then - STEPMAKE_ADD_ENTRY(REQUIRED,'(install the fc-list utility from FontConfig, or use --with-ncsb-dir)') + STEPMAKE_ADD_ENTRY(REQUIRED,'(install the fc-list utility from FontConfig, or use --with-texgyre-dir)') else - STEPMAKE_ADD_ENTRY(REQUIRED,'(make sure the fc-list utility can see them, or use --with-ncsb-dir)') + STEPMAKE_ADD_ENTRY(REQUIRED,"(make sure the fc-list utility can see them, e.g. 'sudo apt-get install fonts-texgyre', or use --with-texgyre-dir)") fi - fi - if test "$MISSING_NCSB_SOURCE_FILES" != ""; then - STEPMAKE_ADD_ENTRY(REQUIRED,'(these files are missing: $MISSING_NCSB_SOURCE_FILES)') - fi - if test "$INCOMPLETE_NCSB_SOURCE_FILES" != ""; then - STEPMAKE_ADD_ENTRY(REQUIRED,'(these files do not contain Cyrillic characters: $INCOMPLETE_NCSB_SOURCE_FILES)') + else + STEPMAKE_ADD_ENTRY(REQUIRED,'(these files are missing: $MISSING_TEXGYRE_FILES)') fi else AC_MSG_RESULT(yes) @@ -129,7 +131,12 @@ STEPMAKE_GETTEXT STEPMAKE_MSGFMT(REQUIRED) STEPMAKE_TEXMF(REQUIRED) STEPMAKE_TEXMF_DIRS(REQUIRED) -STEPMAKE_GUILE_DEVEL(REQUIRED, 1.8.2, 1.9.0) +if test "$GUILEv2" = "yes" +then + STEPMAKE_GUILE_DEVEL(REQUIRED, 2.0.7, 2.2.0) +else + STEPMAKE_GUILE_DEVEL(REQUIRED, 1.8.2, 1.9.0) +fi # check for 3 typedefs added in Guile 1.9 save_CXXFLAGS="$CXXFLAGS" @@ -230,8 +237,16 @@ STEPMAKE_PROGS(MAKEINFO, makeinfo, REQUIRED, 4.11) STEPMAKE_PROGS(TEXI2HTML, texi2html, $DOCUMENTATION_REQUIRED, 1.82) STEPMAKE_PROGS(DBLATEX, dblatex, $DOCUMENTATION_REQUIRED, 0.1.4) STEPMAKE_PROGS(BIBTEX, bibtex, $DOCUMENTATION_REQUIRED) -STEPMAKE_PROGS(PDFLATEX, pdflatex, $DOCUMENTATION_REQUIRED) -STEPMAKE_PROGS(PDFTEX, pdfetex pdftex etex, $DOCUMENTATION_REQUIRED) +STEPMAKE_PROGS(PDFLATEX, xelatex pdflatex, $DOCUMENTATION_REQUIRED) +if test "$PDFLATEX" = "xelatex"; then + STEPMAKE_PROGS(PDFTEX, xetex, $DOCUMENTATION_REQUIRED) + if test "$PDFTEX" = "xetex"; then + # For avoiding PDF destination name replacement. + PDFTEX=$ugh_ugh_autoconf250_builddir/scripts/build/out$CONFIGSUFFIX/xetex-with-options + fi +else + STEPMAKE_PROGS(PDFTEX, pdfetex pdftex etex, $DOCUMENTATION_REQUIRED) +fi STEPMAKE_PROGS(TEXI2PDF, texi2pdf, $DOCUMENTATION_REQUIRED) STEPMAKE_PROGS(TEXINDEX, texindex, $DOCUMENTATION_REQUIRED) AC_MSG_CHECKING(for epsf.tex) diff --git a/elisp/lilypond-font-lock.el b/elisp/lilypond-font-lock.el index 73a8df8f7d..be7b592635 100644 --- a/elisp/lilypond-font-lock.el +++ b/elisp/lilypond-font-lock.el @@ -58,8 +58,8 @@ ;; ... keywords (defined above, see kwregex) (cons (concat "\\(\\([_^-]?\\(" kwregex "\\)\\)+\\)\\($\\|[] \t(~{}>\\\\_()^*-]\\)") '(1 font-lock-keyword-face)) -;; ... user defined identifiers \[a-zA-Z]+ - '("\\([_^-]?\\\\\\([a-zA-Z][a-zA-Z]*\\)\\)" 1 font-lock-constant-face) +;; ... user defined identifiers, roughly \[a-zA-Z]+ with single - or _ in between. + '("\\([_^-]?\\\\\\([a-zA-Z[:nonascii:]]\\(?:[-_]?[a-zA-Z[:nonascii:]]\\)*\\)\\)" 1 font-lock-constant-face) ;; ... the left side of '=' -mark '("\\([_a-zA-Z.0-9-]+\\)[ \t]*=[ \t]*" 1 font-lock-variable-name-face) diff --git a/elisp/lilypond-indent.el b/elisp/lilypond-indent.el index bc04ed5a38..70d24f9b18 100644 --- a/elisp/lilypond-indent.el +++ b/elisp/lilypond-indent.el @@ -154,11 +154,11 @@ Returns nil if line starts inside a string" ;; start there too. If LilyPond-indent-level is zero, use ;; LilyPond-brace-offset instead (+ (if (and (bolp) (zerop LilyPond-indent-level)) - (cond ((= (following-char) ?{) + (cond ((= (following-char) ?{) LilyPond-brace-offset) - ((= (following-char) ?<) + ((= (following-char) ?<) LilyPond-angle-offset) - ((= (following-char) ?[) + ((= (following-char) ?\[) LilyPond-square-offset) ((= (following-char) ?\)) LilyPond-scheme-paren-offset) @@ -196,7 +196,7 @@ Return the amount the indentation changed by." (setq indent (+ indent (- LilyPond-close-brace-offset LilyPond-indent-level)))) ((= (following-char) ?>) (setq indent (+ indent (- LilyPond-close-angle-offset LilyPond-indent-level)))) - ((= (following-char) ?]) + ((= (following-char) ?\]) (setq indent (+ indent (- LilyPond-close-square-offset LilyPond-indent-level)))) ((and (= (following-char) ?\)) (LilyPond-inside-scheme-p)) (setq indent (+ indent (- LilyPond-close-scheme-paren-offset LilyPond-indent-level)))) @@ -204,7 +204,7 @@ Return the amount the indentation changed by." (setq indent (+ indent LilyPond-brace-offset))) ((= (following-char) ?<) (setq indent (+ indent LilyPond-angle-offset))) - ((= (following-char) ?[) + ((= (following-char) ?\[) (setq indent (+ indent LilyPond-square-offset))) ((and (= (following-char) ?\() (LilyPond-inside-scheme-p)) (setq indent (+ indent LilyPond-scheme-paren-offset))) @@ -326,7 +326,7 @@ Argument LIM limit." ;; duh .. a single '>', as in chords '<< ... >>', was not matched here ( ?} . ("{" . "}")) ;; ligatures '\[ ... \]' are skipped in the following expression - ( ?] . ("\\([^\\]\\([\\][\\]\\)*\\|^\\)[[]" . "\\([^\\]\\([\\][\\]\\)*\\|^\\)[]]")) + ( ?\] . ("\\([^\\]\\([\\][\\]\\)*\\|^\\)[[]" . "\\([^\\]\\([\\][\\]\\)*\\|^\\)[]]")) ( "\\]" . ("\\([^\\]\\|^\\)\\([\\][\\]\\)*[\\][[]" . "\\([^\\]\\|^\\)\\([\\][\\]\\)*[\\][]]")) ( "\\)" . ("\\([^\\]\\|^\\)\\([\\][\\]\\)*[\\][(]" . "\\([^\\]\\|^\\)\\([\\][\\]\\)*[\\][)]")) )) @@ -335,7 +335,7 @@ Argument LIM limit." (defconst LilyPond-parens-alist `( ( ?< . ?> ) ( ?{ . ?} ) - ( ?[ . ?] ) + ( ?\[ . ?\] ) ( "\\[" . "\\]" ) ( ?\( . ?\) ) ( "\\(" . "\\)" ) @@ -406,7 +406,7 @@ slur-paren-p defaults to nil. (if (not (save-excursion (goto-char (match-end 0)) ;; skip over strings and comments (LilyPond-inside-string-or-comment-p))) - (if (memq match '(?} ?> ?] ?\))) + (if (memq match '(?} ?> ?\] ?\))) ;; count closing brackets (progn (setq level (1+ level)) ;; slurs may be close to each other, e.g., @@ -452,17 +452,16 @@ slur-paren-p defaults to nil. (let ( (test-point (point)) (level 0) ) (save-excursion - (if (or (and (/= (point) (point-max)) - (= (char-after (point)) ?\() - (or (= (char-after (- (point) 1)) ?#) - (and (= (char-after (- (point) 2)) ?#) - (= (char-after (- (point) 1)) ?`)))) - (and (re-search-backward "#(\\|#`(" nil t) + (if (or (and (eq (char-after (point)) ?\() + (save-excursion + (skip-chars-backward "'`") + (memq (char-before) '(?# ?$)))) + (and (re-search-backward "[#$][`']?(" nil t) (progn (search-forward "(") (setq level 1) (while (and (> level 0) - (re-search-forward "(\\|)" test-point t) + (re-search-forward "[()]" test-point t) (setq match (char-after (match-beginning 0))) (<= (point) test-point)) (if (= match ?\() @@ -492,7 +491,7 @@ builtin 'blink-matching-open' is not used. In syntax table, see ;; Test if a ligature \] or expressional slur \) was encountered (setq bracket-type (char-after (point))) (setq char-before-bracket-type nil) - (if (memq bracket-type '(?] ?\) ?[ ?\()) + (if (memq bracket-type '(?\] ?\) ?\[ ?\()) (progn (setq np -1) (while (eq (char-before (- (point) (setq np (+ np 1)))) ?\\) diff --git a/elisp/lilypond-mode.el b/elisp/lilypond-mode.el index be05016071..0bf05408e2 100644 --- a/elisp/lilypond-mode.el +++ b/elisp/lilypond-mode.el @@ -1,7 +1,7 @@ ;;;; lilypond-mode.el -- Major mode for editing GNU LilyPond music scores ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1999--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 1999--2015 Jan Nieuwenhuizen ;;;; Changed 2001--2003 Heikki Junes ;;;; * Add PS-compilation, PS-viewing and MIDI-play (29th Aug 2001) ;;;; * Keyboard shortcuts (12th Sep 2001) @@ -432,16 +432,16 @@ in LilyPond-include-path." (defcustom LilyPond-command-alist ;; Should expand this to include possible keyboard shortcuts which ;; could then be mapped to define-key and menu. - `( - ("LilyPond" . (,(concat LilyPond-lilypond-command " %s") "%s" "%l" "View")) - ("2PS" . (,(concat LilyPond-lilypond-command " -f ps %s") "%s" "%p" "ViewPS")) + '( + ("LilyPond" . ((LilyPond-lilypond-command " %s") "%s" "%l" "View")) + ("2PS" . ((LilyPond-lilypond-command " -f ps %s") "%s" "%p" "ViewPS")) ("Book" . ("lilypond-book %x" "%x" "%l" "LaTeX")) ("LaTeX" . ("latex '\\nonstopmode\\input %l'" "%l" "%d" "ViewDVI")) ;; refreshes when kicked USR1 - ("View" . (,(concat LilyPond-pdf-command " %f"))) - ("ViewPDF" . (,(concat LilyPond-pdf-command " %f"))) - ("ViewPS" . (,(concat LilyPond-ps-command " %p"))) + ("View" . ((LilyPond-pdf-command " %f"))) + ("ViewPDF" . ((LilyPond-pdf-command " %f"))) + ("ViewPS" . ((LilyPond-ps-command " %p"))) ;; The following are refreshed in LilyPond-command: ;; - current-midi depends on cursor position and @@ -616,24 +616,35 @@ Must be the car of an entry in `LilyPond-command-alist'." (LilyPond-command-select-buffer) (LilyPond-command-region (point-min) (point-max))) -(defun LilyPond-command-expand (string file) - (let ((case-fold-search nil)) - (if (string-match "%" string) - (let* ((b (match-beginning 0)) - (e (+ b 2)) - (l (split-file-name file)) - (dir (car l)) - (base (cadr l))) - (concat (substring string 0 b) - (shell-quote-argument (concat dir base)) - (LilyPond-command-expand - (concat - (let ((entry (assoc (substring string b e) - LilyPond-expand-alist))) - (if entry (cdr entry) "")) - (substring string e)) - file))) - string))) +(defun LilyPond-command-expand (arg file) + (cond + ((listp arg) + (mapconcat (lambda (arg) (LilyPond-command-expand arg file)) + arg + "")) + ((and (symbolp arg) (boundp arg) + ;; Avoid self-quoting symbols + (not (eq (symbol-value arg) arg))) + (LilyPond-command-expand (symbol-value arg) file)) + ((stringp arg) + (let ((case-fold-search nil)) + (if (string-match "%" arg) + (let* ((b (match-beginning 0)) + (e (+ b 2)) + (l (split-file-name file)) + (dir (car l)) + (base (cadr l))) + (concat (substring arg 0 b) + (shell-quote-argument (concat dir base)) + (LilyPond-command-expand + (concat + (let ((entry (assoc (substring arg b e) + LilyPond-expand-alist))) + (if entry (cdr entry) "")) + (substring arg e)) + file))) + arg))) + (t (error "Bad expansion `%S'" arg)))) (defun LilyPond-shell-process (name buffer command) (let ((old (current-buffer))) diff --git a/elisp/lilypond-what-beat.el b/elisp/lilypond-what-beat.el index 4a00ed36c3..59a4fe1d52 100644 --- a/elisp/lilypond-what-beat.el +++ b/elisp/lilypond-what-beat.el @@ -57,12 +57,12 @@ (defun add-fractions (f1 f2) "Adds two fractions, both are (numerator denominator)" - (set 'result (list (+ (* (car f1) (cadr f2)) (* (car f2) (cadr f1))) + (setq result (list (+ (* (car f1) (cadr f2)) (* (car f2) (cadr f1))) (* (cadr f1) (cadr f2)))) - (set 'result (reduce-fraction result 2)) - (set 'result (reduce-fraction result 3)) - (set 'result (reduce-fraction result 5)) - (set 'result (reduce-fraction result 7)) + (setq result (reduce-fraction result 2)) + (setq result (reduce-fraction result 3)) + (setq result (reduce-fraction result 5)) + (setq result (reduce-fraction result 7)) ) @@ -72,7 +72,7 @@ (= 0 (% (cadr result) divisor)) (< 1 (cadr result)) (< 0 (car result))) - (set 'result (list (/ (car result) divisor) (/ (cadr result) divisor)))) + (setq result (list (/ (car result) divisor) (/ (cadr result) divisor)))) result ) @@ -86,24 +86,21 @@ (denominator (or (extract-match duration 8) "1"))) (if (and (not (null dots)) (< 0 (string-width dots))) (dotimes (dummy (string-width dots)) - (set 'result (list (1+ (* 2 (car result))) (* 2 (cadr result)))))) + (setq result (list (1+ (* 2 (car result))) (* 2 (cadr result)))))) (list (* (string-to-int numerator) (car result)) (* (string-to-int denominator) (cadr result))) )) (defun walk-note-duration () -"Returns duration of next note, moving point past note. + "Returns duration of next note, moving point past note. If point is not before a note, returns nil If next note has no duration, returns t" - (if (not (looking-at pitch-regex)) - nil - (progn + (let ((have-pitch (looking-at pitch-regex))) + (if have-pitch (goto-char (match-end 0))) + (if (not (looking-at duration-regex)) + have-pitch (goto-char (match-end 0)) - (if (not (looking-at duration-regex)) - t - (progn - (goto-char (match-end 0)) - (parse-duration (match-string 0))))))) + (parse-duration (match-string 0))))) ; returns nil if not at a comment (defun skip-comment () @@ -161,7 +158,7 @@ If next note has no duration, returns t" (skip-quotation) (skip-sexp))) ; Now skip anything that isn't alphanum or \. And skip comments or quotations - (while (or (< 0 (skip-chars-forward "^A-Za-z<%}#=\"")) + (while (or (< 0 (skip-chars-forward "^A-Za-z1-9<%}#=\"")) (skip-comment) (skip-quotation) (skip-sexp))) @@ -201,31 +198,33 @@ If next note has no duration, returns t" (duration (if (= -1 last-dur) 0 (parse-duration (match-string 0)))) (result '(0 1))) ; 0 in fraction form (if (= measure-start -1) - (error "No | before point") - (progn - (goto-char (1+ measure-start)) - (goto-note-begin) - (while (< (point) end) - (set 'new-duration (walk-note-duration)) + (message "No | before point") + (goto-char (1+ measure-start)) + (goto-note-begin) + (while (< (point) end) + (let ((new-duration (walk-note-duration))) (if (null new-duration) - (if (not (looking-at "\\\\times[ \t]*\\([1-9]*\\)/\\([1-9]*\\)[ \t\n]*{")) + (if (not (looking-at + (concat "\\\\t\\(?:\\(imes\\)\\|uplet\\)[ \t]*\\([0-9]+\\)/\\([0-9]+\\)\\(?:[ \t\n]" + duration-regex "\\)?[ \t\n]*{"))) (skip-good-keywords) - ; handle \times specially - (let ((numerator (string-to-int (match-string 1))) - (denominator (string-to-int (match-string 2)))) + ; handle \times/\tuplet specially + (let* ((times-p (match-beginning 1)) + (numerator (string-to-int (match-string (if times-p 2 3)))) + (denominator (string-to-int (match-string (if times-p 3 2))))) (goto-char (match-end 0)) (goto-note-begin) (while (and (not (looking-at "}")) (< (point) end)) - (set 'new-duration (walk-note-duration)) + (setq new-duration (walk-note-duration)) (if (null new-duration) (if (looking-at "\\\\[a-z]*[ \t]*[a-z]*") (goto-char (match-end 0)) (error "Unknown text: %S %s" result(buffer-substring (point) end)))) (if (not (eq new-duration t)) - (set 'duration new-duration)) - (set 'result (add-fractions result + (setq duration new-duration)) + (setq result (add-fractions result (list (* numerator (car duration)) (* denominator (cadr duration))))) (goto-note-begin)) @@ -233,12 +232,11 @@ If next note has no duration, returns t" (forward-char 1)))) ; skip } (if (not (eq new-duration t)) - (set 'duration new-duration)) - (set 'result (add-fractions result duration))) - (goto-note-begin)) + (setq duration new-duration)) + (setq result (add-fractions result duration))) + (goto-note-begin))) - result -)))))) + result))))) (defun LilyPond-what-beat () "Returns how much of a measure lies between last measaure '|' and point. diff --git a/flower/cpu-timer.cc b/flower/cpu-timer.cc index f4c960196d..931dc6df0a 100644 --- a/flower/cpu-timer.cc +++ b/flower/cpu-timer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/file-name.cc b/flower/file-name.cc index 1746c2c28d..c65d8fc7ed 100644 --- a/flower/file-name.cc +++ b/flower/file-name.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -33,10 +33,6 @@ using namespace std; #include #endif -#ifdef __CYGWIN__ -#include -#endif - #ifndef ROOTSEP #define ROOTSEP ':' #endif @@ -49,21 +45,6 @@ using namespace std; #define EXTSEP '.' #endif -#ifdef __CYGWIN__ -static string -dos_to_posix (const string &file_name) -{ - char buf[PATH_MAX] = ""; - char s[PATH_MAX] = {0}; - file_name.copy (s, PATH_MAX - 1); - /* ugh: char const* argument gets modified. */ - int fail = cygwin_conv_to_posix_path (s, buf); - if (!fail) - return buf; - return file_name; -} -#endif /* __CYGWIN__ */ - /** Use slash as directory separator. On Windows, they can pretty much be exchanged. */ #if 0 @@ -144,12 +125,6 @@ File_name::to_string () const File_name::File_name (string file_name) { -#ifdef __CYGWIN__ - /* All system functions would work, even if we do not convert to - posix file_name, but we would think that \foe\bar\baz.ly is in - the cwd. */ - file_name = dos_to_posix (file_name); -#endif #ifdef __MINGW32__ file_name = slashify (file_name); #endif diff --git a/flower/file-path.cc b/flower/file-path.cc index b19732d15e..65cd517e5a 100644 --- a/flower/file-path.cc +++ b/flower/file-path.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -39,13 +39,14 @@ #define PATHSEP ':' #endif +#include + vector File_path::directories () const { return dirs_; } -#include void File_path::parse_path (const string &p) { diff --git a/flower/getopt-long.cc b/flower/getopt-long.cc index 88c5d92bde..9adc0c3592 100644 --- a/flower/getopt-long.cc +++ b/flower/getopt-long.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys, + Copyright (C) 1996--2015 Han-Wen Nienhuys, LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -103,11 +103,11 @@ Long_option_init::to_string () const { string str; if (shortname_char_) - str += "-" + shortname_char_; + str += string ("-") + shortname_char_; if (shortname_char_ && longname_str0_) str += ", "; if (longname_str0_) - str += string ("`--") + longname_str0_ + "'"; + str += string ("--") + longname_str0_; return str; } diff --git a/flower/include/arithmetic-operator.hh b/flower/include/arithmetic-operator.hh index 285e9cd350..fc6f68f65e 100644 --- a/flower/include/arithmetic-operator.hh +++ b/flower/include/arithmetic-operator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/axis.hh b/flower/include/axis.hh index f5ec6ca39a..f39eac4b97 100644 --- a/flower/include/axis.hh +++ b/flower/include/axis.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/compare.hh b/flower/include/compare.hh index 9822526e03..0ec1173951 100644 --- a/flower/include/compare.hh +++ b/flower/include/compare.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,10 +37,6 @@ prefix ONE_OPERATOR (type, function, !=) \ prefix ONE_OPERATOR (type, function, <) \ prefix ONE_OPERATOR (type, function, <=) \ - /* namespace std { */ \ - prefix inline type max (type t1, type t2) { return (t1 > t2) ? t1 : t2; } \ - prefix inline type min (type t1, type t2) { return (t1 < t2) ? t1 : t2; } \ - /* } */ \ /* stupid fix to allow ; */ \ prefix bool operator < (type t1, type t2) diff --git a/flower/include/cpu-timer.hh b/flower/include/cpu-timer.hh index b5cf5d07a4..3c492eeef9 100644 --- a/flower/include/cpu-timer.hh +++ b/flower/include/cpu-timer.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/direction.hh b/flower/include/direction.hh index dcb794eea1..0d36c0f7c7 100644 --- a/flower/include/direction.hh +++ b/flower/include/direction.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #ifndef DIRECTION_HH #define DIRECTION_HH +#include #include "axis.hh" enum Direction @@ -49,26 +50,9 @@ enum Direction }; inline Direction -other_dir (Direction const d) +operator - (Direction d) { - return (Direction) (-d); -} - -inline Direction -operator - (Direction const d) -{ - return other_dir (d); -} - -// to be deleted soon (after coping with issues 2491 and 2493 -inline Direction -flip (Direction *i) -{ - if (*i == (Direction)1) - *i = (Direction) - 1; - else if (*i == (Direction) - 1) - *i = (Direction)1; - return *i; + return Direction (- static_cast (d)); // cast avoids recursion } #define UP_and_DOWN(d) \ @@ -92,6 +76,4 @@ template T minmax (Direction d, T a, T b) return min (a, b); } -// String direction_string (Direction, Axis); - #endif // DIRECTION_HH diff --git a/flower/include/drul-array.hh b/flower/include/drul-array.hh index d84af5a614..6ef5fe1ffe 100644 --- a/flower/include/drul-array.hh +++ b/flower/include/drul-array.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/file-name.hh b/flower/include/file-name.hh index 4822783fc6..6f2da75093 100644 --- a/flower/include/file-name.hh +++ b/flower/include/file-name.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/file-path.hh b/flower/include/file-path.hh index 8c8049391d..1c039cf4ab 100644 --- a/flower/include/file-path.hh +++ b/flower/include/file-path.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/flower-proto.hh b/flower/include/flower-proto.hh index 33f67dbb40..33e587d000 100644 --- a/flower/include/flower-proto.hh +++ b/flower/include/flower-proto.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,8 +26,6 @@ typedef unsigned char Byte; typedef long long I64; class String_convert; -#include "std-string.hh" - #include "real.hh" using namespace std; diff --git a/flower/include/guile-compatibility.hh b/flower/include/guile-compatibility.hh index 3ef0413772..e68f422033 100644 --- a/flower/include/guile-compatibility.hh +++ b/flower/include/guile-compatibility.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/international.hh b/flower/include/international.hh index 5797a293f7..f2f48996de 100644 --- a/flower/include/international.hh +++ b/flower/include/international.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/interval-set.hh b/flower/include/interval-set.hh index 6ea7b43173..84f6debb30 100644 --- a/flower/include/interval-set.hh +++ b/flower/include/interval-set.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/interval.hh b/flower/include/interval.hh index cc6f70a9c8..88cd01f89f 100644 --- a/flower/include/interval.hh +++ b/flower/include/interval.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ #include #include "flower-proto.hh" +#include "std-string.hh" #include "drul-array.hh" /* A T interval. This represents the closed interval [left,right]. diff --git a/flower/include/interval.tcc b/flower/include/interval.tcc index 2ad1fa606b..72be6e81e9 100644 --- a/flower/include/interval.tcc +++ b/flower/include/interval.tcc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/libc-extension.hh b/flower/include/libc-extension.hh index 726df166ae..04056e6c49 100644 --- a/flower/include/libc-extension.hh +++ b/flower/include/libc-extension.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/matrix.hh b/flower/include/matrix.hh index 260f6c06bb..a6c13f837c 100644 --- a/flower/include/matrix.hh +++ b/flower/include/matrix.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/memory-stream.hh b/flower/include/memory-stream.hh index 1dffd7c98a..2cce5986b5 100644 --- a/flower/include/memory-stream.hh +++ b/flower/include/memory-stream.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/offset.hh b/flower/include/offset.hh index ba369a5c70..8f395398b7 100644 --- a/flower/include/offset.hh +++ b/flower/include/offset.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -169,5 +169,13 @@ dot_product (Offset o1, Offset o2) return o1[X_AXIS] * o2[X_AXIS] + o1[Y_AXIS] * o2[Y_AXIS]; } +inline +Real +cross_product (Offset o1, Offset o2) +{ + return o1[X_AXIS] * o2[Y_AXIS] - o1[Y_AXIS] * o2[X_AXIS]; +} + + #endif /* OFFSET_HH */ diff --git a/flower/include/parray.hh b/flower/include/parray.hh index cb3fc24ee8..9ef9ddb217 100644 --- a/flower/include/parray.hh +++ b/flower/include/parray.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/polynomial.hh b/flower/include/polynomial.hh index 1959688d8d..f80b53c2ee 100644 --- a/flower/include/polynomial.hh +++ b/flower/include/polynomial.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1993--2012 Han-Wen Nienhuys + Copyright (C) 1993--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ #ifndef POLY_H #define POLY_H +#include #include "std-vector.hh" #include "arithmetic-operator.hh" #include "real.hh" diff --git a/flower/include/pqueue.hh b/flower/include/pqueue.hh index 895ceca03e..6f1ebc53b6 100644 --- a/flower/include/pqueue.hh +++ b/flower/include/pqueue.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -69,7 +69,7 @@ public: } void OK () const { -#ifndef NDEBUG +#ifdef DEBUG for (vsize i = 2; i <= size (); i++) assert (compare (elt (i / 2), elt (i)) <= 0); #endif diff --git a/flower/include/rational.hh b/flower/include/rational.hh index de1252ec67..f829e531ec 100644 --- a/flower/include/rational.hh +++ b/flower/include/rational.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #ifndef RATIONAL_HH #define RATIONAL_HH +#include "compare.hh" #include "flower-proto.hh" #include "std-string.hh" #include diff --git a/flower/include/real.hh b/flower/include/real.hh index ceb1e114f0..d7208b4e56 100644 --- a/flower/include/real.hh +++ b/flower/include/real.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/std-string.hh b/flower/include/std-string.hh index 6b6e8ef972..0a34d05049 100644 --- a/flower/include/std-string.hh +++ b/flower/include/std-string.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Jan Nieuwenhuizen + Copyright (C) 2006--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,14 +20,13 @@ #ifndef STD_STRING_HH #define STD_STRING_HH -#include "compare.hh" #include "flower-proto.hh" #if 0 /* leads to dubious crashes - libstdc++ bug? */ -#ifndef NDEBUG +#ifdef DEBUG #define _GLIBCXX_DEBUG 1 #endif #endif @@ -55,8 +54,4 @@ string &replace_all (string *str, string const &find, string const &replace); string &replace_all (string *str, char find, char replace); char *string_copy (const string &s); -int string_compare (string const &, string const &); - -INSTANTIATE_COMPARE (string const &, string_compare); - #endif /* STD_STRING_HH */ diff --git a/flower/include/std-vector.hh b/flower/include/std-vector.hh index 8275b92930..589f7c0db2 100644 --- a/flower/include/std-vector.hh +++ b/flower/include/std-vector.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Jan Nieuwenhuizen + Copyright (C) 2006--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ /* leads to dubious crashes - libstdc++ bug? */ -#ifndef NDEBUG +#ifdef DEBUG #define _GLIBCXX_DEBUG 1 #endif #endif @@ -68,56 +68,7 @@ typedef size_t vsize; #define VPOS ((vsize) -1) #endif -#if HAVE_STL_DATA_METHOD #include -#else /* !HAVE_STL_DATA_METHOD */ -#define vector __flower_vector -#include -#undef vector - -namespace std -{ - -/* Interface without pointer arithmetic (iterator) semantics. */ -template > -class vector : public __flower_vector -{ -public: - typedef typename __flower_vector::iterator iterator; - typedef typename __flower_vector::const_iterator const_iterator; - - vector () : __flower_vector () - { - } - - vector (size_t n) : __flower_vector (n) - { - } - - vector (vector const &v) : __flower_vector (v) - { - } - - vector (const_iterator b, const_iterator e) : __flower_vector (b, e) - { - } - - T * - data () - { - return &(*this)[0]; - } - - T const * - data () const - { - return &(*this)[0]; - } -}; - -} /* namespace std */ - -#endif /* !HAVE_STL_DATA_METHOD */ template T const & diff --git a/flower/include/string-convert.hh b/flower/include/string-convert.hh index 6b4fba023f..8e1695bd5c 100644 --- a/flower/include/string-convert.hh +++ b/flower/include/string-convert.hh @@ -10,6 +10,7 @@ using namespace std; #include "flower-proto.hh" +#include "std-string.hh" /** The functor string_convert handles all conversions to/from string (some time, anyway). The class is quite empty from data view. */ diff --git a/flower/include/tuple.hh b/flower/include/tuple.hh index c88f1935ad..d9f5188625 100644 --- a/flower/include/tuple.hh +++ b/flower/include/tuple.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/virtual-methods.hh b/flower/include/virtual-methods.hh index fa084835d3..dc91d7b669 100644 --- a/flower/include/virtual-methods.hh +++ b/flower/include/virtual-methods.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/warn.hh b/flower/include/warn.hh index 333e95a94e..f52d3818cc 100644 --- a/flower/include/warn.hh +++ b/flower/include/warn.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/include/yaffut.hh b/flower/include/yaffut.hh index 148d1a8801..cd882461f4 100644 --- a/flower/include/yaffut.hh +++ b/flower/include/yaffut.hh @@ -395,9 +395,7 @@ void assert_throw (void (*pf) (), const char *at = "") #ifdef YAFFUT_MAIN -#include #include -#include int main (int argc, const char *argv[]) { diff --git a/flower/international.cc b/flower/international.cc index 2e6a09df9f..1518182a2c 100644 --- a/flower/international.cc +++ b/flower/international.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/interval-set.cc b/flower/interval-set.cc index f1aaea59fc..da857f277c 100644 --- a/flower/interval-set.cc +++ b/flower/interval-set.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/interval.cc b/flower/interval.cc index 04b141159d..a73da9e788 100644 --- a/flower/interval.cc +++ b/flower/interval.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/libc-extension.cc b/flower/libc-extension.cc index 59d4a52f13..1b8060cde2 100644 --- a/flower/libc-extension.cc +++ b/flower/libc-extension.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify diff --git a/flower/memory-stream.cc b/flower/memory-stream.cc index 6cce684858..511657f5fc 100644 --- a/flower/memory-stream.cc +++ b/flower/memory-stream.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/offset.cc b/flower/offset.cc index 180f8acc61..7cb2677481 100644 --- a/flower/offset.cc +++ b/flower/offset.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -90,8 +90,7 @@ Offset::angle_degrees () const Real Offset::length () const { - return sqrt (sqr (coordinate_a_[X_AXIS]) - + sqr (coordinate_a_[Y_AXIS])); + return hypot (coordinate_a_[X_AXIS], coordinate_a_[Y_AXIS]); } bool @@ -107,6 +106,17 @@ Offset Offset::direction () const { Offset d = *this; + if (isinf (d[X_AXIS])) + { + if (!isinf (d[Y_AXIS])) + return Offset ((d[X_AXIS] > 0.0 ? 1.0 : -1.0), 0.0); + } + else if (isinf (d[Y_AXIS])) + return Offset (0.0, (d[Y_AXIS] > 0.0 ? 1.0 : -1.0)); + else if (d[X_AXIS] == 0.0 && d[Y_AXIS] == 0.0) + return d; + // The other cases propagate or produce NaN as appropriate. + d /= length (); return d; } diff --git a/flower/polynomial.cc b/flower/polynomial.cc index e3e50d6bc5..ec8605058c 100644 --- a/flower/polynomial.cc +++ b/flower/polynomial.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1993--2012 Han-Wen Nienhuys + Copyright (C) 1993--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/flower/rational.cc b/flower/rational.cc index ed3d203b02..559e1646a0 100644 --- a/flower/rational.cc +++ b/flower/rational.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -216,11 +216,11 @@ Rational::compare (Rational const &r, Rational const &s) return -1; else if (r.sign_ > s.sign_) return 1; - else if (r.is_infinity ()) + else if (r.is_infinity ()) // here s is also infinite with the same sign return 0; - else if (r.sign_ == 0) + else if (r.sign_ == 0) // here s.sign_ is also zero return 0; - return r.sign_ * ::sign ((I64) (r.num_ * s.den_) - (I64) (s.num_ * r.den_)); + return ::sign (r - s); } int diff --git a/flower/std-string.cc b/flower/std-string.cc index 7dc9d47311..593a286d84 100644 --- a/flower/std-string.cc +++ b/flower/std-string.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Jan Nieuwenhuizen + Copyright (C) 2006--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,6 +19,7 @@ #include "std-string.hh" #include "string-convert.hh" +#include "std-vector.hh" string to_string (const string &s) @@ -116,14 +117,6 @@ string_copy (const string &s) return dest; } -int -string_compare (string const &a, string const &b) -{ - return a.compare (b); -} - -#include "std-vector.hh" - vector string_split (string str, char c) { diff --git a/flower/string-convert.cc b/flower/string-convert.cc index 745a98ecea..e3e8bc824d 100644 --- a/flower/string-convert.cc +++ b/flower/string-convert.cc @@ -85,8 +85,6 @@ String_convert::dec2int (const string &dec_string) 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-std.cc b/flower/test-std.cc index 8fce64abe1..4add05a625 100644 --- a/flower/test-std.cc +++ b/flower/test-std.cc @@ -1,9 +1,3 @@ -#define STD_VECTOR 1 - -#if !STD_VECTOR -#define Array flower_vector -#endif - #define HAVE_BOOST_LAMBDA 1 #include "std-vector.hh" @@ -12,10 +6,6 @@ #define YAFFUT_MAIN #include "yaffut.hh" -#if !STD_VECTOR -#define vector flower_vector -#endif - using namespace std; template @@ -27,17 +17,6 @@ print (vector v) cout << endl; } -#if !STD_VECTOR -template -void -print (Link_array v) -{ - for (vsize i = 0; i < v.size (); i++) - cout << "v[" << i << "] = " << *v[i] << endl; - cout << endl; -} -#endif - FUNC (vector_erase) { vector v; @@ -118,11 +97,7 @@ FUNC (vector_insert) FUNC (parray_concat) { -#if !STD_VECTOR - Link_array u, v; -#else vector u, v; -#endif int a[5] = { 0, 1, 2, 3, 4 }; u.push_back (&a[0]); u.push_back (&a[1]); diff --git a/flower/test-string.cc b/flower/test-string.cc index 5ed243fb08..1967d43751 100644 --- a/flower/test-string.cc +++ b/flower/test-string.cc @@ -1,5 +1,3 @@ -#define STD_VECTOR 1 - #define HAVE_BOOST_LAMBDA 1 #include "std-vector.hh" @@ -7,10 +5,6 @@ #include "yaffut.hh" -#if !STD_VECTOR -#define vector flower_vector -#endif - using namespace std; FUNC (string_split_join) diff --git a/flower/warn.cc b/flower/warn.cc index 52e2a42508..f17a36483f 100644 --- a/flower/warn.cc +++ b/flower/warn.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/input/regression/abc2ly/GNUmakefile b/input/regression/abc2ly/GNUmakefile index 7356f99cb3..438deba2c8 100644 --- a/input/regression/abc2ly/GNUmakefile +++ b/input/regression/abc2ly/GNUmakefile @@ -5,8 +5,8 @@ LOCALSTEPMAKE_TEMPLATES=lilypond ly lysdoc abc TEXI2HTML_FLAGS += --nomenu -TMP = $(sort $(ABC_FILES) $(TEXINFO_SOURCES) ) -COLLATED_FILES = ${TMP:%.abc=$(outdir)/%.ly} +TMP_FILES = $(sort $(ABC_FILES) $(TEXINFO_SOURCES) ) +COLLATED_FILES = ${TMP_FILES:%.abc=$(outdir)/%.ly} include $(depth)/make/stepmake.make diff --git a/input/regression/accidental-ancient.ly b/input/regression/accidental-ancient.ly index b242547058..2b24452541 100644 --- a/input/regression/accidental-ancient.ly +++ b/input/regression/accidental-ancient.ly @@ -6,13 +6,13 @@ are collected here. " } -\version "2.17.6" +\version "2.19.21" -\relative c'' { +\relative { \time 3/4 % FIXME: standard vs default, alteration-FOO vs FOO-alteration \override Staff.Accidental.glyph-name-alist = #standard-alteration-glyph-name-alist - cis^\markup { \typewriter default } c ces + cis''^\markup { \typewriter default } c ces \override Staff.Accidental.glyph-name-alist = #alteration-hufnagel-glyph-name-alist cis^\markup { \typewriter hufnagel } c ces diff --git a/input/regression/accidental-clef-change.ly b/input/regression/accidental-clef-change.ly index bab45b8d93..88469796ae 100644 --- a/input/regression/accidental-clef-change.ly +++ b/input/regression/accidental-clef-change.ly @@ -7,11 +7,11 @@ } -\version "2.16.0" -\new Staff \relative c' { +\version "2.19.21" +\new Staff \relative { \key g \major \clef treble - cis dis f + cis' dis f \clef bass } diff --git a/input/regression/accidental-collision.ly b/input/regression/accidental-collision.ly index 063c8065b1..923bffb36f 100644 --- a/input/regression/accidental-collision.ly +++ b/input/regression/accidental-collision.ly @@ -2,9 +2,9 @@ texidoc = "accidentals avoid stems of other notes too." } -\version "2.17.15" +\version "2.19.21" \paper { ragged-right = ##t } -\new Staff \relative c' <> +\new Staff \relative <> diff --git a/input/regression/accidental-contemporary.ly b/input/regression/accidental-contemporary.ly index eb05abcddb..536cce96f5 100644 --- a/input/regression/accidental-contemporary.ly +++ b/input/regression/accidental-contemporary.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Several automatic accidental rules @@ -29,9 +29,9 @@ Both scores should show the same accidentals. \layout { ragged-right = ##t } \score { - \relative c'' { + \relative { \accidentalStyle dodecaphonic - gis4 a g gisis + gis'4 a g gisis \accidentalStyle neo-modern gis8 a gis gis g' gis gis,, a' \accidentalStyle neo-modern-cautionary @@ -43,10 +43,10 @@ Both scores should show the same accidentals. } \score { - \relative c'' { + \relative { \set Staff.autoAccidentals = #'() \set Staff.autoCautionaries = #'() - gis!4 a! g! gisis! + gis'!4 a! g! gisis! gis!8 a gis! gis g'! gis! gis,,! a' eis! fis! eis? eis g?2 \key e \major diff --git a/input/regression/accidental-fingering-collision.ly b/input/regression/accidental-fingering-collision.ly index ac7a07e9c0..9e2f98dedd 100644 --- a/input/regression/accidental-fingering-collision.ly +++ b/input/regression/accidental-fingering-collision.ly @@ -1,4 +1,4 @@ -\version "2.17.0" +\version "2.19.21" \header { texidoc = "Horizontal @code{Fingering} grobs should not collide with @@ -6,7 +6,7 @@ accidentals. " } -\relative c' { +\relative { \time 2/4 \set fingeringOrientations = #'(left) | diff --git a/input/regression/accidental-forced-tie.ly b/input/regression/accidental-forced-tie.ly index 77fa641c5d..bd4148ccd3 100644 --- a/input/regression/accidental-forced-tie.ly +++ b/input/regression/accidental-forced-tie.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Accidentals can be forced with ! and ? even if the @@ -11,8 +11,8 @@ after a bar line are valid for the whole measure. ragged-right = ##t } -\relative c'' { - gis4 ~ gis!~ gis? r4 +\relative { + gis'4 ~ gis!~ gis? r4 fis1 ~ fis!2 fis ~ fis?2 fis diff --git a/input/regression/accidental-grouping.ly b/input/regression/accidental-grouping.ly index b8cfce4fbc..f1ec07e0b7 100644 --- a/input/regression/accidental-grouping.ly +++ b/input/regression/accidental-grouping.ly @@ -1,4 +1,4 @@ -\version "2.17.10" +\version "2.19.21" \header { texidoc = "By setting @code{accidentalGrouping} to @code{'voice}, @@ -7,8 +7,8 @@ in different voices as seen in this test's E-sharp. " } - \relative c''' { - << { 1 } \\ + \relative { + << { 1 } \\ { eis, } >> \set Staff . accidentalGrouping = #'voice << { 1 } \\ diff --git a/input/regression/accidental-ledger.ly b/input/regression/accidental-ledger.ly index d281e2be9c..33bf0f9aff 100644 --- a/input/regression/accidental-ledger.ly +++ b/input/regression/accidental-ledger.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -9,7 +9,7 @@ and only if the accidental is horizontally close to the head. " } -\relative c { +\relative { disis dis d diff --git a/input/regression/accidental-piano.ly b/input/regression/accidental-piano.ly index c1c64c80cb..6a76811017 100644 --- a/input/regression/accidental-piano.ly +++ b/input/regression/accidental-piano.ly @@ -6,14 +6,14 @@ accidental." } -\version "2.17.15" +\version "2.19.21" \layout { ragged-right = ##t } -\new PianoStaff \relative c' << +\new PianoStaff \relative << \accidentalStyle piano \new Staff { ges'4 ges4 } \new Staff { r8 gis r8 gis } diff --git a/input/regression/accidental-placement-padding.ly b/input/regression/accidental-placement-padding.ly index 5cf5c665f8..3fdd648dca 100644 --- a/input/regression/accidental-placement-padding.ly +++ b/input/regression/accidental-placement-padding.ly @@ -1,12 +1,12 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Accidental padding works for all accidentals, including those modifying the same pitch." } -\relative c' { +\relative { \override Staff.AccidentalPlacement.padding = #2 - 1 + 1 1 } diff --git a/input/regression/accidental-placement-samepitch.ly b/input/regression/accidental-placement-samepitch.ly index 4daaa2e7bc..bed366e576 100644 --- a/input/regression/accidental-placement-samepitch.ly +++ b/input/regression/accidental-placement-samepitch.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "When two (or more) accidentals modify the same pitch, @@ -8,7 +8,7 @@ as one another. In either case, collisions with accidentals of different pitches are correctly computed." } -\relative c'' -{<< \\ >> } +\relative +{<< \\ >> } \paper {ragged-right = ##t} diff --git a/input/regression/accidental-placement.ly b/input/regression/accidental-placement.ly index 008513d5ae..2a3ba81966 100644 --- a/input/regression/accidental-placement.ly +++ b/input/regression/accidental-placement.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -15,9 +15,9 @@ flats in a sixth should be staggered. " } -\context Voice \relative c' +\context Voice \relative { - 4 + 4 cis4 c4 \transpose c c' { diff --git a/input/regression/accidental-quarter.ly b/input/regression/accidental-quarter.ly index a1fc977745..46100c7ae4 100644 --- a/input/regression/accidental-quarter.ly +++ b/input/regression/accidental-quarter.ly @@ -3,12 +3,12 @@ texidoc = "Quarter tone notation is supported, including threequarters flat." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c'' { +\relative { \time 12/4 - ceses4 + ceses''4 ceseh ces ceh diff --git a/input/regression/accidental-single-double.ly b/input/regression/accidental-single-double.ly index c849234597..df1d7df36f 100644 --- a/input/regression/accidental-single-double.ly +++ b/input/regression/accidental-single-double.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc=" A sharp sign after a double sharp sign, as well as a flat sign @@ -7,7 +7,7 @@ natural sign. " } -thenotes = \relative cis' { +thenotes = \relative { \time 4/4 gisis'4 gis geses ges | } diff --git a/input/regression/accidental-suggestions.ly b/input/regression/accidental-suggestions.ly index 6e0a867ffa..f3b5d46ec1 100644 --- a/input/regression/accidental-suggestions.ly +++ b/input/regression/accidental-suggestions.ly @@ -7,15 +7,15 @@ denoting Musica Ficta." } -\version "2.17.25" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c'' { +\relative { \time 2/4 \set suggestAccidentals = ##t - cis^> gis'-! + cis''^> gis'-! \override AccidentalSuggestion.parenthesized = ##t cis,_"paren" gis' diff --git a/input/regression/accidental-tie.ly b/input/regression/accidental-tie.ly index f69a7a8575..fd733ed6cf 100644 --- a/input/regression/accidental-tie.ly +++ b/input/regression/accidental-tie.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "The second and third notes should not get accidentals, @@ -14,15 +14,15 @@ ragged-right = ##t } -mus = \relative c' { - f1~ - f2~f4 % ~ f8 +mus = \relative { + f'1~ + 2~4 % ~ f8 fis8 gis8 ~ \break gis1 \override Accidental.hide-tied-accidental-after-break = ##t f1~ - f2~f4 % ~ f8 + 2~4 % ~ f8 fis8 gis8 ~ \break gis1 diff --git a/input/regression/accidental-unbroken-tie-spacing.ly b/input/regression/accidental-unbroken-tie-spacing.ly index 7f22cdf0ba..feae702a9e 100644 --- a/input/regression/accidental-unbroken-tie-spacing.ly +++ b/input/regression/accidental-unbroken-tie-spacing.ly @@ -1,14 +1,22 @@ \header { -texidoc = "Tied notes with accidentals do not cause problems with spacing." +texidoc = "Space is allowed for the actual size of accidentals on tied notes." } -\version "2.16.0" - -\relative c' { +\version "2.19.21" +\paper {ragged-right = ##t } +\relative { \clef treble \time 3/4 - c8 b2 8 ~ | - 8 + c'8 b2 8 ~ | + 8 r + % Large accidental + \override Staff.Accidental.stencil = + #(lambda (g) + (let ((alt (ly:grob-property g 'alteration))) + (grob-interpret-markup g + (make-circle-markup (number->string alt))))) + bes4 ~ bes ~ | bes ~ bes bes ~ | \break + bes ~ bes bes } diff --git a/input/regression/accidental.ly b/input/regression/accidental.ly index 4fa0feddbc..3e95168608 100644 --- a/input/regression/accidental.ly +++ b/input/regression/accidental.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc=" @@ -10,7 +10,7 @@ fourth show forced and cautionary accidentals. \layout { ragged-right = ##t } -foo = \relative c'' { \key as \major dis4 dis dis!^"force" dis? } +foo = \relative { \key as \major dis''4 dis dis!^"force" dis? } << \foo \context NoteNames \foo diff --git a/input/regression/add-stem-support.ly b/input/regression/add-stem-support.ly index ab22af643b..db542afb84 100644 --- a/input/regression/add-stem-support.ly +++ b/input/regression/add-stem-support.ly @@ -1,4 +1,4 @@ -\version "2.17.10" +\version "2.19.12" \header { texidoc = "@code{add-stem-support} can be removed or implemented @@ -18,8 +18,8 @@ music = { { \music - \override Fingering #'add-stem-support = ##f + \override Fingering.add-stem-support = ##f \music - \override Fingering #'add-stem-support = #only-if-beamed + \override Fingering.add-stem-support = #only-if-beamed \music } \ No newline at end of file diff --git a/input/regression/addlyrics-existing-context.ly b/input/regression/addlyrics-existing-context.ly new file mode 100644 index 0000000000..94e9ab80d3 --- /dev/null +++ b/input/regression/addlyrics-existing-context.ly @@ -0,0 +1,25 @@ +\version "2.19.14" + +\header { + texidoc = " +@code{\\addlyrics} should be able to attach itself to named and unnamed @code{Voice} +constructs. For all tests where this succeeds, the noteheads will be red." +} + +\layout { ragged-right = ##t } + +\new Staff \new Voice \with { \override NoteHead.color = #red } +{ \tempo \markup \typewriter "\\new Staff \\new Voice" c'1 } +\addlyrics { Oh! } + +\new Voice \with { \override NoteHead.color = #red } +{ \tempo \markup \typewriter "\\new Voice" c'1 } +\addlyrics { Oh! } + +\new Staff \new Voice = "named" \with { \override NoteHead.color = #red } +{ \tempo \markup \typewriter "\\new Staff \\new Voice = \"named\"" c'1 } +\addlyrics { Oh! } + +\new Voice = "named" \with { \override NoteHead.color = #red } +{ \tempo \markup \typewriter "\\new Voice = \"named\"" c'1 } +\addlyrics { Oh! } diff --git a/input/regression/addlyrics-to-staff-context.ly b/input/regression/addlyrics-to-staff-context.ly new file mode 100644 index 0000000000..13b45cacf7 --- /dev/null +++ b/input/regression/addlyrics-to-staff-context.ly @@ -0,0 +1,22 @@ +\version "2.19.14" + +\header { + texidoc = " +@code{\\addlyrics} may get used on a @code{Staff} context and will +then consider all note events created below it for synchronization. +" +} + +\relative \new Staff { + \time 2/4 + c''4 b8. a16 g4. + << { r8 a4( b) c2 } \\ + { f,8 e4 d c2 } + >> +} +\addlyrics { + Life is __ _ love, _ live __ _ life. +} +\addlyrics { + No more let sins and sor -- rows grow. +} diff --git a/input/regression/alignment-order.ly b/input/regression/alignment-order.ly index 5a6be94daf..3616791b62 100644 --- a/input/regression/alignment-order.ly +++ b/input/regression/alignment-order.ly @@ -3,14 +3,14 @@ anywhere in the vertical alignment. " } -\version "2.17.15" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c' << - \new Staff = "1" { c2 c s1 } +\relative << + \new Staff = "1" { c'2 c s1 } \new Staff = "2" { c2 c s1 } \new StaffGroup << \new Staff = "3" { c2 c s1 } diff --git a/input/regression/alignment-vertical-manual-setting.ly b/input/regression/alignment-vertical-manual-setting.ly index 1314f2941a..036a26419e 100644 --- a/input/regression/alignment-vertical-manual-setting.ly +++ b/input/regression/alignment-vertical-manual-setting.ly @@ -6,12 +6,12 @@ } -\version "2.17.6" +\version "2.19.21" \book { \score { - \relative c'' \new StaffGroup << - \new Staff { c1 c c c } + \relative \new StaffGroup << + \new Staff { c''1 c c c } \new Staff { c c c c } \new Staff { \overrideProperty diff --git a/input/regression/alter-broken.ly b/input/regression/alter-broken.ly index 14652297e6..b507bd42b1 100644 --- a/input/regression/alter-broken.ly +++ b/input/regression/alter-broken.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "The command @code{\\alterBroken} may be used to override the @@ -12,8 +12,8 @@ its usage with a variety of data types." #(ly:expect-warning (_ "not a spanner name")) -\relative c'' { - d4-\alterBroken #'positions #'((3 . 3) (5 . 5)) +\relative { + d''4-\alterBroken #'positions #'((3 . 3) (5 . 5)) -\alterBroken #'color #'((0 0 1) (1 0 0)) -\alterBroken #'dash-definition #'( ((0 1 0.4 0.75)) ((0 0.5 0.4 0.75) (0.5 1 1 1)) ) diff --git a/input/regression/ambitus-cue.ly b/input/regression/ambitus-cue.ly index 83b10e3ac7..75e4d97c6b 100644 --- a/input/regression/ambitus-cue.ly +++ b/input/regression/ambitus-cue.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Ambitus for pieces beginning with @code{\\cueDuringWithClef}. @@ -8,10 +8,13 @@ a cue is frequently in a different clef, so the @code{\\cueDuringWithClef} command is handy. Using this command at the beginning of a piece should leave the ambitus displayed based on the main clef. + +An @code{Ambitus_engraver} should ignore notes in @code{CueVoice} +contexts. " } -\addQuote "other" \relative c { r4 c e g } +\addQuote "other" \relative { r4 c e g } \new Staff \new Voice \relative c' { @@ -21,7 +24,7 @@ on the main clef. \layout { \context { - \Voice + \Staff \consists "Ambitus_engraver" } } diff --git a/input/regression/ambitus.ly b/input/regression/ambitus.ly index b5c579b01d..12b84d5630 100644 --- a/input/regression/ambitus.ly +++ b/input/regression/ambitus.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Ambitus indicate pitch ranges for voices. @@ -22,13 +22,13 @@ visible; the accidentals are prevented from colliding. \time 2/4 c4 f' } - \new Staff \relative c' { + \new Staff \relative { \time 2/4 \key d \major - cis as' + cis' as' } - \new Staff \relative c' { + \new Staff \relative { \time 2/4 - c4 cis + c'4 cis } >> diff --git a/input/regression/apply-context.ly b/input/regression/apply-context.ly index 712f4ec237..90ebff0c99 100644 --- a/input/regression/apply-context.ly +++ b/input/regression/apply-context.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -17,8 +17,8 @@ This example prints a bar-number during processing on stdout. \layout { ragged-right= ##t } -\relative c'' { - c1 c1 +\relative { + c''1 c1 %% todo: should put something interesting in the .tex output. diff --git a/input/regression/apply-output.ly b/input/regression/apply-output.ly index 6e50ca5c44..fd1268dee8 100644 --- a/input/regression/apply-output.ly +++ b/input/regression/apply-output.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.24" \header { texidoc = "The @code{\\applyOutput} expression is the most flexible way to @@ -10,29 +10,22 @@ position. } #(define (mc-squared gr org cur) - (let* - ( - (ifs (ly:grob-interfaces gr)) - (sp (ly:grob-property gr 'staff-position)) - ) - (if (memq 'note-head-interface ifs) - (begin - (ly:grob-set-property! gr 'stencil - (grob-interpret-markup gr - (make-raise-markup -0.5 - (case sp - ((-5) (make-simple-markup "m")) - ((-3) (make-simple-markup "c ")) - ((-2) (make-smaller-markup (make-bold-markup "2"))) - (else (make-simple-markup "bla")) - )))) - )))) + (let ((sp (ly:grob-property gr 'staff-position))) + (ly:grob-set-property! + gr 'stencil + (grob-interpret-markup gr + #{ \markup \raise #-0.5 + #(case sp + ((-5) "m") + ((-3) "c ") + ((-2) #{ \markup \teeny \bold 2 #}) + (else "bla")) #})))) -\new Voice \relative c' { +\new Voice \relative { \set autoBeaming = ##f - 8 + 8 - \applyOutput #'Voice #mc-squared + \applyOutput Voice.NoteHead #mc-squared 8 } diff --git a/input/regression/arpeggio-no-overshoot.ly b/input/regression/arpeggio-no-overshoot.ly index 96ebc54854..e803a1b5d6 100644 --- a/input/regression/arpeggio-no-overshoot.ly +++ b/input/regression/arpeggio-no-overshoot.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Arpeggios do not overshoot the highest note head. @@ -6,10 +6,10 @@ The first chord in this example simulates overshoot using @code{'positions} for comparison with the correct behaviour." } -\relative c' { +\relative { % simulate overshoot for comparison \once \override Arpeggio.positions = #'(-3 . 1) - 1\arpeggio + 1\arpeggio 1\arpeggio 2\arpeggio \arpeggio } diff --git a/input/regression/arpeggio-no-staff-symbol.ly b/input/regression/arpeggio-no-staff-symbol.ly index c2d4380214..a472e68a70 100644 --- a/input/regression/arpeggio-no-staff-symbol.ly +++ b/input/regression/arpeggio-no-staff-symbol.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Arpeggios stil work in the absence of a staff-symbol." } \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c' { - \arpeggio +\relative { + \arpeggio } diff --git a/input/regression/arpeggio-span-one-staff-collision.ly b/input/regression/arpeggio-span-one-staff-collision.ly index d5ba546c56..dd4376c4d5 100644 --- a/input/regression/arpeggio-span-one-staff-collision.ly +++ b/input/regression/arpeggio-span-one-staff-collision.ly @@ -1,4 +1,4 @@ -\version "2.17.26" +\version "2.19.21" \header { texidoc = "Span arpeggios that are not cross-staff do not have @@ -12,11 +12,11 @@ horizontal spacing problems. { \consists "Span_arpeggio_engraver" } -\relative c'' +\relative { \set Staff.connectArpeggios = ##t << - {r2. 4\arpeggio |} + {r2. 4\arpeggio |} \\ {\repeat unfold 12 aes,16 4\arpeggio |} >> diff --git a/input/regression/arpeggio-span-one-staff.ly b/input/regression/arpeggio-span-one-staff.ly index c5860407b1..8a48a9bc4c 100644 --- a/input/regression/arpeggio-span-one-staff.ly +++ b/input/regression/arpeggio-span-one-staff.ly @@ -2,15 +2,15 @@ texidoc = "Span arpeggios within one staff also work" } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } \new PianoStaff << \set PianoStaff.connectArpeggios = ##t - \new Staff \relative c'' { + \new Staff \relative { << { - c2\arpeggio + c''2\arpeggio } \\ { diff --git a/input/regression/articulation-snappizzicato.ly b/input/regression/articulation-snappizzicato.ly index 784f721789..65e1bc2b15 100644 --- a/input/regression/articulation-snappizzicato.ly +++ b/input/regression/articulation-snappizzicato.ly @@ -1,6 +1,6 @@ \header { texidoc = "The snappizzicato articulation adds a snappizzicato sign to the note." } -\version "2.16.0" +\version "2.19.21" -\relative c'' { c4\snappizzicato } +\relative { c''4\snappizzicato } diff --git a/input/regression/auto-beam-breathe.ly b/input/regression/auto-beam-breathe.ly index 5eee83a9f1..c64a53f1c9 100644 --- a/input/regression/auto-beam-breathe.ly +++ b/input/regression/auto-beam-breathe.ly @@ -1,13 +1,13 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Automatic beams are ended early if a breathing sign is encountered." } -\relative c' { +\relative { \time 1/1 - \repeat unfold 8 c8 + \repeat unfold 8 c'8 c8 c \breathe c8 c c c c diff --git a/input/regression/auto-beam-exceptions.ly b/input/regression/auto-beam-exceptions.ly index 676bb3aafb..b7d553b123 100644 --- a/input/regression/auto-beam-exceptions.ly +++ b/input/regression/auto-beam-exceptions.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.0" \header { @@ -11,40 +11,20 @@ \relative c' { \time 2/4 - \set Score.beamExceptions = #'( - ( end . - ( - ( (1 . 32) . (4 4 4 4) ) - ) - ) - ) + \set Score.beamExceptions = + \beamExceptions \repeat unfold 4 { 32[ 32 32 32] } \repeat unfold 16 c32 \time 3/4 - \set Score.beamExceptions = #'( - ( end . - ( - ( (1 . 32) . (4 4 4 4 4 4) ) - ) - ) - ) + \set Score.beamExceptions = + \beamExceptions \repeat unfold 6 { 32[ 32 32 32] } \repeat unfold 24 c32 c8 c32 c32 c32 c32 c16 c16 c32 c32 c32 c32 c16 c32 c32 c32 c32 c32 c32 \time 4/4 - \set Score.beamExceptions = #'( - ( end . - ( - ( (1 . 32) . (4 4 4 4 4 4 4 4) ) - ) - ) - ) + \set Score.beamExceptions = + \beamExceptions \repeat unfold 8 { 32[ 32 32 32] } \repeat unfold 32 c32 \time 6/8 - \set Score.beamExceptions = #'( - ( end . - ( - ( (1 . 32) . (4 4 4 4 4 4) ) - ) - ) - ) + \set Score.beamExceptions = + \beamExceptions \repeat unfold 6 { 32[ 32 32 32] } \repeat unfold 24 c32 } diff --git a/input/regression/auto-beam-no-beam.ly b/input/regression/auto-beam-no-beam.ly index bf82fb1f4c..1791e946c5 100644 --- a/input/regression/auto-beam-no-beam.ly +++ b/input/regression/auto-beam-no-beam.ly @@ -6,9 +6,9 @@ } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c' { c8 c-\noBeam c c } +\relative { c'8 c-\noBeam c c } diff --git a/input/regression/auto-beam-partial.ly b/input/regression/auto-beam-partial.ly index 1151dea94c..85e89ada5d 100644 --- a/input/regression/auto-beam-partial.ly +++ b/input/regression/auto-beam-partial.ly @@ -2,12 +2,12 @@ texidoc="Autobeaming works properly in partial measures." } -\version "2.16.0" +\version "2.19.21" -\relative c'' { +\relative { \time 6/8 \partial 2 - a8 a a a | + a'8 a a a | } diff --git a/input/regression/auto-beam-recheck.ly b/input/regression/auto-beam-recheck.ly index 08dd89564e..148870eebb 100644 --- a/input/regression/auto-beam-recheck.ly +++ b/input/regression/auto-beam-recheck.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "In 4/4 time, the first and second and third and fourth @@ -8,8 +8,8 @@ If any shorter notes are included, each beat should be beamed separately." } \layout { ragged-right = ##t } -\relative c'' { - \repeat unfold 8 { a8} | +\relative { + \repeat unfold 8 { a'8} | a8 a a a16 a a8 a a16 a a8 | r16 a8. a8 a16 a r8. a16 a8 a16 a | } diff --git a/input/regression/auto-beam.ly b/input/regression/auto-beam.ly index 8c58935d81..03a34d1e5c 100644 --- a/input/regression/auto-beam.ly +++ b/input/regression/auto-beam.ly @@ -3,7 +3,7 @@ beam." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t @@ -14,7 +14,7 @@ beam." } -\relative c'' { - a\longa a\breve +\relative { + a'\longa a\breve a1 a2 a4 a8 a16 a32 a64 a64 } diff --git a/input/regression/auto-change.ly b/input/regression/auto-change.ly index f57fe6cbc1..493e97c12f 100644 --- a/input/regression/auto-change.ly +++ b/input/regression/auto-change.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -13,7 +13,7 @@ note. When central C is reached, staff is not yet switched (by default). \context PianoStaff << \context Staff = "up" { - \autochange \new Voice << \relative c' { g4 c e d c r4 a g } >> + \autochange \new Voice << \relative { g4 c e d c8 r r4 a g } >> } \context Staff = "down" { \clef bass diff --git a/input/regression/autobeam-3-4-rules.ly b/input/regression/autobeam-3-4-rules.ly index 79aad6b6bb..04fabcb021 100644 --- a/input/regression/autobeam-3-4-rules.ly +++ b/input/regression/autobeam-3-4-rules.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.40" \header { @@ -28,7 +28,7 @@ is changed, beams should start at the beginning of the measure. c c c r r4 \bar "||" \set Timing.baseMoment = #(ly:make-moment 1/8) - \set Timing.beatStructure = #'(3 3) + \set Timing.beatStructure = 3,3 r8^\markup "Override to beam groups of 3 eighth notes" c c c c c r4. c8 c c c c c r4. } diff --git a/input/regression/autobeam-tuplet-recheck.ly b/input/regression/autobeam-tuplet-recheck.ly index 37a1361d9b..427edd7ec8 100644 --- a/input/regression/autobeam-tuplet-recheck.ly +++ b/input/regression/autobeam-tuplet-recheck.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { @@ -7,9 +7,9 @@ In the example, the first beat should be beamed completely together." } -\relative c' { +\relative { \time 2/4 - c16 c + c'16 c \tuplet 3/2 { c8 c16 } \tuplet 3/2 { c8 c16 } c16 c diff --git a/input/regression/autochange-clefs.ly b/input/regression/autochange-clefs.ly new file mode 100644 index 0000000000..def22f2aa3 --- /dev/null +++ b/input/regression/autochange-clefs.ly @@ -0,0 +1,22 @@ + +\version "2.19.25" + +\header { + texidoc=" Other clefs for the autochanger may be set. This works for +implicitly created staves only. +The first example should turn at b with soprano-clef in the upper Staff. +The second example should turn at d' with alto-clef in the upper and tenor-clef +in the lower Staff. +" +} + +\layout { ragged-right= ##t } + +music = { + g8 b a c' + b8 d' c'8 e' + d'8 r f' g' a'2 +} + +\autochange b \with { \clef soprano } \music +\autochange d' \with { \clef alto } \with { \clef tenor } \music diff --git a/input/regression/autochange-inside-grace.ly b/input/regression/autochange-inside-grace.ly new file mode 100644 index 0000000000..ac1079a62f --- /dev/null +++ b/input/regression/autochange-inside-grace.ly @@ -0,0 +1,18 @@ +\header { + texidoc = "Grace notes are placed on the appropriate staff." +} + +\version "2.19.22" +\layout { ragged-right = ##t } + +\score { + << + \context Staff = "up" { s1 } + \context Staff = "down" { + \clef "bass" + r2 + \grace { \autochange { e16 e'' } } + c'2 + } + >> +} diff --git a/input/regression/autochange-relative.ly b/input/regression/autochange-relative.ly new file mode 100644 index 0000000000..45fae17919 --- /dev/null +++ b/input/regression/autochange-relative.ly @@ -0,0 +1,17 @@ +\version "2.19.23" + +\header { + texidoc = "@code{\\autochange} needs to be given pitches in their +final octaves, so if @code{\\relative} is used it must be applied +inside @code{\\autochange}. The pitches in @code{\\autochange} are +unaffected by an outer @code{\\relative}, so that the printed output +shows the pitches that @code{\\autochange} used. + +The expected output of this test is three identical measures." +} + +\new PianoStaff { + \autochange \absolute {g4 c g' c} + \relative \autochange {g4 c g' c} % relative is ignored + \autochange \relative {g4 c, g'' c,,} +} diff --git a/input/regression/autochange-turning-pitch.ly b/input/regression/autochange-turning-pitch.ly new file mode 100644 index 0000000000..f71e234f10 --- /dev/null +++ b/input/regression/autochange-turning-pitch.ly @@ -0,0 +1,19 @@ + +\version "2.19.25" + +\header { + texidoc=" Other turning points for the autochanger are possible." +} + +\layout { ragged-right= ##t } + +\context PianoStaff << + \context Staff = "up" { + \autochange \relative { <>^"default c' " b4 c d e } + \autochange d' \relative { <>^"switch after d' " b c d e } + } + \context Staff = "down" { + \clef bass + s1*2 + } +>> diff --git a/input/regression/autochange-with-grace.ly b/input/regression/autochange-with-grace.ly new file mode 100644 index 0000000000..262f42754a --- /dev/null +++ b/input/regression/autochange-with-grace.ly @@ -0,0 +1,17 @@ +\header { + texidoc = "Grace notes are placed on the appropriate staff." +} + +\version "2.19.22" +\layout { ragged-right = ##t } + +\score { + << + \context Staff = "up" { s1 } + \context Staff = "down" { + \clef "bass" + r2 + \autochange { \grace { g8 g' } e'4 e } + } + >> +} diff --git a/input/regression/automatic-polyphony-context-id.ly b/input/regression/automatic-polyphony-context-id.ly index 22c838efaa..786c718942 100644 --- a/input/regression/automatic-polyphony-context-id.ly +++ b/input/regression/automatic-polyphony-context-id.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" \header { texidoc = "The bottom-level contexts in polyphony shorthand are @@ -10,7 +10,7 @@ This snippet will fail to compile if either voice has an invalid } assertContextId = -#(define-music-function (parser location id) (string?) +#(define-music-function (id) (string?) (let ((music (make-music 'ApplyContext 'procedure (lambda (ctx) diff --git a/input/regression/backend-svg.ly b/input/regression/backend-svg.ly index f74f65852c..ad0c30036c 100644 --- a/input/regression/backend-svg.ly +++ b/input/regression/backend-svg.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" %{ #(ly:set-option 'backend 'svg) #(set! output-count 1) @@ -7,7 +7,7 @@ \include "typography-demo.ly" -#(define outname (ly:parser-output-name parser)) +#(define outname (ly:parser-output-name)) #(ly:set-option 'backend 'eps) diff --git a/input/regression/baerenreiter-sarabande.ly b/input/regression/baerenreiter-sarabande.ly index 426bbf4b18..891a3a595c 100644 --- a/input/regression/baerenreiter-sarabande.ly +++ b/input/regression/baerenreiter-sarabande.ly @@ -1,6 +1,6 @@ -\version "2.17.6" +\version "2.19.21" -forcedLastBreak = { \break } +forcedLastBreak = {} %% { \break } if needed to match original breaks %% We want this to perfectly match the Bärenreiter spacing. %% If we're not using 6 systems, there's definitely a problem. @@ -50,7 +50,7 @@ half way in measure 13 has been forgotten. } -sarabandeA = \context Voice \relative c { +sarabandeA = \context Voice \relative { \override Staff.NoteCollision.merge-differently-dotted = ##t @@ -171,11 +171,10 @@ smallerPaper = \layout { ragged-bottom = ##t indent = 7. \mm line-width =183.5 \mm - obsolete-between-system-space = 25\mm - system-system-spacing #'basic-distance = #(/ obsolete-between-system-space staff-space) - system-system-spacing #'padding = #0 - score-system-spacing #'basic-distance = #(/ obsolete-between-system-space staff-space) - score-system-spacing #'padding = #0 + system-system-spacing.basic-distance = 14.22 % 25mm, in staff-spaces + system-system-spacing.padding = #0 + score-system-spacing.basic-distance = #0 + score-system-spacing.padding = #0 system-count = 6 %% annotatespacing = ##t diff --git a/input/regression/bar-line-define-bar-glyph.ly b/input/regression/bar-line-define-bar-glyph.ly index cceab759f1..229075915b 100644 --- a/input/regression/bar-line-define-bar-glyph.ly +++ b/input/regression/bar-line-define-bar-glyph.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { texidoc = "New bar line glyphs can be defined in Scheme." } @@ -16,9 +16,9 @@ \defineBarLine "0" #'("0" "" "") -\relative c' \new StaffGroup << +\relative \new StaffGroup << \new Staff { - c4 c \bar "0" c c \bar "0" \break + c'4 c \bar "0" c c \bar "0" \break c1 } \new Staff { diff --git a/input/regression/bar-line-define-bar-line.ly b/input/regression/bar-line-define-bar-line.ly index b181aa3890..7c1e73635f 100644 --- a/input/regression/bar-line-define-bar-line.ly +++ b/input/regression/bar-line-define-bar-line.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { texidoc = "New bar line styles can be defined by @code{\\defineBarLine}." } @@ -8,9 +8,9 @@ \defineBarLine "[|;" #'("|" "[|;" " |") \defineBarLine ";|]" #'(";|]" "" " |") -\relative c' \new StaffGroup << +\relative \new StaffGroup << \new Staff { - c4 c \bar "[|;" c c \bar ";|]" \break + c'4 c \bar "[|;" c c \bar ";|]" \break c4 c \bar ";|]" c c \bar "[|;" \break c1 } \new Staff { diff --git a/input/regression/bar-line-segno.ly b/input/regression/bar-line-segno.ly index 3bbf05e075..24f5dfcf11 100644 --- a/input/regression/bar-line-segno.ly +++ b/input/regression/bar-line-segno.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { texidoc = "Segno bar lines can be used to mark the begin and the end of a segno part." @@ -6,9 +6,9 @@ \paper { ragged-right = ##t } -\relative c' \new StaffGroup << +\relative \new StaffGroup << \new Staff { - c4 \bar "S" c \bar "S-|" c \bar "S-S" c \bar ":|.S" \break + c'4 \bar "S" c \bar "S-|" c \bar "S-S" c \bar ":|.S" \break c4 c \bar ":|.S.|:" c c \bar ":|.S.|:-S" \break c4 c c2 \bar "S.|:" \break c1 \bar ":|.S-S" \break diff --git a/input/regression/bar-lines.ly b/input/regression/bar-lines.ly index 3beb61a904..42fb31a15f 100644 --- a/input/regression/bar-lines.ly +++ b/input/regression/bar-lines.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { texidoc = "Various types of bar lines can be drawn. @@ -15,9 +15,9 @@ space, centered on the top-most barline. " } -\relative c' \new StaffGroup << +\relative \new StaffGroup << \new Staff = "1" { - c2 \bar "!" c + c'2 \bar "!" c s1 c2 \bar ";" c s1 diff --git a/input/regression/bar-number-check-warning.ly b/input/regression/bar-number-check-warning.ly index 7bede8d7ca..9c20c082ae 100644 --- a/input/regression/bar-number-check-warning.ly +++ b/input/regression/bar-number-check-warning.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "Barcheck failed got ~a expect ~a") 3 15) @@ -10,8 +10,8 @@ bar number is correct. } -\relative c'' { - c1 | +\relative { + c''1 | \barNumberCheck #2 % OK c1 | \barNumberCheck #15 % Warning diff --git a/input/regression/bar-number-check.ly b/input/regression/bar-number-check.ly new file mode 100644 index 0000000000..7f6d914350 --- /dev/null +++ b/input/regression/bar-number-check.ly @@ -0,0 +1,19 @@ +\version "2.18.0" + +\header { + texidoc = "This checks the warning of @code{\\barNumberCheck}." +} + +\layout { ragged-right = ##t } + +#(ly:expect-warning (_ "Barcheck failed got ~a expect ~a") 2 3) +\book { + \score { + { + c'2^\markup \with-color #green \bold "\\barNumberCheck #1" + \barNumberCheck #1 + d'^\markup \with-color #red \bold "\\barNumberCheck #3" + \barNumberCheck #3 + } + } +} diff --git a/input/regression/bar-number-visibility.ly b/input/regression/bar-number-visibility.ly index afe6f1e273..868d893d35 100644 --- a/input/regression/bar-number-visibility.ly +++ b/input/regression/bar-number-visibility.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "The @code{barNumberVisibility} property controls at what @@ -6,8 +6,8 @@ intervals bar numbers are printed. " } -music = \relative c' { - \repeat unfold 3 { c2 \bar "" \break \repeat unfold 5 c2 } +music = \relative { + \repeat unfold 3 { c'2 \bar "" \break \repeat unfold 5 c2 } } { diff --git a/input/regression/bar-number-volta-repeat.ly b/input/regression/bar-number-volta-repeat.ly index 6a3e4bf075..44b356da30 100644 --- a/input/regression/bar-number-volta-repeat.ly +++ b/input/regression/bar-number-volta-repeat.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.22" \header { texidoc = "Bar numbers can automatically reset at volta repeats. @@ -6,13 +6,13 @@ } musicWithBarNumberCheck = -#(define-music-function (parser location n) +#(define-music-function (n) (integer?) #{ - \relative c' { + \relative { \override Score.BarNumber.break-visibility = ##(#t #t #t) \repeat volta 28 { - c1 | + c'1 | c | c | } diff --git a/input/regression/bar-number.ly b/input/regression/bar-number.ly index ca1d1ff2c9..da1155b0a1 100644 --- a/input/regression/bar-number.ly +++ b/input/regression/bar-number.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { @@ -16,9 +16,9 @@ be increased. ragged-right = ##t } -\relative c'' { +\relative { \override Score.BarNumber.break-visibility = #all-visible - \partial 4 c4 + \partial 4 c''4 c1 c c \set Score.currentBarNumber = #99999 \override Score.BarNumber.padding = #3 diff --git a/input/regression/beam-beamlet-break.ly b/input/regression/beam-beamlet-break.ly index 6f13e58a9e..e4792a69aa 100644 --- a/input/regression/beam-beamlet-break.ly +++ b/input/regression/beam-beamlet-break.ly @@ -3,14 +3,14 @@ beamlets on the same height." } -\version "2.17.6" +\version "2.19.21" \paper { raggedright = ##t } -\relative c' { +\relative { \time 1/4 \override Beam.breakable = ##t - r16 r16. c32[ c16 \break c8. ] r16 + r16 r16. c'32[ c16 \break c8. ] r16 } diff --git a/input/regression/beam-beamlet-grace.ly b/input/regression/beam-beamlet-grace.ly index 75de18e031..49452cfd66 100644 --- a/input/regression/beam-beamlet-grace.ly +++ b/input/regression/beam-beamlet-grace.ly @@ -3,12 +3,12 @@ texidoc = "Beamlets in grace notes remain readable." } -\version "2.17.28" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c' +\relative \context Staff { - f1 \grace { a'8 f16 } g1 + f'1 \grace { a'8 f16 } g1 } diff --git a/input/regression/beam-beat-grouping.ly b/input/regression/beam-beat-grouping.ly index 0b70b39495..8137ffd06a 100644 --- a/input/regression/beam-beat-grouping.ly +++ b/input/regression/beam-beat-grouping.ly @@ -7,13 +7,13 @@ signature. " \layout { ragged-right = ##t } -\version "2.16.0" +\version "2.19.40" -\relative c'' { +\relative { \time 5/16 - \set beatStructure = #'(2 3) - c8[^"(2+3)" c16 c8] - \set beatStructure = #'(3 2) + \set beatStructure = 2,3 + c''8[^"(2+3)" c16 c8] + \set beatStructure = 3,2 c8[^"(3+2)" c16 c8] } diff --git a/input/regression/beam-break.ly b/input/regression/beam-break.ly index 0edbf53cd7..8a07c0c510 100644 --- a/input/regression/beam-break.ly +++ b/input/regression/beam-break.ly @@ -4,10 +4,10 @@ " } -\version "2.17.6" +\version "2.19.21" \layout { ragged-right= ##t } -\relative c'' { +\relative { \override Score.Beam.breakable = ##t - \time 3/16 c16-[ d e \break f-] + \time 3/16 c''16-[ d e \break f-] } diff --git a/input/regression/beam-broken-classic.ly b/input/regression/beam-broken-classic.ly index 22262a8561..38b30d4a86 100644 --- a/input/regression/beam-broken-classic.ly +++ b/input/regression/beam-broken-classic.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc="Some classic examples of broken beams, all taken from @@ -10,9 +10,9 @@ Scriabin Op. 11, No. 1. ragged-right = ##t } -music = \relative c'' { +music = \relative { \override Beam.breakable = ##t - r2. f8[ c \break + r2. f''8[ c \break e c f,] r8 r4 a'8[ e \break g d g,] r8 r4 f'8[ a, \break e' g, bes] r8 r4 8 [ d, \break diff --git a/input/regression/beam-collision-basic.ly b/input/regression/beam-collision-basic.ly index 507b5a5560..f065ab6ae4 100644 --- a/input/regression/beam-collision-basic.ly +++ b/input/regression/beam-collision-basic.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { texidoc = "Manual beams do not collide with notes." } @@ -8,17 +8,17 @@ indent = #0.0 } -\relative c' \new Staff { +\relative \new Staff { << \new Voice { \voiceOne - \repeat unfold 8 { c8[ c] } + \repeat unfold 8 { c'8[ c] } } - \new Voice \relative c'' { + \new Voice \relative { \voiceThree \autoBeamOff - f r e r + f'' r e r d r c r b r a r g r f r @@ -32,10 +32,10 @@ \voiceOne \repeat unfold 8 { c8[ c] } } - \new Voice \relative c'' { + \new Voice \relative { \voiceThree \autoBeamOff - f f e e + f'' f e e d d c c b b a a g g f f @@ -45,16 +45,16 @@ << \new Voice { - \repeat unfold 8 \relative c' { + \repeat unfold 8 \relative { \voiceOne - c8[ + c'8[ \voiceTwo c''] } } - \new Voice \relative c' { + \new Voice \relative { \voiceFour - s8 f + s8 f' s8 g s8 a s8 b @@ -67,7 +67,7 @@ \break << \new Voice { - \repeat unfold 8 \relative c' { + \repeat unfold 8 \relative { \voiceOne %% We must use a wider interval, otherwise the beam will be @@ -77,10 +77,10 @@ c''] } } - \new Voice \relative c' { + \new Voice \relative { \voiceFour \autoBeamOff - \stemUp f' \stemDown f, + \stemUp f'' \stemDown f, \stemUp e' \stemDown g, \stemUp d' \stemDown a \stemUp c \stemDown b diff --git a/input/regression/beam-collision-beamcount.ly b/input/regression/beam-collision-beamcount.ly index 8f499e3683..3a663558da 100644 --- a/input/regression/beam-collision-beamcount.ly +++ b/input/regression/beam-collision-beamcount.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { texidoc = "Manual beams do not collide with notes." } @@ -8,17 +8,17 @@ indent = #0.0 } -\relative c' \new Staff { +\relative \new Staff { << \new Voice { \voiceOne - \repeat unfold 4 { c8[ c] } + \repeat unfold 4 { c'8[ c] } } - \new Voice \relative c'' { + \new Voice \relative { \voiceThree \autoBeamOff - b r a r + b' r a r g r f r } >> @@ -30,10 +30,10 @@ \voiceOne \repeat unfold 4 { c16[ c] } } - \new Voice \relative c'' { + \new Voice \relative { \voiceThree \autoBeamOff - b r a r + b' r a r g r f r } >> diff --git a/input/regression/beam-collision-classic.ly b/input/regression/beam-collision-classic.ly index 95dd35c78b..620b658ebb 100644 --- a/input/regression/beam-collision-classic.ly +++ b/input/regression/beam-collision-classic.ly @@ -7,14 +7,14 @@ % debug-beam-scoring = ##t } -\version "2.17.6" +\version "2.19.21" \new Staff { % Stockhausen (without hemiolas) - \relative c''' { + \relative { \stemUp - a8[ \clef bass es,,,, + a''8[ \clef bass es,,,, r8 \clef G gis'''] @@ -22,18 +22,18 @@ r8 r4 | % Ligeti 1st etude. - \relative c'' + \relative << - { g8[ a b c d] } \\ + { g'8[ a b c d] } \\ { s4. 4. } >> r4. % Ligeti 1st etude. - \relative c'' + \relative << { - s4. 4. + s4. 4. } \\ { % \override Beam.inspect-quants = #'(-4 . -3) @@ -43,16 +43,16 @@ r4. % Ligeti 1st etude. - \relative c' + \relative << - { 2. } \\ + { 2. } \\ { a'8[ b c] } >> % Schubert morgenlied. \clef bass - \relative c { - a16[ d fis d a d] + \relative { + a,16[ d fis d a d] } } diff --git a/input/regression/beam-collision-cross-staff.ly b/input/regression/beam-collision-cross-staff.ly index 120b488c8d..7c8b659fbe 100644 --- a/input/regression/beam-collision-cross-staff.ly +++ b/input/regression/beam-collision-cross-staff.ly @@ -2,7 +2,7 @@ texidoc = "cross staff beams work with collisions." } -\version "2.16.0" +\version "2.19.21" << \new Staff = "PianoRH" s4. @@ -12,13 +12,13 @@ >> << - \new Staff = up \relative c' { - c8 c c c + \new Staff = up \relative { + c'8 c c c c c c c b' b b b } - \new Staff = down \relative c' { - s8 c c \change Staff = up c + \new Staff = down \relative { + s8 c' c \change Staff = up c \change Staff = down c [ c s16 \change Staff = up a'16 s16 a16 ] \stemUp \change Staff = down b8 b b b \change Staff = up diff --git a/input/regression/beam-collision-cross-staff2.ly b/input/regression/beam-collision-cross-staff2.ly index dd09c9651d..0c3ba11cde 100644 --- a/input/regression/beam-collision-cross-staff2.ly +++ b/input/regression/beam-collision-cross-staff2.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Cross staff beams do collision avoidance. @@ -7,7 +7,7 @@ \new PianoStaff << \new Staff = up \relative c' { s2 } - \new Staff \relative c' { + \new Staff \relative { \clef bass \time 2/4 g,32 [ d' \change Staff = up d' gis a c d g ] r4 | diff --git a/input/regression/beam-collision-flag.ly b/input/regression/beam-collision-flag.ly index cd52152d10..6613cf1ead 100644 --- a/input/regression/beam-collision-flag.ly +++ b/input/regression/beam-collision-flag.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Beams do not collide with flags. " } -\relative c' << - { \voiceOne c'8 r } \\ +\relative << + { \voiceOne c''8 r } \\ { \voiceThree c,8.[ c'16] } >> diff --git a/input/regression/beam-collision-grace.ly b/input/regression/beam-collision-grace.ly index cdc747be20..00e9c27201 100644 --- a/input/regression/beam-collision-grace.ly +++ b/input/regression/beam-collision-grace.ly @@ -1,14 +1,14 @@ -\version "2.17.28" +\version "2.19.21" \header { texidoc = " The beaming algorithm handles collisions between beams and grace notes too. " } -\relative c' { - e'8[ f e \grace { f,16 a } e'8] +\relative { + e''8[ f e \grace { f,16 a } e'8] } \relative c'{ diff --git a/input/regression/beam-collision-off.ly b/input/regression/beam-collision-off.ly index aec8fa6d00..16ca04f875 100644 --- a/input/regression/beam-collision-off.ly +++ b/input/regression/beam-collision-off.ly @@ -1,11 +1,11 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Beams can be allowed to collide with grobs by overriding the collision-interfaces property." } -\relative c' { - c8 [ des' ] +\relative { + c'8 [ des' ] \once \override Beam.collision-interfaces = #'(beam-interface clef-interface ;inline-accidental-interface diff --git a/input/regression/beam-collision-opposite-stem.ly b/input/regression/beam-collision-opposite-stem.ly index 58ca10839d..d9068f5790 100644 --- a/input/regression/beam-collision-opposite-stem.ly +++ b/input/regression/beam-collision-opposite-stem.ly @@ -3,27 +3,27 @@ correctly." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } { - \relative c'' { << { s16 e16 [ s cis ] } \\ { b'16 [ s b ] } >> } - \relative c'' { << { s16 e16 [ s cis, ] } \\ { b''16 [ s b ] } >> } - \relative c'' { << { s16 d16 [ s cis ] } \\ { b'16 [ s b ] } >> } - \relative c'' { << { s16 c16 [ s cis ] } \\ { b'16 [ s b ] } >> } - \relative c'' { << { s16 b16 [ s cis ] } \\ { b'16 [ s b ] } >> } - \relative c'' { << { s16 a16 [ s cis ] } \\ { b'16 [ s b ] } >> } - \relative c'' { << { s16 g16 [ s cis ] } \\ { b'16 [ s b ] } >> } - \relative c'' { << { s16 c,16 [ s cis' ] } \\ { b'16 [ s b ] } >> } - \relative c'' { << { s16 c,16 [ s cis'' ] } \\ { b16 [ s b ] } >> } - \relative c'' { << { s16 f,16 [ s cis ] } \\ { b'16 [ s b ] } >> } - \relative c'' { << { s16 e,16 [ s cis ] } \\ { b'16 [ s b ] } >> } - \relative c'' { << { s16 d,16 [ s cis ] } \\ { b'16 [ s b ] } >> } - \relative c'' { << { s16 e16 [ s cis ] } \\ { b'16 [ s d ] } >> } - \relative c'' { << { s16 e16 [ s cis ] } \\ { b'16 [ s f' ] } >> } - \relative c'' { << { s16 e16 [ s cis ] } \\ { b'16 [ s a ] } >> } - \relative c'' { << { s16 e16 [ s cis ] } \\ { b'16 [ s gis ] } >> } + \relative { << { s16 e''16 [ s cis ] } \\ { b'16 [ s b ] } >> } + \relative { << { s16 e''16 [ s cis, ] } \\ { b''16 [ s b ] } >> } + \relative { << { s16 d''16 [ s cis ] } \\ { b'16 [ s b ] } >> } + \relative { << { s16 c''16 [ s cis ] } \\ { b'16 [ s b ] } >> } + \relative { << { s16 b'16 [ s cis ] } \\ { b'16 [ s b ] } >> } + \relative { << { s16 a'16 [ s cis ] } \\ { b'16 [ s b ] } >> } + \relative { << { s16 g'16 [ s cis ] } \\ { b'16 [ s b ] } >> } + \relative { << { s16 c'16 [ s cis' ] } \\ { b'16 [ s b ] } >> } + \relative { << { s16 c'16 [ s cis'' ] } \\ { b16 [ s b ] } >> } + \relative { << { s16 f'16 [ s cis ] } \\ { b'16 [ s b ] } >> } + \relative { << { s16 e'16 [ s cis ] } \\ { b'16 [ s b ] } >> } + \relative { << { s16 d'16 [ s cis ] } \\ { b'16 [ s b ] } >> } + \relative { << { s16 e''16 [ s cis ] } \\ { b'16 [ s d ] } >> } + \relative { << { s16 e''16 [ s cis ] } \\ { b'16 [ s f' ] } >> } + \relative { << { s16 e''16 [ s cis ] } \\ { b'16 [ s a ] } >> } + \relative { << { s16 e''16 [ s cis ] } \\ { b'16 [ s gis ] } >> } } diff --git a/input/regression/beam-collision-prefatory-matter.ly b/input/regression/beam-collision-prefatory-matter.ly index b601528b95..3dc78a7b4f 100644 --- a/input/regression/beam-collision-prefatory-matter.ly +++ b/input/regression/beam-collision-prefatory-matter.ly @@ -8,11 +8,11 @@ % debug-beam-scoring = ##t } -\version "2.17.15" +\version "2.19.21" -\relative c' { +\relative { \time 2/4 - c8[ \clef "bass" e,, ] + c'8[ \clef "bass" e,, ] r8 e8[ | \time 1/4 diff --git a/input/regression/beam-collision-scaled-staff.ly b/input/regression/beam-collision-scaled-staff.ly index 89514aa5ba..ebb32806ba 100644 --- a/input/regression/beam-collision-scaled-staff.ly +++ b/input/regression/beam-collision-scaled-staff.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Beam collisions are resistant to scaled down staves." } @@ -8,7 +8,7 @@ \override StaffSymbol.staff-space = #(magstep -3) \override StaffSymbol.thickness = #(magstep -3) } << - \relative c'' { e16[ f] } + \relative { e''16[ f] } \\ - \relative c''' { \autoBeamOff g b } + \relative { \autoBeamOff g'' b } >> diff --git a/input/regression/beam-collision-voice-only.ly b/input/regression/beam-collision-voice-only.ly index a6bf7d8780..b17cdbbaed 100644 --- a/input/regression/beam-collision-voice-only.ly +++ b/input/regression/beam-collision-voice-only.ly @@ -1,12 +1,12 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Beam collision can be tweaked to only apply to the grobs within the beam's original voice." } -\relative c' { +\relative { \time 5/4 - << { c8[ s c ] } \\ { s8 c' s8 } >> + << { c'8[ s c ] } \\ { s8 c' s8 } >> c,[ des' ] \override Staff.Beam.collision-voice-only = ##t << { c,8[ s c ] } \\ { s8 c' s8 } >> diff --git a/input/regression/beam-concave-chord.ly b/input/regression/beam-concave-chord.ly index 59643345f2..2c35727a7d 100644 --- a/input/regression/beam-concave-chord.ly +++ b/input/regression/beam-concave-chord.ly @@ -1,23 +1,23 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Concave beaming works for chords as well as monophonic music. " } -morgenliedBeam = \relative c'' \new Voice { +morgenliedBeam = \relative \new Voice { \time 3/8 % morgenlied - c16 b c e g | + c''16 b c e g | \stemUp c16 b c e g | } -rachmaninovBeams = \relative c' \new Voice { +rachmaninovBeams = \relative \new Voice { \voiceOne \time 4/4 \key c \minor - 8[ ] ~ + 8[ ] ~ 8[ ] } diff --git a/input/regression/beam-concave-damped.ly b/input/regression/beam-concave-damped.ly index 3f58949dd5..c49eb478a0 100644 --- a/input/regression/beam-concave-damped.ly +++ b/input/regression/beam-concave-damped.ly @@ -2,14 +2,14 @@ texidoc = "Beams that are not strictly concave are damped according to their concaveness. " } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c'' { +\relative { \time 2/4 - g'=''8[ d a' b] + g''=''8[ d a' b] \time 3/4 f=''8[ e d c g b] b,16[ f' g a] diff --git a/input/regression/beam-concave.ly b/input/regression/beam-concave.ly index d165f4e5f4..c45dec6c36 100644 --- a/input/regression/beam-concave.ly +++ b/input/regression/beam-concave.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header{ texidoc = "Fully concave beams should be horizontal. Informally spoken, @@ -15,9 +15,9 @@ resetMeasure = \set Score.measurePosition = #(ly:make-moment 0/1) %% examples from Ross. -rossFourBeams =\relative c'' { +rossFourBeams =\relative { \time 2/4 - c8[ e b c] + c''8[ e b c] b[ c d b] c[ f b, c] @@ -31,9 +31,9 @@ rossFourBeams =\relative c'' { f[g g e] a[ d, b' g] } -rossThreeBeams = \relative c'' { +rossThreeBeams = \relative { \time 6/8 - e[ a, c] f[ d g] + e''[ a, c] f[ d g] f,[ b g] a[ b f] d'[ c b a b e] c[ b a c b a] diff --git a/input/regression/beam-cross-staff-rest.ly b/input/regression/beam-cross-staff-rest.ly index c957a14eca..93f294a40b 100644 --- a/input/regression/beam-cross-staff-rest.ly +++ b/input/regression/beam-cross-staff-rest.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Placement of beamed cross staff rests should be @@ -11,8 +11,8 @@ Down = \change Staff = "down" \new PianoStaff << \new Staff = "up" - \relative c'' { - \time 6/8 a2. + \relative { + \time 6/8 a'2. c'8[ \Down c,16 \Up fis \Down r fis] \Up } \new Staff = "down" { s2. s4. } diff --git a/input/regression/beam-cross-staff-slope.ly b/input/regression/beam-cross-staff-slope.ly index 0a17141e18..24844a682e 100644 --- a/input/regression/beam-cross-staff-slope.ly +++ b/input/regression/beam-cross-staff-slope.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Cross staff (kneed) beams do not cause extreme slopes." } @@ -7,10 +7,10 @@ \context PianoStaff << \new Staff = "up" - \relative c'' << + \relative << { \stemDown - f16( d b \change Staff = down \stemUp + f''16( d b \change Staff = down \stemUp \clef treble g ~ < g e>8) e[ \change Staff = up diff --git a/input/regression/beam-default-lengths.ly b/input/regression/beam-default-lengths.ly index 3008617671..6abba5f2ea 100644 --- a/input/regression/beam-default-lengths.ly +++ b/input/regression/beam-default-lengths.ly @@ -1,11 +1,11 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Beamed stems have standard lengths if possible. Quantization is switched off in this example." } -\relative c' { +\relative { \override Beam.skip-quanting = ##t - f4 f8[ f] f16[ f] f32[ f] f64[ f] f128[ f] + f'4 f8[ f] f16[ f] f32[ f] f64[ f] f128[ f] } diff --git a/input/regression/beam-extreme.ly b/input/regression/beam-extreme.ly index 21c755c255..bb7a8f81b5 100644 --- a/input/regression/beam-extreme.ly +++ b/input/regression/beam-extreme.ly @@ -1,5 +1,5 @@ -\version "2.17.11" +\version "2.19.21" \header{ texidoc=" Beams should behave reasonably well, even under extreme circumstances. @@ -14,9 +14,9 @@ under normal circumstances, these beams would get knees. Here ragged-right = ##t } -extreme = \relative c'' { +extreme = \relative { \stemNeutral - g8[ c c,] + g'8[ c c,] c16[ c'' a f] \stemUp c,,32[ c'' a f] diff --git a/input/regression/beam-feather-knee-stem-length.ly b/input/regression/beam-feather-knee-stem-length.ly index 3b350cab91..e0b1c4caf0 100644 --- a/input/regression/beam-feather-knee-stem-length.ly +++ b/input/regression/beam-feather-knee-stem-length.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.21" \header { texidoc="In feathered beams, stems in knees reach up to the feathered part correctly. @@ -8,11 +8,11 @@ \layout { ragged-right = ##t} -\relative c' { +\relative { \override Beam.grow-direction = #-1 % \hide Beam \override Stem.direction = #UP - c32[ + c'32[ \override Stem.direction = #DOWN c''32 c32 diff --git a/input/regression/beam-feather.ly b/input/regression/beam-feather.ly index 0006976c6e..8dade639bb 100644 --- a/input/regression/beam-feather.ly +++ b/input/regression/beam-feather.ly @@ -6,7 +6,7 @@ } -\version "2.17.11" +\version "2.19.21" \paper { ragged-right = ##t @@ -18,9 +18,9 @@ % a linear decrease instead? % -\featherDurations #(ly:make-moment 3/4) \relative c'' { +\featherDurations #(ly:make-moment 3/4) \relative { \override Beam.grow-direction = #LEFT - c16[ + c''16[ c c c c c c c ] } diff --git a/input/regression/beam-forced-direction.ly b/input/regression/beam-forced-direction.ly index 682cf8f4d1..04d0caa47e 100644 --- a/input/regression/beam-forced-direction.ly +++ b/input/regression/beam-forced-direction.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "The direction of manual beams can be forced using @@ -6,7 +6,7 @@ " } -\relative c' { +\relative { \time 2/4 - c8_[] c'^[ d e] + c'8_[] c'^[ d e] } diff --git a/input/regression/beam-french.ly b/input/regression/beam-french.ly index d0f44becdc..618732c5ee 100644 --- a/input/regression/beam-french.ly +++ b/input/regression/beam-french.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "In French style beaming, the stems do not go between beams." @@ -6,10 +6,10 @@ \layout { ragged-right= ##t } -\relative c' +\relative { \override Stem.french-beaming = ##t - c16[ c c c] + c'16[ c c c] c8[ c16 e16 f16 g16 g8] } diff --git a/input/regression/beam-funky-beamlet.ly b/input/regression/beam-funky-beamlet.ly index 31bfcb9e54..f399193e62 100644 --- a/input/regression/beam-funky-beamlet.ly +++ b/input/regression/beam-funky-beamlet.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc=" Funky kneed beams with beamlets also work. The beamlets @@ -10,9 +10,9 @@ should be pointing to the note head. \layout { ragged-right = ##t} -\relative c' { +\relative { \once \override Stem.direction = #UP - c16 + c'16 \once \override Stem.direction = #DOWN c''8 c,,16 diff --git a/input/regression/beam-funky.ly b/input/regression/beam-funky.ly index cf47dc9c50..6c3e9c46a8 100644 --- a/input/regression/beam-funky.ly +++ b/input/regression/beam-funky.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "In complex configurations of knee beaming, according to @@ -11,12 +11,12 @@ beam. This is in disagreement with the current algorithm." \layout { ragged-right = ##t} -\relative c' +\relative { \override Beam.auto-knee-gap = #7 \set subdivideBeams = ##t \time 8/8 - c,16[ g'''16 + c16[ g'''16 c,,,16 g'''16 c,,,16 g'''16 c,,,16 g'''16 ] @@ -25,7 +25,7 @@ beam. This is in disagreement with the current algorithm." b''' b b b] \transpose c' a, { - \relative b'' { g,16[ g'''16 + \relative { g'16[ g'''16 g,,,16 g'''16 g,,,16 g'''16 g,,,16 g'''16 diff --git a/input/regression/beam-length.ly b/input/regression/beam-length.ly index 53685449ce..c1603fecd0 100644 --- a/input/regression/beam-length.ly +++ b/input/regression/beam-length.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc=" @@ -9,7 +9,7 @@ Beams should look the same. \layout { ragged-right= ##t } -\context Voice \relative c { +\context Voice \relative { d''8[ d d] d[ g d] c c } diff --git a/input/regression/beam-manual-beaming.ly b/input/regression/beam-manual-beaming.ly index 8ec0c42117..dfb0175d93 100644 --- a/input/regression/beam-manual-beaming.ly +++ b/input/regression/beam-manual-beaming.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { @@ -10,8 +10,8 @@ ragged-right = ##t } -\relative c'' { - c32[ c +\relative { + c''32[ c %% WARNING: #'beaming is written, so this %% property can not be shared between objects. Always use diff --git a/input/regression/beam-multiple-cross-staff.ly b/input/regression/beam-multiple-cross-staff.ly index 7827e3d723..ba65677e90 100644 --- a/input/regression/beam-multiple-cross-staff.ly +++ b/input/regression/beam-multiple-cross-staff.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Kneed beams (often happens with cross-staff beams) @@ -14,17 +14,17 @@ to the last beam. \context PianoStaff \relative c' << \new Staff = SA { - \stemDown - c8[ c16 \change Staff = SB \stemUp c16 ] - \stemNeutral + \voiceTwo + c8[ c16 \change Staff = SB \voiceOne c16 ] + \oneVoice f[ g \change Staff = SA a c] } - \new Staff = SB \relative c' { + \new Staff = SB \relative { \clef bass - b8[ b16 \stemUp b,,16 ] + b8[ b16 \voiceOne b,,16 ] g'4\rest - b,8[ b16 \stemDown b''16 b ] + b,8[ b16 \voiceTwo b''16 b ] } >> diff --git a/input/regression/beam-multiplicity-over-rests.ly b/input/regression/beam-multiplicity-over-rests.ly index b8a2b5d997..f3b6b96323 100644 --- a/input/regression/beam-multiplicity-over-rests.ly +++ b/input/regression/beam-multiplicity-over-rests.ly @@ -1,14 +1,14 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "When a beam goes over a rest, beamlets should be as necessary to show the beat structure." } -\relative c' { - c8[ r16 c32 c32] +\relative { + c'8[ r16 c32 c32] c32[ r16 c32 c8] - c32[ r16 c64 c64 ~ c16.. c64] + c32[ r16 c64 c64 ~ 16.. c64] c32[ c32 r16 c8] c16[ r32 c32 r16 c16] c16[ r16 c32 r32 c16] diff --git a/input/regression/beam-over-barline.ly b/input/regression/beam-over-barline.ly index 12c092f830..f2fec5c7c2 100644 --- a/input/regression/beam-over-barline.ly +++ b/input/regression/beam-over-barline.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Explicit beams may cross barlines. " } \layout { ragged-right= ##t } -\relative c'' { c2. c8[ c8 c8 c8] } +\relative { c''2. c8[ c8 c8 c8] } diff --git a/input/regression/beam-position.ly b/input/regression/beam-position.ly index 9e8b045a12..6c6b53a73d 100644 --- a/input/regression/beam-position.ly +++ b/input/regression/beam-position.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header{ texidoc=" Beams on ledgered notes should always reach the middle staff @@ -14,7 +14,7 @@ note beams. Override with @code{no-stem-extend}. " } -\context Voice \relative c { +\context Voice \relative { f8[ f] f64[ f] \grace { f8[ e8] diff --git a/input/regression/beam-quanting-horizontal.ly b/input/regression/beam-quanting-horizontal.ly index 3550064738..e1645529e6 100644 --- a/input/regression/beam-quanting-horizontal.ly +++ b/input/regression/beam-quanting-horizontal.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header{ @@ -9,8 +9,8 @@ lengths are between 2 and 1.5." } -\relative c' { - c8[ c] a''[ a] +\relative { + c'8[ c] a''[ a] a,[ a] c[ c] d,8[ d] g'[ g] g,[ g] d'[ d] diff --git a/input/regression/beam-quarter.ly b/input/regression/beam-quarter.ly index 5eb2b83632..7c9431de28 100644 --- a/input/regression/beam-quarter.ly +++ b/input/regression/beam-quarter.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "stem does not fit in beam")) @@ -8,6 +8,6 @@ texidoc= "Quarter notes may be beamed: the beam is halted momentarily." } -\relative c'' { - c8[ c4 c8] % should warn here! +\relative { + c''8[ c4 c8] % should warn here! } diff --git a/input/regression/beam-rest-extreme.ly b/input/regression/beam-rest-extreme.ly index 9c7d5df3b9..01432c3c8d 100644 --- a/input/regression/beam-rest-extreme.ly +++ b/input/regression/beam-rest-extreme.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Beamed rests are given a pure height approximation @@ -6,9 +6,9 @@ that gets their spacing correct in the majority of circumstances. " } -\relative c'' { - 16[ r ] +\relative { + 16[ r ] 16[ r ] 16[ r ] - 16[ r ] + 16[ r ] } diff --git a/input/regression/beam-rest.ly b/input/regression/beam-rest.ly index 5598345741..f0552e3b06 100644 --- a/input/regression/beam-rest.ly +++ b/input/regression/beam-rest.ly @@ -3,11 +3,11 @@ texidoc = "The number of beams does not change on a rest." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c, { +\relative { \clef bass - e8[ r16 f d'8 e16 e16] c8[ c16 r16 bes8 r16 c16] | + e,8[ r16 f d'8 e16 e16] c8[ c16 r16 bes8 r16 c16] | } diff --git a/input/regression/beam-single-stem.ly b/input/regression/beam-single-stem.ly index 6dc7e80019..d3a3212598 100644 --- a/input/regression/beam-single-stem.ly +++ b/input/regression/beam-single-stem.ly @@ -4,10 +4,10 @@ clip-edges is switched off automatically." } -\version "2.16.0" +\version "2.19.21" -\relative c' { - d16[] +\relative { + d'16[] \set stemRightBeamCount = #0 d32[] } diff --git a/input/regression/beam-subdivide-quarter-notes.ly b/input/regression/beam-subdivide-quarter-notes.ly new file mode 100644 index 0000000000..29599835f9 --- /dev/null +++ b/input/regression/beam-subdivide-quarter-notes.ly @@ -0,0 +1,17 @@ +\version "2.19.32" + +\header { + + doctitle = "Beam subdivide over quarter notes" + + texidoc = "Beam count at subdivisions should match the location +of the current subdivision. However, if the groups are equal or +longer than quarter notes, one beam should always be left." + +} + +\relative c' { + \set baseMoment = #(ly:make-moment 1/4) + \set subdivideBeams = ##t + c16 [ c c c c c c c c c c c c c c c ] +} diff --git a/input/regression/beam-subdivide-shortened-beam.ly b/input/regression/beam-subdivide-shortened-beam.ly new file mode 100644 index 0000000000..fb15a75ebe --- /dev/null +++ b/input/regression/beam-subdivide-shortened-beam.ly @@ -0,0 +1,28 @@ +\version "2.19.34" + +\header { + + doctitle = "Beam subdivide with incomplete remainder" + + texidoc = "Beam count at subdivisions should match the count corresponding +to the location of the current subdivision. However, if the remainder of the +beam is shorter than that the beam count should be adopted accordingly." + +} + +\paper { + indent = 0 +} + +\relative c'' { + \omit Staff.TimeSignature + \time 1/4 + \set subdivideBeams = ##t + \set baseMoment = #(ly:make-moment 1/32) + c64 ^\markup "Full beam (1/32 division)" [ c c c c c c c c c c c c c c c ] + c64 ^\markup "Shortened by 1/32" [ c c c c c c c c c c c c c ] r32 + c64 ^\markup "Shortened by 3/32" [ c c c c c c c c c ] r16. + \set baseMoment = #(ly:make-moment 1/16) + c32 ^\markup "Full beam (1/16 division)" [ c c c c c c c ] + c32 ^\markup "Shortened by 1/16" [ c c c c c] r16 +} diff --git a/input/regression/beam-subdivide-trailing-stem.ly b/input/regression/beam-subdivide-trailing-stem.ly new file mode 100644 index 0000000000..c09dad4eb9 --- /dev/null +++ b/input/regression/beam-subdivide-trailing-stem.ly @@ -0,0 +1,22 @@ +\version "2.19.34" + +\header { + + doctitle = "Beam subdivide over quarter notes" + + texidoc = "If in a subdivided beam one single stem follows a subdivision +the beam count should reflect the beam count of the subdivision as usual. +That is, the beam count should not be increased according to the remaining +length of the beam. The appended single stem has beamlets to the left." + +} + +\relative c' { + \time 1/4 + \set subdivideBeams = ##t + \set baseMoment = #(ly:make-moment 1/16) + c32 [ c c c c32 ] r16. + c32 [ c c c c64 ] r32. r16 + c32 [ c c32 ] r32 r8 + c32 [ c c64 ] r32. r8 +} \ No newline at end of file diff --git a/input/regression/beam-subdivision.ly b/input/regression/beam-subdivision.ly new file mode 100644 index 0000000000..c88eab152c --- /dev/null +++ b/input/regression/beam-subdivision.ly @@ -0,0 +1,24 @@ +\header { + + texidoc = "Beam count at subdivisions should match the location +of the current subdivision." + } + +\version "2.19.19" + +\layout { + ragged-right = ##t +} + +{ + \set subdivideBeams = ##t + \set baseMoment = #(ly:make-moment 1 4) + c''32[^\markup{"baseMoment 1/4"} c'' c'' c'' c'' c'' c'' c''] + \set baseMoment = #(ly:make-moment 1 8) + c''32[^\markup{"baseMoment 1/8"} c'' c'' c'' c'' c'' c'' c''] + \set baseMoment = #(ly:make-moment 1 16) + c''32^\markup{"baseMoment 1/16"}[ c'' c'' c'' c'' c'' c'' c''] + \set baseMoment = #(ly:make-moment 1 32) + c''64^\markup{"baseMoment 1/32"}[ \repeat unfold 14 {c''64} c''64] +} + diff --git a/input/regression/beam-unconnected-beamlets.ly b/input/regression/beam-unconnected-beamlets.ly index 4d8398ac6d..5b942bce23 100644 --- a/input/regression/beam-unconnected-beamlets.ly +++ b/input/regression/beam-unconnected-beamlets.ly @@ -6,9 +6,9 @@ \layout { ragged-right = ##t } -\version "2.17.6" +\version "2.19.21" -\relative c'' { +\relative { \override Stem.max-beam-connect = #1 - c16[ c16] + c''16[ c16] } diff --git a/input/regression/beaming-ternary-metrum.ly b/input/regression/beaming-ternary-metrum.ly index 65658ac9a1..c22eaec5f0 100644 --- a/input/regression/beaming-ternary-metrum.ly +++ b/input/regression/beaming-ternary-metrum.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -11,9 +11,9 @@ \layout { ragged-right = ##t} -\relative c'' { +\relative { \time 6/8 - c8. c16 c16 c16 + c''8. c16 c16 c16 c8. c16 c16 c16 } diff --git a/input/regression/beaming.ly b/input/regression/beaming.ly index bb8bba1872..ebc65e8d67 100644 --- a/input/regression/beaming.ly +++ b/input/regression/beaming.ly @@ -1,5 +1,5 @@ -\version "2.17.11" +\version "2.19.21" \header{ texidoc=" @@ -8,9 +8,9 @@ case, line breaks are forbidden. " } -\context Staff \relative c'' { +\context Staff \relative { - c8[ \tuplet 3/2 { c16 d e] } + c''8[ \tuplet 3/2 { c16 d e] } s4*3 c8.[ c16] diff --git a/input/regression/beamlet-point-toward-beat.ly b/input/regression/beamlet-point-toward-beat.ly index 014e556b89..2938357860 100644 --- a/input/regression/beamlet-point-toward-beat.ly +++ b/input/regression/beamlet-point-toward-beat.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " @@ -9,9 +9,9 @@ the second beam strictly follows the beat. } -\relative c'' { +\relative { \time 6/8 - a8. a16 a a + a'8. a16 a a \set strictBeatBeaming = ##t a8. a16 a a } diff --git a/input/regression/beamlet-test.ly b/input/regression/beamlet-test.ly index 5ec8e4b5a6..a7c3208be2 100644 --- a/input/regression/beamlet-test.ly +++ b/input/regression/beamlet-test.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = " @@ -7,9 +7,9 @@ broken beat units. This should work in tuplets as well as in ordinary time. " } -\relative c'' { +\relative { \tuplet 3/2 { - c8. c16 c8 + c''8. c16 c8 } \tuplet 3/2 { c8 c16 c8. diff --git a/input/regression/beams.ly b/input/regression/beams.ly index ebb3bbf501..59e5eac256 100644 --- a/input/regression/beams.ly +++ b/input/regression/beams.ly @@ -1,14 +1,14 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Beaming can be also given explicitly." } \layout { ragged-right= ##t } -\relative c' +\relative { - c16[ c8.] + c'16[ c8.] c8.[ c16] c8[ c16 c16 c8] c8[ c16 e16 g8] diff --git a/input/regression/bend-after.ly b/input/regression/bend-after.ly index a5c7a81758..29f62bfe95 100644 --- a/input/regression/bend-after.ly +++ b/input/regression/bend-after.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { @@ -12,9 +12,9 @@ ragged-right = ##T } -\relative c'' { +\relative { \override Score.SpacingSpanner.shortest-duration-space = #3.0 - c4-\bendAfter #+5 + c''4-\bendAfter #+5 c4-\bendAfter #+4 c4-\bendAfter #+3 c4-\bendAfter #+2 diff --git a/input/regression/bend-bound.ly b/input/regression/bend-bound.ly new file mode 100644 index 0000000000..bceb10564e --- /dev/null +++ b/input/regression/bend-bound.ly @@ -0,0 +1,23 @@ +\version "2.17.30" + +\header { + texidoc = "Bends should not be effected by the full width of a +@code{NonMusicalPaperColumn}. The bends should have identical X +spans in the two examples. +" +} + +music = \repeat unfold 16 { c''4\bendAfter #-4 } +sixteens = \repeat unfold 64 { c'16 } + +\new Score { + << \music \sixteens >> +} + +\new Score \with { + currentBarNumber = #200 + barNumberVisibility = #(every-nth-bar-number-visible 1) + \override BarNumber.break-visibility = #end-of-line-invisible +} { + << \music \sixteens >> +} diff --git a/input/regression/bend-dot.ly b/input/regression/bend-dot.ly index 26ae2aff3e..1408d6633d 100644 --- a/input/regression/bend-dot.ly +++ b/input/regression/bend-dot.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Bends avoid dots, but only if necessary." } @@ -9,7 +9,7 @@ \score { << - \new Staff \relative c' { + \new Staff \relative { \time 4/4 g''4.-\bendAfter #+1 s8 s2 diff --git a/input/regression/book-identifier-markup.ly b/input/regression/book-identifier-markup.ly index aef1182a32..0dee84bcd4 100644 --- a/input/regression/book-identifier-markup.ly +++ b/input/regression/book-identifier-markup.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "A @code{\\book} or @code{\\bookpart} identifier can contain @@ -6,7 +6,7 @@ top-level markup and page-markers." } mypart = \bookpart { - \relative c' { c1 } + \relative { c'1 } \label #'marker \markup { Page \page-ref #'marker "8" "?" } } diff --git a/input/regression/bookpart-variable.ly b/input/regression/bookpart-variable.ly index 204b98802e..d693aa52ff 100644 --- a/input/regression/bookpart-variable.ly +++ b/input/regression/bookpart-variable.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -9,8 +9,8 @@ No segfault should occur in this case. } mypart = \bookpart { - \relative c' { - c1 + \relative { + c'1 } } diff --git a/input/regression/bookparts.ly b/input/regression/bookparts.ly index 52660c9312..7ee4cf1683 100644 --- a/input/regression/bookparts.ly +++ b/input/regression/bookparts.ly @@ -10,10 +10,6 @@ Page labels are also collected into the top-level paper." #(set-default-paper-size "a6") -#(define-markup-command (roman-page-number layout props) () - (let ((page-number (chain-assoc-get 'page:page-number props))) - (interpret-markup layout props (format #f "~@r" page-number)))) - \book { \tocItem \markup "First part" \header { title = "Book with several parts" } @@ -25,8 +21,17 @@ Page labels are also collected into the top-level paper." left-margin = 20\mm right-margin = 20\mm line-width = 65\mm - evenHeaderMarkup = \markup \fill-line { \roman-page-number "SECOND PART" \null } - oddHeaderMarkup = \markup \fill-line { \null "SECOND PART" \roman-page-number } + page-number-type = #'roman-upper + evenHeaderMarkup = \markup \fill-line { + \fromproperty #'page:page-number-string + "SECOND PART" + \null + } + oddHeaderMarkup = \markup \fill-line { + \null + "SECOND PART" + \fromproperty #'page:page-number-string + } } \tocItem \markup "Second part" \markup \justify { Second part, with different margins and page header. } diff --git a/input/regression/breathing-sign-ancient.ly b/input/regression/breathing-sign-ancient.ly index 8e1a528753..e6ba1472e2 100644 --- a/input/regression/breathing-sign-ancient.ly +++ b/input/regression/breathing-sign-ancient.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header{ texidoc=" @@ -11,9 +11,9 @@ finalis, the latter three looking similar to bar glyphs. \include "gregorian.ly" \context VaticanaStaff { - \relative c' { + \relative { % here is no \breathe - c g c + c' g c % \virgula applies rcomma, but in a smaller font c \virgula g c @@ -37,9 +37,9 @@ finalis, the latter three looking similar to bar glyphs. } } -mus = \relative f' { +mus = \relative { \clef tenor - c g c + c' g c c \virgula g c c \caesura g c c \divisioMinima g c diff --git a/input/regression/breathing-sign-custom-staff.ly b/input/regression/breathing-sign-custom-staff.ly index ecf0f65244..5b0fb52f84 100644 --- a/input/regression/breathing-sign-custom-staff.ly +++ b/input/regression/breathing-sign-custom-staff.ly @@ -1,11 +1,11 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Breathing signs are positioned correctly on custom staves which use @code{line-positions}." } -\relative c' { +\relative { \override Staff.StaffSymbol.line-positions = #'(-7 -5 -3 -1) b2 \breathe b \override BreathingSign.direction = #DOWN diff --git a/input/regression/breathing-sign.ly b/input/regression/breathing-sign.ly index f9e3787859..239bf22a94 100644 --- a/input/regression/breathing-sign.ly +++ b/input/regression/breathing-sign.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header{ texidoc=" Breathing signs are available in different tastes: commas (default), @@ -9,12 +9,12 @@ ticks, vees and `railroad tracks' (caesura)." { %% Modern notation: \new Staff { - \relative c'' { + \relative { %% by default, \breathe uses the rcomma, just as if saying: %% \override BreathingSign.text = %% #(make-musicglyph-markup "scripts.rcomma") %% - c4 c \breathe c c | + c''4 c \breathe c c | %% rvarcomma and lvarcomma are variations of the default rcomma %% and lcomma diff --git a/input/regression/cadenza-grace-autobeam.ly b/input/regression/cadenza-grace-autobeam.ly index 8340d26cd9..4f06d4627d 100644 --- a/input/regression/cadenza-grace-autobeam.ly +++ b/input/regression/cadenza-grace-autobeam.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.21" \header { @@ -9,8 +9,8 @@ \layout { ragged-right = ##t } -\relative c' { - e8 e e e e e e e +\relative { + e'8 e e e e e e e \cadenzaOn <>^\markup \typewriter "\\cadenzaOn" e e e e e e e e \cadenzaOff diff --git a/input/regression/chord-changes-alternative.ly b/input/regression/chord-changes-alternative.ly new file mode 100644 index 0000000000..678559ef3b --- /dev/null +++ b/input/regression/chord-changes-alternative.ly @@ -0,0 +1,22 @@ +\version "2.19.21" + +\header { + texidoc = "Chord change detection in repeat alternatives +happens in relation to the chord active at the beginning of the +first alternative. +" +} + +\score { + << + \new ChordNames { + \set chordChanges = ##t + \chordmode { \repeat volta 3 { g1 | } + \alternative { {c |} {c4 g c c |} {g2 c |} } } } + \new Voice { + \relative { + \repeat volta 3 { g'4 f e d | } + \alternative { {c r r r |} {c g c r |} {b g c2 |} } } + \bar "|." } + >> +} diff --git a/input/regression/chord-changes.ly b/input/regression/chord-changes.ly index 8e308c8a0e..a662e4efc4 100644 --- a/input/regression/chord-changes.ly +++ b/input/regression/chord-changes.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" \header{ texidoc="Property chordChanges: display chord names only when @@ -19,10 +19,10 @@ settings = { } << - \context ChordNames << + \new ChordNames << \scheme \set chordChanges = ##t >> - \context Staff \transpose c c' \scheme + \new Staff \transpose c c' \scheme >> diff --git a/input/regression/chord-dots.ly b/input/regression/chord-dots.ly new file mode 100644 index 0000000000..957788d4bc --- /dev/null +++ b/input/regression/chord-dots.ly @@ -0,0 +1,17 @@ +\version "2.17.16" + +\header { + texidoc = +"The column of dots on a chord is limited to the height +of the chord plus @code{chord-dots-limit} staff-positions." +} + +\layout{ ragged-right = ##t } + +\new Staff \transpose c c' { + \override Staff.DotColumn.chord-dots-limit = #1 + << + { 4. r8 4. r8 } \\ + { f4.. r16 4.. r16} + >> +} diff --git a/input/regression/chord-name-major7.ly b/input/regression/chord-name-major7.ly index 285c41ce29..7a2109cd22 100644 --- a/input/regression/chord-name-major7.ly +++ b/input/regression/chord-name-major7.ly @@ -1,11 +1,16 @@ \version "2.16.0" \header { texidoc = "The layout of the major 7 can be tuned with -@code{majorSevenSymbol}." +@code{majorSevenSymbol}. It does not break if @code{majorSevenSymbol} is unset. +One should see: triangle - j7 - triangle - #7." } \chords { c:7+ \set majorSevenSymbol = \markup { "j7" } c:7+ + \unset majorSevenSymbol + c:7+ + \unset Score.majorSevenSymbol + c:7+ } diff --git a/input/regression/chord-name-override-text.ly b/input/regression/chord-name-override-text.ly index 2877cc85b0..36b4795dbd 100644 --- a/input/regression/chord-name-override-text.ly +++ b/input/regression/chord-name-override-text.ly @@ -10,4 +10,4 @@ a b c:7 \once \override ChordName.text = #"foo" d -} \ No newline at end of file +} diff --git a/input/regression/chord-names-in-grand-staff.ly b/input/regression/chord-names-in-grand-staff.ly index f81d4fe299..8a43cde114 100644 --- a/input/regression/chord-names-in-grand-staff.ly +++ b/input/regression/chord-names-in-grand-staff.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -15,14 +15,14 @@ example should be printed above the top staff. f1 } \new Staff { - \relative c'' { - a4 a a a + \relative { + a'4 a a a } } \new Staff { \clef "bass" - \relative c { - a4 a a a + \relative { + a,4 a a a } } >> diff --git a/input/regression/chord-repetition-accidentals.ly b/input/regression/chord-repetition-accidentals.ly new file mode 100644 index 0000000000..50b20db168 --- /dev/null +++ b/input/regression/chord-repetition-accidentals.ly @@ -0,0 +1,11 @@ +\version "2.18.0" + +\header { + texidoc = "Chord repeats should omit forced and reminder accidentals." +} + +\relative +{ + q q q | + q q q +} diff --git a/input/regression/chord-repetition-relative.ly b/input/regression/chord-repetition-relative.ly index 1732708394..766404c693 100644 --- a/input/regression/chord-repetition-relative.ly +++ b/input/regression/chord-repetition-relative.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " @@ -9,5 +9,5 @@ the same octaves as the original one. { 4^"absolute" q q q - \relative c' { 4^"relative" q q q } + \relative { 4^"relative" q q q } } diff --git a/input/regression/chord-repetition-script-stack.ly b/input/regression/chord-repetition-script-stack.ly index 5da80dd954..191daf8a91 100644 --- a/input/regression/chord-repetition-script-stack.ly +++ b/input/regression/chord-repetition-script-stack.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Post events such as fingerings and scripts added to a @@ -6,6 +6,6 @@ chord repetition follow the same basic stacking order as chords. " } -\relative c' { - 2-1-2-3 q_"q"-1-2-3 +\relative { + 2-1-2-3 q_"q"-1-2-3 } diff --git a/input/regression/chord-repetition-times.ly b/input/regression/chord-repetition-times.ly index ba8f1fdbe6..4a193625e0 100644 --- a/input/regression/chord-repetition-times.ly +++ b/input/regression/chord-repetition-times.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { @@ -9,7 +9,7 @@ correctly on them. " } -\relative c' { - 4 r 2 ~ | +\relative { + 4 r 2 ~ | \tuplet 3/2 { 4 q q } \tuplet 3/2 { q q q } | } diff --git a/input/regression/chord-repetition.ly b/input/regression/chord-repetition.ly index 52d001d273..a2a0ca82db 100644 --- a/input/regression/chord-repetition.ly +++ b/input/regression/chord-repetition.ly @@ -1,4 +1,4 @@ -\version "2.17.25" +\version "2.19.21" \header { texidoc = " @@ -8,6 +8,6 @@ fingerings, etc are not repeated. " } -\relative c' { - 8\p( q) q4-! q8.\(^"text" q16 q4-!\) +\relative { + 8\p( q) q4-! q8.\(^"text" q16 q4-!\) } diff --git a/input/regression/chord-scripts.ly b/input/regression/chord-scripts.ly index 74aeda9fd0..c0f980a925 100644 --- a/input/regression/chord-scripts.ly +++ b/input/regression/chord-scripts.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Scripts can also be attached to chord elements. They obey manual direction indicators." } -\relative c'' { - < c-. >4 +\relative { + < c''-. >4 < c-> >4 < c-. e-. g-. b-. >4 < c^^ >4 diff --git a/input/regression/chord-tremolo-other-commands.ly b/input/regression/chord-tremolo-other-commands.ly index f1f2521a54..61f41b4953 100644 --- a/input/regression/chord-tremolo-other-commands.ly +++ b/input/regression/chord-tremolo-other-commands.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " @@ -11,9 +11,9 @@ right = \relative c'' { s2 } -left = \relative c' { +left = \relative { % This tremolo contains just two notes (but three lilypond events/commands!) - \repeat tremolo 4 { f,16 \change Staff = "right" f'} + \repeat tremolo 4 { f16 \change Staff = "right" f'} } \score { diff --git a/input/regression/chord-tremolo-stem-direction.ly b/input/regression/chord-tremolo-stem-direction.ly index 666a2c24e1..fd43b8ea8b 100644 --- a/input/regression/chord-tremolo-stem-direction.ly +++ b/input/regression/chord-tremolo-stem-direction.ly @@ -5,12 +5,12 @@ } -\version "2.16.0" +\version "2.19.21" \paper{ ragged-right = ##t } -\relative c { +\relative { \stemDown \repeat tremolo 16 { d32 a'32 } } diff --git a/input/regression/chords-funky-ignatzek.ly b/input/regression/chords-funky-ignatzek.ly index b450dfcb7e..ac1d5f263a 100644 --- a/input/regression/chords-funky-ignatzek.ly +++ b/input/regression/chords-funky-ignatzek.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" \header { @@ -26,9 +26,9 @@ chs = << - \context ChordNames { + \new ChordNames { %% #(set-chord-name-style 'ignatzek) \chs } - \context Staff \transpose c c' { \chs } + \new Staff \transpose c c' { \chs } >> diff --git a/input/regression/chromatic-scales.ly b/input/regression/chromatic-scales.ly index ccfeb1e5be..7e6ddb4da2 100644 --- a/input/regression/chromatic-scales.ly +++ b/input/regression/chromatic-scales.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header{ texidoc="@code{staffLineLayoutFunction} is used to change the position of the notes. This sets @code{staffLineLayoutFunction} to @code{ly:pitch-semitones} to @@ -7,7 +7,7 @@ space and line equal to one semitone. " } -scales = \relative c' { +scales = \relative { a ais b c cis d dis e f fis g gis a } diff --git a/input/regression/clef-ottava.ly b/input/regression/clef-ottava.ly index 6ed391c542..776fb25b06 100644 --- a/input/regression/clef-ottava.ly +++ b/input/regression/clef-ottava.ly @@ -5,13 +5,13 @@ but they don't confuse one another." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t} -\relative c'' { +\relative { \clef "alto" - a b c a + a' b c a \ottava #1 a b c a \clef "bass" diff --git a/input/regression/clef-transposition-placement.ly b/input/regression/clef-transposition-placement.ly index 119e00a903..256264ae81 100644 --- a/input/regression/clef-transposition-placement.ly +++ b/input/regression/clef-transposition-placement.ly @@ -1,18 +1,50 @@ -\version "2.16.0" +\version "2.19.22" \header { texidoc="Transposition symbols should be correctly positioned -close to the parent clef." +close to the parent clef. Horizontal alignment is fine-tuned +for standard C, G and F clefs: for example, downwards transposition +of a G clef should be centered exactly under the middle of clef hook. +For clefs that don't have fine-tuned alignment the transposition +number should be centered." } + +% use huge staff-size to see the tiny differencies better. +#(set-global-staff-size 35) + +clefVariations = +#(define-music-function (type)(string?) + #{ + \once \omit Staff.Clef s4 + \override Staff.Clef.full-size-change = ##t + \clef #(string-append type "8") s4 + \clef #(string-append type "15") s4 + \clef #(string-append type "(8)") s4 + \clef #(string-append type "(141)") s4 + % change clefs are omitted - too similar to regular ones + \cueClef #(string-append type "8") s4 + \cueClef #(string-append type "15") s4 + \cueClef #(string-append type "(8)") s4 + \cueClef #(string-append type "(141)") s4 + #}) + +\markup "Even the smallest positioning changes may indicate a problem!" \score { << - \new Staff { \clef "G^8" g''1 } - \new Staff { \clef "F^8" c'1 } - \new Staff { \clef "C^8" c''1 } - \new Staff { \clef "G_8" g1 } - \new Staff { \clef "F_8" c,1 } - \new Staff { \clef "C_8" c1 } + \new Staff { \clefVariations "C_" } + \new Staff { \clefVariations "C^" } + \new Staff { \clefVariations "G_" } + \new Staff { \clefVariations "G^" } + \new Staff { \clefVariations "F_" } + \new Staff { \clefVariations "F^" } >> } + +\layout { + \context { + \Staff + \remove Time_signature_engraver + } +} \ No newline at end of file diff --git a/input/regression/clef-transposition-visibility.ly b/input/regression/clef-transposition-visibility.ly index ab82c493b1..e83fb4b8a7 100644 --- a/input/regression/clef-transposition-visibility.ly +++ b/input/regression/clef-transposition-visibility.ly @@ -1,4 +1,4 @@ -\version "2.17.18" +\version "2.19.21" \header { @@ -12,11 +12,11 @@ These settings also need to apply to clefs on new lines." \layout { ragged-right = ##t } -\relative c' { +\relative { \override Staff.ClefModifier.break-visibility = #all-invisible \clef "treble_8" - c2 c | + c'2 c | c c | \break c \clef "tenor" c | \revert Staff.ClefModifier.break-visibility diff --git a/input/regression/clef-transposition.ly b/input/regression/clef-transposition.ly index d2ff5730aa..7b68e03fd0 100644 --- a/input/regression/clef-transposition.ly +++ b/input/regression/clef-transposition.ly @@ -1,5 +1,5 @@ -\version "2.16.0" \header { +\version "2.19.21" \header { texidoc = "Clefs may be transposed up or down by arbitrary amount, including 15 for two octaves." @@ -8,10 +8,10 @@ by arbitrary amount, including 15 for two octaves." \layout { ragged-right = ##t } -\relative c'' { +\relative { \clef "G_8" - c4 + c''4 \clef "G_15" c4 \clef "G_7" diff --git a/input/regression/clefs.ly b/input/regression/clefs.ly index fa08917267..37ee787cb6 100644 --- a/input/regression/clefs.ly +++ b/input/regression/clefs.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.2" \header{ @@ -11,20 +11,37 @@ full size." ragged-right = ##t } +clefs = { + \clef "treble" c'1^"treble" \bar "||" + \clef "french" c'1^"french" \bar "||" + \clef "soprano" c'1^"soprano" \bar "||" + \clef "mezzosoprano" c'1^"mezzosoprano" \bar "||" + \clef "alto" c'1^"alto" \bar "||" + \clef "varC" c'1^"varC" \bar "||" + \clef "treble" c'1^"treble" \bar "||" + \clef "altovarC" c'1^"altovarC" \bar "||" + \clef "tenor" c'1^"tenor" \bar "||" + \clef "tenorvarC" c'1^"tenorvarC" \bar "||" + \clef "tenorG" c'^"tenorG" \bar "||" + \clef "GG" c'1^"GG" \bar "||" + \clef "baritone" c'1^"baritone" \bar "||" + \clef "varbaritone" c'1^"varbaritone" \bar "||" + \clef "baritonevarC" c'1^"baritonevarC" \bar "||" + \clef "baritonevarF" c'1^"baritonevarF" \bar "||" + \clef "bass" c'1^"bass" \bar "||" + \clef "subbass" c'1^"subbass" \bar "||" + \clef "percussion" c'1^"percussion" \bar "||" + \clef "varpercussion" c'1^"varpercussion" \bar "||" +} { + \override Score.RehearsalMark.self-alignment-X = #LEFT \textLengthOn - \clef "treble" c'1^"treble" \bar "||" - \clef "french"c'1^"french" \bar "||" - \clef "soprano"c'1^"soprano" \bar "||" - \clef "mezzosoprano"c'1^"mezzosoprano" \bar "||" - \clef "alto"c'1^"alto" \bar "||" - \clef "tenor"c'1^"tenor" \bar "||" - \clef "baritone"c'1^"baritone" \bar "||" - \clef "varbaritone"c'1^"varbaritone" \bar "||" - \clef "bass"c'1^"bass" \bar "||" - \clef "subbass"c'1^"subbass" \bar "||" - \override Staff.Clef.full-size-change = ##t - \clef "treble" c'1^"full-size-change = #t" \bar "|." + \mark "clefs:" + \clefs + \override Staff.Clef.full-size-change = ##t \break + \mark "with full-size-change = #t:" + \clefs + \bar "|." } diff --git a/input/regression/clip-systems.ly b/input/regression/clip-systems.ly index 5757b9c8a7..b13cc713fe 100644 --- a/input/regression/clip-systems.ly +++ b/input/regression/clip-systems.ly @@ -19,15 +19,15 @@ The result will be files named } -\version "2.16.0" +\version "2.19.22" #(ly:set-option 'clip-systems) #(define output-suffix "1") origScore = \score{ - \relative c' { + \relative { \set Staff.instrumentName = #"bla" - c1 + c'1 d \grace c16 e1 @@ -78,7 +78,7 @@ origScore = \score{ \score { \lyrics { \markup { from-2.0.1-to-4.0.1-clip.eps } - \markup { \epsfile #X #30.0 #(format #f "~a-1-from-2.0.1-to-4.0.1-clip.eps" (ly:parser-output-name parser)) } + \markup { \epsfile #X #30.0 #(format #f "~a-1-from-2.0.1-to-4.0.1-clip.eps" (ly:parser-output-name)) } } } } diff --git a/input/regression/cluster-break.ly b/input/regression/cluster-break.ly index d40b04aea5..ecb04966fc 100644 --- a/input/regression/cluster-break.ly +++ b/input/regression/cluster-break.ly @@ -1,14 +1,14 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Clusters behave well across line breaks." } \layout { ragged-right = ##t } -fragment = \relative c' { +fragment = \relative { \time 2/4 - 4 + 4 4 | \break diff --git a/input/regression/cluster-cross-staff.ly b/input/regression/cluster-cross-staff.ly index 4021a56cab..994b8ddfb8 100644 --- a/input/regression/cluster-cross-staff.ly +++ b/input/regression/cluster-cross-staff.ly @@ -7,14 +7,14 @@ ragged-right= ##t } -\version "2.16.0" +\version "2.19.21" \new PianoStaff << \new Staff = "up" { s1 *2 } \new Staff = "down" << - \applyMusic #notes-to-clusters \relative c { 4 \change Staff = up + \applyMusic #notes-to-clusters \relative { 4 \change Staff = up } { \clef bass s1 * 2 } diff --git a/input/regression/cluster-style.ly b/input/regression/cluster-style.ly index 273d0a4d6d..3558648cbc 100644 --- a/input/regression/cluster-style.ly +++ b/input/regression/cluster-style.ly @@ -1,14 +1,14 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Clusters behave well across line breaks." } \layout { ragged-right = ##t } -fragment = \relative c' { - 4 +fragment = \relative { + 4 4 4 } diff --git a/input/regression/cluster.ly b/input/regression/cluster.ly index 6001ed583d..8ec7e4e898 100644 --- a/input/regression/cluster.ly +++ b/input/regression/cluster.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Clusters are a device to denote that a complete range of notes is to be played." @@ -7,8 +7,8 @@ notes is to be played." \layout { ragged-right = ##t } -fragment = \relative c' { - c4 f4 4 +fragment = \relative { + c'4 f4 4 8 a4 c2 4 e4 c4 } diff --git a/input/regression/collision-alignment.ly b/input/regression/collision-alignment.ly deleted file mode 100644 index 87babb6934..0000000000 --- a/input/regression/collision-alignment.ly +++ /dev/null @@ -1,21 +0,0 @@ -\header { - - texidoc = "Notes in different staves should be aligned to the - left-most note, in case of collisions." - -} - -\layout { ragged-right = ##t } - -\version "2.17.15" - -\relative c' << - \new Staff { - << - { f g } \\ - { g f } - >> } - \new Staff { - c4 c - } ->> diff --git a/input/regression/collision-dots-invert.ly b/input/regression/collision-dots-invert.ly index 7993cc9436..2be79283ec 100644 --- a/input/regression/collision-dots-invert.ly +++ b/input/regression/collision-dots-invert.ly @@ -6,9 +6,9 @@ } \layout { ragged-right = ##t } -\version "2.16.0" -\relative c'' { - << 2\\ { 4 4 } >> +\version "2.19.21" +\relative { + << 2\\ { 4 4 } >> << { 2 } \\ { 4. 8 } >> } diff --git a/input/regression/collision-dots-move.ly b/input/regression/collision-dots-move.ly index 38f8d4144c..c0d28c0baf 100644 --- a/input/regression/collision-dots-move.ly +++ b/input/regression/collision-dots-move.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "If dotted note heads must remain on the left side, @@ -8,10 +8,10 @@ collision resolution moves the dots to the right." \layout { ragged-right = ##t } -\relative c { +\relative { \clef bass \override Staff.NoteCollision.prefer-dotted-right = ##t - << 4 ^"prefer-dotted-right = #t" \\ { c8. d16 } >> + << 4 ^"prefer-dotted-right = #t" \\ { c8. d16 } >> << 4 \\ { d8. d16 } >> << 4 \\ { f'8. d16 } >> << 4 \\ { g'8. d16 } >> diff --git a/input/regression/collision-dots-up-space-dotted.ly b/input/regression/collision-dots-up-space-dotted.ly index b9db8bbcfd..c758b28706 100644 --- a/input/regression/collision-dots-up-space-dotted.ly +++ b/input/regression/collision-dots-up-space-dotted.ly @@ -6,12 +6,12 @@ } -\version "2.17.6" +\version "2.19.21" \paper{ ragged-right=##t } -\new Staff \relative c' << - { fis4. +\new Staff \relative << + { fis'4. \override Staff.NoteCollision.prefer-dotted-right = ##f fis4. } \\ diff --git a/input/regression/collision-harmonic-no-dots.ly b/input/regression/collision-harmonic-no-dots.ly index cd5669ff03..7641608dd0 100644 --- a/input/regression/collision-harmonic-no-dots.ly +++ b/input/regression/collision-harmonic-no-dots.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Collision resolution involving dotted harmonic heads @@ -7,9 +7,9 @@ will only retrieve @code{'dot-count} from live grobs. " } -\relative c' { +\relative { << - { 2. } + { 2. } \\ { e2. } >> diff --git a/input/regression/collision-head-chords.ly b/input/regression/collision-head-chords.ly index 2d52f34bff..2dfadebd33 100644 --- a/input/regression/collision-head-chords.ly +++ b/input/regression/collision-head-chords.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Note heads in collisions should be merged if they have the same positions in the extreme note heads. @@ -9,8 +9,8 @@ they have the same positions in the extreme note heads. -\relative c'' { - c4 +\relative { + c''4 << { c4 d4 8 } \\ { c4 c 8 8 } >> } diff --git a/input/regression/collision-heads.ly b/input/regression/collision-heads.ly index ce5c56e04f..b1d9b1e598 100644 --- a/input/regression/collision-heads.ly +++ b/input/regression/collision-heads.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Open and black note heads are not merged by default." @@ -8,9 +8,9 @@ \layout { ragged-right= ##t } -\context Staff \relative c'' << +\context Staff \relative << { - c2 c8 c4. + c''2 c8 c4. }\\ { c8 c4. c2 diff --git a/input/regression/collision-manual.ly b/input/regression/collision-manual.ly index 685090b78a..b39b0eafeb 100644 --- a/input/regression/collision-manual.ly +++ b/input/regression/collision-manual.ly @@ -1,17 +1,28 @@ \header { - - texidoc = "Collision resolution may be forced manually with @code{force-hshift}. " + texidoc = "Colliding note-columns may be shifted manually +with @code{force-hshift}. Arrangements of notes after +collision-resolution have their main columns (not suspended notes) +left-aligned, excluding columns with forced shifts." } -\version "2.17.6" +\version "2.19.24" -\paper { - ragged-right = ##t -} +\new PianoStaff \with { \consists #Span_stem_engraver } << + \new Staff \fixed c' << + \new Voice { + \voiceOne f e + \crossStaff + \once\override NoteColumn.force-hshift = #-0.8 + f + \once\override NoteColumn.force-hshift = #-1.5 + e + } + \new Voice { + \voiceTwo e f + \once\override NoteColumn.force-hshift = #0 + \crossStaff e + \crossStaff f + } + >> + \new Staff {\clef bass g g e f } +>> -\relative c' { - << { f - \override NoteColumn.force-hshift = #0.1 - f } \\ - { e e } - >> -} diff --git a/input/regression/collision-merge-differently-dotted.ly b/input/regression/collision-merge-differently-dotted.ly index 9da7bed233..e2c0da08b3 100644 --- a/input/regression/collision-merge-differently-dotted.ly +++ b/input/regression/collision-merge-differently-dotted.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "If @code{NoteCollision} has @@ -10,9 +10,9 @@ should not disappear when merging similar note heads." \layout { ragged-right= ##t } -\context Staff \relative c'' << +\context Staff \relative << { - g8[ g8] + g'8[ g8] \override Staff.NoteCollision.merge-differently-dotted = ##t g8[ g8] g4. r8 g8. g16 diff --git a/input/regression/collision-merge-differently-headed.ly b/input/regression/collision-merge-differently-headed.ly index 7876e6a7fd..e22888ebbc 100644 --- a/input/regression/collision-merge-differently-headed.ly +++ b/input/regression/collision-merge-differently-headed.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = @@ -12,10 +12,10 @@ if the black note heads are from 8th or shorter notes. \layout { ragged-right= ##t } -\context Staff \relative c'' << +\context Staff \relative << { \override Staff.NoteCollision.merge-differently-headed = ##t - c2 c8 c4. + c''2 c8 c4. c2 }\\ { diff --git a/input/regression/collision-merge-dots.ly b/input/regression/collision-merge-dots.ly index df0a0e0f84..7b7544082e 100644 --- a/input/regression/collision-merge-dots.ly +++ b/input/regression/collision-merge-dots.ly @@ -4,11 +4,11 @@ } \layout { ragged-right = ##t } -\version "2.16.0" +\version "2.19.21" { - \relative c'' \new Staff { - << { d8. e16 } \\ { d8. b16 } >> + \relative \new Staff { + << { d''8. e16 } \\ { d8. b16 } >> } } diff --git a/input/regression/collision-seconds.ly b/input/regression/collision-seconds.ly index f1b2134a51..9742c56900 100644 --- a/input/regression/collision-seconds.ly +++ b/input/regression/collision-seconds.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Seconds do not confuse the collision algorithm. @@ -7,7 +7,7 @@ or come relatively close, but the second in each measure needs more space to make clear which notes belong to which voice." } -\relative f << { +\relative << { 2 \bar "||" } \\ { diff --git a/input/regression/collision-whole.ly b/input/regression/collision-whole.ly index 3813a09265..e1601f9645 100644 --- a/input/regression/collision-whole.ly +++ b/input/regression/collision-whole.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Mixed collisions with whole and longer notes @@ -6,10 +6,10 @@ } \layout{ragged-right=##t} -\relative c'' { +\relative { \override Score.NoteHead.style = #'altdefault << - { c1 c2*2 c1 c4*4 c1 c\breve*1/2 c\breve*1/2 b\breve*1/2 } + { c''1 c2*2 c1 c4*4 c1 c\breve*1/2 c\breve*1/2 b\breve*1/2 } \\ { c2*2 c1 c4*4 c1 c\breve*1/2 c1 b\breve*1/2 c\breve*1/2 } >> diff --git a/input/regression/collisions.ly b/input/regression/collisions.ly index c94254378b..eeea895cdc 100644 --- a/input/regression/collisions.ly +++ b/input/regression/collisions.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc=" In addition to normal collision rules, there is support for polyphony, @@ -8,16 +8,16 @@ where the collisions are avoided by shifting middle voices horizontally. twovoice = -\relative c' \context Staff << +\relative \context Staff << { g4 f f e e d d c } \\ { c4 c d d e e f f } >> twovoicechords = \context Staff << - \relative c' { - e4 d c b a g f + \relative { + e'4 d c b a g f }\\ - \relative c' { + \relative { 4 4 4 4 } @@ -30,15 +30,33 @@ threevoice = \context Staff << { e4 e e e e e e e } >> -hairyChord = \context Staff \relative c'' +hairyChord = \context Staff \relative << - e \\ + e'' \\ fis, \\ cis' \\ \\ ais >> +minims = << + { e''2 e'' e' d' } \\ + c'' \\ + { c' c' c' c' } \\ + g' >> + +semibreves = << + { e''1 e'' e' d' } \\ + c'' \\ + { c' c' c' c' } \\ + g' >> + +sequence = << + \new Voice { \voiceOne g''1 e''2 d'' e'' d'' } + \new Voice { \voiceThree c''2 b' a'1 b' } + \new Voice { \voiceFour g'1 e'2 f'2 a'1 } + \new Voice { \voiceTwo c'1 c'2 d' e'2 d' } +>> { \transpose c c' { @@ -47,6 +65,9 @@ hairyChord = \context Staff \relative c'' \threevoice } \hairyChord + \break + \minims \bar "||" + \semibreves \bar "||" + \sequence } - diff --git a/input/regression/color.ly b/input/regression/color.ly index 8f2c608e14..6dd0a41554 100644 --- a/input/regression/color.ly +++ b/input/regression/color.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header{ texidoc = "Each grob can have a color assigned to it. @@ -8,11 +8,11 @@ Use the @code{\\override} and @code{\\revert} expressions to set the \paper { ragged-right = ##t } -\relative c' { +\relative { \override Accidental.color = #darkgreen \override Beam.color = #cyan \override NoteHead.color = #darkyellow - c4 + c'4 \override NoteHead.color = #red f \override NoteHead.color = #darkmagenta diff --git a/input/regression/completion-heads-factor.ly b/input/regression/completion-heads-factor.ly index 79510e1484..cc29f58d4e 100644 --- a/input/regression/completion-heads-factor.ly +++ b/input/regression/completion-heads-factor.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.0" \header{ texidoc=" If the @code{Note_heads_engraver} is replaced by the @code{Completion_heads_engraver}, -notes with a duration factor still keep their requested appearance. - -" +long notes, longer than @code{measureLength}, are split into un-scaled notes, +even if the original note used a scale-factor. +@code{completionFactor} controls this behavior." } \layout { ragged-right= ##t } @@ -20,5 +20,11 @@ notes with a duration factor still keep their requested appearance. c\breve | c1*2 | c2*4 | - c8*20 + c8*20 r2 \break + \tuplet 3/2 { d1 d d } + % \breve*2/3 is longer than a measure, but we want a tuplet, not repeats. + \set completionFactor = ##f + \tuplet 3/2 { e\breve e e } + \set completionFactor = #2/3 + \tuplet 3/2 { e\breve e e } } diff --git a/input/regression/completion-heads-lyrics.ly b/input/regression/completion-heads-lyrics.ly index 4dd7d26d3f..ccea9ad8ca 100644 --- a/input/regression/completion-heads-lyrics.ly +++ b/input/regression/completion-heads-lyrics.ly @@ -1,10 +1,10 @@ \header { texidoc = "You can put lyrics under completion heads." } -\version "2.16.0" +\version "2.19.21" -mel = \relative c'' { - c1. c1. +mel = \relative { + c''1. c1. } lyr = \lyricmode { diff --git a/input/regression/completion-heads-polyphony-2.ly b/input/regression/completion-heads-polyphony-2.ly index e9c668e457..349052f742 100644 --- a/input/regression/completion-heads-polyphony-2.ly +++ b/input/regression/completion-heads-polyphony-2.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " @@ -14,8 +14,8 @@ Complex completion heads work properly in a polyphonic environment. } } -\context Staff \relative c'' << - { c4. c c c4 c4. c4 } +\context Staff \relative << + { c''4. c c c4 c4. c4 } \\ { g8 g2 g1 g4. } >> diff --git a/input/regression/completion-heads-polyphony.ly b/input/regression/completion-heads-polyphony.ly index e8873c6881..4b41e11d2b 100644 --- a/input/regression/completion-heads-polyphony.ly +++ b/input/regression/completion-heads-polyphony.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Completion heads are broken across bar lines. This was @@ -16,7 +16,7 @@ Completion heads are not fooled by polyphony with a different rhythm. } } -\context Staff \relative c'' << - { c2. c bes2 } \\ +\context Staff \relative << + { c''2. c bes2 } \\ { c2. a8 g4 f4. g4 f } >> diff --git a/input/regression/completion-heads-tie.ly b/input/regression/completion-heads-tie.ly index 469305b29c..bfa7ab3dac 100644 --- a/input/regression/completion-heads-tie.ly +++ b/input/regression/completion-heads-tie.ly @@ -5,7 +5,7 @@ } -\version "2.16.0" +\version "2.19.21" \paper{ ragged-right=##t } @@ -13,6 +13,6 @@ \remove "Note_heads_engraver" \consists "Completion_heads_engraver" } { - \relative c'' { r2 d1 ~ d1 d2 } + \relative { r2 d''1 ~ 1 d2 } } diff --git a/input/regression/completion-heads-unit.ly b/input/regression/completion-heads-unit.ly index 7f28cf4d31..f5f507cb80 100644 --- a/input/regression/completion-heads-unit.ly +++ b/input/regression/completion-heads-unit.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = " @@ -17,7 +17,7 @@ Note head completion may be broken into sub-bar units by setting the } } -\context Staff \relative f { +\context Staff \relative { \time 9/8 \set completionUnit = #(ly:make-moment 3/8) g'1.. r2 diff --git a/input/regression/completion-rest.ly b/input/regression/completion-rest.ly index e39e17aff8..365b7372e2 100644 --- a/input/regression/completion-rest.ly +++ b/input/regression/completion-rest.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.0" \header{ texidoc=" If the @code{Rest_engraver} is replaced by the @code{Completion_rest_engraver}, -rests with a duration factor still keep their requested appearance. - -" +long rests, longer than @code{measureLength}, are split into +un-scaled rests, even if the original duration used a scale-factor. +@code{completionFactor} controls this behavior." } \layout { ragged-right= ##t } @@ -20,5 +20,9 @@ rests with a duration factor still keep their requested appearance. r\breve | r1*2 | r2*4 | - r8*20 + r8*20 r2 \break + \bar "||" \time 2/4 + r\breve.*2/3 + \set completionFactor = #1/2 + r\breve.*2/3^"explicity request r1*1/2 rests" } diff --git a/input/regression/complex-once.ly b/input/regression/complex-once.ly index d3a5a4553b..d69aab7639 100644 --- a/input/regression/complex-once.ly +++ b/input/regression/complex-once.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc= "This tests @code{\\once} applied to multiple property operations." } -\relative c' { - c4 d \hideNotes e4 f | +\relative { + c'4 d \hideNotes e4 f | \unHideNotes g a \once \hideNotes b c | } diff --git a/input/regression/compound-time-signature-style.ly b/input/regression/compound-time-signature-style.ly new file mode 100644 index 0000000000..55de7c0cb6 --- /dev/null +++ b/input/regression/compound-time-signature-style.ly @@ -0,0 +1,14 @@ +\version "2.19.21" + +\header { + texidoc = "Simple-fraction components of a compound time signature are numeric regardless of the time signature style. +" +} + +\relative { + \compoundMeter #'(2 2) b'1 + \compoundMeter #'(4 4) b1 + \compoundMeter #'((1 1) (2 2)) b\breve + \compoundMeter #'((2 2) (4 4)) b\breve + \compoundMeter #'((4 4) (3 3 2 8)) b\breve +} diff --git a/input/regression/compound-time-signatures.ly b/input/regression/compound-time-signatures.ly index 2f10281825..2437efad47 100644 --- a/input/regression/compound-time-signatures.ly +++ b/input/regression/compound-time-signatures.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Create compound time signatures. The argument is a Scheme list @@ -15,10 +15,10 @@ as @code{\\compoundMeter #'((3 2 8))} or shorter -\relative c' { +\relative { \override Staff.TimeSignature.break-visibility = ##(#f #t #t) \compoundMeter #'(1 2 3 4 8) - \repeat unfold 10 c8 \repeat unfold 20 c16 \break + \repeat unfold 10 c'8 \repeat unfold 20 c16 \break \time 3/4 \repeat unfold 6 c8 \repeat unfold 12 c16 \break diff --git a/input/regression/context-mod-context.ly b/input/regression/context-mod-context.ly index 5f3bb9901b..a3db629b51 100644 --- a/input/regression/context-mod-context.ly +++ b/input/regression/context-mod-context.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Context modifications can be stored into a variable as a @@ -12,7 +12,7 @@ ctxmod = \with { \override StaffSymbol.line-count = 4 } -music = \relative c'' { \key fis \minor c1 d e } +music = \relative { \key fis \minor c''1 d e } \score { << \new Staff { \music} diff --git a/input/regression/context-mod-with.ly b/input/regression/context-mod-with.ly index 3857cd1593..999c94bab8 100644 --- a/input/regression/context-mod-with.ly +++ b/input/regression/context-mod-with.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Context modifications can be stored into a variable as a @@ -26,7 +26,7 @@ ctxmod = \with { } -music = \relative c'' { \key fis \minor c1 d e } +music = \relative { \key fis \minor c''1 d e } \score { << \override Score.RehearsalMark.self-alignment-X = #LEFT diff --git a/input/regression/context-nested-staffgroup.ly b/input/regression/context-nested-staffgroup.ly index 59aa604eed..c9e6dbcb23 100644 --- a/input/regression/context-nested-staffgroup.ly +++ b/input/regression/context-nested-staffgroup.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Contexts of the same type can be nested." } -\new StaffGroup \relative c' << - \new Staff { c1 } +\new StaffGroup \relative << + \new Staff { c'1 } \new StaffGroup << \new Staff { c1 } \new StaffGroup << diff --git a/input/regression/cue-clef-after-barline.ly b/input/regression/cue-clef-after-barline.ly index 0969fbcb62..64d606fb8b 100644 --- a/input/regression/cue-clef-after-barline.ly +++ b/input/regression/cue-clef-after-barline.ly @@ -1,12 +1,12 @@ -\version "2.17.6" +\version "2.19.21" -instrument = \relative c' { - \repeat unfold 40 { c8 } +instrument = \relative { + \repeat unfold 40 { c'8 } } \addQuote "instrQuote" \instrument -Solo = \relative c' { - c2 c | +Solo = \relative { + c'2 c | % Change the break-align-orders of the score so that cue-clef comes after bar-line \override Score.BarLine.space-alist.cue-clef = #'(minimum-space . 1.0) diff --git a/input/regression/cue-clef-begin-of-score.ly b/input/regression/cue-clef-begin-of-score.ly index 0f9c8de1d6..b532663e28 100644 --- a/input/regression/cue-clef-begin-of-score.ly +++ b/input/regression/cue-clef-begin-of-score.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Clefs for cue notes at the start of a score should print the standard clef plus a small cue clef after the time/@/key signature." } -vI = \relative c'' { \clef "treble" \repeat unfold 40 g4 } +vI = \relative { \clef "treble" \repeat unfold 40 g'4 } \addQuote vIQuote { \vI } Solo = \relative c'' { diff --git a/input/regression/cue-clef-keysignature.ly b/input/regression/cue-clef-keysignature.ly index 8e70bf18a8..a94fdecbee 100644 --- a/input/regression/cue-clef-keysignature.ly +++ b/input/regression/cue-clef-keysignature.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Clefs for cue notes should not influence the printed key signature." } -vI = \relative c'' { \clef "treble" \repeat unfold 40 g4 } +vI = \relative { \clef "treble" \repeat unfold 40 g'4 } \addQuote vIQuote { \vI } \score { \new Staff { diff --git a/input/regression/cue-clef-manually.ly b/input/regression/cue-clef-manually.ly index fcd94201f3..aa3535a92e 100644 --- a/input/regression/cue-clef-manually.ly +++ b/input/regression/cue-clef-manually.ly @@ -1,7 +1,7 @@ -\version "2.16.0" +\version "2.19.21" -Solo = \relative c' { - c4 c c c | +Solo = \relative { + c'4 c c c | % Manually written cue notes, not quoted from another lilypond voice: << diff --git a/input/regression/cue-clef-new-line.ly b/input/regression/cue-clef-new-line.ly index e9b3e64f08..7b6e6f1969 100644 --- a/input/regression/cue-clef-new-line.ly +++ b/input/regression/cue-clef-new-line.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Clefs for cue notes and line breaks. If the cue notes start in a @@ -10,10 +10,10 @@ Cue notes going over a line break should print the standard clef on the new line plus an additional cue clef after the time/@/key signature." } -vI = \relative c'' { \clef "treble" \repeat unfold 40 g4 } +vI = \relative { \clef "treble" \repeat unfold 40 g'4 } \addQuote vIQuote { \vI } -Solo = \relative c { +Solo = \relative { \clef "bass" c1 | \break \cueDuringWithClef #"vIQuote" #UP #"tenor" { R1 } | \break diff --git a/input/regression/cue-clef-transposition-optional.ly b/input/regression/cue-clef-transposition-optional.ly index caeaf13193..a0a78660ee 100644 --- a/input/regression/cue-clef-transposition-optional.ly +++ b/input/regression/cue-clef-transposition-optional.ly @@ -1,15 +1,15 @@ -\version "2.17.7" +\version "2.19.21" \header { texidoc = "Optional transposition for clefs for cue notes is supported by using parentheses or brackets around the transposition number." } -vI = \relative c'' { \clef "treble" \repeat unfold 40 g4 } +vI = \relative { \clef "treble" \repeat unfold 40 g'4 } \addQuote vIQuote { \vI } -Solo = \relative c' { - \clef "treble_8" c1 | +Solo = \relative { + \clef "treble_8" c'1 | \cueDuringWithClef #"vIQuote" #UP #"bass^(15)" { R1 } | c1 | \break c c diff --git a/input/regression/cue-clef-transposition.ly b/input/regression/cue-clef-transposition.ly index dd26c9f25d..e4ebcb0654 100644 --- a/input/regression/cue-clef-transposition.ly +++ b/input/regression/cue-clef-transposition.ly @@ -1,14 +1,14 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Transposition for clefs for cue notes." } -vI = \relative c'' { \clef "treble" \repeat unfold 40 g4 } +vI = \relative { \clef "treble" \repeat unfold 40 g'4 } \addQuote vIQuote { \vI } -Solo = \relative c' { - \clef "treble_8" c1 | +Solo = \relative { + \clef "treble_8" c'1 | \cueDuringWithClef #"vIQuote" #UP #"bass^8" { R1 } | c1 | \break c c diff --git a/input/regression/cue-clef.ly b/input/regression/cue-clef.ly index 1cf19a2b8c..2d60544bca 100644 --- a/input/regression/cue-clef.ly +++ b/input/regression/cue-clef.ly @@ -1,14 +1,14 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Clefs for cue notes: Print a cue clef at the begin of the cue notes and a canceling clef after the cue notes." } -vI = \relative c'' { \clef "treble" \repeat unfold 16 g4 } +vI = \relative { \clef "treble" \repeat unfold 16 g'4 } \addQuote vIQuote { \vI } -Solo = \relative c { +Solo = \relative { \clef "bass" c4 \cueDuringWithClef #"vIQuote" #DOWN #"treble" { r4 r2 | diff --git a/input/regression/define-event-function.ly b/input/regression/define-event-function.ly index ce88d94fef..fcd8394e38 100644 --- a/input/regression/define-event-function.ly +++ b/input/regression/define-event-function.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" \header{ @@ -11,11 +11,11 @@ opposed to music functions, a direction indicator is not required." \layout { ragged-right = ##t } dynScript = -#(define-event-function (parser location text) (markup?) +#(define-event-function (text) (markup?) (make-dynamic-script text)) -\relative c' { - c1\dynScript pp +\relative { + c'1\dynScript pp c^\dynScript "fp" c_\dynScript "spz" } diff --git a/input/regression/display-lily-tests.ly b/input/regression/display-lily-tests.ly index a4abc604d1..1a51c2b122 100644 --- a/input/regression/display-lily-tests.ly +++ b/input/regression/display-lily-tests.ly @@ -1,4 +1,4 @@ -\version "2.17.25" +\version "2.19.40" #(use-modules (srfi srfi-13) (ice-9 format)) @@ -15,10 +15,10 @@ (char=? (peek-char port) #\])) (read-char port)) (display c out)))))) - `(let* ((parser-clone (ly:parser-clone parser)) + `(let* ((parser-clone (ly:parser-clone)) (input-str (string-trim-both ,lily-string)) (music (ly:parse-string-expression parser-clone input-str)) - (result-str (string-trim-both (music->lily-string music parser-clone)))) + (result-str (string-trim-both (music->lily-string music)))) (cons input-str result-str)))) #(read-hash-extend #\[ parse-lily-and-compute-lily-string) %{ ] %} @@ -27,7 +27,7 @@ (make-column-markup (string-split str #\NewLine))) test = -#(define-void-function (parser location harmless strings) +#(define-void-function (harmless strings) ((string?) pair?) (let ((input (car strings)) (output (cdr strings)) @@ -36,7 +36,7 @@ test = (if harmless (ly:progress "Test unequal: ~a.\nin = ~a\nout = ~a\n" harmless input output) - (ly:input-warning location "Test unequal: BUG.\nin = ~a\nout = ~a\n" + (ly:input-warning (*location*) "Test unequal: BUG.\nin = ~a\nout = ~a\n" input output))))) %%% @@ -48,24 +48,24 @@ stderr of this run." } %% Sequential music -\test ##[ { { a b } { c d } } #] % SequentialMusic -\test ##[ << { a b } { c d } >> #] % SimultaneousMusic -\test ##[ << { a b } \\ { c d } >> #] % VoiceSeparator +\test ##[ { { a4 b4 } { c4 d4 } } #] % SequentialMusic +\test ##[ << { a4 b4 } { c4 d4 } >> #] % SimultaneousMusic +\test ##[ << { a4 b4 } \\ { c4 d4 } >> #] % 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 ##[ { ceses4 ces4 c4 cis4 cisis4 } #] % NoteEvent +\test ##[ { deses4 des4 d4 dis4 disis4 } #] +\test ##[ { eeses4 ees4 e4 eis4 eisis4 } #] +\test ##[ { feses4 fes4 f4 fis4 fisis4 } #] +\test ##[ { geses4 ges4 g4 gis4 gisis4 } #] +\test ##[ { aeses4 aes4 a4 ais4 aisis4 } #] +\test ##[ { beses4 bes4 b4 bis4 bisis4 } #] +\test ##[ { c,,4 d'4 } #] +\test ##[ { c'4 d'='4 } #] +\test ##[ { c!4 c?4 } #] \test ##[ r1.*4/3 #] % RestEvent \test ##[ c1\rest #] % RestEvent -\test ##[ s2..*3/4 #] % SkipEvent +\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 @@ -73,22 +73,22 @@ stderr of this run." \test ##[ { < c e g c' >4 q8-. } #] % RepeatedChord %% tags -\test ##[ { \tag #'foo { c4 d } } #] -\test ##[ c-\tag #'foo -\tag #'baz -^-. #] +\test ##[ { \tag #'foo { c4 d4 } } #] +\test ##[ c4-\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 } #] +\test ##[ { c1 \afterGrace { b,16 c16 } d2 } #] %% Clusters -\test ##[ { \makeClusters { c4 g } } #] % ClusterNoteEvent +\test ##[ { \makeClusters { c4 g4 } } #] % ClusterNoteEvent %% Figured bass -\test ##[ \figures { < 6 > } #] % BassFigureEvent -\test ##[ \figuremode { < 1-- 3- > < 2+ 4++ > < _! 7! > } #] -\test ##[ \figuremode { < [6 > < 5] > } #] +\test ##[ \figures { < 6 >4 } #] % BassFigureEvent +\test ##[ \figuremode { < 1-- 3- >4 < 2+ 4++ >4 < _! 7! >4 } #] +\test ##[ \figuremode { < [6 >4 < 5] >4 } #] %% Lyrics \test ##[ \lyrics { a b } #] @@ -96,53 +96,53 @@ stderr of this run." \test ##[ \lyricmode { a __ b } #] % ExtenderEvent \test ##[ \lyricmode { "a " } #] % LyricEvent \test ##[ \lyricsto "foo" { bla bla } #] % LyricCombineMusic -\test ##[ { { c d } +\test ##[ { { c4 d4 } \addlyrics { bla bla } } #] %% Drums -\test ##[ \drums { hihat } #] +\test ##[ \drums { hihat4 } #] \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 ##[ { < c\harmonic >4 < c e\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\episemInitium c\episemFinis } #] % EpisemaEvent -\test ##[ { c\( c\) c^\( c^\) c_\( c_\) } #] % PhrasingSlurEvent -\test ##[ { c\sustainOn c\sustainOff } #] % SustainEvent -\test ##[ { c\sostenutoOn c\sostenutoOff } #] % SostenutoEvent +\test ##[ c4\noBeam #] % BeamForbidEvent +\test ##[ c4\1 #] % StringNumberEvent +\test ##[ { c4:8 c4:1 } #] % TremoloEvent +\test ##[ { c4-^ c4^^ c4_^ } #] % ArticulationEvent +\test ##[ { c4-+ c4^+ c4_+ } #] +\test ##[ { c4-- c4^- c4_- } #] +\test ##[ { c4-! c4^! c4_! } #] +\test ##[ { c4-> c4^> c4_> } #] +\test ##[ { c4-. c4^. c4_. } #] +\test ##[ { c4-_ c4^_ c4__ } #] +\test ##[ { c4\trill c4^\trill c4_\trill } #] +\test ##[ { c4-1 c4^2 c4_3 } #] % FingerEvent +\test ##[ { c4-"foo" c4^"foo" c4_"foo" } #] % TextScriptEvent +\test ##[ { R1*4-"foo" R1*4^"foo" R1*4_"foo" } #] % MultiMeasureTextEvent +\test ##[ { < c\harmonic >4 < c e\harmonic >4 } #] % HarmonicEvent +\test ##[ { c4\glissando c4^\glissando c4_\glissando } #] % GlissandoEvent +\test ##[ { c4\arpeggio c4^\arpeggio c4_\arpeggio } #] % ArpeggioEvent +\test ##[ { c4\p c4^\ff c4_\sfz } #] % AbsoluteDynamicEvent +\test ##[ { c4[ c4] c4^[ c4^] c4_[ c4_] } #] % BeamEvent +\test ##[ { c4( c4) c4^( c4^) c4_( c4_) } #] % SlurEvent +\test ##[ { c4\< c4\! c4^\< c4^\! c4_\< c4_\! } #] % CrescendoEvent +\test ##[ { c4\> c4\! c4^\> c4^\! c4_\> c4_\! } #] % DecrescendoEvent +\test ##[ { c4\episemInitium c4\episemFinis } #] % EpisemaEvent +\test ##[ { c4\( c4\) c4^\( c4^\) c4_\( c4_\) } #] % PhrasingSlurEvent +\test ##[ { c4\sustainOn c4\sustainOff } #] % SustainEvent +\test ##[ { c4\sostenutoOn c4\sostenutoOff } #] % 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 ##[ { c4\startTextSpan c4\stopTextSpan } #] % TextSpanEvent +\test ##[ { c4\startTrillSpan c4\stopTrillSpan } #] % TrillSpanEvent +\test ##[ { c4 \startStaff c4 \stopStaff } #] % StaffSpanEvent +\test ##[ { c4\startGroup c4\stopGroup c4^\startGroup c4^\stopGroup c4_\startGroup c4_\stopGroup } #] % NoteGroupingEvent +\test ##[ { c4\unaCorda c4\treCorde } #] % UnaCordaEvent \test ##[ \breathe #] -\test ##[ { c \[ c \] } #] % LigatureEvent +\test ##[ { c4 \[ c4 \] } #] % LigatureEvent \test ##[ \~ #] % PesOrFlexaEvent -\test ##[ c\bendAfter #3 #] % BendAfterEvent -\test ##[ c\rightHandFinger #1 #] % StrokeFingerEvent +\test ##[ c4\bendAfter #3 #] % BendAfterEvent +\test ##[ c4\rightHandFinger #1 #] % StrokeFingerEvent \test ##[ \break #] \test ##[ \noBreak #] @@ -168,44 +168,49 @@ stderr of this run." \test ##[ \key e \minor #] \test ##[ \clef "bass" #] \test ##[ \clef "french^2" #] +\test ##[ \clef "treble_[8]" #] +\test ##[ \clef "bass^(15)" #] \test ##[ \clef "alto_3" #] \test ##[ \time 2/4 #] -\test ##[ \time #'(3 2) 5/8 #] +\test ##[ \time 3,2 5/8 #] \test ##[ \bar "|." #] %% staff switches -\test ##[ \autochange { c d } #] % AutoChangeMusic -\test ##[ { \change Staff = "up" { c d } } #] % ContextChange +\test ##[ \autochange { c4 d4 } #] % AutoChangeMusic +\test ##[ { \change Staff = "up" { c4 d4 } } #] % ContextChange %% Tuplets -\test ##[ \tuplet 3/2 { c8 d e } #] % TimeScaledMusic -\test ##[ \tuplet 6/4 { c16 d e f g a } #] -\test ##[ \tuplet 3/2 { c4 d e \tuplet 5/2 { f4 e d2 d4 } c4 } #] -\test ##[ \tuplet 3/2 2 { c4 d e \tuplet 5/2 2 { f4 e d2 d4 } c4 } #] +\test ##[ \tuplet 3/2 { c8 d8 e8 } #] % TimeScaledMusic +\test ##[ \tuplet 6/4 { c16 d16 e16 f16 g16 a16 } #] +\test ##[ \tuplet 3/2 { c4 d4 e4 \tuplet 5/2 { f4 e4 d2 d4 } c4 } #] +\test ##[ \tuplet 3/2 2 { c4 d4 e4 \tuplet 5/2 2 { f4 e4 d2 d4 } c4 } #] + +%% pure rhythm +\test ##[ { 4 4 8 \tuplet 3/2 { 8[ 16] } 16 } #] %% \relative and \tranpose -\test #"NOT A BUG" ##[ \relative c' { c b } #] % RelativeOctaveMusic -\test #"NOT A BUG" ##[ \transpose c d { c d } #] % TransposedMusic +\test #"NOT A BUG" ##[ \relative { c'4 b4 } #] % RelativeOctaveMusic +\test #"NOT A BUG" ##[ \transpose c d { c4 d4 } #] % TransposedMusic %% Repeats -\test ##[ \repeat volta 2 { c d } #] % VoltaRepeatedMusic -\test ##[ \repeat unfold 2 { c d } #] % UnfoldedRepeatedMusic -\test ##[ \repeat percent 2 { c d } #] % PercentRepeatedMusic -\test ##[ \repeat tremolo 4 { c16 d } #] % TremoloRepeatedMusic -\test ##[ \repeat tremolo 7 { c''32 b' } #] -\test ##[ \repeat tremolo 15 { c''16 b' } #] -\test ##[ \repeat volta 2 { c4 d } \alternative { { c d } { e f } } #] % +\test ##[ \repeat volta 2 { c4 d4 } #] % VoltaRepeatedMusic +\test ##[ \repeat unfold 2 { c4 d4 } #] % UnfoldedRepeatedMusic +\test ##[ \repeat percent 2 { c4 d4 } #] % PercentRepeatedMusic +\test ##[ \repeat tremolo 4 { c16 d16 } #] % TremoloRepeatedMusic +\test ##[ \repeat tremolo 7 { c''32 b'32 } #] +\test ##[ \repeat tremolo 15 { c''16 b'16 } #] +\test ##[ \repeat volta 2 { c4 d4 } \alternative { { c4 d4 } { e4 f4 } } #] % %% 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 { c4 d4 } #] % ContextSpeccedMusic +\test ##[ \new Staff = "up" { c4 d4 } #] % ContextSpeccedMusic +\test ##[ \context Staff { c4 d4 } #] +\test ##[ \context Staff = "up" { c4 d4 } #] \test ##[ \new Staff \with { \consists "Timing_engraver" \remove "Clef_engraver" -} { c d } #] +} { c4 d4 } #] %% Context properties \test ##[ \once \set Score . skipBars = ##t #] % PropertySet \test ##[ \set autoBeaming = ##f #] @@ -221,7 +226,8 @@ stderr of this run." \test ##[ \revert StaffGrouper.staff-staff-spacing.basic-distance #] % nested properties %% \applyOutput -\test ##[ \applyOutput #'Foo #(lambda (arg) (list)) #] +\test ##[ \applyOutput Foo #(lambda (arg) (list)) #] +\test ##[ \applyOutput Foo.NoteHead #(lambda (arg) (list)) #] %% \applyContext \test ##[ \applyContext #(lambda (arg) (list)) #] @@ -231,22 +237,26 @@ stderr of this run." \test ##[ \partial 4*2/3 #] %% \partcombine -\test ##[ \partcombine { c e } -{ d f } #] % PartCombineMusic UnrelativableMusic +\test ##[ \partcombine { c4 e4 } +{ d4 f4 } #] +\test ##[ \partcombineUp { c2 e2 } +{ d2 f2 } #] +\test ##[ \partcombineDown { c1 e1 } +{ d1 f1 } #] %% Cue notes -\test ##[ \cueDuring #"foo" #1 { c d } #] -\test ##[ \quoteDuring #"foo" { c d } #] +\test ##[ \cueDuring #"foo" #1 { c4 d4 } #] +\test ##[ \quoteDuring #"foo" { c4 d4 } #] %% \ottava \test ##[ \ottava #1 #] % OttavaMusic %% \tweak -\test ##[ < \tweak duration-log #2 c > #] -\test ##[ < c \tweak transparent ##t e > #] -\test ##[ < \tweak color #'(1.0 0.0 0.0) \tweak duration-log #2 c > #] -\test ##[ c-\tweak font-size #3 -> #] -\test ##[ < \tweak Accidental.color #'(1.0 0.0 0.0) cis eis g > #] +\test ##[ < \tweak duration-log #2 c >4 #] +\test ##[ < c \tweak transparent ##t e >4 #] +\test ##[ < \tweak color #'(1.0 0.0 0.0) \tweak duration-log #2 c >4 #] +\test ##[ c4-\tweak font-size #3 -> #] +\test ##[ < \tweak Accidental.color #'(1.0 0.0 0.0) cis eis g >4 #] %% end test. diff --git a/input/regression/divisi-staves.ly b/input/regression/divisi-staves.ly new file mode 100644 index 0000000000..64c8439afe --- /dev/null +++ b/input/regression/divisi-staves.ly @@ -0,0 +1,54 @@ +\version "2.19.13" + +\header { + texidoc = "The @code{VerticalAxisGroup.remove-layer} +property can be used for typesetting temporary divisi staves where +the switch to split staves is done only at line breaks such that all +complex passages are rendered in separate staves." +} + +boring = \set Staff.keepAliveInterfaces = #'() +tricky = \unset Staff.keepAliveInterfaces + +violI=\relative d' { + \boring \repeat unfold 100 d4 + \tricky 2 + \boring \repeat unfold 98 d4 + \bar "|." +} + +violII=\relative g { + \boring \repeat unfold 100 g4 + \tricky 2 + \boring \repeat unfold 98 g4 + \bar "|." +} + +\score { + \new StaffGroup \with { \consists "Keep_alive_together_engraver" } + << + \new Staff \with { instrumentName = "Violin I" + shortInstrumentName = "V I" + \override VerticalAxisGroup.remove-empty = ##t + \override VerticalAxisGroup.remove-first = ##t + \override VerticalAxisGroup.remove-layer = 1 + } + \violI + \new Staff \with { instrumentName = "Violin II" + shortInstrumentName = "V II" + \override VerticalAxisGroup.remove-empty = ##t + \override VerticalAxisGroup.remove-first = ##t + \override VerticalAxisGroup.remove-layer = 1 + } + \violII + \new Staff \with { instrumentName = "Violins" + shortInstrumentName = "V I&II" + \override VerticalAxisGroup.remove-layer = 2 + } + << \violI \\ \violII >> + >> + \layout { + short-indent = 2\cm + indent = 3\cm + } +} diff --git a/input/regression/dot-column-engraver.ly b/input/regression/dot-column-engraver.ly index f87e23f038..e63174d60e 100644 --- a/input/regression/dot-column-engraver.ly +++ b/input/regression/dot-column-engraver.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Dot Columns are engraved in the Staff by default, @@ -7,8 +7,8 @@ If Dot_column_engraver is moved to Voice, separate dot columns are engraved, and these dots avoid notes in other voices." } -music = \relative c'' { \time 3/4 << { - 4. c c b g f a a +music = \relative { \time 3/4 << { + 4. c c b g f a a } \\ \tuplet 2/1 { 2. a-- -. a2. a-- a a b \bar "|." } >> } diff --git a/input/regression/dot-dot-count-override.ly b/input/regression/dot-dot-count-override.ly index 7d2d1ab293..29e2db0537 100644 --- a/input/regression/dot-dot-count-override.ly +++ b/input/regression/dot-dot-count-override.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "The @code{dot-count} property @@ -6,8 +6,8 @@ for @code{Dots} can be modified by the user." } -\relative c'' { - c4.. a16 +\relative { + c''4.. a16 \override Dots.dot-count = #4 g4.. e16 \override Dots.dot-count = #0 diff --git a/input/regression/dot-flag-collision.ly b/input/regression/dot-flag-collision.ly index 1c649d6d20..23fa9adb6b 100644 --- a/input/regression/dot-flag-collision.ly +++ b/input/regression/dot-flag-collision.ly @@ -1,16 +1,16 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Dots move to the right when a collision with the (up)flag happens." } \layout { ragged-right = ##t} -\relative c'' +\relative { \time 8/4 \set Staff.autoBeaming = ##f - a,16. + a16. g''16. a,4. a8 a8. a16. c,16. g16. } diff --git a/input/regression/dot-rest-beam-trigger.ly b/input/regression/dot-rest-beam-trigger.ly index 478663fcf3..9fd8509773 100644 --- a/input/regression/dot-rest-beam-trigger.ly +++ b/input/regression/dot-rest-beam-trigger.ly @@ -6,11 +6,11 @@ } -\version "2.16.0" -\new Staff \relative c'' +\version "2.19.21" +\new Staff \relative { << - { \time 12/16 c16[ b a r b g] } + { \time 12/16 c''16[ b a r b g] } \\ { r8. r } >> diff --git a/input/regression/dot-up-voice-collision.ly b/input/regression/dot-up-voice-collision.ly index fa3035fcc7..9efdf0f284 100644 --- a/input/regression/dot-up-voice-collision.ly +++ b/input/regression/dot-up-voice-collision.ly @@ -5,14 +5,14 @@ } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } \new Staff { \key e \major \time 3/4 - \relative c'' { - << { dis4. } \\ + \relative { + << { dis''4. } \\ { fis,4 } \\ { b8 } >> } } diff --git a/input/regression/dots.ly b/input/regression/dots.ly index a811a9dc10..65a97fb918 100644 --- a/input/regression/dots.ly +++ b/input/regression/dots.ly @@ -1,4 +1,4 @@ -\version "2.16.0" \header{ +\version "2.19.21" \header{ texidoc=" Both noteheads and rests can have dots. @@ -22,9 +22,9 @@ The priorities to print the dots are (ranked in importance): -\context Voice \relative c'' { +\context Voice \relative { \time 6/8 - d4. g,, + d''4. g,, \stemDown 4. diff --git a/input/regression/double-repeat-default-volta.ly b/input/regression/double-repeat-default-volta.ly index f560324a6c..2b4e3fddad 100644 --- a/input/regression/double-repeat-default-volta.ly +++ b/input/regression/double-repeat-default-volta.ly @@ -1,13 +1,13 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "For volte, the style of double repeats can be set using @code{doubleRepeatType}." } -\relative c' { +\relative { \repeat volta 1 { - c1 + c'1 } \mark "default" \repeat volta 1 { diff --git a/input/regression/double-repeat.ly b/input/regression/double-repeat.ly index 9ce981dc59..1dd8da5a05 100644 --- a/input/regression/double-repeat.ly +++ b/input/regression/double-repeat.ly @@ -1,11 +1,11 @@ -\version "2.17.5" +\version "2.19.21" \header { texidoc = "Three types of double repeat bar line are supported." } \new StaffGroup << - \new Staff \relative c' { - c1 + \new Staff \relative { + c'1 \mark "\":|:\"" \bar ":..:" c1 @@ -16,7 +16,7 @@ \bar ":|.:" c1 } - \new Staff \relative c' { - \repeat unfold 4 { c1 } + \new Staff \relative { + \repeat unfold 4 { c'1 } } >> diff --git a/input/regression/duration-identifier-compressed.ly b/input/regression/duration-identifier-compressed.ly index 96b59cb81c..078ae8f453 100644 --- a/input/regression/duration-identifier-compressed.ly +++ b/input/regression/duration-identifier-compressed.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "The compression factor of a duration identifier is @@ -9,7 +9,7 @@ correctly accounted for by the parser." wholeHalved = #(ly:make-duration 0 0 1/2) -\relative c' { - c\wholeHalved c | +\relative { + c'\wholeHalved c | c\wholeHalved. c4 | } diff --git a/input/regression/dynamics-alignment-autobreak.ly b/input/regression/dynamics-alignment-autobreak.ly index d4ecfc9238..41362485e4 100644 --- a/input/regression/dynamics-alignment-autobreak.ly +++ b/input/regression/dynamics-alignment-autobreak.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "If a dynamic has an explicit direction that differs from the @@ -6,8 +6,8 @@ dynamic line spanner's direction, automatically break the dynamic line spanner. " } -\relative c' { - c1^\< +\relative { + c'1^\< c1_\> f,1\p diff --git a/input/regression/dynamics-alignment-breaker-linebreak.ly b/input/regression/dynamics-alignment-breaker-linebreak.ly index 0d3bb86755..4413e76ba2 100644 --- a/input/regression/dynamics-alignment-breaker-linebreak.ly +++ b/input/regression/dynamics-alignment-breaker-linebreak.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "@code{\\breakDynamicSpan} shall also work if a @@ -6,9 +6,9 @@ dynamic spanner crosses a line break. " } -\relative c' { +\relative { % spanner really crosses linebreak: - c1\<\breakDynamicSpan c'' \break + c'1\<\breakDynamicSpan c'' \break c,,1 % new spanner immediately after linebreak (with broken spanner): c''1\>\breakDynamicSpan \break diff --git a/input/regression/dynamics-alignment-breaker-order.ly b/input/regression/dynamics-alignment-breaker-order.ly index a295f8e551..2d5603afc8 100644 --- a/input/regression/dynamics-alignment-breaker-order.ly +++ b/input/regression/dynamics-alignment-breaker-order.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "@code{\\breakDynamicSpan} work whether it is placed together @@ -6,7 +6,7 @@ with the start or the end of a spanner. Both lines should be identical. " } -\relative c { +\relative { c1\< c'' % break directly before and after \> : c,1\breakDynamicSpan\>\breakDynamicSpan diff --git a/input/regression/dynamics-alignment-breaker-subsequent-spanner.ly b/input/regression/dynamics-alignment-breaker-subsequent-spanner.ly index a7c9e8d28e..5776eadbac 100644 --- a/input/regression/dynamics-alignment-breaker-subsequent-spanner.ly +++ b/input/regression/dynamics-alignment-breaker-subsequent-spanner.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "@code{\\breakDynamicSpan} shall only have an effect on the current @@ -6,10 +6,10 @@ spanner, not on subsequent spanners. " } -\relative c' { +\relative { % Check that the effect of \breakDynamic span is only for the current % spanner and not for the following spanners, too. - c1\<\breakDynamicSpan c'' + c'1\<\breakDynamicSpan c'' c,,1\> f,1\p % <= the \> and the \p should be aligned! } diff --git a/input/regression/dynamics-alignment-breaker.ly b/input/regression/dynamics-alignment-breaker.ly index b452c8d32d..d79b768590 100644 --- a/input/regression/dynamics-alignment-breaker.ly +++ b/input/regression/dynamics-alignment-breaker.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Hairpins, DynamicTextSpanners and dynamics can be @@ -7,8 +7,8 @@ causes the alignment spanner to end prematurely. " } -\relative c' { - c1^\< +\relative { + c'1^\< \dimTextDim c1_\> f,1\p diff --git a/input/regression/dynamics-alignment-no-line-linebreak.ly b/input/regression/dynamics-alignment-no-line-linebreak.ly index 69128631f6..8b407c5339 100644 --- a/input/regression/dynamics-alignment-no-line-linebreak.ly +++ b/input/regression/dynamics-alignment-no-line-linebreak.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Setting the style of a @code{DynamicTextSpanner} to @code{'none} @@ -6,9 +6,9 @@ to hide the line altogether should also work over line breaks. " } -\relative c'' { +\relative { \override DynamicTextSpanner.style = #'none - c2\cresc g,2 + c''2\cresc g,2 \break g2 c'2\f } diff --git a/input/regression/dynamics-alignment-no-line.ly b/input/regression/dynamics-alignment-no-line.ly index fd38e75b99..b3f9442652 100644 --- a/input/regression/dynamics-alignment-no-line.ly +++ b/input/regression/dynamics-alignment-no-line.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "If the line for a @code{DynamicTextSpanner} is hidden, the @@ -6,8 +6,8 @@ alignment spanner for dynamics is ended early. This allows consecutive dynamics to be unlinked." } -\relative g' { - g4\p\cresc g g g +\relative { + g'4\p\cresc g g g g,1\f \override DynamicTextSpanner.style = #'none diff --git a/input/regression/dynamics-avoid-cross-staff-stem-3.ly b/input/regression/dynamics-avoid-cross-staff-stem-3.ly index 0b0b7b6247..5b56f4dc5d 100644 --- a/input/regression/dynamics-avoid-cross-staff-stem-3.ly +++ b/input/regression/dynamics-avoid-cross-staff-stem-3.ly @@ -1,4 +1,4 @@ -\version "2.17.17" +\version "2.19.21" \header { texidoc = "Cross-staff @code{Dynamic} does not trigger a cyclic @@ -8,8 +8,8 @@ dependency for direction look-up. << \new Staff = "up" - \relative c' { - f8 + \relative { + f'8 \change Staff = "down" c e\f %should not trigger cyclic dependency \change Staff = "up" diff --git a/input/regression/dynamics-avoid-cross-staff-stem.ly b/input/regression/dynamics-avoid-cross-staff-stem.ly deleted file mode 100644 index 078d876ad7..0000000000 --- a/input/regression/dynamics-avoid-cross-staff-stem.ly +++ /dev/null @@ -1,19 +0,0 @@ -\version "2.17.10" - -\header { - texidoc = "Dynamics are correctly nested over/under cross staff stems. -They are, however, not yet factored into horizontal spacing - the fff -collides with other grobs. -" -} - -\new GrandStaff << - \new Staff = "PnRH" { - \relative g { - \stemDown gis8 \p [ \change Staff = "PnLH" \stemUp a, \fff ] - a8 \p [ \change Staff = "PnRH" \stemDown gis'8 \fff ] - \change Staff = "PnRH" r4 - } - } - \new Staff = "PnLH" { \clef "F" { s2 r4 } } ->> diff --git a/input/regression/dynamics-broken-hairpin.ly b/input/regression/dynamics-broken-hairpin.ly index 8946b5bbd3..39d200cfcb 100644 --- a/input/regression/dynamics-broken-hairpin.ly +++ b/input/regression/dynamics-broken-hairpin.ly @@ -1,7 +1,7 @@ +\version "2.19.21" -\version "2.16.0" -\header{ -texidoc = "Broken crescendi should be open on one side." +\header { + texidoc = "When a hairpin is broken, the broken parts should be open at the ‘breaking point’." } \layout { @@ -9,7 +9,11 @@ texidoc = "Broken crescendi should be open on one side." } -\relative c'' { - c1 \< \break c1\! \> \break c1\! +\relative { + c''1 \< \break + c + c\> \break + c + c\! } diff --git a/input/regression/dynamics-context-textspan.ly b/input/regression/dynamics-context-textspan.ly index 083585c31d..3243105bf5 100644 --- a/input/regression/dynamics-context-textspan.ly +++ b/input/regression/dynamics-context-textspan.ly @@ -1,19 +1,19 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Text spanners work in the @code{Dynamics} context." } << - \new Staff \relative c' { - c1 | c + \new Staff \relative { + c'1 | c } \new Dynamics { \override TextSpanner.bound-details.left.text = #"rit." s1\startTextSpan s1\stopTextSpan } - \new Staff \relative c' { - c1 | c + \new Staff \relative { + c'1 | c } >> diff --git a/input/regression/dynamics-custom-text-spanner-postfix.ly b/input/regression/dynamics-custom-text-spanner-postfix.ly index 23e1512f86..15c3d2510a 100644 --- a/input/regression/dynamics-custom-text-spanner-postfix.ly +++ b/input/regression/dynamics-custom-text-spanner-postfix.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" \header { texidoc = "Postfix functions for custom crescendo text spanners. The spanners @@ -8,15 +8,15 @@ otherwise the spanner start will rather be assigned to the next note." % Two functions for (de)crescendo spanners where you can explicitly give the % spanner text. -mycresc = #(define-music-function (parser location mymarkup) (string?) +mycresc = #(define-music-function (mymarkup) (string?) (make-music 'CrescendoEvent 'span-direction START 'span-type 'text 'span-text mymarkup)) -mydecresc = #(define-music-function (parser location mymarkup) (string?) +mydecresc = #(define-music-function (mymarkup) (string?) (make-music 'DecrescendoEvent 'span-direction START 'span-type 'text 'span-text mymarkup)) -\relative c' { - c4-\mycresc "custom cresc" c4 c4 c4 | +\relative { + c'4-\mycresc "custom cresc" c4 c4 c4 | c4 c4 c4 c4 | c4-\mydecresc "custom decresc" c4 c4 c4 | c4 c4\! c4 c4 diff --git a/input/regression/dynamics-empty.ly b/input/regression/dynamics-empty.ly index 4b06d96fae..cdf907a490 100644 --- a/input/regression/dynamics-empty.ly +++ b/input/regression/dynamics-empty.ly @@ -1,4 +1,4 @@ -\version "2.17.18" +\version "2.19.12" \header { texidoc = "An empty Dynamics context does not confuse the spacing." @@ -19,7 +19,7 @@ \layout { \context { \Dynamics - \override VerticalAxisGroup #'nonstaff-relatedstaff-spacing + \override VerticalAxisGroup.nonstaff-relatedstaff-spacing = #'((minimum-distance . 5)) } } diff --git a/input/regression/dynamics-glyphs.ly b/input/regression/dynamics-glyphs.ly index 693dc0b143..de74a114f1 100644 --- a/input/regression/dynamics-glyphs.ly +++ b/input/regression/dynamics-glyphs.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header {texidoc = "Dynamic letters are kerned, and their weight matches that of the hairpin signs. The dynamic scripts should be @@ -8,8 +8,8 @@ closer to the note head (staccato, accent) are reckoned with. " } -\relative c'' { - c1\ff +\relative { + c''1\ff e,-.-> \f e \rfz c' \mf diff --git a/input/regression/dynamics-hairpin-length.ly b/input/regression/dynamics-hairpin-length.ly index 78d25a6f1c..0260514c19 100644 --- a/input/regression/dynamics-hairpin-length.ly +++ b/input/regression/dynamics-hairpin-length.ly @@ -6,13 +6,13 @@ respectively." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c'' { - c4 \< c4 \! +\relative { + c''4 \< c4 \! c4 \< c \!\> c\! c4 \< c c \! \fff\> c c\! diff --git a/input/regression/dynamics-rest-positioning.ly b/input/regression/dynamics-rest-positioning.ly index 7082e4abcf..e64c5486fa 100644 --- a/input/regression/dynamics-rest-positioning.ly +++ b/input/regression/dynamics-rest-positioning.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Text dynamics are positioned correctly on rests, i.e., centered on the parent object." } -\relative c'' { - g2\p r\p +\relative { + g'2\p r\p g4\f s r4\f s } diff --git a/input/regression/dynamics-text-dynamics-context.ly b/input/regression/dynamics-text-dynamics-context.ly index 18b1d5ba4e..7b3980d653 100644 --- a/input/regression/dynamics-text-dynamics-context.ly +++ b/input/regression/dynamics-text-dynamics-context.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "The @code{X-offset} of @code{DynamicText} grobs in a @@ -12,8 +12,8 @@ \new PianoStaff << \new Staff = "up" { \clef treble - \relative c' { - c4\p c c\mp c | + \relative { + c'4\p c c\mp c | c4\mf c c\f c | << \repeat unfold 8 c4 diff --git a/input/regression/dynamics-text-spanner-postfix.ly b/input/regression/dynamics-text-spanner-postfix.ly index 214f8fcee9..cf367fb8c2 100644 --- a/input/regression/dynamics-text-spanner-postfix.ly +++ b/input/regression/dynamics-text-spanner-postfix.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "The \cresc, \dim and \decresc spanners are now postfix operators @@ -11,8 +11,8 @@ hairpins by default, \cresc etc. produce text spanners by default." crpoco = #(make-music 'CrescendoEvent 'span-direction START 'span-type 'text 'span-text "cresc. poco a poco") -\relative c' { - c4\cresc d4 e4 f4 | +\relative { + c'4\cresc d4 e4 f4 | g4 a4\! b4\crpoco c4 | c4 d4 e4 f4 | g4 a4\! b4\< c4 | diff --git a/input/regression/empty-chord.ly b/input/regression/empty-chord.ly index 22790b8fbc..202bc8d0cf 100644 --- a/input/regression/empty-chord.ly +++ b/input/regression/empty-chord.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Empty chords accept articulations, occupy no time, and leave the current duration unchanged." } -\relative c' { - r4 e8( g <>) ^"sul D" \f \> \repeat unfold 8 { c-. } <>\sfz +\relative { + r4 e'8( g <>) ^"sul D" \f \> \repeat unfold 8 { c-. } <>\sfz <>\downbow \repeat unfold 2 { c g } c1\> <>\enddecr } diff --git a/input/regression/event-listener-output.ly b/input/regression/event-listener-output.ly index aa3d171c6b..58eb5440d2 100644 --- a/input/regression/event-listener-output.ly +++ b/input/regression/event-listener-output.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.22" \header { texidoc = "Music events can be extracted from a score with event @@ -15,7 +15,7 @@ listeners." st = #(define-music-function - (parser location text) + (text) (string?) #{ \override TextSpanner.bound-details.left.text = $text @@ -31,7 +31,7 @@ vlnone = \new Staff { #CENTER \override TextSpanner.bound-details.right.text = \markup { \draw-line #'(0 . -1) } -\relative c' { +\relative { \key d \major \tempo 4 = 96 diff --git a/input/regression/ferneyhough-hairpins.ly b/input/regression/ferneyhough-hairpins.ly index 000d9da403..263d44fb10 100644 --- a/input/regression/ferneyhough-hairpins.ly +++ b/input/regression/ferneyhough-hairpins.ly @@ -1,24 +1,24 @@ -\version "2.17.14" +\version "2.19.21" \header { texidoc = "LilyPond creates hairpins found in Ferneyhough scores. " } -\relative c'' { - \override Hairpin #'stencil = #flared-hairpin - a4\< a a a\f +\relative { + \override Hairpin.stencil = #flared-hairpin + a'4\< a a a\f a4\p\< a a a\ff a4\sfz\< a a a\! - \override Hairpin #'stencil = #constante-hairpin + \override Hairpin.stencil = #constante-hairpin a4\< a a a\f a4\p\< a a a\ff a4\sfz\< a a a\! - \override Hairpin #'stencil = #flared-hairpin + \override Hairpin.stencil = #flared-hairpin a4\> a a a\f a4\p\> a a a\ff a4\sfz\> a a a\! - \override Hairpin #'stencil = #constante-hairpin + \override Hairpin.stencil = #constante-hairpin a4\> a a a\f a4\p\> a a a\ff a4\sfz\> a a a\! diff --git a/input/regression/figured-bass-alteration.ly b/input/regression/figured-bass-alteration.ly index 0520c1ad9a..26d32a8d86 100644 --- a/input/regression/figured-bass-alteration.ly +++ b/input/regression/figured-bass-alteration.ly @@ -3,16 +3,16 @@ texidoc = "Bass figures can carry alterations." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right= ##t } -\relative c'' { +\relative { \new Voice << - { c4 c c } + { c''4 c c } \figures { <3- > <3! > <3+ > diff --git a/input/regression/figured-bass-continuation-center.ly b/input/regression/figured-bass-continuation-center.ly index 01694b9054..bd04ea4c2c 100644 --- a/input/regression/figured-bass-continuation-center.ly +++ b/input/regression/figured-bass-continuation-center.ly @@ -6,14 +6,14 @@ true." } -\version "2.17.15" +\version "2.19.21" \paper { ragged-right = ##t } << - \relative c' \new Voice { - c8 c b b a a b b + \relative \new Voice { + c'8 c b b a a b b c c b b } diff --git a/input/regression/figured-bass-continuation-modifiers.ly b/input/regression/figured-bass-continuation-modifiers.ly index 5dc20fa35e..3a572a4f4f 100644 --- a/input/regression/figured-bass-continuation-modifiers.ly +++ b/input/regression/figured-bass-continuation-modifiers.ly @@ -5,11 +5,11 @@ } -\version "2.17.15" +\version "2.19.21" << - \relative c' \new Voice { - c8 c c c c c + \relative \new Voice { + c'8 c c c c c } \figures { \bassFigureExtendersOn diff --git a/input/regression/figured-bass-continuation.ly b/input/regression/figured-bass-continuation.ly index cb3cf4999a..941b57cbc2 100644 --- a/input/regression/figured-bass-continuation.ly +++ b/input/regression/figured-bass-continuation.ly @@ -5,14 +5,14 @@ figures. They are switched on with @code{useBassFigureExtenders}" } -\version "2.17.15" +\version "2.19.21" \paper { ragged-right = ##t } << - \relative c' \new Voice { - c8 c b b a a b b + \relative \new Voice { + c'8 c b b a a b b c^"the same with extenders" c b b a a b b } diff --git a/input/regression/figured-bass-implicit.ly b/input/regression/figured-bass-implicit.ly index b8128d2dd6..346d5efe70 100644 --- a/input/regression/figured-bass-implicit.ly +++ b/input/regression/figured-bass-implicit.ly @@ -6,15 +6,15 @@ } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } << - \relative c'' \new Voice { - c^"normal" c c c^"extenders" c c c_"implicit" c + \relative \new Voice { + c''^"normal" c c c^"extenders" c c c_"implicit" c } \figures { <3 6!> diff --git a/input/regression/figured-bass-slashed-numbers.ly b/input/regression/figured-bass-slashed-numbers.ly index 73dce5c744..a810f594f6 100644 --- a/input/regression/figured-bass-slashed-numbers.ly +++ b/input/regression/figured-bass-slashed-numbers.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" \header { texidoc = "Figured bass supports numbers with slashes through @@ -25,7 +25,7 @@ bassfigures = \figuremode { #(define (adjust-slash-stencil-default num forward stencil mag) stencil) -unsetExceptions = #(define-void-function (parser location) () +unsetExceptions = #(define-void-function () () ; (set! horizontal-slash-interval horizontal-slash-interval-default) ; (set! adjust-slash-stencil adjust-slash-stencil-default) ) diff --git a/input/regression/figured-bass-staff.ly b/input/regression/figured-bass-staff.ly index e7e4dd4597..0de15a44d5 100644 --- a/input/regression/figured-bass-staff.ly +++ b/input/regression/figured-bass-staff.ly @@ -3,7 +3,7 @@ ragged-right = ##t } -\version "2.16.0" +\version "2.19.21" \header { @@ -21,8 +21,8 @@ controlling figured bass should be set in @code{Staff} context. << \new Staff = someUniqueName - \relative c'' { - c4 c'8 r8 c,4 c' + \relative { + c''4 c'8 r8 c,4 c' } %% send to existing Staff. diff --git a/input/regression/finger-chords-dot.ly b/input/regression/finger-chords-dot.ly index 8b62bc0a3f..06cbfa0e75 100644 --- a/input/regression/finger-chords-dot.ly +++ b/input/regression/finger-chords-dot.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Scripts right of a chord avoid dots." } -\relative c' { +\relative { \set fingeringOrientations = #'(right) - 4.. 4. r8. + 4.. 4. r8. } diff --git a/input/regression/finger-chords-order.ly b/input/regression/finger-chords-order.ly index 13ba41b7b6..81041f9728 100644 --- a/input/regression/finger-chords-order.ly +++ b/input/regression/finger-chords-order.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -9,12 +9,12 @@ is independent of up/@/down direction." \paper { ragged-right = ##t } -\relative c' { +\relative { %% input order is not 1 2 3 , output is. - 4 + 4 - \relative c'' { - + \relative { + } } diff --git a/input/regression/fingering-column-snap-radius.ly b/input/regression/fingering-column-snap-radius.ly index 50faefcdab..cd78ef7d8c 100644 --- a/input/regression/fingering-column-snap-radius.ly +++ b/input/regression/fingering-column-snap-radius.ly @@ -1,4 +1,4 @@ -\version "2.17.16" +\version "2.19.21" \header { texidoc = "Horizontally-offset @code{Fingerings} align along the Y axis when @@ -6,8 +6,8 @@ they are within @code{FingeringColumn.snap-radius} of each other. " } -\relative f'' { +\relative { \set fingeringOrientations = #'(left) - 4 + 4 4 } diff --git a/input/regression/fingering-column.ly b/input/regression/fingering-column.ly index d4d2551b2e..673bace619 100644 --- a/input/regression/fingering-column.ly +++ b/input/regression/fingering-column.ly @@ -1,4 +1,4 @@ -\version "2.17.10" +\version "2.19.21" \header { texidoc = "Horizontal @code{Fingering} grobs that collide do not intersect. @@ -7,11 +7,11 @@ by the @code{FingeringColumn} grob. " } -\relative c'' { +\relative { \set fingeringOrientations = #'(left) \override Fingering.staff-padding = #'() \override Fingering.add-stem-support = ##f - 4 + 4 } diff --git a/input/regression/fingering-directions.ly b/input/regression/fingering-directions.ly index ba8d1525e5..ab6e02a81e 100644 --- a/input/regression/fingering-directions.ly +++ b/input/regression/fingering-directions.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Fingering directions in directed and undirected contexts." @@ -7,11 +7,11 @@ \layout { ragged-right= ##t } { - \relative c'' + \relative \new Voice { \tempo "\\voiceTwo" \voiceTwo - c2^5 + c''2^5 c_5 c-5 \tempo "\\oneVoice" diff --git a/input/regression/fingering.ly b/input/regression/fingering.ly index 3e3381326d..bd958282cb 100644 --- a/input/regression/fingering.ly +++ b/input/regression/fingering.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Automatic fingering tries to put fingering instructions @@ -8,8 +8,8 @@ next to noteheads. \layout { ragged-right= ##t } -\relative c' { - c4-4 +\relative { + c'4-4 < c-1 e-2 g-3 b-4 > } diff --git a/input/regression/flags-straight-stockhausen-boulez.ly b/input/regression/flags-straight-stockhausen-boulez.ly index 7bda48a5e0..6440bb081e 100644 --- a/input/regression/flags-straight-stockhausen-boulez.ly +++ b/input/regression/flags-straight-stockhausen-boulez.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.22" \header { texidoc = "Flags can be drawn straight in the style used by @@ -7,7 +7,7 @@ Stockhausen and Boulez. } -stemLength = #(define-music-function (parser location length) (number?) +stemLength = #(define-music-function (length) (number?) "Set the length of the next stem explicitly." #{ \once \override Stem.length-fraction = #length @@ -27,8 +27,7 @@ stemLength = #(define-music-function (parser location length) (number?) gis''8 \stemNeutral } \stemLength #1.43 d'8 r16 - \stemLength #0.95 - \acciaccatura c''8 + \acciaccatura { \stemLength #0.95 c''8 } \stemLength #1.25 b'32 r \bar"|.|" diff --git a/input/regression/flip-stencil.ly b/input/regression/flip-stencil.ly new file mode 100644 index 0000000000..3c9b4d24aa --- /dev/null +++ b/input/regression/flip-stencil.ly @@ -0,0 +1,32 @@ +\version "2.19.19" + +\header { + texidoc = "Stencils can be flipped horizontally or vertically within +their bounding box using @code{flip-stencil}." +} + +square = +#(make-path-stencil + '(moveto 0 0 lineto 0 2 lineto 2 2 lineto 2 0 closepath) + 0.1 1 1 #f) + +triangle = +#(stencil-with-color + (make-path-stencil + '(moveto 0 0 lineto 2 2 lineto 2 0 closepath) + 0.3 1 1 #f) + blue) + +{ + g'1^\markup \stencil + #(ly:stencil-add square triangle) + _\markup \teeny "baseline" + + g'1^\markup \stencil + #(ly:stencil-add square (flip-stencil X triangle)) + _\markup \teeny "flip X" + + g'1^\markup \stencil + #(ly:stencil-add square (flip-stencil Y triangle)) + _\markup \teeny "flip Y" +} diff --git a/input/regression/follow-voice-consecutive.ly b/input/regression/follow-voice-consecutive.ly index 308391312a..a5aafbaa8e 100644 --- a/input/regression/follow-voice-consecutive.ly +++ b/input/regression/follow-voice-consecutive.ly @@ -1,13 +1,13 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc= "The voice follower is not confused when set for consecutive sets of staff switches." } -\new PianoStaff \relative c' << +\new PianoStaff \relative << \new Staff = "one" { - c4 + c'4 \showStaffSwitch \change Staff = two a4 diff --git a/input/regression/font-family-override.ly b/input/regression/font-family-override.ly index 228bcaa072..b738142a35 100644 --- a/input/regression/font-family-override.ly +++ b/input/regression/font-family-override.ly @@ -5,7 +5,7 @@ } -\version "2.17.6" +\version "2.19.21" \paper { % change for other default global staff size. @@ -25,7 +25,7 @@ #(define fonts (make-pango-font-tree "Times New Roman" - "Nimbus Sans" + "Nimbus Sans,Nimbus Sans L" "Luxi Mono" ;; "Helvetica" @@ -35,9 +35,9 @@ } \score { - \relative c'' { + \relative { - c^\markup { roman: foo \bold bla \italic bar \italic \bold baz } + c''^\markup { roman: foo \bold bla \italic bar \italic \bold baz } c'_\markup { \override #'(font-family . sans) { diff --git a/input/regression/font-name.ly b/input/regression/font-name.ly index d0e9a472c5..f2a05774a6 100644 --- a/input/regression/font-name.ly +++ b/input/regression/font-name.ly @@ -14,14 +14,19 @@ without size specification." { \override Score.PaperColumn.keep-inside-line = ##f - \override Staff.TimeSignature.font-name = #"Times New Roman" + + % A comma is required + % for font name "Times New Roman"'s explicit termination. + % If there is no comma, Pango interpret "Times New Roman" as + % "Times New" family with "Roman" style. + \override Staff.TimeSignature.font-name = #"Times New Roman," \time 3/4 \set Score.skipBars = ##t - \override Staff.MultiMeasureRestText.font-name = #"LuxiMono" - R1*21^"Rest in LuxiMono" + \override Staff.MultiMeasureRestText.font-name = #"Luxi Mono" + R1*21^"Rest in Luxi Mono" c'1_\markup { - \override #'(font-name . "Vera Bold") + \override #'(font-name . "Bitstream Vera Sans, Bold") \override #'(font-size . 4) { This text is in large Vera Bold } } diff --git a/input/regression/font-postscript.ly b/input/regression/font-postscript.ly index 54f4607628..bac5349608 100644 --- a/input/regression/font-postscript.ly +++ b/input/regression/font-postscript.ly @@ -1,7 +1,7 @@ \header { texidoc = "This file demonstrates how to load different (postscript) fonts. The file @file{font.scm} shows how to define the scheme-function -@code{make-century-schoolbook-tree}." +@code{make-default-fonts-tree}." } \version "2.16.0" @@ -12,7 +12,7 @@ fonts. The file @file{font.scm} shows how to define the scheme-function (baseline-skip . 2) (word-space . 0.6))) - #(set! fonts (make-century-schoolbook-tree 1.0)) + #(set! fonts (make-default-fonts-tree 1.0)) } \layout { diff --git a/input/regression/footnote-auto-numbering-page-reset.ly b/input/regression/footnote-auto-numbering-page-reset.ly index 58799d03dc..369db807f7 100644 --- a/input/regression/footnote-auto-numbering-page-reset.ly +++ b/input/regression/footnote-auto-numbering-page-reset.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "This is an example of automatic footnote numbering where the number is reset on each page. It uses the symbol-footnotes @@ -31,10 +31,10 @@ a b c d } \markup { k \auto-footnote l m } -\relative c' { a1 } +\relative { a1 } -\relative c' { - d4 e +\relative { + d'4 e < f \footnote #'(1 . -1) \markup { n } a c > a8-\footnote #'(1 . 1) \markup { p } \< -\footnote #'(1 . 1) \markup { o } [ b c d ] a4 b c | diff --git a/input/regression/footnote-auto-numbering-vertical-order.ly b/input/regression/footnote-auto-numbering-vertical-order.ly index 61c156b3ff..a7c86686ea 100644 --- a/input/regression/footnote-auto-numbering-vertical-order.ly +++ b/input/regression/footnote-auto-numbering-vertical-order.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "This regtest makes sure that footnote numbers are laid out in the correct vertical order. @@ -28,8 +28,8 @@ in the correct vertical order. \book { \score { << - \new Staff \relative c' { - d4 e + \new Staff \relative { + d'4 e \once \override FootnoteItem.numbering-assertion-function = #(lambda (grob) (make-footnote-numbering-assertion-function 0)) < f \footnote #'(1 . -1) \markup { n } a c > @@ -57,8 +57,8 @@ in the correct vertical order. -\single\footnote #'(1 . 1) \markup { o } Beam [ b c d ] a4 b c | d a b c\! |\break } - \new Staff \relative c' { - d4 e + \new Staff \relative { + d'4 e \once \override FootnoteItem.numbering-assertion-function = #(lambda (grob) (make-footnote-numbering-assertion-function 1)) < f \footnote #'(1 . -1) \markup { n } a c > diff --git a/input/regression/footnote-auto-numbering.ly b/input/regression/footnote-auto-numbering.ly index 9520780fce..6de6c843e1 100644 --- a/input/regression/footnote-auto-numbering.ly +++ b/input/regression/footnote-auto-numbering.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "This is an example of automatic footnote numbering where the number is not reset on each page. It uses the default @@ -48,10 +48,10 @@ footnotes. \markup { k \auto-footnote l m } -\relative c' { a1 } +\relative { a1 } -\relative c' { - d4 e +\relative { + d'4 e \once \override FootnoteItem.numbering-assertion-function = #(lambda (grob) (make-footnote-numbering-assertion-function 5)) < f \footnote #'(1 . -1) \markup { n } a c > diff --git a/input/regression/footnote-break-visibility.ly b/input/regression/footnote-break-visibility.ly index 4e0821ab63..5d688dcbc6 100644 --- a/input/regression/footnote-break-visibility.ly +++ b/input/regression/footnote-break-visibility.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "With grobs that have break visibility, footnotes will automatically take the break visibility of the grob being footnoted. @@ -12,8 +12,8 @@ This behavior can be overridden. \new Staff { - \relative c' { - c1 + \relative { + c'1 \footnote "foo" #'(0 . 2) "bar" Staff.TimeSignature \time 3/4 \break \pageBreak diff --git a/input/regression/footnote-spanner.ly b/input/regression/footnote-spanner.ly index 9798709ef9..78fa5f316b 100644 --- a/input/regression/footnote-spanner.ly +++ b/input/regression/footnote-spanner.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Footnotes are annotated at the correct place, and the annotation goes to the correct page." @@ -12,8 +12,8 @@ annotation goes to the correct page." \book { -\relative c'' { -b4-\single\footnote +\relative { +b'4-\single\footnote \markup { \tiny "1." } #'(0.5 . 0.5) \markup { 1. \justify { Goes to the first broken spanner. } } Hairpin diff --git a/input/regression/footnote.ly b/input/regression/footnote.ly index e33602dfc4..265510a03f 100644 --- a/input/regression/footnote.ly +++ b/input/regression/footnote.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Lilypond does footnotes." } @@ -22,10 +22,10 @@ a b c d } \markup { k \footnote \concat { l \super 5 } \line { 5. m } } -\relative c' { a1 } +\relative { a1 } -\relative c' { - d4 e +\relative { + d'4 e < f \footnote \markup { \tiny 6 } #'(1 . -1) \markup { 6. n } a c > a8-\footnote \markup { \tiny 8 } #'(1 . 1) \markup { 8. p } \< -\footnote \markup { \tiny 7 } #'(1 . 1) \markup { 7. o } diff --git a/input/regression/fret-boards.ly b/input/regression/fret-boards.ly index a580ab4c9a..f28d5a48e8 100644 --- a/input/regression/fret-boards.ly +++ b/input/regression/fret-boards.ly @@ -6,9 +6,9 @@ best when one string number is indicated in advance " } -\version "2.16.0" +\version "2.19.21" -foo = \relative c { +foo = \relative { _\markup { \fret-diagram-terse #"x;5;4;2;3;2;" } diff --git a/input/regression/fret-diagrams-dots.ly b/input/regression/fret-diagrams-dots.ly index 1189c0b82c..e765d8e5ce 100644 --- a/input/regression/fret-diagrams-dots.ly +++ b/input/regression/fret-diagrams-dots.ly @@ -1,9 +1,14 @@ -\version "2.17.6" +\version "2.19.8" \header { texidoc=" Dots indicating fingerings can be changed in location, size, and coloring. +It is possible to parenthesize a single dot. The color +of the paranthesis may be taken from dot or default. +A possible collision between parathesis and fret-label- +indication can be resolved by an override for +@code{fret-label-horizontal-offset} in @code{fret-diagram-details}. " } @@ -12,6 +17,8 @@ size, and coloring. << \chords { + c1 | + c1 | c1 | c1 | c1 | @@ -65,7 +72,34 @@ size, and coloring. (place-fret 1 3 1) (barre 5 1 3))} - } ->> + %% C major for guitar, verbose style + \once \override TextScript.size = #1.4 + c'1 ^\markup { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1 blue) + (place-fret 4 5 2 red parenthesized) + (place-fret 3 5 3) + (place-fret 2 5 4 red) + (place-fret 1 3 1 blue parenthesized) + (barre 5 1 3))} + %% C major for guitar, verbose style + %% larger size and dot-radius + %% different dot-colors + %% parenthesizing single dots, with different paren-color + %% horizontal moving fret-label-indication + \once \override TextScript.size = #1.5 + \once \override TextScript.fret-diagram-details.dot-radius = #0.4 + \once \override TextScript.fret-diagram-details.fret-label-horizontal-offset = #0.2 + c'1 ^\markup { + \fret-diagram-verbose + #'((mute 6) + (place-fret 5 3 1 blue) + (place-fret 4 5 2 red parenthesized default-paren-color) + (place-fret 3 5 3) + (place-fret 2 5 4 red) + (place-fret 1 3 1 blue parenthesized) + (barre 5 1 3))} + } +>> diff --git a/input/regression/fret-diagrams-fingering.ly b/input/regression/fret-diagrams-fingering.ly index 786d34110c..81575a50c8 100644 --- a/input/regression/fret-diagrams-fingering.ly +++ b/input/regression/fret-diagrams-fingering.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.8" \header { texidoc=" @@ -19,6 +19,7 @@ and fingering label font size can be adjusted. c1 | c1 | c1 | + c1 | c1 } @@ -78,7 +79,8 @@ and fingering label font size can be adjusted. (place-fret 2 5 4) (place-fret 1 3 1) (barre 5 1 3))} - %% dot color inversion, white on black + %% C major for guitar, verbose style + %% dot color inversion, white on black \once \override TextScript.fret-diagram-details.dot-color = #'black c' ^\markup { \fret-diagram-verbose #'((mute 6) @@ -88,7 +90,8 @@ and fingering label font size can be adjusted. (place-fret 2 5 4) (place-fret 1 3 1) (barre 5 1 3))} - %% dot color inversion, black on white + %% C major for guitar, verbose style + %% dot color inversion, black on white \once \override TextScript.fret-diagram-details.dot-color = #'white c' ^\markup { \fret-diagram-verbose #'((mute 6) @@ -98,7 +101,17 @@ and fingering label font size can be adjusted. (place-fret 2 5 4) (place-fret 1 3 1) (barre 5 1 3))} + %% C major for guitar, verbose style + %% dot color inversion, global setting and per-dot + \once \override TextScript.fret-diagram-details.dot-color = #'grey + \once \override TextScript.size = #1.4 + c' ^\markup { + \fret-diagram-verbose #'((mute 6) + (place-fret 5 3 1 inverted) + (place-fret 4 5 2 red) + (place-fret 3 5 3 inverted) + (place-fret 2 5 4 red inverted) + (place-fret 1 3 1) + (barre 5 1 3))} } >> - - diff --git a/input/regression/fret-diagrams-fret-label.ly b/input/regression/fret-diagrams-fret-label.ly index 6ae0e392b1..495562dc28 100644 --- a/input/regression/fret-diagrams-fret-label.ly +++ b/input/regression/fret-diagrams-fret-label.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.8" \header { texidoc=" @@ -32,8 +32,8 @@ size, and number type. (barre 5 1 3))} %% C major for guitar, verbose style - \override TextScript.fret-diagram-details.label-dir = #LEFT - \override TextScript.fret-diagram-details.number-type = #'roman-upper + \override TextScript.fret-diagram-details.label-dir = #LEFT + \override TextScript.fret-diagram-details.number-type = #'roman-upper c' ^\markup { \fret-diagram-verbose #'((mute 6) (place-fret 5 3 1) @@ -45,8 +45,8 @@ size, and number type. %% C major for guitar, verbose style \revert TextScript.fret-diagram-details.label-dir - \override TextScript.fret-diagram-details.fret-label-font-mag = #0.4 - \override TextScript.fret-diagram-details.number-type = #'arabic + \override TextScript.fret-diagram-details.fret-label-font-mag = #0.4 + \override TextScript.fret-diagram-details.number-type = #'arabic \once \override TextScript.fret-diagram-details.fret-label-vertical-offset = #0.25 c' ^\markup { \fret-diagram-verbose #'((mute 6) @@ -60,6 +60,7 @@ size, and number type. %% C major for guitar, verbose style \revert TextScript.fret-diagram-details.label-dir \once \override TextScript.fret-diagram-details.number-type = #'custom + \once \override TextScript.fret-diagram-details.fret-label-horizontal-offset = #0.5 \once \override TextScript.fret-diagram-details.fret-label-custom-format = #"~d°" c' ^\markup { \fret-diagram-verbose #'((mute 6) @@ -72,5 +73,3 @@ size, and number type. } >> - - diff --git a/input/regression/fretdiagram-markup-in-dots.ly b/input/regression/fretdiagram-markup-in-dots.ly new file mode 100644 index 0000000000..c93470e07d --- /dev/null +++ b/input/regression/fretdiagram-markup-in-dots.ly @@ -0,0 +1,31 @@ + +\version "2.19.25" + +\header { + texidoc="Markups can be put into the dots of a fret-diagram. Those markups +are scaled automatically to fit into the dots. +" +} + +myFretDiagram = +\markup + \fret-diagram-verbose #`( + (place-fret 6 1 + ,(markup + #:concat ( + #:vcenter "e" + #:fontsize -5 + #:musicglyph "accidentals.sharp"))) + (place-fret 5 2 "aisis") + (place-fret 4 3 3) + (place-fret 3 1 "g#") + (place-fret 2 2 2) + (place-fret 1 3 ,#{ \markup \score { { \clef "G_8" g'1 } } #})) + + +\markup + \override #'(fret-diagram-details . ((finger-code . in-dot))) { + \myFretDiagram + \override #'(size . 5) \myFretDiagram + \override #'(size . 10) \myFretDiagram +} diff --git a/input/regression/full-measure-rest-fermata.ly b/input/regression/full-measure-rest-fermata.ly index 70804c3dba..9df72fdfd7 100644 --- a/input/regression/full-measure-rest-fermata.ly +++ b/input/regression/full-measure-rest-fermata.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc=" @@ -8,9 +8,9 @@ be closer to the staff than other articulations." \layout { ragged-right = ##t } -\relative c'' { +\relative { R1 - a1^"should be lower" + a'1^"should be lower" R1^"should be higher" \break R1 diff --git a/input/regression/general-scheme-bindings.ly b/input/regression/general-scheme-bindings.ly index bf00be2fc4..b810d9b2e7 100644 --- a/input/regression/general-scheme-bindings.ly +++ b/input/regression/general-scheme-bindings.ly @@ -5,7 +5,7 @@ } -\version "2.17.11" +\version "2.19.22" %% todo : use macro, to show the statement tested. #(ly:progress "~a\n" (ly:expand-environment "${HOME} $HOME $$ ")) @@ -15,7 +15,7 @@ %% #(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:parser-parse-string (ly:parser-clone) "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/generic-output-property.ly b/input/regression/generic-output-property.ly index 0b3fca4b20..809cc7718d 100644 --- a/input/regression/generic-output-property.ly +++ b/input/regression/generic-output-property.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.24" \header{ texidoc=" @@ -12,12 +12,12 @@ setting the @code{extra-offset} of a grob. \relative c''{ - \applyOutput #'Bottom #(outputproperty-compatibility + \applyOutput Bottom #(outputproperty-compatibility (make-type-checker 'note-head-interface) 'extra-offset '(2 . 3)) c2 c - \applyOutput #'Score #(outputproperty-compatibility (make-type-checker 'mark-interface) 'extra-offset '(-1 . 4)) + \applyOutput Score #(outputproperty-compatibility (make-type-checker 'mark-interface) 'extra-offset '(-1 . 4)) \mark A d1 \mark \default diff --git a/input/regression/glissando-accidental.ly b/input/regression/glissando-accidental.ly index d3c023d3c1..646972d0e0 100644 --- a/input/regression/glissando-accidental.ly +++ b/input/regression/glissando-accidental.ly @@ -2,8 +2,8 @@ texidoc = "Glissandi stop before hitting accidentals." } -\version "2.16.0" +\version "2.19.21" -\relative c'' { - a1\glissando cis +\relative { + a'1\glissando cis } diff --git a/input/regression/glissando-broken-multiple.ly b/input/regression/glissando-broken-multiple.ly index ce150f885d..bc1a716283 100644 --- a/input/regression/glissando-broken-multiple.ly +++ b/input/regression/glissando-broken-multiple.ly @@ -2,15 +2,15 @@ texidoc = "When broken, glissandi can span multiple lines." } -\version "2.17.6" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c'' { +\relative { \override Glissando.breakable = ##t \override Glissando.after-line-breaking = ##t - d1\glissando + d''1\glissando \break s1 \break s1 \break s1 diff --git a/input/regression/glissando-broken-unkilled.ly b/input/regression/glissando-broken-unkilled.ly index 29659bac61..41fd3f1f03 100644 --- a/input/regression/glissando-broken-unkilled.ly +++ b/input/regression/glissando-broken-unkilled.ly @@ -1,14 +1,14 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Broken glissandi anticipate the pitch on the next line." } \score { - \relative c' { + \relative { \override Glissando.after-line-breaking = ##t \override Glissando.breakable = ##t - c1\glissando + c'1\glissando \break c'1 \break @@ -22,10 +22,10 @@ } \score { - \relative c' { + \relative { \override Glissando.after-line-breaking = ##t \override Glissando.breakable = ##t - c1\glissando + c'1\glissando \break c'1 \break diff --git a/input/regression/glissando-broken.ly b/input/regression/glissando-broken.ly index baf5993d99..80297f8a41 100644 --- a/input/regression/glissando-broken.ly +++ b/input/regression/glissando-broken.ly @@ -2,13 +2,13 @@ texidoc = "If broken, Glissandi anticipate on the pitch of the next line." } -\version "2.17.6" +\version "2.19.21" \paper { ragged-right = ##T } -\relative c'' { +\relative { \override Glissando.breakable = ##t - d1 \glissando | + d''1 \glissando | \break c,1 } diff --git a/input/regression/glissando-chord.ly b/input/regression/glissando-chord.ly index 971074b133..444b060d7c 100644 --- a/input/regression/glissando-chord.ly +++ b/input/regression/glissando-chord.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "LilyPond typesets glissandi between chords." } -\relative c' { - c1 \glissando g' +\relative { + c'1 \glissando g' c,1 \glissando s1 g' 1 \glissando 1 \glissando s1 diff --git a/input/regression/glissando-consecutive.ly b/input/regression/glissando-consecutive.ly index e99f56f084..012103c4af 100644 --- a/input/regression/glissando-consecutive.ly +++ b/input/regression/glissando-consecutive.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" %% This should really be 2.15.0, because the glissando code %% hasn't been backported -- this is a git-only test at this point @@ -8,6 +8,6 @@ } -\relative c' { - c1 \glissando d1 \glissando e1 +\relative { + c'1 \glissando d1 \glissando e1 } diff --git a/input/regression/glissando-dots.ly b/input/regression/glissando-dots.ly new file mode 100644 index 0000000000..b0a279029d --- /dev/null +++ b/input/regression/glissando-dots.ly @@ -0,0 +1,24 @@ +\version "2.19.21" + +\header { + texidoc = "Glissandi begin after dots by default. This behavior may +be changed by overriding the @code{start-at-dot} property. +" +} + +\layout { + indent = 0 + ragged-right = ##t +} + +\relative { + c''2.\glissando b4 + c2..\glissando b8 + c2...\glissando b16 + \bar "||" + 2. -\tweak style #'trill \glissando 4 + \bar "||" + c2...\glissando g''16 + \override Glissando.bound-details.left.start-at-dot = ##f + c,,2...\glissando g''16 +} diff --git a/input/regression/glissando-index.ly b/input/regression/glissando-index.ly index 5611773909..4040202c27 100644 --- a/input/regression/glissando-index.ly +++ b/input/regression/glissando-index.ly @@ -1,12 +1,12 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Individual glissandi within a chord can be tweaked." } -\relative c' { +\relative { \once \override Voice.Glissando.style = #(lambda (grob) (if (= 1 (ly:grob-property grob 'glissando-index)) 'zigzag 'default)) - 1 \glissando s1 + 1 \glissando s1 } diff --git a/input/regression/glissando-no-break.ly b/input/regression/glissando-no-break.ly index 5c611c27c8..713bc0514f 100644 --- a/input/regression/glissando-no-break.ly +++ b/input/regression/glissando-no-break.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "forced break was overridden by some other event, should you be using bar checks?")) @@ -12,8 +12,8 @@ Use @code{breakable} grob property to override." \layout { ragged-right = ##t } -\relative c' { - c1 +\relative { + c'1 c1\glissando \break d'1 diff --git a/input/regression/glissando-skip.ly b/input/regression/glissando-skip.ly index 94dd576dcc..543b26d308 100644 --- a/input/regression/glissando-skip.ly +++ b/input/regression/glissando-skip.ly @@ -1,11 +1,11 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "@code{NoteColumn} grobs can be skipped over by glissandi. " } -\relative c' { +\relative { a2 \glissando \once \override NoteColumn.glissando-skip = ##t f''4 d, diff --git a/input/regression/grace-bar-line.ly b/input/regression/grace-bar-line.ly index badaa1ae74..e5017a98da 100644 --- a/input/regression/grace-bar-line.ly +++ b/input/regression/grace-bar-line.ly @@ -1,5 +1,5 @@ -\version "2.17.28" +\version "2.19.21" \header { texidoc = "Bar line should come before the grace note." } @@ -10,8 +10,8 @@ -\relative c' \context Staff { - f1 \grace { a'16 f } g1 } +\relative \context Staff { + f'1 \grace { a'16 f } g1 } diff --git a/input/regression/grace-bar-number.ly b/input/regression/grace-bar-number.ly index 1f54387c68..c59a5d56e7 100644 --- a/input/regression/grace-bar-number.ly +++ b/input/regression/grace-bar-number.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Grace notes do tricky things with timing. If a measure @@ -12,7 +12,7 @@ printed correctly. \layout { ragged-right = ##t } -\relative c'' { c1 \break +\relative { c''1 \break \grace c8 c1 } diff --git a/input/regression/grace-beam.ly b/input/regression/grace-beam.ly index 8566a522ea..a098b5e296 100644 --- a/input/regression/grace-beam.ly +++ b/input/regression/grace-beam.ly @@ -9,9 +9,9 @@ Unbeamed grace notes are not put into normal beams. \layout { ragged-right= ##t } -\version "2.17.28" -\relative c'' { - c4 d8[ +\version "2.19.21" +\relative { + c''4 d8[ \grace { e32 d c d } e8] e[ e \grace { f16 } e8 e] diff --git a/input/regression/grace-direction-polyphony.ly b/input/regression/grace-direction-polyphony.ly index 49788a6062..3725d2a2f6 100644 --- a/input/regression/grace-direction-polyphony.ly +++ b/input/regression/grace-direction-polyphony.ly @@ -4,10 +4,10 @@ finishing the grace section." } -\version "2.16.0" +\version "2.19.21" -\relative c''' { +\relative { \voiceOne - c4 + c'''4 \grace d8 c4 } diff --git a/input/regression/grace-end.ly b/input/regression/grace-end.ly index bacb821e1f..1c9a145376 100644 --- a/input/regression/grace-end.ly +++ b/input/regression/grace-end.ly @@ -1,4 +1,4 @@ -\version "2.17.28" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) @@ -7,6 +7,6 @@ Grace notes after the last note do not confuse the timing code." } -\context Voice \relative c' { - c4 \grace { d16 d16 } +\context Voice \relative { + c'4 \grace { d16 d16 } } diff --git a/input/regression/grace-nest3.ly b/input/regression/grace-nest3.ly index 0425408c48..76557fbf7a 100644 --- a/input/regression/grace-nest3.ly +++ b/input/regression/grace-nest3.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "In nested syntax, graces are still properly handled." } \layout { ragged-right= ##t } -\relative c'' { - f1 +\relative { + f''1 \grace e8 f1 << { \grace { e8 } f1 } >> } diff --git a/input/regression/grace-nest5.ly b/input/regression/grace-nest5.ly index 2e4e221296..36fcb263a4 100644 --- a/input/regression/grace-nest5.ly +++ b/input/regression/grace-nest5.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Graces notes may have the same duration as the main note." } \layout { ragged-right = ##t } -\relative c'' { - s2 4 +\relative { + s2 4 \grace g e4 } diff --git a/input/regression/grace-part-combine.ly b/input/regression/grace-part-combine.ly index 2862435d05..6310560371 100644 --- a/input/regression/grace-part-combine.ly +++ b/input/regression/grace-part-combine.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Grace notes may be put in a @code{partcombine}r." } @@ -9,11 +9,11 @@ \new Staff \partcombine -\relative c'' { - c4 d e f \grace f16 g1 +\relative { + c''4 d e f \grace f16 g1 } -\relative c' { - c4 d e2 g1 +\relative { + c'4 d e2 g1 } diff --git a/input/regression/grace-slashed-no-slur.ly b/input/regression/grace-slashed-no-slur.ly index f167a9794e..450ed819bd 100644 --- a/input/regression/grace-slashed-no-slur.ly +++ b/input/regression/grace-slashed-no-slur.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.2" \header { @@ -7,5 +7,5 @@ " } \relative c' { - \slashedGrace c16~ c1 + \slashedGrace c16~ 1 } diff --git a/input/regression/grace-stem-length.ly b/input/regression/grace-stem-length.ly index 6bae7e187c..45bb6963bf 100644 --- a/input/regression/grace-stem-length.ly +++ b/input/regression/grace-stem-length.ly @@ -3,15 +3,15 @@ normal notes, if possible. They should never be longer, even if that would lead to beam quanting problems." } -\version "2.17.28" +\version "2.19.21" \layout { ragged-right = ##t % "debug-beam-quanting" = ##t } -\relative c'' { - << { d8.\noBeam d16 } \\ >> \grace { d16 } c8.[ b16] +\relative { + << { d''8.\noBeam d16 } \\ >> \grace { d16 } c8.[ b16] << { c16[ b] } \\ >> \grace { c16 b } d4 diff --git a/input/regression/grace-sync.ly b/input/regression/grace-sync.ly index cd24450032..46436737e1 100644 --- a/input/regression/grace-sync.ly +++ b/input/regression/grace-sync.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Grace notes in different voices/@/staves are synchronized." } @@ -6,9 +6,9 @@ \layout { ragged-right = ##t} -\relative c'' << +\relative << \context Staff { - c2 + c''2 \grace c8 c4 c4 } diff --git a/input/regression/grace-types.ly b/input/regression/grace-types.ly index f645001872..33d7a30264 100644 --- a/input/regression/grace-types.ly +++ b/input/regression/grace-types.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "There are three different kinds of grace types: the base grace switches to smaller type, the appoggiatura inserts also a slur, and the @@ -9,8 +9,8 @@ acciaccatura inserts a slur and slashes the stem." ragged-right = ##t } -\relative c'' { - c4 \grace { d8 } c4 +\relative { + c''4 \grace { d8 } c4 \appoggiatura { d8 } c \acciaccatura { d } c } diff --git a/input/regression/grace-volta-repeat-2.ly b/input/regression/grace-volta-repeat-2.ly index 1a150fcc8a..b139991588 100644 --- a/input/regression/grace-volta-repeat-2.ly +++ b/input/regression/grace-volta-repeat-2.ly @@ -1,4 +1,4 @@ -\version "2.17.5" +\version "2.19.21" \header { @@ -9,9 +9,9 @@ \layout { ragged-right= ##t } -\relative c' { +\relative { \repeat volta 2 { - c1 + c'1 } \repeat volta 2 { \grace {c8 } c4 diff --git a/input/regression/hairpin-barline-break.ly b/input/regression/hairpin-barline-break.ly index 3dffd61e59..43e225cd2b 100644 --- a/input/regression/hairpin-barline-break.ly +++ b/input/regression/hairpin-barline-break.ly @@ -5,14 +5,14 @@ do not print that ending. But on the previous line, this hairpin should not be left open, and should end at the bar line. " } -\version "2.17.6" +\version "2.19.21" \layout { line-width = 4.\cm } -\relative c' { - c1\> +\relative { + c'1\> \break c1\! \override Hairpin.to-barline = ##f diff --git a/input/regression/hairpin-circled.ly b/input/regression/hairpin-circled.ly index 2da785101c..bee36fb2d7 100644 --- a/input/regression/hairpin-circled.ly +++ b/input/regression/hairpin-circled.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { @@ -9,9 +9,9 @@ followed by a crescendo al niente should only print one circle." \layout { ragged-right = ##t } -\relative c'' { +\relative { \override Hairpin.circled-tip = ##t - c1\< d\! d\> c\! + c''1\< d\! d\> c\! \override Hairpin.to-barline = ##f e\> c\< d\! \break c\< \break diff --git a/input/regression/hairpin-clef.ly b/input/regression/hairpin-clef.ly index 43acfdf0fb..a480dc4ba7 100644 --- a/input/regression/hairpin-clef.ly +++ b/input/regression/hairpin-clef.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Broken hairpins are not printed too high after treble clefs. " } -\relative c'' { - c4^\< c c c \break c c c c\! | +\relative { + c''4^\< c c c \break c c c c\! | } diff --git a/input/regression/hairpin-dashed.ly b/input/regression/hairpin-dashed.ly index 8e860fa22a..4754d34c6b 100644 --- a/input/regression/hairpin-dashed.ly +++ b/input/regression/hairpin-dashed.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc ="Hairpin crescendi may be dashed. " @@ -6,7 +6,7 @@ } -\relative c' { +\relative { \override Hairpin.style = #'dashed-line - f2\< g c1 d4\> b a gis\! } + f'2\< g c1 d4\> b a gis\! } diff --git a/input/regression/hairpin-ending.ly b/input/regression/hairpin-ending.ly index 3c70b07330..c428efb628 100644 --- a/input/regression/hairpin-ending.ly +++ b/input/regression/hairpin-ending.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { @@ -11,9 +11,9 @@ into them." \layout { ragged-right = ##t } -\relative c'' { +\relative { \override Score.PaperColumn.keep-inside-line = ##f - c4 \> c4 c4\! c4_\ff \> c4 c4\!\p + c''4 \> c4 c4\! c4_\ff \> c4 c4\!\p << { c\< c\! } diff --git a/input/regression/hairpin-key-signature.ly b/input/regression/hairpin-key-signature.ly index 0811099115..32ddc15f8e 100644 --- a/input/regression/hairpin-key-signature.ly +++ b/input/regression/hairpin-key-signature.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Broken hairpins are not printed too high after key signatures. " } -\relative c'' { +\relative { \key e \major - c4^\< c c c \break c c c c\! | + c''4^\< c c c \break c c c c\! | } diff --git a/input/regression/hairpin-neighboring-span-dynamics.ly b/input/regression/hairpin-neighboring-span-dynamics.ly index 9527267ff7..05557af9e0 100644 --- a/input/regression/hairpin-neighboring-span-dynamics.ly +++ b/input/regression/hairpin-neighboring-span-dynamics.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Bound padding for hairpins also applies before following @@ -7,9 +7,9 @@ is not scaled down. " } -\relative c' { +\relative { \override Hairpin.to-barline = ##f - c2\> + c'2\> \dimTextDim c2\> \dimHairpin diff --git a/input/regression/hairpin-span-bar.ly b/input/regression/hairpin-span-bar.ly index cacea3ac2e..2a95016298 100644 --- a/input/regression/hairpin-span-bar.ly +++ b/input/regression/hairpin-span-bar.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "@code{Hairpin} grobs do not collide with @code{SpanBar} grobs. @@ -10,16 +10,16 @@ \score { << \new GrandStaff << - \new Staff \relative c'' { a\< a a a \break a a a a \break a a a a\! } - \new Staff \relative c'' { a4 a a a s1 a4 a a a } + \new Staff \relative { a'\< a a a \break a a a a \break a a a a\! } + \new Staff \relative { a'4 a a a s1 a4 a a a } >> \new GrandStaff << - \new Staff \relative c'' { a^\< a a a a a a a a a a a\! } - \new Staff \relative c'' { \repeat unfold 12 a4 } + \new Staff \relative { a'^\< a a a a a a a a a a a\! } + \new Staff \relative { \repeat unfold 12 a'4 } >> \new GrandStaff << - \new Staff \relative c'' { a4 a a a s1 a4 a a a } - \new Staff \relative c'' { a^\< a a a a a a a a a a a\! } + \new Staff \relative { a'4 a a a s1 a4 a a a } + \new Staff \relative { a'^\< a a a a a a a a a a a\! } >> >> \layout { diff --git a/input/regression/hairpin-to-barline-mark.ly b/input/regression/hairpin-to-barline-mark.ly index c5f600a7dd..96871debc5 100644 --- a/input/regression/hairpin-to-barline-mark.ly +++ b/input/regression/hairpin-to-barline-mark.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -6,8 +6,8 @@ } -\new Staff \relative c' { - c1\< +\new Staff \relative { + c'1\< \mark "Very long mark" c4\> c c c\! } diff --git a/input/regression/hairpin-to-barline.ly b/input/regression/hairpin-to-barline.ly index be083aaacf..b9c69948fd 100644 --- a/input/regression/hairpin-to-barline.ly +++ b/input/regression/hairpin-to-barline.ly @@ -5,9 +5,9 @@ should end at that bar line. " } -\version "2.17.6" +\version "2.19.21" -\relative c'' { +\relative { \override Hairpin.bound-padding = #1.0 - c4\< c2. c4\! + c''4\< c2. c4\! } diff --git a/input/regression/hairpin-to-rest.ly b/input/regression/hairpin-to-rest.ly index 0022f96130..7e617dcd75 100644 --- a/input/regression/hairpin-to-rest.ly +++ b/input/regression/hairpin-to-rest.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Hairpins end at the left edge of a rest." } @@ -6,6 +6,6 @@ \layout{ ragged-right=##t } -\relative c'' { - c2\p\> r4\! +\relative { + c''2\p\> r4\! } diff --git a/input/regression/halfopenvertical.ly b/input/regression/halfopenvertical.ly new file mode 100644 index 0000000000..c0e0f03e31 --- /dev/null +++ b/input/regression/halfopenvertical.ly @@ -0,0 +1,19 @@ +\version "2.19.43" + +\header { + + texidoc = "The halfopenvertical articulation is available." + +} +#(define mydrums '( + (hihat cross #f 5) + (openhihat cross "open" 5) + (closedhihat cross "stopped" 5) + (halfopenhihat cross "halfopenvertical" 5))) + +\new DrumStaff << + \set DrumStaff.drumStyleTable = #(alist->hash-table mydrums) + + \drummode { hh4 hhc hho hhho } +>> + diff --git a/input/regression/hara-kiri-keep-previous-settings.ly b/input/regression/hara-kiri-keep-previous-settings.ly index 545500c90b..9aab6fef3d 100644 --- a/input/regression/hara-kiri-keep-previous-settings.ly +++ b/input/regression/hara-kiri-keep-previous-settings.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = @@ -21,9 +21,9 @@ not erase previous settings to the Staff context. % Old \RemoveEmptyStaffContext: Will erase previous settings... \score { << - \new Staff \relative c'' { c4 c c c \break s1 \break c4 c c c \break c c c c} - \new Staff \relative c'' { d4 d d d s1 s1 s1 } - \new Staff \relative c'' { e4 e e e s1 e4 e e e s1 } + \new Staff \relative { c''4 c c c \break s1 \break c4 c c c \break c c c c} + \new Staff \relative { d''4 d d d s1 s1 s1 } + \new Staff \relative { e''4 e e e s1 e4 e e e s1 } >> \layout { \context { \RemoveEmptyStaffContext } @@ -33,9 +33,9 @@ not erase previous settings to the Staff context. % New \RemoveEmptyStaves settings: Preserves previous settings... \score { << - \new Staff \relative c'' { c4 c c c \break s1 \break c4 c c c \break c c c c} - \new Staff \relative c'' { d4 d d d s1 s1 s1 } - \new Staff \relative c'' { e4 e e e s1 e4 e e e s1 } + \new Staff \relative { c''4 c c c \break s1 \break c4 c c c \break c c c c} + \new Staff \relative { d''4 d d d s1 s1 s1 } + \new Staff \relative { e''4 e e e s1 e4 e e e s1 } >> \layout { \context { \Staff \RemoveEmptyStaves } diff --git a/input/regression/hara-kiri-stanza-number.ly b/input/regression/hara-kiri-stanza-number.ly index 66d2bae701..382cb37a20 100644 --- a/input/regression/hara-kiri-stanza-number.ly +++ b/input/regression/hara-kiri-stanza-number.ly @@ -11,14 +11,14 @@ lines." ragged-right = ##T } -\version "2.16.0" +\version "2.19.2" << \new Voice = melody \relative c'{ r2 r4 r8 e8 |\break e16 e8. } - \lyricsto "melody" \lyrics { + \new Lyrics \lyricsto "melody" { \set stanza = "Verse 2." _ bla bla } >> diff --git a/input/regression/harp-pedals-sanity-checks.ly b/input/regression/harp-pedals-sanity-checks.ly index e239adc6bb..f3e8dd5e9f 100644 --- a/input/regression/harp-pedals-sanity-checks.ly +++ b/input/regression/harp-pedals-sanity-checks.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "Harp pedal diagram contains dividers at positions ~a. Normally, there is only one divider after the third pedal.") '(1 3 5)) @@ -13,10 +13,10 @@ the diagrams here violate the standard (7 pedals with divider after third), so a warning is printed out, but they should still look okay." } -\relative c'' { +\relative { \override Score.PaperColumn.keep-inside-line = ##f % Sanity checks: #pedals != 7: - c1^\markup \harp-pedal #"^-v|--" + c''1^\markup \harp-pedal #"^-v|--" % Sanity checks: no divider, multiple dividers, divider on wrong position: c1^\markup \harp-pedal #"^-v--v^" c1^\markup \harp-pedal #"^|-v|--|v^" diff --git a/input/regression/harp-pedals-tweaking.ly b/input/regression/harp-pedals-tweaking.ly index d071833768..b835d21a28 100644 --- a/input/regression/harp-pedals-tweaking.ly +++ b/input/regression/harp-pedals-tweaking.ly @@ -1,16 +1,16 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Harp pedals can be tweaked through the size, thickness and harp-pedal-details properties of TextScript." } -\relative c'' { +\relative { \override Score.PaperColumn.keep-inside-line = ##f \override Voice.TextScript.harp-pedal-details.box-width = #1 \once \override Voice.TextScript.size = #1.5 \once \override Voice.TextScript.thickness = #7 - c1^\markup \harp-pedal #"o^ovo-|vovo-o^" + c''1^\markup \harp-pedal #"o^ovo-|vovo-o^" c1^\markup \override #'(harp-pedal-details . ( (box-width . 0.6) (box-height . 0.3) diff --git a/input/regression/harp-pedals.ly b/input/regression/harp-pedals.ly index 71e889c0a6..471d9c2095 100644 --- a/input/regression/harp-pedals.ly +++ b/input/regression/harp-pedals.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "Harp pedal diagram contains ~a pedals rather than the usual 7.") 0) @@ -18,8 +18,8 @@ The third diagram uses an empty string, the third contains invalid characters. Both cases will create warnings, but should still not fail with an error." } -\relative c'' { - c1^\markup \harp-pedal #"^v-|vv-^" +\relative { + c''1^\markup \harp-pedal #"^v-|vv-^" % circled boxes: c1^\markup \harp-pedal #"o^ovo-|vovo-o^" % invalid pedal specifications, which still should be handled gracefully: diff --git a/input/regression/header-book-multiplescores.ly b/input/regression/header-book-multiplescores.ly index 3e33d1ae2e..e7167ad51a 100644 --- a/input/regression/header-book-multiplescores.ly +++ b/input/regression/header-book-multiplescores.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc=" @@ -14,7 +14,7 @@ Changing the header fields in a book or a bookpart shall not have any effect on title = "Title correct (set at top level)" } \score { - \relative c' { c1 } + \relative { c'1 } } diff --git a/input/regression/header-score-reordered.ly b/input/regression/header-score-reordered.ly index 6c9dc6163d..acbe127e21 100644 --- a/input/regression/header-score-reordered.ly +++ b/input/regression/header-score-reordered.ly @@ -1,4 +1,4 @@ -\version "2.18.1" +\version "2.19.0" \header { texidoc=" Header blocks may appear before and after the actual music in a score. diff --git a/input/regression/horizontal-bracket-tweak.ly b/input/regression/horizontal-bracket-tweak.ly index 3ffb66efc5..a1ac14d0f9 100644 --- a/input/regression/horizontal-bracket-tweak.ly +++ b/input/regression/horizontal-bracket-tweak.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Horizontal brackets are created with the correct event-cause, ensuring @@ -12,8 +12,8 @@ tweaks are applied to the correct spanner." } } -\relative c' { - c1-\tweak thickness #6 \startGroup +\relative { + c'1-\tweak thickness #6 \startGroup c1\startGroup c1\stopGroup c1\stopGroup diff --git a/input/regression/horizontal-bracket.ly b/input/regression/horizontal-bracket.ly index 73262e1a77..c2e1ec55c0 100644 --- a/input/regression/horizontal-bracket.ly +++ b/input/regression/horizontal-bracket.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -24,9 +24,9 @@ analysis brackets start and end. } -\relative c'' +\relative { - c4\startGroup\startGroup\startGroup + c''4\startGroup\startGroup\startGroup c4\stopGroup c4\startGroup c4\stopGroup\stopGroup diff --git a/input/regression/identifier-alists.ly b/input/regression/identifier-alists.ly new file mode 100644 index 0000000000..e70713e6b0 --- /dev/null +++ b/input/regression/identifier-alists.ly @@ -0,0 +1,20 @@ +\version "2.19.39" + +\header { + texidoc = "Music variables may be structured into alists +indexed by numbers or symbols." +} + +\layout { ragged-right = ##t } + +violin.1 = { e''-\markup \typewriter "\\violin.1" } +violin.2 = { c'-\markup \typewriter "\\violin.2" } +viola.I = { e-\markup \typewriter "\\viola.I" } +viola.II = { c-\markup \typewriter "\\viola.II" } + +\score { + << + \new Staff << \violin.1 \\ \violin.2 >> + \new Staff \with { \clef "alto" } << \viola.I \\ \viola.II >> + >> +} diff --git a/input/regression/identifier-following-chordmode.ly b/input/regression/identifier-following-chordmode.ly index 63790a7b55..b99142a0c0 100644 --- a/input/regression/identifier-following-chordmode.ly +++ b/input/regression/identifier-following-chordmode.ly @@ -7,15 +7,15 @@ modifier." } -\version "2.16.0" +\version "2.19.22" myDisplayMusic = -#(define-void-function (parser location music) +#(define-void-function (music) (ly:music?) (display-scheme-music music (current-error-port))) \myDisplayMusic \chordmode { c } -m = \relative c' { c4 d e f } +m = \relative { c'4 d e f } \new Staff { \m } diff --git a/input/regression/identifiers.ly b/input/regression/identifiers.ly index 1db60350ff..274aa6480e 100644 --- a/input/regression/identifiers.ly +++ b/input/regression/identifiers.ly @@ -2,25 +2,27 @@ \header { texidoc = "test identifiers." } -\version "2.16.0" +\version "2.19.45" num = #3 mus = { c'4 } paperId = \paper { line-width = 5.0 \cm } layoutId = \layout { ragged-right = ##t } perfId = \midi {} -markupId = \markup { hoi } +markupId = \markup { hoi \italic polloi } stringId = "title" - -% headers not allowed as Id's +scoreHeaderId = \header { piece = \markupId } +bookHeaderId = \header { composer = "Composer" title = \stringId } scoreId = \score { + \scoreHeaderId \repeat unfold \num \mus \layout { \layoutId } \midi { \perfId } } bookId = \book { + \bookHeaderId \score { \scoreId } \paper { \paperId } } diff --git a/input/regression/incipit.ly b/input/regression/incipit.ly index a5545558e8..7a98ab3f75 100644 --- a/input/regression/incipit.ly +++ b/input/regression/incipit.ly @@ -1,41 +1,24 @@ -\version "2.17.10" +\version "2.18.0" \header { texidoc = "Incipits can be printed using an @code{InstrumentName} grob." } -%% to prevent warnings/programming errors: -#(begin - (set-object-property! 'music 'backend-type? ly:music?) - (set-object-property! 'music 'backend-doc "Incipit music") - (ly:add-interface 'incipit-interface "An incipit." '(music)) - (let* ((instrument-def (assoc 'InstrumentName all-grob-descriptions)) - (meta-def (assoc 'meta (cdr instrument-def))) - (interfaces-def (assoc 'interfaces (cdr meta-def))) - (interfaces (cdr interfaces-def))) - (set-cdr! interfaces-def (cons 'incipit-interface interfaces)))) - \score { \new Staff { %% All this would be shortcuted by an appropriate music function: - \override Staff.InstrumentName.music = ##{ \clef "petrucci-c1" c'4 d' e' f' #} \override Staff.InstrumentName.self-alignment-X = #RIGHT + \override Staff.InstrumentName.self-alignment-Y = ##f \override Staff.InstrumentName.padding = #0 \override Staff.InstrumentName.stencil = #(lambda (grob) (let* ((instrument-name (ly:grob-property grob 'long-text)) (layout (ly:output-def-clone (ly:grob-layout grob))) - (music (make-sequential-music - (list (context-spec-music - (make-sequential-music - (list (make-property-set - 'instrumentName instrument-name) - (make-grob-property-set - 'VerticalAxisGroup - 'Y-extent '(-4 . 4)))) - 'MensuralStaff) - (ly:grob-property grob 'music)))) + (music #{ \new MensuralStaff + \with { instrumentName = #instrument-name } + { \clef "petrucci-c1" c'4 d' e' f' } + #}) (score (ly:make-score music)) (indent (ly:output-def-lookup layout 'indent)) (incipit-width (ly:output-def-lookup layout 'incipit-width diff --git a/input/regression/include-string.ly b/input/regression/include-string.ly index a5f772a44e..6584a9787c 100644 --- a/input/regression/include-string.ly +++ b/input/regression/include-string.ly @@ -1,8 +1,8 @@ -\version "2.16.0" +\version "2.19.22" \header { texidoc = "@code{ly:parser-include-string} should include the current string like a file @code{\\include}." } -#(ly:parser-include-string parser "\\relative c' { a4 b c d }") +#(ly:parser-include-string "\\relative { a4 b c d }") diff --git a/input/regression/inherit-acceptability.ly b/input/regression/inherit-acceptability.ly new file mode 100644 index 0000000000..caa31ed1fb --- /dev/null +++ b/input/regression/inherit-acceptability.ly @@ -0,0 +1,22 @@ +\version "2.19.26" + +\header { + texidoc = "@code{\\inherit-acceptability} allows for one context def to be accepted +wherever an existing one is." +} + +\new StaffGroup +<< + \new Staff { \time 3/4 c'2. } + \new TimeLess { \time 3/4 c'2. } +>> + +\layout { + ragged-right = ##t + \context { + \Staff + \name "TimeLess" + \remove "Time_signature_engraver" + } + \inherit-acceptability "TimeLess" "Staff" +} diff --git a/input/regression/input-order-alignment.ly b/input/regression/input-order-alignment.ly new file mode 100644 index 0000000000..cabb357364 --- /dev/null +++ b/input/regression/input-order-alignment.ly @@ -0,0 +1,25 @@ +\version "2.19.9" + +\header { + texidoc = "Alignment of lyrics, dynamics, textscripts and articulations +attached to chords with suspended notes doesn't depend on input order. +All these items are aligned on the \"main\" notehead (the one at the +end of the stem)." +} + +<< + \new Staff { + 2 s + \f s + ^"Text" s + -! s + } + \addlyrics { blah } + \new Staff { + 2 s + \f s + ^"Text" s + -! s + } + \addlyrics { blah } +>> diff --git a/input/regression/instrument-cue-name.ly b/input/regression/instrument-cue-name.ly index e7454346fb..369f2fea36 100644 --- a/input/regression/instrument-cue-name.ly +++ b/input/regression/instrument-cue-name.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -7,8 +7,8 @@ names for cue notes. It can also be unset properly." } -\relative c'' { - c4 +\relative { + c''4 \set Voice.instrumentCueName = "In.1" c2. \set Voice.instrumentCueName = "I.2" diff --git a/input/regression/instrument-name-dynamic.ly b/input/regression/instrument-name-dynamic.ly index 15f3f43e60..a5ee9cdf24 100644 --- a/input/regression/instrument-name-dynamic.ly +++ b/input/regression/instrument-name-dynamic.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " @@ -11,9 +11,9 @@ indent = 0\cm } -\relative c' { +\relative { \set Staff.shortInstrumentName = "foo" - f1 | f1 | f1 | + f'1 | f1 | f1 | f1\< | f1 | f1\! | } diff --git a/input/regression/instrument-name-partial.ly b/input/regression/instrument-name-partial.ly index 0ce9495f9e..fb95606568 100644 --- a/input/regression/instrument-name-partial.ly +++ b/input/regression/instrument-name-partial.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Instrument names are also printed on partial starting measures." } @@ -8,7 +8,7 @@ -\relative c'' { \set Staff.instrumentName = "foo" \partial 4 c4 c1 } +\relative { \set Staff.instrumentName = "foo" \partial 4 c''4 c1 } diff --git a/input/regression/instrument-name-pedal-lyrics.ly b/input/regression/instrument-name-pedal-lyrics.ly index 860a6b129f..4bc60ae4b7 100644 --- a/input/regression/instrument-name-pedal-lyrics.ly +++ b/input/regression/instrument-name-pedal-lyrics.ly @@ -1,17 +1,17 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "@code{Dynamics} and @code{Lyrics} lines below a @code{PianoStaff} do not affect the placement of the instrument name." } -upper = \relative c'' { - a4 b c d +upper = \relative { + a'4 b c d } -lower = \relative c { +lower = \relative { \clef bass - a2 c + a,2 c } \score { diff --git a/input/regression/instrument-name-volta.ly b/input/regression/instrument-name-volta.ly index 9110d07fa4..c84ef3eda1 100644 --- a/input/regression/instrument-name-volta.ly +++ b/input/regression/instrument-name-volta.ly @@ -1,13 +1,13 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Moving the @code{Volta_engraver} to the @code{Staff} context does not affect @code{InstrumentName} alignment." } -testMusik = \relative c'' { +testMusik = \relative { \repeat volta 2 { - c1 \break + c''1 \break } \alternative { { c1 \break } { c1 \break } @@ -15,10 +15,10 @@ testMusik = \relative c'' { } \score { - \new Staff \relative c' { + \new Staff \relative { \set Staff.shortInstrumentName = #"Instr." \repeat volta 2 { - c1 \break + c'1 \break } \alternative { { c1 \break } diff --git a/input/regression/instrument-switch-invalid-warning.ly b/input/regression/instrument-switch-invalid-warning.ly index 80df393fce..0ef544cc3d 100644 --- a/input/regression/instrument-switch-invalid-warning.ly +++ b/input/regression/instrument-switch-invalid-warning.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "No such instrument: ~a") "bassClar") @@ -7,9 +7,9 @@ the given instrument definition does not exist." } -\relative c' +\relative { - c4 + c'4 \instrumentSwitch "bassClar" c } diff --git a/input/regression/instrument-switch.ly b/input/regression/instrument-switch.ly index fc6542c8c2..e72d287258 100644 --- a/input/regression/instrument-switch.ly +++ b/input/regression/instrument-switch.ly @@ -5,7 +5,7 @@ properties for an in staff instrument switch. " } -\version "2.17.15" +\version "2.19.21" \addInstrumentDefinition #"bassClar" #`((instrumentTransposition . ,(ly:make-pitch -1 6 FLAT)) (instrumentName . "bla") @@ -21,9 +21,9 @@ properties for an in staff instrument switch. " ragged-right = ##t } -\relative c' +\relative { - c4 + c'4 \instrumentSwitch "bassClar" c2.\break c1\break diff --git a/input/regression/key-clefs.ly b/input/regression/key-clefs.ly index cef2ac4b52..d4e224dc5d 100644 --- a/input/regression/key-clefs.ly +++ b/input/regression/key-clefs.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Each clef has its own accidental placing rules, which can be adjusted using @code{sharp-positions} and @code{flat-positions}." } @@ -7,11 +7,11 @@ and @code{flat-positions}." } #(set-global-staff-size 16) -\relative cis' { +\relative { % \clef french % same as octaviated bass \clef violin - \key cis \major cis1 \key ces \major ces + \key cis \major cis'1 \key ces \major ces \clef soprano \key cis \major cis \key ces \major ces \break \clef mezzosoprano diff --git a/input/regression/key-signature-left-edge.ly b/input/regression/key-signature-left-edge.ly index fd7fc1403e..70b4687b3a 100644 --- a/input/regression/key-signature-left-edge.ly +++ b/input/regression/key-signature-left-edge.ly @@ -5,9 +5,9 @@ proper padding > 0 to the start of the staff lines." } -\version "2.16.0" +\version "2.19.21" -m = \relative c' { \key f \major c8 } +m = \relative { \key f \major c'8 } % Default spacing should not be affected \score { diff --git a/input/regression/key-signature-padding.ly b/input/regression/key-signature-padding.ly index 4f46271696..cb7833e4e5 100644 --- a/input/regression/key-signature-padding.ly +++ b/input/regression/key-signature-padding.ly @@ -5,11 +5,11 @@ } -\version "2.17.6" +\version "2.19.7" { \override Staff.KeySignature.padding-pairs = #'((("accidentals.flat" . "accidentals.sharp.slashslash.stemstemstem") . 0.5)) - \set Staff.keySignature = #`((4 . ,FLAT) (6 . ,THREE-Q-SHARP) (2 . ,SEMI-FLAT)) + \set Staff.keyAlterations = #`((4 . ,FLAT) (6 . ,THREE-Q-SHARP) (2 . ,SEMI-FLAT)) e2 } diff --git a/input/regression/key-signature-scordatura-persist.ly b/input/regression/key-signature-scordatura-persist.ly index 6a1e8ffd53..0a721ba68c 100644 --- a/input/regression/key-signature-scordatura-persist.ly +++ b/input/regression/key-signature-scordatura-persist.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "When a custom key signature has entries which are @@ -6,14 +6,14 @@ limited to a particular octave, such alterations should persist indefinitely or until a new key signature is set. Here, only the fis' shows an accidental, since it is outside the -octave defined in @code{keySignature}. +octave defined in @code{keyAlterations}. " } -\relative c' { - \set Staff.keySignature = #`(((0 . 3) . ,SHARP) +\relative { + \set Staff.keyAlterations = #`(((0 . 3) . ,SHARP) ((0 . 5) . ,FLAT) ((0 . 6) . ,FLAT)) - fis fis as bes + fis' fis as bes fis' as, as bes } diff --git a/input/regression/key-signature-scordatura.ly b/input/regression/key-signature-scordatura.ly index fb51ebaf04..5954f2c013 100644 --- a/input/regression/key-signature-scordatura.ly +++ b/input/regression/key-signature-scordatura.ly @@ -1,7 +1,7 @@ -\version "2.16.0" +\version "2.19.21" -\header { texidoc = "By setting @code{Staff.keySignature} directly, +\header { texidoc = "By setting @code{Staff.keyAlterations} directly, key signatures can be set invidually per pitch. " @@ -9,11 +9,11 @@ key signatures can be set invidually per pitch. \layout { ragged-right = ##T } -\relative c' +\relative \new Staff { - \set Staff.keySignature = #`(((0 . 3) . ,FLAT) ((1 . 2) . ,SHARP)) - f8 a c e - \set Staff.keySignature = #`(((0 . 4) . ,DOUBLE-SHARP) ((1 . 2) . ,FLAT)) + \set Staff.keyAlterations = #`(((0 . 3) . ,FLAT) ((1 . 2) . ,SHARP)) + f'8 a c e + \set Staff.keyAlterations = #`(((0 . 4) . ,DOUBLE-SHARP) ((1 . 2) . ,FLAT)) e a, g a } diff --git a/input/regression/keys.ly b/input/regression/keys.ly index 46079b264f..209a3469f1 100644 --- a/input/regression/keys.ly +++ b/input/regression/keys.ly @@ -1,5 +1,5 @@ -\version "2.17.15" +\version "2.19.21" \header{ texidoc=" Key signatures may appear on key changes, even without a barline. @@ -15,17 +15,17 @@ are created also on a clef change. ragged-right = ##T } -\relative c' +\relative { \set Staff.createKeyOnClefChange = ##t - \key bes \major c2 + \key bes \major c'2 % \key c \major % \minor \key es \major % \minor c2 \break \key bes \major % \major c2 \clef alto c2 \key d \major \clef treble c2 - \set Staff.keySignature = #`((4 . ,FLAT) (6 . ,THREE-Q-SHARP) (2 . ,SEMI-FLAT)) + \set Staff.keyAlterations = #`((4 . ,FLAT) (6 . ,THREE-Q-SHARP) (2 . ,SEMI-FLAT)) e2 } diff --git a/input/regression/kievan-notation.ly b/input/regression/kievan-notation.ly index fe78032044..127d3a647b 100644 --- a/input/regression/kievan-notation.ly +++ b/input/regression/kievan-notation.ly @@ -1,10 +1,21 @@ -\version "2.17.4" +\version "2.19.21" \header { texidoc = "LilyPond typesets Kievan notation. " } +% Font settings for Cyrillic +% Linux Libertine fonts contain Cyrillic glyphs. +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + #:sans "Linux Biolinum O,sans-serif" + #:typewriter "Linux Libertine Mono O,monospace" + )) +} + \score { << \new KievanVoice = "melody" \transpose c c' { diff --git a/input/regression/laissez-vibrer-chords.ly b/input/regression/laissez-vibrer-chords.ly index 26d284654c..cd2f00e2d4 100644 --- a/input/regression/laissez-vibrer-chords.ly +++ b/input/regression/laissez-vibrer-chords.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " @code{\\laissezVibrer} ties should also work on individual notes of a chord. " } -\relative c' { - 1 +\relative { + 1 1 } diff --git a/input/regression/laissez-vibrer-tie-head-direction.ly b/input/regression/laissez-vibrer-tie-head-direction.ly index af166fece5..56080f38a1 100644 --- a/input/regression/laissez-vibrer-tie-head-direction.ly +++ b/input/regression/laissez-vibrer-tie-head-direction.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "The 'head-direction of a LaissezVibrerTieColumn should @@ -6,8 +6,8 @@ be able to be set without causing a segmentation fault." } -\relative c'' { - c2 \laissezVibrer +\relative { + c''2 \laissezVibrer \once \override LaissezVibrerTieColumn.head-direction = #RIGHT c \laissezVibrer } diff --git a/input/regression/laissez-vibrer-ties.ly b/input/regression/laissez-vibrer-ties.ly index 53d868c1f0..5ae493913e 100644 --- a/input/regression/laissez-vibrer-ties.ly +++ b/input/regression/laissez-vibrer-ties.ly @@ -10,13 +10,13 @@ They have fixed size. Their formatting can be tuned with " } -\version "2.17.6" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c' { - \laissezVibrer r4 +\relative { + \laissezVibrer r4 \laissezVibrer r \laissezVibrer r 4.\laissezVibrer r8 diff --git a/input/regression/landscape.ly b/input/regression/landscape.ly index 73f58967b8..0868465001 100644 --- a/input/regression/landscape.ly +++ b/input/regression/landscape.ly @@ -1,9 +1,9 @@ -\version "2.16.0" +\version "2.19.21" #(set-default-paper-size "a6" 'landscape) \header { texidoc = " Scores may be printed in landscape mode."} -pattern = \relative c' { a b c d \break } +pattern = \relative { a b c d \break } \book { \score { diff --git a/input/regression/layout-from.ly b/input/regression/layout-from.ly index 80892c6c95..580709c205 100644 --- a/input/regression/layout-from.ly +++ b/input/regression/layout-from.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = " @@ -9,7 +9,7 @@ into context modifications. } \score { - \relative c' { cis cis cis cis } + \relative { cis' cis cis cis } \layout { \accidentalStyle dodecaphonic } diff --git a/input/regression/ledger-extra.ly b/input/regression/ledger-extra.ly new file mode 100644 index 0000000000..55ad653ef6 --- /dev/null +++ b/input/regression/ledger-extra.ly @@ -0,0 +1,28 @@ +\version "2.19.36" + +\header { + texidoc = "The ledger-extra grob property increases +the number of ledger lines drawn, but they are not +drawn on top of staff lines." +} + +notes = \relative { + \time 6/8 + a4. b | c d | e f | + g4. a | b c | d e | + f4. g | a b | +} + +\new Staff { + \notes +} + +\new Staff { + \override Staff.StaffSymbol.ledger-extra = 1 + \notes +} + +\new Staff { + \override Staff.StaffSymbol.ledger-extra = 2 + \notes +} diff --git a/input/regression/ledger-line-minimum.ly b/input/regression/ledger-line-minimum.ly index b5ba06a9c5..2a4cd65879 100644 --- a/input/regression/ledger-line-minimum.ly +++ b/input/regression/ledger-line-minimum.ly @@ -7,10 +7,10 @@ disappearing." } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t} -\relative c'' { +\relative { \time 2/4 - c8 c c c + c''8 c c c c \grace { \stemDown e'32[ c a f] } f8 f f } diff --git a/input/regression/ledger-line-shorten.ly b/input/regression/ledger-line-shorten.ly index 7c688f8457..8d5919a84e 100644 --- a/input/regression/ledger-line-shorten.ly +++ b/input/regression/ledger-line-shorten.ly @@ -2,16 +2,16 @@ texidoc = "Ledger lines are shortened when they are very close. This ensures that ledger lines stay separate." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c' { +\relative { \time 2/4 -c4 +c'4 b c4 b diff --git a/input/regression/ledger-lines-dynamics.ly b/input/regression/ledger-lines-dynamics.ly index a6e2d80c4c..e17ba848c6 100644 --- a/input/regression/ledger-lines-dynamics.ly +++ b/input/regression/ledger-lines-dynamics.ly @@ -1,10 +1,10 @@ -\version "2.17.2" +\version "2.19.21" \header { texidoc = "Dynamics and other outside staff objects avoid ledger lines. " } -\relative c' { - f16\pp[ c d e ] r2. | +\relative { + f'16\pp[ c d e ] r2. | } diff --git a/input/regression/ledger-lines-varying-staves.ly b/input/regression/ledger-lines-varying-staves.ly index 9a9f160119..2348e15060 100644 --- a/input/regression/ledger-lines-varying-staves.ly +++ b/input/regression/ledger-lines-varying-staves.ly @@ -1,13 +1,13 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Ledger lines should appear at every other location for a variety of staves using both @code{line-count} and @code{line-positions}." } -notes = \relative c' { +notes = \relative { \time 3/4 - c2. | d | e | f + c'2. | d | e | f g2. | a | b | c d2. | e | f | g a2. diff --git a/input/regression/ledger-positions-customization.ly b/input/regression/ledger-positions-customization.ly new file mode 100644 index 0000000000..9fd2fc0d49 --- /dev/null +++ b/input/regression/ledger-positions-customization.ly @@ -0,0 +1,27 @@ + +\header { + +texidoc = "3 ways to customize ledger line positions." + +} + +\version "2.19.41" +\paper { ragged-right = ##t } + +\relative { + \override Staff.StaffSymbol.ledger-positions = #'(7 10) + f''4 g a b c d e f g a b c +} + +\relative { + % note: the scheme procedure (lambda expression) is quoted + \override Staff.StaffSymbol.ledger-positions-function = + #'(lambda (staff-symbol-grob pos) (list pos)) + c'''4 d e f +} + +\relative { + c'''4 + \once \override NoteHead.ledger-positions = #'(8 10 12 14) + d e f +} diff --git a/input/regression/les-nereides.ly b/input/regression/les-nereides.ly index c87772419d..61b79eccd4 100644 --- a/input/regression/les-nereides.ly +++ b/input/regression/les-nereides.ly @@ -1,4 +1,4 @@ -\version "2.17.10" +\version "2.19.0" \header { composer = "ARTHUR GRAY" @@ -233,8 +233,9 @@ middleDynamics = { theScore = \score{ \context PianoStaff << \new Staff = "treble" << - \set beamExceptions = #'((end . (((1 . 8) . (2 2 2 2)) - ((1 . 32) . (4 4 4 4 4 4 4 4))))) + \set beamExceptions = + \beamExceptions { 8[ 8] 8[ 8] 8[ 8] 8[ 8] | + \repeat unfold 8 { 32[ 32 32 32] } } \treble \trebleTwo >> diff --git a/input/regression/lily-in-scheme.ly b/input/regression/lily-in-scheme.ly index cc59cbd152..fdf6da5ee2 100644 --- a/input/regression/lily-in-scheme.ly +++ b/input/regression/lily-in-scheme.ly @@ -12,20 +12,20 @@ the @code{TextScript} grob. } -\version "2.17.6" +\version "2.19.22" \layout { ragged-right = ##t } -withPaddingA = #(define-music-function (parser location padding music) (number? ly:music?) +withPaddingA = #(define-music-function (padding music) (number? ly:music?) #{ \override TextScript.padding = #padding $music \revert TextScript.padding #}) -withPaddingB = #(define-music-function (parser location padding music) (number? ly:music?) +withPaddingB = #(define-music-function (padding music) (number? ly:music?) #{ \override TextScript.padding = #(* padding 2) $music \revert TextScript.padding #}) -withPaddingC = #(define-music-function (parser location padding music) (number? ly:music?) +withPaddingC = #(define-music-function (padding music) (number? ly:music?) #{ \override TextScript.padding = #(+ 1 (* padding 2)) $music \revert TextScript.padding #}) diff --git a/input/regression/lilypond-book/GNUmakefile b/input/regression/lilypond-book/GNUmakefile index 935f068db7..6ddabeae88 100644 --- a/input/regression/lilypond-book/GNUmakefile +++ b/input/regression/lilypond-book/GNUmakefile @@ -18,13 +18,14 @@ OUT_TELY_FILES += ${TELY_FILES:%.tely=$(outdir)/%.pdf} XML_FILES = $(filter-out include%,$(call src-wildcard,*.xml)) -local-test: $(OUT_FILES) +local-test: + make LYS_OUTPUT_DIR=$(top-build-dir)/out/lybook-testdb $(OUT_FILES) $(outdir)/collated-files.list: $(OUT_FILES) echo $(sort $(filter-out %.xml,$(OUT_FILES))) > $@ $(outdir)/suffix-texi.texi: suffix-texi.texi $(outdir)/version.itexi $(DOCUMENTATION_LOCALE_TARGET) $(INIT_LY_SOURCES) $(SCHEME_SOURCES) - LILYPOND_VERSION=$(TOPLEVEL_VERSION) $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) --redirect-lilypond-output $< + LILYPOND_VERSION=$(TOPLEVEL_VERSION) PDFTEX=$(PDFTEX) PDFLATEX=$(PDFLATEX) $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) --redirect-lilypond-output $< # Due to automatic language detection the standard rule using the script # extract_texi_filenames would create .es.xref-map for these files. The diff --git a/input/regression/lilypond-book/include.ly b/input/regression/lilypond-book/include.ly index 1e790908a6..2444ac8536 100644 --- a/input/regression/lilypond-book/include.ly +++ b/input/regression/lilypond-book/include.ly @@ -1,4 +1,5 @@ \version "2.16.0" +\include "melody.ly" \score { - \relative c'' { \key c \minor c4 es g2 } + \melody } diff --git a/input/regression/lilypond-book/include/example.ly b/input/regression/lilypond-book/include/example.ly index ccc2582e0d..cae2c0fdb2 100644 --- a/input/regression/lilypond-book/include/example.ly +++ b/input/regression/lilypond-book/include/example.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \score { - \relative c'' { d c b c } + \relative { d'' c b c } } diff --git a/input/regression/lilypond-book/include2.ly b/input/regression/lilypond-book/include2.ly index 1624a24c56..2c71903bb3 100644 --- a/input/regression/lilypond-book/include2.ly +++ b/input/regression/lilypond-book/include2.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \score { - \relative c'' { \key c \minor d4 es g2 } + \relative { \key c \minor d''4 es g2 } } diff --git a/input/regression/lilypond-book/include3.ily b/input/regression/lilypond-book/include3.ily index 8aad8b1de1..43519082d9 100644 --- a/input/regression/lilypond-book/include3.ily +++ b/input/regression/lilypond-book/include3.ily @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { doctitlees = "If you see this 'translated' doctitle, language detection works!" @@ -9,7 +9,7 @@ texidoces = "If you see this 'translated' texidoc, language detection works!" doctitle = "Original doctitle (you should not see this!)" } -\relative c'' { - c1 +\relative { + c''1 } diff --git a/input/regression/lilypond-book/melody.ly b/input/regression/lilypond-book/melody.ly new file mode 100644 index 0000000000..5ab7d7bf1c --- /dev/null +++ b/input/regression/lilypond-book/melody.ly @@ -0,0 +1,3 @@ +\version "2.19.21" +\include "include/myvar.ily" +melody = \relative { \key c \minor c''4 es g2 \myVar } diff --git a/input/regression/lilypond-book/tex-include-file.lytex b/input/regression/lilypond-book/tex-include-file.lytex index bcad93601b..f5005ed71c 100644 --- a/input/regression/lilypond-book/tex-include-file.lytex +++ b/input/regression/lilypond-book/tex-include-file.lytex @@ -14,4 +14,9 @@ Within a lilypond block: \include "include/myvar.ily" \relative c'' { \myVar } \end{lilypond} + +Include a file that includes a file: + +\lilypondfile{include.ly} + \end{document} diff --git a/input/regression/lilypond-book/tex-include-options.lytex b/input/regression/lilypond-book/tex-include-options.lytex index 251fa087d8..bcc2a6ef4a 100644 --- a/input/regression/lilypond-book/tex-include-options.lytex +++ b/input/regression/lilypond-book/tex-include-options.lytex @@ -14,4 +14,9 @@ Within a lilypond block: \include "include/myvar.ily" \relative c'' { \myVar } \end{lilypond} + +Include a file that includes a file: + +\lilypondfile[quote,noindent]{include.ly} + \end{document} diff --git a/input/regression/lilypond-book/texinfo-include-file.tely b/input/regression/lilypond-book/texinfo-include-file.tely index 610eb23a3e..d32e767c17 100644 --- a/input/regression/lilypond-book/texinfo-include-file.tely +++ b/input/regression/lilypond-book/texinfo-include-file.tely @@ -20,4 +20,8 @@ Within a lilypond block: \relative c'' { \myVar } @end lilypond +Include a file that includes a file: + +@lilypondfile{include.ly} + @bye diff --git a/input/regression/line-arrows.ly b/input/regression/line-arrows.ly index 1b3bccc8a3..9cfa449154 100644 --- a/input/regression/line-arrows.ly +++ b/input/regression/line-arrows.ly @@ -2,13 +2,13 @@ texidoc = "Arrows can be applied to text-spanners and line-spanners (such as the Glissando)" } -\version "2.17.6" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c'' { +\relative { \override TextSpanner.bound-padding = #1.0 \override TextSpanner.style = #'line \override TextSpanner.bound-details.right.arrow = ##t @@ -23,6 +23,6 @@ \override Glissando.arrow-length = #0.5 \override Glissando.arrow-width = #0.25 - a8\startTextSpan gis8 a4 b4\glissando + a'8\startTextSpan gis8 a4 b4\glissando b,4 | g' c\stopTextSpan c } diff --git a/input/regression/line-style-zigzag-spacing.ly b/input/regression/line-style-zigzag-spacing.ly index ab35aa1d95..13603805b0 100644 --- a/input/regression/line-style-zigzag-spacing.ly +++ b/input/regression/line-style-zigzag-spacing.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Setting @code{'zigzag} style for spanners does not @@ -8,8 +8,8 @@ the second markup and default trillspanner. " } -\relative c' { - c1^"text" +\relative { + c'1^"text" \override TrillSpanner.style = #'zigzag c1\startTrillSpan c2^\stopTrillSpan c^"text" diff --git a/input/regression/line-style.ly b/input/regression/line-style.ly index 2d77edd91d..c3452d7439 100644 --- a/input/regression/line-style.ly +++ b/input/regression/line-style.ly @@ -1,14 +1,14 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Cover all line styles available." } -\relative c'' { +\relative { \override Glissando.breakable = ##t s2 - d2 \glissando d'2 + d''2 \glissando d'2 \override Glissando.style = #'dashed-line d,2 \glissando d'2 \override Glissando.style = #'dotted-line diff --git a/input/regression/loglevels.ly b/input/regression/loglevels.ly index 23ff272078..91b239a3e0 100644 --- a/input/regression/loglevels.ly +++ b/input/regression/loglevels.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "Test warning\n")) @@ -15,8 +15,8 @@ are commented out. Comment them in to check the output manually. %%%% message functions of the Input class: #(display "\nMessage functions of the Input class:\n" (current-error-port)) -messageTest = #(define-music-function (parser location) () - (ly:input-message location "Test ly:input-message" ) +messageTest = #(define-music-function () () + (ly:input-message (*location*) "Test ly:input-message" ) (make-music 'Music)) { diff --git a/input/regression/lyric-combine-derived-voice.ly b/input/regression/lyric-combine-derived-voice.ly index 0c7e45de15..782a3f5ae4 100644 --- a/input/regression/lyric-combine-derived-voice.ly +++ b/input/regression/lyric-combine-derived-voice.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "For Voice-derived contexts like CueVoice, the lyrics should still start with the first note." @@ -6,8 +6,8 @@ still start with the first note." \score { \new Staff << - \new Voice \relative c'' { - g2 + \new Voice \relative { + g'2 << { \voiceOne r2 } \new CueVoice = "cue" { \voiceTwo g4 g } diff --git a/input/regression/lyric-combine-empty-warning.ly b/input/regression/lyric-combine-empty-warning.ly index 5c35ed00a2..2f38988243 100644 --- a/input/regression/lyric-combine-empty-warning.ly +++ b/input/regression/lyric-combine-empty-warning.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.2" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (ly:translate-cpp-warning-scheme "cannot find Voice `%s'") "not-existing-notes") @@ -17,9 +17,9 @@ no warning should be printed." c1 } % This should not give a warning (empty lyrics, existing voice): - \new Lyrics \lyricsto "notes" \lyricmode { } + \new Lyrics \lyricsto "notes" { } % This should give a warning (non-existing voice): - \new Lyrics \lyricsto "not-existing-notes" \lyricmode { Test } + \new Lyrics \lyricsto "not-existing-notes" { Test } % This should NOT give a warning (non-existing voice, but also no lyrics): - \new Lyrics \lyricsto "not-existing-notes" \lyricmode { } + \new Lyrics \lyricsto "not-existing-notes" { } >> diff --git a/input/regression/lyric-combine-new.ly b/input/regression/lyric-combine-new.ly index 053a23e1c4..76d2bd77dc 100644 --- a/input/regression/lyric-combine-new.ly +++ b/input/regression/lyric-combine-new.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "With the @code{\\lyricsto} mechanism, individual lyric lines can be associated with one melody line. Each lyric line @@ -7,12 +7,12 @@ can be tuned to either follow or ignore melismata." << - \new Voice = "bla" \relative c'' { + \new Voice = "bla" \relative { \autoBeamOff - c2( d4) e8[ c b c] f4 + c''2( d4) e8[ c b c] f4 } - \lyricsto "bla" \new Lyrics { bla ab blob blob } - \lyricsto "bla" \new Lyrics { + \new Lyrics \lyricsto "bla" { bla ab blob blob } + \new Lyrics \lyricsto "bla" { bla \set ignoreMelismata = ##t @@ -26,7 +26,7 @@ can be tuned to either follow or ignore melismata." blob } - \lyricsto "bla" \new Lyrics { + \new Lyrics \lyricsto "bla" { nes ted lyrics voice with more words than no tes } >> diff --git a/input/regression/lyric-combine-nullvoice.ly b/input/regression/lyric-combine-nullvoice.ly new file mode 100644 index 0000000000..0592dc4e40 --- /dev/null +++ b/input/regression/lyric-combine-nullvoice.ly @@ -0,0 +1,15 @@ +\version "2.19.11" +\header { + texidoc ="Lyrics can be aligned to a @code{NullVoice} context, + which prints no notes, with the usual mechanisms for melismata." +} +\paper { ragged-right = ##f } +\score { << + \new Staff << + { c''4. g'8 c''2 | g'8( f' g'4)~ g'2 } \\ + { c'4 b c'8 e' g' e' | c'1 } + \new NullVoice = "nv" { + \autoBeamOff c4 r16 b,8. c8[ e8 g8 e8] | g8( f g4)~ g2 } + >> + \new Lyrics \lyricsto "nv" { free a -- lign -- ment } +>> } diff --git a/input/regression/lyric-combine-polyphonic.ly b/input/regression/lyric-combine-polyphonic.ly index 16285dd6cf..0f979840da 100644 --- a/input/regression/lyric-combine-polyphonic.ly +++ b/input/regression/lyric-combine-polyphonic.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.2" \header { texidoc ="Polyphonic rhythms and rests do not disturb @@ -21,14 +21,14 @@ bes'4 bes'4 bes'4 bes'4 } - \lyricsto "one" \context Lyrics = sop { + \context Lyrics = sop \lyricsto "one" { Do mi nus ex } \new Voice = "two" { \voiceTwo ees'8 r8 r8 r8 ees' r8 r8 r8 } - \lyricsto "two" \new Lyrics { + \new Lyrics \lyricsto "two" { Do na } >> diff --git a/input/regression/lyric-combine-switch-voice-2.ly b/input/regression/lyric-combine-switch-voice-2.ly index d084e8f2bd..7462f7f84e 100644 --- a/input/regression/lyric-combine-switch-voice-2.ly +++ b/input/regression/lyric-combine-switch-voice-2.ly @@ -2,11 +2,11 @@ { texidoc = "switching voices in the middle of the lyrics is possible using @code{lyricsto}." } -\version "2.17.15" +\version "2.19.21" << - \relative c' \new Voice = "lahlah" { - c4 + \relative \new Voice = "lahlah" { + c'4 << \new Voice = "alternative" { \voiceOne diff --git a/input/regression/lyric-combine-switch-voice.ly b/input/regression/lyric-combine-switch-voice.ly index ccf444b682..4e6fd50bc5 100644 --- a/input/regression/lyric-combine-switch-voice.ly +++ b/input/regression/lyric-combine-switch-voice.ly @@ -5,12 +5,12 @@ if the switch occurs together with context instantiation." } -\version "2.17.15" +\version "2.19.21" << - \relative c' \new Voice = "lahlah" { + \relative \new Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 << \new Voice = "alternative" { \voiceOne diff --git a/input/regression/lyric-combine.ly b/input/regression/lyric-combine.ly index cedcb39d2d..1f635e638c 100644 --- a/input/regression/lyric-combine.ly +++ b/input/regression/lyric-combine.ly @@ -1,5 +1,5 @@ -\version "2.17.11" +\version "2.19.21" \header{ @@ -17,16 +17,16 @@ lyrics ignore any other rhythms in the piece." -m = \relative c'' { +m = \relative { \autoBeamOff - g8( a) r8 \tuplet 3/2 { g'8( f e) } r8 \grace { d16[ c b] } e4 + g'8( a) r8 \tuplet 3/2 { g'8( f e) } r8 \grace { d16[ c b] } e4 \textLengthOff d8.^"melisma" \melisma c16 \melismaEnd b } -noise = \repeat unfold 6 \relative c'' { g16 g g g } +noise = \repeat unfold 6 \relative { g'16 g g g } textI = \lyricmode { la2 __ la -- la __ la la la la la diff --git a/input/regression/lyric-extender-broken.ly b/input/regression/lyric-extender-broken.ly index 7d36a12335..0919bfcbbf 100644 --- a/input/regression/lyric-extender-broken.ly +++ b/input/regression/lyric-extender-broken.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.2" \header { @@ -18,6 +18,6 @@ of the melisma." a) a2( b) \break a2 } - \lyricsto A \context Lyrics \lyricmode { a __ a __ ha } + \context Lyrics \lyricsto A { a __ a __ ha } >> diff --git a/input/regression/lyric-extender-completion.ly b/input/regression/lyric-extender-completion.ly index fbe84a5422..7b920a1c08 100644 --- a/input/regression/lyric-extender-completion.ly +++ b/input/regression/lyric-extender-completion.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -8,7 +8,7 @@ << -\new Staff \relative c' { +\new Staff \relative { \new Voice = "upper" { \voiceTwo g'1( | @@ -16,6 +16,6 @@ d | } } -\new Lyrics \lyricsto "upper" \lyricmode { Ah __ } +\new Lyrics \lyricsto "upper" { Ah __ } >> diff --git a/input/regression/lyric-extender-includegraces.ly b/input/regression/lyric-extender-includegraces.ly index 1100f625e9..1cb9fa8dce 100644 --- a/input/regression/lyric-extender-includegraces.ly +++ b/input/regression/lyric-extender-includegraces.ly @@ -1,4 +1,4 @@ -\version "2.17.28" +\version "2.19.21" \header { texidoc=" @@ -7,8 +7,8 @@ expected also for syllables starting under grace notes. " } -\relative c' { - c2 \grace { c16( d e f } g2) +\relative { + c'2 \grace { c16( d e f } g2) f1 } \addlyrics { diff --git a/input/regression/lyric-extender-no-heads.ly b/input/regression/lyric-extender-no-heads.ly index d99b486108..f2e62f4c1c 100644 --- a/input/regression/lyric-extender-no-heads.ly +++ b/input/regression/lyric-extender-no-heads.ly @@ -6,15 +6,15 @@ without a lyric attached." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c'' { +\relative { \time 3/4 - d4~ d4 r4 + d''4~ 4 r4 \grace es8 d4 diff --git a/input/regression/lyric-extender-rest.ly b/input/regression/lyric-extender-rest.ly index 8f57a1753a..6afa49715f 100644 --- a/input/regression/lyric-extender-rest.ly +++ b/input/regression/lyric-extender-rest.ly @@ -10,11 +10,11 @@ is not terminated upon encountering a rest. " ragged-right = ##T } -\version "2.16.0" +\version "2.19.21" << - \new Voice = "one" \relative c'' { - c4\melisma + \new Voice = "one" \relative { + c''4\melisma c4 r c\melismaEnd c } \new Lyrics \lyricsto "one" { diff --git a/input/regression/lyric-extender-right-margin.ly b/input/regression/lyric-extender-right-margin.ly index 9b1a07bddc..72e1f0a4a2 100644 --- a/input/regression/lyric-extender-right-margin.ly +++ b/input/regression/lyric-extender-right-margin.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Extenders will not protrude into the right margin" } \score{ { - \relative c' { - c4 d e f ~ | \break + \relative { + c'4 d e f ~ | \break f4 e d c | } diff --git a/input/regression/lyric-hyphen-break.ly b/input/regression/lyric-hyphen-break.ly index 2a67e35c02..fd6121754b 100644 --- a/input/regression/lyric-hyphen-break.ly +++ b/input/regression/lyric-hyphen-break.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -20,8 +20,8 @@ they go past the first note. " << - \new Voice \relative c'' { - \time 1/4 c16[ c c c] + \new Voice \relative { + \time 1/4 c''16[ c c c] \time 1/4 c16[ c c c] \time 1/4 diff --git a/input/regression/lyric-hyphen-retain.ly b/input/regression/lyric-hyphen-retain.ly index 6a45c767d9..c19d42a2ad 100644 --- a/input/regression/lyric-hyphen-retain.ly +++ b/input/regression/lyric-hyphen-retain.ly @@ -14,16 +14,16 @@ effect of a setting is delayed is one syllable." } -\version "2.17.6" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c'' { +\relative { \time 2/4 - c32 c c c + c''32 c c c c32 c c c c32 c c c c32 c c c diff --git a/input/regression/lyric-melisma-alignment.ly b/input/regression/lyric-melisma-alignment.ly index 8e86687272..8be9d01914 100644 --- a/input/regression/lyric-melisma-alignment.ly +++ b/input/regression/lyric-melisma-alignment.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "@code{lyricMelismaAlignment} sets the default alignment for melismata. It works with both automatic and manual melismata." } -\relative c' { - c4^"auto"( d e f) +\relative { + c'4^"auto"( d e f) \set melismaBusyProperties = #'() c4^"manual" d e f } diff --git a/input/regression/lyric-melisma-manual.ly b/input/regression/lyric-melisma-manual.ly index d366988cc2..f237e9cc8e 100644 --- a/input/regression/lyric-melisma-manual.ly +++ b/input/regression/lyric-melisma-manual.ly @@ -1,13 +1,13 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Melismata may be entered manually by substituting @code{_} for lyrics on notes that are part of the melisma." } -\relative c' { +\relative { \set melismaBusyProperties = #'() - c4 d( e) f + c'4 d( e) f f4( e) e e } \addlyrics { diff --git a/input/regression/lyric-melisma-melisma.ly b/input/regression/lyric-melisma-melisma.ly index b75c2b0377..ab602a016d 100644 --- a/input/regression/lyric-melisma-melisma.ly +++ b/input/regression/lyric-melisma-melisma.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "A syllable aligned with a melisma delimited with @code{\\melisma} and @code{\\melismaEnd} should be left-aligned. " } -\relative c' { - c4 c c16\melisma d e f \melismaEnd g4 +\relative { + c'4 c c16\melisma d e f \melismaEnd g4 } \addlyrics { ha ha looong __ ho } diff --git a/input/regression/lyric-no-association-rhythm.ly b/input/regression/lyric-no-association-rhythm.ly index 84b07a52b9..16c9693d18 100644 --- a/input/regression/lyric-no-association-rhythm.ly +++ b/input/regression/lyric-no-association-rhythm.ly @@ -8,16 +8,16 @@ } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } \score { \context ChoirStaff << \context Staff = soprano << - \context Voice = sop \relative c' { e2 e4 } + \context Voice = sop \relative { e'2 e4 } >> \context Staff = alto << - \context Voice = alt \relative c' { e4 e4 e4 } + \context Voice = alt \relative { e'4 e4 e4 } \new Lyrics \lyricmode { do4 re4 me4 } diff --git a/input/regression/lyric-phrasing.ly b/input/regression/lyric-phrasing.ly index ab24aa3b22..4865b114a2 100644 --- a/input/regression/lyric-phrasing.ly +++ b/input/regression/lyric-phrasing.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " @@ -14,13 +14,13 @@ << - \relative c' \new Voice = "bla" { + \relative \new Voice = "bla" { \autoBeamOff - c4( c16 d c b) c4 + c'4( c16 d c b) c4 d16[ e f g] } - \lyricsto "bla" \context Lyrics \lyricmode { + \context Lyrics \lyricsto "bla" { alllll __ tijd izzz } diff --git a/input/regression/lyric-tweak.ly b/input/regression/lyric-tweak.ly index ccaad3d469..d75fed2b66 100644 --- a/input/regression/lyric-tweak.ly +++ b/input/regression/lyric-tweak.ly @@ -1,11 +1,9 @@ \header { - texidoc = "The @code{\\tweak} function can be used in Lyrics. Where -confusion of lyric words with grob names is possible, explicit use of -@code{\\markup} can be used for resolving the ambiguity." + texidoc = "The @code{\\tweak} function can be used in Lyrics." } -\version "2.17.6" +\version "2.19.25" \paper { ragged-right = ##t } @@ -13,8 +11,8 @@ confusion of lyric words with grob names is possible, explicit use of \new Lyrics \lyricmode { \markup \raise #1 \rotate #30 One 4 - \tweak extra-offset #'(0 . 2) \markup fish, + \tweak extra-offset #'(0 . 2) fish, \markup \raise #1 \rotate #-30 two fish, - \tweak color #red \markup red fish, - \tweak color #blue \markup blue fish. + \tweak color #red red fish, + \tweak color #blue blue fish. } diff --git a/input/regression/lyrics-after-grace.ly b/input/regression/lyrics-after-grace.ly index dafbe7d976..ccc72ac186 100644 --- a/input/regression/lyrics-after-grace.ly +++ b/input/regression/lyrics-after-grace.ly @@ -5,7 +5,7 @@ } -\version "2.16.0" +\version "2.19.2" \paper { ragged-right = ##t } @@ -15,5 +15,5 @@ \new Voice = "myVoice" { \afterGrace c''2 { e''32( } c''2) }} - \new Lyrics \lyricsto "myVoice" \lyricmode { foo -- bar } + \new Lyrics \lyricsto "myVoice" { foo -- bar } >> diff --git a/input/regression/lyrics-aligned-above-stay-close-to-staff.ly b/input/regression/lyrics-aligned-above-stay-close-to-staff.ly index addf34a092..39ba74c47f 100644 --- a/input/regression/lyrics-aligned-above-stay-close-to-staff.ly +++ b/input/regression/lyrics-aligned-above-stay-close-to-staff.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { title = "Aligned-above lyrics should stay close to their staff" @@ -10,7 +10,7 @@ Bass staff. \paper { ragged-last-bottom = ##f } -tune = \relative c { \repeat unfold 2 { c4( e) g2 | \break c1 } +tune = \relative { \repeat unfold 2 { c4( e) g2 | \break c1 } \bar "|." } \score { diff --git a/input/regression/lyrics-includegraces.ly b/input/regression/lyrics-includegraces.ly index ec3dfe2fc3..529681f82f 100644 --- a/input/regression/lyrics-includegraces.ly +++ b/input/regression/lyrics-includegraces.ly @@ -1,4 +1,4 @@ -\version "2.17.28" +\version "2.19.21" \header { texidoc=" @@ -7,8 +7,8 @@ assigned to grace notes. " } -\relative c' { - f4 \appoggiatura a32 b4 +\relative { + f'4 \appoggiatura a32 b4 \grace { f16 a16 } b2 \afterGrace b2 { f16[ a16] } \appoggiatura a32 b4 diff --git a/input/regression/lyrics-melisma-beam.ly b/input/regression/lyrics-melisma-beam.ly index ba811ed8a9..78a3aac6de 100644 --- a/input/regression/lyrics-melisma-beam.ly +++ b/input/regression/lyrics-melisma-beam.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Melismata are triggered by manual beams. Notes in a @@ -12,11 +12,11 @@ << \new Staff - \relative c'' { + \relative { \set Staff.autoBeaming = ##f - g4 d8[ b8 d8 g8] g4 + g'4 d8[ b8 d8 g8] g4 } - \lyricsto "" \new Lyrics \lyricmode { bla blaa -- bla } + \new Lyrics \lyricsto "" { bla blaa -- bla } >> diff --git a/input/regression/lyrics-no-notes.ly b/input/regression/lyrics-no-notes.ly index 30d2535c59..d45f14493c 100644 --- a/input/regression/lyrics-no-notes.ly +++ b/input/regression/lyrics-no-notes.ly @@ -1,18 +1,17 @@ \header { - texidoc ="Lyric syllables without note attachment are not -centered. Centering may cause unintended effects when the -paper column is very wide." + texidoc ="Lyric syllables without note attachment are +aligned correctly even if the paper column is very wide." } \layout{ ragged-right = ##t } -\version "2.17.6" +\version "2.19.21" << \override Score.PaperColumn.keep-inside-line = ##f - \new Staff \relative c' { + \new Staff \relative { \key aes \major \context Voice = "1" { - f8 f + f'8 f \textLengthOff f^"xxxxxxxxxxxxxxxxxxxxxxxxxx" f @@ -21,7 +20,7 @@ paper column is very wide." \new Lyrics \lyricmode { \skip 8 \skip 8 - x8 + xx8 x8 } >> diff --git a/input/regression/lyrics-pass-under-bar.ly b/input/regression/lyrics-pass-under-bar.ly index 90df8bffa9..2df8fd0390 100644 --- a/input/regression/lyrics-pass-under-bar.ly +++ b/input/regression/lyrics-pass-under-bar.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Long lyrics should be allowed to pass under @@ -6,5 +6,5 @@ the bar line. " } -\relative c''' { c2 c c c } +\relative { c'''2 c c c } \addlyrics { foo bar foooooooo bar } diff --git a/input/regression/lyrics-tenor-clef.ly b/input/regression/lyrics-tenor-clef.ly index acea89d45b..df19660b58 100644 --- a/input/regression/lyrics-tenor-clef.ly +++ b/input/regression/lyrics-tenor-clef.ly @@ -3,11 +3,11 @@ a clef transposition (8 below the clef)." } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c' { \clef "G_8" c c c c } +\relative { \clef "G_8" c' c c c } \addlyrics { bla bla bla bla } diff --git a/input/regression/magnifyMusic-dots-beamlets.ly b/input/regression/magnifyMusic-dots-beamlets.ly new file mode 100644 index 0000000000..8d14060222 --- /dev/null +++ b/input/regression/magnifyMusic-dots-beamlets.ly @@ -0,0 +1,30 @@ +\version "2.19.8" + +\header { + texidoc = "Dot size and beamlet length should be scaled along +with notation size when using the @code{\magnifyMusic} command." +} + +\score { + \new Voice { + \omit Staff.TimeSignature + \time 7/4 + << + { \repeat unfold 7 \relative { g'8.[ g16] } } + { + \magnifyMusic 0.50 s4 + \magnifyMusic 0.63 s + \magnifyMusic 0.80 s + \magnifyMusic 1.00 s + \magnifyMusic 1.26 s + \magnifyMusic 1.59 s + \magnifyMusic 2.00 s + } + >> + } + \addlyrics { + "50%" _ _ _ _ _ + "100%" _ _ _ _ _ + "200%" _ + } +} diff --git a/input/regression/magnifyMusic-laissez-vibrer-ties.ly b/input/regression/magnifyMusic-laissez-vibrer-ties.ly new file mode 100644 index 0000000000..7a231e8e33 --- /dev/null +++ b/input/regression/magnifyMusic-laissez-vibrer-ties.ly @@ -0,0 +1,38 @@ +\version "2.19.8" + +\header { + texidoc = "Laissez vibrer ties should be scaled along with +notation size when using the @code{\magnifyMusic} command. They +can get thicker than the default, but not thinner." +} + +template = { + \omit Staff.TimeSignature + \time 7/2 + \magnifyMusic 0.50 s2 + \magnifyMusic 0.63 s + \magnifyMusic 0.80 s + \magnifyMusic 1.00 s + \magnifyMusic 1.26 s + \magnifyMusic 1.59 s + \magnifyMusic 2.00 s +} + +\score { + \new StaffGroup << + \new Staff \new Voice = "upper" << + \template + \repeat unfold 7 { g'4\laissezVibrer \hide Rest r4 } + >> + \new Lyrics \with { + \override VerticalAxisGroup.staff-affinity = #DOWN + } \lyricsto "upper" { + " 50%" \skip 1 \skip 1 " 100%" \skip 1 \skip 1 " 200%" + } + \new Staff \new Voice << + \clef bass + \template + \repeat unfold 7 { f4\laissezVibrer \hide Rest r4 } + >> + >> +} diff --git a/input/regression/magnifyMusic-phrasing-slurs.ly b/input/regression/magnifyMusic-phrasing-slurs.ly new file mode 100644 index 0000000000..b691e13250 --- /dev/null +++ b/input/regression/magnifyMusic-phrasing-slurs.ly @@ -0,0 +1,31 @@ +\version "2.19.8" + +\header { + texidoc = "Phrasing slurs should be scaled along with notation +size when using the @code{\magnifyMusic} command. They can get +thicker than the default, but not thinner." +} + +\score { + \new Voice { + \omit Staff.TimeSignature + \time 7/8 + << + { \repeat unfold 7 \relative { g'32[\( a b c\)] } } + { + \magnifyMusic 0.50 s8 + \magnifyMusic 0.63 s + \magnifyMusic 0.80 s + \magnifyMusic 1.00 s + \magnifyMusic 1.26 s + \magnifyMusic 1.59 s + \magnifyMusic 2.00 s + } + >> + } + \addlyrics { + "50%" _ _ _ _ _ _ _ _ _ _ _ + "100%" _ _ _ _ _ _ _ _ _ _ _ + "200%" _ _ _ + } +} diff --git a/input/regression/magnifyMusic-repeat-ties.ly b/input/regression/magnifyMusic-repeat-ties.ly new file mode 100644 index 0000000000..fd1c374fa4 --- /dev/null +++ b/input/regression/magnifyMusic-repeat-ties.ly @@ -0,0 +1,38 @@ +\version "2.19.8" + +\header { + texidoc = "Repeat ties should be scaled along with notation size +when using the @code{\magnifyMusic} command. They can get thicker +than the default, but not thinner." +} + +template = { + \omit Staff.TimeSignature + \time 7/2 + \magnifyMusic 0.50 s2 + \magnifyMusic 0.63 s + \magnifyMusic 0.80 s + \magnifyMusic 1.00 s + \magnifyMusic 1.26 s + \magnifyMusic 1.59 s + \magnifyMusic 2.00 s +} + +\score { + \new StaffGroup << + \new Staff \new Voice = "upper" << + \template + \repeat unfold 7 { g'4\repeatTie \hide Rest r4 } + >> + \new Lyrics \with { + \override VerticalAxisGroup.staff-affinity = #DOWN + } \lyricsto "upper" { + " 50%" \skip 1 \skip 1 " 100%" \skip 1 \skip 1 " 200%" + } + \new Staff \new Voice << + \clef bass + \template + \repeat unfold 7 { f4\repeatTie \hide Rest r4 } + >> + >> +} diff --git a/input/regression/magnifyMusic-slurs.ly b/input/regression/magnifyMusic-slurs.ly new file mode 100644 index 0000000000..31edb57a52 --- /dev/null +++ b/input/regression/magnifyMusic-slurs.ly @@ -0,0 +1,27 @@ +\version "2.19.8" + +\header { + texidoc = "Slurs should be scaled along with notation size when +using the @code{\magnifyMusic} command. They can get thicker than +the default, but not thinner." +} + +\score { + \new Voice { + \omit Staff.TimeSignature + \time 7/8 + << + { \repeat unfold 7 \relative { g'32[( a b c)] } } + { + \magnifyMusic 0.50 s8 + \magnifyMusic 0.63 s + \magnifyMusic 0.80 s + \magnifyMusic 1.00 s + \magnifyMusic 1.26 s + \magnifyMusic 1.59 s + \magnifyMusic 2.00 s + } + >> + } + \addlyrics { "50%" _ _ "100%" _ _ "200%" } +} diff --git a/input/regression/magnifyMusic-stem-beam-spacing.ly b/input/regression/magnifyMusic-stem-beam-spacing.ly new file mode 100644 index 0000000000..135cfd9e8d --- /dev/null +++ b/input/regression/magnifyMusic-stem-beam-spacing.ly @@ -0,0 +1,32 @@ +\version "2.19.8" + +\header { + texidoc = "Stem length/thickness, beam spacing/thickness, and +horizontal spacing should be scaled along with notation size when +using the @code{\magnifyMusic} command. Stems can get thicker +than the default, but not thinner." +} + +\score { + \new Voice { + \omit Staff.TimeSignature + \time 7/8 + << + { \repeat unfold 7 \relative { g'32[ a b c] } } + { + \magnifyMusic 0.50 s8 + \magnifyMusic 0.63 s + \magnifyMusic 0.80 s + \magnifyMusic 1.00 s + \magnifyMusic 1.26 s + \magnifyMusic 1.59 s + \magnifyMusic 2.00 s + } + >> + } + \addlyrics { + "50%" _ _ _ _ _ _ _ _ _ _ _ + "100%" _ _ _ _ _ _ _ _ _ _ _ + "200%" _ _ _ + } +} diff --git a/input/regression/magnifyMusic-tablature-double-stems.ly b/input/regression/magnifyMusic-tablature-double-stems.ly new file mode 100644 index 0000000000..35cef695fb --- /dev/null +++ b/input/regression/magnifyMusic-tablature-double-stems.ly @@ -0,0 +1,20 @@ +\version "2.19.11" + +\header { + texidoc = "Tablature half-note double-stems should be scaled along +with notation size when using the @code{\magnifyMusic} command." +} + +<< + \new TabVoice = "tabvoice" { + \tabFullNotation + \magnifyMusic 0.5 { c4 c2 c4 } + c4 c2 c4 + \magnifyMusic 2.0 { c4 c2 c4 } + } + \new Lyrics \lyricsto "tabvoice" { + "50%" _ _ + "100%" _ _ + "200%" _ _ + } +>> diff --git a/input/regression/magnifyMusic-text-interface.ly b/input/regression/magnifyMusic-text-interface.ly new file mode 100644 index 0000000000..3ab2b70bfc --- /dev/null +++ b/input/regression/magnifyMusic-text-interface.ly @@ -0,0 +1,22 @@ +\version "2.19.11" + +\header { + texidoc = "All text-interface grobs should have +@w{@code{baseline-skip}} and @w{@code{word-space}} values scaled +along with notation size when using the @code{\magnifyMusic} +command." +} + +music = { + b'1^\markup { + \center-column { a c } + \center-column { b d } + } +} + +{ + \override TextScript.baseline-skip = #2 + \magnifyMusic 0.5 \music + \music + \magnifyMusic 2.0 \music +} diff --git a/input/regression/magnifyMusic-ties.ly b/input/regression/magnifyMusic-ties.ly new file mode 100644 index 0000000000..76d98fc47a --- /dev/null +++ b/input/regression/magnifyMusic-ties.ly @@ -0,0 +1,47 @@ +\version "2.19.8" + +\header { + texidoc = "Ties should be scaled along with notation size when +using the @code{\magnifyMusic} command. They can get thicker than +the default, but not thinner." +} + +template = { + \omit Staff.TimeSignature + \time 7/8 + \magnifyMusic 0.50 s8 + \magnifyMusic 0.63 s + \magnifyMusic 0.80 s + \magnifyMusic 1.00 s + \magnifyMusic 1.26 s + \magnifyMusic 1.59 s + \magnifyMusic 2.00 s +} + +\score { + \new StaffGroup << + \new Staff \new Voice = "upper" << + \template + \repeat unfold 7 { g'32[~ g' a'~ a'] } + >> + \new Staff \new Voice << + \template + \repeat unfold 7 { \tieUp g'32[~ g' a'~ a'] } + >> + \new Lyrics \with { + \override VerticalAxisGroup.staff-affinity = #DOWN + } \lyricsto "upper" { + "50%" _ _ _ _ _ "100%" _ _ _ _ _ " 200%" + } + \new Staff \new Voice << + \clef bass + \template + \repeat unfold 7 { f32[~ f e~ e] } + >> + \new Staff \new Voice << + \clef bass + \template + \repeat unfold 7 { \tieDown f32[~ f e~ e] } + >> + >> +} diff --git a/input/regression/magnifyStaff-bar-lines.ly b/input/regression/magnifyStaff-bar-lines.ly new file mode 100644 index 0000000000..c457b78a02 --- /dev/null +++ b/input/regression/magnifyStaff-bar-lines.ly @@ -0,0 +1,33 @@ +\version "2.19.22" + +\header { + texidoc = "Bar line thickness and spacing should be scaled along +with notation size when using the @code{\magnifyStaff} command." +} + +\paper { + score-system-spacing = #'((padding . 4)) +} + +example = +#(define-music-function (mag) (positive?) + #{ + \new Staff \with { + \magnifyStaff #mag + instrumentName = \markup { + \fontsize #(+ 3 (- (magnification->font-size mag))) + #(format #f "~,2f" mag) + } + } { + \omit Staff.Clef + \omit Staff.TimeSignature + s4 \bar "|" + s4 \bar ":|.|:" + s4 \bar ":|.S.|:" + s4 \bar "|." + } + #}) + +\example 0.50 +\example 1.00 +\example 2.00 diff --git a/input/regression/magnifyStaff-dots-beamlets.ly b/input/regression/magnifyStaff-dots-beamlets.ly new file mode 100644 index 0000000000..e4dd1f7a5b --- /dev/null +++ b/input/regression/magnifyStaff-dots-beamlets.ly @@ -0,0 +1,21 @@ +\version "2.19.11" + +\header { + texidoc = "Dot size and beamlet length should be scaled along +with notation size when using the @code{\magnifyStaff} command." +} + +music = { a'8.[ a'16] } +{ + \magnifyStaff 0.50 \music \music \bar "|" + \magnifyStaff 0.71 \music \bar "|" + \magnifyStaff 1.00 \music \bar "|" + \magnifyStaff 1.41 \music \bar "|" + \magnifyStaff 2.00 \music \bar "|" +} \addlyrics { + "0.50 " _ _ _ + "0.71 " _ + "1.00 " _ + "1.41 " _ + "2.00 " _ +} diff --git a/input/regression/magnifyStaff-space-alist.ly b/input/regression/magnifyStaff-space-alist.ly new file mode 100644 index 0000000000..731bea8e4e --- /dev/null +++ b/input/regression/magnifyStaff-space-alist.ly @@ -0,0 +1,38 @@ +\version "2.19.22" + +\header { + texidoc = "@code{space-alist} values should be scaled along +with notation size when using the @code{\magnifyStaff} command." +} + +\paper { + indent = 0 + ragged-right = ##t + system-system-spacing = #'((padding . 3)) + score-markup-spacing = #'((padding . 6)) +} + +example = +#(define-music-function (mag) (positive?) + #{ + \new Staff \with { + \magnifyStaff #mag + \consists "Custos_engraver" + \override Custos.style = #'mensural + } \new Voice \with { + \consists "Ambitus_engraver" + } { + \omit Score.BarNumber + \key d \major + d''2 \breathe d'' | + \break + g'1 | + \clef treble + \key c \major + g'1 | + } + #}) + +\markup "0.50:" \example 0.50 +\markup "1.00:" \example 1.00 +\markup "2.00:" \example 2.00 diff --git a/input/regression/magnifyStaff-staff-line-thickness.ly b/input/regression/magnifyStaff-staff-line-thickness.ly new file mode 100644 index 0000000000..4ff9568d55 --- /dev/null +++ b/input/regression/magnifyStaff-staff-line-thickness.ly @@ -0,0 +1,21 @@ +\version "2.19.11" + +\header { + texidoc = "Staff line thickness should be scaled along with +staff size when using the @code{\magnifyStaff} command. Staff +lines can get thicker than the default, but not thinner." +} + +{ + \magnifyStaff 0.50 b'1 + \magnifyStaff 0.71 b'1 + \magnifyStaff 1.00 b'1 + \magnifyStaff 1.41 b'1 + \magnifyStaff 2.00 b'1 +} \addlyrics { + " 0.50 " + " 0.71 " + " 1.00 " + " 1.41 " + " 2.00 " +} diff --git a/input/regression/magnifyStaff-tablature-double-stems.ly b/input/regression/magnifyStaff-tablature-double-stems.ly new file mode 100644 index 0000000000..651054fa25 --- /dev/null +++ b/input/regression/magnifyStaff-tablature-double-stems.ly @@ -0,0 +1,20 @@ +\version "2.19.11" + +\header { + texidoc = "Tablature half-note double-stems should be scaled along +with notation size when using the @code{\magnifyStaff} command." +} + +<< + \new TabVoice = "tabvoice" { + \tabFullNotation + \magnifyStaff 0.5 c4 c2 c4 + \magnifyStaff 1.0 c4 c2 c4 + \magnifyStaff 2.0 c4 c2 c4 + } + \new Lyrics \lyricsto "tabvoice" { + "50%" _ _ + "100%" _ _ + "200%" _ _ + } +>> diff --git a/input/regression/magnifyStaff-text-interface.ly b/input/regression/magnifyStaff-text-interface.ly new file mode 100644 index 0000000000..e1fd75dca6 --- /dev/null +++ b/input/regression/magnifyStaff-text-interface.ly @@ -0,0 +1,37 @@ +\version "2.19.11" + +\header { + texidoc = "All text-interface grobs that are within the Staff +context should have @w{@code{baseline-skip}} and +@w{@code{word-space}} values scaled along with notation size when +using the @code{\magnifyStaff} command." +} + +\paper { + line-width = 60 + ragged-right = ##f + score-system-spacing = #'((padding . 3)) +} + +\layout { + \context { + \Staff + \override TextScript.baseline-skip = 2 + \override InstrumentName.baseline-skip = 2 + \override InstrumentName.self-alignment-X = 0.75 + } +} + +abcd = \markup { + \center-column { a c } + \center-column { b d } +} + +music = { + \set Staff.instrumentName = \markup \abcd + b'1^\markup \abcd +} + +\new Staff { \magnifyStaff 0.5 \music } +\new Staff { \magnifyStaff 1.0 \music } +\new Staff { \magnifyStaff 2.0 \music } diff --git a/input/regression/make-relative-copies.ly b/input/regression/make-relative-copies.ly index 0947e72eac..7f28075f9a 100644 --- a/input/regression/make-relative-copies.ly +++ b/input/regression/make-relative-copies.ly @@ -1,4 +1,4 @@ -\version "2.17.97" +\version "2.19.22" \header { texidoc = "@code{make-relative} has to copy its argument expressions @@ -14,7 +14,7 @@ identical." } reltranspose = -#(define-music-function (parser location from to music) +#(define-music-function (from to music) (ly:pitch? ly:pitch? ly:music?) (make-relative (music) music #{ \transpose #from #to $music #})) diff --git a/input/regression/make-relative-music.ly b/input/regression/make-relative-music.ly index 25941d290c..ef8baf4ae1 100644 --- a/input/regression/make-relative-music.ly +++ b/input/regression/make-relative-music.ly @@ -1,4 +1,4 @@ -\version "2.17.97" +\version "2.19.22" \header { texidoc = "@code{make-relative} can make relativization on music @@ -10,7 +10,7 @@ expressions. This regtest defines an example function } withOctave = -#(define-music-function (parser location music) +#(define-music-function (music) (ly:music?) (make-relative (music) music diff --git a/input/regression/make-relative.ly b/input/regression/make-relative.ly index 362a283fcd..ee458b57a7 100644 --- a/input/regression/make-relative.ly +++ b/input/regression/make-relative.ly @@ -1,4 +1,4 @@ -\version "2.17.97" +\version "2.19.22" \header { texidoc = "@code{make-relative} is a Scheme utility macro mainly @@ -14,7 +14,7 @@ The fragment should appear identical in both cases." \layout { ragged-right= ##t } ph = -#(define-music-function (parser location p1 p2 p3 p4 p5) +#(define-music-function (p1 p2 p3 p4 p5) (ly:pitch? ly:pitch? ly:pitch? ly:pitch? ly:pitch?) (make-relative (p1 p2 p3 p4 p5) (make-event-chord (list p1 p2 p3 p4 p5)) #{ @@ -32,16 +32,16 @@ ph = \ph d a d' fis' c'' \oneVoice R1*21 \voiceTwo | \skip 1*21 | R1*21 | \ph c, c g bes e' - c,2~ c, | r16 c8. ~ c4 ~ c2 + c,2~ 2 | r16 c8. ~ 4 ~ 2 | r8 f16 a c' f' c' a c' a f a f d f d | - c,2~ c, | r16 b,8. ~ b,4 ~ b,2 + c,2~ 2 | r16 b,8. ~ 4 ~ 2 | r8 g'16 b' d'' f'' d'' b' d'' b' g' b' d' f' e' d' | c,1\fermata | c1 | 1\fermata \bar "|." | } \score { - \new PianoStaff << - \compressFullBarRests + \new PianoStaff + \compressMMRests << \new Staff = "up" { << \high \\ \middle >> } @@ -61,16 +61,16 @@ ph = \ph d, a' d fis c' \oneVoice R1*21 \voiceTwo | \skip 1*21 | R1*21 | \ph c, c' g' bes e - c2~ c | r16 c'8. ~ c4 ~ c2 + c2~ 2 | r16 c'8. ~ 4 ~ 2 | r8 f16 a c f c' a c a f a f d f d | - c,,2~ c | r16 b'8. ~ b4 ~ b2 + c,,2~ 2 | r16 b'8. ~ 4 ~ 2 | r8 g'16 b d f d b d b g b d f e d | c,,1\fermata | c'1 | 1\fermata \bar "|." | } \score { - \new PianoStaff << - \compressFullBarRests + \new PianoStaff + \compressMMRests << \new Staff = "up" { << \high \\ \middle >> } diff --git a/input/regression/markup-compound-meter.ly b/input/regression/markup-compound-meter.ly new file mode 100644 index 0000000000..2a8a853f50 --- /dev/null +++ b/input/regression/markup-compound-meter.ly @@ -0,0 +1,28 @@ +\version "2.19.16" + +\header { + texidoc = "The @code{\\compound-meter} markup command can produce various kinds of numeric time signature." +} + +\markup { + \vspace #2 + These are conventional time signatures: + \compound-meter #3 + \compound-meter #'(3 . 4) + \compound-meter #'(4 4) + (Aren't they pretty?) +} + +\markup { + \vspace #2 + This is single-digit compound time signature: + \compound-meter #'((2) (3)) + (Isn't it pretty?) +} + +\markup { + \vspace #2 + This is an unusual time signature: + \compound-meter #'((6.22e23 1) (-4 . 3) (3.14) (9876 5432 0) (-1)) + (Isn't it pretty?) +} diff --git a/input/regression/markup-cyclic-reference.ly b/input/regression/markup-cyclic-reference.ly index 9ca834b542..82bfe0641d 100644 --- a/input/regression/markup-cyclic-reference.ly +++ b/input/regression/markup-cyclic-reference.ly @@ -1,7 +1,7 @@ -\version "2.16.0" +\version "2.19.13" #(ly:set-option 'warning-as-error #f) -#(ly:expect-warning (ly:translate-cpp-warning-scheme "Cyclic markup detected: %s") 'cycle-markup) -#(ly:expect-warning (ly:translate-cpp-warning-scheme "Cyclic markup detected: %s") 'cycleI-markup) +#(ly:expect-warning (ly:translate-cpp-warning-scheme "Markup depth exceeds maximal value of %d; Markup: %s") 1024 'cycle-markup) +#(ly:expect-warning (ly:translate-cpp-warning-scheme "Markup depth exceeds maximal value of %d; Markup: %s") 1024 'cycleI-markup) \header { texidoc = "Cyclic markup definitions should cause a warning, but diff --git a/input/regression/markup-first-visible.ly b/input/regression/markup-first-visible.ly new file mode 100644 index 0000000000..bba748cd93 --- /dev/null +++ b/input/regression/markup-first-visible.ly @@ -0,0 +1,87 @@ +\version "2.19.16" + +\header { + texidoc = "The markup command @code{\\first-visible} uses the first argument that produces a non-empty stencil and ignores the rest. + +The expected markup on this score is \"Lame Songs for Testing\" followed by a \"C\" time signature symbol." + + publication = "Lame Songs for Testing" +} + +#(ly:expect-warning "Cannot find glyph nonesuch-1") +#(ly:expect-warning "Cannot find glyph nonesuch-2") + +\paper { + scoreTitleMarkup = \markup { + \first-visible { + \musicglyph #"nonesuch-1" + \fromproperty #'header:composer + \italic \fromproperty #'header:publication + } + \first-visible { + \musicglyph #"timesig.C44" + \musicglyph #"this should not be attempted" + } + } +} + +\score { f' } + +\markup { + No elements: \first-visible {} +} + +\markup { + One element (expect 111): \first-visible { 111 } +} + +\markup { + Single markup list (expect aaa): + \first-visible \column-lines { + \musicglyph #"nonesuch-2" + "" + aaa + bbb + } +} + +\markup { + Multiple markup lists (expect ccc): + \first-visible { + \column-lines { } + \column-lines { ccc ddd } + \column-lines { eee } + } +} + +\markup { + Mixed markup and markup lists (expect fff): + \first-visible { + "" + \column-lines { } + \normal-text fff + \column-lines { ggg hhh } + iii + } +} + +\markup { + Nested markup lists (expect jjj): + \first-visible { + \column-lines { + \column-lines { + \column-lines { + "" + } + } + } + \column-lines { + \column-lines { + \column-lines { + jjj + } + } + } + kkk + } +} diff --git a/input/regression/markup-line-styles.ly b/input/regression/markup-line-styles.ly index 5cbf5edae4..aa718e4f5c 100644 --- a/input/regression/markup-line-styles.ly +++ b/input/regression/markup-line-styles.ly @@ -1,13 +1,15 @@ -\version "2.17.10" +\version "2.19.22" \header { - texidoc = "The markup-commands @code{\\draw-dashed-line} and - @code{\\draw-dotted-line} should print the same visual length as - @code{\\draw-line}." + texidoc = "The markup-commands @code{\\draw-dashed-line}, + @code{\\draw-dotted-line} and @code{\\draw-squiggle-line} should print the + same visual length as @code{\\draw-line}. + Also testing possible overrides for @code{\\draw-squiggle-line}" } +%% draw-dotted-line and draw-dashed-line test = -#(define-scheme-function (parser location x-nmbr y-nmbr)(number? number?) +#(define-scheme-function (x-nmbr y-nmbr)(number? number?) (let* ((lst (map (lambda (x) (let* ((x-lngth (if (positive? x-nmbr) @@ -57,4 +59,71 @@ test = (iota (abs x-nmbr))))) lst)) +%% draw-squiggle-line +mrkp = +\markup + \override #'(word-space . 2) + \column { + \line { \draw-squiggle-line #0.5 #'(6 . 0) ##t \tiny \vcenter "default" } + \line { + \override #'(orientation . -1) \draw-squiggle-line #0.5 #'(6 . 0) ##t + \tiny \vcenter "different orientation" + } + \line { + \draw-squiggle-line #0.5 #'(6 . 0) ##f + \tiny \vcenter "\"eq-end?\" set #f" + } + \line { + \override #'(height . 1) \draw-squiggle-line #0.5 #'(6 . 0) ##t + \tiny \vcenter "different height" + } + \line { + \override #'(thickness . 5) \draw-squiggle-line #0.5 #'(6 . 0) ##t + \tiny \vcenter "different thickness" + } + \line { + \override #'(angularity . 2) \draw-squiggle-line #0.5 #'(6 . 0) ##t + \tiny \vcenter "different angularity" + } + } + +test-draw-squiggle-line = +#(define-scheme-function (steps) (integer?) +;; Puts out a markup combining draw-line-markup and draw-squiggle-line-markup +;; in a helix-like mannor + (define (val-pts-list steps) + ;; Puts out a list, with each element being a pair of a numerical value + ;; and a number-pair + ;; The numerical value is used for first-bow-length and its height + ;; The number-pair is the destination-point of the line. + ;; Those points are on a simple helix around '(0 . 0) + (map + (lambda (n r) + (let* ((y (* (sin n) r)) + (x (* (cos n) r))) + (if (< (abs x) 0.00001) + (set! x 0)) + (if (< (abs y) 0.00001) + (set! y 0)) + (cons (max 0.1 (- 0.5 (/ 1 r))) (cons x y )))) + (iota steps 0 (/ TWO-PI steps)) + (iota steps 3 0.5))) + + (let ((args + (map + (lambda (arg) + #{ + \markup + \combine + \draw-line $(cdr arg) + \override #`(height . , (car arg)) + \draw-squiggle-line + #(car arg) + $(cdr arg) ##f + #}) + (val-pts-list steps)))) + #{ \markup { \hspace #10 \overlay $args \hspace #5 \vcenter \mrkp } #})) + \test #15 #0 + +\test-draw-squiggle-line #12 #10 diff --git a/input/regression/markup-map.ly b/input/regression/markup-map.ly new file mode 100644 index 0000000000..dfa6984203 --- /dev/null +++ b/input/regression/markup-map.ly @@ -0,0 +1,19 @@ +\version "2.19.26" + +\header { + texidoc = "@code{\\markupMap} can be used for applying a markup function +to music properties throughout a music expressions, like the @code{text} of +all contained lyric events." +} + +\layout { ragged-right = ##t } + +\new Voice +\markupMap TextScriptEvent.text + #italic-markup +{ g'2^"See" c''^"this?" } +\addlyrics { + \markupMap text + \markup \fontsize #5 \with-color #red \rotate #30 \etc + { Oh yes! } +} diff --git a/input/regression/markup-music-glyph.ly b/input/regression/markup-music-glyph.ly index 4dda8b1754..9e3051c926 100644 --- a/input/regression/markup-music-glyph.ly +++ b/input/regression/markup-music-glyph.ly @@ -11,7 +11,7 @@ For unknown glyphs, we print a warning." { c'^\markup { - \override #'(font-name . "Sans") { + \override #'(font-name . "LilyPond Sans Serif") { c'est un B \flat \musicglyph #"UNKNOWN-GLYPH" } % to get \flat, do: diff --git a/input/regression/markup-note-dot.ly b/input/regression/markup-note-dot.ly index ea2fd05b9d..4d41fa93c5 100644 --- a/input/regression/markup-note-dot.ly +++ b/input/regression/markup-note-dot.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " A dotted whole note displayed via the @code{\\note} @@ -6,8 +6,8 @@ } -\relative c' { - c4^\markup { \note #"1." #1 } +\relative { + c'4^\markup { \note #"1." #1 } c4^\markup { \note #"2." #1 } c4^\markup { \note #"8." #1 } } diff --git a/input/regression/markup-note-styles.ly b/input/regression/markup-note-styles.ly index f5fbc9b60d..316a87c2a6 100644 --- a/input/regression/markup-note-styles.ly +++ b/input/regression/markup-note-styles.ly @@ -1,14 +1,15 @@ -\version "2.17.19" +\version "2.19.35" \header { texidoc = "@code{\\note-by-number} and @code{\\note} support -all note head styles and straight flags." +all note head styles and all flag styles (default, straight, flat, mensural)." } #(define styles-list '(default altdefault baroque neomensural mensural petrucci + semipetrucci blackpetrucci harmonic harmonic-black harmonic-mixed diamond cross xcircle @@ -35,6 +36,8 @@ all note head styles and straight flags." '(-3 -2 -1 0 1 2 3 4 5 6)))))))) styles)))) +%% Testing all combinations of note-head/flag-styles would be too much +%% Thus, limited examples \markup { \column { \combine \null \vspace #1 @@ -49,7 +52,7 @@ all note head styles and straight flags." \combine \null \vspace #1 \underline "Modern-straight-flag:" \override #'(flag-style . modern-straight-flag) - \show-note-styles #'(default) + \show-note-styles #'(default mensural) } } @@ -70,3 +73,12 @@ all note head styles and straight flags." \show-note-styles #'(default) } } + +\markup { + \column { + \combine \null \vspace #1 + \underline "default-flag:" + \override #'(flag-style . default) + \show-note-styles #'(default mensural) + } +} diff --git a/input/regression/markup-note.ly b/input/regression/markup-note.ly index c600fab42f..11e993c134 100644 --- a/input/regression/markup-note.ly +++ b/input/regression/markup-note.ly @@ -3,7 +3,7 @@ texidoc = "The note markup function may be used to make metronome markings. It works for a variety of flag, dot and duration settings." } -\version "2.17.12" +\version "2.19.21" mrkp = \markup { @@ -50,9 +50,9 @@ mrkp = } \score { - \relative c'' + \relative { - c4^\markup { + c''4^\markup { \column { \mrkp \override #'(style . mensural) \mrkp diff --git a/input/regression/markup-partial.ly b/input/regression/markup-partial.ly new file mode 100644 index 0000000000..f0759d26ed --- /dev/null +++ b/input/regression/markup-partial.ly @@ -0,0 +1,19 @@ +\version "2.19.34" + +\header { + texidoc = "Partial markups acts as a chain of markup +commands where everything but some arguments of the final markup +command has already been supplied." +} + +\layout { ragged-right = ##t } + +bold-red-markup = \markup \bold \with-color #red \etc +italic-color-markup = \markup \italic \with-color \etc +quarter-markup = \markup \note-by-number #2 \etc + +\markup \bold-red "Bold red." +\markuplist \column-lines \bold-red { Bold red in a list. } +\markup \italic-color #green "Italic green." +\markuplist \column-lines \italic-color #green { Italic green in a list. } +\markup { 3/8: \quarter #1 #UP } diff --git a/input/regression/markup-rest-styles.ly b/input/regression/markup-rest-styles.ly index 5ed826230a..58bb24d3a0 100644 --- a/input/regression/markup-rest-styles.ly +++ b/input/regression/markup-rest-styles.ly @@ -1,4 +1,4 @@ -\version "2.17.9" +\version "2.19.22" \header { texidoc = "@code{\\rest-by-number} and @code{\\rest} support @@ -6,7 +6,7 @@ all rest styles." } showRestStyles = -#(define-scheme-function (parser location)() +#(define-scheme-function ()() (make-override-markup (cons 'baseline-skip 7) (make-column-markup diff --git a/input/regression/markup-rest.ly b/input/regression/markup-rest.ly index 3c4895df9d..4c05e960f7 100644 --- a/input/regression/markup-rest.ly +++ b/input/regression/markup-rest.ly @@ -1,4 +1,4 @@ -\version "2.17.19" +\version "2.19.22" \header { texidoc = "The rest markup function works for a variety of style, dot and @@ -6,7 +6,7 @@ duration settings." } showSimpleRest = -#(define-scheme-function (parser location dots) (string?) +#(define-scheme-function (dots) (string?) (make-override-markup (cons 'baseline-skip 7) (make-column-markup @@ -45,7 +45,7 @@ showSimpleRest = kievan))))) showMultiMeasureRests = -#(define-scheme-function (parser location)() +#(define-scheme-function ()() (make-override-markup (cons 'baseline-skip 7) (make-column-markup diff --git a/input/regression/markup-score-multi-system.ly b/input/regression/markup-score-multi-system.ly index c0a9971bed..a40f040adc 100644 --- a/input/regression/markup-score-multi-system.ly +++ b/input/regression/markup-score-multi-system.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "\\markup \\score displays all systems. Spacing between @@ -10,8 +10,8 @@ \markup { \override #'(baseline-skip . 10) \score { - \new Staff \relative c' { - c4 d e f \break + \new Staff \relative { + c'4 d e f \break g1 } \layout { diff --git a/input/regression/markup-score.ly b/input/regression/markup-score.ly index ffac9f2e68..4b00e72aa2 100644 --- a/input/regression/markup-score.ly +++ b/input/regression/markup-score.ly @@ -2,7 +2,7 @@ texidoc = "Use \\score block as markup command." } -\version "2.17.11" +\version "2.19.21" tuning = \markup { \score { @@ -22,9 +22,9 @@ tuning = \markup { subsubtitle = \markup { "Originalstimmung:" \tuning } } -\relative c'' { +\relative { \time 4/8 - \tuplet 3/2 { c8 d e } \tuplet 3/2 {c d e} + \tuplet 3/2 { c''8 d e } \tuplet 3/2 {c d e} \tuplet 3/2 { c8 d e } \tuplet 3/2 {c d e} g8 a8 g8 a g8 a8 g8 a diff --git a/input/regression/markup-syntax.ly b/input/regression/markup-syntax.ly index dc56d260ac..1350a2447c 100644 --- a/input/regression/markup-syntax.ly +++ b/input/regression/markup-syntax.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.32" \header { texidoc = "Demo of markup texts, using LilyPond syntax." diff --git a/input/regression/measure-grouping.ly b/input/regression/measure-grouping.ly index 5fa0b8723b..5e27084142 100644 --- a/input/regression/measure-grouping.ly +++ b/input/regression/measure-grouping.ly @@ -7,7 +7,7 @@ brackets above beats when the beats of a time signature are grouped. " } -\version "2.16.0" +\version "2.19.40" \layout { ragged-right = ##t @@ -19,14 +19,14 @@ brackets above beats when the beats of a time signature are grouped. " \consists "Measure_grouping_engraver" } -\relative c' { +\relative { \time 2/4 - c8 a'4 a8~ - \time #'(3 2) 5/8 + c'8 a'4 a8~ + \time 3,2 5/8 a8 bes4 r8 bes8-> \time 2/4 c,8 g'4 g8~ - \time #'(3 2) 5/8 + \time 3,2 5/8 g8 a4 g a4.-> } diff --git a/input/regression/metronome-mark-formatter.ly b/input/regression/metronome-mark-formatter.ly new file mode 100644 index 0000000000..a288c91ced --- /dev/null +++ b/input/regression/metronome-mark-formatter.ly @@ -0,0 +1,113 @@ +\version "2.17.27" + +\header { + texidoc = "@code{metronomeMarkFormatter} supports +all note head styles and flags styles. Setting @code{font-name} for +@code{MetronomeMark} does not disturb the glyphs for note-head and flag. +" +} + +\paper { + ragged-right = ##f + indent = 30 +} + +mus = +\relative c'' { + \tempo "Allegro" 8=120-140 + a8 b c d a b c d + + % A comma is required + % for font name "Times New Roman"'s explicit termination. + % If there is no comma, Pango interpret "Times New Roman" as + % "Times New" family with "Roman" style. + \override Score.MetronomeMark.font-name = "Times New Roman," + \tempo "Allegro" 8=140 + a b c d a b c d +} + +%% Some Examples: +\score { + \new Staff + \with { + instrumentName = "default" + } + \mus + \layout {} +} + +\score { + \new Staff + \with { + instrumentName = + \markup \column { "default-note-head" "old-straight-flag" } + } + \mus + \layout { + \context { + \Score + \override MetronomeMark.flag-style = #'old-straight-flag + } + } +} + +\score { + \new Staff + \with { + instrumentName = + \markup \column { "default-note-head" "modern-straight-flag" } + } + \mus + \layout { + \context { + \Score + \override MetronomeMark.flag-style = #'modern-straight-flag + } + } +} + +\score { + \new Staff + \with { + instrumentName = + \markup \column { "default-note-head" "flat-flag" } + } + \mus + \layout { + \context { + \Score + \override MetronomeMark.flag-style = #'flat-flag + } + } +} + +\score { + \new Staff + \with { + instrumentName = + \markup \column { "diamond-note-head" "modern-straight-flag" } + } + \mus + \layout { + \context { + \Score + \override MetronomeMark.style = #'diamond + \override MetronomeMark.flag-style = #'modern-straight-flag + } + } +} + +\score { + \new MensuralStaff + \with { + instrumentName = + \markup \column { "mensural-note-head" "mensural-flag" } + } + \mus + \layout { + \context { + \Score + \override MetronomeMark.style = #'mensural + } + } +} diff --git a/input/regression/metronome-mark-loose-column.ly b/input/regression/metronome-mark-loose-column.ly index deca81dd52..0abd414625 100644 --- a/input/regression/metronome-mark-loose-column.ly +++ b/input/regression/metronome-mark-loose-column.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Metronome marks aligned on notes do not interfere with @@ -9,13 +9,13 @@ the second note in the lower staff." \score { << - \new Staff \relative c' { - c8 c c c + \new Staff \relative { + c'8 c c c \tempo 4 = 60 c2 } - \new Staff \relative c' { - c2 \clef bass c2 + \new Staff \relative { + c'2 \clef bass c2 } >> \layout { diff --git a/input/regression/metronome-marking-align-order.ly b/input/regression/metronome-marking-align-order.ly index 21410c6e6c..e2ed15d299 100644 --- a/input/regression/metronome-marking-align-order.ly +++ b/input/regression/metronome-marking-align-order.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Metronome marks respect symbol order in @@ -16,12 +16,12 @@ measure. ragged-right = ##t } -\relative c' { +\relative { \override Staff.KeySignature.break-align-anchor-alignment = #LEFT \override Score.MetronomeMark.break-align-symbols = #'(time-signature key-signature) \key c \minor \tempo "Time" - c1 + c'1 \key as \major \tempo "Key" c1 diff --git a/input/regression/metronome-marking-break-align.ly b/input/regression/metronome-marking-break-align.ly index 90e99212b8..e8275d2176 100644 --- a/input/regression/metronome-marking-break-align.ly +++ b/input/regression/metronome-marking-break-align.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "@code{\\tempo} marks are aligned with the time signature @@ -16,9 +16,9 @@ with the preceding bar line. line-width = 50\mm } -\relative c' { +\relative { \tempo "T-first" - c1 + c'1 \mark \default \tempo "T-note" c1 \break diff --git a/input/regression/metronome-parenthesized.ly b/input/regression/metronome-parenthesized.ly index f4c3f8cd26..d2740a5217 100644 --- a/input/regression/metronome-parenthesized.ly +++ b/input/regression/metronome-parenthesized.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc=" @@ -6,9 +6,9 @@ Using an empty text in the metronome marks, one can generate parenthesized tempo " } -\relative c'' { +\relative { \tempo 4=60 - c1 + c''1 \tempo "" 4=80 c1 } diff --git a/input/regression/metronome-text.ly b/input/regression/metronome-text.ly index 2dacf798c0..2f02d1c141 100644 --- a/input/regression/metronome-text.ly +++ b/input/regression/metronome-text.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc=" @@ -7,8 +7,8 @@ The tempo command supports text markup and/@/or `duration=count'. Using " } -\relative c'' { - \tempo "Allegro" c1 +\relative { + \tempo "Allegro" c''1 \tempo "Allegro" c1 $(make-event-chord (list (make-music 'TempoChangeEvent 'text "blah"))) diff --git a/input/regression/midi-dynamics.ly b/input/regression/midi-dynamics.ly index 05f0b9b282..05280c9e44 100644 --- a/input/regression/midi-dynamics.ly +++ b/input/regression/midi-dynamics.ly @@ -5,14 +5,14 @@ } -\version "2.16.0" +\version "2.19.21" \score { - \relative c' { + \relative { \set midiMinimumVolume = #0.0 \set midiMaximumVolume = #1.0 - c\ff c\pppp + c'\ff c\pppp c\ff\> c c c c\!\pppp c\< c c c c\! \ff diff --git a/input/regression/midi-grace-after-rest.ly b/input/regression/midi-grace-after-rest.ly new file mode 100644 index 0000000000..9931356e4d --- /dev/null +++ b/input/regression/midi-grace-after-rest.ly @@ -0,0 +1,14 @@ +\header { + texidoc = "Grace notes shorten previous notes only if they'd overlap +them. The A should be a full quarter note, but the C should be shortened +to 1/4 - 9/40 * 1/8 = 71/320 (rounded down to 340/384 in MIDI)." +} +\version "2.19.21" +\score { + \relative { + a4 r + \grace b8 c8... r64 + \grace d8 e4 + } + \midi { } +} diff --git a/input/regression/midi-grace-after-tie.ly b/input/regression/midi-grace-after-tie.ly index 6aca01bc1e..ead10bf793 100644 --- a/input/regression/midi-grace-after-tie.ly +++ b/input/regression/midi-grace-after-tie.ly @@ -5,9 +5,9 @@ % https://code.google.com/p/lilypond/issues/detail?id=3091 } -\version "2.16.0" +\version "2.19.21" \score { - \relative c' { + \relative { % This first b~ tie should be honoured in the MIDI output: a2. b4~ % i.e. this b8 must not be sounded: diff --git a/input/regression/midi-grace.ly b/input/regression/midi-grace.ly index eb06b5e83b..8fdb7c330e 100644 --- a/input/regression/midi-grace.ly +++ b/input/regression/midi-grace.ly @@ -5,10 +5,10 @@ off will appear at tick 768 (2 * 384)." } -\version "2.16.0" +\version "2.19.21" \score { - \relative c' { - c4 + \relative { + c'4 \grace { b8 } d4 } diff --git a/input/regression/midi-key-signature.ly b/input/regression/midi-key-signature.ly index 89989f2529..73d1f92493 100644 --- a/input/regression/midi-key-signature.ly +++ b/input/regression/midi-key-signature.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "MIDI key signatures are output, using an approximate key signature if MIDI format cannot represent the true key signature" @@ -6,9 +6,9 @@ key signature if MIDI format cannot represent the true key signature" \include "arabic.ly" \score { - \relative do' { + \relative { \key fa \bayati - fa4 solsb lab sib + fa'4 solsb lab sib } \midi { } \layout { } diff --git a/input/regression/midi-lyric-barcheck.ly b/input/regression/midi-lyric-barcheck.ly index 16c658e1e9..8c6e4c070f 100644 --- a/input/regression/midi-lyric-barcheck.ly +++ b/input/regression/midi-lyric-barcheck.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.2" \header { texidoc = "Lyrics in MIDI are aligned to ties and beams: @@ -12,12 +12,12 @@ this examples causes no bar checks in MIDI. <<\relative c'' \new Voice = A { \autoBeamOff c8[ c] c2. - c1~c4 c2. + c1~4 c2. c4 ( d e) d c1 } - \lyricsto "A" \lyrics { bla bla | bla bla | bla bla | bla } + \new Lyrics \lyricsto "A" { bla bla | bla bla | bla bla | bla } >> \layout {} \midi {} diff --git a/input/regression/midi-microtone-off.ly b/input/regression/midi-microtone-off.ly index abcd7547fa..c7125f6c82 100644 --- a/input/regression/midi-microtone-off.ly +++ b/input/regression/midi-microtone-off.ly @@ -4,12 +4,12 @@ the next (possibly grace) note. " } -\version "2.16.0" +\version "2.19.21" \score { - \relative c' { + \relative { a geseh \acciaccatura a geseh } diff --git a/input/regression/midi-pedal.ly b/input/regression/midi-pedal.ly index a35fb5d9e9..e7bf33e1e7 100644 --- a/input/regression/midi-pedal.ly +++ b/input/regression/midi-pedal.ly @@ -5,12 +5,12 @@ } -\version "2.16.0" +\version "2.19.21" \score { - \relative c' { + \relative { { - { c16 e g c } + { c'16 e g c } { c,16\sustainOn e g c\sustainOff } { c,16\unaCorda e g c\treCorde } diff --git a/input/regression/midi-scales.ly b/input/regression/midi-scales.ly index 9c46fd1934..1215e44729 100644 --- a/input/regression/midi-scales.ly +++ b/input/regression/midi-scales.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" % candidate for regression. -gp \header { texidoc="Converting LilyPond input to MIDI and then again back with @@ -27,7 +27,7 @@ %} -scales = \relative c { +scales = \relative { % [INSTRUMENT_NAME] bright acoustic \key c \major % sharp-major diff --git a/input/regression/midi-tuplets.ly b/input/regression/midi-tuplets.ly index 49cda2ccc4..d564fb7c81 100644 --- a/input/regression/midi-tuplets.ly +++ b/input/regression/midi-tuplets.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = " @@ -17,7 +17,7 @@ Midi2ly tuplet test. \score { - \context Voice \relative c' { + \context Voice \relative { a1 a2 a2. a4 a4. a8 a8. a16 a16. a32 a32. a64 diff --git a/input/regression/midi-volume-equaliser.ly b/input/regression/midi-volume-equaliser.ly index fe2404bdda..d411c13c0a 100644 --- a/input/regression/midi-volume-equaliser.ly +++ b/input/regression/midi-volume-equaliser.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "@cindex Midi Volume Equaliser The full orchestra plays a note, where groups stop one after @@ -20,75 +20,75 @@ Override, see scm/midi.scm: %} -flauti = \relative c' { +flauti = \relative { \set Staff.midiInstrument = #"flute" - c1\f R1*10 + c'1\f R1*10 } -oboi = \relative c' { +oboi = \relative { \set Staff.midiInstrument = #"oboe" - R1*1 c1\f R1*9 + R1*1 c'1\f R1*9 } -clarinetti = \relative c' { +clarinetti = \relative { \set Staff.midiInstrument = #"clarinet" - R1*2 c1\f R1*8 + R1*2 c'1\f R1*8 } -fagotti = \relative c' { +fagotti = \relative { \set Staff.midiInstrument = #"bassoon" \clef bass - R1*3 c1\f R1*7 + R1*3 c'1\f R1*7 } -corni = \relative c' { +corni = \relative { \set Staff.midiInstrument = #"french horn" - R1*4 c1\f R1*6 + R1*4 c'1\f R1*6 } -trombe = \relative c' { +trombe = \relative { \set Staff.midiInstrument = #"trumpet" \clef bass - R1*5 c1\f R1*5 + R1*5 c'1\f R1*5 } -timpani = \relative c' { +timpani = \relative { \set Staff.midiInstrument = #"timpani" - R1*6 c1\f R1*4 + R1*6 c'1\f R1*4 } -violinoI = \relative c' { +violinoI = \relative { \set Staff.midiInstrument = #"violin" - R1*7 c1\f R1*3 + R1*7 c'1\f R1*3 } -violinoII = \relative c' { +violinoII = \relative { \set Staff.midiInstrument = #"violin" - R1*8 c1\f R1*2 + R1*8 c'1\f R1*2 } -viola = \relative c' { +viola = \relative { \set Staff.midiInstrument = #"viola" \clef alto - R1*9 c1\f R1*1 + R1*9 c'1\f R1*1 } -violoncello = \relative c' { +violoncello = \relative { \set Staff.midiInstrument = #"cello" %\set Staff.midiInstrument = #"contrabass" \clef bass - R1*10 c1\f + R1*10 c'1\f } diff --git a/input/regression/midi/GNUmakefile b/input/regression/midi/GNUmakefile index 682bf82db5..d6be6f62df 100644 --- a/input/regression/midi/GNUmakefile +++ b/input/regression/midi/GNUmakefile @@ -5,8 +5,8 @@ LOCALSTEPMAKE_TEMPLATES=lilypond ly lysdoc midi TEXI2HTML_FLAGS += --nomenu -TMP = $(sort $(LY_FILES) $(TEXINFO_SOURCES) ) -COLLATED_FILES = ${TMP:%.ly=$(outdir)/%-midi.ly} +TMP_FILES = $(sort $(LY_FILES) $(TEXINFO_SOURCES) ) +COLLATED_FILES = ${TMP_FILES:%.ly=$(outdir)/%-midi.ly} include $(depth)/make/stepmake.make diff --git a/input/regression/midi/crescendo-abutting.ly b/input/regression/midi/crescendo-abutting.ly new file mode 100644 index 0000000000..da0ff4ffa0 --- /dev/null +++ b/input/regression/midi/crescendo-abutting.ly @@ -0,0 +1,10 @@ +\version "2.19.44" + +\header { + texidoc="One (de)crescendo ends as the next begins." +} + +\score { + { c\< c\> c\! } + \midi {} +} diff --git a/input/regression/midi/dynamic-initial.ly b/input/regression/midi/dynamic-initial.ly new file mode 100644 index 0000000000..fca7c8ab81 --- /dev/null +++ b/input/regression/midi/dynamic-initial.ly @@ -0,0 +1,15 @@ +\version "2.19.44" + +\header { + texidoc="The MIDI performer uses a default initial dynamic" +} + +\score { + { c\< c\f } + \midi {} +} + +\score { + { c c\< c\f } + \midi {} +} diff --git a/input/regression/midi/key-initial.ly b/input/regression/midi/key-initial.ly index 9dfe77b721..c2a14ae1da 100644 --- a/input/regression/midi/key-initial.ly +++ b/input/regression/midi/key-initial.ly @@ -1,5 +1,5 @@ % Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out/initial-key.midi -\version "2.16.0" +\version "2.19.21" \layout { \context { @@ -46,7 +46,7 @@ trackA = << >> -trackBchannelA = \relative c { +trackBchannelA = \relative { \set Staff.instrumentName = "trackB:voiceA" d'4 e f g diff --git a/input/regression/midi/key-option-all-staves.ly b/input/regression/midi/key-option-all-staves.ly index 4a788566e7..51e343ff97 100644 --- a/input/regression/midi/key-option-all-staves.ly +++ b/input/regression/midi/key-option-all-staves.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Midi2ly --key works on all staves, this is G major (--key=1)" @@ -8,12 +8,12 @@ options="--key=1" \score { << \context Staff = "treble" << - \context Voice="one" \relative c'' { - fis + \context Voice="one" \relative { + fis'' } >> \context Staff = "bass" << - \context Voice="two" \relative c { + \context Voice="two" \relative { \clef bass fis } diff --git a/input/regression/midi/key-option.ly b/input/regression/midi/key-option.ly index 1978cc50c2..8028609900 100644 --- a/input/regression/midi/key-option.ly +++ b/input/regression/midi/key-option.ly @@ -1,5 +1,5 @@ % Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/option-key.midi -\version "2.16.0" +\version "2.19.21" \layout { \context { @@ -44,7 +44,7 @@ trackA = << >> -trackBchannelA = \relative c { +trackBchannelA = \relative { \set Staff.instrumentName = "trackB:voiceA" f'4 g a bes diff --git a/input/regression/midi/lyrics-addlyrics.ly b/input/regression/midi/lyrics-addlyrics.ly index 982f7da5fa..4f859b87e5 100644 --- a/input/regression/midi/lyrics-addlyrics.ly +++ b/input/regression/midi/lyrics-addlyrics.ly @@ -1,5 +1,5 @@ % Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out/initial-key.midi -\version "2.16.0" +\version "2.19.21" \layout { \context { @@ -26,10 +26,10 @@ options="" \score { << - \relative c'' { + \relative { \key g \major \time 6/8 - d4 b8 c4 a8 | d4 b8 g4 + d''4 b8 c4 a8 | d4 b8 g4 } \addlyrics { Girls and boys come | out to play, diff --git a/input/regression/midi/partcombine.ly b/input/regression/midi/partcombine.ly index 66bf3a7b1a..f4ed0cb0c4 100644 --- a/input/regression/midi/partcombine.ly +++ b/input/regression/midi/partcombine.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \layout { \context { @@ -21,17 +21,17 @@ texidoc="Partcombined music is preserved" options="--skip" } -instrumentOne = \relative c' { - c4 d e f +instrumentOne = \relative { + c'4 d e f R1 d'4 c b a b4 g2 f4 e1 } -instrumentTwo = \relative g' { +instrumentTwo = \relative { R1 - g4 a b c + g'4 a b c d c b a g f( e) d e1 diff --git a/input/regression/midi/quantize-duration-2.ly b/input/regression/midi/quantize-duration-2.ly index adae24327a..79648523ad 100644 --- a/input/regression/midi/quantize-duration-2.ly +++ b/input/regression/midi/quantize-duration-2.ly @@ -1,5 +1,5 @@ % Lily was here -- automatically converted by out/bin/midi2ly from /home/janneke/testmidi.mid -\version "2.16.0" +\version "2.19.21" \layout { \context { @@ -43,7 +43,7 @@ trackA = << >> -trackBchannelB = \relative c { +trackBchannelB = \relative { e'''4*41/192 r4*7/192 d4*41/192 r4*7/192 fis,4*89/192 r4*7/192 gis4*89/192 r4*7/192 | % 2 diff --git a/input/regression/midi/rest-dynamic.ly b/input/regression/midi/rest-dynamic.ly index 80de858bbe..318129a1b1 100644 --- a/input/regression/midi/rest-dynamic.ly +++ b/input/regression/midi/rest-dynamic.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="LilyPond respects rests, also when there are dynamics" options="" } \score { - \new Staff \relative c' { - \time 2/4 e4 e r4 e\f | + \new Staff \relative { + \time 2/4 e'4 e r4 e\f | } \layout {} \midi {} diff --git a/input/regression/midi/rest.ly b/input/regression/midi/rest.ly index 4aa3de56dd..3b770e9a91 100644 --- a/input/regression/midi/rest.ly +++ b/input/regression/midi/rest.ly @@ -1,5 +1,5 @@ % Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/rest.midi -\version "2.16.0" +\version "2.19.21" \layout { \context { @@ -43,10 +43,10 @@ trackA = << >> -trackBchannelA = \relative c { +trackBchannelA = \relative { r4 \set Staff.instrumentName = "trackB:voiceA" - a r4 a + a, r4 a | % 2 } diff --git a/input/regression/midi/sequence-name-scoping.ly b/input/regression/midi/sequence-name-scoping.ly new file mode 100644 index 0000000000..239d55c0bc --- /dev/null +++ b/input/regression/midi/sequence-name-scoping.ly @@ -0,0 +1,82 @@ +\version "2.19.25" + +\header { + texidoc="If a score has a @code{\header} block which defines a title, + this title should override any title defined in a @code{\header} block + of the score's enclosing @code{\bookpart} or @code{\book} (or a title + defined in a top-level @code{\header} block) when naming the MIDI + sequence generated from the score. Otherwise, if the score has no title + defined, the MIDI sequence generated from the score should get named + using the title defined in the @code{\header} block of the nearest + enclosing @code{\bookpart}, @code{\book}, or top-level scope that + contains a title definition." + title = "Top-level title" +} + +music = \new Staff { c1 } + +% Book with a title defined in a \header block, and book parts +\book { + \header { title = "Book" } + + % score without a \header block outside of any book part -- the MIDI + % sequence should get the title of the book as its name + \score { + \music + \layout { } + \midi { } + } + + % score with a \header and a title outside of any book part -- the MIDI + % sequence should be named with the title from this \header block + \score { + \music + \header { title = "Score in a \book" } + \layout { } + \midi { } + } + + % Book part with a \header block and a title + \bookpart { + \header { title = "Book part" } + + % score without a \header block -- the MIDI sequence should get its name + % from the title of the enclosing book part + \score { + \music + \layout { } + \midi { } + } + + % score with a \header (and a title) of its own -- the MIDI sequence + % should get its name from the title in this \header block + \score { + \music + \header { title = "Score in a book part (w/ a title) of a book" } + \layout { } + \midi { } + } + } + + % Book part without a \header block + \bookpart { + + % score without a \header block -- the MIDI sequence should be named + % using the title from the enclosing book + \score { + \music + \layout { } + \midi { } + } + + % score with a \header block and title -- the MIDI sequence should get + % its name from the title in this \header block + \score { + \music + \header { title = "Score in a book part (w/o a title) of a book" } + \layout { } + \midi { } + } + } + +} diff --git a/input/regression/midi/sequence-name.ly b/input/regression/midi/sequence-name.ly new file mode 100644 index 0000000000..f10590db16 --- /dev/null +++ b/input/regression/midi/sequence-name.ly @@ -0,0 +1,63 @@ +\version "2.19.25" + +\header { + texidoc="The MIDI sequence generated from a score should get its name + from the title defined in the score's @code{\header} block (if any). + The title used for layout can be overridden for MIDI output by + specifying a separate @code{midititle} in the @code{\header} block. + If the score does not define a title of its own, and has no enclosing + @code{\bookpart}, @code{\book}, or top-level scope with a @code{\header} + block that defines a title, either, the MIDI sequence should get the + default name." +} + +music = \new Staff { c1 } + +% Book without a \header block +\book { + + % score with a \header block including a title -- the MIDI sequence + % should get its name from this \header block + \score { + \music + \header { title = "Title shared between layout and MIDI" } + \layout { } + \midi { } + } + + % score with no title, but a midititle defined in a \header block -- + % the MIDI sequence should be named using the midititle in this \header + % block + \score { + \music + \header { midititle = "No title for layout, but a title for MIDI" } + \layout { } + \midi { } + } + + % score with a title and a midititle defined in a \header block -- the + % MIDI sequence should get the midititle in this \header block as its + % name + \score { + \music + \header { + title = "Title for layout" + midititle = "Title for MIDI" + } + \layout { } + \midi { } + } + + % Book part with no \header block + \bookpart { + + % score without a \header -- the MIDI sequence should get the default + % name + \score { + \music + \layout { } + \midi { } + } + } + +} diff --git a/input/regression/midi/staff-map-instrument.ly b/input/regression/midi/staff-map-instrument.ly index 6c4e8be5a8..1fae74c799 100644 --- a/input/regression/midi/staff-map-instrument.ly +++ b/input/regression/midi/staff-map-instrument.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Midi2ly remaps voices correctly to staves in MIDI-files that use instrument<->channel mapping when combined with voice<->track mapping. TODO: pianostaff" @@ -10,31 +10,31 @@ options="" << \context Staff = "treble" << \set Score.midiChannelMapping = #'instrument - \context Voice="one" \relative c'' { + \context Voice="one" \relative { \time 4/4 \key c \minor \voiceOne %comes %7 - f8 es16 d c16 bes ! as g f8 as' g f + f''8 es16 d c16 bes ! as g f8 as' g f %8 es8 d es f b, c d b | f,16 g as4 g16 f e2 | } - \context Voice="two" \relative c'' { + \context Voice="two" \relative { \voiceTwo %dux %7 - c4 r4 r8 f es d | + c''4 r4 r8 f es d | %8 r8 as g f g f16 es f8 d | 8 r r 2 | } >> \context Staff = "bass" << - \context Voice="three" \relative c' { + \context Voice="three" \relative { \key c \minor \clef bass %7 - r8 c16 b c8 g as c16 b c8 d | + r8 c'16 b c8 g as c16 b c8 d | %8 g8 c16 b c8 d f,16 g as4 g16 f | 1 } diff --git a/input/regression/midi/staff-map-voice.ly b/input/regression/midi/staff-map-voice.ly index dc76603ffe..114f37d3a9 100644 --- a/input/regression/midi/staff-map-voice.ly +++ b/input/regression/midi/staff-map-voice.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Midi2ly remaps voices correctly to staves in MIDI-files that use voice<->channel mapping when combined with staff<->track mapping. TODO: pianostaff" @@ -10,31 +10,31 @@ options="" << \context Staff = "treble" << \set Score.midiChannelMapping = #'voice - \context Voice="one" \relative c'' { + \context Voice="one" \relative { \time 4/4 \key c \minor \voiceOne %comes %7 - f8 es16 d c16 bes ! as g f8 as' g f + f''8 es16 d c16 bes ! as g f8 as' g f %8 es8 d es f b, c d b | f,16 g as4 g16 f e2 | } - \context Voice="two" \relative c'' { + \context Voice="two" \relative { \voiceTwo %dux %7 - c4 r4 r8 f es d | + c''4 r4 r8 f es d | %8 r8 as g f g f16 es f8 d | 8 r r 2 | } >> \context Staff = "bass" << - \context Voice="three" \relative c' { + \context Voice="three" \relative { \key c \minor \clef bass %7 - r8 c16 b c8 g as c16 b c8 d | + r8 c'16 b c8 g as c16 b c8 d | %8 g8 c16 b c8 d f,16 g as4 g16 f | 1 } diff --git a/input/regression/midi/voice-2.ly b/input/regression/midi/voice-2.ly index be0c4f5bee..3bcd1f83af 100644 --- a/input/regression/midi/voice-2.ly +++ b/input/regression/midi/voice-2.ly @@ -1,5 +1,5 @@ % Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/voice-2.midi -\version "2.16.0" +\version "2.19.21" \layout { \context { @@ -43,7 +43,7 @@ trackA = << >> -trackBchannelA = \relative c { +trackBchannelA = \relative { \voiceOne \set Staff.instrumentName = ":1" @@ -52,7 +52,7 @@ trackBchannelA = \relative c { } -trackBchannelB = \relative c { +trackBchannelB = \relative { \voiceTwo f' f f f | % 2 diff --git a/input/regression/midi/voice-4.ly b/input/regression/midi/voice-4.ly index 7ca89e9385..dfd2a603ab 100644 --- a/input/regression/midi/voice-4.ly +++ b/input/regression/midi/voice-4.ly @@ -1,5 +1,5 @@ % Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/voice-4.midi -\version "2.16.0" +\version "2.19.21" \layout { \context { @@ -43,7 +43,7 @@ trackA = << >> -trackBchannelA = \relative c { +trackBchannelA = \relative { \voiceOne \set Staff.instrumentName = ":1" @@ -52,21 +52,21 @@ trackBchannelA = \relative c { } -trackBchannelB = \relative c { +trackBchannelB = \relative { \voiceThree c''4. d8 e4 f | % 2 } -trackBchannelC = \relative c { +trackBchannelC = \relative { \voiceFour d'1 | % 2 } -trackBchannelD = \relative c { +trackBchannelD = \relative { \voiceTwo c'4 c2 c4 | % 2 diff --git a/input/regression/midi/voice-5.ly b/input/regression/midi/voice-5.ly index a91c26c8e1..64fa7b6609 100644 --- a/input/regression/midi/voice-5.ly +++ b/input/regression/midi/voice-5.ly @@ -1,5 +1,5 @@ % Lily was here -- automatically converted by ../../../scripts/midi2ly.py from out-www/voice-4.midi -\version "2.16.0" +\version "2.19.21" \layout { \context { @@ -43,7 +43,7 @@ trackA = << >> -trackBchannelA = \relative c { +trackBchannelA = \relative { \voiceOne \set Staff.instrumentName = ":1" @@ -52,28 +52,28 @@ trackBchannelA = \relative c { } -trackBchannelB = \relative c { +trackBchannelB = \relative { \voiceThree c''4. d8 e4 f | % 2 } -trackBchannelC = \relative c { +trackBchannelC = \relative { \voiceFour d'1 | % 2 } -trackBchannelD = \relative c { +trackBchannelD = \relative { \voiceTwo c'4 c2 c4 | % 2 } -trackBchannelE = \relative c { +trackBchannelE = \relative { s1 d1 | % 2 diff --git a/input/regression/minimum-length-after-break.ly b/input/regression/minimum-length-after-break.ly new file mode 100644 index 0000000000..8d8fbb6145 --- /dev/null +++ b/input/regression/minimum-length-after-break.ly @@ -0,0 +1,45 @@ +\version "2.19.16" + +\header { + texidoc = "The property @code{minimum-length-after-break} can be +used to stretch broken spanners starting after a line break. The +following example shows usage for a variety of spanners. +" +} + +\layout { + ragged-right = ##t +} + +{ + \once \override Tie.minimum-length-after-break = 20 + a1~ + \break + a1 + + \once \override Slur.minimum-length-after-break = 20 + a1( + \break + d'1) + + \once \override TextSpanner.springs-and-rods = #ly:spanner::set-spacing-rods + \once \override TextSpanner.minimum-length-after-break = 20 + a1\startTextSpan + \break + a1\stopTextSpan + + \once \override Hairpin.after-line-breaking = ##t + \once \override Hairpin.to-barline = ##f + \once \override Hairpin.minimum-length-after-break = 20 + a1\< + \break + a1\! + + \once \override Glissando.springs-and-rods = #ly:spanner::set-spacing-rods + \once \override Glissando.breakable = ##t + \once \override Glissando.after-line-breaking = ##t + \once \override Glissando.minimum-length-after-break = 20 + a1\glissando + \break + d'1 +} diff --git a/input/regression/minimum-length-broken-ties.ly b/input/regression/minimum-length-broken-ties.ly new file mode 100644 index 0000000000..ef824ac254 --- /dev/null +++ b/input/regression/minimum-length-broken-ties.ly @@ -0,0 +1,39 @@ +\version "2.19.16" + +\header { + texidoc = "The following shows the interaction between the +properties @code{minimum-length} and +@code{minimum-length-after-break}. When @code{minimum-length} +is used alone, both segments of the tie are affected. The +properties @code{minimum-length-after-break} only affects +the sibling starting a line. Both properties may be used +together to create independent changes of both siblings. This +example shows that both properties have an identical effect on +the sibling after the break. +" +} + +\layout { + ragged-right = ##t +} + +music = { + 1~ + \break + q1 +} + +{ + % default + \music + + \once \override Tie.minimum-length = 11 + \music + + \once \override Tie.minimum-length-after-break = 11 + \music + + \once \override Tie.minimum-length = 8 + \once \override Tie.minimum-length-after-break = 11 + \music +} diff --git a/input/regression/modal-transforms.ly b/input/regression/modal-transforms.ly index d514a92a09..9ff66c157b 100644 --- a/input/regression/modal-transforms.ly +++ b/input/regression/modal-transforms.ly @@ -9,8 +9,8 @@ cOctatonicScale = { ges' aes' a' b' } motif = { - c'8. ees'16 ges'8. a'16 - b'8. aes'16 f'8. d'16 + c'8. ees'16( ges'8. a'16 + b'8.) aes'16 f'8. d'16 } \score { diff --git a/input/regression/modern-tab-clef-scaled.ly b/input/regression/modern-tab-clef-scaled.ly index ceafcc05db..f04f3ba7d5 100644 --- a/input/regression/modern-tab-clef-scaled.ly +++ b/input/regression/modern-tab-clef-scaled.ly @@ -1,10 +1,10 @@ -\version "2.17.6" +\version "2.19.21" \header{ texidoc = "The sans serif style tab clef is automatically adjusted to different string spacings." } -guitar = \relative c { +guitar = \relative { c4 d e f e4 d c2 } diff --git a/input/regression/modern-tab-clef.ly b/input/regression/modern-tab-clef.ly index 7c3110b396..1447656b65 100644 --- a/input/regression/modern-tab-clef.ly +++ b/input/regression/modern-tab-clef.ly @@ -1,16 +1,16 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc = "Sans serif style tab clefs are supported by @code{\\clef moderntab}. This alternative clef supports four- to seven-stringed instruments and is scaled automatically." } -bass = \relative c, { - c4 d e f +bass = \relative { + c,4 d e f e4 d c2 } -guitar = \relative c { +guitar = \relative { c4 d e f e4 d c2 } diff --git a/input/regression/monochords.ly b/input/regression/monochords.ly new file mode 100644 index 0000000000..73553ea4a8 --- /dev/null +++ b/input/regression/monochords.ly @@ -0,0 +1,16 @@ +\version "2.19.21" + +\header { texidoc = " +Whole notes in a monochord must be properly offset so that the heads just +touch each other. On the other hand, a stem should touch both notes. +" } + +\relative { + \time 4/1 + \longa \breve 1 2 4 8 8 \break + \longa \breve 1 2 4 8 8 +} + +\paper { + ragged-right = ##t +} diff --git a/input/regression/morgenlied.ly b/input/regression/morgenlied.ly index 2a2e93dca3..550489f92d 100644 --- a/input/regression/morgenlied.ly +++ b/input/regression/morgenlied.ly @@ -27,7 +27,7 @@ been lowered } -\version "2.17.6" +\version "2.19.12" manuscriptBreak = { \break } @@ -38,7 +38,7 @@ manuscriptBreak = { \break } %#(set-global-staff-size (* 5.8 mm)) line-width = #(* mm 160) indent = 8\mm - system-system-spacing #'basic-distance = #10.3 + system-system-spacing.basic-distance = #10.3 ragged-bottom = ##t } @@ -64,7 +64,7 @@ melody = \relative c'' \repeat volta 2 \new Voice = "singer" { d4 f8 a16[ g fis g] f[ d] | g4. r8 gis gis | a4 a16.[ b32] c4 fis,8 | - g4.~ g8-\fermata g8 g | + g4.~ 8-\fermata g8 g | as4 as8 g4 g8 | fis4 fis8 r8 g g | a!4 a8 g4 g8 | @@ -157,8 +157,8 @@ pianoLH = \relative c'' \repeat volta 2 { \new Staff << \context Staff \accidentalStyle modern \melody >> - \lyricsto "singer" \new Lyrics \firstVerse - \lyricsto "singer" \new Lyrics \secondVerse + \new Lyrics \lyricsto "singer" \firstVerse + \new Lyrics \lyricsto "singer" \secondVerse \new PianoStaff << \set PianoStaff.instrumentName = \markup { \bold diff --git a/input/regression/mozart-hrn-3.ly b/input/regression/mozart-hrn-3.ly index 3908f6bc60..ae58603ecf 100644 --- a/input/regression/mozart-hrn-3.ly +++ b/input/regression/mozart-hrn-3.ly @@ -48,7 +48,7 @@ virtuoso that taught in Geneva. " } -\version "2.16.0" +\version "2.19.12" \include "mozart-hrn3-defs.ily" \include "mozart-hrn3-allegro.ily" @@ -56,8 +56,8 @@ virtuoso that taught in Geneva. \include "mozart-hrn3-rondo.ily" \paper { - system-system-spacing #'basic-distance = 10 - score-system-spacing #'basic-distance = 20 + system-system-spacing.basic-distance = 10 + score-system-spacing.basic-distance = 20 } \book { diff --git a/input/regression/mozart-hrn3-allegro.ily b/input/regression/mozart-hrn3-allegro.ily index 1494f4e299..48627557ba 100644 --- a/input/regression/mozart-hrn3-allegro.ily +++ b/input/regression/mozart-hrn3-allegro.ily @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.2" \include "mozart-hrn3-defs.ily" allegro = \relative c' { @@ -26,7 +26,7 @@ allegro = \relative c' { d8.[ c16 d8. e16] c4 r r2 R1*3 - c,2 ~ c8[ e g c] + c,2 ~ 8[ e g c] c[ b ] b4 r2 c,8[ ( e) g c] e[( g) e c] c[( b)] b4 r2 @@ -34,7 +34,7 @@ allegro = \relative c' { g'[( d) ] d4 r4 d d8[ ( c)] c4.( d16[ e] d8[ c)] c8[(\trill b)] b4 r2 | - d2( ~ d8[ e16 d] c8[ b)] | + d2( ~ 8[ e16 d] c8[ b)] | b[( a)] a4 r8 a[ a a] a4( cis e g) \appoggiatura g16 @@ -47,7 +47,7 @@ allegro = \relative c' { a[( \< b c cis\!\> ] d4 c\!) ais8[( b)] r8 b\cresc b[( c)] r c cis[ ( d)] r4 r2 - g,1\!\f ~ g2 ~ g8[ a16 b] c[( d) e c] + g,1\!\f ~ g2 ~ 8[ a16 b] c[( d) e c] %% 64 f4-. d-. b-. g-. R1 @@ -59,7 +59,7 @@ allegro = \relative c' { R1*15 \mark "D" bes2\mf d4 f - g,2~ g8[ g' es c]| + g,2~ 8[ g' es c]| bes4( a4.) c8[( d es)] cis4( d) r8 bes[ (c d)] es2 ( d4) r @@ -67,7 +67,7 @@ allegro = \relative c' { c8[( g' es c)] bes4( c) c4.( cis8 d4) r R1*2 - es1~es1| + es1~1| e! d c @@ -98,12 +98,12 @@ allegro = \relative c' { c4 r r2 \mark "F" R1*3 - c,2~ c8[ e g c] + c,2~ 8[ e g c] c8[( b)] b4 r2 c,8[ e g c ] e[ ( g) e c] c[( b)] b4 r2 c2 (bes a) a8[(b c cis)] - d2( ~ d8[ e16 d] \appoggiatura d16 + d2( ~ 8[ e16 d] \appoggiatura d16 c8[ b16 c)] \appoggiatura c16 b8[( a16 g)] g4 r2 | @@ -112,16 +112,16 @@ allegro = \relative c' { \mark "G" d[( c) g'( e)] d[( c) a'( f)] e[( d)] d4 r d8[ d] - d4(~ d16[ e d e)] g8[( f) e d] | + d4(~ 16[ e d e)] g8[( f) e d] | c4 r r2 R1 c1 ~ - c | + 1 | c8[-. c-.] r c-. cis[( d)] r d-.\cresc | dis[( e)] r e-. e[( f)] r f-. | g4-.\f e-. c-. bes-. | g-.\ff e-. c-. r | - a'2 ~ a8[_\markup { \bold \italic "sempre " \dynamic "f" } b16 c] d[( e d e)] + a'2 ~ 8[_\markup { \bold \italic "sempre " \dynamic "f" } b16 c] d[( e d e)] f4. ( d8) f8[ ( d) f d] c[ (e] g2) \appoggiatura f16 diff --git a/input/regression/mozart-hrn3-romanze.ily b/input/regression/mozart-hrn3-romanze.ily index 403d7aaf49..1fa4e962c8 100644 --- a/input/regression/mozart-hrn3-romanze.ily +++ b/input/regression/mozart-hrn3-romanze.ily @@ -1,11 +1,11 @@ -\version "2.17.6" +\version "2.19.21" \include "mozart-hrn3-defs.ily" -romanze = \relative c' { +romanze = \relative { \key f \major \time 2/2 - c'4.( _\markup { \dynamic "p" \italic { "" con molto espressione } } + c''4.( _\markup { \dynamic "p" \italic { "" con molto espressione } } f8) a,4 a bes8[( c d bes] g4) r8 g a r bes r c r d[( bes)] @@ -34,7 +34,7 @@ romanze = \relative c' { f'4.(\p d8) b4 r8 g g'4.( e8) c4 r8 cis | % 39 - d4(~ d16[ e d e)] f8[ ( d) f( d)] + d4(~ 16[ e d e)] f8[ ( d) f( d)] c2( b4) r R1*4 e4. ( g8) c,4 ( cis) @@ -52,8 +52,8 @@ romanze = \relative c' { \revert DynamicLineSpanner.staff-padding R1*3 r8 c[\p c c] c2~ - c8[ c' c c] c2~ - c8[ \< e( g f] e[ d\!\> c bes] + 8[ c' c c] c2~ + 8[ \< e( g f] e[ d\!\> c bes] \mark "D" a4\!) r r2 R1*3 diff --git a/input/regression/mozart-hrn3-rondo.ily b/input/regression/mozart-hrn3-rondo.ily index d3997e7774..df699aacf7 100644 --- a/input/regression/mozart-hrn3-rondo.ily +++ b/input/regression/mozart-hrn3-rondo.ily @@ -1,9 +1,9 @@ -\version "2.16.0" +\version "2.19.21" \include "mozart-hrn3-defs.ily" -rondotheme = \relative c' { - c'8[ c c] c[ c c] +rondotheme = \relative { + c''8[ c c] c[ c c] c4( cis8 d) r g, d'8[ d d] d[ d d] d4( dis8 e) r c | @@ -13,14 +13,14 @@ rondotheme = \relative c' { e4.( d8) r r | } -lipbreaker = \relative c' { +lipbreaker = \relative { r8 g'[-. g-.] c[( e) g,-.] c[( e) g,-.] c[( e) g,-.] c[ c, c] c[ c c] c[ c c] c[ c c] } -rondo = \relative c' { +rondo = \relative { \partial 8 \time 6/8 \key c \major @@ -45,13 +45,13 @@ rondo = \relative c' { e4 r8 r4 r8 g4. e4 c8 g2.~ - g8[ a b] c[ d e ] + 8[ a b] c[ d e ] e4.( d8) r r R2.*4 e2.~ | - e8[ d c] c[ b a] + 8[ d c] c[ b a] d2.~ - d8[ c b] b[ a g] + 8[ c b] b[ a g] g'4( e8) b4( cis8) \mark "B" d4 r8 r4 r8 @@ -75,7 +75,7 @@ rondo = \relative c' { r8 g[\f g] g[( b) b-.] b[( d) d-.] d[( g) g-.] g2.~ - g8[ \> a g] f[ e d] + 8[ \> a g] f[ e d] << \rondotheme @@ -86,40 +86,40 @@ rondo = \relative c' { r4 r8 r4 c8 \mark "D" c4 f8 c4 a8 - a4.~a4 a8 + a4.~4 a8 bes4 c8 d4 bes8 - g4. ~ g8 r r + g4. ~ 8 r r R2.*3 r4 r8 r4 c8 a4. c - f ~ f8.[ e16( d c)] + f ~ 8.[ e16( d c)] bes4 g8 e4 g8 - c,4. ~ c8 r r + c,4. ~ 8 r r R2.*3| r4 r8 r4 c'8 b4( c8) b4( c8) - bes4. ~ bes4 g8 + bes4. ~ 4 g8 a4 ( c8) f4 ( b,8) d4. ( c8) r r R2.*3| r4 r8 r4 c8 b4( c8) b4( c8) - bes4. ~ bes4 g8 + bes4. ~ 4 g8 a4 c8 f[ ( d) b!] d4. ( c8) r r \mark "E" R2.*9 | \lipbreaker c,8[ c' c] c4.~ - c8[ c d] e[ e fis] + 8[ c d] e[ e fis] g4 r8 r4 r8 R2. r8 g,[ g] g[ g g] | - es'4. ~ es8[ d c] + es'4. ~ 8[ d c] b4 r8 r4 r8 R2. | r8 g[ g] g[ g g] - es'4. ~ es8[ d c] + es'4. ~ 8[ d c] b4.\cresc c4. d4. e4. \mark "F" f2.\f ~ | diff --git a/input/regression/multiple-time-sig-settings.ly b/input/regression/multiple-time-sig-settings.ly index 883124d4a6..91c53a3928 100644 --- a/input/regression/multiple-time-sig-settings.ly +++ b/input/regression/multiple-time-sig-settings.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.40" \header { texidoc = " @@ -13,12 +13,12 @@ by the markups. \overrideTimeSignatureSettings #'(4 . 4) % time signature fraction #'(1 . 4) % base moment fraction - #'(1 1 1 1) % beatStructure + 1,1,1,1 % beatStructure #'() % beamExceptions \overrideTimeSignatureSettings #'(3 . 4) % time signature fraction #'(1 . 4) % base moment fraction - #'(1 1 1) % beatStructure + 1,1,1 % beatStructure #'() % beamExceptions \time 4/4 c8^\markup {"Beam by 1/4"} c c c c c c c | diff --git a/input/regression/music-function-direct-call.ly b/input/regression/music-function-direct-call.ly new file mode 100644 index 0000000000..545ad9facf --- /dev/null +++ b/input/regression/music-function-direct-call.ly @@ -0,0 +1,18 @@ +\version "2.19.22" + +\header { + texidoc = "Music functions can be called directly from Scheme." +} + +\new Staff { + #(relative + (make-sequential-music + (list + (time '(3 2) '(5 . 4)) #{ e'8 8 8 8 8 8 8 8 8 8 #} + (clef "bass") + (key #{ a #} major) + (time '(3 . 4)) + (tuplet '(2 . 3) #{ 4. #} #{ d,8 e fis gis #}) + (key *unspecified*) + #{ a2. #}))) +} diff --git a/input/regression/music-function-end-spanners.ly b/input/regression/music-function-end-spanners.ly index 30028a284a..2400f461eb 100644 --- a/input/regression/music-function-end-spanners.ly +++ b/input/regression/music-function-end-spanners.ly @@ -6,12 +6,12 @@ end span events at the end of a note." } -\version "2.17.15" +\version "2.19.21" \paper{ ragged-right = ##T } -\relative c' -<< { c'4 c c c } +\relative +<< { c''4 c c c } \\ { \override TextSpanner.bound-details.left.text = "x" diff --git a/input/regression/music-function-incomplete.ly b/input/regression/music-function-incomplete.ly new file mode 100644 index 0000000000..24c2b56550 --- /dev/null +++ b/input/regression/music-function-incomplete.ly @@ -0,0 +1,15 @@ +\version "2.19.24" + +\header { + texidoc = "For defining a music function, one can supply one or + several music function calls chained together, cutting the last + call short using @code{\\etc}. The remaining arguments are + supplied when calling the music function defined in this manner." +} + +\layout { ragged-right = ##t } + +highlight = \tweak font-size 3 \tweak color #red \etc +mode = \key c \etc + +{ c' \highlight d' e'-\highlight -! \mode \minor c'' } diff --git a/input/regression/music-function-post-event.ly b/input/regression/music-function-post-event.ly index 4442352662..dd3548a779 100644 --- a/input/regression/music-function-post-event.ly +++ b/input/regression/music-function-post-event.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" \header { @@ -12,11 +12,11 @@ of the resulting object is set accordingly." } dynScript = -#(define-music-function (parser location text) (string?) +#(define-music-function (text) (string?) (make-dynamic-script text)) -\relative c' { - c1-\dynScript "pp" +\relative { + c'1-\dynScript "pp" c^\dynScript "fp" c_\dynScript "spz" } diff --git a/input/regression/music-function-string-markup.ly b/input/regression/music-function-string-markup.ly index 7c584e0f23..3734dae696 100644 --- a/input/regression/music-function-string-markup.ly +++ b/input/regression/music-function-string-markup.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" \header { texidoc = "Music functions accept strings as markup arguments @@ -7,7 +7,7 @@ when using the type predicate @code{markup?} } testFunc = -#(define-music-function (parser location text music) (markup? ly:music?) +#(define-music-function (text music) (markup? ly:music?) ;; dummy function, does nothing music) diff --git a/input/regression/music-function.ly b/input/regression/music-function.ly index 8f4da124fa..c571b2f3ab 100644 --- a/input/regression/music-function.ly +++ b/input/regression/music-function.ly @@ -7,9 +7,9 @@ demonstrate a @code{\\myBar} function, which works similar to @code{\\bar}, but is implemented completely in Scheme." } -\version "2.17.5" +\version "2.19.22" -myBar = #(define-music-function (parser location bar-type) (string?) +myBar = #(define-music-function (bar-type) (string?) (context-spec-music (context-spec-music (make-property-set 'whichBar bar-type) 'Timing) 'Score)) diff --git a/input/regression/musicxml/01b-Pitches-Intervals.xml b/input/regression/musicxml/01b-Pitches-Intervals.xml index c033498d52..fe38b07d00 100644 --- a/input/regression/musicxml/01b-Pitches-Intervals.xml +++ b/input/regression/musicxml/01b-Pitches-Intervals.xml @@ -2,7 +2,7 @@ - Various piches and interval sizes + Various pitches and interval sizes All pitch intervals in ascending @@ -50,6 +50,8 @@ 1 quarter + + C @@ -59,6 +61,7 @@ 1 1 quarter + sharp @@ -69,7 +72,10 @@ 1 1 quarter + flat + + D @@ -79,6 +85,7 @@ 1 1 quarter + flat @@ -89,7 +96,10 @@ 1 1 quarter + sharp + + D @@ -108,6 +118,8 @@ 1 quarter + + D @@ -117,6 +129,7 @@ 1 1 quarter + sharp @@ -127,7 +140,10 @@ 1 1 quarter + flat + + E @@ -137,6 +153,7 @@ 1 1 quarter + flat @@ -147,7 +164,10 @@ 1 1 quarter + sharp + + E @@ -166,6 +186,8 @@ 1 quarter + + E @@ -175,6 +197,7 @@ 1 1 quarter + sharp @@ -185,7 +208,10 @@ 1 1 quarter + flat + + F @@ -195,6 +221,7 @@ 1 1 quarter + flat @@ -205,7 +232,10 @@ 1 1 quarter + sharp + + F @@ -224,6 +254,8 @@ 1 quarter + + F @@ -233,6 +265,7 @@ 1 1 quarter + sharp @@ -243,7 +276,10 @@ 1 1 quarter + flat + + G @@ -253,6 +289,7 @@ 1 1 quarter + flat @@ -263,7 +300,10 @@ 1 1 quarter + sharp + + G @@ -282,6 +322,8 @@ 1 quarter + + G @@ -291,6 +333,7 @@ 1 1 quarter + sharp @@ -301,7 +344,10 @@ 1 1 quarter + flat + + A @@ -311,6 +357,7 @@ 1 1 quarter + flat @@ -321,7 +368,10 @@ 1 1 quarter + sharp + + A @@ -340,6 +390,8 @@ 1 quarter + + A @@ -349,6 +401,7 @@ 1 1 quarter + sharp @@ -359,7 +412,10 @@ 1 1 quarter + flat + + B @@ -369,6 +425,7 @@ 1 1 quarter + flat @@ -379,7 +436,10 @@ 1 1 quarter + sharp + + B @@ -398,6 +458,8 @@ 1 quarter + + B @@ -407,6 +469,7 @@ 1 1 quarter + sharp @@ -417,7 +480,10 @@ 1 1 quarter + flat + + C @@ -427,6 +493,7 @@ 1 1 quarter + flat @@ -437,7 +504,10 @@ 1 1 quarter + sharp + + C @@ -456,6 +526,8 @@ 1 quarter + + C @@ -465,6 +537,7 @@ 1 1 quarter + sharp @@ -475,7 +548,10 @@ 1 1 quarter + flat + + D @@ -485,6 +561,7 @@ 1 1 quarter + flat @@ -495,7 +572,10 @@ 1 1 quarter + sharp + + D @@ -514,6 +594,8 @@ 1 quarter + + D @@ -523,6 +605,7 @@ 1 1 quarter + sharp @@ -533,7 +616,10 @@ 1 1 quarter + flat + + E @@ -543,6 +629,7 @@ 1 1 quarter + flat @@ -553,7 +640,10 @@ 1 1 quarter + sharp + + E @@ -572,6 +662,8 @@ 1 quarter + + E @@ -581,6 +673,7 @@ 1 1 quarter + sharp @@ -591,7 +684,10 @@ 1 1 quarter + flat + + F @@ -601,6 +697,7 @@ 1 1 quarter + flat @@ -611,7 +708,10 @@ 1 1 quarter + sharp + + F @@ -630,6 +730,8 @@ 1 quarter + + F @@ -639,6 +741,7 @@ 1 1 quarter + sharp @@ -649,7 +752,10 @@ 1 1 quarter + flat + + G @@ -659,6 +765,7 @@ 1 1 quarter + flat @@ -669,7 +776,10 @@ 1 1 quarter + sharp + + G @@ -688,6 +798,8 @@ 1 quarter + + G @@ -697,6 +809,7 @@ 1 1 quarter + sharp @@ -707,7 +820,10 @@ 1 1 quarter + flat + + A @@ -717,6 +833,7 @@ 1 1 quarter + flat @@ -727,7 +844,10 @@ 1 1 quarter + sharp + + A @@ -746,6 +866,8 @@ 1 quarter + + A @@ -755,6 +877,7 @@ 1 1 quarter + sharp @@ -765,7 +888,10 @@ 1 1 quarter + flat + + B @@ -775,6 +901,7 @@ 1 1 quarter + flat @@ -785,7 +912,10 @@ 1 1 quarter + sharp + + B @@ -804,6 +934,8 @@ 1 quarter + + B @@ -813,6 +945,7 @@ 1 1 quarter + sharp @@ -823,6 +956,7 @@ 1 1 quarter + flat diff --git a/input/regression/musicxml/02a-Rests-Durations.xml b/input/regression/musicxml/02a-Rests-Durations.xml index 1398844548..8e5bce1184 100644 --- a/input/regression/musicxml/02a-Rests-Durations.xml +++ b/input/regression/musicxml/02a-Rests-Durations.xml @@ -19,7 +19,7 @@ - 32 + 64 0 major @@ -38,23 +38,25 @@ - 128 + 256 1 + whole - 128 + 256 1 + whole - 128 + 256 1 whole @@ -63,49 +65,49 @@ - 64 + 128 1 half - 32 + 64 1 quarter - 16 + 32 1 eighth - 8 + 16 1 16th - 4 + 8 1 32nd - 2 + 4 1 64th - 1 + 2 1 128th - 1 + 2 1 128th @@ -114,14 +116,14 @@ - 96 + 192 1 half - 32 + 64 1 quarter @@ -130,42 +132,55 @@ - 48 + 64 + 1 + quarter + + + + 96 1 quarter - 24 + 48 1 eighth - 12 + 24 1 16th - 6 + 12 1 32nd - 3 + 6 1 64th - 2 + 3 + 1 + 128th + + + + + 3 1 128th diff --git a/input/regression/musicxml/41f-StaffGroups-Overlapping.xml b/input/regression/musicxml/41f-StaffGroups-Overlapping.xml index 9b6d2afe9f..41c0731457 100644 --- a/input/regression/musicxml/41f-StaffGroups-Overlapping.xml +++ b/input/regression/musicxml/41f-StaffGroups-Overlapping.xml @@ -7,8 +7,8 @@ MusicXML allows for overlapping part-groups, while many applications do not allow overlapping groups, but require them to be properly nested. In this case, one group - (with a square bracket) goes from staff 2 to 4) and another group - (with a curly bracket) goes from staff 3 to 5. + (within parenthesis) goes from staff 1 to 4 and another group + (also within parenthesis) goes from staff 3 to 5. diff --git a/input/regression/musicxml/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml b/input/regression/musicxml/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml index 27f4b2aa76..670c87143b 100644 --- a/input/regression/musicxml/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml +++ b/input/regression/musicxml/42a-MultiVoice-TwoVoicesOnStaff-Lyrics.xml @@ -256,7 +256,7 @@ single - Voice1 + Voice2 diff --git a/input/regression/newaddlyrics-music-identifiers.ly b/input/regression/newaddlyrics-music-identifiers.ly index 1d206a5b39..b45541172e 100644 --- a/input/regression/newaddlyrics-music-identifiers.ly +++ b/input/regression/newaddlyrics-music-identifiers.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "addlyrics do not need braces around their arguments, in particular if the arguments are variables." } -m = \relative c' { c4 d } +m = \relative { c'4 d } l = \lyricmode { A B } % addlyrics takes music expressions as well as music identifiers. The following diff --git a/input/regression/newaddlyrics.ly b/input/regression/newaddlyrics.ly index 73c9ab1fe8..0da61c25cf 100644 --- a/input/regression/newaddlyrics.ly +++ b/input/regression/newaddlyrics.ly @@ -5,8 +5,8 @@ } \layout { ragged-right = ##t } << - \new Staff \relative c'' { - d2 d c4 bes a2 \break + \new Staff \relative { + d''2 d c4 bes a2 \break } \addlyrics { My first Li -- ly song, @@ -14,9 +14,9 @@ \addlyrics { Not much can go wrong! } - \new Staff \relative c' { + \new Staff \relative { \clef bass - d2 d c4 bes a2 \break + d'2 d c4 bes a2 \break } \addlyrics { MY FIRST LI -- LY SONG, @@ -26,4 +26,4 @@ } >> -\version "2.16.0" +\version "2.19.21" diff --git a/input/regression/no-staff.ly b/input/regression/no-staff.ly index 7d18f1af19..7d3ad7ef91 100644 --- a/input/regression/no-staff.ly +++ b/input/regression/no-staff.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" % possible rename to staff-something. -gp \header{ texidoc = "@cindex Staff Remove @@ -11,12 +11,12 @@ corresponding engraver. ragged-right = ##t } -\relative c' \new Staff \with { +\relative \new Staff \with { \remove "Staff_symbol_engraver" \consists "Pitch_squash_engraver" \remove "Clef_engraver" } { - c4 d4 e8 d8 + c'4 d4 e8 d8 } diff --git a/input/regression/note-collision-threshold.ly b/input/regression/note-collision-threshold.ly new file mode 100644 index 0000000000..e01a2e168b --- /dev/null +++ b/input/regression/note-collision-threshold.ly @@ -0,0 +1,46 @@ +\version "2.19.34" + +\header { + texidoc = "Whether simultaneous notes are identified as + vertically colliding or not depends on the value of the + @code{note-collision-threshold} property of the @code{Stem} + grob (for notes in the same voice) and the @code{NoteCollision} + grob (for notes in different voices)." +} + +music = << + \new Voice \relative { + \voiceOne + 4 + e g g a + + } + \new Voice \relative { + \voiceTwo + s4 s s s + d' f a b + } +>> + +customizations = \with { + staffLineLayoutFunction = #ly:pitch-semitones + \override StaffSymbol.staff-space = #0.7 + \override StaffSymbol.line-positions = #'(-4 0 4) +} + + +\markup "collisions" + +\new Staff \with { + \customizations +} +\music + +\markup "collisions prevented" + +\new Staff \with { + \customizations + \override Stem.note-collision-threshold = #2 + \override NoteCollision.note-collision-threshold = #2 +} +\music diff --git a/input/regression/note-head-chord.ly b/input/regression/note-head-chord.ly index 0cc5d22522..e345473567 100644 --- a/input/regression/note-head-chord.ly +++ b/input/regression/note-head-chord.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Note heads are flipped on the stem to prevent collisions. @@ -10,9 +10,9 @@ It also works for whole heads that have invisible stems. \layout { ragged-right= ##t } -\relative c'' +\relative \context Voice { - 4 + 4 diff --git a/input/regression/note-head-harmonic-dotted.ly b/input/regression/note-head-harmonic-dotted.ly index 5dc8ca24d4..d68d0e2177 100644 --- a/input/regression/note-head-harmonic-dotted.ly +++ b/input/regression/note-head-harmonic-dotted.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " @@ -7,8 +7,8 @@ Dots on harmonic note heads can be shown by setting the property " } -\relative c'' { - r4 2. +\relative { + r4 2. \set harmonicDots = ##t r4 2. } diff --git a/input/regression/note-head-harmonic-whole.ly b/input/regression/note-head-harmonic-whole.ly index b3267998b4..7fd6b7eea1 100644 --- a/input/regression/note-head-harmonic-whole.ly +++ b/input/regression/note-head-harmonic-whole.ly @@ -6,14 +6,14 @@ } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c' { - 1 +\relative { + 1 1 } diff --git a/input/regression/note-head-style.ly b/input/regression/note-head-style.ly index 987b312feb..c0833981e4 100644 --- a/input/regression/note-head-style.ly +++ b/input/regression/note-head-style.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.22" \header{ texidoc=" Note head shapes may be set from several choices. @@ -17,7 +17,7 @@ dimensions. } pattern = -#(define-music-function (parser location name style) (markup? ly:context-mod?) +#(define-music-function (name style) (markup? ly:context-mod?) #{ << s1^#name \new Voice \with #style { @@ -31,7 +31,7 @@ pattern = >> #}) patternStyle = -#(define-music-function (parser location style) (symbol?) +#(define-music-function (style) (symbol?) #{ \pattern #(symbol->string style) \with { \override NoteHead.style = #style diff --git a/input/regression/note-names-context.ly b/input/regression/note-names-context.ly index 3041797736..06ba05f390 100644 --- a/input/regression/note-names-context.ly +++ b/input/regression/note-names-context.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -9,11 +9,10 @@ } \paper { - system-system-spacing - #'basic-distance = #10 % increase this value for more space + system-system-spacing.basic-distance = #10 % increase this value for more space } -notes = \relative c { +notes = \relative { c'4 c c c } diff --git a/input/regression/note-names.ly b/input/regression/note-names.ly index dd8b9b02a1..972ebb1d02 100644 --- a/input/regression/note-names.ly +++ b/input/regression/note-names.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.38" \header { texidoc = "Various languages are supported for note names input. @@ -11,17 +11,18 @@ and doesn't break point-and-click abilities. %% Old syntax. \include "english.ly" -\relative c'' { - g4 bf d c +\relative { + g'4 bf d c %% Manual override of the pitchnames variable %% and the parser note names: #(begin (set! pitchnames (ly:assoc-get 'nederlands language-pitch-names)) - (ly:parser-set-note-names parser pitchnames)) + (ly:parser-set-note-names pitchnames)) bes4 a g fis %% The \language command acts in the same way: - \language "italiano" - sol4 fa mib re + \language "français" + %% Accented characters are supported in some languages: + sol4 fa mib ré } diff --git a/input/regression/notehead-height.ly b/input/regression/notehead-height.ly new file mode 100644 index 0000000000..badad176f8 --- /dev/null +++ b/input/regression/notehead-height.ly @@ -0,0 +1,15 @@ +\version "2.19.38" + +\header { + texidoc=" +Noteheads do not extend above the upper staff line. +" +} + +\new Voice \with { + \override NoteHead.color = #green + } { + \relative { + f'4 a c e \bar "|." + } +} diff --git a/input/regression/number-staff-lines.ly b/input/regression/number-staff-lines.ly index fdb44a041b..9470e3a9f1 100644 --- a/input/regression/number-staff-lines.ly +++ b/input/regression/number-staff-lines.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header{ texidoc=" The number of stafflines of a staff can be set. Ledger @@ -11,7 +11,7 @@ adjusted accordingly. " \new Staff \with { \override StaffSymbol.line-count = #3 } -\relative c { +\relative { c' c c c | g' g g g \bar ":|." } diff --git a/input/regression/offsets.ly b/input/regression/offsets.ly index 878664e4dd..c0d6a8dfed 100644 --- a/input/regression/offsets.ly +++ b/input/regression/offsets.ly @@ -1,4 +1,4 @@ -\version "2.17.29" +\version "2.19.21" \header { texidoc = "The @code{\\offset} command may be used to displace various properties @@ -13,11 +13,11 @@ default appearance. The command is demonstrated as a tweak and as an override." indent = 0 } -\relative c' { +\relative { %% ARPEGGIO %% % default - 1\arpeggio + 1\arpeggio 1-\offset positions #'(-1 . 1) \arpeggio \bar "||" diff --git a/input/regression/one-line-auto-height-breaking.ly b/input/regression/one-line-auto-height-breaking.ly new file mode 100644 index 0000000000..087ff501e5 --- /dev/null +++ b/input/regression/one-line-auto-height-breaking.ly @@ -0,0 +1,11 @@ +\version "2.19.36" + +\header { + texidoc = "The @var{ly:one-line-auto-height-breaking} algorithm puts + everything on one line (just like @code{ly:one-line-breaking}) and + sets the page-height to fit the music." +} + +\paper { page-breaking = #ly:one-line-auto-height-breaking } + +\include "typography-demo.ly" diff --git a/input/regression/one-staff.ly b/input/regression/one-staff.ly new file mode 100644 index 0000000000..45ed449c2f --- /dev/null +++ b/input/regression/one-staff.ly @@ -0,0 +1,25 @@ +\version "2.19.26" + +\header { + texidoc = "@code{OneStaff} contexts can be used for letting several +contexts use the same vertical position. This example shows chords being +placed in a staff and immediately following it." +} + +\layout { + ragged-right = ##t +} + +\new OneStaff +{ + << % First element in <<>> so that it is not kept alive spuriously + \new Staff + { + c'4 d' e' f' + \chords \with { \override ChordName.Y-offset = -1 } + { d1:m7 b1:min7.5- } + } + >> + \chords \with { \override ChordName.Y-offset = -1 } + { d1:m7 b1:min7.5- } +} diff --git a/input/regression/optional-args-backup.ly b/input/regression/optional-args-backup.ly index e48cc28d24..ea7db103c2 100644 --- a/input/regression/optional-args-backup.ly +++ b/input/regression/optional-args-backup.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" \header{ texidoc= "Test backup of predicate-based optional music function arguments. @@ -16,12 +16,12 @@ separate arguments." \layout { ragged-right = ##t } -test=#(define-void-function (parser location expect . rest) +test=#(define-void-function (expect . rest) (list? (string? "def1") (integer? "def2") (fraction? "def3") integer?) (if (not (equal? expect rest)) - (ly:parser-error parser + (ly:parser-error (format #f "Expected ~s, got ~s.\n" expect rest) - location))) + (*location*)))) twice=2 diff --git a/input/regression/optional-args-predicate.ly b/input/regression/optional-args-predicate.ly index d50230f594..49537ce46f 100644 --- a/input/regression/optional-args-predicate.ly +++ b/input/regression/optional-args-predicate.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" \header{ texidoc= "Test predicate-based optional music function argument skipping." @@ -6,13 +6,13 @@ \layout { ragged-right = ##t } -test=#(define-scheme-function (parser location str int frac exp) +test=#(define-scheme-function (str int frac exp) ((string? "def1") (integer? "def2") (number-pair? "def3") list?) (if (not (equal? (list str int frac) exp)) - (ly:parser-error parser + (ly:parser-error (format #f "Expected ~a, got ~a.\n" exp (list str int frac)) - location))) + (*location*)))) \test "a" #3 #'(3 . 4) #'("a" 3 (3 . 4)) \test "a" #3 #'("a" 3 "def3") diff --git a/input/regression/optional-args.ly b/input/regression/optional-args.ly index 83ebf7886a..8277ce28c0 100644 --- a/input/regression/optional-args.ly +++ b/input/regression/optional-args.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.22" \header{ texidoc= "Test optional music function arguments. @@ -10,24 +10,19 @@ the rest is skipped." \layout { ragged-right = ##t } -% Get following pitch into Scheme -pitch = #(define-scheme-function (parser location p) (ly:pitch?) p) -% The same with a duration -dur = #(define-scheme-function (parser location p) (ly:duration?) p) - % Just like \relative, but defaulting to f as reference, making the % first note of the music the same as if written as absolute pitch ablative = -#(define-music-function (parser location ref music) - ((ly:pitch? #{ \pitch f #}) ly:music?) +#(define-music-function (ref music) + ((ly:pitch? #{ f #}) ly:music?) #{ \relative $ref $music #}) % Let's take a duration and four pitches, defaulting to 2 c' d' e' zap = -#(define-music-function (parser location dur a b c d) - ((ly:duration? #{ \dur 2 #}) (ly:pitch? #{ \pitch c' #}) - (ly:pitch? #{ \pitch d' #}) (ly:pitch? #{ \pitch e' #}) +#(define-music-function (dur a b c d) + ((ly:duration? #{ 2 #}) (ly:pitch? #{ c' #}) + (ly:pitch? #{ d' #}) (ly:pitch? #{ e' #}) ly:music?) #{ $a $dur $b $c ^\markup{!} $d #}) -\new Voice { \relative c' e' \relative c' { e' } \ablative c' e' \ablative { e' } +\new Voice { \relative c' e' \relative { e'' } \ablative c' e' \ablative { e' } \zap 8. c'' d'' {e''4..} \zap f''8 g'' \zap 4 a'' b'' c''' d'''2 } diff --git a/input/regression/ottava-broken.ly b/input/regression/ottava-broken.ly index 30f4c57016..7d01169544 100644 --- a/input/regression/ottava-broken.ly +++ b/input/regression/ottava-broken.ly @@ -10,12 +10,12 @@ the end of the line (regardless of prefatory matter). } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c''' { - a2 b +\relative { + a''2 b \ottava #1 a2 b \time 3/4 \break c''2. \break a diff --git a/input/regression/ottava.ly b/input/regression/ottava.ly index 54501c50c9..0cb98e915d 100644 --- a/input/regression/ottava.ly +++ b/input/regression/ottava.ly @@ -11,7 +11,7 @@ markup can be tuned with @code{Staff.ottavation}. } -\version "2.16.0" +\version "2.19.21" %% . There must be a minimum distance between the octavation line and the %% topmost staff line, taking into account the height of the closing @@ -35,8 +35,8 @@ markup can be tuned with @code{Staff.ottavation}. \layout { ragged-right = ##t} -\relative c''' { - a b c a +\relative { + a'' b c a \ottava #1 a b c a \ottava #0 diff --git a/input/regression/override-nest-scheme.ly b/input/regression/override-nest-scheme.ly index 03a710b679..f658a529c5 100644 --- a/input/regression/override-nest-scheme.ly +++ b/input/regression/override-nest-scheme.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "A sublist of grob property lists may be overridden within a callback. @@ -6,11 +6,11 @@ of the right bound of the glissando spanner." } -\relative c' { +\relative { \override Glissando.after-line-breaking = #(lambda (grob) (ly:grob-set-nested-property! grob '(bound-details right Y) 3)) - c1 \glissando + c'1 \glissando d1 } diff --git a/input/regression/override-nest.ly b/input/regression/override-nest.ly index 08a45d36d6..ba5ed09062 100644 --- a/input/regression/override-nest.ly +++ b/input/regression/override-nest.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Sublist of grob property lists may be also tuned. In the @@ -6,9 +6,9 @@ next example, the @code{beamed-lengths} property of the @code{Stem} grob is tweaked." } -\relative c' { +\relative { \override Stem.details.beamed-lengths = #'(6 10 8) - c8[ c] c16[ c] c32[ c] - \revert Stem.details + c'8[ c] c16[ c] c32[ c] + \revert Stem.details.beamed-lengths c8[ c] c16[ c] c32[ c] } diff --git a/input/regression/page-breaking-good-estimation.ly b/input/regression/page-breaking-good-estimation.ly index b2038ad65b..654abe062f 100644 --- a/input/regression/page-breaking-good-estimation.ly +++ b/input/regression/page-breaking-good-estimation.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "The page breaking algorithm can handle clefs combined @@ -9,8 +9,8 @@ should fit on one page here." #(set-default-paper-size "a6") -Melody = \relative c' { - c2 c | c c | c c | \break +Melody = \relative { + c'2 c | c c | c c | \break c2 c | c c | c c } Words = \lyricmode{ diff --git a/input/regression/page-breaking-min-distance.ly b/input/regression/page-breaking-min-distance.ly index db23c7f274..71c2dd91da 100644 --- a/input/regression/page-breaking-min-distance.ly +++ b/input/regression/page-breaking-min-distance.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.12" \header { texidoc = "minimum-distance is correctly accounted for in page breaking." @@ -6,7 +6,7 @@ \book { \paper { - score-system-spacing #'minimum-distance = #'20 + score-system-spacing.minimum-distance = #'20 paper-height = 8\cm } diff --git a/input/regression/page-breaks.ly b/input/regression/page-breaks.ly index e47a85f142..441579a44a 100644 --- a/input/regression/page-breaks.ly +++ b/input/regression/page-breaks.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -76,7 +76,7 @@ \book { \score { - \new Staff \relative c' { + \new Staff \relative { %% 19: ideally cramped %% Calculating page breaks...[6][11][16] %%\repeat unfold 19 { a b c d \break } diff --git a/input/regression/page-headers-and-footers.ly b/input/regression/page-headers-and-footers.ly index f50c73c822..01e154160a 100644 --- a/input/regression/page-headers-and-footers.ly +++ b/input/regression/page-headers-and-footers.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -38,7 +38,7 @@ \book { \score { - \new Staff \relative c' { + \new Staff \relative { \repeat unfold 18 { a b c d \break } } } diff --git a/input/regression/page-label-loose-column.ly b/input/regression/page-label-loose-column.ly index 5d765dbe29..a5925b51e0 100644 --- a/input/regression/page-label-loose-column.ly +++ b/input/regression/page-label-loose-column.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Page labels on loose columns are not ignored: this includes both mid-line @@ -11,8 +11,8 @@ break-aligned grobs)." \book { \markuplist \table-of-contents - \relative c' { - c2 \tocItem "Mid-line" c^"mid" + \relative { + c'2 \tocItem "Mid-line" c^"mid" c1 \bar "" \tocItem "Empty bar line" diff --git a/input/regression/page-layout.ly b/input/regression/page-layout.ly index 655d34a6d9..4eafd885a0 100644 --- a/input/regression/page-layout.ly +++ b/input/regression/page-layout.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" @@ -45,18 +45,18 @@ This file is best viewed outside the collated files document. \book { \score { - \relative c'' { + \relative { \repeat unfold 10 { - \repeat unfold 4 {c4} + \repeat unfold 4 {c''4} } } \header {piece = "Piece I"} \layout {line-width = 13\cm} } \score { - \relative c'' { + \relative { \repeat unfold 10 { - \repeat unfold 4 {c4} + \repeat unfold 4 {c''4} } } \header { diff --git a/input/regression/page-spacing-nonstaff-lines-and-markup.ly b/input/regression/page-spacing-nonstaff-lines-and-markup.ly index 1f7f6ef350..c0b32e8af0 100644 --- a/input/regression/page-spacing-nonstaff-lines-and-markup.ly +++ b/input/regression/page-spacing-nonstaff-lines-and-markup.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.2" \header { texidoc = "Having markup after a non-staff line doesn't confuse @@ -13,7 +13,7 @@ the page layout engine." \new Staff << \new Voice = "asdf" { c' d' e' f' } >> - \new Lyrics \lyricsto "asdf" \lyricmode { a b c d } + \new Lyrics \lyricsto "asdf" { a b c d } >> } \markup "next song" diff --git a/input/regression/page-spacing-nonstaff-lines-between.ly b/input/regression/page-spacing-nonstaff-lines-between.ly index 40e13626a9..99eafde43b 100644 --- a/input/regression/page-spacing-nonstaff-lines-between.ly +++ b/input/regression/page-spacing-nonstaff-lines-between.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Non-staff lines between two systems don't confuse the @@ -20,8 +20,8 @@ between the two closest staves of consecutive systems." My2 first Li4 -- ly song,2 My2 first Li4 -- ly song,2 } - \context Voice = "voice" \relative c'' { - d2 d c4 bes a2 \break + \context Voice = "voice" \relative { + d''2 d c4 bes a2 \break d'2 d c4 bes a2 } \new Lyrics \lyricmode { diff --git a/input/regression/page-spacing-nonstaff-lines-bottom.ly b/input/regression/page-spacing-nonstaff-lines-bottom.ly index 656f700241..7c09799add 100644 --- a/input/regression/page-spacing-nonstaff-lines-bottom.ly +++ b/input/regression/page-spacing-nonstaff-lines-bottom.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "A non-staff line (such as @code{Lyrics}) at the @@ -13,8 +13,8 @@ bottom of a system gets spaced appropriately." } } << - \new Staff \relative c'' { - d2 d c4 bes a2 \break + \new Staff \relative { + d''2 d c4 bes a2 \break } \addlyrics { My first Li -- ly song, diff --git a/input/regression/page-spacing-nonstaff-lines-independent.ly b/input/regression/page-spacing-nonstaff-lines-independent.ly index 96f1c1df12..b3de769891 100644 --- a/input/regression/page-spacing-nonstaff-lines-independent.ly +++ b/input/regression/page-spacing-nonstaff-lines-independent.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.25" \header { texidoc = "Spacing rules between Staves coexist with rules affecting @@ -9,10 +9,10 @@ staves is larger than the @code{padding} for associated lyrics." << \new Staff { c''2 c } \addlyrics { high \skip2 } - \new Staff = "bass" \new Voice = "b" { \clef bass c2 c' } - \new Lyrics \with { + \new Staff = "bass" { \clef bass c2 c' } + \addlyrics \with { alignAboveContext = "bass" - } \lyricsto "b" \lyricmode { bass \skip2 } + } { bass \skip2 } >> \layout { \context { diff --git a/input/regression/page-spacing-nonstaff-lines-top.ly b/input/regression/page-spacing-nonstaff-lines-top.ly index 9e9ce607f1..f1891e072b 100644 --- a/input/regression/page-spacing-nonstaff-lines-top.ly +++ b/input/regression/page-spacing-nonstaff-lines-top.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "A non-staff line (such as @code{Lyrics}) at the top @@ -20,8 +20,8 @@ of a system is spaced appropriately." \new Lyrics \lyricmode { Not2 much can4 go wrong! } - \context Voice = "voice" \relative c'' { - d2 d c4 bes a2 + \context Voice = "voice" \relative { + d''2 d c4 bes a2 } >> diff --git a/input/regression/page-spacing-system-count.ly b/input/regression/page-spacing-system-count.ly index 4c2c60ac0d..935baf8ead 100644 --- a/input/regression/page-spacing-system-count.ly +++ b/input/regression/page-spacing-system-count.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Page layout and stretching work with system-count enabled." @@ -14,9 +14,9 @@ \book { \score { << - \relative c'' { \repeat unfold 10 c1 } - \relative c'' { \repeat unfold 10 c1 } - \relative c'' { \repeat unfold 10 c1 } + \relative { \repeat unfold 10 c''1 } + \relative { \repeat unfold 10 c''1 } + \relative { \repeat unfold 10 c''1 } >> } } diff --git a/input/regression/page-spacing.ly b/input/regression/page-spacing.ly index f62e472255..2227b0fb1e 100644 --- a/input/regression/page-spacing.ly +++ b/input/regression/page-spacing.ly @@ -13,15 +13,15 @@ By setting @code{annotate-spacing}, we can see the effect of each property. } -\version "2.17.6" +\version "2.19.21" #(set-global-staff-size 11) \book { \score { - \relative c'' \new PianoStaff << + \relative \new PianoStaff << \new Voice { - c1_"followed by default spacing"\break + c''1_"followed by default spacing"\break c\break \overrideProperty @@ -65,8 +65,8 @@ By setting @code{annotate-spacing}, we can see the effect of each property. ragged-last-bottom = ##f annotate-spacing = ##t obsolete-between-system-space = 1.0 - system-system-spacing #'basic-distance = #(/ obsolete-between-system-space staff-space) - score-system-spacing #'basic-distance = #(/ obsolete-between-system-space staff-space) + system-system-spacing.basic-distance = #(/ obsolete-between-system-space staff-space) + score-system-spacing.basic-distance = #(/ obsolete-between-system-space staff-space) #(set! text-font-defaults (acons 'font-size 6 diff --git a/input/regression/page-top-space.ly b/input/regression/page-top-space.ly index 80494988c3..af28db0e0c 100644 --- a/input/regression/page-top-space.ly +++ b/input/regression/page-top-space.ly @@ -4,15 +4,15 @@ first system can be forced to be uniform." } -\version "2.17.6" +\version "2.19.21" #(set-default-paper-size "a6") \book { \score { - \relative c' { - c1\break\pageBreak + \relative { + c'1\break\pageBreak c1\break\pageBreak c1 \break\pageBreak @@ -23,7 +23,7 @@ first system can be forced to be uniform." \paper { obsolete-page-top-space = 3 \cm - top-system-spacing #'basic-distance = #(/ obsolete-page-top-space staff-space) + top-system-spacing.basic-distance = #(/ obsolete-page-top-space staff-space) } } diff --git a/input/regression/page-turn-page-breaking-auto-first-page.ly b/input/regression/page-turn-page-breaking-auto-first-page.ly index fcee7676c8..e766c885e3 100644 --- a/input/regression/page-turn-page-breaking-auto-first-page.ly +++ b/input/regression/page-turn-page-breaking-auto-first-page.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "By default, we start with page 1, which is on the right hand side @@ -17,6 +17,6 @@ number to 2 in order to avoid a bad page turn." \book { \score { - \relative c' {\repeat unfold 60 {a b c d}} + \relative {\repeat unfold 60 {a b c d}} } } diff --git a/input/regression/page-turn-page-breaking-badturns.ly b/input/regression/page-turn-page-breaking-badturns.ly index 47168fa145..52838112c7 100644 --- a/input/regression/page-turn-page-breaking-badturns.ly +++ b/input/regression/page-turn-page-breaking-badturns.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "cannot fit the first page turn onto a single page. Consider setting first-page-number to an even number.")) @@ -17,7 +17,7 @@ should appear on 3 pages. } \score { - \relative c' { + \relative { 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 index f007c9ba90..3c5d0a6dc4 100644 --- a/input/regression/page-turn-page-breaking-repeats.ly +++ b/input/regression/page-turn-page-breaking-repeats.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "The page-turn engraver will not count potential page @@ -23,7 +23,7 @@ long gap at the beginning or at the end of the repeat. } \score { - \relative c' { + \relative { \set Score.skipBars = ##t % this should be kept on one page \repeat volta 2 { diff --git a/input/regression/page-turn-page-breaking.ly b/input/regression/page-turn-page-breaking.ly index e54292fa0b..7416b36c0d 100644 --- a/input/regression/page-turn-page-breaking.ly +++ b/input/regression/page-turn-page-breaking.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc="The page-turn breaker will put a page turn after @@ -26,7 +26,7 @@ in which case the turn will go after the special barline. } \score { - \relative c' { + \relative { a b c d a b c d \break c d e f c d e f R1*4 \repeat unfold 13 {d4 e f g} \break diff --git a/input/regression/paper-margins-consistency.ly b/input/regression/paper-margins-consistency.ly index 3bb25d7907..91a13d5468 100644 --- a/input/regression/paper-margins-consistency.ly +++ b/input/regression/paper-margins-consistency.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "margins do not fit with line-width, setting default values")) @@ -9,7 +9,7 @@ line-width + left-margin + right-margin. In case they do not, default margins are set and a warning is printed." } -someNotes = \relative c' { \repeat unfold 40 { c4 d e f } } +someNotes = \relative { \repeat unfold 40 { c'4 d e f } } \paper { left-margin = 20 \mm diff --git a/input/regression/paper-margins-left-margin.ly b/input/regression/paper-margins-left-margin.ly index 8444b78fad..524509eadd 100644 --- a/input/regression/paper-margins-left-margin.ly +++ b/input/regression/paper-margins-left-margin.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Here only left-margin is given, right-margin will remain default." } -someNotes = \relative c' { \repeat unfold 40 { c4 d e f } } +someNotes = \relative { \repeat unfold 40 { c'4 d e f } } \paper { #(set-paper-size (ly:get-option 'paper-size)) diff --git a/input/regression/paper-margins-line-width.ly b/input/regression/paper-margins-line-width.ly index d32cbd5f50..2a0fffc6c5 100644 --- a/input/regression/paper-margins-line-width.ly +++ b/input/regression/paper-margins-line-width.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "If only line-width is given, systems are horizontally centered." } -someNotes = \relative c' { \repeat unfold 40 { c4 d e f } } +someNotes = \relative { \repeat unfold 40 { c'4 d e f } } \paper { line-width = 100 \mm diff --git a/input/regression/paper-margins-no-checks.ly b/input/regression/paper-margins-no-checks.ly index 9409ce6897..ff7d3bfd6e 100644 --- a/input/regression/paper-margins-no-checks.ly +++ b/input/regression/paper-margins-no-checks.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "All checks can be avoided by setting check-consistency to ##f in \paper." } -someNotes = \relative c' { \repeat unfold 40 { c4 d e f } } +someNotes = \relative { \repeat unfold 40 { c'4 d e f } } \paper { left-margin = 20 \mm diff --git a/input/regression/paper-margins-overrun.ly b/input/regression/paper-margins-overrun.ly index 95f33f341f..6c929233e6 100644 --- a/input/regression/paper-margins-overrun.ly +++ b/input/regression/paper-margins-overrun.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "systems run off the page due to improper paper settings, setting default values")) @@ -9,7 +9,7 @@ #(set-default-paper-size "a4") -someNotes = \relative c' { \repeat unfold 40 { c4 d e f } } +someNotes = \relative { \repeat unfold 40 { c'4 d e f } } \paper { left-margin = 20 \mm diff --git a/input/regression/paper-margins-right-margin.ly b/input/regression/paper-margins-right-margin.ly index c4a5361ca0..2e71aa7681 100644 --- a/input/regression/paper-margins-right-margin.ly +++ b/input/regression/paper-margins-right-margin.ly @@ -1,10 +1,10 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Here only right-margin is given, left-margin will remain default." } -someNotes = \relative c' { \repeat unfold 40 { c4 d e f } } +someNotes = \relative { \repeat unfold 40 { c'4 d e f } } \paper { #(set-paper-size (ly:get-option 'paper-size)) diff --git a/input/regression/paper-margins.ly b/input/regression/paper-margins.ly index 192d2cdc73..c0adb02f9a 100644 --- a/input/regression/paper-margins.ly +++ b/input/regression/paper-margins.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Paper margin settings do not have to be complete. @@ -6,7 +6,7 @@ Missing values are added automatically. If no paper settings are specified, default values are used." } -someNotes = \relative c' { \repeat unfold 40 { c4 d e f } } +someNotes = \relative { \repeat unfold 40 { c'4 d e f } } \paper { #(set-paper-size (ly:get-option 'paper-size)) diff --git a/input/regression/paper-nested-override.ly b/input/regression/paper-nested-override.ly index 5af168c697..3c16f09ab3 100644 --- a/input/regression/paper-nested-override.ly +++ b/input/regression/paper-nested-override.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.12" \header { texidoc = "Nested properties can be set in the paper block." } \paper { - system-system-spacing #'minimum-distance = #0.0 + system-system-spacing.minimum-distance = #0.0 } { c1 \break c1 } diff --git a/input/regression/paper-nested-override2.ly b/input/regression/paper-nested-override2.ly index ce359b7403..a444718e39 100644 --- a/input/regression/paper-nested-override2.ly +++ b/input/regression/paper-nested-override2.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Setting individual nested paper properties does not @@ -9,9 +9,9 @@ remove existing settings or break spacing annotation." \paper { annotate-spacing = ##t system-system-spacing = #'((basic-distance . 12) (minimum-distance . 8)) - system-system-spacing #'padding = #1 + system-system-spacing.padding = #1 } - \relative c' { + \relative { \repeat unfold 10 { a4 d e f } } } diff --git a/input/regression/paper-twosided-bcorr.ly b/input/regression/paper-twosided-bcorr.ly index ff61296161..178f4aa66e 100644 --- a/input/regression/paper-twosided-bcorr.ly +++ b/input/regression/paper-twosided-bcorr.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "In two-sided mode, a binding offset can be specified, which is added to the inner margin automatically." } -someNotes = \relative c' { \repeat unfold 200 { c4 d e f } } +someNotes = \relative { \repeat unfold 200 { c'4 d e f } } \paper { two-sided = ##t diff --git a/input/regression/paper-twosided.ly b/input/regression/paper-twosided.ly index fbc11a17aa..0a32dd3531 100644 --- a/input/regression/paper-twosided.ly +++ b/input/regression/paper-twosided.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Two-sided mode allows you to use different margins for odd and even pages." } -someNotes = \relative c' { \repeat unfold 200 { c4 d e f } } +someNotes = \relative { \repeat unfold 200 { c'4 d e f } } \paper { two-sided = ##t diff --git a/input/regression/parallelmusic-partial.ly b/input/regression/parallelmusic-partial.ly new file mode 100644 index 0000000000..1ae05af13b --- /dev/null +++ b/input/regression/parallelmusic-partial.ly @@ -0,0 +1,34 @@ +\version "2.19.22" + +\header { + texidoc = " +@code{\\parallelMusic} does not complain about incomplete bars at its +end. +" +} + +\parallelMusic vI.vII +\fixed c' +{ + f2 | + a2 | + d2 r2 | + d2 r8 cis cis cis | + d4 r4 \bar "|." | + d4 r4 \bar "|." | +} + +global = +{ + \key d\minor + \time 4/4 + \partial 2 +} + +\score { + \new StaffGroup + << + \new Staff { \global \vI } + \new Staff { \global \vII } + >> +} diff --git a/input/regression/parent-alignment-synchronized-with-self-alignment.ly b/input/regression/parent-alignment-synchronized-with-self-alignment.ly new file mode 100644 index 0000000000..50d21d8765 --- /dev/null +++ b/input/regression/parent-alignment-synchronized-with-self-alignment.ly @@ -0,0 +1,36 @@ +\version "2.19.11" + +\header { + texidoc = "When @code{parent-alignment-X} property is unset, +the value of @code{self-alignment-X} will be used as the factor +for parent alignment. This happens e.g. for LyricTexts." +} + +{ + \time 4/2 + % use breve noteheads because their refpoints aren't on their + % left edges - this may help catching subtle bugs. + \override NoteHead.style = #'altdefault + <>^"alignments “synchronized”:" + f'\breve f' f' + <>^"parent-alignment set to ##f:" + f' f' f' +} +\addlyrics { + \override LyricSpace.minimum-distance = 5 + + \override LyricText.self-alignment-X = #LEFT + left + \override LyricText.self-alignment-X = #CENTER + center + \override LyricText.self-alignment-X = #RIGHT + right + + \override LyricText.parent-alignment-X = ##f + \override LyricText.self-alignment-X = #LEFT + left + \override LyricText.self-alignment-X = #CENTER + center + \override LyricText.self-alignment-X = #RIGHT + right +} diff --git a/input/regression/parenthesize-markup.ly b/input/regression/parenthesize-markup.ly index 162285e954..ba5268756e 100644 --- a/input/regression/parenthesize-markup.ly +++ b/input/regression/parenthesize-markup.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header{ @@ -12,7 +12,7 @@ The angularity of the parentheses can be adjusted. } \score { - \relative c'' {c^\markup { + \relative {c''^\markup { \parenthesize { \column { "A" "B" "C" } } diff --git a/input/regression/parenthesize-notes-accidentals.ly b/input/regression/parenthesize-notes-accidentals.ly new file mode 100644 index 0000000000..f1a15fb4e6 --- /dev/null +++ b/input/regression/parenthesize-notes-accidentals.ly @@ -0,0 +1,13 @@ +\version "2.19.19" + +\header { + texidoc = "Parentheses around notes also include accidentals and dots; +they are centered on the vertical center of the combined enclosed items." +} + +\score { + \new Staff { + \parenthesize ais'4. \parenthesize des''4 + } +} + diff --git a/input/regression/parenthesize.ly b/input/regression/parenthesize.ly index a39a61ca79..f7ea40b937 100644 --- a/input/regression/parenthesize.ly +++ b/input/regression/parenthesize.ly @@ -12,10 +12,10 @@ ragged-right = ##t } -\version "2.17.6" +\version "2.19.21" -\relative c' { - c2 -\parenthesize -. +\relative { + c'2 -\parenthesize -. \parenthesize \breathe diff --git a/input/regression/part-combine-a2.ly b/input/regression/part-combine-a2.ly index d6dae3ac7b..bb2b0207e7 100644 --- a/input/regression/part-combine-a2.ly +++ b/input/regression/part-combine-a2.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc ="The a2 string is printed only on notes (i.e. not on rests), and only after chords, solo or polyphony." } -vone = \relative a' { R1*2 g2 r2 g2 r2 a4 r4 g } -vtwo = \relative a' { R1*2 g2 r2 g2 r2 f4 r4 g } +vone = \relative { R1*2 g'2 r2 g2 r2 a4 r4 g } +vtwo = \relative { R1*2 g'2 r2 g2 r2 f4 r4 g } comment = \relative c' { s1*2 s2_"a2" s2 s2_"no a2" s2 s4 s4 s4_"a2" } diff --git a/input/regression/part-combine-chord-range.ly b/input/regression/part-combine-chord-range.ly new file mode 100644 index 0000000000..3683ba0f19 --- /dev/null +++ b/input/regression/part-combine-chord-range.ly @@ -0,0 +1,23 @@ +\header { + texidoc ="The part combiner has an option to set the range of +differences in steps between parts that may be combined into chords." +} + +\version "2.19.21" + +\layout { ragged-right = ##t } + +vone = \relative { + d'4 e f fisis | g geses b' bisis | b2 beses +} + +vtwo = \relative { + e'4 e e e | e eisis d deses | c2 cisis +} + +comm = { s1_"apart" s1_"chords" s1_"apart" } + +\new Staff << + \partcombine #'(2 . 12) \vone \vtwo + \comm +>> diff --git a/input/regression/part-combine-cross.ly b/input/regression/part-combine-cross.ly index 490abbcb8a..fb570d0a4c 100644 --- a/input/regression/part-combine-cross.ly +++ b/input/regression/part-combine-cross.ly @@ -4,10 +4,10 @@ " } -\version "2.16.0" +\version "2.19.21" -vone = \relative a' { g4 g f f e e d d } -vtwo = \relative a' { e4 e f f g g a a } +vone = \relative { g'4 g f f e e d d } +vtwo = \relative { e'4 e f f g g a a } \layout { ragged-right = ##t } \partcombine \vone \vtwo diff --git a/input/regression/part-combine-force-mmrest-position.ly b/input/regression/part-combine-force-mmrest-position.ly index 430fb27719..cbdbd0cd8a 100644 --- a/input/regression/part-combine-force-mmrest-position.ly +++ b/input/regression/part-combine-force-mmrest-position.ly @@ -7,7 +7,7 @@ \layout { ragged-right = ##t } -\version "2.16.0" +\version "2.19.21" mI = \relative c'' { \partcombineApart @@ -15,9 +15,9 @@ mI = \relative c'' { R1 | c1 } -mII = \relative c' { +mII = \relative { R1 | - c2 c | + c'2 c | c1 } diff --git a/input/regression/part-combine-force-once.ly b/input/regression/part-combine-force-once.ly index 6b784513dc..465042786d 100644 --- a/input/regression/part-combine-force-once.ly +++ b/input/regression/part-combine-force-once.ly @@ -8,21 +8,23 @@ \layout { ragged-right = ##t } -\version "2.16.0" +\version "2.19.29" -mI = \relative c' { - e4 e \partcombineApartOnce c c | - \partcombineApart c \partcombineChordsOnce e e e | - c \partcombineUnisonoOnce c c c | - \partcombineAutomatic \partcombineSoloIOnce r2 c4 c | - \partcombineSoloIIOnce R1 | +mI = \relative { + e'4 e \once \partcombineApart c c | + \partcombineApart c \once \partcombineChords e e e | + c \once \partcombineUnisono c c c | + \partcombineAutomatic \once \partcombineSoloI r2 c4 c | + \once \partcombineSoloII R1 | + d'2 \once \partcombineChords d4^"1 chord" d| } -mII = \relative c' { - c4 \partcombineApartOnce c c c | - c c \partcombineAutomaticOnce e e | +mII = \relative { + c'4 \once \partcombineApart c c c | + c c \once \partcombineAutomatic e e | c c c c | R1 | r2 c4 c | + b4 b b b | } \score { diff --git a/input/regression/part-combine-force.ly b/input/regression/part-combine-force.ly index 46894fa0e4..4a41ae3104 100644 --- a/input/regression/part-combine-force.ly +++ b/input/regression/part-combine-force.ly @@ -1,17 +1,17 @@ \header { texidoc ="Overrides for the part-combiner. All functions like - @code{\\partcombineApart} and @code{\\partcombineApartOnce} are internally implemented - using a dedicated @code{PartCombineForceEvent}. -" + @code{\\partcombineApart} and @code{\\once \partcombineApart} are + internally implemented using a dedicated @code{partCombineForced} + context property." } \layout { ragged-right = ##t } -\version "2.16.0" +\version "2.19.29" -mI = \relative c' { - e4 e c2 | +mI = \relative { + e'4 e c2 | \partcombineApart c^"apart" e | e e | \partcombineChords e'^"chord" e | @@ -19,8 +19,8 @@ mI = \relative c' { \partcombineUnisono c^"unisono" c | \partcombineAutomatic c\! c^"V1 longer" | } -mII = \relative c' { - c4 c c2 | +mII = \relative { + c'4 c c2 | c c | \partcombineAutomatic e^"auto" e | a, c | diff --git a/input/regression/part-combine-global.ly b/input/regression/part-combine-global.ly index bf2afed3ea..e52ea590a4 100644 --- a/input/regression/part-combine-global.ly +++ b/input/regression/part-combine-global.ly @@ -11,21 +11,21 @@ voices. " } -\version "2.16.0" +\version "2.19.21" vone = %%%%%%%%%%%%%% 0 1 2 3 -\relative c'' { +\relative { \time 2/4 - a8[ a] a8[ a] | + a'8[ a] a8[ a] | a8[ a] a8[ a] } vtwo = -\relative c' { +\relative { \time 2/4 - f8[ f]~ f8[ f] | + f'8[ f]~ 8[ f] | f8[ f] f8[ f] } diff --git a/input/regression/part-combine-inside-grace.ly b/input/regression/part-combine-inside-grace.ly new file mode 100644 index 0000000000..b2ac560b08 --- /dev/null +++ b/input/regression/part-combine-inside-grace.ly @@ -0,0 +1,15 @@ +\header { + texidoc = "The notes of the first chord share a stem but the notes of the second chord do not." +} + +\version "2.19.22" +\layout { ragged-right = ##t } + +\score { + \context Voice = "v" { + r2 + \grace { \partcombine \relative { e'16 e } + \relative { c'16 f } } + c'2 + } +} diff --git a/input/regression/part-combine-markup.ly b/input/regression/part-combine-markup.ly index cba4674dcf..35fdba6108 100644 --- a/input/regression/part-combine-markup.ly +++ b/input/regression/part-combine-markup.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Part combine texts accept markup." @@ -9,6 +9,6 @@ \set Score.soloIIText = \markup { \huge \italic II } \set Score.aDueText = \markup { \normal-text \rounded-box { "a 2" } } \partcombine - \relative g' { g4 g r r a2 g } - \relative g' { r4 r a( b) a2 g } + \relative { g'4 g r r a2 g } + \relative { r4 r a'( b) a2 g } >> diff --git a/input/regression/part-combine-mmrest-after-apart-silence.ly b/input/regression/part-combine-mmrest-after-apart-silence.ly new file mode 100644 index 0000000000..99f1f8f34b --- /dev/null +++ b/input/regression/part-combine-mmrest-after-apart-silence.ly @@ -0,0 +1,18 @@ +\version "2.19.16" + +\header { + texidoc = "Normal rests are preferred over multi-measure rests. A multi-measure rest beginning in one part in the middle of a multi-measure rest in the other part appears as expected." +} + +\score { << + \new Staff { + \partcombine + \relative f' { r2 r2 | R1 } + \relative f' { R1*2 } + } + \new Staff { + \partcombine + \relative f' { R1*2 } + \relative f' { r2 r2 | R1 } + } +>> } diff --git a/input/regression/part-combine-mmrest-after-solo.ly b/input/regression/part-combine-mmrest-after-solo.ly index ca80ade765..be4cfc4dda 100644 --- a/input/regression/part-combine-mmrest-after-solo.ly +++ b/input/regression/part-combine-mmrest-after-solo.ly @@ -1,10 +1,10 @@ \header { texidoc = " Multimeasure rests are printed after solos, both for solo1 and for solo2." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } \new Staff \partcombine \relative c''{ R1*2 | c4 r2. | c2 r | R1 } -\relative c' { c2 r | R1 | c4 r2. | R1*2 } +\relative { c'2 r | R1 | c4 r2. | R1*2 } diff --git a/input/regression/part-combine-mmrest-shared.ly b/input/regression/part-combine-mmrest-shared.ly new file mode 100644 index 0000000000..ede5bc2a85 --- /dev/null +++ b/input/regression/part-combine-mmrest-shared.ly @@ -0,0 +1,26 @@ +\version "2.19.20" + +\header { + texidoc = "Multi-measure rests do not have to begin and end simultaneously to be combined." +} + +\score { << + \compressMMRests + \partcombine + \relative f' { R1*8 | R1*16 | R1*4 } + \relative f' { R1*16 | R1*8 | R1*4 } +>> } + +\score { << + \compressMMRests + \partcombine + \relative f' { R1*8 | r1^"r" | R1*15 | R1*4 } + \relative f' { R1*16 | R1*8 | R1*4 } +>> } + +\score { << + \compressMMRests + \partcombine + \relative f' { R1*16 | R1*8 | R1*4 } + \relative f' { R1*8 | r1_"r" | R1*15 | R1*4 } +>> } diff --git a/input/regression/part-combine-relative.ly b/input/regression/part-combine-relative.ly new file mode 100644 index 0000000000..33914bcd0f --- /dev/null +++ b/input/regression/part-combine-relative.ly @@ -0,0 +1,17 @@ +\version "2.19.23" + +\header { + texidoc = "@code{\\partcombine} needs to be given pitches in their +final octaves, so if @code{\\relative} is used it must be applied +inside @code{\\partcombine}. The pitches in @code{\\partcombine} are +unaffected by an outer @code{\\relative}, so that the printed output +shows the pitches that @code{\\partcombine} used. + +The expected output of this test is three identical measures." +} + +\new Staff { + \partcombine \absolute { e'2 f' } { c'2 d' } + \relative \partcombine { e'2 f' } { c'2 d' } % relative is ignored + \partcombine \relative { e'2 f } \relative { c'2 d } +} diff --git a/input/regression/part-combine-silence-mixed.ly b/input/regression/part-combine-silence-mixed.ly new file mode 100644 index 0000000000..a399431a00 --- /dev/null +++ b/input/regression/part-combine-silence-mixed.ly @@ -0,0 +1,18 @@ +\version "2.19.16" + +\header { + texidoc = "Different kinds of silence are not merged into the shared voice even if they begin and end simultaneously; however, when rests and skips are present in the same part, the skips are ignored." +} + +\score { << + \new Staff { + \partcombine + \relative f' { R1^"R" | s1^"s" | r1^"r" | << R1 s1 s4 >> | << r1 s2 s4 >> } + \relative f' { r1_"r" | R1_"R" | s1_"s" | << s4 s1 R1 >> | << s4 s2 r1 >> } + } + \new Staff { + \partcombine + \relative f' { r1^"r" | R1^"R" | s1^"s" | << s4 s1 R1 >> | << s4 s2 r1 >> } + \relative f' { R1_"R" | s1_"s" | r1_"r" | << R1 s1 s4 >> | << r1 s2 s4 >> } + } +>> } diff --git a/input/regression/part-combine-silence.ly b/input/regression/part-combine-silence.ly new file mode 100644 index 0000000000..9f85629689 --- /dev/null +++ b/input/regression/part-combine-silence.ly @@ -0,0 +1,31 @@ +\version "2.19.21" + +\header { + texidoc = "Rests must begin and end simultaneously to be merged into the shared voice." +} + +% rests of different durations beginning simultaneously, followed by +% unisilence + +\score { + \partcombine + \relative f' { r4 r2 r8 r8 | r1 } + \relative f' { r8 r8 r2 r4 | r1 } +} + +% rests of different durations beginning simultaneously, followed by +% solo then a2. + +\score { + \partcombine + \relative { r4 f'2. | r8 f e2. } + \relative { r8 d' f2. | r4 e2. } +} + +% mmrest and rest of different durations beginning simultaneously + +\score { + \partcombine + \relative { r4 f'2. | R1 } + \relative { R1 | r4 d'2. } +} diff --git a/input/regression/part-combine-solo-global.ly b/input/regression/part-combine-solo-global.ly index 1b98aac6ba..73fe2f84f1 100644 --- a/input/regression/part-combine-solo-global.ly +++ b/input/regression/part-combine-solo-global.ly @@ -5,14 +5,14 @@ } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } \new Staff - \partcombine \relative c'' { - bes2( + \partcombine \relative { + bes'2( a4) } - \relative c' { - r2 cis4 + \relative { + r2 cis'4 } diff --git a/input/regression/part-combine-solo.ly b/input/regression/part-combine-solo.ly index 621282709e..75803487a2 100644 --- a/input/regression/part-combine-solo.ly +++ b/input/regression/part-combine-solo.ly @@ -14,10 +14,10 @@ Solo 1/2 can not be used when a spanner is active, so there is no solo " } -vone = \relative a' { d4 r8 d8 d8 r8 d8 r8 d2 ~ d2 ~ d4 } -vtwo = \relative g' { g4. g8 r2 g4 r4 r2 g4 } +vone = \relative { d''4 r8 d8 d8 r8 d8 r8 d2 ~ 2 ~ 4 } +vtwo = \relative { g'4. g8 r2 g4 r4 r2 g4 } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } diff --git a/input/regression/part-combine-strings.ly b/input/regression/part-combine-strings.ly new file mode 100644 index 0000000000..7bcb19959c --- /dev/null +++ b/input/regression/part-combine-strings.ly @@ -0,0 +1,26 @@ +\version "2.19.21" +\header { + texidoc = "Test some transitions that might be found in string parts produced with \\partcombine." +} + +vone = \relative { a'2 | r2 | r r | r2 a4 r4 | g2 r | } +vtwo = \relative { e'2 | r2 r | r | r2 f4 r4 | g2 r | } +combined = \partcombine \vone \vtwo + +% The part combiner does not yet support all of these labels. +expectedText = \relative c' { + s2_"div." s2_"unis." | s2 s2_"solo" | s2_"solo 2" s2 | + s2 s4_\markup \column { tutti, div. } s4 | s2_"unis." s | s_"div." +} + +\layout { ragged-right = ##t } + +\new Staff \with { + aDueText = "unis." + soloText = "solo" + soloIIText = "solo 2" +} << + \set Score.skipBars = ##t + \combined + \expectedText +>> diff --git a/input/regression/part-combine-text-wait.ly b/input/regression/part-combine-text-wait.ly index bb868e430e..5e44e32597 100644 --- a/input/regression/part-combine-text-wait.ly +++ b/input/regression/part-combine-text-wait.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -10,13 +10,13 @@ rests and then a solo." \layout { ragged-right = ##t } -mI = \relative c'' { +mI = \relative { \set Score.partCombineTextsOnNote = ##t - g4 \partcombineSoloI r4 c2 | + g'4 \partcombineSoloI r4 c2 | \partcombineSoloII R1*2 | } -mII = \relative c' { - c4 r2. | +mII = \relative { + c'4 r2. | r2 r4 c4 | R1 | } diff --git a/input/regression/part-combine-text.ly b/input/regression/part-combine-text.ly index cfa905f89b..8b65a749b9 100644 --- a/input/regression/part-combine-text.ly +++ b/input/regression/part-combine-text.ly @@ -9,12 +9,12 @@ texts accordingly. } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right= ##t } -vone = \relative a' { R1 a2 r4 r a a a a } -vtwo = \relative a' { R1 f4 f4 f4 f f f a a } +vone = \relative { R1 a'2 r4 r a a a a } +vtwo = \relative { R1 f'4 f4 f4 f f f a a } comm = { s1 s2 s4_\markup { \small "expect: solo 2" } s4 s2 s4_\markup { \small "expect: a2" } s4 } \new Staff << diff --git a/input/regression/part-combine-tuplet-end.ly b/input/regression/part-combine-tuplet-end.ly index 0c1c5ce195..6d31af0baa 100644 --- a/input/regression/part-combine-tuplet-end.ly +++ b/input/regression/part-combine-tuplet-end.ly @@ -5,15 +5,15 @@ even after a switch, a tuplet ends correctly." } -\version "2.17.11" +\version "2.19.21" \new Staff << \partcombine - \relative c'' { + \relative { r2 - \tuplet 3/2 { g8[ g g] } + \tuplet 3/2 { g'8[ g g] } \tuplet 3/2 { g[ g g] } g1 } - \relative c'' { R1 g1 } + \relative { R1 g'1 } >> diff --git a/input/regression/part-combine-tuplet-single.ly b/input/regression/part-combine-tuplet-single.ly index 1cdd5009e7..4aadb72e94 100644 --- a/input/regression/part-combine-tuplet-single.ly +++ b/input/regression/part-combine-tuplet-single.ly @@ -5,17 +5,17 @@ \paper { ragged-right = ##T } -\version "2.17.11" +\version "2.19.21" \score { << \new Staff { \partcombine - \relative c'' { - \tuplet 3/2 { d4 d d ~ } d2 + \relative { + \tuplet 3/2 { d''4 d d ~ } d2 } - \relative c'' { - \tuplet 3/2 { b4 a g ~ } g2 + \relative { + \tuplet 3/2 { b'4 a g ~ } g2 } } >> diff --git a/input/regression/part-combine-unequal-lengths.ly b/input/regression/part-combine-unequal-lengths.ly new file mode 100644 index 0000000000..b21a2aa965 --- /dev/null +++ b/input/regression/part-combine-unequal-lengths.ly @@ -0,0 +1,14 @@ +\version "2.19.28" + +\header { + texidoc ="The part combiner can combine parts of unequal lengths." +} + +\layout { ragged-right = ##t } + +\new Staff { %% based on the example in Issue 913 + c'1 + \partcombine { e' r } { c' } + \partcombine { b' } {} + \partcombine {} { f' } +} diff --git a/input/regression/part-combine-with-grace.ly b/input/regression/part-combine-with-grace.ly new file mode 100644 index 0000000000..379a3504a5 --- /dev/null +++ b/input/regression/part-combine-with-grace.ly @@ -0,0 +1,14 @@ +\header { + texidoc = "Grace notes in parts are combined." +} + +\version "2.19.22" +\layout { ragged-right = ##t } + +\score { + \new Voice = "v" { + r2 + \partcombine { \grace g'8 e'4 \grace g'8 e'4 } + { \grace e'8 c'4 \grace e'8 c'4 } + } +} diff --git a/input/regression/part-combine.ly b/input/regression/part-combine.ly index 8669f5bf12..1737eae57a 100644 --- a/input/regression/part-combine.ly +++ b/input/regression/part-combine.ly @@ -11,15 +11,15 @@ \layout { ragged-right = ##t } -\version "2.16.0" +\version "2.19.21" -vone = \relative a' { - g2 g g g4 g f' c c( c) c c c ~ c +vone = \relative { + g'2 g g g4 g f' c c( c) c c c ~ c c2. c4 c } -vtwo = \relative a' { - f2 f4 f f2 g4 g c, f f f f f~ f ~ f - f4 f2. ~ f4 +vtwo = \relative { + f'2 f4 f f2 g4 g c, f f f f f~ f ~ f + f4 f2. ~ 4 } diff --git a/input/regression/partial-in-mid-piece.ly b/input/regression/partial-in-mid-piece.ly new file mode 100644 index 0000000000..4c718a17cd --- /dev/null +++ b/input/regression/partial-in-mid-piece.ly @@ -0,0 +1,32 @@ +\version "2.19.11" + +\header { + texidoc = "@code{\\partial} can be can be called in mid-piece in +multiple contexts." +} + + +melodyOne = \relative { + \time 6/8 + a'8 a a a a a | + \partial 8 + d8 | + c8 c c c c c | +} + +chordsOne = \chordmode { + \time 6/8 + a2. | + \partial 8 + s8 | + a2. | +} + +\score { + << + \set Score.barNumberVisibility = #all-bar-numbers-visible + \override Score.BarNumber.break-visibility = #all-visible + \new ChordNames { \chordsOne } + \new Staff { \melodyOne } + >> +} diff --git a/input/regression/partial-polymetric.ly b/input/regression/partial-polymetric.ly index cccf47e98c..98f658be50 100644 --- a/input/regression/partial-polymetric.ly +++ b/input/regression/partial-polymetric.ly @@ -1,14 +1,14 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "@code{\\partial} works with polymetric staves." } \score { - \relative c' << + \relative << \new Staff { \partial 4 - c4 | + c'4 | c4 c c c | } \new Staff { diff --git a/input/regression/pdfmark-metadata.ly b/input/regression/pdfmark-metadata.ly index c4158ee29a..c88c576328 100644 --- a/input/regression/pdfmark-metadata.ly +++ b/input/regression/pdfmark-metadata.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "The PDF backend uses several header fields to store metadata @@ -17,4 +17,4 @@ those without the prefix for PDF creation (not for visual display on the page). } \layout { ragged-right= ##t } -\relative c' { g4 } +\relative { g4 } diff --git a/input/regression/pedal-bracket.ly b/input/regression/pedal-bracket.ly index f7f6319c43..e4cffe9494 100644 --- a/input/regression/pedal-bracket.ly +++ b/input/regression/pedal-bracket.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -10,10 +10,10 @@ At a line-break, there are no vertical endings. Pedal changes can be placed at spacer rests." } \score { - \relative c'' { + \relative { \set Staff.pedalSustainStyle = #'bracket - c4 d \sustainOn b c c, \sustainOff \sustainOn d8[ c] e8[ + c''4 d \sustainOn b c c, \sustainOff \sustainOn d8[ c] e8[ e \sustainOff \sustainOn] f4 r \sustainOff g \sustainOn bes bes, \sustainOff c' diff --git a/input/regression/phrasing-slur-multiple.ly b/input/regression/phrasing-slur-multiple.ly index dbef390cb5..adf8221845 100644 --- a/input/regression/phrasing-slur-multiple.ly +++ b/input/regression/phrasing-slur-multiple.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.29" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "already have phrasing slur")) @@ -12,14 +12,10 @@ slur will not be generated. However, one can can create a second slur with a different spanner-id." } -sp=#(define-event-function (parser location n e) (index? ly:event?) - (set! (ly:music-property e 'spanner-id) (format "sp~a" n)) - e) - -\relative c'' { +\relative { % This will give warnings ("Already have phrasing slur" and "Cannot end phrasing slur") - c4\(\(\sp1\( d4\)\(\sp1\( e4\) f\) | + c''4\(\(\=1\( d4\)\(\=1\( e4\) f\) | % This will give two overlapping slurs and "unterminated phrasing slur" from above - d\( d\sp2\( e\) f\sp2\) | + d\( d\=2\( e\) f\=2\) | } diff --git a/input/regression/phrasing-slur-tuplet.ly b/input/regression/phrasing-slur-tuplet.ly index 0f5aa8302a..10aa1e9a7e 100644 --- a/input/regression/phrasing-slur-tuplet.ly +++ b/input/regression/phrasing-slur-tuplet.ly @@ -1,13 +1,13 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Phrasing slurs do not collide with tuplet numbers." } -\relative c'' { +\relative { \voiceOne \tuplet 3/2 { - c8\( b c + c''8\( b c } a2.\) } diff --git a/input/regression/point-and-click-types.ly b/input/regression/point-and-click-types.ly index 73f143d1c3..aeae9f6a70 100644 --- a/input/regression/point-and-click-types.ly +++ b/input/regression/point-and-click-types.ly @@ -1,7 +1,7 @@ -\version "2.16.0" +\version "2.19.21" \pointAndClickTypes #'note-event -\relative c' { - c2\f( f) +\relative { + c'2\f( f) } \ No newline at end of file diff --git a/input/regression/prefatory-separation.ly b/input/regression/prefatory-separation.ly index 7217d4a125..ec6b334436 100644 --- a/input/regression/prefatory-separation.ly +++ b/input/regression/prefatory-separation.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -11,15 +11,15 @@ } \new Staff << - \relative c''' { + \relative { \key f \major - es4 c c c \bar "||" \noBreak + es'''4 c c c \bar "||" \noBreak \key g \major 4 r2. \bar "|." } \\ - \relative c' { + \relative { R1 - r4 cis a a + r4 cis' a a } >> \layout { diff --git a/input/regression/property-nested-override.ly b/input/regression/property-nested-override.ly index d7929a210a..491e4a12d9 100644 --- a/input/regression/property-nested-override.ly +++ b/input/regression/property-nested-override.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Nested properties may be overridden using Scheme list syntax. This test performs two property overrides: the first @@ -7,14 +7,14 @@ list. " } -\relative c' { +\relative { \once \override TextSpanner.bound-details.left.text = #"foo" - c4\startTextSpan + c'4\startTextSpan \once \override Tie.details.note-head-gap = #1 - c4 ~ c c\stopTextSpan + c4 ~ 4 c\stopTextSpan \once \override TextSpanner.bound-details.left.text = #"foo" c4\startTextSpan \once \override Tie.details.note-head-gap = #1 - c4 ~ c c\stopTextSpan + c4 ~ 4 c\stopTextSpan } diff --git a/input/regression/property-nested-revert.ly b/input/regression/property-nested-revert.ly index b8d6558842..897c54c288 100644 --- a/input/regression/property-nested-revert.ly +++ b/input/regression/property-nested-revert.ly @@ -6,10 +6,10 @@ Scheme list syntax." } -\version "2.17.6" +\version "2.19.21" -\relative c' { - f2 \glissando c +\relative { + f'2 \glissando c \override Glissando.bound-details.right.Y = #4 f2 \glissando c | \override Glissando.bound-details.left.Y = #-6 diff --git a/input/regression/property-once.ly b/input/regression/property-once.ly index 5d5b8f4b57..6434bd9a6b 100644 --- a/input/regression/property-once.ly +++ b/input/regression/property-once.ly @@ -1,13 +1,13 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Once properties take effect during a single time step only." } \layout { ragged-right = ##t } -\relative c' { - c4 +\relative { + c'4 \once \override Stem.thickness = #5.0 c4 c4 diff --git a/input/regression/quote-cue-during.ly b/input/regression/quote-cue-during.ly index 9607f4a839..446c962956 100644 --- a/input/regression/quote-cue-during.ly +++ b/input/regression/quote-cue-during.ly @@ -11,17 +11,17 @@ last note." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -quoteMe = \relative c' { fis4 r16 a8.-> b4(-\ff~ b16 c8. b) } +quoteMe = \relative { fis'4 r16 a8.-> b4(-\ff~ b16 c8. b) } \addQuote quoteMe \quoteMe -original = \relative c'' { - c8 d +original = \relative { + c''8 d \cueDuring #"quoteMe" #1 { r2 } es8 gis8 \cueDuring #"quoteMe" #1 { r4 } diff --git a/input/regression/quote-cue-event-types.ly b/input/regression/quote-cue-event-types.ly index 1ae6fcfa5f..c9ee4b5ab9 100644 --- a/input/regression/quote-cue-event-types.ly +++ b/input/regression/quote-cue-event-types.ly @@ -11,9 +11,9 @@ quoted for cue notes than for normal quotes. } -\version "2.16.0" +\version "2.19.21" -quoteMe = \relative c' { fis8 r16-. a8.-> \acciaccatura c8 b4(-\ff~ b16 c8. b8) } +quoteMe = \relative { fis'8 r16-. a8.-> \acciaccatura c8 b4(-\ff~ b16 c8. b8) } \addQuote quoteMe \quoteMe << @@ -22,16 +22,16 @@ quoteMe = \relative c' { fis8 r16-. a8.-> \acciaccatura c8 b4(-\ff~ b16 c8. b8) } \new Staff \with { instrumentName = "quoteDuring" } { % \set Staff.quotedEventTypes = #'(StreamEvent) - \relative c' { c8 \quoteDuring "quoteMe" { s8 s4 s2 } } + \relative { c'8 \quoteDuring "quoteMe" { s8 s4 s2 } } } \new Staff \with { instrumentName = "cueDuring" } { - \relative c' { c8 \cueDuring "quoteMe" #UP { r8 r4 r2 } } + \relative { c'8 \cueDuring "quoteMe" #UP { r8 r4 r2 } } } >> << \new Staff \with { instrumentName = "Fallback" } { \unset Score.quotedCueEventTypes - \relative c' { c8 \cueDuring "quoteMe" #UP { r8 r4 r2 } } + \relative { c'8 \cueDuring "quoteMe" #UP { r8 r4 r2 } } } >> diff --git a/input/regression/quote-cyclic.ly b/input/regression/quote-cyclic.ly index afbf309bc0..56a19b0b8a 100644 --- a/input/regression/quote-cyclic.ly +++ b/input/regression/quote-cyclic.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Two quoted voices may refer to each other. In this example, there are notes with each full-bar rest." } -A = \relative c' { c4 d e f | \cueDuring #"qB" #1 { R1 } | } +A = \relative { c'4 d e f | \cueDuring #"qB" #1 { R1 } | } B = \new Voice \relative c' { \cueDuring #"qA" #1 { R1 } | f4 e d c | } \addQuote "qA" \A diff --git a/input/regression/quote-during-subvoice.ly b/input/regression/quote-during-subvoice.ly index 8ec1ce676a..ae8c0680ab 100644 --- a/input/regression/quote-during-subvoice.ly +++ b/input/regression/quote-during-subvoice.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "@code{\\quoteDuring} and @code{\\cueDuring} shall properly quote @@ -9,8 +9,8 @@ which will be quoted. } % Simple case, normal sub-voice -quoteMe = \relative c' { - c4 c +quoteMe = \relative { + c'4 c \new Voice { c4 c } @@ -20,22 +20,22 @@ quoteMe = \relative c' { \addQuote "quoteMeA" \new Voice \quoteMe % Also works with voice directly inside relative -quoteMeI = \relative c' \new Voice { - c4 c4 +quoteMeI = \relative \new Voice { + c'4 c4 } \addQuote "quoteMeI" \quoteMeI % Quoting music with some parallel sections (identical rhythm) -quoteMeII = \relative c' { - c4 c +quoteMeII = \relative { + c'4 c << { d4 e4 } \\ { c4 b4 } >> c4 } \addQuote "quoteMeII" \quoteMeII % Quoting music with some parallel sections (different rhythm) -quoteMeIII = \relative c' { - c4 c +quoteMeIII = \relative { + c'4 c << { d4 e4 } \\ { c4. b8 } >> c4 } @@ -45,24 +45,24 @@ quoteMeIII = \relative c' { << - \new Staff \relative c'' { - c4 \cueDuring #"quoteMe" #DOWN { r4 } + \new Staff \relative { + c''4 \cueDuring #"quoteMe" #DOWN { r4 } c4 \cueDuring #"quoteMe" #DOWN { r4 } % <- no cue note due to sub-voice } - \new Staff \relative c'' { - c4 \cueDuring #"quoteMeA" #DOWN { r4 } + \new Staff \relative { + c''4 \cueDuring #"quoteMeA" #DOWN { r4 } c4 \cueDuring #"quoteMeA" #DOWN { r4 } % <- no cue note due to sub-voice } - \new Staff \relative c'' { - c4 \cueDuring #"quoteMeI" #DOWN { r4 } + \new Staff \relative { + c''4 \cueDuring #"quoteMeI" #DOWN { r4 } c4 } - \new Staff \relative c'' { - c4 \cueDuring #"quoteMeII" #DOWN { r4 } + \new Staff \relative { + c''4 \cueDuring #"quoteMeII" #DOWN { r4 } c4 \cueDuring #"quoteMeII" #DOWN { r4 } % <- quoted parallel notes } - \new Staff \relative c'' { - c4 \cueDuring #"quoteMeIII" #DOWN { r4 } + \new Staff \relative { + c''4 \cueDuring #"quoteMeIII" #DOWN { r4 } c4 \cueDuring #"quoteMeIII" #DOWN { r4 } % <- quoted parallel notes } >> diff --git a/input/regression/quote-during.ly b/input/regression/quote-during.ly index b84a83aa52..e270c37e68 100644 --- a/input/regression/quote-during.ly +++ b/input/regression/quote-during.ly @@ -8,16 +8,16 @@ quoted. In this example, a 16th rest is not quoted, since @code{rest-event} is not in @code{quotedEventTypes}." } -\version "2.17.6" +\version "2.19.21" \layout { ragged-right = ##t } -quoteMe = \relative c' { fis4 r16 a8.-> b4-\ff c } +quoteMe = \relative { fis'4 r16 a8.-> b4-\ff c } \addQuote quoteMe \quoteMe -original = \relative c'' { c8 d s2 es8 gis8 } +original = \relative { c''8 d s2 es8 gis8 } << \new Staff { diff --git a/input/regression/quote-kill-cues.ly b/input/regression/quote-kill-cues.ly index 4678fe8bda..299ef94c0d 100644 --- a/input/regression/quote-kill-cues.ly +++ b/input/regression/quote-kill-cues.ly @@ -1,15 +1,15 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "@code{\\killCues} shall only remove real cue notes generated by @code{\\cueDuring}, but not other music quoted using @code{\\quoteDuring}." } -mus = \relative c' { c2 c c c c c c c } +mus = \relative { c'2 c c c c c c c } \addQuote #"M" \mus -quot = \relative c' { - d2 \quoteDuring #"M" { s1 } e2 \cueDuring #"M" #UP { s1 } f2 +quot = \relative { + d'2 \quoteDuring #"M" { s1 } e2 \cueDuring #"M" #UP { s1 } f2 } \score { << diff --git a/input/regression/quote-overrides.ly b/input/regression/quote-overrides.ly index 4a7c5d22d7..4f6bbe8e07 100644 --- a/input/regression/quote-overrides.ly +++ b/input/regression/quote-overrides.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "The @code{\\quoteDuring} command shall also quote correctly all @@ -11,10 +11,10 @@ @code{'(StreamEvent)}, everything should be quoted." } -mus = \relative c' { +mus = \relative { % Acciaccaturas contain a slur and \override Flag.stroke-style % Thus, we're checking \override here - c4 \acciaccatura d8 c4 + c'4 \acciaccatura d8 c4 % Checking \set and \unset \set fontSize = #6 f \unset fontSize f | diff --git a/input/regression/quote-tie.ly b/input/regression/quote-tie.ly index e003ffbdce..862dfa6204 100644 --- a/input/regression/quote-tie.ly +++ b/input/regression/quote-tie.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Voices from different cues must not be tied together. In @@ -10,13 +10,13 @@ since only one @code{CueVoice} context is created " } -cueI = \relative c'' { - a1 ~ | a | a | +cueI = \relative { + a'1 ~ | 1 | a | } \addQuote "cueI" { \cueI } -cueII = \relative c' { - R1 | e | a | +cueII = \relative { + R1 | e' | a | } \addQuote "cueII" { \cueII } diff --git a/input/regression/quote-tuplet.ly b/input/regression/quote-tuplet.ly index 420f8641ba..cfbba5516c 100644 --- a/input/regression/quote-tuplet.ly +++ b/input/regression/quote-tuplet.ly @@ -1,5 +1,5 @@ -\version "2.17.11" +\version "2.19.21" \header { @@ -8,8 +8,8 @@ } -foo = \relative c' { - \tuplet 3/2 { c4 c c } \tuplet 3/2 { c4 c c } +foo = \relative { + \tuplet 3/2 { c'4 c c } \tuplet 3/2 { c4 c c } } \addQuote "foo" { \foo } diff --git a/input/regression/quote.ly b/input/regression/quote.ly index aa63a632bd..e884adb3f3 100644 --- a/input/regression/quote.ly +++ b/input/regression/quote.ly @@ -7,16 +7,16 @@ things are quoted. In this example, a 16th rest is not quoted, since @code{rest-event} is not in @code{quotedEventTypes}." } -\version "2.17.6" +\version "2.19.21" \layout { ragged-right = ##t } -quoteMe = \relative c' { fis4 r16 a8.-> b4-\ff c } +quoteMe = \relative { fis'4 r16 a8.-> b4-\ff c } \addQuote quoteMe \quoteMe -original = \relative c'' { c8 d s2 es8 gis8 } +original = \relative { c''8 d s2 es8 gis8 } << \new Staff { diff --git a/input/regression/rehearsal-mark-align-priority.ly b/input/regression/rehearsal-mark-align-priority.ly index d5cdfa8503..14835c95c3 100644 --- a/input/regression/rehearsal-mark-align-priority.ly +++ b/input/regression/rehearsal-mark-align-priority.ly @@ -4,11 +4,11 @@ the alignment depends on which symbols are visible." } -\version "2.17.6" +\version "2.19.21" -\relative c' { +\relative { \override Score.RehearsalMark.break-align-symbols = #'(clef key-signature staff-bar) - c1 + c'1 \clef "bass" \mark "clef" \noBreak diff --git a/input/regression/rehearsal-mark-align-staff-context.ly b/input/regression/rehearsal-mark-align-staff-context.ly index 6472c57a51..7a80eff5a7 100644 --- a/input/regression/rehearsal-mark-align-staff-context.ly +++ b/input/regression/rehearsal-mark-align-staff-context.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "RehearsalMarks still align correctly if Mark_engraver is moved to @@ -16,8 +16,8 @@ another context." } } -\relative c' { - c1 \mark "foo" +\relative { + c'1 \mark "foo" c1 \key cis \major \clef alto diff --git a/input/regression/rehearsal-mark-align.ly b/input/regression/rehearsal-mark-align.ly index a684113ab7..67ef656ecf 100644 --- a/input/regression/rehearsal-mark-align.ly +++ b/input/regression/rehearsal-mark-align.ly @@ -7,10 +7,10 @@ } -\version "2.17.6" +\version "2.19.21" -\relative c' { - c1 \mark "foo" +\relative { + c'1 \mark "foo" c1 \key cis \major \clef alto diff --git a/input/regression/rehearsal-mark-final-score.ly b/input/regression/rehearsal-mark-final-score.ly index ee0b3ed2d7..34f2df1bf9 100644 --- a/input/regression/rehearsal-mark-final-score.ly +++ b/input/regression/rehearsal-mark-final-score.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Rehearsal marks at the end of the last measure of a @@ -6,7 +6,7 @@ score are automatically made visible. " } -\relative c' { - c1 +\relative { + c'1 \mark "Final Mark" } diff --git a/input/regression/rehearsal-mark-letter.ly b/input/regression/rehearsal-mark-letter.ly index 979f43e478..6525668aca 100644 --- a/input/regression/rehearsal-mark-letter.ly +++ b/input/regression/rehearsal-mark-letter.ly @@ -8,11 +8,11 @@ after Z, double letters are used. The mark may be set with } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c'' { - c1 \mark \default +\relative { + c''1 \mark \default c1 \mark #7 c1 \mark \default c1 \mark \default diff --git a/input/regression/relative-repeat.ly b/input/regression/relative-repeat.ly index 0fb40e07b4..5b2c084bdd 100644 --- a/input/regression/relative-repeat.ly +++ b/input/regression/relative-repeat.ly @@ -4,15 +4,15 @@ different result from writing the notes out in full. The first system has all the notes within the stave. In the second, the notes get progressively higher." } -\version "2.16.0" +\version "2.19.21" -\relative c' { - c'1^"Using unfold" +\relative { + c''1^"Using unfold" \repeat unfold 3 { f,2^"Repeated" bes2 } \alternative { { a2_"Alt1" c } { e_"Alt2" c } { b_"Alt3" d } } } -\relative c' { - c'1^"The same notes, written out" +\relative { + c''1^"The same notes, written out" f,2 bes2 a2 c f2 bes2 e c f2 bes2 b d } diff --git a/input/regression/relative.ly b/input/regression/relative.ly new file mode 100644 index 0000000000..e0ddf83a71 --- /dev/null +++ b/input/regression/relative.ly @@ -0,0 +1,12 @@ +\header { + texidoc = "Notes are entered using absolute octaves, +octaves relative to the previous note, or relative to a fixed octave." + } +\version "2.19.21" + +\new Staff { + \relative { c''4 g \absolute { c'' } e' \fixed c'' { g1 }} + \fixed c'' { c4 \fixed c' { g } c e \relative { g''1 } } + \clef bass \relative { c4 g c e g1 } + \fixed c { c4 g, c e g1 } +} diff --git a/input/regression/remove-empty-staves-auto-knee.ly b/input/regression/remove-empty-staves-auto-knee.ly index 285bc85076..ccd863865b 100644 --- a/input/regression/remove-empty-staves-auto-knee.ly +++ b/input/regression/remove-empty-staves-auto-knee.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = " @@ -11,8 +11,8 @@ should be between the two staves. staffMusic = \new StaffGroup { << \new Staff = "rh" { - \relative c' { - c1 \break + \relative { + c'1 \break c1 \break c8[ c c c \change Staff = "lh" @@ -22,7 +22,7 @@ staffMusic = \new StaffGroup { } } \new Staff = "lh" { - \relative c { + \relative { \clef bass c1 R1 diff --git a/input/regression/repeat-percent-count-visibility.ly b/input/regression/repeat-percent-count-visibility.ly index e4d986d6a3..9a1e69b4ec 100644 --- a/input/regression/repeat-percent-count-visibility.ly +++ b/input/regression/repeat-percent-count-visibility.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " Percent repeat counters can be shown at regular @@ -6,10 +6,10 @@ intervals by setting @code{repeatCountVisibility}. " } -\relative c'' { +\relative { \set countPercentRepeats = ##t \set repeatCountVisibility = #(every-nth-repeat-count-visible 5) - \repeat percent 10 { c1 } \break + \repeat percent 10 { c''1 } \break \set repeatCountVisibility = #(every-nth-repeat-count-visible 2) \repeat percent 6 { c1 d1 } } diff --git a/input/regression/repeat-percent-grace.ly b/input/regression/repeat-percent-grace.ly index baa5fc134f..d1eb1e320b 100644 --- a/input/regression/repeat-percent-grace.ly +++ b/input/regression/repeat-percent-grace.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { texidoc = "Percent repeats are also centered when there is a grace note in a parallel staff. " @@ -8,7 +8,7 @@ ragged-right =##t } -\relative c' << - \new Staff { \repeat percent 3 c1} +\relative << + \new Staff { \repeat percent 3 c'1} \new Staff { c1 c \grace b8 c1 } >> diff --git a/input/regression/repeat-percent.ly b/input/regression/repeat-percent.ly index 0146d36c45..22fa2c3af1 100644 --- a/input/regression/repeat-percent.ly +++ b/input/regression/repeat-percent.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.2" \header { texidoc = "Measure repeats may be nested with beat repeats." } @@ -10,7 +10,7 @@ \set Score.skipBars = ##t \time 4/4 % riff - \repeat "percent" 2 { r8. a16 g8. a16 bes8. a16 f8 d | a c8 ~ c8 d8 ~ d8 r8 r4 } + \repeat "percent" 2 { r8. a16 g8. a16 bes8. a16 f8 d | a c8 ~ 8 d8 ~ 8 r8 r4 } R1*2 \repeat "percent" 2 { \repeat "percent" 4 { c8 es } } diff --git a/input/regression/repeat-sign-global-size-10.ly b/input/regression/repeat-sign-global-size-10.ly index aa8f3cbc35..9cba9b7117 100644 --- a/input/regression/repeat-sign-global-size-10.ly +++ b/input/regression/repeat-sign-global-size-10.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.16" \header { texidoc = "The two dots of a repeat sign should be symmetric to the staff centre and avoid staff lines even for exotic staves. @@ -30,20 +30,20 @@ Test set-global-staff size 10 (with layout-set-staff-size)." \score { << - \context Staff = "s1" { + \context Staff = "s1" \with { + \override StaffSymbol.staff-space = #0.6 + } { s1 \bar ":|." } \context Staff = "s2" \with { - \override StaffSymbol.staff-space = #1.7 \override StaffSymbol.line-positions = #'(-4 -2 0 2) + \override StaffSymbol.staff-space = #0.7 } { s1 \bar ":|." } - \context Staff = "s3" \with { - \override StaffSymbol.staff-space = #3 - } { + \context Staff = "s3" { s1 \bar ":|." } >> diff --git a/input/regression/repeat-sign-global-size-30.ly b/input/regression/repeat-sign-global-size-30.ly index a5beda8c69..3d42956495 100644 --- a/input/regression/repeat-sign-global-size-30.ly +++ b/input/regression/repeat-sign-global-size-30.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.16" \header { texidoc = "The two dots of a repeat sign should be symmetric to the staff centre and avoid staff lines even for exotic staves. @@ -30,20 +30,20 @@ Test set-global-staff size 30 (with layout-set-staff-size)." \score { << - \context Staff = "s1" { + \context Staff = "s1" \with { + \override StaffSymbol.staff-space = #0.5 + } { s1 \bar ":|." } \context Staff = "s2" \with { - \override StaffSymbol.staff-space = #0.33 + \override StaffSymbol.staff-space = #0.6 + \override StaffSymbol.line-positions = #'(-4 -2 0 2) } { s1 \bar ":|." } - \context Staff = "s3" \with { - \override StaffSymbol.staff-space = #0.33 - \override StaffSymbol.line-positions = #'(-4 -2 0 2) - } { + \context Staff = "s3" { s1 \bar ":|." } >> diff --git a/input/regression/repeat-sign-global-size-5.ly b/input/regression/repeat-sign-global-size-5.ly index 4d386efa32..5822579f79 100644 --- a/input/regression/repeat-sign-global-size-5.ly +++ b/input/regression/repeat-sign-global-size-5.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.16" \header { texidoc = "The two dots of a repeat sign should be symmetric to the staff centre and avoid staff lines even for exotic staves. @@ -29,20 +29,19 @@ Test set-global-staff size 10 (with layout-set-staff-size)." \score { << - \context Staff = "s1" { + \context Staff = "s1" \with { + \override StaffSymbol.staff-space = #0.7 + } { s1 \bar ":|." } \context Staff = "s2" \with { - \override StaffSymbol.staff-space = #3 \override StaffSymbol.line-positions = #'(-4 -2 0 2) } { s1 \bar ":|." } - \context Staff = "s3" \with { - \override StaffSymbol.staff-space = #6 - } { + \context Staff = "s3" { s1 \bar ":|." } >> diff --git a/input/regression/repeat-sign-layout-size.ly b/input/regression/repeat-sign-layout-size.ly index 73d267d362..77274d9512 100644 --- a/input/regression/repeat-sign-layout-size.ly +++ b/input/regression/repeat-sign-layout-size.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.16" \header { texidoc = "The two dots of a repeat sign should be symmetric to the staff centre and avoid staff lines even for exotic staves. @@ -8,13 +8,13 @@ Test layout-set-staff-size." \score { << \context Staff = "s1" \with { - \override StaffSymbol.staff-space = #0.3 + \override StaffSymbol.staff-space = #0.5 } { s1 \bar ":|." } \context Staff = "s2" \with { - \override StaffSymbol.staff-space = #0.5 + \override StaffSymbol.staff-space = #0.6 } { s1 \bar ":|." } diff --git a/input/regression/repeat-sign.ly b/input/regression/repeat-sign.ly index dfe00bfc55..c684d1805a 100644 --- a/input/regression/repeat-sign.ly +++ b/input/regression/repeat-sign.ly @@ -1,11 +1,11 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "The two dots of a repeat sign should be symmetric to the staff centre and avoid staff lines even for exotic staves." } -mus = \context Voice { \relative f' { d e f g \bar ":|." } } +mus = \context Voice { \relative { d' e f g \bar ":|." } } \new Staff { << diff --git a/input/regression/repeat-slash-mixed.ly b/input/regression/repeat-slash-mixed.ly index 3c0decb5e3..a29e2aafe6 100644 --- a/input/regression/repeat-slash-mixed.ly +++ b/input/regression/repeat-slash-mixed.ly @@ -1,13 +1,13 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Beat repeats for patterns containing mixed durations use a double percent symbol." } -\relative c' { +\relative { \repeat percent 4 { - c8. 16 + c'8. 16 } \repeat percent 2 { \tuplet 3/2 { diff --git a/input/regression/repeat-slash-multi.ly b/input/regression/repeat-slash-multi.ly index eb77b49ac6..c8e5b71751 100644 --- a/input/regression/repeat-slash-multi.ly +++ b/input/regression/repeat-slash-multi.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Beat repeats for patterns containing identical durations shorter than an eighth note use multiple slashes." } -\relative c' { - \repeat percent 2 { c16 d e f } +\relative { + \repeat percent 2 { c'16 d e f } \repeat percent 4 { c32 e g e } } diff --git a/input/regression/repeat-tie-parenthesize.ly b/input/regression/repeat-tie-parenthesize.ly new file mode 100644 index 0000000000..1d71c47694 --- /dev/null +++ b/input/regression/repeat-tie-parenthesize.ly @@ -0,0 +1,11 @@ +\version "2.19.28" + +\header { + texidoc = "A @code{\\repeatTie} may be parenthesized." +} + +\layout { + ragged-right = ##t +} + +{ c'1-\parenthesize \repeatTie } diff --git a/input/regression/repeat-tie.ly b/input/regression/repeat-tie.ly index ae6e4bc46a..29907912ad 100644 --- a/input/regression/repeat-tie.ly +++ b/input/regression/repeat-tie.ly @@ -5,12 +5,12 @@ note head." } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c'' { - r4 c4\repeatTie r \repeatTie +\relative { + r4 c''4\repeatTie r \repeatTie } diff --git a/input/regression/repeat-tremolo-chord-rep.ly b/input/regression/repeat-tremolo-chord-rep.ly index be148bf4dd..aba8a4f9f3 100644 --- a/input/regression/repeat-tremolo-chord-rep.ly +++ b/input/regression/repeat-tremolo-chord-rep.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Tremolos work with chord repetitions." } -\relative c' { - 1 +\relative { + 1 \repeat tremolo 4 q16 \repeat tremolo 4 { q16 } \repeat tremolo 4 { c16 q16 } diff --git a/input/regression/repeat-tremolo-dots.ly b/input/regression/repeat-tremolo-dots.ly index ccf16e612d..b2fe61da27 100644 --- a/input/regression/repeat-tremolo-dots.ly +++ b/input/regression/repeat-tremolo-dots.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Dots are added to tremolo notes if the durations involved require them." } \paper{ ragged-right = ##t } -\score { \relative c' { - c8 \repeat "tremolo" 14 { c32 a32 } | +\score { \relative { + c'8 \repeat "tremolo" 14 { c32 a32 } | } } diff --git a/input/regression/repeat-tremolo-one-note-articulation.ly b/input/regression/repeat-tremolo-one-note-articulation.ly index cdd03934c7..29d2e0e1be 100644 --- a/input/regression/repeat-tremolo-one-note-articulation.ly +++ b/input/regression/repeat-tremolo-one-note-articulation.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "A tremolo repeat containing only one note (no sequential music) @@ -8,8 +8,8 @@ \paper { ragged-right = ##t } \score { - \new Staff \relative c'' { - \repeat tremolo 4 { a16 } + \new Staff \relative { + \repeat tremolo 4 { a'16 } \repeat tremolo 4 { a16\f } \repeat tremolo 4 a16 \repeat tremolo 4 a16\f | diff --git a/input/regression/repeat-tremolo-three-notes.ly b/input/regression/repeat-tremolo-three-notes.ly index 44285f6c9e..7bd23c9e5f 100644 --- a/input/regression/repeat-tremolo-three-notes.ly +++ b/input/regression/repeat-tremolo-three-notes.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "A tremolo can have more than two notes. Also check that @@ -7,7 +7,7 @@ linebreaks between tremolos still work and that empty tremolos don't crash." \paper { ragged-right = ##t } \score { - \new Staff \relative c' { + \new Staff \relative { \time 3/4 \repeat tremolo 16 { a64 c e } | \repeat tremolo 8 { a,64 c e } diff --git a/input/regression/repeat-unfold-all.ly b/input/regression/repeat-unfold-all.ly index dc8a79c279..0d047b6304 100644 --- a/input/regression/repeat-unfold-all.ly +++ b/input/regression/repeat-unfold-all.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Volta repeats may be unfolded through the music function @code{\\unfoldRepeats}." } -nots = \relative c' { - c4 \repeat volta 2 c4 \alternative { d e } +nots = \relative { + c'4 \repeat volta 2 c4 \alternative { d e } } \layout {ragged-right = ##t} diff --git a/input/regression/repeat-unfold.ly b/input/regression/repeat-unfold.ly index 5002991829..621608a0b4 100644 --- a/input/regression/repeat-unfold.ly +++ b/input/regression/repeat-unfold.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "More alternatives than repeats. Junking excess alternatives")) @@ -14,8 +14,8 @@ get to the number of repeats. Unfolded behavior:" } -\context Voice \relative c'' { - \repeat unfold 3 { c^"3x 0a" d } +\context Voice \relative { + \repeat unfold 3 { c''^"3x 0a" d } %% less alts than body \repeat unfold 4 { c^"4x 0a" d } \alternative { e f } %% more alts than body diff --git a/input/regression/repeat-volta-segno.ly b/input/regression/repeat-volta-segno.ly index a03a95f144..9a81cafc61 100644 --- a/input/regression/repeat-volta-segno.ly +++ b/input/regression/repeat-volta-segno.ly @@ -1,4 +1,4 @@ -\version "2.18.0" +\version "2.19.21" \header { texidoc=" @@ -8,8 +8,8 @@ " } -\relative c' { - c1 +\relative { + c'1 \inStaffSegno c2^"no repeat" c c c \repeat volta 2 { diff --git a/input/regression/repeat-volta-skip-alternatives.ly b/input/regression/repeat-volta-skip-alternatives.ly index 6f4e422002..db52a0fd1e 100644 --- a/input/regression/repeat-volta-skip-alternatives.ly +++ b/input/regression/repeat-volta-skip-alternatives.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "When too few alternatives are present, the first @@ -9,8 +9,8 @@ alternative is repeated, by printing a range for the 1st repeat." \paper { ragged-right = ##t } -\relative c'' \context Voice { - \repeat volta 3 c1 +\relative \context Voice { + \repeat volta 3 c''1 \alternative { d f } e4 } diff --git a/input/regression/repeat-volta.ly b/input/regression/repeat-volta.ly index 9d6011d64b..8ec1944706 100644 --- a/input/regression/repeat-volta.ly +++ b/input/regression/repeat-volta.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "More alternatives than repeats. Junking excess alternatives")) @@ -11,9 +11,9 @@ If they don't barlines should still be shown. %% no alts. -\context Voice \relative c'' { +\context Voice \relative { %% repeat non aligning with barlines. - \repeat volta 3 { c^"3x 0alt" d e } + \repeat volta 3 { c''^"3x 0alt" d e } %% less alts than body \repeat volta 4 { c^"4x 2alt" d } \alternative { e f } %% more alts than body diff --git a/input/regression/rest-collision-beam-note.ly b/input/regression/rest-collision-beam-note.ly index 9980affc9d..1833ec0b45 100644 --- a/input/regression/rest-collision-beam-note.ly +++ b/input/regression/rest-collision-beam-note.ly @@ -6,12 +6,12 @@ collisions can be combined." } -\version "2.17.15" +\version "2.19.21" \layout { ragged-right=##t } -\new Staff \relative c' +\new Staff \relative << - { s8 f4 } \\ + { s8 f'4 } \\ { 8[ r ] } >> diff --git a/input/regression/rest-collision-beam-quantized.ly b/input/regression/rest-collision-beam-quantized.ly index a73fb5bded..0d15d63ea0 100644 --- a/input/regression/rest-collision-beam-quantized.ly +++ b/input/regression/rest-collision-beam-quantized.ly @@ -6,9 +6,9 @@ ragged-right = ##t } -\version "2.16.0" +\version "2.19.21" -fig = \relative c' { +fig = \relative { 8[ r r r ] r | diff --git a/input/regression/rest-collision-beam-restdir.ly b/input/regression/rest-collision-beam-restdir.ly index 24cc53d8c8..693915f67c 100644 --- a/input/regression/rest-collision-beam-restdir.ly +++ b/input/regression/rest-collision-beam-restdir.ly @@ -3,15 +3,15 @@ account properly." } -\version "2.17.6" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c''' { +\relative { \override Rest.direction = #UP - \stemDown b8[ r b] + \stemDown b''8[ 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 2dd30d5563..b14eb6df57 100644 --- a/input/regression/rest-collision-beam.ly +++ b/input/regression/rest-collision-beam.ly @@ -4,13 +4,13 @@ collision." } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c''' { - \stemDown b8[ r b] +\relative { + \stemDown b''8[ r b] \stemUp b,,8[ r b] } diff --git a/input/regression/rest-collision-note-duration.ly b/input/regression/rest-collision-note-duration.ly index 701b55e785..9c3869427c 100644 --- a/input/regression/rest-collision-note-duration.ly +++ b/input/regression/rest-collision-note-duration.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Vertical rest positions in a multi-voice staff should obey the duration of @@ -6,7 +6,7 @@ notes; this is, they shouldn't return to a default position too early. " } -\relative c' { +\relative { << { g'1 g2 } \\ { \repeat unfold 2 {r8 d4 d8 r d4 d8} } >> } diff --git a/input/regression/rest-collision.ly b/input/regression/rest-collision.ly index 0383cccad2..3b7862520c 100644 --- a/input/regression/rest-collision.ly +++ b/input/regression/rest-collision.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc=" Rests should not collide with beams, stems and noteheads. Rests may @@ -12,16 +12,16 @@ cases. \layout { ragged-right = ##t } -scale = \relative c' { - c8 d e f g a b c c d e f g a b c +scale = \relative { + c'8 d e f g a b c c d e f g a b c } rests = { r r r r r r r r r r r r r r r r } different = << { - \relative c'' { - r8 a e4 a e + \relative { + r8 a' e4 a e } }\\ { diff --git a/input/regression/rest-dot-position.ly b/input/regression/rest-dot-position.ly index 2aef41e8e3..649ac2c463 100644 --- a/input/regression/rest-dot-position.ly +++ b/input/regression/rest-dot-position.ly @@ -4,21 +4,32 @@ } -\version "2.16.0" +\version "2.18.0" -\paper { ragged-right = ##t } +\layout { indent = 0 } +\paper { ragged-right = ##t } { \set Score.timing = ##f + \set Score.initialTimeSignatureVisibility = #(vector #f #f #f) r\longa. r\breve. - r1. r2. r4. r8. r16. r32. r64. r64. - \bar "" + r1. r2. r4. + \once \override Rest.style = #'classical r4. + \once \override Rest.style = #'z r4. + r8. r16. r32. r64. r64. + \bar "" << { - r\longa. r\breve. - r1. r2. r4. r8. r16. r32. r64. r64. + r\longa. r\breve. + r1. r2. r4. + \once \override Rest.style = #'classical r4. + \once \override Rest.style = #'z r4. + r8. r16. r32. r64. r64. } \\ { - r\longa. r\breve. - r1. r2. r4. r8. r16. r32. r64. r64. + r\longa. r\breve. + r1. r2. r4. + \once \override Rest.style = #'classical r4. + \once \override Rest.style = #'z r4. + r8. r16. r32. r64. r64. } >> - + } diff --git a/input/regression/rest-ledger.ly b/input/regression/rest-ledger.ly index f06bda4a7e..b68095c5da 100644 --- a/input/regression/rest-ledger.ly +++ b/input/regression/rest-ledger.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.22" \header { texidoc = "Breve, whole and half rests moving outside the staff should get ledger lines." @@ -8,7 +8,7 @@ ledger lines." \paper { ragged-right = ##t } rPos = -#(define-music-function (parser location y) (number?) +#(define-music-function (y) (number?) #{ \override Rest.staff-position = #y #}) { diff --git a/input/regression/rest-note-collision.ly b/input/regression/rest-note-collision.ly index 2a448aa75b..33c81df9e4 100644 --- a/input/regression/rest-note-collision.ly +++ b/input/regression/rest-note-collision.ly @@ -7,12 +7,12 @@ } -\version "2.16.0" -\new Staff { +\version "2.19.21" +music = { << - \relative c'' { - f e d c b a g f e d c + \relative { + f'' e d c b a g f e d c } \\ { @@ -24,8 +24,20 @@ r4 r r r r r r r r r r } \\ - \relative c'' { - f e d c b a g f e d c + \relative { + f'' e d c b a g f e d c } >> } + +\score { + \new Staff { \music } +} + +\score { + \new Staff { \override Staff.Rest.style = #'z \music } +} + +\score { + \new Staff { \override Staff.Rest.style = #'classical \music } +} diff --git a/input/regression/rest-pitch.ly b/input/regression/rest-pitch.ly index c5ce21c008..73529660d2 100644 --- a/input/regression/rest-pitch.ly +++ b/input/regression/rest-pitch.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Rests can have pitches -- these will be affected by @@ -9,9 +9,9 @@ beam/@/rest collision resolving will leave it alone." \layout { ragged-right= ##t } -\relative c'' +\relative { - a4\rest b4\rest c4\rest + a'4\rest b4\rest c4\rest <> <> diff --git a/input/regression/rest-polyphonic-2.ly b/input/regression/rest-polyphonic-2.ly index 67bb07ab11..7531119a18 100644 --- a/input/regression/rest-polyphonic-2.ly +++ b/input/regression/rest-polyphonic-2.ly @@ -7,13 +7,13 @@ is suppressed if the rest has a pitch." } -\version "2.16.0" +\version "2.19.21" \new Staff << - \relative c''' { g8 g g r r2 } \\ - \relative c' { a4\rest c r2 } \\ - \relative c'' { c4 c f2\rest } \\ - \relative c'' { r2 g } + \relative { g''8 g g r r2 } \\ + \relative { a4\rest c r2 } \\ + \relative { c''4 c f2\rest } \\ + \relative { r2 g' } >> diff --git a/input/regression/rest-polyphonic.ly b/input/regression/rest-polyphonic.ly index a1e762923b..aeae89b07b 100644 --- a/input/regression/rest-polyphonic.ly +++ b/input/regression/rest-polyphonic.ly @@ -2,17 +2,20 @@ texidoc = "In polyphonic situations, rests are moved according to their @code{direction} even if there is no opposite note or rest. -The amount is two @code{staff-space}s. " +The amount in @code{staff-position}s is set by @code{voiced-position}." } \layout { ragged-right = ##t } -\version "2.16.0" +\version "2.19.21" -\new Staff \relative c' { +\new Staff \relative { + << { r8 g''4 g8 r g4 g8 } \\ + { d,4 r \stemUp b r } >> + \override Staff.Rest.voiced-position = 2 << { r8 g''4 g8 r g4 g8 } \\ { d,4 r \stemUp b r } >> } diff --git a/input/regression/rest-positioning.ly b/input/regression/rest-positioning.ly index a34b773586..889932560f 100644 --- a/input/regression/rest-positioning.ly +++ b/input/regression/rest-positioning.ly @@ -1,4 +1,4 @@ -\version "2.17.16" +\version "2.19.20" \header { texidoc = "This shows the single and multi voice rest positions for @@ -14,7 +14,7 @@ mus = { \mark "R1*7" R1*7 \mark "R1" R1 \mark "r1" r1 \mark "r2" r2 \mark "r4" r \score { { - \compressFullBarRests + \compressMMRests \new StaffGroup << $@(map (lambda (n) diff --git a/input/regression/revert-once.ly b/input/regression/revert-once.ly new file mode 100644 index 0000000000..e8cad6c9e8 --- /dev/null +++ b/input/regression/revert-once.ly @@ -0,0 +1,30 @@ +\version "2.19.28" + +\header { + texidoc = "@code{\\once \\revert} can be used for reverting a property +once rather than permanently." +} + +\layout { + ragged-right = ##t +} + +\relative { + c'4-"b" d-"b" + \override NoteHead.color = #red + e4-"r" f-"r" | + \once \override NoteHead.color = #green + g4-"g" a-"r" + \once \revert NoteHead.color + b-"b" c-"r" | + \temporary \override NoteHead.color = #yellow + g-"y" e-"y" + \once \revert NoteHead.color + d-"r" c-"y" | + \revert NoteHead.color + d-"r" e-"r" + \once \revert NoteHead.color + f-"b" d-"r" | + \revert NoteHead.color + c1-"b" +} diff --git a/input/regression/rhythmic-sequence.ly b/input/regression/rhythmic-sequence.ly new file mode 100644 index 0000000000..df647ce7d1 --- /dev/null +++ b/input/regression/rhythmic-sequence.ly @@ -0,0 +1,11 @@ +\version "2.19.0" + +\header { + texidoc = "Durations without pitches are placed into note events +without pitch information. Those are directly useful in +@code{RhythmicStaff}." +} + +\layout { ragged-right = ##t } + +\new RhythmicStaff { 4 4. r | 4 \tuplet 3/2 { 2 4 } 4 } diff --git a/input/regression/satb-template-on-two-staves-with-verses.ly b/input/regression/satb-template-on-two-staves-with-verses.ly new file mode 100644 index 0000000000..43055b7d91 --- /dev/null +++ b/input/regression/satb-template-on-two-staves-with-verses.ly @@ -0,0 +1,28 @@ +\version "2.19.19" + +\header { + texidoc ="This should produce an SATB score on two staves +with 5 verses and piano accompaniment." + +} + +TwoVoicesPerStaff = ##t + +SopranoMusic = \relative { c''4 c c c } +AltoMusic = \relative { g'4 g g g } +VerseOne = \lyricmode { \set stanza = "1." First _ stan -- za } +VerseTwo = \lyricmode { \set stanza = "2." Se -- cond stan -- za } +VerseThree = \lyricmode { \set stanza = "3." Third _ stan -- za } +VerseFour = \lyricmode { \set stanza = "4." Fourth _ stan -- za } +VerseFive = \lyricmode { \set stanza = "5." Fifth _ stan -- za } +TenorMusic = \relative { c'4 c c c } +BassMusic = \relative { g2 g4 g } + +PianoRHMusic = \relative { c''4 c c c } +PianoLHMusic = \relative { c2 c } + +\layout { + ragged-right = ##t +} + +\include "satb.ly" diff --git a/input/regression/satb-template-soprano-and-tenor-may-be-omitted.ly b/input/regression/satb-template-soprano-and-tenor-may-be-omitted.ly new file mode 100644 index 0000000000..cfce5eeb97 --- /dev/null +++ b/input/regression/satb-template-soprano-and-tenor-may-be-omitted.ly @@ -0,0 +1,19 @@ +\version "2.19.19" + +\header { + texidoc ="Soprano and tenor voices may be omitted without +error, even when TwoVoicesPerStaff is specified and Alto +and Bass lyrics are provided." +} +TwoVoicesPerStaff = ##t + +AltoMusic = \relative { g'4 g g g } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +BassMusic = \relative { g2 g4 g } +BassLyrics = \lyricmode { Bass ly -- rics } + +\layout { + ragged-right = ##t +} + +\include "satb.ly" diff --git a/input/regression/satb-template-with-changed-instrument-names.ly b/input/regression/satb-template-with-changed-instrument-names.ly new file mode 100644 index 0000000000..cea70c0c91 --- /dev/null +++ b/input/regression/satb-template-with-changed-instrument-names.ly @@ -0,0 +1,38 @@ +\version "2.19.19" + +\header { + texidoc ="Instrument names and short instrument names +can be changed when using the satb built-in template." +} + +Time = { s1 \break s1 } +TwoVoicesPerStaff = ##t + +SopranoInstrumentName = "Soprani" +SopranoShortInstrumentName = "Sop" +AltoInstrumentName = "Contralti" +AltoShortInstrumentName = "Con" +MenDividedInstrumentName = "Men Div" +MenDividedShortInstrumentName = "M Div" +MenInstrumentName = "Men Uni" +MenShortInstrumentName = "M Uni" +TenorInstrumentName = "Tenori" +BassInstrumentName = "Bassi" +PianoInstrumentName = "Organ" + +MenMusic = \relative { s1 | c4 c c c } +SopranoMusic = \relative { c''4 c c c | c c c c } +AltoMusic = \relative { g'4 g g g | g g g g } +TenorMusic = \relative { c'4 c c c | s1 } +BassMusic = \relative { g2 g4 g | s1 } + +PianoRHMusic = \relative { c''4 c c c | c c c c } +PianoLHMusic = \relative { c2 c c c } + +\layout { + ragged-right = ##t +} + +\paper { left-margin = 15 } + +\include "satb.ly" diff --git a/input/regression/satb-template-with-men-women-and-descant.ly b/input/regression/satb-template-with-men-women-and-descant.ly new file mode 100644 index 0000000000..c8ff7d3aef --- /dev/null +++ b/input/regression/satb-template-with-men-women-and-descant.ly @@ -0,0 +1,34 @@ +\version "2.19.19" + +\header { + texidoc ="This should produce an SATB score with piano +accompaniment, with four voices in the first system, unison +women voices with descant in the second system and unison +women and unison men voices in the third system. " +} + +Time = { s1 \break s1 \break } + +DescantMusic = \relative { s1 | e''4 e e e | s1 } +DescantLyrics = \lyricmode { Des -- cant ly -- rics } +SopranoMusic = \relative { c''8 c c4 c c | s1*2 | } +SopranoLyrics = \lyricmode { So -- pra -- no ly -- rics } +AltoMusic = \relative { g'4 g g g | s1*2 | } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +WomenMusic = \relative { s1 | g'4 g g g | g g g g | } +WomenLyrics = \lyricmode { Wo -- men ly -- rics Wo -- men ly -- rics } +MenMusic = \relative { s1*2 | e2 e4 e | } +MenLyrics = \lyricmode { Men ly -- rics } +TenorMusic = \relative { c'4 c c c | s1*2 | } +TenorLyrics = \lyricmode { Te -- nor ly -- rics } +BassMusic = \relative { g2 g4 g | s1*2 } +BassLyrics = \lyricmode { Bass ly -- rics } + +PianoRHMusic = \relative { c''4 c c c | c c c c | c c c c | } +PianoLHMusic = \relative { c2 c | c c | c c | } + +\layout { + ragged-right = ##t +} + +\include "satb.ly" diff --git a/input/regression/scheme-book-scores.ly b/input/regression/scheme-book-scores.ly index fd1609f1b6..ec75de3573 100644 --- a/input/regression/scheme-book-scores.ly +++ b/input/regression/scheme-book-scores.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.22" \header { @@ -21,18 +21,18 @@ informations from top- and booklevel stack correctly." 'elements (list (make-music 'NoteEvent 'duration (ly:make-duration 2 0 1/1) 'pitch scmpitch)))) - (score (scorify-music music parser)) + (score (scorify-music music)) (layout (ly:output-def-clone $defaultlayout)) (desc (markup #:large #:line ((ly:format "Score with a ~a" - (note-name->lily-string scmpitch parser)))))) + (note-name->lily-string scmpitch)))))) (ly:score-add-output-def! score layout) - (add-text parser desc) - (add-score parser score)) + (add-text desc) + (add-score score)) (set! pitch (modulo (1+ pitch) 7))))) oneNoteScore = -#(define-void-function (parser location) () - (add-one-note-score parser)) +#(define-void-function () () + (add-one-note-score (*parser*))) %%% diff --git a/input/regression/scheme-engraver-instance.ly b/input/regression/scheme-engraver-instance.ly index 717549b838..35d9e8a4a0 100644 --- a/input/regression/scheme-engraver-instance.ly +++ b/input/regression/scheme-engraver-instance.ly @@ -8,7 +8,7 @@ } -\version "2.16.0" +\version "2.19.21" \layout { \context { @@ -31,6 +31,6 @@ } << - \relative c'' { c4 d e f } - \\ \relative c' { c4 d e f } + \relative { c''4 d e f } + \\ \relative { c'4 d e f } >> diff --git a/input/regression/scheme-engraver.ly b/input/regression/scheme-engraver.ly index 26d703613c..0f31685f91 100644 --- a/input/regression/scheme-engraver.ly +++ b/input/regression/scheme-engraver.ly @@ -5,52 +5,49 @@ } -\version "2.16.0" +\version "2.19.21" + +#(define (t->m t) + "Return the current moment of translator object @var{t}." + (ly:context-current-moment (ly:translator-context t))) + +engraver_demo = +#(make-engraver + ((initialize translator) + (format 1 "\n\n~16a: (initialize)\n" (t->m translator))) + ((start-translation-timestep translator) + (format 1 "~16a: (start-translation-timestep)\n" (t->m translator))) + (listeners + ((rest-event engraver event) + (let ((grob (ly:engraver-make-grob engraver 'TextScript event))) + (ly:grob-set-property! grob 'text "hi") + (format 1 "~16a: detected this rest event: ~a\n~16a: created this grob: ~a\n" + (t->m engraver) event (t->m engraver) grob)))) + (acknowledgers + ((note-head-interface engraver grob source-engraver) + (format 1 "~16a: saw ~a coming from ~a\n" + (t->m engraver) grob source-engraver))) + (end-acknowledgers + ((beam-interface engraver grob source-engraver) + (format 1 "~16a: saw end of ~a coming from ~a\n" + (t->m engraver) grob source-engraver))) + ((process-music translator) + (format 1 "~16a: (process-music)\n" (t->m translator))) + ((process-acknowledged translator) + (format 1 "~16a: (process-acknowledged)\n" (t->m translator))) + ((stop-translation-timestep translator) + (format 1 "~16a: (stop-translation-timestep)\n" (t->m translator))) + ((finalize translator) + (format 1 "~16a: (finalize)\n" (t->m translator)))) \layout { \context { \Voice \consists - #(make-engraver - ((initialize trans) - (display (list "initialize" - (ly:context-current-moment - (ly:translator-context trans)) "\n") (current-error-port))) - ((start-translation-timestep trans) - (display (list "start-trans" - (ly:context-current-moment - (ly:translator-context trans)) "\n") (current-error-port))) - (listeners - ((rest-event engraver event) - (let* - ((x (ly:engraver-make-grob engraver 'TextScript event))) - (display (list "caught event" event "\ncreate:\n" x "\n") (current-error-port)) - (ly:grob-set-property! x 'text "hi")))) - (acknowledgers - ((note-head-interface engraver grob source-engraver) - (display (list "saw head: " grob " coming from " source-engraver) (current-error-port)))) - (end-acknowledgers - ((beam-interface engraver grob source-engraver) - (display (list "saw end of beam: " grob " coming from " source-engraver) (current-error-port)))) - ((process-music trans) - (display (list "process-music" - (ly:context-current-moment - (ly:translator-context trans)) "\n") (current-error-port))) - ((process-acknowledged trans) - (display (list "process-acknowledged" - (ly:context-current-moment - (ly:translator-context trans)) "\n") (current-error-port))) - ((stop-translation-timestep trans) - (display (list "stop-trans" - (ly:context-current-moment - (ly:translator-context trans)) "\n") (current-error-port))) - ((finalize trans) - (display (list "finalize" - (ly:context-current-moment - (ly:translator-context trans)) "\n") (current-error-port)))) - }} - + \engraver_demo + } +} -\relative c' { - c8[ r c] +\relative { + c'8[ r c] } diff --git a/input/regression/scheme-text-spanner.ly b/input/regression/scheme-text-spanner.ly index 14e095e954..d89a959149 100644 --- a/input/regression/scheme-text-spanner.ly +++ b/input/regression/scheme-text-spanner.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Use @code{define-event-class}, scheme engraver methods, @@ -12,7 +12,7 @@ in scheme." (let* ((meta-entry (assoc-get 'meta grob-entry)) (class (assoc-get 'class meta-entry)) (ifaces-entry (assoc-get 'interfaces meta-entry))) - (set-object-property! grob-name 'translation-type? list?) + (set-object-property! grob-name 'translation-type? ly:grob-properties?) (set-object-property! grob-name 'is-grob? #t) (set! ifaces-entry (append (case class ((Item) '(item-interface)) @@ -60,6 +60,7 @@ in scheme." (interfaces . (font-interface line-interface line-spanner-interface + outside-staff-interface side-position-interface)))))) #(define scheme-event-spanner-types @@ -67,7 +68,7 @@ in scheme." (SchemeTextSpanEvent . ((description . "Used to signal where scheme text spanner brackets start and stop.") - (types . (general-music scheme-text-span-event span-event event)) + (types . (scheme-text-span-event span-event event)) )) )) @@ -144,13 +145,13 @@ schemeTextSpannerEngraver = ((stop-translation-timestep trans) (if (and (ly:spanner? span) (null? (ly:spanner-bound span LEFT))) - (set! (ly:spanner-bound span LEFT) - (ly:context-property context 'currentMusicalColumn))) + (ly:spanner-set-bound! span LEFT + (ly:context-property context 'currentMusicalColumn))) (if (ly:spanner? finished) (begin (if (null? (ly:spanner-bound finished RIGHT)) - (set! (ly:spanner-bound finished RIGHT) - (ly:context-property context 'currentMusicalColumn))) + (ly:spanner-set-bound! finished RIGHT + (ly:context-property context 'currentMusicalColumn))) (set! finished '()) (set! event-start '()) (set! event-stop '())))) @@ -158,8 +159,8 @@ schemeTextSpannerEngraver = (if (ly:spanner? finished) (begin (if (null? (ly:spanner-bound finished RIGHT)) - (set! (ly:spanner-bound finished RIGHT) - (ly:context-property context 'currentMusicalColumn))) + (ly:spanner-set-bound! finished RIGHT + (ly:context-property context 'currentMusicalColumn))) (set! finished '()))) (if (ly:spanner? span) (begin @@ -184,7 +185,7 @@ schemeTextSpannerEnd = } } -\relative c' { +\relative { a4 b\schemeTextSpannerStart c d | \repeat unfold 20 { a4 b c d | } a4 b c\schemeTextSpannerEnd d | diff --git a/input/regression/score-lines.ly b/input/regression/score-lines.ly new file mode 100644 index 0000000000..edb300fff7 --- /dev/null +++ b/input/regression/score-lines.ly @@ -0,0 +1,40 @@ +\version "2.19.0" + +\header { + texidoc = "The @code{\\score-lines} markup returns individual score +lines as stencils rather than a single stencil. Calling a function +like @code{\\rotate} on @code{\\score-lines} rotates the lines +individually, as contrasted with rotating an entire @code{\\score} +markup." +} + +\markup \fill-line { + \null + \column \rotate #-15 { + \score-lines + { + \new Staff \with { instrumentName = \markup \typewriter + "\\score-lines" } + \repeat unfold 16 c'4 + \layout { + short-indent = 0 + indent = 0 + line-width = 4\cm + } + } + } + \column \rotate #-15 { + \score + { + \new Staff \with { instrumentName = \markup \typewriter + "\\score" } + \repeat unfold 16 c'4 + \layout { + short-indent = 0 + indent = 0 + line-width = 4\cm + } + } + } + \null +} diff --git a/input/regression/score-text.ly b/input/regression/score-text.ly index 05b8ec1769..c482bd7a6a 100644 --- a/input/regression/score-text.ly +++ b/input/regression/score-text.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -17,7 +17,7 @@ } \score { << - \relative c { + \relative { \clef bass d2 d c4 bes a2 \break c2 c d4 f g2 diff --git a/input/regression/script-collision.ly b/input/regression/script-collision.ly index 32e7d211c5..bde9783afb 100644 --- a/input/regression/script-collision.ly +++ b/input/regression/script-collision.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -9,8 +9,8 @@ \layout { ragged-right = ##t} -\relative c'' { - c4 +\relative { + c''4 \marcato << { c4^^ }\\ { d4_^ } >> diff --git a/input/regression/script-horizontal-slur.ly b/input/regression/script-horizontal-slur.ly index 6cf552ac5f..54cb8e7899 100644 --- a/input/regression/script-horizontal-slur.ly +++ b/input/regression/script-horizontal-slur.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Horizontal scripts don't have @code{avoid-slur} set." @@ -8,9 +8,9 @@ ragged-right = ##t } -\relative c'' { +\relative { \set fingeringOrientations = #'(right) - < a-1 d-2>2 + < a'-1 d-2>2 < a-1 d-2>2 < a-1 d-2>2( < a-1 d-2>2) diff --git a/input/regression/script-shift-staccato.ly b/input/regression/script-shift-staccato.ly new file mode 100644 index 0000000000..f5ac2d815a --- /dev/null +++ b/input/regression/script-shift-staccato.ly @@ -0,0 +1,29 @@ + +\header { + texidoc = "The horizontal placement of staccato dots above an +upstem or below a downstem note differs from the placement of +other scripts in that different positioning is used when the dot is +alone and when it is part of a compound articulation. The +property @code{toward-stem-shift-in-column} ensures good default +positioning of the staccato (see first measure below), and allows +precise horizontal control of a column containing a staccato and +of the staccato within it (second measure). (@code{0.0} means +centered on the note head, @code{1.0} means centered on the stem.) +" +} + +\version "2.19.21" + +\relative +{ + % default + a'4^. c_. + a^.^- c_._- + + \override Script.toward-stem-shift-in-column = 1.0 + a4^.^- c_._- + \revert Script.toward-stem-shift-in-column + + a4-\tweak toward-stem-shift-in-column 1.0 ^. ^- + c4-\tweak toward-stem-shift-in-column 1.0 _. _- +} diff --git a/input/regression/script-shift.ly b/input/regression/script-shift.ly index 88f8f72f02..3fef1d8e54 100644 --- a/input/regression/script-shift.ly +++ b/input/regression/script-shift.ly @@ -7,12 +7,12 @@ means centered on the stem). " } -\version "2.17.6" -\relative c'' +\version "2.19.21" +\relative { - \override Script.toward-stem-shift = #0.0 - a4^. c_. - \override Script.toward-stem-shift = #1.0 - a4^. c_. + a'4^> c_> + + \override Script.toward-stem-shift = #0.0 + a4^> c_> } diff --git a/input/regression/script-stack-horizontal.ly b/input/regression/script-stack-horizontal.ly index d307d9cf7b..766b24c18e 100644 --- a/input/regression/script-stack-horizontal.ly +++ b/input/regression/script-stack-horizontal.ly @@ -8,17 +8,17 @@ The scripts should not be folded under the time signature. " } -\version "2.17.15" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c' +\relative { \set stringNumberOrientations = #'(left) \set fingeringOrientations = #'(left) \set strokeFingerOrientations = #'(left) - \arpeggio } diff --git a/input/regression/script-stack-order.ly b/input/regression/script-stack-order.ly index 25dff724b2..3b7cd25834 100644 --- a/input/regression/script-stack-order.ly +++ b/input/regression/script-stack-order.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Scripts can be stacked. The order is determined by a priority field, but when objects have the same priority, the input @@ -9,7 +9,7 @@ order determines the order. Objects specified first are closest to the note. \layout { ragged-right = ##t} -\relative c'' { - c4^"up 1"^"up 2"^"up 3"_"down 1"_"down 2"_"down 3" c c c +\relative { + c''4^"up 1"^"up 2"^"up 3"_"down 1"_"down 2"_"down 3" c c c c4^"1"^"2"\turn c\turn ^"1"^"2" c c } diff --git a/input/regression/script-tie-collision.ly b/input/regression/script-tie-collision.ly index 0b1c837e0e..bac3cf6703 100644 --- a/input/regression/script-tie-collision.ly +++ b/input/regression/script-tie-collision.ly @@ -1,4 +1,4 @@ -\version "2.17.2" +\version "2.19.21" \header { texidoc = "Scripts avoid ties. @@ -10,13 +10,13 @@ % This regtest tries to confuse it with various configurations % Of notes with and without ties, with multiple scripts, etc.. -\relative c''' { - r2. c4~-> | c-> r2. | +\relative { + r2. c'''4~-> | c-> r2. | r2. c4-> | c-> r2. | r2. c4~-> | c r2. | - r2. c4~ | c-> r2. | \break + r2. c4~ | 4-> r2. | \break r2. >4--~ | -> ~ -> r2 | - r2. c4~ | c-> ~ c-> r2 | + r2. c4~ | 4-> ~ c-> r2 | r2. c4~-> | c ~ c-> r2 | r2. c4~-> | c-> ~ c r2 | r2. c4-> | diff --git a/input/regression/self-alignment-and-parent-alignment.ly b/input/regression/self-alignment-and-parent-alignment.ly new file mode 100644 index 0000000000..9f26287213 --- /dev/null +++ b/input/regression/self-alignment-and-parent-alignment.ly @@ -0,0 +1,49 @@ +\version "2.19.11" + +\header { + texidoc = "Grobs using @code{ly:self-alignment-interface::aligned-on-x-parent} +and @code{ly:self-alignment-interface::aligned-on-y-parent} +callbacks support separate alignments for self and parent." +} + +{ f'1 f' f' } +\addlyrics { + \override LyricSpace.minimum-distance = 5 + \override LyricText.self-alignment-X = #LEFT + \override LyricText.parent-alignment-X = #LEFT + left-left + \override LyricText.self-alignment-X = #LEFT + \override LyricText.parent-alignment-X = #CENTER + left-center + \override LyricText.self-alignment-X = #LEFT + \override LyricText.parent-alignment-X = #RIGHT + left-right +} + +{ f'1 f' f' } +\addlyrics { + \override LyricSpace.minimum-distance = 5 + \override LyricText.self-alignment-X = #CENTER + \override LyricText.parent-alignment-X = #LEFT + center-left + \override LyricText.self-alignment-X = #CENTER + \override LyricText.parent-alignment-X = #CENTER + center-center + \override LyricText.self-alignment-X = #CENTER + \override LyricText.parent-alignment-X = #RIGHT + center-right +} + +{ f'1 f' f' } +\addlyrics { + \override LyricSpace.minimum-distance = 5 + \override LyricText.self-alignment-X = #RIGHT + \override LyricText.parent-alignment-X = #LEFT + right-left + \override LyricText.self-alignment-X = #RIGHT + \override LyricText.parent-alignment-X = #CENTER + right-center + \override LyricText.self-alignment-X = #RIGHT + \override LyricText.parent-alignment-X = #RIGHT + right-right +} diff --git a/input/regression/semi-tie-cross-staff.ly b/input/regression/semi-tie-cross-staff.ly index 68d72f5852..d0fb9baae5 100644 --- a/input/regression/semi-tie-cross-staff.ly +++ b/input/regression/semi-tie-cross-staff.ly @@ -1,4 +1,4 @@ -\version "2.17.18" +\version "2.19.21" \header { texidoc = "Cross-staff @code{RepeatTie} and @code{LaissezVibrerTie} @@ -7,8 +7,8 @@ do not trigger programming errors for circular dependencies in direction. } << - \new Staff = "up" \relative c' { - f8 + \new Staff = "up" \relative { + f'8 \change Staff = "down" c\laissezVibrer eeses \change Staff = "up" diff --git a/input/regression/set-once.ly b/input/regression/set-once.ly index ad65384e70..b9fc811928 100644 --- a/input/regression/set-once.ly +++ b/input/regression/set-once.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { @@ -6,9 +6,9 @@ and then return to the previous value." } -\relative c' { +\relative { \set fingeringOrientations = #'(left) - 1 | + 1 | \once \set fingeringOrientations = #'(right) | -"left" | diff --git a/input/regression/shape-other-curves.ly b/input/regression/shape-other-curves.ly index c76991235c..2009fe0b23 100644 --- a/input/regression/shape-other-curves.ly +++ b/input/regression/shape-other-curves.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "In addition to @code{Slur}, the music function @code{\\shape} works @@ -12,9 +12,9 @@ function." ragged-right = ##t } -\relative c'' { +\relative { % PhrasingSlur - d4\( d' b g g,8 f' e d c2\) + d''4\( d' b g g,8 f' e d c2\) \override PhrasingSlur.color = #blue \shape #'((0 . -2) (-1 . 3.5) (0.5 . 0.5) (0 . -2.5)) PhrasingSlur d4\( d' b g g,8 f' e d c2\) diff --git a/input/regression/shape-slurs.ly b/input/regression/shape-slurs.ly index 3427965c34..dd5ae87c0e 100644 --- a/input/regression/shape-slurs.ly +++ b/input/regression/shape-slurs.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "The control points of a broken or unbroken slur may be offset by @@ -11,8 +11,8 @@ } % unmodified -\relative c'' { - d4( d' b g +\relative { + d''4( d' b g g,8 f' e d c2) d4( d' b g \break diff --git a/input/regression/shorthands.ly b/input/regression/shorthands.ly index e1a7af5934..2487dfa54d 100644 --- a/input/regression/shorthands.ly +++ b/input/regression/shorthands.ly @@ -1,4 +1,4 @@ -\version "2.17.25" +\version "2.19.21" \header { @@ -19,8 +19,8 @@ replacing @code{(} and @code{)} with melismata commands which are ")" = \melismaEnd \new Staff << - \relative c' { - c8 \{ d e f \} % slurred + \relative { + c'8 \{ d e f \} % slurred g ( a b c ) % no slur, but with melisma c,1 \bar "|." } diff --git a/input/regression/skip-of-length.ly b/input/regression/skip-of-length.ly index 57e6d1a830..ea644ebb79 100644 --- a/input/regression/skip-of-length.ly +++ b/input/regression/skip-of-length.ly @@ -7,12 +7,12 @@ last as long as their arguments." ragged-right = ##T } -\version "2.17.15" +\version "2.19.21" -\relative c' +\relative << \new Staff { - c\breve f4 r2. + c'\breve f4 r2. c\breve f4 r2. s\breve^"skip" } diff --git a/input/regression/skiptypesetting-bar-check.ly b/input/regression/skiptypesetting-bar-check.ly index 2503b72e4a..ec467da75a 100644 --- a/input/regression/skiptypesetting-bar-check.ly +++ b/input/regression/skiptypesetting-bar-check.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (ly:translate-cpp-warning-scheme "barcheck failed at: %s") "3/4") @@ -8,8 +8,8 @@ texidoc = "skipTypesetting doesn't affect bar checks." } -\relative c' { - c4 +\relative { + c'4 \set Score.skipTypesetting = ##t c4 c4 | diff --git a/input/regression/skiptypesetting-tuplet.ly b/input/regression/skiptypesetting-tuplet.ly index b2f6262915..09dd0db4fc 100644 --- a/input/regression/skiptypesetting-tuplet.ly +++ b/input/regression/skiptypesetting-tuplet.ly @@ -7,14 +7,14 @@ } -\version "2.17.11" +\version "2.19.21" \paper { ragged-right = ##T } -\new Staff \relative c' { +\new Staff \relative { \set Score.skipTypesetting = ##t - \tuplet 3/2 { c8 c c } \tuplet 3/2 { c c c } + \tuplet 3/2 { c'8 c c } \tuplet 3/2 { c c c } \tuplet 3/2 { c c c } \tuplet 3/2 { c c c} \set Score.skipTypesetting = ##f d1 \break diff --git a/input/regression/skyline-point-extent.ly b/input/regression/skyline-point-extent.ly index ceb27b2490..9d13cbd213 100644 --- a/input/regression/skyline-point-extent.ly +++ b/input/regression/skyline-point-extent.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.12" \header { texidoc = "The @code{Script} grobs should follow the descending melody line, @@ -16,7 +16,7 @@ even though the @code{NoteHead} stencils are point stencils. The } { - \override Script #'direction = #DOWN - \override NoteHead #'stencil = #point-stencil + \override Script.direction = #DOWN + \override NoteHead.stencil = #point-stencil c'2.-> b8-- a-- g1-> } diff --git a/input/regression/skyline-vertical-placement.ly b/input/regression/skyline-vertical-placement.ly index 49c0376092..77eb9e75b5 100644 --- a/input/regression/skyline-vertical-placement.ly +++ b/input/regression/skyline-vertical-placement.ly @@ -5,12 +5,12 @@ using a skyline algorithm so that they don't collide with other objects." \layout {ragged-right = ##t} -\version "2.17.6" -\relative c''' { +\version "2.19.21" +\relative { \override Score.PaperColumn.keep-inside-line = ##f \override TextScript.outside-staff-priority = #2 \override DynamicLineSpanner.outside-staff-priority = #1 - c + c''' \once \override TextScript.self-alignment-X = #CENTER a,^"this doesn't collide with the c" b^"this goes above the previous markup" diff --git a/input/regression/slur-broken-trend.ly b/input/regression/slur-broken-trend.ly index 81f31fc078..78e0d1d46f 100644 --- a/input/regression/slur-broken-trend.ly +++ b/input/regression/slur-broken-trend.ly @@ -1,5 +1,5 @@ -\version "2.17.28" +\version "2.19.21" \header{ texidoc=" @@ -35,15 +35,15 @@ in unbroken state. ) s2..\break \stemNeutral - \new Voice \relative c' { - c'8[( c c c] g2 ~ | \break + \new Voice \relative { + c''8[( c c c] g2 ~ | \break g1) | \break - \slurDown c8[( c] g4 ~ g2 ~ | \break - g2 ~ g2) + \slurDown c8[( c] g4 ~ 2 ~ | \break + g2 ~ 2) } - \relative c'' { - a4( c b4 e, ~ | \break - e1 ~ | e1) + \relative { + a'4( c b4 e, ~ | \break + e1 ~ | 1) } } diff --git a/input/regression/slur-cross-staff-beam.ly b/input/regression/slur-cross-staff-beam.ly index 834696a5be..342ddf5873 100644 --- a/input/regression/slur-cross-staff-beam.ly +++ b/input/regression/slur-cross-staff-beam.ly @@ -1,4 +1,4 @@ -\version "2.17.25" +\version "2.19.21" \header { texidoc = "Slurs that depend on a cross-staff beam are not calculated until @@ -8,7 +8,7 @@ after line-breaking, and after inside-going articulations have been placed." \paper { ragged-right=##t } \score { \new PianoStaff << - \context Staff = rh \relative c'' { c8([ d) \change Staff = lh c,] r + \context Staff = rh \relative { c''8([ d) \change Staff = lh c,] r \stemDown f'8 \change Staff = rh f_( \change Staff = lh f_\marcato f)} \context Staff = lh { s1 } >> diff --git a/input/regression/slur-dot-collision.ly b/input/regression/slur-dot-collision.ly index b3fc822159..0bcc63669d 100644 --- a/input/regression/slur-dot-collision.ly +++ b/input/regression/slur-dot-collision.ly @@ -1,8 +1,8 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Slurs avoid dots. " } -\relative c''' { e16. ( e,,32 ) } \ No newline at end of file +\relative { e'''16. ( e,,32 ) } \ No newline at end of file diff --git a/input/regression/slur-dots.ly b/input/regression/slur-dots.ly index 50f6c00ce9..a8a05792d4 100644 --- a/input/regression/slur-dots.ly +++ b/input/regression/slur-dots.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc="Slurs should not get confused by augmentation dots. With a lot of dots, the problems becomes more visible." @@ -9,8 +9,8 @@ of dots, the problems becomes more visible." ragged-right = ##t } -\relative c'' { - c4.............( c) +\relative { + c''4.............( c) } diff --git a/input/regression/slur-double.ly b/input/regression/slur-double.ly index f76ece0919..79cc524f3e 100644 --- a/input/regression/slur-double.ly +++ b/input/regression/slur-double.ly @@ -3,10 +3,10 @@ texidoc = "Some composers use slurs both above and below chords. This can be typeset by setting @code{doubleSlurs}" } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c' { +\relative { \set doubleSlurs = ##t - 4 ( ) + 4 ( ) } diff --git a/input/regression/slur-dynamics.ly b/input/regression/slur-dynamics.ly index a3739a48b3..54cbfafb35 100644 --- a/input/regression/slur-dynamics.ly +++ b/input/regression/slur-dynamics.ly @@ -4,12 +4,12 @@ texidoc = "Dynamics avoid collision with slur." } -\version "2.17.15" +\version "2.19.21" \layout { indent = 0\mm ragged-right = ##t } -\relative c' +\relative { b( b f'\p b,) diff --git a/input/regression/slur-extreme.ly b/input/regression/slur-extreme.ly index a1380cf539..ddf31c4e0c 100644 --- a/input/regression/slur-extreme.ly +++ b/input/regression/slur-extreme.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { @@ -12,7 +12,7 @@ Asymmetric slurs are created by setting @code{eccentricity}." ragged-right = ##t } -baseWalk = \relative c { +baseWalk = \relative { \time 6/4 \stemDown \slurUp diff --git a/input/regression/slur-flag.ly b/input/regression/slur-flag.ly index 200595c373..6f208e3a7e 100644 --- a/input/regression/slur-flag.ly +++ b/input/regression/slur-flag.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Slurs take flag extents into account. " } -\relative c'' { +\relative { \stemUp \slurUp - b8( c) + b'8( c) } diff --git a/input/regression/slur-grace.ly b/input/regression/slur-grace.ly index b08dcd1c0f..d998e25ad0 100644 --- a/input/regression/slur-grace.ly +++ b/input/regression/slur-grace.ly @@ -1,12 +1,12 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Appoggiatura and acciaccaturas use a different slur than the default, so they produce a nested slur without warnings." } -\relative c'' { - c4( \acciaccatura e8 d4 e4 f) | +\relative { + c''4( \acciaccatura e8 d4 e4 f) | c4( \appoggiatura e8 d4 e4 f) | c4 \appoggiatura e8 d4 e4 f | } diff --git a/input/regression/slur-height-capping.ly b/input/regression/slur-height-capping.ly index 0d9a6a8611..00130a92e2 100644 --- a/input/regression/slur-height-capping.ly +++ b/input/regression/slur-height-capping.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Slur shaping is not adapted to accommodate objects @@ -8,7 +8,7 @@ the edges are not, however, ignored in the slur scoring. " } -\relative c { +\relative { \clef bass c8( d' a d c, d' a d) c,8( des' as des c, des' as des) | diff --git a/input/regression/slur-manual.ly b/input/regression/slur-manual.ly index 4a9cf8d94f..a3b17d7eca 100644 --- a/input/regression/slur-manual.ly +++ b/input/regression/slur-manual.ly @@ -6,11 +6,11 @@ positioning of the slur. It selects the slur configuration closest to the given pair. " } -\version "2.17.6" +\version "2.19.21" \paper { ragged-right = ##T } -\relative c' { +\relative { \override Slur.positions = #'(-4 . -5) - e( f g) + e'( f g) } diff --git a/input/regression/slur-multiple-linebreak.ly b/input/regression/slur-multiple-linebreak.ly index 3f863ccda1..206f488244 100644 --- a/input/regression/slur-multiple-linebreak.ly +++ b/input/regression/slur-multiple-linebreak.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "already have slur")) @@ -10,16 +10,16 @@ \paper { ragged-right = ##t } -\relative c' { +\relative { \key fis \major - c1( + c'1( \break a2 b4 c) } -\relative c' { +\relative { \key fis \major - c1( + c'1( \break a2( b4 c) % ^ extra SlurEvent diff --git a/input/regression/slur-multiple.ly b/input/regression/slur-multiple.ly index 1b2bec4d01..007b69773e 100644 --- a/input/regression/slur-multiple.ly +++ b/input/regression/slur-multiple.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.29" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "already have slur")) @@ -12,14 +12,10 @@ slur will not be generated. However, one can can create a second slur with a different spanner-id." } -sp=#(define-event-function (parser location n e) (index? ly:event?) - (set! (ly:music-property e 'spanner-id) (format "sp~a" n)) - e) - -\relative c'' { +\relative { % This will give warnings ("Already have slur" and "Cannot end slur") - c4((\sp1( d4)(\sp1( e4) f) | + c''4((\=1( d4)(\=1( e4) f) | % This will give two overlapping slurs and "unterminated slur" from above - d( d\sp2( e) f\sp2) | + d( d\=2( e) f\=2) | } diff --git a/input/regression/slur-rest.ly b/input/regression/slur-rest.ly index 37762861d6..b647899b9b 100644 --- a/input/regression/slur-rest.ly +++ b/input/regression/slur-rest.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc ="Slurs may be placed over rests. The slur will avoid @@ -11,9 +11,9 @@ colliding with the rests. \layout { ragged-right = ##t } { \stemDown c'4 ( r4 c'2) - \relative c'' { + \relative { %% Finish with F if played separately - c8-.( r c,-. r c4) r4| + c''8-.( r c,-. r c4) r4| } } diff --git a/input/regression/slur-scoring.ly b/input/regression/slur-scoring.ly index 4c2f6ae7f1..ebcace50e0 100644 --- a/input/regression/slur-scoring.ly +++ b/input/regression/slur-scoring.ly @@ -12,7 +12,7 @@ } -\version "2.17.28" +\version "2.19.2" \layout { ragged-right = ##t % #(define debug-slur-scoring #t) @@ -23,7 +23,7 @@ \grace e=''16( d8.[) c16] d=''8.[ \grace f16( e16)] s2 - << {c=''8.([ es16] bes4~bes )} + << {c=''8.([ es16] bes4~4 )} \\ {r8 r r } >> diff --git a/input/regression/slur-script.ly b/input/regression/slur-script.ly index 8ba9e19b80..2047c50c6f 100644 --- a/input/regression/slur-script.ly +++ b/input/regression/slur-script.ly @@ -6,12 +6,12 @@ slur responds appropriately if a script is moved." } -\version "2.17.15" +\version "2.19.21" \layout { indent = 0\mm ragged-right = ##t } -\relative c' +\relative { b4-.( b-.) \once \override Script.padding = #1.5 diff --git a/input/regression/slur-shift-region.ly b/input/regression/slur-shift-region.ly index 8a43894cd5..59c42df103 100644 --- a/input/regression/slur-shift-region.ly +++ b/input/regression/slur-shift-region.ly @@ -1,10 +1,10 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "A slur's shift region is automatically made higher to accommodate extra encompass elements." } -\relative c' { - c'2( \tuplet 3/2 { g4 e c) } +\relative { + c''2( \tuplet 3/2 { g4 e c) } } diff --git a/input/regression/slur-tie-control-points.ly b/input/regression/slur-tie-control-points.ly index 5aa59a0f1d..b43f51343d 100644 --- a/input/regression/slur-tie-control-points.ly +++ b/input/regression/slur-tie-control-points.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Slurs and ties should never share extremal control points. @@ -6,6 +6,6 @@ } \paper { ragged-right = ##f } -\relative c'' { - c1~( c2 g) +\relative { + c''1~( c2 g) } diff --git a/input/regression/slur-tilt.ly b/input/regression/slur-tilt.ly index bf7d668a49..1849d20cf7 100644 --- a/input/regression/slur-tilt.ly +++ b/input/regression/slur-tilt.ly @@ -8,11 +8,11 @@ point into one note head, and point over another note head." \layout { ragged-right = ##t } -\version "2.16.0" +\version "2.19.21" -\relative c'' { +\relative { \time 2/4 - g8( f) + g'8( f) a( f) b( f) c'( f,) diff --git a/input/regression/slur-tuplet.ly b/input/regression/slur-tuplet.ly index 202ea32713..2003e95247 100644 --- a/input/regression/slur-tuplet.ly +++ b/input/regression/slur-tuplet.ly @@ -5,20 +5,20 @@ This may not work if the slur starts after the tuplet. " } -\version "2.17.11" +\version "2.19.21" \paper { ragged-right = ##t % #(define debug-slur-scoring #t) } -\relative c' { +\relative { \slurUp \override TupletBracket.bracket-visibility = ##f \override Slur.details.region-size = #6 \tuplet 3/2 { - c( g' c,) + c'( g' c,) } } diff --git a/input/regression/slur-vertical-skylines.ly b/input/regression/slur-vertical-skylines.ly index 2e808b8573..15280d259e 100644 --- a/input/regression/slur-vertical-skylines.ly +++ b/input/regression/slur-vertical-skylines.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Slurs do not force grobs with outside-staff-priority @@ -6,8 +6,8 @@ too high. " } -\relative c' { - f8^"rit"( c' f c' f) r8 r4 | +\relative { + f'8^"rit"( c' f c' f) r8 r4 | c2( c,2 | g1)~\startTrillSpan g1\stopTrillSpan diff --git a/input/regression/slur-vestigial-outside-staff-callback.ly b/input/regression/slur-vestigial-outside-staff-callback.ly index a858017427..4bbc38bf64 100644 --- a/input/regression/slur-vestigial-outside-staff-callback.ly +++ b/input/regression/slur-vestigial-outside-staff-callback.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Outside staff callbacks that no longer apply to grobs @@ -10,10 +10,10 @@ the first and second examples. " } -\relative c'' { +\relative { \set strokeFingerOrientations = #'(up) \override StrokeFinger.avoid-slur = #'outside \autoBeamOff - 16 b + 16 b 16( b) } diff --git a/input/regression/song-basic-nonenglish.ly b/input/regression/song-basic-nonenglish.ly index 3a53832b5f..31f2c9bd3a 100644 --- a/input/regression/song-basic-nonenglish.ly +++ b/input/regression/song-basic-nonenglish.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports non-english syllabels. @@ -8,7 +8,7 @@ non-english syllabels. \festivalsyl #"song-basic-nonenglish.xml" { \tempo 4 = 100 } { -\relative c' { c e g r } +\relative { c' e g r } \addlyrics { ov -- čá -- ci } } #(ly:progress "song-basic-nonenglish") diff --git a/input/regression/song-basic.ly b/input/regression/song-basic.ly index ae0c40d122..35815bbff5 100644 --- a/input/regression/song-basic.ly +++ b/input/regression/song-basic.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports basic songs. @@ -9,7 +9,7 @@ basic songs. \festival #"song-basic.xml" { \tempo 4 = 100 } { \time 3/4 -\relative c' { c2 r2 e4 g2. } +\relative { c'2 r2 e4 g2. } \addlyrics { play the game } } #(ly:progress "song-basic") diff --git a/input/regression/song-breathe.ly b/input/regression/song-breathe.ly index 72dfb8eb7c..18d8dca87f 100644 --- a/input/regression/song-breathe.ly +++ b/input/regression/song-breathe.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports breath marks. @@ -9,7 +9,7 @@ breath marks. \festival #"song-breathe.xml" { \tempo 4 = 100 } { \time 3/4 -\relative c' { c2 e \breathe g } +\relative { c'2 e \breathe g } \addlyrics { play the game } } #(ly:progress "song-breathe") diff --git a/input/regression/song-melisma.ly b/input/regression/song-melisma.ly index 6a597cb1c4..cc9afcbaca 100644 --- a/input/regression/song-melisma.ly +++ b/input/regression/song-melisma.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports melismas. @@ -7,18 +7,18 @@ melismas. \include "festival.ly" \festival #"song-melisma.xml" { \tempo 4 = 100 } -\relative c'' +\relative { << \context Voice = "lala" { \time 3/4 - f4 g8 + f''4 g8 \melisma f e f \melismaEnd e2 } - \lyricsto "lala" \new Lyrics { + \new Lyrics \lyricsto "lala" { la di __ daah } >> diff --git a/input/regression/song-reordering.ly b/input/regression/song-reordering.ly index 1c9083597b..0ab48bd91a 100644 --- a/input/regression/song-reordering.ly +++ b/input/regression/song-reordering.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports reordered lyrics. @@ -8,9 +8,9 @@ reordered lyrics. \festival #"song-reordering.xml" { \tempo 4 = 100 } << - \relative c' \context Voice = "lahlah" { + \relative \context Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 << \context Voice = alternative { \voiceOne diff --git a/input/regression/song-reordering2.ly b/input/regression/song-reordering2.ly index 57595c22ad..800df58cfa 100644 --- a/input/regression/song-reordering2.ly +++ b/input/regression/song-reordering2.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports reordered lyrics. @@ -8,9 +8,9 @@ reordered lyrics. \festival #"song-reordering2.xml" { \tempo 4 = 100 } << - \relative c' \context Voice = "lahlah" { + \relative \context Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 << { \voiceTwo diff --git a/input/regression/song-repetition.ly b/input/regression/song-repetition.ly index 1f9ce28c07..5b0412880c 100644 --- a/input/regression/song-repetition.ly +++ b/input/regression/song-repetition.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports repeat signs. @@ -9,16 +9,16 @@ repeat signs. \score{ \festival #"song-repetition.xml" { \tempo 4 = 100 } << - \context Voice = melody \relative c' { - c2 e4 r4 | g2 e | c1 | + \context Voice = melody \relative { + c'2 e4 r4 | g2 e | c1 | \context Voice = verse \repeat volta 2 {c4 d e f | g1 | } a2 b | c1} - \lyricsto melody \context Lyrics = mainlyrics \lyricmode { + \context Lyrics = mainlyrics \lyricsto melody { do mi sol mi do la si do } - \lyricsto verse \context Lyrics = mainlyrics \lyricmode { + \context Lyrics = mainlyrics \lyricsto verse { do re mi fa sol } - \lyricsto verse \context Lyrics = repeatlyrics \lyricmode { + \context Lyrics = repeatlyrics \lyricsto verse { dodo rere mimi fafa solsol } >> } diff --git a/input/regression/song-skip-noword.ly b/input/regression/song-skip-noword.ly index 9fcbbbf03f..0fb6da3f0b 100644 --- a/input/regression/song-skip-noword.ly +++ b/input/regression/song-skip-noword.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Festival song synthesis output supports lyrics which are not complete words. @@ -8,7 +8,7 @@ lyrics which are not complete words. #(*skip-word* #f) \festival #"song-skip-noword.xml" { \tempo 4 = 100 } -\relative c' { c4 c g' } +\relative { c'4 c g' } \addlyrics { twin -- \skip 4 kle diff --git a/input/regression/song-skip.ly b/input/regression/song-skip.ly index 351113393c..a2c6d7024d 100644 --- a/input/regression/song-skip.ly +++ b/input/regression/song-skip.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports skips. @@ -7,7 +7,7 @@ skips. \include "festival.ly" \festival #"song-skip.xml" { \tempo 4 = 100 } -\relative c' { c c g' } +\relative { c' c g' } \addlyrics { twin -- \skip 4 kle diff --git a/input/regression/song-slurs.ly b/input/regression/song-slurs.ly index 25aba696f5..a2237cfa88 100644 --- a/input/regression/song-slurs.ly +++ b/input/regression/song-slurs.ly @@ -1,4 +1,4 @@ -\version "2.17.15" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports slurs. @@ -8,9 +8,9 @@ slurs. \festival #"song-slurs.xml" { \tempo 4 = 100 } << - \relative c' \context Voice = "lahlah" { + \relative \context Voice = "lahlah" { \set Staff.autoBeaming = ##f - c4 + c'4 \slurDotted f8.[( g16]) a4 diff --git a/input/regression/song-splitpart.ly b/input/regression/song-splitpart.ly index ee4ef160a5..6524f4bc26 100644 --- a/input/regression/song-splitpart.ly +++ b/input/regression/song-splitpart.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports divided voices. @@ -10,8 +10,8 @@ divided voices. \festival #"song-splitpart.xml" { \tempo 4 = 100 } << \context Voice = "melody" { - \relative c' { - c4 + \relative { + c'4 << { \voiceOne c8 e } \context Voice = splitpart { \voiceTwo c4 } diff --git a/input/regression/song-stanzas.ly b/input/regression/song-stanzas.ly index 761e62b8fb..3c4391d641 100644 --- a/input/regression/song-stanzas.ly +++ b/input/regression/song-stanzas.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports multiple stanzas. @@ -9,7 +9,7 @@ multiple stanzas. \festival #"song-stanzas.xml" { \tempo 4 = 100 } { \time 3/4 -\relative c' { c2 e4 g2. } +\relative { c'2 e4 g2. } \addlyrics { play the game } \addlyrics { speel het spel } \addlyrics { joue le jeu } diff --git a/input/regression/song-tempo.ly b/input/regression/song-tempo.ly index 0205ab438d..3788389d9e 100644 --- a/input/regression/song-tempo.ly +++ b/input/regression/song-tempo.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Festival song synthesis output supports changing tempo in the middle of a piece. @@ -9,7 +9,7 @@ changing tempo in the middle of a piece. \festival #"song-tempo.xml" { \tempo 4=90 } { \time 3/4 -\relative c' { c4 e g \tempo 4=60 c, e g } +\relative { c'4 e g \tempo 4=60 c, e g } \addlyrics { do re mi do re mi } } #(ly:progress "song-tempo") diff --git a/input/regression/spacing-accidental-staffs.ly b/input/regression/spacing-accidental-staffs.ly index cf80c66dc0..f049260fe1 100644 --- a/input/regression/spacing-accidental-staffs.ly +++ b/input/regression/spacing-accidental-staffs.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Accidentals in different staves do not affect the @@ -7,11 +7,11 @@ spacing of the eighth notes here." \layout { ragged-right = ##t} -\relative c'' << +\relative << \new Staff { \time 4/4 - c8[ c8 cis8 cis8] + c''8[ c8 cis8 cis8] cis8[ cis8 cis8 cis] } { diff --git a/input/regression/spacing-accidental-stretch.ly b/input/regression/spacing-accidental-stretch.ly index 02312f6042..d3adf5da16 100644 --- a/input/regression/spacing-accidental-stretch.ly +++ b/input/regression/spacing-accidental-stretch.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Accidentals do not influence the amount of stretchable space. @@ -11,9 +11,9 @@ The accidental does add a little non-stretchable space. \layout { line-width = 18.\cm } -\relative c'' { +\relative { \accidentalStyle piano-cautionary \time 2/4 - d16 d d d d d cis d dis dis dis dis + d''16 d d d d d cis d dis dis dis dis } diff --git a/input/regression/spacing-accidental-tie.ly b/input/regression/spacing-accidental-tie.ly index b5fe6dc0c8..f60a68f89d 100644 --- a/input/regression/spacing-accidental-tie.ly +++ b/input/regression/spacing-accidental-tie.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Horizontal spacing works as expected on tied notes with @@ -8,9 +8,9 @@ but accidentals that are printed don't collide with anything." \paper { ragged-right = ##t } -\relative c' +\relative { \time 1/4 - cis16 cis cis cis~ + cis'16 cis cis cis~ cis cis cis cis c c c c \break diff --git a/input/regression/spacing-accidental.ly b/input/regression/spacing-accidental.ly index 632099154d..8089d81d88 100644 --- a/input/regression/spacing-accidental.ly +++ b/input/regression/spacing-accidental.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Accidentals sticking out to the left @@ -8,9 +8,9 @@ of a note will take a little more space, but only if the spacing is tight." \layout { ragged-right = ##t} -\relative c'' { +\relative { \time 8/4 - c2 c2 cis2 cis2 | + c''2 c2 cis2 cis2 | c8 c8 cis8 cis8 cis c c c] } diff --git a/input/regression/spacing-bar-accidental.ly b/input/regression/spacing-bar-accidental.ly index 98c26482e7..a1fac72478 100644 --- a/input/regression/spacing-bar-accidental.ly +++ b/input/regression/spacing-bar-accidental.ly @@ -5,19 +5,19 @@ } -\version "2.17.6" +\version "2.19.21" \layout{ ragged-right = ##t } -\relative c'' { +\relative { \override Score.NonMusicalPaperColumn.stencil = #ly:paper-column::print \override Score.NonMusicalPaperColumn.layer = #2 \time 2/4 \stemUp s2 - c4 r4 + c''4 r4 cis4 r4 } diff --git a/input/regression/spacing-bar-stem.ly b/input/regression/spacing-bar-stem.ly index 2567773e83..3f2915992a 100644 --- a/input/regression/spacing-bar-stem.ly +++ b/input/regression/spacing-bar-stem.ly @@ -9,19 +9,19 @@ to 1.5 staff space." } -\version "2.17.6" +\version "2.19.21" \layout{ ragged-right = ##t } -\relative c'' { +\relative { \override Score.NonMusicalPaperColumn.stencil = #ly:paper-column::print \override Score.NonMusicalPaperColumn.layer = #2 \time 2/4 \stemDown s2 - e4 s4 + e''4 s4 e,4 s4 } diff --git a/input/regression/spacing-bar-whole-measure.ly b/input/regression/spacing-bar-whole-measure.ly index a8503b1a32..c790cd8670 100644 --- a/input/regression/spacing-bar-whole-measure.ly +++ b/input/regression/spacing-bar-whole-measure.ly @@ -3,19 +3,19 @@ } -\version "2.17.6" +\version "2.19.21" \layout{ ragged-right=##t } -\new Staff \relative c' { +\new Staff \relative { \override Score.NonMusicalPaperColumn.stencil = #ly:paper-column::print \override Score.NonMusicalPaperColumn.layer = #1 \time 4/4 s1 - c2. c4 + c'2. c4 \time 3/4 s2. c2. diff --git a/input/regression/spacing-correction-accidentals.ly b/input/regression/spacing-correction-accidentals.ly index cada938d57..1c94c87408 100644 --- a/input/regression/spacing-correction-accidentals.ly +++ b/input/regression/spacing-correction-accidentals.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "If right hand stems have accidentals, optical spacing @@ -6,8 +6,8 @@ correction is still applied, but only if the stem directions are different." } -\relative c' { +\relative { \time 2/4 - c8 cis'' + c'8 cis'' cis8 cis,, } diff --git a/input/regression/spacing-end-of-line.ly b/input/regression/spacing-end-of-line.ly index a4027f9af2..94adb0faf9 100644 --- a/input/regression/spacing-end-of-line.ly +++ b/input/regression/spacing-end-of-line.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc ="Broken engraving of a bar at the end of a line does not upset @@ -11,8 +11,8 @@ ragged-right = ##t } -\relative c' { - c2.. r8 +\relative { + c'2.. r8 c2.. r8 \time 3/4 \break e2 e4 | e2 e4 \time 4/4 \break diff --git a/input/regression/spacing-ended-voice.ly b/input/regression/spacing-ended-voice.ly index 19213cf8dd..f752b1d80e 100644 --- a/input/regression/spacing-ended-voice.ly +++ b/input/regression/spacing-ended-voice.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " A voicelet (a very short voice to get polyphonic chords correct) should not confuse the spacing engine." @@ -7,8 +7,8 @@ should not confuse the spacing engine." \layout { ragged-right = ##t } -{ \context Staff \relative c' { - c4 +{ \context Staff \relative { + c'4 << { r4 dis'4 } \\ { r4 fis,4 } \\ diff --git a/input/regression/spacing-folded-clef-cross-staff.ly b/input/regression/spacing-folded-clef-cross-staff.ly index 7ed718561b..32eef70cfc 100644 --- a/input/regression/spacing-folded-clef-cross-staff.ly +++ b/input/regression/spacing-folded-clef-cross-staff.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Clefs are also folded under cross staff constructs." } @@ -7,10 +7,10 @@ \context PianoStaff << \new Staff = "up" - \relative c'' << + \relative << { \stemDown - f16[ \change Staff = down \stemUp + f''16[ \change Staff = down \stemUp \clef treble g,] } \\ diff --git a/input/regression/spacing-folded-clef.ly b/input/regression/spacing-folded-clef.ly index 665bae99e4..be6055edd9 100644 --- a/input/regression/spacing-folded-clef.ly +++ b/input/regression/spacing-folded-clef.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "A clef can be folded below notes in a different staff, if this does not disrupt the flow of the notes." @@ -6,8 +6,8 @@ this does not disrupt the flow of the notes." \layout { ragged-right = ##t} -\relative c'' << - \new Staff { c4 c16[ c c c] c4 c4 } +\relative << + \new Staff { c''4 c16[ c c c] c4 c4 } \new Staff { \clef bass c,2 \clef treble c'2 } >> diff --git a/input/regression/spacing-folded-clef2.ly b/input/regression/spacing-folded-clef2.ly index 6f5777b93d..9a68dc8e99 100644 --- a/input/regression/spacing-folded-clef2.ly +++ b/input/regression/spacing-folded-clef2.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "A clef can be folded below notes in a different staff, if @@ -19,8 +19,8 @@ can show where columns are in the score." } } -\relative c'' << - \new Staff { c4 c4 c4 c \bar "|." } +\relative << + \new Staff { c''4 c4 c4 c \bar "|." } \new Staff { \clef bass c,2 \clef treble c'2 } >> diff --git a/input/regression/spacing-folded-clef3.ly b/input/regression/spacing-folded-clef3.ly index 74e4fc392a..ccac4283df 100644 --- a/input/regression/spacing-folded-clef3.ly +++ b/input/regression/spacing-folded-clef3.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Voices that go back and forth between staves do not confuse the spacing engine." @@ -7,9 +7,9 @@ \paper { ragged-right = ##t } \new PianoStaff << - \new Staff = "rh" \relative c'' { + \new Staff = "rh" \relative { \time 6/8 - bes16 c d + bes'16 c d \change Staff = lh \stemUp bes a g \change Staff = rh @@ -25,9 +25,9 @@ >> \new PianoStaff << - \new Staff = "rh" \relative c'' { + \new Staff = "rh" \relative { \time 6/8 - bes16 c d + bes'16 c d \change Staff = lh \stemUp bes a g \change Staff = rh diff --git a/input/regression/spacing-grace-duration.ly b/input/regression/spacing-grace-duration.ly index 70f4f9b522..a4b7e4767f 100644 --- a/input/regression/spacing-grace-duration.ly +++ b/input/regression/spacing-grace-duration.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Spacing uses the duration of the notes, but disregards @@ -11,10 +11,10 @@ \layout { ragged-right = ##t} -\relative c'' +\relative \context Voice { - c8[ c8] + c''8[ c8] \grace { b16 } c8[ c8] c8[ c8] diff --git a/input/regression/spacing-grace.ly b/input/regression/spacing-grace.ly index 3d64bb03e8..99fda4aad7 100644 --- a/input/regression/spacing-grace.ly +++ b/input/regression/spacing-grace.ly @@ -5,13 +5,13 @@ run are spaced accordingly. " } -\version "2.17.28" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c'' +\relative { - c4 + c''4 \grace { c16 } c \grace { c16 } diff --git a/input/regression/spacing-horizontal-skyline-grace.ly b/input/regression/spacing-horizontal-skyline-grace.ly index b99c173eef..e2a375ded4 100644 --- a/input/regression/spacing-horizontal-skyline-grace.ly +++ b/input/regression/spacing-horizontal-skyline-grace.ly @@ -6,7 +6,7 @@ and the barline do not collide." } -\version "2.17.6" +\version "2.19.21" \paper { @@ -20,7 +20,7 @@ and the barline do not collide." \time 6/8 \clef bass s2. | - \relative c << + \relative << { 4\arpeggio } diff --git a/input/regression/spacing-horizontal-skyline.ly b/input/regression/spacing-horizontal-skyline.ly index 27c0fa8685..d413976200 100644 --- a/input/regression/spacing-horizontal-skyline.ly +++ b/input/regression/spacing-horizontal-skyline.ly @@ -3,14 +3,14 @@ texidoc = "accidentals may be folded under preceding notes." } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c''' { - \stemUp c4...*1/2 +\relative { + \stemUp c'''4...*1/2 ceses,,! eses! diff --git a/input/regression/spacing-loose-polyphony.ly b/input/regression/spacing-loose-polyphony.ly index 43fdb6e8d4..c13677b32d 100644 --- a/input/regression/spacing-loose-polyphony.ly +++ b/input/regression/spacing-loose-polyphony.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Loose columns (here, the treble clef) are spaced @@ -7,11 +7,11 @@ correctly in polyphonic music. } \new PianoStaff << - \new Staff \relative c' { + \new Staff \relative { \tuplet 3/2 { g'4 a2 } } - \new Staff \relative c' { - \clef bass fis,,8 cis' + \new Staff \relative { + \clef bass fis,8 cis' \clef treble g'' fis, } >> diff --git a/input/regression/spacing-mark-width.ly b/input/regression/spacing-mark-width.ly index 8010f4edfb..1539b901ce 100644 --- a/input/regression/spacing-mark-width.ly +++ b/input/regression/spacing-mark-width.ly @@ -4,15 +4,15 @@ } -\version "2.17.6" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c'' +\relative { \override Score.RehearsalMark.break-visibility = #begin-of-line-invisible - c1 + c''1 \mark "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " } diff --git a/input/regression/spacing-multi-tuplet.ly b/input/regression/spacing-multi-tuplet.ly index bab9232a8d..0f11ac8677 100644 --- a/input/regression/spacing-multi-tuplet.ly +++ b/input/regression/spacing-multi-tuplet.ly @@ -1,29 +1,19 @@ -\version "2.17.11" +\version "2.19.21" \header{ - texidoc = "Concurrent tuplets should be equidistant on all staves. -Such equidistant spacing is at odds with elegant engraver spacing; -hence it must be switched on explicitly with the -@code{uniform-stretching} property of @code{SpacingSpanner}." + texidoc = "Concurrent tuplets should be equidistant on all staves." } -\layout{ - \context{ - \Score - \override SpacingSpanner.uniform-stretching = ##t - } -} +\paper {ragged-right = ##f } -\relative c' { +\relative { \context StaffGroup << \new Staff \context Voice { - \tuplet 10/2 { c8[ c c c c c c c c c] } - \tuplet 10/2 { c[ c c c c c c c c c] } + \tuplet 10/8 { c'8[ c c c c c c c c c] } } \new Staff \context Voice { - \tuplet 11/2 { c8[ c c c c c c c c c c] } - \tuplet 11/2 { c[ c c c c c c c c c c] } + \tuplet 8/8 { c8[ c c c c c c c] } } >> } diff --git a/input/regression/spacing-non-adjacent-columns1.ly b/input/regression/spacing-non-adjacent-columns1.ly index 0780f39775..557f268ff2 100644 --- a/input/regression/spacing-non-adjacent-columns1.ly +++ b/input/regression/spacing-non-adjacent-columns1.ly @@ -1,15 +1,15 @@ -\version "2.16.0" +\version "2.19.21" \paper {ragged-right = ##t} \header { texidoc = "The spacing engine avoids collisions between non-adjacent columns." } -foo = \relative c'' { - g'32[ c,] +foo = \relative { + g''32[ c,] } -bar = \relative c { +bar = \relative { c16 4 } diff --git a/input/regression/spacing-non-adjacent-columns2.ly b/input/regression/spacing-non-adjacent-columns2.ly index 977647a985..84abc21629 100644 --- a/input/regression/spacing-non-adjacent-columns2.ly +++ b/input/regression/spacing-non-adjacent-columns2.ly @@ -1,15 +1,15 @@ -\version "2.16.0" +\version "2.19.21" \paper {ragged-right = ##t} \header { texidoc = "The spacing engine avoids collisions between non-adjacent columns." } -foo = \relative c'' { - g'32[ c,] +foo = \relative { + g''32[ c,] } -bar = \relative c { +bar = \relative { s16 4 } diff --git a/input/regression/spacing-note-flags.ly b/input/regression/spacing-note-flags.ly index 9771c636a8..81c03b14f8 100644 --- a/input/regression/spacing-note-flags.ly +++ b/input/regression/spacing-note-flags.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -12,9 +12,9 @@ ragged-right = ##t } -\relative c'' \context Staff { +\relative \context Staff { \set autoBeaming = ##f - a8[ a8 a8 a8] + a'8[ a8 a8 a8] a8 a8 a8 a8 } diff --git a/input/regression/spacing-packed.ly b/input/regression/spacing-packed.ly index d3a01b6f92..e5d415761f 100644 --- a/input/regression/spacing-packed.ly +++ b/input/regression/spacing-packed.ly @@ -10,9 +10,9 @@ " } -\version "2.17.6" +\version "2.19.21" -\relative c' { +\relative { \override Score.SpacingSpanner.packed-spacing = ##t - c2 d4 f8[ g] a + c'2 d4 f8[ g] a } diff --git a/input/regression/spacing-proportional.ly b/input/regression/spacing-proportional.ly index 73c13dcdf2..4cd8c33946 100644 --- a/input/regression/spacing-proportional.ly +++ b/input/regression/spacing-proportional.ly @@ -6,14 +6,14 @@ to the distance for the given duration." } -\version "2.17.11" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c'' +\relative << \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) - \new Staff { c8[ c c c c c] c4 c2 r2 } + \new Staff { c''8[ c c c c c] c4 c2 r2 } \new Staff { c2 \tuplet 3/2 { c8 c c } c4 c1 } >> diff --git a/input/regression/spacing-ragged-last.ly b/input/regression/spacing-ragged-last.ly index d785143960..2b2ff08d89 100644 --- a/input/regression/spacing-ragged-last.ly +++ b/input/regression/spacing-ragged-last.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -12,5 +12,5 @@ ragged-last = ##t } -\relative c'' \new Staff { \repeat unfold 20 { c1 } } +\relative \new Staff { \repeat unfold 20 { c''1 } } diff --git a/input/regression/spacing-rest.ly b/input/regression/spacing-rest.ly index 89dfc2770e..d0c4a257f2 100644 --- a/input/regression/spacing-rest.ly +++ b/input/regression/spacing-rest.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Rests get a little less space, since they are narrower. However, the quarter rest in feta font is relatively wide, causing this @@ -10,9 +10,9 @@ effect to be very small. \layout { ragged-right = ##t } -\relative c'' \context Staff { +\relative \context Staff { \time 12/4 - r4 c4 c4 c4 r4 r4 c4 + r4 c''4 c4 c4 r4 r4 c4 } diff --git a/input/regression/spacing-section.ly b/input/regression/spacing-section.ly index 1ae03f66e9..a1bf1f3bd3 100644 --- a/input/regression/spacing-section.ly +++ b/input/regression/spacing-section.ly @@ -11,10 +11,10 @@ the 4/16, and a 16th in the second section takes as much space as a { ragged-right = ##t } -\version "2.16.0" -\relative c' { +\version "2.19.21" +\relative { \time 2/4 - c4 c8 c + c'4 c8 c c8 c c4 c16[ c c8] c4 \newSpacingSection diff --git a/input/regression/spacing-short-notes.ly b/input/regression/spacing-short-notes.ly index c556abafd3..4e0accf86c 100644 --- a/input/regression/spacing-short-notes.ly +++ b/input/regression/spacing-short-notes.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Notes that are shorter than the common shortest note get a @@ -12,10 +12,10 @@ eighth note. " \layout { ragged-right = ##t} -\relative c'' +\relative { \time 2/4 - c16 c c c c4 c4 + c''16 c c c c4 c4 c8 c8 c8 c8 c8 c8 c4 c8 c8 c4 diff --git a/input/regression/spacing-stem-bar.ly b/input/regression/spacing-stem-bar.ly index 7665030801..8c26d9d559 100644 --- a/input/regression/spacing-stem-bar.ly +++ b/input/regression/spacing-stem-bar.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Upstem notes before a barline are printed with some extra @@ -11,7 +11,7 @@ space. This is an optical correction similar to juxtaposed stems. \layout { ragged-right = ##t} -\relative e' +\relative { \override Score.PaperColumn.layer = #1 \override Score.PaperColumn.stencil = #ly:paper-column::print @@ -19,7 +19,7 @@ space. This is an optical correction similar to juxtaposed stems. \time 2/8 \stemUp - e8[ e] + e'8[ e] e'[ e] } diff --git a/input/regression/spacing-stem-direction.ly b/input/regression/spacing-stem-direction.ly index fbca840c55..805a944507 100644 --- a/input/regression/spacing-stem-direction.ly +++ b/input/regression/spacing-stem-direction.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header{ @@ -16,7 +16,7 @@ much to correct." } -\context Voice \relative c { +\context Voice \relative { \override Score.PaperColumn.layer = #1 \override Score.PaperColumn.stencil = #ly:paper-column::print diff --git a/input/regression/spacing-stem-same-direction.ly b/input/regression/spacing-stem-same-direction.ly index 03a20bc679..d905042ca1 100644 --- a/input/regression/spacing-stem-same-direction.ly +++ b/input/regression/spacing-stem-same-direction.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "For juxtaposed chords with the same direction, a slight optical correction is used. It is constant, and works only if @@ -8,13 +8,13 @@ two chords have no common head-positions range." \layout { ragged-right = ##t} -\relative c'' { +\relative { \override Score.PaperColumn.layer = #1 \override Score.PaperColumn.stencil = #ly:paper-column::print \stemDown \time 12/4 - f8[ + f''8[ e f e] f[ d f d] f[ c f c] f[ b, f' b,] f'[ a, f' a,] } diff --git a/input/regression/spacing-stick-out.ly b/input/regression/spacing-stick-out.ly index cd78aa7bfd..ae2a46e539 100644 --- a/input/regression/spacing-stick-out.ly +++ b/input/regression/spacing-stick-out.ly @@ -7,11 +7,11 @@ } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c' { - c1 c1^"This is a really long text" c +\relative { + c'1 c1^"This is a really long text" c } diff --git a/input/regression/spacing-strict-notespacing.ly b/input/regression/spacing-strict-notespacing.ly index 6e17724c1f..26042175f7 100644 --- a/input/regression/spacing-strict-notespacing.ly +++ b/input/regression/spacing-strict-notespacing.ly @@ -9,7 +9,7 @@ time. This may cause collisions. " } -\version "2.17.28" +\version "2.19.21" \paper { ragged-right = ##t @@ -21,12 +21,12 @@ time. This may cause collisions. " } } -\relative c'' +\relative << \override Score.SpacingSpanner.strict-note-spacing = ##t \set Score.proportionalNotationDuration = #(ly:make-moment 1/16) \new Staff { - c8[ c \clef alto c c \grace { d16 } c8 c] c4 c2 + c''8[ c \clef alto c c \grace { d16 } c8 c] c4 c2 \grace { c16 c16 } c2 } \new Staff { diff --git a/input/regression/spacing-to-grace.ly b/input/regression/spacing-to-grace.ly index 49c8c930fb..99202cfe73 100644 --- a/input/regression/spacing-to-grace.ly +++ b/input/regression/spacing-to-grace.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc ="Space from a normal note (or barline) to a grace note is @@ -12,8 +12,8 @@ \context Voice { \time 2/4 - \relative c'' { - e8 e \grace d8 e e \grace f8 e es, d' d + \relative { + e''8 e \grace d8 e e \grace f8 e es, d' d e8 e e e \grace { \stemDown f8 \stemNeutral } e es, d' } diff --git a/input/regression/spacing-uniform-stretching.ly b/input/regression/spacing-uniform-stretching.ly index 16cd079404..3cb7b884b8 100644 --- a/input/regression/spacing-uniform-stretching.ly +++ b/input/regression/spacing-uniform-stretching.ly @@ -6,13 +6,13 @@ } -\version "2.17.11" +\version "2.19.21" -\relative c'' +\relative << \override Score.SpacingSpanner.uniform-stretching = ##t \new Staff { - c16[ c c c c c c c c c16] + c''16[ c c c c c c c c c16] } \new Staff { \tuplet 7/6 { c16 c c cis c c c } diff --git a/input/regression/span-bar-allow-span-bar.ly b/input/regression/span-bar-allow-span-bar.ly index c6fe94815b..7a93ffd8e2 100644 --- a/input/regression/span-bar-allow-span-bar.ly +++ b/input/regression/span-bar-allow-span-bar.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "The @code{SpanBarStub} grob takes care of horizontal spacing @@ -16,42 +16,42 @@ span bar were not there. \new GrandStaff << \new Staff \new Voice = "upper" - \relative c'' { - c2 c c c + \relative { + c''2 c c c \once \override Staff.BarLine.allow-span-bar = ##f c2 c c c c2 c c c \once \override Staff.BarLine.allow-span-bar = ##f c2 c c c } - \new Lyrics \lyricsto "upper" \lyricmode { + \new Lyrics \lyricsto "upper" { long-syllable a b c long-syllable a b c long-syllable a b c long-syllable a b c } \new Staff \new Voice = "middle" - \relative c'' { - c2 c c c + \relative { + c''2 c c c c2 c c c c2 c c c \once \override Staff.BarLine.allow-span-bar = ##f c2 c c c } - \new Lyrics \lyricsto "middle" \lyricmode { + \new Lyrics \lyricsto "middle" { syllable a b c syllable a b c syllable a b c syllable a b c } \new Staff \new Voice = "lower" - \relative c'' { - c2 c c c + \relative { + c''2 c c c c2 c c c c2 c c c c2 c c c } - \new Lyrics \lyricsto "lower" \lyricmode { + \new Lyrics \lyricsto "lower" { word a b c word a b c word a b c word a b c } diff --git a/input/regression/span-bar-partial.ly b/input/regression/span-bar-partial.ly index adf890e5fc..9113a0acd1 100644 --- a/input/regression/span-bar-partial.ly +++ b/input/regression/span-bar-partial.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Span bars can be turned on/@/off on a staff-by-staff basis." } @@ -10,9 +10,9 @@ ragged-right =##t } -\relative c' \new StaffGroup << +\relative \new StaffGroup << \new Staff { - c1 + c'1 \once \override Staff.BarLine.allow-span-bar = ##f c1 c1 c1 \bar "|." diff --git a/input/regression/span-bar-spacing.ly b/input/regression/span-bar-spacing.ly index f58812751d..a4a109abcf 100644 --- a/input/regression/span-bar-spacing.ly +++ b/input/regression/span-bar-spacing.ly @@ -8,12 +8,12 @@ edge of a bar line. This spacing should also take place when " } -\version "2.16.0" +\version "2.19.21" -upper = \relative c' { +upper = \relative { \key f \minor \time 12/8 r4. r8 r r r r r r r r - e8 e e e e e e e e e e e + e'8 e e e e e e e e e e e e, e'! e! e! e! e! e! e! e! e! e! e! } diff --git a/input/regression/span-bar.ly b/input/regression/span-bar.ly index 4984602916..d102aaf246 100644 --- a/input/regression/span-bar.ly +++ b/input/regression/span-bar.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.21" \header { texidoc = "Span bars are drawn only between staff bar lines. By setting bar lines to transparent, they are shown only between systems. @@ -16,7 +16,7 @@ between systems. ragged-right =##t } -\relative c' \new StaffGroup << +\relative \new StaffGroup << \new Staff { a1 \once \hide Score.BarLine diff --git a/input/regression/spanner-after-line-breaking.ly b/input/regression/spanner-after-line-breaking.ly index 100d81346a..9c9c4f9d20 100644 --- a/input/regression/spanner-after-line-breaking.ly +++ b/input/regression/spanner-after-line-breaking.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "The visibility of left-broken line spanners and hairpins @@ -9,7 +9,7 @@ controlled by the callback @code{ly:spanner::kill-zero-spanned-time}. \paper { ragged-right = ##t } -\relative c' { +\relative { \override TextSpanner.bound-details = #'((left (Y . 0) @@ -25,7 +25,7 @@ controlled by the callback @code{ly:spanner::kill-zero-spanned-time}. (text . #f)) (right-broken (text . #f))) - c1\startTextSpan\< \break + c'1\startTextSpan\< \break \override Hairpin.to-barline = ##f \override Hairpin.after-line-breaking = ##f c2\stopTextSpan\! diff --git a/input/regression/spanner-alignment.ly b/input/regression/spanner-alignment.ly index 02e04ece7d..2b4210841d 100644 --- a/input/regression/spanner-alignment.ly +++ b/input/regression/spanner-alignment.ly @@ -16,7 +16,7 @@ ignoring things like pedal marks. } \new Dynamics = "dynamics" { \repeat unfold 2 { - s1\cresc s1\f s1\dim s1\p + s1\cresc s1\f s1\dim s1\p \break } } \new Staff = "down" { diff --git a/input/regression/spanner-break-overshoot.ly b/input/regression/spanner-break-overshoot.ly index 02ffba9a5c..08f337b9ce 100644 --- a/input/regression/spanner-break-overshoot.ly +++ b/input/regression/spanner-break-overshoot.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "The @code{break-overshoot} property sets the amount that @@ -9,10 +9,10 @@ prefatory matter." \paper { ragged-right = ##t } -\relative c'' { +\relative { \override Beam.break-overshoot = #'(1.0 . 2.0) \override TupletBracket.break-overshoot = #'(1.0 . 2.0) \override TupletBracket.bracket-visibility = ##t \override Beam.breakable = ##t - c2.. \tuplet 3/2 { c8.[ \break c8.] } + c''2.. \tuplet 3/2 { c8.[ \break c8.] } } diff --git a/input/regression/ssaattbb-template-with-all-staves.ly b/input/regression/ssaattbb-template-with-all-staves.ly new file mode 100644 index 0000000000..5702988446 --- /dev/null +++ b/input/regression/ssaattbb-template-with-all-staves.ly @@ -0,0 +1,51 @@ +\version "2.19.25" + +\header { + texidoc ="This should produce a choral score with solo, +descant, women, sop 1 and 2, sop, alto, alto 1 and 2, +tenor 1 and 2, tenor, bass, bass 1 and 2, men and piano +staves. Normally the various combinations would appear +at different times in the score, not all at once. " +} + +SoloMusic = \relative { e''4 e e e | } +SoloLyrics = \lyricmode { So -- lo ly -- rics } +DescantMusic = \relative { e''4 e e e | } +DescantLyrics = \lyricmode { Des -- cant ly -- rics } +WomenMusic = \relative {g'4 g g g } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoOneMusic = \relative { c''8 e c e e4 e | } +SopranoOneLyrics = \lyricmode { So -- pra -- no One ly -- rics } +SopranoTwoMusic = \relative { c''8 c c c c4 c | } +SopranoTwoLyrics = \lyricmode { So -- pra -- no Two ly -- rics } +SopranoMusic = \relative { c''4 c c c8 c } +SopranoLyrics = \lyricmode { So -- pra -- no ly -- rics } +AltoOneMusic = \relative { g'16 g g( c) g2 g4 } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { g'16 e e c g'2 } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +AltoMusic = \relative { g'4 g g g | } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +TenorOneMusic = \relative { c'8 c c4 c c | } +TenorOneLyrics = \lyricmode { Te -- nor One ly -- rics } +TenorTwoMusic = \relative { c'8 c g4 g g | } +TenorTwoLyrics = \lyricmode { Te -- nor Two ly -- rics } +TenorMusic = \relative { c'4 c c c | } +TenorLyrics = \lyricmode { Te -- nor ly -- rics } +BassMusic = \relative { g2 g4 g | } +BassLyrics = \lyricmode { Bass ly -- rics } +BassOneMusic = \relative { g4 g g g | } +BassOneLyrics = \lyricmode { Bass One ly -- rics } +BassTwoMusic = \relative { g4 g g g | } +BassTwoLyrics = \lyricmode { Bass Two ly -- rics } +MenMusic = \relative { e2 e4 e | } +MenLyrics = \lyricmode { Men ly -- rics } + +PianoRHMusic = \relative { c''4 c c c | } +PianoLHMusic = \relative { c2 c | } + +\layout { + ragged-right = ##t +} + +\include "ssaattbb.ly" diff --git a/input/regression/ssaattbb-template-with-all-voices-on-one-staff.ly b/input/regression/ssaattbb-template-with-all-voices-on-one-staff.ly new file mode 100644 index 0000000000..9cfc7fcf5c --- /dev/null +++ b/input/regression/ssaattbb-template-with-all-voices-on-one-staff.ly @@ -0,0 +1,53 @@ +\version "2.19.25" + +\header { + texidoc ="This should produce a choral score with solo, +descant, women, sop divisi, sop and alto, alto divisi, +tenor divisi, tenor and bass, bass divisi, men and piano +staves. Normally the various combinations would appear +at different times in the score, not all at once. " +} + +TwoVoicesPerStaff = ##t + +SoloMusic = \relative { e''4 e e e | } +SoloLyrics = \lyricmode { So -- lo ly -- rics } +DescantMusic = \relative { e''4 e e e | } +DescantLyrics = \lyricmode { Des -- cant ly -- rics } +WomenMusic = \relative {g'4 g g g } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +SopranoOneMusic = \relative { c''8 e c e e4 e | } +SopranoOneLyrics = \lyricmode { So -- pra -- no One ly -- rics } +SopranoTwoMusic = \relative { c''8 c c c c4 c | } +SopranoTwoLyrics = \lyricmode { So -- pra -- no Two ly -- rics } +SopranoMusic = \relative { c''4 c c c8 c } +SopranoLyrics = \lyricmode { So -- pra -- no ly -- rics } +AltoOneMusic = \relative { g'16 g g( c) g2 g4 } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { g'16 e e c g'2 } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +AltoMusic = \relative { g'4 g g g | } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +TenorOneMusic = \relative { c'8 c c4 c c | } +TenorOneLyrics = \lyricmode { Te -- nor One ly -- rics } +TenorTwoMusic = \relative { c'8 c g4 g g | } +TenorTwoLyrics = \lyricmode { Te -- nor Two ly -- rics } +TenorMusic = \relative { c'4 c c c | } +TenorLyrics = \lyricmode { Te -- nor ly -- rics } +BassMusic = \relative { g2 g4 g | } +BassLyrics = \lyricmode { Bass ly -- rics } +BassOneMusic = \relative { g4 g g g | } +BassOneLyrics = \lyricmode { Bass One ly -- rics } +BassTwoMusic = \relative { g4 g g g | } +BassTwoLyrics = \lyricmode { Bass Two ly -- rics } +MenMusic = \relative { e2 e4 e | } +MenLyrics = \lyricmode { Men ly -- rics } + +PianoRHMusic = \relative { c''4 c c c | } +PianoLHMusic = \relative { c2 c | } + +\layout { + ragged-right = ##t +} + +\include "ssaattbb.ly" diff --git a/input/regression/ssaattbb-template-with-changed-instrument-names.ly b/input/regression/ssaattbb-template-with-changed-instrument-names.ly new file mode 100644 index 0000000000..4dab86ad41 --- /dev/null +++ b/input/regression/ssaattbb-template-with-changed-instrument-names.ly @@ -0,0 +1,38 @@ +\version "2.19.25" + +\header { + texidoc ="Instrument names and short instrument names +can be changed when using the ssaattbb built-in template." +} + +Time = { s1 \break s1 } +TwoVoicesPerStaff = ##t + +SopranoOneInstrumentName = "Sop One" +SopranoOneShortInstrumentName = "Sop 1" +SopranoTwoInstrumentName = "Sop Two" +SopranoTwoShortInstrumentName = "Sop 2" +MenDividedInstrumentName = "Men Div" +MenDividedShortInstrumentName = "M Div" +MenInstrumentName = "Men Uni" +MenShortInstrumentName = "M Uni" +TenorInstrumentName = "Tenori" +BassInstrumentName = "Bassi" +PianoInstrumentName = "Organ" + +MenMusic = \relative { s1 | c4 c c c } +SopranoOneMusic = \relative { c''4 c c c | c c c c } +SopranoTwoMusic = \relative { g'4 g g g | g g g g } +TenorMusic = \relative { c'4 c c c | s1 } +BassMusic = \relative { g2 g4 g | s1 } + +PianoRHMusic = \relative { c''4 c c c | c c c c } +PianoLHMusic = \relative { c2 c c c } + +\layout { + ragged-right = ##t +} + +\paper { left-margin = 15 } + +\include "ssaattbb.ly" diff --git a/input/regression/ssaattbb-template-with-men-women-and-descant.ly b/input/regression/ssaattbb-template-with-men-women-and-descant.ly new file mode 100644 index 0000000000..dcd6f215c7 --- /dev/null +++ b/input/regression/ssaattbb-template-with-men-women-and-descant.ly @@ -0,0 +1,49 @@ +\version "2.19.25" + +\header { + texidoc ="This should produce an SSAATTBB score with piano +accompaniment, with divisi soprano and tenor on single staves, +alto one and alto two on separate staves and unison bass in the +first system, then unison soprano and alto voices with descant +in the second system and unison women and unison men voices in +the third system. " +} + +SopranoTwoVoicesPerStaff = ##t +TenorTwoVoicesPerStaff = ##t + +Time = { s1 \break | s1 \break } + +DescantMusic = \relative { s1 | e''4 e e e | s1 } +DescantLyrics = \lyricmode { Des -- cant ly -- rics } +SopranoOneMusic = \relative { c''8 e c e e4 e | s1*2 | } +SopranoOneLyrics = \lyricmode { So -- pra -- no One ly -- rics } +SopranoTwoMusic = \relative { c''8 c c c c4 c | s1*2 | } +SopranoTwoLyrics = \lyricmode { So -- pra -- no Two ly -- rics } +SopranoMusic = \relative { s1 | c''4 c c c8 c } +SopranoLyrics = \lyricmode { So -- pra -- no ly -- rics } +AltoOneMusic = \relative { g'16 g g( c) g2 g4 | s1*2 | } +AltoOneLyrics = \lyricmode { Al -- to One ly -- rics } +AltoTwoMusic = \relative { r4 g'16 e e c g'2 | s1*2 | } +AltoTwoLyrics = \lyricmode { Al -- to Two ly -- rics } +AltoMusic = \relative { s1 | g'4 g g g | } +AltoLyrics = \lyricmode { Al -- to ly -- rics } +WomenMusic = \relative {s1*2 | g4 g g g } +WomenLyrics = \lyricmode { Wo -- men ly -- rics } +MenMusic = \relative { s1*2 | e2 e4 e | } +MenLyrics = \lyricmode { Men ly -- rics } +TenorOneMusic = \relative { c'8 c c4 c c | s1*2 | } +TenorOneLyrics = \lyricmode { Te -- nor One ly -- rics } +TenorTwoMusic = \relative { c'8 c g4 g g | s1*2 | } +TenorTwoLyrics = \lyricmode { Te -- nor Two ly -- rics } +BassMusic = \relative { g2 g4 g | s1*2 } +BassLyrics = \lyricmode { Bass ly -- rics } + +PianoRHMusic = \relative { c''4 c c c | c c c c | c c c c | } +PianoLHMusic = \relative { c2 c | c c | c c | } + +\layout { + ragged-right = ##t +} + +\include "ssaattbb.ly" diff --git a/input/regression/staccato-pos.ly b/input/regression/staccato-pos.ly index df275a688a..7c722250a7 100644 --- a/input/regression/staccato-pos.ly +++ b/input/regression/staccato-pos.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header{ @@ -15,23 +15,23 @@ } { - \new Voice \relative c'' { + \new Voice \relative { \voiceOne - g8-. a-. b-. c-. + g'8-. a-. b-. c-. a-. b-. c-. d-. b8[-. a-. g b] e,-. f-. g-. a-. e-. g-. b-. d-. } \context Voice { - \relative c' { - e'4-. f-. g-. d-. c-. b-. + \relative { + e''4-. f-. g-. d-. c-. b-. \stemDown e,-. d-. c-. b-. a-. g-. } - \relative c'' { + \relative { \stemUp - d-> c-> b-> a-> g-> f-> e-> d-> + d''-> c-> b-> a-> g-> f-> e-> d-> d' d-. c-. b-. a-. g-. f-. e-. d-. } diff --git a/input/regression/staff-halfway.ly b/input/regression/staff-halfway.ly index 68e5e72beb..41bbe84170 100644 --- a/input/regression/staff-halfway.ly +++ b/input/regression/staff-halfway.ly @@ -2,14 +2,14 @@ texidoc = "Staves can be started and stopped at command. " } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c'' { - b b \stopStaff b b \startStaff +\relative { + b' b \stopStaff b b \startStaff \clef bass c,, c } diff --git a/input/regression/staff-ledger-positions-dotted-notes.ly b/input/regression/staff-ledger-positions-dotted-notes.ly new file mode 100644 index 0000000000..dfe5def834 --- /dev/null +++ b/input/regression/staff-ledger-positions-dotted-notes.ly @@ -0,0 +1,16 @@ +\header { + + texidoc = "When the vertical positions of ledger lines have been +customized by setting the @code{ledger-positions} property of the +StaffSymbol, and a dotted note falls on a ledger line, the dot is shifted +up to avoid the ledger line (just as with uncustomized ledger lines)." +} + +\version "2.19.21" + +\new Staff \relative { + \override Staff.StaffSymbol.line-positions = #'(-3 0 3) + \override Staff.StaffSymbol.ledger-positions = #'(-3 0) + \override Staff.StaffSymbol.ledger-extra = #1 + f4. g a b c d g' a b c d e +} diff --git a/input/regression/staff-ledger-positions.ly b/input/regression/staff-ledger-positions.ly index 3e8c191937..986f18cc61 100644 --- a/input/regression/staff-ledger-positions.ly +++ b/input/regression/staff-ledger-positions.ly @@ -7,9 +7,9 @@ either all or none are shown. Ledger lines can be set to appear sooner or later by setting the @code{ledger-extra} property." } -\version "2.17.6" +\version "2.19.21" -\new Staff \relative c' { +\new Staff \relative { \override Staff.StaffSymbol.line-positions = #'(-5 -2 -1 2 5 6) \override Staff.StaffSymbol.ledger-positions = #'(-5 (-2 -1) 2) \override Staff.StaffSymbol.ledger-extra = #1 diff --git a/input/regression/staff-line-positions.ly b/input/regression/staff-line-positions.ly index e8c9d4fa8f..e7c10d3e42 100644 --- a/input/regression/staff-line-positions.ly +++ b/input/regression/staff-line-positions.ly @@ -6,10 +6,10 @@ } -\version "2.17.6" +\version "2.19.21" -\new Staff \relative c' { +\new Staff \relative { \override Staff.StaffSymbol.line-positions = #'(-7 -2 0 3 9) g c f b e a } diff --git a/input/regression/staff-online-symbol-absence.ly b/input/regression/staff-online-symbol-absence.ly index 6ddbd735e6..698183fe22 100644 --- a/input/regression/staff-online-symbol-absence.ly +++ b/input/regression/staff-online-symbol-absence.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Symbols that need on-staffline info (like dots and ties) @@ -9,8 +9,8 @@ \new Staff \with { \remove "Staff_symbol_engraver" } -\relative c' { +\relative { \time 5/8 - f4 ~ f4 + f'4 ~ 4 f4 f4. } diff --git a/input/regression/staff-tweak.ly b/input/regression/staff-tweak.ly index 36e75dba38..b614b827be 100644 --- a/input/regression/staff-tweak.ly +++ b/input/regression/staff-tweak.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "The staff is a grob (graphical object) which may be adjusted as well, for example, to have 6 thick lines and a slightly large @code{staff-space}. @@ -11,7 +11,7 @@ However, beams remain correctly quantized." } -mus = \relative c' { c4 g' d'8 d d d } +mus = \relative { c'4 g' d'8 d d d } << diff --git a/input/regression/stanza-number.ly b/input/regression/stanza-number.ly index eaf7b7c936..2e315d8317 100644 --- a/input/regression/stanza-number.ly +++ b/input/regression/stanza-number.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Stanza numbers are put left of their lyric. They are aligned in a column." } -\relative c'' { r4 r4 c4 c4 } +\relative { r4 r4 c''4 c4 } \addlyrics { \skip 2 \set stanza = "1." diff --git a/input/regression/stem-direction-context.ly b/input/regression/stem-direction-context.ly index f4eaf78f1e..3d43c3c8cc 100644 --- a/input/regression/stem-direction-context.ly +++ b/input/regression/stem-direction-context.ly @@ -5,12 +5,12 @@ } -\version "2.17.6" -\relative c'' \new Voice \with { +\version "2.19.21" +\relative \new Voice \with { \consists "Melody_engraver" \override Stem.neutral-direction = #'() } { - c4 b c b + c''4 b c b c c c c b a b a } diff --git a/input/regression/stem-direction.ly b/input/regression/stem-direction.ly index 16af1ecc73..3623788e49 100644 --- a/input/regression/stem-direction.ly +++ b/input/regression/stem-direction.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc=" @@ -12,8 +12,8 @@ notes, and up for low notes. \layout { ragged-right = ##t } -\context Voice \relative c { - b''4 ~ b8(b8) e4 e, +\context Voice \relative { + b'4 ~ 8(b8) e4 e, } diff --git a/input/regression/stem-length.ly b/input/regression/stem-length.ly index 39aa092181..d0647d095f 100644 --- a/input/regression/stem-length.ly +++ b/input/regression/stem-length.ly @@ -1,12 +1,12 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Stem length and stem-begin-position can be set manually. " } -\relative c' { +\relative { \autoBeamOff \stemUp a8 aes''8 diff --git a/input/regression/stem-shorten.ly b/input/regression/stem-shorten.ly index 2063b84cdf..8793420631 100644 --- a/input/regression/stem-shorten.ly +++ b/input/regression/stem-shorten.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -14,8 +14,8 @@ } -\relative c'' { - \stemDown d c b a g f e +\relative { + \stemDown d'' c b a g f e \stemNeutral \stemUp a b c d e f g a \stemNeutral diff --git a/input/regression/stem-stemlet.ly b/input/regression/stem-stemlet.ly index 4799eb5c8c..428e5a9af7 100644 --- a/input/regression/stem-stemlet.ly +++ b/input/regression/stem-stemlet.ly @@ -5,11 +5,11 @@ length can be set with @code{stemlet-length}." } -\version "2.17.6" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c' { +\relative { \override Stem.stemlet-length = #0.75 - c8[ r8 c16 r16 c8] + c'8[ r8 c16 r16 c8] c4 } diff --git a/input/regression/stem-tremolo-forced-dir.ly b/input/regression/stem-tremolo-forced-dir.ly index 361f21752c..4f2156b9b3 100644 --- a/input/regression/stem-tremolo-forced-dir.ly +++ b/input/regression/stem-tremolo-forced-dir.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Tremolo works even when a stem is forced in a @@ -8,7 +8,7 @@ particular direction. } \layout { ragged-right = ##t } -\relative c +\relative { \clef bass \stemUp f4 : 32 diff --git a/input/regression/stem-tremolo-note-collision.ly b/input/regression/stem-tremolo-note-collision.ly index 6b5b32a93c..b7b2142849 100644 --- a/input/regression/stem-tremolo-note-collision.ly +++ b/input/regression/stem-tremolo-note-collision.ly @@ -6,8 +6,6 @@ best as possible and issue a warning otherwise. " } -#(ly:expect-warning (_ "ignoring too many clashing note columns")) - { << { b'4 f'2. } @@ -17,4 +15,4 @@ best as possible and issue a warning otherwise. \repeat tremolo 32 32 } >> -} \ No newline at end of file +} diff --git a/input/regression/stem-tremolo-note-column.ly b/input/regression/stem-tremolo-note-column.ly index f62e6ddbd5..90588633bf 100644 --- a/input/regression/stem-tremolo-note-column.ly +++ b/input/regression/stem-tremolo-note-column.ly @@ -1,12 +1,12 @@ -\version "2.17.6" +\version "2.19.21" \header{ texidoc="Stem tremolos count in a note column's horizontal skyline. " } -\relative c'' { +\relative { \autoBeamOff \override NoteHead.stencil = #(ly:make-stencil '() '(0 . 0) '(0 . 0)) - \repeat unfold 8 { b8:32 } + \repeat unfold 8 { b'8:32 } } diff --git a/input/regression/stem-tremolo-position.ly b/input/regression/stem-tremolo-position.ly index 538b5133b9..7881c1318b 100644 --- a/input/regression/stem-tremolo-position.ly +++ b/input/regression/stem-tremolo-position.ly @@ -5,12 +5,12 @@ tilted extra on stem-down notes with a flag." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##T } -\relative c' { - c16:32 e: f: a: c,4:8 c4:32 c8:16 \noBeam c16:32 \noBeam c16:64 | +\relative { + c'16:32 e: f: a: c,4:8 c4:32 c8:16 \noBeam c16:32 \noBeam c16:64 | c''16:32 e: f: a: c,4:8 c4:32 c8:16 \noBeam c16:32 \noBeam c16:64 | } diff --git a/input/regression/stem-tremolo-staff-space.ly b/input/regression/stem-tremolo-staff-space.ly index c89ded2dbd..84db1ff042 100644 --- a/input/regression/stem-tremolo-staff-space.ly +++ b/input/regression/stem-tremolo-staff-space.ly @@ -4,14 +4,14 @@ } -\version "2.17.6" +\version "2.19.21" \layout { ragged-right = ##t } -fragment = \relative c' { - c4:64 c:64 c8:64 c:64 c:64 c:64 c:64 +fragment = \relative { + c'4:64 c:64 c8:64 c:64 c:64 c:64 c:64 } diff --git a/input/regression/stem-tremolo-style.ly b/input/regression/stem-tremolo-style.ly new file mode 100644 index 0000000000..f373d050fa --- /dev/null +++ b/input/regression/stem-tremolo-style.ly @@ -0,0 +1,56 @@ +\version "2.19.8" + +\header { + texidoc = "Controlling the appearance of tremolo slashes. Property + @code{slope} is self-explanatory. Property @code{shape} determines + whether slashes look like rectangles or like very small beams. Setting + these properties directly cause all slashes behave in the specified way. + However, one usually wants the slashes to behave differently depending on + whether the note has flags, beams or only a plain stem. That's what the + @code{style} property is used for: it sets shape and slope depending on + the situation. There are two styles defined: @code{default} and + @code{constant}." +} + +music = { + a''4:32 a': + e''8: \noBeam e': + a'': [ a': ] + f': [ g':] + d': [ d': ] +} + +\markup \wordwrap { default. First three notes should have beam-like slashes. +Slash of the third note should be more sloped than first two notes. +Slashes on beamed notes should be rectangular and parallel to the beams. } +\new Staff { + \music +} + +\markup \wordwrap { style=constant. All slashes should be rectangular. +All slashes should have the same slope except for downstem flagged notes. } +\new Staff { + \override StemTremolo.style = #'constant + \music +} + +\markup \wordwrap { shape=rectangle. All slashes should be rectangular. +Slope like in default. } +\new Staff { + \override StemTremolo.shape = #'rectangle + \music +} + +\markup \wordwrap { shape=beam-like. All slashes should be beam-like. +Slope like in default. } +\new Staff { + \override StemTremolo.shape = #'beam-like + \music +} + +\markup \wordwrap { slope=-0.2 All slashes should have the same downward slope. + Shape like in default. } +\new Staff { + \override StemTremolo.slope = #-0.2 + \music +} diff --git a/input/regression/stencil-hacking.ly b/input/regression/stencil-hacking.ly index 41192b986a..40d450fcd6 100644 --- a/input/regression/stencil-hacking.ly +++ b/input/regression/stencil-hacking.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc=" You can write stencil callbacks in Scheme, thus providing custom glyphs for notation elements. A simple example is @@ -46,8 +46,8 @@ GROB. It does not affect the dimensions of the stencil. \layout { ragged-right = ##t } -\relative c' { - c4 e +\relative { + c'4 e \override NoteHead.stencil = diff --git a/input/regression/string-number-styles.ly b/input/regression/string-number-styles.ly new file mode 100644 index 0000000000..11a7c07cd9 --- /dev/null +++ b/input/regression/string-number-styles.ly @@ -0,0 +1,20 @@ +\header { + texidoc = "Different styles may be used for +string number indications. Predefined options +are arabic (used by default) and roman numerals." +} + +\version "2.19.21" +\paper { + ragged-right = ##t +} + +\relative { + c''2\2 + \romanStringNumbers + a\3 + \override StringNumber.number-type = #'roman-lower + a\3 + \arabicStringNumbers + g\4 +} diff --git a/input/regression/string-number.ly b/input/regression/string-number.ly index 76243ba684..f856faf8d2 100644 --- a/input/regression/string-number.ly +++ b/input/regression/string-number.ly @@ -4,13 +4,13 @@ positioning mechanism as finger instructions." } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c' { - +\relative { + c4 \set fingeringOrientations = #'(down left up) \set stringNumberOrientations = #'(down right up) diff --git a/input/regression/system-separator.ly b/input/regression/system-separator.ly index 52b4f398ba..9b6e7456ad 100644 --- a/input/regression/system-separator.ly +++ b/input/regression/system-separator.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "System separators may be defined as markups in the @@ -10,8 +10,8 @@ centered between the boundary staves of each system." system-separator-markup = \slashSeparator } -foobar = \relative c' { - c1 c \break +foobar = \relative { + c'1 c \break c1 c \break c1 c } diff --git a/input/regression/system-start-heavy-bar.ly b/input/regression/system-start-heavy-bar.ly index d79dcd3b0f..bae87d062e 100644 --- a/input/regression/system-start-heavy-bar.ly +++ b/input/regression/system-start-heavy-bar.ly @@ -1,18 +1,18 @@ \header { texidoc = "A heavy-bar system start delimiter may be created by tuning the @code{SystemStartBar} grob." } -\version "2.17.15" +\version "2.19.21" \paper { ragged-right = ##t } << \new StaffGroup - \relative c' << + \relative << \set StaffGroup.systemStartDelimiter = #'SystemStartBar \override StaffGroup.SystemStartBar.thickness = #8 \override StaffGroup.SystemStartBar.padding = #0.2 - \new Staff { c1 } + \new Staff { c'1 } \new Staff { c1 } >> \new Staff { c1 } diff --git a/input/regression/system-start-nesting.ly b/input/regression/system-start-nesting.ly index 41a4a72a2a..b8bbfd62a5 100644 --- a/input/regression/system-start-nesting.ly +++ b/input/regression/system-start-nesting.ly @@ -2,17 +2,17 @@ created with the @code{systemStartDelimiterHierarchy} property." } -\version "2.17.15" +\version "2.19.21" \paper { ragged-right = ##t } \new StaffGroup -\relative c' << +\relative << \set StaffGroup.systemStartDelimiterHierarchy - = #'(SystemStartSquare (SystemStartBracket a (SystemStartSquare b)) d) - \new Staff { c1 } + = #'(SystemStartSquare (SystemStartBracket a (SystemStartSquare b c)) d) + \new Staff { c'1 } \new Staff { c1 } \new Staff { c1 } \new Staff { c1 } diff --git a/input/regression/tablature-additional-bass-strings.ly b/input/regression/tablature-additional-bass-strings.ly new file mode 100644 index 0000000000..a094f9af41 --- /dev/null +++ b/input/regression/tablature-additional-bass-strings.ly @@ -0,0 +1,38 @@ +\version "2.19.37" + +\header +{ + texidoc = "Additional bass strings (for baroque lute, etc.) are supported in + TabStaff. They are printed below lowest line as: a, /a, //a, ///a, 4, 5 etc. + @code{additionalBassStrings} needs to be set accordingly." +} + +m = { e' b g d a, e, d, c, b,,\9 a,, g,, } +mus = { \m \bar "||" \transpose c cis \m \bar "|." } + +\score { + << + \new Staff { \clef bass \cadenzaOn \mus } + %% FretBoards with `additionalBassStrings' return weird output + %% A warning is thrown if uncommented + %\new FretBoards \mus + \new TabStaff { \mus } + >> + \layout { + \context { + \Score + tablatureFormat = #fret-letter-tablature-format + } + \context { + \FretBoards + stringTunings = \stringTuning + additionalBassStrings = \stringTuning + } + \context { + \TabStaff + stringTunings = \stringTuning + additionalBassStrings = \stringTuning + fretLabels = #'("a" "b" "r" "d" "e" "f" "g" "h" "i" "k") + } + } +} diff --git a/input/regression/tablature-chord-repetition-finger.ly b/input/regression/tablature-chord-repetition-finger.ly index 27b68dbaca..9bc3663731 100644 --- a/input/regression/tablature-chord-repetition-finger.ly +++ b/input/regression/tablature-chord-repetition-finger.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "In a TabStaff, the chord repetition function needs @@ -7,8 +7,8 @@ to retain string and fingering information. Using on the main staff." } -Guitar = \relative c' { - r8 < gis-6 cis-6 b-0 > ~ q4 q8 ~ q q4 +Guitar = \relative { + r8 < gis-6 cis-6 b-0 > ~ q4 q8 ~ 8 q4 } \score { diff --git a/input/regression/tablature-chord-repetition.ly b/input/regression/tablature-chord-repetition.ly index 7fd2a30eef..c46d6ea815 100644 --- a/input/regression/tablature-chord-repetition.ly +++ b/input/regression/tablature-chord-repetition.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.21" \header { texidoc = "In a TabStaff, the chord repetition function needs @@ -10,8 +10,8 @@ music in the tabstaff, not affecting other contexts." \tabChordRepetition -Guitar = \relative c' { - r8 < gis\4 cis\3 b\2 > ~ q4 q8 ~ q q4 +Guitar = \relative { + r8 < gis\4 cis\3 b\2 > ~ q4 q8 ~ 8 q4 } \score { diff --git a/input/regression/tablature-default-strings.ly b/input/regression/tablature-default-strings.ly index 605b1af353..c8b4815979 100644 --- a/input/regression/tablature-default-strings.ly +++ b/input/regression/tablature-default-strings.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " @@ -7,7 +7,7 @@ for fret calculations if no strings are defined explicitly. " } -mymusic = \relative c { +mymusic = \relative { 4 \set defaultStrings = #'(5 3) 4 diff --git a/input/regression/tablature-dot-placement.ly b/input/regression/tablature-dot-placement.ly index a7d3afc09f..b86c0573a7 100644 --- a/input/regression/tablature-dot-placement.ly +++ b/input/regression/tablature-dot-placement.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -9,8 +9,8 @@ respect two-digit fret numbers. } -myMusic = \relative c' { - 4. +myMusic = \relative { + 4. 4. 4 } diff --git a/input/regression/tablature-full-notation.ly b/input/regression/tablature-full-notation.ly index 55f6547911..065463be37 100644 --- a/input/regression/tablature-full-notation.ly +++ b/input/regression/tablature-full-notation.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.20" \header{ texidoc = "As default, tablature staves show only the fret numbers, because in most situations, they are combined with normal staves. @@ -8,23 +8,24 @@ tabstuff = { \time 3/4 - \compressFullBarRests - c4^"test" d( e) | - f4\f g a^\fermata | - R2.*3 | - c8\<\( c16 c ~ c2\! | - \mark \default - c'2.\) | - \ottava #1 - r4 d'4 r8 e | - \ottava #0 - \tuplet 4/3 { b,4 c \glissando d\5 \glissando c } | - c4. d-_( | - e\varcoda-> ) - \override TextSpanner.bound-details.left.text = "rit." f\startTextSpan | - g ~ g\prall | - g\thumb e-.\stopTextSpan - \bar "|." + \compressMMRests { + c4^"test" d( e) | + f4\f g a^\fermata | + R2.*3 | + c8\<\( c16 c ~ 2\! | + \mark \default + c'2.\) | + \ottava #1 + r4 d'4 r8 e | + \ottava #0 + \tuplet 4/3 { b,4 c \glissando d\5 \glissando c } | + c4. d-_( | + e\varcoda-> ) + \override TextSpanner.bound-details.left.text = "rit." f\startTextSpan | + g ~ g\prall | + g\thumb e-.\stopTextSpan + \bar "|." + } } #(set-global-staff-size 18) diff --git a/input/regression/tablature-glissando.ly b/input/regression/tablature-glissando.ly index 1d96ac09f7..07905c0c49 100644 --- a/input/regression/tablature-glissando.ly +++ b/input/regression/tablature-glissando.ly @@ -1,11 +1,11 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc = "Glissando lines in tablature have the right slope." } \paper { ragged-right = ##f } % strech the staff to make glissando lines visible -glissandotest = \relative c { +glissandotest = \relative { c4\5 \glissando d\5 \glissando e\5 f\5 | c4\5 \glissando d\5 \glissando c2\5 | c4\5 \glissando c'\4 c\4 \glissando c,\5 diff --git a/input/regression/tablature-grace-notes.ly b/input/regression/tablature-grace-notes.ly index a09ba83998..2663d7fee3 100644 --- a/input/regression/tablature-grace-notes.ly +++ b/input/regression/tablature-grace-notes.ly @@ -1,9 +1,9 @@ -\version "2.16.0" +\version "2.19.21" \header{ texidoc = "Fret numbers belonging to grace notes are smaller." } -gracenotes = \relative c { +gracenotes = \relative { c4 d e f \grace e8 c4 d e f \grace \parenthesize e8 c4 d e f diff --git a/input/regression/tablature-harmonic-tie.ly b/input/regression/tablature-harmonic-tie.ly index 5160684568..e430fd3b4b 100644 --- a/input/regression/tablature-harmonic-tie.ly +++ b/input/regression/tablature-harmonic-tie.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = " @@ -7,8 +7,8 @@ nor the harmonic brackets for the second note appear in the tablature. " } -music = \relative c' { - s2. 4 ~ | +music = \relative { + s2. 4 ~ | 1 | } diff --git a/input/regression/tablature-harmonic.ly b/input/regression/tablature-harmonic.ly index 139ca26c48..72a32c157e 100644 --- a/input/regression/tablature-harmonic.ly +++ b/input/regression/tablature-harmonic.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Harmonics get angled brackets in tablature. @@ -9,8 +9,8 @@ } \new TabVoice -\relative c' { - 4 +\relative { + 4 4 4 4 diff --git a/input/regression/tablature-letter.ly b/input/regression/tablature-letter.ly index b1e85522a0..9af4d79abb 100644 --- a/input/regression/tablature-letter.ly +++ b/input/regression/tablature-letter.ly @@ -1,4 +1,4 @@ -\version "2.17.27" +\version "2.19.21" \header { texidoc = " @@ -13,9 +13,9 @@ if the length is too short. " } -notes = \relative c' { +notes = \relative { \time 3/4 - 4. 8 4 + 4. 8 4 \set fretLabels = \markuplist {"a" "b" \italic \smaller "c"} 4. 8 4 \set fretLabels = \markuplist {\with-color #red "a" diff --git a/input/regression/tablature-micro-tone.ly b/input/regression/tablature-micro-tone.ly new file mode 100644 index 0000000000..461dd2f824 --- /dev/null +++ b/input/regression/tablature-micro-tone.ly @@ -0,0 +1,43 @@ +\version "2.19.31" + +\header { + texidoc = "The @code{TabStaff} will print micro-tones as mixed numbers of +fret-number and a fraction. +The context-property @code{supportNonIntegerFret} needs to be set @code{#t} +in @code{Score}-context. +@code{FretBoards} will print those micro-tones only if they can be found in the +chosen settings for @code{stringTunings}, otherwise a warning (surpressed here) +will be printed and an empty @code{FretBoard} returned. Which should be the +case here for the first pitch: @code{gih}" +} + +#(ly:set-option 'warning-as-error #f) +#(ly:expect-warning (_ "No string for pitch ~a (given frets ~a)") #{ gih #} '()) + +\layout { + \context { + \Score + supportNonIntegerFret = ##t + } +} + +custom-tuning = \stringTuning + +mus = \relative { + gih4 + eeses' + eeseh + ees + eeh + e + eih + eis + eisih + eisis +} + +<< + \new Staff << \clef "G_8" \mus >> + \new FretBoards \with { stringTunings = \custom-tuning } \mus + \new TabStaff \with { stringTunings = \custom-tuning } \mus +>> diff --git a/input/regression/tablature-negative-fret.ly b/input/regression/tablature-negative-fret.ly index 92a35fc09f..28d08f427d 100644 --- a/input/regression/tablature-negative-fret.ly +++ b/input/regression/tablature-negative-fret.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "Requested string for pitch requires negative fret: string ~a pitch ~a") 1 "#") #(ly:expect-warning (_ "Ignoring string request and recalculating.")) @@ -20,8 +20,8 @@ all three cases demonstrated. } -myMusic = \relative c' { - 1 ^\markup { recalculate } +myMusic = \relative { + 1 ^\markup { recalculate } \set TabStaff.handleNegativeFrets = #'include 1 ^ \markup { include } \set TabStaff.handleNegativeFrets = #'ignore diff --git a/input/regression/tablature-slide.ly b/input/regression/tablature-slide.ly index 54b7c62daf..2352c78288 100644 --- a/input/regression/tablature-slide.ly +++ b/input/regression/tablature-slide.ly @@ -4,13 +4,13 @@ texidoc = "Tab supports slides." } -\version "2.17.15" +\version "2.19.21" \paper { ragged-right = ##T } -\relative c' \new TabVoice +\relative \new TabVoice { - d\2\glissando e\2 + d\2\glissando e\2 } diff --git a/input/regression/tablature-slurs-with-beams.ly b/input/regression/tablature-slurs-with-beams.ly index 1425ed6807..69d68c0fa9 100644 --- a/input/regression/tablature-slurs-with-beams.ly +++ b/input/regression/tablature-slurs-with-beams.ly @@ -1,4 +1,4 @@ -\version "2.17.20" +\version "2.19.0" \header { @@ -10,7 +10,8 @@ either automatic or manual beaming. guitarSolo = { \time 3/4 - \set Timing.beamExceptions = #'((end . (((1 . 8) . (4 2))))) + \set Timing.beamExceptions = + \beamExceptions { 8[ 8 8 8] 8[ 8] } << {bes'2( aes'8-. r)} \\ {r8 cis(-\tag #'beam [ b f'-\tag #'beam ]) -. r} diff --git a/input/regression/tablature-string-tunings.ly b/input/regression/tablature-string-tunings.ly index c38ae9e633..9f50d45a13 100644 --- a/input/regression/tablature-string-tunings.ly +++ b/input/regression/tablature-string-tunings.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -11,7 +11,7 @@ \new TabStaff { \set TabStaff.stringTunings = \stringTuning - \relative c'' { c4 d e f } + \relative { c''4 d e f } } diff --git a/input/regression/tablature-tie-behaviour.ly b/input/regression/tablature-tie-behaviour.ly index a784576ee6..0a67e2b814 100644 --- a/input/regression/tablature-tie-behaviour.ly +++ b/input/regression/tablature-tie-behaviour.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.21" \header{ texidoc = "In tablature, notes that are tied to are invisible except after a line break or within a second volta; @@ -8,19 +8,19 @@ invisible completely, even after line breaks." } -firstpart = \relative c { - f2 ~ f4 e +firstpart = \relative { + f2 ~ 4 e g8 g ~ g g ~ g g~ g g ~ - g1 + 1 } -secondpart = \relative c' { - c1 ~ \break c2 ~ c +secondpart = \relative { + c'1 ~ \break c2 ~ 2 } -thirdpart = \relative c' { +thirdpart = \relative { \repeat volta 2 { - < c\3 e\2 g\1 >4 < c\3 e\2 g\1 > ~ < c\3 e\2 g\1 >\laissezVibrer r + < c'\3 e\2 g\1 >4 < c\3 e\2 g\1 > ~ < c\3 e\2 g\1 >\laissezVibrer r c4. d8 e2 ~ } \alternative { { e2 r } { e2\repeatTie e2^\fermata } } diff --git a/input/regression/tablature-tie-spanner.ly b/input/regression/tablature-tie-spanner.ly index fd3346d7b8..d8f7b47b36 100644 --- a/input/regression/tablature-tie-spanner.ly +++ b/input/regression/tablature-tie-spanner.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.2" \header { texidoc = " @@ -8,9 +8,9 @@ corresponding fret number is displayed in parentheses. } music = { - c'4 ~ c'4 ( d'2 ) | - c'4 ~ c'4 \glissando d'2 | - c'4 ~ c'4 d'2 | + c'4 ~ 4 ( d'2 ) | + c'4 ~ 4 \glissando d'2 | + c'4 ~ 4 d'2 | c'4 \glissando d'2. | } diff --git a/input/regression/tablature-zero-finger.ly b/input/regression/tablature-zero-finger.ly index f201799d8a..a22a58e51e 100644 --- a/input/regression/tablature-zero-finger.ly +++ b/input/regression/tablature-zero-finger.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "No open string for pitch ~a") "#") @@ -10,7 +10,7 @@ a warning message and set the requested pitch in the tablature. " } -mymusic = \relative c { +mymusic = \relative { \set minimumFret = #1 1 diff --git a/input/regression/tag-filter.ly b/input/regression/tag-filter.ly index f5131fe0af..0c4be0b3e6 100644 --- a/input/regression/tag-filter.ly +++ b/input/regression/tag-filter.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "The @code{\\tag} command marks music expressions with a @@ -14,9 +14,9 @@ notes and fingerings, but the score has not." \layout { ragged-right= ##t } common = -\relative c'' { +\relative { - c1 + c''1 \relative c' << \tag #'part << R1 \\ diff --git a/input/regression/tag-group.ly b/input/regression/tag-group.ly new file mode 100644 index 0000000000..d12e5f6575 --- /dev/null +++ b/input/regression/tag-group.ly @@ -0,0 +1,78 @@ +\version "2.19.22" + +\header { + texidoc = "The operation of @code{\\keepWithTag} can be made more +flexible by using @code{\\tagGroup}." +} + +\layout { ragged-right= ##t } + +music = +<< + \tag vI.vII + \new Staff \with { instrumentName = "vI vII" } + << + \tag vI \new Voice \with { \voiceOne } + { g''-\tag slurs ( a'' g'' a''-\tag slurs ) } + \tag vII \new Voice \with { \voiceTwo } + { c''-\tag slurs ( d'' c'' d''-\tag slurs ) } + >> + \tag bI.bII + \new Staff \with { instrumentName = "bI bII" \clef "bass" } + << + \tag bI \new Voice \with { \voiceOne } + { g-\tag slurs ( a g a-\tag slurs ) } + \tag bII \new Voice \with { \voiceTwo } + { c-\tag slurs ( d c d-\tag slurs ) } + >> +>> + +demo = +#(define-music-function (syms m) + (symbol-list? ly:music?) + #{ + \new Score << + \keepWithTag #syms #m + \context Staff \mark #(string-join (map symbol->string syms) "&") + >> + #}) + +#(set-global-staff-size 16) + +demoline = +#(define-scheme-function (m1 m2) (ly:music? ly:music?) + #{ + \markup \column { \fill-line { \null \score { #m1 } \score { #m2 } \null } + \vspace #1 } + #}) + + +\markuplist { + \fill-line { \center-column \fontsize #5 \bold { "\\keepWithTag" } } + \vspace #1 +} + +\demoline +\demo #'(vI vII bI bII slurs) \music +\demo #'(slurs vI) \music +\demoline +\demo #'(vI bI bII) \music +\demo #'(vI bI bII none) \music + +\markup \vspace #2 + +\markuplist { + \fill-line { \center-align \fontsize #5 \bold \left-column + { "\\tagGroup vI.vII" "\\tagGroup bI.bII" } } + \vspace #1 +} + +\tagGroup vI.vII +\tagGroup bI.bII + +\demoline +\demo #'(vI vII bI bII slurs) \music +\demo #'(slurs vI) \music +\demoline +\demo #'(vI bI bII) \music +\demo #'(vI bI bII none) \music diff --git a/input/regression/tag-multiple.ly b/input/regression/tag-multiple.ly index d9d62a0e0d..157c0aff38 100644 --- a/input/regression/tag-multiple.ly +++ b/input/regression/tag-multiple.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.22" \header { texidoc = "The @code{\\removeWithTag} and @code{\\keepWithTag} @@ -12,11 +12,11 @@ music = << \tag #'flood \new Voice { \voiceOne \repeat unfold 16 { c'''8 cis'''8 } } \tag #'highball \new Voice { \voiceThree \repeat unfold 8 { a'4( as') } } - \tag #'buffoon \new Voice { \voiceFour \repeat unfold 2 { f1~ f } } + \tag #'buffoon \new Voice { \voiceFour \repeat unfold 2 { f1~ 1 } } >> demo = -#(define-music-function (parser location fun syms m) +#(define-music-function (fun syms m) (ly:music-function? symbol-list? ly:music?) #{ \new Staff diff --git a/input/regression/test-output-distance.ly b/input/regression/test-output-distance.ly index ef10b57f9c..2a5aa6031e 100644 --- a/input/regression/test-output-distance.ly +++ b/input/regression/test-output-distance.ly @@ -5,7 +5,7 @@ it should always show up in the output-distance testing. " } -\version "2.16.0" +\version "2.19.21" #(define time (gettimeofday)) @@ -18,7 +18,7 @@ it should always show up in the output-distance testing. " ragged-right = ##f } -\new PianoStaff << \new Staff \relative c' { c4 d f8_\f[ g-.] r4 } +\new PianoStaff << \new Staff \relative { c'4 d f8_\f[ g-.] r4 } \new Staff { \clef "bass" R1 } >> diff --git a/input/regression/text-spanner-attachment-alignment.ly b/input/regression/text-spanner-attachment-alignment.ly index 098ef131db..02f97ff829 100644 --- a/input/regression/text-spanner-attachment-alignment.ly +++ b/input/regression/text-spanner-attachment-alignment.ly @@ -1,23 +1,21 @@ \header { - texidoc = "Text and trill spanners are attached to note columns, so attachments in other staves have no effect on them." - - } +} \layout { ragged-right = ##t - } +} \version "2.17.6" << - \new Staff { + \new Staff { \override TextSpanner.bound-details.left.text = "*" - c'16 \startTrillSpan c' c' c' \stopTrillSpan - c'16 \startTextSpan c' c' c' \stopTextSpan - } - \new Staff { - \override TextScript.self-alignment-X = #RIGHT - \repeat unfold 2 {c'4 _ \markup { "FAT" } } - } + c'16 \startTrillSpan c' c' c' \stopTrillSpan + c'16 \startTextSpan c' c' c' \stopTextSpan + } + \new Staff { + \override TextScript.self-alignment-X = #RIGHT + \repeat unfold 2 {c'4 _ \markup { "LONG" } } + } >> diff --git a/input/regression/text-spanner-full-rest.ly b/input/regression/text-spanner-full-rest.ly index 92e44cc121..b54af7d58c 100644 --- a/input/regression/text-spanner-full-rest.ly +++ b/input/regression/text-spanner-full-rest.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Text spanners ending on, or broken across, full-measure @@ -7,7 +7,7 @@ rests extend to the rests, or over the rests, as appropriate." \layout { ragged-right = ##t } -\relative c'' { - a1\startTextSpan b1 R1 \break +\relative { + a'1\startTextSpan b1 R1 \break \tempo "tempo" R1 a1 b1 R1\stopTextSpan } diff --git a/input/regression/text-spanner-override-order.ly b/input/regression/text-spanner-override-order.ly index cf1d6f1904..e68f7ddc30 100644 --- a/input/regression/text-spanner-override-order.ly +++ b/input/regression/text-spanner-override-order.ly @@ -5,10 +5,10 @@ } -\version "2.17.6" +\version "2.19.21" -sample = \relative c'' { - c2\startTextSpan c2 \break +sample = \relative { + c''2\startTextSpan c2 \break c2 c2 \stopTextSpan } diff --git a/input/regression/text-spanner.ly b/input/regression/text-spanner.ly index ae56d940df..5c2d481703 100644 --- a/input/regression/text-spanner.ly +++ b/input/regression/text-spanner.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc= "Text spanners should not repeat start text when broken." } @@ -7,10 +7,10 @@ ragged-right = ##t } -\relative c'' { +\relative { \set crescendoText = #"cresc." \set crescendoSpanner = #'text - c1\< c \break + c''1\< c \break c1 c\! \break } diff --git a/input/regression/tie-accidental.ly b/input/regression/tie-accidental.ly index aea5616fce..d7060cb69c 100644 --- a/input/regression/tie-accidental.ly +++ b/input/regression/tie-accidental.ly @@ -4,16 +4,16 @@ " } -\version "2.17.6" +\version "2.19.21" \paper { debug-tie-scoring = ##t ragged-right = ##t } -\relative c'' { +\relative { \override Tie.layer = #2 - a ~ + a' ~ } % EOF diff --git a/input/regression/tie-arpeggio-collision.ly b/input/regression/tie-arpeggio-collision.ly index 7f433605de..3ac83f4327 100644 --- a/input/regression/tie-arpeggio-collision.ly +++ b/input/regression/tie-arpeggio-collision.ly @@ -8,12 +8,12 @@ unarpegiated case." } -\version "2.16.0" +\version "2.19.21" \layout { ragged-right = ##t } -\new Staff \relative c'' { - 2~ | +\new Staff \relative { + 2~ | \set tieWaitForNote = ##t e8~ c~ a~ f~ 2 | f,8~ a~ c~ e~ 2 | diff --git a/input/regression/tie-arpeggio.ly b/input/regression/tie-arpeggio.ly index f37269d544..eabcaa78cb 100644 --- a/input/regression/tie-arpeggio.ly +++ b/input/regression/tie-arpeggio.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "unterminated tie")) #(ly:expect-warning (_ "unterminated tie")) @@ -14,8 +14,8 @@ } \paper { ragged-right = ##t } -\relative c' { - c~ e~ g~ +\relative { + c'~ e~ g~ \set tieWaitForNote = ##t c~ e~ g~ diff --git a/input/regression/tie-broken-minimum-length.ly b/input/regression/tie-broken-minimum-length.ly index fab5dc33e8..13dc222e10 100644 --- a/input/regression/tie-broken-minimum-length.ly +++ b/input/regression/tie-broken-minimum-length.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { @@ -13,8 +13,8 @@ has a @code{minimum-length} of 5." line-width = 40.0\mm } -\relative c' { +\relative { \override Tie.minimum-length = #5 - f2. f16 f f f ~ | \break + f'2. f16 f f f ~ | \break f1 } diff --git a/input/regression/tie-broken.ly b/input/regression/tie-broken.ly index b444e23650..970ce05e98 100644 --- a/input/regression/tie-broken.ly +++ b/input/regression/tie-broken.ly @@ -3,11 +3,11 @@ texidoc = "Ties behave properly at line breaks." } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c' +\relative { r2... 16 ~ \break diff --git a/input/regression/tie-chord-broken-extremal.ly b/input/regression/tie-chord-broken-extremal.ly index 64844ae5a4..78fc013e49 100644 --- a/input/regression/tie-chord-broken-extremal.ly +++ b/input/regression/tie-chord-broken-extremal.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = " @@ -8,8 +8,8 @@ are tried for the extremal ties in a chord. " } -\relative c'' { - \time 4/4 1 ~ \break +\relative { + \time 4/4 1 ~ \break \override Tie.details.multi-tie-region-size = #1 \time 3/4 2.~ \break diff --git a/input/regression/tie-chord-debug.ly b/input/regression/tie-chord-debug.ly index db69ea9485..097fb7fe45 100644 --- a/input/regression/tie-chord-debug.ly +++ b/input/regression/tie-chord-debug.ly @@ -5,7 +5,7 @@ decisions made." } -\version "2.16.0" +\version "2.19.21" \paper { @@ -13,7 +13,7 @@ decisions made." debug-tie-scoring = ##t } -\relative g' { - ~ +\relative { + ~ } diff --git a/input/regression/tie-chord-partial.ly b/input/regression/tie-chord-partial.ly index e131b25479..5db1f7386d 100644 --- a/input/regression/tie-chord-partial.ly +++ b/input/regression/tie-chord-partial.ly @@ -2,14 +2,14 @@ { texidoc = "Individual chord notes can also be tied" } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c' { - +\relative { + } diff --git a/input/regression/tie-chord.ly b/input/regression/tie-chord.ly index af3ec740a9..f867e54613 100644 --- a/input/regression/tie-chord.ly +++ b/input/regression/tie-chord.ly @@ -11,7 +11,7 @@ each system." } -\version "2.16.0" +\version "2.19.22" \paper { indent = #0.0 @@ -21,7 +21,7 @@ each system." generateTiePattern -= #(define-music-function (parser location is-long chords) (boolean? ly:music?) += #(define-music-function (is-long chords) (boolean? ly:music?) " @@ -61,8 +61,8 @@ translate x y z to x~x y~y z~z baseChords = \applyMusic #(lambda (mus) (ly:music-property mus 'element)) -\relative c'' { - +\relative { + diff --git a/input/regression/tie-dash.ly b/input/regression/tie-dash.ly index 147d78a160..b6de95cc5b 100644 --- a/input/regression/tie-dash.ly +++ b/input/regression/tie-dash.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.2" \header {texidoc = "@cindex Tie, dotted, dashed The appearance of ties may be changed from solid to dotted or dashed. " @@ -7,23 +7,23 @@ The appearance of ties may be changed from solid to dotted or dashed. \relative c'{ - c2 ~ c | + c2 ~ 2 | \tieDotted - c2 ~ c | + c2 ~ 2 | \tieDashed - c2 ~ c | + c2 ~ 2 | \tieHalfDashed - c2 ~ c | + c2 ~ 2 | \tieHalfSolid - c2 ~ c | + c2 ~ 2 | \tieDashPattern #0.4 #2.0 - c2 ~ c | + c2 ~ 2 | \once \override Tie.dash-definition = #'((0 0.25 1 1) (0.3 0.7 0.4 0.75) (0.75 1.0 1.0 1.0)) - c2 ~ c | + c2 ~ 2 | \tieSolid - c2 ~ c | + c2 ~ 2 | } diff --git a/input/regression/tie-direction-broken.ly b/input/regression/tie-direction-broken.ly index d1260ecc1e..c29db4b584 100644 --- a/input/regression/tie-direction-broken.ly +++ b/input/regression/tie-direction-broken.ly @@ -1,5 +1,5 @@ -\version "2.16.0" +\version "2.19.21" \header { @@ -13,8 +13,8 @@ ragged-right = ##t } -\relative c'' { - bes1~ \break +\relative { + bes'1~ \break bes2. \stemUp bes4 ~ \break bes1 diff --git a/input/regression/tie-direction-manual.ly b/input/regression/tie-direction-manual.ly index ba29a6ead5..7cc75acf4b 100644 --- a/input/regression/tie-direction-manual.ly +++ b/input/regression/tie-direction-manual.ly @@ -4,13 +4,13 @@ This makes correction in complex chords easier." } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right= ##t } -\relative c' { - ( ) +\relative { + ( ) } diff --git a/input/regression/tie-dot.ly b/input/regression/tie-dot.ly index f595dc582e..14a9117c14 100644 --- a/input/regression/tie-dot.ly +++ b/input/regression/tie-dot.ly @@ -3,14 +3,14 @@ texidoc = "Ties avoid collisions with dots." } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##T } -\relative c'' { +\relative { \time 12/8 - d4*3/2~ d8[ e] r8 - d4.~ d8 e f + d''4*3/2~ d8[ e] r8 + d4.~ 8 e f } diff --git a/input/regression/tie-enharmonic.ly b/input/regression/tie-enharmonic.ly new file mode 100644 index 0000000000..3d4d972463 --- /dev/null +++ b/input/regression/tie-enharmonic.ly @@ -0,0 +1,18 @@ +\version "2.19.16" + +\header { texidoc = " +LilyPond should accept a tie between notes which are +enharmonically identical. +" } + +\score +{ + { + \time 3/4 + \repeat unfold 3 { + cis'4~ des' + } + } + \layout { ragged-right = ##t } + %\midi {} +} diff --git a/input/regression/tie-grace.ly b/input/regression/tie-grace.ly index 3aa59a21e1..21689ab9ea 100644 --- a/input/regression/tie-grace.ly +++ b/input/regression/tie-grace.ly @@ -1,13 +1,13 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Tying a grace to a following grace or main note works." } \layout { ragged-right= ##t } -\context Voice \relative c'' { - c4 \grace { c8 ~ c16 ~ } c4 +\context Voice \relative { + c''4 \grace { c8 ~ 16 ~ } c4 } diff --git a/input/regression/tie-manual-vertical-tune.ly b/input/regression/tie-manual-vertical-tune.ly index b882d21e0f..8c4862aedc 100644 --- a/input/regression/tie-manual-vertical-tune.ly +++ b/input/regression/tie-manual-vertical-tune.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "If using integers, the tie will vertically tuned for @@ -6,9 +6,9 @@ staff line avoidance. If using a floating point number, this is taken as the exact location." } -\relative c'' { +\relative { \override Tie.staff-position = #3 - d4 ~ + d''4 ~ \override Tie.staff-position = #3.0 d ~ d diff --git a/input/regression/tie-manual.ly b/input/regression/tie-manual.ly index b9a535b8fe..d04d4cf430 100644 --- a/input/regression/tie-manual.ly +++ b/input/regression/tie-manual.ly @@ -11,16 +11,16 @@ You can leave a Tie alone by introducing a non-pair value } -\version "2.17.6" +\version "2.19.21" \layout { ragged-right = ##t } -\relative c'' { +\relative { - ~ + ~ \once \override TieColumn.tie-configuration = diff --git a/input/regression/tie-single-chord.ly b/input/regression/tie-single-chord.ly index 7997e39ec4..4bc7507a8b 100644 --- a/input/regression/tie-single-chord.ly +++ b/input/regression/tie-single-chord.ly @@ -5,13 +5,13 @@ } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c' { - ~ +\relative { + ~ } diff --git a/input/regression/tie-single-manual.ly b/input/regression/tie-single-manual.ly index 23df905a94..e937c7c846 100644 --- a/input/regression/tie-single-manual.ly +++ b/input/regression/tie-single-manual.ly @@ -5,7 +5,7 @@ specifying their @code{direction} and/@/or @code{staff-position}." } -\version "2.17.6" +\version "2.19.2" \paper { ragged-right = ##t @@ -13,12 +13,12 @@ specifying their @code{direction} and/@/or @code{staff-position}." { \override Tie.staff-position = #-5.5 - c'4 ~ c' + c'4 ~ 4 \override Tie.staff-position = #-6.5 - c'4 ~ c' + c'4 ~ 4 \override Tie.staff-position = #-7.5 - c'4 ~ c' + c'4 ~ 4 \revert Tie.staff-position \override Tie.direction = #UP - c'4 ~ c' + c'4 ~ 4 } diff --git a/input/regression/tie-single.ly b/input/regression/tie-single.ly index 7dcea62066..2526c98231 100644 --- a/input/regression/tie-single.ly +++ b/input/regression/tie-single.ly @@ -22,12 +22,12 @@ that otherwise don't fit in a space ragged-right = ##t } -\version "2.16.0" +\version "2.19.21" frag = -\relative c'' { - c16 c2...~ c16 ~ c2... | - c4~c8 c8~c16 c16~c32 c16.~[ c64]~ c64[ c8..] | +\relative { + c''16 c2...~ 16 ~ 2... | + c4~8 c8~16 c16~32 c16.~[ c64]~ 64[ c8..] | } diff --git a/input/regression/tie-unterminated.ly b/input/regression/tie-unterminated.ly index 8e66e8a2a4..1f5dd010af 100644 --- a/input/regression/tie-unterminated.ly +++ b/input/regression/tie-unterminated.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "unterminated tie")) @@ -7,8 +7,8 @@ be created, lilypond prints out a warning unless @code{tieWaitForNote} is set." } -\relative c' { - c1~ c | +\relative { + c'1~ 1 | c1~ | c1~ d | 1~ c | diff --git a/input/regression/tie-whole.ly b/input/regression/tie-whole.ly index 5b62f19c22..85a3245518 100644 --- a/input/regression/tie-whole.ly +++ b/input/regression/tie-whole.ly @@ -5,12 +5,12 @@ } -\version "2.17.15" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c' +\relative { - 1~ + 1~ 1~ 1~ } diff --git a/input/regression/time-signature-mensural.ly b/input/regression/time-signature-mensural.ly new file mode 100644 index 0000000000..d6d18c3780 --- /dev/null +++ b/input/regression/time-signature-mensural.ly @@ -0,0 +1,35 @@ +\version "2.19.21" + +\header { + texidoc = "This test covers the mensural and neomensural time signature styles." +} + +% N.B. It's strange that these warnings are doubled. +#(ly:expect-warning "Cannot find glyph timesig.mensural11") +#(ly:expect-warning "Cannot find glyph timesig.mensural11") +#(ly:expect-warning "Cannot find glyph timesig.neomensural11") +#(ly:expect-warning "Cannot find glyph timesig.neomensural11") + +\layout { indent = 0 } + +testMusic = \relative { + \time 4/4 \partial 4 f'4 + \time 2/2 \partial 4 f4 + \time 6/4 \partial 4 f4 + \time 6/8 \partial 4 f4 + \time 3/2 \partial 4 f4 + \time 3/4 \partial 4 f4 + \time 9/4 \partial 4 f4 + \time 9/8 \partial 4 f4 + \time 4/8 \partial 4 f4 + \time 2/4 \partial 4 f4 + \time 1/1 \partial 4 f4 +} + +\new Staff { + \override Staff.TimeSignature.break-visibility = ##(#f #t #t) + \override Staff.TimeSignature.style = #'mensural + \testMusic \break + \override Staff.TimeSignature.style = #'neomensural + \testMusic \break +} diff --git a/input/regression/time-signature-midmeasure-warning.ly b/input/regression/time-signature-midmeasure-warning.ly new file mode 100644 index 0000000000..348140952a --- /dev/null +++ b/input/regression/time-signature-midmeasure-warning.ly @@ -0,0 +1,15 @@ +\version "2.19.16" + +\header { + texidoc = "Mid-measure time signature changes not accompanied by +\\partial generate warnings." +} + +#(ly:expect-warning "mid-measure time signature without \\partial") + +\score { + \relative { + \partial 8 \time 4/4 + a'8 | d4 \time 3/4 cis b + } +} diff --git a/input/regression/time-signature-midmeasure.ly b/input/regression/time-signature-midmeasure.ly new file mode 100644 index 0000000000..ed3d34f2ad --- /dev/null +++ b/input/regression/time-signature-midmeasure.ly @@ -0,0 +1,47 @@ +\version "2.19.16" + +\header { + texidoc = "Mid-measure time signature changes must be accompanied by +\\partial. + +In this example, no bar numbers should be omitted or repeated, and all +double bar lines should have parenthesized bar numbers consistent with +the single bar lines. Both scores should look identical. + +@itemize @bullet +@item \\time 2/4 occurs at a negative position +@item \\time 6/8 occurs at a position less than the new measure length +@item \\time 3/8 occurs at a position equal to the new measure length +@item \\time 3/16 occurs at a position greater than the new measure length +@end itemize" +} + +\score { + \relative { + \set Score.barNumberVisibility = #all-bar-numbers-visible + \override Score.BarNumber.break-visibility = #all-visible + \time 2/4 \partial 8 + a'8 | d4 + \bar "||" \time 6/8 \partial 4. + cis8 b a | \barNumberCheck 2 g2. | \barNumberCheck 3 g4. + \bar "||" \time 3/8 \partial 4. + f4. | \barNumberCheck 4 f4. | \barNumberCheck 5 f4 + \bar "||" \time 3/16 \partial 8 + fis8 | \barNumberCheck 6 g16 a g | \barNumberCheck 7 + } +} + +\score { + \relative { + \set Score.barNumberVisibility = #all-bar-numbers-visible + \override Score.BarNumber.break-visibility = #all-visible + \partial 8 \time 2/4 + a'8 | d4 + \bar "||" \partial 4. \time 6/8 + cis8 b a | \barNumberCheck 2 g2. | \barNumberCheck 3 g4. + \bar "||" \partial 4. \time 3/8 + f4. | \barNumberCheck 4 f4. | \barNumberCheck 5 f4 + \bar "||" \partial 8 \time 3/16 + fis8 | \barNumberCheck 6 g16 a g | \barNumberCheck 7 + } +} diff --git a/input/regression/time-signature-numbered.ly b/input/regression/time-signature-numbered.ly new file mode 100644 index 0000000000..8c60215db5 --- /dev/null +++ b/input/regression/time-signature-numbered.ly @@ -0,0 +1,17 @@ +\version "2.19.21" + +\header { + texidoc = "The numbered time signature style prints a fraction." +} + +\new Staff { + \relative { + \override Staff.TimeSignature.style = #'numbered + \time 4/4 d'1 + \time 3/4 d2. + \time 2/2 d1 + \time 16/128 d8 + #(ly:expect-warning "strange time signature found: 10/6") + \time 10/6 \tuplet 6/4 { d2. d2 d2. d2 } + } +} diff --git a/input/regression/time-signature-settings-by-staff.ly b/input/regression/time-signature-settings-by-staff.ly index ad6dec591f..7daa85333c 100644 --- a/input/regression/time-signature-settings-by-staff.ly +++ b/input/regression/time-signature-settings-by-staff.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.40" \header { texidoc = " @@ -15,7 +15,7 @@ should be beamed 3/4, 1/4. The lower staff should be beamed 1/4, 3/4. \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(3 1) % beatStructure + 3,1 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 {c''8} @@ -24,7 +24,7 @@ should be beamed 3/4, 1/4. The lower staff should be beamed 1/4, 3/4. \overrideTimeSignatureSettings 4/4 % timeSignatureFraction 1/4 % baseMomentFraction - #'(1 3) % beatStructure + 1,3 % beatStructure #'() % beamExceptions \time 4/4 \repeat unfold 8 {c''8} diff --git a/input/regression/time-signature-single-digit.ly b/input/regression/time-signature-single-digit.ly new file mode 100644 index 0000000000..e5b816a457 --- /dev/null +++ b/input/regression/time-signature-single-digit.ly @@ -0,0 +1,15 @@ +\version "2.19.21" + +\header { + texidoc = "The single-digit time signature style prints the numerator only." +} + +\new Staff { + \relative { + \override Staff.TimeSignature.style = #'single-digit + \time 1/2 d'2 + \time 2/4 d4 d + \time 3/4 d2. + \time 16/4 d\longa + } +} diff --git a/input/regression/trill-spanner-auto-stop.ly b/input/regression/trill-spanner-auto-stop.ly index 22bee2755c..1a8c79edec 100644 --- a/input/regression/trill-spanner-auto-stop.ly +++ b/input/regression/trill-spanner-auto-stop.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Consecutive trill spans work without explicit @code{\\stopTrillSpan} commands, since successive trill spanners @@ -8,8 +8,8 @@ will automatically become the right bound of the previous trill. \paper { ragged-right = ##f } -\relative c'' { - c1\startTrillSpan +\relative { + c''1\startTrillSpan c1\startTrillSpan c2\stopTrillSpan r } diff --git a/input/regression/trill-spanner-chained.ly b/input/regression/trill-spanner-chained.ly index 502e32bd39..bf51f1a357 100644 --- a/input/regression/trill-spanner-chained.ly +++ b/input/regression/trill-spanner-chained.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "Chained trills end at the next trill or barline. Collisions can be prevented by overriding @code{bound-details}. @@ -7,8 +7,8 @@ Collisions can be prevented by overriding @code{bound-details}. \paper { ragged-right = ##f } -\relative c'' { - g8 f\startTrillSpan ~ +\relative { + g'8 f\startTrillSpan ~ f8 g\stopTrillSpan \startTrillSpan ~ g8 r\stopTrillSpan r4 \once \override TrillSpanner.to-barline = ##t diff --git a/input/regression/trill-spanner-grace.ly b/input/regression/trill-spanner-grace.ly index 6cb82618f8..18d7f0d4c6 100644 --- a/input/regression/trill-spanner-grace.ly +++ b/input/regression/trill-spanner-grace.ly @@ -2,11 +2,11 @@ texidoc = "Trill spanner can end on a grace note" } -\version "2.17.28" +\version "2.19.21" \layout { ragged-right = ##T } -\relative c' \new Voice { - << { c1 \startTrillSpan } +\relative \new Voice { + << { c'1 \startTrillSpan } { s2. \grace { d16\stopTrillSpan e } } >> c4 } diff --git a/input/regression/trill-spanner-scaled.ly b/input/regression/trill-spanner-scaled.ly index 19d7b9eb53..0e5a1deef8 100644 --- a/input/regression/trill-spanner-scaled.ly +++ b/input/regression/trill-spanner-scaled.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = " @@ -13,10 +13,10 @@ even if scaled to a smaller size. fontSize = #-6 \override StaffSymbol.staff-space = #(magstep -6) } - \relative c' { - c1\startTrillSpan | c\stopTrillSpan | + \relative { + c'1\startTrillSpan | c\stopTrillSpan | } - \new Staff \relative c' { - c1\startTrillSpan | c\stopTrillSpan | + \new Staff \relative { + c'1\startTrillSpan | c\stopTrillSpan | } >> diff --git a/input/regression/trill-spanner.ly b/input/regression/trill-spanner.ly index c56ab05480..8380bb6612 100644 --- a/input/regression/trill-spanner.ly +++ b/input/regression/trill-spanner.ly @@ -5,10 +5,10 @@ the wavy line should appear to come from the crook of the r" } -\version "2.16.0" +\version "2.19.21" \paper { ragged-right = ##t } -\relative c'' { - c1\startTrillSpan +\relative { + c''1\startTrillSpan c\stopTrillSpan } diff --git a/input/regression/tuplet-beam.ly b/input/regression/tuplet-beam.ly index 6b84baa674..e3a585fe47 100644 --- a/input/regression/tuplet-beam.ly +++ b/input/regression/tuplet-beam.ly @@ -1,5 +1,5 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "In combination with a beam, the bracket of the tuplet @@ -9,8 +9,8 @@ the bracket." } \layout { ragged-right= ##t } -\context Voice\relative c'' { - \tuplet 3/2 { r c8[ c8] } +\context Voice\relative { + \tuplet 3/2 { r c''8[ c8] } \tuplet 3/2 { c8[ c c] } \tuplet 3/2 { c16[ c16] c8[ c8] } } diff --git a/input/regression/tuplet-bracket-avoid-fingering.ly b/input/regression/tuplet-bracket-avoid-fingering.ly index 719851b26d..72df3d62a0 100644 --- a/input/regression/tuplet-bracket-avoid-fingering.ly +++ b/input/regression/tuplet-bracket-avoid-fingering.ly @@ -1,11 +1,11 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "@code{TupletBracket} grobs avoid @code{Fingering} grobs. " } -\relative d'' { +\relative { \override TupletBracket.direction = #UP - \tuplet 3/2 { d4 a8-4 } + \tuplet 3/2 { d''4 a8-4 } } diff --git a/input/regression/tuplet-bracket-avoid-scripts.ly b/input/regression/tuplet-bracket-avoid-scripts.ly index 1cccccde46..9edbde3f1d 100644 --- a/input/regression/tuplet-bracket-avoid-scripts.ly +++ b/input/regression/tuplet-bracket-avoid-scripts.ly @@ -1,10 +1,10 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Tuplet brackets avoid scripts by default. " } -\relative c'' { - \tuplet 3/2 { a8^\espressivo r a^\espressivo } +\relative { + \tuplet 3/2 { a'8^\espressivo r a^\espressivo } } diff --git a/input/regression/tuplet-bracket-avoid-string-number.ly b/input/regression/tuplet-bracket-avoid-string-number.ly index 62ce79a461..11c2ddff6e 100644 --- a/input/regression/tuplet-bracket-avoid-string-number.ly +++ b/input/regression/tuplet-bracket-avoid-string-number.ly @@ -1,11 +1,11 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "@code{TupletBracket} grobs avoid @code{StringNumber} grobs. " } -\relative d'' { +\relative { \override TupletBracket.direction = #UP - \tuplet 3/2 { d4 8 } + \tuplet 3/2 { d''4 8 } } diff --git a/input/regression/tuplet-bracket-outside-staff-priority.ly b/input/regression/tuplet-bracket-outside-staff-priority.ly index ecfa6814f7..15d5220612 100644 --- a/input/regression/tuplet-bracket-outside-staff-priority.ly +++ b/input/regression/tuplet-bracket-outside-staff-priority.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Tuplet brackets' outside staff priority can be @@ -6,10 +6,10 @@ set. Brackets, by default, carry their numbers with them." } -\relative c'' { +\relative { \override TupletBracket.avoid-scripts = ##f % Plain old tuplet - \tuplet 3/2 { a8 r a } + \tuplet 3/2 { a'8 r a } % With nothing set, collisions abound both horizontally and % vertically \tuplet 3/2 { a8^\espressivo r a^\espressivo } diff --git a/input/regression/tuplet-bracket-vertical-skylines.ly b/input/regression/tuplet-bracket-vertical-skylines.ly index 752f595128..db82cafb57 100644 --- a/input/regression/tuplet-bracket-vertical-skylines.ly +++ b/input/regression/tuplet-bracket-vertical-skylines.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Tuplet brackets do not push objects with outside-staff-priority @@ -6,7 +6,7 @@ too high. " } -\relative c' { +\relative { \override TupletBracket.direction = #UP \tuplet 1/1 { a^"foo" a' a' a' } } diff --git a/input/regression/tuplet-bracket-visibility.ly b/input/regression/tuplet-bracket-visibility.ly index 1d4a986ac5..e3ad513b17 100644 --- a/input/regression/tuplet-bracket-visibility.ly +++ b/input/regression/tuplet-bracket-visibility.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "The default behavior of tuplet-bracket visibility is to print a bracket @@ -20,8 +20,8 @@ unless there is a beam of the same length as the tuplet. Overriding " } -music = \relative c'' { - \tuplet 3/2 { c16[ d e } f8] +music = \relative { + \tuplet 3/2 { c''16[ d e } f8] \tuplet 3/2 { c8 d e } \tuplet 3/2 { c4 d e } } diff --git a/input/regression/tuplet-broken.ly b/input/regression/tuplet-broken.ly index 9021ead4b1..6bb811ab5a 100644 --- a/input/regression/tuplet-broken.ly +++ b/input/regression/tuplet-broken.ly @@ -8,7 +8,7 @@ } -\version "2.17.11" +\version "2.19.21" \paper { ragged-right = ##t @@ -16,7 +16,7 @@ } -\relative c'' { +\relative { \override TupletNumber.text = #tuplet-number::calc-fraction-text \override TupletBracket.edge-text = #(cons @@ -24,7 +24,7 @@ #:arrow-head X LEFT #f) (markup #:arrow-head X RIGHT #f)) \tuplet 19/11 { - c4 c4 c4 c4 + c''4 c4 c4 c4 \bar "-" \break c4 c4 c4 c4 c4 c4 c4 c4 diff --git a/input/regression/tuplet-full-length.ly b/input/regression/tuplet-full-length.ly index 484d24762b..6eac8bfd3c 100644 --- a/input/regression/tuplet-full-length.ly +++ b/input/regression/tuplet-full-length.ly @@ -5,19 +5,19 @@ start of the next non-tuplet note. " } -\version "2.17.11" +\version "2.19.21" \paper { ragged-right = ##t indent = 0.0 } -\relative c'' \new Voice \with { +\relative \new Voice \with { \remove Forbid_line_break_engraver \override Beam.breakable = ##t } { \set tupletFullLength = ##t - c4 + c''4 \tuplet 3/2 { c8[ c c] } \tuplet 3/2 { c8[ c \bar "-" \break c] } << \tuplet 3/2 { c8[ c c] } diff --git a/input/regression/tuplet-gap.ly b/input/regression/tuplet-gap.ly index 4bf91a6e4d..f7428cc6d5 100644 --- a/input/regression/tuplet-gap.ly +++ b/input/regression/tuplet-gap.ly @@ -5,7 +5,7 @@ } -\version "2.17.11" +\version "2.19.21" \layout { indent = 0.0\mm @@ -13,8 +13,8 @@ } -\relative c'' { +\relative { \override TupletNumber.text = #tuplet-number::calc-fraction-text - \tuplet 12/17 { c8 c4 c8 c8} + \tuplet 12/17 { c''8 c4 c8 c8} } diff --git a/input/regression/tuplet-long-spanner.ly b/input/regression/tuplet-long-spanner.ly new file mode 100644 index 0000000000..d79ac54700 --- /dev/null +++ b/input/regression/tuplet-long-spanner.ly @@ -0,0 +1,21 @@ +\version "2.19.14" + +\header { + texidoc = "Overlong tuplet span specifications are reduced +to the actual length." +} + +\layout { ragged-right = ##t } + +\relative \new Staff \with { subdivideBeams = ##t + baseMoment = #(ly:make-moment 1/8) + } +{ + \tuplet 3/2 4 { g16 a b } c8 d e f2 | + \set baseMoment = #(ly:make-moment 1/12) + \tuplet 3/2 4 + { d16 e f g a b c,16 d e f g a + \unset baseMoment + b, c d } + \tuplet 3/2 { e16 f8 } g4 | +} diff --git a/input/regression/tuplet-nest-broken.ly b/input/regression/tuplet-nest-broken.ly index 33876e0034..edfffb87de 100644 --- a/input/regression/tuplet-nest-broken.ly +++ b/input/regression/tuplet-nest-broken.ly @@ -1,5 +1,5 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Broken nested tuplets avoid each other correctly. @@ -14,13 +14,13 @@ \score { \new Staff << - \relative c'' { + \relative { \override Score.Beam.breakable = ##t r2 \tuplet 3/4 { - \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c''8[ c c] } \tuplet 3/2 { c8[ c c] } \tuplet 3/2 { c8[ c c] } } diff --git a/input/regression/tuplet-nest.ly b/input/regression/tuplet-nest.ly index 093c57f289..8c10cdcd1b 100644 --- a/input/regression/tuplet-nest.ly +++ b/input/regression/tuplet-nest.ly @@ -1,5 +1,5 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc=" Tuplets may be nested." @@ -10,9 +10,9 @@ indent = 0.0 } -\relative c'' { +\relative { \tuplet 3/4 { - \tuplet 3/2 { c8[ c c] } + \tuplet 3/2 { c''8[ c c] } \tuplet 3/2 { c8[ c c] } \tuplet 3/2 { c8[ c c] } } diff --git a/input/regression/tuplet-number-french-kneed-beams.ly b/input/regression/tuplet-number-french-kneed-beams.ly new file mode 100644 index 0000000000..2cd490016c --- /dev/null +++ b/input/regression/tuplet-number-french-kneed-beams.ly @@ -0,0 +1,42 @@ +\version "2.19.21" + +\header { + texidoc = "Tuplet numbers are positioned correctly on kneed French-style beams." +} + +\layout { + indent = 0 + ragged-right = ##t +} + +top = \change Staff = "1" +bottom = \change Staff = "2" + +music = +\relative { + \time 3/4 + \override Beam.auto-knee-gap = 1 + \override Stem.french-beaming = ##t + \override TupletBracket.bracket-visibility = ##f + \set subdivideBeams = ##t + \set baseMoment = #(ly:make-moment 1 8) + \tuplet 3/2 8 { + g16 e''' c e g,,, c + \bottom c,16. \top c''32 \bottom c,,16 + \top c''16. \bottom c,,32 c,16 + } + \tuplet 5/4 8 { + c'32 \top c''' \bottom c,,,, \top c''' \bottom c,, + \top c'''32 \bottom c,,,, \top c''' \bottom c,, \top c''' + } +} + +\new PianoStaff << + \new Staff = "1" { + \music + } + \new Staff = "2" { + \clef bass + s2. + } +>> diff --git a/input/regression/tuplet-number-kneed-beam-even-stem-count.ly b/input/regression/tuplet-number-kneed-beam-even-stem-count.ly new file mode 100644 index 0000000000..e52b760619 --- /dev/null +++ b/input/regression/tuplet-number-kneed-beam-even-stem-count.ly @@ -0,0 +1,31 @@ +\version "2.19.21" + +\header { + texidoc = "In tuplets with an even number of stems, the number +may be placed on either side of the beam when the central stems +point in different directions. The exception to this is when +there is a fractional beam on one of the central stems, in which +case the number is placed opposite the partial beam." +} + +\layout { + indent = 0 + ragged-right = ##t +} + +\relative { + \time 2/4 + \override Beam.auto-knee-gap = 1 + \tuplet 6/4 4 { + c'16 c'' c,, c'' c,, c'' + \once \override TupletNumber.direction = #UP + c,,16 c'' c,, c'' c,, c'' + } + \time 6/16 + \tuplet 4/3 8. { + c,,8. c''16 + %% The following override has no effect: + \override TupletNumber.direction = #DOWN + c,,16 c''8. + } +} diff --git a/input/regression/tuplet-number-kneed-beam-horizontal-fit.ly b/input/regression/tuplet-number-kneed-beam-horizontal-fit.ly new file mode 100644 index 0000000000..5f23f5eba7 --- /dev/null +++ b/input/regression/tuplet-number-kneed-beam-horizontal-fit.ly @@ -0,0 +1,33 @@ +\version "2.19.21" + +\header { + texidoc = "Tuplet numbers are placed next to the beam unless there is +insufficient horizontal space for them, in which case bracket-based +positioning is used and a programming error is issued. + +The first tuplet number should be between stems; the second should be +below the noteheads." +} + +#(ly:expect-warning (_ "not enough space for tuplet number against beam")) +#(ly:expect-warning (_ "not enough space for tuplet number against beam")) + +\layout { + indent = 0 + ragged-right = ##t +} + +\score { + \relative { + \time 2/4 + \override Beam.auto-knee-gap = 1 + \tuplet 6/4 4 { + \once \override TupletNumber.text = + #tuplet-number::calc-fraction-text + c'16 c'' c,, c'' c,, c'' + \once \override TupletNumber.text = + #(tuplet-number::fraction-with-notes "16" "16") + c,,16 c'' c,, c'' c,, c'' + } + } +} diff --git a/input/regression/tuplet-number-kneed-beam-ledger-lines.ly b/input/regression/tuplet-number-kneed-beam-ledger-lines.ly new file mode 100644 index 0000000000..58db776e8d --- /dev/null +++ b/input/regression/tuplet-number-kneed-beam-ledger-lines.ly @@ -0,0 +1,25 @@ +\version "2.19.21" + +\header { + texidoc = "A tuplet number associated with a kneed beam is not placed between +beam and staff where it may collide with ledger lines." +} + +\layout { + indent = 0 + ragged-right = ##t +} + +\relative { + \override Beam.auto-knee-gap = 1 + \tuplet 3/2 4 { + c''8 c''' cis,,, + c8 c'''' c,,, + c''8 c c,, + c,8 c,,, c''' + c,8 c,, c'' + c,8 c,, c'' + \override TupletNumber.font-size = 5 + c,,8 c c'' + } +} diff --git a/input/regression/tuplet-number-kneed-beam-positions.ly b/input/regression/tuplet-number-kneed-beam-positions.ly new file mode 100644 index 0000000000..d98353494a --- /dev/null +++ b/input/regression/tuplet-number-kneed-beam-positions.ly @@ -0,0 +1,39 @@ +\version "2.19.21" + +\header { + texidoc = "Tuplet numbers are placed next to kneed beams when +@code{Beam.positions} is overridden." +} + +\layout { + indent = 0 + ragged-right = ##t +} + +top = \change Staff = "1" +bottom = \change Staff = "2" + +music = \relative { + \override Beam.auto-knee-gap = 1 + \tuplet 3/2 4 { + c8 \top e'' \bottom g,, + \once \override Beam.positions = #'(4.5 . 4.5) + c,8 \top e'' \bottom g,, + \once \override Beam.positions = #'(-7.0 . -7.0) + \top e''8 \bottom c,, c, + \once \override Beam.positions = #'(-4.5 . -4.5) + \top e'''8 \bottom c,, c, + } +} + +\score { + \new PianoStaff << + \new Staff = "1" { + s1 + } + \new Staff = "2" { + \clef bass + \music + } + >> +} diff --git a/input/regression/tuplet-number-outside-staff-positioning.ly b/input/regression/tuplet-number-outside-staff-positioning.ly index 8cdb353a6d..93e28aac05 100644 --- a/input/regression/tuplet-number-outside-staff-positioning.ly +++ b/input/regression/tuplet-number-outside-staff-positioning.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { @@ -10,8 +10,8 @@ positioned above them. } -\relative c'' { +\relative { \override TupletBracket.outside-staff-priority = #1 \override TupletNumber.font-size = #5 - \tuplet 3/2 { a4\trill a\trill^"foo" a\trill } + \tuplet 3/2 { a'4\trill a\trill^"foo" a\trill } } \ No newline at end of file diff --git a/input/regression/tuplet-number-outside-staff-priority.ly b/input/regression/tuplet-number-outside-staff-priority.ly index 1a21d0cf77..dfbf8cd9c9 100644 --- a/input/regression/tuplet-number-outside-staff-priority.ly +++ b/input/regression/tuplet-number-outside-staff-priority.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Tuplet numbers' outside staff priority can be @@ -6,9 +6,9 @@ set." } -\relative c'' { +\relative { \override TupletBracket.avoid-scripts = ##f - \tuplet 3/2 { a8\trill a\trill a\trill } + \tuplet 3/2 { a'8\trill a\trill a\trill } \override TupletNumber.outside-staff-priority = #1 \tuplet 3/2 { a8\trill a\trill a\trill } \override Script.outside-staff-priority = #2 diff --git a/input/regression/tuplet-number-shift-along-kneed-beam.ly b/input/regression/tuplet-number-shift-along-kneed-beam.ly new file mode 100644 index 0000000000..272095b34e --- /dev/null +++ b/input/regression/tuplet-number-shift-along-kneed-beam.ly @@ -0,0 +1,23 @@ +\version "2.19.21" + +\header { + texidoc = "Tuplet numbers will maintain a constant distance from +kneed beams when offset horizontally." +} + +\layout { + indent = 0 + ragged-right = ##f +} + +\relative { + \tuplet 3/2 4 { + c'8 g''' a + \once \offset X-offset 2 TupletNumber + c,,, g''' a + \once \offset X-offset #-2 TupletNumber + c,,, g''' a + \once \offset X-offset 6 TupletNumber + c,,, g''' a + } +} diff --git a/input/regression/tuplet-numbers-kneed-beams-accidentals.ly b/input/regression/tuplet-numbers-kneed-beams-accidentals.ly new file mode 100644 index 0000000000..33a99bd1ff --- /dev/null +++ b/input/regression/tuplet-numbers-kneed-beams-accidentals.ly @@ -0,0 +1,38 @@ +\version "2.19.21" + +\header { + texidoc = "Tuplet numbers associated with kneed beams will +avoid accidentals." +} + +\layout { + indent = 0 + ragged-right = ##t +} + +top = \change Staff = "1" +bottom = \change Staff = "2" + +music = \relative { + \override Beam.auto-knee-gap = 1 + \tuplet 5/4 4 { + c16[ \top g'' e' \bottom fis,, \top c'] + e'16 \bottom g,, c, \top \bottom g, + } + \tuplet 3/2 4 { + \top c8 c'' ceses,, + g'' g,, + } +} + +\score { + \new PianoStaff << + \new Staff = "1" { + s1 + } + \new Staff = "2" { + \clef bass + \music + } + >> +} diff --git a/input/regression/tuplet-numbers-kneed-beams.ly b/input/regression/tuplet-numbers-kneed-beams.ly new file mode 100644 index 0000000000..e23728827b --- /dev/null +++ b/input/regression/tuplet-numbers-kneed-beams.ly @@ -0,0 +1,39 @@ +\version "2.19.21" + +\header { + texidoc = "Tuplet numbers are positioned next to kneed beams." +} + +\layout { + indent = 0 + ragged-right = ##t +} + +top = \change Staff = "1" +bottom = \change Staff = "2" + +music = \relative { + \time 3/4 + \override Beam.auto-knee-gap = 1 + \tuplet 3/2 4 { + c8 g' \top e' + c'8 e, \bottom g, + \top e''8 \bottom c,, \top g'' + g,8 e''' c,, + c''8 g,, e' + g,8 c''' e,, + } +} + +\score { + \new PianoStaff << + \new Staff = "1" { + s2. + s2. + } + \new Staff = "2" { + \clef bass + \music + } + >> +} diff --git a/input/regression/tuplet-properties.ly b/input/regression/tuplet-properties.ly index 4af8ddd23c..4e5e839c8a 100644 --- a/input/regression/tuplet-properties.ly +++ b/input/regression/tuplet-properties.ly @@ -1,4 +1,4 @@ -\version "2.17.30" +\version "2.19.21" \header { texidoc = "Tuplet bracket formatting supports numerous options, @@ -6,9 +6,9 @@ for instance, bracketed (B) and non-bracketed (NB). " } -\context Voice \relative c'' { +\context Voice \relative { - \tuplet 3/2 { c'8 c,, c } + \tuplet 3/2 { c'''8 c,, c } \tuplet 3/2 { c'8 c'' c,, } \tuplet 3/2 { c8[^"NB" c c] } diff --git a/input/regression/tuplet-rest.ly b/input/regression/tuplet-rest.ly index beda1ec33e..854ddc54e2 100644 --- a/input/regression/tuplet-rest.ly +++ b/input/regression/tuplet-rest.ly @@ -1,5 +1,5 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Tuplets may contain rests. " @@ -7,9 +7,9 @@ } -\context Voice \relative c'' { +\context Voice \relative { \time 2/4 - \tuplet 3/2 { r c,,, c''' } + \tuplet 3/2 { r c, c''' } \tuplet 3/2 { r c c } \tuplet 3/2 { r c r } \tuplet 3/2 { r r r } diff --git a/input/regression/tuplet-single-note.ly b/input/regression/tuplet-single-note.ly index 322a4d635b..2715268453 100644 --- a/input/regression/tuplet-single-note.ly +++ b/input/regression/tuplet-single-note.ly @@ -4,14 +4,14 @@ texidoc = "Show tuplet numbers also on single-note tuplets (otherwise the timing would look messed up!), but don't show a bracket. Make sure that tuplets without any notes don't show any number, either." } -\version "2.17.11" +\version "2.19.21" \paper { ragged-right = ##t indent = 0.0 } \new Staff << - \new Voice \relative c'' { - \tuplet 6/4 { c2.:8 } \tuplet 3/2 { g4.:8 } \tuplet 3/2 { a,4.:8 } \tuplet 6/4 {} \bar"|." + \new Voice \relative { + \tuplet 6/4 { c''2.:8 } \tuplet 3/2 { g4.:8 } \tuplet 3/2 { a,4.:8 } \tuplet 6/4 {} \bar"|." } >> diff --git a/input/regression/tuplet-slope.ly b/input/regression/tuplet-slope.ly index c112f0c9af..6be44d91bc 100644 --- a/input/regression/tuplet-slope.ly +++ b/input/regression/tuplet-slope.ly @@ -15,15 +15,15 @@ The bracket direction is determined by the dominating stem direction. ragged-right = ##t } -\version "2.17.11" +\version "2.19.21" \new Voice { - \relative c'' { - \tuplet 3/2 { c4 d e} + \relative { + \tuplet 3/2 { c''4 d e} \tuplet 3/2 { c4 d e} } - \relative c' { + \relative { \tuplet 5/4 { a'4 as g fis f } \tuplet 5/4 { fis4 e es d des } \tuplet 5/4 { fis,4 e es d des } diff --git a/input/regression/tuplet-staffline-collision.ly b/input/regression/tuplet-staffline-collision.ly index 8729d9747a..6f0d244078 100644 --- a/input/regression/tuplet-staffline-collision.ly +++ b/input/regression/tuplet-staffline-collision.ly @@ -1,5 +1,5 @@ -\version "2.17.11" +\version "2.19.21" \header { texidoc = "Horizontal tuplet brackets are shifted vertically @@ -9,8 +9,8 @@ to avoid staff line collisions." \layout { ragged-right= ##t } -\context Voice\relative c'' { - \tuplet 3/2 { b'4 b b } +\context Voice\relative { + \tuplet 3/2 { b''4 b b } \tuplet 3/2 { f4 f f } \tuplet 3/2 { g4 g g } \tuplet 3/2 { a4 a a } diff --git a/input/regression/tuplet-subdivision.ly b/input/regression/tuplet-subdivision.ly index 82fd4b9780..158a6149a2 100644 --- a/input/regression/tuplet-subdivision.ly +++ b/input/regression/tuplet-subdivision.ly @@ -1,4 +1,4 @@ -\version "2.17.11" +\version "2.19.40" \header { @@ -7,11 +7,11 @@ Subdivision works properly for tuplets " } -\relative c'' { +\relative { \set subdivideBeams = ##t \set baseMoment = #(ly:make-moment 1/8) - \set beatStructure = #'(2 2 2 2) + \set beatStructure = 2,2,2,2 \repeat unfold 8 { - \tuplet 3/2 { c16 e d } + \tuplet 3/2 { c''16 e d } } } diff --git a/input/regression/tuplet-text-different-numbers.ly b/input/regression/tuplet-text-different-numbers.ly index 7e01d344db..50099cb8d3 100644 --- a/input/regression/tuplet-text-different-numbers.ly +++ b/input/regression/tuplet-text-different-numbers.ly @@ -1,13 +1,13 @@ -\version "2.17.11" +\version "2.19.21" \header{ texidoc="Non-standard tuplet texts: Printing other tuplet fractions than the ones actually assigned." } \layout { ragged-right= ##t } -\context Voice \relative c'' { +\context Voice \relative { \once \override TupletNumber.text = #(tuplet-number::non-default-tuplet-denominator-text 7) - \tuplet 3/2 { c4. c4. c4. c4. } + \tuplet 3/2 { c''4. c4. c4. c4. } \once \override TupletNumber.text = #(tuplet-number::non-default-tuplet-fraction-text 12 7) \tuplet 3/2 { c4. c4. c4. c4. } \once \override TupletNumber.text = #(tuplet-number::append-note-wrapper (tuplet-number::non-default-tuplet-fraction-text 12 7) "8") diff --git a/input/regression/tuplet-text-fraction-with-notes.ly b/input/regression/tuplet-text-fraction-with-notes.ly index 9a63ebdf45..ae3b30b836 100644 --- a/input/regression/tuplet-text-fraction-with-notes.ly +++ b/input/regression/tuplet-text-fraction-with-notes.ly @@ -1,12 +1,12 @@ -\version "2.17.11" +\version "2.19.21" \header{ texidoc="Non-standard tuplet texts: Printing a tuplet fraction with note durations assigned to both the denominator and the numerator." } -\context Voice \relative c'' { +\context Voice \relative { \once \override TupletNumber.text = #(tuplet-number::fraction-with-notes "4." "8") - \tuplet 3/2 { c4. c4. c4. c4. } + \tuplet 3/2 { c''4. c4. c4. c4. } \once \override TupletNumber.text = #(tuplet-number::non-default-fraction-with-notes 12 "8" 4 "4") \tuplet 3/2 { c4. c4. c4. c4. } } diff --git a/input/regression/tuplet-text-note-appended.ly b/input/regression/tuplet-text-note-appended.ly index c29e1f1997..539d29fea0 100644 --- a/input/regression/tuplet-text-note-appended.ly +++ b/input/regression/tuplet-text-note-appended.ly @@ -1,13 +1,13 @@ -\version "2.17.11" +\version "2.19.21" \header{ texidoc="Non-standard tuplet texts: Appending a note value to the normal text and to the fraction text." } \layout { ragged-right= ##t } -\context Voice \relative c'' { +\context Voice \relative { \once \override TupletNumber.text = #(tuplet-number::append-note-wrapper tuplet-number::calc-denominator-text "4") - \tuplet 3/2 { c8 c8 c8 c8 c8 c8 } + \tuplet 3/2 { c''8 c8 c8 c8 c8 c8 } \once \override TupletNumber.text = #(tuplet-number::append-note-wrapper tuplet-number::calc-fraction-text "4") \tuplet 3/2 { c8 c8 c8 c8 c8 c8 } } diff --git a/input/regression/tuplets.ly b/input/regression/tuplets.ly index c250c5bea4..3900594eb9 100644 --- a/input/regression/tuplets.ly +++ b/input/regression/tuplets.ly @@ -1,5 +1,5 @@ -\version "2.17.11" +\version "2.19.21" \header{ texidoc=" @@ -19,8 +19,8 @@ direction as the bracket. The endings can be adjusted with \layout { ragged-right= ##t } -\context Voice \relative c'' { - \tuplet 3/2 { a8 b c } +\context Voice \relative { + \tuplet 3/2 { a'8 b c } \tuplet 3/2 { r8 b[ f] } \override TupletBracket.bracket-flare = #'(0.5 . 0.5) \tuplet 3/2 { r8 b r8 } diff --git a/input/regression/tweaks-as-overrides.ly b/input/regression/tweaks-as-overrides.ly new file mode 100644 index 0000000000..bcd1680b90 --- /dev/null +++ b/input/regression/tweaks-as-overrides.ly @@ -0,0 +1,18 @@ +\version "2.19.36" + +\header { + texidoc = "Overrides can be the target of a @code{\\propertyTweak}, with the +tweaks accumulating as override. The main application is for stacking +commands implemented in terms of @code{\\propertyTweak}. This example +should show the starting chord with blue, cross-styled note heads and +a red stem." +} + +\layout { ragged-right = ##t } + +{ + \once \propertyTweak Stem.color #red + \propertyTweak color #blue + \override NoteHead.style = #'cross + 2 c'2 +} diff --git a/input/regression/typography-demo.ly b/input/regression/typography-demo.ly index 92bab85643..836088123b 100644 --- a/input/regression/typography-demo.ly +++ b/input/regression/typography-demo.ly @@ -8,8 +8,7 @@ heavily mutilated Edition Peters Morgenlied by Schubert" } -\version "2.17.6" -#(ly:expect-warning (_ "(De)crescendo with unspecified starting volume in MIDI.")) +\version "2.19.21" ignoreMelisma = \set ignoreMelismata = ##t ignoreMelismaOff = \unset ignoreMelismata @@ -20,8 +19,17 @@ ignoreMelismaOff = \unset ignoreMelismata %#(set-global-staff-size (* 5.8 mm)) indent = #(* mm 4) line-width = #(* mm 140) - system-system-spacing #'basic-distance = #10.3 + system-system-spacing.basic-distance = #10.3 ragged-bottom = ##t + + % Font settings for Cyrillic and Hebrew + % Linux Libertine fonts contain Cyrillic and Hebrew glyphs. + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + #:sans "Linux Biolinum O,sans-serif" + #:typewriter "Linux Libertine Mono O,monospace" + )) } modernAccidentals = { @@ -44,10 +52,10 @@ melody = \relative c'' \repeat volta 2 \context Voice = "singer" { { \stemDown f8.[ g16] } >> \stemNeutral a8 | fis4 g8 c16[ b a g] f[ e] | d4 f8 - \transpose a' e' \relative c'' { a16[ g fis! g] f![ d] } | + \transpose a' e' \relative { a'16[ g fis! g] f![ d] } | g4. r8 gis gis | a4 a16.[ b32] c8[( a]) fis8 | - g4.~ g8-\fermata + g4.~ 8-\fermata } @@ -127,8 +135,8 @@ pianoLH = \relative c'' \repeat volta 2\new Voice { } << \context Staff \accidentalStyle modern \melody >> - \lyricsto "singer" \new Lyrics \firstVerse - \lyricsto "singer" \new Lyrics \secondVerse + \new Lyrics \lyricsto "singer" \firstVerse + \new Lyrics \lyricsto "singer" \secondVerse \new PianoStaff << \set PianoStaff.instrumentName = \markup { \bold diff --git a/input/regression/unassociated-lyrics-alignment.ly b/input/regression/unassociated-lyrics-alignment.ly new file mode 100644 index 0000000000..b9db9a69df --- /dev/null +++ b/input/regression/unassociated-lyrics-alignment.ly @@ -0,0 +1,44 @@ +\version "2.19.9" +#(set-global-staff-size 30) + +\header { + texidoc = "Lyrics without an @code{associatedVoice} should align properly. +If there are notes in the @code{PaperColumn}, they should align to them, +and when there are no notes, they should align relative to the +@code{PaperColumn} itself (represented with blue @code{GridLines} here)" +} + +\paper { + ragged-right = ##f +} + +\layout { + \context { + \Voice + \consists "Grid_point_engraver" + gridInterval = #(ly:make-moment 1/4) + \override GridPoint.Y-extent = #'(-1 . 3) + } + \context { + \Staff + \consists "Grid_line_span_engraver" + \override GridLine.color = #blue + } +} + +music = << + \new Staff << + \new Voice { s1*3 } % needed for gridLines + \new Voice { d'2 d' 1 s1 } + >> + \new Lyrics { \lyricmode { foo2 bar mmmm1 a2 bom } } +>> + +\markup "default (centered):" +\music + +\markup "right-aligned:" +{ + \override Score.LyricText.self-alignment-X = #RIGHT + \music +} diff --git a/input/regression/unpure-pure-container.ly b/input/regression/unpure-pure-container.ly index 09971b0e27..1ceb243a47 100644 --- a/input/regression/unpure-pure-container.ly +++ b/input/regression/unpure-pure-container.ly @@ -1,5 +1,5 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc = "unpure-pure containers take two arguments: an unpure property and @@ -14,9 +14,9 @@ of 8. " } -\relative c'' { +\relative { \stemUp \autoBeamOff - d,8 eis' + d'8 eis' \once \override Flag.Y-offset = #(ly:make-unpure-pure-container ly:flag::calc-y-offset 8) d,8 eis'! diff --git a/input/regression/unset-once.ly b/input/regression/unset-once.ly new file mode 100644 index 0000000000..e9554e01f2 --- /dev/null +++ b/input/regression/unset-once.ly @@ -0,0 +1,37 @@ +\version "2.19.21" + +\header { + + texidoc = "@code{\\once \\unset} should change a context property +value for just one timestep and then return to the previous value." + +} +\relative { + \set fingeringOrientations = #'(left) + 1 | + \once \unset fingeringOrientations + -"default" | + -"left" | + + \unset fingeringOrientations + -"default" | + \once\unset fingeringOrientations + -"default" | + -"default" | + \set Score.fingeringOrientations = #'(right) + -"right" + \once\unset fingeringOrientations + -"right" + -"right" + \once\set fingeringOrientations = #'(left) + -"left" + -"right" + \set fingeringOrientations = #'(left) + -"left" + \once \unset fingeringOrientations + -"right" + -"left" + \unset fingeringOrientations + \set Score.fingeringOrientations = #'(up down) + -"default" +} diff --git a/input/regression/utf-8-mixed-text.ly b/input/regression/utf-8-mixed-text.ly index 7f93917c2f..b0fba2c5d2 100644 --- a/input/regression/utf-8-mixed-text.ly +++ b/input/regression/utf-8-mixed-text.ly @@ -7,4 +7,15 @@ \version "2.16.0" +% Font settings for Cyrillic +% Linux Libertine fonts contain Cyrillic glyphs. +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + #:sans "Linux Biolinum O,sans-serif" + #:typewriter "Linux Libertine Mono O,monospace" + )) +} + \markup { "Здравствуйте Hallo" } diff --git a/input/regression/utf-8.ly b/input/regression/utf-8.ly index cf5d79ddb4..b5fefcf923 100644 --- a/input/regression/utf-8.ly +++ b/input/regression/utf-8.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" %% Edit this file using a Unicode aware editor, such as GVIM, GEDIT, Emacs @@ -8,14 +8,14 @@ You may have to install additional fonts. Red Hat Fedora - taipeifonts fonts-xorg-truetype ttfonts-ja fonts-arabic \ - ttfonts-zh_CN fonts-ja fonts-hebrew + linux-libertine-fonts (Latin, Cyrillic, Hebrew) + ipa-mincho-fonts ipa-gothic-fonts (Japanese) -Debian GNU/Linux +Debian GNU/Linux, Ubuntu + + fonts-linuxlibertine (Latin, Cyrillic, Hebrew) + fonts-ipafont (Japanese) - apt-get install emacs-intl-fonts xfonts-intl-.* \ - ttf-kochi-gothic ttf-kochi-mincho \ - xfonts-bolkhov-75dpi xfonts-cronyx-100dpi xfonts-cronyx-75dpi %} \header { @@ -29,6 +29,17 @@ will render Bulgarian (Cyrillic), Hebrew, Japanese and Portuguese. } +% Font settings for Cyrillic and Hebrew +% Linux Libertine fonts contain Cyrillic and Hebrew glyphs. +\paper { + #(define fonts + (set-global-fonts + #:roman "Linux Libertine O,serif" + #:sans "Linux Biolinum O,sans-serif" + #:typewriter "Linux Libertine Mono O,monospace" + )) +} + % Cyrillic font bulgarian = \lyricmode { Жълтата дюля беше щастлива, че пухът, който цъфна, замръзна като гьон. @@ -54,8 +65,8 @@ portuguese = \lyricmode { ragged-right = ##T } -\relative c' { - c2 d e f g f e +\relative { + c'2 d e f g f e } \addlyrics { \bulgarian } \addlyrics { \hebrew } diff --git a/input/regression/voice-follower.ly b/input/regression/voice-follower.ly index a992a5cfbd..100327638c 100644 --- a/input/regression/voice-follower.ly +++ b/input/regression/voice-follower.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc= " @@ -13,11 +13,11 @@ can be printed automatically. This is enabled if the property ragged-right = ##t } -\relative c' +\relative \context PianoStaff << \set PianoStaff.followVoice = ##t \new Staff = "one" \context Voice { - c1 + c'1 \change Staff=two b2 a } diff --git a/input/regression/volta-markup-text.ly b/input/regression/volta-markup-text.ly index cd29427b5c..b8adcb0c83 100644 --- a/input/regression/volta-markup-text.ly +++ b/input/regression/volta-markup-text.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc = "Volte using @code{repeatCommands} can have markup @@ -7,8 +7,8 @@ text." voltaAdLib = \markup { 1. 2. 3... \text \italic { ad lib. } } -\relative c'' { - c1 +\relative { + c''1 \set Score.repeatCommands = #(list (list 'volta voltaAdLib) 'start-repeat) c4 b d e \set Score.repeatCommands = #'((volta #f) (volta "4.") end-repeat) diff --git a/input/regression/warn-expected-warning-missing.ly b/input/regression/warn-expected-warning-missing.ly index bdb6dc2425..ddf5d8dcc1 100644 --- a/input/regression/warn-expected-warning-missing.ly +++ b/input/regression/warn-expected-warning-missing.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.21" #(ly:set-option 'warning-as-error #f) #(ly:expect-warning (_ "this is a warning that won't be triggered")) @@ -9,4 +9,4 @@ warning about this fact. This will be used to detect missing warnings in our regtests." } -\relative c' { c4 } +\relative { c'4 } diff --git a/input/regression/whiteout-lower-layers.ly b/input/regression/whiteout-lower-layers.ly index 3b1c30971f..15c59e5770 100644 --- a/input/regression/whiteout-lower-layers.ly +++ b/input/regression/whiteout-lower-layers.ly @@ -1,21 +1,44 @@ -\version "2.17.6" +\version "2.19.32" \header { texidoc = "If the 'whiteout property of a -grob is set to #t, that part of all objects in lower -layers which falls under the extent of the grob is -whited out. Here the TimeSignature whites out the -Tie but not the StaffSymbol. +grob is set to a number or #t, that part of all objects +in lower layers which falls under the extent of +the grob's whiteout area is whited out. Here the +TimeSignature whites out the Tie but not the StaffSymbol. " } -\relative c' { +\relative { \time 3/4 - \override Staff.StaffSymbol.layer = #4 - \once \override Tie.layer = #2 + \override Staff.StaffSymbol.layer = 4 + \once \override Tie.layer = 2 b'2.~ \once \override Staff.TimeSignature.whiteout = ##t - \once \override Staff.TimeSignature.layer = #3 + \once \override Staff.TimeSignature.layer = 3 + \time 5/4 + b4 +} + +\relative c' { + \time 3/4 + \override Staff.StaffSymbol.layer = 4 + \once \override Tie.layer = 2 + b'2.~ + \once \override Staff.TimeSignature.whiteout-style = #'rounded-box + \once \override Staff.TimeSignature.whiteout = 3 + \once \override Staff.TimeSignature.layer = 3 \time 5/4 b4 } +\relative c' { + \time 3/4 + \override Staff.StaffSymbol.layer = 4 + \once \override Tie.layer = 2 + b'2.~ + \once \override Staff.TimeSignature.whiteout-style = #'outline + \once \override Staff.TimeSignature.whiteout = 3 + \once \override Staff.TimeSignature.layer = 3 + \time 5/4 + b4 +} diff --git a/input/regression/whiteout.ly b/input/regression/whiteout.ly index c2802628ea..543d94f369 100644 --- a/input/regression/whiteout.ly +++ b/input/regression/whiteout.ly @@ -1,18 +1,39 @@ \header { - texidoc = "The whiteout command underlays a white box under a -markup. " + texidoc = "The whiteout command underlays a white background under a +markup. The shape is determined by @code{whiteout-style}. The default +is @code{box} which produces a rectangle. @code{rounded-box} produces +a rounded rectangle. @code{outline} approximates the outline of the +markup." } -\version "2.17.6" +\version "2.19.32" \paper { ragged-right = ##t } -\relative c'' { +\relative { \override TextScript.layer = #'2 \override TextScript.extra-offset = #'(2 . 4) - c4-\markup { \whiteout \pad-markup #0.5 foo } c + c''4-\markup { \whiteout foo } c + c-\markup { \whiteout \pad-markup #0.5 foo } c + c-\markup { + \override #'(thickness . 2) + \whiteout foo + } + c + c-\markup { + \override #'(thickness . 3) + \override #'(style . rounded-box) + \whiteout foo + } + c + c-\markup { + \override #'(thickness . 3) + \override #'(style . outline) + \whiteout foo + } + c } diff --git a/input/regression/woodwind-diagrams-empty.ly b/input/regression/woodwind-diagrams-empty.ly index 4bf1dba344..35b9009a0e 100644 --- a/input/regression/woodwind-diagrams-empty.ly +++ b/input/regression/woodwind-diagrams-empty.ly @@ -1,68 +1,68 @@ -\version "2.16.0" +\version "2.19.21" \header { texidoc="Empty woodwind diagrams for all instruments in woodwind-diagrams.scm." } -\relative c' { - c1^\markup { +\relative { + c'1^\markup { \woodwind-diagram #'piccolo #'() } } -\relative c' { - c1^\markup { +\relative { + c'1^\markup { \woodwind-diagram #'flute #'() } } -\relative c' { - c1^\markup { +\relative { + c'1^\markup { \woodwind-diagram #'oboe #'() } } -\relative c' { - c1^\markup { +\relative { + c'1^\markup { \woodwind-diagram #'clarinet #'() } } -\relative c' { - c1^\markup { +\relative { + c'1^\markup { \woodwind-diagram #'bass-clarinet #'() } } -\relative c' { - c1^\markup { +\relative { + c'1^\markup { \woodwind-diagram #'saxophone #'() } } -\relative c' { - c1^\markup { +\relative { + c'1^\markup { \woodwind-diagram #'bassoon #'() } } -\relative c' { - c1^\markup { +\relative { + c'1^\markup { \woodwind-diagram #'contrabassoon #'() diff --git a/input/regression/zero-staff-space.ly b/input/regression/zero-staff-space.ly index 6e3eb0a428..d6820208e1 100644 --- a/input/regression/zero-staff-space.ly +++ b/input/regression/zero-staff-space.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.21" \header { texidoc=" @@ -9,7 +9,7 @@ Setting staff-space to 0 does not cause a segmentation fault. \new Staff \with { \override StaffSymbol.staff-space = #0 } { - \relative c' { - c1 \bar ":|." + \relative { + c'1 \bar ":|." } } diff --git a/lily/accidental-engraver.cc b/lily/accidental-engraver.cc index ac525d27de..1be735b0ed 100644 --- a/lily/accidental-engraver.cc +++ b/lily/accidental-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Modified 2001--2002 by Rune Zedeler LilyPond is free software: you can redistribute it and/or modify @@ -99,7 +99,7 @@ public: }; /* - localKeySignature is changed at runtime, which means that references + localAlterations is changed at runtime, which means that references in grobs should always store ly_deep_copy ()s of those. */ @@ -120,7 +120,7 @@ Accidental_engraver::update_local_key_signature (SCM new_sig) { last_keysig_ = new_sig; set_context_property_on_children (context (), - ly_symbol2scm ("localKeySignature"), + ly_symbol2scm ("localAlterations"), new_sig); Context *trans = context ()->get_parent_context (); @@ -131,9 +131,9 @@ Accidental_engraver::update_local_key_signature (SCM new_sig) */ SCM val; - while (trans && trans->where_defined (ly_symbol2scm ("localKeySignature"), &val) == trans) + while (trans && trans->here_defined (ly_symbol2scm ("localAlterations"), &val)) { - trans->set_property ("localKeySignature", ly_deep_copy (last_keysig_)); + trans->set_property ("localAlterations", ly_deep_copy (last_keysig_)); trans = trans->get_parent_context (); } } @@ -199,10 +199,7 @@ check_pitch_against_rules (Pitch const &pitch, Context *origin, */ else if (scm_is_symbol (rule)) { - Context *dad = origin; - while (dad && !dad->is_alias (rule)) - dad = dad->get_parent_context (); - + Context *dad = find_context_above (origin, rule); if (dad) origin = dad; } @@ -233,7 +230,7 @@ Accidental_engraver::process_acknowledged () Stream_event *note = accidentals_[i].melodic_; Context *origin = accidentals_[i].origin_; - Pitch *pitch = unsmob_pitch (note->get_property ("pitch")); + Pitch *pitch = unsmob (note->get_property ("pitch")); if (!pitch) continue; @@ -317,7 +314,7 @@ Accidental_engraver::make_standard_accidental (Stream_event * /* note */, */ for (vsize i = 0; i < left_objects_.size (); i++) { - if (left_objects_[i]->get_property ("side-axis") == scm_from_int (X_AXIS)) + if (scm_is_eq (left_objects_[i]->get_property ("side-axis"), scm_from_int (X_AXIS))) Side_position_interface::add_support (left_objects_[i], a); } @@ -332,7 +329,7 @@ Accidental_engraver::make_standard_accidental (Stream_event * /* note */, Accidental_placement::add_accidental (accidental_placement_, a, - get_property ("accidentalGrouping") == ly_symbol2scm ("voice"), + scm_is_eq (get_property ("accidentalGrouping"), ly_symbol2scm ("voice")), (long) trans); note_head->set_object ("accidental-grob", a->self_scm ()); @@ -348,7 +345,7 @@ Accidental_engraver::make_suggested_accidental (Stream_event * /* note */, Grob *a = trans->make_item ("AccidentalSuggestion", note_head->self_scm ()); Side_position_interface::add_support (a, note_head); - if (Grob *stem = unsmob_grob (a->get_object ("stem"))) + if (Grob *stem = unsmob (a->get_object ("stem"))) Side_position_interface::add_support (a, stem); a->set_parent (note_head, X_AXIS); @@ -367,6 +364,18 @@ Accidental_engraver::stop_translation_timestep () for (vsize j = ties_.size (); j--;) { Grob *r = Tie::head (ties_[j], RIGHT); + Grob *l = Tie::head (ties_[j], LEFT); + if (l && r) + { + // Don't mark accidentals as "tied" when the pitch is not + // actually the same. This is relevant for enharmonic ties. + Stream_event *le = unsmob (l->get_property ("cause")); + Stream_event *re = unsmob (r->get_property ("cause")); + if (le && re + && !ly_is_equal (le->get_property ("pitch"), re->get_property ("pitch"))) + continue; + } + for (vsize i = accidentals_.size (); i--;) if (accidentals_[i].head_ == r) { @@ -387,7 +396,7 @@ Accidental_engraver::stop_translation_timestep () int barnum = measure_number (origin); - Pitch *pitch = unsmob_pitch (note->get_property ("pitch")); + Pitch *pitch = unsmob (note->get_property ("pitch")); if (!pitch) continue; @@ -397,12 +406,12 @@ Accidental_engraver::stop_translation_timestep () SCM key = scm_cons (scm_from_int (o), scm_from_int (n)); Moment end_mp = measure_position (context (), - unsmob_duration (note->get_property ("duration"))); + unsmob (note->get_property ("duration"))); SCM position = scm_cons (scm_from_int (barnum), end_mp.smobbed_copy ()); SCM localsig = SCM_EOL; while (origin - && origin->where_defined (ly_symbol2scm ("localKeySignature"), &localsig)) + && origin->where_defined (ly_symbol2scm ("localAlterations"), &localsig)) { bool change = false; if (accidentals_[i].tied_ @@ -429,7 +438,7 @@ Accidental_engraver::stop_translation_timestep () } if (change) - origin->set_property ("localKeySignature", localsig); + origin->set_property ("localAlterations", localsig); origin = origin->get_parent_context (); } @@ -452,22 +461,21 @@ Accidental_engraver::acknowledge_rhythmic_head (Grob_info info) Stream_event *note = info.event_cause (); if (note && (note->in_event_class ("note-event") - || note->in_event_class ("trill-span-event"))) + || note->in_event_class ("trill-span-event")) + // option to skip accidentals on string harmonics + && (to_boolean (get_property ("harmonicAccidentals")) + || !scm_is_eq (info.grob ()->get_property ("style"), + ly_symbol2scm ("harmonic"))) + // ignore accidentals in non-printing voices like NullVoice + && !to_boolean (info.context ()->get_property ("nullAccidentals"))) { - /* - string harmonics usually don't have accidentals. - */ - if (info.grob ()->get_property ("style") != ly_symbol2scm ("harmonic") - || to_boolean (get_property ("harmonicAccidentals"))) - { - Accidental_entry entry; - entry.head_ = info.grob (); - entry.origin_engraver_ = dynamic_cast (info.origin_translator ()); - entry.origin_ = entry.origin_engraver_->context (); - entry.melodic_ = note; + Accidental_entry entry; + entry.head_ = info.grob (); + entry.origin_engraver_ = dynamic_cast (info.origin_translator ()); + entry.origin_ = entry.origin_engraver_->context (); + entry.melodic_ = note; - accidentals_.push_back (entry); - } + accidentals_.push_back (entry); } } @@ -498,16 +506,21 @@ Accidental_engraver::acknowledge_finger (Grob_info info) void Accidental_engraver::process_music () { - SCM sig = get_property ("keySignature"); + SCM sig = get_property ("keyAlterations"); if (last_keysig_ != sig) update_local_key_signature (sig); } -ADD_ACKNOWLEDGER (Accidental_engraver, arpeggio); -ADD_ACKNOWLEDGER (Accidental_engraver, finger); -ADD_ACKNOWLEDGER (Accidental_engraver, rhythmic_head); -ADD_END_ACKNOWLEDGER (Accidental_engraver, tie); -ADD_ACKNOWLEDGER (Accidental_engraver, note_column); + +void +Accidental_engraver::boot () +{ + ADD_ACKNOWLEDGER (Accidental_engraver, arpeggio); + ADD_ACKNOWLEDGER (Accidental_engraver, finger); + ADD_ACKNOWLEDGER (Accidental_engraver, rhythmic_head); + ADD_END_ACKNOWLEDGER (Accidental_engraver, tie); + ADD_ACKNOWLEDGER (Accidental_engraver, note_column); +} ADD_TRANSLATOR (Accidental_engraver, /* doc */ @@ -530,9 +543,9 @@ ADD_TRANSLATOR (Accidental_engraver, "extraNatural " "harmonicAccidentals " "accidentalGrouping " - "keySignature " - "localKeySignature ", + "keyAlterations " + "localAlterations ", /* write */ - "localKeySignature " + "localAlterations " ); diff --git a/lily/accidental-placement.cc b/lily/accidental-placement.cc index da23e57194..1a55710122 100644 --- a/lily/accidental-placement.cc +++ b/lily/accidental-placement.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,14 +36,14 @@ accidental_pitch (Grob *acc) { SCM cause = acc->get_parent (Y_AXIS)->get_property ("cause"); - Stream_event *mcause = unsmob_stream_event (cause); + Stream_event *mcause = unsmob (cause); if (!mcause) { programming_error ("note head has no event cause"); return 0; } - return unsmob_pitch (mcause->get_property ("pitch")); + return unsmob (mcause->get_property ("pitch")); } void @@ -54,14 +54,13 @@ Accidental_placement::add_accidental (Grob *me, Grob *a, bool stagger, long cont return; a->set_parent (me, X_AXIS); - a->set_property ("X-offset", Grob::x_parent_positioning_proc); long n = p->get_notename (); SCM accs = me->get_object ("accidental-grobs"); SCM key = scm_cons (scm_from_int (n), scm_from_long (stagger ? context_hash : 1)); // assoc because we're dealing with pairs SCM entry = scm_assoc (key, accs); - if (entry == SCM_BOOL_F) + if (scm_is_false (entry)) entry = SCM_EOL; else entry = scm_cdr (entry); @@ -85,9 +84,9 @@ Accidental_placement::split_accidentals (Grob *accs, acs = scm_cdr (acs)) for (SCM s = scm_cdar (acs); scm_is_pair (s); s = scm_cdr (s)) { - Grob *a = unsmob_grob (scm_car (s)); + Grob *a = unsmob (scm_car (s)); - if (unsmob_grob (a->get_object ("tie")) + if (unsmob (a->get_object ("tie")) && !to_boolean (a->get_property ("forced"))) break_reminder->push_back (a); else @@ -237,7 +236,7 @@ build_apes (SCM accs) Accidental_placement_entry *ape = new Accidental_placement_entry; for (SCM t = scm_cdar (s); scm_is_pair (t); t = scm_cdr (t)) - ape->grobs_.push_back (unsmob_grob (scm_car (t))); + ape->grobs_.push_back (unsmob (scm_car (t))); apes.push_back (ape); } @@ -285,7 +284,7 @@ set_ape_skylines (Accidental_placement_entry *ape, offset -= a->extent (a, X_AXIS).length () + padding; } - if (Skyline_pair *sky = Skyline_pair::unsmob (a->get_property ("horizontal-skylines"))) + if (Skyline_pair *sky = unsmob (a->get_property ("horizontal-skylines"))) { Skyline_pair copy (*sky); copy.raise (a->relative_coordinate (common[X_AXIS], X_AXIS)); @@ -313,7 +312,7 @@ extract_heads_and_stems (vector const &apes) Grob *head = acc->get_parent (Y_AXIS); Grob *col = head->get_parent (X_AXIS); - if (Note_column::has_interface (col)) + if (has_interface (col)) note_cols.push_back (col); else ret.push_back (head); @@ -327,7 +326,7 @@ extract_heads_and_stems (vector const &apes) for (vsize i = note_cols.size (); i--;) { Grob *c = note_cols[i]->get_parent (X_AXIS); - if (Note_collision_interface::has_interface (c)) + if (has_interface (c)) { extract_grob_set (c, "elements", columns); concat (note_cols, columns); @@ -342,7 +341,7 @@ extract_heads_and_stems (vector const &apes) for (vsize i = ret.size (); i--;) if (Grob *s = Rhythmic_head::get_stem (ret[i])) ret.push_back (s); - + uniquify (ret); return ret; } @@ -371,7 +370,7 @@ build_heads_skyline (vector const &heads_and_stems, vector head_extents; for (vsize i = heads_and_stems.size (); i--;) head_extents.push_back (Box (heads_and_stems[i]->extent (common[X_AXIS], X_AXIS), - heads_and_stems[i]->pure_height (common[Y_AXIS], 0, INT_MAX))); + heads_and_stems[i]->pure_y_extent (common[Y_AXIS], 0, INT_MAX))); return Skyline (head_extents, Y_AXIS, LEFT); } @@ -418,7 +417,7 @@ position_apes (Grob *me, { Real mh = ape->horizontal_skylines_[d].max_height (); if (!isinf (mh)) - width.add_point (mh); + width.add_point (mh + offset); } last_offset = offset; @@ -470,7 +469,7 @@ MAKE_SCHEME_CALLBACK (Accidental_placement, calc_positioning_done, 1); SCM Accidental_placement::calc_positioning_done (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); if (!me->is_live ()) return SCM_BOOL_T; diff --git a/lily/accidental.cc b/lily/accidental.cc index ce05dfff72..4343c2dc5a 100644 --- a/lily/accidental.cc +++ b/lily/accidental.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ #include "paper-column.hh" #include "pitch.hh" #include "stencil.hh" +#include "system.hh" #include "skyline-pair.hh" Stencil @@ -43,51 +44,20 @@ parenthesize (Grob *me, Stencil m) return m; } -/* If this gets called before line breaking, we will return a non-trivial - extent even if we belong to a tie and won't actually get printed. */ -static SCM -get_extent (Grob *me, Axis a) -{ - Stencil *s = unsmob_stencil (Accidental_interface::get_stencil (me)); - - if (s) - return ly_interval2scm (s->extent (a)); - return ly_interval2scm (Interval ()); -} - -MAKE_SCHEME_CALLBACK (Accidental_interface, height, 1); -SCM -Accidental_interface::height (SCM smob) -{ - return get_extent (unsmob_grob (smob), Y_AXIS); -} - -MAKE_SCHEME_CALLBACK (Accidental_interface, width, 1); -SCM -Accidental_interface::width (SCM smob) -{ - return get_extent (unsmob_grob (smob), X_AXIS); -} - MAKE_SCHEME_CALLBACK (Accidental_interface, horizontal_skylines, 1); SCM Accidental_interface::horizontal_skylines (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); if (!me->is_live ()) return Skyline_pair ().smobbed_copy (); - /* - * Using the print function may trigger a suicide - * before line breaking. It is therefore `unpure' (c). - * We use the more basic get_stencil. - */ - Stencil *my_stencil = unsmob_stencil (get_stencil (me)); + Stencil *my_stencil = unsmob (me->get_property ("stencil")); if (!my_stencil) return Skyline_pair ().smobbed_copy (); Skyline_pair *sky = - Skyline_pair::unsmob + unsmob (Stencil::skylines_from_stencil (my_stencil->smobbed_copy (), 0.0, Y_AXIS)); @@ -116,41 +86,42 @@ Accidental_interface::horizontal_skylines (SCM smob) return sky->smobbed_copy (); } -MAKE_SCHEME_CALLBACK (Accidental_interface, pure_height, 3); +MAKE_SCHEME_CALLBACK (Accidental_interface, height, 1); SCM -Accidental_interface::pure_height (SCM smob, SCM start_scm, SCM) +Accidental_interface::height (SCM smob) { - Item *me = dynamic_cast (unsmob_grob (smob)); - int start = scm_to_int (start_scm); - int rank = me->get_column ()->get_rank (); - - if (to_boolean (me->get_property ("forced")) - || !unsmob_grob (me->get_object ("tie")) - || (rank == start + 1 && /* we are at the start of a line */ - !to_boolean (me->get_property ("hide-tied-accidental-after-break")))) - { - Stencil *s = unsmob_stencil (get_stencil (me)); - if (s) - return ly_interval2scm (s->extent (Y_AXIS)); - } + Grob *me = unsmob (smob); + Grob *tie = unsmob (me->get_object ("tie")); + + if (tie + && !to_boolean (me->get_property ("forced")) + && to_boolean (me->get_property ("hide-tied-accidental-after-break"))) + return ly_interval2scm (Interval ()); - return ly_interval2scm (Interval ()); + return Grob::stencil_height (smob); } -MAKE_SCHEME_CALLBACK (Accidental_interface, print, 1); +MAKE_SCHEME_CALLBACK (Accidental_interface, remove_tied, 1); SCM -Accidental_interface::print (SCM smob) +Accidental_interface::remove_tied (SCM smob) { - Grob *me = unsmob_grob (smob); - Grob *tie = unsmob_grob (me->get_object ("tie")); + Grob *me = unsmob (smob); + Grob *tie = unsmob (me->get_object ("tie")); if (tie + && !to_boolean (me->get_property ("forced")) && (to_boolean (me->get_property ("hide-tied-accidental-after-break")) - || (!tie->original () && !to_boolean (me->get_property ("forced"))))) - { - me->suicide (); - return SCM_EOL; - } + || !tie->original())) + me->suicide (); + + return SCM_UNSPECIFIED; +} + +MAKE_SCHEME_CALLBACK (Accidental_interface, print, 1); +SCM +Accidental_interface::print (SCM smob) +{ + Grob *me = unsmob (smob); return get_stencil (me); } @@ -163,15 +134,17 @@ Accidental_interface::get_stencil (Grob *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); + Stencil mol; if (!scm_is_string (glyph_name)) { me->warning (_f ("Could not find glyph-name for alteration %s", ly_scm_write_string (alt).c_str ())); - return SCM_EOL; + mol = fm->find_by_name ("noteheads.s1cross"); } + else + mol = fm->find_by_name (ly_scm2string (glyph_name)); - Stencil mol (fm->find_by_name (ly_scm2string (glyph_name))); if (to_boolean (me->get_property ("restore-first"))) { /* diff --git a/lily/align-interface.cc b/lily/align-interface.cc index 8a2a8d9b81..80a9dd3c08 100644 --- a/lily/align-interface.cc +++ b/lily/align-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,7 +36,7 @@ MAKE_SCHEME_CALLBACK (Align_interface, align_to_minimum_distances, 1); SCM Align_interface::align_to_minimum_distances (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); me->set_property ("positioning-done", SCM_BOOL_T); @@ -52,7 +52,7 @@ MAKE_SCHEME_CALLBACK (Align_interface, align_to_ideal_distances, 1); SCM Align_interface::align_to_ideal_distances (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); me->set_property ("positioning-done", SCM_BOOL_T); @@ -61,85 +61,73 @@ Align_interface::align_to_ideal_distances (SCM smob) return SCM_BOOL_T; } -/* for each grob, find its upper and lower skylines. If the grob has - an empty extent, delete it from the list instead. If the extent is - non-empty but there is no skyline available (or pure is true), just +/* Return upper and lower skylines for VerticalAxisGroup g. If the extent + is non-empty but there is no skyline available (or pure is true), just create a flat skyline from the bounding box */ // TODO(jneem): the pure and non-pure parts seem to share very little // code. Split them into 2 functions, perhaps? -static void -get_skylines (Grob *me, - vector *const elements, +static Skyline_pair +get_skylines (Grob *g, Axis a, - bool pure, int start, int end, - vector *const ret) + Grob *other_common, + bool pure, int start, int end) { - Grob *other_common = common_refpoint_of_array (*elements, me, other_axis (a)); + Skyline_pair skylines; - for (vsize i = elements->size (); i--;) + if (!pure) { - Grob *g = (*elements)[i]; - Skyline_pair skylines; - - if (!pure) - { - Skyline_pair *skys = Skyline_pair::unsmob (g->get_property (a == Y_AXIS - ? "vertical-skylines" - : "horizontal-skylines")); - if (skys) - skylines = *skys; - - /* This skyline was calculated relative to the grob g. In order to compare it to - skylines belonging to other grobs, we need to shift it so that it is relative - to the common reference. */ - Real offset = g->relative_coordinate (other_common, other_axis (a)); - skylines.shift (offset); - } - else + Skyline_pair *skys = unsmob (g->get_property (a == Y_AXIS + ? "vertical-skylines" + : "horizontal-skylines")); + if (skys) + skylines = *skys; + + /* This skyline was calculated relative to the grob g. In order to compare it to + skylines belonging to other grobs, we need to shift it so that it is relative + to the common reference. */ + Real offset = g->relative_coordinate (other_common, other_axis (a)); + skylines.shift (offset); + } + else if (Hara_kiri_group_spanner::request_suicide (g, start, end)) + return skylines; + else + { + assert (a == Y_AXIS); + Interval extent = g->pure_y_extent (g, start, end); + + // This is a hack to get better accuracy on the pure-height of VerticalAlignment. + // It's quite common for a treble clef to be the highest element of one system + // and for a low note (or lyrics) to be the lowest note on another. The two will + // never collide, but the pure-height stuff only works with bounding boxes, so it + // doesn't know that. The result is a significant over-estimation of the pure-height, + // especially on systems with many staves. To correct for this, we build a skyline + // in two parts: the part we did above contains most of the grobs (note-heads, etc.) + // while the bit we're about to do only contains the breakable grobs at the beginning + // of the system. This way, the tall treble clefs are only compared with the treble + // clefs of the other staff and they will be ignored if the staff above is, for example, + // lyrics. + if (has_interface (g)) { - assert (a == Y_AXIS); - Interval extent = g->pure_height (g, start, end); - - // This is a hack to get better accuracy on the pure-height of VerticalAlignment. - // It's quite common for a treble clef to be the highest element of one system - // and for a low note (or lyrics) to be the lowest note on another. The two will - // never collide, but the pure-height stuff only works with bounding boxes, so it - // doesn't know that. The result is a significant over-estimation of the pure-height, - // especially on systems with many staves. To correct for this, we build a skyline - // in two parts: the part we did above contains most of the grobs (note-heads, etc.) - // while the bit we're about to do only contains the breakable grobs at the beginning - // of the system. This way, the tall treble clefs are only compared with the treble - // clefs of the other staff and they will be ignored if the staff above is, for example, - // lyrics. - if (Axis_group_interface::has_interface (g) - && !Hara_kiri_group_spanner::request_suicide (g, start, end)) - { - extent = Axis_group_interface::rest_of_line_pure_height (g, start, end); - Interval begin_of_line_extent = Axis_group_interface::begin_of_line_pure_height (g, start); - if (!begin_of_line_extent.is_empty ()) - { - Box b; - b[a] = begin_of_line_extent; - b[other_axis (a)] = Interval (-infinity_f, -1); - skylines.insert (b, other_axis (a)); - } - } - - if (!extent.is_empty ()) + extent = Axis_group_interface::rest_of_line_pure_height (g, start, end); + Interval begin_of_line_extent = Axis_group_interface::begin_of_line_pure_height (g, start); + if (!begin_of_line_extent.is_empty ()) { Box b; - b[a] = extent; - b[other_axis (a)] = Interval (0, infinity_f); + b[a] = begin_of_line_extent; + b[other_axis (a)] = Interval (-infinity_f, -1); skylines.insert (b, other_axis (a)); } } - if (skylines.is_empty ()) - elements->erase (elements->begin () + i); - else - ret->push_back (skylines); + if (!extent.is_empty ()) + { + Box b; + b[a] = extent; + b[other_axis (a)] = Interval (0, infinity_f); + skylines.insert (b, other_axis (a)); + } } - reverse (*ret); + return skylines; } vector @@ -177,7 +165,7 @@ Align_interface::get_minimum_translations_without_min_dist (Grob *me, // else centered dynamics will break when there is a fixed alignment). vector Align_interface::internal_get_minimum_translations (Grob *me, - vector const &all_grobs, + vector const &elems, Axis a, bool include_fixed_spacing, bool pure, int start, int end) @@ -191,7 +179,7 @@ Align_interface::internal_get_minimum_translations (Grob *me, SCM fv = ly_assoc_get (scm_cons (scm_from_int (start), scm_from_int (end)), me->get_property ("minimum-translations-alist"), SCM_EOL); - if (fv != SCM_EOL) + if (!scm_is_null (fv)) return ly_scm2floatvector (fv); } @@ -204,15 +192,14 @@ Align_interface::internal_get_minimum_translations (Grob *me, Direction stacking_dir = robust_scm2dir (me->get_property ("stacking-dir"), DOWN); - vector elems (all_grobs); // writable copy - vector skylines; - get_skylines (me, &elems, a, pure, start, end, &skylines); + Grob *other_common = common_refpoint_of_array (elems, me, other_axis (a)); Real where = 0; Real default_padding = robust_scm2double (me->get_property ("padding"), 0.0); vector translates; Skyline down_skyline (stacking_dir); + Grob *last_nonempty_element = 0; Real last_spaceable_element_pos = 0; Grob *last_spaceable_element = 0; Skyline last_spaceable_skyline (stacking_dir); @@ -222,14 +209,26 @@ Align_interface::internal_get_minimum_translations (Grob *me, Real dy = 0; Real padding = default_padding; - if (j == 0) - dy = skylines[j][-stacking_dir].max_height () + padding; + Skyline_pair skyline = get_skylines (elems[j], a, other_common, pure, start, end); + + if (skyline.is_empty ()) + { + translates.push_back (where); + continue; + } + + if (!last_nonempty_element) + { + dy = skyline[-stacking_dir].max_height () + padding; + for (vsize k = j; k-- > 0;) + translates[k] = stacking_dir * dy; + } else { - SCM spec = Page_layout_problem::get_spacing_spec (elems[j - 1], elems[j], pure, start, end); + SCM spec = Page_layout_problem::get_spacing_spec (last_nonempty_element, elems[j], pure, start, end); Page_layout_problem::read_spacing_spec (spec, &padding, ly_symbol2scm ("padding")); - dy = down_skyline.distance (skylines[j][-stacking_dir]) + padding; + dy = down_skyline.distance (skyline[-stacking_dir]) + padding; Real spec_distance = 0; if (Page_layout_problem::read_spacing_spec (spec, &spec_distance, ly_symbol2scm ("minimum-distance"))) @@ -249,7 +248,7 @@ Align_interface::internal_get_minimum_translations (Grob *me, Page_layout_problem::read_spacing_spec (spec, &spaceable_padding, ly_symbol2scm ("padding")); - dy = max (dy, (last_spaceable_skyline.distance (skylines[j][-stacking_dir]) + dy = max (dy, (last_spaceable_skyline.distance (skyline[-stacking_dir]) + stacking_dir * (last_spaceable_element_pos - where) + spaceable_padding)); Real spaceable_min_distance = 0; @@ -263,12 +262,9 @@ Align_interface::internal_get_minimum_translations (Grob *me, } } - if (isinf (dy)) /* if the skyline is empty, maybe max_height is infinity_f */ - dy = 0.0; - dy = max (0.0, dy); down_skyline.raise (-stacking_dir * dy); - down_skyline.merge (skylines[j][stacking_dir]); + down_skyline.merge (skyline[stacking_dir]); where += stacking_dir * dy; translates.push_back (where); @@ -279,32 +275,18 @@ Align_interface::internal_get_minimum_translations (Grob *me, last_spaceable_element_pos = where; last_spaceable_skyline = down_skyline; } - } - - // So far, we've computed the translates for all the non-empty elements. - // Here, we set the translates for the empty elements: an empty element - // gets the same translation as the last non-empty element before it. - vector all_translates; - if (!translates.empty ()) - { - Real w = translates[0]; - for (vsize i = 0, j = 0; j < all_grobs.size (); j++) - { - if (i < elems.size () && all_grobs[j] == elems[i]) - w = translates[i++]; - all_translates.push_back (w); - } + last_nonempty_element = elems[j]; } if (pure) { SCM mta = me->get_property ("minimum-translations-alist"); mta = scm_cons (scm_cons (scm_cons (scm_from_int (start), scm_from_int (end)), - ly_floatvector2scm (all_translates)), + ly_floatvector2scm (translates)), mta); me->set_property ("minimum-translations-alist", mta); } - return all_translates; + return translates; } void @@ -371,11 +353,11 @@ void Align_interface::set_ordered (Grob *me) { SCM ga_scm = me->get_object ("elements"); - Grob_array *ga = unsmob_grob_array (ga_scm); + Grob_array *ga = unsmob (ga_scm); if (!ga) { ga_scm = Grob_array::make_array (); - ga = unsmob_grob_array (ga_scm); + ga = unsmob (ga_scm); me->set_object ("elements", ga_scm); } @@ -385,7 +367,7 @@ Align_interface::set_ordered (Grob *me) ADD_INTERFACE (Align_interface, "Order grobs from top to bottom, left to right, right to left" " or bottom to top. For vertical alignments of staves, the" - " @code{break-system-details} of the left" + " @code{line-break-system-details} of the left" " @rinternals{NonMusicalPaperColumn} may be set to tune" " vertical spacing.", diff --git a/lily/all-font-metrics-scheme.cc b/lily/all-font-metrics-scheme.cc index aef6be4745..b29ea4bf4b 100644 --- a/lily/all-font-metrics-scheme.cc +++ b/lily/all-font-metrics-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -20,13 +20,17 @@ #include "all-font-metrics.hh" #include "main.hh" +#include "protected-scm.hh" + +All_font_metrics *all_fonts_global = 0; +Protected_scm all_fonts_global_scm; LY_DEFINE (ly_reset_all_fonts, "ly:reset-all-fonts", 0, 0, 0, (), "Forget all about previously loaded fonts.") { - delete all_fonts_global; all_fonts_global = new All_font_metrics (global_path.to_string ()); + all_fonts_global_scm = all_fonts_global->unprotect (); return SCM_UNSPECIFIED; } diff --git a/lily/all-font-metrics.cc b/lily/all-font-metrics.cc index cf0d4e9086..ab4f2a4ce4 100644 --- a/lily/all-font-metrics.cc +++ b/lily/all-font-metrics.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,9 +42,16 @@ All_font_metrics::get_index_to_charcode_map (const string &filename, All_font_metrics::All_font_metrics (const string &path) { - otf_dict_ = new Scheme_hash_table; +#if HAVE_PANGO_FT2 + pango_dict_ = 0; +#endif + + otf_dict_ = 0; + smobify_self (); + otf_dict_ = unsmob (Scheme_hash_table::make_smob ()); #if HAVE_PANGO_FT2 + pango_dict_ = unsmob (Scheme_hash_table::make_smob ()); PangoFontMap *pfm = pango_ft2_font_map_new (); pango_ft2_fontmap_ = PANGO_FT2_FONT_MAP (pfm); @@ -52,8 +59,6 @@ All_font_metrics::All_font_metrics (const string &path) pango_dpi_ = PANGO_RESOLUTION; pango_ft2_font_map_set_resolution (pango_ft2_fontmap_, pango_dpi_, pango_dpi_); - - pango_dict_ = new Scheme_hash_table; #endif search_path_.parse_path (path); @@ -61,16 +66,21 @@ All_font_metrics::All_font_metrics (const string &path) All_font_metrics::~All_font_metrics () { - otf_dict_->unprotect (); - #if HAVE_PANGO_FT2 - pango_dict_->unprotect (); g_object_unref (pango_ft2_fontmap_); #endif } -All_font_metrics::All_font_metrics (All_font_metrics const &) +SCM +All_font_metrics::mark_smob () const { +#if HAVE_PANGO_FT2 + if (pango_dict_) + scm_gc_mark (pango_dict_->self_scm ()); +#endif + if (otf_dict_) + return otf_dict_->self_scm (); + return SCM_UNDEFINED; } #if HAVE_PANGO_FT2 @@ -103,7 +113,7 @@ All_font_metrics::find_pango_font (PangoFontDescription const *description, scm_from_double (1.0)); } g_free (pango_fn); - return dynamic_cast (unsmob_metrics (val)); + return unsmob (val); } #endif @@ -128,15 +138,15 @@ All_font_metrics::find_otf (const string &name) debug_output ("]", false); - unsmob_metrics (val)->file_name_ = file_name; + unsmob (val)->file_name_ = file_name; SCM name_string = ly_string2scm (name); - unsmob_metrics (val)->description_ = scm_cons (name_string, + unsmob (val)->description_ = scm_cons (name_string, scm_from_double (1.0)); otf_dict_->set (sname, val); - unsmob_metrics (val)->unprotect (); + unsmob (val)->unprotect (); } - return dynamic_cast (unsmob_metrics (val)); + return unsmob (val); } Font_metric * @@ -151,5 +161,3 @@ All_font_metrics::find_font (const string &name) return f; } - -All_font_metrics *all_fonts_global; diff --git a/lily/ambitus-engraver.cc b/lily/ambitus-engraver.cc index 99d3f8a335..665c83a4cc 100644 --- a/lily/ambitus-engraver.cc +++ b/lily/ambitus-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Juergen Reuter + Copyright (C) 2002--2015 Juergen Reuter Han-Wen Nienhuys in_event_class ("note-event")) + if (nr && nr->in_event_class ("note-event") + && !to_boolean (info.grob ()->get_property ("ignore-ambitus"))) { SCM p = nr->get_property ("pitch"); /* If the engraver is added to a percussion context, filter out unpitched note heads. */ - if (!unsmob_pitch (p)) + if (!unsmob (p)) return; - Pitch pitch = *unsmob_pitch (p); + Pitch pitch = *unsmob (p); Drul_array expands = pitch_interval_.add_point (pitch); if (expands[UP]) causes_[UP] = nr; @@ -173,11 +174,11 @@ Ambitus_engraver::finalize () scm_from_int (p.get_notename ())), start_key_sig_); - if (handle == SCM_BOOL_F) + if (scm_is_false (handle)) handle = scm_assoc (scm_from_int (p.get_notename ()), start_key_sig_); - Rational sig_alter = (handle != SCM_BOOL_F) + Rational sig_alter = (scm_is_true (handle)) ? robust_scm2rational (scm_cdr (handle), Rational (0)) : Rational (0); @@ -217,7 +218,12 @@ Ambitus_engraver::finalize () } } -ADD_ACKNOWLEDGER (Ambitus_engraver, note_head); +void +Ambitus_engraver::boot () +{ + ADD_ACKNOWLEDGER (Ambitus_engraver, note_head); +} + ADD_TRANSLATOR (Ambitus_engraver, /* doc */ "Create an ambitus.", @@ -230,7 +236,7 @@ ADD_TRANSLATOR (Ambitus_engraver, "AmbitusNoteHead ", /* read */ - "keySignature " + "keyAlterations " "middleCClefPosition " "middleCOffset ", diff --git a/lily/apply-context-iterator.cc b/lily/apply-context-iterator.cc index 832d74ce1a..5ed628491c 100644 --- a/lily/apply-context-iterator.cc +++ b/lily/apply-context-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,9 +35,9 @@ void Apply_context_iterator::process (Moment m) { SCM proc = get_music ()->get_property ("procedure"); - if (ly_is_procedure (proc)) - scm_call_1 (proc, get_outlet ()->self_scm ()); + with_location (get_music ()->get_property ("origin"), + proc, get_outlet ()->self_scm ()); else get_music ()->origin ()->warning (_ ("\\applycontext argument is not a procedure")); diff --git a/lily/arpeggio-engraver.cc b/lily/arpeggio-engraver.cc index 2a6d3771d7..d308a43068 100644 --- a/lily/arpeggio-engraver.cc +++ b/lily/arpeggio-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,7 +43,7 @@ public: protected: void process_music (); void stop_translation_timestep (); - DECLARE_TRANSLATOR_LISTENER (arpeggio); + void listen_arpeggio (Stream_event *); private: Item *arpeggio_; Stream_event *arpeggio_event_; @@ -55,7 +55,6 @@ Arpeggio_engraver::Arpeggio_engraver () arpeggio_event_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Arpeggio_engraver, arpeggio); void Arpeggio_engraver::listen_arpeggio (Stream_event *ev) { ASSIGN_EVENT_ONCE (arpeggio_event_, ev); @@ -109,9 +108,15 @@ Arpeggio_engraver::stop_translation_timestep () arpeggio_event_ = 0; } -ADD_ACKNOWLEDGER (Arpeggio_engraver, stem); -ADD_ACKNOWLEDGER (Arpeggio_engraver, rhythmic_head); -ADD_ACKNOWLEDGER (Arpeggio_engraver, note_column); + +void +Arpeggio_engraver::boot () +{ + ADD_LISTENER (Arpeggio_engraver, arpeggio); + ADD_ACKNOWLEDGER (Arpeggio_engraver, stem); + ADD_ACKNOWLEDGER (Arpeggio_engraver, rhythmic_head); + ADD_ACKNOWLEDGER (Arpeggio_engraver, note_column); +} ADD_TRANSLATOR (Arpeggio_engraver, /* doc */ diff --git a/lily/arpeggio.cc b/lily/arpeggio.cc index 4de173da06..5ba2e59279 100644 --- a/lily/arpeggio.cc +++ b/lily/arpeggio.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -60,7 +60,7 @@ MAKE_SCHEME_CALLBACK (Arpeggio, calc_cross_staff, 1); SCM Arpeggio::calc_cross_staff (SCM grob) { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); extract_grob_set (me, "stems", stems); Grob *vag = 0; @@ -83,7 +83,7 @@ MAKE_SCHEME_CALLBACK (Arpeggio, calc_positions, 1); SCM Arpeggio::calc_positions (SCM grob) { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); Grob *common = get_common_y (me); /* @@ -116,7 +116,7 @@ MAKE_SCHEME_CALLBACK (Arpeggio, print, 1); SCM Arpeggio::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Interval heads = robust_scm2interval (me->get_property ("positions"), Interval ()) * Staff_symbol_referencer::staff_space (me); @@ -184,7 +184,7 @@ MAKE_SCHEME_CALLBACK (Arpeggio, brew_chord_bracket, 1); SCM Arpeggio::brew_chord_bracket (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Interval heads = robust_scm2interval (me->get_property ("positions"), Interval ()) * Staff_symbol_referencer::staff_space (me); @@ -203,7 +203,7 @@ MAKE_SCHEME_CALLBACK (Arpeggio, brew_chord_slur, 1); SCM Arpeggio::brew_chord_slur (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); SCM dash_definition = me->get_property ("dash-definition"); Interval heads = robust_scm2interval (me->get_property ("positions"), Interval ()) @@ -230,7 +230,7 @@ MAKE_SCHEME_CALLBACK (Arpeggio, width, 1); SCM Arpeggio::width (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return ly_interval2scm (get_squiggle (me).extent (X_AXIS)); } @@ -238,7 +238,7 @@ MAKE_SCHEME_CALLBACK (Arpeggio, pure_height, 3); SCM Arpeggio::pure_height (SCM smob, SCM, SCM) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); if (to_boolean (me->get_property ("cross-staff"))) return ly_interval2scm (Interval ()); diff --git a/lily/articulations.cc b/lily/articulations.cc index 9034494965..334e438682 100644 --- a/lily/articulations.cc +++ b/lily/articulations.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Carl Sorensen + Copyright (C) 2010--2015 Carl Sorensen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -56,7 +56,7 @@ articulation_list (vector note_events, for (SCM s = event->get_property ("articulations"); !articulation_event && scm_is_pair (s); s = scm_cdr (s)) { - Stream_event *art = unsmob_stream_event (scm_car (s)); + Stream_event *art = unsmob (scm_car (s)); if (art->in_event_class (articulation_name)) articulation_event = art; diff --git a/lily/audio-column.cc b/lily/audio-column.cc index 64203fd937..04b39c3b1e 100644 --- a/lily/audio-column.cc +++ b/lily/audio-column.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/audio-element-info.cc b/lily/audio-element-info.cc index 85a74cccaf..6e6b7a54e6 100644 --- a/lily/audio-element-info.cc +++ b/lily/audio-element-info.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/audio-element.cc b/lily/audio-element.cc index 21105a1eb7..87ed7fcb46 100644 --- a/lily/audio-element.cc +++ b/lily/audio-element.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,5 +31,5 @@ Audio_element::~Audio_element () char const * Audio_element::name () const { - return this->class_name (); + return class_name (); } diff --git a/lily/audio-item.cc b/lily/audio-item.cc index a41357b28f..97a15d552a 100644 --- a/lily/audio-item.cc +++ b/lily/audio-item.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,11 +44,13 @@ Audio_item::Audio_item () { } -Audio_note::Audio_note (Pitch p, Moment m, bool tie_event, Pitch transposing) +Audio_note::Audio_note (Pitch p, Moment m, bool tie_event, Pitch transposing, + int velocity) : pitch_ (p), length_mom_ (m), transposing_ (transposing), dynamic_ (0), + extra_velocity_ (velocity), tied_ (0), tie_event_ (tie_event) { @@ -215,6 +217,7 @@ Audio_control_function_value_change::context_properties_[] = { // property name, enum constant, lower bound for range, upper bound for range { "midiBalance", BALANCE, -1.0, 1.0 }, { "midiPanPosition", PAN_POSITION, -1.0, 1.0 }, + { "midiExpression", EXPRESSION, 0.0, 1.0 }, { "midiReverbLevel", REVERB_LEVEL, 0.0, 1.0 }, { "midiChorusLevel", CHORUS_LEVEL, 0.0, 1.0 }, // extra element to signify the end of the mapping, must be kept last diff --git a/lily/audio-staff.cc b/lily/audio-staff.cc index 1877464f45..0e2c8205ba 100644 --- a/lily/audio-staff.cc +++ b/lily/audio-staff.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,11 +35,11 @@ Audio_staff::Audio_staff () } void -Audio_staff::output (Midi_stream &midi_stream, int track, bool port) +Audio_staff::output (Midi_stream &midi_stream, int track, bool port, int start_tick) { Midi_track midi_track (track, port); - Midi_walker i (this, &midi_track); + Midi_walker i (this, &midi_track, start_tick); for (; i.ok (); i++) i.process (); diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc index b5c7f88ce6..3f03362b3b 100644 --- a/lily/auto-beam-engraver.cc +++ b/lily/auto-beam-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Jan Nieuwenhuizen + Copyright (C) 1999--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ #include "context-handle.hh" #include "duration.hh" #include "engraver.hh" +#include "grob-properties.hh" #include "item.hh" #include "rest.hh" #include "spanner.hh" @@ -44,12 +45,12 @@ protected: virtual void finalize (); virtual void derived_mark () const; - DECLARE_ACKNOWLEDGER (rest); - DECLARE_ACKNOWLEDGER (beam); - DECLARE_ACKNOWLEDGER (bar_line); - DECLARE_ACKNOWLEDGER (breathing_sign); - DECLARE_ACKNOWLEDGER (stem); - DECLARE_TRANSLATOR_LISTENER (beam_forbid); + void acknowledge_rest (Grob_info); + void acknowledge_beam (Grob_info); + void acknowledge_bar_line (Grob_info); + void acknowledge_breathing_sign (Grob_info); + void acknowledge_stem (Grob_info); + void listen_beam_forbid (Stream_event *); private: virtual bool test_moment (Direction, Moment, Moment); @@ -152,13 +153,13 @@ Auto_beam_engraver::Auto_beam_engraver () process_acknowledged_count_ = 0; stems_ = 0; shortest_mom_ = Moment (Rational (1, 4)); + extend_mom_ = Moment (-1); finished_beam_ = 0; finished_grouping_ = 0; grouping_ = 0; beam_settings_ = SCM_EOL; } -IMPLEMENT_TRANSLATOR_LISTENER (Auto_beam_engraver, beam_forbid); void Auto_beam_engraver::listen_beam_forbid (Stream_event *ev) { @@ -168,12 +169,11 @@ Auto_beam_engraver::listen_beam_forbid (Stream_event *ev) bool Auto_beam_engraver::test_moment (Direction dir, Moment test_mom, Moment dur) { - return scm_call_4 (get_property ("autoBeamCheck"), - context ()->self_scm (), - scm_from_int (dir), - test_mom.smobbed_copy (), - dur.smobbed_copy ()) - != SCM_BOOL_F; + return scm_is_true (scm_call_4 (get_property ("autoBeamCheck"), + context ()->self_scm (), + scm_from_int (dir), + test_mom.smobbed_copy (), + dur.smobbed_copy ())); } void @@ -222,8 +222,7 @@ Auto_beam_engraver::create_beam () Beam::add_stem (beam, (*stems_)[i]); Grob_info i = make_grob_info (beam, (*stems_)[0]->self_scm ()); - i.rerouting_daddy_context_ = beam_start_context_.get_context (); - announce_grob (i); + announce_grob (i, beam_start_context_.get_context ()); return beam; } @@ -240,7 +239,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_settings_ = Grob_property_info (context (), ly_symbol2scm ("Beam")).updated (); beam_start_context_.set_context (context ()->get_parent_context ()); beam_start_moment_ = now_mom (); @@ -282,9 +281,8 @@ Auto_beam_engraver::end_beam () if (finished_beam_) { Grob_info i = make_grob_info (finished_beam_, SCM_EOL); - i.rerouting_daddy_context_ = beam_start_context_.get_context (); - announce_end_grob (i); + announce_end_grob (i, beam_start_context_.get_context ()); finished_grouping_ = grouping_; finished_beaming_options_ = beaming_options_; } @@ -394,7 +392,7 @@ Auto_beam_engraver::acknowledge_stem (Grob_info info) return; } - int durlog = unsmob_duration (ev->get_property ("duration"))->duration_log (); + int durlog = unsmob (ev->get_property ("duration"))->duration_log (); if (durlog <= 2) { @@ -410,10 +408,10 @@ Auto_beam_engraver::acknowledge_stem (Grob_info info) if (!is_same_grace_state (beam_start_location_, now)) return; - Duration *stem_duration = unsmob_duration (ev->get_property ("duration")); + Duration *stem_duration = unsmob (ev->get_property ("duration")); Moment dur = stem_duration->get_length (); - //Moment dur = unsmob_duration (ev->get_property ("duration"))->get_length (); + //Moment dur = unsmob (ev->get_property ("duration"))->get_length (); Moment measure_now = measure_position (context ()); bool recheck_needed = false; @@ -436,7 +434,7 @@ Auto_beam_engraver::acknowledge_stem (Grob_info info) durlog - 2, Stem::is_invisible (stem), stem_duration->factor (), - (stem->get_property ("tuplet-start") == SCM_BOOL_T)); + (to_boolean (stem->get_property ("tuplet-start")))); stems_->push_back (stem); last_add_mom_ = now; extend_mom_ = max (extend_mom_, now) + get_event_length (ev, now); @@ -542,11 +540,17 @@ Auto_beam_engraver::process_acknowledged () process_acknowledged_count_++; } -ADD_ACKNOWLEDGER (Auto_beam_engraver, stem); -ADD_ACKNOWLEDGER (Auto_beam_engraver, bar_line); -ADD_ACKNOWLEDGER (Auto_beam_engraver, beam); -ADD_ACKNOWLEDGER (Auto_beam_engraver, breathing_sign); -ADD_ACKNOWLEDGER (Auto_beam_engraver, rest); +void +Auto_beam_engraver::boot () +{ + ADD_LISTENER (Auto_beam_engraver, beam_forbid); + ADD_ACKNOWLEDGER (Auto_beam_engraver, stem); + ADD_ACKNOWLEDGER (Auto_beam_engraver, bar_line); + ADD_ACKNOWLEDGER (Auto_beam_engraver, beam); + ADD_ACKNOWLEDGER (Auto_beam_engraver, breathing_sign); + ADD_ACKNOWLEDGER (Auto_beam_engraver, rest); +} + ADD_TRANSLATOR (Auto_beam_engraver, /* doc */ "Generate beams based on measure characteristics and observed" @@ -575,7 +579,7 @@ ADD_TRANSLATOR (Auto_beam_engraver, class Grace_auto_beam_engraver : public Auto_beam_engraver { TRANSLATOR_DECLARATIONS (Grace_auto_beam_engraver); - DECLARE_TRANSLATOR_LISTENER (beam_forbid); + TRANSLATOR_INHERIT (Auto_beam_engraver); private: Moment last_grace_start_; // Full starting time of last grace group @@ -592,13 +596,6 @@ Grace_auto_beam_engraver::Grace_auto_beam_engraver () // not considered. } -IMPLEMENT_TRANSLATOR_LISTENER (Grace_auto_beam_engraver, beam_forbid); -void -Grace_auto_beam_engraver::listen_beam_forbid (Stream_event *ev) -{ - Auto_beam_engraver::listen_beam_forbid (ev); -} - bool Grace_auto_beam_engraver::is_same_grace_state (Moment, Moment) { @@ -638,11 +635,17 @@ Grace_auto_beam_engraver::test_moment (Direction dir, Moment test_mom, Moment) return !test_mom.grace_part_; } -ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, stem); -ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, bar_line); -ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, beam); -ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, breathing_sign); -ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, rest); +void +Grace_auto_beam_engraver::boot () +{ + ADD_LISTENER (Grace_auto_beam_engraver, beam_forbid); + ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, stem); + ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, bar_line); + ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, beam); + ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, breathing_sign); + ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, rest); +} + ADD_TRANSLATOR (Grace_auto_beam_engraver, /* doc */ "Generates one autobeam group across an entire grace phrase. " diff --git a/lily/auto-change-iterator.cc b/lily/auto-change-iterator.cc index 1efa379e9d..55ff27d316 100644 --- a/lily/auto-change-iterator.cc +++ b/lily/auto-change-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,149 +17,25 @@ along with LilyPond. If not, see . */ -#include "context.hh" -#include "direction.hh" -#include "international.hh" -#include "music.hh" -#include "music-wrapper-iterator.hh" +#include "change-iterator.hh" +#include "change-sequence-iterator.hh" -class Auto_change_iterator : public Music_wrapper_iterator +class Auto_change_iterator : public Change_sequence_iterator { public: DECLARE_SCHEME_CALLBACK (constructor, ()); + Auto_change_iterator () {} - Auto_change_iterator (); - -protected: - virtual void do_quit (); - virtual void construct_children (); - virtual void process (Moment); - vector pending_pitch (Moment) const; private: - SCM split_list_; - Direction where_dir_; - void change_to (Music_iterator *, SCM, const string&); - Moment start_moment_; - - Context_handle up_; - Context_handle down_; + virtual void change_to (const string &id); }; void -Auto_change_iterator::change_to (Music_iterator *it, SCM to_type_sym, - const string &to_id) -{ - Context *current = it->get_outlet (); - Context *last = 0; - - /* - Cut & Paste from Change_iterator (ugh). - - TODO: abstract this function - */ - - /* find the type of translator that we're changing. - - If \translator Staff = bass, then look for Staff = * - */ - while (current && !current->is_alias (to_type_sym)) - { - last = current; - current = current->get_parent_context (); - } - - if (current && current->id_string () == to_id) - { - string msg; - msg += _f ("cannot change, already in translator: %s", to_id); - } - - if (current) - { - if (last) - { - Context *dest - = it->get_outlet ()->find_create_context (to_type_sym, to_id, SCM_EOL); - - send_stream_event (last, "ChangeParent", get_music ()->origin (), - ly_symbol2scm ("context"), dest->self_scm ()); - } - else - { - /* - We could change the current translator's id, but that would make - errors hard to catch - - */ - ; - } - } -} - -void -Auto_change_iterator::process (Moment m) -{ - Music_wrapper_iterator::process (m); - - Moment now = get_outlet ()->now_mom (); - Moment *splitm = 0; - if (start_moment_.main_part_.is_infinity () && start_moment_ < 0) - start_moment_ = now; - - for (; scm_is_pair (split_list_); split_list_ = scm_cdr (split_list_)) - { - splitm = unsmob_moment (scm_caar (split_list_)); - if ((*splitm + start_moment_) > now) - break; - - SCM tag = scm_cdar (split_list_); - Direction d = to_dir (tag); - - if (d && d != where_dir_) - { - where_dir_ = d; - string to_id = (d >= 0) ? "up" : "down"; - change_to (child_iter_, - ly_symbol2scm ("Staff"), - to_id); - } - } -} - -Auto_change_iterator::Auto_change_iterator () -{ - where_dir_ = CENTER; - split_list_ = SCM_EOL; -} - -void -Auto_change_iterator::construct_children () -{ - split_list_ = get_music ()->get_property ("split-list"); - start_moment_ = get_outlet ()->now_mom (); - - SCM props = get_outlet ()->get_property ("trebleStaffProperties"); - Context *up = get_outlet ()->find_create_context (ly_symbol2scm ("Staff"), - "up", props); - - props = get_outlet ()->get_property ("bassStaffProperties"); - Context *down = get_outlet ()->find_create_context (ly_symbol2scm ("Staff"), - "down", props); - - up_.set_context (up); - down_.set_context (down); - - Context *voice = up->find_create_context (ly_symbol2scm ("Voice"), - "", SCM_EOL); - set_context (voice); - Music_wrapper_iterator::construct_children (); -} - -void -Auto_change_iterator::do_quit () +Auto_change_iterator::change_to (const string &id) { - up_.set_context (0); - down_.set_context (0); + // N.B. change_to() returns an error message. Silence is the legacy + // behavior here, but maybe that should be changed. + Change_iterator::change_to (*child_iter_, ly_symbol2scm ("Staff"), id); } IMPLEMENT_CTOR_CALLBACK (Auto_change_iterator); diff --git a/lily/axis-group-engraver.cc b/lily/axis-group-engraver.cc index 295ba8b403..2a5f71e275 100644 --- a/lily/axis-group-engraver.cc +++ b/lily/axis-group-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,7 +43,7 @@ protected: void process_music (); virtual void initialize (); virtual void finalize (); - DECLARE_ACKNOWLEDGER (grob); + void acknowledge_grob (Grob_info); void process_acknowledged (); virtual Spanner *get_spanner (); virtual void add_element (Grob *); @@ -89,7 +89,7 @@ Axis_group_engraver::process_music () if (!staffline_ && active_) { staffline_ = get_spanner (); - Grob *it = unsmob_grob (get_property ("currentCommandColumn")); + Grob *it = unsmob (get_property ("currentCommandColumn")); staffline_->set_bound (LEFT, it); } interesting_ = get_property ("keepAliveInterfaces"); @@ -106,7 +106,7 @@ Axis_group_engraver::finalize () { if (staffline_) { - Grob *it = unsmob_grob (get_property ("currentCommandColumn")); + Grob *it = unsmob (get_property ("currentCommandColumn")); staffline_->set_bound (RIGHT, it); Pointer_group_interface::set_ordered (staffline_, ly_symbol2scm ("elements"), false); @@ -116,15 +116,20 @@ Axis_group_engraver::finalize () void Axis_group_engraver::acknowledge_grob (Grob_info i) { - if (staffline_) - elts_.push_back (i.grob ()); + if (!staffline_) + return; - if (staffline_ && to_boolean(staffline_->get_property("remove-empty"))) + elts_.push_back (i.grob ()); + + if (to_boolean (staffline_->get_property ("remove-empty"))) { for (SCM s = interesting_; scm_is_pair (s); s = scm_cdr (s)) { if (i.grob ()->internal_has_interface (scm_car (s))) - Hara_kiri_group_spanner::add_interesting_item (staffline_, i.grob ()); + { + Hara_kiri_group_spanner::add_interesting_item (staffline_, i.grob ()); + break; + } } } } @@ -141,7 +146,7 @@ Axis_group_engraver::process_acknowledged () for (vsize i = 0; i < elts_.size (); i++) { - if (!unsmob_grob (elts_[i]->get_object ("axis-group-parent-Y"))) + if (!unsmob (elts_[i]->get_object ("axis-group-parent-Y"))) { if (staffline_->get_parent (Y_AXIS) && staffline_->get_parent (Y_AXIS) == elts_[i]) @@ -165,7 +170,12 @@ Axis_group_engraver::add_element (Grob *e) Axis_group_interface::add_element (staffline_, e); } -ADD_ACKNOWLEDGER (Axis_group_engraver, grob); + +void +Axis_group_engraver::boot () +{ + ADD_ACKNOWLEDGER (Axis_group_engraver, grob); +} ADD_TRANSLATOR (Axis_group_engraver, /* doc */ diff --git a/lily/axis-group-interface-scheme.cc b/lily/axis-group-interface-scheme.cc index 69b7c82fdf..ed47496fde 100644 --- a/lily/axis-group-interface-scheme.cc +++ b/lily/axis-group-interface-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ LY_DEFINE (ly_relative_group_extent, "ly:relative-group-extent", "Determine the extent of @var{elements} relative to @var{common} in the" " @var{axis} direction.") { - Grob_array *ga = unsmob_grob_array (elements); + Grob_array *ga = unsmob (elements); SCM_ASSERT_TYPE (ga || scm_is_pair (elements), elements, SCM_ARG1, __FUNCTION__, "list or Grob_array"); LY_ASSERT_SMOB (Grob, common, 2); @@ -37,15 +37,29 @@ LY_DEFINE (ly_relative_group_extent, "ly:relative-group-extent", if (!ga) { for (SCM s = elements; scm_is_pair (s); s = scm_cdr (s)) - elts.push_back (unsmob_grob (scm_car (s))); + elts.push_back (unsmob (scm_car (s))); } Interval ext = Axis_group_interface::relative_group_extent (ga ? ga->array () : elts, - unsmob_grob (common), + unsmob (common), (Axis) scm_to_int (axis)); return ly_interval2scm (ext); } +LY_DEFINE (ly_generic_bound_extent, "ly:generic-bound-extent", + 2, 0, 0, (SCM grob, SCM common), + "Determine the extent of @var{grob} relative to @var{common} along" + " the X axis, finding its extent as a bound when it a has" + " @code{bound-alignment-interfaces} property list set and" + " otherwise the full extent.") +{ + LY_ASSERT_SMOB (Grob, grob, 1); + LY_ASSERT_SMOB (Grob, common, 2); + + Interval ext = Axis_group_interface::generic_bound_extent (unsmob (grob), unsmob (common), X_AXIS); + return ly_interval2scm (ext); +} + LY_DEFINE (ly_axis_group_interface__add_element, "ly:axis-group-interface::add-element", 2, 0, 0, (SCM grob, SCM grob_element), "Set @var{grob} the parent of @var{grob-element} on all axes of" @@ -53,6 +67,6 @@ LY_DEFINE (ly_axis_group_interface__add_element, "ly:axis-group-interface::add-e { LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_SMOB (Grob, grob_element, 2); - Axis_group_interface::add_element (unsmob_grob (grob), unsmob_grob (grob_element)); + Axis_group_interface::add_element (unsmob (grob), unsmob (grob_element)); return SCM_UNSPECIFIED; } diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 1e945f2f9e..38a193caf6 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -81,7 +81,7 @@ Axis_group_interface::has_axis (Grob *me, Axis a) { SCM axes = me->get_property ("axes"); - return (SCM_BOOL_F != scm_memq (scm_from_int (a), axes)); + return scm_is_true (scm_memq (scm_from_int (a), axes)); } Interval @@ -101,7 +101,7 @@ Axis_group_interface::relative_maybe_bound_group_extent (vector const &e Grob *se = elts[i]; if (!to_boolean (se->get_property ("cross-staff"))) { - Interval dims = (bound && has_interface (se) + Interval dims = (bound && has_interface (se) ? generic_bound_extent (se, common, a) : se->extent (common, a)); if (!dims.is_empty ()) @@ -150,6 +150,8 @@ Interval Axis_group_interface::part_of_line_pure_height (Grob *me, bool begin, int start, int end) { Spanner *sp = dynamic_cast (me); + if (!sp) + return Interval (0, 0); SCM cache_symbol = begin ? ly_symbol2scm ("begin-of-line-pure-height") : ly_symbol2scm ("rest-of-line-pure-height"); @@ -221,9 +223,9 @@ MAKE_SCHEME_CALLBACK (Axis_group_interface, adjacent_pure_heights, 1) SCM Axis_group_interface::adjacent_pure_heights (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); - Grob *common = unsmob_grob (me->get_object ("pure-Y-common")); + Grob *common = unsmob (me->get_object ("pure-Y-common")); extract_grob_set (me, "pure-relevant-grobs", elts); Paper_score *ps = get_root_system (me)->paper_score (); @@ -282,7 +284,7 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) if (g->pure_is_visible (start, visibility_end)) { - Interval dims = g->pure_height (common, start, end); + Interval dims = g->pure_y_extent (common, start, end); if (!dims.is_empty ()) { if (rank_span[LEFT] <= start) @@ -328,10 +330,10 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end) reasonably safe to assume that if our parent is a VerticalAlignment, we can assume additivity and cache things nicely. */ Grob *p = me->get_parent (Y_AXIS); - if (p && Align_interface::has_interface (p)) + if (has_interface (p)) return Axis_group_interface::sum_partial_pure_heights (me, start, end); - Grob *common = unsmob_grob (me->get_object ("pure-Y-common")); + Grob *common = unsmob (me->get_object ("pure-Y-common")); extract_grob_set (me, "pure-relevant-grobs", elts); Interval r; @@ -342,9 +344,9 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end) if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start && g->pure_is_visible (start, end) && !(to_boolean (g->get_property ("cross-staff")) - && Stem::has_interface (g))) + && has_interface (g))) { - Interval dims = g->pure_height (common, start, end); + Interval dims = g->pure_y_extent (common, start, end); if (!dims.is_empty ()) r.unite (dims); } @@ -356,7 +358,7 @@ MAKE_SCHEME_CALLBACK (Axis_group_interface, width, 1); SCM Axis_group_interface::width (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return generic_group_extent (me, X_AXIS); } @@ -364,7 +366,7 @@ MAKE_SCHEME_CALLBACK (Axis_group_interface, height, 1); SCM Axis_group_interface::height (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return generic_group_extent (me, Y_AXIS); } @@ -374,7 +376,7 @@ Axis_group_interface::pure_height (SCM smob, SCM start_scm, SCM end_scm) { int start = robust_scm2int (start_scm, 0); int end = robust_scm2int (end_scm, INT_MAX); - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (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 */ @@ -394,7 +396,7 @@ MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_skylines, 1); SCM Axis_group_interface::calc_skylines (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Skyline_pair skylines = skyline_spacing (me); return skylines.smobbed_copy (); } @@ -409,7 +411,7 @@ MAKE_SCHEME_CALLBACK (Axis_group_interface, combine_skylines, 1); SCM Axis_group_interface::combine_skylines (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "elements", elements); Grob *y_common = common_refpoint_of_array (elements, me, Y_AXIS); Grob *x_common = common_refpoint_of_array (elements, me, X_AXIS); @@ -421,10 +423,10 @@ Axis_group_interface::combine_skylines (SCM smob) for (vsize i = 0; i < elements.size (); i++) { SCM skyline_scm = elements[i]->get_property ("vertical-skylines"); - if (Skyline_pair::unsmob (skyline_scm)) + if (unsmob (skyline_scm)) { Real offset = elements[i]->relative_coordinate (y_common, Y_AXIS); - Skyline_pair other = *Skyline_pair::unsmob (skyline_scm); + Skyline_pair other = *unsmob (skyline_scm); other.raise (offset); other.shift (elements[i]->relative_coordinate (x_common, X_AXIS)); ret.merge (other); @@ -441,7 +443,7 @@ Axis_group_interface::generic_group_extent (Grob *me, Axis a) /* trigger the callback to do skyline-spacing on the children */ if (a == Y_AXIS) for (vsize i = 0; i < elts.size (); i++) - if (!(Stem::has_interface (elts[i]) + if (!(has_interface (elts[i]) && to_boolean (elts[i]->get_property ("cross-staff")))) (void) elts[i]->get_property ("vertical-skylines"); @@ -473,7 +475,7 @@ MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_relevant_grobs, 1); SCM Axis_group_interface::calc_pure_relevant_grobs (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); /* TODO: Filter out elements that belong to a different Axis_group, such as the tie in << \new Staff=A { c'1~ \change Staff=B c'} @@ -520,7 +522,7 @@ Axis_group_interface::internal_calc_pure_relevant_grobs (Grob *me, const string vector_sort (relevant_grobs, pure_staff_priority_less); SCM grobs_scm = Grob_array::make_array (); - unsmob_grob_array (grobs_scm)->set_array (relevant_grobs); + unsmob (grobs_scm)->set_array (relevant_grobs); return grobs_scm; } @@ -529,11 +531,11 @@ MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_y_common, 1); SCM Axis_group_interface::calc_pure_y_common (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "pure-relevant-grobs", elts); Grob *common = common_refpoint_of_array (elts, me, Y_AXIS); - if (common != me && Align_interface::has_interface (common)) + if (common != me && has_interface (common)) { me->programming_error("My pure_y_common is a VerticalAlignment," " which might contain several staves."); @@ -566,20 +568,20 @@ MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_x_common, 1); SCM Axis_group_interface::calc_x_common (SCM grob) { - return calc_common (unsmob_grob (grob), X_AXIS); + return calc_common (unsmob (grob), X_AXIS); } MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_y_common, 1); SCM Axis_group_interface::calc_y_common (SCM grob) { - return calc_common (unsmob_grob (grob), Y_AXIS); + return calc_common (unsmob (grob), Y_AXIS); } Interval Axis_group_interface::pure_group_height (Grob *me, int start, int end) { - Grob *common = unsmob_grob (me->get_object ("pure-Y-common")); + Grob *common = unsmob (me->get_object ("pure-Y-common")); if (!common) { @@ -597,7 +599,7 @@ Axis_group_interface::get_children (Grob *me, vector *found) { found->push_back (me); - if (!has_interface (me)) + if (!has_interface (me)) return; extract_grob_set (me, "elements", elements); @@ -644,7 +646,7 @@ pure_staff_priority_less (Grob *const &g1, Grob *const &g2) static void add_interior_skylines (Grob *me, Grob *x_common, Grob *y_common, vector *skylines) { - if (Grob_array *elements = unsmob_grob_array (me->get_object ("elements"))) + if (Grob_array *elements = unsmob (me->get_object ("elements"))) { for (vsize i = 0; i < elements->size (); i++) add_interior_skylines (elements->grob (i), x_common, y_common, skylines); @@ -652,7 +654,7 @@ add_interior_skylines (Grob *me, Grob *x_common, Grob *y_common, vectorget_property ("outside-staff-priority")) && !to_boolean (me->get_property ("cross-staff"))) { - Skyline_pair *maybe_pair = Skyline_pair::unsmob (me->get_property ("vertical-skylines")); + Skyline_pair *maybe_pair = unsmob (me->get_property ("vertical-skylines")); if (!maybe_pair) return; if (maybe_pair->is_empty ()) @@ -705,10 +707,10 @@ valid_outside_staff_placement_directive (Grob *me) { SCM directive = me->get_property ("outside-staff-placement-directive"); - if ((directive == ly_symbol2scm ("left-to-right-greedy")) - || (directive == ly_symbol2scm ("left-to-right-polite")) - || (directive == ly_symbol2scm ("right-to-left-greedy")) - || (directive == ly_symbol2scm ("right-to-left-polite"))) + if (scm_is_eq (directive, ly_symbol2scm ("left-to-right-greedy")) + || scm_is_eq (directive, ly_symbol2scm ("left-to-right-polite")) + || scm_is_eq (directive, ly_symbol2scm ("right-to-left-greedy")) + || scm_is_eq (directive, ly_symbol2scm ("right-to-left-polite"))) return directive; me->warning (_f ("\"%s\" is not a valid outside-staff-placement-directive", @@ -735,11 +737,11 @@ add_grobs_of_one_priority (Grob *me, SCM directive = valid_outside_staff_placement_directive (me); - bool l2r = ((directive == ly_symbol2scm ("left-to-right-greedy")) - || (directive == ly_symbol2scm ("left-to-right-polite"))); + bool l2r = (scm_is_eq (directive, ly_symbol2scm ("left-to-right-greedy")) + || scm_is_eq (directive, ly_symbol2scm ("left-to-right-polite"))); - bool polite = ((directive == ly_symbol2scm ("left-to-right-polite")) - || (directive == ly_symbol2scm ("right-to-left-polite"))); + bool polite = (scm_is_eq (directive, ly_symbol2scm ("left-to-right-polite")) + || scm_is_eq (directive, ly_symbol2scm ("right-to-left-polite"))); vector boxes; vector skylines_to_merge; @@ -794,8 +796,8 @@ add_grobs_of_one_priority (Grob *me, } last_end[dir] = x_extent[RIGHT]; - Skyline_pair *v_orig = Skyline_pair::unsmob (elt->get_property ("vertical-skylines")); - if (v_orig->is_empty ()) + Skyline_pair *v_orig = unsmob (elt->get_property ("vertical-skylines")); + if (!v_orig || v_orig->is_empty ()) continue; // Find the riders associated with this grob, and merge their @@ -806,7 +808,7 @@ add_grobs_of_one_priority (Grob *me, for (GrobMapIterator j = range.first; j != range.second; j++) { Grob *rider = j->second; - Skyline_pair *v_rider = Skyline_pair::unsmob (rider->get_property ("vertical-skylines")); + Skyline_pair *v_rider = unsmob (rider->get_property ("vertical-skylines")); if (v_rider) { Skyline_pair copy (*v_rider); @@ -866,7 +868,7 @@ Axis_group_interface::outside_staff_ancestor (Grob *me) Skyline_pair Axis_group_interface::skyline_spacing (Grob *me) { - extract_grob_set (me, Grob_array::unsmob (me->get_object ("vertical-skyline-elements")) ? "vertical-skyline-elements" : "elements", fakeelements); + extract_grob_set (me, unsmob (me->get_object ("vertical-skyline-elements")) ? "vertical-skyline-elements" : "elements", fakeelements); vector elements (fakeelements); for (vsize i = 0; i < elements.size (); i++) /* @@ -981,9 +983,9 @@ Axis_group_interface::print (SCM smob) if (!debug_skylines) return SCM_BOOL_F; - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Stencil ret; - if (Skyline_pair *s = Skyline_pair::unsmob (me->get_property ("vertical-skylines"))) + if (Skyline_pair *s = unsmob (me->get_property ("vertical-skylines"))) { ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[UP].to_points (X_AXIS)) .in_color (255, 0, 255)); @@ -997,7 +999,7 @@ MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_staff_staff_spacing, 3) SCM Axis_group_interface::calc_pure_staff_staff_spacing (SCM smob, SCM start, SCM end) { - return calc_maybe_pure_staff_staff_spacing (unsmob_grob (smob), + return calc_maybe_pure_staff_staff_spacing (unsmob (smob), true, scm_to_int (start), scm_to_int (end)); @@ -1007,7 +1009,7 @@ MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_staff_staff_spacing, 1) SCM Axis_group_interface::calc_staff_staff_spacing (SCM smob) { - return calc_maybe_pure_staff_staff_spacing (unsmob_grob (smob), + return calc_maybe_pure_staff_staff_spacing (unsmob (smob), false, 0, INT_MAX); @@ -1016,7 +1018,7 @@ Axis_group_interface::calc_staff_staff_spacing (SCM smob) SCM Axis_group_interface::calc_maybe_pure_staff_staff_spacing (Grob *me, bool pure, int start, int end) { - Grob *grouper = unsmob_grob (me->get_object ("staff-grouper")); + Grob *grouper = unsmob (me->get_object ("staff-grouper")); if (grouper) { @@ -1041,12 +1043,10 @@ ADD_INTERFACE (Axis_group_interface, "bound-alignment-interfaces " "default-staff-staff-spacing " "elements " - "max-stretch " "no-alignment " "nonstaff-nonstaff-spacing " "nonstaff-relatedstaff-spacing " "nonstaff-unrelatedstaff-spacing " - "outside-staff-placement-directive " "pure-relevant-grobs " "pure-relevant-items " "pure-relevant-spanners " @@ -1055,7 +1055,6 @@ ADD_INTERFACE (Axis_group_interface, "staff-grouper " "staff-staff-spacing " "system-Y-offset " - "vertical-skyline-elements " "X-common " "Y-common " ); diff --git a/lily/balloon-engraver.cc b/lily/balloon-engraver.cc index 4899ab7c50..4f0f136db0 100644 --- a/lily/balloon-engraver.cc +++ b/lily/balloon-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,8 +28,8 @@ class Balloon_engraver : public Engraver { TRANSLATOR_DECLARATIONS (Balloon_engraver); - DECLARE_TRANSLATOR_LISTENER (annotate_output); - DECLARE_ACKNOWLEDGER (grob); + void listen_annotate_output (Stream_event *); + void acknowledge_grob (Grob_info); vector events_; void stop_translation_timestep (); @@ -37,7 +37,6 @@ class Balloon_engraver : public Engraver void balloonify (Grob *, Stream_event *); }; -IMPLEMENT_TRANSLATOR_LISTENER (Balloon_engraver, annotate_output); void Balloon_engraver::listen_annotate_output (Stream_event *ev) { @@ -71,7 +70,7 @@ Balloon_engraver::acknowledge_grob (Grob_info info) SCM arts = cause ? cause->get_property ("articulations") : SCM_EOL; for (SCM s = arts; scm_is_pair (s); s = scm_cdr (s)) { - Stream_event *e = unsmob_stream_event (scm_car (s)); + Stream_event *e = unsmob (scm_car (s)); if (e->in_event_class ("annotate-output-event")) { balloonify (info.grob (), e); @@ -85,7 +84,13 @@ Balloon_engraver::acknowledge_grob (Grob_info info) } } -ADD_ACKNOWLEDGER (Balloon_engraver, grob); + +void +Balloon_engraver::boot () +{ + ADD_LISTENER (Balloon_engraver, annotate_output); + ADD_ACKNOWLEDGER (Balloon_engraver, grob); +} ADD_TRANSLATOR (Balloon_engraver, /* doc */ diff --git a/lily/balloon.cc b/lily/balloon.cc index d323121b3e..d8519f6e39 100644 --- a/lily/balloon.cc +++ b/lily/balloon.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,7 +33,6 @@ class Balloon_interface public: DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (print_spanner, (SCM)); - DECLARE_GROB_INTERFACE (); static SCM internal_balloon_print (Grob *me, Grob *p, Offset off); }; @@ -42,7 +41,7 @@ MAKE_SCHEME_CALLBACK (Balloon_interface, print, 1); SCM Balloon_interface::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); if (Item *item = dynamic_cast (me)) if (!Item::break_visible (item)) @@ -60,7 +59,7 @@ MAKE_SCHEME_CALLBACK (Balloon_interface, print_spanner, 1); SCM Balloon_interface::print_spanner (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Spanner *orig = dynamic_cast (me->original ()); if (orig) @@ -88,8 +87,8 @@ Balloon_interface::print_spanner (SCM smob) SCM Balloon_interface::internal_balloon_print (Grob *me, Grob *p, Offset off) { - Box b (p->extent (p, X_AXIS), - p->extent (p, Y_AXIS)); + Box b (robust_relative_extent (p, p, X_AXIS), + robust_relative_extent (p, p, Y_AXIS)); Real padding = robust_scm2double (me->get_property ("padding"), .1); b.widen (padding, padding); @@ -102,7 +101,7 @@ Balloon_interface::internal_balloon_print (Grob *me, Grob *p, Offset off) SCM chain = Font_interface::text_font_alist_chain (me); SCM stencil = Text_interface::interpret_markup (me->layout ()->self_scm (), chain, bt); - Stencil *text_stil = unsmob_stencil (stencil); + Stencil *text_stil = unsmob (stencil); Offset z1; diff --git a/lily/bar-check-iterator.cc b/lily/bar-check-iterator.cc index a0fb8eaee1..d86cfa6bdf 100644 --- a/lily/bar-check-iterator.cc +++ b/lily/bar-check-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -56,7 +56,7 @@ Bar_check_iterator::process (Moment m) SCM mp = tr->get_property ("measurePosition"); SCM sync = tr->get_property ("barCheckSynchronize"); - Moment *where = unsmob_moment (mp); + Moment *where = unsmob (mp); if (!where) return; @@ -73,8 +73,8 @@ Bar_check_iterator::process (Moment m) else { SCM lf = tr->get_property ("barCheckLastFail"); - if (unsmob_moment (lf) - && *unsmob_moment (lf) == *where) + if (unsmob (lf) + && *unsmob (lf) == *where) warn = false; else tr->set_property ("barCheckLastFail", mp); diff --git a/lily/bar-engraver.cc b/lily/bar-engraver.cc index cf217be3b0..8feb63dd13 100644 --- a/lily/bar-engraver.cc +++ b/lily/bar-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -38,7 +38,7 @@ protected: void stop_translation_timestep (); void process_acknowledged (); - DECLARE_END_ACKNOWLEDGER (spanner); + void acknowledge_end_spanner (Grob_info); private: void create_bar (); @@ -59,7 +59,7 @@ Bar_engraver::create_bar () { bar_ = make_item ("BarLine", SCM_EOL); SCM gl = get_property ("whichBar"); - if (scm_equal_p (gl, bar_->get_property ("glyph")) != SCM_BOOL_T) + if (!ly_is_equal (gl, bar_->get_property ("glyph"))) bar_->set_property ("glyph", gl); } } @@ -108,7 +108,12 @@ Bar_engraver::acknowledge_end_spanner (Grob_info gi) spanners_.push_back (dynamic_cast (g)); } -ADD_END_ACKNOWLEDGER (Bar_engraver, spanner); + +void +Bar_engraver::boot () +{ + ADD_END_ACKNOWLEDGER (Bar_engraver, spanner); +} ADD_TRANSLATOR (Bar_engraver, /* doc */ diff --git a/lily/bar-line.cc b/lily/bar-line.cc index fe4406956c..e378f3b22c 100644 --- a/lily/bar-line.cc +++ b/lily/bar-line.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/bar-number-engraver.cc b/lily/bar-number-engraver.cc index f2c287c629..1af5f19da1 100644 --- a/lily/bar-number-engraver.cc +++ b/lily/bar-number-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,14 +45,13 @@ protected: protected: void stop_translation_timestep (); - DECLARE_TRANSLATOR_LISTENER (alternative); - DECLARE_ACKNOWLEDGER (break_alignment); + void listen_alternative (Stream_event *); + void acknowledge_break_alignment (Grob_info); void process_music (); void create_items (); TRANSLATOR_DECLARATIONS (Bar_number_engraver); }; -IMPLEMENT_TRANSLATOR_LISTENER (Bar_number_engraver, alternative); void Bar_number_engraver::listen_alternative (Stream_event *ev) { @@ -62,8 +61,10 @@ Bar_number_engraver::listen_alternative (Stream_event *ev) alternative_event_ = ev; int current_barnumber = robust_scm2int (get_property ("currentBarNumber"), 0); Direction alternative_dir = robust_scm2dir (ev->get_property ("alternative-dir"), CENTER); - bool make_alternative = get_property ("alternativeNumberingStyle") == ly_symbol2scm ("numbers") - || get_property ("alternativeNumberingStyle") == ly_symbol2scm ("numbers-with-letters"); + bool make_alternative = scm_is_eq (get_property ("alternativeNumberingStyle"), + ly_symbol2scm ("numbers")) + || scm_is_eq (get_property ("alternativeNumberingStyle"), + ly_symbol2scm ("numbers-with-letters")); if (make_alternative) { /* @@ -100,7 +101,7 @@ Bar_number_engraver::process_music () create_items (); SCM alternative_style = get_property ("alternativeNumberingStyle"); string text_tag = ""; - if (alternative_style == ly_symbol2scm ("numbers-with-letters")) + if (scm_is_eq (alternative_style, ly_symbol2scm ("numbers-with-letters"))) { if (alternative_event_) { @@ -175,7 +176,13 @@ Bar_number_engraver::create_items () text_ = make_item ("BarNumber", SCM_EOL); } -ADD_ACKNOWLEDGER (Bar_number_engraver, break_alignment); + +void +Bar_number_engraver::boot () +{ + ADD_LISTENER (Bar_number_engraver, alternative); + ADD_ACKNOWLEDGER (Bar_number_engraver, break_alignment); +} ADD_TRANSLATOR (Bar_number_engraver, /* doc */ diff --git a/lily/beam-collision-engraver.cc b/lily/beam-collision-engraver.cc index 9771799c18..31f96b72b1 100644 --- a/lily/beam-collision-engraver.cc +++ b/lily/beam-collision-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,15 +30,15 @@ protected: vector beams_; vector covered_grobs_; - DECLARE_ACKNOWLEDGER (note_head); - DECLARE_ACKNOWLEDGER (stem); - DECLARE_ACKNOWLEDGER (accidental); - DECLARE_ACKNOWLEDGER (clef); - DECLARE_ACKNOWLEDGER (clef_modifier); - DECLARE_ACKNOWLEDGER (key_signature); - DECLARE_ACKNOWLEDGER (time_signature); - DECLARE_ACKNOWLEDGER (beam); - DECLARE_ACKNOWLEDGER (flag); + void acknowledge_note_head (Grob_info); + void acknowledge_stem (Grob_info); + void acknowledge_accidental (Grob_info); + void acknowledge_clef (Grob_info); + void acknowledge_clef_modifier (Grob_info); + void acknowledge_key_signature (Grob_info); + void acknowledge_time_signature (Grob_info); + void acknowledge_beam (Grob_info); + void acknowledge_flag (Grob_info); virtual void finalize (); @@ -115,17 +115,17 @@ Beam_collision_engraver::finalize () if ((covered_grob_spanned_rank[RIGHT] >= beam_spanned_rank_[LEFT]) && !(to_boolean (beam_grob->get_property ("collision-voice-only")) && (covered_grob_context != beam_context)) - && !(Beam::has_interface (covered_grob) + && !(has_interface (covered_grob) && (covered_grob_spanned_rank[LEFT] <= beam_spanned_rank_[LEFT])) && covered_grob_has_interface (covered_grob, beam_grob)) { // Do not consider note heads attached to the beam. - if (Stem::has_interface (covered_grob)) - if (unsmob_grob (covered_grob->get_object ("beam"))) + if (has_interface (covered_grob)) + if (unsmob (covered_grob->get_object ("beam"))) continue; - if (Grob *stem = unsmob_grob (covered_grob->get_object ("stem"))) - if (Grob *beam = unsmob_grob (stem->get_object ("beam"))) + if (Grob *stem = unsmob (covered_grob->get_object ("stem"))) + if (Grob *beam = unsmob (stem->get_object ("beam"))) if (beam == beam_grob) continue; @@ -193,15 +193,20 @@ Beam_collision_engraver::acknowledge_beam (Grob_info i) #include "translator.icc" -ADD_ACKNOWLEDGER (Beam_collision_engraver, note_head); -ADD_ACKNOWLEDGER (Beam_collision_engraver, stem); -ADD_ACKNOWLEDGER (Beam_collision_engraver, accidental); -ADD_ACKNOWLEDGER (Beam_collision_engraver, clef); -ADD_ACKNOWLEDGER (Beam_collision_engraver, key_signature); -ADD_ACKNOWLEDGER (Beam_collision_engraver, time_signature); -ADD_ACKNOWLEDGER (Beam_collision_engraver, clef_modifier); -ADD_ACKNOWLEDGER (Beam_collision_engraver, flag); -ADD_ACKNOWLEDGER (Beam_collision_engraver, beam); + +void +Beam_collision_engraver::boot () +{ + ADD_ACKNOWLEDGER (Beam_collision_engraver, note_head); + ADD_ACKNOWLEDGER (Beam_collision_engraver, stem); + ADD_ACKNOWLEDGER (Beam_collision_engraver, accidental); + ADD_ACKNOWLEDGER (Beam_collision_engraver, clef); + ADD_ACKNOWLEDGER (Beam_collision_engraver, key_signature); + ADD_ACKNOWLEDGER (Beam_collision_engraver, time_signature); + ADD_ACKNOWLEDGER (Beam_collision_engraver, clef_modifier); + ADD_ACKNOWLEDGER (Beam_collision_engraver, flag); + ADD_ACKNOWLEDGER (Beam_collision_engraver, beam); +} ADD_TRANSLATOR (Beam_collision_engraver, /* doc */ diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc index 846e4a245c..9b4df64d9c 100644 --- a/lily/beam-engraver.cc +++ b/lily/beam-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,8 +38,9 @@ class Beam_engraver : public Engraver { public: - DECLARE_ACKNOWLEDGER (stem); - DECLARE_ACKNOWLEDGER (rest); + void acknowledge_stem (Grob_info); + void acknowledge_rest (Grob_info); + void listen_beam (Stream_event *); protected: Stream_event *start_ev_; @@ -77,7 +78,6 @@ protected: virtual bool valid_start_point (); virtual bool valid_end_point (); - DECLARE_TRANSLATOR_LISTENER (beam); public: TRANSLATOR_DECLARATIONS (Beam_engraver); }; @@ -112,7 +112,6 @@ Beam_engraver::Beam_engraver () prev_start_ev_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Beam_engraver, beam); void Beam_engraver::listen_beam (Stream_event *ev) { @@ -248,7 +247,7 @@ Beam_engraver::acknowledge_rest (Grob_info info) if (beam_ && !scm_is_number (info.grob ()->get_property_data ("staff-position"))) chain_offset_callback (info.grob (), - ly_make_unpure_pure_container + Unpure_pure_container::make_smob (Beam::rest_collision_callback_proc, Beam::pure_rest_collision_callback_proc), Y_AXIS); @@ -285,9 +284,9 @@ Beam_engraver::acknowledge_stem (Grob_info info) last_stem_added_at_ = now; - Duration *stem_duration = unsmob_duration (ev->get_property ("duration")); + Duration *stem_duration = unsmob (ev->get_property ("duration")); int durlog = stem_duration->duration_log (); - //int durlog = unsmob_duration (ev->get_property ("duration"))->duration_log (); + //int durlog = unsmob (ev->get_property ("duration"))->duration_log (); if (durlog <= 2) { ev->origin ()->warning (_ ("stem does not fit in beam")); @@ -308,12 +307,18 @@ Beam_engraver::acknowledge_stem (Grob_info info) max (durlog - 2, 0), Stem::is_invisible (stem), stem_duration->factor (), - (stem->get_property ("tuplet-start") == SCM_BOOL_T)); + (to_boolean (stem->get_property ("tuplet-start")))); Beam::add_stem (beam_, stem); } -ADD_ACKNOWLEDGER (Beam_engraver, stem); -ADD_ACKNOWLEDGER (Beam_engraver, rest); + +void +Beam_engraver::boot () +{ + ADD_LISTENER (Beam_engraver, beam); + ADD_ACKNOWLEDGER (Beam_engraver, stem); + ADD_ACKNOWLEDGER (Beam_engraver, rest); +} ADD_TRANSLATOR (Beam_engraver, /* doc */ @@ -337,8 +342,7 @@ class Grace_beam_engraver : public Beam_engraver { public: TRANSLATOR_DECLARATIONS (Grace_beam_engraver); - - DECLARE_TRANSLATOR_LISTENER (beam); + TRANSLATOR_INHERIT (Beam_engraver); protected: virtual bool valid_start_point (); @@ -363,24 +367,14 @@ Grace_beam_engraver::valid_end_point () return beam_ && valid_start_point (); } -/* - Ugh, C&P code. - */ -IMPLEMENT_TRANSLATOR_LISTENER (Grace_beam_engraver, beam); void -Grace_beam_engraver::listen_beam (Stream_event *ev) +Grace_beam_engraver::boot () { - Direction d = to_dir (ev->get_property ("span-direction")); - - if (d == START && valid_start_point ()) - start_ev_ = ev; - else if (d == STOP && valid_end_point ()) - stop_ev_ = ev; + ADD_LISTENER (Grace_beam_engraver, beam); + ADD_ACKNOWLEDGER (Grace_beam_engraver, stem); + ADD_ACKNOWLEDGER (Grace_beam_engraver, rest); } -ADD_ACKNOWLEDGER (Grace_beam_engraver, stem); -ADD_ACKNOWLEDGER (Grace_beam_engraver, rest); - ADD_TRANSLATOR (Grace_beam_engraver, /* doc */ "Handle @code{Beam} events by engraving beams. If omitted," diff --git a/lily/beam-performer.cc b/lily/beam-performer.cc index d723d7a81c..0970e8b5e7 100644 --- a/lily/beam-performer.cc +++ b/lily/beam-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Jan Nieuwenhuizen + Copyright (C) 1996--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ protected: void start_translation_timestep (); void process_music (); void set_melisma (bool); - DECLARE_TRANSLATOR_LISTENER (beam); + void listen_beam (Stream_event *); private: Stream_event *start_ev_; Stream_event *now_stop_ev_; @@ -80,7 +80,6 @@ Beam_performer::start_translation_timestep () now_stop_ev_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Beam_performer, beam); void Beam_performer::listen_beam (Stream_event *ev) { @@ -92,6 +91,12 @@ Beam_performer::listen_beam (Stream_event *ev) now_stop_ev_ = ev; } +void +Beam_performer::boot () +{ + ADD_LISTENER (Beam_performer, beam); +} + ADD_TRANSLATOR (Beam_performer, /* doc */ "", diff --git a/lily/beam-quanting.cc b/lily/beam-quanting.cc index c590802675..f3505772f1 100644 --- a/lily/beam-quanting.cc +++ b/lily/beam-quanting.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -45,6 +45,7 @@ using namespace std; #include "stencil.hh" #include "stem.hh" #include "warn.hh" +#include "string-convert.hh" Real get_detail (SCM alist, SCM sym, Real def) @@ -66,7 +67,10 @@ Beam_quant_parameters::fill (Grob *him) REGION_SIZE = get_detail (details, ly_symbol2scm ("region-size"), 2); // forbidden quants - SECONDARY_BEAM_DEMERIT = get_detail (details, ly_symbol2scm ("secondary-beam-demerit"), 10.0); + SECONDARY_BEAM_DEMERIT = get_detail (details, ly_symbol2scm ("secondary-beam-demerit"), 10.0) + // For stems that are non-standard, the forbidden beam quanting + // doesn't really work, so decrease their importance. + * exp(- 8*fabs (1.0 - robust_scm2double(him->get_property ("length-fraction"), 1.0))); STEM_LENGTH_DEMERIT_FACTOR = get_detail (details, ly_symbol2scm ("stem-length-demerit-factor"), 5); HORIZONTAL_INTER_QUANT_PENALTY = get_detail (details, ly_symbol2scm ("horizontal-inter-quant"), 500); @@ -79,7 +83,14 @@ Beam_quant_parameters::fill (Grob *him) // Collisions COLLISION_PENALTY = get_detail (details, ly_symbol2scm ("collision-penalty"), 500); - COLLISION_PADDING = get_detail (details, ly_symbol2scm ("collision-padding"), 0.5); + + /* For grace notes, beams get scaled down to 80%, but glyphs go down + to 63% (magstep -4 for accidentals). To make the padding + commensurate with glyph size for grace notes, we take the square + of the length fraction, yielding a 64% decrease. + */ + COLLISION_PADDING = get_detail (details, ly_symbol2scm ("collision-padding"), 0.5) + * sqr (robust_scm2double(him->get_property ("length-fraction"), 1.0)); STEM_COLLISION_FACTOR = get_detail (details, ly_symbol2scm ("stem-collision-factor"), 0.1); } @@ -294,7 +305,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array y edge_dirs_ = Drul_array (stem_infos_[0].dir_, stem_infos_.back ().dir_); - is_xstaff_ = Align_interface::has_interface (common[Y_AXIS]); + is_xstaff_ = has_interface (common[Y_AXIS]); is_knee_ |= dirs_found[DOWN] && dirs_found[UP]; staff_radius_ = Staff_symbol_referencer::staff_radius (beams[i]); @@ -332,7 +343,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array y if (!collisions[j]->is_live ()) continue; - if (Beam::has_interface (collisions[j]) && Beam::is_cross_staff (collisions[j])) + if (has_interface (collisions[j]) && Beam::is_cross_staff (collisions[j])) continue; Box b; @@ -352,8 +363,8 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array y for (LEFT_and_RIGHT (d)) add_collision (b[X_AXIS][d], b[Y_AXIS], width_factor); - Grob *stem = unsmob_grob (collisions[j]->get_object ("stem")); - if (stem && Stem::has_interface (stem) && Stem::is_normal_stem (stem)) + Grob *stem = unsmob (collisions[j]->get_object ("stem")); + if (has_interface (stem) && Stem::is_normal_stem (stem)) { colliding_stems.insert (stem); } @@ -362,7 +373,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array y for (set::const_iterator it (colliding_stems.begin ()); it != colliding_stems.end (); it++) { Grob *s = *it; - Real x = (s->extent (common[X_AXIS], X_AXIS) - x_pos[LEFT] + x_span_).center (); + Real x = (robust_relative_extent (s, common[X_AXIS], X_AXIS) - x_pos[LEFT] + x_span_).center (); Direction stem_dir = get_grob_direction (*it); Interval y; @@ -371,7 +382,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array y - my_y; Real factor = parameters_.STEM_COLLISION_FACTOR; - if (!unsmob_grob (s->get_object ("beam"))) + if (!unsmob (s->get_object ("beam"))) factor = 1.0; add_collision (x, y, factor); } @@ -1190,9 +1201,10 @@ Beam_scoring_problem::score_forbidden_quants (Beam_configuration *config) const { Real dy = config->y.delta (); - Real extra_demerit = parameters_.SECONDARY_BEAM_DEMERIT - / max (edge_beam_counts_[LEFT], edge_beam_counts_[RIGHT]); - + Real extra_demerit = + parameters_.SECONDARY_BEAM_DEMERIT + / max (edge_beam_counts_[LEFT], edge_beam_counts_[RIGHT]); + Real dem = 0.0; Real eps = parameters_.BEAM_EPS; @@ -1203,13 +1215,15 @@ Beam_scoring_problem::score_forbidden_quants (Beam_configuration *config) const Direction stem_dir = edge_dirs_[d]; /* - The 2.2 factor is to provide a little leniency for + The fudge_factor is to provide a little leniency for borderline cases. If we do 2.0, then the upper outer line will be in the gap of the (2, sit) quant, leading to a - false demerit. + false demerit. By increasing the fudge factor to 2.2, we + fix this case. */ - Real gap1 = config->y[d] - stem_dir * ((j - 1) * beam_translation_ + beam_thickness_ / 2 - line_thickness_ / 2.2); - Real gap2 = config->y[d] - stem_dir * (j * beam_translation_ - beam_thickness_ / 2 + line_thickness_ / 2.2); + Real fudge_factor = 2.2; + Real gap1 = config->y[d] - stem_dir * ((j - 1) * beam_translation_ + beam_thickness_ / 2 - line_thickness_ / fudge_factor); + Real gap2 = config->y[d] - stem_dir * (j * beam_translation_ - beam_thickness_ / 2 + line_thickness_ / fudge_factor); Interval gap; gap.add_point (gap1); @@ -1240,6 +1254,8 @@ Beam_scoring_problem::score_forbidden_quants (Beam_configuration *config) const } } + config->add (dem, "Fl"); + dem = 0.0; if (max (edge_beam_counts_[LEFT], edge_beam_counts_[RIGHT]) >= 2) { Real straddle = 0.0; @@ -1277,7 +1293,7 @@ Beam_scoring_problem::score_forbidden_quants (Beam_configuration *config) const } } - config->add (dem, "F"); + config->add (dem, "Fs"); } void @@ -1295,16 +1311,20 @@ Beam_scoring_problem::score_collisions (Beam_configuration *config) const Real dist = infinity_f; if (!intersection (beam_y, collision_y).is_empty ()) dist = 0.0; - else + else dist = min (beam_y.distance (collision_y[DOWN]), beam_y.distance (collision_y[UP])); + Real scale_free = max (parameters_.COLLISION_PADDING - dist, 0.0) / parameters_.COLLISION_PADDING; - demerits - += collisions_[i].base_penalty_ * + Real collision_demerit = collisions_[i].base_penalty_ * pow (scale_free, 3) * parameters_.COLLISION_PENALTY; + + if (collision_demerit > 0) { + demerits += collision_demerit; + } } config->add (demerits, "C"); diff --git a/lily/beam.cc b/lily/beam.cc index fbd158aeca..a20530c0f3 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -119,11 +119,13 @@ Beam::get_beam_translation (Grob *me) Real beam_thickness = get_beam_thickness (me); Real fract = robust_scm2double (me->get_property ("length-fraction"), 1.0); - Real beam_translation = beam_count < 4 - ? (2 * staff_space + line - beam_thickness) / 2.0 - : (3 * staff_space + line - beam_thickness) / 3.0; - - return fract * beam_translation; + /* + if fract != 1.0, as is the case for grace notes, we want the gap + to decrease too. To achieve this, we divide the thickness by + fract */ + return (beam_count < 4 + ? (2 * staff_space * fract + line * fract - beam_thickness) / 2.0 + : (3 * staff_space * fract + line * fract - beam_thickness) / 3.0); } /* Maximum beam_count. */ @@ -145,11 +147,11 @@ MAKE_SCHEME_CALLBACK (Beam, calc_normal_stems, 1); SCM Beam::calc_normal_stems (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "stems", stems); SCM val = Grob_array::make_array (); - Grob_array *ga = unsmob_grob_array (val); + Grob_array *ga = unsmob (val); for (vsize i = 0; i < stems.size (); i++) if (Stem::is_normal_stem (stems[i])) ga->add (stems[i]); @@ -161,7 +163,7 @@ MAKE_SCHEME_CALLBACK (Beam, calc_direction, 1); SCM Beam::calc_direction (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); /* Beams with less than 2 two stems don't make much sense, but could happen when you do @@ -203,7 +205,8 @@ Beam::calc_direction (SCM smob) placing this here avoids warnings downstream */ if (heads.size()) { - if (heads[0]->get_property ("style") == ly_symbol2scm ("kievan")) + if (scm_is_eq (heads[0]->get_property ("style"), + ly_symbol2scm ("kievan"))) { if (dir == CENTER) dir = DOWN; @@ -256,7 +259,7 @@ position_with_maximal_common_beams (SCM left_beaming, SCM right_beaming, for (SCM s = scm_car (right_beaming); scm_is_pair (s); s = scm_cdr (s)) { int k = -right_dir * scm_to_int (scm_car (s)) + i; - if (scm_c_memq (scm_from_int (k), left_beaming) != SCM_BOOL_F) + if (scm_is_true (ly_memv (scm_from_int (k), left_beaming))) count++; } @@ -274,7 +277,7 @@ MAKE_SCHEME_CALLBACK (Beam, calc_beaming, 1) SCM Beam::calc_beaming (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "stems", stems); @@ -353,7 +356,7 @@ Beam::calc_beam_segments (SCM smob) { /* ugh, this has a side-effect that we need to ensure that Stem #'beaming is correct */ - Grob *me_grob = unsmob_grob (smob); + Grob *me_grob = unsmob (smob); (void) me_grob->get_property ("beaming"); Spanner *me = dynamic_cast (me_grob); @@ -570,7 +573,7 @@ MAKE_SCHEME_CALLBACK (Beam, calc_x_positions, 1); SCM Beam::calc_x_positions (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); SCM segments = me->get_property ("beam-segments"); Interval x_positions; x_positions.set_empty (); @@ -611,7 +614,7 @@ MAKE_SCHEME_CALLBACK (Beam, print, 1); SCM Beam::print (SCM grob) { - Spanner *me = unsmob_spanner (grob); + Spanner *me = unsmob (grob); /* TODO - mild code dup for all the commonx calls. Some use just common_refpoint_of_array, some (in print and @@ -739,7 +742,7 @@ Beam::print (SCM grob) Direction stem_dir = stems.size () ? to_dir (stems[0]->get_property ("direction")) : UP; - Stencil score = *unsmob_stencil (Text_interface::interpret_markup + Stencil score = *unsmob (Text_interface::interpret_markup (me->layout ()->self_scm (), properties, annotation)); if (!score.is_empty ()) @@ -870,11 +873,11 @@ Beam::consider_auto_knees (Grob *me) { Grob *stem = stems[i]; - Interval head_extents = Stem::head_positions (stem); - if (!head_extents.is_empty ()) + Interval head_extents; + if (Stem::head_count (stem)) { - head_extents[LEFT] += -1; - head_extents[RIGHT] += 1; + head_extents = Stem::head_positions (stem); + head_extents.widen (1); head_extents *= staff_space * 0.5; /* @@ -947,7 +950,7 @@ MAKE_SCHEME_CALLBACK (Beam, calc_stem_shorten, 1) SCM Beam::calc_stem_shorten (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); /* shortening looks silly for x staff beams @@ -961,7 +964,7 @@ Beam::calc_stem_shorten (SCM smob) int beam_count = get_beam_count (me); SCM shorten_list = me->get_property ("beamed-stem-shorten"); - if (shorten_list == SCM_EOL) + if (scm_is_null (shorten_list)) return scm_from_int (0); Real staff_space = Staff_symbol_referencer::staff_space (me); @@ -982,7 +985,7 @@ MAKE_SCHEME_CALLBACK (Beam, quanting, 3); SCM Beam::quanting (SCM smob, SCM ys_scm, SCM align_broken_intos) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Drul_array ys = robust_scm2drul (ys_scm, Drul_array (infinity_f, -infinity_f)); bool cbs = to_boolean (align_broken_intos); @@ -1003,7 +1006,7 @@ where_are_the_whole_beams (SCM beaming) for (SCM s = scm_car (beaming); scm_is_pair (s); s = scm_cdr (s)) { - if (scm_c_memq (scm_car (s), scm_cdr (beaming)) != SCM_BOOL_F) + if (scm_is_true (ly_memv (scm_car (s), scm_cdr (beaming)))) l.add_point (scm_to_int (scm_car (s))); } @@ -1064,7 +1067,7 @@ MAKE_SCHEME_CALLBACK (Beam, set_stem_lengths, 1); SCM Beam::set_stem_lengths (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); /* trigger callbacks. */ (void) me->get_property ("direction"); @@ -1139,8 +1142,8 @@ Beam::set_beaming (Grob *me, Beaming_pattern const *beaming) { Grob *stem = stems[i]; SCM beaming_prop = stem->get_property ("beaming"); - if (beaming_prop == SCM_EOL - || index_get_cell (beaming_prop, d) == SCM_EOL) + if (scm_is_null (beaming_prop) + || scm_is_null (index_get_cell (beaming_prop, d))) { int count = beaming->beamlet_count (i, d); if (i > 0 @@ -1217,21 +1220,23 @@ MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Beam, rest_collision_callback, 2, 1, ""); SCM Beam::rest_collision_callback (SCM smob, SCM prev_offset) { - Grob *rest = unsmob_grob (smob); + if (!scm_is_number (prev_offset)) + prev_offset = SCM_INUM0; + + Grob *rest = unsmob (smob); if (scm_is_number (rest->get_property ("staff-position"))) - return scm_from_int (0); + return prev_offset; - Real offset = robust_scm2double (prev_offset, 0.0); + Grob *stem = unsmob (rest->get_object ("stem")); - Grob *st = unsmob_grob (rest->get_object ("stem")); - Grob *stem = st; if (!stem) - return scm_from_double (0.0); - Grob *beam = unsmob_grob (stem->get_object ("beam")); + return prev_offset; + + Grob *beam = unsmob (stem->get_object ("beam")); if (!beam - || !Beam::has_interface (beam) + || !has_interface (beam) || !Beam::normal_stem_count (beam)) - return scm_from_double (0.0); + return prev_offset; Grob *common_y = rest->common_refpoint (beam, Y_AXIS); @@ -1273,6 +1278,7 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) + (beam_count - 1) * beam_translation; Real beam_y = stem_y - d * height_of_my_beams; + Real offset = robust_scm2double (prev_offset, 0.0); Interval rest_extent = rest->extent (rest, Y_AXIS); rest_extent.translate (offset + rest->get_parent (Y_AXIS)->relative_coordinate (common_y, Y_AXIS)); @@ -1301,7 +1307,7 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) /* Estimate the position of a rest under a beam, - as the average position of its neighboring heads. + using the average position of its neighboring heads. */ MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Beam, pure_rest_collision_callback, 4, 1, ""); SCM @@ -1310,29 +1316,21 @@ Beam::pure_rest_collision_callback (SCM smob, SCM, /* end */ SCM prev_offset) { - Real previous = robust_scm2double (prev_offset, 0.0); + if (!scm_is_number (prev_offset)) + prev_offset = SCM_INUM0; - Grob *me = unsmob_grob (smob); - Grob *stem = unsmob_grob (me->get_object ("stem")); + Grob *me = unsmob (smob); + Grob *stem = unsmob (me->get_object ("stem")); if (!stem) - return scm_from_double (previous); - Grob *beam = unsmob_grob (stem->get_object ("beam")); + return prev_offset; + Grob *beam = unsmob (stem->get_object ("beam")); if (!beam || !Beam::normal_stem_count (beam) || !is_direction (beam->get_property_data ("direction"))) - return scm_from_double (previous); + return prev_offset; Real ss = Staff_symbol_referencer::staff_space (me); - /* - This gives the extrema of rest positions. - Even with noteheads on ledgers, beams typically remain within the staff, - and push rests at most one staff-space (2 positions) from the staff. - */ - Grob *staff = Staff_symbol_referencer::get_staff_symbol (me); - Interval rest_max_pos = staff ? Staff_symbol::line_span (staff) : Interval (0.0, 0.0); - rest_max_pos.widen (2); - extract_grob_set (beam, "stems", stems); vector my_stems; @@ -1352,7 +1350,7 @@ Beam::pure_rest_collision_callback (SCM smob, Grob *right; if (idx == (vsize) - 1 || my_stems.size () == 1) - return scm_from_double (previous); + return prev_offset; else if (idx == 0) left = right = my_stems[1]; else if (idx == my_stems.size () - 1) @@ -1363,24 +1361,27 @@ Beam::pure_rest_collision_callback (SCM smob, right = my_stems[idx + 1]; } - /* In stems with several heads, use the one closest to the beam. */ + /* Estimate the closest beam to be four positions away from the heads, */ Direction beamdir = get_grob_direction (beam); - Real shift = min (max ( (Stem::head_positions (left)[beamdir] - + Stem::head_positions (right)[beamdir]) / 2.0, - rest_max_pos[DOWN]), - rest_max_pos[UP] - ) * ss / 2.0 - - previous; - - // So that ceil below kicks in for rests that would otherwise brush - // up against a beam quanted to a ledger line, add a bit of space - // between the beam and the rest. - shift += (0.01 * beamdir); - - /* Always move by a whole number of staff spaces */ - shift = ceil (fabs (shift / ss)) * ss * sign (shift); - - return scm_from_double (previous + shift); + Real beam_pos = (Stem::head_positions (left)[beamdir] + + Stem::head_positions (right)[beamdir]) / 2.0 + + 4.0 * beamdir; // four staff-positions + /* and that the closest beam never crosses staff center by more than two positions */ + beam_pos = max (-2.0, beam_pos * beamdir) * beamdir; + + Real minimum_distance + = ss * (robust_scm2double (stem->get_property ("stemlet-length"), 0.0) + + robust_scm2double (me->get_property ("minimum-distance"), 0.0)); + Real offset = beam_pos * ss / 2.0 + - minimum_distance * beamdir + - me->extent (me, Y_AXIS)[beamdir]; + Real previous = robust_scm2double (prev_offset, 0.0); + + /* Always move by a whole number of staff spaces, always away from the beam */ + offset = floor (min (0.0, (offset - previous) / ss * beamdir)) + * ss * beamdir + previous; + + return scm_from_double (offset); } bool @@ -1424,7 +1425,7 @@ MAKE_SCHEME_CALLBACK (Beam, calc_cross_staff, 1) SCM Beam::calc_cross_staff (SCM smob) { - return scm_from_bool (is_cross_staff (unsmob_grob (smob))); + return scm_from_bool (is_cross_staff (unsmob (smob))); } int diff --git a/lily/beaming-pattern.cc b/lily/beaming-pattern.cc index 088cdc1a65..46a46a5d2e 100644 --- a/lily/beaming-pattern.cc +++ b/lily/beaming-pattern.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,6 +19,7 @@ #include "context.hh" #include "beaming-pattern.hh" +#include "misc.hh" /* Represents a stem belonging to a beam. Sometimes (for example, if the stem @@ -162,14 +163,27 @@ Beaming_pattern::beamify (Beaming_options const &options) for (int i = 0; i < 2; i++) for (vsize i = 1; i < infos_.size () - 1; i++) { - Direction non_flag_dir = other_dir (flag_directions[i]); + Direction non_flag_dir = -flag_directions[i]; if (non_flag_dir) { - int importance = infos_[i + 1].rhythmic_importance_; - int count = (importance < 0 && options.subdivide_beams_) - ? 1 : min (min (infos_[i].count (non_flag_dir), - infos_[i + non_flag_dir].count (-non_flag_dir)), - infos_[i - non_flag_dir].count (non_flag_dir)); + int count = + (infos_[i + 1].rhythmic_importance_ < 0 && + options.subdivide_beams_) + // we're left of a subdivision + ? (i != infos_.size () - 2) + // respect the beam count for shortened beams ... + ? max (beam_count_for_rhythmic_position (i + 1), + beam_count_for_length (remaining_length (i + 1))) + // ... except if there's only one trailing stem + : beam_count_for_rhythmic_position (i + 1) + + // we're at any other stem + : min (min (infos_[i].count (non_flag_dir), + infos_[i + non_flag_dir].count (-non_flag_dir)), + infos_[i - non_flag_dir].count (non_flag_dir)); + + // Ensure at least one beam is left, even for groups longer than 1/8 + count = max (count, 1); infos_[i].beam_count_drul_[non_flag_dir] = count; } @@ -359,6 +373,25 @@ Beaming_pattern::end_moment (int i) const + infos_.at (i).factor_ * dur.get_length (); } +Moment +Beaming_pattern::remaining_length (int i) const +{ + return end_moment (infos_.size () - 1) - infos_[i].start_moment_; +} + +int +Beaming_pattern::beam_count_for_rhythmic_position (int idx) const +{ + // Calculate number of beams representing the rhythmic position of given stem + return intlog2(infos_[idx].start_moment_.main_part_.den()) - 2; +} + +int +Beaming_pattern::beam_count_for_length (Moment len) const +{ + return intlog2(len.main_part_.den()) - 2 - intlog2(len.main_part_.num()); +} + bool Beaming_pattern::invisibility (int i) const { diff --git a/lily/bend-engraver.cc b/lily/bend-engraver.cc index d7ff790ae4..83c98a94e0 100644 --- a/lily/bend-engraver.cc +++ b/lily/bend-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,10 +29,10 @@ class Bend_engraver : public Engraver { public: TRANSLATOR_DECLARATIONS (Bend_engraver); - DECLARE_ACKNOWLEDGER (note_head); + void acknowledge_note_head (Grob_info); protected: - DECLARE_TRANSLATOR_LISTENER (bend_after); + void listen_bend_after (Stream_event *); void finalize (); void process_music (); void stop_translation_timestep (); @@ -53,7 +53,7 @@ Bend_engraver::finalize () // We shouldn't end a spanner on the last musical column of a piece because then // it would extend past the last breakable column of the piece. if (last_fall_) - last_fall_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + last_fall_->set_bound (RIGHT, unsmob (get_property ("currentCommandColumn"))); } void @@ -61,7 +61,7 @@ Bend_engraver::stop_fall () { bool bar = scm_is_string (get_property ("whichBar")); - fall_->set_bound (RIGHT, unsmob_grob (bar + fall_->set_bound (RIGHT, unsmob (bar ? get_property ("currentCommandColumn") : get_property ("currentMusicalColumn"))); last_fall_ = fall_; @@ -115,7 +115,6 @@ Bend_engraver::Bend_engraver () fall_event_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Bend_engraver, bend_after); void Bend_engraver::listen_bend_after (Stream_event *ev) { @@ -133,7 +132,13 @@ Bend_engraver::process_music () } } -ADD_ACKNOWLEDGER (Bend_engraver, note_head); + +void +Bend_engraver::boot () +{ + ADD_LISTENER (Bend_engraver, bend_after); + ADD_ACKNOWLEDGER (Bend_engraver, note_head); +} ADD_TRANSLATOR (Bend_engraver, /* doc */ diff --git a/lily/bezier-bow.cc b/lily/bezier-bow.cc index 9252e288f5..e049bd734c 100644 --- a/lily/bezier-bow.cc +++ b/lily/bezier-bow.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/bezier.cc b/lily/bezier.cc index d926712403..b202d45dd6 100644 --- a/lily/bezier.cc +++ b/lily/bezier.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -140,8 +140,9 @@ Bezier::curve_point (Real t) const return o; } -Real -Bezier::slope_at_point (Real t) const +// The return value is normalized unless zero or indefinite. +Offset +Bezier::dir_at_point (Real t) const { Offset second_order[3]; Offset third_order[2]; @@ -152,10 +153,7 @@ Bezier::slope_at_point (Real t) const for (vsize i = 0; i < 2; i++) third_order[i] = ((second_order[i + 1] - second_order[i]) * t) + second_order[i]; - if (third_order[1][X_AXIS] - third_order[0][X_AXIS] == 0) - return infinity_f; - - return (third_order[1][Y_AXIS] - third_order[0][Y_AXIS]) / (third_order[1][X_AXIS] - third_order[0][X_AXIS]); + return (third_order[1] - third_order[0]).direction (); } /* diff --git a/lily/book-scheme.cc b/lily/book-scheme.cc index ae505af318..af0cb62632 100644 --- a/lily/book-scheme.cc +++ b/lily/book-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,14 +22,13 @@ #include "output-def.hh" #include "score.hh" #include "paper-book.hh" -#include "ly-module.hh" LY_DEFINE (ly_make_book, "ly:make-book", 2, 0, 1, (SCM paper, SCM header, SCM scores), "Make a @code{\\book} of @var{paper} and @var{header}" " (which may be @code{#f} as well) containing @code{\\scores}.") { - Output_def *odef = unsmob_output_def (paper); + Output_def *odef = unsmob (paper); LY_ASSERT_SMOB (Output_def, paper, 1); Book *book = new Book; @@ -66,14 +65,14 @@ LY_DEFINE (ly_book_process, "ly:book-process", " For example, it may be a string (for file based outputs)" " or a socket (for network based output).") { - Book *book = unsmob_book (book_smob); + Book *book = unsmob (book_smob); LY_ASSERT_SMOB (Book, book_smob, 1); LY_ASSERT_SMOB (Output_def, default_paper, 2); LY_ASSERT_SMOB (Output_def, default_layout, 3); - Paper_book *pb = book->process (unsmob_output_def (default_paper), - unsmob_output_def (default_layout)); + Paper_book *pb = book->process (unsmob (default_paper), + unsmob (default_layout)); if (pb) { pb->output (output); @@ -96,10 +95,10 @@ LY_DEFINE (ly_book_process_to_systems, "ly:book-process-to-systems", LY_ASSERT_SMOB (Output_def, default_paper, 2); LY_ASSERT_SMOB (Output_def, default_layout, 3); - Book *book = unsmob_book (book_smob); + Book *book = unsmob (book_smob); - Paper_book *pb = book->process (unsmob_output_def (default_paper), - unsmob_output_def (default_layout)); + Paper_book *pb = book->process (unsmob (default_paper), + unsmob (default_layout)); if (pb) { pb->classic_output (output); @@ -114,7 +113,7 @@ LY_DEFINE (ly_book_add_score_x, "ly:book-add-score!", "Add @var{score} to @var{book-smob} score list.") { LY_ASSERT_SMOB (Book, book_smob, 1); - Book *book = unsmob_book (book_smob); + Book *book = unsmob (book_smob); book->add_score (score); return SCM_UNSPECIFIED; } @@ -124,7 +123,7 @@ LY_DEFINE (ly_book_add_bookpart_x, "ly:book-add-bookpart!", "Add @var{book-part} to @var{book-smob} book part list.") { LY_ASSERT_SMOB (Book, book_smob, 1); - Book *book = unsmob_book (book_smob); + Book *book = unsmob (book_smob); book->add_bookpart (book_part); return SCM_UNSPECIFIED; } @@ -134,7 +133,7 @@ LY_DEFINE (ly_book_book_parts, "ly:book-book-parts", "Return book parts in @var{book}.") { LY_ASSERT_SMOB (Book, book, 1); - Book *b = unsmob_book (book); + Book *b = unsmob (book); return b->bookparts_; } @@ -143,7 +142,7 @@ LY_DEFINE (ly_book_paper, "ly:book-paper", "Return paper in @var{book}.") { LY_ASSERT_SMOB (Book, book, 1); - Book *b = unsmob_book (book); + Book *b = unsmob (book); return b->paper_ ? b->paper_->self_scm () : SCM_BOOL_F; } @@ -152,7 +151,7 @@ LY_DEFINE (ly_book_header, "ly:book-header", "Return header in @var{book}.") { LY_ASSERT_SMOB (Book, book, 1); - Book *b = unsmob_book (book); + Book *b = unsmob (book); return b->header_ ? b->header_ : SCM_BOOL_F; } @@ -164,7 +163,7 @@ LY_DEFINE (ly_book_set_header_x, "ly:book-set-header!", SCM_ASSERT_TYPE (ly_is_module (module), module, SCM_ARG2, __FUNCTION__, "module"); - Book *b = unsmob_book (book); + Book *b = unsmob (book); b->header_ = (module); return SCM_UNSPECIFIED; } @@ -174,10 +173,9 @@ LY_DEFINE (ly_book_scores, "ly:book-scores", "Return scores in @var{book}.") { LY_ASSERT_SMOB (Book, book, 1); - Book *b = unsmob_book (book); + Book *b = unsmob (book); return b->scores_; } -#include "ly-smobs.icc" -IMPLEMENT_TYPE_P (Book, "ly:book?"); +const char * const Book::type_p_name_ = "ly:book?"; diff --git a/lily/book.cc b/lily/book.cc index 8e19823699..c7f5dd0237 100644 --- a/lily/book.cc +++ b/lily/book.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,8 +32,7 @@ using namespace std; #include "performance.hh" #include "paper-score.hh" #include "page-marker.hh" - -#include "ly-smobs.icc" +#include "ly-module.hh" Book::Book () { @@ -44,10 +43,11 @@ Book::Book () input_location_ = SCM_EOL; smobify_self (); - input_location_ = make_input (Input ()); + input_location_ = Input ().smobbed_copy (); } Book::Book (Book const &s) + : Smob () { paper_ = 0; header_ = SCM_EOL; @@ -62,7 +62,7 @@ Book::Book (Book const &s) paper_->unprotect (); } - input_location_ = make_input (*s.origin ()); + input_location_ = s.origin ()->smobbed_copy (); header_ = ly_make_module (false); if (ly_is_module (s.header_)) @@ -72,9 +72,9 @@ Book::Book (Book const &s) { SCM entry = scm_car (p); - if (Score *newscore = unsmob_score (entry)) + if (Score *newscore = unsmob (entry)) * t = scm_cons (newscore->clone ()->unprotect (), SCM_EOL); - else if (Page_marker *marker = unsmob_page_marker (entry)) + else if (Page_marker *marker = unsmob (entry)) * t = scm_cons (marker->clone ()->unprotect (), SCM_EOL); else { @@ -87,7 +87,7 @@ Book::Book (Book const &s) t = &bookparts_; for (SCM p = s.bookparts_; scm_is_pair (p); p = scm_cdr (p)) { - Book *newpart = unsmob_book (scm_car (p))->clone (); + Book *newpart = unsmob (scm_car (p))->clone (); *t = scm_cons (newpart->self_scm (), SCM_EOL); t = SCM_CDRLOC (*t); @@ -98,35 +98,24 @@ Book::Book (Book const &s) Input * Book::origin () const { - return unsmob_input (input_location_); + return unsmob (input_location_); } Book::~Book () { } -IMPLEMENT_SMOBS (Book); -IMPLEMENT_DEFAULT_EQUAL_P (Book); SCM -Book::mark_smob (SCM s) +Book::mark_smob () const { - Book *book = (Book *) SCM_CELL_WORD_1 (s); - - if (book->paper_) - scm_gc_mark (book->paper_->self_scm ()); - scm_gc_mark (book->scores_); - scm_gc_mark (book->bookparts_); - scm_gc_mark (book->input_location_); - - return book->header_; -} + if (paper_) + scm_gc_mark (paper_->self_scm ()); + scm_gc_mark (scores_); + scm_gc_mark (bookparts_); + scm_gc_mark (input_location_); -int -Book::print_smob (SCM, SCM p, scm_print_state *) -{ - scm_puts ("#", p); - return 1; + return header_; } void @@ -179,7 +168,7 @@ void Book::add_bookpart (SCM b) { add_scores_to_bookpart (); - Book *part = unsmob_book (b); + Book *part = unsmob (b); part->set_parent (this); bookparts_ = scm_cons (b, bookparts_); } @@ -188,12 +177,12 @@ bool Book::error_found () { for (SCM s = scores_; scm_is_pair (s); s = scm_cdr (s)) - if (Score *score = unsmob_score (scm_car (s))) + if (Score *score = unsmob (scm_car (s))) if (score->error_found_) return true; for (SCM part = bookparts_; scm_is_pair (part); part = scm_cdr (part)) - if (Book *bookpart = unsmob_book (scm_car (part))) + if (Book *bookpart = unsmob (scm_car (part))) if (bookpart->error_found ()) return true; @@ -213,7 +202,7 @@ Book::process_bookparts (Paper_book *output_paper_book, Output_def *paper, Outpu add_scores_to_bookpart (); for (SCM p = scm_reverse (bookparts_); scm_is_pair (p); p = scm_cdr (p)) { - if (Book *book = unsmob_book (scm_car (p))) + if (Book *book = unsmob (scm_car (p))) { Paper_book *paper_book_part = book->process (paper, layout, output_paper_book); if (paper_book_part) @@ -230,17 +219,28 @@ Book::process_bookparts (Paper_book *output_paper_book, Output_def *paper, Outpu void Book::process_score (SCM s, Paper_book *output_paper_book, Output_def *layout) { - if (Score *score = unsmob_score (scm_car (s))) + if (Score *score = unsmob (scm_car (s))) { SCM outputs = score ->book_rendering (output_paper_book->paper_, layout); while (scm_is_pair (outputs)) { - Music_output *output = unsmob_music_output (scm_car (outputs)); + Music_output *output = unsmob (scm_car (outputs)); if (Performance *perf = dynamic_cast (output)) - output_paper_book->add_performance (perf->self_scm ()); + { + output_paper_book->add_performance (perf->self_scm ()); + // Associate the performance with a \header block (if there is + // one in effect in the scope of the current score), to make the + // header metadata accessible when outputting the performance. + if (ly_is_module (score->get_header ())) + perf->set_header (score->get_header ()); + else if (ly_is_module (output_paper_book->header_)) + perf->set_header (output_paper_book->header_); + else if (ly_is_module (output_paper_book->header_0_)) + perf->set_header (output_paper_book->header_0_); + } else if (Paper_score *pscore = dynamic_cast (output)) { if (ly_is_module (score->get_header ())) @@ -252,7 +252,7 @@ Book::process_score (SCM s, Paper_book *output_paper_book, Output_def *layout) } } else if (Text_interface::is_markup_list (scm_car (s)) - || unsmob_page_marker (scm_car (s))) + || unsmob (scm_car (s))) output_paper_book->add_score (scm_car (s)); else assert (0); diff --git a/lily/box.cc b/lily/box.cc index df5ccb75b2..6569493419 100644 --- a/lily/box.cc +++ b/lily/box.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -132,21 +132,5 @@ Box::print () /****************************************************************/ -#include "ly-smobs.icc" -IMPLEMENT_SIMPLE_SMOBS (Box); -IMPLEMENT_TYPE_P (Box, "ly:box?"); -IMPLEMENT_DEFAULT_EQUAL_P (Box); - -SCM -Box::mark_smob (SCM /* x */) -{ - return SCM_EOL; -} - -int -Box::print_smob (SCM /* x */, SCM p, scm_print_state *) -{ - scm_puts ("#", p); - return 1; -} +const char * const Box::type_p_name_ = "ly:box?"; diff --git a/lily/break-align-engraver.cc b/lily/break-align-engraver.cc index 167f59de84..55a638da87 100644 --- a/lily/break-align-engraver.cc +++ b/lily/break-align-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,8 +40,8 @@ protected: virtual void derived_mark () const; public: TRANSLATOR_DECLARATIONS (Break_align_engraver); - DECLARE_ACKNOWLEDGER (break_aligned); - DECLARE_ACKNOWLEDGER (break_alignable); + void acknowledge_break_aligned (Grob_info); + void acknowledge_break_alignable (Grob_info); }; void @@ -118,7 +118,7 @@ Break_align_engraver::create_alignment (Grob_info inf) Context *origin = inf.origin_contexts (this)[0]; Translator_group *tg = origin->implementation (); - Engraver *random_source = dynamic_cast (unsmob_translator (scm_car (tg->get_simple_trans_list ()))); + Engraver *random_source = unsmob (scm_car (tg->get_simple_trans_list ())); if (!random_source) random_source = this; @@ -136,9 +136,9 @@ Break_align_engraver::add_to_group (SCM align_name, Item *item) SCM s = scm_assoc (align_name, column_alist_); Item *group = 0; - if (s != SCM_BOOL_F) + if (scm_is_true (s)) { - Grob *e = unsmob_grob (scm_cdr (s)); + Grob *e = unsmob (scm_cdr (s)); group = dynamic_cast (e); } else @@ -155,8 +155,13 @@ Break_align_engraver::add_to_group (SCM align_name, Item *item) Axis_group_interface::add_element (group, item); } -ADD_ACKNOWLEDGER (Break_align_engraver, break_aligned); -ADD_ACKNOWLEDGER (Break_align_engraver, break_alignable); +void +Break_align_engraver::boot () +{ + ADD_ACKNOWLEDGER (Break_align_engraver, break_aligned); + ADD_ACKNOWLEDGER (Break_align_engraver, break_alignable); +} + ADD_TRANSLATOR (Break_align_engraver, /* doc */ "Align grobs with corresponding @code{break-align-symbols}" diff --git a/lily/break-alignment-interface.cc b/lily/break-alignment-interface.cc index 8e231cf271..e2a546f6a6 100644 --- a/lily/break-alignment-interface.cc +++ b/lily/break-alignment-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -58,7 +58,7 @@ Break_alignment_interface::ordered_elements (Grob *grob) SCM order = break_align_order (me); - if (order == SCM_BOOL_F) + if (scm_is_false (order)) return elts; vector writable_elts (elts); @@ -94,7 +94,7 @@ MAKE_SCHEME_CALLBACK (Break_alignment_interface, calc_positioning_done, 1) SCM Break_alignment_interface::calc_positioning_done (SCM smob) { - Grob *grob = unsmob_grob (smob); + Grob *grob = unsmob (smob); Item *me = dynamic_cast (grob); me->set_property ("positioning-done", SCM_BOOL_T); @@ -144,8 +144,8 @@ Break_alignment_interface::calc_positioning_done (SCM smob) Grob *elt = elts[i]; if (edge_idx == VPOS - && (elt->get_property ("break-align-symbol") - == ly_symbol2scm ("left-edge"))) + && scm_is_eq (elt->get_property ("break-align-symbol"), + ly_symbol2scm ("left-edge"))) edge_idx = idx; SCM l = elt->get_property ("space-alist"); @@ -174,7 +174,7 @@ Break_alignment_interface::calc_positioning_done (SCM smob) } } - if (rsym == ly_symbol2scm ("left-edge")) + if (scm_is_eq (rsym, ly_symbol2scm ("left-edge"))) edge_idx = next_idx; SCM entry = SCM_EOL; @@ -189,8 +189,8 @@ Break_alignment_interface::calc_positioning_done (SCM smob) sym_string = ly_symbol2string (rsym); string orig_string; - if (unsmob_grob (l->get_property ("cause"))) - orig_string = unsmob_grob (l->get_property ("cause"))->name (); + if (unsmob (l->get_property ("cause"))) + orig_string = unsmob (l->get_property ("cause"))->name (); programming_error (to_string ("No spacing entry from %s to `%s'", orig_string.c_str (), @@ -210,11 +210,11 @@ Break_alignment_interface::calc_positioning_done (SCM smob) if (r) { - if (type == ly_symbol2scm ("extra-space")) + if (scm_is_eq (type, ly_symbol2scm ("extra-space"))) offsets[next_idx] = extents[idx][RIGHT] + distance - extents[next_idx][LEFT]; /* should probably junk minimum-space */ - else if (type == ly_symbol2scm ("minimum-space")) + else if (scm_is_eq (type, ly_symbol2scm ("minimum-space"))) offsets[next_idx] = max (extents[idx][RIGHT], distance); } else @@ -261,9 +261,9 @@ MAKE_SCHEME_CALLBACK (Break_alignable_interface, self_align_callback, 1) SCM Break_alignable_interface::self_align_callback (SCM grob) { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); Item *alignment = dynamic_cast (me->get_parent (X_AXIS)); - if (!Break_alignment_interface::has_interface (alignment)) + if (!has_interface (alignment)) return scm_from_int (0); SCM symbol_list = me->get_property ("break-align-symbols"); @@ -308,7 +308,7 @@ MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_average_anchor, 1) SCM Break_aligned_interface::calc_average_anchor (SCM grob) { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); Real avg = 0.0; int count = 0; @@ -331,7 +331,7 @@ MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_extent_aligned_anchor, 1) SCM Break_aligned_interface::calc_extent_aligned_anchor (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real alignment = robust_scm2double (me->get_property ("break-align-anchor-alignment"), 0.0); Interval iv = me->extent (me, X_AXIS); @@ -346,7 +346,7 @@ SCM Break_aligned_interface::calc_break_visibility (SCM smob) { /* a BreakAlignGroup is break-visible if it has one element that is break-visible */ - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); SCM ret = scm_c_make_vector (3, SCM_EOL); extract_grob_set (me, "elements", elts); for (int dir = 0; dir <= 2; dir++) @@ -363,6 +363,42 @@ Break_aligned_interface::calc_break_visibility (SCM smob) return ret; } +ADD_INTERFACE (Break_alignment_interface, + "The object that performs break alignment.\n" + "\n" + "Three interfaces deal specifically with break alignment:\n" + "@enumerate\n" + "@item break-alignment-interface (this one),\n" + "@item @ref{break-alignable-interface}, and\n" + "@item @ref{break-aligned-interface}.\n" + "@end enumerate\n" + "\n" + " Each of these interfaces supports grob properties that use" + " @w{@emph{break-align symbols}}, which are Scheme symbols that" + " are used to specify the alignment, ordering, and spacing of" + " certain notational elements (@q{breakable}@tie{}items)." + "\n" + "@subsubheading Available break-align symbols:\n" + "\n" + "@example\n" + "ambitus\n" + "breathing-sign\n" + "clef\n" + "cue-clef\n" + "cue-end-clef\n" + "custos\n" + "key-cancellation\n" + "key-signature\n" + "left-edge\n" + "staff-bar\n" + "time-signature\n" + "@end example", + + /* properties */ + "positioning-done " + "break-align-orders " + ); + ADD_INTERFACE (Break_alignable_interface, "Object that is aligned on a break alignment.", @@ -372,31 +408,7 @@ ADD_INTERFACE (Break_alignable_interface, ); ADD_INTERFACE (Break_aligned_interface, - "Items that are aligned in prefatory matter.\n" - "\n" - "The spacing of these items is controlled by the" - " @code{space-alist} property. It contains a list" - " @code{break-align-symbol}s with a specification of the" - " associated space. The space specification can be\n" - "\n" - "@table @code\n" - "@item (minimum-space . @var{spc}))\n" - "Pad space until the distance is @var{spc}.\n" - "@item (fixed-space . @var{spc})\n" - "Set a fixed space.\n" - "@item (semi-fixed-space . @var{spc})\n" - "Set a space. Half of it is fixed and half is stretchable." - " (does not work at start of line. fixme)\n" - "@item (extra-space . @var{spc})\n" - "Add @var{spc} amount of space.\n" - "@end table\n" - "\n" - "Special keys for the alist are @code{first-note} and" - " @code{next-note}, signifying the first note on a line, and" - " the next note halfway a line.\n" - "\n" - "Rules for this spacing are much more complicated than this." - " See [Wanske] page 126--134, [Ross] page 143--147.", + "Breakable items.", /* properties */ "break-align-anchor " @@ -404,12 +416,3 @@ ADD_INTERFACE (Break_aligned_interface, "break-align-symbol " "space-alist " ); - -ADD_INTERFACE (Break_alignment_interface, - "The object that performs break alignment. See" - " @ref{break-aligned-interface}.", - - /* properties */ - "positioning-done " - "break-align-orders " - ); diff --git a/lily/break-substitution.cc b/lily/break-substitution.cc index a0f03f753c..d198753d67 100644 --- a/lily/break-substitution.cc +++ b/lily/break-substitution.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -51,7 +51,7 @@ substitute_grob (Grob *sc) else { System *line - = dynamic_cast (unsmob_grob (break_criterion)); + = unsmob (break_criterion); if (sc->get_system () != line) sc = sc->find_broken_piece (line); @@ -101,9 +101,9 @@ do_break_substitution (SCM src) { again: - if (unsmob_grob (src)) + if (unsmob (src)) { - Grob *new_ptr = substitute_grob (unsmob_grob (src)); + Grob *new_ptr = substitute_grob (unsmob (src)); return new_ptr ? new_ptr->self_scm () : SCM_UNDEFINED; } else if (scm_is_vector (src)) @@ -125,8 +125,8 @@ again: SCM newcar = do_break_substitution (scm_car (src)); SCM oldcdr = scm_cdr (src); - if (newcar == SCM_UNDEFINED - && (scm_is_pair (oldcdr) || oldcdr == SCM_EOL)) + if (SCM_UNBNDP (newcar) + && (scm_is_pair (oldcdr) || scm_is_null (oldcdr))) { /* This is tail-recursion, ie. @@ -147,34 +147,6 @@ again: return src; } -/* - Perform substitution on GROB_LIST using a constant amount of stack. -*/ -vector temporary_substition_array; -void -substitute_grob_array (Grob_array *grob_arr, Grob_array *new_arr) -{ - vector &old_grobs (grob_arr->array_reference ()); - vector *new_grobs (new_arr == grob_arr - ? & temporary_substition_array - : &new_arr->array_reference ()); - - new_grobs->resize (old_grobs.size ()); - Grob **array = (Grob **) new_grobs->data (); - Grob **ptr = array; - for (vsize i = 0; i < old_grobs.size (); i++) - { - Grob *orig = old_grobs[i]; - Grob *new_grob = substitute_grob (orig); - if (new_grob) - *ptr++ = new_grob; - } - - new_grobs->resize (ptr - array); - if (new_arr == grob_arr) - new_arr->set_array (*new_grobs); -} - /* We don't do @@ -408,13 +380,13 @@ Spanner::fast_substitute_grob_array (SCM sym, set_break_subsititution (l ? l->self_scm () : SCM_UNDEFINED); SCM newval = sc->internal_get_object (sym); - if (!unsmob_grob_array (newval)) + if (!unsmob (newval)) { newval = Grob_array::make_array (); sc->set_object (sym, newval); } - Grob_array *new_array = unsmob_grob_array (newval); + Grob_array *new_array = unsmob (newval); for (int k = 0; k < 2; k++) for (int j = (*arrs[k])[i][LEFT]; j <= (*arrs[k])[i][RIGHT]; j++) { @@ -461,7 +433,7 @@ substitute_object_alist (SCM alist, SCM dest) SCM sym = scm_caar (s); SCM val = scm_cdar (s); - if (Grob_array *orig = unsmob_grob_array (val)) + if (Grob_array *orig = unsmob (val)) { SCM handle = scm_assq (sym, dest); SCM newval @@ -469,15 +441,15 @@ substitute_object_alist (SCM alist, SCM dest) ? scm_cdr (handle) : Grob_array::make_array (); - Grob_array *new_arr = unsmob_grob_array (newval); - - substitute_grob_array (orig, new_arr); + Grob_array *new_arr = unsmob (newval); + // TODO: What if new_arr is null? + new_arr->filter_map_assign (*orig, substitute_grob); val = newval; } else val = do_break_substitution (val); - if (val != SCM_UNDEFINED) + if (!SCM_UNBNDP (val)) { /* for ly:grob? properties, SCM_UNDEFINED could leak out @@ -497,7 +469,7 @@ Spanner::substitute_one_mutable_property (SCM sym, Spanner *s = this; bool fast_done = false; - Grob_array *grob_array = unsmob_grob_array (val); + Grob_array *grob_array = unsmob (val); if (grob_array) fast_done = s->fast_substitute_grob_array (sym, grob_array); @@ -511,12 +483,13 @@ Spanner::substitute_one_mutable_property (SCM sym, if (grob_array) { SCM newval = sc->internal_get_object (sym); - if (!unsmob_grob_array (newval)) + if (!unsmob (newval)) { newval = Grob_array::make_array (); sc->set_object (sym, newval); } - substitute_grob_array (grob_array, unsmob_grob_array (newval)); + Grob_array *new_arr = unsmob (newval); + new_arr->filter_map_assign (*grob_array, substitute_grob); } else { diff --git a/lily/breathing-sign-engraver.cc b/lily/breathing-sign-engraver.cc index ff64684546..ade1b15f29 100644 --- a/lily/breathing-sign-engraver.cc +++ b/lily/breathing-sign-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Michael Krause + Copyright (C) 1999--2015 Michael Krause written for the GNU LilyPond music typesetter @@ -39,7 +39,7 @@ protected: void process_music (); void stop_translation_timestep (); - DECLARE_TRANSLATOR_LISTENER (breathing); + void listen_breathing (Stream_event *); private: Stream_event *breathing_sign_event_; Grob *breathing_sign_; @@ -51,7 +51,6 @@ Breathing_sign_engraver::Breathing_sign_engraver () breathing_sign_event_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Breathing_sign_engraver, breathing); void Breathing_sign_engraver::listen_breathing (Stream_event *ev) { @@ -74,6 +73,12 @@ Breathing_sign_engraver::stop_translation_timestep () breathing_sign_event_ = 0; } +void +Breathing_sign_engraver::boot () +{ + ADD_LISTENER (Breathing_sign_engraver, breathing); +} + ADD_TRANSLATOR (Breathing_sign_engraver, /* doc */ "Create a breathing sign.", diff --git a/lily/breathing-sign.cc b/lily/breathing-sign.cc index e568e358e9..6037e777e5 100644 --- a/lily/breathing-sign.cc +++ b/lily/breathing-sign.cc @@ -1,8 +1,8 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Michael Krause - Extensions for ancient notation (c) 2003--2012 by Juergen Reuter + Copyright (C) 1999--2015 Michael Krause + Extensions for ancient notation (c) 2003--2015 by Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,7 +43,7 @@ MAKE_SCHEME_CALLBACK (Breathing_sign, divisio_minima, 1); SCM Breathing_sign::divisio_minima (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real staff_space = Staff_symbol_referencer::staff_space (me); Real thickness = Staff_symbol_referencer::line_thickness (me); @@ -69,7 +69,7 @@ MAKE_SCHEME_CALLBACK (Breathing_sign, divisio_maior, 1); SCM Breathing_sign::divisio_maior (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real thickness = Staff_symbol_referencer::line_thickness (me); thickness *= robust_scm2double (me->get_property ("thickness"), 1.0); @@ -119,7 +119,7 @@ Breathing_sign::divisio_maior (SCM smob) ydim[DOWN]); assert (line_pos.begin () < it); double val = (it[-1] + it[0]) / 2; - if (ydim[DOWN] < val && line_pos.begin () < it + 1) + if (ydim[DOWN] < val && line_pos.begin () < it - 1) val = (it[-2] + it[-1]) / 2; ydim.add_point (val); @@ -149,7 +149,7 @@ MAKE_SCHEME_CALLBACK (Breathing_sign, divisio_maxima, 1); SCM Breathing_sign::divisio_maxima (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real staff_space = Staff_symbol_referencer::staff_space (me); Real thickness = Staff_symbol_referencer::line_thickness (me); thickness *= robust_scm2double (me->get_property ("thickness"), 1.0); @@ -172,7 +172,7 @@ MAKE_SCHEME_CALLBACK (Breathing_sign, finalis, 1); SCM Breathing_sign::finalis (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real staff_space = Staff_symbol_referencer::staff_space (me); Real thickness = Staff_symbol_referencer::line_thickness (me); thickness *= robust_scm2double (me->get_property ("thickness"), 1.0); @@ -196,7 +196,7 @@ MAKE_SCHEME_CALLBACK (Breathing_sign, offset_callback, 1); SCM Breathing_sign::offset_callback (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Direction d = get_grob_direction (me); if (!d) diff --git a/lily/change-iterator.cc b/lily/change-iterator.cc index aa505f9fe1..0f8823d484 100644 --- a/lily/change-iterator.cc +++ b/lily/change-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,66 +44,58 @@ Change_iterator::error (const string &reason) get_music ()->origin ()->warning (warn1); } +string +Change_iterator::change_to (Music_iterator &it, + SCM to_type, + const string &to_id) +{ + string result; // error message + + // Find the context that should have its parent changed. + Context *last = find_context_above_by_parent_type (it.get_outlet (), to_type); + if (last) + { + // Find the new parent. + Context *dest = find_context_near (it.get_outlet (), to_type, to_id); + if (dest) + { + send_stream_event (last, "ChangeParent", it.get_music ()->origin (), + ly_symbol2scm ("context"), dest->self_scm ()); + } + else + /* FIXME: constant error message. */ + it.get_music ()->origin ()->warning (_ ("cannot find context to switch to")); + } + else if (it.get_outlet ()->is_alias (to_type)) + { + // No enclosing context was found because the iterator's immediate + // context is the kind that was sought. + /* We could change the current translator's id, but that would make + errors hard to catch. + + last->translator_id_string () = get_change + ()->change_to_id_string (); */ + result = _f ("not changing to same context type: %s", ly_symbol2string (to_type).c_str ()); + } + else + /* FIXME: incomprehensible message */ + result = _ ("none of these in my family"); + + return result; +} + /* move to construct_children ? */ void Change_iterator::process (Moment m) { - Context *current = get_outlet (); - Context *last = 0; - SCM to_type = get_music ()->get_property ("change-to-type"); string to_id = ly_scm2string (get_music ()->get_property ("change-to-id")); - /* find the type of translator that we're changing. - - If \translator Staff = bass, then look for Staff = * - */ - while (current && !current->is_alias (to_type)) - { - last = current; - current = current->get_parent_context (); - } - - if (current && current->id_string () == to_id) - { - string msg; - msg += _f ("cannot change, already in translator: %s", to_id); - } - - if (current) - if (last) - { - Context *dest = 0; - Context *where = get_outlet (); - while (!dest && where) - { - dest = find_context_below (where, to_type, to_id); - where = where->get_parent_context (); - } - - if (dest) - { - send_stream_event (last, "ChangeParent", get_music ()->origin (), - ly_symbol2scm ("context"), dest->self_scm ()); - } - else - /* FIXME: constant error message. */ - get_music ()->origin ()->warning (_ ("cannot find context to switch to")); - } - else - { - /* We could change the current translator's id, but that would make - errors hard to catch. - - last->translator_id_string () = get_change - ()->change_to_id_string (); */ - error (_f ("not changing to same context type: %s", ly_symbol2string (to_type).c_str ())); - } - else - /* FIXME: uncomprehensable message */ - error (_ ("none of these in my family")); + string msg = change_to (*this, to_type, to_id); + if (!msg.empty ()) + error (msg); Simple_music_iterator::process (m); } diff --git a/lily/change-sequence-iterator.cc b/lily/change-sequence-iterator.cc new file mode 100644 index 0000000000..02ed77dd06 --- /dev/null +++ b/lily/change-sequence-iterator.cc @@ -0,0 +1,67 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2015 Daniel Eble + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#include "change-sequence-iterator.hh" +#include "context.hh" +#include "music.hh" + +Change_sequence_iterator::Change_sequence_iterator () : + change_list_(SCM_EOL) +{ +} + +void +Change_sequence_iterator::construct_children () +{ + Music_wrapper_iterator::construct_children (); + + change_list_ = get_music ()->get_property ("context-change-list"); +} + +void +Change_sequence_iterator::process (Moment m) +{ + // Find the ID of the output context to use now. The loop is a bit of + // paranoia; we shouldn't expect multiple changes between moments in this + // part. + SCM context_id = SCM_EOL; + for (; scm_is_pair (change_list_); change_list_ = scm_cdr (change_list_)) + { + SCM mom_scm = scm_caar (change_list_); + Moment *mom = unsmob (mom_scm); + if (mom) + { + if (*mom > m) + break; + + context_id = scm_cdar (change_list_); + } + else + { + string s = "expected moment in change list: "; + s += ly_scm2string (mom_scm); + programming_error (s); + } + } + + if (!scm_is_null (context_id)) + change_to (ly_symbol2string (context_id)); + + Music_wrapper_iterator::process (m); +} diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc index 26b4a607bb..3a14ff4b07 100644 --- a/lily/chord-name-engraver.cc +++ b/lily/chord-name-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,14 +39,11 @@ protected: void stop_translation_timestep (); void process_music (); virtual void finalize (); - virtual void derived_mark () const; - DECLARE_TRANSLATOR_LISTENER (note); - DECLARE_TRANSLATOR_LISTENER (rest); + void listen_note (Stream_event *); + void listen_rest (Stream_event *); private: - Item *chord_name_; vector notes_; - SCM last_chord_; Stream_event *rest_event_; }; @@ -55,114 +52,103 @@ Chord_name_engraver::finalize () { } -void -Chord_name_engraver::derived_mark () const -{ - scm_gc_mark (last_chord_); -} - Chord_name_engraver::Chord_name_engraver () { - chord_name_ = 0; - last_chord_ = SCM_EOL; rest_event_ = 0; } void Chord_name_engraver::process_music () { - if (!rest_event_ && !notes_.size ()) - return; - - chord_name_ = make_item ("ChordName", - rest_event_ ? rest_event_->self_scm () : notes_[0]->self_scm ()); - - SCM maybe_markup = chord_name_->get_property_data ("text"); - - bool make_markup = !(Text_interface::is_markup (maybe_markup) - || ly_is_procedure (maybe_markup)); + if (!rest_event_ && notes_.empty ()) + return; SCM markup; - - if (rest_event_ && !make_markup) { } - else if (rest_event_) + SCM bass = SCM_EOL; + SCM inversion = SCM_EOL; + SCM pitches = SCM_EOL; + Item *chord_name = 0; + + // rest events present a hen-and-egg problem with regard to + // overriding the text property of the ChordName grob since we + // cannot create a ChordName grob, look at its text property and, if + // not set, use noChordSymbol to decide whether we should not have + // created the grob in the first place. + if (rest_event_) { SCM no_chord_markup = get_property ("noChordSymbol"); if (!Text_interface::is_markup (no_chord_markup)) return; markup = no_chord_markup; + chord_name = make_item ("ChordName", rest_event_->self_scm ()); + chord_name->set_property ("text", markup); } else { - SCM bass = SCM_EOL; - SCM inversion = SCM_EOL; - SCM pitches = SCM_EOL; - - Stream_event *inversion_event = 0; - for (vsize i = 0; i < notes_.size (); i++) + chord_name = make_item ("ChordName", notes_[0]->self_scm ()); + // We cannot actually delay fetching the text property in case + // it is a callback since we need to compare the generated + // markups for the sake of chordChanges + markup = chord_name->get_property ("text"); + if (!Text_interface::is_markup (markup)) { - Stream_event *n = notes_[i]; - SCM p = n->get_property ("pitch"); - if (!unsmob_pitch (p)) - continue; - - if (n->get_property ("inversion") == SCM_BOOL_T) + for (vsize i = 0; i < notes_.size (); i++) { - inversion_event = n; - inversion = p; + Stream_event *n = notes_[i]; + SCM p = n->get_property ("pitch"); + if (!unsmob (p)) + continue; + + if (to_boolean (n->get_property ("bass"))) + bass = p; + else + { + SCM oct = n->get_property ("octavation"); + if (scm_is_number (oct)) + { + Pitch orig = unsmob (p)->transposed (Pitch (-scm_to_int (oct), 0)); + pitches = scm_cons (orig.smobbed_copy (), pitches); + } + else + pitches = scm_cons (p, pitches); + if (to_boolean (n->get_property ("inversion"))) + { + inversion = p; + if (!scm_is_number (oct)) + programming_error ("inversion does not have original pitch"); + } + } } - else if (n->get_property ("bass") == SCM_BOOL_T) - bass = p; - else - pitches = scm_cons (p, pitches); - } - if (inversion_event) - { - SCM oct = inversion_event->get_property ("octavation"); - if (scm_is_number (oct)) - { - Pitch *p = unsmob_pitch (inversion_event->get_property ("pitch")); - int octavation = scm_to_int (oct); - Pitch orig = p->transposed (Pitch (-octavation, 0, 0)); + pitches = scm_sort_list (pitches, Pitch::less_p_proc); - pitches = scm_cons (orig.smobbed_copy (), pitches); + SCM name_proc = get_property ("chordNameFunction"); + markup = scm_call_4 (name_proc, pitches, bass, inversion, + context ()->self_scm ()); + if (!Text_interface::is_markup (markup)) + { + // Ugh, we created a grob, now we better populate it. + // Use an empty string. + markup = scm_string (SCM_EOL); } - else - programming_error ("inversion does not have original pitch"); + chord_name->set_property ("text", markup); } - - pitches = scm_sort_list (pitches, Pitch::less_p_proc); - - SCM name_proc = get_property ("chordNameFunction"); - if (make_markup) - markup = scm_call_4 (name_proc, pitches, bass, inversion, - context ()->self_scm ()); } - /* - Ugh. - */ - if (make_markup) - chord_name_->set_property ("text", markup); - else if (Text_interface::is_markup (maybe_markup)) - markup = maybe_markup; SCM chord_changes = get_property ("chordChanges"); - if (to_boolean (chord_changes) && scm_is_pair (last_chord_) - && ly_is_equal (markup, last_chord_)) - chord_name_->set_property ("begin-of-line-visible", SCM_BOOL_T); + SCM last_chord = get_property ("lastChord"); + if (to_boolean (chord_changes) && ly_is_equal (markup, last_chord)) + chord_name->set_property ("begin-of-line-visible", SCM_BOOL_T); - last_chord_ = markup; + context ()->set_property ("lastChord", markup); } -IMPLEMENT_TRANSLATOR_LISTENER (Chord_name_engraver, note); void Chord_name_engraver::listen_note (Stream_event *ev) { notes_.push_back (ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Chord_name_engraver, rest); void Chord_name_engraver::listen_rest (Stream_event *ev) { @@ -172,7 +158,6 @@ Chord_name_engraver::listen_rest (Stream_event *ev) void Chord_name_engraver::stop_translation_timestep () { - chord_name_ = 0; notes_.clear (); rest_event_ = 0; } @@ -181,6 +166,13 @@ Chord_name_engraver::stop_translation_timestep () The READs description is not strictly accurate: which properties are read depend on the chord naming function active. */ +void +Chord_name_engraver::boot () +{ + ADD_LISTENER (Chord_name_engraver, note); + ADD_LISTENER (Chord_name_engraver, rest); +} + ADD_TRANSLATOR (Chord_name_engraver, /* doc */ "Catch note and rest events and generate the appropriate chordname.", @@ -195,9 +187,10 @@ ADD_TRANSLATOR (Chord_name_engraver, "chordNoteNamer " "chordRootNamer " "chordNameExceptions " + "lastChord " "majorSevenSymbol " "noChordSymbol ", /* write */ - "" + "lastChord " ); diff --git a/lily/chord-name.cc b/lily/chord-name.cc index 9d400a5da5..8111c77117 100644 --- a/lily/chord-name.cc +++ b/lily/chord-name.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Jan Nieuwenhuizen + Copyright (C) 1999--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,7 @@ MAKE_SCHEME_CALLBACK (Chord_name, after_line_breaking, 1); SCM Chord_name::after_line_breaking (SCM smob) { - Item *me = unsmob_item (smob); + Item *me = unsmob (smob); assert (me); SCM s = me->get_property ("begin-of-line-visible"); diff --git a/lily/chord-tremolo-engraver.cc b/lily/chord-tremolo-engraver.cc index fd4199527a..7a17c1350e 100644 --- a/lily/chord-tremolo-engraver.cc +++ b/lily/chord-tremolo-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys Erik Sandberg LilyPond is free software: you can redistribute it and/or modify @@ -62,8 +62,8 @@ protected: protected: virtual void finalize (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (tremolo_span); - DECLARE_ACKNOWLEDGER (stem); + void listen_tremolo_span (Stream_event *); + void acknowledge_stem (Grob_info); }; Chord_tremolo_engraver::Chord_tremolo_engraver () @@ -73,7 +73,6 @@ Chord_tremolo_engraver::Chord_tremolo_engraver () previous_stem_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Chord_tremolo_engraver, tremolo_span); void Chord_tremolo_engraver::listen_tremolo_span (Stream_event *ev) { @@ -158,7 +157,13 @@ Chord_tremolo_engraver::acknowledge_stem (Grob_info info) } } -ADD_ACKNOWLEDGER (Chord_tremolo_engraver, stem); +void +Chord_tremolo_engraver::boot () +{ + ADD_LISTENER (Chord_tremolo_engraver, tremolo_span); + ADD_ACKNOWLEDGER (Chord_tremolo_engraver, stem); +} + ADD_TRANSLATOR (Chord_tremolo_engraver, /* doc */ "Generate beams for tremolo repeats.", diff --git a/lily/chord-tremolo-iterator.cc b/lily/chord-tremolo-iterator.cc index 06a201f937..d95ea1ae3c 100644 --- a/lily/chord-tremolo-iterator.cc +++ b/lily/chord-tremolo-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys Erik Sandberg LilyPond is free software: you can redistribute it and/or modify @@ -20,10 +20,8 @@ #include "chord-tremolo-iterator.hh" -#include "input.hh" -#include "international.hh" -#include "misc.hh" #include "repeated-music.hh" +#include "lily-imports.hh" Chord_tremolo_iterator::Chord_tremolo_iterator () { @@ -32,40 +30,7 @@ Chord_tremolo_iterator::Chord_tremolo_iterator () SCM Chord_tremolo_iterator::get_music_list () const { - Music *mus = get_music (); - Input *origin = mus->origin (); - Music *body = Repeated_music::body (mus); - bool body_is_sequential = body->is_mus_type ("sequential-music"); - - int elt_count = body_is_sequential ? scm_ilength (body->get_property ("elements")) : 1; - - if (elt_count <= 0) - elt_count = 1; - - if (elt_count == 1) - { - Music *ev = make_music_by_name (ly_symbol2scm ("TremoloEvent")); - ev->set_spot (*origin); - ev->set_property ("repeat-count", mus->get_property ("repeat-count")); - ev->set_property ("tremolo-type", mus->get_property ("tremolo-type")); - return scm_list_2 (ev->unprotect (), body->self_scm ()); - } - else - { - SCM tremolo_symbol = ly_symbol2scm ("TremoloSpanEvent"); - SCM start_event_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), tremolo_symbol, scm_from_int (START)); - unsmob_music (start_event_scm)->set_spot (*origin); - SCM stop_event_scm = scm_call_2 (ly_lily_module_constant ("make-span-event"), tremolo_symbol, scm_from_int (STOP)); - - Music *start_event = unsmob_music (start_event_scm); - Music *stop_event = unsmob_music (stop_event_scm); - start_event->set_spot (*origin); - stop_event->set_spot (*origin); - start_event->set_property ("repeat-count", mus->get_property ("repeat-count")); - start_event->set_property ("tremolo-type", mus->get_property ("tremolo-type")); - - return scm_list_3 (start_event_scm, body->self_scm (), stop_event_scm); - } + return Lily::tremolo_get_music_list (get_music ()->self_scm ()); } IMPLEMENT_CTOR_CALLBACK (Chord_tremolo_iterator); diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc index 9e2a3eaa7f..00b3c3e55a 100644 --- a/lily/clef-engraver.cc +++ b/lily/clef-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Mats Bengtsson LilyPond is free software: you can redistribute it and/or modify @@ -29,6 +29,7 @@ using namespace std; #include "side-position-interface.hh" #include "translator.icc" +#include "lily-imports.hh" class Clef_engraver : public Engraver { @@ -38,7 +39,7 @@ public: protected: void stop_translation_timestep (); void process_music (); - DECLARE_ACKNOWLEDGER (bar_line); + void acknowledge_bar_line (Grob_info); virtual void derived_mark () const; private: @@ -145,7 +146,7 @@ static void apply_on_children (Context *context, SCM fun) scm_call_1 (fun, context->self_scm ()); for (SCM s = context->children_contexts (); scm_is_pair (s); s = scm_cdr (s)) - apply_on_children (unsmob_context (scm_car (s)), fun); + apply_on_children (unsmob (scm_car (s)), fun); } void @@ -156,17 +157,16 @@ Clef_engraver::inspect_clef_properties () SCM transposition = get_property ("clefTransposition"); SCM force_clef = get_property ("forceClef"); - if (clefpos == SCM_EOL - || scm_equal_p (glyph, prev_glyph_) == SCM_BOOL_F - || scm_equal_p (clefpos, prev_cpos_) == SCM_BOOL_F - || scm_equal_p (transposition, prev_transposition_) == SCM_BOOL_F + if (scm_is_null (clefpos) + || !ly_is_equal (glyph, prev_glyph_) + || !ly_is_equal (clefpos, prev_cpos_) + || !ly_is_equal (transposition, prev_transposition_) || to_boolean (force_clef)) { - apply_on_children (context (), - ly_lily_module_constant ("invalidate-alterations")); + apply_on_children (context (), Lily::invalidate_alterations); set_glyph (); - if (prev_cpos_ != SCM_BOOL_F || to_boolean (get_property ("firstClef"))) + if (scm_is_true (prev_cpos_) || to_boolean (get_property ("firstClef"))) create_clef (); if (clef_) @@ -203,7 +203,12 @@ Clef_engraver::stop_translation_timestep () } } -ADD_ACKNOWLEDGER (Clef_engraver, bar_line); +void +Clef_engraver::boot () +{ + ADD_ACKNOWLEDGER (Clef_engraver, bar_line); +} + ADD_TRANSLATOR (Clef_engraver, /* doc */ "Determine and set reference point for pitches.", diff --git a/lily/clef-modifier.cc b/lily/clef-modifier.cc new file mode 100644 index 0000000000..c6ce950fc0 --- /dev/null +++ b/lily/clef-modifier.cc @@ -0,0 +1,66 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2014--2015 Janek Warchoł + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#include "item.hh" + +struct Clef_modifier +{ + DECLARE_SCHEME_CALLBACK (calc_parent_alignment, (SCM)); +}; + +MAKE_SCHEME_CALLBACK (Clef_modifier, calc_parent_alignment, 1) +SCM +Clef_modifier::calc_parent_alignment (SCM smob) +{ + Grob *me = unsmob (smob); + Grob *clef = me->get_parent (X_AXIS); + string full_clef_name = ly_scm2string (clef->get_property ("glyph")); + string clef_name = replace_all(&full_clef_name, "clefs.", ""); + + // find entry with keyname clef_type in clef-alignments + SCM alist_entry = scm_assq (ly_symbol2scm (clef_name.c_str ()), + me->get_property ("clef-alignments")); + + if (scm_is_pair (alist_entry)) + { + SCM entry_value = scm_cdr (alist_entry); + // the value should be a pair of numbers - first is the alignment + // for modifiers below the clef, second for those above. + if (scm_is_pair (entry_value)) + if (robust_scm2dir (me->get_property ("direction"), DOWN) == DOWN) + return scm_car (entry_value); + else + return scm_cdr (entry_value); + + else // default alignment = centered + return scm_from_double (0); + } + else // default alignment = centered + return scm_from_double (0); +} + +ADD_INTERFACE (Clef_modifier, + "The number describing transposition of the clef, placed below\n" + "or above clef sign. Usually this is 8 (octave transposition)\n" + "or 15 (two octaves), but LilyPond allows any integer here.", + + /* properties */ + "clef-alignments " + ); + diff --git a/lily/clef.cc b/lily/clef.cc index b58bef9987..6f9062190e 100644 --- a/lily/clef.cc +++ b/lily/clef.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ MAKE_SCHEME_CALLBACK (Clef, calc_glyph_name, 1); SCM Clef::calc_glyph_name (SCM smob) { - Item *s = unsmob_item (smob); + Item *s = unsmob (smob); SCM glyph = s->get_property ("glyph"); if (scm_is_string (glyph)) @@ -53,7 +53,7 @@ MAKE_SCHEME_CALLBACK (Clef, print, 1) SCM Clef::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); SCM glyph_scm = me->get_property ("glyph-name"); if (!scm_is_string (glyph_scm)) return SCM_EOL; diff --git a/lily/cluster-engraver.cc b/lily/cluster-engraver.cc index 650ce2ba35..0c84d1cb65 100644 --- a/lily/cluster-engraver.cc +++ b/lily/cluster-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Juergen Reuter + Copyright (C) 2002--2015 Juergen Reuter Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -34,8 +34,8 @@ class Cluster_spanner_engraver : public Engraver protected: TRANSLATOR_DECLARATIONS (Cluster_spanner_engraver); - DECLARE_TRANSLATOR_LISTENER (cluster_note); - DECLARE_ACKNOWLEDGER (note_column); + void listen_cluster_note (Stream_event *); + void acknowledge_note_column (Grob_info); void stop_translation_timestep (); virtual void process_music (); virtual void finalize (); @@ -81,7 +81,6 @@ Cluster_spanner_engraver::typeset_grobs () beacon_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Cluster_spanner_engraver, cluster_note); void Cluster_spanner_engraver::listen_cluster_note (Stream_event *ev) { @@ -101,7 +100,7 @@ Cluster_spanner_engraver::process_music () for (vsize i = 0; i < cluster_notes_.size (); i++) { - Pitch *pit = unsmob_pitch (cluster_notes_[i]->get_property ("pitch")); + Pitch *pit = unsmob (cluster_notes_[i]->get_property ("pitch")); int p = (pit ? pit->steps () : 0) + c0; @@ -135,14 +134,20 @@ Cluster_spanner_engraver::stop_translation_timestep () void Cluster_spanner_engraver::acknowledge_note_column (Grob_info info) { - if (!beacon_ && Note_column::has_interface (info.grob ())) + if (!beacon_ && has_interface (info.grob ())) { finished_spanner_ = spanner_; spanner_ = 0; } } -ADD_ACKNOWLEDGER (Cluster_spanner_engraver, note_column); +void +Cluster_spanner_engraver::boot () +{ + ADD_LISTENER (Cluster_spanner_engraver, cluster_note); + ADD_ACKNOWLEDGER (Cluster_spanner_engraver, note_column); +} + ADD_TRANSLATOR (Cluster_spanner_engraver, /* doc */ "Engrave a cluster using @code{Spanner} notation.", diff --git a/lily/cluster.cc b/lily/cluster.cc index ac0abc9c74..9c160fd8cc 100644 --- a/lily/cluster.cc +++ b/lily/cluster.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Juergen Reuter + Copyright (C) 2002--2015 Juergen Reuter Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -125,7 +125,7 @@ MAKE_SCHEME_CALLBACK (Cluster, calc_cross_staff, 1); SCM Cluster::calc_cross_staff (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "columns", cols); Grob *commony = common_refpoint_of_array (cols, me, Y_AXIS); @@ -137,7 +137,7 @@ MAKE_SCHEME_CALLBACK (Cluster, print, 1); SCM Cluster::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Spanner *spanner = dynamic_cast (me); if (!spanner) @@ -228,14 +228,13 @@ struct Cluster_beacon { public: DECLARE_SCHEME_CALLBACK (height, (SCM)); - DECLARE_GROB_INTERFACE (); }; MAKE_SCHEME_CALLBACK (Cluster_beacon, height, 1); SCM Cluster_beacon::height (SCM g) { - Grob *me = unsmob_grob (g); + Grob *me = unsmob (g); Interval v = robust_scm2interval (me->get_property ("positions"), Interval (0, 0)); return ly_interval2scm (Staff_symbol_referencer::staff_space (me) * 0.5 * v); diff --git a/lily/coherent-ligature-engraver.cc b/lily/coherent-ligature-engraver.cc index 3e2915e719..2ba9eeca85 100644 --- a/lily/coherent-ligature-engraver.cc +++ b/lily/coherent-ligature-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Juergen Reuter + Copyright (C) 2003--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -151,7 +151,7 @@ compute_delta_pitches (vector const &primitives) primitive = dynamic_cast (primitives[i].grob ()); Stream_event *cause = primitives[i].event_cause (); int pitch - = unsmob_pitch (cause->get_property ("pitch"))->steps (); + = unsmob (cause->get_property ("pitch"))->steps (); if (prev_primitive) { delta_pitch = pitch - prev_pitch; diff --git a/lily/collision-engraver.cc b/lily/collision-engraver.cc index 4b4d91f2ba..ca6a52d320 100644 --- a/lily/collision-engraver.cc +++ b/lily/collision-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,13 +23,15 @@ #include "axis-group-interface.hh" #include "item.hh" +#include "translator.icc" + class Collision_engraver : public Engraver { Item *col_; vector note_columns_; protected: - DECLARE_ACKNOWLEDGER (note_column); + void acknowledge_note_column (Grob_info); void process_acknowledged (); void stop_translation_timestep (); public: @@ -51,7 +53,7 @@ Collision_engraver::process_acknowledged () void Collision_engraver::acknowledge_note_column (Grob_info i) { - if (Note_column::has_interface (i.grob ())) + if (has_interface (i.grob ())) { /*should check Y axis? */ if (Note_column::has_rests (i.grob ()) || i.grob ()->get_parent (X_AXIS)) @@ -76,9 +78,12 @@ Collision_engraver::Collision_engraver () col_ = 0; } -#include "translator.icc" -ADD_ACKNOWLEDGER (Collision_engraver, note_column); +void +Collision_engraver::boot () +{ + ADD_ACKNOWLEDGER (Collision_engraver, note_column); +} ADD_TRANSLATOR (Collision_engraver, /* doc */ diff --git a/lily/column-x-positions.cc b/lily/column-x-positions.cc index a5b5c65fb2..d5d60e110b 100644 --- a/lily/column-x-positions.cc +++ b/lily/column-x-positions.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/completion-note-heads-engraver.cc b/lily/completion-note-heads-engraver.cc index 52a7d6c0bd..ef3a5012a2 100644 --- a/lily/completion-note-heads-engraver.cc +++ b/lily/completion-note-heads-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -59,7 +59,7 @@ class Completion_heads_engraver : public Engraver vector notes_; vector prev_notes_; // Must remember notes for explicit ties. - vector ties_; + vector ties_; vector note_events_; Spanner *tie_column_; Moment note_end_mom_; @@ -80,7 +80,7 @@ protected: void start_translation_timestep (); void process_music (); void stop_translation_timestep (); - DECLARE_TRANSLATOR_LISTENER (note); + void listen_note (Stream_event *); }; void @@ -89,7 +89,6 @@ Completion_heads_engraver::initialize () is_first_ = false; } -IMPLEMENT_TRANSLATOR_LISTENER (Completion_heads_engraver, note); void Completion_heads_engraver::listen_note (Stream_event *ev) { @@ -109,15 +108,21 @@ Completion_heads_engraver::listen_note (Stream_event *ev) Moment Completion_heads_engraver::next_moment (Rational const ¬e_len) { - Moment *e = unsmob_moment (get_property ("measurePosition")); - Moment *l = unsmob_moment (get_property ("measureLength")); + Moment *e = unsmob (get_property ("measurePosition")); + Moment *l = unsmob (get_property ("measureLength")); if (!e || !l || !to_boolean (get_property ("timing"))) { return Moment (0, 0); } Moment result = *l - *e; - Moment const *unit = unsmob_moment (get_property ("completionUnit")); + if (result < 0) + { + programming_error ("invalid measure position: " + + e->to_string () + " of " + l->to_string ()); + return 0; + } + Moment const *unit = unsmob (get_property ("completionUnit")); if (unit) { @@ -156,9 +161,9 @@ Item * Completion_heads_engraver::make_note_head (Stream_event *ev) { Item *note = make_item ("NoteHead", ev->self_scm ()); - Pitch *pit = unsmob_pitch (ev->get_property ("pitch")); + Pitch *pit = unsmob (ev->get_property ("pitch")); - int pos = pit->steps (); + int pos = pit ? pit->steps () : 0; SCM c0 = get_property ("middleCPosition"); if (scm_is_number (c0)) pos += scm_to_int (c0); @@ -188,25 +193,24 @@ Completion_heads_engraver::process_music () note that note_dur may be strictly less than left_to_do_ (say, if left_to_do_ == 5/8) */ - if (factor_.denominator () == 1 && factor_ > Rational (1, 1)) - note_dur = Duration (left_to_do_, false); - else - note_dur = Duration (left_to_do_ / factor_, false).compressed (factor_); + note_dur = Duration (left_to_do_ / factor_, false).compressed (factor_); } else { - orig = unsmob_duration (note_events_[0]->get_property ("duration")); + orig = unsmob (note_events_[0]->get_property ("duration")); note_dur = *orig; - factor_ = note_dur.factor (); + SCM factor = get_property ("completionFactor"); + if (ly_is_procedure (factor)) + factor = scm_call_2 (factor, + context ()->self_scm (), + note_dur.smobbed_copy ()); + factor_ = robust_scm2rational (factor, note_dur.factor ()); left_to_do_ = orig->get_length (); } Moment nb = next_moment (note_dur.get_length ()); if (nb.main_part_ && nb < note_dur.get_length ()) { - if (factor_.denominator () == 1 && factor_.numerator () > 1) - note_dur = Duration (nb.main_part_, false); - else - note_dur = Duration (nb.main_part_ / factor_, false).compressed (factor_); + note_dur = Duration (nb.main_part_ / factor_, false).compressed (factor_); } do_nothing_until_ = now.main_part_ + note_dur.get_length (); @@ -266,7 +270,7 @@ Completion_heads_engraver::process_music () void Completion_heads_engraver::make_tie (Grob *left, Grob *right) { - Grob *p = make_spanner ("Tie", SCM_EOL); + Spanner *p = make_spanner ("Tie", SCM_EOL); Tie::set_head (p, LEFT, left); Tie::set_head (p, RIGHT, right); announce_end_grob (p, SCM_EOL); @@ -302,6 +306,12 @@ Completion_heads_engraver::Completion_heads_engraver () tie_column_ = 0; } +void +Completion_heads_engraver::boot () +{ + ADD_LISTENER (Completion_heads_engraver, note); +} + ADD_TRANSLATOR (Completion_heads_engraver, /* doc */ "This engraver replaces @code{Note_heads_engraver}. It plays" @@ -314,6 +324,7 @@ ADD_TRANSLATOR (Completion_heads_engraver, "TieColumn ", /* read */ + "completionFactor " "completionUnit " "measureLength " "measurePosition " diff --git a/lily/completion-rest-engraver.cc b/lily/completion-rest-engraver.cc index 61255226ea..2b5693916e 100644 --- a/lily/completion-rest-engraver.cc +++ b/lily/completion-rest-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -76,7 +76,7 @@ protected: void start_translation_timestep (); void process_music (); void stop_translation_timestep (); - DECLARE_TRANSLATOR_LISTENER (rest); + void listen_rest (Stream_event *); }; void @@ -85,7 +85,6 @@ Completion_rest_engraver::initialize () is_first_ = false; } -IMPLEMENT_TRANSLATOR_LISTENER (Completion_rest_engraver, rest); void Completion_rest_engraver::listen_rest (Stream_event *ev) { @@ -105,15 +104,15 @@ Completion_rest_engraver::listen_rest (Stream_event *ev) Moment Completion_rest_engraver::next_moment (Rational const ¬e_len) { - Moment *e = unsmob_moment (get_property ("measurePosition")); - Moment *l = unsmob_moment (get_property ("measureLength")); + Moment *e = unsmob (get_property ("measurePosition")); + Moment *l = unsmob (get_property ("measureLength")); if (!e || !l || !to_boolean (get_property ("timing"))) { return Moment (0, 0); } Moment result = *l - *e; - Moment const *unit = unsmob_moment (get_property ("completionUnit")); + Moment const *unit = unsmob (get_property ("completionUnit")); if (unit) { @@ -152,7 +151,7 @@ Item * Completion_rest_engraver::make_rest (Stream_event *ev) { Item *rest = make_item ("Rest", ev->self_scm ()); - if (Pitch *p = unsmob_pitch (ev->get_property ("pitch"))) + if (Pitch *p = unsmob (ev->get_property ("pitch"))) { int pos = p->steps (); SCM c0 = get_property ("middleCPosition"); @@ -184,25 +183,24 @@ Completion_rest_engraver::process_music () note that rest_dur may be strictly less than left_to_do_ (say, if left_to_do_ == 5/8) */ - if (factor_.denominator () == 1 && factor_ > Rational (1, 1)) - rest_dur = Duration (left_to_do_, false); - else - rest_dur = Duration (left_to_do_ / factor_, false).compressed (factor_); + rest_dur = Duration (left_to_do_ / factor_, false).compressed (factor_); } else { - orig = unsmob_duration (rest_events_[0]->get_property ("duration")); + orig = unsmob (rest_events_[0]->get_property ("duration")); rest_dur = *orig; - factor_ = rest_dur.factor (); + SCM factor = get_property ("completionFactor"); + if (ly_is_procedure (factor)) + factor = scm_call_2 (factor, + context ()->self_scm (), + rest_dur.smobbed_copy ()); + factor_ = robust_scm2rational (factor, rest_dur.factor()); left_to_do_ = orig->get_length (); } Moment nb = next_moment (rest_dur.get_length ()); if (nb.main_part_ && nb < rest_dur.get_length ()) { - if (factor_.denominator () == 1 && factor_.numerator () > 1) - rest_dur = Duration (nb.main_part_, false); - else - rest_dur = Duration (nb.main_part_ / factor_, false).compressed (factor_); + rest_dur = Duration (nb.main_part_ / factor_, false).compressed (factor_); } do_nothing_until_ = now.main_part_ + rest_dur.get_length (); @@ -259,6 +257,12 @@ Completion_rest_engraver::Completion_rest_engraver () { } +void +Completion_rest_engraver::boot () +{ + ADD_LISTENER (Completion_rest_engraver, rest); +} + ADD_TRANSLATOR (Completion_rest_engraver, /* doc */ "This engraver replaces @code{Rest_engraver}. It plays" @@ -268,6 +272,7 @@ ADD_TRANSLATOR (Completion_rest_engraver, "Rest ", /* read */ + "completionFactor " "completionUnit " "middleCPosition " "measurePosition " diff --git a/lily/concurrent-hairpin-engraver.cc b/lily/concurrent-hairpin-engraver.cc index ec677ec68c..3fdf6524c2 100644 --- a/lily/concurrent-hairpin-engraver.cc +++ b/lily/concurrent-hairpin-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,8 +34,8 @@ public: TRANSLATOR_DECLARATIONS (Concurrent_hairpin_engraver); protected: - DECLARE_ACKNOWLEDGER (hairpin); - DECLARE_END_ACKNOWLEDGER (hairpin); + void acknowledge_hairpin (Grob_info); + void acknowledge_end_hairpin (Grob_info); void stop_translation_timestep (); void finalize (); @@ -100,8 +100,13 @@ Concurrent_hairpin_engraver::finalize () hairpins_hanging_out_.resize (0); } -ADD_ACKNOWLEDGER (Concurrent_hairpin_engraver, hairpin); -ADD_END_ACKNOWLEDGER (Concurrent_hairpin_engraver, hairpin); + +void +Concurrent_hairpin_engraver::boot () +{ + ADD_ACKNOWLEDGER (Concurrent_hairpin_engraver, hairpin); + ADD_END_ACKNOWLEDGER (Concurrent_hairpin_engraver, hairpin); +} ADD_TRANSLATOR (Concurrent_hairpin_engraver, /* doc */ diff --git a/lily/constrained-breaking.cc b/lily/constrained-breaking.cc index f8d4b0f5b2..df08d5433c 100644 --- a/lily/constrained-breaking.cc +++ b/lily/constrained-breaking.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -365,10 +365,10 @@ Constrained_breaking::Constrained_breaking (Paper_score *ps, vector const static SCM min_permission (SCM perm1, SCM perm2) { - if (perm1 == ly_symbol2scm ("force")) + if (scm_is_eq (perm1, ly_symbol2scm ("force"))) return perm2; - if (perm1 == ly_symbol2scm ("allow") - && perm2 != ly_symbol2scm ("force")) + if (scm_is_eq (perm1, ly_symbol2scm ("allow")) + && !scm_is_eq (perm2, ly_symbol2scm ("force"))) return perm2; return SCM_EOL; } @@ -560,7 +560,7 @@ Line_details::Line_details (Prob *pb, Output_def *paper) if (scm_is_pair (footnotes)) for (SCM s = footnotes; scm_is_pair (s); s = scm_cdr (s)) { - Stencil *sten = unsmob_stencil (scm_caddar (s)); + Stencil *sten = unsmob (scm_caddar (s)); if (!sten) { programming_error ("expecting stencil, got empty pointer"); @@ -571,7 +571,7 @@ Line_details::Line_details (Prob *pb, Output_def *paper) last_column_ = 0; force_ = 0; - Stencil *st = unsmob_stencil (pb->get_property ("stencil")); + Stencil *st = unsmob (pb->get_property ("stencil")); Interval stencil_extent = st->is_empty (Y_AXIS) ? Interval (0, 0) : st->extent (Y_AXIS); shape_ = Line_shape (stencil_extent, stencil_extent); // pretend it goes all the way across diff --git a/lily/context-def.cc b/lily/context-def.cc index a023980878..402bd80b6e 100644 --- a/lily/context-def.cc +++ b/lily/context-def.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,17 +43,18 @@ Context_def::Context_def () smobify_self (); - input_location_ = make_input (Input ()); + input_location_ = Input ().smobbed_copy (); context_name_ = ly_symbol2scm (""); } Input * Context_def::origin () const { - return unsmob_input (input_location_); + return unsmob (input_location_); } Context_def::Context_def (Context_def const &s) + : Smob () { context_aliases_ = SCM_EOL; translator_group_type_ = SCM_EOL; @@ -67,7 +68,7 @@ Context_def::Context_def (Context_def const &s) smobify_self (); description_ = s.description_; - input_location_ = make_input (*s.origin ()); + input_location_ = s.origin ()->smobbed_copy (); default_child_ = s.default_child_; accept_mods_ = s.accept_mods_; property_ops_ = s.property_ops_; @@ -81,49 +82,42 @@ Context_def::~Context_def () { } -#include "ly-smobs.icc" -IMPLEMENT_SMOBS (Context_def); -IMPLEMENT_DEFAULT_EQUAL_P (Context_def); -IMPLEMENT_TYPE_P (Context_def, "ly:context-def?"); +const char * const Context_def::type_p_name_ = "ly:context-def?"; int -Context_def::print_smob (SCM smob, SCM port, scm_print_state *) +Context_def::print_smob (SCM port, scm_print_state *) const { - Context_def *me = (Context_def *) SCM_CELL_WORD_1 (smob); - scm_puts ("#context_name_, port); + scm_display (context_name_, port); scm_puts (" ", port); - string loc = me->origin ()->location_string (); + string loc = origin ()->location_string (); scm_puts (loc.c_str (), port); scm_puts (">", port); return 1; } SCM -Context_def::mark_smob (SCM smob) +Context_def::mark_smob () const { - ASSERT_LIVE_IS_ALLOWED (smob); - - Context_def *me = (Context_def *) SCM_CELL_WORD_1 (smob); - - scm_gc_mark (me->description_); - scm_gc_mark (me->context_aliases_); - scm_gc_mark (me->accept_mods_); - scm_gc_mark (me->translator_mods_); - scm_gc_mark (me->property_ops_); - scm_gc_mark (me->translator_group_type_); - scm_gc_mark (me->default_child_); - scm_gc_mark (me->input_location_); - - return me->context_name_; + ASSERT_LIVE_IS_ALLOWED (self_scm ()); + + scm_gc_mark (description_); + scm_gc_mark (context_aliases_); + scm_gc_mark (accept_mods_); + scm_gc_mark (translator_mods_); + scm_gc_mark (property_ops_); + scm_gc_mark (translator_group_type_); + scm_gc_mark (default_child_); + scm_gc_mark (input_location_); + + return context_name_; } void Context_def::add_context_mod (SCM mod) { SCM tag = scm_car (mod); - if (ly_symbol2scm ("description") == tag) + if (scm_is_eq (tag, ly_symbol2scm ("description"))) { description_ = scm_cadr (mod); return; @@ -136,27 +130,27 @@ Context_def::add_context_mod (SCM mod) if (scm_is_string (sym)) sym = scm_string_to_symbol (sym); - if (ly_symbol2scm ("default-child") == tag) + if (scm_is_eq (tag, ly_symbol2scm ("default-child"))) default_child_ = sym; - else if (ly_symbol2scm ("consists") == tag - || ly_symbol2scm ("remove") == tag) + else if (scm_is_eq (tag, ly_symbol2scm ("consists")) + || scm_is_eq (tag, ly_symbol2scm ("remove"))) { translator_mods_ = scm_cons (scm_list_2 (tag, sym), translator_mods_); } - else if (ly_symbol2scm ("accepts") == tag - || ly_symbol2scm ("denies") == tag) + else if (scm_is_eq (tag, ly_symbol2scm ("accepts")) + || scm_is_eq (tag, ly_symbol2scm ("denies"))) accept_mods_ = scm_cons (scm_list_2 (tag, sym), accept_mods_); - else if (ly_symbol2scm ("pop") == tag - || ly_symbol2scm ("push") == tag - || ly_symbol2scm ("assign") == tag - || ly_symbol2scm ("unset") == tag - || ly_symbol2scm ("apply") == tag) + else if (scm_is_eq (tag, ly_symbol2scm ("pop")) + || scm_is_eq (tag, ly_symbol2scm ("push")) + || scm_is_eq (tag, ly_symbol2scm ("assign")) + || scm_is_eq (tag, ly_symbol2scm ("unset")) + || scm_is_eq (tag, ly_symbol2scm ("apply"))) property_ops_ = scm_cons (mod, property_ops_); - else if (ly_symbol2scm ("alias") == tag) + else if (scm_is_eq (tag, ly_symbol2scm ("alias"))) context_aliases_ = scm_cons (sym, context_aliases_); - else if (ly_symbol2scm ("translator-type") == tag) + else if (scm_is_eq (tag, ly_symbol2scm ("translator-type"))) translator_group_type_ = sym; - else if (ly_symbol2scm ("context-name") == tag) + else if (scm_is_eq (tag, ly_symbol2scm ("context-name"))) context_name_ = sym; else programming_error ("unknown context mod tag"); @@ -171,9 +165,9 @@ Context_def::get_accepted (SCM user_mod) const { SCM tag = scm_caar (s); SCM sym = scm_cadar (s); - if (tag == ly_symbol2scm ("accepts")) + if (scm_is_eq (tag, ly_symbol2scm ("accepts"))) acc = scm_cons (sym, acc); - else if (tag == ly_symbol2scm ("denies")) + else if (scm_is_eq (tag, ly_symbol2scm ("denies"))) acc = scm_delete_x (sym, acc); } @@ -194,7 +188,7 @@ Context_def::get_default_child (SCM user_mod) const for (SCM s = user_mod; scm_is_pair (s); s = scm_cdr (s)) { SCM entry = scm_car (s); - if (scm_car (entry) == ly_symbol2scm ("default-child")) + if (scm_is_eq (scm_car (entry), ly_symbol2scm ("default-child"))) { name = scm_cadr (entry); break; @@ -241,7 +235,7 @@ Context_def::internal_path_to_acceptable_context (SCM type_sym, vector accepteds; for (SCM s = accepted; scm_is_pair (s); s = scm_cdr (s)) - if (Context_def *t = unsmob_context_def (find_context_def (odef, + if (Context_def *t = unsmob (find_context_def (odef, scm_car (s)))) accepteds.push_back (t); @@ -295,9 +289,9 @@ Context_def::get_translator_names (SCM user_mod) const if (scm_is_string (arg)) arg = scm_string_to_symbol (arg); - if (ly_symbol2scm ("consists") == tag) + if (scm_is_eq (tag, ly_symbol2scm ("consists"))) l1 = scm_cons (arg, l1); - else if (ly_symbol2scm ("remove") == tag + else if (scm_is_eq (tag, ly_symbol2scm ("remove")) && (scm_is_pair (arg) || ly_is_procedure (arg) || get_translator (arg))) @@ -404,7 +398,7 @@ LY_DEFINE (ly_context_def_lookup, "ly:context-def-lookup", " @samp{property-ops}, @samp{context-name}, @samp{group-type}.") { LY_ASSERT_SMOB (Context_def, def, 1); - Context_def *cd = unsmob_context_def (def); + Context_def *cd = unsmob (def); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); SCM res = cd->lookup (sym); @@ -428,9 +422,9 @@ LY_DEFINE (ly_context_def_modify, "ly:context-def-modify", LY_ASSERT_SMOB (Context_def, def, 1); LY_ASSERT_SMOB (Context_mod, mod, 2); - Context_def *cd = unsmob_context_def (def)->clone (); + Context_def *cd = unsmob (def)->clone (); - for (SCM s = unsmob_context_mod (mod)->get_mods (); + for (SCM s = unsmob (mod)->get_mods (); scm_is_pair (s); s = scm_cdr (s)) cd->add_context_mod (scm_car (s)); diff --git a/lily/context-handle.cc b/lily/context-handle.cc index c115c570d6..f399937c18 100644 --- a/lily/context-handle.cc +++ b/lily/context-handle.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/context-mod-scheme.cc b/lily/context-mod-scheme.cc index 5479581b1c..a774fc7426 100644 --- a/lily/context-mod-scheme.cc +++ b/lily/context-mod-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Jan Nieuwenhuizen + Copyright (C) 2010--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -26,7 +26,7 @@ LY_DEFINE (ly_get_context_mods, "ly:get-context-mods", "Returns the list of context modifications stored in" " @var{contextmod}.") { - Context_mod *tr = unsmob_context_mod (contextmod); + Context_mod *tr = unsmob (contextmod); LY_ASSERT_SMOB (Context_mod, contextmod, 1); return tr->get_mods (); } @@ -36,7 +36,7 @@ LY_DEFINE (ly_add_context_mod, "ly:add-context-mod", "Adds the given context @var{modification} to the list" " @var{contextmods} of context modifications.") { - Context_mod *ctxmod = unsmob_context_mod (contextmods); + Context_mod *ctxmod = unsmob (contextmods); LY_ASSERT_SMOB (Context_mod, contextmods, 1); ctxmod->add_context_mod (modification); return SCM_UNSPECIFIED; @@ -47,7 +47,7 @@ LY_DEFINE (ly_make_context_mod, "ly:make-context-mod", "Creates a context modification, optionally initialized" " via the list of modifications @var{mod-list}.") { - if (mod_list != SCM_UNDEFINED) + if (!SCM_UNBNDP (mod_list)) { LY_ASSERT_TYPE (ly_cheap_is_list, mod_list, 1); return Context_mod (mod_list).smobbed_copy (); @@ -63,8 +63,8 @@ LY_DEFINE (ly_context_mod_apply_x, "ly:context-mod-apply!", LY_ASSERT_SMOB (Context, context, 1); LY_ASSERT_SMOB (Context_mod, mod, 2); - apply_property_operations (unsmob_context (context), - unsmob_context_mod (mod)->get_mods ()); + apply_property_operations (unsmob (context), + unsmob (mod)->get_mods ()); scm_remember_upto_here_1 (context); return SCM_UNSPECIFIED; } diff --git a/lily/context-mod.cc b/lily/context-mod.cc index cb6cf83562..892d692bbf 100644 --- a/lily/context-mod.cc +++ b/lily/context-mod.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Reinhold Kainhofer + Copyright (C) 2010--2015 Reinhold Kainhofer LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,30 +34,21 @@ Context_mod::Context_mod (SCM mod_list) mods_ = scm_reverse (mod_list); } -#include "ly-smobs.icc" -IMPLEMENT_SIMPLE_SMOBS (Context_mod); -IMPLEMENT_DEFAULT_EQUAL_P (Context_mod); -IMPLEMENT_TYPE_P (Context_mod, "ly:context-mod?"); +const char * const Context_mod::type_p_name_ = "ly:context-mod?"; int -Context_mod::print_smob (SCM smob, SCM port, scm_print_state *) +Context_mod::print_smob (SCM port, scm_print_state *) const { - Context_mod *me = (Context_mod *) SCM_CELL_WORD_1 (smob); - scm_puts ("#get_mods (), port); + scm_display (get_mods (), port); scm_puts (">", port); return 1; } SCM -Context_mod::mark_smob (SCM smob) +Context_mod::mark_smob () const { - ASSERT_LIVE_IS_ALLOWED (smob); - - Context_mod *me = (Context_mod *) SCM_CELL_WORD_1 (smob); - - return me->mods_; + return mods_; } void @@ -78,4 +69,3 @@ Context_mod::get_mods () const { return scm_reverse (mods_); } - diff --git a/lily/context-property.cc b/lily/context-property.cc index 00108cf314..6e22b2f808 100644 --- a/lily/context-property.cc +++ b/lily/context-property.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,10 +19,12 @@ #include "context.hh" #include "engraver.hh" +#include "global-context.hh" +#include "grob-properties.hh" #include "international.hh" #include "item.hh" #include "main.hh" -#include "simple-closure.hh" +#include "smobs.hh" #include "spanner.hh" #include "unpure-pure-container.hh" #include "warn.hh" @@ -37,16 +39,152 @@ general_pushpop_property (Context *context, SCM grob_property_path, SCM new_value) { + // Numbers may appear, but not in first place if (!scm_is_symbol (context_property) || !scm_is_symbol (scm_car (grob_property_path))) { - warning (_ ("need symbol arguments for \\override and \\revert")); + warning (_ ("need symbol argument for \\override and \\revert")); if (do_internal_type_checking_global) assert (false); } - sloppy_general_pushpop_property (context, context_property, - grob_property_path, new_value); + Grob_property_info (context, context_property).pushpop + (grob_property_path, new_value); +} + +bool +typecheck_grob (SCM symbol, SCM value) +{ + if (Unpure_pure_container *upc = unsmob (value)) + return typecheck_grob (symbol, upc->unpure_part ()) + && typecheck_grob (symbol, upc->pure_part ()); + return ly_is_procedure (value) + || type_check_assignment (symbol, value, ly_symbol2scm ("backend-type?")); +} + +class Grob_properties : public Simple_smob +{ +public: + SCM mark_smob () const; + static const char * const type_p_name_; +private: + friend class Grob_property_info; + friend SCM ly_make_grob_properties (SCM); + // alist_ may contain unexpanded nested overrides + SCM alist_; + // based_on_ is the cooked_ value from the next higher context that + // alist_ is based on + SCM based_on_; + // cooked_ is a version of alist_ where nested overrides have been + // expanded + SCM cooked_; + // cooked_from_ is the value of alist_ from which the expansion has + // been done + SCM cooked_from_; + // nested_ is a count of nested overrides in alist_ Or rather: of + // entries that must not appear in the cooked list and are + // identified by having a "key" that is not a symbol. Temporary + // overrides and reverts also meet that description and have a + // nominal key of #t/#f and a value of the original cons cell. + int nested_; + + Grob_properties (SCM alist, SCM based_on) : + alist_ (alist), based_on_ (based_on), + // if the constructor was called with lists possibly containing + // partial overrides, we would need to initialize with based_on in + // order to trigger an initial update. But this should never + // happen, so we initialize straight with alist. + cooked_ (alist), cooked_from_ (alist), nested_ (0) { } +}; + +const char * const Grob_properties::type_p_name_ = "ly:grob-properties?"; + +SCM +Grob_properties::mark_smob () const +{ + scm_gc_mark (alist_); + scm_gc_mark (based_on_); + scm_gc_mark (cooked_); + return cooked_from_; +} + +LY_DEFINE (ly_make_grob_properties, "ly:make-grob-properties", + 1, 0, 0, (SCM alist), + "This packages the given property list @var{alist} in" + " a grob property container stored in a context property" + " with the name of a grob.") +{ + LY_ASSERT_TYPE (ly_is_list, alist, 1); + return Grob_properties (alist, SCM_EOL).smobbed_copy (); +} + + +Grob_property_info +Grob_property_info::find () +{ + if (props_) + return *this; + SCM res = SCM_UNDEFINED; + if (Context *c = context_->where_defined (symbol_, &res)) + if (c != context_) + return Grob_property_info (c, symbol_, unsmob (res)); + props_ = unsmob (res); + return *this; +} + +bool +Grob_property_info::check () +{ + if (props_) + return true; + SCM res = SCM_UNDEFINED; + if (context_->here_defined (symbol_, &res)) + props_ = unsmob (res); + return props_; +} + +bool +Grob_property_info::create () +{ + // Using scm_hashq_create_handle_x would seem like the one-lookup + // way to create a handle if it does not exist yet. However, we + // need to check that there is a corresponding grob in this + // particular output first, and we have to do this in the global + // context. By far the most frequent case will be that a + // Grob_properties for this context already exists, so we optimize + // for that and only check the global handle when the local + // context is pristine. + if (check ()) + return true; + SCM current_context_val = SCM_EOL; + Context *g = context_->get_global_context (); + if (!g) + return false; // Context is probably dead + + /* + Don't mess with MIDI. + */ + if (g == context_ + || !g->here_defined (symbol_, ¤t_context_val)) + return false; + + Grob_properties *def = unsmob (current_context_val); + + if (!def) + { + programming_error ("Grob definition expected"); + return false; + } + + // We create the new Grob_properties from the default definition + // since this is what we have available right now. It may or may + // not be accurate since we don't take into account any + // prospective overrides in intermediate contexts. If there are + // any, they will be factored in when `updated' is being called. + SCM props = Grob_properties (def->alist_, def->alist_).smobbed_copy (); + context_->set_property (symbol_, props); + props_ = unsmob (props); + return props_; } /* @@ -55,147 +193,175 @@ general_pushpop_property (Context *context, alist defined in a parent context. BASED-ON should always be a tail of ALIST. - Push or pop (depending on value of VAL) a single entry from a + Push a single entry from a translator property list by name of PROP. GROB_PROPERTY_PATH indicates nested alists, eg. '(beamed-stem-lengths details) + + Return value can be passed to matched_pop and will only cancel the + same override then. */ -void -execute_override_property (Context *context, - SCM context_property, - SCM grob_property_path, - SCM new_value) +SCM +Grob_property_info::push (SCM grob_property_path, SCM new_value) { - SCM current_context_val = SCM_EOL; - - Context *where = context->where_defined (context_property, - ¤t_context_val); - /* Don't mess with MIDI. */ - if (!where) - return; - - if (where != context) - { - SCM base = updated_grob_properties (context, context_property); - current_context_val = scm_cons (base, base); - context->set_property (context_property, current_context_val); - } - - if (!scm_is_pair (current_context_val)) - { - programming_error ("Grob definition should be cons"); - return; - } - - SCM target_alist = scm_car (current_context_val); + if (!create ()) + return SCM_EOL; SCM symbol = scm_car (grob_property_path); - if (scm_is_pair (scm_cdr (grob_property_path))) + SCM rest = scm_cdr (grob_property_path); + if (scm_is_pair (rest)) { - new_value = nested_property_alist (ly_assoc_get (symbol, target_alist, - SCM_EOL), - scm_cdr (grob_property_path), - new_value); + // poor man's typechecking + if (typecheck_grob (symbol, nested_create_alist (rest, new_value))) { + SCM cell = scm_cons (grob_property_path, new_value); + props_->alist_ = scm_cons (cell, props_->alist_); + props_->nested_++; + return cell; + } + return SCM_EOL; } /* it's tempting to replace the head of the list if it's the same property. However, we have to keep this info around, in case we have to \revert back to it. */ - target_alist = scm_acons (symbol, new_value, target_alist); - bool ok = true; - bool pc = is_unpure_pure_container (new_value); - SCM vals[] = {pc ? unpure_pure_container_unpure_part (new_value) : new_value, - pc ? unpure_pure_container_pure_part (new_value) : SCM_BOOL_F - }; + if (typecheck_grob (symbol, new_value)) + { + SCM cell = scm_cons (symbol, new_value); + props_->alist_ = scm_cons (cell, props_->alist_); + return cell; + } + return SCM_EOL; +} - for (int i = 0; i < 2; i++) - if (!ly_is_procedure (vals[i]) - && !is_simple_closure (vals[i])) - ok = ok && type_check_assignment (symbol, vals[i], - ly_symbol2scm ("backend-type?")); +// Used for \once \override, returns a token for matched_pop +SCM +Grob_property_info::temporary_override (SCM grob_property_path, SCM new_value) +{ + SCM cell = push (grob_property_path, new_value); + if (!scm_is_pair (cell)) + return cell; + if (scm_is_symbol (scm_car (cell))) + props_->nested_++; + cell = scm_cons (SCM_BOOL_T, cell); + props_->alist_ = scm_cons (cell, scm_cdr (props_->alist_)); + return cell; +} - /* - tack onto alist. We can use set_car, since - updated_grob_properties () in child contexts will check - for changes in the car. - */ - if (ok) +// Used for \once \revert, returns a token for matched_pop +SCM +Grob_property_info::temporary_revert (SCM grob_property_path) +{ + if (!check ()) + return SCM_EOL; + + SCM current_alist = props_->alist_; + SCM daddy = props_->based_on_; + SCM tail = SCM_EOL; + + if (!scm_is_pair (grob_property_path) + || !scm_is_symbol (scm_car (grob_property_path))) { - scm_set_car_x (current_context_val, target_alist); + programming_error ("Grob property path should be list of symbols."); + return SCM_EOL; } + + if (scm_is_pair (scm_cdr (grob_property_path))) + { + tail = assoc_tail (grob_property_path, current_alist, daddy); + if (scm_is_false (tail)) + return SCM_EOL; + } + else + { + tail = assq_tail (scm_car (grob_property_path), current_alist, daddy); + if (scm_is_false (tail)) + return SCM_EOL; + ++props_->nested_; + } + + SCM cell = scm_cons (SCM_BOOL_F, scm_car (tail)); + props_->alist_ = partial_list_copy (current_alist, tail, + scm_cons (cell, scm_cdr (tail))); + return cell; } -/* - do a pop (indicated by new_value==SCM_UNDEFINED) or push - */ + void -sloppy_general_pushpop_property (Context *context, - SCM context_property, - SCM grob_property_path, - SCM new_value) +Grob_property_info::matched_pop (SCM cell) { - if (new_value == SCM_UNDEFINED) - execute_revert_property (context, context_property, - grob_property_path); - else - execute_override_property (context, context_property, - grob_property_path, - new_value); + if (!scm_is_pair (cell)) + return; + if (!check ()) + return; + SCM current_alist = props_->alist_; + SCM daddy = props_->based_on_; + for (SCM p = current_alist; !scm_is_eq (p, daddy); p = scm_cdr (p)) + { + if (scm_is_eq (scm_car (p), cell)) + { + SCM key = scm_car (cell); + if (scm_is_false (key)) + { + // temporary revert, reactivate + cell = scm_cdr (cell); + if (scm_is_symbol (scm_car (cell))) + props_->nested_--; + props_->alist_ = partial_list_copy (current_alist, p, + scm_cons (cell, scm_cdr (p))); + return; + } + if (!scm_is_symbol (key)) + props_->nested_--; + props_->alist_ = partial_list_copy (current_alist, p, scm_cdr (p)); + return; + } + } + return; } /* Revert the property given by property_path. */ void -execute_revert_property (Context *context, - SCM context_property, - SCM grob_property_path) +Grob_property_info::pop (SCM grob_property_path) { - SCM current_context_val = SCM_EOL; - if (context->where_defined (context_property, ¤t_context_val) - == context) - { - SCM current_alist = scm_car (current_context_val); - SCM daddy = scm_cdr (current_context_val); + if (!check ()) + return; - if (!scm_is_pair (grob_property_path) - || !scm_is_symbol (scm_car (grob_property_path))) - { - programming_error ("Grob property path should be list of symbols."); - return; - } + SCM current_alist = props_->alist_; + SCM daddy = props_->based_on_; - SCM symbol = scm_car (grob_property_path); - if (scm_is_pair (scm_cdr (grob_property_path))) - { - SCM current_sub_alist = ly_assoc_get (symbol, current_alist, SCM_EOL); - SCM new_val - = nested_property_revert_alist (current_sub_alist, - scm_cdr (grob_property_path)); - - if (scm_is_pair (current_alist) - && scm_caar (current_alist) == symbol - && current_alist != daddy) - current_alist = scm_cdr (current_alist); - - current_alist = scm_acons (symbol, new_val, current_alist); - scm_set_car_x (current_context_val, current_alist); - } - else - { - SCM new_alist = evict_from_alist (symbol, current_alist, daddy); + if (!scm_is_pair (grob_property_path) + || !scm_is_symbol (scm_car (grob_property_path))) + { + programming_error ("Grob property path should be list of symbols."); + return; + } - if (new_alist == daddy) - context->unset_property (context_property); - else - context->set_property (context_property, - scm_cons (new_alist, daddy)); - } + if (scm_is_pair (scm_cdr (grob_property_path))) + { + SCM old_alist = current_alist; + current_alist = evict_from_alist (grob_property_path, current_alist, daddy); + if (scm_is_eq (old_alist, current_alist)) + return; + props_->nested_--; + } + else + current_alist = evict_from_alist (scm_car (grob_property_path), + current_alist, daddy); + + if (scm_is_eq (current_alist, daddy)) + { + assert (props_->nested_ == 0); + props_ = 0; + context_->unset_property (symbol_); + return; } + props_->alist_ = current_alist; } /* Convenience: a push/pop grob property using a single grob_property @@ -203,13 +369,11 @@ execute_revert_property (Context *context, */ void execute_pushpop_property (Context *context, - SCM context_property, + SCM grob, SCM grob_property, SCM new_value) { - general_pushpop_property (context, context_property, - scm_list_1 (grob_property), - new_value); + Grob_property_info (context, grob).pushpop (scm_list_1 (grob_property), new_value); } /* @@ -224,25 +388,24 @@ apply_property_operations (Context *tg, SCM pre_init_ops) SCM type = scm_car (entry); entry = scm_cdr (entry); - if (type == ly_symbol2scm ("push")) + if (scm_is_eq (type, ly_symbol2scm ("push"))) { SCM context_prop = scm_car (entry); SCM val = scm_cadr (entry); SCM grob_prop_path = scm_cddr (entry); - sloppy_general_pushpop_property (tg, context_prop, grob_prop_path, val); + Grob_property_info (tg, context_prop).push (grob_prop_path, val); } - else if (type == ly_symbol2scm ("pop")) + else if (scm_is_eq (type, ly_symbol2scm ("pop"))) { SCM context_prop = scm_car (entry); - SCM val = SCM_UNDEFINED; SCM grob_prop_path = scm_cdr (entry); - sloppy_general_pushpop_property (tg, context_prop, grob_prop_path, val); + Grob_property_info (tg, context_prop).pop (grob_prop_path); } - else if (type == ly_symbol2scm ("assign")) + else if (scm_is_eq (type, ly_symbol2scm ("assign"))) tg->set_property (scm_car (entry), scm_cadr (entry)); - else if (type == ly_symbol2scm ("apply")) - scm_apply_1 (scm_car (entry), tg->self_scm (), scm_cdr (entry)); - else if (type == ly_symbol2scm ("unset")) + else if (scm_is_eq (type, ly_symbol2scm ("apply"))) + scm_apply_1 (scm_car (entry), tg->self_scm (), scm_cdr (entry)); + else if (scm_is_eq (type, ly_symbol2scm ("unset"))) tg->unset_property (scm_car (entry)); } } @@ -251,45 +414,31 @@ apply_property_operations (Context *tg, SCM pre_init_ops) Return the object alist for SYM, checking if its base in enclosing contexts has changed. The alist is updated if necessary. */ -SCM -updated_grob_properties (Context *tg, SCM sym) +SCM Grob_property_info::updated () { - assert (scm_is_symbol (sym)); + assert (scm_is_symbol (symbol_)); - SCM props; - tg = tg->where_defined (sym, &props); - if (!tg) + Grob_property_info where = find (); + + if (!where) return SCM_EOL; - SCM daddy_props - = (tg->get_parent_context ()) - ? updated_grob_properties (tg->get_parent_context (), sym) - : SCM_EOL; + Context *dad = where.context_->get_parent_context (); - if (!scm_is_pair (props)) - { - programming_error ("grob props not a pair?"); - return SCM_EOL; - } + SCM daddy_props + = dad ? Grob_property_info (dad, symbol_).updated () : SCM_EOL; - SCM based_on = scm_cdr (props); - if (based_on == daddy_props) - return scm_car (props); - else + SCM based_on = where.props_->based_on_; + SCM alist = where.props_->alist_; + if (!scm_is_eq (based_on, daddy_props)) { - SCM copy = daddy_props; - SCM *tail = © - SCM p = scm_car (props); - while (p != based_on) - { - *tail = scm_cons (scm_car (p), daddy_props); - tail = SCM_CDRLOC (*tail); - p = scm_cdr (p); - } - - scm_set_car_x (props, copy); - scm_set_cdr_x (props, daddy_props); - - return copy; + where.props_->based_on_ = daddy_props; + alist = partial_list_copy (alist, based_on, daddy_props); + where.props_->alist_ = alist; } + if (scm_is_eq (where.props_->cooked_from_, alist)) + return where.props_->cooked_; + where.props_->cooked_from_ = alist; + where.props_->cooked_ = nalist_to_alist (alist, where.props_->nested_); + return where.props_->cooked_; } diff --git a/lily/context-scheme.cc b/lily/context-scheme.cc index f58a793ed4..feda0f607e 100644 --- a/lily/context-scheme.cc +++ b/lily/context-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -21,13 +21,14 @@ #include "context.hh" #include "context-def.hh" #include "dispatcher.hh" +#include "grob-properties.hh" LY_DEFINE (ly_context_current_moment, "ly:context-current-moment", 1, 0, 0, (SCM context), "Return the current moment of @var{context}.") { - Context *tr = unsmob_context (context); + Context *tr = unsmob (context); LY_ASSERT_SMOB (Context, context, 1); @@ -40,7 +41,7 @@ LY_DEFINE (ly_context_id, "ly:context-id", " i.e., for @code{\\context Voice = \"one\" @dots{}}" " return the string @code{one}.") { - Context *tr = unsmob_context (context); + Context *tr = unsmob (context); LY_ASSERT_SMOB (Context, context, 1); @@ -55,7 +56,7 @@ LY_DEFINE (ly_context_name, "ly:context-name", { LY_ASSERT_SMOB (Context, context, 1); - Context *tr = unsmob_context (context); + Context *tr = unsmob (context); return ly_symbol2scm (tr->context_name ().c_str ()); } @@ -65,22 +66,22 @@ LY_DEFINE (ly_context_grob_definition, "ly:context-grob-definition", "Return the definition of @var{name} (a symbol) within" " @var{context} as an alist.") { - Context *tr = unsmob_context (context); + Context *tr = unsmob (context); LY_ASSERT_SMOB (Context, context, 1); LY_ASSERT_TYPE (ly_is_symbol, name, 2); - return updated_grob_properties (tr, name); + return Grob_property_info (tr, name).updated (); } LY_DEFINE (ly_context_pushpop_property, "ly:context-pushpop-property", 3, 1, 0, (SCM context, SCM grob, SCM eltprop, SCM val), - "Do a single @code{\\override} or @code{\\revert} operation" + "Do @code{\\temporary \\override} or @code{\\revert} operation" " in @var{context}. The grob definition @var{grob} is extended" " with @var{eltprop} (if @var{val} is specified) or reverted" " (if unspecified).") { - Context *tg = unsmob_context (context); + Context *tg = unsmob (context); LY_ASSERT_SMOB (Context, context, 1); LY_ASSERT_TYPE (ly_is_symbol, grob, 2); @@ -91,6 +92,19 @@ LY_DEFINE (ly_context_pushpop_property, "ly:context-pushpop-property", return SCM_UNSPECIFIED; } +LY_DEFINE (ly_context_matched_pop_property, "ly:context-matched-pop-property", + 3, 0, 0, (SCM context, SCM grob, SCM cell), + "This undoes a particular @code{\\override}," + " @code{\\once \\override} or @code{\\once \\revert}" + " when given the specific alist pair to undo.") +{ + Context *tg = LY_ASSERT_SMOB (Context, context, 1); + LY_ASSERT_TYPE (ly_is_symbol, grob, 2); + Grob_property_info (tg, grob).matched_pop (cell); + return SCM_UNSPECIFIED; +} + + LY_DEFINE (ly_context_property, "ly:context-property", 2, 1, 0, (SCM context, SCM sym, SCM def), "Return the value for property @var{sym} in @var{context}." @@ -100,9 +114,9 @@ LY_DEFINE (ly_context_property, "ly:context-property", LY_ASSERT_SMOB (Context, context, 1); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); - Context *t = unsmob_context (context); - SCM result = t->internal_get_property (sym); - return def != SCM_UNDEFINED && scm_is_null (result) ? def : result; + Context *t = unsmob (context); + SCM result = t->get_property (sym); + return !SCM_UNBNDP (def) && scm_is_null (result) ? def : result; } LY_DEFINE (ly_context_set_property_x, "ly:context-set-property!", @@ -113,7 +127,7 @@ LY_DEFINE (ly_context_set_property_x, "ly:context-set-property!", LY_ASSERT_SMOB (Context, context, 1); LY_ASSERT_TYPE (ly_is_symbol, name, 2); - Context *tr = unsmob_context (context); + Context *tr = unsmob (context); tr->set_property (name, val); @@ -128,7 +142,7 @@ LY_DEFINE (ly_context_property_where_defined, "ly:context-property-where-defined LY_ASSERT_SMOB (Context, context, 1); LY_ASSERT_TYPE (ly_is_symbol, name, 2); - Context *tr = unsmob_context (context); + Context *tr = unsmob (context); SCM val; tr = tr->where_defined (name, &val); @@ -144,7 +158,7 @@ LY_DEFINE (ly_context_unset_property, "ly:context-unset-property", 2, 0, 0, { LY_ASSERT_SMOB (Context, context, 1); LY_ASSERT_TYPE (ly_is_symbol, name, 2); - Context *tr = unsmob_context (context); + Context *tr = unsmob (context); tr->unset_property (name); return SCM_UNSPECIFIED; @@ -155,7 +169,7 @@ LY_DEFINE (ly_context_parent, "ly:context-parent", "Return the parent of @var{context}, @code{#f} if none.") { LY_ASSERT_SMOB (Context, context, 1); - Context *tr = unsmob_context (context); + Context *tr = unsmob (context); tr = tr->get_parent_context (); if (tr) @@ -172,7 +186,7 @@ LY_DEFINE (ly_context_find, "ly:context-find", { LY_ASSERT_SMOB (Context, context, 1); LY_ASSERT_TYPE (ly_is_symbol, name, 2); - Context *tr = unsmob_context (context); + Context *tr = unsmob (context); while (tr) { @@ -189,7 +203,7 @@ LY_DEFINE (ly_context_now, "ly:context-now", "Return @code{now-moment} of context @var{context}.") { LY_ASSERT_SMOB (Context, context, 1); - Context *ctx = unsmob_context (context); + Context *ctx = unsmob (context); return ctx->now_mom ().smobbed_copy (); } @@ -198,7 +212,7 @@ LY_DEFINE (ly_context_event_source, "ly:context-event-source", "Return @code{event-source} of context @var{context}.") { LY_ASSERT_SMOB (Context, context, 1); - Context *ctx = unsmob_context (context); + Context *ctx = unsmob (context); return ctx->event_source ()->self_scm (); } @@ -208,6 +222,6 @@ LY_DEFINE (ly_context_events_below, "ly:context-events-below", " from @var{context} and all its subcontexts.") { LY_ASSERT_SMOB (Context, context, 1); - Context *ctx = unsmob_context (context); + Context *ctx = unsmob (context); return ctx->events_below ()->self_scm (); } diff --git a/lily/context-specced-music-iterator.cc b/lily/context-specced-music-iterator.cc index e33a8806a6..1a27d2a93d 100644 --- a/lily/context-specced-music-iterator.cc +++ b/lily/context-specced-music-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/context.cc b/lily/context.cc index 491ea8f0d8..7de61c5796 100644 --- a/lily/context.cc +++ b/lily/context.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,7 +23,6 @@ #include "dispatcher.hh" #include "global-context.hh" #include "international.hh" -#include "ly-smobs.icc" #include "main.hh" #include "output-def.hh" #include "profile.hh" @@ -31,11 +30,12 @@ #include "scm-hash.hh" #include "translator-group.hh" #include "warn.hh" +#include "lily-imports.hh" bool Context::is_removable () const { - return context_list_ == SCM_EOL && ! client_count_ + return scm_is_null (context_list_) && ! client_count_ && !dynamic_cast (daddy_context_); } @@ -44,28 +44,27 @@ Context::check_removal () { for (SCM p = context_list_; scm_is_pair (p); p = scm_cdr (p)) { - Context *ctx = unsmob_context (scm_car (p)); + Context *ctx = unsmob (scm_car (p)); ctx->check_removal (); if (ctx->is_removable ()) { - recurse_over_translators (ctx, &Translator::finalize, - &Translator_group::finalize, - UP); + recurse_over_translators + (ctx, + Callback0_wrapper::make_smob + (), + Callback0_wrapper::make_smob + (), + UP); send_stream_event (ctx, "RemoveContext", 0, 0); } } } -Context::Context (Context const & /* src */) -{ - assert (false); -} - Scheme_hash_table * Context::properties_dict () const { - return Scheme_hash_table::unsmob (properties_scm_); + return unsmob (properties_scm_); } void @@ -75,7 +74,7 @@ Context::add_context (Context *child) scm_cons (child->self_scm (), SCM_EOL)); child->daddy_context_ = this; - this->events_below_->register_as_listener (child->events_below_); + events_below_->register_as_listener (child->events_below_); } Context::Context () @@ -95,8 +94,7 @@ Context::Context () smobify_self (); - Scheme_hash_table *tab = new Scheme_hash_table; - properties_scm_ = tab->unprotect (); + properties_scm_ = Scheme_hash_table::make_smob (); event_source_ = new Dispatcher (); event_source_->unprotect (); events_below_ = new Dispatcher (); @@ -176,7 +174,7 @@ Context::find_create_context (SCM n, const string &id, SCM operations) SCM score_name = default_child_context_name (); SCM score_def = find_context_def (get_output_def (), score_name); - if (Context_def *cd = unsmob_context_def (score_def)) + if (Context_def *cd = unsmob (score_def)) { if (cd->is_alias (n)) return create_context (cd, id, operations); @@ -187,7 +185,7 @@ Context::find_create_context (SCM n, const string &id, SCM operations) if (Context *existing = find_context_below (this, n, id)) return existing; - if (n == ly_symbol2scm ("Bottom")) + if (scm_is_eq (n, ly_symbol2scm ("Bottom"))) { Context *tg = get_default_interpreter (id); return tg; @@ -232,18 +230,16 @@ Context::find_create_context (SCM n, const string &id, SCM operations) return ret; } -IMPLEMENT_LISTENER (Context, acknowledge_infant); void Context::acknowledge_infant (SCM sev) { - infant_event_ = unsmob_stream_event (sev); + infant_event_ = unsmob (sev); } -IMPLEMENT_LISTENER (Context, set_property_from_event); void Context::set_property_from_event (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); + Stream_event *ev = unsmob (sev); SCM sym = ev->get_property ("symbol"); if (scm_is_symbol (sym)) @@ -254,35 +250,71 @@ Context::set_property_from_event (SCM sev) unset_property (sym); return; } - + bool ok = true; ok = type_check_assignment (sym, val, ly_symbol2scm ("translation-type?")); if (ok) - set_property (sym, val); + { + if (to_boolean (ev->get_property ("once"))) + { + if (Global_context *g = get_global_context ()) + { + SCM old_val = SCM_UNDEFINED; + if (here_defined (sym, &old_val)) + g->add_finalization (scm_list_4 (ly_context_set_property_x_proc, + self_scm (), + sym, + old_val)); + else + g->add_finalization (scm_list_3 (ly_context_unset_property_proc, + self_scm (), + sym)); + } + } + set_property (sym, val); + } } } -IMPLEMENT_LISTENER (Context, unset_property_from_event); void Context::unset_property_from_event (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); + Stream_event *ev = unsmob (sev); SCM sym = ev->get_property ("symbol"); - type_check_assignment (sym, SCM_EOL, ly_symbol2scm ("translation-type?")); - unset_property (sym); + bool ok = type_check_assignment (sym, SCM_EOL, ly_symbol2scm ("translation-type?")); + + if (ok) + { + if (to_boolean (ev->get_property ("once"))) + { + if (Global_context *g = get_global_context ()) + { + SCM old_val = SCM_UNDEFINED; + if (here_defined (sym, &old_val)) + g->add_finalization (scm_list_4 (ly_context_set_property_x_proc, + self_scm (), + sym, + old_val)); + else + g->add_finalization (scm_list_3 (ly_context_unset_property_proc, + self_scm (), + sym)); + } + } + unset_property (sym); + } } /* Creates a new context from a CreateContext event, and sends an AnnounceNewContext event to this context. */ -IMPLEMENT_LISTENER (Context, create_context_from_event); void Context::create_context_from_event (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); + Stream_event *ev = unsmob (sev); string id = ly_scm2string (ev->get_property ("id")); SCM ops = ev->get_property ("ops"); @@ -308,27 +340,27 @@ Context::create_context_from_event (SCM sev) /* We want to be the first ones to hear our own events. Therefore, wait before registering events_below_ */ new_context->event_source ()-> - add_listener (GET_LISTENER (new_context->create_context_from_event), + add_listener (new_context->GET_LISTENER (Context, create_context_from_event), ly_symbol2scm ("CreateContext")); new_context->event_source ()-> - add_listener (GET_LISTENER (new_context->remove_context), + add_listener (new_context->GET_LISTENER (Context, remove_context), ly_symbol2scm ("RemoveContext")); new_context->event_source ()-> - add_listener (GET_LISTENER (new_context->change_parent), + add_listener (new_context->GET_LISTENER (Context, change_parent), ly_symbol2scm ("ChangeParent")); new_context->event_source ()-> - add_listener (GET_LISTENER (new_context->set_property_from_event), + add_listener (new_context->GET_LISTENER (Context, set_property_from_event), ly_symbol2scm ("SetProperty")); new_context->event_source ()-> - add_listener (GET_LISTENER (new_context->unset_property_from_event), + add_listener (new_context->GET_LISTENER (Context, unset_property_from_event), ly_symbol2scm ("UnsetProperty")); new_context->events_below_->register_as_listener (new_context->event_source_); - this->add_context (new_context); + add_context (new_context); new_context->unprotect (); - Context_def *td = unsmob_context_def (new_context->definition_); + Context_def *td = unsmob (new_context->definition_); /* This cannot move before add_context (), because \override operations require that we are in the hierarchy. */ @@ -347,13 +379,13 @@ Context::path_to_acceptable_context (SCM name) const // but the Context_def expects to see elements of the form ('accepts symbol). SCM accepts = SCM_EOL; for (SCM s = definition_mods_; scm_is_pair (s); s = scm_cdr (s)) - if (scm_caar (s) == ly_symbol2scm ("accepts")) + if (scm_is_eq (scm_caar (s), ly_symbol2scm ("accepts"))) { SCM elt = scm_list_2 (scm_caar (s), scm_string_to_symbol (scm_cadar (s))); accepts = scm_cons (elt, accepts); } - return unsmob_context_def (definition_)->path_to_acceptable_context (name, + return unsmob (definition_)->path_to_acceptable_context (name, get_output_def (), scm_reverse_x (accepts, SCM_EOL)); @@ -368,7 +400,7 @@ Context::create_context (Context_def *cdef, /* TODO: This is fairly misplaced. We can fix this when we have taken out all iterator specific stuff from the Context class */ event_source_-> - add_listener (GET_LISTENER (acknowledge_infant), + add_listener (GET_LISTENER (Context, acknowledge_infant), ly_symbol2scm ("AnnounceNewContext")); /* The CreateContext creates a new context, and sends an announcement of the new context through another event. That event will be stored in @@ -378,12 +410,12 @@ Context::create_context (Context_def *cdef, ly_symbol2scm ("type"), cdef->get_context_name (), ly_symbol2scm ("id"), ly_string2scm (id)); event_source_-> - remove_listener (GET_LISTENER (acknowledge_infant), + remove_listener (GET_LISTENER (Context, acknowledge_infant), ly_symbol2scm ("AnnounceNewContext")); assert (infant_event_); SCM infant_scm = infant_event_->get_property ("context"); - Context *infant = unsmob_context (infant_scm); + Context *infant = unsmob (infant_scm); if (!infant || infant->get_parent_context () != this) { @@ -419,11 +451,11 @@ Context::get_default_interpreter (const string &context_id) SCM st = find_context_def (get_output_def (), nm); string name = ly_symbol2string (nm); - Context_def *t = unsmob_context_def (st); + Context_def *t = unsmob (st); if (!t) { warning (_f ("cannot find or create: `%s'", name.c_str ())); - t = unsmob_context_def (this->definition_); + t = unsmob (definition_); } if (scm_is_symbol (t->get_default_child (SCM_EOL))) { @@ -448,7 +480,7 @@ Context::get_default_interpreter (const string &context_id) Context * Context::where_defined (SCM sym, SCM *value) const { -#ifndef NDEBUG +#ifdef DEBUG if (profile_property_accesses) note_property_access (&context_property_lookup_table, sym); #endif @@ -459,13 +491,26 @@ Context::where_defined (SCM sym, SCM *value) const return (daddy_context_) ? daddy_context_->where_defined (sym, value) : 0; } +/* Quick variant of where_defined. Checks only the context itself. */ + +bool +Context::here_defined (SCM sym, SCM *value) const +{ +#ifdef DEBUG + if (profile_property_accesses) + note_property_access (&context_property_lookup_table, sym); +#endif + + return properties_dict ()->try_retrieve (sym, value); +} + /* return SCM_EOL when not found. */ SCM Context::internal_get_property (SCM sym) const { -#ifndef NDEBUG +#ifdef DEBUG if (profile_property_accesses) note_property_access (&context_property_lookup_table, sym); #endif @@ -488,9 +533,7 @@ be called from any other place than the send_stream_event macro. void Context::internal_send_stream_event (SCM type, Input *origin, SCM props[]) { - Stream_event *e = new Stream_event - (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), type), - origin); + Stream_event *e = new Stream_event (Lily::ly_make_event_class (type), origin); for (int i = 0; props[i]; i += 2) { e->set_property (props[i], props[i + 1]); @@ -507,7 +550,7 @@ Context::is_alias (SCM sym) const if (scm_is_eq (sym, context_name_symbol ())) return true; - return scm_c_memq (sym, aliases_) != SCM_BOOL_F; + return scm_is_true (scm_c_memq (sym, aliases_)); } void @@ -544,12 +587,11 @@ Context::unset_property (SCM sym) properties_dict ()->remove (sym); } -IMPLEMENT_LISTENER (Context, change_parent); void Context::change_parent (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); - Context *to = unsmob_context (ev->get_property ("context")); + Stream_event *ev = unsmob (sev); + Context *to = unsmob (ev->get_property ("context")); disconnect_from_parent (); to->add_context (this); @@ -558,7 +600,6 @@ Context::change_parent (SCM sev) /* Die. The next GC sweep should take care of the actual death. */ -IMPLEMENT_LISTENER (Context, remove_context); void Context::remove_context (SCM) { @@ -572,14 +613,31 @@ Context::remove_context (SCM) void Context::disconnect_from_parent () { - daddy_context_->events_below_->unregister_as_listener (this->events_below_); - daddy_context_->context_list_ = scm_delq_x (this->self_scm (), daddy_context_->context_list_); + daddy_context_->events_below_->unregister_as_listener (events_below_); + daddy_context_->context_list_ = scm_delq_x (self_scm (), daddy_context_->context_list_); daddy_context_ = 0; } -/* - ID == "" means accept any ID. -*/ +Context * +find_context_above (Context *where, SCM type) +{ + while (where && !where->is_alias (type)) + where = where->get_parent_context (); + + return where; +} + +Context * +find_context_above_by_parent_type (Context *where, SCM parent_type) +{ + for (Context *child = 0; where; + child = where, where = where->get_parent_context ()) + if (where->is_alias (parent_type)) + return child; + + return 0; +} + Context * find_context_below (Context *where, SCM type, const string &id) @@ -594,7 +652,7 @@ find_context_below (Context *where, for (SCM s = where->children_contexts (); !found && scm_is_pair (s); s = scm_cdr (s)) { - Context *tr = unsmob_context (scm_car (s)); + Context *tr = unsmob (scm_car (s)); found = find_context_below (tr, type, id); } @@ -602,6 +660,29 @@ find_context_below (Context *where, return found; } +Context * +find_context_near (Context *where, + SCM type, const string &id) +{ + for ( ; where; where = where->get_parent_context ()) + { + Context *found = find_context_below (where, type, id); + if (found) + return found; + } + + return 0; +} + +Context * +find_top_context (Context *where) +{ + Context *top = where; + for ( ; where; where = where->get_parent_context()) + top = where; + return top; +} + SCM Context::properties_as_alist () const { @@ -611,7 +692,7 @@ Context::properties_as_alist () const SCM Context::context_name_symbol () const { - Context_def *td = unsmob_context_def (definition_); + Context_def *td = unsmob (definition_); return td->get_context_name (); } @@ -651,60 +732,54 @@ Context::now_mom () const } int -Context::print_smob (SCM s, SCM port, scm_print_state *) +Context::print_smob (SCM port, scm_print_state *) const { - Context *sc = (Context *) SCM_CELL_WORD_1 (s); - scm_puts ("#<", port); - scm_puts (sc->class_name (), port); - if (Context_def *d = unsmob_context_def (sc->definition_)) + scm_puts (class_name (), port); + if (Context_def *d = unsmob (definition_)) { scm_puts (" ", port); scm_display (d->get_context_name (), port); } - if (!sc->id_string_.empty ()) + if (!id_string_.empty ()) { scm_puts ("=", port); - scm_puts (sc->id_string_.c_str (), port); + scm_puts (id_string_.c_str (), port); } scm_puts (" ", port); - scm_display (sc->context_list_, port); + scm_display (context_list_, port); scm_puts (" >", port); return 1; } SCM -Context::mark_smob (SCM sm) +Context::mark_smob () const { - Context *me = (Context *) SCM_CELL_WORD_1 (sm); + scm_gc_mark (context_list_); + scm_gc_mark (aliases_); + scm_gc_mark (definition_); + scm_gc_mark (definition_mods_); + scm_gc_mark (properties_scm_); + scm_gc_mark (accepts_list_); + scm_gc_mark (default_child_); - scm_gc_mark (me->context_list_); - scm_gc_mark (me->aliases_); - scm_gc_mark (me->definition_); - scm_gc_mark (me->definition_mods_); - scm_gc_mark (me->properties_scm_); - scm_gc_mark (me->accepts_list_); - scm_gc_mark (me->default_child_); + if (implementation_) + scm_gc_mark (implementation_->self_scm ()); - if (me->implementation_) - scm_gc_mark (me->implementation_->self_scm ()); + if (event_source_) + scm_gc_mark (event_source_->self_scm ()); - if (me->event_source_) - scm_gc_mark (me->event_source_->self_scm ()); + if (events_below_) + scm_gc_mark (events_below_->self_scm ()); - if (me->events_below_) - scm_gc_mark (me->events_below_->self_scm ()); - - return me->properties_scm_; + return properties_scm_; } -IMPLEMENT_SMOBS (Context); -IMPLEMENT_DEFAULT_EQUAL_P (Context); -IMPLEMENT_TYPE_P (Context, "ly:context?"); +const char * const Context::type_p_name_ = "ly:context?"; Global_context * Context::get_global_context () const @@ -733,8 +808,8 @@ measure_length (Context const *context) { SCM l = context->get_property ("measureLength"); Rational length (1); - if (unsmob_moment (l)) - length = unsmob_moment (l)->main_part_; + if (unsmob (l)) + length = unsmob (l)->main_part_; return length; } @@ -744,9 +819,9 @@ measure_position (Context const *context) SCM sm = context->get_property ("measurePosition"); Moment m = 0; - if (unsmob_moment (sm)) + if (unsmob (sm)) { - m = *unsmob_moment (sm); + m = *unsmob (sm); if (m.main_part_ < Rational (0)) { @@ -794,7 +869,7 @@ set_context_property_on_children (Context *trans, SCM sym, SCM val) trans->set_property (sym, ly_deep_copy (val)); for (SCM p = trans->children_contexts (); scm_is_pair (p); p = scm_cdr (p)) { - Context *trg = unsmob_context (scm_car (p)); + Context *trg = unsmob (scm_car (p)); set_context_property_on_children (trg, sym, ly_deep_copy (val)); } } @@ -802,14 +877,29 @@ set_context_property_on_children (Context *trans, SCM sym, SCM val) bool melisma_busy (Context *tr) { - SCM melisma_properties = tr->get_property ("melismaBusyProperties"); - bool busy = false; + // When there are subcontexts, they are responsible for maintaining + // melismata. + SCM ch = tr->children_contexts (); + if (scm_is_pair (ch)) + { + // all contexts need to have a busy melisma for this to evaluate + // to true. + + do { + if (!melisma_busy (unsmob (scm_car (ch)))) + return false; + ch = scm_cdr (ch); + } while (scm_is_pair (ch)); + return true; + } - for (; !busy && scm_is_pair (melisma_properties); + for (SCM melisma_properties = tr->get_property ("melismaBusyProperties"); + scm_is_pair (melisma_properties); melisma_properties = scm_cdr (melisma_properties)) - busy = busy || to_boolean (tr->internal_get_property (scm_car (melisma_properties))); + if (to_boolean (tr->get_property (scm_car (melisma_properties)))) + return true; - return busy; + return false; } bool diff --git a/lily/control-track-performer.cc b/lily/control-track-performer.cc index 9b0d676870..db6efe649e 100644 --- a/lily/control-track-performer.cc +++ b/lily/control-track-performer.cc @@ -52,16 +52,26 @@ Control_track_performer::add_text (Audio_text::Type text_type, const string &str void Control_track_performer::initialize () { - control_track_ = new Audio_staff; + control_track_ = new Audio_control_track_staff; announce_element (Audio_element_info (control_track_, 0)); string id_string = String_convert::pad_to (gnu_lilypond_version_string (), 30); + // The first audio element in the control track is a placeholder for the + // name of the MIDI sequence. The actual name is stored in the element + // later before outputting the track (in Performance::output, see + // performance.cc). add_text (Audio_text::TRACK_NAME, "control track"); add_text (Audio_text::TEXT, "creator: "); add_text (Audio_text::TEXT, id_string); } +void +Control_track_performer::boot () +{ + +} + ADD_TRANSLATOR (Control_track_performer, /* doc */ "", diff --git a/lily/cue-clef-engraver.cc b/lily/cue-clef-engraver.cc index aebf071b9e..53640afadc 100644 --- a/lily/cue-clef-engraver.cc +++ b/lily/cue-clef-engraver.cc @@ -1,9 +1,9 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Mats Bengtsson - Copyright (C) 2010--2012 Reinhold Kainhofer + Copyright (C) 2010--2015 Reinhold Kainhofer LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ public: protected: void stop_translation_timestep (); void process_music (); - DECLARE_ACKNOWLEDGER (bar_line); + void acknowledge_bar_line (Grob_info); virtual void derived_mark () const; private: @@ -171,9 +171,9 @@ Cue_clef_engraver::inspect_clef_properties () SCM clefpos = get_property ("cueClefPosition"); SCM transposition = get_property ("cueClefTransposition"); - if (scm_equal_p (glyph, prev_glyph_) == SCM_BOOL_F - || scm_equal_p (clefpos, prev_cpos_) == SCM_BOOL_F - || scm_equal_p (transposition, prev_transposition_) == SCM_BOOL_F) + if (!ly_is_equal (glyph, prev_glyph_) + || !ly_is_equal (clefpos, prev_cpos_) + || !ly_is_equal (transposition, prev_transposition_)) { set_glyph (); if (scm_is_string (glyph)) @@ -209,7 +209,12 @@ Cue_clef_engraver::stop_translation_timestep () } } -ADD_ACKNOWLEDGER (Cue_clef_engraver, bar_line); +void +Cue_clef_engraver::boot () +{ + ADD_ACKNOWLEDGER (Cue_clef_engraver, bar_line); +} + ADD_TRANSLATOR (Cue_clef_engraver, /* doc */ "Determine and set reference point for pitches in cued voices.", diff --git a/lily/custos-engraver.cc b/lily/custos-engraver.cc index 6b915f5cb4..a21ad4eb78 100644 --- a/lily/custos-engraver.cc +++ b/lily/custos-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Juergen Reuter , + Copyright (C) 2000--2015 Juergen Reuter , Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -39,8 +39,8 @@ class Custos_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Custos_engraver); void start_translation_timestep (); - DECLARE_ACKNOWLEDGER (bar); - DECLARE_ACKNOWLEDGER (note_head); + void acknowledge_bar (Grob_info); + void acknowledge_note_head (Grob_info); void process_acknowledged (); void stop_translation_timestep (); virtual void finalize (); @@ -95,7 +95,7 @@ Custos_engraver::acknowledge_note_head (Grob_info info) don't look at the staff-position, since we can't be sure whether Clef_engraver already applied a vertical shift. */ - pitches_.push_back (*unsmob_pitch (ev->get_property ("pitch"))); + pitches_.push_back (*unsmob (ev->get_property ("pitch"))); } } @@ -142,8 +142,13 @@ Custos_engraver::finalize () custodes_.clear (); } -ADD_ACKNOWLEDGER (Custos_engraver, bar); -ADD_ACKNOWLEDGER (Custos_engraver, note_head); + +void +Custos_engraver::boot () +{ + ADD_ACKNOWLEDGER (Custos_engraver, bar); + ADD_ACKNOWLEDGER (Custos_engraver, note_head); +} ADD_TRANSLATOR (Custos_engraver, /* doc */ diff --git a/lily/custos.cc b/lily/custos.cc index 1366202f72..37aeb66f6b 100644 --- a/lily/custos.cc +++ b/lily/custos.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Juergen Reuter + Copyright (C) 2000--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ MAKE_SCHEME_CALLBACK (Custos, print, 1); SCM Custos::print (SCM smob) { - Item *me = (Item *)unsmob_grob (smob); + Item *me = (Item *)unsmob (smob); SCM scm_style = me->get_property ("style"); string style; diff --git a/lily/default-bar-line-engraver.cc b/lily/default-bar-line-engraver.cc index a4c1bf6e2a..a8b9898276 100644 --- a/lily/default-bar-line-engraver.cc +++ b/lily/default-bar-line-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,6 +37,12 @@ public: #include "translator.icc" +void +Default_bar_line_engraver::boot () +{ + +} + ADD_TRANSLATOR (Default_bar_line_engraver, /* doc */ "This engraver determines what kind of automatic bar lines" diff --git a/lily/dimension-cache.cc b/lily/dimension-cache.cc index 4538f17bc1..33294db5e6 100644 --- a/lily/dimension-cache.cc +++ b/lily/dimension-cache.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/dimensions-scheme.cc b/lily/dimensions-scheme.cc index 6d3b00efe7..17ce14be0f 100644 --- a/lily/dimensions-scheme.cc +++ b/lily/dimensions-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/directional-element-interface.cc b/lily/directional-element-interface.cc index cd8d2c4d98..eb342fe1ac 100644 --- a/lily/directional-element-interface.cc +++ b/lily/directional-element-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ Direction get_grob_direction (Grob *me) { SCM d = me->get_property ("direction"); - if (d == ly_symbol2scm ("calculation-in-progress")) + if (scm_is_eq (d, ly_symbol2scm ("calculation-in-progress"))) { programming_error ("Grob direction requested while calculation in" " progress."); diff --git a/lily/dispatcher-scheme.cc b/lily/dispatcher-scheme.cc index 13854b26d7..3fd4decc42 100644 --- a/lily/dispatcher-scheme.cc +++ b/lily/dispatcher-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Erik Sandberg + Copyright (C) 2006--2015 Erik Sandberg LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,8 +30,8 @@ LY_DEFINE (ly_connect_dispatchers, "ly:connect-dispatchers", 2, 0, 0, (SCM to, SCM from), "Make the dispatcher @var{to} listen to events from @var{from}.") { - Dispatcher *t = unsmob_dispatcher (to); - Dispatcher *f = unsmob_dispatcher (from); + Dispatcher *t = unsmob (to); + Dispatcher *f = unsmob (from); LY_ASSERT_SMOB (Dispatcher, to, 1); LY_ASSERT_SMOB (Dispatcher, from, 2); @@ -41,23 +41,37 @@ LY_DEFINE (ly_connect_dispatchers, "ly:connect-dispatchers", return SCM_UNSPECIFIED; } +LY_DEFINE (ly_disconnect_dispatchers, "ly:disconnect-dispatchers", + 2, 0, 0, (SCM to, SCM from), + "Stop the dispatcher @var{to} listening to events from @var{from}.") +{ + Dispatcher *t = unsmob (to); + Dispatcher *f = unsmob (from); + + LY_ASSERT_SMOB (Dispatcher, to, 1); + LY_ASSERT_SMOB (Dispatcher, from, 2); + + t->unregister_as_listener (f); + + return SCM_UNSPECIFIED; +} + LY_DEFINE (ly_add_listener, "ly:add-listener", - 2, 0, 1, (SCM list, SCM disp, SCM cl), - "Add the listener @var{list} to the dispatcher @var{disp}." - " Whenever @var{disp} hears an event of class @var{cl}," - " it is forwarded to @var{list}.") + 2, 0, 1, (SCM callback, SCM disp, SCM cl), + "Add the single-argument procedure @var{callback} as listener" + " to the dispatcher @var{disp}. Whenever @var{disp} hears" + " an event of class @var{cl}, it calls @var{callback} with it.") { - Listener *l = unsmob_listener (list); - Dispatcher *d = unsmob_dispatcher (disp); + Dispatcher *d = unsmob (disp); - LY_ASSERT_SMOB (Listener, list, 1); + LY_ASSERT_TYPE (ly_is_procedure, callback, 1); LY_ASSERT_SMOB (Dispatcher, disp, 2); for (int arg = SCM_ARG3; scm_is_pair (cl); cl = scm_cdr (cl), arg++) { SCM sym = scm_car (cl); SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, arg, __FUNCTION__, "symbol"); - d->add_listener (*l, sym); + d->add_listener (callback, sym); } return SCM_UNSPECIFIED; @@ -70,7 +84,7 @@ LY_DEFINE (ly_listened_event_types, "ly:listened-event-types", { LY_ASSERT_SMOB (Dispatcher, disp, 1); - SCM result = unsmob_dispatcher (disp)->listened_types (); + SCM result = unsmob (disp)->listened_types (); scm_remember_upto_here_1 (disp); @@ -85,7 +99,7 @@ LY_DEFINE (ly_listened_event_class_p, "ly:listened-event-class?", LY_ASSERT_SMOB (Dispatcher, disp, 1); LY_ASSERT_TYPE (scm_is_pair, cl, 2); - bool result = unsmob_dispatcher (disp)->is_listened_class (cl); + bool result = unsmob (disp)->is_listened_class (cl); scm_remember_upto_here_1 (disp); @@ -96,8 +110,8 @@ LY_DEFINE (ly_broadcast, "ly:broadcast", 2, 0, 0, (SCM disp, SCM ev), "Send the stream event @var{ev} to the dispatcher @var{disp}.") { - Dispatcher *d = unsmob_dispatcher (disp); - Stream_event *e = unsmob_stream_event (ev); + Dispatcher *d = unsmob (disp); + Stream_event *e = unsmob (ev); LY_ASSERT_SMOB (Dispatcher, disp, 1); diff --git a/lily/dispatcher.cc b/lily/dispatcher.cc index eb612d35c4..b1b076759f 100644 --- a/lily/dispatcher.cc +++ b/lily/dispatcher.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Erik Sandberg + Copyright (C) 2005--2015 Erik Sandberg LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,12 +20,10 @@ #include "dispatcher.hh" #include "input.hh" #include "international.hh" -#include "ly-smobs.icc" #include "warn.hh" +#include "lily-imports.hh" -IMPLEMENT_SMOBS (Dispatcher); -IMPLEMENT_TYPE_P (Dispatcher, "ly:dispatcher?"); -IMPLEMENT_DEFAULT_EQUAL_P (Dispatcher); +const char * const Dispatcher::type_p_name_ = "ly:dispatcher?"; Dispatcher::~Dispatcher () { @@ -33,7 +31,6 @@ Dispatcher::~Dispatcher () Dispatcher::Dispatcher () { - self_scm_ = SCM_EOL; listeners_ = SCM_EOL; dispatchers_ = SCM_EOL; listen_classes_ = SCM_EOL; @@ -45,21 +42,18 @@ Dispatcher::Dispatcher () } SCM -Dispatcher::mark_smob (SCM sm) +Dispatcher::mark_smob () const { - Dispatcher *me = (Dispatcher *) SCM_CELL_WORD_1 (sm); - scm_gc_mark (me->dispatchers_); - scm_gc_mark (me->listen_classes_); - return me->listeners_; + scm_gc_mark (dispatchers_); + scm_gc_mark (listen_classes_); + return listeners_; } int -Dispatcher::print_smob (SCM s, SCM p, scm_print_state *) +Dispatcher::print_smob (SCM p, scm_print_state *) const { - Dispatcher *me = (Dispatcher *) SCM_CELL_WORD_1 (s); scm_puts ("#alist"), - me->listeners_), p); + scm_write (Lily::hash_table_to_alist (listeners_), p); scm_puts (">", p); return 1; } @@ -78,11 +72,10 @@ Event dispatching: combination of dispatchers, even if it matches more than one event type. */ -IMPLEMENT_LISTENER (Dispatcher, dispatch); void Dispatcher::dispatch (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); + Stream_event *ev = unsmob (sev); SCM class_list = ev->get_property ("class"); if (!scm_is_pair (class_list)) { @@ -149,8 +142,8 @@ Dispatcher::dispatch (SCM sev) assert (lists[0].prio > last_priority); last_priority = lists[0].prio; - Listener *l = unsmob_listener (scm_cdar (lists[0].list)); - l->listen (ev->self_scm ()); + SCM l = scm_cdar (lists[0].list); + scm_call_1 (l, ev->self_scm ()); #if 0 sent = true; #endif @@ -213,13 +206,20 @@ Dispatcher::broadcast (Stream_event *ev) void Dispatcher::add_listener (Listener l, SCM ev_class) { - internal_add_listener (l, ev_class, ++priority_count_); + add_listener (l.smobbed_copy (), ev_class); +} + +void +Dispatcher::add_listener (SCM callback, SCM ev_class) +{ + internal_add_listener (callback, ev_class, ++priority_count_); } inline void -Dispatcher::internal_add_listener (Listener l, SCM ev_class, int priority) +Dispatcher::internal_add_listener (SCM callback, SCM ev_class, int priority) { - SCM list = scm_hashq_ref (listeners_, ev_class, SCM_EOL); + SCM handle = scm_hashq_create_handle_x (listeners_, ev_class, SCM_EOL); + SCM list = scm_cdr (handle); // if ev_class is not yet listened to, we go through our list of // source dispatchers and register ourselves there with the priority // we have reserved for this dispatcher. The priority system @@ -235,34 +235,36 @@ Dispatcher::internal_add_listener (Listener l, SCM ev_class, int priority) for (SCM disp = dispatchers_; scm_is_pair (disp); disp = scm_cdr (disp)) { int priority = scm_to_int (scm_cdar (disp)); - Dispatcher *d = unsmob_dispatcher (scm_caar (disp)); - d->internal_add_listener (GET_LISTENER (dispatch), ev_class, priority); + Dispatcher *d = unsmob (scm_caar (disp)); + d->internal_add_listener (GET_LISTENER (Dispatcher, dispatch).smobbed_copy (), + ev_class, priority); } listen_classes_ = scm_cons (ev_class, listen_classes_); } - SCM entry = scm_cons (scm_from_int (priority), l.smobbed_copy ()); - list = scm_merge (list, scm_list_1 (entry), ly_lily_module_constant ("car<")); - scm_hashq_set_x (listeners_, ev_class, list); + SCM entry = scm_cons (scm_from_int (priority), callback); + list = scm_merge (list, scm_list_1 (entry), Lily::car_less); + scm_set_cdr_x (handle, list); } void Dispatcher::remove_listener (Listener l, SCM ev_class) { - SCM list = scm_hashq_ref (listeners_, ev_class, SCM_EOL); + SCM handle = scm_hashq_get_handle (listeners_, ev_class); - if (list == SCM_EOL) + if (scm_is_false (handle)) { programming_error ("remove_listener called with incorrect class."); return; } + SCM list = scm_cdr (handle); // We just remove the listener once. bool first = true; SCM dummy = scm_cons (SCM_EOL, list); SCM e = dummy; while (scm_is_pair (scm_cdr (e))) - if (*unsmob_listener (scm_cdadr (e)) == l && first) + if (*unsmob (scm_cdadr (e)) == l && first) { scm_set_cdr_x (e, scm_cddr (e)); first = false; @@ -271,7 +273,7 @@ Dispatcher::remove_listener (Listener l, SCM ev_class) else e = scm_cdr (e); list = scm_cdr (dummy); - scm_hashq_set_x (listeners_, ev_class, list); + scm_set_cdr_x (handle, list); if (first) warning (_ ("Attempting to remove nonexisting listener.")); @@ -280,8 +282,8 @@ Dispatcher::remove_listener (Listener l, SCM ev_class) /* Unregister with all dispatchers. */ for (SCM disp = dispatchers_; scm_is_pair (disp); disp = scm_cdr (disp)) { - Dispatcher *d = unsmob_dispatcher (scm_caar (disp)); - d->remove_listener (GET_LISTENER (dispatch), ev_class); + Dispatcher *d = unsmob (scm_caar (disp)); + d->remove_listener (GET_LISTENER (Dispatcher, dispatch), ev_class); } listen_classes_ = scm_delq_x (ev_class, listen_classes_); } @@ -298,7 +300,7 @@ Dispatcher::register_as_listener (Dispatcher *disp) int priority = ++disp->priority_count_; // Don't register twice to the same dispatcher. - if (scm_assq (disp->self_scm (), dispatchers_) != SCM_BOOL_F) + if (scm_is_true (scm_assq (disp->self_scm (), dispatchers_))) { warning (_ ("Already listening to dispatcher, ignoring request")); return; @@ -306,7 +308,7 @@ Dispatcher::register_as_listener (Dispatcher *disp) dispatchers_ = scm_acons (disp->self_scm (), scm_from_int (priority), dispatchers_); - Listener list = GET_LISTENER (dispatch); + SCM list = GET_LISTENER (Dispatcher, dispatch).smobbed_copy (); for (SCM cl = listen_classes_; scm_is_pair (cl); cl = scm_cdr (cl)) { disp->internal_add_listener (list, scm_car (cl), priority); @@ -319,7 +321,7 @@ Dispatcher::unregister_as_listener (Dispatcher *disp) { dispatchers_ = scm_assq_remove_x (dispatchers_, disp->self_scm ()); - Listener listener = GET_LISTENER (dispatch); + Listener listener = GET_LISTENER (Dispatcher, dispatch); for (SCM cl = listen_classes_; scm_is_pair (cl); cl = scm_cdr (cl)) { disp->remove_listener (listener, scm_car (cl)); diff --git a/lily/dot-column-engraver.cc b/lily/dot-column-engraver.cc index 5a1b0a6759..c5c8001524 100644 --- a/lily/dot-column-engraver.cc +++ b/lily/dot-column-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,7 +32,7 @@ public: protected: - DECLARE_ACKNOWLEDGER (rhythmic_head); + void acknowledge_rhythmic_head (Grob_info); void stop_translation_timestep (); }; @@ -51,7 +51,7 @@ Dot_column_engraver::stop_translation_timestep () void Dot_column_engraver::acknowledge_rhythmic_head (Grob_info info) { - Grob *d = unsmob_grob (info.grob ()->get_object ("dot")); + Grob *d = unsmob (info.grob ()->get_object ("dot")); if (d) { if (!dotcol_) @@ -61,7 +61,12 @@ Dot_column_engraver::acknowledge_rhythmic_head (Grob_info info) } } -ADD_ACKNOWLEDGER (Dot_column_engraver, rhythmic_head); +void +Dot_column_engraver::boot () +{ + ADD_ACKNOWLEDGER (Dot_column_engraver, rhythmic_head); +} + ADD_TRANSLATOR (Dot_column_engraver, /* doc */ "Engrave dots on dotted notes shifted to the right of the" diff --git a/lily/dot-column.cc b/lily/dot-column.cc index 6cba432639..7ac3140141 100644 --- a/lily/dot-column.cc +++ b/lily/dot-column.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,8 +17,6 @@ along with LilyPond. If not, see . */ -#include "dot-column.hh" - #include #include #include @@ -45,13 +43,13 @@ MAKE_SCHEME_CALLBACK (Dot_column, calc_positioning_done, 1); SCM Dot_column::calc_positioning_done (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); /* Trigger note collision resolution first, since that may kill off dots when merging. */ - if (Grob *collision = unsmob_grob (me->get_object ("note-collision"))) + if (Grob *collision = unsmob (me->get_object ("note-collision"))) (void) collision->get_property ("positioning-done"); me->set_property ("positioning-done", SCM_BOOL_T); @@ -59,7 +57,7 @@ Dot_column::calc_positioning_done (SCM smob) vector dots = extract_grob_array (me, "dots"); - vector main_heads; + vector parent_stems; Real ss = 0; Grob *commonx = me; @@ -68,12 +66,12 @@ Dot_column::calc_positioning_done (SCM smob) Grob *n = dots[i]->get_parent (Y_AXIS); commonx = n->common_refpoint (commonx, X_AXIS); - if (Grob *stem = unsmob_grob (n->get_object ("stem"))) + if (Grob *stem = unsmob (n->get_object ("stem"))) { commonx = stem->common_refpoint (commonx, X_AXIS); if (Stem::first_head (stem) == n) - main_heads.push_back (n); + parent_stems.push_back (stem); } } @@ -83,8 +81,8 @@ Dot_column::calc_positioning_done (SCM smob) extract_grob_set (me, "side-support-elements", support); Interval base_x; - for (vsize i = 0; i < main_heads.size (); i++) - base_x.unite (main_heads[i]->extent (commonx, X_AXIS)); + for (vsize i = 0; i < parent_stems.size (); i++) + base_x.unite (Stem::first_head (parent_stems[i])->extent (commonx, X_AXIS)); for (vsize i = 0; i < support.size (); i++) { @@ -97,12 +95,12 @@ Dot_column::calc_positioning_done (SCM smob) Rest collisions should wait after line breaking. */ Interval y; - if (Rest::has_interface (s)) + if (has_interface (s)) { base_x.unite (s->extent (commonx, X_AXIS)); continue; } - else if (Stem::has_interface (s)) + else if (has_interface (s)) { Real y1 = Stem::head_positions (s)[-get_grob_direction (s)]; Real y2 = y1 + get_grob_direction (s) * 7; @@ -112,7 +110,7 @@ Dot_column::calc_positioning_done (SCM smob) stems.insert (s); } - else if (Note_head::has_interface (s)) + else if (has_interface (s)) y = Interval (-1.1, 1.1); else { @@ -125,7 +123,7 @@ Dot_column::calc_positioning_done (SCM smob) Box b (s->extent (commonx, X_AXIS), y); boxes.push_back (b); - if (Grob *stem = unsmob_grob (s->get_object ("stem"))) + if (Grob *stem = unsmob (s->get_object ("stem"))) stems.insert (stem); } @@ -152,6 +150,36 @@ Dot_column::calc_positioning_done (SCM smob) we instead must use their pure Y positions. */ vector_sort (dots, pure_position_less); + + SCM chord_dots_limit = me->get_property ("chord-dots-limit"); + if (scm_is_number (chord_dots_limit)) + { + // Sort dots by stem, then check for dots above the limit for each stem + vector > dots_each_stem (parent_stems.size ()); + for (vsize i = 0; i < dots.size (); i++) + if (Grob *stem = unsmob (dots[i]->get_parent (Y_AXIS) + -> get_object ("stem"))) + for (vsize j = 0; j < parent_stems.size (); j++) + if (stem == parent_stems[j]) + { + dots_each_stem[j].push_back (dots[i]); + break; + } + for (vsize j = 0; j < parent_stems.size (); j++) + { + Interval chord = Stem::head_positions (parent_stems[j]); + int total_room = ((int) chord.length () + 2 + + scm_to_int (chord_dots_limit)) / 2; + int total_dots = dots_each_stem[j].size (); + // remove excessive dots from the ends of the stem + for (int first_dot = 0; total_dots > total_room; total_dots--) + if (0 == (total_dots - total_room) % 2) + dots_each_stem[j][first_dot++]->suicide (); + else + dots_each_stem[j][first_dot + total_dots - 1]->suicide (); + } + } + for (vsize i = dots.size (); i--;) { if (!dots[i]->is_live ()) @@ -172,7 +200,7 @@ Dot_column::calc_positioning_done (SCM smob) Grob *note = dots[i]->get_parent (Y_AXIS); if (note) { - if (Note_head::has_interface (note)) + if (has_interface (note)) dp.dir_ = to_dir (dp.dot_->get_property ("direction")); dp.x_extent_ = note->extent (commonx, X_AXIS); @@ -187,8 +215,9 @@ Dot_column::calc_positioning_done (SCM smob) cfg.remove_collision (p); cfg[p] = dp; - if (Staff_symbol_referencer::on_line (dp.dot_, p) && - dp.dot_->get_property ("style") != ly_symbol2scm ("kievan")) + if (Staff_symbol_referencer::on_line (dp.dot_, p) + && !scm_is_eq (dp.dot_->get_property ("style"), + ly_symbol2scm ("kievan"))) cfg.remove_collision (p); } @@ -211,7 +240,7 @@ Dot_column::calc_positioning_done (SCM smob) void Dot_column::add_head (Grob *me, Grob *head) { - Grob *d = unsmob_grob (head->get_object ("dot")); + Grob *d = unsmob (head->get_object ("dot")); if (d) { Side_position_interface::add_support (me, head); @@ -223,7 +252,7 @@ Dot_column::add_head (Grob *me, Grob *head) // correct X-offset of the dots for horizontal collision avoidance. // The translation here is undone in calc_positioning_done, where we // do the X-offset properly. - if (Rest::has_interface (head)) + if (has_interface (head)) d->translate_axis (head->extent (head, X_AXIS).length (), X_AXIS); else d->set_property ("X-offset", Grob::x_parent_positioning_proc); @@ -236,6 +265,7 @@ ADD_INTERFACE (Dot_column, " dots so they do not clash with staff lines.", /* properties */ + "chord-dots-limit " "dots " "positioning-done " "direction " diff --git a/lily/dot-configuration.cc b/lily/dot-configuration.cc index 940420c312..25d35eb691 100644 --- a/lily/dot-configuration.cc +++ b/lily/dot-configuration.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/dot-formatting-problem.cc b/lily/dot-formatting-problem.cc index 863aa5fc02..221ab584b4 100644 --- a/lily/dot-formatting-problem.cc +++ b/lily/dot-formatting-problem.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/dots-engraver.cc b/lily/dots-engraver.cc index d588e5e92b..cbd6c718a9 100644 --- a/lily/dots-engraver.cc +++ b/lily/dots-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ class Dots_engraver : public Engraver { - DECLARE_ACKNOWLEDGER (rhythmic_head); + void acknowledge_rhythmic_head (Grob_info); TRANSLATOR_DECLARATIONS (Dots_engraver); }; @@ -43,10 +43,10 @@ Dots_engraver::acknowledge_rhythmic_head (Grob_info gi) return; Grob *note = gi.grob (); - if (unsmob_grob (note->get_object ("dot"))) + if (unsmob (note->get_object ("dot"))) return; - Duration *dur = unsmob_duration (cause->get_property ("duration")); + Duration *dur = unsmob (cause->get_property ("duration")); if (dur && dur->dot_count ()) { Item *d = make_item ("Dots", note->self_scm ()); @@ -56,7 +56,12 @@ Dots_engraver::acknowledge_rhythmic_head (Grob_info gi) } } -ADD_ACKNOWLEDGER (Dots_engraver, rhythmic_head); + +void +Dots_engraver::boot () +{ + ADD_ACKNOWLEDGER (Dots_engraver, rhythmic_head); +} ADD_TRANSLATOR (Dots_engraver, "Create @ref{Dots} objects for" diff --git a/lily/dots.cc b/lily/dots.cc index 20503ca5ae..b7f787bc02 100644 --- a/lily/dots.cc +++ b/lily/dots.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,7 @@ MAKE_SCHEME_CALLBACK (Dots, print, 1); SCM Dots::print (SCM d) { - Grob *sc = unsmob_grob (d); + Grob *sc = unsmob (d); Stencil mol; SCM c = sc->get_property ("dot-count"); diff --git a/lily/double-percent-repeat-engraver.cc b/lily/double-percent-repeat-engraver.cc index cd455e008e..d1717f8314 100644 --- a/lily/double-percent-repeat-engraver.cc +++ b/lily/double-percent-repeat-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Neil Puttock + Copyright (C) 2011--2015 Neil Puttock LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,7 +38,7 @@ protected: // moment (global time) where percent started Moment start_mom_; - DECLARE_TRANSLATOR_LISTENER (double_percent); + void listen_double_percent (Stream_event *); void process_music (); }; @@ -48,7 +48,6 @@ Double_percent_repeat_engraver::Double_percent_repeat_engraver () percent_event_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Double_percent_repeat_engraver, double_percent); void Double_percent_repeat_engraver::listen_double_percent (Stream_event *ev) { @@ -73,7 +72,7 @@ Double_percent_repeat_engraver::process_music () percent_event_->self_scm ()); SCM count = percent_event_->get_property ("repeat-count"); - if (count != SCM_EOL && to_boolean (get_property ("countPercentRepeats")) + if (!scm_is_null (count) && to_boolean (get_property ("countPercentRepeats")) && check_repeat_count_visibility (context (), count)) { Item *double_percent_counter @@ -95,6 +94,12 @@ Double_percent_repeat_engraver::process_music () } } +void +Double_percent_repeat_engraver::boot () +{ + ADD_LISTENER (Double_percent_repeat_engraver, double_percent); +} + ADD_TRANSLATOR (Double_percent_repeat_engraver, /* doc */ "Make double measure repeats.", diff --git a/lily/drum-note-engraver.cc b/lily/drum-note-engraver.cc index 06d24fdea6..16b089cb70 100644 --- a/lily/drum-note-engraver.cc +++ b/lily/drum-note-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,9 +43,9 @@ public: protected: void process_music (); - DECLARE_ACKNOWLEDGER (stem); - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_TRANSLATOR_LISTENER (note); + void acknowledge_stem (Grob_info); + void acknowledge_note_column (Grob_info); + void listen_note (Stream_event *); void stop_translation_timestep (); }; @@ -53,7 +53,6 @@ Drum_notes_engraver::Drum_notes_engraver () { } -IMPLEMENT_TRANSLATOR_LISTENER (Drum_notes_engraver, note); void Drum_notes_engraver::listen_note (Stream_event *ev) { @@ -76,7 +75,7 @@ Drum_notes_engraver::process_music () SCM defn = SCM_EOL; - if (scm_hash_table_p (tab) == SCM_BOOL_T) + if (to_boolean (scm_hash_table_p (tab))) defn = scm_hashq_ref (tab, drum_type, SCM_EOL); if (scm_is_pair (defn)) @@ -85,7 +84,7 @@ Drum_notes_engraver::process_music () SCM style = scm_car (defn); SCM script = scm_cadr (defn); - if (scm_integer_p (pos) == SCM_BOOL_T) + if (scm_is_integer (pos)) note->set_property ("staff-position", pos); if (scm_is_symbol (style)) note->set_property ("style", style); @@ -140,8 +139,14 @@ Drum_notes_engraver::stop_translation_timestep () events_.clear (); } -ADD_ACKNOWLEDGER (Drum_notes_engraver, stem); -ADD_ACKNOWLEDGER (Drum_notes_engraver, note_column); + +void +Drum_notes_engraver::boot () +{ + ADD_LISTENER (Drum_notes_engraver, note); + ADD_ACKNOWLEDGER (Drum_notes_engraver, stem); + ADD_ACKNOWLEDGER (Drum_notes_engraver, note_column); +} ADD_TRANSLATOR (Drum_notes_engraver, /* doc */ diff --git a/lily/drum-note-performer.cc b/lily/drum-note-performer.cc index 94c2d55ea3..93f648f3d7 100644 --- a/lily/drum-note-performer.cc +++ b/lily/drum-note-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Jan Nieuwenhuizen + Copyright (C) 1996--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ public: protected: void stop_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (note); + void listen_note (Stream_event *); private: vector note_evs_; }; @@ -55,29 +55,33 @@ Drum_note_performer::process_music () SCM defn = SCM_EOL; if (scm_is_symbol (sym) - && (scm_hash_table_p (tab) == SCM_BOOL_T)) + && to_boolean (scm_hash_table_p (tab))) defn = scm_hashq_ref (tab, sym, SCM_EOL); - if (Pitch *pit = unsmob_pitch (defn)) + if (Pitch *pit = unsmob (defn)) { SCM articulations = n->get_property ("articulations"); Stream_event *tie_event = 0; - for (SCM s = articulations; - !tie_event && scm_is_pair (s); - s = scm_cdr (s)) + Moment len = get_event_length (n, now_mom ()); + int velocity = 0; + for (SCM s = articulations; scm_is_pair (s); s = scm_cdr (s)) { - Stream_event *ev = unsmob_stream_event (scm_car (s)); + Stream_event *ev = unsmob (scm_car (s)); if (!ev) continue; if (ev->in_event_class ("tie-event")) tie_event = ev; + SCM f = ev->get_property ("midi-length"); + if (ly_is_procedure (f)) + len = robust_scm2moment (scm_call_2 (f, len.smobbed_copy (), + context ()->self_scm ()), + len); + velocity += robust_scm2int (ev->get_property ("midi-extra-velocity"), 0); } - Moment len = get_event_length (n, now_mom ()); - Audio_note *p = new Audio_note (*pit, len, - tie_event, Pitch (0, 0, 0)); + tie_event, Pitch (0, 0), velocity); Audio_element_info info (p, n); announce_element (info); } @@ -92,13 +96,18 @@ Drum_note_performer::stop_translation_timestep () note_evs_.clear (); } -IMPLEMENT_TRANSLATOR_LISTENER (Drum_note_performer, note); void Drum_note_performer::listen_note (Stream_event *ev) { note_evs_.push_back (ev); } +void +Drum_note_performer::boot () +{ + ADD_LISTENER (Drum_note_performer, note); +} + ADD_TRANSLATOR (Drum_note_performer, /* doc */ "Play drum notes.", diff --git a/lily/duration-scheme.cc b/lily/duration-scheme.cc index ffb769e2e9..7d0788ea3e 100644 --- a/lily/duration-scheme.cc +++ b/lily/duration-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -25,8 +25,8 @@ MAKE_SCHEME_CALLBACK (Duration, less_p, 2); SCM Duration::less_p (SCM p1, SCM p2) { - Duration *a = unsmob_duration (p1); - Duration *b = unsmob_duration (p2); + Duration *a = unsmob (p1); + Duration *b = unsmob (p2); if (compare (*a, *b) < 0) return SCM_BOOL_T; @@ -41,8 +41,8 @@ LY_DEFINE (ly_duration_less_p, "ly:duration (p1); + Duration *b = unsmob (p2); if (Duration::compare (*a, *b) < 0) return SCM_BOOL_T; @@ -67,7 +67,7 @@ LY_DEFINE (ly_make_duration, "ly:make-duration", LY_ASSERT_TYPE (scm_is_integer, length, 1); int dots = 0; - if (dotcount != SCM_UNDEFINED) + if (!SCM_UNBNDP (dotcount)) { LY_ASSERT_TYPE (scm_is_integer, dotcount, 2); dots = scm_to_int (dotcount); @@ -102,7 +102,7 @@ LY_DEFINE (ly_duration_log, "ly:duration-log", "Extract the duration log from @var{dur}.") { LY_ASSERT_SMOB (Duration, dur, 1); - return scm_from_int (unsmob_duration (dur)->duration_log ()); + return scm_from_int (unsmob (dur)->duration_log ()); } LY_DEFINE (ly_duration_dot_count, "ly:duration-dot-count", @@ -110,7 +110,7 @@ LY_DEFINE (ly_duration_dot_count, "ly:duration-dot-count", "Extract the dot count from @var{dur}.") { LY_ASSERT_SMOB (Duration, dur, 1); - return scm_from_int (unsmob_duration (dur)->dot_count ()); + return scm_from_int (unsmob (dur)->dot_count ()); } LY_DEFINE (ly_intlog2, "ly:intlog2", @@ -127,7 +127,7 @@ LY_DEFINE (ly_duration_length, "ly:duration-length", "The length of the duration as a @code{moment}.") { LY_ASSERT_SMOB (Duration, dur, 1); - return Moment (unsmob_duration (dur)->get_length ()).smobbed_copy (); + return Moment (unsmob (dur)->get_length ()).smobbed_copy (); } LY_DEFINE (ly_duration_2_string, "ly:duration->string", @@ -135,7 +135,7 @@ LY_DEFINE (ly_duration_2_string, "ly:duration->string", "Convert @var{dur} to a string.") { LY_ASSERT_SMOB (Duration, dur, 1); - return ly_string2scm (unsmob_duration (dur)->to_string ()); + return ly_string2scm (unsmob (dur)->to_string ()); } LY_DEFINE (ly_duration_factor, "ly:duration-factor", @@ -144,7 +144,7 @@ LY_DEFINE (ly_duration_factor, "ly:duration-factor", " Return it as a pair.") { LY_ASSERT_SMOB (Duration, dur, 1); - Rational r = unsmob_duration (dur)->factor (); + Rational r = unsmob (dur)->factor (); return scm_cons (scm_from_int64 (r.num ()), scm_from_int64 (r.den ())); } @@ -156,7 +156,7 @@ LY_DEFINE (ly_duration_scale, "ly:duration-scale", " Return it as a rational.") { LY_ASSERT_SMOB (Duration, dur, 1); - Rational r = unsmob_duration (dur)->factor (); + Rational r = unsmob (dur)->factor (); return ly_rational2scm (r); } diff --git a/lily/duration.cc b/lily/duration.cc index 782804e9da..0c6fa4dd5f 100644 --- a/lily/duration.cc +++ b/lily/duration.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -23,7 +23,6 @@ #include "misc.hh" #include "lily-proto.hh" -#include "ly-smobs.icc" int Duration::compare (Duration const &left, Duration const &right) @@ -137,22 +136,14 @@ Duration::to_string () const return s; } -IMPLEMENT_TYPE_P (Duration, "ly:duration?"); +const char * const Duration::type_p_name_ = "ly:duration?"; -SCM -Duration::mark_smob (SCM) -{ - return SCM_EOL; -} -IMPLEMENT_SIMPLE_SMOBS (Duration); int -Duration::print_smob (SCM s, SCM port, scm_print_state *) +Duration::print_smob (SCM port, scm_print_state *) const { - Duration *r = (Duration *) SCM_CELL_WORD_1 (s); - scm_puts ("#to_string ()), port); + scm_display (ly_string2scm (to_string ()), port); scm_puts (" >", port); return 1; diff --git a/lily/dynamic-align-engraver.cc b/lily/dynamic-align-engraver.cc index 37f93cd5c4..c276e21759 100644 --- a/lily/dynamic-align-engraver.cc +++ b/lily/dynamic-align-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2008--2012 Han-Wen Nienhuys + Copyright (C) 2008--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -34,17 +34,17 @@ class Dynamic_align_engraver : public Engraver { TRANSLATOR_DECLARATIONS (Dynamic_align_engraver); - DECLARE_ACKNOWLEDGER (rhythmic_head); - DECLARE_ACKNOWLEDGER (stem); - DECLARE_ACKNOWLEDGER (dynamic); - DECLARE_ACKNOWLEDGER (footnote_spanner); - DECLARE_END_ACKNOWLEDGER (dynamic); + void acknowledge_rhythmic_head (Grob_info); + void acknowledge_stem (Grob_info); + void acknowledge_dynamic (Grob_info); + void acknowledge_footnote_spanner (Grob_info); + void acknowledge_end_dynamic (Grob_info); protected: virtual void stop_translation_timestep (); private: - void create_line_spanner (Stream_event *cause); + void create_line_spanner (Grob *cause); void set_spanner_bounds (Spanner *line, bool end); Spanner *line_; Spanner *ended_line_; // Spanner manually broken, don't use it for new grobs @@ -64,24 +64,18 @@ Dynamic_align_engraver::Dynamic_align_engraver () current_dynamic_spanner_ = 0; } -ADD_ACKNOWLEDGER (Dynamic_align_engraver, dynamic); -ADD_ACKNOWLEDGER (Dynamic_align_engraver, rhythmic_head); -ADD_ACKNOWLEDGER (Dynamic_align_engraver, stem); -ADD_ACKNOWLEDGER (Dynamic_align_engraver, footnote_spanner); -ADD_END_ACKNOWLEDGER (Dynamic_align_engraver, dynamic); void -Dynamic_align_engraver::create_line_spanner (Stream_event *event) +Dynamic_align_engraver::create_line_spanner (Grob *cause) { if (!line_) - line_ = make_spanner ("DynamicLineSpanner", - event ? event->self_scm () : SCM_EOL); + line_ = make_spanner ("DynamicLineSpanner", cause->self_scm ()); } void Dynamic_align_engraver::acknowledge_end_dynamic (Grob_info info) { - if (Spanner::has_interface (info.grob ())) + if (has_interface (info.grob ())) ended_.push_back (info.spanner ()); /* If the break flag is set, store the current spanner and let new dynamics @@ -141,8 +135,8 @@ Dynamic_align_engraver::acknowledge_dynamic (Grob_info info) } } - create_line_spanner (cause); - if (Spanner::has_interface (info.grob ())) + create_line_spanner (info.grob ()); + if (has_interface (info.grob ())) { started_.push_back (info.spanner ()); current_dynamic_spanner_ = info.spanner (); @@ -182,7 +176,7 @@ Dynamic_align_engraver::set_spanner_bounds (Spanner *line, bool end) bound = spanners[0]->get_bound (d); else { - bound = unsmob_grob (get_property ("currentMusicalColumn")); + bound = unsmob (get_property ("currentMusicalColumn")); programming_error ("started DynamicLineSpanner but have no left bound"); } @@ -233,6 +227,16 @@ Dynamic_align_engraver::stop_translation_timestep () support_.clear (); } +void +Dynamic_align_engraver::boot () +{ + ADD_ACKNOWLEDGER (Dynamic_align_engraver, dynamic); + ADD_ACKNOWLEDGER (Dynamic_align_engraver, rhythmic_head); + ADD_ACKNOWLEDGER (Dynamic_align_engraver, stem); + ADD_ACKNOWLEDGER (Dynamic_align_engraver, footnote_spanner); + ADD_END_ACKNOWLEDGER (Dynamic_align_engraver, dynamic); +} + ADD_TRANSLATOR (Dynamic_align_engraver, /* doc */ "Align hairpins and dynamic texts on a horizontal line.", diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index a4d4e06f5a..5d4ef33de3 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2008--2012 Han-Wen Nienhuys + Copyright (C) 2008--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,10 +33,10 @@ class Dynamic_engraver : public Engraver { TRANSLATOR_DECLARATIONS (Dynamic_engraver); - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_TRANSLATOR_LISTENER (absolute_dynamic); - DECLARE_TRANSLATOR_LISTENER (span_dynamic); - DECLARE_TRANSLATOR_LISTENER (break_span); + void acknowledge_note_column (Grob_info); + void listen_absolute_dynamic (Stream_event *); + void listen_span_dynamic (Stream_event *); + void listen_break_span (Stream_event *); protected: virtual void process_music (); @@ -69,14 +69,12 @@ Dynamic_engraver::Dynamic_engraver () end_new_spanner_ = false; } -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, absolute_dynamic); void Dynamic_engraver::listen_absolute_dynamic (Stream_event *ev) { ASSIGN_EVENT_ONCE (script_event_, ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, span_dynamic); void Dynamic_engraver::listen_span_dynamic (Stream_event *ev) { @@ -85,7 +83,6 @@ Dynamic_engraver::listen_span_dynamic (Stream_event *ev) ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[d], ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, break_span); void Dynamic_engraver::listen_break_span (Stream_event *event) { @@ -107,7 +104,7 @@ Dynamic_engraver::get_property_setting (Stream_event *evt, char const *ctxprop) { SCM spanner_type = evt->get_property (evprop); - if (spanner_type == SCM_EOL) + if (scm_is_null (spanner_type)) spanner_type = get_property (ctxprop); return spanner_type; } @@ -141,7 +138,7 @@ Dynamic_engraver::process_music () SCM cresc_type = get_property_setting (current_span_event_, "span-type", (start_type + "Spanner").c_str ()); - if (cresc_type == ly_symbol2scm ("text")) + if (scm_is_eq (cresc_type, ly_symbol2scm ("text"))) { current_spanner_ = make_spanner ("DynamicTextSpanner", @@ -156,12 +153,13 @@ Dynamic_engraver::process_music () early: this allows dynamics to be spaced individually instead of being linked together. */ - if (current_spanner_->get_property ("style") == ly_symbol2scm ("none")) + if (scm_is_eq (current_spanner_->get_property ("style"), + ly_symbol2scm ("none"))) current_spanner_->set_property ("spanner-broken", SCM_BOOL_T); } else { - if (cresc_type != ly_symbol2scm ("hairpin")) + if (!scm_is_eq (cresc_type, ly_symbol2scm ("hairpin"))) { string as_string = ly_scm_write_string (cresc_type); current_span_event_ @@ -178,11 +176,11 @@ Dynamic_engraver::process_music () } if (finished_spanner_) { - if (Hairpin::has_interface (finished_spanner_)) + if (has_interface (finished_spanner_)) Pointer_group_interface::add_grob (finished_spanner_, ly_symbol2scm ("adjacent-spanners"), current_spanner_); - if (Hairpin::has_interface (current_spanner_)) + if (has_interface (current_spanner_)) Pointer_group_interface::add_grob (current_spanner_, ly_symbol2scm ("adjacent-spanners"), finished_spanner_); @@ -208,12 +206,12 @@ Dynamic_engraver::stop_translation_timestep () if (finished_spanner_ && !finished_spanner_->get_bound (RIGHT)) finished_spanner_ ->set_bound (RIGHT, - unsmob_grob (get_property ("currentMusicalColumn"))); + unsmob (get_property ("currentMusicalColumn"))); if (current_spanner_ && !current_spanner_->get_bound (LEFT)) current_spanner_ ->set_bound (LEFT, - unsmob_grob (get_property ("currentMusicalColumn"))); + unsmob (get_property ("currentMusicalColumn"))); script_ = 0; script_event_ = 0; accepted_spanevents_drul_.set (0, 0); @@ -244,9 +242,9 @@ Dynamic_engraver::get_spanner_type (Stream_event *ev) string type; SCM start_sym = scm_car (ev->get_property ("class")); - if (start_sym == ly_symbol2scm ("decrescendo-event")) + if (scm_is_eq (start_sym, ly_symbol2scm ("decrescendo-event"))) type = "decrescendo"; - else if (start_sym == ly_symbol2scm ("crescendo-event")) + else if (scm_is_eq (start_sym, ly_symbol2scm ("crescendo-event"))) type = "crescendo"; else programming_error ("unknown dynamic spanner type"); @@ -260,21 +258,15 @@ Dynamic_engraver::acknowledge_note_column (Grob_info info) if (script_ && !script_->get_parent (X_AXIS)) { extract_grob_set (info.grob (), "note-heads", heads); - Grob *stem = unsmob_grob (info.grob ()->get_object ("stem")); /* - Spacing constraints may require dynamics to be aligned on rests, + Spacing constraints may require dynamics to be attached to rests, so check for a rest if this note column has no note heads. */ Grob *x_parent = (heads.size () - ? heads[0] - : unsmob_grob (info.grob ()->get_object ("rest"))); + ? info.grob () + : unsmob (info.grob ()->get_object ("rest"))); if (x_parent) - { - script_->set_parent (x_parent, X_AXIS); - Self_alignment_interface::set_center_parent (script_, X_AXIS); - } - if (stem) - Pointer_group_interface::add_grob (script_, ly_symbol2scm ("potential-X-colliding-grobs"), stem); + script_->set_parent (x_parent, X_AXIS); } if (current_spanner_ && !current_spanner_->get_bound (LEFT)) @@ -283,7 +275,15 @@ Dynamic_engraver::acknowledge_note_column (Grob_info info) finished_spanner_->set_bound (RIGHT, info.grob ()); } -ADD_ACKNOWLEDGER (Dynamic_engraver, note_column); +void +Dynamic_engraver::boot () +{ + ADD_LISTENER (Dynamic_engraver, absolute_dynamic); + ADD_LISTENER (Dynamic_engraver, span_dynamic); + ADD_LISTENER (Dynamic_engraver, break_span); + ADD_ACKNOWLEDGER (Dynamic_engraver, note_column); +} + ADD_TRANSLATOR (Dynamic_engraver, /* doc */ "Create hairpins, dynamic texts and dynamic text spanners.", diff --git a/lily/dynamic-performer.cc b/lily/dynamic-performer.cc index 936060bfc6..5ce67f0463 100644 --- a/lily/dynamic-performer.cc +++ b/lily/dynamic-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,15 +33,14 @@ protected: void process_music (); Real equalize_volume (Real); - DECLARE_TRANSLATOR_LISTENER (decrescendo); - DECLARE_TRANSLATOR_LISTENER (crescendo); - DECLARE_TRANSLATOR_LISTENER (absolute_dynamic); + void listen_decrescendo (Stream_event *); + void listen_crescendo (Stream_event *); + void listen_absolute_dynamic (Stream_event *); private: Stream_event *script_event_; Drul_array span_events_; Drul_array grow_dir_; Real last_volume_; - bool last_volume_initialized_; Audio_dynamic *absolute_; Audio_span_dynamic *span_dynamic_; Audio_span_dynamic *finished_span_dynamic_; @@ -49,8 +48,7 @@ private: Dynamic_performer::Dynamic_performer () { - last_volume_ = 0.0; - last_volume_initialized_ = false; + last_volume_ = -1; script_event_ = 0; absolute_ = 0; span_events_[LEFT] @@ -87,7 +85,7 @@ Dynamic_performer::equalize_volume (Real volume) s = get_property ("instrumentName"); if (!scm_is_string (s)) - s = scm_from_locale_string ("piano"); + s = scm_from_ascii_string ("piano"); SCM eq = get_property ("instrumentEqualizer"); if (ly_is_procedure (eq)) @@ -105,9 +103,10 @@ Dynamic_performer::equalize_volume (Real volume) void Dynamic_performer::process_music () { - if (span_events_[STOP] || script_event_) + if (span_events_[START] || span_events_[STOP] || script_event_) { - // End of a dynamic spanner, or an explicit dynamic script event. + // End the previous spanner when a new one begins or at an explicit stop + // or absolute dynamic. finished_span_dynamic_ = span_dynamic_; span_dynamic_ = 0; } @@ -120,16 +119,6 @@ Dynamic_performer::process_music () announce_element (Audio_element_info (span_dynamic_, span_events_[START])); span_dynamic_->grow_dir_ = grow_dir_[START]; - - if (!last_volume_initialized_ && !script_event_) - { - // No explicit dynamic script events have occurred yet, but there is - // nevertheless a dynamic spanner. Initialize last_volume_ to a - // value within the available range. - span_events_[START]->origin ()->warning (_ ("(De)crescendo with unspecified starting volume in MIDI.")); - last_volume_ = equalize_volume (0.5); - last_volume_initialized_ = true; - } } if (script_event_ @@ -155,20 +144,18 @@ Dynamic_performer::process_music () last_volume_ = absolute_->volume_ = equalize_volume (volume); - last_volume_initialized_ = true; } Audio_element_info info (absolute_, script_event_); announce_element (info); } - if (!last_volume_initialized_) + if (last_volume_ < 0) { absolute_ = new Audio_dynamic (); last_volume_ = absolute_->volume_ = equalize_volume (0.71); // Backward compatible - last_volume_initialized_ = true; Audio_element_info info (absolute_, script_event_); announce_element (info); @@ -190,14 +177,16 @@ Dynamic_performer::stop_translation_timestep () finished_span_dynamic_ = 0; } - if (absolute_ && absolute_->volume_ < 0) + if (absolute_) { - absolute_->volume_ = last_volume_; - } - else if (absolute_) - { - last_volume_ = absolute_->volume_; - last_volume_initialized_ = true; + if (absolute_->volume_ < 0) + { + absolute_->volume_ = last_volume_; + } + else + { + last_volume_ = absolute_->volume_; + } } absolute_ = 0; @@ -206,7 +195,6 @@ Dynamic_performer::stop_translation_timestep () = span_events_[RIGHT] = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_performer, decrescendo); void Dynamic_performer::listen_decrescendo (Stream_event *r) { @@ -215,7 +203,6 @@ Dynamic_performer::listen_decrescendo (Stream_event *r) grow_dir_[d] = SMALLER; } -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_performer, crescendo); void Dynamic_performer::listen_crescendo (Stream_event *r) { @@ -224,7 +211,6 @@ Dynamic_performer::listen_crescendo (Stream_event *r) grow_dir_[d] = BIGGER; } -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_performer, absolute_dynamic); void Dynamic_performer::listen_absolute_dynamic (Stream_event *r) { @@ -232,6 +218,14 @@ Dynamic_performer::listen_absolute_dynamic (Stream_event *r) script_event_ = r; } +void +Dynamic_performer::boot () +{ + ADD_LISTENER (Dynamic_performer, decrescendo); + ADD_LISTENER (Dynamic_performer, crescendo); + ADD_LISTENER (Dynamic_performer, absolute_dynamic); +} + ADD_TRANSLATOR (Dynamic_performer, /* doc */ "", diff --git a/lily/enclosing-bracket.cc b/lily/enclosing-bracket.cc index 8fe1513170..dd551e3841 100644 --- a/lily/enclosing-bracket.cc +++ b/lily/enclosing-bracket.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -26,7 +26,6 @@ struct Enclosing_bracket { - DECLARE_GROB_INTERFACE (); public: DECLARE_SCHEME_CALLBACK (print, (SCM)); @@ -54,7 +53,7 @@ Enclosing_bracket::width (SCM grob) /* UGH. cut & paste code. */ - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); extract_grob_set (me, "elements", elements); if (elements.empty ()) { @@ -82,7 +81,7 @@ MAKE_SCHEME_CALLBACK (Enclosing_bracket, print, 1); SCM Enclosing_bracket::print (SCM grob) { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); extract_grob_set (me, "elements", elements); if (elements.empty ()) { diff --git a/lily/engraver-group.cc b/lily/engraver-group.cc index 738c465a7a..35c14d460d 100644 --- a/lily/engraver-group.cc +++ b/lily/engraver-group.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,62 +20,85 @@ #include "context.hh" #include "dispatcher.hh" #include "engraver-group.hh" +#include "global-context.hh" #include "grob.hh" +#include "grob-properties.hh" #include "paper-score.hh" #include "translator-dispatch-list.hh" #include "warn.hh" -IMPLEMENT_LISTENER (Engraver_group, override); void Engraver_group::override (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); + Stream_event *ev = unsmob (sev); + SCM sym = ev->get_property ("symbol"); + Grob_property_info gpi (context (), sym); - sloppy_general_pushpop_property (context (), - ev->get_property ("symbol"), - ev->get_property ("property-path"), - ev->get_property ("value")); + if (to_boolean (ev->get_property ("once"))) + { + SCM token = gpi.temporary_override (ev->get_property ("property-path"), + ev->get_property ("value")); + if (scm_is_pair (token)) + if (Global_context *g = context ()->get_global_context ()) + { + g->add_finalization (scm_list_4 (ly_context_matched_pop_property_proc, + context ()->self_scm (), + sym, + token)); + } + } + else + gpi.push (ev->get_property ("property-path"), + ev->get_property ("value")); } -IMPLEMENT_LISTENER (Engraver_group, revert); void Engraver_group::revert (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); + Stream_event *ev = unsmob (sev); + SCM sym = ev->get_property ("symbol"); + Grob_property_info gpi (context (), sym); - sloppy_general_pushpop_property (context (), - ev->get_property ("symbol"), - ev->get_property ("property-path"), - SCM_UNDEFINED); + if (to_boolean (ev->get_property ("once"))) + { + SCM token = gpi.temporary_revert (ev->get_property ("property-path")); + if (scm_is_pair (token)) + if (Global_context *g = context ()->get_global_context ()) + { + g->add_finalization (scm_list_4 (ly_context_matched_pop_property_proc, + context ()->self_scm (), + sym, + token)); + } + } + else + gpi.pop (ev->get_property ("property-path")); } void Engraver_group::connect_to_context (Context *c) { Translator_group::connect_to_context (c); - c->event_source ()->add_listener (GET_LISTENER (override), ly_symbol2scm ("Override")); - c->event_source ()->add_listener (GET_LISTENER (revert), ly_symbol2scm ("Revert")); + c->event_source ()->add_listener (GET_LISTENER (Engraver_group, override), ly_symbol2scm ("Override")); + c->event_source ()->add_listener (GET_LISTENER (Engraver_group, revert), ly_symbol2scm ("Revert")); } void Engraver_group::disconnect_from_context () { - context ()->event_source ()->remove_listener (GET_LISTENER (override), ly_symbol2scm ("Override")); - context ()->event_source ()->remove_listener (GET_LISTENER (revert), ly_symbol2scm ("Revert")); + context ()->event_source ()->remove_listener (GET_LISTENER (Engraver_group, override), ly_symbol2scm ("Override")); + context ()->event_source ()->remove_listener (GET_LISTENER (Engraver_group, revert), ly_symbol2scm ("Revert")); Translator_group::disconnect_from_context (); } void -Engraver_group::announce_grob (Grob_info info) +Engraver_group::announce_grob (Grob_info info, Direction dir, + Context *reroute_context) { - announce_infos_.push_back (info); + announce_infos_.push_back (Announce_grob_info (info, dir)); - Context *dad_con = context_->get_parent_context (); - if (info.rerouting_daddy_context_) - { - dad_con = info.rerouting_daddy_context_; - info.rerouting_daddy_context_ = 0; - } + Context *dad_con = reroute_context ? reroute_context + : context_->get_parent_context (); Engraver_group *dad_eng = dad_con @@ -83,7 +106,7 @@ Engraver_group::announce_grob (Grob_info info) : 0; if (dad_eng) - dad_eng->announce_grob (info); + dad_eng->announce_grob (info, dir); } void @@ -93,38 +116,36 @@ Engraver_group::acknowledge_grobs () return; SCM name_sym = ly_symbol2scm ("name"); - SCM meta_sym = ly_symbol2scm ("meta"); for (vsize j = 0; j < announce_infos_.size (); j++) { - Grob_info info = announce_infos_[j]; + Announce_grob_info info = announce_infos_[j]; - SCM meta = info.grob ()->internal_get_property (meta_sym); + SCM meta = info.grob ()->get_property ("meta"); SCM nm = scm_assoc (name_sym, meta); if (scm_is_pair (nm)) nm = scm_cdr (nm); else continue; - SCM acklist = scm_hashq_ref (acknowledge_hash_table_drul_[info.start_end ()], - nm, SCM_BOOL_F); + SCM ackhandle = scm_hashq_create_handle_x (acknowledge_hash_table_drul_[info.start_end ()], + nm, SCM_BOOL_F); - Engraver_dispatch_list *dispatch - = Engraver_dispatch_list::unsmob (acklist); + SCM acklist = scm_cdr (ackhandle); - if (acklist == SCM_BOOL_F) + if (scm_is_false (acklist)) { SCM ifaces = scm_cdr (scm_assoc (ly_symbol2scm ("interfaces"), meta)); acklist = Engraver_dispatch_list::create (get_simple_trans_list (), ifaces, info.start_end ()); - dispatch - = Engraver_dispatch_list::unsmob (acklist); - - scm_hashq_set_x (acknowledge_hash_table_drul_[info.start_end ()], nm, acklist); + scm_set_cdr_x (ackhandle, acklist); } + Engraver_dispatch_list *dispatch + = unsmob (acklist); + if (dispatch) dispatch->apply (info); } @@ -134,21 +155,22 @@ Engraver_group::acknowledge_grobs () Ugh. This is slightly expensive. We could/should cache the value of the group count? */ -int -Engraver_group::pending_grob_count () const +bool +Engraver_group::pending_grobs () const { - int count = announce_infos_.size (); + if (!announce_infos_.empty ()) + return true; for (SCM s = context_->children_contexts (); scm_is_pair (s); s = scm_cdr (s)) { - Context *c = unsmob_context (scm_car (s)); + Context *c = unsmob (scm_car (s)); Engraver_group *group = dynamic_cast (c->implementation ()); - if (group) - count += group->pending_grob_count (); + if (group && group->pending_grobs ()) + return true; } - return count; + return false; } void @@ -162,7 +184,7 @@ Engraver_group::do_announces () for (SCM s = context ()->children_contexts (); scm_is_pair (s); s = scm_cdr (s)) { - Context *c = unsmob_context (scm_car (s)); + Context *c = unsmob (scm_car (s)); Engraver_group *group = dynamic_cast (c->implementation ()); if (group) @@ -179,7 +201,7 @@ Engraver_group::do_announces () announce_infos_.clear (); } } - while (pending_grob_count () > 0); + while (pending_grobs ()); } Engraver_group::Engraver_group () diff --git a/lily/engraver-scheme.cc b/lily/engraver-scheme.cc index 8789171d7e..970aebde55 100644 --- a/lily/engraver-scheme.cc +++ b/lily/engraver-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,13 +27,12 @@ LY_DEFINE (ly_engraver_make_grob, "ly:engraver-make-grob", " @var{cause} should either be another grob" " or a music event.") { - LY_ASSERT_TYPE (unsmob_engraver, engraver, 1); + LY_ASSERT_SMOB (Engraver, engraver, 1); LY_ASSERT_TYPE (ly_is_symbol, grob_name, 2); LY_ASSERT_TYPE (ly_is_grob_cause, cause, 3); - Grob *g = unsmob_engraver (engraver)-> + Grob *g = unsmob (engraver)-> internal_make_grob (grob_name, cause, - ly_symbol2string (grob_name).c_str (), "scheme", 0, "scheme"); return g->self_scm (); } @@ -45,12 +44,12 @@ LY_DEFINE (ly_engraver_announce_end_grob, "ly:engraver-announce-end-grob", " @var{grob} being a grob. @var{cause} should either" " be another grob or a music event.") { - LY_ASSERT_TYPE (unsmob_engraver, engraver, 1); + LY_ASSERT_SMOB (Engraver, engraver, 1); LY_ASSERT_SMOB (Grob, grob, 2); LY_ASSERT_TYPE (ly_is_grob_cause, cause, 3); - unsmob_engraver (engraver)-> - announce_end_grob (unsmob_grob (grob), cause); + unsmob (engraver)-> + announce_end_grob (unsmob (grob), cause); return SCM_UNSPECIFIED; } diff --git a/lily/engraver.cc b/lily/engraver.cc index b8bf1234c0..daf055ccf7 100644 --- a/lily/engraver.cc +++ b/lily/engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #include "engraver.hh" #include "context.hh" +#include "grob-properties.hh" #include "international.hh" #include "music.hh" #include "paper-column.hh" @@ -35,28 +36,27 @@ Engraver::get_daddy_engraver () const } void -Engraver::announce_grob (Grob_info inf) +Engraver::announce_grob (Grob_info inf, Context *reroute_context) { - get_daddy_engraver ()->announce_grob (inf); + get_daddy_engraver ()->announce_grob (inf, START, reroute_context); } void -Engraver::announce_end_grob (Grob_info inf) +Engraver::announce_end_grob (Grob_info inf, Context *reroute_context) { - inf.start_end_ = STOP; - get_daddy_engraver ()->announce_grob (inf); + get_daddy_engraver ()->announce_grob (inf, STOP, reroute_context); } Grob_info Engraver::make_grob_info (Grob *e, SCM cause) { /* TODO: Remove Music code when it's no longer needed */ - if (Music *m = unsmob_music (cause)) + if (Music *m = unsmob (cause)) { cause = m->to_event ()->unprotect (); } - if (e->get_property ("cause") == SCM_EOL - && (unsmob_stream_event (cause) || unsmob_grob (cause))) + if (scm_is_null (e->get_property ("cause")) + && (unsmob (cause) || unsmob (cause))) e->set_property ("cause", cause); return Grob_info (this, e); @@ -85,7 +85,7 @@ Engraver::Engraver () { } -#ifndef NDEBUG +#ifdef DEBUG static SCM creation_callback = SCM_EOL; LY_DEFINE (ly_set_grob_creation_callback, "ly:set-grob-creation-callback", 1, 0, 0, (SCM cb), @@ -106,39 +106,38 @@ LY_DEFINE (ly_set_grob_creation_callback, "ly:set-grob-creation-callback", Grob * Engraver::internal_make_grob (SCM symbol, SCM cause, - char const * /* name */, char const *file, int line, char const *fun) { -#ifdef NDEBUG +#ifndef DEBUG (void)file; (void)line; (void)fun; #endif - SCM props = updated_grob_properties (context (), symbol); + SCM props = Grob_property_info (context (), symbol).updated (); 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")) + if (scm_is_eq (klass, ly_symbol2scm ("Item"))) grob = new Item (props); - else if (klass == ly_symbol2scm ("Spanner")) + else if (scm_is_eq (klass, ly_symbol2scm ("Spanner"))) grob = new Spanner (props); - else if (klass == ly_symbol2scm ("Paper_column")) + else if (scm_is_eq (klass, ly_symbol2scm ("Paper_column"))) grob = new Paper_column (props); assert (grob); announce_grob (grob, cause); -#ifndef NDEBUG +#ifdef DEBUG if (ly_is_procedure (creation_callback)) - scm_apply_0 (creation_callback, - scm_list_n (grob->self_scm (), scm_from_locale_string (file), - scm_from_int (line), scm_from_locale_string (fun), SCM_UNDEFINED)); + scm_call_4 (creation_callback, + grob->self_scm (), scm_from_utf8_string (file), + scm_from_int (line), scm_from_ascii_string (fun)); #endif return grob; @@ -146,55 +145,30 @@ Engraver::internal_make_grob (SCM symbol, Item * Engraver::internal_make_item (SCM x, SCM cause, - char const *name, char const *file, int line, char const *fun) { - Item *it = dynamic_cast (internal_make_grob (x, cause, name, file, line, fun)); + Item *it = dynamic_cast (internal_make_grob (x, cause, file, line, fun)); assert (it); return it; } Paper_column * -Engraver::internal_make_column (SCM x, char const *name, - char const *file, int line, char const *fun) +Engraver::internal_make_column (SCM x, char const *file, int line, char const *fun) { - return dynamic_cast (internal_make_grob (x, SCM_EOL, name, file, line, fun)); + return dynamic_cast (internal_make_grob (x, SCM_EOL, file, line, fun)); } Spanner * -Engraver::internal_make_spanner (SCM x, SCM cause, char const *name, +Engraver::internal_make_spanner (SCM x, SCM cause, char const *file, int line, char const *fun) { - Spanner *sp = dynamic_cast (internal_make_grob (x, cause, name, file, line, fun)); + Spanner *sp = dynamic_cast (internal_make_grob (x, cause, file, line, fun)); assert (sp); return sp; } -Engraver * -unsmob_engraver (SCM eng) -{ - return dynamic_cast (unsmob_translator (eng)); -} - bool ly_is_grob_cause (SCM obj) { - return unsmob_grob (obj) || unsmob_stream_event (obj) || (obj == SCM_EOL); + return unsmob (obj) || unsmob (obj) || scm_is_null (obj); } - -#include "translator.icc" - -ADD_TRANSLATOR (Engraver, - /* doc */ - "Base class for engravers. Does nothing, so it is not used.", - - /* create */ - "", - - /* read */ - "", - - /* write */ - "" - ); - diff --git a/lily/episema-engraver.cc b/lily/episema-engraver.cc index 233de4efbd..d2fc2f398f 100644 --- a/lily/episema-engraver.cc +++ b/lily/episema-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Neil Puttock + Copyright (C) 2010--2015 Neil Puttock LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,9 +33,9 @@ public: TRANSLATOR_DECLARATIONS (Episema_engraver); protected: virtual void finalize (); - DECLARE_TRANSLATOR_LISTENER (episema); - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_ACKNOWLEDGER (note_head); + void listen_episema (Stream_event *); + void acknowledge_note_column (Grob_info); + void acknowledge_note_head (Grob_info); void stop_translation_timestep (); void process_music (); @@ -56,7 +56,6 @@ Episema_engraver::Episema_engraver () event_drul_.set (0, 0); } -IMPLEMENT_TRANSLATOR_LISTENER (Episema_engraver, episema); void Episema_engraver::listen_episema (Stream_event *ev) { @@ -106,7 +105,7 @@ Episema_engraver::typeset_all () { Grob *col = (note_columns_.size () ? note_columns_.back () - : unsmob_grob (get_property ("currentMusicalColumn"))); + : unsmob (get_property ("currentMusicalColumn"))); finished_->set_bound (RIGHT, col); } finished_ = 0; @@ -120,7 +119,7 @@ Episema_engraver::stop_translation_timestep () { Grob *col = (note_columns_.size () ? note_columns_.front () - : unsmob_grob (get_property ("currentMusicalColumn"))); + : unsmob (get_property ("currentMusicalColumn"))); span_->set_bound (LEFT, col); } @@ -161,8 +160,14 @@ Episema_engraver::acknowledge_note_head (Grob_info info) } } -ADD_ACKNOWLEDGER (Episema_engraver, note_column); -ADD_ACKNOWLEDGER (Episema_engraver, note_head); + +void +Episema_engraver::boot () +{ + ADD_LISTENER (Episema_engraver, episema); + ADD_ACKNOWLEDGER (Episema_engraver, note_column); + ADD_ACKNOWLEDGER (Episema_engraver, note_head); +} ADD_TRANSLATOR (Episema_engraver, /* doc */ diff --git a/lily/event-chord-iterator.cc b/lily/event-chord-iterator.cc index cab7b259b0..92b385fe57 100644 --- a/lily/event-chord-iterator.cc +++ b/lily/event-chord-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -46,13 +46,13 @@ Event_chord_iterator::process (Moment m) for (SCM s = get_music ()->get_property ("elements"); scm_is_pair (s); s = scm_cdr (s)) { - Music *mus = unsmob_music (scm_car (s)); + Music *mus = unsmob (scm_car (s)); report_event (mus); } for (SCM s = get_music ()->get_property ("articulations"); scm_is_pair (s); s = scm_cdr (s)) { - Music *mus = unsmob_music (scm_car (s)); + Music *mus = unsmob (scm_car (s)); report_event (mus); } } diff --git a/lily/event-iterator.cc b/lily/event-iterator.cc index c47dea3ecb..71a34abe18 100644 --- a/lily/event-iterator.cc +++ b/lily/event-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/extender-engraver.cc b/lily/extender-engraver.cc index 19e0406279..39fa7788de 100644 --- a/lily/extender-engraver.cc +++ b/lily/extender-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Glen Prideaux , + Copyright (C) 1999--2015 Glen Prideaux , Han-Wen Nienhuys , Jan Nieuwenhuizen @@ -43,9 +43,9 @@ public: TRANSLATOR_DECLARATIONS (Extender_engraver); protected: - DECLARE_TRANSLATOR_LISTENER (extender); - DECLARE_TRANSLATOR_LISTENER (completize_extender); - DECLARE_ACKNOWLEDGER (lyric_syllable); + void listen_extender (Stream_event *); + void listen_completize_extender (Stream_event *); + void acknowledge_lyric_syllable (Grob_info); virtual void finalize (); @@ -60,7 +60,6 @@ Extender_engraver::Extender_engraver () ev_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Extender_engraver, extender); void Extender_engraver::listen_extender (Stream_event *ev) { @@ -73,7 +72,6 @@ Extender_engraver::listen_extender (Stream_event *ev) end before the associated voice (this prevents the right bound being extended to the next note-column if no lyric follows the extender) */ -IMPLEMENT_TRANSLATOR_LISTENER (Extender_engraver, completize_extender); void Extender_engraver::listen_completize_extender (Stream_event * /* ev */) { @@ -112,7 +110,7 @@ Extender_engraver::stop_translation_timestep () if (extender_ || pending_extender_) { Context *voice = get_voice_to_lyrics (context ()); - Grob *h = voice ? get_current_note_head (voice, to_boolean (get_property ("includeGraceNotes"))) : 0; + Grob *h = voice ? get_current_note_head (voice) : 0; if (h) { @@ -180,7 +178,14 @@ Extender_engraver::finalize () } } -ADD_ACKNOWLEDGER (Extender_engraver, lyric_syllable); +void +Extender_engraver::boot () +{ + ADD_LISTENER (Extender_engraver, extender); + ADD_LISTENER (Extender_engraver, completize_extender); + ADD_ACKNOWLEDGER (Extender_engraver, lyric_syllable); +} + ADD_TRANSLATOR (Extender_engraver, /* doc */ "Create lyric extenders.", @@ -189,8 +194,7 @@ ADD_TRANSLATOR (Extender_engraver, "LyricExtender ", /* read */ - "extendersOverRests " - "includeGraceNotes ", + "extendersOverRests ", /* write */ "" diff --git a/lily/figured-bass-continuation.cc b/lily/figured-bass-continuation.cc index bc216a2c4a..bb84bb3c3e 100644 --- a/lily/figured-bass-continuation.cc +++ b/lily/figured-bass-continuation.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -30,7 +30,6 @@ struct Figured_bass_continuation { - DECLARE_GROB_INTERFACE (); public: DECLARE_SCHEME_CALLBACK (print, (SCM)); @@ -41,7 +40,7 @@ MAKE_SCHEME_CALLBACK (Figured_bass_continuation, center_on_figures, 1); SCM Figured_bass_continuation::center_on_figures (SCM grob) { - Spanner *me = dynamic_cast (unsmob_grob (grob)); + Spanner *me = unsmob (grob); extract_grob_set (me, "figures", figures); if (figures.empty ()) return scm_from_double (0.0); @@ -57,7 +56,7 @@ MAKE_SCHEME_CALLBACK (Figured_bass_continuation, print, 1); SCM Figured_bass_continuation::print (SCM grob) { - Spanner *me = dynamic_cast (unsmob_grob (grob)); + Spanner *me = unsmob (grob); Real thick = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")) diff --git a/lily/figured-bass-engraver.cc b/lily/figured-bass-engraver.cc index 2f8004f84c..9785f3fef4 100644 --- a/lily/figured-bass-engraver.cc +++ b/lily/figured-bass-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -122,8 +122,8 @@ protected: Moment stop_moment_; bool have_rest_; - DECLARE_TRANSLATOR_LISTENER (rest); - DECLARE_TRANSLATOR_LISTENER (bass_figure); + void listen_rest (Stream_event *); + void listen_bass_figure (Stream_event *); virtual void derived_mark () const; @@ -180,14 +180,12 @@ Figured_bass_engraver::stop_translation_timestep () clear_spanners (); } -IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, rest); void Figured_bass_engraver::listen_rest (Stream_event *) { have_rest_ = true; } -IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, bass_figure); void Figured_bass_engraver::listen_bass_figure (Stream_event *ev) { @@ -222,11 +220,11 @@ Figured_bass_engraver::center_continuations (vector const &consecutiv left_figs.push_back (consecutive_lines[j]->get_bound (LEFT)); SCM ga = Grob_array::make_array (); - unsmob_grob_array (ga)->set_array (left_figs); + unsmob (ga)->set_array (left_figs); for (vsize j = consecutive_lines.size (); j--;) consecutive_lines[j]->set_object ("figures", - unsmob_grob_array (ga)->smobbed_copy ()); + unsmob (ga)->smobbed_copy ()); } void @@ -407,7 +405,7 @@ void Figured_bass_engraver::create_grobs () { Grob *muscol - = dynamic_cast (unsmob_grob (get_property ("currentMusicalColumn"))); + = unsmob (get_property ("currentMusicalColumn")); if (!alignment_) { alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL); @@ -433,7 +431,7 @@ Figured_bass_engraver::create_grobs () Align_interface::add_element (alignment_, group.group_); } - if (scm_memq (group.number_, get_property ("implicitBassFigures")) != SCM_BOOL_F) + if (scm_is_true (scm_memq (group.number_, get_property ("implicitBassFigures")))) { item->set_property ("transparent", SCM_BOOL_T); item->set_property ("implicit", SCM_BOOL_T); @@ -504,6 +502,13 @@ Figured_bass_engraver::add_brackets () } } +void +Figured_bass_engraver::boot () +{ + ADD_LISTENER (Figured_bass_engraver, rest); + ADD_LISTENER (Figured_bass_engraver, bass_figure); +} + ADD_TRANSLATOR (Figured_bass_engraver, /* doc */ "Make figured bass numbers.", diff --git a/lily/figured-bass-position-engraver.cc b/lily/figured-bass-position-engraver.cc index 9b55e04f49..66fabb1ffb 100644 --- a/lily/figured-bass-position-engraver.cc +++ b/lily/figured-bass-position-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -36,12 +36,12 @@ class Figured_bass_position_engraver : public Engraver vector support_; vector span_support_; protected: - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_ACKNOWLEDGER (slur); - DECLARE_END_ACKNOWLEDGER (slur); - DECLARE_END_ACKNOWLEDGER (tie); - DECLARE_ACKNOWLEDGER (bass_figure_alignment); - DECLARE_END_ACKNOWLEDGER (bass_figure_alignment); + void acknowledge_note_column (Grob_info); + void acknowledge_slur (Grob_info); + void acknowledge_end_slur (Grob_info); + void acknowledge_end_tie (Grob_info); + void acknowledge_bass_figure_alignment (Grob_info); + void acknowledge_end_bass_figure_alignment (Grob_info); virtual void finalize (); void start_spanner (); @@ -138,13 +138,18 @@ Figured_bass_position_engraver::acknowledge_bass_figure_alignment (Grob_info inf start_spanner (); } -ADD_ACKNOWLEDGER (Figured_bass_position_engraver, note_column); -ADD_ACKNOWLEDGER (Figured_bass_position_engraver, slur); -ADD_END_ACKNOWLEDGER (Figured_bass_position_engraver, slur); -ADD_END_ACKNOWLEDGER (Figured_bass_position_engraver, tie); -ADD_ACKNOWLEDGER (Figured_bass_position_engraver, bass_figure_alignment); -ADD_END_ACKNOWLEDGER (Figured_bass_position_engraver, bass_figure_alignment); + +void +Figured_bass_position_engraver::boot () +{ + ADD_ACKNOWLEDGER (Figured_bass_position_engraver, note_column); + ADD_ACKNOWLEDGER (Figured_bass_position_engraver, slur); + ADD_END_ACKNOWLEDGER (Figured_bass_position_engraver, slur); + ADD_END_ACKNOWLEDGER (Figured_bass_position_engraver, tie); + ADD_ACKNOWLEDGER (Figured_bass_position_engraver, bass_figure_alignment); + ADD_END_ACKNOWLEDGER (Figured_bass_position_engraver, bass_figure_alignment); +} ADD_TRANSLATOR (Figured_bass_position_engraver, /* doc */ diff --git a/lily/file-name-map.cc b/lily/file-name-map.cc index b124fda9b1..6266aec3c3 100644 --- a/lily/file-name-map.cc +++ b/lily/file-name-map.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/fingering-column-engraver.cc b/lily/fingering-column-engraver.cc index 1c5b904809..a2a37143b3 100644 --- a/lily/fingering-column-engraver.cc +++ b/lily/fingering-column-engraver.cc @@ -37,7 +37,7 @@ class Fingering_column_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Fingering_column_engraver); protected: - DECLARE_ACKNOWLEDGER (finger); + void acknowledge_finger (Grob_info); void process_acknowledged (); void stop_translation_timestep (); }; @@ -101,7 +101,12 @@ Fingering_column_engraver::process_acknowledged () } } -ADD_ACKNOWLEDGER (Fingering_column_engraver, finger); +void +Fingering_column_engraver::boot () +{ + ADD_ACKNOWLEDGER (Fingering_column_engraver, finger); +} + ADD_TRANSLATOR (Fingering_column_engraver, /* doc */ "Find potentially colliding scripts and put them into a" diff --git a/lily/fingering-column.cc b/lily/fingering-column.cc index 62d7d08db1..c9db28baf9 100644 --- a/lily/fingering-column.cc +++ b/lily/fingering-column.cc @@ -49,7 +49,7 @@ MAKE_SCHEME_CALLBACK (Fingering_column, calc_positioning_done, 1); SCM Fingering_column::calc_positioning_done (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); if (!me->is_live ()) return SCM_BOOL_T; diff --git a/lily/fingering-engraver.cc b/lily/fingering-engraver.cc index 56d7b3257e..8de44e9698 100644 --- a/lily/fingering-engraver.cc +++ b/lily/fingering-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,16 +38,15 @@ public: protected: void stop_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (fingering); - DECLARE_ACKNOWLEDGER (rhythmic_head); - DECLARE_ACKNOWLEDGER (stem); - DECLARE_ACKNOWLEDGER (flag); + void listen_fingering (Stream_event *); + void acknowledge_rhythmic_head (Grob_info); + void acknowledge_stem (Grob_info); + void acknowledge_flag (Grob_info); private: void make_script (Direction, Stream_event *, int); }; -IMPLEMENT_TRANSLATOR_LISTENER (Fingering_engraver, fingering); void Fingering_engraver::listen_fingering (Stream_event *ev) { @@ -101,7 +100,7 @@ Fingering_engraver::make_script (Direction d, Stream_event *r, int i) junkme. */ SCM pitch = r->get_property ("pitch"); - if (unsmob_pitch (pitch)) + if (unsmob (pitch)) fingering->set_property ("pitch", pitch); /* @@ -109,8 +108,7 @@ Fingering_engraver::make_script (Direction d, Stream_event *r, int i) fingerings for chords need different settings. */ Side_position_interface::set_axis (fingering, Y_AXIS); - Self_alignment_interface::set_align_self (fingering, X_AXIS); - Self_alignment_interface::set_center_parent (fingering, X_AXIS); + Self_alignment_interface::set_aligned_on_parent (fingering, X_AXIS); // Hmm int priority = 200; @@ -142,9 +140,15 @@ Fingering_engraver::Fingering_engraver () { } -ADD_ACKNOWLEDGER (Fingering_engraver, rhythmic_head); -ADD_ACKNOWLEDGER (Fingering_engraver, stem); -ADD_ACKNOWLEDGER (Fingering_engraver, flag); + +void +Fingering_engraver::boot () +{ + ADD_LISTENER (Fingering_engraver, fingering); + ADD_ACKNOWLEDGER (Fingering_engraver, rhythmic_head); + ADD_ACKNOWLEDGER (Fingering_engraver, stem); + ADD_ACKNOWLEDGER (Fingering_engraver, flag); +} ADD_TRANSLATOR (Fingering_engraver, /* doc */ diff --git a/lily/flag.cc b/lily/flag.cc index f4fcce8e0e..4b90be8be0 100644 --- a/lily/flag.cc +++ b/lily/flag.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -38,7 +38,6 @@ public: DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM)); DECLARE_SCHEME_CALLBACK (pure_calc_y_offset, (SCM, SCM, SCM)); DECLARE_SCHEME_CALLBACK (calc_x_offset, (SCM)); - DECLARE_GROB_INTERFACE (); static SCM internal_calc_y_offset (SCM smob, bool pure); }; @@ -47,8 +46,8 @@ MAKE_SCHEME_CALLBACK (Flag, width, 1); SCM Flag::width (SCM smob) { - Grob *me = unsmob_grob (smob); - Stencil *sten = unsmob_stencil (me->get_property ("stencil")); + Grob *me = unsmob (smob); + Stencil *sten = unsmob (me->get_property ("stencil")); if (!sten) return ly_interval2scm (Interval (0.0, 0.0)); @@ -67,7 +66,7 @@ MAKE_SCHEME_CALLBACK (Flag, glyph_name, 1); SCM Flag::glyph_name (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Grob *stem = me->get_parent (X_AXIS); Direction d = get_grob_direction (stem); @@ -113,7 +112,7 @@ MAKE_SCHEME_CALLBACK (Flag, print, 1); SCM Flag::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Grob *stem = me->get_parent (X_AXIS); Direction d = get_grob_direction (stem); @@ -179,7 +178,7 @@ Flag::calc_y_offset (SCM smob) SCM Flag::internal_calc_y_offset (SCM smob, bool pure) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Grob *stem = me->get_parent (X_AXIS); Direction d = get_grob_direction (stem); @@ -187,7 +186,7 @@ Flag::internal_calc_y_offset (SCM smob, bool pure) = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter")); Interval stem_extent = pure - ? stem->pure_height (stem, 0, INT_MAX) + ? stem->pure_y_extent (stem, 0, INT_MAX) : stem->extent (stem, Y_AXIS); return scm_from_double (stem_extent.is_empty () @@ -199,7 +198,7 @@ MAKE_SCHEME_CALLBACK (Flag, calc_x_offset, 1); SCM Flag::calc_x_offset (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Grob *stem = me->get_parent (X_AXIS); return scm_from_double (stem->extent (stem, X_AXIS)[RIGHT]); } diff --git a/lily/font-config-scheme.cc b/lily/font-config-scheme.cc index c759ab901c..a2bc3ae5d0 100644 --- a/lily/font-config-scheme.cc +++ b/lily/font-config-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -120,7 +120,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_from_locale_string ((char const *)str); + scm_result = scm_from_utf8_string ((char const *)str); FcPatternDestroy (pat); diff --git a/lily/font-config.cc b/lily/font-config.cc index 641192b12c..74e591254f 100644 --- a/lily/font-config.cc +++ b/lily/font-config.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,23 +38,51 @@ init_fontconfig () debug_output (_ ("Initializing FontConfig...")); /* TODO: Find a way for Fontconfig to update its cache, if needed. */ - font_config_global = FcInitLoadConfig (); + FcInitLoadConfig (); - vector dirs; + /* Create an empty configuration */ + font_config_global = FcConfigCreate (); - /* Extra trailing slash suddenly breaks fontconfig (fc-cache 2.5.0) - on windows. */ - dirs.push_back (lilypond_datadir + "/fonts/otf"); + /* fontconfig conf files */ + vector confs; + + /* LilyPond local fontconfig conf file 00 + This file is loaded *before* fontconfig's default conf. */ + confs.push_back (lilypond_datadir + "/fonts/00-lilypond-fonts.conf"); + + /* fontconfig's default conf file */ + void *default_conf = FcConfigFilename (NULL); + confs.push_back (static_cast(default_conf)); + FcStrFree(static_cast(default_conf)); + + /* LilyPond local fontconfig conf file 99 + This file is loaded *after* fontconfig's default conf. */ + confs.push_back (lilypond_datadir + "/fonts/99-lilypond-fonts.conf"); - for (vsize i = 0; i < dirs.size (); i++) + /* Load fontconfig conf files */ + for (vector::const_iterator it = confs.begin (); + it != confs.end (); + it++) { - string dir = dirs[i]; - if (!FcConfigAppFontAddDir (font_config_global, (FcChar8 *)dir.c_str ())) - error (_f ("failed adding font directory: %s", dir.c_str ())); + if (!FcConfigParseAndLoad (font_config_global, + (FcChar8 *)it->c_str (), + FcFalse)) + error (_f ("failed to add fontconfig configuration file `%s'", + it->c_str ())); else - debug_output (_f ("Adding font directory: %s", dir.c_str ())); + debug_output (_f ("Adding fontconfig configuration file: %s", + it->c_str ())); } + /* Extra trailing slash suddenly breaks fontconfig (fc-cache 2.5.0) + on windows. */ + string dir (lilypond_datadir + "/fonts/otf"); + + if (!FcConfigAppFontAddDir (font_config_global, (FcChar8 *)dir.c_str ())) + error (_f ("failed adding font directory: %s", dir.c_str ())); + else + debug_output (_f ("Adding font directory: %s", dir.c_str ())); + debug_output (_ ("Building font database...")); FcConfigBuildFonts (font_config_global); diff --git a/lily/font-interface.cc b/lily/font-interface.cc index 629077415b..de787fd852 100644 --- a/lily/font-interface.cc +++ b/lily/font-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ Font_metric * Font_interface::get_default_font (Grob *me) { - Font_metric *fm = unsmob_metrics (me->get_property ("font")); + Font_metric *fm = unsmob (me->get_property ("font")); if (!fm) { SCM chain = music_font_alist_chain (me); @@ -45,7 +45,7 @@ Font_interface::music_font_alist_chain (Grob *g) { SCM defaults = g->layout ()->lookup_variable (ly_symbol2scm ("font-defaults")); - if (defaults == SCM_UNDEFINED) + if (SCM_UNBNDP (defaults)) defaults = SCM_EOL; return g->get_property_alist_chain (defaults); } @@ -55,7 +55,7 @@ Font_interface::text_font_alist_chain (Grob *g) { SCM defaults = g->layout ()->lookup_variable (ly_symbol2scm ("text-font-defaults")); - if (defaults == SCM_UNDEFINED) + if (SCM_UNBNDP (defaults)) defaults = SCM_EOL; return g->get_property_alist_chain (defaults); } diff --git a/lily/font-metric-scheme.cc b/lily/font-metric-scheme.cc index 6d225dfeae..0dc41d6876 100644 --- a/lily/font-metric-scheme.cc +++ b/lily/font-metric-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,7 +36,7 @@ LY_DEFINE (ly_font_get_glyph, "ly:font-get-glyph", " to the font encodings @code{fetaMusic} and @code{fetaBraces}," " respectively.") { - Font_metric *fm = unsmob_metrics (font); + Font_metric *fm = unsmob (font); LY_ASSERT_SMOB (Font_metric, font, 1); LY_ASSERT_TYPE (scm_is_string, name, 2); @@ -57,7 +57,7 @@ LY_DEFINE (ly_font_glyph_name_to_index, "ly:font-glyph-name-to-index", " to the font encodings @code{fetaMusic} and @code{fetaBraces}," " respectively.") { - Font_metric *fm = unsmob_metrics (font); + Font_metric *fm = unsmob (font); LY_ASSERT_SMOB (Font_metric, font, 1); LY_ASSERT_TYPE (scm_is_string, name, 2); @@ -75,7 +75,7 @@ LY_DEFINE (ly_font_index_to_charcode, "ly:font-index-to-charcode", " to the font encodings @code{fetaMusic} and @code{fetaBraces}," " respectively.") { - Font_metric *fm = unsmob_metrics (font); + Font_metric *fm = unsmob (font); LY_ASSERT_SMOB (Font_metric, font, 1); LY_ASSERT_TYPE (scm_is_integer, index, 2); @@ -93,7 +93,7 @@ LY_DEFINE (ly_font_glyph_name_to_charcode, "ly:font-glyph-name-to-charcode", " to the font encodings @code{fetaMusic} and @code{fetaBraces}," " respectively.") { - Font_metric *fm = unsmob_metrics (font); + Font_metric *fm = unsmob (font); LY_ASSERT_SMOB (Font_metric, font, 1); LY_ASSERT_TYPE (scm_is_string, name, 2); @@ -111,7 +111,7 @@ LY_DEFINE (ly_font_file_name, "ly:font-file-name", { LY_ASSERT_SMOB (Font_metric, font, 1); - Font_metric *fm = unsmob_metrics (font); + Font_metric *fm = unsmob (font); SCM name = fm->font_file_name (); return name; @@ -124,7 +124,7 @@ LY_DEFINE (ly_font_name, "ly:font-name", " return the corresponding name.") { LY_ASSERT_SMOB (Font_metric, font, 1); - Font_metric *fm = unsmob_metrics (font); + Font_metric *fm = unsmob (font); return ly_string2scm (fm->font_name ()); } @@ -136,7 +136,7 @@ LY_DEFINE (ly_font_magnification, "ly:font-magnification", 1, 0, 0, { LY_ASSERT_SMOB (Font_metric, font, 1); - Font_metric *fm = unsmob_metrics (font); + Font_metric *fm = unsmob (font); return scm_cdr (fm->description_); } @@ -147,7 +147,7 @@ LY_DEFINE (ly_font_design_size, "ly:font-design-size", 1, 0, 0, { LY_ASSERT_SMOB (Font_metric, font, 1); - Font_metric *fm = unsmob_metrics (font); + Font_metric *fm = unsmob (font); return scm_from_double (fm->design_size ()); } diff --git a/lily/font-metric.cc b/lily/font-metric.cc index 892319f3b8..c9daa95f3e 100644 --- a/lily/font-metric.cc +++ b/lily/font-metric.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,7 +29,6 @@ using namespace std; #include "stencil.hh" #include "warn.hh" -#include "ly-smobs.icc" Real Font_metric::design_size () const @@ -60,11 +59,11 @@ Font_metric::find_by_name (string s) const Font_metric::Font_metric () { description_ = SCM_EOL; - self_scm_ = SCM_EOL; smobify_self (); } Font_metric::Font_metric (Font_metric const &) + : Smob () { } @@ -96,28 +95,24 @@ Font_metric::derived_mark () const } SCM -Font_metric::mark_smob (SCM s) +Font_metric::mark_smob () const { - Font_metric *m = (Font_metric *) SCM_CELL_WORD_1 (s); - m->derived_mark (); - return m->description_; + derived_mark (); + return description_; } int -Font_metric::print_smob (SCM s, SCM port, scm_print_state *) +Font_metric::print_smob (SCM port, scm_print_state *) const { - Font_metric *m = unsmob_metrics (s); scm_puts ("#<", port); - scm_puts (m->class_name (), port); + scm_puts (class_name (), port); scm_puts (" ", port); - scm_write (m->description_, port); + scm_write (description_, port); scm_puts (">", port); return 1; } -IMPLEMENT_SMOBS (Font_metric); -IMPLEMENT_DEFAULT_EQUAL_P (Font_metric); -IMPLEMENT_TYPE_P (Font_metric, "ly:font-metric?"); +const char * const Font_metric::type_p_name_ = "ly:font-metric?"; SCM Font_metric::font_file_name () const diff --git a/lily/font-select.cc b/lily/font-select.cc index a633e685f2..5045a8276e 100644 --- a/lily/font-select.cc +++ b/lily/font-select.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Han-Wen Nienhuys + Copyright (C) 2003--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ #include "warn.hh" #include "pango-font.hh" #include "main.hh" +#include "lily-imports.hh" Font_metric * get_font_by_design_size (Output_def *layout, Real requested, @@ -40,9 +41,9 @@ get_font_by_design_size (Output_def *layout, Real requested, { SCM entry = scm_c_vector_ref (font_vector, i); - if (scm_promise_p (entry) == SCM_BOOL_T) + if (to_boolean (scm_promise_p (entry))) { - Font_metric *fm = unsmob_metrics (scm_force (entry)); + Font_metric *fm = unsmob (scm_force (entry)); size = fm->design_size (); } #if HAVE_PANGO_FT2 @@ -86,7 +87,7 @@ get_font_by_design_size (Output_def *layout, Real requested, #endif } else - fm = unsmob_metrics (scm_force (scm_c_vector_ref (font_vector, i))); + fm = unsmob (scm_force (scm_c_vector_ref (font_vector, i))); return find_scaled_font (layout, fm, requested / size); } @@ -103,8 +104,7 @@ get_font_by_mag_step (Output_def *layout, Real requested_step, SCM properties_to_font_size_family (SCM fonts, SCM alist_chain) { - return scm_call_2 (ly_lily_module_constant ("lookup-font"), fonts, - alist_chain); + return Lily::lookup_font (fonts, alist_chain); } Font_metric * diff --git a/lily/font-size-engraver.cc b/lily/font-size-engraver.cc index 03802ac2ce..4dfd24d014 100644 --- a/lily/font-size-engraver.cc +++ b/lily/font-size-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ class Font_size_engraver : public Engraver TRANSLATOR_DECLARATIONS (Font_size_engraver); protected: - DECLARE_ACKNOWLEDGER (font); + void acknowledge_font (Grob_info); void process_music (); Real size; private: @@ -61,7 +61,12 @@ Font_size_engraver::acknowledge_font (Grob_info gi) #include "translator.icc" -ADD_ACKNOWLEDGER (Font_size_engraver, font); +void +Font_size_engraver::boot () +{ + ADD_ACKNOWLEDGER (Font_size_engraver, font); +} + ADD_TRANSLATOR (Font_size_engraver, /* doc */ "Put @code{fontSize} into @code{font-size} grob property.", diff --git a/lily/footnote-engraver.cc b/lily/footnote-engraver.cc index 20ee7c149f..e80d9b64ce 100644 --- a/lily/footnote-engraver.cc +++ b/lily/footnote-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,8 +33,8 @@ class Footnote_engraver : public Engraver { TRANSLATOR_DECLARATIONS (Footnote_engraver); - DECLARE_ACKNOWLEDGER (grob); - DECLARE_END_ACKNOWLEDGER (grob); + void acknowledge_grob (Grob_info); + void acknowledge_end_grob (Grob_info); vector > annotated_spanners_; @@ -63,7 +63,7 @@ Footnote_engraver::footnotify (Grob *g, SCM cause) Spanner *b = make_spanner ("FootnoteSpanner", cause); b->set_parent (s, Y_AXIS); b->set_parent (s, X_AXIS); - Grob *bound = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *bound = unsmob (get_property ("currentMusicalColumn")); b->set_bound (LEFT, bound); annotated_spanners_.push_back (Drul_array (s, b)); } @@ -78,7 +78,7 @@ Footnote_engraver::footnotify (Grob *g, SCM cause) void Footnote_engraver::acknowledge_grob (Grob_info info) { - Music *mus = unsmob_music (info.grob ()->get_property ("footnote-music")); + Music *mus = unsmob (info.grob ()->get_property ("footnote-music")); if (mus) { @@ -107,15 +107,20 @@ Footnote_engraver::acknowledge_end_grob (Grob_info info) { if (annotated_spanners_[i][LEFT] == s) { - Grob *bound = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *bound = unsmob (get_property ("currentMusicalColumn")); annotated_spanners_[i][RIGHT]->set_bound (RIGHT, bound); break; } } } -ADD_ACKNOWLEDGER (Footnote_engraver, grob); -ADD_END_ACKNOWLEDGER (Footnote_engraver, grob); + +void +Footnote_engraver::boot () +{ + ADD_ACKNOWLEDGER (Footnote_engraver, grob); + ADD_END_ACKNOWLEDGER (Footnote_engraver, grob); +} ADD_TRANSLATOR (Footnote_engraver, /* doc */ diff --git a/lily/forbid-break-engraver.cc b/lily/forbid-break-engraver.cc index b1d89ddf24..9cfdef24c8 100644 --- a/lily/forbid-break-engraver.cc +++ b/lily/forbid-break-engraver.cc @@ -46,18 +46,24 @@ Forbid_line_break_engraver::start_translation_timestep () SCM busy = get_property ("busyGrobs"); Moment now = now_mom (); - while (scm_is_pair (busy) && unsmob_moment (scm_caar (busy))->main_part_ == now.main_part_) + while (scm_is_pair (busy) && unsmob (scm_caar (busy))->main_part_ == now.main_part_) busy = scm_cdr (busy); while (scm_is_pair (busy)) { - Grob *g = unsmob_grob (scm_cdar (busy)); + Grob *g = unsmob (scm_cdar (busy)); if (g->internal_has_interface (ly_symbol2scm ("rhythmic-grob-interface"))) context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); busy = scm_cdr (busy); } } +void +Forbid_line_break_engraver::boot () +{ + +} + ADD_TRANSLATOR (Forbid_line_break_engraver, /* doc */ "Forbid line breaks when note heads are still playing at some" diff --git a/lily/freetype-error.cc b/lily/freetype-error.cc index 88af76c1ae..8846b4d041 100644 --- a/lily/freetype-error.cc +++ b/lily/freetype-error.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify diff --git a/lily/freetype.cc b/lily/freetype.cc index 55a3fb3780..03a37e716b 100644 --- a/lily/freetype.cc +++ b/lily/freetype.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -159,32 +159,14 @@ ly_FT_get_glyph_outline (FT_Face const &face, size_t signed_idx) Real y1 = outline->points[j].y; Real y2 = outline->points[j + 1].y; - Real qx2 = x0 + x2 - (2 * x1); - Real qx1 = (2 * x1) - (2 * x0); - Real qx0 = x0; - - Real qy2 = y0 + y2 - (2 * y1); - Real qy1 = (2 * y1) - (2 * y0); - Real qy0 = y0; - - Real cx0 = qx0; - Real cx1 = qx0 + (qx1 / 3); - Real cx2 = qx0 + (2 * qx1 / 3) + (qx2 / 3); - Real cx3 = qx0 + qx1 + qx2; - - Real cy0 = qy0; - Real cy1 = qy0 + (qy1 / 3); - Real cy2 = qy0 + (2 * qy1 / 3) + (qy2 / 3); - Real cy3 = qy0 + qy1 + qy2; - - out = scm_cons (scm_list_n (scm_from_double (cx0), - scm_from_double (cy0), - scm_from_double (cx1), - scm_from_double (cy1), - scm_from_double (cx2), - scm_from_double (cy2), - scm_from_double (cx3), - scm_from_double (cy3), + out = scm_cons (scm_list_n (scm_from_double (x0), + scm_from_double (y0), + scm_from_double ((x0 + 2*x1)/3), + scm_from_double ((y0 + 2*y1)/3), + scm_from_double ((2*x1 + x2)/3), + scm_from_double ((2*y1 + y2)/3), + scm_from_double (x2), + scm_from_double (y2), SCM_UNDEFINED), out); lastpos = Offset (outline->points[j + 1].x, outline->points[j + 1].y); diff --git a/lily/fretboard-engraver.cc b/lily/fretboard-engraver.cc index 4530642144..18843fc87c 100644 --- a/lily/fretboard-engraver.cc +++ b/lily/fretboard-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,9 +48,9 @@ protected: void stop_translation_timestep (); void process_music (); virtual void derived_mark () const; - DECLARE_TRANSLATOR_LISTENER (note); - DECLARE_TRANSLATOR_LISTENER (string_number); - DECLARE_TRANSLATOR_LISTENER (fingering); + void listen_note (Stream_event *); + void listen_string_number (Stream_event *); + void listen_fingering (Stream_event *); private: SCM last_placements_; @@ -68,21 +68,18 @@ Fretboard_engraver::Fretboard_engraver () last_placements_ = SCM_BOOL_F; } -IMPLEMENT_TRANSLATOR_LISTENER (Fretboard_engraver, note); void Fretboard_engraver::listen_note (Stream_event *ev) { note_events_.push_back (ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Fretboard_engraver, string_number); void Fretboard_engraver::listen_string_number (Stream_event *ev) { tabstring_events_.push_back (ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Fretboard_engraver, fingering); void Fretboard_engraver::listen_fingering (Stream_event *ev) { @@ -128,6 +125,14 @@ Fretboard_engraver::stop_translation_timestep () fingering_events_.clear (); } +void +Fretboard_engraver::boot () +{ + ADD_LISTENER (Fretboard_engraver, note); + ADD_LISTENER (Fretboard_engraver, string_number); + ADD_LISTENER (Fretboard_engraver, fingering); +} + ADD_TRANSLATOR (Fretboard_engraver, /* doc */ "Generate fret diagram from one or more events of type" diff --git a/lily/function-documentation.cc b/lily/function-documentation.cc index ec23557333..756f174512 100644 --- a/lily/function-documentation.cc +++ b/lily/function-documentation.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,12 +18,25 @@ */ #include +#include using namespace std; #include "std-string.hh" #include "lily-guile.hh" #include "warn.hh" +/* type predicates. */ +#include "global-context.hh" +#include "input.hh" +#include "item.hh" +#include "music.hh" +#include "music-function.hh" +#include "paper-score.hh" +#include "performance.hh" +#include "spanner.hh" +#include "stream-event.hh" +#include "unpure-pure-container.hh" + static SCM doc_hash_table; void @@ -64,8 +77,6 @@ LY_DEFINE (ly_get_all_function_documentation, "ly:get-all-function-documentation return doc_hash_table; } -#include - map type_names; void @@ -87,32 +98,15 @@ predicate_to_typename (void *ptr) return type_names[ptr]; } -/* type predicates. */ -#include "global-context.hh" -#include "input.hh" -#include "item.hh" -#include "music.hh" -#include "music-function.hh" -#include "paper-score.hh" -#include "performance.hh" -#include "spanner.hh" -#include "stream-event.hh" -#include "unpure-pure-container.hh" - void init_func_doc () { ly_add_type_predicate ((void *) &is_direction, "direction"); - ly_add_type_predicate ((void *) &is_music_function, "Music_function"); ly_add_type_predicate ((void *) &ly_is_port, "port"); ly_add_type_predicate ((void *) &ly_cheap_is_list, "list"); - ly_add_type_predicate ((void *) &unsmob_global_context, "Global_context"); - ly_add_type_predicate ((void *) &unsmob_input, "Input"); - ly_add_type_predicate ((void *) &unsmob_moment, "Moment"); - ly_add_type_predicate ((void *) &unsmob_paper_score, "Paper_score"); - ly_add_type_predicate ((void *) &unsmob_performance, "Performance"); - ly_add_type_predicate ((void *) &is_unpure_pure_container, "unpure pure container"); - + ly_add_type_predicate ((void *) &unsmob, "Global_context"); + ly_add_type_predicate ((void *) &unsmob, "Paper_score"); + ly_add_type_predicate ((void *) &unsmob, "Performance"); ly_add_type_predicate ((void *) &is_axis, "axis"); ly_add_type_predicate ((void *) &is_number_pair, "number pair"); ly_add_type_predicate ((void *) &ly_is_list, "list"); @@ -125,10 +119,10 @@ init_func_doc () ly_add_type_predicate ((void *) &scm_is_rational, "rational"); ly_add_type_predicate ((void *) &scm_is_string, "string"); ly_add_type_predicate ((void *) &scm_is_vector, "vector"); - ly_add_type_predicate ((void *) &unsmob_item, "Item"); - ly_add_type_predicate ((void *) &unsmob_music, "Music"); - ly_add_type_predicate ((void *) &unsmob_spanner, "Spanner"); - ly_add_type_predicate ((void *) &unsmob_stream_event, "Stream_event"); + ly_add_type_predicate ((void *) &unsmob, "Item"); + ly_add_type_predicate ((void *) &unsmob, "Music"); + ly_add_type_predicate ((void *) &unsmob, "Spanner"); + ly_add_type_predicate ((void *) &unsmob, "Stream_event"); } ADD_SCM_INIT_FUNC (func_doc, init_func_doc); diff --git a/lily/general-scheme.cc b/lily/general-scheme.cc index f2b3ff1ae5..1168ee9473 100644 --- a/lily/general-scheme.cc +++ b/lily/general-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -89,14 +89,14 @@ LY_DEFINE (ly_gulp_file, "ly:gulp-file", { LY_ASSERT_TYPE (scm_is_string, name, 1); int sz = INT_MAX; - if (size != SCM_UNDEFINED) + if (!SCM_UNBNDP (size)) { LY_ASSERT_TYPE (scm_is_number, size, 2); sz = scm_to_int (size); } string contents = gulp_file_to_string (ly_scm2string (name), true, sz); - return scm_from_locale_stringn (contents.c_str (), contents.length ()); + return scm_from_latin1_stringn (contents.c_str (), contents.length ()); } LY_DEFINE (ly_dir_p, "ly:dir?", @@ -128,10 +128,10 @@ LY_DEFINE (ly_assoc_get, "ly:assoc-get", if (scm_is_pair (handle)) return scm_cdr (handle); - if (default_value == SCM_UNDEFINED) + if (SCM_UNBNDP (default_value)) default_value = SCM_BOOL_F; - if (strict_checking == SCM_BOOL_T) + if (to_boolean (strict_checking)) { string key_string = ly_scm2string (scm_object_to_string (key, SCM_UNDEFINED)); @@ -223,7 +223,7 @@ LY_DEFINE (ly_number_2_string, "ly:number->string", char str[400]; // ugh. - if (scm_exact_p (s) == SCM_BOOL_F) + if (scm_is_false (scm_exact_p (s))) { Real r (scm_to_double (s)); if (isinf (r) || isnan (r)) @@ -239,7 +239,7 @@ LY_DEFINE (ly_number_2_string, "ly:number->string", else snprintf (str, sizeof (str), "%d", int (scm_to_int (s))); - return scm_from_locale_string (str); + return scm_from_ascii_string (str); } LY_DEFINE (ly_version, "ly:version", 0, 0, 0, (), @@ -254,7 +254,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_from_locale_string (INTERNAL_UNIT); + return scm_from_ascii_string (INTERNAL_UNIT); } LY_DEFINE (ly_dimension_p, "ly:dimension?", 1, 0, 0, (SCM d), @@ -271,7 +271,12 @@ LY_DEFINE (ly_protects, "ly:protects", 0, 0, 0, (), "Return hash of protected objects.") { + //scm_protects is available only in Guile versions before 2.1. +#if SCM_MAJOR_VERSION < 2 || SCM_MAJOR_VERSION == 2 && SCM_MINOR_VERSION < 1 return scm_protects; +#else + return programming_error ("ly:protects is not supported in Guile 2.1"); +#endif } LY_DEFINE (ly_gettext, "ly:gettext", @@ -297,6 +302,14 @@ LY_DEFINE (ly_output_formats, "ly:output-formats", return lst; } +LY_DEFINE (ly_bigpdfs, "ly:bigpdfs", + 0, 0, 0, (), + "Return true if the command line includes the @option{--bigpdf} parameter." +) +{ + return bigpdfs ? SCM_BOOL_T : SCM_BOOL_F; +} + LY_DEFINE (ly_wide_char_2_utf_8, "ly:wide-char->utf-8", 1, 0, 0, (SCM wc), "Encode the Unicode codepoint @var{wc}, an integer, as UTF-8.") @@ -329,7 +342,7 @@ LY_DEFINE (ly_wide_char_2_utf_8, "ly:wide-char->utf-8", } *p = 0; - return scm_from_locale_string (buf); + return scm_from_utf8_string (buf); } LY_DEFINE (ly_effective_prefix, "ly:effective-prefix", @@ -355,7 +368,7 @@ LY_DEFINE (ly_chain_assoc_get, "ly:chain-assoc-get", return ly_chain_assoc_get (key, scm_cdr (achain), default_value); } - if (strict_checking == SCM_BOOL_T) + if (to_boolean (strict_checking)) { string key_string = ly_scm2string (scm_object_to_string (key, SCM_UNDEFINED)); @@ -368,7 +381,7 @@ LY_DEFINE (ly_chain_assoc_get, "ly:chain-assoc-get", + default_value_string + "'."); } - return default_value == SCM_UNDEFINED ? SCM_BOOL_F : default_value; + return SCM_UNBNDP (default_value) ? SCM_BOOL_F : default_value; } LY_DEFINE (ly_stderr_redirect, "ly:stderr-redirect", @@ -458,7 +471,7 @@ LY_DEFINE (ly_truncate_list_x, "ly:truncate-list!", string format_single_argument (SCM arg, int precision, bool escape = false) { - if (scm_is_integer (arg) && scm_exact_p (arg) == SCM_BOOL_T) + if (scm_is_integer (arg) && scm_is_true (scm_exact_p (arg))) return (String_convert::int_string (scm_to_int (arg))); else if (scm_is_number (arg)) { @@ -493,7 +506,7 @@ format_single_argument (SCM arg, int precision, bool escape = false) return (ly_symbol2string (arg)); else { - ly_progress (scm_from_locale_string ("\nUnsupported SCM value for format: ~a"), + ly_progress (scm_from_ascii_string ("\nUnsupported SCM value for format: ~a"), scm_list_1 (arg)); } @@ -557,11 +570,11 @@ LY_DEFINE (ly_format, "ly:format", 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) + if (!scm_is_null (scm_cdr (s))) results.push_back (" "); } - if (s != SCM_EOL) + if (!scm_is_null (s)) results.push_back (format_single_argument (s, precision)); } @@ -582,7 +595,9 @@ LY_DEFINE (ly_format, "ly:format", char *ptr = result; for (vsize i = 0; i < results.size (); i++) { - strncpy (ptr, results[i].c_str (), results[i].size ()); + // strcpy and strncpy cannot be used here + // because std::string may contain '\0' in its contents. + results[i].copy (ptr, results[i].size ()); ptr += results[i].size (); } *ptr = '\0'; @@ -605,7 +620,8 @@ ly_run_command (char *argv[], char **standard_output, char **standard_error) standard_output, standard_error, &exit_status, &error)) { - fprintf (stderr, "failed (%d): %s: %s\n", exit_status, argv[0], error->message); + warning (_f ("g_spawn_sync failed (%d): %s: %s", + exit_status, argv[0], error->message)); g_error_free (error); if (!exit_status) exit_status = -1; @@ -646,8 +662,14 @@ LY_DEFINE (ly_spawn, "ly:spawn", // Always get the pointer to the stdout/stderr messages int exit_status = ly_run_command (argv, &standard_output, &standard_error); - // Print out stdout and stderr only in debug mode - debug_output (string ("\n") + standard_output + standard_error, true); + if (standard_output && standard_error) + { + // Print out stdout and stderr only in debug mode + debug_output (string ("\n") + standard_output + standard_error, true); + } + + g_free (standard_error); + g_free (standard_output); for (int i = 0; i < n; i++) free (argv[i]); diff --git a/lily/glissando-engraver.cc b/lily/glissando-engraver.cc index 711bb1df81..878e7f88b3 100644 --- a/lily/glissando-engraver.cc +++ b/lily/glissando-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,8 +35,8 @@ public: TRANSLATOR_DECLARATIONS (Glissando_engraver); protected: - DECLARE_TRANSLATOR_LISTENER (glissando); - DECLARE_ACKNOWLEDGER (note_column); + void listen_glissando (Stream_event *); + void acknowledge_note_column (Grob_info); virtual void finalize (); void stop_translation_timestep (); @@ -60,7 +60,6 @@ Glissando_engraver::Glissando_engraver () stop_glissandi_ = false; } -IMPLEMENT_TRANSLATOR_LISTENER (Glissando_engraver, glissando); void Glissando_engraver::listen_glissando (Stream_event *ev) { @@ -110,7 +109,7 @@ Glissando_engraver::acknowledge_note_column (Grob_info info) { extract_grob_set (g, "note-heads", note_heads); SCM map = get_property ("glissandoMap"); - if (map == SCM_EOL) + if (scm_is_null (map)) for (vsize i = 0; i < note_heads.size (); i++) { note_column_1.push_back (i); @@ -170,7 +169,13 @@ Glissando_engraver::finalize () kill_me_[i]->suicide (); } -ADD_ACKNOWLEDGER (Glissando_engraver, note_column); +void +Glissando_engraver::boot () +{ + ADD_LISTENER (Glissando_engraver, glissando); + ADD_ACKNOWLEDGER (Glissando_engraver, note_column); +} + ADD_TRANSLATOR (Glissando_engraver, /* doc */ "Engrave glissandi.", diff --git a/lily/global-context-scheme.cc b/lily/global-context-scheme.cc index 86ee2b05b9..ea100c912a 100644 --- a/lily/global-context-scheme.cc +++ b/lily/global-context-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,14 +34,14 @@ LY_DEFINE (ly_format_output, "ly:format-output", " process it and return the @code{Music_output} object" " in its final state.") { - Global_context *g = dynamic_cast (unsmob_context (context)); + Global_context *g = unsmob (context); - LY_ASSERT_TYPE (unsmob_global_context, context, 1); + LY_ASSERT_SMOB (Global_context, context, 1); SCM output = g->get_output (); progress_indication ("\n"); - if (Music_output *od = unsmob_music_output (output)) + if (Music_output *od = unsmob (output)) od->process (); return output; @@ -52,8 +52,8 @@ LY_DEFINE (ly_make_global_translator, "ly:make-global-translator", "Create a translator group and connect it to the global context" " @var{global}. The translator group is returned.") { - Global_context *g = dynamic_cast (unsmob_context (global)); - LY_ASSERT_TYPE (unsmob_global_context, global, 1); + Global_context *g = unsmob (global); + LY_ASSERT_SMOB (Global_context, global, 1); Translator_group *tg = new Translator_group (); tg->connect_to_context (g); @@ -68,7 +68,7 @@ LY_DEFINE (ly_make_global_context, "ly:make-global-context", " block @var{output-def}. The context is returned.") { LY_ASSERT_SMOB (Output_def, output_def, 1); - Output_def *odef = unsmob_output_def (output_def); + Output_def *odef = unsmob (output_def); Global_context *glob = new Global_context (odef); @@ -87,23 +87,23 @@ LY_DEFINE (ly_interpret_music_expression, "ly:interpret-music-expression", " @var{ctx}. The context is returned in its final state.") { LY_ASSERT_SMOB (Music, mus, 1); - LY_ASSERT_TYPE (unsmob_global_context, ctx, 2); + LY_ASSERT_SMOB (Global_context, ctx, 2); - Music *music = unsmob_music (mus); + Music *music = unsmob (mus); if (!music) { warning (_ ("no music found in score")); return SCM_BOOL_F; } - Global_context *g = dynamic_cast (unsmob_context (ctx)); + Global_context *g = unsmob (ctx); Cpu_timer timer; message (_ ("Interpreting music...")); SCM protected_iter = Music_iterator::get_static_get_iterator (music); - Music_iterator *iter = unsmob_iterator (protected_iter); + Music_iterator *iter = unsmob (protected_iter); iter->init_context (music, g); iter->construct_children (); diff --git a/lily/global-context.cc b/lily/global-context.cc index 3fa5089e80..c21deb3b9b 100644 --- a/lily/global-context.cc +++ b/lily/global-context.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,13 +40,13 @@ Global_context::Global_context (Output_def *o) prev_mom_.set_infinite (-1); /* We only need the most basic stuff to bootstrap the context tree */ - event_source ()->add_listener (GET_LISTENER (create_context_from_event), + event_source ()->add_listener (GET_LISTENER (Context, create_context_from_event), ly_symbol2scm ("CreateContext")); - event_source ()->add_listener (GET_LISTENER (prepare), + event_source ()->add_listener (GET_LISTENER (Global_context, prepare), ly_symbol2scm ("Prepare")); events_below ()->register_as_listener (event_source_); - Context_def *globaldef = unsmob_context_def (definition_); + Context_def *globaldef = unsmob (definition_); if (!globaldef) programming_error ("no `Global' context found"); else @@ -88,12 +88,11 @@ Global_context::get_moments_left () const return extra_mom_pq_.size (); } -IMPLEMENT_LISTENER (Global_context, prepare); void Global_context::prepare (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); - Moment *mom = unsmob_moment (ev->get_property ("moment")); + Stream_event *ev = unsmob (sev); + Moment *mom = unsmob (ev->get_property ("moment")); assert (mom); @@ -114,7 +113,7 @@ Context * Global_context::get_score_context () const { return (scm_is_pair (context_list_)) - ? unsmob_context (scm_car (context_list_)) + ? unsmob (scm_car (context_list_)) : 0; } @@ -181,9 +180,7 @@ Global_context::apply_finalizations () SCM lst = get_property ("finalizations"); set_property ("finalizations", SCM_EOL); for (SCM s = lst; scm_is_pair (s); s = scm_cdr (s)) - - /* TODO: make safe. */ - scm_primitive_eval (scm_car (s)); + scm_apply_0 (scm_caar (s), scm_cdar (s)); } /* Add a function to execute before stepping to the next time step. */ @@ -209,9 +206,3 @@ Global_context::get_default_interpreter (const string &/* context_id */) else return Context::get_default_interpreter (); } - -Global_context * -unsmob_global_context (SCM x) -{ - return dynamic_cast (unsmob_context (x)); -} diff --git a/lily/global-ctor.cc b/lily/global-ctor.cc index 80ae93e361..908a611e0c 100644 --- a/lily/global-ctor.cc +++ b/lily/global-ctor.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/global-vars.cc b/lily/global-vars.cc index f12e957d5e..dce813691a 100644 --- a/lily/global-vars.cc +++ b/lily/global-vars.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,6 +33,9 @@ string init_name_global; /* Output formats to generate. */ string output_format_global = ""; +/* Generate big pdfs */ +bool bigpdfs = false; + /* Current output name. */ string output_name_global; diff --git a/lily/grace-engraver.cc b/lily/grace-engraver.cc index 1ebc6c9a74..57ccb1e0fa 100644 --- a/lily/grace-engraver.cc +++ b/lily/grace-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,20 +19,26 @@ #include "engraver.hh" #include "context.hh" +#include "dispatcher.hh" +#include "listener.hh" #include "warn.hh" +#include "grob-properties.hh" +#include "stream-event.hh" +#include "translator.icc" class Grace_engraver : public Engraver { + Moment last_moment_; + SCM grace_settings_; void consider_change_grace_settings (); protected: - void start_translation_timestep (); virtual void derived_mark () const; - virtual void initialize (); + virtual void process_music (); + virtual void start_translation_timestep (); + virtual void finalize (); TRANSLATOR_DECLARATIONS (Grace_engraver); - Moment last_moment_; - SCM grace_settings_; -public: + void grace_change (SCM); }; Grace_engraver::Grace_engraver () @@ -41,32 +47,64 @@ Grace_engraver::Grace_engraver () last_moment_ = Moment (Rational (-1, 1)); } +// The iterator should usually come before process_music void -Grace_engraver::initialize () +Grace_engraver::grace_change (SCM) { consider_change_grace_settings (); } +// if we are in grace time already on initialization, it is unlikely +// that we'll receive a GraceChange event from the grace iterator yet, +// so we want to start into grace mode anyway. The downside is that +// this will get us confused when given something like +// +// \new Voice { \oneVoice \grace { c''8 8 } g'1 } +// +// where \grace executes its actions already before \oneVoice, causing +// different stem directions. + +void +Grace_engraver::start_translation_timestep () +{ + // Only on startup + if (last_moment_ == Rational (-1)) + consider_change_grace_settings (); +} + +// If the grace iterator has moved off to some other context, we might +// not get to see the ChangeContext event. In that case, we still +// want to change into or out of grace mode settings as appropriate + +void +Grace_engraver::process_music () +{ + // We may have lost connection to the iterator in which case we + // still need to call consider_change_grace_settings in particular + // in order to get out of grace mode again + if (last_moment_ != now_mom ()) + consider_change_grace_settings (); +} + void Grace_engraver::consider_change_grace_settings () { Moment now = now_mom (); - if (last_moment_.grace_part_ && !now.grace_part_) + + if (!now.grace_part_) { for (SCM s = grace_settings_; scm_is_pair (s); s = scm_cdr (s)) { - SCM context = scm_caar (s); - SCM entry = scm_cdar (s); - SCM grob = scm_cadr (entry); - SCM sym = scm_caddr (entry); + SCM elt = scm_car (s); + SCM context = scm_car (elt); + SCM grob = scm_cadr (elt); + SCM cell = scm_cddr (elt); - execute_pushpop_property (unsmob_context (context), - grob, sym, SCM_UNDEFINED); + Grob_property_info (unsmob (context), grob).matched_pop (cell); } - grace_settings_ = SCM_EOL; } - else if (!last_moment_.grace_part_ && now.grace_part_) + else if (!last_moment_.grace_part_) { SCM settings = get_property ("graceSettings"); @@ -79,24 +117,37 @@ Grace_engraver::consider_change_grace_settings () SCM sym = scm_caddr (entry); SCM val = scm_cadr (scm_cddr (entry)); - Context *c = context (); - while (c && !c->is_alias (context_name)) - c = c->get_parent_context (); + if (!scm_is_pair (sym)) + sym = scm_list_1 (sym); + Context *c = find_context_above (context (), context_name); if (c) { - execute_pushpop_property (c, - grob, sym, val); + SCM cell = Grob_property_info (c, grob).push (sym, val); grace_settings_ - = scm_cons (scm_cons (c->self_scm (), entry), grace_settings_); + = scm_cons (scm_cons2 (c->self_scm (), grob, cell), grace_settings_); } else programming_error ("cannot find context from graceSettings: " + ly_symbol2string (context_name)); } } + if (last_moment_ == Rational (-1)) + { + Dispatcher *d = context ()->event_source (); + d->add_listener (GET_LISTENER (Grace_engraver, grace_change), ly_symbol2scm ("GraceChange")); + } + last_moment_ = now; +} - last_moment_ = now_mom (); +void +Grace_engraver::finalize () +{ + if (last_moment_ != Rational (-1)) + { + Dispatcher *d = context ()->event_source (); + d->remove_listener (GET_LISTENER (Grace_engraver, grace_change), ly_symbol2scm ("GraceChange")); + } } void @@ -107,12 +158,10 @@ Grace_engraver::derived_mark () const } void -Grace_engraver::start_translation_timestep () +Grace_engraver::boot () { - consider_change_grace_settings (); -} -#include "translator.icc" +} ADD_TRANSLATOR (Grace_engraver, /* doc */ diff --git a/lily/grace-iterator.cc b/lily/grace-iterator.cc index 5d95fef2e7..daaaf855bf 100644 --- a/lily/grace-iterator.cc +++ b/lily/grace-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,13 +19,22 @@ #include "grace-iterator.hh" #include "global-context.hh" -#include "warn.hh" +#include "music.hh" void Grace_iterator::process (Moment m) { Moment main; main.main_part_ = -start_mom_.grace_part_ + m.grace_part_; + + // GraceChange is announced in order to make the Grace_engraver able + // to distinguish \stemNeutral \grace { ... and \grace { \stemNeutral ... + if (in_grace_ != bool (m.grace_part_) && child_iter_ && child_iter_->get_outlet ()) + { + send_stream_event (child_iter_->get_outlet (), "GraceChange", get_music ()->origin (), 0); + } + in_grace_ = m.grace_part_; + Music_wrapper_iterator::process (main); /* We can safely do this, since \grace should always be inside diff --git a/lily/grace-music.cc b/lily/grace-music.cc index b24593aece..8337a0b7f5 100644 --- a/lily/grace-music.cc +++ b/lily/grace-music.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,7 @@ MAKE_SCHEME_CALLBACK (Grace_music, start_callback, 1); SCM Grace_music::start_callback (SCM m) { - Moment *l = unsmob_moment (Music_wrapper::length_callback (m)); + Moment *l = unsmob (Music_wrapper::length_callback (m)); Moment gl; gl.grace_part_ = -(l->main_part_ + l->grace_part_); return gl.smobbed_copy (); diff --git a/lily/grace-spacing-engraver.cc b/lily/grace-spacing-engraver.cc index fce1f161d0..445d2b0f81 100644 --- a/lily/grace-spacing-engraver.cc +++ b/lily/grace-spacing-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen + Copyright (C) 2006--2015 Han-Wen LilyPond is free software: you can redistribute it and/or modify @@ -54,7 +54,7 @@ Grace_spacing_engraver::process_music () if (grace_spacing_ && (now.grace_part_ || last_moment_.grace_part_)) { - Grob *column = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *column = unsmob (get_property ("currentMusicalColumn")); Pointer_group_interface::add_grob (grace_spacing_, ly_symbol2scm ("columns"), column); @@ -77,6 +77,12 @@ Grace_spacing_engraver::stop_translation_timestep () grace_spacing_ = 0; } +void +Grace_spacing_engraver::boot () +{ + +} + ADD_TRANSLATOR (Grace_spacing_engraver, "Bookkeeping of shortest starting and playing notes in grace" " note runs.", diff --git a/lily/gregorian-ligature-engraver.cc b/lily/gregorian-ligature-engraver.cc index bfc7bfd883..4e4fc135c4 100644 --- a/lily/gregorian-ligature-engraver.cc +++ b/lily/gregorian-ligature-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Juergen Reuter + Copyright (C) 2003--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -215,7 +215,7 @@ provide_context_info (vector const &primitives) Grob *primitive = primitives[i].grob (); Stream_event *event_cause = primitives[i].event_cause (); int context_info = 0; - int pitch = unsmob_pitch (event_cause->get_property ("pitch"))->steps (); + int pitch = unsmob (event_cause->get_property ("pitch"))->steps (); int prefix_set = scm_to_int (primitive->get_property ("prefix-set")); if (prefix_set & PES_OR_FLEXA) diff --git a/lily/gregorian-ligature.cc b/lily/gregorian-ligature.cc index a0f54ed162..6fbbd0927b 100644 --- a/lily/gregorian-ligature.cc +++ b/lily/gregorian-ligature.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Han-Wen Nienhuys + Copyright (C) 2003--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/grid-line-interface.cc b/lily/grid-line-interface.cc index 52c11a4a3a..8fb2690caa 100644 --- a/lily/grid-line-interface.cc +++ b/lily/grid-line-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ MAKE_SCHEME_CALLBACK (Grid_line_interface, print, 1); SCM Grid_line_interface::print (SCM smobbed_me) { - Grob *me = unsmob_grob (smobbed_me); + Grob *me = unsmob (smobbed_me); extract_grob_set (me, "elements", elts); /* compute common refpoint of elements */ @@ -63,7 +63,7 @@ MAKE_SCHEME_CALLBACK (Grid_line_interface, width, 1); SCM Grid_line_interface::width (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real staffline = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); Real thick = robust_scm2double (me->get_property ("thickness"), 1.0) diff --git a/lily/grid-line-span-engraver.cc b/lily/grid-line-span-engraver.cc index 43425b6f46..efecf67622 100644 --- a/lily/grid-line-span-engraver.cc +++ b/lily/grid-line-span-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,6 +21,8 @@ #include "item.hh" #include "grid-line-interface.hh" +#include "translator.icc" + class Grid_line_span_engraver : public Engraver { Item *spanline_; @@ -29,7 +31,7 @@ class Grid_line_span_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Grid_line_span_engraver); protected: - DECLARE_ACKNOWLEDGER (grid_point); + void acknowledge_grid_point (Grob_info); void stop_translation_timestep (); }; @@ -68,8 +70,12 @@ Grid_line_span_engraver::stop_translation_timestep () lines_.resize (0); } -#include "translator.icc" -ADD_ACKNOWLEDGER (Grid_line_span_engraver, grid_point); +void +Grid_line_span_engraver::boot () +{ + ADD_ACKNOWLEDGER (Grid_line_span_engraver, grid_point); +} + ADD_TRANSLATOR (Grid_line_span_engraver, /* doc */ "This engraver makes cross-staff lines: It catches all normal" diff --git a/lily/grid-point-engraver.cc b/lily/grid-point-engraver.cc index 471997d48c..d67fb191b6 100644 --- a/lily/grid-point-engraver.cc +++ b/lily/grid-point-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ void Grid_point_engraver::process_music () { SCM grid_interval = get_property ("gridInterval"); - if (Moment *mom = unsmob_moment (grid_interval)) + if (Moment *mom = unsmob (grid_interval)) { Moment now = now_mom (); @@ -48,6 +48,12 @@ Grid_point_engraver::Grid_point_engraver () { } +void +Grid_point_engraver::boot () +{ + +} + ADD_TRANSLATOR (Grid_point_engraver, /* doc */ "Generate grid points.", diff --git a/lily/grob-array-scheme.cc b/lily/grob-array-scheme.cc index 2268ab6eda..8778763284 100644 --- a/lily/grob-array-scheme.cc +++ b/lily/grob-array-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -28,7 +28,7 @@ LY_DEFINE (ly_grob_array_length, "ly:grob-array-length", { LY_ASSERT_SMOB (Grob_array, grob_arr, 1); - Grob_array *me = unsmob_grob_array (grob_arr); + Grob_array *me = unsmob (grob_arr); return scm_from_int (me->size ()); } @@ -37,7 +37,7 @@ LY_DEFINE (ly_grob_array_ref, "ly:grob-array-ref", (SCM grob_arr, SCM index), "Retrieve the @var{index}th element of @var{grob-arr}.") { - Grob_array *me = unsmob_grob_array (grob_arr); + Grob_array *me = unsmob (grob_arr); LY_ASSERT_SMOB (Grob_array, grob_arr, 1); LY_ASSERT_TYPE (scm_is_integer, index, 2); @@ -53,7 +53,7 @@ LY_DEFINE (ly_grob_array_2_list, "ly:grob-array->list", (SCM grob_arr), "Return the elements of @var{grob-arr} as a Scheme list.") { - Grob_array *me = unsmob_grob_array (grob_arr); + Grob_array *me = unsmob (grob_arr); LY_ASSERT_SMOB (Grob_array, grob_arr, 1); return grob_array_to_list (me); diff --git a/lily/grob-array.cc b/lily/grob-array.cc index d0cf111068..f5228dfd71 100644 --- a/lily/grob-array.cc +++ b/lily/grob-array.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,7 +21,6 @@ #include "item.hh" #include "spanner.hh" -#include "ly-smobs.icc" Item * Grob_array::item (vsize i) @@ -40,40 +39,23 @@ Grob_array::Grob_array () ordered_ = true; } -vector & -Grob_array::array_reference () -{ - return grobs_; -} - -vector const & -Grob_array::array () const -{ - return grobs_; -} - SCM -Grob_array::mark_smob (SCM s) +Grob_array::mark_smob () const { - (void) s; - #if 0 /* see System::derived_mark () const */ - Grob_array *ga = unsmob_grob_array (s); - for (vsize i = 0; i < ga->grobs_.size (); i++) - scm_gc_mark (ga->grobs_[i]->self_scm ()); + for (vsize i = 0; i < grobs_.size (); i++) + scm_gc_mark (grobs_[i]->self_scm ()); #endif return SCM_UNDEFINED; } int -Grob_array::print_smob (SCM arr, SCM port, scm_print_state *) +Grob_array::print_smob (SCM port, scm_print_state *) const { scm_puts ("#size (); i++) + for (vsize i = 0; i < size (); i++) { - scm_display (grob_arr->grob (i)->self_scm (), port); + scm_display (grob (i)->self_scm (), port); scm_puts (" ", port); } scm_puts (">", port); @@ -87,12 +69,6 @@ Grob_array::make_array () return ga.smobbed_copy (); } -void -Grob_array::clear () -{ - grobs_.clear (); -} - void Grob_array::remove_duplicates () { @@ -101,30 +77,55 @@ Grob_array::remove_duplicates () uniquify (grobs_); } -bool -Grob_array::empty () const +void +Grob_array::filter (bool (*predicate) (const Grob *)) { - return grobs_.empty (); + vsize new_size = 0; + for (vsize i = 0; i < grobs_.size (); ++i) + if (predicate (grobs_[i])) + grobs_[new_size++] = grobs_[i]; + grobs_.resize (new_size); + // could call grobs_.shrink_to_fit () with C++11 } void -Grob_array::set_array (vector const &src) +Grob_array::filter_map (Grob * (*map_fun) (Grob *)) { - grobs_ = src; + vsize new_size = 0; + for (vsize i = 0; i < grobs_.size (); ++i) + if (Grob *grob = map_fun (grobs_[i])) + grobs_[new_size++] = grob; + grobs_.resize (new_size); + // could call grobs_.shrink_to_fit () with C++11 +} + +void +Grob_array::filter_map_assign (const Grob_array &src, + Grob * (*map_fun) (Grob *)) +{ + if (&src != this) + { + grobs_.resize (0); + grobs_.reserve (src.grobs_.size ()); + for (vsize i = 0; i < src.grobs_.size (); i++) + if (Grob *grob = map_fun (src.grobs_[i])) + grobs_.push_back (grob); + // could call grobs_.shrink_to_fit () with C++11 + } + else + filter_map (map_fun); } -IMPLEMENT_SIMPLE_SMOBS (Grob_array); -IMPLEMENT_TYPE_P (Grob_array, "ly:grob-array?"); +const char * const Grob_array::type_p_name_ = "ly:grob-array?"; -IMPLEMENT_DEFAULT_EQUAL_P (Grob_array); SCM grob_list_to_grob_array (SCM lst) { SCM arr_scm = Grob_array::make_array (); - Grob_array *ga = unsmob_grob_array (arr_scm); + Grob_array *ga = unsmob (arr_scm); for (SCM s = lst; scm_is_pair (s); s = scm_cdr (s)) - ga->add (unsmob_grob (scm_car (s))); + ga->add (unsmob (scm_car (s))); return arr_scm; } diff --git a/lily/grob-closure.cc b/lily/grob-closure.cc index 4c63fe3c0c..bfafd4c982 100644 --- a/lily/grob-closure.cc +++ b/lily/grob-closure.cc @@ -1,6 +1,6 @@ #include "grob.hh" -#include "simple-closure.hh" #include "unpure-pure-container.hh" +#include "lily-imports.hh" SCM axis_offset_symbol (Axis a) @@ -30,27 +30,9 @@ axis_parent_positioning (Axis a) void add_offset_callback (Grob *g, SCM proc, Axis a) { - SCM data = g->get_property_data (axis_offset_symbol (a)); - if (!scm_is_number (data) - && !ly_is_procedure (data) - && !is_simple_closure (data)) - { - g->set_property (axis_offset_symbol (a), proc); - return; - } - - if (ly_is_procedure (data) || is_unpure_pure_container (data)) - data = ly_make_simple_closure (scm_list_1 (data)); - else if (is_simple_closure (data)) - data = simple_closure_expression (data); - - SCM plus = ly_lily_module_constant ("+"); - - if (ly_is_procedure (proc)) - proc = ly_make_simple_closure (scm_list_1 (proc)); - - SCM expr = scm_list_3 (plus, proc, data); - g->set_property (axis_offset_symbol (a), ly_make_simple_closure (expr)); + SCM sym = axis_offset_symbol (a); + SCM data = g->get_property_data (sym); + g->set_property (sym, Lily::grob_offset_function (proc, data)); } /* @@ -66,25 +48,7 @@ void chain_callback (Grob *g, SCM proc, SCM sym) { SCM data = g->get_property_data (sym); - - if (ly_is_procedure (data) || is_unpure_pure_container (data)) - data = ly_make_simple_closure (scm_list_1 (data)); - else if (is_simple_closure (data)) - data = simple_closure_expression (data); - else - /* - Data may be nonnumber. In that case, it is assumed to be - undefined. - */ - - data = SCM_UNDEFINED; - - SCM expr = scm_list_2 (proc, data); - g->set_property (sym, - - // twice: one as a wrapper for grob property routines, - // once for the actual delayed binding. - ly_make_simple_closure (ly_make_simple_closure (expr))); + g->set_property (sym, Lily::grob_compose_function (proc, data)); } void diff --git a/lily/grob-info.cc b/lily/grob-info.cc index 4e5d8889f3..aab0d3cb8d 100644 --- a/lily/grob-info.cc +++ b/lily/grob-info.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,8 +29,6 @@ Grob_info::Grob_info (Translator *t, Grob *g) { origin_trans_ = t; grob_ = g; - start_end_ = START; - rerouting_daddy_context_ = 0; /* assert here, because this is easier to debug. @@ -41,16 +39,14 @@ Grob_info::Grob_info (Translator *t, Grob *g) Grob_info::Grob_info () { grob_ = 0; - start_end_ = START; origin_trans_ = 0; - rerouting_daddy_context_ = 0; } Stream_event * Grob_info::event_cause () const { SCM cause = grob_->get_property ("cause"); - return unsmob_stream_event (cause); + return unsmob (cause); } vector @@ -90,11 +86,11 @@ Stream_event * Grob_info::ultimate_event_cause () const { SCM cause = grob_->self_scm (); - while (unsmob_grob (cause)) + while (unsmob (cause)) { - cause = unsmob_grob (cause)->get_property ("cause"); + cause = unsmob (cause)->get_property ("cause"); } - return unsmob_stream_event (cause); + return unsmob (cause); } bool diff --git a/lily/grob-interface-scheme.cc b/lily/grob-interface-scheme.cc index bbbe7cfe85..3d5fa39a07 100644 --- a/lily/grob-interface-scheme.cc +++ b/lily/grob-interface-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,7 +32,7 @@ internal_add_interface (SCM a, SCM b, SCM c) scm_permanent_object (tab); } - SCM entry = scm_list_n (a, b, c, SCM_UNDEFINED); + SCM entry = scm_list_3 (a, b, c); scm_hashq_set_x (all_ifaces, a, entry); } diff --git a/lily/grob-interface.cc b/lily/grob-interface.cc index ecc2a6e08f..ea9b81ad9f 100644 --- a/lily/grob-interface.cc +++ b/lily/grob-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,7 +37,7 @@ SCM add_interface (char const *cxx_name, lispy_name += suffix; SCM s = ly_symbol2scm (lispy_name.c_str ()); - SCM d = scm_from_locale_string (descr); + SCM d = scm_from_utf8_string (descr); SCM l = parse_symbol_list (vars); internal_add_interface (s, d, l); @@ -48,7 +48,7 @@ SCM add_interface (char const *cxx_name, void check_interfaces_for_property (Grob const *me, SCM sym) { - if (sym == ly_symbol2scm ("meta")) + if (scm_is_eq (sym, ly_symbol2scm ("meta"))) { /* otherwise we get in a nasty recursion loop. @@ -63,7 +63,7 @@ check_interfaces_for_property (Grob const *me, SCM sym) for (; !found && scm_is_pair (ifs); ifs = scm_cdr (ifs)) { SCM iface = scm_hashq_ref (all_ifaces, scm_car (ifs), SCM_BOOL_F); - if (iface == SCM_BOOL_F) + if (scm_is_false (iface)) { string msg = to_string (_f ("Unknown interface `%s'", ly_symbol2string (scm_car (ifs)).c_str ())); @@ -71,7 +71,7 @@ check_interfaces_for_property (Grob const *me, SCM sym) continue; } - found = found || (scm_c_memq (sym, scm_caddr (iface)) != SCM_BOOL_F); + found = found || scm_is_true (scm_c_memq (sym, scm_caddr (iface))); } if (!found) diff --git a/lily/grob-pq-engraver.cc b/lily/grob-pq-engraver.cc index 6ad7ccf0fa..25392a4355 100644 --- a/lily/grob-pq-engraver.cc +++ b/lily/grob-pq-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,6 +22,8 @@ #include "grob.hh" #include "warn.hh" +#include "translator.icc" + struct Grob_pq_entry { Grob *grob_; @@ -40,7 +42,7 @@ public: TRANSLATOR_DECLARATIONS (Grob_pq_engraver); protected: virtual void initialize (); - DECLARE_ACKNOWLEDGER (grob); + void acknowledge_grob (Grob_info); void start_translation_timestep (); void stop_translation_timestep (); void process_acknowledged (); @@ -63,8 +65,8 @@ LY_DEFINE (ly_grob_pq_less_p, "ly:grob-pq (scm_car (a)), + *unsmob (scm_car (b))) < 0) return SCM_BOOL_T; else return SCM_BOOL_F; @@ -121,7 +123,7 @@ 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) + while (scm_is_pair (busy) && *unsmob (scm_caar (busy)) == now) busy = scm_cdr (busy); } @@ -133,7 +135,7 @@ Grob_pq_engraver::start_translation_timestep () SCM start_busy = get_property ("busyGrobs"); SCM busy = start_busy; - while (scm_is_pair (busy) && *unsmob_moment (scm_caar (busy)) < now) + while (scm_is_pair (busy) && *unsmob (scm_caar (busy)) < now) { /* The grob-pq-engraver is not water tight, and stuff like @@ -146,8 +148,12 @@ Grob_pq_engraver::start_translation_timestep () context ()->set_property ("busyGrobs", busy); } -#include "translator.icc" -ADD_ACKNOWLEDGER (Grob_pq_engraver, grob); +void +Grob_pq_engraver::boot () +{ + ADD_ACKNOWLEDGER (Grob_pq_engraver, grob); +} + ADD_TRANSLATOR (Grob_pq_engraver, /* doc */ "Administrate when certain grobs (e.g., note heads) stop" diff --git a/lily/grob-property.cc b/lily/grob-property.cc index f9773e5ec5..1129e48157 100644 --- a/lily/grob-property.cc +++ b/lily/grob-property.cc @@ -13,20 +13,17 @@ #include "spanner.hh" #include "international.hh" #include "item.hh" -#include "misc.hh" -#include "item.hh" #include "program-option.hh" #include "profile.hh" -#include "simple-closure.hh" #include "unpure-pure-container.hh" #include "warn.hh" #include "protected-scm.hh" -Protected_scm grob_property_callback_stack = SCM_EOL; +Protected_scm grob_property_callback_stack (SCM_EOL); extern bool debug_property_callbacks; -#ifndef NDEBUG +#ifdef DEBUG static void print_property_callback_stack () { @@ -36,8 +33,8 @@ print_property_callback_stack () } #endif -static Protected_scm modification_callback = SCM_EOL; -static Protected_scm cache_callback = SCM_EOL; +static Protected_scm modification_callback (SCM_EOL); +static Protected_scm cache_callback (SCM_EOL); /* FIXME: this should use ly:set-option interface instead. @@ -77,13 +74,13 @@ Grob::instrumented_set_property (SCM sym, SCM v, int line, char const *fun) { -#ifndef NDEBUG +#ifdef DEBUG 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), + scm_from_ascii_string (fun), sym, v, SCM_UNDEFINED)); #else (void) file; @@ -97,10 +94,9 @@ Grob::instrumented_set_property (SCM sym, SCM v, SCM Grob::get_property_alist_chain (SCM def) const { - return scm_list_n (mutable_property_alist_, + return scm_list_3 (mutable_property_alist_, immutable_property_alist_, - def, - SCM_UNDEFINED); + def); } extern void check_interfaces_for_property (Grob const *me, SCM sym); @@ -123,9 +119,8 @@ Grob::internal_set_value_on_alist (SCM *alist, SCM sym, SCM v) if (do_internal_type_checking_global) { if (!ly_is_procedure (v) - && !is_simple_closure (v) - && !is_unpure_pure_container (v) - && v != ly_symbol2scm ("calculation-in-progress")) + && !unsmob (v) + && !scm_is_eq (v, ly_symbol2scm ("calculation-in-progress"))) type_check_assignment (sym, v, ly_symbol2scm ("backend-type?")); check_interfaces_for_property (this, sym); @@ -137,13 +132,13 @@ Grob::internal_set_value_on_alist (SCM *alist, SCM sym, SCM v) SCM Grob::internal_get_property_data (SCM sym) const { -#ifndef NDEBUG +#ifdef DEBUG if (profile_property_accesses) note_property_access (&grob_property_lookup_table, sym); #endif SCM handle = scm_sloppy_assq (sym, mutable_property_alist_); - if (handle != SCM_BOOL_F) + if (scm_is_true (handle)) return scm_cdr (handle); handle = scm_sloppy_assq (sym, immutable_property_alist_); @@ -151,13 +146,14 @@ 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) && !is_unpure_pure_container (val)) + if (!ly_is_procedure (val) + && !unsmob (val)) type_check_assignment (sym, val, ly_symbol2scm ("backend-type?")); check_interfaces_for_property (this, sym); } - return (handle == SCM_BOOL_F) ? SCM_EOL : scm_cdr (handle); + return scm_is_false (handle) ? SCM_EOL : scm_cdr (handle); } SCM @@ -165,8 +161,8 @@ Grob::internal_get_property (SCM sym) const { SCM val = get_property_data (sym); -#ifndef NDEBUG - if (val == ly_symbol2scm ("calculation-in-progress")) +#ifdef DEBUG + if (scm_is_eq (val, ly_symbol2scm ("calculation-in-progress"))) { programming_error (to_string ("cyclic dependency: calculation-in-progress encountered for #'%s (%s)", ly_symbol2string (sym).c_str (), @@ -179,11 +175,10 @@ Grob::internal_get_property (SCM sym) const } #endif - if (is_unpure_pure_container (val)) - val = unpure_pure_container_unpure_part (val); + if (Unpure_pure_container *upc = unsmob (val)) + val = upc->unpure_part (); - if (ly_is_procedure (val) - || is_simple_closure (val)) + if (ly_is_procedure (val)) { Grob *me = ((Grob *)this); val = me->try_callback_on_alist (&me->mutable_property_alist_, sym, val); @@ -197,12 +192,17 @@ SCM Grob::internal_get_pure_property (SCM sym, int start, int end) const { SCM val = internal_get_property_data (sym); - if (ly_is_procedure (val) || is_unpure_pure_container (val)) + if (ly_is_procedure (val)) return call_pure_function (val, scm_list_1 (self_scm ()), start, end); - if (is_simple_closure (val)) - return evaluate_with_simple_closure (self_scm (), - simple_closure_expression (val), - true, start, end); + + if (Unpure_pure_container *upc = unsmob (val)) { + // Do cache, if the function ignores 'start' and 'end' + if (upc->is_unchanging ()) + return internal_get_property (sym); + else + return call_pure_function (val, scm_list_1 (self_scm ()), start, end); + } + return val; } @@ -222,7 +222,7 @@ Grob::try_callback_on_alist (SCM *alist, SCM sym, SCM proc) */ *alist = scm_assq_set_x (*alist, sym, marker); -#ifndef NDEBUG +#ifdef DEBUG if (debug_property_callbacks) grob_property_callback_stack = scm_cons (scm_list_3 (self_scm (), sym, proc), grob_property_callback_stack); #endif @@ -230,35 +230,28 @@ Grob::try_callback_on_alist (SCM *alist, SCM sym, SCM proc) SCM value = SCM_EOL; if (ly_is_procedure (proc)) value = scm_call_1 (proc, self_scm ()); - else if (is_simple_closure (proc)) - { - value = evaluate_with_simple_closure (self_scm (), - simple_closure_expression (proc), - false, 0, 0); - } -#ifndef NDEBUG +#ifdef DEBUG if (debug_property_callbacks) grob_property_callback_stack = scm_cdr (grob_property_callback_stack); #endif - if (value == SCM_UNSPECIFIED) + if (scm_is_eq (value, SCM_UNSPECIFIED)) { value = get_property_data (sym); - assert (value == SCM_EOL || value == marker); - if (value == marker) + assert (scm_is_null (value) || scm_is_eq (value, marker)); + if (scm_is_eq (value, marker)) *alist = scm_assq_remove_x (*alist, sym); } else { -#ifndef NDEBUG +#ifdef DEBUG if (ly_is_procedure (cache_callback)) - scm_apply_0 (cache_callback, - scm_list_n (self_scm (), - sym, - proc, - value, - SCM_UNDEFINED)); + scm_call_4 (cache_callback, + self_scm (), + sym, + proc, + value); #endif internal_set_value_on_alist (alist, sym, value); } @@ -290,12 +283,11 @@ Grob::internal_get_object (SCM sym) const SCM s = scm_sloppy_assq (sym, object_alist_); - if (s != SCM_BOOL_F) + if (scm_is_true (s)) { SCM val = scm_cdr (s); if (ly_is_procedure (val) - || is_simple_closure (val) - || is_unpure_pure_container (val)) + || unsmob (val)) { Grob *me = ((Grob *)this); val = me->try_callback_on_alist (&me->object_alist_, sym, val); @@ -316,41 +308,38 @@ Grob::is_live () const bool Grob::internal_has_interface (SCM k) { - return scm_c_memq (k, interfaces_) != SCM_BOOL_F; + return scm_is_true (scm_c_memq (k, interfaces_)); } SCM -call_pure_function (SCM unpure, SCM args, int start, int end) +call_pure_function (SCM value, SCM args, int start, int end) { - if (is_unpure_pure_container (unpure)) + if (Unpure_pure_container *upc = unsmob (value)) { - SCM pure = unpure_pure_container_pure_part (unpure); - - if (is_simple_closure (pure)) + if (upc->is_unchanging ()) { - SCM expr = simple_closure_expression (pure); - return evaluate_with_simple_closure (scm_car (args), expr, true, start, end); + // Don't bother forming an Unpure_pure_call here. + value = upc->unpure_part (); + + if (ly_is_procedure (value)) + return scm_apply_0 (value, args); + return value; } - if (ly_is_procedure (pure)) - return scm_apply_0 (pure, - scm_append (scm_list_2 (scm_list_3 (scm_car (args), - scm_from_int (start), - scm_from_int (end)), - scm_cdr (args)))); + value = upc->pure_part (); - return pure; - } + if (ly_is_procedure (value)) + return scm_apply_3 (value, + scm_car (args), + scm_from_int (start), + scm_from_int (end), + scm_cdr (args)); - if (is_simple_closure (unpure)) - { - SCM expr = simple_closure_expression (unpure); - return evaluate_with_simple_closure (scm_car (args), expr, true, start, end); + return value; } - if (!ly_is_procedure (unpure)) - return unpure; + if (!ly_is_procedure (value)) + return value; return SCM_BOOL_F; } - diff --git a/lily/grob-scheme.cc b/lily/grob-scheme.cc index 9ae9c14fcb..572a49ac84 100644 --- a/lily/grob-scheme.cc +++ b/lily/grob-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -23,7 +23,6 @@ #include "item.hh" #include "output-def.hh" #include "paper-score.hh" -#include "simple-closure.hh" #include "system.hh" #include "unpure-pure-container.hh" #include "warn.hh" // error () @@ -33,7 +32,7 @@ LY_DEFINE (ly_grob_property_data, "ly:grob-property-data", "Return the value for property @var{sym} of @var{grob}," " but do not process callbacks.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); @@ -45,13 +44,12 @@ LY_DEFINE (ly_grob_set_property_x, "ly:grob-set-property!", 3, 0, 0, (SCM grob, SCM sym, SCM val), "Set @var{sym} in grob @var{grob} to value @var{val}.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); if (!ly_is_procedure (val) - && !is_simple_closure (val) && !type_check_assignment (sym, val, ly_symbol2scm ("backend-type?"))) error ("typecheck failed"); @@ -63,7 +61,7 @@ LY_DEFINE (ly_grob_set_nested_property_x, "ly:grob-set-nested-property!", 3, 0, 0, (SCM grob, SCM symlist, SCM val), "Set nested property @var{symlist} in grob @var{grob} to value @var{val}.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); @@ -88,17 +86,17 @@ LY_DEFINE (ly_grob_pure_property, "ly:grob-pure-property", " If no value is found, return @var{val} or @code{'()}" " if @var{val} is not specified.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); LY_ASSERT_TYPE (scm_is_integer, beg, 3); LY_ASSERT_TYPE (scm_is_integer, end, 4); - if (val == SCM_UNDEFINED) + if (SCM_UNBNDP (val)) val = SCM_EOL; SCM retval = sc->internal_get_pure_property (sym, scm_to_int (beg), scm_to_int (end)); - if (retval == SCM_EOL) + if (scm_is_null (retval)) retval = val; return retval; @@ -110,17 +108,17 @@ LY_DEFINE (ly_grob_pure_height, "ly:grob-pure-height", " If no value is found, return @var{val} or @code{'()}" " if @var{val} is not specified.") { - Grob *sc = unsmob_grob (grob); - Grob *ref = unsmob_grob (refp); + Grob *sc = unsmob (grob); + Grob *ref = unsmob (refp); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_SMOB (Grob, refp, 2); LY_ASSERT_TYPE (scm_is_integer, beg, 3); LY_ASSERT_TYPE (scm_is_integer, end, 4); - if (val == SCM_UNDEFINED) + if (SCM_UNBNDP (val)) val = SCM_EOL; - Interval retval = sc->pure_height (ref, scm_to_int (beg), scm_to_int (end)); + Interval retval = sc->pure_y_extent (ref, scm_to_int (beg), scm_to_int (end)); return ly_interval2scm (retval); } @@ -131,15 +129,15 @@ LY_DEFINE (ly_grob_property, "ly:grob-property", " If no value is found, return @var{val} or @code{'()}" " if @var{val} is not specified.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); - if (val == SCM_UNDEFINED) + if (SCM_UNBNDP (val)) val = SCM_EOL; - SCM retval = sc->internal_get_property (sym); - if (retval == SCM_EOL) + SCM retval = sc->get_property (sym); + if (scm_is_null (retval)) retval = val; return retval; @@ -149,7 +147,7 @@ LY_DEFINE (ly_grob_interfaces, "ly:grob-interfaces", 1, 0, 0, (SCM grob), "Return the interfaces list of grob @var{grob}.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); @@ -162,7 +160,7 @@ LY_DEFINE (ly_grob_object, "ly:grob-object", " @var{sym}. It returns @code{'()} (end-of-list) if @var{sym}" " is undefined in @var{grob}.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); @@ -174,7 +172,7 @@ LY_DEFINE (ly_grob_set_object_x, "ly:grob-set-object!", 3, 0, 0, (SCM grob, SCM sym, SCM val), "Set @var{sym} in grob @var{grob} to value @var{val}.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); @@ -189,7 +187,7 @@ LY_DEFINE (ly_grob_layout, "ly:grob-layout", 1, 0, 0, (SCM grob), "Get @code{\\layout} definition from grob @var{grob}.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); @@ -202,14 +200,14 @@ LY_DEFINE (ly_grob_alist_chain, "ly:grob-alist-chain", " the global default. If unspecified, @code{font-defaults}" " from the layout block is taken.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); - if (global == SCM_UNDEFINED) + if (SCM_UNBNDP (global)) { global = sc->layout ()->lookup_variable (ly_symbol2scm ("font-defaults")); - if (global == SCM_UNDEFINED) + if (SCM_UNBNDP (global)) global = SCM_EOL; } @@ -221,8 +219,8 @@ LY_DEFINE (ly_grob_extent, "ly:grob-extent", "Get the extent in @var{axis} direction of @var{grob} relative to" " the grob @var{refp}.") { - Grob *sc = unsmob_grob (grob); - Grob *ref = unsmob_grob (refp); + Grob *sc = unsmob (grob); + Grob *ref = unsmob (refp); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_SMOB (Grob, refp, 2); @@ -243,8 +241,8 @@ LY_DEFINE (ly_grob_robust_relative_extent, "ly:grob-robust-relative-extent", "Get the extent in @var{axis} direction of @var{grob} relative to" " the grob @var{refp}, or @code{(0,0)} if empty.") { - Grob *sc = unsmob_grob (grob); - Grob *ref = unsmob_grob (refp); + Grob *sc = unsmob (grob); + Grob *ref = unsmob (refp); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_SMOB (Grob, refp, 2); @@ -266,8 +264,8 @@ LY_DEFINE (ly_grob_relative_coordinate, "ly:grob-relative-coordinate", "Get the coordinate in @var{axis} direction of @var{grob} relative" " to the grob @var{refp}.") { - Grob *sc = unsmob_grob (grob); - Grob *ref = unsmob_grob (refp); + Grob *sc = unsmob (grob); + Grob *ref = unsmob (refp); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_SMOB (Grob, refp, 2); @@ -289,7 +287,7 @@ LY_DEFINE (ly_grob_parent, "ly:grob-parent", "Get the parent of @var{grob}. @var{axis} is 0 for the X-axis," " 1@tie{}for the Y-axis.") { - Grob *sc = unsmob_grob (grob); + Grob *sc = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (is_axis, axis, 2); @@ -302,8 +300,8 @@ LY_DEFINE (ly_grob_set_parent_x, "ly:grob-set-parent!", 3, 0, 0, (SCM grob, SCM axis, SCM parent_grob), "Set @var{parent-grob} the parent of grob @var{grob} in axis @var{axis}.") { - Grob *gr = unsmob_grob (grob); - Grob *parent = unsmob_grob (parent_grob); + Grob *gr = unsmob (grob); + Grob *parent = unsmob (parent_grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (is_axis, axis, 2); @@ -318,7 +316,7 @@ LY_DEFINE (ly_grob_properties, "ly:grob-properties", 1, 0, 0, (SCM grob), "Get the mutable properties of @var{grob}.") { - Grob *g = unsmob_grob (grob); + Grob *g = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); @@ -330,7 +328,7 @@ LY_DEFINE (ly_grob_basic_properties, "ly:grob-basic-properties", 1, 0, 0, (SCM grob), "Get the immutable properties of @var{grob}.") { - Grob *g = unsmob_grob (grob); + Grob *g = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); @@ -342,7 +340,7 @@ LY_DEFINE (ly_grob_system, "ly:grob-system", 1, 0, 0, (SCM grob), "Return the system grob of @var{grob}.") { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); @@ -356,7 +354,7 @@ LY_DEFINE (ly_grob_original, "ly:grob-original", 1, 0, 0, (SCM grob), "Return the unbroken original grob of @var{grob}.") { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); return me->original () ? me->original ()->self_scm () : me->self_scm (); @@ -366,7 +364,7 @@ LY_DEFINE (ly_grob_suicide_x, "ly:grob-suicide!", 1, 0, 0, (SCM grob), "Kill @var{grob}.") { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); @@ -379,7 +377,7 @@ LY_DEFINE (ly_grob_translate_axis_x, "ly:grob-translate-axis!", "Translate @var{grob} on axis@tie{}@var{a} over" " distance@tie{}@var{d}.") { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (scm_is_number, d, 2); @@ -393,7 +391,7 @@ LY_DEFINE (ly_grob_default_font, "ly:grob-default-font", 1, 0, 0, (SCM grob), "Return the default font for grob @var{grob}.") { - Grob *gr = unsmob_grob (grob); + Grob *gr = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); @@ -411,12 +409,12 @@ LY_DEFINE (ly_grob_common_refpoint, "ly:grob-common-refpoint", " for @var{axis}.") { - Grob *gr = unsmob_grob (grob); + Grob *gr = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_SMOB (Grob, other, 2); - Grob *o = unsmob_grob (other); + Grob *o = unsmob (other); LY_ASSERT_TYPE (is_axis, axis, 3); @@ -429,12 +427,12 @@ LY_DEFINE (ly_grob_common_refpoint_of_array, "ly:grob-common-refpoint-of-array", "Find the common refpoint of @var{grob} and @var{others}" " (a grob-array) for @var{axis}.") { - Grob *gr = unsmob_grob (grob); + Grob *gr = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_SMOB (Grob_array, others, 2); - Grob_array *ga = unsmob_grob_array (others); + Grob_array *ga = unsmob (others); LY_ASSERT_TYPE (is_axis, axis, 3); Grob *refp = common_refpoint_of_array (ga->array (), gr, Axis (scm_to_int (axis))); @@ -448,10 +446,10 @@ LY_DEFINE (ly_grob_chain_callback, "ly:grob-chain-callback", " to the head of this, meaning that it is called" " using @var{grob} and the previous callback's result.") { - Grob *gr = unsmob_grob (grob); + Grob *gr = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); - SCM_ASSERT_TYPE (ly_is_procedure (proc) || is_unpure_pure_container (proc), proc, SCM_ARG2, __FUNCTION__, "procedure or unpure pure container"); + SCM_ASSERT_TYPE (ly_is_procedure (proc) || unsmob (proc), proc, SCM_ARG2, __FUNCTION__, "procedure or unpure pure container"); LY_ASSERT_TYPE (ly_is_symbol, sym, 3); chain_callback (gr, proc, sym); @@ -465,8 +463,8 @@ LY_DEFINE (ly_grob_vertical_less_p, "ly:grob-vertical (a); + Grob *gb = unsmob (b); return ly_bool2scm (Grob::vertical_less (ga, gb)); } @@ -476,9 +474,24 @@ LY_DEFINE (ly_grob_get_vertical_axis_group_index, "ly:grob-get-vertical-axis-gro "Get the index of the vertical axis group the grob @var{grob} belongs to;" " return @code{-1} if none is found.") { - Grob *gr = unsmob_grob (grob); + Grob *gr = unsmob (grob); LY_ASSERT_SMOB (Grob, grob, 1); return scm_from_int (Grob::get_vertical_axis_group_index (gr)); } + +LY_DEFINE (ly_grob_spanned_rank_interval, "ly:grob-spanned-rank-interval", + 1, 0, 0, (SCM grob), + "Returns a pair with the @code{rank} of the furthest left" + " column and the @code{rank} of the furthest right column" + " spanned by @code{grob}.") +{ + Grob *gr = unsmob (grob); + + LY_ASSERT_SMOB (Grob, grob, 1); + + Interval_t iv = gr->spanned_rank_interval (); + + return scm_cons (scm_from_int(iv[LEFT]), scm_from_int(iv[RIGHT])); +} diff --git a/lily/grob-smob.cc b/lily/grob-smob.cc index 853546a886..72949973b1 100644 --- a/lily/grob-smob.cc +++ b/lily/grob-smob.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,19 +22,15 @@ #include "paper-score.hh" #include "warn.hh" -#include "ly-smobs.icc" -IMPLEMENT_SMOBS (Grob); -IMPLEMENT_DEFAULT_EQUAL_P (Grob); -IMPLEMENT_TYPE_P (Grob, "ly:grob?"); +const char * const Grob::type_p_name_ = "ly:grob?"; SCM -Grob::mark_smob (SCM ses) +Grob::mark_smob () const { - ASSERT_LIVE_IS_ALLOWED (ses); + ASSERT_LIVE_IS_ALLOWED (self_scm ()); - Grob *s = (Grob *) SCM_CELL_WORD_1 (ses); - scm_gc_mark (s->immutable_property_alist_); + scm_gc_mark (immutable_property_alist_); /* Do not mark the parents. The pointers in the mutable property list form two tree like structures (one for X @@ -43,23 +39,21 @@ Grob::mark_smob (SCM ses) between X and Y in an erratic manner, leading to much more recursion depth (and core dumps if we link to pthreads). */ - if (s->original ()) - scm_gc_mark (s->original ()->self_scm ()); + if (original ()) + scm_gc_mark (original ()->self_scm ()); - s->derived_mark (); - scm_gc_mark (s->object_alist_); - scm_gc_mark (s->interfaces_); + derived_mark (); + scm_gc_mark (object_alist_); + scm_gc_mark (interfaces_); - return s->mutable_property_alist_; + return mutable_property_alist_; } int -Grob::print_smob (SCM s, SCM port, scm_print_state *) +Grob::print_smob (SCM port, scm_print_state *) const { - Grob *sc = (Grob *) SCM_CELL_WORD_1 (s); - scm_puts ("#name ().c_str (), port); + scm_puts ((char *) name ().c_str (), port); /* Do not print properties, that is too much hassle. */ scm_puts (" >", port); diff --git a/lily/grob.cc b/lily/grob.cc index dee7bdaa3c..7ce89d5015 100644 --- a/lily/grob.cc +++ b/lily/grob.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,8 +38,8 @@ #include "system.hh" #include "unpure-pure-container.hh" #include "warn.hh" +#include "lily-imports.hh" -#include "ly-smobs.icc" Grob * Grob::clone () const @@ -51,7 +51,6 @@ Grob::Grob (SCM basicprops) { /* FIXME: default should be no callback. */ - self_scm_ = SCM_EOL; layout_ = 0; original_ = 0; interfaces_ = SCM_EOL; @@ -77,26 +76,26 @@ Grob::Grob (SCM basicprops) } } - if (get_property_data ("X-extent") == SCM_EOL) + if (scm_is_null (get_property_data ("X-extent"))) set_property ("X-extent", Grob::stencil_width_proc); - if (get_property_data ("Y-extent") == SCM_EOL) + if (scm_is_null (get_property_data ("Y-extent"))) set_property ("Y-extent", - ly_make_unpure_pure_container (Grob::stencil_height_proc, - Grob::pure_stencil_height_proc)); - if (get_property_data ("vertical-skylines") == SCM_EOL) + Unpure_pure_container::make_smob (Grob::stencil_height_proc, + Grob::pure_stencil_height_proc)); + if (scm_is_null (get_property_data ("vertical-skylines"))) set_property ("vertical-skylines", - ly_make_unpure_pure_container (Grob::simple_vertical_skylines_from_extents_proc, - Grob::pure_simple_vertical_skylines_from_extents_proc)); - if (get_property_data ("horizontal-skylines") == SCM_EOL) + Unpure_pure_container::make_smob (Grob::simple_vertical_skylines_from_extents_proc, + Grob::pure_simple_vertical_skylines_from_extents_proc)); + if (scm_is_null (get_property_data ("horizontal-skylines"))) set_property ("horizontal-skylines", - ly_make_unpure_pure_container (Grob::simple_horizontal_skylines_from_extents_proc, - Grob::pure_simple_horizontal_skylines_from_extents_proc)); + Unpure_pure_container::make_smob (Grob::simple_horizontal_skylines_from_extents_proc, + Grob::pure_simple_horizontal_skylines_from_extents_proc)); } Grob::Grob (Grob const &s) + : Smob () { original_ = (Grob *) & s; - self_scm_ = SCM_EOL; immutable_property_alist_ = s.immutable_property_alist_; mutable_property_alist_ = SCM_EOL; @@ -129,7 +128,7 @@ Grob::get_stencil () const return 0; SCM stil = get_property ("stencil"); - return unsmob_stencil (stil); + return unsmob (stil); } Stencil @@ -138,20 +137,35 @@ Grob::get_print_stencil () const SCM stil = get_property ("stencil"); Stencil retval; - if (Stencil *m = unsmob_stencil (stil)) + if (Stencil *m = unsmob (stil)) { retval = *m; bool transparent = to_boolean (get_property ("transparent")); + /* Process whiteout before color and grob-cause to prevent colored */ + /* whiteout background and larger file sizes with \pointAndClickOn. */ + /* A grob has to be visible, otherwise the whiteout property has no effect. */ + /* Calls the scheme procedure stencil-whiteout in scm/stencils.scm */ + if (!transparent && (scm_is_number (get_property ("whiteout")) + || to_boolean (get_property ("whiteout")))) + { + Real line_thickness = layout ()->get_dimension (ly_symbol2scm ("line-thickness")); + retval = *unsmob + (Lily::stencil_whiteout (retval.smobbed_copy (), + get_property ("whiteout-style"), + get_property ("whiteout"), + scm_from_double (line_thickness))); + } + if (transparent) retval = Stencil (m->extent_box (), SCM_EOL); else { - SCM expr = m->expr (); - expr = scm_list_3 (ly_symbol2scm ("grob-cause"), - self_scm (), expr); + SCM expr = scm_list_3 (ly_symbol2scm ("grob-cause"), + self_scm (), + retval.expr ()); - retval = Stencil (m->extent_box (), expr); + retval = Stencil (retval.extent_box (), expr); } SCM rot = get_property ("rotation"); @@ -175,17 +189,6 @@ Grob::get_print_stencil () const retval = Stencil (retval.extent_box (), expr); } - /* process whiteout */ - /* a grob has to be visible, otherwise the whiteout property has no effect */ - if (!transparent && to_boolean (get_property ("whiteout"))) - { - /* Call the scheme procedure stencil-whiteout in scm/stencils.scm */ - /* to add a round-filled-box stencil to the stencil list */ - retval - = *unsmob_stencil (scm_call_1 (ly_lily_module_constant ("stencil-whiteout"), - retval.smobbed_copy ())); - } - SCM id = get_property ("id"); if (scm_is_string (id)) { @@ -382,7 +385,7 @@ Grob::pure_relative_y_coordinate (Grob const *refp, int start, int end) if (Grob *p = get_parent (Y_AXIS)) { Real trans = 0; - if (Align_interface::has_interface (p) && !dim_cache_[Y_AXIS].offset_) + if (has_interface (p) && !dim_cache_[Y_AXIS].offset_) trans = Align_interface::get_pure_child_y_translation (p, this, start, end); return off + trans + p->pure_relative_y_coordinate (refp, start, end); @@ -406,7 +409,7 @@ Grob::get_offset (Axis a) const UGH: can't fold next 2 statements together. Apparently GCC thinks dim_cache_[a].offset_ is unaliased. */ - Real off = robust_scm2double (internal_get_property (sym), 0.0); + Real off = robust_scm2double (get_property (sym), 0.0); if (me->dim_cache_[a].offset_) { *me->dim_cache_[a].offset_ += off; @@ -461,20 +464,15 @@ Grob::extent (Grob *refp, Axis a) const /* Order is significant: ?-extent may trigger suicide. */ - SCM ext_sym - = (a == X_AXIS) - ? ly_symbol2scm ("X-extent") - : ly_symbol2scm ("Y-extent"); - - SCM ext = internal_get_property (ext_sym); + SCM ext = (a == X_AXIS) + ? get_property ("X-extent") + : get_property ("Y-extent"); if (is_number_pair (ext)) real_ext.unite (ly_scm2interval (ext)); - SCM min_ext_sym - = (a == X_AXIS) - ? ly_symbol2scm ("minimum-X-extent") - : ly_symbol2scm ("minimum-Y-extent"); - SCM min_ext = internal_get_property (min_ext_sym); + SCM min_ext = (a == X_AXIS) + ? get_property ("minimum-X-extent") + : get_property ("minimum-Y-extent"); if (is_number_pair (min_ext)) real_ext.unite (ly_scm2interval (min_ext)); @@ -485,14 +483,14 @@ Grob::extent (Grob *refp, Axis a) const if(!isinf (offset)) real_ext.translate(offset); else - this->warning(_f ("ignored infinite %s-offset", + warning(_f ("ignored infinite %s-offset", a == X_AXIS ? "X" : "Y")); return real_ext; } Interval -Grob::pure_height (Grob *refp, int start, int end) +Grob::pure_y_extent (Grob *refp, int start, int end) { SCM iv_scm = get_pure_property ("Y-extent", start, end); Interval iv = robust_scm2interval (iv_scm, Interval ()); @@ -514,7 +512,7 @@ Grob::pure_height (Grob *refp, int start, int end) Interval Grob::maybe_pure_extent (Grob *refp, Axis a, bool pure, int start, int end) { - return (pure && a == Y_AXIS) ? pure_height (refp, start, end) : extent (refp, a); + return (pure && a == Y_AXIS) ? pure_y_extent (refp, start, end) : extent (refp, a); } Interval_t @@ -634,7 +632,7 @@ get_maybe_root_vertical_alignment (Grob *g, Grob *maybe) { if (!g) return maybe; - if (Align_interface::has_interface (g)) + if (has_interface (g)) return get_maybe_root_vertical_alignment (g->get_parent (Y_AXIS), g); return get_maybe_root_vertical_alignment (g->get_parent (Y_AXIS), maybe); @@ -653,8 +651,8 @@ Grob::get_vertical_axis_group (Grob *g) return 0; if (!g->get_parent (Y_AXIS)) return 0; - if (Axis_group_interface::has_interface (g) - && Align_interface::has_interface (g->get_parent (Y_AXIS))) + if (has_interface (g) + && has_interface (g->get_parent (Y_AXIS))) return g; return get_vertical_axis_group (g->get_parent (Y_AXIS)); @@ -727,13 +725,13 @@ void Grob::programming_error (const string &s) const { SCM cause = self_scm (); - while (Grob *g = unsmob_grob (cause)) + while (Grob *g = unsmob (cause)) cause = g->get_property ("cause"); /* ES TODO: cause can't be Music*/ - if (Music *m = unsmob_music (cause)) + if (Music *m = unsmob (cause)) m->origin ()->programming_error (s); - else if (Stream_event *ev = unsmob_stream_event (cause)) + else if (Stream_event *ev = unsmob (cause)) ev->origin ()->programming_error (s); else ::programming_error (s); @@ -743,13 +741,13 @@ void Grob::warning (const string &s) const { SCM cause = self_scm (); - while (Grob *g = unsmob_grob (cause)) + while (Grob *g = unsmob (cause)) cause = g->get_property ("cause"); /* ES TODO: cause can't be Music*/ - if (Music *m = unsmob_music (cause)) + if (Music *m = unsmob (cause)) m->origin ()->warning (s); - else if (Stream_event *ev = unsmob_stream_event (cause)) + else if (Stream_event *ev = unsmob (cause)) ev->origin ()->warning (s); else ::warning (s); @@ -761,7 +759,7 @@ Grob::name () const SCM meta = get_property ("meta"); SCM nm = scm_assq (ly_symbol2scm ("name"), meta); nm = (scm_is_pair (nm)) ? scm_cdr (nm) : SCM_EOL; - return scm_is_symbol (nm) ? ly_symbol2string (nm) : this->class_name (); + return scm_is_symbol (nm) ? ly_symbol2string (nm) : class_name (); } ADD_INTERFACE (Grob, @@ -825,9 +823,7 @@ ADD_INTERFACE (Grob, "meta " "minimum-X-extent " "minimum-Y-extent " - "outside-staff-horizontal-padding " - "outside-staff-padding " - "outside-staff-priority " + "parenthesis-friends " "pure-Y-offset-in-progress " "rotation " "skyline-horizontal-padding " @@ -837,6 +833,7 @@ ADD_INTERFACE (Grob, "transparent " "vertical-skylines " "whiteout " + "whiteout-style " ); /**************************************************************** @@ -857,7 +854,7 @@ MAKE_SCHEME_CALLBACK (Grob, stencil_height, 1); SCM Grob::stencil_height (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return grob_stencil_extent (me, Y_AXIS); } @@ -865,8 +862,8 @@ MAKE_SCHEME_CALLBACK (Grob, pure_stencil_height, 3); SCM Grob::pure_stencil_height (SCM smob, SCM /* beg */, SCM /* end */) { - Grob *me = unsmob_grob (smob); - if (unsmob_stencil (me->get_property_data ("stencil"))) + Grob *me = unsmob (smob); + if (unsmob (me->get_property_data ("stencil"))) return grob_stencil_extent (me, Y_AXIS); return ly_interval2scm (Interval ()); @@ -877,7 +874,7 @@ MAKE_SCHEME_CALLBACK (Grob, y_parent_positioning, 1); SCM Grob::y_parent_positioning (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Grob *par = me->get_parent (Y_AXIS); if (par) (void) par->get_property ("positioning-done"); @@ -889,7 +886,7 @@ MAKE_SCHEME_CALLBACK (Grob, x_parent_positioning, 1); SCM Grob::x_parent_positioning (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Grob *par = me->get_parent (X_AXIS); if (par) @@ -902,7 +899,7 @@ MAKE_SCHEME_CALLBACK (Grob, stencil_width, 1); SCM Grob::stencil_width (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return grob_stencil_extent (me, X_AXIS); } @@ -910,7 +907,7 @@ Grob * common_refpoint_of_list (SCM elist, Grob *common, Axis a) { for (; scm_is_pair (elist); elist = scm_cdr (elist)) - if (Grob *s = unsmob_grob (scm_car (elist))) + if (Grob *s = unsmob (scm_car (elist))) { if (common) common = common->common_refpoint (s, a); @@ -962,11 +959,11 @@ robust_relative_extent (Grob *me, Grob *refpoint, Axis a) bool Grob::check_cross_staff (Grob *commony) { - if (Align_interface::has_interface (commony)) + if (has_interface (commony)) return true; for (Grob *g = this; g && g != commony; g = g->get_parent (Y_AXIS)) - if (Align_interface::has_interface (g)) + if (has_interface (g)) return true; return false; diff --git a/lily/guile-init.cc b/lily/guile-init.cc index 6b27711b9f..4270aa01d6 100644 --- a/lily/guile-init.cc +++ b/lily/guile-init.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -21,11 +21,22 @@ #include "lily-guile.hh" #include "main.hh" #include "warn.hh" +#include "smobs.hh" +#include "lily-imports.hh" /* INIT */ +// Why a pointer here? Because it has zero initialization at load +// time which is guaranteed to come before the static initializations +// of all constructors for static expressions of the classes created +// by ADD_SCM_INIT_FUNC. The vector data type does not have load-time +// initialization and might clear out already set callbacks at the +// time it is initialized since there is no implied order among +// non-trivial constructors for static data in separate compilation +// units. So we need a trivial type like a pointer instead. + typedef void (*Void_fptr) (); vector *scm_init_funcs_; @@ -38,8 +49,10 @@ void add_scm_init_func (void (*f) ()) } void -ly_init_ly_module (void *) +ly_init_ly_module () { + // Start up type system first. + Scm_init::init (); for (vsize i = scm_init_funcs_->size (); i--;) (scm_init_funcs_->at (i)) (); @@ -51,14 +64,15 @@ ly_init_ly_module (void *) debug_output ("]\n", false); } - scm_primitive_load_path (scm_from_locale_string ("lily.scm")); + scm_primitive_load_path (scm_from_ascii_string ("lily.scm")); } -SCM global_lily_module; - void ly_c_init_guile () { - global_lily_module = scm_c_define_module ("lily", ly_init_ly_module, 0); + Guile_user::module.import (); + Lily::module.boot (ly_init_ly_module); + Syntax::module.import (); + Display::module.import (); scm_c_use_module ("lily"); } diff --git a/lily/hairpin.cc b/lily/hairpin.cc index 1d9007441b..01d8fd93de 100644 --- a/lily/hairpin.cc +++ b/lily/hairpin.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -38,7 +38,7 @@ MAKE_SCHEME_CALLBACK (Hairpin, pure_height, 3); SCM Hairpin::pure_height (SCM smob, SCM, SCM) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real height = robust_scm2double (me->get_property ("height"), 0.0) * Staff_symbol_referencer::staff_space (me); @@ -53,7 +53,7 @@ MAKE_SCHEME_CALLBACK (Hairpin, broken_bound_padding, 1); SCM Hairpin::broken_bound_padding (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Item *r_bound = me->get_bound (RIGHT); if (r_bound->break_status_dir () != -1) { @@ -88,7 +88,7 @@ Hairpin::broken_bound_padding (SCM smob) if (!scm_is_pair (hsb)) break; - span_bars[d] = unsmob_grob ((d == UP ? scm_car : scm_cdr) (hsb)); + span_bars[d] = unsmob ((d == UP ? scm_car : scm_cdr) (hsb)); break; } @@ -107,7 +107,7 @@ MAKE_SCHEME_CALLBACK (Hairpin, print, 1); SCM Hairpin::print (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); SCM s = me->get_property ("grow-direction"); if (!is_direction (s)) @@ -185,7 +185,7 @@ Hairpin::print (SCM smob) } else { - if (Text_interface::has_interface (b)) + if (has_interface (b)) { if (!e.is_empty ()) x_points[d] = e[-d] - d * padding; @@ -214,7 +214,7 @@ Hairpin::print (SCM smob) if (neighbor_found) { - if (Hairpin::has_interface (adjacent)) + if (has_interface (adjacent)) { /* Handle back-to-back hairpins with a circle in the middle @@ -237,7 +237,7 @@ Hairpin::print (SCM smob) else { if (d == RIGHT // end at the left edge of a rest - && Note_column::has_interface (b) + && has_interface (b) && Note_column::has_rests (b)) x_points[d] = e[-d]; else diff --git a/lily/hara-kiri-group-spanner.cc b/lily/hara-kiri-group-spanner.cc index 610ab950f4..06410786a6 100644 --- a/lily/hara-kiri-group-spanner.cc +++ b/lily/hara-kiri-group-spanner.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -30,7 +30,7 @@ MAKE_SCHEME_CALLBACK (Hara_kiri_group_spanner, y_extent, 1); SCM Hara_kiri_group_spanner::y_extent (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); consider_suicide (me); return Axis_group_interface::generic_group_extent (me, Y_AXIS); } @@ -39,7 +39,7 @@ MAKE_SCHEME_CALLBACK (Hara_kiri_group_spanner, calc_skylines, 1); SCM Hara_kiri_group_spanner::calc_skylines (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); consider_suicide (me); return Axis_group_interface::calc_skylines (smob); } @@ -48,7 +48,7 @@ MAKE_SCHEME_CALLBACK (Hara_kiri_group_spanner, pure_height, 3); SCM Hara_kiri_group_spanner::pure_height (SCM smob, SCM start_scm, SCM end_scm) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); int start = robust_scm2int (start_scm, 0); int end = robust_scm2int (end_scm, INT_MAX); @@ -77,6 +77,11 @@ bool find_in_range (SCM vector, int low, int hi, int min, int max) bool Hara_kiri_group_spanner::request_suicide (Grob *me, int start, int end) { + extract_grob_set (me, "make-dead-when", foes); + for (vsize i = 0; i < foes.size (); i++) + if (foes[i]->is_live () && !request_suicide_alone (foes[i], start, end)) + return true; + if (!request_suicide_alone (me, start, end)) return false; @@ -162,7 +167,7 @@ MAKE_SCHEME_CALLBACK (Hara_kiri_group_spanner, force_hara_kiri_callback, 1); SCM Hara_kiri_group_spanner::force_hara_kiri_callback (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); consider_suicide (me); return scm_from_double (0.0); } @@ -171,7 +176,7 @@ MAKE_SCHEME_CALLBACK (Hara_kiri_group_spanner, force_hara_kiri_in_y_parent_callb SCM Hara_kiri_group_spanner::force_hara_kiri_in_y_parent_callback (SCM smob) { - Grob *daughter = unsmob_grob (smob); + Grob *daughter = unsmob (smob); force_hara_kiri_callback (daughter->get_parent (Y_AXIS)->self_scm ()); return scm_from_double (0.0); } @@ -185,13 +190,16 @@ Hara_kiri_group_spanner::add_interesting_item (Grob *me, Grob *n) ADD_INTERFACE (Hara_kiri_group_spanner, "A group spanner that keeps track of interesting items. If it" " doesn't contain any after line breaking, it removes itself" - " and all its children.", + " and all its children. Children may be prioritized in layers" + " via @code{remove-layer}, in which case only the" + " lowest-numbered non-empty layer is retained.", /* properties */ "items-worth-living " "important-column-ranks " "keep-alive-with " + "make-dead-when " "remove-empty " "remove-first " + "remove-layer " ); - diff --git a/lily/horizontal-bracket-engraver.cc b/lily/horizontal-bracket-engraver.cc index 941f78a172..d50146a2d0 100644 --- a/lily/horizontal-bracket-engraver.cc +++ b/lily/horizontal-bracket-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,8 +39,8 @@ public: void stop_translation_timestep (); void process_music (); - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_TRANSLATOR_LISTENER (note_grouping); + void acknowledge_note_column (Grob_info); + void listen_note_grouping (Stream_event *); }; Horizontal_bracket_engraver::Horizontal_bracket_engraver () @@ -49,7 +49,6 @@ Horizontal_bracket_engraver::Horizontal_bracket_engraver () push_count_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Horizontal_bracket_engraver, note_grouping); void Horizontal_bracket_engraver::listen_note_grouping (Stream_event *ev) { @@ -109,7 +108,13 @@ Horizontal_bracket_engraver::stop_translation_timestep () events_.clear (); } -ADD_ACKNOWLEDGER (Horizontal_bracket_engraver, note_column); +void +Horizontal_bracket_engraver::boot () +{ + ADD_LISTENER (Horizontal_bracket_engraver, note_grouping); + ADD_ACKNOWLEDGER (Horizontal_bracket_engraver, note_column); +} + ADD_TRANSLATOR (Horizontal_bracket_engraver, /* doc */ "Create horizontal brackets over notes for musical analysis" diff --git a/lily/horizontal-bracket.cc b/lily/horizontal-bracket.cc index 279ee0baf2..ddeec44d75 100644 --- a/lily/horizontal-bracket.cc +++ b/lily/horizontal-bracket.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -101,7 +101,7 @@ MAKE_SCHEME_CALLBACK (Horizontal_bracket, print, 1); SCM Horizontal_bracket::print (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); extract_grob_set (me, "columns", gs); vector enclosed = gs; diff --git a/lily/hyphen-engraver.cc b/lily/hyphen-engraver.cc index c1f2a04e37..19ff388963 100644 --- a/lily/hyphen-engraver.cc +++ b/lily/hyphen-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Glen Prideaux , + Copyright (C) 1999--2015 Glen Prideaux , Han-Wen Nienhuys , Jan Nieuwenhuizen @@ -42,8 +42,8 @@ public: protected: - DECLARE_ACKNOWLEDGER (lyric_syllable); - DECLARE_TRANSLATOR_LISTENER (hyphen); + void acknowledge_lyric_syllable (Grob_info); + void listen_hyphen (Stream_event *); virtual void finalize (); @@ -74,7 +74,6 @@ Hyphen_engraver::acknowledge_lyric_syllable (Grob_info i) finished_hyphen_->set_bound (RIGHT, item); } -IMPLEMENT_TRANSLATOR_LISTENER (Hyphen_engraver, hyphen); void Hyphen_engraver::listen_hyphen (Stream_event *ev) { @@ -155,7 +154,13 @@ Hyphen_engraver::stop_translation_timestep () ev_ = 0; } -ADD_ACKNOWLEDGER (Hyphen_engraver, lyric_syllable); + +void +Hyphen_engraver::boot () +{ + ADD_LISTENER (Hyphen_engraver, hyphen); + ADD_ACKNOWLEDGER (Hyphen_engraver, lyric_syllable); +} ADD_TRANSLATOR (Hyphen_engraver, /* doc */ diff --git a/lily/includable-lexer.cc b/lily/includable-lexer.cc index 8c00965744..8567ec9171 100644 --- a/lily/includable-lexer.cc +++ b/lily/includable-lexer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/accidental-interface.hh b/lily/include/accidental-interface.hh index f58563cbbb..ef5e07ea66 100644 --- a/lily/include/accidental-interface.hh +++ b/lily/include/accidental-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,12 +30,10 @@ class Accidental_interface { public: DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_SCHEME_CALLBACK (height, (SCM)); - DECLARE_SCHEME_CALLBACK (width, (SCM)); DECLARE_SCHEME_CALLBACK (horizontal_skylines, (SCM)); - DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM)); + DECLARE_SCHEME_CALLBACK (height, (SCM)); + DECLARE_SCHEME_CALLBACK (remove_tied, (SCM)); - DECLARE_GROB_INTERFACE (); static SCM get_stencil (Grob *me); }; diff --git a/lily/include/accidental-placement.hh b/lily/include/accidental-placement.hh index 08ba1e163f..4c362cbd93 100644 --- a/lily/include/accidental-placement.hh +++ b/lily/include/accidental-placement.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,7 +35,6 @@ public: vector *real_acc); DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif /* ACCIDENTAL_PLACEMENT_HH */ diff --git a/lily/include/align-interface.hh b/lily/include/align-interface.hh index a17f523551..612c31c0d5 100644 --- a/lily/include/align-interface.hh +++ b/lily/include/align-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,7 +29,6 @@ class Align_interface public: DECLARE_SCHEME_CALLBACK (align_to_minimum_distances, (SCM)); DECLARE_SCHEME_CALLBACK (align_to_ideal_distances, (SCM)); - DECLARE_SCHEME_CALLBACK (full_score_pure_minimum_translations, (SCM)); static void align_elements_to_minimum_distances (Grob *, Axis a); static void align_elements_to_ideal_distances (Grob *); static vector get_minimum_translations (Grob *, vector const &, Axis a); @@ -41,7 +40,6 @@ public: static void add_element (Grob *, Grob *); static int get_count (Grob *, Grob *); - DECLARE_GROB_INTERFACE (); static Real get_pure_child_y_translation (Grob *, Grob *child, int start, int end); diff --git a/lily/include/all-font-metrics.hh b/lily/include/all-font-metrics.hh index 7f2ca8326a..a2d090a6df 100644 --- a/lily/include/all-font-metrics.hh +++ b/lily/include/all-font-metrics.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ Interface to all fonts (both system fonts and fonts loaded via Pango). */ -class All_font_metrics +class All_font_metrics : public Smob { Scheme_hash_table *otf_dict_; File_path search_path_; @@ -48,6 +48,7 @@ class All_font_metrics All_font_metrics (All_font_metrics const &); public: + SCM mark_smob () const; Index_to_charcode_map const *get_index_to_charcode_map (const string &filename, int face_index, diff --git a/lily/include/arpeggio.hh b/lily/include/arpeggio.hh index 1347219812..4624529098 100644 --- a/lily/include/arpeggio.hh +++ b/lily/include/arpeggio.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,7 +34,6 @@ public: DECLARE_SCHEME_CALLBACK (brew_chord_slur, (SCM)); DECLARE_SCHEME_CALLBACK (width, (SCM)); DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM)); - DECLARE_GROB_INTERFACE (); }; #endif /* ARPEGGIO_HH */ diff --git a/lily/include/articulations.hh b/lily/include/articulations.hh index 543c43ebd0..543bbf51e0 100644 --- a/lily/include/articulations.hh +++ b/lily/include/articulations.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Carl Sorensen + Copyright (C) 2010--2015 Carl Sorensen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/audio-column.hh b/lily/include/audio-column.hh index 42899dbd9e..059321f7c9 100644 --- a/lily/include/audio-column.hh +++ b/lily/include/audio-column.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/audio-element-info.hh b/lily/include/audio-element-info.hh index e03cceff73..9b2f18f525 100644 --- a/lily/include/audio-element-info.hh +++ b/lily/include/audio-element-info.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/audio-element.hh b/lily/include/audio-element.hh index 510d745a6d..e678c724d1 100644 --- a/lily/include/audio-element.hh +++ b/lily/include/audio-element.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/audio-item.hh b/lily/include/audio-item.hh index 43ed2e05a9..8c41d18a52 100644 --- a/lily/include/audio-item.hh +++ b/lily/include/audio-item.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Jan Nieuwenhuizen + Copyright (C) 1996--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -82,7 +82,7 @@ public: class Audio_note : public Audio_item { public: - Audio_note (Pitch p, Moment m, bool tie_event, Pitch transposition); + Audio_note (Pitch p, Moment m, bool tie_event, Pitch transposition, int velocity); // with tieWaitForNote, there might be a skip between the tied notes! void tie_to (Audio_note *, Moment skip = 0); @@ -93,6 +93,7 @@ public: Moment length_mom_; Pitch transposing_; Audio_dynamic *dynamic_; + int extra_velocity_; Audio_note *tied_; bool tie_event_; @@ -143,7 +144,7 @@ public: // Supported control functions. enum Control { - BALANCE = 0, PAN_POSITION, REVERB_LEVEL, CHORUS_LEVEL, + BALANCE = 0, PAN_POSITION, EXPRESSION, REVERB_LEVEL, CHORUS_LEVEL, // pseudo value for representing the size of the enum; must be kept last NUM_CONTROLS }; diff --git a/lily/include/audio-staff.hh b/lily/include/audio-staff.hh index 6fe9b8d6d4..a4a9d8a0d1 100644 --- a/lily/include/audio-staff.hh +++ b/lily/include/audio-staff.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Jan Nieuwenhuizen + Copyright (C) 1996--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ struct Audio_staff : public Audio_element { void add_audio_item (Audio_item *ai); - void output (Midi_stream &midi_stream_r, int track, bool port); + void output (Midi_stream &midi_stream_r, int track, bool port, int start_tick); Audio_staff (); @@ -36,4 +36,10 @@ struct Audio_staff : public Audio_element vector audio_items_; }; +// Subtype to identify a staff that represents the "control track" of a MIDI +// sequence (created by Control_track_performer). +struct Audio_control_track_staff : public Audio_staff +{ +}; + #endif // AUDIO_STAFF_HH diff --git a/lily/include/axis-group-interface.hh b/lily/include/axis-group-interface.hh index 5995c70e65..5e5152d237 100644 --- a/lily/include/axis-group-interface.hh +++ b/lily/include/axis-group-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -46,8 +46,6 @@ class Axis_group_interface DECLARE_SCHEME_CALLBACK (calc_staff_staff_spacing, (SCM)); DECLARE_SCHEME_CALLBACK (calc_pure_staff_staff_spacing, (SCM, SCM, SCM)); DECLARE_SCHEME_CALLBACK (calc_pure_relevant_grobs, (SCM)); - DECLARE_SCHEME_CALLBACK (calc_pure_relevant_items, (SCM)); - DECLARE_SCHEME_CALLBACK (calc_pure_relevant_spanners, (SCM)); DECLARE_SCHEME_CALLBACK (calc_pure_y_common, (SCM)); static SCM internal_calc_pure_relevant_grobs (Grob *, const string&); static Interval relative_group_extent (vector const &list, @@ -71,7 +69,6 @@ class Axis_group_interface static SCM calc_common (Grob *, Axis); static Real minimum_distance (Grob *, Grob *, Axis); static SCM calc_maybe_pure_staff_staff_spacing (Grob *, bool, int, int); - DECLARE_GROB_INTERFACE (); }; #endif /* AXIS_GROUP_INTERFACE_HH */ diff --git a/lily/include/bar-line.hh b/lily/include/bar-line.hh index 8f7b1a24dd..ef3739faf0 100644 --- a/lily/include/bar-line.hh +++ b/lily/include/bar-line.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,6 @@ class Bar_line { public: - DECLARE_GROB_INTERFACE (); static bool non_empty_barline (Grob *me); }; diff --git a/lily/include/beam-scoring-problem.hh b/lily/include/beam-scoring-problem.hh index 7e77d6794d..bbabfde7de 100644 --- a/lily/include/beam-scoring-problem.hh +++ b/lily/include/beam-scoring-problem.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify diff --git a/lily/include/beam.hh b/lily/include/beam.hh index 116ae6aa57..6dbdf4b23f 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -57,7 +57,6 @@ public: 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_cross_staff (Grob *); static bool is_knee (Grob *); @@ -75,7 +74,6 @@ public: DECLARE_SCHEME_CALLBACK (calc_beaming, (SCM)); DECLARE_SCHEME_CALLBACK (calc_stem_shorten, (SCM)); DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); - DECLARE_SCHEME_CALLBACK (calc_positions, (SCM)); DECLARE_SCHEME_CALLBACK (calc_normal_stems, (SCM)); DECLARE_SCHEME_CALLBACK (set_stem_lengths, (SCM)); DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM)); diff --git a/lily/include/beaming-pattern.hh b/lily/include/beaming-pattern.hh index 8b9318da5d..089bb31abd 100644 --- a/lily/include/beaming-pattern.hh +++ b/lily/include/beaming-pattern.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -80,6 +80,9 @@ private: Direction flag_direction (Beaming_options const &, vsize) const; void find_rhythmic_importance (Beaming_options const &); void unbeam_invisible_stems (); + Moment remaining_length (int idx) const; + int beam_count_for_rhythmic_position (int idx) const; + int beam_count_for_length (Moment len) const; }; #endif /* BEAMING_PATTERN_HH */ diff --git a/lily/include/bezier.hh b/lily/include/bezier.hh index d09c0ac8be..959afc5c4e 100644 --- a/lily/include/bezier.hh +++ b/lily/include/bezier.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,7 +48,7 @@ public: Polynomial polynomial (Axis)const; Offset curve_point (Real t) const; - Real slope_at_point (Real t) const; + Offset dir_at_point (Real t) const; Real curve_coordinate (Real t, Axis) const; static const int CONTROL_COUNT = 4; diff --git a/lily/include/book.hh b/lily/include/book.hh index e5dd86e041..0a71a6b9e4 100644 --- a/lily/include/book.hh +++ b/lily/include/book.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,11 +26,12 @@ #include "virtual-methods.hh" #include "smobs.hh" -class Book +class Book : public Smob { - DECLARE_SMOBS (Book); - public: + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Book (); SCM header_; Output_def *paper_; SCM scores_; @@ -62,6 +63,5 @@ protected: Output_def *layout); }; -DECLARE_UNSMOB (Book, book); #endif /* BOOK_HH */ diff --git a/lily/include/box.hh b/lily/include/box.hh index b0f8994311..d4a8655a42 100644 --- a/lily/include/box.hh +++ b/lily/include/box.hh @@ -9,10 +9,12 @@ #include "offset.hh" #include "smobs.hh" -class Box +class Box : public Simple_smob { +public: + static const char * const type_p_name_; +private: Interval interval_a_[NO_AXES]; - DECLARE_SIMPLE_SMOBS (Box); public: Interval &x () {return interval_a_[X_AXIS]; } Interval &y () { return interval_a_[Y_AXIS]; } @@ -40,6 +42,5 @@ public: Box (Interval ix, Interval iy); }; -DECLARE_UNSMOB (Box, box); #endif diff --git a/lily/include/break-align-interface.hh b/lily/include/break-align-interface.hh index 28ff88b159..cbb7f00c74 100644 --- a/lily/include/break-align-interface.hh +++ b/lily/include/break-align-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,11 +27,9 @@ class Break_alignment_interface { public: static vector ordered_elements (Grob *me); - DECLARE_GROB_INTERFACE (); static void add_element (Grob *me, Grob *add); static SCM break_align_order (Item *me); DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM element)); - DECLARE_SCHEME_CALLBACK (self_align_callback, (SCM element)); }; struct Break_aligned_interface @@ -39,13 +37,11 @@ struct Break_aligned_interface DECLARE_SCHEME_CALLBACK (calc_average_anchor, (SCM)); DECLARE_SCHEME_CALLBACK (calc_extent_aligned_anchor, (SCM)); DECLARE_SCHEME_CALLBACK (calc_break_visibility, (SCM)); - DECLARE_GROB_INTERFACE (); }; struct Break_alignable_interface { DECLARE_SCHEME_CALLBACK (self_align_callback, (SCM element)); - DECLARE_GROB_INTERFACE (); }; #endif // BREAK_ALIGN_INTERFACE_HH diff --git a/lily/include/breathing-sign.hh b/lily/include/breathing-sign.hh index a76b10ed79..84b33cd1b3 100644 --- a/lily/include/breathing-sign.hh +++ b/lily/include/breathing-sign.hh @@ -1,7 +1,7 @@ /* breathing-sign.hh - Copyright (c) 1999--2012 Michael Krause + Copyright (c) 1999--2015 Michael Krause written for the GNU LilyPond music typesetter */ @@ -21,15 +21,12 @@ class Grob; class Breathing_sign { public: - DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_SCHEME_CALLBACK (railtracks, (SCM)); DECLARE_SCHEME_CALLBACK (divisio_minima, (SCM)); DECLARE_SCHEME_CALLBACK (divisio_maior, (SCM)); DECLARE_SCHEME_CALLBACK (divisio_maxima, (SCM)); DECLARE_SCHEME_CALLBACK (finalis, (SCM)); DECLARE_SCHEME_CALLBACK (offset_callback, (SCM element)); - DECLARE_GROB_INTERFACE (); }; #endif // BREATHING_SIGN_HH diff --git a/lily/include/callback.hh b/lily/include/callback.hh new file mode 100644 index 0000000000..671140673f --- /dev/null +++ b/lily/include/callback.hh @@ -0,0 +1,186 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2016 David Kastrup + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#ifndef CALLBACK_HH +#define CALLBACK_HH + +// A callback wrapper creates a Scheme-callable version of a fixed C++ +// function. It is generally used for calling template-generated +// trampoline functions leading to calling a particular member +// function on a given Smob. +// +// The class itself is not templated in order not to explode the +// number of smob types: each class can support a particular call +// signature. +// +// Check the GET_LISTENER call for a typical use case. + +#include "smobs.hh" + +class Callback_wrapper : public Simple_smob +{ + // We use an ordinary function pointer pointing to a trampoline + // function (templated on the callback in question) instead of + // storing a member function pointer to a common base class like + // Smob_core. The additional code for the trampolines is negligible + // and the performance implications of using member function + // pointers in connection with inheritance are somewhat opaque as + // this involves an adjustment of the this pointer from Smob_core to + // the scope containing the callback. + SCM (*trampoline_) (SCM, SCM); + Callback_wrapper (SCM (*trampoline) (SCM, SCM)) + : trampoline_ (trampoline) + { } // Private constructor, use only in make_smob +public: + LY_DECLARE_SMOB_PROC (&Callback_wrapper::call, 2, 0, 0) + SCM call (SCM target, SCM arg) + { + return trampoline_ (target, arg); + } + // Callback wrappers are for an unchanging entity, so we do the Lisp + // creation just once on the first call of make_smob. So we only + // get a single Callback_wrapper instance for each differently + // templated make_smob call. + template + static SCM make_smob () + { + static SCM res = + scm_permanent_object (Callback_wrapper (trampoline).smobbed_copy ()); + return res; + } +}; + +class Callback2_wrapper : public Simple_smob +{ + // See Callback_wrapper for the details. Callback2_wrapper just + // supports an additional SCM argument as compared to + // Callback_wrapper but is otherwise identical. + SCM (*trampoline_) (SCM, SCM, SCM); + Callback2_wrapper (SCM (*trampoline) (SCM, SCM, SCM)) + : trampoline_ (trampoline) + { } // Private constructor, use only in make_smob +public: + LY_DECLARE_SMOB_PROC (&Callback2_wrapper::call, 3, 0, 0) + SCM call (SCM target, SCM arg1, SCM arg2) + { + return trampoline_ (target, arg1, arg2); + } + + template + static SCM make_smob () + { + static SCM res = + scm_permanent_object (Callback2_wrapper (trampoline).smobbed_copy ()); + return res; + } +}; + +class Callback0_wrapper : public Simple_smob +{ + // See Callback_wrapper for the details. Callback0_wrapper does not + // pass arguments but is otherwise identical to Callback_wrapper. + SCM (*trampoline_) (SCM); + Callback0_wrapper (SCM (*trampoline) (SCM)) + : trampoline_ (trampoline) + { } // Private constructor, use only in make_smob +public: + LY_DECLARE_SMOB_PROC (&Callback0_wrapper::call, 1, 0, 0) + SCM call (SCM target) + { + return trampoline_ (target); + } + + template + static SCM make_smob () + { + static SCM res = + scm_permanent_object (Callback0_wrapper (trampoline).smobbed_copy ()); + return res; + } + // Since there are no arguments at all, we might as well provide + // default trampolines + template + static SCM trampoline (SCM target) + { + T *t = LY_ASSERT_SMOB (T, target, 1); + return (t->*p) (); + } + + template + static SCM trampoline (SCM target) + { + T *t = LY_ASSERT_SMOB (T, target, 1); + (t->*p) (); + return SCM_UNSPECIFIED; + } + + template + static SCM make_smob () + { + return make_smob > (); + } + + template + static SCM make_smob () + { + return make_smob > (); + } +}; + +// The following will usually be used unsmobbified, relying on its +// constituents being protected independently. + +class Method_instance : public Simple_smob +{ + SCM method_, instance_; +public: + LY_DECLARE_SMOB_PROC (&Method_instance::call, 0, 0, 1) + SCM call (SCM rest) + { + return scm_apply_1 (method_, instance_, rest); + } + + Method_instance (SCM method, SCM instance) + : method_ (method), instance_ (instance) + { } + Method_instance (SCM method, Smob_core *instance) + : method_ (method), instance_ (instance->self_scm ()) + { } + SCM method () const { return method_; } + SCM instance () const { return instance_; } + SCM operator () () const + { + return scm_call_1 (method_, instance_); + } + SCM operator () (SCM arg) const + { + return scm_call_2 (method_, instance_, arg); + } + SCM operator () (SCM arg1, SCM arg2) const + { + return scm_call_3 (method_, instance_, arg1, arg2); + } + SCM mark_smob () const + { + scm_gc_mark (method_); + return instance_; + } +}; + +#endif diff --git a/lily/include/change-iterator.hh b/lily/include/change-iterator.hh index 2c9cb33125..1ba16c0907 100644 --- a/lily/include/change-iterator.hh +++ b/lily/include/change-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +30,10 @@ public: DECLARE_SCHEME_CALLBACK (constructor, ()); DECLARE_CLASSNAME (Change_iterator); + // returns an error message (empty on success) + static string change_to (Music_iterator &it, + SCM to_type, const string &to_id); + private: void error (const string&); }; diff --git a/lily/include/time-scaled-music-iterator.hh b/lily/include/change-sequence-iterator.hh similarity index 50% rename from lily/include/time-scaled-music-iterator.hh rename to lily/include/change-sequence-iterator.hh index 3985e0b0ea..2c2dfe3eb0 100644 --- a/lily/include/time-scaled-music-iterator.hh +++ b/lily/include/change-sequence-iterator.hh @@ -1,8 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys , - Erik Sandberg + Copyright (C) 2015 Daniel Eble LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,21 +17,31 @@ along with LilyPond. If not, see . */ -#ifndef TIME_SCALED_MUSIC_ITERATOR_HH -#define TIME_SCALED_MUSIC_ITERATOR_HH +#ifndef CHANGE_SEQUENCE_ITERATOR_HH +#define CHANGE_SEQUENCE_ITERATOR_HH -#include "sequential-iterator.hh" +#include "music-wrapper-iterator.hh" +#include "context.hh" -class Time_scaled_music_iterator : public Sequential_iterator +/** base for iterators that perform a sequence of timed context changes */ +class Change_sequence_iterator : public Music_wrapper_iterator { public: - DECLARE_SCHEME_CALLBACK (constructor, ()); - /* construction */ - DECLARE_CLASSNAME (Time_scaled_music_iterator); - Time_scaled_music_iterator (); + Change_sequence_iterator (); + protected: - virtual SCM get_music_list () const; + virtual void construct_children (); + virtual void process (Moment); + private: + // implement in derived class to effect a context change + virtual void change_to (const string &id) = 0; + +private: + // There is no need to protect this in derived_mark() because it is protected + // via Music_iterator::music_. + SCM change_list_; }; -#endif /* TIME_SCALED_MUSIC_ITERATOR_HH */ + +#endif /* CHANGE_SEQUENCE_ITERATOR_HH */ diff --git a/lily/include/chord-name.hh b/lily/include/chord-name.hh index f9e82ef41f..0df71f2fb4 100644 --- a/lily/include/chord-name.hh +++ b/lily/include/chord-name.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Jan Nieuwenhuizen + Copyright (C) 1999--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ class Chord_name { public: DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif // CHORD_NAME_HH diff --git a/lily/include/chord-tremolo-iterator.hh b/lily/include/chord-tremolo-iterator.hh index dc27f6693f..7f39b66460 100644 --- a/lily/include/chord-tremolo-iterator.hh +++ b/lily/include/chord-tremolo-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/clef.hh b/lily/include/clef.hh index b80093d245..8e3d10c0d3 100644 --- a/lily/include/clef.hh +++ b/lily/include/clef.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ struct Clef { DECLARE_SCHEME_CALLBACK (calc_glyph_name, (SCM)); DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif /* CLEF_HH */ diff --git a/lily/include/cluster.hh b/lily/include/cluster.hh index 2aee1886e5..81aec746f9 100644 --- a/lily/include/cluster.hh +++ b/lily/include/cluster.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Juergen Reuter + Copyright (C) 2002--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,6 @@ class Cluster public: DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif // CLUSTER_HH diff --git a/lily/include/coherent-ligature-engraver.hh b/lily/include/coherent-ligature-engraver.hh index bf422c40d1..78bfef8897 100644 --- a/lily/include/coherent-ligature-engraver.hh +++ b/lily/include/coherent-ligature-engraver.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Juergen Reuter + Copyright (C) 2003--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,6 +26,8 @@ class Coherent_ligature_engraver : public Ligature_engraver public: // no TRANSLATOR_DECLARATIONS (Coherent_ligature_engraver) needed // since this class is abstract + TRANSLATOR_INHERIT (Ligature_engraver); + DECLARE_TRANSLATOR_CALLBACKS (Coherent_ligature_engraver); protected: virtual void build_ligature (Spanner *ligature, diff --git a/lily/include/column-x-positions.hh b/lily/include/column-x-positions.hh index 2356294d9d..f4ef6a02dc 100644 --- a/lily/include/column-x-positions.hh +++ b/lily/include/column-x-positions.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/constrained-breaking.hh b/lily/include/constrained-breaking.hh index cb4c4f70be..e35fcc0bbe 100644 --- a/lily/include/constrained-breaking.hh +++ b/lily/include/constrained-breaking.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/context-def.hh b/lily/include/context-def.hh index 2776c81105..b068e204c0 100644 --- a/lily/include/context-def.hh +++ b/lily/include/context-def.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,8 +31,12 @@ The definition of an interpretation context as given in the input. The lists are stored in order of definition. */ -struct Context_def +struct Context_def : public Smob { + SCM mark_smob () const; + int print_smob (SCM, scm_print_state *) const; + static const char * const type_p_name_; + virtual ~Context_def (); private: /* these lists store the definition, in opposite order of entry @@ -76,12 +80,9 @@ public: void apply_default_property_operations (Context *); private: - DECLARE_SMOBS (Context_def); Context_def (); Context_def (Context_def const &); }; -DECLARE_UNSMOB (Context_def, context_def); #endif /* CONTEXT_DEF_HH */ - diff --git a/lily/include/context-handle.hh b/lily/include/context-handle.hh index f4fc18bd4d..1d5b849e13 100644 --- a/lily/include/context-handle.hh +++ b/lily/include/context-handle.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/context-mod.hh b/lily/include/context-mod.hh index d384d73a04..81b1f34e36 100644 --- a/lily/include/context-mod.hh +++ b/lily/include/context-mod.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Reinhold Kainhofer + Copyright (C) 2010--2015 Reinhold Kainhofer LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,8 +34,11 @@ Modifications for an interpretation context as given in the input. */ -struct Context_mod +struct Context_mod : public Simple_smob { + SCM mark_smob () const; + int print_smob (SCM, scm_print_state *) const; + static const char * const type_p_name_; private: SCM mods_; public: @@ -47,10 +50,7 @@ public: Context_mod (); Context_mod (Context_mod const &); Context_mod (SCM mod_list); - DECLARE_SIMPLE_SMOBS (Context_mod); }; -DECLARE_UNSMOB (Context_mod, context_mod); #endif /* CONTEXT_MOD_HH */ - diff --git a/lily/include/context.hh b/lily/include/context.hh index c779074007..468f612061 100644 --- a/lily/include/context.hh +++ b/lily/include/context.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,12 +28,17 @@ #include "std-vector.hh" #include "virtual-methods.hh" -class Context +class Context : public Smob { +public: + SCM mark_smob () const; + int print_smob (SCM, scm_print_state *) const; + static const char * const type_p_name_; + virtual ~Context (); +private: Scheme_hash_table *properties_dict () const; - Context (Context const &src); + Context (Context const &src); // Do not define! Not copyable! - DECLARE_SMOBS (Context); DECLARE_CLASSNAME (Context); void terminate (); @@ -74,8 +79,8 @@ protected: // UGH! initialises implementation_ friend SCM ly_make_global_translator (SCM); - DECLARE_LISTENER (set_property_from_event); - DECLARE_LISTENER (unset_property_from_event); + void set_property_from_event (SCM); + void unset_property_from_event (SCM); public: string id_string () const { return id_string_; } @@ -97,16 +102,17 @@ public: SCM internal_get_property (SCM name_sym) const; SCM properties_as_alist () const; Context *where_defined (SCM name_sym, SCM *value) const; + bool here_defined (SCM name_sym, SCM *value) const; void unset_property (SCM var_sym); void instrumented_set_property (SCM, SCM, const char *, int, const char *); void internal_set_property (SCM var_sym, SCM value); Context *create_context (Context_def *, const string&, SCM); - DECLARE_LISTENER (create_context_from_event); - DECLARE_LISTENER (acknowledge_infant); - DECLARE_LISTENER (remove_context); - DECLARE_LISTENER (change_parent); + void create_context_from_event (SCM); + void acknowledge_infant (SCM); + void remove_context (SCM); + void change_parent (SCM); void disconnect_from_parent (); void check_removal (); string context_name () const; @@ -136,21 +142,39 @@ public: */ void apply_property_operations (Context *tg, SCM pre_init_ops); -void execute_revert_property (Context *context, - SCM context_property, - SCM grob_property_path); void execute_pushpop_property (Context *trg, SCM prop, SCM eltprop, SCM val); -void sloppy_general_pushpop_property (Context *context, - SCM context_property, SCM grob_property_path, SCM val); -SCM updated_grob_properties (Context *tg, SCM sym); + +// Search for a context of the given type starting from the given context and +// moving toward the root of the tree. If the starting context matches, it is +// returned. +Context *find_context_above (Context *where, SCM type_sym); + +// Search for a context of the given type starting from the given context and +// moving toward the root of the tree. If found, return its child that was +// found on the way there. +Context *find_context_above_by_parent_type (Context *where, SCM parent_type); + +// Search for a context of the given type and ID starting from the given +// context and moving toward the leaves of the tree. If the starting context +// matches, it is returned. An empty ID matches any context of the given type. Context *find_context_below (Context *where, SCM type_sym, const string &id); + +// Search for a context of the given type and ID starting with the given +// context, then searching its descendants, then its parent's descendants, etc. +// An empty ID matches any context of the given type. +Context *find_context_near (Context *where, + SCM type_sym, const string &id); + +// Search for the top context (i.e. the ancestor with no parent) starting with +// the given context. +Context *find_top_context (Context *where); + bool melisma_busy (Context *); Context *get_voice_to_lyrics (Context *lyrics); -Grob *get_current_note_head (Context *voice, bool include_grace_notes); +Grob *get_current_note_head (Context *voice); Grob *get_current_rest (Context *voice); -DECLARE_UNSMOB (Context, context); Moment measure_position (Context const *context); Moment measure_position (Context const *context, Duration const *dur); @@ -162,14 +186,23 @@ bool check_repeat_count_visibility (Context const *context, SCM count); void set_context_property_on_children (Context *trans, SCM sym, SCM val); /* Shorthand for creating and broadcasting stream events. */ -#define send_stream_event(ctx, type, origin, ...) \ -{ \ - SCM props[] = { __VA_ARGS__, 0 }; \ - ctx->internal_send_stream_event (ly_symbol2scm (type), origin, props); \ -} +#define send_stream_event(ctx, type, origin, ...) \ + do { \ + SCM props[] = { __VA_ARGS__, 0 }; \ + ctx->internal_send_stream_event (ly_symbol2scm (type), origin, props); \ + } while (0) SCM nested_property_alist (SCM alist, SCM prop_path, SCM value); -SCM nested_property_revert_alist (SCM alist, SCM prop_path); +SCM nested_property (SCM alist, SCM prop_path, SCM fallback = SCM_EOL); +SCM nested_create_alist (SCM prop_path, SCM value); +SCM partial_list_copy (SCM alist, SCM tail, SCM newtail); +SCM assq_tail (SCM key, SCM alist, SCM alist_end); +SCM assv_tail (SCM key, SCM alist, SCM alist_end); +SCM assoc_tail (SCM key, SCM alist, SCM alist_end); SCM evict_from_alist (SCM, SCM, SCM); +SCM nalist_to_alist (SCM nalist, int nested); +extern SCM ly_context_set_property_x_proc; +extern SCM ly_context_unset_property_proc; +extern SCM ly_context_matched_pop_property_proc; #endif /* CONTEXT_HH */ diff --git a/lily/include/custos.hh b/lily/include/custos.hh index 3d998edd39..ddf38b0b8a 100644 --- a/lily/include/custos.hh +++ b/lily/include/custos.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Juergen Reuter + Copyright (C) 2000--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,6 @@ struct Custos { DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); private: static void add_streepjes (Grob *me, int pos, int interspaces, Stencil *custos_); diff --git a/lily/include/dimension-cache.hh b/lily/include/dimension-cache.hh index 6210be1285..24f2615b38 100644 --- a/lily/include/dimension-cache.hh +++ b/lily/include/dimension-cache.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/directional-element-interface.hh b/lily/include/directional-element-interface.hh index 8e00394f46..898f6f1d89 100644 --- a/lily/include/directional-element-interface.hh +++ b/lily/include/directional-element-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/dispatcher.hh b/lily/include/dispatcher.hh index 31bed90c7e..98a8626fd8 100644 --- a/lily/include/dispatcher.hh +++ b/lily/include/dispatcher.hh @@ -22,33 +22,38 @@ #include "listener.hh" #include "stream-event.hh" +#include "smobs.hh" -class Dispatcher +class Dispatcher : public Smob { +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Dispatcher (); +private: /* Hash table. Each event-class maps to a list of listeners. */ SCM listeners_; /* alist of dispatchers that we listen to. Each entry is a (dist . priority) pair. */ SCM dispatchers_; SCM listen_classes_; - DECLARE_LISTENER (dispatch); + void dispatch (SCM); /* priority counter. Listeners with low priority receive events first. */ int priority_count_; - void internal_add_listener (Listener, SCM event_class, int priority); + void internal_add_listener (SCM callback, SCM event_class, int priority); public: Dispatcher (); void broadcast (Stream_event *ev); bool is_listened_class (SCM); SCM listened_types (); void add_listener (Listener, SCM event_class); + void add_listener (SCM callback, SCM event_class); void remove_listener (Listener, SCM event_class); void register_as_listener (Dispatcher *dist); void unregister_as_listener (Dispatcher *dist); -protected: - DECLARE_SMOBS (Dispatcher); }; -DECLARE_UNSMOB (Dispatcher, dispatcher); #endif // DISPATCHER_HH diff --git a/lily/include/dot-column.hh b/lily/include/dot-column.hh index d6109bb876..6c975b1c56 100644 --- a/lily/include/dot-column.hh +++ b/lily/include/dot-column.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,7 +34,6 @@ public: static int compare (Grob *const &, Grob *const &); static void add_head (Grob *dotcol, Grob *rh); - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (side_position, (SCM)); DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM)); }; diff --git a/lily/include/dot-configuration.hh b/lily/include/dot-configuration.hh index c3013bb4fd..b4e2219e6c 100644 --- a/lily/include/dot-configuration.hh +++ b/lily/include/dot-configuration.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/dots.hh b/lily/include/dots.hh index d126934d10..7e1a1f6b52 100644 --- a/lily/include/dots.hh +++ b/lily/include/dots.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ class Dots { public: DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif // DOTS_HH diff --git a/lily/include/duration.hh b/lily/include/duration.hh index a7efb98eab..6233fc1b2d 100644 --- a/lily/include/duration.hh +++ b/lily/include/duration.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,10 +25,11 @@ /** A musical duration. */ -struct Duration +struct Duration : public Simple_smob { -public: - + static SCM equal_p (SCM, SCM); + int print_smob (SCM, scm_print_state *) const; + static const char * const type_p_name_; Duration (); Duration (int, int); Duration (Rational, bool scale); @@ -43,7 +44,6 @@ public: static int compare (Duration const &, Duration const &); DECLARE_SCHEME_CALLBACK (less_p, (SCM a, SCM b)); - DECLARE_SIMPLE_SMOBS (Duration); private: /// Logarithm of the base duration. @@ -54,9 +54,7 @@ private: }; INSTANTIATE_COMPARE (Duration, Duration::compare); -DECLARE_UNSMOB (Duration, duration); extern SCM Duration_type_p_proc; #endif // DURATION_HH - diff --git a/lily/include/engraver-group.hh b/lily/include/engraver-group.hh index 5738b8a9f2..39e52f3c52 100644 --- a/lily/include/engraver-group.hh +++ b/lily/include/engraver-group.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,23 +23,33 @@ #include "engraver.hh" #include "translator-group.hh" +class Announce_grob_info : public Grob_info +{ + Direction start_end_; +public: + Announce_grob_info (Grob_info gi, Direction start_end) + : Grob_info (gi), start_end_ (start_end) + { } + Direction start_end () const { return start_end_; } +}; + class Engraver_group : public Translator_group { protected: - vector announce_infos_; + vector announce_infos_; Drul_array acknowledge_hash_table_drul_; - DECLARE_LISTENER (override); - DECLARE_LISTENER (revert); + void override (SCM); + void revert (SCM); public: - VIRTUAL_COPY_CONSTRUCTOR (Translator_group, Engraver_group); - + DECLARE_CLASSNAME (Engraver_group); Engraver_group (); virtual void derived_mark () const; void do_announces (); virtual void connect_to_context (Context *c); virtual void disconnect_from_context (); - virtual void announce_grob (Grob_info); - int pending_grob_count () const; + virtual void announce_grob (Grob_info, Direction start_end, + Context *reroute_context = 0); + bool pending_grobs () const; private: virtual void acknowledge_grobs (); }; diff --git a/lily/include/engraver.hh b/lily/include/engraver.hh index 81713bb4e5..074b531389 100644 --- a/lily/include/engraver.hh +++ b/lily/include/engraver.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,8 @@ #ifndef ENGRAVER_HH #define ENGRAVER_HH +#include "callback.hh" +#include "grob.hh" #include "grob-info.hh" #include "translator.hh" @@ -29,7 +31,7 @@ */ class Engraver : public Translator { - Grob *internal_make_grob (SCM sym, SCM cause, char const *name, + Grob *internal_make_grob (SCM sym, SCM cause, char const *f, int l, char const *fun); friend SCM ly_engraver_make_grob (SCM, SCM, SCM); friend class Engraver_group; @@ -41,11 +43,23 @@ protected: Default: ignore the info */ virtual void acknowledge_grob (Grob_info) {} - virtual void announce_grob (Grob_info); - virtual void announce_end_grob (Grob_info); + virtual void announce_grob (Grob_info, Context *reroute_context = 0); + virtual void announce_end_grob (Grob_info, Context *reroute_context = 0); Engraver_group *get_daddy_engraver () const; public: + using Translator::trampoline; + template + static SCM trampoline (SCM target, SCM grob, SCM source_engraver) + { + T *t = LY_ASSERT_SMOB (T, target, 1); + Grob *g = LY_ASSERT_SMOB (Grob, grob, 2); + Engraver *e = LY_ASSERT_SMOB (Engraver, source_engraver, 3); + + (t->*callback) (Grob_info (e, g)); + return SCM_UNSPECIFIED; + } + /** Announce element. Default: pass on to daddy. Utility */ @@ -54,24 +68,25 @@ public: Grob_info make_grob_info (Grob *, SCM cause); - Item *internal_make_item (SCM sym, SCM cause, char const *name, + Item *internal_make_item (SCM sym, SCM cause, char const *f, int l, char const *fun); - Spanner *internal_make_spanner (SCM sym, SCM cause, char const *name, + Spanner *internal_make_spanner (SCM sym, SCM cause, char const *f, int l, char const *fun); - Paper_column *internal_make_column (SCM sym, char const *name, + Paper_column *internal_make_column (SCM sym, char const *f, int l, char const *fun); /** override other ctor */ - TRANSLATOR_DECLARATIONS (Engraver); + DECLARE_CLASSNAME (Engraver); + DECLARE_TRANSLATOR_CALLBACKS (Engraver); + Engraver (); }; -#define make_item(x, cause) internal_make_item (ly_symbol2scm (x), cause, x, __FILE__, __LINE__, __FUNCTION__) -#define make_spanner(x, cause) internal_make_spanner (ly_symbol2scm (x), cause, x, __FILE__, __LINE__, __FUNCTION__) -#define make_paper_column(x) internal_make_column (ly_symbol2scm (x), x, __FILE__, __LINE__, __FUNCTION__) +#define make_item(x, cause) internal_make_item (ly_symbol2scm (x), cause, __FILE__, __LINE__, __FUNCTION__) +#define make_spanner(x, cause) internal_make_spanner (ly_symbol2scm (x), cause, __FILE__, __LINE__, __FUNCTION__) +#define make_paper_column(x) internal_make_column (ly_symbol2scm (x), __FILE__, __LINE__, __FUNCTION__) -Engraver *unsmob_engraver (SCM eng); bool ly_is_grob_cause (SCM obj); #endif // ENGRAVER_HH diff --git a/lily/include/event-chord-iterator.hh b/lily/include/event-chord-iterator.hh index 04168f4209..8e9f4740ba 100644 --- a/lily/include/event-chord-iterator.hh +++ b/lily/include/event-chord-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/event-iterator.hh b/lily/include/event-iterator.hh index c22ebab1fc..ca71bdbaae 100644 --- a/lily/include/event-iterator.hh +++ b/lily/include/event-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys Erik Sandberg LilyPond is free software: you can redistribute it and/or modify diff --git a/lily/include/file-name-map.hh b/lily/include/file-name-map.hh index 5999f75582..3fb22d6a2a 100644 --- a/lily/include/file-name-map.hh +++ b/lily/include/file-name-map.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/fingering-column.hh b/lily/include/fingering-column.hh index 5052322f12..f422da99eb 100644 --- a/lily/include/fingering-column.hh +++ b/lily/include/fingering-column.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,6 @@ struct Fingering_column { static void add_fingering (Grob *, Grob *); DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM)); - DECLARE_GROB_INTERFACE (); static void do_x_positioning (Grob *me); static void do_y_positioning (Grob *me); }; diff --git a/lily/include/fluid.hh b/lily/include/fluid.hh new file mode 100644 index 0000000000..eb7ebfbae0 --- /dev/null +++ b/lily/include/fluid.hh @@ -0,0 +1,65 @@ +#ifndef FLUID_HH +#define FLUID_HH + +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2015 David Kastrup + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#include "lily-guile.hh" + +// Fluid is a wrapper class for cached storage of GUILE fluids. +// You use it like +// +// Fluid parser (Lily::f_parser); +// +// and when you first access `parser' as an SCM value, its value is +// fetched from the respective fluid (in this case `%parser', cf +// lily/lily-imports.cc) and cached for future accesses. +// +// Since fluids act as implicit function parameters, it can only be +// meaningfully employed for variables of automatic +// (function/block-local) duration. +// +// Once you create a fluid cache, it should be passed around by +// reference in order to keep the performance impact low. + +class Fluid +{ + SCM const fluid_; // the fluid itself + SCM value_; // its cached value, SCM_UNDEFINED if unset + + Fluid (); // No accessible default constructor + Fluid (const Fluid &); // Don't copy + // Caching fluids only makes sense if we really treat them as + // function parameters, namely only modify them synchronized to + // function calls, like when using scm_with_fluid. So no assignment + // operator or any other interface to scm_fluid_set_x. + Fluid & operator= (const Fluid &); +public: + Fluid (SCM fluid) : fluid_ (fluid), value_ (SCM_UNDEFINED) + { + } + operator SCM () + { + if (SCM_UNBNDP (value_)) + value_ = scm_fluid_ref (fluid_); + return value_; + } +}; + +#endif diff --git a/lily/include/font-interface.hh b/lily/include/font-interface.hh index 8d4df894d7..43fd271dd6 100644 --- a/lily/include/font-interface.hh +++ b/lily/include/font-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,6 @@ struct Font_interface static SCM text_font_alist_chain (Grob *); static SCM music_font_alist_chain (Grob *); static Font_metric *get_default_font (Grob *); - DECLARE_GROB_INTERFACE (); }; #endif /* FONT_INTERFACE_HH */ diff --git a/lily/include/font-metric.hh b/lily/include/font-metric.hh index 4c11989729..e385a1e7af 100644 --- a/lily/include/font-metric.hh +++ b/lily/include/font-metric.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,8 +30,14 @@ typedef std::map Index_to_charcode_map; -class Font_metric +class Font_metric : public Smob { +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Font_metric (); +private: DECLARE_CLASSNAME (Font_metric); public: @@ -54,7 +60,6 @@ public: virtual Stencil find_by_name (string) const; virtual SCM sub_fonts () const; virtual SCM font_file_name () const; - DECLARE_SMOBS (Font_metric); private: /* No copying, no implicit copy constructor. */ @@ -66,7 +71,6 @@ protected: Font_metric (); }; -DECLARE_UNSMOB (Font_metric, metrics); char *pfb2pfa (Byte const *pfb, int length); diff --git a/lily/include/freetype.hh b/lily/include/freetype.hh index 89104bc888..e4009ba072 100644 --- a/lily/include/freetype.hh +++ b/lily/include/freetype.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/global-context.hh b/lily/include/global-context.hh index 1ea2b38dc7..75b52c95ae 100644 --- a/lily/include/global-context.hh +++ b/lily/include/global-context.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,7 +42,7 @@ public: void apply_finalizations (); void add_finalization (SCM); - DECLARE_LISTENER (prepare); + void prepare (SCM); virtual SCM get_output (); virtual Output_def *get_output_def () const; virtual Moment now_mom () const; @@ -55,6 +55,5 @@ protected: }; SCM ly_format_output (SCM); -Global_context *unsmob_global_context (SCM x); #endif // GLOBAL_CONTEXT_HH diff --git a/lily/include/global-ctor.hh b/lily/include/global-ctor.hh index cb082b19ab..62c4ce8c69 100644 --- a/lily/include/global-ctor.hh +++ b/lily/include/global-ctor.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/grace-fixup.hh b/lily/include/grace-fixup.hh index 03e8129ed9..8a79442535 100644 --- a/lily/include/grace-fixup.hh +++ b/lily/include/grace-fixup.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/grace-iterator.hh b/lily/include/grace-iterator.hh index 08a69abffa..aee58b8c50 100644 --- a/lily/include/grace-iterator.hh +++ b/lily/include/grace-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,7 +24,9 @@ class Grace_iterator : public Music_wrapper_iterator { + bool in_grace_; public: + Grace_iterator() : in_grace_ (false) { } virtual void process (Moment); DECLARE_SCHEME_CALLBACK (constructor, ()); DECLARE_CLASSNAME (Grace_iterator); diff --git a/lily/include/gregorian-ligature-engraver.hh b/lily/include/gregorian-ligature-engraver.hh index a65d54f67b..fcac99c322 100644 --- a/lily/include/gregorian-ligature-engraver.hh +++ b/lily/include/gregorian-ligature-engraver.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Juergen Reuter + Copyright (C) 2003--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,10 +29,12 @@ public: // no TRANSLATOR_DECLARATIONS (Gregorian_ligature_engraver) needed // since this class is abstract + TRANSLATOR_INHERIT(Coherent_ligature_engraver); + DECLARE_TRANSLATOR_CALLBACKS (Gregorian_ligature_engraver); protected: Gregorian_ligature_engraver (); - virtual void listen_pes_or_flexa (Stream_event *ev); + void listen_pes_or_flexa (Stream_event *ev); virtual void build_ligature (Spanner *ligature, vector const &primitives); virtual void transform_heads (Spanner *ligature, diff --git a/lily/include/gregorian-ligature.hh b/lily/include/gregorian-ligature.hh index 957e796ba1..0089434163 100644 --- a/lily/include/gregorian-ligature.hh +++ b/lily/include/gregorian-ligature.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Juergen Reuter + Copyright (C) 2003--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ class Grob; class Gregorian_ligature { public: - DECLARE_GROB_INTERFACE (); static string prefixes_to_str (Grob *); }; diff --git a/lily/include/grid-line-interface.hh b/lily/include/grid-line-interface.hh index 85128ce6e6..2a4760a717 100644 --- a/lily/include/grid-line-interface.hh +++ b/lily/include/grid-line-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,13 +29,11 @@ public: static void add_grid_point (Grob *me, Grob *b); DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (width, (SCM)); - DECLARE_GROB_INTERFACE (); }; class Grid_point_interface { public: - DECLARE_GROB_INTERFACE (); }; #endif /* GRID_LINE_INTERFACE_HH */ diff --git a/lily/include/grob-array.hh b/lily/include/grob-array.hh index c21fc3cf50..ca925b4291 100644 --- a/lily/include/grob-array.hh +++ b/lily/include/grob-array.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,12 +24,16 @@ #include "smobs.hh" #include "std-vector.hh" -class Grob_array +class Grob_array : public Simple_smob { +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; +private: vector grobs_; bool ordered_; - DECLARE_SIMPLE_SMOBS (Grob_array); Grob_array (); public: @@ -37,23 +41,34 @@ public: void set_ordered (bool b) { ordered_ = b; } Item *item (vsize i); Spanner *spanner (vsize i); - Grob *grob (vsize i) { return grobs_.at (i); } + Grob *grob (vsize i) const { return grobs_.at (i); } vsize size () const { return grobs_.size (); } - bool empty () const; + bool empty () const { return grobs_.empty (); } void remove_duplicates (); - void clear (); + void clear () { grobs_.clear (); } void add (Grob *x) { grobs_.push_back (x); } - void set_array (vector const &src); - vector &array_reference (); - vector const &array () const; + void set_array (vector const &src) { grobs_ = src; } + vector &array_reference () { return grobs_; } + vector const &array () const { return grobs_; } static SCM make_array (); + + // Remove grobs that do not satisfy the predicate, leaving the order + // unchanged. + void filter (bool (*predicate) (const Grob *)); + + // Run a function on all grobs in this array. If the function returns null, + // remove the original grob, reducing the size of the array. If the function + // returns a Grob, replace the original grob with the returned Grob. + void filter_map (Grob * (*map_fun) (Grob *)); + + // Like src.filter_map (f), but store the result in this array instead of + // mutating the input. + void filter_map_assign (const Grob_array &src, Grob * (*map_fun) (Grob *)); }; -DECLARE_UNSMOB (Grob_array, grob_array); vector const &ly_scm2link_array (SCM x); SCM grob_list_to_grob_array (SCM lst); SCM grob_array_to_list (Grob_array *array); #endif /* GROB_ARRAY_HH */ - diff --git a/lily/include/grob-info.hh b/lily/include/grob-info.hh index c62df2c20c..6d418379c9 100644 --- a/lily/include/grob-info.hh +++ b/lily/include/grob-info.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,8 +17,8 @@ along with LilyPond. If not, see . */ -#ifndef STAFFELEMINFO_HH -#define STAFFELEMINFO_HH +#ifndef GROB_INFO_HH +#define GROB_INFO_HH #include "lily-guile.hh" #include "lily-proto.hh" @@ -31,11 +31,8 @@ class Grob_info { Translator *origin_trans_; Grob *grob_; - Direction start_end_; - friend class Engraver; public: - Direction start_end () const { return start_end_; } Grob *grob () const { return grob_; } Translator *origin_translator () const { return origin_trans_; } @@ -49,14 +46,6 @@ public: Item *item () const; Spanner *spanner () const; static bool less (Grob_info i, Grob_info j); - - /* - For contexts that change staves, it may be desirable to emit a - grob into a staff other than the current one. If this is non-null, - this grob should be announced in this context instead of the - daddy_context_. - */ - Context *rerouting_daddy_context_; }; -#endif // STAFFELEMINFO_HH +#endif // GROB_INFO_HH diff --git a/lily/include/grob-interface.hh b/lily/include/grob-interface.hh index b060e85589..bde5f5263d 100644 --- a/lily/include/grob-interface.hh +++ b/lily/include/grob-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,22 +21,15 @@ #define INTERFACE_HH #include "lily-guile.hh" +#include "protected-scm.hh" -#define DECLARE_GROB_INTERFACE() \ - static SCM interface_symbol_; \ - static bool has_interface (Grob*) - -#define ADD_INTERFACE(cl, b, c) \ - SCM cl::interface_symbol_; \ - bool cl::has_interface (Grob *me) \ - { \ - return me->internal_has_interface (interface_symbol_); \ - } \ - void cl ## _init_ifaces () \ - { \ - cl::interface_symbol_ = add_interface (#cl, b, c); \ - } \ - ADD_SCM_INIT_FUNC (cl ## ifaces, cl ## _init_ifaces); +class Grob; + +#define ADD_INTERFACE(cl, b, c) \ + Grob_interface cl ## _interface_initializer; \ + template <> char const *Grob_interface::cxx_name_ (#cl); \ + template <> char const *Grob_interface::description_ (b); \ + template <> char const *Grob_interface::variables_ (c); SCM add_interface (char const *cxx_name, char const *descr, @@ -46,5 +39,33 @@ SCM ly_add_interface (SCM, SCM, SCM); void internal_add_interface (SCM, SCM, SCM); SCM ly_all_grob_interfaces (); +template +class Grob_interface +{ +public: + Grob_interface () + { + add_scm_init_func (Grob_interface::init); + } + +private: + static void init () + { + interface_symbol_ = ::add_interface (cxx_name_, description_, variables_); + } + + template + friend bool has_interface(Grob *); + +private: + static Protected_scm interface_symbol_; + static char const *cxx_name_; + static char const *description_; + static char const *variables_; +}; + +template +Protected_scm Grob_interface::interface_symbol_; + #endif /* INTERFACE_HH */ diff --git a/lily/include/grob-properties.hh b/lily/include/grob-properties.hh new file mode 100644 index 0000000000..5822dd01fb --- /dev/null +++ b/lily/include/grob-properties.hh @@ -0,0 +1,62 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2014--2015 David Kastrup + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +// This module is concerned with managing grob-properties (more +// exactly, grob property templates, as they are not yet part of a +// grob) inside of context properties, in a context-hierarchical +// manner, with one stack for properties and subproperties per +// context. + +#ifndef GROB_PROPERTIES_HH +#define GROB_PROPERTIES_HH + +#include "lily-proto.hh" + +// Several algorithms on Grob_properties need self-identifying +// information to work properly, but there is no point in storing them +// in the Grob_properties data structure itself. Instead we create a +// reflective data structure containing all necessary information for +// the algorithms processing Grob_properties. + +class Grob_property_info { + Context * const context_; + SCM const symbol_; + Grob_properties *props_; +public: + Grob_property_info (Context *context, SCM symbol, Grob_properties *props = 0) + : context_ (context), symbol_ (symbol), props_ (props) + { } + operator bool () { return props_; } + Grob_property_info find (); + bool check (); + bool create (); + SCM updated (); + SCM push (SCM path, SCM value); + SCM temporary_override (SCM path, SCM value); + SCM temporary_revert (SCM path); + void matched_pop (SCM); + void pop (SCM path); + void pushpop (SCM path, SCM value) + { + if (SCM_UNBNDP (value)) + return pop (path); + push (path, value); + } +}; +#endif diff --git a/lily/include/grob.hh b/lily/include/grob.hh index a0902d6d89..a9408f09a2 100644 --- a/lily/include/grob.hh +++ b/lily/include/grob.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,10 +27,14 @@ #include -class Grob +class Grob : public Smob { +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Grob (); private: - DECLARE_SMOBS (Grob); DECLARE_CLASSNAME (Grob); void init (); @@ -133,7 +137,6 @@ public: /* interfaces */ bool internal_has_interface (SCM intf); - DECLARE_GROB_INTERFACE (); /* offsets */ void translate_axis (Real, Axis); @@ -144,7 +147,7 @@ public: /* extents */ Interval extent (Grob *refpoint, Axis) const; void flush_extent_cache (Axis); - virtual Interval pure_height (Grob *refpoint, int start_col, int end_col); + virtual Interval pure_y_extent (Grob *refpoint, int start, int end); Interval maybe_pure_extent (Grob *refpoint, Axis, bool pure, int start, int end); /* refpoints */ @@ -171,10 +174,11 @@ public: static SCM internal_skylines_from_element_stencils (SCM, Axis); }; -/* smob utilities */ -DECLARE_UNSMOB (Grob, grob); -Spanner *unsmob_spanner (SCM); -Item *unsmob_item (SCM); +template +inline bool has_interface(Grob *g) +{ + return g && g->internal_has_interface (Grob_interface::interface_symbol_); +} /* unification */ void uniquify (vector &); diff --git a/lily/include/group-interface.hh b/lily/include/group-interface.hh deleted file mode 100644 index c40d615299..0000000000 --- a/lily/include/group-interface.hh +++ /dev/null @@ -1,41 +0,0 @@ -/* - This file is part of LilyPond, the GNU music typesetter. - - Copyright (C) 1999--2012 Han-Wen Nienhuys - - LilyPond is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - LilyPond is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LilyPond. If not, see . -*/ - -#ifndef GROUP_INTERFACE_HH -#define GROUP_INTERFACE_HH - -#include "grob.hh" -#include "std-string.hh" -/** - Look at Score element ELT as thing which has a list property called - NAME_. Normally the list would contain Grobs, but - sometimes it can be different things. - - todo: reename as list_interface? -*/ - -struct Group_interface -{ -public: - static int count (Grob *, SCM); - static void add_thing (Grob *, SCM, SCM); -}; - -#endif /* GROUP_INTERFACE_HH */ - diff --git a/lily/include/hairpin.hh b/lily/include/hairpin.hh index db072f48db..a2e2f8bf9e 100644 --- a/lily/include/hairpin.hh +++ b/lily/include/hairpin.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,6 @@ public: DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (broken_bound_padding, (SCM)); DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM)); - DECLARE_GROB_INTERFACE (); }; #endif // HAIRPIN_HH diff --git a/lily/include/hara-kiri-group-spanner.hh b/lily/include/hara-kiri-group-spanner.hh index e0cbac3c9c..ad5c1d64a2 100644 --- a/lily/include/hara-kiri-group-spanner.hh +++ b/lily/include/hara-kiri-group-spanner.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,8 +31,6 @@ public: DECLARE_SCHEME_CALLBACK (calc_skylines, (SCM smob)); DECLARE_SCHEME_CALLBACK (pure_height, (SCM smob, SCM start, SCM end)); DECLARE_SCHEME_CALLBACK (force_hara_kiri_in_y_parent_callback, (SCM)); - DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM)); - DECLARE_GROB_INTERFACE (); static bool request_suicide (Grob *me, int start, int end); static bool request_suicide_alone (Grob *me, int start, int end); static void consider_suicide (Grob *me); diff --git a/lily/include/horizontal-bracket.hh b/lily/include/horizontal-bracket.hh index 4226d7c553..3a1692fc11 100644 --- a/lily/include/horizontal-bracket.hh +++ b/lily/include/horizontal-bracket.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,7 +31,6 @@ struct Horizontal_bracket static Stencil make_enclosing_bracket (Grob *me, Grob *refpoint, vector grobs, Axis a, Direction dir); - DECLARE_GROB_INTERFACE (); }; #endif /* HORIZONTAL_BRACKET_HH */ diff --git a/lily/include/includable-lexer.hh b/lily/include/includable-lexer.hh index 8378404513..bfc3d81718 100644 --- a/lily/include/includable-lexer.hh +++ b/lily/include/includable-lexer.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/input.hh b/lily/include/input.hh index a11f8f8c1b..aab0d117a6 100644 --- a/lily/include/input.hh +++ b/lily/include/input.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,16 +21,21 @@ #define INPUT_HH #include "lily-proto.hh" +#include "smobs.hh" /** Base class for anything that records its poisition in the parse file. */ -class Input +class Input : public Simple_smob { char const *start_; char const *end_; Source_file *source_file_; public: + static const char * const type_p_name_; + int print_smob (SCM, scm_print_state *) const; + static SCM equal_p (SCM, SCM); + SCM mark_smob () const; Source_file *get_source_file () const; char const *start () const; char const *end () const; @@ -66,11 +71,14 @@ protected: string message_string (const string &msg) const; }; -#include "smobs.hh" - -SCM make_input (Input spot); -Input *unsmob_input (SCM); - extern Input dummy_input_global; +// The parser calls syntax functions with a lot of arguments +SCM with_location (SCM loc, SCM proc); +SCM with_location (SCM loc, SCM proc, SCM); +SCM with_location (SCM loc, SCM proc, SCM, SCM); +SCM with_location (SCM loc, SCM proc, SCM, SCM, SCM); +SCM with_location (SCM loc, SCM proc, SCM, SCM, SCM, SCM); +SCM with_location (SCM loc, SCM proc, SCM, SCM, SCM, SCM, SCM); + #endif // INPUT_HH diff --git a/lily/include/interval-minefield.hh b/lily/include/interval-minefield.hh index e7e237e949..fc748c17b6 100644 --- a/lily/include/interval-minefield.hh +++ b/lily/include/interval-minefield.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify diff --git a/lily/include/item.hh b/lily/include/item.hh index c67b160636..07f1261a52 100644 --- a/lily/include/item.hh +++ b/lily/include/item.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -52,9 +52,8 @@ public: virtual Paper_column *get_column () const; virtual void handle_prebroken_dependencies (); virtual Interval_t spanned_rank_interval () const; - virtual Interval pure_height (Grob *ref, int start, int end); + virtual Interval pure_y_extent (Grob *ref, int start, int end); virtual void cache_pure_height (Interval height); - DECLARE_GROB_INTERFACE (); protected: virtual void discretionary_processing (); void copy_breakable_items (); diff --git a/lily/include/keyword.hh b/lily/include/keyword.hh index 26cc606b89..0f36fe812b 100644 --- a/lily/include/keyword.hh +++ b/lily/include/keyword.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/kievan-ligature.hh b/lily/include/kievan-ligature.hh index cb6494ca79..d3d425a515 100644 --- a/lily/include/kievan-ligature.hh +++ b/lily/include/kievan-ligature.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2013 Aleksandr Andreev + Copyright (C) 2013--2015 Aleksandr Andreev LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,6 @@ struct Kievan_ligature { DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif /* KIEVAN_LIGATURE_HH */ diff --git a/lily/include/least-squares.hh b/lily/include/least-squares.hh index 0f258bf893..5a8c39bacc 100644 --- a/lily/include/least-squares.hh +++ b/lily/include/least-squares.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/ligature-engraver.hh b/lily/include/ligature-engraver.hh index 1ad21499b8..a46c3fe22a 100644 --- a/lily/include/ligature-engraver.hh +++ b/lily/include/ligature-engraver.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Juergen Reuter + Copyright (C) 2002--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,9 +30,9 @@ protected: void stop_translation_timestep (); virtual void finalize (); - DECLARE_ACKNOWLEDGER (rest); - DECLARE_ACKNOWLEDGER (ligature_head); - virtual void listen_ligature (Stream_event *ev); + void acknowledge_rest (Grob_info); + void acknowledge_ligature_head (Grob_info); + void listen_ligature (Stream_event *ev); void process_music (); virtual Spanner *create_ligature_spanner () = 0; virtual void typeset_ligature (Spanner *ligature, @@ -43,6 +43,7 @@ protected: public: // no TRANSLATOR_DECLARATIONS (Ligature_engraver) needed since this // class is abstract + DECLARE_TRANSLATOR_CALLBACKS (Ligature_engraver); private: Drul_array events_drul_; diff --git a/lily/include/lily-guile-macros.hh b/lily/include/lily-guile-macros.hh index a273f5ac5d..869a52af32 100644 --- a/lily/include/lily-guile-macros.hh +++ b/lily/include/lily-guile-macros.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,6 +22,25 @@ #include "config.hh" +#if GUILEV2 +// if Guile's internal representation switches to utf8, this should be +// changed accordingly for efficiency's sake. This is used for +// strings known to be in ASCII entirely, including any string +// constants in the C code. +#define scm_from_ascii_string scm_from_latin1_string +#define scm_from_ascii_stringn scm_from_latin1_stringn +#define scm_from_ascii_symbol scm_from_latin1_symbol +#else +#define scm_from_ascii_string scm_from_locale_string +#define scm_from_ascii_stringn scm_from_locale_stringn +#define scm_from_ascii_symbol scm_from_locale_symbol +#define scm_from_latin1_string scm_from_locale_string +#define scm_from_latin1_stringn scm_from_locale_stringn +#define scm_from_utf8_string scm_from_locale_string +#define scm_from_utf8_symbol scm_from_locale_symbol +#define scm_to_utf8_string scm_to_locale_string +#endif + #ifndef SMOB_FREE_RETURN_VAL #define SMOB_FREE_RETURN_VAL(CL) 0 #endif @@ -48,7 +67,7 @@ typedef SCM (*scm_t_subr) (GUILE_ELLIPSIS); /* this lets us "overload" macros such as get_property to take symbols as well as strings */ inline SCM -scm_or_str2symbol (char const *c) { return scm_from_locale_symbol (c); } +scm_or_str2symbol (char const *c) { return scm_from_utf8_symbol (c); } inline SCM scm_or_str2symbol (SCM s) @@ -69,7 +88,7 @@ scm_or_str2symbol (SCM s) SCM value = cached; \ if (__builtin_constant_p ((x))) \ { \ - if (!cached) \ + if (!SCM_UNPACK (cached)) \ value = cached = scm_gc_protect_object (scm_or_str2symbol (x)); \ } \ else \ @@ -77,32 +96,9 @@ scm_or_str2symbol (SCM s) value; \ }) #else -inline SCM ly_symbol2scm (char const *x) { return scm_from_locale_symbol ((x)); } +inline SCM ly_symbol2scm (char const *x) { return scm_from_utf8_symbol ((x)); } #endif -/* - TODO: rename me to ly_c_lily_module_eval - - we don't have to protect the result; it's already part of the - exports list of the module. -*/ - -#define ly_lily_module_constant(x) \ - ({ \ - static SCM cached; \ - /* We store this one locally, since G++ -O2 fucks up else */ \ - SCM value = cached; \ - if (__builtin_constant_p ((x))) \ - { \ - if (!cached) \ - value = cached = scm_eval (scm_from_locale_symbol (x), \ - global_lily_module); \ - } \ - else \ - value = scm_eval (scm_from_locale_symbol (x), global_lily_module); \ - value; \ - }) - /* Adds the NAME as a Scheme function, and a variable to store the SCM version of the function in the static variable NAME_proc @@ -110,22 +106,6 @@ inline SCM ly_symbol2scm (char const *x) { return scm_from_locale_symbol ((x)); #define DECLARE_SCHEME_CALLBACK(NAME, ARGS) \ static SCM NAME ARGS; \ static SCM NAME ## _proc -#define ADD_TYPE_PREDICATE(func, type_name) \ - void \ - func ## _type_adder () \ - {\ - ly_add_type_predicate ((Type_predicate_ptr)func, type_name); \ - }\ - ADD_SCM_INIT_FUNC(func ## _type_adder_ctor, \ - func ## _type_adder); -#define ADD_TYPE_PREDICATE(func, type_name) \ - void \ - func ## _type_adder () \ - {\ - ly_add_type_predicate ((Type_predicate_ptr)func, type_name); \ - }\ - ADD_SCM_INIT_FUNC(func ## _type_adder_ctor, \ - func ## _type_adder); string mangle_cxx_identifier (string); @@ -213,7 +193,7 @@ void ly_check_name (const string &cxx, const string &fname); #define set_object(x, y) internal_set_object (ly_symbol2scm (x), y) #define del_property(x) internal_del_property (ly_symbol2scm (x)) -#ifndef NDEBUG +#ifdef DEBUG /* TODO: include modification callback support here, perhaps through intermediate Grob::instrumented_set_property( .. __LINE__ ). @@ -233,6 +213,28 @@ void ly_check_name (const string &cxx, const string &fname); } \ } -#define LY_ASSERT_SMOB(klass, var, number) LY_ASSERT_TYPE(klass::unsmob, var, number) +template +T *unsmob (SCM var); + +void ly_wrong_smob_arg (bool pred (SCM), SCM var, int number, const char *fun); + +// Do not call this directly. +// Use LY_ASSERT_SMOB() which supplies the function name automatically. +template +inline T *ly_assert_smob (SCM var, int number, const char *fun) +{ + T *smob = unsmob (var); + if (smob) + return smob; + + ly_wrong_smob_arg (T::is_smob, var, number, fun); + return 0; +} + +// Could be just implemented using LY_ASSERT_TYPE, but this variant +// saves a slight amount of code + +#define LY_ASSERT_SMOB(klass, var, number) \ + ly_assert_smob (var, number, __FUNCTION__) #endif /* LILY_GUILE_MACROS_HH */ diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh index 4592b2497d..d1ca0424bb 100644 --- a/lily/include/lily-guile.hh +++ b/lily/include/lily-guile.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,7 +37,6 @@ #include "guile-compatibility.hh" #include "interval.hh" #include "lily-guile-macros.hh" -#include "ly-module.hh" #include "std-vector.hh" /** Conversion functions follow the GUILE naming convention, i.e. @@ -48,8 +47,6 @@ string ly_scm_write_string (SCM s); SCM ly_deep_copy (SCM); SCM ly_truncate_list (int k, SCM lst); -extern SCM global_lily_module; - string gulp_file_to_string (const string &fn, bool must_exist, int size); SCM ly_string2scm (string const &s); @@ -66,6 +63,7 @@ SCM ly_assoc_cdr (SCM key, SCM alist); SCM ly_assoc_get (SCM key, SCM alist, SCM default_value, SCM strict_checking = SCM_BOOL_F); Interval ly_scm2interval (SCM); Drul_array ly_scm2realdrul (SCM); +SCM ly_memv (SCM, SCM); Slice int_list_to_slice (SCM l); SCM ly_interval2scm (Drul_array); char *ly_scm2str0 (SCM str); @@ -99,7 +97,8 @@ SCM ly_hash_table_keys (SCM tab); SCM ly_assoc_prepend_x (SCM alist, SCM key, SCM val); inline bool ly_is_list (SCM x) { return scm_is_true (scm_list_p (x)); } -inline bool ly_cheap_is_list (SCM x) { return scm_is_pair (x) || x == SCM_EOL; } +inline bool ly_cheap_is_list (SCM x) { return scm_is_pair (x) || scm_is_null (x); } +inline bool ly_is_module (SCM x) { return SCM_MODULEP (x); } inline bool ly_is_procedure (SCM x) { return scm_is_true (scm_procedure_p (x)); } inline bool ly_is_port (SCM x) { return scm_is_true (scm_port_p (x)); } @@ -121,15 +120,15 @@ inline SCM ly_bool2scm (bool x) { return scm_from_bool (x); } inline SCM ly_append2 (SCM x1, SCM x2) { - return scm_append (scm_listify (x1, x2, SCM_UNDEFINED)); + return scm_append (scm_list_2 (x1, x2)); } inline SCM ly_append3 (SCM x1, SCM x2, SCM x3) { - return scm_append (scm_listify (x1, x2, x3, SCM_UNDEFINED)); + return scm_append (scm_list_3 (x1, x2, x3)); } inline SCM ly_append4 (SCM x1, SCM x2, SCM x3, SCM x4) { - return scm_append (scm_listify (x1, x2, x3, x4, SCM_UNDEFINED)); + return scm_append (scm_list_4 (x1, x2, x3, x4)); } /* @@ -202,8 +201,6 @@ inline SCM ly_car (SCM x) { return SCM_CAR (x); } inline SCM ly_cdr (SCM x) { return SCM_CDR (x); } inline bool ly_is_pair (SCM x) { return SCM_I_CONSP (x); } -#include "std-vector.hh" - template SCM ly_cxx_vector_to_list (vector const &src) @@ -218,4 +215,10 @@ ly_cxx_vector_to_list (vector const &src) SCM ly_offsets2scm (vector os); vector ly_scm2offsets (SCM s); +/* For backward compatability with Guile 1.8 */ +#if !HAVE_GUILE_HASH_FUNC +typedef SCM (*scm_t_hash_fold_fn) (GUILE_ELLIPSIS); +typedef SCM (*scm_t_hash_handle_fn) (GUILE_ELLIPSIS); +#endif + #endif /* LILY_GUILE_HH */ diff --git a/lily/include/lily-imports.hh b/lily/include/lily-imports.hh new file mode 100644 index 0000000000..d930f69cf9 --- /dev/null +++ b/lily/include/lily-imports.hh @@ -0,0 +1,146 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2015 by David Kastrup + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#ifndef LILY_IMPORTS_HH +#define LILY_IMPORTS_HH + +#include "lily-modules.hh" + +namespace Guile_user { + extern Scm_module module; + typedef Module_variable Variable; + + extern Variable apply; + extern Variable plus; + extern Variable make_module; +#if GUILEV2 + extern Variable module_export_all_x; +#endif + extern Variable module_export_x; + extern Variable module_public_interface; + extern Variable module_use_x; + extern Variable symbol_p; + extern Variable the_root_module; +} + +namespace Display { + extern Scm_module module; + typedef Module_variable Variable; + + extern Variable value_to_lily_string; +} + +namespace Lily { + extern Scm_module module; + typedef Module_variable Variable; + + extern Variable all_music_font_encodings; + extern Variable alterations_in_key; + extern Variable backend_testing; + extern Variable base_length; + extern Variable beam_exceptions; + extern Variable beat_structure; + extern Variable calc_repeat_slash_count; + extern Variable car_less; + extern Variable chordmodifiers; + extern Variable construct_chord_elements; + extern Variable default_time_signature_settings; + extern Variable drum_pitch_names; + extern Variable grob_compose_function; + extern Variable grob_offset_function; + extern Variable hash_table_to_alist; + extern Variable interpret_markup_list; + extern Variable invalidate_alterations; + extern Variable key_p; + extern Variable key_list_p; + extern Variable key_signature_interface_alteration_positions; + extern Variable layout_extract_page_properties; + extern Variable lilypond_main; + extern Variable line_markup; + extern Variable f_location; + extern Variable lookup_font; + extern Variable lookup_markup_command; + extern Variable lookup_markup_list_command; + extern Variable ly_context_find; + extern Variable ly_context_set_property_x; + extern Variable ly_event_p; + extern Variable ly_make_event_class; + extern Variable ly_music_p; + extern Variable make_music; + extern Variable make_safe_lilypond_module; + extern Variable make_span_event; + extern Variable markup_p; + extern Variable markup_list_p; + extern Variable midi_program; +#if !GUILEV2 + extern Variable module_export_all_x; +#endif + extern Variable f_parser; + extern Variable percussion_p; + extern Variable pitchnames; + extern Variable pure_chain_offset_callback; + extern Variable remove_stencil_warnings; + extern Variable scale_layout; + extern Variable scm_to_string; + extern Variable score_lines_markup_list; + extern Variable score_markup; + extern Variable scorify_music; + extern Variable span_bar_notify_grobs_of_my_existence; + extern Variable stencil_whiteout; + extern Variable stencil_whiteout_box; + extern Variable symbol_list_p; + extern Variable tremolo_get_music_list; + extern Variable type_name; + extern Variable volta_bracket_calc_hook_visibility; + extern Variable write_performances_midis; +} + +namespace Syntax { + extern Scm_module module; + typedef Module_variable Variable; + + extern Variable add_lyrics; + extern Variable argument_error; + extern Variable composed_markup_list; + extern Variable context_change; + extern Variable context_specification; + extern Variable event_chord; + extern Variable lyric_combine; + extern Variable lyric_event; + extern Variable multi_measure_rest; + extern Variable music_function; + extern Variable music_function_call_error; + extern Variable partial_markup; + extern Variable partial_music_function; + extern Variable property_override; + extern Variable property_override_function; + extern Variable property_revert; + extern Variable property_set; + extern Variable property_set_function; + extern Variable property_unset; + extern Variable repeat; + extern Variable repetition_chord; + extern Variable sequential_music; + extern Variable simultaneous_music; + extern Variable tempo; + extern Variable unrelativable_music; + extern Variable void_music; +}; + +#endif diff --git a/lily/include/lily-lexer.hh b/lily/include/lily-lexer.hh index ff78cf9901..626d24efa6 100644 --- a/lily/include/lily-lexer.hh +++ b/lily/include/lily-lexer.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,10 +31,13 @@ bool busy_parsing (); void kill_lexer (); void set_lexer (); -class Lily_lexer : public Includable_lexer +class Lily_lexer : public Smob, public Includable_lexer { - DECLARE_SMOBS (Lily_lexer); - +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Lily_lexer (); private: int lookup_keyword (const string&); int scan_bare_word (const string&); @@ -49,7 +52,6 @@ private: Keyword_table *keytable_; SCM scopes_; SCM start_module_; - int hidden_state_; Input override_input_; SCM eval_scm (SCM, Input, char extra_token = 0); public: @@ -98,7 +100,9 @@ public: SCM keyword_list () const; SCM lookup_identifier (const string &s); SCM lookup_identifier_symbol (SCM s); - void push_extra_token (int token_type, SCM scm = SCM_UNSPECIFIED); + void push_extra_token (Input const &where, + int token_type, SCM scm = SCM_UNSPECIFIED); + int pop_extra_token (); void push_chord_state (SCM alist); void push_figuredbass_state (); void push_lyric_state (); diff --git a/lily/include/lily-modules.hh b/lily/include/lily-modules.hh new file mode 100644 index 0000000000..3393fc2ae8 --- /dev/null +++ b/lily/include/lily-modules.hh @@ -0,0 +1,99 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2015 by David Kastrup + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#ifndef LILY_MODULES_HH +#define LILY_MODULES_HH + +#include "lily-guile.hh" + +class Scm_variable; + +class Scm_module +{ + const char *name_; + SCM module_; + class Variable_record; + Variable_record *variables_; + static void boot_init (void *); +public: + void boot (void (*init)() = 0); + void import (); + void register_variable (const char *name, Scm_variable *var); + + Scm_module (const char *name); + + operator SCM () + { + assert (SCM_MODULEP (module_)); + return module_; + } +}; + +class Scm_variable +{ + SCM var_; + friend Scm_module; + void boot (const char *name); + void import (SCM module, const char *name); +public: + operator SCM & () + { +#if 0 + // One could conceivably work with variables even before the + // module is initialized + return SCM_VARIABLEP (var_) ? *SCM_VARIABLE_LOC (var_) : var_; +#endif +#if DEBUG + assert (SCM_VARIABLEP (var_)); +#endif + return *SCM_VARIABLE_LOC (var_); + } + SCM operator () () + { + return scm_call_0 (*this); + } + SCM operator () (SCM arg1) + { + return scm_call_1 (*this, arg1); + } + SCM operator () (SCM arg1, SCM arg2) + { + return scm_call_2 (*this, arg1, arg2); + } + SCM operator () (SCM arg1, SCM arg2, SCM arg3) + { + return scm_call_3 (*this, arg1, arg2, arg3); + } + SCM operator () (SCM arg1, SCM arg2, SCM arg3, SCM arg4) + { + return scm_call_4 (*this, arg1, arg2, arg3, arg4); + } + Scm_variable (Scm_module &m, const char *name, SCM value = SCM_UNDEFINED); +}; + +template +class Module_variable : public Scm_variable +{ +public: + Module_variable (const char *name, SCM value = SCM_UNDEFINED) + : Scm_variable (m, name, value) + { } +}; + +#endif diff --git a/lily/include/lily-parser.hh b/lily/include/lily-parser.hh index 3b4c757d65..e4ff2969b9 100644 --- a/lily/include/lily-parser.hh +++ b/lily/include/lily-parser.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,27 +25,23 @@ #include "pitch.hh" /** - State for the parser. Do not ever add any variables to parse - musical content here. We still have to remove default_duration_. + State for the parser. TODO: interface is too complicated */ -class Lily_parser +class Lily_parser : public Smob { - DECLARE_SMOBS (Lily_parser); - - char const *here_str0 () const; - Simultaneous_music *get_chord (Pitch tonic, - vector *adds, vector *subs, - Pitch *inversion, Pitch *bass, Duration d); - void set_chord_tremolo (int type); - void set_last_duration (Duration const *); - void set_last_pitch (Pitch const *); - + SCM do_yyparse (); + static SCM do_yyparse_trampoline (void *parser); public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Lily_parser (); Lily_lexer *lexer_; Sources *sources_; Duration default_duration_; + int default_tremolo_type_; string output_basename_; SCM closures_; @@ -61,7 +57,6 @@ public: void clear (); void do_init_file (); - SCM do_yyparse (); void include_string (const string &ly_code); void parse_file (const string &init, const string &name, const string &out_name); void parse_string (const string &ly_code); @@ -75,7 +70,6 @@ public: SCM make_scope () const; }; -DECLARE_UNSMOB (Lily_parser, lily_parser); Output_def *get_layout (Lily_parser *parser); Output_def *get_midi (Lily_parser *parser); diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh index 80240d5923..ee3946e0fd 100644 --- a/lily/include/lily-proto.hh +++ b/lily/include/lily-proto.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,26 +35,19 @@ class Audio_piano_pedal; class Audio_staff; class Audio_tempo; class Audio_text; -class Audio_tie; class Audio_time_signature; class Auto_change_iterator; -class Auto_change_music; class Axis_group_engraver; class Bar_engraver; -class Bar_req_collect_engraver; class Beaming_pattern; class Beam_scoring_problem; class Beam_configuration; class Beam_quant_parameters; class Bezier; -class Bezier_bow; class Book; class Box; -class Break_algorithm; class Change_iterator; -class Change_translator; class Chord_tremolo_iterator; -class Cluster_engraver; class Column_x_positions; class Context; class Context_def; @@ -65,7 +58,6 @@ class Dot_column; class Dot_configuration; class Dot_formatting_problem; class Engraver; -class Engraver; class Engraver_group; class Event; class Event_chord; @@ -74,17 +66,15 @@ class Event_iterator; class Font_metric; class Font_size_engraver; class Global_context; -class Gourlay_breaking; class Grace_fixup; class Grace_iterator; class Grace_music; class Grob; class Grob_array; class Grob_info; -class Hara_kiri_line_group_engraver; +class Grob_properties; class Includable_lexer; class Input; -class Input_file_results; class Item; class Key_performer; class Keyword_ent; @@ -93,16 +83,11 @@ class Ligature_bracket_engraver; class Ligature_engraver; class Lily_lexer; class Lily_parser; -class Lilypond_context_key; -class Lilypond_grob_key; -class Line_group_engraver_group; class Listener; -class Lookup; class Lyric_combine_music; class Lyric_combine_music_iterator; class Lyric_engraver; class Lyric_performer; -class Lyric_phrasing_engraver; class Mensural_ligature_engraver; class Midi_chunk; class Midi_control_function_value_change; @@ -126,7 +111,6 @@ class Modified_font_metric; class Moment; class Music; class Music_iterator; -class Music_list; class Music_output; class Music_sequence; class Music_wrapper; @@ -144,40 +128,33 @@ class Paper_score; class Performance; class Performer; class Performer_group; -class Piano_bar_engraver; class Pitch; class Pitch_squash_engraver; class Prob; class Property_iterator; -class Rational; class Relative_octave_music; class Repeated_music; class Rhythmic_music_iterator; class Scale; class Scheme_hash_table; class Scheme_engraver; +class Scm_module; +class Scm_variable; class Score; -class Score_context; class Score_engraver; class Score_performer; -class Sequential_music; -class Sequential_music_iterator; class Simple_music_iterator; class Simple_spacer; -class Simple_spacer_wrapper; class Simultaneous_music; class Simultaneous_music_iterator; class Skyline; -class Skyline_entry; class Skyline_pair; class Slur_configuration; class Slur_score_state; class Source_file; class Sources; class Spacing_options; -class Span_score_bar_engraver; class Spanner; -class Staff_group_bar_engraver; class Staff_performer; class Stencil; class Stream_event; @@ -191,16 +168,8 @@ class Tie_performer; class Time_scaled_music; class Time_scaled_music_iterator; class Time_signature_performer; -class Timing_engraver; class Timing_translator; -class Translation_property; class Translator; -class Translator_change; class Translator_group; -class Transposed_music; -class yyFlexLexer; - -typedef void (Engraver::*Engraver_void_function_engraver_grob_info) (Grob_info); -typedef void (Translator::*Translator_void_method_ptr) (); #endif /* LILY_PROTO_HH */ diff --git a/lily/include/lily-version.hh b/lily/include/lily-version.hh index 1db84e4de4..edb46c6c58 100644 --- a/lily/include/lily-version.hh +++ b/lily/include/lily-version.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Jan Nieuwenhuizen + Copyright (C) 1999--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/lilypond-version.hh b/lily/include/lilypond-version.hh index e79f01137a..818414abdf 100644 --- a/lily/include/lilypond-version.hh +++ b/lily/include/lilypond-version.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ #define LILYPOND_VERSION_HH #include "std-string.hh" +#include "compare.hh" struct Lilypond_version { @@ -28,7 +29,8 @@ struct Lilypond_version Lilypond_version (const string &str); string to_string () const; - operator int () const; + operator bool () const; + static int compare (const Lilypond_version &, const Lilypond_version &); int major_; int minor_; @@ -36,6 +38,8 @@ struct Lilypond_version string extra_patch_string_; }; +INSTANTIATE_COMPARE (const Lilypond_version &, Lilypond_version::compare); + extern Lilypond_version oldest_version; #endif // LILYPOND_VERSION_HH diff --git a/lily/include/line-interface.hh b/lily/include/line-interface.hh index e4e267c7cc..b805f7262a 100644 --- a/lily/include/line-interface.hh +++ b/lily/include/line-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,6 @@ struct Line_interface { static Stencil line (Grob *me, Offset from, Offset to); - DECLARE_GROB_INTERFACE (); static Stencil make_zigzag_line (Grob *me, Offset from, Offset to); diff --git a/lily/include/listener.hh b/lily/include/listener.hh index e0827f8786..a13fdc66e1 100644 --- a/lily/include/listener.hh +++ b/lily/include/listener.hh @@ -23,109 +23,120 @@ /* Listeners - Listeners are used for stream event dispatching. If you want to - register a method as an event handler in a dispatcher, then you - must: + Listeners are used for stream event dispatching. The usual way to + work with them is to use the GET_LISTENER macro which combines the + basic Listener algorithm with a Callback_wrapper structure providing + a Scheme handle into a member function. - - declare the method using the DECLARE_LISTENER macro. + To register a member function of Foo as an event handler in a + dispatcher, you must: + + - declare the function: class Foo { - DECLARE_LISTENER (method); + void method (SCM); ... }; - This macro declares the method to take a SCM as parameter, and to - return void. It also declares some other stuff that shouldn't be - touched. - - implement the method using IMPLEMENT_LISTENER: - IMPLEMENT_LISTENER (Foo, method) - void method (SCM e) + - implement the method:: + void Foo::method (SCM e) { write ("Foo hears an event!"); } - - Extract a listener using GET_LISTENER (Foo->method) + - Extract a listener using GET_LISTENER (Foo, method) - Register the method to the dispatcher using Dispatcher::register Example: Foo *foo = (...); - Stream_distributor *d = (...); - Listener l = GET_LISTENER (foo->method); - d->register_listener (l, "EventClass"); + Dispatcher *d = (...); + Listener l = foo->GET_LISTENER (Foo, method); + d->add_listener (l, ly_symbol2scm ("EventClass")); Whenever d hears a stream-event ev of class "EventClass", the implemented procedure is called. + GET_LISTENER actually makes use of a member function + get_listener (SCM) available in every Smob<...>-derived class. + get_listener receives a function getting an object instance and an + event and will turn it into a Listener that will (after turning into + Scheme), behave as a function receiving an event as its sole + argument, with the object instance being the object from which + get_listener was called as a member. + + So (p->get_listener (f)).smobbed_copy () is roughly equivalent to + (lambda (ev) (f p->self_scm() ev)) + Limitations: - - DECLARE_LISTENER currently only works inside smob classes. + + The Callback_wrapper mechanism used in GET_LISTENER works only for + classes derived from Smob<...>. */ +#include "callback.hh" #include "smobs.hh" -typedef struct -{ - void (*listen_callback) (void *, SCM); - void (*mark_callback) (void *); - bool (*equal_callback) (void *, void *); -} Listener_function_table; - -class Listener +// A listener is essentially any procedure accepting a single argument +// (namely an event). The class Listener (or rather a smobbed_copy of +// it) behaves like such a procedure and is composed of a generic +// callback function accepting two arguments, namely a "target" +// (usually an engraver instance) and the event. Its Scheme +// equivalent would be +// +// (define (make-listener callback target) +// (lambda (event) (callback target event))) +// +// The class construction is lightweight: as a Simple_smob, this is +// only converted into Scheme when a smobbed_copy is created. + +class Listener : public Simple_smob { - void *target_; - Listener_function_table *type_; +private: + SCM callback_; + SCM target_; public: - Listener (const void *target, Listener_function_table *type); - Listener (Listener const &other); - Listener (); + static const char * const type_p_name_; - void listen (SCM ev) const; + Listener (SCM callback, SCM target) + : callback_ (callback), target_ (target) { } + + LY_DECLARE_SMOB_PROC (&Listener::listen, 1, 0, 0) + SCM listen (SCM ev) + { + scm_call_2 (callback_, target_, ev); + return SCM_UNSPECIFIED; + } + + SCM mark_smob () const + { + scm_gc_mark (callback_); + return target_; + } bool operator == (Listener const &other) const { - return type_ == other.type_ - && (*type_->equal_callback) ((void *) target_, (void *) other.target_); + return scm_is_eq (callback_, other.callback_) + && scm_is_eq (target_, other.target_); + } + + static SCM equal_p (SCM a, SCM b) + { + return *unchecked_unsmob (a) == *unchecked_unsmob (b) + ? SCM_BOOL_T : SCM_BOOL_F; } - DECLARE_SIMPLE_SMOBS (Listener); + template + static SCM trampoline (SCM target, SCM ev) + { + T *t = unsmob (target); + LY_ASSERT_SMOB (T, target, 1); + + (t->*callback) (ev); + return SCM_UNDEFINED; + } }; -DECLARE_UNSMOB (Listener, listener); - -#define IMPLEMENT_LISTENER(cl, method) \ -void \ -cl :: method ## _callback (void *self, SCM ev) \ -{ \ - cl *s = (cl *)self; \ - s->method (ev); \ -} \ -void \ -cl :: method ## _mark (void *self) \ -{ \ - cl *s = (cl *)self; \ - scm_gc_mark (s->self_scm ()); \ -} \ -bool \ -cl :: method ## _is_equal (void *a, void *b) \ -{ \ - return a == b; \ -} \ -Listener \ -cl :: method ## _listener () const \ -{ \ - static Listener_function_table callbacks; \ - callbacks.listen_callback = &cl::method ## _callback; \ - callbacks.mark_callback = &cl::method ## _mark; \ - callbacks.equal_callback = &cl::method ## _is_equal; \ - return Listener (this, &callbacks); \ -} - -#define GET_LISTENER(proc) proc ## _listener () - -#define DECLARE_LISTENER(name) \ - inline void name (SCM); \ - static void name ## _callback (void *self, SCM ev); \ - static void name ## _mark (void *self); \ - static bool name ## _is_equal (void *a, void *b); \ - Listener name ## _listener () const + +#define GET_LISTENER(cl, proc) get_listener (Callback_wrapper::make_smob > ()) #endif /* LISTENER_HH */ diff --git a/lily/include/lookup.hh b/lily/include/lookup.hh index f95a7e2a40..5fe7404825 100644 --- a/lily/include/lookup.hh +++ b/lily/include/lookup.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -24,25 +24,25 @@ #include "stencil.hh" #include "std-vector.hh" -struct Lookup +namespace Lookup { - static Stencil bracket (Axis a, Interval iv, Real thick, Real protrude, Real blot); - static Stencil circle (Real rad, Real thick, bool filled); - static Stencil rotated_box (Real slope, Real width, Real thick, Real blot); - static Stencil round_filled_polygon (vector const &points, Real blotdiameter); - static Stencil frame (Box b, Real thick, Real blot); - static Stencil slur (Bezier controls, Real cthick, Real thick, + Stencil bracket (Axis a, Interval iv, Real thick, Real protrude, Real blot); + Stencil circle (Real rad, Real thick, bool filled); + Stencil rotated_box (Real slope, Real width, Real thick, Real blot); + Stencil round_filled_polygon (vector const &points, Real blotdiameter, Real extroversion = -1.0); + Stencil frame (Box b, Real thick, Real blot); + Stencil slur (Bezier controls, Real cthick, Real thick, SCM dash_definition); - static Stencil bezier_sandwich (Bezier top_curve, Bezier bottom_curve, + Stencil bezier_sandwich (Bezier top_curve, Bezier bottom_curve, Real thickness); - static Stencil beam (Real slope, Real width, Real thick, Real blot); - static Stencil blank (Box b); - static Stencil filled_box (Box b); - static Stencil round_filled_box (Box b, Real blotdiameter); - static Stencil repeat_slash (Real w, Real slope, Real th); - static Stencil horizontal_line (Interval w, Real th); - static Stencil triangle (Interval iv, Real thick, Real protrude); - static Stencil points_to_line_stencil (Real thick, vector const &points); + Stencil beam (Real slope, Real width, Real thick, Real blot); + Stencil blank (Box b); + Stencil filled_box (Box b); + Stencil round_filled_box (Box b, Real blotdiameter); + Stencil repeat_slash (Real w, Real slope, Real th); + Stencil horizontal_line (Interval w, Real th); + Stencil triangle (Interval iv, Real thick, Real protrude); + 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 daa99ab6b6..4b2d3f800a 100644 --- a/lily/include/ly-module.hh +++ b/lily/include/ly-module.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,15 +29,7 @@ SCM ly_module_lookup (SCM module, SCM sym); SCM ly_modules_lookup (SCM modules, SCM sym, SCM); SCM ly_module_symbols (SCM mod); void ly_reexport_module (SCM mod); -inline bool ly_is_module (SCM x) { return SCM_MODULEP (x); } - SCM ly_use_module (SCM mod, SCM used); -/* For backward compatability with Guile 1.8 */ -#if !HAVE_GUILE_HASH_FUNC -typedef SCM (*scm_t_hash_fold_fn) (GUILE_ELLIPSIS); -typedef SCM (*scm_t_hash_handle_fn) (GUILE_ELLIPSIS); -#endif - #endif /* LY_MODULE_HH */ diff --git a/lily/include/ly-smobs.icc b/lily/include/ly-smobs.icc deleted file mode 100644 index db642e253d..0000000000 --- a/lily/include/ly-smobs.icc +++ /dev/null @@ -1,139 +0,0 @@ -/* - This file is part of LilyPond, the GNU music typesetter. - - Copyright (C) 1999--2012 Han-Wen Nienhuys - - LilyPond is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - LilyPond is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LilyPond. If not, see . -*/ - -#ifndef LY_SMOBS_ICC -#define LY_SMOBS_ICC - -#include "lily-guile-macros.hh" -#include "smobs.hh" - -#define IMPLEMENT_TYPE_P(CL, FUNCNAME) \ - SCM CL ## _type_p_proc; \ - void init_type_ ## CL () \ - { \ - SCM subr = scm_c_define_gsubr (FUNCNAME, 1, 0, 0, \ - (scm_t_subr) CL::smob_p); \ - CL ## _type_p_proc = subr; \ - ly_add_function_documentation (subr, FUNCNAME, "(SCM x)", \ - "Is @var{x} a @code{" #CL "} object?"); \ - scm_c_export (FUNCNAME, NULL); \ - } \ - ADD_SCM_INIT_FUNC (init_type_ ## CL, init_type_ ## CL) - -#define IMPLEMENT_BASE_SMOBS(CL) \ - void \ - CL ## _type_adder () \ - {\ - ly_add_type_predicate ((void*) &CL::unsmob, #CL); \ - }\ - ADD_SCM_INIT_FUNC(CL ## _type_adder_ctor, \ - CL ## _type_adder);\ - const char *CL::smob_name_ = #CL; \ - scm_t_bits CL::smob_tag_; \ - SCM \ - CL::smob_p (SCM s) \ - { \ - if (SCM_NIMP (s) && SCM_CELL_TYPE (s) == smob_tag_) \ - return SCM_BOOL_T; \ - else \ - return SCM_BOOL_F; \ - \ - } \ - \ - void \ - CL::init_smobs () \ - { \ - smob_tag_ = scm_make_smob_type (#CL, 0); \ - scm_set_smob_mark (smob_tag_, CL::mark_smob); \ - scm_set_smob_free (smob_tag_, CL::free_smob); \ - scm_set_smob_print (smob_tag_, CL::print_smob); \ - scm_set_smob_equalp (smob_tag_, CL::equal_p); \ - } \ - \ - size_t \ - CL::free_smob (SCM ses) \ - { \ - CL *s = (CL *) SCM_CELL_WORD_1 (ses); \ - delete s; \ - /* scm_gc_unregister_collectable_memory (s, sizeof (CL), #CL " smob"); */ \ - return SMOB_FREE_RETURN_VAL (CL); \ - } \ - \ - ADD_SCM_INIT_FUNC (CL, CL::init_smobs) - -#define IMPLEMENT_SIMPLE_SMOBS(CL) \ - IMPLEMENT_BASE_SMOBS (CL); \ - SCM CL::smobbed_copy () const \ - { \ - CL *ptr = new CL (*this); \ - SCM s; \ - s = scm_cons (SCM_PACK (CL::smob_tag_), SCM_PACK (ptr)); \ - scm_gc_register_collectable_memory ((CL *)this, sizeof (CL), #CL " smob"); \ - \ - return s; \ - } - -#define IMPLEMENT_SMOBS(CL) \ - IMPLEMENT_BASE_SMOBS (CL) \ - void \ - CL::smobify_self () \ - { \ - protection_cons_ = SCM_EOL; \ - self_scm_ = unprotected_smobify_self (); \ - protect (); \ - } \ - void \ - CL::protect () \ - { \ - protect_smob (self_scm_, &protection_cons_); \ - } \ - SCM \ - CL::unprotect () \ - { \ - unprotect_smob (self_scm_, &protection_cons_); \ - return self_scm_; \ - } \ - SCM \ - CL::unprotected_smobify_self () \ - { \ - /* \ - 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 \ - */ \ - SCM s; \ - SCM_NEWSMOB (s, CL::smob_tag_, this); \ - self_scm_ = s; \ - scm_gc_register_collectable_memory (this, sizeof (CL), #CL " smob"); \ - return s; \ - } - -#define IMPLEMENT_DEFAULT_EQUAL_P(CL) \ - SCM \ - CL::equal_p (SCM a, SCM b) \ - { \ - return a == b ? SCM_BOOL_T : SCM_BOOL_F; \ - } - -#endif /* LY_SMOBS_ICC */ - diff --git a/lily/include/lyric-extender.hh b/lily/include/lyric-extender.hh index 1fda9f8657..8ae8c97553 100644 --- a/lily/include/lyric-extender.hh +++ b/lily/include/lyric-extender.hh @@ -2,7 +2,7 @@ /* extender-spanner.hh -- part of GNU LilyPond - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen */ #ifndef EXTENDER_SPANNER_HH @@ -27,7 +27,6 @@ class Lyric_extender { public: - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (print, (SCM)); }; diff --git a/lily/include/lyric-hyphen.hh b/lily/include/lyric-hyphen.hh index f455a8a64f..fb03c6df51 100644 --- a/lily/include/lyric-hyphen.hh +++ b/lily/include/lyric-hyphen.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Glen Prideaux + Copyright (C) 1999--2015 Glen Prideaux LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ struct Lyric_hyphen { public: DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM)); - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (print, (SCM)); }; diff --git a/lily/include/main.hh b/lily/include/main.hh index 06a1a09991..1e6e2caf51 100644 --- a/lily/include/main.hh +++ b/lily/include/main.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,6 +39,7 @@ extern vector dump_header_fieldnames_global; extern vector start_environment_global; extern string output_backend_global; extern string output_name_global; +extern bool bigpdfs; extern bool be_safe_global; extern bool do_internal_type_checking_global; extern string lilypond_datadir; diff --git a/lily/include/measure-grouping-spanner.hh b/lily/include/measure-grouping-spanner.hh index 76c0817db8..0e67f22822 100644 --- a/lily/include/measure-grouping-spanner.hh +++ b/lily/include/measure-grouping-spanner.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,6 @@ class Measure_grouping public: DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif /* MEASURE_GROUPING_SPANNER_HH */ diff --git a/lily/include/melody-spanner.hh b/lily/include/melody-spanner.hh index 7a441b31a9..6ce6a2733b 100644 --- a/lily/include/melody-spanner.hh +++ b/lily/include/melody-spanner.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,6 @@ class Melody_spanner { public: - DECLARE_GROB_INTERFACE (); static void add_stem (Grob *, Grob *); DECLARE_SCHEME_CALLBACK (calc_neutral_stem_direction, (SCM)); }; diff --git a/lily/include/mensural-ligature.hh b/lily/include/mensural-ligature.hh index 900a046b15..3e4e46a641 100644 --- a/lily/include/mensural-ligature.hh +++ b/lily/include/mensural-ligature.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Juergen Reuter , + Copyright (C) 2002--2015 Juergen Reuter , Pal Benko LilyPond is free software: you can redistribute it and/or modify @@ -45,7 +45,6 @@ struct Mensural_ligature { DECLARE_SCHEME_CALLBACK (brew_ligature_primitive, (SCM)); DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif /* MENSURAL_LIGATURE_HH */ diff --git a/lily/include/midi-chunk.hh b/lily/include/midi-chunk.hh index c87adf6491..0786a4871d 100644 --- a/lily/include/midi-chunk.hh +++ b/lily/include/midi-chunk.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/midi-item.hh b/lily/include/midi-item.hh index 492e2e9fc8..b593ce1527 100644 --- a/lily/include/midi-item.hh +++ b/lily/include/midi-item.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/midi-stream.hh b/lily/include/midi-stream.hh index 7ea838fdd0..a14ac80e20 100644 --- a/lily/include/midi-stream.hh +++ b/lily/include/midi-stream.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/midi-walker.hh b/lily/include/midi-walker.hh index ea76a02a6d..f23b7407e8 100644 --- a/lily/include/midi-walker.hh +++ b/lily/include/midi-walker.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -39,7 +39,7 @@ int compare (Midi_note_event const &left, Midi_note_event const &right); class Midi_walker { public: - Midi_walker (Audio_staff *audio_staff, Midi_track *midi_track); + Midi_walker (Audio_staff *audio_staff, Midi_track *midi_track, int start_tick); ~Midi_walker (); void process (); diff --git a/lily/include/mingw-compatibility.hh b/lily/include/mingw-compatibility.hh index 7c0ffc481b..39b57856de 100644 --- a/lily/include/mingw-compatibility.hh +++ b/lily/include/mingw-compatibility.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Jan Nieuwenhuizen + Copyright (C) 2005--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/minimal-page-breaking.hh b/lily/include/minimal-page-breaking.hh index 22589a420e..50a60a8b66 100644 --- a/lily/include/minimal-page-breaking.hh +++ b/lily/include/minimal-page-breaking.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Nicolas Sceaux + Copyright (C) 2007--2015 Nicolas Sceaux LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/misc.hh b/lily/include/misc.hh index 9bba2d09e9..174b2f4c01 100644 --- a/lily/include/misc.hh +++ b/lily/include/misc.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,26 @@ using namespace std; #include "interval.hh" double log_2 (double x); -int intlog2 (int d); + +/* + Return the 2-log, rounded down +*/ +template +int +intlog2 (T d) +{ + if (d <= 0) + error ("intlog2 with negative argument: " + ::to_string (d)); + int i = 0; + while ((d != 1)) + { + d /= 2; + i++; + } + + assert (! (d / 2)); + return i; +} inline int sign (int i) @@ -61,7 +80,6 @@ normalize (Real x, Real x1, Real x2) Real directed_round (Real f, Direction d); -Offset get_point_in_y_direction (Offset orig, Real slope, Real dist, Direction dir); 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 (const string &in); diff --git a/lily/include/modified-font-metric.hh b/lily/include/modified-font-metric.hh index 40533cb3c3..c63c532fbd 100644 --- a/lily/include/modified-font-metric.hh +++ b/lily/include/modified-font-metric.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/moment.hh b/lily/include/moment.hh index 2aede3ce52..c29032f99d 100644 --- a/lily/include/moment.hh +++ b/lily/include/moment.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,10 +27,12 @@ Musical timing (Main-timing, grace-timing) with glue for Guilification; */ -class Moment +class Moment : public Simple_smob { - DECLARE_SIMPLE_SMOBS (Moment); public: + static SCM equal_p (SCM, SCM); + int print_smob (SCM, scm_print_state *) const; + static const char * const type_p_name_; Moment (); Moment (int m); @@ -68,7 +70,6 @@ IMPLEMENT_ARITHMETIC_OPERATOR (Moment, / ); IMPLEMENT_ARITHMETIC_OPERATOR (Moment, *); IMPLEMENT_ARITHMETIC_OPERATOR (Moment, % ); -DECLARE_UNSMOB (Moment, moment); int compare (Moment const &, Moment const &); INSTANTIATE_COMPARE (Moment const &, Moment::compare); @@ -81,4 +82,3 @@ ostream &operator << (ostream &, Moment const &); bool moment_less (SCM a, SCM b); #endif /* MOMENT_HH */ - diff --git a/lily/include/multi-measure-rest.hh b/lily/include/multi-measure-rest.hh index d012a77b07..f4d379ade4 100644 --- a/lily/include/multi-measure-rest.hh +++ b/lily/include/multi-measure-rest.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,14 +26,12 @@ class Multi_measure_rest { public: - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (height, (SCM)); DECLARE_SCHEME_CALLBACK (percent, (SCM)); static void add_column (Grob *, Item *); DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM)); DECLARE_SCHEME_CALLBACK (set_text_rods, (SCM)); - DECLARE_SCHEME_CALLBACK (centered_stencil, (SCM)); static void calculate_spacing_rods (Grob *me, Real length); static Stencil big_rest (Grob *, Real); diff --git a/lily/include/music-function.hh b/lily/include/music-function.hh index d257b136b8..80239a61aa 100644 --- a/lily/include/music-function.hh +++ b/lily/include/music-function.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,12 +22,18 @@ #include "lily-guile.hh" -SCM ly_make_music_function (SCM, SCM); -SCM make_music_function (SCM, SCM); - -SCM get_music_function_transform (SCM); -SCM get_music_function_signature (SCM); -bool is_music_function (SCM); +#include "small-smobs.hh" + +class Music_function : public Smob2 +{ +public: + static const char * const type_p_name_; + int print_smob (SCM, scm_print_state *) const; + SCM get_signature () const { return scm1 (); } + SCM get_function () const { return scm2 (); } + SCM call (SCM args); + LY_DECLARE_SMOB_PROC (&Music_function::call, 0, 0, 1); +}; #endif /* MUSIC_FUNCTION_HH */ diff --git a/lily/include/music-iterator.hh b/lily/include/music-iterator.hh index 3fcfa8d58c..bb095df718 100644 --- a/lily/include/music-iterator.hh +++ b/lily/include/music-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,10 +43,10 @@ ok () -- events left ? pending_mom () -- time tag of the next event to be processed. - PRECONDITION: this->ok () holds. + PRECONDITION: ok () holds. process (M) -- process all at M (Precondition: no events exist - before M, this->ok () holds). Side-effects: + before M, ok () holds). Side-effects: * This removes all events at M from the pending queue. @@ -58,18 +58,26 @@ merge pending_moment and process? */ -class Music_iterator +class Music_iterator : public Smob { +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Music_iterator (); protected: Moment music_length_; Moment start_mom_; DECLARE_CLASSNAME (Music_iterator); - DECLARE_SMOBS (Music_iterator); - Music_iterator (Music_iterator const &); +private: + Music_iterator (Music_iterator const &); // Do not define! Not copyable! public: Moment music_get_length () const; + // music_start_mom () is calculated relative to the time where the + // iterator occurs in the music stream, so it will usually be + // non-zero only for expressions starting with grace notes. Moment music_start_mom () const; Music_iterator (); void report_event (Music *); @@ -84,6 +92,8 @@ public: virtual Moment pending_moment () const; virtual bool ok () const; virtual bool run_always () const; + // process is called with a time relative to the iterator start, so + // usually the last processed moment is the same as music_get_length. virtual void process (Moment until); virtual void derived_mark () const; virtual void construct_children (); @@ -113,6 +123,5 @@ bool is_child_context (Context *me, Context *child); return c->unprotect (); \ } -DECLARE_UNSMOB (Music_iterator, iterator); #endif // MUSIC_ITERATOR_HH diff --git a/lily/include/music-output.hh b/lily/include/music-output.hh index cda3118be4..208c01a831 100644 --- a/lily/include/music-output.hh +++ b/lily/include/music-output.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,9 +26,14 @@ #include "smobs.hh" #include "virtual-methods.hh" -class Music_output +class Music_output : public Smob { - DECLARE_SMOBS (Music_output); +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Music_output (); +private: DECLARE_CLASSNAME (Music_output); protected: Music_output (); @@ -38,7 +43,4 @@ public: virtual void process (); }; -DECLARE_UNSMOB (Music_output, music_output); -Paper_score *unsmob_paper_score (SCM); -Performance *unsmob_performance (SCM); #endif /* MUSIC_OUTPUT_HH */ diff --git a/lily/include/music-sequence.hh b/lily/include/music-sequence.hh index 590b48b22d..ad47f72bdc 100644 --- a/lily/include/music-sequence.hh +++ b/lily/include/music-sequence.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/music-wrapper-iterator.hh b/lily/include/music-wrapper-iterator.hh index 8553b3958a..47cd6763c3 100644 --- a/lily/include/music-wrapper-iterator.hh +++ b/lily/include/music-wrapper-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/music-wrapper.hh b/lily/include/music-wrapper.hh index b295075ec3..a500b582c7 100644 --- a/lily/include/music-wrapper.hh +++ b/lily/include/music-wrapper.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/music.hh b/lily/include/music.hh index 83cc5ff4c3..c904dc3347 100644 --- a/lily/include/music.hh +++ b/lily/include/music.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,9 +48,6 @@ public: Moment start_mom () const; void print () const; - /// Transpose, with the interval central C to #p# - void transpose (Pitch p); - /// Scale the music in time by #factor#. void compress (Moment factor); @@ -69,14 +66,12 @@ protected: friend SCM ly_extended_make_music (SCM, SCM); }; -Music *unsmob_music (SCM); Music *make_music_by_name (SCM sym); -SCM ly_music_deep_copy (SCM); +SCM music_deep_copy (SCM m); +void set_origin (SCM m, SCM origin); + SCM ly_camel_case_2_lisp_identifier (SCM name_sym); extern SCM ly_music_p_proc; -/* common transposition function for music and event */ -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 db192bf19a..ad2ed5345d 100644 --- a/lily/include/note-collision.hh +++ b/lily/include/note-collision.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,6 +44,5 @@ public: static Drul_array > get_clash_groups (Grob *me); DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM smob)); static void add_column (Grob *me, Grob *ncol); - DECLARE_GROB_INTERFACE (); }; #endif // COLLISION_HH diff --git a/lily/include/note-column.hh b/lily/include/note-column.hh index c2723f0ba8..1cf08545bf 100644 --- a/lily/include/note-column.hh +++ b/lily/include/note-column.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,13 +36,13 @@ public: static Grob *accidentals (Grob *me); static Slice head_positions_interval (Grob *me); static Grob *first_head (Grob *me); + static Interval calc_main_extent (Grob *me); static Grob *get_rest (Grob *me); static void set_stem (Grob *me, Grob *); static void add_head (Grob *me, Grob *); static bool has_rests (Grob *me); static Grob *dot_column (Grob *me); static Interval cross_staff_extent (Grob *me, Grob *refp); - DECLARE_GROB_INTERFACE (); static Item *get_stem (Grob *); static Item *get_flag (Grob *); diff --git a/lily/include/note-head.hh b/lily/include/note-head.hh index 6155dd7dc6..1e167d58b2 100644 --- a/lily/include/note-head.hh +++ b/lily/include/note-head.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,11 +27,9 @@ class Note_head { public: DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_SCHEME_CALLBACK (brew_ez_stencil, (SCM)); DECLARE_SCHEME_CALLBACK (stem_x_shift, (SCM)); DECLARE_SCHEME_CALLBACK (calc_stem_attachment, (SCM)); DECLARE_SCHEME_CALLBACK (include_ledger_line_height, (SCM)); - DECLARE_GROB_INTERFACE (); static Real stem_attachment_coordinate (Grob *, Axis a); static int get_balltype (Grob *); diff --git a/lily/include/note-spacing.hh b/lily/include/note-spacing.hh index 9b8a4fd922..df063b382e 100644 --- a/lily/include/note-spacing.hh +++ b/lily/include/note-spacing.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,11 +27,10 @@ class Note_spacing { public: - DECLARE_GROB_INTERFACE (); - static Spring get_spacing (Grob *me, Item *, Real, Real); + static Spring get_spacing (Grob *me, Item *, Spring, Real); static void stem_dir_correction (Grob *me, Item *next_col, Real incr, - Real *, Real *); + Real *space); }; #endif /* NOTE_SPACING_HH */ diff --git a/lily/include/scheme-listener.hh b/lily/include/one-line-auto-height-breaking.hh similarity index 62% rename from lily/include/scheme-listener.hh rename to lily/include/one-line-auto-height-breaking.hh index 7905ef9e1d..92209de04e 100644 --- a/lily/include/scheme-listener.hh +++ b/lily/include/one-line-auto-height-breaking.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Erik Sandberg + Copyright (C) 2012 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,25 +17,19 @@ along with LilyPond. If not, see . */ -#ifndef SCHEME_LISTENER_HH -#define SCHEME_LISTENER_HH +#ifndef ONE_LINE_AUTO_HEIGHT_BREAKING_HH +#define ONE_LINE_AUTO_HEIGHT_BREAKING_HH -#include "listener.hh" -#include "ly-smobs.icc" +#include "page-breaking.hh" +#include "page-spacing.hh" -/* - Scheme_listener is only used internally by scheme-listener-scheme.cc -*/ - -class Scheme_listener +class One_line_auto_height_breaking: public Page_breaking { public: - Scheme_listener (SCM callback); - DECLARE_LISTENER (call); -protected: - DECLARE_SMOBS (Scheme_listener); -private: - SCM callback_; + virtual SCM solve (); + + One_line_auto_height_breaking (Paper_book *pb); + virtual ~One_line_auto_height_breaking (); }; -#endif /* SCHEME_LISTENER_HH */ +#endif /* ONE_LINE_AUTO_HEIGHT_BREAKING_HH */ diff --git a/lily/include/open-type-font.hh b/lily/include/open-type-font.hh index cb55e9744b..b86a560a73 100644 --- a/lily/include/open-type-font.hh +++ b/lily/include/open-type-font.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +30,7 @@ class Open_type_font : public Font_metric { /* handle to face object */ FT_Face face_; + string postscript_name_; SCM lily_subfonts_; SCM lily_character_table_; @@ -65,5 +66,6 @@ public: string get_otf_table (FT_Face face, const string &tag); FT_Face open_ft_face (const string&, FT_Long idx); +string get_postscript_name (FT_Face face); #endif /* OPEN_TYPE_FONT_HH */ diff --git a/lily/include/optimal-page-breaking.hh b/lily/include/optimal-page-breaking.hh index 0e6a71d0d4..224f0e96d4 100644 --- a/lily/include/optimal-page-breaking.hh +++ b/lily/include/optimal-page-breaking.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/output-def.hh b/lily/include/output-def.hh index eff52c2c38..8c188f2707 100644 --- a/lily/include/output-def.hh +++ b/lily/include/output-def.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -46,14 +46,15 @@ one coming from score at markup level) */ -class Output_def +class Output_def : public Smob { - public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Output_def (); VIRTUAL_COPY_CONSTRUCTOR (Output_def, Output_def); - DECLARE_SMOBS (Output_def); -public: SCM scope_; Output_def *parent_; @@ -81,7 +82,6 @@ Interval line_dimensions_int (Output_def *def, int); Font_metric *select_encoded_font (Output_def *layout, SCM chain); Font_metric *select_font (Output_def *layout, SCM chain); -DECLARE_UNSMOB (Output_def, output_def); Font_metric* find_pango_font (Output_def *layout, SCM descr, Real factor); diff --git a/lily/include/page-breaking.hh b/lily/include/page-breaking.hh index c84a56e679..9a38485c28 100644 --- a/lily/include/page-breaking.hh +++ b/lily/include/page-breaking.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/page-layout-problem.hh b/lily/include/page-layout-problem.hh index b7d63a2e13..a98d264354 100644 --- a/lily/include/page-layout-problem.hh +++ b/lily/include/page-layout-problem.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2009--2012 Joe Neeman + Copyright (C) 2009--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/page-marker.hh b/lily/include/page-marker.hh index b608e080a9..33f3a38c06 100644 --- a/lily/include/page-marker.hh +++ b/lily/include/page-marker.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Nicolas Sceaux + Copyright (C) 2007--2015 Nicolas Sceaux LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,10 +23,13 @@ #include "smobs.hh" #include "virtual-methods.hh" -class Page_marker +class Page_marker : public Smob { - DECLARE_SMOBS (Page_marker); - +public: + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Page_marker (); +private: SCM symbol_; /* either 'page-turn-permission or 'page-break-permission */ SCM permission_; /* 'force, 'allow, or '() */ SCM label_; /* bookmarking label (a symbol) */ @@ -44,6 +47,5 @@ public: SCM label (); }; -DECLARE_UNSMOB (Page_marker, page_marker) #endif /* PAGE_MARKER_HH */ diff --git a/lily/include/page-spacing-result.hh b/lily/include/page-spacing-result.hh index e076a52da8..ccba917b07 100644 --- a/lily/include/page-spacing-result.hh +++ b/lily/include/page-spacing-result.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/page-spacing.hh b/lily/include/page-spacing.hh index 8f524537bd..4775baf674 100644 --- a/lily/include/page-spacing.hh +++ b/lily/include/page-spacing.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/page-turn-page-breaking.hh b/lily/include/page-turn-page-breaking.hh index 5bb74e801b..93fdaceada 100644 --- a/lily/include/page-turn-page-breaking.hh +++ b/lily/include/page-turn-page-breaking.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/pango-font.hh b/lily/include/pango-font.hh index ad559551d1..ff5e6302f0 100644 --- a/lily/include/pango-font.hh +++ b/lily/include/pango-font.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/paper-book.hh b/lily/include/paper-book.hh index d00c8bcd9b..9530c94b70 100644 --- a/lily/include/paper-book.hh +++ b/lily/include/paper-book.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Jan Nieuwenhuizen + Copyright (C) 2004--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,10 +27,13 @@ exports them to the output backend, either as systems or as completely formatted pages. */ -class Paper_book +class Paper_book : public Smob { - DECLARE_SMOBS (Paper_book); - +public: + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Paper_book (); +private: SCM systems_; SCM pages_; SCM performances_; @@ -74,6 +77,5 @@ protected: long *first_performance_number); }; -DECLARE_UNSMOB (Paper_book, paper_book) #endif /* PAPER_BOOK_HH */ diff --git a/lily/include/paper-column-engraver.hh b/lily/include/paper-column-engraver.hh index 3249432b40..a176fc48eb 100644 --- a/lily/include/paper-column-engraver.hh +++ b/lily/include/paper-column-engraver.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,12 +42,12 @@ protected: virtual void initialize (); virtual void finalize (); - DECLARE_TRANSLATOR_LISTENER (break); - DECLARE_TRANSLATOR_LISTENER (label); + void listen_break (Stream_event *); + void listen_label (Stream_event *); - DECLARE_ACKNOWLEDGER (item); - DECLARE_ACKNOWLEDGER (note_spacing); - DECLARE_ACKNOWLEDGER (staff_spacing); + void acknowledge_item (Grob_info); + void acknowledge_note_spacing (Grob_info); + void acknowledge_staff_spacing (Grob_info); System *system_; vector break_events_; diff --git a/lily/include/paper-column.hh b/lily/include/paper-column.hh index 01a84d50df..f1cb01e740 100644 --- a/lily/include/paper-column.hh +++ b/lily/include/paper-column.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -50,7 +50,6 @@ public: DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (before_line_breaking, (SCM)); - DECLARE_GROB_INTERFACE (); static int get_rank (Grob const *); static bool is_musical (Grob *); static Moment when_mom (Grob *); @@ -59,6 +58,7 @@ public: static bool is_extraneous_column_from_ligature (Grob *); static Real minimum_distance (Grob *l, Grob *r); static Interval break_align_width (Grob *me, SCM align_sym); + static Interval get_interface_extent (Grob *column, SCM iface, Axis a); }; #endif // PAPER_COLUMN_HH diff --git a/lily/include/paper-outputter.hh b/lily/include/paper-outputter.hh index 02bc2746a2..cd1a5e2c92 100644 --- a/lily/include/paper-outputter.hh +++ b/lily/include/paper-outputter.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,15 +30,16 @@ Glue between the backend (grobs, systems, pages) and the output file. proxy for Scheme backends. */ -class Paper_outputter +class Paper_outputter : public Smob { +public: + SCM mark_smob () const; + virtual ~Paper_outputter (); +private: SCM output_module_; string file_name_; SCM file_; -public: - DECLARE_SMOBS (Paper_outputter); - public: Paper_outputter (SCM port, const string &format); @@ -51,6 +52,5 @@ public: SCM scheme_to_string (SCM); }; -DECLARE_UNSMOB (Paper_outputter, outputter); #endif /* PAPER_OUTPUTTER_HH */ diff --git a/lily/include/paper-score.hh b/lily/include/paper-score.hh index f980ee154e..3d4d5840e1 100644 --- a/lily/include/paper-score.hh +++ b/lily/include/paper-score.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -54,7 +54,7 @@ protected: virtual void derived_mark () const; private: - Paper_score (Paper_score const &); + Paper_score (Paper_score const &); // Do not define! Not copyable! }; #endif /* PAPER_SCORE_HH */ diff --git a/lily/include/paper-system.hh b/lily/include/paper-system.hh index 5d0688d936..2e1df905e2 100644 --- a/lily/include/paper-system.hh +++ b/lily/include/paper-system.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Jan Nieuwenhuizen + Copyright (C) 2004--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/parse-scm.hh b/lily/include/parse-scm.hh index b39fa635ff..e5db86dcb0 100644 --- a/lily/include/parse-scm.hh +++ b/lily/include/parse-scm.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/percent-repeat-item.hh b/lily/include/percent-repeat-item.hh index 1c8e0f44b0..85b1cdb446 100644 --- a/lily/include/percent-repeat-item.hh +++ b/lily/include/percent-repeat-item.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,6 @@ class Percent_repeat_item_interface { public: - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (beat_slash, (SCM)); DECLARE_SCHEME_CALLBACK (double_percent, (SCM)); static Stencil x_percent (Grob *, int); diff --git a/lily/include/performance.hh b/lily/include/performance.hh index 9c3ce3742d..f9c53ff2e8 100644 --- a/lily/include/performance.hh +++ b/lily/include/performance.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,19 +31,25 @@ public: ~Performance (); DECLARE_CLASSNAME (Performance); + SCM get_header () const; + void set_header (SCM header); + + virtual void derived_mark () const; + void add_element (Audio_element *p); virtual void process (); void remap_grace_durations (); - void output (Midi_stream &midi_stream) const; + void output (Midi_stream &midi_stream, const string &performance_name) const; void output_header_track (Midi_stream &midi_stream) const; void print () const; - void write_output (string filename) const; + void write_output (string filename, const string &performance_name) const; vector audio_staffs_; vector audio_elements_; Output_def *midi_; bool ports_; + SCM header_; }; #endif /* PERFORMANCE_HH */ diff --git a/lily/include/performer-group.hh b/lily/include/performer-group.hh index 4316d8bb73..350af84de2 100644 --- a/lily/include/performer-group.hh +++ b/lily/include/performer-group.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -29,7 +29,7 @@ typedef void (Performer:: *Performer_method) (void); class Performer_group : public Translator_group { public: - VIRTUAL_COPY_CONSTRUCTOR (Translator_group, Performer_group); + DECLARE_CLASSNAME (Performer_group); void do_announces (); virtual void announce_element (Audio_element_info); diff --git a/lily/include/performer.hh b/lily/include/performer.hh index 1601625690..70354fdbf2 100644 --- a/lily/include/performer.hh +++ b/lily/include/performer.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -30,7 +30,7 @@ class Performer : public Translator { public: - VIRTUAL_COPY_CONSTRUCTOR (Translator, Performer); + DECLARE_CLASSNAME (Performer); friend class Performer_group; Performer_group *get_daddy_performer () const; @@ -40,7 +40,5 @@ protected: virtual void create_audio_elements (); }; -Performer *unsmob_performer (SCM perf); - #endif /* PERFORMER_HH */ diff --git a/lily/include/pitch-interval.hh b/lily/include/pitch-interval.hh index e067590f52..dd6b085c20 100644 --- a/lily/include/pitch-interval.hh +++ b/lily/include/pitch-interval.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/pitch.hh b/lily/include/pitch.hh index d7b36c2eb6..dad2bc1246 100644 --- a/lily/include/pitch.hh +++ b/lily/include/pitch.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,8 +32,13 @@ Pitch is lexicographically ordered by (octave, notename, alteration). */ -class Pitch +class Pitch : public Simple_smob { +public: + static SCM equal_p (SCM, SCM); + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; private: int octave_; int notename_; @@ -52,8 +57,7 @@ public: int get_notename () const; Rational get_alteration () const; - Pitch (int octave, int notename, Rational accidental); - Pitch (int octave, int notename); + Pitch (int octave, int notename, Rational accidental = 0); Pitch (); Pitch transposed (Pitch) const; @@ -71,7 +75,6 @@ public: string to_string () const; DECLARE_SCHEME_CALLBACK (less_p, (SCM a, SCM b)); - DECLARE_SIMPLE_SMOBS (Pitch); }; enum @@ -99,7 +102,6 @@ extern Rational DOUBLE_SHARP_ALTERATION; SCM ly_pitch_diff (SCM pitch, SCM root); SCM ly_pitch_transpose (SCM p, SCM delta); -DECLARE_UNSMOB (Pitch, pitch); INSTANTIATE_COMPARE (Pitch, Pitch::compare); diff --git a/lily/include/pointer-group-interface.hh b/lily/include/pointer-group-interface.hh index e265bedc79..26ff640610 100644 --- a/lily/include/pointer-group-interface.hh +++ b/lily/include/pointer-group-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/prob.hh b/lily/include/prob.hh index 58d93cae23..a9a485b550 100644 --- a/lily/include/prob.hh +++ b/lily/include/prob.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Jan Nieuwenhuizen + Copyright (C) 2004--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #ifndef PROPERTY_OBJECT_HH #define PROPERTY_OBJECT_HH +#include "pitch.hh" #include "stencil.hh" #include "virtual-methods.hh" @@ -31,9 +32,15 @@ Property_object. Page-breaking handles Property_object objects. */ -class Prob +class Prob : public Smob { - DECLARE_SMOBS (Prob); +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static SCM equal_p (SCM, SCM); + static const char * const type_p_name_; + virtual ~Prob (); +private: DECLARE_CLASSNAME (Prob); void init_vars (); @@ -55,9 +62,14 @@ public: SCM internal_get_property (SCM sym) const; void instrumented_set_property (SCM, SCM, const char *, int, const char *); void internal_set_property (SCM sym, SCM val); + + // Needed in both Music and Stream_event + // For technical reasons defined in lily/music.cc + // + /// Transpose, with the interval central C to #p# + void transpose (Pitch p); }; -DECLARE_UNSMOB (Prob, prob); SCM ly_prob_set_property_x (SCM system, SCM sym, SCM value); SCM ly_prob_property (SCM prob, SCM sym, SCM val); diff --git a/lily/include/profile.hh b/lily/include/profile.hh index 6ed139d6a2..f0f1a61237 100644 --- a/lily/include/profile.hh +++ b/lily/include/profile.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/program-option.hh b/lily/include/program-option.hh index 83526816de..acf1a93b5c 100644 --- a/lily/include/program-option.hh +++ b/lily/include/program-option.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Jan Nieuwenhuizen + Copyright (C) 2001--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/property-iterator.hh b/lily/include/property-iterator.hh index 08f7a983b8..984d41ef57 100644 --- a/lily/include/property-iterator.hh +++ b/lily/include/property-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,11 +29,9 @@ class Property_iterator : public Simple_music_iterator { public: DECLARE_SCHEME_CALLBACK (constructor, ()); - DECLARE_SCHEME_CALLBACK (once_finalization, (SCM, SCM, SCM)); DECLARE_CLASSNAME (Property_iterator); protected: - virtual void do_quit (); virtual void process (Moment); }; @@ -53,11 +51,9 @@ class Push_property_iterator : public Simple_music_iterator { public: DECLARE_SCHEME_CALLBACK (constructor, ()); - DECLARE_SCHEME_CALLBACK (once_finalization, (SCM, SCM)); DECLARE_CLASSNAME (Push_property_iterator); protected: virtual void process (Moment); - virtual void do_quit (); }; class Pop_property_iterator : public Simple_music_iterator diff --git a/lily/include/protected-scm.hh b/lily/include/protected-scm.hh index ccd0012690..0115cb9f9f 100644 --- a/lily/include/protected-scm.hh +++ b/lily/include/protected-scm.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,19 +24,36 @@ /* Mix GUILE GC with C++ ctors and dtors. + + This version is intended to be only used for variables of static + lifetime (which are not feasible to protect using the per-instance + mechanism of the smob classes) but possibly varying content. As a + result, the protection mechanism being used is the irreversible + scm_permanent_object. The destructor (typically called after the + end of program execution) does not free resources and consequently + does not require the memory subsystem to be still workable. A + working memory subsystem is only required once a non-immediate + Scheme value is assigned to the variable. Since creation of a + non-immediate Scheme value requires a working memory subsystem in + the first place, this is not really a restriction. + + To avoid accidental creation of temporaries, the copy constructor is + made unavailable. */ class Protected_scm { SCM object_; + static SCM list_; + static SCM last_; + Protected_scm (Protected_scm const &); + void protectify (SCM); public: Protected_scm (); Protected_scm (SCM); - Protected_scm (Protected_scm const &); - ~Protected_scm (); Protected_scm &operator = (SCM); Protected_scm &operator = (Protected_scm const &); - operator SCM () const; - SCM to_SCM () const; + operator const SCM & () const; + operator SCM & (); }; #endif /* PROTECTED_SCM_HH */ diff --git a/lily/include/pure-from-neighbor-interface.hh b/lily/include/pure-from-neighbor-interface.hh index 5cf10fee35..f125d217e4 100644 --- a/lily/include/pure-from-neighbor-interface.hh +++ b/lily/include/pure-from-neighbor-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ class Pure_from_neighbor_interface { public: DECLARE_SCHEME_CALLBACK (calc_pure_relevant_grobs, (SCM)); - DECLARE_GROB_INTERFACE (); }; diff --git a/lily/include/relocate.hh b/lily/include/relocate.hh index 5fda3c73a7..c531d97cfb 100644 --- a/lily/include/relocate.hh +++ b/lily/include/relocate.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/repeated-music.hh b/lily/include/repeated-music.hh index 35a4aaa6e0..a346f6a388 100644 --- a/lily/include/repeated-music.hh +++ b/lily/include/repeated-music.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -62,7 +62,6 @@ public: /* How often do we repeat? */ static int repeat_count (Music *); - DECLARE_SCHEME_CALLBACK (relative_callback, (SCM, SCM)); static Moment body_get_length (Music *); static Moment alternatives_get_length (Music *, bool fold); diff --git a/lily/include/rest-collision.hh b/lily/include/rest-collision.hh index 53c2cda6a0..3946f9b933 100644 --- a/lily/include/rest-collision.hh +++ b/lily/include/rest-collision.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,6 @@ class Rest_collision public: static void add_column (Grob *me, Grob *); - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM element)); DECLARE_SCHEME_CALLBACK (force_shift_callback_rest, (SCM element, SCM off)); static SCM do_shift (Grob *); diff --git a/lily/include/rest.hh b/lily/include/rest.hh index d5dbae9e25..644aa1450c 100644 --- a/lily/include/rest.hh +++ b/lily/include/rest.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,14 +29,12 @@ class Rest public: DECLARE_SCHEME_CALLBACK (y_offset_callback, (SCM)); DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM)); - DECLARE_GROB_INTERFACE (); static string glyph_name (Grob *, int durlog, const string &style, bool, Real); static Real staff_position_internal (Grob *, int /* duration_log */, int /* dir */); static SCM brew_internal_stencil (Grob *, bool); static SCM generic_extent_callback (Grob *, Axis); static void translate (Grob *me, int dy); - DECLARE_SCHEME_CALLBACK (polyphonic_offset_callback, (SCM)); DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (width, (SCM)); DECLARE_SCHEME_CALLBACK (height, (SCM)); diff --git a/lily/include/rhythmic-head.hh b/lily/include/rhythmic-head.hh index 0739daad0f..17eecd4f22 100644 --- a/lily/include/rhythmic-head.hh +++ b/lily/include/rhythmic-head.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,7 +32,6 @@ public: static Item *get_dots (Grob *); static int dot_count (Grob *); DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif // RHYTHMIC_HEAD_HH diff --git a/lily/include/rod.hh b/lily/include/rod.hh index 077b8cfc1d..01b4e5cc2c 100644 --- a/lily/include/rod.hh +++ b/lily/include/rod.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/scale.hh b/lily/include/scale.hh index 62d8d553ec..19cd175c79 100644 --- a/lily/include/scale.hh +++ b/lily/include/scale.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,9 +24,9 @@ #include "rational.hh" #include "std-vector.hh" -struct Scale +struct Scale : public Smob { -public: + virtual ~Scale (); Scale (vector const &); Scale (Scale const &); @@ -35,7 +35,6 @@ public: int step_count () const; int normalize_step (int step) const; - DECLARE_SMOBS (Scale); private: vector step_tones_; @@ -44,4 +43,3 @@ private: extern Scale *default_global_scale; #endif /* SCALE_HH */ - diff --git a/lily/include/scheme-engraver.hh b/lily/include/scheme-engraver.hh index a90252d04a..59cab571fb 100644 --- a/lily/include/scheme-engraver.hh +++ b/lily/include/scheme-engraver.hh @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - Copyright (c) 2009--2012 Han-Wen Nienhuys + Copyright (c) 2009--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,54 +26,43 @@ class Scheme_engraver : public Engraver { -public: void init_from_scheme (SCM definition); - TRANSLATOR_DECLARATIONS_NO_LISTENER (Scheme_engraver); - - static Listener get_listener (void *generic_arg, SCM event); +public: + TRANSLATOR_FAMILY_DECLARATIONS (Scheme_engraver); + Scheme_engraver (SCM definition); protected: ~Scheme_engraver (); - void stop_translation_timestep (); - void start_translation_timestep (); - void process_music (); - void process_acknowledged (); - virtual void initialize (); virtual void finalize (); virtual void derived_mark () const; - virtual translator_listener_record *get_listener_list () const; + virtual SCM get_listener_list () const; virtual bool must_be_last () const; private: - void acknowledge_grob_by_hash (Grob_info info, SCM iface_function_hash); - void init_acknowledgers (SCM alist, SCM *hash); + virtual SCM get_acknowledger (SCM sym, Direction start_end) + { + return generic_get_acknowledger + (sym, interface_acknowledger_hash_[start_end]); + } - DECLARE_ACKNOWLEDGER (grob); - DECLARE_END_ACKNOWLEDGER (grob); + SCM init_acknowledgers (SCM alist); + // For now no description. In future, something derived from the + // definition might make sense. + SCM translator_description () const { return SCM_EOL; } bool must_be_last_; - SCM acknowledge_grob_function_; - SCM stop_translation_timestep_function_; - SCM start_translation_timestep_function_; - SCM process_music_function_; - SCM process_acknowledged_function_; SCM initialize_function_; SCM finalize_function_; + SCM precomputable_methods_ [TRANSLATOR_METHOD_PRECOMPUTE_COUNT]; // hashq table of interface-symbol -> scheme-function - SCM interface_acknowledger_hash_; - SCM interface_end_acknowledger_hash_; + Drul_array interface_acknowledger_hash_; // Alist of listened-symbol . scheme-function - SCM listeners_alist_; - - // We dont use this, but need it for the documentation boilerplate. - static translator_listener_record *listener_list_; - translator_listener_record *per_instance_listeners_; + SCM per_instance_listeners_; }; #endif /* SCHEME_ENGRAVER_HH */ - diff --git a/lily/include/scm-hash.hh b/lily/include/scm-hash.hh index c81225913f..3453904f71 100644 --- a/lily/include/scm-hash.hh +++ b/lily/include/scm-hash.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,7 +20,7 @@ #ifndef SCM_HASH_HH #define SCM_HASH_HH -#include "smobs.hh" +#include "small-smobs.hh" /* hash table. @@ -43,24 +43,21 @@ scm_gc_unprotect_object (tab->self_scm_); */ -class Scheme_hash_table +class Scheme_hash_table : public Smob1 { public: + int print_smob (SCM, scm_print_state *) const; bool try_retrieve (SCM key, SCM *val); bool contains (SCM key) const; void set (SCM k, SCM v); SCM get (SCM k) const; void remove (SCM k); - Scheme_hash_table (); void operator = (Scheme_hash_table const &); - Scheme_hash_table (Scheme_hash_table const &); SCM to_alist () const; + static SCM make_smob (); private: - SCM hash_tab_; - void copy (Scheme_hash_table const &src); - DECLARE_SMOBS (Scheme_hash_table); + SCM &hash_tab () const { return scm1 (); } }; #endif /* SCM_HASH_HH */ - diff --git a/lily/include/score-engraver.hh b/lily/include/score-engraver.hh index ffff8c41aa..d0ec782167 100644 --- a/lily/include/score-engraver.hh +++ b/lily/include/score-engraver.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,16 +32,16 @@ class Score_engraver : public Engraver_group void typeset_all (); protected: - DECLARE_LISTENER (finish); - DECLARE_LISTENER (prepare); - DECLARE_LISTENER (one_time_step); + void finish (SCM); + void prepare (SCM); + void one_time_step (SCM); /* Engraver_group_engraver interface */ virtual void connect_to_context (Context *); virtual void disconnect_from_context (); virtual void initialize (); virtual void finalize (); - virtual void announce_grob (Grob_info); + virtual void announce_grob (Grob_info, Direction dir, Context *reroute_context = 0); void stop_translation_timestep (); /* diff --git a/lily/include/score-performer.hh b/lily/include/score-performer.hh index 8eb67b3f29..5830953aff 100644 --- a/lily/include/score-performer.hh +++ b/lily/include/score-performer.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -30,16 +30,16 @@ class Score_performer : public Performer_group { public: - VIRTUAL_COPY_CONSTRUCTOR (Translator_group, Score_performer); + DECLARE_CLASSNAME (Score_performer); Performance *performance_; ~Score_performer (); Score_performer (); protected: - DECLARE_LISTENER (finish); - DECLARE_LISTENER (prepare); - DECLARE_LISTENER (one_time_step); + void finish (SCM); + void prepare (SCM); + void one_time_step (SCM); /* Engraver_group_engraver interface */ virtual void connect_to_context (Context *); diff --git a/lily/include/score.hh b/lily/include/score.hh index 1b34d40410..a5918242f1 100644 --- a/lily/include/score.hh +++ b/lily/include/score.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,10 +27,13 @@ #include "smobs.hh" #include "virtual-methods.hh" -class Score +class Score : public Smob { - DECLARE_SMOBS (Score); - +public: + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Score (); +private: SCM music_; SCM input_location_; SCM header_; @@ -53,7 +56,6 @@ public: void set_header (SCM module); }; -DECLARE_UNSMOB (Score, score); SCM ly_run_translator (SCM, SCM); diff --git a/lily/include/script-column.hh b/lily/include/script-column.hh index 4b9a52ad9c..fe4816eae1 100644 --- a/lily/include/script-column.hh +++ b/lily/include/script-column.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,6 @@ public: static void add_side_positioned (Grob *, Grob *); DECLARE_SCHEME_CALLBACK (before_line_breaking, (SCM)); DECLARE_SCHEME_CALLBACK (row_before_line_breaking, (SCM)); - DECLARE_GROB_INTERFACE (); static void order_grobs (vector grobs); }; diff --git a/lily/include/script-interface.hh b/lily/include/script-interface.hh index 00e2e6d81f..9154aea6cc 100644 --- a/lily/include/script-interface.hh +++ b/lily/include/script-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,7 +34,6 @@ public: static Stencil get_stencil (Grob *, Direction d); static Direction get_direction (Grob *); - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM)); diff --git a/lily/include/self-alignment-interface.hh b/lily/include/self-alignment-interface.hh index dd69f86630..4cf683fd36 100644 --- a/lily/include/self-alignment-interface.hh +++ b/lily/include/self-alignment-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,23 +25,19 @@ struct Self_alignment_interface { - DECLARE_GROB_INTERFACE (); static SCM aligned_on_self (Grob *me, Axis a, bool pure, int start, int end); static SCM centered_on_object (Grob *me, Axis a); static SCM aligned_on_parent (Grob *me, Axis a); - static void set_center_parent (Grob *me, Axis a); - static void set_align_self (Grob *me, Axis a); + static void set_aligned_on_parent (Grob *me, Axis a); DECLARE_SCHEME_CALLBACK (x_aligned_on_self, (SCM element)); DECLARE_SCHEME_CALLBACK (y_aligned_on_self, (SCM element)); DECLARE_SCHEME_CALLBACK (pure_y_aligned_on_self, (SCM element, SCM start, SCM end)); - DECLARE_SCHEME_CALLBACK (centered_on_note_columns, (SCM element)); DECLARE_SCHEME_CALLBACK (centered_on_x_parent, (SCM element)); DECLARE_SCHEME_CALLBACK (centered_on_y_parent, (SCM element)); - DECLARE_SCHEME_CALLBACK (x_centered_on_y_parent, (SCM element)); DECLARE_SCHEME_CALLBACK (aligned_on_x_parent, (SCM element)); DECLARE_SCHEME_CALLBACK (aligned_on_y_parent, (SCM element)); }; diff --git a/lily/include/semi-tie-column.hh b/lily/include/semi-tie-column.hh index 51a3d74388..e02b57a11e 100644 --- a/lily/include/semi-tie-column.hh +++ b/lily/include/semi-tie-column.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -26,7 +26,6 @@ struct Semi_tie_column { - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM)); DECLARE_SCHEME_CALLBACK (calc_head_direction, (SCM)); diff --git a/lily/include/semi-tie.hh b/lily/include/semi-tie.hh index a92b89fb4a..1e8db8bdb8 100644 --- a/lily/include/semi-tie.hh +++ b/lily/include/semi-tie.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,13 +25,12 @@ struct Semi_tie { - DECLARE_GROB_INTERFACE (); - DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); DECLARE_SCHEME_CALLBACK (calc_control_points, (SCM)); - static bool less (Grob *const &s1, - Grob *const &s2); - static int get_position (Grob *); + static bool less (Grob *s1, Grob *s2); + static int get_column_rank (Item *); + static int get_position (Item *); + static Item *head (Item *); }; #endif /* SEMI_TIE_HH */ diff --git a/lily/include/separation-item.hh b/lily/include/separation-item.hh index 392c59ca48..81ea523fe2 100644 --- a/lily/include/separation-item.hh +++ b/lily/include/separation-item.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ struct Separation_item { - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (calc_skylines, (SCM)); DECLARE_SCHEME_CALLBACK (print, (SCM)); diff --git a/lily/include/sequential-iterator.hh b/lily/include/sequential-iterator.hh index a4fcdb0cc3..2b35bde1f8 100644 --- a/lily/include/sequential-iterator.hh +++ b/lily/include/sequential-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/side-position-interface.hh b/lily/include/side-position-interface.hh index e7c1637471..c0330e795d 100644 --- a/lily/include/side-position-interface.hh +++ b/lily/include/side-position-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,8 +32,6 @@ struct Side_position_interface { public: - DECLARE_SCHEME_CALLBACK (y_aligned_on_support_refpoints, (SCM element)); - DECLARE_SCHEME_CALLBACK (pure_y_aligned_on_support_refpoints, (SCM element, SCM start, SCM end)); DECLARE_SCHEME_CALLBACK (x_aligned_side, (SCM element, SCM current)); DECLARE_SCHEME_CALLBACK (y_aligned_side, (SCM element, SCM current)); DECLARE_SCHEME_CALLBACK (pure_y_aligned_side, (SCM element, SCM start, SCM end, SCM current)); @@ -44,7 +42,6 @@ public: static Axis get_axis (Grob *); static void set_axis (Grob *, Axis); - DECLARE_GROB_INTERFACE (); static void add_support (Grob *, Grob *); static void recursive_add_support (Grob *, Grob *); static void add_staff_support (Grob *); diff --git a/lily/include/simple-closure.hh b/lily/include/simple-closure.hh deleted file mode 100644 index a4587c2a95..0000000000 --- a/lily/include/simple-closure.hh +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of LilyPond, the GNU music typesetter. - - Copyright (C) 2005--2012 Han-Wen Nienhuys - - LilyPond is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - LilyPond is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LilyPond. If not, see . -*/ - -#ifndef SIMPLE_CLOSURE_HH -#define SIMPLE_CLOSURE_HH - -#include "lily-guile.hh" - -bool is_simple_closure (SCM s); -SCM simple_closure_expression (SCM smob); -SCM evaluate_with_simple_closure (SCM delayed_argument, SCM expr, bool pure, int start, int end); -SCM ly_make_simple_closure (SCM); - -#endif /* SIMPLE_CLOSURE_HH */ diff --git a/lily/include/simple-music-iterator.hh b/lily/include/simple-music-iterator.hh index 75a648b6bd..46551101a9 100644 --- a/lily/include/simple-music-iterator.hh +++ b/lily/include/simple-music-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/simple-spacer.hh b/lily/include/simple-spacer.hh index 675e3baf54..d036dd191d 100644 --- a/lily/include/simple-spacer.hh +++ b/lily/include/simple-spacer.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ #include "spring.hh" #include "smobs.hh" -class Simple_spacer +class Simple_spacer : public Simple_smob { public: Simple_spacer (); @@ -43,7 +43,6 @@ public: Real force_penalty (bool ragged) const; bool fits () const; - DECLARE_SIMPLE_SMOBS (Simple_spacer); private: Real expand_line (); @@ -69,4 +68,3 @@ Column_x_positions get_line_configuration (vector const &columns, bool ragged); #endif /* SIMPLE_SPACER_HH */ - diff --git a/lily/include/simultaneous-music-iterator.hh b/lily/include/simultaneous-music-iterator.hh index c8766cd77c..0135a7a191 100644 --- a/lily/include/simultaneous-music-iterator.hh +++ b/lily/include/simultaneous-music-iterator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/skyline-pair.hh b/lily/include/skyline-pair.hh index 566b9be3f7..f7946c1851 100644 --- a/lily/include/skyline-pair.hh +++ b/lily/include/skyline-pair.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2008--2012 Han-Wen Nienhuys + Copyright (C) 2008--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,12 +22,13 @@ #include "skyline.hh" -class Skyline_pair +class Skyline_pair : public Simple_smob { +public: + static const char * const type_p_name_; private: Drul_array skylines_; - DECLARE_SIMPLE_SMOBS (Skyline_pair); public: Skyline_pair (); Skyline_pair (vector const &boxes, Axis a); @@ -39,7 +40,6 @@ public: Real right () const; void raise (Real); void shift (Real); - void deholify (); void insert (Box const &, Axis); void merge (Skyline_pair const &other); Skyline &operator [] (Direction d); diff --git a/lily/include/skyline.hh b/lily/include/skyline.hh index 6846474857..43feb40761 100644 --- a/lily/include/skyline.hh +++ b/lily/include/skyline.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,13 +44,14 @@ struct Building Real height (Real x) const; Real intersection_x (Building const &other) const; - void leading_part (Real chop); - bool conceals (Building const &other, Real x) const; + bool above (Building const &other, Real x) const; Real shift_to_intersect (Real x, Real y) const; }; -class Skyline +class Skyline : public Simple_smob { +public: + static const char * const type_p_name_; private: list buildings_; Direction sky_; @@ -62,7 +63,6 @@ private: Real internal_distance (Skyline const &, Real *touch_point) const; void normalize (); - DECLARE_SIMPLE_SMOBS (Skyline); public: Skyline (); @@ -73,7 +73,6 @@ public: Skyline (Box const &b, Axis a, Direction sky); vector to_points (Axis) const; - void deholify (); void merge (Skyline const &); void insert (Box const &, Axis); void print () const; @@ -107,4 +106,3 @@ public: extern bool debug_skylines; #endif /* SKYLINE_HH */ - diff --git a/lily/include/slur-configuration.hh b/lily/include/slur-configuration.hh index 5114815619..be30352676 100644 --- a/lily/include/slur-configuration.hh +++ b/lily/include/slur-configuration.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/slur-engraver.hh b/lily/include/slur-engraver.hh new file mode 100644 index 0000000000..572e7ea023 --- /dev/null +++ b/lily/include/slur-engraver.hh @@ -0,0 +1,75 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2013--2015 Mike Solomon + Copyright (C) 2016 David Kastrup + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#ifndef SLUR_ENGRAVER_HH +#define SLUR_ENGRAVER_HH + +#include "engraver.hh" +#include + +class Slur_engraver : public Engraver +{ +protected: + struct Event_info { + Stream_event *slur_, *note_; + Event_info (Stream_event *slur, Stream_event *note) + : slur_ (slur), note_ (note) + { } + }; + // protected so that subclasses can see them + vector start_events_; + vector stop_events_; + + typedef std::multimap Note_slurs; + Drul_array note_slurs_; + vector slurs_; + vector end_slurs_; + vector objects_to_acknowledge_; + + virtual SCM event_symbol () const; + virtual bool double_property () const; + virtual SCM grob_symbol () const; + virtual const char* object_name () const; + + void acknowledge_note_column (Grob_info); + void acknowledge_script (Grob_info); + + void listen_note (Stream_event *ev); + // A slur on an in-chord note is not actually announced as an event + // but rather produced by the note listener. + void listen_note_slur (Stream_event *ev, Stream_event *note); + void listen_slur (Stream_event *ev) { listen_note_slur (ev, 0); } + void acknowledge_extra_object (Grob_info); + void stop_translation_timestep (); + void process_music (); + + bool can_create_slur (const string&, vsize, vsize *, Stream_event *); + void create_slur (const string &spanner_id, Event_info evi, Grob *g_cause, Direction dir, bool left_broken); + bool try_to_end (Event_info evi); + + virtual void set_melisma (bool); + virtual void finalize (); + virtual void derived_mark () const; + +public: + TRANSLATOR_DECLARATIONS (Slur_engraver); +}; + +#endif // SLUR_ENGRAVER_HH diff --git a/lily/include/slur-proto-engraver.hh b/lily/include/slur-proto-engraver.hh deleted file mode 100644 index e27c96a759..0000000000 --- a/lily/include/slur-proto-engraver.hh +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of LilyPond, the GNU music typesetter. - - Copyright (C) 2013 Mike Solomon - - LilyPond is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - LilyPond is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LilyPond. If not, see . -*/ - -#ifndef SLUR_PROTO_ENGRAVER_HH -#define SLUR_PROTO_ENGRAVER_HH - -#include "engraver.hh" -#include "moment.hh" - -class Slur_proto_engraver : public Engraver -{ -protected: - Slur_proto_engraver (const char* double_property_name, - const char* grob_name, const char* object_name, const char* event_name) : - double_property_name_ (double_property_name), - grob_name_ (grob_name), object_name_ (object_name), - event_name_ (event_name) {} - - // protected so that subclasses can see them - vector start_events_; - vector stop_events_; - vector slurs_; - vector end_slurs_; - vector objects_to_acknowledge_; - const char* double_property_name_; - const char* grob_name_; - const char* object_name_; - const char* event_name_; - - DECLARE_ACKNOWLEDGER (inline_accidental); - DECLARE_ACKNOWLEDGER (fingering); - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_ACKNOWLEDGER (script); - DECLARE_ACKNOWLEDGER (dots); - DECLARE_ACKNOWLEDGER (text_script); - DECLARE_END_ACKNOWLEDGER (tie); - DECLARE_ACKNOWLEDGER (tuplet_number); - - void internal_listen_slur (Stream_event *ev); - void acknowledge_extra_object (Grob_info); - void stop_translation_timestep (); - void process_music (); - - bool can_create_slur (const string&, vsize, vsize *, Stream_event *); - void create_slur (const string &spanner_id, Stream_event *ev_cause, Grob *g_cause, Direction dir, bool left_broken); - bool try_to_end (Stream_event *ev); - - virtual void set_melisma (bool); - virtual void finalize (); - virtual void derived_mark () const; - -public: - // no TRANSLATOR_DECLARATIONS (Slur_proto_engraver) needed since this - // class is abstract -}; - -#endif // SLUR_PROTO_ENGRAVER_HH diff --git a/lily/include/slur-score-parameters.hh b/lily/include/slur-score-parameters.hh index 75b1ae8e46..2177d03bf7 100644 --- a/lily/include/slur-score-parameters.hh +++ b/lily/include/slur-score-parameters.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,6 +40,8 @@ struct Slur_score_parameters Real free_head_distance_; Real extra_encompass_collision_distance_; Real extra_encompass_free_distance_; + Real gap_to_staffline_inside_; + Real gap_to_staffline_outside_; Real absolute_closeness_measure_; Real edge_slope_exponent_; Real close_to_edge_length_; diff --git a/lily/include/slur-scoring.hh b/lily/include/slur-scoring.hh index e5ff38d611..1ae187477b 100644 --- a/lily/include/slur-scoring.hh +++ b/lily/include/slur-scoring.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -100,6 +100,7 @@ struct Slur_score_state Drul_array base_attachments_; vector configurations_; Real staff_space_; + Real line_thickness_; Real thickness_; Slur_score_state (); diff --git a/lily/include/slur.hh b/lily/include/slur.hh index b20311785d..ae85ac24d3 100644 --- a/lily/include/slur.hh +++ b/lily/include/slur.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,6 @@ public: DECLARE_SCHEME_CALLBACK (pure_outside_slur_callback, (SCM, SCM, SCM, SCM)); DECLARE_SCHEME_CALLBACK (outside_slur_cross_staff, (SCM, SCM)); DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM)); - DECLARE_GROB_INTERFACE (); static Bezier get_curve (Grob *me); }; diff --git a/lily/include/small-smobs.hh b/lily/include/small-smobs.hh new file mode 100644 index 0000000000..07fd4ef341 --- /dev/null +++ b/lily/include/small-smobs.hh @@ -0,0 +1,94 @@ +#ifndef SMALL_SMOBS_HH +#define SMALL_SMOBS_HH + +#include "smobs.hh" + +#if GUILEV2 +// Fix the APIs of GUILE2.x, broken in 2009--2014 +#undef SCM_SMOB_OBJECT_LOC +#undef SCM_SMOB_OBJECT_2_LOC +#undef SCM_SMOB_OBJECT_3_LOC +#define SCM_SMOB_OBJECT_LOC(x) (SCM_SMOB_OBJECT_N_LOC ((x), 1)) +#define SCM_SMOB_OBJECT_2_LOC(x) (SCM_SMOB_OBJECT_N_LOC ((x), 2)) +#define SCM_SMOB_OBJECT_3_LOC(x) (SCM_SMOB_OBJECT_N_LOC ((x), 3)) +#endif + +// This is tricky: the small smobs contain all the data in the smob +// itself. Any derived classes must _not_ contain any data members or +// be polymorphic (contain a virtual table pointer) as there is no +// place to store any of that. The class itself does not contain a +// data member either. Pointers to it are basically meaningless and +// are instead reinterpreted directly as an SCM value in order to have +// unsmob and friends behave as customary. + +template +class Smob1 : public Smob_base +{ + Smob1 (); // Do not define! Not constructible! + Smob1 (const Smob1 &); // Do not define! Not copyable! +public: + SCM self_scm () const { return SCM_PACK (this); } + SCM & scm1 () const { return *SCM_SMOB_OBJECT_LOC (self_scm ()); } + static SCM make_smob (SCM arg1 = SCM_UNDEFINED) { + SCM_RETURN_NEWSMOB (Smob_base::smob_tag (), SCM_UNPACK (arg1)); + } + SCM mark_smob () const { return scm1 (); }; + static Super *unchecked_unsmob (SCM s) { + return reinterpret_cast (SCM_UNPACK (s)); + } +}; + +template +class Smob2 : public Smob_base +{ + Smob2 (); // Do not define! Not constructible! + Smob2 (const Smob2 &); // Do not define! Not copyable! +public: + SCM self_scm () const { return SCM_PACK (this); } + SCM & scm1 () const { return *SCM_SMOB_OBJECT_LOC (self_scm ()); } + SCM & scm2 () const { return *SCM_SMOB_OBJECT_2_LOC (self_scm ()); } + static SCM make_smob (SCM arg1 = SCM_UNDEFINED, SCM arg2 = SCM_UNDEFINED) { + SCM_RETURN_NEWSMOB2 (Smob_base::smob_tag (), + SCM_UNPACK (arg1), + SCM_UNPACK (arg2)); + } + SCM mark_smob () const + { + scm_gc_mark (scm2 ()); + return scm1 (); + } + static Super *unchecked_unsmob (SCM s) { + return reinterpret_cast (SCM_UNPACK (s)); + } +}; + +template +class Smob3 : public Smob_base +{ + Smob3 (); // Do not define! Not constructible! + Smob3 (const Smob3 &); // Do not define! Not copyable! +public: + SCM self_scm () const { return SCM_PACK (this); } + SCM & scm1 () const { return *SCM_SMOB_OBJECT_LOC (self_scm ()); } + SCM & scm2 () const { return *SCM_SMOB_OBJECT_2_LOC (self_scm ()); } + SCM & scm3 () const { return *SCM_SMOB_OBJECT_3_LOC (self_scm ()); } + static SCM make_smob (SCM arg1 = SCM_UNDEFINED, + SCM arg2 = SCM_UNDEFINED, + SCM arg3 = SCM_UNDEFINED) { + SCM_RETURN_NEWSMOB3 (Smob_base::smob_tag (), + SCM_UNPACK (arg1), + SCM_UNPACK (arg2), + SCM_UNPACK (arg3)); + } + SCM mark_smob () const + { + scm_gc_mark (scm3 ()); + scm_gc_mark (scm2 ()); + return scm1 (); + } + static Super *unchecked_unsmob (SCM s) { + return reinterpret_cast (SCM_UNPACK (s)); + } +}; + +#endif diff --git a/lily/include/smobs.hh b/lily/include/smobs.hh index cd111981bb..7ef46b23e4 100644 --- a/lily/include/smobs.hh +++ b/lily/include/smobs.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,14 +21,19 @@ #define SMOBS_HH #include "lily-guile.hh" +#include "lily-proto.hh" #include "warn.hh" +#include /* Smobs are GUILEs mechanism of exporting C(++) objects to the Scheme world. They are documented in the GUILE manual. - In LilyPond, smobs are created from C++ objects through macros. + In LilyPond, C++ objects can be placed under the control of GUILE's + type system and garbage collection mechanism by inheriting from one + of several Smob base classes. + There are two types of smob objects. 1. Simple smobs are intended for simple objects like numbers: @@ -37,8 +42,7 @@ To obtain an SCM version of a simple smob, use the member function SCM smobbed_copy (). - Simple smobs are created by adding the - DECLARE_SIMPLE_SMOBS(Classname) to the declaration + Simple smobs are created by deriving from Simple_smob. A simple smob is only optionally under the reign of the GUILE garbage collector: its usual life time is that of a normal C++ @@ -68,7 +72,7 @@ For example, - Complex_smob::Complex_smob () { + Complex_smob::Complex_smob : public Smob () { scm_member_ = SCM_EOL; smobify_self (); scm_member_ = <..what you want to store..> @@ -89,89 +93,233 @@ Complex_smob *p = new Complex_smob; list = scm_cons (p->unprotect (), list); - Complex smobs are made with DECLARE_SMOBS (Classname) in the class - declaration. + Complex smobs are created by deriving from Smob. CALLING INTERFACE - Common public methods to C++ smob objects: - - unsmob (SCM x) - unpacks X and returns pointer to the C++ object, or 0 - if it has the wrong type. - - SCM equal_p (SCM a, SCM b) - compare A and B. Returns a Scheme boolean + Common global functions for accessing C++ smob objects: + - unsmob (SCM x) - unpack X and return a pointer to the C++ object, + or 0 if it has the wrong type. IMPLEMENTATION - For implementating a class, the following should be provided + For implementating a class, the following public members can be + provided in the top class itself: - - an equal_p () function (a default is in the - IMPLEMENT_DEFAULT_EQUAL_P macro in ly-smobs.icc) + - SCM equal_p (SCM a, SCM b) - compare A and B. Returns a Scheme + boolean. If the class does not define this function, equal? will + be equivalent to eq?. The function will only be called when both + objects are of the respective type and not eq? to each other. - mark_smob () function, that calls scm_gc_mark () on all Scheme - objects in the class + objects in the class. If the class does not define this function, + it must not contain non-immediate Scheme values. - a print_smob () function, that displays a representation for - debugging purposes + debugging purposes. If the class does not define this function, + the output will be # when printing. + + - a static const * const type_p_name_ string set to something like + "ly:grob?". When provided, an accordingly named function for + checking for the given smob type will be available in Scheme. - - A call to one of the IMPLEMENT_SMOBS or IMPLEMENT_SIMPLE_SMOBS macros - from file "ly-smobs.icc" */ -#define DECLARE_SIMPLE_SMOBS(CL) \ - public: \ - SCM smobbed_copy () const; \ - DECLARE_BASE_SMOBS (CL) - -#define DECLARE_BASE_SMOBS(CL) \ - friend class Non_existent_class; \ - private: \ - static const char* smob_name_; \ - static scm_t_bits smob_tag_; \ - static SCM mark_smob (SCM); \ - static size_t free_smob (SCM s); \ - static int print_smob (SCM s, SCM p, scm_print_state*); \ - public: \ - static SCM equal_p (SCM a, SCM b); \ - static CL *unsmob (SCM s) __attribute__((pure)) \ - { \ - if (SCM_NIMP (s) && SCM_CELL_TYPE (s) == smob_tag_) \ - return (CL *) SCM_CELL_WORD_1 (s); \ - else \ - return 0; \ - } \ - static SCM smob_p (SCM); \ - static void init_smobs (); \ - private: - -#define DECLARE_SMOBS(CL) \ - DECLARE_BASE_SMOBS (CL) \ - protected: \ - virtual ~CL (); \ - SCM unprotected_smobify_self (); \ - private: \ - void smobify_self (); \ - SCM self_scm_; \ - SCM protection_cons_; \ - public: \ - SCM unprotect (); \ - void protect (); \ - SCM self_scm () const { return self_scm_; } \ - private: - -#define DECLARE_UNSMOB(CL, name) \ - inline CL * \ - unsmob_ ## name (SCM s) \ - { \ - return CL::unsmob (s); \ - } - -#define DECLARE_TYPE_P(CL) extern SCM CL ## _type_p_proc +// Initialization class. Create a variable or static data member of +// this type at global scope (or creation will happen too late for +// Scheme initialization), initialising with a function to be called. +// Reference somewhere (like in the constructor of the containing +// class) to make sure the variable is actually instantiated. + +class Scm_init { + static const Scm_init * list_; + void (*const fun_)(void); + Scm_init const * const next_; + Scm_init (); // don't use default constructor, don't define + Scm_init (const Scm_init &); // don't define copy constructor +public: + Scm_init (void (*fun) (void)) : fun_ (fun), next_ (list_) + { list_ = this; } + static void init (); +}; + +template +class Smob_base +{ + static scm_t_bits smob_tag_; + static Scm_init scm_init_; + static void init (void); + static string smob_name_; +protected: + static Super *unchecked_unsmob (SCM s) + { + return reinterpret_cast (SCM_SMOB_DATA (s)); + } + // reference scm_init_ in smob_tag which is sure to be called. The + // constructor, in contrast, may not be called at all in classes + // like Smob1. + static scm_t_bits smob_tag () { (void) scm_init_; return smob_tag_; } + Smob_base () { } + static SCM register_ptr (Super *p); + static Super *unregister_ptr (SCM obj); +private: + // Those fallbacks are _only_ for internal use by Smob_base. They + // are characterized by no knowledge about the implemented type + // apart from the type's name. Overriding them as a template + // specialization is _not_ intended since a type-dependent + // implementation will in general need access to possibly private + // parts of the Super class. So any class-dependent override should + // be done by redefining the respective function in the Super class + // (where it will mask the private template member) rather than + // specializing a different template function/pointer. + // + // Most default functions are do-nothings. void init() will + // recognize their address when not overriden and will then refrain + // altogether from passing the the respective callbacks to GUILE. + + SCM mark_smob (void) const; + static SCM mark_trampoline (SCM); // Used for calling mark_smob + static size_t free_smob (SCM obj); + static SCM equal_p (SCM, SCM); + int print_smob (SCM, scm_print_state *) const; + static int print_trampoline (SCM, SCM, scm_print_state *); + static void smob_proc_init (scm_t_bits) { }; + + // Define type_p_name_ in the Super class as a const char * const. + // Without such definition it defaults to 0, producing no predicate. + + static const char * const type_p_name_; // = 0 + + // LY_DECLARE_SMOB_PROC is used in the Super class definition for + // making a smob callable like a function. Its first argument is a + // function member pointer constant, to a function taking the + // correct number of SCM arguments and returning SCM. The function + // itself has to be defined separately. + +#define LY_DECLARE_SMOB_PROC(PMF, REQ, OPT, VAR) \ + static void smob_proc_init (scm_t_bits smob_tag) \ + { \ + scm_set_smob_apply (smob_tag, \ + (scm_t_subr)smob_trampoline, \ + REQ, OPT, VAR); \ + } + + // Well, function template argument packs are a C++11 feature. So + // we just define a bunch of trampolines manually. It turns out + // that GUILE 1.8.8 cannot actually make callable structures with + // more than 3 arguments anyway. That's surprising, to say the + // least, but in emergency situations one can always use a "rest" + // argument and take it apart manually. + + template + static SCM smob_trampoline (SCM self) + { + return (Super::unchecked_unsmob (self)->*pmf)(); + } + template + static SCM smob_trampoline (SCM self, SCM arg1) + { + return (Super::unchecked_unsmob (self)->*pmf)(arg1); + } + template + static SCM smob_trampoline (SCM self, SCM arg1, SCM arg2) + { + return (Super::unchecked_unsmob (self)->*pmf)(arg1, arg2); + } + template + static SCM smob_trampoline (SCM self, SCM arg1, SCM arg2, SCM arg3) + { + return (Super::unchecked_unsmob (self)->*pmf)(arg1, arg2, arg3); + } + + static bool is_smob (SCM s) + { + return SCM_SMOB_PREDICATE (smob_tag (), s); + } + static SCM smob_p (SCM s) + { + return is_smob (s) ? SCM_BOOL_T : SCM_BOOL_F; + } + + template + friend T *unsmob (SCM s); + + template + friend T *ly_assert_smob (SCM s, int number, const char *fun); +}; + +template +inline T *unsmob (SCM s) +{ + return T::is_smob (s) ? dynamic_cast (T::unchecked_unsmob (s)) : 0; +} + +// Simple smobs +template +class Simple_smob : public Smob_base { +public: + static size_t free_smob (SCM obj) + { + delete Smob_base::unregister_ptr (obj); + return 0; + } + SCM smobbed_copy () const + { + Super *p = new Super(*static_cast (this)); + return Smob_base::register_ptr (p); + } +}; void protect_smob (SCM smob, SCM *prot_cons); void unprotect_smob (SCM smob, SCM *prot_cons); +// The Smob_core class is not templated and contains material not +// depending on the Super class. + +class Smob_core { +protected: + SCM self_scm_; + Smob_core () : self_scm_ (SCM_UNDEFINED) { }; +public: + SCM self_scm () const { return self_scm_; } + Listener get_listener (SCM callback); +}; + +template +class Smob : public Smob_core, public Smob_base { +private: + SCM protection_cons_; + Smob (const Smob &); // Do not define! Not copyable! +protected: + Smob () : protection_cons_ (SCM_EOL) { }; +public: + static size_t free_smob (SCM obj) + { + delete Smob_base::unregister_ptr (obj); + return 0; + } + SCM unprotected_smobify_self () + { + SCM s = Smob_base::register_ptr (static_cast (this)); + self_scm_ = s; + return s; + } + void protect () + { + protect_smob (self_scm_, &protection_cons_); + } + void smobify_self () { + protect_smob (unprotected_smobify_self (), &protection_cons_); + } + SCM unprotect () + { + SCM s = self_scm_; + unprotect_smob (s, &protection_cons_); + return s; + } +}; + extern bool parsed_objects_should_be_dead; class parsed_dead { @@ -192,7 +340,12 @@ public: static SCM readout (); }; -#ifndef NDEBUG +// This does not appear to work with GUILEv2's garbage collector: +// Objects are found in the GC phase but printing them will crash at +// least some, so they are apparently not protected in spite of being +// included in the GC scans. So it would appear that scanning smobs +// is not equivalent to marking them. Ugh. +#if defined(DEBUG) && !GUILEV2 #define ASSERT_LIVE_IS_ALLOWED(arg) \ do { \ static parsed_dead pass_here; \ @@ -204,5 +357,5 @@ public: while (0) #endif +#include "smobs.tcc" #endif /* SMOBS_HH */ - diff --git a/lily/include/smobs.tcc b/lily/include/smobs.tcc new file mode 100644 index 0000000000..818c0900a5 --- /dev/null +++ b/lily/include/smobs.tcc @@ -0,0 +1,157 @@ +/* -*- C++ -*- + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2005--2015 Han-Wen Nienhuys + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#ifndef SMOBS_TCC +#define SMOBS_TCC + +// Contains generic template definitions. With GCC, it is just +// included from smobs.hh, but other template expansion systems might +// make it feasible to compile this only a single time. + +#include + +template +SCM +Smob_base::mark_trampoline (SCM arg) +{ + Super *ptr = unsmob (arg); + if (ptr) + return ptr->mark_smob (); + return SCM_UNDEFINED; +} + +template +int +Smob_base::print_trampoline (SCM arg, SCM port, scm_print_state *p) +{ + Super *ptr = unsmob (arg); + if (ptr) + return ptr->print_smob (port, p); + return 0; +} + +template +SCM +Smob_base::register_ptr (Super *p) +{ + // Don't use SCM_RETURN_NEWSMOB since that would require us to + // first register the memory and then create the smob. That would + // announce the memory as being GC-controlled before even + // allocating the controlling smob. + SCM s = SCM_UNDEFINED; + SCM_NEWSMOB (s, smob_tag (), p); + scm_gc_register_collectable_memory (p, sizeof (*p), smob_name_.c_str ()); + return s; +} + +// Defaults, should not actually get called +template +SCM +Smob_base::mark_smob () const +{ + return SCM_UNSPECIFIED; +} + +template +size_t +Smob_base::free_smob (SCM) +{ + return 0; +} + +template +SCM +Smob_base::equal_p (SCM, SCM) +{ + return SCM_BOOL_F; +} + +// Default, will often get called + +template +int +Smob_base::print_smob (SCM p, scm_print_state *) const +{ + scm_puts ("#<", p); + scm_puts (smob_name_.c_str (), p); + scm_puts (">", p); + return 1; +} + +template +Super * +Smob_base::unregister_ptr (SCM obj) +{ + Super *p = Super::unchecked_unsmob (obj); + scm_gc_unregister_collectable_memory (p, sizeof (*p), smob_name_.c_str ()); + SCM_SET_SMOB_DATA (obj, static_cast (0)); + return p; +} + +template +scm_t_bits Smob_base::smob_tag_ = 0; + +template +Scm_init Smob_base::scm_init_ (init); + +template +string Smob_base::smob_name_; + +template +const char * const Smob_base::type_p_name_ = 0; + +template +void Smob_base::init () +{ + smob_name_ = typeid (Super).name (); + // Primitive demangling, suitable for GCC, should be harmless + // elsewhere. The worst that can happen is that we get material + // unsuitable for Texinfo documentation. If that proves to be an + // issue, we need some smarter strategy. + smob_name_ = smob_name_.substr (smob_name_.find_first_not_of ("0123456789")); + assert(!smob_tag_); + smob_tag_ = scm_make_smob_type (smob_name_.c_str (), 0); + // The following have trivial private default definitions not + // referring to any aspect of the Super class apart from its name. + // They should be overridden (or rather masked) at Super level: that + // way they can refer to Super-private data. + // While that's not a consideration for type_p_name_, it's easier + // doing it like the rest. + + if (&Super::free_smob != &Smob_base::free_smob) + scm_set_smob_free (smob_tag_, Super::free_smob); + if (&Super::mark_smob != &Smob_base::mark_smob) + scm_set_smob_mark (smob_tag_, Super::mark_trampoline); + scm_set_smob_print (smob_tag_, Super::print_trampoline); + if (&Super::equal_p != &Smob_base::equal_p) + scm_set_smob_equalp (smob_tag_, Super::equal_p); + if (Super::type_p_name_ != 0) + { + SCM subr = scm_c_define_gsubr (Super::type_p_name_, 1, 0, 0, + (scm_t_subr) smob_p); + string fundoc = string("Is @var{x} a @code{") + smob_name_ + + "} object?"; + ly_add_function_documentation (subr, Super::type_p_name_, "(SCM x)", + fundoc); + scm_c_export (Super::type_p_name_, NULL); + } + ly_add_type_predicate ((void *) is_smob, smob_name_.c_str ()); + Super::smob_proc_init (smob_tag_); +} +#endif diff --git a/lily/include/source-file.hh b/lily/include/source-file.hh index 5f3553aea0..fc5bf2f541 100644 --- a/lily/include/source-file.hh +++ b/lily/include/source-file.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Jan Nieuwenhuizen + Copyright (C) 1999--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,8 +35,14 @@ using namespace std; get_line (), get_word () here. */ -class Source_file +class Source_file : public Smob { +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Source_file (); +private: vector newline_locations_; istream *istream_; vector characters_; @@ -46,7 +52,6 @@ class Source_file void init_port (); void init (); - DECLARE_SMOBS (Source_file); public: Source_file (const string &fn); Source_file (const string&, const string&); @@ -61,7 +66,6 @@ public: string name_string () const; string file_line_column_string (char const *str0) const; -public: Slice line_slice (char const *pos_str0) const; string line_string (char const *pos_str0) const; void get_counts (char const *pos_str0, int *, int *, int *, int *) const; @@ -76,4 +80,3 @@ protected: vector gulp_file (const string &fn, int desired); #endif /* SOURCE_FILE_HH */ - diff --git a/lily/include/sources.hh b/lily/include/sources.hh index 5743fc56cf..2db87cee97 100644 --- a/lily/include/sources.hh +++ b/lily/include/sources.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ class Sources { - Sources (Sources const &); + Sources (Sources const &); // Do not define! Not copyable! vector sourcefiles_; public: diff --git a/lily/include/spaceable-grob.hh b/lily/include/spaceable-grob.hh index 8293675ddf..5c6427e658 100644 --- a/lily/include/spaceable-grob.hh +++ b/lily/include/spaceable-grob.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,7 +31,6 @@ struct Spaceable_grob static void add_spring (Grob *me, Grob *to, Spring sp); static Spring get_spring (Grob *me, Grob *other); - DECLARE_GROB_INTERFACE (); 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 d599df7566..ddfe2efb1c 100644 --- a/lily/include/spacing-interface.hh +++ b/lily/include/spacing-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,7 +32,6 @@ struct Spacing_interface static Drul_array skylines (Grob *me, Grob *right_col); static Grob *extremal_break_aligned_grob (Grob *me, Direction, Direction, Interval *); - DECLARE_GROB_INTERFACE (); }; #endif /* SPACING_INTERFACE_HH */ diff --git a/lily/include/spacing-options.hh b/lily/include/spacing-options.hh index 2ca45c5e85..7f73cd6d1a 100644 --- a/lily/include/spacing-options.hh +++ b/lily/include/spacing-options.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/spacing-spanner.hh b/lily/include/spacing-spanner.hh index 165f04a8ad..fcfba90417 100644 --- a/lily/include/spacing-spanner.hh +++ b/lily/include/spacing-spanner.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,12 +45,11 @@ private: static bool fills_measure (Grob *, Item *, Item *); public: static vector get_columns (Grob *me); - static Real note_spacing (Grob *, Grob *, Grob *, Spacing_options const *); + static Spring note_spacing (Grob *, Grob *, Grob *, Spacing_options const *); static Spring standard_breakable_column_spacing (Grob *me, Item *l, Item *r, Spacing_options const *); DECLARE_SCHEME_CALLBACK (set_springs, (SCM)); DECLARE_SCHEME_CALLBACK (calc_common_shortest_duration, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif /* SPACING_SPANNER_HH */ diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh index cce03ee437..79032dfb30 100644 --- a/lily/include/spanner.hh +++ b/lily/include/spanner.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -76,7 +76,6 @@ public: static bool less (Spanner *const &, Spanner *const &); virtual Grob *find_broken_piece (System *) const; virtual void derived_mark () const; - DECLARE_GROB_INTERFACE (); virtual System *get_system () const; SCM get_cached_pure_property (SCM sym, int start, int end); diff --git a/lily/include/spring.hh b/lily/include/spring.hh index fe02fe898c..d4ebee23cd 100644 --- a/lily/include/spring.hh +++ b/lily/include/spring.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,8 +23,12 @@ #include "lily-proto.hh" #include "smobs.hh" -class Spring +class Spring : public Simple_smob { +public: + static SCM equal_p (SCM, SCM); + static const char * const type_p_name_; +private: Real distance_; Real min_distance_; @@ -35,7 +39,6 @@ class Spring void update_blocking_force (); - DECLARE_SIMPLE_SMOBS (Spring); public: Spring (); Spring (Real distance, Real min_distance); @@ -61,9 +64,7 @@ public: void operator *= (Real); bool operator > (Spring const &) const; }; -DECLARE_UNSMOB (Spring, spring); Spring merge_springs (vector const &springs); #endif /* SPRING_HH */ - diff --git a/lily/include/staff-grouper-interface.hh b/lily/include/staff-grouper-interface.hh index 7d55392f6a..0e00d4280f 100644 --- a/lily/include/staff-grouper-interface.hh +++ b/lily/include/staff-grouper-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2009--2012 Joe Neeman + Copyright (C) 2009--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,7 +25,6 @@ class Staff_grouper_interface { public: - DECLARE_GROB_INTERFACE (); static bool maybe_pure_within_group (Grob *, Grob *child, bool, int, int); }; diff --git a/lily/include/staff-spacing.hh b/lily/include/staff-spacing.hh index c20e1d5df8..11a81a998e 100644 --- a/lily/include/staff-spacing.hh +++ b/lily/include/staff-spacing.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,6 @@ class Staff_spacing static Real next_notes_correction (Grob *, Grob *); public: - DECLARE_GROB_INTERFACE (); static Spring get_spacing (Grob *, Grob *, Real); static Interval bar_y_positions (Grob *); }; diff --git a/lily/include/staff-symbol-referencer.hh b/lily/include/staff-symbol-referencer.hh index 79d07cfe7c..64d41014d7 100644 --- a/lily/include/staff-symbol-referencer.hh +++ b/lily/include/staff-symbol-referencer.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,6 @@ class Staff_symbol_referencer { public: - DECLARE_GROB_INTERFACE (); static bool ugly_hack (Grob *); static void set_position (Grob *, Real); static void pure_set_position (Grob *, Real); diff --git a/lily/include/staff-symbol.hh b/lily/include/staff-symbol.hh index 688dccb0a6..28b30244c7 100644 --- a/lily/include/staff-symbol.hh +++ b/lily/include/staff-symbol.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,12 +34,11 @@ public: static Real get_ledger_line_thickness (Grob *); static vector line_positions (Grob *); - static vector ledger_positions (Grob *me, int pos); + static vector ledger_positions (Grob *me, int pos, Item const *head = 0); static int line_count (Grob *); static bool on_line (Grob *me, int pos, bool allow_ledger = true); static Interval line_span (Grob *); DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (height, (SCM)); - DECLARE_GROB_INTERFACE (); }; #endif // STAFF_SYMBOL_HH diff --git a/lily/include/stem-info.hh b/lily/include/stem-info.hh index 5b92ac7524..9015688045 100644 --- a/lily/include/stem-info.hh +++ b/lily/include/stem-info.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/stem-tremolo.hh b/lily/include/stem-tremolo.hh index 7137046d30..ead984dc38 100644 --- a/lily/include/stem-tremolo.hh +++ b/lily/include/stem-tremolo.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,14 +27,13 @@ class Stem_tremolo { public: - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (calc_slope, (SCM)); DECLARE_SCHEME_CALLBACK (calc_width, (SCM)); DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM)); DECLARE_SCHEME_CALLBACK (pure_calc_y_offset, (SCM, SCM, SCM)); DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (width, (SCM)); - DECLARE_SCHEME_CALLBACK (calc_style, (SCM)); + DECLARE_SCHEME_CALLBACK (calc_shape, (SCM)); DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM)); static Stencil raw_stencil (Grob *, Real slope, Direction stemdir); diff --git a/lily/include/stem.hh b/lily/include/stem.hh index 101c00341a..7c4612552a 100644 --- a/lily/include/stem.hh +++ b/lily/include/stem.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -58,7 +58,6 @@ public: static Real internal_calc_stem_end_position (Grob *, bool); static Real internal_calc_stem_begin_position (Grob *, bool); - DECLARE_GROB_INTERFACE (); static void set_spacing_hints (Grob *); static Grob *flag (Grob *); @@ -66,7 +65,6 @@ public: DECLARE_SCHEME_CALLBACK (calc_default_direction, (SCM)); DECLARE_SCHEME_CALLBACK (offset_callback, (SCM element)); DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); - DECLARE_SCHEME_CALLBACK (calc_beaming, (SCM)); DECLARE_SCHEME_CALLBACK (calc_length, (SCM)); DECLARE_SCHEME_CALLBACK (pure_calc_length, (SCM, SCM, SCM)); DECLARE_SCHEME_CALLBACK (calc_stem_begin_position, (SCM)); diff --git a/lily/include/stencil.hh b/lily/include/stencil.hh index 34bafa6d41..8af67c0f76 100644 --- a/lily/include/stencil.hh +++ b/lily/include/stencil.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -47,7 +47,7 @@ using namespace std; efficient to add "fresh" stencils to what you're going to build. * Do not create Stencil objects on the heap. That includes passing - around Stencil* which are produced by unsmob_stencil(). Either + around Stencil* which are produced by unsmob(). Either copy Stencil objects, or use SCM references. * Empty stencils have empty dimensions. If add_at_edge is used to @@ -55,12 +55,15 @@ using namespace std; DIMENSIONS = (Interval (0, 0), Interval (0, 0) */ -class Stencil +class Stencil : public Simple_smob { +public: + SCM mark_smob () const; + static const char * const type_p_name_; +private: Box dim_; SCM expr_; - DECLARE_SIMPLE_SMOBS (Stencil); public: Stencil (Box, SCM s); Stencil (); @@ -90,7 +93,6 @@ public: static SCM skylines_from_stencil (SCM, Real, Axis); }; -DECLARE_UNSMOB (Stencil, stencil); void interpret_stencil_expression (SCM expr, SCM (*func) (void *, SCM), diff --git a/lily/include/stream-event.hh b/lily/include/stream-event.hh index f255ab5353..d554f584dc 100644 --- a/lily/include/stream-event.hh +++ b/lily/include/stream-event.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Erik Sandberg + Copyright (C) 2005--2015 Erik Sandberg LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -46,7 +46,6 @@ public: #define in_event_class(class_name) internal_in_event_class (ly_symbol2scm (class_name)) -Stream_event *unsmob_stream_event (SCM); SCM ly_event_deep_copy (SCM); #endif /* STREAM_EVENT_HH */ diff --git a/lily/include/system-start-delimiter.hh b/lily/include/system-start-delimiter.hh index f3b183b1c8..bf1fd0d28c 100644 --- a/lily/include/system-start-delimiter.hh +++ b/lily/include/system-start-delimiter.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,7 +31,6 @@ class System_start_delimiter public: DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); static void try_collapse (Grob *); static Stencil staff_bracket (Grob *, Real); static Stencil old_staff_bracket (Grob *, Real); diff --git a/lily/include/system.hh b/lily/include/system.hh index a5efe750ad..4e402ffeca 100644 --- a/lily/include/system.hh +++ b/lily/include/system.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -74,7 +74,6 @@ public: int spanner_count () const; void break_into_pieces (vector const &); - DECLARE_GROB_INTERFACE (); vector broken_col_range (Item const *, Item const *) const; vector used_columns () const; diff --git a/lily/include/text-interface.hh b/lily/include/text-interface.hh index 1e736a5071..c653495be8 100644 --- a/lily/include/text-interface.hh +++ b/lily/include/text-interface.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -30,7 +30,6 @@ public: DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (interpret_markup, (SCM, SCM, SCM)); DECLARE_SCHEME_CALLBACK (interpret_string, (SCM, SCM, SCM)); - DECLARE_GROB_INTERFACE (); static bool is_markup (SCM); static bool is_markup_list (SCM); }; diff --git a/lily/include/tie-column.hh b/lily/include/tie-column.hh index 4832efe0bc..025cf8433a 100644 --- a/lily/include/tie-column.hh +++ b/lily/include/tie-column.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,8 +26,7 @@ class Tie_column { public: - DECLARE_GROB_INTERFACE (); - static void add_tie (Grob *me, Grob *); + static void add_tie (Grob *me, Spanner *); DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM)); DECLARE_SCHEME_CALLBACK (before_line_breaking, (SCM)); static void set_directions (Grob *me); diff --git a/lily/include/tie-configuration.hh b/lily/include/tie-configuration.hh index 9da9e45a40..aaf0746a4a 100644 --- a/lily/include/tie-configuration.hh +++ b/lily/include/tie-configuration.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/tie-details.hh b/lily/include/tie-details.hh index b03b497007..f559c0cf53 100644 --- a/lily/include/tie-details.hh +++ b/lily/include/tie-details.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/tie-formatting-problem.hh b/lily/include/tie-formatting-problem.hh index 3f21dba6a1..2d3ce617b4 100644 --- a/lily/include/tie-formatting-problem.hh +++ b/lily/include/tie-formatting-problem.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/tie-specification.hh b/lily/include/tie-specification.hh index 36f65fabd9..9ca5116109 100644 --- a/lily/include/tie-specification.hh +++ b/lily/include/tie-specification.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/tie.hh b/lily/include/tie.hh index 9e24099cdc..e92ca61947 100644 --- a/lily/include/tie.hh +++ b/lily/include/tie.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,22 +27,19 @@ class Tie { public: - static void set_head (Grob *, Direction, Grob *head); - DECLARE_GROB_INTERFACE (); - static Grob *head (Grob *, Direction); - static int get_column_rank (Grob *, Direction); - static int get_position (Grob *); - static Direction get_default_dir (Grob *); + static void set_head (Spanner *, Direction, Grob *head); + static Item *head (Spanner *, Direction); + static int get_column_rank (Spanner *, Direction); + static int get_position (Spanner *); + static Direction get_default_dir (Spanner *); static SCM get_control_points (Grob *, Grob *, Tie_configuration const &, Tie_details const &); - static SCM get_default_control_points (Grob *); + static SCM get_default_control_points (Spanner *); DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM)); DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); DECLARE_SCHEME_CALLBACK (calc_control_points, (SCM)); - static bool less (Grob *const &s1, - Grob *const &s2); + static bool less (Grob *s1, Grob *s2); }; #endif // TIE_HH diff --git a/lily/include/timing-translator.hh b/lily/include/timing-translator.hh index 7629009d3e..18b4425483 100644 --- a/lily/include/timing-translator.hh +++ b/lily/include/timing-translator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/include/translator-dispatch-list.hh b/lily/include/translator-dispatch-list.hh index afb9ce45a2..b6124572fc 100644 --- a/lily/include/translator-dispatch-list.hh +++ b/lily/include/translator-dispatch-list.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,24 +21,19 @@ #define TRANSLATOR_DISPATCH_LIST_HH #include "lily-proto.hh" +#include "callback.hh" #include "std-vector.hh" #include "smobs.hh" +#include "translator.hh" -struct Engraver_dispatch_entry +class Engraver_dispatch_list : public Simple_smob { - Engraver *engraver_; - Engraver_void_function_engraver_grob_info function_; -}; - -class Engraver_dispatch_list -{ - vector dispatch_entries_; + vector dispatch_entries_; public: void apply (Grob_info); SCM static create (SCM trans_list, SCM iface_list, Direction); - DECLARE_SIMPLE_SMOBS (Engraver_dispatch_list); }; #endif /* TRANSLATOR_DISPATCH_LIST_HH */ diff --git a/lily/include/translator-group.hh b/lily/include/translator-group.hh index ad044de860..d4500ef2b4 100644 --- a/lily/include/translator-group.hh +++ b/lily/include/translator-group.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,52 +20,29 @@ #ifndef TRANSLATOR_GROUP_HH #define TRANSLATOR_GROUP_HH +#include "callback.hh" #include "listener.hh" #include "translator.hh" -typedef void (Translator:: *Translator_method) (void); -typedef void (Translator_group:: *Translator_group_method) (void); -typedef void (*Translator_group_void_method) (Translator_group *); - -struct Translator_method_binding -{ - Translator *translator_; - Translator_void_method_ptr method_; - - Translator_method_binding () - { - } - Translator_method_binding (Translator *tr, Translator_void_method_ptr ptr) - { - translator_ = tr; - method_ = ptr; - } - void invoke () - { - if (method_) - (translator_->*method_) (); - } -}; - -class Translator_group +class Translator_group : public Smob { +public: + SCM mark_smob () const; + int print_smob (SCM, scm_print_state *) const; + static const char * const type_p_name_; + virtual ~Translator_group (); private: void precompute_method_bindings (); - vector + vector precomputed_method_bindings_[TRANSLATOR_METHOD_PRECOMPUTE_COUNT]; - Translator_group_void_method - precomputed_self_method_bindings_[TRANSLATOR_METHOD_PRECOMPUTE_COUNT]; - SCM protected_events_; - DECLARE_LISTENER (create_child_translator); + void create_child_translator (SCM); public: - VIRTUAL_COPY_CONSTRUCTOR (Translator_group, Translator_group); - DECLARE_SMOBS (Translator_group); + DECLARE_CLASSNAME (Translator_group); -public: virtual void connect_to_context (Context *c); virtual void disconnect_from_context (); virtual SCM get_simple_trans_list (); @@ -77,12 +54,9 @@ public: void stop_translation_timestep (); void start_translation_timestep (); - virtual void fetch_precomputable_methods (Translator_group_void_method[]); - Translator_group (); void precomputed_translator_foreach (Translator_precompute_index); - void call_precomputed_self_method (Translator_precompute_index); Context *context () const { return context_; } protected: @@ -94,14 +68,13 @@ protected: }; SCM names_to_translators (SCM namelist, Context *tg); -void recurse_over_translators (Context *c, Translator_method ptr, - Translator_group_method ptr2, Direction); +void recurse_over_translators (Context *c, SCM tr_method, + SCM tr_group_method, Direction); void precomputed_recurse_over_translators (Context *c, Translator_precompute_index idx, Direction dir); Translator_group *get_translator_group (SCM sym); #define foobar #define ADD_TRANSLATOR_GROUP(classname, desc, grobs, read, write) foobar -DECLARE_UNSMOB (Translator_group, translator_group); #endif // TRANSLATOR_GROUP_HH diff --git a/lily/include/translator.hh b/lily/include/translator.hh index be6781eb03..09ab168658 100644 --- a/lily/include/translator.hh +++ b/lily/include/translator.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,88 +23,70 @@ #include "global-ctor.hh" #include "lily-proto.hh" #include "virtual-methods.hh" +#include "callback.hh" #include "input.hh" // for error reporting #include "smobs.hh" +#include "stream-event.hh" #include "std-vector.hh" #include "protected-scm.hh" -struct Acknowledge_information -{ - SCM symbol_; - Engraver_void_function_engraver_grob_info function_; +#define TRANSLATOR_FAMILY_DECLARATIONS(NAME) \ + public: \ + VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \ + virtual void fetch_precomputable_methods (SCM methods[]); \ + DECLARE_TRANSLATOR_CALLBACKS (NAME); \ + TRANSLATOR_INHERIT (Translator); \ + /* end #define */ - Acknowledge_information () - { - symbol_ = SCM_EOL; - function_ = 0; - } -}; +#define TRANSLATOR_INHERIT(BASE) \ + using BASE::method_finder + +#define DECLARE_TRANSLATOR_CALLBACKS(NAME) \ + template \ + static SCM method_finder () \ + { \ + return Callback0_wrapper::make_smob (); \ + } \ + template \ + static SCM method_finder () \ + { \ + return Callback_wrapper::make_smob > (); \ + } \ + template \ + static SCM method_finder () { \ + return Callback2_wrapper::make_smob > (); \ + } \ + /* end #define */ /* - Each translator class has a static list of listener records. Each - record makes one explains how to register one of the class's stream event - listeners to a context. + Each translator class has a static alist of event class symbols + mapping to callbacks that are called with a translator instance and + a stream event when an event of the appropriate event class is + announced in a context. */ -typedef struct translator_listener_record -{ - Listener (*get_listener_) (void *, SCM event_class); - SCM event_class_; - struct translator_listener_record *next_; - - translator_listener_record () - { - next_ = 0; - event_class_ = SCM_EOL; - get_listener_ = 0; - } - -} translator_listener_record; -#define TRANSLATOR_DECLARATIONS_NO_LISTENER(NAME) \ -private: \ +#define TRANSLATOR_DECLARATIONS(NAME) \ public: \ - NAME (); \ - VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME); \ + TRANSLATOR_FAMILY_DECLARATIONS (NAME); \ + static Drul_array acknowledge_static_array_drul_; \ static SCM static_description_; \ - static Drul_array > acknowledge_static_array_drul_; \ - virtual void fetch_precomputable_methods (Translator_void_method_ptr methods[]); \ - virtual SCM static_translator_description () const; \ - virtual SCM translator_description () const; \ - static Engraver_void_function_engraver_grob_info static_get_acknowledger (SCM sym); \ - static Engraver_void_function_engraver_grob_info static_get_end_acknowledger(SCM); \ - virtual Engraver_void_function_engraver_grob_info get_acknowledger (SCM sym) \ + static Protected_scm listener_list_; \ + static SCM static_get_acknowledger (SCM sym, Direction start_end); \ + virtual SCM get_acknowledger (SCM sym, Direction start_end) \ { \ - return static_get_acknowledger (sym); \ + return static_get_acknowledger (sym, start_end); \ } \ - virtual Engraver_void_function_engraver_grob_info get_end_acknowledger (SCM sym) \ - { \ - return static_get_end_acknowledger (sym); \ - } \ - /* end #define */ - -#define TRANSLATOR_DECLARATIONS(NAME) \ - TRANSLATOR_DECLARATIONS_NO_LISTENER(NAME) \ -private: \ - static translator_listener_record *listener_list_; \ public: \ - virtual translator_listener_record *get_listener_list () const \ + NAME (); \ + static void boot (); \ + virtual SCM static_translator_description () const; \ + virtual SCM translator_description () const; \ + virtual SCM get_listener_list () const \ { \ return listener_list_; \ } \ /* end #define */ -#define DECLARE_TRANSLATOR_LISTENER(m) \ -public: \ -inline void listen_ ## m (Stream_event *); \ -/* Should be private */ \ -static void _internal_declare_ ## m (); \ -private: \ - static Listener _get_ ## m ## _listener (void *, SCM); \ -DECLARE_LISTENER (_listen_scm_ ## m); - -#define DECLARE_ACKNOWLEDGER(x) public : void acknowledge_ ## x (Grob_info); protected: -#define DECLARE_END_ACKNOWLEDGER(x) public : void acknowledge_end_ ## x (Grob_info); protected: - enum Translator_precompute_index { START_TRANSLATION_TIMESTEP, @@ -117,13 +99,20 @@ enum Translator_precompute_index /* Translate music into grobs. */ -class Translator +class Translator : public Smob { +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; + virtual ~Translator (); +private: void init (); public: Context *context () const { return daddy_context_; } + Translator (); Translator (Translator const &); SCM internal_get_property (SCM symbol) const; @@ -147,20 +136,40 @@ public: Context *get_score_context () const; Global_context *get_global_context () const; - TRANSLATOR_DECLARATIONS (Translator); - DECLARE_SMOBS (Translator); + DECLARE_CLASSNAME (Translator); + virtual Translator *clone () const = 0; + virtual void fetch_precomputable_methods (SCM methods[]) = 0; + virtual SCM get_listener_list () const = 0; + virtual SCM translator_description () const = 0; + virtual SCM get_acknowledger (SCM sym, Direction start_end) = 0; protected: // should be private. Context *daddy_context_; void protect_event (SCM ev); + + template + static SCM trampoline (SCM target, SCM event) + { + T *t = unsmob (target); + LY_ASSERT_SMOB (T, target, 1); + LY_ASSERT_SMOB (Stream_event, event, 2); + + t->protect_event (event); + (t->*callback) (unsmob (event)); + return SCM_UNSPECIFIED; + } + + // Fallback for non-overriden callbacks for which &T::x degrades to + // &Translator::x + template + static SCM + method_finder () { return SCM_UNDEFINED; } + virtual void derived_mark () const; - static void add_translator_listener (translator_listener_record **listener_list, - translator_listener_record *r, - Listener (*get_listener) (void *, SCM), - const char *ev_class); + static SCM event_class_symbol (const char *ev_class); SCM static_translator_description (const char *grobs, const char *desc, - translator_listener_record *listener_list, + SCM listener_list, const char *read, const char *write) const; @@ -170,9 +179,12 @@ protected: // should be private. void add_translator (Translator *trans); Translator *get_translator (SCM s); + +SCM +generic_get_acknowledger (SCM sym, SCM ack_hash); + Moment get_event_length (Stream_event *s, Moment now); Moment get_event_length (Stream_event *s); -DECLARE_UNSMOB (Translator, translator); /* This helper is only meaningful inside listen_* methods. diff --git a/lily/include/translator.icc b/lily/include/translator.icc index 4ce8f6902e..80a7466cd1 100644 --- a/lily/include/translator.icc +++ b/lily/include/translator.icc @@ -1,7 +1,7 @@ -/* +/* -*- c++ -*- This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,9 +20,9 @@ #ifndef TRANSLATOR_ICC #define TRANSLATOR_ICC -#include "listener.hh" +#include "callback.hh" #include "std-vector.hh" -#include "translator.hh" +#include "engraver.hh" /* TODO: derive "foo-bar-interface" from Foo_bar classname. @@ -35,6 +35,7 @@ SCM T::static_description_ = SCM_EOL; \ static void _ ## T ## _adder () \ { \ + T::boot (); \ T *t = new T; \ T::static_description_ = \ scm_permanent_object (t->static_translator_description ()); \ @@ -44,24 +45,19 @@ { \ return static_description_; \ } \ - ADD_GLOBAL_CTOR (_ ## T ## _adder); \ + ADD_GLOBAL_CTOR (_ ## T ## _adder); \ /* end define */ #define DEFINE_TRANSLATOR_LISTENER_LIST(T) \ - translator_listener_record *T::listener_list_; \ - /* end define */ + Protected_scm T::listener_list_ (SCM_EOL) #define DEFINE_ACKNOWLEDGERS(classname) \ - Drul_array< vector > classname::acknowledge_static_array_drul_; \ - Engraver_void_function_engraver_grob_info \ - classname::static_get_acknowledger (SCM sym) \ - { \ - return generic_get_acknowledger (sym, &acknowledge_static_array_drul_[START]); \ - } \ - Engraver_void_function_engraver_grob_info \ - classname::static_get_end_acknowledger (SCM sym) \ + Drul_array classname::acknowledge_static_array_drul_; \ + SCM \ + classname::static_get_acknowledger (SCM sym, Direction start_end) \ { \ - return generic_get_acknowledger (sym, &acknowledge_static_array_drul_[STOP]); \ + return generic_get_acknowledger \ + (sym, acknowledge_static_array_drul_[start_end]); \ } \ /* end define */ @@ -74,88 +70,58 @@ #define ADD_TRANSLATOR(classname, desc, grobs, read, write) \ IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname); \ + DEFINE_ACKNOWLEDGERS(classname); \ ADD_THIS_TRANSLATOR (classname); \ - DEFINE_TRANSLATOR_DOC(classname, desc, grobs, read, write) \ - DEFINE_ACKNOWLEDGERS(classname) \ - DEFINE_TRANSLATOR_LISTENER_LIST(classname) \ - + DEFINE_TRANSLATOR_DOC(classname, desc, grobs, read, write); \ + DEFINE_TRANSLATOR_LISTENER_LIST(classname); + #define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T) \ void \ - T::fetch_precomputable_methods (Translator_void_method_ptr ptrs[]) \ + T::fetch_precomputable_methods (SCM ptrs[]) \ { \ ptrs[START_TRANSLATION_TIMESTEP] = \ - ((Translator_void_method_ptr) & T::start_translation_timestep == \ - (Translator_void_method_ptr) & Translator::start_translation_timestep) \ - ? 0 \ - : (Translator_void_method_ptr) & T::start_translation_timestep; \ - \ - ptrs[STOP_TRANSLATION_TIMESTEP] = \ - ((Translator_void_method_ptr) & T::stop_translation_timestep == (Translator_void_method_ptr) & Translator::stop_translation_timestep) \ - ? 0 \ - : (Translator_void_method_ptr) & T::stop_translation_timestep; \ + method_finder <&T::start_translation_timestep> (); \ + \ + ptrs[STOP_TRANSLATION_TIMESTEP] = \ + method_finder <&T::stop_translation_timestep> (); \ \ - ptrs[PROCESS_MUSIC] = \ - ((Translator_void_method_ptr) & T::process_music == (Translator_void_method_ptr) & Translator::process_music) \ - ? 0 \ - : (Translator_void_method_ptr) & T::process_music; \ - \ - ptrs[PROCESS_ACKNOWLEDGED] = \ - ((Translator_void_method_ptr) & T::process_acknowledged == (Translator_void_method_ptr) & Translator::process_acknowledged) \ - ? 0 \ - : (Translator_void_method_ptr) & T::process_acknowledged; \ + ptrs[PROCESS_MUSIC] = \ + method_finder <&T::process_music> (); \ + \ + ptrs[PROCESS_ACKNOWLEDGED] = \ + method_finder <&T::process_acknowledged> (); \ } -void add_acknowledger (Engraver_void_function_engraver_grob_info ptr, +void add_acknowledger (SCM ptr, char const *func_name, - vector *ack_array); + SCM &ack_hash); -Engraver_void_function_engraver_grob_info -generic_get_acknowledger (SCM sym, - vector const *ack_array); +#define ADD_ACKNOWLEDGER_FOR(CLASS, NAME, GROB) \ + add_acknowledger (method_finder<&CLASS::acknowledge_ ## NAME> (), \ + #GROB, acknowledge_static_array_drul_[START]) -#define ADD_ACKNOWLEDGER(CLASS, NAME) \ - void CLASS ## NAME ## _ack_adder () \ - { \ - add_acknowledger ((Engraver_void_function_engraver_grob_info) & CLASS::acknowledge_ ## NAME, #NAME, &CLASS::acknowledge_static_array_drul_[START]); \ - } \ - ADD_SCM_INIT_FUNC (CLASS ## NAME ## _ack_adder_initclass, CLASS ## NAME ## _ack_adder); +#define ADD_ACKNOWLEDGER(CLASS, NAME) ADD_ACKNOWLEDGER_FOR (CLASS, NAME, NAME) -#define ADD_END_ACKNOWLEDGER(CLASS, NAME) \ - void CLASS ## NAME ## _end_ack_adder () \ - { \ - add_acknowledger ((Engraver_void_function_engraver_grob_info) & CLASS::acknowledge_end_ ## NAME, #NAME, &CLASS::acknowledge_static_array_drul_[STOP]); \ - } \ - ADD_SCM_INIT_FUNC (CLASS ## NAME ## _end_ack_adder_initclass, CLASS ## NAME ## _end_ack_adder); +// ADD_END_ACKNOWLEDGER_FOR requires your NAME to actually be +// end_whatever if you are utilizing acknowledge_end_whatever as a +// different end acknowledger. +#define ADD_END_ACKNOWLEDGER_FOR(CLASS, NAME, GROB) \ + add_acknowledger (method_finder<&CLASS::acknowledge_ ## NAME> (), \ + #GROB, acknowledge_static_array_drul_[STOP]) + +#define ADD_END_ACKNOWLEDGER(CLASS, NAME) \ + ADD_END_ACKNOWLEDGER_FOR (CLASS, end_ ## NAME, NAME) /* Implement the method cl::listen_##m, and make it listen to stream events of class m. */ -#define IMPLEMENT_TRANSLATOR_LISTENER(cl, m) \ -void \ -cl :: _internal_declare_ ## m () \ -{ \ - static translator_listener_record r; \ - add_translator_listener (&listener_list_, &r, _get_ ## m ## _listener, #m); \ -} \ - \ -ADD_SCM_INIT_FUNC (cl ## _declare_event_ ## m, cl::_internal_declare_ ## m); \ - \ -Listener \ - cl :: _get_ ## m ## _listener (void *me, SCM unused) \ -{ \ - cl *obj = (cl *) me; \ - (void) unused; \ - return obj->GET_LISTENER (_listen_scm_ ## m); \ -} \ - \ -IMPLEMENT_LISTENER (cl, _listen_scm_ ## m) \ -void \ -cl::_listen_scm_ ## m (SCM sev) \ -{ \ - Stream_event *ev = unsmob_stream_event (sev); \ - protect_event (sev); \ - listen_ ## m (ev); \ -} +#define ADD_LISTENER_FOR(cl, m, ev) \ + listener_list_ = scm_acons \ + (event_class_symbol (#ev), \ + method_finder<&cl::listen_ ## m> (), \ + listener_list_) + +#define ADD_LISTENER(cl, m) ADD_LISTENER_FOR (cl, m, m) #endif /* TRANSLATOR_ICC */ diff --git a/lily/include/tuplet-bracket.hh b/lily/include/tuplet-bracket.hh index 2f4bf38e19..1e41154fbf 100644 --- a/lily/include/tuplet-bracket.hh +++ b/lily/include/tuplet-bracket.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,7 +34,6 @@ public: DECLARE_SCHEME_CALLBACK (calc_connect_to_neighbors, (SCM smob)); DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM)); - DECLARE_GROB_INTERFACE (); static Grob *get_common_x (Spanner *); static void add_tuplet_bracket (Grob *me, Grob *smaller_bracket); static void get_bounds (Grob *, Grob **, Grob **); diff --git a/lily/include/time-signature.hh b/lily/include/tuplet-number.hh similarity index 56% rename from lily/include/time-signature.hh rename to lily/include/tuplet-number.hh index 4fa922419d..24ba77a377 100644 --- a/lily/include/time-signature.hh +++ b/lily/include/tuplet-number.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,25 +17,26 @@ along with LilyPond. If not, see . */ -#ifndef METER_HH -#define METER_HH +#ifndef Tuplet_number_HH +#define Tuplet_number_HH -#include "grob-interface.hh" #include "lily-proto.hh" +#include "std-vector.hh" +#include "grob-interface.hh" -/** - Print a time_signature sign. - - TODO: - - 2+3+2/8 time_signatures -*/ -struct Time_signature +struct Tuplet_number { - DECLARE_GROB_INTERFACE (); - static Stencil special_time_signature (Grob *, SCM, int, int); - static Stencil numbered_time_signature (Grob *, int, int); DECLARE_SCHEME_CALLBACK (print, (SCM)); + DECLARE_SCHEME_CALLBACK (calc_x_offset, (SCM)); + DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM)); + DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM)); + + static Real calc_offset (Spanner *me, Axis a); // not used + + static Grob *select_reference_stem (Grob *me, vector const &cols); + static Drul_array adjacent_note_columns (Grob *me, Grob *ref_stem); + static bool knee_position_against_beam (Grob *me, Grob *ref_stem); }; -#endif // METER_HH + +#endif // Tuplet_number_HH diff --git a/lily/include/unpure-pure-container.hh b/lily/include/unpure-pure-container.hh index ccf0971844..7accff9a88 100644 --- a/lily/include/unpure-pure-container.hh +++ b/lily/include/unpure-pure-container.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,10 +21,25 @@ #define UNPURE_PURE_CONTAINER_HH #include "lily-guile.hh" - -bool is_unpure_pure_container (SCM s); -SCM unpure_pure_container_unpure_part (SCM smob); -SCM unpure_pure_container_pure_part (SCM smob); -SCM ly_make_unpure_pure_container (SCM, SCM); +#include "small-smobs.hh" + +class Unpure_pure_container : public Smob2 +{ +public: + static const char * const type_p_name_; + SCM unpure_part () const { return scm1 (); } + // A container that has the same callback for both 'pure' and 'unpure' lookups + // and which ignores the 'start' and 'end' columnns. + // Such a callback will give the same answer for tentative or final layouts. + bool is_unchanging () const { return SCM_UNBNDP (scm2 ()); } + SCM pure_part () const; + static SCM make_smob (SCM a, SCM b = SCM_UNDEFINED) + { + if (SCM_UNBNDP (b) && !ly_is_procedure (a)) + return Smob2::make_smob (a, a); + return Smob2::make_smob (a, b); + } + int print_smob (SCM, scm_print_state *) const; +}; #endif /* UNPURE_PURE_CONTAINER_HH */ diff --git a/lily/include/vaticana-ligature.hh b/lily/include/vaticana-ligature.hh index e3c6d51df8..25e994753f 100644 --- a/lily/include/vaticana-ligature.hh +++ b/lily/include/vaticana-ligature.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Juergen Reuter + Copyright (C) 2003--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ struct Vaticana_ligature { DECLARE_SCHEME_CALLBACK (brew_ligature_primitive, (SCM)); DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); }; /* diff --git a/lily/include/volta-bracket.hh b/lily/include/volta-bracket.hh index d9a7bfb249..ffde225d2f 100644 --- a/lily/include/volta-bracket.hh +++ b/lily/include/volta-bracket.hh @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,6 @@ class Volta_bracket_interface { public: - DECLARE_GROB_INTERFACE (); DECLARE_SCHEME_CALLBACK (print, (SCM)); static void modify_edge_height (Spanner *); static void add_bar (Grob *me, Item *bar); diff --git a/lily/input-scheme.cc b/lily/input-scheme.cc index 280a32de9e..42d35816c3 100644 --- a/lily/input-scheme.cc +++ b/lily/input-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,23 +20,14 @@ #include "std-string.hh" #include "input.hh" -/* We don't use IMPLEMENT_TYPE_P, since the smobification part is - implemented separately from the class. */ -LY_DEFINE (ly_input_location_p, "ly:input-location?", 1, 0, 0, - (SCM x), - "Is @var{x} an @code{input-location}?") -{ - return unsmob_input (x) ? SCM_BOOL_T : SCM_BOOL_F; -} - LY_DEFINE (ly_input_warning, "ly:input-warning", 2, 0, 1, (SCM sip, SCM msg, SCM rest), "Print @var{msg} as a GNU compliant warning message, pointing" " to the location in @var{sip}. @var{msg} is interpreted" " similar to @code{format}'s argument, using @var{rest}.") { - Input *ip = unsmob_input (sip); + Input *ip = unsmob (sip); - LY_ASSERT_TYPE (unsmob_input, sip, 1); + LY_ASSERT_SMOB (Input, sip, 1); LY_ASSERT_TYPE (scm_is_string, msg, 2); msg = scm_simple_format (SCM_BOOL_F, msg, rest); @@ -52,9 +43,9 @@ LY_DEFINE (ly_input_message, "ly:input-message", 2, 0, 1, (SCM sip, SCM msg, SCM " to the location in @var{sip}. @var{msg} is interpreted" " similar to @code{format}'s argument, using @var{rest}.") { - Input *ip = unsmob_input (sip); + Input *ip = unsmob (sip); - LY_ASSERT_TYPE (unsmob_input, sip, 1); + LY_ASSERT_SMOB (Input, sip, 1); LY_ASSERT_TYPE (scm_is_string, msg, 2); msg = scm_simple_format (SCM_BOOL_F, msg, rest); @@ -71,8 +62,8 @@ LY_DEFINE (ly_input_file_line_char_column, "Return input location in @var{sip} as" " @code{(file-name line char column)}.") { - LY_ASSERT_TYPE (unsmob_input, sip, 1); - Input *ip = unsmob_input (sip); + LY_ASSERT_SMOB (Input, sip, 1); + Input *ip = unsmob (sip); int l, ch, col, offset = 0; ip->get_counts (&l, &ch, &col, &offset); @@ -89,8 +80,8 @@ LY_DEFINE (ly_input_both_locations, " @code{(file-name first-line first-column last-line last-column)}.") { - LY_ASSERT_TYPE (unsmob_input, sip, 1); - Input *ip = unsmob_input (sip); + LY_ASSERT_SMOB (Input, sip, 1); + Input *ip = unsmob (sip); return scm_list_5 (ly_string2scm (ip->file_string ()), scm_from_int (ip->line_number ()), diff --git a/lily/input-smob.cc b/lily/input-smob.cc index 4d446ab6c0..6f5fc18a54 100644 --- a/lily/input-smob.cc +++ b/lily/input-smob.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,44 +21,34 @@ #include "source-file.hh" #include "std-string.hh" -#include "ly-smobs.icc" /* Dummy input location for use if real one is missing. */ Input dummy_input_global; -static long input_tag; +const char * const Input::type_p_name_ = "ly:input-location?"; -static SCM -mark_smob (SCM s) +SCM +Input::mark_smob () const { - Input *sc = (Input *) SCM_CELL_WORD_1 (s); - - if (Source_file *sf = sc->get_source_file ()) + if (Source_file *sf = get_source_file ()) return sf->self_scm (); return SCM_EOL; } -static int -print_smob (SCM s, SCM port, scm_print_state *) +int +Input::print_smob (SCM port, scm_print_state *) const { - string str = "#location_string () + ">"; + string str = "#"; scm_puts (str.c_str (), port); return 1; } -static size_t -free_smob (SCM s) -{ - delete unsmob_input (s); - return 0; -} - -static SCM -equal_smob (SCM sa, SCM sb) +SCM +Input::equal_p (SCM sa, SCM sb) { - Input *a = (Input *) SCM_CELL_WORD_1 (sa); - Input *b = (Input *) SCM_CELL_WORD_1 (sb); + Input *a = unsmob (sa); + Input *b = unsmob (sb); if (a->get_source_file () == b->get_source_file () && a->start () == b->start () && a->end () == b->end ()) @@ -66,37 +56,3 @@ equal_smob (SCM sa, SCM sb) else return SCM_BOOL_F; } - -static void -start_input_smobs () -{ - input_tag = scm_make_smob_type ("input", 0); - scm_set_smob_mark (input_tag, mark_smob); - scm_set_smob_free (input_tag, free_smob); - scm_set_smob_print (input_tag, print_smob); - scm_set_smob_equalp (input_tag, equal_smob); -} - -SCM -make_input (Input ip) -{ - Input *nip = new Input (ip); - SCM z; - - SCM_NEWSMOB (z, input_tag, nip); - return z; -} - -Input * -unsmob_input (SCM s) -{ - if (SCM_IMP (s)) - return 0; - if (SCM_CAR (s) == (SCM)input_tag) // ugh. - return (Input *) SCM_CDR (s); - else - return 0; -} - -ADD_SCM_INIT_FUNC (input, start_input_smobs); - diff --git a/lily/input.cc b/lily/input.cc index 2b29c828ba..b6aed9e2d1 100644 --- a/lily/input.cc +++ b/lily/input.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ using namespace std; #include "international.hh" +#include "lily-imports.hh" #include "program-option.hh" #include "source-file.hh" #include "sources.hh" @@ -92,12 +93,11 @@ Input::message_location () const { return (source_file_) ? location_string () : ""; } + void Input::error (const string &s) const { - ::non_fatal_error (message_string (s), message_location ()); - // UGH, fix naming or usage (use non_fatal_error in most places, instead) - // exit (1); + ::error (message_string (s), message_location ()); } void @@ -219,3 +219,104 @@ Input::end () const { return end_; } + +static SCM +with_location_hook_0 (void *it) +{ + SCM *args = static_cast (it); + return scm_call_0 (args[0]); +} + +SCM +with_location (SCM loc, SCM proc) +{ + return scm_c_with_fluid (Lily::f_location, + unsmob (loc) ? loc : SCM_BOOL_F, + with_location_hook_0, + static_cast (&proc)); +} + +static SCM +with_location_hook_1 (void *it) +{ + SCM *args = static_cast (it); + return scm_call_1 (args[0], args[1]); +} + +SCM +with_location (SCM loc, SCM proc, SCM arg1) +{ + SCM args[] = { proc, arg1 }; + return scm_c_with_fluid (Lily::f_location, + unsmob (loc) ? loc : SCM_BOOL_F, + with_location_hook_1, + static_cast (&args)); +} + +static SCM +with_location_hook_2 (void *it) +{ + SCM *args = static_cast (it); + return scm_call_2 (args[0], args[1], args[2]); +} + +SCM +with_location (SCM loc, SCM proc, SCM arg1, SCM arg2) +{ + SCM args[] = { proc, arg1, arg2 }; + return scm_c_with_fluid (Lily::f_location, + unsmob (loc) ? loc : SCM_BOOL_F, + with_location_hook_2, + static_cast (&args)); +} + +static SCM +with_location_hook_3 (void *it) +{ + SCM *args = static_cast (it); + return scm_call_3 (args[0], args[1], args[2], args[3]); +} + +SCM +with_location (SCM loc, SCM proc, SCM arg1, SCM arg2, SCM arg3) +{ + SCM args[] = { proc, arg1, arg2, arg3 }; + return scm_c_with_fluid (Lily::f_location, + unsmob (loc) ? loc : SCM_BOOL_F, + with_location_hook_3, + static_cast (&args)); +} + +static SCM +with_location_hook_4 (void *it) +{ + SCM *args = static_cast (it); + return scm_call_4 (args[0], args[1], args[2], args[3], args[4]); +} + +SCM +with_location (SCM loc, SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4) +{ + SCM args[] = { proc, arg1, arg2, arg3, arg4 }; + return scm_c_with_fluid (Lily::f_location, + unsmob (loc) ? loc : SCM_BOOL_F, + with_location_hook_4, + static_cast (&args)); +} + +static SCM +with_location_hook_n (void *it) +{ + SCM *args = static_cast (it); + return scm_apply_0 (args[0], args[1]); +} + +SCM +with_location (SCM loc, SCM proc, SCM arg1, SCM arg2, SCM arg3, SCM arg4, SCM arg5) +{ + SCM args[] = { proc, scm_list_5 (arg1, arg2, arg3, arg4, arg5) }; + return scm_c_with_fluid (Lily::f_location, + unsmob (loc) ? loc : SCM_BOOL_F, + with_location_hook_n, + static_cast (&args)); +} diff --git a/lily/instrument-name-engraver.cc b/lily/instrument-name-engraver.cc index 0abc7e4329..ec37d6bcbf 100644 --- a/lily/instrument-name-engraver.cc +++ b/lily/instrument-name-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,7 +43,7 @@ protected: vector backup_axis_groups_; virtual void finalize (); - DECLARE_ACKNOWLEDGER (axis_group); + void acknowledge_axis_group (Grob_info); void process_music (); void start_spanner (); void consider_start_spanner (); @@ -89,8 +89,8 @@ Instrument_name_engraver::consider_start_spanner () if ((Text_interface::is_markup (long_text) || Text_interface::is_markup (short_text)) && (!text_spanner_ - || short_text_ != short_text - || long_text_ != long_text)) + || !scm_is_eq (short_text_, short_text) + || !scm_is_eq (long_text_, long_text))) { if (text_spanner_) stop_spanner (); @@ -107,7 +107,7 @@ Instrument_name_engraver::start_spanner () { text_spanner_ = make_spanner ("InstrumentName", SCM_EOL); - Grob *col = unsmob_grob (get_property ("currentCommandColumn")); + Grob *col = unsmob (get_property ("currentCommandColumn")); text_spanner_->set_bound (LEFT, col); text_spanner_->set_property ("text", short_text_); text_spanner_->set_property ("long-text", long_text_); @@ -115,7 +115,7 @@ Instrument_name_engraver::start_spanner () /* UGH, should handle this in Score_engraver. */ - Grob *system = unsmob_grob (get_property ("rootSystem")); + Grob *system = unsmob (get_property ("rootSystem")); if (system) Axis_group_interface::add_element (system, text_spanner_); else @@ -133,7 +133,7 @@ Instrument_name_engraver::acknowledge_axis_group (Grob_info info) && !info.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface")) && !info.grob ()->internal_has_interface (ly_symbol2scm ("piano-pedal-interface")) && !info.grob ()->internal_has_interface (ly_symbol2scm ("volta-interface")) - && (!Align_interface::has_interface (info.grob ()))) + && (!has_interface (info.grob ()))) { if (Page_layout_problem::is_spaceable (info.grob ())) axis_groups_.push_back (info.grob ()); @@ -164,7 +164,7 @@ Instrument_name_engraver::stop_spanner () axis_groups_[i]); text_spanner_->set_bound (RIGHT, - unsmob_grob (get_property ("currentCommandColumn"))); + unsmob (get_property ("currentCommandColumn"))); Pointer_group_interface::set_ordered (text_spanner_, ly_symbol2scm ("elements"), @@ -173,7 +173,12 @@ Instrument_name_engraver::stop_spanner () text_spanner_ = 0; } -ADD_ACKNOWLEDGER (Instrument_name_engraver, axis_group); + +void +Instrument_name_engraver::boot () +{ + ADD_ACKNOWLEDGER (Instrument_name_engraver, axis_group); +} ADD_TRANSLATOR (Instrument_name_engraver, /* doc */ diff --git a/lily/instrument-switch-engraver.cc b/lily/instrument-switch-engraver.cc index c18ca4666b..59cbb4f13c 100644 --- a/lily/instrument-switch-engraver.cc +++ b/lily/instrument-switch-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -75,6 +75,12 @@ Instrument_switch_engraver::stop_translation_time_step () text_ = 0; } +void +Instrument_switch_engraver::boot () +{ + +} + ADD_TRANSLATOR (Instrument_switch_engraver, /* doc */ "Create a cue text for taking instrument.", diff --git a/lily/interval-minefield.cc b/lily/interval-minefield.cc index d26e3e0d28..ddd79186ed 100644 --- a/lily/interval-minefield.cc +++ b/lily/interval-minefield.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify diff --git a/lily/item-scheme.cc b/lily/item-scheme.cc index c316ac311e..48f3218f22 100644 --- a/lily/item-scheme.cc +++ b/lily/item-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -19,12 +19,13 @@ */ #include "item.hh" +#include "paper-column.hh" LY_DEFINE (ly_item_p, "ly:item?", 1, 0, 0, (SCM g), "Is @var{g} an @code{Item} object?") { - Grob *me = unsmob_grob (g); + Grob *me = unsmob (g); bool b = dynamic_cast (me); return ly_bool2scm (b); } @@ -35,7 +36,21 @@ LY_DEFINE (ly_item_break_dir, "ly:item-break-dir", " end of line, @code{0}@tie{}unbroken, and" " @code{1}@tie{}beginning of line.") { - LY_ASSERT_TYPE (unsmob_item, it, 1); - Item *me = unsmob_item (it); + LY_ASSERT_SMOB (Item, it, 1); + Item *me = unsmob (it); return scm_from_int (me->break_status_dir ()); } + +LY_DEFINE (ly_item_get_column, "ly:item-get-column", + 1, 0, 0, (SCM it), + "Return the @code{PaperColumn} or @code{NonMusicalPaperColumn}" + " associated with this @code{Item}.") +{ + LY_ASSERT_SMOB (Item, it, 1); + Item *me = unsmob (it); + + if (Paper_column *col = me->get_column ()) + return col->self_scm (); + + return SCM_EOL; +} diff --git a/lily/item.cc b/lily/item.cc index 9cc808dde4..f90b29d30a 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -223,23 +223,16 @@ Item::derived_mark () const scm_gc_mark (broken_to_drul_[RIGHT]->self_scm ()); } -Item * -unsmob_item (SCM s) -{ - return dynamic_cast (unsmob_grob (s)); -} - Interval -Item::pure_height (Grob *g, int start, int end) +Item::pure_y_extent (Grob *g, int start, int end) { if (cached_pure_height_valid_) return cached_pure_height_ + pure_relative_y_coordinate (g, start, end); /* Note: cached_pure_height_ does not notice if start changes, implicitly assuming that Items' pure_heights do not depend on 'start' or 'end'. - Accidental_interface::pure_height(), however, does depend on 'start'. */ - cache_pure_height (Grob::pure_height (this, start, end)); + cache_pure_height (Grob::pure_y_extent (this, start, end)); return cached_pure_height_ + pure_relative_y_coordinate (g, start, end); } diff --git a/lily/keep-alive-together-engraver.cc b/lily/keep-alive-together-engraver.cc index f6ba297ccf..9b1cbe4a23 100644 --- a/lily/keep-alive-together-engraver.cc +++ b/lily/keep-alive-together-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Joe Neeman + Copyright (C) 2010--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,7 +31,7 @@ class Keep_alive_together_engraver: public Engraver public: TRANSLATOR_DECLARATIONS (Keep_alive_together_engraver); - DECLARE_ACKNOWLEDGER (hara_kiri_group_spanner); + void acknowledge_hara_kiri_group_spanner (Grob_info); virtual void finalize (); }; @@ -51,18 +51,49 @@ Keep_alive_together_engraver::finalize () { for (vsize i = 0; i < group_spanners_.size (); ++i) { - SCM grob_array_scm = Grob_array::make_array (); - Grob_array *ga = unsmob_grob_array (grob_array_scm); - - // It would make Hara_kiri_group_spanner::request_suicide a _little_ - // faster if we removed each grob from its own array. It seems - // unnecessary for now, though. - ga->set_array (group_spanners_); - group_spanners_[i]->set_object ("keep-alive-with", grob_array_scm); + SCM this_layer = group_spanners_[i]->get_property ("remove-layer"); + if (scm_is_false (this_layer)) + continue; + + SCM live_scm = Grob_array::make_array (); + Grob_array *live = unsmob (live_scm); + SCM dead_scm = Grob_array::make_array (); + Grob_array *dead = unsmob (dead_scm); + + for (vsize j = 0; j < group_spanners_.size (); ++j) + { + if (i == j) + continue; + SCM that_layer = group_spanners_[j]->get_property ("remove-layer"); + if (scm_is_false (that_layer)) + continue; + if (!scm_is_integer (this_layer)) + { + // Unspecified layers are kept alive by anything else + live->add (group_spanners_[j]); + continue; + } + // an explicit layer is only affected by explicit layers + if (!scm_is_integer (that_layer)) + continue; + if (scm_is_true (scm_num_eq_p (that_layer, this_layer))) + live->add (group_spanners_[j]); + else if (scm_is_true (scm_less_p (that_layer, this_layer))) + dead->add (group_spanners_[j]); + } + if (!live->empty ()) + group_spanners_[i]->set_object ("keep-alive-with", live_scm); + if (!dead->empty ()) + group_spanners_[i]->set_object ("make-dead-when", dead_scm); } } -ADD_ACKNOWLEDGER (Keep_alive_together_engraver, hara_kiri_group_spanner); + +void +Keep_alive_together_engraver::boot () +{ + ADD_ACKNOWLEDGER (Keep_alive_together_engraver, hara_kiri_group_spanner); +} ADD_TRANSLATOR (Keep_alive_together_engraver, /* doc */ diff --git a/lily/key-engraver.cc b/lily/key-engraver.cc index 5707b548b9..115902e89d 100644 --- a/lily/key-engraver.cc +++ b/lily/key-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -46,9 +46,9 @@ protected: void stop_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (key_change); - DECLARE_ACKNOWLEDGER (clef); - DECLARE_ACKNOWLEDGER (bar_line); + void listen_key_change (Stream_event *); + void acknowledge_clef (Grob_info); + void acknowledge_bar_line (Grob_info); }; void @@ -78,11 +78,11 @@ Key_engraver::create_key (bool is_default) item_->set_property ("c0-position", get_property ("middleCClefPosition")); - SCM last = get_property ("lastKeySignature"); - SCM key = get_property ("keySignature"); + SCM last = get_property ("lastKeyAlterations"); + SCM key = get_property ("keyAlterations"); if ((to_boolean (get_property ("printKeyCancellation")) - || key == SCM_EOL) + || scm_is_null (key)) && !scm_is_eq (last, key)) { SCM restore = SCM_EOL; @@ -90,7 +90,7 @@ Key_engraver::create_key (bool is_default) { SCM new_alter_pair = scm_assoc (scm_caar (s), key); Rational old_alter = robust_scm2rational (scm_cdar (s), 0); - if (new_alter_pair == SCM_BOOL_F + if (scm_is_false (new_alter_pair) || ((ly_scm2rational (scm_cdr (new_alter_pair)) - old_alter) * old_alter < Rational (0))) { @@ -106,7 +106,7 @@ Key_engraver::create_key (bool is_default) cancellation_->set_property ("alteration-alist", restore); cancellation_->set_property ("c0-position", - get_property ("middleCPosition")); + get_property ("middleCClefPosition")); } } @@ -117,10 +117,10 @@ Key_engraver::create_key (bool is_default) { SCM visibility = get_property ("explicitKeySignatureVisibility"); item_->set_property ("break-visibility", visibility); + item_->set_property ("non-default", SCM_BOOL_T); } } -IMPLEMENT_TRANSLATOR_LISTENER (Key_engraver, key_change); void Key_engraver::listen_key_change (Stream_event *ev) { @@ -140,15 +140,14 @@ Key_engraver::acknowledge_clef (Grob_info /* info */) void Key_engraver::acknowledge_bar_line (Grob_info /* info */) { - if (scm_is_pair (get_property ("keySignature"))) - create_key (true); + create_key (true); } void Key_engraver::process_music () { if (key_event_ - || get_property ("lastKeySignature") != get_property ("keySignature")) + || get_property ("lastKeyAlterations") != get_property ("keyAlterations")) create_key (false); } @@ -156,7 +155,7 @@ void Key_engraver::stop_translation_timestep () { item_ = 0; - context ()->set_property ("lastKeySignature", get_property ("keySignature")); + context ()->set_property ("lastKeyAlterations", get_property ("keyAlterations")); cancellation_ = 0; key_event_ = 0; } @@ -198,7 +197,7 @@ Key_engraver::read_event (Stream_event const *r) r->origin ()->warning (_ ("Incomplete keyAlterationOrder for key signature")); } - context ()->set_property ("keySignature", scm_reverse_x (accs, SCM_EOL)); + context ()->set_property ("keyAlterations", scm_reverse_x (accs, SCM_EOL)); context ()->set_property ("tonic", r->get_property ("tonic")); } @@ -206,15 +205,21 @@ Key_engraver::read_event (Stream_event const *r) void Key_engraver::initialize () { - context ()->set_property ("keySignature", SCM_EOL); - context ()->set_property ("lastKeySignature", SCM_EOL); + context ()->set_property ("keyAlterations", SCM_EOL); + context ()->set_property ("lastKeyAlterations", SCM_EOL); - Pitch p (0, 0, 0); + Pitch p; context ()->set_property ("tonic", p.smobbed_copy ()); } -ADD_ACKNOWLEDGER (Key_engraver, clef); -ADD_ACKNOWLEDGER (Key_engraver, bar_line); + +void +Key_engraver::boot () +{ + ADD_LISTENER (Key_engraver, key_change); + ADD_ACKNOWLEDGER (Key_engraver, clef); + ADD_ACKNOWLEDGER (Key_engraver, bar_line); +} ADD_TRANSLATOR (Key_engraver, /* doc */ @@ -229,13 +234,13 @@ ADD_TRANSLATOR (Key_engraver, "explicitKeySignatureVisibility " "extraNatural " "keyAlterationOrder " - "keySignature " - "lastKeySignature " + "keyAlterations " + "lastKeyAlterations " "printKeyCancellation " "middleCClefPosition ", /* write */ - "keySignature " - "lastKeySignature " + "keyAlterations " + "lastKeyAlterations " "tonic " ); diff --git a/lily/key-performer.cc b/lily/key-performer.cc index a611405244..219454115a 100644 --- a/lily/key-performer.cc +++ b/lily/key-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,6 +22,7 @@ #include "performer.hh" #include "stream-event.hh" #include "warn.hh" +#include "lily-imports.hh" #include "translator.icc" @@ -35,7 +36,7 @@ protected: void process_music (); void stop_translation_timestep (); - DECLARE_TRANSLATOR_LISTENER (key_change); + void listen_key_change (Stream_event *); private: Stream_event *key_ev_; Audio_key *audio_; @@ -57,15 +58,14 @@ Key_performer::process_music () if (key_ev_) { SCM pitchlist = key_ev_->get_property ("pitch-alist"); - SCM proc = ly_lily_module_constant ("alterations-in-key"); - SCM acc = scm_call_1 (proc, pitchlist); + SCM acc = Lily::alterations_in_key (pitchlist); Pitch key_do (0, scm_to_int (scm_caar (pitchlist)), ly_scm2rational (scm_cdar (pitchlist))); - Pitch c_do (0, 0, 0); + Pitch c_do; SCM c_pitchlist = ly_transpose_key_alist (pitchlist, @@ -98,7 +98,6 @@ Key_performer::stop_translation_timestep () } } -IMPLEMENT_TRANSLATOR_LISTENER (Key_performer, key_change); void Key_performer::listen_key_change (Stream_event *ev) { @@ -106,6 +105,12 @@ Key_performer::listen_key_change (Stream_event *ev) key_ev_ = ev; } +void +Key_performer::boot () +{ + ADD_LISTENER (Key_performer, key_change); +} + ADD_TRANSLATOR (Key_performer, /* doc */ "", diff --git a/lily/key-signature-interface.cc b/lily/key-signature-interface.cc index fb691c00d8..79e2bd9948 100644 --- a/lily/key-signature-interface.cc +++ b/lily/key-signature-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys keyplacement by Mats Bengtsson @@ -27,11 +27,11 @@ #include "output-def.hh" #include "staff-symbol-referencer.hh" #include "rational.hh" +#include "lily-imports.hh" struct Key_signature_interface { DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); }; /* @@ -42,7 +42,7 @@ MAKE_SCHEME_CALLBACK (Key_signature_interface, print, 1); SCM Key_signature_interface::print (SCM smob) { - Item *me = dynamic_cast (unsmob_grob (smob)); + Item *me = unsmob (smob); Real inter = Staff_symbol_referencer::staff_space (me) / 2.0; @@ -87,11 +87,10 @@ Key_signature_interface::print (SCM smob) me->warning (_ ("alteration not found")); else { - SCM proc = ly_lily_module_constant ("key-signature-interface::alteration-positions"); - pos.set_empty (); Stencil column; - for (SCM pos_list = scm_call_3 (proc, scm_car (s), c0s, smob); + for (SCM pos_list = Lily::key_signature_interface_alteration_positions + (scm_car (s), c0s, smob); scm_is_pair (pos_list); pos_list = scm_cdr (pos_list)) { int p = scm_to_int (scm_car (pos_list)); @@ -137,4 +136,5 @@ ADD_INTERFACE (Key_signature_interface, "sharp-positions " "padding " "padding-pairs " + "non-default " ); diff --git a/lily/kievan-ligature-engraver.cc b/lily/kievan-ligature-engraver.cc index 92b9848c5b..ff9e7b942b 100644 --- a/lily/kievan-ligature-engraver.cc +++ b/lily/kievan-ligature-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2013 Aleksandr Andreev + Copyright (C) 2013--2015 Aleksandr Andreev LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,22 +36,15 @@ protected: virtual Spanner *create_ligature_spanner (); virtual void build_ligature (Spanner *ligature, vector const &primitives); - DECLARE_TRANSLATOR_LISTENER (ligature); public: TRANSLATOR_DECLARATIONS (Kievan_ligature_engraver); + TRANSLATOR_INHERIT (Coherent_ligature_engraver); private: void fold_up_primitives (vector const &primitives, Real padding, Real &min_length); }; -IMPLEMENT_TRANSLATOR_LISTENER (Kievan_ligature_engraver, ligature); -void -Kievan_ligature_engraver::listen_ligature (Stream_event *ev) -{ - Ligature_engraver::listen_ligature (ev); -} - Kievan_ligature_engraver::Kievan_ligature_engraver () { @@ -81,7 +74,7 @@ Kievan_ligature_engraver::fold_up_primitives (vector const &primitive first = current; // must keep track of accidentals in spacing problem - Grob *acc_gr = unsmob_grob (current->get_object ("accidental-grob")); + Grob *acc_gr = unsmob (current->get_object ("accidental-grob")); if (acc_gr && i > 0) { Interval acc_ext = acc_gr->extent (acc_gr, X_AXIS); @@ -107,7 +100,7 @@ Kievan_ligature_engraver::fold_up_primitives (vector const &primitive if (i < primitives.size () - 1) { Item *next = dynamic_cast (primitives[i + 1].grob ()); - Grob *acc_gr = unsmob_grob (next->get_object ("accidental-grob")); + Grob *acc_gr = unsmob (next->get_object ("accidental-grob")); if (acc_gr) { Interval acc_ext = acc_gr->extent (acc_gr, X_AXIS); @@ -135,8 +128,14 @@ Kievan_ligature_engraver::build_ligature (Spanner *ligature, } -ADD_ACKNOWLEDGER (Kievan_ligature_engraver, rest); -ADD_ACKNOWLEDGER (Kievan_ligature_engraver, ligature_head); + +void +Kievan_ligature_engraver::boot () +{ + ADD_LISTENER (Kievan_ligature_engraver, ligature); + ADD_ACKNOWLEDGER (Kievan_ligature_engraver, rest); + ADD_ACKNOWLEDGER (Kievan_ligature_engraver, ligature_head); +} ADD_TRANSLATOR (Kievan_ligature_engraver, /* doc */ diff --git a/lily/kievan-ligature.cc b/lily/kievan-ligature.cc index 21ea23e16a..b8b91d3415 100644 --- a/lily/kievan-ligature.cc +++ b/lily/kievan-ligature.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2013 Aleksandr Andreev + Copyright (C) 2013--2015 Aleksandr Andreev LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/laissez-vibrer-engraver.cc b/lily/laissez-vibrer-engraver.cc index edbd2c1dfb..e84ea36bca 100644 --- a/lily/laissez-vibrer-engraver.cc +++ b/lily/laissez-vibrer-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -32,9 +32,9 @@ class Laissez_vibrer_engraver : public Engraver vector lv_ties_; void stop_translation_timestep (); - DECLARE_ACKNOWLEDGER (note_head); + void acknowledge_note_head (Grob_info); protected: - DECLARE_TRANSLATOR_LISTENER (laissez_vibrer); + void listen_laissez_vibrer (Stream_event *); public: TRANSLATOR_DECLARATIONS (Laissez_vibrer_engraver); }; @@ -53,7 +53,6 @@ Laissez_vibrer_engraver::stop_translation_timestep () lv_ties_.clear (); } -IMPLEMENT_TRANSLATOR_LISTENER (Laissez_vibrer_engraver, laissez_vibrer); void Laissez_vibrer_engraver::listen_laissez_vibrer (Stream_event *ev) { @@ -67,13 +66,13 @@ Laissez_vibrer_engraver::acknowledge_note_head (Grob_info inf) * a single note head (attached as an articulation inside a chord) */ Stream_event *tie_ev = event_; Grob *head = inf.grob (); - Stream_event *note_ev = unsmob_stream_event (head->get_property ("cause")); + Stream_event *note_ev = unsmob (head->get_property ("cause")); if (!tie_ev && note_ev && note_ev->in_event_class ("note-event")) { SCM articulations = note_ev->get_property ("articulations"); for (SCM s = articulations; !tie_ev && scm_is_pair (s); s = scm_cdr (s)) { - Stream_event *ev = unsmob_stream_event (scm_car (s)); + Stream_event *ev = unsmob (scm_car (s)); if (ev && ev->in_event_class ("laissez-vibrer-event")) tie_ev = ev; } @@ -93,9 +92,9 @@ Laissez_vibrer_engraver::acknowledge_note_head (Grob_info inf) Pointer_group_interface::add_grob (lv_column_, ly_symbol2scm ("ties"), lv_tie); - if (is_direction (unsmob_stream_event (cause)->get_property ("direction"))) + if (is_direction (unsmob (cause)->get_property ("direction"))) { - Direction d = to_dir (unsmob_stream_event (cause)->get_property ("direction")); + Direction d = to_dir (unsmob (cause)->get_property ("direction")); lv_tie->set_property ("direction", scm_from_int (d)); } @@ -104,7 +103,13 @@ Laissez_vibrer_engraver::acknowledge_note_head (Grob_info inf) lv_ties_.push_back (lv_tie); } -ADD_ACKNOWLEDGER (Laissez_vibrer_engraver, note_head); +void +Laissez_vibrer_engraver::boot () +{ + ADD_LISTENER (Laissez_vibrer_engraver, laissez_vibrer); + ADD_ACKNOWLEDGER (Laissez_vibrer_engraver, note_head); +} + ADD_TRANSLATOR (Laissez_vibrer_engraver, /* doc */ "Create laissez vibrer items.", diff --git a/lily/least-squares.cc b/lily/least-squares.cc index 0d539104fe..9c250bea91 100644 --- a/lily/least-squares.cc +++ b/lily/least-squares.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/ledger-line-engraver.cc b/lily/ledger-line-engraver.cc index 2bb12c9cdc..869720cca4 100644 --- a/lily/ledger-line-engraver.cc +++ b/lily/ledger-line-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,6 +22,8 @@ #include "engraver.hh" #include "staff-symbol.hh" +#include "translator.icc" + class Ledger_line_engraver : public Engraver { Spanner *span_; @@ -34,8 +36,8 @@ protected: virtual void finalize (); void process_music (); - DECLARE_ACKNOWLEDGER (ledgered); - DECLARE_ACKNOWLEDGER (staff_symbol); + void acknowledge_ledgered (Grob_info); + void acknowledge_staff_symbol (Grob_info); void start_spanner (); void stop_spanner (); @@ -53,7 +55,7 @@ Ledger_line_engraver::start_spanner () assert (!span_); span_ = make_spanner ("LedgerLineSpanner", SCM_EOL); - span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); + span_->set_bound (LEFT, unsmob (get_property ("currentCommandColumn"))); } void @@ -94,7 +96,7 @@ Ledger_line_engraver::stop_spanner () { if (span_) { - span_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + span_->set_bound (RIGHT, unsmob (get_property ("currentCommandColumn"))); span_ = 0; } } @@ -118,10 +120,13 @@ Ledger_line_engraver::acknowledge_ledgered (Grob_info s) ledgered_grobs_.push_back (s.grob ()); } -#include "translator.icc" +void +Ledger_line_engraver::boot () +{ + ADD_ACKNOWLEDGER (Ledger_line_engraver, ledgered); + ADD_ACKNOWLEDGER (Ledger_line_engraver, staff_symbol); +} -ADD_ACKNOWLEDGER (Ledger_line_engraver, ledgered); -ADD_ACKNOWLEDGER (Ledger_line_engraver, staff_symbol); ADD_TRANSLATOR (Ledger_line_engraver, /* doc */ "Create the spanner to draw ledger lines, and notices" diff --git a/lily/ledger-line-spanner.cc b/lily/ledger-line-spanner.cc index de88ba402f..2fe2d7d9c3 100644 --- a/lily/ledger-line-spanner.cc +++ b/lily/ledger-line-spanner.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,7 +32,6 @@ struct Ledger_line_spanner { DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM)); - DECLARE_GROB_INTERFACE (); }; static void @@ -66,7 +65,7 @@ MAKE_SCHEME_CALLBACK (Ledger_line_spanner, set_spacing_rods, 1); SCM Ledger_line_spanner::set_spacing_rods (SCM smob) { - Spanner *me = dynamic_cast (unsmob_grob (smob)); + Spanner *me = unsmob (smob); // find size of note heads. Grob *staff = Staff_symbol_referencer::get_staff_symbol (me); @@ -100,7 +99,7 @@ Ledger_line_spanner::set_spacing_rods (SCM smob) Item *h = heads[i]; int pos = Staff_symbol_referencer::get_rounded_position (h); - if (staff_extent.contains (pos)) + if (Staff_symbol::ledger_positions (staff, pos).empty ()) continue; /* Ambitus heads can appear out-of-order in heads[], @@ -141,16 +140,33 @@ Ledger_line_spanner::set_spacing_rods (SCM smob) return SCM_UNSPECIFIED; } -struct Ledger_request +struct Head_data { - Interval ledger_extent_; - Interval head_extent_; int position_; - Ledger_request () + vector ledger_positions_; + Interval head_extent_; + Interval ledger_extent_; + Interval accidental_extent_; + Head_data () { - ledger_extent_.set_empty (); head_extent_.set_empty (); - position_ = 0; + ledger_extent_.set_empty (); + accidental_extent_.set_empty (); + } +}; + +struct Ledger_request +{ + Interval max_ledger_extent_; + Interval max_head_extent_; + int max_position_; + vector heads_; + map ledger_extents_; + Ledger_request () + { + max_ledger_extent_.set_empty (); + max_head_extent_.set_empty (); + max_position_ = 0; } }; @@ -164,14 +180,14 @@ MAKE_SCHEME_CALLBACK (Ledger_line_spanner, print, 1); SCM Ledger_line_spanner::print (SCM smob) { - Spanner *me = dynamic_cast (unsmob_grob (smob)); + Spanner *me = unsmob (smob); + // Generate ledger requests from note head properties, etc. extract_grob_set (me, "note-heads", heads); if (heads.empty ()) return SCM_EOL; - // find size of note heads. Grob *staff = Staff_symbol_referencer::get_staff_symbol (me); if (!staff) return SCM_EOL; @@ -184,42 +200,55 @@ Ledger_line_spanner::print (SCM smob) Real length_fraction = robust_scm2double (me->get_property ("length-fraction"), 0.25); - Stencil ledgers; - - Grob *common[NO_AXES]; - - for (int i = X_AXIS; i < NO_AXES; i++) + Grob *common_x = common_refpoint_of_array (heads, me, X_AXIS); + for (vsize i = heads.size (); i--;) { - Axis a = Axis (i); - common[a] = common_refpoint_of_array (heads, me, a); - for (vsize i = heads.size (); i--;) - if (Grob *g = unsmob_grob (me->get_object ("accidental-grob"))) - common[a] = common[a]->common_refpoint (g, a); + if (Grob *g = unsmob (heads[i]->get_object ("accidental-grob"))) + common_x = common_x->common_refpoint (g, X_AXIS); } Ledger_requests reqs; for (vsize i = heads.size (); i--;) { Item *h = dynamic_cast (heads[i]); - int pos = Staff_symbol_referencer::get_rounded_position (h); - if (pos && !staff_extent.contains (pos)) + vector ledger_positions = + Staff_symbol::ledger_positions (staff, pos, h); + + // We work with all notes that produce ledgers and any notes that + // fall outside the staff that do not produce ledgers, such as + // notes in the first space just beyond the staff. + if (ledger_positions.size () != 0 || !staff_extent.contains (pos)) { - Interval head_extent = h->extent (common[X_AXIS], X_AXIS); + Interval head_extent = h->extent (common_x, X_AXIS); Interval ledger_extent = head_extent; ledger_extent.widen (length_fraction * head_extent.length ()); - Direction vdir = Direction (sign (pos)); + Direction vdir = Direction (sign (pos != 0 ? pos : 1)); int rank = h->get_column ()->get_rank (); - reqs[rank][vdir].ledger_extent_.unite (ledger_extent); - reqs[rank][vdir].head_extent_.unite (head_extent); - reqs[rank][vdir].position_ - = vdir * max (vdir * reqs[rank][vdir].position_, vdir * pos); + reqs[rank][vdir].max_ledger_extent_.unite (ledger_extent); + reqs[rank][vdir].max_head_extent_.unite (head_extent); + reqs[rank][vdir].max_position_ + = vdir * max (vdir * reqs[rank][vdir].max_position_, + vdir * pos); + Head_data hd; + hd.position_ = pos; + hd.ledger_positions_ = ledger_positions; + hd.ledger_extent_ = ledger_extent; + hd.head_extent_ = head_extent; + if (Grob *g = unsmob (h->get_object ("accidental-grob"))) + hd.accidental_extent_ = g->extent (common_x, X_AXIS); + reqs[rank][vdir].heads_.push_back(hd); } } - // determine maximum size for non-colliding ledger. + if (reqs.size () == 0) + return SCM_EOL; + + // Iterate through ledger requests and when ledger lines will be + // too close together horizontally, shorten max_ledger_extent to + // produce more space between them. Real gap = robust_scm2double (me->get_property ("gap"), 0.1); Ledger_requests::iterator last (reqs.end ()); for (Ledger_requests::iterator i (reqs.begin ()); @@ -230,81 +259,111 @@ Ledger_line_spanner::print (SCM smob) for (DOWN_and_UP (d)) { - if (!staff_extent.contains (last->second[d].position_) - && !staff_extent.contains (i->second[d].position_)) + // Some rank--> vdir--> reqs will be 'empty' because notes + // will not be above AND below the staff for a given rank. + if (!staff_extent.contains (last->second[d].max_position_) + && !staff_extent.contains (i->second[d].max_position_)) { + // Midpoint between the furthest bounds of the two heads. Real center - = (last->second[d].head_extent_[RIGHT] - + i->second[d].head_extent_[LEFT]) / 2; + = (last->second[d].max_head_extent_[RIGHT] + + i->second[d].max_head_extent_[LEFT]) / 2; + + // Do both reqs have notes further than the first space + // beyond the staff? + // (due tilt of quarter note-heads) + /* FIXME */ + bool both + = (!staff_extent.contains (last->second[d].max_position_ + - sign (last->second[d].max_position_)) + && !staff_extent.contains (i->second[d].max_position_ + - sign (i->second[d].max_position_))); for (LEFT_and_RIGHT (which)) { Ledger_request &lr = ((which == LEFT) ? * last : *i).second[d]; - // due tilt of quarter note-heads - /* FIXME */ - bool both - = (!staff_extent.contains (last->second[d].position_ - - sign (last->second[d].position_)) - && !staff_extent.contains (i->second[d].position_ - - sign (i->second[d].position_))); Real limit = (center + (both ? which * gap / 2 : 0)); - lr.ledger_extent_.at (-which) - = which * max (which * lr.ledger_extent_[-which], which * limit); + lr.max_ledger_extent_.at (-which) + = which * max (which * lr.max_ledger_extent_[-which], + which * limit); } } } } - // create ledgers for note heads - Real ledgerlinethickness - = Staff_symbol::get_ledger_line_thickness (staff); - for (vsize i = heads.size (); i--;) + // Iterate through ledger requests and the data they have about each + // note head to generate the final extents for all ledger lines. + // Note heads that are different widths produce different ledger + // extents and these are merged so the widest extent prevails + // (the union of the intervals) for each ledger line. + for (Ledger_requests::iterator i (reqs.begin ()); + i != reqs.end (); i++) { - Item *h = dynamic_cast (heads[i]); - - int pos = Staff_symbol_referencer::get_rounded_position (h); - vector ledger_positions = Staff_symbol::ledger_positions (staff, pos); - if (!ledger_positions.empty ()) + for (DOWN_and_UP (d)) { - int ledger_count = ledger_positions.size (); - Interval head_size = h->extent (common[X_AXIS], X_AXIS); - Interval ledger_size = head_size; - ledger_size.widen (ledger_size.length () * length_fraction); - - if (pos && !staff_extent.contains (pos)) + Ledger_request &lr = i->second[d]; + for (vsize h = 0; h < lr.heads_.size (); h++) { - Interval max_size = reqs[h->get_column ()->get_rank ()] - [Direction (sign (pos))].ledger_extent_; - - if (!max_size.is_empty ()) - ledger_size.intersect (max_size); + vector &ledger_posns = lr.heads_[h].ledger_positions_; + Interval &ledger_size = lr.heads_[h].ledger_extent_; + Interval &head_size = lr.heads_[h].head_extent_; + Interval &acc_extent = lr.heads_[h].accidental_extent_; + + // Limit ledger extents to a maximum to preserve space + // between ledgers when note heads get close. + if (!lr.max_ledger_extent_.is_empty ()) + ledger_size.intersect (lr.max_ledger_extent_); + + // Iterate through the ledgers for a given note head. + for (vsize l = 0; l < ledger_posns.size (); l++) + { + Real lpos = ledger_posns[l]; + Interval x_extent = ledger_size; + + // Notes with accidental signs get shorter ledgers. + // (Only happens for the furthest note in the column.) + if (l == 0 && !acc_extent.is_empty ()) + { + Real dist + = linear_combination (Drul_array (acc_extent[RIGHT], + head_size[LEFT]), + 0.0); + + Real left_shorten = max (-ledger_size[LEFT] + dist, 0.0); + x_extent[LEFT] += left_shorten; + /* + TODO: shorten 2 ledger lines for the case + natural + downstem. + */ + } + if (lr.ledger_extents_.find (lpos) == lr.ledger_extents_.end ()) + lr.ledger_extents_[lpos] = x_extent; + else + lr.ledger_extents_[lpos].unite (x_extent); + } } + } + } - for (int i = 0; i < ledger_count; i++) - { - Real lpos = ledger_positions[i]; - Interval x_extent = ledger_size; - - if (i == 0) - if (Grob *g = unsmob_grob (h->get_object ("accidental-grob"))) - { - Interval accidental_size = g->extent (common[X_AXIS], X_AXIS); - Real d - = linear_combination (Drul_array (accidental_size[RIGHT], - head_size[LEFT]), - 0.0); - - Real left_shorten = max (-ledger_size[LEFT] + d, 0.0); - - x_extent[LEFT] += left_shorten; - /* - TODO: shorten 2 ledger lines for the case natural + - downstem. - */ - } + // Create the stencil for the ledger line spanner by iterating + // through the ledger requests and their data on ledger extents. + Stencil ledgers; + Real ledgerlinethickness + = Staff_symbol::get_ledger_line_thickness (staff); + for (Ledger_requests::iterator i (reqs.begin ()); + i != reqs.end (); i++) + { + for (DOWN_and_UP (d)) + { + map &lex = i->second[d].ledger_extents_; + for (map::iterator k = lex.begin (); + k != lex.end (); k++) + { Real blotdiameter = ledgerlinethickness; + Real lpos = k->first; + Interval x_extent = k->second; Interval y_extent = Interval (-0.5 * (ledgerlinethickness), +0.5 * (ledgerlinethickness)); @@ -317,7 +376,7 @@ Ledger_line_spanner::print (SCM smob) } } - ledgers.translate_axis (-me->relative_coordinate (common[X_AXIS], X_AXIS), + ledgers.translate_axis (-me->relative_coordinate (common_x, X_AXIS), X_AXIS); return ledgers.smobbed_copy (); @@ -339,7 +398,6 @@ ADD_INTERFACE (Ledger_line_spanner, struct Ledgered_interface { - DECLARE_GROB_INTERFACE (); }; ADD_INTERFACE (Ledgered_interface, diff --git a/lily/lexer.ll b/lily/lexer.ll index 9a5d781dce..bfd2449e6b 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -2,7 +2,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -30,9 +30,9 @@ /* backup rules - after making a change to the lexer rules, run + after making a change to the lexer rules, run flex -b - and make sure that + and make sure that lex.backup contains no backup states, but only the reminder Compressed tables always back up. @@ -69,9 +69,9 @@ using namespace std; #include "pitch.hh" #include "source-file.hh" #include "std-string.hh" -#include "string-convert.hh" #include "version.hh" #include "warn.hh" +#include "lily-imports.hh" /* RH 7 fix (?) @@ -120,10 +120,9 @@ SCM (* scm_parse_error_handler) (void *); %option debug %option yyclass="Lily_lexer" %option stack -%option never-interactive +%option never-interactive %option warn -%x extratoken %x chords %x figures %x incl @@ -186,40 +185,10 @@ BOM_UTF8 \357\273\277 // swallow and ignore carriage returns } -{ANY_CHAR} { - /* Generate a token without swallowing anything */ - - /* First unswallow the eaten character */ - add_lexed_char (-YYLeng ()); - yyless (0); - - /* produce requested token */ - int type = scm_to_int (scm_caar (extra_tokens_)); - yylval = scm_cdar (extra_tokens_); - extra_tokens_ = scm_cdr (extra_tokens_); - if (scm_is_null (extra_tokens_)) - yy_pop_state (); - - return type; -} - -<> { - /* Generate a token without swallowing anything */ - - /* produce requested token */ - int type = scm_to_int (scm_caar (extra_tokens_)); - yylval = scm_cdar (extra_tokens_); - extra_tokens_ = scm_cdr (extra_tokens_); - if (scm_is_null (extra_tokens_)) - yy_pop_state (); - - return type; -} - /* Use the trailing context feature. Otherwise, the BOM will not be found if the file starts with an identifier definition. */ {BOM_UTF8}/.* { - if (this->lexloc_->line_number () != 1 || this->lexloc_->column_number () != 0) + if (lexloc_->line_number () != 1 || lexloc_->column_number () != 0) { LexerWarning (_ ("stray UTF-8 BOM encountered").c_str ()); // exit (1); @@ -275,7 +244,7 @@ BOM_UTF8 \357\273\277 s = s.substr (0, s.rfind ('\"')); yy_pop_state (); - this->here_input().get_source_file ()->name_ = s; + here_input().get_source_file ()->name_ = s; message (_f ("Renaming input to: `%s'", s.c_str ())); progress_indication ("\n"); scm_module_define (scm_car (scopes_), @@ -289,7 +258,7 @@ BOM_UTF8 \357\273\277 sscanf (YYText (), "%d", &i); yy_pop_state (); - this->here_input ().get_source_file ()->set_line (here_input ().start (), i); + here_input ().get_source_file ()->set_line (here_input ().start (), i); } {ANY_CHAR} { @@ -378,7 +347,7 @@ BOM_UTF8 \357\273\277 yy_pop_state (); } else { LexerError (_ ("string expected after \\include").c_str ()); - if (sval != SCM_UNDEFINED) { + if (!SCM_UNBNDP (sval)) { SCM err = scm_current_error_port (); scm_puts ("This value was found instead: ", err); scm_display (sval, err); @@ -400,7 +369,7 @@ BOM_UTF8 \357\273\277 {RESTNAME}/[-_] | // pseudo backup rule {RESTNAME} { char const *s = YYText (); - yylval = scm_from_locale_string (s); + yylval = scm_from_ascii_string (s); return RESTNAME; } q/[-_] | // pseudo backup rule @@ -419,7 +388,7 @@ BOM_UTF8 \357\273\277 hi.step_forward (); SCM sval = ly_parse_scm (hi, be_safe_global && is_main_input_, parser_); - if (sval == SCM_UNDEFINED) + if (SCM_UNBNDP (sval)) error_level_ = 1; int n = hi.end () - hi.start (); @@ -453,7 +422,7 @@ BOM_UTF8 \357\273\277 return token; } -{ +{ \<\< { yylval = SCM_UNSPECIFIED; return DOUBLE_ANGLE_OPEN; @@ -464,7 +433,7 @@ BOM_UTF8 \357\273\277 } } -{ +{ \< { yylval = SCM_UNSPECIFIED; return ANGLE_OPEN; @@ -540,11 +509,11 @@ BOM_UTF8 \357\273\277 { \\{ESCAPED} { char c = escaped_char (YYText ()[1]); - yylval = scm_cons (scm_from_locale_stringn (&c, 1), + yylval = scm_cons (scm_from_ascii_stringn (&c, 1), yylval); } [^\\""]+ { - yylval = scm_cons (scm_from_locale_string (YYText_utf8 ()), + yylval = scm_cons (scm_from_utf8_string (YYText_utf8 ()), yylval); } \" { @@ -565,7 +534,7 @@ BOM_UTF8 \357\273\277 return STRING; } \\ { - yylval = scm_cons (scm_from_locale_string (YYText ()), + yylval = scm_cons (scm_from_ascii_string (YYText ()), yylval); } } @@ -671,6 +640,10 @@ BOM_UTF8 \357\273\277 yylval = SCM_UNSPECIFIED; return SCORE; } + \\score-lines { + yylval = SCM_UNSPECIFIED; + return SCORELINES; + } \\\" { start_command_quote (); } @@ -711,17 +684,17 @@ BOM_UTF8 \357\273\277 // value (for token type MARKUP_FUNCTION or // MARKUP_LIST_FUNCTION). - push_extra_token(EXPECT_NO_MORE_ARGS); + push_extra_token (here_input (), EXPECT_NO_MORE_ARGS); s = scm_cdr(s); for (; scm_is_pair(s); s = scm_cdr(s)) { SCM predicate = scm_car(s); - if (predicate == ly_lily_module_constant ("markup-list?")) - push_extra_token(EXPECT_MARKUP_LIST); - else if (predicate == ly_lily_module_constant ("markup?")) - push_extra_token(EXPECT_MARKUP); + if (predicate == Lily::markup_list_p) + push_extra_token (here_input (), EXPECT_MARKUP_LIST); + else if (predicate == Lily::markup_p) + push_extra_token (here_input (), EXPECT_MARKUP); else - push_extra_token(EXPECT_SCM, predicate); + push_extra_token (here_input (), EXPECT_SCM, predicate); } return token_type; } @@ -837,18 +810,28 @@ BOM_UTF8 \357\273\277 %% -/* Make the lexer generate a token of the given type as the next token. +/* Make the lexer generate a token of the given type as the next token. TODO: make it possible to define a value for the token as well */ void -Lily_lexer::push_extra_token (int token_type, SCM scm) +Lily_lexer::push_extra_token (Input const &where, int token_type, SCM scm) +{ + extra_tokens_ = scm_cons (scm_cons2 (where.smobbed_copy (), + scm_from_int (token_type), + scm), extra_tokens_); +} + +int +Lily_lexer::pop_extra_token () { if (scm_is_null (extra_tokens_)) - { - if (YY_START != extratoken) - hidden_state_ = YY_START; - yy_push_state (extratoken); - } - extra_tokens_ = scm_acons (scm_from_int (token_type), scm, extra_tokens_); + return -1; + + /* produce requested token */ + yylloc = *unsmob (scm_caar (extra_tokens_)); + int type = scm_to_int (scm_cadar (extra_tokens_)); + yylval = scm_cddar (extra_tokens_); + extra_tokens_ = scm_cdr (extra_tokens_); + return type; } void @@ -889,32 +872,17 @@ Lily_lexer::push_markup_state () void Lily_lexer::push_note_state (SCM alist) { - bool extra = (YYSTATE == extratoken); - SCM p = scm_assq (alist, pitchname_tab_stack_); - if (extra) - yy_pop_state (); - if (scm_is_false (p)) p = scm_cons (alist, alist_to_hashq (alist)); pitchname_tab_stack_ = scm_cons (p, pitchname_tab_stack_); yy_push_state (notes); - - if (extra) { - hidden_state_ = YYSTATE; - yy_push_state (extratoken); - } } void Lily_lexer::pop_state () { - bool extra = (YYSTATE == extratoken); - - if (extra) - yy_pop_state (); - if (YYSTATE == notes || YYSTATE == chords) pitchname_tab_stack_ = scm_cdr (pitchname_tab_stack_); @@ -922,10 +890,6 @@ Lily_lexer::pop_state () if (YYSTATE != maininput) yy_pop_state (); - if (extra) { - hidden_state_ = YYSTATE; - yy_push_state (extratoken); - } } int @@ -950,15 +914,15 @@ Lily_lexer::scan_escaped_word (const string &str) return i; SCM sid = lookup_identifier (str); - if (Music *m = unsmob_music (sid)) + if (Music *m = unsmob (sid)) { m->set_spot (override_input (here_input ())); } - if (sid != SCM_UNDEFINED) + if (!SCM_UNBNDP (sid)) return scan_scm_id (sid); - string msg (_f ("unknown escaped string: `\\%s'", str)); + string msg (_f ("unknown escaped string: `\\%s'", str)); LexerError (msg.c_str ()); yylval = ly_string2scm (str); @@ -970,15 +934,15 @@ int Lily_lexer::scan_shorthand (const string &str) { SCM sid = lookup_identifier (str); - if (Music *m = unsmob_music (sid)) + if (Music *m = unsmob (sid)) { m->set_spot (override_input (here_input ())); } - if (sid != SCM_UNDEFINED) + if (!SCM_UNBNDP (sid)) return scan_scm_id (sid); - string msg (_f ("undefined character or shorthand: %s", str)); + string msg (_f ("undefined character or shorthand: %s", str)); LexerError (msg.c_str ()); yylval = ly_string2scm (str); @@ -989,13 +953,13 @@ Lily_lexer::scan_shorthand (const string &str) int Lily_lexer::scan_scm_id (SCM sid) { - if (is_music_function (sid)) + if (Music_function *fun = unsmob (sid)) { int funtype = SCM_FUNCTION; yylval = sid; - SCM s = get_music_function_signature (sid); + SCM s = fun->get_signature (); SCM cs = scm_car (s); if (scm_is_pair (cs)) @@ -1003,15 +967,15 @@ Lily_lexer::scan_scm_id (SCM sid) cs = SCM_CAR (cs); } - if (scm_is_eq (cs, ly_lily_module_constant ("ly:music?"))) + if (scm_is_eq (cs, Lily::ly_music_p)) funtype = MUSIC_FUNCTION; - else if (scm_is_eq (cs, ly_lily_module_constant ("ly:event?"))) + else if (scm_is_eq (cs, Lily::ly_event_p)) funtype = EVENT_FUNCTION; else if (ly_is_procedure (cs)) funtype = SCM_FUNCTION; else programming_error ("Bad syntax function predicate"); - push_extra_token (EXPECT_NO_MORE_ARGS); + push_extra_token (here_input (), EXPECT_NO_MORE_ARGS); for (s = scm_cdr (s); scm_is_pair (s); s = scm_cdr (s)) { SCM optional = SCM_UNDEFINED; @@ -1022,16 +986,16 @@ Lily_lexer::scan_scm_id (SCM sid) optional = SCM_CDR (cs); cs = SCM_CAR (cs); } - + if (ly_is_procedure (cs)) - push_extra_token (EXPECT_SCM, cs); + push_extra_token (here_input (), EXPECT_SCM, cs); else { programming_error ("Function parameter without type-checking predicate"); continue; } if (!scm_is_eq (optional, SCM_UNDEFINED)) - push_extra_token (EXPECT_OPTIONAL, optional); + push_extra_token (here_input (), EXPECT_OPTIONAL, optional); } return funtype; } @@ -1047,16 +1011,16 @@ Lily_lexer::scan_bare_word (const string &str) SCM handle = SCM_BOOL_F; if (scm_is_pair (pitchname_tab_stack_)) handle = scm_hashq_get_handle (scm_cdar (pitchname_tab_stack_), sym); - + if (scm_is_pair (handle)) { yylval = scm_cdr (handle); - if (unsmob_pitch (yylval)) + if (unsmob (yylval)) return (YYSTATE == notes) ? NOTENAME_PITCH : TONICNAME_PITCH; else if (scm_is_symbol (yylval)) return DRUM_PITCH; } else if ((YYSTATE == chords) - && (handle = scm_hashq_get_handle (chordmodifier_tab_, sym))!= SCM_BOOL_F) + && scm_is_true (handle = scm_hashq_get_handle (chordmodifier_tab_, sym))) { yylval = scm_cdr (handle); return CHORD_MODIFIER; @@ -1069,10 +1033,7 @@ Lily_lexer::scan_bare_word (const string &str) int Lily_lexer::get_state () const { - if (YY_START == extratoken) - return hidden_state_; - else - return YY_START; + return YY_START; } bool @@ -1135,21 +1096,23 @@ Lily_lexer::eval_scm (SCM readerdata, Input hi, char extra_token) p = scm_cdr (p)) { SCM v = scm_car (p); - if (Music *m = unsmob_music (v)) + if (Music *m = unsmob (v)) { - if (!unsmob_input (m->get_property ("origin"))) + if (!unsmob (m->get_property ("origin"))) m->set_spot (override_input (here_input ())); } - + int token; switch (extra_token) { case '$': token = scan_scm_id (v); if (!scm_is_eq (yylval, SCM_UNSPECIFIED)) - push_extra_token (token, yylval); + push_extra_token (here_input (), + token, yylval); break; case '#': - push_extra_token (SCM_IDENTIFIER, v); + push_extra_token (here_input (), + SCM_IDENTIFIER, v); break; } } @@ -1158,9 +1121,9 @@ Lily_lexer::eval_scm (SCM readerdata, Input hi, char extra_token) sval = SCM_UNSPECIFIED; } - if (Music *m = unsmob_music (sval)) + if (Music *m = unsmob (sval)) { - if (!unsmob_input (m->get_property ("origin"))) + if (!unsmob (m->get_property ("origin"))) m->set_spot (override_input (here_input ())); } @@ -1278,7 +1241,7 @@ Lily_lexer::YYText_utf8 () /* urg, belong to string (_convert) - and should be generalised + and should be generalised */ void strip_leading_white (string&s) @@ -1294,8 +1257,8 @@ strip_leading_white (string&s) void strip_trailing_white (string&s) { - ssize i = s.length (); - while (i--) + ssize i = s.length (); + while (i--) if (!isspace (s[i])) break; @@ -1312,8 +1275,13 @@ is_valid_version (string s) { Lilypond_version current ( MAJOR_VERSION "." MINOR_VERSION "." PATCH_LEVEL ); Lilypond_version ver (s); - if (int (ver) < oldest_version) - { + if (!ver) + { + non_fatal_error (_f ("Invalid version string \"%s\"", s)); + return false; + } + if (ver < oldest_version) + { non_fatal_error (_f ("file too old: %s (oldest supported: %s)", ver.to_string (), oldest_version.to_string ())); non_fatal_error (_ ("consider updating the input with the convert-ly script")); return false; @@ -1326,7 +1294,7 @@ is_valid_version (string s) } return true; } - + /* substitute _ @@ -1353,23 +1321,20 @@ scan_fraction (string frac) string left = frac.substr (0, i); string right = frac.substr (i + 1, (frac.length () - i + 1)); - int n = String_convert::dec2int (left); - int d = String_convert::dec2int (right); - return scm_cons (scm_from_int (n), scm_from_int (d)); + return scm_cons (scm_c_read_string (left.c_str ()), + scm_c_read_string (right.c_str ())); } SCM lookup_markup_command (string s) { - SCM proc = ly_lily_module_constant ("lookup-markup-command"); - return scm_call_1 (proc, ly_string2scm (s)); + return Lily::lookup_markup_command (ly_string2scm (s)); } SCM lookup_markup_list_command (string s) { - SCM proc = ly_lily_module_constant ("lookup-markup-list-command"); - return scm_call_1 (proc, ly_string2scm (s)); + return Lily::lookup_markup_list_command (ly_string2scm (s)); } /* Shut up lexer warnings. */ diff --git a/lily/ligature-bracket-engraver.cc b/lily/ligature-bracket-engraver.cc index 7453c05840..4919071d97 100644 --- a/lily/ligature-bracket-engraver.cc +++ b/lily/ligature-bracket-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Juergen Reuter + Copyright (C) 2002--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,9 +33,9 @@ class Ligature_bracket_engraver : public Engraver protected: virtual void process_music (); virtual void stop_translation_timestep (); - DECLARE_ACKNOWLEDGER (rest); - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_TRANSLATOR_LISTENER (ligature); + void acknowledge_rest (Grob_info); + void acknowledge_note_column (Grob_info); + void listen_ligature (Stream_event *); public: TRANSLATOR_DECLARATIONS (Ligature_bracket_engraver); @@ -46,7 +46,6 @@ private: Stream_event *previous_start_event_; }; -IMPLEMENT_TRANSLATOR_LISTENER (Ligature_bracket_engraver, ligature); void Ligature_bracket_engraver::listen_ligature (Stream_event *ev) { @@ -116,8 +115,14 @@ Ligature_bracket_engraver::stop_translation_timestep () finished_ligature_ = 0; } -ADD_ACKNOWLEDGER (Ligature_bracket_engraver, rest); -ADD_ACKNOWLEDGER (Ligature_bracket_engraver, note_column); + +void +Ligature_bracket_engraver::boot () +{ + ADD_LISTENER (Ligature_bracket_engraver, ligature); + ADD_ACKNOWLEDGER (Ligature_bracket_engraver, rest); + ADD_ACKNOWLEDGER (Ligature_bracket_engraver, note_column); +} ADD_TRANSLATOR (Ligature_bracket_engraver, /* doc */ diff --git a/lily/ligature-engraver.cc b/lily/ligature-engraver.cc index 297337a976..f3bac03c76 100644 --- a/lily/ligature-engraver.cc +++ b/lily/ligature-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Juergen Reuter + Copyright (C) 2002--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -121,7 +121,7 @@ Ligature_engraver::process_music () primitives_.clear (); ligature_ = 0; } - last_bound_ = unsmob_grob (get_property ("currentMusicalColumn")); + last_bound_ = unsmob (get_property ("currentMusicalColumn")); if (ligature_) { @@ -140,7 +140,7 @@ Ligature_engraver::process_music () prev_start_event_ = events_drul_[START]; ligature_ = create_ligature_spanner (); - Grob *bound = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *bound = unsmob (get_property ("currentMusicalColumn")); if (!bound) events_drul_[START]->origin ()->warning (_ ("no left bound")); else @@ -203,7 +203,7 @@ Ligature_engraver::acknowledge_ligature_head (Grob_info info) if (ligature_) { primitives_.push_back (info); - if (info.grob () && brew_ligature_primitive_proc != SCM_EOL) + if (info.grob () && !scm_is_null (brew_ligature_primitive_proc)) info.grob ()->set_property ("stencil", brew_ligature_primitive_proc); } } diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 06018c4c9c..f37380f024 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -40,6 +40,7 @@ using namespace std; #include "source-file.hh" #include "version.hh" #include "warn.hh" +#include "lily-imports.hh" /* symbols/strings. @@ -144,7 +145,7 @@ ly_string2scm (string const &str) char * ly_scm2str0 (SCM str) { - return scm_to_locale_string (str); + return scm_to_utf8_string (str); } /* @@ -401,13 +402,13 @@ type_check_assignment (SCM sym, SCM val, SCM type_symbol) { // If undefined, some internal function caused it...should never happen. - assert (val != SCM_UNDEFINED); + assert (!SCM_UNBNDP (val)); if (!scm_is_symbol (sym)) return false; SCM type = scm_object_property (sym, type_symbol); - if (type != SCM_EOL && !ly_is_procedure (type)) + if (!scm_is_null (type) && !ly_is_procedure (type)) { warning (_f ("cannot find property type-check for `%s' (%s).", ly_symbol2string (sym).c_str (), @@ -429,16 +430,15 @@ type_check_assignment (SCM sym, SCM val, SCM type_symbol) TODO: should remove #f from allowed vals? */ - if (val == SCM_EOL || val == SCM_BOOL_F) + if (scm_is_null (val) || scm_is_false (val)) return true; - if (val != SCM_EOL + if (!scm_is_null (val) && ly_is_procedure (type) - && scm_call_1 (type, val) == SCM_BOOL_F) + && scm_is_false (scm_call_1 (type, val))) { - SCM typefunc = ly_lily_module_constant ("type-name"); - SCM type_name = scm_call_1 (typefunc, type); - + SCM type_name = Lily::type_name (type); + warning (_f ("type check for `%s' failed; value `%s' must be of type `%s'", ly_symbol2string (sym).c_str (), print_scm_val (val), @@ -449,6 +449,23 @@ type_check_assignment (SCM sym, SCM val, SCM type_symbol) return true; } +void +ly_wrong_smob_arg (bool pred (SCM), SCM var, int number, const char *fun) +{ + string type = predicate_to_typename ((void *) pred); + if (pred (var)) + { + // Uh oh. unsmob delivered 0, yet + // unsmob delivers true. This means that unsmob is a + // matching check from a base class of T, but var is of an + // incompatible derived type. + type = string (_ ("Wrong kind of ")).append (type); + } + scm_wrong_type_arg_msg (mangle_cxx_identifier (fun).c_str (), + number, var, type.c_str ()); +} + + /* some SCM abbrevs zijn deze nou handig? @@ -512,6 +529,18 @@ display_list (SCM s) return SCM_UNSPECIFIED; } +// Needed as complement to int_list_to_slice since scm_c_memq refuses +// to work with dotted lists. + +SCM +ly_memv (SCM v, SCM l) +{ + for (; scm_is_pair (l); l = scm_cdr (l)) + if (scm_is_true (scm_eqv_p (v, scm_car (l)))) + return l; + return SCM_BOOL_F; +} + Slice int_list_to_slice (SCM l) { @@ -564,7 +593,7 @@ robust_scm2string (SCM k, const string &s) int robust_scm2int (SCM k, int o) { - if (scm_integer_p (k) == SCM_BOOL_T) + if (scm_is_integer (k)) o = scm_to_int (k); return o; } @@ -572,7 +601,7 @@ robust_scm2int (SCM k, int o) vsize robust_scm2vsize (SCM k, vsize o) { - if (scm_integer_p (k) == SCM_BOOL_T) + if (scm_is_integer (k)) { int i = scm_to_int (k); if (i >= 0) @@ -655,8 +684,7 @@ alist_to_hashq (SCM alist) SCM ly_hash2alist (SCM tab) { - SCM func = ly_lily_module_constant ("hash-table->alist"); - return scm_call_1 (func, tab); + return Lily::hash_table_to_alist (tab); } /* diff --git a/lily/lily-imports.cc b/lily/lily-imports.cc new file mode 100644 index 0000000000..62e58b603c --- /dev/null +++ b/lily/lily-imports.cc @@ -0,0 +1,136 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2015 by David Kastrup + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#include "lily-imports.hh" + +namespace Guile_user { + Scm_module module ("guile-user"); + + Variable apply ("apply"); + Variable plus ("+"); + Variable make_module ("make-module"); +#if GUILEV2 + Variable module_export_all_x ("module-export-all!"); +#endif + Variable module_export_x ("module-export!"); + Variable module_public_interface ("module-public-interface"); + Variable module_use_x ("module-use!"); + Variable symbol_p ("symbol?"); + Variable the_root_module ("the-root-module"); +} + +namespace Display { + Scm_module module ("scm display-lily"); + + Variable value_to_lily_string ("value->lily-string"); +} + +namespace Lily { + Scm_module module ("lily"); + + Variable all_music_font_encodings ("all-music-font-encodings"); + Variable alterations_in_key ("alterations-in-key"); + Variable backend_testing ("backend-testing"); + Variable base_length ("base-length"); + Variable beam_exceptions ("beam-exceptions"); + Variable beat_structure ("beat-structure"); + Variable calc_repeat_slash_count ("calc-repeat-slash-count"); + Variable car_less ("car<"); + Variable chordmodifiers ("chordmodifiers"); + Variable construct_chord_elements ("construct-chord-elements"); + Variable default_time_signature_settings ("default-time-signature-settings"); + Variable drum_pitch_names ("drumPitchNames"); + Variable grob_compose_function ("grob::compose-function"); + Variable grob_offset_function ("grob::offset-function"); + Variable hash_table_to_alist ("hash-table->alist"); + Variable interpret_markup_list ("interpret-markup-list"); + Variable invalidate_alterations ("invalidate-alterations"); + Variable key_p ("key?"); + Variable key_list_p ("key-list?"); + Variable key_signature_interface_alteration_positions ("key-signature-interface::alteration-positions"); + Variable layout_extract_page_properties ("layout-extract-page-properties"); + Variable lilypond_main ("lilypond-main"); + Variable line_markup ("line-markup"); + Variable f_location ("%location"); + Variable lookup_font ("lookup-font"); + Variable lookup_markup_command ("lookup-markup-command"); + Variable lookup_markup_list_command ("lookup-markup-list-command"); + Variable ly_context_find ("ly:context-find"); + Variable ly_context_set_property_x ("ly:context-set-property!"); + Variable ly_event_p ("ly:event?"); + Variable ly_make_event_class ("ly:make-event-class"); + Variable ly_music_p ("ly:music?"); + Variable make_music ("make-music"); + Variable make_safe_lilypond_module ("make-safe-lilypond-module"); + Variable make_span_event ("make-span-event"); + Variable markup_p ("markup?"); + Variable markup_list_p ("markup-list?"); + Variable midi_program ("midi-program"); +#if !GUILEV2 + Variable module_export_all_x ("module-export-all!"); +#endif + Variable f_parser ("%parser"); + Variable percussion_p ("percussion?"); + Variable pitchnames ("pitchnames"); + Variable pure_chain_offset_callback ("pure-chain-offset-callback"); + Variable remove_stencil_warnings ("remove-stencil-warnings"); + Variable scale_layout ("scale-layout"); + Variable scm_to_string ("scm->string"); + Variable score_lines_markup_list ("score-lines-markup-list"); + Variable score_markup ("score-markup"); + Variable scorify_music ("scorify-music"); + Variable span_bar_notify_grobs_of_my_existence ("span-bar::notify-grobs-of-my-existence"); + Variable stencil_whiteout ("stencil-whiteout"); + Variable symbol_list_p ("symbol-list?"); + Variable tremolo_get_music_list ("tremolo::get-music-list"); + Variable type_name ("type-name"); + Variable volta_bracket_calc_hook_visibility ("volta-bracket::calc-hook-visibility"); + Variable write_performances_midis ("write-performances-midis"); +} + +namespace Syntax { + Scm_module module ("scm ly-syntax-constructors"); + + Variable add_lyrics ("add-lyrics"); + Variable argument_error ("argument-error"); + Variable composed_markup_list ("composed-markup-list"); + Variable context_change ("context-change"); + Variable context_specification ("context-specification"); + Variable event_chord ("event-chord"); + Variable lyric_combine ("lyric-combine"); + Variable lyric_event ("lyric-event"); + Variable multi_measure_rest ("multi-measure-rest"); + Variable music_function ("music-function"); + Variable music_function_call_error ("music-function-call-error"); + Variable partial_markup ("partial-markup"); + Variable partial_music_function ("partial-music-function"); + Variable property_override ("property-override"); + Variable property_override_function ("property-override-function"); + Variable property_revert ("property-revert"); + Variable property_set ("property-set"); + Variable property_set_function ("property-set-function"); + Variable property_unset ("property-unset"); + Variable repeat ("repeat"); + Variable repetition_chord ("repetition-chord"); + Variable sequential_music ("sequential-music"); + Variable simultaneous_music ("simultaneous-music"); + Variable tempo ("tempo"); + Variable unrelativable_music ("unrelativable-music"); + Variable void_music ("void-music"); +} diff --git a/lily/lily-lexer-scheme.cc b/lily/lily-lexer-scheme.cc index 3cc187d39c..6ce3f7b90d 100644 --- a/lily/lily-lexer-scheme.cc +++ b/lily/lily-lexer-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -27,6 +27,6 @@ LY_DEFINE (ly_lexer_keywords, "ly:lexer-keywords", { LY_ASSERT_SMOB (Lily_lexer, lexer, 1); - Lily_lexer *lex = Lily_lexer::unsmob (lexer); + Lily_lexer *lex = unsmob (lexer); return lex->keyword_list (); } diff --git a/lily/lily-lexer.cc b/lily/lily-lexer.cc index c72ff8fc12..6db0e653e5 100644 --- a/lily/lily-lexer.cc +++ b/lily/lily-lexer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,6 +35,7 @@ using namespace std; #include "warn.hh" #include "program-option.hh" #include "lily-parser.hh" +#include "ly-module.hh" static Keyword_ent the_key_tab[] = @@ -56,6 +57,7 @@ static Keyword_ent the_key_tab[] {"description", DESCRIPTION}, {"drummode", DRUMMODE}, {"drums", DRUMS}, + {"etc", ETC}, {"figuremode", FIGUREMODE}, {"figures", FIGURES}, {"header", HEADER}, @@ -123,8 +125,8 @@ Lily_lexer::Lily_lexer (Lily_lexer const &src, Lily_parser *parser, main_input_level_ = 0; extra_tokens_ = SCM_EOL; - if (unsmob_input (override_input)) - override_input_ = *unsmob_input (override_input); + if (unsmob (override_input)) + override_input_ = *unsmob (override_input); smobify_self (); @@ -193,7 +195,7 @@ Lily_lexer::keyword_list () const SCM *tail = &l; for (vsize i = 0; i < keytable_->table_.size (); i++) { - *tail = scm_acons (scm_from_locale_string (keytable_->table_[i].name_), + *tail = scm_acons (scm_from_utf8_string (keytable_->table_[i].name_), scm_from_int (keytable_->table_[i].tokcode_), SCM_EOL); @@ -209,7 +211,7 @@ Lily_lexer::lookup_identifier_symbol (SCM sym) for (SCM s = scopes_; scm_is_pair (s); s = scm_cdr (s)) { SCM var = ly_module_lookup (scm_car (s), sym); - if (var != SCM_BOOL_F) + if (scm_is_true (var)) return scm_variable_ref (var); } @@ -281,8 +283,10 @@ Lily_lexer::set_identifier (SCM path, SCM val) if (scm_is_pair (path)) { SCM prev = ly_module_lookup (mod, sym); - if (prev != SCM_BOOL_F) + if (scm_is_true (prev)) val = nested_property_alist (scm_variable_ref (prev), path, val); + else + val = nested_create_alist (path, val); } scm_module_define (mod, sym, val); } @@ -299,7 +303,7 @@ Lily_lexer::LexerError (char const *s) { error_level_ |= 1; Input spot (*lexloc_); - spot.error (s); + spot.non_fatal_error (s); } } @@ -364,35 +368,28 @@ Lily_lexer::add_lexed_char (int count) char_count_stack_.back () += count; } -#include "ly-smobs.icc" -IMPLEMENT_SMOBS (Lily_lexer); -IMPLEMENT_TYPE_P (Lily_lexer, "ly:lily-lexer?"); -IMPLEMENT_DEFAULT_EQUAL_P (Lily_lexer); +const char * const Lily_lexer::type_p_name_ = "ly:lily-lexer?"; SCM -Lily_lexer::mark_smob (SCM s) +Lily_lexer::mark_smob () const { - ASSERT_LIVE_IS_ALLOWED (s); - - Lily_lexer *lexer = (Lily_lexer *) SCM_CELL_WORD_1 (s); - - scm_gc_mark (lexer->chordmodifier_tab_); - if (lexer->parser_) - scm_gc_mark (lexer->parser_->self_scm ()); - scm_gc_mark (lexer->pitchname_tab_stack_); - scm_gc_mark (lexer->start_module_); - scm_gc_mark (lexer->extra_tokens_); - return lexer->scopes_; + ASSERT_LIVE_IS_ALLOWED (self_scm ()); + + scm_gc_mark (chordmodifier_tab_); + if (parser_) + scm_gc_mark (parser_->self_scm ()); + scm_gc_mark (pitchname_tab_stack_); + scm_gc_mark (start_module_); + scm_gc_mark (extra_tokens_); + return scopes_; } int -Lily_lexer::print_smob (SCM s, SCM port, scm_print_state *) +Lily_lexer::print_smob (SCM port, scm_print_state *) const { - Lily_lexer *lexer = Lily_lexer::unsmob (s); - scm_puts ("#scopes_, port); + scm_display (scopes_, port); scm_puts (" >", port); return 1; } diff --git a/lily/lily-modules.cc b/lily/lily-modules.cc new file mode 100644 index 0000000000..5d35018e72 --- /dev/null +++ b/lily/lily-modules.cc @@ -0,0 +1,129 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2015 by David Kastrup + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#include "lily-modules.hh" +#include "international.hh" +#include "lily-imports.hh" +#include "warn.hh" + +struct Scm_module::Variable_record +{ + const char *name_; + Scm_variable *var_; + Variable_record *next_; + Variable_record (const char *name, Scm_variable *var, Variable_record *next_) + : name_ (name), var_ (var), next_ (next_) + { } +}; + +void +Scm_module::register_variable (const char *name, Scm_variable *var) +{ + variables_ = new Variable_record (name, var, variables_); +} + +Scm_module::Scm_module (const char *name) + : name_ (name), module_ (SCM_UNDEFINED), variables_ (0) +{ +} + +void +Scm_module::boot_init (void *arg) +{ + Scm_module *self = static_cast (arg); + + // Establish variables + for (Variable_record *p = self->variables_; p; p = p->next_) + p->var_->boot (p->name_); +} + +static SCM +call_trampoline (void *self) +{ + // One more indirection since void * can only be safely cast to + // pointers to data rather than pointers to function. + (*static_cast (self)) (); + return SCM_UNDEFINED; +} + +void +Scm_module::boot (void (*init) ()) +{ + assert (SCM_UNBNDP (module_)); + module_ = scm_c_define_module (name_, boot_init, static_cast (this)); + // Can't wrap the following in the scm_c_define_module call since + // the init code may need module_ operative. + if (init) + scm_c_call_with_current_module (module_, call_trampoline, static_cast (&init)); + // Verify that every Variable has a definition, either because of + // getting initialized with a value at definition or because of the + // init call providing one. + for (Variable_record *p = variables_; p; ) + { + Variable_record *next = p->next_; + if (SCM_UNBNDP (*p->var_)) + error (_f ("Uninitialized variable `%s' in module (%s)", p->name_, name_)); + delete p; + p = next; + } + variables_ = 0; +} + +void +Scm_module::import () +{ + assert (SCM_UNBNDP (module_)); + SCM intrface = scm_c_resolve_module (name_); + // Using only the public interface is a voluntary form of access + // control in GUILE. It would be cumbersome to do so until + // Guile_user itself is imported. + if (SCM_MODULEP (Guile_user::module.module_)) + intrface = Guile_user::module_public_interface (intrface); + for (Variable_record *p = variables_; p;) + { + Variable_record *next = p->next_; + p->var_->import (intrface, p->name_); + delete p; + p = next; + } + variables_ = 0; + module_ = intrface; +} + +void +Scm_variable::boot (const char *name) +{ + assert (!SCM_VARIABLEP (var_)); + var_ = scm_c_define (name, var_); +} + +void +Scm_variable::import (SCM module, const char *name) +{ + assert (SCM_UNBNDP (var_)); + var_ = scm_c_module_lookup (module, name); +} + + +Scm_variable::Scm_variable (Scm_module &m, const char *name, SCM value) + : var_ (value) +{ + assert (SCM_IMP (value)); + m.register_variable (name, this); +} diff --git a/lily/lily-parser-scheme.cc b/lily/lily-parser-scheme.cc index 74d3feb653..ea84aae41a 100644 --- a/lily/lily-parser-scheme.cc +++ b/lily/lily-parser-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,11 +26,11 @@ #include "file-path.hh" #include "international.hh" #include "lily-lexer.hh" -#include "ly-module.hh" #include "main.hh" #include "program-option.hh" #include "sources.hh" #include "warn.hh" +#include "lily-imports.hh" LY_DEFINE (ly_parse_file, "ly:parse-file", 1, 0, 0, (SCM name), @@ -50,8 +50,8 @@ LY_DEFINE (ly_parse_file, "ly:parse-file", out_file_name.ext_ = ""; out_file_name.root_ = ""; - if (ly_get_option (ly_symbol2scm ("gui")) != SCM_BOOL_T - && ly_get_option (ly_symbol2scm ("strip-output-dir")) == SCM_BOOL_T) + if (!to_boolean (ly_get_option (ly_symbol2scm ("gui"))) + && to_boolean (ly_get_option (ly_symbol2scm ("strip-output-dir")))) { out_file_name.dir_ = ""; } @@ -138,59 +138,60 @@ LY_DEFINE (ly_parse_file, "ly:parse-file", } LY_DEFINE (ly_parser_lexer, "ly:parser-lexer", - 1, 0, 0, (SCM parser_smob), - "Return the lexer for @var{parser-smob}.") + 0, 1, 0, (SCM parser), + "Return the lexer for @var{parser}, defaulting to current parser") { - Lily_parser *parser = unsmob_lily_parser (parser_smob); - return parser->lexer_->self_scm (); + if (SCM_UNBNDP (parser)) + parser = scm_fluid_ref (Lily::f_parser); + Lily_parser *p = LY_ASSERT_SMOB (Lily_parser, parser, 1); + return p->lexer_->self_scm (); } LY_DEFINE (ly_parser_clone, "ly:parser-clone", - 1, 2, 0, (SCM parser_smob, SCM closures, SCM location), - "Return a clone of @var{parser-smob}. An association list" + 0, 2, 0, (SCM closures, SCM location), + "Return a clone of current parser. An association list" " of port positions to closures can be specified in @var{closures}" " in order to have @code{$} and @code{#} interpreted in their original" " lexical environment. If @var{location} is a valid location," " it becomes the source of all music expressions inside.") { - LY_ASSERT_SMOB (Lily_parser, parser_smob, 1); - Lily_parser *parser = unsmob_lily_parser (parser_smob); + SCM parser = scm_fluid_ref (Lily::f_parser); + Lily_parser *p = LY_ASSERT_SMOB (Lily_parser, parser, 0); + if (SCM_UNBNDP (closures)) closures = SCM_EOL; else LY_ASSERT_TYPE (ly_is_list, closures, 2); - Lily_parser *clone = new Lily_parser (*parser, closures, location); + Lily_parser *clone = new Lily_parser (*p, closures, location); return clone->unprotect (); } LY_DEFINE (ly_parser_define_x, "ly:parser-define!", - 3, 0, 0, (SCM parser_smob, SCM symbol, SCM val), - "Bind @var{symbol} to @var{val} in @var{parser-smob}'s module.") + 2, 0, 0, (SCM symbol, SCM val), + "Bind @var{symbol} to @var{val} in current parser's module.") { + SCM parser = scm_fluid_ref (Lily::f_parser); + Lily_parser *p = LY_ASSERT_SMOB (Lily_parser, parser, 0); - LY_ASSERT_SMOB (Lily_parser, parser_smob, 1); - Lily_parser *parser = unsmob_lily_parser (parser_smob); - - LY_ASSERT_TYPE (ly_is_symbol, symbol, 2); + LY_ASSERT_TYPE (ly_is_symbol, symbol, 1); - parser->lexer_->set_identifier (scm_symbol_to_string (symbol), val); + p->lexer_->set_identifier (scm_symbol_to_string (symbol), val); return SCM_UNSPECIFIED; } LY_DEFINE (ly_parser_lookup, "ly:parser-lookup", - 2, 0, 0, (SCM parser_smob, SCM symbol), - "Look up @var{symbol} in @var{parser-smob}'s module." + 1, 0, 0, (SCM symbol), + "Look up @var{symbol} in current parser's module." " Return @code{'()} if not defined.") { - LY_ASSERT_SMOB (Lily_parser, parser_smob, 1); - - Lily_parser *parser = unsmob_lily_parser (parser_smob); + SCM parser = scm_fluid_ref (Lily::f_parser); + Lily_parser *p = LY_ASSERT_SMOB (Lily_parser, parser, 0); - LY_ASSERT_TYPE (ly_is_symbol, symbol, 2); + LY_ASSERT_TYPE (ly_is_symbol, symbol, 1); - SCM val = parser->lexer_->lookup_identifier (ly_symbol2string (symbol)); - if (val != SCM_UNDEFINED) + SCM val = p->lexer_->lookup_identifier (ly_symbol2string (symbol)); + if (!SCM_UNBNDP (val)) return val; else return SCM_EOL; @@ -202,7 +203,7 @@ LY_DEFINE (ly_parser_parse_string, "ly:parser-parse-string", " Upon failure, throw @code{ly-file-failed} key.") { LY_ASSERT_SMOB (Lily_parser, parser_smob, 1); - Lily_parser *parser = unsmob_lily_parser (parser_smob); + Lily_parser *parser = unsmob (parser_smob); LY_ASSERT_TYPE (scm_is_string, ly_code, 2); if (!parser->lexer_->is_clean ()) @@ -222,7 +223,7 @@ LY_DEFINE (ly_parse_string_expression, "ly:parse-string-expression", " @var{filename} and @var{line} are optional source indicators.") { LY_ASSERT_SMOB (Lily_parser, parser_smob, 1); - Lily_parser *parser = unsmob_lily_parser (parser_smob); + Lily_parser *parser = unsmob (parser_smob); LY_ASSERT_TYPE (scm_is_string, ly_code, 2); string fn; if (SCM_UNBNDP (filename) || !scm_is_string (filename)) @@ -247,28 +248,29 @@ LY_DEFINE (ly_parse_string_expression, "ly:parse-string-expression", } LY_DEFINE (ly_parser_include_string, "ly:parser-include-string", - 2, 0, 0, (SCM parser_smob, SCM ly_code), + 1, 0, 0, (SCM ly_code), "Include the string @var{ly-code} into the input stream" - " for @var{parser-smob}. Can only be used in immediate" + " for current parser. Can only be used in immediate" " Scheme expressions (@code{$} instead of @code{#}).") { - LY_ASSERT_SMOB (Lily_parser, parser_smob, 1); - Lily_parser *parser = unsmob_lily_parser (parser_smob); - LY_ASSERT_TYPE (scm_is_string, ly_code, 2); + SCM parser = scm_fluid_ref (Lily::f_parser); + Lily_parser *p = LY_ASSERT_SMOB (Lily_parser, parser, 0); - parser->include_string (ly_scm2string (ly_code)); + LY_ASSERT_TYPE (scm_is_string, ly_code, 1); + + p->include_string (ly_scm2string (ly_code)); return SCM_UNSPECIFIED; } LY_DEFINE (ly_parser_set_note_names, "ly:parser-set-note-names", - 2, 0, 0, (SCM parser, SCM names), - "Replace current note names in @var{parser}." + 1, 0, 0, (SCM names), + "Replace current note names in parser." " @var{names} is an alist of symbols. This only has effect" " if the current mode is notes.") { - LY_ASSERT_SMOB (Lily_parser, parser, 1); - Lily_parser *p = unsmob_lily_parser (parser); + SCM parser = scm_fluid_ref (Lily::f_parser); + Lily_parser *p = LY_ASSERT_SMOB (Lily_parser, parser, 0); if (p->lexer_->is_note_state ()) { @@ -280,40 +282,55 @@ LY_DEFINE (ly_parser_set_note_names, "ly:parser-set-note-names", } LY_DEFINE (ly_parser_output_name, "ly:parser-output-name", - 1, 0, 0, (SCM parser), - "Return the base name of the output file.") + 0, 1, 0, (SCM parser), + "Return the base name of the output file. If @code{parser} is left off, use currently active parser.") { - LY_ASSERT_SMOB (Lily_parser, parser, 1); - Lily_parser *p = unsmob_lily_parser (parser); + if (SCM_UNBNDP (parser)) + parser = scm_fluid_ref (Lily::f_parser); + + Lily_parser *p = LY_ASSERT_SMOB (Lily_parser, parser, 1); return ly_string2scm (p->output_basename_); } LY_DEFINE (ly_parser_error, "ly:parser-error", - 2, 1, 0, (SCM parser, SCM msg, SCM input), - "Display an error message and make the parser fail.") + 1, 1, 0, (SCM msg, SCM input), + "Display an error message and make current parser fail." + " Without a current parser, trigger an ordinary error.") { - LY_ASSERT_SMOB (Lily_parser, parser, 1); - Lily_parser *p = unsmob_lily_parser (parser); + SCM parser = scm_fluid_ref (Lily::f_parser); - LY_ASSERT_TYPE (scm_is_string, msg, 2); + Lily_parser *p = unsmob (parser); + + LY_ASSERT_TYPE (scm_is_string, msg, 1); string s = ly_scm2string (msg); - Input *i = unsmob_input (input); - if (i) - p->parser_error (*i, s); + Input *i = unsmob (input); + if (p) + { + if (i) + p->parser_error (*i, s); + else + p->parser_error (s); + } else - p->parser_error (s); - - return parser; + { + if (i) + i->non_fatal_error (s); + else + scm_misc_error ("ly:parser-error", "~A", scm_list_1 (msg)); + } + return SCM_UNSPECIFIED; } LY_DEFINE (ly_parser_clear_error, "ly:parser-clear-error", - 1, 0, 0, (SCM parser), - "Clear the error flag for the parser.") + 0, 1, 0, (SCM parser), + "Clear error flag for @var{parser}, defaulting to current parser.") { - LY_ASSERT_SMOB (Lily_parser, parser, 1); - Lily_parser *p = unsmob_lily_parser (parser); + if (SCM_UNBNDP (parser)) + parser = scm_fluid_ref (Lily::f_parser); + + Lily_parser *p = LY_ASSERT_SMOB (Lily_parser, parser, 1); p->error_level_ = 0; p->lexer_->error_level_ = 0; @@ -322,11 +339,12 @@ LY_DEFINE (ly_parser_clear_error, "ly:parser-clear-error", } LY_DEFINE (ly_parser_has_error_p, "ly:parser-has-error?", - 1, 0, 0, (SCM parser), - "Does @var{parser} have an error flag?") + 0, 1, 0, (SCM parser), + "Does @var{parser} (defaulting to current parser) have an error flag?") { - LY_ASSERT_SMOB (Lily_parser, parser, 1); - Lily_parser *p = unsmob_lily_parser (parser); + if (SCM_UNBNDP (parser)) + parser = scm_fluid_ref (Lily::f_parser); + Lily_parser *p = LY_ASSERT_SMOB (Lily_parser, parser, 1); return scm_from_bool (p->error_level_ || p->lexer_->error_level_); } diff --git a/lily/lily-parser.cc b/lily/lily-parser.cc index cd7819e9c8..d2499d4c41 100644 --- a/lily/lily-parser.cc +++ b/lily/lily-parser.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -37,13 +37,13 @@ #include "warn.hh" #include "program-option.hh" -#include "ly-smobs.icc" Lily_parser::Lily_parser (Sources *sources) { lexer_ = 0; sources_ = sources; default_duration_ = Duration (2, 0); + default_tremolo_type_ = 8; error_level_ = 0; closures_ = SCM_EOL; @@ -54,10 +54,12 @@ Lily_parser::Lily_parser (Sources *sources) } Lily_parser::Lily_parser (Lily_parser const &src, SCM closures, SCM location) + : Smob () { lexer_ = 0; sources_ = src.sources_; default_duration_ = src.default_duration_; + default_tremolo_type_ = src.default_tremolo_type_; error_level_ = 0; output_basename_ = src.output_basename_; closures_ = closures; @@ -75,20 +77,18 @@ Lily_parser::~Lily_parser () } SCM -Lily_parser::mark_smob (SCM s) +Lily_parser::mark_smob () const { - Lily_parser *parser = (Lily_parser *) SCM_CELL_WORD_1 (s); - scm_gc_mark (parser->closures_); - return (parser->lexer_) ? parser->lexer_->self_scm () : SCM_EOL; + scm_gc_mark (closures_); + return (lexer_) ? lexer_->self_scm () : SCM_EOL; } int -Lily_parser::print_smob (SCM s, SCM port, scm_print_state *) +Lily_parser::print_smob (SCM port, scm_print_state *) const { scm_puts ("#lexer_) - scm_display (parser->lexer_->self_scm (), port); + if (lexer_) + scm_display (lexer_->self_scm (), port); else scm_puts ("(no lexer yet)", port); scm_puts (" >", port); @@ -99,7 +99,6 @@ Lily_parser::print_smob (SCM s, SCM port, scm_print_state *) void Lily_parser::parse_file (const string &init, const string &name, const string &out_name) { - lexer_->set_identifier (ly_symbol2scm ("parser"), self_scm ()); output_basename_ = out_name; lexer_->main_input_name_ = name; @@ -125,11 +124,6 @@ Lily_parser::parse_file (const string &init, const string &name, const string &o } while (!lexer_->is_clean ()); - /* - Don't mix cyclic pointers with weak tables. - */ - lexer_->set_identifier (ly_symbol2scm ("parser"), - SCM_EOL); ly_reexport_module (scm_current_module ()); scm_set_current_module (mod); @@ -145,10 +139,9 @@ Lily_parser::parse_string (const string &ly_code) lexer_->new_input (lexer_->main_input_name_, ly_code, sources_); SCM mod = lexer_->set_current_scope (); - SCM parser = lexer_->lookup_identifier_symbol (ly_symbol2scm ("parser")); - lexer_->set_identifier (ly_symbol2scm ("parser"), self_scm ()); + do_yyparse (); - lexer_->set_identifier (ly_symbol2scm ("parser"), parser); + scm_set_current_module (mod); error_level_ = error_level_ | lexer_->error_level_; @@ -165,12 +158,10 @@ Lily_parser::parse_string_expression (const string &ly_code, const string &filen lexer_->get_source_file ()->set_line (0, line); } SCM mod = lexer_->set_current_scope (); - SCM parser = lexer_->lookup_identifier_symbol (ly_symbol2scm ("parser")); - lexer_->set_identifier (ly_symbol2scm ("parser"), self_scm ()); - lexer_->push_extra_token (EMBEDDED_LILY); + + lexer_->push_extra_token (Input (), EMBEDDED_LILY); SCM result = do_yyparse (); - lexer_->set_identifier (ly_symbol2scm ("parser"), parser); scm_set_current_module (mod); error_level_ = error_level_ | lexer_->error_level_; @@ -195,29 +186,21 @@ Lily_parser::clear () lexer_ = 0; } -char const * -Lily_parser::here_str0 () const -{ - return lexer_->here_str0 (); -} - void Lily_parser::parser_error (const string &s) { - lexer_->here_input ().error (_ (s.c_str ())); + lexer_->here_input ().non_fatal_error (_ (s.c_str ())); error_level_ = 1; } void Lily_parser::parser_error (Input const &i, const string &s) { - i.error (s); + i.non_fatal_error (s); error_level_ = 1; } -IMPLEMENT_SMOBS (Lily_parser); -IMPLEMENT_TYPE_P (Lily_parser, "ly:lily-parser?"); -IMPLEMENT_DEFAULT_EQUAL_P (Lily_parser); +const char * const Lily_parser::type_p_name_ = "ly:lily-parser?"; /**************************************************************** OUTPUT-DEF @@ -227,7 +210,7 @@ Output_def * get_layout (Lily_parser *parser) { SCM id = parser->lexer_->lookup_identifier ("$defaultlayout"); - Output_def *layout = unsmob_output_def (id); + Output_def *layout = unsmob (id); layout = layout ? layout->clone () : new Output_def; layout->set_variable (ly_symbol2scm ("is-layout"), SCM_BOOL_T); @@ -238,7 +221,7 @@ Output_def * get_midi (Lily_parser *parser) { SCM id = parser->lexer_->lookup_identifier ("$defaultmidi"); - Output_def *layout = unsmob_output_def (id); + Output_def *layout = unsmob (id); layout = layout ? layout->clone () : new Output_def; layout->set_variable (ly_symbol2scm ("is-midi"), SCM_BOOL_T); return layout; @@ -250,10 +233,10 @@ Output_def * get_paper (Lily_parser *parser) { SCM papers = parser->lexer_->lookup_identifier ("$papers"); - Output_def *layout = ((papers == SCM_UNDEFINED) || scm_is_null (papers)) - ? 0 : unsmob_output_def (scm_car (papers)); + Output_def *layout = (SCM_UNBNDP (papers) || scm_is_null (papers)) + ? 0 : unsmob (scm_car (papers)); SCM default_paper = parser->lexer_->lookup_identifier ("$defaultpaper"); - layout = layout ? layout : unsmob_output_def (default_paper); + layout = layout ? layout : unsmob (default_paper); layout = layout ? dynamic_cast (layout->clone ()) : new Output_def; layout->set_variable (ly_symbol2scm ("is-paper"), SCM_BOOL_T); diff --git a/lily/lily-version.cc b/lily/lily-version.cc index 99e9b7df4c..f84730450f 100644 --- a/lily/lily-version.cc +++ b/lily/lily-version.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Jan Nieuwenhuizen + Copyright (C) 1999--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/lilypond-version.cc b/lily/lilypond-version.cc index 9c6d2130a3..b3401854c2 100644 --- a/lily/lilypond-version.cc +++ b/lily/lilypond-version.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,38 +32,60 @@ Lilypond_version::Lilypond_version (int major, int minor, int patch) Lilypond_version::Lilypond_version (const string &str) { - major_ = 0; + major_ = -1; minor_ = 0; patch_ = 0; vector version; + const char *digits = "0123456789"; version = string_split (str, '.'); - if (version.size () > 0 && isdigit (version[0][0])) - major_ = String_convert::dec2int (version[0]); - if (version.size () > 1 && isdigit (version[1][0])) - minor_ = String_convert::dec2int (version[1]); - - patch_ = 0; - if (version.size () >= 3 - && isdigit (version[2][0])) - patch_ = String_convert::dec2int (version[2]); - - if (version.size () >= 4) + switch (version.size ()) { + case 4: extra_patch_string_ = version[3]; + if (version[2].empty ()) + return; + case 3: + if (version[2].find_first_not_of (digits) != string::npos + || version[1].empty ()) + return; + patch_ = String_convert::dec2int (version[2]); + case 2: + if (version[1].find_first_not_of (digits) != string::npos + || version[1].empty () || version[0].empty ()) + return; + minor_ = String_convert::dec2int (version[1]); + if (version[0].find_first_not_of (digits) != string::npos) + return; + major_ = String_convert::dec2int (version[0]); + } } string Lilypond_version::to_string () const { + if (major_ < 0) + return "invalid"; return ::to_string (major_) + "." + ::to_string (minor_) + "." + ::to_string (patch_); } -Lilypond_version::operator int () const +Lilypond_version::operator bool () const { - // ugh - return 100000 * major_ + 1000 * minor_ + patch_; + return !(major_ < 0); } +int +Lilypond_version::compare (const Lilypond_version &a, const Lilypond_version &b) +{ + if (!a || !b) + return 0; + if (a.major_ != b.major_) + return a.major_ > b.major_ ? 1 : -1; + if (a.minor_ != b.minor_) + return a.minor_ > b.minor_ ? 1 : -1; + if (a.patch_ != b.patch_) + return a.patch_ > b.patch_ ? 1 : -1; + return 0; +} diff --git a/lily/lilypond.rc.in b/lily/lilypond.rc.in index 4045c65a29..489a2d76b8 100644 --- a/lily/lilypond.rc.in +++ b/lily/lilypond.rc.in @@ -20,7 +20,7 @@ VS_VERSION_INFO VERSIONINFO VALUE "FileDescription", "LilyPond" VALUE "FileVersion", "@MAJOR_VERSION@.@MINOR_VERSION@.@PATCH_LEVEL@.@BUILD_VERSION@" VALUE "InternalName", "LilyPond@" - VALUE "LegalCopyright ", "Copyright (C) 1995--2012 Han-Wen Nienhuys and Jan Nieuwenhuizen, and others." + VALUE "LegalCopyright ", "Copyright (C) 1995--2015 Han-Wen Nienhuys and Jan Nieuwenhuizen, and others." VALUE "OriginalFilename", "lilypond.exe" VALUE "ProductName", "LilyPond" VALUE "ProductVersion", "@MAJOR_VERSION@.@MINOR_VERSION@.@PATCH_LEVEL@" diff --git a/lily/line-interface-scheme.cc b/lily/line-interface-scheme.cc new file mode 100644 index 0000000000..dee6a15d15 --- /dev/null +++ b/lily/line-interface-scheme.cc @@ -0,0 +1,44 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2010--2015 Han-Wen Nienhuys + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#include "line-interface.hh" + +#include "stencil.hh" +#include "grob.hh" + +LY_DEFINE (ly_line_interface__line, "ly:line-interface::line", + 5, 0, 0, (SCM grob, SCM startx, SCM starty, SCM endx, SCM endy), + "Make a line using layout information from grob @var{grob}.") +{ + LY_ASSERT_SMOB (Grob, grob, 1); + + Grob *me = unsmob (grob); + + LY_ASSERT_TYPE (scm_is_number, startx, 2); + LY_ASSERT_TYPE (scm_is_number, starty, 3); + LY_ASSERT_TYPE (scm_is_number, endx, 4); + LY_ASSERT_TYPE (scm_is_number, endy, 5); + + Offset from = Offset (scm_to_double (startx), scm_to_double (starty)); + Offset to = Offset (scm_to_double (endx), scm_to_double (endy)); + + Stencil stil = Line_interface::line (me, from, to); + + return stil.smobbed_copy (); +} diff --git a/lily/line-interface.cc b/lily/line-interface.cc index bc6099916a..f23b58e308 100644 --- a/lily/line-interface.cc +++ b/lily/line-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,7 @@ Line_interface::make_arrow (Offset begin, Offset end, Real thick, Real length, Real width) { - Real angle = (end - begin).arg (); + Offset dir = (end - begin).direction (); vector points; points.push_back (Offset (0, 0)); @@ -38,7 +38,7 @@ Line_interface::make_arrow (Offset begin, Offset end, points.push_back (Offset (-length, -width)); for (vsize i = 0; i < points.size (); i++) - points[i] = points[i] * complex_exp (Offset (0, angle)) + end; + points[i] = points[i] * dir + end; return Lookup::round_filled_polygon (points, thick); } @@ -95,7 +95,7 @@ Line_interface::make_zigzag_line (Grob *me, Real l = robust_scm2double (me->get_property ("zigzag-length"), 1) * w; Real h = l > w / 2 ? sqrt (l * l - w * w / 4) : 0; - Offset rotation_factor = complex_exp (Offset (0, dz.arg ())); + Offset rotation_factor = dz.direction (); Offset points[3]; points[0] = Offset (0, -h / 2); @@ -123,8 +123,8 @@ Line_interface::make_dashed_line (Real thick, Offset from, Offset to, Real dash_period, Real dash_fraction) { dash_fraction = min (max (dash_fraction, 0.0), 1.0); - Real on = dash_fraction * dash_period + thick; - Real off = max (0.0, dash_period - on); + Real on = dash_fraction * dash_period; + Real off = max (0.0, dash_period - on - thick); SCM at = scm_list_n (ly_symbol2scm ("dashed-line"), scm_from_double (thick), @@ -200,20 +200,21 @@ Line_interface::line (Grob *me, Offset from, Offset to) * robust_scm2double (me->get_property ("thickness"), 1); SCM type = me->get_property ("style"); - if (type == ly_symbol2scm ("zigzag")) + if (scm_is_eq (type, ly_symbol2scm ("zigzag"))) return make_zigzag_line (me, from, to); - else if (type == ly_symbol2scm ("trill")) + else if (scm_is_eq (type, ly_symbol2scm ("trill"))) return make_trill_line (me, from, to); - else if (type == ly_symbol2scm ("none")) + else if (scm_is_eq (type, ly_symbol2scm ("none"))) return Stencil (); Stencil stencil; - if (type == ly_symbol2scm ("dashed-line") || type == ly_symbol2scm ("dotted-line")) + if (scm_is_eq (type, ly_symbol2scm ("dashed-line")) + || scm_is_eq (type, ly_symbol2scm ("dotted-line"))) { Real fraction - = type == ly_symbol2scm ("dotted-line") + = scm_is_eq (type, ly_symbol2scm ("dotted-line")) ? 0.0 : robust_scm2double (me->get_property ("dash-fraction"), 0.4); diff --git a/lily/line-spanner.cc b/lily/line-spanner.cc index 6c5e627442..84c43ccf81 100644 --- a/lily/line-spanner.cc +++ b/lily/line-spanner.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,12 +43,11 @@ public: DECLARE_SCHEME_CALLBACK (calc_left_bound_info_and_text, (SCM)); DECLARE_SCHEME_CALLBACK (calc_right_bound_info, (SCM)); DECLARE_SCHEME_CALLBACK (calc_bound_info, (SCM, Direction)); - DECLARE_GROB_INTERFACE (); }; Spanner *parent_spanner (Grob *g) { - if (Spanner::has_interface (g)) + if (has_interface (g)) return dynamic_cast (g); return parent_spanner (g->get_parent (Y_AXIS)); } @@ -56,7 +55,7 @@ Spanner *parent_spanner (Grob *g) SCM Line_spanner::calc_bound_info (SCM smob, Direction dir) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Grob *commonx = me->get_bound (LEFT)->common_refpoint (me->get_bound (RIGHT), X_AXIS); commonx = me->common_refpoint (commonx, X_AXIS); @@ -64,7 +63,7 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir) SCM bound_details = me->get_property ("bound-details"); SCM details = SCM_BOOL_F; - if (details == SCM_BOOL_F) + if (scm_is_false (details)) details = ly_assoc_get ((dir == LEFT) ? ly_symbol2scm ("left") : ly_symbol2scm ("right"), bound_details, SCM_BOOL_F); @@ -78,7 +77,7 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir) details = scm_append (scm_list_2 (extra, details)); } - if (details == SCM_BOOL_F) + if (scm_is_false (details)) details = ly_assoc_get (ly_symbol2scm ("default"), bound_details, SCM_EOL); SCM text = ly_assoc_get (ly_symbol2scm ("text"), details, SCM_BOOL_F); @@ -110,14 +109,18 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir) ? columns[0] : columns.back (); } - Real x_coord = (Paper_column::has_interface (bound_grob) + Real x_coord = (has_interface (bound_grob) ? Axis_group_interface::generic_bound_extent (bound_grob, commonx, X_AXIS) : robust_relative_extent (bound_grob, commonx, X_AXIS)).linear_combination (attach); - Grob *acc = unsmob_grob (bound_grob->get_object ("accidental-grob")); + Grob *acc = unsmob (bound_grob->get_object ("accidental-grob")); if (acc && to_boolean (ly_assoc_get (ly_symbol2scm ("end-on-accidental"), details, SCM_BOOL_F))) x_coord = robust_relative_extent (acc, commonx, X_AXIS).linear_combination (attach); + Grob *dot = unsmob (bound_grob->get_object ("dot")); + if (dot && to_boolean (ly_assoc_get (ly_symbol2scm ("start-at-dot"), details, SCM_BOOL_F))) + x_coord = robust_relative_extent (dot, commonx, X_AXIS).linear_combination (attach); + details = scm_acons (ly_symbol2scm ("X"), scm_from_double (x_coord), details); @@ -165,7 +168,7 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir) VerticalAxisGroup of a staff) that extends over the break. */ Spanner *next_bound_parent_on_this_line - = next_bound_parent->broken_neighbor (other_dir (dir)); + = next_bound_parent->broken_neighbor (-dir); if (next_bound_parent_on_this_line) { @@ -206,7 +209,7 @@ MAKE_SCHEME_CALLBACK (Line_spanner, calc_cross_staff, 1); SCM Line_spanner::calc_cross_staff (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); if (!me) return SCM_BOOL_F; @@ -237,12 +240,12 @@ SCM Line_spanner::calc_left_bound_info_and_text (SCM smob) { SCM alist = Line_spanner::calc_bound_info (smob, LEFT); - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); SCM text = me->get_property ("text"); if (Text_interface::is_markup (text) && me->get_bound (LEFT)->break_status_dir () == CENTER - && ly_assoc_get (ly_symbol2scm ("stencil"), alist, SCM_BOOL_F) == SCM_BOOL_F) + && scm_is_false (ly_assoc_get (ly_symbol2scm ("stencil"), alist, SCM_BOOL_F))) { Output_def *layout = me->layout (); SCM properties = Font_interface::text_font_alist_chain (me); @@ -259,7 +262,7 @@ MAKE_SCHEME_CALLBACK (Line_spanner, print, 1); SCM Line_spanner::print (SCM smob) { - Spanner *me = dynamic_cast (unsmob_grob (smob)); + Spanner *me = unsmob (smob); // Triggers simple-Y calculations bool simple_y = to_boolean (me->get_property ("simple-Y")) && !to_boolean (me->get_property ("cross-staff")); @@ -297,9 +300,9 @@ Line_spanner::print (SCM smob) bounds[d], SCM_BOOL_F), 0.0); arrows[d] = to_boolean (ly_assoc_get (ly_symbol2scm ("arrow"), bounds[d], SCM_BOOL_F)); - stencils[d] = unsmob_stencil (ly_assoc_get (ly_symbol2scm ("stencil"), + stencils[d] = unsmob (ly_assoc_get (ly_symbol2scm ("stencil"), bounds[d], SCM_BOOL_F)); - common_y[d] = unsmob_grob (ly_assoc_get (ly_symbol2scm ("common-Y"), + common_y[d] = unsmob (ly_assoc_get (ly_symbol2scm ("common-Y"), bounds[d], SCM_BOOL_F)); if (!common_y[d]) common_y[d] = me; diff --git a/lily/listener.cc b/lily/listener.cc index c785ff3d72..836f8cdc6f 100644 --- a/lily/listener.cc +++ b/lily/listener.cc @@ -18,56 +18,5 @@ */ #include "listener.hh" -#include "ly-smobs.icc" -#include "warn.hh" -Listener::Listener () -{ - target_ = 0; - type_ = 0; -} - -Listener::Listener (const void *target, Listener_function_table *type) -{ - target_ = (void *)target; - type_ = type; -} - -Listener::Listener (Listener const &other) -{ - target_ = other.target_; - type_ = other.type_; -} - -void Listener::listen (SCM ev) const -{ - (type_->listen_callback) (target_, ev); -} - -SCM -Listener::mark_smob (SCM sm) -{ - Listener *me = (Listener *) SCM_CELL_WORD_1 (sm); - if (me->type_) - (me->type_->mark_callback) (me->target_); - return SCM_EOL; -} - -int -Listener::print_smob (SCM, SCM p, scm_print_state *) -{ - scm_puts ("#", p); - return 1; -} - -SCM -Listener::equal_p (SCM a, SCM b) -{ - Listener *l1 = unsmob_listener (a); - Listener *l2 = unsmob_listener (b); - - return (*l1 == *l2) ? SCM_BOOL_T : SCM_BOOL_F; -} - -IMPLEMENT_SIMPLE_SMOBS (Listener); -IMPLEMENT_TYPE_P (Listener, "ly:listener?"); +const char * const Listener::type_p_name_ = "ly:listener?"; diff --git a/lily/lookup.cc b/lily/lookup.cc index e903d5a9a4..3e592516c5 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen @@ -75,11 +75,10 @@ Lookup::beam (Real slope, Real width, Real thick, Real blot) scm_cons (scm_from_double (p[Y_AXIS]), points)); - SCM expr = scm_list_n (ly_symbol2scm ("polygon"), + SCM expr = scm_list_4 (ly_symbol2scm ("polygon"), ly_quote_scm (points), scm_from_double (blot), - SCM_BOOL_T, - SCM_UNDEFINED); + SCM_BOOL_T); return Stencil (b, expr); } @@ -88,11 +87,8 @@ Stencil Lookup::rotated_box (Real slope, Real width, Real thick, Real blot) { vector pts; - Offset rot (1, slope); + Offset rot = Offset (1, slope).direction (); - thick -= 2 * blot; - width -= 2 * blot; - rot /= sqrt (1 + slope * slope); pts.push_back (Offset (0, -thick / 2) * rot); pts.push_back (Offset (width, -thick / 2) * rot); pts.push_back (Offset (width, thick / 2) * rot); @@ -121,7 +117,7 @@ Lookup::horizontal_line (Interval w, Real th) Stencil Lookup::blank (Box b) { - return Stencil (b, scm_from_locale_string ("")); + return Stencil (b, scm_string (SCM_EOL)); } Stencil @@ -233,18 +229,26 @@ Lookup::round_filled_box (Box b, Real blotdiameter) * blotdiameter along all edges of the polygon (which is what the * postscript routine in the backend effectively does, but on the * shrinked polygon). --jr + * + * An extra parameter "extroversion" has been added since staying just + * inside of a polygon will reduce its visual size when tracing a + * rounded path. If extroversion is zero, the polygon is just traced + * as-is. If it is -1 (the default) the drawing will stay just within + * the given polygon. If it is 1, the traced line will stay just + * outside of the given polygon. */ Stencil Lookup::round_filled_polygon (vector const &points, - Real blotdiameter) + Real blotdiameter, + Real extroversion) { /* TODO: Maybe print a warning if one of the above limitations applies to the given polygon. However, this is quite complicated to check. */ +#ifdef DEBUG const Real epsilon = 0.01; -#ifndef NDEBUG /* remove consecutive duplicate points */ for (vsize i = 0; i < points.size (); i++) { @@ -260,78 +264,120 @@ Lookup::round_filled_polygon (vector const &points, return Stencil (); if (points.size () == 1) { - Stencil circ = circle (0.5 * blotdiameter, 0, true); + Stencil circ = circle (0.5 * (1.0 + extroversion) * blotdiameter, 0, true); circ.translate (points[0]); return circ; } if (points.size () == 2) - return Line_interface::make_line (blotdiameter, points[0], points[1]); + return Line_interface::make_line ((1.0 + extroversion) * blotdiameter, points[0], points[1]); - /* shrink polygon in size by 0.5 * blotdiameter */ vector shrunk_points; - shrunk_points.resize (points.size ()); - bool ccw = 1; // true, if three adjacent points are counterclockwise ordered - for (vsize i = 0; i < points.size (); i++) + + if (extroversion == 0.0) { - int i0 = i; - int i1 = (i + 1) % points.size (); - int i2 = (i + 2) % points.size (); - Offset p0 = points[i0]; - Offset p1 = points[i1]; - Offset p2 = points[i2]; - Offset p10 = p0 - p1; - Offset p12 = p2 - p1; - if (p10.length () != 0.0) + shrunk_points = points; + } + else + { + /* shrink polygon in size by 0.5 * blotdiameter */ + + // first we need to determine the orientation of the polygon in + // order to decide whether shrinking means moving the polygon to the + // left or to the right of the outline. We do that by calculating + // (double) the oriented area of the polygon. We first determine the + // center and do the area calculations relative to it. + // Mathematically, the result is not affected by this shift, but + // numerically a lot of cancellation is going on and this keeps its + // effects in check. + + Offset center; + for (vsize i = 0; i < points.size (); i++) + center += points[i]; + center /= points.size (); + + Real area = 0.0; + Offset last = points.back () - center; + + for (vsize i = 0; i < points.size (); i++) { - // recompute ccw - Real phi = p10.arg (); - // rotate (p2 - p0) by (-phi) - Offset q = complex_multiply (p2 - p0, complex_exp (Offset (1.0, -phi))); - - if (q[Y_AXIS] > 0) - ccw = 1; - else if (q[Y_AXIS] < 0) - ccw = 0; - else {} // keep ccw unchanged + Offset here = points[i] - center; + area += cross_product (last, here); + last = here; } - else {} // keep ccw unchanged - Offset p10n = (1.0 / p10.length ()) * p10; // normalize length to 1.0 - Offset p12n = (1.0 / p12.length ()) * p12; - Offset p13n = 0.5 * (p10n + p12n); - Offset p14n = 0.5 * (p10n - p12n); - Offset p13; - Real d = p13n.length () * p14n.length (); // distance p3n to line (p1..p0) - if (d < epsilon) - // special case: p0, p1, p2 are on a single line => build - // vector orthogonal to (p2-p0) of length 0.5 blotdiameter + + bool ccw = area >= 0.0; // true if whole shape is counterclockwise oriented + + shrunk_points.resize (points.size ()); + + for (vsize i = 0; i < points.size (); i++) { - p13[X_AXIS] = p10[Y_AXIS]; - p13[Y_AXIS] = -p10[X_AXIS]; - p13 = (0.5 * blotdiameter / p13.length ()) * p13; + int i0 = i; + int i1 = (i + 1) % points.size (); + int i2 = (i + 2) % points.size (); + Offset p0 = points[i0]; + Offset p1 = points[i1]; + Offset p2 = points[i2]; + Offset p01 = p1 - p0; + Offset p12 = p2 - p1; + Offset inward0 = Offset(-p01[Y_AXIS], p01[X_AXIS]).direction (); + Offset inward2 = Offset(-p12[Y_AXIS], p12[X_AXIS]).direction (); + + if (!ccw) + { + inward0 = -inward0; + inward2 = -inward2; + } + + Offset middle = 0.5*(inward0 + inward2); + + // "middle" now is a vector in the right direction for the + // shrinkage. Its size needs to be large enough that the + // projection on either of the inward vectors has a size of 1. + + Real proj = dot_product (middle, inward0); + + // What's the size of proj? Assuming that we have a corner + // angle of phi where 0 corresponds to a continuing line, the + // length of middle is 0.5 |(1+cos phi, sin phi)| = cos (phi/2), + // so its projection has length + // cos^2 (phi/2) = 0.5 + 0.5 cos (phi). + // We don't really want to move inwards more than 3 blob + // diameters corresponding to 6 blob radii. So + // cos (phi/2) = 1/6 gives phi ~ 161, meaning that a 20 degree + // corner necessitates moving 3 blob diameters from the corner + // in order to stay inside the lines. Ruler and circle agree. + // 0.03 is close enough to 1/36. Basically we want to keep the + // shape from inverting from pulling too far inward. + // 3 diameters is pretty much a handwaving guess. + + if (abs (proj) < 0.03) + proj = proj < 0 ? -0.03 : 0.03; + + shrunk_points[i1] = p1 - (0.5 * blotdiameter / proj) * middle + * extroversion; } - else - p13 = (0.5 * blotdiameter / d) * p13n; - shrunk_points[i1] = p1 + ((ccw) ? p13 : -p13); } /* build scm expression and bounding box */ SCM shrunk_points_scm = SCM_EOL; Box box; + Box shrunk_box; for (vsize i = 0; i < shrunk_points.size (); i++) { SCM x = scm_from_double (shrunk_points[i][X_AXIS]); SCM y = scm_from_double (shrunk_points[i][Y_AXIS]); shrunk_points_scm = scm_cons (x, scm_cons (y, shrunk_points_scm)); box.add_point (points[i]); + shrunk_box.add_point (shrunk_points[i]); } - SCM polygon_scm = scm_list_n (ly_symbol2scm ("polygon"), + shrunk_box.widen (0.5*blotdiameter, 0.5*blotdiameter); + box.unite (shrunk_box); + SCM polygon_scm = scm_list_4 (ly_symbol2scm ("polygon"), ly_quote_scm (shrunk_points_scm), scm_from_double (blotdiameter), - SCM_BOOL_T, - SCM_UNDEFINED); + SCM_BOOL_T); Stencil polygon = Stencil (box, polygon_scm); - shrunk_points.clear (); return polygon; } @@ -466,6 +512,9 @@ Lookup::bezier_sandwich (Bezier top_curve, Bezier bottom_curve, Real thickness) scm_from_double (top_curve.control_[2][Y_AXIS]), scm_from_double (top_curve.control_[3][X_AXIS]), scm_from_double (top_curve.control_[3][Y_AXIS]), + ly_symbol2scm ("lineto"), + scm_from_double (bottom_curve.control_[3][X_AXIS]), + scm_from_double (bottom_curve.control_[3][Y_AXIS]), ly_symbol2scm ("curveto"), scm_from_double (bottom_curve.control_[2][X_AXIS]), scm_from_double (bottom_curve.control_[2][Y_AXIS]), @@ -498,7 +547,7 @@ Stencil Lookup::repeat_slash (Real w, Real s, Real t) { - Real x_width = sqrt ((t * t) + ((t / s) * (t / s))); + Real x_width = hypot (t, t/s); Real height = w * s; SCM controls = scm_list_n (ly_symbol2scm ("moveto"), @@ -524,8 +573,8 @@ Lookup::repeat_slash (Real w, Real s, Real t) SCM_BOOL_T, SCM_UNDEFINED); - Box b (Interval (0, w + sqrt (sqr (t / s) + sqr (t))), - Interval (0, w * s)); + Box b (Interval (0, w + x_width), + Interval (0, height)); return Stencil (b, slashnodot); // http://slashnodot.org } @@ -534,7 +583,7 @@ Stencil Lookup::bracket (Axis a, Interval iv, Real thick, Real protrude, Real blot) { Box b; - Axis other = Axis ((a + 1) % 2); + Axis other = other_axis (a); b[a] = iv; b[other] = Interval (-1, 1) * thick * 0.5; diff --git a/lily/ly-module.cc b/lily/ly-module.cc index 51e473b68d..2076168fda 100644 --- a/lily/ly-module.cc +++ b/lily/ly-module.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,10 +18,11 @@ */ #include "lily-guile.hh" +#include "ly-module.hh" #include "warn.hh" #include "main.hh" -#include "std-string.hh" #include "protected-scm.hh" +#include "lily-imports.hh" SCM ly_make_module (bool safe) @@ -31,14 +32,16 @@ ly_make_module (bool safe) { /* Look up (evaluate) Scheme make-module function and call it */ - SCM maker = ly_lily_module_constant ("make-module"); - mod = scm_call_0 (maker); + mod = Guile_user::make_module (); /* Look up and call Guile module-export-all! or, when using Guile V1.8, the compatible shim defined in lily.scm. */ - SCM module_export_all_x = ly_lily_module_constant ("module-export-all!"); - scm_call_1 (module_export_all_x, mod); +#if GUILEV2 + Guile_user::module_export_all_x (mod); +#else + Lily::module_export_all_x (mod); +#endif /* Evaluate Guile module "the-root-module", @@ -46,15 +49,14 @@ ly_make_module (bool safe) N.B. this used to be "the-scm-module" and is deprecated in Guile V1.9/2.0 */ - SCM scm_module = ly_lily_module_constant ("the-root-module"); - ly_use_module (mod, scm_module); - ly_use_module (mod, global_lily_module); + + ly_use_module (mod, Guile_user::the_root_module); + ly_use_module (mod, Lily::module); } else { /* Evaluate and call make-safe-lilypond-module */ - SCM proc = ly_lily_module_constant ("make-safe-lilypond-module"); - mod = scm_call_0 (proc); + mod = Lily::make_safe_lilypond_module (); } return mod; @@ -68,19 +70,12 @@ ly_use_module (SCM mod, SCM used) TODO - Replace inline evaluations (interpreted) with guile API calls if these become available. */ - SCM scm_module_use = ly_symbol2scm ("module-use!"); - SCM scm_module_public_interface = ly_symbol2scm ("module-public-interface"); - SCM iface = scm_list_2 (scm_module_public_interface, used); /* Set up to interpret '(module_use! (module-public-interface ))' */ - SCM expr = scm_list_3 (scm_module_use, mod, iface); - /* - Now return SCM value, this is the result of interpreting - '(eval (module-use! (module-public-interface )) "lily")' - */ - return scm_eval (expr, global_lily_module); + return Guile_user::module_use_x (mod, + Guile_user::module_public_interface (used)); } #define FUNC_NAME __FUNCTION__ @@ -100,7 +95,7 @@ entry_to_alist (void * /* closure */, SCM val, SCM result) { - if (scm_variable_bound_p (val) == SCM_BOOL_T) + if (to_boolean (scm_variable_bound_p (val))) return scm_cons (scm_cons (key, scm_variable_ref (val)), result); programming_error ("unbound variable in module"); return result; @@ -120,11 +115,7 @@ LY_DEFINE (ly_module_2_alist, "ly:module->alist", void ly_export (SCM module, SCM namelist) { - static SCM export_function; - if (!export_function) - export_function = scm_permanent_object (scm_c_lookup ("module-export!")); - - scm_call_2 (SCM_VARIABLE_REF (export_function), module, namelist); + Guile_user::module_export_x (module, namelist); } void diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc index 3c47335b35..336b167f2e 100644 --- a/lily/lyric-combine-music-iterator.cc +++ b/lily/lyric-combine-music-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -59,14 +59,15 @@ protected: private: bool start_new_syllable () const; Context *find_voice (); - DECLARE_LISTENER (set_busy); - DECLARE_LISTENER (check_new_context); + void set_busy (SCM); + void check_new_context (SCM); bool music_found_; bool lyrics_found_; Context *lyrics_context_; Context *music_context_; SCM lyricsto_voice_name_; + SCM lyricsto_voice_type_; Moment busy_moment_; Moment pending_grace_moment_; @@ -83,6 +84,8 @@ Lyric_combine_music_iterator::Lyric_combine_music_iterator () music_context_ = 0; lyrics_context_ = 0; busy_moment_.set_infinite (-1); + lyricsto_voice_name_ = SCM_UNDEFINED; + lyricsto_voice_type_ = SCM_UNDEFINED; } /* @@ -90,11 +93,10 @@ Lyric_combine_music_iterator::Lyric_combine_music_iterator () 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); + Stream_event *e = unsmob (se); if ((e->in_event_class ("note-event") || e->in_event_class ("cluster-note-event")) && music_context_) @@ -109,14 +111,14 @@ Lyric_combine_music_iterator::set_music_context (Context *to) { if (music_context_) { - music_context_->event_source ()-> - remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("rhythmic-event")); + music_context_->events_below ()-> + remove_listener (GET_LISTENER (Lyric_combine_music_iterator, set_busy), ly_symbol2scm ("rhythmic-event")); } music_context_ = to; if (to) { - to->event_source ()->add_listener (GET_LISTENER (set_busy), + to->events_below ()->add_listener (GET_LISTENER (Lyric_combine_music_iterator, set_busy), ly_symbol2scm ("rhythmic-event")); } } @@ -159,7 +161,8 @@ Lyric_combine_music_iterator::run_always () const bool Lyric_combine_music_iterator::ok () const { - return lyric_iter_ && lyric_iter_->ok (); + return lyric_iter_ && lyric_iter_->ok () + && !(music_context_ && music_context_->is_removable ()); } void @@ -171,6 +174,8 @@ Lyric_combine_music_iterator::derived_mark ()const scm_gc_mark (lyrics_context_->self_scm ()); if (music_context_) scm_gc_mark (music_context_->self_scm ()); + scm_gc_mark (lyricsto_voice_name_); + scm_gc_mark (lyricsto_voice_type_); } void @@ -187,8 +192,8 @@ Lyric_combine_music_iterator::derived_substitute (Context *f, Context *t) void Lyric_combine_music_iterator::construct_children () { - Music *m = unsmob_music (get_music ()->get_property ("element")); - lyric_iter_ = unsmob_iterator (get_iterator (m)); + Music *m = unsmob (get_music ()->get_property ("element")); + lyric_iter_ = unsmob (get_iterator (m)); if (!lyric_iter_) return; lyrics_context_ = find_context_below (lyric_iter_->get_outlet (), @@ -200,6 +205,9 @@ Lyric_combine_music_iterator::construct_children () } lyricsto_voice_name_ = get_music ()->get_property ("associated-context"); + lyricsto_voice_type_ = get_music ()->get_property ("associated-context-type"); + if (!scm_is_symbol (lyricsto_voice_type_)) + lyricsto_voice_type_ = ly_symbol2scm ("Voice"); Context *voice = find_voice (); if (voice) @@ -210,7 +218,7 @@ Lyric_combine_music_iterator::construct_children () 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")); + g->events_below ()->add_listener (GET_LISTENER (Lyric_combine_music_iterator, check_new_context), ly_symbol2scm ("CreateContext")); /* We do not create a Lyrics context, because the user might @@ -219,7 +227,6 @@ Lyric_combine_music_iterator::construct_children () */ } -IMPLEMENT_LISTENER (Lyric_combine_music_iterator, check_new_context) void Lyric_combine_music_iterator::check_new_context (SCM /*sev*/) { @@ -249,19 +256,18 @@ Lyric_combine_music_iterator::find_voice () SCM running = lyrics_context_ ? lyrics_context_->get_property ("associatedVoice") : SCM_EOL; - - if (scm_is_string (running)) + SCM voice_type = lyricsto_voice_type_; + if (scm_is_string (running)) { voice_name = running; + voice_type = lyrics_context_->get_property ("associatedVoiceType"); + } if (scm_is_string (voice_name) - && (!music_context_ || ly_scm2string (voice_name) != music_context_->id_string ())) + && (!music_context_ || ly_scm2string (voice_name) != music_context_->id_string ()) + && scm_is_symbol (voice_type)) { - Context *t = get_outlet (); - while (t && t->get_parent_context ()) - t = t->get_parent_context (); - - string name = ly_scm2string (voice_name); - return find_context_below (t, ly_symbol2scm ("Voice"), name); + return find_context_below (find_top_context (get_outlet ()), + voice_type, ly_scm2string (voice_name)); } return 0; @@ -327,15 +333,16 @@ Lyric_combine_music_iterator::do_quit () if (!music_found_) { SCM voice_name = get_music ()->get_property ("associated-context"); - - string name; + SCM voice_type = get_music ()->get_property ("associated-context-type"); + string name, type; if (scm_is_string (voice_name)) name = ly_scm2string (voice_name); + type = robust_symbol2string (voice_type, "Voice"); /* Don't print a warning for empty lyrics (in which case we don't try to find the proper voice, so it will not be found) */ if (lyrics_found_) - get_music ()->origin ()->warning (_f ("cannot find Voice `%s'", - name.c_str ()) + "\n"); + get_music ()->origin ()->warning (_f ("cannot find %s `%s'", + type.c_str (), name.c_str ()) + "\n"); } if (lyric_iter_) diff --git a/lily/lyric-combine-music.cc b/lily/lyric-combine-music.cc index 0110645667..9cf603a3a4 100644 --- a/lily/lyric-combine-music.cc +++ b/lily/lyric-combine-music.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,7 +29,7 @@ MAKE_SCHEME_CALLBACK (Lyric_combine_music, length_callback, 1); SCM Lyric_combine_music::length_callback (SCM m) { - Music *me = unsmob_music (m); - Music *melody = unsmob_music (scm_car (me->get_property ("elements"))); + Music *me = unsmob (m); + Music *melody = unsmob (scm_car (me->get_property ("elements"))); return melody->get_length ().smobbed_copy (); } diff --git a/lily/lyric-engraver.cc b/lily/lyric-engraver.cc index e4b23d1f94..08c9306693 100644 --- a/lily/lyric-engraver.cc +++ b/lily/lyric-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -36,7 +36,7 @@ class Lyric_engraver : public Engraver protected: void stop_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (lyric); + void listen_lyric (Stream_event *); public: TRANSLATOR_DECLARATIONS (Lyric_engraver); @@ -56,7 +56,6 @@ Lyric_engraver::Lyric_engraver () event_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Lyric_engraver, lyric); void Lyric_engraver::listen_lyric (Stream_event *ev) { @@ -70,7 +69,7 @@ Lyric_engraver::process_music () { SCM text = event_->get_property ("text"); - if (ly_is_equal (text, scm_from_locale_string (" "))) + if (ly_is_equal (text, scm_from_ascii_string (" "))) { if (last_text_) last_text_->set_property ("self-alignment-X", @@ -95,8 +94,11 @@ get_voice_to_lyrics (Context *lyrics) bool searchForVoice = to_boolean (lyrics->get_property ("searchForVoice")); SCM avc = lyrics->get_property ("associatedVoiceContext"); - if (Context *c = unsmob_context (avc)) - return c; + if (Context *c = unsmob (avc)) + { + if (!c->is_removable ()) + return c; + } SCM voice_name = lyrics->get_property ("associatedVoice"); string nm = lyrics->id_string (); @@ -112,47 +114,50 @@ get_voice_to_lyrics (Context *lyrics) nm = nm.substr (0, idx); } - Context *parent = lyrics; - Context *voice = 0; - while (parent && !voice) - { - voice = find_context_below (parent, ly_symbol2scm ("Voice"), nm); - parent = parent->get_parent_context (); - } + SCM voice_type = lyrics->get_property ("associatedVoiceType"); + if (!scm_is_symbol (voice_type)) + return 0; + Context *voice = find_context_near (lyrics, voice_type, nm); if (voice) return voice; - parent = lyrics; - voice = 0; - while (parent && !voice) - { - voice = find_context_below (parent, ly_symbol2scm ("Voice"), ""); - parent = parent->get_parent_context (); - } - - return voice; + return find_context_near (lyrics, voice_type, ""); } Grob * -get_current_note_head (Context *voice, bool include_grace_notes) +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)) { - Grob *g = unsmob_grob (scm_cdar (s));; - Moment *end_mom = unsmob_moment (scm_caar (s)); + Grob *g = unsmob (scm_cdar (s));; + Moment *end_mom = unsmob (scm_caar (s)); if (!end_mom || !g) { programming_error ("busyGrobs invalid"); continue; } - if (((end_mom->main_part_ > now.main_part_) - || (include_grace_notes && end_mom->grace_part_ > now.grace_part_)) + // It's a bit irritating that we just have the length and + // duration of the Grob. + Moment end_from_now = + get_event_length (unsmob (g->get_property ("cause")), now) + + now; + // We cannot actually include more than a single grace note + // using busyGrobs on ungraced lyrics since a grob ending on + // grace time will just have disappeared from busyGrobs by the + // time our ungraced lyrics appear. At best we may catch a + // single grace note. + // + // However, a single grace note ending on a non-grace time is + // indistinguishable from a proper note ending on a non-grace + // time. So we really have no way to obey includeGraceNotes + // here. Not with this mechanism. + if ((*end_mom == end_from_now) && dynamic_cast (g) - && Note_head::has_interface (g)) + && has_interface (g)) { return g; } @@ -170,23 +175,16 @@ Lyric_engraver::stop_translation_timestep () if (voice) { - bool include_grace_notes = to_boolean (get_property ("includeGraceNotes")); - Grob *head = get_current_note_head (voice, include_grace_notes); + Grob *head = get_current_note_head (voice); if (head) { - text_->set_parent (head, X_AXIS); + text_->set_parent (head->get_parent(X_AXIS), X_AXIS); if (melisma_busy (voice) && !to_boolean (get_property ("ignoreMelismata"))) text_->set_property ("self-alignment-X", get_property ("lyricMelismaAlignment")); } - 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_; @@ -195,6 +193,12 @@ Lyric_engraver::stop_translation_timestep () event_ = 0; } +void +Lyric_engraver::boot () +{ + ADD_LISTENER (Lyric_engraver, lyric); +} + ADD_TRANSLATOR (Lyric_engraver, /* doc */ "Engrave text for lyrics.", @@ -204,7 +208,6 @@ ADD_TRANSLATOR (Lyric_engraver, /* read */ "ignoreMelismata " - "includeGraceNotes " "lyricMelismaAlignment " "searchForVoice", diff --git a/lily/lyric-extender.cc b/lily/lyric-extender.cc index f61acbe5fe..8afe2c5569 100644 --- a/lily/lyric-extender.cc +++ b/lily/lyric-extender.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -32,9 +32,9 @@ MAKE_SCHEME_CALLBACK (Lyric_extender, print, 1); SCM Lyric_extender::print (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Item *left_edge = me->get_bound (LEFT); - Item *right_text = unsmob_item (me->get_object ("next")); + Item *right_text = unsmob (me->get_object ("next")); Grob *common = left_edge; diff --git a/lily/lyric-hyphen.cc b/lily/lyric-hyphen.cc index 0e3a67e348..029391f92f 100644 --- a/lily/lyric-hyphen.cc +++ b/lily/lyric-hyphen.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Han-Wen Nienhuys + Copyright (C) 2003--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ MAKE_SCHEME_CALLBACK (Lyric_hyphen, print, 1); SCM Lyric_hyphen::print (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Drul_array bounds (me->get_bound (LEFT), me->get_bound (RIGHT)); @@ -115,7 +115,7 @@ MAKE_SCHEME_CALLBACK (Lyric_hyphen, set_spacing_rods, 1); SCM Lyric_hyphen::set_spacing_rods (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Rod r; Spanner *sp = dynamic_cast (me); diff --git a/lily/lyric-performer.cc b/lily/lyric-performer.cc index 3fd9900e7e..6a25d62a3f 100644 --- a/lily/lyric-performer.cc +++ b/lily/lyric-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,7 @@ protected: void stop_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (lyric); + void listen_lyric (Stream_event *); private: vector events_; Audio_text *audio_; @@ -67,13 +67,18 @@ Lyric_performer::stop_translation_timestep () events_.clear (); } -IMPLEMENT_TRANSLATOR_LISTENER (Lyric_performer, lyric); void Lyric_performer::listen_lyric (Stream_event *event) { events_.push_back (event); } +void +Lyric_performer::boot () +{ + ADD_LISTENER (Lyric_performer, lyric); +} + ADD_TRANSLATOR (Lyric_performer, /* doc */ "", diff --git a/lily/main.cc b/lily/main.cc index 5ac75067a0..d84f90ebd8 100644 --- a/lily/main.cc +++ b/lily/main.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,6 +18,7 @@ */ #include "main.hh" +#include "lily-guile.hh" #include #include @@ -54,6 +55,7 @@ using namespace std; #include "string-convert.hh" #include "version.hh" #include "warn.hh" +#include "lily-imports.hh" /* * Global options that can be overridden through command line. @@ -157,6 +159,7 @@ static Long_option_init options_static[] {0, "pdf", 0, _i ("generate PDF (default)")}, {0, "png", 0, _i ("generate PNG")}, {0, "ps", 0, _i ("generate PostScript")}, + {0, "bigpdfs", 'b', _i("generate big PDF files")}, {0, "help", 'h', _i ("show this help and exit")}, { _i ("FIELD"), "header", 'H', _i ("dump header field FIELD to file\n" @@ -258,7 +261,7 @@ copyright () */ { /* Do not update the copyright years here, run `make grand-replace' */ - printf ("%s", (_f ("Copyright (c) %s by\n%s and others.", "1996--2012", + printf ("%s", (_f ("Copyright (c) %s by\n%s and others.", "1996--2015", AUTHORS).c_str ())); printf ("\n"); } @@ -478,8 +481,8 @@ main_with_guile (void *, int, char **) // " \"" + lilypond_datadir + "/scm/out\")"; //scm_c_eval_string (scm_pct_set_fallback.c_str() ); scm_primitive_eval - (scm_list_3 (scm_from_locale_symbol ("set!"), - scm_from_locale_symbol ("%compile-fallback-path"), + (scm_list_3 (scm_from_latin1_symbol ("set!"), + scm_from_latin1_symbol ("%compile-fallback-path"), scm_from_locale_string (ly_scm_go_dir.c_str()))); #endif @@ -530,8 +533,8 @@ main_with_guile (void *, int, char **) // SCM result = scm_call_1 ( // scm_variable_ref (call_with_error_handling), // scm_call_1 (ly_lily_module_constant ("lilypond-main"), files)); - SCM result = scm_call_1 (ly_lily_module_constant ("lilypond-main"), files); - (void) result; + + Lily::lilypond_main (files); /* Unreachable. */ exit (0); @@ -553,6 +556,20 @@ setup_localisation () Disable localisation of float values. */ setlocale (LC_NUMERIC, "C"); +#if GUILEV2 + // In order not to have this porting aid backfire to GUILE1 usage, + // this is only compiled in the GUILEV2 version. It should + // eventually be replaced with proper multibyte communication with + // GUILE2, but in the mean time it seems that this is the least + // invasive path to get comparable results between the + // not-really-multibyte-supporting GUILE1 and GUILE2 + + /* Disable character sets */ + setlocale (LC_CTYPE, "C"); + /* But our text domain is in UTF-8 */ + bind_textdomain_codeset ("lilypond", "UTF-8"); +#endif + string localedir = LOCALEDIR; if (char const *env = getenv ("LILYPOND_LOCALEDIR")) localedir = env; @@ -598,6 +615,10 @@ parse_argv (int argc, char **argv) relocate_binary = true; break; + case 'b': + bigpdfs = true; + break; + case 'd': { string arg (option_parser->optional_argument_str0_); diff --git a/lily/mark-engraver.cc b/lily/mark-engraver.cc index 25b19bd18a..a849ec11ce 100644 --- a/lily/mark-engraver.cc +++ b/lily/mark-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -54,8 +54,8 @@ protected: void stop_translation_timestep (); virtual void finalize (); - DECLARE_TRANSLATOR_LISTENER (mark); - DECLARE_ACKNOWLEDGER (break_alignment); + void listen_mark (Stream_event *); + void acknowledge_break_alignment (Grob_info); }; Mark_engraver::Mark_engraver () @@ -111,7 +111,6 @@ Mark_engraver::create_items (Stream_event *ev) text_ = make_item ("RehearsalMark", ev->self_scm ()); } -IMPLEMENT_TRANSLATOR_LISTENER (Mark_engraver, mark); void Mark_engraver::listen_mark (Stream_event *ev) { @@ -140,17 +139,11 @@ Mark_engraver::process_music () if (!scm_is_number (m)) m = get_property ("rehearsalMark"); - if (scm_integer_p (m) == SCM_BOOL_T - && scm_exact_p (m) == SCM_BOOL_T) + if (scm_is_number (m)) { - int mark_count = scm_to_int (m); - mark_count++; - context ()->set_property ("rehearsalMark", - scm_from_int (mark_count)); + context ()->set_property ("rehearsalMark", scm_oneplus (m)); + m = scm_call_2 (proc, m, context ()->self_scm ()); } - - if (scm_is_number (m)) - m = scm_call_2 (proc, m, context ()->self_scm ()); else /* FIXME: constant error message. */ warning (_ ("rehearsalMark must have integer value")); @@ -163,7 +156,13 @@ Mark_engraver::process_music () } } -ADD_ACKNOWLEDGER (Mark_engraver, break_alignment); + +void +Mark_engraver::boot () +{ + ADD_LISTENER (Mark_engraver, mark); + ADD_ACKNOWLEDGER (Mark_engraver, break_alignment); +} ADD_TRANSLATOR (Mark_engraver, /* doc */ diff --git a/lily/measure-grouping-engraver.cc b/lily/measure-grouping-engraver.cc index 526091944b..2ab7a7bcc6 100644 --- a/lily/measure-grouping-engraver.cc +++ b/lily/measure-grouping-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,7 +36,7 @@ protected: void process_music (); virtual void finalize (); - DECLARE_ACKNOWLEDGER (note_column); + void acknowledge_note_column (Grob_info); }; void @@ -44,7 +44,7 @@ Measure_grouping_engraver::finalize () { if (grouping_) { - grouping_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + grouping_->set_bound (RIGHT, unsmob (get_property ("currentCommandColumn"))); grouping_->suicide (); grouping_ = 0; } @@ -64,7 +64,7 @@ Measure_grouping_engraver::process_music () if (grouping_ && now.main_part_ >= stop_grouping_mom_ && !now.grace_part_) { grouping_->set_bound (RIGHT, - unsmob_grob (get_property ("currentMusicalColumn"))); + unsmob (get_property ("currentMusicalColumn"))); grouping_ = 0; } @@ -75,10 +75,10 @@ Measure_grouping_engraver::process_music () SCM grouping = get_property ("beatStructure"); if (scm_is_pair (grouping)) { - Moment *measpos = unsmob_moment (get_property ("measurePosition")); + Moment *measpos = unsmob (get_property ("measurePosition")); Rational mp = measpos->main_part_; - Moment *base_mom = unsmob_moment (get_property ("baseMoment")); + Moment *base_mom = unsmob (get_property ("baseMoment")); Rational base_moment = base_mom->main_part_; Rational where (0); @@ -97,7 +97,7 @@ Measure_grouping_engraver::process_music () if (grouplen > 1) { grouping_ = make_spanner ("MeasureGrouping", SCM_EOL); - grouping_->set_bound (LEFT, unsmob_grob (get_property ("currentMusicalColumn"))); + grouping_->set_bound (LEFT, unsmob (get_property ("currentMusicalColumn"))); stop_grouping_mom_ = now.main_part_ + Rational (grouplen - 1) * base_moment; get_global_context ()->add_moment_to_process (Moment (stop_grouping_mom_)); @@ -119,7 +119,12 @@ Measure_grouping_engraver::Measure_grouping_engraver () grouping_ = 0; } -ADD_ACKNOWLEDGER (Measure_grouping_engraver, note_column); +void +Measure_grouping_engraver::boot () +{ + ADD_ACKNOWLEDGER (Measure_grouping_engraver, note_column); +} + ADD_TRANSLATOR (Measure_grouping_engraver, /* doc */ "Create @code{MeasureGrouping} to indicate beat subdivision.", diff --git a/lily/measure-grouping-spanner.cc b/lily/measure-grouping-spanner.cc index e668f57beb..052aae12ac 100644 --- a/lily/measure-grouping-spanner.cc +++ b/lily/measure-grouping-spanner.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,7 +29,7 @@ MAKE_SCHEME_CALLBACK (Measure_grouping, print, 1); SCM Measure_grouping::print (SCM grob) { - Spanner *me = dynamic_cast (unsmob_grob (grob)); + Spanner *me = unsmob (grob); SCM which = me->get_property ("style"); Real height = robust_scm2double (me->get_property ("height"), 1); @@ -48,9 +48,9 @@ Measure_grouping::print (SCM grob) /* TODO: use line interface */ - if (which == ly_symbol2scm ("bracket")) + if (scm_is_eq (which, ly_symbol2scm ("bracket"))) m = Lookup::bracket (X_AXIS, iv, t, -height, t); - else if (which == ly_symbol2scm ("triangle")) + else if (scm_is_eq (which, ly_symbol2scm ("triangle"))) m = Lookup::triangle (iv, t, height); m.align_to (Y_AXIS, DOWN); diff --git a/lily/melody-engraver.cc b/lily/melody-engraver.cc index c6ab972c74..a97d13755f 100644 --- a/lily/melody-engraver.cc +++ b/lily/melody-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,8 +29,8 @@ class Melody_engraver : public Engraver Grob *stem_; protected: - DECLARE_ACKNOWLEDGER (stem); - DECLARE_ACKNOWLEDGER (slur); + void acknowledge_stem (Grob_info); + void acknowledge_slur (Grob_info); TRANSLATOR_DECLARATIONS (Melody_engraver); void stop_translation_timestep (); void process_acknowledged (); @@ -93,8 +93,13 @@ Melody_engraver::acknowledge_stem (Grob_info info) #include "translator.icc" -ADD_ACKNOWLEDGER (Melody_engraver, stem); -ADD_ACKNOWLEDGER (Melody_engraver, slur); + +void +Melody_engraver::boot () +{ + ADD_ACKNOWLEDGER (Melody_engraver, stem); + ADD_ACKNOWLEDGER (Melody_engraver, slur); +} ADD_TRANSLATOR (Melody_engraver, /* doc */ diff --git a/lily/melody-spanner.cc b/lily/melody-spanner.cc index 4fdaa4eb55..3550e89382 100644 --- a/lily/melody-spanner.cc +++ b/lily/melody-spanner.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -34,8 +34,8 @@ MAKE_SCHEME_CALLBACK (Melody_spanner, calc_neutral_stem_direction, 1); SCM Melody_spanner::calc_neutral_stem_direction (SCM smob) { - Grob *stem = unsmob_grob (smob); - Grob *me = unsmob_grob (stem->get_object ("melody-spanner")); + Grob *stem = unsmob (smob); + Grob *me = unsmob (stem->get_object ("melody-spanner")); if (!me || !me->is_live ()) return scm_from_int (DOWN); diff --git a/lily/mensural-ligature-engraver.cc b/lily/mensural-ligature-engraver.cc index 8f70fa4e48..874b2ebb35 100644 --- a/lily/mensural-ligature-engraver.cc +++ b/lily/mensural-ligature-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Juergen Reuter , + Copyright (C) 2002--2015 Juergen Reuter , Pal Benko LilyPond is free software: you can redistribute it and/or modify @@ -59,10 +59,10 @@ protected: virtual Spanner *create_ligature_spanner (); virtual void build_ligature (Spanner *ligature, vector const &primitives); - DECLARE_TRANSLATOR_LISTENER (ligature); public: TRANSLATOR_DECLARATIONS (Mensural_ligature_engraver); + TRANSLATOR_INHERIT (Coherent_ligature_engraver); private: void transform_heads (vector const &primitives); @@ -73,13 +73,6 @@ private: Real &min_length); }; -IMPLEMENT_TRANSLATOR_LISTENER (Mensural_ligature_engraver, ligature); -void -Mensural_ligature_engraver::listen_ligature (Stream_event *ev) -{ - Ligature_engraver::listen_ligature (ev); -} - Mensural_ligature_engraver::Mensural_ligature_engraver () { brew_ligature_primitive_proc @@ -129,7 +122,7 @@ Mensural_ligature_engraver::transform_heads (vector const &primitives continue; } - int pitch = unsmob_pitch (nr->get_property ("pitch"))->steps (); + int pitch = unsmob (nr->get_property ("pitch"))->steps (); int prim = 0; if (at_beginning) @@ -182,7 +175,7 @@ Mensural_ligature_engraver::transform_heads (vector const &primitives } // b. descendens longa or brevis else if (i < s - 1 - && (unsmob_pitch (primitives[i + 1].event_cause () + && (unsmob (primitives[i + 1].event_cause () ->get_property ("pitch"))->steps () < pitch) && duration_log > -3) { @@ -275,7 +268,7 @@ Mensural_ligature_engraver::transform_heads (vector const &primitives /* breve: check whether descending */ - int const next_pitch = unsmob_pitch + int const next_pitch = unsmob (next_info.event_cause ()->get_property ("pitch"))->steps (); if (next_pitch < pitch) /* @@ -495,8 +488,14 @@ Mensural_ligature_engraver::build_ligature (Spanner *ligature, ligature->set_property ("minimum-length", scm_from_double (min_length)); } -ADD_ACKNOWLEDGER (Mensural_ligature_engraver, rest); -ADD_ACKNOWLEDGER (Mensural_ligature_engraver, ligature_head); + +void +Mensural_ligature_engraver::boot () +{ + ADD_LISTENER (Mensural_ligature_engraver, ligature); + ADD_ACKNOWLEDGER (Mensural_ligature_engraver, rest); + ADD_ACKNOWLEDGER (Mensural_ligature_engraver, ligature_head); +} ADD_TRANSLATOR (Mensural_ligature_engraver, /* doc */ diff --git a/lily/mensural-ligature.cc b/lily/mensural-ligature.cc index 4695eef986..5a3b3e9543 100644 --- a/lily/mensural-ligature.cc +++ b/lily/mensural-ligature.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Juergen Reuter , + Copyright (C) 2002--2015 Juergen Reuter , Pal Benko LilyPond is free software: you can redistribute it and/or modify @@ -117,7 +117,7 @@ Stencil internal_brew_primitive (Grob *me) { SCM primitive_scm = me->get_property ("primitive"); - if (primitive_scm == SCM_EOL) + if (scm_is_null (primitive_scm)) { programming_error ("Mensural_ligature:" " undefined primitive -> ignoring grob"); @@ -270,7 +270,7 @@ MAKE_SCHEME_CALLBACK (Mensural_ligature, brew_ligature_primitive, 1); SCM Mensural_ligature::brew_ligature_primitive (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return internal_brew_primitive (me).smobbed_copy (); } diff --git a/lily/metronome-engraver.cc b/lily/metronome-engraver.cc index b4cd2ce328..241a2da44a 100644 --- a/lily/metronome-engraver.cc +++ b/lily/metronome-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -46,11 +46,11 @@ protected: void stop_translation_timestep (); void process_music (); - DECLARE_ACKNOWLEDGER (break_aligned); - DECLARE_ACKNOWLEDGER (break_alignment); - DECLARE_ACKNOWLEDGER (grob); + void acknowledge_break_aligned (Grob_info); + void acknowledge_break_alignment (Grob_info); + void acknowledge_grob (Grob_info); - DECLARE_TRANSLATOR_LISTENER (tempo_change); + void listen_tempo_change (Stream_event *); }; Metronome_mark_engraver::Metronome_mark_engraver () @@ -61,7 +61,6 @@ Metronome_mark_engraver::Metronome_mark_engraver () tempo_ev_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Metronome_mark_engraver, tempo_change); void Metronome_mark_engraver::listen_tempo_change (Stream_event *ev) { @@ -71,8 +70,7 @@ Metronome_mark_engraver::listen_tempo_change (Stream_event *ev) static bool safe_is_member (SCM scm, SCM lst) { - return scm_list_p (lst) == SCM_BOOL_T - && scm_member (scm, lst) != SCM_BOOL_F; + return ly_is_list (lst) && scm_is_true (scm_member (scm, lst)); } void @@ -81,8 +79,8 @@ Metronome_mark_engraver::acknowledge_break_aligned (Grob_info info) Grob *g = info.grob (); if (text_ - && g->get_property ("break-align-symbol") - == ly_symbol2scm ("staff-bar")) + && scm_is_eq (g->get_property ("break-align-symbol"), + ly_symbol2scm ("staff-bar"))) bar_ = g; else if (text_ && !support_ @@ -139,9 +137,9 @@ Metronome_mark_engraver::stop_translation_timestep () first notational element of the measure if no time signature is present in that measure). */ - if (Grob *mc = unsmob_grob (get_property ("currentMusicalColumn"))) + if (Grob *mc = unsmob (get_property ("currentMusicalColumn"))) text_->set_parent (mc, X_AXIS); - else if (Grob *cc = unsmob_grob (get_property ("currentCommandColumn"))) + else if (Grob *cc = unsmob (get_property ("currentCommandColumn"))) text_->set_parent (cc, X_AXIS); } text_->set_object ("side-support-elements", @@ -169,9 +167,15 @@ Metronome_mark_engraver::process_music () } } -ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_aligned); -ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_alignment); -ADD_ACKNOWLEDGER (Metronome_mark_engraver, grob); + +void +Metronome_mark_engraver::boot () +{ + ADD_LISTENER (Metronome_mark_engraver, tempo_change); + ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_aligned); + ADD_ACKNOWLEDGER (Metronome_mark_engraver, break_alignment); + ADD_ACKNOWLEDGER (Metronome_mark_engraver, grob); +} ADD_TRANSLATOR (Metronome_mark_engraver, /* doc */ diff --git a/lily/midi-chunk.cc b/lily/midi-chunk.cc index f98c76373e..aed9e2b7dd 100644 --- a/lily/midi-chunk.cc +++ b/lily/midi-chunk.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify diff --git a/lily/midi-control-function-performer.cc b/lily/midi-control-function-performer.cc index ff0855d15c..a112e6bcef 100644 --- a/lily/midi-control-function-performer.cc +++ b/lily/midi-control-function-performer.cc @@ -1,9 +1,9 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2013 by Heikki Tauriainen . + Copyright (C) 2013--2015 by Heikki Tauriainen . Adapted from performer implementations - Copyright (C) 1996--2012 Jan Nieuwenhuizen , + Copyright (C) 1996--2015 Jan Nieuwenhuizen , Han-Wen Nienhyus and others. LilyPond is free software: you can redistribute it and/or modify @@ -39,7 +39,7 @@ class Midi_control_function_performer : public Performer { public: TRANSLATOR_DECLARATIONS (Midi_control_function_performer); - DECLARE_LISTENER (announce_function_value_change); + void announce_function_value_change (SCM); ~Midi_control_function_performer (); void connect_to_context (Context *c); @@ -58,7 +58,7 @@ void Midi_control_function_performer::connect_to_context (Context *c) { c->events_below ()-> - add_listener (GET_LISTENER (announce_function_value_change), + add_listener (GET_LISTENER (Midi_control_function_performer, announce_function_value_change), ly_symbol2scm ("SetProperty")); } @@ -66,16 +66,14 @@ void Midi_control_function_performer::disconnect_from_context (Context *c) { c->events_below ()-> - remove_listener (GET_LISTENER (announce_function_value_change), + remove_listener (GET_LISTENER (Midi_control_function_performer, announce_function_value_change), ly_symbol2scm ("SetProperty")); } -IMPLEMENT_LISTENER (Midi_control_function_performer, - announce_function_value_change) void Midi_control_function_performer::announce_function_value_change (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); + Stream_event *ev = unsmob (sev); SCM sym = ev->get_property ("symbol"); if (!scm_is_symbol (sym)) return; @@ -115,6 +113,12 @@ Midi_control_function_performer::announce_function_value_change (SCM sev) } } +void +Midi_control_function_performer::boot () +{ + +} + ADD_TRANSLATOR (Midi_control_function_performer, /* doc */ "", @@ -125,6 +129,7 @@ ADD_TRANSLATOR (Midi_control_function_performer, /* read */ "midiBalance " "midiPanPosition " + "midiExpression " "midiReverbLevel " "midiChorusLevel ", diff --git a/lily/midi-item.cc b/lily/midi-item.cc index 54d00ff683..33dd9f11bd 100644 --- a/lily/midi-item.cc +++ b/lily/midi-item.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,6 +28,7 @@ #include "program-option.hh" #include "string-convert.hh" #include "warn.hh" +#include "lily-imports.hh" #define PITCH_WHEEL_CENTER 0x2000 #define PITCH_WHEEL_SEMITONE 0X1000 @@ -84,9 +85,8 @@ Midi_instrument::to_string () const Byte program_byte = 0; bool found = false; - 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); + SCM program = Lily::midi_program (ly_symbol2scm (audio_->str_.c_str ())); + found = (scm_is_true (program)); if (found) program_byte = (Byte) scm_to_int (program); else @@ -193,8 +193,10 @@ Midi_time_signature::to_string () const Midi_note::Midi_note (Audio_note *a) : Midi_channel_item (a), audio_ (a), - dynamic_byte_ (a->dynamic_ && a->dynamic_->volume_ >= 0 - ? Byte (a->dynamic_->volume_ * 0x7f) : Byte (0x5a)) + dynamic_byte_ (min (max (Byte ((a->dynamic_ && a->dynamic_->volume_ >= 0 + ? a->dynamic_->volume_ * 0x7f : 0x5a) + + a->extra_velocity_), + Byte (0)), Byte (0x7f))) { } @@ -391,6 +393,7 @@ Midi_control_function_value_change::to_string () const { 8, 40 }, // balance { 10, 42 }, // pan position + { 11, 43 }, // expression { 91, -1 }, // reverb level (only coarse resolution available) { 93, -1 } // chorus level (only coarse resolution available) }; @@ -423,5 +426,5 @@ Midi_control_function_value_change::to_string () const char const * Midi_item::name () const { - return this->class_name (); + return class_name (); } diff --git a/lily/midi-stream.cc b/lily/midi-stream.cc index 289bb1494a..d0f8531094 100644 --- a/lily/midi-stream.cc +++ b/lily/midi-stream.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -51,7 +51,7 @@ Midi_stream::write (const string &str) size_t written = fwrite (str.data (), sz, n, out_file_); if (written != sz * n) - warning (_f ("cannot write to file: `%s'", str.data ())); + warning (_f ("cannot write to file: `%s'", file_name_string_.c_str ())); } void diff --git a/lily/midi-walker.cc b/lily/midi-walker.cc index b97630b0d1..bc6c93dc56 100644 --- a/lily/midi-walker.cc +++ b/lily/midi-walker.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -52,13 +52,15 @@ audio_item_less (Audio_item *const a, return a->get_column ()->when_ < b->get_column ()->when_; } -Midi_walker::Midi_walker (Audio_staff *audio_staff, Midi_track *track) +Midi_walker::Midi_walker (Audio_staff *audio_staff, Midi_track *track, int start_tick) { track_ = track; index_ = 0; items_ = audio_staff->audio_items_; vector_sort (items_, audio_item_less); - last_tick_ = 0; + //Scores that begin with grace notes start at negative times. This + //is OK - MIDI output doesn't use absolute ticks, only differences. + last_tick_ = start_tick; percussion_ = audio_staff->percussion_; merge_unisons_ = audio_staff->merge_unisons_; } diff --git a/lily/minimal-page-breaking.cc b/lily/minimal-page-breaking.cc index 7ff43755b1..968c4bf9b7 100644 --- a/lily/minimal-page-breaking.cc +++ b/lily/minimal-page-breaking.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Nicolas Sceaux + Copyright (C) 2007--2015 Nicolas Sceaux LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/misc.cc b/lily/misc.cc index 58d0a6e9d3..6cafa2b50b 100644 --- a/lily/misc.cc +++ b/lily/misc.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -18,30 +18,10 @@ along with LilyPond. If not, see . */ -#include - #include "misc.hh" #include "offset.hh" #include "warn.hh" -/* - Return the 2-log, rounded down -*/ -int -intlog2 (int d) -{ - assert (d); - int i = 0; - while ((d != 1)) - { - d /= 2; - i++; - } - - assert (! (d / 2)); - return i; -} - double log_2 (double x) { @@ -97,20 +77,3 @@ camel_case_to_lisp_identifier (const string &in) return result; } - -Offset -get_point_in_y_direction (Offset orig, Real slope, Real dist, Direction dir) -{ - if (slope == infinity_f) - return orig + Offset (dir * dist, 0.0); - - Real x = slope == 0.0 ? 1.0 * dir : 1.0 * sign (slope) * dir; - Real y = slope * x; - Real angle = atan2 (y, x); - - complex orig_c (orig[X_AXIS], orig[Y_AXIS]); - complex to_move = polar (dist, angle); - complex res = orig_c + to_move; - - return Offset (real (res), imag (res)); -} diff --git a/lily/modified-font-metric.cc b/lily/modified-font-metric.cc index 1657cf5a9e..d1c80b66f0 100644 --- a/lily/modified-font-metric.cc +++ b/lily/modified-font-metric.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/module-scheme.cc b/lily/module-scheme.cc index 0da0445c9c..8ea17ddb26 100644 --- a/lily/module-scheme.cc +++ b/lily/module-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,7 +34,7 @@ module_define_closure_func (void *closure, SCM /* result */) { SCM module = (SCM) closure; - if (scm_variable_bound_p (val) == SCM_BOOL_T) + if (to_boolean (scm_variable_bound_p (val))) scm_module_define (module, key, scm_variable_ref (val)); return SCM_EOL; } @@ -67,9 +67,9 @@ ly_module_lookup (SCM module, SCM sym) /* Issue 2758: Guile V2 onward has a scm_module_variable API module. - Guile V1.8.7 only has a (module-variable) REPL function, however - using ly_lily_module_constant ("module-variable") and calling - the memoized result is slow. + Guile V1.8.7 only has a (module-variable) REPL function and we + can't import this via Scm_variable since that needs + ly_module_lookup itself. */ #if GUILEV1 return scm_sym2var (sym, scm_module_lookup_closure (module), SCM_BOOL_F); @@ -92,11 +92,11 @@ LY_DEFINE (ly_modules_lookup, "ly:modules-lookup", { SCM mod = scm_car (s); SCM v = ly_module_lookup (mod, sym); - if (SCM_VARIABLEP (v) && SCM_VARIABLE_REF (v) != SCM_UNDEFINED) + if (SCM_VARIABLEP (v) && !SCM_UNBNDP (SCM_VARIABLE_REF (v))) return scm_variable_ref (v); } - if (def != SCM_UNDEFINED) + if (!SCM_UNBNDP (def)) return def; return SCM_BOOL_F; } diff --git a/lily/moment-scheme.cc b/lily/moment-scheme.cc index e7ed72f093..740b6ee2c9 100644 --- a/lily/moment-scheme.cc +++ b/lily/moment-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -78,8 +78,8 @@ LY_DEFINE (ly_moment_sub, "ly:moment-sub", LY_ASSERT_SMOB (Moment, a, 1); LY_ASSERT_SMOB (Moment, b, 2); - Moment *ma = unsmob_moment (a); - Moment *mb = unsmob_moment (b); + Moment *ma = unsmob (a); + Moment *mb = unsmob (b); return (*ma - *mb).smobbed_copy (); } @@ -91,8 +91,8 @@ LY_DEFINE (ly_moment_add, "ly:moment-add", LY_ASSERT_SMOB (Moment, a, 1); LY_ASSERT_SMOB (Moment, b, 2); - Moment *ma = unsmob_moment (a); - Moment *mb = unsmob_moment (b); + Moment *ma = unsmob (a); + Moment *mb = unsmob (b); return (*ma + *mb).smobbed_copy (); } @@ -104,8 +104,8 @@ LY_DEFINE (ly_moment_mul, "ly:moment-mul", LY_ASSERT_SMOB (Moment, a, 1); LY_ASSERT_SMOB (Moment, b, 2); - Moment *ma = unsmob_moment (a); - Moment *mb = unsmob_moment (b); + Moment *ma = unsmob (a); + Moment *mb = unsmob (b); return (*ma * * mb).smobbed_copy (); } @@ -116,8 +116,8 @@ LY_DEFINE (ly_moment_div, "ly:moment-div", LY_ASSERT_SMOB (Moment, a, 1); LY_ASSERT_SMOB (Moment, b, 2); - Moment *ma = unsmob_moment (a); - Moment *mb = unsmob_moment (b); + Moment *ma = unsmob (a); + Moment *mb = unsmob (b); return (*ma / * mb).smobbed_copy (); } @@ -129,8 +129,8 @@ LY_DEFINE (ly_moment_mod, "ly:moment-mod", LY_ASSERT_SMOB (Moment, a, 1); LY_ASSERT_SMOB (Moment, b, 2); - Moment *ma = unsmob_moment (a); - Moment *mb = unsmob_moment (b); + Moment *ma = unsmob (a); + Moment *mb = unsmob (b); return (*ma % * mb).smobbed_copy (); } @@ -140,7 +140,7 @@ LY_DEFINE (ly_moment_grace, "ly:moment-grace", { LY_ASSERT_SMOB (Moment, mom, 1); - return ly_rational2scm (unsmob_moment (mom)->grace_part_); + return ly_rational2scm (unsmob (mom)->grace_part_); } LY_DEFINE (ly_moment_grace_numerator, "ly:moment-grace-numerator", @@ -149,7 +149,7 @@ LY_DEFINE (ly_moment_grace_numerator, "ly:moment-grace-numerator", { LY_ASSERT_SMOB (Moment, mom, 1); - Moment *ma = unsmob_moment (mom); + Moment *ma = unsmob (mom); return scm_from_int64 (ma->grace_part_.numerator ()); } @@ -159,7 +159,7 @@ LY_DEFINE (ly_moment_grace_denominator, "ly:moment-grace-denominator", "Extract denominator from grace timing.") { LY_ASSERT_SMOB (Moment, mom, 1); - Moment *ma = unsmob_moment (mom); + Moment *ma = unsmob (mom); return scm_from_int64 (ma->grace_part_.denominator ()); } @@ -170,7 +170,7 @@ LY_DEFINE (ly_moment_main, "ly:moment-main", { LY_ASSERT_SMOB (Moment, mom, 1); - return ly_rational2scm (unsmob_moment (mom)->main_part_); + return ly_rational2scm (unsmob (mom)->main_part_); } LY_DEFINE (ly_moment_main_numerator, "ly:moment-main-numerator", @@ -178,7 +178,7 @@ LY_DEFINE (ly_moment_main_numerator, "ly:moment-main-numerator", "Extract numerator from main timing.") { LY_ASSERT_SMOB (Moment, mom, 1); - Moment *ma = unsmob_moment (mom); + Moment *ma = unsmob (mom); return scm_from_int64 (ma->main_part_.numerator ()); } @@ -188,7 +188,7 @@ LY_DEFINE (ly_moment_main_denominator, "ly:moment-main-denominator", "Extract denominator from main timing.") { LY_ASSERT_SMOB (Moment, mom, 1); - Moment *ma = unsmob_moment (mom); + Moment *ma = unsmob (mom); return scm_from_int64 (ma->main_part_.denominator ()); } @@ -200,8 +200,8 @@ LY_DEFINE (ly_moment_less_p, "ly:moment (a); + Moment *mb = unsmob (b); return ly_bool2scm (*ma < *mb); } diff --git a/lily/moment.cc b/lily/moment.cc index df1a405779..20c1f58a0b 100644 --- a/lily/moment.cc +++ b/lily/moment.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,24 +43,15 @@ Moment::Moment (Rational m) grace_part_ = Rational (0); } -#include "ly-smobs.icc" -IMPLEMENT_SIMPLE_SMOBS (Moment); -IMPLEMENT_TYPE_P (Moment, "ly:moment?"); +const char * const Moment::type_p_name_ = "ly:moment?"; -SCM -Moment::mark_smob (SCM) -{ - return SCM_EOL; -} int -Moment::print_smob (SCM s, SCM port, scm_print_state *) +Moment::print_smob (SCM port, scm_print_state *) const { - Moment *r = (Moment *) SCM_CELL_WORD_1 (s); - scm_puts ("#to_string (); + string str = to_string (); scm_puts ((char *)str.c_str (), port); scm_puts (">", port); @@ -80,8 +71,8 @@ Moment::as_scheme () const SCM Moment::equal_p (SCM a, SCM b) { - Moment *m1 = unsmob_moment (a); - Moment *m2 = unsmob_moment (b); + Moment *m1 = unsmob (a); + Moment *m2 = unsmob (b); return (*m1 == *m2) ? SCM_BOOL_T : SCM_BOOL_F; } @@ -195,7 +186,7 @@ operator << (ostream &os, Moment const &m) Moment robust_scm2moment (SCM m, Moment d) { - Moment *p = unsmob_moment (m); + Moment *p = unsmob (m); if (!p) return d; else @@ -205,6 +196,5 @@ robust_scm2moment (SCM m, Moment d) bool moment_less (SCM a, SCM b) { - return *unsmob_moment (a) < *unsmob_moment (b); + return *unsmob (a) < *unsmob (b); } - diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index 7fede1a3e7..04ef91fc88 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -39,57 +39,57 @@ public: protected: void process_music (); - void stop_translation_timestep (); void start_translation_timestep (); - virtual void finalize (); - DECLARE_TRANSLATOR_LISTENER (multi_measure_rest); - DECLARE_TRANSLATOR_LISTENER (multi_measure_text); + void listen_multi_measure_rest (Stream_event *); + void listen_multi_measure_text (Stream_event *); + +private: + void add_bound_item_to_grobs (Item *); + void clear_lapsed_events (const Moment &now); + bool grobs_initialized () const { return mmrest_; } + void initialize_grobs (); + void reset_grobs (); + void set_measure_count (int n); private: - Stream_event *rest_ev_; vector text_events_; - int start_measure_; - Rational last_main_moment_; + // text_[0] is a MultiMeasureRestNumber grob + // the rest are optional MultiMeasureRestText grobs + vector text_; + Stream_event *rest_ev_; + Spanner *mmrest_; Moment stop_moment_; - - bool bar_seen_; + int start_measure_; + // Ugh, this is a kludge - need this for multi-measure-rest-grace.ly Item *last_command_item_; - Spanner *last_rest_; - Spanner *mmrest_; - - vector numbers_; - vector last_numbers_; + bool first_time_; }; Multi_measure_rest_engraver::Multi_measure_rest_engraver () + : rest_ev_ (0), + mmrest_ (0), + start_measure_ (0), + last_command_item_ (0), + first_time_ (true) { - last_command_item_ = 0; - - /* - For the start of a score. - */ - bar_seen_ = true; - start_measure_ = 0; - mmrest_ = 0; - last_rest_ = 0; - rest_ev_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Multi_measure_rest_engraver, multi_measure_rest); void Multi_measure_rest_engraver::listen_multi_measure_rest (Stream_event *ev) { /* FIXME: Should use ASSIGN_EVENT_ONCE. Can't do that yet because of the kill-mm-rests hack in part-combine-iterator. */ rest_ev_ = ev; - stop_moment_ = now_mom () + get_event_length (rest_ev_, now_mom ()); + const Moment now (now_mom ()); + stop_moment_ = now + get_event_length (rest_ev_, now); /* if (ASSIGN_EVENT_ONCE (rest_ev_, ev)) stop_moment_ = now_mom () + get_event_length (rest_ev_); */ + + clear_lapsed_events (now); } -IMPLEMENT_TRANSLATOR_LISTENER (Multi_measure_rest_engraver, multi_measure_text); void Multi_measure_rest_engraver::listen_multi_measure_text (Stream_event *ev) { @@ -97,163 +97,157 @@ Multi_measure_rest_engraver::listen_multi_measure_text (Stream_event *ev) } void -Multi_measure_rest_engraver::process_music () +Multi_measure_rest_engraver::add_bound_item_to_grobs (Item *item) { - if (rest_ev_ && !mmrest_ - && stop_moment_ > now_mom ()) + add_bound_item (mmrest_, item); + for (vsize i = 0; i < text_.size (); ++i) + add_bound_item (text_[i], item); +} + +void +Multi_measure_rest_engraver::clear_lapsed_events (const Moment &now) +{ + if (now.main_part_ >= stop_moment_.main_part_) { - mmrest_ = make_spanner ("MultiMeasureRest", rest_ev_->self_scm ()); + rest_ev_ = 0; + text_events_.clear (); + } +} - Spanner *sp - = make_spanner ("MultiMeasureRestNumber", rest_ev_->self_scm ()); - numbers_.push_back (sp); +void +Multi_measure_rest_engraver::initialize_grobs () +{ + mmrest_ = make_spanner ("MultiMeasureRest", rest_ev_->self_scm ()); + text_.push_back (make_spanner ("MultiMeasureRestNumber", + rest_ev_->self_scm ())); - if (text_events_.size ()) + if (text_events_.size ()) + { + for (vsize i = 0; i < text_events_.size (); i++) { - for (vsize i = 0; i < text_events_.size (); i++) - { - Stream_event *e = text_events_[i]; - Spanner *sp - = make_spanner ("MultiMeasureRestText", e->self_scm ()); - SCM t = e->get_property ("text"); - SCM dir = e->get_property ("direction"); - sp->set_property ("text", t); - if (is_direction (dir)) - sp->set_property ("direction", dir); - - numbers_.push_back (sp); - } + Stream_event *e = text_events_[i]; + Spanner *sp = make_spanner ("MultiMeasureRestText", e->self_scm ()); + SCM t = e->get_property ("text"); + SCM dir = e->get_property ("direction"); + sp->set_property ("text", t); + if (is_direction (dir)) + sp->set_property ("direction", dir); + + text_.push_back (sp); + } - /* - Stack different scripts. - */ - for (DOWN_and_UP (d)) + /* + Stack different scripts. + */ + for (DOWN_and_UP (d)) + { + SCM dir = scm_from_int (d); + Grob *last = 0; + for (vsize i = 0; i < text_.size (); i++) { - Grob *last = 0; - for (vsize i = 0; i < numbers_.size (); i++) + if (scm_is_eq (dir, text_[i]->get_property ("direction"))) { - if (scm_from_int (d) == numbers_[i]->get_property ("direction")) - { - if (last) - Side_position_interface::add_support (numbers_[i], last); - last = numbers_[i]; - } + if (last) + Side_position_interface::add_support (text_[i], last); + last = text_[i]; } } } + } - for (vsize i = 0; i < numbers_.size (); i++) - { - Side_position_interface::add_support (numbers_[i], mmrest_); - numbers_[i]->set_parent (mmrest_, Y_AXIS); - } - - start_measure_ - = scm_to_int (get_property ("internalBarNumber")); + for (vsize i = 0; i < text_.size (); i++) + { + Side_position_interface::add_support (text_[i], mmrest_); + text_[i]->set_parent (mmrest_, Y_AXIS); + text_[i]->set_parent (mmrest_, X_AXIS); } +} - bar_seen_ = bar_seen_ || scm_is_string (get_property ("whichBar")); +void +Multi_measure_rest_engraver::reset_grobs () +{ + text_.clear (); + mmrest_ = 0; } void -Multi_measure_rest_engraver::stop_translation_timestep () +Multi_measure_rest_engraver::set_measure_count (int n) { - /* We cannot do this earlier, as breakableSeparationItem is not yet - there. + SCM n_scm = scm_from_int (n); + assert (mmrest_); + mmrest_->set_property ("measure-count", n_scm); - Actually, we no longer use breakableSeparationItem -- should this be moved? - -- jneem */ - if (bar_seen_) + Grob *g = text_[0]; // the MultiMeasureRestNumber + assert (g); + if (scm_is_null (g->get_property ("text"))) { - Grob *cmc = unsmob_grob (get_property ("currentCommandColumn")); - - /* Ugh, this is a kludge - need this for multi-measure-rest-grace.ly */ - last_command_item_ = dynamic_cast (cmc); + SCM thres = get_property ("restNumberThreshold"); + int t = 1; + if (scm_is_number (thres)) + t = scm_to_int (thres); + + if (n <= t) + g->suicide (); + else + { + SCM text = scm_number_to_string (n_scm, scm_from_int (10)); + g->set_property ("text", text); + } } +} - if (last_command_item_ && (mmrest_ || last_rest_)) +void +Multi_measure_rest_engraver::process_music () +{ + const bool measure_end + = scm_is_string (get_property ("whichBar")) + && (robust_scm2moment (get_property ("measurePosition"), + Moment (0)).main_part_ == Rational (0)); + + if (measure_end || first_time_) { - if (last_rest_) + last_command_item_ = unsmob (get_property ("currentCommandColumn")); + + // Finalize the current grobs. + if (grobs_initialized ()) { - add_bound_item (last_rest_, last_command_item_); - for (vsize i = 0; i < last_numbers_.size (); i++) - add_bound_item (last_numbers_[i], last_command_item_); + int curr_measure = scm_to_int (get_property ("internalBarNumber")); + set_measure_count (curr_measure - start_measure_); + if (last_command_item_) + add_bound_item_to_grobs (last_command_item_); + reset_grobs (); } + } - if (mmrest_) - { - add_bound_item (mmrest_, last_command_item_); - for (vsize i = 0; i < numbers_.size (); i++) - add_bound_item (numbers_[i], last_command_item_); + // Create new grobs if a rest event is (still) active. + if (!grobs_initialized () && rest_ev_) + { + initialize_grobs (); + text_events_.clear (); + if (last_command_item_) + { + add_bound_item_to_grobs (last_command_item_); last_command_item_ = 0; } - } - Moment mp (robust_scm2moment (get_property ("measurePosition"), Moment (0))); - if (last_rest_) - { - last_rest_ = 0; - last_numbers_.clear (); + start_measure_ = scm_to_int (get_property ("internalBarNumber")); } - text_events_.clear (); - bar_seen_ = false; + first_time_ = false; } void Multi_measure_rest_engraver::start_translation_timestep () { - if (now_mom ().main_part_ >= stop_moment_.main_part_) - rest_ev_ = 0; - - Moment mp (robust_scm2moment (get_property ("measurePosition"), Moment (0))); - - Moment now = now_mom (); - if (mmrest_ - && now.main_part_ != last_main_moment_ - && mp.main_part_ == Rational (0)) - { - last_rest_ = mmrest_; - last_numbers_ = numbers_; - - int cur = scm_to_int (get_property ("internalBarNumber")); - int num = cur - start_measure_; - - /* - We can't plug a markup directly into the grob, since the - measure-count determines the formatting of the mmrest. - */ - last_rest_->set_property ("measure-count", scm_from_int (num)); - - mmrest_ = 0; - numbers_.clear (); - - Grob *last = last_numbers_.size () ? last_numbers_[0] : 0; - if (last && last->get_property ("text") == SCM_EOL) - { - SCM thres = get_property ("restNumberThreshold"); - int t = 1; - if (scm_is_number (thres)) - t = scm_to_int (thres); - - if (num <= t) - last->suicide (); - else - { - SCM text - = scm_number_to_string (scm_from_int (num), scm_from_int (10)); - last->set_property ("text", text); - } - } - } - - last_main_moment_ = now.main_part_; + clear_lapsed_events (now_mom ()); } void -Multi_measure_rest_engraver::finalize () +Multi_measure_rest_engraver::boot () { + ADD_LISTENER (Multi_measure_rest_engraver, multi_measure_rest); + ADD_LISTENER (Multi_measure_rest_engraver, multi_measure_text); } ADD_TRANSLATOR (Multi_measure_rest_engraver, @@ -272,7 +266,8 @@ ADD_TRANSLATOR (Multi_measure_rest_engraver, "internalBarNumber " "restNumberThreshold " "currentCommandColumn " - "measurePosition ", + "measurePosition " + "whichBar ", /* write */ "" diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index e823c298e3..7f2a720d6f 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,7 +20,6 @@ #include "multi-measure-rest.hh" #include "directional-element-interface.hh" -#include "duration.hh" #include "font-interface.hh" #include "international.hh" #include "lookup.hh" @@ -63,7 +62,7 @@ MAKE_SCHEME_CALLBACK (Multi_measure_rest, percent, 1); SCM Multi_measure_rest::percent (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Spanner *sp = dynamic_cast (me); Stencil r = Percent_repeat_item_interface::x_percent (me, 1); @@ -97,7 +96,7 @@ MAKE_SCHEME_CALLBACK (Multi_measure_rest, print, 1); SCM Multi_measure_rest::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Spanner *sp = dynamic_cast (me); Interval sp_iv = bar_width (sp); @@ -121,7 +120,7 @@ MAKE_SCHEME_CALLBACK (Multi_measure_rest, height, 1); SCM Multi_measure_rest::height (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real space = 1000000; // something very large... @@ -132,7 +131,7 @@ Multi_measure_rest::height (SCM smob) } int -calc_closest_duration_log (Grob *me, double duration, bool force_round_up, bool paranoid) +calc_closest_duration_log (Grob *me, double duration, bool force_round_up) { bool round_up = force_round_up || to_boolean (me->get_property ("round-up-to-longer-rest")); @@ -147,9 +146,8 @@ calc_closest_duration_log (Grob *me, double duration, bool force_round_up, bool int maximum_usable_duration_log = 15; SCM duration_logs_list = me->get_property ("usable-duration-logs"); - if (paranoid - && (to_boolean (scm_null_p (duration_logs_list)) - || !to_boolean (scm_list_p (duration_logs_list)))) + if (to_boolean (scm_null_p (duration_logs_list)) + || !to_boolean (scm_list_p (duration_logs_list))) { warning (_ ("usable-duration-logs must be a non-empty list." " Falling back to whole rests.")); @@ -187,18 +185,17 @@ calc_closest_duration_log (Grob *me, double duration, bool force_round_up, bool } int -calc_measure_duration_log (Grob *me, bool paranoid) +calc_measure_duration_log (Grob *me) { SCM sml = dynamic_cast (me)->get_bound (LEFT) ->get_property ("measure-length"); - Rational ml = (unsmob_moment (sml)) ? unsmob_moment (sml)->main_part_ + Rational ml = (unsmob (sml)) ? unsmob (sml)->main_part_ : Rational (1); double measure_duration = ml.Rational::to_double (); bool force_round_up = to_boolean (scm_list_p (scm_member (scm_cons (scm_from_int64 (ml.numerator ()), scm_from_int64 (ml.denominator ())), me->get_property ("round-up-exceptions")))); - - return calc_closest_duration_log (me, measure_duration, force_round_up, paranoid); + return calc_closest_duration_log (me, measure_duration, force_round_up); } Stencil @@ -221,17 +218,17 @@ Multi_measure_rest::symbol_stencil (Grob *me, Real space) } Font_metric *musfont = Font_interface::get_default_font (me); - int mdl = calc_measure_duration_log (me, true); + int mdl = calc_measure_duration_log (me); if (measure_count == 1) { - if (me->get_property ("staff-position") == SCM_EOL) + if (scm_is_null (me->get_property ("staff-position"))) { int dir = get_grob_direction (me); Real pos = Rest::staff_position_internal (me, mdl, dir); me->set_property ("staff-position", scm_from_double (pos)); } - + Stencil s = musfont->find_by_name (Rest::glyph_name (me, mdl, "", true, 0.0)); s.translate_axis ((space - s.extent (X_AXIS).length ()) / 2, X_AXIS); @@ -279,7 +276,7 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measure_cou SCM mols = SCM_EOL; int symbol_count = 0; Real symbols_width = 0.0; - double total_duration = measure_count * pow (2.0, -calc_measure_duration_log (me, true)); + double total_duration = measure_count * pow (2.0, -calc_measure_duration_log (me)); SCM staff_position = me->get_property ("staff-position"); @@ -299,7 +296,7 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measure_cou while (total_duration > 0) { - int dl = calc_closest_duration_log (me, total_duration, false, true); + int dl = calc_closest_duration_log (me, total_duration, false); double duration = pow (2.0, -dl); total_duration -= duration; @@ -329,7 +326,7 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measure_cou 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)), + mol.add_at_edge (X_AXIS, LEFT, *unsmob (scm_car (s)), inner_padding); mol.align_to (X_AXIS, LEFT); mol.translate_axis (outer_padding_factor * inner_padding, X_AXIS); @@ -357,21 +354,26 @@ Multi_measure_rest::calculate_spacing_rods (Grob *me, Real length) Item *ri = sp->get_bound (RIGHT)->get_column (); Item *lb = li->find_prebroken_piece (RIGHT); Item *rb = ri->find_prebroken_piece (LEFT); - Grob *spacing = unsmob_grob (li->get_object ("spacing")); - if (!spacing) - spacing = unsmob_grob (ri->get_object ("spacing")); + + Grob *spacing = unsmob (li->get_object ("spacing")); if (!spacing) - me->warning (_ ("Using naive multi measure rest spacing.")); - else + spacing = unsmob (ri->get_object ("spacing")); + if (spacing) { Spacing_options options; options.init_from_grob (me); - int dl = calc_measure_duration_log (me, false); - Duration dur = Duration (dl, 0); - Rational rat = dur.get_length (); - length = max (length, options.get_duration_space (rat)); + Moment mlen = robust_scm2moment (li->get_property ("measure-length"), + Moment (1)); + length += robust_scm2double (li->get_property ("full-measure-extra-space"), 0.0) + + options.get_duration_space (mlen.main_part_) + + (robust_scm2double (me->get_property ("space-increment"), 0.0) + * log_2 (robust_scm2int (me->get_property ("measure-count"), 1))); } + length += 2 * robust_scm2double (me->get_property ("bound-padding"), 0.0); + + Real minlen = robust_scm2double (me->get_property ("minimum-length"), 0.0); + Item *combinations[4][2] = {{li, ri}, {lb, ri}, {li, rb}, @@ -390,12 +392,8 @@ Multi_measure_rest::calculate_spacing_rods (Grob *me, Real length) rod.item_drul_[LEFT] = li; rod.item_drul_[RIGHT] = ri; - rod.distance_ = Paper_column::minimum_distance (li, ri) - + length - + 2 * robust_scm2double (me->get_property ("bound-padding"), 1.0); - - Real minlen = robust_scm2double (me->get_property ("minimum-length"), 0); - rod.distance_ = max (rod.distance_, minlen); + rod.distance_ = max (Paper_column::minimum_distance (li, ri) + length, + minlen); rod.add_to_cols (); } } @@ -404,7 +402,7 @@ MAKE_SCHEME_CALLBACK (Multi_measure_rest, set_spacing_rods, 1); SCM Multi_measure_rest::set_spacing_rods (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real sym_width = symbol_stencil (me, 0.0).extent (X_AXIS).length (); calculate_spacing_rods (me, sym_width); @@ -415,7 +413,7 @@ MAKE_SCHEME_CALLBACK (Multi_measure_rest, set_text_rods, 1); SCM Multi_measure_rest::set_text_rods (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Stencil *stil = me->get_stencil (); /* FIXME uncached */ @@ -438,6 +436,7 @@ ADD_INTERFACE (Multi_measure_rest, "minimum-length " "round-up-exceptions " "round-up-to-longer-rest " + "space-increment " "spacing-pair " "thick-thickness " "usable-duration-logs " diff --git a/lily/music-function-scheme.cc b/lily/music-function-scheme.cc index e9e9a68ec6..5246b6dbe6 100644 --- a/lily/music-function-scheme.cc +++ b/lily/music-function-scheme.cc @@ -1,28 +1,21 @@ #include "music-function.hh" -LY_DEFINE (ly_music_function_p, "ly:music-function?", 1, 0, 0, - (SCM x), - "Is @var{x} a @code{music-function}?") -{ - return is_music_function (x) ? SCM_BOOL_T : SCM_BOOL_F; -} - LY_DEFINE (ly_music_function_extract, "ly:music-function-extract", 1, 0, 0, (SCM x), "Return the Scheme function inside@tie{}@var{x}.") { - LY_ASSERT_TYPE (is_music_function, x, 1); + LY_ASSERT_SMOB (Music_function, x, 1); - return get_music_function_transform (x); + return unsmob (x)->get_function (); } LY_DEFINE (ly_music_function_signature, "ly:music-function-signature", 1, 0, 0, (SCM x), "Return the function signature inside@tie{}@var{x}.") { - LY_ASSERT_TYPE (is_music_function, x, 1); + LY_ASSERT_SMOB (Music_function, x, 1); - return get_music_function_signature (x); + return unsmob (x)->get_signature (); } LY_DEFINE (ly_make_music_function, "ly:make-music-function", 2, 0, 0, @@ -48,5 +41,5 @@ LY_DEFINE (ly_make_music_function, "ly:make-music-function", 2, 0, 0, } } - return make_music_function (signature, func); + return Music_function::make_smob (signature, func); } diff --git a/lily/music-function.cc b/lily/music-function.cc index f206b6b382..c252291736 100644 --- a/lily/music-function.cc +++ b/lily/music-function.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,72 +18,140 @@ */ #include "music-function.hh" - +#include "lily-parser.hh" +#include "input.hh" #include "music.hh" -#include "ly-smobs.icc" +#include "fluid.hh" +#include "lily-imports.hh" -class Musicfunction -{ - DECLARE_SIMPLE_SMOBS (Musicfunction); - SCM signature_; - SCM function_; -public: - Musicfunction (SCM signature, SCM function): - signature_ (signature), function_ (function) { } - SCM get_function () { return function_; } - SCM get_signature () { return signature_; } -}; - -IMPLEMENT_SIMPLE_SMOBS (Musicfunction); -IMPLEMENT_DEFAULT_EQUAL_P (Musicfunction); +const char * const Music_function::type_p_name_ = "ly:music-function?"; /* Print a textual represenation of the smob to a given port. */ int -Musicfunction::print_smob (SCM b, SCM port, scm_print_state *) +Music_function::print_smob (SCM port, scm_print_state *) const { scm_puts ("#get_function (), port); + scm_write (get_function (), port); scm_puts (">", port); /* Non-zero means success. */ return 1; } -bool -is_music_function (SCM music_function) -{ - return Musicfunction::unsmob (music_function); -} - -SCM -get_music_function_transform (SCM music_function) -{ - if (!is_music_function (music_function)) - return SCM_UNDEFINED; - - return Musicfunction::unsmob (music_function)->get_function (); -} +// Used for attaching location information to music expressions in +// default arguments and return values. Music expressions taken from +// the call signature need to be cloned since they are not suitable +// for multiple use. -SCM -make_music_function (SCM signature, SCM func) +static SCM +with_loc (SCM arg, Fluid &loc, bool clone = true) { - return Musicfunction (signature, func).smobbed_copy (); + if (Music *m = unsmob (arg)) + { + if (clone) + { + m = m->clone (); + arg = m->unprotect (); + } + if (Input *in = unsmob (loc)) + m->set_spot (*in); + } + return arg; } -SCM -get_music_function_signature (SCM music_function) -{ - if (!is_music_function (music_function)) - return SCM_UNDEFINED; - - return Musicfunction::unsmob (music_function)->get_signature (); -} +// A music function call implies walking through the call signature +// and matching the actual argument list to the signature. This +// process is not 1:1 due to the possible presence of optional +// arguments which are handled quite differently from how GUILE/Scheme +// usually deal with optional arguments. +// +// The argument matching here intentionally closely tracks the +// semantics of calls via the LilyPond parser as described in +// : +// if an optional argument predicate does not match the next argument +// from the actual argument list, the default given in the call +// signature is used instead and all following optional arguments are +// unconditionally substituted in a similar manner. +// +// This skipping of optional arguments can be explicitly initiated by +// using \default in LilyPond. The respective value to use for a call +// via Scheme is *unspecified*. SCM -Musicfunction::mark_smob (SCM s) +Music_function::call (SCM rest) { - Musicfunction *p = Musicfunction::unsmob (s); - scm_gc_mark (p->signature_); - ASSERT_LIVE_IS_ALLOWED (s); - return p->function_; + Fluid location (Lily::f_location); + + // (car (ly:music-signature self_scm())) is the return type, skip it + SCM signature = scm_cdr (get_signature ()); + + // The main loop just processes the signature in sequence, and the + // resulting actual arguments are accumulated in reverse order in args + + SCM args = SCM_EOL; + + while (scm_is_pair (rest) && scm_is_pair (signature)) + { + SCM arg = scm_car (rest); + SCM pred = scm_car (signature); + if (!scm_is_pair (pred)) + { + // non-optional argument + if (scm_is_false (scm_call_1 (pred, arg))) + { + Syntax::argument_error (scm_oneplus (scm_length (args)), + pred, arg); + SCM val = scm_car (get_signature ()); + val = scm_is_pair (val) ? scm_cdr (val) : SCM_BOOL_F; + return with_loc (val, location); + } + } + // If the predicate is not a function but a pair, it + // signifies an optional argument. This is not quite the + // form declared to define-music-function (which is always + // a proper list) but a pair of predicate function and + // default value. + // + // Fall through to default argument processing when optional + // argument predicate matches + else if (scm_is_false (scm_call_1 (scm_car (pred), arg))) + { + // optional argument, non-match + // *unspecified* is the same as an explicit \default: skip it + if (scm_is_eq (arg, SCM_UNSPECIFIED)) + rest = scm_cdr (rest); + // Replace this and all following optional arguments with + // their defaults: + do { + args = scm_cons (with_loc (scm_cdr (pred), location), args); + signature = scm_cdr (signature); + if (!scm_is_pair (signature)) + break; + pred = scm_car (signature); + } while (scm_is_pair (pred)); + continue; + } + // Normal processing of accepted argument + signature = scm_cdr (signature); + args = scm_cons (arg, args); + rest = scm_cdr (rest); + } + + if (scm_is_pair (rest) || scm_is_pair (signature)) + scm_wrong_num_args (self_scm ()); + + SCM res = scm_apply_0 (get_function (), scm_reverse_x (args, SCM_EOL)); + + SCM pred = scm_car (get_signature ()); + // The return type predicate may have the form of a pair in which + // the car is the actual predicate and the cdr is the surrogate + // return value in the error case, to be extracted by + // music-function-call-error. + if (scm_is_pair (pred)) + pred = scm_car (pred); + + if (scm_is_true (scm_call_1 (pred, res))) + return with_loc (res, location, false); + + return Syntax::music_function_call_error (self_scm (), res); } diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc index 6ba70eb63d..a7a06ff0d8 100644 --- a/lily/music-iterator.cc +++ b/lily/music-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,6 @@ using namespace std; #include "music-wrapper-iterator.hh" #include "simple-music-iterator.hh" -#include "ly-smobs.icc" Music_iterator::Music_iterator () { @@ -38,11 +37,6 @@ Music_iterator::Music_iterator () smobify_self (); } -Music_iterator::Music_iterator (Music_iterator const &) -{ - assert (false); -} - Music_iterator::~Music_iterator () { } @@ -91,7 +85,7 @@ Music_iterator::get_static_get_iterator (Music *m) if (ly_is_procedure (ctor)) { iter = scm_call_0 (ctor); - p = unsmob_iterator (iter); + p = unsmob (iter); } else { @@ -138,9 +132,12 @@ Music_iterator::init_context (Music *m, Context *report) void Music_iterator::substitute_outlet (Context *f, Context *t) { - if (get_outlet () == f) - set_context (t); - derived_substitute (f, t); + if (f != t) + { + if (get_outlet () == f) + set_context (t); + derived_substitute (f, t); + } } void @@ -152,7 +149,7 @@ SCM Music_iterator::get_iterator (Music *m) const { SCM ip = get_static_get_iterator (m); - Music_iterator *p = unsmob_iterator (ip); + Music_iterator *p = unsmob (ip); p->init_context (m, get_outlet ()); @@ -193,16 +190,12 @@ Music_iterator::get_music () const /****************************************************************/ -IMPLEMENT_TYPE_P (Music_iterator, "ly:iterator?"); -IMPLEMENT_SMOBS (Music_iterator); -IMPLEMENT_DEFAULT_EQUAL_P (Music_iterator); +const char * const Music_iterator::type_p_name_ = "ly:iterator?"; SCM -Music_iterator::mark_smob (SCM smob) +Music_iterator::mark_smob () const { - Music_iterator *mus = (Music_iterator *)SCM_CELL_WORD_1 (smob); - - mus->derived_mark (); + derived_mark (); /* Careful with GC, although we intend the following as pointers only, we _must_ mark them. @@ -210,21 +203,20 @@ Music_iterator::mark_smob (SCM smob) /* Use handle_ directly as get_outlet is a virtual function and we need to protect the context until Music_iterator::quit is being run. */ - if (mus->handle_.get_context ()) - scm_gc_mark (mus->handle_.get_context ()->self_scm ()); - if (mus->music_) - scm_gc_mark (mus->music_->self_scm ()); + if (handle_.get_context ()) + scm_gc_mark (handle_.get_context ()->self_scm ()); + if (music_) + scm_gc_mark (music_->self_scm ()); return SCM_EOL; } int -Music_iterator::print_smob (SCM sm, SCM port, scm_print_state *) +Music_iterator::print_smob (SCM port, scm_print_state *) const { char s[1000]; - Music_iterator *iter = unsmob_iterator (sm); - sprintf (s, "#<%s>", iter->class_name ()); + sprintf (s, "#<%s>", class_name ()); scm_puts (s, port); return 1; } diff --git a/lily/music-output.cc b/lily/music-output.cc index dfb8b4e46b..9e8cc9ff9a 100644 --- a/lily/music-output.cc +++ b/lily/music-output.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,6 @@ #include "music-output.hh" -#include "ly-smobs.icc" Music_output::Music_output () { @@ -40,25 +39,20 @@ Music_output::derived_mark () const { } -IMPLEMENT_SMOBS (Music_output); -IMPLEMENT_DEFAULT_EQUAL_P (Music_output); -IMPLEMENT_TYPE_P (Music_output, "ly:music-output?"); +const char * const Music_output::type_p_name_ = "ly:music-output?"; SCM -Music_output::mark_smob (SCM s) +Music_output::mark_smob () const { - Music_output *sc = (Music_output *) SCM_CELL_WORD_1 (s); - - sc->derived_mark (); + derived_mark (); return SCM_EOL; } int -Music_output::print_smob (SCM s, SCM p, scm_print_state *) +Music_output::print_smob (SCM p, scm_print_state *) const { - Music_output *sc = (Music_output *) SCM_CELL_WORD_1 (s); scm_puts ("#<", p); - scm_puts (sc->class_name (), p); + scm_puts (class_name (), p); scm_puts (">", p); return 1; diff --git a/lily/music-scheme.cc b/lily/music-scheme.cc index dc2d9a6aa2..de5442e966 100644 --- a/lily/music-scheme.cc +++ b/lily/music-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,8 @@ #include "music.hh" #include "duration.hh" +#include "input.hh" +#include "lily-imports.hh" #include "program-option.hh" #include "warn.hh" @@ -28,8 +30,8 @@ LY_DEFINE (ly_music_length, "ly:music-length", "Get the length of music expression @var{mus} and return" " it as a @code{Moment} object.") { - LY_ASSERT_TYPE (unsmob_music, mus, 1); - Music *sc = unsmob_music (mus); + LY_ASSERT_SMOB (Music, mus, 1); + Music *sc = unsmob (mus); return sc->get_length ().smobbed_copy (); } @@ -39,7 +41,7 @@ LY_DEFINE (ly_music_property, "ly:music-property", " @var{mus}. If no value is found, return @var{val} or" " @code{'()} if @var{val} is not specified.") { - LY_ASSERT_TYPE (unsmob_music, mus, 1); + LY_ASSERT_SMOB (Music, mus, 1); return ly_prob_property (mus, sym, val); } @@ -48,7 +50,7 @@ LY_DEFINE (ly_music_set_property_x, "ly:music-set-property!", "Set property @var{sym} in music expression @var{mus} to" " @var{val}.") { - LY_ASSERT_TYPE (unsmob_music, mus, 1); + LY_ASSERT_SMOB (Music, mus, 1); return ly_prob_set_property_x (mus, sym, val); } @@ -71,14 +73,14 @@ LY_DEFINE (ly_music_p, "ly:music?", 1, 0, 0, (SCM obj), "Is @var{obj} a music object?") { - return scm_from_bool (unsmob_music (obj)); + return ly_bool2scm (unsmob (obj)); } LY_DEFINE (ly_event_p, "ly:event?", 1, 0, 0, (SCM obj), "Is @var{obj} a proper (non-rhythmic) event object?") { - if (Music *m = unsmob_music (obj)) + if (Music *m = unsmob (obj)) { return scm_from_bool (m->is_mus_type ("post-event")); } @@ -92,8 +94,8 @@ LY_DEFINE (ly_music_mutable_properties, "ly:music-mutable-properties", " The immutable properties are not available, since they are" " constant and initialized by the @code{make-music} function.") { - LY_ASSERT_TYPE (unsmob_music, mus, 1); - Music *m = unsmob_music (mus); + LY_ASSERT_SMOB (Music, mus, 1); + Music *m = unsmob (mus); return m->get_property_alist (true); } @@ -101,42 +103,69 @@ LY_DEFINE (ly_music_list_p, "ly:music-list?", 1, 0, 0, (SCM lst), "Is @var{lst} a list of music objects?") { - if (scm_list_p (lst) == SCM_BOOL_T) - while (scm_is_pair (lst)) - { - if (!unsmob_music (scm_car (lst))) - return SCM_BOOL_F; - lst = scm_cdr (lst); - } + if (!ly_is_list (lst)) + return SCM_BOOL_F; + + while (scm_is_pair (lst)) + { + if (!unsmob (scm_car (lst))) + return SCM_BOOL_F; + lst = scm_cdr (lst); + } return SCM_BOOL_T; } LY_DEFINE (ly_music_deep_copy, "ly:music-deep-copy", - 1, 0, 0, (SCM m), + 1, 1, 0, (SCM m, SCM origin), "Copy @var{m} and all sub expressions of@tie{}@var{m}." " @var{m} may be an arbitrary type; cons cells and music" - " are copied recursively.") + " are copied recursively. If @var{origin} is given," + " it is used as the origin for one level of music by calling" + " @code{ly:set-origin!} on the copy.") { - if (unsmob_music (m)) - return unsmob_music (m)->clone ()->unprotect (); - if (scm_is_pair (m)) - { - SCM copy = SCM_EOL; - do - { - copy = scm_cons (ly_music_deep_copy (scm_car (m)), copy); - m = scm_cdr (m); - } - while (scm_is_pair (m)); - // Oh, come on, GUILE. Why do you require the second argument - // of scm_reverse_x to be a proper list? That makes no sense. - // return scm_reverse_x (copy, ly_music_deep_copy (m)); - SCM last_cons = copy; - copy = scm_reverse_x (copy, SCM_EOL); - scm_set_cdr_x (last_cons, ly_music_deep_copy (m)); - return copy; - } + m = music_deep_copy (m); + + if (SCM_UNBNDP (origin)) + return m; + + if (Music *mus = unsmob (origin)) + origin = mus->get_property ("origin"); + + if (scm_is_false (origin) || scm_is_null (origin)) + return m; + + LY_ASSERT_SMOB (Input, origin, 2); + + set_origin (m, origin); + return m; +} + +LY_DEFINE (ly_set_origin_x, "ly:set-origin!", + 1, 1, 0, (SCM m, SCM origin), + "This sets the origin given in @var{origin} to @var{m}. " + " @var{m} will typically be a music expression or a list" + " of music. List structures are searched recursively," + " but recursion stops at the changed music expressions" + " themselves. " + " @var{origin} is generally of type @code{ly:input-location?}," + " defaulting to @code{(*location*)}. Other valid values for" + " @code{origin} are a music expression which is then used as" + " the source of location information, or @code{#f}" + " or @code{'()} in which case no action is performed. " + " The return value is @var{m} itself.") +{ + if (SCM_UNBNDP (origin)) + origin = scm_fluid_ref (Lily::f_location); + else if (Music *mus = unsmob (origin)) + origin = mus->get_property ("origin"); + + if (scm_is_false (origin) || scm_is_null (origin)) + return m; + + LY_ASSERT_SMOB (Input, origin, 2); + + set_origin (m, origin); return m; } @@ -145,11 +174,11 @@ LY_DEFINE (ly_music_transpose, "ly:music-transpose", "Transpose @var{m} such that central@tie{}C is mapped" " to@tie{}@var{p}. Return@tie{}@var{m}.") { - LY_ASSERT_TYPE (unsmob_music, m, 1); + LY_ASSERT_SMOB (Music, m, 1); LY_ASSERT_SMOB (Pitch, p, 2); - Music *sc = unsmob_music (m); - Pitch *sp = unsmob_pitch (p); + Music *sc = unsmob (m); + Pitch *sp = unsmob (p); sc->transpose (*sp); // SCM_UNDEFINED ? @@ -163,11 +192,11 @@ LY_DEFINE (ly_music_compress, "ly:music-compress", 2, 0, 0, (SCM m, SCM factor), "Compress music object@tie{}@var{m} by moment @var{factor}.") { - LY_ASSERT_TYPE (unsmob_music, m, 1); - LY_ASSERT_TYPE (unsmob_moment, factor, 2); + LY_ASSERT_SMOB (Music, m, 1); + LY_ASSERT_SMOB (Moment, factor, 2); - Music *sc = unsmob_music (m); - sc->compress (*unsmob_moment (factor)); + Music *sc = unsmob (m); + sc->compress (*unsmob (factor)); return sc->self_scm (); } @@ -176,11 +205,11 @@ LY_DEFINE (ly_make_music_relative_x, "ly:make-music-relative!", "Make @var{music} relative to @var{pitch}," " return final pitch.") { - LY_ASSERT_TYPE (unsmob_music, music, 1); - LY_ASSERT_TYPE (unsmob_pitch, pitch, 2); + LY_ASSERT_SMOB (Music, music, 1); + LY_ASSERT_SMOB (Pitch, pitch, 2); - Pitch start = *unsmob_pitch (pitch); - Music *m = unsmob_music (music); + Pitch start = *unsmob (pitch); + Music *m = unsmob (music); Pitch last = m->to_relative_octave (start); return last.smobbed_copy (); @@ -191,10 +220,10 @@ LY_DEFINE (ly_music_duration_length, "ly:music-duration-length", 1, 0, 0, "Extract the duration field from @var{mus} and return the" " length.") { - LY_ASSERT_TYPE (unsmob_music, mus, 1); - Music *m = unsmob_music (mus); + LY_ASSERT_SMOB (Music, mus, 1); + Music *m = unsmob (mus); - Duration *d = unsmob_duration (m->get_property ("duration")); + Duration *d = unsmob (m->get_property ("duration")); Moment len; if (d) @@ -209,13 +238,13 @@ LY_DEFINE (ly_music_duration_compress, "ly:music-duration-compress", 2, 0, 0, "Compress @var{mus} by factor @var{fact}, which is a" " @code{Moment}.") { - LY_ASSERT_TYPE (unsmob_music, mus, 1); + LY_ASSERT_SMOB (Music, mus, 1); LY_ASSERT_SMOB (Moment, fact, 2); - Music *m = unsmob_music (mus); - Moment *f = unsmob_moment (fact); + Music *m = unsmob (mus); + Moment *f = unsmob (fact); - Duration *d = unsmob_duration (m->get_property ("duration")); + Duration *d = unsmob (m->get_property ("duration")); if (d) m->set_property ("duration", d->compressed (f->main_part_).smobbed_copy ()); return SCM_UNSPECIFIED; @@ -234,7 +263,7 @@ LY_DEFINE (ly_transpose_key_alist, "ly:transpose-key-alist", " pitch @var{pit}.") { SCM newlist = SCM_EOL; - Pitch *p = unsmob_pitch (pit); + Pitch *p = unsmob (pit); for (SCM s = l; scm_is_pair (s); s = scm_cdr (s)) { @@ -266,4 +295,3 @@ LY_DEFINE (ly_transpose_key_alist, "ly:transpose-key-alist", } return scm_reverse_x (newlist, SCM_EOL); } - diff --git a/lily/music-sequence.cc b/lily/music-sequence.cc index b40597df24..644ba9beb7 100644 --- a/lily/music-sequence.cc +++ b/lily/music-sequence.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,8 @@ void transpose_music_list (SCM lst, Pitch rq) { for (SCM s = lst; scm_is_pair (s); s = scm_cdr (s)) - unsmob_music (scm_car (s))->transpose (rq); + if (Prob *p = unsmob (scm_car (s))) + p->transpose (rq); } Moment @@ -41,7 +42,7 @@ Music_sequence::cumulative_length (SCM l) for (SCM s = l; scm_is_pair (s); s = scm_cdr (s)) { - Moment l = unsmob_music (scm_car (s))->get_length (); + Moment l = unsmob (scm_car (s))->get_length (); if (last_len.grace_part_ && l.main_part_) last_len.grace_part_ = Rational (0); cumulative += last_len; @@ -60,7 +61,7 @@ Music_sequence::maximum_length (SCM l) Moment dur = 0; for (SCM s = l; scm_is_pair (s); s = scm_cdr (s)) { - Music *m = unsmob_music (scm_car (s)); + Music *m = unsmob (scm_car (s)); if (!m) programming_error ("Music sequence should have music elements"); else @@ -77,7 +78,7 @@ MAKE_SCHEME_CALLBACK (Music_sequence, maximum_length_callback, 1); SCM Music_sequence::maximum_length_callback (SCM m) { - Music *me = unsmob_music (m); + Music *me = unsmob (m); return maximum_length (me->get_property ("elements")).smobbed_copy (); } @@ -85,8 +86,8 @@ MAKE_SCHEME_CALLBACK (Music_sequence, event_chord_length_callback, 1); SCM Music_sequence::event_chord_length_callback (SCM m) { - Music *me = unsmob_music (m); - Duration *d = unsmob_duration (me->get_property ("duration")); + Music *me = unsmob (m); + Duration *d = unsmob (me->get_property ("duration")); // Preset duration is used in chord repetitions. if (d) { @@ -100,7 +101,7 @@ MAKE_SCHEME_CALLBACK (Music_sequence, cumulative_length_callback, 1); SCM Music_sequence::cumulative_length_callback (SCM m) { - Music *me = unsmob_music (m); + Music *me = unsmob (m); return cumulative_length (me->get_property ("elements")).smobbed_copy (); } @@ -108,7 +109,7 @@ MAKE_SCHEME_CALLBACK (Music_sequence, minimum_start_callback, 1); SCM Music_sequence::minimum_start_callback (SCM m) { - Music *me = unsmob_music (m); + Music *me = unsmob (m); return minimum_start (me->get_property ("elements")).smobbed_copy (); } @@ -116,7 +117,7 @@ MAKE_SCHEME_CALLBACK (Music_sequence, first_start_callback, 1); SCM Music_sequence::first_start_callback (SCM m) { - Music *me = unsmob_music (m); + Music *me = unsmob (m); return first_start (me->get_property ("elements")).smobbed_copy (); } @@ -129,7 +130,7 @@ music_list_to_relative (SCM l, Pitch p, bool ret_first) Pitch last = p; for (SCM s = l; scm_is_pair (s); s = scm_cdr (s)) { - if (Music *m = unsmob_music (scm_car (s))) + if (Music *m = unsmob (scm_car (s))) { last = m->to_relative_octave (last); if (!count++) @@ -144,7 +145,7 @@ void compress_music_list (SCM l, Moment m) { for (SCM s = l; scm_is_pair (s); s = scm_cdr (s)) - unsmob_music (scm_car (s))->compress (m); + unsmob (scm_car (s))->compress (m); } Moment @@ -153,7 +154,7 @@ Music_sequence::minimum_start (SCM l) Moment m; for (SCM s = l; scm_is_pair (s); s = scm_cdr (s)) - m = min (m, unsmob_music (scm_car (s))->start_mom ()); + m = min (m, unsmob (scm_car (s))->start_mom ()); return m; } @@ -163,7 +164,7 @@ Music_sequence::first_start (SCM l) for (SCM s = l; scm_is_pair (s); s = scm_cdr (s)) { - Music *mus = unsmob_music (scm_car (s)); + Music *mus = unsmob (scm_car (s)); Moment start = mus->start_mom (); if (mus->get_length ().to_bool () || start.to_bool ()) return start; @@ -175,8 +176,8 @@ MAKE_SCHEME_CALLBACK (Music_sequence, simultaneous_relative_callback, 2); SCM Music_sequence::simultaneous_relative_callback (SCM music, SCM pitch) { - Music *me = unsmob_music (music); - Pitch p = *unsmob_pitch (pitch); + Music *me = unsmob (music); + Pitch p = *unsmob (pitch); return music_list_to_relative (me->get_property ("elements"), p, false).smobbed_copy (); } @@ -185,8 +186,8 @@ MAKE_SCHEME_CALLBACK (Music_sequence, event_chord_relative_callback, 2); SCM Music_sequence::event_chord_relative_callback (SCM music, SCM pitch) { - Music *me = unsmob_music (music); - Pitch p = *unsmob_pitch (pitch); + Music *me = unsmob (music); + Pitch p = *unsmob (pitch); return music_list_to_relative (me->get_property ("elements"), p, true).smobbed_copy (); } diff --git a/lily/music-wrapper-iterator.cc b/lily/music-wrapper-iterator.cc index 8f201a65c1..009f64f237 100644 --- a/lily/music-wrapper-iterator.cc +++ b/lily/music-wrapper-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -51,9 +51,9 @@ void Music_wrapper_iterator::construct_children () { Music *my_music = get_music (); - Music *child = unsmob_music (my_music->get_property ("element")); + Music *child = unsmob (my_music->get_property ("element")); child_iter_ = (child) - ? unsmob_iterator (get_iterator (child)) + ? unsmob (get_iterator (child)) : 0; } diff --git a/lily/music-wrapper.cc b/lily/music-wrapper.cc index 5dbc265b00..adf510c2f8 100644 --- a/lily/music-wrapper.cc +++ b/lily/music-wrapper.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,8 +25,8 @@ MAKE_SCHEME_CALLBACK (Music_wrapper, start_callback, 1); SCM Music_wrapper::start_callback (SCM m) { - Music *me = unsmob_music (m); - Music *elt = unsmob_music (me->get_property ("element")); + Music *me = unsmob (m); + Music *elt = unsmob (me->get_property ("element")); if (elt) return elt->start_mom ().smobbed_copy (); else @@ -37,8 +37,8 @@ MAKE_SCHEME_CALLBACK (Music_wrapper, length_callback, 1); SCM Music_wrapper::length_callback (SCM m) { - Music *me = unsmob_music (m); - Music *elt = unsmob_music (me->get_property ("element")); + Music *me = unsmob (m); + Music *elt = unsmob (me->get_property ("element")); if (elt) return elt->get_length ().smobbed_copy (); else diff --git a/lily/music.cc b/lily/music.cc index eea6a9ca81..bbf7fe4f58 100644 --- a/lily/music.cc +++ b/lily/music.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,11 +24,11 @@ #include "duration.hh" #include "input.hh" #include "international.hh" -#include "ly-smobs.icc" #include "main.hh" #include "music-sequence.hh" #include "score.hh" #include "warn.hh" +#include "lily-imports.hh" /* Music is anything that has (possibly zero) duration and supports @@ -42,7 +42,7 @@ Music::internal_is_music_type (SCM k) const { SCM ifs = get_property ("types"); - return scm_c_memq (k, ifs) != SCM_BOOL_F; + return scm_is_true (scm_c_memq (k, ifs)); } Music::Music (SCM init) @@ -68,7 +68,7 @@ Music::derived_mark () const SCM Music::copy_mutable_properties () const { - return ly_music_deep_copy (mutable_property_alist_); + return music_deep_copy (mutable_property_alist_); } void @@ -91,13 +91,13 @@ Moment Music::get_length () const { SCM lst = get_property ("length"); - if (unsmob_moment (lst)) - return *unsmob_moment (lst); + if (unsmob (lst)) + return *unsmob (lst); if (ly_is_procedure (length_callback_)) { SCM res = scm_call_1 (length_callback_, self_scm ()); - return *unsmob_moment (res); + return *unsmob (res); } return Moment (0); @@ -110,7 +110,7 @@ Music::start_mom () const if (ly_is_procedure (lst)) { SCM res = scm_call_1 (lst, self_scm ()); - return *unsmob_moment (res); + return *unsmob (res); } Moment m; @@ -134,7 +134,7 @@ Pitch Music::generic_to_relative_octave (Pitch last) { SCM elt = get_property ("element"); - Pitch *old_pit = unsmob_pitch (get_property ("pitch")); + Pitch *old_pit = unsmob (get_property ("pitch")); if (old_pit) { Pitch new_pit = *old_pit; @@ -158,7 +158,7 @@ Music::generic_to_relative_octave (Pitch last) last = new_pit; } - if (Music *m = unsmob_music (elt)) + if (Music *m = unsmob (elt)) last = m->to_relative_octave (last); (void) music_list_to_relative (get_property ("articulations"), last, true); @@ -172,7 +172,7 @@ Music::to_relative_octave (Pitch last) SCM callback = get_property ("to-relative-callback"); if (ly_is_procedure (callback)) { - Pitch *p = unsmob_pitch (scm_call_2 (callback, self_scm (), + Pitch *p = unsmob (scm_call_2 (callback, self_scm (), last.smobbed_copy ())); return *p; } @@ -185,11 +185,11 @@ Music::compress (Moment factor) { SCM elt = get_property ("element"); - if (Music *m = unsmob_music (elt)) + if (Music *m = unsmob (elt)) m->compress (factor); compress_music_list (get_property ("elements"), factor); - Duration *d = unsmob_duration (get_property ("duration")); + Duration *d = unsmob (get_property ("duration")); if (d) set_property ("duration", d->compressed (factor.main_part_).smobbed_copy ()); @@ -198,49 +198,39 @@ Music::compress (Moment factor) /* This mutates alist. Hence, make sure that it is not shared */ + void -transpose_mutable (SCM alist, Pitch delta) +Prob::transpose (Pitch delta) { - for (SCM s = alist; scm_is_pair (s); s = scm_cdr (s)) + if (to_boolean (get_property ("untransposable"))) + return; + + for (SCM s = mutable_property_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)) + if (Pitch *p = unsmob (val)) { Pitch transposed = p->transposed (delta); - if (transposed.get_alteration ().abs () > Rational (1, 1)) - { - string delta_str; - if (delta.get_alteration ().abs () > Rational (1, 1)) - delta_str = (delta.normalized ().to_string () - + " " + _ ("(normalized pitch)")); - else - delta_str = delta.to_string (); - - warning (_f ("Transposing %s by %s makes alteration larger than double", - p->to_string (), - delta_str)); - transposed = transposed.normalized (); - } - - if (prop == ly_symbol2scm ("tonic")) + + if (scm_is_eq (prop, ly_symbol2scm ("tonic"))) transposed = Pitch (-1, transposed.get_notename (), transposed.get_alteration ()); new_val = transposed.smobbed_copy (); } - else if (prop == ly_symbol2scm ("element")) + else if (scm_is_eq (prop, ly_symbol2scm ("element"))) { - if (Music *m = unsmob_music (val)) + if (Prob *m = unsmob (val)) m->transpose (delta); } - else if (prop == ly_symbol2scm ("elements") - || prop == ly_symbol2scm ("articulations")) + else if (scm_is_eq (prop, ly_symbol2scm ("elements")) + || scm_is_eq (prop, ly_symbol2scm ("articulations"))) transpose_music_list (val, delta); - else if (prop == ly_symbol2scm ("pitch-alist") + else if (scm_is_eq (prop, ly_symbol2scm ("pitch-alist")) && scm_is_pair (val)) new_val = ly_transpose_key_alist (val, delta.smobbed_copy ()); @@ -249,25 +239,16 @@ transpose_mutable (SCM alist, Pitch delta) } } -void -Music::transpose (Pitch delta) -{ - if (to_boolean (get_property ("untransposable"))) - return; - - transpose_mutable (mutable_property_alist_, delta); -} - void Music::set_spot (Input ip) { - set_property ("origin", make_input (ip)); + set_property ("origin", ip.smobbed_copy ()); } Input * Music::origin () const { - Input *ip = unsmob_input (get_property ("origin")); + Input *ip = unsmob (get_property ("origin")); return ip ? ip : &dummy_input_global; } @@ -284,7 +265,7 @@ Music::to_event () const programming_error ("Not a music type"); Stream_event *e = new Stream_event - (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), class_name), + (Lily::ly_make_event_class (class_name), mutable_property_alist_); Moment length = get_length (); if (length.to_bool ()) @@ -297,7 +278,7 @@ Music::to_event () const SCM art_ev = SCM_EOL; for (; scm_is_pair (art_mus); art_mus = scm_cdr (art_mus)) { - Music *m = unsmob_music (scm_car (art_mus)); + Music *m = unsmob (scm_car (art_mus)); art_ev = scm_cons (m->to_event ()->unprotect (), art_ev); } e->set_property ("articulations", scm_reverse_x (art_ev, SCM_EOL)); @@ -323,11 +304,10 @@ Music::send_to_context (Context *c) Music * make_music_by_name (SCM sym) { - SCM make_music_proc = ly_lily_module_constant ("make-music"); - SCM rv = scm_call_1 (make_music_proc, sym); + SCM rv = Lily::make_music (sym); /* UGH. */ - Music *m = unsmob_music (rv); + Music *m = unsmob (rv); m->protect (); return m; } @@ -336,8 +316,8 @@ MAKE_SCHEME_CALLBACK (Music, duration_length_callback, 1); SCM Music::duration_length_callback (SCM m) { - Music *me = unsmob_music (m); - Duration *d = unsmob_duration (me->get_property ("duration")); + Music *me = unsmob (m); + Duration *d = unsmob (me->get_property ("duration")); Moment mom; if (d) @@ -345,8 +325,39 @@ Music::duration_length_callback (SCM m) return mom.smobbed_copy (); } -Music * -unsmob_music (SCM m) +SCM +music_deep_copy (SCM m) +{ + if (Music *mus = unsmob (m)) + return mus->clone ()->unprotect (); + if (scm_is_pair (m)) + { + SCM copy = SCM_EOL; + do + { + copy = scm_cons (music_deep_copy (scm_car (m)), copy); + m = scm_cdr (m); + } + while (scm_is_pair (m)); + // Oh, come on, GUILE. Why do you require the second argument + // of scm_reverse_x to be a proper list? That makes no sense. + // return scm_reverse_x (copy, music_deep_copy (m)); + SCM last_cons = copy; + copy = scm_reverse_x (copy, SCM_EOL); + scm_set_cdr_x (last_cons, music_deep_copy (m)); + return copy; + } + return m; +} + +void +set_origin (SCM m, SCM origin) { - return dynamic_cast (unsmob_prob (m)); + while (scm_is_pair (m)) + { + set_origin (scm_car (m), origin); + m = scm_cdr (m); + } + if (Music *mus = unsmob (m)) + mus->set_property ("origin", origin); } diff --git a/lily/nested-property.cc b/lily/nested-property.cc index 9c3cc73387..edb7986a51 100644 --- a/lily/nested-property.cc +++ b/lily/nested-property.cc @@ -1,103 +1,160 @@ #include "context.hh" #include "grob.hh" -/* - Drop symbol from the list alist..alist_end. - */ +// scm_reverse_x without the checks SCM -evict_from_alist (SCM symbol, SCM alist, SCM alist_end) +fast_reverse_x (SCM lst, SCM tail) { - SCM new_alist = SCM_EOL; - SCM *tail = &new_alist; - - while (alist != alist_end) + while (!scm_is_null (lst)) { - if (ly_is_equal (scm_caar (alist), symbol)) - { - alist = scm_cdr (alist); - break; - } - - *tail = scm_cons (scm_car (alist), SCM_EOL); - tail = SCM_CDRLOC (*tail); - alist = scm_cdr (alist); + SCM n = scm_cdr (lst); + scm_set_cdr_x (lst, tail); + tail = lst; + lst = n; } + return tail; +} - *tail = alist; - return new_alist; +// copy the spine of lst not including tail, appending newtail +// returns new list. +SCM +partial_list_copy (SCM lst, SCM tail, SCM newtail) +{ + SCM p = SCM_EOL; + for (; !scm_is_eq (lst, tail); lst = scm_cdr (lst)) + p = scm_cons (scm_car (lst), p); + return fast_reverse_x (p, newtail); } -/* - PROP_PATH should be big-to-small ordering - */ SCM -nested_property_alist (SCM alist, SCM prop_path, SCM value) +assq_tail (SCM key, SCM alist, SCM based_on = SCM_EOL) { - SCM new_value = SCM_BOOL_F; - if (scm_is_pair (scm_cdr (prop_path))) + for (SCM p = alist; !scm_is_eq (p, based_on); p = scm_cdr (p)) { - SCM sub_alist = ly_assoc_get (scm_car (prop_path), alist, SCM_EOL); - new_value = nested_property_alist (sub_alist, scm_cdr (prop_path), value); + if (scm_is_eq (scm_caar (p), key)) + return p; } - else + return SCM_BOOL_F; +} + +SCM +assv_tail (SCM key, SCM alist, SCM based_on = SCM_EOL) +{ + for (SCM p = alist; !scm_is_eq (p, based_on); p = scm_cdr (p)) { - new_value = value; + if (scm_is_true (scm_eqv_p (scm_caar (p), key))) + return p; } - - return scm_acons (scm_car (prop_path), new_value, alist); + return SCM_BOOL_F; } -/* - Recursively purge alist of prop_path: +SCM +assoc_tail (SCM key, SCM alist, SCM based_on = SCM_EOL) +{ + if (SCM_IMP (key)) + return assq_tail (key, alist, based_on); + if (scm_is_number (key) || scm_is_true (scm_char_p (key))) + return assv_tail (key, alist, based_on); + for (SCM p = alist; !scm_is_eq (p, based_on); p = scm_cdr (p)) + { + if (ly_is_equal (scm_caar (p), key)) + return p; + } + return SCM_BOOL_F; +} - revert ((sym, val) : L, [sym]) = L - revert ((sym, val) : L, sym : props) = - (sym, revert (val, rest-props)) ++ L - revert ((sym, val) : L, p ++ rest-props) = - (sym, val) : revert (L, p ++ rest-props) +// Like assq, but removes the found element destructively +SCM assq_pop_x (SCM key, SCM *alist) +{ + for (SCM p = *alist; scm_is_pair (p); p = *(alist = SCM_CDRLOC (p))) + { + if (scm_is_eq (scm_caar (p), key)) + { + *alist = scm_cdr (p); + return scm_car (p); + } + } + return SCM_BOOL_F; +} +/* + Drop key from the list alist..alist_end. */ SCM -nested_property_revert_alist (SCM alist, SCM prop_path) +evict_from_alist (SCM key, SCM alist, SCM alist_end) { - assert (scm_is_pair (prop_path)); + SCM p = assoc_tail (key, alist, alist_end); - SCM wanted_sym = scm_car (prop_path); + if (scm_is_true (p)) + return partial_list_copy (alist, p, scm_cdr (p)); + return alist; +} - SCM new_list = SCM_EOL; - SCM *tail = &new_list; - for (SCM s = alist; scm_is_pair (s); s = scm_cdr (s)) - { - SCM sub_sym = scm_caar (s); - SCM old_val = scm_cdar (s); +// This is the same as +// nested_property_alist (SCM_EOL, prop_path, value) but faster +SCM +nested_create_alist (SCM prop_path, SCM value) +{ + if (scm_is_null (prop_path)) + return value; + return scm_acons (scm_car (prop_path), + nested_create_alist (scm_cdr (prop_path), value), + SCM_EOL); +} - if (sub_sym == wanted_sym) - { - if (scm_is_pair (scm_cdr (prop_path))) - { - SCM new_val = nested_property_revert_alist (old_val, scm_cdr (prop_path)); +/* + PROP_PATH should be big-to-small ordering + */ - /* nothing changed: drop newly constructed list. */ - if (old_val == new_val) - return alist; +// Take the given alist and replace the given nested property with the +// given value. Multiple overrides of the same property path are not +// coalesced for efficiency reasons: they are considered rare enough +// to not be worth the cost of detecting them. When sublists are +// modified, however, we remove the original sublist and copy the +// spine before it. The cost for finding the sublist has already been +// paid anyway. - *tail = scm_acons (sub_sym, new_val, SCM_EOL); - tail = SCM_CDRLOC (*tail); - } - else - { - /* old value is dropped. */ - } +// A typical use case for this routine is applying (possibly nested) +// tweaks to a grob property list. - *tail = scm_cdr (s); - return new_list; - } +SCM +nested_property_alist (SCM alist, SCM prop_path, SCM value) +{ + // replacement moves to the front. + SCM key = scm_car (prop_path); + SCM rest = scm_cdr (prop_path); + if (scm_is_pair (rest)) + { + SCM where = assoc_tail (key, alist); - *tail = scm_acons (sub_sym, old_val, SCM_EOL); - tail = SCM_CDRLOC (*tail); + if (scm_is_false (where)) + return scm_acons (key, nested_create_alist (rest, value), alist); + return scm_acons (key, nested_property_alist (scm_cdar (where), + rest, + value), + partial_list_copy (alist, where, scm_cdr (where))); } + // Outcommented code would coalesce multiple overrides of the same + // property +#if 0 + SCM where = assq_tail (alist, key); + if (scm_is_true (where)) + return scm_acons (key, value, + partial_list_copy (alist, where, scm_cdr (where))); +#endif + return scm_acons (key, value, alist); +} - /* Wanted symbol not found: drop newly constructed list. */ +SCM +nested_property (SCM alist, SCM prop_path, SCM fallback) +{ + for (; scm_is_pair (prop_path); prop_path = scm_cdr (prop_path)) + { + SCM tail = assoc_tail (scm_car (prop_path), alist); + if (scm_is_false (tail)) + return fallback; + alist = scm_cdar (tail); + } return alist; } @@ -110,3 +167,133 @@ set_nested_property (Grob *me, SCM big_to_small, SCM value) me->set_property (scm_car (big_to_small), alist); } + +// This converts an alist with nested overrides in it to a proper +// alist. The number of nested overrides is known in advance, +// everything up to the last nested override is copied, the tail is +// shared. +// +// The first nalist index has to be a symbol since the conversion +// relies on eq? comparisons, uses some special non-symbol values for +// special purposes, and does validity checking indexed by symbols. +// Subindexing can be done with equal?-comparable indexes, however. + +SCM +nalist_to_alist (SCM nalist, int nested) +{ + if (!nested) + return nalist; + SCM copied = SCM_EOL; + SCM partials = SCM_EOL; + // partials is a alist of partial overrides + while (nested) + { + SCM elt = scm_car (nalist); + nalist = scm_cdr (nalist); + SCM key = scm_car (elt); + if (!scm_is_symbol (key)) + --nested; + if (scm_is_bool (key)) + { + if (scm_is_false (key)) + continue; + elt = scm_cdr (elt); + key = scm_car (elt); + } + if (scm_is_pair (key)) + // nested override: record for key in partial + { + SCM pair = scm_sloppy_assq (scm_car (key), partials); + if (scm_is_false (pair)) + partials = scm_acons (scm_car (key), scm_list_1 (elt), + partials); + else + scm_set_cdr_x (pair, scm_cons (elt, scm_cdr (pair))); + continue; + } + assert (scm_is_symbol (key)); + // plain override: apply any known corresponding partials + SCM pair = assq_pop_x (key, &partials); + if (scm_is_true (pair)) + { + SCM value = scm_cdr (elt); + for (SCM pp = scm_cdr (pair); scm_is_pair (pp); pp = scm_cdr (pp)) + value = nested_property_alist (value, scm_cdaar (pp), scm_cdar (pp)); + copied = scm_acons (key, value, copied); + } + else + copied = scm_cons (elt, copied); + } + // Now need to work off the remaining partials. All of them are + // unique, so we can push them to `copied' after resolving without + // losing information. + + for (;scm_is_pair (partials); partials = scm_cdr (partials)) + { + SCM pair = scm_car (partials); + SCM key = scm_car (pair); + SCM elt = scm_sloppy_assq (key, nalist); + SCM value = SCM_EOL; + if (scm_is_true (elt)) + value = scm_cdr (elt); + + for (SCM pp = scm_cdr (pair); scm_is_pair (pp); pp = scm_cdr (pp)) + value = nested_property_alist (value, scm_cdaar (pp), scm_cdar (pp)); + + copied = scm_acons (key, value, copied); + } + return fast_reverse_x (copied, nalist); +} + +#if 0 +// Alternative approach: don't unfold those partial overrides while +// they are part of contexts but instead use a special accessor for +// subproperties in the grob. Not used or tested for now. + +SCM +nassq_ref (SCM key, SCM nalist, SCM fallback) +{ + SCM partials = SCM_EOL; + // partials is list of partial overrides for the given property + for (SCM p = nalist; scm_is_pair (p); p = scm_cdr (p)) + { + SCM elt = scm_car (p); + SCM pkey = scm_car (elt); + if (scm_is_pair (pkey)) + { + if (scm_is_eq (scm_car (pkey), key)) + partials = scm_cons (elt, partials); + } + else if (scm_is_eq (pkey, key)) + { + SCM value = scm_cdr (elt); + for (; scm_is_pair (partials); partials = scm_cdr (partials)) + { + value = nested_property_alist (value, scm_cdaar (partials), + scm_cdar (partials)); + } + return value; + } + } + if (scm_is_pair (partials)) + { + // Bit of a quandary here: we have only subproperty overrides + // but no main property. Could be a programming error, but we + // instead override an empty list. + SCM value = nested_create_alist (scm_cdaar (partials), scm_cdar (partials)); + partials = scm_cdr (partials); + for (; scm_is_pair (partials); partials = scm_cdr (partials)) + value = nested_property_alist (value, scm_cdaar (partials), + scm_cdar (partials)); + return value; + } + return SCM_UNBNDP (fallback) ? SCM_EOL : fallback; +} + +// Also needed for this approach to make sense: an accessor for true +// subproperties. +SCM +nassq_nested_ref (SCM key, SCM subpath, SCM nalist, SCM fallback); +// To be implemented + +#endif diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index a605f0f4ae..047a547525 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -71,9 +71,9 @@ public: TRANSLATOR_DECLARATIONS (New_fingering_engraver); protected: void stop_translation_timestep (); - DECLARE_ACKNOWLEDGER (rhythmic_head); - DECLARE_ACKNOWLEDGER (inline_accidental); - DECLARE_ACKNOWLEDGER (stem); + void acknowledge_rhythmic_head (Grob_info); + void acknowledge_inline_accidental (Grob_info); + void acknowledge_stem (Grob_info); void add_fingering (Grob *, SCM, vector *, Stream_event *, Stream_event *); @@ -99,7 +99,7 @@ New_fingering_engraver::acknowledge_rhythmic_head (Grob_info inf) for (SCM s = arts; scm_is_pair (s); s = scm_cdr (s)) { - Stream_event *ev = unsmob_stream_event (scm_car (s)); + Stream_event *ev = unsmob (scm_car (s)); if (!ev) continue; @@ -119,7 +119,7 @@ New_fingering_engraver::acknowledge_rhythmic_head (Grob_info inf) // when we don't want them displayed. So don't make space // for them if 'stencil is #f Grob *g = make_item ("StringNumber", ev->self_scm ()); - if (g->get_property ("stencil") != SCM_BOOL_F) + if (scm_is_true (g->get_property ("stencil"))) add_fingering (inf.grob (), ly_symbol2scm ("StringNumber"), &string_numbers_, ev, note_ev); @@ -132,7 +132,7 @@ New_fingering_engraver::acknowledge_rhythmic_head (Grob_info inf) else if (ev->in_event_class ("harmonic-event")) { inf.grob ()->set_property ("style", ly_symbol2scm ("harmonic")); - Grob *d = unsmob_grob (inf.grob ()->get_object ("dot")); + Grob *d = unsmob (inf.grob ()->get_object ("dot")); if (d && !to_boolean (get_property ("harmonicDots"))) d->suicide (); } @@ -176,9 +176,7 @@ New_fingering_engraver::add_fingering (Grob *head, { Finger_tuple ft; - ft.script_ = internal_make_item (grob_sym, event->self_scm (), - ly_symbol2string (grob_sym).c_str (), - __FILE__, __LINE__, __FUNCTION__); + ft.script_ = make_item (grob_sym, event->self_scm ()); Side_position_interface::add_support (ft.script_, head); @@ -197,7 +195,7 @@ New_fingering_engraver::position_scripts (SCM orientations, if (stem_) { Side_position_interface::add_support (scripts->at (i).script_, stem_); - if (Grob *flag = unsmob_grob (stem_->get_object ("flag"))) + if (Grob *flag = unsmob (stem_->get_object ("flag"))) Side_position_interface::add_support (scripts->at (i).script_, flag); } @@ -230,10 +228,10 @@ New_fingering_engraver::position_scripts (SCM orientations, vector_sort (*scripts, less ()); - bool up_p = scm_c_memq (ly_symbol2scm ("up"), orientations) != SCM_BOOL_F; - bool down_p = scm_c_memq (ly_symbol2scm ("down"), orientations) != SCM_BOOL_F; - bool left_p = scm_c_memq (ly_symbol2scm ("left"), orientations) != SCM_BOOL_F; - bool right_p = scm_c_memq (ly_symbol2scm ("right"), orientations) != SCM_BOOL_F; + bool up_p = scm_is_true (scm_c_memq (ly_symbol2scm ("up"), orientations)); + bool down_p = scm_is_true (scm_c_memq (ly_symbol2scm ("down"), orientations)); + bool left_p = scm_is_true (scm_c_memq (ly_symbol2scm ("left"), orientations)); + bool right_p = scm_is_true (scm_c_memq (ly_symbol2scm ("right"), orientations)); Direction hordir = (right_p) ? RIGHT : LEFT; if (left_p || right_p) { @@ -281,15 +279,14 @@ New_fingering_engraver::position_scripts (SCM orientations, f->set_parent (ft.head_, Y_AXIS); f->set_property ("avoid-slur", ly_symbol2scm ("inside")); if (hordir == LEFT - && unsmob_grob (ft.head_->get_object ("accidental-grob"))) + && unsmob (ft.head_->get_object ("accidental-grob"))) Side_position_interface::add_support (f, - unsmob_grob (ft.head_->get_object ("accidental-grob"))); - else if (unsmob_grob (ft.head_->get_object ("dot"))) + unsmob (ft.head_->get_object ("accidental-grob"))); + else if (unsmob (ft.head_->get_object ("dot"))) Side_position_interface::add_support (f, - unsmob_grob (ft.head_->get_object ("dot"))); + unsmob (ft.head_->get_object ("dot"))); - Self_alignment_interface::set_align_self (f, Y_AXIS); - Self_alignment_interface::set_center_parent (f, Y_AXIS); + Self_alignment_interface::set_aligned_on_parent (f, Y_AXIS); Side_position_interface::set_axis (f, X_AXIS); f->set_property ("direction", scm_from_int (hordir)); @@ -307,8 +304,7 @@ New_fingering_engraver::position_scripts (SCM orientations, f->set_property ("script-priority", scm_from_int (finger_prio + d * ft.position_)); - Self_alignment_interface::set_align_self (f, X_AXIS); - Self_alignment_interface::set_center_parent (f, X_AXIS); + Self_alignment_interface::set_aligned_on_parent (f, X_AXIS); Side_position_interface::set_axis (f, Y_AXIS); f->set_property ("direction", scm_from_int (d)); @@ -373,9 +369,14 @@ New_fingering_engraver::New_fingering_engraver () stem_ = 0; } -ADD_ACKNOWLEDGER (New_fingering_engraver, rhythmic_head); -ADD_ACKNOWLEDGER (New_fingering_engraver, inline_accidental); -ADD_ACKNOWLEDGER (New_fingering_engraver, stem); + +void +New_fingering_engraver::boot () +{ + ADD_ACKNOWLEDGER (New_fingering_engraver, rhythmic_head); + ADD_ACKNOWLEDGER (New_fingering_engraver, inline_accidental); + ADD_ACKNOWLEDGER (New_fingering_engraver, stem); +} ADD_TRANSLATOR (New_fingering_engraver, /* doc */ diff --git a/lily/note-collision.cc b/lily/note-collision.cc index aad09a95a9..664ce234a7 100644 --- a/lily/note-collision.cc +++ b/lily/note-collision.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,22 +33,14 @@ #include "stem.hh" #include "warn.hh" -void +Real check_meshing_chords (Grob *me, - Drul_array > *offsets, - Drul_array > const &extents, - Drul_array > const &clash_groups) + Grob *clash_up, Grob *clash_down) { - if (!extents[UP].size () || !extents[DOWN].size ()) - return; - - Grob *clash_up = clash_groups[UP][0]; - Grob *clash_down = clash_groups[DOWN][0]; - /* Every note column should have a stem, but avoid a crash. */ if (!Note_column::get_stem (clash_up) || !Note_column::get_stem (clash_down)) - return; + return 0.0; Drul_array stems (Note_column::get_stem (clash_down), Note_column::get_stem (clash_up)); @@ -63,17 +55,19 @@ check_meshing_chords (Grob *me, vector ups = Stem::note_head_positions (stems[UP]); vector dps = Stem::note_head_positions (stems[DOWN]); + int threshold = robust_scm2int (me->get_property ("note-collision-threshold"), 1); + /* Too far apart to collide. */ - if (ups[0] > dps.back () + 1) - return; + if (ups[0] > dps.back () + threshold) + return 0.0; /* If the chords just 'touch' their extreme noteheads, then we can align their stems. */ bool touch = false; if (ups[0] >= dps.back () - && (dps.size () < 2 || ups[0] >= dps[dps.size () - 2] + 2) - && (ups.size () < 2 || ups[1] >= dps.back () + 2)) + && (dps.size () < 2 || ups[0] >= dps[dps.size () - 2] + threshold + 1) + && (ups.size () < 2 || ups[1] >= dps.back () + threshold + 1)) touch = true; /* Filter out the 'o's in this configuration, since they're no @@ -149,7 +143,9 @@ check_meshing_chords (Grob *me, for (vsize i = 0, j = 0; i < ups.size () && j < dps.size ();) { - if (abs (ups[i] - dps[j]) == 1) + if (ups[i] == dps[j]) + full_collide = true; + else if (abs (ups[i] - dps[j]) <= threshold) { merge_possible = false; if (ups[i] > dps[j]) @@ -157,8 +153,6 @@ check_meshing_chords (Grob *me, else distant_half_collide = true; } - else if (ups[i] == dps[j]) - full_collide = true; else if (ups[i] > dps[0] && ups[i] < dps.back ()) merge_possible = false; else if (dps[j] > ups[0] && dps[j] < ups.back ()) @@ -217,8 +211,10 @@ check_meshing_chords (Grob *me, SCM up_style = head_up->get_property ("style"); SCM down_style = head_down->get_property ("style"); if (merge_possible - && (up_style == ly_symbol2scm ("fa") || up_style == ly_symbol2scm ("faThin")) - && (down_style == ly_symbol2scm ("fa") || down_style == ly_symbol2scm ("faThin"))) + && (scm_is_eq (up_style, ly_symbol2scm ("fa")) + || scm_is_eq (up_style, ly_symbol2scm ("faThin"))) + && (scm_is_eq (down_style, ly_symbol2scm ("fa")) + || scm_is_eq (down_style, ly_symbol2scm ("faThin")))) { Offset att = Offset (0.0, -1.0); head_up->set_property ("stem-attachment", ly_offset2scm (att)); @@ -272,7 +268,7 @@ check_meshing_chords (Grob *me, if (dot_wipe_head) { - if (Grob *d = unsmob_grob (dot_wipe_head->get_object ("dot"))) + if (Grob *d = unsmob (dot_wipe_head->get_object ("dot"))) d->suicide (); } @@ -313,18 +309,18 @@ check_meshing_chords (Grob *me, if (shift_amount < -1e-6 && Rhythmic_head::dot_count (head_up)) { - Grob *d = unsmob_grob (head_up->get_object ("dot")); + Grob *d = unsmob (head_up->get_object ("dot")); Grob *parent = d->get_parent (X_AXIS); - if (Dot_column::has_interface (parent)) + if (has_interface (parent)) Side_position_interface::add_support (parent, head_down); } else if (Rhythmic_head::dot_count (head_down)) { - Grob *d = unsmob_grob (head_down->get_object ("dot")); + Grob *d = unsmob (head_down->get_object ("dot")); Grob *parent = d->get_parent (X_AXIS); - if (Dot_column::has_interface (parent)) + if (has_interface (parent)) { - Grob *stem = unsmob_grob (head_up->get_object ("stem")); + Grob *stem = unsmob (head_up->get_object ("stem")); // Loop over all heads on an up-pointing-stem to see if dots // need to clear any heads suspended on its right side. extract_grob_set (stem, "note-heads", heads); @@ -337,12 +333,12 @@ check_meshing_chords (Grob *me, if (shift_amount > 1e-6 && Rhythmic_head::dot_count (head_down)) { - Grob *dot_down = unsmob_grob (head_down->get_object ("dot")); + Grob *dot_down = unsmob (head_down->get_object ("dot")); Grob *col_down = dot_down->get_parent (X_AXIS); Direction dir = UP; if (Rhythmic_head::dot_count (head_up)) { - Grob *dot_up = unsmob_grob (head_up->get_object ("dot")); + Grob *dot_up = unsmob (head_up->get_object ("dot")); Grob *col_up = dot_up->get_parent (X_AXIS); if (col_up == col_down) // let the common DotColumn arrange dots dir = CENTER; @@ -351,26 +347,22 @@ check_meshing_chords (Grob *me, } if (dir != CENTER) { - Grob *stem = unsmob_grob (head_down->get_object ("stem")); + Grob *stem = unsmob (head_down->get_object ("stem")); extract_grob_set (stem, "note-heads", heads); for (vsize i = 0; i < heads.size (); i++) - if (Grob *dot = unsmob_grob (heads[i]->get_object ("dot"))) + if (Grob *dot = unsmob (heads[i]->get_object ("dot"))) dot->set_property ("direction", scm_from_int (dir)); } } - for (UP_and_DOWN (d)) - { - for (vsize i = 0; i < clash_groups[d].size (); i++) - (*offsets)[d][i] += d * shift_amount; - } + return shift_amount; } MAKE_SCHEME_CALLBACK (Note_collision_interface, calc_positioning_done, 1) SCM Note_collision_interface::calc_positioning_done (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); me->set_property ("positioning-done", SCM_BOOL_T); Drul_array > clash_groups = get_clash_groups (me); @@ -402,22 +394,20 @@ Note_collision_interface::calc_positioning_done (SCM smob) } vector done; - Real left_most = 1e6; + Real left_most = 0.0; vector amounts; for (; scm_is_pair (hand); hand = scm_cdr (hand)) { - Grob *s = unsmob_grob (scm_caar (hand)); + Grob *s = unsmob (scm_caar (hand)); Real amount = scm_to_double (scm_cdar (hand)) * wid; done.push_back (s); amounts.push_back (amount); - if (amount < left_most) - left_most = amount; } for (; scm_is_pair (autos); autos = scm_cdr (autos)) { - Grob *s = unsmob_grob (scm_caar (autos)); + Grob *s = unsmob (scm_caar (autos)); Real amount = scm_to_double (scm_cdar (autos)) * wid; vsize x = find (done, s) - done.begin (); @@ -445,7 +435,7 @@ Note_collision_interface::get_clash_groups (Grob *me) for (vsize i = 0; i < elements.size (); i++) { Grob *se = elements[i]; - if (Note_column::has_interface (se)) + if (has_interface (se)) { if (!Note_column::dir (se)) se->programming_error ("note-column has no direction"); @@ -471,37 +461,11 @@ SCM Note_collision_interface::automatic_shift (Grob *me, Drul_array > clash_groups) { - Drul_array < vector > shifts; SCM tups = SCM_EOL; - for (UP_and_DOWN (d)) - { - vector &shift (shifts[d]); - vector &clashes (clash_groups[d]); - - for (vsize i = 0; i < clashes.size (); i++) - { - SCM sh - = clashes[i]->get_property ("horizontal-shift"); - - if (scm_is_number (sh)) - shift.push_back (scm_to_int (sh)); - else - shift.push_back (0); - } - - for (vsize i = 1; i < shift.size (); i++) - { - if (shift[i - 1] == shift[i]) - { - clashes[0]->warning (_ ("ignoring too many clashing note columns")); - return tups; - } - } - } - Drul_array > extents; - Drul_array > offsets; + Drul_array extent_union; + Drul_array > stems; for (UP_and_DOWN (d)) { for (vsize i = 0; i < clash_groups[d].size (); i++) @@ -510,10 +474,16 @@ Note_collision_interface::automatic_shift (Grob *me, s[LEFT]--; s[RIGHT]++; extents[d].push_back (s); - offsets[d].push_back (d * 0.5 * i); + extent_union[d].unite (s); + stems[d].push_back (Note_column::get_stem (clash_groups[d][i])); } } + Real inner_offset + = (clash_groups[UP].size () && clash_groups[DOWN].size ()) + ? check_meshing_chords (me, clash_groups[UP][0], clash_groups[DOWN][0]) + : 0.0; + /* * do horizontal shifts of each direction * @@ -522,17 +492,45 @@ Note_collision_interface::automatic_shift (Grob *me, * x|| * x| */ - + Drul_array > offsets; for (UP_and_DOWN (d)) { - for (vsize i = 1; i < clash_groups[d].size (); i++) + Real offset = inner_offset; + vector shifts; + for (vsize i = 0; i < clash_groups[d].size (); i++) { - Slice prev = extents[d][i - 1]; - prev.intersect (extents[d][i]); - if (prev.length () > 0 - || (extents[-d].size () && d * (extents[d][i][-d] - extents[-d][0][d]) < 0)) - for (vsize j = i; j < clash_groups[d].size (); j++) - offsets[d][j] += d * 0.5; + Grob *col = clash_groups[d][i]; + SCM sh = col->get_property ("horizontal-shift"); + shifts.push_back (robust_scm2int (sh, 0)); + + if (i == 0) + offset = inner_offset; + else + { + bool explicit_shift = scm_is_number (sh); + if (!explicit_shift) + col->warning (_ ("this Voice needs a \\voiceXx or \\shiftXx setting")); + + if (explicit_shift && shifts[i] == shifts[i - 1]) + ; // Match the previous notecolumn offset + else if (extents[d][i][UP] > extents[d][i - 1][DOWN] + && extents[d][i][DOWN] < extents[d][i - 1][UP]) + offset += 1.0; // fully clear the previous-notecolumn heads + else if (d * extents[d][i][-d] >= d * extents[d][i - 1][d]) + offset += Stem::is_valid_stem (stems[d][i - 1]) + ? 1.0 : 0.5; // we cross the previous notecolumn + else if (Stem::is_valid_stem (stems[d][i])) + offset += 0.5; + + // check if we cross the opposite-stemmed voices + if (d * extents[d][i][-d] < d * extent_union[-d][d]) + offset = max (offset, 0.5); + if (extents[-d].size () + && extents[d][i][UP] > extents[-d][0][DOWN] + && extents[d][i][DOWN] < extents[-d][0][UP]) + offset = max (offset, 1.0); + } + offsets[d].push_back (d * offset); } } @@ -546,18 +544,9 @@ Note_collision_interface::automatic_shift (Grob *me, if (dc) for (vsize j = i + 1; j < clash_groups[UP].size (); j++) - { - Grob *stem = Note_column::get_stem (clash_groups[UP][j]); - Side_position_interface::add_support (dc, stem); - } + Side_position_interface::add_support (dc, stems[UP][j]); } - /* - Check if chords are meshing - */ - - check_meshing_chords (me, &offsets, extents, clash_groups); - for (UP_and_DOWN (d)) { for (vsize i = 0; i < clash_groups[d].size (); i++) @@ -600,7 +589,7 @@ Note_collision_interface::note_head_positions (Grob *me) vector out; extract_grob_set (me, "elements", elts); for (vsize i = 0; i < elts.size (); i++) - if (Grob *stem = unsmob_grob (elts[i]->get_object ("stem"))) + if (Grob *stem = unsmob (elts[i]->get_object ("stem"))) { vector nhp = Stem::note_head_positions (stem); out.insert (out.end (), nhp.begin (), nhp.end ()); @@ -620,6 +609,7 @@ ADD_INTERFACE (Note_collision_interface, /* properties */ "merge-differently-dotted " "merge-differently-headed " + "note-collision-threshold " "positioning-done " "prefer-dotted-right " ); diff --git a/lily/note-column-scheme.cc b/lily/note-column-scheme.cc index d828d36f5c..c665b70548 100644 --- a/lily/note-column-scheme.cc +++ b/lily/note-column-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Nicolas Sceaux + Copyright (C) 2010--2015 Nicolas Sceaux LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,7 @@ LY_DEFINE (ly_note_column_accidentals, "ly:note-column-accidentals", "Return the @code{AccidentalPlacement} grob from @var{note-column}" " if any, or @code{SCM_EOL} otherwise.") { - Grob *grob = unsmob_grob (note_column); + Grob *grob = unsmob (note_column); LY_ASSERT_SMOB (Grob, note_column, 1); Grob *acc = Note_column::accidentals (grob); if (acc) @@ -39,7 +39,7 @@ LY_DEFINE (ly_note_column_dot_column, "ly:note-column-dot-column", "Return the @code{DotColumn} grob from @var{note-column}" " if any, or @code{SCM_EOL} otherwise.") { - Grob *grob = unsmob_grob (note_column); + Grob *grob = unsmob (note_column); LY_ASSERT_SMOB (Grob, note_column, 1); Grob *dot_column = Note_column::dot_column (grob); if (dot_column) diff --git a/lily/note-column.cc b/lily/note-column.cc index 42bd9b484c..1d79fee652 100644 --- a/lily/note-column.cc +++ b/lily/note-column.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,7 +43,7 @@ using namespace std; bool Note_column::has_rests (Grob *me) { - return unsmob_grob (me->get_object ("rest")); + return unsmob (me->get_object ("rest")); } bool @@ -61,7 +61,7 @@ Item * Note_column::get_stem (Grob *me) { SCM s = me->get_object ("stem"); - return unsmob_item (s); + return unsmob (s); } Item * @@ -71,7 +71,7 @@ Note_column::get_flag (Grob *me) if (stem) { SCM s = stem->get_object ("flag"); - return unsmob_item (s); + return unsmob (s); } return 0; } @@ -97,8 +97,8 @@ Note_column::head_positions_interval (Grob *me) Direction Note_column::dir (Grob *me) { - Grob *stem = unsmob_grob (me->get_object ("stem")); - if (stem && Stem::has_interface (stem)) + Grob *stem = unsmob (me->get_object ("stem")); + if (has_interface (stem)) return get_grob_direction (stem); else { @@ -107,7 +107,10 @@ Note_column::dir (Grob *me) return (Direction)sign (head_positions_interval (me).center ()); } - programming_error ("note column without heads and stem"); + if (has_interface (me)) + programming_error ("Note_column without heads and stem"); + else + programming_error ("dir() given grob without Note_column interface"); return CENTER; } @@ -121,14 +124,14 @@ Note_column::set_stem (Grob *me, Grob *stem) Grob * Note_column::get_rest (Grob *me) { - return unsmob_grob (me->get_object ("rest")); + return unsmob (me->get_object ("rest")); } void Note_column::add_head (Grob *me, Grob *h) { bool both = false; - if (Rest::has_interface (h)) + if (has_interface (h)) { extract_grob_set (me, "note-heads", heads); if (heads.size ()) @@ -136,9 +139,9 @@ Note_column::add_head (Grob *me, Grob *h) else me->set_object ("rest", h->self_scm ()); } - else if (Note_head::has_interface (h)) + else if (has_interface (h)) { - if (unsmob_grob (me->get_object ("rest"))) + if (unsmob (me->get_object ("rest"))) both = true; Pointer_group_interface::add_grob (me, ly_symbol2scm ("note-heads"), h); } @@ -156,6 +159,33 @@ Note_column::first_head (Grob *me) return st ? Stem::first_head (st) : 0; } +/* + Return extent of the noteheads in the "main column", + (i.e. excluding any suspended noteheads), or extent + of the rest (if there are no heads). +*/ +Interval +Note_column::calc_main_extent (Grob *me) +{ + Grob *main_head = 0; + if (get_stem (me)) + main_head = first_head (me); + else + { + // no stems => no suspended noteheads. + extract_grob_set (me, "note-heads", heads); + if (heads.size()) + main_head = heads[0]; + } + Grob *main_item = main_head + ? main_head + : unsmob (me->get_object ("rest")); + + return main_item + ? main_item->extent (me, X_AXIS) + : Interval (0, 0); +} + /* Return the first AccidentalPlacement grob that we find in a note-head. */ @@ -167,7 +197,7 @@ Note_column::accidentals (Grob *me) for (vsize i = 0; i < heads.size (); i++) { Grob *h = heads[i]; - acc = h ? unsmob_grob (h->get_object ("accidental-grob")) : 0; + acc = h ? unsmob (h->get_object ("accidental-grob")) : 0; if (acc) break; } @@ -175,7 +205,7 @@ Note_column::accidentals (Grob *me) if (!acc) return 0; - if (Accidental_placement::has_interface (acc->get_parent (X_AXIS))) + if (has_interface (acc->get_parent (X_AXIS))) return acc->get_parent (X_AXIS); /* compatibility. */ @@ -188,7 +218,7 @@ Note_column::dot_column (Grob *me) extract_grob_set (me, "note-heads", heads); for (vsize i = 0; i < heads.size (); i++) { - Grob *dots = unsmob_grob (heads[i]->get_object ("dot")); + Grob *dots = unsmob (heads[i]->get_object ("dot")); if (dots) return dots->get_parent (X_AXIS); } diff --git a/lily/note-head-line-engraver.cc b/lily/note-head-line-engraver.cc index f4794474ab..b09fe66361 100644 --- a/lily/note-head-line-engraver.cc +++ b/lily/note-head-line-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,7 +39,7 @@ public: TRANSLATOR_DECLARATIONS (Note_head_line_engraver); protected: - DECLARE_ACKNOWLEDGER (rhythmic_head); + void acknowledge_rhythmic_head (Grob_info); void process_acknowledged (); void stop_translation_timestep (); @@ -64,13 +64,9 @@ void Note_head_line_engraver::acknowledge_rhythmic_head (Grob_info info) { head_ = info.grob (); - Context *tr = context (); - - while (tr && !tr->is_alias (ly_symbol2scm ("Staff"))) - tr = tr->get_parent_context (); - + Context *tr = find_context_above (context (), ly_symbol2scm ("Staff")); if (tr - && tr->is_alias (ly_symbol2scm ("Staff")) && tr != last_staff_ + && tr != last_staff_ && to_boolean (get_property ("followVoice"))) { if (last_head_) @@ -110,15 +106,18 @@ Note_head_line_engraver::stop_translation_timestep () #include "translator.icc" -ADD_ACKNOWLEDGER (Note_head_line_engraver, rhythmic_head); +void +Note_head_line_engraver::boot () +{ + ADD_ACKNOWLEDGER (Note_head_line_engraver, rhythmic_head); +} + ADD_TRANSLATOR (Note_head_line_engraver, /* doc */ - "Engrave a line between two note heads, for example a" - " glissando. If @code{followVoice} is set, staff switches" - " also generate a line.", + "Engrave a line between two note heads in a staff" + " switch if @code{followVoice} is set.", /* create */ - "Glissando " "VoiceFollower ", /* read */ diff --git a/lily/note-head-scheme.cc b/lily/note-head-scheme.cc index ef6770888a..c87aab64be 100644 --- a/lily/note-head-scheme.cc +++ b/lily/note-head-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -27,7 +27,7 @@ LY_DEFINE (ly_note_head__stem_attachment, "ly:note-head::stem-attachment", " notehead @var{glyph-name}.") { LY_ASSERT_SMOB (Font_metric, font_metric, 1); - Font_metric *fm = unsmob_metrics (font_metric); + Font_metric *fm = unsmob (font_metric); LY_ASSERT_TYPE (scm_is_string, glyph_name, 2); return ly_offset2scm (Note_head::get_stem_attachment (fm, ly_scm2string (glyph_name))); diff --git a/lily/note-head.cc b/lily/note-head.cc index 5d8352e72d..73a2255d90 100644 --- a/lily/note-head.cc +++ b/lily/note-head.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -51,7 +51,7 @@ internal_print (Grob *me, string *font_char) Stencil out = fm->find_by_name (idx_either + suffix); if (out.is_empty ()) { - Grob *stem = unsmob_grob (me->get_object ("stem")); + Grob *stem = unsmob (me->get_object ("stem")); Direction stem_dir = stem ? get_grob_direction (stem) : CENTER; if (stem_dir == CENTER) @@ -83,8 +83,8 @@ internal_print (Grob *me, string *font_char) if (style == "kievan" && 3 == robust_scm2int (me->get_property ("duration-log"), 2)) { - Grob *stem = unsmob_grob (me->get_object ("stem")); - Grob *beam = unsmob_grob (stem->get_object ("beam")); + Grob *stem = unsmob (me->get_object ("stem")); + Grob *beam = unsmob (stem->get_object ("beam")); if (beam) out = fm->find_by_name (idx_either + "2kievan"); } @@ -109,8 +109,8 @@ MAKE_SCHEME_CALLBACK (Note_head, stem_x_shift, 1); SCM Note_head::stem_x_shift (SCM smob) { - Grob *me = unsmob_grob (smob); - Grob *stem = unsmob_grob (me->get_object ("stem")); + Grob *me = unsmob (smob); + Grob *stem = unsmob (me->get_object ("stem")); if (stem) (void) stem->get_property ("positioning-done"); @@ -121,7 +121,7 @@ MAKE_SCHEME_CALLBACK (Note_head, print, 1); SCM Note_head::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); string idx; return internal_print (me, &idx).smobbed_copy (); @@ -131,7 +131,7 @@ MAKE_SCHEME_CALLBACK (Note_head, include_ledger_line_height, 1); SCM Note_head::include_ledger_line_height (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Grob *staff = Staff_symbol_referencer::get_staff_symbol (me); if (staff) @@ -190,7 +190,7 @@ MAKE_SCHEME_CALLBACK (Note_head, calc_stem_attachment, 1); SCM Note_head::calc_stem_attachment (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Font_metric *fm = Font_interface::get_default_font (me); string key; internal_print (me, &key); @@ -204,10 +204,13 @@ ADD_INTERFACE (Note_head, " @ruser{Note head styles}.", /* properties */ + "duration-log " "note-names " "accidental-grob " + "ignore-ambitus " "glyph-name " "stem-attachment " "style " + "ledger-positions " ); diff --git a/lily/note-heads-engraver.cc b/lily/note-heads-engraver.cc index 436861c0ae..5839a827eb 100644 --- a/lily/note-heads-engraver.cc +++ b/lily/note-heads-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ public: TRANSLATOR_DECLARATIONS (Note_heads_engraver); protected: - DECLARE_TRANSLATOR_LISTENER (note); + void listen_note (Stream_event *); void process_music (); void stop_translation_timestep (); }; @@ -50,7 +50,6 @@ Note_heads_engraver::Note_heads_engraver () { } -IMPLEMENT_TRANSLATOR_LISTENER (Note_heads_engraver, note); void Note_heads_engraver::listen_note (Stream_event *ev) { @@ -68,7 +67,7 @@ Note_heads_engraver::process_music () Stream_event *ev = note_evs_[i]; Item *note = make_item ("NoteHead", ev->self_scm ()); - Pitch *pit = unsmob_pitch (ev->get_property ("pitch")); + Pitch *pit = unsmob (ev->get_property ("pitch")); #if 0 /* TODO: should have a mechanism to switch off these warnings. */ @@ -99,9 +98,9 @@ Note_heads_engraver::process_music () if (scm_is_vector (shape_vector)) { SCM scm_tonic = get_property ("tonic"); - Pitch tonic (0, 0, 0); - if (unsmob_pitch (scm_tonic)) - tonic = *unsmob_pitch (scm_tonic); + Pitch tonic; + if (unsmob (scm_tonic)) + tonic = *unsmob (scm_tonic); unsigned int delta = (pit->get_notename () - tonic.get_notename () + 7) % 7; @@ -121,6 +120,12 @@ Note_heads_engraver::stop_translation_timestep () note_evs_.clear (); } +void +Note_heads_engraver::boot () +{ + ADD_LISTENER (Note_heads_engraver, note); +} + ADD_TRANSLATOR (Note_heads_engraver, /* doc */ "Generate note heads.", diff --git a/lily/note-name-engraver.cc b/lily/note-name-engraver.cc index c96b3776c0..2b8fa87000 100644 --- a/lily/note-name-engraver.cc +++ b/lily/note-name-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,12 +30,11 @@ public: TRANSLATOR_DECLARATIONS (Note_name_engraver); vector events_; - DECLARE_TRANSLATOR_LISTENER (note); + void listen_note (Stream_event *); void process_music (); void stop_translation_timestep (); }; -IMPLEMENT_TRANSLATOR_LISTENER (Note_name_engraver, note); void Note_name_engraver::listen_note (Stream_event *ev) { @@ -50,7 +49,7 @@ Note_name_engraver::process_music () { if (i) s += " "; - Pitch p = *unsmob_pitch (events_[i]->get_property ("pitch")); + Pitch p = *unsmob (events_[i]->get_property ("pitch")); if (!to_boolean (get_property ("printOctaveNames"))) p = Pitch (-1, p.get_notename (), p.get_alteration ()); @@ -74,6 +73,12 @@ Note_name_engraver::Note_name_engraver () { } +void +Note_name_engraver::boot () +{ + ADD_LISTENER (Note_name_engraver, note); +} + ADD_TRANSLATOR (Note_name_engraver, /* doc */ "Print pitches as words.", diff --git a/lily/note-performer.cc b/lily/note-performer.cc index ddf9fe3921..468210d20d 100644 --- a/lily/note-performer.cc +++ b/lily/note-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Jan Nieuwenhuizen + Copyright (C) 1996--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,14 +35,16 @@ protected: void stop_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (note); + void listen_note (Stream_event *); + void listen_breathing (Stream_event *); + void listen_tie (Stream_event *); + void listen_articulation (Stream_event *); private: - vector note_evs_; + vector note_evs_, script_evs_; vector notes_; vector last_notes_; Moment last_start_; - }; void @@ -53,41 +55,49 @@ Note_performer::process_music () Pitch transposing; SCM prop = get_property ("instrumentTransposition"); - if (unsmob_pitch (prop)) - transposing = *unsmob_pitch (prop); + if (unsmob (prop)) + transposing = *unsmob (prop); for (vsize i = 0; i < note_evs_.size (); i++) { Stream_event *n = note_evs_[i]; SCM pit = n->get_property ("pitch"); - if (Pitch *pitp = unsmob_pitch (pit)) + if (Pitch *pitp = unsmob (pit)) { SCM articulations = n->get_property ("articulations"); Stream_event *tie_event = 0; - for (SCM s = articulations; - !tie_event && scm_is_pair (s); - s = scm_cdr (s)) + Moment len = get_event_length (n, now_mom ()); + int velocity = 0; + + for (vsize j = script_evs_.size (); j--;) + articulations = scm_cons (script_evs_[j]->self_scm (), articulations); + + for (SCM s = articulations; scm_is_pair (s); s = scm_cdr (s)) { - Stream_event *ev = unsmob_stream_event (scm_car (s)); + Stream_event *ev = unsmob (scm_car (s)); if (!ev) continue; if (ev->in_event_class ("tie-event")) tie_event = ev; + SCM f = ev->get_property ("midi-length"); + if (ly_is_procedure (f)) + len = robust_scm2moment (scm_call_2 (f, len.smobbed_copy (), + context ()->self_scm ()), + len); + velocity += robust_scm2int (ev->get_property ("midi-extra-velocity"), 0); } - Moment len = get_event_length (n, now_mom ()); - Audio_note *p = new Audio_note (*pitp, len, - tie_event, transposing); + tie_event, transposing, velocity); Audio_element_info info (p, n); announce_element (info); notes_.push_back (p); /* - Shorten previous note. If it was part of a tie, shorten - the first note in the tie. + Grace notes shorten the previous non-grace note. If it was + part of a tie, shorten the first note in the tie. */ if (now_mom ().grace_part_) { @@ -96,7 +106,11 @@ Note_performer::process_music () for (vsize i = 0; i < last_notes_.size (); i++) { Audio_note *tie_head = last_notes_[i]->tie_head (); - tie_head->length_mom_ += Moment (0, now_mom ().grace_part_); + Moment start = tie_head->audio_column_->when (); + //Shorten the note if it would overlap. It might + //not if there's a rest in between. + if (start + tie_head->length_mom_ > now_mom ()) + tie_head->length_mom_ = now_mom () - start; } } } @@ -115,15 +129,59 @@ Note_performer::stop_translation_timestep () notes_.clear (); note_evs_.clear (); + script_evs_.clear (); } -IMPLEMENT_TRANSLATOR_LISTENER (Note_performer, note) void Note_performer::listen_note (Stream_event *ev) { note_evs_.push_back (ev); } +void +Note_performer::listen_tie (Stream_event *ev) +{ + script_evs_.push_back (ev); +} + +void +Note_performer::listen_articulation (Stream_event *ev) +{ + script_evs_.push_back (ev); +} + +void +Note_performer::listen_breathing (Stream_event *ev) +{ + //Shorten previous note if needed + SCM f = ev->get_property ("midi-length"); + if (ly_is_procedure (f)) + for (vsize i = 0; i < last_notes_.size (); i++) + { + //Pass midi-length the available time since the last note started, + //including any intervening rests. It returns how much is left for the + //note. + Moment start = last_notes_[i]->audio_column_->when (); + Moment available = now_mom () - start; + Moment len = robust_scm2moment (scm_call_2 (f, available.smobbed_copy (), + context ()->self_scm ()), available); + //Take time from the first note of the tie, since it has all the length. + Audio_note *tie_head = last_notes_[i]->tie_head (); + len += start - tie_head->audio_column_->when (); + if (len < tie_head->length_mom_) + tie_head->length_mom_ = len; + } +} + +void +Note_performer::boot () +{ + ADD_LISTENER (Note_performer, note); + ADD_LISTENER (Note_performer, breathing); + ADD_LISTENER (Note_performer, tie); + ADD_LISTENER (Note_performer, articulation); +} + ADD_TRANSLATOR (Note_performer, /* doc */ "", diff --git a/lily/note-spacing-engraver.cc b/lily/note-spacing-engraver.cc index 8cb1b3539d..414e1ee761 100644 --- a/lily/note-spacing-engraver.cc +++ b/lily/note-spacing-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,8 +40,8 @@ class Note_spacing_engraver : public Engraver TRANSLATOR_DECLARATIONS (Note_spacing_engraver); protected: - DECLARE_ACKNOWLEDGER (rhythmic_grob); - DECLARE_ACKNOWLEDGER (note_column); + void acknowledge_rhythmic_grob (Grob_info); + void acknowledge_note_column (Grob_info); void stop_translation_timestep (); virtual void finalize (); virtual void derived_mark () const; @@ -101,9 +101,9 @@ Note_spacing_engraver::finalize () Grob *last_spacing = last_spacings_[parent]; if (last_spacing - && !unsmob_grob_array (last_spacing->get_object ("right-items"))) + && !unsmob (last_spacing->get_object ("right-items"))) { - Grob *col = unsmob_grob (get_property ("currentCommandColumn")); + Grob *col = unsmob (get_property ("currentCommandColumn")); Pointer_group_interface::add_grob (last_spacing, ly_symbol2scm ("right-items"), @@ -120,7 +120,7 @@ Note_spacing_engraver::stop_translation_timestep () if (last_spacing && to_boolean (get_property ("hasStaffSpacing"))) { - Grob *col = unsmob_grob (get_property ("currentCommandColumn")); + Grob *col = unsmob (get_property ("currentCommandColumn")); Pointer_group_interface::add_grob (last_spacing, ly_symbol2scm ("right-items"), col); @@ -135,8 +135,13 @@ Note_spacing_engraver::stop_translation_timestep () } -ADD_ACKNOWLEDGER (Note_spacing_engraver, note_column); -ADD_ACKNOWLEDGER (Note_spacing_engraver, rhythmic_grob); + +void +Note_spacing_engraver::boot () +{ + ADD_ACKNOWLEDGER (Note_spacing_engraver, note_column); + ADD_ACKNOWLEDGER (Note_spacing_engraver, rhythmic_grob); +} ADD_TRANSLATOR (Note_spacing_engraver, /* doc */ diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc index 1d0d21fbbb..a894be2539 100644 --- a/lily/note-spacing.cc +++ b/lily/note-spacing.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,13 +36,12 @@ #include "warn.hh" /* - TODO: detect hshifts due to collisions, and account for them in - spacing? + Adjust the ideal and minimum distance between note columns, + based on the notehead size, skylines, and optical illusions. */ - Spring Note_spacing::get_spacing (Grob *me, Item *right_col, - Real base_space, Real increment) + Spring base, Real increment) { vector note_columns = Spacing_interface::left_note_columns (me); Real left_head_end = 0; @@ -50,7 +49,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, for (vsize i = 0; i < note_columns.size (); i++) { SCM r = note_columns[i]->get_object ("rest"); - Grob *g = unsmob_grob (r); + Grob *g = unsmob (r); Grob *col = note_columns[i]->get_column (); if (!g) @@ -73,16 +72,12 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, The main factor that determines the amount of space is the width of the note head (or the rest). For example, a quarter rest gets almost 0.5 ss less horizontal space than a note. - - The other parts of a note column (eg. flags, accidentals, etc.) don't get - the full amount of space. We give them half the amount of space, but then - adjust things so there are no collisions. */ + Real ideal = base.distance () - increment + left_head_end; Drul_array skys = Spacing_interface::skylines (me, right_col); Real distance = skys[LEFT].distance (skys[RIGHT], robust_scm2double (right_col->get_property ("skyline-vertical-padding"), 0.0)); Real min_dist = max (0.0, distance); - Real min_desired_space = left_head_end + (min_dist - left_head_end + base_space - increment) / 2; - Real ideal = base_space - increment + left_head_end; + base.set_min_distance (min_dist); /* If we have a NonMusical column on the right, we measure the ideal distance to the bar-line (if present), not the start of the column. */ @@ -95,24 +90,21 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, Bar_line::non_empty_barline); if (bar) + ideal -= bar->extent (right_col, X_AXIS)[LEFT]; + else { - Real shift = bar->extent (right_col, X_AXIS)[LEFT]; - ideal -= shift; - min_desired_space -= max (shift, 0.0); + /* Measure ideal distance to the right side of the NonMusical column + but keep at least half the gap we would have had to a note */ + Real min_desired_space = (ideal + min_dist) / 2.0; + ideal -= right_col->extent (right_col, X_AXIS)[RIGHT]; + ideal = max (ideal, min_desired_space); } - else - ideal -= right_col->extent (right_col, X_AXIS)[RIGHT]; } - ideal = max (ideal, min_desired_space); - stem_dir_correction (me, right_col, increment, &ideal, &min_desired_space); + stem_dir_correction (me, right_col, increment, &ideal); - /* TODO: grace notes look bad when things are stretched. Should we increase - their stretch strength? */ - Spring ret (max (0.0, ideal), min_dist); - ret.set_inverse_compress_strength (max (0.0, ideal - min_desired_space)); - ret.set_inverse_stretch_strength (max (0.1, base_space - increment)); - return ret; + base.set_distance (max (0.0, ideal)); + return base; } static Real @@ -206,7 +198,7 @@ same_direction_correction (Grob *note_spacing, Drul_array head_posns) void Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, Real increment, - Real *space, Real *fixed) + Real *space) { Drul_array stem_dirs (CENTER, CENTER); Drul_array stem_posns; @@ -236,7 +228,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, for (vsize i = 0; i < items.size (); i++) { Item *it = dynamic_cast (items[i]); - if (!Note_column::has_interface (it)) + if (!has_interface (it)) continue; if (d == RIGHT && it->get_column () != rcolumn) continue; @@ -273,7 +265,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, if (!hp.is_empty ()) { Real ss = Staff_symbol_referencer::staff_space (stem); - stem_posns[d] = stem->pure_height (stem, 0, INT_MAX) * (2 / ss); + stem_posns[d] = stem->pure_y_extent (stem, 0, INT_MAX) * (2 / ss); head_posns[d].unite (hp); } } @@ -310,7 +302,6 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, && !acc_right) correction = same_direction_correction (me, head_posns); - *fixed += correction; *space += correction; /* there used to be a correction for bar_xextent () here, but diff --git a/lily/one-line-auto-height-breaking.cc b/lily/one-line-auto-height-breaking.cc new file mode 100644 index 0000000000..bb0698fed4 --- /dev/null +++ b/lily/one-line-auto-height-breaking.cc @@ -0,0 +1,103 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2012 Joe Neeman + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#include "one-line-auto-height-breaking.hh" + +#include + +#include "column-x-positions.hh" +#include "international.hh" +#include "output-def.hh" +#include "page-spacing.hh" +#include "paper-book.hh" +#include "paper-score.hh" +#include "simple-spacer.hh" +#include "system.hh" + +One_line_auto_height_breaking::One_line_auto_height_breaking (Paper_book *pb) + : Page_breaking (pb, 0, 0) +{ +} + +One_line_auto_height_breaking::~One_line_auto_height_breaking () +{ +} + +/* + This is a somewhat unconventional page-breaking algorithm. Like + ly:one-line-breaking, every score is put on a single page, whose width + is enough to fit the entire score on one line. Line breaks and page + breaks are ignored, and the paper-width setting in the paper + block is modified to fit the music. Unlike ly:one-line-breaking + the paper-height setting in the paper block is also modified to fit + the music. +*/ +SCM +One_line_auto_height_breaking::solve () +{ + SCM all_pages = SCM_EOL; + Real max_width = 0; + Real max_height = 0; + + for (vsize i = 0; i < system_specs_.size (); ++i) + { + if (Paper_score *ps = system_specs_[i].pscore_) + { + vector cols = ps->root_system ()->used_columns (); + + // No indent, "infinite" line width, ragged. + Column_x_positions pos = get_line_configuration (cols, numeric_limits::max (), 0, true); + vector positions; + positions.push_back (pos); + + ps->root_system ()->break_into_pieces (positions); + ps->root_system ()->do_break_substitution_and_fixup_refpoints (); + Grob *system = ps->root_system ()->broken_intos_[0]; + + vector lines_per_page; + lines_per_page.push_back (1); + SCM systems = scm_list_1 (system->self_scm ()); + SCM pages = make_pages (lines_per_page, systems); + + max_width = max (max_width, system->extent (system, X_AXIS).length ()); + max_height = max (max_height, system->extent (system, Y_AXIS).length ()); + all_pages = scm_cons (scm_car (pages), all_pages); + } + else if (Prob *pb = system_specs_[i].prob_) + // Because we don't call Page_breaking::systems in this algorithm, + // we need to manually unprotect the titles. + pb->unprotect (); + } + + // Alter paper-width so that it is large enough to fit every system. + // TODO: it might be nice to allow different pages to have different widths + // and heights. This would need support in the backends (eg. framework-ps.scm). + Real right_margin = robust_scm2double (book_->paper_->c_variable ("right-margin"), 0.0); + Real left_margin = robust_scm2double (book_->paper_->c_variable ("left-margin"), 0.0); + Real width = max_width + right_margin + left_margin; + book_->paper_->set_variable (ly_symbol2scm ("paper-width"), scm_from_double (width)); + + // Alter paper-height so that it fits the height of the tallest system. + Real top_margin = robust_scm2double (book_->paper_->c_variable ("top-margin"), 0.0); + Real bottom_margin = robust_scm2double (book_->paper_->c_variable ("bottom-margin"), 0.0); + Real height = max_height + top_margin + bottom_margin; + book_->paper_->set_variable (ly_symbol2scm ("paper-height"), scm_from_double (height)); + + return scm_reverse_x (all_pages, SCM_EOL); +} diff --git a/lily/one-line-page-breaking.cc b/lily/one-line-page-breaking.cc index 213864462f..a3276f4216 100644 --- a/lily/one-line-page-breaking.cc +++ b/lily/one-line-page-breaking.cc @@ -41,10 +41,9 @@ One_line_page_breaking::~One_line_page_breaking () /* This is a somewhat unconventional page-breaking algorithm. Every - score will be put on a single page, whose width is enough - to fit the entire score one one line. Line breaks and page breaks - are ignored, and the paper-width setting in the paper block - will be modified to fit the music. + score is put on a single page, whose width is enough to fit the entire + score on one line. Line breaks and page breaks are ignored, and the + paper-width setting in the paper block is modified to fit the music. */ SCM One_line_page_breaking::solve () diff --git a/lily/open-type-font-scheme.cc b/lily/open-type-font-scheme.cc index 5b43a8d9da..d69d41d8ee 100644 --- a/lily/open-type-font-scheme.cc +++ b/lily/open-type-font-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,8 +17,20 @@ along with LilyPond. If not, see . */ +#include +#include "international.hh" #include "modified-font-metric.hh" #include "open-type-font.hh" +#include "freetype.hh" + +#ifdef FT_FONT_FORMATS_H +/* FreeType 2.6+ */ +#include FT_FONT_FORMATS_H +#else +/* FreeType 2.5.5 and earlier */ +#include FT_XFREE86_H +#define FT_Get_Font_Format FT_Get_X11_Font_Format +#endif LY_DEFINE (ly_font_sub_fonts, "ly:font-sub-fonts", 1, 0, 0, (SCM font), @@ -27,7 +39,7 @@ LY_DEFINE (ly_font_sub_fonts, "ly:font-sub-fonts", 1, 0, 0, { LY_ASSERT_SMOB (Font_metric, font, 1); - Font_metric *fm = unsmob_metrics (font); + Font_metric *fm = unsmob (font); return fm->sub_fonts (); } @@ -37,10 +49,10 @@ LY_DEFINE (ly_otf_font_glyph_info, "ly:otf-font-glyph-info", 2, 0, 0, " information about named glyph @var{glyph} (a string).") { Modified_font_metric *fm - = dynamic_cast (unsmob_metrics (font)); + = unsmob (font); Open_type_font *otf = fm ? dynamic_cast (fm->original_font ()) - : dynamic_cast (unsmob_metrics (font)); + : unsmob (font); SCM_ASSERT_TYPE (otf, font, SCM_ARG1, __FUNCTION__, "OpenType font"); LY_ASSERT_TYPE (scm_is_string, glyph, 2); @@ -55,10 +67,10 @@ LY_DEFINE (ly_otf_font_table_data, "ly:otf-font-table-data", 2, 0, 0, " for non-existent @var{tag}.") { Modified_font_metric *fm - = dynamic_cast (unsmob_metrics (font)); + = unsmob (font); Open_type_font *otf = fm ? dynamic_cast (fm->original_font ()) - : dynamic_cast (unsmob_metrics (font)); + : unsmob (font); SCM_ASSERT_TYPE (otf, font, SCM_ARG1, __FUNCTION__, "OpenType font"); LY_ASSERT_TYPE (scm_is_string, tag, 2); @@ -70,7 +82,7 @@ LY_DEFINE (ly_otf_font_table_data, "ly:otf-font-table-data", 2, 0, 0, string tab = otf->get_otf_table (string (ctag)); - return scm_from_locale_stringn ((char const *) tab.data (), tab.length ()); + return scm_from_latin1_stringn ((char const *) tab.data (), tab.length ()); } LY_DEFINE (ly_otf_font_p, "ly:otf-font?", 1, 0, 0, @@ -78,10 +90,10 @@ LY_DEFINE (ly_otf_font_p, "ly:otf-font?", 1, 0, 0, "Is @var{font} an OpenType font?") { Modified_font_metric *fm - = dynamic_cast (unsmob_metrics (font)); + = unsmob (font); Open_type_font *otf = fm ? dynamic_cast (fm->original_font ()) - : dynamic_cast (unsmob_metrics (font)); + : unsmob (font); return scm_from_bool (otf); } @@ -91,10 +103,10 @@ LY_DEFINE (ly_otf_glyph_count, "ly:otf-glyph-count", 1, 0, 0, "Return the number of glyphs in @var{font}.") { Modified_font_metric *fm - = dynamic_cast (unsmob_metrics (font)); + = unsmob (font); Open_type_font *otf = fm ? dynamic_cast (fm->original_font ()) - : dynamic_cast (unsmob_metrics (font)); + : unsmob (font); SCM_ASSERT_TYPE (otf, font, SCM_ARG1, __FUNCTION__, "OpenType font"); @@ -106,12 +118,262 @@ LY_DEFINE (ly_otf_glyph_list, "ly:otf-glyph-list", 1, 0, 0, "Return a list of glyph names for @var{font}.") { Modified_font_metric *fm - = dynamic_cast (unsmob_metrics (font)); + = unsmob (font); Open_type_font *otf = fm ? dynamic_cast (fm->original_font ()) - : dynamic_cast (unsmob_metrics (font)); + : unsmob (font); SCM_ASSERT_TYPE (otf, font, SCM_ARG1, __FUNCTION__, "OpenType font"); return otf->glyph_list (); } + +LY_DEFINE (ly_get_font_format, "ly:get-font-format", + 1, 1, 0, (SCM font_file_name, SCM idx), + "Get the font format for @var{font_file_name}," + " returning it as a symbol. The optional" + " @var{idx} argument is useful for TrueType Collections (TTC) and" + " OpenType/CFF collections (OTC) only;" + " it specifies the font index within the TTC/OTC." + " The default value of @var{idx} is@tie{}0.") +{ + LY_ASSERT_TYPE (scm_is_string, font_file_name, 1); + + int i = 0; + if (!SCM_UNBNDP (idx)) + { + LY_ASSERT_TYPE (scm_is_integer, idx, 2); + i = scm_to_int (idx); + if (i < 0) + { + warning (_ ("font index must be non-negative, using index 0")); + i = 0; + } + } + + string file_name = ly_scm2string (font_file_name); + + FT_Face face; + /* check whether font index is valid */ + if (i > 0) + { + face = open_ft_face (file_name, -1); + if (i >= face->num_faces) + { + warning (_f ("font index %d too large for font `%s', using index 0", + i, file_name.c_str ())); + i = 0; + } + FT_Done_Face (face); + } + + face = open_ft_face (file_name, i); + SCM asscm = scm_from_ascii_symbol (FT_Get_Font_Format (face)); + FT_Done_Face (face); + + return asscm; +} + +LY_DEFINE (ly_has_glyph_names_p, "ly:has-glyph-names?", + 1, 1, 0, (SCM font_file_name, SCM idx), + "Does the font for @var{font_file_name} have glyph names?" + " The optional @var{idx} argument is useful for" + " TrueType Collections (TTC) and" + " OpenType/CFF collections (OTC) only;" + " it specifies the font index within the TTC/OTC." + " The default value of @var{idx} is@tie{}0.") +{ + LY_ASSERT_TYPE (scm_is_string, font_file_name, 1); + + int i = 0; + if (!SCM_UNBNDP (idx)) + { + LY_ASSERT_TYPE (scm_is_integer, idx, 2); + i = scm_to_int (idx); + if (i < 0) + { + warning (_ ("font index must be non-negative, using index 0")); + i = 0; + } + } + + string file_name = ly_scm2string (font_file_name); + + FT_Face face; + /* check whether font index is valid */ + if (i > 0) + { + face = open_ft_face (file_name, -1); + if (i >= face->num_faces) + { + warning (_f ("font index %d too large for font `%s', using index 0", + i, file_name.c_str ())); + i = 0; + } + FT_Done_Face (face); + } + + face = open_ft_face (file_name, i); + bool has_glyph_names = FT_HAS_GLYPH_NAMES(face); + FT_Done_Face (face); + + return has_glyph_names ? SCM_BOOL_T : SCM_BOOL_F; +} + +LY_DEFINE (ly_get_cff_offset, "ly:get-cff-offset", + 1, 1, 0, (SCM font_file_name, SCM idx), + "Get the offset of 'CFF' table for @var{font_file_name}," + " returning it as an integer. The optional" + " @var{idx} argument is useful for" + " OpenType/CFF collections (OTC) only;" + " it specifies the font index within the OTC." + " The default value of @var{idx} is@tie{}0.") +{ + LY_ASSERT_TYPE (scm_is_string, font_file_name, 1); + + int i = 0; + if (!SCM_UNBNDP (idx)) + { + LY_ASSERT_TYPE (scm_is_integer, idx, 2); + i = scm_to_int (idx); + if (i < 0) + { + warning (_ ("font index must be non-negative, using index 0")); + i = 0; + } + } + + string file_name = ly_scm2string (font_file_name); + + FILE *fp = fopen (file_name.c_str (), "rb"); + if (!fp) + { + warning (_f ("cannot open font filename `%s'", file_name.c_str ())); + return SCM_BOOL_F; + } + + char buff[4]; + + // Read `sfnt version` (for OTF) or `TTCTag` (for OTC) + if (fread (buff, 4, 1, fp) != 1) + { + fclose (fp); + warning (_f ("cannot read %s of `%s'", "header", file_name.c_str ())); + return SCM_BOOL_F; + } + + if (buff[0] == 't' && buff[1] == 't' && buff[2] == 'c' && buff[3] == 'f') + { + // For OTC + // Find subfont + + // Skip `Version` + fseek (fp, 4, SEEK_CUR); + + // Read `numFonts` + if (fread (buff, 4, 1, fp) != 1) + { + fclose (fp); + warning (_f ("cannot read %s of `%s'", + "numFonts", file_name.c_str ())); + return SCM_BOOL_F; + } + int numfonts = + static_cast(buff[0]) << 24 | + static_cast(buff[1]) << 16 | + static_cast(buff[2]) << 8 | + static_cast(buff[3]); + + if ( i > numfonts ) + { + warning (_f ("font index %d too large for font `%s', using index 0", + i, file_name.c_str ())); + i = 0; + } + + // Read `OffsetTable[i]` + if (i) + fseek (fp, i * 4, SEEK_CUR); + if (fread (buff, 4, 1, fp) != 1) + { + fclose (fp); + warning (_f ("cannot read %s of `%s'", + "OffsetTable", file_name.c_str ())); + return SCM_BOOL_F; + } + unsigned int offset = + static_cast(buff[0]) << 24 | + static_cast(buff[1]) << 16 | + static_cast(buff[2]) << 8 | + static_cast(buff[3]); + + // Seek to subfont and skip `sfnt version` + fseek (fp, offset + 4, SEEK_SET); + } + + // For OTF or subfont of OTC + + // Read `numTables` + if (fread (buff, 2, 1, fp) != 1) + { + fclose (fp); + warning (_f ("cannot read %s of `%s'", + "numTables", file_name.c_str ())); + return SCM_BOOL_F; + } + int numtables = + static_cast(buff[0]) << 8 | + static_cast(buff[1]); + + // Skip `searchRange`, `entrySelector` and `rangeShift` + fseek (fp, 6, SEEK_CUR); + + // Read Table Records + for (int t = 0; t < numtables; t++) + { + // Read `tag` + if (fread (buff, 4, 1, fp) != 1) + { + fclose (fp); + warning (_f ("cannot read %s of `%s'", + "tag", file_name.c_str ())); + return SCM_BOOL_F; + } + + if (buff[0] == 'C' && buff[1] == 'F' && buff[2] == 'F' && buff[3] == ' ') + { + // CFF table is found. + + // Skip `checkSum` + fseek (fp, 4, SEEK_CUR); + + // Read `offset` + if (fread (buff, 4, 1, fp) != 1) + { + fclose (fp); + warning (_f ("cannot read %s of `%s'", + "CFF offset", file_name.c_str ())); + return SCM_BOOL_F; + } + unsigned int offset = + static_cast(buff[0]) << 24 | + static_cast(buff[1]) << 16 | + static_cast(buff[2]) << 8 | + static_cast(buff[3]); + + // Done + fclose (fp); + return scm_from_unsigned_integer (offset); + } + + // For non-CFF table + + // Skip `checkSum`, `offset` and `length` + fseek (fp, 12, SEEK_CUR); + } + + fclose (fp); + warning (_f ("font `%s' index %d does not have `CFF' table", + file_name.c_str (), i)); + return SCM_BOOL_F; +} diff --git a/lily/open-type-font.cc b/lily/open-type-font.cc index 76bbff86ed..f39d924a68 100644 --- a/lily/open-type-font.cc +++ b/lily/open-type-font.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,15 @@ #include "open-type-font.hh" #include "freetype.hh" +#ifdef FT_FONT_FORMATS_H +/* FreeType 2.6+ */ +#include FT_FONT_FORMATS_H +#else +/* FreeType 2.5.5 and earlier */ +#include FT_XFREE86_H +#define FT_Get_Font_Format FT_Get_X11_Font_Format +#endif + #include using namespace std; @@ -27,7 +36,6 @@ using namespace std; #include FT_TRUETYPE_TABLES_H #include "dimensions.hh" -#include "freetype.hh" #include "international.hh" #include "modified-font-metric.hh" #include "warn.hh" @@ -77,7 +85,11 @@ load_scheme_table (char const *tag_str, FT_Face face) string contents ((char const *)buffer, length); contents = "(quote (" + contents + "))"; +#if GUILEV2 + tab = scm_eval_string (scm_from_utf8_string (contents.c_str ())); +#else tab = scm_c_eval_string (contents.c_str ()); +#endif free (buffer); } return tab; @@ -117,6 +129,119 @@ open_ft_face (const string &str, FT_Long idx) return face; } +string +get_postscript_name (FT_Face face) +{ + string face_ps_name; + const char *psname = FT_Get_Postscript_Name (face); + if (psname) + face_ps_name = psname; + else + { + warning (_ ("cannot get postscript name")); + return ""; + } + + const char *fmt = FT_Get_Font_Format (face); + if (fmt) + { + if (static_cast(fmt) != "CFF") + return face_ps_name; // For non-CFF font, pass it through. + } + else + { + warning (_f ("cannot get font %s format", face_ps_name.c_str ())); + return face_ps_name; + } + + // For OTF and OTC fonts, we use data from the font's 'CFF' table only + // because other tables are not embedded in the output PS file. + string cff_table = get_otf_table (face, "CFF "); + + FT_Open_Args args; + args.flags = FT_OPEN_MEMORY; + args.memory_base = static_cast + (static_cast(cff_table.data ())); + args.memory_size = cff_table.size (); + + FT_Face cff_face; + // According to OpenType Specification ver 1.7, + // the CFF (derived from OTF and OTC) has only one name. + // So we use zero as the font index. + FT_Error error_code = FT_Open_Face (freetype2_library, &args, + 0 /* font index */, + &cff_face); + if (error_code) + { + warning (_f ("cannot read CFF %s: %s", + face_ps_name, + freetype_error_string (error_code).c_str ())); + return face_ps_name; + } + + string ret; + const char *cffname = FT_Get_Postscript_Name (cff_face); + if (cffname) + ret = cffname; + else + { + // FreeType 2.6 and 2.6.1 cannot get PS name from pure-CFF. + // (FreeType 2.5.5 and earlier does not have this issue. + // FreeType 2.6.2+ has this bug fixed.) + // So we need direct parsing of the 'CFF' table, in this case. + + debug_output (_f ("Directly parsing 'CFF' table of font %s.", + face_ps_name.c_str ())); + + // See Adobe technote '5176.CFF.pdf', sections 2 and 5-7. + size_t hdrsize = static_cast(cff_table.at(2)); + string::iterator it = cff_table.begin () + hdrsize; + + unsigned int name_index_count; + name_index_count = static_cast(*it++) << 8; + name_index_count |= static_cast(*it++); + + size_t offsize = static_cast(*it++); + + if (name_index_count && 1 <= offsize && offsize <= 4) + { + // We get the first name in the CFF's name index + // because this CFF (derived from OTF and OTC) + // has only one name. + size_t off1 = 0, off2 = 0; + for (size_t t = 0; t < offsize; t++) + off1 = ( off1 << 8 ) | static_cast(*it++); + if (off1) + { + for (size_t t = 0; t < offsize; t++) + off2 = ( off2 << 8 ) | static_cast(*it++); + } + if (off1 && off1 < off2) + { + ret.assign (&cff_table.at(hdrsize + 3 + + offsize * (name_index_count + 1) + + off1 - 1), + &cff_table.at(hdrsize + 3 + + offsize * (name_index_count + 1) + + off2 - 1)); + } + } + + if (ret.empty ()) + { + warning (_f ("cannot get font %s CFF name", face_ps_name.c_str ())); + ret = face_ps_name; + } + } + + debug_output (_f ("Replace font name from %s to %s.", + face_ps_name.c_str (), ret.c_str ())); + + FT_Done_Face (cff_face); + + return ret; +} + SCM Open_type_font::make_otf (const string &str) { @@ -140,6 +265,8 @@ Open_type_font::Open_type_font (FT_Face face) index_to_charcode_map_ = make_index_to_charcode_map (face_); lily_index_to_bbox_table_ = scm_c_make_hash_table (257); + + postscript_name_ = get_postscript_name (face_); } void @@ -158,7 +285,7 @@ Open_type_font::attachment_point (const string &glyph_name) const SCM entry = scm_hashq_ref (lily_character_table_, sym, SCM_BOOL_F); Offset o; - if (entry == SCM_BOOL_F) + if (scm_is_false (entry)) return o; SCM char_alist = entry; @@ -174,7 +301,7 @@ Open_type_font::get_indexed_char_dimensions (size_t signed_idx) const { SCM box = scm_hashq_ref (lily_index_to_bbox_table_, scm_from_unsigned_integer (signed_idx), SCM_BOOL_F); - Box *box_ptr = Box::unsmob (box); + Box *box_ptr = unsmob (box); if (box_ptr) return *box_ptr; } @@ -192,7 +319,7 @@ Open_type_font::get_indexed_char_dimensions (size_t signed_idx) const SCM sym = ly_symbol2scm (name); SCM alist = scm_hashq_ref (lily_character_table_, sym, SCM_BOOL_F); - if (alist != SCM_BOOL_F) + if (scm_is_true (alist)) { SCM bbox = scm_cdr (scm_assq (ly_symbol2scm ("bbox"), alist)); @@ -319,7 +446,7 @@ Open_type_font::get_global_table () const string Open_type_font::font_name () const { - return FT_Get_Postscript_Name (face_); + return postscript_name_; } SCM @@ -337,7 +464,7 @@ Open_type_font::glyph_list () const warning (_f ("FT_Get_Glyph_Name () error: %s", freetype_error_string (code).c_str ())); - *tail = scm_cons (scm_from_locale_string (name), SCM_EOL); + *tail = scm_cons (scm_from_ascii_string (name), SCM_EOL); tail = SCM_CDRLOC (*tail); } diff --git a/lily/optimal-page-breaking.cc b/lily/optimal-page-breaking.cc index 3ff29d01bd..4bcf05f8e4 100644 --- a/lily/optimal-page-breaking.cc +++ b/lily/optimal-page-breaking.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/ottava-bracket.cc b/lily/ottava-bracket.cc index f70a30b404..63a9d3ebca 100644 --- a/lily/ottava-bracket.cc +++ b/lily/ottava-bracket.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,7 +35,6 @@ struct Ottava_bracket { DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); }; /* @@ -49,7 +48,7 @@ MAKE_SCHEME_CALLBACK (Ottava_bracket, print, 1); SCM Ottava_bracket::print (SCM smob) { - Spanner *me = dynamic_cast (unsmob_grob (smob)); + Spanner *me = unsmob (smob); Interval span_points; Grob *common = me->get_bound (LEFT)->common_refpoint (me->get_bound (RIGHT), X_AXIS); @@ -61,7 +60,7 @@ Ottava_bracket::print (SCM smob) Item *b = me->get_bound (d); broken[d] = (b->break_status_dir () != CENTER); - if (Note_column::has_interface (b)) + if (has_interface (b)) { extract_grob_set (b, "note-heads", heads); common = common_refpoint_of_array (heads, common, X_AXIS); @@ -79,7 +78,7 @@ Ottava_bracket::print (SCM smob) SCM markup = me->get_property ("text"); Stencil text; if (Text_interface::is_markup (markup)) - text = *unsmob_stencil (Text_interface::interpret_markup (layout->self_scm (), + text = *unsmob (Text_interface::interpret_markup (layout->self_scm (), properties, markup)); Drul_array shorten = robust_scm2interval (me->get_property ("shorten-pair"), @@ -94,7 +93,7 @@ Ottava_bracket::print (SCM smob) Item *b = me->get_bound (d); Interval ext; - if (Note_column::has_interface (b)) + if (has_interface (b)) { extract_grob_set (b, "note-heads", heads); for (vsize i = 0; i < heads.size (); i++) @@ -119,6 +118,8 @@ Ottava_bracket::print (SCM smob) else span_points[d] = ext[d]; + + span_points[d] -= d * shorten[d]; } /* @@ -155,21 +156,19 @@ Ottava_bracket::print (SCM smob) Y_AXIS, Offset (bracket_span_points.length (), 0), edge_height, empty, - flare, shorten); + flare, Drul_array (0, 0)); /* - The vertical lines should not take space, for the following scenario: - - 8 -----+ - o | - | - | - - - Just a small amount, yes. In tight situations, it is even - possible to center the `8' directly below the note, dropping the - ottava line completely... - + * The vertical lines should not take space, for the following scenario: + * + * 8 -----+ + * o | + * | + * | + * + * Just a small amount, yes. In tight situations, it is even + * possible to center the `8' directly below the note, dropping the + * ottava line completely... */ b = Stencil (Box (b.extent (X_AXIS), diff --git a/lily/ottava-engraver.cc b/lily/ottava-engraver.cc index bd39702bdb..e681e73af6 100644 --- a/lily/ottava-engraver.cc +++ b/lily/ottava-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,7 +32,7 @@ public: protected: virtual void finalize (); - DECLARE_ACKNOWLEDGER (note_column); + void acknowledge_note_column (Grob_info); void process_music (); void stop_translation_timestep (); @@ -103,7 +103,7 @@ Ottava_spanner_engraver::typeset_all () { if (!finished_->get_bound (RIGHT)) { - Grob *e = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *e = unsmob (get_property ("currentMusicalColumn")); finished_->set_bound (d, e); } } @@ -117,7 +117,7 @@ Ottava_spanner_engraver::stop_translation_timestep () { if (span_ && !span_->get_bound (LEFT)) { - Grob *e = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *e = unsmob (get_property ("currentMusicalColumn")); span_->set_bound (LEFT, e); } @@ -136,7 +136,12 @@ Ottava_spanner_engraver::finalize () #include "translator.icc" -ADD_ACKNOWLEDGER (Ottava_spanner_engraver, note_column); + +void +Ottava_spanner_engraver::boot () +{ + ADD_ACKNOWLEDGER (Ottava_spanner_engraver, note_column); +} ADD_TRANSLATOR (Ottava_spanner_engraver, /* doc */ diff --git a/lily/output-def-scheme.cc b/lily/output-def-scheme.cc index a2e1e34513..65673c8a9e 100644 --- a/lily/output-def-scheme.cc +++ b/lily/output-def-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,13 +32,13 @@ LY_DEFINE (ly_output_def_lookup, "ly:output-def-lookup", " @var{val} or @code{'()} if @var{val} is undefined.") { LY_ASSERT_SMOB (Output_def, def, 1); - Output_def *op = unsmob_output_def (def); + Output_def *op = unsmob (def); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); SCM answer = op->lookup_variable (sym); - if (answer == SCM_UNDEFINED) + if (SCM_UNBNDP (answer)) { - if (val == SCM_UNDEFINED) + if (SCM_UNBNDP (val)) val = SCM_EOL; answer = val; @@ -52,7 +52,7 @@ LY_DEFINE (ly_output_def_scope, "ly:output-def-scope", "Return the variable scope inside @var{def}.") { LY_ASSERT_SMOB (Output_def, def, 1); - Output_def *op = unsmob_output_def (def); + Output_def *op = unsmob (def); return op->scope_; } @@ -61,7 +61,7 @@ LY_DEFINE (ly_output_def_parent, "ly:output-def-parent", "Return the parent output definition of @var{def}.") { LY_ASSERT_SMOB (Output_def, def, 1); - Output_def *op = unsmob_output_def (def); + Output_def *op = unsmob (def); return op->parent_ ? op->parent_->self_scm () : SCM_EOL; } @@ -70,7 +70,7 @@ LY_DEFINE (ly_output_def_set_variable_x, "ly:output-def-set-variable!", "Set an output definition @var{def} variable @var{sym} to @var{val}.") { LY_ASSERT_SMOB (Output_def, def, 1); - Output_def *output_def = unsmob_output_def (def); + Output_def *output_def = unsmob (def); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); output_def->set_variable (sym, val); return SCM_UNSPECIFIED; @@ -81,7 +81,7 @@ LY_DEFINE (ly_output_def_clone, "ly:output-def-clone", "Clone output definition @var{def}.") { LY_ASSERT_SMOB (Output_def, def, 1); - Output_def *op = unsmob_output_def (def); + Output_def *op = unsmob (def); Output_def *clone = op->clone (); return clone->unprotect (); @@ -93,16 +93,16 @@ LY_DEFINE (ly_output_description, "ly:output-description", { LY_ASSERT_SMOB (Output_def, output_def, 1); - Output_def *id = unsmob_output_def (output_def); + Output_def *id = unsmob (output_def); SCM al = ly_module_2_alist (id->scope_); SCM ell = SCM_EOL; for (SCM s = al; scm_is_pair (s); s = scm_cdr (s)) { - Context_def *td = unsmob_context_def (scm_cdar (s)); + Context_def *td = unsmob (scm_cdar (s)); SCM key = scm_caar (s); - if (td && key == td->get_context_name ()) - ell = scm_cons (scm_cons (key, td->to_alist ()), ell); + if (td && scm_is_eq (key, td->get_context_name ())) + ell = scm_cons (scm_cons (key, td->to_alist ()), ell); } return ell; } @@ -116,14 +116,14 @@ LY_DEFINE (ly_output_find_context_def, "ly:output-find-context-def", if (!SCM_UNBNDP (context_name)) LY_ASSERT_TYPE (ly_is_symbol, context_name, 2); - Output_def *id = unsmob_output_def (output_def); + Output_def *id = unsmob (output_def); SCM al = ly_module_2_alist (id->scope_); SCM ell = SCM_EOL; for (SCM s = al; scm_is_pair (s); s = scm_cdr (s)) { SCM p = scm_car (s); - Context_def *td = unsmob_context_def (scm_cdr (p)); + Context_def *td = unsmob (scm_cdr (p)); if (td && scm_is_eq (scm_car (p), td->get_context_name ()) && (SCM_UNBNDP (context_name) || td->is_alias (context_name))) ell = scm_cons (p, ell); @@ -131,20 +131,15 @@ LY_DEFINE (ly_output_find_context_def, "ly:output-find-context-def", return ell; } - -LY_DEFINE (ly_output_def_p, "ly:output-def?", - 1, 0, 0, (SCM def), - "Is @var{def} an output definition?") -{ - return ly_bool2scm (unsmob_output_def (def)); -} +const char +* const Output_def::type_p_name_ = "ly:output-def?"; LY_DEFINE (ly_paper_outputscale, "ly:paper-outputscale", 1, 0, 0, (SCM def), "Return the output-scale for output definition @var{def}.") { LY_ASSERT_SMOB (Output_def, def, 1); - Output_def *b = unsmob_output_def (def); + Output_def *b = unsmob (def); return scm_from_double (output_scale (b)); } @@ -165,7 +160,7 @@ LY_DEFINE (ly_paper_get_font, "ly:paper-get-font", { LY_ASSERT_SMOB (Output_def, def, 1); - Output_def *paper = unsmob_output_def (def); + Output_def *paper = unsmob (def); Font_metric *fm = select_font (paper, chain); return fm->self_scm (); } @@ -176,7 +171,7 @@ LY_DEFINE (ly_paper_get_number, "ly:paper-get-number", " @var{def} as a double.") { LY_ASSERT_SMOB (Output_def, def, 1); - Output_def *layout = unsmob_output_def (def); + Output_def *layout = unsmob (def); return scm_from_double (layout->get_dimension (sym)); } @@ -186,13 +181,13 @@ LY_DEFINE (ly_paper_fonts, "ly:paper-fonts", " @var{def} (e.g., @code{\\paper}).") { LY_ASSERT_SMOB (Output_def, def, 1); - Output_def *b = unsmob_output_def (def); + Output_def *b = unsmob (def); SCM tab1 = b->lookup_variable (ly_symbol2scm ("scaled-fonts")); SCM tab2 = b->lookup_variable (ly_symbol2scm ("pango-fonts")); SCM alist1 = SCM_EOL; - if (scm_hash_table_p (tab1) == SCM_BOOL_T) + if (to_boolean (scm_hash_table_p (tab1))) { alist1 = scm_append (ly_alist_vals (ly_hash2alist (tab1))); @@ -200,7 +195,7 @@ LY_DEFINE (ly_paper_fonts, "ly:paper-fonts", } SCM alist2 = SCM_EOL; - if (scm_hash_table_p (tab2) == SCM_BOOL_T) + if (scm_is_true (scm_hash_table_p (tab2))) { // strip original-fonts/pango-font-descriptions alist2 = scm_append (ly_alist_vals (ly_hash2alist (tab2))); @@ -215,7 +210,7 @@ LY_DEFINE (ly_paper_fonts, "ly:paper-fonts", { SCM entry = scm_car (s); - Font_metric *fm = unsmob_metrics (entry); + Font_metric *fm = unsmob (entry); if (dynamic_cast (fm) || dynamic_cast (fm)) diff --git a/lily/output-def.cc b/lily/output-def.cc index addb0ef1ef..e277a00534 100644 --- a/lily/output-def.cc +++ b/lily/output-def.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,19 +17,17 @@ along with LilyPond. If not, see . */ -#include "output-def.hh" - #include "context-def.hh" #include "file-path.hh" #include "global-context.hh" #include "international.hh" #include "interval.hh" +#include "ly-module.hh" #include "main.hh" #include "output-def.hh" #include "scm-hash.hh" #include "warn.hh" -#include "ly-smobs.icc" #include "program-option.hh" @@ -46,6 +44,7 @@ Output_def::Output_def () } Output_def::Output_def (Output_def const &s) + : Smob () { scope_ = SCM_EOL; parent_ = 0; @@ -61,26 +60,22 @@ Output_def::~Output_def () { } -IMPLEMENT_SMOBS (Output_def); -IMPLEMENT_DEFAULT_EQUAL_P (Output_def); SCM -Output_def::mark_smob (SCM m) +Output_def::mark_smob () const { - Output_def *mo = (Output_def*) SCM_CELL_WORD_1 (m); - /* FIXME: why is this necessary? all paper_ should be protected by themselves. */ - if (mo->parent_) - scm_gc_mark (mo->parent_->self_scm ()); + if (parent_) + scm_gc_mark (parent_->self_scm ()); - return mo->scope_; + return scope_; } void assign_context_def (Output_def * m, SCM transdef) { - Context_def *tp = unsmob_context_def (transdef); + Context_def *tp = unsmob (transdef); assert (tp); if (tp) @@ -94,16 +89,15 @@ assign_context_def (Output_def * m, SCM transdef) SCM find_context_def (Output_def const *m, SCM name) { - Context_def *cd = unsmob_context_def (m->lookup_variable (name)); + Context_def *cd = unsmob (m->lookup_variable (name)); return cd ? cd->self_scm () : SCM_EOL; } int -Output_def::print_smob (SCM s, SCM p, scm_print_state *) +Output_def::print_smob (SCM p, scm_print_state *) const { - Output_def * def = unsmob_output_def (s); scm_puts ("#< ", p); - scm_puts (def->class_name (), p); + scm_puts (class_name (), p); scm_puts (">", p); return 1; } @@ -119,7 +113,7 @@ SCM Output_def::lookup_variable (SCM sym) const { SCM var = ly_module_lookup (scope_, sym); - if (SCM_VARIABLEP (var) && SCM_VARIABLE_REF (var) != SCM_UNDEFINED) + if (SCM_VARIABLEP (var) && !SCM_UNBNDP (SCM_VARIABLE_REF (var))) return SCM_VARIABLE_REF (var); if (parent_) @@ -165,9 +159,9 @@ Output_def::normalize () ? c_variable ("inner-margin") : c_variable ("right-margin")); - if (scm_paper_width == SCM_UNDEFINED - || scm_left_margin_default == SCM_UNDEFINED - || scm_right_margin_default == SCM_UNDEFINED) + if (SCM_UNBNDP (scm_paper_width) + || SCM_UNBNDP (scm_left_margin_default) + || SCM_UNBNDP (scm_right_margin_default)) { programming_error ("called normalize () on paper with missing settings"); return; @@ -188,12 +182,12 @@ Output_def::normalize () if (twosided) binding_offset = robust_scm2double (c_variable ("binding-offset"), 0); - if (scm_line_width == SCM_UNDEFINED) + if (SCM_UNBNDP (scm_line_width)) { - left_margin = ((scm_left_margin == SCM_UNDEFINED) + left_margin = (SCM_UNBNDP (scm_left_margin) ? left_margin_default : scm_to_double (scm_left_margin)); - right_margin = ((scm_right_margin == SCM_UNDEFINED) + right_margin = (SCM_UNBNDP (scm_right_margin) ? right_margin_default : scm_to_double (scm_right_margin)) + binding_offset; line_width = paper_width - left_margin - right_margin; @@ -201,10 +195,10 @@ Output_def::normalize () else { line_width = scm_to_double (scm_line_width); - if (scm_left_margin == SCM_UNDEFINED) + if (SCM_UNBNDP (scm_left_margin)) { // Vertically center systems if only line-width is given - if (scm_right_margin == SCM_UNDEFINED) + if (SCM_UNBNDP (scm_right_margin)) { left_margin = (paper_width - line_width) / 2; right_margin = left_margin; @@ -218,7 +212,7 @@ Output_def::normalize () else { left_margin = scm_to_double (scm_left_margin); - right_margin = ((scm_right_margin == SCM_UNDEFINED) + right_margin = (SCM_UNBNDP (scm_right_margin) ? (paper_width - line_width - left_margin) : scm_to_double (scm_right_margin)) + binding_offset; } @@ -259,5 +253,3 @@ line_dimensions_int (Output_def *def, int n) : def->get_dimension (ly_symbol2scm ("indent")); return Interval (ind, lw); } - - diff --git a/lily/output-property-engraver.cc b/lily/output-property-engraver.cc index 78901a2157..7a0fa2d3c3 100644 --- a/lily/output-property-engraver.cc +++ b/lily/output-property-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,13 +31,12 @@ class Output_property_engraver : public Engraver protected: vector props_; - DECLARE_ACKNOWLEDGER (grob); - DECLARE_TRANSLATOR_LISTENER (apply_output); + void acknowledge_grob (Grob_info); + void listen_apply_output (Stream_event *); void stop_translation_timestep (); }; -IMPLEMENT_TRANSLATOR_LISTENER (Output_property_engraver, apply_output); void Output_property_engraver::listen_apply_output (Stream_event *ev) { @@ -56,6 +55,10 @@ Output_property_engraver::acknowledge_grob (Grob_info inf) { Stream_event *o = props_[i]; Context *d = inf.context (); + SCM grob = o->get_property ("symbol"); + if (scm_is_symbol (grob) + && ly_symbol2string (grob) != inf.grob ()->name ()) + continue; SCM proc = o->get_property ("procedure"); scm_call_3 (proc, inf.grob ()->self_scm (), @@ -74,7 +77,13 @@ Output_property_engraver::Output_property_engraver () { } -ADD_ACKNOWLEDGER (Output_property_engraver, grob); +void +Output_property_engraver::boot () +{ + ADD_LISTENER (Output_property_engraver, apply_output); + ADD_ACKNOWLEDGER (Output_property_engraver, grob); +} + ADD_TRANSLATOR (Output_property_engraver, /* doc */ "Apply a procedure to any grob acknowledged.", diff --git a/lily/page-breaking-scheme.cc b/lily/page-breaking-scheme.cc index 12929e510d..0c806493b4 100644 --- a/lily/page-breaking-scheme.cc +++ b/lily/page-breaking-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #include "paper-book.hh" #include "page-turn-page-breaking.hh" #include "one-line-page-breaking.hh" +#include "one-line-auto-height-breaking.hh" #include "optimal-page-breaking.hh" #include "minimal-page-breaking.hh" @@ -29,7 +30,7 @@ LY_DEFINE (ly_page_turn_breaking, "ly:page-turn-breaking", " @var{pb} such that page turns only happen in specified places," " returning its pages.") { - Page_turn_page_breaking b (unsmob_paper_book (pb)); + Page_turn_page_breaking b (unsmob (pb)); return b.solve (); } @@ -39,7 +40,7 @@ LY_DEFINE (ly_optimal_breaking, "ly:optimal-breaking", " @var{pb} to minimize badness in bother vertical and horizontal" " spacing.") { - Optimal_page_breaking b (unsmob_paper_book (pb)); + Optimal_page_breaking b (unsmob (pb)); return b.solve (); } @@ -49,16 +50,27 @@ LY_DEFINE (ly_minimal_breaking, "ly:minimal-breaking", " without looking for optimal spacing: stack as many lines on" " a page before moving to the next one.") { - Minimal_page_breaking b (unsmob_paper_book (pb)); + Minimal_page_breaking b (unsmob (pb)); return b.solve (); } LY_DEFINE (ly_one_line_breaking, "ly:one-line-breaking", 1, 0, 0, (SCM pb), "Put each score on a single line, and put each line on its own" - " page. The paper-width setting will be modified so that" - " every page will be wider than the widest line.") + " page. Modify the paper-width setting so that every page" + " is wider than the widest line.") { - One_line_page_breaking b (unsmob_paper_book (pb)); + One_line_page_breaking b (unsmob (pb)); + return b.solve (); +} + +LY_DEFINE (ly_one_line_auto_height_breaking, "ly:one-line-auto-height-breaking", + 1, 0, 0, (SCM pb), + "Put each score on a single line, and put each line on its own" + " page. Modify the paper-width setting so that every page" + " is wider than the widest line. Modify the paper-height" + " setting to fit the height of the tallest line.") +{ + One_line_auto_height_breaking b (unsmob (pb)); return b.solve (); } diff --git a/lily/page-breaking.cc b/lily/page-breaking.cc index 7220857d91..ef9e095d6a 100644 --- a/lily/page-breaking.cc +++ b/lily/page-breaking.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -554,7 +554,7 @@ Page_breaking::draw_page (SCM systems, SCM configuration, int page_num, bool las for (SCM s = systems; scm_is_pair (s); s = scm_cdr (s)) { SCM paper_system = scm_car (s); - if (Grob *g = unsmob_grob (scm_car (s))) + if (Grob *g = unsmob (scm_car (s))) { System *sys = dynamic_cast (g); paper_system = sys->get_paper_system (); @@ -567,11 +567,11 @@ Page_breaking::draw_page (SCM systems, SCM configuration, int page_num, bool las // Create the page and draw it. SCM page = make_page (page_num, last); - Prob *p = unsmob_prob (page); + Prob *p = unsmob (page); p->set_property ("lines", paper_systems); p->set_property ("configuration", configuration); - Stencil *foot_p = unsmob_stencil (p->get_property ("foot-stencil")); + Stencil *foot_p = unsmob (p->get_property ("foot-stencil")); Stencil foot = foot_p ? *foot_p : Stencil (); SCM footnotes = Page_layout_problem::get_footnotes_from_lines (systems); @@ -594,7 +594,7 @@ Page_breaking::make_pages (vector lines_per_page, SCM systems) SCM ret = SCM_EOL; bool reset_footnotes_on_new_page = to_boolean (book_->top_paper ()->c_variable ("reset-footnotes-on-new-page")); SCM label_page_table = book_->top_paper ()->c_variable ("label-page-table"); - if (label_page_table == SCM_UNDEFINED) + if (SCM_UNBNDP (label_page_table)) label_page_table = SCM_EOL; // Build a list of (systems configuration . footnote-count) triples. @@ -658,12 +658,12 @@ Page_breaking::make_pages (vector lines_per_page, SCM systems) for (SCM l = lines; scm_is_pair (l); l = scm_cdr (l)) { SCM labels = SCM_EOL; - if (Grob *line = unsmob_grob (scm_car (l))) + if (Grob *line = unsmob (scm_car (l))) { System *system = dynamic_cast (line); labels = system->get_property ("labels"); } - else if (Prob *prob = unsmob_prob (scm_car (l))) + else if (Prob *prob = unsmob (scm_car (l))) labels = prob->get_property ("labels"); for (SCM lbls = labels; scm_is_pair (lbls); lbls = scm_cdr (lbls)) @@ -689,13 +689,13 @@ Page_breaking::create_system_list () SCM specs = book_->get_system_specs (); for (SCM s = specs; scm_is_pair (s); s = scm_cdr (s)) { - if (Paper_score *ps = dynamic_cast (unsmob_music_output (scm_car (s)))) + if (Paper_score *ps = unsmob (scm_car (s))) { system_specs_.push_back (System_spec (ps)); } else { - Prob *pb = unsmob_prob (scm_car (s)); + Prob *pb = unsmob (scm_car (s)); assert (pb); pb->protect (); @@ -747,7 +747,7 @@ Page_breaking::find_chunks_and_breaks (Break_predicate is_break, Prob_break_pred vector line_breaker_columns; line_breaker_columns.push_back (0); - for (vsize j = 1; j < cols.size (); j++) + for (vsize j = 0; j < cols.size (); j++) { if (forced_line_break_cols.size ()) { @@ -1133,7 +1133,7 @@ Page_breaking::min_page_count (vsize configuration, vsize first_page_num) if ((!too_few_lines (line_count) && (next_height > cur_page_height && cur_rod_height > 0)) || too_many_lines (next_line_count) - || (prev && prev->page_permission_ == ly_symbol2scm ("force"))) + || (prev && scm_is_eq (prev->page_permission_, ly_symbol2scm ("force")))) { line_count = cur.compressed_nontitle_lines_count_; cur_rod_height = cur.full_height (); @@ -1332,7 +1332,7 @@ Page_breaking::space_systems_with_fixed_number_per_page (vsize configuration, system_count_on_this_page += cur_line.compressed_nontitle_lines_count_; line++; - if (cur_line.page_permission_ == ly_symbol2scm ("force")) + if (scm_is_eq (cur_line.page_permission_, ly_symbol2scm ("force"))) break; } @@ -1374,7 +1374,8 @@ Page_breaking::pack_systems_on_least_pages (vsize configuration, vsize first_pag if ((line > page_first_line) && (isinf (space.force_) || ((line > 0) - && (cached_line_details_[line - 1].page_permission_ == ly_symbol2scm ("force"))))) + && scm_is_eq (cached_line_details_[line - 1].page_permission_, + ly_symbol2scm ("force"))))) { res.systems_per_page_.push_back (line - page_first_line); res.force_.push_back (prev_force); @@ -1440,7 +1441,7 @@ Page_breaking::finalize_spacing_result (vsize configuration, Page_spacing_result } for (vsize i = ragged () ? res.force_.size () - 1 : 0; - i < res.force_.size () - ragged_last (); + i < res.force_.size () - (is_last () && ragged_last ()); i++) { Real f = res.force_[i]; @@ -1498,7 +1499,8 @@ Page_breaking::space_systems_on_2_pages (vsize configuration, vsize first_page_n /* if there is a forced break, this reduces to 2 1-page problems */ cache_line_details (configuration); for (vsize i = 0; i + 1 < cached_line_details_.size (); i++) - if (cached_line_details_[i].page_permission_ == ly_symbol2scm ("force")) + if (scm_is_eq (cached_line_details_[i].page_permission_, + ly_symbol2scm ("force"))) { vector lines1 (cached_line_details_.begin (), cached_line_details_.begin () + i + 1); vector lines2 (cached_line_details_.begin () + i + 1, cached_line_details_.end ()); diff --git a/lily/page-layout-problem-scheme.cc b/lily/page-layout-problem-scheme.cc index 19be67cd2e..d242966a9b 100644 --- a/lily/page-layout-problem-scheme.cc +++ b/lily/page-layout-problem-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Joe Neeman + Copyright (C) 2011--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,8 +29,8 @@ LY_DEFINE (ly_get_spacing_spec, "ly:get-spacing-spec", 2, 0, 0, LY_ASSERT_SMOB (Grob, from_scm, 1); LY_ASSERT_SMOB (Grob, to_scm, 2); - Grob *from = unsmob_grob (from_scm); - Grob *to = unsmob_grob (to_scm); + Grob *from = unsmob (from_scm); + Grob *to = unsmob (to_scm); return Page_layout_problem::get_spacing_spec (from, to, false, 0, 0); } diff --git a/lily/page-layout-problem.cc b/lily/page-layout-problem.cc index 8b0be3a5f7..8f1951223c 100644 --- a/lily/page-layout-problem.cc +++ b/lily/page-layout-problem.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2009--2012 Joe Neeman + Copyright (C) 2009--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,9 +33,10 @@ #include "skyline-pair.hh" #include "system.hh" #include "text-interface.hh" +#include "lily-imports.hh" /* - Returns the number of footntoes associated with a given line. + Returns the number of footnotes associated with a given line. */ vector @@ -44,7 +45,7 @@ Page_layout_problem::get_footnote_grobs (SCM lines) vector footnotes; for (SCM s = lines; scm_is_pair (s); s = scm_cdr (s)) { - if (Grob *g = unsmob_grob (scm_car (s))) + if (Grob *g = unsmob (scm_car (s))) { System *sys = dynamic_cast (g); if (!sys) @@ -55,10 +56,10 @@ Page_layout_problem::get_footnote_grobs (SCM lines) extract_grob_set (sys, "footnotes-after-line-breaking", footnote_grobs); footnotes.insert (footnotes.end (), footnote_grobs.begin (), footnote_grobs.end ()); } - else if (Prob *p = unsmob_prob (scm_car (s))) + else if (Prob *p = unsmob (scm_car (s))) { SCM stencils = p->get_property ("footnotes"); - if (stencils == SCM_EOL) + if (scm_is_null (stencils)) continue; for (SCM st = stencils; scm_is_pair (st); st = scm_cdr (st)) footnotes.push_back (0); @@ -82,9 +83,9 @@ Page_layout_problem::get_footnotes_from_lines (SCM lines) return SCM_EOL; bool footnotes_added; - if (Grob *g = unsmob_grob (scm_car (lines))) + if (Grob *g = unsmob (scm_car (lines))) footnotes_added = !scm_is_null (g->get_property ("footnote-stencil")); - else if (Prob *p = unsmob_prob (scm_car (lines))) + else if (Prob *p = unsmob (scm_car (lines))) footnotes_added = !scm_is_null (p->get_property ("footnote-stencil")); else { @@ -100,9 +101,9 @@ Page_layout_problem::get_footnotes_from_lines (SCM lines) SCM out = SCM_EOL; for (SCM s = lines; scm_is_pair (s); s = scm_cdr (s)) { - if (Grob *g = unsmob_grob (scm_car (s))) + if (Grob *g = unsmob (scm_car (s))) out = scm_cons (g->get_property ("footnote-stencil"), out); - else if (Prob *p = unsmob_prob (scm_car (s))) + else if (Prob *p = unsmob (scm_car (s))) out = scm_cons (p->get_property ("footnote-stencil"), out); else programming_error ("Systems on a page must be a prob or grob."); @@ -140,8 +141,7 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book number_footnote_table = SCM_EOL; SCM numbering_function = paper->c_variable ("footnote-numbering-function"); SCM layout = paper->self_scm (); - SCM props = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), - paper->self_scm ()); + SCM props = Lily::layout_extract_page_properties (layout); Real padding = robust_scm2double (paper->c_variable ("footnote-padding"), 0.0); Real number_raise = robust_scm2double (paper->c_variable ("footnote-number-raise"), 0.0); @@ -175,13 +175,13 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book } SCM markup = scm_call_1 (numbering_function, scm_from_int (counter)); SCM stencil = Text_interface::interpret_markup (layout, props, markup); - Stencil *st = unsmob_stencil (stencil); + Stencil *st = unsmob (stencil); if (!st) { programming_error ("Your numbering function needs to return a stencil."); markup = SCM_EOL; stencil = Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL).smobbed_copy (); - st = unsmob_stencil (stencil); + st = unsmob (stencil); } in_text_numbers = scm_cons (markup, in_text_numbers); numbers = scm_cons (stencil, numbers); @@ -202,7 +202,7 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book for (SCM p = numbers; scm_is_pair (p); p = scm_cdr (p)) { - Stencil *st = unsmob_stencil (scm_car (p)); + Stencil *st = unsmob (scm_car (p)); if (!st->extent (X_AXIS).is_empty ()) st->translate_axis ((max_length - st->extent (X_AXIS)[RIGHT]), X_AXIS); @@ -213,7 +213,7 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book for (SCM s = lines; scm_is_pair (s); s = scm_cdr (s)) { // Take care of musical systems. - if (Grob *g = unsmob_grob (scm_car (s))) + if (Grob *g = unsmob (scm_car (s))) { System *sys = dynamic_cast (g); if (!sys) @@ -232,13 +232,12 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book if (orig->is_broken ()) footnote_markup = orig->broken_intos_[0]->get_property ("footnote-text"); - SCM props = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), - paper->self_scm ()); + SCM props = Lily::layout_extract_page_properties (paper->self_scm ()); SCM footnote_stl = Text_interface::interpret_markup (paper->self_scm (), props, footnote_markup); - Stencil footnote_stencil = *unsmob_stencil (footnote_stl); + Stencil footnote_stencil = *unsmob (footnote_stl); bool do_numbering = to_boolean (footnote->get_property ("automatically-numbered")); if (Spanner *orig = dynamic_cast(footnote)) { @@ -259,7 +258,7 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book orig->broken_intos_[i]->set_property ("text", annotation_scm); } - Stencil annotation = *unsmob_stencil (scm_car (numbers)); + Stencil annotation = *unsmob (scm_car (numbers)); annotation.translate_axis ((footnote_stencil.extent (Y_AXIS)[UP] + number_raise - annotation.extent (Y_AXIS)[UP]), @@ -280,24 +279,24 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book sys->set_property ("footnote-stencil", mol.smobbed_copy ()); } // Take care of top-level markups - else if (Prob *p = unsmob_prob (scm_car (s))) + else if (Prob *p = unsmob (scm_car (s))) { SCM stencils = p->get_property ("footnotes"); Stencil mol; for (SCM st = stencils; scm_is_pair (st); st = scm_cdr (st)) { - Stencil footnote_stencil = *unsmob_stencil (scm_caddar (st)); + Stencil footnote_stencil = *unsmob (scm_caddar (st)); bool do_numbering = to_boolean (scm_cadar (st)); SCM in_text_stencil = Stencil ().smobbed_copy (); if (do_numbering) { - Stencil annotation = *unsmob_stencil (scm_car (numbers)); + Stencil annotation = *unsmob (scm_car (numbers)); SCM in_text_annotation = scm_car (in_text_numbers); in_text_stencil = Text_interface::interpret_markup (layout, props, in_text_annotation); - if (!unsmob_stencil (in_text_stencil)) + if (!unsmob (in_text_stencil)) in_text_stencil = SCM_EOL; annotation.translate_axis ((footnote_stencil.extent (Y_AXIS)[UP] + number_raise @@ -324,8 +323,7 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book Stencil Page_layout_problem::get_footnote_separator_stencil (Output_def *paper) { - SCM props = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), - paper->self_scm ()); + SCM props = Lily::layout_extract_page_properties (paper->self_scm ()); SCM markup = paper->c_variable ("footnote-separator-markup"); @@ -335,7 +333,7 @@ Page_layout_problem::get_footnote_separator_stencil (Output_def *paper) SCM footnote_stencil = Text_interface::interpret_markup (paper->self_scm (), props, markup); - Stencil *footnote_separator = unsmob_stencil (footnote_stencil); + Stencil *footnote_separator = unsmob (footnote_stencil); return footnote_separator ? *footnote_separator : Stencil (); } @@ -352,7 +350,7 @@ Page_layout_problem::add_footnotes_to_footer (SCM footnotes, Stencil foot, Paper for (SCM s = footnotes; scm_is_pair (s); s = scm_cdr (s)) { - Stencil *stencil = unsmob_stencil (scm_car (s)); + Stencil *stencil = unsmob (scm_car (s)); if (!stencil) continue; @@ -377,7 +375,7 @@ Page_layout_problem::add_footnotes_to_footer (SCM footnotes, Stencil foot, Paper Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM systems) : bottom_skyline_ (DOWN) { - Prob *page = unsmob_prob (page_scm); + Prob *page = unsmob (page_scm); bottom_loose_baseline_ = 0; header_height_ = 0; footer_height_ = 0; @@ -388,8 +386,8 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst if (page) { - Stencil *head = unsmob_stencil (page->get_property ("head-stencil")); - Stencil *foot = unsmob_stencil (page->get_property ("foot-stencil")); + Stencil *head = unsmob (page->get_property ("head-stencil")); + Stencil *foot = unsmob (page->get_property ("foot-stencil")); Stencil foot_stencil = foot ? *foot : Stencil (); @@ -433,7 +431,7 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst markup_markup_spacing = paper->c_variable ("markup-markup-spacing"); last_bottom_spacing = paper->c_variable ("last-bottom-spacing"); top_system_spacing = paper->c_variable ("top-system-spacing"); - if (scm_is_pair (systems) && unsmob_prob (scm_car (systems))) + if (scm_is_pair (systems) && unsmob (scm_car (systems))) top_system_spacing = paper->c_variable ("top-markup-spacing"); // Note: the page height here does _not_ reserve space for headers and @@ -453,7 +451,7 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst { bool first = (s == systems); - if (Grob *g = unsmob_grob (scm_car (s))) + if (Grob *g = unsmob (scm_car (s))) { System *sys = dynamic_cast (g); if (!sys) @@ -479,7 +477,7 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst append_system (sys, spring, indent, padding); last_system_was_title = false; } - else if (Prob *p = unsmob_prob (scm_car (s))) + else if (Prob *p = unsmob (scm_car (s))) { SCM spec = first ? top_system_spacing : (last_system_was_title ? markup_markup_spacing : score_markup_spacing); @@ -538,7 +536,7 @@ Page_layout_problem::set_footer_height (Real height) void Page_layout_problem::append_system (System *sys, Spring const &spring, Real indent, Real padding) { - Grob *align = unsmob_grob (sys->get_object ("vertical-alignment")); + Grob *align = unsmob (sys->get_object ("vertical-alignment")); if (!align) return; @@ -554,7 +552,7 @@ Page_layout_problem::append_system (System *sys, Spring const &spring, Real inde build_system_skyline (elts, minimum_offsets_with_min_dist, &up_skyline, &down_skyline); up_skyline.shift (indent); down_skyline.shift (indent); - Stencil *in_note_stencil = unsmob_stencil (sys->get_property ("in-note-stencil")); + Stencil *in_note_stencil = unsmob (sys->get_property ("in-note-stencil")); if (in_note_stencil && in_note_stencil->extent (Y_AXIS).length () > 0) { @@ -587,7 +585,7 @@ Page_layout_problem::append_system (System *sys, Spring const &spring, Real inde // store the minimum distance, considering relative indents, // for a loose line Skyline first_skyline (UP); - Skyline_pair *sky = Skyline_pair::unsmob (elts[0]->get_property ("vertical-skylines")); + Skyline_pair *sky = unsmob (elts[0]->get_property ("vertical-skylines")); if (sky) first_skyline.merge ((*sky)[UP]); first_skyline.shift (indent); @@ -659,7 +657,7 @@ Page_layout_problem::append_system (System *sys, Spring const &spring, Real inde void Page_layout_problem::append_prob (Prob *prob, Spring const &spring, Real padding) { - Skyline_pair *sky = Skyline_pair::unsmob (prob->get_property ("vertical-skylines")); + Skyline_pair *sky = unsmob (prob->get_property ("vertical-skylines")); Real minimum_distance = 0; bool tight_spacing = to_boolean (prob->get_property ("tight-spacing")); @@ -669,7 +667,7 @@ Page_layout_problem::append_prob (Prob *prob, Spring const &spring, Real padding bottom_loose_baseline_); bottom_skyline_ = (*sky)[DOWN]; } - else if (Stencil *sten = unsmob_stencil (prob->get_property ("stencil"))) + else if (Stencil *sten = unsmob (prob->get_property ("stencil"))) { Interval iv = sten->extent (Y_AXIS); minimum_distance = iv[UP] - bottom_skyline_.max_height (); @@ -772,7 +770,7 @@ Page_layout_problem::find_system_offsets () { *tail = scm_cons (scm_from_double (solution_[spring_idx]), SCM_EOL); tail = SCM_CDRLOC (*tail); - Interval prob_extent = unsmob_stencil (elements_[i].prob->get_property ("stencil"))->extent (Y_AXIS); + Interval prob_extent = unsmob (elements_[i].prob->get_property ("stencil"))->extent (Y_AXIS); // Lay out any non-spaceable lines between this line and // the last one. @@ -991,7 +989,7 @@ Page_layout_problem::build_system_skyline (vector const &staves, { Real dy = minimum_translations[i] - first_translation; Grob *g = staves[i]; - Skyline_pair *sky = Skyline_pair::unsmob (g->get_property ("vertical-skylines")); + Skyline_pair *sky = unsmob (g->get_property ("vertical-skylines")); if (sky) { up->raise (-dy); @@ -1025,7 +1023,7 @@ Page_layout_problem::build_system_skyline (vector const &staves, Interval Page_layout_problem::prob_extent (Prob *p) { - Stencil *sten = unsmob_stencil (p->get_property ("stencil")); + Stencil *sten = unsmob (p->get_property ("stencil")); return sten ? sten->extent (Y_AXIS) : Interval (0, 0); } @@ -1234,7 +1232,7 @@ Page_layout_problem::filter_dead_elements (vector const &input) vector output; for (vsize i = 0; i < input.size (); ++i) { - if (Hara_kiri_group_spanner::has_interface (input[i])) + if (has_interface (input[i])) Hara_kiri_group_spanner::consider_suicide (input[i]); if (input[i]->is_live ()) diff --git a/lily/page-marker-scheme.cc b/lily/page-marker-scheme.cc index 819fcca894..f78069ff96 100644 --- a/lily/page-marker-scheme.cc +++ b/lily/page-marker-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Nicolas Sceaux + Copyright (C) 2007--2015 Nicolas Sceaux LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/page-marker.cc b/lily/page-marker.cc index adf623ffd0..af62bdc95e 100644 --- a/lily/page-marker.cc +++ b/lily/page-marker.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Nicolas Sceaux + Copyright (C) 2007--2015 Nicolas Sceaux LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ */ #include "page-marker.hh" -#include "ly-smobs.icc" Page_marker::Page_marker () { @@ -29,6 +28,7 @@ Page_marker::Page_marker () } Page_marker::Page_marker (Page_marker const &src) + : Smob () { symbol_ = src.symbol_; permission_ = src.permission_; @@ -40,29 +40,17 @@ Page_marker::~Page_marker () { } -IMPLEMENT_SMOBS (Page_marker); -IMPLEMENT_DEFAULT_EQUAL_P (Page_marker); -IMPLEMENT_TYPE_P (Page_marker, "ly:page-marker?"); +const char * const Page_marker::type_p_name_ = "ly:page-marker?"; SCM -Page_marker::mark_smob (SCM smob) +Page_marker::mark_smob () const { - Page_marker *pm = (Page_marker *) SCM_CELL_WORD_1 (smob); - scm_gc_mark (pm->symbol_); - scm_gc_mark (pm->permission_); - scm_gc_mark (pm->label_); + scm_gc_mark (symbol_); + scm_gc_mark (permission_); + scm_gc_mark (label_); return SCM_EOL; } -int -Page_marker::print_smob (SCM smob, SCM port, scm_print_state *) -{ - Page_marker *pm = (Page_marker *) SCM_CELL_WORD_1 (smob); - (void) pm; - scm_puts ("#", port); - return 1; -} - SCM Page_marker::permission_symbol () { diff --git a/lily/page-spacing-result.cc b/lily/page-spacing-result.cc index 9d545e33e8..1f29d20f98 100644 --- a/lily/page-spacing-result.cc +++ b/lily/page-spacing-result.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify diff --git a/lily/page-spacing.cc b/lily/page-spacing.cc index a2915febb2..97c68a5e29 100644 --- a/lily/page-spacing.cc +++ b/lily/page-spacing.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -388,7 +388,8 @@ Page_spacer::calc_subproblem (vsize page, vsize line) } if (page_start > 0 - && lines_[page_start - 1].page_permission_ == ly_symbol2scm ("force")) + && scm_is_eq (lines_[page_start - 1].page_permission_, + ly_symbol2scm ("force"))) break; } return !isinf (cur.demerits_); diff --git a/lily/page-turn-engraver.cc b/lily/page-turn-engraver.cc index d7c7ccec32..c77dc9b2a5 100644 --- a/lily/page-turn-engraver.cc +++ b/lily/page-turn-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -66,7 +66,7 @@ public: if (duration_[LEFT] < penalty.duration_[LEFT]) ret.push_back (Page_turn_event (duration_[LEFT], penalty.duration_[LEFT], permission_, penalty_)); - if (penalty.permission_ != SCM_EOL) + if (!scm_is_null (penalty.permission_)) ret.push_back (Page_turn_event (intersect[LEFT], intersect[RIGHT], permission_, new_pen)); if (penalty.duration_[RIGHT] < duration_[RIGHT]) @@ -97,8 +97,8 @@ class Page_turn_engraver : public Engraver Grob *breakable_column (Page_turn_event const &); protected: - DECLARE_TRANSLATOR_LISTENER (break); - DECLARE_ACKNOWLEDGER (note_head); + void listen_break (Stream_event *); + void acknowledge_note_head (Grob_info); public: TRANSLATOR_DECLARATIONS (Page_turn_engraver); @@ -148,7 +148,7 @@ Page_turn_engraver::acknowledge_note_head (Grob_info gi) Stream_event *cause = gi.event_cause (); Duration *dur_ptr = cause - ? unsmob_duration (cause->get_property ("duration")) + ? unsmob (cause->get_property ("duration")) : 0; if (!dur_ptr) @@ -168,7 +168,6 @@ Page_turn_engraver::acknowledge_note_head (Grob_info gi) note_end_ = now_mom () + dur_ptr->get_length (); } -IMPLEMENT_TRANSLATOR_LISTENER (Page_turn_engraver, break); void Page_turn_engraver::listen_break (Stream_event *ev) { @@ -208,7 +207,7 @@ Page_turn_engraver::start_translation_timestep () void Page_turn_engraver::stop_translation_timestep () { - Grob *pc = unsmob_grob (get_property ("currentCommandColumn")); + Grob *pc = unsmob (get_property ("currentCommandColumn")); if (pc) { @@ -229,9 +228,9 @@ Page_turn_engraver::stop_translation_timestep () for (; scm_is_pair (cs); cs = scm_cdr (cs)) { SCM command = scm_car (cs); - if (command == ly_symbol2scm ("start-repeat")) + if (scm_is_eq (command, ly_symbol2scm ("start-repeat"))) start = true; - else if (command == ly_symbol2scm ("end-repeat")) + else if (scm_is_eq (command, ly_symbol2scm ("end-repeat"))) end = true; } @@ -239,7 +238,7 @@ Page_turn_engraver::stop_translation_timestep () { Rational now = now_mom ().main_part_; Real pen = penalty ((now_mom () - rest_begin_).main_part_ + repeat_begin_rest_length_); - Moment *m = unsmob_moment (get_property ("minimumRepeatLengthForPageTurn")); + Moment *m = unsmob (get_property ("minimumRepeatLengthForPageTurn")); if (m && *m > (now_mom () - repeat_begin_)) pen = infinity_f; @@ -265,9 +264,10 @@ Page_turn_engraver::stop_translation_timestep () SCM Page_turn_engraver::max_permission (SCM perm1, SCM perm2) { - if (perm1 == SCM_EOL) + if (scm_is_null (perm1)) return perm2; - if (perm1 == ly_symbol2scm ("allow") && perm2 == ly_symbol2scm ("force")) + if (scm_is_eq (perm1, ly_symbol2scm ("allow")) + && scm_is_eq (perm2, ly_symbol2scm ("force"))) return perm2; return perm1; } @@ -341,7 +341,13 @@ Page_turn_engraver::finalize () } } -ADD_ACKNOWLEDGER (Page_turn_engraver, note_head); + +void +Page_turn_engraver::boot () +{ + ADD_LISTENER (Page_turn_engraver, break); + ADD_ACKNOWLEDGER (Page_turn_engraver, note_head); +} ADD_TRANSLATOR (Page_turn_engraver, /* doc */ diff --git a/lily/page-turn-page-breaking.cc b/lily/page-turn-page-breaking.cc index 047ba6a82f..09545020c4 100644 --- a/lily/page-turn-page-breaking.cc +++ b/lily/page-turn-page-breaking.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -138,7 +138,8 @@ Page_turn_page_breaking::calc_subproblem (vsize ending_breakpoint) for (vsize start = end; start--;) { if (start < end - 1 - && breakpoint_property (start + 1, "page-turn-permission") == ly_symbol2scm ("force")) + && scm_is_eq (breakpoint_property (start + 1, "page-turn-permission"), + ly_symbol2scm ("force"))) break; if (start > 0 && best.demerits_ < state_[start - 1].demerits_) diff --git a/lily/pango-font-scheme.cc b/lily/pango-font-scheme.cc index 5b43792ff5..504e4ca3dd 100644 --- a/lily/pango-font-scheme.cc +++ b/lily/pango-font-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ LY_DEFINE (ly_pango_font_p, "ly:pango-font?", (SCM f), "Is @var{f} a pango font?") { - return scm_from_bool (dynamic_cast (unsmob_metrics (f))); + return scm_from_bool (unsmob (f)); } LY_DEFINE (ly_pango_font_physical_fonts, "ly:pango-font-physical-fonts", @@ -44,7 +44,7 @@ LY_DEFINE (ly_pango_font_physical_fonts, "ly:pango-font-physical-fonts", "Return alist of @code{(ps-name file-name font-index)} lists" " for Pango font@tie{}@var{f}.") { - Pango_font *pf = dynamic_cast (unsmob_metrics (f)); + Pango_font *pf = unsmob (f); SCM alist = SCM_EOL; if (pf) diff --git a/lily/pango-font.cc b/lily/pango-font.cc index e7b5489df5..b805f34a85 100644 --- a/lily/pango-font.cc +++ b/lily/pango-font.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,11 +35,13 @@ #include "file-name.hh" #include "international.hh" #include "lookup.hh" // debugging +#include "ly-module.hh" #include "main.hh" #include "string-convert.hh" #include "warn.hh" #include "all-font-metrics.hh" #include "program-option.hh" +#include "open-type-font.hh" #if HAVE_PANGO_FT2 #include "stencil.hh" @@ -199,7 +201,7 @@ Pango_font::pango_item_string_stencil (PangoGlyphItem const *glyph_item) const b.scale (scale_); - char const *ps_name_str0 = FT_Get_Postscript_Name (ftface); + const string ps_name_str0 = get_postscript_name (ftface); FcPattern *fcpat = fcfont->font_pattern; FcChar8 *file_name_as_ptr = 0; @@ -290,7 +292,7 @@ Pango_font::pango_item_string_stencil (PangoGlyphItem const *glyph_item) const char_id = scm_from_uint32 (pg); } else - char_id = scm_from_locale_string (glyph_name); + char_id = scm_from_utf8_string (glyph_name); PangoRectangle logical_sub_rect; PangoRectangle ink_sub_rect; @@ -319,11 +321,11 @@ Pango_font::pango_item_string_stencil (PangoGlyphItem const *glyph_item) const Real size = pango_font_description_get_size (descr) / (Real (PANGO_SCALE)); - if (!ps_name_str0) + if (ps_name_str0.empty ()) warning (_f ("no PostScript font name for font `%s'", file_name)); string ps_name; - if (!ps_name_str0 + if (ps_name_str0.empty () && file_name != "" && (file_name.find (".otf") != NPOS || file_name.find (".cff") != NPOS)) @@ -350,7 +352,7 @@ Pango_font::pango_item_string_stencil (PangoGlyphItem const *glyph_item) const name = String_convert::to_lower (name); ps_name = initial + name; } - else if (ps_name_str0) + else if (!ps_name_str0.empty ()) ps_name = ps_name_str0; if (ps_name.length ()) @@ -440,8 +442,8 @@ Pango_font::text_stencil (Output_def * /* state */, variable that is bound to a *named* procedure, i.e. not a lambda expression. */ - if (utf8_string != SCM_BOOL_F - && scm_procedure_name (SCM_VARIABLE_REF (utf8_string)) != SCM_BOOL_F) + if (scm_is_true (utf8_string) + && scm_is_true (scm_procedure_name (SCM_VARIABLE_REF (utf8_string)))) has_utf8_string = true; } diff --git a/lily/pango-select-scheme.cc b/lily/pango-select-scheme.cc index 1e7605d2c0..3c080a5ac4 100644 --- a/lily/pango-select-scheme.cc +++ b/lily/pango-select-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/pango-select.cc b/lily/pango-select.cc index 082bcd8243..8091e466ee 100644 --- a/lily/pango-select.cc +++ b/lily/pango-select.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -80,10 +80,10 @@ PangoStyle symbol_to_pango_style (SCM style) { PangoStyle pstyle = PANGO_STYLE_NORMAL; - if (style == ly_symbol2scm ("italic")) + if (scm_is_eq (style, ly_symbol2scm ("italic"))) pstyle = PANGO_STYLE_ITALIC; - else if (style == ly_symbol2scm ("oblique") - || style == ly_symbol2scm ("slanted")) + else if (scm_is_eq (style, ly_symbol2scm ("oblique")) + || scm_is_eq (style, ly_symbol2scm ("slanted"))) pstyle = PANGO_STYLE_OBLIQUE; return pstyle; @@ -93,7 +93,7 @@ PangoVariant symbol_to_pango_variant (SCM variant) { PangoVariant pvariant = PANGO_VARIANT_NORMAL; - if (variant == ly_symbol2scm ("caps")) + if (scm_is_eq (variant, ly_symbol2scm ("caps"))) pvariant = PANGO_VARIANT_SMALL_CAPS; return pvariant; } @@ -102,15 +102,15 @@ PangoWeight symbol_to_pango_weight (SCM weight) { PangoWeight pw = PANGO_WEIGHT_NORMAL; - if (weight == ly_symbol2scm ("bold")) + if (scm_is_eq (weight, ly_symbol2scm ("bold"))) pw = PANGO_WEIGHT_BOLD; - if (weight == ly_symbol2scm ("heavy")) + if (scm_is_eq (weight, ly_symbol2scm ("heavy"))) pw = PANGO_WEIGHT_HEAVY; - if (weight == ly_symbol2scm ("ultrabold")) + if (scm_is_eq (weight, ly_symbol2scm ("ultrabold"))) pw = PANGO_WEIGHT_ULTRABOLD; - if (weight == ly_symbol2scm ("light")) + if (scm_is_eq (weight, ly_symbol2scm ("light"))) pw = PANGO_WEIGHT_LIGHT; - if (weight == ly_symbol2scm ("ultralight")) + if (scm_is_eq (weight, ly_symbol2scm ("ultralight"))) pw = PANGO_WEIGHT_ULTRALIGHT; return pw; diff --git a/lily/paper-book-scheme.cc b/lily/paper-book-scheme.cc index 2bfdc79988..01fa9da459 100644 --- a/lily/paper-book-scheme.cc +++ b/lily/paper-book-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ */ #include "paper-book.hh" -#include "ly-module.hh" #include "output-def.hh" LY_DEFINE (ly_paper_book_pages, "ly:paper-book-pages", @@ -26,7 +25,7 @@ LY_DEFINE (ly_paper_book_pages, "ly:paper-book-pages", "Return pages in @code{Paper_book} object @var{pb}.") { LY_ASSERT_SMOB (Paper_book, pb, 1); - return unsmob_paper_book (pb)->pages (); + return unsmob (pb)->pages (); } LY_DEFINE (ly_paper_book_scopes, "ly:paper-book-scopes", @@ -34,7 +33,7 @@ LY_DEFINE (ly_paper_book_scopes, "ly:paper-book-scopes", "Return scopes in @code{Paper_book} object @var{pb}.") { LY_ASSERT_SMOB (Paper_book, pb, 1); - Paper_book *book = unsmob_paper_book (pb); + Paper_book *book = unsmob (pb); SCM scopes = SCM_EOL; if (book->parent_) @@ -52,7 +51,7 @@ LY_DEFINE (ly_paper_book_performances, "ly:paper-book-performances", "Return performances in @code{Paper_book} object @var{pb}.") { LY_ASSERT_SMOB (Paper_book, pb, 1); - return unsmob_paper_book (pb)->performances (); + return unsmob (pb)->performances (); } LY_DEFINE (ly_paper_book_systems, "ly:paper-book-systems", @@ -60,7 +59,7 @@ LY_DEFINE (ly_paper_book_systems, "ly:paper-book-systems", "Return systems in @code{Paper_book} object @var{pb}.") { LY_ASSERT_SMOB (Paper_book, pb, 1); - return unsmob_paper_book (pb)->systems (); + return unsmob (pb)->systems (); } LY_DEFINE (ly_paper_book_paper, "ly:paper-book-paper", @@ -69,7 +68,7 @@ LY_DEFINE (ly_paper_book_paper, "ly:paper-book-paper", " in @code{Paper_book} object @var{pb}.") { LY_ASSERT_SMOB (Paper_book, pb, 1); - Paper_book *pbook = unsmob_paper_book (pb); + Paper_book *pbook = unsmob (pb); return pbook->paper_->self_scm (); } @@ -79,6 +78,6 @@ LY_DEFINE (ly_paper_book_header, "ly:paper-book-header", " in @code{Paper_book} object @var{pb}.") { LY_ASSERT_SMOB (Paper_book, pb, 1); - Paper_book *pbook = unsmob_paper_book (pb); + Paper_book *pbook = unsmob (pb); return pbook->header_; } diff --git a/lily/paper-book.cc b/lily/paper-book.cc index aecafbe3a0..3a672198b5 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Jan Nieuwenhuizen + Copyright (C) 2004--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,8 +30,9 @@ #include "warn.hh" #include "program-option.hh" #include "page-marker.hh" +#include "ly-module.hh" +#include "lily-imports.hh" -#include "ly-smobs.icc" Paper_book::Paper_book () { @@ -52,34 +53,22 @@ Paper_book::~Paper_book () { } -IMPLEMENT_DEFAULT_EQUAL_P (Paper_book); -IMPLEMENT_SMOBS (Paper_book); -IMPLEMENT_TYPE_P (Paper_book, "ly:paper-book?"); +const char * const Paper_book::type_p_name_ = "ly:paper-book?"; SCM -Paper_book::mark_smob (SCM smob) +Paper_book::mark_smob () const { - Paper_book *b = (Paper_book *) SCM_CELL_WORD_1 (smob); - if (b->paper_) - scm_gc_mark (b->paper_->self_scm ()); - if (b->parent_) - scm_gc_mark (b->parent_->self_scm ()); - scm_gc_mark (b->header_); - scm_gc_mark (b->header_0_); - scm_gc_mark (b->pages_); - scm_gc_mark (b->performances_); - scm_gc_mark (b->scores_); - scm_gc_mark (b->bookparts_); - return b->systems_; -} - -int -Paper_book::print_smob (SCM smob, SCM port, scm_print_state *) -{ - Paper_book *b = (Paper_book *) SCM_CELL_WORD_1 (smob); - (void)b; - scm_puts ("#", port); - return 1; + if (paper_) + scm_gc_mark (paper_->self_scm ()); + if (parent_) + scm_gc_mark (parent_->self_scm ()); + scm_gc_mark (header_); + scm_gc_mark (header_0_); + scm_gc_mark (pages_); + scm_gc_mark (performances_); + scm_gc_mark (scores_); + scm_gc_mark (bookparts_); + return systems_; } Output_def * @@ -129,19 +118,16 @@ Paper_book::output_aux (SCM output_channel, long page_nb = 0; if (scm_is_pair (performances_)) { - SCM proc = ly_lily_module_constant ("write-performances-midis"); - - scm_call_3 (proc, - performances (), - output_channel, - scm_from_long (*first_performance_number)); + Lily::write_performances_midis (performances (), + output_channel, + scm_from_long (*first_performance_number)); *first_performance_number += scm_ilength (performances_); } if (scm_is_pair (bookparts_)) { for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p)) - if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) + if (Paper_book *pbookpart = unsmob (scm_car (p))) { bool is_last_part = (is_last && !scm_is_pair (scm_cdr (p))); page_nb += pbookpart->output_aux (output_channel, @@ -152,7 +138,7 @@ Paper_book::output_aux (SCM output_channel, } else { - if (scores_ == SCM_EOL) + if (scm_is_null (scores_)) return 0; paper_->set_variable (ly_symbol2scm ("first-page-number"), scm_from_long (*first_page_number)); @@ -178,7 +164,7 @@ Paper_book::output (SCM output_channel) with different line-widths) and why we need it at all. */ - if (paper_->c_variable ("line-width") == SCM_UNDEFINED) + if (SCM_UNBNDP (paper_->c_variable ("line-width"))) paper_->set_variable (ly_symbol2scm ("line-width"), paper_->c_variable ("paper-width")); @@ -201,14 +187,14 @@ Paper_book::output (SCM output_channel) SCM framework = ly_module_lookup (mod, ly_symbol2scm ("output-framework")); - if (framework != SCM_BOOL_F) + if (scm_is_true (framework)) { SCM func = scm_variable_ref (framework); - scm_apply_0 (func, scm_list_n (output_channel, - self_scm (), - scopes, - dump_fields (), - SCM_UNDEFINED)); + scm_call_4 (func, + output_channel, + self_scm (), + scopes, + dump_fields ()); } else warning (_f ("program option -dprint-pages not supported by backend `%s'", @@ -220,14 +206,14 @@ Paper_book::output (SCM output_channel) SCM framework = ly_module_lookup (mod, ly_symbol2scm ("output-preview-framework")); - if (framework != SCM_BOOL_F) + if (scm_is_true (framework)) { SCM func = scm_variable_ref (framework); - scm_apply_0 (func, scm_list_n (output_channel, - self_scm (), - scopes, - dump_fields (), - SCM_UNDEFINED)); + scm_call_4 (func, + output_channel, + self_scm (), + scopes, + dump_fields ()); } else warning (_f ("program option -dpreview not supported by backend `%s'", @@ -241,11 +227,9 @@ Paper_book::classic_output_aux (SCM output, { if (scm_is_pair (performances_)) { - SCM proc = ly_lily_module_constant ("write-performances-midis"); - scm_call_3 (proc, - performances (), - output, - scm_from_long (*first_performance_number)); + Lily::write_performances_midis (performances (), + output, + scm_from_long (*first_performance_number)); *first_performance_number += scm_ilength (performances_); } @@ -273,12 +257,11 @@ Paper_book::classic_output (SCM output) SCM func = scm_c_module_lookup (mod, "output-classic-framework"); func = scm_variable_ref (func); - scm_apply_0 (func, scm_list_n (output, - self_scm (), - scopes, - dump_fields (), - SCM_UNDEFINED)); - + scm_call_4 (func, + output, + self_scm (), + scopes, + dump_fields ()); progress_indication ("\n"); } @@ -299,8 +282,8 @@ Paper_book::book_title () paper_->self_scm (), scopes); - if (unsmob_stencil (tit)) - title = *unsmob_stencil (tit); + if (unsmob (tit)) + title = *unsmob (tit); if (!title.is_empty ()) title.align_to (Y_AXIS, UP); @@ -328,8 +311,8 @@ Paper_book::score_title (SCM header) paper_->self_scm (), scopes); - if (unsmob_stencil (tit)) - title = *unsmob_stencil (tit); + if (unsmob (tit)) + title = *unsmob (tit); if (!title.is_empty ()) title.align_to (Y_AXIS, UP); @@ -340,7 +323,7 @@ Paper_book::score_title (SCM header) void set_page_permission (SCM sys, SCM symbol, SCM permission) { - if (Paper_score *ps = dynamic_cast (unsmob_music_output (sys))) + if (Paper_score *ps = unsmob (sys)) { vector cols = ps->get_columns (); if (cols.size ()) @@ -350,7 +333,7 @@ set_page_permission (SCM sys, SCM symbol, SCM permission) col->find_prebroken_piece (LEFT)->set_property (symbol, permission); } } - else if (Prob *pb = unsmob_prob (sys)) + else if (Prob *pb = unsmob (sys)) pb->set_property (symbol, permission); } @@ -384,7 +367,7 @@ set_system_penalty (SCM sys, SCM header) void set_labels (SCM sys, SCM labels) { - if (Paper_score *ps = dynamic_cast (unsmob_music_output (sys))) + if (Paper_score *ps = unsmob (sys)) { vector cols = ps->get_columns (); if (cols.size ()) @@ -400,7 +383,7 @@ set_labels (SCM sys, SCM labels) labels))); } } - else if (Prob *pb = unsmob_prob (sys)) + else if (Prob *pb = unsmob (sys)) pb->set_property ("labels", scm_append_x (scm_list_2 (pb->get_property ("labels"), labels))); @@ -447,10 +430,8 @@ Paper_book::get_system_specs () } SCM page_properties - = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), - paper_->self_scm ()); + = Lily::layout_extract_page_properties (paper_->self_scm ()); - SCM interpret_markup_list = ly_lily_module_constant ("interpret-markup-list"); SCM header = SCM_EOL; SCM labels = SCM_EOL; for (SCM s = scm_reverse (scores_); scm_is_pair (s); s = scm_cdr (s)) @@ -458,10 +439,10 @@ Paper_book::get_system_specs () if (ly_is_module (scm_car (s))) { header = scm_car (s); - if (header_0_ == SCM_EOL) + if (scm_is_null (header_0_)) header_0_ = header; } - else if (Page_marker *page_marker = unsmob_page_marker (scm_car (s))) + else if (Page_marker *page_marker = unsmob (scm_car (s))) { /* page markers are used to set page breaking/turning permission, or to place bookmarking labels */ @@ -479,7 +460,7 @@ Paper_book::get_system_specs () labels = scm_cons (page_marker->label (), labels); } } - else if (Music_output *mop = unsmob_music_output (scm_car (s))) + else if (Music_output *mop = unsmob (scm_car (s))) { if (Paper_score *pscore = dynamic_cast (mop)) { @@ -488,10 +469,10 @@ Paper_book::get_system_specs () if (scm_is_pair (system_specs)) set_system_penalty (scm_car (system_specs), header); - if (unsmob_prob (title)) + if (unsmob (title)) { system_specs = scm_cons (title, system_specs); - unsmob_prob (title)->unprotect (); + unsmob (title)->unprotect (); } header = SCM_EOL; @@ -511,10 +492,9 @@ Paper_book::get_system_specs () } else if (Text_interface::is_markup_list (scm_car (s))) { - SCM texts = scm_call_3 (interpret_markup_list, - paper_->self_scm (), - page_properties, - scm_car (s)); + SCM texts = Lily::interpret_markup_list (paper_->self_scm (), + page_properties, + scm_car (s)); Prob *first = 0; Prob *last = 0; for (SCM list = texts; scm_is_pair (list); list = scm_cdr (list)) @@ -529,9 +509,9 @@ Paper_book::get_system_specs () ps->set_property ("last-markup-line", SCM_BOOL_F); ps->set_property ("first-markup-line", SCM_BOOL_F); - paper_system_set_stencil (ps, *unsmob_stencil (t)); + paper_system_set_stencil (ps, *unsmob (t)); - SCM footnotes = get_footnotes (unsmob_stencil (t)->expr ()); + SCM footnotes = get_footnotes (unsmob (t)->expr ()); ps->set_property ("footnotes", footnotes); ps->set_property ("is-title", SCM_BOOL_T); if (list == texts) @@ -574,7 +554,7 @@ Paper_book::get_system_specs () SCM Paper_book::systems () { - if (systems_ != SCM_BOOL_F) + if (scm_is_true (systems_)) return systems_; systems_ = SCM_EOL; @@ -582,7 +562,7 @@ Paper_book::systems () { SCM system_list = SCM_EOL; for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p)) - if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) + if (Paper_book *pbookpart = unsmob (scm_car (p))) system_list = scm_cons (pbookpart->systems (), system_list); systems_ = scm_append (scm_reverse_x (system_list, SCM_EOL)); } @@ -592,7 +572,7 @@ Paper_book::systems () for (SCM s = specs; scm_is_pair (s); s = scm_cdr (s)) { if (Paper_score * pscore - = dynamic_cast (unsmob_music_output (scm_car (s)))) + = unsmob (scm_car (s))) { SCM system_list = scm_vector_to_list (pscore->get_paper_systems ()); @@ -611,7 +591,7 @@ Paper_book::systems () Prob *last = 0; for (SCM s = systems_; scm_is_pair (s); s = scm_cdr (s)) { - Prob *ps = unsmob_prob (scm_car (s)); + Prob *ps = unsmob (scm_car (s)); ps->set_property ("number", scm_from_int (++i)); if (last @@ -623,10 +603,10 @@ Paper_book::systems () if (scm_is_pair (scm_cdr (s))) { SCM perm = ps->get_property ("page-break-permission"); - Prob *next = unsmob_prob (scm_cadr (s)); - if (perm == SCM_EOL) + Prob *next = unsmob (scm_cadr (s)); + if (scm_is_null (perm)) next->set_property ("penalty", scm_from_int (10001)); - else if (perm == ly_symbol2scm ("force")) + else if (scm_is_eq (perm, ly_symbol2scm ("force"))) next->set_property ("penalty", scm_from_int (-10001)); } } @@ -638,43 +618,45 @@ Paper_book::systems () SCM Paper_book::pages () { - if (SCM_BOOL_F != pages_) + if (scm_is_true (pages_)) return pages_; pages_ = SCM_EOL; if (scm_is_pair (bookparts_)) { for (SCM p = bookparts_; scm_is_pair (p); p = scm_cdr (p)) - if (Paper_book *pbookpart = unsmob_paper_book (scm_car (p))) - pages_ = scm_append_x (scm_list_2 (pages_, pbookpart->pages ())); + if (Paper_book *pbookpart = unsmob (scm_car (p))) + pages_ = scm_cons (pbookpart->pages (), pages_); + pages_ = scm_append (scm_reverse_x (pages_, SCM_EOL)); } else if (scm_is_pair (scores_)) { SCM page_breaking = paper_->c_variable ("page-breaking"); - pages_ = scm_apply_0 (page_breaking, scm_list_1 (self_scm ())); + pages_ = scm_call_1 (page_breaking, self_scm ()); // Create all the page stencils. SCM page_module = scm_c_resolve_module ("scm page"); SCM page_stencil = scm_c_module_lookup (page_module, "page-stencil"); page_stencil = scm_variable_ref (page_stencil); for (SCM pages = pages_; scm_is_pair (pages); pages = scm_cdr (pages)) - scm_apply_1 (page_stencil, scm_car (pages), SCM_EOL); + scm_call_1 (page_stencil, scm_car (pages)); // Perform any user-supplied post-processing. SCM post_process = paper_->c_variable ("page-post-process"); if (ly_is_procedure (post_process)) - scm_apply_2 (post_process, paper_->self_scm (), pages_, SCM_EOL); + scm_call_2 (post_process, paper_->self_scm (), pages_); /* set systems_ from the pages */ - if (systems_ == SCM_BOOL_F) + if (scm_is_false (systems_)) { systems_ = SCM_EOL; for (SCM p = pages_; scm_is_pair (p); p = scm_cdr (p)) { - Prob *page = unsmob_prob (scm_car (p)); + Prob *page = unsmob (scm_car (p)); SCM systems = page->get_property ("lines"); - systems_ = scm_append (scm_list_2 (systems_, systems)); + systems_ = scm_cons (systems, systems_); } + systems_ = scm_append (scm_reverse_x (systems_, SCM_EOL)); } } return pages_; diff --git a/lily/paper-column-engraver.cc b/lily/paper-column-engraver.cc index cb39f58d1e..0e32f6e644 100644 --- a/lily/paper-column-engraver.cc +++ b/lily/paper-column-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,7 +18,6 @@ */ #include "paper-column-engraver.hh" -#include "system.hh" #include "international.hh" #include "accidental-placement.hh" #include "accidental-interface.hh" @@ -98,7 +97,7 @@ Paper_column_engraver::make_columns () void Paper_column_engraver::initialize () { - system_ = dynamic_cast (unsmob_grob (get_property ("rootSystem"))); + system_ = unsmob (get_property ("rootSystem")); make_columns (); system_->set_bound (LEFT, command_column_); @@ -143,14 +142,12 @@ Paper_column_engraver::set_columns (Paper_column *new_command, system_->add_column (musical_column_); } -IMPLEMENT_TRANSLATOR_LISTENER (Paper_column_engraver, break); void Paper_column_engraver::listen_break (Stream_event *ev) { break_events_.push_back (ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Paper_column_engraver, label); void Paper_column_engraver::listen_label (Stream_event *ev) { @@ -214,7 +211,7 @@ Paper_column_engraver::process_music () if (start_of_measure) { Moment mlen = Moment (measure_length (context ())); - Grob *column = unsmob_grob (get_property ("currentCommandColumn")); + Grob *column = unsmob (get_property ("currentCommandColumn")); if (column) column->set_property ("measure-length", mlen.smobbed_copy ()); else @@ -232,6 +229,18 @@ Paper_column_engraver::stop_translation_timestep () command_column_->set_property ("when", m); musical_column_->set_property ("when", m); + SCM mpos = get_property ("measurePosition"); + SCM barnum = get_property ("internalBarNumber"); + if (unsmob (mpos) + && scm_is_integer (barnum)) + { + SCM where = scm_cons (barnum, + mpos); + + command_column_->set_property ("rhythmic-location", where); + musical_column_->set_property ("rhythmic-location", where); + } + for (vsize i = 0; i < items_.size (); i++) { Item *elem = items_[i]; @@ -239,13 +248,13 @@ Paper_column_engraver::stop_translation_timestep () if (!elem->get_parent (X_AXIS)) elem->set_parent (col, X_AXIS); - if (!unsmob_grob (elem->get_object ("axis-group-parent-X"))) + if (!unsmob (elem->get_object ("axis-group-parent-X"))) elem->set_object ("axis-group-parent-X", col->self_scm ()); - if (Accidental_placement::has_interface (elem) - || Arpeggio::has_interface (elem)) + if (has_interface (elem) + || has_interface (elem)) Separation_item::add_conditional_item (col, elem); - else if (!Accidental_interface::has_interface (elem)) + else if (!has_interface (elem)) Separation_item::add_item (col, elem); } items_.clear (); @@ -259,7 +268,8 @@ Paper_column_engraver::stop_translation_timestep () for (vsize i = 0; i < break_events_.size (); i++) { SCM perm = break_events_[i]->get_property ("break-permission"); - if (perm == ly_symbol2scm ("force") || perm == ly_symbol2scm ("allow")) + if (scm_is_eq (perm, ly_symbol2scm ("force")) + || scm_is_eq (perm, ly_symbol2scm ("allow"))) warning (_ ("forced break was overridden by some other event, " "should you be using bar checks?")); } @@ -276,18 +286,6 @@ Paper_column_engraver::stop_translation_timestep () first_ = false; label_events_.clear (); - - SCM mpos = get_property ("measurePosition"); - SCM barnum = get_property ("internalBarNumber"); - if (unsmob_moment (mpos) - && scm_is_integer (barnum)) - { - SCM where = scm_cons (barnum, - mpos); - - command_column_->set_property ("rhythmic-location", where); - musical_column_->set_property ("rhythmic-location", where); - } } void @@ -301,9 +299,16 @@ Paper_column_engraver::start_translation_timestep () } } -ADD_ACKNOWLEDGER (Paper_column_engraver, item); -ADD_ACKNOWLEDGER (Paper_column_engraver, note_spacing); -ADD_ACKNOWLEDGER (Paper_column_engraver, staff_spacing); + +void +Paper_column_engraver::boot () +{ + ADD_LISTENER (Paper_column_engraver, break); + ADD_LISTENER (Paper_column_engraver, label); + ADD_ACKNOWLEDGER (Paper_column_engraver, item); + ADD_ACKNOWLEDGER (Paper_column_engraver, note_spacing); + ADD_ACKNOWLEDGER (Paper_column_engraver, staff_spacing); +} ADD_TRANSLATOR (Paper_column_engraver, /* doc */ diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 4379ce1a1d..da3807c31d 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,7 +25,6 @@ #include "font-interface.hh" #include "grob-array.hh" #include "lookup.hh" -#include "lookup.hh" #include "moment.hh" #include "output-def.hh" #include "paper-score.hh" @@ -118,7 +117,7 @@ Moment Paper_column::when_mom (Grob *me) { SCM m = me->get_property ("when"); - if (Moment *when = unsmob_moment (m)) + if (Moment *when = unsmob (m)) return *when; return Moment (0); } @@ -128,8 +127,8 @@ Paper_column::is_musical (Grob *me) { SCM m = me->get_property ("shortest-starter-duration"); Moment s (0); - if (unsmob_moment (m)) - s = *unsmob_moment (m); + if (unsmob (m)) + s = *unsmob (m); return s != Moment (0); } @@ -170,7 +169,7 @@ Paper_column::minimum_distance (Grob *left, Grob *right) for (LEFT_and_RIGHT (d)) { - Skyline_pair *sp = Skyline_pair::unsmob (cols[d]->get_property ("horizontal-skylines")); + Skyline_pair *sp = unsmob (cols[d]->get_property ("horizontal-skylines")); if (sp) skys[d] = (*sp)[-d]; } @@ -181,10 +180,13 @@ Paper_column::minimum_distance (Grob *left, Grob *right) } Interval -Paper_column::break_align_width (Grob *me, SCM align_sym) +Paper_column::break_align_width (Grob *me, SCM align_syms) { Grob *p = me->get_parent (X_AXIS); + if (scm_is_symbol (align_syms)) + align_syms = scm_list_1 (align_syms); + if (is_musical (me)) { me->programming_error ("tried to get break-align-width of a musical column"); @@ -192,22 +194,27 @@ Paper_column::break_align_width (Grob *me, SCM align_sym) } Grob *align = 0; - if (align_sym == ly_symbol2scm ("staff-bar") - || align_sym == ly_symbol2scm ("break-alignment")) - align - = Pointer_group_interface::find_grob (me, ly_symbol2scm ("elements"), - (align_sym == ly_symbol2scm ("staff-bar") - ? Bar_line::non_empty_barline - : Break_alignment_interface::has_interface)); - else + for (;!align && scm_is_pair (align_syms); align_syms = scm_cdr (align_syms)) { - extract_grob_set (me, "elements", elts); - for (vsize i = 0; i < elts.size (); i++) + SCM align_sym = scm_car (align_syms); + if (scm_is_eq (align_sym, ly_symbol2scm ("staff-bar")) + || scm_is_eq (align_sym, ly_symbol2scm ("break-alignment"))) + align = Pointer_group_interface::find_grob + (me, ly_symbol2scm ("elements"), + (scm_is_eq (align_sym, ly_symbol2scm ("staff-bar")) + ? Bar_line::non_empty_barline + : has_interface)); + else { - if (elts[i]->get_property ("break-align-symbol") == align_sym) + extract_grob_set (me, "elements", elts); + for (vsize i = 0; i < elts.size (); i++) { - align = elts[i]; - break; + if (elts[i]->get_property ("break-align-symbol") == align_sym + && !elts[i]->extent (elts[i], X_AXIS).is_empty ()) + { + align = elts[i]; + break; + } } } } @@ -218,6 +225,23 @@ Paper_column::break_align_width (Grob *me, SCM align_sym) return align->extent (p, X_AXIS); } +/* + Loop through elements of a PaperColumn, find all grobs implementing specified + interface and return their combined extent. +*/ +Interval +Paper_column::get_interface_extent (Grob *column, SCM iface, Axis a) +{ + Interval extent = Interval (0, 0); + extract_grob_set (column, "elements", elts); + + for (vsize i = 0; i < elts.size (); i++) + if (elts[i]->internal_has_interface (iface)) + extent.unite (robust_relative_extent (elts[i], elts[i], a)); + + return extent; +} + /* Print a: - vertical line, @@ -231,15 +255,21 @@ Paper_column::break_align_width (Grob *me, SCM align_sym) to your score. Also, as of 2013-10-16 there's a switch in Frescobaldi that turns this on. */ -MAKE_SCHEME_CALLBACK (Paper_column, print, 1); +MAKE_DOCUMENTED_SCHEME_CALLBACK (Paper_column, print, 1, + "Optional stencil for @code{PaperColumn} or" + "@code{NonMusicalPaperColumn}.\n" + "Draws the @code{rank number} of each column," + " its moment in time, a blue arrow showing the" + " ideal distance, and a red arrow showing the" + " minimum distance between columns."); SCM Paper_column::print (SCM p) { - Paper_column *me = dynamic_cast (unsmob_grob (p)); + Paper_column *me = unsmob (p); string r = ::to_string (Paper_column::get_rank (me)); - Moment *mom = unsmob_moment (me->get_property ("when")); + Moment *mom = unsmob (me->get_property ("when")); string when = mom ? mom->to_string () : "?/?"; Font_metric *musfont = Font_interface::get_default_font (me); @@ -250,9 +280,9 @@ Paper_column::print (SCM p) SCM when_mol = Text_interface::interpret_markup (me->layout ()->self_scm (), properties, ly_string2scm (when)); - Stencil t = *unsmob_stencil (scm_mol); + Stencil t = *unsmob (scm_mol); t.scale (1.2, 1.4); - t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1); + t.add_at_edge (Y_AXIS, DOWN, *unsmob (when_mol), 0.1); t.align_to (X_AXIS, LEFT); // compensate for font serifs and half letter-distance t.translate (Offset (-0.1, 0)); @@ -270,9 +300,9 @@ Paper_column::print (SCM p) for (SCM s = me->get_object ("ideal-distances"); scm_is_pair (s); s = scm_cdr (s)) { - Spring *sp = unsmob_spring (scm_caar (s)); - if (!unsmob_grob (scm_cdar (s)) - || !unsmob_grob (scm_cdar (s))->get_system ()) + Spring *sp = unsmob (scm_caar (s)); + if (!unsmob (scm_cdar (s)) + || !unsmob (scm_cdar (s))->get_system ()) continue; j++; @@ -285,7 +315,7 @@ Paper_column::print (SCM p) SCM stil = Text_interface::interpret_markup (me->layout ()->self_scm (), properties, ly_string2scm (String_convert::form_string ("%5.2lf", sp->distance ()))); - Stencil *number_stc = unsmob_stencil (stil); + Stencil *number_stc = unsmob (stil); number_stc->scale (1, 1.1); Real num_height = number_stc->extent (Y_AXIS).length (); Real num_len = number_stc->extent (X_AXIS).length (); @@ -316,7 +346,7 @@ Paper_column::print (SCM p) scm_is_pair (s); s = scm_cdr (s)) { Real dist = scm_to_double (scm_cdar (s)); - Grob *other = unsmob_grob (scm_caar (s)); + Grob *other = unsmob (scm_caar (s)); if (!other || other->get_system () != me->get_system ()) continue; @@ -330,7 +360,7 @@ Paper_column::print (SCM p) SCM stil = Text_interface::interpret_markup (me->layout ()->self_scm (), properties, ly_string2scm (String_convert::form_string ("%5.2lf", dist))); - Stencil *number_stc = unsmob_stencil (stil); + Stencil *number_stc = unsmob (stil); number_stc->scale (1, 1.1); Real num_height = number_stc->extent (Y_AXIS).length (); Real num_len = number_stc->extent (X_AXIS).length (); @@ -360,6 +390,11 @@ Paper_column::print (SCM p) return t.smobbed_copy (); } +static bool grob_is_live (const Grob *g) +{ + return g && g->is_live (); +} + /* This is all too hairy. We use bounded-by-me to make sure that some columns are kept "alive". Unfortunately, when spanners are suicided, @@ -372,23 +407,10 @@ MAKE_SCHEME_CALLBACK (Paper_column, before_line_breaking, 1); SCM Paper_column::before_line_breaking (SCM grob) { - Grob *me = unsmob_grob (grob); - - SCM bbm = me->get_object ("bounded-by-me"); - Grob_array *ga = unsmob_grob_array (bbm); - if (!ga) - return SCM_UNSPECIFIED; + Grob *me = unsmob (grob); - vector &array (ga->array_reference ()); - - for (vsize i = array.size (); i--;) - { - Grob *g = array[i]; - - if (!g || !g->is_live ()) - /* UGH . potentially quadratic. */ - array.erase (array.begin () + i); - } + if (Grob_array *ga = unsmob (me->get_object ("bounded-by-me"))) + ga->filter (grob_is_live); return SCM_UNSPECIFIED; } @@ -410,7 +432,7 @@ Paper_column::is_extraneous_column_from_ligature (Grob *me) bool has_notehead = false; for (vsize i = 0; i < elts.size (); i++) { - if (Rhythmic_head::has_interface (elts[i])) + if (has_interface (elts[i])) { has_notehead = true; if (dynamic_cast (elts[i])->get_column () == me) diff --git a/lily/paper-def.cc b/lily/paper-def.cc index 4c6dc86ebe..0f6efc6b75 100644 --- a/lily/paper-def.cc +++ b/lily/paper-def.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ #include "modified-font-metric.hh" #include "pango-font.hh" #include "all-font-metrics.hh" +#include "lily-imports.hh" Real output_scale (Output_def *od) @@ -34,7 +35,7 @@ SCM get_font_table (Output_def *def) { SCM font_table = def->lookup_variable (ly_symbol2scm ("scaled-fonts")); - if (scm_hash_table_p (font_table) != SCM_BOOL_T) + if (!to_boolean (scm_hash_table_p (font_table))) { font_table = scm_c_make_hash_table (11); def->set_variable (ly_symbol2scm ("scaled-fonts"), font_table); @@ -46,7 +47,7 @@ SCM get_pango_font_table (Output_def *def) { SCM font_table = def->lookup_variable (ly_symbol2scm ("pango-fonts")); - if (scm_hash_table_p (font_table) != SCM_BOOL_T) + if (!to_boolean (scm_hash_table_p (font_table))) { font_table = scm_c_make_hash_table (11); def->set_variable (ly_symbol2scm ("pango-fonts"), font_table); @@ -67,14 +68,14 @@ find_scaled_font (Output_def *mod, Font_metric *f, Real m) SCM sizes = scm_hashq_ref (font_table, f->self_scm (), SCM_EOL); SCM handle = scm_assoc (scm_from_double (lookup_mag), sizes); if (scm_is_pair (handle)) - return unsmob_metrics (scm_cdr (handle)); + return unsmob (scm_cdr (handle)); SCM val = Modified_font_metric::make_scaled_font_metric (f, lookup_mag); sizes = scm_acons (scm_from_double (lookup_mag), val, sizes); - unsmob_metrics (val)->unprotect (); + unsmob (val)->unprotect (); scm_hashq_set_x (font_table, f->self_scm (), sizes); - return unsmob_metrics (val); + return unsmob (val); } Font_metric * @@ -88,7 +89,7 @@ find_pango_font (Output_def *layout, SCM descr, Real factor) SCM size_key = scm_from_double (factor); SCM handle = scm_assoc (size_key, sizes); if (scm_is_pair (handle)) - return unsmob_metrics (scm_cdr (handle)); + return unsmob (scm_cdr (handle)); PangoFontDescription *description = pango_font_description_from_string (scm_i_string_chars (descr)); @@ -114,10 +115,9 @@ find_pango_font (Output_def *layout, SCM descr, Real factor) Output_def * scale_output_def (Output_def *o, Real amount) { - SCM proc = ly_lily_module_constant ("scale-layout"); - SCM new_pap = scm_call_2 (proc, o->self_scm (), scm_from_double (amount)); + SCM new_pap = Lily::scale_layout (o->self_scm (), scm_from_double (amount)); - o = unsmob_output_def (new_pap); + o = unsmob (new_pap); o->protect (); return o; } diff --git a/lily/paper-outputter-scheme.cc b/lily/paper-outputter-scheme.cc index 0e13e1d203..145e9bfa93 100644 --- a/lily/paper-outputter-scheme.cc +++ b/lily/paper-outputter-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -57,8 +57,8 @@ LY_DEFINE (ly_outputter_dump_stencil, "ly:outputter-dump-stencil", LY_ASSERT_SMOB (Paper_outputter, outputter, 1); LY_ASSERT_SMOB (Stencil, stencil, 2); - Paper_outputter *po = unsmob_outputter (outputter); - Stencil *st = unsmob_stencil (stencil); + Paper_outputter *po = unsmob (outputter); + Stencil *st = unsmob (stencil); po->output_stencil (*st); return SCM_UNSPECIFIED; @@ -71,7 +71,7 @@ LY_DEFINE (ly_outputter_dump_string, "ly:outputter-dump-string", LY_ASSERT_SMOB (Paper_outputter, outputter, 1); LY_ASSERT_TYPE (scm_is_string, str, 2); - Paper_outputter *po = unsmob_outputter (outputter); + Paper_outputter *po = unsmob (outputter); return po->dump_string (str); } @@ -81,7 +81,7 @@ LY_DEFINE (ly_outputter_port, "ly:outputter-port", "Return output port for @var{outputter}.") { LY_ASSERT_SMOB (Paper_outputter, outputter, 1); - Paper_outputter *po = unsmob_outputter (outputter); + Paper_outputter *po = unsmob (outputter); return po->file (); } @@ -91,7 +91,7 @@ LY_DEFINE (ly_outputter_close, "ly:outputter-close", "Close port of @var{outputter}.") { LY_ASSERT_SMOB (Paper_outputter, outputter, 1); - Paper_outputter *po = unsmob_outputter (outputter); + Paper_outputter *po = unsmob (outputter); po->close (); return SCM_UNSPECIFIED; @@ -102,7 +102,7 @@ LY_DEFINE (ly_outputter_output_scheme, "ly:outputter-output-scheme", "Eval @var{expr} in module of @var{outputter}.") { LY_ASSERT_SMOB (Paper_outputter, outputter, 1); - Paper_outputter *po = unsmob_outputter (outputter); + Paper_outputter *po = unsmob (outputter); po->output_scheme (expr); @@ -115,6 +115,6 @@ LY_DEFINE (ly_outputter_module, "ly:outputter-module", { LY_ASSERT_SMOB (Paper_outputter, outputter, 1); - Paper_outputter *po = unsmob_outputter (outputter); + Paper_outputter *po = unsmob (outputter); return po->module (); } diff --git a/lily/paper-outputter.cc b/lily/paper-outputter.cc index 34110554dc..a72ea59ccd 100644 --- a/lily/paper-outputter.cc +++ b/lily/paper-outputter.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -37,8 +37,8 @@ using namespace std; #include "scm-hash.hh" #include "string-convert.hh" #include "warn.hh" +#include "lily-imports.hh" -#include "ly-smobs.icc" Paper_outputter::Paper_outputter (SCM port, const string &format) { @@ -53,32 +53,19 @@ Paper_outputter::Paper_outputter (SCM port, const string &format) Enable errors for undefined stencil routines if -dwarning-as-error is specified; else enable warnings. */ - SCM proc = ly_lily_module_constant ("backend-testing"); - scm_call_1 (proc, output_module_); + Lily::backend_testing (output_module_); } Paper_outputter::~Paper_outputter () { } -IMPLEMENT_SMOBS (Paper_outputter); -IMPLEMENT_DEFAULT_EQUAL_P (Paper_outputter); SCM -Paper_outputter::mark_smob (SCM x) +Paper_outputter::mark_smob () const { - Paper_outputter *p = (Paper_outputter *) SCM_CELL_WORD_1 (x); - scm_gc_mark (p->output_module_); - return p->file_; -} - -int -Paper_outputter::print_smob (SCM /* x */, - SCM p, - scm_print_state *) -{ - scm_puts ("#", p); - return 1; + scm_gc_mark (output_module_); + return file_; } SCM @@ -131,7 +118,7 @@ Paper_outputter::output_stencil (Stencil stil) void Paper_outputter::close () { - if (scm_port_p (file_) == SCM_BOOL_T) + if (ly_is_port (file_)) { scm_close_port (file_); /* @@ -139,7 +126,6 @@ Paper_outputter::close () expressions so that we start fresh with the next \book block. --pmccarty */ - SCM proc = ly_lily_module_constant ("remove-stencil-warnings"); - scm_call_1 (proc, output_module_); + Lily::remove_stencil_warnings (output_module_); } } diff --git a/lily/paper-score-scheme.cc b/lily/paper-score-scheme.cc index d303b9c24f..e2909e2844 100644 --- a/lily/paper-score-scheme.cc +++ b/lily/paper-score-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,8 +25,8 @@ LY_DEFINE (ly_paper_score_paper_systems, "ly:paper-score-paper-systems", "Return vector of @code{paper_system} objects from" " @var{paper-score}.") { - LY_ASSERT_TYPE (unsmob_paper_score, paper_score, 1); + LY_ASSERT_SMOB (Paper_score, paper_score, 1); - Paper_score *pscore = dynamic_cast (unsmob_music_output (paper_score)); + Paper_score *pscore = unsmob (paper_score); return pscore->get_paper_systems (); } diff --git a/lily/paper-score.cc b/lily/paper-score.cc index 65ac88333d..0cecb79511 100644 --- a/lily/paper-score.cc +++ b/lily/paper-score.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,12 +42,6 @@ Paper_score::Paper_score (Output_def *layout) paper_systems_ = SCM_BOOL_F; } -Paper_score::Paper_score (Paper_score const &s) - : Music_output (s) -{ - assert (false); -} - void Paper_score::derived_mark () const { @@ -155,7 +149,7 @@ Paper_score::layout () const SCM Paper_score::get_paper_systems () { - if (paper_systems_ == SCM_BOOL_F) + if (scm_is_false (paper_systems_)) { vector breaking = calc_breaking (); system_->break_into_pieces (breaking); @@ -165,9 +159,3 @@ Paper_score::get_paper_systems () } return paper_systems_; } - -Paper_score * -unsmob_paper_score (SCM x) -{ - return dynamic_cast (unsmob_music_output (x)); -} diff --git a/lily/paper-system-scheme.cc b/lily/paper-system-scheme.cc index 8732dfeda6..1f5a39b96a 100644 --- a/lily/paper-system-scheme.cc +++ b/lily/paper-system-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2008--2012 Han-Wen Nienhuys + Copyright (C) 2008--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -37,17 +37,17 @@ LY_DEFINE (ly_paper_system_minimum_distance, "ly:paper-system-minimum-distance", " their extents otherwise.") { Real ret = 0; - Prob *p1 = unsmob_prob (sys1); - Prob *p2 = unsmob_prob (sys2); - Skyline_pair *sky1 = Skyline_pair::unsmob (p1->get_property ("vertical-skylines")); - Skyline_pair *sky2 = Skyline_pair::unsmob (p2->get_property ("vertical-skylines")); + Prob *p1 = unsmob (sys1); + Prob *p2 = unsmob (sys2); + Skyline_pair *sky1 = unsmob (p1->get_property ("vertical-skylines")); + Skyline_pair *sky2 = unsmob (p2->get_property ("vertical-skylines")); if (sky1 && sky2) ret = (*sky1)[DOWN].distance ((*sky2)[UP]); else { - Stencil *s1 = unsmob_stencil (p1->get_property ("stencil")); - Stencil *s2 = unsmob_stencil (p2->get_property ("stencil")); + Stencil *s1 = unsmob (p1->get_property ("stencil")); + Stencil *s2 = unsmob (p2->get_property ("stencil")); Interval iv1 = s1->extent (Y_AXIS); Interval iv2 = s2->extent (Y_AXIS); ret = iv2[UP] - iv1[DOWN]; diff --git a/lily/paper-system.cc b/lily/paper-system.cc index 909d40479d..b67eb0123b 100644 --- a/lily/paper-system.cc +++ b/lily/paper-system.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Jan Nieuwenhuizen + Copyright (C) 2004--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -46,13 +46,13 @@ get_footnotes (SCM expr) SCM head = scm_car (expr); - if (head == ly_symbol2scm ("delay-stencil-evaluation")) + if (scm_is_eq (head, ly_symbol2scm ("delay-stencil-evaluation"))) { // we likely need to do something here...just don't know what... return SCM_EOL; } - if (head == ly_symbol2scm ("combine-stencil")) + if (scm_is_eq (head, ly_symbol2scm ("combine-stencil"))) { SCM out = SCM_EOL; SCM *tail = &out; @@ -60,7 +60,7 @@ get_footnotes (SCM expr) for (SCM x = scm_cdr (expr); scm_is_pair (x); x = scm_cdr (x)) { SCM footnote = get_footnotes (scm_car (x)); - if (SCM_EOL != footnote) + if (!scm_is_null (footnote)) { *tail = scm_cons (footnote, SCM_EOL); tail = SCM_CDRLOC (*tail); @@ -68,10 +68,10 @@ get_footnotes (SCM expr) } return scm_append (out); } - if (head == ly_symbol2scm ("translate-stencil")) + if (scm_is_eq (head, ly_symbol2scm ("translate-stencil"))) return get_footnotes (scm_caddr (expr)); - if (head == ly_symbol2scm ("footnote")) + if (scm_is_eq (head, ly_symbol2scm ("footnote"))) return scm_list_1 (scm_cdr (expr)); return SCM_EOL; diff --git a/lily/parenthesis-engraver.cc b/lily/parenthesis-engraver.cc index 5422d1d441..dcbd506a4a 100644 --- a/lily/parenthesis-engraver.cc +++ b/lily/parenthesis-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -22,7 +22,6 @@ #include "item.hh" #include "pointer-group-interface.hh" -#include "simple-closure.hh" #include "stream-event.hh" #include "warn.hh" @@ -33,7 +32,7 @@ class Parenthesis_engraver : public Engraver TRANSLATOR_DECLARATIONS (Parenthesis_engraver); protected: - DECLARE_ACKNOWLEDGER (grob); + void acknowledge_grob (Grob_info); }; Parenthesis_engraver::Parenthesis_engraver () @@ -67,13 +66,18 @@ Parenthesis_engraver::acknowledge_grob (Grob_info info) } else { - programming_error ("Don't know how to parenthesize spanners."); + info.grob ()->warning ("Don't know how to parenthesize spanners."); } } } } -ADD_ACKNOWLEDGER (Parenthesis_engraver, grob); +void +Parenthesis_engraver::boot () +{ + ADD_ACKNOWLEDGER (Parenthesis_engraver, grob); +} + ADD_TRANSLATOR (Parenthesis_engraver, /* doc */ "Parenthesize objects whose music cause has the" diff --git a/lily/parse-scm.cc b/lily/parse-scm.cc index 25a60f7b36..576591dc97 100644 --- a/lily/parse-scm.cc +++ b/lily/parse-scm.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,6 +28,7 @@ using namespace std; #include "main.hh" #include "paper-book.hh" #include "source-file.hh" +#include "lily-imports.hh" /* Pass string to scm parser, read one expression. Return result value and #chars read. @@ -92,17 +93,11 @@ internal_ly_eval_scm (Parse_start *ps) if (ps->safe_) { static SCM module = SCM_BOOL_F; - if (module == SCM_BOOL_F) + if (scm_is_false (module)) { - SCM function = ly_lily_module_constant ("make-safe-lilypond-module"); - module = scm_gc_protect_object (scm_call_0 (function)); + module = scm_gc_protect_object (Lily::make_safe_lilypond_module ()); } - // We define the parser so trusted Scheme functions can - // access the real namespace underlying the parser. - if (ps->parser_) - scm_module_define (module, ly_symbol2scm ("parser"), - ps->parser_->self_scm ()); return scm_eval (ps->form_, module); } return scm_primitive_eval (ps->form_); @@ -125,7 +120,8 @@ parse_handler (void *data, SCM /*tag*/, SCM args) { Parse_start *ps = (Parse_start *) data; - ps->location_.error (_ ("GUILE signaled an error for the expression beginning here")); + ps->location_.non_fatal_error + (_ ("GUILE signaled an error for the expression beginning here")); if (scm_ilength (args) > 2) scm_display_error_message (scm_cadr (args), scm_caddr (args), scm_current_error_port ()); @@ -146,15 +142,15 @@ protected_ly_parse_scm (Parse_start *ps) } SCM -protected_ly_eval_scm (Parse_start *ps) +protected_ly_eval_scm (void *ps) { /* Catch #t : catch all Scheme level errors. */ return scm_internal_catch (SCM_BOOL_T, catch_protected_eval_body, - (void *) ps, - &parse_handler, (void *) ps); + ps, + &parse_handler, ps); } bool parse_protect_global = true; @@ -178,8 +174,12 @@ ly_eval_scm (SCM form, Input i, bool safe, Lily_parser *parser) { Parse_start ps (form, i, safe, parser); - SCM ans = parse_protect_global ? protected_ly_eval_scm (&ps) - : internal_ly_eval_scm (&ps); + SCM ans = scm_c_with_fluid + (Lily::f_location, + i.smobbed_copy (), + parse_protect_global ? protected_ly_eval_scm + : catch_protected_eval_body, (void *) &ps); + scm_remember_upto_here_1 (form); return ans; } diff --git a/lily/parser.yy b/lily/parser.yy index 8a7f4675d4..52fe450b7d 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -2,7 +2,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -41,9 +41,7 @@ do { \ if (scm_is_eq (value, SCM_UNSPECIFIED)) \ break; \ - SCM s = scm_call_2 (ly_lily_module_constant ("value->lily-string"), \ - value, \ - parser->self_scm ()); \ + SCM s = Display::value_to_lily_string (value); \ char *p = scm_to_locale_string (s); \ fputs (p, file); \ free (p); \ @@ -62,7 +60,7 @@ deleting them. Let's hope that a stack overflow doesn't trigger a move of the parse stack onto the heap. */ %left PREC_BOT -%nonassoc REPEAT REPEAT_IDENTIFIER +%nonassoc REPEAT %nonassoc ALTERNATIVE /* The above precedences tackle the shift/reduce problem @@ -81,7 +79,7 @@ or %left ADDLYRICS %right ':' UNSIGNED REAL E_UNSIGNED EVENT_IDENTIFIER EVENT_FUNCTION '^' '_' - HYPHEN EXTENDER DURATION_IDENTIFIER + HYPHEN EXTENDER DURATION_IDENTIFIER '!' /* The above are needed for collecting tremoli and other items (that could otherwise be interpreted as belonging to the next function @@ -121,6 +119,7 @@ FIXME: using namespace std; #include "book.hh" +#include "context.hh" #include "context-def.hh" #include "context-mod.hh" #include "dimensions.hh" @@ -130,6 +129,7 @@ using namespace std; #include "lily-guile.hh" #include "lily-lexer.hh" #include "lily-parser.hh" +#include "ly-module.hh" #include "main.hh" #include "misc.hh" #include "music.hh" @@ -139,6 +139,7 @@ using namespace std; #include "score.hh" #include "text-interface.hh" #include "warn.hh" +#include "lily-imports.hh" void Lily_parser::parser_error (Input const *i, Lily_parser *parser, SCM *, const string &s) @@ -146,32 +147,36 @@ Lily_parser::parser_error (Input const *i, Lily_parser *parser, SCM *, const str parser->parser_error (*i, s); } +// The following are somewhat precarious constructs as they may change +// the value of the lookahead token. That implies that the lookahead +// token must not yet have made an impact on the state stack other +// than causing the reduction of the current rule, or switching the +// lookahead token while Bison is mulling it over will cause trouble. + #define MYBACKUP(Token, Value, Location) \ -do \ - if (yychar == YYEMPTY) \ - { \ + do { \ + if (yychar != YYEMPTY) \ + parser->lexer_->push_extra_token \ + (yylloc, yychar, yylval); \ if (Token) \ - parser->lexer_->push_extra_token (Token, Value); \ - parser->lexer_->push_extra_token (BACKUP); \ - } else { \ - parser->parser_error \ - (Location, _("Too much lookahead")); \ - } \ -while (0) + parser->lexer_->push_extra_token \ + (Location, Token, Value); \ + parser->lexer_->push_extra_token (Location, BACKUP); \ + yychar = YYEMPTY; \ + } while (0) #define MYREPARSE(Location, Pred, Token, Value) \ -do \ - if (yychar == YYEMPTY) \ - { \ - parser->lexer_->push_extra_token (Token, Value); \ - parser->lexer_->push_extra_token (REPARSE, \ - Pred); \ - } else { \ - parser->parser_error \ - (Location, _("Too much lookahead")); \ - } \ -while (0) + do { \ + if (yychar != YYEMPTY) \ + parser->lexer_->push_extra_token \ + (yylloc, yychar, yylval); \ + parser->lexer_->push_extra_token \ + (Location, Token, Value); \ + parser->lexer_->push_extra_token \ + (Location, REPARSE, Pred); \ + yychar = YYEMPTY; \ + } while (0) %} @@ -183,18 +188,30 @@ while (0) parser->lexer_->override_input (spot)) /* ES TODO: -- Don't use lily module, create a new module instead. - delay application of the function */ -#define LOWLEVEL_MAKE_SYNTAX(proc, args) \ - scm_apply_0 (proc, args) + +#define LOWLEVEL_MAKE_SYNTAX(location, proc, ...) \ + with_location \ + (parser->lexer_->override_input (location).smobbed_copy (), \ + proc, \ + ##__VA_ARGS__) + /* Syntactic Sugar. */ #define MAKE_SYNTAX(name, location, ...) \ - LOWLEVEL_MAKE_SYNTAX (ly_lily_module_constant (name), scm_list_n (parser->self_scm (), make_input (parser->lexer_->override_input (location)), ##__VA_ARGS__, SCM_UNDEFINED)) + LOWLEVEL_MAKE_SYNTAX (location, Syntax::name, ##__VA_ARGS__) + #define START_MAKE_SYNTAX(name, ...) \ - scm_list_n (ly_lily_module_constant (name) , ##__VA_ARGS__, SCM_UNDEFINED) + scm_list_n (Syntax::name, ##__VA_ARGS__, SCM_UNDEFINED) + #define FINISH_MAKE_SYNTAX(start, location, ...) \ - LOWLEVEL_MAKE_SYNTAX (scm_car (start), scm_cons2 (parser->self_scm (), make_input (parser->lexer_->override_input (location)), scm_append_x (scm_list_2 (scm_cdr (start), scm_list_n (__VA_ARGS__, SCM_UNDEFINED))))) + LOWLEVEL_MAKE_SYNTAX \ + (location, \ + Guile_user::apply, \ + scm_car (start), \ + scm_append_x \ + (scm_list_2 (scm_cdr (start), \ + scm_list_n (__VA_ARGS__, SCM_UNDEFINED)))) SCM get_next_unique_context_id (); SCM get_next_unique_lyrics_context_id (); @@ -212,11 +229,11 @@ static Music *make_music_with_input (SCM name, Input where); SCM check_scheme_arg (Lily_parser *parser, Input loc, SCM arg, SCM args, SCM pred, SCM disp = SCM_UNDEFINED); SCM make_music_from_simple (Lily_parser *parser, Input loc, SCM pitch); -SCM loc_on_music (Input loc, SCM arg); +SCM loc_on_music (Lily_parser *parser, Input loc, SCM arg); SCM make_chord_elements (Input loc, SCM pitch, SCM dur, SCM modification_list); SCM make_chord_step (SCM step, Rational alter); SCM make_simple_markup (SCM a); -SCM make_duration (SCM t, int dots = 0); +SCM make_duration (SCM t, int dots = 0, SCM factor = SCM_UNDEFINED); bool is_regular_identifier (SCM id, bool multiple=false); SCM try_string_variants (SCM pred, SCM str); int yylex (YYSTYPE *s, YYLTYPE *loc, Lily_parser *parser); @@ -249,6 +266,7 @@ int yylex (YYSTYPE *s, YYLTYPE *loc, Lily_parser *parser); %token DESCRIPTION "\\description" %token DRUMMODE "\\drummode" %token DRUMS "\\drums" +%token ETC "\\etc" %token FIGUREMODE "\\figuremode" %token FIGURES "\\figures" %token HEADER "\\header" @@ -269,6 +287,7 @@ int yylex (YYSTYPE *s, YYLTYPE *loc, Lily_parser *parser); %token REST "\\rest" %token REVERT "\\revert" %token SCORE "\\score" +%token SCORELINES "\\score-lines" %token SEQUENTIAL "\\sequential" %token SET "\\set" %token SIMULTANEOUS "\\simultaneous" @@ -325,18 +344,17 @@ If we give names, Bison complains. %token EMBEDDED_LILY "#{" %token BOOK_IDENTIFIER -%token CHORD_BODY_IDENTIFIER %token CHORD_MODIFIER %token CHORD_REPETITION -%token CONTEXT_DEF_IDENTIFIER %token CONTEXT_MOD_IDENTIFIER %token DRUM_PITCH -%token PITCH_IDENTIFIER -%token PITCH_ARG + /* Artificial token for durations in argument lists */ +%token DURATION_ARG %token DURATION_IDENTIFIER %token EVENT_IDENTIFIER %token EVENT_FUNCTION %token FRACTION +%token LOOKUP_IDENTIFIER %token LYRIC_ELEMENT %token MARKUP_FUNCTION %token MARKUP_LIST_FUNCTION @@ -346,9 +364,8 @@ If we give names, Bison complains. %token MUSIC_IDENTIFIER %token NOTENAME_PITCH %token NUMBER_IDENTIFIER -%token OUTPUT_DEF_IDENTIFIER +%token PITCH_IDENTIFIER %token REAL -%token REPEAT_IDENTIFIER %token RESTNAME %token SCM_ARG %token SCM_FUNCTION @@ -370,8 +387,7 @@ prec levels in different prods */ start_symbol: lilypond | EMBEDDED_LILY { - SCM nn = parser->lexer_->lookup_identifier ("pitchnames"); - parser->lexer_->push_note_state (nn); + parser->lexer_->push_note_state (Lily::pitchnames); } embedded_lilypond { parser->lexer_->pop_state (); *retval = $3; @@ -393,41 +409,39 @@ lilypond: /* empty */ { $$ = SCM_UNSPECIFIED; } toplevel_expression: - { - parser->lexer_->add_scope (get_header (parser)); - } lilypond_header { - parser->lexer_->set_identifier (ly_symbol2scm ("$defaultheader"), $2); + header_block { + parser->lexer_->set_identifier (ly_symbol2scm ("$defaultheader"), $1); } | book_block { SCM proc = parser->lexer_->lookup_identifier ("toplevel-book-handler"); - scm_call_2 (proc, parser->self_scm (), $1); + scm_call_1 (proc, $1); } | bookpart_block { SCM proc = parser->lexer_->lookup_identifier ("toplevel-bookpart-handler"); - scm_call_2 (proc, parser->self_scm (), $1); + scm_call_1 (proc, $1); } | BOOK_IDENTIFIER { SCM proc = parser->lexer_->lookup_identifier - (unsmob_book($1)->paper_ + (unsmob($1)->paper_ ? "toplevel-book-handler" : "toplevel-bookpart-handler"); - scm_call_2 (proc, parser->self_scm (), $1); + scm_call_1 (proc, $1); } | score_block { SCM proc = parser->lexer_->lookup_identifier ("toplevel-score-handler"); - scm_call_2 (proc, parser->self_scm (), $1); + scm_call_1 (proc, $1); } | composite_music { SCM proc = parser->lexer_->lookup_identifier ("toplevel-music-handler"); - scm_call_2 (proc, parser->self_scm (), $1); + scm_call_1 (proc, $1); } | full_markup { SCM proc = parser->lexer_->lookup_identifier ("toplevel-text-handler"); - scm_call_2 (proc, parser->self_scm (), scm_list_1 ($1)); + scm_call_1 (proc, scm_list_1 ($1)); } | full_markup_list { SCM proc = parser->lexer_->lookup_identifier ("toplevel-text-handler"); - scm_call_2 (proc, parser->self_scm (), $1); + scm_call_1 (proc, $1); } | SCM_TOKEN { // Evaluate and ignore #xxx, as opposed to \xxx @@ -443,29 +457,55 @@ toplevel_expression: if (scm_is_pair (out)) { SCM proc = parser->lexer_->lookup_identifier ("toplevel-text-handler"); - scm_call_2 (proc, parser->self_scm (), out); - } else if (unsmob_score ($1)) + scm_call_1 (proc, out); + } else if (unsmob ($1)) { SCM proc = parser->lexer_->lookup_identifier ("toplevel-score-handler"); - scm_call_2 (proc, parser->self_scm (), $1); + scm_call_1 (proc, $1); + } else if (Output_def * od = unsmob ($1)) { + SCM id = SCM_EOL; + + if (to_boolean (od->c_variable ("is-paper"))) + id = ly_symbol2scm ("$defaultpaper"); + else if (to_boolean (od->c_variable ("is-midi"))) + id = ly_symbol2scm ("$defaultmidi"); + else if (to_boolean (od->c_variable ("is-layout"))) + id = ly_symbol2scm ("$defaultlayout"); + + parser->lexer_->set_identifier (id, $1); + } else if (ly_is_module ($1)) + { + SCM module = get_header (parser); + ly_module_copy (module, $1); + parser->lexer_->set_identifier + (ly_symbol2scm ("$defaultheader"), module); } else if (!scm_is_eq ($1, SCM_UNSPECIFIED)) parser->parser_error (@1, _("bad expression type")); } | output_def { SCM id = SCM_EOL; - Output_def * od = unsmob_output_def ($1); + Output_def * od = unsmob ($1); - if (od->c_variable ("is-paper") == SCM_BOOL_T) + if (to_boolean (od->c_variable ("is-paper"))) id = ly_symbol2scm ("$defaultpaper"); - else if (od->c_variable ("is-midi") == SCM_BOOL_T) + else if (to_boolean (od->c_variable ("is-midi"))) id = ly_symbol2scm ("$defaultmidi"); - else if (od->c_variable ("is-layout") == SCM_BOOL_T) + else if (to_boolean (od->c_variable ("is-layout"))) id = ly_symbol2scm ("$defaultlayout"); parser->lexer_->set_identifier (id, $1); } ; +lookup: + LOOKUP_IDENTIFIER + | LOOKUP_IDENTIFIER '.' symbol_list_rev + { + $$ = loc_on_music (parser, @$, + nested_property ($1, scm_reverse_x ($3, SCM_EOL))); + } + ; + embedded_scm_bare: SCM_TOKEN { @@ -477,6 +517,7 @@ embedded_scm_bare: embedded_scm_active: SCM_IDENTIFIER | scm_function_call + | lookup ; embedded_scm_bare_arg: @@ -486,13 +527,16 @@ embedded_scm_bare_arg: $$ = parser->lexer_->eval_scm_token ($1, @1); } | FRACTION + | partial_markup | full_markup_list | context_modification + | header_block | score_block | context_def_spec_block | book_block | bookpart_block | output_def + | lookup ; /* The generic version may end in music, or not */ @@ -500,6 +544,7 @@ embedded_scm_bare_arg: embedded_scm: embedded_scm_bare | scm_function_call + | lookup ; /* embedded_scm_arg is _not_ casting pitches to music by default, this @@ -519,8 +564,20 @@ embedded_scm_arg: scm_function_call: SCM_FUNCTION function_arglist { - $$ = MAKE_SYNTAX ("music-function", @$, - $1, $2); + $$ = MAKE_SYNTAX (music_function, @$, + $1, $2); + } + ; + +embedded_lilypond_number: + '-' embedded_lilypond_number + { + $$ = scm_difference ($2, SCM_UNDEFINED); + } + | bare_number_common + | UNSIGNED NUMBER_IDENTIFIER + { + $$ = scm_product ($1, $2); } ; @@ -531,16 +588,40 @@ embedded_lilypond: // for empty rules, and the only token in the whole // production, EMBEDDED_LILY, is synthetic and also // contains no source location. - $$ = MAKE_SYNTAX ("void-music", @$); + $$ = MAKE_SYNTAX (void_music, @$); + } + | identifier_init_nonumber + | embedded_lilypond_number + | post_event post_events + { + $$ = scm_reverse_x ($2, SCM_EOL); + if (Music *m = unsmob ($1)) + { + if (m->is_mus_type ("post-event-wrapper")) + $$ = scm_append + (scm_list_2 (m->get_property ("elements"), + $$)); + else + $$ = scm_cons ($1, $$); + } + if (scm_is_pair ($$) + && scm_is_null (scm_cdr ($$))) + $$ = scm_car ($$); + else + { + Music * m = MY_MAKE_MUSIC ("PostEvents", @$); + m->set_property ("elements", $$); + $$ = m->unprotect (); + } } - | identifier_init + | multiplied_duration | music_embedded music_embedded music_list { $3 = scm_reverse_x ($3, SCM_EOL); - if (unsmob_music ($2)) + if (unsmob ($2)) $3 = scm_cons ($2, $3); - if (unsmob_music ($1)) + if (unsmob ($1)) $3 = scm_cons ($1, $3); - $$ = MAKE_SYNTAX ("sequential-music", @$, $3); + $$ = MAKE_SYNTAX (sequential_music, @$, $3); } | error { parser->error_level_ = 1; @@ -558,8 +639,15 @@ lilypond_header_body: | lilypond_header_body assignment { } - | lilypond_header_body embedded_scm { - + | lilypond_header_body SCM_TOKEN { + // Evaluate and ignore #xxx, as opposed to \xxx + parser->lexer_->eval_scm_token ($2, @2); + } + | lilypond_header_body embedded_scm_active { + if (ly_is_module ($2)) + ly_module_copy (scm_current_module (), $2); + else if (!scm_is_eq ($2, SCM_UNSPECIFIED)) + parser->parser_error (@2, _("bad expression type")); } ; @@ -569,6 +657,14 @@ lilypond_header: } ; +header_block: + { + parser->lexer_->add_scope (get_header (parser)); + } lilypond_header { + $$ = $2; + } + ; + /* DECLARATIONS */ @@ -581,12 +677,12 @@ assignment: parser->lexer_->set_identifier ($1, $3); $$ = SCM_UNSPECIFIED; } - | assignment_id property_path '=' identifier_init { - SCM path = scm_cons (scm_string_to_symbol ($1), $2); - parser->lexer_->set_identifier (path, $4); + | assignment_id '.' property_path '=' identifier_init { + SCM path = scm_cons (scm_string_to_symbol ($1), $3); + parser->lexer_->set_identifier (path, $5); $$ = SCM_UNSPECIFIED; } - | assignment_id '.' property_path '=' identifier_init { + | assignment_id ',' property_path '=' identifier_init { SCM path = scm_cons (scm_string_to_symbol ($1), $3); parser->lexer_->set_identifier (path, $5); $$ = SCM_UNSPECIFIED; @@ -595,16 +691,20 @@ assignment: identifier_init: - score_block - | book_block - | bookpart_block - | output_def - | context_def_spec_block - | music_assign + identifier_init_nonumber + | number_expression + | symbol_list_part_bare '.' property_path + { + $$ = scm_reverse_x ($1, $3); + } + | symbol_list_part_bare ',' property_path + { + $$ = scm_reverse_x ($1, $3); + } | post_event_nofinger post_events { $$ = scm_reverse_x ($2, SCM_EOL); - if (Music *m = unsmob_music ($1)) + if (Music *m = unsmob ($1)) { if (m->is_mus_type ("post-event-wrapper")) $$ = scm_append @@ -623,19 +723,120 @@ identifier_init: $$ = m->unprotect (); } } - | number_expression + ; + +identifier_init_nonumber: + header_block + | score_block + | book_block + | bookpart_block + | output_def + | context_def_spec_block + | music_assign + | pitch_or_music | FRACTION | string - | embedded_scm + | embedded_scm + | partial_markup | full_markup_list | context_modification + | partial_function ETC + { + $$ = MAKE_SYNTAX (partial_music_function, @$, + scm_reverse_x ($1, SCM_EOL)); + } + ; + +// Partial functions +partial_function: + MUSIC_FUNCTION function_arglist_partial + { + $$ = scm_acons ($1, $2, SCM_EOL); + } + | EVENT_FUNCTION function_arglist_partial + { + $$ = scm_acons ($1, $2, SCM_EOL); + } + | SCM_FUNCTION function_arglist_partial + { + $$ = scm_acons ($1, $2, SCM_EOL); + } + | OVERRIDE grob_prop_path '=' + { + if (SCM_UNBNDP ($2)) + $$ = scm_list_1 (SCM_BOOL_F); + else + $$ = scm_cons + (scm_list_3 (Syntax::property_override_function, + scm_cdr ($2), scm_car ($2)), + SCM_EOL); + } + | SET context_prop_spec '=' + { + if (SCM_UNBNDP ($2)) + $$ = scm_list_1 (SCM_BOOL_F); + else + $$ = scm_cons + (scm_list_3 (Syntax::property_set_function, + scm_cadr ($2), scm_car ($2)), + SCM_EOL); + } + | MUSIC_FUNCTION EXPECT_SCM function_arglist_optional partial_function + { + $$ = scm_acons ($1, $3, $4); + } + | EVENT_FUNCTION EXPECT_SCM function_arglist_optional partial_function + { + $$ = scm_acons ($1, $3, $4); + } + | SCM_FUNCTION EXPECT_SCM function_arglist_optional partial_function + { + $$ = scm_acons ($1, $3, $4); + } + | OVERRIDE grob_prop_path '=' partial_function + { + if (SCM_UNBNDP ($2)) + $$ = scm_list_1 (SCM_BOOL_F); + else + $$ = scm_cons + (scm_list_3 (Syntax::property_override_function, + scm_cdr ($2), scm_car ($2)), + $4); + } + | SET context_prop_spec '=' partial_function + { + if (SCM_UNBNDP ($2)) + $$ = scm_list_1 (SCM_BOOL_F); + else + $$ = scm_cons + (scm_list_3 (Syntax::property_set_function, + scm_cadr ($2), scm_car ($2)), + $4); + } + | MUSIC_FUNCTION EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup partial_function + { + $$ = scm_acons ($1, $4, $5); + } + | EVENT_FUNCTION EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup partial_function + { + $$ = scm_acons ($1, $4, $5); + } + | SCM_FUNCTION EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup partial_function + { + $$ = scm_acons ($1, $4, $5); + } ; context_def_spec_block: CONTEXT '{' context_def_spec_body '}' - { + { $$ = $3; - unsmob_context_def ($$)->origin ()->set_spot (@$); + Context_def *td = unsmob ($$); + if (!td) { + $$ = Context_def::make_scm (); + td = unsmob ($$); + } + td->origin ()->set_spot (@$); } ; @@ -643,8 +844,7 @@ context_mod_arg: embedded_scm | { - SCM nn = parser->lexer_->lookup_identifier ("pitchnames"); - parser->lexer_->push_note_state (nn); + parser->lexer_->push_note_state (Lily::pitchnames); } composite_music { @@ -653,47 +853,54 @@ context_mod_arg: } ; -context_mod_embedded: - context_mod_arg - { - if (unsmob_music ($1)) { - SCM proc = parser->lexer_->lookup_identifier ("context-mod-music-handler"); - $1 = scm_call_2 (proc, parser->self_scm (), $1); - } - if (unsmob_context_mod ($1)) - $$ = $1; - else { - parser->parser_error (@1, _ ("not a context mod")); - $$ = Context_mod ().smobbed_copy (); - } - } - ; - context_def_spec_body: /**/ { - $$ = Context_def::make_scm (); - } - | CONTEXT_DEF_IDENTIFIER { - $$ = $1; + $$ = SCM_UNSPECIFIED; } | context_def_spec_body context_mod { - if (!SCM_UNBNDP ($2)) - unsmob_context_def ($$)->add_context_mod ($2); + if (!SCM_UNBNDP ($2)) { + Context_def *td = unsmob ($$); + if (!td) { + $$ = Context_def::make_scm (); + td = unsmob ($$); + } + unsmob ($$)->add_context_mod ($2); + } } | context_def_spec_body context_modification { - Context_def *td = unsmob_context_def ($$); - SCM new_mods = unsmob_context_mod ($2)->get_mods (); + Context_def *td = unsmob ($$); + if (!td) { + $$ = Context_def::make_scm (); + td = unsmob ($$); + } + SCM new_mods = unsmob ($2)->get_mods (); for (SCM m = new_mods; scm_is_pair (m); m = scm_cdr (m)) { td->add_context_mod (scm_car (m)); } } - | context_def_spec_body context_mod_embedded { - Context_def *td = unsmob_context_def ($$); - SCM new_mods = unsmob_context_mod ($2)->get_mods (); - for (SCM m = new_mods; scm_is_pair (m); m = scm_cdr (m)) { - td->add_context_mod (scm_car (m)); - } + | context_def_spec_body context_mod_arg { + Context_def *td = unsmob ($1); + if (scm_is_eq ($2, SCM_UNSPECIFIED)) + ; + else if (!td && unsmob ($2)) + $$ = $2; + else { + if (!td) { + $$ = Context_def::make_scm (); + td = unsmob ($$); + } + if (unsmob ($2)) { + SCM proc = parser->lexer_->lookup_identifier ("context-mod-music-handler"); + $2 = scm_call_1 (proc, $2); + } + if (Context_mod *cm = unsmob ($2)) { + for (SCM m = cm->get_mods (); scm_is_pair (m); m = scm_cdr (m)) { + td->add_context_mod (scm_car (m)); + } + } else + parser->parser_error (@2, _ ("not a context mod")); + } } ; @@ -702,7 +909,7 @@ context_def_spec_body: book_block: BOOK '{' book_body '}' { $$ = $3; - unsmob_book ($$)->origin ()->set_spot (@$); + unsmob ($$)->origin ()->set_spot (@$); pop_paper (parser); parser->lexer_->set_identifier (ly_symbol2scm ("$current-book"), SCM_BOOL_F); } @@ -715,7 +922,7 @@ book_body: { Book *book = new Book; init_papers (parser); - book->paper_ = dynamic_cast (unsmob_output_def (parser->lexer_->lookup_identifier ("$defaultpaper"))->clone ()); + book->paper_ = dynamic_cast (unsmob (parser->lexer_->lookup_identifier ("$defaultpaper"))->clone ()); book->paper_->unprotect (); push_paper (parser, book->paper_); book->header_ = get_header (parser); @@ -726,8 +933,8 @@ book_body: parser->lexer_->set_identifier (ly_symbol2scm ("$current-book"), $1); } | book_body paper_block { - unsmob_book ($1)->paper_ = unsmob_output_def ($2); - set_paper (parser, unsmob_output_def ($2)); + unsmob ($1)->paper_ = unsmob ($2); + set_paper (parser, unsmob ($2)); } | book_body bookpart_block { SCM proc = parser->lexer_->lookup_identifier ("book-bookpart-handler"); @@ -739,7 +946,7 @@ book_body: } | book_body composite_music { SCM proc = parser->lexer_->lookup_identifier ("book-music-handler"); - scm_call_3 (proc, parser->self_scm (), $1, $2); + scm_call_2 (proc, $1, $2); } | book_body full_markup { SCM proc = parser->lexer_->lookup_identifier ("book-text-handler"); @@ -764,19 +971,29 @@ book_body: { SCM proc = parser->lexer_->lookup_identifier ("book-text-handler"); scm_call_2 (proc, $1, out); - } else if (unsmob_score ($2)) + } else if (unsmob ($2)) { SCM proc = parser->lexer_->lookup_identifier ("book-score-handler"); scm_call_2 (proc, $1, $2); + } else if (Output_def *od = unsmob ($2)) { + if (to_boolean (od->lookup_variable (ly_symbol2scm ("is-paper")))) { + unsmob ($1)->paper_ = od; + set_paper (parser, od); + } else { + parser->parser_error (@2, _ ("need \\paper for paper block")); + } + } else if (ly_is_module ($2)) + { + ly_module_copy (unsmob ($1)->header_, $2); } else if (!scm_is_eq ($2, SCM_UNSPECIFIED)) parser->parser_error (@2, _("bad expression type")); } | book_body { - parser->lexer_->add_scope (unsmob_book ($1)->header_); + parser->lexer_->add_scope (unsmob ($1)->header_); } lilypond_header | book_body error { - Book *book = unsmob_book ($1); + Book *book = unsmob ($1); book->paper_ = 0; book->scores_ = SCM_EOL; book->bookparts_ = SCM_EOL; @@ -786,7 +1003,7 @@ book_body: bookpart_block: BOOKPART '{' bookpart_body '}' { $$ = $3; - unsmob_book ($$)->origin ()->set_spot (@$); + unsmob ($$)->origin ()->set_spot (@$); parser->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), SCM_BOOL_F); } ; @@ -801,7 +1018,7 @@ bookpart_body: parser->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), $1); } | bookpart_body paper_block { - unsmob_book ($$)->paper_ = unsmob_output_def ($2); + unsmob ($$)->paper_ = unsmob ($2); } | bookpart_body score_block { SCM proc = parser->lexer_->lookup_identifier ("bookpart-score-handler"); @@ -809,7 +1026,7 @@ bookpart_body: } | bookpart_body composite_music { SCM proc = parser->lexer_->lookup_identifier ("bookpart-music-handler"); - scm_call_3 (proc, parser->self_scm (), $1, $2); + scm_call_2 (proc, $1, $2); } | bookpart_body full_markup { SCM proc = parser->lexer_->lookup_identifier ("bookpart-text-handler"); @@ -834,22 +1051,33 @@ bookpart_body: { SCM proc = parser->lexer_->lookup_identifier ("bookpart-text-handler"); scm_call_2 (proc, $1, out); - } else if (unsmob_score ($2)) + } else if (unsmob ($2)) { SCM proc = parser->lexer_->lookup_identifier ("bookpart-score-handler"); scm_call_2 (proc, $1, $2); + } else if (Output_def *od = unsmob ($2)) { + if (to_boolean (od->lookup_variable (ly_symbol2scm ("is-paper")))) { + unsmob ($1)->paper_ = od; + } else { + parser->parser_error (@2, _ ("need \\paper for paper block")); + } + } else if (ly_is_module ($2)) { + Book *book = unsmob ($1); + if (!ly_is_module (book->header_)) + book->header_ = ly_make_module (false); + ly_module_copy (book->header_, $2); } else if (!scm_is_eq ($2, SCM_UNSPECIFIED)) parser->parser_error (@2, _("bad expression type")); } | bookpart_body { - Book *book = unsmob_book ($1); + Book *book = unsmob ($1); if (!ly_is_module (book->header_)) book->header_ = ly_make_module (false); parser->lexer_->add_scope (book->header_); } lilypond_header | bookpart_body error { - Book *book = unsmob_book ($1); + Book *book = unsmob ($1); book->paper_ = 0; book->scores_ = SCM_EOL; } @@ -857,91 +1085,118 @@ bookpart_body: score_block: SCORE '{' score_body '}' { - unsmob_score ($3)->origin ()->set_spot (@$); + unsmob ($3)->origin ()->set_spot (@$); $$ = $3; } ; -score_headers: - /* empty */ - { - $$ = SCM_EOL; - } - | score_headers - { - if (!scm_is_pair ($1) - || !ly_is_module (scm_car ($1))) - $1 = scm_cons (ly_make_module (false), $1); - parser->lexer_->add_scope (scm_car ($1)); - } lilypond_header - { - $$ = $1; - } - | score_headers output_def - { - Output_def *od = unsmob_output_def ($2); - if (od->lookup_variable (ly_symbol2scm ("is-paper")) == SCM_BOOL_T) - { - parser->parser_error (@2, _("\\paper cannot be used in \\score, use \\layout instead")); - - } - else - { +score_body: + score_items { + if (!unsmob ($1)) { + parser->parser_error (@1, _("Missing music in \\score")); + $$ = (new Score)->unprotect (); if (scm_is_pair ($1) && ly_is_module (scm_car ($1))) - scm_set_cdr_x ($1, scm_cons ($2, scm_cdr ($1))); - else - $$ = scm_cons ($2, $1); + { + unsmob ($$)->set_header (scm_car ($1)); + $1 = scm_cdr ($1); + } + for (SCM p = scm_reverse_x ($1, SCM_EOL); + scm_is_pair (p); p = scm_cdr (p)) + { + unsmob ($$)-> + add_output_def (unsmob (scm_car (p))); + } } } + | score_body error { + unsmob ($$)->error_found_ = true; + } ; - - -score_body: - score_headers music { - SCM scorify = ly_lily_module_constant ("scorify-music"); - $$ = scm_call_2 (scorify, $2, parser->self_scm ()); +score_item: + embedded_scm + | music + | output_def + ; - if (scm_is_pair ($1) && ly_is_module (scm_car ($1))) - { - unsmob_score ($$)->set_header (scm_car ($1)); - $1 = scm_cdr ($1); - } - for (SCM p = scm_reverse_x ($1, SCM_EOL); - scm_is_pair (p); p = scm_cdr (p)) - { - unsmob_score ($$)-> - add_output_def (unsmob_output_def (scm_car (p))); - } - } - | embedded_scm_active { - if (!unsmob_score ($1)) - { - $$ = (new Score)->unprotect (); - parser->parser_error (@1, _("score expected")); - } +score_items: + /* empty */ + { + $$ = SCM_EOL; } - | score_body + | score_items score_item { - Score *score = unsmob_score ($1); - if (!ly_is_module (score->get_header ())) - score->set_header (ly_make_module (false)); - parser->lexer_->add_scope (score->get_header ()); - } lilypond_header - | score_body output_def { - Output_def *od = unsmob_output_def ($2); - if (od->lookup_variable (ly_symbol2scm ("is-paper")) == SCM_BOOL_T) - { - parser->parser_error (@2, _("\\paper cannot be used in \\score, use \\layout instead")); - + Output_def *od = unsmob ($2); + if (od) { + if (to_boolean (od->lookup_variable (ly_symbol2scm ("is-paper")))) + { + parser->parser_error (@2, _("\\paper cannot be used in \\score, use \\layout instead")); + od = 0; + $2 = SCM_UNSPECIFIED; + } + } else if (!unsmob ($$)) { + if (unsmob ($2)) { + $2 = Lily::scorify_music ($2); + } + if (unsmob ($2)) + { + $$ = $2; + $2 = SCM_UNSPECIFIED; + } } - else - { - unsmob_score ($1)->add_output_def (od); + Score *score = unsmob ($$); + if (score && scm_is_pair ($1)) { + if (ly_is_module (scm_car ($1))) + { + score->set_header (scm_car ($1)); + $1 = scm_cdr ($1); + } + for (SCM p = scm_reverse_x ($1, SCM_EOL); + scm_is_pair (p); p = scm_cdr (p)) + { + score->add_output_def (unsmob (scm_car (p))); + } } + if (od) { + if (score) + score->add_output_def (od); + else if (scm_is_pair ($$) && ly_is_module (scm_car ($$))) + scm_set_cdr_x ($$, scm_cons ($2, scm_cdr ($$))); + else + $$ = scm_cons ($2, $$); + } else if (ly_is_module ($2)) { + SCM module = SCM_UNSPECIFIED; + if (score) { + module = score->get_header (); + if (!ly_is_module (module)) + { + module = ly_make_module (false); + score->set_header (module); + } + } else if (scm_is_pair ($$) && ly_is_module (scm_car ($$))) + module = scm_car ($$); + else { + module = ly_make_module (false); + $$ = scm_cons (module, $$); + } + ly_module_copy (module, $2); + } else if (!scm_is_eq ($2, SCM_UNSPECIFIED)) + parser->parser_error (@2, _("Spurious expression in \\score")); } - | score_body error { - unsmob_score ($$)->error_found_ = true; + | score_items + { + if (Score *score = unsmob ($1)) { + if (!ly_is_module (score->get_header ())) + score->set_header (ly_make_module (false)); + parser->lexer_->add_scope (score->get_header ()); + } else { + if (!scm_is_pair ($1) || !ly_is_module (scm_car ($1))) + $1 = scm_cons (ly_make_module (false), $1); + parser->lexer_->add_scope (scm_car ($1)); + } + } lilypond_header + { + $$ = $1; } ; @@ -952,9 +1207,9 @@ score_body: paper_block: output_def { - Output_def *od = unsmob_output_def ($1); + Output_def *od = unsmob ($1); - if (od->lookup_variable (ly_symbol2scm ("is-paper")) != SCM_BOOL_T) + if (!to_boolean (od->lookup_variable (ly_symbol2scm ("is-paper")))) { parser->parser_error (@1, _ ("need \\paper for paper block")); $$ = get_paper (parser)->unprotect (); @@ -965,7 +1220,8 @@ paper_block: output_def: output_def_body '}' { - $$ = $1; + if (scm_is_pair ($1)) + $$ = scm_car ($1); parser->lexer_->remove_scope (); parser->lexer_->pop_state (); @@ -1005,44 +1261,74 @@ output_def_head_with_mode_switch: // is still time to escape from notes mode. music_or_context_def: - music_arg + music_assign | context_def_spec_block ; output_def_body: output_def_head_with_mode_switch '{' { - $$ = $1; - unsmob_output_def ($$)->input_origin_.set_spot (@$); - } - | output_def_head_with_mode_switch '{' OUTPUT_DEF_IDENTIFIER { - Output_def *o = unsmob_output_def ($3); - o->input_origin_.set_spot (@$); - $$ = o->self_scm (); - parser->lexer_->remove_scope (); - parser->lexer_->add_scope (o->scope_); + unsmob ($1)->input_origin_.set_spot (@$); + // This is a stupid trick to mark the beginning of the + // body for deciding whether to allow + // embedded_scm_active to have an output definition + $$ = scm_list_1 ($1); } | output_def_body assignment { - + if (scm_is_pair ($1)) + $$ = scm_car ($1); } - | output_def_body embedded_scm { - + | output_def_body embedded_scm_active + { + // We don't switch into note mode for Scheme functions + // here. Does not seem warranted/required in output + // definitions. + if (scm_is_pair ($1)) + { + Output_def *o = unsmob ($2); + if (o) { + o->input_origin_.set_spot (@$); + $1 = o->self_scm (); + parser->lexer_->remove_scope (); + parser->lexer_->add_scope (o->scope_); + $2 = SCM_UNSPECIFIED; + } else + $1 = scm_car ($1); + } + if (unsmob ($2)) + assign_context_def (unsmob ($1), $2); + // Seems unlikely, but let's be complete: + else if (unsmob ($2)) + { + SCM proc = parser->lexer_->lookup_identifier + ("output-def-music-handler"); + scm_call_2 (proc, $1, $2); + } else if (!scm_is_eq ($2, SCM_UNSPECIFIED)) + parser->parser_error (@2, _("bad expression type")); + $$ = $1; + } + | output_def_body SCM_TOKEN { + if (scm_is_pair ($1)) + $$ = scm_car ($1); + // Evaluate and ignore #xxx, as opposed to \xxx + parser->lexer_->eval_scm_token ($2, @2); } | output_def_body { - SCM nn = parser->lexer_->lookup_identifier ("pitchnames"); - parser->lexer_->push_note_state (nn); + if (scm_is_pair ($1)) + $1 = scm_car ($1); + parser->lexer_->push_note_state (Lily::pitchnames); } music_or_context_def { parser->lexer_->pop_state (); - if (unsmob_context_def ($3)) - assign_context_def (unsmob_output_def ($1), $3); + if (unsmob ($3)) + assign_context_def (unsmob ($1), $3); else { SCM proc = parser->lexer_->lookup_identifier ("output-def-music-handler"); - scm_call_3 (proc, parser->self_scm (), - $1, $3); + scm_call_2 (proc, $1, $3); } + $$ = $1; } | output_def_body error { @@ -1051,13 +1337,13 @@ output_def_body: tempo_event: TEMPO steno_duration '=' tempo_range { - $$ = MAKE_SYNTAX ("tempo", @$, SCM_EOL, $2, $4); + $$ = MAKE_SYNTAX (tempo, @$, SCM_EOL, $2, $4); } - | TEMPO scalar steno_duration '=' tempo_range { - $$ = MAKE_SYNTAX ("tempo", @$, $2, $3, $5); + | TEMPO text steno_duration '=' tempo_range { + $$ = MAKE_SYNTAX (tempo, @$, $2, $3, $5); } - | TEMPO scalar { - $$ = MAKE_SYNTAX ("tempo", @$, $2); + | TEMPO text { + $$ = MAKE_SYNTAX (tempo, @$, $2); } %prec ':' ; @@ -1069,7 +1355,7 @@ music_list: $$ = SCM_EOL; } | music_list music_embedded { - if (unsmob_music ($2)) + if (unsmob ($2)) $$ = scm_cons ($2, $1); } | music_list error { @@ -1088,16 +1374,29 @@ braced_music_list: } ; -music: music_arg +music: music_assign | lyric_element_music + | pitch_as_music ; -music_embedded: - music +pitch_as_music: + pitch_or_music { - if (unsmob_music ($1)->is_mus_type ("post-event")) { - parser->parser_error (@1, _ ("unexpected post-event")); - $$ = SCM_UNSPECIFIED; + $$ = make_music_from_simple (parser, @1, $1); + if (!unsmob ($$)) + { + parser->parser_error (@1, _ ("music expected")); + $$ = MAKE_SYNTAX (void_music, @$); + } + } + ; + +music_embedded: + music + { + if (unsmob ($1)->is_mus_type ("post-event")) { + parser->parser_error (@1, _ ("unexpected post-event")); + $$ = SCM_UNSPECIFIED; } } | music_embedded_backup @@ -1108,6 +1407,18 @@ music_embedded: { $$ = $3; } + | multiplied_duration post_events + { + Music *n = MY_MAKE_MUSIC ("NoteEvent", @$); + + parser->default_duration_ = *unsmob ($1); + n->set_property ("duration", $1); + + if (scm_is_pair ($2)) + n->set_property ("articulations", + scm_reverse_x ($2, SCM_EOL)); + $$ = n->unprotect (); + } ; music_embedded_backup: @@ -1115,7 +1426,7 @@ music_embedded_backup: { if (scm_is_eq ($1, SCM_UNSPECIFIED)) $$ = $1; - else if (Music *m = unsmob_music ($1)) { + else if (Music *m = unsmob ($1)) { if (m->is_mus_type ("post-event")) { parser->parser_error (@1, _ ("unexpected post-event")); @@ -1132,19 +1443,8 @@ music_embedded_backup: } ; -music_arg: - simple_music - { - $$ = make_music_from_simple (parser, @1, $1); - if (!unsmob_music ($$)) - { - parser->parser_error (@1, _ ("music expected")); - $$ = MAKE_SYNTAX ("void-music", @$); - } - } - | composite_music %prec COMPOSITE - ; - +// music_assign does not need to contain lyrics: there are no +// assignments in lyricmode. music_assign: simple_music | composite_music %prec COMPOSITE @@ -1153,39 +1453,29 @@ music_assign: repeated_music: REPEAT simple_string unsigned_number music { - $$ = MAKE_SYNTAX ("repeat", @$, $2, $3, $4, SCM_EOL); - } - | REPEAT_IDENTIFIER music - { - $$ = MAKE_SYNTAX ("repeat", @$, scm_car ($1), scm_cdr ($1), - $2, SCM_EOL); + $$ = MAKE_SYNTAX (repeat, @$, $2, $3, $4, SCM_EOL); } | REPEAT simple_string unsigned_number music ALTERNATIVE braced_music_list { - $$ = MAKE_SYNTAX ("repeat", @$, $2, $3, $4, $6); - } - | REPEAT_IDENTIFIER music ALTERNATIVE braced_music_list - { - $$ = MAKE_SYNTAX ("repeat", @$, scm_car ($1), scm_cdr ($1), - $2, $4); + $$ = MAKE_SYNTAX (repeat, @$, $2, $3, $4, $6); } ; sequential_music: SEQUENTIAL braced_music_list { - $$ = MAKE_SYNTAX ("sequential-music", @$, $2); + $$ = MAKE_SYNTAX (sequential_music, @$, $2); } | braced_music_list { - $$ = MAKE_SYNTAX ("sequential-music", @$, $1); + $$ = MAKE_SYNTAX (sequential_music, @$, $1); } ; simultaneous_music: SIMULTANEOUS braced_music_list { - $$ = MAKE_SYNTAX ("simultaneous-music", @$, $2); + $$ = MAKE_SYNTAX (simultaneous_music, @$, $2); } | DOUBLE_ANGLE_OPEN music_list DOUBLE_ANGLE_CLOSE { - $$ = MAKE_SYNTAX ("simultaneous-music", @$, scm_reverse_x ($2, SCM_EOL)); + $$ = MAKE_SYNTAX (simultaneous_music, @$, scm_reverse_x ($2, SCM_EOL)); } ; @@ -1198,8 +1488,7 @@ simple_music: context_modification: WITH { - SCM nn = parser->lexer_->lookup_identifier ("pitchnames"); - parser->lexer_->push_note_state (nn); + parser->lexer_->push_note_state (Lily::pitchnames); } '{' context_mod_list '}' { parser->lexer_->pop_state (); @@ -1215,11 +1504,11 @@ context_modification: } | WITH context_modification_arg { - if (unsmob_music ($2)) { + if (unsmob ($2)) { SCM proc = parser->lexer_->lookup_identifier ("context-mod-music-handler"); - $2 = scm_call_2 (proc, parser->self_scm (), $2); + $2 = scm_call_1 (proc, $2); } - if (unsmob_context_mod ($2)) + if (unsmob ($2)) $$ = $2; else { parser->parser_error (@2, _ ("not a context mod")); @@ -1229,52 +1518,151 @@ context_modification: ; context_modification_arg: - embedded_scm_closed + embedded_scm | MUSIC_IDENTIFIER ; -optional_context_mod: - /**/ { - $$ = SCM_EOL; - } - | context_modification +/* A list of single mods collected from a (possibly empty) sequence of + * context modifications, usually written as \with ... \with ... + */ + +optional_context_mods: + context_modification_mods_list { - $$ = $1; + if (scm_is_pair ($1)) + $$ = scm_append_x (scm_reverse_x ($1, SCM_EOL)); } ; +/* The worker for optional_context_mods conses a (reversed) list where + * each element contains the list of single context mods from one + * context modification block. Context_mod::get_mods creates fresh + * copies, so it's okay to use append! on them. + */ + +context_modification_mods_list: + /**/ { + $$ = SCM_EOL; + } + | context_modification_mods_list context_modification + { + if (Context_mod *m = unsmob ($2)) + $$ = scm_cons (m->get_mods (), $1); + } + ; + +/* A Context_mod is a container for a list of context mods like + * \consists ... \override ... . context_mod_list produces a + * Context_mod from the inside of a \with { ... } statement. + */ + context_mod_list: /**/ { $$ = Context_mod ().smobbed_copy (); } | context_mod_list context_mod { if (!SCM_UNBNDP ($2)) - unsmob_context_mod ($1)->add_context_mod ($2); + unsmob ($1)->add_context_mod ($2); } | context_mod_list CONTEXT_MOD_IDENTIFIER { - Context_mod *md = unsmob_context_mod ($2); + Context_mod *md = unsmob ($2); if (md) - unsmob_context_mod ($1)->add_context_mods (md->get_mods ()); + unsmob ($1)->add_context_mods (md->get_mods ()); } - | context_mod_list context_mod_embedded { - unsmob_context_mod ($1)->add_context_mods - (unsmob_context_mod ($2)->get_mods ()); + | context_mod_list context_mod_arg { + if (scm_is_eq ($2, SCM_UNSPECIFIED)) + ; + else if (unsmob ($2)) { + SCM proc = parser->lexer_->lookup_identifier ("context-mod-music-handler"); + $2 = scm_call_1 (proc, $2); + } + if (unsmob ($2)) + unsmob ($$)->add_context_mods + (unsmob ($2)->get_mods ()); + else { + parser->parser_error (@2, _ ("not a context mod")); + } } ; -composite_music: - complex_music +context_prefix: + CONTEXT symbol optional_id optional_context_mods { + $$ = START_MAKE_SYNTAX (context_specification, $2, $3, $4, SCM_BOOL_F); + } + | NEWCONTEXT symbol optional_id optional_context_mods { + $$ = START_MAKE_SYNTAX (context_specification, $2, $3, $4, SCM_BOOL_T); + } + ; + +new_lyrics: + ADDLYRICS optional_context_mods lyric_mode_music { + $$ = scm_acons ($3, $2, SCM_EOL); + } + | new_lyrics ADDLYRICS optional_context_mods lyric_mode_music { + $$ = scm_acons ($4, $3, $1); + } + ; + +/* basic_music is basically the same as composite_music but with + * context-prefixed music and lyricized music explicitly removed. The + * reason is that in a sequence + * + * \new Staff \new Voice { ... } \addlyrics { ... } \addlyrics { ... } + * + * we need to group both \addlyrics together (as they go with the same + * voice) but then combine them with \new Voice { ... }, meaning that + * combining \new Voice { ... } needs higher priority than + * { ... } \addlyrics, and *not* have \new Staff \new Voice { ... } + * combine before combining \new Voice { ... } \addlyrics: only one + * layer of context-prefixed music should assemble before \addlyrics + * is integrated. Total mess, and we sort this mess out with explicit + * rules preferring a single context-prefix. + */ + +basic_music: + music_function_call + | repeated_music | music_bare + | LYRICSTO simple_string lyric_mode_music { + $$ = MAKE_SYNTAX (lyric_combine, @$, $2, SCM_EOL, $3); + } + | LYRICSTO symbol '=' simple_string lyric_mode_music + { + $$ = MAKE_SYNTAX (lyric_combine, @$, $3, $2, $4); + } ; -/* Music that can be parsed without lookahead */ -closed_music: - music_bare - | complex_music_prefix closed_music +contextable_music: + basic_music + | pitch_as_music + | event_chord + ; + +contexted_basic_music: + context_prefix contextable_music new_lyrics + { + Input i; + i.set_location (@1, @2); + $$ = FINISH_MAKE_SYNTAX ($1, i, $2); + $$ = MAKE_SYNTAX (add_lyrics, @$, $$, scm_reverse_x ($3, SCM_EOL)); + } %prec COMPOSITE + | context_prefix contextable_music + { + $$ = FINISH_MAKE_SYNTAX ($1, @$, $2); + } %prec COMPOSITE + | context_prefix contexted_basic_music { $$ = FINISH_MAKE_SYNTAX ($1, @$, $2); } - | music_function_call_closed + ; + +composite_music: + basic_music %prec COMPOSITE + | contexted_basic_music + | basic_music new_lyrics + { + $$ = MAKE_SYNTAX (add_lyrics, @$, $1, scm_reverse_x ($2, SCM_EOL)); + } %prec COMPOSITE ; music_bare: @@ -1316,13 +1704,6 @@ grouped_music_list: * will match and whether or not \default will be appearing in the * argument list, and where. * - * Many of the basic nonterminals used for argument list scanning come - * in a "normal" and a "closed" flavor. A closed expression is one - * that can be parsed without a lookahead token. That makes it - * feasible for an optional argument that may need to be skipped: - * skipping can only be accomplished by pushing back the token into - * the lexer, and that only works when there is no lookahead token. - * * Sequences of 0 or more optional arguments are scanned using either * function_arglist_backup or function_arglist_nonbackup. The first * is used when optional arguments are followed by at least one @@ -1348,73 +1729,16 @@ grouped_music_list: * */ -function_arglist_nonbackup_common: - EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup post_event_nofinger - { - $$ = check_scheme_arg (parser, @4, $4, $3, $2); - } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup '-' UNSIGNED - { - SCM n = scm_difference ($5, SCM_UNDEFINED); - if (scm_is_true (scm_call_1 ($2, n))) - $$ = scm_cons (n, $3); - else { - Music *t = MY_MAKE_MUSIC ("FingeringEvent", @5); - t->set_property ("digit", $5); - $$ = check_scheme_arg (parser, @4, t->unprotect (), - $3, $2, n); - } - - } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup '-' REAL - { - $$ = check_scheme_arg (parser, @4, - scm_difference ($5, SCM_UNDEFINED), - $3, $2); - } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup '-' NUMBER_IDENTIFIER - { - $$ = check_scheme_arg (parser, @4, - scm_difference ($5, SCM_UNDEFINED), - $3, $2); - } - ; - -function_arglist_closed_nonbackup: - function_arglist_nonbackup_common - | function_arglist_closed_common - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup embedded_scm_arg_closed - { - $$ = check_scheme_arg (parser, @4, $4, $3, $2); - } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup bare_number_closed - { - $$ = check_scheme_arg (parser, @4, $4, $3, $2); - } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup SCM_IDENTIFIER - { - $$ = check_scheme_arg (parser, @4, - try_string_variants ($2, $4), - $3, $2, $4); - } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup STRING - { - $$ = check_scheme_arg (parser, @4, - try_string_variants ($2, $4), - $3, $2, $4); - } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup full_markup - { - $$ = check_scheme_arg (parser, @4, $4, $3, $2); - } - ; - symbol_list_arg: SYMBOL_LIST | SYMBOL_LIST '.' symbol_list_rev { $$ = scm_append (scm_list_2 ($1, scm_reverse_x ($3, SCM_EOL))); } + | SYMBOL_LIST ',' symbol_list_rev + { + $$ = scm_append (scm_list_2 ($1, scm_reverse_x ($3, SCM_EOL))); + } ; symbol_list_rev: @@ -1423,6 +1747,10 @@ symbol_list_rev: { $$ = scm_append_x (scm_list_2 ($3, $1)); } + | symbol_list_rev ',' symbol_list_part + { + $$ = scm_append_x (scm_list_2 ($3, $1)); + } ; // symbol_list_part delivers elements in reverse copy. @@ -1430,10 +1758,9 @@ symbol_list_rev: symbol_list_part: symbol_list_element { - SCM sym_l_p = ly_lily_module_constant ("symbol-list?"); - $$ = try_string_variants (sym_l_p, $1); + $$ = try_string_variants (Lily::key_list_p, $1); if (SCM_UNBNDP ($$)) { - parser->parser_error (@1, _("not a symbol")); + parser->parser_error (@1, _("not a key")); $$ = SCM_EOL; } else $$ = scm_reverse ($$); @@ -1444,12 +1771,55 @@ symbol_list_part: symbol_list_element: STRING | embedded_scm_bare + | UNSIGNED ; +symbol_list_part_bare: + STRING + { + $$ = try_string_variants (Lily::key_list_p, $1); + if (SCM_UNBNDP ($$)) { + parser->parser_error (@1, _("not a key")); + $$ = SCM_EOL; + } else + $$ = scm_reverse ($$); + } + | UNSIGNED + { + $$ = scm_list_1 ($1); + } + ; function_arglist_nonbackup: - function_arglist_nonbackup_common - | function_arglist_common + function_arglist_common + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup post_event_nofinger + { + $$ = check_scheme_arg (parser, @4, $4, $3, $2); + } + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup '-' UNSIGNED + { + SCM n = scm_difference ($5, SCM_UNDEFINED); + if (scm_is_true (scm_call_1 ($2, n))) + $$ = scm_cons (n, $3); + else { + Music *t = MY_MAKE_MUSIC ("FingeringEvent", @5); + t->set_property ("digit", $5); + $$ = check_scheme_arg (parser, @4, t->unprotect (), + $3, $2, n); + } + } + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup '-' REAL + { + $$ = check_scheme_arg (parser, @4, + scm_difference ($5, SCM_UNDEFINED), + $3, $2); + } + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup '-' NUMBER_IDENTIFIER + { + $$ = check_scheme_arg (parser, @4, + scm_difference ($5, SCM_UNDEFINED), + $3, $2); + } | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup embedded_scm_arg { if (scm_is_true (scm_call_1 ($2, $4))) @@ -1464,7 +1834,21 @@ function_arglist_nonbackup: { $$ = check_scheme_arg (parser, @4, $4, $3, $2); } - | function_arglist_nonbackup_reparse REPARSE duration_length + | function_arglist_nonbackup_reparse REPARSE pitch_or_music + { + if (scm_is_true (scm_call_1 ($2, $3))) + $$ = scm_cons ($3, $1); + else + $$ = check_scheme_arg (parser, @3, + make_music_from_simple + (parser, @3, $3), + $1, $2); + } + | function_arglist_nonbackup_reparse REPARSE multiplied_duration + { + $$ = check_scheme_arg (parser, @3, $3, $1, $2); + } + | function_arglist_nonbackup_reparse REPARSE reparsed_rhythm { $$ = check_scheme_arg (parser, @3, $3, $1, $2); } @@ -1486,6 +1870,20 @@ function_arglist_nonbackup: } ; + +reparsed_rhythm: + DURATION_ARG dots multipliers post_events + { + $$ = make_music_from_simple (parser, @$, + make_duration ($1, scm_to_int ($2), $3)); + Music *m = unsmob ($$); + assert (m); + if (scm_is_pair ($4)) + m->set_property ("articulations", + scm_reverse_x ($4, SCM_EOL)); + } %prec ':' + ; + function_arglist_nonbackup_reparse: EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup SCM_IDENTIFIER { @@ -1504,6 +1902,28 @@ function_arglist_nonbackup_reparse: else MYREPARSE (@4, $2, SCM_ARG, $4); } + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup pitch + { + $$ = $3; + if (scm_is_true + (scm_call_1 + ($2, make_music_from_simple + (parser, @4, $4)))) + MYREPARSE (@4, $2, PITCH_IDENTIFIER, $4); + else + MYREPARSE (@4, $2, SCM_ARG, $4); + } + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup steno_tonic_pitch + { + $$ = $3; + if (scm_is_true + (scm_call_1 + ($2, make_music_from_simple + (parser, @4, $4)))) + MYREPARSE (@4, $2, TONICNAME_PITCH, $4); + else + MYREPARSE (@4, $2, SCM_ARG, $4); + } | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup STRING { $$ = $3; @@ -1538,72 +1958,99 @@ function_arglist_nonbackup_reparse: { $$ = $3; if (scm_is_true (scm_call_1 ($2, $4))) + // May be 3 \cm or similar MYREPARSE (@4, $2, REAL, $4); + else if (scm_is_true (scm_call_1 ($2, scm_list_1 ($4)))) + MYREPARSE (@4, $2, SYMBOL_LIST, scm_list_1 ($4)); else { SCM d = make_duration ($4); - if (SCM_UNBNDP (d) || scm_is_false (scm_call_1 ($2, d))) - MYREPARSE (@4, $2, REAL, $4); // trigger error - else - MYREPARSE (@4, $2, DURATION_IDENTIFIER, d); + if (!SCM_UNBNDP (d)) { + if (scm_is_true (scm_call_1 ($2, d))) + MYREPARSE (@4, $2, DURATION_IDENTIFIER, d); + else if (scm_is_true + (scm_call_1 + ($2, make_music_from_simple (parser, @4, d)))) + MYREPARSE (@4, $2, DURATION_ARG, d); + else + MYREPARSE (@4, $2, SCM_ARG, $4); // trigger error + } else + MYREPARSE (@4, $2, SCM_ARG, $4); // trigger error } } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup DURATION_IDENTIFIER { + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup DURATION_IDENTIFIER + { $$ = $3; - MYREPARSE (@4, $2, DURATION_IDENTIFIER, $4); + if (scm_is_true (scm_call_1 ($2, $4))) + MYREPARSE (@4, $2, DURATION_IDENTIFIER, $4); + else if (scm_is_true + (scm_call_1 + ($2, make_music_from_simple (parser, @4, $4)))) + MYREPARSE (@4, $2, DURATION_ARG, $4); + else + MYREPARSE (@4, $2, SCM_ARG, $4); // trigger error } ; // function_arglist_backup can't occur at the end of an argument -// list. It needs to be careful about avoiding lookahead only until -// it has made a decision whether or not to accept the parsed entity. -// At that point of time, music requiring lookahead to parse becomes -// fine. +// list. function_arglist_backup: function_arglist_common - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup embedded_scm_arg_closed + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup embedded_scm_arg { if (scm_is_true (scm_call_1 ($2, $4))) - { $$ = scm_cons ($4, $3); - } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); - MYBACKUP (SCM_ARG, $4, @4); + else { + $$ = make_music_from_simple (parser, @4, $4); + if (scm_is_true (scm_call_1 ($2, $$))) + $$ = scm_cons ($$, $3); + else + { + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); + MYBACKUP (SCM_ARG, $4, @4); + } } } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup REPEAT simple_string unsigned_number + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup post_event_nofinger { - $4 = MAKE_SYNTAX ("repeat", @4, $5, $6, - MY_MAKE_MUSIC ("Music", @4)->unprotect (), - SCM_EOL); if (scm_is_true (scm_call_1 ($2, $4))) { - $$ = $3; - MYREPARSE (@4, $2, REPEAT_IDENTIFIER, scm_cons ($5, $6)); + $$ = scm_cons ($4, $3); } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); - MYBACKUP (REPEAT_IDENTIFIER, scm_cons ($5, $6), @4); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); + MYBACKUP (EVENT_IDENTIFIER, $4, @4); } } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup chord_body + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup pitch { - if (scm_is_true (scm_call_1 ($2, $4))) + if (scm_is_true + (scm_call_1 + ($2, make_music_from_simple + (parser, @4, $4)))) { $$ = $3; - MYREPARSE (@4, $2, CHORD_BODY_IDENTIFIER, $4); - } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); - MYBACKUP (CHORD_BODY_IDENTIFIER, $4, @4); + MYREPARSE (@4, $2, PITCH_IDENTIFIER, $4); + } else if (scm_is_true (scm_call_1 ($2, $4))) + $$ = scm_cons ($4, $3); + else { + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); + MYBACKUP (PITCH_IDENTIFIER, $4, @4); } } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup post_event_nofinger + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup steno_tonic_pitch { - if (scm_is_true (scm_call_1 ($2, $4))) + if (scm_is_true + (scm_call_1 + ($2, make_music_from_simple + (parser, @4, $4)))) { + $$ = $3; + MYREPARSE (@4, $2, TONICNAME_PITCH, $4); + } else if (scm_is_true (scm_call_1 ($2, $4))) $$ = scm_cons ($4, $3); - } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); - MYBACKUP (EVENT_IDENTIFIER, $4, @4); + else { + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); + MYBACKUP (TONICNAME_PITCH, $4, @4); } } | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup full_markup @@ -1611,25 +2058,34 @@ function_arglist_backup: if (scm_is_true (scm_call_1 ($2, $4))) $$ = scm_cons ($4, $3); else { - $$ = scm_cons (loc_on_music (@3, $1), $3); - MYBACKUP (LYRIC_ELEMENT, $4, @4); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); + MYBACKUP (SCM_IDENTIFIER, $4, @4); } } | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup UNSIGNED { + $$ = $3; if (scm_is_true (scm_call_1 ($2, $4))) - { + // May be 3 \cm or similar MYREPARSE (@4, $2, REAL, $4); - $$ = $3; - } else { + else if (scm_is_true (scm_call_1 ($2, scm_list_1 ($4)))) + MYREPARSE (@4, $2, SYMBOL_LIST, scm_list_1 ($4)); + else { SCM d = make_duration ($4); - if (SCM_UNBNDP (d) || scm_is_false (scm_call_1 ($2, d))) - { - $$ = scm_cons (loc_on_music (@3, $1), $3); - MYBACKUP (UNSIGNED, $4, @4); + if (!SCM_UNBNDP (d)) { + if (scm_is_true (scm_call_1 ($2, d))) + MYREPARSE (@4, $2, DURATION_IDENTIFIER, d); + else if (scm_is_true + (scm_call_1 + ($2, make_music_from_simple (parser, @4, d)))) + MYREPARSE (@4, $2, DURATION_ARG, d); + else { + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); + MYBACKUP (UNSIGNED, $4, @4); + } } else { - MYREPARSE (@4, $2, DURATION_IDENTIFIER, d); - $$ = $3; + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); + MYBACKUP (UNSIGNED, $4, @4); } } } @@ -1640,7 +2096,7 @@ function_arglist_backup: $$ = $3; MYREPARSE (@4, $2, REAL, $4); } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); MYBACKUP (REAL, $4, @4); } } @@ -1650,7 +2106,7 @@ function_arglist_backup: { $$ = scm_cons ($4, $3); } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); MYBACKUP (NUMBER_IDENTIFIER, $4, @4); } } @@ -1667,12 +2123,11 @@ function_arglist_backup: if (scm_is_true (scm_call_1 ($2, $$))) $$ = scm_cons ($$, $3); else { - $$ = scm_cons (loc_on_music (@3, $1), $3); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); MYBACKUP (UNSIGNED, $5, @5); - parser->lexer_->push_extra_token ('-'); + parser->lexer_->push_extra_token (@4, '-'); } } - } | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup '-' REAL { @@ -1681,7 +2136,7 @@ function_arglist_backup: MYREPARSE (@5, $2, REAL, n); $$ = $3; } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); MYBACKUP (REAL, n, @5); } } @@ -1691,66 +2146,21 @@ function_arglist_backup: if (scm_is_true (scm_call_1 ($2, n))) { $$ = scm_cons (n, $3); } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); MYBACKUP (NUMBER_IDENTIFIER, n, @5); } } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup PITCH_IDENTIFIER - { - SCM m = make_music_from_simple (parser, @4, $4); - if (unsmob_music (m) && scm_is_true (scm_call_1 ($2, m))) - { - MYREPARSE (@4, $2, PITCH_IDENTIFIER, $4); - $$ = $3; - } else if (scm_is_true (scm_call_1 ($2, $4))) - { - MYREPARSE (@4, $2, PITCH_ARG, $4); - $$ = $3; - } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); - MYBACKUP (PITCH_IDENTIFIER, $4, @4); - } - } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup NOTENAME_PITCH - { - SCM m = make_music_from_simple (parser, @4, $4); - if (unsmob_music (m) && scm_is_true (scm_call_1 ($2, m))) - { - MYREPARSE (@4, $2, NOTENAME_PITCH, $4); - $$ = $3; - } else if (scm_is_true (scm_call_1 ($2, $4))) - { - MYREPARSE (@4, $2, PITCH_ARG, $4); - $$ = $3; - } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); - MYBACKUP (NOTENAME_PITCH, $4, @4); - } - } - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup TONICNAME_PITCH - { - SCM m = make_music_from_simple (parser, @4, $4); - if (unsmob_music (m) && scm_is_true (scm_call_1 ($2, m))) - { - MYREPARSE (@4, $2, TONICNAME_PITCH, $4); - $$ = $3; - } else if (scm_is_true (scm_call_1 ($2, $4))) - { - MYREPARSE (@4, $2, PITCH_ARG, $4); - $$ = $3; - } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); - MYBACKUP (TONICNAME_PITCH, $4, @4); - } - } | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup DURATION_IDENTIFIER { + $$ = $3; if (scm_is_true (scm_call_1 ($2, $4))) - { MYREPARSE (@4, $2, DURATION_IDENTIFIER, $4); - $$ = $3; - } else { - $$ = scm_cons (loc_on_music (@3, $1), $3); + else if (scm_is_true + (scm_call_1 + ($2, make_music_from_simple (parser, @4, $4)))) + MYREPARSE (@4, $2, DURATION_ARG, $4); + else { + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); MYBACKUP (DURATION_IDENTIFIER, $4, @4); } } @@ -1765,7 +2175,7 @@ function_arglist_backup: else $$ = scm_cons (res, $3); else { - $$ = scm_cons (loc_on_music (@3, $1), $3); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); MYBACKUP (SCM_IDENTIFIER, $4, @4); } } @@ -1780,11 +2190,11 @@ function_arglist_backup: else $$ = scm_cons (res, $3); else { - $$ = scm_cons (loc_on_music (@3, $1), $3); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); MYBACKUP (STRING, $4, @4); } } - | function_arglist_backup REPARSE music_assign + | function_arglist_backup REPARSE pitch_or_music { if (scm_is_true (scm_call_1 ($2, $3))) $$ = scm_cons ($3, $1); @@ -1794,17 +2204,17 @@ function_arglist_backup: (parser, @3, $3), $1, $2); } - | function_arglist_backup REPARSE pitch_arg + | function_arglist_backup REPARSE bare_number_common { $$ = check_scheme_arg (parser, @3, $3, $1, $2); - } - | function_arglist_backup REPARSE bare_number_common + } + | function_arglist_backup REPARSE multiplied_duration { $$ = check_scheme_arg (parser, @3, $3, $1, $2); } - | function_arglist_backup REPARSE duration_length + | function_arglist_backup REPARSE reparsed_rhythm { $$ = check_scheme_arg (parser, @3, $3, $1, $2); @@ -1819,7 +2229,7 @@ function_arglist: function_arglist_nonbackup | EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_nonbackup DEFAULT { - $$ = scm_cons (loc_on_music (@4, $1), $3); + $$ = scm_cons (loc_on_music (parser, @4, $1), $3); } ; @@ -1827,7 +2237,57 @@ function_arglist_skip_nonbackup: function_arglist_nonbackup | EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_nonbackup { - $$ = scm_cons (loc_on_music (@3, $1), $3); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); + } + ; + +// Partial function arglists are returned just in their incomplete +// state: when combined with the music function, the missing parts of +// the signature can be reconstructed +// +// To serve as a partial arglist, the argument list must absolutely +// _not_ be in "skipping optional arguments" mode since then there is +// some backup token that has nowhere to go before \etc. +// +// So we can skim off an arbitrary number of arguments from the end of +// the argument list. The argument list remaining afterwards has to +// be in not-skipping-optional-arguments mode. + +function_arglist_partial: + EXPECT_SCM function_arglist_optional + { + $$ = $2; + } + | EXPECT_SCM function_arglist_partial_optional + { + $$ = $2; + } + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup + { + $$ = $3; + } + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_partial + { + $$ = $3; + } + ; + +function_arglist_partial_optional: + EXPECT_SCM function_arglist_optional + { + $$ = $2; + } + | EXPECT_SCM function_arglist_partial_optional + { + $$ = $2; + } + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup + { + $$ = $3; + } + | EXPECT_OPTIONAL EXPECT_SCM function_arglist_partial_optional + { + $$ = $3; } ; @@ -1870,12 +2330,27 @@ function_arglist_common: $$ = check_scheme_arg (parser, @3, $3, $1, $2); } + | function_arglist_common_reparse REPARSE pitch_or_music + { + if (scm_is_true (scm_call_1 ($2, $3))) + $$ = scm_cons ($3, $1); + else + $$ = check_scheme_arg (parser, @3, + make_music_from_simple + (parser, @3, $3), + $1, $2); + } | function_arglist_common_reparse REPARSE bare_number_common { $$ = check_scheme_arg (parser, @3, $3, $1, $2); } - | function_arglist_common_reparse REPARSE duration_length + | function_arglist_common_reparse REPARSE multiplied_duration + { + $$ = check_scheme_arg (parser, @3, + $3, $1, $2); + } + | function_arglist_common_reparse REPARSE reparsed_rhythm { $$ = check_scheme_arg (parser, @3, $3, $1, $2); @@ -1905,6 +2380,28 @@ function_arglist_common_reparse: // know the predicate to be false. MYREPARSE (@3, $1, SCM_ARG, $3); } + | EXPECT_SCM function_arglist_optional pitch + { + $$ = $2; + if (scm_is_true + (scm_call_1 + ($1, make_music_from_simple + (parser, @3, $3)))) + MYREPARSE (@3, $1, PITCH_IDENTIFIER, $3); + else + MYREPARSE (@3, $1, SCM_ARG, $3); + } + | EXPECT_SCM function_arglist_optional steno_tonic_pitch + { + $$ = $2; + if (scm_is_true + (scm_call_1 + ($1, make_music_from_simple + (parser, @3, $3)))) + MYREPARSE (@3, $1, TONICNAME_PITCH, $3); + else + MYREPARSE (@3, $1, SCM_ARG, $3); + } | EXPECT_SCM function_arglist_optional STRING { $$ = $2; @@ -1941,19 +2438,36 @@ function_arglist_common_reparse: { $$ = $2; if (scm_is_true (scm_call_1 ($1, $3))) + // May be 3 \cm or similar MYREPARSE (@3, $1, REAL, $3); + else if (scm_is_true (scm_call_1 ($1, scm_list_1 ($3)))) + MYREPARSE (@3, $1, SYMBOL_LIST, scm_list_1 ($3)); else { SCM d = make_duration ($3); - if (SCM_UNBNDP (d) || scm_is_false (scm_call_1 ($1, d))) - MYREPARSE (@3, $1, REAL, $3); - else - MYREPARSE (@3, $1, DURATION_IDENTIFIER, d); + if (!SCM_UNBNDP (d)) { + if (scm_is_true (scm_call_1 ($1, d))) + MYREPARSE (@3, $1, DURATION_IDENTIFIER, d); + else if (scm_is_true + (scm_call_1 + ($1, make_music_from_simple (parser, @3, d)))) + MYREPARSE (@3, $1, DURATION_ARG, d); + else + MYREPARSE (@3, $1, SCM_ARG, $3); // trigger error + } else + MYREPARSE (@3, $1, SCM_ARG, $3); // trigger error } } | EXPECT_SCM function_arglist_optional DURATION_IDENTIFIER { $$ = $2; - MYREPARSE (@3, $1, DURATION_IDENTIFIER, $3); + if (scm_is_true (scm_call_1 ($1, $3))) + MYREPARSE (@3, $1, DURATION_IDENTIFIER, $3); + else if (scm_is_true + (scm_call_1 + ($1, make_music_from_simple (parser, @3, $3)))) + MYREPARSE (@3, $1, DURATION_ARG, $3); + else + MYREPARSE (@3, $1, SCM_ARG, $3); // trigger error } | EXPECT_SCM function_arglist_optional '-' UNSIGNED { @@ -1970,7 +2484,6 @@ function_arglist_common_reparse: else MYREPARSE (@4, $1, SCM_ARG, $4); } - } | EXPECT_SCM function_arglist_optional '-' REAL { @@ -1980,60 +2493,11 @@ function_arglist_common_reparse: } ; -function_arglist_closed: - function_arglist_closed_nonbackup - | EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_nonbackup DEFAULT - { - $$ = scm_cons (loc_on_music (@4, $1), $3); - } - ; - -function_arglist_closed_common: - EXPECT_NO_MORE_ARGS { - $$ = SCM_EOL; - } - | EXPECT_SCM function_arglist_optional embedded_scm_arg_closed - { - $$ = check_scheme_arg (parser, @3, - $3, $2, $1); - } - | EXPECT_SCM function_arglist_optional bare_number_common_closed - { - $$ = check_scheme_arg (parser, @3, - $3, $2, $1); - } - | EXPECT_SCM function_arglist_optional '-' NUMBER_IDENTIFIER - { - $$ = check_scheme_arg (parser, @3, - scm_difference ($4, SCM_UNDEFINED), - $2, $1); - } - | EXPECT_SCM function_arglist_optional post_event_nofinger - { - $$ = check_scheme_arg (parser, @3, - $3, $2, $1); - } - | function_arglist_common_reparse REPARSE SCM_ARG - { - $$ = check_scheme_arg (parser, @3, - $3, $1, $2); - } - | function_arglist_common_reparse REPARSE bare_number_common_closed - { - $$ = check_scheme_arg (parser, @3, - $3, $1, $2); - } - | function_arglist_common_reparse REPARSE symbol_list_arg - { - $$ = check_scheme_arg (parser, @3, $3, $1, $2); - } - ; - function_arglist_optional: function_arglist_backup | EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_backup DEFAULT { - $$ = scm_cons (loc_on_music (@4, $1), $3); + $$ = scm_cons (loc_on_music (parser, @4, $1), $3); } | function_arglist_skip_backup BACKUP ; @@ -2042,75 +2506,47 @@ function_arglist_skip_backup: function_arglist_backup | EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_backup { - $$ = scm_cons (loc_on_music (@3, $1), $3); - } - ; - -embedded_scm_closed: - embedded_scm_bare - | scm_function_call_closed - ; - -embedded_scm_arg_closed: - embedded_scm_bare_arg - | scm_function_call_closed - | closed_music - ; - -scm_function_call_closed: - SCM_FUNCTION function_arglist_closed { - $$ = MAKE_SYNTAX ("music-function", @$, - $1, $2); + $$ = scm_cons (loc_on_music (parser, @3, $1), $3); } ; music_function_call: MUSIC_FUNCTION function_arglist { - $$ = MAKE_SYNTAX ("music-function", @$, - $1, $2); + $$ = MAKE_SYNTAX (music_function, @$, + $1, $2); } ; optional_id: /**/ { $$ = SCM_EOL; } - | '=' simple_string { - $$ = $2; - } - ; - -complex_music: - music_function_call - | repeated_music { $$ = $1; } - | re_rhythmed_music { $$ = $1; } - | complex_music_prefix music - { - $$ = FINISH_MAKE_SYNTAX ($1, @$, $2); + | '=' simple_string { + $$ = $2; } ; -complex_music_prefix: - CONTEXT symbol optional_id optional_context_mod { - Context_mod *ctxmod = unsmob_context_mod ($4); - SCM mods = SCM_EOL; - if (ctxmod) - mods = ctxmod->get_mods (); - $$ = START_MAKE_SYNTAX ("context-specification", $2, $3, mods, SCM_BOOL_F); - } - | NEWCONTEXT symbol optional_id optional_context_mod { - Context_mod *ctxmod = unsmob_context_mod ($4); - SCM mods = SCM_EOL; - if (ctxmod) - mods = ctxmod->get_mods (); - $$ = START_MAKE_SYNTAX ("context-specification", $2, $3, mods, SCM_BOOL_T); +// We must not have lookahead tokens parsed in lyric mode. In order +// to save confusion, we take almost the same set as permitted with +// \lyricmode and/or \lyrics. However, music identifiers are also +// allowed, and they obviously do not require switching into lyrics +// mode for parsing. + +lyric_mode_music: + { + parser->lexer_->push_lyric_state (); + } grouped_music_list + { + parser->lexer_->pop_state (); + $$ = $2; } + | MUSIC_IDENTIFIER ; mode_changed_music: mode_changing_head grouped_music_list { - if ($1 == ly_symbol2scm ("chords")) + if (scm_is_eq ($1, ly_symbol2scm ("chords"))) { - $$ = MAKE_SYNTAX ("unrelativable-music", @$, $2); + $$ = MAKE_SYNTAX (unrelativable_music, @$, $2); } else { @@ -2118,15 +2554,11 @@ mode_changed_music: } parser->lexer_->pop_state (); } - | mode_changing_head_with_context optional_context_mod grouped_music_list { - Context_mod *ctxmod = unsmob_context_mod ($2); - SCM mods = SCM_EOL; - if (ctxmod) - mods = ctxmod->get_mods (); - $$ = MAKE_SYNTAX ("context-specification", @$, $1, SCM_EOL, mods, SCM_BOOL_T, $3); - if ($1 == ly_symbol2scm ("ChordNames")) + | mode_changing_head_with_context optional_context_mods grouped_music_list { + $$ = MAKE_SYNTAX (context_specification, @$, $1, SCM_EOL, $2, SCM_BOOL_T, $3); + if (scm_is_eq ($1, ly_symbol2scm ("ChordNames"))) { - $$ = MAKE_SYNTAX ("unrelativable-music", @$, $$); + $$ = MAKE_SYNTAX (unrelativable_music, @$, $$); } parser->lexer_->pop_state (); } @@ -2134,15 +2566,13 @@ mode_changed_music: mode_changing_head: NOTEMODE { - SCM nn = parser->lexer_->lookup_identifier ("pitchnames"); - parser->lexer_->push_note_state (nn); + parser->lexer_->push_note_state (Lily::pitchnames); $$ = ly_symbol2scm ("notes"); } | DRUMMODE { - SCM nn = parser->lexer_->lookup_identifier ("drumPitchNames"); - parser->lexer_->push_note_state (nn); + parser->lexer_->push_note_state (Lily::drum_pitch_names); $$ = ly_symbol2scm ("drums"); } @@ -2152,10 +2582,9 @@ mode_changing_head: $$ = ly_symbol2scm ("figures"); } | CHORDMODE { - SCM nn = parser->lexer_->lookup_identifier ("chordmodifiers"); - parser->lexer_->chordmodifier_tab_ = alist_to_hashq (nn); - nn = parser->lexer_->lookup_identifier ("pitchnames"); - parser->lexer_->push_chord_state (nn); + parser->lexer_->chordmodifier_tab_ = + alist_to_hashq (Lily::chordmodifiers); + parser->lexer_->push_chord_state (Lily::pitchnames); $$ = ly_symbol2scm ("chords"); } @@ -2167,8 +2596,7 @@ mode_changing_head: mode_changing_head_with_context: DRUMS { - SCM nn = parser->lexer_->lookup_identifier ("drumPitchNames"); - parser->lexer_->push_note_state (nn); + parser->lexer_->push_note_state (Lily::drum_pitch_names); $$ = ly_symbol2scm ("DrumStaff"); } @@ -2178,10 +2606,9 @@ mode_changing_head_with_context: $$ = ly_symbol2scm ("FiguredBass"); } | CHORDS { - SCM nn = parser->lexer_->lookup_identifier ("chordmodifiers"); - parser->lexer_->chordmodifier_tab_ = alist_to_hashq (nn); - nn = parser->lexer_->lookup_identifier ("pitchnames"); - parser->lexer_->push_chord_state (nn); + parser->lexer_->chordmodifier_tab_ = + alist_to_hashq (Lily::chordmodifiers); + parser->lexer_->push_chord_state (Lily::pitchnames); $$ = ly_symbol2scm ("ChordNames"); } | LYRICS @@ -2190,39 +2617,9 @@ mode_changing_head_with_context: } ; -new_lyrics: - ADDLYRICS { parser->lexer_->push_lyric_state (); } - /*cont */ - composite_music { - /* Can also use music at the expensive of two S/Rs similar to - \repeat \alternative */ - parser->lexer_->pop_state (); - - $$ = scm_cons ($3, SCM_EOL); - } - | new_lyrics ADDLYRICS { - parser->lexer_->push_lyric_state (); - } composite_music { - parser->lexer_->pop_state (); - $$ = scm_cons ($4, $1); - } - ; - -re_rhythmed_music: - composite_music new_lyrics { - $$ = MAKE_SYNTAX ("add-lyrics", @$, $1, scm_reverse_x ($2, SCM_EOL)); - } %prec COMPOSITE - | LYRICSTO simple_string { - parser->lexer_->push_lyric_state (); - } music { - parser->lexer_->pop_state (); - $$ = MAKE_SYNTAX ("lyric-combine", @$, $2, $4); - } - ; - context_change: CHANGE symbol '=' simple_string { - $$ = MAKE_SYNTAX ("context-change", @$, $2, $4); + $$ = MAKE_SYNTAX (context_change, @$, $2, $4); } ; @@ -2231,9 +2628,6 @@ property_path: symbol_list_rev { $$ = scm_reverse_x ($1, SCM_EOL); } - | symbol_list_rev property_path { - $$ = scm_reverse_x ($1, $2); - } ; property_operation: @@ -2243,7 +2637,7 @@ property_operation: | UNSET symbol { $$ = scm_list_2 (ly_symbol2scm ("unset"), $2); } - | OVERRIDE property_path '=' scalar { + | OVERRIDE revert_arg '=' scalar { if (scm_ilength ($2) < 2) { parser->parser_error (@2, _("bad grob property path")); $$ = SCM_UNDEFINED; @@ -2307,10 +2701,14 @@ revert_arg_part: { $$ = scm_append_x (scm_list_2 ($5, $3)); } + | revert_arg_backup BACKUP SCM_ARG ',' symbol_list_part + { + $$ = scm_append_x (scm_list_2 ($5, $3)); + } | revert_arg_backup BACKUP SCM_ARG symbol_list_part { $$ = scm_append_x (scm_list_2 ($4, $3)); - } + } ; context_def_mod: @@ -2407,43 +2805,6 @@ context_prop_spec: } ; -simple_music_property_def: - OVERRIDE grob_prop_path '=' scalar { - if (SCM_UNBNDP ($2)) - $$ = SCM_UNDEFINED; - else { - $$ = scm_list_5 (scm_car ($2), - ly_symbol2scm ("OverrideProperty"), - scm_cadr ($2), - $4, - scm_cddr ($2)); - } - } - | REVERT simple_revert_context revert_arg { - $$ = scm_list_4 ($2, - ly_symbol2scm ("RevertProperty"), - scm_car ($3), - scm_cdr ($3)); - } - | SET context_prop_spec '=' scalar { - if (SCM_UNBNDP ($2)) - $$ = SCM_UNDEFINED; - else - $$ = scm_list_4 (scm_car ($2), - ly_symbol2scm ("PropertySet"), - scm_cadr ($2), - $4); - } - | UNSET context_prop_spec { - if (SCM_UNBNDP ($2)) - $$ = SCM_UNDEFINED; - else - $$ = scm_list_3 (scm_car ($2), - ly_symbol2scm ("PropertyUnset"), - scm_cadr ($2)); - } - ; - // This is all quite awkward for the sake of substantial backward // compatibility while at the same time allowing a more "natural" form @@ -2468,34 +2829,67 @@ simple_revert_context: (scm_object_property (scm_car ($1), ly_symbol2scm ("is-grob?")))) { $$ = ly_symbol2scm ("Bottom"); - parser->lexer_->push_extra_token (SCM_IDENTIFIER, $1); + parser->lexer_->push_extra_token (@1, SCM_IDENTIFIER, $1); } else { $$ = scm_car ($1); - parser->lexer_->push_extra_token (SCM_IDENTIFIER, + parser->lexer_->push_extra_token (@1, SCM_IDENTIFIER, scm_cdr ($1)); } } ; music_property_def: - simple_music_property_def { - if (SCM_UNBNDP ($1)) - $$ = MAKE_SYNTAX ("void-music", @1); + OVERRIDE grob_prop_path '=' scalar { + if (SCM_UNBNDP ($2)) + $$ = MAKE_SYNTAX (void_music, @$); + else + $$ = MAKE_SYNTAX (property_override, @$, + scm_car ($2), + scm_cdr ($2), + $4); + } + | REVERT simple_revert_context revert_arg { + $$ = MAKE_SYNTAX (property_revert, @$, $2, $3); + } + | SET context_prop_spec '=' scalar { + if (SCM_UNBNDP ($2)) + $$ = MAKE_SYNTAX (void_music, @$); + else + $$ = MAKE_SYNTAX (property_set, @$, + scm_car ($2), + scm_cadr ($2), + $4); + } + | UNSET context_prop_spec { + if (SCM_UNBNDP ($2)) + $$ = MAKE_SYNTAX (void_music, @$); else - $$ = LOWLEVEL_MAKE_SYNTAX (ly_lily_module_constant ("property-operation"), scm_cons2 (parser->self_scm (), make_input (@$), $1)); + $$ = MAKE_SYNTAX (property_unset, @$, + scm_car ($2), + scm_cadr ($2)); } ; string: - STRING { - $$ = $1; - } + STRING | full_markup ; -simple_string: STRING { - $$ = $1; +text: + STRING + | full_markup + | embedded_scm_bare + { + if (Text_interface::is_markup ($1)) { + $$ = $1; + } else { + parser->parser_error (@1, (_ ("markup expected"))); + $$ = scm_string (SCM_EOL); + } } + ; + +simple_string: STRING | embedded_scm_bare { if (scm_is_string ($1)) { @@ -2515,8 +2909,7 @@ symbol: { // This is a bit of overkill but makes the same // routine responsible for all symbol interpretations. - $$ = try_string_variants (ly_lily_module_constant ("symbol?"), - $1); + $$ = try_string_variants (Guile_user::symbol_p, $1); if (SCM_UNBNDP ($$)) { parser->parser_error (@1, (_ ("symbol expected"))); @@ -2529,6 +2922,7 @@ symbol: scalar: embedded_scm_arg + | pitch_or_music | SCM_IDENTIFIER | bare_number // The following is a rather defensive variant of admitting @@ -2542,53 +2936,38 @@ scalar: { $$ = scm_difference ($2, SCM_UNDEFINED); } - | STRING - | full_markup + | string + | symbol_list_part_bare '.' property_path + { + $$ = scm_reverse_x ($1, $3); + } + | symbol_list_part_bare ',' property_path + { + $$ = scm_reverse_x ($1, $3); + } ; event_chord: simple_element post_events { // Let the rhythmic music iterator sort this mess out. if (scm_is_pair ($2)) { - $$ = make_music_from_simple (parser, @1, $1); - if (unsmob_music ($$)) - unsmob_music ($$)->set_property ("articulations", - scm_reverse_x ($2, SCM_EOL)); - else - { - parser->parser_error (@1, _("music expected")); - $$ = MAKE_SYNTAX ("void-music", @1); - } + unsmob ($$)->set_property ("articulations", + scm_reverse_x ($2, SCM_EOL)); } } %prec ':' - | simple_chord_elements post_events { - if (scm_is_pair ($2)) { - if (unsmob_pitch ($1)) - $1 = make_chord_elements (@1, - $1, - parser->default_duration_.smobbed_copy (), - SCM_EOL); - - SCM elts = ly_append2 ($1, scm_reverse_x ($2, SCM_EOL)); - - $$ = MAKE_SYNTAX ("event-chord", @1, elts); - } else if (!unsmob_pitch ($1)) - $$ = MAKE_SYNTAX ("event-chord", @1, $1); - // A mere pitch drops through. - } %prec ':' | CHORD_REPETITION optional_notemode_duration post_events { Input i; i.set_location (@1, @3); - $$ = MAKE_SYNTAX ("repetition-chord", i, + $$ = MAKE_SYNTAX (repetition_chord, i, $2, scm_reverse_x ($3, SCM_EOL)); } %prec ':' | MULTI_MEASURE_REST optional_notemode_duration post_events { Input i; i.set_location (@1, @3); - $$ = MAKE_SYNTAX ("multi-measure-rest", i, $2, + $$ = MAKE_SYNTAX (multi_measure_rest, i, $2, scm_reverse_x ($3, SCM_EOL)); } %prec ':' - | command_element + | tempo_event | note_chord_element ; @@ -2596,17 +2975,17 @@ event_chord: note_chord_element: chord_body optional_notemode_duration post_events { - Music *m = unsmob_music ($1); - SCM dur = unsmob_duration ($2)->smobbed_copy (); + Music *m = unsmob ($1); + SCM dur = unsmob ($2)->smobbed_copy (); SCM es = m->get_property ("elements"); SCM postevs = scm_reverse_x ($3, SCM_EOL); for (SCM s = es; scm_is_pair (s); s = scm_cdr (s)) - unsmob_music (scm_car (s))->set_property ("duration", dur); + unsmob (scm_car (s))->set_property ("duration", dur); es = ly_append2 (es, postevs); - m-> set_property ("elements", es); - m->set_spot (@$); + m->set_property ("elements", es); + m->set_spot (parser->lexer_->override_input (@$)); $$ = m->self_scm (); } %prec ':' ; @@ -2614,9 +2993,12 @@ note_chord_element: chord_body: ANGLE_OPEN chord_body_elements ANGLE_CLOSE { - $$ = MAKE_SYNTAX ("event-chord", @$, scm_reverse_x ($2, SCM_EOL)); + $$ = MAKE_SYNTAX (event_chord, @$, scm_reverse_x ($2, SCM_EOL)); + } + | FIGURE_OPEN figure_list FIGURE_CLOSE + { + $$ = MAKE_SYNTAX (event_chord, @$, scm_reverse_x ($2, SCM_EOL)); } - | CHORD_BODY_IDENTIFIER ; chord_body_elements: @@ -2628,7 +3010,7 @@ chord_body_elements: ; chord_body_element: - pitch exclamations questions octave_check post_events + pitch_or_tonic_pitch exclamations questions octave_check post_events { bool q = to_boolean ($3); bool ex = to_boolean ($2); @@ -2666,11 +3048,11 @@ chord_body_element: } | music_function_chord_body { - Music *m = unsmob_music ($1); + Music *m = unsmob ($1); while (m && m->is_mus_type ("music-wrapper-music")) { $$ = m->get_property ("element"); - m = unsmob_music ($$); + m = unsmob ($$); } if (!(m && m->is_mus_type ("rhythmic-event"))) { @@ -2686,45 +3068,20 @@ music_function_chord_body: | embedded_scm ; -// Event functions may only take closed arglists, otherwise it would -// not be clear whether a following postevent should be associated -// with the last argument of the event function or with the expression -// for which the function call acts itself as event. - -music_function_call_closed: - MUSIC_FUNCTION function_arglist_closed { - $$ = MAKE_SYNTAX ("music-function", @$, - $1, $2); - } - ; - event_function_event: - EVENT_FUNCTION function_arglist_closed { - $$ = MAKE_SYNTAX ("music-function", @$, - $1, $2); - } - ; - -command_element: - command_event { - $$ = $1; - } - ; - -command_event: - tempo_event { - $$ = $1; + EVENT_FUNCTION function_arglist { + $$ = MAKE_SYNTAX (music_function, @$, + $1, $2); } ; - post_events: /* empty */ { $$ = SCM_EOL; } | post_events post_event { $$ = $1; - if (Music *m = unsmob_music ($2)) + if (Music *m = unsmob ($2)) { if (m->is_mus_type ("post-event-wrapper")) { @@ -2735,7 +3092,7 @@ post_events: $$ = scm_cons (scm_car (p), $$); } } else { - m->set_spot (@2); + m->set_spot (parser->lexer_->override_input (@2)); $$ = scm_cons ($2, $$); } } @@ -2746,14 +3103,14 @@ post_event_nofinger: direction_less_event { $$ = $1; } - | script_dir music_function_call_closed { + | script_dir music_function_call { $$ = $2; - if (!unsmob_music ($2)->is_mus_type ("post-event")) { + if (!unsmob ($2)->is_mus_type ("post-event")) { parser->parser_error (@2, _ ("post-event expected")); $$ = SCM_UNSPECIFIED; } else if (!SCM_UNBNDP ($1)) { - unsmob_music ($$)->set_property ("direction", $1); + unsmob ($$)->set_property ("direction", $1); } } | HYPHEN { @@ -2769,7 +3126,7 @@ post_event_nofinger: | script_dir direction_reqd_event { if (!SCM_UNBNDP ($1)) { - Music *m = unsmob_music ($2); + Music *m = unsmob ($2); m->set_property ("direction", $1); } $$ = $2; @@ -2777,7 +3134,7 @@ post_event_nofinger: | script_dir direction_less_event { if (!SCM_UNBNDP ($1)) { - Music *m = unsmob_music ($2); + Music *m = unsmob ($2); m->set_property ("direction", $1); } $$ = $2; @@ -2785,13 +3142,13 @@ post_event_nofinger: | '^' fingering { $$ = $2; - unsmob_music ($$)->set_property ("direction", scm_from_int (UP)); + unsmob ($$)->set_property ("direction", scm_from_int (UP)); } | '_' fingering { $$ = $2; - unsmob_music ($$)->set_property ("direction", scm_from_int (DOWN)); - } + unsmob ($$)->set_property ("direction", scm_from_int (DOWN)); + } ; post_event: @@ -2819,7 +3176,7 @@ direction_less_event: a->set_property ("tremolo-type", $1); $$ = a->unprotect (); } - | event_function_event + | event_function_event ; direction_reqd_event: @@ -2828,11 +3185,21 @@ direction_reqd_event: } | script_abbreviation { SCM s = parser->lexer_->lookup_identifier ("dash" + ly_scm2string ($1)); - Music *a = MY_MAKE_MUSIC ("ArticulationEvent", @$); - if (scm_is_string (s)) + if (scm_is_string (s)) { + Music *a = MY_MAKE_MUSIC ("ArticulationEvent", @$); a->set_property ("articulation-type", s); - else parser->parser_error (@1, _ ("expecting string as script definition")); - $$ = a->unprotect (); + $$ = a->unprotect (); + } else { + Music *original = unsmob (s); + if (original && original->is_mus_type ("post-event")) { + Music *a = original->clone (); + a->set_spot (parser->lexer_->override_input (@$)); + $$ = a->unprotect (); + } else { + parser->parser_error (@1, _ ("expecting string or post-event as script definition")); + $$ = MY_MAKE_MUSIC ("PostEvents", @$)->unprotect (); + } + } } ; @@ -2872,8 +3239,8 @@ steno_pitch: NOTENAME_PITCH quotes { if (!scm_is_eq (SCM_INUM0, $2)) { - Pitch p = *unsmob_pitch ($1); - p = p.transposed (Pitch (scm_to_int ($2),0,0)); + Pitch p = *unsmob ($1); + p = p.transposed (Pitch (scm_to_int ($2), 0)); $$ = p.smobbed_copy (); } } @@ -2887,8 +3254,8 @@ steno_tonic_pitch: TONICNAME_PITCH quotes { if (!scm_is_eq (SCM_INUM0, $2)) { - Pitch p = *unsmob_pitch ($1); - p = p.transposed (Pitch (scm_to_int ($2),0,0)); + Pitch p = *unsmob ($1); + p = p.transposed (Pitch (scm_to_int ($2), 0)); $$ = p.smobbed_copy (); } } @@ -2899,22 +3266,16 @@ pitch: | PITCH_IDENTIFIER quotes { if (!scm_is_eq (SCM_INUM0, $2)) { - Pitch p = *unsmob_pitch ($1); - p = p.transposed (Pitch (scm_to_int ($2),0,0)); + Pitch p = *unsmob ($1); + p = p.transposed (Pitch (scm_to_int ($2), 0)); $$ = p.smobbed_copy (); } } ; -pitch_arg: - PITCH_ARG quotes { - if (!scm_is_eq (SCM_INUM0, $2)) - { - Pitch p = *unsmob_pitch ($1); - p = p.transposed (Pitch (scm_to_int ($2),0,0)); - $$ = p.smobbed_copy (); - } - } +pitch_or_tonic_pitch: + pitch + | steno_tonic_pitch ; gen_text_def: @@ -2929,9 +3290,9 @@ gen_text_def: make_simple_markup ($1)); $$ = t->unprotect (); } - | embedded_scm_closed + | embedded_scm { - Music *m = unsmob_music ($1); + Music *m = unsmob ($1); if (m && m->is_mus_type ("post-event")) $$ = $1; else if (Text_interface::is_markup ($1)) { @@ -2953,25 +3314,25 @@ fingering: script_abbreviation: '^' { - $$ = scm_from_locale_string ("Hat"); + $$ = scm_from_ascii_string ("Hat"); } | '+' { - $$ = scm_from_locale_string ("Plus"); + $$ = scm_from_ascii_string ("Plus"); } | '-' { - $$ = scm_from_locale_string ("Dash"); + $$ = scm_from_ascii_string ("Dash"); } | '!' { - $$ = scm_from_locale_string ("Bang"); + $$ = scm_from_ascii_string ("Bang"); } | ANGLE_CLOSE { - $$ = scm_from_locale_string ("Larger"); + $$ = scm_from_ascii_string ("Larger"); } | '.' { - $$ = scm_from_locale_string ("Dot"); + $$ = scm_from_ascii_string ("Dot"); } | '_' { - $$ = scm_from_locale_string ("Underscore"); + $$ = scm_from_ascii_string ("Underscore"); } ; @@ -2981,19 +3342,13 @@ script_dir: | '-' { $$ = SCM_UNDEFINED; } ; -duration_length: - multiplied_duration { - $$ = $1; - } - ; - maybe_notemode_duration: { $$ = SCM_UNDEFINED; } %prec ':' | multiplied_duration { $$ = $1; - parser->default_duration_ = *unsmob_duration ($$); + parser->default_duration_ = *unsmob ($$); } ; @@ -3016,26 +3371,13 @@ steno_duration: } } | DURATION_IDENTIFIER dots { - Duration *d = unsmob_duration ($1); - Duration k (d->duration_log (), - d->dot_count () + scm_to_int ($2)); - k = k.compressed (d->factor ()); - scm_remember_upto_here_1 ($1); - $$ = k.smobbed_copy (); + $$ = make_duration ($1, scm_to_int ($2)); } ; multiplied_duration: - steno_duration { - $$ = $1; - } - | multiplied_duration '*' UNSIGNED { - $$ = unsmob_duration ($$)->compressed (scm_to_int ($3)).smobbed_copy (); - } - | multiplied_duration '*' FRACTION { - Rational m (scm_to_int (scm_car ($3)), scm_to_int (scm_cdr ($3))); - - $$ = unsmob_duration ($$)->compressed (m).smobbed_copy (); + steno_duration multipliers { + $$ = make_duration ($1, 0, $2); } ; @@ -3048,14 +3390,40 @@ dots: } ; +multipliers: + /* empty */ + { + $$ = SCM_UNDEFINED; + } + | multipliers '*' UNSIGNED + { + if (!SCM_UNBNDP ($1)) + $$ = scm_product ($1, $3); + else + $$ = $3; + } + | multipliers '*' FRACTION + { + if (!SCM_UNBNDP ($1)) + $$ = scm_product ($1, scm_divide (scm_car ($3), + scm_cdr ($3))); + else + $$ = scm_divide (scm_car ($3), scm_cdr ($3)); + } + ; + tremolo_type: ':' { - $$ = SCM_INUM0; + $$ = scm_from_int (parser->default_tremolo_type_); } | ':' UNSIGNED { - if (SCM_UNBNDP (make_duration ($2))) + if (SCM_UNBNDP (make_duration ($2))) { parser->parser_error (@2, _ ("not a duration")); - $$ = $2; + $$ = scm_from_int (parser->default_tremolo_type_); + } else { + $$ = $2; + parser->default_tremolo_type_ = scm_to_int ($2); + } } ; @@ -3101,10 +3469,10 @@ bass_figure: } | bass_figure ']' { $$ = $1; - unsmob_music ($1)->set_property ("bracket-stop", SCM_BOOL_T); + unsmob ($1)->set_property ("bracket-stop", SCM_BOOL_T); } | bass_figure figured_bass_alteration { - Music *m = unsmob_music ($1); + Music *m = unsmob ($1); if (scm_to_double ($2)) { SCM salter = m->get_property ("alteration"); SCM alter = scm_is_number (salter) ? salter : scm_from_int (0); @@ -3115,7 +3483,7 @@ bass_figure: } } | bass_figure figured_bass_modification { - Music *m = unsmob_music ($1); + Music *m = unsmob ($1); m->set_property ($2, SCM_BOOL_T); } ; @@ -3142,7 +3510,7 @@ br_bass_figure: } | '[' bass_figure { $$ = $2; - unsmob_music ($$)->set_property ("bracket-start", SCM_BOOL_T); + unsmob ($$)->set_property ("bracket-start", SCM_BOOL_T); } ; @@ -3155,56 +3523,72 @@ figure_list: } ; -figure_spec: - FIGURE_OPEN figure_list FIGURE_CLOSE { - $$ = scm_reverse_x ($2, SCM_EOL); - } - ; - - optional_rest: /**/ { $$ = SCM_BOOL_F; } | REST { $$ = SCM_BOOL_T; } ; -simple_element: - pitch exclamations questions octave_check maybe_notemode_duration optional_rest { +pitch_or_music: + pitch exclamations questions octave_check maybe_notemode_duration optional_rest post_events { if (!parser->lexer_->is_note_state ()) parser->parser_error (@1, _ ("have to be in Note mode for notes")); if (!SCM_UNBNDP ($2) || !SCM_UNBNDP ($3) || scm_is_number ($4) || !SCM_UNBNDP ($5) - || scm_is_true ($6)) + || scm_is_true ($6) + || scm_is_pair ($7)) { Music *n = 0; if (scm_is_true ($6)) n = MY_MAKE_MUSIC ("RestEvent", @$); else n = MY_MAKE_MUSIC ("NoteEvent", @$); - + n->set_property ("pitch", $1); if (SCM_UNBNDP ($5)) n->set_property ("duration", parser->default_duration_.smobbed_copy ()); else n->set_property ("duration", $5); - + if (scm_is_number ($4)) { int q = scm_to_int ($4); n->set_property ("absolute-octave", scm_from_int (q-1)); } - + if (to_boolean ($3)) n->set_property ("cautionary", SCM_BOOL_T); if (to_boolean ($2) || to_boolean ($3)) n->set_property ("force-accidental", SCM_BOOL_T); - + if (scm_is_pair ($7)) + n->set_property ("articulations", + scm_reverse_x ($7, SCM_EOL)); $$ = n->unprotect (); } - } - | DRUM_PITCH optional_notemode_duration { + } %prec ':' + | new_chord post_events { + if (!parser->lexer_->is_chord_state ()) + parser->parser_error (@1, _ ("have to be in Chord mode for chords")); + if (scm_is_pair ($2)) { + if (unsmob ($1)) + $1 = make_chord_elements (@1, + $1, + parser->default_duration_.smobbed_copy (), + SCM_EOL); + + SCM elts = ly_append2 ($1, scm_reverse_x ($2, SCM_EOL)); + + $$ = MAKE_SYNTAX (event_chord, @1, elts); + } else if (!unsmob ($1)) + $$ = MAKE_SYNTAX (event_chord, @1, $1); + // A mere pitch drops through. + } %prec ':' + ; + +simple_element: + DRUM_PITCH optional_notemode_duration { Music *n = MY_MAKE_MUSIC ("NoteEvent", @$); n->set_property ("duration", $2); n->set_property ("drum-type", $1); @@ -3226,22 +3610,6 @@ simple_element: } ; -// Can return a single pitch rather than a list. -simple_chord_elements: - new_chord { - if (!parser->lexer_->is_chord_state ()) - parser->parser_error (@1, _ ("have to be in Chord mode for chords")); - $$ = $1; - } - | figure_spec optional_notemode_duration { - for (SCM s = $1; scm_is_pair (s); s = scm_cdr (s)) - { - unsmob_music (scm_car (s))->set_property ("duration", $2); - } - $$ = $1; - } - ; - lyric_element: full_markup { if (!parser->lexer_->is_lyric_state ()) @@ -3258,9 +3626,9 @@ lyric_element: lyric_element_music: lyric_element optional_notemode_duration post_events { - $$ = MAKE_SYNTAX ("lyric-event", @$, $1, $2); + $$ = MAKE_SYNTAX (lyric_event, @$, $1, $2); if (scm_is_pair ($3)) - unsmob_music ($$)->set_property + unsmob ($$)->set_property ("articulations", scm_reverse_x ($3, SCM_EOL)); } %prec ':' ; @@ -3379,18 +3747,14 @@ number_factor: ; bare_number_common: - bare_number_common_closed + REAL + | NUMBER_IDENTIFIER | REAL NUMBER_IDENTIFIER { $$ = scm_product ($1, $2); } ; -bare_number_common_closed: - REAL - | NUMBER_IDENTIFIER - ; - bare_number: bare_number_common | UNSIGNED @@ -3399,11 +3763,6 @@ bare_number: } ; -bare_number_closed: - UNSIGNED - | bare_number_common_closed - ; - unsigned_number: UNSIGNED | NUMBER_IDENTIFIER @@ -3438,7 +3797,13 @@ exclamations: ; questions: - { $$ = SCM_UNDEFINED; } +// This precedence rule is rather weird. It triggers when '!' is +// encountered after a pitch, and is used for deciding whether to save +// this instead for a figure modification. This should not actually +// occur in practice as pitches and figures are generated in different +// modes. Using a greedy (%right) precedence makes sure that we don't +// get stuck in a wrong interpretation. + { $$ = SCM_UNDEFINED; } %prec ':' | questions '?' { if (SCM_UNBNDP ($1)) @@ -3457,22 +3822,35 @@ full_markup_list: } ; -full_markup: +markup_mode: MARKUP - { parser->lexer_->push_markup_state (); } - markup_top { - $$ = $3; + { + parser->lexer_->push_markup_state (); + } + ; + +full_markup: + markup_mode markup_top { + $$ = $2; + parser->lexer_->pop_state (); + } + ; + +partial_markup: + markup_mode markup_partial_function ETC + { + $$ = MAKE_SYNTAX (partial_markup, @2, $2); parser->lexer_->pop_state (); } ; markup_top: markup_list { - $$ = scm_list_2 (ly_lily_module_constant ("line-markup"), $1); + $$ = scm_list_2 (Lily::line_markup, $1); } | markup_head_1_list simple_markup { - $$ = scm_car (MAKE_SYNTAX ("composed-markup-list", + $$ = scm_car (MAKE_SYNTAX (composed_markup_list, @2, $1, scm_list_1 ($2))); } | simple_markup { @@ -3481,7 +3859,7 @@ markup_top: ; markup_scm: - embedded_scm_bare + embedded_scm { if (Text_interface::is_markup ($1)) MYBACKUP (MARKUP_IDENTIFIER, $1, @1); @@ -3493,7 +3871,7 @@ markup_scm: } } BACKUP ; - + markup_list: markup_composed_list { @@ -3513,11 +3891,24 @@ markup_uncomposed_list: { $$ = $2; } + | SCORELINES { + parser->lexer_->push_note_state (Lily::pitchnames); + } '{' score_body '}' { + Score *sc = unsmob ($4); + sc->origin ()->set_spot (@$); + if (sc->defs_.empty ()) { + Output_def *od = get_layout (parser); + sc->add_output_def (od); + od->unprotect (); + } + $$ = scm_list_1 (scm_list_2 (Lily::score_lines_markup_list, $4)); + parser->lexer_->pop_state (); + } ; markup_composed_list: markup_head_1_list markup_uncomposed_list { - $$ = MAKE_SYNTAX ("composed-markup-list", + $$ = MAKE_SYNTAX (composed_markup_list, @2, $1, $2); } ; @@ -3548,7 +3939,7 @@ markup_command_basic_arguments: EXPECT_MARKUP_LIST markup_command_list_arguments markup_list { $$ = scm_cons ($3, $2); } - | EXPECT_SCM markup_command_list_arguments embedded_scm_closed { + | EXPECT_SCM markup_command_list_arguments embedded_scm { $$ = check_scheme_arg (parser, @3, $3, $2, $1); } | EXPECT_NO_MORE_ARGS { @@ -3563,6 +3954,37 @@ markup_command_list_arguments: } ; +markup_partial_function: + MARKUP_FUNCTION markup_arglist_partial + { + $$ = scm_list_1 (scm_cons ($1, scm_reverse_x ($2, SCM_EOL))); + } + | markup_head_1_list MARKUP_FUNCTION markup_arglist_partial + { + $$ = scm_cons (scm_cons ($2, scm_reverse_x ($3, SCM_EOL)), + $1); + } + ; + +markup_arglist_partial: + EXPECT_MARKUP markup_arglist_partial + { + $$ = $2; + } + | EXPECT_SCM markup_arglist_partial + { + $$= $2; + } + | EXPECT_MARKUP markup_command_list_arguments + { + $$ = $2; + } + | EXPECT_SCM markup_command_list_arguments + { + $$ = $2; + } + ; + markup_head_1_item: MARKUP_FUNCTION EXPECT_MARKUP markup_command_list_arguments { $$ = scm_cons ($1, scm_reverse_x ($3, SCM_EOL)); @@ -3583,11 +4005,16 @@ simple_markup: $$ = make_simple_markup ($1); } | SCORE { - SCM nn = parser->lexer_->lookup_identifier ("pitchnames"); - parser->lexer_->push_note_state (nn); + parser->lexer_->push_note_state (Lily::pitchnames); } '{' score_body '}' { - unsmob_score ($4)->origin ()->set_spot (@$); - $$ = scm_list_2 (ly_lily_module_constant ("score-markup"), $4); + Score *sc = unsmob ($4); + sc->origin ()->set_spot (@$); + if (sc->defs_.empty ()) { + Output_def *od = get_layout (parser); + sc->add_output_def (od); + od->unprotect (); + } + $$ = scm_list_2 (Lily::score_markup, $4); parser->lexer_->pop_state (); } | MARKUP_FUNCTION markup_command_basic_arguments { @@ -3602,7 +4029,7 @@ simple_markup: markup: markup_head_1_list simple_markup { - $$ = scm_car (MAKE_SYNTAX ("composed-markup-list", + $$ = scm_car (MAKE_SYNTAX (composed_markup_list, @2, $1, scm_list_1 ($2))); } | simple_markup { @@ -3621,12 +4048,19 @@ Lily_parser::set_yydebug (bool x) SCM Lily_parser::do_yyparse () { - SCM retval = SCM_UNDEFINED; - yyparse (this, &retval); - return retval; + return scm_c_with_fluid (Lily::f_parser, + self_scm (), + do_yyparse_trampoline, + static_cast (this)); } - +SCM +Lily_parser::do_yyparse_trampoline (void *parser) +{ + SCM retval = SCM_UNDEFINED; + yyparse (static_cast (parser), &retval); + return retval; +} @@ -3639,8 +4073,8 @@ otherwise, we have to import music classes into the lexer. int Lily_lexer::try_special_identifiers (SCM *destination, SCM sid) { - if (unsmob_book (sid)) { - Book *book = unsmob_book (sid)->clone (); + if (unsmob (sid)) { + Book *book = unsmob (sid)->clone (); *destination = book->self_scm (); book->unprotect (); @@ -3648,48 +4082,44 @@ Lily_lexer::try_special_identifiers (SCM *destination, SCM sid) } else if (scm_is_number (sid)) { *destination = sid; return NUMBER_IDENTIFIER; - } else if (unsmob_context_def (sid)) { - Context_def *def= unsmob_context_def (sid)->clone (); - - *destination = def->self_scm (); - def->unprotect (); - - return CONTEXT_DEF_IDENTIFIER; - } else if (unsmob_context_mod (sid)) { - *destination = unsmob_context_mod (sid)->smobbed_copy (); - + } else if (unsmob (sid)) + { + *destination = unsmob (sid)->clone ()->unprotect (); + return SCM_IDENTIFIER; + } else if (unsmob (sid)) { + *destination = unsmob (sid)->smobbed_copy (); return CONTEXT_MOD_IDENTIFIER; - } else if (Music *mus = unsmob_music (sid)) { + } else if (Music *mus = unsmob (sid)) { mus = mus->clone (); *destination = mus->self_scm (); bool is_event = mus->is_mus_type ("post-event"); mus->unprotect (); return is_event ? EVENT_IDENTIFIER : MUSIC_IDENTIFIER; - } else if (unsmob_pitch (sid)) { - *destination = unsmob_pitch (sid)->smobbed_copy (); + } else if (unsmob (sid)) { + *destination = unsmob (sid)->smobbed_copy (); return PITCH_IDENTIFIER; - } else if (unsmob_duration (sid)) { - *destination = unsmob_duration (sid)->smobbed_copy (); + } else if (unsmob (sid)) { + *destination = unsmob (sid)->smobbed_copy (); return DURATION_IDENTIFIER; - } else if (unsmob_output_def (sid)) { - Output_def *p = unsmob_output_def (sid); - p = p->clone (); - - *destination = p->self_scm (); - p->unprotect (); - return OUTPUT_DEF_IDENTIFIER; - } else if (unsmob_score (sid)) { - *destination = unsmob_score (sid)->clone ()->unprotect (); + } else if (unsmob (sid)) { + *destination = unsmob (sid)->clone ()->unprotect (); return SCM_IDENTIFIER; + } else if (unsmob (sid)) { + *destination = unsmob (sid)->clone ()->unprotect (); + return SCM_IDENTIFIER; + } else if (scm_is_pair (sid) + && scm_is_pair (scm_car (sid)) + && scm_is_true (Lily::key_p (scm_caar (sid)))) { + *destination = sid; + return LOOKUP_IDENTIFIER; } - return -1; } SCM get_next_unique_context_id () { - return scm_from_locale_string ("$uniqueContextId"); + return scm_from_ascii_string ("$uniqueContextId"); } @@ -3699,7 +4129,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_from_locale_string (s); + return scm_from_ascii_string (s); } // check_scheme_arg checks one argument with a given predicate for use @@ -3728,18 +4158,18 @@ SCM check_scheme_arg (Lily_parser *parser, Input loc, return args; } scm_set_cdr_x (scm_last_pair (args), SCM_EOL); - MAKE_SYNTAX ("argument-error", loc, scm_length (args), pred, + MAKE_SYNTAX (argument_error, loc, scm_length (args), pred, SCM_UNBNDP (disp) ? arg : disp); scm_set_cdr_x (scm_last_pair (args), SCM_BOOL_F); return args; } -SCM loc_on_music (Input loc, SCM arg) +SCM loc_on_music (Lily_parser *parser, Input loc, SCM arg) { - if (Music *m = unsmob_music (arg)) + if (Music *m = unsmob (arg)) { m = m->clone (); - m->set_spot (loc); + m->set_spot (parser->lexer_->override_input (loc)); return m->unprotect (); } return arg; @@ -3752,7 +4182,7 @@ try_string_variants (SCM pred, SCM str) if (scm_is_true (scm_call_1 (pred, str))) return str; // a symbol may be interpreted as a list of symbols if it helps - if (scm_is_symbol (str)) { + if (scm_is_true (Lily::key_p (str))) { str = scm_list_1 (str); if (scm_is_true (scm_call_1 (pred, str))) return str; @@ -3766,6 +4196,10 @@ try_string_variants (SCM pred, SCM str) return SCM_UNDEFINED; str = scm_string_split (str, SCM_MAKE_CHAR ('.')); + for (SCM p = str; scm_is_pair (p); p = scm_cdr (p)) + scm_set_car_x (p, scm_string_split (scm_car (p), + SCM_MAKE_CHAR (','))); + str = scm_append_x (str); for (SCM p = str; scm_is_pair (p); p = scm_cdr (p)) scm_set_car_x (p, scm_string_to_symbol (scm_car (p))); @@ -3804,7 +4238,8 @@ is_regular_identifier (SCM id, bool multiple) || (c >= 'A' && c <= 'Z') || c > 0x7f) middle = true; - else if (middle && (c == '-' || c == '_' || (multiple && c == '.'))) + else if (middle && (c == '-' || c == '_' || (multiple && + (c == '.' || c == ',')))) middle = false; else return false; @@ -3815,7 +4250,7 @@ is_regular_identifier (SCM id, bool multiple) SCM make_music_from_simple (Lily_parser *parser, Input loc, SCM simple) { - if (unsmob_music (simple)) + if (unsmob (simple)) return simple; if (parser->lexer_->is_note_state ()) { if (scm_is_symbol (simple)) { @@ -3824,21 +4259,29 @@ make_music_from_simple (Lily_parser *parser, Input loc, SCM simple) n->set_property ("drum-type", simple); return n->unprotect (); } - if (unsmob_pitch (simple)) { + if (unsmob (simple)) { Music *n = MY_MAKE_MUSIC ("NoteEvent", loc); n->set_property ("duration", parser->default_duration_.smobbed_copy ()); n->set_property ("pitch", simple); return n->unprotect (); } + SCM d = simple; + if (scm_is_integer (simple)) + d = make_duration (simple); + if (unsmob (d)) { + Music *n = MY_MAKE_MUSIC ("NoteEvent", loc); + n->set_property ("duration", d); + return n->unprotect (); + } return simple; } else if (parser->lexer_->is_lyric_state ()) { if (Text_interface::is_markup (simple)) - return MAKE_SYNTAX ("lyric-event", loc, simple, + return MAKE_SYNTAX (lyric_event, loc, simple, parser->default_duration_.smobbed_copy ()); } else if (parser->lexer_->is_chord_state ()) { - if (unsmob_pitch (simple)) + if (unsmob (simple)) return MAKE_SYNTAX - ("event-chord", + (event_chord, loc, make_chord_elements (loc, simple, parser->default_duration_.smobbed_copy (), @@ -3862,26 +4305,40 @@ make_simple_markup (SCM a) } SCM -make_duration (SCM d, int dots) +make_duration (SCM d, int dots, SCM factor) { - int t = scm_to_int (d); - if (t > 0 && (t & (t-1)) == 0) - return Duration (intlog2 (t), dots).smobbed_copy (); - else - return SCM_UNDEFINED; + Duration k; + + if (Duration *dur = unsmob (d)) { + if (!dots && SCM_UNBNDP (factor)) + return d; + k = *dur; + if (dots) + k = Duration (k.duration_log (), k.dot_count () + dots) + .compressed (k.factor ()); + } else { + int t = scm_to_int (d); + if (t > 0 && (t & (t-1)) == 0) + k = Duration (intlog2 (t), dots); + else + return SCM_UNDEFINED; + } + + if (!SCM_UNBNDP (factor)) + k = k.compressed (ly_scm2rational (factor)); + + return k.smobbed_copy (); } SCM make_chord_step (SCM step_scm, Rational alter) { - int step = scm_to_int (step_scm); + Pitch m (0, scm_to_int (step_scm) - 1, alter); - if (step == 7) - alter += FLAT_ALTERATION; + // Notename/octave are normalized + if (m.get_notename () == 6) + m = m.transposed (Pitch (0, 0, FLAT_ALTERATION)); - while (step < 0) - step += 7; - Pitch m ((step -1) / 7, (step - 1) % 7, alter); return m.smobbed_copy (); } @@ -3889,11 +4346,10 @@ make_chord_step (SCM step_scm, Rational alter) SCM make_chord_elements (Input loc, SCM pitch, SCM dur, SCM modification_list) { - SCM chord_ctor = ly_lily_module_constant ("construct-chord-elements"); - SCM res = scm_call_3 (chord_ctor, pitch, dur, modification_list); + SCM res = Lily::construct_chord_elements (pitch, dur, modification_list); for (SCM s = res; scm_is_pair (s); s = scm_cdr (s)) { - unsmob_music (scm_car (s))->set_spot (loc); + unsmob (scm_car (s))->set_spot (loc); } return res; } @@ -3905,6 +4361,9 @@ yylex (YYSTYPE *s, YYLTYPE *loc, Lily_parser *parser) lex->lexval_ = s; lex->lexloc_ = loc; + int tok = lex->pop_extra_token (); + if (tok >= 0) + return tok; lex->prepare_for_next_token (); return lex->yylex (); } diff --git a/lily/part-combine-engraver.cc b/lily/part-combine-engraver.cc index 6d11c155f8..33c10f5966 100644 --- a/lily/part-combine-engraver.cc +++ b/lily/part-combine-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen Han-Wen Nienhuys @@ -34,11 +34,11 @@ class Part_combine_engraver : public Engraver TRANSLATOR_DECLARATIONS (Part_combine_engraver); protected: - DECLARE_ACKNOWLEDGER (note_head); - DECLARE_ACKNOWLEDGER (stem); + void acknowledge_note_head (Grob_info); + void acknowledge_stem (Grob_info); - DECLARE_TRANSLATOR_LISTENER (part_combine); - DECLARE_TRANSLATOR_LISTENER (note); + void listen_part_combine (Stream_event *); + void listen_note (Stream_event *); void process_music (); void stop_translation_timestep (); void create_item (Stream_event *ev); @@ -51,7 +51,6 @@ private: Stream_event *waiting_event_; }; -IMPLEMENT_TRANSLATOR_LISTENER (Part_combine_engraver, part_combine); void Part_combine_engraver::listen_part_combine (Stream_event *ev) { @@ -61,7 +60,6 @@ Part_combine_engraver::listen_part_combine (Stream_event *ev) waiting_event_ = new_event_; } -IMPLEMENT_TRANSLATOR_LISTENER (Part_combine_engraver, note); void Part_combine_engraver::listen_note (Stream_event *) { @@ -81,11 +79,11 @@ Part_combine_engraver::create_item (Stream_event *ev) { SCM what = scm_car (ev->get_property ("class")); SCM text = SCM_EOL; - if (what == ly_symbol2scm ("solo-one-event")) + if (scm_is_eq (what, ly_symbol2scm ("solo-one-event"))) text = get_property ("soloText"); - else if (what == ly_symbol2scm ("solo-two-event")) + else if (scm_is_eq (what, ly_symbol2scm ("solo-two-event"))) text = get_property ("soloIIText"); - else if (what == ly_symbol2scm ("unisono-event")) + else if (scm_is_eq (what, ly_symbol2scm ("unisono-event"))) text = get_property ("aDueText"); if (Text_interface::is_markup (text)) @@ -137,8 +135,15 @@ Part_combine_engraver::stop_translation_timestep () note_found_ = false; } -ADD_ACKNOWLEDGER (Part_combine_engraver, note_head); -ADD_ACKNOWLEDGER (Part_combine_engraver, stem); +void +Part_combine_engraver::boot () +{ + ADD_LISTENER (Part_combine_engraver, part_combine); + ADD_LISTENER (Part_combine_engraver, note); + ADD_ACKNOWLEDGER (Part_combine_engraver, note_head); + ADD_ACKNOWLEDGER (Part_combine_engraver, stem); +} + ADD_TRANSLATOR (Part_combine_engraver, /* doc */ "Part combine engraver for orchestral scores: Print markings" diff --git a/lily/part-combine-iterator.cc b/lily/part-combine-iterator.cc index 654edc35be..f742d75a73 100644 --- a/lily/part-combine-iterator.cc +++ b/lily/part-combine-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,16 +24,7 @@ #include "music-iterator.hh" #include "music-sequence.hh" #include "warn.hh" - -enum Outlet_type -{ - CONTEXT_ONE, CONTEXT_TWO, - CONTEXT_SHARED, CONTEXT_SOLO, - CONTEXT_NULL, NUM_OUTLETS -}; - -static const char *outlet_names_[NUM_OUTLETS] - = {"one", "two", "shared", "solo", "null"}; +#include "lily-imports.hh" class Part_combine_iterator : public Music_iterator { @@ -53,127 +44,51 @@ protected: virtual bool ok () const; private: - /* used by try_process */ - DECLARE_LISTENER (set_busy); - bool busy_; - bool notice_busy_; - - bool try_process (Music_iterator *i, Moment m); - - Music_iterator *first_iter_; - Music_iterator *second_iter_; - Moment start_moment_; - - SCM split_list_; - SCM direction_; - SCM directionOne_; - SCM directionTwo_; - SCM horizontalShiftOne_; - SCM horizontalShiftTwo_; - - Stream_event *unisono_event_; - Stream_event *solo_one_event_; - Stream_event *solo_two_event_; + static const size_t NUM_PARTS = 2; + Music_iterator *iterators_[NUM_PARTS]; + Stream_event *mmrest_event_; - enum Status - { - APART, - TOGETHER, - SOLO1, - SOLO2, - UNISONO, - UNISILENCE, - }; - Status state_; - Status playing_state_; - - /* - Should be SOLO1 or SOLO2 - */ - Status last_playing_; - - /* - TODO: this is getting off hand... - */ - Context_handle handles_[NUM_OUTLETS]; - - void substitute_both (Outlet_type to1, - Outlet_type to2); - - /* parameter is really Outlet_type */ - void kill_mmrest (int in); - void chords_together (); - void solo1 (); - void solo2 (); - void apart (bool silent); - void unisono (bool silent); + bool is_active_outlet (const Context *c) const; + void kill_mmrest (Context *c); }; +const size_t Part_combine_iterator::NUM_PARTS; + void Part_combine_iterator::do_quit () { - if (first_iter_) - first_iter_->quit (); - if (second_iter_) - second_iter_->quit (); - - // Add listeners to all contexts except Devnull. - for (int i = 0; i < NUM_OUTLETS; i++) - { - Context *c = handles_[i].get_context (); - if (c->is_alias (ly_symbol2scm ("Voice"))) - c->event_source ()->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event")); - handles_[i].set_context (0); - } + for (size_t i = 0; i < NUM_PARTS; i++) + if (iterators_[i]) + iterators_[i]->quit (); } Part_combine_iterator::Part_combine_iterator () { mmrest_event_ = 0; - unisono_event_ = 0; - solo_two_event_ = 0; - solo_one_event_ = 0; - - first_iter_ = 0; - second_iter_ = 0; - split_list_ = SCM_EOL; - direction_ = SCM_BOOL_F; - directionOne_ = scm_from_int (1); - directionTwo_ = scm_from_int (-1); - horizontalShiftOne_ = scm_from_int (0); - horizontalShiftTwo_ = scm_from_int (1); - state_ = APART; - playing_state_ = APART; - last_playing_ = APART; - - busy_ = false; - notice_busy_ = false; + + for (size_t i = 0; i < NUM_PARTS; i++) + iterators_[i] = 0; } void Part_combine_iterator::derived_mark () const { - if (first_iter_) - scm_gc_mark (first_iter_->self_scm ()); - if (second_iter_) - scm_gc_mark (second_iter_->self_scm ()); - if (unisono_event_) - scm_gc_mark (unisono_event_->self_scm ()); + for (size_t i = 0; i < NUM_PARTS; i++) + if (iterators_[i]) + scm_gc_mark (iterators_[i]->self_scm ()); + if (mmrest_event_) scm_gc_mark (mmrest_event_->self_scm ()); - if (solo_one_event_) - scm_gc_mark (solo_one_event_->self_scm ()); - if (solo_two_event_) - scm_gc_mark (solo_two_event_->self_scm ()); } void Part_combine_iterator::derived_substitute (Context *f, Context *t) { - if (first_iter_) - first_iter_->substitute_outlet (f, t); + // (Explain why just iterators_[0].) + if (iterators_[0]) + iterators_[0]->substitute_outlet (f, t); } Moment @@ -181,341 +96,82 @@ Part_combine_iterator::pending_moment () const { Moment p; p.set_infinite (1); - if (first_iter_->ok ()) - p = min (p, first_iter_->pending_moment ()); - if (second_iter_->ok ()) - p = min (p, second_iter_->pending_moment ()); + for (size_t i = 0; i < NUM_PARTS; i++) + if (iterators_[i]->ok ()) + p = min (p, iterators_[i]->pending_moment ()); + return p; } bool Part_combine_iterator::ok () const { - return first_iter_->ok () || second_iter_->ok (); + for (size_t i = 0; i < NUM_PARTS; i++) + if (iterators_[i]->ok ()) + return true; + + return false; } -void -Part_combine_iterator::substitute_both (Outlet_type to1, - Outlet_type to2) +bool Part_combine_iterator::is_active_outlet (const Context *c) const { - Outlet_type tos[] = {to1, to2}; - - Music_iterator *mis[] = {first_iter_, second_iter_}; - - for (int i = 0; i < 2; i++) - { - for (int j = 0; j < NUM_OUTLETS; j++) - if (j != tos[i]) - mis[i]->substitute_outlet (handles_[j].get_context (), handles_[tos[i]].get_context ()); - } + for (size_t i = 0; i < NUM_PARTS; i++) + if (iterators_[i] && (iterators_[i]->get_outlet () == c)) + return true; - for (int j = 0; j < NUM_OUTLETS; j++) - { - if (j != to1 && j != to2) - kill_mmrest (j); - } + return false; } void -Part_combine_iterator::kill_mmrest (int in) +Part_combine_iterator::kill_mmrest (Context *c) { if (!mmrest_event_) { mmrest_event_ = new Stream_event - (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), - ly_symbol2scm ("multi-measure-rest-event"))); + (Lily::ly_make_event_class (ly_symbol2scm ("multi-measure-rest-event"))); mmrest_event_->set_property ("duration", SCM_EOL); mmrest_event_->unprotect (); } - handles_[in].get_context ()->event_source ()->broadcast (mmrest_event_); -} - -void -Part_combine_iterator::unisono (bool silent) -{ - Status newstate = (silent) ? UNISILENCE : UNISONO; - - if (newstate == state_) - return; - else - { - /* - If we're coming from SOLO2 state, we might have kill mmrests - in the 1st voice, so in that case, we use the second voice - as a basis for events. - */ - Outlet_type c1 = (last_playing_ == SOLO2) ? CONTEXT_NULL : CONTEXT_SHARED; - Outlet_type c2 = (last_playing_ == SOLO2) ? CONTEXT_SHARED : CONTEXT_NULL; - substitute_both (c1, c2); - kill_mmrest ((last_playing_ == SOLO2) ? CONTEXT_ONE : CONTEXT_TWO); - kill_mmrest (CONTEXT_SHARED); - - if (playing_state_ != UNISONO - && newstate == UNISONO) - { - if (!unisono_event_) - { - unisono_event_ = new Stream_event - (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), - ly_symbol2scm ("unisono-event"))); - unisono_event_->unprotect (); - } - - Context *out = (last_playing_ == SOLO2 ? second_iter_ : first_iter_) - ->get_outlet (); - out->event_source ()->broadcast (unisono_event_); - playing_state_ = UNISONO; - } - state_ = newstate; - } -} - -void -Part_combine_iterator::solo1 () -{ - if (state_ == SOLO1) - return; - else - { - state_ = SOLO1; - substitute_both (CONTEXT_SOLO, CONTEXT_NULL); - - kill_mmrest (CONTEXT_TWO); - kill_mmrest (CONTEXT_SHARED); - - if (playing_state_ != SOLO1) - { - if (!solo_one_event_) - { - solo_one_event_ = new Stream_event - (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), - ly_symbol2scm ("solo-one-event"))); - solo_one_event_->unprotect (); - } - - first_iter_->get_outlet ()->event_source ()->broadcast (solo_one_event_); - } - playing_state_ = SOLO1; - } -} - -void -Part_combine_iterator::solo2 () -{ - if (state_ == SOLO2) - return; - else - { - state_ = SOLO2; - - substitute_both (CONTEXT_NULL, CONTEXT_SOLO); - - if (playing_state_ != SOLO2) - { - if (!solo_two_event_) - { - solo_two_event_ = new Stream_event - (scm_call_1 (ly_lily_module_constant ("ly:make-event-class"), - ly_symbol2scm ("solo-two-event"))); - solo_two_event_->unprotect (); - } - - second_iter_->get_outlet ()->event_source ()->broadcast (solo_two_event_); - playing_state_ = SOLO2; - } - } -} - -void -Part_combine_iterator::chords_together () -{ - if (state_ == TOGETHER) - return; - else - { - playing_state_ = TOGETHER; - state_ = TOGETHER; - - substitute_both (CONTEXT_SHARED, CONTEXT_SHARED); - } -} - -void -Part_combine_iterator::apart (bool silent) -{ - if (!silent) - playing_state_ = APART; - - if (state_ == APART) - return; - else - { - state_ = APART; - substitute_both (CONTEXT_ONE, CONTEXT_TWO); - } + c->event_source ()->broadcast (mmrest_event_); } void Part_combine_iterator::construct_children () { - start_moment_ = get_outlet ()->now_mom (); - split_list_ = get_music ()->get_property ("split-list"); - direction_ = get_music ()->get_property ("direction"); - if (is_direction (direction_)) - { - directionOne_ = direction_; - directionTwo_ = direction_; - if (scm_is_true (scm_negative_p (direction_))) - { - horizontalShiftOne_ = scm_from_int (1); - horizontalShiftTwo_ = scm_from_int (0); - } - } - - Context *c = get_outlet (); - - for (int i = 0; i < NUM_OUTLETS; i++) - { - SCM type = (i == CONTEXT_NULL) ? ly_symbol2scm ("Devnull") : ly_symbol2scm ("Voice"); - /* find context below c: otherwise we may create new staff for each voice */ - c = c->find_create_context (type, outlet_names_[i], SCM_EOL); - handles_[i].set_context (c); - if (c->is_alias (ly_symbol2scm ("Voice"))) - c->event_source ()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event")); - } - SCM lst = get_music ()->get_property ("elements"); - Context *one = handles_[CONTEXT_ONE].get_context (); - set_context (one); - first_iter_ = unsmob_iterator (get_iterator (unsmob_music (scm_car (lst)))); - Context *two = handles_[CONTEXT_TWO].get_context (); - set_context (two); - second_iter_ = unsmob_iterator (get_iterator (unsmob_music (scm_cadr (lst)))); - Context *shared = handles_[CONTEXT_SHARED].get_context (); - set_context (shared); - - /* Mimic all settings of voiceOne/voiceTwo for the two separate voices...*/ - /* FIXME: Is there any way to use the definition of \voiceOne/\voiceTwo - directly??? */ - char const *syms[] - = - { - "Stem", - "DynamicLineSpanner", - "Tie", - "Dots", - "MultiMeasureRest", - "Rest", - "Slur", - "TextScript", - "Script", - 0 - }; - - for (char const **p = syms; *p; p++) - { - SCM sym = ly_symbol2scm (*p); - execute_pushpop_property (one, sym, - ly_symbol2scm ("direction"), directionOne_); - - execute_pushpop_property (two, sym, - ly_symbol2scm ("direction"), directionTwo_); - - if (scm_is_number (direction_)) - execute_pushpop_property (shared, sym, - ly_symbol2scm ("direction"), direction_); - } - /* Handle horizontal shifts for crossing notes */ - execute_pushpop_property (one, ly_symbol2scm ("NoteColumn"), - ly_symbol2scm ("horizontal-shift"), horizontalShiftOne_); - execute_pushpop_property (two, ly_symbol2scm ("NoteColumn"), - ly_symbol2scm ("horizontal-shift"), horizontalShiftTwo_); - -} - -IMPLEMENT_LISTENER (Part_combine_iterator, set_busy); -void -Part_combine_iterator::set_busy (SCM se) -{ - if (!notice_busy_) - return; - - Stream_event *e = unsmob_stream_event (se); - - if (e->in_event_class ("note-event") || e->in_event_class ("cluster-note-event")) - busy_ = true; -} - -/* - Processes a moment in an iterator, and returns whether any new music - was reported. -*/ -bool -Part_combine_iterator::try_process (Music_iterator *i, Moment m) -{ - busy_ = false; - notice_busy_ = true; - - i->process (m); - - notice_busy_ = false; - return busy_; + iterators_[0] = unsmob (get_iterator (unsmob (scm_car (lst)))); + iterators_[1] = unsmob (get_iterator (unsmob (scm_cadr (lst)))); } void Part_combine_iterator::process (Moment m) { - Moment now = get_outlet ()->now_mom (); - Moment *splitm = 0; - - /* This is needed if construct_children was called before iteration - started */ - if (start_moment_.main_part_.is_infinity () && start_moment_ < 0) - start_moment_ = now; - - for (; scm_is_pair (split_list_); split_list_ = scm_cdr (split_list_)) + Context *prev_active_outlets[NUM_PARTS]; + bool any_outlet_changed = false; + for (size_t i = 0; i < NUM_PARTS; i++) { - splitm = unsmob_moment (scm_caar (split_list_)); - if (splitm && *splitm + start_moment_ > now) - break; - - SCM tag = scm_cdar (split_list_); - - if (tag == ly_symbol2scm ("chords")) - chords_together (); - else if (tag == ly_symbol2scm ("apart") - || tag == ly_symbol2scm ("apart-silence") - || tag == ly_symbol2scm ("apart-spanner")) - apart (tag == ly_symbol2scm ("apart-silence")); - else if (tag == ly_symbol2scm ("unisono")) - unisono (false); - else if (tag == ly_symbol2scm ("unisilence")) - unisono (true); - else if (tag == ly_symbol2scm ("solo1")) - solo1 (); - else if (tag == ly_symbol2scm ("solo2")) - solo2 (); - else if (scm_is_symbol (tag)) - { - string s = "Unknown split directive: " - + (scm_is_symbol (tag) ? ly_symbol2string (tag) : string ("not a symbol")); - programming_error (s); - } - } + prev_active_outlets[i] = iterators_[i]->get_outlet (); - if (first_iter_->ok ()) - { - if (try_process (first_iter_, m)) - last_playing_ = SOLO1; + if (iterators_[i]->ok ()) + iterators_[i]->process (m); + + if (prev_active_outlets[i] != iterators_[i]->get_outlet ()) + any_outlet_changed = true; } - if (second_iter_->ok ()) + if (any_outlet_changed) { - if (try_process (second_iter_, m)) - last_playing_ = SOLO2; + // Kill multi-measure rests in outlets that were previously active and + // are no longer active. + for (size_t i = 0; i < NUM_PARTS; i++) + { + Context *c = prev_active_outlets[i]; + if (c && !is_active_outlet (c)) + kill_mmrest (c); + } } } diff --git a/lily/part-combine-part-iterator.cc b/lily/part-combine-part-iterator.cc new file mode 100644 index 0000000000..b9262d92fd --- /dev/null +++ b/lily/part-combine-part-iterator.cc @@ -0,0 +1,60 @@ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2015 Daniel Eble + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#include "change-sequence-iterator.hh" +#include "context.hh" + +class Part_combine_part_iterator : public Change_sequence_iterator +{ +public: + DECLARE_SCHEME_CALLBACK (constructor, ()); + Part_combine_part_iterator () {} + +private: + virtual void change_to (const string &id); + Context *find_voice(const string &id); +}; + +void +Part_combine_part_iterator::change_to (const string &id) +{ + Context *voice = find_voice (id); + if (voice) + substitute_outlet (get_outlet (), voice); + else + { + string s = "can not find Voice context: "; + s += id; + programming_error (s); + } +} + +Context * +Part_combine_part_iterator::find_voice (const string &id) +{ + // Find a Voice among the siblings of the current outlet. (Well, this might + // also find a sibling's descendant, but that should not be a problem.) + Context *c = get_outlet ()->get_parent_context (); + if (c) + return find_context_below (c, ly_symbol2scm("Voice"), id); + programming_error ("no parent context"); + return 0; +} + +IMPLEMENT_CTOR_CALLBACK (Part_combine_part_iterator); diff --git a/lily/partial-iterator.cc b/lily/partial-iterator.cc index 7c3b3e965b..80048d827c 100644 --- a/lily/partial-iterator.cc +++ b/lily/partial-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Neil Puttock + Copyright (C) 2010--2015 Neil Puttock LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,16 +18,19 @@ */ #include "context.hh" +#include "global-context.hh" #include "input.hh" #include "international.hh" #include "moment.hh" #include "music.hh" #include "simple-music-iterator.hh" +#include "lily-imports.hh" class Partial_iterator : public Simple_music_iterator { public: DECLARE_SCHEME_CALLBACK (constructor, ()); + DECLARE_SCHEME_CALLBACK (finalization, (SCM, SCM)); protected: virtual void process (Moment); }; @@ -36,16 +39,43 @@ void Partial_iterator::process (Moment m) { if (Duration * dur - = unsmob_duration (get_music ()->get_property ("duration"))) + = unsmob (get_music ()->get_property ("duration"))) { - Context *ctx = get_outlet (); - Moment now = ctx->now_mom (); - if (now.main_part_ > Rational (0)) - get_music ()->origin ()-> - warning (_ ("trying to use \\partial after the start of a piece")); Moment length = Moment (dur->get_length ()); - now = Moment (0, now.grace_part_); - ctx->set_property ("measurePosition", (now - length).smobbed_copy ()); + + // Partial_iterator is an iterator rather than an engraver, + // so the active context it is getting called in does not + // depend on which context definition the engraver might be + // defined. + // + // Using where_defined to find the context where + // measurePosition should be overwritten does not actually + // work since the Timing_translator does not set + // measurePosition when initializing. + + Context *timing = unsmob + (Lily::ly_context_find (get_outlet ()->self_scm (), + ly_symbol2scm ("Timing"))); + + if (!timing) + programming_error ("missing Timing in \\partial"); + else if (get_outlet ()->now_mom () > 0) + { + timing->set_property ("partialBusy", ly_bool2scm (true)); + Global_context *tg = get_outlet ()->get_global_context (); + tg->add_finalization (scm_list_3 (finalization_proc, + get_outlet ()->self_scm (), + length.smobbed_copy ())); + } + else + { + Moment mp = robust_scm2moment + (timing->get_property ("measurePosition"), + Rational (0)); + mp.main_part_ = 0; + timing->set_property + ("measurePosition", (mp - length).smobbed_copy ()); + } } else programming_error ("invalid duration in \\partial"); @@ -54,3 +84,25 @@ Partial_iterator::process (Moment m) } IMPLEMENT_CTOR_CALLBACK (Partial_iterator); + +MAKE_SCHEME_CALLBACK (Partial_iterator, finalization, 2); +SCM +Partial_iterator::finalization (SCM ctx, SCM length) +{ + LY_ASSERT_SMOB (Context, ctx, 1); + LY_ASSERT_SMOB (Moment, length, 2); + Context *timing = unsmob + (Lily::ly_context_find (ctx, ly_symbol2scm ("Timing"))); + if (!timing) { + programming_error ("missing Timing in \\partial"); + return SCM_UNSPECIFIED; + } + Moment mp = robust_scm2moment (timing->get_property ("measurePosition"), + Rational (0)); + mp.main_part_ = measure_length (timing); + timing->set_property ("measurePosition", + (mp - *unsmob (length)).smobbed_copy ()); + timing->unset_property (ly_symbol2scm ("partialBusy")); + + return SCM_UNSPECIFIED; +} diff --git a/lily/pdf-scheme.cc b/lily/pdf-scheme.cc index 544ce97461..da2ce2cef3 100644 --- a/lily/pdf-scheme.cc +++ b/lily/pdf-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Reinhold Kainhofer + Copyright (C) 2011--2015 Reinhold Kainhofer LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc index a6ef072ea6..b620cdccb5 100644 --- a/lily/percent-repeat-engraver.cc +++ b/lily/percent-repeat-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys , Erik Sandberg + Copyright (C) 2000--2015 Han-Wen Nienhuys , Erik Sandberg LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -50,7 +50,7 @@ protected: Moment command_moment_; virtual void finalize (); - DECLARE_TRANSLATOR_LISTENER (percent); + void listen_percent (Stream_event *); void start_translation_timestep (); void stop_translation_timestep (); @@ -73,7 +73,7 @@ Percent_repeat_engraver::start_translation_timestep () if (now_mom ().main_part_ != command_moment_.main_part_) { first_command_column_ - = unsmob_grob (get_property ("currentCommandColumn")); + = unsmob (get_property ("currentCommandColumn")); command_moment_ = now_mom (); } @@ -85,7 +85,6 @@ Percent_repeat_engraver::start_translation_timestep () } } -IMPLEMENT_TRANSLATOR_LISTENER (Percent_repeat_engraver, percent); void Percent_repeat_engraver::listen_percent (Stream_event *ev) { @@ -122,7 +121,7 @@ Percent_repeat_engraver::process_music () percent_->set_bound (LEFT, col); SCM count = percent_event_->get_property ("repeat-count"); - if (count != SCM_EOL && to_boolean (get_property ("countPercentRepeats")) + if (!scm_is_null (count) && to_boolean (get_property ("countPercentRepeats")) && check_repeat_count_visibility (context (), count)) { percent_counter_ = make_spanner ("PercentRepeatCounter", @@ -133,6 +132,7 @@ Percent_repeat_engraver::process_music () percent_counter_->set_bound (LEFT, col); Side_position_interface::add_support (percent_counter_, percent_); percent_counter_->set_parent (percent_, Y_AXIS); + percent_counter_->set_parent (percent_, X_AXIS); } else percent_counter_ = 0; @@ -168,6 +168,12 @@ Percent_repeat_engraver::stop_translation_timestep () { } +void +Percent_repeat_engraver::boot () +{ + ADD_LISTENER (Percent_repeat_engraver, percent); +} + ADD_TRANSLATOR (Percent_repeat_engraver, /* doc */ "Make whole measure repeats.", diff --git a/lily/percent-repeat-item.cc b/lily/percent-repeat-item.cc index 928089af8b..6799abc9ca 100644 --- a/lily/percent-repeat-item.cc +++ b/lily/percent-repeat-item.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -69,7 +69,7 @@ MAKE_SCHEME_CALLBACK (Percent_repeat_item_interface, double_percent, 1); SCM Percent_repeat_item_interface::double_percent (SCM grob) { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); Stencil m = x_percent (me, 2); m.translate_axis (-m.extent (X_AXIS).center (), X_AXIS); return m.smobbed_copy (); @@ -79,8 +79,8 @@ MAKE_SCHEME_CALLBACK (Percent_repeat_item_interface, beat_slash, 1); SCM Percent_repeat_item_interface::beat_slash (SCM grob) { - Grob *me = unsmob_grob (grob); - Stream_event *cause = unsmob_stream_event (me->get_property ("cause")); + Grob *me = unsmob (grob); + Stream_event *cause = unsmob (me->get_property ("cause")); int count = robust_scm2int (cause->get_property ("slash-count"), 1); Stencil m; diff --git a/lily/percent-repeat-iterator.cc b/lily/percent-repeat-iterator.cc index dd149049f4..3c8420daa0 100644 --- a/lily/percent-repeat-iterator.cc +++ b/lily/percent-repeat-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys Erik Sandberg LilyPond is free software: you can redistribute it and/or modify @@ -22,6 +22,7 @@ #include "input.hh" #include "repeated-music.hh" #include "sequential-iterator.hh" +#include "lily-imports.hh" class Percent_repeat_iterator : public Sequential_iterator { @@ -31,36 +32,86 @@ public: Percent_repeat_iterator (); protected: virtual SCM get_music_list () const; + virtual void construct_children (); + virtual void next_element (bool); + virtual void derived_mark () const; +private: + SCM child_list_; + int starting_bar_; }; IMPLEMENT_CTOR_CALLBACK (Percent_repeat_iterator); Percent_repeat_iterator::Percent_repeat_iterator () + : child_list_ (SCM_UNDEFINED), starting_bar_ (-1) { } +void +Percent_repeat_iterator::derived_mark () const +{ + scm_gc_mark (child_list_); + Sequential_iterator::derived_mark (); +} + +void +Percent_repeat_iterator::construct_children () +{ + Music *mus = get_music (); + + Music *child = Repeated_music::body (mus); + child_list_ = scm_list_1 (child->self_scm ()); + + Sequential_iterator::construct_children (); + + descend_to_bottom_context (); + if (!measure_position (get_outlet ()).main_part_) + starting_bar_ = + robust_scm2int (get_outlet ()->get_property ("internalBarNumber"), 0); +} + SCM Percent_repeat_iterator::get_music_list () const { + return child_list_; +} + +// Arrive here when child processing has been completed. At that +// point of time, we can determine what kind of percent expression we +// are dealing with and extend the child list just in time before the +// next iterator is getting fetched. +void +Percent_repeat_iterator::next_element (bool side_effect) +{ + // Do nothing if we already did our processing here. + if (!scm_is_pair (child_list_)) + { + Sequential_iterator::next_element (side_effect); + return; + } + Music *mus = get_music (); + Music *child = Repeated_music::body (mus); SCM length = child->get_length ().smobbed_copy (); + + int current_bar = -1; + if (!measure_position (get_outlet ()).main_part_) + current_bar = + robust_scm2int (get_outlet ()->get_property ("internalBarNumber"), 0); + SCM child_list = SCM_EOL; - Moment measure_len = measure_length (get_outlet ()); - Moment music_len = robust_scm2moment (length, Moment (0)); string event_type; SCM slash_count = SCM_EOL; - if (measure_len == music_len) + if (starting_bar_ >= 0 && current_bar == starting_bar_ + 1) event_type = "PercentEvent"; - else if (measure_len * Moment (2) == music_len) + else if (starting_bar_ >=0 && current_bar == starting_bar_ + 2) event_type = "DoublePercentEvent"; else { - slash_count - = scm_call_1 (ly_lily_module_constant ("calc-repeat-slash-count"), - child->self_scm ()); + slash_count = Lily::calc_repeat_slash_count (child->self_scm ()); event_type = "RepeatSlashEvent"; } @@ -80,7 +131,8 @@ Percent_repeat_iterator::get_music_list () const child_list = scm_cons (percent->unprotect (), child_list); } - child_list = scm_cons (child->self_scm (), child_list); + scm_set_cdr_x (child_list_, child_list); + child_list_ = SCM_EOL; - return child_list; + Sequential_iterator::next_element (side_effect); } diff --git a/lily/performance-scheme.cc b/lily/performance-scheme.cc index affc4f04cf..4d3c1e6512 100644 --- a/lily/performance-scheme.cc +++ b/lily/performance-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,14 +19,38 @@ #include "performance.hh" +LY_DEFINE (ly_performance_header, "ly:performance-header", + 1, 0, 0, (SCM performance), + "Return header of performance.") +{ + LY_ASSERT_SMOB (Performance, performance, 1); + Performance *p = unsmob (performance); + return p->get_header (); +} + +LY_DEFINE (ly_performance_set_header_x, "ly:performance-set-header!", + 2, 0, 0, (SCM performance, SCM module), + "Set the performance header.") +{ + LY_ASSERT_SMOB (Performance, performance, 1); + SCM_ASSERT_TYPE (ly_is_module (module), module, SCM_ARG2, __FUNCTION__, + "module"); + + Performance *p = unsmob (performance); + p->set_header (module); + return SCM_UNSPECIFIED; +} + LY_DEFINE (ly_performance_write, "ly:performance-write", - 2, 0, 0, (SCM performance, SCM filename), - "Write @var{performance} to @var{filename}.") + 3, 0, 0, (SCM performance, SCM filename, SCM name), + "Write @var{performance} to @var{filename} storing @var{name} as " + "the name of the performance in the file metadata.") { - LY_ASSERT_TYPE (unsmob_performance, performance, 1); + LY_ASSERT_SMOB (Performance, performance, 1); LY_ASSERT_TYPE (scm_is_string, filename, 2); + LY_ASSERT_TYPE (scm_is_string, name, 3); - unsmob_performance (performance)->write_output (ly_scm2string (filename)); + unsmob (performance)->write_output (ly_scm2string (filename), + ly_scm2string (name)); return SCM_UNSPECIFIED; } - diff --git a/lily/performance.cc b/lily/performance.cc index dfd23a871a..9f840efd25 100644 --- a/lily/performance.cc +++ b/lily/performance.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ using namespace std; #include "audio-column.hh" +#include "audio-item.hh" #include "audio-staff.hh" #include "file-name.hh" #include "international.hh" @@ -36,7 +37,8 @@ using namespace std; Performance::Performance (bool ports) : midi_ (0), - ports_ (ports) + ports_ (ports), + header_ (SCM_EOL) { } @@ -46,18 +48,60 @@ Performance::~Performance () } void -Performance::output (Midi_stream &midi_stream) const +Performance::derived_mark () const +{ + scm_gc_mark (header_); +} + +SCM +Performance::get_header () const +{ + return header_; +} + +void +Performance::set_header (SCM module) +{ + assert (ly_is_module (module)); + header_ = module; +} + +void +Performance::output (Midi_stream &midi_stream, + const string &performance_name) const { int tracks_ = audio_staffs_.size (); midi_stream.write (Midi_header (1, tracks_, 384)); debug_output (_ ("Track...") + " ", false); + //Find the first Audio_item in the performance, so all staves start + //at the same tick. + Moment start_mom = 0; + for (vsize i = 0; i < audio_elements_.size (); i++) + if (Audio_item *item = dynamic_cast(audio_elements_[i])) + start_mom = min (start_mom, item->audio_column_->when ()); + for (vsize i = 0; i < audio_staffs_.size (); i++) { Audio_staff *s = audio_staffs_[i]; + if (Audio_control_track_staff *c = + dynamic_cast(s)) + { + // The control track, created by Control_track_performer, should + // contain a placeholder for the name of the MIDI sequence as its + // initial audio element. Fill in the name of the sequence to + // this element before outputting MIDI. + assert (!c->audio_items_.empty ()); + Audio_text *text = + dynamic_cast(c->audio_items_.front ()); + assert (text != 0); + assert (text->type_ == Audio_text::TRACK_NAME); + assert (text->text_string_ == "control track"); + text->text_string_ = performance_name; + } debug_output ("[" + ::to_string (i), true); - s->output (midi_stream, i, ports_); + s->output (midi_stream, i, ports_, moment_to_ticks (start_mom)); debug_output ("]", false); } } @@ -69,7 +113,7 @@ Performance::add_element (Audio_element *p) } void -Performance::write_output (string out) const +Performance::write_output (string out, const string &performance_name) const { if (out == "-") out = "lelie.midi"; @@ -81,7 +125,7 @@ Performance::write_output (string out) const Midi_stream midi_stream (out); message (_f ("MIDI output to `%s'...", out)); - output (midi_stream); + output (midi_stream, performance_name); progress_indication ("\n"); } @@ -89,9 +133,3 @@ void Performance::process () { } - -Performance * -unsmob_performance (SCM x) -{ - return dynamic_cast (unsmob_music_output (x)); -} diff --git a/lily/performer-group.cc b/lily/performer-group.cc index 8a8cb4719d..5502bf0958 100644 --- a/lily/performer-group.cc +++ b/lily/performer-group.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -58,7 +58,7 @@ Performer_group::acknowledge_audio_elements () for (SCM p = get_simple_trans_list (); scm_is_pair (p); p = scm_cdr (p)) { - Translator *t = unsmob_translator (scm_car (p)); + Translator *t = unsmob (scm_car (p)); Performer *eng = dynamic_cast (t); if (eng && eng != info.origin_trans_) eng->acknowledge_audio_element (info); @@ -71,7 +71,7 @@ performer_each (SCM list, Performer_method method) { for (SCM p = list; scm_is_pair (p); p = scm_cdr (p)) { - Performer *e = dynamic_cast (unsmob_translator (scm_car (p))); + Performer *e = unsmob (scm_car (p)); if (e) (e->*method) (); } @@ -83,7 +83,7 @@ Performer_group::do_announces () for (SCM s = context ()->children_contexts (); scm_is_pair (s); s = scm_cdr (s)) { - Context *c = unsmob_context (scm_car (s)); + Context *c = unsmob (scm_car (s)); Performer_group *group = dynamic_cast (c->implementation ()); if (group) diff --git a/lily/performer.cc b/lily/performer.cc index d6ea9bd4d9..0f8b2e14b1 100644 --- a/lily/performer.cc +++ b/lily/performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -48,9 +48,3 @@ Performer::announce_element (Audio_element_info i) get_daddy_performer ()->announce_element (i); } - -Performer * -unsmob_performer (SCM perf) -{ - return dynamic_cast (unsmob_translator (perf)); -} diff --git a/lily/pfb-scheme.cc b/lily/pfb-scheme.cc index f8a6c1278f..e718a13bf0 100644 --- a/lily/pfb-scheme.cc +++ b/lily/pfb-scheme.cc @@ -1,4 +1,5 @@ +#include "international.hh" #include "program-option.hh" #include "source-file.hh" #include "memory-stream.hh" @@ -6,22 +7,35 @@ #include "main.hh" #include "warn.hh" -LY_DEFINE (ly_pfb_2_pfa, "ly:pfb->pfa", - 1, 0, 0, (SCM pfb_file_name), +LY_DEFINE (ly_type1_2_pfa, "ly:type1->pfa", + 1, 0, 0, (SCM type1_file_name), "Convert the contents of a Type@tie{}1 font in PFB format" - " to PFA format.") + " to PFA format. If the file is already in PFA format," + " pass through it.") { - LY_ASSERT_TYPE (scm_is_string, pfb_file_name, 1); + LY_ASSERT_TYPE (scm_is_string, type1_file_name, 1); - string file_name = ly_scm2string (pfb_file_name); + string file_name = ly_scm2string (type1_file_name); debug_output ("[" + file_name); // start message on a new line - vector pfb_string = gulp_file (file_name, 0); - char *pfa = pfb2pfa ((Byte *) &pfb_string[0], pfb_string.size ()); + vector type1_string = gulp_file (file_name, 0); + SCM pfa_scm; - SCM pfa_scm = scm_from_locale_string (pfa); - free (pfa); + if ((Byte) type1_string[0] == 0x80) + { + /* The file is in PFB format. Convert it to PFA format. */ + char *pfa = pfb2pfa ((Byte *) &type1_string[0], + (int) type1_string.size ()); + pfa_scm = scm_from_latin1_string (pfa); + free (pfa); + } + else + { + /* The file is in PFA format. Pass it through. */ + type1_string.push_back(0); + pfa_scm = scm_from_latin1_string (&type1_string[0]); + } debug_output ("]", false); @@ -29,20 +43,50 @@ LY_DEFINE (ly_pfb_2_pfa, "ly:pfb->pfa", } LY_DEFINE (ly_otf_2_cff, "ly:otf->cff", - 1, 0, 0, (SCM otf_file_name), + 1, 1, 0, (SCM otf_file_name, SCM idx), "Convert the contents of an OTF file to a CFF file," - " returning it as a string.") + " returning it as a string. The optional" + " @var{idx} argument is useful for OpenType/CFF collections (OTC)" + " only; it specifies the font index within the OTC. The default" + " value of @var{idx} is@tie{}0.") { LY_ASSERT_TYPE (scm_is_string, otf_file_name, 1); + int i = 0; + if (!SCM_UNBNDP (idx)) + { + LY_ASSERT_TYPE (scm_is_integer, idx, 2); + i = scm_to_int (idx); + if (i < 0) + { + warning (_ ("font index must be non-negative, using index 0")); + i = 0; + } + } + string file_name = ly_scm2string (otf_file_name); debug_output ("[" + file_name); // start message on a new line - FT_Face face = open_ft_face (file_name, 0 /* index */); + FT_Face face; + /* check whether font index is valid */ + if (i > 0) + { + face = open_ft_face (file_name, -1); + if (i >= face->num_faces) + { + warning (_f ("font index %d too large for font `%s', using index 0", + i, file_name.c_str ())); + i = 0; + } + FT_Done_Face (face); + } + + face = open_ft_face (file_name, i); string table = get_otf_table (face, "CFF "); - SCM asscm = scm_from_locale_stringn ((char *) table.data (), + SCM asscm = scm_from_latin1_stringn ((char *) table.data (), table.length ()); + FT_Done_Face (face); debug_output ("]", false); diff --git a/lily/pfb.cc b/lily/pfb.cc index 0fb1d5b76e..c971024548 100644 --- a/lily/pfb.cc +++ b/lily/pfb.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc index 6d9aac7af6..18f20f5430 100644 --- a/lily/phrasing-slur-engraver.cc +++ b/lily/phrasing-slur-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,57 +17,71 @@ along with LilyPond. If not, see . */ -#include "engraver.hh" - -#include "context.hh" -#include "directional-element-interface.hh" -#include "international.hh" -#include "note-column.hh" -#include "slur.hh" -#include "slur-proto-engraver.hh" -#include "spanner.hh" -#include "stream-event.hh" -#include "warn.hh" +#include "slur-engraver.hh" #include "translator.icc" -class Phrasing_slur_engraver : public Slur_proto_engraver +class Phrasing_slur_engraver : public Slur_engraver { -protected: - DECLARE_TRANSLATOR_LISTENER (phrasing_slur); - DECLARE_ACKNOWLEDGER (slur); + virtual SCM event_symbol () const; + virtual bool double_property () const; + virtual SCM grob_symbol () const; + virtual const char* object_name () const; + virtual void set_melisma (bool); public: TRANSLATOR_DECLARATIONS (Phrasing_slur_engraver); + TRANSLATOR_INHERIT (Slur_engraver); }; -Phrasing_slur_engraver::Phrasing_slur_engraver () : - Slur_proto_engraver (0, "PhrasingSlur", "phrasing slur", "phrasing-slur-event") +SCM +Phrasing_slur_engraver::event_symbol () const { + return ly_symbol2scm ("phrasing-slur-event"); } -IMPLEMENT_TRANSLATOR_LISTENER (Phrasing_slur_engraver, phrasing_slur); -void -Phrasing_slur_engraver::listen_phrasing_slur (Stream_event *ev) +bool +Phrasing_slur_engraver::double_property () const +{ + return false; +} + +SCM +Phrasing_slur_engraver::grob_symbol () const +{ + return ly_symbol2scm ("PhrasingSlur"); +} + +const char * +Phrasing_slur_engraver::object_name () const +{ + return "phrasing slur"; +} + +Phrasing_slur_engraver::Phrasing_slur_engraver () { - internal_listen_slur (ev); } void -Phrasing_slur_engraver::acknowledge_slur (Grob_info info) +Phrasing_slur_engraver::set_melisma (bool) { - acknowledge_extra_object (info); } -ADD_ACKNOWLEDGER (Phrasing_slur_engraver, inline_accidental); -ADD_ACKNOWLEDGER (Phrasing_slur_engraver, fingering) -ADD_ACKNOWLEDGER (Phrasing_slur_engraver, note_column); -ADD_ACKNOWLEDGER (Phrasing_slur_engraver, slur); -ADD_ACKNOWLEDGER (Phrasing_slur_engraver, script); -ADD_ACKNOWLEDGER (Phrasing_slur_engraver, dots); -ADD_ACKNOWLEDGER (Phrasing_slur_engraver, text_script); -ADD_END_ACKNOWLEDGER (Phrasing_slur_engraver, tie); -ADD_ACKNOWLEDGER (Phrasing_slur_engraver, tuplet_number); +void +Phrasing_slur_engraver::boot () +{ + ADD_LISTENER_FOR (Phrasing_slur_engraver, slur, phrasing_slur); + ADD_LISTENER (Phrasing_slur_engraver, note); + ADD_ACKNOWLEDGER_FOR (Phrasing_slur_engraver, extra_object, inline_accidental); + ADD_ACKNOWLEDGER_FOR (Phrasing_slur_engraver, extra_object, fingering); + ADD_ACKNOWLEDGER (Phrasing_slur_engraver, note_column); + ADD_ACKNOWLEDGER_FOR (Phrasing_slur_engraver, extra_object, slur); + ADD_ACKNOWLEDGER (Phrasing_slur_engraver, script); + ADD_ACKNOWLEDGER_FOR (Phrasing_slur_engraver, extra_object, dots); + ADD_ACKNOWLEDGER_FOR (Phrasing_slur_engraver, extra_object, text_script); + ADD_END_ACKNOWLEDGER_FOR (Phrasing_slur_engraver, extra_object, tie); + ADD_ACKNOWLEDGER_FOR (Phrasing_slur_engraver, extra_object, tuplet_number); +} ADD_TRANSLATOR (Phrasing_slur_engraver, /* doc */ diff --git a/lily/piano-pedal-align-engraver.cc b/lily/piano-pedal-align-engraver.cc index 3111592599..7c120a1bc1 100644 --- a/lily/piano-pedal-align-engraver.cc +++ b/lily/piano-pedal-align-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -27,6 +27,8 @@ #include "warn.hh" #include "axis-group-interface.hh" +#include "translator.icc" + /* TODO: @@ -74,11 +76,11 @@ public: protected: virtual void finalize (); - DECLARE_ACKNOWLEDGER (piano_pedal_script); - DECLARE_ACKNOWLEDGER (piano_pedal_bracket); - DECLARE_ACKNOWLEDGER (note_column); + void acknowledge_piano_pedal_script (Grob_info); + void acknowledge_piano_pedal_bracket (Grob_info); + void acknowledge_note_column (Grob_info); - DECLARE_END_ACKNOWLEDGER (piano_pedal_bracket); + void acknowledge_end_piano_pedal_bracket (Grob_info); void stop_translation_timestep (); void start_translation_timestep (); @@ -238,7 +240,7 @@ Piano_pedal_align_engraver::finalize () if (pedal_info_[i].line_spanner_) { SCM cc = get_property ("currentCommandColumn"); - Item *c = unsmob_item (cc); + Item *c = unsmob (cc); pedal_info_[i].line_spanner_->set_bound (RIGHT, c); pedal_info_[i].clear (); @@ -246,13 +248,16 @@ Piano_pedal_align_engraver::finalize () } } -#include "translator.icc" -ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, note_column); -ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket); -ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_script); -ADD_END_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket); +void +Piano_pedal_align_engraver::boot () +{ + ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, note_column); + ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket); + ADD_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_script); + ADD_END_ACKNOWLEDGER (Piano_pedal_align_engraver, piano_pedal_bracket); +} ADD_TRANSLATOR (Piano_pedal_align_engraver, /* doc */ diff --git a/lily/piano-pedal-bracket.cc b/lily/piano-pedal-bracket.cc index 89a97fb4e3..b47e5e3b6d 100644 --- a/lily/piano-pedal-bracket.cc +++ b/lily/piano-pedal-bracket.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Han-Wen Nienhuys + Copyright (C) 2003--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,14 +26,13 @@ struct Piano_pedal_bracket { DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_GROB_INTERFACE (); }; MAKE_SCHEME_CALLBACK (Piano_pedal_bracket, print, 1); SCM Piano_pedal_bracket::print (SCM smob) { - Spanner *me = dynamic_cast (unsmob_grob (smob)); + Spanner *me = unsmob (smob); Spanner *orig = dynamic_cast (me->original ()); Drul_array broken (false, false); @@ -46,7 +45,7 @@ Piano_pedal_bracket::print (SCM smob) Grob *common = me->get_bound (LEFT) ->common_refpoint (me->get_bound (RIGHT), X_AXIS); - Grob *textbit = unsmob_grob (me->get_object ("pedal-text")); + Grob *textbit = unsmob (me->get_object ("pedal-text")); if (textbit) common = common->common_refpoint (textbit, X_AXIS); diff --git a/lily/piano-pedal-engraver.cc b/lily/piano-pedal-engraver.cc index c976863e02..cbdf5244d1 100644 --- a/lily/piano-pedal-engraver.cc +++ b/lily/piano-pedal-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen , + Copyright (C) 2000--2015 Jan Nieuwenhuizen , Erik Sandberg Chris Jackson - extended to support @@ -123,9 +123,9 @@ public: protected: virtual void initialize (); virtual void finalize (); - DECLARE_TRANSLATOR_LISTENER (sustain); - DECLARE_TRANSLATOR_LISTENER (una_corda); - DECLARE_TRANSLATOR_LISTENER (sostenuto); + void listen_sustain (Stream_event *); + void listen_una_corda (Stream_event *); + void listen_sostenuto (Stream_event *); void stop_translation_timestep (); void process_music (); @@ -166,9 +166,9 @@ init_pedal_types () be careful, as we don't want to loose references to the _sym_ members. */ Pedal_type_info info; - info.event_class_sym_ = scm_from_locale_symbol ((base_ident + "-event").c_str ()); - info.style_sym_ = scm_from_locale_symbol (("pedal" + base_name + "Style").c_str ()); - info.strings_sym_ = scm_from_locale_symbol (("pedal" + base_name + "Strings").c_str ()); + info.event_class_sym_ = scm_from_ascii_symbol ((base_ident + "-event").c_str ()); + info.style_sym_ = scm_from_ascii_symbol (("pedal" + base_name + "Style").c_str ()); + info.strings_sym_ = scm_from_ascii_symbol (("pedal" + base_name + "Strings").c_str ()); info.base_name_ = name; info.pedal_c_str_ = strdup ((base_name + "Pedal").c_str ()); @@ -205,7 +205,6 @@ Piano_pedal_engraver::initialize () info_list_[NUM_PEDAL_TYPES].type_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Piano_pedal_engraver, sostenuto); void Piano_pedal_engraver::listen_sostenuto (Stream_event *ev) { @@ -213,7 +212,6 @@ Piano_pedal_engraver::listen_sostenuto (Stream_event *ev) ASSIGN_EVENT_ONCE (info_list_[SOSTENUTO].event_drul_[d], ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Piano_pedal_engraver, sustain); void Piano_pedal_engraver::listen_sustain (Stream_event *ev) { @@ -221,7 +219,6 @@ Piano_pedal_engraver::listen_sustain (Stream_event *ev) ASSIGN_EVENT_ONCE (info_list_[SUSTAIN].event_drul_[d], ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Piano_pedal_engraver, una_corda); void Piano_pedal_engraver::listen_una_corda (Stream_event *ev) { @@ -249,13 +246,13 @@ Piano_pedal_engraver::process_music () mixed: Ped. _____/\____| */ - SCM style = internal_get_property (p->type_->style_sym_); + SCM style = get_property (p->type_->style_sym_); - bool mixed = style == ly_symbol2scm ("mixed"); + bool mixed = scm_is_eq (style, ly_symbol2scm ("mixed")); bool bracket = (mixed - || style == ly_symbol2scm ("bracket")); - bool text = (style == ly_symbol2scm ("text") - || mixed); + || scm_is_eq (style, ly_symbol2scm ("bracket"))); + bool text = (mixed + || scm_is_eq (style, ly_symbol2scm ("text"))); if (text && !p->item_) create_text_grobs (p, mixed); @@ -269,7 +266,7 @@ void Piano_pedal_engraver::create_text_grobs (Pedal_info *p, bool mixed) { SCM s = SCM_EOL; - SCM strings = internal_get_property (p->type_->strings_sym_); + SCM strings = get_property (p->type_->strings_sym_); if (scm_ilength (strings) < 3) { @@ -346,7 +343,7 @@ Piano_pedal_engraver::create_bracket_grobs (Pedal_info *p, bool mixed) { assert (!p->finished_bracket_); - Grob *cmc = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *cmc = unsmob (get_property ("currentMusicalColumn")); p->bracket_->set_bound (RIGHT, cmc); /* @@ -424,7 +421,7 @@ Piano_pedal_engraver::finalize () if (p->bracket_) { SCM cc = get_property ("currentCommandColumn"); - Item *c = unsmob_item (cc); + Item *c = unsmob (cc); p->bracket_->set_bound (RIGHT, c); p->finished_bracket_ = p->bracket_; @@ -444,7 +441,7 @@ Piano_pedal_engraver::stop_translation_timestep () typeset_all (p); if (p->bracket_ && !p->bracket_->get_bound (LEFT)) { - Grob *cmc = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *cmc = unsmob (get_property ("currentMusicalColumn")); p->bracket_->set_bound (LEFT, cmc); } } @@ -473,12 +470,20 @@ Piano_pedal_engraver::typeset_all (Pedal_info *p) { Grob *r = p->finished_bracket_->get_bound (RIGHT); if (!r) - p->finished_bracket_->set_bound (RIGHT, unsmob_grob (get_property ("currentMusicalColumn"))); + p->finished_bracket_->set_bound (RIGHT, unsmob (get_property ("currentMusicalColumn"))); p->finished_bracket_ = 0; } } +void +Piano_pedal_engraver::boot () +{ + ADD_LISTENER (Piano_pedal_engraver, sostenuto); + ADD_LISTENER (Piano_pedal_engraver, sustain); + ADD_LISTENER (Piano_pedal_engraver, una_corda); +} + ADD_TRANSLATOR (Piano_pedal_engraver, /* doc */ "Engrave piano pedal symbols and brackets.", diff --git a/lily/piano-pedal-performer.cc b/lily/piano-pedal-performer.cc index dd288025dd..a8273980e9 100644 --- a/lily/piano-pedal-performer.cc +++ b/lily/piano-pedal-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,9 +48,9 @@ protected: void process_music (); void stop_translation_timestep (); void start_translation_timestep (); - DECLARE_TRANSLATOR_LISTENER (sustain); - DECLARE_TRANSLATOR_LISTENER (una_corda); - DECLARE_TRANSLATOR_LISTENER (sostenuto); + void listen_sustain (Stream_event *); + void listen_una_corda (Stream_event *); + void listen_sostenuto (Stream_event *); private: vector audios_; Pedal_info info_alist_[NUM_PEDAL_TYPES]; @@ -146,7 +146,6 @@ Piano_pedal_performer::start_translation_timestep () } } -IMPLEMENT_TRANSLATOR_LISTENER (Piano_pedal_performer, sostenuto); void Piano_pedal_performer::listen_sostenuto (Stream_event *r) { @@ -154,7 +153,6 @@ Piano_pedal_performer::listen_sostenuto (Stream_event *r) info_alist_[SOSTENUTO].event_drul_[d] = r; } -IMPLEMENT_TRANSLATOR_LISTENER (Piano_pedal_performer, sustain); void Piano_pedal_performer::listen_sustain (Stream_event *r) { @@ -162,7 +160,6 @@ Piano_pedal_performer::listen_sustain (Stream_event *r) info_alist_[SUSTAIN].event_drul_[d] = r; } -IMPLEMENT_TRANSLATOR_LISTENER (Piano_pedal_performer, una_corda); void Piano_pedal_performer::listen_una_corda (Stream_event *r) { @@ -170,6 +167,14 @@ Piano_pedal_performer::listen_una_corda (Stream_event *r) info_alist_[UNA_CORDA].event_drul_[d] = r; } +void +Piano_pedal_performer::boot () +{ + ADD_LISTENER (Piano_pedal_performer, sostenuto); + ADD_LISTENER (Piano_pedal_performer, sustain); + ADD_LISTENER (Piano_pedal_performer, una_corda); +} + ADD_TRANSLATOR (Piano_pedal_performer, /* doc */ "", diff --git a/lily/pitch-interval.cc b/lily/pitch-interval.cc index 084084e4f9..3a5670be50 100644 --- a/lily/pitch-interval.cc +++ b/lily/pitch-interval.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,8 +29,8 @@ Pitch_interval::Pitch_interval (Pitch p1, Pitch p2) Pitch_interval::Pitch_interval () { - at (LEFT) = Pitch (100, 0, 0); - at (RIGHT) = Pitch (-100, 0, 0); + at (LEFT) = Pitch (100, 0); + at (RIGHT) = Pitch (-100, 0); } bool @@ -64,8 +64,8 @@ Pitch_lexicographic_interval::Pitch_lexicographic_interval (Pitch p1, Pitch p2) Pitch_lexicographic_interval::Pitch_lexicographic_interval () { - at (LEFT) = Pitch (100, 0, 0); - at (RIGHT) = Pitch (-100, 0, 0); + at (LEFT) = Pitch (100, 0); + at (RIGHT) = Pitch (-100, 0); } bool diff --git a/lily/pitch-scheme.cc b/lily/pitch-scheme.cc index 238d235e72..7b4d1e3929 100644 --- a/lily/pitch-scheme.cc +++ b/lily/pitch-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,8 +27,8 @@ LY_DEFINE (ly_pitch_transpose, "ly:pitch-transpose", LY_ASSERT_SMOB (Pitch, p, 1); LY_ASSERT_SMOB (Pitch, delta, 2); - Pitch *t = unsmob_pitch (p); - Pitch *d = unsmob_pitch (delta); + Pitch *t = unsmob (p); + Pitch *d = unsmob (delta); return t->transposed (*d).smobbed_copy (); } @@ -59,7 +59,7 @@ LY_DEFINE (ly_pitch_negate, "ly:pitch-negate", 1, 0, 0, "Negate @var{p}.") { LY_ASSERT_SMOB (Pitch, p, 1); - Pitch *pp = unsmob_pitch (p); + Pitch *pp = unsmob (p); return pp->negated ().smobbed_copy (); } @@ -69,7 +69,7 @@ LY_DEFINE (ly_pitch_steps, "ly:pitch-steps", 1, 0, 0, " pitch@tie{}@var{p}.") { LY_ASSERT_SMOB (Pitch, p, 1); - Pitch *pp = unsmob_pitch (p); + Pitch *pp = unsmob (p); return scm_from_int (pp->steps ()); } @@ -78,7 +78,7 @@ LY_DEFINE (ly_pitch_octave, "ly:pitch-octave", "Extract the octave from pitch@tie{}@var{pp}.") { LY_ASSERT_SMOB (Pitch, pp, 1); - Pitch *p = unsmob_pitch (pp); + Pitch *p = unsmob (pp); int q = p->get_octave (); return scm_from_int (q); } @@ -88,7 +88,7 @@ LY_DEFINE (ly_pitch_alteration, "ly:pitch-alteration", "Extract the alteration from pitch@tie{}@var{pp}.") { LY_ASSERT_SMOB (Pitch, pp, 1); - Pitch *p = unsmob_pitch (pp); + Pitch *p = unsmob (pp); Rational q = p->get_alteration (); return ly_rational2scm (q); @@ -99,7 +99,7 @@ LY_DEFINE (ly_pitch_notename, "ly:pitch-notename", "Extract the note name from pitch @var{pp}.") { LY_ASSERT_SMOB (Pitch, pp, 1); - Pitch *p = unsmob_pitch (pp); + Pitch *p = unsmob (pp); int q = p->get_notename (); return scm_from_int (q); } @@ -110,7 +110,7 @@ LY_DEFINE (ly_pitch_tones, "ly:pitch-tones", " middle@tie{}C as a rational number.") { LY_ASSERT_SMOB (Pitch, pp, 1); - return ly_rational2scm (unsmob_pitch (pp)->tone_pitch ()); + return ly_rational2scm (unsmob (pp)->tone_pitch ()); } LY_DEFINE (ly_pitch_quartertones, "ly:pitch-quartertones", @@ -119,7 +119,7 @@ LY_DEFINE (ly_pitch_quartertones, "ly:pitch-quartertones", " middle@tie{}C.") { LY_ASSERT_SMOB (Pitch, pp, 1); - Pitch *p = unsmob_pitch (pp); + Pitch *p = unsmob (pp); int q = p->rounded_quartertone_pitch (); return scm_from_int (q); } @@ -130,7 +130,7 @@ LY_DEFINE (ly_pitch_semitones, "ly:pitch-semitones", " middle@tie{}C.") { LY_ASSERT_SMOB (Pitch, pp, 1); - Pitch *p = unsmob_pitch (pp); + Pitch *p = unsmob (pp); int q = p->rounded_semitone_pitch (); return scm_from_int (q); } @@ -142,8 +142,8 @@ LY_DEFINE (ly_pitch_less_p, "ly:pitch (p1); + Pitch *b = unsmob (p2); if (Pitch::compare (*a, *b) < 0) return SCM_BOOL_T; @@ -153,15 +153,15 @@ LY_DEFINE (ly_pitch_less_p, "ly:pitch (pitch); + Pitch *r = unsmob (root); return pitch_interval (*r, *p).smobbed_copy (); } @@ -176,7 +176,7 @@ LY_DEFINE (ly_set_middle_C_x, "ly:set-middle-C!", { LY_ASSERT_SMOB (Context, context, 1); - Context *c = unsmob_context (context); + Context *c = unsmob (context); int clef_pos = robust_scm2int (c->get_property ("middleCClefPosition"), 0); int offset = robust_scm2int (c->get_property ("middleCOffset"), 0); /* middleCCuePosition overrides the clef! */ diff --git a/lily/pitch-squash-engraver.cc b/lily/pitch-squash-engraver.cc index d52b02dee9..0750c59495 100644 --- a/lily/pitch-squash-engraver.cc +++ b/lily/pitch-squash-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ class Pitch_squash_engraver : public Engraver { public: TRANSLATOR_DECLARATIONS (Pitch_squash_engraver); - DECLARE_ACKNOWLEDGER (note_head); + void acknowledge_note_head (Grob_info); }; void @@ -44,7 +44,12 @@ Pitch_squash_engraver::Pitch_squash_engraver () } #include "translator.icc" -ADD_ACKNOWLEDGER (Pitch_squash_engraver, note_head); +void +Pitch_squash_engraver::boot () +{ + ADD_ACKNOWLEDGER (Pitch_squash_engraver, note_head); +} + ADD_TRANSLATOR (Pitch_squash_engraver, /* doc */ "Set the vertical position of note heads to" diff --git a/lily/pitch.cc b/lily/pitch.cc index b26076a008..9e46bba70e 100644 --- a/lily/pitch.cc +++ b/lily/pitch.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,7 +24,6 @@ #include "string-convert.hh" #include "warn.hh" -#include "ly-smobs.icc" #include Pitch::Pitch (int o, int n, Rational a) @@ -219,21 +218,19 @@ Pitch::down_to (int notename) notename_ = notename; } -IMPLEMENT_TYPE_P (Pitch, "ly:pitch?"); +const char * const Pitch::type_p_name_ = "ly:pitch?"; + SCM -Pitch::mark_smob (SCM x) +Pitch::mark_smob () const { - Pitch *p = (Pitch *) SCM_CELL_WORD_1 (x); - return p->scale_->self_scm (); + return scale_->self_scm (); } -IMPLEMENT_SIMPLE_SMOBS (Pitch); int -Pitch::print_smob (SCM s, SCM port, scm_print_state *) +Pitch::print_smob (SCM port, scm_print_state *) const { - Pitch *r = (Pitch *) SCM_CELL_WORD_1 (s); scm_puts ("#to_string ()), port); + scm_display (ly_string2scm (to_string ()), port); scm_puts (" >", port); return 1; } @@ -255,8 +252,8 @@ MAKE_SCHEME_CALLBACK (Pitch, less_p, 2); SCM Pitch::less_p (SCM p1, SCM p2) { - Pitch *a = unsmob_pitch (p1); - Pitch *b = unsmob_pitch (p2); + Pitch *a = unsmob (p1); + Pitch *b = unsmob (p2); if (compare (*a, *b) < 0) return SCM_BOOL_T; diff --git a/lily/pitched-trill-engraver.cc b/lily/pitched-trill-engraver.cc index c2a02e71d9..1ec4da9aeb 100644 --- a/lily/pitched-trill-engraver.cc +++ b/lily/pitched-trill-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,17 +30,19 @@ #include "stream-event.hh" #include "warn.hh" +#include "translator.icc" + class Pitched_trill_engraver : public Engraver { public: TRANSLATOR_DECLARATIONS (Pitched_trill_engraver); protected: - DECLARE_ACKNOWLEDGER (note_head); - DECLARE_ACKNOWLEDGER (dots); - DECLARE_ACKNOWLEDGER (stem); - DECLARE_ACKNOWLEDGER (flag); - DECLARE_ACKNOWLEDGER (trill_spanner); + void acknowledge_note_head (Grob_info); + void acknowledge_dots (Grob_info); + void acknowledge_stem (Grob_info); + void acknowledge_flag (Grob_info); + void acknowledge_trill_spanner (Grob_info); void stop_translation_timestep (); private: @@ -88,7 +90,7 @@ Pitched_trill_engraver::acknowledge_trill_spanner (Grob_info info) if (ev && ev->in_event_class ("trill-span-event") && to_dir (ev->get_property ("span-direction")) == START - && unsmob_pitch (ev->get_property ("pitch"))) + && unsmob (ev->get_property ("pitch"))) make_trill (ev); } @@ -96,9 +98,9 @@ void Pitched_trill_engraver::make_trill (Stream_event *ev) { SCM scm_pitch = ev->get_property ("pitch"); - Pitch *p = unsmob_pitch (scm_pitch); + Pitch *p = unsmob (scm_pitch); - SCM keysig = get_property ("localKeySignature"); + SCM keysig = get_property ("localAlterations"); SCM key = scm_cons (scm_from_int (p->get_octave ()), scm_from_int (p->get_notename ())); @@ -106,7 +108,7 @@ Pitched_trill_engraver::make_trill (Stream_event *ev) int bn = measure_number (context ()); SCM handle = scm_assoc (key, keysig); - if (handle != SCM_BOOL_F) + if (scm_is_true (handle)) { bool same_bar = (bn == robust_scm2int (scm_caddr (handle), 0)); bool same_alt @@ -116,9 +118,9 @@ Pitched_trill_engraver::make_trill (Stream_event *ev) handle = SCM_BOOL_F; } - bool print_acc - = (handle == SCM_BOOL_F) || p->get_alteration () == Rational (0) - || (ev->get_property ("force-accidental") == SCM_BOOL_T); + bool print_acc = scm_is_false (handle) + || p->get_alteration () == Rational (0) + || to_boolean (ev->get_property ("force-accidental")); if (trill_head_) { @@ -132,7 +134,7 @@ Pitched_trill_engraver::make_trill (Stream_event *ev) int c0 = scm_is_number (c0scm) ? scm_to_int (c0scm) : 0; trill_head_->set_property ("staff-position", - scm_from_int (unsmob_pitch (scm_pitch)->steps () + scm_from_int (unsmob (scm_pitch)->steps () + c0)); trill_group_ = make_item ("TrillPitchGroup", ev->self_scm ()); @@ -167,13 +169,16 @@ Pitched_trill_engraver::stop_translation_timestep () trill_accidental_ = 0; } -#include "translator.icc" -ADD_ACKNOWLEDGER (Pitched_trill_engraver, note_head); -ADD_ACKNOWLEDGER (Pitched_trill_engraver, dots); -ADD_ACKNOWLEDGER (Pitched_trill_engraver, stem); -ADD_ACKNOWLEDGER (Pitched_trill_engraver, flag); -ADD_ACKNOWLEDGER (Pitched_trill_engraver, trill_spanner); +void +Pitched_trill_engraver::boot () +{ + ADD_ACKNOWLEDGER (Pitched_trill_engraver, note_head); + ADD_ACKNOWLEDGER (Pitched_trill_engraver, dots); + ADD_ACKNOWLEDGER (Pitched_trill_engraver, stem); + ADD_ACKNOWLEDGER (Pitched_trill_engraver, flag); + ADD_ACKNOWLEDGER (Pitched_trill_engraver, trill_spanner); +} ADD_TRANSLATOR (Pitched_trill_engraver, /* doc */ diff --git a/lily/pointer-group-interface-scheme.cc b/lily/pointer-group-interface-scheme.cc index 0c786f4488..a111aad58c 100644 --- a/lily/pointer-group-interface-scheme.cc +++ b/lily/pointer-group-interface-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Han-Wen Nienhuys + Copyright (C) 2010--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,13 +24,13 @@ LY_DEFINE (ly_pointer_group_interface__add_grob, "ly:pointer-group-interface::ad 3, 0, 0, (SCM grob, SCM sym, SCM grob_element), "Add @var{grob-element} to @var{grob}'s @var{sym} grob array.") { - LY_ASSERT_TYPE (unsmob_grob, grob, 1); + LY_ASSERT_SMOB (Grob, grob, 1); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); - LY_ASSERT_TYPE (unsmob_grob, grob_element, 3); + LY_ASSERT_SMOB (Grob, grob_element, 3); - Pointer_group_interface::add_grob (unsmob_grob (grob), + Pointer_group_interface::add_grob (unsmob (grob), sym, - unsmob_grob (grob_element)); + unsmob (grob_element)); return SCM_UNSPECIFIED; } diff --git a/lily/pointer-group-interface.cc b/lily/pointer-group-interface.cc index 045563d457..2720fcf91a 100644 --- a/lily/pointer-group-interface.cc +++ b/lily/pointer-group-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,14 +25,14 @@ int Pointer_group_interface::count (Grob *me, SCM sym) { - Grob_array *arr = unsmob_grob_array (me->internal_get_object (sym)); + Grob_array *arr = unsmob (me->internal_get_object (sym)); return arr ? arr->size () : 0; } void Pointer_group_interface::add_grob (Grob *me, SCM sym, SCM p) { - add_grob (me, sym, unsmob_grob (p)); + add_grob (me, sym, unsmob (p)); } void @@ -46,11 +46,11 @@ Grob_array * Pointer_group_interface::get_grob_array (Grob *me, SCM sym) { SCM scm_arr = me->internal_get_object (sym); - Grob_array *arr = unsmob_grob_array (scm_arr); + Grob_array *arr = unsmob (scm_arr); if (!arr) { scm_arr = Grob_array::make_array (); - arr = unsmob_grob_array (scm_arr); + arr = unsmob (scm_arr); me->set_object (sym, scm_arr); } return arr; @@ -88,7 +88,7 @@ static vector empty_array; vector const & ly_scm2link_array (SCM x) { - Grob_array *arr = unsmob_grob_array (x); + Grob_array *arr = unsmob (x); return arr ? arr->array () : empty_array; } @@ -103,7 +103,7 @@ internal_extract_grob_array (Grob const *elt, SCM symbol) vector internal_extract_item_array (Grob const *elt, SCM symbol) { - Grob_array *arr = unsmob_grob_array (elt->internal_get_object (symbol)); + Grob_array *arr = unsmob (elt->internal_get_object (symbol)); vector items; for (vsize i = 0; arr && i < arr->size (); i++) items.push_back (arr->item (i)); diff --git a/lily/prob-scheme.cc b/lily/prob-scheme.cc index 30704f5fc6..03c84eca4d 100644 --- a/lily/prob-scheme.cc +++ b/lily/prob-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,7 +24,7 @@ LY_DEFINE (ly_prob_set_property_x, "ly:prob-set-property!", "Set property @var{sym} of @var{obj} to @var{value}.") { LY_ASSERT_SMOB (Prob, obj, 1); - Prob *ps = unsmob_prob (obj); + Prob *ps = unsmob (obj); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); ps->set_property (sym, value); @@ -48,14 +48,14 @@ LY_DEFINE (ly_prob_property, "ly:prob-property", " @code{'()} if @var{val} is not specified.") { LY_ASSERT_SMOB (Prob, prob, 1); - Prob *ps = unsmob_prob (prob); + Prob *ps = unsmob (prob); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); - if (val == SCM_UNDEFINED) + if (SCM_UNBNDP (val)) val = SCM_EOL; - SCM retval = ps->internal_get_property (sym); - if (retval == SCM_EOL) + SCM retval = ps->get_property (sym); + if (scm_is_null (retval)) return val; else return retval; @@ -66,7 +66,7 @@ LY_DEFINE (ly_prob_type_p, "ly:prob-type?", (SCM obj, SCM type), "Is @var{obj} the specified prob-type?") { - Prob *prob = unsmob_prob (obj); + Prob *prob = unsmob (obj); return scm_from_bool (prob && prob->type () == type); } @@ -95,7 +95,7 @@ LY_DEFINE (ly_prob_mutable_properties, "ly:prob-mutable-properties", "Retrieve an alist of mutable properties.") { LY_ASSERT_SMOB (Prob, prob, 1); - Prob *ps = unsmob_prob (prob); + Prob *ps = unsmob (prob); return ps->get_property_alist (true); } @@ -105,7 +105,7 @@ LY_DEFINE (ly_prob_immutable_properties, "ly:prob-immutable-properties", "Retrieve an alist of immutable properties.") { LY_ASSERT_SMOB (Prob, prob, 1); - Prob *ps = unsmob_prob (prob); + Prob *ps = unsmob (prob); return ps->get_property_alist (false); } diff --git a/lily/prob.cc b/lily/prob.cc index 367d1616a7..d05a33e4f3 100644 --- a/lily/prob.cc +++ b/lily/prob.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Jan Nieuwenhuizen + Copyright (C) 2004--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,10 +23,8 @@ #include "input.hh" #include "profile.hh" -#include "ly-smobs.icc" -IMPLEMENT_SMOBS (Prob); -IMPLEMENT_TYPE_P (Prob, "ly:prob?"); +const char * const Prob::type_p_name_ = "ly:prob?"; SCM Prob::equal_p (SCM sa, SCM sb) @@ -38,7 +36,7 @@ Prob::equal_p (SCM sa, SCM sb) equality; e.g., that two probs are equal iff they can be distinguished by calls to ly:prob-property. */ - Prob *probs[2] = {unsmob_prob (sa), unsmob_prob (sb)}; + Prob *probs[2] = {unsmob (sa), unsmob (sb)}; SCM props[2][2]; int i; @@ -63,24 +61,22 @@ Prob::equal_p (SCM sa, SCM sb) { SCM aval = scm_cdar (aprop); SCM bval = scm_cdar (bprop); - if (scm_caar (aprop) != scm_caar (bprop) - || (!(unsmob_input (aval) && unsmob_input (bval)) - && - !to_boolean (scm_equal_p (aval, bval)))) + if (!scm_is_eq (scm_caar (aprop), scm_caar (bprop)) + || (!(unsmob (aval) && unsmob (bval)) + && !ly_is_equal (aval, bval))) return SCM_BOOL_F; } /* is one list shorter? */ - if (aprop != SCM_EOL || bprop != SCM_EOL) + if (!scm_is_null (aprop) || !scm_is_null (bprop)) return SCM_BOOL_F; } return SCM_BOOL_T; } -Prob::Prob (SCM type, SCM immutable_init) +Prob::Prob (SCM type, SCM immutable_init) : Smob () { - self_scm_ = SCM_EOL; mutable_property_alist_ = SCM_EOL; immutable_property_alist_ = immutable_init; type_ = type; @@ -92,10 +88,10 @@ Prob::~Prob () } Prob::Prob (Prob const &src) + : Smob () { immutable_property_alist_ = src.immutable_property_alist_; mutable_property_alist_ = SCM_EOL; - self_scm_ = SCM_EOL; type_ = src.type_; /* First we smobify_self, then we copy over the stuff. If we don't, @@ -117,28 +113,26 @@ Prob::derived_mark () const } SCM -Prob::mark_smob (SCM smob) +Prob::mark_smob () const { - ASSERT_LIVE_IS_ALLOWED (smob); + ASSERT_LIVE_IS_ALLOWED (self_scm ()); - Prob *system = (Prob *) SCM_CELL_WORD_1 (smob); - scm_gc_mark (system->mutable_property_alist_); - system->derived_mark (); + scm_gc_mark (mutable_property_alist_); + derived_mark (); - return system->immutable_property_alist_; + return immutable_property_alist_; } int -Prob::print_smob (SCM smob, SCM port, scm_print_state *) +Prob::print_smob (SCM port, scm_print_state *) const { - Prob *p = (Prob *) SCM_CELL_WORD_1 (smob); scm_puts ("#<", port); scm_puts ("Prob: ", port); - scm_display (p->type_, port); + scm_display (type_, port); scm_puts (" C++: ", port); - scm_puts (p->class_name (), port); - scm_display (p->mutable_property_alist_, port); - scm_display (p->immutable_property_alist_, port); + scm_puts (class_name (), port); + scm_display (mutable_property_alist_, port); + scm_display (immutable_property_alist_, port); scm_puts (" >\n", port); return 1; @@ -147,7 +141,7 @@ Prob::print_smob (SCM smob, SCM port, scm_print_state *) SCM Prob::internal_get_property (SCM sym) const { -#ifndef NDEBUG +#ifdef DEBUG if (profile_property_accesses) note_property_access (&prob_property_lookup_table, sym); #endif @@ -156,11 +150,11 @@ Prob::internal_get_property (SCM sym) const TODO: type checking */ SCM s = scm_sloppy_assq (sym, mutable_property_alist_); - if (s != SCM_BOOL_F) + if (scm_is_true (s)) return scm_cdr (s); s = scm_sloppy_assq (sym, immutable_property_alist_); - return (s == SCM_BOOL_F) ? SCM_EOL : scm_cdr (s); + return scm_is_false (s) ? SCM_EOL : scm_cdr (s); } /* We don't (yet) instrument probs */ @@ -198,6 +192,5 @@ Prob::name () const if (scm_is_symbol (nm)) return ly_symbol2string (nm); else - return this->class_name (); + return class_name (); } - diff --git a/lily/profile.cc b/lily/profile.cc index d621564e47..025bea809b 100644 --- a/lily/profile.cc +++ b/lily/profile.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,13 +31,13 @@ LY_DEFINE (ly_property_lookup_stats, "ly:property-lookup-stats", " @var{sym}. Choices are @code{prob}, @code{grob}, and" " @code{context}.") { - if (sym == ly_symbol2scm ("context")) + if (scm_is_eq (sym, ly_symbol2scm ("context"))) return context_property_lookup_table ? context_property_lookup_table : scm_c_make_hash_table (1); - if (sym == ly_symbol2scm ("prob")) + if (scm_is_eq (sym, ly_symbol2scm ("prob"))) return prob_property_lookup_table ? prob_property_lookup_table : scm_c_make_hash_table (1); - if (sym == ly_symbol2scm ("grob")) + if (scm_is_eq (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); @@ -53,7 +53,7 @@ note_property_access (SCM *table, SCM sym) *table = scm_permanent_object (scm_c_make_hash_table (259)); SCM hashhandle = scm_hashq_get_handle (*table, sym); - if (hashhandle == SCM_BOOL_F) + if (scm_is_false (hashhandle)) { scm_hashq_set_x (*table, sym, scm_from_int (0)); hashhandle = scm_hashq_get_handle (*table, sym); diff --git a/lily/program-option-scheme.cc b/lily/program-option-scheme.cc index 302b48e3f4..3934217fb3 100644 --- a/lily/program-option-scheme.cc +++ b/lily/program-option-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,6 +29,7 @@ using namespace std; #include "parse-scm.hh" #include "string-convert.hh" #include "warn.hh" +#include "lily-imports.hh" bool debug_skylines; bool debug_property_callbacks; @@ -136,7 +137,6 @@ static string get_help_string () { SCM alist = ly_hash2alist (option_hash); - SCM converter = ly_lily_module_constant ("scm->string"); vector opts; @@ -147,7 +147,7 @@ get_help_string () string opt_spec = String_convert::char_string (' ', INDENT) + ly_symbol2string (sym) + " (" - + ly_scm2string (scm_call_1 (converter, val)) + + ly_scm2string (Lily::scm_to_string (val)) + ")"; if (opt_spec.length () + SEPARATION > HELP_INDENT) @@ -208,7 +208,7 @@ LY_DEFINE (ly_set_option, "ly:set-option", 1, 1, 0, (SCM var, SCM val), { LY_ASSERT_TYPE (ly_is_symbol, var, 1); - if (val == SCM_UNDEFINED) + if (SCM_UNBNDP (val)) val = SCM_BOOL_T; string varstr = robust_symbol2string (var, ""); @@ -219,7 +219,7 @@ LY_DEFINE (ly_set_option, "ly:set-option", 1, 1, 0, (SCM var, SCM val), } SCM handle = scm_hashq_get_handle (option_hash, var); - if (handle == SCM_BOOL_F) + if (scm_is_false (handle)) warning (_f ("no such internal option: %s", varstr.c_str ())); internal_set_option (var, val); diff --git a/lily/program-option.cc b/lily/program-option.cc index 51d8ca82d8..21fc5c166c 100644 --- a/lily/program-option.cc +++ b/lily/program-option.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify diff --git a/lily/property-iterator.cc b/lily/property-iterator.cc index 6352f16399..4725406323 100644 --- a/lily/property-iterator.cc +++ b/lily/property-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,60 +35,26 @@ Property_iterator::process (Moment mom) { Context *o = get_outlet (); Music *m = get_music (); - bool once = to_boolean (m->get_property ("once")); - SCM symbol = m->get_property ("symbol"); - SCM previous_value = SCM_UNDEFINED; - if (once) { - Context *w = o->where_defined (symbol, &previous_value); - if (o != w) - previous_value = SCM_UNDEFINED; - } - send_stream_event (o, "SetProperty", m->origin (), - ly_symbol2scm ("symbol"), symbol, - ly_symbol2scm ("value"), m->get_property ("value")); - /* For \once \set install a finalization hook to reset the property to the - * previous value after the timestep */ - if (once) - { - Global_context *tg = get_outlet ()->get_global_context (); - tg->add_finalization (scm_list_n (once_finalization_proc, - o->self_scm (), m->self_scm (), - ly_quote_scm (previous_value), SCM_UNDEFINED)); - } + send_stream_event (o, "SetProperty", m->origin (), + ly_symbol2scm ("symbol"), m->get_property ("symbol"), + ly_symbol2scm ("value"), m->get_property ("value"), + ly_symbol2scm ("once"), m->get_property ("once")); Simple_music_iterator::process (mom); } void -Property_unset_iterator::process (Moment m) +Property_unset_iterator::process (Moment mom) { - SCM sym = get_music ()->get_property ("symbol"); - send_stream_event (get_outlet (), "UnsetProperty", get_music ()->origin (), - ly_symbol2scm ("symbol"), sym); - - Simple_music_iterator::process (m); -} - -MAKE_SCHEME_CALLBACK (Property_iterator, once_finalization, 3); -SCM -Property_iterator::once_finalization (SCM ctx, SCM music, SCM previous_value) -{ - Music *m = unsmob_music (music); - Context *c = unsmob_context (ctx); + Context *o = get_outlet (); + Music *m = get_music (); - // Do not use UnsetProperty, which sets the default, but rather - // cache the value before the \once \set command and restore it now - send_stream_event (c, "SetProperty", m->origin (), + send_stream_event (o, "UnsetProperty", m->origin (), ly_symbol2scm ("symbol"), m->get_property ("symbol"), - ly_symbol2scm ("value"), previous_value); - - return SCM_UNSPECIFIED; -} + ly_symbol2scm ("once"), m->get_property ("once")); -void -Property_iterator::do_quit () -{ + Simple_music_iterator::process (mom); } bool @@ -125,9 +91,10 @@ Push_property_iterator::process (Moment m) { SCM grob_property_path = get_property_path (get_music ()); SCM val = get_music ()->get_property ("grob-value"); + SCM once = get_music ()->get_property ("once"); if (to_boolean (get_music ()->get_property ("pop-first")) - && !to_boolean (get_music ()->get_property ("once"))) + && !to_boolean (once)) send_stream_event (get_outlet (), "Revert", get_music ()->origin (), ly_symbol2scm ("symbol"), sym, ly_symbol2scm ("property-path"), grob_property_path); @@ -135,58 +102,28 @@ Push_property_iterator::process (Moment m) send_stream_event (get_outlet (), "Override", get_music ()->origin (), ly_symbol2scm ("symbol"), sym, ly_symbol2scm ("property-path"), grob_property_path, + ly_symbol2scm ("once"), once, ly_symbol2scm ("value"), val); } Simple_music_iterator::process (m); } -MAKE_SCHEME_CALLBACK (Push_property_iterator, once_finalization, 2); -SCM -Push_property_iterator::once_finalization (SCM ctx, SCM music) -{ - Music *mus = unsmob_music (music); - Context *c = unsmob_context (ctx); - - SCM sym = mus->get_property ("symbol"); - if (check_grob (mus, sym)) - { - SCM grob_property_path = get_property_path (mus); - - send_stream_event (c, "Revert", mus->origin (), - ly_symbol2scm ("symbol"), sym, - ly_symbol2scm ("property-path"), grob_property_path); - } - return SCM_UNSPECIFIED; -} - void -Push_property_iterator::do_quit () +Pop_property_iterator::process (Moment mom) { - if (to_boolean (get_music ()->get_property ("once"))) - { - SCM trans = get_outlet ()->self_scm (); - SCM music = get_music ()->self_scm (); - - Global_context *tg = get_outlet ()->get_global_context (); - tg->add_finalization (scm_list_n (once_finalization_proc, - trans, music, SCM_UNDEFINED)); - } -} - -void -Pop_property_iterator::process (Moment m) -{ - SCM sym = get_music ()->get_property ("symbol"); + Music *m = get_music (); + SCM sym = m->get_property ("symbol"); - if (check_grob (get_music (), sym)) + if (check_grob (m, sym)) { - SCM grob_property_path = get_property_path (get_music ()); + SCM grob_property_path = get_property_path (m); - send_stream_event (get_outlet (), "Revert", get_music ()->origin (), + send_stream_event (get_outlet (), "Revert", m->origin (), ly_symbol2scm ("symbol"), sym, + ly_symbol2scm ("once"), m->get_property ("once"), ly_symbol2scm ("property-path"), grob_property_path); } - Simple_music_iterator::process (m); + Simple_music_iterator::process (mom); } IMPLEMENT_CTOR_CALLBACK (Pop_property_iterator); diff --git a/lily/protected-scm.cc b/lily/protected-scm.cc index 147b83fefd..a9fabdc4f2 100644 --- a/lily/protected-scm.cc +++ b/lily/protected-scm.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,54 +19,70 @@ #include "protected-scm.hh" +// We store the data in the car of a cons cell: it is faster to keep +// only one object protected during the life time of Protected_scm +// than several. + Protected_scm::Protected_scm () + : object_ (SCM_UNDEFINED) { - object_ = SCM_UNDEFINED; } Protected_scm::Protected_scm (SCM s) + : object_ (s) { - object_ = SCM_NIMP (s) ? scm_gc_protect_object (s) : s; + // Only allow immediate objects at construction time. Protected_scm + // is intended for variables of static duration, and creating + // non-immediate objects when GUILE is not yet up is a bad idea. + assert (SCM_IMP (s)); } -Protected_scm::Protected_scm (Protected_scm const &s) -{ - object_ = (SCM_NIMP (s.object_) ? scm_gc_protect_object (s.object_) - : s.object_); -} +SCM Protected_scm::list_ = SCM_EOL; +SCM Protected_scm::last_ = SCM_EOL; -Protected_scm::~Protected_scm () +void +Protected_scm::protectify (SCM s) { - if (SCM_NIMP (object_)) - scm_gc_unprotect_object (object_); + s = scm_list_1 (s); + if (SCM_CONSP (last_)) + SCM_SETCDR (last_, s); + else + list_ = scm_permanent_object (s); + last_ = object_ = s; } Protected_scm & Protected_scm::operator = (SCM s) { - if (object_ == s) - return *this; + if (SCM_CONSP (object_)) + SCM_SETCAR (object_, s); + else if (SCM_IMP (s)) + object_ = s; + else + protectify (s); - if (SCM_NIMP (object_)) - scm_gc_unprotect_object (object_); - - object_ = SCM_NIMP (s) ? scm_gc_protect_object (s) : s; return *this; } Protected_scm & Protected_scm::operator = (Protected_scm const &s) { - return operator = (s.object_); + return *this = (SCM) s; } -Protected_scm::operator SCM () const +Protected_scm::operator SCM const & () const { + if (SCM_CONSP (object_)) + return *SCM_CARLOC (object_); return object_; } -SCM -Protected_scm::to_SCM () const +Protected_scm::operator SCM & () { - return object_; + // The reference may be used to overwrite an immediate value with a + // non-immediate one, so we _have_ to create full protection. + if (!SCM_CONSP (object_)) + protectify (object_); + + return *SCM_CARLOC (object_); } diff --git a/lily/pure-from-neighbor-engraver.cc b/lily/pure-from-neighbor-engraver.cc index 24925d29b8..3bd0fa1091 100644 --- a/lily/pure-from-neighbor-engraver.cc +++ b/lily/pure-from-neighbor-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,6 +26,8 @@ #include "pure-from-neighbor-interface.hh" #include "engraver.hh" +#include "translator.icc" + class Pure_from_neighbor_engraver : public Engraver { vector pure_relevants_; @@ -34,8 +36,8 @@ class Pure_from_neighbor_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Pure_from_neighbor_engraver); protected: - DECLARE_ACKNOWLEDGER (pure_from_neighbor); - DECLARE_ACKNOWLEDGER (item); + void acknowledge_pure_from_neighbor (Grob_info); + void acknowledge_item (Grob_info); void finalize (); }; @@ -46,7 +48,7 @@ Pure_from_neighbor_engraver::Pure_from_neighbor_engraver () void Pure_from_neighbor_engraver::acknowledge_item (Grob_info i) { - if (!Pure_from_neighbor_interface::has_interface (i.item ())) + if (!has_interface (i.item ())) pure_relevants_.push_back (i.item ()); } @@ -134,10 +136,13 @@ Pure_from_neighbor_engraver::finalize () pure_relevants_.clear (); } -#include "translator.icc" +void +Pure_from_neighbor_engraver::boot () +{ + ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, item); + ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, pure_from_neighbor); +} -ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, item); -ADD_ACKNOWLEDGER (Pure_from_neighbor_engraver, pure_from_neighbor); ADD_TRANSLATOR (Pure_from_neighbor_engraver, /* doc */ "Coordinates items that get their pure heights from their neighbors.", diff --git a/lily/pure-from-neighbor-interface.cc b/lily/pure-from-neighbor-interface.cc index 4f70da828b..745c23dbec 100644 --- a/lily/pure-from-neighbor-interface.cc +++ b/lily/pure-from-neighbor-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,7 +31,7 @@ MAKE_SCHEME_CALLBACK (Pure_from_neighbor_interface, calc_pure_relevant_grobs, 1) SCM Pure_from_neighbor_interface::calc_pure_relevant_grobs (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set ((me->original () && me->original ()->is_live () ? me->original () : me), @@ -41,20 +41,15 @@ Pure_from_neighbor_interface::calc_pure_relevant_grobs (SCM smob) vector new_elts; new_elts.insert (new_elts.end (), elts.begin (), elts.end ()); - SCM neighbors_scm = me->get_object ("neighbors"); - if (Grob_array::unsmob (neighbors_scm)) - { - vector &arr - = unsmob_grob_array (neighbors_scm)->array_reference (); - arr = new_elts; - } + if (Grob_array *a = unsmob (me->get_object ("neighbors"))) + a->set_array (new_elts); return Axis_group_interface::internal_calc_pure_relevant_grobs (me, "neighbors"); } ADD_INTERFACE (Pure_from_neighbor_interface, - "A collection of routines to allow for objects' pure" - "heights and heights to be calculated based on the" + "A collection of routines to allow for objects' pure " + "heights and heights to be calculated based on the " "heights of the objects' neighbors.", /* properties */ diff --git a/lily/quote-iterator.cc b/lily/quote-iterator.cc index d35bb54b2c..885e1bd3b6 100644 --- a/lily/quote-iterator.cc +++ b/lily/quote-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -71,7 +71,7 @@ Quote_iterator::accept_music_type (Stream_event *ev, bool is_cue) const // for cue notes if quotedCueEventTypes is not set) use quotedEventTypes if (is_cue) accept = get_outlet ()->get_property ("quotedCueEventTypes"); - if (accept == SCM_EOL) + if (scm_is_null (accept)) accept = get_outlet ()->get_property ("quotedEventTypes"); for (; scm_is_pair (accept); accept = scm_cdr (accept)) @@ -194,7 +194,7 @@ Moment Quote_iterator::vector_moment (int idx) const { SCM entry = scm_c_vector_ref (event_vector_, idx); - return *unsmob_moment (scm_caar (entry)); + return *unsmob (scm_caar (entry)); } void @@ -235,15 +235,15 @@ Quote_iterator::process (Moment m) if (quote_ok ()) { SCM entry = scm_c_vector_ref (event_vector_, event_idx_); - Pitch *quote_pitch = unsmob_pitch (scm_cdar (entry)); + Pitch *quote_pitch = unsmob (scm_cdar (entry)); /* The pitch that sounds when written central C is played. */ Pitch temp_pitch; - Pitch *me_pitch = unsmob_pitch (get_music ()->get_property ("quoted-transposition")); + Pitch *me_pitch = unsmob (get_music ()->get_property ("quoted-transposition")); if (!me_pitch) - me_pitch = unsmob_pitch (get_outlet ()->get_property ("instrumentTransposition")); + me_pitch = unsmob (get_outlet ()->get_property ("instrumentTransposition")); else { // We are not going to win a beauty contest with this one, @@ -260,7 +260,7 @@ Quote_iterator::process (Moment m) { SCM ev_acc = scm_car (s); - Stream_event *ev = unsmob_stream_event (scm_car (ev_acc)); + Stream_event *ev = unsmob (scm_car (ev_acc)); if (!ev) programming_error ("no music found in quote"); else if (accept_music_type (ev, is_cue)) @@ -277,8 +277,7 @@ Quote_iterator::process (Moment m) Pitch diff = pitch_interval (mp, qp); ev = ev->clone (); ev->make_transposable (); - - transpose_mutable (ev->get_property_alist (true), diff); + ev->transpose (diff); transposed_musics_ = scm_cons (ev->unprotect (), transposed_musics_); } quote_outlet_.get_context ()->event_source ()->broadcast (ev); diff --git a/lily/relative-octave-check.cc b/lily/relative-octave-check.cc index 91360f52b1..12abf81254 100644 --- a/lily/relative-octave-check.cc +++ b/lily/relative-octave-check.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,9 +31,9 @@ MAKE_SCHEME_CALLBACK (Relative_octave_check, relative_callback, 2) SCM Relative_octave_check::relative_callback (SCM music, SCM last_pitch) { - Pitch p = *unsmob_pitch (last_pitch); - Music *m = unsmob_music (music); - Pitch *check_p = unsmob_pitch (m->get_property ("pitch")); + Pitch p = *unsmob (last_pitch); + Music *m = unsmob (music); + Pitch *check_p = unsmob (m->get_property ("pitch")); int delta_oct = 0; if (check_p) diff --git a/lily/relative-octave-music.cc b/lily/relative-octave-music.cc index 2f31e20a22..52efa5098c 100644 --- a/lily/relative-octave-music.cc +++ b/lily/relative-octave-music.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/relocate.cc b/lily/relocate.cc index 3a13f03701..879377a1cc 100644 --- a/lily/relocate.cc +++ b/lily/relocate.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,6 +39,10 @@ #include "version.hh" #include "warn.hh" +#ifdef __MINGW32__ +#include +#endif + #define FRAMEWORKDIR ".." int @@ -103,10 +107,6 @@ prepend_env_path (char const *key, string value) return -1; } -#ifdef __MINGW32__ -#include -#endif - static void prefix_relocation (const string &prefix) { @@ -181,7 +181,9 @@ setup_paths (char const *argv0_ptr) { /* Find absolute ARGV0 name, using PATH. */ File_path path; - path.parse_path (getenv ("PATH")); + char *p = getenv ("PATH"); + if (p) + path.parse_path (p); #ifndef __MINGW32__ argv0_abs = path.find (argv0_filename.to_string ()); diff --git a/lily/repeat-acknowledge-engraver.cc b/lily/repeat-acknowledge-engraver.cc index 779323e07d..d11b633fd5 100644 --- a/lily/repeat-acknowledge-engraver.cc +++ b/lily/repeat-acknowledge-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -85,13 +85,14 @@ Repeat_acknowledge_engraver::process_music () while (scm_is_pair (cs)) { SCM command = scm_car (cs); - if (command == ly_symbol2scm ("start-repeat")) + if (scm_is_eq (command, ly_symbol2scm ("start-repeat"))) start = true; - else if (command == ly_symbol2scm ("end-repeat")) + else if (scm_is_eq (command, ly_symbol2scm ("end-repeat"))) end = true; - else if (command == ly_symbol2scm ("segno-display")) + else if (scm_is_eq (command, ly_symbol2scm ("segno-display"))) segno = true; - else if (scm_is_pair (command) && scm_car (command) == ly_symbol2scm ("volta")) + else if (scm_is_pair (command) + && scm_is_eq (scm_car (command), ly_symbol2scm ("volta"))) volta_found = true; cs = scm_cdr (cs); } @@ -134,6 +135,12 @@ Repeat_acknowledge_engraver::process_music () } } +void +Repeat_acknowledge_engraver::boot () +{ + +} + ADD_TRANSLATOR (Repeat_acknowledge_engraver, /* doc */ "Acknowledge repeated music, and convert the contents of" diff --git a/lily/repeat-tie-engraver.cc b/lily/repeat-tie-engraver.cc index 854df8cadc..fb2c8bb584 100644 --- a/lily/repeat-tie-engraver.cc +++ b/lily/repeat-tie-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -32,8 +32,8 @@ class Repeat_tie_engraver : public Engraver vector semi_ties_; void stop_translation_timestep (); - DECLARE_ACKNOWLEDGER (note_head); - DECLARE_TRANSLATOR_LISTENER (repeat_tie); + void acknowledge_note_head (Grob_info); + void listen_repeat_tie (Stream_event *); public: TRANSLATOR_DECLARATIONS (Repeat_tie_engraver); @@ -53,7 +53,6 @@ Repeat_tie_engraver::stop_translation_timestep () semi_ties_.clear (); } -IMPLEMENT_TRANSLATOR_LISTENER (Repeat_tie_engraver, repeat_tie); void Repeat_tie_engraver::listen_repeat_tie (Stream_event *ev) { @@ -68,7 +67,7 @@ Repeat_tie_engraver::acknowledge_note_head (Grob_info inf) if (!semi_tie_column_) { - semi_tie_column_ = make_item ("RepeatTieColumn", event_->self_scm ()); + semi_tie_column_ = make_item ("RepeatTieColumn", SCM_EOL); } SCM cause = event_->self_scm (); @@ -80,15 +79,21 @@ Repeat_tie_engraver::acknowledge_note_head (Grob_info inf) 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"))) + if (is_direction (unsmob (cause)->get_property ("direction"))) { - Direction d = to_dir (unsmob_stream_event (cause)->get_property ("direction")); + Direction d = to_dir (unsmob (cause)->get_property ("direction")); semi_tie->set_property ("direction", scm_from_int (d)); } } -ADD_ACKNOWLEDGER (Repeat_tie_engraver, note_head); +void +Repeat_tie_engraver::boot () +{ + ADD_LISTENER (Repeat_tie_engraver, repeat_tie); + ADD_ACKNOWLEDGER (Repeat_tie_engraver, note_head); +} + ADD_TRANSLATOR (Repeat_tie_engraver, /* doc */ "Create repeat ties.", diff --git a/lily/repeated-music.cc b/lily/repeated-music.cc index 78ffd6b880..001eb0e5e4 100644 --- a/lily/repeated-music.cc +++ b/lily/repeated-music.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,7 +26,7 @@ Music * Repeated_music::body (Music *me) { - return unsmob_music (me->get_property ("element")); + return unsmob (me->get_property ("element")); } SCM @@ -53,7 +53,7 @@ Repeated_music::alternatives_get_length (Music *me, bool fold) SCM p = alternative_list; while (scm_is_pair (p) && done < count) { - m = m + unsmob_music (scm_car (p))->get_length (); + m = m + unsmob (scm_car (p))->get_length (); done++; if (count - done < len) p = scm_cdr (p); @@ -78,7 +78,7 @@ Moment Repeated_music::body_get_length (Music *me) { Moment m = 0; - if (Music *body = unsmob_music (me->get_property ("element"))) + if (Music *body = unsmob (me->get_property ("element"))) m = body->get_length (); return m; } @@ -88,7 +88,7 @@ MAKE_SCHEME_CALLBACK (Repeated_music, unfolded_music_length, 1); SCM Repeated_music::unfolded_music_length (SCM m) { - Music *me = unsmob_music (m); + Music *me = unsmob (m); Moment l = Moment (repeat_count (me)) * body_get_length (me) + alternatives_get_length (me, false); return l.smobbed_copy (); @@ -98,7 +98,7 @@ MAKE_SCHEME_CALLBACK (Repeated_music, folded_music_length, 1); SCM Repeated_music::folded_music_length (SCM m) { - Music *me = unsmob_music (m); + Music *me = unsmob (m); Moment l = body_get_length (me) + alternatives_get_length (me, true); return l.smobbed_copy (); @@ -114,7 +114,7 @@ MAKE_SCHEME_CALLBACK (Repeated_music, volta_music_length, 1); SCM Repeated_music::volta_music_length (SCM m) { - Music *me = unsmob_music (m); + Music *me = unsmob (m); Moment l = body_get_length (me) + alternatives_volta_get_length (me); return l.smobbed_copy (); } @@ -123,8 +123,8 @@ MAKE_SCHEME_CALLBACK (Repeated_music, minimum_start, 1); SCM Repeated_music::minimum_start (SCM m) { - Music *me = unsmob_music (m); - Music *body = unsmob_music (me->get_property ("element")); + Music *me = unsmob (m); + Music *body = unsmob (me->get_property ("element")); if (body) return body->start_mom ().smobbed_copy (); @@ -136,8 +136,8 @@ MAKE_SCHEME_CALLBACK (Repeated_music, first_start, 1); SCM Repeated_music::first_start (SCM m) { - Music *me = unsmob_music (m); - Music *body = unsmob_music (me->get_property ("element")); + Music *me = unsmob (m); + Music *body = unsmob (me->get_property ("element")); Moment rv = (body) ? body->start_mom () : Music_sequence::first_start (me->get_property ("elements")); diff --git a/lily/rest-collision-engraver.cc b/lily/rest-collision-engraver.cc index 1c28520d5c..56a6783fbf 100644 --- a/lily/rest-collision-engraver.cc +++ b/lily/rest-collision-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,6 +32,8 @@ #include "stream-event.hh" #include "warn.hh" +#include "translator.icc" + class Rest_collision_engraver : public Engraver { protected: @@ -57,23 +59,20 @@ Rest_collision_engraver::process_acknowledged () for (SCM s = get_property ("busyGrobs"); scm_is_pair (s); s = scm_cdr (s)) { - Grob *g = unsmob_grob (scm_cdar (s)); - Moment *m = unsmob_moment (scm_caar (s)); + Grob *g = unsmob (scm_cdar (s)); + Moment *m = unsmob (scm_caar (s)); if (!g || !m) continue; - if (Rhythmic_head::has_interface (g) && (*m) > now) + if (has_interface (g) && (*m) > now) { Grob *column = g->get_parent (X_AXIS); if (!column) - { - g->warning (_ ("rhythmic head is not part of a rhythmic column")); continue; - } // Only include rests that start now. Include notes that started any time. Paper_column *paper_column = dynamic_cast (column)->get_column (); - if (!Rest::has_interface (g) || !paper_column || Paper_column::when_mom (paper_column) == now) + if (!has_interface (g) || !paper_column || Paper_column::when_mom (paper_column) == now) { columns.insert (column); rest_count += Note_column::has_rests (column); @@ -95,7 +94,11 @@ Rest_collision_engraver::stop_translation_timestep () rest_collision_ = 0; } -#include "translator.icc" +void +Rest_collision_engraver::boot () +{ + +} ADD_TRANSLATOR (Rest_collision_engraver, /* doc */ diff --git a/lily/rest-collision.cc b/lily/rest-collision.cc index 46435b73ad..536ced40e5 100644 --- a/lily/rest-collision.cc +++ b/lily/rest-collision.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,12 +36,13 @@ using namespace std; #include "grob.hh" #include "unpure-pure-container.hh" #include "warn.hh" +#include "lily-imports.hh" MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Rest_collision, force_shift_callback_rest, 2, 1, ""); SCM Rest_collision::force_shift_callback_rest (SCM rest, SCM offset) { - Grob *rest_grob = unsmob_grob (rest); + Grob *rest_grob = unsmob (rest); Grob *parent = rest_grob->get_parent (X_AXIS); /* @@ -51,9 +52,9 @@ Rest_collision::force_shift_callback_rest (SCM rest, SCM offset) if (scm_is_number (offset)) rest_grob->translate_axis (scm_to_double (offset), Y_AXIS); - if (Note_column::has_interface (parent) && Note_column::has_rests (parent)) + if (has_interface (parent) && Note_column::has_rests (parent)) { - Grob *collision = unsmob_grob (parent->get_object ("rest-collision")); + Grob *collision = unsmob (parent->get_object ("rest-collision")); if (collision) (void) collision->get_property ("positioning-done"); @@ -69,14 +70,14 @@ Rest_collision::add_column (Grob *me, Grob *p) p->set_object ("rest-collision", me->self_scm ()); - Grob *rest = unsmob_grob (p->get_object ("rest")); + Grob *rest = unsmob (p->get_object ("rest")); if (rest) { chain_offset_callback (rest, - ly_make_unpure_pure_container - (Rest_collision::force_shift_callback_rest_proc, - ly_lily_module_constant ("pure-chain-offset-callback")), - Y_AXIS); + Unpure_pure_container::make_smob + (Rest_collision::force_shift_callback_rest_proc, + Lily::pure_chain_offset_callback), + Y_AXIS); } } @@ -96,7 +97,7 @@ MAKE_SCHEME_CALLBACK (Rest_collision, calc_positioning_done, 1); SCM Rest_collision::calc_positioning_done (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); me->set_property ("positioning-done", SCM_BOOL_T); @@ -108,10 +109,13 @@ Rest_collision::calc_positioning_done (SCM smob) for (vsize i = 0; i < elts.size (); i++) { Grob *e = elts[i]; - if (unsmob_grob (e->get_object ("rest"))) - rests.push_back (e); - else - notes.push_back (e); + if (has_interface (e)) + { + if (unsmob (e->get_object ("rest"))) + rests.push_back (e); + else + notes.push_back (e); + } } /* diff --git a/lily/rest-engraver.cc b/lily/rest-engraver.cc index 402f412d2a..d691c2e98c 100644 --- a/lily/rest-engraver.cc +++ b/lily/rest-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,7 +37,7 @@ class Rest_engraver : public Engraver protected: void start_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (rest); + void listen_rest (Stream_event *); public: TRANSLATOR_DECLARATIONS (Rest_engraver); }; @@ -66,7 +66,7 @@ Rest_engraver::process_music () if (rest_event_ && !rest_) { rest_ = make_item ("Rest", rest_event_->self_scm ()); - Pitch *p = unsmob_pitch (rest_event_->get_property ("pitch")); + Pitch *p = unsmob (rest_event_->get_property ("pitch")); if (p) { @@ -80,13 +80,18 @@ Rest_engraver::process_music () } } -IMPLEMENT_TRANSLATOR_LISTENER (Rest_engraver, rest); void Rest_engraver::listen_rest (Stream_event *ev) { ASSIGN_EVENT_ONCE (rest_event_, ev); } +void +Rest_engraver::boot () +{ + ADD_LISTENER (Rest_engraver, rest); +} + ADD_TRANSLATOR (Rest_engraver, /* doc */ "Engrave rests.", diff --git a/lily/rest.cc b/lily/rest.cc index 3a448546b0..f562f69534 100644 --- a/lily/rest.cc +++ b/lily/rest.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ MAKE_SCHEME_CALLBACK (Rest, y_offset_callback, 1); SCM Rest::y_offset_callback (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); int duration_log = scm_to_int (me->get_property ("duration-log")); Real ss = Staff_symbol_referencer::staff_space (me); @@ -72,12 +72,13 @@ Rest::staff_position_internal (Grob *me, int duration_log, int dir) return pos; } - pos = 4 * dir; + Real vpos = dir * robust_scm2int (me->get_property ("voiced-position"), 0); + pos = vpos; if (duration_log > 1) /* Only half notes or longer want alignment with staff lines */ return pos; - + /* We need a staff symbol for actually aligning anything */ @@ -89,9 +90,9 @@ Rest::staff_position_internal (Grob *me, int duration_log, int dir) if (linepos.empty ()) return pos; - + std::sort (linepos.begin (), linepos.end ()); - + if (duration_log == 0) { /* @@ -105,7 +106,7 @@ Rest::staff_position_internal (Grob *me, int duration_log, int dir) make a semibreve rest hang from the next available line, except when there is none. */ - + std::vector::const_iterator it = std::upper_bound (linepos.begin (), linepos.end (), pos); if (it != linepos.end ()) @@ -127,16 +128,15 @@ Rest::staff_position_internal (Grob *me, int duration_log, int dir) return pos; /* If we have a voiced position, make sure that it's on the - proper side of neutral before using it. If it isn't, we fall - back to a constant offset from neutral position. + proper side of neutral before using it. */ Real neutral = staff_position_internal (me, duration_log, 0); if (dir * (pos - neutral) > 0) return pos; - - return neutral + 4 * dir; + else + return neutral + vpos; } /* A rest might lie under a beam, in which case it should be cross-staff if @@ -146,8 +146,8 @@ MAKE_SCHEME_CALLBACK (Rest, calc_cross_staff, 1); SCM Rest::calc_cross_staff (SCM smob) { - Grob *me = unsmob_grob (smob); - Grob *stem = unsmob_grob (me->get_object ("stem")); + Grob *me = unsmob (smob); + Grob *stem = unsmob (me->get_object ("stem")); if (!stem) return SCM_BOOL_F; @@ -199,11 +199,10 @@ Rest::glyph_name (Grob *me, int durlog, const string &style, bool try_ledgers, actual_style = ""; } - if ((style == "classical") && (durlog != 2)) + if (((style == "classical") || (style == "z")) && (durlog != 2)) { /* - classical style: revert back to default style for any rest other - than quarter rest + these styles differ from the default in quarter rests only */ actual_style = ""; } @@ -260,7 +259,7 @@ Rest::translate (Grob *me, int dy) SCM Rest::print (SCM smob) { - return brew_internal_stencil (unsmob_grob (smob), true); + return brew_internal_stencil (unsmob (smob), true); } MAKE_SCHEME_CALLBACK (Rest, width, 1); @@ -270,14 +269,14 @@ MAKE_SCHEME_CALLBACK (Rest, width, 1); SCM Rest::width (SCM smob) { - return generic_extent_callback (unsmob_grob (smob), X_AXIS); + return generic_extent_callback (unsmob (smob), X_AXIS); } MAKE_SCHEME_CALLBACK (Rest, height, 1); SCM Rest::height (SCM smob) { - return generic_extent_callback (unsmob_grob (smob), Y_AXIS); + return generic_extent_callback (unsmob (smob), Y_AXIS); } /* @@ -295,7 +294,7 @@ Rest::generic_extent_callback (Grob *me, Axis a) with ledgered rests. */ SCM m = brew_internal_stencil (me, a != X_AXIS); - return ly_interval2scm (unsmob_stencil (m)->extent (a)); + return ly_interval2scm (unsmob (m)->extent (a)); } MAKE_SCHEME_CALLBACK (Rest, pure_height, 3); @@ -304,9 +303,9 @@ Rest::pure_height (SCM smob, SCM /* start */, SCM /* end */) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); SCM m = brew_internal_stencil (me, false); - return ly_interval2scm (unsmob_stencil (m)->extent (Y_AXIS)); + return ly_interval2scm (unsmob (m)->extent (Y_AXIS)); } ADD_INTERFACE (Rest, @@ -318,4 +317,5 @@ ADD_INTERFACE (Rest, "direction " "minimum-distance " "style " + "voiced-position " ); diff --git a/lily/rhythmic-column-engraver.cc b/lily/rhythmic-column-engraver.cc index 1955498fc4..04281231d5 100644 --- a/lily/rhythmic-column-engraver.cc +++ b/lily/rhythmic-column-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -61,9 +61,9 @@ class Rhythmic_column_engraver : public Engraver TRANSLATOR_DECLARATIONS (Rhythmic_column_engraver); protected: - DECLARE_ACKNOWLEDGER (stem); - DECLARE_ACKNOWLEDGER (flag); - DECLARE_ACKNOWLEDGER (rhythmic_head); + void acknowledge_stem (Grob_info); + void acknowledge_flag (Grob_info); + void acknowledge_rhythmic_head (Grob_info); void process_acknowledged (); void stop_translation_timestep (); }; @@ -134,9 +134,14 @@ Rhythmic_column_engraver::stop_translation_timestep () flag_ = 0; } -ADD_ACKNOWLEDGER (Rhythmic_column_engraver, stem); -ADD_ACKNOWLEDGER (Rhythmic_column_engraver, flag); -ADD_ACKNOWLEDGER (Rhythmic_column_engraver, rhythmic_head); + +void +Rhythmic_column_engraver::boot () +{ + ADD_ACKNOWLEDGER (Rhythmic_column_engraver, stem); + ADD_ACKNOWLEDGER (Rhythmic_column_engraver, flag); + ADD_ACKNOWLEDGER (Rhythmic_column_engraver, rhythmic_head); +} ADD_TRANSLATOR (Rhythmic_column_engraver, /* doc */ diff --git a/lily/rhythmic-head.cc b/lily/rhythmic-head.cc index d144279427..8628b05088 100644 --- a/lily/rhythmic-head.cc +++ b/lily/rhythmic-head.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,14 +29,14 @@ Item * Rhythmic_head::get_dots (Grob *me) { SCM s = me->get_object ("dot"); - return unsmob_item (s); + return unsmob (s); } Item * Rhythmic_head::get_stem (Grob *me) { SCM s = me->get_object ("stem"); - return unsmob_item (s); + return unsmob (s); } int diff --git a/lily/rhythmic-music-iterator.cc b/lily/rhythmic-music-iterator.cc index 64daa8ea5b..cff4353f40 100644 --- a/lily/rhythmic-music-iterator.cc +++ b/lily/rhythmic-music-iterator.cc @@ -62,7 +62,7 @@ Rhythmic_music_iterator::process (Moment m) SCM art = scm_car (arts); if (c->event_source ()->is_listened_class - (unsmob_stream_event (art)->get_property ("class"))) + (unsmob (art)->get_property ("class"))) listened = scm_cons (art, listened); else unlistened = scm_cons (art, unlistened); @@ -71,7 +71,7 @@ Rhythmic_music_iterator::process (Moment m) c->event_source ()->broadcast (ev); arts = scm_reverse_x (listened, SCM_EOL); for (; scm_is_pair (arts); arts = scm_cdr (arts)) - c->event_source ()->broadcast (unsmob_stream_event (scm_car (arts))); + c->event_source ()->broadcast (unsmob (scm_car (arts))); } else c->event_source ()->broadcast (ev); diff --git a/lily/rod.cc b/lily/rod.cc index f7b38397c5..9d9b6520fc 100644 --- a/lily/rod.cc +++ b/lily/rod.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/scale.cc b/lily/scale.cc index c4b3ccf2c5..02c1dc5f8e 100644 --- a/lily/scale.cc +++ b/lily/scale.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys 2007--2008 Rune Zedeler 2008 Joe Neeman @@ -20,8 +20,8 @@ */ #include "scale.hh" +#include "protected-scm.hh" -#include "ly-smobs.icc" /* todo: put string <-> pitch here too. @@ -54,25 +54,25 @@ LY_DEFINE (ly_make_scale, "ly:make-scale", SCM_ASSERT_TYPE (type_ok, steps, SCM_ARG1, __FUNCTION__, "vector of rational"); - Scale *s = new Scale (tones); + return (new Scale (tones))->unprotect (); +} - SCM retval = s->self_scm (); - s->unprotect (); +Scale *default_global_scale = 0; +Protected_scm default_global_scale_scm (SCM_BOOL_F); - return retval; -} +// TODO: This is somewhat fishy: pitches protect their scale via a +// mark_smob hook. But since pitches are of Simple_smob variety, they +// are unknown to GUILE unless a smobbed_copy has been created. So +// changing the default scale might cause some existing pitches to +// lose their scale's protection. LY_DEFINE (ly_default_scale, "ly:default-scale", 0, 0, 0, (), "Get the global default scale.") { - return default_global_scale - ? default_global_scale->self_scm () - : SCM_BOOL_F; + return default_global_scale_scm; } -Scale *default_global_scale = 0; - LY_DEFINE (ly_set_default_scale, "ly:set-default-scale", 1, 0, 0, (SCM scale), "Set the global default scale. This determines the tuning of" @@ -84,11 +84,8 @@ LY_DEFINE (ly_set_default_scale, "ly:set-default-scale", { LY_ASSERT_SMOB (Scale, scale, 1); - Scale *s = Scale::unsmob (scale); - if (default_global_scale) - default_global_scale->unprotect (); - default_global_scale = s; - s->protect (); + default_global_scale_scm = scale; + default_global_scale = unsmob (scale); return SCM_UNSPECIFIED; } @@ -134,20 +131,7 @@ Scale::normalize_step (int step) const return ret; } -int -Scale::print_smob (SCM /* x */, - SCM port, - scm_print_state *) -{ - scm_puts ("#", port); - return 1; -} -SCM -Scale::mark_smob (SCM) -{ - return SCM_UNSPECIFIED; -} Scale::Scale (vector const &tones) { @@ -157,6 +141,7 @@ Scale::Scale (vector const &tones) } Scale::Scale (Scale const &src) + : Smob () { step_tones_ = src.step_tones_; smobify_self (); @@ -165,6 +150,3 @@ Scale::Scale (Scale const &src) Scale::~Scale () { } - -IMPLEMENT_SMOBS (Scale); -IMPLEMENT_DEFAULT_EQUAL_P (Scale); diff --git a/lily/scheme-engraver.cc b/lily/scheme-engraver.cc index 1b1aad924a..c322a6d255 100644 --- a/lily/scheme-engraver.cc +++ b/lily/scheme-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - Copyright (c) 2009--2012 Han-Wen Nienhuys + Copyright (c) 2009--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,40 +25,33 @@ #include "translator.icc" -Scheme_engraver::Scheme_engraver () +#include "scm-hash.hh" + +Scheme_engraver::Scheme_engraver (SCM definition) { - stop_translation_timestep_function_ = SCM_EOL; - start_translation_timestep_function_ = SCM_EOL; - process_music_function_ = SCM_EOL; - process_acknowledged_function_ = SCM_EOL; initialize_function_ = SCM_EOL; finalize_function_ = SCM_EOL; - listeners_alist_ = SCM_EOL; - interface_acknowledger_hash_ = SCM_EOL; - interface_end_acknowledger_hash_ = SCM_EOL; + interface_acknowledger_hash_.set (SCM_EOL, SCM_EOL); must_be_last_ = false; - per_instance_listeners_ = 0; + per_instance_listeners_ = SCM_EOL; + for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++) + precomputable_methods_[i] = SCM_UNDEFINED; + + init_from_scheme (definition); } Scheme_engraver::~Scheme_engraver () { - translator_listener_record *next = 0; - for (translator_listener_record *r = per_instance_listeners_; - r; r = next) - { - next = r->next_; - delete r; - } } -// Extracts the value if callable, if not return #f. +// Extracts the value if callable, if not return SCM_UNDEFINED; static SCM callable (SCM symbol, SCM defn) { SCM val = ly_assoc_get (symbol, defn, SCM_BOOL_F); - return ly_is_procedure (val) ? val : SCM_BOOL_F; + return ly_is_procedure (val) ? val : SCM_UNDEFINED; } bool @@ -67,29 +60,35 @@ Scheme_engraver::must_be_last () const return must_be_last_; } +void +Scheme_engraver::fetch_precomputable_methods (SCM ptrs[]) +{ + for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++) + ptrs[i] = precomputable_methods_[i]; +} + void Scheme_engraver::init_from_scheme (SCM definition) { - start_translation_timestep_function_ = callable (ly_symbol2scm ("start-translation-timestep"), - definition); - stop_translation_timestep_function_ = callable (ly_symbol2scm ("stop-translation-timestep"), - definition); - process_music_function_ = callable (ly_symbol2scm ("process-music"), definition); - process_acknowledged_function_ = callable (ly_symbol2scm ("process-acknowledged"), - definition); + precomputable_methods_[START_TRANSLATION_TIMESTEP] + = callable (ly_symbol2scm ("start-translation-timestep"), definition); + precomputable_methods_[STOP_TRANSLATION_TIMESTEP] + = callable (ly_symbol2scm ("stop-translation-timestep"), definition); + precomputable_methods_[PROCESS_MUSIC] + = callable (ly_symbol2scm ("process-music"), definition); + precomputable_methods_[PROCESS_ACKNOWLEDGED] + = callable (ly_symbol2scm ("process-acknowledged"), definition); initialize_function_ = callable (ly_symbol2scm ("initialize"), definition); finalize_function_ = callable (ly_symbol2scm ("finalize"), definition); - SCM listeners = ly_assoc_get (ly_symbol2scm ("listeners"), definition, SCM_EOL); - - listeners_alist_ = SCM_EOL; + SCM p = ly_assoc_get (ly_symbol2scm ("listeners"), definition, SCM_EOL); + SCM listeners = SCM_EOL; must_be_last_ = to_boolean (ly_assoc_get (ly_symbol2scm ("must-be-last"), definition, SCM_BOOL_F)); - translator_listener_record **tail = &per_instance_listeners_; - for (SCM p = listeners; scm_is_pair (p); p = scm_cdr (p)) + for (; scm_is_pair (p); p = scm_cdr (p)) { SCM event_class = scm_caar (p); SCM proc = scm_cdar (p); @@ -100,32 +99,35 @@ Scheme_engraver::init_from_scheme (SCM definition) // We should check the arity of the function? // Record for later lookup. - listeners_alist_ = scm_acons (event_class, proc, listeners_alist_); - - translator_listener_record *rec = new translator_listener_record; - *tail = rec; - rec->event_class_ = event_class; - rec->get_listener_ = &Scheme_engraver::get_listener; - tail = &rec->next_; + listeners = scm_acons (event_class, proc, listeners); } - init_acknowledgers (ly_assoc_get (ly_symbol2scm ("acknowledgers"), - definition, SCM_EOL), - &interface_acknowledger_hash_); + SCM hash1 = + init_acknowledgers (ly_assoc_get (ly_symbol2scm ("acknowledgers"), + definition, SCM_EOL)); + SCM hash2 = + init_acknowledgers (ly_assoc_get (ly_symbol2scm ("end-acknowledgers"), + definition, SCM_EOL)); + + per_instance_listeners_ = listeners; + interface_acknowledger_hash_.set (hash1, hash2); + + // It's not defined whether Scheme_engraver::derived_mark is already + // active while the construction is underway, so we make sure we + // keep a version of everything on the stack that is not still + // covered by `definition'. - init_acknowledgers (ly_assoc_get (ly_symbol2scm ("end-acknowledgers"), - definition, SCM_EOL), - &interface_end_acknowledger_hash_); + scm_remember_upto_here_2 (definition, listeners); + scm_remember_upto_here_2 (hash1, hash2); // TODO: hook up description, props read/written, grobs created // etc. to provide automatic documentation. } -void -Scheme_engraver::init_acknowledgers (SCM alist, - SCM *hash) +SCM +Scheme_engraver::init_acknowledgers (SCM alist) { - *hash = scm_c_make_hash_table (7); + SCM hash = Scheme_hash_table::make_smob (); for (SCM p = alist; scm_is_pair (p); p = scm_cdr (p)) { SCM iface = scm_caar (p); @@ -134,134 +136,40 @@ Scheme_engraver::init_acknowledgers (SCM alist, if (!(ly_is_procedure (proc) && ly_is_symbol (iface))) continue; - scm_hashq_set_x (*hash, iface, proc); + unsmob(hash)->set (iface, proc); } + return hash; } -// This is the easy way to do it, at the cost of too many invocations -// of Scheme_engraver::acknowledge_grob. The clever dispatching of -// acknowledgers is hardwired to have 1 method per engraver per -// grob-type, which doesn't work for this case. -void -Scheme_engraver::acknowledge_grob (Grob_info info) +SCM +Scheme_engraver::get_listener_list () const { - acknowledge_grob_by_hash (info, interface_acknowledger_hash_); + return per_instance_listeners_; } void -Scheme_engraver::acknowledge_end_grob (Grob_info info) +Scheme_engraver::initialize () { - acknowledge_grob_by_hash (info, interface_end_acknowledger_hash_); + if (!SCM_UNBNDP (initialize_function_)) + scm_call_1 (initialize_function_, self_scm ()); } void -Scheme_engraver::acknowledge_grob_by_hash (Grob_info info, - SCM iface_function_hash) -{ - SCM meta = info.grob ()->internal_get_property (ly_symbol2scm ("meta")); - SCM ifaces = scm_cdr (scm_assoc (ly_symbol2scm ("interfaces"), meta)); - for (SCM s = ifaces; scm_is_pair (s); s = scm_cdr (s)) - { - SCM func = scm_hashq_ref (iface_function_hash, - scm_car (s), SCM_BOOL_F); - - if (ly_is_procedure (func)) - scm_call_3 (func, self_scm (), info.grob ()->self_scm (), - info.origin_translator ()->self_scm ()); - } -} - -static -void call_listen_closure (void *target, SCM ev) +Scheme_engraver::finalize () { - SCM cl = (SCM) target; - SCM func = scm_car (cl); - SCM engraver = scm_cdr (cl); - scm_call_2 (func, engraver, ev); + if (!SCM_UNBNDP (finalize_function_)) + scm_call_1 (finalize_function_, self_scm ()); } -static -void mark_listen_closure (void *target) -{ - scm_gc_mark ((SCM)target); -} - -static -bool equal_listen_closure (void *a, void *b) -{ - SCM target_a = (SCM) a; - SCM target_b = (SCM) b; - - return ly_is_equal (target_a, target_b); -} - -Listener_function_table listen_closure -= -{ - call_listen_closure, mark_listen_closure, equal_listen_closure -}; - -/* static */ -Listener -Scheme_engraver::get_listener (void *arg, SCM name) -{ - Scheme_engraver *me = (Scheme_engraver *) arg; - SCM func = ly_assoc_get (name, me->listeners_alist_, SCM_BOOL_F); - assert (ly_is_procedure (func)); - - SCM closure = scm_cons (func, me->self_scm ()); - return Listener ((void *)closure, &listen_closure); -} - -translator_listener_record * -Scheme_engraver::get_listener_list () const -{ - return per_instance_listeners_; -} - -#define DISPATCH(what) \ - void \ - Scheme_engraver::what () \ - { \ - if (what ## _function_ != SCM_BOOL_F) \ - scm_call_1 (what ## _function_, self_scm ()); \ - } - -DISPATCH (start_translation_timestep); -DISPATCH (stop_translation_timestep); -DISPATCH (initialize); -DISPATCH (finalize); -DISPATCH (process_music); -DISPATCH (process_acknowledged); - void Scheme_engraver::derived_mark () const { - scm_gc_mark (start_translation_timestep_function_); - scm_gc_mark (stop_translation_timestep_function_); + for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++) + scm_gc_mark (precomputable_methods_[i]); + scm_gc_mark (initialize_function_); scm_gc_mark (finalize_function_); - scm_gc_mark (process_music_function_); - scm_gc_mark (process_acknowledged_function_); - scm_gc_mark (listeners_alist_); - scm_gc_mark (interface_acknowledger_hash_); - scm_gc_mark (interface_end_acknowledger_hash_); + scm_gc_mark (per_instance_listeners_); + scm_gc_mark (interface_acknowledger_hash_[START]); + scm_gc_mark (interface_acknowledger_hash_[STOP]); } - -ADD_ACKNOWLEDGER (Scheme_engraver, grob); -ADD_END_ACKNOWLEDGER (Scheme_engraver, grob); - -ADD_TRANSLATOR (Scheme_engraver, - /* doc */ - "Implement engravers in Scheme. Interprets arguments to" - " @code{\\consists} as callbacks.", - - /* create */ - "", - - /* read */ - "", - - /* write */ - "" - ); diff --git a/lily/scheme-listener-scheme.cc b/lily/scheme-listener-scheme.cc deleted file mode 100644 index 7f1a15627d..0000000000 --- a/lily/scheme-listener-scheme.cc +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of LilyPond, the GNU music typesetter. - - Copyright (C) 2006--2012 Erik Sandberg - - LilyPond is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - LilyPond is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LilyPond. If not, see . -*/ - -#include "scheme-listener.hh" - -LY_DEFINE (ly_make_listener, "ly:make-listener", - 1, 0, 0, (SCM callback), - "Create a listener. Any time the listener hears an object," - " it will call @var{callback} with that object.\n" - "\n" - "@var{callback} should take exactly one argument.") -{ - LY_ASSERT_TYPE (ly_is_procedure, callback, 1); - Scheme_listener *l = new Scheme_listener (callback); - SCM listener = GET_LISTENER (l->call).smobbed_copy (); - l->unprotect (); - return listener; -} diff --git a/lily/scheme-listener.cc b/lily/scheme-listener.cc deleted file mode 100644 index a576aa18d0..0000000000 --- a/lily/scheme-listener.cc +++ /dev/null @@ -1,59 +0,0 @@ -/* - This file is part of LilyPond, the GNU music typesetter. - - Copyright (C) 2006--2012 Erik Sandberg - - LilyPond is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - LilyPond is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LilyPond. If not, see . -*/ - -#include "scheme-listener.hh" - -IMPLEMENT_LISTENER (Scheme_listener, call) -void -Scheme_listener::call (SCM ev) -{ - scm_call_1 (callback_, ev); -} - -IMPLEMENT_SMOBS (Scheme_listener); -IMPLEMENT_DEFAULT_EQUAL_P (Scheme_listener); - -Scheme_listener::Scheme_listener (SCM c) -{ - callback_ = SCM_EOL; - self_scm_ = SCM_EOL; - smobify_self (); - callback_ = c; -} - -SCM -Scheme_listener::mark_smob (SCM obj) -{ - Scheme_listener *me = (Scheme_listener *) SCM_CELL_WORD_1 (obj); - return me->callback_; -} - -int -Scheme_listener::print_smob (SCM obj, SCM p, scm_print_state *) -{ - Scheme_listener *me = (Scheme_listener *) SCM_CELL_WORD_1 (obj); - scm_puts ("#callback_, p); - scm_puts (">", p); - return 1; -} - -Scheme_listener::~Scheme_listener () -{ -} diff --git a/lily/scm-hash.cc b/lily/scm-hash.cc index dd3e18bfe4..0b1e0b4e25 100644 --- a/lily/scm-hash.cc +++ b/lily/scm-hash.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,73 +19,19 @@ #include "scm-hash.hh" -#include -#include -using namespace std; - -#include "ly-smobs.icc" - -/* - Return: number of objects. -*/ -SCM -copy_handle (void *closure, SCM handle) -{ - SCM tab = (SCM) closure; - scm_hashq_set_x (tab, scm_car (handle), scm_cdr (handle)); - return tab; -} - -static void -copy_scm_hashes (SCM dest, SCM src) -{ - scm_internal_hash_for_each_handle ((scm_t_hash_handle_fn) ©_handle, - dest, src); -} - -Scheme_hash_table::Scheme_hash_table () -{ - hash_tab_ = SCM_EOL; - smobify_self (); - hash_tab_ = scm_c_make_hash_table (119); -} - -Scheme_hash_table::Scheme_hash_table (Scheme_hash_table const &src) -{ - hash_tab_ = SCM_EOL; - smobify_self (); - copy (src); -} - -void -Scheme_hash_table::copy (Scheme_hash_table const &src) -{ - if (&src == this) - return; - - hash_tab_ = scm_c_make_hash_table (SCM_HASHTABLE_N_ITEMS (src.hash_tab_)); - copy_scm_hashes (hash_tab_, src.hash_tab_); -} - -Scheme_hash_table::~Scheme_hash_table () -{ -} +#include SCM -Scheme_hash_table::mark_smob (SCM s) +Scheme_hash_table::make_smob () { - Scheme_hash_table *me = (Scheme_hash_table *) SCM_CELL_WORD_1 (s); - scm_gc_mark (me->hash_tab_); - return SCM_EOL; + return Smob1::make_smob (scm_c_make_hash_table (119)); } int -Scheme_hash_table::print_smob (SCM s, SCM p, scm_print_state *) +Scheme_hash_table::print_smob (SCM p, scm_print_state *) const { - assert (unsmob (s)); scm_puts ("#hash_tab_, p); + scm_display (hash_tab (), p); scm_puts ("> ", p); return 1; } @@ -94,7 +40,7 @@ bool Scheme_hash_table::try_retrieve (SCM k, SCM *v) { - SCM handle = scm_hashq_get_handle (hash_tab_, k); + SCM handle = scm_hashq_get_handle (hash_tab (), k); if (scm_is_pair (handle)) { *v = scm_cdr (handle); @@ -107,29 +53,33 @@ Scheme_hash_table::try_retrieve (SCM k, SCM *v) bool Scheme_hash_table::contains (SCM k) const { - return scm_is_pair (scm_hashq_get_handle (hash_tab_, k)); + return scm_is_pair (scm_hashq_get_handle (hash_tab (), k)); } void Scheme_hash_table::set (SCM k, SCM v) { assert (scm_is_symbol (k)); - SCM handle = scm_hashq_create_handle_x (hash_tab_, k, SCM_UNDEFINED); + SCM handle = scm_hashq_create_handle_x (hash_tab (), k, SCM_UNDEFINED); scm_set_cdr_x (handle, v); } SCM Scheme_hash_table::get (SCM k) const { - /* SCM_UNSPECIFIED will stick out like a sore thumb, hopefully. + /* SCM_UNDEFINED is the default for unset elements, but + scm_hashq_ref cannot return it, so we do it a bit more awkwardly. */ - return scm_hashq_ref (hash_tab_, k, SCM_UNSPECIFIED); + SCM handle = scm_hashq_get_handle (hash_tab (), k); + if (scm_is_pair (handle)) + return scm_cdr (handle); + return SCM_UNDEFINED; } void Scheme_hash_table::remove (SCM k) { - scm_hashq_remove_x (hash_tab_, k); + scm_hashq_remove_x (hash_tab (), k); } static SCM @@ -145,8 +95,5 @@ SCM Scheme_hash_table::to_alist () const { return scm_internal_hash_fold ((scm_t_hash_fold_fn) &collect_handles, - NULL, SCM_EOL, hash_tab_); + NULL, SCM_EOL, hash_tab ()); } - -IMPLEMENT_SMOBS (Scheme_hash_table); -IMPLEMENT_DEFAULT_EQUAL_P (Scheme_hash_table); diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc index e0bca498f7..88ea4af86f 100644 --- a/lily/score-engraver.cc +++ b/lily/score-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ #include "context-def.hh" #include "dispatcher.hh" #include "global-context.hh" +#include "grob-properties.hh" #include "international.hh" #include "main.hh" #include "open-type-font.hh" @@ -48,20 +49,20 @@ Score_engraver::derived_mark () const Engraver_group::derived_mark (); } -IMPLEMENT_LISTENER (Score_engraver, prepare); void Score_engraver::prepare (SCM) { precomputed_recurse_over_translators (context (), START_TRANSLATION_TIMESTEP, DOWN); } -IMPLEMENT_LISTENER (Score_engraver, finish); void Score_engraver::finish (SCM) { - recurse_over_translators (context (), &Translator::finalize, - &Translator_group::finalize, - UP); + recurse_over_translators + (context (), + Callback0_wrapper::make_smob (), + Callback0_wrapper::make_smob (), + UP); } #define MUSIC_FONT "emmentaler-20" @@ -88,7 +89,7 @@ Score_engraver::initialize () pscore_->unprotect (); context ()->set_property ("output", pscore_->self_scm ()); - SCM props = updated_grob_properties (context (), ly_symbol2scm ("System")); + SCM props = Grob_property_info (context (), ly_symbol2scm ("System")).updated (); pscore_->typeset_system (new System (props)); @@ -104,9 +105,9 @@ Score_engraver::connect_to_context (Context *c) Engraver_group::connect_to_context (c); Dispatcher *d = c->get_global_context ()->event_source (); - d->add_listener (GET_LISTENER (one_time_step), ly_symbol2scm ("OneTimeStep")); - d->add_listener (GET_LISTENER (prepare), ly_symbol2scm ("Prepare")); - d->add_listener (GET_LISTENER (finish), ly_symbol2scm ("Finish")); + d->add_listener (GET_LISTENER (Score_engraver, one_time_step), ly_symbol2scm ("OneTimeStep")); + d->add_listener (GET_LISTENER (Score_engraver, prepare), ly_symbol2scm ("Prepare")); + d->add_listener (GET_LISTENER (Score_engraver, finish), ly_symbol2scm ("Finish")); } /* @@ -127,9 +128,9 @@ void Score_engraver::disconnect_from_context () { Dispatcher *d = context ()->get_global_context ()->event_source (); - d->remove_listener (GET_LISTENER (one_time_step), ly_symbol2scm ("OneTimeStep")); - d->remove_listener (GET_LISTENER (prepare), ly_symbol2scm ("Prepare")); - d->remove_listener (GET_LISTENER (finish), ly_symbol2scm ("Finish")); + d->remove_listener (GET_LISTENER (Score_engraver, one_time_step), ly_symbol2scm ("OneTimeStep")); + d->remove_listener (GET_LISTENER (Score_engraver, prepare), ly_symbol2scm ("Prepare")); + d->remove_listener (GET_LISTENER (Score_engraver, finish), ly_symbol2scm ("Finish")); Engraver_group::disconnect_from_context (); } @@ -142,7 +143,6 @@ Score_engraver::finalize () typeset_all (); } -IMPLEMENT_LISTENER (Score_engraver, one_time_step); void Score_engraver::one_time_step (SCM) { @@ -157,10 +157,10 @@ Score_engraver::one_time_step (SCM) } void -Score_engraver::announce_grob (Grob_info info) +Score_engraver::announce_grob (Grob_info info, Direction start_end, Context *reroute_context) { - Engraver_group::announce_grob (info); - if (info.start_end () == START) + Engraver_group::announce_grob (info, start_end, reroute_context); + if (start_end == START) { pscore_->root_system ()->typeset_grob (info.grob ()); elems_.push_back (info.grob ()); diff --git a/lily/score-performer.cc b/lily/score-performer.cc index 1ab23e096f..b44bb489f5 100644 --- a/lily/score-performer.cc +++ b/lily/score-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Jan Nieuwenhuizen + Copyright (C) 1996--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,6 @@ #include "string-convert.hh" #include "warn.hh" #include "audio-staff.hh" -#include "audio-item.hh" ADD_TRANSLATOR_GROUP (Score_performer, /* doc */ @@ -86,48 +85,46 @@ Score_performer::connect_to_context (Context *c) Performer_group::connect_to_context (c); Dispatcher *d = c->get_global_context ()->event_source (); - d->add_listener (GET_LISTENER (one_time_step), ly_symbol2scm ("OneTimeStep")); - d->add_listener (GET_LISTENER (prepare), ly_symbol2scm ("Prepare")); - d->add_listener (GET_LISTENER (finish), ly_symbol2scm ("Finish")); + d->add_listener (GET_LISTENER (Score_performer, one_time_step), ly_symbol2scm ("OneTimeStep")); + d->add_listener (GET_LISTENER (Score_performer, prepare), ly_symbol2scm ("Prepare")); + d->add_listener (GET_LISTENER (Score_performer, finish), ly_symbol2scm ("Finish")); } void Score_performer::disconnect_from_context () { Dispatcher *d = context ()->get_global_context ()->event_source (); - d->remove_listener (GET_LISTENER (one_time_step), ly_symbol2scm ("OneTimeStep")); - d->remove_listener (GET_LISTENER (prepare), ly_symbol2scm ("Prepare")); - d->remove_listener (GET_LISTENER (finish), ly_symbol2scm ("Finish")); + d->remove_listener (GET_LISTENER (Score_performer, one_time_step), ly_symbol2scm ("OneTimeStep")); + d->remove_listener (GET_LISTENER (Score_performer, prepare), ly_symbol2scm ("Prepare")); + d->remove_listener (GET_LISTENER (Score_performer, finish), ly_symbol2scm ("Finish")); Performer_group::disconnect_from_context (); } -IMPLEMENT_LISTENER (Score_performer, prepare); void Score_performer::prepare (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); + Stream_event *ev = unsmob (sev); SCM sm = ev->get_property ("moment"); - Moment *m = unsmob_moment (sm); + Moment *m = unsmob (sm); audio_column_ = new Audio_column (*m); announce_element (Audio_element_info (audio_column_, 0)); precomputed_recurse_over_translators (context (), START_TRANSLATION_TIMESTEP, UP); } -IMPLEMENT_LISTENER (Score_performer, finish); void Score_performer::finish (SCM) { SCM channel_mapping = context ()->get_property ("midiChannelMapping"); - bool use_ports = channel_mapping == ly_symbol2scm ("voice"); + bool use_ports = scm_is_eq (channel_mapping, ly_symbol2scm ("voice")); performance_->ports_ = use_ports; - recurse_over_translators (context (), - &Translator::finalize, - &Translator_group::finalize, - UP); + recurse_over_translators + (context (), + Callback0_wrapper::make_smob (), + Callback0_wrapper::make_smob (), + UP); } -IMPLEMENT_LISTENER (Score_performer, one_time_step); void Score_performer::one_time_step (SCM) { diff --git a/lily/score-scheme.cc b/lily/score-scheme.cc index 98ff693ad2..1d3e55bc6e 100644 --- a/lily/score-scheme.cc +++ b/lily/score-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ LY_DEFINE (ly_score_output_defs, "ly:score-output-defs", "All output definitions in a score.") { LY_ASSERT_SMOB (Score, score, 1); - Score *sc = unsmob_score (score); + Score *sc = unsmob (score); SCM l = SCM_EOL; for (vsize i = 0; i < sc->defs_.size (); i++) @@ -58,8 +58,8 @@ LY_DEFINE (ly_score_add_output_def_x, "ly:score-add-output-def!", { LY_ASSERT_SMOB (Score, score, 1); LY_ASSERT_SMOB (Output_def, def, 2); - Score *sc = unsmob_score (score); - Output_def *output_def = unsmob_output_def (def); + Score *sc = unsmob (score); + Output_def *output_def = unsmob (def); sc->add_output_def (output_def); return SCM_UNSPECIFIED; } @@ -69,7 +69,7 @@ LY_DEFINE (ly_score_header, "ly:score-header", "Return score header.") { LY_ASSERT_SMOB (Score, score, 1); - Score *sc = unsmob_score (score); + Score *sc = unsmob (score); return sc->get_header (); } @@ -81,7 +81,7 @@ LY_DEFINE (ly_score_set_header_x, "ly:score-set-header!", SCM_ASSERT_TYPE (ly_is_module (module), module, SCM_ARG2, __FUNCTION__, "module"); - Score *sc = unsmob_score (score); + Score *sc = unsmob (score); sc->set_header (module); return SCM_UNSPECIFIED; } @@ -91,7 +91,7 @@ LY_DEFINE (ly_score_music, "ly:score-music", "Return score music.") { LY_ASSERT_SMOB (Score, score, 1); - Score *sc = unsmob_score (score); + Score *sc = unsmob (score); return sc->get_music (); } @@ -100,7 +100,7 @@ LY_DEFINE (ly_score_error_p, "ly:score-error?", "Was there an error in the score?") { LY_ASSERT_SMOB (Score, score, 1); - Score *sc = unsmob_score (score); + Score *sc = unsmob (score); return scm_from_bool (sc->error_found_); } @@ -113,8 +113,8 @@ LY_DEFINE (ly_score_embedded_format, "ly:score-embedded-format", LY_ASSERT_SMOB (Score, score, 1); LY_ASSERT_SMOB (Output_def, layout, 2); - Score *sc = unsmob_score (score); - Output_def *od = unsmob_output_def (layout); + Score *sc = unsmob (score); + Output_def *od = unsmob (layout); if (sc->error_found_) return SCM_EOL; @@ -124,13 +124,18 @@ LY_DEFINE (ly_score_embedded_format, "ly:score-embedded-format", /* UGR, FIXME, these are default \layout blocks once again. They suck. */ for (vsize i = 0; !score_def && i < sc->defs_.size (); i++) - if (sc->defs_[i]->c_variable ("is-layout") == SCM_BOOL_T) + if (to_boolean (sc->defs_[i]->c_variable ("is-layout"))) score_def = sc->defs_[i]; if (!score_def) return SCM_BOOL_F; - score_def = scale_output_def (score_def, output_scale (od)); + /* Don't rescale if the layout has already been scaled */ + if (to_boolean (score_def->c_variable ("cloned"))) + score_def = score_def->clone (); + else + score_def = scale_output_def (score_def, output_scale (od)); + score_def->parent_ = od; SCM context = ly_run_translator (sc->get_music (), score_def->unprotect ()); diff --git a/lily/score.cc b/lily/score.cc index 77002d82ab..d10023dd85 100644 --- a/lily/score.cc +++ b/lily/score.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,20 +28,19 @@ using namespace std; #include "global-context.hh" #include "international.hh" #include "lily-parser.hh" +#include "ly-module.hh" #include "main.hh" #include "music.hh" -#include "music.hh" #include "output-def.hh" #include "paper-book.hh" #include "paper-score.hh" #include "warn.hh" -#include "ly-smobs.icc" Input * Score::origin () const { - return unsmob_input (input_location_); + return unsmob (input_location_); } Score::Score () @@ -53,39 +52,28 @@ Score::Score () error_found_ = false; smobify_self (); - input_location_ = make_input (Input ()); + input_location_ = Input ().smobbed_copy (); } Score::~Score () { } -IMPLEMENT_SMOBS (Score); -IMPLEMENT_DEFAULT_EQUAL_P (Score); -IMPLEMENT_TYPE_P (Score, "ly:score?"); +const char * const Score::type_p_name_ = "ly:score?"; SCM -Score::mark_smob (SCM s) +Score::mark_smob () const { - Score *sc = (Score *) SCM_CELL_WORD_1 (s); - - scm_gc_mark (sc->header_); - for (vsize i = sc->defs_.size (); i--;) - scm_gc_mark (sc->defs_[i]->self_scm ()); + scm_gc_mark (header_); + for (vsize i = defs_.size (); i--;) + scm_gc_mark (defs_[i]->self_scm ()); - scm_gc_mark (sc->input_location_); - return sc->music_; -} - -int -Score::print_smob (SCM, SCM p, scm_print_state *) -{ - scm_puts ("#", p); - - return 1; + scm_gc_mark (input_location_); + return music_; } Score::Score (Score const &s) + : Smob () { header_ = SCM_EOL; music_ = SCM_EOL; @@ -93,9 +81,9 @@ Score::Score (Score const &s) error_found_ = s.error_found_; smobify_self (); - input_location_ = make_input (*s.origin ()); + input_location_ = s.origin ()->smobbed_copy (); - Music *m = unsmob_music (s.music_); + Music *m = unsmob (s.music_); if (m) { Music *mclone = m->clone (); @@ -129,7 +117,7 @@ Score::book_rendering (Output_def *layoutbook, Real scale = 1.0; - if (layoutbook && layoutbook->c_variable ("is-paper") == SCM_BOOL_T) + if (layoutbook && to_boolean (layoutbook->c_variable ("is-paper"))) scale = scm_to_double (layoutbook->c_variable ("output-scale")); SCM outputs = SCM_EOL; @@ -141,7 +129,7 @@ Score::book_rendering (Output_def *layoutbook, Output_def *def = outdef_count ? defs_[i] : default_def; SCM scaled = def->self_scm (); - if (def->c_variable ("is-layout") == SCM_BOOL_T) + if (to_boolean (def->c_variable ("is-layout"))) { def = scale_output_def (def, scale); def->parent_ = layoutbook; @@ -151,7 +139,7 @@ Score::book_rendering (Output_def *layoutbook, /* TODO: fix or junk --no-layout. */ SCM context = ly_run_translator (music_, scaled); - if (dynamic_cast (unsmob_context (context))) + if (unsmob (context)) { SCM s = ly_format_output (context); @@ -167,24 +155,26 @@ Score::book_rendering (Output_def *layoutbook, void Score::set_music (SCM music) { - if (unsmob_music (music_)) + if (unsmob (music_)) { - unsmob_music (music)->origin ()->error (_ ("already have music in score")); - unsmob_music (music_)->origin ()->error (_ ("this is the previous music")); + unsmob (music)->origin ()->non_fatal_error + (_ ("already have music in score")); + unsmob (music_)->origin ()->non_fatal_error + (_ ("this is the previous music")); } - Music *m = unsmob_music (music); + Music *m = unsmob (music); if (m && to_boolean (m->get_property ("error-found"))) { - m->origin ()->error (_ ("errors found, ignoring music expression")); + m->origin ()->non_fatal_error + (_ ("errors found, ignoring music expression")); - this->error_found_ = this->error_found_ - || to_boolean (m->get_property ("error-found")); + error_found_ = true; } - if (this->error_found_) - this->music_ = SCM_EOL; + if (error_found_) + music_ = SCM_EOL; else - this->music_ = music; + music_ = music; } SCM diff --git a/lily/script-column-engraver.cc b/lily/script-column-engraver.cc index d9a894f63e..6310f3b540 100644 --- a/lily/script-column-engraver.cc +++ b/lily/script-column-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ class Script_column_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Script_column_engraver); protected: - DECLARE_ACKNOWLEDGER (side_position); + void acknowledge_side_position (Grob_info); void process_acknowledged (); void stop_translation_timestep (); }; @@ -77,7 +77,12 @@ Script_column_engraver::process_acknowledged () script_column_ = make_item ("ScriptColumn", SCM_EOL); } -ADD_ACKNOWLEDGER (Script_column_engraver, side_position); +void +Script_column_engraver::boot () +{ + ADD_ACKNOWLEDGER (Script_column_engraver, side_position); +} + ADD_TRANSLATOR (Script_column_engraver, /* doc */ "Find potentially colliding scripts and put them into a" diff --git a/lily/script-column.cc b/lily/script-column.cc index 8c963929bf..94aa8908e7 100644 --- a/lily/script-column.cc +++ b/lily/script-column.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,14 +39,15 @@ Script_column::add_side_positioned (Grob *me, Grob *script) return; Pointer_group_interface::add_grob (me, ly_symbol2scm ("scripts"), script); + script->set_object ("script-column", me->self_scm ()); } LY_DEFINE (ly_grob_script_priority_less, "ly:grob-script-priority-less", 2, 0, 0, (SCM a, SCM b), "Compare two grobs by script priority. For internal use.") { - Grob *i1 = unsmob_grob (a); - Grob *i2 = unsmob_grob (b); + Grob *i1 = unsmob (a); + Grob *i2 = unsmob (b); SCM p1 = i1->get_property ("script-priority"); SCM p2 = i2->get_property ("script-priority"); @@ -58,7 +59,7 @@ MAKE_SCHEME_CALLBACK (Script_column, row_before_line_breaking, 1); SCM Script_column::row_before_line_breaking (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); vector horizontal_grobs; extract_grob_set (me, "scripts", scripts); @@ -71,8 +72,8 @@ Script_column::row_before_line_breaking (SCM smob) /* Don't want to consider scripts horizontally next to notes. */ - if (Accidental_placement::has_interface (sc) - || Arpeggio::has_interface (sc)) + if (has_interface (sc) + || has_interface (sc)) { affect_all_grobs.push_back (sc); } @@ -101,7 +102,7 @@ MAKE_SCHEME_CALLBACK (Script_column, before_line_breaking, 1); SCM Script_column::before_line_breaking (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); vector staff_sided; extract_grob_set (me, "scripts", scripts); @@ -146,7 +147,7 @@ Script_column::order_grobs (vector grobs) for (SCM s = ss; scm_is_pair (s); s = scm_cdr (s), last = g, last_initial_outside_staff = initial_outside_staff) { - g = unsmob_grob (scm_car (s)); + g = unsmob (scm_car (s)); initial_outside_staff = g->get_property ("outside-staff-priority"); if (last) //not the first grob in the list { @@ -157,7 +158,7 @@ Script_column::order_grobs (vector grobs) */ if (!scm_is_number (last_outside_staff)) for (SCM t = ss; !scm_is_eq (t, s); t = scm_cdr (t)) - Side_position_interface::add_support (g, unsmob_grob (scm_car (t))); + Side_position_interface::add_support (g, unsmob (scm_car (t))); /* if outside_staff_priority is missing or is equal to original outside_staff_priority of previous grob, set new @@ -179,5 +180,5 @@ ADD_INTERFACE (Script_column, " @code{script-priority} and @code{outside-staff-priority}.", /* properties */ - "" + "scripts " ); diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc index 3085f4f155..8a7b122f1f 100644 --- a/lily/script-engraver.cc +++ b/lily/script-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -54,14 +54,14 @@ protected: void stop_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (articulation); - DECLARE_ACKNOWLEDGER (rhythmic_head); - DECLARE_ACKNOWLEDGER (stem); - DECLARE_ACKNOWLEDGER (stem_tremolo); - DECLARE_ACKNOWLEDGER (tie); - DECLARE_END_ACKNOWLEDGER (tie); - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_ACKNOWLEDGER (inline_accidental); + void listen_articulation (Stream_event *); + void acknowledge_rhythmic_head (Grob_info); + void acknowledge_stem (Grob_info); + void acknowledge_stem_tremolo (Grob_info); + void acknowledge_tie (Grob_info); + void acknowledge_end_tie (Grob_info); + void acknowledge_note_column (Grob_info); + void acknowledge_inline_accidental (Grob_info); public: TRANSLATOR_DECLARATIONS (Script_engraver); @@ -71,7 +71,6 @@ Script_engraver::Script_engraver () { } -IMPLEMENT_TRANSLATOR_LISTENER (Script_engraver, articulation); void Script_engraver::listen_articulation (Stream_event *ev) { @@ -90,7 +89,7 @@ Script_engraver::listen_articulation (Stream_event *ev) void copy_property (Grob *g, SCM sym, SCM alist) { - if (g->internal_get_property (sym) == SCM_EOL) + if (scm_is_null (g->get_property (sym))) { SCM entry = scm_assoc (sym, alist); if (scm_is_pair (entry)) @@ -109,7 +108,7 @@ make_script_from_event (Grob *p, Context *tg, SCM alist = tg->get_property ("scriptDefinitions"); SCM art = scm_assoc (art_type, alist); - if (art == SCM_BOOL_F) + if (scm_is_false (art)) { /* FIXME: */ warning (_ ("do not know how to interpret articulation:")); @@ -132,7 +131,7 @@ make_script_from_event (Grob *p, Context *tg, SCM val = scm_cdar (s); - if (sym == ly_symbol2scm ("script-priority")) + if (scm_is_eq (sym, ly_symbol2scm ("script-priority"))) { priority_found = true; /* Make sure they're in order of user input by adding index i. @@ -144,8 +143,8 @@ make_script_from_event (Grob *p, Context *tg, } SCM preset = p->get_property_data (sym); - if (val == SCM_EOL - || scm_call_1 (type, preset) == SCM_BOOL_F) + if (scm_is_null (val) + || scm_is_false (scm_call_1 (type, preset))) p->set_property (sym, val); } @@ -275,13 +274,19 @@ Script_engraver::stop_translation_timestep () scripts_.clear (); } -ADD_ACKNOWLEDGER (Script_engraver, rhythmic_head); -ADD_ACKNOWLEDGER (Script_engraver, stem); -ADD_ACKNOWLEDGER (Script_engraver, tie); -ADD_END_ACKNOWLEDGER (Script_engraver, tie); -ADD_ACKNOWLEDGER (Script_engraver, note_column); -ADD_ACKNOWLEDGER (Script_engraver, stem_tremolo); -ADD_ACKNOWLEDGER (Script_engraver, inline_accidental); + +void +Script_engraver::boot () +{ + ADD_LISTENER (Script_engraver, articulation); + ADD_ACKNOWLEDGER (Script_engraver, rhythmic_head); + ADD_ACKNOWLEDGER (Script_engraver, stem); + ADD_ACKNOWLEDGER (Script_engraver, tie); + ADD_END_ACKNOWLEDGER (Script_engraver, tie); + ADD_ACKNOWLEDGER (Script_engraver, note_column); + ADD_ACKNOWLEDGER (Script_engraver, stem_tremolo); + ADD_ACKNOWLEDGER (Script_engraver, inline_accidental); +} ADD_TRANSLATOR (Script_engraver, /* doc */ diff --git a/lily/script-interface.cc b/lily/script-interface.cc index 28b978d329..24fe4dc082 100644 --- a/lily/script-interface.cc +++ b/lily/script-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,7 +36,7 @@ Script_interface::get_stencil (Grob *me, Direction d) assert (scm_is_pair (s)); SCM key = scm_car (s); - if (key == ly_symbol2scm ("feta")) + if (scm_is_eq (key, ly_symbol2scm ("feta"))) { SCM name_entry = scm_cdr (s); SCM str = ((scm_is_pair (name_entry)) ? index_get_cell (name_entry, d) @@ -54,7 +54,7 @@ MAKE_SCHEME_CALLBACK (Script_interface, calc_positioning_done, 1); SCM Script_interface::calc_positioning_done (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); if (Grob *par = me->get_parent (X_AXIS)) { Grob *stem = Note_column::get_stem (par); @@ -73,7 +73,7 @@ Script_interface::get_direction (Grob *me) relative_dir = to_dir (reldir); SCM other_elt = me->get_object ("direction-source"); - Grob *e = unsmob_grob (other_elt); + Grob *e = unsmob (other_elt); if (e) return (Direction) (relative_dir * get_grob_direction (e)); @@ -84,7 +84,7 @@ MAKE_SCHEME_CALLBACK (Script_interface, calc_direction, 1); SCM Script_interface::calc_direction (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Direction d = Script_interface::get_direction (me); if (!d) @@ -101,17 +101,17 @@ MAKE_SCHEME_CALLBACK (Script_interface, calc_cross_staff, 1); SCM Script_interface::calc_cross_staff (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Grob *stem = Note_column::get_stem (me->get_parent (X_AXIS)); if (stem && to_boolean (stem->get_property ("cross-staff"))) return SCM_BOOL_T; - Grob *slur = unsmob_grob (me->get_object ("slur")); + Grob *slur = unsmob (me->get_object ("slur")); SCM avoid_slur = me->get_property ("avoid-slur"); if (slur && to_boolean (slur->get_property ("cross-staff")) - && (avoid_slur == ly_symbol2scm ("outside") - || avoid_slur == ly_symbol2scm ("around"))) + && (scm_is_eq (avoid_slur, ly_symbol2scm ("outside")) + || scm_is_eq (avoid_slur, ly_symbol2scm ("around")))) return SCM_BOOL_T; return SCM_BOOL_F; @@ -122,7 +122,7 @@ MAKE_SCHEME_CALLBACK (Script_interface, print, 1); SCM Script_interface::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Direction dir = get_grob_direction (me); @@ -131,7 +131,6 @@ Script_interface::print (SCM smob) struct Text_script { - DECLARE_GROB_INTERFACE (); }; ADD_INTERFACE (Text_script, @@ -153,11 +152,13 @@ ADD_INTERFACE (Script_interface, "avoid-slur " "direction-source " "positioning-done " + "script-column " "script-priority " "script-stencil " "side-relative-direction " "slur " "slur-padding " "toward-stem-shift " + "toward-stem-shift-in-column " ); diff --git a/lily/script-row-engraver.cc b/lily/script-row-engraver.cc index c7c4286021..20af8d1cbb 100644 --- a/lily/script-row-engraver.cc +++ b/lily/script-row-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -39,8 +39,8 @@ class Script_row_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Script_row_engraver); protected: - DECLARE_ACKNOWLEDGER (accidental_placement); - DECLARE_ACKNOWLEDGER (side_position); + void acknowledge_accidental_placement (Grob_info); + void acknowledge_side_position (Grob_info); void process_acknowledged (); void stop_translation_timestep (); }; @@ -56,7 +56,7 @@ Script_row_engraver::stop_translation_timestep () if (script_row_) { for (vsize i = 0; i < scripts_.size (); i++) - if (Accidental_placement::has_interface (scripts_[i]) + if (has_interface (scripts_[i]) || Side_position_interface::get_axis (scripts_[i]) == X_AXIS) Script_column::add_side_positioned (script_row_, scripts_[i]); } @@ -89,8 +89,13 @@ Script_row_engraver::process_acknowledged () script_row_ = make_item ("ScriptRow", SCM_EOL); } -ADD_ACKNOWLEDGER (Script_row_engraver, accidental_placement); -ADD_ACKNOWLEDGER (Script_row_engraver, side_position); +void +Script_row_engraver::boot () +{ + ADD_ACKNOWLEDGER (Script_row_engraver, accidental_placement); + ADD_ACKNOWLEDGER (Script_row_engraver, side_position); +} + ADD_TRANSLATOR (Script_row_engraver, /* doc */ "Determine order in horizontal side position elements.", diff --git a/lily/self-alignment-interface.cc b/lily/self-alignment-interface.cc index 1b4e421b70..512f970e0e 100644 --- a/lily/self-alignment-interface.cc +++ b/lily/self-alignment-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,10 +19,7 @@ #include "self-alignment-interface.hh" -#include "directional-element-interface.hh" #include "grob.hh" -#include "grob-array.hh" -#include "interval-minefield.hh" #include "note-column.hh" #include "paper-column.hh" #include "pointer-group-interface.hh" @@ -32,30 +29,29 @@ MAKE_SCHEME_CALLBACK (Self_alignment_interface, y_aligned_on_self, 1); SCM Self_alignment_interface::y_aligned_on_self (SCM element) { - return aligned_on_self (unsmob_grob (element), Y_AXIS, false, 0, 0); + return aligned_on_self (unsmob (element), Y_AXIS, false, 0, 0); } MAKE_SCHEME_CALLBACK (Self_alignment_interface, x_aligned_on_self, 1); SCM Self_alignment_interface::x_aligned_on_self (SCM element) { - return aligned_on_self (unsmob_grob (element), X_AXIS, false, 0, 0); + return aligned_on_self (unsmob (element), X_AXIS, false, 0, 0); } MAKE_SCHEME_CALLBACK (Self_alignment_interface, pure_y_aligned_on_self, 3); SCM Self_alignment_interface::pure_y_aligned_on_self (SCM smob, SCM start, SCM end) { - return aligned_on_self (unsmob_grob (smob), Y_AXIS, true, robust_scm2int (start, 0), robust_scm2int (end, INT_MAX)); + return aligned_on_self (unsmob (smob), Y_AXIS, true, robust_scm2int (start, 0), robust_scm2int (end, INT_MAX)); } SCM Self_alignment_interface::aligned_on_self (Grob *me, Axis a, bool pure, int start, int end) { - SCM sym = (a == X_AXIS) ? ly_symbol2scm ("self-alignment-X") - : ly_symbol2scm ("self-alignment-Y"); - - SCM align (me->internal_get_property (sym)); + SCM align = (a == X_AXIS) + ? me->get_property ("self-alignment-X") + : me->get_property ("self-alignment-Y"); if (scm_is_number (align)) { Interval ext (me->maybe_pure_extent (me, a, pure, start, end)); @@ -79,108 +75,93 @@ MAKE_SCHEME_CALLBACK (Self_alignment_interface, centered_on_x_parent, 1); SCM Self_alignment_interface::centered_on_x_parent (SCM smob) { - return centered_on_object (unsmob_grob (smob)->get_parent (X_AXIS), X_AXIS); -} - -MAKE_SCHEME_CALLBACK (Self_alignment_interface, centered_on_note_columns, 1); -SCM -Self_alignment_interface::centered_on_note_columns (SCM smob) -{ - Item *it = unsmob_item (smob)->get_column (); - if (!it) - return scm_from_double (0.0); - - extract_grob_set (it, "elements", elts); - vector ncs; - Interval centers; - for (vsize i = 0; i < elts.size (); i++) - if (Note_column::has_interface (elts[i])) - centers.add_point (scm_to_double (centered_on_object (elts[i], X_AXIS))); - - if (centers.is_empty ()) - return scm_from_double (0.0); - - return scm_from_double (centers.center ()); + return centered_on_object (unsmob (smob)->get_parent (X_AXIS), X_AXIS); } MAKE_SCHEME_CALLBACK (Self_alignment_interface, centered_on_y_parent, 1); SCM Self_alignment_interface::centered_on_y_parent (SCM smob) { - return centered_on_object (unsmob_grob (smob)->get_parent (Y_AXIS), Y_AXIS); -} - -MAKE_SCHEME_CALLBACK (Self_alignment_interface, x_centered_on_y_parent, 1); -SCM -Self_alignment_interface::x_centered_on_y_parent (SCM smob) -{ - return centered_on_object (unsmob_grob (smob)->get_parent (Y_AXIS), X_AXIS); + return centered_on_object (unsmob (smob)->get_parent (Y_AXIS), Y_AXIS); } MAKE_SCHEME_CALLBACK (Self_alignment_interface, aligned_on_x_parent, 1); SCM Self_alignment_interface::aligned_on_x_parent (SCM smob) { - return aligned_on_parent (unsmob_grob (smob), X_AXIS); + return aligned_on_parent (unsmob (smob), X_AXIS); } MAKE_SCHEME_CALLBACK (Self_alignment_interface, aligned_on_y_parent, 1); SCM Self_alignment_interface::aligned_on_y_parent (SCM smob) { - return aligned_on_parent (unsmob_grob (smob), Y_AXIS); + return aligned_on_parent (unsmob (smob), Y_AXIS); } SCM Self_alignment_interface::aligned_on_parent (Grob *me, Axis a) { Grob *him = me->get_parent (a); - if (Paper_column::has_interface (him)) - return scm_from_double (0.0); + Interval he; + if (has_interface (him)) + /* + PaperColumn extents aren't reliable (they depend on size and alignment + of PaperColumn's children), so we align on NoteColumn instead. + This happens e.g. for lyrics without associatedVoice. + */ + he = Paper_column::get_interface_extent + (him, ly_symbol2scm ("note-column-interface"), a); + else + { + if (to_boolean (me->get_property ("X-align-on-main-noteheads")) + && has_interface (him)) + he = Note_column::calc_main_extent(him); + else + he = him->extent (him, a); + } - Interval he = him->extent (him, a); + SCM self_align = (a == X_AXIS) + ? me->get_property ("self-alignment-X") + : me->get_property ("self-alignment-Y"); - SCM sym = (a == X_AXIS) ? ly_symbol2scm ("self-alignment-X") - : ly_symbol2scm ("self-alignment-Y"); - SCM align_prop (me->internal_get_property (sym)); + SCM par_align = (a == X_AXIS) + ? me->get_property ("parent-alignment-X") + : me->get_property ("parent-alignment-Y"); - if (!scm_is_number (align_prop)) - return scm_from_int (0); + if (scm_is_null (par_align)) + par_align = self_align; Real x = 0.0; - Real align = scm_to_double (align_prop); - Interval ext (me->extent (me, a)); - // Empty extent doesn't mean an error - we simply don't align such grobs. - // However, empty extent and non-empty stencil would be suspicious. - if (!ext.is_empty ()) - x -= ext.linear_combination (align); - else if (me->get_stencil ()) - warning (me->name () + " has empty extent and non-empty stencil."); + if (scm_is_number (self_align)) + { + // Empty extent doesn't mean an error - we simply don't align such grobs. + // However, empty extent and non-empty stencil would be suspicious. + if (!ext.is_empty ()) + x -= ext.linear_combination (scm_to_double (self_align)); + else if (me->get_stencil ()) + warning (me->name () + " has empty extent and non-empty stencil."); + } - // See comment above. - if (!he.is_empty ()) - x += he.linear_combination (align); - else if (him->get_stencil ()) - warning (him->name () + " has empty extent and non-empty stencil."); + if (scm_is_number (par_align)) + { + // See comment above. + if (!he.is_empty ()) + x += he.linear_combination (scm_to_double (par_align)); + else if (him->get_stencil ()) + warning (him->name () + " has empty extent and non-empty stencil."); + } return scm_from_double (x); } void -Self_alignment_interface::set_center_parent (Grob *me, Axis a) -{ - add_offset_callback (me, - (a == X_AXIS) ? centered_on_x_parent_proc : centered_on_y_parent_proc, - a); -} - -void -Self_alignment_interface::set_align_self (Grob *me, Axis a) +Self_alignment_interface::set_aligned_on_parent (Grob *me, Axis a) { add_offset_callback (me, - (a == X_AXIS) ? x_aligned_on_self_proc : y_aligned_on_self_proc, + (a == X_AXIS) ? aligned_on_x_parent_proc : aligned_on_y_parent_proc, a); } @@ -199,11 +180,9 @@ ADD_INTERFACE (Self_alignment_interface, "@end table\n", /* properties */ - "collision-bias " - "collision-padding " - "potential-X-colliding-grobs " + "parent-alignment-X " + "parent-alignment-Y " "self-alignment-X " "self-alignment-Y " - "X-colliding-grobs " - "Y-colliding-grobs " + "X-align-on-main-noteheads " ); diff --git a/lily/semi-tie-column.cc b/lily/semi-tie-column.cc index 07ef344440..202195d830 100644 --- a/lily/semi-tie-column.cc +++ b/lily/semi-tie-column.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -33,7 +33,6 @@ ADD_INTERFACE (Semi_tie_column, "The interface for a column of l.v. (laissez vibrer) ties.", /* properties */ - "direction " "positioning-done " "head-direction " "tie-configuration " @@ -47,7 +46,7 @@ MAKE_SCHEME_CALLBACK (Semi_tie_column, calc_positioning_done, 1); SCM Semi_tie_column::calc_positioning_done (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); me->set_property ("positioning-done", SCM_BOOL_T); @@ -84,7 +83,7 @@ MAKE_SCHEME_CALLBACK (Semi_tie_column, calc_head_direction, 1); SCM Semi_tie_column::calc_head_direction (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "ties", ties); Direction d = LEFT; diff --git a/lily/semi-tie.cc b/lily/semi-tie.cc index 02b7f29415..0d31a2e073 100644 --- a/lily/semi-tie.cc +++ b/lily/semi-tie.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -22,12 +22,25 @@ #include "semi-tie.hh" #include "directional-element-interface.hh" #include "grob.hh" +#include "paper-column.hh" #include "tie.hh" #include "warn.hh" #include "staff-symbol-referencer.hh" ADD_INTERFACE (Semi_tie, - "A tie which is only on one side connected to a note head.", + "A tie which is only connected to a note head on one side." + "\n" + "The following properties may be set in the @code{details}" + " list:\n" + "\n" + "@table @code\n" + "@item height-limit\n" + "Maximum tie height: The longer the tie, the closer it is" + " to this height.\n" + "@item ratio\n" + "Parameter for tie shape. The higher this number, the" + " quicker the tie attains its @code{height-limit}.\n" + "@end table\n", /* properties */ "control-points " @@ -42,33 +55,58 @@ MAKE_SCHEME_CALLBACK (Semi_tie, calc_control_points, 1) SCM Semi_tie::calc_control_points (SCM smob) { - Grob *me = unsmob_grob (smob); + Item *me = LY_ASSERT_SMOB(Item, smob, 1); + (void) me->get_property ("direction"); - if (Semi_tie_column::has_interface (me->get_parent (Y_AXIS))) - { - me->get_parent (Y_AXIS)->get_property ("positioning-done"); - } - else + Grob *yparent = me->get_parent (Y_AXIS); + if (has_interface (yparent)) { - programming_error ("lv tie without Semi_tie_column. Killing lv tie."); - me->suicide (); + /* trigger positioning. */ + yparent->get_property ("positioning-done"); + + return me->get_property_data ("control-points"); } - return me->get_property_data ("control-points"); + programming_error ("lv tie without Semi_tie_column. Killing lv tie."); + me->suicide (); + return SCM_EOL; +} + +int +Semi_tie::get_column_rank (Item *me) +{ + return Paper_column::get_rank (me->get_column ()); } int -Semi_tie::get_position (Grob *me) +Semi_tie::get_position (Item *me) { - Grob *h = unsmob_grob (me->get_object ("note-head")); - return (int) rint (Staff_symbol_referencer::get_position (h)); + return (int) rint (Staff_symbol_referencer::get_position (head (me))); } bool -Semi_tie::less (Grob *const &s1, - Grob *const &s2) +Semi_tie::less (Grob *g1, Grob *g2) { - return get_position (s1) < get_position (s2); + Item *i1 = dynamic_cast (g1); + if (!i1) + { + g1->programming_error ("grob is not a semi-tie"); + return false; + } + + Item *i2 = dynamic_cast (g2); + if (!i2) + { + g2->programming_error ("grob is not a semi-tie"); + return true; + } + + return get_position (i1) < get_position (i2); } +Item * +Semi_tie::head (Item *me) +{ + return unsmob (me->get_object ("note-head")); +} diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc index 288b948152..5eb1407a31 100644 --- a/lily/separating-line-group-engraver.cc +++ b/lily/separating-line-group-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -59,8 +59,8 @@ protected: Spacings current_spacings_; Spacings last_spacings_; - DECLARE_ACKNOWLEDGER (item); - DECLARE_ACKNOWLEDGER (break_aligned); + void acknowledge_item (Grob_info); + void acknowledge_break_aligned (Grob_info); void stop_translation_timestep (); void start_translation_timestep (); @@ -78,7 +78,7 @@ Separating_line_group_engraver::acknowledge_item (Grob_info i) { Item *it = i.item (); - if (Note_spacing::has_interface (it)) + if (has_interface (it)) { current_spacings_.note_spacings_.push_back (it); return; @@ -88,7 +88,7 @@ Separating_line_group_engraver::acknowledge_item (Grob_info i) && !current_spacings_.staff_spacing_ && to_boolean (get_property ("createSpacing"))) { - Grob *col = unsmob_grob (get_property ("currentCommandColumn")); + Grob *col = unsmob (get_property ("currentCommandColumn")); current_spacings_.staff_spacing_ = make_item ("StaffSpacing", SCM_EOL); context ()->set_property ("hasStaffSpacing", SCM_BOOL_T); @@ -101,12 +101,12 @@ Separating_line_group_engraver::acknowledge_item (Grob_info i) && last_spacings_.staff_spacing_) { SCM ri = last_spacings_.staff_spacing_->get_object ("right-items"); - Grob_array *ga = unsmob_grob_array (ri); + Grob_array *ga = unsmob (ri); if (!ga) { SCM ga_scm = Grob_array::make_array (); last_spacings_.staff_spacing_->set_object ("right-items", ga_scm); - ga = unsmob_grob_array (ga_scm); + ga = unsmob (ga_scm); } ga->clear (); @@ -146,15 +146,20 @@ Separating_line_group_engraver::stop_translation_timestep () last_spacings_ = current_spacings_; if (Item *sp = current_spacings_.staff_spacing_) - if (Grob *col = unsmob_grob (get_property ("currentMusicalColumn"))) + if (Grob *col = unsmob (get_property ("currentMusicalColumn"))) Pointer_group_interface::add_grob (sp, ly_symbol2scm ("right-items"), col); current_spacings_.clear (); break_aligned_.clear (); } -ADD_ACKNOWLEDGER (Separating_line_group_engraver, item); -ADD_ACKNOWLEDGER (Separating_line_group_engraver, break_aligned); + +void +Separating_line_group_engraver::boot () +{ + ADD_ACKNOWLEDGER (Separating_line_group_engraver, item); + ADD_ACKNOWLEDGER (Separating_line_group_engraver, break_aligned); +} ADD_TRANSLATOR (Separating_line_group_engraver, /* doc */ diff --git a/lily/separation-item.cc b/lily/separation-item.cc index ebee8d6bf3..e29b8a9129 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -46,8 +46,8 @@ Separation_item::add_conditional_item (Grob *me, Grob *e) Real Separation_item::set_distance (Item *l, Item *r, Real padding) { - Drul_array lines (Skyline_pair::unsmob (l->get_property ("horizontal-skylines")), - Skyline_pair::unsmob (r->get_property ("horizontal-skylines"))); + Drul_array lines (unsmob (l->get_property ("horizontal-skylines")), + unsmob (r->get_property ("horizontal-skylines"))); Skyline right = conditional_skyline (r, l); right.merge ((*lines[RIGHT])[LEFT]); @@ -68,7 +68,7 @@ Separation_item::set_distance (Item *l, Item *r, Real padding) bool Separation_item::is_empty (Grob *me) { - Skyline_pair *sky = Skyline_pair::unsmob (me->get_property ("horizontal-skylines")); + Skyline_pair *sky = unsmob (me->get_property ("horizontal-skylines")); return (!sky || sky->is_empty ()); } @@ -87,7 +87,7 @@ MAKE_SCHEME_CALLBACK (Separation_item, calc_skylines, 1); SCM Separation_item::calc_skylines (SCM smob) { - Item *me = unsmob_item (smob); + Item *me = unsmob (smob); vector bs = boxes (me, 0); Skyline_pair sp (bs, Y_AXIS); /* @@ -129,7 +129,7 @@ Separation_item::boxes (Grob *me, Grob *left) vector other_elts; // for now only arpeggios for (vsize i = 0; i < read_only_elts.size (); i++) { - if (Accidental_placement::has_interface (read_only_elts[i])) + if (has_interface (read_only_elts[i])) accidental_elts.push_back (read_only_elts[i]); else other_elts.push_back (read_only_elts[i]); @@ -153,11 +153,11 @@ Separation_item::boxes (Grob *me, Grob *left) bounds all of them). However, we can't exclude an axis-group that adds to its childrens' stencil. Currently, this is just TrillPitchGroup; hence the check for note-head-interface. */ - if (Axis_group_interface::has_interface (il) - && !Note_head::has_interface (il)) + if (has_interface (il) + && !has_interface (il)) continue; - Interval y (il->pure_height (ycommon, 0, very_large)); + Interval y (il->pure_y_extent (ycommon, 0, very_large)); Interval x (il->extent (pc, X_AXIS)); Interval extra_width = robust_scm2interval (elts[i]->get_property ("extra-spacing-width"), @@ -186,16 +186,24 @@ Separation_item::boxes (Grob *me, Grob *left) return out; } -MAKE_SCHEME_CALLBACK (Separation_item, print, 1) +MAKE_DOCUMENTED_SCHEME_CALLBACK (Separation_item, print, 1, + "Optional stencil for @code{PaperColumn} or" + "@code{NonMusicalPaperColumn}.\n" + "Draws the @code{horizontal-skylines} of each" + " @code{PaperColumn}, showing the shapes used" + " to determine the minimum distances between" + " @code{PaperColumns} at the note-spacing step," + " before staves have been spaced (vertically)" + " on the page.") SCM Separation_item::print (SCM smob) { if (!debug_skylines) return SCM_BOOL_F; - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Stencil ret; - if (Skyline_pair *s = Skyline_pair::unsmob (me->get_property ("horizontal-skylines"))) + if (Skyline_pair *s = unsmob (me->get_property ("horizontal-skylines"))) { ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[LEFT].to_points (Y_AXIS)).in_color (255, 255, 0)); ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[RIGHT].to_points (Y_AXIS)).in_color (0, 255, 255)); diff --git a/lily/sequential-iterator.cc b/lily/sequential-iterator.cc index d616abb0f9..b02e58c62d 100644 --- a/lily/sequential-iterator.cc +++ b/lily/sequential-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ if (scm_is_pair (cursor_)) - iter_->music_ == unsmob_music (scm_car (cursor_)) + iter_->music_ == unsmob (scm_car (cursor_)) else iter_ == 0; @@ -96,7 +96,7 @@ create_grace_fixup_list (SCM cursor) for (; scm_is_pair (cursor); cursor = scm_cdr (cursor)) { - Music *mus = unsmob_music (scm_car (cursor)); + Music *mus = unsmob (scm_car (cursor)); Moment s = mus->start_mom (); Moment l = mus->get_length () - s; @@ -134,8 +134,8 @@ Sequential_iterator::construct_children () iter_ = 0; if (scm_is_pair (cursor_)) { - Music *m = unsmob_music (scm_car (cursor_)); - iter_ = unsmob_iterator (get_iterator (m)); + Music *m = unsmob (scm_car (cursor_)); + iter_ = unsmob (get_iterator (m)); } while (iter_ && !iter_->ok ()) @@ -195,7 +195,7 @@ Sequential_iterator::next_element (bool) iter_->quit (); if (scm_is_pair (cursor_)) - iter_ = unsmob_iterator (get_iterator (unsmob_music (scm_car (cursor_)))); + iter_ = unsmob (get_iterator (unsmob (scm_car (cursor_)))); else iter_ = 0; } diff --git a/lily/side-position-interface.cc b/lily/side-position-interface.cc index a53fa6a750..16e2929a66 100644 --- a/lily/side-position-interface.cc +++ b/lily/side-position-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -65,14 +65,14 @@ get_support_set (Grob *me) for (vsize i = 0; i < proto_support.size (); i++) { - if (Accidental_placement::has_interface (proto_support[i])) + if (has_interface (proto_support[i])) { Grob *accs = proto_support[i]; for (SCM acs = accs->get_object ("accidental-grobs"); scm_is_pair (acs); acs = scm_cdr (acs)) for (SCM s = scm_cdar (acs); scm_is_pair (s); s = scm_cdr (s)) { - Grob *a = unsmob_grob (scm_car (s)); + Grob *a = unsmob (scm_car (s)); support.insert (a); } } @@ -96,7 +96,7 @@ axis_aligned_side_helper (SCM smob, Axis a, bool pure, int start, int end, SCM c current_off_ptr = &r; } - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); // We will only ever want widths of spanners after line breaking // so we can set pure to false if (dynamic_cast (me) && a == X_AXIS) @@ -138,7 +138,7 @@ MAKE_SCHEME_CALLBACK (Side_position_interface, calc_cross_staff, 1) SCM Side_position_interface::calc_cross_staff (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "side-support-elements", elts); Direction my_dir = get_grob_direction (me) ; @@ -212,7 +212,7 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i pure, start, end); - if (Skyline_pair::unsmob (skyp)) + if (unsmob (skyp)) { // for spanner pure heights, we don't know horizontal spacing, // so a spanner can never have a meaningful x coordiante @@ -228,7 +228,7 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i Real yc = a == X_AXIS ? me->pure_relative_y_coordinate (common[Y_AXIS], start, end) : me->get_parent (Y_AXIS)->maybe_pure_coordinate (common[Y_AXIS], Y_AXIS, pure, start, end); - Skyline_pair copy = *Skyline_pair::unsmob (skyp); + Skyline_pair copy = *unsmob (skyp); copy.shift (a == X_AXIS ? yc : xc); copy.raise (a == X_AXIS ? xc : yc); my_dim = copy[-dir]; @@ -252,7 +252,7 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i continue; // so 'me' may not move in response to 'e' if (a == Y_AXIS - && Stem::has_interface (e)) + && has_interface (e)) { // If called as 'pure' we may not force a stem to set its direction, if (pure && !is_direction (e->get_property_data ("direction"))) @@ -271,7 +271,7 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i start, end); - if (Skyline_pair::unsmob (sp)) + if (unsmob (sp)) { Real xc = pure && dynamic_cast (e) ? e->get_parent (X_AXIS)->relative_coordinate (common[X_AXIS], X_AXIS) @@ -281,9 +281,9 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i Real yc = a == X_AXIS ? e->pure_relative_y_coordinate (common[Y_AXIS], start, end) : e->maybe_pure_coordinate (common[Y_AXIS], Y_AXIS, pure, start, end); - Skyline_pair copy = *Skyline_pair::unsmob (sp); + Skyline_pair copy = *unsmob (sp); if (a == Y_AXIS - && Stem::has_interface (e) + && has_interface (e) && to_boolean (me->get_maybe_pure_property ("add-stem-support", pure, start, end))) copy[dir].set_minimum_height (copy[dir].max_height ()); copy.shift (a == X_AXIS ? yc : xc); @@ -380,10 +380,9 @@ Side_position_interface::aligned_side (Grob *me, Axis a, bool pure, int start, i Interval staff_span = Staff_symbol::line_span (staff); staff_span.widen (1); if (staff_span.contains (position) - /* In case of a ledger lines, quantize even if we're outside the staff. */ - || (Note_head::has_interface (head) - - && abs (Staff_symbol_referencer::get_position (head)) > abs (position))) + /* If we are between notehead and staff, quantize for ledger lines. */ + || (has_interface (head) + && dir * position < 0)) { total_off += (rounded - position) * 0.5 * ss; if (Staff_symbol_referencer::on_line (me, int (rounded))) @@ -419,7 +418,7 @@ Side_position_interface::set_axis (Grob *me, Axis a) chain_offset_callback (me, (a == X_AXIS) ? x_aligned_side_proc - : ly_make_unpure_pure_container (y_aligned_side_proc, pure_y_aligned_side_proc), + : Unpure_pure_container::make_smob (y_aligned_side_proc, pure_y_aligned_side_proc), a); } } @@ -440,7 +439,7 @@ MAKE_SCHEME_CALLBACK (Side_position_interface, move_to_extremal_staff, 1); SCM Side_position_interface::move_to_extremal_staff (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); System *sys = dynamic_cast (me->get_system ()); Direction dir = get_grob_direction (me); if (dir != DOWN) @@ -465,7 +464,7 @@ Side_position_interface::move_to_extremal_staff (SCM smob) Axis_group_interface::add_element (top_staff, me); // Remove any cross-staff side-support dependencies - Grob_array *ga = unsmob_grob_array (me->get_object ("side-support-elements")); + Grob_array *ga = unsmob (me->get_object ("side-support-elements")); if (ga) { vector const &elts = ga->array (); diff --git a/lily/simple-closure.cc b/lily/simple-closure.cc deleted file mode 100644 index 59f9fd995b..0000000000 --- a/lily/simple-closure.cc +++ /dev/null @@ -1,154 +0,0 @@ -/* - This file is part of LilyPond, the GNU music typesetter. - - Copyright (C) 2005--2012 Han-Wen Nienhuys - - - LilyPond is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - LilyPond is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LilyPond. If not, see . -*/ -#include "simple-closure.hh" -#include "unpure-pure-container.hh" - -#include "grob.hh" - -static scm_t_bits simple_closure_tag; - -bool -is_simple_closure (SCM s) -{ - return (SCM_NIMP (s) && SCM_CELL_TYPE (s) == simple_closure_tag); -} - -SCM -simple_closure_expression (SCM smob) -{ - assert (is_simple_closure (smob)); - return (SCM) SCM_CELL_WORD_1 (smob); -} - -SCM -evaluate_args (SCM delayed_argument, SCM args, bool pure, int start, int end) -{ - SCM new_args = SCM_EOL; - SCM *tail = &new_args; - for (SCM s = args; scm_is_pair (s); s = scm_cdr (s)) - { - *tail = scm_cons (evaluate_with_simple_closure (delayed_argument, scm_car (s), - pure, start, end), - SCM_EOL); - if (scm_car (*tail) == SCM_UNSPECIFIED) - return SCM_UNSPECIFIED; - tail = SCM_CDRLOC (*tail); - } - - return new_args; -} - -SCM -evaluate_with_simple_closure (SCM delayed_argument, - SCM expr, - bool pure, - int start, - int end) -{ - if (is_simple_closure (expr)) - { - SCM inside = simple_closure_expression (expr); - SCM proc = is_unpure_pure_container (scm_car (inside)) - ? (pure ? scm_car (inside) : unpure_pure_container_unpure_part (scm_car (inside))) - : scm_car (inside); - SCM args = scm_cons (delayed_argument, - evaluate_args (delayed_argument, scm_cdr (inside), - pure, start, end)); - if (scm_cdr (args) == SCM_UNSPECIFIED) - return SCM_UNSPECIFIED; - if (pure) - return call_pure_function (proc, args, start, end); - return scm_apply_0 (proc, args); - } - else if (!scm_is_pair (expr)) - return expr; - else if (scm_car (expr) == ly_symbol2scm ("quote")) - return scm_cadr (expr); - else if (is_unpure_pure_container (scm_car (expr)) - || ly_is_procedure (scm_car (expr))) - { - SCM proc = is_unpure_pure_container (scm_car (expr)) - ? (pure ? scm_car (expr) : unpure_pure_container_unpure_part (scm_car (expr))) - : scm_car (expr); - SCM args = evaluate_args (delayed_argument, scm_cdr (expr), pure, start, end); - if (args == SCM_UNSPECIFIED) - return SCM_UNSPECIFIED; - if (pure) - return call_pure_function (proc, args, start, end); - return scm_apply_0 (proc, args); - } - else - // ugh. deviation from standard. Should print error? - return evaluate_args (delayed_argument, scm_cdr (expr), pure, start, end); - - assert (false); - return SCM_EOL; -} - -LY_DEFINE (ly_simple_closure_p, "ly:simple-closure?", - 1, 0, 0, (SCM clos), - "Is @var{clos} a simple closure?") -{ - return scm_from_bool (is_simple_closure (clos)); -} - -LY_DEFINE (ly_make_simple_closure, "ly:make-simple-closure", - 1, 0, 0, (SCM expr), - "Make a simple closure. @var{expr} should be form of" - " @code{(@var{func} @var{a1} @var{a2} @dots{})}, and will be" - " invoked as @code{(@var{func} @var{delayed-arg} @var{a1}" - " @var{a2} @dots{})}.") -{ - SCM z; - - SCM_NEWSMOB (z, simple_closure_tag, expr); - return z; -} - -LY_DEFINE (ly_eval_simple_closure, "ly:eval-simple-closure", - 2, 2, 0, (SCM delayed, SCM closure, SCM scm_start, SCM scm_end), - "Evaluate a simple @var{closure} with the given @var{delayed}" - " argument. If @var{scm-start} and @var{scm-end} are defined," - " evaluate it purely with those start and end points.") -{ - bool pure = (scm_is_number (scm_start) && scm_is_number (scm_end)); - int start = robust_scm2int (scm_start, 0); - int end = robust_scm2int (scm_end, 0); - SCM expr = simple_closure_expression (closure); - return evaluate_with_simple_closure (delayed, expr, pure, start, end); -} - -int -print_simple_closure (SCM s, SCM port, scm_print_state *) -{ - scm_puts ("#", port); - return 1; -} - -void init_simple_closure () -{ - simple_closure_tag = scm_make_smob_type ("simple-closure", 0); - scm_set_smob_mark (simple_closure_tag, scm_markcdr); - scm_set_smob_print (simple_closure_tag, print_simple_closure); -}; - -ADD_SCM_INIT_FUNC (simple_closure, init_simple_closure); diff --git a/lily/simple-music-iterator.cc b/lily/simple-music-iterator.cc index 60856235ee..8345d60d6f 100644 --- a/lily/simple-music-iterator.cc +++ b/lily/simple-music-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/simple-spacer-scheme.cc b/lily/simple-spacer-scheme.cc index 3b47562595..7c1c866c61 100644 --- a/lily/simple-spacer-scheme.cc +++ b/lily/simple-spacer-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,7 +48,7 @@ LY_DEFINE (ly_solve_spring_rod_problem, "ly:solve-spring-rod-problem", SCM_ASSERT_TYPE (scm_ilength (rods) > 0, rods, SCM_ARG1, __FUNCTION__, "list of rods"); LY_ASSERT_TYPE (scm_is_number, length, 3); - bool is_ragged = ragged == SCM_BOOL_T; + bool is_ragged = to_boolean (ragged); Simple_spacer spacer; for (SCM s = springs; scm_is_pair (s); s = scm_cdr (s)) { diff --git a/lily/simple-spacer.cc b/lily/simple-spacer.cc index aef524da87..bf64413a8a 100644 --- a/lily/simple-spacer.cc +++ b/lily/simple-spacer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys TODO: - add support for different stretch/shrink constants? @@ -193,9 +193,10 @@ Simple_spacer::expand_line () inv_hooke += springs_[i].inverse_stretch_strength (); if (inv_hooke == 0.0) /* avoid division by zero. If springs are infinitely stiff */ - return 0.0; /* anyway, then it makes no difference what the force is */ + inv_hooke = 1e-6; /* then report a very large stretching force */ - assert (cur_len <= line_len_); + if (cur_len > (1 + 1e-6) * line_len_) + programming_error ("misuse of expand_line"); return (line_len_ - cur_len) / inv_hooke + force_; } @@ -219,8 +220,8 @@ Simple_spacer::compress_line () fits_ = true; - assert (line_len_ <= cur_len); - + if (line_len_ > (1 + 1e-6) * cur_len) + programming_error ("misuse of compress_line"); vector sorted_springs = springs_; sort (sorted_springs.begin (), sorted_springs.end (), greater ()); @@ -248,7 +249,9 @@ Simple_spacer::compress_line () /* Paranoia check. */ - assert (fabs (configuration_length (cur_force) - cur_len) < 1e-6); + if (fabs (configuration_length (cur_force) - cur_len) > 1e-6 * cur_len) + programming_error (to_string ("mis-predicted force, %.6f ~= %.6f", + cur_len, configuration_length(cur_force))); return cur_force; } @@ -380,7 +383,7 @@ get_column_description (vector const &cols, vsize col_index, bool line_s for (SCM s = Spaceable_grob::get_minimum_distances (col); scm_is_pair (s); s = scm_cdr (s)) { - Grob *other = unsmob_grob (scm_caar (s)); + Grob *other = unsmob (scm_caar (s)); vsize j = binary_search (cols, other, Paper_column::less_than, col_index); if (j != VPOS) { @@ -528,28 +531,9 @@ get_line_configuration (vector const &columns, 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")) + if (scm_is_eq (p, ly_symbol2scm ("force"))) ret.satisfies_constraints_ = false; } return ret; } - -#include "ly-smobs.icc" - -IMPLEMENT_SIMPLE_SMOBS (Simple_spacer); -IMPLEMENT_DEFAULT_EQUAL_P (Simple_spacer); - -SCM -Simple_spacer::mark_smob (SCM /* x */) -{ - return SCM_EOL; -} - -int -Simple_spacer::print_smob (SCM /* x */, SCM p, scm_print_state *) -{ - scm_puts ("#", p); - return 1; -} - diff --git a/lily/simultaneous-music-iterator.cc b/lily/simultaneous-music-iterator.cc index 3e0ad4fae7..e892776b61 100644 --- a/lily/simultaneous-music-iterator.cc +++ b/lily/simultaneous-music-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,7 +39,7 @@ void Simultaneous_music_iterator::derived_substitute (Context *f, Context *t) { for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) - unsmob_iterator (scm_car (s))->substitute_outlet (f, t); + unsmob (scm_car (s))->substitute_outlet (f, t); } void @@ -53,10 +53,10 @@ Simultaneous_music_iterator::construct_children () SCM *tail = &children_list_; for (; scm_is_pair (i); i = scm_cdr (i), j++) { - Music *mus = unsmob_music (scm_car (i)); + Music *mus = unsmob (scm_car (i)); SCM scm_iter = get_static_get_iterator (mus); - Music_iterator *mi = unsmob_iterator (scm_iter); + Music_iterator *mi = unsmob (scm_iter); /* if create_separate_contexts_ is set, create a new context with the number number as name */ @@ -82,15 +82,20 @@ Simultaneous_music_iterator::construct_children () } } +// If we have some iterators with definite next moment and no of them +// remain after processing, we take the iterators with indefinite next +// moment along. That makes sure that no Lyric_combine_music_iterator +// will outstay its welcome (issue 2010). + void Simultaneous_music_iterator::process (Moment until) { SCM *proc = &children_list_; + bool finite = !pending_moment ().main_part_.is_infinity (); while (scm_is_pair (*proc)) { - Music_iterator *i = unsmob_iterator (scm_car (*proc)); - if (i->run_always () - || i->pending_moment () == until) + Music_iterator *i = unsmob (scm_car (*proc)); + if (i->run_always () || i->pending_moment () == until) i->process (until); if (!i->ok ()) { @@ -98,7 +103,26 @@ Simultaneous_music_iterator::process (Moment until) *proc = scm_cdr (*proc); } else - proc = SCM_CDRLOC (*proc); + { + proc = SCM_CDRLOC (*proc); + } + } + // If there were definite-ended iterators and all of them died, take + // the rest of the iterators along with them. They have + // likely lost their reference iterators. Basing this on the actual + // music contexts is not reliable since something like + // \new Voice = blah { + // << \context Voice = blah { c4 d } + // \addlyrics { oh no } + // >> e f + // } + // cannot wait for the death of context blah before ending the + // simultaneous iterator. + if (finite && pending_moment ().main_part_.is_infinity ()) + { + for (SCM p = children_list_; scm_is_pair (p); p = scm_cdr (p)) + unsmob (scm_car (p))->quit (); + children_list_ = SCM_EOL; } } @@ -110,7 +134,7 @@ Simultaneous_music_iterator::pending_moment () const for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) { - Music_iterator *it = unsmob_iterator (scm_car (s)); + Music_iterator *it = unsmob (scm_car (s)); next = min (next, it->pending_moment ()); } @@ -120,16 +144,13 @@ Simultaneous_music_iterator::pending_moment () const bool Simultaneous_music_iterator::ok () const { - bool run_always_ok = false; for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) { - Music_iterator *it = unsmob_iterator (scm_car (s)); - if (!it->run_always ()) + Music_iterator *it = unsmob (scm_car (s)); + if (it->ok ()) return true; - else - run_always_ok = run_always_ok || it->ok (); } - return run_always_ok; + return false; } bool @@ -137,7 +158,7 @@ Simultaneous_music_iterator::run_always () const { for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) { - Music_iterator *it = unsmob_iterator (scm_car (s)); + Music_iterator *it = unsmob (scm_car (s)); if (it->run_always ()) return true; } @@ -148,7 +169,7 @@ void Simultaneous_music_iterator::do_quit () { for (SCM s = children_list_; scm_is_pair (s); s = scm_cdr (s)) - unsmob_iterator (scm_car (s))->quit (); + unsmob (scm_car (s))->quit (); } IMPLEMENT_CTOR_CALLBACK (Simultaneous_music_iterator); diff --git a/lily/skyline-pair.cc b/lily/skyline-pair.cc index 164117c35b..bab43494a6 100644 --- a/lily/skyline-pair.cc +++ b/lily/skyline-pair.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2008--2012 Han-Wen Nienhuys + Copyright (C) 2008--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -21,7 +21,6 @@ #include "skyline-pair.hh" #include "international.hh" -#include "ly-smobs.icc" Skyline_pair::Skyline_pair () : skylines_ (Skyline (DOWN), Skyline (UP)) @@ -55,13 +54,6 @@ Skyline_pair::raise (Real r) skylines_[DOWN].raise (r); } -void -Skyline_pair::deholify () -{ - skylines_[UP].deholify (); - skylines_[DOWN].deholify (); -} - void Skyline_pair::shift (Real r) { @@ -128,31 +120,14 @@ Skyline_pair::operator [] (Direction d) const return skylines_[d]; } -IMPLEMENT_SIMPLE_SMOBS (Skyline_pair); -IMPLEMENT_TYPE_P (Skyline_pair, "ly:skyline-pair?"); -IMPLEMENT_DEFAULT_EQUAL_P (Skyline_pair); +const char * const Skyline_pair::type_p_name_ = "ly:skyline-pair?"; -SCM -Skyline_pair::mark_smob (SCM) -{ - return SCM_EOL; -} - -int -Skyline_pair::print_smob (SCM s, SCM port, scm_print_state *) -{ - Skyline_pair *r = (Skyline_pair *) SCM_CELL_WORD_1 (s); - (void) r; - - scm_puts ("#", port); - return 1; -} MAKE_SCHEME_CALLBACK (Skyline_pair, skyline, 2); SCM Skyline_pair::skyline (SCM smob, SCM dir_scm) { - Skyline_pair *sp = Skyline_pair::unsmob (smob); + Skyline_pair *sp = unsmob (smob); Direction dir = robust_scm2dir (dir_scm, UP); if (dir == CENTER) diff --git a/lily/skyline.cc b/lily/skyline.cc index a462015866..6ef2069c39 100644 --- a/lily/skyline.cc +++ b/lily/skyline.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Joe Neeman + Copyright (C) 2006--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,8 +22,6 @@ #include #include -#include "ly-smobs.icc" - /* A skyline is a sequence of non-overlapping buildings: something like this: _______ @@ -125,11 +123,11 @@ Building::precompute (Real start, Real start_height, Real end_height, Real end) assert (start_height == end_height); y_intercept_ = start_height; } - else if (fabs(slope_) > 1e6) + else if (fabs (slope_) > 1e6) // too steep to be stored in slope-intercept form, given round-off error { slope_ = 0.0; - y_intercept_ = max(start_height, end_height); + y_intercept_ = max (start_height, end_height); } else y_intercept_ = start_height - slope_ * start; @@ -154,13 +152,6 @@ Building::intersection_x (Building const &other) const return isnan (ret) ? -infinity_f : ret; } -void -Building::leading_part (Real chop) -{ - assert (chop <= end_); - end_ = chop; -} - // Returns a shift s such that (x + s, y) intersects the roof of // this building. If no such shift exists, returns infinity_f. Real @@ -174,50 +165,12 @@ Building::shift_to_intersect (Real x, Real y) const return infinity_f; } -static Real -first_intersection (Building const &b, list *s, Real start_x) -/* Return the first x >= start_x where skyline s above Building b. - * Removes buildings from s that are concealed by b. */ -{ - while (!s->empty () && start_x < b.end_) - { - Building c = s->front (); - - // conceals and intersection_x involve multiplication and - // division. Avoid that, if we can. - if (c.y_intercept_ == -infinity_f) - { - if (c.end_ > b.end_) - return b.end_; - start_x = c.end_; - s->pop_front (); - continue; - } - - if (c.conceals (b, start_x)) - return start_x; - - Real i = b.intersection_x (c); - if (i > start_x && i <= b.end_ && i <= c.end_) - return i; - - start_x = c.end_; - if (b.end_ > c.end_) - s->pop_front (); - } - return b.end_; -} - bool -Building::conceals (Building const &other, Real x) const +Building::above (Building const &other, Real x) const { - if (slope_ == other.slope_) - return y_intercept_ > other.y_intercept_; - - /* their slopes were not equal, so there is an intersection point */ - Real i = intersection_x (other); - return (i <= x && slope_ > other.slope_) - || (i > x && slope_ < other.slope_); + return (isinf (y_intercept_) || isinf (other.y_intercept_) || isinf (x)) + ? y_intercept_ > other.y_intercept_ + : (slope_ - other.slope_) * x + y_intercept_ > other.y_intercept_; } // Remove redundant empty buildings from the skyline. @@ -247,93 +200,80 @@ Skyline::normalize () } void -Skyline::deholify () -{ - // Since a skyline should always be normalized, we can - // assume that there are never two adjacent empty buildings. - // That is, if center is empty then left and right are not. - list::iterator left = buildings_.begin (); - list::iterator center = buildings_.begin (); - list::iterator right; - - for (right = buildings_.begin (); right != buildings_.end (); right++) - { - if (center != buildings_.begin () && center->y_intercept_ == -infinity_f) - { - Real p1 = left->height (left->end_); - Real p2 = right->height (right->start_); - *center = Building (center->start_, p1, p2, center->end_); - - left = center; - center = right; - } - } -} - -void -Skyline::internal_merge_skyline (list *s1, list *s2, +Skyline::internal_merge_skyline (list *sb, list *sc, list *const result) const { - if (s1->empty () || s2->empty ()) + if (sb->empty () || sc->empty ()) { programming_error ("tried to merge an empty skyline"); return; } - Real x = -infinity_f; - Real last_end = -infinity_f; - while (!s1->empty ()) + Building b = sb->front (); + for (; !sc->empty (); sc->pop_front ()) { - if (s2->front ().conceals (s1->front (), x)) - swap (s1, s2); - - Building b = s1->front (); - Building c = s2->front (); - - // Optimization: if the other skyline is empty at this point, - // we can avoid testing some intersections. Just grab as many - // buildings from s1 as we can, and shove them onto the output. - if (c.y_intercept_ == -infinity_f - && c.end_ >= b.end_) - { - list::iterator i = s1->begin (); - i++; - while (i != s1->end () && i->end_ <= c.end_) - i++; - - s1->front ().start_ = x; - result->splice (result->end (), *s1, s1->begin (), i); - x = result->back ().end_; - last_end = x; - continue; - } - // first_intersection() removes buildings from s2 if b hides them - Real end = first_intersection (b, s2, x); - if (s2->empty ()) + /* Building b is continuing from the previous pass through the loop. + Building c is newly-considered, and starts no earlier than b started. + The comments draw b as if its roof had zero slope ----. + with dashes where b lies above c. + The roof of c could rise / or fall \ through the roof of b, + or the vertical sides | of c could intersect the roof of b. */ + Building c = sc->front (); + if (b.end_ < c.end_) /* finish with b */ { - b.start_ = last_end; - result->push_back (b); - break; + if (b.end_ <= b.start_) /* we are already finished with b */ + ; + else if (c.above (b, c.start_)) /* -| . | */ + { + Building m (b); + m.end_ = c.start_; + if (m.end_ > m.start_) + result->push_back (m); + if (b.above (c, b.end_)) /* -|\--. */ + { + Building n (c); + n.end_ = b.start_ = b.intersection_x (c); + result->push_back (n); + result->push_back (b); + } + } + else + { + if (c.above (b, b.end_)) /* ---/ . | */ + b.end_ = b.intersection_x (c); + else /* -----. */ + c.start_ = b.end_; + result->push_back (b); + } + /* 'c' continues further, so move it into 'b' for the next pass. */ + b = c; + swap (sb, sc); } - - // Should be (end > x), during ver2.19. end == x happens fairly often, - // and we do not need to keep vertical segments within a skyline. - if (end >= x) + else /* b.end_ > c.end_ so finish with c */ { - b.leading_part (end); - b.start_ = last_end; - last_end = b.end_; - result->push_back (b); + if (c.above (b, c.start_)) /* -| |---. */ + { + Building m (b); + m.end_ = c.start_; + if (m.end_ > m.start_) + result->push_back (m); + if (b.above (c, c.end_)) /* -| \---. */ + c.end_ = b.intersection_x (c); + } + else if (c.above (b, c.end_)) /* ---/|--. */ + { + Building m (b); + c.start_ = m.end_ = b.intersection_x (c); + result->push_back (m); + } + else /* c is completely hidden by b */ + continue; + result->push_back (c); + b.start_ = c.end_; } - - if (end >= s1->front ().end_) - s1->pop_front (); - // Should add during ver2.19 (to avoid an endless loop - // when merging identical skylines with a vertical segment) - // if (end >= s2->front().end_) s2->pop_front(); - - x = end; } + if (b.end_ > b.start_) + result->push_back (b); } static void @@ -862,27 +802,7 @@ Skyline::clear () /****************************************************************/ -IMPLEMENT_SIMPLE_SMOBS (Skyline); -IMPLEMENT_TYPE_P (Skyline, "ly:skyline?"); -IMPLEMENT_DEFAULT_EQUAL_P (Skyline); - -SCM -Skyline::mark_smob (SCM s) -{ - ASSERT_LIVE_IS_ALLOWED (s); - return SCM_EOL; -} - -int -Skyline::print_smob (SCM s, SCM port, scm_print_state *) -{ - Skyline *r = (Skyline *) SCM_CELL_WORD_1 (s); - (void) r; - - scm_puts ("#", port); - - return 1; -} +const char * const Skyline::type_p_name_ = "ly:skyline?"; MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Skyline, get_touching_point, 3, 1, "") SCM @@ -891,14 +811,14 @@ Skyline::get_touching_point (SCM skyline_scm, SCM other_skyline_scm, SCM horizon LY_ASSERT_SMOB (Skyline, other_skyline_scm, 1); Real horizon_padding = 0; - if (horizon_padding_scm != SCM_UNDEFINED) + if (!SCM_UNBNDP (horizon_padding_scm)) { LY_ASSERT_TYPE (scm_is_number, horizon_padding_scm, 3); horizon_padding = scm_to_double (horizon_padding_scm); } - Skyline *skyline = Skyline::unsmob (skyline_scm); - Skyline *other_skyline = Skyline::unsmob (other_skyline_scm); + Skyline *skyline = unsmob (skyline_scm); + Skyline *other_skyline = unsmob (other_skyline_scm); return scm_from_double (skyline->touching_point (*other_skyline, horizon_padding)); } @@ -909,14 +829,14 @@ Skyline::get_distance (SCM skyline_scm, SCM other_skyline_scm, SCM horizon_paddi LY_ASSERT_SMOB (Skyline, other_skyline_scm, 1); Real horizon_padding = 0; - if (horizon_padding_scm != SCM_UNDEFINED) + if (!SCM_UNBNDP (horizon_padding_scm)) { LY_ASSERT_TYPE (scm_is_number, horizon_padding_scm, 3); horizon_padding = scm_to_double (horizon_padding_scm); } - Skyline *skyline = Skyline::unsmob (skyline_scm); - Skyline *other_skyline = Skyline::unsmob (other_skyline_scm); + Skyline *skyline = unsmob (skyline_scm); + Skyline *other_skyline = unsmob (other_skyline_scm); return scm_from_double (skyline->distance (*other_skyline, horizon_padding)); } @@ -924,14 +844,14 @@ MAKE_SCHEME_CALLBACK (Skyline, get_max_height, 1) SCM Skyline::get_max_height (SCM skyline_scm) { - return scm_from_double (Skyline::unsmob (skyline_scm)->max_height ()); + return scm_from_double (unsmob (skyline_scm)->max_height ()); } MAKE_SCHEME_CALLBACK (Skyline, get_max_height_position, 1) SCM Skyline::get_max_height_position (SCM skyline_scm) { - return scm_from_double (Skyline::unsmob (skyline_scm)->max_height_position ()); + return scm_from_double (unsmob (skyline_scm)->max_height_position ()); } MAKE_SCHEME_CALLBACK (Skyline, get_height, 2) @@ -939,14 +859,14 @@ SCM Skyline::get_height (SCM skyline_scm, SCM x_scm) { Real x = robust_scm2double (x_scm, 0.0); - return scm_from_double (Skyline::unsmob (skyline_scm)->height (x)); + return scm_from_double (unsmob (skyline_scm)->height (x)); } LY_DEFINE (ly_skyline_empty_p, "ly:skyline-empty?", 1, 0, 0, (SCM sky), "Return whether @var{sky} is empty.") { - Skyline *s = Skyline::unsmob (sky); + Skyline *s = unsmob (sky); LY_ASSERT_SMOB (Skyline, sky, 1); return scm_from_bool (s->is_empty ()); } diff --git a/lily/slash-repeat-engraver.cc b/lily/slash-repeat-engraver.cc index 7844faf604..b1bdf9c0da 100644 --- a/lily/slash-repeat-engraver.cc +++ b/lily/slash-repeat-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys , Erik Sandberg + Copyright (C) 2000--2015 Han-Wen Nienhuys , Erik Sandberg LilyPond is free software: you can redistribute it and/or modify @@ -35,7 +35,7 @@ public: protected: Stream_event *slash_; protected: - DECLARE_TRANSLATOR_LISTENER (repeat_slash); + void listen_repeat_slash (Stream_event *); void process_music (); }; @@ -44,7 +44,6 @@ Slash_repeat_engraver::Slash_repeat_engraver () slash_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Slash_repeat_engraver, repeat_slash); void Slash_repeat_engraver::listen_repeat_slash (Stream_event *ev) { @@ -65,6 +64,12 @@ Slash_repeat_engraver::process_music () } } +void +Slash_repeat_engraver::boot () +{ + ADD_LISTENER (Slash_repeat_engraver, repeat_slash); +} + ADD_TRANSLATOR (Slash_repeat_engraver, /* doc */ "Make beat repeats.", diff --git a/lily/slur-configuration.cc b/lily/slur-configuration.cc index 332995ac99..dc453a9729 100644 --- a/lily/slur-configuration.cc +++ b/lily/slur-configuration.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,27 +43,41 @@ avoid_staff_line (Slur_score_state const &state, && (state.extremes_[LEFT].staff_ == state.extremes_[RIGHT].staff_) && state.extremes_[LEFT].staff_ && state.extremes_[RIGHT].staff_) { - Real y = bez.curve_point (ts[0])[Y_AXIS]; + Real t = ts[0]; //the first (usually only) point where slur is horizontal + Real y = bez.curve_point (t)[Y_AXIS]; + // A Bezier curve at t moves 3t-3t² as far as the middle control points + Real factor = 3.0 * t * (1.0 - t); Grob *staff = state.extremes_[LEFT].staff_; Real p = 2 * (y - staff->relative_coordinate (state.common_[Y_AXIS], Y_AXIS)) / state.staff_space_; - Real const round = my_round (p); - Real const frac = p - round; - if (fabs (frac) < 4 * state.thickness_ - && Staff_symbol_referencer::on_staff_line (staff, int (round))) + int round_p = (int) my_round (p); + if (!Staff_symbol_referencer::on_staff_line (staff, round_p)) + round_p += (p > round_p) ? 1 : -1; + if (!Staff_symbol_referencer::on_staff_line (staff, round_p)) + return bez; + + Real const distance = (p - round_p) * state.staff_space_ / 2.0; + // Allow half the thickness of the slur at the point t, plus one basic + // blot-diameter (half for the slur outline, half for the staff line) + Real const min_distance = 0.5 * state.thickness_ * factor + + state.line_thickness_ + + ((state.dir_ * distance > 0.0) + ? state.parameters_.gap_to_staffline_inside_ + : state.parameters_.gap_to_staffline_outside_); + if (fabs (distance) < min_distance) { - Direction resolution_dir = frac ? state.dir_ : CENTER; + Direction resolution_dir = (distance > 0.0) ? UP : DOWN; - // TODO: parameter - Real newp = round + resolution_dir * 5 * state.thickness_; - - Real dy = (newp - p) * state.staff_space_ / 2.0; + Real dy = resolution_dir * (min_distance - fabs (distance)); + // Shape the curve, moving the horizontal point by factor * dy bez.control_[1][Y_AXIS] += dy; bez.control_[2][Y_AXIS] += dy; + // Move the entire curve by the remaining amount + bez.translate (Offset (0.0, dy - factor * dy)); } } return bez; @@ -320,7 +334,7 @@ Slur_configuration::score_extra_encompass (Slur_score_state const &state) // we find forbidden attachments vector forbidden_attachments; for (vsize i = 0; i < state.extra_encompass_infos_.size (); i++) - if (Tie::has_interface (state.extra_encompass_infos_[i].grob_)) + if (has_interface (state.extra_encompass_infos_[i].grob_)) { Grob *t = state.extra_encompass_infos_[i].grob_; Grob *common_x = Grob::get_vertical_axis_group (t); @@ -398,14 +412,14 @@ Slur_configuration::score_extra_encompass (Slur_score_state const &state) } Real dist = 0.0; - if (info.type_ == ly_symbol2scm ("around")) + if (scm_is_eq (info.type_, ly_symbol2scm ("around"))) dist = info.extents_[Y_AXIS].distance (y); /* Have to score too: the curve enumeration is limited in its shape, and may produce curves which collide anyway. */ - else if (info.type_ == ly_symbol2scm ("inside")) + else if (scm_is_eq (info.type_, ly_symbol2scm ("inside"))) dist = state.dir_ * (y - info.extents_[Y_AXIS][state.dir_]); else programming_error ("unknown avoidance type"); diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index a8a54f535a..1a06ca6422 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,41 +17,44 @@ along with LilyPond. If not, see . */ -#include "engraver.hh" - #include "context.hh" #include "directional-element-interface.hh" #include "international.hh" #include "note-column.hh" +#include "pointer-group-interface.hh" +#include "slur-engraver.hh" #include "slur.hh" -#include "slur-proto-engraver.hh" #include "spanner.hh" -#include "stream-event.hh" #include "warn.hh" #include "translator.icc" -class Slur_engraver : public Slur_proto_engraver +SCM +Slur_engraver::event_symbol () const { - virtual void set_melisma (bool); + return ly_symbol2scm ("slur-event"); +} -protected: - DECLARE_TRANSLATOR_LISTENER (slur); +bool +Slur_engraver::double_property () const +{ + return to_boolean (get_property ("doubleSlurs")); +} -public: - TRANSLATOR_DECLARATIONS (Slur_engraver); -}; +SCM +Slur_engraver::grob_symbol () const +{ + return ly_symbol2scm ("Slur"); +} -Slur_engraver::Slur_engraver () : - Slur_proto_engraver ("doubleSlurs", "Slur", "slur", "slur-event") +const char * +Slur_engraver::object_name () const { + return "slur"; } -IMPLEMENT_TRANSLATOR_LISTENER (Slur_engraver, slur); -void -Slur_engraver::listen_slur (Stream_event *ev) +Slur_engraver::Slur_engraver () { - internal_listen_slur (ev); } void @@ -60,14 +63,21 @@ Slur_engraver::set_melisma (bool m) context ()->set_property ("slurMelismaBusy", ly_bool2scm (m)); } -ADD_ACKNOWLEDGER (Slur_engraver, inline_accidental); -ADD_ACKNOWLEDGER (Slur_engraver, fingering); -ADD_ACKNOWLEDGER (Slur_engraver, note_column); -ADD_ACKNOWLEDGER (Slur_engraver, script); -ADD_ACKNOWLEDGER (Slur_engraver, text_script); -ADD_ACKNOWLEDGER (Slur_engraver, dots); -ADD_END_ACKNOWLEDGER (Slur_engraver, tie); -ADD_ACKNOWLEDGER (Slur_engraver, tuplet_number); +void +Slur_engraver::boot () +{ + ADD_LISTENER (Slur_engraver, slur); + ADD_LISTENER (Slur_engraver, note); + ADD_ACKNOWLEDGER_FOR (Slur_engraver, extra_object, inline_accidental); + ADD_ACKNOWLEDGER_FOR (Slur_engraver, extra_object, fingering); + ADD_ACKNOWLEDGER (Slur_engraver, note_column); + ADD_ACKNOWLEDGER (Slur_engraver, script); + ADD_ACKNOWLEDGER_FOR (Slur_engraver, extra_object, text_script); + ADD_ACKNOWLEDGER_FOR (Slur_engraver, extra_object, dots); + ADD_END_ACKNOWLEDGER_FOR (Slur_engraver, extra_object, tie); + ADD_ACKNOWLEDGER_FOR (Slur_engraver, extra_object, tuplet_number); +} + ADD_TRANSLATOR (Slur_engraver, /* doc */ "Build slur grobs from slur events.", @@ -82,3 +92,278 @@ ADD_TRANSLATOR (Slur_engraver, /* write */ "" ); + +void +Slur_engraver::derived_mark () const +{ + for (vsize i = start_events_.size (); i--;) + { + scm_gc_mark (start_events_[i].slur_->self_scm ()); + if (start_events_[i].note_) + scm_gc_mark (start_events_[i].note_->self_scm ()); + } + for (vsize i = stop_events_.size (); i--;) + { + scm_gc_mark (stop_events_[i].slur_->self_scm ()); + if (stop_events_[i].note_) + scm_gc_mark (stop_events_[i].note_->self_scm ()); + } +} + +void +Slur_engraver::listen_note_slur (Stream_event *ev, Stream_event *note) +{ + Direction d = to_dir (ev->get_property ("span-direction")); + if (d == START) + start_events_.push_back (Event_info (ev, note)); + else if (d == STOP) + stop_events_.push_back (Event_info (ev, note)); + else ev->origin ()->warning (_f ("direction of %s invalid: %d", + ev->name ().c_str (), + int (d))); +} + +void +Slur_engraver::listen_note (Stream_event *ev) +{ + for (SCM arts = ev->get_property ("articulations"); + scm_is_pair (arts); arts = scm_cdr (arts)) + { + Stream_event *art = unsmob (scm_car (arts)); + if (art->in_event_class (event_symbol ())) + listen_note_slur (art, ev); + } +} + +void +Slur_engraver::acknowledge_note_column (Grob_info info) +{ + Grob *e = info.grob (); + for (vsize i = slurs_.size (); i--;) + Slur::add_column (slurs_[i], e); + for (vsize i = end_slurs_.size (); i--;) + Slur::add_column (end_slurs_[i], e); + // Now cater for slurs starting/ending at a notehead: those override + // the column bounds + if (note_slurs_[START].empty () && note_slurs_[STOP].empty ()) + return; + extract_grob_set (e, "note-heads", heads); + for (vsize i = heads.size (); i--;) + { + if (Stream_event *ev = + unsmob (heads[i]->get_property ("cause"))) + for (LEFT_and_RIGHT (d)) + { + std::pair its + = note_slurs_[d].equal_range (ev); + for (Note_slurs::const_iterator it = its.first; + it != its.second; + ++it) + it->second->set_bound (d, heads[i]); + } + } +} + +void +Slur_engraver::acknowledge_extra_object (Grob_info info) +{ + objects_to_acknowledge_.push_back (info); +} + +void +Slur_engraver::acknowledge_script (Grob_info info) +{ + if (!info.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface"))) + acknowledge_extra_object (info); +} + +void +Slur_engraver::finalize () +{ + for (vsize i = 0; i < slurs_.size (); i++) + { + slurs_[i]->warning (_f ("unterminated %s", object_name ())); + slurs_[i]->suicide (); + } + slurs_.clear (); +} + +void +Slur_engraver::create_slur (const string &spanner_id, Event_info evi, Grob *g_cause, Direction dir, bool left_broken) +{ + Grob *ccc = left_broken + ? unsmob (get_property ("currentCommandColumn")) + : 0; // efficiency + SCM cause = evi.slur_ ? evi.slur_->self_scm () : g_cause->self_scm (); + Spanner *slur = make_spanner (grob_symbol (), cause); + slur->set_property ("spanner-id", ly_string2scm (spanner_id)); + if (dir) + set_grob_direction (slur, dir); + if (left_broken) + slur->set_bound (LEFT, ccc); + slurs_.push_back (slur); + if (evi.note_) + note_slurs_[START].insert (Note_slurs::value_type (evi.note_, slur)); + + if (double_property ()) + { + set_grob_direction (slur, DOWN); + slur = make_spanner (grob_symbol (), cause); + slur->set_property ("spanner-id", ly_string2scm (spanner_id)); + set_grob_direction (slur, UP); + if (left_broken) + slur->set_bound (LEFT, ccc); + slurs_.push_back (slur); + if (evi.note_) + note_slurs_[START].insert(Note_slurs::value_type (evi.note_, slur)); + } + +} + +bool +Slur_engraver::can_create_slur (const string &id, vsize old_slurs, vsize *event_idx, Stream_event *ev) +{ + for (vsize j = slurs_.size (); j--;) + { + Grob *slur = slurs_[j]; + Direction updown = to_dir (ev->get_property ("direction")); + + // Check if we already have a slur with the same spanner-id. + if (id == robust_scm2string (slur->get_property ("spanner-id"), "")) + { + if (j < old_slurs) + { + // We already have an old slur, so give a warning + // and completely ignore the new slur. + ev->origin ()->warning (_f ("already have %s", object_name ())); + if (event_idx) + start_events_.erase (start_events_.begin () + (*event_idx)); + return false; + } + + // If this slur event has no direction, it will not + // contribute anything new to the existing slur(s), so + // we can ignore it. + + if (!updown) + return false; + + Stream_event *c = unsmob (slur->get_property ("cause")); + + if (!c) + { + slur->programming_error (_f ("%s without a cause", object_name ())); + return true; + } + + Direction slur_dir = to_dir (c->get_property ("direction")); + + // If the existing slur does not have a direction yet, + // we'd rather take the new one. + + if (!slur_dir) + { + slur->suicide (); + slurs_.erase (slurs_.begin () + j); + return true; + } + + // If the existing slur has the same direction as ours, drop ours + + if (slur_dir == updown) + return false; + } + } + return true; +} + +bool +Slur_engraver::try_to_end (Event_info evi) +{ + string id = robust_scm2string (evi.slur_->get_property ("spanner-id"), ""); + + // Find the slurs that are ended with this event (by checking the spanner-id) + bool ended = false; + for (vsize j = slurs_.size (); j--;) + { + if (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), "")) + { + ended = true; + end_slurs_.push_back (slurs_[j]); + if (evi.note_) + note_slurs_[STOP].insert + (Note_slurs::value_type + (evi.note_, dynamic_cast (slurs_[j]))); + slurs_.erase (slurs_.begin () + j); + } + } + return ended; +} + +void +Slur_engraver::process_music () +{ + for (vsize i = 0; i < stop_events_.size (); i++) + { + string id = robust_scm2string + (stop_events_[i].slur_->get_property ("spanner-id"), ""); + bool ended = try_to_end (stop_events_[i]); + if (ended) + { + // Ignore redundant stop events for this id + for (vsize j = stop_events_.size (); --j > i;) + { + if (id == robust_scm2string + (stop_events_[j].slur_->get_property ("spanner-id"), "")) + stop_events_.erase (stop_events_.begin () + j); + } + } + else + stop_events_[i].slur_->origin ()->warning (_f ("cannot end %s", object_name ())); + } + + vsize old_slurs = slurs_.size (); + for (vsize i = start_events_.size (); i--;) + { + Stream_event *ev = start_events_[i].slur_; + string id = robust_scm2string (ev->get_property ("spanner-id"), ""); + Direction updown = to_dir (ev->get_property ("direction")); + + if (can_create_slur (id, old_slurs, &i, ev)) + create_slur (id, start_events_[i], 0, updown, false); + } + + set_melisma (slurs_.size ()); +} + +void +Slur_engraver::stop_translation_timestep () +{ + if (Grob *g = unsmob (get_property ("currentCommandColumn"))) + { + for (vsize i = 0; i < end_slurs_.size (); i++) + Slur::add_extra_encompass (end_slurs_[i], g); + + if (!start_events_.size ()) + for (vsize i = 0; i < slurs_.size (); i++) + Slur::add_extra_encompass (slurs_[i], g); + } + + for (vsize i = 0; i < end_slurs_.size (); i++) + { + Spanner *s = dynamic_cast (end_slurs_[i]); + if (!s->get_bound (RIGHT)) + s->set_bound (RIGHT, unsmob (get_property ("currentMusicalColumn"))); + announce_end_grob (s, SCM_EOL); + } + + for (vsize i = 0; i < objects_to_acknowledge_.size (); i++) + Slur::auxiliary_acknowledge_extra_object (objects_to_acknowledge_[i], slurs_, end_slurs_); + + note_slurs_[LEFT].clear (); + note_slurs_[RIGHT].clear (); + objects_to_acknowledge_.clear (); + end_slurs_.clear (); + start_events_.clear (); + stop_events_.clear (); +} diff --git a/lily/slur-performer.cc b/lily/slur-performer.cc index f57a9b7a38..47fed784fe 100644 --- a/lily/slur-performer.cc +++ b/lily/slur-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Jan Nieuwenhuizen + Copyright (C) 1996--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,7 +40,7 @@ protected: void process_music (); void set_melisma (bool); - DECLARE_TRANSLATOR_LISTENER (slur); + void listen_slur (Stream_event *); private: Stream_event *start_ev_; Stream_event *now_stop_ev_; @@ -83,7 +83,6 @@ Slur_performer::start_translation_timestep () now_stop_ev_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Slur_performer, slur); void Slur_performer::listen_slur (Stream_event *ev) { @@ -95,6 +94,12 @@ Slur_performer::listen_slur (Stream_event *ev) now_stop_ev_ = ev; } +void +Slur_performer::boot () +{ + ADD_LISTENER (Slur_performer, slur); +} + ADD_TRANSLATOR (Slur_performer, /* doc */ "", diff --git a/lily/slur-proto-engraver.cc b/lily/slur-proto-engraver.cc deleted file mode 100644 index f2e3456913..0000000000 --- a/lily/slur-proto-engraver.cc +++ /dev/null @@ -1,297 +0,0 @@ -/* - This file is part of LilyPond, the GNU music typesetter. - - Copyright (C) 2013 Mike Solomon - - LilyPond is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - LilyPond is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LilyPond. If not, see . -*/ - -#include "engraver.hh" - -#include "context.hh" -#include "directional-element-interface.hh" -#include "international.hh" -#include "note-column.hh" -#include "slur.hh" -#include "slur-proto-engraver.hh" -#include "spanner.hh" -#include "stream-event.hh" -#include "warn.hh" - -#include "translator.icc" - -void -Slur_proto_engraver::derived_mark () const -{ - for (vsize i = start_events_.size (); i--;) - scm_gc_mark (start_events_[i]->self_scm ()); - for (vsize i = stop_events_.size (); i--;) - scm_gc_mark (stop_events_[i]->self_scm ()); -} - -void -Slur_proto_engraver::internal_listen_slur (Stream_event *ev) -{ - Direction d = to_dir (ev->get_property ("span-direction")); - if (d == START) - start_events_.push_back (ev); - else if (d == STOP) - stop_events_.push_back (ev); - else ev->origin ()->warning (_f ("direction of %s invalid: %d", - event_name_, int (d))); -} - -void -Slur_proto_engraver::acknowledge_note_column (Grob_info info) -{ - Grob *e = info.grob (); - for (vsize i = slurs_.size (); i--;) - Slur::add_column (slurs_[i], e); - for (vsize i = end_slurs_.size (); i--;) - Slur::add_column (end_slurs_[i], e); -} - -void -Slur_proto_engraver::acknowledge_extra_object (Grob_info info) -{ - objects_to_acknowledge_.push_back (info); -} - -void -Slur_proto_engraver::acknowledge_inline_accidental (Grob_info info) -{ - acknowledge_extra_object (info); -} - -void -Slur_proto_engraver::acknowledge_dots (Grob_info info) -{ - acknowledge_extra_object (info); -} - -void -Slur_proto_engraver::acknowledge_fingering (Grob_info info) -{ - acknowledge_extra_object (info); -} - -void -Slur_proto_engraver::acknowledge_tuplet_number (Grob_info info) -{ - acknowledge_extra_object (info); -} - -void -Slur_proto_engraver::acknowledge_script (Grob_info info) -{ - if (!info.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface"))) - acknowledge_extra_object (info); -} - -void -Slur_proto_engraver::acknowledge_text_script (Grob_info info) -{ - acknowledge_extra_object (info); -} - -void -Slur_proto_engraver::acknowledge_end_tie (Grob_info info) -{ - acknowledge_extra_object (info); -} - -void -Slur_proto_engraver::finalize () -{ - for (vsize i = 0; i < slurs_.size (); i++) - { - slurs_[i]->warning (_f ("unterminated %s", object_name_)); - slurs_[i]->suicide (); - } - slurs_.clear (); -} - -void -Slur_proto_engraver::create_slur (const string &spanner_id, Stream_event *ev_cause, Grob *g_cause, Direction dir, bool left_broken) -{ - Grob *ccc = unsmob_grob (get_property ("currentCommandColumn")); - SCM cause = ev_cause ? ev_cause->self_scm () : g_cause->self_scm (); - Spanner *slur = make_spanner (grob_name_, cause); - slur->set_property ("spanner-id", ly_string2scm (spanner_id)); - if (dir) - set_grob_direction (slur, dir); - if (left_broken) - slur->set_bound (LEFT, ccc); - slurs_.push_back (slur); - if (double_property_name_ - && to_boolean (get_property (double_property_name_))) - { - set_grob_direction (slur, DOWN); - slur = make_spanner (grob_name_, cause); - slur->set_property ("spanner-id", ly_string2scm (spanner_id)); - set_grob_direction (slur, UP); - if (left_broken) - slur->set_bound (LEFT, ccc); - slurs_.push_back (slur); - } - -} - -bool -Slur_proto_engraver::can_create_slur (const string &id, vsize old_slurs, vsize *event_idx, Stream_event *ev) -{ - for (vsize j = slurs_.size (); j--;) - { - Grob *slur = slurs_[j]; - Direction updown = to_dir (ev->get_property ("direction")); - - // Check if we already have a slur with the same spanner-id. - if (id == robust_scm2string (slur->get_property ("spanner-id"), "")) - { - if (j < old_slurs) - { - // We already have an old slur, so give a warning - // and completely ignore the new slur. - ev->origin ()->warning (_f ("already have %s", object_name_)); - if (event_idx) - start_events_.erase (start_events_.begin () + (*event_idx)); - return false; - } - - // If this slur event has no direction, it will not - // contribute anything new to the existing slur(s), so - // we can ignore it. - - if (!updown) - return false; - - Stream_event *c = unsmob_stream_event (slur->get_property ("cause")); - - if (!c) - { - slur->programming_error (_f ("%s without a cause", object_name_)); - return true; - } - - Direction slur_dir = to_dir (c->get_property ("direction")); - - // If the existing slur does not have a direction yet, - // we'd rather take the new one. - - if (!slur_dir) - { - slur->suicide (); - slurs_.erase (slurs_.begin () + j); - return true; - } - - // If the existing slur has the same direction as ours, drop ours - - if (slur_dir == updown) - return false; - } - } - return true; -} - -bool -Slur_proto_engraver::try_to_end (Stream_event *ev) -{ - string id = robust_scm2string (ev->get_property ("spanner-id"), ""); - - // Find the slurs that are ended with this event (by checking the spanner-id) - bool ended = false; - for (vsize j = slurs_.size (); j--;) - { - if (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), "")) - { - ended = true; - end_slurs_.push_back (slurs_[j]); - slurs_.erase (slurs_.begin () + j); - } - } - return ended; -} - -void -Slur_proto_engraver::process_music () -{ - for (vsize i = 0; i < stop_events_.size (); i++) - { - string id = robust_scm2string (stop_events_[i]->get_property ("spanner-id"), ""); - bool ended = try_to_end (stop_events_[i]); - if (ended) - { - // Ignore redundant stop events for this id - for (vsize j = stop_events_.size (); --j > i;) - { - if (id == robust_scm2string (stop_events_[j]->get_property ("spanner-id"), "")) - stop_events_.erase (stop_events_.begin () + j); - } - } - else - stop_events_[i]->origin ()->warning (_f ("cannot end %s", object_name_)); - } - - vsize old_slurs = slurs_.size (); - for (vsize i = start_events_.size (); i--;) - { - Stream_event *ev = start_events_[i]; - string id = robust_scm2string (ev->get_property ("spanner-id"), ""); - Direction updown = to_dir (ev->get_property ("direction")); - - if (can_create_slur (id, old_slurs, &i, ev)) - create_slur (id, ev, 0, updown, false); - } - - set_melisma (slurs_.size ()); -} - -void -Slur_proto_engraver::set_melisma (bool) -{ -} - -void -Slur_proto_engraver::stop_translation_timestep () -{ - if (Grob *g = unsmob_grob (get_property ("currentCommandColumn"))) - { - for (vsize i = 0; i < end_slurs_.size (); i++) - Slur::add_extra_encompass (end_slurs_[i], g); - - if (!start_events_.size ()) - for (vsize i = 0; i < slurs_.size (); i++) - Slur::add_extra_encompass (slurs_[i], g); - } - - for (vsize i = 0; i < end_slurs_.size (); i++) - { - Spanner *s = dynamic_cast (end_slurs_[i]); - if (!s->get_bound (RIGHT)) - s->set_bound (RIGHT, unsmob_grob (get_property ("currentMusicalColumn"))); - announce_end_grob (s, SCM_EOL); - } - - for (vsize i = 0; i < objects_to_acknowledge_.size (); i++) - Slur::auxiliary_acknowledge_extra_object (objects_to_acknowledge_[i], slurs_, end_slurs_); - - objects_to_acknowledge_.clear (); - end_slurs_.clear (); - start_events_.clear (); - stop_events_.clear (); -} - -// no ADD_ACKNOWLEDGER / ADD_TRANSLATOR macro calls -// since this class is abstract diff --git a/lily/slur-score-parameters.cc b/lily/slur-score-parameters.cc index a8cbe4b7f9..46ac1e6295 100644 --- a/lily/slur-score-parameters.cc +++ b/lily/slur-score-parameters.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -56,6 +56,10 @@ Slur_score_parameters::fill (Grob *me) = get_detail (details, ly_symbol2scm ("max-slope-factor")); free_head_distance_ = get_detail (details, ly_symbol2scm ("free-head-distance")); + gap_to_staffline_inside_ + = get_detail (details, ly_symbol2scm ("gap-to-staffline-inside")); + gap_to_staffline_outside_ + = get_detail (details, ly_symbol2scm ("gap-to-staffline-outside")); absolute_closeness_measure_ = get_detail (details, ly_symbol2scm ("absolute-closeness-measure")); extra_object_collision_penalty_ diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index 47bb40611c..2d4865e190 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -32,6 +32,7 @@ #include "main.hh" #include "misc.hh" #include "note-column.hh" +#include "note-head.hh" #include "output-def.hh" #include "paper-column.hh" #include "pitch.hh" @@ -42,7 +43,6 @@ #include "staff-symbol-referencer.hh" #include "staff-symbol.hh" #include "stem.hh" -#include "time-signature.hh" #include "warn.hh" /* @@ -107,7 +107,7 @@ Slur_score_state::slur_direction () const Encompass_info Slur_score_state::get_encompass_info (Grob *col) const { - Grob *stem = unsmob_grob (col->get_object ("stem")); + Grob *stem = unsmob (col->get_object ("stem")); Encompass_info ei; if (!stem) @@ -162,7 +162,7 @@ Slur_score_state::get_bound_info () const for (LEFT_and_RIGHT (d)) { extremes[d].bound_ = slur_->get_bound (d); - if (Note_column::has_interface (extremes[d].bound_)) + if (has_interface (extremes[d].bound_)) { extremes[d].note_column_ = extremes[d].bound_; extremes[d].stem_ = Note_column::get_stem (extremes[d].note_column_); @@ -201,11 +201,14 @@ Slur_score_state::get_bound_info () const ::staff_space (extremes[d].stem_); } - if (extremes[d].slur_head_) - extremes[d].slur_head_x_extent_ - = extremes[d].slur_head_->extent (common_[X_AXIS], X_AXIS); - } + else if (has_interface (extremes[d].bound_)) + { + extremes[d].slur_head_ = extremes[d].bound_; + } + if (extremes[d].slur_head_) + extremes[d].slur_head_x_extent_ + = extremes[d].slur_head_->extent (common_[X_AXIS], X_AXIS); } return extremes; @@ -226,8 +229,8 @@ Slur_score_state::fill (Grob *me) Slur::replace_breakable_encompass_objects (me); staff_space_ = Staff_symbol_referencer::staff_space (me); - Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); - thickness_ = robust_scm2double (me->get_property ("thickness"), 1.0) * lt; + line_thickness_ = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); + thickness_ = robust_scm2double (me->get_property ("thickness"), 1.0) * line_thickness_; dir_ = slur_direction (); parameters_.fill (me); @@ -255,8 +258,8 @@ Slur_score_state::fill (Grob *me) } extremes_ = get_bound_info (); - is_broken_ = (!extremes_[LEFT].note_column_ - || !extremes_[RIGHT].note_column_); + is_broken_ = (!(extremes_[LEFT].note_column_ || extremes_[LEFT].slur_head_) + || !(extremes_[RIGHT].note_column_ || extremes_[RIGHT].slur_head_)); has_same_beam_ = (extremes_[LEFT].stem_ && extremes_[RIGHT].stem_ @@ -282,11 +285,12 @@ Slur_score_state::fill (Grob *me) end_ys[RIGHT], end_ys[LEFT]); Real encompass_place = extra_encompass_infos_[i].extents_[Y_AXIS][dir_]; - if (extra_encompass_infos_[i].type_ == ly_symbol2scm ("inside") + if (scm_is_eq (extra_encompass_infos_[i].type_, + ly_symbol2scm ("inside")) && minmax (dir_, encompass_place, y_place) == encompass_place && (!extra_encompass_infos_[i].grob_->internal_has_interface (ly_symbol2scm ("key-signature-interface")) - && !Clef::has_interface (extra_encompass_infos_[i].grob_) - && !Time_signature::has_interface (extra_encompass_infos_[i].grob_))) + && !has_interface (extra_encompass_infos_[i].grob_) + && !extra_encompass_infos_[i].grob_->internal_has_interface (ly_symbol2scm ("time-signature-interface")))) { for (LEFT_and_RIGHT (d)) additional_ys[d] = minmax (dir_, @@ -331,7 +335,7 @@ MAKE_SCHEME_CALLBACK (Slur, calc_control_points, 1) SCM Slur::calc_control_points (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Slur_score_state state; state.fill (me); @@ -470,6 +474,11 @@ Slur_score_state::get_y_attachment_range () const dir_ * (dir_ + nc_extent[dir_])), dir_ * base_attachments_[-d][Y_AXIS]); } + else if (extremes_[d].slur_head_) + { + // allow only minimal movement + end_ys[d] = base_attachments_[d][Y_AXIS] + 0.3 * dir_; + } else end_ys[d] = base_attachments_[d][Y_AXIS] + parameters_.region_size_ * dir_; } @@ -528,12 +537,22 @@ Slur_score_state::get_base_attachments () const : extremes_[d].bound_->extent (common_[X_AXIS], X_AXIS)) .linear_combination (CENTER); } + else if (head) + { + y = head->extent (common_[Y_AXIS], Y_AXIS) + .linear_combination (0.5*dir_); + + // Don't "move_away_from_staffline" because that makes it + // harder to recognize the specific attachment point + x = head->extent (common_[X_AXIS], X_AXIS)[-d]; + } + base_attachment[d] = Offset (x, y); } for (LEFT_and_RIGHT (d)) { - if (!extremes_[d].note_column_) + if (!extremes_[d].note_column_ && !extremes_[d].slur_head_) { Real x = 0; Real y = 0; @@ -627,7 +646,7 @@ Slur_score_state::generate_avoid_offsets () const extract_grob_set (slur_, "encompass-objects", extra_encompasses); for (vsize i = 0; i < extra_encompasses.size (); i++) { - if (Slur::has_interface (extra_encompasses[i])) + if (has_interface (extra_encompasses[i])) { Grob *small_slur = extra_encompasses[i]; Bezier b = Slur::get_curve (small_slur); @@ -639,7 +658,8 @@ Slur_score_state::generate_avoid_offsets () const z[Y_AXIS] += dir_ * parameters_.free_slur_distance_; avoid.push_back (z); } - else if (extra_encompasses[i]->get_property ("avoid-slur") == ly_symbol2scm ("inside")) + else if (scm_is_eq (extra_encompasses[i]->get_property ("avoid-slur"), + ly_symbol2scm ("inside"))) { Grob *g = extra_encompasses [i]; Interval xe = g->extent (common_[X_AXIS], X_AXIS); @@ -755,7 +775,7 @@ Slur_score_state::get_extra_encompass_infos () const vector collision_infos; for (vsize i = encompasses.size (); i--;) { - if (Slur::has_interface (encompasses[i])) + if (has_interface (encompasses[i])) { Spanner *small_slur = dynamic_cast (encompasses[i]); Bezier b = Slur::get_curve (small_slur); @@ -796,12 +816,12 @@ Slur_score_state::get_extra_encompass_infos () const Grob *g = encompasses [i]; Interval xe = g->extent (common_[X_AXIS], X_AXIS); Interval ye = g->extent (common_[Y_AXIS], Y_AXIS); - if (Dots::has_interface (g)) + if (has_interface (g)) ye.widen (0.2); Real xp = 0.0; Real penalty = parameters_.extra_object_collision_penalty_; - if (Accidental_interface::has_interface (g)) + if (has_interface (g)) { penalty = parameters_.accidental_collision_; diff --git a/lily/slur.cc b/lily/slur.cc index 0aa96c787d..5f95e5d4d6 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -47,7 +47,7 @@ MAKE_SCHEME_CALLBACK (Slur, calc_direction, 1) SCM Slur::calc_direction (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "note-columns", encompasses); if (encompasses.empty ()) @@ -81,7 +81,7 @@ Slur::pure_height (SCM smob, SCM start_scm, SCM end_scm) -- adding extra height for scripts that avoid slurs on the inside -- adding extra height for the "bulge" in a slur above a note head */ - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); int start = scm_to_int (start_scm); int end = scm_to_int (end_scm); Direction dir = get_grob_direction (me); @@ -99,7 +99,7 @@ Slur::pure_height (SCM smob, SCM start_scm, SCM end_scm) for (vsize i = 0; i < encompasses.size (); i++) { - Interval d = encompasses[i]->pure_height (parent, start, end); + Interval d = encompasses[i]->pure_y_extent (parent, start, end); if (!d.is_empty ()) { for (DOWN_and_UP (downup)) @@ -133,7 +133,7 @@ MAKE_SCHEME_CALLBACK (Slur, height, 1); SCM Slur::height (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); // FIXME uncached Stencil *m = me->get_stencil (); @@ -145,7 +145,7 @@ MAKE_SCHEME_CALLBACK (Slur, print, 1); SCM Slur::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "note-columns", encompasses); if (encompasses.empty ()) { @@ -179,7 +179,7 @@ Slur::print (SCM smob) properties = scm_cons (scm_acons (ly_symbol2scm ("font-size"), scm_from_int (-6), SCM_EOL), properties); - Stencil tm = *unsmob_stencil (Text_interface::interpret_markup + Stencil tm = *unsmob (Text_interface::interpret_markup (me->layout ()->self_scm (), properties, annotation)); a.add_at_edge (Y_AXIS, get_grob_direction (me), tm, 1.0); @@ -204,27 +204,23 @@ Slur::replace_breakable_encompass_objects (Grob *me) { Grob *g = extra_objects[i]; - if (Separation_item::has_interface (g)) + if (has_interface (g)) { extract_grob_set (g, "elements", breakables); for (vsize j = 0; j < breakables.size (); j++) /* if we encompass a separation-item that spans multiple staves, we filter out the grobs that don't belong to our staff */ if (me->common_refpoint (breakables[j], Y_AXIS) == me->get_parent (Y_AXIS) - && breakables[j]->get_property ("avoid-slur") == ly_symbol2scm ("inside")) + && scm_is_eq (breakables[j]->get_property ("avoid-slur"), + ly_symbol2scm ("inside"))) new_encompasses.push_back (breakables[j]); } else new_encompasses.push_back (g); } - SCM encompass_scm = me->get_object ("encompass-objects"); - if (Grob_array::unsmob (encompass_scm)) - { - vector &arr - = unsmob_grob_array (encompass_scm)->array_reference (); - arr = new_encompasses; - } + if (Grob_array *a = unsmob (me->get_object ("encompass-objects"))) + a->set_array (new_encompasses); } Bezier @@ -258,33 +254,34 @@ Slur::pure_outside_slur_callback (SCM grob, SCM start_scm, SCM end_scm, SCM offs { int start = robust_scm2int (start_scm, 0); int end = robust_scm2int (end_scm, 0); - Grob *script = unsmob_grob (grob); - Grob *slur = unsmob_grob (script->get_object ("slur")); + Grob *script = unsmob (grob); + Grob *slur = unsmob (script->get_object ("slur")); if (!slur) return offset_scm; SCM avoid = script->get_property ("avoid-slur"); - if (avoid != ly_symbol2scm ("outside") && avoid != ly_symbol2scm ("around")) + if (!scm_is_eq (avoid, ly_symbol2scm ("outside")) + && !scm_is_eq (avoid, ly_symbol2scm ("around"))) return offset_scm; Real offset = robust_scm2double (offset_scm, 0.0); Direction dir = get_grob_direction (script); - return scm_from_double (offset + dir * slur->pure_height (slur, start, end).length () / 4); + return scm_from_double (offset + dir * slur->pure_y_extent (slur, start, end).length () / 4); } MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Slur, outside_slur_callback, 2, 1, ""); SCM Slur::outside_slur_callback (SCM grob, SCM offset_scm) { - Grob *script = unsmob_grob (grob); - Grob *slur = unsmob_grob (script->get_object ("slur")); + Grob *script = unsmob (grob); + Grob *slur = unsmob (script->get_object ("slur")); if (!slur) return offset_scm; SCM avoid = script->get_property ("avoid-slur"); - if (avoid != ly_symbol2scm ("outside") - && avoid != ly_symbol2scm ("around")) + if (!scm_is_eq (avoid, ly_symbol2scm ("outside")) + && !scm_is_eq (avoid, ly_symbol2scm ("around"))) return offset_scm; Direction dir = get_grob_direction (script); @@ -328,7 +325,7 @@ Slur::outside_slur_callback (SCM grob, SCM offset_scm) Interval exts[] = {xext, yext}; bool do_shift = false; Real EPS = 1.0e-5; - if (avoid == ly_symbol2scm ("outside")) + if (scm_is_eq (avoid, ly_symbol2scm ("outside"))) { for (LEFT_and_RIGHT (d)) { @@ -369,7 +366,7 @@ MAKE_SCHEME_CALLBACK (Slur, vertical_skylines, 1); SCM Slur::vertical_skylines (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); vector boxes; if (!me) @@ -407,8 +404,8 @@ Slur::auxiliary_acknowledge_extra_object (Grob_info const &info, else slur = slurs[0]; - if (Tie::has_interface (e) - || avoid == ly_symbol2scm ("inside")) + if (has_interface (e) + || scm_is_eq (avoid, ly_symbol2scm ("inside"))) { for (vsize i = slurs.size (); i--;) add_extra_encompass (slurs[i], e); @@ -417,20 +414,20 @@ Slur::auxiliary_acknowledge_extra_object (Grob_info const &info, if (slur) e->set_object ("slur", slur->self_scm ()); } - else if (avoid == ly_symbol2scm ("outside") - || avoid == ly_symbol2scm ("around")) + else if (scm_is_eq (avoid, ly_symbol2scm ("outside")) + || scm_is_eq (avoid, ly_symbol2scm ("around"))) { if (slur) { chain_offset_callback (e, - ly_make_unpure_pure_container (outside_slur_callback_proc, - pure_outside_slur_callback_proc), + Unpure_pure_container::make_smob (outside_slur_callback_proc, + pure_outside_slur_callback_proc), Y_AXIS); chain_callback (e, outside_slur_cross_staff_proc, ly_symbol2scm ("cross-staff")); e->set_object ("slur", slur->self_scm ()); } } - else if (avoid != ly_symbol2scm ("ignore")) + else if (!scm_is_eq (avoid, ly_symbol2scm ("ignore"))) e->warning (_f ("Ignoring grob for slur: %s. avoid-slur not set?", e->name ().c_str ())); } @@ -445,11 +442,11 @@ MAKE_SCHEME_CALLBACK (Slur, outside_slur_cross_staff, 2) SCM Slur::outside_slur_cross_staff (SCM smob, SCM previous) { - if (previous == SCM_BOOL_T) + if (to_boolean (previous)) return previous; - Grob *me = unsmob_grob (smob); - Grob *slur = unsmob_grob (me->get_object ("slur")); + Grob *me = unsmob (smob); + Grob *slur = unsmob (me->get_object ("slur")); if (!slur) return SCM_BOOL_F; @@ -460,7 +457,7 @@ MAKE_SCHEME_CALLBACK (Slur, calc_cross_staff, 1) SCM Slur::calc_cross_staff (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "note-columns", cols); extract_grob_set (me, "encompass-objects", extras); @@ -476,7 +473,7 @@ Slur::calc_cross_staff (SCM smob) so we can ignore them here */ vector non_sep_extras; for (vsize i = 0; i < extras.size (); i++) - if (!Separation_item::has_interface (extras[i])) + if (!has_interface (extras[i])) non_sep_extras.push_back (extras[i]); Grob *common = common_refpoint_of_array (cols, me, Y_AXIS); @@ -542,6 +539,12 @@ ADD_INTERFACE (Slur, "@item head-slur-distance-max-ratio\n" "The maximum value for the ratio of distance between a" " note head and slur.\n" + "@item gap-to-staffline-inside\n" + "Minimum gap inside the curve of the slur" + " where the slur is parallel to a staffline.\n" + "@item gap-to-staffline-outside\n" + "Minimum gap outside the curve of the slur" + " where the slur is parallel to a staffline.\n" "@item free-slur-distance\n" "The amount of vertical free space that must exist" " between adjacent slurs. This subproperty only works" diff --git a/lily/smobs.cc b/lily/smobs.cc index 164ac21b03..c700ea0d9b 100644 --- a/lily/smobs.cc +++ b/lily/smobs.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,6 +18,13 @@ */ #include "smobs.hh" +#include "listener.hh" + +Listener +Smob_core::get_listener (SCM callback) +{ + return Listener (callback, self_scm ()); +} /* The CDR contains the actual protected list. @@ -46,7 +53,7 @@ protect_smob (SCM smob, SCM *prot_cons) { #if 0 SCM s = scm_cdr (smob_protection_list); - while (scm_is_pair (s) && scm_car (s) == SCM_BOOL_F) + while (scm_is_pair (s) && scm_is_false (scm_car (s)) { s = scm_cdr (s); } @@ -69,13 +76,13 @@ unprotect_smob (SCM smob, SCM *prot_cons) #else SCM next = scm_cdr (*prot_cons); - if (next == SCM_EOL) + if (scm_is_null (next))) scm_set_car_x (*prot_cons, SCM_BOOL_F); else { scm_set_car_x (*prot_cons, SCM_BOOL_F); while (scm_is_pair (next) - && scm_car (next) == SCM_BOOL_F) + && scm_is_false (scm_car (next))) next = scm_cdr (next); @@ -85,3 +92,13 @@ unprotect_smob (SCM smob, SCM *prot_cons) *prot_cons = SCM_EOL; #endif } + + +Scm_init const *Scm_init::list_ = 0; + +void +Scm_init::init () +{ + for (Scm_init const *p = list_; p; p = p->next_) + p->fun_ (); +} diff --git a/lily/source-file.cc b/lily/source-file.cc index 788c78a69e..14fdf2beb3 100644 --- a/lily/source-file.cc +++ b/lily/source-file.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -102,7 +102,6 @@ Source_file::init () istream_ = 0; line_offset_ = 0; str_port_ = SCM_EOL; - self_scm_ = SCM_EOL; smobify_self (); } @@ -149,7 +148,10 @@ Source_file::Source_file (const string &filename_string) void Source_file::init_port () { - SCM str = scm_from_locale_string (c_str ()); + // This is somewhat icky: the string will in general be in utf8, but + // we do our own utf8 encoding and verification in the parser, so we + // use the no-conversion equivalent of latin1 + SCM str = scm_from_latin1_string (c_str ()); str_port_ = scm_mkstrport (SCM_INUM0, str, SCM_OPN | SCM_RDNG, __FUNCTION__); scm_set_port_filename_x (str_port_, ly_string2scm (name_)); } @@ -359,30 +361,22 @@ Source_file::get_port () const /****************************************************************/ -#include "ly-smobs.icc" -IMPLEMENT_SMOBS (Source_file); -IMPLEMENT_DEFAULT_EQUAL_P (Source_file); -IMPLEMENT_TYPE_P (Source_file, "ly:source-file?"); +const char * const Source_file::type_p_name_ = "ly:source-file?"; SCM -Source_file::mark_smob (SCM smob) +Source_file::mark_smob () const { - Source_file *sc = (Source_file *) SCM_CELL_WORD_1 (smob); - - return sc->str_port_; + return str_port_; } int -Source_file::print_smob (SCM smob, SCM port, scm_print_state *) +Source_file::print_smob (SCM port, scm_print_state *) const { - Source_file *sc = (Source_file *) SCM_CELL_WORD_1 (smob); - scm_puts ("#name_.c_str (), port); + scm_puts (name_.c_str (), port); /* Do not print properties, that is too much hassle. */ scm_puts (" >", port); return 1; } - diff --git a/lily/sources.cc b/lily/sources.cc index 2c0e665047..5d865fe706 100644 --- a/lily/sources.cc +++ b/lily/sources.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,11 +29,6 @@ Sources::Sources () path_ = 0; } -Sources::Sources (Sources const &) -{ - assert (false); -} - void Sources::set_path (File_path *f) { @@ -91,3 +86,28 @@ Sources::~Sources () } } +#include "lily-parser.hh" +#include "lily-lexer.hh" +#include "lily-imports.hh" +#include "fluid.hh" + +LY_DEFINE (ly_source_files, "ly:source-files", 0, 1, 0, + (SCM parser_smob), + "A list of LilyPond files being processed;" + "a PARSER may optionally be specified.") +{ + + if (SCM_UNBNDP (parser_smob)) + parser_smob = scm_fluid_ref (Lily::f_parser); + Lily_parser *parser = LY_ASSERT_SMOB (Lily_parser, parser_smob, 1); + Includable_lexer *lex = parser->lexer_; + + SCM lst = SCM_EOL; + for (vector::const_iterator + i = lex->file_name_strings_.begin(); + i != lex->file_name_strings_.end(); ++i) + { + lst = scm_cons (ly_string2scm (*i), lst); + } + return scm_reverse_x (lst, SCM_EOL); +} diff --git a/lily/spaceable-grob.cc b/lily/spaceable-grob.cc index daaf1c71ed..c6ed912039 100644 --- a/lily/spaceable-grob.cc +++ b/lily/spaceable-grob.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -51,7 +51,7 @@ Spaceable_grob::add_rod (Grob *me, Grob *p, Real d) for (SCM s = mins; scm_is_pair (s); s = scm_cdr (s)) { SCM dist = scm_car (s); - if (scm_car (dist) == p->self_scm ()) + if (scm_is_eq (scm_car (dist), p->self_scm ())) { scm_set_cdr_x (dist, scm_max (scm_cdr (dist), newdist)); @@ -85,9 +85,9 @@ Spaceable_grob::get_spring (Grob *this_col, Grob *next_col) s = scm_cdr (s)) { if (scm_is_pair (scm_car (s)) - && unsmob_grob (scm_cdar (s)) == next_col - && unsmob_spring (scm_caar (s))) - spring = unsmob_spring (scm_caar (s)); + && unsmob (scm_cdar (s)) == next_col + && unsmob (scm_caar (s))) + spring = unsmob (scm_caar (s)); } if (!spring) diff --git a/lily/spacing-basic.cc b/lily/spacing-basic.cc index dd40037390..ff245aa30f 100644 --- a/lily/spacing-basic.cc +++ b/lily/spacing-basic.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ Spacing_spanner::standard_breakable_column_spacing (Grob *me, Item *l, Item *r, if (Paper_column::is_breakable (l) && Paper_column::is_breakable (r)) { - Moment *dt = unsmob_moment (l->get_property ("measure-length")); + Moment *dt = unsmob (l->get_property ("measure-length")); Moment mlen (1); if (dt) mlen = *dt; @@ -91,7 +91,7 @@ get_measure_length (Grob *column) do { - if (Moment *len = unsmob_moment (cols[col_idx]->get_property ("measure-length"))) + if (Moment *len = unsmob (cols[col_idx]->get_property ("measure-length"))) { return len; } @@ -101,7 +101,8 @@ get_measure_length (Grob *column) return 0; } -Real +/* Basic spring based on duration alone */ +Spring Spacing_spanner::note_spacing (Grob * /* me */, Grob *lc, Grob *rc, @@ -110,8 +111,8 @@ Spacing_spanner::note_spacing (Grob * /* me */, Moment shortest_playing_len = 0; SCM s = lc->get_property ("shortest-playing-duration"); - if (unsmob_moment (s)) - shortest_playing_len = *unsmob_moment (s); + if (unsmob (s)) + shortest_playing_len = *unsmob (s); if (! shortest_playing_len.to_bool ()) { @@ -144,30 +145,39 @@ Spacing_spanner::note_spacing (Grob * /* me */, shortest_playing_len = min (shortest_playing_len, *measure_len); } - Real dist = 0.0; + Spring ret; if (delta_t.main_part_ && !lwhen.grace_part_) { - dist = options->get_duration_space (shortest_playing_len.main_part_); - dist *= double (delta_t.main_part_ / shortest_playing_len.main_part_); + // A spring of length and stiffness based on the controlling duration + Real len = options->get_duration_space (shortest_playing_len.main_part_); + Real min = options->increment_; // canonical notehead width + + // The portion of that spring proportional to the time between lc and rc + Real fraction = (delta_t.main_part_ / shortest_playing_len.main_part_); + ret = Spring (fraction * len, fraction * min); + + // Stretch proportional to the space between canonical bare noteheads + ret.set_inverse_stretch_strength (fraction * max (0.1, (len - min))); } else if (delta_t.grace_part_) { - /* - Crude hack for spacing graces: we take the shortest space - available (namely the space for the global shortest note), and - multiply that by grace-space-factor - */ - dist = options->get_duration_space (options->global_shortest_) / 2.0; - Grob *grace_spacing = unsmob_grob (lc->get_object ("grace-spacing")); + Grob *grace_spacing = unsmob (lc->get_object ("grace-spacing")); if (grace_spacing) { Spacing_options grace_opts; grace_opts.init_from_grob (grace_spacing); - dist = grace_opts.get_duration_space (delta_t.grace_part_); + Real len = grace_opts.get_duration_space (delta_t.grace_part_); + Real min = grace_opts.increment_; + ret = Spring (len, min); + // Grace notes should not stretch very much + ret.set_inverse_stretch_strength (grace_opts.increment_ / 2.0); } - + else // Fallback to the old grace spacing: half that of the shortest note + ret = Spring (options-> + get_duration_space (options->global_shortest_) / 2.0, + options->increment_ / 2.0); } - return dist; + return ret; } diff --git a/lily/spacing-determine-loose-columns.cc b/lily/spacing-determine-loose-columns.cc index 2deae13b27..4be23042ad 100644 --- a/lily/spacing-determine-loose-columns.cc +++ b/lily/spacing-determine-loose-columns.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -80,8 +80,8 @@ is_loose_column (Grob *l, Grob *col, Grob *r, Spacing_options const *options) */ - Item *r_neighbor = unsmob_item (col->get_object ("right-neighbor")); - Item *l_neighbor = unsmob_item (col->get_object ("left-neighbor")); + Item *r_neighbor = unsmob (col->get_object ("right-neighbor")); + Item *l_neighbor = unsmob (col->get_object ("left-neighbor")); if (!l_neighbor || !r_neighbor) return false; @@ -108,14 +108,15 @@ is_loose_column (Grob *l, Grob *col, Grob *r, Spacing_options const *options) for (vsize i = elts.size (); i--;) { Grob *g = elts[i]; - if (g && Break_alignment_interface::has_interface (g)) + if (has_interface (g)) { extract_grob_set (g, "elements", gelts); for (vsize j = gelts.size (); j--;) { Grob *h = gelts[j]; - if (h && h->get_property ("break-align-symbol") == ly_symbol2scm ("staff-bar")) + if (h && scm_is_eq (h->get_property ("break-align-symbol"), + ly_symbol2scm ("staff-bar"))) { extract_grob_set (h, "elements", helts); for (vsize k = helts.size (); k--;) @@ -149,18 +150,18 @@ Spacing_spanner::set_distances_for_loose_col (Grob *me, Grob *c, || Spacing_interface::right_column (sp) != rc) continue; - if (Note_spacing::has_interface (sp)) + if (has_interface (sp)) { /* The note spacing should be taken from the musical columns. */ - Real base = note_spacing (me, lc, rc, options); + Spring base = note_spacing (me, lc, rc, options); Spring spring = Note_spacing::get_spacing (sp, rc, base, options->increment_); dists[d] = max (dists[d], spring.min_distance ()); } - else if (Staff_spacing::has_interface (sp)) + else if (has_interface (sp)) { Spring spring = Staff_spacing::get_spacing (sp, rc, 0.0); @@ -219,8 +220,8 @@ Spacing_spanner::prune_loose_columns (Grob *me, if (loose) { - Grob *right_neighbor = unsmob_grob (c->get_object ("right-neighbor")); - Grob *left_neighbor = unsmob_grob (c->get_object ("left-neighbor")); + Grob *right_neighbor = unsmob (c->get_object ("right-neighbor")); + Grob *left_neighbor = unsmob (c->get_object ("left-neighbor")); /* Either object can be non existent, if the score ends @@ -282,7 +283,7 @@ Spacing_spanner::set_explicit_neighbor_columns (vector const &cols) min_right_rank = right_rank; } - Grob *old_left_neighbor = unsmob_grob (right_col->get_object ("left-neighbor")); + Grob *old_left_neighbor = unsmob (right_col->get_object ("left-neighbor")); if (!old_left_neighbor || left_rank > Paper_column::get_rank (old_left_neighbor)) right_col->set_object ("left-neighbor", left_col->self_scm ()); } @@ -304,9 +305,9 @@ Spacing_spanner::set_implicit_neighbor_columns (vector const &cols) if (!Paper_column::is_breakable (it) && !Paper_column::is_musical (it)) continue; - if (i && !unsmob_grob (cols[i]->get_object ("left-neighbor"))) + if (i && !unsmob (cols[i]->get_object ("left-neighbor"))) cols[i]->set_object ("left-neighbor", cols[i - 1]->self_scm ()); - if (i + 1 < cols.size () && !unsmob_grob (cols[i]->get_object ("right-neighbor"))) + if (i + 1 < cols.size () && !unsmob (cols[i]->get_object ("right-neighbor"))) cols[i]->set_object ("right-neighbor", cols[i + 1]->self_scm ()); } } diff --git a/lily/spacing-engraver.cc b/lily/spacing-engraver.cc index fee5c34085..d77a55b757 100644 --- a/lily/spacing-engraver.cc +++ b/lily/spacing-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -76,11 +76,11 @@ class Spacing_engraver : public Engraver TRANSLATOR_DECLARATIONS (Spacing_engraver); protected: - DECLARE_ACKNOWLEDGER (staff_spacing); - DECLARE_ACKNOWLEDGER (note_spacing); - DECLARE_ACKNOWLEDGER (rhythmic_head); - DECLARE_ACKNOWLEDGER (rhythmic_grob); - DECLARE_TRANSLATOR_LISTENER (spacing_section); + void acknowledge_staff_spacing (Grob_info); + void acknowledge_note_spacing (Grob_info); + void acknowledge_rhythmic_head (Grob_info); + void acknowledge_rhythmic_grob (Grob_info); + void listen_spacing_section (Stream_event *); void start_translation_timestep (); void stop_translation_timestep (); @@ -99,7 +99,6 @@ Spacing_engraver::Spacing_engraver () start_section_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Spacing_engraver, spacing_section); void Spacing_engraver::listen_spacing_section (Stream_event *ev) { @@ -123,7 +122,7 @@ Spacing_engraver::start_spanner () spacing_ = make_spanner ("SpacingSpanner", SCM_EOL); spacing_->set_bound (LEFT, - unsmob_grob (get_property ("currentCommandColumn"))); + unsmob (get_property ("currentCommandColumn"))); } void @@ -137,7 +136,7 @@ Spacing_engraver::stop_spanner () { if (spacing_) { - Grob *p = unsmob_grob (get_property ("currentCommandColumn")); + Grob *p = unsmob (get_property ("currentCommandColumn")); spacing_->set_bound (RIGHT, p); spacing_ = 0; @@ -194,17 +193,17 @@ void Spacing_engraver::stop_translation_timestep () { Paper_column *musical_column - = dynamic_cast (unsmob_grob (get_property ("currentMusicalColumn"))); + = unsmob (get_property ("currentMusicalColumn")); if (!spacing_) start_spanner (); musical_column->set_object ("spacing", spacing_->self_scm ()); - unsmob_grob (get_property ("currentCommandColumn")) + unsmob (get_property ("currentCommandColumn")) ->set_object ("spacing", spacing_->self_scm ()); SCM proportional = get_property ("proportionalNotationDuration"); - if (unsmob_moment (proportional)) + if (unsmob (proportional)) { musical_column->set_property ("shortest-playing-duration", proportional); musical_column->set_property ("shortest-starter-duration", proportional); @@ -261,10 +260,16 @@ Spacing_engraver::start_translation_timestep () stopped_durations_.push_back (playing_durations_.get ()); } -ADD_ACKNOWLEDGER (Spacing_engraver, staff_spacing); -ADD_ACKNOWLEDGER (Spacing_engraver, note_spacing); -ADD_ACKNOWLEDGER (Spacing_engraver, rhythmic_head); -ADD_ACKNOWLEDGER (Spacing_engraver, rhythmic_grob); + +void +Spacing_engraver::boot () +{ + ADD_LISTENER (Spacing_engraver, spacing_section); + ADD_ACKNOWLEDGER (Spacing_engraver, staff_spacing); + ADD_ACKNOWLEDGER (Spacing_engraver, note_spacing); + ADD_ACKNOWLEDGER (Spacing_engraver, rhythmic_head); + ADD_ACKNOWLEDGER (Spacing_engraver, rhythmic_grob); +} ADD_TRANSLATOR (Spacing_engraver, /* doc */ diff --git a/lily/spacing-interface.cc b/lily/spacing-interface.cc index 27c99bb159..030d02e727 100644 --- a/lily/spacing-interface.cc +++ b/lily/spacing-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Joe Neeman + Copyright (C) 2007--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -64,10 +64,10 @@ Spacing_interface::skylines (Grob *me, Grob *right_col) if (Item *piece = g->find_prebroken_piece (break_dirs[d])) g = piece; - if (g && Separation_item::has_interface (g) && g->get_column () == columns[d]) + if (has_interface (g) && g->get_column () == columns[d]) { SCM sky_scm = g->get_property ("horizontal-skylines"); - Skyline_pair *sky = Skyline_pair::unsmob (sky_scm); + Skyline_pair *sky = unsmob (sky_scm); extract_grob_set (g, "elements", elts); Grob *ycommon = common_refpoint_of_array (elts, g, Y_AXIS); @@ -108,7 +108,7 @@ Spacing_interface::right_column (Grob *me) if (!me->is_live ()) return 0; - Grob_array *a = unsmob_grob_array (me->get_object ("right-items")); + Grob_array *a = unsmob (me->get_object ("right-items")); Item *mincol = 0; int min_rank = INT_MAX; for (vsize i = 0; a && i < a->size (); i++) @@ -144,9 +144,9 @@ get_note_columns (vector const &elts) for (vsize i = 0; i < elts.size (); i++) { - if (Note_column::has_interface (elts[i])) + if (has_interface (elts[i])) ret.push_back (dynamic_cast (elts[i])); - else if (Separation_item::has_interface (elts[i])) + else if (has_interface (elts[i])) { extract_grob_set (elts[i], "elements", more_elts); vector ncs = get_note_columns (more_elts); diff --git a/lily/spacing-loose-columns.cc b/lily/spacing-loose-columns.cc index bf8e13593a..15f77f34a0 100644 --- a/lily/spacing-loose-columns.cc +++ b/lily/spacing-loose-columns.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -60,8 +60,8 @@ set_loose_columns (System *which, Column_x_positions const *posns) if (!loose->get_system ()) break; - Paper_column *le = dynamic_cast (unsmob_grob (scm_car (between))); - Paper_column *re = dynamic_cast (unsmob_grob (scm_cdr (between))); + Paper_column *le = unsmob (scm_car (between)); + Paper_column *re = unsmob (scm_cdr (between)); if (! (le && re)) break; @@ -135,8 +135,8 @@ set_loose_columns (System *which, Column_x_positions const *posns) Paper_column *loose_col = dynamic_cast (clique[j]); Paper_column *next_col = dynamic_cast (clique[j + 1]); - Grob *spacing = unsmob_grob (clique_col->get_object ("spacing")); - if (Grob *grace_spacing = unsmob_grob (clique_col->get_object ("grace-spacing"))) + Grob *spacing = unsmob (clique_col->get_object ("spacing")); + if (Grob *grace_spacing = unsmob (clique_col->get_object ("grace-spacing"))) { spacing = grace_spacing; } @@ -153,19 +153,14 @@ set_loose_columns (System *which, Column_x_positions const *posns) if (Paper_column::is_musical (next_col) && Paper_column::is_musical (loose_col)) { - Real base = Spacing_spanner::note_spacing (spacing, loose_col, next_col, - &options); - if (Note_spacing::has_interface (spacing)) - { - Spring spring = Note_spacing::get_spacing (spacing, next_col, base, options.increment_);; - base_note_space = spring.distance (); - tight_note_space = spring.min_distance (); - } - else - { - base_note_space = base; - tight_note_space = base; - } + Spring spring = Spacing_spanner::note_spacing (spacing, loose_col, + next_col, &options); + if (has_interface (spacing)) + spring = Note_spacing::get_spacing (spacing, next_col, + spring, options.increment_); + + base_note_space = spring.distance (); + tight_note_space = spring.min_distance (); } else { diff --git a/lily/spacing-options.cc b/lily/spacing-options.cc index e90dcebcab..dbf0587acd 100644 --- a/lily/spacing-options.cc +++ b/lily/spacing-options.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Han-Wen Nienhuys + Copyright (C) 2006--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -66,9 +66,9 @@ Spacing_options::Spacing_options () Real Spacing_options::get_duration_space (Rational d) const { - Real k = shortest_duration_space_; + Real ratio = d / global_shortest_; - if (d < global_shortest_) + if (ratio < 1.0) { /* We don't space really short notes using the log of the @@ -86,9 +86,8 @@ Spacing_options::get_duration_space (Rational d) const */ - Rational ratio = d / global_shortest_; - return ((k - 1) + double (ratio)) * increment_; + return (shortest_duration_space_ + ratio - 1) * increment_; } else { @@ -97,10 +96,8 @@ Spacing_options::get_duration_space (Rational d) const Report OSU-CISRC-10/87-TR35, Department of Computer and Information Science, The Ohio State University, 1987. */ - Real log = log_2 (global_shortest_); - k -= log; - return (log_2 (d) + k) * increment_; + return (shortest_duration_space_ + log_2 (ratio)) * increment_; } } diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index 022c6a1219..cc353bc365 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -58,7 +58,7 @@ MAKE_SCHEME_CALLBACK (Spacing_spanner, set_springs, 1); SCM Spacing_spanner::set_springs (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); /* can't use get_system () ? --hwn. @@ -89,7 +89,7 @@ MAKE_SCHEME_CALLBACK (Spacing_spanner, calc_common_shortest_duration, 1); SCM Spacing_spanner::calc_common_shortest_duration (SCM grob) { - Spanner *me = unsmob_spanner (grob); + Spanner *me = unsmob (grob); vector cols (get_columns (me)); @@ -106,7 +106,7 @@ Spacing_spanner::calc_common_shortest_duration (SCM grob) { if (Paper_column::is_musical (cols[i])) { - Moment *when = unsmob_moment (cols[i]->get_property ("when")); + Moment *when = unsmob (cols[i]->get_property ("when")); /* ignore grace notes for shortest notes. @@ -115,7 +115,7 @@ Spacing_spanner::calc_common_shortest_duration (SCM grob) continue; SCM st = cols[i]->get_property ("shortest-starter-duration"); - Moment this_shortest = *unsmob_moment (st); + Moment this_shortest = *unsmob (st); assert (this_shortest.to_bool ()); shortest_in_measure = min (shortest_in_measure, this_shortest.main_part_); } @@ -161,7 +161,7 @@ Spacing_spanner::calc_common_shortest_duration (SCM grob) SCM bsd = me->get_property ("base-shortest-duration"); Rational d = Rational (1, 8); - if (Moment *m = unsmob_moment (bsd)) + if (Moment *m = unsmob (bsd)) d = m->main_part_; if (max_idx != VPOS) @@ -237,7 +237,7 @@ set_column_rods (vector const &cols, Real padding) if (Separation_item::is_empty (r) && (!rb || Separation_item::is_empty (rb))) continue; - Skyline_pair *skys = Skyline_pair::unsmob (r->get_property ("horizontal-skylines")); + Skyline_pair *skys = unsmob (r->get_property ("horizontal-skylines")); overhangs[i] = skys ? (*skys)[RIGHT].max_height () : 0.0; if (0 == i) continue; @@ -315,11 +315,13 @@ Spacing_spanner::musical_column_spacing (Grob *me, Item *right_col, Spacing_options const *options) { - Real base_note_space = note_spacing (me, left_col, right_col, options); - Spring spring; + Spring spring = note_spacing (me, left_col, right_col, options); if (options->stretch_uniformly_) - spring = Spring (base_note_space, 0.0); + { + spring.set_min_distance (0.0); + spring.set_default_strength (); + } else { vector springs; @@ -349,42 +351,30 @@ Spacing_spanner::musical_column_spacing (Grob *me, /* This is probably a waste of time in the case of polyphonic music. */ - if (found_matching_column && Note_spacing::has_interface (wish)) + if (found_matching_column && has_interface (wish)) { Real inc = options->increment_; - Grob *gsp = unsmob_grob (left_col->get_object ("grace-spacing")); + Grob *gsp = unsmob (left_col->get_object ("grace-spacing")); if (gsp && Paper_column::when_mom (left_col).grace_part_) { Spacing_options grace_opts; grace_opts.init_from_grob (gsp); inc = grace_opts.increment_; } - springs.push_back (Note_spacing::get_spacing (wish, right_col, base_note_space, inc)); + springs.push_back (Note_spacing::get_spacing (wish, right_col, spring, inc)); } } if (springs.empty ()) { - - if (!Paper_column::is_musical (right_col)) - { - /* - There used to be code that examined left_col->extent - (X_AXIS), but this is resulted in unexpected wide - spacing, because the width of s^"text" output is also - taken into account here. - */ - spring = Spring (max (base_note_space, options->increment_), - options->increment_); - } - else + if (Paper_column::is_musical (right_col)) { /* Min distance should be 0.0. If there are no spacing wishes, we're probably dealing with polyphonic spacing of hemiolas. */ - spring = Spring (base_note_space, 0.0); + spring.set_min_distance (0.0); } } else @@ -457,7 +447,7 @@ Spacing_spanner::fills_measure (Grob *me, Item *left, Item *col) Moment dt = Paper_column::when_mom (next) - Paper_column::when_mom (col); - Moment *len = unsmob_moment (left->get_property ("measure-length")); + Moment *len = unsmob (left->get_property ("measure-length")); if (!len) return false; @@ -499,7 +489,7 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *r, { Item *spacing_grob = dynamic_cast (wishes[i]); - if (!spacing_grob || !Staff_spacing::has_interface (spacing_grob)) + if (!spacing_grob || !has_interface (spacing_grob)) continue; /* diff --git a/lily/span-arpeggio-engraver.cc b/lily/span-arpeggio-engraver.cc index f68f904d56..9cece4a6fe 100644 --- a/lily/span-arpeggio-engraver.cc +++ b/lily/span-arpeggio-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen Han-Wen Nienhuys @@ -27,6 +27,8 @@ #include "side-position-interface.hh" #include "staff-symbol-referencer.hh" +#include "translator.icc" + /** Make arpeggios that span multiple staves. Catch arpeggios, and span a Span_arpeggio over them if we find more than two arpeggios. @@ -35,8 +37,8 @@ class Span_arpeggio_engraver : public Engraver { public: TRANSLATOR_DECLARATIONS (Span_arpeggio_engraver); - DECLARE_ACKNOWLEDGER (arpeggio); - DECLARE_ACKNOWLEDGER (note_column); + void acknowledge_arpeggio (Grob_info); + void acknowledge_note_column (Grob_info); protected: void process_acknowledged (); @@ -123,10 +125,13 @@ Span_arpeggio_engraver::stop_translation_timestep () note_columns_.clear (); } -#include "translator.icc" +void +Span_arpeggio_engraver::boot () +{ + ADD_ACKNOWLEDGER (Span_arpeggio_engraver, arpeggio); + ADD_ACKNOWLEDGER (Span_arpeggio_engraver, note_column); +} -ADD_ACKNOWLEDGER (Span_arpeggio_engraver, arpeggio); -ADD_ACKNOWLEDGER (Span_arpeggio_engraver, note_column); ADD_TRANSLATOR (Span_arpeggio_engraver, /* doc */ "Make arpeggios that span multiple staves.", diff --git a/lily/span-bar-engraver.cc b/lily/span-bar-engraver.cc index 09c846f896..e74528535b 100644 --- a/lily/span-bar-engraver.cc +++ b/lily/span-bar-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,9 @@ #include "item.hh" #include "engraver.hh" #include "pointer-group-interface.hh" +#include "lily-imports.hh" + +#include "translator.icc" /** @@ -38,7 +41,7 @@ class Span_bar_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Span_bar_engraver); protected: - DECLARE_ACKNOWLEDGER (bar_line); + void acknowledge_bar_line (Grob_info); void stop_translation_timestep (); void process_acknowledged (); }; @@ -82,19 +85,21 @@ Span_bar_engraver::stop_translation_timestep () { if (spanbar_) { - SCM vissym = ly_symbol2scm ("break-visibility"); - SCM vis = bars_[0]->internal_get_property (vissym); - if (ly_is_equal (spanbar_->internal_get_property (vissym), vis)) - spanbar_->set_property (vissym, vis); - scm_call_1 (ly_lily_module_constant ("span-bar::notify-grobs-of-my-existence"), spanbar_->self_scm ()); + SCM vis = bars_[0]->get_property ("break-visibility"); + if (ly_is_equal (spanbar_->get_property ("break-visibility"), vis)) + spanbar_->set_property ("break-visibility", vis); + Lily::span_bar_notify_grobs_of_my_existence (spanbar_->self_scm ()); spanbar_ = 0; } bars_.resize (0); } -#include "translator.icc" +void +Span_bar_engraver::boot () +{ + ADD_ACKNOWLEDGER (Span_bar_engraver, bar_line); +} -ADD_ACKNOWLEDGER (Span_bar_engraver, bar_line); ADD_TRANSLATOR (Span_bar_engraver, /* doc */ "Make cross-staff bar lines: It catches all normal bar lines" diff --git a/lily/span-bar-stub-engraver.cc b/lily/span-bar-stub-engraver.cc index b813bbb25d..a0c10f8594 100644 --- a/lily/span-bar-stub-engraver.cc +++ b/lily/span-bar-stub-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,10 +22,13 @@ #include "align-interface.hh" #include "context.hh" #include "grob.hh" +#include "grob-properties.hh" #include "item.hh" #include "pointer-group-interface.hh" #include "engraver.hh" +#include "translator.icc" + /* The Span_bar_stub_engraver creates SpanBarStub grobs in the contexts that a grouping context contains. For example, if a PianoStaff contains @@ -52,8 +55,8 @@ class Span_bar_stub_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Span_bar_stub_engraver); protected: - DECLARE_ACKNOWLEDGER (span_bar); - DECLARE_ACKNOWLEDGER (hara_kiri_group_spanner); + void acknowledge_span_bar (Grob_info); + void acknowledge_hara_kiri_group_spanner (Grob_info); void process_acknowledged (); void stop_translation_timestep (); virtual void derived_mark () const; @@ -93,7 +96,7 @@ Span_bar_stub_engraver::process_acknowledged () programming_error ("At least one vertical axis group needs to be created in the first time step."); return; } - Grob *vertical_alignment = Grob::get_root_vertical_alignment (unsmob_grob (scm_caar (axis_groups_))); + Grob *vertical_alignment = Grob::get_root_vertical_alignment (unsmob (scm_caar (axis_groups_))); if (!vertical_alignment) // we are at the beginning of a score, so no need for stubs return; @@ -112,8 +115,8 @@ Span_bar_stub_engraver::process_acknowledged () vector keep_extent; for (SCM s = axis_groups_; scm_is_pair (s); s = scm_cdr (s)) { - Context *c = unsmob_context (scm_cdar (s)); - Grob *g = unsmob_grob (scm_caar (s)); + Context *c = unsmob (scm_cdar (s)); + Grob *g = unsmob (scm_caar (s)); if (!c || !g) continue; if (c->is_removable ()) @@ -142,11 +145,10 @@ Span_bar_stub_engraver::process_acknowledged () for (vsize j = 0; j < affected_contexts.size (); j++) { - Item *it = new Item (updated_grob_properties (affected_contexts[j], ly_symbol2scm ("SpanBarStub"))); + Item *it = new Item (Grob_property_info (affected_contexts[j], ly_symbol2scm ("SpanBarStub")).updated ()); it->set_parent (spanbars_[i], X_AXIS); Grob_info gi = make_grob_info (it, spanbars_[i]->self_scm ()); - gi.rerouting_daddy_context_ = affected_contexts[j]; - announce_grob (gi); + announce_grob (gi, affected_contexts[j]); if (!keep_extent[j]) it->suicide (); } @@ -162,8 +164,8 @@ Span_bar_stub_engraver::stop_translation_timestep () SCM axis_groups = SCM_EOL; for (SCM s = axis_groups_; scm_is_pair (s); s = scm_cdr (s)) { - Context *c = unsmob_context (scm_cdar (s)); - Grob *g = unsmob_grob (scm_caar (s)); + Context *c = unsmob (scm_cdar (s)); + Grob *g = unsmob (scm_caar (s)); if (!c || !g) continue; if (c->is_removable ()) @@ -173,10 +175,13 @@ Span_bar_stub_engraver::stop_translation_timestep () axis_groups_ = axis_groups; } -#include "translator.icc" +void +Span_bar_stub_engraver::boot () +{ + ADD_ACKNOWLEDGER (Span_bar_stub_engraver, span_bar); + ADD_ACKNOWLEDGER (Span_bar_stub_engraver, hara_kiri_group_spanner); +} -ADD_ACKNOWLEDGER (Span_bar_stub_engraver, span_bar); -ADD_ACKNOWLEDGER (Span_bar_stub_engraver, hara_kiri_group_spanner); ADD_TRANSLATOR (Span_bar_stub_engraver, /* doc */ "Make stubs for span bars in all contexts that the span bars cross.", diff --git a/lily/spanner-break-forbid-engraver.cc b/lily/spanner-break-forbid-engraver.cc index 82e9622ffc..8d64b40ce8 100644 --- a/lily/spanner-break-forbid-engraver.cc +++ b/lily/spanner-break-forbid-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,8 +31,8 @@ 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 acknowledge_unbreakable_spanner (Grob_info); + void acknowledge_end_unbreakable_spanner (Grob_info); void process_music (); }; @@ -66,8 +66,13 @@ 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); +void +Spanner_break_forbid_engraver::boot () +{ + 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.", diff --git a/lily/spanner-scheme.cc b/lily/spanner-scheme.cc index f7517045b1..1d413439b4 100644 --- a/lily/spanner-scheme.cc +++ b/lily/spanner-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Han-Wen Nienhuys + Copyright (C) 2007--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -26,9 +26,9 @@ LY_DEFINE (ly_spanner_bound, "ly:spanner-bound", "Get one of the bounds of @var{spanner}. @var{dir} is @w{@code{-1}}" " for left, and @code{1} for right.") { - LY_ASSERT_TYPE (unsmob_spanner, spanner, 1); + LY_ASSERT_SMOB (Spanner, spanner, 1); LY_ASSERT_TYPE (is_direction, dir, 2); - Item *bound = unsmob_spanner (spanner)->get_bound (to_dir (dir)); + Item *bound = unsmob (spanner)->get_bound (to_dir (dir)); return bound ? bound->self_scm () : SCM_EOL; } @@ -37,11 +37,11 @@ LY_DEFINE (ly_spanner_set_bound_x, "ly:spanner-set-bound!", "Set grob @var{item} as bound in direction @var{dir} for" " @var{spanner}.") { - LY_ASSERT_TYPE (unsmob_spanner, spanner, 1); + LY_ASSERT_SMOB (Spanner, spanner, 1); LY_ASSERT_TYPE (is_direction, dir, 2); - LY_ASSERT_TYPE (unsmob_item, item, 3); + LY_ASSERT_SMOB (Item, item, 3); - unsmob_spanner (spanner)->set_bound (to_dir (dir), unsmob_item (item)); + unsmob (spanner)->set_bound (to_dir (dir), unsmob (item)); return SCM_UNSPECIFIED; } @@ -51,8 +51,8 @@ LY_DEFINE (ly_spanner_broken_into, "ly:spanner-broken-into", 1, 0, 0, (SCM spanner), "Return broken-into list for @var{spanner}.") { - LY_ASSERT_TYPE (unsmob_spanner, spanner, 1); - Spanner *me = dynamic_cast (unsmob_grob (spanner)); + LY_ASSERT_TYPE (unsmob, spanner, 1); + Spanner *me = unsmob (spanner); SCM s = SCM_EOL; for (vsize i = me->broken_intos_.size (); i--;) @@ -64,7 +64,7 @@ LY_DEFINE (ly_spanner_p, "ly:spanner?", 1, 0, 0, (SCM g), "Is @var{g} a spanner object?") { - Grob *me = unsmob_grob (g); + Grob *me = unsmob (g); bool b = dynamic_cast (me); return ly_bool2scm (b); diff --git a/lily/spanner.cc b/lily/spanner.cc index e0e1c18e1d..3f3d17fb27 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -183,6 +183,10 @@ Spanner::get_bound (Direction d) const /* Set the items that this spanner spans. If D == LEFT, we also set the X-axis parent of THIS to S. + + For example, when a slur crosses a line break, it's broken into two + pieces. The second piece shouldn't be positioned relative to the + original NoteColumn, but rather to the PaperColumn after the break. */ void Spanner::set_bound (Direction d, Grob *s) @@ -200,7 +204,14 @@ Spanner::set_bound (Direction d, Grob *s) We check for System to prevent the column -> line_of_score -> column -> line_of_score -> etc situation */ if (d == LEFT && !dynamic_cast (this)) - set_parent (i, X_AXIS); + /* + If the X-parent is a spanner, it will be split across linebreaks, too, + so we shouldn't have to overwrite it with the bound. Also, we need + original parent for alignment. + This happens e.g. for MultiMeasureRestNumbers and PercentRepeatCounters. + */ + if (!dynamic_cast (get_parent (X_AXIS))) + set_parent (i, X_AXIS); /* Signal that this column needs to be kept alive. They need to be @@ -353,11 +364,12 @@ MAKE_SCHEME_CALLBACK (Spanner, set_spacing_rods, 1); SCM Spanner::set_spacing_rods (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); SCM num_length = me->get_property ("minimum-length"); - if (scm_is_number (num_length)) + SCM broken_length = me->get_property ("minimum-length-after-break"); + if (scm_is_number (num_length) + || scm_is_number (broken_length)) { - Rod r; Spanner *sp = dynamic_cast (me); System *root = get_root_system (me); Drul_array bounds (sp->get_bound (LEFT), @@ -378,9 +390,23 @@ Spanner::set_spacing_rods (SCM smob) r.item_drul_[LEFT] = cols.back ()->find_prebroken_piece (RIGHT); r.item_drul_[RIGHT] = sp->get_bound (RIGHT); + if (scm_is_number (broken_length)) + /* + r.distance_ may have been modified by add_to_cols () + above. For treatment of minimum-distance-after-break + consistent with minimum-distance (which will use the + changed value), we cannot directly reset r.distance_ to + broken_length. + */ + r.distance_ += robust_scm2double (broken_length, 0) - + robust_scm2double (num_length, 0); r.add_to_cols (); } + Rod r; + /* + As r is a fresh rod, we can set distance_ with no complication. + */ r.distance_ = robust_scm2double (num_length, 0); r.item_drul_[LEFT] = sp->get_bound (LEFT); r.item_drul_[RIGHT] = sp->get_bound (RIGHT); @@ -411,7 +437,7 @@ MAKE_SCHEME_CALLBACK (Spanner, calc_normalized_endpoints, 1); SCM Spanner::calc_normalized_endpoints (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); SCM result = SCM_EOL; Spanner *orig = dynamic_cast (me->original ()); @@ -454,17 +480,11 @@ Spanner::calc_normalized_endpoints (SCM smob) return result; } -Spanner * -unsmob_spanner (SCM s) -{ - return dynamic_cast (unsmob_grob (s)); -} - MAKE_SCHEME_CALLBACK (Spanner, bounds_width, 1); SCM Spanner::bounds_width (SCM grob) { - Spanner *me = unsmob_spanner (grob); + Spanner *me = unsmob (grob); Grob *common = me->get_bound (LEFT)->common_refpoint (me->get_bound (RIGHT), X_AXIS); @@ -480,7 +500,7 @@ MAKE_SCHEME_CALLBACK (Spanner, kill_zero_spanned_time, 1); SCM Spanner::kill_zero_spanned_time (SCM grob) { - Spanner *me = unsmob_spanner (grob); + Spanner *me = unsmob (grob); /* Remove the line or hairpin at the start of the line. For piano voice indicators, it makes no sense to have them at @@ -513,7 +533,7 @@ Spanner::get_cached_pure_property (SCM sym, int start, int end) // The pure property cache is indexed by (name start . end), where name is // a symbol, and start and end are numbers referring to the starting and // ending column ranks of the current line. - if (scm_hash_table_p (pure_property_cache_) == SCM_BOOL_F) + if (scm_is_false (scm_hash_table_p (pure_property_cache_))) return SCM_UNDEFINED; SCM key = scm_cons (sym, scm_cons (scm_from_int (start), scm_from_int (end))); @@ -523,7 +543,7 @@ Spanner::get_cached_pure_property (SCM sym, int start, int end) void Spanner::cache_pure_property (SCM sym, int start, int end, SCM val) { - if (scm_hash_table_p (pure_property_cache_) == SCM_BOOL_F) + if (scm_is_false (scm_hash_table_p (pure_property_cache_))) pure_property_cache_ = scm_c_make_hash_table (17); SCM key = scm_cons (sym, scm_cons (scm_from_int (start), scm_from_int (end))); @@ -541,6 +561,7 @@ ADD_INTERFACE (Spanner, /* properties */ "normalized-endpoints " "minimum-length " + "minimum-length-after-break " "spanner-broken " "spanner-id " "to-barline " diff --git a/lily/spring-smob.cc b/lily/spring-smob.cc index 95d20c4333..a389df2efd 100644 --- a/lily/spring-smob.cc +++ b/lily/spring-smob.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,22 +19,9 @@ #include "spring.hh" #include "warn.hh" -#include "ly-smobs.icc" -IMPLEMENT_SIMPLE_SMOBS (Spring); -SCM -Spring::mark_smob (SCM) -{ - return SCM_UNSPECIFIED; -} -int -Spring::print_smob (SCM, SCM p, scm_print_state *) -{ - scm_puts ("#", p); - return 1; -} SCM Spring::equal_p (SCM a, SCM b) @@ -62,7 +49,7 @@ LY_DEFINE (ly_spring_set_inverse_compress_strength_x, "ly:spring-set-inverse-com LY_ASSERT_SMOB (Spring, spring, 1); LY_ASSERT_TYPE (scm_is_number, strength, 2); - Spring *s = unsmob_spring (spring); + Spring *s = unsmob (spring); s->set_inverse_compress_strength (scm_to_double (strength)); return s->smobbed_copy (); } @@ -74,9 +61,9 @@ LY_DEFINE (ly_spring_set_inverse_stretch_strength_x, "ly:spring-set-inverse-stre LY_ASSERT_SMOB (Spring, spring, 1); LY_ASSERT_TYPE (scm_is_number, strength, 2); - Spring *s = unsmob_spring (spring); + Spring *s = unsmob (spring); s->set_inverse_stretch_strength (scm_to_double (strength)); return s->smobbed_copy (); } -IMPLEMENT_TYPE_P (Spring, "ly:spring?"); +const char * const Spring::type_p_name_ = "ly:spring?"; diff --git a/lily/spring.cc b/lily/spring.cc index 312b2ed00f..d1640e72b9 100644 --- a/lily/spring.cc +++ b/lily/spring.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2007--2012 Joe Neeman + Copyright (C) 2007--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,6 +17,23 @@ along with LilyPond. If not, see . */ +/* + Springs help chains of objects, such as the notes in a line of music, + distribute themselves evenly. + Each spring decides the length from the reference point of one object + along the line to the reference point of the next, based on a force + applied to the entire chain (see Spring::length() for details): + length = distance_ + flexibility * force + + distance_ is the ideal separation between reference points + inverse_stretch_strength_ is the flexibility when the force is stretching + inverse_compress_strength_ is the flexibility when the force is compressing + min_distance_ sets a lower limit on length + + Typically, the force applied to a list of objects ranges from about + -1 to about 1, though there are no set limits. +*/ + #include "spring.hh" Spring::Spring () @@ -69,7 +86,7 @@ Spring::operator *= (Real r) { distance_ = max (min_distance_, distance_ * r); inverse_compress_strength_ = max (0.0, distance_ - min_distance_); - inverse_stretch_strength_ *= 0.8; + inverse_stretch_strength_ *= r; update_blocking_force (); } @@ -172,7 +189,6 @@ Spring::set_blocking_force (Real f) blocking_force_ = -infinity_f; min_distance_ = length (f); - distance_ = max (distance_, min_distance_); update_blocking_force (); } diff --git a/lily/staff-collecting-engraver.cc b/lily/staff-collecting-engraver.cc index 60c516c428..88680943d3 100644 --- a/lily/staff-collecting-engraver.cc +++ b/lily/staff-collecting-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,8 +26,8 @@ class Staff_collecting_engraver : public Engraver { public: TRANSLATOR_DECLARATIONS (Staff_collecting_engraver); - DECLARE_ACKNOWLEDGER (staff_symbol); - DECLARE_END_ACKNOWLEDGER (staff_symbol); + void acknowledge_staff_symbol (Grob_info); + void acknowledge_end_staff_symbol (Grob_info); }; Staff_collecting_engraver::Staff_collecting_engraver () @@ -54,8 +54,13 @@ Staff_collecting_engraver::acknowledge_end_staff_symbol (Grob_info gi) #include "translator.icc" -ADD_ACKNOWLEDGER (Staff_collecting_engraver, staff_symbol); -ADD_END_ACKNOWLEDGER (Staff_collecting_engraver, staff_symbol); + +void +Staff_collecting_engraver::boot () +{ + ADD_ACKNOWLEDGER (Staff_collecting_engraver, staff_symbol); + ADD_END_ACKNOWLEDGER (Staff_collecting_engraver, staff_symbol); +} ADD_TRANSLATOR (Staff_collecting_engraver, /* doc */ diff --git a/lily/staff-grouper-interface.cc b/lily/staff-grouper-interface.cc index 3c12882fdd..55162c2bc7 100644 --- a/lily/staff-grouper-interface.cc +++ b/lily/staff-grouper-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2009--2012 Joe Neeman + Copyright (C) 2009--2015 Joe Neeman LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ Staff_grouper_interface::maybe_pure_within_group (Grob *me, Grob *child, bool pu if (Page_layout_problem::is_spaceable (*i) && ((pure && !Hara_kiri_group_spanner::request_suicide (*i, start, end)) || (!pure && (*i)->is_live ()))) - return me == unsmob_grob ((*i)->get_object ("staff-grouper")); + return me == unsmob ((*i)->get_object ("staff-grouper")); // If there was no spaceable, living child after me, I don't // count as within the group. diff --git a/lily/staff-performer.cc b/lily/staff-performer.cc index 4daa2ca9a2..3a05cbd0e2 100644 --- a/lily/staff-performer.cc +++ b/lily/staff-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,6 +27,9 @@ #include "international.hh" #include "performer-group.hh" #include "warn.hh" +#include "lily-imports.hh" + +#include "translator.icc" /* Perform a staff. Individual notes should have their instrument (staff-wide) set, so we override play_element () @@ -76,7 +79,11 @@ map Staff_performer::static_channel_map_; int Staff_performer::channel_count_ = 0; int Staff_performer::staff_performer_count_ = 0; -#include "translator.icc" +void +Staff_performer::boot () +{ + +} ADD_TRANSLATOR (Staff_performer, /* doc */ @@ -161,7 +168,7 @@ Audio_staff * Staff_performer::get_audio_staff (const string &voice) { SCM channel_mapping = get_property ("midiChannelMapping"); - if (channel_mapping != ly_symbol2scm ("instrument") + if (!scm_is_eq (channel_mapping, ly_symbol2scm ("instrument")) && staff_map_.size ()) return staff_map_.begin ()->second; @@ -199,9 +206,8 @@ Staff_performer::set_instrument (int channel, const string &voice) announce_element (Audio_element_info (instrument_, 0)); Audio_staff *audio_staff = get_audio_staff (voice); audio_staff->add_audio_item (instrument_); - SCM proc = ly_lily_module_constant ("percussion?"); - SCM drums = scm_call_1 (proc, ly_symbol2scm (instrument_string_.c_str ())); - audio_staff->percussion_ = (drums == SCM_BOOL_T); + SCM drums = Lily::percussion_p (ly_symbol2scm (instrument_string_.c_str ())); + audio_staff->percussion_ = to_boolean (drums); } void @@ -272,11 +278,11 @@ Staff_performer::get_channel (const string &instrument) { SCM channel_mapping = get_property ("midiChannelMapping"); map &channel_map - = (channel_mapping != ly_symbol2scm ("instrument")) + = (!scm_is_eq (channel_mapping, ly_symbol2scm ("instrument"))) ? channel_map_ : static_channel_map_; - if (channel_mapping == ly_symbol2scm ("staff") + if (scm_is_eq (channel_mapping, ly_symbol2scm ("staff")) && channel_ >= 0) return channel_; @@ -284,7 +290,7 @@ Staff_performer::get_channel (const string &instrument) if (i != channel_map.end ()) return i->second; - int channel = (channel_mapping == ly_symbol2scm ("staff")) + int channel = (scm_is_eq (channel_mapping, ly_symbol2scm ("staff"))) ? channel_count_++ : channel_map.size (); @@ -319,18 +325,19 @@ Staff_performer::acknowledge_audio_element (Audio_element_info inf) voice = c->id_string (); SCM channel_mapping = get_property ("midiChannelMapping"); string str = new_instrument_string (); - if (channel_mapping != ly_symbol2scm ("instrument")) + if (!scm_is_eq (channel_mapping, ly_symbol2scm ("instrument"))) channel_ = get_channel (voice); else if (channel_ < 0 && str.empty ()) channel_ = get_channel (str); if (str.length ()) { - if (channel_mapping != ly_symbol2scm ("voice")) + if (!scm_is_eq (channel_mapping, ly_symbol2scm ("voice"))) channel_ = get_channel (str); set_instrument (channel_, voice); set_instrument_name (voice); } ai->channel_ = channel_; + Audio_staff *audio_staff = get_audio_staff (voice); bool encode_dynamics_as_velocity_ = true; if (encode_dynamics_as_velocity_) { @@ -344,11 +351,11 @@ Staff_performer::acknowledge_audio_element (Audio_element_info inf) else if (Audio_dynamic *d = dynamic_cast (inf.elem_)) { dynamic_map_[voice] = d; - // Output volume as velocity: must disable Midi_dynamic output - d->silent_ = true; + // Output volume as velocity: skip Midi_dynamic output for the + // current element. + return; } } - Audio_staff *audio_staff = get_audio_staff (voice); audio_staff->add_audio_item (ai); } } diff --git a/lily/staff-spacing.cc b/lily/staff-spacing.cc index e8bedd2e70..c8e51f56f8 100644 --- a/lily/staff-spacing.cc +++ b/lily/staff-spacing.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ using namespace std; Real Staff_spacing::optical_correction (Grob *me, Grob *g, Interval bar_height) { - if (!g || !Note_column::has_interface (g)) + if (!g || !has_interface (g)) return 0; Grob *stem = Note_column::get_stem (g); @@ -55,7 +55,7 @@ Staff_spacing::optical_correction (Grob *me, Grob *g, Interval bar_height) Direction d = get_grob_direction (stem); if (Stem::is_normal_stem (stem) && d == DOWN) { - Interval stem_posns = stem->pure_height (stem, 0, INT_MAX); + Interval stem_posns = stem->pure_y_extent (stem, 0, INT_MAX); stem_posns.intersect (bar_height); @@ -165,21 +165,21 @@ Staff_spacing::get_spacing (Grob *me, Grob *right_col, Real situational_space) Real fixed = last_ext[RIGHT]; Real ideal = fixed + 1.0; - if (type == ly_symbol2scm ("fixed-space")) + if (scm_is_eq (type, ly_symbol2scm ("fixed-space"))) { fixed += distance; ideal = fixed; } - else if (type == ly_symbol2scm ("extra-space")) + else if (scm_is_eq (type, ly_symbol2scm ("extra-space"))) ideal = fixed + distance; - else if (type == ly_symbol2scm ("semi-fixed-space")) + else if (scm_is_eq (type, ly_symbol2scm ("semi-fixed-space"))) { fixed += distance / 2; ideal = fixed + distance / 2; } - else if (type == ly_symbol2scm ("minimum-space")) + else if (scm_is_eq (type, ly_symbol2scm ("minimum-space"))) ideal = last_ext[LEFT] + max (last_ext.length (), distance); - else if (type == ly_symbol2scm ("minimum-fixed-space")) + else if (scm_is_eq (type, ly_symbol2scm ("minimum-fixed-space"))) { fixed = last_ext[LEFT] + max (last_ext.length (), distance); ideal = fixed; diff --git a/lily/staff-symbol-engraver.cc b/lily/staff-symbol-engraver.cc index 1ca6a4dce1..c8f528f0f5 100644 --- a/lily/staff-symbol-engraver.cc +++ b/lily/staff-symbol-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -42,8 +42,8 @@ protected: void stop_translation_timestep (); virtual ~Staff_symbol_engraver (); - DECLARE_ACKNOWLEDGER (grob); - DECLARE_TRANSLATOR_LISTENER (staff_span); + void acknowledge_grob (Grob_info); + void listen_staff_span (Stream_event *); virtual void finalize (); void process_music (); virtual void derived_mark () const; @@ -76,7 +76,6 @@ Staff_symbol_engraver::Staff_symbol_engraver () span_events_.set (0, 0); } -IMPLEMENT_TRANSLATOR_LISTENER (Staff_symbol_engraver, staff_span); void Staff_symbol_engraver::listen_staff_span (Stream_event *ev) { @@ -110,7 +109,7 @@ Staff_symbol_engraver::start_spanner () { span_ = make_spanner ("StaffSymbol", SCM_EOL); span_->set_bound (LEFT, - unsmob_grob (get_property ("currentCommandColumn"))); + unsmob (get_property ("currentCommandColumn"))); } } @@ -121,7 +120,7 @@ Staff_symbol_engraver::stop_spanner () return; if (!finished_span_->get_bound (RIGHT)) - finished_span_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + finished_span_->set_bound (RIGHT, unsmob (get_property ("currentCommandColumn"))); announce_end_grob (finished_span_, span_events_[STOP] @@ -163,7 +162,13 @@ Staff_symbol_engraver::acknowledge_grob (Grob_info s) } } -ADD_ACKNOWLEDGER (Staff_symbol_engraver, grob); + +void +Staff_symbol_engraver::boot () +{ + ADD_LISTENER (Staff_symbol_engraver, staff_span); + ADD_ACKNOWLEDGER (Staff_symbol_engraver, grob); +} ADD_TRANSLATOR (Staff_symbol_engraver, /* doc */ diff --git a/lily/staff-symbol-referencer-scheme.cc b/lily/staff-symbol-referencer-scheme.cc index 1fe886ec0a..5fbd8c080b 100644 --- a/lily/staff-symbol-referencer-scheme.cc +++ b/lily/staff-symbol-referencer-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ LY_DEFINE (ly_grob_staff_position, "ly:grob-staff-position", "Return the Y-position of @var{sg} relative to the staff.") { LY_ASSERT_SMOB (Grob, sg, 1); - Grob *g = unsmob_grob (sg); + Grob *g = unsmob (sg); Real pos = Staff_symbol_referencer::get_position (g); if (fabs (rint (pos) - pos) < 1e-6) // ugh. @@ -43,7 +43,7 @@ LY_DEFINE (ly_position_on_line_p, "ly:position-on-line?", { LY_ASSERT_SMOB (Grob, sg, 1); LY_ASSERT_TYPE (scm_is_number, spos, 2); - Grob *g = unsmob_grob (sg); + Grob *g = unsmob (sg); Grob *st = Staff_symbol_referencer::get_staff_symbol (g); int pos = scm_to_int (spos); bool on_line = st ? Staff_symbol::on_line (g, pos) : false; @@ -52,22 +52,25 @@ LY_DEFINE (ly_position_on_line_p, "ly:position-on-line?", LY_DEFINE (ly_staff_symbol_line_thickness, "ly:staff-symbol-line-thickness", 1, 0, 0, (SCM grob), - "Returns the @code{line-thickness} of the staff associated" - " with @var{grob}.") + "Returns the current staff-line thickness in the staff" + " associated with @var{grob}, expressed as a multiple of the" + " current staff-space height.") { LY_ASSERT_SMOB (Grob, grob, 1); - Grob *g = unsmob_grob (grob); + Grob *g = unsmob (grob); Real thickness = Staff_symbol_referencer::line_thickness (g); return scm_from_double (thickness); } LY_DEFINE (ly_staff_symbol_staff_space, "ly:staff-symbol-staff-space", 1, 0, 0, (SCM grob), - "Returns the @code{staff-space} of the staff associated" - " with @var{grob}.") + "Returns the current staff-space height in the staff" + " associated with @var{grob}, expressed as a multiple of the" + " default height of a staff-space in the traditional" + " five-line staff.") { LY_ASSERT_SMOB (Grob, grob, 1); - Grob *g = unsmob_grob (grob); + Grob *g = unsmob (grob); Real staff_space = Staff_symbol_referencer::staff_space (g); return scm_from_double (staff_space); } @@ -78,7 +81,7 @@ LY_DEFINE (ly_staff_symbol_staff_radius, "ly:staff-symbol-staff-radius", " @var{grob}.") { LY_ASSERT_SMOB (Grob, grob, 1); - Grob *g = unsmob_grob (grob); + Grob *g = unsmob (grob); Real staff_radius = Staff_symbol_referencer::staff_radius (g); return scm_from_double (staff_radius); } diff --git a/lily/staff-symbol-referencer.cc b/lily/staff-symbol-referencer.cc index 3b8aa6ba18..09b3d2856e 100644 --- a/lily/staff-symbol-referencer.cc +++ b/lily/staff-symbol-referencer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1999--2012 Han-Wen Nienhuys + Copyright (C) 1999--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,11 +48,11 @@ Staff_symbol_referencer::on_staff_line (Grob *me, int pos) Grob * Staff_symbol_referencer::get_staff_symbol (Grob *me) { - if (Staff_symbol::has_interface (me)) + if (has_interface (me)) return me; SCM st = me->get_object ("staff-symbol"); - return unsmob_grob (st); + return unsmob (st); } Real @@ -138,7 +138,7 @@ MAKE_SCHEME_CALLBACK (Staff_symbol_referencer, callback, 1); SCM Staff_symbol_referencer::callback (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); SCM pos = me->get_property ("staff-position"); Real off = 0.0; diff --git a/lily/staff-symbol.cc b/lily/staff-symbol.cc index 3b0eef00b5..0697085e11 100644 --- a/lily/staff-symbol.cc +++ b/lily/staff-symbol.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ MAKE_SCHEME_CALLBACK (Staff_symbol, print, 1); SCM Staff_symbol::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Spanner *sp = dynamic_cast (me); Grob *common = sp->get_bound (LEFT)->common_refpoint (sp->get_bound (RIGHT), X_AXIS); @@ -65,11 +65,19 @@ Staff_symbol::print (SCM smob) else { Item *x = sp->get_bound (d); - - span_points[d] = ((!x->break_status_dir () - && !x->extent (x, X_AXIS).is_empty ()) - ? Paper_column::break_align_width (x, ly_symbol2scm ("break-alignment"))[d] - : x->relative_coordinate (common, X_AXIS)); + if (x->extent (x, X_AXIS).is_empty () + || (x->break_status_dir () && sp->broken_neighbor (d))) + span_points[d] = x->relative_coordinate (common, X_AXIS); + // What the default implementation of to-barline does for + // spanners is not really in usefully recognizable shape by + // now, so we just reimplement. + else + { + SCM where = (d == RIGHT + ? me->get_property ("break-align-symbols") + : ly_symbol2scm ("break-alignment")); + span_points[d] = Paper_column::break_align_width (x, where)[d]; + } } span_points[d] -= d * t / 2; @@ -127,8 +135,27 @@ Staff_symbol::line_positions (Grob *me) } vector -Staff_symbol::ledger_positions (Grob *me, int pos) +Staff_symbol::ledger_positions (Grob *me, int pos, Item const *head) { + // allow override of ledger positions via note head grob... + if (head) + { + SCM posns = head->get_property ("ledger-positions"); + if (scm_is_pair (posns)) + return ly_scm2floatvector (posns); + } + + // ...or via custom ledger positions function + SCM lp_function = me->get_property ("ledger-positions-function"); + if (scm_is_pair (lp_function)) + { + SCM func = scm_eval (lp_function, scm_interaction_environment ()); + if (ly_is_procedure (func)) + return ly_scm2floatvector (scm_call_2 (func, + me->self_scm (), + scm_from_int (pos))); + } + SCM ledger_positions = me->get_property ("ledger-positions"); Real ledger_extra = robust_scm2double (me->get_property ("ledger-extra"), 0); vector line_positions = Staff_symbol::line_positions (me); @@ -158,7 +185,7 @@ Staff_symbol::ledger_positions (Grob *me, int pos) Direction dir = (Direction)sign (pos - nearest_line); if (scm_is_pair (ledger_positions)) - // custom ledger line positions + // custom ledger positions via StaffSymbol.ledger-positions { Real min_pos = HUGE_VAL; Real max_pos = -HUGE_VAL; @@ -239,7 +266,20 @@ Staff_symbol::ledger_positions (Grob *me, int pos) values[i] = nearest_line + dir * (ledger_count - i) * 2; } } - return values; + // remove any ledger lines that would fall on staff lines, + // which can happen when ledger-extra > 0 + vector final_values; + for (vector::const_iterator i = values.begin (), + e = values.end (); + i != e; + ++i) + { + if (find (line_positions.begin (), line_positions.end (), *i) == line_positions.end ()) + { + final_values.push_back (*i); + } + } + return final_values; } int @@ -255,7 +295,9 @@ Staff_symbol::line_count (Grob *me) Real Staff_symbol::staff_space (Grob *me) { - return robust_scm2double (me->get_property ("staff-space"), 1.0); + Real ss = me->layout ()->get_dimension (ly_symbol2scm ("staff-space")); + + return robust_scm2double (me->get_property ("staff-space"), 1.0) * ss; } Real @@ -279,7 +321,7 @@ MAKE_SCHEME_CALLBACK (Staff_symbol, height, 1); SCM Staff_symbol::height (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real t = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); t *= robust_scm2double (me->get_property ("thickness"), 1.0); @@ -306,34 +348,9 @@ Staff_symbol::height (SCM smob) bool Staff_symbol::on_line (Grob *me, int pos, bool allow_ledger) { - SCM line_positions = me->get_property ("line-positions"); - if (scm_is_pair (line_positions)) - { - Real min_line = HUGE_VAL; - Real max_line = -HUGE_VAL; - for (SCM s = line_positions; scm_is_pair (s); s = scm_cdr (s)) - { - Real current_line = scm_to_double (scm_car (s)); - if (pos == current_line) - return true; - if (current_line > max_line) - max_line = current_line; - if (current_line < min_line) - min_line = current_line; - - } - - if (allow_ledger) - { - if (pos < min_line) - return (( (int) (rint (pos - min_line)) % 2) == 0); - if (pos > max_line) - return (( (int) (rint (pos - max_line)) % 2) == 0); - } - - return false; - } - else + // standard staff lines (any line count) and standard ledger lines + if (!scm_is_pair (me->get_property ("line-positions")) + && !scm_is_pair (me->get_property ("ledger-positions"))) { int const line_cnt = line_count (me); bool result = abs (pos + line_cnt) % 2 == 1; @@ -343,6 +360,34 @@ Staff_symbol::on_line (Grob *me, int pos, bool allow_ledger) } return result; } + + // staff lines (custom or standard) + vector lines = Staff_symbol::line_positions (me); + for (vector::const_iterator i = lines.begin (), + e = lines.end (); + i != e; + ++i) + { + if (pos == *i) + return true; + } + + // ledger lines (custom or standard) + if (allow_ledger) + { + vector ledgers = Staff_symbol::ledger_positions (me, pos); + if (ledgers.empty ()) + return false; + for (vector::const_iterator i = ledgers.begin (), + e = ledgers.end (); + i != e; + ++i) + { + if (pos == *i) + return true; + } + } + return false; } Interval @@ -372,9 +417,11 @@ ADD_INTERFACE (Staff_symbol, " @code{width} property.", /* properties */ + "break-align-symbols " "ledger-extra " "ledger-line-thickness " "ledger-positions " + "ledger-positions-function " "line-count " "line-positions " "staff-space " diff --git a/lily/stanza-number-align-engraver.cc b/lily/stanza-number-align-engraver.cc index e16560d263..39eae99831 100644 --- a/lily/stanza-number-align-engraver.cc +++ b/lily/stanza-number-align-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2012 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,8 +35,8 @@ protected: vector lyrics_; vector stanza_numbers_; - DECLARE_ACKNOWLEDGER (lyric_syllable); - DECLARE_ACKNOWLEDGER (stanza_number); + void acknowledge_lyric_syllable (Grob_info); + void acknowledge_stanza_number (Grob_info); void stop_translation_timestep (); }; @@ -69,8 +69,13 @@ Stanza_number_align_engraver::stop_translation_timestep () lyrics_.clear (); } -ADD_ACKNOWLEDGER (Stanza_number_align_engraver, lyric_syllable); -ADD_ACKNOWLEDGER (Stanza_number_align_engraver, stanza_number); + +void +Stanza_number_align_engraver::boot () +{ + ADD_ACKNOWLEDGER (Stanza_number_align_engraver, lyric_syllable); + ADD_ACKNOWLEDGER (Stanza_number_align_engraver, stanza_number); +} ADD_TRANSLATOR (Stanza_number_align_engraver, /* doc */ diff --git a/lily/stanza-number-engraver.cc b/lily/stanza-number-engraver.cc index 370a4ac1ae..0a4539e8f1 100644 --- a/lily/stanza-number-engraver.cc +++ b/lily/stanza-number-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys , Glen Prideaux + Copyright (C) 2000--2015 Han-Wen Nienhuys , Glen Prideaux LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,7 +32,7 @@ public: void process_music (); virtual void derived_mark () const; void stop_translation_timestep (); - DECLARE_ACKNOWLEDGER (lyric_syllable); + void acknowledge_lyric_syllable (Grob_info); }; void @@ -83,7 +83,12 @@ Stanza_number_engraver::stop_translation_timestep () #include "translator.icc" -ADD_ACKNOWLEDGER (Stanza_number_engraver, lyric_syllable); +void +Stanza_number_engraver::boot () +{ + ADD_ACKNOWLEDGER (Stanza_number_engraver, lyric_syllable); +} + ADD_TRANSLATOR (Stanza_number_engraver, /* doc */ "Engrave stanza numbers.", diff --git a/lily/stem-engraver.cc b/lily/stem-engraver.cc index c1ab5f6f05..8907c34bc3 100644 --- a/lily/stem-engraver.cc +++ b/lily/stem-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,9 +48,9 @@ class Stem_engraver : public Engraver protected: void make_stem (Grob_info, bool); - DECLARE_TRANSLATOR_LISTENER (tremolo); - DECLARE_TRANSLATOR_LISTENER (tuplet_span); - DECLARE_ACKNOWLEDGER (rhythmic_head); + void listen_tremolo (Stream_event *); + void listen_tuplet_span (Stream_event *); + void acknowledge_rhythmic_head (Grob_info); void stop_translation_timestep (); void finalize (); void kill_unused_flags (); @@ -84,24 +84,14 @@ Stem_engraver::make_stem (Grob_info gi, bool tuplet_start) the first and last (quarter) note both get one tremolo flag. */ int requested_type - = robust_scm2int (tremolo_ev_->get_property ("tremolo-type"), 0); - SCM f = get_property ("tremoloFlags"); - if (!requested_type) - { - if (scm_is_number (f)) - requested_type = scm_to_int (f); - else - requested_type = 8; - } - else - context ()->set_property ("tremoloFlags", scm_from_int (requested_type)); + = robust_scm2int (tremolo_ev_->get_property ("tremolo-type"), 8); /* we take the duration log from the Event, since the duration-log for a note head is always <= 2. */ Stream_event *ev = gi.event_cause (); - Duration *dur = unsmob_duration (ev->get_property ("duration")); + Duration *dur = unsmob (ev->get_property ("duration")); int tremolo_flags = intlog2 (requested_type) - 2 - (dur->duration_log () > 2 ? dur->duration_log () - 2 : 0); @@ -134,7 +124,7 @@ Stem_engraver::acknowledge_rhythmic_head (Grob_info gi) Stream_event *cause = gi.event_cause (); if (!cause) return; - Duration *d = unsmob_duration (cause->get_property ("duration")); + Duration *d = unsmob (cause->get_property ("duration")); if (!d) return; @@ -168,7 +158,8 @@ Stem_engraver::acknowledge_rhythmic_head (Grob_info gi) Stem::add_head (stem_, gi.grob ()); if (Stem::is_normal_stem (stem_) - && Stem::duration_log (stem_) > 2) + && Stem::duration_log (stem_) > 2 + && !(unsmob (stem_->get_object ("flag")))) { Item *flag = make_item ("Flag", stem_->self_scm ()); flag->set_parent (stem_, X_AXIS); @@ -183,7 +174,7 @@ void Stem_engraver::kill_unused_flags () { for (vsize i = 0; i < maybe_flags_.size (); i++) - if (unsmob_grob (maybe_flags_[i]->get_parent (X_AXIS)->get_object ("beam"))) + if (unsmob (maybe_flags_[i]->get_parent (X_AXIS)->get_object ("beam"))) maybe_flags_[i]->suicide (); } @@ -221,7 +212,6 @@ Stem_engraver::stop_translation_timestep () tremolo_ev_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Stem_engraver, tuplet_span); void Stem_engraver::listen_tuplet_span (Stream_event *ev) { @@ -235,26 +225,33 @@ Stem_engraver::listen_tuplet_span (Stream_event *ev) } } -IMPLEMENT_TRANSLATOR_LISTENER (Stem_engraver, tremolo); void Stem_engraver::listen_tremolo (Stream_event *ev) { ASSIGN_EVENT_ONCE (tremolo_ev_, ev); } -ADD_ACKNOWLEDGER (Stem_engraver, rhythmic_head); + +void +Stem_engraver::boot () +{ + ADD_LISTENER (Stem_engraver, tuplet_span); + ADD_LISTENER (Stem_engraver, tremolo); + ADD_ACKNOWLEDGER (Stem_engraver, rhythmic_head); +} ADD_TRANSLATOR (Stem_engraver, /* doc */ - "Create stems and single-stem tremolos. It also works" + "Create stems, flags and single-stem tremolos. It also works" " together with the beam engraver for overriding beaming.", /* create */ + "Flag " "Stem " + "StemStub " "StemTremolo ", /* read */ - "tremoloFlags " "stemLeftBeamCount " "stemRightBeamCount " "whichBar ", diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index 1f9d2d8a7a..5f71607a37 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,11 +35,13 @@ MAKE_SCHEME_CALLBACK (Stem_tremolo, calc_slope, 1) SCM Stem_tremolo::calc_slope (SCM smob) { - Grob *me = unsmob_grob (smob); - Grob *stem = unsmob_grob (me->get_object ("stem")); + Grob *me = unsmob (smob); + Grob *stem = unsmob (me->get_object ("stem")); Spanner *beam = Stem::get_beam (stem); - if (beam) + SCM style = me->get_property ("style"); + + if (beam && !scm_is_eq (style, ly_symbol2scm ("constant"))) { Real dy = 0; SCM s = beam->get_property ("quantized-positions"); @@ -58,7 +60,8 @@ Stem_tremolo::calc_slope (SCM smob) else /* down stems with flags should have more sloped trems (helps avoid flag/stem collisions without making the stem very long) */ - return scm_from_double ((Stem::duration_log (stem) >= 3 && get_grob_direction (me) == DOWN) + return scm_from_double ((Stem::duration_log (stem) >= 3 + && get_grob_direction (me) == DOWN && !beam) ? 0.40 : 0.25); } @@ -66,8 +69,8 @@ MAKE_SCHEME_CALLBACK (Stem_tremolo, calc_width, 1) SCM Stem_tremolo::calc_width (SCM smob) { - Grob *me = unsmob_grob (smob); - Grob *stem = unsmob_grob (me->get_object ("stem")); + Grob *me = unsmob (smob); + Grob *stem = unsmob (me->get_object ("stem")); Direction dir = get_grob_direction (me); bool beam = Stem::get_beam (stem); bool flag = Stem::duration_log (stem) >= 3 && !beam; @@ -76,23 +79,26 @@ Stem_tremolo::calc_width (SCM smob) return scm_from_double (((dir == UP && flag) || beam) ? 1.0 : 1.5); } -MAKE_SCHEME_CALLBACK (Stem_tremolo, calc_style, 1) +MAKE_SCHEME_CALLBACK (Stem_tremolo, calc_shape, 1) SCM -Stem_tremolo::calc_style (SCM smob) +Stem_tremolo::calc_shape (SCM smob) { - Grob *me = unsmob_grob (smob); - Grob *stem = unsmob_grob (me->get_object ("stem")); + Grob *me = unsmob (smob); + Grob *stem = unsmob (me->get_object ("stem")); Direction dir = get_grob_direction (me); bool beam = Stem::get_beam (stem); bool flag = Stem::duration_log (stem) >= 3 && !beam; + SCM style = me->get_property ("style"); - return ly_symbol2scm (((dir == UP && flag) || beam) ? "rectangle" : "default"); + return ly_symbol2scm (!scm_is_eq (style, ly_symbol2scm ("constant")) + && ((dir == UP && flag) || beam) + ? "rectangle" : "beam-like"); } Real Stem_tremolo::get_beam_translation (Grob *me) { - Grob *stem = unsmob_grob (me->get_object ("stem")); + Grob *stem = unsmob (me->get_object ("stem")); Spanner *beam = Stem::get_beam (stem); return (beam && beam->is_live ()) @@ -108,15 +114,15 @@ Stem_tremolo::raw_stencil (Grob *me, Real slope, Direction dir) Real thick = robust_scm2double (me->get_property ("beam-thickness"), 1); Real width = robust_scm2double (me->get_property ("beam-width"), 1); Real blot = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter")); - SCM style = me->get_property ("style"); - if (!scm_is_symbol (style)) - style = ly_symbol2scm ("default"); + SCM shape = me->get_property ("shape"); + if (!scm_is_symbol (shape)) + shape = ly_symbol2scm ("beam-like"); width *= ss; thick *= ss; Stencil a; - if (style == ly_symbol2scm ("rectangle")) + if (scm_is_eq (shape, ly_symbol2scm ("rectangle"))) a = Lookup::rotated_box (slope, width, thick, blot); else a = Lookup::beam (slope, width, thick, blot); @@ -149,13 +155,13 @@ MAKE_SCHEME_CALLBACK (Stem_tremolo, pure_height, 3); SCM Stem_tremolo::pure_height (SCM smob, SCM, SCM) { - Item *me = unsmob_item (smob); + Item *me = unsmob (smob); /* Cannot use the real slope, since it looks at the Beam. */ Stencil s1 (untranslated_stencil (me, 0.35)); - Item *stem = unsmob_item (me->get_object ("stem")); + Item *stem = unsmob (me->get_object ("stem")); if (!stem) return ly_interval2scm (s1.extent (Y_AXIS)); @@ -166,7 +172,7 @@ Stem_tremolo::pure_height (SCM smob, SCM, SCM) if (!beam) return ly_interval2scm (s1.extent (Y_AXIS)); - Interval ph = stem->pure_height (stem, 0, INT_MAX); + Interval ph = stem->pure_y_extent (stem, 0, INT_MAX); Stem_info si = Stem::get_stem_info (stem); ph[-dir] = si.shortest_y_; int beam_count = Stem::beam_multiplicity (stem).length () + 1; @@ -182,7 +188,7 @@ MAKE_SCHEME_CALLBACK (Stem_tremolo, width, 1); SCM Stem_tremolo::width (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); /* Cannot use the real slope, since it looks at the Beam. @@ -201,7 +207,7 @@ Stem_tremolo::vertical_length (Grob *me) Stencil Stem_tremolo::untranslated_stencil (Grob *me, Real slope) { - Grob *stem = unsmob_grob (me->get_object ("stem")); + Grob *stem = unsmob (me->get_object ("stem")); if (!stem) { programming_error ("no stem for stem-tremolo"); @@ -222,7 +228,7 @@ MAKE_SCHEME_CALLBACK (Stem_tremolo, calc_y_offset, 1); SCM Stem_tremolo::calc_y_offset (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return scm_from_double (y_offset (me, false)); } @@ -232,7 +238,7 @@ Stem_tremolo::pure_calc_y_offset (SCM smob, SCM, /* start */ SCM /* end */) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return scm_from_double (y_offset (me, true)); } @@ -240,9 +246,9 @@ MAKE_SCHEME_CALLBACK (Stem_tremolo, calc_direction, 1); SCM Stem_tremolo::calc_direction (SCM smob) { - Item *me = unsmob_item (smob); + Item *me = unsmob (smob); - Item *stem = unsmob_item (me->get_object ("stem")); + Item *stem = unsmob (me->get_object ("stem")); if (!stem) return scm_from_int (CENTER); @@ -255,7 +261,7 @@ Stem_tremolo::calc_direction (SCM smob) */ Grob *maybe_nc = stem->get_parent (X_AXIS)->get_parent (X_AXIS); bool whole_note = Stem::duration_log (stem) <= 0; - if (whole_note && Note_collision_interface::has_interface (maybe_nc)) + if (whole_note && has_interface (maybe_nc)) { Drul_array avoid_me (false, false); vector all_nhps = Note_collision_interface::note_head_positions (maybe_nc); @@ -279,7 +285,7 @@ Stem_tremolo::calc_direction (SCM smob) Real Stem_tremolo::y_offset (Grob *me, bool pure) { - Item *stem = unsmob_item (me->get_object ("stem")); + Item *stem = unsmob (me->get_object ("stem")); if (!stem) return 0.0; @@ -292,16 +298,16 @@ Stem_tremolo::y_offset (Grob *me, bool pure) if (pure && beam) { - Interval ph = stem->pure_height (stem, 0, INT_MAX); + Interval ph = stem->pure_y_extent (stem, 0, INT_MAX); Stem_info si = Stem::get_stem_info (stem); ph[-dir] = si.shortest_y_; - return (ph - dir * max (beam_count, 1) * beam_translation)[dir] - dir * 0.5 * me->pure_height (me, 0, INT_MAX).length (); + return (ph - dir * max (beam_count, 1) * beam_translation)[dir] - dir * 0.5 * me->pure_y_extent (me, 0, INT_MAX).length (); } Real end_y = (pure - ? stem->pure_height (stem, 0, INT_MAX)[dir] + ? stem->pure_y_extent (stem, 0, INT_MAX)[dir] : stem->extent (stem, Y_AXIS)[dir]) - dir * max (beam_count, 1) * beam_translation - Stem::beam_end_corrective (stem); @@ -331,7 +337,7 @@ MAKE_SCHEME_CALLBACK (Stem_tremolo, print, 1); SCM Stem_tremolo::print (SCM grob) { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); Stencil s = untranslated_stencil (me, robust_scm2double (me->get_property ("slope"), 0.25)); return s.smobbed_copy (); @@ -339,7 +345,7 @@ Stem_tremolo::print (SCM grob) ADD_INTERFACE (Stem_tremolo, "A beam slashing a stem to indicate a tremolo. The property" - " @code{style} can be @code{default} or @code{rectangle}.", + " @code{shape} can be @code{beam-like} or @code{rectangle}.", /* properties */ "beam-thickness " @@ -348,6 +354,6 @@ ADD_INTERFACE (Stem_tremolo, "flag-count " "length-fraction " "stem " - "style " + "shape " "slope " ); diff --git a/lily/stem.cc b/lily/stem.cc index 5f072fac6a..947a429c23 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen TODO: This is way too hairy @@ -91,7 +91,7 @@ Stem::get_beaming (Grob *me, Direction d) SCM lst = index_get_cell (pair, d); - int len = scm_ilength (lst); + int len = scm_ilength (lst); // -1 for dotted lists! return max (len, 0); } @@ -110,10 +110,10 @@ Stem::head_positions (Grob *me) Real Stem::chord_start_y (Grob *me) { - Interval hp = head_positions (me); - if (!hp.is_empty ()) - return hp[get_grob_direction (me)] * Staff_symbol_referencer::staff_space (me) - * 0.5; + if (head_count (me)) + return Staff_symbol_referencer::get_position (last_head (me)) + * Staff_symbol_referencer::staff_space (me) * 0.5; + return 0; } @@ -123,7 +123,7 @@ Stem::set_stem_positions (Grob *me, Real se) // todo: margins Direction d = get_grob_direction (me); - Grob *beam = unsmob_grob (me->get_object ("beam")); + Grob *beam = unsmob (me->get_object ("beam")); if (d && d * head_positions (me)[get_grob_direction (me)] >= se * d) me->warning (_ ("weird stem size, check for narrow beams")); @@ -266,9 +266,9 @@ Stem::add_head (Grob *me, Grob *n) { n->set_object ("stem", me->self_scm ()); - if (Note_head::has_interface (n)) + if (has_interface (n)) Pointer_group_interface::add_grob (me, ly_symbol2scm ("note-heads"), n); - else if (Rest::has_interface (n)) + else if (has_interface (n)) Pointer_group_interface::add_grob (me, ly_symbol2scm ("rests"), n); } @@ -298,7 +298,7 @@ Stem::pure_height (SCM smob, SCM /* start */, SCM /* end */) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return ly_interval2scm (internal_pure_height (me, true)); } @@ -308,7 +308,7 @@ Stem::internal_pure_height (Grob *me, bool calc_beam) if (!is_normal_stem (me)) return Interval (0.0, 0.0); - Grob *beam = unsmob_grob (me->get_object ("beam")); + Grob *beam = unsmob (me->get_object ("beam")); Interval iv = internal_height (me, false); @@ -378,7 +378,7 @@ MAKE_SCHEME_CALLBACK (Stem, calc_stem_end_position, 1) SCM Stem::calc_stem_end_position (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return scm_from_double (internal_calc_stem_end_position (me, true)); } @@ -388,7 +388,7 @@ Stem::pure_calc_stem_end_position (SCM smob, SCM, /* start */ SCM /* end */) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return scm_from_double (internal_calc_stem_end_position (me, false)); } @@ -455,8 +455,8 @@ Stem::internal_calc_stem_end_position (Grob *me, bool calc_beam) length *= robust_scm2double (me->get_property ("length-fraction"), 1.0); /* Tremolo stuff. */ - Grob *t_flag = unsmob_grob (me->get_object ("tremolo-flag")); - if (t_flag && (!unsmob_grob (me->get_object ("beam")) || !calc_beam)) + Grob *t_flag = unsmob (me->get_object ("tremolo-flag")); + if (t_flag && (!unsmob (me->get_object ("beam")) || !calc_beam)) { /* Crude hack: add extra space if tremolo flag is there. @@ -506,7 +506,7 @@ MAKE_SCHEME_CALLBACK (Stem, calc_positioning_done, 1); SCM Stem::calc_positioning_done (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); if (!head_count (me)) return SCM_BOOL_T; @@ -533,7 +533,8 @@ Stem::calc_positioning_done (SCM smob) bool is_harmonic_centered = false; for (vsize i = 0; i < heads.size (); i++) is_harmonic_centered = is_harmonic_centered - || heads[i]->get_property ("style") == ly_symbol2scm ("harmonic"); + || scm_is_eq (heads[i]->get_property ("style"), + ly_symbol2scm ("harmonic")); is_harmonic_centered = is_harmonic_centered && is_invisible (me); Real w = hed->extent (hed, X_AXIS)[dir]; @@ -551,6 +552,7 @@ Stem::calc_positioning_done (SCM smob) } bool parity = true; Real lastpos = Real (Staff_symbol_referencer::get_position (heads[0])); + int threshold = robust_scm2int (me->get_property ("note-collision-threshold"), 1); for (vsize i = 1; i < heads.size (); i++) { Real p = Staff_symbol_referencer::get_position (heads[i]); @@ -560,7 +562,7 @@ Stem::calc_positioning_done (SCM smob) dy should always be 0.5, 0.0, 1.0, but provide safety margin for rounding errors. */ - if (dy < 1.1) + if (dy < 0.1 + threshold) { if (parity) { @@ -575,14 +577,32 @@ Stem::calc_positioning_done (SCM smob) stem 100% whereas reversed heads only overlaps the stem 50% */ - Real reverse_overlap = 0.5; - heads[i]->translate_axis ((ell - thick * reverse_overlap) * d, - X_AXIS); + + /* + However, the first reverse head has to be shifted even + more than the full reverse overlap if it is the same + height as the first head or there will be a gap + because of the head slant (issue 346). + */ + + if (i == 1 && dy < 0.1) + reverse_overlap = 1.1; if (is_invisible (me)) - heads[i]->translate_axis (-thick * (2 - reverse_overlap) * d, - X_AXIS); + { + // Semibreves and longer are tucked in considerably + // to be recognizable as chorded rather than + // parallel voices. During the course of issue 346 + // there was a discussion to change this for unisons + // (dy < 0.1) to reduce overlap but without reaching + // agreement and with Gould being rather on the + // overlapping front. + reverse_overlap = 2; + } + + heads[i]->translate_axis ((ell - thick * reverse_overlap) * d, + X_AXIS); /* TODO: @@ -613,9 +633,9 @@ MAKE_SCHEME_CALLBACK (Stem, calc_direction, 1); SCM Stem::calc_direction (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Direction dir = CENTER; - if (Grob *beam = unsmob_grob (me->get_object ("beam"))) + if (Grob *beam = unsmob (me->get_object ("beam"))) { SCM ignore_me = beam->get_property ("direction"); (void) ignore_me; @@ -636,13 +656,13 @@ MAKE_SCHEME_CALLBACK (Stem, calc_default_direction, 1); SCM Stem::calc_default_direction (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Direction dir = CENTER; int staff_center = 0; - Interval hp = head_positions (me); - if (!hp.is_empty ()) + if (head_count (me)) { + Interval hp = head_positions (me); int udistance = (int) (UP * hp[UP] - staff_center); int ddistance = (int) (DOWN * hp[DOWN] - staff_center); @@ -658,7 +678,7 @@ MAKE_SCHEME_CALLBACK (Stem, height, 1); SCM Stem::height (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return ly_interval2scm (internal_height (me, true)); } @@ -673,7 +693,7 @@ Stem::get_reference_head (Grob *me) Real Stem::beam_end_corrective (Grob *me) { - Grob *beam = unsmob_grob (me->get_object ("beam")); + Grob *beam = unsmob (me->get_object ("beam")); Direction dir = get_grob_direction (me); if (beam) { @@ -706,7 +726,7 @@ Stem::internal_height (Grob *me, bool calc_beam) If there is a beam but no stem, slope calculations depend on this routine to return where the stem end /would/ be. */ - if (calc_beam && !beam && !unsmob_stencil (me->get_property ("stencil"))) + if (calc_beam && !beam && !unsmob (me->get_property ("stencil"))) return Interval (); Real y1 = robust_scm2double ((calc_beam @@ -731,7 +751,7 @@ MAKE_SCHEME_CALLBACK (Stem, width, 1); SCM Stem::width (SCM e) { - Grob *me = unsmob_grob (e); + Grob *me = unsmob (e); Interval r; @@ -757,7 +777,7 @@ MAKE_SCHEME_CALLBACK (Stem, calc_stem_begin_position, 1); SCM Stem::calc_stem_begin_position (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return scm_from_double (internal_calc_stem_begin_position (me, true)); } @@ -767,7 +787,7 @@ Stem::pure_calc_stem_begin_position (SCM smob, SCM, /* start */ SCM /* end */) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return scm_from_double (internal_calc_stem_begin_position (me, false)); } @@ -808,7 +828,7 @@ MAKE_SCHEME_CALLBACK (Stem, pure_calc_length, 3); SCM Stem::pure_calc_length (SCM smob, SCM /*start*/, SCM /*end*/) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real beg = robust_scm2double (me->get_pure_property ("stem-begin-position", 0, INT_MAX), 0.0); Real res = fabs (internal_calc_stem_end_position (me, false) - beg); return scm_from_double (res); @@ -818,8 +838,8 @@ MAKE_SCHEME_CALLBACK (Stem, calc_length, 1); SCM Stem::calc_length (SCM smob) { - Grob *me = unsmob_grob (smob); - if (unsmob_grob (me->get_object ("beam"))) + Grob *me = unsmob (smob); + if (unsmob (me->get_object ("beam"))) { me->programming_error ("ly:stem::calc-length called but will not be used for beamed stem."); return scm_from_double (0.0); @@ -835,8 +855,10 @@ Stem::is_valid_stem (Grob *me) { /* TODO: make the stem start a direction ? This is required to avoid stems passing in tablature chords. */ + if (!me) + return false; Grob *lh = get_reference_head (me); - Grob *beam = unsmob_grob (me->get_object ("beam")); + Grob *beam = unsmob (me->get_object ("beam")); if (!lh && !beam) return false; @@ -851,7 +873,7 @@ MAKE_SCHEME_CALLBACK (Stem, print, 1); SCM Stem::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); if (!is_valid_stem (me)) return SCM_EOL; @@ -887,13 +909,13 @@ MAKE_SCHEME_CALLBACK (Stem, offset_callback, 1); SCM Stem::offset_callback (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "rests", rests); if (rests.size ()) { Grob *rest = rests.back (); - Real r = rest->extent (rest, X_AXIS).center (); + Real r = robust_relative_extent (rest, rest, X_AXIS).center (); return scm_from_double (r); } @@ -931,7 +953,7 @@ Spanner * Stem::get_beam (Grob *me) { SCM b = me->get_object ("beam"); - return dynamic_cast (unsmob_grob (b)); + return unsmob (b); } Stem_info @@ -950,7 +972,7 @@ MAKE_SCHEME_CALLBACK (Stem, calc_stem_info, 1); SCM Stem::calc_stem_info (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Direction my_dir = get_grob_direction (me); if (!my_dir) @@ -1000,7 +1022,7 @@ Stem::calc_stem_info (SCM smob) : 0.0); Real height_of_my_trem = 0.0; - Grob *trem = unsmob_grob (me->get_object ("tremolo-flag")); + Grob *trem = unsmob (me->get_object ("tremolo-flag")); if (trem) { height_of_my_trem @@ -1099,7 +1121,7 @@ Stem::beam_multiplicity (Grob *stem) bool Stem::is_cross_staff (Grob *stem) { - Grob *beam = unsmob_grob (stem->get_object ("beam")); + Grob *beam = unsmob (stem->get_object ("beam")); return beam && Beam::is_cross_staff (beam); } @@ -1107,13 +1129,13 @@ MAKE_SCHEME_CALLBACK (Stem, calc_cross_staff, 1) SCM Stem::calc_cross_staff (SCM smob) { - return scm_from_bool (is_cross_staff (unsmob_grob (smob))); + return scm_from_bool (is_cross_staff (unsmob (smob))); } Grob * Stem::flag (Grob *me) { - return unsmob_grob (me->get_object ("flag")); + return unsmob (me->get_object ("flag")); } /* FIXME: Too many properties */ @@ -1152,6 +1174,7 @@ ADD_INTERFACE (Stem, "default-direction " "details " "direction " + "double-stem-separation " "duration-log " "flag " "french-beaming " @@ -1162,6 +1185,7 @@ ADD_INTERFACE (Stem, "neutral-direction " "no-stem-extend " "note-heads " + "note-collision-threshold " "positioning-done " "rests " "stem-begin-position " diff --git a/lily/stencil-expression.cc b/lily/stencil-expression.cc index 750d088e16..06aabb992f 100644 --- a/lily/stencil-expression.cc +++ b/lily/stencil-expression.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,8 +33,7 @@ void register_stencil_head (SCM symbol) bool is_stencil_head (SCM symbol) { - return scm_object_property (symbol, ly_symbol2scm ("stencil-head?")) - == SCM_BOOL_T; + return to_boolean (scm_object_property (symbol, ly_symbol2scm ("stencil-head?"))); } SCM diff --git a/lily/stencil-integral.cc b/lily/stencil-integral.cc index 4ae14e4609..747217c847 100644 --- a/lily/stencil-integral.cc +++ b/lily/stencil-integral.cc @@ -34,7 +34,6 @@ when this transforms a point (x,y), the point is written as matrix: */ #include -#include #include "box.hh" #include "bezier.hh" #include "dimensions.hh" @@ -60,7 +59,9 @@ using namespace std; Real QUANTIZATION_UNIT = 0.2; -void create_path_cap (vector &boxes, vector > &buildings, PangoMatrix trans, Offset pt, Real rad, Real slope, Direction d); +void create_path_cap (vector &boxes, + vector > &buildings, + PangoMatrix trans, Offset pt, Real rad, Offset dir); struct Transform_matrix_and_expression { @@ -113,7 +114,7 @@ get_number_list (SCM l) if (scm_is_number (scm_car (l))) return l; SCM res = get_number_list (scm_car (l)); - if (res == SCM_BOOL_F) + if (scm_is_false (res)) return get_number_list (scm_cdr (l)); return res; } @@ -129,33 +130,31 @@ get_path_list (SCM l) { if (scm_is_pair (l)) { - if (scm_memv (scm_car (l), - scm_list_n (ly_symbol2scm ("moveto"), - ly_symbol2scm ("rmoveto"), - ly_symbol2scm ("lineto"), - ly_symbol2scm ("rlineto"), - ly_symbol2scm ("curveto"), - ly_symbol2scm ("rcurveto"), - ly_symbol2scm ("closepath"), - SCM_UNDEFINED)) - != SCM_BOOL_F) + if (scm_is_true (scm_memv (scm_car (l), + scm_list_n (ly_symbol2scm ("moveto"), + ly_symbol2scm ("rmoveto"), + ly_symbol2scm ("lineto"), + ly_symbol2scm ("rlineto"), + ly_symbol2scm ("curveto"), + ly_symbol2scm ("rcurveto"), + ly_symbol2scm ("closepath"), + SCM_UNDEFINED)))) return l; SCM res = get_path_list (scm_car (l)); - if (res == SCM_BOOL_F) + if (scm_is_false (res)) return get_path_list (scm_cdr (l)); return res; } return SCM_BOOL_F; } -Real -perpendicular_slope (Real s) +// Gets an orthogonal vector with same size to orig, pointing left +// (in the complex domain, a multiplication by i) + +Offset +get_normal (Offset orig) { - if (s == 0.0) - return infinity_f; - if (s == infinity_f) - return 0.0; - return -1.0 / s; + return Offset (-orig[Y_AXIS], orig[X_AXIS]); } //// END UTILITY FUNCTIONS @@ -181,7 +180,7 @@ make_draw_line_boxes (vector &boxes, vector > &buildings Real x1 = robust_scm2double (scm_car (expr), 0.0); expr = scm_cdr (expr); Real y1 = robust_scm2double (scm_car (expr), 0.0); - Real slope = x1 == x0 ? infinity_f : (y1 - y0) / (x1 - x0); + ////////////////////// if (x1 < x0) { @@ -190,11 +189,12 @@ make_draw_line_boxes (vector &boxes, vector > &buildings } Offset left (x0, y0); Offset right (x1, y1); - Direction d = DOWN; - do + Offset dir = (right - left).direction (); + for (DOWN_and_UP (d)) { - Offset inter_l = get_point_in_y_direction (left, perpendicular_slope (slope), thick / 2, d); - Offset inter_r = get_point_in_y_direction (right, perpendicular_slope (slope), thick / 2, d); + Offset outward = d * get_normal ((thick / 2) * dir); + Offset inter_l = left + outward; + Offset inter_r = right + outward; pango_matrix_transform_point (&trans, &inter_l[X_AXIS], &inter_l[Y_AXIS]); pango_matrix_transform_point (&trans, &inter_r[X_AXIS], &inter_r[Y_AXIS]); if ((inter_l[X_AXIS] == inter_r[X_AXIS]) || (inter_l[Y_AXIS] == inter_r[Y_AXIS])) @@ -208,11 +208,7 @@ make_draw_line_boxes (vector &boxes, vector > &buildings buildings.push_back (Drul_array (inter_l, inter_r)); else { - Offset inter_l = get_point_in_y_direction (left, perpendicular_slope (slope), thick / 2, d); - Offset inter_r = get_point_in_y_direction (right, perpendicular_slope (slope), thick / 2, d); - pango_matrix_transform_point (&trans, &inter_l[X_AXIS], &inter_l[Y_AXIS]); - pango_matrix_transform_point (&trans, &inter_r[X_AXIS], &inter_r[Y_AXIS]); - Real length = sqrt (((inter_l[X_AXIS] - inter_r[X_AXIS]) * (inter_l[X_AXIS] - inter_r[X_AXIS])) + ((inter_l[Y_AXIS] - inter_r[Y_AXIS]) * (inter_l[Y_AXIS] - inter_r[Y_AXIS]))); + Real length = (inter_l - inter_r).length (); vsize passes = (vsize) ((length * 2) + 1); vector points; @@ -221,7 +217,7 @@ make_draw_line_boxes (vector &boxes, vector > &buildings { Offset pt (linear_map (x0, x1, 0, passes, i), linear_map (y0, y1, 0, passes, i)); - Offset inter = get_point_in_y_direction (pt, perpendicular_slope (slope), thick / 2, d); + Offset inter = pt + outward; pango_matrix_transform_point (&trans, &inter[X_AXIS], &inter[Y_AXIS]); points.push_back (inter); } @@ -234,7 +230,6 @@ make_draw_line_boxes (vector &boxes, vector > &buildings } } } - while (flip (&d) != DOWN); if (thick > 0.0) { @@ -242,24 +237,24 @@ make_draw_line_boxes (vector &boxes, vector > &buildings create_path_cap (boxes, buildings, trans, - Offset (x0, y0), + left, thick / 2, - perpendicular_slope (slope), - Direction (sign (slope))); + -dir); // end line cap create_path_cap (boxes, buildings, trans, - Offset (x1, y1), + right, thick / 2, - perpendicular_slope (slope), - Direction (sign (-slope))); + dir); } } void -make_partial_ellipse_boxes (vector &boxes, vector > &buildings, PangoMatrix trans, SCM expr) +make_partial_ellipse_boxes (vector &boxes, + vector > &buildings, + PangoMatrix trans, SCM expr) { Real x_rad = robust_scm2double (scm_car (expr), 0.0); expr = scm_cdr (expr); @@ -279,79 +274,64 @@ make_partial_ellipse_boxes (vector &boxes, vector > &bui end = M_PI * end / 180; if (end == start) end += (2 * M_PI); - complex sunit = polar (1.0, start); - complex eunit = polar (1.0, end); - Offset sp (real (sunit) * x_rad, imag (sunit) * y_rad); - Offset ep (real (eunit) * x_rad, imag (eunit) * y_rad); + Offset sp (cos (start) * x_rad, sin (start) * y_rad); + Offset ep (cos (end) * x_rad, sin (end) * y_rad); ////////////////////// Drul_array > points; - Direction d = DOWN; int quantization = max (1, (int) (((x_rad * trans.xx) + (y_rad * trans.yy)) * M_PI / QUANTIZATION_UNIT)); - do + for (DOWN_and_UP (d)) { for (vsize i = 0; i < 1 + (vsize) quantization; i++) { Real ang = linear_map (start, end, 0, quantization, i); - complex coord = polar (1.0, ang); - Offset pt (real (coord) * x_rad, - imag (coord) * y_rad); - Real slope = pt[Y_AXIS] / pt[X_AXIS]; - Offset inter = get_point_in_y_direction (pt, perpendicular_slope (slope), th / 2, d); + Offset pt (cos (ang) * x_rad, sin (ang) * y_rad); + Offset inter = pt + d * get_normal ((th/2) * pt.direction ()); pango_matrix_transform_point (&trans, &inter[X_AXIS], &inter[Y_AXIS]); points[d].push_back (inter); } } - while (flip (&d) != DOWN); for (vsize i = 0; i < points[DOWN].size () - 1; i++) { Box b; - do + for (DOWN_and_UP (d)) { b.add_point (points[d][i]); b.add_point (points[d][i + 1]); } - while (flip (&d) != DOWN); boxes.push_back (b); } if (connect || fill) { - make_draw_line_boxes (boxes, buildings, trans, scm_list_5 (scm_from_double (th), - scm_from_double (sp[X_AXIS]), - scm_from_double (sp[Y_AXIS]), - scm_from_double (ep[X_AXIS]), - scm_from_double (ep[Y_AXIS])), + make_draw_line_boxes (boxes, buildings, trans, + scm_list_5 (scm_from_double (th), + scm_from_double (sp[X_AXIS]), + scm_from_double (sp[Y_AXIS]), + scm_from_double (ep[X_AXIS]), + scm_from_double (ep[Y_AXIS])), false); } if (th > 0.0) { // beg line cap - complex coord = polar (1.0, start); - Offset pt (real (coord) * x_rad, - imag (coord) * y_rad); - Real slope = pt[Y_AXIS] / pt[X_AXIS]; + Offset pt (cos (start) * x_rad, sin (start) * y_rad); create_path_cap (boxes, buildings, trans, pt, th / 2, - perpendicular_slope (slope), - Direction (sign (slope))); + -get_normal (pt)); // end line cap - coord = polar (1.0, start); - pt = Offset (real (coord) * x_rad, - imag (coord) * y_rad); - slope = pt[Y_AXIS] / pt[X_AXIS]; + pt = Offset (cos (end) * x_rad, sin (end) * y_rad); create_path_cap (boxes, buildings, trans, pt, th / 2, - perpendicular_slope (slope), - Direction (sign (-slope))); + get_normal (pt)); } } @@ -380,26 +360,18 @@ make_round_filled_box_boxes (vector &boxes, PangoMatrix trans, SCM expr) } void -create_path_cap (vector &boxes, vector > &buildings, PangoMatrix trans, Offset pt, Real rad, Real slope, Direction d) +create_path_cap (vector &boxes, + vector > &buildings, + PangoMatrix trans, Offset pt, Real rad, Offset dir) { - Real angle = atan (slope) * 180 / M_PI; - Real other = angle > 180 ? angle - 180 : angle + 180; - if (angle < other) - { - Real holder = other; - other = angle; - angle = holder; - } - other = (slope >= 0 && d == DOWN) || (slope < 0 && d == UP) - ? other + 360.0 - : other; + Real angle = dir.angle_degrees (); PangoMatrix new_trans (trans); pango_matrix_translate (&new_trans, pt[X_AXIS], pt[Y_AXIS]); make_partial_ellipse_boxes (boxes, buildings, new_trans, scm_list_n (scm_from_double (rad), scm_from_double (rad), - scm_from_double (angle), - scm_from_double (other), + scm_from_double (angle-90.01), + scm_from_double (angle+90.01), scm_from_double (0.0), SCM_BOOL_F, SCM_BOOL_F, @@ -407,7 +379,9 @@ create_path_cap (vector &boxes, vector > &buildings, Pan } void -make_draw_bezier_boxes (vector &boxes, vector > &buildings, PangoMatrix trans, SCM expr) +make_draw_bezier_boxes (vector &boxes, + vector > &buildings, + PangoMatrix trans, SCM expr) { Real th = robust_scm2double (scm_car (expr), 0.0); expr = scm_cdr (expr); @@ -442,77 +416,66 @@ make_draw_bezier_boxes (vector &boxes, vector > &buildin pango_matrix_transform_point (&trans, &temp3[X_AXIS], &temp3[Y_AXIS]); ////////////////////// Drul_array > points; - Direction d = DOWN; int quantization = int (((temp1 - temp0).length () + (temp2 - temp1).length () + (temp3 - temp2).length ()) / QUANTIZATION_UNIT); - do + for (DOWN_and_UP (d)) { - Offset first = get_point_in_y_direction (curve.control_[0], perpendicular_slope (curve.slope_at_point (0.0)), th / 2, d); + Offset first = curve.control_[0] + + d * get_normal ((th / 2) * curve.dir_at_point (0.0)); pango_matrix_transform_point (&trans, &first[X_AXIS], &first[Y_AXIS]); points[d].push_back (first); for (vsize i = 1; i < (vsize) quantization; i++) { Real pt = (i * 1.0) / quantization; - Offset inter = get_point_in_y_direction (curve.curve_point (pt), perpendicular_slope (curve.slope_at_point (pt)), th / 2, d); + Offset inter = curve.curve_point (pt) + + d * get_normal ((th / 2) *curve.dir_at_point (pt)); pango_matrix_transform_point (&trans, &inter[X_AXIS], &inter[Y_AXIS]); points[d].push_back (inter); } - Offset last = get_point_in_y_direction (curve.control_[3], curve.slope_at_point (1.0), th / 2, d); + Offset last = curve.control_[3] + + d * get_normal ((th / 2) * curve.dir_at_point (1.0)); pango_matrix_transform_point (&trans, &last[X_AXIS], &last[Y_AXIS]); points[d].push_back (last); } - while (flip (&d) != DOWN); for (vsize i = 0; i < points[DOWN].size () - 1; i++) { Box b; - do + for (DOWN_and_UP (d)) { b.add_point (points[d][i]); b.add_point (points[d][i + 1]); } - while (flip (&d) != DOWN); boxes.push_back (b); } - // beg line cap if (th >= 0) { - Real slope = curve.slope_at_point (0.0); - d = Direction (sign (slope == 0.0 || abs (slope) == infinity_f - ? curve.slope_at_point (0.0001) - : slope)); - + // beg line cap create_path_cap (boxes, buildings, trans, curve.control_[0], th / 2, - perpendicular_slope (curve.slope_at_point (0.0)), - d); + -curve.dir_at_point (0.0)); // end line cap - slope = curve.slope_at_point (1.0); - d = Direction (sign (slope == 0.0 || abs (slope) == infinity_f - ? curve.slope_at_point (0.9999) - : slope)); - create_path_cap (boxes, buildings, trans, curve.control_[3], th / 2, - perpendicular_slope (curve.slope_at_point (1.0)), - d); + curve.dir_at_point (1.0)); } } /* converts a path into lists of 4 (line) or 8 (curve) absolute coordinates for example: - '(moveto 1 2 lineto 3 4 rlineto -1 -1 curveto 3 3 5 5 6 6 rcurveto -1 -1 -1 -1 -1 -1 closepath) + '(moveto 1 2 lineto 3 4 rlineto -1 -1 curveto + 3 3 5 5 6 6 rcurveto -1 -1 -1 -1 -1 -1 closepath) becomes '((1 2 3 4) (3 4 2 3) @@ -530,8 +493,8 @@ all_commands_to_absolute_and_group (SCM expr) bool first = true; while (scm_is_pair (expr)) { - if (scm_car (expr) == ly_symbol2scm ("moveto") - || (scm_car (expr) == ly_symbol2scm ("rmoveto") && first)) + if (scm_is_eq (scm_car (expr), ly_symbol2scm ("moveto")) + || (scm_is_eq (scm_car (expr), ly_symbol2scm ("rmoveto")) && first)) { Real x = robust_scm2double (scm_cadr (expr), 0.0); Real y = robust_scm2double (scm_caddr (expr), 0.0); @@ -539,7 +502,7 @@ all_commands_to_absolute_and_group (SCM expr) current = start; expr = scm_cdddr (expr); } - if (scm_car (expr) == ly_symbol2scm ("rmoveto")) + if (scm_is_eq (scm_car (expr), ly_symbol2scm ("rmoveto"))) { Real x = robust_scm2double (scm_cadr (expr), 0.0); Real y = robust_scm2double (scm_caddr (expr), 0.0); @@ -547,7 +510,7 @@ all_commands_to_absolute_and_group (SCM expr) current = start; expr = scm_cdddr (expr); } - else if (scm_car (expr) == ly_symbol2scm ("lineto")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("lineto"))) { Real x = robust_scm2double (scm_cadr (expr), 0.0); Real y = robust_scm2double (scm_caddr (expr), 0.0); @@ -559,7 +522,7 @@ all_commands_to_absolute_and_group (SCM expr) current = Offset (x, y); expr = scm_cdddr (expr); } - else if (scm_car (expr) == ly_symbol2scm ("rlineto")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("rlineto"))) { Real x = robust_scm2double (scm_cadr (expr), 0.0); Real y = robust_scm2double (scm_caddr (expr), 0.0); @@ -571,7 +534,7 @@ all_commands_to_absolute_and_group (SCM expr) current = (Offset (x, y) + current); expr = scm_cdddr (expr); } - else if (scm_car (expr) == ly_symbol2scm ("curveto")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("curveto"))) { Real x1 = robust_scm2double (scm_cadr (expr), 0.0); expr = scm_cddr (expr); @@ -597,7 +560,7 @@ all_commands_to_absolute_and_group (SCM expr) out); current = Offset (x3, y3); } - else if (scm_car (expr) == ly_symbol2scm ("rcurveto")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("rcurveto"))) { Real x1 = robust_scm2double (scm_cadr (expr), 0.0); expr = scm_cddr (expr); @@ -623,9 +586,10 @@ all_commands_to_absolute_and_group (SCM expr) out); current = (Offset (x3, y3) + current); } - else if (scm_car (expr) == ly_symbol2scm ("closepath")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("closepath"))) { - if ((current[X_AXIS] != start[X_AXIS]) || (current[Y_AXIS] != start[Y_AXIS])) + if ((current[X_AXIS] != start[X_AXIS]) + || (current[Y_AXIS] != start[Y_AXIS])) { out = scm_cons (scm_list_4 (scm_from_double (current[X_AXIS]), scm_from_double (current[Y_AXIS]), @@ -647,7 +611,9 @@ all_commands_to_absolute_and_group (SCM expr) } void -internal_make_path_boxes (vector &boxes, vector > &buildings, PangoMatrix trans, SCM expr, bool use_building) +internal_make_path_boxes (vector &boxes, + vector > &buildings, + PangoMatrix trans, SCM expr, bool use_building) { SCM blot = scm_car (expr); expr = scm_cdr (expr); @@ -663,13 +629,17 @@ internal_make_path_boxes (vector &boxes, vector > &build } void -make_path_boxes (vector &boxes, vector > &buildings, PangoMatrix trans, SCM expr) +make_path_boxes (vector &boxes, + vector > &buildings, + PangoMatrix trans, SCM expr) { return internal_make_path_boxes (boxes, buildings, trans, scm_cons (scm_car (expr), get_path_list (scm_cdr (expr))), false); } void -make_polygon_boxes (vector &boxes, vector > &buildings, PangoMatrix trans, SCM expr) +make_polygon_boxes (vector &boxes, + vector > &buildings, + PangoMatrix trans, SCM expr) { SCM coords = get_number_list (scm_car (expr)); expr = scm_cdr (expr); @@ -685,14 +655,17 @@ make_polygon_boxes (vector &boxes, vector > &buildings, first = false; } l = scm_cons (ly_symbol2scm ("closepath"), l); - internal_make_path_boxes (boxes, buildings, trans, scm_cons (blot_diameter, scm_reverse_x (l, SCM_EOL)), true); + internal_make_path_boxes (boxes, buildings, trans, + scm_cons (blot_diameter, scm_reverse_x (l, SCM_EOL)), true); } void -make_named_glyph_boxes (vector &boxes, vector > &buildings, PangoMatrix trans, SCM expr) +make_named_glyph_boxes (vector &boxes, + vector > &buildings, + PangoMatrix trans, SCM expr) { SCM fm_scm = scm_car (expr); - Font_metric *fm = unsmob_metrics (fm_scm); + Font_metric *fm = unsmob (fm_scm); expr = scm_cdr (expr); SCM glyph = scm_car (expr); string glyph_s = ly_scm2string (glyph); @@ -707,7 +680,8 @@ make_named_glyph_boxes (vector &boxes, vector > &buildin // Bbox is the best approximation of the width based on how it would be // calculated in open-type-font.cc if it were based on real extents Box bbox = open_fm->get_unscaled_indexed_char_dimensions (gidx); - bbox.scale (dynamic_cast(fm)->get_magnification () * open_fm->design_size () / open_fm->get_units_per_EM ()); + bbox.scale (dynamic_cast (fm)->get_magnification () + * open_fm->design_size () / open_fm->get_units_per_EM ()); // Real bbox is the real bbox of the object Box real_bbox = open_fm->get_glyph_outline_bbox (gidx); @@ -722,16 +696,21 @@ make_named_glyph_boxes (vector &boxes, vector > &buildin s = scm_cdr (s)) { scm_to_int (scm_length (scm_car (s))) == 4 - ? make_draw_line_boxes (boxes, buildings, trans, scm_cons (scm_from_double (0), scm_car (s)), false) - : make_draw_bezier_boxes (boxes, buildings, trans, scm_cons (scm_from_double (0), scm_car (s))); + ? make_draw_line_boxes (boxes, buildings, trans, + scm_cons (scm_from_double (0), scm_car (s)), + false) + : make_draw_bezier_boxes (boxes, buildings, trans, + scm_cons (scm_from_double (0), scm_car (s))); } } void -make_glyph_string_boxes (vector &boxes, vector > &buildings, PangoMatrix trans, SCM expr) +make_glyph_string_boxes (vector &boxes, + vector > &buildings, + PangoMatrix trans, SCM expr) { SCM fm_scm = scm_car (expr); - Font_metric *fm = unsmob_metrics (fm_scm); + Font_metric *fm = unsmob (fm_scm); expr = scm_cdr (expr); expr = scm_cdr (expr); // font-name expr = scm_cdr (expr); // size @@ -798,10 +777,13 @@ make_glyph_string_boxes (vector &boxes, vector > &buildi Real scale_factor = max (xlen, ylen); // the three operations below move the stencil from its original coordinates to current coordinates - pango_matrix_translate (&transcopy, kerned_bbox[X_AXIS][LEFT], kerned_bbox[Y_AXIS][DOWN] - real_bbox[Y_AXIS][DOWN]); - pango_matrix_translate (&transcopy, real_bbox[X_AXIS][LEFT], real_bbox[Y_AXIS][DOWN]); + pango_matrix_translate (&transcopy, kerned_bbox[X_AXIS][LEFT], + kerned_bbox[Y_AXIS][DOWN] - real_bbox[Y_AXIS][DOWN]); + pango_matrix_translate (&transcopy, real_bbox[X_AXIS][LEFT], + real_bbox[Y_AXIS][DOWN]); pango_matrix_scale (&transcopy, scale_factor, scale_factor); - pango_matrix_translate (&transcopy, -bbox[X_AXIS][LEFT], -bbox[Y_AXIS][DOWN]); + pango_matrix_translate (&transcopy, -bbox[X_AXIS][LEFT], + -bbox[Y_AXIS][DOWN]); } ////////////////////// for (SCM s = outline; @@ -809,8 +791,11 @@ make_glyph_string_boxes (vector &boxes, vector > &buildi s = scm_cdr (s)) { scm_to_int (scm_length (scm_car (s))) == 4 - ? make_draw_line_boxes (boxes, buildings, transcopy, scm_cons (scm_from_double (0), scm_car (s)), false) - : make_draw_bezier_boxes (boxes, buildings, transcopy, scm_cons (scm_from_double (0), scm_car (s))); + ? make_draw_line_boxes (boxes, buildings, transcopy, + scm_cons (scm_from_double (0), scm_car (s)), + false) + : make_draw_bezier_boxes (boxes, buildings, transcopy, + scm_cons (scm_from_double (0), scm_car (s))); } } } @@ -821,13 +806,15 @@ make_glyph_string_boxes (vector &boxes, vector > &buildi */ void -stencil_dispatcher (vector &boxes, vector > &buildings, PangoMatrix trans, SCM expr) +stencil_dispatcher (vector &boxes, + vector > &buildings, + PangoMatrix trans, SCM expr) { if (not scm_is_pair (expr)) return; - if (scm_car (expr) == ly_symbol2scm ("draw-line")) + if (scm_is_eq (scm_car (expr), ly_symbol2scm ("draw-line"))) make_draw_line_boxes (boxes, buildings, trans, scm_cdr (expr), true); - else if (scm_car (expr) == ly_symbol2scm ("dashed-line")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("dashed-line"))) { expr = scm_cdr (expr); SCM th = scm_car (expr); @@ -837,9 +824,11 @@ stencil_dispatcher (vector &boxes, vector > &buildings, SCM x1 = scm_car (expr); expr = scm_cdr (expr); SCM x2 = scm_car (expr); - make_draw_line_boxes (boxes, buildings, trans, scm_list_5 (th, scm_from_double (0.0), scm_from_double (0.0), x1, x2), true); + make_draw_line_boxes (boxes, buildings, trans, + scm_list_5 (th, scm_from_double (0.0), + scm_from_double (0.0), x1, x2), true); } - else if (scm_car (expr) == ly_symbol2scm ("circle")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("circle"))) { expr = scm_cdr (expr); SCM rad = scm_car (expr); @@ -855,7 +844,7 @@ stencil_dispatcher (vector &boxes, vector > &buildings, SCM_BOOL_T, SCM_UNDEFINED)); } - else if (scm_car (expr) == ly_symbol2scm ("ellipse")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("ellipse"))) { expr = scm_cdr (expr); SCM x_rad = scm_car (expr); @@ -873,17 +862,17 @@ stencil_dispatcher (vector &boxes, vector > &buildings, SCM_BOOL_T, SCM_UNDEFINED)); } - else if (scm_car (expr) == ly_symbol2scm ("partial-ellipse")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("partial-ellipse"))) make_partial_ellipse_boxes (boxes, buildings, trans, scm_cdr (expr)); - else if (scm_car (expr) == ly_symbol2scm ("round-filled-box")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("round-filled-box"))) make_round_filled_box_boxes (boxes, trans, scm_cdr (expr)); - else if (scm_car (expr) == ly_symbol2scm ("named-glyph")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("named-glyph"))) make_named_glyph_boxes (boxes, buildings, trans, scm_cdr (expr)); - else if (scm_car (expr) == ly_symbol2scm ("polygon")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("polygon"))) make_polygon_boxes (boxes, buildings, trans, scm_cdr (expr)); - else if (scm_car (expr) == ly_symbol2scm ("path")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("path"))) make_path_boxes (boxes, buildings, trans, scm_cdr (expr)); - else if (scm_car (expr) == ly_symbol2scm ("glyph-string")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("glyph-string"))) make_glyph_string_boxes (boxes, buildings, trans, scm_cdr (expr)); else { @@ -908,35 +897,36 @@ stencil_traverser (PangoMatrix trans, SCM expr) { if (scm_is_null (expr)) return vector (); - else if (expr == ly_string2scm ("")) + else if (scm_is_eq (expr, ly_string2scm (""))) return vector (); - else if (scm_car (expr) == ly_symbol2scm ("combine-stencil")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("combine-stencil"))) { vector out; for (SCM s = scm_cdr (expr); scm_is_pair (s); s = scm_cdr (s)) { - vector res = stencil_traverser (trans, scm_car (s)); + vector res = + stencil_traverser (trans, scm_car (s)); out.insert (out.end (), res.begin (), res.end ()); } return out; } - else if (scm_car (expr) == ly_symbol2scm ("footnote")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("footnote"))) return vector (); - else if (scm_car (expr) == ly_symbol2scm ("translate-stencil")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("translate-stencil"))) { Real x = robust_scm2double (scm_caadr (expr), 0.0); Real y = robust_scm2double (scm_cdadr (expr), 0.0); pango_matrix_translate (&trans, x, y); return stencil_traverser (trans, scm_caddr (expr)); } - else if (scm_car (expr) == ly_symbol2scm ("scale-stencil")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("scale-stencil"))) { Real x = robust_scm2double (scm_caadr (expr), 0.0); Real y = robust_scm2double (scm_cadadr (expr), 0.0); pango_matrix_scale (&trans, x, y); return stencil_traverser (trans, scm_caddr (expr)); } - else if (scm_car (expr) == ly_symbol2scm ("rotate-stencil")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("rotate-stencil"))) { Real ang = robust_scm2double (scm_caadr (expr), 0.0); Real x = robust_scm2double (scm_car (scm_cadadr (expr)), 0.0); @@ -946,16 +936,16 @@ stencil_traverser (PangoMatrix trans, SCM expr) pango_matrix_translate (&trans, -x, -y); return stencil_traverser (trans, scm_caddr (expr)); } - else if (scm_car (expr) == ly_symbol2scm ("delay-stencil-evaluation")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("delay-stencil-evaluation"))) // should not use the place-holder text, but no need for the warning below return vector (); - else if (scm_car (expr) == ly_symbol2scm ("grob-cause")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("grob-cause"))) return stencil_traverser (trans, scm_caddr (expr)); - else if (scm_car (expr) == ly_symbol2scm ("color")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("color"))) return stencil_traverser (trans, scm_caddr (expr)); - else if (scm_car (expr) == ly_symbol2scm ("transparent-stencil")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("transparent-stencil"))) return stencil_traverser (trans, scm_cadr (expr)); - else if (scm_car (expr) == ly_symbol2scm ("id")) + else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("id"))) return stencil_traverser (trans, scm_caddr (expr)); else { @@ -995,7 +985,7 @@ MAKE_SCHEME_CALLBACK (Grob, pure_simple_vertical_skylines_from_extents, 3); SCM Grob::pure_simple_vertical_skylines_from_extents (SCM smob, SCM begscm, SCM endscm) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); int beg = robust_scm2int (begscm, 0); int end = robust_scm2int (endscm, INT_MAX); // We cannot measure the widths before line breaking, @@ -1007,7 +997,7 @@ MAKE_SCHEME_CALLBACK (Grob, simple_vertical_skylines_from_extents, 1); SCM Grob::simple_vertical_skylines_from_extents (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return maybe_pure_internal_simple_skylines_from_extents (me, X_AXIS, false, 0, 0, false, false); } @@ -1015,7 +1005,7 @@ MAKE_SCHEME_CALLBACK (Grob, pure_simple_horizontal_skylines_from_extents, 3); SCM Grob::pure_simple_horizontal_skylines_from_extents (SCM smob, SCM begscm, SCM endscm) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); int beg = robust_scm2int (begscm, 0); int end = robust_scm2int (endscm, INT_MAX); // If the grob is cross staff, we cannot measure its Y-extent before @@ -1028,7 +1018,7 @@ MAKE_SCHEME_CALLBACK (Grob, simple_horizontal_skylines_from_extents, 1); SCM Grob::simple_horizontal_skylines_from_extents (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); // See comment in function above. return maybe_pure_internal_simple_skylines_from_extents (me, Y_AXIS, false, 0, 0, false, to_boolean (me->get_property ("cross-staff"))); } @@ -1036,7 +1026,7 @@ Grob::simple_horizontal_skylines_from_extents (SCM smob) SCM Stencil::skylines_from_stencil (SCM sten, Real pad, Axis a) { - Stencil *s = unsmob_stencil (sten); + Stencil *s = unsmob (sten); if (!s) return Skyline_pair ().smobbed_copy (); @@ -1058,7 +1048,6 @@ Stencil::skylines_from_stencil (SCM sten, Real pad, Axis a) for (DOWN_and_UP (d)) out[d] = out[d].padded (pad); - out.deholify (); return out.smobbed_copy (); } @@ -1066,7 +1055,7 @@ MAKE_SCHEME_CALLBACK (Grob, vertical_skylines_from_stencil, 1); SCM Grob::vertical_skylines_from_stencil (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real pad = robust_scm2double (me->get_property ("skyline-horizontal-padding"), 0.0); SCM out = Stencil::skylines_from_stencil (me->get_property ("stencil"), pad, X_AXIS); @@ -1078,7 +1067,7 @@ MAKE_SCHEME_CALLBACK (Grob, horizontal_skylines_from_stencil, 1); SCM Grob::horizontal_skylines_from_stencil (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Real pad = robust_scm2double (me->get_property ("skyline-vertical-padding"), 0.0); SCM out = Stencil::skylines_from_stencil (me->get_property ("stencil"), pad, Y_AXIS); @@ -1106,7 +1095,7 @@ Grob::internal_skylines_from_element_stencils (Grob *me, Axis a, bool pure, int Skyline_pair res; for (vsize i = 0; i < elts.size (); i++) { - Skyline_pair *skyp = Skyline_pair::unsmob (elts[i]->get_maybe_pure_property (a == X_AXIS ? "vertical-skylines" : "horizontal-skylines", pure, beg, end)); + Skyline_pair *skyp = unsmob (elts[i]->get_maybe_pure_property (a == X_AXIS ? "vertical-skylines" : "horizontal-skylines", pure, beg, end)); if (skyp) { /* @@ -1140,7 +1129,7 @@ MAKE_SCHEME_CALLBACK (Grob, vertical_skylines_from_element_stencils, 1); SCM Grob::vertical_skylines_from_element_stencils (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return internal_skylines_from_element_stencils (me, X_AXIS, false, 0, INT_MAX); } @@ -1148,7 +1137,7 @@ MAKE_SCHEME_CALLBACK (Grob, horizontal_skylines_from_element_stencils, 1); SCM Grob::horizontal_skylines_from_element_stencils (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); return internal_skylines_from_element_stencils (me, Y_AXIS, false, 0, INT_MAX); } @@ -1156,7 +1145,7 @@ MAKE_SCHEME_CALLBACK (Grob, pure_vertical_skylines_from_element_stencils, 3); SCM Grob::pure_vertical_skylines_from_element_stencils (SCM smob, SCM beg_scm, SCM end_scm) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); int beg = robust_scm2int (beg_scm, 0); int end = robust_scm2int (end_scm, 0); return internal_skylines_from_element_stencils (me, X_AXIS, true, beg, end); @@ -1166,7 +1155,7 @@ MAKE_SCHEME_CALLBACK (Grob, pure_horizontal_skylines_from_element_stencils, 3); SCM Grob::pure_horizontal_skylines_from_element_stencils (SCM smob, SCM beg_scm, SCM end_scm) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); int beg = robust_scm2int (beg_scm, 0); int end = robust_scm2int (end_scm, 0); return internal_skylines_from_element_stencils (me, Y_AXIS, true, beg, end); diff --git a/lily/stencil-interpret.cc b/lily/stencil-interpret.cc index 734eb60806..87e6496de7 100644 --- a/lily/stencil-interpret.cc +++ b/lily/stencil-interpret.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,28 +32,28 @@ interpret_stencil_expression (SCM expr, SCM head = scm_car (expr); - if (head == ly_symbol2scm ("delay-stencil-evaluation")) + if (scm_is_eq (head, ly_symbol2scm ("delay-stencil-evaluation"))) { interpret_stencil_expression (scm_force (scm_cadr (expr)), func, func_arg, o); return; } - if (head == ly_symbol2scm ("transparent-stencil")) + if (scm_is_eq (head, ly_symbol2scm ("transparent-stencil"))) return; - if (head == ly_symbol2scm ("footnote")) + if (scm_is_eq (head, ly_symbol2scm ("footnote"))) return; - if (head == ly_symbol2scm ("translate-stencil")) + if (scm_is_eq (head, ly_symbol2scm ("translate-stencil"))) { o += ly_scm2offset (scm_cadr (expr)); expr = scm_caddr (expr); } - else if (head == ly_symbol2scm ("combine-stencil")) + else if (scm_is_eq (head, ly_symbol2scm ("combine-stencil"))) { for (SCM x = scm_cdr (expr); scm_is_pair (x); x = scm_cdr (x)) interpret_stencil_expression (scm_car (x), func, func_arg, o); return; } - else if (head == ly_symbol2scm ("grob-cause")) + else if (scm_is_eq (head, ly_symbol2scm ("grob-cause"))) { SCM grob = scm_cadr (expr); @@ -65,7 +65,7 @@ interpret_stencil_expression (SCM expr, (*func) (func_arg, scm_list_1 (ly_symbol2scm ("no-origin"))); return; } - else if (head == ly_symbol2scm ("color")) + else if (scm_is_eq (head, ly_symbol2scm ("color"))) { SCM color = scm_cadr (expr); SCM r = scm_car (color); @@ -78,7 +78,7 @@ interpret_stencil_expression (SCM expr, return; } - else if (head == ly_symbol2scm ("id")) + else if (scm_is_eq (head, ly_symbol2scm ("id"))) { SCM id = scm_cadr (expr); @@ -88,7 +88,7 @@ interpret_stencil_expression (SCM expr, return; } - else if (head == ly_symbol2scm ("rotate-stencil")) + else if (scm_is_eq (head, ly_symbol2scm ("rotate-stencil"))) { SCM args = scm_cadr (expr); SCM angle = scm_car (args); @@ -104,7 +104,7 @@ interpret_stencil_expression (SCM expr, return; } - else if (head == ly_symbol2scm ("scale-stencil")) + else if (scm_is_eq (head, ly_symbol2scm ("scale-stencil"))) { SCM args = scm_cadr (expr); SCM x_scale = scm_car (args); @@ -142,7 +142,7 @@ find_font_function (void *fs, SCM x) { Font_list *me = (Font_list *) fs; - if (scm_car (x) == ly_symbol2scm ("placebox")) + if (scm_is_eq (scm_car (x), ly_symbol2scm ("placebox"))) { SCM args = scm_cdr (x); SCM what = scm_caddr (args); @@ -150,9 +150,9 @@ find_font_function (void *fs, SCM x) if (scm_is_pair (what)) { SCM head = scm_car (what); - if (ly_symbol2scm ("text") == head) + if (scm_is_eq (head, ly_symbol2scm ("text"))) me->fonts_ = scm_cons (scm_cadr (what), me->fonts_); - else if (head == ly_symbol2scm ("char")) + else if (scm_is_eq (head, ly_symbol2scm ("char"))) me->fonts_ = scm_cons (scm_cadr (what), me->fonts_); } } diff --git a/lily/stencil-scheme.cc b/lily/stencil-scheme.cc index ab0f8cf745..c8d87439d6 100644 --- a/lily/stencil-scheme.cc +++ b/lily/stencil-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,7 +31,7 @@ LY_DEFINE (ly_stencil_translate_axis, "ly:stencil-translate-axis", "Return a copy of @var{stil} but translated by @var{amount}" " in @var{axis} direction.") { - Stencil *s = unsmob_stencil (stil); + Stencil *s = unsmob (stil); LY_ASSERT_SMOB (Stencil, stil, 1); LY_ASSERT_TYPE (scm_is_number, amount, 2); @@ -42,7 +42,7 @@ LY_DEFINE (ly_stencil_translate_axis, "ly:stencil-translate-axis", SCM new_s = s->smobbed_copy (); scm_remember_upto_here_1 (stil); - Stencil *q = unsmob_stencil (new_s); + Stencil *q = unsmob (new_s); q->translate_axis (real_amount, Axis (scm_to_int (axis))); return new_s; } @@ -52,7 +52,7 @@ LY_DEFINE (ly_stencil_translate, "ly:stencil-translate", "Return a @var{stil}, but translated by @var{offset}" " (a pair of numbers).") { - Stencil *s = unsmob_stencil (stil); + Stencil *s = unsmob (stil); LY_ASSERT_SMOB (Stencil, stil, 1); LY_ASSERT_TYPE (is_number_pair, offset, 2); Offset o = ly_scm2offset (offset); @@ -60,7 +60,7 @@ LY_DEFINE (ly_stencil_translate, "ly:stencil-translate", SCM new_s = s->smobbed_copy (); scm_remember_upto_here_1 (stil); - Stencil *q = unsmob_stencil (new_s); + Stencil *q = unsmob (new_s); q->translate (o); return new_s; } @@ -69,7 +69,7 @@ LY_DEFINE (ly_stencil_expr, "ly:stencil-expr", 1, 0, 0, (SCM stil), "Return the expression of @var{stil}.") { - Stencil *s = unsmob_stencil (stil); + Stencil *s = unsmob (stil); LY_ASSERT_SMOB (Stencil, stil, 1); return s->expr (); } @@ -80,7 +80,7 @@ LY_DEFINE (ly_stencil_extent, "ly:stencil-extent", " @var{axis} direction (@code{0} or @code{1} for x and" " y@tie{}axis, respectively).") { - Stencil *s = unsmob_stencil (stil); + Stencil *s = unsmob (stil); LY_ASSERT_SMOB (Stencil, stil, 1); LY_ASSERT_TYPE (is_axis, axis, 2); @@ -93,7 +93,7 @@ LY_DEFINE (ly_stencil_empty_p, "ly:stencil-empty?", " @var{axis} is supplied, the emptiness check is" " restricted to that axis.") { - Stencil *s = unsmob_stencil (stil); + Stencil *s = unsmob (stil); LY_ASSERT_SMOB (Stencil, stil, 1); if (SCM_UNBNDP (axis)) return scm_from_bool (s->is_empty ()); @@ -112,19 +112,19 @@ LY_DEFINE (ly_stencil_combine_at_edge, "ly:stencil-combine-at-edge", " space. @var{first} and @var{second} may also be @code{'()} or" " @code{#f}.") { - Stencil *s1 = unsmob_stencil (first); - Stencil *s2 = unsmob_stencil (second); + Stencil *s1 = unsmob (first); + Stencil *s2 = unsmob (second); Stencil result; - SCM_ASSERT_TYPE (s1 || first == SCM_BOOL_F || first == SCM_EOL, + SCM_ASSERT_TYPE (s1 || scm_is_false (first) || scm_is_null (first), first, SCM_ARG1, __FUNCTION__, "Stencil, #f or ()"); - SCM_ASSERT_TYPE (s2 || second == SCM_BOOL_F || second == SCM_EOL, + SCM_ASSERT_TYPE (s2 || scm_is_false (second) || scm_is_null (second), second, SCM_ARG4, __FUNCTION__, "Stencil, #f or ()"); LY_ASSERT_TYPE (is_axis, axis, 2); LY_ASSERT_TYPE (is_direction, direction, 3); Real p = 0.0; - if (padding != SCM_UNDEFINED) + if (!SCM_UNBNDP (padding)) { LY_ASSERT_TYPE (scm_is_number, padding, 5); p = scm_to_double (padding); @@ -159,19 +159,19 @@ LY_DEFINE (ly_stencil_stack, "ly:stencil-stack", " apart at least by this distance. If either of the stencils" " is spacing, @var{padding} and @var{mindist} do not apply.") { - Stencil *s1 = unsmob_stencil (first); - Stencil *s2 = unsmob_stencil (second); + Stencil *s1 = unsmob (first); + Stencil *s2 = unsmob (second); Stencil result; - SCM_ASSERT_TYPE (s1 || first == SCM_BOOL_F || first == SCM_EOL, + SCM_ASSERT_TYPE (s1 || scm_is_false (first) || scm_is_null (first), first, SCM_ARG1, __FUNCTION__, "Stencil, #f or ()"); - SCM_ASSERT_TYPE (s2 || second == SCM_BOOL_F || second == SCM_EOL, + SCM_ASSERT_TYPE (s2 || scm_is_false (second) || scm_is_null (second), second, SCM_ARG4, __FUNCTION__, "Stencil, #f or ()"); LY_ASSERT_TYPE (is_axis, axis, 2); LY_ASSERT_TYPE (is_direction, direction, 3); Real p = 0.0; - if (padding != SCM_UNDEFINED) + if (!SCM_UNBNDP (padding)) { LY_ASSERT_TYPE (scm_is_number, padding, 5); p = scm_to_double (padding); @@ -210,7 +210,7 @@ LY_DEFINE (ly_stencil_add, "ly:stencil-add", while (!SCM_NULLP (args)) { - Stencil *s = unsmob_stencil (scm_car (args)); + Stencil *s = unsmob (scm_car (args)); if (!s) SCM_ASSERT_TYPE (s, scm_car (args), SCM_ARGn, __FUNCTION__, "Stencil"); @@ -252,14 +252,14 @@ LY_DEFINE (ly_make_stencil, "ly:make-stencil", expr, SCM_ARG1, __FUNCTION__, "registered stencil expression"); Interval x; - if (xext != SCM_UNDEFINED) + if (!SCM_UNBNDP (xext)) { LY_ASSERT_TYPE (is_number_pair, xext, 2); x = ly_scm2interval (xext); } Interval y; - if (yext != SCM_UNDEFINED) + if (!SCM_UNBNDP (yext)) { LY_ASSERT_TYPE (is_number_pair, yext, 3); y = ly_scm2interval (yext); @@ -280,7 +280,7 @@ LY_DEFINE (ly_stencil_aligned_to, "ly:stencil-aligned-to", LY_ASSERT_TYPE (is_axis, axis, 2); LY_ASSERT_TYPE (scm_is_number, dir, 3); - Stencil target = *unsmob_stencil (stil); + Stencil target = *unsmob (stil); target.align_to ((Axis)scm_to_int (axis), scm_to_double (dir)); @@ -293,7 +293,7 @@ LY_DEFINE (ly_stencil_fonts, "ly:stencil-fonts", " in@tie{}@var{s}.") { LY_ASSERT_SMOB (Stencil, s, 1); - Stencil *stil = unsmob_stencil (s); + Stencil *stil = unsmob (s); return find_expression_fonts (stil->expr ()); } @@ -302,7 +302,7 @@ LY_DEFINE (ly_stencil_in_color, "ly:stencil-in-color", "Put @var{stc} in a different color.") { LY_ASSERT_SMOB (Stencil, stc, 1); - Stencil *stil = unsmob_stencil (stc); + Stencil *stil = unsmob (stc); return Stencil (stil->extent_box (), scm_list_3 (ly_symbol2scm ("color"), scm_list_3 (r, g, b), @@ -363,7 +363,7 @@ LY_DEFINE (ly_stencil_rotate, "ly:stencil-rotate", " the relative offset (@var{x}, @var{y}). E.g., an offset of" " (-1, 1) will rotate the stencil around the left upper corner.") { - Stencil *s = unsmob_stencil (stil); + Stencil *s = unsmob (stil); LY_ASSERT_SMOB (Stencil, stil, 1); LY_ASSERT_TYPE (scm_is_number, angle, 2); LY_ASSERT_TYPE (scm_is_number, x, 3); @@ -373,7 +373,7 @@ LY_DEFINE (ly_stencil_rotate, "ly:stencil-rotate", Real y_off = scm_to_double (y); SCM new_s = s->smobbed_copy (); - Stencil *q = unsmob_stencil (new_s); + Stencil *q = unsmob (new_s); q->rotate_degrees (a, Offset (x_off, y_off)); return new_s; } @@ -383,7 +383,7 @@ LY_DEFINE (ly_stencil_rotate_absolute, "ly:stencil-rotate-absolute", "Return a stencil @var{stil} rotated @var{angle} degrees around" " point (@var{x}, @var{y}), given in absolute coordinates.") { - Stencil *s = unsmob_stencil (stil); + Stencil *s = unsmob (stil); LY_ASSERT_SMOB (Stencil, stil, 1); LY_ASSERT_TYPE (scm_is_number, angle, 2); LY_ASSERT_TYPE (scm_is_number, x, 3); @@ -393,7 +393,7 @@ LY_DEFINE (ly_stencil_rotate_absolute, "ly:stencil-rotate-absolute", Real y_off = scm_to_double (y); SCM new_s = s->smobbed_copy (); - Stencil *q = unsmob_stencil (new_s); + Stencil *q = unsmob (new_s); q->rotate_degrees_absolute (a, Offset (x_off, y_off)); return new_s; } @@ -413,14 +413,23 @@ LY_DEFINE (ly_round_filled_box, "ly:round-filled-box", } LY_DEFINE (ly_round_filled_polygon, "ly:round-filled-polygon", - 2, 0, 0, - (SCM points, SCM blot), + 2, 1, 0, + (SCM points, SCM blot, SCM extroversion), "Make a @code{Stencil} object that prints a black polygon with" " corners at the points defined by @var{points} (list of coordinate" - " pairs) and roundness @var{blot}.") + " pairs) and roundness @var{blot}. Optional" + "@var{extroversion} shifts the outline outward, with the" + "default of@tie{}@code{-1.0} keeping the outer boundary of" + "the outline just inside of the polygon.") { SCM_ASSERT_TYPE (scm_ilength (points) > 0, points, SCM_ARG1, __FUNCTION__, "list of coordinate pairs"); LY_ASSERT_TYPE (scm_is_number, blot, 2); + Real ext = -1; + if (!SCM_UNBNDP (extroversion)) + { + LY_ASSERT_TYPE (scm_is_number, extroversion, 3); + ext = scm_to_double (extroversion); + } vector pts; for (SCM p = points; scm_is_pair (p); p = scm_cdr (p)) { @@ -434,7 +443,8 @@ LY_DEFINE (ly_round_filled_polygon, "ly:round-filled-polygon", // TODO: Print out warning } } - return Lookup::round_filled_polygon (pts, scm_to_double (blot)).smobbed_copy (); + return Lookup::round_filled_polygon (pts, scm_to_double (blot), ext) + .smobbed_copy (); } LY_DEFINE (ly_register_stencil_expression, "ly:register-stencil-expression", @@ -457,16 +467,18 @@ LY_DEFINE (ly_all_stencil_expressions, "ly:all-stencil-expressions", LY_DEFINE (ly_stencil_scale, "ly:stencil-scale", 3, 0, 0, (SCM stil, SCM x, SCM y), - "Scale @var{stil} using the horizontal and vertical scaling" - " factors @var{x} and @var{y}.") + "Scale stencil @var{stil} using the horizontal and vertical" + " scaling factors @var{x} and @var{y}. Negative values will" + " flip or mirror @var{stil} without changing its origin;" + " this may result in collisions unless it is repositioned.") { - Stencil *s = unsmob_stencil (stil); + Stencil *s = unsmob (stil); LY_ASSERT_SMOB (Stencil, stil, 1); LY_ASSERT_TYPE (scm_is_number, x, 2); LY_ASSERT_TYPE (scm_is_number, y, 3); SCM new_s = s->smobbed_copy (); - Stencil *q = unsmob_stencil (new_s); + Stencil *q = unsmob (new_s); q->scale (scm_to_double (x), scm_to_double (y)); return new_s; diff --git a/lily/stencil.cc b/lily/stencil.cc index c8985105ea..0cf49296f0 100644 --- a/lily/stencil.cc +++ b/lily/stencil.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,7 +25,6 @@ #include "string-convert.hh" #include "warn.hh" -#include "ly-smobs.icc" Stencil::Stencil () { @@ -39,24 +38,13 @@ Stencil::Stencil (Box b, SCM func) dim_ = b; } -int -Stencil::print_smob (SCM, SCM port, scm_print_state *) -{ - scm_puts ("#", port); - return 1; -} - SCM -Stencil::mark_smob (SCM smob) +Stencil::mark_smob () const { - Stencil *s = (Stencil *) SCM_CELL_WORD_1 (smob); - return s->expr_; + return expr_; } -IMPLEMENT_SIMPLE_SMOBS (Stencil); -IMPLEMENT_TYPE_P (Stencil, "ly:stencil?"); -IMPLEMENT_DEFAULT_EQUAL_P (Stencil); +const char * const Stencil::type_p_name_ = "ly:stencil?"; Interval Stencil::extent (Axis a) const @@ -67,7 +55,7 @@ Stencil::extent (Axis a) const bool Stencil::is_empty () const { - return (expr_ == SCM_EOL + return (scm_is_null (expr_) || dim_.is_empty ()); } @@ -116,10 +104,10 @@ Stencil::rotate_degrees_absolute (Real a, Offset absolute_off) * *this = rotated() */ - expr_ = scm_list_n (ly_symbol2scm ("rotate-stencil"), + expr_ = scm_list_3 (ly_symbol2scm ("rotate-stencil"), scm_list_2 (scm_from_double (a), scm_cons (scm_from_double (x), scm_from_double (y))), - expr_, SCM_UNDEFINED); + expr_); /* * Calculate the new bounding box @@ -179,11 +167,10 @@ Stencil::translate (Offset o) } if (!scm_is_null (expr_)) - expr_ = scm_list_n (ly_symbol2scm ("translate-stencil"), + expr_ = scm_list_3 (ly_symbol2scm ("translate-stencil"), ly_offset2scm (o), - expr_, SCM_UNDEFINED); - if (!is_empty ()) - dim_.translate (o); + expr_); + dim_.translate (o); } void diff --git a/lily/stream-event-scheme.cc b/lily/stream-event-scheme.cc index 16703d33f5..ccc37e0110 100644 --- a/lily/stream-event-scheme.cc +++ b/lily/stream-event-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2006--2012 Erik Sandberg + Copyright (C) 2006--2015 Erik Sandberg LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,7 +23,7 @@ LY_DEFINE (ly_stream_event_p, "ly:stream-event?", 1, 0, 0, (SCM obj), "Is @code{@var{obj}} a @code{Stream_event} object?") { - return scm_from_bool (unsmob_stream_event (obj)); + return scm_from_bool (unsmob (obj)); } LY_DEFINE (ly_make_stream_event, "ly:make-stream-event", @@ -31,12 +31,12 @@ LY_DEFINE (ly_make_stream_event, "ly:make-stream-event", "Create a stream event of class @var{cl} with the given" " mutable property list.") { - LY_ASSERT_TYPE (ly_is_symbol, cl, 1); + LY_ASSERT_TYPE (ly_is_pair, cl, 1); /* should be scm_list_p, but scm_list_p is expensive. */ LY_ASSERT_TYPE (scm_is_pair, proplist, 2); - if (proplist == SCM_UNDEFINED) + if (SCM_UNBNDP (proplist)) proplist = SCM_EOL; Stream_event *e = new Stream_event (cl, proplist); @@ -49,7 +49,7 @@ LY_DEFINE (ly_event_property, "ly:event-property", " If @var{sym} is undefined, return @var{val} or" " @code{'()} if @var{val} is not specified.") { - LY_ASSERT_TYPE (unsmob_stream_event, sev, 1) + LY_ASSERT_SMOB (Stream_event, sev, 1); return ly_prob_property (sev, sym, val); } @@ -57,7 +57,7 @@ LY_DEFINE (ly_event_set_property_x, "ly:event-set-property!", 3, 0, 0, (SCM ev, SCM sym, SCM val), "Set property @var{sym} in event @var{ev} to @var{val}.") { - LY_ASSERT_TYPE (unsmob_stream_event, ev, 1); + LY_ASSERT_SMOB (Stream_event, ev, 1); LY_ASSERT_TYPE (ly_is_symbol, sym, 2); return ly_prob_set_property_x (ev, sym, val); @@ -68,7 +68,7 @@ LY_DEFINE (ly_event_deep_copy, "ly:event-deep-copy", "Copy @var{m} and all sub expressions of@tie{}@var{m}.") { SCM copy = m; - if (Stream_event *ev = unsmob_stream_event (m)) + if (Stream_event *ev = unsmob (m)) { ev = ev->clone (); copy = ev->unprotect (); diff --git a/lily/stream-event.cc b/lily/stream-event.cc index 5ce03ec08d..64c9a979d9 100644 --- a/lily/stream-event.cc +++ b/lily/stream-event.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Erik Sandberg + Copyright (C) 2005--2015 Erik Sandberg LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,6 @@ #include "stream-event.hh" -#include "ly-smobs.icc" #include "context.hh" #include "input.hh" #include "music.hh" @@ -55,21 +54,21 @@ Stream_event::copy_mutable_properties () const Input * Stream_event::origin () const { - Input *i = unsmob_input (get_property ("origin")); + Input *i = unsmob (get_property ("origin")); return i ? i : &dummy_input_global; } void Stream_event::set_spot (Input *i) { - set_property ("origin", make_input (*i)); + set_property ("origin", i->smobbed_copy ()); } bool Stream_event::internal_in_event_class (SCM class_name) { SCM cl = get_property ("class"); - return scm_c_memq (class_name, cl) != SCM_BOOL_F; + return scm_is_true (scm_c_memq (class_name, cl)); } MAKE_SCHEME_CALLBACK (Stream_event, undump, 1); @@ -87,20 +86,20 @@ Stream_event::make_transposable () SCM prop = scm_car (entry); SCM val = scm_cdr (entry); - if ((unsmob_pitch (val) - || (prop == ly_symbol2scm ("element") && unsmob_music (val)) - || (prop == ly_symbol2scm ("elements") && scm_is_pair (val)) - || (prop == ly_symbol2scm ("pitch-alist") && scm_is_pair (val))) + if ((unsmob (val) + || (scm_is_eq (prop, ly_symbol2scm ("element")) && unsmob (val)) + || (scm_is_eq (prop, ly_symbol2scm ("elements")) && scm_is_pair (val)) + || (scm_is_eq (prop, ly_symbol2scm ("pitch-alist")) && scm_is_pair (val))) && scm_is_false (scm_assq (prop, mutable_property_alist_))) mutable_property_alist_ - = scm_acons (prop, ly_music_deep_copy (val), mutable_property_alist_); + = scm_acons (prop, music_deep_copy (val), mutable_property_alist_); } } SCM Stream_event::dump (SCM self) { - Stream_event *ev = unsmob_stream_event (self); + Stream_event *ev = unsmob (self); // Reversed alists look prettier. return scm_cons (scm_reverse (ev->immutable_property_alist_), scm_reverse (ev->mutable_property_alist_)); @@ -114,9 +113,3 @@ Stream_event::undump (SCM data) obj->mutable_property_alist_ = scm_reverse (scm_cdr (data)); return obj->unprotect (); } - -Stream_event * -unsmob_stream_event (SCM m) -{ - return dynamic_cast (unsmob_prob (m)); -} diff --git a/lily/sustain-pedal.cc b/lily/sustain-pedal.cc index 98b4e2df8a..724059742d 100644 --- a/lily/sustain-pedal.cc +++ b/lily/sustain-pedal.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -48,7 +48,7 @@ MAKE_SCHEME_CALLBACK (Sustain_pedal, print, 1); SCM Sustain_pedal::print (SCM smob) { - Grob *e = unsmob_grob (smob); + Grob *e = unsmob (smob); Stencil mol; SCM glyph = e->get_property ("text"); diff --git a/lily/system-start-delimiter-engraver.cc b/lily/system-start-delimiter-engraver.cc index b8770feebb..2979e11a19 100644 --- a/lily/system-start-delimiter-engraver.cc +++ b/lily/system-start-delimiter-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,6 +26,8 @@ #include "staff-symbol.hh" #include "system-start-delimiter.hh" +#include "translator.icc" + struct Bracket_nesting_node { public: @@ -132,10 +134,10 @@ Bracket_nesting_group::from_list (SCM x) node->from_list (entry); children_.push_back (node); } - else if (entry == ly_symbol2scm ("SystemStartBrace") - || entry == ly_symbol2scm ("SystemStartBracket") - || entry == ly_symbol2scm ("SystemStartBar") - || entry == ly_symbol2scm ("SystemStartSquare")) + else if (scm_is_eq (entry, ly_symbol2scm ("SystemStartBrace")) + || scm_is_eq (entry, ly_symbol2scm ("SystemStartBracket")) + || scm_is_eq (entry, ly_symbol2scm ("SystemStartBar")) + || scm_is_eq (entry, ly_symbol2scm ("SystemStartSquare"))) symbol_ = entry; else children_.push_back (new Bracket_nesting_staff (0)); @@ -167,8 +169,8 @@ public: protected: Bracket_nesting_group *nesting_; - DECLARE_ACKNOWLEDGER (system_start_delimiter); - DECLARE_ACKNOWLEDGER (staff_symbol); + void acknowledge_system_start_delimiter (Grob_info); + void acknowledge_staff_symbol (Grob_info); void process_music (); virtual void finalize (); @@ -191,7 +193,7 @@ System_start_delimiter_engraver::process_music () nesting_->from_list (hierarchy); nesting_->create_grobs (this, delimiter_name); nesting_->set_bound (LEFT, - unsmob_grob (get_property ("currentCommandColumn"))); + unsmob (get_property ("currentCommandColumn"))); } } @@ -201,7 +203,7 @@ System_start_delimiter_engraver::finalize () if (nesting_) { nesting_->set_bound (RIGHT, - unsmob_grob (get_property ("currentCommandColumn"))); + unsmob (get_property ("currentCommandColumn"))); nesting_->set_nesting_support (0); delete nesting_; @@ -227,10 +229,13 @@ System_start_delimiter_engraver::acknowledge_system_start_delimiter (Grob_info i nesting_->add_support (inf.grob ()); } -#include "translator.icc" -ADD_ACKNOWLEDGER (System_start_delimiter_engraver, staff_symbol); -ADD_ACKNOWLEDGER (System_start_delimiter_engraver, system_start_delimiter); +void +System_start_delimiter_engraver::boot () +{ + ADD_ACKNOWLEDGER (System_start_delimiter_engraver, staff_symbol); + ADD_ACKNOWLEDGER (System_start_delimiter_engraver, system_start_delimiter); +} ADD_TRANSLATOR (System_start_delimiter_engraver, /* doc */ diff --git a/lily/system-start-delimiter.cc b/lily/system-start-delimiter.cc index a45b7dd13a..e5460a0f04 100644 --- a/lily/system-start-delimiter.cc +++ b/lily/system-start-delimiter.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -93,7 +93,7 @@ MAKE_SCHEME_CALLBACK (System_start_delimiter, print, 1); SCM System_start_delimiter::print (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); extract_grob_set (me, "elements", elts); Grob *common = common_refpoint_of_array (elts, me, Y_AXIS); @@ -129,13 +129,13 @@ System_start_delimiter::print (SCM smob) } Stencil m; - if (glyph_sym == ly_symbol2scm ("bracket")) + if (scm_is_eq (glyph_sym, ly_symbol2scm ("bracket"))) m = staff_bracket (me, len); - else if (glyph_sym == ly_symbol2scm ("brace")) + else if (scm_is_eq (glyph_sym, ly_symbol2scm ("brace"))) m = staff_brace (me, len); - else if (glyph_sym == ly_symbol2scm ("bar-line")) + else if (scm_is_eq (glyph_sym, ly_symbol2scm ("bar-line"))) m = simple_bar (me, len); - else if (glyph_sym == ly_symbol2scm ("line-bracket")) + else if (scm_is_eq (glyph_sym, ly_symbol2scm ("line-bracket"))) m = line_bracket (me, len); m.translate_axis (ext.center (), Y_AXIS); diff --git a/lily/system.cc b/lily/system.cc index ad4d0bab77..0551b85cbc 100644 --- a/lily/system.cc +++ b/lily/system.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,6 +40,7 @@ #include "text-interface.hh" #include "warn.hh" #include "unpure-pure-container.hh" +#include "lily-imports.hh" System::System (System const &src) : Spanner (src) @@ -62,7 +63,7 @@ void System::init_elements () { SCM scm_arr = Grob_array::make_array (); - all_elements_ = unsmob_grob_array (scm_arr); + all_elements_ = unsmob (scm_arr); all_elements_->set_ordered (false); set_object ("all-elements", scm_arr); } @@ -105,16 +106,9 @@ System::typeset_grob (Grob *elem) void System::derived_mark () const { - if (!all_elements_->empty ()) - { - Grob **ptr = &all_elements_->array_reference ()[0]; - Grob **end = ptr + all_elements_->size (); - while (ptr < end) - { - scm_gc_mark ((*ptr)->self_scm ()); - ptr++; - } - } + const vector &arr = all_elements_->array (); + for (vsize i = arr.size (); i--;) + scm_gc_mark (arr[i]->self_scm ()); if (pscore_) scm_gc_mark (pscore_->self_scm ()); @@ -180,7 +174,7 @@ System::do_break_substitution_and_fixup_refpoints () handle_broken_dependencies (); - /* Because the this->get_property (all-elements) contains items in 3 + /* Because the get_property (all-elements) contains items in 3 versions, handle_broken_dependencies () will leave duplicated items in all-elements. Strictly speaking this is harmless, but it leads to duplicated symbols in the output. uniq makes sure @@ -327,13 +321,13 @@ System::internal_get_note_heights_in_range (vsize start, vsize end, bool foot) if (!Text_interface::is_markup (footnote_markup)) continue; - SCM props = scm_call_1 (ly_lily_module_constant ("layout-extract-page-properties"), - pscore_->layout ()->self_scm ()); + SCM props = + Lily::layout_extract_page_properties (pscore_->layout ()->self_scm ()); SCM footnote_stl = Text_interface::interpret_markup (pscore_->layout ()->self_scm (), props, footnote_markup); - Stencil *footnote_stencil = unsmob_stencil (footnote_stl); + Stencil *footnote_stencil = unsmob (footnote_stl); out.push_back (footnote_stencil->extent (Y_AXIS).length ()); } @@ -378,7 +372,7 @@ MAKE_SCHEME_CALLBACK (System, footnotes_before_line_breaking, 1); SCM System::footnotes_before_line_breaking (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); vector footnotes; SCM grobs_scm = Grob_array::make_array (); extract_grob_set (me, "all-elements", elts); @@ -386,7 +380,7 @@ System::footnotes_before_line_breaking (SCM smob) if (elts[i]->internal_has_interface (ly_symbol2scm ("footnote-interface"))) footnotes.push_back (elts[i]); - unsmob_grob_array (grobs_scm)->set_array (footnotes); + unsmob (grobs_scm)->set_array (footnotes); return grobs_scm; } @@ -394,14 +388,14 @@ MAKE_SCHEME_CALLBACK (System, footnotes_after_line_breaking, 1); SCM System::footnotes_after_line_breaking (SCM smob) { - Spanner *sys_span = unsmob_spanner (smob); + Spanner *sys_span = unsmob (smob); System *sys = dynamic_cast (sys_span); Interval_t sri = sys->spanned_rank_interval (); vector footnote_grobs = sys->get_footnote_grobs_in_range (sri[LEFT], sri[RIGHT]); vector_sort (footnote_grobs, grob_2D_less); SCM grobs_scm = Grob_array::make_array (); - unsmob_grob_array (grobs_scm)->set_array (footnote_grobs); + unsmob (grobs_scm)->set_array (footnote_grobs); return grobs_scm; } @@ -409,30 +403,30 @@ MAKE_SCHEME_CALLBACK (System, vertical_skyline_elements, 1); SCM System::vertical_skyline_elements (SCM smob) { - Grob *me_grob = unsmob_grob (smob); + Grob *me_grob = unsmob (smob); vector vertical_skyline_grobs; extract_grob_set (me_grob, "elements", my_elts); for (vsize i = 0; i < my_elts.size (); i++) - if (System_start_delimiter::has_interface (my_elts[i])) + if (has_interface (my_elts[i])) vertical_skyline_grobs.push_back (my_elts[i]); System *me = dynamic_cast (me_grob); - Grob *align = unsmob_grob (me->get_object ("vertical-alignment")); + Grob *align = unsmob (me->get_object ("vertical-alignment")); if (!align) { SCM grobs_scm = Grob_array::make_array (); - unsmob_grob_array (grobs_scm)->set_array (vertical_skyline_grobs); + unsmob (grobs_scm)->set_array (vertical_skyline_grobs); return grobs_scm; } extract_grob_set (align, "elements", elts); for (vsize i = 0; i < elts.size (); i++) - if (Hara_kiri_group_spanner::has_interface (elts[i])) + if (has_interface (elts[i])) vertical_skyline_grobs.push_back (elts[i]); SCM grobs_scm = Grob_array::make_array (); - unsmob_grob_array (grobs_scm)->set_array (vertical_skyline_grobs); + unsmob (grobs_scm)->set_array (vertical_skyline_grobs); return grobs_scm; } @@ -449,7 +443,7 @@ System::break_into_pieces (vector const &breaking) int st = Paper_column::get_rank (c[0]); int end = Paper_column::get_rank (c.back ()); - Interval iv (pure_height (this, st, end)); + Interval iv (pure_y_extent (this, st, end)); system->set_property ("pure-Y-extent", ly_interval2scm (iv)); system->set_bound (LEFT, c[0]); @@ -489,12 +483,12 @@ void System::add_column (Paper_column *p) { Grob *me = this; - Grob_array *ga = unsmob_grob_array (me->get_object ("columns")); + Grob_array *ga = unsmob (me->get_object ("columns")); if (!ga) { SCM scm_ga = Grob_array::make_array (); me->set_object ("columns", scm_ga); - ga = unsmob_grob_array (scm_ga); + ga = unsmob (scm_ga); } p->set_rank (ga->size ()); @@ -549,7 +543,7 @@ System::post_processing () vector all_elts_sorted (all_elements_->array ()); uniquify (all_elts_sorted); - this->get_stencil (); + get_stencil (); for (vsize i = all_elts_sorted.size (); i--;) { Grob *g = all_elts_sorted[i]; @@ -594,7 +588,7 @@ System::get_paper_system () Grob *g = entries[j].grob_; Stencil st = g->get_print_stencil (); - if (st.expr () == SCM_EOL) + if (scm_is_null (st.expr ())) continue; Offset o; @@ -624,7 +618,7 @@ System::get_paper_system () exprs)); if (debug_skylines) { - Skyline_pair *skylines = Skyline_pair::unsmob (get_property ("vertical-skylines")); + Skyline_pair *skylines = unsmob (get_property ("vertical-skylines")); if (skylines) { Stencil up @@ -636,14 +630,14 @@ System::get_paper_system () } } - Grob *left_bound = this->get_bound (LEFT); + Grob *left_bound = get_bound (LEFT); SCM prop_init = left_bound->get_property ("line-break-system-details"); Prob *pl = make_paper_system (prop_init); paper_system_set_stencil (pl, sys_stencil); /* information that the page breaker might need */ - Grob *right_bound = this->get_bound (RIGHT); - pl->set_property ("vertical-skylines", this->get_property ("vertical-skylines")); + Grob *right_bound = get_bound (RIGHT); + pl->set_property ("vertical-skylines", get_property ("vertical-skylines")); pl->set_property ("page-break-permission", right_bound->get_property ("page-break-permission")); pl->set_property ("page-turn-permission", right_bound->get_property ("page-turn-permission")); pl->set_property ("page-break-penalty", right_bound->get_property ("page-break-penalty")); @@ -653,7 +647,7 @@ System::get_paper_system () pl->set_property ("last-in-score", SCM_BOOL_T); Interval staff_refpoints; - if (Grob *align = unsmob_grob (get_object ("vertical-alignment"))) + if (Grob *align = unsmob (get_object ("vertical-alignment"))) { extract_grob_set (align, "elements", staves); for (vsize i = 0; i < staves.size (); i++) @@ -664,7 +658,7 @@ System::get_paper_system () } pl->set_property ("staff-refpoint-extent", ly_interval2scm (staff_refpoints)); - pl->set_property ("system-grob", this->self_scm ()); + pl->set_property ("system-grob", self_scm ()); return pl->unprotect (); } @@ -758,11 +752,11 @@ MAKE_SCHEME_CALLBACK (System, get_vertical_alignment, 1); SCM System::get_vertical_alignment (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "elements", elts); Grob *ret = 0; for (vsize i = 0; i < elts.size (); i++) - if (Align_interface::has_interface (elts[i])) + if (has_interface (elts[i])) { if (ret) me->programming_error ("found multiple vertical alignments in this system"); @@ -782,7 +776,7 @@ System::get_vertical_alignment (SCM smob) Grob * System::get_extremal_staff (Direction dir, Interval const &iv) { - Grob *align = unsmob_grob (get_object ("vertical-alignment")); + Grob *align = unsmob (get_object ("vertical-alignment")); if (!align) return 0; @@ -791,7 +785,7 @@ System::get_extremal_staff (Direction dir, Interval const &iv) vsize end = (dir == UP) ? elts.size () : VPOS; for (vsize i = start; i != end; i += dir) { - if (Hara_kiri_group_spanner::has_interface (elts[i])) + if (has_interface (elts[i])) Hara_kiri_group_spanner::consider_suicide (elts[i]); Interval intersection = elts[i]->extent (this, X_AXIS); @@ -806,7 +800,7 @@ System::get_extremal_staff (Direction dir, Interval const &iv) Grob * System::get_neighboring_staff (Direction dir, Grob *vertical_axis_group, Interval_t bounds) { - Grob *align = unsmob_grob (get_object ("vertical-alignment")); + Grob *align = unsmob (get_object ("vertical-alignment")); if (!align) return 0; @@ -821,7 +815,7 @@ System::get_neighboring_staff (Direction dir, Grob *vertical_axis_group, Interva if (elts[i] == vertical_axis_group) return out; - if (Hara_kiri_group_spanner::has_interface (elts[i])) + if (has_interface (elts[i])) Hara_kiri_group_spanner::consider_suicide (elts[i]); bounds.intersect (elts[i]->spanned_rank_interval ()); @@ -836,7 +830,7 @@ Interval System::pure_refpoint_extent (vsize start, vsize end) { Interval ret; - Grob *alignment = unsmob_grob (get_object ("vertical-alignment")); + Grob *alignment = unsmob (get_object ("vertical-alignment")); if (!alignment) return Interval (); @@ -863,7 +857,7 @@ System::pure_refpoint_extent (vsize start, vsize end) Interval System::part_of_line_pure_height (vsize start, vsize end, bool begin) { - Grob *alignment = unsmob_grob (get_object ("vertical-alignment")); + Grob *alignment = unsmob (get_object ("vertical-alignment")); if (!alignment) return Interval (); @@ -909,14 +903,14 @@ MAKE_SCHEME_CALLBACK (System, calc_pure_relevant_grobs, 1); SCM System::calc_pure_relevant_grobs (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "elements", elts); vector relevant_grobs; for (vsize i = 0; i < elts.size (); ++i) { - if (!Axis_group_interface::has_interface (elts[i])) + if (!has_interface (elts[i])) { relevant_grobs.push_back (elts[i]); @@ -934,7 +928,7 @@ System::calc_pure_relevant_grobs (SCM smob) SCM grobs_scm = Grob_array::make_array (); - unsmob_grob_array (grobs_scm)->set_array (relevant_grobs); + unsmob (grobs_scm)->set_array (relevant_grobs); return grobs_scm; } @@ -949,7 +943,7 @@ MAKE_SCHEME_CALLBACK (System, calc_pure_height, 3); SCM System::calc_pure_height (SCM smob, SCM start_scm, SCM end_scm) { - System *me = dynamic_cast (unsmob_grob (smob)); + System *me = unsmob (smob); int start = scm_to_int (start_scm); int end = scm_to_int (end_scm); @@ -993,8 +987,8 @@ enum static SCM get_maybe_spaceable_staves (SCM smob, int filter) { - System *me = dynamic_cast (unsmob_grob (smob)); - Grob *align = unsmob_grob (me->get_object ("vertical_alignment")); + System *me = unsmob (smob); + Grob *align = unsmob (me->get_object ("vertical_alignment")); SCM ret = SCM_EOL; if (align) diff --git a/lily/tab-note-heads-engraver.cc b/lily/tab-note-heads-engraver.cc index 79807acf04..4294a2e5fe 100644 --- a/lily/tab-note-heads-engraver.cc +++ b/lily/tab-note-heads-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys, Jean-Baptiste Lamy , + Copyright (C) 2002--2015 Han-Wen Nienhuys, Jean-Baptiste Lamy , LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -49,9 +49,9 @@ public: TRANSLATOR_DECLARATIONS (Tab_note_heads_engraver); protected: - DECLARE_TRANSLATOR_LISTENER (note); - DECLARE_TRANSLATOR_LISTENER (string_number); - DECLARE_TRANSLATOR_LISTENER (fingering); + void listen_note (Stream_event *); + void listen_string_number (Stream_event *); + void listen_fingering (Stream_event *); void process_music (); void stop_translation_timestep (); @@ -61,21 +61,18 @@ Tab_note_heads_engraver::Tab_note_heads_engraver () { } -IMPLEMENT_TRANSLATOR_LISTENER (Tab_note_heads_engraver, note); void Tab_note_heads_engraver::listen_note (Stream_event *ev) { note_events_.push_back (ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Tab_note_heads_engraver, string_number); void Tab_note_heads_engraver::listen_string_number (Stream_event *ev) { tabstring_events_.push_back (ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Tab_note_heads_engraver, fingering); void Tab_note_heads_engraver::listen_fingering (Stream_event *ev) { @@ -111,12 +108,12 @@ Tab_note_heads_engraver::process_music () bool length_changed = (note_events_.size () != fret_count); vsize index; - if (string_fret_finger != SCM_EOL) + if (!scm_is_null (string_fret_finger)) for (vsize i = 0; i < fret_count; i++) { note_entry = scm_list_ref (string_fret_finger, scm_from_int (i)); string_number = scm_car (note_entry); - if (string_number != SCM_BOOL_F) + if (scm_is_true (string_number)) { fret = scm_cadr (note_entry); fret_label = scm_call_3 (fret_procedure, @@ -142,6 +139,14 @@ Tab_note_heads_engraver::stop_translation_timestep () fingering_events_.clear (); } +void +Tab_note_heads_engraver::boot () +{ + ADD_LISTENER (Tab_note_heads_engraver, note); + ADD_LISTENER (Tab_note_heads_engraver, string_number); + ADD_LISTENER (Tab_note_heads_engraver, fingering); +} + ADD_TRANSLATOR (Tab_note_heads_engraver, /* doc */ "Generate one or more tablature note heads from event of type" diff --git a/lily/tab-staff-symbol-engraver.cc b/lily/tab-staff-symbol-engraver.cc index 488e605b2c..cde9e82bbb 100644 --- a/lily/tab-staff-symbol-engraver.cc +++ b/lily/tab-staff-symbol-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,7 +25,7 @@ class Tab_staff_symbol_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Tab_staff_symbol_engraver); protected: - DECLARE_ACKNOWLEDGER (staff_symbol); + void acknowledge_staff_symbol (Grob_info); }; void @@ -42,7 +42,12 @@ Tab_staff_symbol_engraver::Tab_staff_symbol_engraver () #include "translator.icc" -ADD_ACKNOWLEDGER (Tab_staff_symbol_engraver, staff_symbol); +void +Tab_staff_symbol_engraver::boot () +{ + ADD_ACKNOWLEDGER (Tab_staff_symbol_engraver, staff_symbol); +} + ADD_TRANSLATOR (Tab_staff_symbol_engraver, /* doc */ "Create a tablature staff symbol, but look at" diff --git a/lily/tab-tie-follow-engraver.cc b/lily/tab-tie-follow-engraver.cc index b036599014..58c5203ef0 100644 --- a/lily/tab-tie-follow-engraver.cc +++ b/lily/tab-tie-follow-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2012 Carl D. Sorensen + Copyright (C) 2010--2015 Carl D. Sorensen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,9 +44,9 @@ public: TRANSLATOR_DECLARATIONS (Tab_tie_follow_engraver); protected: - DECLARE_ACKNOWLEDGER (glissando); - DECLARE_ACKNOWLEDGER (slur); - DECLARE_ACKNOWLEDGER (tab_note_head); + void acknowledge_glissando (Grob_info); + void acknowledge_slur (Grob_info); + void acknowledge_tab_note_head (Grob_info); void stop_translation_timestep (); }; @@ -85,7 +85,7 @@ Tab_tie_follow_engraver::stop_translation_timestep () if (left_item) { SCM left_cause = left_item->get_property ("cause"); - Item *slur_cause = unsmob_item (left_cause); + Item *slur_cause = unsmob (left_cause); if (slur_cause == note_heads_[k]) { note_heads_[k]->set_property ("span-start", SCM_BOOL_T); @@ -110,9 +110,14 @@ Tab_tie_follow_engraver::stop_translation_timestep () note_heads_.clear (); } -ADD_ACKNOWLEDGER (Tab_tie_follow_engraver, slur); -ADD_ACKNOWLEDGER (Tab_tie_follow_engraver, glissando); -ADD_ACKNOWLEDGER (Tab_tie_follow_engraver, tab_note_head); + +void +Tab_tie_follow_engraver::boot () +{ + ADD_ACKNOWLEDGER (Tab_tie_follow_engraver, slur); + ADD_ACKNOWLEDGER (Tab_tie_follow_engraver, glissando); + ADD_ACKNOWLEDGER (Tab_tie_follow_engraver, tab_note_head); +} ADD_TRANSLATOR (Tab_tie_follow_engraver, /* doc */ diff --git a/lily/template5.cc b/lily/template5.cc index 9c9613d1ba..8f9118aee6 100644 --- a/lily/template5.cc +++ b/lily/template5.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lily/tempo-performer.cc b/lily/tempo-performer.cc index 7d32d3b612..683f133d64 100644 --- a/lily/tempo-performer.cc +++ b/lily/tempo-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -61,10 +61,10 @@ void Tempo_performer::process_music () { SCM w = get_property ("tempoWholesPerMinute"); - if (unsmob_moment (w) + if (unsmob (w) && !ly_is_equal (w, last_tempo_)) { - Rational r = unsmob_moment (w)->main_part_; + Rational r = unsmob (w)->main_part_; r *= Rational (4, 1); audio_ = new Audio_tempo (r.to_int ()); @@ -85,6 +85,12 @@ Tempo_performer::stop_translation_timestep () } } +void +Tempo_performer::boot () +{ + +} + ADD_TRANSLATOR (Tempo_performer, /* doc */ "", diff --git a/lily/text-engraver.cc b/lily/text-engraver.cc index 6bd2356cab..982b61a287 100644 --- a/lily/text-engraver.cc +++ b/lily/text-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,8 @@ #include "directional-element-interface.hh" #include "engraver.hh" #include "item.hh" +#include "note-column.hh" +#include "pointer-group-interface.hh" #include "side-position-interface.hh" #include "stream-event.hh" #include "text-interface.hh" @@ -29,19 +31,21 @@ /** typeset directions that are plain text. */ + class Text_engraver : public Engraver { vector evs_; + vector scripts_; public: TRANSLATOR_DECLARATIONS (Text_engraver); protected: void stop_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (text_script); + void acknowledge_note_column (Grob_info); + void listen_text_script (Stream_event *); }; -IMPLEMENT_TRANSLATOR_LISTENER (Text_engraver, text_script); void Text_engraver::listen_text_script (Stream_event *ev) { @@ -53,26 +57,44 @@ Text_engraver::process_music () { for (vsize i = 0; i < evs_.size (); i++) { - Stream_event *r = evs_[i]; + Stream_event *ev = evs_[i]; - // URG: Text vs TextScript - Item *text = make_item ("TextScript", r->self_scm ()); + Item *script = make_item ("TextScript", ev->self_scm ()); + scripts_.push_back (script); - int priority = robust_scm2int (text->get_property ("script-priority"), + int priority = robust_scm2int (script->get_property ("script-priority"), 200); /* see script-engraver.cc */ priority += i; - text->set_property ("script-priority", scm_from_int (priority)); + script->set_property ("script-priority", scm_from_int (priority)); - Direction dir = to_dir (r->get_property ("direction")); + Direction dir = to_dir (ev->get_property ("direction")); if (dir) - set_grob_direction (text, dir); + set_grob_direction (script, dir); + + SCM mark = ev->get_property ("text"); + + script->set_property ("text", mark); + } +} + +void +Text_engraver::acknowledge_note_column (Grob_info info) +{ + // Make note column (or rest, if there are no heads) the parent of the script. + extract_grob_set (info.grob (), "note-heads", heads); + Grob *x_parent = (heads.size () + ? info.grob () + : unsmob (info.grob ()->get_object ("rest"))); - SCM mark = r->get_property ("text"); + for (vsize i = 0; i < scripts_.size (); i++) + { + Grob *el = scripts_[i]; - text->set_property ("text", mark); + if (el && !el->get_parent (X_AXIS) && x_parent) + el->set_parent (x_parent, X_AXIS); } } @@ -80,12 +102,21 @@ void Text_engraver::stop_translation_timestep () { evs_.clear (); + scripts_.clear (); } Text_engraver::Text_engraver () { } + +void +Text_engraver::boot () +{ + ADD_LISTENER (Text_engraver, text_script); + ADD_ACKNOWLEDGER (Text_engraver, note_column); +} + ADD_TRANSLATOR (Text_engraver, /* doc */ "Create text scripts.", diff --git a/lily/text-interface.cc b/lily/text-interface.cc index c406beaab5..4598246163 100644 --- a/lily/text-interface.cc +++ b/lily/text-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -33,6 +33,7 @@ #include "program-option.hh" #include "international.hh" #include "warn.hh" +#include "lily-imports.hh" static void replace_special_characters (string &str, SCM props) @@ -76,7 +77,7 @@ Text_interface::interpret_string (SCM layout_smob, LY_ASSERT_TYPE (scm_is_string, markup, 3); string str = ly_scm2string (markup); - Output_def *layout = unsmob_output_def (layout_smob); + Output_def *layout = unsmob (layout_smob); Font_metric *fm = select_encoded_font (layout, props); replace_special_characters (str, props); @@ -89,12 +90,17 @@ Text_interface::interpret_string (SCM layout_smob, SCM encoding = ly_chain_assoc_get (ly_symbol2scm ("font-encoding"), props, SCM_BOOL_F); - SCM music_encodings = ly_lily_module_constant ("all-music-font-encodings"); + SCM music_encodings = Lily::all_music_font_encodings; - bool is_music = (scm_memq (encoding, music_encodings) != SCM_BOOL_F); + bool is_music = scm_is_true (scm_memq (encoding, music_encodings)); return fm->text_stencil (layout, str, is_music).smobbed_copy (); } +static size_t markup_depth = 0; + +void markup_up_depth (void *) { ++markup_depth; } +void markup_down_depth (void *) { --markup_depth; } + MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Text_interface, interpret_markup, 3, 0, "Convert a text markup into a stencil." " Takes three arguments, @var{layout}, @var{props}, and @var{markup}.\n" @@ -114,28 +120,19 @@ Text_interface::interpret_markup (SCM layout_smob, SCM props, SCM markup) SCM func = scm_car (markup); SCM args = scm_cdr (markup); - /* Use a hare/tortoise algorithm to detect whether we are in a cycle, - * i.e. whether we have already encountered the same markup in the - * current branch of the markup tree structure. */ - static vector encountered_markups; - size_t depth = encountered_markups.size (); - if (depth > 0) - { - int slow = depth / 2; - if (ly_is_equal (encountered_markups[slow], markup)) - { - string name = ly_symbol2string (scm_procedure_name (func)); - // TODO: Also print the arguments of the markup! - non_fatal_error (_f ("Cyclic markup detected: %s", name)); - return Stencil ().smobbed_copy (); - } - } - /* Check for non-terminating markups, e.g. recursive calls with * changing arguments */ SCM opt_depth = ly_get_option (ly_symbol2scm ("max-markup-depth")); size_t max_depth = robust_scm2int (opt_depth, 1024); - if (depth > max_depth) + + // Don't use SCM_F_DYNWIND_REWINDABLE since it may be expensive + // without any obvious use for retaining continuations into + // markup expansion + scm_dynwind_begin ((scm_t_dynwind_flags)0); + // scm_dynwind_rewind_handler (markup_up_depth, 0, SCM_F_WIND_EXPLICITLY); + markup_up_depth (0); + scm_dynwind_unwind_handler (markup_down_depth, 0, SCM_F_WIND_EXPLICITLY); + if (markup_depth > max_depth) { string name = ly_symbol2string (scm_procedure_name (func)); // TODO: Also print the arguments of the markup! @@ -144,9 +141,8 @@ Text_interface::interpret_markup (SCM layout_smob, SCM props, SCM markup) return Stencil ().smobbed_copy (); } - encountered_markups.push_back (markup); SCM retval = scm_apply_2 (func, layout_smob, props, args); - encountered_markups.pop_back (); + scm_dynwind_end (); return retval; } else @@ -164,7 +160,7 @@ MAKE_SCHEME_CALLBACK (Text_interface, print, 1); SCM Text_interface::print (SCM grob) { - Grob *me = unsmob_grob (grob); + Grob *me = unsmob (grob); SCM t = me->get_property ("text"); SCM chain = Font_interface::text_font_alist_chain (me); @@ -188,8 +184,7 @@ Text_interface::is_markup (SCM x) bool Text_interface::is_markup_list (SCM x) { - SCM music_list_p = ly_lily_module_constant ("markup-list?"); - return scm_is_true (scm_call_1 (music_list_p, x)); + return scm_is_true (Lily::markup_list_p (x)); } ADD_INTERFACE (Text_interface, @@ -207,5 +202,6 @@ ADD_INTERFACE (Text_interface, "text " "word-space " "text-direction " + "flag-style " ); diff --git a/lily/text-spanner-engraver.cc b/lily/text-spanner-engraver.cc index f4dc2de070..f63e19a059 100644 --- a/lily/text-spanner-engraver.cc +++ b/lily/text-spanner-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,8 +34,8 @@ public: TRANSLATOR_DECLARATIONS (Text_spanner_engraver); protected: virtual void finalize (); - DECLARE_TRANSLATOR_LISTENER (text_span); - DECLARE_ACKNOWLEDGER (note_column); + void listen_text_span (Stream_event *); + void acknowledge_note_column (Grob_info); void stop_translation_timestep (); void process_music (); @@ -55,7 +55,6 @@ Text_spanner_engraver::Text_spanner_engraver () event_drul_.set (0, 0); } -IMPLEMENT_TRANSLATOR_LISTENER (Text_spanner_engraver, text_span); void Text_spanner_engraver::listen_text_span (Stream_event *ev) { @@ -87,6 +86,8 @@ Text_spanner_engraver::process_music () { current_event_ = event_drul_[START]; span_ = make_spanner ("TextSpanner", event_drul_[START]->self_scm ()); + if (Direction d = to_dir (current_event_->get_property ("direction"))) + span_->set_property ("direction", scm_from_int (d)); Side_position_interface::set_axis (span_, Y_AXIS); event_drul_[START] = 0; @@ -101,7 +102,7 @@ Text_spanner_engraver::typeset_all () { if (!finished_->get_bound (RIGHT)) { - Grob *e = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *e = unsmob (get_property ("currentMusicalColumn")); finished_->set_bound (RIGHT, e); } finished_ = 0; @@ -113,7 +114,7 @@ Text_spanner_engraver::stop_translation_timestep () { if (span_ && !span_->get_bound (LEFT)) { - Grob *e = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *e = unsmob (get_property ("currentMusicalColumn")); span_->set_bound (LEFT, e); } @@ -154,7 +155,13 @@ Text_spanner_engraver::acknowledge_note_column (Grob_info info) } } -ADD_ACKNOWLEDGER (Text_spanner_engraver, note_column); + +void +Text_spanner_engraver::boot () +{ + ADD_LISTENER (Text_spanner_engraver, text_span); + ADD_ACKNOWLEDGER (Text_spanner_engraver, note_column); +} ADD_TRANSLATOR (Text_spanner_engraver, /* doc */ diff --git a/lily/tie-column.cc b/lily/tie-column.cc index 7bc35584c5..5f111a8581 100644 --- a/lily/tie-column.cc +++ b/lily/tie-column.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,12 +35,12 @@ using namespace std; void -Tie_column::add_tie (Grob *tc, Grob *tie) +Tie_column::add_tie (Grob *tc, Spanner *tie) { Spanner *me = dynamic_cast (tc); if (tie->get_parent (Y_AXIS) - && Tie_column::has_interface (tie->get_parent (Y_AXIS))) + && has_interface (tie->get_parent (Y_AXIS))) return; if (!me->get_bound (LEFT) @@ -62,10 +62,10 @@ MAKE_SCHEME_CALLBACK (Tie_column, before_line_breaking, 1); SCM Tie_column::before_line_breaking (SCM smob) { - Spanner *me = dynamic_cast (unsmob_grob (smob)); + Spanner *me = unsmob (smob); for (SCM s = me->get_property ("ties"); scm_is_pair (s); s = scm_cdr (s)) { - Spanner *tie = dynamic_cast (unsmob_grob (scm_car (s))); + Spanner *tie = unsmob (scm_car (s)); for (LEFT_and_RIGHT (dir)) { if (dir * tie->get_bound (dir)->get_column ()->get_rank () @@ -81,7 +81,7 @@ MAKE_SCHEME_CALLBACK (Tie_column, calc_positioning_done, 1) SCM Tie_column::calc_positioning_done (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "ties", ro_ties); vector ties (ro_ties); if (!ties.size ()) diff --git a/lily/tie-configuration.cc b/lily/tie-configuration.cc index 19bcbd822c..19a2c68f72 100644 --- a/lily/tie-configuration.cc +++ b/lily/tie-configuration.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -170,7 +170,7 @@ 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)[i].card () + tie_card (i); /* this is a little awkward, but we must decide where to put diff --git a/lily/tie-details.cc b/lily/tie-details.cc index a13533a6aa..c774c4e45e 100644 --- a/lily/tie-details.cc +++ b/lily/tie-details.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc index 637a73ef32..2a016b31be 100644 --- a/lily/tie-engraver.cc +++ b/lily/tie-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ #include "international.hh" #include "item.hh" #include "note-head.hh" +#include "pitch.hh" #include "protected-scm.hh" #include "spanner.hh" #include "staff-symbol-referencer.hh" @@ -74,18 +75,19 @@ class Tie_engraver : public Engraver Stream_event *event_; vector now_heads_; vector heads_to_tie_; - vector ties_; + vector ties_; Spanner *tie_column_; + bool tie_notehead (Grob *h, bool enharmonic); protected: void process_acknowledged (); void stop_translation_timestep (); void start_translation_timestep (); - DECLARE_ACKNOWLEDGER (note_head); - DECLARE_TRANSLATOR_LISTENER (tie); + void acknowledge_note_head (Grob_info); + void listen_tie (Stream_event *); void process_music (); - void typeset_tie (Grob *); + void typeset_tie (Spanner *); void report_unterminated_tie (Head_event_tuple const &); bool has_autosplit_end (Stream_event *event); public: @@ -99,7 +101,6 @@ Tie_engraver::Tie_engraver () event_processed_ = false; } -IMPLEMENT_TRANSLATOR_LISTENER (Tie_engraver, tie); void Tie_engraver::listen_tie (Stream_event *ev) { @@ -145,17 +146,16 @@ Tie_engraver::process_music () context ()->set_property ("tieMelismaBusy", SCM_BOOL_T); } -void -Tie_engraver::acknowledge_note_head (Grob_info i) +bool +Tie_engraver::tie_notehead (Grob *h, bool enharmonic) { - Grob *h = i.grob (); + bool found = false; - now_heads_.push_back (h); - for (vsize i = heads_to_tie_.size (); i--;) + for (vsize i = 0; i < heads_to_tie_.size (); i++) { Grob *th = heads_to_tie_[i].head_; - Stream_event *right_ev = unsmob_stream_event (h->get_property ("cause")); - Stream_event *left_ev = unsmob_stream_event (th->get_property ("cause")); + Stream_event *right_ev = unsmob (h->get_property ("cause")); + Stream_event *left_ev = unsmob (th->get_property ("cause")); /* maybe should check positions too. @@ -167,10 +167,15 @@ Tie_engraver::acknowledge_note_head (Grob_info i) Make a tie only if pitches are equal or if event end was not generated by Completion_heads_engraver. */ - if (ly_is_equal (right_ev->get_property ("pitch"), left_ev->get_property ("pitch")) + SCM p1 = left_ev->get_property ("pitch"); + SCM p2 = right_ev->get_property ("pitch"); + if ((enharmonic + ? (unsmob (p1) && unsmob (p2) && + unsmob (p1)->tone_pitch () == unsmob (p2)->tone_pitch ()) + : ly_is_equal (p1, p2)) && (!Tie_engraver::has_autosplit_end (left_ev))) { - Grob *p = heads_to_tie_[i].tie_; + Spanner *p = heads_to_tie_[i].tie_; Moment end = heads_to_tie_[i].end_moment_; Stream_event *cause = heads_to_tie_[i].tie_event_ @@ -191,6 +196,7 @@ Tie_engraver::acknowledge_note_head (Grob_info i) ties_.push_back (p); heads_to_tie_.erase (heads_to_tie_.begin () + i); + found = true; /* Prevent all other tied notes ending at the same moment (assume implicitly the notes have also started at the same moment!) @@ -202,14 +208,27 @@ Tie_engraver::acknowledge_note_head (Grob_info i) if (heads_to_tie_[j].end_moment_ == end) heads_to_tie_[j].tie_from_chord_created = true; } + break; } } + return found; +} + +void +Tie_engraver::acknowledge_note_head (Grob_info i) +{ + Grob *h = i.grob (); + + now_heads_.push_back (h); + + if (!tie_notehead (h, false)) + tie_notehead (h, true); if (ties_.size () && ! tie_column_) tie_column_ = make_spanner ("TieColumn", ties_[0]->self_scm ()); if (tie_column_) - for (vsize i = ties_.size (); i--;) + for (vsize i = 0; i < ties_.size (); i++) Tie_column::add_tie (tie_column_, ties_[i]); } @@ -261,7 +280,7 @@ Tie_engraver::process_acknowledged () { Grob *head = now_heads_[i]; Stream_event *left_ev - = unsmob_stream_event (head->get_property ("cause")); + = unsmob (head->get_property ("cause")); if (!left_ev) { @@ -281,7 +300,7 @@ Tie_engraver::process_acknowledged () !tie_event && !tie_stream_event && scm_is_pair (s); s = scm_cdr (s)) { - Stream_event *ev = unsmob_stream_event (scm_car (s)); + Stream_event *ev = unsmob (scm_car (s)); if (!ev) continue; @@ -347,26 +366,31 @@ Tie_engraver::stop_translation_timestep () } void -Tie_engraver::typeset_tie (Grob *her) +Tie_engraver::typeset_tie (Spanner *her) { - if (! (Tie::head (her, LEFT) && Tie::head (her, RIGHT))) - warning (_ ("lonely tie")); + Grob *left_head = Tie::head (her, LEFT); + Grob *right_head = Tie::head (her, RIGHT); - Drul_array new_head_drul; - new_head_drul[LEFT] = Tie::head (her, LEFT); - new_head_drul[RIGHT] = Tie::head (her, RIGHT); - for (LEFT_and_RIGHT (d)) + if (!left_head || !right_head) { - if (!Tie::head (her, d)) - new_head_drul[d] = Tie::head (her, (Direction) - d); + warning (_ ("lonely tie")); + if (!left_head) + left_head = right_head; + else + right_head = left_head; } - Spanner *sp = dynamic_cast (her); - sp->set_bound (LEFT, new_head_drul[LEFT]); - sp->set_bound (RIGHT, new_head_drul[RIGHT]); + her->set_bound (LEFT, left_head); + her->set_bound (RIGHT, right_head); +} + +void +Tie_engraver::boot () +{ + ADD_LISTENER (Tie_engraver, tie); + ADD_ACKNOWLEDGER (Tie_engraver, note_head); } -ADD_ACKNOWLEDGER (Tie_engraver, note_head); ADD_TRANSLATOR (Tie_engraver, /* doc */ "Generate ties between note heads of equal pitch.", diff --git a/lily/tie-formatting-problem.cc b/lily/tie-formatting-problem.cc index 304e4b3b2a..905718469c 100644 --- a/lily/tie-formatting-problem.cc +++ b/lily/tie-formatting-problem.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -29,6 +29,7 @@ #include "misc.hh" #include "note-head.hh" #include "rhythmic-head.hh" +#include "semi-tie.hh" #include "spanner.hh" #include "staff-symbol-referencer.hh" #include "stem.hh" @@ -98,11 +99,11 @@ Tie_formatting_problem::set_column_chord_outline (vector bounds, for (vsize i = 0; i < bounds.size (); i++) { Grob *head = bounds[i]; - if (!Note_head::has_interface (head)) + if (!has_interface (head)) continue; if (!stem) - stem = unsmob_grob (head->get_object ("stem")); + stem = unsmob (head->get_object ("stem")); Real p = Staff_symbol_referencer::get_position (head); Interval y ((p - 1) * 0.5 * staff_space, @@ -151,7 +152,7 @@ Tie_formatting_problem::set_column_chord_outline (vector bounds, stem_end_position = stem->extent (stem, Y_AXIS)[get_grob_direction (stem)]; else // May want to change this to the stem's pure height... - stem_end_position = Stem::note_head_positions (stem)[get_grob_direction (stem)] + stem_end_position = Stem::head_positions (stem)[get_grob_direction (stem)] * staff_space * .5; } @@ -211,9 +212,9 @@ Tie_formatting_problem::set_column_chord_outline (vector bounds, boxes.push_back (Box (x, y)); } - Grob *acc = unsmob_grob (heads[i]->get_object ("accidental-grob")); + Grob *acc = unsmob (heads[i]->get_object ("accidental-grob")); if (acc) - acc->get_property ("stencil"); /* trigger tie-related suicide */ + acc->get_property ("after-line-breaking"); /* trigger tie-related suicide */ if (acc && acc->is_live () && dir == RIGHT) { @@ -342,7 +343,8 @@ 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); + Spanner *tie = dynamic_cast (ties[i]); + Item *it = tie->get_bound (d); if (it->break_status_dir ()) it = it->get_column (); @@ -354,13 +356,14 @@ Tie_formatting_problem::from_ties (vector const &ties) for (vsize i = 0; i < ties.size (); i++) { + Spanner *tie = dynamic_cast (ties[i]); Tie_specification spec; - spec.from_grob (ties[i]); + spec.from_grob (tie); for (LEFT_and_RIGHT (d)) { - spec.note_head_drul_[d] = Tie::head (ties[i], d); - spec.column_ranks_[d] = Tie::get_column_rank (ties[i], d); + spec.note_head_drul_[d] = Tie::head (tie, d); + spec.column_ranks_[d] = Tie::get_column_rank (tie, d); } specifications_.push_back (spec); } @@ -379,8 +382,9 @@ Tie_formatting_problem::from_semi_ties (vector const &semi_ties, Directi int column_rank = -1; for (vsize i = 0; i < semi_ties.size (); i++) { + Item *semi_tie = dynamic_cast (semi_ties[i]); Tie_specification spec; - Item *head = unsmob_item (semi_ties[i]->get_object ("note-head")); + Item *head = Semi_tie::head (semi_tie); if (!head) programming_error ("LV tie without head?!"); @@ -390,10 +394,10 @@ Tie_formatting_problem::from_semi_ties (vector const &semi_ties, Directi spec.position_ = int (Staff_symbol_referencer::get_position (head)); } - spec.from_grob (semi_ties[i]); + spec.from_grob (semi_tie); spec.note_head_drul_[head_dir] = head; - column_rank = Tie::get_column_rank (semi_ties[i], head_dir); + column_rank = Semi_tie::get_column_rank (semi_tie); spec.column_ranks_ = Drul_array (column_rank, column_rank); heads.push_back (head); specifications_.push_back (spec); @@ -655,7 +659,7 @@ Tie_formatting_problem::score_aptitude (Tie_configuration *conf, if (!spec.note_head_drul_[d]) continue; - Grob *stem = unsmob_grob (spec.note_head_drul_[d]->get_object ("stem")); + Grob *stem = unsmob (spec.note_head_drul_[d]->get_object ("stem")); if (stem && Stem::is_normal_stem (stem)) stems[d] = stem; @@ -1200,7 +1204,8 @@ 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); + /* TODO: check whether inexact? is an appropriate condition here */ + spec.has_manual_delta_y_ = (scm_is_true (scm_inexact_p (scm_car (entry)))); } if (scm_is_number (scm_cdr (entry))) diff --git a/lily/tie-performer.cc b/lily/tie-performer.cc index 9ef199ddff..e93b3e6b0c 100644 --- a/lily/tie-performer.cc +++ b/lily/tie-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -51,7 +51,7 @@ protected: void start_translation_timestep (); virtual void acknowledge_audio_element (Audio_element_info); void process_music (); - DECLARE_TRANSLATOR_LISTENER (tie); + void listen_tie (Stream_event *); public: TRANSLATOR_DECLARATIONS (Tie_performer); }; @@ -61,7 +61,6 @@ Tie_performer::Tie_performer () event_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Tie_performer, tie); void Tie_performer::listen_tie (Stream_event *ev) { @@ -113,6 +112,31 @@ Tie_performer::acknowledge_audio_element (Audio_element_info inf) it = heads_to_tie_.erase (it); } } + if (found) + return; + for (it = heads_to_tie_.begin (); + !found && (it != heads_to_tie_.end ()); + it++) + { + Audio_element_info et = (*it).head_; + Audio_note *th = dynamic_cast (et.elem_); + Stream_event *left_mus = et.event_; + + if (!(th && right_mus && left_mus)) + continue; + + SCM p1 = left_mus->get_property ("pitch"); + SCM p2 = right_mus->get_property ("pitch"); + if (unsmob (p1) && unsmob (p2) + && unsmob (p1)->tone_pitch () == unsmob (p2)->tone_pitch ()) + { + found = true; + // (*it).moment_ already stores the end of the tied note! + Moment skip = now_mom () - (*it).end_moment_; + an->tie_to (th, skip); + it = heads_to_tie_.erase (it); + } + } } } @@ -159,6 +183,12 @@ Tie_performer::stop_translation_timestep () now_tied_heads_.clear (); } +void +Tie_performer::boot () +{ + ADD_LISTENER (Tie_performer, tie); +} + ADD_TRANSLATOR (Tie_performer, /* doc */ "Generate ties between note heads of equal pitch.", diff --git a/lily/tie-specification.cc b/lily/tie-specification.cc index 0413495713..f404ad597c 100644 --- a/lily/tie-specification.cc +++ b/lily/tie-specification.cc @@ -1,5 +1,8 @@ #include "tie-formatting-problem.hh" #include "grob.hh" +#include "item.hh" +#include "semi-tie.hh" +#include "spanner.hh" #include "tie.hh" #include "libc-extension.hh" #include "tie-specification.hh" @@ -22,6 +25,8 @@ Tie_specification::Tie_specification () void Tie_specification::from_grob (Grob *tie) { + // In this method, Tie and Semi_tie require the same logic with different + // types. It might be clearer to use a template. tie_grob_ = tie; if (scm_is_number (tie->get_property_data ("direction"))) { @@ -29,11 +34,20 @@ Tie_specification::from_grob (Grob *tie) has_manual_dir_ = true; } - position_ = Tie::get_position (tie); + if (Spanner *spanner = dynamic_cast (tie)) + position_ = Tie::get_position (spanner); + else if (Item *item = dynamic_cast (tie)) + position_ = Semi_tie::get_position (item); + else + { + programming_error ("grob is neither a tie nor a semi-tie"); + position_ = 0; + } + 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); + has_manual_delta_y_ = !ly_is_rational (pos_scm); manual_position_ = scm_to_double (tie->get_property ("staff-position")); has_manual_position_ = true; } diff --git a/lily/tie.cc b/lily/tie.cc index 23e8d4c7da..dcc53ad44e 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +30,7 @@ #include "paper-column.hh" #include "pointer-group-interface.hh" #include "rhythmic-head.hh" +#include "semi-tie.hh" #include "spanner.hh" #include "staff-symbol-referencer.hh" #include "stem.hh" @@ -41,56 +42,46 @@ #include "semi-tie-column.hh" bool -Tie::less (Grob *const &s1, Grob *const &s2) +Tie::less (Grob *g1, Grob *g2) { - return Tie::get_position (s1) < Tie::get_position (s2); + Spanner *s1 = dynamic_cast (g1); + if (!s1) + { + g1->programming_error ("grob is not a tie"); + return false; + } + + Spanner *s2 = dynamic_cast (g2); + if (!s2) + { + g2->programming_error ("grob is not a tie"); + return true; + } + + return get_position (s1) < get_position (s2); } void -Tie::set_head (Grob *me, Direction d, Grob *h) +Tie::set_head (Spanner *me, Direction d, Grob *h) { - dynamic_cast (me)->set_bound (d, h); + me->set_bound (d, h); } -Grob * -Tie::head (Grob *me, Direction d) +Item * +Tie::head (Spanner *me, Direction d) { - if (is_direction (me->get_property ("head-direction"))) - { - Direction hd = to_dir (me->get_property ("head-direction")); - - return (hd == d) - ? unsmob_grob (me->get_object ("note-head")) - : 0; - } - - Item *it = dynamic_cast (me)->get_bound (d); - if (Note_head::has_interface (it)) - return it; - else - return 0; + Item *it = me->get_bound (d); + return has_interface (it) ? it : 0; } int -Tie::get_column_rank (Grob *me, Direction d) +Tie::get_column_rank (Spanner *me, Direction d) { - Grob *col = 0; - Spanner *span = dynamic_cast (me); - if (!span) - col = dynamic_cast (me)->get_column (); - else - { - Grob *h = head (me, d); - if (!h) - h = span->get_bound (d); - - col = dynamic_cast (h)->get_column (); - } - return Paper_column::get_rank (col); + return Paper_column::get_rank (me->get_bound (d)->get_column ()); } int -Tie::get_position (Grob *me) +Tie::get_position (Spanner *me) { for (LEFT_and_RIGHT (d)) { @@ -120,20 +111,17 @@ Tie::get_position (Grob *me) (what about linebreaks? ) */ Direction -Tie::get_default_dir (Grob *me) +Tie::get_default_dir (Spanner *me) { Drul_array stems; for (LEFT_and_RIGHT (d)) { Grob *one_head = head (me, d); - if (!one_head && dynamic_cast (me)) - one_head = Tie::head (dynamic_cast (me)->broken_neighbor (d), d); + if (!one_head) + one_head = head (me->broken_neighbor (d), d); Grob *stem = one_head ? Rhythmic_head::get_stem (one_head) : 0; - if (stem) - stem = Stem::is_invisible (stem) ? 0 : stem; - - stems[d] = stem; + stems[d] = (stem && !Stem::is_invisible (stem)) ? stem : 0; } if (stems[LEFT] && stems[RIGHT]) @@ -141,12 +129,16 @@ Tie::get_default_dir (Grob *me) if (get_grob_direction (stems[LEFT]) == UP && get_grob_direction (stems[RIGHT]) == UP) return DOWN; + + // And why not return UP if both stems are DOWN? + + // And when stems conflict, why fall directly through to using + // neutral-direction without considering get_position (me)? } - else if (stems[LEFT] || stems[RIGHT]) - { - Grob *s = stems[LEFT] ? stems[LEFT] : stems[RIGHT]; - return -get_grob_direction (s); - } + else if (stems[LEFT]) + return -get_grob_direction (stems[LEFT]); + else if (stems[RIGHT]) + return -get_grob_direction (stems[RIGHT]); else if (int p = get_position (me)) return Direction (sign (p)); @@ -157,12 +149,14 @@ MAKE_SCHEME_CALLBACK (Tie, calc_direction, 1); SCM Tie::calc_direction (SCM smob) { - Grob *me = unsmob_grob (smob); + // In this method, Tie and Semi_tie require the same logic with different + // types. It might be clearer to use a template. + Grob *me = unsmob (smob); 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 + if ((has_interface (yparent) + || has_interface (yparent)) + && unsmob (yparent->get_object ("ties")) + // && unsmob (yparent->get_object ("ties"))->size () > 1 ) { /* trigger positioning. */ @@ -170,14 +164,15 @@ Tie::calc_direction (SCM smob) return me->get_property_data ("direction"); } - else - return scm_from_int (Tie::get_default_dir (me)); + + programming_error ("no Tie_column or Semi_tie_column. Killing grob."); + me->suicide (); + return scm_from_int (CENTER); } SCM -Tie::get_default_control_points (Grob *me_grob) +Tie::get_default_control_points (Spanner *me) { - Spanner *me = dynamic_cast (me_grob); Grob *common = me; common = me->get_bound (LEFT)->common_refpoint (common, X_AXIS); common = me->get_bound (RIGHT)->common_refpoint (common, X_AXIS); @@ -218,12 +213,12 @@ MAKE_SCHEME_CALLBACK (Tie, calc_control_points, 1); SCM Tie::calc_control_points (SCM smob) { - Grob *me = unsmob_grob (smob); + Spanner *me = LY_ASSERT_SMOB(Spanner, smob, 1); 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"))) + if ((has_interface (yparent) + || has_interface (yparent)) + && unsmob (yparent->get_object ("ties"))) { extract_grob_set (yparent, "ties", ties); if (me->original () && ties.size () == 1 @@ -250,7 +245,7 @@ MAKE_SCHEME_CALLBACK (Tie, print, 1); SCM Tie::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); SCM cp = me->get_property ("control-points"); @@ -281,7 +276,7 @@ Tie::print (SCM smob) string str; SCM properties = Font_interface::text_font_alist_chain (me); - Stencil tm = *unsmob_stencil (Text_interface::interpret_markup + Stencil tm = *unsmob (Text_interface::interpret_markup (me->layout ()->self_scm (), properties, annotation)); tm.translate (Offset (b.control_[3][X_AXIS] + 0.5, @@ -300,7 +295,101 @@ Tie::print (SCM smob) } ADD_INTERFACE (Tie, - "A horizontal curve connecting two noteheads.", + "A tie - a horizontal curve connecting two noteheads.\n" + "\n" + "The following properties may be set in the @code{details}" + " list.\n" + "\n" + "@table @code\n" + "@item height-limit\n" + "The maximum height allowed for this tie.\n" + "@item ratio\n" + "Parameter for tie shape. The higher this number, the" + " quicker the slur attains its height-limit.\n" + "@item between-length-limit\n" + "This detail is currently unused.\n" + "@item wrong-direction-offset-penalty\n" + "Demerit for ties that are offset in the wrong" + " direction.\n" + "@item min-length\n" + "If the tie is shorter than this amount (in" + " staff-spaces) an increasingly large length penalty is" + " incurred.\n" + "@item min-length-penalty-factor\n" + "Demerit factor for tie lengths shorter than" + " @code{min-length}.\n" + "@item center-staff-line-clearance\n" + "If the center of the tie is closer to a staff line" + " than this amount, an increasingly large staff line" + " collision penalty is incurred.\n" + "@item tip-staff-line-clearance\n" + "If the tips of the tie are closer to a staff line" + " than this amount, an increasingly large staff line" + " collision penalty is incurred.\n" + "@item staff-line-collision-penalty\n" + "Demerit factor for ties whose tips or center come" + " close to staff lines.\n" + "@item dot-collision-clearance\n" + "If the tie comes closer to a dot than this amount, an" + " increasingly large dot collision penalty is incurred.\n" + "@item dot-collision-penalty\n" + "Demerit factor for ties which come close to dots.\n" + "@item note-head-gap\n" + "The distance (in staff-spaces) by which the ends of" + " the tie are offset horizontally from the center" + " line through the note head.\n" + "@item stem-gap\n" + "The distance (in staff-spaces) by which the ends of" + " the tie are offset horizontally from a stem which" + " is on the same side of the note head as the tie.\n" + "@item tie-column-monotonicity-penalty\n" + "Demerit if the y-position of this tie in the set of" + " ties being considered is less than the y-position" + " of the previous tie.\n" + "@item tie-tie-collision-distance\n" + "If this tie is closer than this amount to the previous" + " tie in the set being considered, an increasingly" + " large tie-tie collision penalty is incurred.\n" + "@item tie-tie-collision-penalty\n" + "Demerit factor for a tie in the set being considered" + " which is close to the previous one.\n" + "@item horizontal-distance-penalty-factor\n" + "Demerit factor for ties in the set being considered" + " which are horizontally distant from the note heads.\n" + "@item vertical-distance-penalty-factor\n" + "Demerit factor for ties in the set being considered" + " which are vertically distant from the note heads.\n" + "@item same-dir-as-stem-penalty\n" + "Demerit if tie is on the same side as a stem or on the" + " opposite side to the one specified.\n" + "@item intra-space-threshold\n" + "If the tie's height (in half staff-spaces) is less than" + " this it is positioned between two adjacent staff" + " lines; otherwise it is positioned to straddle a staff" + " line further from the note heads.\n" + "@item outer-tie-length-symmetry-penalty-factor\n" + "Demerit factor for ties horizontally positioned" + " unsymmetrically with respect to the two note heads.\n" + "@item outer-tie-vertical-distance-symmetry-penalty-factor\n" + "Demerit factor for ties vertically positioned" + " unsymmetrically with respect to the two note heads.\n" + "@item outer-tie-vertical-gap\n" + "Amount (in half staff-spaces) by which a tie is moved" + " away from the note heads if it is closer to either" + " of them than 0.25 half staff-spaces.\n" + "@item skyline-padding\n" + "Padding of the skylines around note heads in chords.\n" + "@item single-tie-region-size\n" + "The number of candidate ties to generate when only a" + " single tie is required. Successive candidates differ" + " in their initial vertical position by half a" + " staff-space.\n" + "@item multi-tie-region-size\n" + "The number of variations that are tried for the" + " extremal ties in a chord. Variations differ in their" + " initial vertical position by half a staff-space.\n" + + "@end table\n", /* properties */ "annotation " diff --git a/lily/time-signature-engraver.cc b/lily/time-signature-engraver.cc index 1c6cd69bd4..d57b35bf6e 100644 --- a/lily/time-signature-engraver.cc +++ b/lily/time-signature-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,9 +22,12 @@ #include "item.hh" #include "international.hh" #include "misc.hh" -#include "time-signature.hh" +#include "moment.hh" +#include "stream-event.hh" #include "warn.hh" +#include "translator.icc" + /** generate time_signatures. */ @@ -32,6 +35,7 @@ class Time_signature_engraver : public Engraver { Item *time_signature_; SCM last_time_fraction_; + SCM time_cause_; protected: virtual void derived_mark () const; @@ -39,31 +43,46 @@ protected: void process_music (); public: TRANSLATOR_DECLARATIONS (Time_signature_engraver); + void listen_time_signature (Stream_event *); }; void Time_signature_engraver::derived_mark () const { scm_gc_mark (last_time_fraction_); + scm_gc_mark (time_cause_); } Time_signature_engraver::Time_signature_engraver () { time_signature_ = 0; + time_cause_ = SCM_EOL; last_time_fraction_ = SCM_BOOL_F; } +void +Time_signature_engraver::listen_time_signature (Stream_event *ev) +{ + time_cause_ = ev->self_scm (); +} + void Time_signature_engraver::process_music () { - /* - not rigorously safe, since the value might get GC'd and - reallocated in the same spot */ + if (time_signature_) + return; + SCM fr = get_property ("timeSignatureFraction"); - if (!time_signature_ - && last_time_fraction_ != fr + if (last_time_fraction_ != fr && scm_is_pair (fr)) { + time_signature_ = make_item ("TimeSignature", time_cause_); + time_signature_->set_property ("fraction", fr); + + if (scm_is_false (last_time_fraction_)) + time_signature_->set_property ("break-visibility", + get_property ("initialTimeSignatureVisibility")); + int den = scm_to_int (scm_cdr (fr)); if (den != (1 << intlog2 (den))) { @@ -72,18 +91,11 @@ Time_signature_engraver::process_music () OTOH, Tristan Keuris writes 8/20 in his Intermezzi. */ - warning (_f ("strange time signature found: %d/%d", - int (scm_to_int (scm_car (fr))), - den)); + time_signature_->warning (_f ("strange time signature found: %d/%d", + int (scm_to_int (scm_car (fr))), + den)); } - 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; } } @@ -91,10 +103,23 @@ Time_signature_engraver::process_music () void Time_signature_engraver::stop_translation_timestep () { + if (time_signature_ && !scm_is_null (time_cause_)) + { + Moment *mp = unsmob (get_property ("measurePosition")); + if (mp && (mp->main_part_ > Rational (0)) + && !to_boolean (get_property ("partialBusy"))) + time_signature_->warning ("mid-measure time signature without \\partial"); + } + time_signature_ = 0; + time_cause_ = SCM_EOL; } -#include "translator.icc" +void +Time_signature_engraver::boot () +{ + ADD_LISTENER (Time_signature_engraver, time_signature); +} ADD_TRANSLATOR (Time_signature_engraver, /* doc */ @@ -105,7 +130,8 @@ ADD_TRANSLATOR (Time_signature_engraver, "TimeSignature ", /* read */ - "implicitTimeSignatureVisibility " + "initialTimeSignatureVisibility " + "partialBusy " "timeSignatureFraction ", /* write */ diff --git a/lily/time-signature-performer.cc b/lily/time-signature-performer.cc index f2f3e8f32a..3a3bbd2ca3 100644 --- a/lily/time-signature-performer.cc +++ b/lily/time-signature-performer.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -81,6 +81,12 @@ Time_signature_performer::stop_translation_timestep () #include "translator.icc" +void +Time_signature_performer::boot () +{ + +} + ADD_TRANSLATOR (Time_signature_performer, /* doc */ "", diff --git a/lily/time-signature.cc b/lily/time-signature.cc deleted file mode 100644 index 89f20278bf..0000000000 --- a/lily/time-signature.cc +++ /dev/null @@ -1,156 +0,0 @@ -/* - This file is part of LilyPond, the GNU music typesetter. - - Copyright (C) 1996--2012 Han-Wen Nienhuys - - LilyPond is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - LilyPond is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LilyPond. If not, see . -*/ - -#include "time-signature.hh" - -#include "grob.hh" -#include "font-interface.hh" -#include "international.hh" -#include "output-def.hh" -#include "text-interface.hh" - -/* - TODO: - - this file should go ; The formatting can completely be done with - markups. -*/ - -MAKE_SCHEME_CALLBACK (Time_signature, print, 1); -SCM -Time_signature::print (SCM smob) -{ - Grob *me = unsmob_grob (smob); - SCM st = me->get_property ("style"); - SCM frac = me->get_property ("fraction"); - int n = 4; - int d = 4; - if (scm_is_pair (frac)) - { - n = scm_to_int (scm_car (frac)); - d = scm_to_int (scm_cdr (frac)); - } - - Stencil m; - if (st == ly_symbol2scm ("single-digit")) - m = numbered_time_signature (me, n, 0); - else if (scm_is_symbol (st)) - m = special_time_signature (me, st, n, d); - else - m = numbered_time_signature (me, n, d); - - return m.smobbed_copy (); -} - -Stencil -Time_signature::special_time_signature (Grob *me, SCM scm_style, int n, int d) -{ - string style = robust_symbol2string (scm_style, "default"); - - if (style == "numbered") - return numbered_time_signature (me, n, d); - - if ((style == "default") || (style == "")) - style = ::to_string ("C"); - - if (style == "C") - { - if /* neither C2/2 nor C4/4 */ - (((n != 2) || (d != 2)) - && ((n != 4) || (d != 4))) - return numbered_time_signature (me, n, d); - } - - string char_name = style + ::to_string (n) + ::to_string (d); - me->set_property ("font-encoding", ly_symbol2scm ("fetaMusic")); - Stencil out = Font_interface::get_default_font (me) - ->find_by_name ("timesig." + char_name); - if (!out.is_empty ()) - return out; - - /* If there is no such symbol, we default to the numbered style. - (Here really with a warning!) */ - me->warning (_f ("time signature symbol `%s' not found; " - "reverting to numbered style", char_name)); - return numbered_time_signature (me, n, d); -} - -Stencil -Time_signature::numbered_time_signature (Grob *me, int num, int den) -{ - SCM chain = me->get_property_alist_chain (Font_interface::text_font_alist_chain (me)); - chain = scm_cons (scm_list_1 (scm_cons (ly_symbol2scm ("font-encoding"), - ly_symbol2scm ("fetaText"))), - chain); - - SCM sn = Text_interface::interpret_markup (me->layout ()->self_scm (), chain, - ly_string2scm (::to_string (num))); - SCM sd = Text_interface::interpret_markup (me->layout ()->self_scm (), chain, - ly_string2scm (::to_string (den))); - - Stencil n = *unsmob_stencil (sn); - Stencil d = *unsmob_stencil (sd); - - n.align_to (X_AXIS, CENTER); - d.align_to (X_AXIS, CENTER); - Stencil m; - if (den) - { - m.add_at_edge (Y_AXIS, UP, n, 0.0); - m.add_at_edge (Y_AXIS, DOWN, d, 0.0); - } - else - { - m = n; - m.align_to (Y_AXIS, CENTER); - } - - m.align_to (X_AXIS, LEFT); - - return m; -} - -ADD_INTERFACE (Time_signature, - "A time signature, in different styles. The following values" - " for @code{style} are are recognized:\n" - "\n" - "@table @code\n" - "@item C\n" - "4/4 and 2/2 are typeset as C and struck C, respectively." - " All other time signatures are written with two digits." - " The value @code{default} is equivalent to @code{C}.\n" - "@item neomensural\n" - "2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8, and 9/8 are" - " typeset with neo-mensural style mensuration marks. All" - " other time signatures are written with two digits.\n" - "@item mensural\n" - "2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8, and 9/8 are" - " typeset with mensural style mensuration marks. All other" - " time signatures are written with two digits.\n" - "@item single-digit\n" - "All time signatures are typeset with a single digit, e.g.," - " 3/2 is written as 3.\n" - "@item numbered\n" - "All time signatures are typeset with two digits.\n" - "@end table", - - /* properties */ - "fraction " - "style " - ); diff --git a/lily/timing-translator.cc b/lily/timing-translator.cc index 67832e3cc5..4716eceb24 100644 --- a/lily/timing-translator.cc +++ b/lily/timing-translator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,6 +23,7 @@ #include "translator-group.hh" #include "global-context.hh" #include "moment.hh" +#include "lily-imports.hh" void Timing_translator::stop_translation_timestep () @@ -47,9 +48,8 @@ Timing_translator::stop_translation_timestep () void Timing_translator::initialize () { - Context *timing = unsmob_context (scm_call_2 (ly_lily_module_constant ("ly:context-find"), - context ()->self_scm (), - ly_symbol2scm ("Timing"))); + Context *timing = unsmob + (Lily::ly_context_find (context ()->self_scm (), ly_symbol2scm ("Timing"))); if (timing != context ()) { context ()->add_alias (ly_symbol2scm ("Timing")); @@ -78,7 +78,7 @@ Timing_translator::initialize () SCM measureLength = timing->get_property ("measureLength"); - if (!unsmob_moment (measureLength)) + if (!unsmob (measureLength)) { measureLength = Moment (ly_scm2rational @@ -96,32 +96,25 @@ Timing_translator::initialize () if (!scm_is_pair (timeSignatureSettings)) { programming_error ("missing timeSignatureSettings"); - // A memoized constant is not the prettiest thing as a fallback - // since it does not track changes of the variable. However, - // this is still better than nothing, and we already complained - // via a programming_error - timeSignatureSettings = ly_lily_module_constant ("default-time-signature-settings"); + timeSignatureSettings = Lily::default_time_signature_settings; } context ()->set_property ("timeSignatureSettings", timeSignatureSettings); SCM beamExceptions = timing->get_property ("beamExceptions"); if (!scm_is_pair (beamExceptions)) { - beamExceptions = - scm_call_2 (ly_lily_module_constant ("beam-exceptions"), - timeSignatureFraction, - timeSignatureSettings); + beamExceptions = Lily::beam_exceptions (timeSignatureFraction, + timeSignatureSettings); } context ()->set_property ("beamExceptions", beamExceptions); SCM baseMoment = timing->get_property ("baseMoment"); - if (!unsmob_moment (baseMoment)) + if (!unsmob (baseMoment)) { baseMoment = Moment (ly_scm2rational - (scm_call_2 (ly_lily_module_constant ("base-length"), - timeSignatureFraction, - timeSignatureSettings))).smobbed_copy (); + (Lily::base_length (timeSignatureFraction, + timeSignatureSettings))).smobbed_copy (); } context ()->set_property ("baseMoment", baseMoment); @@ -129,10 +122,9 @@ Timing_translator::initialize () if (!scm_is_pair (beatStructure)) { beatStructure = - scm_call_3 (ly_lily_module_constant ("beat-structure"), - ly_rational2scm (unsmob_moment (baseMoment)->main_part_), - timeSignatureFraction, - timeSignatureSettings); + Lily::beat_structure (ly_rational2scm (unsmob (baseMoment)->main_part_), + timeSignatureFraction, + timeSignatureSettings); } context ()->set_property ("beatStructure", beatStructure); @@ -147,8 +139,8 @@ Rational Timing_translator::measure_length () const { SCM l = get_property ("measureLength"); - if (unsmob_moment (l)) - return unsmob_moment (l)->main_part_; + if (unsmob (l)) + return unsmob (l)->main_part_; else return Rational (1); } @@ -181,8 +173,8 @@ Timing_translator::start_translation_timestep () Moment measposp; SCM s = get_property ("measurePosition"); - if (unsmob_moment (s)) - measposp = *unsmob_moment (s); + if (unsmob (s)) + measposp = *unsmob (s); else { measposp = now; @@ -231,6 +223,12 @@ Timing_translator::start_translation_timestep () #include "translator.icc" +void +Timing_translator::boot () +{ + +} + ADD_TRANSLATOR (Timing_translator, /* doc */ "This engraver adds the alias @code{Timing} to its containing" diff --git a/lily/translator-ctors.cc b/lily/translator-ctors.cc index 58d4e51577..67fa95a610 100644 --- a/lily/translator-ctors.cc +++ b/lily/translator-ctors.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,18 +22,20 @@ #include "international.hh" #include "scm-hash.hh" #include "warn.hh" +#include "protected-scm.hh" /* should delete these after exit. */ -Scheme_hash_table *global_translator_dict = 0; +Protected_scm global_translator_dict; LY_DEFINE (get_all_translators, "ly:get-all-translators", 0, 0, 0, (), "Return a list of all translator objects that may be" " instantiated.") { - SCM l = global_translator_dict ? global_translator_dict->to_alist () : SCM_EOL; + Scheme_hash_table *dict = unsmob (global_translator_dict); + SCM l = dict ? dict->to_alist () : SCM_EOL; for (SCM s = l; scm_is_pair (s); s = scm_cdr (s)) scm_set_car_x (s, scm_cdar (s)); @@ -44,28 +46,30 @@ LY_DEFINE (get_all_translators, "ly:get-all-translators", 0, 0, 0, (), void add_translator (Translator *t) { - if (!global_translator_dict) - global_translator_dict = new Scheme_hash_table; + Scheme_hash_table *dict = unsmob (global_translator_dict); + if (!dict) + { + global_translator_dict = Scheme_hash_table::make_smob (); + dict = unsmob (global_translator_dict); + } SCM k = ly_symbol2scm (t->class_name ()); - global_translator_dict->set (k, t->self_scm ()); - - t->unprotect (); + dict->set (k, t->unprotect ()); } Translator * get_translator (SCM sym) { SCM v = SCM_BOOL_F; - if (global_translator_dict) - global_translator_dict->try_retrieve (sym, &v); + Scheme_hash_table *dict = unsmob (global_translator_dict); + if (dict) + dict->try_retrieve (sym, &v); - if (v == SCM_BOOL_F) + if (scm_is_false (v)) { warning (_f ("unknown translator: `%s'", ly_symbol2string (sym).c_str ())); return 0; } - return unsmob_translator (v); + return unsmob (v); } - diff --git a/lily/translator-dispatch-list.cc b/lily/translator-dispatch-list.cc index dffaa095f6..eeee8d2483 100644 --- a/lily/translator-dispatch-list.cc +++ b/lily/translator-dispatch-list.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,19 +20,19 @@ #include "translator-dispatch-list.hh" #include "engraver.hh" -#include "ly-smobs.icc" void Engraver_dispatch_list::apply (Grob_info gi) { - Translator *origin = gi.origin_translator (); + SCM origin = gi.origin_translator ()->self_scm (); + SCM grob = gi.grob ()->self_scm (); for (vsize i = 0; i < dispatch_entries_.size (); i++) { - Engraver_dispatch_entry const &e (dispatch_entries_[i]); - if (e.engraver_ == origin) + Method_instance const &e (dispatch_entries_[i]); + if (scm_is_eq (e.instance (), origin)) continue; - (e.engraver_->*e.function_) (gi); + e (grob, origin); } } @@ -41,52 +41,23 @@ Engraver_dispatch_list::create (SCM trans_list, SCM iface_list, Direction start_end) { SCM retval = Engraver_dispatch_list ().smobbed_copy (); - Engraver_dispatch_list *list = Engraver_dispatch_list::unsmob (retval); + Engraver_dispatch_list *list = unsmob (retval); - Engraver_dispatch_entry entry; - bool found = false; for (SCM s = trans_list; scm_is_pair (s); s = scm_cdr (s)) { - Engraver *eng - = dynamic_cast (unsmob_translator (scm_car (s))); + Engraver *eng = unsmob (scm_car (s)); if (!eng) continue; - entry.engraver_ = eng; for (SCM i = iface_list; scm_is_pair (i); i = scm_cdr (i)) { - Engraver_void_function_engraver_grob_info ptr - = (start_end == START) - ? eng->get_acknowledger (scm_car (i)) - : eng->get_end_acknowledger (scm_car (i)); + SCM ptr = eng->get_acknowledger (scm_car (i), start_end); - if (ptr) - { - entry.function_ = ptr; - list->dispatch_entries_.push_back (entry); - found = true; - } + if (!SCM_UNBNDP (ptr)) + list->dispatch_entries_.push_back (Method_instance (ptr, eng)); } } - return found ? retval : SCM_EOL; + return list->dispatch_entries_.empty () ? SCM_EOL : retval; } - -SCM -Engraver_dispatch_list::mark_smob (SCM) -{ - return SCM_BOOL_F; -} - -int -Engraver_dispatch_list::print_smob (SCM /* x */, - SCM p, - scm_print_state *) -{ - scm_puts ("#", p); - return 1; -} - -IMPLEMENT_SIMPLE_SMOBS (Engraver_dispatch_list); -IMPLEMENT_DEFAULT_EQUAL_P (Engraver_dispatch_list); diff --git a/lily/translator-group-ctors.cc b/lily/translator-group-ctors.cc index bd349824d7..e14ed76082 100644 --- a/lily/translator-group-ctors.cc +++ b/lily/translator-group-ctors.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,13 +28,13 @@ Translator_group * get_translator_group (SCM sym) { - if (sym == ly_symbol2scm ("Engraver_group")) + if (scm_is_eq (sym, ly_symbol2scm ("Engraver_group"))) return new Engraver_group (); - else if (sym == ly_symbol2scm ("Performer_group")) + else if (scm_is_eq (sym, ly_symbol2scm ("Performer_group"))) return new Performer_group (); - else if (sym == ly_symbol2scm ("Score_engraver")) + else if (scm_is_eq (sym, ly_symbol2scm ("Score_engraver"))) return new Score_engraver (); - else if (sym == ly_symbol2scm ("Score_performer")) + else if (scm_is_eq (sym, ly_symbol2scm ("Score_performer"))) return new Score_performer (); error (_f ("fatal error. Couldn't find type: %s", diff --git a/lily/translator-group.cc b/lily/translator-group.cc index ab79d13476..a9f1690f62 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys , + Copyright (C) 1997--2015 Han-Wen Nienhuys , Erik Sandberg LilyPond is free software: you can redistribute it and/or modify @@ -36,10 +36,10 @@ #include "warn.hh" void -translator_each (SCM list, Translator_method method) +translator_each (SCM list, SCM method) { for (SCM p = list; scm_is_pair (p); p = scm_cdr (p)) - (unsmob_translator (scm_car (p))->*method) (); + scm_call_1 (method, scm_car (p)); } void @@ -58,11 +58,11 @@ Translator_group::connect_to_context (Context *c) } context_ = c; - c->event_source ()->add_listener (GET_LISTENER (create_child_translator), + c->event_source ()->add_listener (GET_LISTENER (Translator_group, create_child_translator), ly_symbol2scm ("AnnounceNewContext")); for (SCM tr_list = simple_trans_list_; scm_is_pair (tr_list); tr_list = scm_cdr (tr_list)) { - Translator *tr = unsmob_translator (scm_car (tr_list)); + Translator *tr = unsmob (scm_car (tr_list)); tr->connect_to_context (c); } } @@ -72,10 +72,10 @@ Translator_group::disconnect_from_context () { for (SCM tr_list = simple_trans_list_; scm_is_pair (tr_list); tr_list = scm_cdr (tr_list)) { - Translator *tr = unsmob_translator (scm_car (tr_list)); + Translator *tr = unsmob (scm_car (tr_list)); tr->disconnect_from_context (context_); } - context_->event_source ()->remove_listener (GET_LISTENER (create_child_translator), + context_->event_source ()->remove_listener (GET_LISTENER (Translator_group, create_child_translator), ly_symbol2scm ("AnnounceNewContext")); context_ = 0; protected_events_ = SCM_EOL; @@ -90,7 +90,7 @@ Translator_group::finalize () Both filter_performers and filter_engravers used to use a direct dynamic_cast on the unsmobbed translator to be filtered, i.e., - if (dynamic_cast (unsmob_translator (scm_car (*tail)))) + if (unsmob (scm_car (*tail))) but this caused mysterious optimisation issues in several GUB builds. See issue #818 for the background to this change. @@ -101,7 +101,7 @@ filter_performers (SCM ell) SCM *tail = ℓ for (SCM p = ell; scm_is_pair (p); p = scm_cdr (p)) { - if (unsmob_performer (scm_car (*tail))) + if (unsmob (scm_car (*tail))) *tail = scm_cdr (*tail); else tail = SCM_CDRLOC (*tail); @@ -115,7 +115,7 @@ filter_engravers (SCM ell) SCM *tail = ℓ for (SCM p = ell; scm_is_pair (p); p = scm_cdr (p)) { - if (unsmob_engraver (scm_car (*tail))) + if (unsmob (scm_car (*tail))) *tail = scm_cdr (*tail); else tail = SCM_CDRLOC (*tail); @@ -145,15 +145,14 @@ Translator_group::protect_event (SCM ev) Create a new translator for a newly created child context. Triggered by AnnounceNewContext events. */ -IMPLEMENT_LISTENER (Translator_group, create_child_translator); void Translator_group::create_child_translator (SCM sev) { - Stream_event *ev = unsmob_stream_event (sev); + Stream_event *ev = unsmob (sev); // get from AnnounceNewContext SCM cs = ev->get_property ("context"); - Context *new_context = unsmob_context (cs); - Context_def *def = unsmob_context_def (new_context->get_definition ()); + Context *new_context = unsmob (cs); + Context_def *def = unsmob (new_context->get_definition ()); SCM ops = new_context->get_definition_mods (); SCM trans_names = def->get_translator_names (ops); @@ -171,7 +170,6 @@ Translator_group::create_child_translator (SCM sev) type = get_translator (definition); else if (ly_is_pair (definition)) { - type = get_translator (ly_symbol2scm ("Scheme_engraver")); is_scheme = true; } else if (ly_is_procedure (definition)) @@ -180,17 +178,15 @@ Translator_group::create_child_translator (SCM sev) // an argument and evaluates to an a-list scheme engraver // definition. definition = scm_call_1 (definition, cs); - type = get_translator (ly_symbol2scm ("Scheme_engraver")); is_scheme = true; } - if (!type) + if (!is_scheme && !type) warning (_f ("cannot find: `%s'", ly_symbol2string (scm_car (s)).c_str ())); else { - Translator *instance = type->clone (); - if (is_scheme) - dynamic_cast (instance)->init_from_scheme (definition); + Translator *instance = is_scheme ? new Scheme_engraver (definition) + : type->clone (); SCM str = instance->self_scm (); @@ -223,10 +219,11 @@ Translator_group::create_child_translator (SCM sev) g->connect_to_context (new_context); g->unprotect (); - recurse_over_translators (new_context, - &Translator::initialize, - &Translator_group::initialize, - DOWN); + recurse_over_translators + (new_context, + Callback0_wrapper::make_smob (), + Callback0_wrapper::make_smob (), + DOWN); } SCM @@ -244,43 +241,41 @@ precomputed_recurse_over_translators (Context *c, Translator_precompute_index id if (tg && dir == DOWN) { tg->precomputed_translator_foreach (idx); - tg->call_precomputed_self_method (idx); } for (SCM s = c->children_contexts (); scm_is_pair (s); s = scm_cdr (s)) - precomputed_recurse_over_translators (unsmob_context (scm_car (s)), idx, dir); + precomputed_recurse_over_translators (unsmob (scm_car (s)), idx, dir); if (tg && dir == UP) { tg->precomputed_translator_foreach (idx); - tg->call_precomputed_self_method (idx); } } void -recurse_over_translators (Context *c, Translator_method ptr, - Translator_group_method tg_ptr, Direction dir) +recurse_over_translators (Context *c, SCM ptr, + SCM tg_ptr, Direction dir) { - Translator_group *tg - = dynamic_cast (c->implementation ()); + Translator_group *tg = c->implementation (); + SCM tg_scm = tg ? tg->self_scm () : SCM_UNDEFINED; if (tg && dir == DOWN) { - (tg->*tg_ptr) (); + scm_call_1 (tg_ptr, tg_scm); translator_each (tg->get_simple_trans_list (), ptr); } for (SCM s = c->children_contexts (); scm_is_pair (s); s = scm_cdr (s)) - recurse_over_translators (unsmob_context (scm_car (s)), ptr, tg_ptr, dir); + recurse_over_translators (unsmob (scm_car (s)), ptr, tg_ptr, dir); if (tg && dir == UP) { translator_each (tg->get_simple_trans_list (), ptr); - (tg->*tg_ptr) (); + scm_call_1 (tg_ptr, tg_scm); } } @@ -302,70 +297,49 @@ Translator_group::precompute_method_bindings () { for (SCM s = simple_trans_list_; scm_is_pair (s); s = scm_cdr (s)) { - Translator *tr = unsmob_translator (scm_car (s)); - Translator_void_method_ptr ptrs[TRANSLATOR_METHOD_PRECOMPUTE_COUNT]; + Translator *tr = unsmob (scm_car (s)); + SCM ptrs[TRANSLATOR_METHOD_PRECOMPUTE_COUNT]; tr->fetch_precomputable_methods (ptrs); assert (tr); for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++) { - if (ptrs[i]) - precomputed_method_bindings_[i].push_back (Translator_method_binding (tr, ptrs[i])); + if (!SCM_UNBNDP (ptrs[i])) + precomputed_method_bindings_[i].push_back (Method_instance (ptrs[i], tr)); } } - fetch_precomputable_methods (precomputed_self_method_bindings_); } void Translator_group::precomputed_translator_foreach (Translator_precompute_index idx) { - vector &bindings (precomputed_method_bindings_[idx]); + vector &bindings (precomputed_method_bindings_[idx]); for (vsize i = 0; i < bindings.size (); i++) - bindings[i].invoke (); -} - -void -Translator_group::fetch_precomputable_methods (Translator_group_void_method ptrs[]) -{ - for (int i = 0; i < TRANSLATOR_METHOD_PRECOMPUTE_COUNT; i++) - ptrs[i] = 0; -} - -void -Translator_group::call_precomputed_self_method (Translator_precompute_index idx) -{ - if (precomputed_self_method_bindings_[idx]) - (*precomputed_self_method_bindings_[idx]) (this); + bindings[i](); } Translator_group::~Translator_group () { } -#include "ly-smobs.icc" -IMPLEMENT_SMOBS (Translator_group); -IMPLEMENT_DEFAULT_EQUAL_P (Translator_group); -IMPLEMENT_TYPE_P (Translator_group, "ly:translator-group?"); +const char * const Translator_group::type_p_name_ = "ly:translator-group?"; int -Translator_group::print_smob (SCM s, SCM port, scm_print_state *) +Translator_group::print_smob (SCM port, scm_print_state *) const { - Translator_group *me = (Translator_group *) SCM_CELL_WORD_1 (s); scm_puts ("#class_name (), port); - scm_display (me->simple_trans_list_, port); + scm_puts (class_name (), port); + scm_display (simple_trans_list_, port); scm_puts (" >", port); return 1; } SCM -Translator_group::mark_smob (SCM smob) +Translator_group::mark_smob () const { - Translator_group *me = (Translator_group *)SCM_CELL_WORD_1 (smob); - - me->derived_mark (); - scm_gc_mark (me->protected_events_); - return me->simple_trans_list_; + derived_mark (); + scm_gc_mark (protected_events_); + return simple_trans_list_; } diff --git a/lily/translator-scheme.cc b/lily/translator-scheme.cc index bede8cac2d..3aaf92fc3d 100644 --- a/lily/translator-scheme.cc +++ b/lily/translator-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ LY_DEFINE (ly_translator_name, "ly:translator-name", " The name is a symbol.") { LY_ASSERT_SMOB (Translator, trans, 1); - Translator *tr = unsmob_translator (trans); + Translator *tr = unsmob (trans); char const *nm = tr->class_name (); return ly_symbol2scm (nm); } @@ -38,7 +38,7 @@ LY_DEFINE (ly_translator_description, "ly:translator-description", "Return an alist of properties of translator @var{me}.") { LY_ASSERT_SMOB (Translator, me, 1); - Translator *tr = unsmob_translator (me); + Translator *tr = unsmob (me); return tr->translator_description (); } @@ -47,7 +47,7 @@ LY_DEFINE (ly_translator_context, "ly:translator-context", "Return the context of the translator object @var{trans}.") { LY_ASSERT_SMOB (Translator, trans, 1); - Translator *tr = unsmob_translator (trans); + Translator *tr = unsmob (trans); Context *c = tr->context (); return c ? c->self_scm () : SCM_BOOL_F; diff --git a/lily/translator.cc b/lily/translator.cc index 154ffa4b08..bdc55f0f05 100644 --- a/lily/translator.cc +++ b/lily/translator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,7 +27,6 @@ #include "warn.hh" #include "translator.icc" -#include "ly-smobs.icc" Translator::~Translator () { @@ -36,7 +35,6 @@ Translator::~Translator () void Translator::init () { - self_scm_ = SCM_EOL; daddy_context_ = 0; smobify_self (); } @@ -56,9 +54,9 @@ Translator::Translator () init (); } -Translator::Translator (Translator const &src) +Translator::Translator (Translator const &) + : Smob () { - (void) src; init (); } @@ -120,48 +118,38 @@ Translator::finalize () void Translator::connect_to_context (Context *c) { - for (translator_listener_record *r = get_listener_list (); r; r = r->next_) - c->events_below ()->add_listener (r->get_listener_ (this, r->event_class_), - r->event_class_); + for (SCM r = get_listener_list (); scm_is_pair (r); r = scm_cdr (r)) + { + SCM event_class = scm_caar (r); + SCM callback = scm_cdar (r); + + c->events_below ()->add_listener (get_listener (callback), + event_class); + } } void Translator::disconnect_from_context (Context *c) { - for (translator_listener_record *r = get_listener_list (); r; r = r->next_) - c->events_below ()->remove_listener (r->get_listener_ (this, r->event_class_), - r->event_class_); -} + for (SCM r = get_listener_list (); scm_is_pair (r); r = scm_cdr (r)) + { + SCM event_class = scm_caar (r); + SCM callback = scm_cdar (r); -/* - internally called once, statically, for each translator - listener. Connects the name of an event class with a procedure that - fetches the corresponding listener. + c->events_below ()->remove_listener (get_listener (callback), + event_class); + } +} - The method should only be called from the macro - IMPLEMENT_TRANSLATOR_LISTENER. - */ -void -Translator::add_translator_listener (translator_listener_record **listener_list, - translator_listener_record *r, - Listener (*get_listener) (void *, SCM), - const char *ev_class) +SCM +Translator::event_class_symbol (const char *ev_class) { /* ev_class is the C++ identifier name. Convert to scm symbol */ string name = string (ev_class); name = replace_all (&name, '_', '-'); name += "-event"; - // we make the symbol permanent in order not to have to bother about - // the static translator_listener_record chains while garbage - // collecting. - - SCM class_sym = scm_permanent_object (scm_from_locale_symbol (name.c_str ())); - - r->event_class_ = class_sym; - r->get_listener_ = get_listener; - r->next_ = *listener_list; - *listener_list = r; + return scm_from_ascii_symbol (name.c_str ()); } /* @@ -170,7 +158,7 @@ Translator::add_translator_listener (translator_listener_record **listener_list, SCM Translator::static_translator_description (const char *grobs, const char *desc, - translator_listener_record *listener_list, + SCM listener_list, const char *read, const char *write) const { @@ -180,11 +168,11 @@ Translator::static_translator_description (const char *grobs, parse_symbol_list (grobs), static_properties); static_properties = scm_acons (ly_symbol2scm ("description"), - scm_from_locale_string (desc), static_properties); + scm_from_utf8_string (desc), static_properties); SCM list = SCM_EOL; - for (; listener_list; listener_list = listener_list->next_) - list = scm_cons (listener_list->event_class_, list); + for (; scm_is_pair (listener_list); listener_list = scm_cdr (listener_list)) + list = scm_cons (scm_caar (listener_list), list); static_properties = scm_acons (ly_symbol2scm ("events-accepted"), list, static_properties); @@ -201,10 +189,9 @@ Translator::static_translator_description (const char *grobs, SMOBS */ SCM -Translator::mark_smob (SCM sm) +Translator::mark_smob () const { - Translator *me = (Translator *) SCM_CELL_WORD_1 (sm); - me->derived_mark (); + derived_mark (); return SCM_EOL; } @@ -220,9 +207,7 @@ Translator::get_score_context () const return daddy_context_->get_score_context (); } -IMPLEMENT_SMOBS (Translator); -IMPLEMENT_DEFAULT_EQUAL_P (Translator); -IMPLEMENT_TYPE_P (Translator, "ly:translator?"); +const char * const Translator::type_p_name_ = "ly:translator?"; bool Translator::must_be_last () const @@ -236,50 +221,44 @@ Translator::derived_mark () const } int -Translator::print_smob (SCM s, SCM port, scm_print_state *) +Translator::print_smob (SCM port, scm_print_state *) const { - Translator *me = (Translator *) SCM_CELL_WORD_1 (s); scm_puts ("#class_name (), port); + scm_puts (class_name (), port); scm_puts (" >", port); return 1; } void -add_acknowledger (Engraver_void_function_engraver_grob_info ptr, +add_acknowledger (SCM ptr, char const *func_name, - vector *ack_array) + SCM &ack_hash) { - Acknowledge_information inf; - inf.function_ = ptr; + if (SCM_UNBNDP (ack_hash)) + ack_hash = Scheme_hash_table::make_smob (); string interface_name (func_name); interface_name = replace_all (&interface_name, '_', '-'); interface_name += "-interface"; - /* - this is only called during program init, so safe to use scm_gc_protect_object () - */ - inf.symbol_ = scm_gc_protect_object (ly_symbol2scm (interface_name.c_str ())); - ack_array->push_back (inf); + unsmob (ack_hash) + ->set (ly_symbol2scm (interface_name.c_str ()), ptr); } -Engraver_void_function_engraver_grob_info -generic_get_acknowledger (SCM sym, vector const *ack_array) +SCM +generic_get_acknowledger (SCM sym, SCM ack_hash) { - for (vsize i = 0; i < ack_array->size (); i++) - { - if (ack_array->at (i).symbol_ == sym) - return ack_array->at (i).function_; - } - return 0; + if (SCM_UNBNDP (ack_hash)) + return SCM_UNDEFINED; + + return unsmob (ack_hash)->get (sym); } Moment get_event_length (Stream_event *e) { - Moment *m = unsmob_moment (e->get_property ("length")); + Moment *m = unsmob (e->get_property ("length")); if (m) return *m; else @@ -334,16 +313,4 @@ internal_event_assignment (Stream_event **old_ev, Stream_event *new_ev, const ch } } -ADD_TRANSLATOR (Translator, - /* doc */ - "Base class. Not instantiated.", - - /* create */ - "", - - /* read */ - "", - - /* write */ - "" - ); +// Base class. Not instantiated. No ADD_TRANSLATOR call. diff --git a/lily/trill-spanner-engraver.cc b/lily/trill-spanner-engraver.cc index 34b4e6663f..6634b5ea43 100644 --- a/lily/trill-spanner-engraver.cc +++ b/lily/trill-spanner-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Jan Nieuwenhuizen + Copyright (C) 2000--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,8 +41,8 @@ public: TRANSLATOR_DECLARATIONS (Trill_spanner_engraver); protected: virtual void finalize (); - DECLARE_TRANSLATOR_LISTENER (trill_span); - DECLARE_ACKNOWLEDGER (note_column); + void listen_trill_span (Stream_event *); + void acknowledge_note_column (Grob_info); void stop_translation_timestep (); void process_music (); @@ -63,7 +63,6 @@ Trill_spanner_engraver::Trill_spanner_engraver () event_drul_.set (0, 0); } -IMPLEMENT_TRANSLATOR_LISTENER (Trill_spanner_engraver, trill_span); void Trill_spanner_engraver::listen_trill_span (Stream_event *ev) { @@ -121,7 +120,7 @@ Trill_spanner_engraver::typeset_all () { if (!finished_->get_bound (RIGHT)) { - Grob *e = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *e = unsmob (get_property ("currentMusicalColumn")); finished_->set_bound (RIGHT, e); } finished_ = 0; @@ -133,7 +132,7 @@ Trill_spanner_engraver::stop_translation_timestep () { if (span_ && !span_->get_bound (LEFT)) { - Grob *e = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *e = unsmob (get_property ("currentMusicalColumn")); span_->set_bound (LEFT, e); } @@ -147,12 +146,18 @@ Trill_spanner_engraver::finalize () typeset_all (); if (span_) { - Grob *e = unsmob_grob (get_property ("currentCommandColumn")); + Grob *e = unsmob (get_property ("currentCommandColumn")); span_->set_bound (RIGHT, e); } } -ADD_ACKNOWLEDGER (Trill_spanner_engraver, note_column); + +void +Trill_spanner_engraver::boot () +{ + ADD_LISTENER (Trill_spanner_engraver, trill_span); + ADD_ACKNOWLEDGER (Trill_spanner_engraver, note_column); +} ADD_TRANSLATOR (Trill_spanner_engraver, /* doc */ diff --git a/lily/ttf.cc b/lily/ttf.cc index 6d7f97bf37..02ccdb8dd4 100644 --- a/lily/ttf.cc +++ b/lily/ttf.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -67,7 +67,7 @@ print_header (void *out, FT_Face face) lily_cookie_fprintf (out, "%d dict begin\n", 11); lily_cookie_fprintf (out, "/FontName /%s def\n", - FT_Get_Postscript_Name (face)); + get_postscript_name (face).c_str ()); lily_cookie_fprintf (out, "/Encoding StandardEncoding def\n"); lily_cookie_fprintf (out, "/PaintType 0 def\n"); @@ -503,7 +503,7 @@ LY_DEFINE (ly_ttf_ps_name, "ly:ttf-ps-name", LY_ASSERT_TYPE (scm_is_string, ttf_file_name, 1); int i = 0; - if (idx != SCM_UNDEFINED) + if (!SCM_UNBNDP (idx)) { LY_ASSERT_TYPE (scm_is_integer, idx, 2); i = scm_to_int (idx); @@ -533,8 +533,7 @@ LY_DEFINE (ly_ttf_ps_name, "ly:ttf-ps-name", } face = open_ft_face (file_name, i); - char const *ps_name_str0 = FT_Get_Postscript_Name (face); - SCM ps_name = scm_from_locale_string (ps_name_str0 ? ps_name_str0 : ""); + SCM ps_name = scm_from_locale_string (get_postscript_name (face).c_str ()); FT_Done_Face (face); debug_output ("]", false); @@ -553,7 +552,7 @@ LY_DEFINE (ly_ttf_2_pfa, "ly:ttf->pfa", LY_ASSERT_TYPE (scm_is_string, ttf_file_name, 1); int i = 0; - if (idx != SCM_UNDEFINED) + if (!SCM_UNBNDP (idx)) { LY_ASSERT_TYPE (scm_is_integer, idx, 2); i = scm_to_int (idx); @@ -570,7 +569,7 @@ LY_DEFINE (ly_ttf_2_pfa, "ly:ttf->pfa", Memory_out_stream stream; create_type42_font (&stream, file_name, i); - SCM asscm = scm_from_locale_stringn (stream.get_string (), + SCM asscm = scm_from_latin1_stringn (stream.get_string (), stream.get_length ()); debug_output ("]", false); diff --git a/lily/tuplet-bracket.cc b/lily/tuplet-bracket.cc index 1eccaabc06..17e1194de8 100644 --- a/lily/tuplet-bracket.cc +++ b/lily/tuplet-bracket.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -64,7 +64,7 @@ get_x_bound_item (Grob *me_grob, Direction hdir, Direction my_dir) { Spanner *me = dynamic_cast (me_grob); Item *g = me->get_bound (hdir); - if (Note_column::has_interface (g) + if (has_interface (g) && Note_column::get_stem (g) && Note_column::dir (g) == my_dir) g = Note_column::get_stem (g); @@ -77,7 +77,7 @@ flatten_number_pair_property (Grob *me, Direction xdir, SCM sym) { Drul_array zero (0, 0); Drul_array pair - = robust_scm2drul (me->internal_get_property (sym), zero); + = robust_scm2drul (me->get_property (sym), zero); pair[xdir] = 0.0; me->set_property (sym, ly_interval2scm (pair)); @@ -133,7 +133,7 @@ MAKE_SCHEME_CALLBACK (Tuplet_bracket, calc_connect_to_neighbors, 1); SCM Tuplet_bracket::calc_connect_to_neighbors (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Direction dir = get_grob_direction (me); Drul_array bounds (get_x_bound_item (me, LEFT, dir), @@ -184,7 +184,7 @@ MAKE_SCHEME_CALLBACK (Tuplet_bracket, calc_x_positions, 1) SCM Tuplet_bracket::calc_x_positions (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); extract_grob_set (me, "note-columns", columns); Grob *commonx = get_common_x (me); @@ -255,7 +255,7 @@ MAKE_SCHEME_CALLBACK (Tuplet_bracket, print, 1); SCM Tuplet_bracket::print (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Stencil mol; extract_grob_set (me, "note-columns", columns); @@ -268,7 +268,7 @@ Tuplet_bracket::print (SCM smob) */ SCM bracket_vis_prop = me->get_property ("bracket-visibility"); bool bracket_prop = ly_scm2bool (bracket_vis_prop); // Flag, user has set bracket-visibility prop. - bool bracket = (bracket_vis_prop == ly_symbol2scm ("if-no-beam")); + bool bracket = scm_is_eq (bracket_vis_prop, ly_symbol2scm ("if-no-beam")); if (scm_is_bool (bracket_vis_prop)) bracket_visibility = bracket_prop; else if (bracket) @@ -303,7 +303,7 @@ Tuplet_bracket::print (SCM smob) Output_def *pap = me->layout (); - Grob *number_grob = unsmob_grob (me->get_object ("tuplet-number")); + Grob *number_grob = unsmob (me->get_object ("tuplet-number")); /* Don't print the bracket when it would be smaller than the number. @@ -364,7 +364,7 @@ Tuplet_bracket::print (SCM smob) = Text_interface::interpret_markup (pap->self_scm (), properties, text); - Stencil *edge_text = unsmob_stencil (t); + Stencil *edge_text = unsmob (t); edge_text->translate_axis (x_span[d] - x_span[LEFT], X_AXIS); edge_stencils[d] = *edge_text; @@ -438,20 +438,19 @@ Tuplet_bracket::make_bracket (Grob *me, // for line properties. } Stencil m; - for (LEFT_and_RIGHT (d)) - { - if (!gap.is_empty ()) - m.add_stencil (Line_interface::line (me, straight_corners[d], - gap_corners[d])); - + if (!gap.is_empty ()) + for (LEFT_and_RIGHT (d)) m.add_stencil (Line_interface::line (me, straight_corners[d], - flare_corners[d])); - } - - if (gap.is_empty ()) + gap_corners[d])); + else m.add_stencil (Line_interface::line (me, straight_corners[LEFT], straight_corners[RIGHT])); + if (scm_is_number (me->get_property ("dash-fraction"))) + me->set_property ("dash-fraction", scm_from_double (1.0)); + for (LEFT_and_RIGHT (d)) + m.add_stencil (Line_interface::line (me, straight_corners[d], + flare_corners[d])); return m; } @@ -523,7 +522,7 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) Real x1 = robust_relative_extent (rgr, commonx, X_AXIS)[RIGHT]; bool follow_beam = par_beam && get_grob_direction (par_beam) == dir - && !to_boolean (par_beam->get_property ("knee")); + && !Beam::is_knee (par_beam); vector points; if (columns.size () @@ -633,10 +632,13 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) } // Check for number-on-bracket collisions - Grob *number = unsmob_grob (tuplets[i]->get_object ("tuplet-number")); + Grob *number = unsmob (tuplets[i]->get_object ("tuplet-number")); if (number) - points.push_back (Offset (number->extent (commonx, X_AXIS).center () - x0, - number->extent (commony, Y_AXIS)[dir])); + { + Interval x_ext = robust_relative_extent (number, commonx, X_AXIS); + Interval y_ext = robust_relative_extent (number, commony, Y_AXIS); + points.push_back (Offset (x_ext.center () - x0, y_ext[dir])); + } } if (to_boolean (me->get_property ("avoid-scripts")) @@ -652,11 +654,13 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) // assume that if a script is avoiding slurs, it should not get placed // under a tuplet bracket - if (unsmob_grob (scripts[i]->get_object ("slur"))) + if (unsmob (scripts[i]->get_object ("slur"))) continue; - Interval script_x (scripts[i]->extent (commonx, X_AXIS)); - Interval script_y (scripts[i]->extent (commony, Y_AXIS)); + Interval script_x + = robust_relative_extent (scripts[i], commonx, X_AXIS); + Interval script_y + = robust_relative_extent (scripts[i], commony, Y_AXIS); points.push_back (Offset (script_x.center () - x0, script_y[dir])); @@ -702,7 +706,7 @@ MAKE_SCHEME_CALLBACK (Tuplet_bracket, calc_direction, 1); SCM Tuplet_bracket::calc_direction (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); Direction dir = Tuplet_bracket::get_default_dir (me); return scm_from_int (dir); } @@ -711,7 +715,7 @@ MAKE_SCHEME_CALLBACK (Tuplet_bracket, calc_positions, 1); SCM Tuplet_bracket::calc_positions (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Real dy = 0.0; Real offset = 0.0; @@ -788,7 +792,7 @@ MAKE_SCHEME_CALLBACK (Tuplet_bracket, calc_cross_staff, 1); SCM Tuplet_bracket::calc_cross_staff (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); extract_grob_set (me, "note-columns", cols); extract_grob_set (me, "tuplets", tuplets); @@ -807,7 +811,7 @@ Tuplet_bracket::calc_cross_staff (SCM smob) for (vsize i = 0; i < cols.size (); i++) { - Grob *stem = unsmob_grob (cols[i]->get_object ("stem")); + Grob *stem = unsmob (cols[i]->get_object ("stem")); if (stem && to_boolean (stem->get_property ("cross-staff"))) return SCM_BOOL_T; } @@ -838,6 +842,7 @@ ADD_INTERFACE (Tuplet_bracket, "note-columns " "padding " "tuplet-number " + "scripts " "shorten-pair " "staff-padding " "thickness " diff --git a/lily/tuplet-engraver.cc b/lily/tuplet-engraver.cc index 1fc30d898a..92e018aece 100644 --- a/lily/tuplet-engraver.cc +++ b/lily/tuplet-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys + Copyright (C) 1998--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -63,17 +63,16 @@ protected: vector stopped_tuplets_; vector last_tuplets_; - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_ACKNOWLEDGER (script); - DECLARE_ACKNOWLEDGER (finger); - DECLARE_ACKNOWLEDGER (string_number); - DECLARE_TRANSLATOR_LISTENER (tuplet_span); + void acknowledge_note_column (Grob_info); + void acknowledge_script (Grob_info); + void acknowledge_finger (Grob_info); + void acknowledge_string_number (Grob_info); + void listen_tuplet_span (Stream_event *); virtual void finalize (); void start_translation_timestep (); void process_music (); }; -IMPLEMENT_TRANSLATOR_LISTENER (Tuplet_engraver, tuplet_span); void Tuplet_engraver::listen_tuplet_span (Stream_event *ev) { @@ -138,7 +137,7 @@ Tuplet_engraver::process_music () if (stopped_tuplets_[i].full_length_) { Item *col - = unsmob_item (stopped_tuplets_[i].full_length_note_ + = unsmob (stopped_tuplets_[i].full_length_note_ ? get_property ("currentMusicalColumn") : get_property ("currentCommandColumn")); @@ -263,7 +262,7 @@ Tuplet_engraver::finalize () if (to_boolean (get_property ("tupletFullLength"))) for (vsize i = 0; i < last_tuplets_.size (); i++) { - Item *col = unsmob_item (get_property ("currentCommandColumn")); + Item *col = unsmob (get_property ("currentCommandColumn")); last_tuplets_[i]->set_bound (RIGHT, col); } } @@ -272,10 +271,16 @@ Tuplet_engraver::Tuplet_engraver () { } -ADD_ACKNOWLEDGER (Tuplet_engraver, note_column); -ADD_ACKNOWLEDGER (Tuplet_engraver, script); -ADD_ACKNOWLEDGER (Tuplet_engraver, finger); -ADD_ACKNOWLEDGER (Tuplet_engraver, string_number); +void +Tuplet_engraver::boot () +{ + ADD_LISTENER (Tuplet_engraver, tuplet_span); + ADD_ACKNOWLEDGER (Tuplet_engraver, note_column); + ADD_ACKNOWLEDGER (Tuplet_engraver, script); + ADD_ACKNOWLEDGER (Tuplet_engraver, finger); + ADD_ACKNOWLEDGER (Tuplet_engraver, string_number); +} + ADD_TRANSLATOR (Tuplet_engraver, /* doc */ "Catch tuplet events and generate appropriate bracket.", diff --git a/lily/tuplet-iterator.cc b/lily/tuplet-iterator.cc index bf9a223684..c43e630c43 100644 --- a/lily/tuplet-iterator.cc +++ b/lily/tuplet-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Han-Wen Nienhuys , + Copyright (C) 1998--2015 Han-Wen Nienhuys , Erik Sandberg LilyPond is free software: you can redistribute it and/or modify @@ -24,6 +24,7 @@ #include "music.hh" #include "music-wrapper-iterator.hh" #include "stream-event.hh" +#include "lily-imports.hh" /* Iterates \times, by sending TupletSpanEvents at the start/end of each @@ -62,13 +63,12 @@ private: Music * Tuplet_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)); + SCM ev_scm = Lily::make_span_event (ly_symbol2scm ("TupletSpanEvent"), + scm_from_int (d)); Music *mus = get_music (); - Music *ev = unsmob_music (ev_scm); + Music *ev = unsmob (ev_scm); ev->set_spot (*mus->origin ()); if (d == START) { @@ -109,6 +109,8 @@ Tuplet_iterator::process (Moment m) if (m.main_part_ < music_get_length ().main_part_) { + spanner_duration_ = + min (music_get_length () - next_split_mom_, spanner_duration_); tuplet_handler_.set_context (get_outlet ()); report_event (create_event (START)); @@ -126,17 +128,13 @@ Tuplet_iterator::process (Moment m) void Tuplet_iterator::construct_children () { - if (Duration *d = unsmob_duration (get_music ()->get_property ("duration"))) + if (Duration *d = unsmob (get_music ()->get_property ("duration"))) spanner_duration_ = d->get_length (); + else if (Moment *mp + = unsmob (get_outlet ()->get_property ("tupletSpannerDuration"))) + spanner_duration_ = mp->main_part_; else - { - spanner_duration_ = music_get_length (); - - Moment *mp - = unsmob_moment (get_outlet ()->get_property ("tupletSpannerDuration")); - if (mp) - spanner_duration_ = min (mp->main_part_, spanner_duration_); - } + spanner_duration_.set_infinite (1); Music_wrapper_iterator::construct_children (); diff --git a/lily/tuplet-number.cc b/lily/tuplet-number.cc index 69e97afef0..99e61b2ff5 100644 --- a/lily/tuplet-number.cc +++ b/lily/tuplet-number.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -18,30 +18,203 @@ along with LilyPond. If not, see . */ +#include "tuplet-number.hh" #include "tuplet-bracket.hh" -#include "moment.hh" +#include "moment.hh" // needed? #include "paper-column.hh" #include "text-interface.hh" #include "spanner.hh" #include "lookup.hh" +#include "pointer-group-interface.hh" +#include "staff-symbol-referencer.hh" +#include "axis-group-interface.hh" +#include "directional-element-interface.hh" +#include "note-column.hh" +#include "beam.hh" +#include "stem.hh" +#include "warn.hh" -struct Tuplet_number +/* + The reference stem is used to determine on which side of the beam to place + the tuplet number when it is positioned independently of a bracket. (The number + is always placed on the opposite side of this stem.) +*/ +Grob * +Tuplet_number::select_reference_stem (Grob *me_grob, vector const &cols) +{ + Spanner *me = dynamic_cast (me_grob); + + int col_count = cols.size (); + + if (!col_count) + return 0; + + /* + When we have an odd number of stems, we choose the middle stem as + our reference. + */ + Grob *ref_stem = Note_column::get_stem (cols[col_count / 2]); + + if (col_count % 2 == 1) + return ref_stem; + + /* + When we have an even number of stems, we choose between the central + two stems. + */ + Direction me_dir = robust_scm2dir (me->get_property ("direction"), UP); + Drul_array bounding_stems (Note_column::get_stem (cols[col_count / 2 - 1]), + Note_column::get_stem (cols[col_count / 2])); + + for (LEFT_and_RIGHT (d)) + if (!bounding_stems[d]) + return bounding_stems[-d]; + + /* + If the central stems point in opposite directions, the number may + be placed on either side unless there is a fractional beam, in which + case the number goes opposite to the partial beam. + + When there is an option, we use the setting of TupletNumber.direction. + + If the central stems are in the same direction, it doesn't matter + which is used as the reference. We use the one on the left. + */ + Direction dir_left = get_grob_direction (bounding_stems[LEFT]); + Direction dir_right = get_grob_direction (bounding_stems[RIGHT]); + + if (dir_left == dir_right) + ref_stem = bounding_stems[LEFT]; + else + { + int beam_count_L_R = Stem::get_beaming (bounding_stems[LEFT], RIGHT); + int beam_count_R_L = Stem::get_beaming (bounding_stems[RIGHT], LEFT); + if (beam_count_L_R == beam_count_R_L) + ref_stem = (dir_left == me_dir) ? bounding_stems[LEFT] : bounding_stems[RIGHT]; + else + ref_stem = (beam_count_L_R > beam_count_R_L) + ? bounding_stems[LEFT] : bounding_stems[RIGHT]; + } + + return ref_stem; +} + +/* + When we place the number close to the beam, we need to consider the note + columns adjoining the tuplet number on the same side of the beam. The + number may not fit in the available space, or may need to be shifted + horizontally out of the way of stems and ledger lines. +*/ +Drul_array +Tuplet_number::adjacent_note_columns (Grob *me_grob, Grob *ref_stem) +{ + Spanner *me = dynamic_cast (me_grob); + Spanner *tuplet = unsmob (me->get_object ("bracket")); + + extract_grob_set (tuplet, "note-columns", columns); + Grob *ref_col = ref_stem->get_parent (X_AXIS); // X-parent of Stem = NoteColumn + Direction ref_stem_dir = get_grob_direction (ref_stem); + vector filtered_cols; + vsize ref_pos = 0; + + for (vsize i = 0, counter = 0; i < columns.size (); ++i) + { + Grob *stem = Note_column::get_stem (columns[i]); + if (stem && get_grob_direction (stem) == -ref_stem_dir) + { + filtered_cols.push_back (columns[i]); + ++counter; + } + if (columns[i] == ref_col) + { + filtered_cols.push_back (columns[i]); + ref_pos = counter; + } + } + + Drul_array adj_cols (0, 0); + + if (ref_pos > 0) + adj_cols[LEFT] = filtered_cols[ref_pos - 1]; + if (ref_pos < filtered_cols.size () - 1) + adj_cols[RIGHT] = filtered_cols[ref_pos + 1]; + + return adj_cols; +} + +/* + We determine whether our tuplet number will be put next to the beam + independently of the positioning of the associated tuplet bracket. + + Draw next to the beam if: + --bracket isn't visible, AND + --there is a beam above or below the number, AND + --this beam is kneed, AND + --the tuplet number will fit between adjoining note columns +*/ +bool +Tuplet_number::knee_position_against_beam (Grob *me_grob, Grob *ref_stem) { - DECLARE_SCHEME_CALLBACK (print, (SCM)); - DECLARE_SCHEME_CALLBACK (calc_x_offset, (SCM)); - DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM)); - DECLARE_SCHEME_CALLBACK (calc_cross_staff, (SCM)); - DECLARE_GROB_INTERFACE (); + Spanner *me = dynamic_cast (me_grob); + Spanner *tuplet = unsmob (me->get_object ("bracket")); + + bool bracket_visible = to_boolean (me->get_property ("bracket-visibility")) + || !tuplet->extent (tuplet, Y_AXIS).is_empty (); + + if (bracket_visible || !to_boolean (me->get_property ("knee-to-beam"))) + return false; + + Grob *beam = Stem::get_beam (ref_stem); + + if (!beam || !Beam::is_knee (beam)) + return false; + + Grob *commonx = Tuplet_bracket::get_common_x (tuplet); + commonx = commonx->common_refpoint (me, X_AXIS); + + Interval number_ext = me->extent (commonx, X_AXIS); - static Real calc_offset (Spanner *me, Axis a); -}; + Drul_array adj_cols = adjacent_note_columns (me, ref_stem); + + Item *left = me->get_bound (LEFT); + Item *right = me->get_bound (RIGHT); + + if (!left || !right) + return false; + + Drul_array bounds (left, right); + + Interval available_ext; + Real padding = robust_scm2double (me->get_property ("padding"), 0.5); + + /* + If there is no note column on a given side of the tuplet number, we use + a paper column instead to determine the available space. Padding is only + considered in the case of a note column. + */ + for (LEFT_and_RIGHT (d)) + { + if (adj_cols[d]) + available_ext[d] = Axis_group_interface::generic_bound_extent (adj_cols[d], commonx, X_AXIS)[-d] + (-d * padding); + else + available_ext[d] = Axis_group_interface::generic_bound_extent (bounds[d], commonx, X_AXIS)[-d]; + } + + if (number_ext.length () > available_ext.length ()) + { + programming_error ("not enough space for tuplet number against beam"); + return false; + } + + return true; +} MAKE_SCHEME_CALLBACK (Tuplet_number, print, 1); SCM Tuplet_number::print (SCM smob) { - Spanner *me = unsmob_spanner (smob); - Spanner *tuplet = unsmob_spanner (me->get_object ("bracket")); + Spanner *me = unsmob (smob); + Spanner *tuplet = unsmob (me->get_object ("bracket")); if (!tuplet || !tuplet->is_live ()) { @@ -50,7 +223,7 @@ Tuplet_number::print (SCM smob) } SCM stc_scm = Text_interface::print (smob); - Stencil *stc = unsmob_stencil (stc_scm); + Stencil *stc = unsmob (stc_scm); stc->align_to (X_AXIS, CENTER); stc->align_to (Y_AXIS, CENTER); @@ -58,36 +231,261 @@ Tuplet_number::print (SCM smob) return stc->smobbed_copy (); } +/* + For a given horizontal displacement of the tuplet number, how much + vertical shift is necessary to keep it the same distance from the beam? +*/ +Real +calc_beam_y_shift (Grob *ref_stem, Real dx) +{ + Grob *beam = Stem::get_beam (ref_stem); + Interval x_pos = robust_scm2interval (beam->get_property ("X-positions"), Interval (0.0, 0.0)); + Interval y_pos = robust_scm2interval (beam->get_property ("quantized-positions"), Interval (0.0, 0.0)); + Real beam_dx = x_pos.length (); + Real beam_dy = y_pos[RIGHT] - y_pos[LEFT]; + Real slope = beam_dx ? beam_dy / beam_dx : 0.0; + + return (slope * dx); +} + +/* + The X- and Y-offset of the tuplet number are calculated in relation either + to the bracket associated with it, or with the beam it is placed against. +*/ + MAKE_SCHEME_CALLBACK (Tuplet_number, calc_x_offset, 1); SCM Tuplet_number::calc_x_offset (SCM smob) { - Spanner *me = unsmob_spanner (smob); - Spanner *tuplet = unsmob_spanner (me->get_object ("bracket")); + Spanner *me = unsmob (smob); + + Item *left_bound = me->get_bound (LEFT); + Item *right_bound = me->get_bound (RIGHT); + Drul_array bounds (left_bound, right_bound); + + Spanner *tuplet = unsmob (me->get_object ("bracket")); + + Grob *commonx = Tuplet_bracket::get_common_x (tuplet); + commonx = commonx->common_refpoint (me, X_AXIS); + + Interval bound_poss; + + for (LEFT_and_RIGHT (d)) + { + if (has_interface (bounds[d]) + && Note_column::get_stem (bounds[d])) + bounds[d] = Note_column::get_stem (bounds[d]); + bound_poss[d] = Axis_group_interface::generic_bound_extent (bounds[d], commonx, X_AXIS)[-d]; + } + + extract_grob_set (tuplet, "note-columns", cols); + Grob *ref_stem = select_reference_stem (me, cols); + + /* + Return bracket-based positioning. + */ + if (!ref_stem + || !knee_position_against_beam (me, ref_stem)) + { + Interval x_positions; + x_positions = robust_scm2interval (tuplet->get_property ("X-positions"), + Interval (0.0, 0.0)); + return scm_from_double (x_positions.center ()); + } + + /* + Horizontally center the number on the beam. + */ + Real col_pos = left_bound->relative_coordinate (commonx, X_AXIS); + Real x_offset = bound_poss.center () - col_pos; - Interval x_positions = robust_scm2interval (tuplet->get_property ("X-positions"), Interval (0.0, 0.0)); + /* + Consider possible collisions with adjacent note columns. + */ + Drul_array adj_cols = adjacent_note_columns (me, ref_stem); + Interval number_ext = me->extent (commonx, X_AXIS); + number_ext.translate (x_offset); + Real padding = robust_scm2double (me->get_property ("padding"), 0.5); + number_ext.widen (padding); - return scm_from_double (x_positions.center ()); + Interval cor (0.0, 0.0); + + for (LEFT_and_RIGHT (d)) + if (adj_cols[d]) + { + Interval nc_ext = adj_cols[d]->extent (commonx, X_AXIS); + Interval overlap (nc_ext); + overlap.intersect (number_ext); + if (!overlap.is_empty ()) + cor[d] = overlap.length () * -d; + x_offset += cor[d]; + } + + return scm_from_double (x_offset); +} + +/* + When a number is placed against the beam (independently of a bracket), the + Y-extent of a reference stem is used to determine the vertical placement of + the number. When French beams are used the stem may not reach all beams. +*/ +int +count_beams_not_touching_stem (SCM beaming) +{ + int count = 0; + + for (SCM s = scm_car (beaming); scm_is_pair (s); s = scm_cdr (s)) + { + if (scm_is_true (ly_memv (scm_car (s), scm_cdr (beaming)))) + ++count; + } + + return max (0, count - 1); } MAKE_SCHEME_CALLBACK (Tuplet_number, calc_y_offset, 1); SCM Tuplet_number::calc_y_offset (SCM smob) { + Spanner *me = unsmob (smob); + Spanner *tuplet = unsmob (me->get_object ("bracket")); + Drul_array positions = robust_scm2drul (tuplet->get_property ("positions"), + Drul_array (0.0, 0.0)); + SCM to_bracket = scm_from_double ((positions[LEFT] + positions[RIGHT]) / 2.0); + + Grob *commonx = Tuplet_bracket::get_common_x (me); + commonx = commonx->common_refpoint (me, X_AXIS); + Real x_coord = me->relative_coordinate (commonx, X_AXIS); + extract_grob_set (tuplet, "note-columns", columns); + Grob *ref_stem = select_reference_stem (me, columns); + + if (!ref_stem || !knee_position_against_beam (me, ref_stem)) + return to_bracket; + + /* + First, we calculate the Y-offset of the tuplet number as if it + is positioned at the reference stem. + */ + Grob *commony = common_refpoint_of_array (columns, tuplet, Y_AXIS); + commony = commony->common_refpoint (me, Y_AXIS); + extract_grob_set (me, "tuplets", tuplets); + commony = common_refpoint_of_array (tuplets, commony, Y_AXIS); + if (Grob *st = Staff_symbol_referencer::get_staff_symbol (me)) + commony = st->common_refpoint (commony, Y_AXIS); + + Interval ref_stem_ext = ref_stem->extent (commony, Y_AXIS); + Real tuplet_y = tuplet->relative_coordinate (commony, Y_AXIS); + Direction ref_stem_dir = get_grob_direction (ref_stem); + + Real y_offset = ref_stem_ext[ref_stem_dir] - tuplet_y; + + /* + Additional displacement for French beaming. + */ + if (to_boolean (ref_stem->get_property ("french-beaming"))) + { + Grob *beam = Stem::get_beam (ref_stem); + Real beam_translation = Beam::get_beam_translation (beam); + SCM beaming = ref_stem->get_property ("beaming"); + y_offset += ref_stem_dir + * count_beams_not_touching_stem (beaming) + * beam_translation; + } + + Real padding = robust_scm2double (me->get_property ("padding"), 0.5); + Real num_height = me->extent (commony, Y_AXIS).length (); + + y_offset += ref_stem_dir * (padding + num_height / 2.0); + + /* + Now we adjust the vertical position of the number to reflect + its actual horizontal placement along the beam. + */ + Real ref_stem_x = ref_stem->relative_coordinate (commonx, X_AXIS); + y_offset += calc_beam_y_shift (ref_stem, x_coord - ref_stem_x); + + /* + Check if the number is between the beam and the staff. If so, it will collide + with ledger lines. Move it into the staff. + */ + if (Grob *st = Staff_symbol_referencer::get_staff_symbol (ref_stem)) + { + Interval staff_ext_y = st->extent (commony, Y_AXIS); + bool move = ref_stem_dir == DOWN + ? ref_stem_ext[DOWN] > staff_ext_y[UP] + : staff_ext_y[DOWN] > ref_stem_ext[UP]; + if (move) + { + Interval ledger_domain = Interval (min (staff_ext_y[UP], ref_stem_ext[UP]), + max (staff_ext_y[DOWN], ref_stem_ext[DOWN])); + Interval num_y (me->extent (commony, Y_AXIS)); + num_y.translate (y_offset); + Interval num_ledger_overlap (num_y); + num_ledger_overlap.intersect (ledger_domain); + Real line_thickness = Staff_symbol_referencer::line_thickness (st); + Real staff_space = Staff_symbol_referencer::staff_space (st); + // Number will touch outer staff line. + if (!num_ledger_overlap.is_empty () + && num_ledger_overlap.length () > (staff_space / 2.0) + && move) + y_offset += staff_ext_y[-ref_stem_dir] - num_y[-ref_stem_dir] + + line_thickness * ref_stem_dir; + } + } + + /* + Now consider possible collisions with accidentals on the right. We + move the accidental away from the beam. + */ + Drul_array adj_cols = adjacent_note_columns (me, ref_stem); + + if (!adj_cols[RIGHT]) + return scm_from_double (y_offset); + + /* + Collect Y-extents of accidentals that overlap the number + along the X-axis. + */ + extract_grob_set (adj_cols[RIGHT], "note-heads", heads); + Interval colliding_acc_ext_y; + + for (vsize i = 0; i < heads.size (); i++) + if (Grob *acc = unsmob (heads[i]->get_object ("accidental-grob"))) + { + commony = commony->common_refpoint (acc, Y_AXIS); + Interval acc_ext_y = acc->extent (commony, Y_AXIS); + + commonx = commonx->common_refpoint (acc, X_AXIS); + Interval num_ext_x = me->extent (commonx, X_AXIS); + num_ext_x.widen (padding); + Interval overlap_x (num_ext_x); + Interval acc_x = acc->extent (commonx, X_AXIS); + overlap_x.intersect (acc_x); + + if (!overlap_x.is_empty ()) + colliding_acc_ext_y.unite (acc_ext_y); + } + /* + Does our number intersect vertically with the accidental Y-extents we + combined above? If so, move it. + */ + Interval overlap_acc_y (colliding_acc_ext_y); + Interval num_ext_y (me->extent (commony, Y_AXIS)); + num_ext_y.translate (y_offset); + overlap_acc_y.intersect (num_ext_y); - Spanner *me = unsmob_spanner (smob); - Spanner *tuplet = unsmob_spanner (me->get_object ("bracket")); + if (!overlap_acc_y.is_empty ()) + y_offset += colliding_acc_ext_y[ref_stem_dir] - num_ext_y[-ref_stem_dir] + padding * ref_stem_dir; - Drul_array positions = robust_scm2drul (tuplet->get_property ("positions"), Drul_array (0.0, 0.0)); - return scm_from_double ((positions[LEFT] + positions[RIGHT]) / 2.0); + return scm_from_double (y_offset); } MAKE_SCHEME_CALLBACK (Tuplet_number, calc_cross_staff, 1) SCM Tuplet_number::calc_cross_staff (SCM smob) { - Grob *me = unsmob_grob (smob); - return unsmob_grob (me->get_object ("bracket"))->get_property ("cross-staff"); + Grob *me = unsmob (smob); + return unsmob (me->get_object ("bracket"))->get_property ("cross-staff"); } ADD_INTERFACE (Tuplet_number, @@ -97,5 +495,6 @@ ADD_INTERFACE (Tuplet_number, "avoid-slur " // UGH. "bracket " "direction " + "knee-to-beam " ); diff --git a/lily/tweak-engraver.cc b/lily/tweak-engraver.cc index a5d7ff68dd..5f97b1e4cb 100644 --- a/lily/tweak-engraver.cc +++ b/lily/tweak-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -29,7 +29,7 @@ class Tweak_engraver : public Engraver TRANSLATOR_DECLARATIONS (Tweak_engraver); protected: - DECLARE_ACKNOWLEDGER (grob); + void acknowledge_grob (Grob_info); }; Tweak_engraver::Tweak_engraver () @@ -60,7 +60,7 @@ Tweak_engraver::acknowledge_grob (Grob_info info) if (scm_is_symbol (scm_caaar (s))) { if (SCM_UNBNDP (grobname)) - grobname = scm_from_locale_symbol + grobname = scm_from_utf8_symbol (info.grob ()->name ().c_str ()); if (scm_is_eq (scm_caaar (s), grobname)) { @@ -81,7 +81,12 @@ Tweak_engraver::acknowledge_grob (Grob_info info) } } -ADD_ACKNOWLEDGER (Tweak_engraver, grob); +void +Tweak_engraver::boot () +{ + ADD_ACKNOWLEDGER (Tweak_engraver, grob); +} + ADD_TRANSLATOR (Tweak_engraver, /* doc */ "Read the @code{tweaks} property from the originating event," diff --git a/lily/undead.cc b/lily/undead.cc index b29386d2ce..4aed7a6023 100644 --- a/lily/undead.cc +++ b/lily/undead.cc @@ -18,41 +18,40 @@ */ #include "smobs.hh" -#include "ly-smobs.icc" -class Undead +class Undead : public Simple_smob { - DECLARE_SIMPLE_SMOBS (Undead); +public: + int print_smob (SCM, scm_print_state *) const; + SCM mark_smob () const; + static const char * const type_p_name_; +private: SCM object_; public: - SCM object () { return object_; } + SCM object () const { return object_; } Undead (SCM object = SCM_UNDEFINED) : object_ (object) { }; }; SCM -Undead::mark_smob (SCM s) +Undead::mark_smob () const { bool saved = parsed_objects_should_be_dead; parsed_objects_should_be_dead = false; - scm_gc_mark (Undead::unsmob (s)->object ()); + scm_gc_mark (object ()); parsed_objects_should_be_dead = saved; return SCM_UNDEFINED; } int -Undead::print_smob (SCM undead, - SCM port, - scm_print_state *) +Undead::print_smob (SCM port, scm_print_state *) const { scm_puts ("#object (), port); + scm_display (object (), port); scm_puts (" >", port); return 1; } -IMPLEMENT_SIMPLE_SMOBS (Undead); -IMPLEMENT_DEFAULT_EQUAL_P (Undead); -IMPLEMENT_TYPE_P (Undead, "ly:undead?") +const char * const Undead::type_p_name_ = "ly:undead?"; LY_DEFINE (ly_make_undead, "ly:make-undead", 1, 0, 0, (SCM object), @@ -68,7 +67,7 @@ LY_DEFINE (ly_get_undead, "ly:get-undead", "Get back object from @var{undead}.") { LY_ASSERT_SMOB (Undead, undead, 1); - return Undead::unsmob (undead)->object (); + return unsmob (undead)->object (); } // ' diff --git a/lily/unfolded-repeat-iterator.cc b/lily/unfolded-repeat-iterator.cc deleted file mode 100644 index 5924296d60..0000000000 --- a/lily/unfolded-repeat-iterator.cc +++ /dev/null @@ -1,63 +0,0 @@ -/* - This file is part of LilyPond, the GNU music typesetter. - - Copyright (C) 2002--2012 Han-Wen Nienhuys - - LilyPond is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - LilyPond is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with LilyPond. If not, see . -*/ - -#include "music.hh" -#include "sequential-iterator.hh" -#include "context.hh" - -class Unfolded_repeat_iterator : public Sequential_iterator -{ -public: - DECLARE_SCHEME_CALLBACK (constructor, ()); -protected: - virtual SCM get_music_list () const; -}; - -SCM -Unfolded_repeat_iterator::get_music_list () const -{ - SCM l = SCM_EOL; - SCM *tail = &l; - - SCM body = get_music ()->get_property ("element"); - SCM alts = get_music ()->get_property ("elements"); - int alt_count = scm_ilength (alts); - int rep_count = scm_to_int (get_music ()->get_property ("repeat-count")); - - for (int i = 0; i < rep_count; i++) - { - if (unsmob_music (body)) - *tail = scm_cons (body, SCM_EOL); - - tail = SCM_CDRLOC (*tail); - - if (alt_count) - { - *tail = scm_cons (scm_car (alts), SCM_EOL); - tail = SCM_CDRLOC (*tail); - if (i >= rep_count - alt_count) - - alts = scm_cdr (alts); - } - } - - return l; -} - -IMPLEMENT_CTOR_CALLBACK (Unfolded_repeat_iterator); diff --git a/lily/unpure-pure-container.cc b/lily/unpure-pure-container.cc index 9b2f871769..143b2fd47d 100644 --- a/lily/unpure-pure-container.cc +++ b/lily/unpure-pure-container.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2015 Mike Solomon LilyPond is free software: you can redistribute it and/or modify @@ -19,46 +19,33 @@ */ #include "unpure-pure-container.hh" -#include "grob.hh" - -static scm_t_bits unpure_pure_container_tag; -static scm_t_bits unpure_pure_call_tag; -// Used for rerouting a function of (grob start end) to one of -// (grob) - -bool -is_unpure_pure_container (SCM s) -{ - return (SCM_NIMP (s) && SCM_CELL_TYPE (s) == unpure_pure_container_tag); -} - -SCM -unpure_pure_container_unpure_part (SCM smob) +// Reroutes a call to the contained function after dropping second and +// third argument. Used for applying an "unpure" function in a "pure" +// context. +class Unpure_pure_call : public Smob1 { - LY_ASSERT_TYPE (is_unpure_pure_container, smob, 1); - return SCM_SMOB_OBJECT (smob); -} +public: + // Smob procedures unfortunately can only take at most 3 SCM + // arguments. Otherwise we could use a "3, 0, 1" call signature and + // not require an argument count check of our own. + LY_DECLARE_SMOB_PROC (&Unpure_pure_call::call, 2, 0, 1) + SCM call (SCM arg1, SCM, SCM rest) + { + if (!scm_is_pair (rest)) + scm_wrong_num_args (scm1 ()); + return scm_apply_1 (scm1 (), arg1, scm_cdr (rest)); + } +}; SCM -unpure_pure_container_pure_part (SCM smob) +Unpure_pure_container::pure_part () const { - LY_ASSERT_TYPE (is_unpure_pure_container, smob, 1); - SCM res = SCM_SMOB_OBJECT_2 (smob); - - if (!SCM_UNBNDP (res)) - return res; - - SCM_NEWSMOB (res, unpure_pure_call_tag, - SCM_UNPACK (unpure_pure_container_unpure_part (smob))); - return res; + return SCM_UNBNDP (scm2 ()) + ? Unpure_pure_call::make_smob (scm1 ()) + : scm2 (); } -LY_DEFINE (ly_unpure_pure_container_p, "ly:unpure-pure-container?", - 1, 0, 0, (SCM clos), - "Is @var{clos} an unpure pure container?") -{ - return scm_from_bool (is_unpure_pure_container (clos)); -} +const char * const Unpure_pure_container::type_p_name_ = "ly:unpure-pure-container?"; LY_DEFINE (ly_make_unpure_pure_container, "ly:make-unpure-pure-container", 1, 1, 0, (SCM unpure, SCM pure), @@ -68,76 +55,72 @@ LY_DEFINE (ly_make_unpure_pure_container, "ly:make-unpure-pure-container", " except that a callback is given two extra arguments" " that are ignored for the sake of pure calculations.") { - SCM z; - - if (SCM_UNBNDP (pure) && !ly_is_procedure (unpure)) - pure = unpure; - - SCM_NEWSMOB2 (z, unpure_pure_container_tag, SCM_UNPACK (unpure), SCM_UNPACK (pure)); - return z; + return Unpure_pure_container::make_smob (unpure, pure); } LY_DEFINE (ly_unpure_pure_container_unpure_part, "ly:unpure-pure-container-unpure-part", 1, 0, 0, (SCM pc), "Return the unpure part of @var{pc}.") { - LY_ASSERT_TYPE (is_unpure_pure_container, pc, 1); - return unpure_pure_container_unpure_part (pc); + LY_ASSERT_SMOB (Unpure_pure_container, pc, 1); + return unsmob (pc)->unpure_part (); } LY_DEFINE (ly_unpure_pure_container_pure_part, "ly:unpure-pure-container-pure-part", 1, 0, 0, (SCM pc), "Return the pure part of @var{pc}.") { - LY_ASSERT_TYPE (is_unpure_pure_container, pc, 1); - return unpure_pure_container_pure_part (pc); + LY_ASSERT_SMOB (Unpure_pure_container, pc, 1); + return unsmob (pc)->pure_part (); } int -print_unpure_pure_container (SCM s, SCM port, scm_print_state *) +Unpure_pure_container::print_smob (SCM port, scm_print_state *) const { scm_puts ("#", port); return 1; } -SCM -pure_mark (SCM smob) +LY_DEFINE (ly_pure_call, "ly:pure-call", + 4, 0, 1, (SCM data, SCM grob, SCM start, SCM end, SCM rest), + "Convert property @var{data} (unpure-pure container or procedure)" + " to value in a pure context defined by @var{grob}," + " @var{start}, @var{end}, and possibly @var{rest} arguments.") { - scm_gc_mark (SCM_SMOB_OBJECT (smob)); - return SCM_SMOB_OBJECT_2 (smob); -} - -// Function signature has two fixed arguments so that dropping two -// will always work: if we have fewer to start with, it will trigger -// wrong-number-of-args in a sensible location rather than making -// drop-right barf. - -SCM -apply_unpure_pure (SCM clo, SCM arg1, SCM arg2, SCM rest) -{ - return scm_apply_0 (SCM_SMOB_OBJECT (clo), - scm_call_2 (ly_lily_module_constant ("drop-right"), - scm_cons2 (arg1, arg2, rest), - scm_from_int (2))); + if (Unpure_pure_container *upc = unsmob (data)) + { + // Avoid gratuitous creation of an Unpure_pure_call + if (upc->is_unchanging ()) + data = upc->unpure_part (); + else + { + data = upc->pure_part (); + if (ly_is_procedure (data)) + return scm_apply_3 (data, grob, start, end, rest); + return data; + } + } + if (ly_is_procedure (data)) + return scm_apply_1 (data, grob, rest); + return data; } - -void init_unpure_pure_container () +LY_DEFINE (ly_unpure_call, "ly:unpure-call", + 2, 0, 1, (SCM data, SCM grob, SCM rest), + "Convert property @var{data} (unpure-pure container or procedure)" + " to value in an unpure context defined by @var{grob}" + " and possibly @var{rest} arguments.") { - unpure_pure_container_tag = scm_make_smob_type ("unpure-pure-container", 0); - scm_set_smob_mark (unpure_pure_container_tag, pure_mark); - scm_set_smob_print (unpure_pure_container_tag, print_unpure_pure_container); - unpure_pure_call_tag = scm_make_smob_type ("unpure-pure-call", 0); - scm_set_smob_mark (unpure_pure_call_tag, scm_markcdr); - scm_set_smob_apply (unpure_pure_call_tag, - (scm_t_subr) apply_unpure_pure, 2, 0, 1); -}; - -ADD_SCM_INIT_FUNC (unpure_pure_container, init_unpure_pure_container); + if (Unpure_pure_container *upc = unsmob (data)) + data = upc->unpure_part (); + if (ly_is_procedure (data)) + return scm_apply_1 (data, grob, rest); + return data; +} diff --git a/lily/vaticana-ligature-engraver.cc b/lily/vaticana-ligature-engraver.cc index 9b1485777c..6c34e9eb61 100644 --- a/lily/vaticana-ligature-engraver.cc +++ b/lily/vaticana-ligature-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Juergen Reuter + Copyright (C) 2003--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -77,29 +77,13 @@ private: public: TRANSLATOR_DECLARATIONS (Vaticana_ligature_engraver); - + TRANSLATOR_INHERIT (Gregorian_ligature_engraver); protected: virtual Spanner *create_ligature_spanner (); virtual void transform_heads (Spanner *ligature, vector const &primitives); - DECLARE_TRANSLATOR_LISTENER (pes_or_flexa); - DECLARE_TRANSLATOR_LISTENER (ligature); }; -IMPLEMENT_TRANSLATOR_LISTENER (Vaticana_ligature_engraver, pes_or_flexa); -void -Vaticana_ligature_engraver::listen_pes_or_flexa (Stream_event *ev) -{ - Gregorian_ligature_engraver::listen_pes_or_flexa (ev); -} - -IMPLEMENT_TRANSLATOR_LISTENER (Vaticana_ligature_engraver, ligature); -void -Vaticana_ligature_engraver::listen_ligature (Stream_event *ev) -{ - Ligature_engraver::listen_ligature (ev); -} - Vaticana_ligature_engraver::Vaticana_ligature_engraver () { brew_ligature_primitive_proc @@ -247,7 +231,7 @@ Vaticana_ligature_engraver::align_heads (vector const &primitives, */ SCM glyph_name_scm = primitive->get_property ("glyph-name"); - if (glyph_name_scm == SCM_EOL) + if (scm_is_null (glyph_name_scm)) { primitive->programming_error ("Vaticana_ligature:" " undefined glyph-name ->" @@ -260,7 +244,7 @@ Vaticana_ligature_engraver::align_heads (vector const &primitives, if (prev_primitive) /* urgh, need prev_primitive only here */ { SCM delta_pitch_scm = prev_primitive->get_property ("delta-position"); - if (delta_pitch_scm != SCM_EOL) + if (!scm_is_null (delta_pitch_scm)) delta_pitch = scm_to_int (delta_pitch_scm); else { @@ -455,11 +439,11 @@ Vaticana_ligature_engraver::check_for_ambiguous_dot_pitch (Grob_info primitive) // bitmask based O (1) test); where n= (which is typically small (n<10), though). Stream_event *new_cause = primitive.event_cause (); - int new_pitch = unsmob_pitch (new_cause->get_property ("pitch"))->steps (); + int new_pitch = unsmob (new_cause->get_property ("pitch"))->steps (); for (vsize i = 0; i < augmented_primitives_.size (); i++) { Stream_event *cause = augmented_primitives_[i].event_cause (); - int pitch = unsmob_pitch (cause->get_property ("pitch"))->steps (); + int pitch = unsmob (cause->get_property ("pitch"))->steps (); if (pitch == new_pitch) { primitive.grob ()-> @@ -491,7 +475,7 @@ Vaticana_ligature_engraver::transform_heads (Spanner *ligature, int delta_pitch; SCM delta_pitch_scm = primitive->get_property ("delta-position"); - if (delta_pitch_scm != SCM_EOL) + if (!scm_is_null (delta_pitch_scm)) delta_pitch = scm_to_int (delta_pitch_scm); else { @@ -741,8 +725,15 @@ Vaticana_ligature_engraver::transform_heads (Spanner *ligature, #endif } -ADD_ACKNOWLEDGER (Vaticana_ligature_engraver, rest); -ADD_ACKNOWLEDGER (Vaticana_ligature_engraver, ligature_head); +void +Vaticana_ligature_engraver::boot () +{ + ADD_LISTENER (Vaticana_ligature_engraver, pes_or_flexa); + ADD_LISTENER (Vaticana_ligature_engraver, ligature); + ADD_ACKNOWLEDGER (Vaticana_ligature_engraver, rest); + ADD_ACKNOWLEDGER (Vaticana_ligature_engraver, ligature_head); +} + ADD_TRANSLATOR (Vaticana_ligature_engraver, /* doc */ "Handle ligatures by glueing special ligature heads" diff --git a/lily/vaticana-ligature.cc b/lily/vaticana-ligature.cc index deb0218bd0..ddbe0d86bd 100644 --- a/lily/vaticana-ligature.cc +++ b/lily/vaticana-ligature.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2003--2012 Juergen Reuter + Copyright (C) 2003--2015 Juergen Reuter LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -86,7 +86,7 @@ vaticana_brew_flexa (Grob *me, Real interval; SCM flexa_height_scm = me->get_property ("flexa-height"); - if (flexa_height_scm != SCM_EOL) + if (!scm_is_null (flexa_height_scm)) interval = scm_to_int (flexa_height_scm); else { @@ -200,7 +200,7 @@ Stencil vaticana_brew_primitive (Grob *me) { SCM glyph_name_scm = me->get_property ("glyph-name"); - if (glyph_name_scm == SCM_EOL) + if (scm_is_null (glyph_name_scm)) { me->programming_error ("Vaticana_ligature: " "undefined glyph-name -> ignoring grob"); @@ -222,7 +222,7 @@ vaticana_brew_primitive (Grob *me) SCM delta_pitch_scm = me->get_property ("delta-position"); int delta_pitch; - if (delta_pitch_scm != SCM_EOL) + if (!scm_is_null (delta_pitch_scm)) delta_pitch = scm_to_int (delta_pitch_scm); else delta_pitch = 0; @@ -290,7 +290,7 @@ MAKE_SCHEME_CALLBACK (Vaticana_ligature, brew_ligature_primitive, 1); SCM Vaticana_ligature::brew_ligature_primitive (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob (smob); SCM primitive = vaticana_brew_primitive (me).smobbed_copy (); return primitive; } diff --git a/lily/vertical-align-engraver.cc b/lily/vertical-align-engraver.cc index 65cf6e7f77..0226173a2e 100644 --- a/lily/vertical-align-engraver.cc +++ b/lily/vertical-align-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,7 +37,7 @@ class Vertical_align_engraver : public Engraver public: TRANSLATOR_DECLARATIONS (Vertical_align_engraver); - DECLARE_ACKNOWLEDGER (axis_group); + void acknowledge_axis_group (Grob_info); protected: virtual void derived_mark () const; @@ -48,7 +48,12 @@ protected: bool top_level_; }; -ADD_ACKNOWLEDGER (Vertical_align_engraver, axis_group); +void +Vertical_align_engraver::boot () +{ + ADD_ACKNOWLEDGER (Vertical_align_engraver, axis_group); +} + ADD_TRANSLATOR (Vertical_align_engraver, /* doc */ "Catch groups (staves, lyrics lines, etc.) and stack them" @@ -100,7 +105,7 @@ Vertical_align_engraver::process_music () top_level_ = to_boolean (get_property ("topLevelAlignment")); valign_ = make_spanner (top_level_ ? "VerticalAlignment" : "StaffGrouper", SCM_EOL); - valign_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); + valign_->set_bound (LEFT, unsmob (get_property ("currentCommandColumn"))); Align_interface::set_ordered (valign_); } } @@ -110,7 +115,7 @@ Vertical_align_engraver::finalize () { if (valign_) { - valign_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + valign_->set_bound (RIGHT, unsmob (get_property ("currentCommandColumn"))); valign_ = 0; } } @@ -120,7 +125,7 @@ Vertical_align_engraver::qualifies (Grob_info i) const { int sz = i.origin_contexts ((Translator *)this).size (); - return sz > 0 && Axis_group_interface::has_interface (i.grob ()) + return sz > 0 && has_interface (i.grob ()) && !i.grob ()->get_parent (Y_AXIS) && !to_boolean (i.grob ()->get_property ("no-alignment")) && Axis_group_interface::has_axis (i.grob (), Y_AXIS); @@ -145,14 +150,14 @@ Vertical_align_engraver::acknowledge_axis_group (Grob_info i) SCM before = scm_hash_ref (id_to_group_hashtab_, before_id, SCM_BOOL_F); SCM after = scm_hash_ref (id_to_group_hashtab_, after_id, SCM_BOOL_F); - Grob *before_grob = unsmob_grob (before); - Grob *after_grob = unsmob_grob (after); + Grob *before_grob = unsmob (before); + Grob *after_grob = unsmob (after); Align_interface::add_element (valign_, i.grob ()); if (before_grob || after_grob) { - Grob_array *ga = unsmob_grob_array (valign_->get_object ("elements")); + Grob_array *ga = unsmob (valign_->get_object ("elements")); vector &arr = ga->array_reference (); Grob *added = arr.back (); @@ -182,7 +187,7 @@ Vertical_align_engraver::acknowledge_axis_group (Grob_info i) else if (qualifies (i)) { Pointer_group_interface::add_grob (valign_, ly_symbol2scm ("elements"), i.grob ()); - if (!unsmob_grob (i.grob ()->get_object ("staff-grouper"))) + if (!unsmob (i.grob ()->get_object ("staff-grouper"))) i.grob ()->set_object ("staff-grouper", valign_->self_scm ()); } } diff --git a/lily/volta-bracket.cc b/lily/volta-bracket.cc index 7b0fd13411..9ac2b44637 100644 --- a/lily/volta-bracket.cc +++ b/lily/volta-bracket.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Jan Nieuwenhuizen + Copyright (C) 1997--2015 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,6 +32,7 @@ using namespace std; #include "directional-element-interface.hh" #include "lookup.hh" #include "tuplet-bracket.hh" +#include "lily-imports.hh" /* this is too complicated. Yet another version of side-positioning, @@ -46,7 +47,7 @@ MAKE_SCHEME_CALLBACK (Volta_bracket_interface, print, 1); SCM Volta_bracket_interface::print (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Spanner *orig_span = dynamic_cast (me->original ()); bool broken_first_bracket = orig_span && (orig_span->broken_intos_[0] == (Spanner *)me); @@ -106,7 +107,7 @@ Volta_bracket_interface::print (SCM smob) SCM properties = me->get_property_alist_chain (SCM_EOL); SCM snum = Text_interface::interpret_markup (layout->self_scm (), properties, text); - Stencil num = *unsmob_stencil (snum); + Stencil num = *unsmob (snum); 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 () @@ -137,8 +138,8 @@ Volta_bracket_interface::modify_edge_height (Spanner *me) else str = "|"; - no_vertical_end |= ly_scm2bool (scm_call_1 (ly_lily_module_constant ("volta-bracket::calc-hook-visibility"), - ly_string2scm (str))); + no_vertical_end |= ly_scm2bool (Lily::volta_bracket_calc_hook_visibility + (ly_string2scm (str))); if (no_vertical_end || no_vertical_start) { diff --git a/lily/volta-engraver.cc b/lily/volta-engraver.cc index 882359621a..2f95ac7ac1 100644 --- a/lily/volta-engraver.cc +++ b/lily/volta-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2012 Han-Wen Nienhuys + Copyright (C) 2000--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -43,7 +43,7 @@ public: TRANSLATOR_DECLARATIONS (Volta_engraver); protected: - DECLARE_ACKNOWLEDGER (bar_line); + void acknowledge_bar_line (Grob_info); virtual void derived_mark () const; void stop_translation_timestep (); @@ -82,10 +82,10 @@ Volta_engraver::process_music () SCM c = scm_car (cs); if (scm_is_pair (c) - && scm_car (c) == ly_symbol2scm ("volta") + && scm_is_eq (scm_car (c), ly_symbol2scm ("volta")) && scm_is_pair (scm_cdr (c))) { - if (scm_cadr (c) == SCM_BOOL_F) + if (scm_is_false (scm_cadr (c))) end = true; else start_string_ = scm_cadr (c); @@ -99,8 +99,8 @@ Volta_engraver::process_music () SCM l (get_property ("voltaSpannerDuration")); Moment now = now_mom (); - bool early_stop = unsmob_moment (l) - && *unsmob_moment (l) <= now - started_mom_; + bool early_stop = unsmob (l) + && *unsmob (l) <= now - started_mom_; end = end || early_stop; } @@ -161,7 +161,7 @@ Volta_engraver::acknowledge_bar_line (Grob_info i) void Volta_engraver::stop_translation_timestep () { - Grob *cc = unsmob_grob (get_property ("currentCommandColumn")); + Grob *cc = unsmob (get_property ("currentCommandColumn")); Item *ci = dynamic_cast (cc); if (end_volta_bracket_ && !end_volta_bracket_->get_bound (RIGHT)) @@ -173,7 +173,7 @@ Volta_engraver::stop_translation_timestep () if (end_volta_bracket_ && !volta_bracket_) { for (SCM s = get_property ("stavesFound"); scm_is_pair (s); s = scm_cdr (s)) - Side_position_interface::add_support (volta_spanner_, unsmob_grob (scm_car (s))); + Side_position_interface::add_support (volta_spanner_, unsmob (scm_car (s))); volta_spanner_ = 0; } @@ -189,7 +189,12 @@ Volta_engraver::stop_translation_timestep () /* TODO: should attach volta to paper-column if no bar is found. */ -ADD_ACKNOWLEDGER (Volta_engraver, bar_line); +void +Volta_engraver::boot () +{ + ADD_ACKNOWLEDGER (Volta_engraver, bar_line); +} + ADD_TRANSLATOR (Volta_engraver, /* doc */ "Make volta brackets.", diff --git a/lily/volta-repeat-iterator.cc b/lily/volta-repeat-iterator.cc index 8dbc7b85e6..d126605795 100644 --- a/lily/volta-repeat-iterator.cc +++ b/lily/volta-repeat-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2002--2012 Han-Wen Nienhuys + Copyright (C) 2002--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +20,7 @@ #include "music.hh" #include "sequential-iterator.hh" #include "context.hh" +#include "lily-imports.hh" class Volta_repeat_iterator : public Sequential_iterator { @@ -33,17 +34,27 @@ protected: virtual void next_element (bool); virtual void construct_children (); virtual void process (Moment); + virtual void derived_mark () const; bool first_time_; int alt_count_; int rep_count_; int done_count_; + SCM alt_restores_; }; Volta_repeat_iterator::Volta_repeat_iterator () { done_count_ = alt_count_ = rep_count_ = 0; first_time_ = true; + alt_restores_ = SCM_EOL; +} + +void +Volta_repeat_iterator::derived_mark () const +{ + scm_gc_mark (alt_restores_); + Sequential_iterator::derived_mark (); } SCM @@ -75,8 +86,7 @@ Volta_repeat_iterator::add_repeat_command (SCM what) SCM current_reps = SCM_EOL; Context *where = get_outlet ()->where_defined (reps, ¤t_reps); - if (where - && (current_reps == SCM_EOL || scm_is_pair (current_reps))) + if (where && ly_cheap_is_list (current_reps)) { current_reps = scm_cons (what, current_reps); where->set_property (reps, current_reps); @@ -95,20 +105,51 @@ Volta_repeat_iterator::next_element (bool side_effect) if (alt_count_) { string repstr = ::to_string (rep_count_ - alt_count_ + done_count_) + "."; - if (done_count_ > 1) + if (done_count_ <= 1) { - add_repeat_command (scm_list_n (ly_symbol2scm ("volta"), SCM_BOOL_F, SCM_UNDEFINED)); + alt_restores_ = SCM_EOL; + if (to_boolean (get_outlet ()->get_property ("timing"))) + { + for (SCM lst = get_outlet ()->get_property ("alternativeRestores"); + scm_is_pair (lst); + lst = scm_cdr (lst)) + { + SCM res = SCM_EOL; + Context *t = get_outlet ()->where_defined (scm_car (lst), + &res); + if (t) + { + alt_restores_ = scm_cons + (scm_list_3 (t->self_scm (), scm_car (lst), res), + alt_restores_); + } + } + } + } + else + { + + add_repeat_command (scm_list_2 (ly_symbol2scm ("volta"), SCM_BOOL_F)); if (done_count_ - 1 < alt_count_) - add_repeat_command (ly_symbol2scm ("end-repeat")); + { + add_repeat_command (ly_symbol2scm ("end-repeat")); + + if (to_boolean (get_outlet ()->get_property ("timing"))) + { + for (SCM p = alt_restores_; scm_is_pair (p); p = scm_cdr (p)) + scm_apply_0 (Lily::ly_context_set_property_x, + scm_car (p)); + } + } } if (done_count_ == 1 && alt_count_ < rep_count_) repstr = "1.--" + ::to_string (rep_count_ - alt_count_ + done_count_) + "."; if (done_count_ <= alt_count_) - add_repeat_command (scm_list_n (ly_symbol2scm ("volta"), - ly_string2scm (repstr), SCM_UNDEFINED)); + add_repeat_command (scm_list_2 (ly_symbol2scm ("volta"), + ly_string2scm (repstr))); } else add_repeat_command (ly_symbol2scm ("end-repeat")); diff --git a/lily/warn-scheme.cc b/lily/warn-scheme.cc index c2449d164e..cd9efc9ad4 100644 --- a/lily/warn-scheme.cc +++ b/lily/warn-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2015 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify diff --git a/ly/Welcome-to-LilyPond-MacOS.ly b/ly/Welcome-to-LilyPond-MacOS.ly index a72c346f6b..fe8e3b02a7 100644 --- a/ly/Welcome-to-LilyPond-MacOS.ly +++ b/ly/Welcome-to-LilyPond-MacOS.ly @@ -23,12 +23,12 @@ That's it. For more information, visit http://lilypond.org . %} -\version "2.16.0" % necessary for upgrading to future LilyPond versions. +\version "2.19.45" % necessary for upgrading to future LilyPond versions. \header{ title = "A scale in LilyPond" } -\relative c' { - c d e f g a b c +\relative { + c' d e f g a b c } diff --git a/ly/Welcome_to_LilyPond.ly b/ly/Welcome_to_LilyPond.ly index 907ebf7830..cb4128f17f 100644 --- a/ly/Welcome_to_LilyPond.ly +++ b/ly/Welcome_to_LilyPond.ly @@ -32,7 +32,7 @@ Good luck with LilyPond! Happy engraving. %} -\version "2.16.0" % necessary for upgrading to future LilyPond versions. +\version "2.19.45" % necessary for upgrading to future LilyPond versions. \header{ title = "A scale in LilyPond" @@ -40,6 +40,6 @@ Good luck with LilyPond! Happy engraving. http://lilypond.org/introduction.html" } -\relative c' { - c d e f g a b c +\relative { + c' d e f g a b c } diff --git a/ly/arabic.ly b/ly/arabic.ly index 645b47ae68..ec637d316f 100644 --- a/ly/arabic.ly +++ b/ly/arabic.ly @@ -87,18 +87,18 @@ iraq = #`( \Score keyAlterationOrder = #`( - (6 . ,FLAT) (2 . ,FLAT) (5 . ,FLAT ) (1 . ,FLAT) - (4 . ,FLAT) (0 . ,FLAT) (3 . ,FLAT) - (6 . ,SEMI-FLAT) (2 . ,SEMI-FLAT) (5 . ,SEMI-FLAT ) (1 . ,SEMI-FLAT) - (4 . ,SEMI-FLAT) (0 . ,SEMI-FLAT) (3 . ,SEMI-FLAT) - (3 . ,SHARP) (0 . ,SHARP) (4 . ,SHARP) (1 . ,SHARP) - (5 . ,SHARP) (2 . ,SHARP) (6 . ,SHARP) - (3 . ,SEMI-SHARP) (0 . ,SEMI-SHARP) (4 . ,SEMI-SHARP) (1 . ,SEMI-SHARP) - (5 . ,SEMI-SHARP) (2 . ,SEMI-SHARP) (6 . ,SEMI-SHARP) - (6 . ,DOUBLE-FLAT) (2 . ,DOUBLE-FLAT) (5 . ,DOUBLE-FLAT ) (1 . ,DOUBLE-FLAT) - (4 . ,DOUBLE-FLAT) (0 . ,DOUBLE-FLAT) (3 . ,DOUBLE-FLAT) - (3 . ,DOUBLE-SHARP) (0 . ,DOUBLE-SHARP) (4 . ,DOUBLE-SHARP) (1 . ,DOUBLE-SHARP) - (5 . ,DOUBLE-SHARP) (2 . ,DOUBLE-SHARP) (6 . ,DOUBLE-SHARP) - ) + (6 . ,FLAT) (2 . ,FLAT) (5 . ,FLAT ) (1 . ,FLAT) + (4 . ,FLAT) (0 . ,FLAT) (3 . ,FLAT) + (6 . ,SEMI-FLAT) (2 . ,SEMI-FLAT) (5 . ,SEMI-FLAT ) (1 . ,SEMI-FLAT) + (4 . ,SEMI-FLAT) (0 . ,SEMI-FLAT) (3 . ,SEMI-FLAT) + (3 . ,SHARP) (0 . ,SHARP) (4 . ,SHARP) (1 . ,SHARP) + (5 . ,SHARP) (2 . ,SHARP) (6 . ,SHARP) + (3 . ,SEMI-SHARP) (0 . ,SEMI-SHARP) (4 . ,SEMI-SHARP) (1 . ,SEMI-SHARP) + (5 . ,SEMI-SHARP) (2 . ,SEMI-SHARP) (6 . ,SEMI-SHARP) + (6 . ,DOUBLE-FLAT) (2 . ,DOUBLE-FLAT) (5 . ,DOUBLE-FLAT ) (1 . ,DOUBLE-FLAT) + (4 . ,DOUBLE-FLAT) (0 . ,DOUBLE-FLAT) (3 . ,DOUBLE-FLAT) + (3 . ,DOUBLE-SHARP) (0 . ,DOUBLE-SHARP) (4 . ,DOUBLE-SHARP) (1 . ,DOUBLE-SHARP) + (5 . ,DOUBLE-SHARP) (2 . ,DOUBLE-SHARP) (6 . ,DOUBLE-SHARP) + ) } } diff --git a/ly/articulate.ly b/ly/articulate.ly index 6992c87ebd..0414bd926b 100644 --- a/ly/articulate.ly +++ b/ly/articulate.ly @@ -22,21 +22,57 @@ % replacing notes with sequential music of suitably time-scaled note plus % skip. % -% It also tries to unfold trills turns etc., and take rallentendo -% and accelerando into account. +% Trills, turns, mordents and pralls are expanded with rallentendo +% and accelerando taken into account. % % As my scheme knowledge is poor (I was teaching myself as I went), there % is much scope for improvement. +% See: http://nicta.com.au/people/chubbp/articulate for additional +% information about how the articulate function works. + +%%% Supported items: +% Articulations on a single note (staccato, staccatissimo, portato, tenuto). +% Slurs and phrasing slurs. +% Ornaments (i.e. mordents, trills, turns). +% Rallentando, accelerando, ritard and 'a tempo'. +% +% Please refer to 'MIDI output' (Section 3.5) in the Notation Reference +% Manual for a more detailed list of supported items. + +%%% Technical Details: +% * Any note not under a slur or phrasing slur, and not marked with an +% explicit articulation, is shortened by ac:normalFactor (default 7/8). +% (Shortening a note means replacing the note with a note of a smaller +% duration, and a rest to make up for the difference between the durations +% of the original and the shortened note.) +% * Notes marked with articulations are shortened by factors specific to the +% articulation as follows: +% staccato not under a slur: ac:staccatoFactor (default 1/2) +% under a slur: ac:portatoFactor (default 3/4) +% staccatissimo ac:staccatissimoFactor (default 1/4) +% portato ac:portatoFactor (default 3/4) +% tenuto ac:tenutoFactor (default 1/1 - by default, notes marked +% tenuto are not shortened) +% * Appoggiaturas are made to take half the value of the note following, +% without taking dots into account (so in \appoggiatura c8 d2. the c +% will take the time of a crotchet). +% * Trills and turns are expanded. The algorithm tries to choose notes +% within the time of the current tempo that lead to each twiddle being +% around 1/8 seconds; this can be adjusted with the ac:maxTwiddleTime +% variable. +% * Rall, poco rall and a tempo are observed. It'd be fairly trivial to +% make accel. and stringendo and so on work too. + % %%%USAGE % In the \score section do: % \articulate << -% all the rest of the score +% all the rest of the score % >> % or use the lilywrap script. % -% TO DO (prioritised, the ones that'll make the most difference first) +% TO DO: % % * Dynamics. % * Fix quantisation for dynamics on single note (replace note @@ -64,12 +100,13 @@ % * Cope with more ornaments/articulations. % inverted-turns, etc. % -- accent needs better control of dynamics. -% -- Articulations: mezzo-staccato, portato. % -- Handling of generic ornaments (in lily, `\stopped'; in -% most early music: ornament this note (trill, turn -% or mordent as the player wishes)) +% most early music: ornament this note (trill, turn +% or mordent as the player wishes)) + % * Automatic gruppetto at end of trill; better handling of % initial/final grace notes on trill + % * Automatic ornaments. % * Spot cadences and ornament % * Look for quaver-dotted note for trills, for example. @@ -78,6 +115,13 @@ % * accidentals for trills and turns % CHANGELOG +% * Heikki Tauriainen: handle also the \portato articulation (both as an +% explicit articulation, and as the articulation to use for slurred +% notes marked \staccato). +% * David Kastrup: remove redefinitions of \afterGrace and \appoggiatura +% and let their actions be performed when \articulate is called by +% recognizing and replacing LilyPond's default code for these constructs. +% Cf issue 4517 in LilyPond's tracker. % * David Kastrup: basic 2.15.28 compatibility by using event-chord-wrap! % This should really be done by rewriting the code more thoroughly. % * From Iain Nicol: appoggiatura timings were out; add staccatissimo; fix @@ -89,7 +133,7 @@ % * Add Mordents (reported by Patrick Karl) % -\version "2.17.11" +\version "2.19.22" #(use-modules (srfi srfi-1)) #(use-modules (srfi srfi-11)) @@ -105,6 +149,10 @@ % How much to compress notes marked staccatissimo. #(define ac:staccatissimoFactor '(1 . 4)) +% Shortening factor for notes marked portato (or slurred notes marked +% staccato). +#(define ac:portatoFactor '(3 . 4)) + % And tenuto (if we ever implement time stealing, this should be >1.0) #(define ac:tenutoFactor '(1 . 1)) @@ -209,8 +257,8 @@ #t) (begin (if (any (lambda (z) (eq? 'NoteEvent (ly:music-property z 'name))) - (ly:music-property lastev 'elements)) - (ly:warning (_ "stealing the entirety of a note's time"))) + (ly:music-property lastev 'elements)) + (ly:warning (_ "stealing the entirety of a note's time"))) (set! (ly:music-property lastev 'elements) '()) (set! ac:eventsBackward (cdr ac:eventsBackward)) (ac:stealTimeBackward (- tosteal levlen)))))))) @@ -236,12 +284,12 @@ % Raise note one step in the current diatonic scale. #(define (ac:up note) (let* ((pitch (ly:music-property note 'pitch)) - (notename (ly:pitch-notename pitch)) - (new-notename (if (eq? notename 6) 0 (+ 1 notename))) - (alterations (ly:music-property ac:current-key 'pitch-alist)) - (new-alteration (cdr (assq new-notename alterations))) - (new-octave (if (eq? new-notename 0) (+ 1 (ly:pitch-octave pitch)) - (ly:pitch-octave pitch))) + (notename (ly:pitch-notename pitch)) + (new-notename (if (eq? notename 6) 0 (+ 1 notename))) + (alterations (ly:music-property ac:current-key 'pitch-alist)) + (new-alteration (cdr (assq new-notename alterations))) + (new-octave (if (eq? new-notename 0) (+ 1 (ly:pitch-octave pitch)) + (ly:pitch-octave pitch))) ) (set! (ly:music-property note 'pitch)(ly:make-pitch new-octave new-notename new-alteration)))) @@ -249,12 +297,12 @@ % Lower note one step in the current diatonic scale. #(define (ac:down note) (begin (let* ((pitch (ly:music-property note 'pitch)) - (notename (ly:pitch-notename pitch)) - (new-notename (if (eq? notename 0) 6 (- notename 1))) - (alterations (ly:music-property ac:current-key 'pitch-alist)) - (new-alteration (cdr (assq new-notename alterations))) - (new-octave (if (eq? new-notename 6) (- (ly:pitch-octave pitch) 1) - (ly:pitch-octave pitch))) + (notename (ly:pitch-notename pitch)) + (new-notename (if (eq? notename 0) 6 (- notename 1))) + (alterations (ly:music-property ac:current-key 'pitch-alist)) + (new-alteration (cdr (assq new-notename alterations))) + (new-octave (if (eq? new-notename 6) (- (ly:pitch-octave pitch) 1) + (ly:pitch-octave pitch))) ) (set! (ly:music-property note 'pitch)(ly:make-pitch new-octave new-notename new-alteration)))) ) @@ -293,11 +341,11 @@ % Used in afterGrace to mark all notes as tenuto, so they're not shortened #(define (ac:add-articulation type music) (music-map (lambda (m) - (if (eq? 'EventChord (ly:music-property m 'name)) - (set! (ly:music-property m 'elements) - (append (ly:music-property m 'elements) - (list (make-music 'ArticulationEvent 'articulation-type type))))) - m) + (if (eq? 'EventChord (ly:music-property m 'name)) + (set! (ly:music-property m 'elements) + (append (ly:music-property m 'elements) + (list (make-music 'ArticulationEvent 'articulation-type type))))) + m) music)) % Convert a long note to an equivalent set of short notes, tied together. @@ -308,17 +356,17 @@ #(define (ac:to128_disabled music) (if (or (eq? 'SkipEvent (ly:music-property music 'name)) - (eq? 'NoteEvent (ly:music-property music 'name))) + (eq? 'NoteEvent (ly:music-property music 'name))) (let* ((dur (ly:music-property music 'duration)) - (log2 (ly:duration-log dur)) - (shiftcount (- 6 log2)) - (lastm (ly:music-deep-copy (shift-duration-log music shiftcount 0)))) + (log2 (ly:duration-log dur)) + (shiftcount (- 6 log2)) + (lastm (ly:music-deep-copy (shift-duration-log music shiftcount 0)))) (set! (ly:music-property music 'elements) (cons (make-music 'TieEvent) (ly:music-property music 'elements))) (make-sequential-music (list - (make-repeat "unfold" (1- (expt 2 shiftcount)) - (make-sequential-music (list music)) '()) - lastm))) + (make-repeat "unfold" (1- (expt 2 shiftcount)) + (make-sequential-music (list music)) '()) + lastm))) music)) @@ -342,18 +390,16 @@ % If the music has a precomputed twiddletime (e.g., from \afterGrace) use that. #(define (ac:twiddletime music) (let* ((tr (filter (lambda (x) - (and (eq? 'ArticulationEvent (ly:music-property x 'name)) - (string= "trill" (ly:music-property x 'articulation-type)))) - (ly:music-property music 'elements))) - (pre-t (if (pair? tr) (ly:music-property (car tr) 'twiddle) - '())) - (t (ac:targetTwiddleTime))) + (and (eq? 'ArticulationEvent (ly:music-property x 'name)) + (string= "trill" (ly:music-property x 'articulation-type)))) + (ly:music-property music 'elements))) + (pre-t (if (pair? tr) (ly:music-property (car tr) 'twiddle) + '())) + (hemisemimom (ly:make-moment 1/64)) + (t (ac:targetTwiddleTime))) (if (ly:moment? pre-t) pre-t - (let loop ((len (ly:music-length music))) - (if (ly:momentexact - (round (/ (ly:moment-main-numerator c1) - (* 2 (ly:moment-main-denominator c1)))))) - (count (if (< c2 2) 2 c2))) + (orig-len (ly:music-length music)) + (t (ac:twiddletime music)) + (uppernote '()) + (note_moment (ly:moment-mul t (ly:make-moment 1/2))) + (c1 (ly:moment-div orig-len t)) + (c2 (inexact->exact + (round (/ (ly:moment-main-numerator c1) + (* 2 (ly:moment-main-denominator c1)))))) + (count (if (< c2 2) 2 c2))) (set! (ly:music-property music 'elements) (filter (lambda (y) (eq? 'NoteEvent (ly:music-property y 'name))) @@ -385,33 +431,45 @@ (ly:music-property uppernote 'elements))) (let* ((trillMusicElements - (let loop ((so_far (list uppernote music)) - (c count)) - (if (> c 1) - (loop (append (list (ly:music-deep-copy uppernote) (ly:music-deep-copy music)) so_far) (1- c)) - so_far))) - (trillMusic (make-sequential-music trillMusicElements)) - (newlen (ly:music-length trillMusic)) - (factor (ly:moment-div orig-len newlen))) + (let loop ((so_far (list uppernote music)) + (c count)) + (if (> c 1) + (loop (append (list (ly:music-deep-copy uppernote) (ly:music-deep-copy music)) so_far) (1- c)) + so_far))) + (trillMusic (make-sequential-music trillMusicElements)) + (newlen (ly:music-length trillMusic)) + (factor (ly:moment-div orig-len newlen))) (ly:music-compress trillMusic factor) ; accelerating the music seems to put lily into an infinite loop in ; its layout and midi engines. ; (let* ((realfactor (exp (* (/ 1.0 count) (log 0.75)))) -; (factor (ly:make-moment (inexact->exact (round (* 1024 realfactor))) -; 1024))) +; (factor (ly:make-moment (inexact->exact (round (* 1024 realfactor))) +; 1024))) ; (ac:accel trillMusic factor)) ))) + +% Copy music and strip articulations, ties, etc., for generating +% mordents etc. +#(define (ac:note-copy music) + "return a copy of music that is only notes, no articulations, ties, slurs etc" + (let ((new-music (ly:music-deep-copy music))) + (set! (ly:music-property new-music 'articulations) '()) + (set! (ly:music-property new-music 'elements) + (filter (lambda (y) (eq? 'NoteEvent (ly:music-property y 'name))) + (ly:music-property new-music 'elements))) + new-music)) + % % Generate a tempoChangeEvent and its associated property setting. % #(define (ac:tempoChange tempo) (make-sequential-music (list (make-music 'TempoChangeEvent - 'metronome-count - tempo - 'tempo-unit - (ly:make-duration 0 0 1/1)) + 'metronome-count + tempo + 'tempo-unit + (ly:make-duration 0 0 1/1)) (context-spec-music (make-property-set 'tempoWholesPerMinute tempo) 'Score)))) @@ -431,173 +489,179 @@ ((UnfoldedRepeatedMusic) (let ((body (ly:music-property m 'element)) - (altl (ly:music-property m 'elements)) - (rc (ly:music-property m 'repeat-count))) + (altl (ly:music-property m 'elements)) + (rc (ly:music-property m 'repeat-count))) (if (null? altl) - (make-sequential-music - (list-tabulate rc (lambda (i) (ly:music-deep-copy body)))) - (let ((ealtl (if (> (length altl) rc) (take altl rc) altl))) - (make-sequential-music - (apply append! - (append! - (list-tabulate - (- rc (length ealtl)) - (lambda (i) (list (ly:music-deep-copy body) (ly:music-deep-copy (car ealtl))))) - (map (lambda (alt) (list (ly:music-deep-copy body) alt)) ealtl)))))))) + (make-sequential-music + (list-tabulate rc (lambda (i) (ly:music-deep-copy body)))) + (let ((ealtl (if (> (length altl) rc) (take altl rc) altl))) + (make-sequential-music + (apply append! + (append! + (list-tabulate + (- rc (length ealtl)) + (lambda (i) (list (ly:music-deep-copy body) (ly:music-deep-copy (car ealtl))))) + (map (lambda (alt) (list (ly:music-deep-copy body) alt)) ealtl)))))))) ((EventChord) (let-values (((trem evl) - (partition (lambda (v) (eq? (ly:music-property v 'name) 'TremoloEvent)) - (ly:music-property m 'elements)))) + (partition (lambda (v) (eq? (ly:music-property v 'name) 'TremoloEvent)) + (ly:music-property m 'elements)))) (if (null? trem) - m - (let* - ((tremtype (ly:music-property (car trem) 'tremolo-type)) - (tremtype-log (1- (integer-length tremtype))) - (durev (find (lambda (v) (not (null? (ly:music-property v 'duration)))) evl)) - (totaldur (if durev (ly:music-property durev 'duration) (ly:make-duration tremtype-log 0 1))) - (tgt-nrep (/ (duration-visual-length totaldur) (duration-log-factor tremtype-log))) - (eff-nrep (max (truncate tgt-nrep) 1)) - (tremdur (ly:make-duration tremtype-log 0 - (* (/ tgt-nrep eff-nrep) (ly:duration-scale totaldur))))) - (or (and (= eff-nrep tgt-nrep) (= (ash 1 tremtype-log) tremtype)) - (ly:warning (_ "non-integer tremolo ~a:~a") - (duration->lily-string (duration-visual totaldur) #:force-duration #t #:time-scale 1) - tremtype)) - (for-each - (lambda (v) - (or (null? (ly:music-property v 'duration)) - (set! (ly:music-property v 'duration) tremdur))) - evl) - (set! (ly:music-property m 'elements) evl) - (make-sequential-music - (list-tabulate eff-nrep (lambda (i) (ly:music-deep-copy m)))))))) + m + (let* + ((tremtype (ly:music-property (car trem) 'tremolo-type)) + (tremtype-log (1- (integer-length tremtype))) + (durev (find (lambda (v) (not (null? (ly:music-property v 'duration)))) evl)) + (totaldur (if durev (ly:music-property durev 'duration) (ly:make-duration tremtype-log 0 1))) + (tgt-nrep (/ (duration-visual-length totaldur) (duration-log-factor tremtype-log))) + (eff-nrep (max (truncate tgt-nrep) 1)) + (tremdur (ly:make-duration tremtype-log 0 + (* (/ tgt-nrep eff-nrep) (ly:duration-scale totaldur))))) + (or (and (= eff-nrep tgt-nrep) (= (ash 1 tremtype-log) tremtype)) + (ly:warning (_ "non-integer tremolo ~a:~a") + (duration->lily-string (duration-visual totaldur) #:force-duration #t #:time-scale 1) + tremtype)) + (for-each + (lambda (v) + (or (null? (ly:music-property v 'duration)) + (set! (ly:music-property v 'duration) tremdur))) + evl) + (set! (ly:music-property m 'elements) evl) + (make-sequential-music + (list-tabulate eff-nrep (lambda (i) (ly:music-deep-copy m)))))))) ((MultiMeasureRestMusic) (make-sequential-music (list - (make-music 'BarCheck) - (make-music 'SkipMusic 'duration (ly:music-property m 'duration)) - (make-music 'BarCheck)))) + (make-music 'BarCheck) + (make-music 'SkipMusic 'duration (ly:music-property m 'duration)) + (make-music 'BarCheck)))) (else m))) (unfold-repeats music))) % If there's an articulation, use it. -% If in a slur, use (1 . 1) instead. +% If in a slur, use (1 . 1) instead (unless the note is marked staccato, +% in which case use ac:portatoFactor). % Treat phrasing slurs as slurs, but allow explicit articulation. -% (Maybe should treat staccato under a phrasing slur as mezzo-staccato?) % % Expect an EventChord. % % trills, turns, ornaments etc. are also treated as Articulations. % Split into two functions: % ac:getactions traverses the elements in the EventChord -% and calculates the parameters. +% and calculates the parameters. % ac:articulate-chord applies the actions to each NoteEvent in -% the EventChord. +% the EventChord. #(define (ac:getactions music) - (let loop ((factor ac:normalFactor) - (newelements '()) - (es (ly:music-property music 'elements)) - (actions '())) - (if (null? es) - (begin - (set! (ly:music-property music 'elements) (reverse newelements)) - (if - (not (any (lambda (m) (music-is-of-type? m 'rhythmic-event)) - newelements)) - actions - (append - (let ((st ac:stealForward)) - (if (= st 0) - '() - (begin - (set! ac:stealForward 0) - (list 'steal st)))) + (let ((at-end-of-slur #f)) + (let loop ((factor ac:normalFactor) + (newelements '()) + (es (ly:music-property music 'elements)) + (actions '())) + (if (null? es) + (begin + (set! (ly:music-property music 'elements) (reverse newelements)) + (if + (not (any (lambda (m) (music-is-of-type? m 'rhythmic-event)) + newelements)) actions - (cond - (ac:inTrill '(trill)) - ((and (eq? factor ac:normalFactor) (or ac:inSlur ac:inPhrasingSlur)) - (list 'articulation '(1 . 1))) - (else (list 'articulation factor)))))) - ; else part - (let ((e (car es)) - (tail (cdr es))) - (case (ly:music-property e 'name) - - ((BeamEvent) ; throw away beam events, or they'll be duplicated by turn or trill - (loop factor newelements tail actions)) - - ((LineBreakEvent FingeringEvent MarkEvent BreathingEvent TieEvent SkipEvent RestEvent) ; pass through some events. - (loop (cons 1 1) (cons e newelements) tail actions)) - - ((ArticulationEvent) - (let ((articname (ly:music-property e 'articulation-type))) - ; TODO: add more here - (cond - ((string= articname "staccato") - (loop ac:staccatoFactor newelements tail actions)) - ((string= articname "staccatissimo") - (loop ac:staccatissimoFactor newelements tail actions)) - ((string= articname "tenuto") - (loop ac:tenutoFactor newelements tail actions)) - ((string= articname "mordent") - (loop (cons 1 1) newelements tail (cons 'mordent actions))) - ((string= articname "prall") - (loop (cons 1 1) newelements tail (cons 'prall actions))) - ((string= articname "trill") - (loop (cons 1 1) newelements tail (cons 'trill actions))) - ((string= articname "turn") - (loop (cons 1 1) newelements tail (cons 'turn actions))) - (else (loop factor (cons e newelements) tail actions))))) - - ((TextScriptEvent) - (let ((t (ly:music-property e 'text))) - (if (not (string? t)) - (loop factor (cons e newelements) tail actions) - (begin - (cond - ((or - (string= t "rall") - (string= t "Rall") - (string= t "rit.") - (string= t "rall.")) - (loop factor (cons e newelements) tail (cons 'rall actions))) - ((or - (string= t "accelerando") - (string= t "accel") - (string= t "accel.")) - (loop factor (cons e newelements) tail (cons 'accel actions))) - ((or - (string= t "poco accel.")) - (loop factor (cons e newelements) tail (cons 'pocoAccel actions))) - ((or - (string= t "poco rall.") - (string= t "poco rit.")) - (loop factor (cons e newelements) tail (cons 'pocoRall actions))) - ((or (string= t "a tempo") - (string= t "tempo I")) - (loop factor (cons e newelements) tail (cons 'aTempo actions))) - (else (loop factor (cons e newelements) tail actions))))))) - - ((SlurEvent) - (let ((direction (ly:music-property e 'span-direction))) - (set! ac:inSlur (eq? direction -1)) - (loop factor newelements tail actions))) - - ((TrillSpanEvent) - (let ((direction (ly:music-property e 'span-direction))) - (set! ac:inTrill (eq? direction -1)) - (if ac:inTrill - (loop factor newelements tail (cons 'trill actions)) - (loop factor (cons e newelements) tail actions)))) - - ((PhrasingSlurEvent) - (let ((direction (ly:music-property e 'span-direction))) - (set! ac:inPhrasingSlur (eq? direction -1)) - (loop factor newelements tail actions))) - - (else (loop factor (cons e newelements) tail actions))))))) + (append + (let ((st ac:stealForward)) + (if (= st 0) + '() + (begin + (set! ac:stealForward 0) + (list 'steal st)))) + actions + (cond + (ac:inTrill '(trill)) + ((and (eq? factor ac:normalFactor) (or ac:inSlur ac:inPhrasingSlur)) + (list 'articulation '(1 . 1))) + ((and (eq? factor ac:staccatoFactor) (or ac:inSlur at-end-of-slur)) + (list 'articulation ac:portatoFactor)) + (else (list 'articulation factor)))))) + ; else part + (let ((e (car es)) + (tail (cdr es))) + (case (ly:music-property e 'name) + + ((BeamEvent) ; throw away beam events, or they'll be duplicated by turn or trill + (loop factor newelements tail actions)) + + ((LineBreakEvent FingeringEvent MarkEvent BreathingEvent TieEvent SkipEvent RestEvent) ; pass through some events. + (loop (cons 1 1) (cons e newelements) tail actions)) + + ((ArticulationEvent) + (let ((articname (ly:music-property e 'articulation-type))) + ; TODO: add more here + (cond + ((string= articname "staccato") + (loop ac:staccatoFactor newelements tail actions)) + ((string= articname "staccatissimo") + (loop ac:staccatissimoFactor newelements tail actions)) + ((string= articname "portato") + (loop ac:portatoFactor newelements tail actions)) + ((string= articname "tenuto") + (loop ac:tenutoFactor newelements tail actions)) + ((string= articname "mordent") + (loop (cons 1 1) newelements tail (cons 'mordent actions))) + ((string= articname "prall") + (loop (cons 1 1) newelements tail (cons 'prall actions))) + ((string= articname "trill") + (loop (cons 1 1) newelements tail (cons 'trill actions))) + ((string= articname "turn") + (loop (cons 1 1) newelements tail (cons 'turn actions))) + (else (loop factor (cons e newelements) tail actions))))) + + ((TextScriptEvent) + (let ((t (ly:music-property e 'text))) + (if (not (string? t)) + (loop factor (cons e newelements) tail actions) + (begin + (cond + ((or + (string= t "rall") + (string= t "Rall") + (string= t "rit.") + (string= t "rall.")) + (loop factor (cons e newelements) tail (cons 'rall actions))) + ((or + (string= t "accelerando") + (string= t "accel") + (string= t "accel.")) + (loop factor (cons e newelements) tail (cons 'accel actions))) + ((or + (string= t "poco accel.")) + (loop factor (cons e newelements) tail (cons 'pocoAccel actions))) + ((or + (string= t "poco rall.") + (string= t "poco rit.")) + (loop factor (cons e newelements) tail (cons 'pocoRall actions))) + ((or (string= t "a tempo") + (string= t "tempo I")) + (loop factor (cons e newelements) tail (cons 'aTempo actions))) + (else (loop factor (cons e newelements) tail actions))))))) + + ((SlurEvent) + (let ((direction (ly:music-property e 'span-direction))) + (set! ac:inSlur (eq? direction -1)) + (set! at-end-of-slur (eq? direction 1)) + (loop factor newelements tail actions))) + + ((TrillSpanEvent) + (let ((direction (ly:music-property e 'span-direction))) + (set! ac:inTrill (eq? direction -1)) + (if ac:inTrill + (loop factor newelements tail (cons 'trill actions)) + (loop factor (cons e newelements) tail actions)))) + + ((PhrasingSlurEvent) + (let ((direction (ly:music-property e 'span-direction))) + (set! ac:inPhrasingSlur (eq? direction -1)) + (loop factor newelements tail actions))) + + (else (loop factor (cons e newelements) tail actions)))))))) @@ -607,211 +671,192 @@ (ac:logEventsBackward (let loop ((actions (ac:getactions music))) (if (null? actions) - (if (ly:moment= steallen totallen) - (begin - (if (any (lambda (z) (eq? 'NoteEvent (ly:music-property z 'name))) - (ly:music-property music 'elements)) - (ly:warning (_ "stealing the entirety of a note's time"))) - (set! ac:stealForward (- steallen totallen)) - (make-sequential-music '())) - (begin - (ly:music-compress music (ly:make-moment (/ (- totallen steallen) totallen))) - (loop (cddr actions)))))) + (let + ((totallen (ly:moment-main (ly:music-length music))) + (steallen (cadr actions))) + (if (>= steallen totallen) + (begin + (if (any (lambda (z) (eq? 'NoteEvent (ly:music-property z 'name))) + (ly:music-property music 'elements)) + (ly:warning (_ "stealing the entirety of a note's time"))) + (set! ac:stealForward (- steallen totallen)) + (make-sequential-music '())) + (begin + (ly:music-compress music (ly:make-moment (/ (- totallen steallen) totallen))) + (loop (cddr actions)))))) ))))) ((eq? 'GraceMusic (ly:music-property music 'name)) (let ((first-ev (call-with-current-continuation - (lambda (yield-fev) - (music-map - (lambda (m) - (if (eq? 'EventChord (ly:music-property m 'name)) - (yield-fev m) - m)) - music) - #f)))) + (lambda (yield-fev) + (music-map + (lambda (m) + (if (eq? 'EventChord (ly:music-property m 'name)) + (yield-fev m) + m)) + music) + #f)))) (if first-ev (let ((fev-pos (find-tail (lambda (m) (eq? m first-ev)) ac:eventsBackward))) (if fev-pos - (set! ac:eventsBackward (cdr fev-pos)) - (ly:warning (_ "articulation of grace notes has gone awry")))))) + (set! ac:eventsBackward (cdr fev-pos)) + (ly:warning (_ "articulation of grace notes has gone awry")))))) (let* ((gmus (ly:music-compress (ly:music-property music 'element) - (ly:make-moment ac:defaultGraceFactor))) + (ly:make-moment ac:defaultGraceFactor))) (glen (ly:moment-main (ly:music-length gmus)))) (ac:stealTimeBackward (* glen ac:defaultGraceBackwardness)) (set! ac:stealForward (+ ac:stealForward (* glen (- 1 ac:defaultGraceBackwardness)))) @@ -819,14 +864,14 @@ ((memq (ly:music-property music 'name) '(BarCheck SkipMusic)) (let ((totallen (ly:moment-main (ly:music-length music))) - (steallen ac:stealForward)) + (steallen ac:stealForward)) (cond ((= steallen 0) (ac:logEventsBackward music)) ((< steallen totallen) (set! ac:stealForward 0) (ac:logEventsBackward - (ly:music-compress music (ly:make-moment (/ (- totallen steallen) totallen))))) + (ly:music-compress music (ly:make-moment (/ (- totallen steallen) totallen))))) (else (set! ac:stealForward (- steallen totallen)) (make-sequential-music '()))))) @@ -845,36 +890,101 @@ % At last ... here's the music function that applies all the above to a % score. -articulate = #(define-music-function (parser location music) - (ly:music?) - "Adjust times of note to add tenuto, staccato and +articulate = #(define-music-function (music) + (ly:music?) + "Adjust times of note to add tenuto, staccato and normal articulations. - " - (dynamic-wind - (lambda () - (set! ac:stealForward 0) - (set! ac:eventsBackward '())) - (lambda () - (music-map - ac:articulate-chord - (ac:unfoldMusic (event-chord-wrap! music parser)))) - (lambda () - (or (= ac:stealForward 0) - (begin - (ly:warning (_ "articulation failed to steal ~a note at end of music") ac:stealForward) - (set! ac:stealForward 0))) - (set! ac:eventsBackward '())))) - + " + (dynamic-wind + (lambda () + (set! ac:stealForward 0) + (set! ac:eventsBackward '())) + (lambda () + (music-map + ac:articulate-chord + (ac:startup-replacements music))) + (lambda () + (or (= ac:stealForward 0) + (begin + (ly:warning (_ "articulation failed to steal ~a note at end of music") ac:stealForward) + (set! ac:stealForward 0))) + (set! ac:eventsBackward '())))) + +#(define (ac:startup-replacements music) + (fold (lambda (f m) (f m)) + music + (list + event-chord-wrap! + ac:replace-aftergrace + ac:replace-appoggiatura + ac:unfoldMusic))) + +#(define (ac:replace-aftergrace music) + (map-some-music + (lambda (expr) + (with-music-match + (expr (music 'SimultaneousMusic + elements (?before-grace + (music 'SequentialMusic + elements ((music 'SkipMusic) + (music 'GraceMusic + element ?grace)))))) + (ac:aftergrace ?before-grace ?grace))) + music)) + +#(define (ac:replace-appoggiatura music) + ;; appoggiature are ugly to deal with since they require a main + ;; note following them. We only try dealing with this followership + ;; in sequential music + (map-some-music + (lambda (m) + (if (eq? 'SequentialMusic (ly:music-property m 'name)) + (pair-for-each + (lambda (elts) + (let ((expr (car elts)) + (main (and (pair? (cdr elts)) (cadr elts)))) + (and main + ;;stolen from define-music-display-methods + (with-music-match + (expr (music + 'GraceMusic + element (music + 'SequentialMusic + elements (?start + ?music + ?stop)))) + ;; we check whether ?start and ?stop look like + ;; startAppoggiaturaMusic stopAppoggiaturaMusic + (and (with-music-match (?start (music + 'SequentialMusic + elements ((music + 'EventChord + elements + ((music + 'SlurEvent + span-direction START)))))) + #t) + (with-music-match (?stop (music + 'SequentialMusic + elements ((music + 'EventChord + elements + ((music + 'SlurEvent + span-direction STOP)))))) + #t) + (let* ((app (ac:appoggiatura ?music main)) + (apps (ly:music-property app 'elements))) + (set-car! elts (car apps)) + (set-car! (cdr elts) (cadr apps)) + #f)))))) + (ly:music-property m 'elements))) + #f) + music)) % Override \afterGrace to be in terms of audio, not spacing. % Special handling for a gruppetto after a trill. -afterGrace = -#(define-music-function - (parser location main grace) - (ly:music? ly:music?) - - (set! main (event-chord-wrap! main parser)) - (set! grace (event-chord-wrap! grace parser)) +#(define (ac:aftergrace main grace) (let* ((main-length (ly:music-length main)) (grace-orig-length (ly:music-length grace)) @@ -884,11 +994,11 @@ afterGrace = (factor (ly:moment-div new-main-length main-length)) ) (map (lambda (y) (set! (ly:music-property y 'twiddle) gracelen)) - (filter (lambda (z) - (and - (eq? 'ArticulationEvent (ly:music-property z 'name)) - (string= "trill" (ly:music-property z 'articulation-type)))) - (ly:music-property main 'elements))) + (filter (lambda (z) + (and + (eq? 'ArticulationEvent (ly:music-property z 'name)) + (string= "trill" (ly:music-property z 'articulation-type)))) + (ly:music-property main 'elements))) (ac:add-articulation "tenuto" grace) (make-sequential-music (list (ly:music-compress main factor) (ly:music-compress grace grace-factor))))) @@ -896,17 +1006,13 @@ afterGrace = % or 1/3 if the note is dotted (i.e., half the undotted equivalent time) % Somewhere around the end of the 19th, start of 20th century the rules % changed, but my main interest is early music. -appoggiatura = -#(define-music-function (parser location grace main) - (ly:music? ly:music?) - (set! grace (event-chord-wrap! grace parser)) - (set! main (event-chord-wrap! main parser)) +#(define (ac:appoggiatura grace main) (let* ((maindur (ly:music-length main)) - (grace-orig-len (ly:music-length grace)) - (main-orig-len (ly:music-length main)) - (numerator (ly:moment-main-numerator maindur)) - (factor (if (eq? (remainder numerator 3) 0) - (ly:make-moment 1/3) (ly:make-moment 1/2)))) + (grace-orig-len (ly:music-length grace)) + (main-orig-len (ly:music-length main)) + (numerator (ly:moment-main-numerator maindur)) + (factor (if (eq? (remainder numerator 3) 0) + (ly:make-moment 1/3) (ly:make-moment 1/2)))) (ly:music-compress grace (ly:moment-mul factor (ly:moment-div main-orig-len grace-orig-len))) (ly:music-compress main (ly:moment-sub (ly:make-moment 1/1) factor)) @@ -918,4 +1024,3 @@ appoggiatura = (append (ly:music-property main 'elements) (list (make-music 'SlurEvent 'span-direction 1)))) (make-sequential-music (list grace main)))) - diff --git a/ly/bagpipe.ly b/ly/bagpipe.ly index 10a86c374d..bd10c59ebe 100644 --- a/ly/bagpipe.ly +++ b/ly/bagpipe.ly @@ -6,10 +6,12 @@ Sven Axelsson, the Murray Pipes & Drums of Gothenburg (http://www.murrays.nu) + Corrections and additions by Julia Meihoefer and Oliver Briede + $Id: bagpipe.ly,v 1.12 2006/03/16 14:39:46 hanwen Exp $ %} -\version "2.17.30" +\version "2.19.22" % Notes of the scale of the Great Highland Bagpipe. Extra high notes for bombarde. % Flat notes used mainly in some modern music. @@ -19,19 +21,22 @@ pitchnamesBagpipe = #`( (a . ,(ly:make-pitch 0 5 NATURAL)) (b . ,(ly:make-pitch 0 6 NATURAL)) (c . ,(ly:make-pitch 1 0 SHARP)) + (c-flat . ,(ly:make-pitch 1 0 FLAT)) (cflat . ,(ly:make-pitch 1 0 FLAT)) (d . ,(ly:make-pitch 1 1 NATURAL)) (e . ,(ly:make-pitch 1 2 NATURAL)) (f . ,(ly:make-pitch 1 3 SHARP)) + (f-flat . ,(ly:make-pitch 1 3 FLAT)) (fflat . ,(ly:make-pitch 1 3 FLAT)) (g . ,(ly:make-pitch 1 4 NATURAL)) + (g-flat . ,(ly:make-pitch 1 4 FLAT)) (gflat . ,(ly:make-pitch 1 4 FLAT)) (A . ,(ly:make-pitch 1 5 NATURAL)) (B . ,(ly:make-pitch 1 6 NATURAL)) (C . ,(ly:make-pitch 2 0 SHARP)) ) pitchnames = \pitchnamesBagpipe -#(ly:parser-set-note-names parser pitchnames) +#(ly:parser-set-note-names pitchnames) % Bagpipe music is written in something like D major. If we use % flattened notes, the flat should be shown on all instances. @@ -71,8 +76,9 @@ quarterBeaming = { \set Staff.beamExceptions = #'() } halfBeaming = { - \set Staff.beamExceptions = #'((end . (((1 . 8) . (4 4)) - ((1 . 12) . (3 3 3 3))))) + \set Staff.beamExceptions = + \beamExceptions { 8[ 8 8 8] | + \tuplet 3/2 { 8[ 8 8] 8[ 8 8] 8[ 8 8] 8[ 8 8] } } } % Reels are in allabreve time with half note beaming. @@ -88,10 +94,10 @@ marchTime = { } % Add appropriate tweaks needed for piping grace notes to look great. -stemspace = #(define-music-function (parser location extent) (pair?) #{ +stemspace = #(define-music-function (extent) (pair?) #{ \once \override Staff.Stem.X-extent = #extent #}) -pgrace = #(define-music-function (parser location notes) (ly:music?) #{ +pgrace = #(define-music-function (notes) (ly:music?) #{ \override Score.GraceSpacing.spacing-increment = #0 \override Score.Stem.beamlet-max-length-proportion = #'(0.5 . 0.5) \small \grace $notes \normalsize @@ -142,38 +148,41 @@ tdble = { \pgrace { A32[ e f] } } tdblf = { \pgrace { A32[ f g] } } tdblg = { \pgrace { A32[ g f] } } -% Shakes +% Shakes / Pele % A few of these can't really be played and are here only for consistency. shakea = { \pgrace { g32[ a e a G] } } shakeb = { \pgrace { g32[ b e b G] } } shakec = { \pgrace { g32[ c e c G] } } shaked = { \pgrace { g32[ d e d G] } } +wshaked = { \pgrace { g32[ d e d c] } } shakee = { \pgrace { g32[ e f e a] } } -shakef = { \pgrace { g32[ f g f a] } } +shakef = { \pgrace { g32[ f g f e] } } shakeg = { \pgrace { A32[ f g a] } } shakeA = { \pgrace { A32[ g A a] } } -% Half shakes -hshakea = { \pgrace { a32[ d a G] } } -hshakeb = { \pgrace { b32[ d b G] } } -hshakec = { \pgrace { c32[ d c G] } } +% Half shakes / Half Pele +hshakea = { \pgrace { a32[ e a G] } } +hshakeb = { \pgrace { b32[ e b G] } } +hshakec = { \pgrace { c32[ e c G] } } hshaked = { \pgrace { d32[ e d G] } } +whshaked = { \pgrace { d32[ e d c] } } hshakee = { \pgrace { e32[ f e a] } } -hshakef = { \pgrace { f32[ g f a] } } -hshakeg = { \pgrace { g32[ f g a] } } +hshakef = { \pgrace { f32[ g f e] } } +hshakeg = { \pgrace { g32[ A g f] } } hshakeA = { \pgrace { A32[ g A a] } } -% Thumb shakes -tshakea = { \pgrace { A32[ a d a G] } } -tshakeb = { \pgrace { A32[ b d b G] } } -tshakec = { \pgrace { A32[ c d c G] } } +% Thumb shakes / Thumb Peles +tshakea = { \pgrace { A32[ a e a G] } } +tshakeb = { \pgrace { A32[ b e b G] } } +tshakec = { \pgrace { A32[ c e c G] } } tshaked = { \pgrace { A32[ d e d G] } } +wtshaked = { \pgrace { A32[ d e d c] } } tshakee = { \pgrace { A32[ e f e a] } } -tshakef = { \pgrace { A32[ f g f a] } } -tshakeg = { \pgrace { A32[ f g a] } } +tshakef = { \pgrace { A32[ f g f e] } } +tshakeg = { \pgrace { A32[ g A g f] } } tshakeA = { \pgrace { A32[ g A a] } } -% Slurs +% Slurs / G - Grace Strike % A few of these can't really be played and are here only for consistency. slura = { \pgrace { g32[ a G] } } slurb = { \pgrace { g32[ b G] } } @@ -181,54 +190,58 @@ slurc = { \pgrace { g32[ c G] } } slurd = { \pgrace { g32[ d G] } } wslurd = { \pgrace { g32[ d c] } } slure = { \pgrace { g32[ e a] } } -slurf = { \pgrace { g32[ f a] } } +slurf = { \pgrace { g32[ f e] } } slurg = { \pgrace { A32[ f a] } } slurA = { \pgrace { f32[ a] } } -% Half slurs +% Half slurs / Half Strike hslura = { \pgrace { a32[ G] } } hslurb = { \pgrace { b32[ G] } } hslurc = { \pgrace { c32[ G] } } hslurd = { \pgrace { d32[ G] } } whslurd = { \pgrace { d32[ c] } } hslure = { \pgrace { e32[ a] } } -hslurf = { \pgrace { f32[ a] } } -hslurg = { \pgrace { g32[ a] } } +hslurf = { \pgrace { f32[ e] } } +hslurg = { \pgrace { g32[ f] } } hslurA = { \pgrace { A32[ a] } } -% Thumb slurs +% Thumb slurs / Thumb Strike tslura = { \pgrace { A32[ a G] } } tslurb = { \pgrace { A32[ b G] } } tslurc = { \pgrace { A32[ c G] } } tslurd = { \pgrace { A32[ d G] } } wtslurd = { \pgrace { A32[ d c] } } tslure = { \pgrace { A32[ e a] } } -tslurf = { \pgrace { A32[ f a] } } -tslurg = { \pgrace { A32[ f a] } } +tslurf = { \pgrace { A32[ f e] } } +tslurg = { \pgrace { A32[ g f] } } tslurA = { \pgrace { f32[ a] } } -% Catches -catcha = { \pgrace { a32[ G d G] } } -catchb = { \pgrace { b32[ G d G] } } -catchc = { \pgrace { c32[ G d G] } } -catchd = { \pgrace { d32[ G b G] } } -catche = { \pgrace { e32[ G d G] } } - -% G-grace catches -gcatcha = { \pgrace { g32[ a G d G] } } -gcatchb = { \pgrace { g32[ b G d G] } } -gcatchc = { \pgrace { g32[ c G d G] } } -gcatchd = { \pgrace { g32[ d G b G] } } -gcatche = { \pgrace { g32[ e G d G] } } +% Catches / Half Grip +catcha = { \pgrace { g32[ a G d G] } } +catchb = { \pgrace { g32[ b G d G] } } +catchc = { \pgrace { g32[ c G d G] } } +catchd = { \pgrace { g32[ d G d G] } } +wcatchd = { \pgrace { g32[ d G b G] } } +catche = { \pgrace { g32[ e G d G] } } + +% Half catches / G - Grace Grip +hcatcha = { \pgrace { a32[ G d G] } } +hcatchb = { \pgrace { b32[ G d G] } } +hcatchc = { \pgrace { c32[ G d G] } } +hcatchd = { \pgrace { d32[ G d G] } } +whcatchd = { \pgrace { d32[ G b G] } } +hcatche = { \pgrace { e32[ G d G] } } % Thumb catches tcatcha = { \pgrace { A32[ a G d G] } } tcatchb = { \pgrace { A32[ b G d G] } } tcatchc = { \pgrace { A32[ c G d G] } } -tcatchd = { \pgrace { A32[ d G b G] } } +tcatchd = { \pgrace { A32[ d G d G] } } +wtcatchd = { \pgrace { A32[ d G b G] } } tcatche = { \pgrace { A32[ e G d G] } } -% Triple strikes (BMW has them all, but I've never seen any but the A one used, so ...) +% Triple strikes +% Those that cannnot be played have been omitted. tripleA = { \pgrace { A32[ g A g A g] } } % Throws @@ -245,16 +258,16 @@ wbirl = { \pgrace { G32[ a G] } } gbirl = { \pgrace { g32[ a G a G] } } dbirl = { \pgrace { d32[ a G a G] } } -% Grips +% Grips / Leumluath grip = { \pgrace { G32[ d G] } } -dgrip = { \pgrace { G32[ b G] } } +bgrip = { \pgrace { G32[ b G] } } egrip = { \pgrace { G32[ e G] } } % Taorluaths taor = { \pgrace { G32[ d G e] } } taorjmd = { \pgrace { G32[ d a e] } } taorold = { \pgrace { G32[ d G a e] } } -dtaor = { \pgrace { G32[ b G e] } } +btaor = { \pgrace { G32[ b G e] } } Gtaor = { \pgrace { d32[ G e] } } taoramb = { \pgrace { G32[ d G b e] } } taoramc = { \pgrace { G32[ d G c e] } } diff --git a/ly/base-tkit.ly b/ly/base-tkit.ly new file mode 100644 index 0000000000..ba5982c122 --- /dev/null +++ b/ly/base-tkit.ly @@ -0,0 +1,117 @@ +%\version "2.19.22" + +%%% These are the general utility functions and storage +% used by the built-in templates and the template kits +% (tkits) supporting them. + +% TODO: these may be more sensibly (re)defined as a scm file + +#(define (get-id str) + "Return the identifier with the value str" + (ly:parser-lookup (string->symbol str))) + +#(define (make-id a b) + "Return the identifier formed from concatenating the + two strings provided as arguments." + (get-id (string-append a b))) + +#(define (cartesian a b) + "Return a list formed from concatenating every element + of list a with every element of list b (the cartesian + product a X b)." + (append-map + (lambda (x) + (map + (lambda (y) + (string-append x y)) + b)) + a)) + +#(define (define-missing-variables! ids) + "Check if each of the identifiers listed in the argument is + known to the parser. If any are not, define them and set + their value to #f" + (for-each + (lambda (id) + (define sym (string->symbol id)) + (if (null? (ly:parser-lookup sym)) + (ly:parser-define! sym #f))) + ids)) + +% Define the lists used to hold the names and +% component names which form the variable names +% used in the templates. These are populated by the +% set-music-definitions! procedure +% The variables defined here as empty lists will be provided +% by the template, and may be set to any values there. +#(define voice-prefixes '()) % eg "Soprano" +#(define all-music-names '()) % eg "SopranoMusic" +#(define lyrics-postfixes '()) % eg "Lyrics" +#(define lyrics-names '()) % eg "VerseOne" + +% Define the derived variables to be populated +#(define all-music-lyrics-names '()) % eg "SopranoLyrics" +#(define AllMusic (make-music 'SequentialMusic 'void #t)) +#(define KeepAlive AllMusic) % used to ensure voices don't terminate +#(define have-music #f) % -> #t when at least one music name + % contains music +#(define voice-postfixes + ;; These names are used verbatim in code, so may not be changed + '("InstrumentName" + "MidiInstrument" + "Music" + "ShortInstrumentName")) + +#(define variable-names + ;; These names are used verbatim in code, so may not be changed + '("Key" + "Layout" + "PianoDynamics" + "Time" + "TwoVoicesPerStaff")) + +% Define the predicates used in the tkits and templates +#(define (above-or-below? x) + (member x '("Above" "Below"))) + +#(define (up-or-down? x) + (member x '("Down" "Up" ""))) + +#(define (voice-prefix? x) + (member x voice-prefixes)) + +#(define (vocal-lyrics-or-verses? x) + (or (member x lyrics-postfixes) + (member x lyrics-names))) + + +#(define (set-music-definitions! prefixes lyr-postfixes lyr-names) + "Populate the name definitions and their derivatives + with the values provided by the calling template" + (set! voice-prefixes prefixes) + (append! variable-names lyr-names) + (set! all-music-names + (cartesian voice-prefixes '("Music"))) + (set! lyrics-postfixes lyr-postfixes) + (set! lyrics-names lyr-names) + (set! all-music-lyrics-names + (cartesian voice-prefixes (append + voice-postfixes + lyrics-postfixes))) + (define-missing-variables! (append + all-music-lyrics-names + variable-names)) + (set! AllMusic + (make-simultaneous-music + (filter ly:music? + (map + (lambda (x) + (get-id x)) + all-music-names)))) + (set! KeepAlive + (skip-of-length AllMusic)) + (set! have-music + (ly:moment +%%%% Copyright (C) 2010--2015 Valentin Villenave %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/chord-modifiers-init.ly b/ly/chord-modifiers-init.ly index 7f4ed21ad2..4f7483fc99 100644 --- a/ly/chord-modifiers-init.ly +++ b/ly/chord-modifiers-init.ly @@ -10,10 +10,10 @@ whiteTriangleMarkup = \markup { %% 2206 : delta from the symbol font. % #(ly:wide-char->utf-8 #x2206) - + %% up pointing triangle % #(ly:wide-char->utf-8 #x25B3) -} +} blackTriangleMarkup = \markup { \triangle ##t diff --git a/ly/chord-repetition-init.ly b/ly/chord-repetition-init.ly index 8cef710250..1e3c7ad105 100644 --- a/ly/chord-repetition-init.ly +++ b/ly/chord-repetition-init.ly @@ -1,5 +1,5 @@ %%% -*- Mode: Scheme -*- -\version "2.16.0" +\version "2.19.22" %{ Chord repetition behavior is not customizable in the parser. That is due to it usually being done by the toplevel music handler @@ -15,7 +15,7 @@ %} chordRepeats = -#(define-music-function (parser location event-types music) +#(define-music-function (event-types music) ((list? '()) ly:music?) "Walk through @var{music} putting the notes of the previous chord into repeat chords, as well as an optional list of @var{event-types} @@ -23,7 +23,7 @@ such as @code{#'(string-number-event)}." (expand-repeat-chords! (cons 'rhythmic-event event-types) music)) tabChordRepeats = -#(define-music-function (parser location event-types music) +#(define-music-function (event-types music) ((list? '()) ly:music?) "Walk through @var{music} putting the notes, fingerings and string numbers of the previous chord into repeat chords, as well as an @@ -34,8 +34,8 @@ optional list of @var{event-types} such as @code{#'(articulation-event)}." #}) tabChordRepetition = -#(define-void-function (parser location) () +#(define-void-function () () (_i "Include the string and fingering information in a chord repetition. This function is deprecated; try using @code{\\tabChordRepeats} instead.") - (ly:parser-define! parser '$chord-repeat-events - '(string-number-event fingering-event))) + (ly:parser-define! '$chord-repeat-events + '(string-number-event fingering-event))) diff --git a/ly/context-mods-init.ly b/ly/context-mods-init.ly index b57fd71337..a4064f4b32 100644 --- a/ly/context-mods-init.ly +++ b/ly/context-mods-init.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2011--2012 Han-Wen Nienhuys +%%%% Copyright (C) 2011--2015 Han-Wen Nienhuys %%%% Jan Nieuwenhuizen %%%% %%%% LilyPond is free software: you can redistribute it and/or modify @@ -23,3 +23,34 @@ RemoveEmptyStaves = \with { \description "Remove staves which are considered to be empty according to the list of interfaces set by @code{keepAliveInterfaces}." } + +RemoveAllEmptyStaves = \with { + \override VerticalAxisGroup.remove-empty = ##t + \override VerticalAxisGroup.remove-first = ##t + \description "Remove staves which are considered to be empty according +to the list of interfaces set by @code{keepAliveInterfaces}, including those +in the first system." +} + +inherit-acceptability = +#(define-void-function (to from) + (symbol? symbol?) + (_i "When used in an output definition, will modify all context +definitions such that context @var{to} is accepted as a child by all +contexts that also accept @var{from}.") + (let* ((module (current-module)) + (cmod (ly:make-context-mod))) + (ly:add-context-mod cmod (list 'accepts to)) + (if (output-module? module) + (module-map + (lambda (_sym var) + (if (variable-bound? var) + (let ((cdef (variable-ref var))) + (if (ly:context-def? cdef) + (let ((accepts (ly:context-def-lookup cdef 'accepts))) + (if (and (memq from accepts) + (not (memq to accepts))) + (variable-set! var + (ly:context-def-modify cdef cmod)))))))) + module) + (ly:parser-error (_ "Not in an output definition"))))) diff --git a/ly/declarations-init.ly b/ly/declarations-init.ly index f3f5eef668..5ce305aa5c 100644 --- a/ly/declarations-init.ly +++ b/ly/declarations-init.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 1996--2012 Han-Wen Nienhuys +%%%% Copyright (C) 1996--2015 Han-Wen Nienhuys %%%% Jan Nieuwenhuizen %%%% %%%% LilyPond is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ %%%% You should have received a copy of the GNU General Public License %%%% along with LilyPond. If not, see . -\version "2.17.25" +\version "2.19.22" %% named durations breve = #(ly:make-duration -1 0) @@ -28,7 +28,7 @@ maxima = #(ly:make-duration -3 0) %% default note names are dutch #(set! default-language "nederlands") -#(note-names-language parser default-language) +#(note-names-language default-language) \include "drumpitch-init.ly" \include "chord-modifiers-init.ly" diff --git a/ly/deutsch.ly b/ly/deutsch.ly index c7c626e211..427b8abb1e 100644 --- a/ly/deutsch.ly +++ b/ly/deutsch.ly @@ -1,7 +1,7 @@ %%%% common German names for notes %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2010--2012 Valentin Villenave +%%%% Copyright (C) 2010--2015 Valentin Villenave %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/drumpitch-init.ly b/ly/drumpitch-init.ly index 1d9385c4b1..05d1543644 100644 --- a/ly/drumpitch-init.ly +++ b/ly/drumpitch-init.ly @@ -151,90 +151,90 @@ drumPitchNames = (de . fivedown) ) -midiDrumPitches = #`( - (acousticbassdrum . ,(ly:make-pitch -3 6 NATURAL)) - (bassdrum . ,(ly:make-pitch -2 0 NATURAL)) - (hisidestick . ,(ly:make-pitch -3 6 DOUBLE-SHARP)) - (sidestick . ,(ly:make-pitch -2 0 SHARP)) - (losidestick . ,(ly:make-pitch -2 1 FLAT)) - (acousticsnare . ,(ly:make-pitch -2 1 NATURAL)) - (snare . ,(ly:make-pitch -2 2 DOUBLE-FLAT)) - (handclap . ,(ly:make-pitch -2 1 SHARP)) - (electricsnare . ,(ly:make-pitch -2 2 NATURAL)) - (lowfloortom . ,(ly:make-pitch -2 3 NATURAL)) - (closedhihat . ,(ly:make-pitch -2 3 SHARP)) - (hihat . ,(ly:make-pitch -2 4 FLAT)) - (highfloortom . ,(ly:make-pitch -2 4 NATURAL)) - (pedalhihat . ,(ly:make-pitch -2 4 SHARP)) - (lowtom . ,(ly:make-pitch -2 5 NATURAL)) - (openhihat . ,(ly:make-pitch -2 5 SHARP)) - (halfopenhihat . ,(ly:make-pitch -2 5 SHARP)) - (lowmidtom . ,(ly:make-pitch -2 6 NATURAL)) - (himidtom . ,(ly:make-pitch -1 0 NATURAL)) - (crashcymbala . ,(ly:make-pitch -1 0 SHARP)) - (crashcymbal . ,(ly:make-pitch -1 1 FLAT)) - (hightom . ,(ly:make-pitch -1 1 NATURAL)) - (ridecymbala . ,(ly:make-pitch -1 1 SHARP)) - (ridecymbal . ,(ly:make-pitch -1 2 FLAT)) - (chinesecymbal . ,(ly:make-pitch -1 2 NATURAL)) - (ridebell . ,(ly:make-pitch -1 3 NATURAL)) - (tambourine . ,(ly:make-pitch -1 3 SHARP)) - (splashcymbal . ,(ly:make-pitch -1 4 NATURAL)) - (cowbell . ,(ly:make-pitch -1 4 SHARP)) - (crashcymbalb . ,(ly:make-pitch -1 5 NATURAL)) - (vibraslap . ,(ly:make-pitch -1 5 SHARP)) - (ridecymbalb . ,(ly:make-pitch -1 6 NATURAL)) - (mutehibongo . ,(ly:make-pitch -1 6 SHARP)) - (hibongo . ,(ly:make-pitch 0 0 NATURAL)) - (openhibongo . ,(ly:make-pitch 0 1 DOUBLE-FLAT)) - (mutelobongo . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) - (lobongo . ,(ly:make-pitch 0 0 SHARP)) - (openlobongo . ,(ly:make-pitch 0 1 FLAT)) - (mutehiconga . ,(ly:make-pitch 0 1 NATURAL)) - (muteloconga . ,(ly:make-pitch 0 2 DOUBLE-FLAT)) - (openhiconga . ,(ly:make-pitch 0 1 SHARP)) - (hiconga . ,(ly:make-pitch 0 2 FLAT)) - (openloconga . ,(ly:make-pitch 0 1 DOUBLE-SHARP)) - (loconga . ,(ly:make-pitch 0 2 NATURAL)) - (hitimbale . ,(ly:make-pitch 0 3 NATURAL)) - (lotimbale . ,(ly:make-pitch 0 3 SHARP)) - (hiagogo . ,(ly:make-pitch 0 4 NATURAL)) - (loagogo . ,(ly:make-pitch 0 4 SHARP)) - (cabasa . ,(ly:make-pitch 0 5 NATURAL)) - (maracas . ,(ly:make-pitch 0 5 SHARP)) - (shortwhistle . ,(ly:make-pitch 0 6 NATURAL)) - (longwhistle . ,(ly:make-pitch 1 0 NATURAL)) - (shortguiro . ,(ly:make-pitch 1 0 SHARP)) - (longguiro . ,(ly:make-pitch 1 1 NATURAL)) - (guiro . ,(ly:make-pitch 1 0 DOUBLE-SHARP)) - (claves . ,(ly:make-pitch 1 1 SHARP)) - (hiwoodblock . ,(ly:make-pitch 1 2 NATURAL)) - (lowoodblock . ,(ly:make-pitch 1 3 NATURAL)) - (mutecuica . ,(ly:make-pitch 1 3 SHARP)) - (opencuica . ,(ly:make-pitch 1 4 NATURAL)) - (mutetriangle . ,(ly:make-pitch 1 4 SHARP)) - (triangle . ,(ly:make-pitch 1 4 DOUBLE-SHARP)) - (opentriangle . ,(ly:make-pitch 1 5 NATURAL)) - - ;; "transposing" pitches: - (oneup . ,(ly:make-pitch 0 1 NATURAL)) - (twoup . ,(ly:make-pitch 0 2 NATURAL)) - (threeup . ,(ly:make-pitch 0 3 NATURAL)) - (fourup . ,(ly:make-pitch 0 4 NATURAL)) - (fiveup . ,(ly:make-pitch 0 5 NATURAL)) - (onedown . ,(ly:make-pitch -1 6 NATURAL)) - (twodown . ,(ly:make-pitch -1 5 NATURAL)) - (threedown . ,(ly:make-pitch -1 4 NATURAL)) - (fourdown . ,(ly:make-pitch -1 3 NATURAL)) - (fivedown . ,(ly:make-pitch -1 2 NATURAL)) -) +midiDrumPitches = +#`((acousticbassdrum . ,(ly:make-pitch -3 6 NATURAL)) + (bassdrum . ,(ly:make-pitch -2 0 NATURAL)) + (hisidestick . ,(ly:make-pitch -3 6 DOUBLE-SHARP)) + (sidestick . ,(ly:make-pitch -2 0 SHARP)) + (losidestick . ,(ly:make-pitch -2 1 FLAT)) + (acousticsnare . ,(ly:make-pitch -2 1 NATURAL)) + (snare . ,(ly:make-pitch -2 2 DOUBLE-FLAT)) + (handclap . ,(ly:make-pitch -2 1 SHARP)) + (electricsnare . ,(ly:make-pitch -2 2 NATURAL)) + (lowfloortom . ,(ly:make-pitch -2 3 NATURAL)) + (closedhihat . ,(ly:make-pitch -2 3 SHARP)) + (hihat . ,(ly:make-pitch -2 4 FLAT)) + (highfloortom . ,(ly:make-pitch -2 4 NATURAL)) + (pedalhihat . ,(ly:make-pitch -2 4 SHARP)) + (lowtom . ,(ly:make-pitch -2 5 NATURAL)) + (openhihat . ,(ly:make-pitch -2 5 SHARP)) + (halfopenhihat . ,(ly:make-pitch -2 5 SHARP)) + (lowmidtom . ,(ly:make-pitch -2 6 NATURAL)) + (himidtom . ,(ly:make-pitch -1 0 NATURAL)) + (crashcymbala . ,(ly:make-pitch -1 0 SHARP)) + (crashcymbal . ,(ly:make-pitch -1 1 FLAT)) + (hightom . ,(ly:make-pitch -1 1 NATURAL)) + (ridecymbala . ,(ly:make-pitch -1 1 SHARP)) + (ridecymbal . ,(ly:make-pitch -1 2 FLAT)) + (chinesecymbal . ,(ly:make-pitch -1 2 NATURAL)) + (ridebell . ,(ly:make-pitch -1 3 NATURAL)) + (tambourine . ,(ly:make-pitch -1 3 SHARP)) + (splashcymbal . ,(ly:make-pitch -1 4 NATURAL)) + (cowbell . ,(ly:make-pitch -1 4 SHARP)) + (crashcymbalb . ,(ly:make-pitch -1 5 NATURAL)) + (vibraslap . ,(ly:make-pitch -1 5 SHARP)) + (ridecymbalb . ,(ly:make-pitch -1 6 NATURAL)) + (mutehibongo . ,(ly:make-pitch -1 6 SHARP)) + (hibongo . ,(ly:make-pitch 0 0 NATURAL)) + (openhibongo . ,(ly:make-pitch 0 1 DOUBLE-FLAT)) + (mutelobongo . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) + (lobongo . ,(ly:make-pitch 0 0 SHARP)) + (openlobongo . ,(ly:make-pitch 0 1 FLAT)) + (mutehiconga . ,(ly:make-pitch 0 1 NATURAL)) + (muteloconga . ,(ly:make-pitch 0 2 DOUBLE-FLAT)) + (openhiconga . ,(ly:make-pitch 0 1 SHARP)) + (hiconga . ,(ly:make-pitch 0 2 FLAT)) + (openloconga . ,(ly:make-pitch 0 1 DOUBLE-SHARP)) + (loconga . ,(ly:make-pitch 0 2 NATURAL)) + (hitimbale . ,(ly:make-pitch 0 3 NATURAL)) + (lotimbale . ,(ly:make-pitch 0 3 SHARP)) + (hiagogo . ,(ly:make-pitch 0 4 NATURAL)) + (loagogo . ,(ly:make-pitch 0 4 SHARP)) + (cabasa . ,(ly:make-pitch 0 5 NATURAL)) + (maracas . ,(ly:make-pitch 0 5 SHARP)) + (shortwhistle . ,(ly:make-pitch 0 6 NATURAL)) + (longwhistle . ,(ly:make-pitch 1 0 NATURAL)) + (shortguiro . ,(ly:make-pitch 1 0 SHARP)) + (longguiro . ,(ly:make-pitch 1 1 NATURAL)) + (guiro . ,(ly:make-pitch 1 0 DOUBLE-SHARP)) + (claves . ,(ly:make-pitch 1 1 SHARP)) + (hiwoodblock . ,(ly:make-pitch 1 2 NATURAL)) + (lowoodblock . ,(ly:make-pitch 1 3 NATURAL)) + (mutecuica . ,(ly:make-pitch 1 3 SHARP)) + (opencuica . ,(ly:make-pitch 1 4 NATURAL)) + (mutetriangle . ,(ly:make-pitch 1 4 SHARP)) + (triangle . ,(ly:make-pitch 1 4 DOUBLE-SHARP)) + (opentriangle . ,(ly:make-pitch 1 5 NATURAL)) + + ;; "transposing" pitches: + (oneup . ,(ly:make-pitch 0 1 NATURAL)) + (twoup . ,(ly:make-pitch 0 2 NATURAL)) + (threeup . ,(ly:make-pitch 0 3 NATURAL)) + (fourup . ,(ly:make-pitch 0 4 NATURAL)) + (fiveup . ,(ly:make-pitch 0 5 NATURAL)) + (onedown . ,(ly:make-pitch -1 6 NATURAL)) + (twodown . ,(ly:make-pitch -1 5 NATURAL)) + (threedown . ,(ly:make-pitch -1 4 NATURAL)) + (fourdown . ,(ly:make-pitch -1 3 NATURAL)) + (fivedown . ,(ly:make-pitch -1 2 NATURAL)) + ) #(for-each (lambda (k-v) (module-define! (current-module) - (car k-v) - (alist->hash-table (cdr k-v))) + (car k-v) + (alist->hash-table (cdr k-v))) ) '((drums-style . ( @@ -269,6 +269,40 @@ midiDrumPitches = #`( (ridecymbalb cross #f 5) )) + + (agostini-drums-style . + ((acousticbassdrum () #f -6) + (bassdrum () #f -5) + (sidestick cross #f 0) + (acousticsnare () #f 1) + (snare () #f 0) + (handclap triangle #f 0) + (electricsnare () #f 0) + (lowfloortom () #f -3) + (closedhihat cross #f 5) + (hihat cross #f 5) + (highfloortom () #f -2) + (pedalhihat cross #f -7) + (lowtom () #f -3) + (openhihat xcircle #f 5) + (halfopenhihat xcircle #f 5) + (lowmidtom () #f 2) + (himidtom () #f 3) + (crashcymbala cross #f 7) + (crashcymbal cross #f 8) + (hightom () #f 3) + (ridecymbala cross #f 6) + (ridecymbal cross #f 6) + (chinesecymbal mensural #f 6) + (ridebell mi #f 7) + (splashcymbal diamond #f 6) + (cowbell triangle #f 6) + (crashcymbalb cross #f 6) + (vibraslap diamond #f 4) + (ridecymbalb cross #f 7) + )) + + (timbales-style . ((losidestick cross #f -1) (lotimbale () #f -1) @@ -317,5 +351,3 @@ midiDrumPitches = #`( (handclap () #f 0) )) )) - - diff --git a/ly/dynamic-scripts-init.ly b/ly/dynamic-scripts-init.ly index 570197ed14..f66696f8f1 100644 --- a/ly/dynamic-scripts-init.ly +++ b/ly/dynamic-scripts-init.ly @@ -32,4 +32,3 @@ fz = #(make-dynamic-script "fz") sp = #(make-dynamic-script "sp") spp = #(make-dynamic-script "spp") rfz = #(make-dynamic-script "rfz") - diff --git a/ly/english.ly b/ly/english.ly index c0cadea621..3d18b2b645 100644 --- a/ly/english.ly +++ b/ly/english.ly @@ -1,7 +1,7 @@ %%%% common English names for notes %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2010--2012 Valentin Villenave +%%%% Copyright (C) 2010--2015 Valentin Villenave %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 4d002257fb..3637871a66 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 1996--2012 Han-Wen Nienhuys +%%%% Copyright (C) 1996--2015 Han-Wen Nienhuys %%%% Jan Nieuwenhuizen %%%% %%%% LilyPond is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ %%%% You should have received a copy of the GNU General Public License %%%% along with LilyPond. If not, see . -\version "2.17.29" +\version "2.19.19" \context { \name "Global" @@ -65,7 +65,7 @@ \consists "Dot_column_engraver" \consists "Staff_collecting_engraver" - %% perhaps move to Voice context? + %% perhaps move to Voice context? \consists "Ottava_spanner_engraver" \consists "Clef_engraver" \consists "Key_engraver" @@ -86,7 +86,7 @@ \consists "Cue_clef_engraver" \consists "Fingering_column_engraver" - localKeySignature = #'() + localAlterations = #'() createSpacing = ##t ignoreFiguredBassRest = ##f @@ -97,9 +97,9 @@ shortInstrumentName = #'() \defaultchild "Voice" - \accepts "Voice" \accepts "CueVoice" \accepts "NullVoice" + \accepts "Voice" \description "Handles clefs, bar lines, keys, accidentals. It can contain @code{Voice} contexts." @@ -144,15 +144,17 @@ vocalName = #'() shortVocalName = #'() - \accepts "Staff" + \accepts "ChoirStaff" + \accepts "ChordNames" \accepts "DrumStaff" - \accepts "RhythmicStaff" + \accepts "Dynamics" + \accepts "FiguredBass" \accepts "GrandStaff" - \accepts "PianoStaff" \accepts "Lyrics" - \accepts "ChordNames" - \accepts "FiguredBass" - \accepts "ChoirStaff" + \accepts "OneStaff" + \accepts "PianoStaff" + \accepts "RhythmicStaff" + \accepts "Staff" \accepts "StaffGroup" \defaultchild "Staff" \description "Identical to @code{StaffGroup} except that the @@ -162,11 +164,11 @@ contained staves are not connected vertically." \context{ \type "Engraver_group" - localKeySignature = #'() + localAlterations = #'() createSpacing = ##t squashedPosition = #0 - \name RhythmicStaff + \name "RhythmicStaff" \alias "Staff" \override VoltaBracket.staff-padding = #3 @@ -191,8 +193,9 @@ contained staves are not connected vertically." instrumentName = #'() shortInstrumentName = #'() - \accepts "Voice" \accepts "CueVoice" + \accepts "NullVoice" + \accepts "Voice" \defaultchild "Voice" \description "A context like @code{Staff} but for printing rhythms. @@ -210,7 +213,8 @@ subscripts, slurs, ties, and rests. You have to instantiate this explicitly if you want to have multiple voices on the same staff." - + %% Grace_engraver sets properties, it must come first. + \consists "Grace_engraver" \consists "Font_size_engraver" \consists "Pitched_trill_engraver" @@ -266,16 +270,16 @@ multiple voices on the same staff." \consists "Slur_engraver" \consists "Tie_engraver" \consists "Tuplet_engraver" - \consists "Grace_engraver" \consists "Instrument_switch_engraver" } \context{ \Voice - \name CueVoice - \alias Voice + \name "CueVoice" + \alias "Voice" fontSize = #-4 + \override NoteHead.ignore-ambitus = ##t \override Stem.length-fraction = #(magstep -4) \override Beam.length-fraction = #(magstep -4) \override Beam.beam-thickness = #0.35 @@ -283,8 +287,8 @@ multiple voices on the same staff." \context { \Voice - \name DrumVoice - \alias Voice + \name "DrumVoice" + \alias "Voice" \description "A voice on a percussion staff." \remove "Arpeggio_engraver" @@ -304,8 +308,8 @@ multiple voices on the same staff." \context{ \type "Engraver_group" - \name GrandStaff - localKeySignature = #'() + \name "GrandStaff" + localAlterations = #'() \description "A group of staves, with a brace on the left side, grouping the staves together. The bar lines of the @@ -313,6 +317,9 @@ contained staves are connected vertically." \consists "Instrument_name_engraver" \consists "Span_bar_engraver" + %% The default for DynamicText.extra-spacing-width causes dynamics to + %% be placed across span bars, so switch it off: + \override DynamicText.extra-spacing-width = ##f \consists "Span_bar_stub_engraver" \consists "Span_arpeggio_engraver" \consists "System_start_delimiter_engraver" @@ -324,14 +331,14 @@ contained staves are connected vertically." shortInstrumentName = #'() \defaultchild "Staff" - \accepts "Staff" - \accepts "RhythmicStaff" + \accepts "ChordNames" \accepts "DrumStaff" - \accepts "TabStaff" - \accepts "Lyrics" - \accepts "FiguredBass" \accepts "Dynamics" - \accepts "ChordNames" + \accepts "FiguredBass" + \accepts "Lyrics" + \accepts "RhythmicStaff" + \accepts "Staff" + \accepts "TabStaff" } \context{ @@ -359,6 +366,9 @@ together, never separately." \consists "Instrument_name_engraver" \consists "Span_bar_engraver" + %% The default for DynamicText.extra-spacing-width causes dynamics to + %% be placed across span bars, so switch it off: + \override DynamicText.extra-spacing-width = ##f \consists "Span_bar_stub_engraver" \consists "Span_arpeggio_engraver" \consists "Output_property_engraver" @@ -370,17 +380,19 @@ together, never separately." \consists "System_start_delimiter_engraver" \defaultchild "Staff" - \accepts "Staff" - \accepts "RhythmicStaff" + \accepts "ChoirStaff" + \accepts "ChordNames" \accepts "DrumStaff" + \accepts "FiguredBass" + \accepts "FretBoards" \accepts "GrandStaff" - \accepts "PianoStaff" - \accepts "TabStaff" \accepts "Lyrics" - \accepts "ChordNames" - \accepts "FiguredBass" - \accepts "ChoirStaff" + \accepts "OneStaff" + \accepts "PianoStaff" + \accepts "RhythmicStaff" + \accepts "Staff" \accepts "StaffGroup" + \accepts "TabStaff" \description "Groups staves while adding a bracket on the left side, grouping the staves together. The bar lines of the contained @@ -390,8 +402,37 @@ a collection of staves, with a bracket in front and spanning bar lines." \context { \type "Engraver_group" - \name Dynamics - \alias Voice + \name "OneStaff" + \accepts "ChordNames" + \accepts "DrumStaff" + \accepts "Dynamics" + \accepts "FiguredBass" + \accepts "FretBoards" + \accepts "GregorianTranscriptionStaff" + \accepts "KievanStaff" + \accepts "Lyrics" + \accepts "MensuralStaff" + \accepts "NoteNames" + \accepts "PetrucciStaff" + \accepts "RhythmicStaff" + \accepts "Staff" + \accepts "TabStaff" + \accepts "VaticanaStaff" + \defaultchild "Staff" + \consists "Axis_group_engraver" + + \description "Provides a common axis for the contained staves, +making all of them appear in the same vertical space. This can be +useful for typesetting staves of different types in immediate succession +or for temporarily changing the character of one staff or overlaying +it with a different one. Often used with @code{\\stopStaff} and +@code{\\startStaff} for best results." +} + +\context { + \type "Engraver_group" + \name "Dynamics" + \alias "Voice" \consists "Output_property_engraver" \consists "Bar_engraver" \consists "Piano_pedal_engraver" @@ -414,13 +455,6 @@ a collection of staves, with a bracket in front and spanning bar lines." \override DynamicLineSpanner.outside-staff-priority = ##f \override DynamicText.outside-staff-priority = ##f \override Hairpin.outside-staff-priority = ##f - \override DynamicText.X-offset = - #(ly:make-simple-closure - `(,+ - ,(ly:make-simple-closure - (list ly:self-alignment-interface::centered-on-note-columns)) - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-aligned-on-self)))) \description "Holds a single line of dynamics, which will be centered between the staves surrounding this context." @@ -456,9 +490,9 @@ printing of a single line of lyrics." (stretchability . 1)) \override VerticalAxisGroup.nonstaff-nonstaff-spacing = #'((basic-distance . 0) - (minimum-distance . 2.8) - (padding . 0.2) - (stretchability . 0)) + (minimum-distance . 2.8) + (padding . 0.2) + (stretchability . 0)) \override VerticalAxisGroup.nonstaff-unrelatedstaff-spacing.padding = #1.5 \override InstrumentName.self-alignment-Y = ##f @@ -473,7 +507,7 @@ printing of a single line of lyrics." \context { \type "Engraver_group" - \name NoteNames + \name "NoteNames" \description "A context for printing the names of notes." \consists "Axis_group_engraver" @@ -496,20 +530,23 @@ printing of a single line of lyrics." \context { \type "Engraver_group" - \name ChordNames + \name "ChordNames" + \alias Staff % Catch Staff-level overrides like + % \key, \transposition \description "Typesets chord names." \consists "Output_property_engraver" \consists "Separating_line_group_engraver" \consists "Chord_name_engraver" \consists "Axis_group_engraver" -% \consists "Note_spacing_engraver" + %\consists "Note_spacing_engraver" \override VerticalAxisGroup.remove-first = ##t \override VerticalAxisGroup.remove-empty = ##t \override VerticalAxisGroup.staff-affinity = #DOWN \override VerticalAxisGroup.nonstaff-relatedstaff-spacing.padding = #0.5 \override VerticalAxisGroup.nonstaff-nonstaff-spacing.padding = #0.5 + \override ParenthesesItem.font-size = #1.5 } \context { @@ -540,7 +577,7 @@ automatically when an output definition (a @code{\\score} or %% Timing variables in layout definitions before any %% Timing_translator has been run. - % timing translator must come BEFORE bar number engraver + %% timing translator must come BEFORE bar number engraver \consists "Timing_translator" \consists "Default_bar_line_engraver" \consists "Output_property_engraver" @@ -562,25 +599,27 @@ automatically when an output definition (a @code{\\score} or \defaultchild "Staff" + \accepts "ChoirStaff" + \accepts "ChordNames" + \accepts "Devnull" + \accepts "DrumStaff" + \accepts "Dynamics" + \accepts "FiguredBass" \accepts "FretBoards" - \accepts "Staff" - \accepts "RhythmicStaff" - \accepts "TabStaff" - \accepts "VaticanaStaff" + \accepts "GrandStaff" \accepts "GregorianTranscriptionStaff" - \accepts "MensuralStaff" - \accepts "PetrucciStaff" - \accepts "StaffGroup" - \accepts "DrumStaff" \accepts "KievanStaff" \accepts "Lyrics" - \accepts "ChordNames" - \accepts "GrandStaff" - \accepts "ChoirStaff" - \accepts "PianoStaff" - \accepts "Devnull" + \accepts "MensuralStaff" \accepts "NoteNames" - \accepts "FiguredBass" + \accepts "OneStaff" + \accepts "PetrucciStaff" + \accepts "PianoStaff" + \accepts "RhythmicStaff" + \accepts "Staff" + \accepts "StaffGroup" + \accepts "TabStaff" + \accepts "VaticanaStaff" noteToFretFunction = #determine-frets predefinedDiagramTable = ##f @@ -593,6 +632,7 @@ automatically when an output definition (a @code{\\score} or drumStyleTable = #drums-style + associatedVoiceType = #'Voice melismaBusyProperties = #default-melisma-properties tieWaitForNote = ##f clefGlyph = #"clefs.G" @@ -608,6 +648,7 @@ automatically when an output definition (a @code{\\score} or doubleRepeatType = #":..:" startRepeatType = #".|:" endRepeatType = #":|." + alternativeRestores = #'(measurePosition measureLength lastChord) barNumberVisibility = #first-bar-number-invisible-and-no-parenthesized-bar-numbers barNumberFormatter = #robust-bar-number-function clefTranspositionFormatter = #clef-transposition-markup @@ -617,13 +658,13 @@ automatically when an output definition (a @code{\\score} or explicitClefVisibility = #all-visible explicitCueClefVisibility = #end-of-line-invisible explicitKeySignatureVisibility = #all-visible - implicitTimeSignatureVisibility = #end-of-line-invisible + initialTimeSignatureVisibility = #end-of-line-invisible repeatCountVisibility = #all-repeat-counts-visible -%% Other Timing variables are derived and set by the Timing_translator -%% at initialization time by calling the functions in -%% scm/time-signature-settings.scm + %% Other Timing variables are derived and set by the Timing_translator + %% at initialization time by calling the functions in + %% scm/time-signature-settings.scm timeSignatureSettings = #default-time-signature-settings timeSignatureFraction = 4/4 @@ -633,6 +674,8 @@ automatically when an output definition (a @code{\\score} or autoBeaming = ##t autoBeamCheck = #default-auto-beam-check + completionFactor = #unity-if-multimeasure + scriptDefinitions = #default-script-alist pedalSustainStrings = #'("Ped." "*Ped." "*") @@ -640,10 +683,10 @@ automatically when an output definition (a @code{\\score} or pedalUnaCordaStrings = #'("una corda" "" "tre corde") pedalUnaCordaStyle = #'text -%% These are in ordinary italic font, including the *, -%% but they are unlikely to be used, -%% as the default pedal-style for SostenutoPedal is 'mixed': -%% i.e. Sost. Ped_____________________ + %% These are in ordinary italic font, including the *, + %% but they are unlikely to be used, + %% as the default pedal-style for SostenutoPedal is 'mixed': + %% i.e. Sost. Ped_____________________ pedalSostenutoStrings = #'("Sost. Ped." "*Sost. Ped." "*") pedalSostenutoStyle = #'mixed @@ -670,7 +713,7 @@ automatically when an output definition (a @code{\\score} or barCheckSynchronize = ##f -%% chord names: + %% chord names: chordNameFunction = #ignatzek-chord-names minorChordModifier = #(make-simple-markup "m") additionalPitchPrefix = #"" % was "add" @@ -686,16 +729,12 @@ automatically when an output definition (a @code{\\score} or chordNameExceptionsPartial = #partialJazzExceptions noChordSymbol = #(make-simple-markup "N.C.") - bassStaffProperties = #'((assign clefGlyph "clefs.F") - (assign clefPosition 2) - (assign middleCPosition 6) - (assign middleCClefPosition 6)) -%% tablature: + %% tablature: stringOneTopmost = ##t highStringOne = ##t -%% One may change the string tunings as follows : -%% The length of the list must be equal to the number of strings + %% One may change the string tunings as follows : + %% The length of the list must be equal to the number of strings stringTunings = #guitar-tuning tablatureFormat = #fret-number-tablature-format tabStaffLineLayoutFunction = #tablature-position-on-lines @@ -722,7 +761,7 @@ automatically when an output definition (a @code{\\score} or ;; need this, as stanza numbers are items, and appear only once. stanza-number-interface ) - % \quoteDuring is supposed to quote everything, cueDuring only the essentials + %% \quoteDuring is supposed to quote everything, cueDuring only the essentials quotedEventTypes = #'(StreamEvent) quotedCueEventTypes = #'( note-event @@ -760,7 +799,7 @@ automatically when an output definition (a @code{\\score} or \name "Devnull" \type "Engraver_group" -%% don't want to route anything out of here: + %% don't want to route anything out of here: \alias "Staff" \alias "Voice" \description "Silently discards all musical information given to this @@ -770,54 +809,37 @@ context." \context { \name "NullVoice" \type "Engraver_group" - - \description "Non-printing context, typically used for aligning -lyrics in polyphonic situations, or with @code{\partcombine}." + \description "For aligning lyrics without printing notes" %% don't route anything out of here \alias "Staff" \alias "Voice" - %% all three are needed for ties to work with lyrics + %% provide non-printing NoteHeads with proper extents for lyric alignment \consists "Note_heads_engraver" - \consists "Rhythmic_column_engraver" - \consists "Tie_engraver" + \omit NoteHead + \override NoteHead.X-extent = #(lambda (g) + (ly:stencil-extent (ly:note-head::print g) X)) - %% both are needed for melismas to work with \autoBeamOff - \consists "Beam_engraver" - \consists "Stem_engraver" - - %% needed for slurs to work with lyrics - \consists "Slur_engraver" + %% generate no accidentals + nullAccidentals = ##t %% keep noteheads inside the staff \consists "Pitch_squash_engraver" squashedPosition = 0 - %% `\omit NoteHead' would give slur attachment errors - \omit Accidental + %% generate no ledger lines, needed for staves with custom + %% line positions and ledger lines that appear inside the staff + \override NoteHead.no-ledgers = ##t + + %% the engravers that control the 'busy' flags for note-onsets and melismata + \consists "Grob_pq_engraver" + \consists "Tie_engraver" + \omit Tie + \consists "Beam_engraver" \omit Beam - \omit Dots - \omit Flag - \omit Rest + \consists "Slur_engraver" \omit Slur - \omit Stem - \omit Tie - - %% let these take up space (for lyric extenders, etc.) - \override NoteHead.transparent = ##t - \override TabNoteHead.transparent = ##t - - %% don't let notes shift - \override NoteHead.X-offset = 0 - \override NoteColumn.ignore-collision = ##t - - %% keep beams and stems inside the staff - \override Beam.positions = #'(1 . 1) - \override Stem.length = 0 - - %% prevent "weird stem size" warnings - \override Stem.direction = #UP } \context { @@ -937,9 +959,9 @@ contexts and handles the line spacing, the tablature clef etc. properly." %% the direction for glissando lines will be automatically corrected \override Glissando.extra-dy = #glissando::calc-tab-extra-dy \override Glissando.bound-details.right = #`((attach-dir . ,LEFT) - (padding . 0.3)) + (padding . 0.3)) \override Glissando.bound-details.left = #`((attach-dir . ,RIGHT) - (padding . 0.3)) + (padding . 0.3)) %% dead notes \override TabNoteHead.glyph-name = #tab-note-head::calc-glyph-name \override TabNoteHead.stencil = #tab-note-head::whiteout-if-style-set @@ -1031,7 +1053,6 @@ of Editio Vaticana." %% There are no beams in Gregorian Chant notation. autoBeaming = ##f - } \context { @@ -1101,6 +1122,7 @@ accommodated for typesetting a piece in mensural style." \override TimeSignature.style = #'mensural \override KeySignature.glyph-name-alist = #alteration-mensural-glyph-name-alist \override Accidental.glyph-name-alist = #alteration-mensural-glyph-name-alist + \override AccidentalSuggestion.glyph-name-alist = #alteration-mensural-glyph-name-alist \override Custos.style = #'mensural \override Custos.neutral-position = #3 \override Custos.neutral-direction = #DOWN @@ -1127,7 +1149,7 @@ accommodated for typesetting a piece in Petrucci style." \override NoteHead.style = #'petrucci \override Rest.style = #'mensural - % Thickens and shortens stems. + %% Thickens and shortens stems. \override Stem.thickness = #1.7 \override Stem.length = #5 @@ -1169,58 +1191,58 @@ accommodated for typesetting a piece in Petrucci style." } \context { - \Voice - \name "KievanVoice" - \alias "Voice" - \description "Same as @code{Voice} context, except that it is + \Voice + \name "KievanVoice" + \alias "Voice" + \description "Same as @code{Voice} context, except that it is accommodated for typesetting a piece in Kievan style." \remove "Ligature_bracket_engraver" \consists "Kievan_ligature_engraver" - %% Set glyph styles. - \override NoteHead.style = #'kievan - \override Stem.X-offset = #stem::kievan-offset-callback - \override Stem.stencil = ##f - \override Flag.stencil = ##f - \override Rest.style = #'mensural - \override Accidental.glyph-name-alist = #alteration-kievan-glyph-name-alist - \override Dots.style = #'kievan - \override Slur.stencil = ##f - \override Stem.length = #0.0 - \override Beam.positions = #beam::get-kievan-positions - \override Beam.quantized-positions = #beam::get-kievan-quantized-positions - \override NoteHead.duration-log = #note-head::calc-kievan-duration-log - - %% There are beams in Kievan notation, but they are invoked manually - autoBeaming = ##f + %% Set glyph styles. + \override NoteHead.style = #'kievan + \override Stem.X-offset = #stem::kievan-offset-callback + \override Stem.stencil = ##f + \override Flag.stencil = ##f + \override Rest.style = #'mensural + \override Accidental.glyph-name-alist = #alteration-kievan-glyph-name-alist + \override Dots.style = #'kievan + \override Slur.stencil = ##f + \override Stem.length = #0.0 + \override Beam.positions = #beam::get-kievan-positions + \override Beam.quantized-positions = #beam::get-kievan-quantized-positions + \override NoteHead.duration-log = #note-head::calc-kievan-duration-log + + %% There are beams in Kievan notation, but they are invoked manually + autoBeaming = ##f } \context { - \Staff - \name "KievanStaff" - \alias "Staff" - \denies "Voice" - \defaultchild "KievanVoice" - \accepts "KievanVoice" - \description "Same as @code{Staff} context, except that it is + \Staff + \name "KievanStaff" + \alias "Staff" + \denies "Voice" + \defaultchild "KievanVoice" + \accepts "KievanVoice" + \description "Same as @code{Staff} context, except that it is accommodated for typesetting a piece in Kievan style." - \remove "Time_signature_engraver" - - %% Choose Kievan tsefaut clef - clefGlyph = #"clefs.kievan.do" - middleCClefPosition = #0 - middleCPosition = #0 - clefPosition = #0 - clefTransposition = #0 - - %% Accidentals are valid only once (if the following note is different) - extraNatural = ##f - autoAccidentals = #`(Staff ,(make-accidental-rule 'same-octave 0) - ,neo-modern-accidental-rule) - autoCautionaries = #'() - printKeyCancellation = ##f + \remove "Time_signature_engraver" + + %% Choose Kievan tsefaut clef + clefGlyph = #"clefs.kievan.do" + middleCClefPosition = #0 + middleCPosition = #0 + clefPosition = #0 + clefTransposition = #0 + + %% Accidentals are valid only once (if the following note is different) + extraNatural = ##f + autoAccidentals = #`(Staff ,(make-accidental-rule 'same-octave 0) + ,neo-modern-accidental-rule) + autoCautionaries = #'() + printKeyCancellation = ##f } diff --git a/ly/espanol.ly b/ly/espanol.ly index c67dd19c81..fc98a43567 100644 --- a/ly/espanol.ly +++ b/ly/espanol.ly @@ -1,7 +1,7 @@ %%%% common Spanish names for notes %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2010--2012 Valentin Villenave +%%%% Copyright (C) 2010--2015 Valentin Villenave %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/event-listener.ly b/ly/event-listener.ly index 9e5282de89..a2a39bc47e 100644 --- a/ly/event-listener.ly +++ b/ly/event-listener.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2011--2012 Graham Percival +%%%% Copyright (C) 2011--2015 Graham Percival %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by @@ -192,8 +192,8 @@ as an engraver for convenience." #(define (format-textspan engraver event) (let* ((context (ly:translator-context engraver)) (moment (ly:context-current-moment context)) - (spanner-props (ly:context-property context 'TextSpanner)) - (details (chain-assoc-get 'bound-details spanner-props)) + (spanner-props (ly:context-grob-definition context 'TextSpanner)) + (details (assoc-get 'bound-details spanner-props)) (left-props (assoc-get 'left details '())) (left-text (assoc-get 'text left-props '()))) (print-line engraver @@ -211,18 +211,18 @@ as an engraver for convenience." \Voice \consists #(make-engraver (listeners - (tempo-change-event . format-tempo) - (rest-event . format-rest) - (note-event . format-note) - (articulation-event . format-articulation) - (text-script-event . format-text) - (slur-event . format-slur) - (breathing-event . format-breathe) - (dynamic-event . format-dynamic) - (crescendo-event . format-cresc) - (decrescendo-event . format-decresc) - (text-span-event . format-textspan) - (glissando-event . format-glissando) - (tie-event . format-tie))) + (tempo-change-event . format-tempo) + (rest-event . format-rest) + (note-event . format-note) + (articulation-event . format-articulation) + (text-script-event . format-text) + (slur-event . format-slur) + (breathing-event . format-breathe) + (dynamic-event . format-dynamic) + (crescendo-event . format-cresc) + (decrescendo-event . format-decresc) + (text-span-event . format-textspan) + (glissando-event . format-glissando) + (tie-event . format-tie))) } } diff --git a/ly/festival.ly b/ly/festival.ly index 8363525e9a..ad3541ce98 100644 --- a/ly/festival.ly +++ b/ly/festival.ly @@ -17,21 +17,21 @@ %%%% You should have received a copy of the GNU General Public License %%%% along with LilyPond. If not, see . -\version "2.16.0" +\version "2.19.22" #(use-modules (scm song)) #(use-modules (srfi srfi-39)) % \festival #"filename" { \tempo N = X } { music } festival = -#(define-music-function (parser location filename tempo music) +#(define-music-function (filename tempo music) (string? ly:music? ly:music?) (output-file music tempo filename) music) % \festivalsyl #"filename" { \tempo N = X } { music } festivalsyl = -#(define-music-function (parser location filename tempo music) +#(define-music-function (filename tempo music) (string? ly:music? ly:music?) (parameterize ((*syllabify* #t)) (output-file music tempo filename)) diff --git a/ly/graphviz-init.ly b/ly/graphviz-init.ly index cc9229f8f5..96f45ded93 100644 --- a/ly/graphviz-init.ly +++ b/ly/graphviz-init.ly @@ -1,7 +1,9 @@ -\version "2.16.0" +\version "2.19.22" #(use-modules (scm graphviz)) +#(use-modules (ice-9 regex)) + #(define last-grob-action '()) #(define sym-blacklist '()) @@ -22,14 +24,7 @@ #(define (whitelist-grob sym) (set! grob-whitelist (cons sym grob-whitelist))) -#(define graph (make-empty-graph (ly:parser-output-name parser))) - -#(define (grob-name g) - (let* ((meta (ly:grob-property g 'meta)) - (name-pair (assq 'name meta))) - (if (pair? name-pair) - (cdr name-pair) - #f))) +#(define graph (make-empty-graph (ly:parser-output-name))) % an event is relevant if % (it is on some whitelist or all whitelists are empty) @@ -42,16 +37,16 @@ (or (= 0 (length file-line-whitelist) (length sym-whitelist) (length grob-whitelist)) (memq prop sym-whitelist) - (memq (grob-name grob) grob-whitelist) + (memq (grob::name grob) grob-whitelist) (member file-line file-line-whitelist)) (and (not (memq prop sym-blacklist)) - (not (memq (grob-name grob) grob-blacklist)) + (not (memq (grob::name grob) grob-blacklist)) (not (member file-line file-line-blacklist)))))) #(define (grob-event-node grob label cluster) (let ((node-id (add-node graph label cluster)) - (prev (assv grob last-grob-action))) + (prev (assv grob last-grob-action))) (if (pair? prev) (add-edge graph (cdr prev) node-id)) (set! last-grob-action (assv-set! last-grob-action grob node-id)))) @@ -62,18 +57,22 @@ #(define (grob-mod grob file line func prop val) (let* ((val-str (truncate-value val)) - (label (format #f "~a\\n~a:~a\\n~a <- ~a" (grob-name grob) file line prop val-str))) + (label (format #f "~a\\n~a:~a\\n~a <- ~a" (grob::name grob) file line prop val-str)) + ;; to keep escaped "\"" we need to transform it to "\\\"" + ;; otherwise the final pdf-creation will break + (escaped-label + (regexp-substitute/global #f "\"" label 'pre "\\\"" 'post))) (if (relevant? grob file line prop) - (grob-event-node grob label file)))) + (grob-event-node grob escaped-label file)))) #(define (grob-cache grob prop callback value) (let* ((val-str (truncate-value value)) - (label (format #f "caching ~a.~a\\n~a -> ~a" (grob-name grob) prop callback value))) + (label (format #f "caching ~a.~a\\n~a -> ~a" (grob::name grob) prop callback value))) (if (relevant? grob #f #f prop) (grob-event-node grob label #f)))) #(define (grob-create grob file line func) - (let ((label (format #f "~a\\n~a:~a" (grob-name grob) file line))) + (let ((label (format #f "~a\\n~a:~a" (grob::name grob) file line))) (grob-event-node grob label file))) #(ly:set-grob-modification-callback grob-mod) diff --git a/ly/gregorian.ly b/ly/gregorian.ly index b0fe9f24c2..e4d34f6e4c 100644 --- a/ly/gregorian.ly +++ b/ly/gregorian.ly @@ -3,12 +3,12 @@ $Id$ %} -\version "2.17.30" +\version "2.19.22" % % Declare memorable shortcuts for special unicode characters % that are used in chant notation. -% +% % unicode 0132 (latin capital ligature IJ) IJ = \lyricmode { IJ } @@ -26,23 +26,23 @@ iij = \lyricmode { iij } (let ((found? #f)) (map-some-music (lambda (m) - (if found? m - (and (music-is-of-type? m 'lyric-event) - (begin - (set! (ly:music-property m 'text) - (string-append prefix (ly:music-property m 'text))) - (set! found? #t) - m)))) + (if found? m + (and (music-is-of-type? m 'lyric-event) + (begin + (set! (ly:music-property m 'text) + (string-append prefix (ly:music-property m 'text))) + (set! found? #t) + m)))) music))) % Add unicode 2123 (versicle) as prefix to lyrics. versus = -#(define-music-function (parser location music) (ly:music?) +#(define-music-function (music) (ly:music?) (add-prefix-to-lyrics "℣" music)) % Add unicode 211F (response) as prefix to lyrics. responsum = -#(define-music-function (parser location music) (ly:music?) +#(define-music-function (music) (ly:music?) (add-prefix-to-lyrics "℟" music)) % @@ -151,7 +151,7 @@ circulus = #(make-articulation "circulus") % it is applied by one. % augmentum = -#(define-music-function (parser location expr) (ly:music?) +#(define-music-function (expr) (ly:music?) (shift-duration-log expr 0 1)) % @@ -161,25 +161,25 @@ augmentum = #(define (make-ligature music) (make-music 'SequentialMusic - 'elements (append - (cons - (make-music 'EventChord - 'elements (list - (make-span-event 'LigatureEvent START))) - (ly:music-property music 'elements)) - (list - (make-music 'EventChord - 'elements (list - (make-span-event 'LigatureEvent STOP))))))) + 'elements (append + (cons + (make-music 'EventChord + 'elements (list + (make-span-event 'LigatureEvent START))) + (ly:music-property music 'elements)) + (list + (make-music 'EventChord + 'elements (list + (make-span-event 'LigatureEvent STOP))))))) ligature = #(define-music-function - (location music) (ly:music?) - (make-ligature music)) + (location music) (ly:music?) + (make-ligature music)) %#(define (make-script x) % (make-music 'ArticulationEvent % 'articulation-type x)) -% +% %#(define (add-script m x) % (if % (equal? (ly:music-property m 'name) 'EventChord) @@ -200,10 +200,10 @@ ligature = #(define-music-function % `(define-music-function (location music) (ly:music?) % (make-music 'SequentialMusic % 'elements (list 'LigatureStartEvent -% (ly:music-deep-copy ,start) +% (ly:music-deep-copy ,start) % music % (ly:music-deep-copy ,stop) -% 'LigatureStopEvent)))) +% 'LigatureStopEvent)))) %climacus = #(def-climacus-function startSequentialMusic stopSequentialMusic) % @@ -225,46 +225,46 @@ ligature = #(define-music-function line-thickness = #(/ (ly:output-def-lookup $defaultpaper 'staff-space) 7.0) \context { - \VaticanaStaff - \override StaffSymbol.color = #red - \override LedgerLineSpanner.color = #red + \VaticanaStaff + \override StaffSymbol.color = #red + \override LedgerLineSpanner.color = #red } \context { - \Score - \remove "Bar_number_engraver" - - %%% - %%% FIXME: Musicologically seen, timing should be set to #f. - %%% Unfortunately, setting it to #f will result in no - %%% line-breakable items being created, such that the whole - %%% music will end up in a single line. Therefore, we - %%% currently set it to #t, until the ligature code is fixed - %%% to automatically insert breakable items. - %%% - timing = ##t - - %%% - %%% FIXME: Setting barAlways to #t would fix the above - %%% "timing = ##t" problem, but, surprisingly, it increases - %%% the space between ligatures. Hence, we set it to #f. - %%% - barAlways = ##f - - \override SpacingSpanner.packed-spacing = ##t - - %%% - %%% TODO: Play around with the following SpacingSpanner - %%% settings to yield better spacing between ligatures. - %%% - %%% FIXME: setting #'spacing-increment to a small value - %%% causes tons of "programming error: adding reverse spring, - %%% setting to unit" messages. - %%% - %\override SpacingSpanner.base-shortest-duration = #(ly:make-moment 1/4) - %\override SpacingSpanner.shortest-duration-space = #0 - %\override SpacingSpanner.average-spacing-wishes = ##f - %\override SpacingSpanner.spacing-increment = #0.0 - %\override SpacingSpanner.uniform-stretching = ##t + \Score + \remove "Bar_number_engraver" + + %%% + %%% FIXME: Musicologically seen, timing should be set to #f. + %%% Unfortunately, setting it to #f will result in no + %%% line-breakable items being created, such that the whole + %%% music will end up in a single line. Therefore, we + %%% currently set it to #t, until the ligature code is fixed + %%% to automatically insert breakable items. + %%% + timing = ##t + + %%% + %%% FIXME: Setting barAlways to #t would fix the above + %%% "timing = ##t" problem, but, surprisingly, it increases + %%% the space between ligatures. Hence, we set it to #f. + %%% + barAlways = ##f + + \override SpacingSpanner.packed-spacing = ##t + + %%% + %%% TODO: Play around with the following SpacingSpanner + %%% settings to yield better spacing between ligatures. + %%% + %%% FIXME: setting #'spacing-increment to a small value + %%% causes tons of "programming error: adding reverse spring, + %%% setting to unit" messages. + %%% + %\override SpacingSpanner.base-shortest-duration = #(ly:make-moment 1/4) + %\override SpacingSpanner.shortest-duration-space = #0 + %\override SpacingSpanner.average-spacing-wishes = ##f + %\override SpacingSpanner.spacing-increment = #0.0 + %\override SpacingSpanner.uniform-stretching = ##t } } @@ -278,24 +278,24 @@ ligature = #(define-music-function neumeDemoLayout = \layout { interscoreline = 1 \context { - \Score - \remove "Bar_number_engraver" + \Score + \remove "Bar_number_engraver" } \context { - \Staff - \remove "Clef_engraver" - \remove "Key_engraver" - \hide StaffSymbol - \remove "Time_signature_engraver" - \remove "Bar_engraver" - \override VerticalAxisGroup.staff-staff-spacing = #'() + \Staff + \remove "Clef_engraver" + \remove "Key_engraver" + \hide StaffSymbol + \remove "Time_signature_engraver" + \remove "Bar_engraver" + \override VerticalAxisGroup.staff-staff-spacing = #'() } \context { - \Voice - \remove "Ligature_bracket_engraver" - \consists "Vaticana_ligature_engraver" - \override NoteHead.style = #'vaticana.punctum - \hide Stem + \Voice + \remove "Ligature_bracket_engraver" + \consists "Vaticana_ligature_engraver" + \override NoteHead.style = #'vaticana.punctum + \hide Stem } } diff --git a/ly/guile-debugger.ly b/ly/guile-debugger.ly index b05df7dd17..c992b65236 100644 --- a/ly/guile-debugger.ly +++ b/ly/guile-debugger.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2009--2012 by Ian Hulin +%%%% Copyright (C) 2009--2015 by Ian Hulin %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/init.ly b/ly/init.ly index acaa2c9899..394b122f31 100644 --- a/ly/init.ly +++ b/ly/init.ly @@ -1,10 +1,13 @@ -%% Toplevel initialisation file. +%% Toplevel initialisation file. %% switch on debugging. #(if (and #t (defined? 'set-debug-cell-accesses!)) (set-debug-cell-accesses! 5000)) -\version "2.16.0" +\version "2.19.22" + +#(if (guile-v2) + (use-modules (ice-9 curried-definitions))) #(session-initialize (lambda () @@ -14,12 +17,11 @@ ;; function has not actually started. A parser clone, in contrast, ;; can run and complete synchronously and shares the module with ;; the current parser. - (ly:parser-parse-string (ly:parser-clone parser) + (ly:parser-parse-string (ly:parser-clone) "\\include \"declarations-init.ly\""))) -#(note-names-language parser default-language) +#(note-names-language default-language) -#(define location #f) #(define toplevel-scores (list)) #(define toplevel-bookparts (list)) #(define $defaultheader #f) @@ -32,9 +34,10 @@ #(use-modules (scm clip-region)) #(use-modules (srfi srfi-1)) +#(use-modules (ice-9 pretty-print)) $(if (ly:get-option 'include-settings) - (ly:parser-include-string parser + (ly:parser-include-string (format #f "\\include \"~a\"" (ly:get-option 'include-settings)))) \maininput @@ -65,14 +68,14 @@ $(if (ly:get-option 'include-settings) (ly:book-add-score! book score)) (reverse! toplevel-scores))) (set! toplevel-scores (list)) - (book-handler parser book))) + (book-handler book))) ((or (pair? toplevel-scores) output-empty-score-list) - (let ((book (apply ly:make-book $defaultpaper + (let ((book (apply ly:make-book $defaultpaper $defaultheader toplevel-scores))) (set! toplevel-scores (list)) - (book-handler parser book))))) + (book-handler book))))) -#(if (eq? expect-error (ly:parser-has-error? parser)) - (ly:parser-clear-error parser) +#(if (eq? expect-error (ly:parser-has-error?)) + (ly:parser-clear-error) (if expect-error - (ly:parser-error parser (_ "expected error, but none found")))) + (ly:parser-error (_ "expected error, but none found")))) diff --git a/ly/italiano.ly b/ly/italiano.ly index e80b1e849e..c7c81c4ef4 100644 --- a/ly/italiano.ly +++ b/ly/italiano.ly @@ -1,7 +1,7 @@ %%%% common Italian names for notes %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2010--2012 Valentin Villenave +%%%% Copyright (C) 2010--2015 Valentin Villenave %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/lyrics-tkit.ly b/ly/lyrics-tkit.ly new file mode 100644 index 0000000000..0f6a0a7feb --- /dev/null +++ b/ly/lyrics-tkit.ly @@ -0,0 +1,50 @@ +%\version "2.19.22" + +%%% The function used by the built-in templates to +% build a lyrics context and associate it with a voice. + +\include "voice-tkit.ly" + +make-one-stanza = +#(define-music-function + (pos staffPrefix voicePrefix altVoicePrefix lyrics) + ((above-or-below? #f) + voice-prefix? + voice-prefix? + (voice-prefix?) + vocal-lyrics-or-verses?) + + "Make a single stanza + (pos: positioned Above or Below the named staff) + staffPrefix: voice prefix for the staff to be positioned against + voicePrefix: voice prefix for the associated voice +(altVoicePrefix: voice prefix for the associated voice + if the first is not present) + lyrics: the words" + + (let* ((lyrics-name (string-append voicePrefix lyrics)) + (staff-name (string-append staffPrefix "Staff")) + (music-name (make-id voicePrefix "Music")) + (assoc-voice-name (if music-name + voicePrefix + altVoicePrefix)) + (with-clause + (if pos + #{ \with { + #(string-append "align" pos "Context") = #staff-name + } + #} + (make-music 'SequentialMusic 'void #t))) + (stanza (if (member lyrics lyrics-postfixes) + (make-id voicePrefix lyrics) + (get-id lyrics)))) + (if (and stanza ;we need lyrics and at least one associated voice + (or music-name + (make-id altVoicePrefix "Music"))) + #{ + \new Lyrics = #lyrics-name + \with { #with-clause } + \lyricsto #(string-append assoc-voice-name "Voice") + { #stanza } + #} + (make-music 'SequentialMusic 'void #t)))) diff --git a/ly/makam.ly b/ly/makam.ly index cf6852a028..7f5f8cc783 100644 --- a/ly/makam.ly +++ b/ly/makam.ly @@ -1,4 +1,4 @@ -\version "2.17.6" +\version "2.19.22" %{ @@ -6,7 +6,7 @@ Define 1/9 alterations. %} - + #(define-public EKSIK-IKI 5/18) #(define-public EKSIK-UC 6/18) @@ -29,7 +29,7 @@ makamPitchNames = #`( (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)) @@ -70,7 +70,7 @@ makamPitchNames = #`( (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))) @@ -86,7 +86,7 @@ makamPitchNames = #`( (gfk . ,(ly:make-pitch -1 4 (- KUCUK))) (afk . ,(ly:make-pitch -1 5 (- KUCUK))) (bfk . ,(ly:make-pitch -1 6 (- KUCUK))) - + (cfi . ,(ly:make-pitch -1 0 (- EKSIK-IKI))) (dfi . ,(ly:make-pitch -1 1 (- EKSIK-IKI))) (efi . ,(ly:make-pitch -1 2 (- EKSIK-IKI))) @@ -102,8 +102,8 @@ makamPitchNames = #`( (gfu . ,(ly:make-pitch -1 4 (- EKSIK-UC))) (afu . ,(ly:make-pitch -1 5 (- EKSIK-UC))) (bfu . ,(ly:make-pitch -1 6 (- EKSIK-UC))) - - + + (cfbm . ,(ly:make-pitch -1 0 (- BUYUKMUCENNEB))) (dfbm . ,(ly:make-pitch -1 1 (- BUYUKMUCENNEB))) (efbm . ,(ly:make-pitch -1 2 (- BUYUKMUCENNEB))) @@ -116,8 +116,8 @@ makamPitchNames = #`( %% set pitch names. -pitchnames = \makamPitchNames -#(ly:parser-set-note-names parser makamPitchNames) +pitchnames = \makamPitchNames +#(ly:parser-set-note-names makamPitchNames) #(define eksikMirroredSlashedFlat (if (defined? 'eksikMirroredSlashedFlat) @@ -131,11 +131,11 @@ makamGlyphs = #`((1 . "accidentals.doublesharp") (0 . "accidentals.natural") (-1/9 . "accidentals.mirroredflat") (-5/18 . ,(if eksikMirroredSlashedFlat - "accidentals.mirroredflat.backslash" - "accidentals.mirroredflat")) + "accidentals.mirroredflat.backslash" + "accidentals.mirroredflat")) (-6/18 . ,(if eksikMirroredSlashedFlat - "accidentals.mirroredflat.backslash" - "accidentals.mirroredflat")) + "accidentals.mirroredflat.backslash" + "accidentals.mirroredflat")) (-4/9 . "accidentals.flat.slash") (-5/9 . "accidentals.flat") (-8/9 . "accidentals.flat.slashslash") @@ -151,4 +151,3 @@ makamGlyphs = #`((1 . "accidentals.doublesharp") \override AmbitusAccidental.glyph-name-alist = \makamGlyphs } } - diff --git a/ly/midi-init.ly b/ly/midi-init.ly index 72aa43f23e..672c1e9b3c 100644 --- a/ly/midi-init.ly +++ b/ly/midi-init.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 1996--2012 Han-Wen Nienhuys +%%%% Copyright (C) 1996--2015 Han-Wen Nienhuys %%%% Jan Nieuwenhuizen %%%% %%%% LilyPond is free software: you can redistribute it and/or modify @@ -20,4 +20,3 @@ \midi { \include "performer-init.ly" } - diff --git a/ly/music-functions-init.ly b/ly/music-functions-init.ly index bf738074cd..a23d154fd8 100644 --- a/ly/music-functions-init.ly +++ b/ly/music-functions-init.ly @@ -2,7 +2,7 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2003--2012 Han-Wen Nienhuys +%%%% Copyright (C) 2003--2015 Han-Wen Nienhuys %%%% Jan Nieuwenhuizen %%%% %%%% LilyPond is free software: you can redistribute it and/or modify @@ -18,7 +18,7 @@ %%%% You should have received a copy of the GNU General Public License %%%% along with LilyPond. If not, see . -\version "2.17.11" +\version "2.19.25" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -27,16 +27,14 @@ %% need SRFI-1 for filter; optargs for lambda* #(use-modules (srfi srfi-1) - (ice-9 optargs)) - -%% TODO: using define-music-function in a .scm causes crash. + (ice-9 optargs)) absolute = -#(define-music-function (parser location music) +#(define-music-function (music) (ly:music?) (_i "Make @var{music} absolute. This does not actually change the music itself but rather hides it from surrounding @code{\\relative} -commands.") +and @code{\\fixed} commands.") (make-music 'RelativeOctaveMusic 'element music)) acciaccatura = @@ -47,55 +45,55 @@ acciaccatura = instrument-definitions = #'() addInstrumentDefinition = #(define-void-function - (parser location name lst) (string? list?) + (name lst) (string? list?) (_i "Create instrument @var{name} with properties @var{list}.") (set! instrument-definitions (acons name lst instrument-definitions))) addQuote = -#(define-void-function (parser location name music) (string? ly:music?) +#(define-void-function (name music) (string? ly:music?) (_i "Define @var{music} as a quotable music expression named @var{name}") - (add-quotable parser name music)) + (add-quotable name music)) %% keep these two together afterGraceFraction = #(cons 6 8) afterGrace = -#(define-music-function (parser location main grace) (ly:music? ly:music?) +#(define-music-function (main grace) (ly:music? ly:music?) (_i "Create @var{grace} note(s) after a @var{main} music expression.") (let ((main-length (ly:music-length main)) - (fraction (ly:parser-lookup parser 'afterGraceFraction))) + (fraction (ly:parser-lookup 'afterGraceFraction))) (make-simultaneous-music (list main (make-sequential-music - (list + (list - (make-music 'SkipMusic - 'duration (ly:make-duration - 0 0 - (* (ly:moment-main-numerator main-length) - (car fraction)) - (* (ly:moment-main-denominator main-length) - (cdr fraction)))) - (make-music 'GraceMusic - 'element grace))))))) + (make-music 'SkipMusic + 'duration (ly:make-duration + 0 0 + (* (ly:moment-main-numerator main-length) + (car fraction)) + (* (ly:moment-main-denominator main-length) + (cdr fraction)))) + (make-music 'GraceMusic + 'element grace))))))) %% music identifiers not allowed at top-level, %% so this is a music-function instead. allowPageTurn = -#(define-music-function (location parser) () +#(define-music-function () () (_i "Allow a page turn. May be used at toplevel (ie between scores or markups), or inside a score.") (make-music 'EventChord - 'page-marker #t - 'page-turn-permission 'allow - 'elements (list (make-music 'PageTurnEvent - 'break-permission 'allow)))) + 'page-marker #t + 'page-turn-permission 'allow + 'elements (list (make-music 'PageTurnEvent + 'break-permission 'allow)))) alterBroken = -#(define-music-function (parser location property arg item) - (symbol-list-or-symbol? list? symbol-list-or-music?) +#(define-music-function (property arg item) + (key-list-or-symbol? list? key-list-or-music?) (_i "Override @var{property} for pieces of broken spanner @var{item} with values @var{arg}. @var{item} may either be music in the form of a starting spanner event, or a symbol list in the form @@ -104,11 +102,11 @@ form of a spanner event, @var{property} may also have the form @samp{Grob.property} for specifying a directed tweak.") (if (ly:music? item) (if (eq? (ly:music-property item 'span-direction) START) - #{ \tweak #property #(value-for-spanner-piece arg) #item #} + (tweak property (value-for-spanner-piece arg) item) (begin (ly:music-warning item (_ "not a spanner")) item)) - (let* ((p (check-grob-path item parser location + (let* ((p (check-grob-path item (*location*) #:default 'Bottom #:min 2 #:max 2)) @@ -119,44 +117,51 @@ form of a spanner event, @var{property} may also have the form (member 'spanner-interface (assoc-get 'interfaces (assoc-get 'meta description)))) - #{ - \override #item . #property = - #(value-for-spanner-piece arg) - #} + (propertyOverride (append item (if (symbol? property) + (list property) + property)) + (value-for-spanner-piece arg)) (begin - (ly:input-warning location (_ "not a spanner name, `~a'") name) + (ly:input-warning (*location*) (_ "not a spanner name, `~a'") name) (make-music 'Music)))))) appendToTag = -#(define-music-function (parser location tag more music) +#(define-music-function (tag more music) (symbol? ly:music? ly:music?) (_i "Append @var{more} to the @code{elements} of all music expressions in @var{music} that are tagged with @var{tag}.") (music-map (lambda (m) - (if (memq tag (ly:music-property m 'tags)) - (set! (ly:music-property m 'elements) - (append (ly:music-property m 'elements) - (list more)))) - m) - music)) + (if (memq tag (ly:music-property m 'tags)) + (set! (ly:music-property m 'elements) + (append (ly:music-property m 'elements) + (list more)))) + m) + music)) applyContext = -#(define-music-function (parser location proc) (procedure?) +#(define-music-function (proc) (procedure?) (_i "Modify context properties with Scheme procedure @var{proc}.") (make-music 'ApplyContext - 'procedure proc)) + 'procedure proc)) applyMusic = -#(define-music-function (parser location func music) (procedure? ly:music?) +#(define-music-function (func music) (procedure? ly:music?) (_i"Apply procedure @var{func} to @var{music}.") (func music)) applyOutput = -#(define-music-function (parser location ctx proc) (symbol? procedure?) - (_i "Apply function @code{proc} to every layout object in context @code{ctx}") - (make-music 'ApplyOutputEvent - 'procedure proc - 'context-type ctx)) +#(define-music-function (target proc) (symbol-list-or-symbol? procedure?) + (_i "Apply function @code{proc} to every layout object matched by +@var{target} which takes the form @code{Context} or @code{Context.Grob}.") + (let ((p (check-grob-path target (*location*) #:max 2))) + (if p + (make-music 'ApplyOutputEvent + 'procedure proc + 'context-type (car p) + (if (pair? (cdr p)) + (list (cons 'symbol (cadr p))) + '())) + (make-music 'Music)))) appoggiatura = #(def-grace-function startAppoggiaturaMusic stopAppoggiaturaMusic @@ -164,25 +169,38 @@ appoggiatura = % for regression testing purposes. assertBeamQuant = -#(define-music-function (parser location l r) (pair? pair?) +#(define-music-function (l r) (pair? pair?) (_i "Testing function: check whether the beam quants @var{l} and @var{r} are correct") (make-grob-property-override 'Beam 'positions (check-quant-callbacks l r))) % for regression testing purposes. assertBeamSlope = -#(define-music-function (parser location comp) (procedure?) +#(define-music-function (comp) (procedure?) (_i "Testing function: check whether the slope of the beam is the same as @code{comp}") (make-grob-property-override 'Beam 'positions (check-slope-callbacks comp))) autochange = -#(define-music-function (parser location music) (ly:music?) - (_i "Make voices that switch between staves automatically") - (make-autochange-music parser music)) - - +#(define-music-function (pitch clef-1 clef-2 music) + ((ly:pitch? (ly:make-pitch 0 0)) (ly:context-mod?)(ly:context-mod?) ly:music?) + (_i "Make voices that switch between staves automatically. As an option the +pitch where to switch staves may be specified. The clefs for the staves are +optional as well. Setting clefs works only for implicitly instantiated +staves.") + (let ;; keep the contexts alive for the full duration + ((skip (make-duration-of-length (ly:music-length music))) + (clef-1 (or clef-1 #{ \with { \clef "treble" } #})) + (clef-2 (or clef-2 #{ \with { \clef "bass" } #}))) + (make-simultaneous-music + (list + (descend-to-context (make-autochange-music pitch music) 'Staff + "up" clef-1) + (context-spec-music (make-skip-music skip) 'Staff + "up" clef-1) + (context-spec-music (make-skip-music skip) 'Staff + "down" clef-2))))) balloonGrobText = -#(define-music-function (parser location grob-name offset text) +#(define-music-function (grob-name offset text) (symbol? number-pair? markup?) (_i "Attach @var{text} to @var{grob-name} at offset @var{offset} (use like @code{\\once})") @@ -195,66 +213,74 @@ balloonGrobText = 'text text)))) balloonText = -#(define-event-function (parser location offset text) (number-pair? markup?) +#(define-event-function (offset text) (number-pair? markup?) (_i "Attach @var{text} at @var{offset} (use like @code{\\tweak})") (make-music 'AnnotateOutputEvent - 'X-offset (car offset) - 'Y-offset (cdr offset) - 'text text)) + 'X-offset (car offset) + 'Y-offset (cdr offset) + 'text text)) bar = -#(define-music-function (parser location type) (string?) +#(define-music-function (type) (string?) (_i "Insert a bar line of type @var{type}") (context-spec-music (make-property-set 'whichBar type) 'Timing)) barNumberCheck = -#(define-music-function (parser location n) (integer?) +#(define-music-function (n) (integer?) (_i "Print a warning if the current bar number is not @var{n}.") (make-music 'ApplyContext - 'procedure - (lambda (c) - (let ((cbn (ly:context-property c 'currentBarNumber))) - (if (and (number? cbn) (not (= cbn n))) - (ly:input-warning location - "Barcheck failed got ~a expect ~a" - cbn n)))))) + 'procedure + (lambda (c) + (let ((cbn (ly:context-property c 'currentBarNumber))) + (if (and (number? cbn) (not (= cbn n))) + (ly:input-warning (*location*) + "Barcheck failed got ~a expect ~a" + cbn n)))))) + +beamExceptions = +#(define-scheme-function (music) (ly:music?) + (_i "Extract a value suitable for setting +@code{Timing.beamExceptions} from the given pattern with explicit +beams in @var{music}. A bar check @code{|} has to be used between +bars of patterns in order to reset the timing.") + (extract-beam-exceptions music)) bendAfter = -#(define-event-function (parser location delta) (real?) +#(define-event-function (delta) (real?) (_i "Create a fall or doit of pitch interval @var{delta}.") (make-music 'BendAfterEvent - 'delta-step delta)) + 'delta-step delta)) bookOutputName = -#(define-void-function (parser location newfilename) (string?) +#(define-void-function (newfilename) (string?) (_i "Direct output for the current book block to @var{newfilename}.") - (set! (paper-variable parser #f 'output-filename) newfilename)) + (set! (paper-variable #f 'output-filename) newfilename)) bookOutputSuffix = -#(define-void-function (parser location newsuffix) (string?) +#(define-void-function (newsuffix) (string?) (_i "Set the output filename suffix for the current book block to @var{newsuffix}.") - (set! (paper-variable parser #f 'output-suffix) newsuffix)) + (set! (paper-variable #f 'output-suffix) newsuffix)) %% \breathe is defined as a music function rather than an event identifier to %% ensure it gets useful input location information: as an event identifier, %% it would have to be wrapped in an EventChord to prevent it from being %% treated as a post_event by the parser breathe = -#(define-music-function (parser location) () +#(define-music-function () () (_i "Insert a breath mark.") (make-music 'BreathingEvent)) clef = -#(define-music-function (parser location type) (string?) +#(define-music-function (type) (string?) (_i "Set the current clef to @var{type}.") (make-clef-set type)) compoundMeter = -#(define-music-function (parser location args) (pair?) +#(define-music-function (args) (pair?) (_i "Create compound time signatures. The argument is a Scheme list of lists. Each list describes one fraction, with the last entry being the denominator, while the first entries describe the summands in the @@ -270,8 +296,8 @@ as @code{\\compoundMeter #'((3 2 8))} or shorter (timesig (cons (ly:moment-main-numerator mlen) (ly:moment-main-denominator mlen)))) #{ - \once \override Staff.TimeSignature.stencil = #(lambda (grob) - (grob-interpret-markup grob (format-compound-time args))) + \once \override Timing.TimeSignature.stencil = #(lambda (grob) + (grob-interpret-markup grob (make-compound-meter-markup args))) \set Timing.timeSignatureFraction = #timesig \set Timing.baseMoment = #beat \set Timing.beatStructure = #beatGrouping @@ -279,8 +305,19 @@ as @code{\\compoundMeter #'((3 2 8))} or shorter \set Timing.measureLength = #mlen #} )) +compressMMRests = +#(define-music-function (music) (ly:music?) + (_i "Remove the empty bars created by multi-measure rests, +leaving just the first bar containing the MM rest itself.") + (music-map + (lambda (m) + (if (eq? 'MultiMeasureRestMusic (ly:music-property m 'name)) + #{ \once \set Score.skipBars = ##t #m #} + #{ #m #} )) + music)) + crossStaff = -#(define-music-function (parser location notes) (ly:music?) +#(define-music-function (notes) (ly:music?) (_i "Create cross-staff stems") #{ \temporary \override Stem.cross-staff = #cross-staff-connect @@ -291,104 +328,109 @@ crossStaff = #}) cueClef = -#(define-music-function (parser location type) (string?) +#(define-music-function (type) (string?) (_i "Set the current cue clef to @var{type}.") (make-cue-clef-set type)) cueClefUnset = -#(define-music-function (parser location) () +#(define-music-function () () (_i "Unset the current cue clef.") (make-cue-clef-unset)) cueDuring = #(define-music-function - (parser location what dir main-music) (string? ly:dir? ly:music?) + (what dir main-music) (string? ly:dir? ly:music?) (_i "Insert contents of quote @var{what} corresponding to @var{main-music}, in a CueVoice oriented by @var{dir}.") (make-music 'QuoteMusic - 'element main-music - 'quoted-context-type 'CueVoice - 'quoted-context-id "cue" - 'quoted-music-name what - 'quoted-voice-direction dir)) + 'element main-music + 'quoted-context-type 'CueVoice + 'quoted-context-id "cue" + 'quoted-music-name what + 'quoted-voice-direction dir)) cueDuringWithClef = #(define-music-function - (parser location what dir clef main-music) (string? ly:dir? string? ly:music?) + (what dir clef main-music) (string? ly:dir? string? ly:music?) (_i "Insert contents of quote @var{what} corresponding to @var{main-music}, in a CueVoice oriented by @var{dir}.") (make-music 'QuoteMusic - 'element main-music - 'quoted-context-type 'CueVoice - 'quoted-context-id "cue" - 'quoted-music-name what - 'quoted-music-clef clef - 'quoted-voice-direction dir)) + 'element main-music + 'quoted-context-type 'CueVoice + 'quoted-context-id "cue" + 'quoted-music-name what + 'quoted-music-clef clef + 'quoted-voice-direction dir)) displayLilyMusic = -#(define-music-function (parser location music) (ly:music?) +#(define-music-function (port music) ((output-port?) ly:music?) (_i "Display the LilyPond input representation of @var{music} -to the console.") - (newline) - (display-lily-music music parser) +to @var{port}, defaulting to the console.") + (let ((port (or port (current-output-port)))) + (newline port) + (display-lily-music music port)) music) displayMusic = -#(define-music-function (parser location music) (ly:music?) - (_i "Display the internal representation of @var{music} to the console.") - (newline) - (display-scheme-music music) +#(define-music-function (port music) ((output-port?) ly:music?) + (_i "Display the internal representation of @var{music} to +@var{port}, default to the console.") + (let ((port (or port (current-output-port)))) + (newline port) + (display-scheme-music music port)) music) displayScheme = -#(define-scheme-function (parser location expr) (scheme?) - (_i "Display the internal representation of @var{expr} to the console.") - (newline) - (display-scheme-music expr) +#(define-scheme-function (port expr) ((output-port?) scheme?) + (_i "Display the internal representation of @var{expr} to +@var{port}, default to the console.") + (let ((port (or port (current-output-port)))) + (newline port) + (display-scheme-music expr port)) expr) endSpanners = -#(define-music-function (parser location music) (ly:music?) +#(define-music-function (music) (ly:music?) (_i "Terminate the next spanner prematurely after exactly one note without the need of a specific end spanner.") (let* ((start-span-evs (filter (lambda (ev) - (equal? (ly:music-property ev 'span-direction) - START)) - (extract-typed-music music 'span-event))) - (stop-span-evs - (map (lambda (m) - (music-clone m 'span-direction STOP)) + (equal? (ly:music-property ev 'span-direction) + START)) + (extract-typed-music music 'span-event))) + (stop-span-evs + (map (lambda (m) + (music-clone m 'span-direction STOP)) start-span-evs)) - (end-ev-chord (make-music 'EventChord - 'elements stop-span-evs)) - (total (make-music 'SequentialMusic - 'elements (list music - end-ev-chord)))) + (end-ev-chord (make-music 'EventChord + 'elements stop-span-evs)) + (total (make-music 'SequentialMusic + 'elements (list music + end-ev-chord)))) total)) eventChords = -#(define-music-function (parser location music) (ly:music?) +#(define-music-function (music) (ly:music?) (_i "Compatibility function wrapping @code{EventChord} around isolated rhythmic events occuring since version 2.15.28, after expanding repeat chords @samp{q}.") - (event-chord-wrap! music parser)) + (event-chord-wrap! music)) featherDurations= -#(define-music-function (parser location factor argument) (ly:moment? ly:music?) +#(define-music-function (factor argument) (ly:moment? ly:music?) (_i "Adjust durations of music in @var{argument} by rational @var{factor}.") (let ((orig-duration (ly:music-length argument)) - (multiplier (ly:make-moment 1 1))) + (multiplier (ly:make-moment 1 1))) (for-each (lambda (mus) - (if (< 0 (ly:moment-main-denominator (ly:music-length mus))) - (begin - (ly:music-compress mus multiplier) - (set! multiplier (ly:moment-mul factor multiplier))))) + (if (< 0 (ly:moment-main-denominator (ly:music-length mus))) + (begin + (ly:music-compress mus multiplier) + (set! multiplier (ly:moment-mul factor multiplier))))) (extract-named-music argument '(EventChord NoteEvent RestEvent SkipEvent))) (ly:music-compress argument @@ -397,7 +439,7 @@ featherDurations= argument)) finger = -#(define-event-function (parser location finger) (number-or-markup?) +#(define-event-function (finger) (number-or-markup?) (_i "Apply @var{finger} as a fingering indication.") (make-music @@ -405,8 +447,22 @@ finger = (if (number? finger) 'digit 'text) finger)) +fixed = +#(define-music-function (pitch music) + (ly:pitch? ly:music?) + (_i "Use the octave of @var{pitch} as the default octave for @var{music}.") + (let ((octave-marks (1+ (ly:pitch-octave pitch)))) + (cond ((not (= 0 octave-marks)) + (ly:music-transpose music (ly:make-pitch octave-marks 0 0)) + ;;In order to leave unchanged the notes in any enclosed + ;; \absolute or \fixed or \relative, make a cancelling shift + (map (lambda (m) + (ly:music-transpose m (ly:make-pitch (- octave-marks) 0 0))) + (extract-named-music music 'RelativeOctaveMusic))))) + (make-music 'RelativeOctaveMusic 'element music)) + footnote = -#(define-music-function (parser location mark offset footnote item) +#(define-music-function (mark offset footnote item) ((markup?) number-pair? markup? symbol-list-or-music?) (_i "Make the markup @var{footnote} a footnote on @var{item}. The footnote is marked with a markup @var{mark} moved by @var{offset} with @@ -428,28 +484,28 @@ Like with @code{\\tweak}, if you use a footnote on a following post-event, the @code{\\footnote} command itself needs to be attached to the preceding note or rest as a post-event with @code{-}.") (let ((mus (make-music - 'FootnoteEvent - 'X-offset (car offset) - 'Y-offset (cdr offset) - 'automatically-numbered (not mark) - 'text (or mark (make-null-markup)) - 'footnote-text footnote))) - #{ \once \tweak footnote-music #mus #item #})) + 'FootnoteEvent + 'X-offset (car offset) + 'Y-offset (cdr offset) + 'automatically-numbered (not mark) + 'text (or mark (make-null-markup)) + 'footnote-text footnote))) + (once (propertyTweak 'footnote-music mus item)))) grace = #(def-grace-function startGraceMusic stopGraceMusic (_i "Insert @var{music} as grace notes.")) grobdescriptions = -#(define-scheme-function (parser location descriptions) (list?) +#(define-scheme-function (descriptions) (list?) (_i "Create a context modification from @var{descriptions}, a list in the format of @code{all-grob-descriptions}.") (ly:make-context-mod (map (lambda (p) - (list 'assign (car p) (list (cdr p)))) - descriptions))) + (list 'assign (car p) (ly:make-grob-properties (cdr p)))) + descriptions))) -harmonicByFret = #(define-music-function (parser location fret music) (number? ly:music?) +harmonicByFret = #(define-music-function (fret music) (number? ly:music?) (_i "Convert @var{music} into mixed harmonics; the resulting notes resemble harmonics played on a fretted instrument by touching the strings at @var{fret}.") #{ @@ -466,16 +522,14 @@ harmonics played on a fretted instrument by touching the strings at @var{fret}." \revert NoteHead.stencil #}) -harmonicByRatio = #(define-music-function (parser location ratio music) (number? ly:music?) +harmonicByRatio = #(define-music-function (ratio music) (number? ly:music?) (_i "Convert @var{music} into mixed harmonics; the resulting notes resemble harmonics played on a fretted instrument by touching the strings at the point given through @var{ratio}.") #{ \set harmonicDots = ##t \temporary \override TabNoteHead.stencil = #(tab-note-head::print-custom-fret-label (ratio->fret ratio)) - \temporary \override NoteHead.Y-extent = #(ly:make-unpure-pure-container ly:grob::stencil-height - (lambda (grob start end) - (ly:grob::stencil-height grob))) + \temporary \override NoteHead.Y-extent = #(ly:make-unpure-pure-container ly:grob::stencil-height) \temporary \override NoteHead.stencil = #(lambda (grob) (ly:grob-set-property! grob 'style 'harmonic-mixed) (ly:note-head::print grob)) #(make-harmonic @@ -487,7 +541,7 @@ given through @var{ratio}.") #}) hide = -#(define-music-function (parser location item) (symbol-list-or-music?) +#(define-music-function (item) (symbol-list-or-music?) (_i "Set @var{item}'s @samp{transparent} property to @code{#t}, making it invisible while still retaining its dimensions. @@ -495,10 +549,10 @@ If @var{item} is a symbol list of form @code{GrobName} or @code{Context.GrobName}, the result is an override for the grob name specified by it. If @var{item} is a music expression, the result is the same music expression with an appropriate tweak applied to it.") - #{ \tweak transparent ##t #item #}) + (propertyTweak 'transparent #t item)) inStaffSegno = -#(define-music-function (parser location) () +#(define-music-function () () (_i "Put the segno variant 'varsegno' at this position into the staff, compatible with the repeat command.") (make-music 'ApplyContext @@ -512,112 +566,241 @@ compatible with the repeat command.") instrumentSwitch = #(define-music-function - (parser location name) (string?) + (name) (string?) (_i "Switch instrument to @var{name}, which must be predefined with @code{\\addInstrumentDefinition}.") (let* ((handle (assoc name instrument-definitions)) - (instrument-def (if handle (cdr handle) '()))) + (instrument-def (if handle (cdr handle) '()))) (if (not handle) - (ly:input-warning location "No such instrument: ~a" name)) + (ly:input-warning (*location*) "No such instrument: ~a" name)) (context-spec-music (make-music 'SimultaneousMusic - 'elements - (map (lambda (kv) - (make-property-set - (car kv) - (cdr kv))) - instrument-def)) + 'elements + (map (lambda (kv) + (make-property-set + (car kv) + (cdr kv))) + instrument-def)) 'Staff))) keepWithTag = -#(define-music-function (parser location tag music) +#(define-music-function (tags music) (symbol-list-or-symbol? ly:music?) - (_i "Include only elements of @var{music} that are either untagged -or tagged with one of the tags in @var{tag}. @var{tag} may be either -a single symbol or a list of symbols.") + (_i "Include only elements of @var{music} that are tagged with one +of the tags in @var{tags}. @var{tags} may be either a single symbol +or a list of symbols. + +Each tag may be declared as a member of at most one tag group (defined +with @code{\\tagGroup}). If none of a @var{music} element's tags +share a tag group with one of the specified @var{tags}, the element is +retained.") (music-filter - (if (symbol? tag) - (lambda (m) - (let ((music-tags (ly:music-property m 'tags))) - (or (null? music-tags) - (memq tag music-tags)))) - (lambda (m) - (let ((music-tags (ly:music-property m 'tags))) - (or (null? music-tags) - (any (lambda (t) (memq t music-tags)) tag))))) + (tags-keep-predicate tags) music)) key = -#(define-music-function (parser location tonic pitch-alist) +#(define-music-function (tonic pitch-alist) ((ly:pitch? '()) (list? '())) (_i "Set key to @var{tonic} and scale @var{pitch-alist}. If both are null, just generate @code{KeyChangeEvent}.") (cond ((null? tonic) (make-music 'KeyChangeEvent)) - ((null? pitch-alist) - (ly:parser-error parser (_ "second argument must be pitch list") - location) - (make-music 'SequentialMusic 'void #t)) - (else - (ly:music-transpose - (make-music 'KeyChangeEvent - 'tonic (ly:make-pitch 0 0 0) - 'pitch-alist pitch-alist) - tonic)))) + ((null? pitch-alist) + (ly:parser-error (_ "second argument must be pitch list") + (*location*)) + (make-music 'SequentialMusic 'void #t)) + (else + (ly:music-transpose + (make-music 'KeyChangeEvent + 'tonic (ly:make-pitch 0 0 0) + 'pitch-alist pitch-alist) + tonic)))) killCues = -#(define-music-function (parser location music) (ly:music?) +#(define-music-function (music) (ly:music?) (_i "Remove cue notes from @var{music}.") (music-map (lambda (mus) (if (and (string? (ly:music-property mus 'quoted-music-name)) - (string=? (ly:music-property mus 'quoted-context-id "") "cue")) - (ly:music-property mus 'element) - mus)) + (string=? (ly:music-property mus 'quoted-context-id "") "cue")) + (ly:music-property mus 'element) + mus)) music)) label = -#(define-music-function (parser location label) (symbol?) +#(define-music-function (label) (symbol?) (_i "Create @var{label} as a bookmarking label.") (make-music 'EventChord - 'page-marker #t - 'page-label label - 'elements (list (make-music 'LabelEvent - 'page-label label)))) + 'page-marker #t + 'page-label label + 'elements (list (make-music 'LabelEvent + 'page-label label)))) language = -#(define-void-function (parser location language) (string?) +#(define-void-function (language) (string?) (_i "Set note names for language @var{language}.") - (note-names-language parser language)) + (note-names-language language)) languageSaveAndChange = -#(define-void-function (parser location language) (string?) +#(define-void-function (language) (string?) (_i "Store the previous pitchnames alist, and set a new one.") (set! previous-pitchnames pitchnames) - (note-names-language parser language)) + (note-names-language language)) languageRestore = -#(define-void-function (parser location) () +#(define-void-function () () (_i "Restore a previously-saved pitchnames alist.") (if previous-pitchnames (begin (set! pitchnames previous-pitchnames) - (ly:parser-set-note-names parser pitchnames)) - (ly:input-warning location (_ "No other language was defined previously. Ignoring.")))) + (ly:parser-set-note-names pitchnames)) + (ly:input-warning (*location*) (_ "No other language was defined previously. Ignoring.")))) + + +magnifyMusic = +#(define-music-function (mag music) (positive? ly:music?) + (_i "Magnify the notation of @var{music} without changing the +staff-size, using @var{mag} as a size factor. Stems, beams, +slurs, ties, and horizontal spacing are adjusted automatically.") + + ;; these props are NOT allowed to shrink below default size + (define unshrinkable-props + '( + ;; stems + (Stem thickness) + + ;; slurs + (Slur line-thickness) + (Slur thickness) + (PhrasingSlur line-thickness) + (PhrasingSlur thickness) + + ;; ties + (Tie line-thickness) + (Tie thickness) + (LaissezVibrerTie line-thickness) + (LaissezVibrerTie thickness) + (RepeatTie line-thickness) + (RepeatTie thickness) + )) + + ;; these props ARE allowed to shrink below default size + (define shrinkable-props + (let ((baseline-skip-props + (find-named-props 'baseline-skip all-grob-descriptions)) + (word-space-props + (find-named-props 'word-space all-grob-descriptions))) + (append + baseline-skip-props + word-space-props + '( + ;; TODO: uncomment spacing-increment here once Issue 3987 is fixed + ;; override at the 'Score level + ;(SpacingSpanner spacing-increment) + + ;; lengths and heights + (Beam length-fraction) + (Stem length-fraction) + (Stem beamlet-default-length) + (Stem double-stem-separation) + (Slur height-limit) + (Slur minimum-length) + (PhrasingSlur height-limit) + (PhrasingSlur minimum-length) + + ;; Beam.beam-thickness is dealt with separately below + )))) + #{ + \context Bottom { + %% TODO: uncomment \newSpacingSection once Issue 3990 is fixed + %\newSpacingSection + #(scale-fontSize 'magnifyMusic mag) + #(scale-props 'magnifyMusic mag #f unshrinkable-props) + #(scale-props 'magnifyMusic mag #t shrinkable-props) + #(scale-beam-thickness mag) + + #music + + %% TODO: uncomment \newSpacingSection once Issue 3990 is fixed + %\newSpacingSection + %% reverse engineer the former fontSize value instead of using \unset + #(revert-fontSize 'magnifyMusic mag) + #(revert-props 'magnifyMusic mag (append unshrinkable-props + shrinkable-props + '((Beam beam-thickness)))) + } + #}) +magnifyStaff = +#(define-music-function (mag) (positive?) + (_i "Change the size of the staff, adjusting notation size and +horizontal spacing automatically, using @var{mag} as a size factor.") + + ;; these props are NOT allowed to shrink below default size + (define unshrinkable-props + '((StaffSymbol thickness))) + + ;; these props ARE allowed to shrink below default size + (define shrinkable-props + (let* ((baseline-skip-props + (find-named-props 'baseline-skip all-grob-descriptions)) + (word-space-props + (find-named-props 'word-space all-grob-descriptions)) + (space-alist-props + (find-named-props 'space-alist all-grob-descriptions))) + (append + baseline-skip-props + word-space-props + space-alist-props + '( + ;; override at the 'Score level + (SpacingSpanner spacing-increment) + + (StaffSymbol staff-space) + (BarLine kern) + (BarLine segno-kern) + (BarLine hair-thickness) + (BarLine thick-thickness) + (Stem beamlet-default-length) + (Stem double-stem-separation) + )))) + + #{ + \stopStaff + + %% revert settings from last time + %% (but only if \magnifyStaff has already been used + %% and the staff magnification is changing) + #(revert-fontSize 'magnifyStaff mag) + #(revert-props 'magnifyStaff mag (append unshrinkable-props + shrinkable-props)) + + %% scale settings + %% (but only if staff magnification is changing + %% and does not equal 1) + #(scale-fontSize 'magnifyStaff mag) + #(scale-props 'magnifyStaff mag #f unshrinkable-props) + #(scale-props 'magnifyStaff mag #t shrinkable-props) + + %% this might cause problems until Issue 3990 is fixed + \newSpacingSection + + \startStaff + \set Staff.magnifyStaffValue = #mag + #}) makeClusters = -#(define-music-function (parser location arg) (ly:music?) +#(define-music-function (arg) (ly:music?) (_i "Display chords in @var{arg} as clusters.") (music-map note-to-cluster arg)) modalInversion = -#(define-music-function (parser location around to scale music) +#(define-music-function (around to scale music) (ly:pitch? ly:pitch? ly:music? ly:music?) (_i "Invert @var{music} about @var{around} using @var{scale} and transpose from @var{around} to @var{to}.") @@ -626,7 +809,7 @@ transpose from @var{around} to @var{to}.") music)) modalTranspose = -#(define-music-function (parser location from to scale music) +#(define-music-function (from to scale music) (ly:pitch? ly:pitch? ly:music? ly:music?) (_i "Transpose @var{music} from pitch @var{from} to pitch @var{to} using @var{scale}.") @@ -636,65 +819,96 @@ using @var{scale}.") inversion = #(define-music-function - (parser location around to music) (ly:pitch? ly:pitch? ly:music?) + (around to music) (ly:pitch? ly:pitch? ly:music?) (_i "Invert @var{music} about @var{around} and transpose from @var{around} to @var{to}.") (music-invert around to music)) mark = #(define-music-function - (parser location label) ((scheme? '())) + (label) ((number-or-markup?)) "Make the music for the \\mark command." (let* ((set (and (integer? label) - (context-spec-music (make-property-set 'rehearsalMark label) - 'Score))) - (ev (make-music 'MarkEvent - 'origin location))) + (context-spec-music (make-property-set 'rehearsalMark label) + 'Score))) + (ev (make-music 'MarkEvent + 'origin (*location*)))) (if set - (make-sequential-music (list set ev)) - (begin - (set! (ly:music-property ev 'label) label) - ev)))) + (make-sequential-music (list set ev)) + (begin + (if label (set! (ly:music-property ev 'label) label)) + ev)))) + +markupMap = +#(define-music-function (path markupfun music) + (symbol-list-or-symbol? markup-function? ly:music?) + (_i "This applies the given markup function @var{markupfun} to all markup +music properties matching @var{path} in @var{music}. + +For example, +@example +\\new Voice @{ g'2 c'' @} +\\addlyrics @{ + \\markupMap LyricEvent.text + \\markup \\with-color #red \\etc + @{ Oh yes! @} +@} +@end example +") + (let* ((p (check-music-path path (*location*))) + (name (and p (car p))) + (prop (and p (cadr p)))) + (if p + (for-some-music + (lambda (m) + (if (or (not name) (eq? (ly:music-property m 'name) name)) + (let ((text (ly:music-property m prop))) + (if (markup? text) + (set! (ly:music-property m prop) + (list markupfun text))))) + #f) + music))) + music) musicMap = -#(define-music-function (parser location proc mus) (procedure? ly:music?) +#(define-music-function (proc mus) (procedure? ly:music?) (_i "Apply @var{proc} to @var{mus} and all of the music it contains.") (music-map proc mus)) %% noPageBreak and noPageTurn are music functions (not music indentifiers), %% because music identifiers are not allowed at top-level. noPageBreak = -#(define-music-function (location parser) () +#(define-music-function () () (_i "Forbid a page break. May be used at toplevel (i.e., between scores or markups), or inside a score.") (make-music 'EventChord - 'page-marker #t - 'page-break-permission 'forbid - 'elements (list (make-music 'PageBreakEvent - 'break-permission '())))) + 'page-marker #t + 'page-break-permission 'forbid + 'elements (list (make-music 'PageBreakEvent + 'break-permission '())))) noPageTurn = -#(define-music-function (location parser) () +#(define-music-function () () (_i "Forbid a page turn. May be used at toplevel (i.e., between scores or markups), or inside a score.") (make-music 'EventChord - 'page-marker #t - 'page-turn-permission 'forbid - 'elements (list (make-music 'PageTurnEvent - 'break-permission '())))) + 'page-marker #t + 'page-turn-permission 'forbid + 'elements (list (make-music 'PageTurnEvent + 'break-permission '())))) octaveCheck = -#(define-music-function (parser location pitch) (ly:pitch?) +#(define-music-function (pitch) (ly:pitch?) (_i "Octave check.") (make-music 'RelativeOctaveCheck 'pitch pitch)) offset = -#(define-music-function (parser location property offsets item) - (symbol-list-or-symbol? scheme? symbol-list-or-music?) +#(define-music-function (property offsets item) + (symbol-list-or-symbol? scheme? key-list-or-music?) (_i "Offset the default value of @var{property} of @var{item} by @var{offsets}. If @var{item} is a string, the result is @code{\\override} for the specified grob type. If @var{item} is @@ -705,37 +919,31 @@ appropriate tweak applied.") (let ((prop-path (check-grob-path (if (symbol? property) (list property) - property) - parser location + property) (*location*) #:start 1 #:default #t #:min 2 #:max 2))) (if prop-path ; If the head of the grob property path is a symbol--i.e., ; a grob name, produce a directed tweak. Otherwise, create ; an ordinary tweak. (if (symbol? (car prop-path)) - #{ - \tweak #prop-path #(offsetter (second prop-path) offsets) #item - #} - #{ - \tweak #(second prop-path) #(offsetter (second prop-path) offsets) #item - #}) + (tweak prop-path (offsetter (second prop-path) offsets) item) + (tweak (second prop-path) + (offsetter (second prop-path) offsets) + item)) item)) ; In case of an override, grob property path is Context.Grob.property. (let ((prop-path (check-grob-path (append item (if (symbol? property) (list property) - property)) - parser location + property)) (*location*) #:default 'Bottom #:min 3 #:max 3))) (if prop-path - #{ - \override #prop-path = #(offsetter (third prop-path) offsets) - #} + (propertyOverride prop-path (offsetter (third prop-path) offsets)) (make-music 'Music))))) - + omit = -#(define-music-function (parser location item) (symbol-list-or-music?) +#(define-music-function (item) (symbol-list-or-music?) (_i "Set @var{item}'s @samp{stencil} property to @code{#f}, effectively omitting it without taking up space. @@ -743,15 +951,15 @@ If @var{item} is a symbol list of form @code{GrobName} or @code{Context.GrobName}, the result is an override for the grob name specified by it. If @var{item} is a music expression, the result is the same music expression with an appropriate tweak applied to it.") - #{ \tweak stencil ##f #item #}) + (propertyTweak 'stencil #f item)) once = -#(define-music-function (parser location music) (ly:music?) +#(define-music-function (music) (ly:music?) (_i "Set @code{once} to @code{#t} on all layout instruction events in @var{music}. This will complain about music with an actual duration. As a special exception, if @var{music} contains @samp{tweaks} it will be silently ignored in order to allow for -@code{\\once \\tweak} to work as both one-time override and proper +@code{\\once \\propertyTweak} to work as both one-time override and proper tweak.") (if (not (pair? (ly:music-property music 'tweaks))) (for-some-music @@ -767,14 +975,14 @@ tweak.") music) ottava = -#(define-music-function (parser location octave) (integer?) +#(define-music-function (octave) (integer?) (_i "Set the octavation.") (make-music 'OttavaMusic - 'ottava-number octave)) + 'ottava-number octave)) overrideTimeSignatureSettings = #(define-music-function - (parser location time-signature base-moment beat-structure beam-exceptions) + (time-signature base-moment beat-structure beam-exceptions) (fraction? fraction? list? list?) (_i "Override @code{timeSignatureSettings} @@ -782,19 +990,25 @@ for time signatures of @var{time-signature} to have settings of @var{base-moment}, @var{beat-structure}, and @var{beam-exceptions}.") ;; TODO -- add warning if largest value of grouping is - ;; greater than time-signature. + ;; greater than time-signature. (let ((setting (make-setting base-moment beat-structure beam-exceptions))) (override-time-signature-setting time-signature setting))) overrideProperty = -#(define-music-function (parser location grob-property-path value) - (symbol-list? scheme?) +#(define-music-function (grob-property-path value) + (key-list? scheme?) (_i "Set the grob property specified by @var{grob-property-path} to @var{value}. @var{grob-property-path} is a symbol list of the form @code{Context.GrobName.property} or @code{GrobName.property}, possibly -with subproperties given as well.") - (let ((p (check-grob-path grob-property-path parser location +with subproperties given as well. + +As opposed to @code{\\override} which overrides the context-dependent +defaults with which a grob is created, this command uses +@code{Output_property_engraver} at the grob acknowledge stage. This +may be necessary for overriding values set after the initial grob +creation.") + (let ((p (check-grob-path grob-property-path (*location*) #:default 'Bottom #:min 3))) (if p @@ -817,35 +1031,35 @@ with subproperties given as well.") %% pageBreak and pageTurn are music functions (iso music indentifiers), %% because music identifiers are not allowed at top-level. pageBreak = -#(define-music-function (location parser) () +#(define-music-function () () (_i "Force a page break. May be used at toplevel (i.e., between scores or markups), or inside a score.") (make-music 'EventChord - 'page-marker #t - 'line-break-permission 'force - 'page-break-permission 'force - 'elements (list (make-music 'LineBreakEvent - 'break-permission 'force) - (make-music 'PageBreakEvent - 'break-permission 'force)))) + 'page-marker #t + 'line-break-permission 'force + 'page-break-permission 'force + 'elements (list (make-music 'LineBreakEvent + 'break-permission 'force) + (make-music 'PageBreakEvent + 'break-permission 'force)))) pageTurn = -#(define-music-function (location parser) () +#(define-music-function () () (_i "Force a page turn between two scores or top-level markups.") (make-music 'EventChord - 'page-marker #t - 'line-break-permission 'force - 'page-break-permission 'force - 'page-turn-permission 'force - 'elements (list (make-music 'LineBreakEvent - 'break-permission 'force) - (make-music 'PageBreakEvent - 'break-permission 'force) - (make-music 'PageTurnEvent - 'break-permission 'force)))) + 'page-marker #t + 'line-break-permission 'force + 'page-break-permission 'force + 'page-turn-permission 'force + 'elements (list (make-music 'LineBreakEvent + 'break-permission 'force) + (make-music 'PageBreakEvent + 'break-permission 'force) + (make-music 'PageTurnEvent + 'break-permission 'force)))) parallelMusic = -#(define-void-function (parser location voice-ids music) (list? ly:music?) +#(define-void-function (voice-ids music) (list? ly:music?) (_i "Define parallel music sequences, separated by '|' (bar check signs), and assign them to the identifiers provided in @var{voice-ids}. @@ -861,187 +1075,248 @@ Example: d d | e e | f f | } <==> - A = { c c | d d | } - B = { d d | e e | } - C = { e e | f f | } + A = { c c | d d } + B = { d d | e e } + C = { e e | f f } @end verbatim + +The last bar checks in a sequence are not copied to the result in +order to facilitate ending the last entry at non-bar boundaries. ") + (define voice-count (length voice-ids)) (define (bar-check? m) "Checks whether m is a bar check." (eq? (ly:music-property m 'name) 'BarCheck)) + (define (recurse-and-split-list lst) + "Return either a list of music lists split along barchecks, or @code{#f}." + (if (any bar-check? lst) + (let* ((voices (apply circular-list (make-list voice-count '()))) + (current-voices voices) + (current-sequence '())) + ;; + ;; utilities + (define (push-music m) + "Push the music expression into the current sequence" + (set! current-sequence (cons m current-sequence))) + (define (change-voice) + "Store the previously built sequence into the current voice and +change to the following voice." + (set-car! current-voices + (cons current-sequence + (car current-voices))) + (set! current-sequence '()) + (set! current-voices (cdr current-voices))) + (for-each (lambda (m) + (let ((split? (recurse-and-split m))) + (if split? + (for-each + (lambda (m) + (push-music m) + (change-voice)) + split?) + (begin + (push-music m) + (if (bar-check? m) (change-voice)))))) + lst) + (if (pair? current-sequence) (change-voice)) + ;; Un-circularize voices + (set! voices (list-head voices voice-count)) + + ;; Remove trailing bar checks to facilitate ending a + ;; sequence on a non-bar, reverse partial sequences and sequences + (set! voices (map! + (lambda (l) + (map! reverse! + (reverse! + (if (and (pair? l) (pair? (car l)) + (bar-check? (caar l))) + (cons (cdar l) (cdr l)) + l)))) + voices)) + + ;; check sequence length + (apply for-each (lambda seqs + (define (seq-len seq) + (reduce ly:moment-add + (ly:make-moment 0) + (map ly:music-length seq))) + (let ((moment-reference (seq-len (car seqs)))) + (for-each (lambda (seq) + (if (not (equal? (seq-len seq) + moment-reference)) + (ly:music-warning + (if (pair? seq) + (last seq) + (caar seqs)) + (_ "Bars in parallel music don't have the same length")))) + seqs))) + voices) + (map concatenate! voices)) + (let ((deeper (map recurse-and-split lst))) + (and (any pair? deeper) + (apply zip (map + (lambda (m split) + (or split + (ly:music-deep-copy (make-list voice-count m)))) + lst deeper)))))) (define (recurse-and-split music) "This returns either a list of music split along barchecks, or @code{#f}." - (let ((elt (ly:music-property music 'element)) - (elts (ly:music-property music 'elements))) - (cond ((ly:music? elt) - (let ((lst (recurse-and-split elt))) - (and lst - (map - (lambda (x) - (let ((res (music-clone music 'element x))) - (if (ly:input-location? - (ly:music-property x 'origin)) - (set! (ly:music-property res 'origin) - (ly:music-property x 'origin))) - res)) - lst)))) - ((any bar-check? elts) - (let* ((voices (apply circular-list - (make-list (length voice-ids) - '()))) - (current-voices voices) - (current-sequence '())) - ;; - ;; utilities - (define (push-music m) - "Push the music expression into the current sequence" - (set! current-sequence (cons m current-sequence))) - (define (change-voice) - "Stores the previously built sequence into the current voice and - change to the following voice." - (set-car! current-voices - (cons (reverse! current-sequence) - (car current-voices))) - (set! current-sequence '()) - (set! current-voices (cdr current-voices))) - (for-each (lambda (m) - (let ((split? (recurse-and-split m))) - (if split? - (for-each - (lambda (m) - (push-music m) - (change-voice)) - split?) - (begin - (push-music m) - (if (bar-check? m) (change-voice)))))) - elts) - (if (pair? current-sequence) (change-voice)) - ;; un-circularize `voices' and reorder the voices - - (set! voices (map reverse! - (list-head voices (length voice-ids)))) - - ;; check sequence length - (apply for-each (lambda seqs - (define (seq-len seq) - (reduce ly:moment-add - (ly:make-moment 0) - (map ly:music-length seq))) - (let ((moment-reference (seq-len (car seqs)))) - (for-each (lambda (seq) - (if (not (equal? (seq-len seq) - moment-reference)) - (ly:music-warning - (if (pair? seq) - (last seq) - (caar seqs)) - (_ "Bars in parallel music don't have the same length")))) - seqs))) - voices) - (map - (lambda (lst) - (set! lst (concatenate! lst)) - (let ((res (music-clone music 'elements lst))) - (if (and (pair? lst) - (ly:input-location? (ly:music-property - (car lst) - 'origin))) - (set! (ly:music-property res 'origin) - (ly:music-property (car lst) 'origin))) - res)) - voices))) - (else #f)))) + (let* ((elt (ly:music-property music 'element)) + (elts (ly:music-property music 'elements)) + (split-elt (and (ly:music? elt) (recurse-and-split elt))) + (split-elts (and (pair? elts) (recurse-and-split-list elts)))) + (and (or split-elt split-elts) + (map + (lambda (e es) + (let ((m (ly:music-deep-copy music + ;;; reassigning the origin of the parent only + ;;; makes sense if the first expression in the + ;;; result is from a distributed origin + (or (and (ly:music? e) e) + (and (pair? es) (car es)))))) + (if (ly:music? e) + (set! (ly:music-property m 'element) e)) + (if (pair? es) + (set! (ly:music-property m 'elements) es)) + m)) + (or split-elt (circular-list #f)) + (or split-elts (circular-list #f)))))) (let ((voices (recurse-and-split music))) (if voices ;; ;; bind voice identifiers to the voices (for-each (lambda (voice-id voice) - (ly:parser-define! parser voice-id voice)) - voice-ids voices) + (ly:parser-define! voice-id voice)) + voice-ids voices) (ly:music-warning music (_ "ignoring parallel music without barchecks"))))) parenthesize = -#(define-music-function (parser loc arg) (ly:music?) +#(define-music-function (arg) (ly:music?) (_i "Tag @var{arg} to be parenthesized.") (if (memq 'event-chord (ly:music-property arg 'types)) ;; arg is an EventChord -> set the parenthesize property ;; on all child notes and rests (for-each - (lambda (ev) - (if (or (memq 'note-event (ly:music-property ev 'types)) - (memq 'rest-event (ly:music-property ev 'types))) - (set! (ly:music-property ev 'parenthesize) #t))) - (ly:music-property arg 'elements)) + (lambda (ev) + (if (or (memq 'note-event (ly:music-property ev 'types)) + (memq 'rest-event (ly:music-property ev 'types))) + (set! (ly:music-property ev 'parenthesize) #t))) + (ly:music-property arg 'elements)) ;; No chord, simply set property for this expression: (set! (ly:music-property arg 'parenthesize) #t)) arg) +#(define (make-directed-part-combine-music direction chord-range part1 part2 + one-context-settings + two-context-settings + shared-context-settings) + + (let* ((pc-music (make-music 'PartCombineMusic)) + (m1 (context-spec-music (make-non-relative-music part1) 'Voice "one")) + (m2 (context-spec-music (make-non-relative-music part2) 'Voice "two")) + (listener (ly:parser-lookup 'partCombineListener)) + (evs2 (recording-group-emulate m2 listener)) + (evs1 (recording-group-emulate m1 listener)) + (split-list + (if (and (assoc "one" evs1) (assoc "two" evs2)) + (determine-split-list (reverse! (assoc-get "one" evs1) '()) + (reverse! (assoc-get "two" evs2) '()) + chord-range) + '())) + (L1 (ly:music-length part1)) + (L2 (ly:music-length part2)) + ;; keep the contexts alive for the full duration + (skip (make-skip-music (make-duration-of-length + (if (ly:moment> #} )) + partcombine = -#(define-music-function (parser location part1 part2) (ly:music? ly:music?) - (_i "Take the music in @var{part1} and @var{part2} and typeset so -that they share a staff.") - (make-part-combine-music parser - (list part1 part2) #f)) +#(define-music-function (chord-range part1 part2) + ((number-pair? '(0 . 8)) ly:music? ly:music?) + (_i "Take the music in @var{part1} and @var{part2} and return +a music expression containing simultaneous voices, where @var{part1} +and @var{part2} are combined into one voice where appropriate. +Optional @var{chord-range} sets the distance in steps between notes +that may be combined into a chord or unison.") + (make-directed-part-combine-music #f chord-range part1 part2 + #{ \with { \voiceOne \override DynamicLineSpanner.direction = #UP } #} + #{ \with { \voiceTwo \override DynamicLineSpanner.direction = #DOWN } #} + #{ #} )) partcombineUp = -#(define-music-function (parser location part1 part2) (ly:music? ly:music?) +#(define-music-function (chord-range part1 part2) + ((number-pair? '(0 . 8)) ly:music? ly:music?) (_i "Take the music in @var{part1} and @var{part2} and typeset so that they share a staff with stems directed upward.") - (make-part-combine-music parser - (list part1 part2) UP)) + (make-directed-part-combine-music UP chord-range part1 part2 + #{ \with { \voiceOne \override DynamicLineSpanner.direction = #UP } #} + #{ \with { \voiceThree \override DynamicLineSpanner.direction = #UP } #} + #{ \with { \voiceOne \override DynamicLineSpanner.direction = #UP } #} )) partcombineDown = -#(define-music-function (parser location part1 part2) (ly:music? ly:music?) +#(define-music-function (chord-range part1 part2) + ((number-pair? '(0 . 8)) ly:music? ly:music?) (_i "Take the music in @var{part1} and @var{part2} and typeset so that they share a staff with stems directed downward.") - (make-part-combine-music parser - (list part1 part2) DOWN)) + (make-directed-part-combine-music DOWN chord-range part1 part2 + #{ \with { \voiceFour \override DynamicLineSpanner.direction = #DOWN } #} + #{ \with { \voiceTwo \override DynamicLineSpanner.direction = #DOWN } #} + #{ \with { \voiceTwo \override DynamicLineSpanner.direction = #DOWN } #} )) -partcombineForce = -#(define-music-function (location parser type once) (symbol-or-boolean? boolean?) - (_i "Override the part-combiner.") - (make-music 'EventChord - 'elements (list (make-music 'PartCombineForceEvent - 'forced-type type - 'once once)))) -partcombineApart = \partcombineForce #'apart ##f -partcombineApartOnce = \partcombineForce #'apart ##t -partcombineChords = \partcombineForce #'chords ##f -partcombineChordsOnce = \partcombineForce #'chords ##t -partcombineUnisono = \partcombineForce #'unisono ##f -partcombineUnisonoOnce = \partcombineForce #'unisono ##t -partcombineSoloI = \partcombineForce #'solo1 ##f -partcombineSoloIOnce = \partcombineForce #'solo1 ##t -partcombineSoloII = \partcombineForce #'solo2 ##f -partcombineSoloIIOnce = \partcombineForce #'solo2 ##t -partcombineAutomatic = \partcombineForce ##f ##f -partcombineAutomaticOnce = \partcombineForce ##f ##t +%% Part combine forcing to be found in ly/property-init.ly partial = -#(define-music-function (parser location dur) (ly:duration?) +#(define-music-function (dur) (ly:duration?) (_i "Make a partial measure.") ;; We use `descend-to-context' here instead of `context-spec-music' to ;; ensure \partial still works if the Timing_translator is moved (descend-to-context (context-spec-music (make-music 'PartialSet - 'origin location - 'duration dur) - 'Timing) + 'origin (*location*) + 'duration dur) + 'Timing) 'Score)) pitchedTrill = #(define-music-function - (parser location main-note secondary-note) + (main-note secondary-note) (ly:music? ly:music?) (_i "Print a trill with @var{main-note} as the main note of the trill and print @var{secondary-note} as a stemless note head in parentheses.") (let* ((get-notes (lambda (ev-chord) - (extract-named-music ev-chord 'NoteEvent))) + (extract-named-music ev-chord 'NoteEvent))) (sec-note-events (get-notes secondary-note)) (trill-events (extract-named-music main-note 'TrillSpanEvent))) (if (pair? sec-note-events) @@ -1053,7 +1328,7 @@ print @var{secondary-note} as a stemless note head in parentheses.") (for-each (lambda (m) (ly:music-set-property! m 'pitch trill-pitch)) trill-events) (begin - (ly:input-warning location (_ "Second argument of \\pitchedTrill should be single note: ")) + (ly:input-warning (*location*) (_ "Second argument of \\pitchedTrill should be single note: ")) (display sec-note-events))) (if (eq? forced #t) @@ -1062,20 +1337,167 @@ print @var{secondary-note} as a stemless note head in parentheses.") trill-events))))) main-note)) +propertyOverride = +#(define-music-function (grob-property-path value) + (key-list? scheme?) + (_i "Set the grob property specified by @var{grob-property-path} to +@var{value}. @var{grob-property-path} is a symbol list of the form +@code{Context.GrobName.property} or @code{GrobName.property}, possibly +with subproperties given as well. This music function is mostly intended +for use from Scheme as a substitute for the built-in @code{\\override} +command.") + (let ((p (check-grob-path grob-property-path (*location*) + #:default 'Bottom + #:min 3))) + (if p + (context-spec-music + (make-music 'OverrideProperty + 'symbol (cadr p) + 'origin (*location*) + 'grob-value value + 'grob-property-path (cddr p) + 'pop-first #t) + (car p)) + (make-music 'Music)))) + +propertyRevert = +#(define-music-function (grob-property-path) + (key-list?) + (_i "Revert the grob property specified by @var{grob-property-path} to +its previous value. @var{grob-property-path} is a symbol list of the form +@code{Context.GrobName.property} or @code{GrobName.property}, possibly +with subproperties given as well. This music function is mostly intended +for use from Scheme as a substitute for the built-in @code{\\revert} +command.") + (let ((p (check-grob-path grob-property-path (*location*) + #:default 'Bottom + #:min 3))) + (if p + (context-spec-music + (make-music 'RevertProperty + 'symbol (cadr p) + 'origin (*location*) + 'grob-property-path (cddr p)) + (car p)) + (make-music 'Music)))) + +propertySet = +#(define-music-function (property-path value) + (symbol-list-or-symbol? scheme?) + (_i "Set the context property specified by @var{property-path} to +@var{value}. This music function is mostly intended for use from +Scheme as a substitute for the built-in @code{\\set} command.") + (let ((p (check-context-path property-path (*location*)))) + (if p + (context-spec-music + (make-music 'PropertySet + 'symbol (cadr p) + 'value value + 'origin (*location*)) + (car p)) + (make-music 'Music)))) + +propertyTweak = +#(define-music-function (prop value item) + (key-list-or-symbol? scheme? key-list-or-music?) + (_i "Add a tweak to the following @var{item}, usually music. +This generally behaves like @code{\\tweak} but will turn into an +@code{\\override} when @var{item} is a symbol list. + +In that case, @var{item} specifies the grob path to override. This is +mainly useful when using @code{\\propertyTweak} as as a component for +building other functions like @code{\\omit}. It is not the default +behavior for @code{\\tweak} since many input strings in +@code{\\lyricmode} can serve equally as music or as symbols which +causes surprising behavior when tweaking lyrics using the less +specific semantics of @code{\\propertyTweak}. + +@var{prop} can contain additional elements in which case a nested +property (inside of an alist) is tweaked.") + ;; Why not instead make the parser treat strings preferably as + ;; music in lyrics mode rather than as symbol? Because then + ;; + ;; \tweak text "whatever" mylyrics + ;; + ;; will try putting a lyric event with text "whatever" in the text + ;; property of lyrics. So we want expressions allowing both + ;; strings and lyrics to deliver strings: more complex conversions + ;; should only be attempted when the simple uses don't match the + ;; given predicate. + (if (ly:music? item) + (if (music-is-of-type? item 'context-specification) + ;; This is essentially dealing with the case + ;; \propertyTweak color #red \propertyTweak font-size #3 NoteHead + ;; namely when stacked tweaks end in a symbol list + ;; rather than a music expression. + ;; + ;; We have a tweak here to convert into an override, + ;; so we need to know the grob to apply it to. That's + ;; easy if we have a directed tweak, and otherwise we + ;; need to find the symbol in the expression itself. + (let* ((p (check-grob-path prop (*location*) + #:start 1 + #:default #t + #:min 2)) + (elt (ly:music-property item 'element)) + (seq (if (music-is-of-type? elt 'sequential-music) + elt + (make-sequential-music (list elt)))) + (elts (ly:music-property seq 'elements)) + (symbol (if (symbol? (car p)) + (car p) + (and (pair? elts) + (ly:music-property (car elts) + 'symbol))))) + (if (symbol? symbol) + (begin + (set! (ly:music-property seq 'elements) + (cons (make-music 'OverrideProperty + 'symbol symbol + 'grob-property-path (cdr p) + 'pop-first #t + 'grob-value value + 'origin (*location*)) + elts)) + (set! (ly:music-property item 'element) seq)) + (begin + (ly:parser-error (_ "Cannot \\propertyTweak") + (*location*)) + (ly:music-message item (_ "untweakable")))) + item) + (tweak prop value item)) + (propertyOverride (append item (if (symbol? prop) (list prop) prop)) + value))) + +propertyUnset = +#(define-music-function (property-path) + (symbol-list-or-symbol?) + (_i "Unset the context property specified by @var{property-path}. +This music function is mostly intended for use from Scheme as a +substitute for the built-in @code{\\unset} command.") + (let ((p (check-context-path property-path (*location*)))) + (if p + (context-spec-music + (make-music 'PropertyUnset + 'symbol (cadr p) + 'origin (*location*)) + (car p)) + (make-music 'Music)))) + pushToTag = -#(define-music-function (parser location tag more music) +#(define-music-function (tag more music) (symbol? ly:music? ly:music?) (_i "Add @var{more} to the front of @code{elements} of all music expressions in @var{music} that are tagged with @var{tag}.") (music-map (lambda (m) - (if (memq tag (ly:music-property m 'tags)) - (set! (ly:music-property m 'elements) - (cons more (ly:music-property m 'elements)))) - m) - music)) + (if (memq tag (ly:music-property m 'tags)) + (set! (ly:music-property m 'elements) + (cons more (ly:music-property m 'elements)))) + m) + music)) quoteDuring = -#(define-music-function (parser location what main-music) (string? ly:music?) +#(define-music-function (what main-music) (string? ly:music?) (_i "Indicate a section of music to be quoted. @var{what} indicates the name of the quoted voice, as specified in an @code{\\addQuote} command. @var{main-music} is used to indicate the length of music to be quoted; @@ -1084,8 +1506,9 @@ usually contains spacers or multi-measure rests.") 'element main-music 'quoted-music-name what)) + relative = -#(define-music-function (parser location pitch music) +#(define-music-function (pitch music) ((ly:pitch?) ly:music?) (_i "Make @var{music} relative to @var{pitch}. If @var{pitch} is omitted, the first note in @var{music} is given in absolute pitch.") @@ -1104,26 +1527,20 @@ omitted, the first note in @var{music} is given in absolute pitch.") (ly:pitch-steps (ly:make-pitch 1 0)) 2)))) (make-music 'RelativeOctaveMusic - 'element music)) + 'element music)) removeWithTag = -#(define-music-function (parser location tag music) +#(define-music-function (tags music) (symbol-list-or-symbol? ly:music?) (_i "Remove elements of @var{music} that are tagged with one of the -tags in @var{tag}. @var{tag} may be either a single symbol or a list +tags in @var{tags}. @var{tags} may be either a single symbol or a list of symbols.") (music-filter - (if (symbol? tag) - (lambda (m) - (not (memq tag (ly:music-property m 'tags)))) - (lambda (m) - (let ((music-tags (ly:music-property m 'tags))) - (or (null? music-tags) - (not (any (lambda (t) (memq t music-tags)) tag)))))) + (tags-remove-predicate tags) music)) resetRelativeOctave = -#(define-music-function (parser location pitch) (ly:pitch?) +#(define-music-function (pitch) (ly:pitch?) (_i "Set the octave inside a \\relative section.") (make-music 'SequentialMusic @@ -1131,14 +1548,14 @@ resetRelativeOctave = (lambda (music last-pitch) pitch))) retrograde = -#(define-music-function (parser location music) +#(define-music-function (music) (ly:music?) (_i "Return @var{music} in reverse order.") (retrograde-music music)) revertTimeSignatureSettings = #(define-music-function - (parser location time-signature) + (time-signature) (pair?) (_i "Revert @code{timeSignatureSettings} @@ -1146,7 +1563,7 @@ for time signatures of @var{time-signature}.") (revert-time-signature-setting time-signature)) rightHandFinger = -#(define-event-function (parser location finger) (number-or-markup?) +#(define-event-function (finger) (number-or-markup?) (_i "Apply @var{finger} as a fingering indication.") (make-music @@ -1155,14 +1572,14 @@ rightHandFinger = finger)) scaleDurations = -#(define-music-function (parser location fraction music) +#(define-music-function (fraction music) (fraction? ly:music?) (_i "Multiply the duration of events in @var{music} by @var{fraction}.") (ly:music-compress music - (ly:make-moment (car fraction) (cdr fraction)))) + (ly:make-moment (car fraction) (cdr fraction)))) settingsFrom = -#(define-scheme-function (parser location ctx music) +#(define-scheme-function (ctx music) ((symbol?) ly:music?) (_i "Take the layout instruction events from @var{music}, optionally restricted to those applying to context type @var{ctx}, and return @@ -1170,50 +1587,50 @@ a context modification duplicating their effect.") (let ((mods (ly:make-context-mod))) (define (musicop m) (if (music-is-of-type? m 'layout-instruction-event) - (ly:add-context-mod - mods - (case (ly:music-property m 'name) - ((PropertySet) - (list 'assign - (ly:music-property m 'symbol) - (ly:music-property m 'value))) - ((PropertyUnset) - (list 'unset - (ly:music-property m 'symbol))) - ((OverrideProperty) - (cons* 'push - (ly:music-property m 'symbol) - (ly:music-property m 'grob-value) + (ly:add-context-mod + mods + (case (ly:music-property m 'name) + ((PropertySet) + (list 'assign + (ly:music-property m 'symbol) + (ly:music-property m 'value))) + ((PropertyUnset) + (list 'unset + (ly:music-property m 'symbol))) + ((OverrideProperty) + (cons* 'push + (ly:music-property m 'symbol) + (ly:music-property m 'grob-value) (cond ((ly:music-property m 'grob-property #f) => list) (else (ly:music-property m 'grob-property-path))))) - ((RevertProperty) - (cons* 'pop - (ly:music-property m 'symbol) + ((RevertProperty) + (cons* 'pop + (ly:music-property m 'symbol) (cond ((ly:music-property m 'grob-property #f) => list) (else (ly:music-property m 'grob-property-path))))))) - (case (ly:music-property m 'name) - ((ApplyContext) - (ly:add-context-mod mods - (list 'apply - (ly:music-property m 'procedure)))) - ((ContextSpeccedMusic) - (if (or (not ctx) - (eq? ctx (ly:music-property m 'context-type))) - (musicop (ly:music-property m 'element)))) - (else - (let ((callback (ly:music-property m 'elements-callback))) - (if (procedure? callback) - (for-each musicop (callback m)))))))) + (case (ly:music-property m 'name) + ((ApplyContext) + (ly:add-context-mod mods + (list 'apply + (ly:music-property m 'procedure)))) + ((ContextSpeccedMusic) + (if (or (not ctx) + (eq? ctx (ly:music-property m 'context-type))) + (musicop (ly:music-property m 'element)))) + (else + (let ((callback (ly:music-property m 'elements-callback))) + (if (procedure? callback) + (for-each musicop (callback m)))))))) (musicop music) mods)) shape = -#(define-music-function (parser location offsets item) - (list? symbol-list-or-music?) +#(define-music-function (offsets item) + (list? key-list-or-music?) (_i "Offset control-points of @var{item} by @var{offsets}. The argument is a list of number pairs or list of such lists. Each element of a pair represents an offset to one of the coordinates of a @@ -1221,15 +1638,11 @@ control-point. If @var{item} is a string, the result is @code{\\once\\override} for the specified grob type. If @var{item} is a music expression, the result is the same music expression with an appropriate tweak applied.") - (define (shape-curve grob) + (define (shape-curve grob coords) (let* ((orig (ly:grob-original grob)) (siblings (if (ly:spanner? grob) (ly:spanner-broken-into orig) '())) - (total-found (length siblings)) - (function (assoc-get 'control-points - (reverse (ly:grob-basic-properties grob)))) - (coords (function grob))) - + (total-found (length siblings))) (define (offset-control-points offsets) (if (null? offsets) coords @@ -1252,20 +1665,20 @@ appropriate tweak applied.") (if (>= total-found 2) (helper siblings offsets) (offset-control-points (car offsets))))) - #{ \once \tweak control-points #shape-curve #item #}) + (once (propertyTweak 'control-points + (grob-transformer 'control-points shape-curve) + item))) shiftDurations = -#(define-music-function (parser location dur dots arg) +#(define-music-function (dur dots arg) (integer? integer? ly:music?) (_i "Change the duration of @var{arg} by adding @var{dur} to the @code{durlog} of @var{arg} and @var{dots} to the @code{dots} of @var{arg}.") - (music-map - (lambda (x) - (shift-one-duration-log x dur dots)) arg)) + (shift-duration-log arg dur dots)) single = -#(define-music-function (parser location overrides music) +#(define-music-function (overrides music) (ly:music? ly:music?) (_i "Convert @var{overrides} to tweaks and apply them to @var{music}. This does not convert @code{\\revert}, @code{\\set} or @code{\\unset}.") @@ -1289,10 +1702,10 @@ This does not convert @code{\\revert}, @code{\\set} or @code{\\unset}.") music) skip = -#(define-music-function (parser location dur) (ly:duration?) +#(define-music-function (dur) (ly:duration?) (_i "Skip forward by @var{dur}.") (make-music 'SkipMusic - 'duration dur)) + 'duration dur)) slashedGrace = @@ -1301,36 +1714,42 @@ slashedGrace = the following music expression")) spacingTweaks = -#(define-music-function (parser location parameters) (list?) +#(define-music-function (parameters) (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))) - (cons 'system-Y-extent (cdr (assoc 'system-Y-extent parameters)))) - #}) + (overrideProperty + '(Score NonMusicalPaperColumn line-break-system-details) + (list (cons 'alignment-extra-space (cdr (assoc 'system-stretch parameters))) + (cons 'system-Y-extent (cdr (assoc 'system-Y-extent parameters)))))) styledNoteHeads = -#(define-music-function (parser location style heads music) +#(define-music-function (style heads music) (symbol? symbol-list-or-symbol? ly:music?) (_i "Set @var{heads} in @var{music} to @var{style}.") (style-note-heads heads style music)) tag = -#(define-music-function (parser location tag music) (symbol-list-or-symbol? ly:music?) - (_i "Tag the following @var{music} with @var{tag} and return the -result, by adding the single symbol or symbol list @var{tag} to the +#(define-music-function (tags music) (symbol-list-or-symbol? ly:music?) + (_i "Tag the following @var{music} with @var{tags} and return the +result, by adding the single symbol or symbol list @var{tags} to the @code{tags} property of @var{music}.") (set! (ly:music-property music 'tags) - ((if (symbol? tag) cons append) - tag + ((if (symbol? tags) cons append) + tags (ly:music-property music 'tags))) music) +tagGroup = +#(define-void-function (tags) (symbol-list?) + (_i "Define a tag group comprising the symbols in the symbol list +@var{tags}. Tag groups must not overlap.") + (let ((err (define-tag-group tags))) + (if err (ly:parser-error err (*location*))))) + temporary = -#(define-music-function (parser location music) +#(define-music-function (music) (ly:music?) (_i "Make any @code{\\override} in @var{music} replace an existing grob property value only temporarily, restoring the old value when a @@ -1363,7 +1782,7 @@ property-changing music that isn't an @code{\\override}.") (else (if (not warned) (begin - (ly:input-warning location (_ "Cannot make ~a revertible") + (ly:input-warning (*location*) (_ "Cannot make ~a revertible") (ly:music-property m 'name)) (set! warned #t))) #t)))) @@ -1371,7 +1790,7 @@ property-changing music that isn't an @code{\\override}.") music) time = -#(define-music-function (parser location beat-structure fraction) +#(define-music-function (beat-structure fraction) ((number-list? '()) fraction?) (_i "Set @var{fraction} as time signature, with optional number list @var{beat-structure} before it.") @@ -1381,17 +1800,17 @@ number list @var{beat-structure} before it.") 'beat-structure beat-structure)) times = -#(define-music-function (parser location fraction music) +#(define-music-function (fraction music) (fraction? ly:music?) (_i "Scale @var{music} in time by @var{fraction}.") (make-music 'TimeScaledMusic - 'element (ly:music-compress music (ly:make-moment (car fraction) (cdr fraction))) - 'numerator (car fraction) - 'denominator (cdr fraction))) + 'element (ly:music-compress music (ly:make-moment (car fraction) (cdr fraction))) + 'numerator (car fraction) + 'denominator (cdr fraction))) transpose = #(define-music-function - (parser location from to music) + (from to music) (ly:pitch? ly:pitch? ly:music?) (_i "Transpose @var{music} from pitch @var{from} to pitch @var{to}.") @@ -1400,27 +1819,27 @@ transpose = transposedCueDuring = #(define-music-function - (parser location what dir pitch main-music) + (what dir pitch main-music) (string? ly:dir? ly:pitch? ly:music?) (_i "Insert notes from the part @var{what} into a voice called @code{cue}, using the transposition defined by @var{pitch}. This happens -simultaneously with @var{main-music}, which is usually a rest. The +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.") (make-music 'QuoteMusic - 'element main-music - 'quoted-context-type 'CueVoice - 'quoted-context-id "cue" - 'quoted-music-name what - 'quoted-voice-direction dir + 'element main-music + 'quoted-context-type 'CueVoice + 'quoted-context-id "cue" + 'quoted-music-name what + 'quoted-voice-direction dir ;; following is inverse of instrumentTransposition for ;; historical reasons - 'quoted-transposition pitch)) + 'quoted-transposition pitch)) transposition = -#(define-music-function (parser location pitch) (ly:pitch?) +#(define-music-function (pitch) (ly:pitch?) (_i "Set instrument transposition") (context-spec-music @@ -1428,7 +1847,7 @@ transposition = 'Staff)) tuplet = -#(define-music-function (parser location ratio tuplet-span music) +#(define-music-function (ratio tuplet-span music) (fraction? (ly:duration? '()) ly:music?) (_i "Scale the given @var{music} to tuplets. @var{ratio} is a fraction that specifies how many notes are played in place of the @@ -1451,7 +1870,7 @@ quarter note.") 'duration tuplet-span)) tupletSpan = -#(define-music-function (parser location tuplet-span) +#(define-music-function (tuplet-span) ((ly:duration?)) (_i "Set @code{tupletSpannerDuration}, the length into which @code{\\tuplet} without an explicit @samp{tuplet-span} argument of its @@ -1467,10 +1886,10 @@ command without explicit @samp{tuplet-span}, use #{ \unset tupletSpannerDuration #})) tweak = -#(define-music-function (parser location prop value item) - (symbol-list-or-symbol? scheme? symbol-list-or-music?) - (_i "Add a tweak to the following @var{item}, usually music. -Layout objects created by @var{item} get their property @var{prop} +#(define-music-function (prop value music) + (key-list-or-symbol? scheme? ly:music?) + (_i "Add a tweak to the following @var{music}. +Layout objects created by @var{music} get their property @var{prop} set to @var{value}. If @var{prop} has the form @samp{Grob.property}, like with @example \\tweak Accidental.color #red cis' @@ -1479,44 +1898,29 @@ an indirectly created grob (@samp{Accidental} is caused by @samp{NoteHead}) can be tweaked; otherwise only directly created grobs are affected. -As a special case, @var{item} may be a symbol list specifying a grob -path, in which case @code{\\override} is called on it instead of -creating tweaked music. This is mainly useful when using -@code{\\tweak} as as a component for building other functions. - -If this use case would call for @code{\\once \\override} rather than a -plain @code{\\override}, writing @code{\\once \\tweak @dots{}} can be -convenient. - @var{prop} can contain additional elements in which case a nested property (inside of an alist) is tweaked.") - (if (ly:music? item) - (let ((p (check-grob-path prop parser location - #:start 1 - #:default #t - #:min 2))) - (if p - (set! (ly:music-property item 'tweaks) - (acons (cond ((pair? (cddr p)) p) - ((symbol? (car p)) - (cons (car p) (cadr p))) - (else (cadr p))) - value - (ly:music-property item 'tweaks)))) - item) - ;; We could just throw this at \override and let it sort this - ;; out on its own, but this way we should get better error - ;; diagnostics. - (let ((p (check-grob-path - (append item (if (symbol? prop) (list prop) prop)) - parser location - #:default 'Bottom #:min 3))) - (if p - #{ \override #p = #value #} - (make-music 'Music))))) + (let ((p (check-grob-path prop (*location*) + #:start 1 + #:default #t + #:min 2))) + (cond ((not p)) + ;; p now contains at least two elements. The first + ;; element is #t when no grob has been explicitly + ;; specified, otherwise it is a grob name. + (else + (set! (ly:music-property music 'tweaks) + (acons (cond ((pair? (cddr p)) p) + ((symbol? (car p)) + (cons (car p) (cadr p))) + (else (cadr p))) + value + (ly:music-property music 'tweaks))))) + music)) + undo = -#(define-music-function (parser location music) +#(define-music-function (music) (ly:music?) (_i "Convert @code{\\override} and @code{\\set} in @var{music} to @code{\\revert} and @code{\\unset}, respectively. Any reverts and @@ -1527,10 +1931,10 @@ unsets already in @var{music} cause a warning. Non-property-related music is ig (let ((lst (fold-some-music - (lambda (m) (or (music-is-of-type? m 'layout-instruction-event) - (music-is-of-type? m 'context-specification) - (music-is-of-type? m 'apply-context) - (music-is-of-type? m 'time-signature-music))) + (music-type-predicate '(layout-instruction-event + context-specification + apply-context + time-signature-music)) (lambda (m overrides) (case (ly:music-property m 'name) ((OverrideProperty) @@ -1557,7 +1961,7 @@ unsets already in @var{music} cause a warning. Non-property-related music is ig (else (if (not warned) (begin - (ly:input-warning location (_ "Cannot revert ~a") + (ly:input-warning (*location*) (_ "Cannot revert ~a") (ly:music-property m 'name)) (set! warned #t))) overrides))) @@ -1569,20 +1973,20 @@ unsets already in @var{music} cause a warning. Non-property-related music is ig (else (make-sequential-music lst)))))) unfoldRepeats = -#(define-music-function (parser location music) (ly:music?) +#(define-music-function (music) (ly:music?) (_i "Force any @code{\\repeat volta}, @code{\\repeat tremolo} or @code{\\repeat percent} commands in @var{music} to be interpreted as @code{\\repeat unfold}.") (unfold-repeats music)) void = -#(define-void-function (parser location arg) (scheme?) +#(define-void-function (arg) (scheme?) (_i "Accept a scheme argument, return a void expression. Use this if you want to have a scheme expression evaluated because of its side-effects, but its value ignored.")) withMusicProperty = -#(define-music-function (parser location sym val music) +#(define-music-function (sym val music) (symbol? scheme? ly:music?) (_i "Set @var{sym} to @var{val} in @var{music}.") diff --git a/ly/nederlands.ly b/ly/nederlands.ly index 7555281ee3..922c1ef6d9 100644 --- a/ly/nederlands.ly +++ b/ly/nederlands.ly @@ -1,7 +1,7 @@ %%%% common Dutch names for notes %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 1996--2012 Han-Wen Nienhuys +%%%% Copyright (C) 1996--2015 Han-Wen Nienhuys %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/norsk.ly b/ly/norsk.ly index 144ea82b04..ab2367b1c9 100644 --- a/ly/norsk.ly +++ b/ly/norsk.ly @@ -1,7 +1,7 @@ %%%% common Norwegian names for notes %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2010--2012 Valentin Villenave +%%%% Copyright (C) 2010--2015 Valentin Villenave %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/paper-defaults-init.ly b/ly/paper-defaults-init.ly index 07ee79176b..a106ba9a10 100644 --- a/ly/paper-defaults-init.ly +++ b/ly/paper-defaults-init.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2004--2012 Han-Wen Nienhuys +%%%% Copyright (C) 2004--2015 Han-Wen Nienhuys %%%% Jan Nieuwenhuizen %%%% Neil Puttock %%%% @@ -60,14 +60,32 @@ %% Flexible vertical spacing %% %% Note: these are not scaled; they are in staff-spaces. - system-system-spacing = #'((basic-distance . 12) (minimum-distance . 8) (padding . 1) (stretchability . 60)) - score-system-spacing = #'((basic-distance . 14) (minimum-distance . 8) (padding . 1) (stretchability . 120)) - markup-system-spacing = #'((basic-distance . 5) (padding . 0.5) (stretchability . 30)) - score-markup-spacing = #'((basic-distance . 12) (padding . 0.5) (stretchability . 60)) - markup-markup-spacing = #'((basic-distance . 1) (padding . 0.5)) - top-system-spacing = #'((basic-distance . 1) (minimum-distance . 0) (padding . 1)) - top-markup-spacing = #'((basic-distance . 0) (minimum-distance . 0) (padding . 1)) - last-bottom-spacing = #'((basic-distance . 1) (minimum-distance . 0) (padding . 1) (stretchability . 30)) + system-system-spacing = #'((basic-distance . 12) + (minimum-distance . 8) + (padding . 1) + (stretchability . 60)) + score-system-spacing = #'((basic-distance . 14) + (minimum-distance . 8) + (padding . 1) + (stretchability . 120)) + markup-system-spacing = #'((basic-distance . 5) + (padding . 0.5) + (stretchability . 30)) + score-markup-spacing = #'((basic-distance . 12) + (padding . 0.5) + (stretchability . 60)) + markup-markup-spacing = #'((basic-distance . 1) + (padding . 0.5)) + top-system-spacing = #'((basic-distance . 1) + (minimum-distance . 0) + (padding . 1)) + top-markup-spacing = #'((basic-distance . 0) + (minimum-distance . 0) + (padding . 1)) + last-bottom-spacing = #'((basic-distance . 1) + (minimum-distance . 0) + (padding . 1) + (stretchability . 30)) %% @@ -119,6 +137,7 @@ first-page-number = #1 print-first-page-number = ##f print-page-number = ##t + page-number-type = #'arabic %% %% Headers, footers, and titles diff --git a/ly/performer-init.ly b/ly/performer-init.ly index 1cb48f8445..00c4bdf3da 100644 --- a/ly/performer-init.ly +++ b/ly/performer-init.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 1996--2012 Han-Wen Nienhuys +%%%% Copyright (C) 1996--2015 Han-Wen Nienhuys %%%% Jan Nieuwenhuizen %%%% %%%% LilyPond is free software: you can redistribute it and/or modify @@ -16,7 +16,7 @@ %%%% You should have received a copy of the GNU General Public License %%%% along with LilyPond. If not, see . -\version "2.17.14" +\version "2.19.16" %% %% setup for Request->Element conversion. @@ -24,9 +24,9 @@ \context { \type "Performer_group" \name Staff - \accepts Voice \accepts CueVoice \accepts NullVoice + \accepts Voice \defaultchild Voice \consists "Staff_performer" @@ -42,45 +42,56 @@ } \context { - \type "Performer_group" + \Staff \name KievanStaff + \alias Staff \denies Voice \accepts KievanVoice \defaultchild KievanVoice - \alias Staff - \consists "Staff_performer" - \consists "Key_performer" - \consists "Midi_control_function_performer" } \context { - \type "Performer_group" + \Staff \name VaticanaStaff \alias Staff \denies Voice \accepts VaticanaVoice \defaultchild VaticanaVoice - \consists "Staff_performer" - \consists "Key_performer" - \consists "Midi_control_function_performer" } \context { - \type "Performer_group" + \Staff \name MensuralStaff + \alias Staff \denies Voice \accepts MensuralVoice \defaultchild MensuralVoice +} + +\context { + \Staff + \name PetrucciStaff \alias Staff - \consists "Staff_performer" - \consists "Key_performer" - \consists "Midi_control_function_performer" + \denies Voice + \accepts PetrucciVoice + \defaultchild PetrucciVoice +} + +\context { + \Staff + \name GregorianTranscriptionStaff + \alias Staff + \denies Voice + \accepts GregorianTranscriptionVoice + \defaultchild GregorianTranscriptionVoice } \context { \Staff \name DrumStaff + \alias Staff midiInstrument = #"drums" + \denies Voice \accepts DrumVoice \defaultchild DrumVoice } @@ -103,46 +114,46 @@ } \context { - \type "Performer_group" + \Voice \name VaticanaVoice \alias Voice - \consists "Dynamic_performer" - \consists "Tie_performer" - \consists "Note_performer" - \consists "Beam_performer" - autoBeaming = ##f % needed for consistent melismata with engravers - \consists "Slur_performer" + autoBeaming = ##f % needed for consistent melismata with engravers" } \context { - \type "Performer_group" + \Voice \name KievanVoice \alias Voice - \consists "Dynamic_performer" - \consists "Tie_performer" - \consists "Note_performer" - \consists "Beam_performer" - autoBeaming = ##f % needed for consistent melismata with engravers - \consists "Slur_performer" + autoBeaming = ##f % needed for consistent melismata with engravers" } \context { - \type "Performer_group" + \Voice \name MensuralVoice \alias Voice - \consists "Dynamic_performer" - \consists "Tie_performer" - \consists "Note_performer" - \consists "Beam_performer" autoBeaming = ##f % needed for consistent melismata with engravers - \consists "Slur_performer" } \context { \Voice + \name PetrucciVoice + \alias Voice + autoBeaming = ##f % needed for consistent melismata with engravers +} + +\context { + \Voice + \name GregorianTranscriptionVoice + \alias Voice + autoBeaming = ##f % needed for consistent melismata with engravers +} + +\context { + \Voice + \name DrumVoice + \alias Voice \remove "Note_performer" \consists "Drum_note_performer" - \name DrumVoice } \context { @@ -153,33 +164,40 @@ \context { \type "Performer_group" \name FretBoards + \alias Staff } \context { \type "Performer_group" \name GrandStaff + \accepts ChordNames + \accepts DrumStaff + \accepts Dynamics + \accepts FiguredBass + \accepts Lyrics \accepts RhythmicStaff \accepts Staff - \accepts Dynamics + \accepts TabStaff \defaultchild Staff } \context { - \type "Performer_group" - \name "PianoStaff" - \accepts Staff - \accepts DrumStaff - \defaultchild Staff + \GrandStaff + \name PianoStaff + \alias GrandStaff } \context { \Voice \name TabVoice + \alias Voice } \context { \type "Performer_group" - \name "Devnull" + \name Devnull + \alias Voice + \alias Staff } \context { @@ -188,9 +206,6 @@ \alias Staff \alias Voice %% needed for melismata - %% TODO: at least the tie performer likely does not work without the - %% Note_performer, but I don't know how to shut note output off in - %% MIDI. \consists "Tie_performer" \consists "Beam_performer" \consists "Slur_performer" @@ -201,6 +216,7 @@ \name TabStaff midiInstrument = #"acoustic guitar (nylon)" \alias Staff + \denies Voice \accepts TabVoice \defaultchild TabVoice autoBeaming = ##f % needed for consistent melismata with engravers @@ -218,22 +234,28 @@ %% quarter = 60 tempoWholesPerMinute = #(ly:make-moment 15/1) - \accepts Staff + \accepts ChoirStaff + \accepts ChordNames + \accepts Devnull \accepts DrumStaff + \accepts Dynamics + \accepts FiguredBass \accepts GrandStaff + \accepts GregorianTranscriptionStaff + \accepts KievanStaff + \accepts Lyrics + \accepts MensuralStaff + \accepts NoteNames + \accepts NullVoice + \accepts OneStaff + \accepts PetrucciStaff \accepts PianoStaff - \accepts TabStaff - \accepts StaffGroup - \accepts Devnull - \accepts ChoirStaff \accepts RhythmicStaff - \accepts ChordNames - \accepts FiguredBass \accepts FretBoards - \accepts Lyrics + \accepts Staff + \accepts StaffGroup + \accepts TabStaff \accepts VaticanaStaff - \accepts KievanStaff - \accepts MensuralStaff \consists "Time_signature_performer" \consists "Control_track_performer" @@ -263,6 +285,14 @@ dynamicAbsoluteVolumeFunction = #default-dynamic-absolute-volume instrumentEqualizer = #default-instrument-equalizer drumPitchTable = #(alist->hash-table midiDrumPitches) + + %% \quoteDuring is supposed to quote everything but we don't admit + %% cue events by default in order not to get multiple midi + %% renditions in an orchestral score. + + quotedEventTypes = #'(StreamEvent) + quotedCueEventTypes = #'() + timing = ##t } @@ -277,47 +307,84 @@ \context{ \type "Performer_group" \name ChoirStaff - \accepts Staff + \accepts ChoirStaff + \accepts ChordNames + \accepts FiguredBass \accepts DrumStaff + \accepts GrandStaff + \accepts Lyrics + \accepts OneStaff + \accepts PianoStaff + \accepts RhythmicStaff + \accepts Staff + \accepts StaffGroup \defaultchild Staff } \context { \type "Performer_group" \consists "Staff_performer" - \accepts ChordNameVoice - \defaultchild ChordNameVoice - \name ChordNames + \name NoteNames } \context { - \Voice - \name ChordNameVoice + \Voice % We want all the actual performers + \name ChordNames + \alias Staff % Catch Staff-level overrides like + % \key, \transposition + \consists "Staff_performer" } \context { \type "Performer_group" \name StaffGroup - \accepts Staff - \accepts DrumStaff - \accepts TabStaff - \accepts RhythmicStaff - \accepts GrandStaff - \accepts PianoStaff - \accepts Lyrics + \accepts ChoirStaff \accepts ChordNames + \accepts DrumStaff \accepts FiguredBass \accepts FretBoards + \accepts GrandStaff + \accepts Lyrics + \accepts OneStaff + \accepts PianoStaff + \accepts RhythmicStaff + \accepts Staff + \accepts StaffGroup + \accepts TabStaff \defaultchild Staff } +\context { + \type "Performer_group" + \name "OneStaff" + \accepts "ChordNames" + \accepts "DrumStaff" + \accepts "Dynamics" + \accepts "FiguredBass" + \accepts "FretBoards" + \accepts "GregorianTranscriptionStaff" + \accepts "KievanStaff" + \accepts "Lyrics" + \accepts "MensuralStaff" + \accepts "NoteNames" + \accepts "PetrucciStaff" + \accepts "RhythmicStaff" + \accepts "Staff" + \accepts "TabStaff" + \accepts "VaticanaStaff" + \defaultchild "Staff" +} + \context { \Staff \name RhythmicStaff + \alias Staff + \defaultchild Voice } \context { \type "Performer_group" \name Dynamics + \alias Voice \consists "Piano_pedal_performer" } diff --git a/ly/piano-tkit.ly b/ly/piano-tkit.ly new file mode 100644 index 0000000000..2ec4b14e9f --- /dev/null +++ b/ly/piano-tkit.ly @@ -0,0 +1,43 @@ +%\version "2.19.22" + +\include "staff-tkit.ly" + +make-pianostaff = +#(define-music-function () () + +(if (not PianoRHMidiInstrument) + (set! PianoRHMidiInstrument + (if PianoMidiInstrument + PianoMidiInstrument + "acoustic grand"))) + +(if (not PianoLHMidiInstrument) + (set! PianoLHMidiInstrument + (if PianoMidiInstrument + PianoMidiInstrument + "acoustic grand"))) + + (if (or + PianoRHMusic + PianoLHMusic) + #{ + +\new PianoStaff = "PianoStaff" + \with { + instrumentName = \markup \smallCaps + #(if PianoInstrumentName + PianoInstrumentName + "Piano" ) + shortInstrumentName = \markup \smallCaps + #(if PianoShortInstrumentName + PianoShortInstrumentName + "") + } + << + \make-one-voice-staff ##f "PianoRH" "treble" "" + #(if PianoDynamics + #{ \new Dynamics = "PianoDynamics" { #PianoDynamics } #} ) + \make-one-voice-staff ##f "PianoLH" "bass" "" + >> + #} + (make-music 'SequentialMusic 'void #t))) diff --git a/ly/portugues.ly b/ly/portugues.ly index 774119d420..40077b864e 100644 --- a/ly/portugues.ly +++ b/ly/portugues.ly @@ -1,7 +1,7 @@ %%%% common Portuguese names for notes %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2010--2012 Valentin Villenave +%%%% Copyright (C) 2010--2015 Valentin Villenave %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/predefined-fretboards-init.ly b/ly/predefined-fretboards-init.ly index 705e962872..acf116dd69 100644 --- a/ly/predefined-fretboards-init.ly +++ b/ly/predefined-fretboards-init.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2008--2012 Carl D. Sorensen +%%%% Copyright (C) 2008--2015 Carl D. Sorensen %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by @@ -15,7 +15,7 @@ %%%% You should have received a copy of the GNU General Public License %%%% along with LilyPond. If not, see . -\version "2.16.0" +\version "2.19.22" % chord-shape-table is a hash-table of chord shapes % in the form of diagram-descriptions that can be @@ -30,7 +30,7 @@ % chord-shape-table addChordShape = -#(define-void-function (parser location key-symbol tuning shape-definition) +#(define-void-function (key-symbol tuning shape-definition) (symbol? pair? string-or-pair?) (_i "Add chord shape @var{shape-definition} to the @var{chord-shape-table} hash with the key @code{(cons @var{key-symbol} @var{tuning})}.") @@ -62,7 +62,7 @@ table @code{rest}." storePredefinedDiagram = #(define-void-function - (parser location fretboard-table chord tuning diagram-definition) + (fretboard-table chord tuning diagram-definition) (hash-table? ly:music? pair? string-or-pair?) (_i "Add predefined fret diagram defined by @var{diagram-definition} for the chord pitches @var{chord} and the stringTuning @var{tuning}.") diff --git a/ly/predefined-guitar-fretboards.ly b/ly/predefined-guitar-fretboards.ly index 733b3a7514..0a93939a71 100644 --- a/ly/predefined-guitar-fretboards.ly +++ b/ly/predefined-guitar-fretboards.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2008--2012 Carl D. Sorensen +%%%% Copyright (C) 2008--2015 Carl D. Sorensen %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/predefined-guitar-ninth-fretboards.ly b/ly/predefined-guitar-ninth-fretboards.ly index 3271397648..cd8a7e589a 100644 --- a/ly/predefined-guitar-ninth-fretboards.ly +++ b/ly/predefined-guitar-ninth-fretboards.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2008--2012 by Jonathan Kulp +%%%% Copyright (C) 2008--2015 by Jonathan Kulp %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by @@ -24,52 +24,52 @@ \storePredefinedDiagram #default-fret-table \chordmode {c:9} #guitar-tuning - #(chord-shape 'c:9 guitar-tuning) + #(chord-shape 'c:9 guitar-tuning) \storePredefinedDiagram #default-fret-table \chordmode {cis:9} #guitar-tuning - #(offset-fret 1 (chord-shape 'c:9 guitar-tuning)) + #(offset-fret 1 (chord-shape 'c:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {des:9} #guitar-tuning - #(offset-fret 1 (chord-shape 'c:9 guitar-tuning)) + #(offset-fret 1 (chord-shape 'c:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {d:9} #guitar-tuning - #(offset-fret 2 (chord-shape 'c:9 guitar-tuning)) + #(offset-fret 2 (chord-shape 'c:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {dis:9} #guitar-tuning - #(offset-fret 3 (chord-shape 'c:9 guitar-tuning)) + #(offset-fret 3 (chord-shape 'c:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {ees:9} #guitar-tuning - #(offset-fret 3 (chord-shape 'c:9 guitar-tuning)) + #(offset-fret 3 (chord-shape 'c:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {e:9} #guitar-tuning - #"o;2-2;o;1-1;o;2-3;" + #"o;2-2;o;1-1;o;2-3;" \storePredefinedDiagram #default-fret-table \chordmode {f:9} #guitar-tuning - #(chord-shape 'f:9 guitar-tuning) + #(chord-shape 'f:9 guitar-tuning) \storePredefinedDiagram #default-fret-table \chordmode {fis:9} #guitar-tuning - #(offset-fret 1 (chord-shape 'f:9 guitar-tuning)) + #(offset-fret 1 (chord-shape 'f:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {ges:9} #guitar-tuning - #(offset-fret 1 (chord-shape 'f:9 guitar-tuning)) + #(offset-fret 1 (chord-shape 'f:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {g:9} #guitar-tuning - #(offset-fret 2 (chord-shape 'f:9 guitar-tuning)) + #(offset-fret 2 (chord-shape 'f:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {gis:9} #guitar-tuning - #(offset-fret 3 (chord-shape 'f:9 guitar-tuning)) + #(offset-fret 3 (chord-shape 'f:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {aes:9} #guitar-tuning - #(offset-fret 3 (chord-shape 'f:9 guitar-tuning)) + #(offset-fret 3 (chord-shape 'f:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {a:9} #guitar-tuning - #(offset-fret 4 (chord-shape 'f:9 guitar-tuning)) + #(offset-fret 4 (chord-shape 'f:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {ais:9} #guitar-tuning - #(offset-fret 5 (chord-shape 'f:9 guitar-tuning)) + #(offset-fret 5 (chord-shape 'f:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {bes:9} #guitar-tuning - #(offset-fret 5 (chord-shape 'f:9 guitar-tuning)) + #(offset-fret 5 (chord-shape 'f:9 guitar-tuning)) \storePredefinedDiagram #default-fret-table \chordmode {b:9} #guitar-tuning - #(offset-fret -1 (chord-shape 'c:9 guitar-tuning)) + #(offset-fret -1 (chord-shape 'c:9 guitar-tuning)) diff --git a/ly/predefined-mandolin-fretboards.ly b/ly/predefined-mandolin-fretboards.ly index 1b8cb09578..4a19f69113 100644 --- a/ly/predefined-mandolin-fretboards.ly +++ b/ly/predefined-mandolin-fretboards.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2011--2012 Marc Hohl +%%%% Copyright (C) 2011--2015 Marc Hohl %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/predefined-ukulele-fretboards.ly b/ly/predefined-ukulele-fretboards.ly index 80f55aca1f..f3258b7e0c 100644 --- a/ly/predefined-ukulele-fretboards.ly +++ b/ly/predefined-ukulele-fretboards.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2009--2012 Matt Corks +%%%% Copyright (C) 2009--2015 Matt Corks %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/property-init.ly b/ly/property-init.ly index 42a1d5100c..85adb52bb0 100644 --- a/ly/property-init.ly +++ b/ly/property-init.ly @@ -1,6 +1,6 @@ % property-init.ly -\version "2.17.24" +\version "2.19.22" %% for dashed slurs, phrasing slurs, and ties #(define (make-simple-dash-definition dash-fraction dash-period) @@ -9,13 +9,14 @@ %% common definition for all note head styles reverting %% (palm mute, harmonics, dead notes, ...) defaultNoteHeads = -#(define-music-function (parser location) () - (_i "Revert to the default note head style.") - (revert-head-style '(NoteHead TabNoteHead))) +#(define-music-function () () + (_i "Revert to the default note head style.") + (context-spec-music + (revert-head-style '(NoteHead TabNoteHead)) 'Bottom)) accidentalStyle = #(define-music-function - (parser location style) (symbol-list?) + (style) (symbol-list?) (_i "Set accidental style to symbol list @var{style} in the form @samp{piano-cautionary}. If @var{style} has a form like @samp{Staff.piano-cautionary}, the settings are applied to that @@ -25,8 +26,8 @@ piano styles, which use @samp{GrandStaff} as a context." ) ((1) (set-accidental-style (car style))) ((2) (set-accidental-style (cadr style) (car style))) (else - (ly:parser-error parser (_ "not an accidental style") - location) + (ly:parser-error (_ "not an accidental style") + (*location*)) (make-music 'Music)))) %% arpeggios @@ -91,7 +92,7 @@ balloonLengthOff = { defineBarLine = #(define-void-function - (parser location bar glyph-list) (string? list?) + (bar glyph-list) (string? list?) (_i "Define bar line settings for bar line @var{bar}. The list @var{glyph-list} must have three entries which define the appearance at the end of line, at the beginning of the next line, @@ -196,25 +197,14 @@ easyHeadsOff = { } -%% endincipit - -%% End the incipit and print a ``normal line start''. -endincipit = \context Staff { - \partial 16 s16 % Hack to handle e.g. \bar ".|" \endincipit - \once \override Staff.Clef.full-size-change = ##t - \once \override Staff.Clef.non-default = ##t - \bar "" -} - - %% fermata markup fermataMarkup = #(make-music 'MultiMeasureTextEvent - ;; Set the 'text based on the 'direction - 'text (make-fermata-markup) + ;; Set the 'text based on the 'direction + 'text (make-fermata-markup) 'tweaks '((outside-staff-priority . 40) - (outside-staff-padding . 0))) + (outside-staff-padding . 0))) %% font sizes @@ -234,12 +224,13 @@ glissando = #(make-music 'GlissandoEvent) %% harmonics harmonicsOn = -#(define-music-function (parser location) () - (_i "Set the default note head style to a diamond-shaped style.") - (override-head-style '(NoteHead TabNoteHead) 'harmonic)) +#(define-music-function () () + (_i "Set the default note head style to a diamond-shaped style.") + (context-spec-music + (override-head-style '(NoteHead TabNoteHead) 'harmonic) 'Bottom)) harmonicsOff = \defaultNoteHeads harmonicNote = -#(define-music-function (parser location note) (ly:music?) +#(define-music-function (note) (ly:music?) (_i "Print @var{note} with a diamond-shaped note head.") (style-note-heads 'NoteHead 'harmonic note)) @@ -273,16 +264,68 @@ unHideNotes = { improvisationOn = { \set squashedPosition = #0 \override NoteHead.style = #'slash + \override TabNoteHead.style = #'slash \override Accidental.stencil = ##f \override AccidentalCautionary.stencil = ##f } improvisationOff = { \unset squashedPosition \revert NoteHead.style + \revert TabNoteHead.style \revert Accidental.stencil \revert AccidentalCautionary.stencil } +%% incipit + +incipit = +#(define-music-function (incipit-music) (ly:music?) + (_i "Output @var{incipit-music} before the main staff as an indication of + its appearance in the original music.") + #{ + \once \override Staff.InstrumentName.stencil = + #(lambda (grob) + (let* ((instrument-name (ly:grob-property grob 'long-text)) + (align-x (ly:grob-property grob 'self-alignment-X 0)) + (align-y (ly:grob-property grob 'self-alignment-Y 0))) + (set! (ly:grob-property grob 'long-text) + #{ \markup { + \score + { + \new MensuralStaff \with { + \override InstrumentName.self-alignment-X = #align-x + \override InstrumentName.self-alignment-Y = #align-y + instrumentName = #instrument-name + } + { + $incipit-music + } + \layout { + $(ly:grob-layout grob) + indent-incipit-default = 15\mm + line-width = #(primitive-eval + '(or (false-if-exception indent) + indent-incipit-default)) + indent = #(primitive-eval + '(or (false-if-exception (- line-width incipit-width)) + (* 0.5 line-width))) + ragged-right = ##f + ragged-last = ##f + system-count = 1 + \context { + \Score + \remove "Default_bar_line_engraver" + } + } + } + } + #}) + (set! (ly:grob-property grob 'self-alignment-Y) #f) + (set! (ly:grob-property grob 'self-alignment-X) RIGHT) + (system-start-text::print grob))) + #} +) + %% kievan kievanOn = { \override NoteHead.style = #'kievan @@ -313,6 +356,24 @@ kievanOff = { \revert NoteHead.duration-log } +%% line and page breaking controls + +autoLineBreaksOff = { + \overrideProperty Score.NonMusicalPaperColumn.line-break-permission ##f + \override Score.NonMusicalPaperColumn.line-break-permission = ##f +} +autoLineBreaksOn = { + \overrideProperty Score.NonMusicalPaperColumn.line-break-permission #'allow + \override Score.NonMusicalPaperColumn.line-break-permission = #'allow +} +autoPageBreaksOff = + \override Score.NonMusicalPaperColumn.page-break-permission = ##f +autoPageBreaksOn = + \override Score.NonMusicalPaperColumn.page-break-permission = #'allow +autoBreaksOff = { \autoLineBreaksOff \autoPageBreaksOff } +autoBreaksOn = { \autoLineBreaksOn \autoPageBreaksOn } + + %% merging mergeDifferentlyDottedOn = @@ -334,15 +395,31 @@ defaultTimeSignature = \revert Staff.TimeSignature.style %% palm mutes palmMuteOn = -#(define-music-function (parser location) () - (_i "Set the default note head style to a triangle-shaped style.") - (override-head-style 'NoteHead 'do)) +#(define-music-function () () + (_i "Set the default note head style to a triangle-shaped style.") + (context-spec-music + (override-head-style 'NoteHead 'do) 'Bottom)) palmMuteOff = \defaultNoteHeads palmMute = -#(define-music-function (parser location note) (ly:music?) +#(define-music-function (note) (ly:music?) (_i "Print @var{note} with a triangle-shaped note head.") (style-note-heads 'NoteHead 'do note)) +%% part combiner + +partcombineForce = +#(define-music-function (type) ((symbol?)) + (_i "Override the part-combiner.") + (if type (propertySet 'partCombineForced type) + (propertyUnset 'partCombineForced))) + +partcombineApart = \partcombineForce #'apart +partcombineChords = \partcombineForce #'chords +partcombineUnisono = \partcombineForce #'unisono +partcombineSoloI = \partcombineForce #'solo1 +partcombineSoloII = \partcombineForce #'solo2 +partcombineAutomatic = \partcombineForce \default + %% phrasing slurs @@ -353,7 +430,7 @@ phrasingSlurNeutral = \revert PhrasingSlur.direction % dash-patterns (make-simple-dash-definition defined at top of file) phrasingSlurDashPattern = -#(define-music-function (parser location dash-fraction dash-period) +#(define-music-function (dash-fraction dash-period) (number? number?) (_i "Set up a custom style of dash pattern for @var{dash-fraction} ratio of line to space repeated at @var{dash-period} interval for phrasing slurs.") @@ -367,10 +444,10 @@ phrasingSlurDotted = \override PhrasingSlur.dash-definition = #'((0 1 0.1 0.75)) phrasingSlurHalfDashed = \override PhrasingSlur.dash-definition = #'((0 0.5 0.4 0.75) - (0.5 1 1 1)) + (0.5 1 1 1)) phrasingSlurHalfSolid = \override PhrasingSlur.dash-definition = #'((0 0.5 1 1) - (0.5 1 0.4 0.75)) + (0.5 1 0.4 0.75)) phrasingSlurSolid = \revert PhrasingSlur.dash-definition @@ -378,20 +455,20 @@ phrasingSlurSolid = %% point and click pointAndClickOn = -#(define-void-function (parser location) () +#(define-void-function () () (_i "Enable generation of code in final-format (e.g. pdf) files to reference the originating lilypond source statement; this is helpful when developing a score but generates bigger final-format files.") (ly:set-option 'point-and-click #t)) pointAndClickOff = -#(define-void-function (parser location) () +#(define-void-function () () (_i "Suppress generating extra code in final-format (e.g. pdf) files to point back to the lilypond source statement.") (ly:set-option 'point-and-click #f)) pointAndClickTypes = -#(define-void-function (parser location types) (symbol-list-or-symbol?) +#(define-void-function (types) (symbol-list-or-symbol?) (_i "Set a type or list of types (such as @code{#'note-event}) for which point-and-click info is generated.") (ly:set-option 'point-and-click types)) @@ -425,10 +502,10 @@ walkerHeadsMinor = %% shifts +shiftOff = \override NoteColumn.horizontal-shift = #0 shiftOn = \override NoteColumn.horizontal-shift = #1 shiftOnn = \override NoteColumn.horizontal-shift = #2 shiftOnnn = \override NoteColumn.horizontal-shift = #3 -shiftOff = \revert NoteColumn.horizontal-shift %% slurs @@ -440,7 +517,7 @@ slurNeutral = \revert Slur.direction % dash-patterns (make-simple-dash-definition defined at top of file) slurDashPattern = -#(define-music-function (parser location dash-fraction dash-period) +#(define-music-function (dash-fraction dash-period) (number? number?) (_i "Set up a custom style of dash pattern for @var{dash-fraction} ratio of line to space repeated at @var{dash-period} interval for slurs.") @@ -451,9 +528,9 @@ ratio of line to space repeated at @var{dash-period} interval for slurs.") slurDashed = \override Slur.dash-definition = #'((0 1 0.4 0.75)) slurDotted = \override Slur.dash-definition = #'((0 1 0.1 0.75)) slurHalfDashed = \override Slur.dash-definition = #'((0 0.5 0.4 0.75) - (0.5 1 1 1)) + (0.5 1 1 1)) slurHalfSolid = \override Slur.dash-definition = #'((0 0.5 1 1) - (0.5 1 0.4 0.75)) + (0.5 1 0.4 0.75)) slurSolid = \revert Slur.dash-definition @@ -470,6 +547,22 @@ stemDown = \override Stem.direction = #DOWN stemNeutral = \revert Stem.direction +%% string numbers + +romanStringNumbers = { + \override StringNumber.number-type = #'roman-upper + \override StringNumber.stencil = #ly:text-interface::print + \override StringNumber.font-encoding = #'latin1 + \override StringNumber.font-shape = #'italic +} +arabicStringNumbers = { + \revert StringNumber.number-type + \revert StringNumber.stencil + \revert StringNumber.font-encoding + \revert StringNumber.font-shape +} + + %% tablature % switch to full notation @@ -579,7 +672,7 @@ tieNeutral = \revert Tie.direction % dash-patterns (make-simple-dash-definition defined at top of file) tieDashPattern = -#(define-music-function (parser location dash-fraction dash-period) +#(define-music-function (dash-fraction dash-period) (number? number?) (_i "Set up a custom style of dash pattern for @var{dash-fraction} ratio of line to space repeated at @var{dash-period} interval for ties.") @@ -590,9 +683,9 @@ ratio of line to space repeated at @var{dash-period} interval for ties.") tieDashed = \override Tie.dash-definition = #'((0 1 0.4 0.75)) tieDotted = \override Tie.dash-definition = #'((0 1 0.1 0.75)) tieHalfDashed = \override Tie.dash-definition = #'((0 0.5 0.4 0.75) - (0.5 1 1 1)) + (0.5 1 1 1)) tieHalfSolid = \override Tie.dash-definition = #'((0 0.5 1 1) - (0.5 1 0.4 0.75)) + (0.5 1 0.4 0.75)) tieSolid = \revert Tie.dash-definition @@ -650,18 +743,19 @@ voiceNeutralStyle = { %% volta brackets allowVoltaHook = -#(define-void-function (parser location bar) (string?) +#(define-void-function (bar) (string?) (allow-volta-hook bar)) %% x notes xNotesOn = -#(define-music-function (parser location) () - (_i "Set the default note head style to a cross-shaped style.") - (override-head-style '(TabNoteHead NoteHead) 'cross)) +#(define-music-function () () + (_i "Set the default note head style to a cross-shaped style.") + (context-spec-music + (override-head-style '(TabNoteHead NoteHead) 'cross) 'Bottom)) xNotesOff = \defaultNoteHeads xNote = -#(define-music-function (parser location note) (ly:music?) +#(define-music-function (note) (ly:music?) (_i "Print @var{note} with a cross-shaped note head.") (style-note-heads '(TabNoteHead NoteHead) 'cross note)) diff --git a/ly/satb.ly b/ly/satb.ly new file mode 100644 index 0000000000..36e9dc367a --- /dev/null +++ b/ly/satb.ly @@ -0,0 +1,195 @@ +%\version "2.19.19" + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% Accompanied Choir with Multiple Verses %% +%% %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%{ + This file may be \include'd in a score to provide the + context structure for a score arrangement consisting + of the following staves: + + Solo Staff (outside Choir grouping) + Descant Staff (within Choir grouping) + Women Staff (single voice on one staff) + Soprano and Alto (optionally on two Staves or one Staff each) + Multiple verses (up to 9) + Tenor and Bass (optionally on two Staves or one Staff each) + Men Staff (single voice on one staff) + Piano Staff + + It is intended primarily to hide the complexity of the context + structure from newcomers to LilyPond, but is also useful as a + shorthand for seasoned users. + + Usage: + + satb.ly should be included at the *end* of the input file. Before + it are placed the required music and lyrics by redefining specific + variables, like this: + + \paper { ... } + \header { ... } + Key = { ... } + Time = { ... } + SoloMusic = \relative { ... } + DescantMusic = \relative { ... } + DescantLyrics = \lyricmode { ... } + WomenMusic = \relative { ... } + WomenLyrics = \lyricmode { ... } + SopranoMusic = \relative { ... } + SopranoLyrics = \lyricmode { ... } + AltoMusic = \relative { ... } + AltoLyrics = \lyricmode { ... } + VerseOne = \lyricmode { ... } + VerseTwo = \lyricmode { ... } + ... + VerseNine = \lyricmode { ... } + TenorMusic = \relative { ... } + TenorLyrics = \lyricmode { ... } + BassMusic = \relative { ... } + BassLyrics = \lyricmode { ... } + MenMusic = \relative { ... } + MenLyrics = \lyricmode { ... } + PianoRHMusic = \relative { ... } + PianoDynamics = { ... } + PianoLHMusic = \relative { ... } + TwoVoicesPerStaff = ##f + \include "satb.ly" + + All of the definitions are optional. Staves with no music will be + omitted from the output. + + Other variables, such as the instrumentName, shortInstrumentName + and MidiInstrument can also be changed by defining variables like + AltoInstrumentName, BassMidiInstrument, etc. The prefixes for staves + containing two divided voices are WomenDivided and MenDivided, hence + the corresponding variables would be WomenDividedInstrumentName, etc. + The key is defined in the variable Key, and the structure of time + and repeats in the variable Time, using spacer rests. + + A \layout block may be defined in the variable Layout. There is + no default \header block and no default \paper block. + + Music may be tagged with #'print or #'play to be included only in + the printed score or in the MIDI file respectively. + +%} + +\include "vocal-tkit.ly" +\include "piano-tkit.ly" + +#(define satb-voice-prefixes + ;; These define the permitted prefixes to various names. + ;; They are combined with a fixed set of postfixes to form + ;; names such as AltoMusic, BassInstrumentName, etc. + ;; These names may be redefined. + '("Alto" + "Bass" + "Descant" + "Men" + "MenDivided" + "Piano" + "PianoLH" + "PianoRH" + "Solo" + "Soprano" + "Tenor" + "Women" + "WomenDivided")) + +#(define satb-lyrics-postfixes + ;; These define the permitted postfixes to the names of lyrics. + ;; They are combined with the prefixes to form names like + ;; AltoLyrics, etc. + ;; These names may be redefined or extended. + '("Lyrics" + "LyricsOne" + "LyricsTwo" + "LyricsThree" + "LyricsFour")) + +#(define satb-lyrics-variable-names + ;; These define the names which may be used to specify stanzas + ;; which go between the two two-voice staves when TwoVoicesPerStaff + ;; is set to #t. They may be redefined or extended. + '("VerseOne" + "VerseTwo" + "VerseThree" + "VerseFour" + "VerseFive" + "VerseSix" + "VerseSeven" + "VerseEight" + "VerseNine")) + +%% make the above definitions available +#(set-music-definitions! + satb-voice-prefixes + satb-lyrics-postfixes + satb-lyrics-variable-names) + +%% override the usual default value +#(if (not SoloShortInstrumentName) + (set! SoloShortInstrumentName "")) + +SATB = +<< + \make-one-voice-vocal-staff "Solo" "treble" + \new ChoirStaff << + \make-one-voice-vocal-staff "Descant" "treble" + \make-one-voice-vocal-staff "Women" "treble" + #(if TwoVoicesPerStaff + #{ + \make-two-vocal-staves-with-stanzas + "WomenDivided" "treble" "MenDivided" "bass" + "Soprano" "Alto" "Tenor" "Bass" + #satb-lyrics-variable-names + #} + #{ + << + \make-one-voice-vocal-staff "Soprano" "treble" + \make-one-voice-vocal-staff "Alto" "treble" + \make-one-voice-vocal-staff "Tenor" "treble_8" + \make-one-voice-vocal-staff "Bass" "bass" + >> + #} ) + \make-one-voice-vocal-staff "Men" "bass" + >> +>> + +Piano = \make-pianostaff + +\tagGroup #'(print play) + +\layout { + \context { + \Staff + \override VerticalAxisGroup.remove-empty = ##t + \override VerticalAxisGroup.remove-first = ##t + } +} + +\score { + \keepWithTag #'print + #(if have-music + #{ << \SATB \Piano >> #} + #{ { } #} ) + \layout { $(if Layout Layout) } +} + + +\score { + \keepWithTag #'play + #(if have-music + #{ << \SATB \Piano >> #} + #{ { } #} ) + \midi { + \context { + \Score + midiChannelMapping = #'instrument + } + } +} diff --git a/ly/scale-definitions-init.ly b/ly/scale-definitions-init.ly index 127e7e5fb9..a0e97d230b 100644 --- a/ly/scale-definitions-init.ly +++ b/ly/scale-definitions-init.ly @@ -30,7 +30,7 @@ ionian = #`( (4 . 0) (5 . 0) (6 . 0) - ) + ) locrian = #`( @@ -41,7 +41,7 @@ locrian = #`( (4 . ,FLAT) (5 . ,FLAT) (6 . ,FLAT) - ) + ) aeolian = #`( @@ -63,7 +63,7 @@ mixolydian = #`( (4 . 0) (5 . 0) (6 . ,FLAT) - ) + ) lydian = #`( @@ -74,7 +74,7 @@ lydian = #`( (4 . 0) (5 . 0) (6 . 0) - ) + ) phrygian = #`( @@ -85,7 +85,7 @@ phrygian = #`( (4 . 0) (5 . ,FLAT) (6 . ,FLAT) -) +) dorian = #`( @@ -97,4 +97,3 @@ dorian = #`( (5 . 0) (6 . ,FLAT) ) - diff --git a/ly/script-init.ly b/ly/script-init.ly index 0cb37947e7..1b84be5a37 100644 --- a/ly/script-init.ly +++ b/ly/script-init.ly @@ -2,18 +2,10 @@ \version "2.17.25" -% code char abbreviations -dashHat = "marcato" -dashPlus = "stopped" -dashDash = "tenuto" -dashBang = "staccatissimo" -dashLarger = "accent" -dashDot = "staccato" -dashUnderscore = "portato" - harmonic = #(make-music 'HarmonicEvent) -accent = #(make-articulation "accent") +accent = #(make-articulation "accent" + 'midi-extra-velocity 20) coda = #(make-articulation "coda") downbow = #(make-articulation "downbow") downmordent = #(make-articulation "downmordent") @@ -26,10 +18,15 @@ lheel = #(make-articulation "lheel") lineprall = #(make-articulation "lineprall") longfermata = #(make-articulation "longfermata") ltoe = #(make-articulation "ltoe") -marcato = #(make-articulation "marcato") +marcato = #(make-articulation "marcato" + 'midi-extra-velocity 40) mordent = #(make-articulation "mordent") open = #(make-articulation "open") -portato = #(make-articulation "portato") + +portato = #(make-articulation "portato" + 'midi-length + (lambda (len context) + (ly:moment-mul len (ly:make-moment 3/4)))) prall = #(make-articulation "prall") pralldown = #(make-articulation "pralldown") prallmordent = #(make-articulation "prallmordent") @@ -42,8 +39,17 @@ segno = #(make-articulation "segno") shortfermata = #(make-articulation "shortfermata") signumcongruentiae = #(make-articulation "signumcongruentiae") snappizzicato = #(make-articulation "snappizzicato") -staccatissimo = #(make-articulation "staccatissimo") -staccato = #(make-articulation "staccato") +staccatissimo = #(make-articulation "staccatissimo" + 'midi-length + (lambda (len context) + (seconds->moment 1/8 context)) + 'midi-extra-velocity 6) +staccato = #(make-articulation "staccato" + 'midi-length + (lambda (len context) + (moment-min (ly:moment-mul len (ly:make-moment 1/2)) + (seconds->moment 1/2 context))) + 'midi-extra-velocity 4) stopped = #(make-articulation "stopped") tenuto = #(make-articulation "tenuto") thumb = \finger \markup \scale #(cons (magstep 5) (magstep 5)) @@ -55,3 +61,12 @@ upmordent = #(make-articulation "upmordent") upprall = #(make-articulation "upprall") varcoda = #(make-articulation "varcoda") verylongfermata = #(make-articulation "verylongfermata") + +% code char abbreviations +dashHat = \marcato +dashPlus = \stopped +dashDash = \tenuto +dashBang = \staccatissimo +dashLarger = \accent +dashDot = \staccato +dashUnderscore = \portato diff --git a/ly/spanners-init.ly b/ly/spanners-init.ly index 44dcdb6633..756a55579e 100644 --- a/ly/spanners-init.ly +++ b/ly/spanners-init.ly @@ -1,4 +1,19 @@ -\version "2.16.0" +\version "2.19.29" + +"\\=" = +#(define-event-function (id event) (number-or-string? ly:event?) + (_i "This sets the @code{spanner-id} property of the following +@var{event} to the given @var{id} (numbers will be converted to a +string). This can be used to tell LilyPond how to connect overlapping +or parallel slurs or phrasing slurs within a single @code{Voice}. +@lilypond[quote,verbatim] +\\fixed c' { c\\=1( d\\=2( e\\=1) f\\=2) } +@end lilypond\n") + (set! (ly:music-property event 'spanner-id) + (if (number? id) + (number->string id) + id)) + event) startGroup = #(make-span-event 'NoteGroupingEvent START) stopGroup = #(make-span-event 'NoteGroupingEvent STOP) @@ -7,7 +22,7 @@ stopGroup = #(make-span-event 'NoteGroupingEvent STOP) cr = #(make-span-event 'CrescendoEvent START) decr = #(make-span-event 'DecrescendoEvent START) enddecr = #(make-span-event 'DecrescendoEvent STOP) -endcr = #(make-span-event 'CrescendoEvent STOP) +endcr = #(make-span-event 'CrescendoEvent STOP) startMeasureCount = #(make-span-event 'MeasureCounterEvent START) @@ -50,14 +65,14 @@ deprecateddim = { deprecatedenddim = { $(make-event-chord (list enddecr)) -% \unset decrescendoText -% \unset decrescendoSpanner +% \unset decrescendoText +% \unset decrescendoSpanner } deprecatedendcresc = { $(make-event-chord (list endcr)) -% \unset crescendoText -% \unset crescendoSpanner +% \unset crescendoText +% \unset crescendoSpanner } @@ -84,13 +99,13 @@ dimTextDim = { } crescHairpin = { - \unset crescendoText - \unset crescendoSpanner + \unset crescendoText + \unset crescendoSpanner } dimHairpin = { - \unset decrescendoText - \unset decrescendoSpanner + \unset decrescendoText + \unset decrescendoSpanner } diff --git a/ly/ssaattbb.ly b/ly/ssaattbb.ly new file mode 100644 index 0000000000..9efd6c1bbe --- /dev/null +++ b/ly/ssaattbb.ly @@ -0,0 +1,318 @@ + +\version "2.19.25" + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% %% +%% Accompanied Divided Choir %% +%% %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%{ + This file may be \include'd in a score to provide the + context structure for a score arrangement consisting + of the following staves, although normally only a subset + of these staves would be used in any one score. + + Solo Staff (outside Choir grouping) + Descant Staff (within Choir grouping) + Women Staff (single voice on one staff) + First and Second Soprano (optionally on two Staves or one Staff) + Soprano and Alto (optionally on two Staves or one Staff) + First and Second Alto (optionally on two Staves or one Staff) + First and Second Tenor (optionally on two Staves or one Staff) + Tenor and Bass (optionally on two Staves or one Staff) + First and Second Bass (optionally on two Staves or one Staff) + Men Staff (single voice on one staff) + Piano Staff + + It is intended primarily to hide the complexity of the context + structure from newcomers to LilyPond, but is also useful as a + shorthand for seasoned users. It is intended to facilitate the + setting of pieces in which different groupings of voices appear + at different times. All that is necessary is to populate the + appropriate variables with music for the relevant sections and + with rests elsewhere, with sections separated by line breaks. + + Usage: + + ssaattbb.ly should be included at the *end* of the input file. Before + it are placed the required music and lyrics by redefining specific + variables, like this: + + \paper { ... } + \header { ... } + Key = { ... } + Time = { ... } + SopranoOneMusic = \relative { ... } + SopranoOneLyrics = \lyricmode { ... } + SopranoTwoMusic = \relative { ... } + SopranoTwoLyrics = \lyricmode { ... } + AltoOneMusic = \relative { ... } + AltoOneLyrics = \lyricmode { ... } + AltoTwoMusic = \relative { ... } + AltoTwoLyrics = \lyricmode { ... } + TenorOneMusic = \relative { ... } + TenorOneLyrics = \lyricmode { ... } + TenorTwoMusic = \relative { ... } + TenorTwoLyrics = \lyricmode { ... } + BassOneMusic = \relative { ... } + BassOneLyrics = \lyricmode { ... } + BassTwoMusic = \relative { ... } + BassTwoLyrics = \lyricmode { ... } + PianoRHMusic = \relative { ... } + PianoDynamics = { ... } + PianoLHMusic = \relative { ... } + TwoVoicesPerStaff = ##f (applies to all staves) + \include "ssaattbb.ly" + + In addition, if there are sections in which two or more parts + are in unison, the following variables may also be defined: + + WomenMusic = \relative { ... } + WomenLyrics = \lyricmode { ... } + SopranoMusic = \relative { ... } + SopranoLyrics = \lyricmode { ... } + AltoMusic = \relative { ... } + AltoLyrics = \lyricmode { ... } + TenorMusic = \relative { ... } + TenorLyrics = \lyricmode { ... } + BassMusic = \relative { ... } + BassLyrics = \lyricmode { ... } + MenMusic = \relative { ... } + MenLyrics = \lyricmode { ... } + + All of the definitions are optional. Staves with no music will be + omitted from the output. + + If TwoVoicesPerStaff is #f, music of the various voices may be + placed individually on one or two staves according to the + following variables, all of which default to #f: + + WomenTwoVoicesPerStaff + SopranoTwoVoicesPerStaff + AltoTwoVoicesPerStaff + TenorTwoVoicesPerStaff + BassTwoVoicesPerStaff + MenTwoVoicesPerStaff + + Other variables, such as the instrumentName, shortInstrumentName + and MidiInstrument can also be changed by defining variables like + AltoInstrumentName, BassMidiInstrument, etc. The prefixes for staves + containing two divided voices are WomenDivided and MenDivided, etc + hence the corresponding variables would be WomenDividedInstrumentName, + etc. + + The key is defined in the variable Key, and the structure of time + and repeats in the variable Time, using spacer rests. + + A \layout block may be defined in the variable Layout. There is + no default \header block and no default \paper block. + + Music may be tagged with #'print or #'play to be included only in + the printed score or in the MIDI file respectively. + +%} + +\include "vocal-tkit.ly" +\include "piano-tkit.ly" + +#(define ssaattbb-voice-prefixes + ;; These define the permitted prefixes to various names. + ;; They are combined with a fixed set of postfixes to form + ;; names such as AltoMusic, BassInstrumentName, etc. + ;; These names may be redefined. + '("Alto" + "AltoOne" + "AltoTwo" + "AltoDivided" + "Bass" + "BassOne" + "BassTwo" + "BassDivided" + "Descant" + "Men" + "MenDivided" + "Piano" + "PianoLH" + "PianoRH" + "Solo" + "Soprano" + "SopranoOne" + "SopranoTwo" + "SopranoDivided" + "Tenor" + "TenorOne" + "TenorTwo" + "TenorDivided" + "Women" + "WomenDivided")) + +#(define ssaattbb-lyrics-postfixes + ;; These define the permitted postfixes to the names of lyrics. + ;; They are combined with the prefixes to form names like + ;; AltoLyrics, etc. + ;; These names may be redefined or extended. + '("Lyrics" + "LyricsOne" + "LyricsTwo" + "LyricsThree" + "LyricsFour")) + +#(define ssaattbb-lyrics-variable-names + ;; These define the names which may be used to specify stanzas + ;; which go between the two two-voice staves when TwoVoicesPerStaff + ;; is set to #t. They may be redefined or extended. + '("VerseOne" + "VerseTwo" + "VerseThree" + "VerseFour" + "VerseFive" + "VerseSix" + "VerseSeven" + "VerseEight" + "VerseNine")) + +%% make the above definitions available +#(set-music-definitions! + ssaattbb-voice-prefixes + ssaattbb-lyrics-postfixes + ssaattbb-lyrics-variable-names) + +#(define ssaattbb-variable-names +; Define names which are in addition to the base variable names +; of Time, Layout, Key, PianoDynamics and TwoVoicesPerStaff + '("AltoTwoVoicesPerStaff" + "BassTwoVoicesPerStaff" + "MenTwoVoicesPerStaff" + "SopranoTwoVoicesPerStaff" + "TenorTwoVoicesPerStaff" + "WomenTwoVoicesPerStaff")) + +%% and make them available +#(define-missing-variables! ssaattbb-variable-names) + +#(if TwoVoicesPerStaff + ; Set all staves to contain two voices + (begin + (set! AltoTwoVoicesPerStaff #t) + (set! BassTwoVoicesPerStaff #t) + (set! MenTwoVoicesPerStaff #t) + (set! SopranoTwoVoicesPerStaff #t) + (set! TenorTwoVoicesPerStaff #t) + (set! WomenTwoVoicesPerStaff #t))) + +#(define (set-default-instr-names! voice) +; If the several instrument names and short instrument +; names have not been defined by the user, set them to +; the defaults "Soprano 1" and "S 1" etc with the same names +; in a column for the divided staves" + (define (make-sym str1 str2) + (string->symbol (string-append str1 str2))) + + (if (not (make-id voice "OneInstrumentName")) + (ly:parser-define! + (make-sym voice "OneInstrumentName") + (string-append voice " 1"))) + (if (not (make-id voice "TwoInstrumentName")) + (ly:parser-define! + (make-sym voice "TwoInstrumentName") + (string-append voice " 2"))) + (if (not (make-id voice "DividedInstrumentName")) + (ly:parser-define! + (make-sym voice "DividedInstrumentName") + #{ \markup \right-column \smallCaps { + #(if (make-id voice "OneMusic") + (make-id voice "OneInstrumentName") "") + #(if (make-id voice "TwoMusic") + (make-id voice "TwoInstrumentName") "") } #} )) + (if (not (make-id voice "OneShortInstrumentName")) + (ly:parser-define! + (make-sym voice "OneShortInstrumentName") + (string-append (substring voice 0 1) " 1"))) + (if (not (make-id voice "TwoShortInstrumentName")) + (ly:parser-define! + (make-sym voice "TwoShortInstrumentName") + (string-append (substring voice 0 1) " 2"))) + (if (not (make-id voice "DividedShortInstrumentName")) + (ly:parser-define! + (make-sym voice "DividedShortInstrumentName") + #{ \markup \right-column \smallCaps { + #(if (make-id voice "OneMusic") + (make-id voice "OneShortInstrumentName") "") + #(if (make-id voice "TwoMusic") + (make-id voice "TwoShortInstrumentName") "") } #} ))) + +#(set-default-instr-names! "Soprano") +#(set-default-instr-names! "Alto") +#(set-default-instr-names! "Tenor") +#(set-default-instr-names! "Bass") + +SSAATTBB = +<< + \make-one-voice-vocal-staff "Solo" "treble" + \new ChoirStaff + << + \make-one-voice-vocal-staff "Descant" "treble" + \make-one-voice-vocal-staff "Women" "treble" + #(if SopranoTwoVoicesPerStaff + #{ \make-two-voice-vocal-staff "SopranoDivided" "treble" "SopranoOne" "SopranoTwo" #} + #{ << \make-one-voice-vocal-staff "SopranoOne" "treble" + \make-one-voice-vocal-staff "SopranoTwo" "treble" >> #} ) + #(if WomenTwoVoicesPerStaff + #{ \make-two-voice-vocal-staff "WomenDivided" "treble" "Soprano" "Alto" #} + #{ << \make-one-voice-vocal-staff "Soprano" "treble" + \make-one-voice-vocal-staff "Alto" "treble" >> #} ) + #(if AltoTwoVoicesPerStaff + #{ \make-two-voice-vocal-staff "AltoDivided" "treble" "AltoOne" "AltoTwo" #} + #{ << \make-one-voice-vocal-staff "AltoOne" "treble" + \make-one-voice-vocal-staff "AltoTwo" "treble" >> #} ) + #(if TenorTwoVoicesPerStaff + #{ \make-two-voice-vocal-staff "TenorDivided" "treble_8" "TenorOne" "TenorTwo" #} + #{ << \make-one-voice-vocal-staff "TenorOne" "treble_8" + \make-one-voice-vocal-staff "TenorTwo" "treble_8" >> #} ) + #(if MenTwoVoicesPerStaff + #{ \make-two-voice-vocal-staff "MenDivided" "bass" "Tenor" "Bass" #} + #{ << \make-one-voice-vocal-staff "Tenor" "treble_8" + \make-one-voice-vocal-staff "Bass" "bass" >> #} ) + #(if BassTwoVoicesPerStaff + #{ \make-two-voice-vocal-staff "BassDivided" "bass" "BassOne" "BassTwo" #} + #{ << \make-one-voice-vocal-staff "BassOne" "bass" + \make-one-voice-vocal-staff "BassTwo" "bass" >> #} ) + \make-one-voice-vocal-staff "Men" "bass" + >> +>> + +Piano = \make-pianostaff + +\tagGroup #'(print play) + +\layout { + \context { + \Staff + \override VerticalAxisGroup.remove-empty = ##t + \override VerticalAxisGroup.remove-first = ##t + } +} + +\score { + \keepWithTag #'print + #(if have-music + #{ << \SSAATTBB \Piano >> #} + #{ { } #} ) + \layout { $(if Layout Layout) } +} + + +\score { + \keepWithTag #'play + #(if have-music + #{ << \SSAATTBB \Piano >> #} + #{ { } #} ) + \midi { + \context { + \Score + midiChannelMapping = #'instrument + } + } +} diff --git a/ly/staff-tkit.ly b/ly/staff-tkit.ly new file mode 100644 index 0000000000..9c1c575c17 --- /dev/null +++ b/ly/staff-tkit.ly @@ -0,0 +1,164 @@ +%\version "2.19.22" + +\include "voice-tkit.ly" + + +%% Staff-oriented functions + +% These assume the following lists have been defined: +% voice-prefixes eg "Soprano" +% voice-postfixes eg "Music" +% lyrics-postfixes eg "Lyrics" +% lyrics-names eg "VerseOne" +% variable-names eg "Time" +% +% The first three lists are used to generate compound +% names such as "SopranoLyrics" and "SopranoInstrumentName" +% The last two lists of names are used as-is. + + +make-one-voice-staff = +#(define-music-function (show-instrName name clef dynamic-direction) + ((boolean? #t) voice-prefix? string? (up-or-down? "")) + + "Make a staff with one voice (no lyrics) + show-instrName: show instrument and short instrument names? + name: the default prefix for instrument name and music + clef: the clef for this staff + dynamic-direction: dynamics are up, down or neither" + + (define music (make-id name "Music")) + (define instrName (make-id name "InstrumentName")) + (define shortInstrName (make-id name "ShortInstrumentName")) + (define midiName (make-id name "MidiInstrument")) + (define dynUp (equal? dynamic-direction "Up")) + (define dynDown (equal? dynamic-direction "Down")) + (if music + #{ + \new Staff = #(string-append name "Staff") + \with { + instrumentName = \markup \smallCaps { + #(if show-instrName + (if instrName instrName name) + "") + } + shortInstrumentName = \markup \smallCaps { + #(if show-instrName + (cond + (shortInstrName shortInstrName) + (instrName (substring instrName 0 1)) + (else (substring name 0 1))) + "") + } + midiInstrument = #(if midiName midiName "clarinet") + #(cond + (dynUp dynamicUp) + (dynDown dynamicDown) + (else dynamicNeutral)) + + } + { + #(if Key Key) + \clef #clef + \make-voice #name + } + #} + (make-music 'SequentialMusic 'void #t))) + + +make-two-voice-staff = +#(define-music-function (name clef v1name v2name) + (voice-prefix? string? voice-prefix? voice-prefix?) + + "Make a vocal staff with two voices + name: the prefix to the staff name + clef: the clef to use + v1name: the prefix to the name of voice one + v2name: the prefix to the name of voice two " + + (define v1music (make-id v1name "Music")) + (define v2music (make-id v2name "Music")) + (define instrName (make-id name "InstrumentName")) + (define v1InstrName (make-id v1name "InstrumentName")) + (define v2InstrName (make-id v2name "InstrumentName")) + (define shortInstrName (make-id name "ShortInstrumentName")) + (define v1ShortInstrName (make-id v1name "ShortInstrumentName")) + (define v2ShortInstrName (make-id v2name "ShortInstrumentName")) + (define v1midiName (make-id v1name "MidiInstrument")) + (define v2midiName (make-id v2name "MidiInstrument")) + (if (or v1music v2music) + #{ + << + \new Staff = #(string-append name "Staff") + \with { + \remove "Staff_performer" + instrumentName = + #(if instrName + #{ \markup \smallCaps #instrName #} + #{ \markup \right-column \smallCaps { + #(if v1music + (if v1InstrName v1InstrName v1name) + "") + #(if v2music + (if v2InstrName v2InstrName v2name) + "") + } #} ) + shortInstrumentName = + #(if shortInstrName + #{ \markup \smallCaps #shortInstrName #} + #{ \markup \right-column \smallCaps { + #(if v1music + (cond + (v1ShortInstrName v1ShortInstrName) + (v1InstrName (substring v1InstrName 0 1)) + (else (substring v1name 0 1))) + "") + #(if v2music + (cond + (v2ShortInstrName v2ShortInstrName) + (v2InstrName (substring v2InstrName 0 1)) + (else (substring v2name 0 1))) + "") + } #} ) + } + << + #(if Key Key) + \clef #clef + + #(if v1music + #{ + \new Voice = #(string-append v1name "Voice") + \with { + \consists "Staff_performer" + \dynamicUp + midiInstrument = + #(if v1midiName v1midiName "clarinet") + } + << + #(if KeepAlive KeepAlive) + #(if Time Time) + #(if v2music voiceOne oneVoice) + #v1music + >> + #} ) + + #(if v2music + #{ + \new Voice = #(string-append v2name "Voice") + \with { + \consists "Staff_performer" + \dynamicDown + midiInstrument = + #(if v2midiName v2midiName "clarinet") + } + << + #(if KeepAlive KeepAlive) + #(if Time Time) + #(if v1music voiceTwo oneVoice) + #v2music + >> + #} ) + >> + >> + #} + (make-music 'SequentialMusic 'void #t))) diff --git a/ly/string-tunings-init.ly b/ly/string-tunings-init.ly index c951bec00f..927bbae6b2 100644 --- a/ly/string-tunings-init.ly +++ b/ly/string-tunings-init.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2010--2012 Carl D. Sorensen +%%%% Copyright (C) 2010--2015 Carl D. Sorensen %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by @@ -15,7 +15,7 @@ %%%% You should have received a copy of the GNU General Public License %%%% along with LilyPond. If not, see . -\version "2.16.0" +\version "2.19.22" %% A stringTuning is a list of pitches ordered by string number %% from 1 to N. @@ -27,7 +27,7 @@ %% lowest string number stringTuning = -#(define-scheme-function (parser location chord) +#(define-scheme-function (chord) (ly:music?) (_i "Convert @var{chord} to a string tuning. @var{chord} must be in absolute pitches and should have the highest @@ -38,11 +38,11 @@ string number (generally the lowest pitch) first.") defaultStringTunings = #'() makeDefaultStringTuning = -#(define-void-function (parser location symbol pitches) (symbol? list?) +#(define-void-function (symbol pitches) (symbol? list?) (_i "This defines a string tuning @var{symbol} via a list of @var{pitches}. The @var{symbol} also gets registered in @code{defaultStringTunings} for documentation purposes.") - (ly:parser-define! parser symbol pitches) + (ly:parser-define! symbol pitches) (set! defaultStringTunings (acons symbol pitches defaultStringTunings))) %% guitar tunings @@ -89,4 +89,4 @@ defaultStringTunings = #(reverse! defaultStringTunings) %% convert 5-string banjo tuning to 4-string by removing the 5th string four-string-banjo = #(lambda (tuning) - (take tuning 4)) + (take tuning 4)) diff --git a/ly/suomi.ly b/ly/suomi.ly index 2d64813612..be787cf9e8 100644 --- a/ly/suomi.ly +++ b/ly/suomi.ly @@ -1,7 +1,7 @@ %%%% common Finnish names for notes %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2010--2012 Valentin Villenave +%%%% Copyright (C) 2010--2015 Valentin Villenave %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/svenska.ly b/ly/svenska.ly index 7f6a5acafc..ee3baae8ae 100644 --- a/ly/svenska.ly +++ b/ly/svenska.ly @@ -1,7 +1,7 @@ %%%% common Swedish names for notes %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2010--2012 Valentin Villenave +%%%% Copyright (C) 2010--2015 Valentin Villenave %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/text-replacements.ly b/ly/text-replacements.ly index cd6d4457b7..50f06b484b 100644 --- a/ly/text-replacements.ly +++ b/ly/text-replacements.ly @@ -1,6 +1,6 @@ %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2011--2012 Bertrand Bordage +%%%% Copyright (C) 2011--2015 Bertrand Bordage %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by @@ -19,9 +19,9 @@ #(define (add-text-replacements! alist) (set! text-font-defaults - (assoc-set! text-font-defaults 'replacement-alist - (cdaar - (internal-add-text-replacements (list text-font-defaults) alist))))) + (assoc-set! text-font-defaults 'replacement-alist + (cdaar + (internal-add-text-replacements (list text-font-defaults) alist))))) #(define (include-special-characters) (add-text-replacements! @@ -91,6 +91,8 @@ ("&AA;" . "Å") ("&ae;" . "æ") ("&AE;" . "Æ") + ("ä" . "ä") + ("Ä" . "Ä") ("&dh;" . "ð") ("&DH;" . "Ð") ("&dj;" . "đ") @@ -103,10 +105,14 @@ ("&O;" . "Ø") ("&oe;" . "œ") ("&OE;" . "Œ") + ("ö" . "ö") + ("Ö" . "Ö") ("&s;" . "Å¿") ("&ss;" . "ß") ("&th;" . "þ") ("&TH;" . "Þ") + ("ü" . "ü") + ("Ü" . "Ü") ;; Mathematical symbols ("+" . "+") diff --git a/ly/titling-init.ly b/ly/titling-init.ly index da2bf166c9..12bfa4f340 100644 --- a/ly/titling-init.ly +++ b/ly/titling-init.ly @@ -1,5 +1,8 @@ \version "2.16.0" +#(if (guile-v2) + (use-modules (ice-9 curried-definitions))) + slashSeparator = \markup { \center-align \vcenter \combine @@ -73,14 +76,8 @@ scoreTitleMarkup = \markup { \column { #(define (book-first-page? layout props) "Return #t iff the current page number, got from @code{props}, is the book first one." - (define (ancestor layout) - "Return the topmost layout ancestor" - (let ((parent (ly:output-def-parent layout))) - (if (not (ly:output-def? parent)) - layout - (ancestor parent)))) (= (chain-assoc-get 'page:page-number props -1) - (ly:output-def-lookup (ancestor layout) 'first-page-number))) + (book-first-page layout props))) #(define (book-last-page? layout props) "Return #t iff the current page number, got from @code{props}, is the @@ -152,9 +149,7 @@ book last one." oddHeaderMarkup = \markup \fill-line { - %% force the header to take some space, otherwise the - %% page layout becomes a complete mess. - " " + "" \on-the-fly #not-part-first-page \fromproperty #'header:instrument \on-the-fly #print-page-number-check-first \fromproperty #'page:page-number-string } @@ -165,7 +160,7 @@ evenHeaderMarkup = \markup \fill-line { \on-the-fly #print-page-number-check-first \fromproperty #'page:page-number-string \on-the-fly #not-part-first-page \fromproperty #'header:instrument - " " + "" } oddFooterMarkup = \markup { diff --git a/ly/toc-init.ly b/ly/toc-init.ly index 32eeb462f8..c3fd5ab57d 100644 --- a/ly/toc-init.ly +++ b/ly/toc-init.ly @@ -1,4 +1,4 @@ -\version "2.16.0" +\version "2.19.22" %% defined later, in a closure #(define-public (add-toc-item! markup-symbol text) @@ -9,18 +9,18 @@ #(let ((toc-item-list (list))) (call-after-session (lambda () (set! toc-item-list '()))) (set! add-toc-item! - (lambda (markup-symbol text) - (let ((label (gensym "toc"))) - (set! toc-item-list - (cons (list label markup-symbol text) - toc-item-list)) - (make-music 'EventChord - 'page-marker #t - 'page-label label - 'elements (list (make-music 'LabelEvent - 'page-label label)))))) + (lambda (markup-symbol text) + (let ((label (gensym "toc"))) + (set! toc-item-list + (cons (list label markup-symbol text) + toc-item-list)) + (make-music 'EventChord + 'page-marker #t + 'page-label label + 'elements (list (make-music 'LabelEvent + 'page-label label)))))) (set! toc-items (lambda () - (reverse toc-item-list)))) + (reverse toc-item-list)))) \paper { tocTitleMarkup = \markup \huge \column { @@ -41,24 +41,24 @@ tocItemWithDotsMarkup = \markup \fill-with-pattern #1 #RIGHT . built using the @code{tocItem} music function Usage: @code{\\markuplist \\table-of-contents}" ) (cons (interpret-markup layout props - (ly:output-def-lookup layout 'tocTitleMarkup)) - (space-lines (chain-assoc-get 'baseline-skip props) - (map (lambda (toc-item) - (let ((label (car toc-item)) - (toc-markup (cadr toc-item)) - (text (caddr toc-item))) - (interpret-markup - layout - (cons (list (cons 'toc:page - (markup #:with-link label #:page-ref label "XXX" "?")) - (cons 'toc:text (markup #:with-link label text)) - (cons 'toc:label label)) - props) - (ly:output-def-lookup layout toc-markup)))) - (toc-items))))) + (ly:output-def-lookup layout 'tocTitleMarkup)) + (space-lines (chain-assoc-get 'baseline-skip props) + (map (lambda (toc-item) + (let ((label (car toc-item)) + (toc-markup (cadr toc-item)) + (text (caddr toc-item))) + (interpret-markup + layout + (cons (list (cons 'toc:page + (markup #:with-link label #:page-ref label "XXX" "?")) + (cons 'toc:text (markup #:with-link label text)) + (cons 'toc:label label)) + props) + (ly:output-def-lookup layout toc-markup)))) + (toc-items))))) -tocItem = -#(define-music-function (parser location text) (markup?) +tocItem = +#(define-music-function (text) (markup?) "Add a line to the table of content, using the @code{tocItemMarkup} paper variable markup" (add-toc-item! 'tocItemMarkup text)) diff --git a/ly/vlaams.ly b/ly/vlaams.ly index 62232bed80..c15c1a5017 100644 --- a/ly/vlaams.ly +++ b/ly/vlaams.ly @@ -1,7 +1,7 @@ %%%% common Flemish names for notes %%%% This file is part of LilyPond, the GNU music typesetter. %%%% -%%%% Copyright (C) 2010--2012 Valentin Villenave +%%%% Copyright (C) 2010--2015 Valentin Villenave %%%% %%%% LilyPond is free software: you can redistribute it and/or modify %%%% it under the terms of the GNU General Public License as published by diff --git a/ly/vocal-tkit.ly b/ly/vocal-tkit.ly new file mode 100644 index 0000000000..5490005283 --- /dev/null +++ b/ly/vocal-tkit.ly @@ -0,0 +1,85 @@ +%\version "2.19.22" + +\include "lyrics-tkit.ly" +\include "staff-tkit.ly" + +make-one-voice-vocal-staff = +#(define-music-function (name clef) + (voice-prefix? string?) + + "Make a staff with one voice and lyrics beneath + name: the default prefix for instrument name and music + clef: the clef for this staff " + + (if (make-id name "Music") + (make-simultaneous-music + (list + (make-one-voice-staff name clef "Up") + (make-simultaneous-music + (reverse (map + (lambda (lyrics-postfix) + (make-one-stanza "Below" name name lyrics-postfix)) + lyrics-postfixes))))) + (make-music 'SequentialMusic 'void #t))) + +make-two-voice-vocal-staff = +#(define-music-function (name clef v1name v2name) + (voice-prefix? string? voice-prefix? voice-prefix?) + + "Make a vocal staff with two voices and lyrics above and below + name: the prefix to the staff name + clef: the clef to use + v1name: the prefix to the name of voice one + v2name: the prefix to the name of voice two " + + (define v1music (make-id v1name "Music")) + (define v2music (make-id v2name "Music")) + + (make-simultaneous-music + (delq! #f + (list + (make-two-voice-staff name clef v1name v2name) + (and v1music + (make-simultaneous-music + (map + (lambda (lyrics-postfix) + (make-one-stanza "Above" name v1name lyrics-postfix)) + lyrics-postfixes))) + + (and v2music + (make-simultaneous-music + (reverse + (map + (lambda (lyrics-postfix) + (make-one-stanza "Below" name v2name lyrics-postfix)) + lyrics-postfixes)))))))) + +make-two-vocal-staves-with-stanzas = +#(define-music-function + (upperName upperClef lowerName lowerClef + v1name v2name v3name v4name verses) + (voice-prefix? string? voice-prefix? string? + voice-prefix? voice-prefix? voice-prefix? voice-prefix? list?) + + "Make two two-voice vocal staves with several stanzas between them. +The number of stanzas is determined by the number of populated verse names. + upperName: the prefix to the upper staff name + upperClef: the clef to use on the upper staff + lowerName: the prefix to the lower staff name + lowerClef: the clef to use on the lower staff + vxname: the prefix to the name of voice x, x = 1..4 + verses: the list of verse names containing the stanzas" + + (make-simultaneous-music + (list + (make-two-voice-vocal-staff + upperName upperClef v1name v2name) + (make-simultaneous-music + (map + (lambda (verse-name) + (make-one-stanza + upperName v1name v2name verse-name)) + verses)) + (make-two-voice-vocal-staff + lowerName lowerClef v3name v4name)))) + diff --git a/ly/voice-tkit.ly b/ly/voice-tkit.ly new file mode 100644 index 0000000000..c240cd5f36 --- /dev/null +++ b/ly/voice-tkit.ly @@ -0,0 +1,16 @@ +%\version "2.19.22" + +\include "base-tkit.ly" + +make-voice = +#(define-music-function (name) (voice-prefix?) + (define music (make-id name "Music")) + (if music + #{ + \new Voice = #(string-append name "Voice") << + #(if KeepAlive KeepAlive) + #(if Time Time ) + #music + >> + #} )) + diff --git a/make/doc-i18n-root-vars.make b/make/doc-i18n-root-vars.make index 48cfcdbb12..9ff0df3a77 100644 --- a/make/doc-i18n-root-vars.make +++ b/make/doc-i18n-root-vars.make @@ -41,7 +41,8 @@ WEB_MANUALS=web ########### ifneq ($(ISOLANG),) -TEXI2HTML_LANG = --lang=$(ISOLANG) +TEXI2HTML_LANG_INIT = --init-file=$(top-src-dir)/Documentation/lilypond-texi2html-lang.init +TEXI2HTML_LANG = --document-language=$(ISOLANG) endif $(XREF_MAPS_DIR)/web.$(ISOLANG).xref-map:\ @@ -52,7 +53,12 @@ TEXI2HTML_INIT = --init-file=$(top-src-dir)/Documentation/lilypond-texi2html.ini TEXI2HTML_SPLIT = --prefix=index --split=section TEXI2HTML_INCLUDES += --I=. --I=$(src-dir) --I=$(outdir) $(DOCUMENTATION_INCLUDES) --I=$(XREF_MAPS_DIR) -TEXI2HTML_FLAGS += $(TEXI2HTML_INCLUDES) $(TEXI2HTML_LANG) $(TEXI2HTML_INIT) +# To overwrite texi2html default i18n messages with the LilyPond init file, +# delete TEXI2HTML_INIT that exists before TEXI2HTML_LANG. +TEXI2HTML_FLAGS := $(filter-out $(TEXI2HTML_INIT),$(TEXI2HTML_FLAGS)) +# Instead, add languages minimum initialization before TEXI2HTML_LANG. +TEXI2HTML_FLAGS := $(subst $(TEXI2HTML_LANG),$(TEXI2HTML_LANG_INIT) $(TEXI2HTML_LANG),$(TEXI2HTML_FLAGS)) +TEXI2HTML_FLAGS += $(TEXI2HTML_INCLUDES) $(TEXI2HTML_LANG_INIT) $(TEXI2HTML_LANG) $(TEXI2HTML_INIT) TEXI2HTML = TOP_SRC_DIR=$(top-src-dir) PERL_UNICODE=SD $(TEXI2HTML_PROGRAM) ########### diff --git a/make/lilypond-book-rules.make b/make/lilypond-book-rules.make index b27aa56e14..3dda429003 100644 --- a/make/lilypond-book-rules.make +++ b/make/lilypond-book-rules.make @@ -52,5 +52,5 @@ $(outdir)/%.xml: %.lyxml # Add the xml => pdf rule only if we have dblatex ifeq (,$(findstring dblatex,$(MISSING_OPTIONAL))) $(outdir)/%.pdf: $(outdir)/%.xml - cd $(outdir) && $(buildscript-dir)/run-and-check "$(DBLATEX) $(notdir $<)" "$*.dblatex.log" + cd $(outdir) && $(buildscript-dir)/run-and-check "$(DBLATEX) $(DBLATEX_BACKEND) $(notdir $<)" "$*.dblatex.log" endif diff --git a/make/lilypond-book-vars.make b/make/lilypond-book-vars.make index bb1fc23dfe..8d9955b6a4 100644 --- a/make/lilypond-book-vars.make +++ b/make/lilypond-book-vars.make @@ -1,6 +1,7 @@ # rules for directories with html files. LILYPOND_BOOK_COMMAND = LILYPOND_VERSION=$(TOPLEVEL_VERSION) \ + PDFTEX=$(PDFTEX) PDFLATEX=$(PDFLATEX) \ $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) \ --process='$(LILYPOND_BOOK_PROCESS) \ $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) \ @@ -39,6 +40,11 @@ OUT_DOCBOOK_FILES = ${DOCBOOK_FILES:%.lyxml=$(outdir)/%.pdf} else OUT_DOCBOOK_FILES = ${DOCBOOK_FILES:%.lyxml=$(outdir)/%.xml} endif +ifeq ($(PDFLATEX),xelatex) +DBLATEX_BACKEND = -b xetex +else +DBLATEX_BACKEND = +endif OUT_FILES = $(sort $(OUT_HTML_FILES) \ $(OUT_HTMLY_FILES) \ diff --git a/make/ly-rules.make b/make/ly-rules.make index 25dd5b2fbb..a9137b39ac 100644 --- a/make/ly-rules.make +++ b/make/ly-rules.make @@ -5,7 +5,7 @@ LYS_OUTPUT_OPTION= --lily-output-dir $(LYS_OUTPUT_DIR) LYS_OUTPUT_DIR=$(top-build-dir)/out/lybook-db LILYPOND_BOOK_FLAGS += $(LYS_OUTPUT_OPTION) $(outdir)/%.latex: %.doc $(INIT_LY_SOURCES) $(SCHEME_SOURCES) - LILYPOND_VERSION=$(TOPLEVEL_VERSION) $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) $(LILYPOND_BOOK_FLAGS) --redirect-lilypond-output $< + LILYPOND_VERSION=$(TOPLEVEL_VERSION) PDFTEX=$(PDFTEX) PDFLATEX=$(PDFLATEX) $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) $(LILYPOND_BOOK_FLAGS) --redirect-lilypond-output $< # This allows -j make option while making sure only one lilypond-book instance @@ -23,11 +23,11 @@ $(eval $(firstword $(TEXI_FILES_FROM_TELY)):\ # don't do ``cd $(outdir)'', and assume that $(outdir)/.. is the src dir. # it is not, for --srcdir builds $(outdir)/%.texi: %.tely $(outdir)/version.itexi $(DOCUMENTATION_LOCALE_TARGET) $(INIT_LY_SOURCES) $(SCHEME_SOURCES) - LILYPOND_VERSION=$(TOPLEVEL_VERSION) $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) --redirect-lilypond-output $< + LILYPOND_VERSION=$(TOPLEVEL_VERSION) PDFTEX=$(PDFTEX) PDFLATEX=$(PDFLATEX) $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) --redirect-lilypond-output $< $(outdir)/%.texi: $(outdir)/%.tely $(outdir)/version.itexi $(DOCUMENTATION_LOCALE_TARGET) $(INIT_LY_SOURCES) $(SCHEME_SOURCES) - LILYPOND_VERSION=$(TOPLEVEL_VERSION) $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_INCLUDES) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) --redirect-lilypond-output $< + LILYPOND_VERSION=$(TOPLEVEL_VERSION) PDFTEX=$(PDFTEX) PDFLATEX=$(PDFLATEX) $(PYTHON) $(LILYPOND_BOOK) $(LILYPOND_BOOK_INCLUDES) --process='$(LILYPOND_BOOK_PROCESS) $(LILYPOND_BOOK_INCLUDES) $(LILYPOND_BOOK_LILYPOND_FLAGS)' --output=$(outdir) --format=$(LILYPOND_BOOK_FORMAT) $(LILYPOND_BOOK_FLAGS) --redirect-lilypond-output $< $(outdir)/%.html.omf: %.tely diff --git a/mf/00-lilypond-fonts.conf.in b/mf/00-lilypond-fonts.conf.in new file mode 100644 index 0000000000..899db67172 --- /dev/null +++ b/mf/00-lilypond-fonts.conf.in @@ -0,0 +1,44 @@ + + + + + + + + LilyPond Serif + + TeX Gyre Schola + DejaVu Serif + + + serif + + + + + LilyPond Sans Serif + + TeX Gyre Heros + DejaVu Sans + + + sans-serif + + + + + LilyPond Monospace + + TeX Gyre Cursor + DejaVu Sans Mono + + + monospace + + + + diff --git a/mf/99-lilypond-fonts.conf.in b/mf/99-lilypond-fonts.conf.in new file mode 100644 index 0000000000..83f8b5376e --- /dev/null +++ b/mf/99-lilypond-fonts.conf.in @@ -0,0 +1,19 @@ + + + + + + + + + + false + + + + + diff --git a/mf/GNUmakefile b/mf/GNUmakefile index 9da619c823..4860f65f6e 100644 --- a/mf/GNUmakefile +++ b/mf/GNUmakefile @@ -30,51 +30,33 @@ BRACES = a b c d e f g h i OTF_FILES = $(STAFF_SIZES:%=$(outdir)/emmentaler-%.otf) \ $(outdir)/emmentaler-brace.otf -PE_SCRIPTS = $(STAFF_SIZES:%=$(outdir)/emmentaler-%.pe) OTF_TABLES = $(STAFF_SIZES:%=$(outdir)/feta%.otf-table) \ $(BRACES:%=$(outdir)/feta-braces-%.otf-table) SVG_FILES = $(OTF_FILES:%.otf=%.svg) WOFF_FILES = $(OTF_FILES:%.otf=%.woff) -NCSB_OTFS = $(addprefix $(outdir)/,CenturySchL-Ital.otf \ - CenturySchL-BoldItal.otf \ - CenturySchL-Roma.otf \ - CenturySchL-Bold.otf) +TEXGYRE_OTFS = $(addprefix $(TEXGYRE_DIR)/,$(TEXGYRE_FILES)) + +LILYPOND_FONTS_CONF = $(outdir)/00-lilypond-fonts.conf \ + $(outdir)/99-lilypond-fonts.conf LOG_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.log) LISP_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.lisp) ENC_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.enc) TFM_FILES = $(FETA_MF_FILES:%.mf=$(outdir)/%.tfm) -$(outdir)/emmentaler-brace.otf-table: $(BRACES:%=$(outdir)/feta-braces-%.otf-table) - cat $^ > $@ - $(outdir)/emmentaler-brace.otf-gtable: $(BRACES:%=$(outdir)/feta-braces-%.otf-gtable) echo '(design_size . 20)' > $@ +$(outdir)/feta%.otf-table: $(outdir)/feta%.lisp $(outdir)/parmesan%.lisp \ + $(outdir)/parmesan-noteheads%.lisp \ + $(outdir)/feta-noteheads%.lisp \ + $(outdir)/feta-flags%.lisp \ + $(outdir)/feta-alphabet%.lisp + cat $^ > $@ - -## ugh -- we want this to prevent failing -j2 compiles. -define FETAxx-PREREQUISITES - - -$(outdir)/feta$(i).otf-table: $(outdir)/feta$(i).lisp \ - $(outdir)/feta-noteheads$(i).lisp \ - $(outdir)/feta-flags$(i).lisp \ - $(outdir)/parmesan$(i).lisp \ - $(outdir)/parmesan-noteheads$(i).lisp \ - $(outdir)/feta-alphabet$(i).lisp -endef - -$(eval $(foreach i,$(STAFF_SIZES),$(FETAxx-PREREQUISITES))) - -$(outdir)/%.otf-table: $(outdir)/%.lisp - cat $< $(if $(findstring brace,$<),,$(subst feta,parmesan,$<)) \ - $(if $(findstring brace,$<),,$(subst feta,parmesan-noteheads,$<)) \ - $(if $(findstring brace,$<),,$(subst feta,feta-noteheads,$<)) \ - $(if $(findstring brace,$<),,$(subst feta,feta-flags,$<)) \ - $(if $(findstring brace,$<),,$(subst feta,feta-alphabet,$<)) > $@ - +$(outdir)/emmentaler-brace.otf-table: $(foreach x, a b c d e f g h i,$(outdir)/feta-braces-$(x).lisp) + cat $^ > $@ $(outdir)/emmentaler-brace.otf: $(outdir)/emmentaler-brace.subfonts \ $(outdir)/emmentaler-brace.fontname \ @@ -82,57 +64,53 @@ $(outdir)/emmentaler-brace.otf: $(outdir)/emmentaler-brace.subfonts \ $(outdir)/emmentaler-brace.otf-gtable \ $(outdir)/emmentaler-brace.pe -$(outdir)/emmentaler-brace.otf\ - $(outdir)/emmentaler-brace.svg\ - $(outdir)/emmentaler-brace.woff: $(BRACES:%=$(outdir)/feta-braces-%.pfb) - $(outdir)/emmentaler-brace.fontname: printf 'emmentaler-brace' > $@ $(outdir)/emmentaler-brace.subfonts: echo $(subst .mf,,$(call src-wildcard,feta-braces-[a-z].mf)) > $@ -$(PE_SCRIPTS): $(buildscript-dir)/gen-emmentaler-scripts - $< --dir=$(outdir) - +$(outdir)/emmentaler-%.genpe: $(buildscript-dir)/gen-emmentaler-scripts + $< --dir=$(outdir) --design-size=$(patsubst emmentaler-%.genpe,%,$(notdir $@)) -# Generate emmentaler-*.pe scripts first, and *.otf, *.svg, *.woff files last, -# so that normally these files aren't regenerated on a subsequent call to make. -ALL_GEN_FILES = $(PE_SCRIPTS) \ - $(LOG_FILES) \ - $(ENC_FILES) \ - $(LISP_FILES) \ - $(OTF_TABLES) \ - $(NCSB_OTFS) \ +ALL_GEN_FILES = $(ENC_FILES) \ $(OTF_FILES) \ $(SVG_FILES) \ - $(WOFF_FILES) + $(WOFF_FILES) \ + $(LILYPOND_FONTS_CONF) # PRE_INSTALL=$(MAKE) "$(ALL_GEN_FILES)" INSTALLATION_DIR = $(local_lilypond_datadir)/fonts/source INSTALLATION_FILES = $(MF_FILES) -INSTALLATION_OUT_SUFFIXES = 1 2 +INSTALLATION_OUT_SUFFIXES = 1 2 3 INSTALLATION_OUT_DIR1 = $(local_lilypond_datadir)/fonts/otf INSTALLATION_OUT_FILES1 = $(OTF_FILES) \ - $(NCSB_OTFS) + $(TEXGYRE_OTFS) INSTALLATION_OUT_DIR2 = $(local_lilypond_datadir)/fonts/svg INSTALLATION_OUT_FILES2 = $(SVG_FILES) $(WOFF_FILES) +INSTALLATION_OUT_DIR3 = $(local_lilypond_datadir)/fonts +INSTALLATION_OUT_FILES3 = $(LILYPOND_FONTS_CONF) + export MFINPUTS := .:$(MFINPUTS) +# A few rules here generate multiple files from one command line. For +# treating this case, we only declare one output explicitly, and use a +# dummy rules for the other outputs. The dummy rule uses +# $(UPDATE_TARGET) so the order of writing in the real command does +# not confuse make. +UPDATE_TARGET = if test -f $@; then touch $@ ; fi + # only for fonts which # # 1. are mentioned in font.scm # # 2. are not included with teTeX # -$(outdir)/%.lisp \ -$(outdir)/%.otf-gtable \ -$(outdir)/%.enc \ -$(outdir)/%.pe: $(outdir)/%.log $(outdir)/%.tfm +$(outdir)/%.lisp: $(outdir)/%.log $(outdir)/%.tfm $(buildscript-dir)/mf-to-table \ --global-lisp=$(outdir)/$('$(shell cd $(outdir); pwd)'' > $@ - -$(NCSB_OTFS): $(NCSB_SOURCE_FILES) \ - $(auxscript-dir)/pfx2ttf.fontforge - $(foreach i, $(basename $(NCSB_SOURCE_FILES)), \ - $(FONTFORGE) -script $(auxscript-dir)/pfx2ttf.fontforge \ - $(i).pfb $(i).afm $(outdir)/ && ) true -# eof diff --git a/mf/README b/mf/README index adf0225145..bcea8964b2 100644 --- a/mf/README +++ b/mf/README @@ -1,14 +1,25 @@ -This is a font of music symbols. All MF sources are original. Most of the -documentation is in comments in the MF code. +LilyPond's Feta and Parmesan fonts +================================== + +[The name `feta' is based on a non-translatable Dutch pun (`font-en-tja'). + Given that it is the name of a cheese type, the font for old music symbols + is called `parmesan', and the OpenType font that merges these two fonts is + called `emmentaler'.] + +This is a font of music symbols. All MetaFont sources are original. Most +of the documentation is in comments in the MetaFont code. Non-square pixels are not supported; with other words, the horizontal and vertical resolution of the output device must be the same. -Currently, outline fonts are created by using `autotrace', but we are -already in the process of converting the MF code directly to PostScript code -with a tool called `mf2pt1', which in turn calls `FontForge' to postprocess -the output (mainly to remove outline overlaps and to add hints). + +Conversion from MetaFont to PostScript +-------------------------------------- + +The MetaFont code gets directly converted to PostScript Type 1 font with a +tool called `mf2pt1', which in turn calls `FontForge' to postprocess the +output (mainly to remove outline overlaps and to add hints). The recommended calling sequence of mf2pt1 is @@ -16,7 +27,6 @@ The recommended calling sequence of mf2pt1 is You need mf2pt1 version 2.1 or newer. - Here some guidelines to assure a clean conversion. . Never use `---'. Replace it with `--' together with explicit path @@ -39,31 +49,33 @@ Here some guidelines to assure a clean conversion. . Don't apply transformations after calling `fill' -- for example, don't mirror `currentpicture'. Instead, transform the path and call `fill' - afterwards. This ensures that mf2pt1 gets the correct outline directions + afterwards. This ensures that mf2pt1 gets the correct outline directions, which is a necessary prerequisite for FontForge's algorithm to remove overlaps. -Some glyph name rules: +Glyph name rules +---------------- . Most glyph names have the form ., where is defined with the `fet_begingroup' command, and is given with `fet_beginchar' (within a `fet_begingroup' block). Example: `clefs.vaticana.fa'. -. Sometimes it would be sensible to use negative numbers in glyph names. +. Sometimes it would be sensible to use negative numbers in glyph names. However, the `-' character shouldn't be used in a glyph name. Replace it with `M'. For example, write `rests.M3mensural' instead of `rests.-3mensural'. -. Glyphs which exist in both an `up' and `down' version should start the +. Glyphs that exist in both an `up' and `down' version should start the part with either `u' or `d', respectively. Example: `flags.d3', - `flags.u3'. Glyphs which are neutral w.r.t. the direction, and where - members of the glyph group exist which have `up' and `down' versions, + `flags.u3'. Glyphs that are neutral w.r.t. the direction, and where + members of the glyph group exist that have `up' and `down' versions, should start with an `s'. Example: `noteheads.s0re'. -Some design rules: +Design rules +------------ . Always use smooth curve transitions. Since this is difficult to see in MetaFont proof sheets (which don't show the tangents) I recommend to call @@ -77,7 +89,8 @@ Some design rules: . Use rounded corners. -Hints for stem attachment: +Hints for stem attachment +------------------------- . Stem attachment of glyphs is controlled by two special variables called `charwx' and `charwy'. Stems can be regarded as (very oblonged) @@ -86,19 +99,22 @@ Hints for stem attachment: (charwx, charwy). For stems pointing downwards it works analogously but with the upper left corner, where the position of the attachment point is additionally reflected horizontally about the center of the glyph -- this - ensures that in most cases charwx and charwy can be set to the same values - for up and down stems even though these are attached at the right/left end - of the note, respectively. To make this more precise, the upper left - corner of a down stem is attached at position (charwd/2 - charwx, charwy), - where `charwd' is an internal metafont variable representing the glyph + ensures that in most cases `charwx' and `charwy' can be set to the same + values for up and down stems even though these are attached at the + right/left end of the note, respectively. To make this more precise, the + upper left corner of a down stem is attached at position + + (charwd/2 - charwx, charwy) , + + where `charwd' is an internal MetaFont variable representing the glyph width as specified by the `set_char_box' command. . In case different stem attachments for upward and downward pointing stems - are needed, two separate glyphs must be defined in the Metafont file; of - course, this also applies if two entirely different shapes are needed. + are needed, two separate glyphs must be defined in the MetaFont file; of + course, this also applies if two entirely different shapes are needed. These have the same name but are prefixed by `u' and `d', respectively (for `up' and `down', obviously). In each of these glyphs the variables - charwx and charwy must be set accordingly. If, on the other hand, the + `charwx' and `charwy' must be set accordingly. If, on the other hand, the attachment point is the `same' for both directions (with the abovementioned horizontal reflection taken into account), then the prefix `s' (for `symmetric') should be used. See the existing files for @@ -108,9 +124,50 @@ Hints for stem attachment: and quarter notes, respectively). -Finally, some rules to assure that rasterization at low resolutions gives -good results. Today, this is a minor issue, but in some cases it might show -design flaws. +Proofing +-------- + +The proofing tool for MetaFont to inspect its output is `gftodvi', +converting a font in MetaFont's native GF font format to a DVI document, +which can then be viewed with DVI viewers like `xdvi'. The `gftodvi' +program needs two special fonts, `gray' and `black'. Assuming that you are +using TeXLive, say + + mktextfm gray + mktextfm black + +on the command line to generate the needed metric files (from its source +files), which are then stored within your local TEXMF tree. + +Here is a shell script that you can use to produce two DVI files, +`foo.proof.dvi' and `foo.ljfour.dvi', showing the glyphs of font `foo.mf' in +proofing mode and a 600dpi rasterization for a LaserJet IV printer. + + #!/bin/sh + mf "\mode:=proof; input $1" + gftodvi $1.2602gf && mv $1.dvi $1.proof.dvi + + mf "\mode:=ljfour; input $1" + echo "grayfont black + " | gftodvi $1.600gf/ \ + && mv $1.dvi $1.ljfour.dvi + +Assuming that you name this script `makefeta.sh', you can call it with e.g. + + sh makefeta.sh feta23 + +The main importance of the proofing DVI output is to show points marked in +the MetaFont source code with the macros `penlabels' and `labels'. In most +cases, those points are used for constructing the shapes only and are thus +not present in the output after the conversion with mf2pt1. + + +Rasterization +------------- + +Finally, some rules to assure that rasterization at low resolutions +(produced directly with MetaFont) gives good results. Today, this is a +minor issue, but in some cases it might show design flaws. . Use `define_whole_pixels' and friends where appropriate. diff --git a/mf/common-modules-and-initialization.mf b/mf/common-modules-and-initialization.mf new file mode 100644 index 0000000000..764dbd6470 --- /dev/null +++ b/mf/common-modules-and-initialization.mf @@ -0,0 +1,7 @@ + +staffsize# := design_size * pt#; +input debugging-settings; +input feta-autometric; +input feta-macros; +mode_setup; +input feta-params; diff --git a/mf/debugging-settings.mf b/mf/debugging-settings.mf new file mode 100644 index 0000000000..e867713461 --- /dev/null +++ b/mf/debugging-settings.mf @@ -0,0 +1,14 @@ + +% Used for example to print glyphs with stafflines +test := 0; + +if test = -1: + % TODO: what's this? Seems to be broken... + mode := smoke; +fi; + +% change this to 0.5 to have glyphs positioned on +% staff spaces instead of stafflines in testing mode +% (useful e.g. to check how accidentals visually interact +% with stafflines in different configurations). +stafflines_y_offset := 0; diff --git a/mf/declare-autometric-parameters.mf b/mf/declare-autometric-parameters.mf new file mode 100644 index 0000000000..89bf9212fe --- /dev/null +++ b/mf/declare-autometric-parameters.mf @@ -0,0 +1,9 @@ +% TODO: i'm not sure if the name is right - is this declaring or something else? + +autometric_parameter ("staffsize", staffsize#); +autometric_parameter ("stafflinethickness", stafflinethickness#); +autometric_parameter ("staff_space", staff_space#); +autometric_parameter ("linethickness", linethickness#); +autometric_parameter ("black_notehead_width", black_notehead_width#); +autometric_parameter ("ledgerlinethickness", ledgerlinethickness#); +autometric_parameter ("blot_diameter", blot_diameter#); diff --git a/mf/feta-accidentals.mf b/mf/feta-accidentals.mf index 1130672440..ed2ee529ea 100644 --- a/mf/feta-accidentals.mf +++ b/mf/feta-accidentals.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- Accidentals % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by @@ -18,21 +18,6 @@ % along with LilyPond. If not, see . -% -% 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 % @@ -56,1266 +41,9 @@ enddef; fet_begingroup ("accidentals"); - -% -% Draw an arrow -% -% * `stemslant' gives the direction of the stem's left boundary -% (needed for brushed stems, equals "up" for straight stems) -% * `extend' is used to make the stem longer or shorter (if negative); -% different kinds of accidentals need different values here -% -def draw_arrow (expr attach, stemwidth, stemslant, extend, pointingdown) = -begingroup; - save htip; % tip height - save wwing; % wing `radius' - save angle_wing_bot, angle_wing_top, angle_tip; - save upshift; - clearxy; - - wwing := 0.26 stemwidth; - htip := staff_space * 0.85 + stafflinethickness - wwing; - - % `flip' is used to reflect the arrow vertically - % if arrow points downward - transform flip; - if pointingdown: - flip = identity reflectedabout (origin, right); - else: - flip = identity; - fi; - - z1 = attach shifted (-stemwidth / 2, 0); - upshift := max (0, wwing + 0.1 staff_space + extend); - z2 = z1 shifted (((unitvector stemslant) - scaled upshift) transformed flip); - - z7 = attach shifted ((stemwidth/2),0); - z6 = z7 shifted (((unitvector (-xpart stemslant, ypart stemslant)) - scaled upshift) transformed flip); - z2 - z3 = ( 0.38 staff_space, 0.05 htip) transformed flip; - z6 - z5 = (-0.38 staff_space, 0.05 htip) transformed flip; - - z4 = attach shifted ((-0.2 stemwidth, upshift + htip) - transformed flip); - z4'= attach shifted (( 0.2 stemwidth, upshift + htip) - transformed flip); - - % `angle_wing_bot' is the angle at which the arc - % from z2 to z3a enters z3a - % `angle_wing_top' is the angle at which the arc - % from z3b to z4 leaves z3b - % `angle_tip' is the angle at which the arc - % from z4 to z4' leaves z4 - angle_wing_bot = 30; - angle_wing_top = 55; - angle_tip = 68; - - z3a = z3 shifted ((((dir angle_wing_bot) rotated -90) - scaled wwing) transformed flip); - z3b = z3 shifted ((((dir angle_wing_top) rotated 90) - scaled wwing) transformed flip); - - z5a = z5 shifted ((((dir (180 - angle_wing_bot)) rotated 90) - scaled wwing) transformed flip); - z5b = z5 shifted ((((dir (180 - angle_wing_top)) rotated -90) - scaled wwing) transformed flip); - - % Draw the arrow - pickup pencircle scaled 1; - fill z1 - -- z2{stemslant transformed flip} - .. {(-dir angle_wing_bot) transformed flip}z3a - .. z3b{(dir angle_wing_top) transformed flip} - .. z4{(dir angle_tip) transformed flip} - .. z4'{(dir (-angle_tip)) transformed flip} - .. {(dir (-angle_wing_top)) transformed flip}z5b - .. z5a{(-dir (-angle_wing_bot)) transformed flip} - .. z6{((-stemslant) reflectedabout (origin, up)) transformed flip} - -- z7 - -- cycle; - - labels (range 0 thru 7, 4', 3a, 3b, 5a, 5b); -endgroup; -enddef; - -save remember_pic; -picture remember_pic; - -save sharp_beamheight; -sharp_beamheight# := 0.3 staff_space# + stafflinethickness#; - -% -% The beams of most sharps have horizontal endings (as if drawn with -% a square pen). [Wanske] does not mention this, so we'll just ignore -% this fact. -% - -def draw_meta_sharp (expr width, offset) = - save beamwidth, beamslope; - save ne, nw_dist; - pair ne, nw_dist; - - beamwidth := width; - - define_whole_vertical_blacker_pixels (sharp_beamheight); - - clearxy; - - beamslope = sharp_beamheight / beamwidth; - - pickup pencircle scaled 2 blot_diameter; - - rt x2 - lft x1 = beamwidth; - z2 = z1 + whatever * (beamwidth, sharp_beamheight); - .5 [z1, z3] = (.5 w, offset); - x3 = x2; - top y2 - bot y3 = sharp_beamheight; - x4 = x1; - top y1 - bot y4 = sharp_beamheight; - - ne = unitvector (z2 - z1); - nw_dist = (ne rotated 90) * blot_diameter; - - fill lft z1{up} - ... (z1 + nw_dist){ne} - -- (z2 + nw_dist){ne} - ... rt z2{down} - -- rt z3{down} - ... (z3 - nw_dist){-ne} - -- (z4 - nw_dist){-ne} - ... lft z4{up} - -- cycle; - - labels (1, 2, 3, 4); -enddef; - - -def draw_sharp(expr arrowup, arrowdown) = - save stem, stemx, stemwidth; - save outer_space, interbeam; - save stemlength, extendleft, extendright, height, depth; - - stemwidth# := stafflinethickness# + .05 staff_space#; - define_whole_blacker_pixels (stemwidth); - - interbeam := 1.05 staff_space_rounded; - - stemlength# := 1.5 staff_space#; - define_pixels (stemlength); - - height# = stemlength#; - depth# = stemlength#; - extendright# = 0; - extendleft# = 0; - if arrowup: - height# := height# + 1.2 staff_space#; - extendright# := extendright# + 1.5 stafflinethickness#; - fi; - if arrowdown: - depth# := depth# + 1.2 staff_space#; - extendleft# := extendleft# + 1.5 stafflinethickness#; - fi; - define_pixels (extendleft, extendright); - set_char_box (extendleft#, 1.1 staff_space#, depth#, height#); - - stem := 7 / 16 * w; - stemx := hround stem; - outer_space := hround ((w - stemx - stemwidth) / 2); - - w := 2 outer_space + stemx + stemwidth; - d := d - feta_space_shift; - - draw_meta_sharp (w, -.5 interbeam); - draw_meta_sharp (w, -.5 interbeam + vround interbeam); - - % expand the charbox so that it encloses the whole arrow; - % this must not happen earlier because some commands above - % still rely on the old width - w := w + extendright; - - pickup pencircle scaled stemwidth; - - lft x5 = lft x6 = outer_space; - lft x7 = lft x8 = outer_space + stemx; - bot y5 = -stemlength; - top y6 = vround (1.5 staff_space - stem * beamslope); - bot y7 = -top y6 + feta_space_shift; - top y8 = stemlength; - - labels (5, 6, 7, 8); - - draw_gridline (z5, z6, stemwidth); - draw_gridline (z7, z8, stemwidth); - - if arrowup: - draw_arrow (z8, stemwidth, up, - stafflinethickness / 2 + stemwidth / 2, false); - fi; - if arrowdown: - draw_arrow (z5, stemwidth, up, - stafflinethickness / 2 + stemwidth / 2, true); - fi; - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -enddef; - - -fet_beginchar ("Sharp", "sharp"); - draw_sharp (false, false); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Arrowed Sharp (arrow up)", "sharp.arrowup"); - draw_sharp (true, false); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Arrowed Sharp (arrow down)", "sharp.arrowdown"); - draw_sharp (false, true); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Arrowed Sharp (arrows up and down)", "sharp.arrowboth"); - draw_sharp (true, true); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("1/2 Sharp", "sharp.slashslash.stem"); - save stem, stemwidth; - save outer_space, interbeam; - - stemwidth# := stafflinethickness# + .05 staff_space#; - define_whole_blacker_pixels (stemwidth); - - interbeam := 1.05 staff_space_rounded; - - set_char_box (0, 0.7 staff_space#, - 1.5 staff_space#, 1.5 staff_space#); - - stem := 7 / 16 * w; - outer_space := hround ((w - stemwidth) / 2); - - w := 2 outer_space + stemwidth; - d := d - feta_space_shift; - - draw_meta_sharp (w, -.5 interbeam); - draw_meta_sharp (w, -.5 interbeam + vround interbeam); - - pickup pencircle scaled stemwidth; - - lft x5 = lft x6 = outer_space; - top y6 = vround (1.5 staff_space - .5 stem); - bot y5 = -top y6 + feta_space_shift; - - labels (5, 6); - - draw_gridline (z5, z6, stemwidth); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Sharp (3 beams)", "sharp.slashslashslash.stemstem"); - save stem, stemx, stemwidth; - save outer_space, interbeam; - save sharp_beamheight; - - sharp_beamheight# := 0.22 staff_space# + stafflinethickness#; - - stemwidth# := stafflinethickness# + .05 staff_space#; - define_whole_blacker_pixels (stemwidth); - - interbeam := 1.2 staff_space_rounded; - - set_char_box (0, 1.1 staff_space#, - 1.5 staff_space#, 1.5 staff_space#); - - stem := 7 / 16 * w; - stemx := hround stem; - outer_space := hround ((w - stemx - stemwidth) / 2); - - w := 2 outer_space + stemx + stemwidth; - d := d - feta_space_shift; - - draw_meta_sharp (.88 w, -.5 interbeam); - draw_meta_sharp (.88 w, -.5 interbeam + vround interbeam); - sharp_beamheight# := 1/.88 sharp_beamheight#; - draw_meta_sharp (w, 0); - - pickup pencircle scaled stemwidth; - - lft x5 = lft x6 = outer_space; - lft x7 = lft x8 = outer_space + stemx; - bot y5 = -d; - top y6 = vround (1.5 staff_space - stem * beamslope); - bot y7 = -top y6 + feta_space_shift; - top y8 = h; - - labels (5, 6, 7, 8); - - draw_gridline (z5, z6, stemwidth); - draw_gridline (z7, z8, stemwidth); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("1/2 Sharp (3 beams)", "sharp.slashslashslash.stem"); - save stem, stemx, stemwidth; - save outer_space, interbeam; - save sharp_beamheight; - - sharp_beamheight# := 0.22 staff_space# + stafflinethickness#; - - stemwidth# := stafflinethickness# + .05 staff_space#; - define_whole_blacker_pixels (stemwidth); - - interbeam := 1.2 staff_space_rounded; - - set_char_box (0, 0.95 staff_space#, - 1.3 staff_space#, 1.3 staff_space#); - - stem := 7 / 16 * w; - outer_space := hround ((w - stemwidth) / 2); - - w := 2 outer_space + stemwidth; - d := d - feta_space_shift; - - draw_meta_sharp (.8 w, -.5 interbeam); - draw_meta_sharp (.8 w, -.5 interbeam + vround interbeam); - sharp_beamheight# := 1/.8 sharp_beamheight#; - draw_meta_sharp (w, 0); - - pickup pencircle scaled stemwidth; - - lft x5 = lft x6 = outer_space; - top y6 = vround (1.5 staff_space - .5 stem); - bot y5 = -top y6 + feta_space_shift; - labels (5, 6); - - draw_gridline (z5, z6, stemwidth); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("3/4 Sharp", "sharp.slashslash.stemstemstem"); - save stem, stemx, stemwidth; - save outer_space, interbeam; - - stemwidth# := stafflinethickness# + .05 staff_space#; - define_whole_blacker_pixels (stemwidth); - - interbeam := 1.05 staff_space_rounded; - - set_char_box (0, 1.6 staff_space#, - 1.5 staff_space#, 1.5 staff_space#); - - stem := 9 / 32 * w; - stemx := hround stem; - outer_space := hround ((w - 2 stemx - stemwidth) / 2); - - w := 2 outer_space + 2 stemx + stemwidth; - d := d - feta_space_shift; - - draw_meta_sharp (w, -.5 interbeam); - draw_meta_sharp (w, -.5 interbeam + vround interbeam); - - pickup pencircle scaled stemwidth; - - lft x5 = lft x6 = outer_space; - lft x7 = lft x8 = outer_space + stemx; - lft x9 = lft x10 = outer_space + 2 stemx; - bot y5 = -d; - top y6 = vround (1.5 staff_space - 2 stem * beamslope); - bot y9 = -top y6 + feta_space_shift; - top y10 = h; - y7 = .5 [y5, y9]; - y8 = .5 [y6, y10]; - - labels (5, 6, 7, 8, 9, 10); - - draw_gridline (z5, z6, stemwidth); - draw_gridline (z7, z8, stemwidth); - draw_gridline (z9, z10, stemwidth); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -% -% The stems of the natural are brushed (at least, in Barenreiter SCS) -% - -def draw_natural (expr arrowup, arrowdown) = - save stemwidth, top_stem_thick; - save ne, pat_top, pat_bottom; - save depth, height, extendleft, extendright, stemlength; - save brush_scale_up, brush_scale_down; - pair ne; - path pat_top, pat_bottom; - - top_stem_thick# = stafflinethickness# + .10 staff_space#; - stemwidth# = 0.09 staff_space# + .5 stafflinethickness#; - define_whole_blacker_pixels (top_stem_thick, stemwidth); - - stemlength# = 1.5 staff_space#; - define_pixels (stemlength); - - height# = stemlength#; - depth# = stemlength#; - extendleft# = 0; - extendright# = 0; - if arrowup: - extendleft# := 3 stafflinethickness#; - height# := height# + 1.2 staff_space#; - fi; - if arrowdown: - extendright# := 3.15 stafflinethickness#; - depth# := depth# + 1.2 staff_space#; - fi; - define_pixels (extendright); - - set_char_box (extendleft#, 2/3 staff_space#, depth#, height#); - - d := d - feta_space_shift; - - pickup pencircle scaled stemwidth; - - brush_scale_up := 1.0; - brush_scale_down := 1.0; - % to look nice, arrowed stems must be less brushed - if arrowup: - brush_scale_up := 0.85; - fi; - if arrowdown: - brush_scale_down := 0.85; - fi; - - penpos1 (top_stem_thick, 0); - penpos3 (top_stem_thick, 0); - penpos2 (stemwidth, 0); - penpos4 (stemwidth, 0); - % z1' and z3' are needed for the arrowed accidentals - penpos1' (top_stem_thick * brush_scale_up, 0); - penpos3' (top_stem_thick * brush_scale_down, 0); - - x2r = w; - x4l = 0; - x3 = x3' = x2; - x1 = x1' = x4; - - y1 = y1' = stemlength; - y3 = y3' = -stemlength; - top y2 = vround (staff_space - 3/2 stafflinethickness); - y4 = -y2 + feta_space_shift; - - pat_bottom := z4r{z4r - z1r} - .. bot z4 - .. z4l{z1l - z4l}; - fill simple_serif (z1'l, z1'r, -30) - -- pat_bottom - -- cycle; - - pat_top := z2r{z2r - z3r} - .. top z2 - .. z2l{z3l - z2l}; - fill simple_serif (z3'l, z3'r, 30) - -- pat_top - -- cycle; - - ne = (x2 - x4, stafflinethickness); - - z11' = z3l + whatever * (z2l - z3l); - y11' = vround (.5 (staff_space - stafflinethickness)); - z11 = z11' + whatever * ne; - x11 = x12; - z12 = directionpoint -ne of pat_top; - z13 = z12 + whatever * ne; - x13 = x1; - z14 = z11 + whatever * ne; - x14 = x1; - - z21' = z4r + whatever * (z1r - z4r); - y21' = -y11' + feta_space_shift; - z21 = z21' + whatever * ne; - x21 = x22; - z22 = directionpoint -ne of pat_bottom; - z23 = z22 + whatever * ne; - x23 = x3; - z24 = z21 + whatever * ne; - x24 = x3; - - fill z11 - -- z12 - -- z13 - -- z14 - -- cycle; - fill z21 - -- z22 - -- z23 - -- z24 - -- cycle; - - penlabels (1, 1', 2, 3, 3', 4); - labels (11, 11', 12, 13, 14, 21, 21', 22, 23, 24); - - if arrowup: - draw_arrow (z1, top_stem_thick * brush_scale_up, - z1'l - z4l, stafflinethickness / 2, false); - fi; - if arrowdown: - draw_arrow (z3, top_stem_thick * brush_scale_down, - z2r - z3'r, stafflinethickness / 2, true); - w := w + extendright; - fi; - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -enddef; - - -fet_beginchar ("Natural", "natural"); - draw_natural (false, false); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Arrowed Natural (arrow up)", "natural.arrowup"); - draw_natural (true, false); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Arrowed Natural (arrow down)", "natural.arrowdown"); - draw_natural (false, true); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Arrowed Natural (arrows up and down)", "natural.arrowboth"); - draw_natural (true, true); -fet_endchar; - - -draw_shifted_too; - - -% -% Dedicated to my mom. (3/10/97) -% -% Mamma, ik hou van je; kom je alsjeblieft terug? -% -- HW -% -% -% TODO: remove crook_fatness -% TODO: document, simplify! -% - -def draw_meta_flat (expr xcenter, w, crook_fatness, arrowup, arrowdown) = - save crook_thinness; - save bottom_overshoot, bot_crook_dir; - save top_stem_thick, top_stem_thick_orig; - save bottom_stem_thick, hair, smaller_hole; - save top_crook_thinness; - save zwiep; - save center; - pair center, bot_crook_dir; - save clearing, clearing_orig; - - clearxy; - - % the stem shouldn't reach the top staff line. - %% TODO: should take from height. - % - % TODO: parameterize this - % - if w >= 0.75 staff_space: - smaller_hole = 0.35 stafflinethickness; - else: - smaller_hole = 0; - fi; - crook_thinness = .7 stafflinethickness + .06 staff_space; - top_crook_thinness = 1 stafflinethickness + .065 staff_space; - clearing = 1.7 stafflinethickness; - clearing_orig = clearing; - if arrowup: - clearing := 0.5 staff_space; - fi; - bottom_overshoot = stafflinethickness; - - bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#; - top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#; - top_stem_thick_orig# = top_stem_thick#; - if arrowup: - % to look nice, arrowed stems should be less brushed - top_stem_thick# := top_stem_thick# * 0.8; - fi; - define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick, - top_stem_thick_orig); - - if odd (top_stem_thick - bottom_stem_thick): - top_stem_thick := top_stem_thick - 1; - fi; - if odd (top_stem_thick_orig - bottom_stem_thick): - top_stem_thick_orig := top_stem_thick_orig - 1; - fi; - - center = (xcenter, 0); - - x1l = hround (xcenter - .5 top_stem_thick); - y1 = vround (2 staff_space - clearing); - x2l = hround (xcenter - .5 bottom_stem_thick); - y2 = -.5 staff_space - .5 stafflinethickness; - % z16 and the `*_orig' variables are needed for arrowed accidentals - % because their inner part should be unchanged from plain ones but - % the points z3l, z3r, and z10 depend on values that are different - % for arrowed accidentals - x16l = hround (xcenter -.5 top_stem_thick_orig); - y16 = vround (2 staff_space - clearing_orig); - - penpos1 (top_stem_thick, 0); - penpos16 (top_stem_thick_orig, 0); - penpos2 (bottom_stem_thick, 0); - - y3l = vfloor ((staff_space - stafflinethickness) / 2); - z3l = whatever [z2r, z1r]; - z3r = .3 [z2r, - (z16r shifted (0, clearing_orig - 1.7 stafflinethickness))] - + (smaller_hole, 0); - x3r := hceiling x3r; - - % we insert z3l to get better conversion with mf2pt1 - fill simple_serif (z1r, z1l, 30) - -- z2l - -- z2r - -- z3l - -- cycle; - - z10 = whatever [z2r, z16r] + (smaller_hole, 0); - y10 = -1/10 staff_space; - x10 := hceiling x10; - - x11 = xcenter + bottom_overshoot / 3; - y11 = -vround (.5 (staff_space + stafflinethickness) - + bottom_overshoot); - - x2a = 0.2[x2r, x7]; - y2a = 1.5[y2, y11]; - - penpos4 (whatever, 53); - - y4l - y4r = top_crook_thinness; - y5r = .15 staff_space; - x5l = hround (w + xcenter); - y4 = staff_space / 2; - x4r = .45 [x5r, x3r]; - y4l := vround y4l; - - penpos5 (crook_fatness, -175); - - bot_crook_dir = unitvector ((x5l, 0) - z11); - z8 = z11 + whatever * bot_crook_dir; - y8 = -staff_space / 2; - - z7 = z8 - + whatever * bot_crook_dir - + crook_thinness * (bot_crook_dir rotated 90); - x7 = .1 [x3r, x8]; - - unfill z3r{z3r - z10} - .. z4r{right} - .. z5r{down} - .. z7{-bot_crook_dir} - & z7 - .. z10{z3r - z10} - -- cycle; - - if arrowdown: - fill z2l{down} - .. z2a{up} - .. z8{bot_crook_dir} - .. z5l{up} - .. z4l{left} - .. z3l - -- cycle; - else: - fill z2l{down} - .. z11{right} - .. z8{bot_crook_dir} - .. z5l{up} - .. z4l{left} - .. z3l - -- cycle; - fi; - - if arrowup: - draw_arrow (z1, top_stem_thick, z1l - z2l, - 0.5 stafflinethickness, false); - fi; - if arrowdown: - draw_arrow ((0.5 [x2l, x2a], y2), x2a - x2l, up, - staff_space / 2, true); - fi; -enddef; - - -def draw_arrowed_meta_flat (expr xcenter, width, crook_fatness, - arrowup, arrowdown) = - save depth, height, extendleft; - - depth# = 0.6 staff_space#; - height# = 1.9 staff_space#; - extendleft# := 1.2 stafflinethickness#; - if arrowup: - extendleft# := 3.45 stafflinethickness#; - height# := height# + 0.8 staff_space#; - fi; - if arrowdown: - extendleft# := 3.45 stafflinethickness#; - depth# := depth# + 1.6 staff_space#; - fi; - - set_char_box (extendleft#, width, depth#, height#); - draw_meta_flat(xcenter, w, crook_fatness, arrowup, arrowdown); -enddef; - -% -% unfortunately, 600dpi is not enough to show the brush of the stem. -% - -fet_beginchar ("Flat", "flat"); - draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space, - false, false); - penlabels (range 0 thru 11); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Arrowed Flat (arrow up)", "flat.arrowup"); - draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space, - true, false); - penlabels (range 0 thru 23); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Arrowed Flat (arrow down)", "flat.arrowdown"); - draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space, - false, true); - penlabels (range 0 thru 23); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Arrowed Flat (arrow up and down)", "flat.arrowboth"); - draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space, - true, true); - penlabels (range 0 thru 23); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Flat (slashed)", "flat.slash"); - set_char_box (.4 staff_space#, .8 staff_space#, - 0.6 staff_space#, 1.9 staff_space#); - - draw_meta_flat (0, w, 0.31 staff_space, false, false); - - clearxy; - - save slope, slash_width; - slope = 0.5; - slash_width = w; - - z11 = (0, h / 2); - z12 = z11 - (slash_width, slash_width * slope) / 2; - z13 = z11 + (slash_width, slash_width * slope) / 2; - penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90); - penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90); - - z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12); - z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12); - - fill z13r - .. z15 - .. z13l - -- z12l - .. z14 - .. z12r - -- z13r - .. cycle; - - penlabels (12, 13); - labels (14, 15); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -fet_beginchar ("Flat (slashed twice)", "flat.slashslash"); - set_char_box (.4 staff_space#, .8 staff_space#, - 0.6 staff_space#, 1.9 staff_space#); - - draw_meta_flat (0, w, 0.31 staff_space, false, false); - - clearxy; - - save slope, slash_width; - slope = 0.5; - slash_width = w; - - z11 = (0, 5/12 h); - z12 = z11 - (slash_width, slash_width * slope) / 2; - z13 = z11 + (slash_width, slash_width * slope) / 2; - penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90); - penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90); - - z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12); - z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12); - - fill z13r - .. z15 - .. z13l - -- z12l - .. z14 - .. z12r - -- z13r - .. cycle; - - penlabels (12, 13); - labels (14, 15); - - z21 = (0, 2/3 h); - z22 = z21 - (slash_width, slash_width * slope) / 2; - z23 = z21 + (slash_width, slash_width * slope) / 2; - penpos22 (1.5 stafflinethickness, angle (z23 - z22) - 90); - penpos23 (1.5 stafflinethickness, angle (z23 - z22) - 90); - - z24 = z22 - .75 stafflinethickness * unitvector (z23 - z22); - z25 = z23 + .75 stafflinethickness * unitvector (z23 - z22); - - fill z23r - .. z25 - .. z23l - -- z22l - .. z24 - .. z22r - -- z23r - .. cycle; - - penlabels (22, 23); - labels (24, 25); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -fet_beginchar ("Flatflat (mirrored)", "mirroredflat.flat"); - set_char_box (0, 1.6 staff_space#, - 0.6 staff_space#, 1.9 staff_space#); - - % This is a modified version of `draw_meta_flat'. - - save crook_thinness, crook_fatness; - save bottom_overshoot, bot_crook_dir; - save top_stem_thick, bottom_stem_thick, hair, smaller_hole; - save top_crook_thinness; - save zwiep; - save center; - pair center, bot_crook_dir; - save clearing, wid; - save pat; - path pat; - - clearxy; - - wid = w / 2; - - % the stem shouldn't reach the top staff line. - %% TODO: should take from height. - % - % TODO: parameterize this - % - if wid >= 0.75 staff_space: - smaller_hole = 0.35 stafflinethickness; - else: - smaller_hole = 0; - fi; - clearing = 1.7 stafflinethickness; - crook_thinness = .7 stafflinethickness + .06 staff_space; - crook_fatness = 0.31 staff_space; - top_crook_thinness = 1 stafflinethickness + .065 staff_space; - bottom_overshoot = stafflinethickness; - - bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#; - top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#; - define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick); - - if odd (top_stem_thick - bottom_stem_thick): - top_stem_thick := top_stem_thick - 1; - fi; - - center = (0, 0); - - x1l = hround (-.5 top_stem_thick); - y1 = vround (2 staff_space - clearing); - x2l = hround (-.5 bottom_stem_thick); - y2 = -.5 staff_space - .5 stafflinethickness; - - penpos1 (top_stem_thick, 0); - penpos2 (bottom_stem_thick, 0); - - y3l = vfloor ((staff_space - stafflinethickness) / 2); - z3l = whatever [z2r, z1r]; - z3r = .3 [z2r, z1r] + (smaller_hole, 0); - x3r := hceiling x3r; - - z10 = whatever [z2r, z1r] + (smaller_hole, 0); - y10 = -1/10 staff_space; - x10 := hceiling x10; - - x11 = bottom_overshoot / 3; - y11 = -vround (.5 (staff_space + stafflinethickness) - + bottom_overshoot); - - penpos4 (whatever, 53); - - y4l - y4r = top_crook_thinness; - y5r = .15 staff_space; - x5l = hround (wid); - y4 = staff_space / 2; - x4r = .45 [x5r, x3r]; - y4l := vround y4l; - - penpos5 (crook_fatness, -175); - - bot_crook_dir = unitvector ((x5l, 0) - z11); - z8 = z11 + whatever * bot_crook_dir; - y8 = -staff_space / 2; - - z7 = z8 - + whatever * bot_crook_dir - + crook_thinness * (bot_crook_dir rotated 90); - x7 = .1 [x3r, x8]; - - pat := z3r{z3r - z10} - .. z4r{right} - .. z5r{down} - .. z7{-bot_crook_dir} - & z7 - .. z10{z3r - z10} - -- cycle; - unfill pat; - unfill pat xscaled -1; - - pat := z11{right} - .. z8{bot_crook_dir} - .. z5l{up} - .. z4l{left} - .. z3l; - fill pat - -- simple_serif (z1r, z1l, 30) - -- reverse pat xscaled -1 shifted (-feta_eps, 0) - -- cycle; - - currentpicture := currentpicture shifted (w/2, 0); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Semi flat", "mirroredflat"); - set_char_box (1.2 stafflinethickness#, .8 staff_space#, - 0.6 staff_space#, 1.9 staff_space#); - - draw_meta_flat (0, w, 0.31 staff_space, false, false); - currentpicture := currentpicture xscaled -1 shifted (w - b, 0); -fet_endchar; - - -fet_beginchar ("Semi flat", "mirroredflat.backslash"); - set_char_box (.4 staff_space#, .8 staff_space#, - 0.6 staff_space#, 1.9 staff_space#); - - draw_meta_flat (0, w, 0.31 staff_space, false, false); - - clearxy; - - save slope, slash_width; - slope = 0.5; - slash_width = w; - - z11 = (0, h / 2); - z12 = z11 - (slash_width, slash_width * slope) / 2; - z13 = z11 + (slash_width, slash_width * slope) / 2; - penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90); - penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90); - - z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12); - z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12); - - fill z13r - .. z15 - .. z13l - -- z12l - .. z14 - .. z12r - -- z13r - .. cycle; - - currentpicture := currentpicture xscaled -1 shifted (w - b, 0); - - labels (1, 2, 3); -fet_endchar; - - -fet_beginchar ("Double Flat", "flatflat"); - save left_wid, overlap, right_wid; - - left_wid = .7; - right_wid = .8; - overlap = .05; - - set_char_box (1.2 stafflinethickness#, - (left_wid + right_wid - overlap) * staff_space#, - .6 staff_space#, 1.9 staff_space#); - draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space, - false, false); - draw_meta_flat (hround ((left_wid - overlap) * staff_space), - right_wid * staff_space, 1/3 staff_space, - false, false); -fet_endchar; - - -fet_beginchar ("3/4 Flat", "flatflat.slash"); - save left_wid, overlap, right_wid; - - left_wid = .7; - right_wid = .8; - overlap = .05; - - set_char_box (1.2 stafflinethickness#, - (left_wid + right_wid - overlap) * staff_space#, - .6 staff_space#, 1.9 staff_space#); - draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space, - false, false); - draw_meta_flat (hround ((left_wid - overlap) * staff_space), - right_wid * staff_space, 1/3 staff_space, - false, false); - - %% maybe we should clip part of the stems? - %% or make the 1st flat smaller? - %% or reverse it? - pickup pencircle scaled 2 stafflinethickness; - - z12 = round (-.25 w - b, .55 staff_space) + feta_offset; - z13 = round (.75 w, 1.45 staff_space) + feta_offset; - penpos12 (2 stafflinethickness, angle (z13 - z12) - 90); - penpos13 (2 stafflinethickness, angle (z13 - z12) - 90); - - z14 = z12 - stafflinethickness * unitvector (z13 - z12); - z15 = z13 + stafflinethickness * unitvector (z13 - z12); - - fill z13r - .. z15 - .. z13l - -- z12l - .. z14 - .. z12r - -- z13r - .. cycle; - - penlabels (12, 13); - labels (14, 15); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Double Sharp", "doublesharp"); - save klaverblad, klaversteel; - save pat; - path pat; - - klaversteel = 1/15 staff_space; - klaverblad = .4 staff_space - .5 stafflinethickness; - - set_char_box (0, staff_space#, .5 staff_space#, .5 staff_space#); - - z1 = (klaversteel, 0); - z2 = (w / 2 - klaverblad / 10, h - klaverblad); - z3 = (w / 2, h); - z4 = z2 reflectedabout ((0, 0), (1, 1)); - z5 = z1 reflectedabout ((0, 0), (1, 1)); - - labels (1, 2, 3, 4, 5); - - pickup pencircle scaled blot_diameter; - - x2 := hfloor (rt x2) - blot_diameter / 2; - x3 := hfloor (rt x3) - blot_diameter / 2; - y3 := vfloor (top y3) - blot_diameter / 2; - y4 := vfloor (top y4) - blot_diameter / 2; - - pat = (rt z1){dir45} - .. {right}(bot z2) - .. rt z2 - -- rt z3{z3 - z2} - .. top z3{z4 - z3} - -- top z4{z4 - z3} - .. (lft z4){down} - .. {dir 225}(top z5); - pat := pat - -- reverse pat xscaled -1 shifted (-feta_eps, 0); - - % assure symmetry -- it's more important to center the glyph on the - % staff line than centering it between staff lines, so we use - % feta_shift, not feta_space_shift. - h := h + feta_shift; - - fill pat shifted (0, feta_shift) - -- reverse pat yscaled -1 shifted (0, -feta_eps) - -- cycle; - - % ugh - currentpicture := currentpicture shifted (hround (w / 2), 0); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -def draw_paren = - save leftindent; - - leftindent := .2 staff_space; - - set_char_box (0, .5 staff_space# + stafflinethickness#, - staff_space#, staff_space#); - - d := d - feta_shift; - - z1 = (leftindent, h); - z2 = (w - stafflinethickness, .5 (h - d)); - z3 = (leftindent, -d); - - penpos1 (stafflinethickness, 35); - penpos2 (.1 staff_space + stafflinethickness, 0); - penpos3 (stafflinethickness, -35); - - fill z2l{down} - .. simple_serif (z3l, z3r, 90) - .. z2r{up} - .. simple_serif (z1r, z1l, 90) - .. z2l{down} - -- cycle; -enddef; - - -fet_beginchar ("Right Parenthesis", "rightparen"); - draw_paren; - penlabels (1, 2, 3); - - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); -fet_endchar; - - -draw_shifted_too; - - -fet_beginchar ("Left Parenthesis", "leftparen"); - draw_paren; - - currentpicture := currentpicture xscaled -1; - - set_char_box (charwd, charbp, chardp, charht); -fet_endchar; - + input feta-arrow; + input feta-sharps; + input feta-naturals; + input feta-flats; + input feta-parenthesis; fet_endgroup ("accidentals"); diff --git a/mf/feta-accordion.mf b/mf/feta-accordion.mf index 68271bf995..4b8640b8c2 100644 --- a/mf/feta-accordion.mf +++ b/mf/feta-accordion.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- draw accordion symbols % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1998--2012 Han-Wen Nienhuys +% Copyright (C) 1998--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/feta-alphabet-generic.mf b/mf/feta-alphabet-generic.mf new file mode 100644 index 0000000000..6f1f3ce2b4 --- /dev/null +++ b/mf/feta-alphabet-generic.mf @@ -0,0 +1,19 @@ +% This file is part of LilyPond, the GNU music typesetter. +% +% Copyright (C) 1997--2015 Han-Wen Nienhuys +% +% The LilyPond font is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version, or under the SIL Open Font License. + + +input common-modules-and-initialization; + +fet_beginfont ("feta-alphabet", design_size, "fetaNumber"); + number_design_size := design_size / 2; + dynamic_design_size := 14 design_size / 20; + + input feta-numbers; + input feta-dynamics; +fet_endfont ("feta-numbers"); diff --git a/mf/feta-alphabet.mf b/mf/feta-alphabet.mf deleted file mode 100644 index 5663a791b7..0000000000 --- a/mf/feta-alphabet.mf +++ /dev/null @@ -1,19 +0,0 @@ -test := 0; - -staffsize# := design_size * pt#; - -input feta-autometric; -input feta-macros; -input feta-params; - -fet_beginfont ("feta-alphabet", design_size, "fetaNumber"); - -mode_setup; - -number_design_size := design_size / 2; -dynamic_design_size := 14 design_size / 20; - -input feta-numbers; -input feta-dynamics; - -fet_endfont ("feta-numbers"); diff --git a/mf/feta-alphabet11.mf b/mf/feta-alphabet11.mf index 04ba4e3867..c9e10df325 100644 --- a/mf/feta-alphabet11.mf +++ b/mf/feta-alphabet11.mf @@ -1,6 +1,6 @@ -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 11.22; -input feta-alphabet; +input feta-alphabet-generic; end. diff --git a/mf/feta-alphabet13.mf b/mf/feta-alphabet13.mf index d314f40d4d..56924fb199 100644 --- a/mf/feta-alphabet13.mf +++ b/mf/feta-alphabet13.mf @@ -1,6 +1,6 @@ -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 12.60; -input feta-alphabet; +input feta-alphabet-generic; end. diff --git a/mf/feta-alphabet14.mf b/mf/feta-alphabet14.mf index 9a1bd2ee71..8db8b63da7 100644 --- a/mf/feta-alphabet14.mf +++ b/mf/feta-alphabet14.mf @@ -1,6 +1,6 @@ -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 14.14; -input feta-alphabet; +input feta-alphabet-generic; end. diff --git a/mf/feta-alphabet16.mf b/mf/feta-alphabet16.mf index 86eb9c8c89..e93d0e61c0 100644 --- a/mf/feta-alphabet16.mf +++ b/mf/feta-alphabet16.mf @@ -1,6 +1,6 @@ -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 15.87; -input feta-alphabet; +input feta-alphabet-generic; end. diff --git a/mf/feta-alphabet18.mf b/mf/feta-alphabet18.mf index db216c154b..30441bbd9b 100644 --- a/mf/feta-alphabet18.mf +++ b/mf/feta-alphabet18.mf @@ -1,6 +1,6 @@ -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 17.82; -input feta-alphabet; +input feta-alphabet-generic; end. diff --git a/mf/feta-alphabet20.mf b/mf/feta-alphabet20.mf index 0affe39057..3d86449713 100644 --- a/mf/feta-alphabet20.mf +++ b/mf/feta-alphabet20.mf @@ -1,7 +1,6 @@ -% feta-alphabet20.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 20; -input feta-alphabet; +input feta-alphabet-generic; end. diff --git a/mf/feta-alphabet23.mf b/mf/feta-alphabet23.mf index c8a725e59e..ffd3381ce4 100644 --- a/mf/feta-alphabet23.mf +++ b/mf/feta-alphabet23.mf @@ -1,7 +1,6 @@ -% feta-alphabet23.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 22.45; -input feta-alphabet; +input feta-alphabet-generic; end. diff --git a/mf/feta-alphabet26.mf b/mf/feta-alphabet26.mf index 71af0403f9..02170ec89d 100644 --- a/mf/feta-alphabet26.mf +++ b/mf/feta-alphabet26.mf @@ -1,6 +1,6 @@ -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 25.20; -input feta-alphabet; +input feta-alphabet-generic; end. diff --git a/mf/feta-arrow.mf b/mf/feta-arrow.mf new file mode 100644 index 0000000000..fab1bf1ba4 --- /dev/null +++ b/mf/feta-arrow.mf @@ -0,0 +1,82 @@ + +% +% Draw an arrow +% +% * `stemslant' gives the direction of the stem's left boundary +% (needed for brushed stems, equals "up" for straight stems) +% * `extend' is used to make the stem longer or shorter (if negative); +% different kinds of accidentals need different values here +% +def draw_arrow (expr attach, stemwidth, stemslant, extend, pointingdown) = +begingroup; + save htip; % tip height + save wwing; % wing `radius' + save angle_wing_bot, angle_wing_top, angle_tip; + save upshift; + clearxy; + + wwing := 0.26 stemwidth; + htip := staff_space * 0.85 + stafflinethickness - wwing; + + % `flip' is used to reflect the arrow vertically + % if arrow points downward + transform flip; + if pointingdown: + flip = identity reflectedabout (origin, right); + else: + flip = identity; + fi; + + z1 = attach shifted (-stemwidth / 2, 0); + upshift := max (0, wwing + 0.1 staff_space + extend); + z2 = z1 shifted (((unitvector stemslant) + scaled upshift) transformed flip); + + z7 = attach shifted ((stemwidth/2),0); + z6 = z7 shifted (((unitvector (-xpart stemslant, ypart stemslant)) + scaled upshift) transformed flip); + z2 - z3 = ( 0.38 staff_space, 0.05 htip) transformed flip; + z6 - z5 = (-0.38 staff_space, 0.05 htip) transformed flip; + + z4 = attach shifted ((-0.2 stemwidth, upshift + htip) + transformed flip); + z4'= attach shifted (( 0.2 stemwidth, upshift + htip) + transformed flip); + + % `angle_wing_bot' is the angle at which the arc + % from z2 to z3a enters z3a + % `angle_wing_top' is the angle at which the arc + % from z3b to z4 leaves z3b + % `angle_tip' is the angle at which the arc + % from z4 to z4' leaves z4 + angle_wing_bot = 30; + angle_wing_top = 55; + angle_tip = 68; + + z3a = z3 shifted ((((dir angle_wing_bot) rotated -90) + scaled wwing) transformed flip); + z3b = z3 shifted ((((dir angle_wing_top) rotated 90) + scaled wwing) transformed flip); + + z5a = z5 shifted ((((dir (180 - angle_wing_bot)) rotated 90) + scaled wwing) transformed flip); + z5b = z5 shifted ((((dir (180 - angle_wing_top)) rotated -90) + scaled wwing) transformed flip); + + % Draw the arrow + pickup pencircle scaled 1; + fill z1 + -- z2{stemslant transformed flip} + .. {(-dir angle_wing_bot) transformed flip}z3a + .. z3b{(dir angle_wing_top) transformed flip} + .. z4{(dir angle_tip) transformed flip} + .. z4'{(dir (-angle_tip)) transformed flip} + .. {(dir (-angle_wing_top)) transformed flip}z5b + .. z5a{(-dir (-angle_wing_bot)) transformed flip} + .. z6{((-stemslant) reflectedabout (origin, up)) transformed flip} + -- z7 + -- cycle; + + labels (range 0 thru 7, 4', 3a, 3b, 5a, 5b); +endgroup; +enddef; diff --git a/mf/feta-arrowheads.mf b/mf/feta-arrowheads.mf index e202692182..a311c4a262 100644 --- a/mf/feta-arrowheads.mf +++ b/mf/feta-arrowheads.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- draw arrow heads % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2005--2012 Han-Wen Nienhuys +% Copyright (C) 2005--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/feta-autometric.mf b/mf/feta-autometric.mf index e24f1605db..50ac474f54 100644 --- a/mf/feta-autometric.mf +++ b/mf/feta-autometric.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- administrative MF routines % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % Jan Nieuwenhuizen % % These macros help create ascii logging output diff --git a/mf/feta-braces-a.mf b/mf/feta-braces-a.mf index 1210262421..8cf00c4efe 100644 --- a/mf/feta-braces-a.mf +++ b/mf/feta-braces-a.mf @@ -1,22 +1,5 @@ % Feta (not the Font-En-Tja) music font -- 256 smallest braces -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 1997--2012 Han-Wen Nienhuys -% -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . font_count := 0; -input feta-braces; +input feta-braces-generic; end. diff --git a/mf/feta-braces-b.mf b/mf/feta-braces-b.mf index df91510af7..c6a02a08e4 100644 --- a/mf/feta-braces-b.mf +++ b/mf/feta-braces-b.mf @@ -1,22 +1,5 @@ % Feta (not the Font-En-Tja) music font -- next 256 braces -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 1997--2012 Han-Wen Nienhuys -% -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . font_count := 1; -input feta-braces; +input feta-braces-generic; end. diff --git a/mf/feta-braces-c.mf b/mf/feta-braces-c.mf index 87fc66047d..591065d303 100644 --- a/mf/feta-braces-c.mf +++ b/mf/feta-braces-c.mf @@ -1,22 +1,5 @@ % Feta (not the Font-En-Tja) music font -- next 256 braces -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 1997--2012 Han-Wen Nienhuys -% -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . font_count := 2; -input feta-braces; +input feta-braces-generic; end. diff --git a/mf/feta-braces-d.mf b/mf/feta-braces-d.mf index ffad571c0c..a2ef2510a3 100644 --- a/mf/feta-braces-d.mf +++ b/mf/feta-braces-d.mf @@ -1,22 +1,5 @@ % Feta (not the Font-En-Tja) music font -- next 256 braces -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 1997--2012 Han-Wen Nienhuys -% -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . font_count := 3; -input feta-braces; +input feta-braces-generic; end. diff --git a/mf/feta-braces-e.mf b/mf/feta-braces-e.mf index a0b130bdad..dfdb94fd7e 100644 --- a/mf/feta-braces-e.mf +++ b/mf/feta-braces-e.mf @@ -1,22 +1,5 @@ % Feta (not the Font-En-Tja) music font -- next 256 braces -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 1997--2012 Han-Wen Nienhuys -% -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . font_count := 4; -input feta-braces; +input feta-braces-generic; end. diff --git a/mf/feta-braces-f.mf b/mf/feta-braces-f.mf index ad31d2bcc8..866c543539 100644 --- a/mf/feta-braces-f.mf +++ b/mf/feta-braces-f.mf @@ -1,22 +1,5 @@ % Feta (not the Font-En-Tja) music font -- next 256 braces -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 1997--2012 Han-Wen Nienhuys -% -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . font_count := 5; -input feta-braces; +input feta-braces-generic; end. diff --git a/mf/feta-braces-g.mf b/mf/feta-braces-g.mf index 545ca5a855..4347abe688 100644 --- a/mf/feta-braces-g.mf +++ b/mf/feta-braces-g.mf @@ -1,22 +1,5 @@ % Feta (not the Font-En-Tja) music font -- next 256 braces -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 1997--2012 Han-Wen Nienhuys -% -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . font_count := 6; -input feta-braces; +input feta-braces-generic; end. diff --git a/mf/feta-braces-generic.mf b/mf/feta-braces-generic.mf new file mode 100644 index 0000000000..c121936349 --- /dev/null +++ b/mf/feta-braces-generic.mf @@ -0,0 +1,47 @@ +% This file is part of LilyPond, the GNU music typesetter. +% +% Copyright (C) 1997--2015 Han-Wen Nienhuys +% Jan Nieuwenhuizen +% +% The LilyPond font is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version, or under the SIL Open Font License. + + +% We have to reduce the pixel-per-point value to +% support large brace glyphs in case we are using MetaPost +% (which by default sets `hppp' to 49.80244, regardless of +% the used `mag' value) + +if known miterlimit: + bpppix_ := 0.2; % ten times larger than original + + numeric mm, pt, dd, bp, cm, pc, cc, in; + + mm * bpppix_ = 2.83464; + pt * bpppix_ = 0.99626; + dd * bpppix_ = 1.06601; + bp * bpppix_ = 1; + cm * bpppix_ = 28.34645; + pc * bpppix_ = 11.95517; + cc * bpppix_ = 12.79213; + in * bpppix_ = 72; + + hppp := pt; + vppp := pt; +fi; + +design_size := 20; %% arbitrary + +input common-modules-and-initialization; + +% +% We must let the design increase for each font to make sure that mftrace +% doesn't jack up the resolution too highly for the longer braces. +% + +fet_beginfont ("feta-braces-" & char (97 + font_count), + (font_count + 1) * 20, "fetaBraces"); + input feta-braces; +fet_endfont ("feta-braces"); diff --git a/mf/feta-braces-h.mf b/mf/feta-braces-h.mf index 646e153106..dda3ce2069 100644 --- a/mf/feta-braces-h.mf +++ b/mf/feta-braces-h.mf @@ -1,22 +1,5 @@ % Feta (not the Font-En-Tja) music font -- next 256 braces -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 1997--2012 Han-Wen Nienhuys -% -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . font_count := 7; -input feta-braces; +input feta-braces-generic; end. diff --git a/mf/feta-braces-i.mf b/mf/feta-braces-i.mf index 0f3fcd3567..29d519112b 100644 --- a/mf/feta-braces-i.mf +++ b/mf/feta-braces-i.mf @@ -1,22 +1,5 @@ % Feta (not the Font-En-Tja) music font -- next 256 braces -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 1997--2012 Han-Wen Nienhuys -% -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . font_count := 8; -input feta-braces; +input feta-braces-generic; end. diff --git a/mf/feta-braces.mf b/mf/feta-braces.mf index c948f345fd..3fdfb12efb 100644 --- a/mf/feta-braces.mf +++ b/mf/feta-braces.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- Staff braces % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % Jan Nieuwenhuizen % % The LilyPond font is free software: you can redistribute it and/or modify @@ -17,49 +17,11 @@ % You should have received a copy of the GNU General Public License % along with LilyPond. If not, see . - -% We have to reduce the pixel-per-point value to -% support large brace glyphs in case we are using MetaPost -% (which by default sets `hppp' to 49.80244, regardless of -% the used `mag' value) - -if known miterlimit: - bpppix_ := 0.2; % ten times larger than original - - numeric mm, pt, dd, bp, cm, pc, cc, in; - - mm * bpppix_ = 2.83464; - pt * bpppix_ = 0.99626; - dd * bpppix_ = 1.06601; - bp * bpppix_ = 1; - cm * bpppix_ = 28.34645; - pc * bpppix_ = 11.95517; - cc * bpppix_ = 12.79213; - in * bpppix_ = 72; - - hppp := pt; - vppp := pt; -fi; - - -input feta-autometric; -input feta-macros; - -staffsize# := 20 pt#; %% arbitrary - -input feta-params; - % % We must let the design increase for each font to make sure that mftrace % doesn't jack up the resolution too highly for the longer braces. % -fet_beginfont ("feta-braces-" & char (97 + font_count), - (font_count + 1) * 20, "fetaBraces"); - -mode_setup; - - save code, braces_per_font; code := 64; braces_per_font := 64; @@ -160,5 +122,3 @@ for i := 0 step 1 until font_count: number := number + 1; endfor; endfor; - -fet_endfont ("feta-braces"); diff --git a/mf/feta-brackettips.mf b/mf/feta-brackettips.mf index d3b29cab54..cc6a363e21 100644 --- a/mf/feta-brackettips.mf +++ b/mf/feta-brackettips.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- bracket tips -*-Fundamental-*- % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2005--2012 Han-Wen Nienhuys +% Copyright (C) 2005--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/feta-clefs.mf b/mf/feta-clefs.mf index d76b341453..5014287429 100644 --- a/mf/feta-clefs.mf +++ b/mf/feta-clefs.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- implement Clefs -*-Fundamental-*- % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys , +% Copyright (C) 1997--2015 Han-Wen Nienhuys , % Jan Nieuwenhuizen , % Juergen Reuter % @@ -21,6 +21,65 @@ fet_begingroup ("clefs"); + +% +% New bulb routine: +% +% Insert a brushed piece of the path, and draw the rest of the bulb +% separately. +% +% The bulb has circular form. Neat merging of the bulb and brushed path +% is done by playing with tension. +% + +def new_bulb (expr start_point, start_angle, + outer_tangent_point, + end_point, end_angle, + big_radius, bulb_radius, flare, + direction, turning_dir) = +begingroup; + save pat, before, after; + save center; + save u, v; + path pat, before, after; + pair center; + + clearxy; + + center = outer_tangent_point + + big_radius * dir (0); +% + (big_radius - bulb_radius) * dir (-turning_dir * 90) + + z1' = center + bulb_radius * dir (turning_dir * 180); + z2' = outer_tangent_point + flare * dir (0); + z3' = center + bulb_radius * dir (0); + z4' = center + bulb_radius * dir (turning_dir * 90); + z5' = center - 0.5 [big_radius, bulb_radius] * dir (turning_dir * 90); + + labels (1', 2', 3', 4', 5'); + + before := z3'{dir (turning_dir * 90)} + .. z4'{-dir (0)} + ..tension 1.1.. z1'{-dir (turning_dir* 90)}; + after := z2'{dir (turning_dir * 90)} + .. end_point{dir (end_angle)}; + (u, v) = before intersectiontimes after; + + pat := start_point{dir (start_angle)} + .. outer_tangent_point{dir (-turning_dir * 90)} + ..tension 1.02.. z5'{dir (0)} + .. subpath (0, u) of before + .. subpath (v, infinity) of after; + + if direction = 0: + pat := reverse pat; + fi + +pat +endgroup +enddef; + + % % [Wanske] says the bulbs should be positioned about 1/4 right of the % `arrow'. @@ -105,7 +164,7 @@ def draw_c_clef (expr reduction) = % ugh, should be bulb, not flare? - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); enddef; @@ -118,65 +177,79 @@ fet_beginchar ("C clef", "C_change"); draw_c_clef (.8); fet_endchar; +def draw_varc_clef (expr reduction) = + save hair, norm, reduced_ss; + save thick, thin, upper_stroke; -% -% New bulb routine: -% -% Insert a brushed piece of the path, and draw the rest of the bulb -% separately. -% -% The bulb has circular form. Neat merging of the bulb and brushed path -% is done by playing with tension. -% + path upper_stroke; -def new_bulb (expr start_point, start_angle, - outer_tangent_point, - end_point, end_angle, - big_radius, bulb_radius, flare, - direction, turning_dir) = -begingroup; - save pat, before, after; - save center; - save u, v; - path pat, before, after; - pair center; + reduced_ss# = staff_space# * reduction; + norm# := 2/3 reduced_ss#; + hair# := 0.06 reduced_ss# + 0.5 linethickness#; + define_pixels (norm, reduced_ss); + define_whole_vertical_blacker_pixels (hair); - clearxy; + set_char_box (0, 2.25 reduced_ss#, 2 reduced_ss#, 2 reduced_ss#); - center = outer_tangent_point - + big_radius * dir (0); -% + (big_radius - bulb_radius) * dir (-turning_dir * 90) + % make unreduced glyph fit exactly into five staff lines + if reduction = 1: + h := d := 2 staff_space_rounded; + fi; - z1' = center + bulb_radius * dir (turning_dir * 180); - z2' = outer_tangent_point + flare * dir (0); - z3' = center + bulb_radius * dir (0); - z4' = center + bulb_radius * dir (turning_dir * 90); - z5' = center - 0.5 [big_radius, bulb_radius] * dir (turning_dir * 90); + % assure that the gap between the left and right stem + % has the same number of pixels as the thickness of the right + % stem + draw_block ((0, -d + feta_shift), + (3/4 norm + 1/2 hair, h)); + draw_block ((3/4 norm + 1/2 hair + hround (3/2 hair), -d + feta_shift), + (3/4 norm + 1/2 hair + 2 hround (3/2 hair), h)); - labels (1', 2', 3', 4', 5'); + % assure symmetry + h := h - feta_shift; - before := z3'{dir (turning_dir * 90)} - .. z4'{-dir (0)} - ..tension 1.1.. z1'{-dir (turning_dir* 90)}; - after := z2'{dir (turning_dir * 90)} - .. end_point{dir (end_angle)}; - (u, v) = before intersectiontimes after; + thin := hround (3/2 hair); + thick := hround (3/4 norm); - pat := start_point{dir (start_angle)} - .. outer_tangent_point{dir (-turning_dir * 90)} - ..tension 1.02.. z5'{dir (0)} - .. subpath (0, u) of before - .. subpath (v, infinity) of after; + x1'' = x8'' = x6'' - reduced_ss = 3/4 norm + 1/2 hair + 1.5 hround (3/2 hair); + x7'' = x6'' - 1/2 hair; + % the thick part of the c clef should be placed in the + % center of the forth staff space + y1'' = y2'' = 0.5 reduced_ss + thick/2; - if direction = 0: - pat := reverse pat; - fi + y7'' = y8'' = y6'' - 1/2 hair = y1'' - thick; -pat -endgroup + x2'' = x3'' = x4'' = x6'' - thin; + + y5'' = y3'' = y2'' + 0.6 reduced_ss; + x5'' = x6''; + + y4'' = 2.25 reduced_ss; + + upper_stroke := z1'' -- z2'' + -- new_bulb (z3'', 90, z4'', z5'', 270, + 0.37 reduced_ss, 0.33 reduced_ss, thin, 1, -1) + -- z6''{down} .. z7''{left} -- z8'' -- cycle; + + fill upper_stroke; + % the c clef parts should be symmetrical to the forth staff line + fill upper_stroke yscaled -1; + + penlabels (1'', 2'', 3'', 4'', 5'', 6'', 7'', 8''); + + draw_staff_if_debugging (-2, 2); enddef; +fet_beginchar ("Variant C clef", "varC"); + draw_varc_clef (1.0); +fet_endchar; + + +fet_beginchar ("Variant C clef", "varC_change"); + draw_varc_clef (0.8); +fet_endchar; + + % % There is some variation in the shape of bass clefs. % @@ -270,7 +343,7 @@ def draw_bass_clef (expr exact_center, reduction) = penlabels (1, 2, 3, 4, 5, 6); - draw_staff (-3, 1, 0); + draw_staff_if_debugging (-3, 1); enddef; @@ -302,14 +375,15 @@ fet_endchar; def debugfill = fill enddef; -def draw_gclef (expr reduction) = - save reduced_ss, downstroke_dir, downstroke_angle, center; +def draw_gclef (expr reduction, double_shift, extra_width) = + save reduced_ss, double_shift_ss, extra_width_ss; + save downstroke_dir, downstroke_angle, center; save breapth_factor, inner_thick_end, thinness, thickness, thinnib; save start_angle, inner_start_angle; save upward_swoosh_angle, bot_angle; - save pat; + save swirl, bulb, pat; save corr_angle, corr, left_, right_, up_, down_, bot_angle_; - path pat; + path swirl, bulb, pat; pair downstroke_dir, center; transform corr; pair left_, right_, up_, down_; @@ -337,7 +411,7 @@ def draw_gclef (expr reduction) = thinnib = thinness; - set_char_box (0, 1.71 * breapth_factor * reduced_ss#, + set_char_box (0, (1.71 * breapth_factor + double_shift + extra_width) * reduced_ss#, 2.55 * reduced_ss#, 4.8 * reduced_ss# / reduced_loop_correction); center := (breapth_factor * reduced_ss, 0); @@ -447,24 +521,25 @@ def draw_gclef (expr reduction) = .. z110l{down} .. z110'l; - fill z102l{right} - .. z103l - .. z104l{left_} - ..tension 1.07.. z105l{up_}% inside curve - .. z107l{up_} - ..tension 1.2.. z120r{curl 1} - .. {direction 0 of pat}z120l - -- z108 - -- z109r % {dir (downstroke_angle + 0)} - ..tension 0.8.. z107r{down_} - .. z105r{down_} - .. z104r{right_} - .. z103r - .. z102r{left_} - ..tension .95.. z101r - -- simple_serif (z101r, z101l, 80) - -- z101l - ..tension 0.85.. cycle; + swirl := z102l{right} + .. z103l + .. z104l{left_} + ..tension 1.07.. z105l{up_}% inside curve + .. z107l{up_} + ..tension 1.2.. z120r{curl 1} + .. {direction 0 of pat}z120l + -- z108 + -- z109r % {dir (downstroke_angle + 0)} + ..tension 0.8.. z107r{down_} + .. z105r{down_} + .. z104r{right_} + .. z103r + .. z102r{left_} + ..tension .95.. z101r + -- simple_serif (z101r, z101l, 80) + -- z101l + ..tension 0.85.. cycle; + fill swirl; penstroke z121e .. z110e{down_} @@ -474,27 +549,120 @@ def draw_gclef (expr reduction) = .. z111e{dir (-95 + corr_angle)} .. z112e{dir (bot_angle_)}; - fill new_bulb (z112r, bot_angle_, z113r, z112l, bot_angle_ + 180, - 0.45 reduced_ss, 0.38 reduced_ss, - thinnib + .05 staff_space, 1, -1) - -- cycle; + bulb := new_bulb (z112r, bot_angle_, z113r, z112l, bot_angle_ + 180, + 0.45 reduced_ss, 0.38 reduced_ss, + thinnib + .05 staff_space, 1, -1) + -- cycle; + + fill bulb; + + if double_shift <> 0: + addto currentpicture also + currentpicture shifted (double_shift * reduced_ss, 0); + fi; penlabels (range 101 thru 121); penlabels (110', 111'); - draw_staff (-1, 3, 0); + draw_staff_if_debugging (-1, 3); enddef; fet_beginchar ("G clef", "G"); - draw_gclef (1.0); + draw_gclef (1.0, 0, 0); fet_endchar; fet_beginchar ("G clef", "G_change"); - draw_gclef (0.8); + draw_gclef (0.8, 0, 0); +fet_endchar; + + +fet_beginchar ("double G clef", "GG"); + draw_gclef (1.0, 1.5, 0); +fet_endchar; + + +fet_beginchar ("double G clef", "GG_change"); + draw_gclef (0.8, 1.5, 0); fet_endchar; +def draw_tenor_extension (expr reduction) = + save reduced_ss, thick, thin, upper_stroke, ne_beam_dir, nw_dist; + path upper_stroke; + pair ne_beam_dir, nw_dist; + + reduced_ss# = staff_space# * reduction; + define_pixels (reduced_ss); + + thin := hround (0.17 reduced_ss); + thick := hround (0.51 reduced_ss); + + % the slanted left edge should protrude the g clef by a + % fixed amount relative to the width of the g clef: + x1'' = x6'' - 1.8 reduced_ss - 0.5 staff_space = 0.62 reduced_ss * reduction; + x8'' = x1'' - 2 thin; + x2'' = x3'' = x4'' = x6'' - thin; + x5'' = x6''; + x7'' = x6'' - 1/3 thin; + % the thick part of the c clef should be placed in the + % center of the forth staff space + y1'' = y2'' = 2.5 staff_space + thick/2; + y7'' = y8'' = y6'' - 1/3 thin = y1'' - thick; + y5'' = y3'' = y2'' + reduced_ss; + y4'' = 4.5 reduced_ss; + + upper_stroke := z2'' + -- new_bulb (z3'', 90, z4'', z5'', 270, + 0.35 reduced_ss, 0.22 reduced_ss, thin, 1, -1) + -- z6''{down} .. z7''{left}; + + % z1'' and z8'' are helper points that are responsible for + % hiding the lower left slant in the g clef's stroke + % z9'' and z10'' are computed to obtain nice rounded corners + + pickup pencircle scaled 2/3 thin; + lft x9'' = x1''; + lft x10'' = x8''; + + top y9'' = y1''; + bot y10'' = y8''; + + ne_beam_dir = unitvector (z9'' - z10''); + nw_dist = (ne_beam_dir rotated 90) * 1/3 thin; + + fill (z9''+nw_dist){ne_beam_dir} + ... top z9''{right} + -- upper_stroke + -- bot z10''{left} + ... (z10''+nw_dist){ne_beam_dir} + -- cycle; + + % the slanted edge of the lower hook must not be visible, so it is + % shifted accordingly in x direction; + z1''' = z1'' shifted (staff_space - 0.9 reduced_ss, - staff_space); + z8''' = z8'' shifted (staff_space - 0.9 reduced_ss, - staff_space); + + % the visible c clef parts should be symmetrical to the forth staff line + fill z1''' + -- reverse upper_stroke yscaled -1 shifted (0, 4 staff_space) + -- z8''' -- cycle; + + penlabels (1''',2'',3'',4'',5'',6'',7'',8''',9'',10''); + + draw_staff_if_debugging (-1, 3); +enddef; + +fet_beginchar ("Tenor G clef", "tenorG"); + draw_gclef (1.0, 0, 0.75); + draw_tenor_extension (1.0); +fet_endchar; + + +fet_beginchar ("Tenor G clef", "tenorG_change"); + draw_gclef (0.8, 0, 0.75); + draw_tenor_extension (0.8); +fet_endchar; %%%% % @@ -522,7 +690,7 @@ def draw_percussion_clef (expr reduction) = draw_block ((-b, -d), (-b + razt, h)); draw_block ((w - razt, -d), (w, h)); - draw_staff (-3, 1, 1); + draw_staff_if_debugging (-3, 1); enddef; @@ -535,6 +703,49 @@ fet_beginchar ("percussion clef (reduced)", "percussion_change"); draw_percussion_clef (.8); fet_endchar; +def draw_varpercussion_clef (expr reduction) = + save reduced_ss, thin, thick; + + reduced_ss# = staff_space# * reduction; + define_pixels (reduced_ss); + + set_char_box (-.67 reduced_ss#, 1.75 reduced_ss#, + 1.675 reduced_ss#, 1.675 reduced_ss#); + + thin := hround (0.175 reduced_ss); + thick := hround (0.35 reduced_ss); + + d := d - feta_shift; + + draw_block ((-b, -d), (-b + thin, h)); + draw_block ((w - thin, -d), (w, h)); + + pickup penrazor scaled thick rotated 90; + + top z1 = (-b + thin/2, h); + top z2 = (w - thin/2, h); + + bot z3 = (-b + thin/2, -d); + bot z4 = (w - thin/2, -d); + + draw z1 -- z2; + draw z3 -- z4; + + penlabels (range 1 thru 4); + + draw_staff_if_debugging (-3, 1); +enddef; + + +fet_beginchar ("variant percussion clef", "varpercussion"); + draw_varpercussion_clef (1.0); +fet_endchar; + + +fet_beginchar ("variant percussion clef (reduced)", "varpercussion_change"); + draw_varpercussion_clef (.8); +fet_endchar; + def draw_tab_T (expr pos, siz, slant) = begingroup; @@ -729,7 +940,7 @@ def draw_tab_clef (expr reduction) = draw_tab_B ((-b + .025 reduced_ss, -d), (2.1 reduced_ss, letterheight), 0.25); - draw_staff (-3, 2, 0.5); + draw_staff_if_debugging (-3, 2); enddef; diff --git a/mf/feta-dots.mf b/mf/feta-dots.mf index be38847a2c..7ec1d1b8c0 100644 --- a/mf/feta-dots.mf +++ b/mf/feta-dots.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- a duration dot % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/feta-dynamics.mf b/mf/feta-dynamics.mf index c1b7c43a6a..45b9f5ae8f 100644 --- a/mf/feta-dynamics.mf +++ b/mf/feta-dynamics.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- dynamic signs % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Jan Nieuwenhuizen +% Copyright (C) 1997--2015 Jan Nieuwenhuizen % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/feta-flags-generic.mf b/mf/feta-flags-generic.mf index 947cc8a35a..9277f7f547 100644 --- a/mf/feta-flags-generic.mf +++ b/mf/feta-flags-generic.mf @@ -1,46 +1,19 @@ -% Feta (not the Font-En-Tja) music font -- generic stuff: include lots of files, but don't % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . - - -if test = -1: - mode := smoke; -fi -staffsize# := design_size * pt#; -mode_setup; - -input feta-macros; - -input feta-params; +input common-modules-and-initialization; font_x_height staff_space#; fet_beginfont ("feta", design_size, "fetaMusic"); + input feta-flags; -input feta-flags; - -autometric_parameter ("staffsize", staffsize#); -autometric_parameter ("stafflinethickness", stafflinethickness#); -autometric_parameter ("staff_space", staff_space#); -autometric_parameter ("linethickness", linethickness#); -autometric_parameter ("black_notehead_width", black_notehead_width#); -autometric_parameter ("ledgerlinethickness", ledgerlinethickness#); -autometric_parameter ("blot_diameter", blot_diameter#); - + input declare-autometric-parameters; fet_endfont; diff --git a/mf/feta-flags.mf b/mf/feta-flags.mf index 2cd890f3b0..b7fe2f0951 100644 --- a/mf/feta-flags.mf +++ b/mf/feta-flags.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- draw flags % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by @@ -554,7 +554,7 @@ fet_endchar; %%%%%%%% % -% Single Stroke for Short Appogiatura +% Single Stroke for Short Appoggiatura % fet_beginchar ("grace dash (up)", "ugrace"); diff --git a/mf/feta-flags11.mf b/mf/feta-flags11.mf index 30cd7f0976..8026bf499d 100644 --- a/mf/feta-flags11.mf +++ b/mf/feta-flags11.mf @@ -1,13 +1,5 @@ -% feta-flags11.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 11.22; -test := 0; - - input feta-flags-generic; - end. - diff --git a/mf/feta-flags13.mf b/mf/feta-flags13.mf index 3210b1abc1..51e508fee3 100644 --- a/mf/feta-flags13.mf +++ b/mf/feta-flags13.mf @@ -1,13 +1,5 @@ -% feta-flags13.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 12.60; -test := 0; - - input feta-flags-generic; - end. - diff --git a/mf/feta-flags14.mf b/mf/feta-flags14.mf index 9a5449cc5d..22055a8cc2 100644 --- a/mf/feta-flags14.mf +++ b/mf/feta-flags14.mf @@ -1,13 +1,5 @@ -% feta-flags14.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 14.14; -test := 0; - - input feta-flags-generic; - end. - diff --git a/mf/feta-flags16.mf b/mf/feta-flags16.mf index d02993736a..3e706e7d23 100644 --- a/mf/feta-flags16.mf +++ b/mf/feta-flags16.mf @@ -1,13 +1,5 @@ -% feta-flags16.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 15.87; -test := 0; - - input feta-flags-generic; - end. - diff --git a/mf/feta-flags18.mf b/mf/feta-flags18.mf index dcaefd440d..a15fea7560 100644 --- a/mf/feta-flags18.mf +++ b/mf/feta-flags18.mf @@ -1,13 +1,5 @@ -% feta-flags18.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 17.82; -test := 0; - - input feta-flags-generic; - end. - diff --git a/mf/feta-flags20.mf b/mf/feta-flags20.mf index b7b834ecc4..9eedbeb78d 100644 --- a/mf/feta-flags20.mf +++ b/mf/feta-flags20.mf @@ -1,13 +1,5 @@ -% feta-flags20.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 20; -test := 0; - - input feta-flags-generic; - end. - diff --git a/mf/feta-flags23.mf b/mf/feta-flags23.mf index dcd640c8a9..1500a15110 100644 --- a/mf/feta-flags23.mf +++ b/mf/feta-flags23.mf @@ -1,13 +1,5 @@ -% feta-flags23.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 22.45; -test := 0; - - input feta-flags-generic; - end. - diff --git a/mf/feta-flags26.mf b/mf/feta-flags26.mf index b2a1fe616f..322213b562 100644 --- a/mf/feta-flags26.mf +++ b/mf/feta-flags26.mf @@ -1,13 +1,5 @@ -% feta-flags26.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 25.20; -test := 0; - - input feta-flags-generic; - end. - diff --git a/mf/feta-flats.mf b/mf/feta-flats.mf new file mode 100644 index 0000000000..b7470e2fec --- /dev/null +++ b/mf/feta-flats.mf @@ -0,0 +1,535 @@ + +% +% Dedicated to my mom. (3/10/97) +% +% Mamma, ik hou van je; kom je alsjeblieft terug? +% -- HW +% +% +% TODO: remove crook_fatness +% TODO: document, simplify! +% + +def draw_meta_flat (expr xcenter, w, crook_fatness, arrowup, arrowdown) = + save crook_thinness; + save bottom_overshoot, bot_crook_dir; + save top_stem_thick, top_stem_thick_orig; + save bottom_stem_thick, hair, smaller_hole; + save top_crook_thinness; + save zwiep; + save center; + pair center, bot_crook_dir; + save clearing, clearing_orig; + + clearxy; + + % the stem shouldn't reach the top staff line. + %% TODO: should take from height. + % + % TODO: parameterize this + % + if w >= 0.75 staff_space: + smaller_hole = 0.35 stafflinethickness; + else: + smaller_hole = 0; + fi; + crook_thinness = .7 stafflinethickness + .06 staff_space; + top_crook_thinness = 1 stafflinethickness + .065 staff_space; + clearing = 1.7 stafflinethickness; + clearing_orig = clearing; + if arrowup: + clearing := 0.5 staff_space; + fi; + bottom_overshoot = stafflinethickness; + + bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#; + top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#; + top_stem_thick_orig# = top_stem_thick#; + if arrowup: + % to look nice, arrowed stems should be less brushed + top_stem_thick# := top_stem_thick# * 0.8; + fi; + define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick, + top_stem_thick_orig); + + if odd (top_stem_thick - bottom_stem_thick): + top_stem_thick := top_stem_thick - 1; + fi; + if odd (top_stem_thick_orig - bottom_stem_thick): + top_stem_thick_orig := top_stem_thick_orig - 1; + fi; + + center = (xcenter, 0); + + x1l = hround (xcenter - .5 top_stem_thick); + y1 = vround (2 staff_space - clearing); + x2l = hround (xcenter - .5 bottom_stem_thick); + y2 = -.5 staff_space - .5 stafflinethickness; + % z16 and the `*_orig' variables are needed for arrowed accidentals + % because their inner part should be unchanged from plain ones but + % the points z3l, z3r, and z10 depend on values that are different + % for arrowed accidentals + x16l = hround (xcenter -.5 top_stem_thick_orig); + y16 = vround (2 staff_space - clearing_orig); + + penpos1 (top_stem_thick, 0); + penpos16 (top_stem_thick_orig, 0); + penpos2 (bottom_stem_thick, 0); + + y3l = vfloor ((staff_space - stafflinethickness) / 2); + z3l = whatever [z2r, z1r]; + z3r = .3 [z2r, + (z16r shifted (0, clearing_orig - 1.7 stafflinethickness))] + + (smaller_hole, 0); + x3r := hceiling x3r; + + % we insert z3l to get better conversion with mf2pt1 + fill simple_serif (z1r, z1l, 30) + -- z2l + -- z2r + -- z3l + -- cycle; + + z10 = whatever [z2r, z16r] + (smaller_hole, 0); + y10 = -1/10 staff_space; + x10 := hceiling x10; + + x11 = xcenter + bottom_overshoot / 3; + y11 = -vround (.5 (staff_space + stafflinethickness) + + bottom_overshoot); + + x2a = 0.2[x2r, x7]; + y2a = 1.5[y2, y11]; + + penpos4 (whatever, 53); + + y4l - y4r = top_crook_thinness; + y5r = .15 staff_space; + x5l = hround (w + xcenter); + y4 = staff_space / 2; + x4r = .45 [x5r, x3r]; + y4l := vround y4l; + + penpos5 (crook_fatness, -175); + + bot_crook_dir = unitvector ((x5l, 0) - z11); + z8 = z11 + whatever * bot_crook_dir; + y8 = -staff_space / 2; + + z7 = z8 + + whatever * bot_crook_dir + + crook_thinness * (bot_crook_dir rotated 90); + x7 = .1 [x3r, x8]; + + unfill z3r{z3r - z10} + .. z4r{right} + .. z5r{down} + .. z7{-bot_crook_dir} + & z7 + .. z10{z3r - z10} + -- cycle; + + if arrowdown: + fill z2l{down} + .. z2a{up} + .. z8{bot_crook_dir} + .. z5l{up} + .. z4l{left} + .. z3l + -- cycle; + else: + fill z2l{down} + .. z11{right} + .. z8{bot_crook_dir} + .. z5l{up} + .. z4l{left} + .. z3l + -- cycle; + fi; + + if arrowup: + draw_arrow (z1, top_stem_thick, z1l - z2l, + 0.5 stafflinethickness, false); + fi; + if arrowdown: + draw_arrow ((0.5 [x2l, x2a], y2), x2a - x2l, up, + staff_space / 2, true); + fi; +enddef; + + +def draw_arrowed_meta_flat (expr xcenter, width, crook_fatness, + arrowup, arrowdown) = + save depth, height, extendleft; + + depth# = 0.6 staff_space#; + height# = 1.9 staff_space#; + extendleft# := 1.2 stafflinethickness#; + if arrowup: + extendleft# := 3.45 stafflinethickness#; + height# := height# + 0.8 staff_space#; + fi; + if arrowdown: + extendleft# := 3.45 stafflinethickness#; + depth# := depth# + 1.6 staff_space#; + fi; + + set_char_box (extendleft#, width, depth#, height#); + draw_meta_flat(xcenter, w, crook_fatness, arrowup, arrowdown); +enddef; + +% +% unfortunately, 600dpi is not enough to show the brush of the stem. +% + +fet_beginchar ("Flat", "flat"); + draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space, + false, false); + penlabels (range 0 thru 11); + + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("Arrowed Flat (arrow up)", "flat.arrowup"); + draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space, + true, false); + penlabels (range 0 thru 23); + + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("Arrowed Flat (arrow down)", "flat.arrowdown"); + draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space, + false, true); + penlabels (range 0 thru 23); + + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("Arrowed Flat (arrow up and down)", "flat.arrowboth"); + draw_arrowed_meta_flat (0, 0.8 staff_space#, 0.31 staff_space, + true, true); + penlabels (range 0 thru 23); + + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("Flat (slashed)", "flat.slash"); + set_char_box (.4 staff_space#, .8 staff_space#, + 0.6 staff_space#, 1.9 staff_space#); + + draw_meta_flat (0, w, 0.31 staff_space, false, false); + + clearxy; + + save slope, slash_width; + slope = 0.5; + slash_width = w; + + z11 = (0, h / 2); + z12 = z11 - (slash_width, slash_width * slope) / 2; + z13 = z11 + (slash_width, slash_width * slope) / 2; + penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90); + penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90); + + z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12); + z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12); + + fill z13r + .. z15 + .. z13l + -- z12l + .. z14 + .. z12r + -- z13r + .. cycle; + + penlabels (12, 13); + labels (14, 15); + + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("Flat (slashed twice)", "flat.slashslash"); + set_char_box (.4 staff_space#, .8 staff_space#, + 0.6 staff_space#, 1.9 staff_space#); + + draw_meta_flat (0, w, 0.31 staff_space, false, false); + + clearxy; + + save slope, slash_width; + slope = 0.5; + slash_width = w; + + z11 = (0, 5/12 h); + z12 = z11 - (slash_width, slash_width * slope) / 2; + z13 = z11 + (slash_width, slash_width * slope) / 2; + penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90); + penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90); + + z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12); + z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12); + + fill z13r + .. z15 + .. z13l + -- z12l + .. z14 + .. z12r + -- z13r + .. cycle; + + penlabels (12, 13); + labels (14, 15); + + z21 = (0, 2/3 h); + z22 = z21 - (slash_width, slash_width * slope) / 2; + z23 = z21 + (slash_width, slash_width * slope) / 2; + penpos22 (1.5 stafflinethickness, angle (z23 - z22) - 90); + penpos23 (1.5 stafflinethickness, angle (z23 - z22) - 90); + + z24 = z22 - .75 stafflinethickness * unitvector (z23 - z22); + z25 = z23 + .75 stafflinethickness * unitvector (z23 - z22); + + fill z23r + .. z25 + .. z23l + -- z22l + .. z24 + .. z22r + -- z23r + .. cycle; + + penlabels (22, 23); + labels (24, 25); + + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("Flatflat (mirrored)", "mirroredflat.flat"); + set_char_box (0, 1.6 staff_space#, + 0.6 staff_space#, 1.9 staff_space#); + + % This is a modified version of `draw_meta_flat'. + + save crook_thinness, crook_fatness; + save bottom_overshoot, bot_crook_dir; + save top_stem_thick, bottom_stem_thick, hair, smaller_hole; + save top_crook_thinness; + save zwiep; + save center; + pair center, bot_crook_dir; + save clearing, wid; + save pat; + path pat; + + clearxy; + + wid = w / 2; + + % the stem shouldn't reach the top staff line. + %% TODO: should take from height. + % + % TODO: parameterize this + % + if wid >= 0.75 staff_space: + smaller_hole = 0.35 stafflinethickness; + else: + smaller_hole = 0; + fi; + clearing = 1.7 stafflinethickness; + crook_thinness = .7 stafflinethickness + .06 staff_space; + crook_fatness = 0.31 staff_space; + top_crook_thinness = 1 stafflinethickness + .065 staff_space; + bottom_overshoot = stafflinethickness; + + bottom_stem_thick# = 0.06 staff_space# + 0.6 stafflinethickness#; + top_stem_thick# = 0.1 staff_space# + 1.2 stafflinethickness#; + define_whole_blacker_pixels (bottom_stem_thick, top_stem_thick); + + if odd (top_stem_thick - bottom_stem_thick): + top_stem_thick := top_stem_thick - 1; + fi; + + center = (0, 0); + + x1l = hround (-.5 top_stem_thick); + y1 = vround (2 staff_space - clearing); + x2l = hround (-.5 bottom_stem_thick); + y2 = -.5 staff_space - .5 stafflinethickness; + + penpos1 (top_stem_thick, 0); + penpos2 (bottom_stem_thick, 0); + + y3l = vfloor ((staff_space - stafflinethickness) / 2); + z3l = whatever [z2r, z1r]; + z3r = .3 [z2r, z1r] + (smaller_hole, 0); + x3r := hceiling x3r; + + z10 = whatever [z2r, z1r] + (smaller_hole, 0); + y10 = -1/10 staff_space; + x10 := hceiling x10; + + x11 = bottom_overshoot / 3; + y11 = -vround (.5 (staff_space + stafflinethickness) + + bottom_overshoot); + + penpos4 (whatever, 53); + + y4l - y4r = top_crook_thinness; + y5r = .15 staff_space; + x5l = hround (wid); + y4 = staff_space / 2; + x4r = .45 [x5r, x3r]; + y4l := vround y4l; + + penpos5 (crook_fatness, -175); + + bot_crook_dir = unitvector ((x5l, 0) - z11); + z8 = z11 + whatever * bot_crook_dir; + y8 = -staff_space / 2; + + z7 = z8 + + whatever * bot_crook_dir + + crook_thinness * (bot_crook_dir rotated 90); + x7 = .1 [x3r, x8]; + + pat := z3r{z3r - z10} + .. z4r{right} + .. z5r{down} + .. z7{-bot_crook_dir} + & z7 + .. z10{z3r - z10} + -- cycle; + unfill pat; + unfill pat xscaled -1; + + pat := z11{right} + .. z8{bot_crook_dir} + .. z5l{up} + .. z4l{left} + .. z3l; + fill pat + -- simple_serif (z1r, z1l, 30) + -- reverse pat xscaled -1 shifted (-feta_eps, 0) + -- cycle; + + currentpicture := currentpicture shifted (w/2, 0); + + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("Semi flat", "mirroredflat"); + set_char_box (1.2 stafflinethickness#, .8 staff_space#, + 0.6 staff_space#, 1.9 staff_space#); + + draw_meta_flat (0, w, 0.31 staff_space, false, false); + currentpicture := currentpicture xscaled -1 shifted (w - b, 0); +fet_endchar; + + +fet_beginchar ("Semi flat", "mirroredflat.backslash"); + set_char_box (.4 staff_space#, .8 staff_space#, + 0.6 staff_space#, 1.9 staff_space#); + + draw_meta_flat (0, w, 0.31 staff_space, false, false); + + clearxy; + + save slope, slash_width; + slope = 0.5; + slash_width = w; + + z11 = (0, h / 2); + z12 = z11 - (slash_width, slash_width * slope) / 2; + z13 = z11 + (slash_width, slash_width * slope) / 2; + penpos12 (1.5 stafflinethickness, angle (z13 - z12) - 90); + penpos13 (1.5 stafflinethickness, angle (z13 - z12) - 90); + + z14 = z12 - .75 stafflinethickness * unitvector (z13 - z12); + z15 = z13 + .75 stafflinethickness * unitvector (z13 - z12); + + fill z13r + .. z15 + .. z13l + -- z12l + .. z14 + .. z12r + -- z13r + .. cycle; + + currentpicture := currentpicture xscaled -1 shifted (w - b, 0); + + labels (1, 2, 3); +fet_endchar; + + +fet_beginchar ("Double Flat", "flatflat"); + save left_wid, overlap, right_wid; + + left_wid = .7; + right_wid = .8; + overlap = .05; + + set_char_box (1.2 stafflinethickness#, + (left_wid + right_wid - overlap) * staff_space#, + .6 staff_space#, 1.9 staff_space#); + draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space, + false, false); + draw_meta_flat (hround ((left_wid - overlap) * staff_space), + right_wid * staff_space, 1/3 staff_space, + false, false); +fet_endchar; + + +fet_beginchar ("3/4 Flat", "flatflat.slash"); + save left_wid, overlap, right_wid; + + left_wid = .7; + right_wid = .8; + overlap = .05; + + set_char_box (1.2 stafflinethickness#, + (left_wid + right_wid - overlap) * staff_space#, + .6 staff_space#, 1.9 staff_space#); + draw_meta_flat (0, left_wid * staff_space, 1/3 staff_space, + false, false); + draw_meta_flat (hround ((left_wid - overlap) * staff_space), + right_wid * staff_space, 1/3 staff_space, + false, false); + + %% maybe we should clip part of the stems? + %% or make the 1st flat smaller? + %% or reverse it? + pickup pencircle scaled 2 stafflinethickness; + + z12 = round (-.25 w - b, .55 staff_space) + feta_offset; + z13 = round (.75 w, 1.45 staff_space) + feta_offset; + penpos12 (2 stafflinethickness, angle (z13 - z12) - 90); + penpos13 (2 stafflinethickness, angle (z13 - z12) - 90); + + z14 = z12 - stafflinethickness * unitvector (z13 - z12); + z15 = z13 + stafflinethickness * unitvector (z13 - z12); + + fill z13r + .. z15 + .. z13l + -- z12l + .. z14 + .. z12r + -- z13r + .. cycle; + + penlabels (12, 13); + labels (14, 15); + + draw_staff_if_debugging (-2, 2); +fet_endchar; diff --git a/mf/feta-generic.mf b/mf/feta-generic.mf deleted file mode 100644 index 0d253ce653..0000000000 --- a/mf/feta-generic.mf +++ /dev/null @@ -1,60 +0,0 @@ -% Feta (not the Font-En-Tja) music font -- generic stuff: include lots of files, but don't -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 1997--2012 Han-Wen Nienhuys -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . - - -if test = -1: - mode := smoke; -fi - -staffsize# := design_size * pt#; - -mode_setup; - -input feta-macros; - -input feta-params; - -font_x_height staff_space#; - -fet_beginfont ("feta", design_size, "fetaMusic"); - -if test = 0: - input feta-rests; - input feta-accidentals; - input feta-arrowheads; - input feta-dots; - input feta-scripts; - input feta-clefs; - input feta-timesignatures; - input feta-pedals; - input feta-brackettips; - input feta-accordion; - input feta-ties; -else: - input feta-test-generic.mf; -fi - -autometric_parameter ("staffsize", staffsize#); -autometric_parameter ("stafflinethickness", stafflinethickness#); -autometric_parameter ("staff_space", staff_space#); -autometric_parameter ("linethickness", linethickness#); -autometric_parameter ("black_notehead_width", black_notehead_width#); -autometric_parameter ("ledgerlinethickness", ledgerlinethickness#); -autometric_parameter ("blot_diameter", blot_diameter#); - -fet_endfont; diff --git a/mf/feta-macros.mf b/mf/feta-macros.mf index c464c3f7f8..89458e3c3d 100644 --- a/mf/feta-macros.mf +++ b/mf/feta-macros.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- auxiliary macros for both feta and parmesan fonts % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by @@ -21,6 +21,7 @@ % debugging % + def print_penpos (suffix $) = message "z" & str$ & "l = (" & decimal x.$.l & ", " &decimal y.$.l & ");" @@ -50,15 +51,15 @@ def treq = enddef; -def draw_staff (expr first, last, offset) = +def draw_staff_if_debugging (expr first, last) = if test <> 0: pickup pencircle scaled stafflinethickness; for i := first step 1 until last: draw (-staff_space, - (i + offset) * staff_space_rounded) + (i + stafflines_y_offset) * staff_space_rounded) -- (4 staff_space, - (i + offset) * staff_space_rounded); + (i + stafflines_y_offset) * staff_space_rounded); endfor; fi; enddef; diff --git a/mf/feta-naturals.mf b/mf/feta-naturals.mf new file mode 100644 index 0000000000..3c824c78c9 --- /dev/null +++ b/mf/feta-naturals.mf @@ -0,0 +1,163 @@ + +% +% The stems of the natural are brushed (at least, in Barenreiter SCS) +% + +% general parameters: +save full_width, full_height; +save stem_thickness, stem_end_thickness_multiplier; +save beam_thickness, beam_slant, hole_highest_point; + +full_height# := 3 staff_space#; +full_width# := 2/3 staff_space#; +stem_thickness# := 0.09 staff_space# + 0.5 stafflinethickness#; +stem_end_thickness_multiplier := 10/7; +beam_slant := 1.266 stafflinethickness; +beam_thickness := 0.485 staff_space - stafflinethickness; +hole_highest_point := 0.5 (staff_space - stafflinethickness); + + +def draw_natural (expr arrowup, arrowdown) = + save upstem_factor, downstem_factor; + save upstem_end_thickness, downstem_end_thickness; + save half_height, half_box_height; + save beam_direction, r_stem_top_path, l_stem_bottom_path; + pair beam_direction; + path r_stem_top_path, l_stem_bottom_path; + + upstem_factor = downstem_factor = stem_end_thickness_multiplier; + + half_height# := 0.5 full_height#; + define_pixels (half_height); + define_pixels (full_width); + + set_char_box (0, full_width#, half_height#, half_height#); + d := d - feta_space_shift; + + if arrowup: + b := b + 3 stafflinethickness; + h := h + 1.2 staff_space; + % to look nice, arrowed stems must be less brushed + upstem_factor := 0.5 (1 + upstem_factor); + fi; + if arrowdown: + w := w + 3 stafflinethickness; + d := d + 1.2 staff_space; + % to look nice, arrowed stems must be less brushed + downstem_factor := 0.5 (1 + downstem_factor); + fi; + + upstem_end_thickness# = upstem_factor * stem_thickness#; + downstem_end_thickness# = downstem_factor * stem_thickness#; + define_whole_blacker_pixels (upstem_end_thickness, downstem_end_thickness); + define_whole_blacker_pixels (stem_thickness); + + half_box_height := hole_highest_point + beam_thickness + %% correction for the fact that x11 != x12. + %% ideally y2 should be calculated from y11 + %% and beam_thickness, but the brushed stems + %% would cause a cyclic dependency: + %% y2 -> x11 -> y14 -> y13 -> y12 -> y2 + + 0.5 stem_thickness * beam_slant / full_width; + + %% stems: + + pickup pencircle scaled stem_thickness; + + penpos1 (upstem_end_thickness, 0); + penpos3 (downstem_end_thickness, 0); + penpos2 (stem_thickness, 0); + penpos4 (stem_thickness, 0); + + x2r = full_width; + x4l = 0; + x3 = x2; + x1 = x4; + + y1 = half_height; + y3 = -half_height; + top y2 = vround (half_box_height); + y4 = -y2 + feta_space_shift; + + l_stem_bottom_path := z4r{z4r - z1r} + .. bot z4 + .. z4l{z1l - z4l}; + + r_stem_top_path := z2r{z2r - z3r} + .. top z2 + .. z2l{z3l - z2l}; + + fill simple_serif (z1l, z1r, -30) + -- l_stem_bottom_path + -- cycle; + + fill simple_serif (z3l, z3r, 30) + -- r_stem_top_path + -- cycle; + + %% beams: + + beam_direction = (full_width, beam_slant); + + z11 = z3l + whatever * (z2l - z3l); + y11 = vround (hole_highest_point); + z12 = directionpoint -beam_direction of r_stem_top_path; + z13 = z12 + whatever * beam_direction; + x13 = x1; + z14 = z11 + whatever * beam_direction; + x14 = x1; + + z21 = z4r + whatever * (z1r - z4r); + y21 = -y11 + feta_space_shift; + z22 = directionpoint -beam_direction of l_stem_bottom_path; + z23 = z22 + whatever * beam_direction; + x23 = x3; + z24 = z21 + whatever * beam_direction; + x24 = x3; + + fill z11 + -- z12 + -- z13 + -- z14 + -- cycle; + + fill z21 + -- z22 + -- z23 + -- z24 + -- cycle; + + if arrowup: + draw_arrow (z1, upstem_end_thickness, + z1l - z4l, stafflinethickness / 2, false); + fi; + if arrowdown: + draw_arrow (z3, downstem_end_thickness, + z2r - z3r, stafflinethickness / 2, true); + fi; + + %% debugging: + penlabels (1, 2, 3, 4); + labels (11, 12, 13, 14, 21, 22, 23, 24); + draw_staff_if_debugging (-2, 2); +enddef; + + +fet_beginchar ("Natural", "natural"); + draw_natural (false, false); +fet_endchar; + + +fet_beginchar ("Arrowed Natural (arrow up)", "natural.arrowup"); + draw_natural (true, false); +fet_endchar; + + +fet_beginchar ("Arrowed Natural (arrow down)", "natural.arrowdown"); + draw_natural (false, true); +fet_endchar; + + +fet_beginchar ("Arrowed Natural (arrows up and down)", "natural.arrowboth"); + draw_natural (true, true); +fet_endchar; diff --git a/mf/feta-noteheads-generic.mf b/mf/feta-noteheads-generic.mf index 3c255073c8..f75290b2bc 100644 --- a/mf/feta-noteheads-generic.mf +++ b/mf/feta-noteheads-generic.mf @@ -1,46 +1,19 @@ -% Feta (not the Font-En-Tja) music font -- generic stuff: include lots of files, but don't % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . - - -if test = -1: - mode := smoke; -fi -staffsize# := design_size * pt#; -mode_setup; - -input feta-macros; - -input feta-params; +input common-modules-and-initialization; font_x_height staff_space#; fet_beginfont ("feta", design_size, "fetaMusic"); + input feta-noteheads; -input feta-noteheads; - -autometric_parameter ("staffsize", staffsize#); -autometric_parameter ("stafflinethickness", stafflinethickness#); -autometric_parameter ("staff_space", staff_space#); -autometric_parameter ("linethickness", linethickness#); -autometric_parameter ("black_notehead_width", black_notehead_width#); -autometric_parameter ("ledgerlinethickness", ledgerlinethickness#); -autometric_parameter ("blot_diameter", blot_diameter#); - + input declare-autometric-parameters; fet_endfont; diff --git a/mf/feta-noteheads.mf b/mf/feta-noteheads.mf index 82abf14e54..8f4cad6e34 100644 --- a/mf/feta-noteheads.mf +++ b/mf/feta-noteheads.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- implement noteheads % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Jan Nieuwenhuizen +% Copyright (C) 1997--2015 Jan Nieuwenhuizen % & Han-Wen Nienhuys % & Juergen Reuter % @@ -21,16 +21,11 @@ test_outlines := 0; -save remember_pic; -picture remember_pic; - - % Most beautiful noteheads are pronounced, not circular, % and not even symmetric. % These examples are inspired by [Wanske]; see literature list. - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % NOTE HEAD VARIABLES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -159,33 +154,17 @@ enddef; fet_beginchar ("Longa notehead", "uM2"); draw_longa (true); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; fet_beginchar ("Longa notehead", "dM2"); draw_longa (false); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Longa notehead", "uM2"); - draw_longa (true); - - draw_staff (-2, 2, 0.5); - fet_endchar; - - - fet_beginchar ("Longa notehead", "dM2"); - draw_longa (false); - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - def draw_brevis (expr linecount, line_thickness_multiplier) = save stemthick, fudge, gap; @@ -253,35 +232,17 @@ enddef; fet_beginchar ("Brevis notehead", "sM1"); draw_brevis (1, 1); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Brevis notehead", "sM1"); - draw_brevis(1, 1); - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - fet_beginchar ("Double-lined brevis notehead", "sM1double"); draw_brevis (2, 0.8); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Double-lined brevis notehead", "sM1double"); - draw_brevis (2, 0.8); - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - fet_beginchar ("Whole notehead", "s0"); draw_outside_ellipse (1.80 - puff_up_factor / 3.0, 0, 0.707, 0); undraw_inside_ellipse (1.30, 125 - puff_up_factor * 10, @@ -289,60 +250,26 @@ fet_beginchar ("Whole notehead", "s0"); whole_notehead_width# := charwd; - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Whole notehead", "s0"); - draw_outside_ellipse (1.80 - puff_up_factor / 3.0, 0, - 0.707, 0); - undraw_inside_ellipse (1.30, 125 - puff_up_factor * 10, - 0.68, 2 stafflinethickness#); - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - fet_beginchar ("Half notehead", "s1"); draw_outside_ellipse (1.53 - puff_up_factor / 3.0, 34, 0.66, 0.17); undraw_inside_ellipse (3.25, 33, 0.81, 2.5 stafflinethickness#); half_notehead_width# := charwd; - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Half notehead", "s1"); - draw_outside_ellipse (1.53 - puff_up_factor / 3.0, 34, - 0.66, 0.17); - undraw_inside_ellipse (3.25, 33, 0.81, - 2.5 stafflinethickness#); - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - fet_beginchar ("Quarter notehead", "s2"); draw_quarter_path; - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Quarter notehead", "s2"); - draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31, - 0.707, 0); - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -351,58 +278,26 @@ fet_beginchar ("Whole diamondhead", "s0diamond"); undraw_inside_ellipse (1.30, 125, 0.6, .4 staff_space# + stafflinethickness#); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Whole diamondhead", "s0diamond"); - draw_outside_ellipse (1.80, 0, 0.495, 0); - undraw_inside_ellipse (1.30, 125, 0.6, - .4 staff_space# + stafflinethickness#); - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - fet_beginchar ("Half diamondhead", "s1diamond"); draw_outside_ellipse (1.50, 34, 0.49, 0.17); undraw_inside_ellipse (3.5, 33, 0.80, .3 staff_space# + 1.5 stafflinethickness#); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Half diamondhead", "s1diamond"); - draw_outside_ellipse (1.50, 34, 0.49, 0.17); - undraw_inside_ellipse (3.5, 33, 0.80, - .3 staff_space# - + 1.5 stafflinethickness#); - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - fet_beginchar ("Quarter diamondhead", "s2diamond"); draw_outside_ellipse (1.80, 35, 0.495, -0.25); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Quarter diamondhead", "s2diamond"); - draw_outside_ellipse (1.80, 35, 0.495, -0.25); - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -561,19 +456,10 @@ enddef; fet_beginchar ("Whole trianglehead", "s0triangle"); draw_whole_triangle_head; - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Whole trianglehead", "s0triangle"); - draw_whole_triangle_head; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - def draw_small_triangle_head (expr dir) = save hei, xs; save llap; @@ -595,14 +481,14 @@ enddef; fet_beginchar ("Half trianglehead (downstem)", "d1triangle"); draw_small_triangle_head (-1); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; fet_beginchar ("Half trianglehead (upstem)", "u1triangle"); draw_small_triangle_head (1); - draw_staff (-2, 2, 0.5); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -623,14 +509,14 @@ enddef; fet_beginchar ("Quarter trianglehead (upstem)", "u2triangle"); draw_closed_triangle_head (1); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; fet_beginchar ("Quarter trianglehead (downstem)", "d2triangle"); draw_closed_triangle_head (-1); - draw_staff (-2, 2, 0.5); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -707,21 +593,21 @@ enddef; fet_beginchar ("Whole slashhead", "s0slash"); draw_slash (4 slash_thick# + 0.5 staff_space#); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; fet_beginchar ("Half slashhead", "s1slash"); draw_slash (3.0 slash_thick# + 0.15 staff_space#); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; fet_beginchar ("Quarter slashhead", "s2slash"); draw_slash (1.5 slash_thick#); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -835,28 +721,10 @@ fet_beginchar ("Whole Crossed notehead", "s0cross"); draw_cross (3.75); - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Whole Crossed notehead", "s0cross"); - save wid, hei; - - wid# := black_notehead_width# + 4 stafflinethickness#; - hei# := noteheight# + stafflinethickness#; - - set_char_box (0, wid#, hei# / 2, hei# / 2); - - currentpicture := remember_pic; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - fet_beginchar ("Half Crossed notehead", "s1cross"); save wid, hei; @@ -867,28 +735,10 @@ fet_beginchar ("Half Crossed notehead", "s1cross"); draw_cross (3.0); - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Half Crossed notehead", "s1cross"); - save wid, hei; - - wid# := black_notehead_width# + 2 stafflinethickness#; - hei# := noteheight# + stafflinethickness# / 2; - - set_char_box (0, wid#, hei# / 2, hei# / 2); - - currentpicture := remember_pic; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - fet_beginchar ("Crossed notehead", "s2cross"); wid# := black_notehead_width#; hei# := noteheight#; @@ -896,25 +746,10 @@ fet_beginchar ("Crossed notehead", "s2cross"); draw_cross (1.0); - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("Crossed notehead", "s2cross"); - wid# := black_notehead_width#; - hei# := noteheight#; - set_char_box (0, wid#, hei# / 2, hei# / 2); - - currentpicture := remember_pic; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - fet_beginchar ("X-Circled notehead", "s2xcircle"); save wid, hei; save cthick, cxd, cyd, dy; @@ -960,29 +795,10 @@ fet_beginchar ("X-Circled notehead", "s2xcircle"); z12 = (charwx * hppp, charwy * vppp); labels (12); - remember_pic := currentpicture; - - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; -if test > 0: - fet_beginchar ("X-Circled notehead", "s2xcircle"); - save wid, hei; - save cthick, cxr, cyr; - - wid# := black_notehead_width# * sqrt (sqrt2); - hei# := noteheight# * sqrt (sqrt2); - - set_char_box (0, wid#, hei# / 2, hei# / 2); - - currentpicture := remember_pic; - - draw_staff (-2, 2, 0.5); - fet_endchar; -fi; - - %%%%%%%% % % SOLFA SHAPED NOTES @@ -1406,66 +1222,65 @@ def draw_mi_head (expr width_factor, thickness_factor, mirror) = enddef; -save mi_weight, mi_width; +save mi_weight; mi_weight := 2; -mi_width := 1.2; fet_beginchar ("Whole mihead", "s0mi"); - draw_mi_head (mi_width * solfa_whole_width, mi_weight, false); + draw_mi_head (solfa_whole_width, mi_weight, false); fill path_out; unfill path_in; fet_endchar; fet_beginchar ("Half mihead", "s1mi"); - draw_mi_head (mi_width * solfa_quarter_width, mi_weight, false); + draw_mi_head (solfa_quarter_width, mi_weight, false); fill path_out; unfill path_in; fet_endchar; fet_beginchar ("Quarter mihead", "s2mi"); - draw_mi_head (mi_width * solfa_quarter_width, mi_weight, false); + draw_mi_head (solfa_quarter_width, mi_weight, false); fill path_out; fet_endchar; fet_beginchar ("Whole mirror mihead", "s0miMirror"); - draw_mi_head (mi_width * solfa_whole_width, mi_weight, true); + draw_mi_head (solfa_whole_width, mi_weight, true); fill path_out; unfill path_in; fet_endchar; fet_beginchar ("Half mirror mihead", "s1miMirror"); - draw_mi_head (mi_width * solfa_quarter_width, mi_weight, true); + draw_mi_head (solfa_quarter_width, mi_weight, true); fill path_out; unfill path_in; fet_endchar; fet_beginchar ("Quarter mirror mihead", "s2miMirror"); - draw_mi_head (mi_width * solfa_quarter_width, mi_weight, true); + draw_mi_head (solfa_quarter_width, mi_weight, true); fill path_out; fet_endchar; fet_beginchar ("Whole thin mihead", "s0miThin"); - draw_mi_head (mi_width * solfa_whole_width, 1, false); + draw_mi_head (solfa_whole_width, 1, false); fill path_out; unfill path_in; fet_endchar; fet_beginchar ("Half thin mihead", "s1miThin"); - draw_mi_head (mi_width * solfa_quarter_width, 1, false); + draw_mi_head (solfa_quarter_width, 1, false); fill path_out; unfill path_in; fet_endchar; fet_beginchar ("Quarter thin mihead", "s2miThin"); - draw_mi_head (mi_width * solfa_quarter_width, 1, false); + draw_mi_head (solfa_quarter_width, 1, false); fill path_out; fet_endchar; @@ -1630,11 +1445,12 @@ fet_endchar; % so we can't just use the standard note font. % def draw_sol_head (expr filled) = - draw_outside_ellipse (1.53 - puff_up_factor / 3.0, 34, 0.66, 0.17); + draw_outside_ellipse (1.49 - puff_up_factor / 3.0, 31, 0.707, 0); if not filled: - undraw_inside_ellipse (3.25, 33, 0.81, 2.5 stafflinethickness#); + undraw_inside_ellipse (2.5 - puff_up_factor / 3.0, 31, 0.707, + 3.5 stafflinethickness#); fi - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); enddef; fet_beginchar ("Whole solhead", "s0sol"); @@ -2150,12 +1966,11 @@ fet_endchar; % Diamond shape % Has up and down shapes for all hollow notes % -save funk_mi_width, funk_mi_weight; -funk_mi_width := 1.2; +save funk_mi_weight; funk_mi_weight := 1.9; fet_beginchar ("Whole up Funk mihead", "u0miFunk"); - draw_mi_head (funk_mi_width * funk_notehead_width, + draw_mi_head (funk_notehead_width, funk_mi_weight, false); fill path_out; unfill path_in; @@ -2163,7 +1978,7 @@ fet_endchar; fet_beginchar ("Whole down Funk mihead", "d0miFunk"); - draw_mi_head (funk_mi_width * funk_notehead_width, + draw_mi_head (funk_notehead_width, funk_mi_weight, true); fill path_out; unfill path_in; @@ -2171,7 +1986,7 @@ fet_endchar; fet_beginchar ("Half up Funk mihead", "u1miFunk"); - draw_mi_head (funk_mi_width * funk_notehead_width, + draw_mi_head (funk_notehead_width, funk_mi_weight, false); fill path_out; unfill path_in; @@ -2179,7 +1994,7 @@ fet_endchar; fet_beginchar ("Half down Funk mihead", "d1miFunk"); - draw_mi_head (funk_mi_width * funk_notehead_width, + draw_mi_head (funk_notehead_width, funk_mi_weight, true); fill path_out; unfill path_in; @@ -2187,7 +2002,7 @@ fet_endchar; fet_beginchar ("Quarter Funk mihead", "s2miFunk"); - draw_mi_head (funk_mi_width * funk_notehead_width, + draw_mi_head (funk_notehead_width, funk_mi_weight, false); fill path_out; fet_endchar; @@ -2253,7 +2068,7 @@ begingroup if not filled: undraw_inside_ellipse (1.9, 33, 0.74, 5.5 stafflinethickness#); fi - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); endgroup enddef; @@ -2695,7 +2510,7 @@ fet_endchar; % Symmetric for all hollow notes % save walker_mi_width, walker_mi_weight; -walker_mi_width := 1.2; +walker_mi_width := 1; walker_mi_weight := 1.5; fet_beginchar ("Whole Walker mihead", "s0miWalker"); diff --git a/mf/feta-noteheads11.mf b/mf/feta-noteheads11.mf index b02844a196..cba81dee23 100644 --- a/mf/feta-noteheads11.mf +++ b/mf/feta-noteheads11.mf @@ -1,13 +1,5 @@ -% feta-noteheads11.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 11.22; -test := 0; - - input feta-noteheads-generic; - end. - diff --git a/mf/feta-noteheads13.mf b/mf/feta-noteheads13.mf index e010769f4b..0516809917 100644 --- a/mf/feta-noteheads13.mf +++ b/mf/feta-noteheads13.mf @@ -1,13 +1,5 @@ -% feta-noteheads13.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 12.60; -test := 0; - - input feta-noteheads-generic; - end. - diff --git a/mf/feta-noteheads14.mf b/mf/feta-noteheads14.mf index 7d25cb2a60..14d3b78b01 100644 --- a/mf/feta-noteheads14.mf +++ b/mf/feta-noteheads14.mf @@ -1,13 +1,5 @@ -% feta-noteheads14.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 14.14; -test := 0; - - input feta-noteheads-generic; - end. - diff --git a/mf/feta-noteheads16.mf b/mf/feta-noteheads16.mf index 755f9ffdd5..8c8370dc59 100644 --- a/mf/feta-noteheads16.mf +++ b/mf/feta-noteheads16.mf @@ -1,13 +1,5 @@ -% feta-noteheads16.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 15.87; -test := 0; - - input feta-noteheads-generic; - end. - diff --git a/mf/feta-noteheads18.mf b/mf/feta-noteheads18.mf index bdc6918bf3..a1e705c48c 100644 --- a/mf/feta-noteheads18.mf +++ b/mf/feta-noteheads18.mf @@ -1,13 +1,5 @@ -% feta-noteheads18.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 17.82; -test := 0; - - input feta-noteheads-generic; - end. - diff --git a/mf/feta-noteheads20.mf b/mf/feta-noteheads20.mf index 072f99207c..9ac9379de2 100644 --- a/mf/feta-noteheads20.mf +++ b/mf/feta-noteheads20.mf @@ -1,13 +1,5 @@ -% feta-noteheads20.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 20; -test := 0; - - input feta-noteheads-generic; - end. - diff --git a/mf/feta-noteheads23.mf b/mf/feta-noteheads23.mf index ab0154832e..f6ddb0db44 100644 --- a/mf/feta-noteheads23.mf +++ b/mf/feta-noteheads23.mf @@ -1,13 +1,5 @@ -% feta-noteheads23.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 22.45; -test := 0; - - input feta-noteheads-generic; - end. - diff --git a/mf/feta-noteheads26.mf b/mf/feta-noteheads26.mf index b25d21495c..e72c7012d5 100644 --- a/mf/feta-noteheads26.mf +++ b/mf/feta-noteheads26.mf @@ -1,13 +1,5 @@ -% feta-noteheads26.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 25.20; -test := 0; - - input feta-noteheads-generic; - end. - diff --git a/mf/feta-numbers.mf b/mf/feta-numbers.mf index 8ec75697ae..0f55e727f7 100644 --- a/mf/feta-numbers.mf +++ b/mf/feta-numbers.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- bold Orator numerals % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Jan Nieuwenhuizen +% Copyright (C) 1997--2015 Jan Nieuwenhuizen % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/feta-other-generic.mf b/mf/feta-other-generic.mf new file mode 100644 index 0000000000..ec8c2d0e27 --- /dev/null +++ b/mf/feta-other-generic.mf @@ -0,0 +1,29 @@ +% This file is part of LilyPond, the GNU music typesetter. +% +% Copyright (C) 1997--2015 Han-Wen Nienhuys +% +% The LilyPond font is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version, or under the SIL Open Font License. + + +input common-modules-and-initialization; + +font_x_height staff_space#; + +fet_beginfont ("feta", design_size, "fetaMusic"); + input feta-rests; + input feta-accidentals; + input feta-arrowheads; + input feta-dots; + input feta-scripts; + input feta-clefs; + input feta-timesignatures; + input feta-pedals; + input feta-brackettips; + input feta-accordion; + input feta-ties; + + input declare-autometric-parameters; +fet_endfont; diff --git a/mf/feta-params.mf b/mf/feta-params.mf index 8336df3306..81325dc46e 100644 --- a/mf/feta-params.mf +++ b/mf/feta-params.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- global parameters for both feta and parmesan fonts % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by @@ -238,7 +238,19 @@ slash_thick# := 2/3 * 0.48 staff_space#; % the lines. If you like that, modify overdone heads (unit: % stafflinethickness). % -overdone_heads = 0.0; + +%% FIXME +% There is a problem with noteheads slightly extending beyond the staff +% lines. This is due to the fact that staff_space + stafflinethickness +% is sometimes an odd number, so the nothead height and depth are not +% integers. Then, when the font is converted to an outline font, the +% system rounds up the 0.5 left over from dividing the notehead height +% in two, and the notehead extends slightly beyond the staff line. +% In order to resolve this problem, we use overdone_heads to slightly +% reduce the notehead height. Empirically, we have determined that +% reducing by 10% of stafflinethickness solves the problem. + +overdone_heads = -0.1; noteheight# := staff_space# + (1 + overdone_heads) * stafflinethickness#; define_pixels (slash_thick); diff --git a/mf/feta-parenthesis.mf b/mf/feta-parenthesis.mf new file mode 100644 index 0000000000..ad2561a596 --- /dev/null +++ b/mf/feta-parenthesis.mf @@ -0,0 +1,44 @@ + + +def draw_paren = + save leftindent; + + leftindent := .2 staff_space; + + set_char_box (0, .5 staff_space# + stafflinethickness#, + staff_space#, staff_space#); + + d := d - feta_shift; + + z1 = (leftindent, h); + z2 = (w - stafflinethickness, .5 (h - d)); + z3 = (leftindent, -d); + + penpos1 (stafflinethickness, 35); + penpos2 (.1 staff_space + stafflinethickness, 0); + penpos3 (stafflinethickness, -35); + + fill z2l{down} + .. simple_serif (z3l, z3r, 90) + .. z2r{up} + .. simple_serif (z1r, z1l, 90) + .. z2l{down} + -- cycle; +enddef; + + +fet_beginchar ("Right Parenthesis", "rightparen"); + draw_paren; + penlabels (1, 2, 3); + + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("Left Parenthesis", "leftparen"); + draw_paren; + + currentpicture := currentpicture xscaled -1; + + set_char_box (charwd, charbp, chardp, charht); +fet_endchar; diff --git a/mf/feta-pedals.mf b/mf/feta-pedals.mf index b4979ca4a6..5b510ba820 100644 --- a/mf/feta-pedals.mf +++ b/mf/feta-pedals.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- piano pedal markings % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2000--2012 Jan Nieuwenhuizen +% Copyright (C) 2000--2015 Jan Nieuwenhuizen % % Voor Cup % diff --git a/mf/feta-rests.mf b/mf/feta-rests.mf index 09439853a0..675980fe09 100644 --- a/mf/feta-rests.mf +++ b/mf/feta-rests.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- rest symbols -*-Fundamental-*- % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Jan Nieuwenhuizen +% Copyright (C) 1997--2015 Jan Nieuwenhuizen % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by @@ -43,7 +43,7 @@ fet_beginchar ("whole rest", "0"); currentpicture := currentpicture shifted (0, -block_rest_y + feta_space_shift); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -52,7 +52,7 @@ fet_beginchar ("half rest", "1"); block_rest; - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -72,8 +72,6 @@ fet_beginchar ("whole rest (outside staff)", "0o"); lft x5 = -b - block_rest_y; rt x6 = w + block_rest_y; draw_gridline (z5, z6, ledgerlinethickness_rounded); - - draw_staff (-2, 2, -3); fet_endchar; @@ -90,8 +88,6 @@ fet_beginchar ("half rest (outside staff)", "1o"); rt x6 = w + block_rest_y; draw_gridline (z5, z6, ledgerlinethickness_rounded); - - draw_staff (-2, 2, 3); fet_endchar; @@ -103,7 +99,7 @@ fet_beginchar ("maxima rest", "M3"); addto currentpicture also currentpicture shifted (2 breve_rest_x, 0); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -113,7 +109,7 @@ fet_beginchar ("longa rest", "M2"); draw_block ((0, -breve_rest_y + feta_shift), (breve_rest_x, breve_rest_y)); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -122,7 +118,7 @@ fet_beginchar ("breve rest", "M1"); draw_block ((0, 0), (breve_rest_x, breve_rest_y)); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; fet_beginchar ("breve rest (outside staff)", "M1o"); @@ -139,8 +135,6 @@ fet_beginchar ("breve rest (outside staff)", "M1o"); draw_gridline (z5, z6, ledgerlinethickness_rounded); draw_gridline ((x5, 0), (x6, 0), ledgerlinethickness_rounded); - - draw_staff (-2, 2, 3); fet_endchar; @@ -226,7 +220,7 @@ fet_beginchar ("Quarter rest", "2"); penlabels (1, 2, 3, 4, 5, 6, 7); penlabels (10, 11, 12, 13); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -374,7 +368,7 @@ def draw_eighth_rest (expr show_labels) = -- z1l .. cycle; - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); enddef; @@ -384,6 +378,72 @@ fet_beginchar ("Classical quarter rest", "2classical"); fet_endchar; +fet_beginchar ("Z-shaped quarter rest", "2z"); + save ycenter; + save pat, bulb, rest; + path pat, bulb, rest; + show_labels := 0; + + set_char_box (0, 1.125 staff_space#, + 0.5 staff_space# + bulb_diam# / 2, + 0.5 staff_space# + bulb_diam# / 2); + + % The brushes on other rests taper from thin to thick, + % but because this rest has a bulb on both ends, use + % a constant thickness somewhere in between. + slash_thickness := (7 thin + 3 thick) / 10; + + x1 = 0 + hround 0.5 slash_thickness; + y1 = -(d - vround 0.5 slash_thickness); + x2 = w - hround 0.5 slash_thickness; + y2 = h - vround 0.5 slash_thickness; + + penpos1 (slash_thickness, angle(z2 - z1) - 90); + penpos2 (slash_thickness, angle(z2 - z1) - 90); + + z9 = z2 + 0.5 slash_thickness * dir (angle (z2 - z1)); + z12 = z1 + 0.5 slash_thickness * dir (angle (z1 - z2)); + y9 := vround y9; + + x1l := hround x1l; + x1r := hround x1r; + x1 := .5 [x1l, x1r]; + + x2l := hround x2l; + x2r := hround x2r; + x2 := .5 [x2l, x2r]; + + if show_labels = 1: + penlabels (1, 2); + labels (9, 12); + fi; + + pat = z1l + -- z2l + .. z9 + .. z2r + -- z1r + .. cycle; + bulb = draw_rest_bulb (0.5 staff_space, y2r, pat, 1.0, show_labels); + + rest = z12 + .. bulb rotatedaround ((0.5 w, 0), 180) + -- z2r + .. z9 + .. bulb + -- z1l + .. cycle; + + if show_labels = 0: + rest := rest xscaled -1 shifted (w, 0); + fi; + + fill rest; + + draw_staff_if_debugging (-2, 2); +fet_endchar; + + fet_beginchar ("8th rest", "3"); draw_eighth_rest (1); fet_endchar; @@ -440,7 +500,7 @@ fet_beginchar ("16th rest", "4"); penlabels (1, 2); labels (9); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -494,7 +554,7 @@ fet_beginchar ("32th rest", "5"); penlabels (1, 2); labels (9); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -552,7 +612,7 @@ fet_beginchar ("64th rest", "6"); penlabels (1, 2); labels (9); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; @@ -614,7 +674,7 @@ fet_beginchar ("128th rest", "7"); penlabels (1, 2); labels (9); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); fet_endchar; diff --git a/mf/feta-scripts.mf b/mf/feta-scripts.mf index 91c3ae1fe4..e27974b955 100644 --- a/mf/feta-scripts.mf +++ b/mf/feta-scripts.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- implement scripts % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % Jan Nieuwenhuizen % % @@ -1277,7 +1277,6 @@ fet_beginchar ("Varied Segno", "varsegno"); addto currentpicture also currentpicture scaled -1; penlabels (1, 1', 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); - % draw_staff (-2, 2, 0); fet_endchar; @@ -1495,7 +1494,7 @@ fet_beginchar ("Arpeggio", "arpeggio"); draw_arpeggio; penlabels (range 1 thru 9); - draw_staff (-2, 2, 0.0); + draw_staff_if_debugging (-2, 2); endgroup; fet_endchar; diff --git a/mf/feta-sharps.mf b/mf/feta-sharps.mf new file mode 100644 index 0000000000..eeade7d207 --- /dev/null +++ b/mf/feta-sharps.mf @@ -0,0 +1,339 @@ + +% +% The beams of most sharps have horizontal endings (as if drawn with +% a square pen). [Wanske] does not mention this, so we'll just ignore +% this fact. +% + +save default_width, default_height, onestemmed_height; +save default_interbeam_dist, triples_interbeam_dist; +save default_beam_thickness, stem_thickness; + +default_width# := 1.1 staff_space#; +default_height# := 3 staff_space#; +onestemmed_height# := 2.66 staff_space#; +define_pixels (default_width); + +default_interbeam_dist := 1.05 staff_space_rounded; +triples_interbeam_dist := 1.2 staff_space_rounded; + +default_beam_thickness# := 0.3 staff_space# + stafflinethickness#; +stem_thickness# := stafflinethickness# + .05 staff_space#; +define_whole_blacker_pixels (stem_thickness); + + +def draw_sharp_beam (expr length, y_offset) = + save beam_length; + save ne_beam_dir, nw_dist; + pair ne_beam_dir, nw_dist; + + beam_length := length; + + define_whole_vertical_blacker_pixels (default_beam_thickness); + + clearxy; + + pickup pencircle scaled 2 blot_diameter; + + rt x2 - lft x1 = beam_length; + z2 = z1 + whatever * (beam_length, default_beam_thickness); + .5 [z1, z3] = (.5 w, y_offset); + x3 = x2; + top y2 - bot y3 = default_beam_thickness; + x4 = x1; + top y1 - bot y4 = default_beam_thickness; + + ne_beam_dir = unitvector (z2 - z1); + nw_dist = (ne_beam_dir rotated 90) * blot_diameter; + + fill lft z1{up} + ... (z1 + nw_dist){ne_beam_dir} + -- (z2 + nw_dist){ne_beam_dir} + ... rt z2{down} + -- rt z3{down} + ... (z3 - nw_dist){-ne_beam_dir} + -- (z4 - nw_dist){-ne_beam_dir} + ... lft z4{up} + -- cycle; + + labels (1, 2, 3, 4); +enddef; + + +def draw_sharp (expr arrowup, arrowdown) = + save dist_between_stems; + save outer_space; + save half_height, interbeam_dist; + + half_height# := 0.5 default_height#; + define_pixels (half_height); + interbeam_dist := default_interbeam_dist; + + set_char_box (0, default_width#, half_height#, half_height#); + d := d - feta_space_shift; + + dist_between_stems := hround (7 / 16 * default_width); + outer_space := hround ((w - dist_between_stems - stem_thickness) / 2); + + w := 2 outer_space + dist_between_stems + stem_thickness; + + draw_sharp_beam (w, -.5 interbeam_dist); + draw_sharp_beam (w, -.5 interbeam_dist + vround interbeam_dist); + + % expand the charbox so that it encloses the whole arrow; + % this must not happen earlier because some commands above + % still rely on the old width + if arrowup: + w := w + 1.5 stafflinethickness; + h := h + 1.2 staff_space; + fi; + if arrowdown: + b := b + 1.5 stafflinethickness; + d := d + 1.2 staff_space; + fi; + + pickup pencircle scaled stem_thickness; + + lft x5 = lft x6 = outer_space; + lft x7 = lft x8 = outer_space + dist_between_stems; + bot y5 = -half_height; + top y8 = half_height; + z6 = z8 + whatever * ne_beam_dir; + bot y7 = -top y6 + feta_space_shift; + + draw_gridline (z5, z6, stem_thickness); + draw_gridline (z7, z8, stem_thickness); + + if arrowup: + draw_arrow (z8, stem_thickness, up, + stafflinethickness / 2 + stem_thickness / 2, false); + fi; + if arrowdown: + draw_arrow (z5, stem_thickness, up, + stafflinethickness / 2 + stem_thickness / 2, true); + fi; + + labels (5, 6, 7, 8); + draw_staff_if_debugging (-2, 2); +enddef; + + +fet_beginchar ("Sharp", "sharp"); + draw_sharp (false, false); +fet_endchar; + + +fet_beginchar ("Arrowed Sharp (arrow up)", "sharp.arrowup"); + draw_sharp (true, false); +fet_endchar; + + +fet_beginchar ("Arrowed Sharp (arrow down)", "sharp.arrowdown"); + draw_sharp (false, true); +fet_endchar; + + +fet_beginchar ("Arrowed Sharp (arrows up and down)", "sharp.arrowboth"); + draw_sharp (true, true); +fet_endchar; + + +fet_beginchar ("1/2 Sharp", "sharp.slashslash.stem"); + save outer_space; + save half_height, interbeam_dist; + + half_height# := 0.5 onestemmed_height#; + define_pixels (half_height); + interbeam_dist := default_interbeam_dist; + + set_char_box (0, 0.7 staff_space#, half_height#, half_height#); + d := d - feta_space_shift; + + outer_space := hround ((w - stem_thickness) / 2); + + w := 2 outer_space + stem_thickness; + + draw_sharp_beam (w, -.5 interbeam_dist); + draw_sharp_beam (w, -.5 interbeam_dist + vround interbeam_dist); + + pickup pencircle scaled stem_thickness; + + lft x5 = lft x6 = outer_space; + top y6 = half_height; + bot y5 = -top y6 + feta_space_shift; + + draw_gridline (z5, z6, stem_thickness); + + labels (5, 6); + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("Sharp (3 beams)", "sharp.slashslashslash.stemstem"); + save dist_between_stems; + save outer_space; + save half_height, interbeam_dist; + save default_beam_thickness; + + half_height# := 0.5 default_height#; + define_pixels (half_height); + interbeam_dist := triples_interbeam_dist; + + default_beam_thickness# := 0.22 staff_space# + stafflinethickness#; + + set_char_box (0, default_width#, half_height#, half_height#); + + dist_between_stems := hround (7 / 16 * default_width); + outer_space := hround ((w - dist_between_stems - stem_thickness) / 2); + + w := 2 outer_space + dist_between_stems + stem_thickness; + d := d - feta_space_shift; + + draw_sharp_beam (.88 w, -.5 interbeam_dist); + draw_sharp_beam (.88 w, -.5 interbeam_dist + vround interbeam_dist); + default_beam_thickness# := 1/.88 default_beam_thickness#; + draw_sharp_beam (w, 0); + + pickup pencircle scaled stem_thickness; + + lft x5 = lft x6 = outer_space; + lft x7 = lft x8 = outer_space + dist_between_stems; + bot y5 = -half_height; + top y8 = half_height; + z6 = z8 + whatever * ne_beam_dir; + bot y7 = -top y6 + feta_space_shift; + + draw_gridline (z5, z6, stem_thickness); + draw_gridline (z7, z8, stem_thickness); + + labels (5, 6, 7, 8); + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("1/2 Sharp (3 beams)", "sharp.slashslashslash.stem"); + save outer_space; + save half_height, interbeam_dist; + save default_beam_thickness; + + half_height# := 0.5 onestemmed_height#; + define_pixels (half_height); + interbeam_dist := triples_interbeam_dist; + + default_beam_thickness# := 0.22 staff_space# + stafflinethickness#; + + set_char_box (0, 0.95 staff_space#, half_height#, half_height#); + + outer_space := hround ((w - stem_thickness) / 2); + + w := 2 outer_space + stem_thickness; + d := d - feta_space_shift; + + draw_sharp_beam (.8 w, -.5 interbeam_dist); + draw_sharp_beam (.8 w, -.5 interbeam_dist + vround interbeam_dist); + default_beam_thickness# := 1/.8 default_beam_thickness#; + draw_sharp_beam (w, 0); + + pickup pencircle scaled stem_thickness; + + lft x5 = lft x6 = outer_space; + top y6 = half_height; + bot y5 = -top y6 + feta_space_shift; + + draw_gridline (z5, z6, stem_thickness); + + labels (5, 6); + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("3/4 Sharp", "sharp.slashslash.stemstemstem"); + save dist_between_stems; + save outer_space; + save half_height, interbeam_dist; + + half_height# := 0.5 default_height#; + define_pixels (half_height); + interbeam_dist := default_interbeam_dist; + + set_char_box (0, 1.6 staff_space#, half_height#, half_height#); + d := d - feta_space_shift; + + dist_between_stems := hround (9 / 32 * w); + outer_space := hround ((w - 2 dist_between_stems - stem_thickness) / 2); + + w := 2 outer_space + 2 dist_between_stems + stem_thickness; + + draw_sharp_beam (w, -.5 interbeam_dist); + draw_sharp_beam (w, -.5 interbeam_dist + vround interbeam_dist); + + pickup pencircle scaled stem_thickness; + + lft x5 = lft x6 = outer_space; + lft x9 = lft x10 = outer_space + dist_between_stems; + lft x7 = lft x8 = outer_space + 2 dist_between_stems; + bot y5 = -half_height; + top y8 = half_height; + z6 = z8 + whatever * ne_beam_dir; + bot y7 = -top y6 + feta_space_shift; + y9 = .5 [y5, y7]; + y10 = .5 [y6, y8]; + + draw_gridline (z5, z6, stem_thickness); + draw_gridline (z7, z8, stem_thickness); + draw_gridline (z9, z10, stem_thickness); + + labels (5, 6, 7, 8, 9, 10); + draw_staff_if_debugging (-2, 2); +fet_endchar; + + +fet_beginchar ("Double Sharp", "doublesharp"); + save klaverblad, klaversteel; + save pat; + path pat; + + klaversteel = 1/15 staff_space; + klaverblad = .4 staff_space - .5 stafflinethickness; + + set_char_box (0, staff_space#, .5 staff_space#, .5 staff_space#); + + z1 = (klaversteel, 0); + z2 = (w / 2 - klaverblad / 10, h - klaverblad); + z3 = (w / 2, h); + z4 = z2 reflectedabout ((0, 0), (1, 1)); + z5 = z1 reflectedabout ((0, 0), (1, 1)); + + pickup pencircle scaled blot_diameter; + + x2 := hfloor (rt x2) - blot_diameter / 2; + x3 := hfloor (rt x3) - blot_diameter / 2; + y3 := vfloor (top y3) - blot_diameter / 2; + y4 := vfloor (top y4) - blot_diameter / 2; + + pat = (rt z1){dir45} + .. {right}(bot z2) + .. rt z2 + -- rt z3{z3 - z2} + .. top z3{z4 - z3} + -- top z4{z4 - z3} + .. (lft z4){down} + .. {dir 225}(top z5); + pat := pat + -- reverse pat xscaled -1 shifted (-feta_eps, 0); + + % assure symmetry -- it's more important to center the glyph on the + % staff line than centering it between staff lines, so we use + % feta_shift, not feta_space_shift. + h := h + feta_shift; + + fill pat shifted (0, feta_shift) + -- reverse pat yscaled -1 shifted (0, -feta_eps) + -- cycle; + + % ugh + currentpicture := currentpicture shifted (hround (w / 2), 0); + + labels (1, 2, 3, 4, 5); + draw_staff_if_debugging (-2, 2); +fet_endchar; diff --git a/mf/feta-test-generic.mf b/mf/feta-test-generic.mf deleted file mode 100644 index a910b52c5a..0000000000 --- a/mf/feta-test-generic.mf +++ /dev/null @@ -1,17 +0,0 @@ -% -% test stuff. -% in a separate file to avoid tainting non-test font files for testing. -% - -%input feta-rests; -input feta-accidentals; -%input feta-dots; -%input feta-arrowheads; -%input feta-scripts; -%input feta-trills; -%input feta-clefs; -%input feta-brackettips; -%input feta-timesignatures; -%input feta-pedals; -%input feta-accordion; -%input feta-ties; diff --git a/mf/feta-test11.mf b/mf/feta-test11.mf deleted file mode 100644 index ad21720acc..0000000000 --- a/mf/feta-test11.mf +++ /dev/null @@ -1,15 +0,0 @@ -% feta-test11.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; - -design_size := 11; -test := 1; - -% smoked cheese -% test := -1; - -input feta-generic; - -end. - diff --git a/mf/feta-test13.mf b/mf/feta-test13.mf deleted file mode 100644 index 28abf42cd5..0000000000 --- a/mf/feta-test13.mf +++ /dev/null @@ -1,16 +0,0 @@ -% feta-test13.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; - -design_size := 13; -test := 1; - -% smoked cheese -% test := -1; - -input feta-generic; - - -end. - diff --git a/mf/feta-test16.mf b/mf/feta-test16.mf deleted file mode 100644 index eaa280aa43..0000000000 --- a/mf/feta-test16.mf +++ /dev/null @@ -1,16 +0,0 @@ -% feta-test16.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; - -design_size := 16; -test := 1; - -% smoked cheese -% test := -1; - -input feta-generic; - - -end. - diff --git a/mf/feta-test20.mf b/mf/feta-test20.mf deleted file mode 100644 index 5a58be3dd6..0000000000 --- a/mf/feta-test20.mf +++ /dev/null @@ -1,16 +0,0 @@ -% feta-test20.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; - -design_size := 20; -test := 1; - -% smoked cheese -% test := -1; - -input feta-generic; - - -end. - diff --git a/mf/feta-test23.mf b/mf/feta-test23.mf deleted file mode 100644 index 5a25b4691c..0000000000 --- a/mf/feta-test23.mf +++ /dev/null @@ -1,16 +0,0 @@ -% feta-test23.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; - -design_size := 23; -test := 1; - -% smoked cheese -% test := -1; - -input feta-generic; - - -end. - diff --git a/mf/feta-test26.mf b/mf/feta-test26.mf deleted file mode 100644 index e9e1521834..0000000000 --- a/mf/feta-test26.mf +++ /dev/null @@ -1,15 +0,0 @@ -% feta-test26.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; - -design_size := 26; -test := 1; - -% smoked cheese -% test := -1; - -input feta-generic; - - -end. diff --git a/mf/feta-ties.mf b/mf/feta-ties.mf index 6df5e7ca5c..c2124b88e9 100644 --- a/mf/feta-ties.mf +++ b/mf/feta-ties.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- small ties % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2011--2012 Bertrand Bordage +% Copyright (C) 2011--2015 Bertrand Bordage % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/feta-timesignatures.mf b/mf/feta-timesignatures.mf index 0098f0ad42..ed3f713cdf 100644 --- a/mf/feta-timesignatures.mf +++ b/mf/feta-timesignatures.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- implement Time Signatures % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1998--2012 Mats Bengtsson , +% Copyright (C) 1998--2015 Mats Bengtsson , % Christian Mondrup % % The LilyPond font is free software: you can redistribute it and/or modify @@ -90,7 +90,7 @@ def draw_C = penlabels (1, 2, 3, 4, 5); - draw_staff (-2, 2, 0); + draw_staff_if_debugging (-2, 2); enddef; diff --git a/mf/feta-trills.mf b/mf/feta-trills.mf index ea63af0bfb..9014e61f79 100644 --- a/mf/feta-trills.mf +++ b/mf/feta-trills.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- implement trill symbols % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1998--2012 Jan Nieuwenhuizen +% Copyright (C) 1998--2015 Jan Nieuwenhuizen % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/feta11.mf b/mf/feta11.mf index be6a6a7e10..ddc0f0d292 100644 --- a/mf/feta11.mf +++ b/mf/feta11.mf @@ -1,13 +1,6 @@ -% feta11.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 11.22; -test := 0; - - -input feta-generic; +input feta-other-generic; end. - diff --git a/mf/feta13.mf b/mf/feta13.mf index 5014c12342..37871789ce 100644 --- a/mf/feta13.mf +++ b/mf/feta13.mf @@ -1,13 +1,6 @@ -% feta13.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 12.60; -test := 0; - - -input feta-generic; +input feta-other-generic; end. - diff --git a/mf/feta14.mf b/mf/feta14.mf index 23ac8e4d15..a70db3e136 100644 --- a/mf/feta14.mf +++ b/mf/feta14.mf @@ -1,14 +1,6 @@ -% feta14.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 14.14; -test := 0; - - -input feta-generic; - +input feta-other-generic; end. - diff --git a/mf/feta16.mf b/mf/feta16.mf index 174460b715..d38c756bf7 100644 --- a/mf/feta16.mf +++ b/mf/feta16.mf @@ -1,13 +1,6 @@ -% feta16.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 15.87; -test := 0; - - -input feta-generic; +input feta-other-generic; end. - diff --git a/mf/feta18.mf b/mf/feta18.mf index b52f6a3e35..d69ff7ccce 100644 --- a/mf/feta18.mf +++ b/mf/feta18.mf @@ -1,14 +1,6 @@ -% feta18.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. -input feta-autometric; - -% todo change file name design_size := 17.82; -test := 0; - - -input feta-generic; - +input feta-other-generic; end. diff --git a/mf/feta20.mf b/mf/feta20.mf index 2b561b200d..eafc6fa163 100644 --- a/mf/feta20.mf +++ b/mf/feta20.mf @@ -1,14 +1,7 @@ -% feta20.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 20; -input feta-autometric; - - % use feta-test for debugging. -test := 0; -input feta-generic; - - +input feta-other-generic; end. diff --git a/mf/feta23.mf b/mf/feta23.mf index d2cf0025e9..0a0be5cae0 100644 --- a/mf/feta23.mf +++ b/mf/feta23.mf @@ -1,15 +1,6 @@ -% feta23.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. -input feta-autometric; - -% todo change file name design_size := 22.45; -test := 0; - - -input feta-generic; - +input feta-other-generic; end. - diff --git a/mf/feta26.mf b/mf/feta26.mf index 2bfa536618..62ed9540e4 100644 --- a/mf/feta26.mf +++ b/mf/feta26.mf @@ -1,15 +1,6 @@ -% feta26.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 25.20; -test := 0; - - -input feta-generic; - +input feta-other-generic; end. - - diff --git a/mf/parmesan-accidentals.mf b/mf/parmesan-accidentals.mf index f7cf78563b..0714e46b61 100644 --- a/mf/parmesan-accidentals.mf +++ b/mf/parmesan-accidentals.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- ancient accidentals % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2001--2012 Juergen Reuter +% Copyright (C) 2001--2015 Juergen Reuter % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/parmesan-clefs.mf b/mf/parmesan-clefs.mf index ec6561dc8e..a291e3613a 100644 --- a/mf/parmesan-clefs.mf +++ b/mf/parmesan-clefs.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- ancient clefs % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2001--2012 Juergen Reuter +% Copyright (C) 2001--2015 Juergen Reuter % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by @@ -125,9 +125,7 @@ enddef; fet_beginchar ("Ed. Vat. do clef", "vaticana.do"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_vaticana_do_clef ((0, 0), 1.0); fet_endchar; @@ -194,9 +192,7 @@ enddef; fet_beginchar ("Ed. Vat. fa clef", "vaticana.fa"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_vaticana_fa_clef ((0, 0), 1.0); fet_endchar; @@ -282,9 +278,7 @@ enddef; fet_beginchar ("Ed. Med. do clef", "medicaea.do"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_medicaea_do_clef ((0, 0), 1.0); fet_endchar; @@ -352,9 +346,7 @@ enddef; fet_beginchar ("Ed. Med. fa clef", "medicaea.fa"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_medicaea_fa_clef ((0, 0), 1.0); fet_endchar; @@ -589,9 +581,7 @@ enddef; fet_beginchar ("neo-mensural c clef", "neomensural.c"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_neomensural_c_clef ((0, 0), 1.0); fet_endchar; @@ -696,9 +686,7 @@ enddef; fet_beginchar ("petrucci c1 clef", "petrucci.c1"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_petrucci_c_clef ((0, 0), +2, 1.0); fet_endchar; @@ -709,9 +697,7 @@ fet_endchar; fet_beginchar ("petrucci c2 clef", "petrucci.c2"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_petrucci_c_clef ((0, 0), +1, 1.0); fet_endchar; @@ -722,9 +708,7 @@ fet_endchar; fet_beginchar ("petrucci c3 clef", "petrucci.c3"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_petrucci_c_clef ((0, 0), 0, 1.0); fet_endchar; @@ -735,9 +719,7 @@ fet_endchar; fet_beginchar ("petrucci c4 clef", "petrucci.c4"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_petrucci_c_clef ((0, 0), -1, 1.0); fet_endchar; @@ -748,9 +730,7 @@ fet_endchar; fet_beginchar ("petrucci c5 clef", "petrucci.c5"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_petrucci_c_clef ((0, 0), -2, 1.0); fet_endchar; @@ -840,9 +820,7 @@ enddef; fet_beginchar ("mensural c clef", "mensural.c"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_mensural_c_clef ((0, 0), 1.0, true); fet_endchar; @@ -853,9 +831,7 @@ fet_endchar; fet_beginchar ("black mensural c clef", "blackmensural.c"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_mensural_c_clef ((0, 0), 1.0, false); fet_endchar; @@ -1034,9 +1010,7 @@ enddef; fet_beginchar ("petrucci f clef", "petrucci.f"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_petrucci_f_clef ((0, 0), 1.0); fet_endchar; @@ -1142,9 +1116,7 @@ enddef; fet_beginchar ("mensural f clef", "mensural.f"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_mensural_f_clef ((0, 0), 1.0); fet_endchar; @@ -1374,9 +1346,7 @@ enddef; fet_beginchar ("petrucci g clef", "petrucci.g"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_petrucci_g_clef ((0, 0), 1.0); fet_endchar; @@ -1408,9 +1378,7 @@ enddef; % until the code for the mensural g clef will be rewritten. % fet_beginchar ("mensural g clef", "mensural.g"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_petrucci_g_clef ((0, 0), 1.0); fet_endchar; @@ -1499,9 +1467,7 @@ enddef; fet_beginchar ("Hufnagel do clef", "hufnagel.do"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_hufnagel_do_clef ((0, 0), 1.0); fet_endchar; @@ -1595,9 +1561,7 @@ enddef; fet_beginchar ("Hufnagel fa clef", "hufnagel.fa"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_hufnagel_fa_clef ((0, 0), 1.0); fet_endchar; @@ -1619,9 +1583,7 @@ enddef; fet_beginchar ("Hufnagel do/fa clef", "hufnagel.do.fa"); - if test = 1: - draw_staff (-1, 3, 0.0); - fi; + draw_staff_if_debugging (-1, 3); draw_hufnagel_do_fa_clef ((0, 0), 1.0); fet_endchar; diff --git a/mf/parmesan-custodes.mf b/mf/parmesan-custodes.mf index 08bf714858..144d84392d 100644 --- a/mf/parmesan-custodes.mf +++ b/mf/parmesan-custodes.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- ancient custodes % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2000--2012 Juergen Reuter +% Copyright (C) 2000--2015 Juergen Reuter % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/parmesan-dots.mf b/mf/parmesan-dots.mf index 86a8ee7f4c..389fade024 100644 --- a/mf/parmesan-dots.mf +++ b/mf/parmesan-dots.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- dot vaticana % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2006--2012 Juergen Reuter +% Copyright (C) 2006--2015 Juergen Reuter % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/parmesan-flags.mf b/mf/parmesan-flags.mf index 9c136745d6..bb1a5c5cb5 100644 --- a/mf/parmesan-flags.mf +++ b/mf/parmesan-flags.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- ancient flags % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2001--2012 Juergen Reuter +% Copyright (C) 2001--2015 Juergen Reuter % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/parmesan-generic.mf b/mf/parmesan-generic.mf deleted file mode 100644 index 31b35ff25b..0000000000 --- a/mf/parmesan-generic.mf +++ /dev/null @@ -1,50 +0,0 @@ -% Feta (not the Font-En-Tja) music font -- generic stuff: include lots of files, -% This file is part of LilyPond, the GNU music typesetter. -% -% Copyright (C) 2002--2012 Juergen Reuter -% -% The LilyPond font is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . - - -if test = -1: - mode := smoke; -fi; - -mode_setup; - -staffsize# := design_size * pt#; - -input feta-macros; -input feta-params; - -input parmesan-macros; - - -font_x_height staff_space#; - - -fet_beginfont ("parmesan", design_size, "parmesanMusic"); - if test = 0: - input parmesan-rests; - input parmesan-clefs; - input parmesan-custodes - input parmesan-accidentals; - input parmesan-flags; - input parmesan-timesignatures; - input parmesan-scripts; - input parmesan-dots; - else: - - fi; -fet_endfont; diff --git a/mf/parmesan-macros.mf b/mf/parmesan-macros.mf index a42a1db393..762a178441 100644 --- a/mf/parmesan-macros.mf +++ b/mf/parmesan-macros.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- macros for parmesan font % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2001--2012 Juergen Reuter +% Copyright (C) 2001--2015 Juergen Reuter % % % The LilyPond font is free software: you can redistribute it and/or modify diff --git a/mf/parmesan-noteheads-generic.mf b/mf/parmesan-noteheads-generic.mf index a4103791ff..97fb4d7255 100644 --- a/mf/parmesan-noteheads-generic.mf +++ b/mf/parmesan-noteheads-generic.mf @@ -1,34 +1,14 @@ -% Feta (not the Font-En-Tja) music font -- generic stuff: include lots of files % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1997--2012 Han-Wen Nienhuys +% Copyright (C) 1997--2015 Han-Wen Nienhuys % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version, or under the SIL Open Font License. -% -% LilyPond is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with LilyPond. If not, see . - - -if test = -1: - mode := smoke; -fi - -staffsize# := design_size * pt#; - -mode_setup; - -input feta-macros; -input feta-params; +input common-modules-and-initialization; input parmesan-macros; font_x_height staff_space#; diff --git a/mf/parmesan-noteheads.mf b/mf/parmesan-noteheads.mf index cf1bfae111..00b8578cb4 100644 --- a/mf/parmesan-noteheads.mf +++ b/mf/parmesan-noteheads.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- ancient note heads % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2001--2012 Juergen Reuter +% Copyright (C) 2001--2015 Juergen Reuter % % Neo-mensural heads originally by % Christian Mondrup and Mats Bengtsson diff --git a/mf/parmesan-noteheads11.mf b/mf/parmesan-noteheads11.mf index 288695a45e..4f35548ff1 100644 --- a/mf/parmesan-noteheads11.mf +++ b/mf/parmesan-noteheads11.mf @@ -1,13 +1,5 @@ -% feta-noteheads11.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 11.22; -test := 0; - - input parmesan-noteheads-generic; - end. - diff --git a/mf/parmesan-noteheads13.mf b/mf/parmesan-noteheads13.mf index ad126423aa..13cedf0b14 100644 --- a/mf/parmesan-noteheads13.mf +++ b/mf/parmesan-noteheads13.mf @@ -1,13 +1,5 @@ -% feta-noteheads13.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 12.60; -test := 0; - - input parmesan-noteheads-generic; - end. - diff --git a/mf/parmesan-noteheads14.mf b/mf/parmesan-noteheads14.mf index f5d3a41df7..4c41de5149 100644 --- a/mf/parmesan-noteheads14.mf +++ b/mf/parmesan-noteheads14.mf @@ -1,13 +1,5 @@ -% feta-noteheads14.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 14.14; -test := 0; - - input parmesan-noteheads-generic; - end. - diff --git a/mf/parmesan-noteheads16.mf b/mf/parmesan-noteheads16.mf index 3db517fa04..53f67ceb68 100644 --- a/mf/parmesan-noteheads16.mf +++ b/mf/parmesan-noteheads16.mf @@ -1,13 +1,5 @@ -% feta-noteheads16.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 15.87; -test := 0; - - input parmesan-noteheads-generic; - end. - diff --git a/mf/parmesan-noteheads18.mf b/mf/parmesan-noteheads18.mf index ed0f99ec0e..4fcc73d5c4 100644 --- a/mf/parmesan-noteheads18.mf +++ b/mf/parmesan-noteheads18.mf @@ -1,13 +1,5 @@ -% feta-noteheads18.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 17.82; -test := 0; - - input parmesan-noteheads-generic; - end. - diff --git a/mf/parmesan-noteheads20.mf b/mf/parmesan-noteheads20.mf index 8891652bb8..3d2d91ff28 100644 --- a/mf/parmesan-noteheads20.mf +++ b/mf/parmesan-noteheads20.mf @@ -1,13 +1,5 @@ -% feta-noteheads20.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 20; -test := 0; - - input parmesan-noteheads-generic; - end. - diff --git a/mf/parmesan-noteheads23.mf b/mf/parmesan-noteheads23.mf index fe64e6f496..7a0d3bfd93 100644 --- a/mf/parmesan-noteheads23.mf +++ b/mf/parmesan-noteheads23.mf @@ -1,13 +1,5 @@ -% feta-noteheads23.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 22.45; -test := 0; - - input parmesan-noteheads-generic; - end. - diff --git a/mf/parmesan-noteheads26.mf b/mf/parmesan-noteheads26.mf index 082ffc208d..f7cb63aa90 100644 --- a/mf/parmesan-noteheads26.mf +++ b/mf/parmesan-noteheads26.mf @@ -1,13 +1,5 @@ -% feta-noteheads26.mf -% part of LilyPond's pretty-but-neat music font - -input feta-autometric; +% Produce font files at specified size. design_size := 25.20; -test := 0; - - input parmesan-noteheads-generic; - end. - diff --git a/mf/parmesan-other-generic.mf b/mf/parmesan-other-generic.mf new file mode 100644 index 0000000000..1f5a981b7b --- /dev/null +++ b/mf/parmesan-other-generic.mf @@ -0,0 +1,26 @@ +% This file is part of LilyPond, the GNU music typesetter. +% +% Copyright (C) 2002--2015 Juergen Reuter +% +% The LilyPond font is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version, or under the SIL Open Font License. + + + +input common-modules-and-initialization; +input parmesan-macros; + +font_x_height staff_space#; + +fet_beginfont ("parmesan", design_size, "parmesanMusic"); + input parmesan-rests; + input parmesan-clefs; + input parmesan-custodes + input parmesan-accidentals; + input parmesan-flags; + input parmesan-timesignatures; + input parmesan-scripts; + input parmesan-dots; +fet_endfont; diff --git a/mf/parmesan-rests.mf b/mf/parmesan-rests.mf index d238211b7e..3ef67212b9 100644 --- a/mf/parmesan-rests.mf +++ b/mf/parmesan-rests.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- ancient rests % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2001--2012 Juergen Reuter +% Copyright (C) 2001--2015 Juergen Reuter % % Neo-mensural rests originally by % Christian Mondrup and Mats Bengtsson. diff --git a/mf/parmesan-scripts.mf b/mf/parmesan-scripts.mf index cc96bbc465..ee2b56b715 100644 --- a/mf/parmesan-scripts.mf +++ b/mf/parmesan-scripts.mf @@ -1,7 +1,7 @@ % Feta (not the Font-En-Tja) music font -- ancient script symbols % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 2002--2012 Juergen Reuter +% Copyright (C) 2002--2015 Juergen Reuter % % % The LilyPond font is free software: you can redistribute it and/or modify diff --git a/mf/parmesan-timesignatures.mf b/mf/parmesan-timesignatures.mf index ef0fa621a5..58308ff8e9 100644 --- a/mf/parmesan-timesignatures.mf +++ b/mf/parmesan-timesignatures.mf @@ -1,9 +1,9 @@ % Feta (not the Font-En-Tja) music font -- ancient time signatures % This file is part of LilyPond, the GNU music typesetter. % -% Copyright (C) 1998--2012 Mats Bengtsson , +% Copyright (C) 1998--2015 Mats Bengtsson , % Christian Mondrup -% Copyright (C) 2002--2012 Juergen Reuter +% Copyright (C) 2002--2015 Juergen Reuter % % The LilyPond font is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by diff --git a/mf/parmesan11.mf b/mf/parmesan11.mf index 27ba341437..050559744f 100644 --- a/mf/parmesan11.mf +++ b/mf/parmesan11.mf @@ -1,13 +1,6 @@ -% parmesan11.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 11.22; -input feta-autometric; - -test := 0; - -input parmesan-generic; - +input parmesan-other-generic; end. - diff --git a/mf/parmesan13.mf b/mf/parmesan13.mf index 905da48d5d..8e139d450d 100644 --- a/mf/parmesan13.mf +++ b/mf/parmesan13.mf @@ -1,14 +1,6 @@ -% parmesan13.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 12.60; -input feta-autometric; - -test := 0; - -input parmesan-generic; - - +input parmesan-other-generic; end. - diff --git a/mf/parmesan14.mf b/mf/parmesan14.mf index 6357337be2..2eb056525f 100644 --- a/mf/parmesan14.mf +++ b/mf/parmesan14.mf @@ -1,14 +1,5 @@ -% parmesan14.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 14.14; - -input feta-autometric; - -test := 0; - -input parmesan-generic; - - +input parmesan-other-generic; end. - diff --git a/mf/parmesan16.mf b/mf/parmesan16.mf index 19b0516779..d8dd45d2ff 100644 --- a/mf/parmesan16.mf +++ b/mf/parmesan16.mf @@ -1,14 +1,6 @@ -% parmesan16.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 15.87; -input feta-autometric; - -test := 0; - -input parmesan-generic; - - +input parmesan-other-generic; end. - diff --git a/mf/parmesan18.mf b/mf/parmesan18.mf index 8c28507046..cd1052b3ae 100644 --- a/mf/parmesan18.mf +++ b/mf/parmesan18.mf @@ -1,14 +1,6 @@ -% parmesan18.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 17.82; -input feta-autometric; - -test := 0; - -input parmesan-generic; - - +input parmesan-other-generic; end. - diff --git a/mf/parmesan20.mf b/mf/parmesan20.mf index d14251edce..a7e8452c6f 100644 --- a/mf/parmesan20.mf +++ b/mf/parmesan20.mf @@ -1,14 +1,6 @@ -% parmesan20.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 20; -input feta-autometric; - -test := 0; - -input parmesan-generic; - - +input parmesan-other-generic; end. - diff --git a/mf/parmesan23.mf b/mf/parmesan23.mf index 39b643732b..e47b714b5c 100644 --- a/mf/parmesan23.mf +++ b/mf/parmesan23.mf @@ -1,14 +1,6 @@ -% parmesan23.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 22.45; -input feta-autometric; - -test := 0; - -input parmesan-generic; - - +input parmesan-other-generic; end. - diff --git a/mf/parmesan26.mf b/mf/parmesan26.mf index 1be6fb5191..925ceaa8ab 100644 --- a/mf/parmesan26.mf +++ b/mf/parmesan26.mf @@ -1,14 +1,6 @@ -% parmesan26.mf -% part of LilyPond's pretty-but-neat music font +% Produce font files at specified size. design_size := 25.20; -input feta-autometric; - -test := 0; - -input parmesan-generic; - - +input parmesan-other-generic; end. - diff --git a/out/ChangeLog b/out/ChangeLog index b935a5ea39..39e8943c23 100644 --- a/out/ChangeLog +++ b/out/ChangeLog @@ -1 +1 @@ -See http://git.savannah.gnu.org/gitweb/?p=lilypond.git;a=log;h=refs/tags/release/2.18.2-1 +See http://git.savannah.gnu.org/gitweb/?p=lilypond.git;a=log;h=refs/tags/release/2.19.45-1 diff --git a/out/RELEASE-COMMIT b/out/RELEASE-COMMIT index 57bef84424..59c21c17d4 100644 --- a/out/RELEASE-COMMIT +++ b/out/RELEASE-COMMIT @@ -1,100 +1,32 @@ -commit c95f13fce772e23b5ba04fc8ea0c80855b069c24 +commit de765c2d8f941423e0e33ced19b1436e7643277a Author: Phil Holmes -Date: Mon Mar 17 15:29:16 2014 +0000 +Date: Fri Jul 8 13:58:06 2016 +0100 - Release: update news. + Release: bump Welcome versions. -diff --git a/Documentation/web/news-front.itexi b/Documentation/web/news-front.itexi -index 73ced29..f82b56a 100644 ---- a/Documentation/web/news-front.itexi -+++ b/Documentation/web/news-front.itexi -@@ -8,13 +8,53 @@ +diff --git a/ly/Welcome-to-LilyPond-MacOS.ly b/ly/Welcome-to-LilyPond-MacOS.ly +index 417b993..fe8e3b0 100644 +--- a/ly/Welcome-to-LilyPond-MacOS.ly ++++ b/ly/Welcome-to-LilyPond-MacOS.ly +@@ -23,7 +23,7 @@ That's it. For more information, visit http://lilypond.org . - @c used for news about the upcoming release; see CG 10.2 + %} -+@newsItem -+@subsubheading Lilypond 2.18.2 released! @emph{March 23, 2014} -+ -+We are proud to announce the release of GNU LilyPond 2.18.2. -+LilyPond is a music engraving program devoted to producing the -+highest-quality sheet music possible. It brings the aesthetics of -+traditionally engraved music to computer printouts. -+ -+This version provides a number of updates to 2.18.0, including -+updated manuals. We recommend all users to upgrade to this version. -+ -+@newsEnd -+ -+ -+@newsItem -+@subsubheading LilyPond production named BEST EDITION 2014 @emph{March 11, 2014} -+ -+We are thrilled to announce that the new edition of the songs of Oskar -+Fried (1871-1941), published recently by our fellow contributors Urs Liska -+and Janek Warchoł [1], will receive the "Musikeditionspreis BEST EDITION -+2014" of the German Music Publishers' Association [2]! The ceremony will -+take place in a few days at the Frankfurt Musikmesse [3]. -+ -+We congratulate Janek and Urs for gaining such public recognition of -+typographical and editorial excellence of their work. We are also delighted -+to inform you that they intend to make their work available under a Free -+license as soon as the publisher expenses are covered. Please support this -+initiative by buying the printed volume through the publisher [4] or by -+pledging a contribution at the Indiegogo campaign [5]! -+ -+[1] @uref{http://lilypondblog.org/category/fried-songs}@* -+[2] @uref{http://www.best-edition.de}@* -+[3] @uref{https://musik.messefrankfurt.com/frankfurt/en/besucher/events/awards/best_edition.html}@* -+[4] @uref{http://www.sound-rel.de}@* -+[5] @uref{http://igg.me/at/free-fried} -+ -+@newsEnd -+ +-\version "2.19.44" % necessary for upgrading to future LilyPond versions. ++\version "2.19.45" % necessary for upgrading to future LilyPond versions. - @newsItem --@subsubheading Lilypond 2.18.1 released! @emph{February 16, 2013} -+@subsubheading LilyPond 2.19.3 released @emph{March 2, 2014} + \header{ + title = "A scale in LilyPond" +diff --git a/ly/Welcome_to_LilyPond.ly b/ly/Welcome_to_LilyPond.ly +index 6e3e604..cb4128f 100644 +--- a/ly/Welcome_to_LilyPond.ly ++++ b/ly/Welcome_to_LilyPond.ly +@@ -32,7 +32,7 @@ Good luck with LilyPond! Happy engraving. --We are pleased to announce the release of GNU LilyPond 2.18.1. --This has a number of detailed improvements to the previous stable --release, and we recommend upgrading to this stable version. -+We are happy to announce the release of LilyPond 2.19.3. This -+release includes a number of enhancements, and contains -+some work in progress. You will have access to the very latest features, but -+some may be incomplete, and you may encounter bugs and crashes. If you require -+a stable version of Lilypond, we recommend using the 2.18 version. + %} - @newsEnd +-\version "2.19.44" % necessary for upgrading to future LilyPond versions. ++\version "2.19.45" % necessary for upgrading to future LilyPond versions. -diff --git a/Documentation/web/news.itexi b/Documentation/web/news.itexi -index ea3ba36..ec7a73a 100644 ---- a/Documentation/web/news.itexi -+++ b/Documentation/web/news.itexi -@@ -27,6 +27,53 @@ NOTE: - @end ignore - - @newsItem -+@subsubheading LilyPond 2.18.1 @emph{February 16, 2014} -+ -+We have released updated manuals for LilyPond's stable version, 2.18. -+The manuals are now for 2.18.1 and have a number of updates and improvements -+over 2.18.0. There will be a further release of 2.18 in the future (2.18.2), -+and this will include the updates to the manuals as well as some minor -+enhancements to the LilyPond core functionality. -+ -+To summarise the current situation: stable LilyPond application: 2.18.0; -+stable LilyPond manuals: 2.18.1; development for both: 2.19.2. -+ -+@newsEnd -+ -+@newsItem -+@subsubheading LilyPond 2.19.2 released @emph{February 2, 2014} -+ -+We are happy to announce the release of LilyPond 2.19.2. This -+release includes a number of enhancements, and contains -+some work in progress. You will have access to the very latest features, but -+some may be incomplete, and you may encounter bugs and crashes. If you require -+a stable version of Lilypond, we recommend using the 2.18 version. -+ -+@newsEnd -+ + \header{ + title = "A scale in LilyPond" diff --git a/po/ca.po b/po/ca.po index 519b5aaf05..89819f371d 100644 --- a/po/ca.po +++ b/po/ca.po @@ -1,14 +1,31 @@ # Translation of LilyPond. # Copyright (C) 1998--2012 Han-Wen Nienhuys, Jan Nieuwenhuizen # This file is distributed under the same license as the lilypond package. -# Walter Garcia-Fontes , 2013. -# +# Walter Garcia-Fontes , 2013-2015. +# Suggeriments de traducció: +# bar - compàs, també barra quan refereix als límits dels compassos +# beam - barrat +# beat - pulsació +# figured bass - baix continu +# grob - Objecte gràfic (grob = graphic object) +# key signature - armadura +# pitch - to, tonalitat +# prall - mordent invertit (segle XVIII) +# realization - execució +# skip - tercera major +# stem - plica +# step - segona major +# time signature - indicació del compàs +# trill - refilet +# tuplet - grup excedent d'acord amb http://www.termcat.cat/ca/Cercaterm +# typeset - gravar +# typesetter - gravador msgid "" msgstr "" -"Project-Id-Version: lilypond-2.17.96\n" +"Project-Id-Version: lilypond-2.19.26\n" "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n" -"POT-Creation-Date: 2013-11-24 12:14+0000\n" -"PO-Revision-Date: 2013-11-30 19:23+0100\n" +"POT-Creation-Date: 2015-08-27 10:48+0100\n" +"PO-Revision-Date: 2015-11-11 22:27+0100\n" "Last-Translator: Walter Garcia-Fontes \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -35,11 +52,11 @@ msgstr "no s'ha pogut trobar \\begin{document} al document LaTeX" msgid "Running `%s' on file `%s' to detect default page settings.\n" msgstr "S'està executant `%s' al fitxer `%s' per detectar els paràmetres de pàgina predeterminada.\n" -#: book_latex.py:212 book_texinfo.py:228 +#: book_latex.py:219 book_texinfo.py:228 msgid "Unable to auto-detect default settings:\n" msgstr "No es pot detectar automàticament els paràmetres predeterminats:\n" -#: book_latex.py:224 book_texinfo.py:240 +#: book_latex.py:231 book_texinfo.py:240 #, python-format msgid "" "Unable to auto-detect default settings:\n" @@ -48,7 +65,7 @@ msgstr "" "No es pot detectar automàticament els paràmetres per defecte:\n" "%s" -#: book_latex.py:247 +#: book_latex.py:254 msgid "cannot detect textwidth from LaTeX" msgstr "no es pot detectar l'amplada del text de LaTeX" @@ -82,31 +99,31 @@ msgstr "s'ignorarà l'opció ly desconeguda: %s" msgid "Missing files: %s" msgstr "Manquen fitxers: %s" -#: book_snippets.py:651 +#: book_snippets.py:661 #, python-format msgid "Could not overwrite file %s" msgstr "No s'ha pogut sobreescriure el fitxer %s" -#: book_snippets.py:738 +#: book_snippets.py:748 #, python-format msgid "Running through filter `%s'" msgstr "S'està executant a través del filtre `%s'" -#: book_snippets.py:759 +#: book_snippets.py:769 #, python-format msgid "`%s' failed (%d)" msgstr "`%s' ha fallat (%d)" -#: book_snippets.py:760 +#: book_snippets.py:770 msgid "The error log is as follows:" msgstr "El registre d'error és com segueix:" -#: book_snippets.py:880 +#: book_snippets.py:890 #, python-format msgid "Converting MusicXML file `%s'...\n" msgstr "S'està converting el fitxer MusicXML `%s'...\n" -#: book_snippets.py:907 +#: book_snippets.py:917 #, python-format msgid "" "%s: duplicate filename but different contents of original file,\n" @@ -115,7 +132,7 @@ msgstr "" "%s: fitxer duplicat però contingut diferent del fitxer original,\n" "s'està imprimint la diferència respecte el fitxer existent." -#: book_snippets.py:920 +#: book_snippets.py:930 #, python-format msgid "" "%s: duplicate filename but different contents of converted lilypond file,\n" @@ -166,7 +183,7 @@ msgstr "\\textstyle obsolet, nova sintaxi \\key" #: convertrules.py:82 convertrules.py:1856 convertrules.py:2032 #: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801 -#: convertrules.py:3151 convertrules.py:3385 +#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700 msgid "bump version for release" msgstr "fixa la versió per al llançament" @@ -316,7 +333,7 @@ msgid "" "* calls of ly:make-pitch and ly:pitch-alteration\n" "* keySignature settings made with \\property\n" msgstr "" -"El camp d'alteració de to es va multiplicar per 2\n" +"El camp d'alteració de to de l'Scheme es va multiplicar per 2\n" "per donar suport a alteracions de quart de to. Heu d'actualitzar manualment \n" "les següents construccions:\n" "\n" @@ -434,11 +451,11 @@ msgstr "O deseu com a UTF-8 al vostre editor" #: convertrules.py:2154 msgid "warn about auto beam settings" -msgstr "adverteix-me sobre paràmetres per a vírgules automàtiques" +msgstr "adverteix-me sobre paràmetres per a barrat automàtic" #: convertrules.py:2158 msgid "auto beam settings" -msgstr "paràmetres de pliques automàtiques" +msgstr "paràmetres de barrat automàtic" #: convertrules.py:2159 msgid "" @@ -447,7 +464,7 @@ msgid "" "explicitly; 1/4 is no longer multiplied to cover moments 1/2 and 3/4 too.\n" msgstr "" "\n" -"Els paràmetres per a vírgules automàtiques han d'especificar ara\n" +"Els paràmetres per a barres automàtiques han d'especificar ara\n" "explícitament cada moment interessant en un compàs; no es multiplica\n" "més la duració 1/4 per cobrir també duracions d'1/2 i 3/4.\n" @@ -587,7 +604,7 @@ msgstr "Elimineu oldaddlyrics" #: convertrules.py:2820 msgid "" "oldaddlyrics is no longer supported. \n" -" Use addlyrics or lyrsicsto instead.\n" +" Use addlyrics or lyricsto instead.\n" msgstr "" "oldaddlyrics ha deixat d'estar suportat. \n" " Useu en canvi addlyrics o lyrsicsto.\n" @@ -620,8 +637,8 @@ msgid "\\bar \".\" now produces a thick barline.\n" msgstr "\\bar \".\" produeix ara una línia divisòria gruixuda.\n" #: convertrules.py:2849 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" -msgstr "Els paràmetres de discontinuïtat per a lligadures d'expressió i d'unió estan ara a 'dash-details.\n" +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" +msgstr "Els paràmetres de guionet per a lligadures d'expressió i d'unió estan ara a 'dash-definition.\n" #: convertrules.py:2854 msgid "" @@ -834,15 +851,15 @@ msgstr "Ara es gestiona consistent-broken-slope mitjançant crida de retorn de p msgid "input/regression/beam-broken-classic.ly shows how broken beams are now handled.\n" msgstr "input/regression/beam-broken-classic.ly mostra com es gestionen ara les barres dividides.\n" -#: convertrules.py:3369 +#: convertrules.py:3372 msgid "beamExceptions controls whole-measure beaming." msgstr "beamExceptions controla el barrat de compassos complets." -#: convertrules.py:3606 +#: convertrules.py:3609 msgid "Flag.transparent and Flag.color inherit from Stem" msgstr "Flag.transparent i Flag.color s'han heredat de Stem" -#: convertrules.py:3672 +#: convertrules.py:3675 msgid "Staff-padding now controls the distance to the baseline, not the nearest point." msgstr "Staff-padding ara controla la distància de la base, no el punt més proper." @@ -902,7 +919,7 @@ msgstr "El llenguatge no dóna suport als microtons continguts a la peça" #: musicexp.py:491 msgid "Tuplet brackets of curved shape are not correctly implemented" -msgstr "Els claudàtors corbs de grup especial no estan correctament implementats" +msgstr "Els claudàtors corbs de grup excedent no estan correctament implementats" #: musicexp.py:677 #, python-format @@ -932,7 +949,7 @@ msgstr "No es pot convertir l'alteració %s a una expressió lilypond" #. TODO: Handle pieces without a time signature! #: musicxml.py:361 msgid "Senza-misura time signatures are not yet supported!" -msgstr "Els compassos senza-misura no tenen suport encara!" +msgstr "Les indicacions de temps senza-misura no tenen suport encara!" #: musicxml.py:379 msgid "Unable to interpret time signature! Falling back to 4/4." @@ -948,12 +965,12 @@ msgstr "S'ha proporcionat una tonalitat d'alteració d'octava per a una alteraci msgid "Unable to find instrument for ID=%s\n" msgstr "No es pot trobar l'instrument per a l'ID=%s\n" -#: abc2ly.py:1386 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 +#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 #, python-format msgid "%s [OPTION]... FILE" msgstr "%s [OPCIÓ]... FITXER" -#: abc2ly.py:1387 +#: abc2ly.py:1390 #, python-format msgid "" "abc2ly converts ABC music files (see\n" @@ -962,29 +979,29 @@ msgstr "" "abc2ly converteix el fitxer de música ABC\n" "(veure %s) a input LilyPond.\n" -#: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 -#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:181 +#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 +#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184 msgid "show version number and exit" msgstr "mostra el número de versió i surt" -#: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 -#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:160 +#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 +#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163 msgid "show this help and exit" msgstr "mostra aquesta ajuda i surt" -#: abc2ly.py:1401 etf2ly.py:1209 midi2ly.py:1071 +#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071 msgid "write output to FILE" msgstr "escriu el resultat a FITXER" -#: abc2ly.py:1404 +#: abc2ly.py:1407 msgid "be strict about success" msgstr "sigues estricte sobre l'èxit" -#: abc2ly.py:1407 +#: abc2ly.py:1410 msgid "preserve ABC's notion of beams" msgstr "preserva la noció ABC per a les barres" -#: abc2ly.py:1410 +#: abc2ly.py:1413 msgid "suppress progress messages" msgstr "suprimeix els missatges de progrés" @@ -992,11 +1009,11 @@ msgstr "suprimeix els missatges de progrés" #. "Report bugs in English via %s", #. or if there is a LilyPond users list or forum in your language #. "Report bugs in English via %s or in YOUR_LANG via URI" -#: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 -#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:315 +#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 +#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318 #, c-format, python-format msgid "Report bugs via %s" -msgstr "Informa dels errors en anglès via %s" +msgstr "Informeu dels errors en anglès via %s" #: convert-ly.py:47 msgid "" @@ -1044,7 +1061,7 @@ msgid "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS msgstr "Imprimeix els missatges del registre d'acord amb NIVELL DE REGISTRE (NONE, ERROR, WARNING, PROGRESS (per defecte), DEBUG)" #: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181 -#: musicxml2ly.py:2629 main.cc:174 +#: musicxml2ly.py:2629 main.cc:177 msgid "LOGLEVEL" msgstr "NIVELL_DE_REGISTRE" @@ -1076,7 +1093,7 @@ msgid "make a numbered backup [default: filename.ext~]" msgstr "fest una còpia de seguretat numerada: [predeterminat: nom-de-arxiu.ext~]" #: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096 -#: main.cc:183 +#: main.cc:186 msgid "show warranty and copyright" msgstr "mostra la garantia i el copyright" @@ -1097,17 +1114,17 @@ msgstr "S'ha aturat a l'última regla reeixida" msgid "Processing `%s'... " msgstr "S'està processant `%s'... " -#: convert-ly.py:367 +#: convert-ly.py:366 #, python-format msgid "%s: Unable to open file" msgstr "%s: No s'ha pogut determinar la versió. S'ha omès" -#: convert-ly.py:373 +#: convert-ly.py:372 #, python-format msgid "%s: Unable to determine version. Skipping" msgstr "%s: No s'ha pogut determinar la versió. S'ha omès" -#: convert-ly.py:379 +#: convert-ly.py:378 #, python-format msgid "" "%s: Invalid version string `%s' \n" @@ -1116,7 +1133,7 @@ msgstr "" "%s: Versió de cadena de caràcters no vàlida `%s' \n" "Les cadenes de versió vàlides consisteixen de tres números, separats per punts, per exemple `2.8.12'" -#: convert-ly.py:385 +#: convert-ly.py:384 #, python-format msgid "There was %d error." msgid_plural "There were %d errors." @@ -1137,7 +1154,7 @@ msgstr "" "de Coda Music Technology. etf2ly converteix un subconjunt d'ETF a fitxer LilyPond a punt d'usar.\n" #: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659 -#: main.cc:166 main.cc:178 +#: main.cc:169 main.cc:181 msgid "FILE" msgstr "FITXER" @@ -1175,7 +1192,7 @@ msgid "add DIR to include path" msgstr "afegeix DIRECTORI al camí d'inclusió" #: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169 -#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:165 +#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168 msgid "DIR" msgstr "DIRECTORI" @@ -1188,8 +1205,8 @@ msgid "PAD" msgstr "FARCEIX" #: lilypond-book.py:157 -msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)" -msgstr "farceix la part esquerra de la música per alinear la música tot i hi hagi un nombre imparell de compassos (en mm)" +msgid "pad left side of music to align music in spite of uneven bar numbers (in mm)" +msgstr "farceix la part esquerra de la música per alinear la música tot i hi hagi un nombre imparell de compassos (en mm)" #: lilypond-book.py:162 msgid "Print lilypond log messages according to LOGLEVEL" @@ -1322,17 +1339,17 @@ msgstr "S'està processant la inclusió: %s" msgid "Removing `%s'" msgstr "S'està eliminant `%s'" -#: lilypond-book.py:714 +#: lilypond-book.py:727 #, python-format msgid "Setting LilyPond's loglevel to %s" msgstr "S'està establint el nivell de registre de LilyPond a %s" -#: lilypond-book.py:718 +#: lilypond-book.py:731 #, python-format msgid "Setting LilyPond's loglevel to %s (from environment variable LILYPOND_LOGLEVEL)" msgstr "S'està establint el nivell de registre de LilyPond a %s (a partir de la variable d'entorn LILYPOND_LOG_LEVEL)" -#: lilypond-book.py:721 +#: lilypond-book.py:734 msgid "Setting LilyPond's output to --verbose, implied by lilypond-book's setting" msgstr "S'està establint la sortida de LilyPond a --verbose, cosa que està implicada pel paràmetre de configuració lilypond-book" @@ -1364,7 +1381,7 @@ msgstr "Converteix %s a una entrada LilyPond.\n" #: midi2ly.py:1050 msgid "print absolute pitches" -msgstr "mostra les tonalitats absoluts" +msgstr "mostra les tonalitats absolutes" #: midi2ly.py:1052 midi2ly.py:1080 msgid "DUR" @@ -1551,12 +1568,12 @@ msgstr "" #: musicxml2ly.py:2576 msgid "" -"Copyright (c) 2005--2012 by\n" +"Copyright (c) 2005--2015 by\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen and\n" " Reinhold Kainhofer \n" msgstr "" -"Copyright (c) 2005--2012 per\n" +"Copyright (c) 2005--2015 per\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen i\n" " Reinhold Kainhofer \n" @@ -1642,15 +1659,15 @@ msgstr "Sortida a `%s'" msgid "Unable to find input file %s" msgstr "No es pot trobar el fitxer d'entrada %s" -#: website_post.py:125 +#: website_post.py:129 msgid "English" msgstr "Anglès" -#: website_post.py:128 +#: website_post.py:132 msgid "Other languages" msgstr "Altres llengües" -#: website_post.py:129 +#: website_post.py:133 #, python-format msgid "About automatic language selection." msgstr "Sobre selecció automàtica de llengua." @@ -1723,23 +1740,23 @@ msgstr "advertiment suprimit %s" #: accidental-engraver.cc:180 #, c-format msgid "accidental typesetting list must begin with context-name: %s" -msgstr "la llista de tipografia d'accidents ha de començar amb un context-name: %s" +msgstr "la llista de gravat d'accidents ha de començar amb un context-name: %s" -#: accidental-engraver.cc:210 +#: accidental-engraver.cc:207 #, c-format msgid "procedure or context-name expected for accidental rule, found %s" msgstr "s'espera un procediment o un context-name per a la regla d'accidents, s'ha trobat %s" -#: accidental.cc:169 +#: accidental.cc:141 #, c-format msgid "Could not find glyph-name for alteration %s" msgstr "No s'ha pogut trobar glyph-name per a l'alteració %s" -#: accidental.cc:184 +#: accidental.cc:157 msgid "natural alteration glyph not found" msgstr "no s'ha trobat el glif d'alteració natural" -#: all-font-metrics.cc:149 +#: all-font-metrics.cc:159 #, c-format msgid "cannot find font: `%s'" msgstr "no es pot trobar el tipus de lletra: `%s'" @@ -1752,11 +1769,6 @@ msgstr "l'argument \\applycontent no és un procediment" msgid "no heads for arpeggio found?" msgstr "no s'ha trobat el cap per a l'arpegi?" -#: auto-change-iterator.cc:74 change-iterator.cc:72 -#, c-format -msgid "cannot change, already in translator: %s" -msgstr "no es pot canviar, ja està al traductor: %s" - #: axis-group-engraver.cc:149 msgid "Axis_group_engraver: vertical group already has a parent" msgstr "Axis_group_engraver: el grup vertical ja té un pare" @@ -1769,12 +1781,12 @@ msgstr "hi ha dos Axis_group_engravers?" msgid "removing this vertical group" msgstr "s'està eliminant aquest grup vertical" -#: axis-group-interface.cc:714 +#: axis-group-interface.cc:716 #, c-format msgid "\"%s\" is not a valid outside-staff-placement-directive" msgstr "\"%s\" no és una outside-staff-placement-directive vàlida" -#: axis-group-interface.cc:786 +#: axis-group-interface.cc:788 msgid "an outside-staff object should have a direction, defaulting to up" msgstr "un objecte fora del pentagrama hauria de tenir una direcció, s'agafa cap a dalt per defecte" @@ -1793,24 +1805,24 @@ msgstr "barra sense terminar" #: beam-engraver.cc:282 chord-tremolo-engraver.cc:149 msgid "stem must have Rhythmic structure" -msgstr "la vírgula ha de tenir una estructura rítmica" +msgstr "la plica ha de tenir una estructura rítmica" #: beam-engraver.cc:293 msgid "stem does not fit in beam" -msgstr "la vírgula no encaixa amb la barra" +msgstr "la plica no encaixa amb la barra" #: beam-engraver.cc:294 msgid "beam was started here" msgstr "s'ha iniciat una barra aquí" #. We are completely screwed. -#: beam-quanting.cc:839 +#: beam-quanting.cc:850 msgid "no viable initial configuration found: may not find good beam slope" msgstr "no s'ha trobat cap configuració inicial viable: és possible que no es trobi un bon pendent per a la barra" -#: beam.cc:181 +#: beam.cc:183 msgid "removing beam with no stems" -msgstr "s'està eliminant una barra sense vírgules" +msgstr "s'està eliminant una barra sense pliques" #: change-iterator.cc:34 #, c-format @@ -1818,22 +1830,24 @@ msgid "cannot change `%s' to `%s'" msgstr "no es pot canviar `%s' a `%s'" #. FIXME: constant error message. -#: change-iterator.cc:93 +#: change-iterator.cc:67 msgid "cannot find context to switch to" msgstr "no es pot trobar un context per usar-lo per canviar" +#. No enclosing context was found because the iterator's immediate +#. context is the kind that was sought. #. We could change the current translator's id, but that would make #. errors hard to catch. #. #. last->translator_id_string () = get_change #. ()->change_to_id_string (); -#: change-iterator.cc:102 +#: change-iterator.cc:78 #, c-format msgid "not changing to same context type: %s" msgstr "no es canviarà al mateix tipus de context: %s" -#. FIXME: uncomprehensable message -#: change-iterator.cc:106 +#. FIXME: incomprehensible message +#: change-iterator.cc:82 msgid "none of these in my family" msgstr "cap d'aquests a la meva família" @@ -1868,26 +1882,26 @@ msgstr "Coherent_ligature_engraver: s'està configurant `spacing-increment=0.01' msgid "cannot find line breaking that satisfies constraints" msgstr "no es pot trobar un salt de línia que satisfaci les restriccions" -#: context-property.cc:43 +#: context-property.cc:46 msgid "need symbol arguments for \\override and \\revert" msgstr "es necessiten arguments de símbol per a \\override i \\revert" -#: context.cc:149 +#: context.cc:144 #, c-format msgid "cannot find or create new `%s'" msgstr "no es pot trobar o crear nou/nova `%s'" -#: context.cc:228 +#: context.cc:223 #, c-format msgid "cannot find or create `%s' called `%s'" msgstr "no es pot crear `%s' anomenat `%s'" -#: context.cc:425 +#: context.cc:416 #, c-format msgid "cannot find or create: `%s'" msgstr "no es pot trobar o crear: `%s'" -#: context.cc:439 +#: context.cc:430 #, c-format msgid "cannot find or create new Bottom = \"%s\"" msgstr "no es pot trobar el nou Botó = \"%s\"" @@ -1897,20 +1911,20 @@ msgstr "no es pot trobar el nou Botó = \"%s\"" msgid "custos `%s' not found" msgstr "no s'ha trobat l'advertiment de canvi de tonalitat (custos) %s" -#: dispatcher.cc:89 +#: dispatcher.cc:82 msgid "Event class should be a list" msgstr "La classe d'esdeveniment hauria de ser una llista" -#: dispatcher.cc:172 +#: dispatcher.cc:165 #, c-format msgid "Junking event: %s" msgstr "S'està eliminant l'esdeveniment: %s" -#: dispatcher.cc:277 +#: dispatcher.cc:279 msgid "Attempting to remove nonexisting listener." msgstr "S'està intentant eliminar el port d'escolta no existent." -#: dispatcher.cc:303 +#: dispatcher.cc:305 msgid "Already listening to dispatcher, ignoring request" msgstr "Ja s'està escoltant al distribuïdor, s'ignorarà la demanda" @@ -1919,7 +1933,7 @@ msgstr "Ja s'està escoltant al distribuïdor, s'ignorarà la demanda" msgid "dot `%s' not found" msgstr "no s'ha trobat el punt `%s'" -#: dynamic-engraver.cc:168 +#: dynamic-engraver.cc:169 #, c-format msgid "" "unknown crescendo style: %s\n" @@ -1928,7 +1942,7 @@ msgstr "" "estil de crescendo desconegut: %s\n" "es reverteix a forquilla." -#: dynamic-engraver.cc:233 slur-proto-engraver.cc:119 +#: dynamic-engraver.cc:234 slur-proto-engraver.cc:119 #, c-format msgid "unterminated %s" msgstr "%s sense acabar" @@ -1956,22 +1970,22 @@ msgstr "episema sense terminar" msgid "unterminated extender" msgstr "extensor sense terminar" -#: flag.cc:134 +#: flag.cc:133 #, c-format msgid "flag `%s' not found" msgstr "no s'ha trobat l'indicador `%s'" -#: flag.cc:154 +#: flag.cc:153 #, c-format msgid "flag stroke `%s' not found" msgstr "no s'ha trobat indicador de barra `%s'" -#: font-config-scheme.cc:151 font-config.cc:53 +#: font-config-scheme.cc:151 font-config.cc:82 #, c-format msgid "failed adding font directory: %s" msgstr "no s'ha pogut afegir directori de tipus de lletra: %s" -#: font-config-scheme.cc:153 font-config.cc:55 +#: font-config-scheme.cc:153 font-config.cc:84 #, c-format msgid "Adding font directory: %s" msgstr "S'està afegint el directori de tipus de lletra: %s" @@ -1990,7 +2004,17 @@ msgstr "S'està afegint fiter de tipus de lletra: %s" msgid "Initializing FontConfig..." msgstr "S'està iniciant FontConfig..." -#: font-config.cc:58 +#: font-config.cc:70 +#, c-format +msgid "failed to add fontconfig configuration file `%s'" +msgstr "no s'ha pogut afegir el fitxer de configuració del fontconfig '%s'" + +#: font-config.cc:73 +#, c-format +msgid "Adding fontconfig configuration file: %s" +msgstr "S'està afegint el fitxer de configuració del fontconfig: %s" + +#: font-config.cc:86 msgid "Building font database..." msgstr "Se està construint base de dades de tipus de lletra..." @@ -1998,12 +2022,12 @@ msgstr "Se està construint base de dades de tipus de lletra..." msgid "Must be footnote-event." msgstr "Ha de ser un footnote-event." -#: general-scheme.cc:390 +#: general-scheme.cc:403 #, c-format msgid "failed redirecting stderr to `%s'" msgstr "no s'ha pogut redirigir l'error estàndard a `%s'" -#: general-scheme.cc:469 output-ps.scm:48 +#: general-scheme.cc:482 output-ps.scm:48 msgid "Found infinity or nan in output. Substituting 0.0" msgstr "S'ha trobat infinit o nan a la sortida. S'està substituint 0.0" @@ -2054,12 +2078,12 @@ msgstr "Interfície `%s' desconeguda" msgid "Grob `%s' has no interface for property `%s'" msgstr "L'objecte gràfic `%s' no té interfície per a la propietat `%s'" -#: grob-property.cc:35 +#: grob-property.cc:33 #, c-format msgid "%d: %s" msgstr "%d: %s" -#: grob.cc:488 +#: grob.cc:492 #, c-format msgid "ignored infinite %s-offset" msgstr "s'ha ignorat un desplaçament-%s infinit" @@ -2068,7 +2092,7 @@ msgstr "s'ha ignorat un desplaçament-%s infinit" msgid "Asking for broken bound padding at a non-broken bound." msgstr "S'està demanant un farciment trencat a un límit no trencat." -#: hairpin.cc:256 +#: hairpin.cc:257 msgid "decrescendo too small" msgstr "decrescendo massa petit" @@ -2088,7 +2112,7 @@ msgstr "s'està removent el guionet no terminat" msgid "unterminated hyphen; removing" msgstr "guionet sense terminar; s'està removent" -#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108 +#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108 #, c-format msgid "cannot find file: `%s'" msgstr "no es pot trobar el fitxer: `%s'" @@ -2098,11 +2122,11 @@ msgstr "no es pot trobar el fitxer: `%s'" msgid "(search path: `%s')" msgstr "(camí de búsqueda: `%s')" -#: input.cc:138 source-file.cc:178 source-file.cc:193 +#: input.cc:138 source-file.cc:180 source-file.cc:195 msgid "position unknown" msgstr "no es coneix la posició" -#: key-engraver.cc:198 +#: key-engraver.cc:197 msgid "Incomplete keyAlterationOrder for key signature" msgstr "keyAlterationOrder incomplet per a l'armadura" @@ -2143,21 +2167,21 @@ msgstr "s'està ignorant el silenci: la lligadura no pot contenir un silenci" msgid "ligature was started here" msgstr "s'ha iniciat una lligadura aquí" -#: lily-guile.cc:93 +#: lily-guile.cc:94 #, c-format msgid "(load path: `%s')" msgstr "(camí de càrrega: `%s')" -#: lily-guile.cc:412 +#: lily-guile.cc:413 #, c-format msgid "cannot find property type-check for `%s' (%s)." msgstr "no es pot trobar la propietat type-check per a `%s' (%s)." -#: lily-guile.cc:415 +#: lily-guile.cc:416 msgid "perhaps a typing error?" msgstr "potser un error tipogràfic?" -#: lily-guile.cc:422 +#: lily-guile.cc:423 msgid "skipping assignment" msgstr "s'està saltant l'assignació" @@ -2166,20 +2190,33 @@ msgstr "s'està saltant l'assignació" msgid "type check for `%s' failed; value `%s' must be of type `%s'" msgstr "la verificació de tipus per a `%s' ha fallat; el valor `%s' ha de ser de tipus `%s'" -#: lily-lexer.cc:249 +#. Uh oh. unsmob delivered 0, yet +#. unsmob delivers true. This means that unsmob is a +#. matching check from a base class of T, but var is of an +#. incompatible derived type. +#: lily-guile.cc:462 +msgid "Wrong kind of " +msgstr "Tipus incorrecte de " + +#: lily-lexer.cc:251 msgid "include files are not allowed in safe mode" msgstr "no es permet incloure fitxers en mode segur" -#: lily-lexer.cc:276 +#: lily-lexer.cc:278 #, c-format msgid "identifier name is a keyword: `%s'" msgstr "el nom del identificador és una paraula clau: `%s'" -#: lily-lexer.cc:297 lily-lexer.cc:310 +#: lily-lexer.cc:299 lily-lexer.cc:312 #, c-format msgid "%s:EOF" msgstr "%s:EOF" +#: lily-modules.cc:81 +#, c-format +msgid "Uninitialized variable `%s' in module (%s)" +msgstr "Variable no inicialitzada `%s' al mòdul (%s)" + #: lily-parser-scheme.cc:80 #, c-format msgid "Changing working directory to: `%s'" @@ -2200,37 +2237,33 @@ msgstr "no es pot trobar el fitxer inicial: `%s'" msgid "Processing `%s'" msgstr "S'està processant `%s'" -#: lily-parser-scheme.cc:209 +#: lily-parser-scheme.cc:210 msgid "ly:parser-parse-string is only valid with a new parser. Use ly:parser-include-string instead." msgstr "ly:parser-parse-string sols és vàlid amb un analitzador nou. Useu en canvi ly:parser-include-string." -#: lily-parser-scheme.cc:240 +#: lily-parser-scheme.cc:241 msgid "ly:parse-string-expression is only valid with a new parser. Use ly:parser-include-string instead." msgstr "ly:parser-parse-string sols és vàlid amb un analitzador nou. Useu en canvi ly:parser-include-string." -#: lily-parser.cc:107 +#: lily-parser.cc:106 msgid "Parsing..." msgstr "Analitzant..." -#: lookup.cc:181 +#: lookup.cc:178 #, c-format msgid "Not drawing a box with negative dimension, %.2f by %.2f." msgstr "No es dibuixarà una caixa amb dimensió negativa, %.2f per %.2f." -#: lyric-combine-music-iterator.cc:199 +#: lyric-combine-music-iterator.cc:204 msgid "argument of \\lyricsto should contain Lyrics context" msgstr "l'argument de \\lyricsto hauria de contenir un context de lletra" -#: lyric-combine-music-iterator.cc:337 +#: lyric-combine-music-iterator.cc:344 #, c-format -msgid "cannot find Voice `%s'" -msgstr "no es pot trobar la veu `%s'" +msgid "cannot find %s `%s'" +msgstr "no es pot trobar %s `%s'" -#: lyric-engraver.cc:186 -msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." -msgstr "La síl·laba de lletra no té una nota. Useu \\lyricsto o associatedVoice." - -#: main.cc:104 +#: main.cc:106 #, c-format msgid "" "This program is free software. It is covered by the GNU General Public\n" @@ -2243,7 +2276,7 @@ msgstr "" "còpies d'ell sota certes condicions. Crideu-lo com `%s --warranty' per\n" "a més informació.\n" -#: main.cc:110 +#: main.cc:112 msgid "" " This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License as \n" @@ -2275,11 +2308,11 @@ msgstr "" "Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\n" "02111-1307, USA.\n" -#: main.cc:148 +#: main.cc:150 msgid "SYM[=VAL]" msgstr "SYM[=VAL]" -#: main.cc:149 +#: main.cc:151 msgid "" "set Scheme option SYM to VAL (default: #t).\n" "Use -dhelp for help." @@ -2287,41 +2320,45 @@ msgstr "" "estableix l'opció SYM de Scheme a VAL (per defecte: #t).\n" "Useu -dhelp per a ajuda." -#: main.cc:153 +#: main.cc:155 msgid "EXPR" msgstr "EXPR" -#: main.cc:153 +#: main.cc:155 msgid "evaluate scheme code" msgstr "avalua el codi d'esquema" #. Bug in option parser: --output =foe is taken as an abbreviation #. for --output-format. -#: main.cc:156 +#: main.cc:158 msgid "FORMATs" msgstr "FORMATs" -#: main.cc:156 +#: main.cc:158 msgid "dump FORMAT,... Also as separate options:" msgstr "bolca el FORMAT,... També com a opcions separades:" -#: main.cc:157 +#: main.cc:159 msgid "generate PDF (default)" msgstr "genera PDF (predeterminat)" -#: main.cc:158 +#: main.cc:160 msgid "generate PNG" msgstr "genera PNG" -#: main.cc:159 +#: main.cc:161 msgid "generate PostScript" msgstr "genera PostScript" #: main.cc:162 +msgid "generate big PDF files" +msgstr "genera fitxers PDF grans" + +#: main.cc:165 msgid "FIELD" msgstr "CAMP" -#: main.cc:162 +#: main.cc:165 msgid "" "dump header field FIELD to file\n" "named BASENAME.FIELD" @@ -2329,19 +2366,19 @@ msgstr "" "bolca la capçalera al fitxer\n" "anomenat NOMDEBASE.CAMP" -#: main.cc:165 +#: main.cc:168 msgid "add DIR to search path" msgstr "afegeix DIR al camí de búsqueda" -#: main.cc:166 +#: main.cc:169 msgid "use FILE as init file" msgstr "usa FITXER com a fitxer inicial" -#: main.cc:169 +#: main.cc:172 msgid "USER, GROUP, JAIL, DIR" msgstr "USER, GROUP, JAIL, DIR" -#: main.cc:169 +#: main.cc:172 msgid "" "chroot to JAIL, become USER:GROUP\n" "and cd into DIR" @@ -2349,32 +2386,35 @@ msgstr "" "fes un chroot a JAIL, converteix-te en USER:GROUP\n" "i fes un cd a DIR" -#: main.cc:174 +#: main.cc:177 msgid "" "print log messages according to LOGLEVEL. Possible values are:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG." msgstr "" -"imprimeix els missatges del registre d'acord amb NIVELL DE REGISTRE. Els valors\n" -"possibles són: NONE, ERROR, WARNING, BASIC, PROGRESS, (preterminat) i DEBUG." +"imprimeix els missatges del registre d'acord amb NIVELL DE REGISTRE.\n" +"Es valors possibles són: NONE, ERROR, WARNING, BASIC, PROGRESS, INFO\n" +"(preterminat) i DEBUG." -#: main.cc:178 +#: main.cc:181 msgid "write output to FILE (suffix will be added)" msgstr "escriu la sortida a FITXER (s'afegirà el sufix)" -#: main.cc:179 +#: main.cc:182 msgid "relocate using directory of lilypond program" msgstr "relocalitza el directori d'us del programa lilypond" -#: main.cc:180 +#: main.cc:183 msgid "no progress, only error messages (equivalent to loglevel=ERROR)" -msgstr "sense progrés, sols missatges d'error (equivalent a nivell de registre = ERROR)" +msgstr "" +"sense progrés, sols missatges d'error (equivalent a nivell \n" +"de registre = ERROR)" -#: main.cc:182 +#: main.cc:185 msgid "be verbose (equivalent to loglevel=DEBUG)" msgstr "produeix missatges detallats (equivalent a nivell de registre = DEBUG)" #. Do not update the copyright years here, run `make grand-replace' -#: main.cc:261 +#: main.cc:264 #, c-format msgid "" "Copyright (c) %s by\n" @@ -2384,84 +2424,84 @@ msgstr "" "%s i d'altres." #. No version number or newline here. It confuses help2man. -#: main.cc:299 +#: main.cc:302 #, c-format msgid "Usage: %s [OPTION]... FILE..." msgstr "Ús: %s [OPCIÓ]... FITXER..." -#: main.cc:301 +#: main.cc:304 msgid "Typeset music and/or produce MIDI from FILE." -msgstr "Compon tipogràficament la músic i/o produeix MIDI des d'un FITXER." +msgstr "Grava la música i/o produeix MIDI des d'un FITXER." -#: main.cc:303 +#: main.cc:306 msgid "LilyPond produces beautiful music notation." msgstr "LilyPond produeix una notació musical bella." -#: main.cc:305 +#: main.cc:308 #, c-format msgid "For more information, see %s" msgstr "Per a més informació, vegeu %s" -#: main.cc:307 +#: main.cc:310 msgid "Options:" msgstr "Opcions:" -#: main.cc:374 +#: main.cc:377 #, c-format msgid "expected %d arguments with jail, found: %u" msgstr "s'esperava %d arguments amb presó, s'ha trobat: %u" -#: main.cc:388 +#: main.cc:391 #, c-format msgid "no such user: %s" msgstr "no hi ha aquest usuari: %s" -#: main.cc:390 +#: main.cc:393 #, c-format msgid "cannot get user id from user name: %s: %s" msgstr "no es pot recuperar la identitat d'usuari des del nom d'usuari: %s: %s" -#: main.cc:405 +#: main.cc:408 #, c-format msgid "no such group: %s" msgstr "no hi ha aquest grup: %s" -#: main.cc:407 +#: main.cc:410 #, c-format msgid "cannot get group id from group name: %s: %s" msgstr "no es pot recuperar la identitat de grup des del nom de grup: %s: %s" -#: main.cc:415 +#: main.cc:418 #, c-format msgid "cannot chroot to: %s: %s" msgstr "no es pot executar chroot a: %s: %s" -#: main.cc:422 +#: main.cc:425 #, c-format msgid "cannot change group id to: %d: %s" msgstr "no es pot canviar la identitat de grup a: %d: %s" -#: main.cc:428 +#: main.cc:431 #, c-format msgid "cannot change user id to: %d: %s" msgstr "no es pot canviar la identitat d'usuari a: %d: %s" -#: main.cc:434 +#: main.cc:437 #, c-format msgid "cannot change working directory to: %s: %s" msgstr "no es pot canviar el directori de treball a: %s: %s" -#: main.cc:805 +#: main.cc:826 #, c-format msgid "exception caught: %s" msgstr "s'ha capturar una excepció: %s" #. FIXME: constant error message. -#: mark-engraver.cc:156 +#: mark-engraver.cc:150 msgid "rehearsalMark must have integer value" msgstr "la rehearsalMark ha de tenir un valor enter" -#: mark-engraver.cc:162 +#: mark-engraver.cc:156 msgid "mark label must be a markup object" msgstr "l'etiqueta de marca ha de ser un objecte de marcat" @@ -2513,7 +2553,7 @@ msgstr "" msgid "unexpected case fall-through" msgstr "cas quebrat no esperat" -#: midi-control-function-performer.cc:109 staff-performer.cc:152 +#: midi-control-function-performer.cc:107 staff-performer.cc:153 #, c-format msgid "ignoring out-of-range value change for MIDI property `%s'" msgstr "s'ignorarà el canvi de valor fora de rang per a la propietat MIDI `%s'" @@ -2525,7 +2565,7 @@ msgstr "no existeix l'instrument MIDI: `%s'" #: midi-item.cc:179 msgid "Time signature with more than 255 beats. Truncating" -msgstr "Indicació de temps amb més de 255 batecs" +msgstr "Indicació de temps amb més de 255 pulsacions. Es truncarà" #: midi-stream.cc:38 #, c-format @@ -2537,7 +2577,7 @@ msgstr "no es pot obrir per escriptura: %s: %s" msgid "cannot write to file: `%s'" msgstr "no es pot escriure al fitxer: `%s'" -#: minimal-page-breaking.cc:40 paper-score.cc:122 +#: minimal-page-breaking.cc:40 paper-score.cc:116 msgid "Calculating line breaks..." msgstr "S'estan calculant els salts de línia..." @@ -2545,28 +2585,15 @@ msgstr "S'estan calculant els salts de línia..." msgid "Calculating page breaks..." msgstr "S'estan calculant els salts de pàgina..." -#: multi-measure-rest.cc:154 +#: multi-measure-rest.cc:152 msgid "usable-duration-logs must be a non-empty list. Falling back to whole rests." msgstr "els usable-duration-logs han de ser una llista no buida. S'està revertint a silencis de rodona" -#: multi-measure-rest.cc:364 -msgid "Using naive multi measure rest spacing." -msgstr "S'estan usant espaiaments ingenus de silencis amb mesures múltiples." - #: music.cc:150 #, c-format msgid "octave check failed; expected \"%s\", found: \"%s\"" msgstr "ha fallat la verificació d'octava; s'esperava \"%s\", s'ha trobat: \"%s\"" -#: music.cc:219 -msgid "(normalized pitch)" -msgstr "(to normalitzat)" - -#: music.cc:223 -#, c-format -msgid "Transposing %s by %s makes alteration larger than double" -msgstr "Si es transposa %s per %s es fa l'alteració més llarga que el doble" - #: new-fingering-engraver.cc:113 msgid "cannot add text scripts to individual note heads" msgstr "no es poden afegir guions de text a caps de notes individuals" @@ -2579,13 +2606,13 @@ msgstr "no s'ha trobat la posició per a la digitació" msgid "placing below" msgstr "posicionant a sota" -#: note-collision.cc:497 -msgid "ignoring too many clashing note columns" -msgstr "s'ignorarà per un excessiu nombre de columnes de nota en conflicte" +#: note-collision.cc:510 +msgid "this Voice needs a \\voiceXx or \\shiftXx setting" +msgstr "aquesta Veu necessita un paràmetre de configuració \\voiceXx o \\shiftXx" -#: note-column.cc:147 +#: note-column.cc:150 msgid "cannot have note heads and rests together on a stem" -msgstr "no es poden tenir caps de nota i silencis a l'hora a una barra" +msgstr "no es poden tenir caps de nota i silencis a l'hora a una plica" #: note-head.cc:95 #, c-format @@ -2611,22 +2638,22 @@ msgstr "no es pot carregar la taula de tipus de lletra: %s" msgid "FreeType error: %s" msgstr "Error de FreeType: %s" -#: open-type-font.cc:111 +#: open-type-font.cc:115 #, c-format msgid "unsupported font format: %s" msgstr "format de tipus de lletra no suportat: %s" -#: open-type-font.cc:113 +#: open-type-font.cc:117 #, c-format msgid "error reading font file %s: %s" msgstr "s'ha produït un error llegint el fitxer de tipus de lletra %s: %s" -#: open-type-font.cc:188 +#: open-type-font.cc:192 #, c-format msgid "FT_Get_Glyph_Name () Freetype error: %s" msgstr "FT_Get_Glyps_Name () Error de Freetype: %s" -#: open-type-font.cc:336 pango-font.cc:256 +#: open-type-font.cc:340 pango-font.cc:258 #, c-format msgid "FT_Get_Glyph_Name () error: %s" msgstr "Error FT_Get_Glyph_Name (): %s" @@ -2666,95 +2693,96 @@ msgstr "s'està provant amb %d sistemes de pentagrames" msgid "best score for this sys-count: %f" msgstr "millor partitura per a aquest syst-count: %f" -#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:248 -#: paper-score.cc:162 +#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249 +#: paper-score.cc:156 msgid "Drawing systems..." msgstr "S'estan dibuixant els sistemes de pentagrames..." -#: output-def.cc:235 +#: output-def.cc:229 msgid "margins do not fit with line-width, setting default values" msgstr "els marges no concorden amb line-width, s'establiran els valors predeterminats" -#: output-def.cc:242 +#: output-def.cc:236 msgid "systems run off the page due to improper paper settings, setting default values" msgstr "" "els sistemes de pentagrames sobrepassen la pàgina degut a paràmetres\n" "de pàgina incorrectes, s'establiran els valors predeterminats" -#: page-breaking.cc:277 +#: page-breaking.cc:276 msgid "ignoring min-systems-per-page and max-systems-per-page because systems-per-page was set" msgstr "s'ignorarà min-systems-per-page i max-systems-per-page perquè s'ha establert systems-per-page" -#: page-breaking.cc:282 +#: page-breaking.cc:281 msgid "min-systems-per-page is larger than max-systems-per-page, ignoring both values" msgstr "min-systems-per-page és més gran que max-systems-per-page, s'ignoraran ambdós valors" -#: page-layout-problem.cc:402 +#: page-breaking.cc:636 +#, c-format +msgid "page %d has been compressed" +msgstr "s'ha comprimit la pàgina %d " + +#: page-layout-problem.cc:400 msgid "A page layout problem has been initiated that cannot accommodate footnotes." msgstr "S'ha iniciat un problema de disposició de pàgina que no pot acomodar notes a peu de pàgina." -#: page-layout-problem.cc:731 -msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" -msgstr "no es pot ajustar la partitura a la pàgina: s'ha requerit ragged-spacing, però la pàgina estava comprimida" +#: page-layout-problem.cc:729 +msgid "ragged-bottom was specified, but page must be compressed" +msgstr "s'ha especificat ragged-bottom, però s'ha de comprimir la pàgina" -#: page-layout-problem.cc:734 +#: page-layout-problem.cc:732 #, c-format -msgid "cannot fit music on page: overflow is %f" -msgstr "no es pot ajustar la partitura a la pàgina: l'excés és %f" - -#: page-layout-problem.cc:736 -msgid "compressing music to fit" -msgstr "s'està comprimint la partitura perquè encaixi" +msgid "compressing over-full page by %.1f staff-spaces" +msgstr "s'està comprimint la pàgina sobredimensionada per %.1f staff-spaces" -#: page-layout-problem.cc:1199 +#: page-layout-problem.cc:1197 msgid "staff-affinities should only decrease" msgstr "les staff-affinities no haurien de decréixer" -#: page-turn-page-breaking.cc:168 +#: page-turn-page-breaking.cc:169 #, c-format msgid "page-turn-page-breaking: breaking from %d to %d" msgstr "page-turn-page-breaking: saltant de %d a %d" -#: page-turn-page-breaking.cc:217 +#: page-turn-page-breaking.cc:218 msgid "cannot fit the first page turn onto a single page. Consider setting first-page-number to an even number." msgstr "no es pot ajustar el primer salt de pàgina a una pàgina única. Considereu establir first-page-number a un nombre parell." -#: page-turn-page-breaking.cc:230 +#: page-turn-page-breaking.cc:231 #, c-format msgid "Calculating page and line breaks (%d possible page breaks)..." msgstr "S'estan calculant els salts de pàgina i de línia (%d salts de pàgina possibles)..." -#: page-turn-page-breaking.cc:300 +#: page-turn-page-breaking.cc:301 #, c-format msgid "break starting at page %d" msgstr "el salt comença a la pàgina %d" -#: page-turn-page-breaking.cc:301 +#: page-turn-page-breaking.cc:302 #, c-format msgid "\tdemerits: %f" msgstr "\tdemèrits: %f" -#: page-turn-page-breaking.cc:302 +#: page-turn-page-breaking.cc:303 #, c-format msgid "\tsystem count: %d" msgstr "\tquantitat de sistemes de pentagrames: %d" -#: page-turn-page-breaking.cc:303 +#: page-turn-page-breaking.cc:304 #, c-format msgid "\tpage count: %d" msgstr "\tquantitat de pàgines: %d" -#: page-turn-page-breaking.cc:304 +#: page-turn-page-breaking.cc:305 #, c-format msgid "\tprevious break: %d" msgstr "\tsalt anterior: %d" -#: pango-font.cc:245 +#: pango-font.cc:247 #, c-format msgid "no glyph for character U+%0X in font `%s'" msgstr "no hi ha un glif per al caràcter U+%0X al tipus de lletra `%s'" -#: pango-font.cc:272 +#: pango-font.cc:274 #, c-format msgid "" "Glyph has no name, but font supports glyph naming.\n" @@ -2763,21 +2791,21 @@ msgstr "" "El glif no té nom, però el tipus de lletra permet el nomenament de glifs.\n" "S'està ometent el glif U+%0x, fitxer %s" -#: pango-font.cc:322 +#: pango-font.cc:324 #, c-format msgid "no PostScript font name for font `%s'" msgstr "no hi ha un nom de tipus de lletra Postscript per al tipus de lletra `%s'" -#: pango-font.cc:372 +#: pango-font.cc:374 msgid "FreeType face has no PostScript font name" msgstr "La família FreeType no té un nom de tipus de lletra PostScript" -#: paper-book.cc:214 +#: paper-book.cc:200 #, c-format msgid "program option -dprint-pages not supported by backend `%s'" msgstr "l'opció de programa -dprint-pages no té suport al dorsal `%s' " -#: paper-book.cc:233 +#: paper-book.cc:219 #, c-format msgid "program option -dpreview not supported by backend `%s'" msgstr "l'opció del programa -dpreview no està suportada pel dorsal `%s'" @@ -2791,37 +2819,33 @@ msgstr "el salt forçat s'ha cancel·lat per algun altre esdeveniment, hauríeu msgid "Layout output to `%s'..." msgstr "Sortida de disposició a `%s'..." -#: paper-score.cc:134 +#: paper-score.cc:128 #, c-format msgid "Element count %d (spanners %d) " msgstr "Quantitat d'elements %d (expansor %d)" -#: paper-score.cc:138 +#: paper-score.cc:132 msgid "Preprocessing graphical objects..." msgstr "Pre-processant els objectes gràfics..." -#: parse-scm.cc:121 +#: parse-scm.cc:124 msgid "GUILE signaled an error for the expression beginning here" msgstr "GUILE ha senyalat un error per a l'expressió que comença aquí" -#: partial-iterator.cc:45 -msgid "trying to use \\partial after the start of a piece" -msgstr "s'esta provant d'usar \\partial després de l'inici d'una peça" - #: pdf-scheme.cc:65 #, c-format msgid "Conversion of string `%s' to UTF-16be failed: %s" msgstr "La conversió de la cadena de caràcters `%s'a UTF-16be ha fallat: %s" -#: percent-repeat-engraver.cc:147 +#: percent-repeat-engraver.cc:148 msgid "unterminated percent repeat" msgstr "repetició de percentatge sense terminar" -#: performance.cc:54 +#: performance.cc:76 msgid "Track..." msgstr "Pista..." -#: performance.cc:82 +#: performance.cc:126 #, c-format msgid "MIDI output to `%s'..." msgstr "Sortida MIDI a `%s'..." @@ -2847,7 +2871,7 @@ msgstr "no es pot trobar el parèntesi del pedal de piano: `%s'" msgid "no such internal option: %s" msgstr "no hi ha aquesta opció interna: %s" -#: property-iterator.cc:100 +#: property-iterator.cc:115 #, c-format msgid "not a grob name, `%s'" msgstr "no és un nom d'objecte gràfic, `%s'" @@ -2856,25 +2880,25 @@ msgstr "no és un nom d'objecte gràfic, `%s'" msgid "Failed octave check, got: " msgstr "Ha fallat la verificació d'octava, s'ha obtès: " -#: relocate.cc:52 +#: relocate.cc:56 #, c-format msgid "Setting %s to %s" msgstr "S'ha establert %s a %s" #. this warning should only be printed in debug mode! -#: relocate.cc:73 +#: relocate.cc:77 #, c-format msgid "no such file: %s for %s" msgstr "no existeix aquest fitxer: %s per a %s" #. this warning should only be printed in debug mode! #. this warning should only be printed in debug mode -#: relocate.cc:84 relocate.cc:102 +#: relocate.cc:88 relocate.cc:106 #, c-format msgid "no such directory: %s for %s" msgstr "no existeix aquest directori: %s per a %s" -#: relocate.cc:93 +#: relocate.cc:97 #, c-format msgid "%s=%s (prepend)\n" msgstr "%s=%s (anteposa)\n" @@ -2904,7 +2928,7 @@ msgstr "Relocalització: és absolut: argv0=%s\n" msgid "Relocation : from cwd: argv0=%s\n" msgstr "Relocalització : de cwd: argv0=%s\n" -#: relocate.cc:194 +#: relocate.cc:196 #, c-format msgid "" "Relocation: from PATH=%s\n" @@ -2913,69 +2937,65 @@ msgstr "" "Relocalització: de CAMÍ=%s\n" "argv0=%s\n" -#: relocate.cc:220 +#: relocate.cc:222 msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR" msgstr "LILYPONDPREFIX és obsolet, useu LILYPOND_DATADIR" -#: relocate.cc:345 +#: relocate.cc:347 #, c-format msgid "Relocation file: %s" msgstr "Fitxer de relocalització: %s" -#: relocate.cc:349 source-file.cc:65 +#: relocate.cc:351 source-file.cc:65 #, c-format msgid "cannot open file: `%s'" msgstr "no es pot obrir: `%s'" -#: relocate.cc:379 +#: relocate.cc:381 #, c-format msgid "Unknown relocation command %s" msgstr "Ordre desconeguda de relocalització %s" -#: rest-collision-engraver.cc:70 -msgid "rhythmic head is not part of a rhythmic column" -msgstr "el cap rítmic no és part de la columna rítmica" - -#: rest-collision.cc:150 +#: rest-collision.cc:154 msgid "cannot resolve rest collision: rest direction not set" msgstr "no es pot resoldre la col·lisió de silenci: no s'ha establert la direcció del silenci" -#: rest-collision.cc:161 rest-collision.cc:270 +#: rest-collision.cc:165 rest-collision.cc:274 msgid "too many colliding rests" msgstr "massa silencis en col·lisió" -#: rest.cc:240 +#: rest.cc:239 #, c-format msgid "rest `%s' not found" msgstr "no s'ha trobat el silenci `%s'" -#: score-engraver.cc:78 +#: score-engraver.cc:77 #, c-format msgid "cannot find `%s'" msgstr "no es pot trobar `%s'" -#: score-engraver.cc:80 +#: score-engraver.cc:79 msgid "Music font has not been installed properly." msgstr "No s'ha instal·lat adequadament el tipus de lletra de música." -#: score-engraver.cc:82 +#: score-engraver.cc:81 #, c-format msgid "Search path `%s'" msgstr "Camí de búsqueda `%s'" -#: score-engraver.cc:84 +#: score-engraver.cc:83 msgid "Aborting" msgstr "S'està avortant" -#: score.cc:172 +#: score.cc:161 msgid "already have music in score" msgstr "ja hi han notes a la partitura" -#: score.cc:173 +#: score.cc:163 msgid "this is the previous music" msgstr "aquestes són les notes anteriors" -#: score.cc:178 +#: score.cc:169 msgid "errors found, ignoring music expression" msgstr "s'han trobat errors, s'ignorarà el fragment de música" @@ -2988,7 +3008,7 @@ msgstr "no hi ha prou informació per interpretar l'articulació:" msgid " scheme encoding: " msgstr "codificació de l'esquema: " -#: skyline-pair.cc:160 +#: skyline-pair.cc:135 msgid "direction must not be CENTER in ly:skyline-pair::skyline" msgstr "la direcció no pot ser CENTRE a ly:skyline-pair::skyline" @@ -3014,7 +3034,7 @@ msgstr "%s sens una causa" msgid "cannot end %s" msgstr "no es pot finalitzar %s" -#: slur.cc:434 +#: slur.cc:436 #, c-format msgid "Ignoring grob for slur: %s. avoid-slur not set?" msgstr "S'ignorarà l'objecte gràfic per a la lligadura: %s. No s'ha establert avoid-slur?" @@ -3032,41 +3052,35 @@ msgstr "El canal de MIDI està ajustat al voltant" msgid "remapping modulo 16" msgstr "es tornarà a mapejar el mòdul 16" -#: stem-engraver.cc:110 +#: stem-engraver.cc:100 msgid "tremolo duration is too long" msgstr "la duració del trèmolo és massa llarga" -#: stem-engraver.cc:162 +#: stem-engraver.cc:152 #, c-format msgid "adding note head to incompatible stem (type = %d/%d)" -msgstr "s'afegirà un cap de nota a una vírgula incompatible (tipus = %d/%d)" +msgstr "s'afegirà un cap de nota a una plica incompatible (tipus = %d/%d)" -#: stem-engraver.cc:165 +#: stem-engraver.cc:155 msgid "maybe input should specify polyphonic voices" msgstr "potser l'entrada hauria d'especificar veus polifòniques" #: stem.cc:128 msgid "weird stem size, check for narrow beams" -msgstr "dimensió de vírgula estranya, verifiqueu si hi han barres estretes " +msgstr "dimensió de plica estranya, verifiqueu si hi han barres estretes " -#: system.cc:201 +#: system.cc:202 #, c-format msgid "Element count %d" msgstr "Nombre d'elements %d" -#: system.cc:512 +#: system.cc:513 #, c-format msgid "Grob count %d" msgstr "Nombre d'objectes gràfics %d" #. TODO: Also print the arguments of the markup! -#: text-interface.cc:129 -#, c-format -msgid "Cyclic markup detected: %s" -msgstr "S'ha detectat un marcat cíclic: %s" - -#. TODO: Also print the arguments of the markup! -#: text-interface.cc:142 +#: text-interface.cc:139 #, c-format msgid "Markup depth exceeds maximal value of %d; Markup: %s" msgstr "La profunditat del marcat excedeix el valor màxim de %d; Marcat: %s" @@ -3083,11 +3097,11 @@ msgstr "ja hi ha un expansor de text" msgid "unterminated text spanner" msgstr "expansor de text sense terminar" -#: tie-engraver.cc:119 +#: tie-engraver.cc:121 msgid "unterminated tie" msgstr "lligadura sense terminar" -#: tie-engraver.cc:353 +#: tie-engraver.cc:377 msgid "lonely tie" msgstr "lligadura aïllada" @@ -3096,19 +3110,12 @@ msgstr "lligadura aïllada" #. #. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. #. -#: time-signature-engraver.cc:75 +#: time-signature-engraver.cc:95 #, c-format msgid "strange time signature found: %d/%d" msgstr "s'ha trobat una indicació de temps estranya: %d/%d" -#. If there is no such symbol, we default to the numbered style. -#. (Here really with a warning!) -#: time-signature.cc:89 -#, c-format -msgid "time signature symbol `%s' not found; reverting to numbered style" -msgstr "no s'ha trobat el símbol d'indicació de temps `%s'; es revertirà a l'estil numèric" - -#: translator-ctors.cc:65 +#: translator-ctors.cc:68 #, c-format msgid "unknown translator: `%s'" msgstr "traductor desconegut: `%s'" @@ -3118,17 +3125,17 @@ msgstr "traductor desconegut: `%s'" msgid "fatal error. Couldn't find type: %s" msgstr "error fatal. No s'ha pogut trobar el tipus: %s" -#: translator-group.cc:188 +#: translator-group.cc:187 #, c-format msgid "cannot find: `%s'" msgstr "no es pot trobar: `%s'" -#: translator.cc:326 +#: translator.cc:310 #, c-format msgid "Two simultaneous %s events, junking this one" msgstr "Dos esdeveniments simultanis %s, s'eliminarà aquest" -#: translator.cc:327 +#: translator.cc:311 #, c-format msgid "Previous %s event here" msgstr "Esdeveniment %s previ aquí" @@ -3144,7 +3151,7 @@ msgstr "l'índex de tipus de lletra ha de ser no-negatiu, s'usarà l'índex 0" #: tuplet-engraver.cc:110 msgid "No tuplet to end" -msgstr "No s'ha trobat una tupla per finalitzar" +msgstr "No s'ha trobat un grup excedent per finalitzar" #: vaticana-ligature-engraver.cc:400 #, c-format @@ -3193,205 +3200,214 @@ msgstr "també ja hi ha un expansor finalitzat" msgid "giving up" msgstr "es renunciarà" -#: parser.yy:158 parser.yy:172 -msgid "Too much lookahead" -msgstr "Massa cerca anticipada" - -#: parser.yy:441 parser.yy:752 parser.yy:818 +#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248 msgid "bad expression type" msgstr "tipus d'expressió incorrecta" -#: parser.yy:650 parser.yy:1159 +#: parser.yy:859 parser.yy:1458 parser.yy:1503 msgid "not a context mod" msgstr "no és un mod de context" -#: parser.yy:853 -msgid "score expected" -msgstr "s'esperaven notes" +#: parser.yy:1054 +msgid "Missing music in \\score" +msgstr "No hi ha música a \\score" -#: parser.yy:869 +#: parser.yy:1091 msgid "\\paper cannot be used in \\score, use \\layout instead" msgstr "no es pot usar \\paper a \\score, useu en canvi \\layout" -#: parser.yy:893 +#: parser.yy:1126 +msgid "Spurious expression in \\score" +msgstr "Expressió espúria a \\score" + +#: parser.yy:1156 msgid "need \\paper for paper block" msgstr "es necessita \\paper per a un bloc de paper" -#: parser.yy:1033 parser.yy:1055 +#: parser.yy:1331 +msgid "music expected" +msgstr "s'esperaven notes" + +#: parser.yy:1341 parser.yy:1375 msgid "unexpected post-event" msgstr "esdeveniment posterior inesperat" -#: parser.yy:1063 +#: parser.yy:1383 msgid "Ignoring non-music expression" msgstr "S'ignorarà l'expressió que no és musical" -#: parser.yy:1075 parser.yy:2493 -msgid "music expected" -msgstr "s'esperaven notes" - -#: parser.yy:1370 +#: parser.yy:1691 msgid "not a symbol" msgstr "no és un símbol" -#: parser.yy:2182 parser.yy:2296 parser.yy:2309 parser.yy:2318 +#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627 msgid "bad grob property path" msgstr "camí incorrecte de propietat d'element gràfic" -#: parser.yy:2276 +#: parser.yy:2585 msgid "only \\consists and \\remove take non-string argument." msgstr "sols \\consists i \\remove admeten arguments no-textuals." -#: parser.yy:2337 +#: parser.yy:2646 msgid "bad context property path" msgstr "camí incorrecte de propietat de context" -#: parser.yy:2438 +#: parser.yy:2733 msgid "simple string expected" msgstr "s'esperava una cadena simple de caràcters" -#: parser.yy:2456 +#: parser.yy:2750 msgid "symbol expected" msgstr "s'esperava un símbol" -#: parser.yy:2611 +#: parser.yy:2886 msgid "not a rhythmic event" msgstr "no és un esdeveniment rítmic" -#: parser.yy:2685 +#: parser.yy:2936 msgid "post-event expected" msgstr "s'esperava un post-esdeveniment" -#: parser.yy:2694 parser.yy:2699 +#: parser.yy:2945 parser.yy:2950 msgid "have to be in Lyric mode for lyrics" msgstr "s'ha de ser a mode Lyric per a lletres" -#: parser.yy:2767 -msgid "expecting string as script definition" -msgstr "s'esperava una cadena de caràcters per a la definició del fitxer de seqüencies d'ordres" +#: parser.yy:3026 +msgid "expecting string or post-event as script definition" +msgstr "s'esperava una cadena de caràcters o un esdeveniment posterior a la definició de l'script" -#: parser.yy:2875 +#: parser.yy:3130 msgid "not an articulation" msgstr "no és una articulació" -#: parser.yy:2947 parser.yy:2990 +#: parser.yy:3202 parser.yy:3245 msgid "not a duration" msgstr "no és una duració" -#: parser.yy:3007 +#: parser.yy:3266 msgid "bass number expected" msgstr "s'esperava un número de baix" -#: parser.yy:3106 +#: parser.yy:3358 msgid "have to be in Note mode for notes" msgstr "s'ha d'estar en mode Nota per a notes" -#: parser.yy:3166 +#: parser.yy:3397 msgid "have to be in Chord mode for chords" msgstr "s'ha d'estar en mode Acords per a acords" -#: parser.yy:3181 +#: parser.yy:3440 msgid "markup outside of text script or \\lyricmode" msgstr "marcat fora d'un codi font de text o \\lyricmode" -#: parser.yy:3186 +#: parser.yy:3445 msgid "unrecognized string, not in text script or \\lyricmode" msgstr "cadena de text no reconeguda, no s'està en codi font de text o \\lyricmode" -#: parser.yy:3347 parser.yy:3356 +#: parser.yy:3597 parser.yy:3606 msgid "not an unsigned integer" msgstr "no és un enter sense signe" -#: parser.yy:3424 +#: parser.yy:3693 msgid "not a markup" msgstr "no és un marcat" -#: lexer.ll:224 +#: lexer.ll:193 msgid "stray UTF-8 BOM encountered" msgstr "s'ha trobat una marca BOM d'UTF-8 estranya" -#: lexer.ll:227 +#: lexer.ll:196 msgid "Skipping UTF-8 BOM" msgstr "S'ometrà la marca BOM d'UTF-8" -#: lexer.ll:279 +#: lexer.ll:248 #, c-format msgid "Renaming input to: `%s'" msgstr "Es reanomenarà l'entrada a: `%s'" -#: lexer.ll:296 +#: lexer.ll:265 msgid "quoted string expected after \\version" msgstr "cadena de caràcters entrecomillada després de \\version" -#: lexer.ll:300 +#: lexer.ll:269 msgid "quoted string expected after \\sourcefilename" msgstr "s'esperava una cadena entrecomillada de caràcters després de \\sourcefilename" -#: lexer.ll:304 +#: lexer.ll:273 msgid "integer expected after \\sourcefileline" msgstr "s'esperava un nombre enter després de \\sourcefileline" -#: lexer.ll:331 +#: lexer.ll:300 msgid "\\maininput not allowed outside init files" msgstr "no es permet \\maininput fora de fitxers d'inici" -#: lexer.ll:355 +#: lexer.ll:324 #, c-format msgid "wrong or undefined identifier: `%s'" msgstr "identificador incorrecte o sense definir: `%s'" -#: lexer.ll:381 +#: lexer.ll:349 msgid "string expected after \\include" msgstr "s'esperava una cadena de caràcters després de \\include" -#: lexer.ll:391 +#: lexer.ll:359 msgid "end quote missing" msgstr "cometa de tancament no present" -#: lexer.ll:743 +#: lexer.ll:714 msgid "EOF found inside a comment" msgstr "S'ha trobat EOF (final de fitxer) a dins d'un comentari" -#: lexer.ll:748 +#: lexer.ll:719 msgid "EOF found inside string" msgstr "S'ha trobat EOF a dins d'un comentari" -#: lexer.ll:763 +#: lexer.ll:734 msgid "Unfinished main input" msgstr "Entrada principal sense terminar" -#: lexer.ll:834 +#: lexer.ll:805 #, c-format msgid "invalid character: `%s'" msgstr "caràcter no vàlid: `%s'" -#: lexer.ll:963 +#: lexer.ll:925 #, c-format msgid "unknown escaped string: `\\%s'" msgstr "cadena escapada de caràcters desconeguda: `\\%s'" -#: lexer.ll:983 +#: lexer.ll:945 #, c-format msgid "undefined character or shorthand: %s" msgstr "caràcter no definit o abreviació taquigràfica: %s" -#: lexer.ll:1275 +#: lexer.ll:1236 msgid "non-UTF-8 input" msgstr "entrada no UTF-8" -#: lexer.ll:1319 +#: lexer.ll:1280 +#, c-format +msgid "Invalid version string \"%s\"" +msgstr "Cadena de caràcters \"%s\" de versió no vàlida" + +#: lexer.ll:1285 #, c-format msgid "file too old: %s (oldest supported: %s)" msgstr "fitxer massa antic: %s (el més antic suportat: %s)" -#: lexer.ll:1320 +#: lexer.ll:1286 msgid "consider updating the input with the convert-ly script" msgstr "considereu d'actualitzar l'entrada amb una seqüència d'ordres convert-ly" -#: lexer.ll:1326 +#: lexer.ll:1292 #, c-format msgid "program too old: %s (file requires: %s)" msgstr "el programa és massa antic: %s (el fitxer requereix: %s)" +#: auto-beam.scm:147 +msgid "Beam end fits no pattern" +msgstr "El final de la barra no s'ajusta a cap patró" + #: backend-library.scm:27 #, scheme-format msgid "Invoking `~a'..." @@ -3402,24 +3418,34 @@ msgstr "Invocant `~a'..." msgid "`~a' failed (~a)\n" msgstr "`~a' ha fallat (~a)\n" -#: backend-library.scm:93 +#: backend-library.scm:108 #, scheme-format msgid "Converting to `~a'...\n" msgstr "S'està convertint a `~a'...\n" #. Do not try to guess the name of the png file, #. GS produces PNG files like BASE-page%d.png. -#: backend-library.scm:102 +#: backend-library.scm:118 #, scheme-format msgid "Converting to ~a..." msgstr "S'està convertint a ~a..." -#: backend-library.scm:140 +#: backend-library.scm:134 +#, scheme-format +msgid "Copying to `~a'...\n" +msgstr "S'està copiant a `~a'...\n" + +#: backend-library.scm:200 +#, scheme-format +msgid "Deleting `~a'...\n" +msgstr "S'està esborrant `~a'...\n" + +#: backend-library.scm:219 #, scheme-format msgid "Writing header field `~a' to `~a'..." msgstr "S'està escrivint el camp de capçalera `~a' a `~a'..." -#: backend-library.scm:189 +#: backend-library.scm:268 #, scheme-format msgid "missing stencil expression `~S'" msgstr "manca l'expressió de plantilla `~S'" @@ -3460,154 +3486,145 @@ msgstr "Hi ha brossa espúria després d'un acord: ~A" msgid "symbol ~S redefined" msgstr "s'ha redefinit el símbol ~S" -#: define-event-classes.scm:73 +#: define-event-classes.scm:74 #, scheme-format msgid "unknown parent class `~a'" msgstr "classe pare desconeguda `~a'" -#: define-event-classes.scm:107 +#: define-event-classes.scm:108 #, scheme-format msgid "Cannot redefine event class `~S'" msgstr "No es pot redefenir la classe d'esdeveniment `~S'" -#: define-event-classes.scm:109 +#: define-event-classes.scm:110 #, scheme-format msgid "Undefined parent event class `~S'" msgstr "Classe pare d'esdeveniment no definica `~S'" -#: define-markup-commands.scm:1083 +#: define-markup-commands.scm:1098 msgid "no systems found in \\score markup, does it have a \\layout block?" msgstr "no s'han trobat sistemes al marcat \\score, té un bloc \\layout?" -#: define-markup-commands.scm:2847 +#: define-markup-commands.scm:2922 #, scheme-format msgid "Cannot find glyph ~a" msgstr "No es pot trobar l'element gràfic ~a" -#: define-markup-commands.scm:3273 +#: define-markup-commands.scm:3398 #, scheme-format msgid "no brace found for point size ~S " msgstr "no s'ha trobat una clau per a la dimensió de punt ~S" -#: define-markup-commands.scm:3274 +#: define-markup-commands.scm:3399 #, scheme-format msgid "defaulting to ~S pt" msgstr "es torna al valor predeterminat de ~S pt" -#: define-markup-commands.scm:3526 +#: define-markup-commands.scm:3643 #, scheme-format msgid "not a valid duration string: ~a" msgstr "no és una cadena de caràcters de duració vàlida: ~a" -#: define-markup-commands.scm:3737 +#: define-markup-commands.scm:3854 #, scheme-format msgid "not a valid duration string: ~a - ignoring" msgstr "no és una cadena de caràcters de duració vàlida: ~a - s'ignorarà" -#: define-music-types.scm:792 +#: define-music-types.scm:803 #, scheme-format msgid "symbol expected: ~S" msgstr "s'esperava un símbol: ~S" -#: define-music-types.scm:795 +#: define-music-types.scm:806 #, scheme-format msgid "cannot find music object: ~S" msgstr "no es pot trobar l'objecte de música: ~S" -#: define-music-types.scm:815 +#: define-music-types.scm:826 #, scheme-format msgid "bad make-music argument: ~S" msgstr "argument de fer música incorrecte: ~S" -#: define-music-types.scm:827 -#, scheme-format -msgid "unknown repeat type `~S'" -msgstr "tipus de repetició desconegut `~S'" - -#: define-music-types.scm:828 -msgid "See define-music-types.scm for supported repeats" -msgstr "Vegeu define-music-types.scm per a repeticions suportades" - -#: define-note-names.scm:972 +#: define-note-names.scm:1000 msgid "Select note names language." msgstr "Seleccioneu l'idioma dels noms de les notes." -#: define-note-names.scm:978 +#: define-note-names.scm:1006 #, scheme-format msgid "Using `~a' note names..." msgstr "S'estan usant els noms de notes `~a'..." -#: define-note-names.scm:981 +#: define-note-names.scm:1009 #, scheme-format msgid "Could not find language `~a'. Ignoring." msgstr "No s'ha pogut trobar l'idioma `~a'. S'ignorarà." -#: document-backend.scm:132 +#: document-backend.scm:135 #, scheme-format msgid "pair expected in doc ~s" msgstr "s'esperava un parell al document ~s" -#: document-backend.scm:189 +#: document-backend.scm:202 #, scheme-format msgid "cannot find interface for property: ~S" msgstr "no es pot trobar una interfície per a la propietat: ~S" -#: document-backend.scm:199 +#: document-backend.scm:212 #, scheme-format msgid "unknown Grob interface: ~S" msgstr "interfície Grob desconeguda: ~S" -#: documentation-lib.scm:59 +#: documentation-lib.scm:62 #, scheme-format msgid "Processing ~S..." msgstr "S'està processant ~S..." -#: documentation-lib.scm:176 +#: documentation-lib.scm:178 #, scheme-format msgid "Writing ~S..." msgstr "S'està escrivint ~S..." -#: documentation-lib.scm:188 +#: documentation-lib.scm:190 #, scheme-format msgid "cannot find description for property `~S' (~S)" msgstr "no es pot trobar una descripció per a la propietat `~S' (~S)" -#: documentation-lib.scm:209 +#: documentation-lib.scm:211 #, scheme-format msgid "cannot find description for property ~S (~S)" msgstr "no es pot trobar una descripció per a la propietat ~S (~S)" -#: flag-styles.scm:162 +#: flag-styles.scm:155 #, scheme-format msgid "flag stroke `~a' or `~a' not found" msgstr "no s'ha trobat l'indicador de contorn `~a' o `~a'" -#: framework-eps.scm:108 +#: framework-eps.scm:112 #, scheme-format msgid "Writing ~a..." msgstr "S'està escrivint ~a..." -#: framework-ps.scm:250 +#: framework-ps.scm:281 #, scheme-format msgid "cannot embed ~S=~S" msgstr "no es pot incloure ~S=~S" -#: framework-ps.scm:293 +#: framework-ps.scm:324 #, scheme-format msgid "cannot extract file matching ~a from ~a" msgstr "no es pot extraure el fitxer que faci coincidir ~a de ~a" -#: framework-ps.scm:311 +#: framework-ps.scm:342 #, scheme-format msgid "do not know how to embed ~S=~S" msgstr "no hi ha prou informació per incloure ~S=~S" -#: framework-ps.scm:336 +#: framework-ps.scm:367 #, scheme-format msgid "do not know how to embed font ~s ~s ~s" msgstr "no hi ha prou informació per incloure el tipus de lletra ~s ~s ~s" -#: framework-ps.scm:687 +#: framework-ps.scm:723 msgid "" "\n" "The PostScript backend does not support the\n" @@ -3668,7 +3685,7 @@ msgstr "No es pot trobar el context-def \\~a" msgid "Music unsuitable for output-def" msgstr "La música no és apropiada per a output-def" -#: lily-library.scm:884 +#: lily-library.scm:904 msgid "" "Find the index between @var{start} and @var{end} (an integer)\n" "which produces the closest match to @var{target-val} if\n" @@ -3678,51 +3695,51 @@ msgstr "" "que produeix la coincidència més propera a @var{target-val} si\n" "s'aplica a la funció @var{getter}." -#: lily-library.scm:955 +#: lily-library.scm:998 #, scheme-format msgid "unknown unit: ~S" msgstr "unitat desconeguda: ~S" -#: lily-library.scm:980 +#: lily-library.scm:1023 #, scheme-format msgid "no \\version statement found, please add~afor future compatibility" msgstr "no s'ha trobat la declaració \\version, sisplau afegiu ~a per a compatibilitat futura" -#: lily.scm:75 +#: lily.scm:93 msgid "call-after-session used after session start" msgstr "s'ha usat call-after-session després de l'inici de la sessió" -#: lily.scm:93 +#: lily.scm:111 msgid "define-session used after session start" msgstr "s'ha usat define-session després de l'inici de la sessió" -#: lily.scm:393 +#: lily.scm:417 msgid "Using (ice-9 curried-definitions) module\n" msgstr "Usant el mòdul (ice-9 curried-definitions)\n" -#: lily.scm:396 +#: lily.scm:420 msgid "Guile 1.8\n" msgstr "Guile 1.8\n" -#: lily.scm:455 +#: lily.scm:477 #, scheme-format msgid "cannot find: ~A" msgstr "no es pot trobar ~A" -#: lily.scm:878 +#: lily.scm:903 msgid "Success: compilation successfully completed" msgstr "Èxit: s'ha completat amb èxit la compilació" -#: lily.scm:879 +#: lily.scm:904 msgid "Compilation completed with warnings or errors" msgstr "La compilació s'ha completat amb advertiments i errors" -#: lily.scm:940 +#: lily.scm:965 #, scheme-format msgid "job ~a terminated with signal: ~a" msgstr "la tasca ~a ha acabat amb senyal: ~a" -#: lily.scm:943 +#: lily.scm:968 #, scheme-format msgid "" "logfile ~a (exit ~a):\n" @@ -3731,36 +3748,31 @@ msgstr "" "fitxer de registre ~a (sortida ~a):\n" "~a" -#: lily.scm:965 lily.scm:1054 +#: lily.scm:990 lily.scm:1079 #, scheme-format msgid "failed files: ~S" msgstr "fitxers que han fallat: ~S" -#: lily.scm:1045 +#: lily.scm:1070 #, scheme-format msgid "Redirecting output to ~a..." msgstr "S'està redirigint la sortida a ~a..." -#: lily.scm:1064 ps-to-png.scm:66 +#: lily.scm:1089 #, scheme-format msgid "Invoking `~a'...\n" msgstr "S'està invocant `~a'...\n" -#: ly-syntax-constructors.scm:66 +#: ly-syntax-constructors.scm:27 #, scheme-format msgid "~a function cannot return ~a" msgstr "la funció ~a no pot retornar ~a" -#: ly-syntax-constructors.scm:75 +#: ly-syntax-constructors.scm:60 #, scheme-format msgid "wrong type for argument ~a. Expecting ~a, found ~s" msgstr "tipus incorrecte per a l'argument ~a. S'esperava ~a, s'ha trobat ~s" -#: ly-syntax-constructors.scm:199 -#, scheme-format -msgid "Invalid property operation ~a" -msgstr "Operació de propietat invàlida ~a" - #: markup-macros.scm:331 #, scheme-format msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" @@ -3800,58 +3812,87 @@ msgstr "la tonalitat a invertir no està a l'escala; s'ignorarà" msgid "negative replication count; ignoring" msgstr "nombre negatiu de replicacions; s'ignorarà" -#: music-functions.scm:272 -msgid "More alternatives than repeats. Junking excess alternatives" -msgstr "Hi ha més alternatives que repeticions. S'eliminaran les alternatives excessives" - -#: music-functions.scm:303 +#: music-functions.scm:319 #, scheme-format msgid "invalid tremolo repeat count: ~a" msgstr "nombre de repeticions de trèmolo invàlid: ~a" -#: music-functions.scm:459 +#: music-functions.scm:348 +#, scheme-format +msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo" +msgstr "tipus de repetició `~S' desconegut: ha de ser volta, desplegament, percentatge o trémolo" + +#: music-functions.scm:352 +msgid "More alternatives than repeats. Junking excess alternatives" +msgstr "Hi ha més alternatives que repeticions. S'eliminaran les alternatives excessives" + +#: music-functions.scm:487 #, scheme-format msgid "bad grob property path ~a" msgstr "Operació de propietat d'element gràfic invàlida ~a" -#: music-functions.scm:753 +#: music-functions.scm:511 +#, scheme-format +msgid "bad context property ~a" +msgstr "propietat de context incorrecta ~a" + +#: music-functions.scm:534 +#, scheme-format +msgid "bad music property ~a" +msgstr "propietat de música incorrecta ~a" + +#: music-functions.scm:840 msgid "Bad chord repetition" msgstr "Repetició d'acord incorrecte" -#: music-functions.scm:788 +#: music-functions.scm:945 #, scheme-format msgid "music expected: ~S" msgstr "s'esperaven notes: ~S" -#: music-functions.scm:1144 +#: music-functions.scm:1295 #, scheme-format msgid "cannot find quoted music: `~S'" msgstr "no es poden trobar les notes citades: `~S'" -#: music-functions.scm:1282 +#: music-functions.scm:1432 msgid "Add @var{octave-shift} to the octave of @var{pitch}." msgstr "Afegeix @var{octave-shift} a l'octava de @var{pitch}." -#: music-functions.scm:1342 +#: music-functions.scm:1495 #, scheme-format msgid "Unknown octaveness type: ~S " msgstr "Tipus d'octavació desconegut: ~S " -#: music-functions.scm:1343 +#: music-functions.scm:1496 msgid "Defaulting to 'any-octave." msgstr "Es revertirà per defecte a 'any-octave'." -#: music-functions.scm:1688 +#: music-functions.scm:1888 #, scheme-format msgid "unknown accidental style: ~S" msgstr "estil desconegut d'accidents: ~S" -#: output-ps.scm:278 output-svg.scm:539 +#: music-functions.scm:2098 +msgid "Missing duration" +msgstr "Duració absent" + +#: music-functions.scm:2626 +#, scheme-format +msgid "not a symbol list: ~a" +msgstr "no és una llista de símbols: ~a" + +#: music-functions.scm:2629 +#, scheme-format +msgid "conflicting tag group ~a" +msgstr "grup de etiquetes en conflicte ~a" + +#: output-ps.scm:290 output-svg.scm:539 #, scheme-format msgid "unknown line-cap-style: ~S" msgstr "line-join-style desconegut: ~S" -#: output-ps.scm:283 output-svg.scm:545 +#: output-ps.scm:295 output-svg.scm:545 #, scheme-format msgid "unknown line-join-style: ~S" msgstr "line-join-style desconegut: ~S" @@ -3870,89 +3911,94 @@ msgstr "L'element gràfic ha de tenir un valor unicode" msgid "cannot find SVG font ~S" msgstr "No es pot trobar el tipus de lletra SVG ~S" -#: paper.scm:120 +#: paper.scm:121 msgid "set-global-staff-size: not in toplevel scope" msgstr "set-global-staff-size: no a l'àmbit de nivell superior" -#: paper.scm:320 +#: paper.scm:321 #, scheme-format msgid "This is not a \\layout {} object, ~S" msgstr "Aquest no és un objecte \\layout {}, ~S" -#: paper.scm:328 +#: paper.scm:329 #, scheme-format msgid "Unknown paper size: ~a" msgstr "Dimensió de paper desconegut: ~a" #. TODO: should raise (generic) exception with throw, and catch #. that in parse-scm.cc -#: paper.scm:347 +#: paper.scm:348 msgid "Must use #(set-paper-size .. ) within \\paper { ... }" msgstr "S'ha d'usar #(set-paper-size .. ) dins de \\paper { ... }" -#: parser-clef.scm:164 +#: parser-clef.scm:154 #, scheme-format msgid "unknown clef type `~a'" msgstr "tipus de clau desconegut `~a'" -#: parser-clef.scm:165 +#: parser-clef.scm:155 #, scheme-format msgid "supported clefs: ~a" msgstr "claus suportades: ~a" -#: parser-ly-from-scheme.scm:74 +#: parser-ly-from-scheme.scm:73 msgid "error in #{ ... #}" msgstr "error a #{ ... #}" -#: part-combiner.scm:598 +#: part-combiner.scm:894 #, scheme-format msgid "quoted music `~a' is empty" msgstr "les notes citades `~a' estan buides" -#: ps-to-png.scm:70 +#: ps-to-png.scm:72 ps-to-png.scm:75 #, scheme-format -msgid "~a exited with status: ~S" -msgstr "~a ha sortit amb estat: ~S" +msgid "Copying `~a' to `~a'..." +msgstr "S'està copiant a `~a' a `~a'..." + +#: ps-to-png.scm:77 ps-to-png.scm:79 +#, scheme-format +msgid "Deleting `~a'..." +msgstr "S'està esborrant `~a'..." #: to-xml.scm:190 #, scheme-format msgid "assertion failed: ~S" msgstr "ha fallat la declaració: ~S" -#: translation-functions.scm:368 +#: translation-functions.scm:389 #, scheme-format msgid "Negative fret for pitch ~a on string ~a" msgstr "Trast negatiu per a la tonalitat ~a a la corda ~a" -#: translation-functions.scm:371 +#: translation-functions.scm:392 #, scheme-format msgid "Missing fret for pitch ~a on string ~a" msgstr "Falta el trast per a la tonalitat ~a a la corda ~a" -#: translation-functions.scm:414 +#: translation-functions.scm:435 #, scheme-format msgid "No open string for pitch ~a" msgstr "No hi ha una corda oberta per a la tonalitat ~a" -#: translation-functions.scm:429 translation-functions.scm:441 +#: translation-functions.scm:450 translation-functions.scm:462 #, scheme-format msgid "Requested string for pitch requires negative fret: string ~a pitch ~a" msgstr "La corda demanada per a la tonalitat requereix un trast negatiu: corda ~a tonalitat ~a" -#: translation-functions.scm:432 +#: translation-functions.scm:453 msgid "Ignoring string request and recalculating." msgstr "S'està ignorant la corda demanada i s'està recalculant" -#: translation-functions.scm:444 +#: translation-functions.scm:465 msgid "Ignoring note in tablature." msgstr "S'ignorarà la nota a la tablatura" -#: translation-functions.scm:469 +#: translation-functions.scm:490 #, scheme-format msgid "No string for pitch ~a (given frets ~a)" msgstr "No hi ha una corda per a la tonalitat ~a (donats els frets ~a)" -#: translation-functions.scm:574 +#: translation-functions.scm:595 #, scheme-format msgid "" "No label for fret ~a (on string ~a);\n" @@ -3961,6 +4007,66 @@ msgstr "" "No hi ha una etiqueta per al trast ~a (a la corda ~a);\n" "sols s'han proveït ~a etiquetes de trast" +#~ msgid "cannot change, already in translator: %s" +#~ msgstr "no es pot canviar, ja està al traductor: %s" + +#~ msgid "Invalid property operation ~a" +#~ msgstr "Operació de propietat invàlida ~a" + +#~ msgid "~a exited with status: ~S" +#~ msgstr "~a ha sortit amb estat: ~S" + +#~ msgid "cannot find Voice `%s'" +#~ msgstr "no es pot trobar la veu `%s'" + +#~ msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." +#~ msgstr "La síl·laba de lletra no té una nota. Useu \\lyricsto o associatedVoice." + +#~ msgid "Using naive multi measure rest spacing." +#~ msgstr "S'estan usant espaiaments ingenus de silencis amb mesures múltiples." + +#~ msgid "(normalized pitch)" +#~ msgstr "(to normalitzat)" + +#~ msgid "Transposing %s by %s makes alteration larger than double" +#~ msgstr "Si es transposa %s per %s es fa l'alteració més llarga que el doble" + +#~ msgid "ignoring too many clashing note columns" +#~ msgstr "s'ignorarà per un excessiu nombre de columnes de nota en conflicte" + +#~ msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" +#~ msgstr "no es pot ajustar la partitura a la pàgina: s'ha requerit ragged-spacing, però la pàgina estava comprimida" + +#~ msgid "cannot fit music on page: overflow is %f" +#~ msgstr "no es pot ajustar la partitura a la pàgina: l'excés és %f" + +#~ msgid "compressing music to fit" +#~ msgstr "s'està comprimint la partitura perquè encaixi" + +#~ msgid "trying to use \\partial after the start of a piece" +#~ msgstr "s'esta provant d'usar \\partial després de l'inici d'una peça" + +#~ msgid "rhythmic head is not part of a rhythmic column" +#~ msgstr "el cap rítmic no és part de la columna rítmica" + +#~ msgid "Cyclic markup detected: %s" +#~ msgstr "S'ha detectat un marcat cíclic: %s" + +#~ msgid "time signature symbol `%s' not found; reverting to numbered style" +#~ msgstr "no s'ha trobat el símbol d'indicació de temps `%s'; es revertirà a l'estil numèric" + +#~ msgid "Too much lookahead" +#~ msgstr "Massa cerca anticipada" + +#~ msgid "score expected" +#~ msgstr "s'esperaven notes" + +#~ msgid "unknown repeat type `~S'" +#~ msgstr "tipus de repetició desconegut `~S'" + +#~ msgid "See define-music-types.scm for supported repeats" +#~ msgstr "Vegeu define-music-types.scm per a repeticions suportades" + #~ msgid "cannot find start of (de)crescendo" #~ msgstr "no es pot trobar l'inici del (de)crescendo" diff --git a/po/cs.po b/po/cs.po index 7abaa3a906..3b8619399d 100644 --- a/po/cs.po +++ b/po/cs.po @@ -583,8 +583,8 @@ msgid "\\bar \".\" now produces a thick barline.\n" msgstr "\\bar \".\" nyní vytváří silnou taktovou čáru.\n" #: convertrules.py:2848 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" -msgstr "Parametry čárky pro legatové obloučky a ligatury jsou nyní v 'dash-details.\n" +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" +msgstr "Parametry čárky pro legatové obloučky a ligatury jsou nyní v 'dash-definition.\n" #: convertrules.py:2853 msgid "" @@ -1046,12 +1046,12 @@ msgstr "Ukázat tuto nápovědu a ukončit" #: musicxml2ly.py:2574 msgid "" -"Copyright (c) 2005--2012 by\n" +"Copyright (c) 2005--2015 by\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen and\n" " Reinhold Kainhofer \n" msgstr "" -"Autorské právo (c) 2005--2012\n" +"Autorské právo (c) 2005--2015\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen a\n" " Reinhold Kainhofer \n" diff --git a/po/da.po b/po/da.po index bc35d60622..bd8c02af9f 100644 --- a/po/da.po +++ b/po/da.po @@ -1,1705 +1,4019 @@ # Danish translation of lilypond -# Copyright (C) 2001 Free Software Foundation, Inc. +# Copyright (C) 2016 Free Software Foundation, Inc. +# This file is distributed under the same license as the lilypond package. # Keld Simonsen , 2001-2002. # Reviewed 2001-09-28 Rune Zedeler +# Joe Hansen , 2015, 2016. +# +# Konventioner: +# alteration -> alteration +# argument -> argument (bedre med parameter?) +# beam -> bjælke +# clef -> nøgle +# deprecate -> foræld/forældet (mÃ¥ske afskriv/afskrevet/misbillig) +# duration -> længde +# glyph -> skrifttegn +# grace note -> forslagstone (siger ordlisten; men er det forslagsnode?) +# key -> toneart +# ligature -> fraseringsbue +# parameter -> parameter +# rest -> pause +# score -> partitur (husk det hedder partitureT) +# skip -> hop eller udelad +# slur -> legatobue +# snippet -> kodestykke (kodestump?) +# spanner -> bro +# stem -> nodehals +# stray -> malplaceret +# tie -> bindebue +# tuplet -> irregulær nodeværdi # msgid "" msgstr "" -"Project-Id-Version: lilypond 1.6.0\n" -"POT-Creation-Date: 2002-08-18 17:05+0200\n" -"PO-Revision-Date: 2003-01-17 21:00+0200\n" -"Last-Translator: Keld Simonsen \n" -"Language-Team: Danish \n" +"Project-Id-Version: lilypond 2.19.26\n" +"Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n" +"POT-Creation-Date: 2015-08-27 10:48+0100\n" +"PO-Revision-Date: 2016-01-10 21:00+0200\n" +"Last-Translator: Joe Hansen \n" +"Language-Team: Danish \n" +"Language: da\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" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: lilypond-book.py:1019 ly2dvi.py:458 ly2dvi.py:491 -#, c-format -msgid "Running %s..." -msgstr "Kør %s..." +#: book_base.py:26 +#, python-format +msgid "file not found: %s" +msgstr "filen blev ikke fundet: %s" -#: ly2dvi.py:118 -msgid "Distributed under terms of the GNU General Public License. It comes with NO WARRANTY." -msgstr "Distribueret under betingelserne i GNU Generelle Offentlige Licens (GLP). Den leveres UDEN NOGEN GARANTIER." +#: book_base.py:164 +msgid "Output function not implemented" +msgstr "Uddatafunktion er ikke implementeret" -#: ly2dvi.py:125 midi2ly.py:148 mup2ly.py:143 update-lily.py:137 input.cc:87 -msgid "warning: " -msgstr "advarsel: " +#: book_latex.py:174 +msgid "cannot find \\begin{document} in LaTeX document" +msgstr "kan ikke finde \\begin{document} i LaTeX-dokument" -#: ly2dvi.py:128 ly2dvi.py:143 midi2ly.py:163 midi2ly.py:1012 midi2ly.py:1081 -#: mup2ly.py:146 mup2ly.py:160 update-lily.py:152 update-lily.py:458 -#: input.cc:92 -msgid "error: " -msgstr "fejl: " +#: book_latex.py:190 +#, python-format +msgid "Running `%s' on file `%s' to detect default page settings.\n" +msgstr "Kører »%s« pÃ¥ filen »%s« for at detektere standardindstillinger for siden.\n" -#: ly2dvi.py:144 midi2ly.py:164 mup2ly.py:161 update-lily.py:153 -msgid "Exiting ... " -msgstr "Afslutter... " +#: book_latex.py:219 book_texinfo.py:228 +msgid "Unable to auto-detect default settings:\n" +msgstr "Kan ikke automatisk detektere standardindstillinger:\n" -#: ly2dvi.py:202 midi2ly.py:222 mup2ly.py:219 update-lily.py:211 -#, c-format -msgid "Usage: %s [OPTION]... FILE" -msgstr "Brug: %s [FLAG]... FIL" +#: book_latex.py:231 book_texinfo.py:240 +#, python-format +msgid "" +"Unable to auto-detect default settings:\n" +"%s" +msgstr "" +"Kan ikke automatisk detektere standardindstillinger:\n" +"%s" + +#: book_latex.py:254 +msgid "cannot detect textwidth from LaTeX" +msgstr "kan ikke detektere tekstbredde fra LaTeX" + +#: book_snippets.py:406 +#, python-format +msgid "deprecated ly-option used: %s=%s" +msgstr "forældet ly-tilvalg brugt: %s=%s" + +#: book_snippets.py:408 +#, python-format +msgid "compatibility mode translation: %s=%s" +msgstr "kompatibilitetstilstandsoversættelse: %s=%s" + +#: book_snippets.py:411 +#, python-format +msgid "deprecated ly-option used: %s" +msgstr "forældet ly-tilvalg brugt: %s" + +#: book_snippets.py:413 +#, python-format +msgid "compatibility mode translation: %s" +msgstr "kompatibilitetstilstandsoversættelse: %s" + +#: book_snippets.py:530 +#, python-format +msgid "ignoring unknown ly option: %s" +msgstr "ignorerer ukendt ly-tilvalg: %s" + +#: book_snippets.py:621 +#, python-format +msgid "Missing files: %s" +msgstr "Mangler filer: %s" + +#: book_snippets.py:661 +#, python-format +msgid "Could not overwrite file %s" +msgstr "Kunne ikke overskrive filen %s" + +#: book_snippets.py:748 +#, python-format +msgid "Running through filter `%s'" +msgstr "Kører igennem filter »%s«" + +#: book_snippets.py:769 +#, python-format +msgid "`%s' failed (%d)" +msgstr "»%s« mislykkedes (%d)" + +#: book_snippets.py:770 +msgid "The error log is as follows:" +msgstr "Fejlloggen ser sÃ¥ledes ud:" -#: ly2dvi.py:206 midi2ly.py:226 mup2ly.py:223 update-lily.py:215 main.cc:166 -msgid "Options:" -msgstr "Flag:" +#: book_snippets.py:890 +#, python-format +msgid "Converting MusicXML file `%s'...\n" +msgstr "Konverterer MusicXMl-filen »%s« ...\n" -#: ly2dvi.py:210 midi2ly.py:230 mup2ly.py:227 update-lily.py:219 main.cc:172 -#, c-format -msgid "Report bugs to %s" +#: book_snippets.py:917 +#, python-format +msgid "" +"%s: duplicate filename but different contents of original file,\n" +"printing diff against existing file." msgstr "" -"Rapportér programfejl til %s\n" -"Rapportér fejl i oversættelsen til " +"%s: duplikeret filnavn men forskelligt indhold for original fil,\n" +"udskriver forskelsfil mod eksisterende fil." -#: ly2dvi.py:238 midi2ly.py:258 mup2ly.py:255 update-lily.py:247 -#, c-format -msgid "Invoking `%s'" -msgstr "Starter \"%s\"" +#: book_snippets.py:930 +#, python-format +msgid "" +"%s: duplicate filename but different contents of converted lilypond file,\n" +"printing diff against existing file." +msgstr "" +"%s: duplikeret filnavn men forskelligt indhold for konverteret lilypond-fil,\n" +"udskriver forskelsfil mod eksisterende fil." + +#. Work around a texi2pdf bug: if LANG=C is not given, a broken regexp is +#. used to detect relative/absolute paths, so the absolute path is not +#. detected as such and this command fails: +#: book_texinfo.py:206 +#, python-format +msgid "Running texi2pdf on file %s to detect default page settings.\n" +msgstr "Kører texi2pdf pÃ¥ filen %s for at detektere standardindstillinger for side.\n" + +#: convertrules.py:13 +#, python-format +msgid "Not smart enough to convert %s." +msgstr "Ikke smart nok til at konvertere %s." + +#: convertrules.py:14 +msgid "Please refer to the manual for details, and update manually." +msgstr "Se venligst manualen for detaljer, og opdater manuelt." + +#: convertrules.py:15 +#, python-format +msgid "%s has been replaced by %s" +msgstr "%s er blevet erstattet af %s" + +#: convertrules.py:25 lilylib.py:136 warn.cc:223 +#, c-format, python-format +msgid "warning: %s" +msgstr "advarsel: %s" + +#: convertrules.py:50 convertrules.py:95 +msgid "\\header { key = concat + with + operator }" +msgstr "\\header { key = concat + with + operator }" + +#: convertrules.py:57 +#, python-format +msgid "deprecated %s" +msgstr "forældet %s" + +#: convertrules.py:66 +msgid "deprecated \\textstyle, new \\key syntax" +msgstr "forældet \\textstyle, ny \\key-syntaks" + +#: convertrules.py:82 convertrules.py:1856 convertrules.py:2032 +#: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801 +#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700 +msgid "bump version for release" +msgstr "bump version for udgivelse" + +#: convertrules.py:98 +msgid "new \\header format" +msgstr "nyt \\header-format" + +#: convertrules.py:125 +msgid "\\translator syntax" +msgstr "\\translator-syntaks" + +#: convertrules.py:176 +msgid "\\repeat NUM Music Alternative -> \\repeat FOLDSTR Music Alternative" +msgstr "\\repeat NUM Music Alternative -> \\repeat FOLDSTR Music Alternative" + +#: convertrules.py:206 convertrules.py:679 convertrules.py:1351 +#: convertrules.py:2318 +#, python-format +msgid "deprecate %s" +msgstr "foræld %s" + +#: convertrules.py:280 +#, python-format +msgid "deprecate %s " +msgstr "foræld %s " + +#: convertrules.py:306 +msgid "new \\notenames format" +msgstr "nyt \\notenames-format" + +#: convertrules.py:322 +msgid "new tremolo format" +msgstr "nyt tremoloformat" + +#: convertrules.py:326 +msgid "Staff_margin_engraver deprecated, use Instrument_name_engraver" +msgstr "Staff_margin_engraver forældet, brug Instrument_name_engraver" + +#: convertrules.py:377 +msgid "change property definition case (eg. onevoice -> oneVoice)" +msgstr "ændr egenskabsdefinitionstilfælde (f.eks. onevoice -> oneVoice)" + +#: convertrules.py:438 +msgid "new \\textscript markup text" +msgstr "ny \\textscript-opmærkningstekst" + +#: convertrules.py:510 +#, python-format +msgid "identifier names: %s" +msgstr "identifikationsnavne: %s" + +#: convertrules.py:549 +msgid "point-and-click argument changed to procedure." +msgstr "peg og klik-argument ændret til procedure." + +#: convertrules.py:591 +msgid "semicolons removed" +msgstr "semikolonner fjernet" + +#. 40 ? +#: convertrules.py:634 +#, python-format +msgid "%s property names" +msgstr "%s-egenskabsnavne" + +#: convertrules.py:704 +msgid "automaticMelismata turned on by default" +msgstr "automaticMelismata aktiveret som standard" + +#: convertrules.py:709 +msgid "automaticMelismata is turned on by default since 1.5.67." +msgstr "automaticMelismata er aktiveret som standard siden 1.5.67." + +#: convertrules.py:943 convertrules.py:1636 convertrules.py:1890 +#: convertrules.py:2135 +#, python-format +msgid "remove %s" +msgstr "fjern %s" + +#: convertrules.py:978 convertrules.py:981 +msgid "cluster syntax" +msgstr "klyngesyntaks" + +#: convertrules.py:988 +msgid "new Pedal style syntax" +msgstr "ny Pedal-stilsyntaks" + +#: convertrules.py:1247 +msgid "" +"New relative mode,\n" +"Postfix articulations, new text markup syntax, new chord syntax." +msgstr "" +"Ny relativ tilstand,\n" +"Postfix-artikulationer, ny tekstopmærkningssyntaks, ny akkordsyntaks." -#: ly2dvi.py:243 midi2ly.py:262 mup2ly.py:260 update-lily.py:251 -#, c-format -msgid "command exited with value %d" -msgstr "kommandoen afsluttede med værdi %d" +#: convertrules.py:1260 +msgid "Remove - before articulation" +msgstr "Fjern - før artikulation" -#: ly2dvi.py:246 midi2ly.py:264 mup2ly.py:263 update-lily.py:253 -msgid "(ignored)" -msgstr "(ignoreret)" +#: convertrules.py:1295 +#, python-format +msgid "%s misspelling" +msgstr "%s stavefejl" -# hær er det spørg om rensning af en temporærkatalog -#: ly2dvi.py:256 midi2ly.py:274 mup2ly.py:273 update-lily.py:263 -#, c-format -msgid "Cleaning %s..." -msgstr "Renser %s..." +#: convertrules.py:1314 +msgid "Swap < > and << >>" +msgstr "Ombyt < > og << >>" + +#: convertrules.py:1317 +msgid "attempting automatic \\figures conversion. Check results!" +msgstr "forsøger automatisk \\figures-konvertering. Kontroller resultater!" -#: ly2dvi.py:330 -msgid "Run LilyPond using LaTeX for titling" +#: convertrules.py:1363 +msgid "Use Scheme code to construct arbitrary note events." +msgstr "Brug Schemekode til at konstruere arbitrære nodehændelser." + +#: convertrules.py:1370 +msgid "" +"use symbolic constants for alterations,\n" +"remove \\outputproperty, move ly:verbose into ly:get-option" msgstr "" +"brug symbolske konstanter for alterationer,\n" +"fjern \\outputproperty, flyt ly:verbose til ly:get-option" -#: ly2dvi.py:334 main.cc:115 -msgid "write Makefile dependencies for every input file" -msgstr "skriv Makefile-afhængigheder for hver inddatafil" +#: convertrules.py:1395 +#, python-format +msgid "" +"\\outputproperty found,\n" +"Please hand-edit, using\n" +"\n" +" \\applyoutput #(outputproperty-compatibility %s '%s )\n" +"\n" +"as a substitution text." +msgstr "" +"\\outputproperty found,\n" +"HÃ¥ndregier venligst, via\n" +"\n" +" \\applyoutput #(outputproperty-compatibility %s '%s )\n" +"\n" +"som en substitutionstekst." -# forklaring af flag -h -#: ly2dvi.py:335 midi2ly.py:98 mup2ly.py:74 update-lily.py:87 main.cc:111 -msgid "this help" -msgstr "denne hjælp" +#: convertrules.py:1407 +msgid "" +"The alteration field of Scheme pitches was multiplied by 2\n" +"to support quarter tone accidentals. You must update the following constructs manually:\n" +"\n" +"* calls of ly:make-pitch and ly:pitch-alteration\n" +"* keySignature settings made with \\property\n" +msgstr "" +"Alteration-feltet for Schemetonehøjder blev ganget med 2\n" +"for at understøtte kvartaltonefortegn. Du skal opdatere de følgende konstruktioner manuelt:\n" +"\n" +"* kald for ly:make-pitch og ly:pitch-alteration\n" +"* keySignature-indstillinger lavet med \\property\n" -#: ly2dvi.py:336 main.cc:113 main.cc:118 -msgid "DIR" -msgstr "KATALOG" +#: convertrules.py:1450 +msgid "removal of automaticMelismata; use melismaBusyProperties instead." +msgstr "fjernelse af automaticMelismata; brug melismaBusyProperties i stedet." -#: ly2dvi.py:336 -msgid "add DIR to LilyPond's search path" -msgstr "tilføj KATALOG til LilyPonds søgesti" +#: convertrules.py:1557 +msgid "\\partcombine syntax change to \\newpartcombine" +msgstr "\\partcombine syntaksændring til \\newpartcombine" -# %s er programmets navn -#: ly2dvi.py:338 -#, c-format -msgid "keep all output, output to directory %s.dir" -msgstr "behold al uddata, udskrivo i kataloget %s.dir" +#: convertrules.py:1582 +msgid "" +"Drum notation changes, Removing \\chordmodifiers, \\notenames.\n" +"Harmonic notes. Thread context removed. Lyrics context removed." +msgstr "" +"Ændringer for trommenotation, Fjerner \\chordmodifiers, \\notenames.\n" +"Harmoniske noder. TrÃ¥dkontekst fjernet. Sangtekstkontekst fjernet." -#: ly2dvi.py:339 -msgid "don't run LilyPond" -msgstr "kør ikke LilyPond" +#: convertrules.py:1586 +msgid "Drums found. Enclose drum notes in \\drummode" +msgstr "Trommer fundet. Vedlæg trommenoder i \\drummode" -#: ly2dvi.py:340 main.cc:116 -msgid "produce MIDI output only" -msgstr "lav kun MIDI-uddata" +#: convertrules.py:1597 convertrules.py:1604 convertrules.py:1615 +#, python-format +msgid "" +"\n" +"%s found. Check file manually!\n" +msgstr "" +"\n" +"%s fundet. Kontroller fil manuelt!\n" -#: ly2dvi.py:341 ly2dvi.py:342 midi2ly.py:100 main.cc:114 main.cc:117 -msgid "FILE" -msgstr "FIL" +#: convertrules.py:1597 +msgid "Drum notation" +msgstr "Trommenotation" -#: ly2dvi.py:341 midi2ly.py:100 -msgid "write ouput to FILE" -msgstr "skriv uddata til FIL" +#: convertrules.py:1656 +msgid "new syntax for property settings:" +msgstr "ny syntaks for egenskabsindstillinger:" + +#: convertrules.py:1682 +msgid "Property setting syntax in \\translator{ }" +msgstr "Egenskabsindstillingssyntaks i \\translator{ }" + +#: convertrules.py:1721 +msgid "Scheme grob function renaming" +msgstr "Scheme grob-funktionsomdøbning" + +#: convertrules.py:1732 convertrules.py:2139 convertrules.py:2143 +#: convertrules.py:2709 +#, python-format +msgid "Use %s\n" +msgstr "Brug %s\n" + +#: convertrules.py:1748 +msgid "More Scheme function renaming" +msgstr "Mere Scheme-funktionsomdøbning" + +#: convertrules.py:1872 +msgid "" +"Page layout has been changed, using paper size and margins.\n" +"textheight is no longer used.\n" +msgstr "" +"Sidelayout er blevet ændret, bruger papirstørrelse og\n" +"margener. Teksthøjde bruges ikke længere.\n" -#: ly2dvi.py:342 -msgid "find pfa fonts used in FILE" -msgstr "find pfa-skrifttyper brugt i FIL" +#: convertrules.py:1958 +msgid "" +"\\foo -> \\foomode (for chords, notes, etc.)\n" +"fold \\new FooContext \\foomode into \\foo." +msgstr "" +"\\foo -> \\foomode (for akkorder, noder, etc.)\n" +"fold \\new FooContext \\foomode til \\foo." -#: ly2dvi.py:344 -msgid "set the resolution of the preview to RES" +#: convertrules.py:1996 +msgid "" +"staff size should be changed at top-level\n" +"with\n" +"\n" +" #(set-global-staff-size )\n" +"\n" msgstr "" +"nodelinjens størrelse skal ændres pÃ¥ topniveau\n" +"med\n" +"\n" +" #(set-global-staff-size )\n" +"\n" + +#: convertrules.py:2016 +msgid "regularize other identifiers" +msgstr "legaliser andre identifikatorer" + +#: convertrules.py:2084 +msgid "\\encoding: smart recode latin1..utf-8. Remove ly:point-and-click" +msgstr "\\encoding: smart recode latin1..utf-8. Fjern ly:point-and-click" + +#: convertrules.py:2095 +msgid "LilyPond source must be UTF-8" +msgstr "LilyPond-kilde skal være UTF-8" -#: ly2dvi.py:345 -msgid "generate PostScript output" -msgstr "lav PostScript-uddata" +#: convertrules.py:2098 +msgid "Try the texstrings backend" +msgstr "Prøv texstrings-motoren" -#: ly2dvi.py:346 -msgid "generate PDF output" -msgstr "lav PDF-uddata" +#: convertrules.py:2101 +#, python-format +msgid "Do something like: %s" +msgstr "Gør noget sÃ¥som: %s" -#: ly2dvi.py:347 -msgid "use pdflatex to generate a PDF output" +#: convertrules.py:2104 +msgid "Or save as UTF-8 in your editor" +msgstr "Eller gem som UTF-8 i dit redigeringsprogram" + +#: convertrules.py:2154 +msgid "warn about auto beam settings" +msgstr "advar om automatiske bjælkeindstillinger" + +#: convertrules.py:2158 +msgid "auto beam settings" +msgstr "automatiske bjælkeindstillinger" + +#: convertrules.py:2159 +msgid "" +"\n" +"Auto beam settings must now specify each interesting moment in a measure\n" +"explicitly; 1/4 is no longer multiplied to cover moments 1/2 and 3/4 too.\n" msgstr "" +"\n" +"Automatiske bjælkeindstillinger skal nu angive hver interessant moment i en\n" +"mÃ¥ling eksplicit; 1/4 bliver ikke længere ganget for ogsÃ¥ at dække 1/2 og 3/4.\n" + +#: convertrules.py:2272 +msgid "verticalAlignmentChildCallback has been deprecated" +msgstr "verticalAlignmentChildCallback er blevet forældet" + +#: convertrules.py:2277 +msgid "Remove callbacks property, deprecate XY-extent-callback." +msgstr "Fjern egenskabsegenskab, foræld XY-extent-callback." + +#: convertrules.py:2298 +msgid "Use grob closures iso. XY-offset-callbacks." +msgstr "Brug grob-luknings-iso. XY-forskydning-tilbagekald." + +#: convertrules.py:2360 +msgid "foobar -> foo-bar for \\paper, \\layout" +msgstr "foobar -> foo-bar for \\paper, \\layout" -#: ly2dvi.py:349 -msgid "make a picture of the first system" +#: convertrules.py:2470 +msgid "deprecate \\tempo in \\midi" +msgstr "misbillig \\tempo i \\midi" + +#: convertrules.py:2523 +msgid "deprecate cautionary-style. Use AccidentalCautionary properties" +msgstr "foræld cautionary-style. Brug AccidentalCautionary-egenskaber" + +#: convertrules.py:2536 +msgid "Rename accidental glyphs, use glyph-name-alist." +msgstr "Omdøb utilsigtede skrifttegn, brug glyph-name-alist." + +#: convertrules.py:2591 +msgid "edge-text settings for TextSpanner" +msgstr "edge-tekst-indstillinger for TextSpanner" + +#: convertrules.py:2592 +#, python-format +msgid "" +"Use\n" +"\n" +"%s" msgstr "" +"Brug\n" +"\n" +"%s" -#: ly2dvi.py:350 -msgid "KEY=VAL" -msgstr "NØGLE=VÆRDI" +#: convertrules.py:2625 +msgid "Use the `alignment-offsets' sub-property of\n" +msgstr "Brug »alignment-offsets« til underegenskab for\n" -#: ly2dvi.py:350 -msgid "change global setting KEY to VAL" -msgstr "ændr global indstilling NØGLE til VÆRDI" +#: convertrules.py:2626 +msgid "NonMusicalPaperColumn #'line-break-system-details\n" +msgstr "NonMusicalPaperColumn #'line-break-system-details\n" -# Førklaring til --verbose (borde være længre) -#: ly2dvi.py:351 midi2ly.py:103 mup2ly.py:77 update-lily.py:91 main.cc:126 -msgid "verbose" -msgstr "udførlig uddata" +#: convertrules.py:2627 +msgid "to set fixed distances between staves.\n" +msgstr "for at sætte fast afstand mellem nodesystemer.\n" -#: ly2dvi.py:352 midi2ly.py:104 mup2ly.py:78 update-lily.py:92 main.cc:125 -msgid "print version number" -msgstr "vis versionsnummer" +#: convertrules.py:2639 +msgid "Use #'style not #'dash-fraction to select solid/dashed lines." +msgstr "Brug #'style ikke #'dash-fraction for at vælge hele/stiplede linjer." -#: ly2dvi.py:353 midi2ly.py:105 mup2ly.py:79 update-lily.py:94 main.cc:127 -msgid "show warranty and copyright" -msgstr "vis garanti og copyright" +#: convertrules.py:2645 +msgid "all settings related to dashed lines" +msgstr "alle indstillinger forbundet med stiplede linjer" -#: ly2dvi.py:448 -#, c-format -msgid "no such setting: `%s'" -msgstr "indstillingen findes ikke: '%s'" +#: convertrules.py:2646 +msgid "Use \\override ... #'style = #'line for solid lines and\n" +msgstr "Brug \\override ... #'style = #'line for hele linjer og\n" -#: ly2dvi.py:508 -#, c-format -msgid "LilyPond crashed (signal %d)." -msgstr "LilyPond gik ned (signal %d)." +#: convertrules.py:2647 +msgid "\t\\override ... #'style = #'dashed-line for dashed lines." +msgstr "\t\\override ... #'style = #'dashed-line for stiplede linjer." -#: ly2dvi.py:509 -msgid "Please submit a bug report to bug-lilypond@gnu.org" +#: convertrules.py:2683 +msgid "" +"metronomeMarkFormatter uses text markup as second argument,\n" +"fret diagram properties moved to fret-diagram-details." msgstr "" +"metronomeMarkFormatter bruger tekstopmærkning som et andet argument,\n" +"fret-diagramegenskaber flyttet til fret-diagram-details." -#: ly2dvi.py:513 -#, c-format -msgid "LilyPond failed on the input file (exit status %d)." +#: convertrules.py:2689 +msgid "metronomeMarkFormatter got an additional text argument.\n" +msgstr "metronomeMarkFormatter fik en ekstra tekstargument.\n" + +#: convertrules.py:2690 +#, python-format +msgid "" +"The function assigned to Score.metronomeMarkFunction now uses the signature\n" +"%s" msgstr "" +"Funktionen tildelt til Score.metronomeMarkFunction bruger nu underskriften\n" +"%s" -#: ly2dvi.py:522 -#, c-format -msgid "Analyzing %s..." -msgstr "Analyserer %s..." +#: convertrules.py:2708 +#, python-format +msgid "%s in fret-diagram properties" +msgstr "%s i fret-diagram-egenskaber" -#: ly2dvi.py:578 -#, c-format -msgid "no LilyPond output found for `%s'" -msgstr "ingen lilyponduddata fundet for '%s'" +#: convertrules.py:2752 +msgid "\\put-adjacent argument order" +msgstr "\\put-adjacent-argumentrækkefølge" -#: ly2dvi.py:618 -#, c-format -msgid "invalid value: `%s'" -msgstr "ugyldig værdi: '%s'" +#: convertrules.py:2753 +msgid "Axis and direction now come before markups:\n" +msgstr "Akse og retning kommer nu før opmærkninger:\n" + +#: convertrules.py:2754 +msgid "\\put-adjacent axis dir markup markup." +msgstr "\\put-adjacent akse mappe opmærkning opmærkning." + +#: convertrules.py:2785 +msgid "re-definition of InnerStaffGroup" +msgstr "ny definition af InnerStaffGroup" + +#: convertrules.py:2790 +msgid "re-definition of InnerChoirStaff" +msgstr "ny definition af InnerChoirStaff" + +#: convertrules.py:2800 +msgid "Syntax changes for \\addChordShape and \\chord-shape" +msgstr "Syntaksændringer for \\addChordShape og \\chord-shape" -#: ly2dvi.py:724 -msgid "LaTeX failed on the output file." +#: convertrules.py:2805 +msgid "stringTuning must be added to addChordShape call.\n" +msgstr "stringTuning skal tilføjes til addChordShape-kald.\n" + +#: convertrules.py:2810 +msgid "stringTuning must be added to chord-shape call.\n" +msgstr "stringTuning skal tilføjes til chord-shape-kald.\n" + +#: convertrules.py:2816 +msgid "Remove oldaddlyrics" +msgstr "Fjern oldaddlyrics" + +#: convertrules.py:2820 +msgid "" +"oldaddlyrics is no longer supported. \n" +" Use addlyrics or lyricsto instead.\n" msgstr "" +"oldaddlyrics er ikke længere understøttet. \n" +" Brug addlyrics eller lyricsto i stedet.\n" -#: ly2dvi.py:726 -msgid "The error log is as follows:" +#: convertrules.py:2826 +msgid "" +"keySignature property not reversed any more\n" +"MIDI 47: orchestral strings -> orchestral harp" msgstr "" +"keySignature-egenskab bliver ikke vendt om længere\n" +"MIDI 47: orkesterstrenge -> orkesterharpe" -#: ly2dvi.py:849 -#, c-format -msgid "not a PostScript file: `%s'" -msgstr "ikke en PostScript fil: '%s'" +#: convertrules.py:2831 +msgid "The alist for Staff.keySignature is no longer in reversed order.\n" +msgstr "Alist for Staff.keySignature er ikke længere i omvendt rækkefølge.\n" -#: ly2dvi.py:865 midi2ly.py:1012 update-lily.py:458 -#, c-format -msgid "getopt says: `%s'" -msgstr "getopt siger: '%s'" +#: convertrules.py:2837 +msgid "" +"\\bar \".\" now produces a thick barline\n" +"ly:hairpin::after-line-breaking -> ly:spanner::kill-zero-spanned-time\n" +"Dash parameters for slurs and ties are now in dash-definition" +msgstr "" +"\\bar \".\" laver nu en tyk bjælkelinje\n" +"ly:hairpin::after-line-breaking -> ly:spanner::kill-zero-spanned-time\n" +"Dash-parametre for legatobuer og bindebuer er nu i dash-definition" -#: ly2dvi.py:948 -msgid "pseudo filter" +#: convertrules.py:2843 +msgid "\\bar \".\" now produces a thick barline.\n" +msgstr "\\bar \".\" fremstiller nu en tyk bjælkelinje.\n" + +#: convertrules.py:2849 +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" +msgstr "Dash-parametre for legatobuer og bindebuer er nu i 'dash-definition.\n" + +#: convertrules.py:2854 +msgid "" +"Autobeaming rules have changed. override-auto-beam-setting and\n" +"revert-auto-beam-setting have been eliminated.\n" +"\\overrideBeamSettings has been added.\n" +"beatGrouping has been eliminated.\n" +"Different settings for vertical layout.\n" +"ly:system-start-text::print -> system-start-text::print\n" +"Beam #'thickness -> Beam #'beam-thickness\n" +"ly:note-head::brew-ez-stencil -> note-head::brew-ez-stencil\n" +"ly:ambitus::print -> ambitus::print\n" +"Explicit dynamics context definition from `Piano centered dynamics'\n" +"template replaced by new `Dynamics' context." +msgstr "" +"Autobeaming-regler har ændret sig. Override-auto-beam-setting og\n" +"revert-auto-beam-setting er blevet elimineret.\n" +"\\overrideBeamSettings er blevet tilføjet.\n" +"beatGrouping er blevet elimineret.\n" +"Forskellige indstillinger for lodret layout.\n" +"ly:system-start-text::print -> system-start-text::print\n" +"Beam #'thickness -> Beam #'beam-thickness\n" +"ly:note-head::brew-ez-stencil -> note-head::brew-ez-stencil\n" +"ly:ambitus::print -> ambitus::print\n" +"Eksplicit dynamisk kontekstdefinition fra »Piano centered dynamics«\n" +"skabelon erstattet af ny »Dynamics«-kontekst." + +#: convertrules.py:2868 +msgid " Autobeam settings are now overriden with \\overrideBeamSettings.\n" +msgstr " Autobeam-indstillinger overskrives nu med \\overrideBeamSettings.\n" + +#: convertrules.py:2873 +msgid " Autobeam settings are now reverted with \\revertBeamSettings.\n" +msgstr " Autobeam-indstillinger ændres nu tilbage med \\revertBeamSettings.\n" + +#: convertrules.py:2879 +msgid "" +" beatGrouping with a specified context must now be accomplished with\n" +" \\overrideBeamSettings.\n" msgstr "" +" beatGrouping med en specificeret kontekst skal nu gennemføres med\n" +" \\overrideBeamSettings.\n" + +#: convertrules.py:2885 +msgid "alignment-offsets has been changed to alignment-distances: you must now specify the distances between staves rather than the offset of staves.\n" +msgstr "alignment-offsets er blevet ændret til alignment-distances: Du skal nu specificere afstandene mellem nodesystemer frem for forskydningen for nodesystemer.\n" -#: ly2dvi.py:951 -msgid "pseudo filter only for single input file" +#: convertrules.py:2896 +msgid "" +"Remove obsolete engravers/translators: Note_swallow_translator,\n" +"Rest_swallow_translator, Skip_event_swallow_translator, Swallow_engraver,\n" +"Swallow_performer and String_number_engraver.\n" +"New vertical spacing variables." msgstr "" +"Fjern forældede gravører/oversætteere: Note_swallow_translator,\n" +"Rest_swallow_translator, Skip_event_swallow_translator, Swallow_engraver,\n" +"Swallow_performer og String_number_engraver.\n" +"Ny lodret afstandsvariabler." -#: ly2dvi.py:980 -#, c-format -msgid "filename should not contain spaces: `%s'" -msgstr "filnavn bør ikke indeholde mellemrum: '%s'" +#: convertrules.py:2927 +msgid "Vertical spacing no longer depends on the Y-extent of a VerticalAxisGroup.\n" +msgstr "Lodret mellemrum er ikke længere afhængig af Y-rækkevidden for en VerticalAxisGroup.\n" -# hær er det spørg om skrivning til en fil -#: ly2dvi.py:1076 input-file-results.cc:67 -#, c-format -msgid "dependencies output to `%s'..." -msgstr "afhængigheder udskrevet til \"%s\"..." +#: convertrules.py:2933 +msgid "Unify fetaNumber and fetaDynamic encodings" +msgstr "Foren fetaNumber- og fetaDynamic-kodninger" -#: ly2dvi.py:1090 ly2dvi.py:1104 includable-lexer.cc:49 -#: input-file-results.cc:187 input-file-results.cc:193 lily-guile.cc:97 -#, c-format -msgid "can't find file: `%s'" -msgstr "kan ikke finde fil: \"%s\"" +#: convertrules.py:2938 +msgid "\\RemoveEmpty*StaffContext -> \\*Staff \\RemoveEmptyStaves" +msgstr "\\RemoveEmpty*StaffContext -> \\*Staff \\RemoveEmptyStaves" -# hær er det spørg om skrivning til en fil (første parametern er t.ex -# DVI, LATEX, MIDI, TEX) -#: ly2dvi.py:1102 midi2ly.py:996 -#, c-format -msgid "%s output to `%s'..." -msgstr "%s udskrevet til \"%s\"..." +#: convertrules.py:2949 +msgid "\\cresc etc. are now postfix operators" +msgstr "\\cresc etc. er nu postfix-operatorer" -#: ly2dvi.py:1111 -msgid "no files specified on command line" -msgstr "ingen filer angivne på kommandolinjen." +#: convertrules.py:2961 +msgid "" +"Eliminate beamSettings, beatLength, \\setBeatGrouping, \\overrideBeamSettings and \\revertBeamSettings.\n" +"\"accordion.accEtcbase\" -> \"accordion.etcbass\"" +msgstr "" +"Eliminer beamSettings, beatLength, \\setBeatGrouping, \\overrideBeamSettings og \\revertBeamSettings.\n" +"\"accordion.accEtcbase\" -> \"accordion.etcbass\"" -#: midi2ly.py:92 -msgid "Convert MIDI to LilyPond source" -msgstr "Konvertér MIDI til LilyPond-klide" +#: convertrules.py:2979 +msgid "Use \\set beamExceptions or \\overrideTimeSignatureSettings.\n" +msgstr "Brug \\set beamExceptions eller \\overrideTimeSignatureSettings.\n" -#: midi2ly.py:95 -msgid "print absolute pitches" +#: convertrules.py:2983 +msgid "Use \\set beamExceptions or \\revertTimeSignatureSettings.\n" +msgstr "Brug \\set beamExceptions eller \\revertTimeSignatureSettings.\n" + +#: convertrules.py:2987 +msgid "Use baseMoment, beatStructure, and beamExceptions.\n" +msgstr "Brug baseMoment, beatStructure og beamExceptions.\n" + +#: convertrules.py:2991 convertrules.py:2995 +msgid "Use baseMoment and beatStructure.\n" +msgstr "Brug baseMoment og beatStructure.\n" + +#: convertrules.py:3000 +msgid "" +"Woodwind diagrams: Move size, thickness, and graphic from argument list to properties.\n" +"Deprecate negative dash-period for hidden lines: use #'style = #'none instead." msgstr "" +"Woodwinddiagrammer: Flyt størrelse, tykkelse og grafik fra argumentliste til egenskaber.\n" +"Foræld negativ dash-period for skjulte linjer: Brug #'style = #'none i stedet for." -#: midi2ly.py:96 midi2ly.py:101 -msgid "DUR" -msgstr "LÆNGDE" +#: convertrules.py:3005 +msgid "Move size, thickness, and graphic to properties. Argument should be just the key list.\n" +msgstr "Flyt størrelse, tykkelse og grafik til egenskaber. Argument skal kun være toneartlisten.\n" -#: midi2ly.py:96 -msgid "quantise note durations on DUR" +#: convertrules.py:3013 +msgid "" +"Rename vertical spacing variables.\n" +"Add fretboard-table argument to savePredefinedFretboard." msgstr "" +"Omdøb lodret afstandsvaribler.\n" +"Tilføj fretboard-table-argument til savePredefinedFretboard." -#: midi2ly.py:97 -msgid "print explicit durations" -msgstr "udskriv eksplicitte længder" +#: convertrules.py:3031 +msgid "Rename vertical spacing grob properties." +msgstr "Omdøb lodret afstandsgrobegenskaber." -#: midi2ly.py:99 -msgid "ALT[:MINOR]" +#: convertrules.py:3047 +msgid "Remove \\paper variables head-separation and foot-separation." +msgstr "Fjern \\paper-varibalerne head-separation og foot-separation." + +#: convertrules.py:3051 +msgid "Adjust settings for top-system-spacing instead.\n" +msgstr "Juster indstillinger for top-system-spacing i stedet for.\n" + +#: convertrules.py:3055 +msgid "Adjust settings for last-bottom-spacing instead.\n" +msgstr "Juster indstillinger for last-bottom-spacing i stedet for.\n" + +#: convertrules.py:3061 +msgid "" +"Rename space to basic-distance in various spacing alists.\n" +"Remove HarmonicParenthesesItem grob." msgstr "" +"Omdøb mellemrum til standardafstand i diverse afstands-alists.\n" +"Fjern HarmonicParenthesesItem-grob." -#: midi2ly.py:99 -msgid "set key: ALT=+sharps|-flats; MINOR=1" -msgstr "sæt toneart: TONE=+forhøjelser/-sænkninger; mol=1" +#: convertrules.py:3068 +msgid "HarmonicParenthesesItem has been eliminated.\n" +msgstr "HarmonicParenthesesItem er blevet elimineret.\n" -#: midi2ly.py:101 -msgid "quantise note starts on DUR" +#: convertrules.py:3069 +msgid "Harmonic parentheses are part of the TabNoteHead grob.\n" +msgstr "Harmoniske parenteser er en del af TabNoteHead-grob.\n" + +#: convertrules.py:3074 +msgid "Remove context from overrideTimeSignatureSettings and revertTimeSignatureSettings.\n" +msgstr "Fjern kontekst fra overrideTimeSignatureSettings og revertTimeSignatureSettings.\n" + +#: convertrules.py:3081 +msgid "" +"Change stringTunings from a list of semitones to a list of pitches.\n" +"Change tenor and baritone ukulele names in string tunings.\n" +"Generate messages for manual conversion of vertical spacing if required." +msgstr "" +"Ændr stringTunings fra en liste semitoner til en liste af tonehøjder.\n" +"Ændr tenor- og baryton-ukulelenavne i strengtuninger.\n" +"Hvis krævet, sÃ¥ opret beskeder for manual konvertering af lodret afstand." + +#: convertrules.py:3124 +msgid "Vertical spacing changes might affect user-defined contexts." +msgstr "Lodret afstandsændringer kan pÃ¥virke brugerdefinerede kontekster." + +#: convertrules.py:3130 +msgid "Replace bar-size with bar-extent." +msgstr "Erstat bar-size med bar-extent." + +#: convertrules.py:3142 +msgid "Woodwind diagrams: Changes to the clarinet diagram." +msgstr "Woodwind-diagrammer: Skifter til klarinetdiagrammet." + +#: convertrules.py:3146 +msgid "Clarinet fingering changed to reflect actual anatomy of instrument.\n" +msgstr "Klarinetfingersætning ændret til at reflektere faktisk anatomi for instrumentet.\n" + +#: convertrules.py:3156 +msgid "Handling of non-automatic footnotes." +msgstr "HÃ¥ndtering af ikke automatiske fodnoter." + +#: convertrules.py:3160 +msgid "If you are using non-automatic footnotes, make sure to set footnote-auto-numbering = ##f in the paper block.\n" +msgstr "Hvis du bruger ikkeautomatiske fodnoter sÃ¥ vær sikker pÃ¥, at footnote-auto-numbering = ##f er angivet i papirblokken.\n" + +#: convertrules.py:3165 +msgid "Change in internal property for MultiMeasureRest" +msgstr "Ændring i intern egenskab for MultiMeasureRest" + +#: convertrules.py:3169 +msgid "This internal property has been replaced by round-up-to-longer-rest, round-up-exceptions and usable-duration-logs.\n" +msgstr "Denne interne egenskab er blevet erstattet af round-up-to-longer-rest, round-up-exceptions og usable-duration-logs.\n" + +#: convertrules.py:3174 +msgid "Creation of a Flag grob and moving of certain Stem properties to this grob" +msgstr "Oprettelse af en Flaggrob og flytning af bestemte nodehalsegenskaber (Stem-egenskaber) til denne grob" + +#: convertrules.py:3210 +msgid "consistent-broken-slope is now handled through the positions callback.\n" +msgstr "consistent-broken-slope hÃ¥ndteres nu via positionstilbagekaldene.\n" + +#: convertrules.py:3211 +msgid "input/regression/beam-broken-classic.ly shows how broken beams are now handled.\n" +msgstr "input/regression/beam-broken-classic.ly viser hvordan ødelagte bjælker nu hÃ¥ndteres.\n" + +#: convertrules.py:3372 +msgid "beamExceptions controls whole-measure beaming." +msgstr "beamExceptions kontrollerer bjælker i hele mÃ¥l." + +#: convertrules.py:3609 +msgid "Flag.transparent and Flag.color inherit from Stem" +msgstr "Flag.transparent og Flag.color arver fra Stem (nodehals)" + +#: convertrules.py:3675 +msgid "Staff-padding now controls the distance to the baseline, not the nearest point." +msgstr "Staff-padding kontrollerer nu afstanden til basislinjen, ikke det nærmeste punkt." + +#: fontextract.py:25 +#, python-format +msgid "Scanning %s" +msgstr "Skanner %s" + +#: fontextract.py:70 +#, python-format +msgid "Extracted %s" +msgstr "Udtrak %s" + +#: fontextract.py:85 +#, python-format +msgid "Writing fonts to %s" +msgstr "Skriver skrifttyper til %s" + +#: lilylib.py:101 +#, python-format +msgid "Setting loglevel to %s" +msgstr "Sætter logniveau til %s" + +#: lilylib.py:104 +#, python-format +msgid "Unknown or invalid loglevel '%s'" +msgstr "Ukendt eller ugyldigt logniveau »%s«" + +#: lilylib.py:133 warn.cc:211 +#, c-format, python-format +msgid "error: %s" +msgstr "fejl: %s" + +#: lilylib.py:190 +#, python-format +msgid "Processing %s.ly" +msgstr "Behandler %s.ly" + +#: lilylib.py:194 lilylib.py:255 +#, python-format +msgid "Invoking `%s'" +msgstr "Starter »%s«" + +#: lilylib.py:196 lilylib.py:257 +#, python-format +msgid "Running %s..." +msgstr "Kør %s..." + +#: lilylib.py:333 +#, python-format +msgid "Usage: %s" +msgstr "Brug: %s" + +#: musicexp.py:224 musicexp.py:229 +msgid "Language does not support microtones contained in the piece" +msgstr "Sprog understøtter ikke mikrotoner indeholdt i stykket" + +#: musicexp.py:491 +msgid "Tuplet brackets of curved shape are not correctly implemented" +msgstr "Irregulære nodeværdiparenteser for kurvede former er ikke korrekt implementeret" + +#: musicexp.py:677 +#, python-format +msgid "unable to set the music %(music)s for the repeat %(repeat)s" +msgstr "kan ikke angive musikken %(music)s for gentagelsen %(repeat)s" + +#: musicexp.py:686 +msgid "encountered repeat without body" +msgstr "mødte gentagelse uden krop" + +#. no self.elements! +#: musicexp.py:856 +#, python-format +msgid "Grace note with no following music: %s" +msgstr "Forslagstone uden nogen følgende musik: %s" + +#: musicexp.py:1018 +#, python-format +msgid "Invalid octave shift size found: %s. Using no shift." +msgstr "Ugyldigt oktavskiftstørrelse fundet: %s. Bruger intet skift." + +#: musicexp.py:1476 +#, python-format +msgid "Unable to convert alteration %s to a lilypond expression" +msgstr "Kunne ikke konvertere alterationen %s til et Lilypond-udtryk" + +#. TODO: Handle pieces without a time signature! +#: musicxml.py:361 +msgid "Senza-misura time signatures are not yet supported!" +msgstr "Tidssignaturer for senza-misura er endnu ikke understøttet!" + +#: musicxml.py:379 +msgid "Unable to interpret time signature! Falling back to 4/4." +msgstr "Kan ikke fortolke tidssignatur! Bruger reserven 4/4." + +#: musicxml.py:435 +#, python-format +msgid "Key alteration octave given for a non-existing alteration nr. %s, available numbers: %s!" +msgstr "Toneartealterationsoktav angivet for en ikkeeksisterende alteration nr. %s, tilgængelige numre: %s!" + +#: musicxml.py:523 +#, python-format +msgid "Unable to find instrument for ID=%s\n" +msgstr "Kan ikke finde instrument for ID=%s\n" + +#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 +#, python-format +msgid "%s [OPTION]... FILE" +msgstr "%s [TILVALG] ... FIL" + +#: abc2ly.py:1390 +#, python-format +msgid "" +"abc2ly converts ABC music files (see\n" +"%s) to LilyPond input.\n" msgstr "" +"abc2ly konverterer ABC-musikfiler (se\n" +"%s) til LilyPond-inddata.\n" -#: midi2ly.py:102 -msgid "DUR*NUM/DEN" +#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 +#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184 +msgid "show version number and exit" +msgstr "vis versionsnummer og afslut" + +#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 +#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163 +msgid "show this help and exit" +msgstr "vis denne hjælpetekst og afslut" + +#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071 +msgid "write output to FILE" +msgstr "skriv uddata til FIL" + +#: abc2ly.py:1407 +msgid "be strict about success" +msgstr "vær nøje omkring succes" + +#: abc2ly.py:1410 +msgid "preserve ABC's notion of beams" +msgstr "bevar ABC's begreb om bjælker" + +#: abc2ly.py:1413 +msgid "suppress progress messages" +msgstr "undertryk statusbeskeder" + +#. Translators, please translate this string as +#. "Report bugs in English via %s", +#. or if there is a LilyPond users list or forum in your language +#. "Report bugs in English via %s or in YOUR_LANG via URI" +#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 +#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318 +#, c-format, python-format +msgid "Report bugs via %s" +msgstr "Rapporter fejl pÃ¥ engelsk via %s eller vedrørende den danske oversættelse til " + +#: convert-ly.py:47 +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 "" +"Opdater LilyPond-inddata til en nyere version. Som standard, opdater fra\n" +"versionen taget fra kommandoen \\version, til den nuværende LilyPond-version." -#: midi2ly.py:102 -msgid "allow tuplet durations DUR*NUM/DEN" +#: convert-ly.py:50 +msgid "If FILE is `-', read from standard input." +msgstr "Hvis FIL er »-«, sÃ¥ læs fra standardind." + +#: convert-ly.py:52 lilypond-book.py:82 +msgid "Examples:" +msgstr "Eksempler:" + +#: convert-ly.py:79 etf2ly.py:1191 lilypond-book.py:115 midi2ly.py:81 +#, python-format +msgid "Copyright (c) %s by" +msgstr "Ophavsret © %s af" + +#: convert-ly.py:81 etf2ly.py:1193 lilypond-book.py:117 midi2ly.py:83 +msgid "Distributed under terms of the GNU General Public License." +msgstr "Distribueret under betingelserne i GNU General Public License." + +#: convert-ly.py:82 etf2ly.py:1194 lilypond-book.py:118 midi2ly.py:84 +msgid "It comes with NO WARRANTY." +msgstr "Der er INGEN GARANTI." + +#: convert-ly.py:100 convert-ly.py:141 +msgid "VERSION" +msgstr "VERSION" + +#: convert-ly.py:102 +msgid "start from VERSION [default: \\version found in file]" +msgstr "start fra VERSION [standard: \\version funder i fil]" + +#: convert-ly.py:105 +msgid "edit in place" +msgstr "rediger pÃ¥ plads" + +#: convert-ly.py:109 lilypond-book.py:179 musicxml2ly.py:2627 +msgid "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS (default), DEBUG)" +msgstr "Vis logbeskeder jævnfør LOGNIVEAU (NONE, ERROR, WARNING, PROGRESS (standard), DEBUG)" + +#: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181 +#: musicxml2ly.py:2629 main.cc:177 +msgid "LOGLEVEL" +msgstr "LOGNIVEAU" + +#: convert-ly.py:117 +msgid "do not add \\version command if missing" +msgstr "tilføj ikke kommandoen \\version hvis den mangler" + +#: convert-ly.py:123 +#, python-format +msgid "force updating \\version number to %s" +msgstr "fremtving opdatering af \\version til %s" + +#: convert-ly.py:129 +msgid "only update \\version number if file is modified" +msgstr "opdater kun \\version hvis filen er ændret" + +#: convert-ly.py:135 +#, python-format +msgid "show rules [default: -f 0, -t %s]" +msgstr "vis regler [standard: -f 0, -t %s]" + +#: convert-ly.py:140 +#, python-format +msgid "convert to VERSION [default: %s]" +msgstr "konverter til VERSION [standard: %s]" + +#: convert-ly.py:147 +msgid "make a numbered backup [default: filename.ext~]" +msgstr "lav en nummereret sikkerhedskopi [standard: filnavn.ext~]" + +#: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096 +#: main.cc:186 +msgid "show warranty and copyright" +msgstr "vis garanti og ophavsret" + +#: convert-ly.py:196 +msgid "Applying conversion: " +msgstr "Anvender konvertering: " + +#: convert-ly.py:215 +msgid "Error while converting" +msgstr "Fejl under konvertering" + +#: convert-ly.py:217 +msgid "Stopping at last successful rule" +msgstr "Stopper pÃ¥ sidste succesfulde regel" + +#: convert-ly.py:256 +#, python-format +msgid "Processing `%s'... " +msgstr "Behandler »%s« ..." + +#: convert-ly.py:366 +#, python-format +msgid "%s: Unable to open file" +msgstr "%s: kan ikke Ã¥bne fil" + +#: convert-ly.py:372 +#, python-format +msgid "%s: Unable to determine version. Skipping" +msgstr "%s: Kan ikke bestemme version. Udelader" + +#: convert-ly.py:378 +#, python-format +msgid "" +"%s: Invalid version string `%s' \n" +"Valid version strings consist of three numbers, separated by dots, e.g. `2.8.12'" msgstr "" +"%s: Ugyldig versionsstreng »%s« \n" +"Gyldige versionsstrenge bestÃ¥r af tre numre, adskilt af punktummer, f.eks. 2.8.12" -#: midi2ly.py:106 -msgid "treat every text as a lyric" +#: convert-ly.py:384 +#, python-format +msgid "There was %d error." +msgid_plural "There were %d errors." +msgstr[0] "Der var %d fejl." +msgstr[1] "Der var %d fejl." + +#: etf2ly.py:1197 +#, python-format +msgid "%s [OPTION]... ETF-FILE" +msgstr "%s [TILVALG] ... ETF-FIL" + +#: 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.\n" msgstr "" +"Enigma Transport-formatet er et format brugt af Coda Music Technology's\n" +"Finale-produkt. Etf2ly konverterer et undersæt af ETF til en klar at bruge\n" +"LilyPond-fil.\n" -#: midi2ly.py:1027 -msgid "Example:" -msgstr "Eksempel:" +#: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659 +#: main.cc:169 main.cc:181 +msgid "FILE" +msgstr "FIL" -#: midi2ly.py:1081 -msgid "no files specified on command line." -msgstr "ingen filer angivne på kommandolinjen." +#: lilypond-book.py:80 +msgid "Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document." +msgstr "Behandl LilyPond-kodestykker i hybrid HTML-, LaTeX, texinfo- eller DocBook-dokument." -#: mup2ly.py:69 -msgid "Convert mup to LilyPond source" -msgstr "Konvertér mup til LilyPond-kilde" +#: lilypond-book.py:87 +msgid "BOOK" +msgstr "BOG" -#: mup2ly.py:72 -msgid "debug" -msgstr "fejlsøgningsuddata" +#: lilypond-book.py:95 +#, python-format +msgid "Exiting (%d)..." +msgstr "Afslutter (%d) ... " -#: mup2ly.py:73 -msgid "define macro NAME [optional expansion EXP]" -msgstr "definér makro NAVN [valfri makroudvidelse EXP]" +#: lilypond-book.py:127 +msgid "FILTER" +msgstr "FILTER" -#: mup2ly.py:75 main.cc:117 -msgid "write output to FILE" -msgstr "skriv uddata til FIL" +#: lilypond-book.py:130 +msgid "pipe snippets through FILTER [default: `convert-ly -n -']" +msgstr "send kodestykker igennem FILTER (standard: »convert-ly -n -«]" -#: mup2ly.py:76 -msgid "only pre-process" -msgstr "kun forbehandling" +#: lilypond-book.py:134 +msgid "use output format FORMAT (texi [default], texi-html, latex, html, docbook)" +msgstr "Brug uddataformatet FORMAT (texi [default], texi-html, latex, html, docbook)" -#: mup2ly.py:1073 -#, c-format -msgid "no such context: %s" -msgstr "omgivelse findes ikke: %s" +#: lilypond-book.py:135 +msgid "FORMAT" +msgstr "FORMAT" -#: mup2ly.py:1297 -#, c-format -msgid "Processing `%s'..." -msgstr "Behandler \"%s\"..." +#: lilypond-book.py:142 +msgid "add DIR to include path" +msgstr "tilføj MAPPE til inkluderingsstien" -#: mup2ly.py:1316 -#, c-format +#: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169 +#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168 +msgid "DIR" +msgstr "MAPPE" + +#: lilypond-book.py:148 +msgid "format Texinfo output so that Info will look for images of music in DIR" +msgstr "formater Texinfo-uddata sÃ¥ at Info vil kigge efter musikaftryk i MAPPE" + +#: lilypond-book.py:155 +msgid "PAD" +msgstr "TILPAS" + +# "music" referer nok til en samling af noder. PÃ¥ dansk et partitur. +# Jeg ville sige "tilpas... partituret for at justere noderne pÃ¥ trods af...." +#: lilypond-book.py:157 +msgid "pad left side of music to align music in spite of uneven bar numbers (in mm)" +msgstr "tilpas venstre side af partituret for at justere musik pÃ¥ trods af et ulige antal bjælker (i mm)" + +#: lilypond-book.py:162 +msgid "Print lilypond log messages according to LOGLEVEL" +msgstr "Vis lilypond-logskeder jævnfør LOGNIVEAU" + +#: lilypond-book.py:168 +msgid "write lily-XXX files to DIR, link into --output dir" +msgstr "skriv lily-XXX-filer til MAPPE, lænk til --output mappe" + +#: lilypond-book.py:173 +msgid "Load the additional python PACKAGE (containing e.g. a custom output format)" +msgstr "Indlæs den yderligere python-PAKKE (indeholdende f.eks. et tilpasset uddataformat)" + +#: lilypond-book.py:174 +msgid "PACKAGE" +msgstr "PAKKE" + +#: lilypond-book.py:186 +msgid "write output to DIR" +msgstr "skriv uddata til MAPPE" + +#: lilypond-book.py:191 +msgid "COMMAND" +msgstr "KOMMANDO" + +#: lilypond-book.py:192 +msgid "process ly_files using COMMAND FILE..." +msgstr "behandl ly_files med brug af KOMMANDOFIL ..." + +#: lilypond-book.py:197 +msgid "Redirect the lilypond output" +msgstr "Videresend lilypond-uddataene" + +#: lilypond-book.py:201 +msgid "Compile snippets in safe mode" +msgstr "Kompiler kodestykker i sikker tilstand" + +#: lilypond-book.py:207 +msgid "do not fail if no lilypond output is found" +msgstr "gÃ¥ ikke i fejl hvis ingen lilypond-uddata findes" + +#: lilypond-book.py:213 +msgid "do not fail if no PNG images are found for EPS files" +msgstr "gÃ¥ ikke i fejl hvis ingen PNG-billeder findes for EPS-filer" + +#: lilypond-book.py:219 +msgid "write snippet output files with the same base name as their source file" +msgstr "skriv uddatafiler for kodestykke med det samme basisnavn som deres kildefil" + +#: lilypond-book.py:223 midi2ly.py:1090 musicxml2ly.py:2596 +msgid "be verbose" +msgstr "vær udførlig" + +#: lilypond-book.py:239 +msgid "" +"run executable PROG instead of latex, or in\n" +"case --pdf option is set instead of pdflatex" +msgstr "" +"kør kørbar PROG i stedet for latex, eller i\n" +"tilfælde af at tilvalget --pdf er angivet i\n" +"stedet for pdflatex" + +#: lilypond-book.py:241 lilypond-book.py:246 +msgid "PROG" +msgstr "PROG" + +#: lilypond-book.py:245 +msgid "run executable PROG instead of texi2pdf" +msgstr "kør kørbar PROG i stedet for texi2pdf" + +#: lilypond-book.py:252 +msgid "create PDF files for use with PDFTeX" +msgstr "opret PDF-filer for brug med PDFTeX" + +#: lilypond-book.py:463 +msgid "Writing snippets..." +msgstr "Skriver kodestykker ..." + +#: lilypond-book.py:468 +msgid "Processing..." +msgstr "Behandler ..." + +#: lilypond-book.py:473 +msgid "All snippets are up to date..." +msgstr "Alle kodestykker er opdateret ..." + +#: lilypond-book.py:475 +msgid "Linking files..." +msgstr "Lænker filer ..." + +#: lilypond-book.py:495 +#, python-format +msgid "cannot determine format for: %s" +msgstr "kan ikke bestemme format for: %s" + +#: lilypond-book.py:504 +#, python-format +msgid "%s is up to date." +msgstr "%s er seneste version." + +#: lilypond-book.py:517 +#, python-format msgid "Writing `%s'..." -msgstr "Skriver \"%s\"..." +msgstr "Skriver »%s« ..." + +#: lilypond-book.py:580 +msgid "Output would overwrite input file; use --output." +msgstr "Uddata overskriver inddatafil; brug --output." + +#: lilypond-book.py:584 +#, python-format +msgid "Reading %s..." +msgstr "Læser %s ..." + +#: lilypond-book.py:591 +msgid "Dissecting..." +msgstr "Dissekerer ..." + +#: lilypond-book.py:602 +#, python-format +msgid "Compiling %s..." +msgstr "Kompilerer %s ..." + +#: lilypond-book.py:610 +#, python-format +msgid "Processing include: %s" +msgstr "Behandler inkludering: %s" + +#: lilypond-book.py:621 +#, python-format +msgid "Removing `%s'" +msgstr "Fjerner »%s«" + +#: lilypond-book.py:727 +#, python-format +msgid "Setting LilyPond's loglevel to %s" +msgstr "Sætter LilyPonds logniveau til %s" + +#: lilypond-book.py:731 +#, python-format +msgid "Setting LilyPond's loglevel to %s (from environment variable LILYPOND_LOGLEVEL)" +msgstr "Sætter LilyPonds logniveau til %s (fra miljøvariabel LILYPOND_LOGLEVEL)" + +#: lilypond-book.py:734 +msgid "Setting LilyPond's output to --verbose, implied by lilypond-book's setting" +msgstr "Sætter LilyPonds uddata til --verbose, underforstÃ¥et af lilypond-books indstilling" + +#: midi2ly.py:90 +msgid "warning: " +msgstr "advarsel: " -#: update-lily.py:76 -msgid "Fetch and rebuild from latest source package" -msgstr "Hent og byg om fra seneste kildekodepakke" +#: midi2ly.py:93 midi2ly.py:1124 +msgid "error: " +msgstr "fejl: " -#: update-lily.py:79 -#, c-format -msgid "unpack and build in DIR [%s]" -msgstr "udpak og byg i DIR [%s]" +#: midi2ly.py:94 +msgid "Exiting... " +msgstr "Afslutter ... " -#: update-lily.py:80 -msgid "execute COMMAND, subtitute:" -msgstr "kør COMMAND, erstat:" +#: midi2ly.py:835 +msgid "found more than 5 voices on a staff, expect bad output" +msgstr "fandt mere end 5 stemmer pÃ¥ en node, forvent et ugyldigt resultat" -#: update-lily.py:81 -msgid "%b: build root" -msgstr "%b: rod for opbygning" +# hær er det spørg om skrivning til en fil (første argument er t.ex +# DVI, LATEX, MIDI, TEX) +#: midi2ly.py:1032 +#, python-format +msgid "%s output to `%s'..." +msgstr "%s udskrevet til »%s« ..." -#: update-lily.py:82 -#, c-format -msgid "%n: package name" -msgstr "%n: pakkenavn" +#: midi2ly.py:1045 +#, python-format +msgid "Convert %s to LilyPond input.\n" +msgstr "Konverter %s til LilyPond-inddata.\n" -#: update-lily.py:83 -msgid "%r: release directory" -msgstr "%r: katalog for programudgivelse" +#: midi2ly.py:1050 +msgid "print absolute pitches" +msgstr "udskriv absolutte tonehøjder" -#: update-lily.py:84 -msgid "%t: tarball" -msgstr "%t: tarball" +#: midi2ly.py:1052 midi2ly.py:1080 +msgid "DUR" +msgstr "LÆNGDE" -#: update-lily.py:85 -msgid "%v: package version" -msgstr "%v: pakkeversion" +# hvad betyder quantise (http://www.soundonsound.com/sos/mar99/articles/Quant.html) +#: midi2ly.py:1053 +msgid "quantise note durations on DUR" +msgstr "quantise nodelængder pÃ¥ DUR" -#: update-lily.py:88 -#, c-format -msgid "keep all output, and name the directory %s" -msgstr "behold al uddata, og døb kataloget til %s" +#: midi2ly.py:1056 +msgid "debug printing" +msgstr "fejlsøg udskrivning" -#: update-lily.py:89 -msgid "upon failure notify EMAIL[,EMAIL]" -msgstr "ved fejl, underret EMAIL[,EMAIL]" +#: midi2ly.py:1059 +msgid "print explicit durations" +msgstr "udskriv eksplicitte længder" -#: update-lily.py:90 -msgid "remove previous build" -msgstr "fjern foregående bygning" +#: midi2ly.py:1064 +msgid "prepend FILE to output" +msgstr "foranstil FIL til uddata" -#: update-lily.py:93 -#, c-format -msgid "fetch and build URL [%s]" -msgstr "hent og byg URL [%s]" +#: midi2ly.py:1068 +msgid "set key: ALT=+sharps|-flats; MINOR=1" +msgstr "sæt toneart: TONE=+forhøjelser/-sænkninger; mol=1" -#: update-lily.py:429 -#, c-format -msgid "Listing `%s'..." -msgstr "Lister \"%s\"..." +#: midi2ly.py:1069 +msgid "ALT[:MINOR]" +msgstr "ALT[:MINOR]" -#: update-lily.py:497 -#, c-format -msgid "latest is: %s" -msgstr "seneste er: %s" +#: midi2ly.py:1074 +msgid "preview of first 4 bars" +msgstr "forhÃ¥ndsvisning af de første 4 bjælker" -#: update-lily.py:498 -#, c-format -msgid "relax, %s is up to date" -msgstr "slap af, %s er seneste version" +#: midi2ly.py:1078 +msgid "suppress progress messages and warnings about excess voices" +msgstr "undertryk statusbeskeder og advarsler om overskydende stemmer" -#: update-lily.py:507 update-lily.py:520 -#, c-format -msgid "Fetching `%s'..." -msgstr "Henter \"%s\"..." +#: midi2ly.py:1079 +msgid "quantise note starts on DUR" +msgstr "quantise nodebegyndelser pÃ¥ DUR" -#: update-lily.py:529 -#, c-format -msgid "Building `%s'..." -msgstr "Bygger \"%s\"..." +#: midi2ly.py:1083 +msgid "use s instead of r for rests" +msgstr "brug s i stedet for r for pauser" -#: getopt-long.cc:146 +#: midi2ly.py:1085 +msgid "DUR*NUM/DEN" +msgstr "DUR*NUM/DEN" + +#: midi2ly.py:1088 +msgid "allow tuplet durations DUR*NUM/DEN" +msgstr "tillad irregulære nodeværdivarigheder DUR*NUM/DEN" + +#: midi2ly.py:1098 +msgid "treat every text as a lyric" +msgstr "opfat al tekst som sangtekster" + +#: midi2ly.py:1101 +msgid "Examples" +msgstr "Eksempler" + +#: midi2ly.py:1125 +msgid "no files specified on command line." +msgstr "ingen filer blev angivet pÃ¥ kommandolinjen." + +#: musicxml2ly.py:228 +#, python-format +msgid "Encountered file created by %s, containing wrong beaming information. All beaming information in the MusicXML file will be ignored" +msgstr "Mødte fil oprettet af %s, der indeholder forkert bjælkeinformation. Al bjælkeinformation i MusicXML-filen vil blive ignoreret" + +#: musicxml2ly.py:247 musicxml2ly.py:249 +#, python-format +msgid "Unprocessed PartGroupInfo %s encountered" +msgstr "Mødte ubehandlet PartGroupInfo %s" + +#: musicxml2ly.py:500 +#, python-format +msgid "Encountered note at %s without type and duration (=%s)" +msgstr "Mødte node pÃ¥ %s uden type og længde (=%s)" + +#: musicxml2ly.py:520 +#, python-format +msgid "Encountered rational duration with denominator %s, unable to convert to lilypond duration" +msgstr "Mødte rationel længde med denominator %s, kan ikke konvertere til lilypondlængde" + +#: musicxml2ly.py:767 +msgid "Unable to extract key signature!" +msgstr "Kan ikke udtrække toneartsignatur!" + +#: musicxml2ly.py:794 +#, python-format +msgid "unknown mode %s, expecting 'major' or 'minor' or a church mode!" +msgstr "ukendt tilstand %s, forventer »dur« eller »mol« eller en kirketoneart!" + +#: musicxml2ly.py:932 +#, python-format +msgid "Encountered unprocessed marker %s\n" +msgstr "Mødte ubehandlet markør %s\n" + +#: musicxml2ly.py:1026 +#, python-format +msgid "unknown span event %s" +msgstr "ukendt brohændelse %s" + +#: musicxml2ly.py:1036 +#, python-format +msgid "unknown span type %s for %s" +msgstr "ukendt afstandstype %s for %s" + +#: musicxml2ly.py:1456 +msgid "Unknown metronome mark, ignoring" +msgstr "Ukendt metronom-mærke, ignorerer" + +#. TODO: Implement the other (more complex) way for tempo marks! +#: musicxml2ly.py:1461 +msgid "Metronome marks with complex relations ( in MusicXML) are not yet implemented." +msgstr "Metronom markerer med komplekse relationer ( i MusicXML) er endnu ikke implementeret." + +#: musicxml2ly.py:1663 +#, python-format +msgid "Unable to convert chord type %s to lilypond." +msgstr "Kunne ikke konvertere akkordtype %s til lilypond." + +#: musicxml2ly.py:1816 +#, python-format +msgid "drum %s type unknown, please add to instrument_drumtype_dict" +msgstr "tromme %s-type ukendt, tilføj til instrument_drumtype_dict" + +#: musicxml2ly.py:1820 +msgid "cannot find suitable event" +msgstr "kan ikke finde egnet hændelse" + +#: musicxml2ly.py:1968 +#, python-format +msgid "Negative skip %s (from position %s to %s)" +msgstr "Negativ hop %s (fra position %s til %s)" + +#: musicxml2ly.py:2109 +#, python-format +msgid "Negative skip found: from %s to %s, difference is %s" +msgstr "Negativ hop fundet: fra %s til %s, forskellen er %s" + +#: musicxml2ly.py:2190 +#, python-format +msgid "unexpected %s; expected %s or %s or %s" +msgstr "uventet %s; forventede %s eller %s eller %s" + +#: musicxml2ly.py:2296 +msgid "Encountered closing slur, but no slur is open" +msgstr "Mødte afsluttende legatobue, men ingen legatobue er Ã¥ben" + +#: musicxml2ly.py:2299 +msgid "Cannot have two simultaneous (closing) slurs" +msgstr "Kan ikke have to samtidige (lukkende) legatobuer" + +#: musicxml2ly.py:2308 +msgid "Cannot have a slur inside another slur" +msgstr "Kan ikke have en legatobue inden i en anden legatobue" + +#: musicxml2ly.py:2311 +msgid "Cannot have two simultaneous slurs" +msgstr "Kan ikke have to samtidige legatobuer" + +#: musicxml2ly.py:2445 +#, python-format +msgid "cannot simultaneously have more than one mode: %s" +msgstr "kan ikke samtidig have mere end en tilstand: %s" + +#: musicxml2ly.py:2553 +msgid "Converting to LilyPond expressions..." +msgstr "Konverterer til LilyPond-udtryk ..." + +#: musicxml2ly.py:2564 +msgid "musicxml2ly [OPTION]... FILE.xml" +msgstr "musicxml2ly [TILVALG]... FIL.xml" + +#: musicxml2ly.py:2566 +msgid "" +"Convert MusicXML from FILE.xml to LilyPond input.\n" +"If the given filename is -, musicxml2ly reads from the command line.\n" +msgstr "" +"Konverter MusicXML fra FIL.xml til LilyPond-inddata.\n" +"Hvis det angivne filnavn er -, læser musicxml2ly fra kommandolinjen.\n" + +#: musicxml2ly.py:2576 +msgid "" +"Copyright (c) 2005--2015 by\n" +" Han-Wen Nienhuys ,\n" +" Jan Nieuwenhuizen and\n" +" Reinhold Kainhofer \n" +msgstr "" +"Ophavsret 2005-2015 af\n" +" Han-Wen Nienhuys ,\n" +" Jan Nieuwenhuizen and\n" +" Reinhold Kainhofer \n" + +#: musicxml2ly.py:2602 +msgid "use lxml.etree; uses less memory and cpu time" +msgstr "brug lxml.etree; bruger mindre hukommelse og cpu-tid" + +#: musicxml2ly.py:2608 +msgid "input file is a zip-compressed MusicXML file" +msgstr "inddatafil er en zip-komprimeret MusicXML-fil" + +#: musicxml2ly.py:2614 +msgid "convert pitches in relative mode (default)" +msgstr "konverter tonehøjder i relativ tilstand (standard)" + +#: musicxml2ly.py:2619 +msgid "convert pitches in absolute mode" +msgstr "konverter tonehøjder i absolut tilstand" + +#: musicxml2ly.py:2622 +msgid "LANG" +msgstr "SPROG" + +#: musicxml2ly.py:2624 +msgid "use LANG for pitch names, e.g. 'deutsch' for note names in German" +msgstr "brug SPROG for tonehøjdenavne, f.eks. »deutsch« for nodenavne pÃ¥ tysk" + +#: musicxml2ly.py:2638 +msgid "do not convert directions (^, _ or -) for articulations, dynamics, etc." +msgstr "konverter ikke retninger (^, _ eller -) for artikulationer, dynamikker etc." + +#: musicxml2ly.py:2644 +msgid "do not convert exact vertical positions of rests" +msgstr "konverter ikke præcise lodrette positioner for pauser" + +#: musicxml2ly.py:2650 +msgid "do not convert the exact page layout and breaks" +msgstr "konverter ikke det præcise sidelayout og ombrydninger" + +#: musicxml2ly.py:2656 +msgid "do not convert beaming information, use lilypond's automatic beaming instead" +msgstr "konverter ikke bjælkeinformation, brug lilyponds automatiske bjælker i stedet" + +#: musicxml2ly.py:2664 +msgid "set output filename to FILE, stdout if -" +msgstr "sæt uddatafilnavne til FIL, standardud hvis -" + +#: musicxml2ly.py:2670 +msgid "activate midi-block" +msgstr "aktiver midi-block" + +#: musicxml2ly.py:2754 +#, python-format +msgid "unknown part in part-list: %s" +msgstr "ukendt del i part-list: %s" + +#: musicxml2ly.py:2816 +msgid "Input is compressed, extracting raw MusicXML data from stdin" +msgstr "Inddata er komprimeret, udtrækker rÃ¥ MusicXML-data fra standardind" + +#: musicxml2ly.py:2829 +#, python-format +msgid "Input file %s is compressed, extracting raw MusicXML data" +msgstr "Inddatafilen %s er komprimeret, udtrækker rÃ¥ MusicXML-data" + +#: musicxml2ly.py:2859 +msgid "Reading MusicXML from Standard input ..." +msgstr "Læser MusicXML fra standardind ..." + +#: musicxml2ly.py:2861 +#, python-format +msgid "Reading MusicXML from %s ..." +msgstr "Læser MusicXML fra %s ..." + +#: musicxml2ly.py:2894 +#, python-format +msgid "Output to `%s'" +msgstr "Uddata til »%s« ..." + +#: musicxml2ly.py:2964 +#, python-format +msgid "Unable to find input file %s" +msgstr "Kan ikke finde inddatafil %s" + +#: website_post.py:129 +msgid "English" +msgstr "Engelsk" + +#: website_post.py:132 +msgid "Other languages" +msgstr "Andre sprog" + +#: website_post.py:133 +#, python-format +msgid "About automatic language selection." +msgstr "Om automatisk sprogvalg." + +#: getopt-long.cc:153 #, c-format msgid "option `%s' requires an argument" -msgstr "flag \"%s\" kræver et argument" +msgstr "tilvalget »%s« kræver et argument" -#: getopt-long.cc:150 +#: getopt-long.cc:157 #, c-format -msgid "option `%s' doesn't allow an argument" -msgstr "flag.gan \"%s\" tillader intet argument" +msgid "option `%s' does not allow an argument" +msgstr "tilvalget »%s« tillader ikke et argument" -#: getopt-long.cc:154 +#: getopt-long.cc:161 #, c-format msgid "unrecognized option: `%s'" -msgstr "ukendt flag: \"%s\"" +msgstr "ukendt tilvalg: »%s«" -#: getopt-long.cc:161 +#: getopt-long.cc:167 #, c-format msgid "invalid argument `%s' to option `%s'" -msgstr "ugyldigt argument \"%s\" til flag \"%s\"" +msgstr "ugyldigt parameter »%s« til tilvalg »%s«" -#: warn.cc:24 +#: warn.cc:56 #, c-format -msgid "warning: %s\n" -msgstr "advarsel: %s\n" +msgid "Log level set to %d\n" +msgstr "Logniveau sat til %d\n" -#: warn.cc:30 +#: warn.cc:89 #, c-format -msgid "error: %s\n" -msgstr "fejl: %s\n" +msgid "unknown log level `%s', using default (INFO)" +msgstr "ukendt logniveau »%s«, bruger standard (INFO)" -#: warn.cc:43 +#. Some expected warning was not triggered, so print out a warning. +#: warn.cc:112 #, c-format -msgid "programming error: %s (Continuing; cross thumbs)\n" -msgstr "programfejl: %s (Fortsætter, kryds fingrene)\n" +msgid "%d expected warning(s) not encountered: " +msgstr "%d forventede advarsler ikke mødt: " -#: accidental-engraver.cc:181 new-accidental-engraver.cc:237 +#: warn.cc:183 #, c-format -msgid "Accidental typesetting list must begin with context-name: %s" -msgstr "" +msgid "fatal error: %s" +msgstr "fatal fejl: %s" -#: accidental-engraver.cc:206 new-accidental-engraver.cc:262 +#: warn.cc:192 #, c-format -msgid "unknown accidental typesetting: %s. Ignored" -msgstr "" +msgid "suppressed programming error: %s" +msgstr "undertrykt programmeringsfejl: %s" -#: accidental-engraver.cc:222 new-accidental-engraver.cc:278 +#: warn.cc:197 #, c-format -msgid "Symbol is not a parent context: %s. Ignored" -msgstr "" +msgid "programming error: %s" +msgstr "programmeringsfejl: %s" -#: accidental-engraver.cc:225 new-accidental-engraver.cc:281 -#, c-format -msgid "Accidental typesetting must be pair or context-name: %s" -msgstr "" +#: warn.cc:198 +msgid "continuing, cross fingers" +msgstr "fortsætter, kryds finger" -#: afm.cc:60 +#: warn.cc:207 #, c-format -msgid "can't find character number: %d" -msgstr "kan ikke finde tegnnummer: %d" +msgid "suppressed error: %s" +msgstr "undertrykt fejl: %s" -#: afm.cc:75 +#: warn.cc:219 #, c-format -msgid "can't find character called: `%s'" -msgstr "kan ikke finde tegn som hedder: \"%s\"" +msgid "suppressed warning: %s" +msgstr "undertrykt advarsel: %s" -#: afm.cc:125 +#: accidental-engraver.cc:180 #, c-format -msgid "Error parsing AFM file: `%s'" -msgstr "Fejl ved tolkning af AFM-fil: \"%s\"" +msgid "accidental typesetting list must begin with context-name: %s" +msgstr "fortegnsopsætningsliste skal begynde med kontekstnavn: %s" -#: all-font-metrics.cc:95 +#: accidental-engraver.cc:207 #, c-format -msgid "checksum mismatch for font file: `%s'" -msgstr "fejlagtig checksum for skrifttypefil: \"%s\"" +msgid "procedure or context-name expected for accidental rule, found %s" +msgstr "procedure eller kontekstnavn forventet for fortegnsregel, fandt %s" -#: all-font-metrics.cc:97 +#: accidental.cc:141 #, c-format -msgid "does not match: `%s'" -msgstr "matcher ikke: \"%s\"" +msgid "Could not find glyph-name for alteration %s" +msgstr "Kunne ikke finde skrifttegnnavn for alteration %s" -#: all-font-metrics.cc:102 -msgid " Rebuild all .afm files, and remove all .pk and .tfm files. Rerun with -V to show font paths." -msgstr " Genopbyg alle .afm-filer, og fjern alle .pk- og .tfm-filer. Kør igen med -V for at vise skrifttypesøgestier." +#: accidental.cc:157 +msgid "natural alteration glyph not found" +msgstr "naturlig alterationskrifttegn blev ikke fundet" -#: all-font-metrics.cc:167 +#: all-font-metrics.cc:159 #, c-format -msgid "can't find font: `%s'" -msgstr "kan ikke finde skrifttype: \"%s\"" +msgid "cannot find font: `%s'" +msgstr "kan ikke finde skrifttype: »%s«" -#: all-font-metrics.cc:168 -msgid "Loading default font" -msgstr "Indlæser standardskrifttype" +#: apply-context-iterator.cc:42 +msgid "\\applycontext argument is not a procedure" +msgstr "\\applycontext-argument er ikke en procedure" -#: all-font-metrics.cc:183 -#, c-format -msgid "can't find default font: `%s'" -msgstr "kan ikke finde standardskrifttype: \"%s\"" +#: arpeggio.cc:138 +msgid "no heads for arpeggio found?" +msgstr "ingen hoveder for arpeggio blev fundet?" -#: all-font-metrics.cc:184 includable-lexer.cc:51 input-file-results.cc:188 -#, c-format -msgid "(search path: `%s')" -msgstr "(søgesti: \"%s\")" +#: axis-group-engraver.cc:149 +msgid "Axis_group_engraver: vertical group already has a parent" +msgstr "Axis_group_engraver: vertikal gruppe har allerede en overgruppe" -#: all-font-metrics.cc:185 -msgid "Giving up" -msgstr "Giver op" +#: axis-group-engraver.cc:150 +msgid "are there two Axis_group_engravers?" +msgstr "er der to Axis_group_engravers?" + +#: axis-group-engraver.cc:151 +msgid "removing this vertical group" +msgstr "fjerner denne vertikale gruppe" + +#: axis-group-interface.cc:716 +#, c-format +msgid "\"%s\" is not a valid outside-staff-placement-directive" +msgstr "»%s« er ikke et gyldigt outside-staff-placement-directive" -#: auto-change-iterator.cc:43 change-iterator.cc:60 -#: part-combine-music-iterator.cc:97 -msgid "Can't switch translators, I'm there already" -msgstr "Kan ikke skifte oversætter, jeg er her allerede" +#: axis-group-interface.cc:788 +msgid "an outside-staff object should have a direction, defaulting to up" +msgstr "et outside-staff-objekt skal have en retning, bruger standarden op" -#: bar-check-iterator.cc:58 +#: bar-check-iterator.cc:84 #, c-format msgid "barcheck failed at: %s" msgstr "taktkontrol mislykkedes ved: %s" -#: beam-engraver.cc:167 +#: beam-engraver.cc:148 msgid "already have a beam" -msgstr "har allerede en bjælke" +msgstr "har allerede en bjælke" -#: beam-engraver.cc:234 +#: beam-engraver.cc:235 msgid "unterminated beam" -msgstr "uafsluttet bjælke" +msgstr "uafsluttet bjælke" -#: beam-engraver.cc:267 chord-tremolo-engraver.cc:175 +#: beam-engraver.cc:282 chord-tremolo-engraver.cc:149 msgid "stem must have Rhythmic structure" msgstr "nodehals skal have en rytmisk struktur" -#: beam-engraver.cc:281 -msgid "stem doesn't fit in beam" -msgstr "nodehalsen passer ikke i bjælke" +#: beam-engraver.cc:293 +msgid "stem does not fit in beam" +msgstr "nodehalsen passer ikke i bjælke" -#: beam-engraver.cc:282 +#: beam-engraver.cc:294 msgid "beam was started here" -msgstr "bjælken startede her" +msgstr "bjælken startede her" -#: beam.cc:134 -msgid "beam has less than two visible stems" -msgstr "bjælke har mindre end to synlige nodehalse" +#. We are completely screwed. +#: beam-quanting.cc:850 +msgid "no viable initial configuration found: may not find good beam slope" +msgstr "ingen egnet oprindelig konfiguration blev fundet: finder mÃ¥ske ikke en god bjælkehældning" -#: beam.cc:139 -msgid "Beam has less than two stems. Removing beam." -msgstr "Bjælke har mindre end to nodehalse. Fjerner bjælke." +#: beam.cc:183 +msgid "removing beam with no stems" +msgstr "fjerner bjælke uden nodehalse" -#: beam.cc:951 -msgid "Not sure that we can find a nice beam slope (no viable initial configuration found)." -msgstr "Ikke sikker på at vi kan finde en pæn hældning på bjælken (ingen brugelig initiel konfiguration fundet)." - -#: break-align-interface.cc:166 +#: change-iterator.cc:34 #, c-format -msgid "No spacing entry from %s to `%s'" -msgstr "Ingen mellemrums-indgang fra %s til `%s'" +msgid "cannot change `%s' to `%s'" +msgstr "kan ikke ændre »%s« til »%s«" -#: change-iterator.cc:22 -#, c-format -msgid "can't change `%s' to `%s'" -msgstr "kan ikke ændre \"%s\" til \"%s\"" +#. FIXME: constant error message. +#: change-iterator.cc:67 +msgid "cannot find context to switch to" +msgstr "kan ikke finde konteksten at skifte til" -#. +#. No enclosing context was found because the iterator's immediate +#. context is the kind that was sought. #. We could change the current translator's id, but that would make -#. errors hard to catch +#. errors hard to catch. #. -#. last->translator_id_string_ = get_change ()->change_to_id_string_; -#. -#: change-iterator.cc:79 -msgid "I'm one myself" -msgstr "Jeg er selv én" +#. last->translator_id_string () = get_change +#. ()->change_to_id_string (); +#: change-iterator.cc:78 +#, c-format +msgid "not changing to same context type: %s" +msgstr "ændrer ikke til samme konteksttype: %s" +#. FIXME: incomprehensible message #: change-iterator.cc:82 msgid "none of these in my family" msgstr "ingen af disse i min familie" -#: chord-tremolo-engraver.cc:137 percent-repeat-engraver.cc:182 +#: chord-tremolo-engraver.cc:88 +msgid "No tremolo to end" +msgstr "Ingen tremolo at afslutte" + +#: chord-tremolo-engraver.cc:109 msgid "unterminated chord tremolo" msgstr "ikke-afsluttet akkordtremolo" -#: chord-tremolo-iterator.cc:50 -msgid "no one to print a tremolos" -msgstr "der er ingen som kan skrive en tremolo" +#: clef.cc:65 +#, c-format +msgid "clef `%s' not found" +msgstr "nøglen »%s« blev ikke fundet" -#: chord.cc:313 +#: cluster.cc:120 #, c-format -msgid "invalid subtraction: not part of chord: %s" -msgstr "ugyldig subtraktion: ikke del af akkord: %s" +msgid "unknown cluster style `%s'" +msgstr "ukendt klyngestil: »%s«" + +#: cluster.cc:157 +msgid "junking empty cluster" +msgstr "forkaster tom klynge" -# "pitch" hær skal alltså være en ton i et akkord -#: chord.cc:342 +#: coherent-ligature-engraver.cc:110 #, c-format -msgid "invalid inversion pitch: not part of chord: %s" -msgstr "ugyldig tone for inversion: ikke del af en akkord: %s" +msgid "Coherent_ligature_engraver: setting `spacing-increment=0.01': ptr=%ul" +msgstr "Coherent_ligature_engraver: indstiller »spacing-increment=0.01«: ptr=%ul" + +#: constrained-breaking.cc:187 constrained-breaking.cc:206 +msgid "cannot find line breaking that satisfies constraints" +msgstr "kan ikke finde linjeombrydning som opfylder begrænsninger" + +#: context-property.cc:46 +msgid "need symbol arguments for \\override and \\revert" +msgstr "kræver symbolargumenter for \\override og \\revert" -#: dimensions.cc:13 -msgid "NaN" -msgstr "-" +#: context.cc:144 +#, c-format +msgid "cannot find or create new `%s'" +msgstr "kan ikke finde eller oprette ny »%s«" -#: dynamic-engraver.cc:187 span-dynamic-performer.cc:82 -msgid "can't find start of (de)crescendo" -msgstr "kan ikke finde starten på crescendo/diminuendo" +#: context.cc:223 +#, c-format +msgid "cannot find or create `%s' called `%s'" +msgstr "kan ikke finde eller oprette »%s« kaldt »%s«" -#: dynamic-engraver.cc:211 -msgid "already have a crescendo" -msgstr "har allerede et crescendo" +#: context.cc:416 +#, c-format +msgid "cannot find or create: `%s'" +msgstr "kan ikke finde eller oprette: »%s«" -#: dynamic-engraver.cc:212 -msgid "already have a decrescendo" -msgstr "har allerede et diminuendo" +#: context.cc:430 +#, c-format +msgid "cannot find or create new Bottom = \"%s\"" +msgstr "kan ikke finde eller oprette ny bund = »%s«" -#: dynamic-engraver.cc:215 -msgid "Cresc started here" -msgstr "Cresc startede her" +#: custos.cc:87 +#, c-format +msgid "custos `%s' not found" +msgstr "custos »%s« blev ikke fundet" -#: dynamic-engraver.cc:307 -msgid "unterminated (de)crescendo" -msgstr "uafsluttet crescendo/diminuendo" +#: dispatcher.cc:82 +msgid "Event class should be a list" +msgstr "Hændelsesklasse skal være en liste" -#: extender-engraver.cc:96 +#: dispatcher.cc:165 +#, c-format +msgid "Junking event: %s" +msgstr "Stryger hændelsen: %s" + +#: dispatcher.cc:279 +msgid "Attempting to remove nonexisting listener." +msgstr "Forsøger at fjerne ikkeeksisterende lytter." + +#: dispatcher.cc:305 +msgid "Already listening to dispatcher, ignoring request" +msgstr "Lytter allerede til afsender, ignorerer forespørgsel" + +#: dots.cc:48 +#, c-format +msgid "dot `%s' not found" +msgstr "punktum »%s« blev ikke fundet" + +#: dynamic-engraver.cc:169 +#, c-format +msgid "" +"unknown crescendo style: %s\n" +"defaulting to hairpin." +msgstr "" +"ukendt crescendostil: %s\n" +"bruger standarden hairpin." + +#: dynamic-engraver.cc:234 slur-proto-engraver.cc:119 +#, c-format +msgid "unterminated %s" +msgstr "uafsluttet %s" + +#. No explicit dynamic script events have occurred yet, but there is +#. nevertheless a dynamic spanner. Initialize last_volume_ to a +#. value within the available range. +#: dynamic-performer.cc:129 +msgid "(De)crescendo with unspecified starting volume in MIDI." +msgstr "(Af)crescendo med uspecificeret startlydstyrke i MIDI." + +#: episema-engraver.cc:75 +msgid "already have an episema" +msgstr "har allerede en episema" + +#: episema-engraver.cc:88 +msgid "cannot find start of episema" +msgstr "kan ikke finde start pÃ¥ episema" + +#: episema-engraver.cc:137 +msgid "unterminated episema" +msgstr "uafsluttet episema" + +#: extender-engraver.cc:169 extender-engraver.cc:178 msgid "unterminated extender" msgstr "uafsluttet udvider" -#: extender-engraver.cc:108 -msgid "Nothing to connect extender to on the left. Ignoring extender request." -msgstr "Der er ingenting at forbinde udvideren mod til venstre. Ignorerer ønsket om udvider" +#: flag.cc:133 +#, c-format +msgid "flag `%s' not found" +msgstr "flaget »%s« blev ikke fundet" -#: folded-repeat-iterator.cc:78 -msgid "no one to print a repeat brace" -msgstr "der er ingen som kan skrive et gentagelsestegn" +#: flag.cc:153 +#, c-format +msgid "flag stroke `%s' not found" +msgstr "flag stroke »%s« blev ikke fundet" -#: font-interface.cc:238 -msgid "couldn't find any font satisfying " -msgstr "kunne ikke finde nogen skrifttype som opfylder " +#: font-config-scheme.cc:151 font-config.cc:82 +#, c-format +msgid "failed adding font directory: %s" +msgstr "kunne ikke tilføje skriftmappe: %s" -#: gourlay-breaking.cc:188 +#: font-config-scheme.cc:153 font-config.cc:84 #, c-format -msgid "Optimal demerits: %f" -msgstr "" +msgid "Adding font directory: %s" +msgstr "Tilføjer skriftmappe: %s" -#: gourlay-breaking.cc:193 -msgid "No feasible line breaking found" -msgstr "Ingen mulig linjebrydning fandtes" +#: font-config-scheme.cc:167 +#, c-format +msgid "failed adding font file: %s" +msgstr "kunne ikke tilføje skriftfil: %s" -#: hairpin.cc:98 -msgid "decrescendo too small" -msgstr "diminuendo for lille" +#: font-config-scheme.cc:169 +#, c-format +msgid "Adding font file: %s" +msgstr "Tilføjer skriftfil: %s" + +#: font-config.cc:38 +msgid "Initializing FontConfig..." +msgstr "Initialiserer FontConfig ..." + +#: font-config.cc:70 +#, c-format +msgid "failed to add fontconfig configuration file `%s'" +msgstr "kunne ikke tilføje fontconfig-konfigurationsfil: »%s«" + +#: font-config.cc:73 +#, c-format +msgid "Adding fontconfig configuration file: %s" +msgstr "Tilføjer fontconfig-konfigurationsfil: %s" + +#: font-config.cc:86 +msgid "Building font database..." +msgstr "Bygger skriftdatabase ..." + +#: footnote-engraver.cc:87 +msgid "Must be footnote-event." +msgstr "Skal være footnote-event." + +#: general-scheme.cc:403 +#, c-format +msgid "failed redirecting stderr to `%s'" +msgstr "kunne ikke videresende standardfejl til »%s«" + +#: general-scheme.cc:482 output-ps.scm:48 +msgid "Found infinity or nan in output. Substituting 0.0" +msgstr "Fandt uendelig eller nan i uddata. Erstatter 0.0" + +#: glissando-engraver.cc:158 +msgid "unterminated glissando" +msgstr "uafsluttet glissando" + +#: global-context-scheme.cc:95 global-context-scheme.cc:113 +msgid "no music found in score" +msgstr "ingen musik fundet i partitur" + +#: global-context-scheme.cc:103 +msgid "Interpreting music..." +msgstr "Tolker musik ..." + +#: global-context-scheme.cc:125 +#, c-format +msgid "elapsed time: %.2f seconds" +msgstr "tidsforbrug: %.2f sekunder" + +#: gregorian-ligature-engraver.cc:70 +#, c-format +msgid "\\%s ignored" +msgstr "\\%s ignoreret" + +#: gregorian-ligature-engraver.cc:75 +#, c-format +msgid "implied \\%s added" +msgstr "underforstÃ¥et \\%s tilføjet" + +#. ligature may not start with 2nd head of pes or flexa +#: gregorian-ligature-engraver.cc:224 +msgid "cannot apply `\\~' on first head of ligature" +msgstr "kan ikke anvende »\\~« pÃ¥ første fraseringsbuehoved" -#: hairpin.cc:99 -msgid "crescendo too small" -msgstr "crescendo for lille" +#. (pitch == prev_pitch) +#: gregorian-ligature-engraver.cc:236 +msgid "cannot apply `\\~' on heads with identical pitch" +msgstr "kan ikke anvende »\\~« pÃ¥ hoveder med identisk tonehøjde" -#: hyphen-engraver.cc:89 -msgid "unterminated hyphen" -msgstr "uafsluttet bindestreg" +#: grob-interface.cc:68 +#, c-format +msgid "Unknown interface `%s'" +msgstr "Ukendt grænseflade »%s«" + +#: grob-interface.cc:79 +#, c-format +msgid "Grob `%s' has no interface for property `%s'" +msgstr "Grob »%s« har ingen grænseflade for egenskab »%s«" -#: hyphen-engraver.cc:101 -msgid "Nothing to connect hyphen to on the left. Ignoring hyphen request." -msgstr "Der er ingenting at forbinde bindestregen med til venstre. Ignorerer bindestregsforespørgslen." +#: grob-property.cc:33 +#, c-format +msgid "%d: %s" +msgstr "%d: %s" -#: input-file-results.cc:71 source-file.cc:52 streams.cc:38 +#: grob.cc:492 #, c-format -msgid "can't open file: `%s'" -msgstr "kan ikke åbne fil: \"%s\"" +msgid "ignored infinite %s-offset" +msgstr "ignoreret uendelig %s-forskydning" + +#: hairpin.cc:60 +msgid "Asking for broken bound padding at a non-broken bound." +msgstr "Anmoder om ødelagt bundet mellemrum ved en ikkebundet bund." + +# http://www.denstoredanske.dk/Kunst_og_kultur/Musik/Klassisk_musik/Terminologi,_noder_og_tonearter/diminuendo +#: hairpin.cc:257 +msgid "decrescendo too small" +msgstr "diminuendo for lille" -#: input-file-results.cc:131 -msgid "Score contains errors; will not process it" -msgstr "Partitur indholder fejl; vil ikke behandle det" +#: horizontal-bracket-engraver.cc:62 +msgid "do not have that many brackets" +msgstr "hav ikke sÃ¥ mange parenteser" -#: input-file-results.cc:168 +#: horizontal-bracket-engraver.cc:71 +msgid "conflicting note group events" +msgstr "nodegruppehændelser er i konflikt" + +#: hyphen-engraver.cc:104 +msgid "removing unterminated hyphen" +msgstr "fjerner uafsluttet bindestreg" + +#: hyphen-engraver.cc:118 +msgid "unterminated hyphen; removing" +msgstr "uafsluttet bindestreg; fjerner" + +#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108 #, c-format -msgid "Now processing: `%s'" -msgstr "Behandler nu: \"%s\"" +msgid "cannot find file: `%s'" +msgstr "kan ikke finde filen: »%s«" -#: input.cc:98 -msgid "non fatal error: " -msgstr "ikke-fatal fejl: " +#: includable-lexer.cc:73 lily-parser-scheme.cc:100 +#, c-format +msgid "(search path: `%s')" +msgstr "(søgesti: »%s«)" -#: input.cc:106 source-file.cc:147 source-file.cc:240 +#: input.cc:138 source-file.cc:180 source-file.cc:195 msgid "position unknown" msgstr "ukendt position" -#: key-engraver.cc:91 -msgid "Conflicting key signatures found." -msgstr "Konfliktende tonartssignaturer fundet." +#: key-engraver.cc:197 +msgid "Incomplete keyAlterationOrder for key signature" +msgstr "Ufuldstændig keyAlterationOrder for toneartunderskrift" -#: key-engraver.cc:92 -msgid "This was the other key definition." -msgstr "Dette var den anden tonartsdefinition." - -#: key-performer.cc:92 -msgid "FIXME: key change merge" -msgstr "FIX: tonartsskiftsfletning" - -#: kpath.cc:64 +#: key-signature-interface.cc:77 #, c-format -msgid "Kpathsea couldn't find TFM file `%s'" -msgstr "Kpathsea kunne ikke finde TMF-fil: \"%s\"" +msgid "No glyph found for alteration: %s" +msgstr "Intet skrifttegn fundet for alteration: %s" -#: ligature-bracket.cc:105 ligature-bracket.cc:139 ligature-engraver.cc:124 -msgid "no left bound" -msgstr "Ingen venstrekant" +#: key-signature-interface.cc:87 +msgid "alteration not found" +msgstr "alteration blev ikke fundet" -#: ligature-engraver.cc:81 -#, fuzzy -msgid "can't find start of ligature" -msgstr "kan ikke finde start på legatobue" +#: ligature-bracket-engraver.cc:72 ligature-engraver.cc:109 +msgid "cannot find start of ligature" +msgstr "kan ikke finde start pÃ¥ fraseringsbue" -#: ligature-engraver.cc:86 +#: ligature-bracket-engraver.cc:85 ligature-engraver.cc:136 +msgid "already have a ligature" +msgstr "har allerede en fraseringsbue" + +#: ligature-engraver.cc:114 msgid "no right bound" -msgstr "Ingen højrekant" +msgstr "Ingen højrekant" -#: ligature-engraver.cc:108 -#, fuzzy -msgid "already have a ligature" -msgstr "har allerede en bjælke" +#: ligature-engraver.cc:145 +msgid "no left bound" +msgstr "Ingen venstrekant" -#: ligature-engraver.cc:166 -#, fuzzy +#: ligature-engraver.cc:189 msgid "unterminated ligature" -msgstr "uafsluttet legatobue" +msgstr "uafsluttet fraseringsbue" -#: ligature-engraver.cc:183 -msgid "ligature may not contain rest; ignoring rest" -msgstr "" +#: ligature-engraver.cc:216 +msgid "ignoring rest: ligature may not contain rest" +msgstr "ignorerer pause: fraseringsbue mÃ¥ ikke indeholde en pause" -#: ligature-engraver.cc:184 -#, fuzzy +#: ligature-engraver.cc:217 msgid "ligature was started here" -msgstr "bjælken startede her" +msgstr "fraseringsbuen startede her" -#: lily-guile.cc:99 +#: lily-guile.cc:94 #, c-format msgid "(load path: `%s')" -msgstr "(indlæsningssøgesti: \"%s\")" +msgstr "(indlæsningssti: »%s«)" -#: lily-guile.cc:582 +#: lily-guile.cc:413 #, c-format -msgid "Can't find property type-check for `%s' (%s)." -msgstr "Kan ikke finde typetjek for egenskab af '%s' (%s)." +msgid "cannot find property type-check for `%s' (%s)." +msgstr "kan ikke finde egenskaben type-check for »%s« (%s)." -#: lily-guile.cc:585 -msgid "Perhaps you made a typing error?" -msgstr "Måske lavede du en tastefejl?" +#: lily-guile.cc:416 +msgid "perhaps a typing error?" +msgstr "mÃ¥ske en tastefejl?" -#: lily-guile.cc:591 -msgid "Doing assignment anyway." -msgstr "Laver tildeling aligevel." +#: lily-guile.cc:423 +msgid "skipping assignment" +msgstr "udelader tildeling" -#: lily-guile.cc:605 +#: lily-guile.cc:442 #, c-format -msgid "Type check for `%s' failed; value `%s' must be of type `%s'" -msgstr "Typekontrol for \"%s\" mislykkedes; værdi \"%s\" skal have typen \"%s\"" - -#: lookup.cc:141 -msgid "round filled box horizontal extent smaller than blot; decreasing blot" -msgstr "" - -#: lookup.cc:146 -msgid "round filled box vertical extent smaller than blot; decreasing blot" -msgstr "" +msgid "type check for `%s' failed; value `%s' must be of type `%s'" +msgstr "typekontrol for »%s« mislykkedes; værdien »%s« skal være af typen »%s«" -#: lyric-phrasing-engraver.cc:311 -msgid "lyrics found without any matching notehead" -msgstr "tekst fundet uden noget tilhørende nodehoved" +#. Uh oh. unsmob delivered 0, yet +#. unsmob delivers true. This means that unsmob is a +#. matching check from a base class of T, but var is of an +#. incompatible derived type. +#: lily-guile.cc:462 +msgid "Wrong kind of " +msgstr "Forkert type for " -#: lyric-phrasing-engraver.cc:317 -msgid "Huh? Melismatic note found to have associated lyrics." -msgstr "Øh? Melismatisk node har tilhørende tekst." +#: lily-lexer.cc:251 +msgid "include files are not allowed in safe mode" +msgstr "inkluderingsfiler er ikke tilladte i sikker tilstand" -#: main.cc:106 -msgid "EXPR" -msgstr "UDTR" +#: lily-lexer.cc:278 +#, c-format +msgid "identifier name is a keyword: `%s'" +msgstr "Identificerernavn er et nøgleord: »%s«" -#: main.cc:107 -msgid "set options, use -e '(ly-option-usage)' for help" -msgstr "sæt alternativer, brug -e '(ly-option-usage)' for hjælp" +#: lily-lexer.cc:299 lily-lexer.cc:312 +#, c-format +msgid "%s:EOF" +msgstr "%s:EOF" -#. another bug in option parser: --output=foe is taken as an abbreviation -#. for --output-format -#: main.cc:110 -msgid "EXT" -msgstr "FMT" +#: lily-modules.cc:81 +#, c-format +msgid "Uninitialized variable `%s' in module (%s)" +msgstr "Variablen »%s« er ikke initialiseret i modul (%s)" -#: main.cc:110 -#, fuzzy -msgid "use output format EXT" -msgstr "brug uddataformat FMT (scm, ps, tex eller as)" +#: lily-parser-scheme.cc:80 +#, c-format +msgid "Changing working directory to: `%s'" +msgstr "Ændrer arbejdsmappe til »%s«" -#: main.cc:112 -msgid "FIELD" -msgstr "FELT" +#: lily-parser-scheme.cc:84 +#, c-format +msgid "unable to change directory to: `%s'" +msgstr "kan ikke ændre mappe til: »%s«" -#: main.cc:112 -msgid "write header field to BASENAME.FIELD" -msgstr "skriv rubrikfelt til BASENAVN.FELT" +#: lily-parser-scheme.cc:99 +#, c-format +msgid "cannot find init file: `%s'" +msgstr "kan ikke finde init-fil: »%s«" -#: main.cc:113 -msgid "add DIR to search path" -msgstr "tilføj KATALOG til søgestien" +#: lily-parser-scheme.cc:117 +#, c-format +msgid "Processing `%s'" +msgstr "Behandler »%s«" -#: main.cc:114 -msgid "use FILE as init file" -msgstr "brug FIL som init-fil" +#: lily-parser-scheme.cc:210 +msgid "ly:parser-parse-string is only valid with a new parser. Use ly:parser-include-string instead." +msgstr "ly:parser-parse-string er kun gyldig med en ny fortolker. Brug ly:parser-include-string i stedet." -#: main.cc:118 -msgid "prepend DIR to dependencies" -msgstr "tilføj KATALOG efter afhængigheder" +#: lily-parser-scheme.cc:241 +msgid "ly:parse-string-expression is only valid with a new parser. Use ly:parser-include-string instead." +msgstr "ly:parse-string-expression er kun gyldig med en ny fortolker. Brug ly:parser-include-string i stedet." -#. -#. should audit again. -#. -#: main.cc:123 -msgid "inhibit file output naming and exporting" -msgstr "hindr navngivning af filuddata og eksportering" +#: lily-parser.cc:106 +msgid "Parsing..." +msgstr "Tolker ..." -#. No version number or newline here. It confuses help2man. -#: main.cc:155 +#: lookup.cc:178 #, c-format -msgid "Usage: %s [OPTION]... FILE..." -msgstr "Brug: %s [FLAG]... FIL..." +msgid "Not drawing a box with negative dimension, %.2f by %.2f." +msgstr "Tegner ikke en boks med negative dimensioner, %.2f x %.2f." -#: main.cc:157 -msgid "Typeset music and or play MIDI from FILE" -msgstr "Typesæt musik og/eller afspil MIDI fra FIL" +#: lyric-combine-music-iterator.cc:204 +msgid "argument of \\lyricsto should contain Lyrics context" +msgstr "argumentet \\lyricsto skal indeholde lyrikindhold" -#: main.cc:160 -msgid "" -"LilyPond is a music typesetter. It produces beautiful sheet music\n" -"using a high level description file as input. LilyPond is part of \n" -"the GNU Project.\n" -msgstr "" -"LilyPond er en musiktypesætter. Den producerer smukke noder fra en\n" -"højniveaubeskrivning af musikken i en fil. LilyPond er en del af\n" -"GNU-projektet.\n" +#: lyric-combine-music-iterator.cc:344 +#, c-format +msgid "cannot find %s `%s'" +msgstr "kan ikke finde %s »%s«" -#: main.cc:182 +#: main.cc:106 #, c-format msgid "" -"This is free software. It is covered by the GNU General Public License,\n" -"and you are welcome to change it and/or distribute copies of it under\n" -"certain conditions. Invoke as `%s --warranty' for more information.\n" +"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 "" -"Dette er frit programmel. Det dækkes af \"GNU General Public License\",\n" -"og du må ændre og/eller distribuere kopier af det under visse\n" -"betingelser. Kør \"%s --warranty\" for mere information.\n" - -#: main.cc:188 main.cc:200 -#, c-format -msgid "Copyright (c) %s by" -msgstr "Copyright © %s af" +"Dette er et frit program. Det dækkes af GNU General Public License,\n" +"og du er velkommen til at ændre og/eller distribuere kopier af det under\n" +"visse betingelser. Kør »%s --warranty« for yderligere information.\n" -#: main.cc:198 -msgid "GNU LilyPond -- The music typesetter" -msgstr "GNU Lilypond -- Musiktypesætteren" - -#: main.cc:206 +#: main.cc:112 msgid "" " This program is free software; you can redistribute it and/or\n" -"modify it under the terms of the GNU General Public License version 2\n" -"as published by the Free Software Foundation.\n" +"modify it under the terms of the GNU General Public License as \n" +"published by the Free Software Foundation, either version 3 of\n" +"the License, or (at your option) any later version.\n" "\n" " This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" "General Public License for more details.\n" "\n" -" You should have received a copy (refer to the file COPYING) of the\n" +" You should have received a copy of the\n" "GNU General Public License along with this program; if not, write to\n" -"the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,\n" -"USA.\n" +"the Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n" +"Boston, MA 02111-1307, USA.\n" msgstr "" -"Dette program er frit programmel. Du kan distribuere det og/eller\n" -"ændre det under betingelserne i GNU General Public License version 2,\n" +"Dette program er et frit program. Du kan distribuere det og/eller\n" +"ændre det under betingelserne i GNU General Public License, enten\n" +"version 3 af licensen, eller (efter dit valg) en senere version, \n" "udgivet af Free Software Foundation.\n" "\n" -"Dette program distribueres i håb om at det vil være nyttigt, men\n" -"UDEN NOGEN SOM HELST GARANTI, endog uden underforstået garanti om\n" -"SALGBARHED eller EGNETHED FOR NOGET SPECIELT FORMÅL. Se GNU General\n" +"Dette program distribueres i hÃ¥b om, at det vil være nyttigt, men\n" +"UDEN NOGEN SOM HELST GARANTI, endog uden underforstÃ¥et garanti om\n" +"SALGBARHED eller EGNETHED FOR ET SPECIFIKT FORMÅL. Se GNU General\n" "Public License for yderligere information.\n" "\n" -"Du bør have fået en kopi af GNU General Public License sammen med\n" +"Du bør have fÃ¥et en kopi af GNU General Public License sammen med\n" "dette program. Hvis ikke, skriv til Free Software Foundation, Inc., 59\n" "Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n" -#: mensural-ligature-engraver.cc:321 mensural-ligature-engraver.cc:483 -msgid "unexpected case fall-through" -msgstr "" +#: main.cc:150 +msgid "SYM[=VAL]" +msgstr "SYM[=VAL]" -#: mensural-ligature-engraver.cc:332 -msgid "ligature with less than 2 heads -> skipping" +#: main.cc:151 +msgid "" +"set Scheme option SYM to VAL (default: #t).\n" +"Use -dhelp for help." msgstr "" +"sæt Schemetilvalg SYM til VAL (standard: #t).\n" +"Brug -dhelp for hjælp." -#: mensural-ligature-engraver.cc:347 -msgid "can not determine pitch of ligature primitive -> skipping" -msgstr "" +#: main.cc:155 +msgid "EXPR" +msgstr "UDTR" -#: mensural-ligature-engraver.cc:370 -msgid "prime interval within ligature -> skipping" -msgstr "" +#: main.cc:155 +msgid "evaluate scheme code" +msgstr "evaluer Schemekode" -#: mensural-ligature-engraver.cc:380 -msgid "mensural ligature: duration none of L, B, S -> skipping" -msgstr "" +#. Bug in option parser: --output =foe is taken as an abbreviation +#. for --output-format. +#: main.cc:158 +msgid "FORMATs" +msgstr "FORMATer" -#: mensural-ligature.cc:152 -#, c-format -msgid "Mensural_ligature: thickness undefined on flexa %d; assuming 1.4" -msgstr "" +#: main.cc:158 +msgid "dump FORMAT,... Also as separate options:" +msgstr "dump FORMAT,... ogsÃ¥ som separate tilvalg:" -#: mensural-ligature.cc:166 -#, c-format -msgid "Mensural_ligature: delta-pitch undefined on flexa %d; assuming 0" +#: main.cc:159 +msgid "generate PDF (default)" +msgstr "opret PDF (standard)" + +#: main.cc:160 +msgid "generate PNG" +msgstr "opret PNG" + +#: main.cc:161 +msgid "generate PostScript" +msgstr "opret PostScript" + +#: main.cc:162 +msgid "generate big PDF files" +msgstr "opret store PDF-filer" + +#: main.cc:165 +msgid "FIELD" +msgstr "FELT" + +#: main.cc:165 +msgid "" +"dump header field FIELD to file\n" +"named BASENAME.FIELD" msgstr "" +"dump teksthovedfelt FIELD til fil\n" +"navngivet BASENAME.FIELD" -#: mensural-ligature.cc:177 -#, c-format -msgid "Mensural_ligature: flexa-width undefined on flexa %d; assuming 2.0" +#: main.cc:168 +msgid "add DIR to search path" +msgstr "tilføj MAPPE til søgestien" + +#: main.cc:169 +msgid "use FILE as init file" +msgstr "brug FIL som init-fil" + +#: main.cc:172 +msgid "USER, GROUP, JAIL, DIR" +msgstr "USER, GROUP, JAIL, DIR" + +#: main.cc:172 +msgid "" +"chroot to JAIL, become USER:GROUP\n" +"and cd into DIR" msgstr "" +"chroot til JAIL, bliv USER:GROUP\n" +"og cd til DIR" -#: mensural-ligature.cc:208 -msgid "Mensural_ligature: unexpected case fall-through" +#: main.cc:177 +msgid "" +"print log messages according to LOGLEVEL. Possible values are:\n" +"NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG." msgstr "" +"udskriv logbeskeder jævnfør LOGNIVEAU. Mulige værdier er:\n" +"NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (standard) og DEBUG." + +#: main.cc:181 +msgid "write output to FILE (suffix will be added)" +msgstr "skriv uddata til FIL (suffiks vil blive tilføjet)" + +#: main.cc:182 +msgid "relocate using directory of lilypond program" +msgstr "flyt via mappen for lilypondprogrammet" -#: mensural-ligature.cc:217 -msgid "Menusral_ligature: (join_left == 0)" +#: main.cc:183 +msgid "no progress, only error messages (equivalent to loglevel=ERROR)" +msgstr "ingen status, kun fejlbeskeder (svarer til loglevel=ERROR)" + +#: main.cc:185 +msgid "be verbose (equivalent to loglevel=DEBUG)" +msgstr "vær uddybende (svarer til loglevel=DEBUG)" + +#. Do not update the copyright years here, run `make grand-replace' +#: main.cc:264 +#, c-format +msgid "" +"Copyright (c) %s by\n" +"%s and others." msgstr "" +"Ophavsret %s af\n" +"%s med flere." -#: midi-item.cc:144 +#. No version number or newline here. It confuses help2man. +#: main.cc:302 #, c-format -msgid "no such instrument: `%s'" -msgstr "instrumentet findes ikke: \"%s\"" +msgid "Usage: %s [OPTION]... FILE..." +msgstr "Brug: %s [TILVALG] ... FIL ..." -#: midi-item.cc:234 -msgid "silly duration" -msgstr "tåbelig længde" +#: main.cc:304 +msgid "Typeset music and/or produce MIDI from FILE." +msgstr "Typesæt musik og/eller afspil MIDI fra FIL." -#: midi-item.cc:247 -msgid "silly pitch" -msgstr "tåbelig tone" +#: main.cc:306 +msgid "LilyPond produces beautiful music notation." +msgstr "LilyPond fremstiller smuk musiknotation." -#: music-output-def.cc:113 +#: main.cc:308 #, c-format -msgid "can't find `%s' context" -msgstr "kan ikke finde omgivelsen \"%s\"" +msgid "For more information, see %s" +msgstr "For yderligere information, se %s" -#: music.cc:159 -#, c-format -msgid "Transposition by %s makes accidental larger than two" -msgstr "Transponering med %s medfører løst fortegn større end to" +#: main.cc:310 +msgid "Options:" +msgstr "Tilvalg:" -#: my-lily-lexer.cc:142 +#: main.cc:377 #, c-format -msgid "Identifier name is a keyword: `%s'" -msgstr "Identificerernavn er et nøgleord: \"%s\"" +msgid "expected %d arguments with jail, found: %u" +msgstr "forventede %d parametre med jail, fandt: %u" -#: my-lily-lexer.cc:162 +#: main.cc:391 #, c-format -msgid "error at EOF: %s" -msgstr "fejl ved filslutning: %s" +msgid "no such user: %s" +msgstr "ingen sÃ¥dan bruger: %s" -#: my-lily-parser.cc:44 -msgid "Parsing..." -msgstr "Tolker..." +#: main.cc:393 +#, c-format +msgid "cannot get user id from user name: %s: %s" +msgstr "kan ikke indhente bruger-id fra brugernavn: %s: %s" -#: my-lily-parser.cc:54 -msgid "Braces don't match" -msgstr "Klammer passer ikke" +#: main.cc:408 +#, c-format +msgid "no such group: %s" +msgstr "ingen sÃ¥dan gruppe: %s" -#: note-collision.cc:340 -msgid "Too many clashing notecolumns. Ignoring them." -msgstr "For mange overlappende nodekolonner. Ignorerer dem." +#: main.cc:410 +#, c-format +msgid "cannot get group id from group name: %s: %s" +msgstr "kan ikke indhente gruppe-id fra gruppenavn: %s: %s" -#: note-head.cc:134 -msgid "Symbol not found, " -msgstr "Symbol ikke fundet, " +#: main.cc:418 +#, c-format +msgid "cannot chroot to: %s: %s" +msgstr "kan ikke chroot til: %s: %s" -#: output-property-music-iterator.cc:20 request-chord-iterator.cc:76 +#: main.cc:425 #, c-format -msgid "Junking request: `%s'" -msgstr "Stryger forespørgslen: \"%s\"" +msgid "cannot change group id to: %d: %s" +msgstr "kan ikke ændre gruppe-id til: %d: %s" -#: paper-def.cc:122 +#: main.cc:431 #, c-format -msgid "paper output to `%s'..." -msgstr "papirsuddata til \"%s\"..." +msgid "cannot change user id to: %d: %s" +msgstr "kan ikke ændre bruger-id til: %d: %s" -#: paper-outputter.cc:57 -msgid ", at " -msgstr ", ved " +#: main.cc:437 +#, c-format +msgid "cannot change working directory to: %s: %s" +msgstr "kan ikke ændre arbejdsmappe til: %s: %s" -#: paper-score.cc:77 +#: main.cc:826 #, c-format -msgid "Element count %d (spanners %d) " -msgstr "" +msgid "exception caught: %s" +msgstr "undtagelse opstod: %s" -#: paper-score.cc:82 -msgid "Preprocessing elements..." -msgstr "Forbehandler element..." +#. FIXME: constant error message. +#: mark-engraver.cc:150 +msgid "rehearsalMark must have integer value" +msgstr "rehearsalMark skal have en heltalsværdi" -#: paper-score.cc:115 -msgid "Outputting Score, defined at: " -msgstr "Udskriver partitur, defineret ved: " +#: mark-engraver.cc:156 +msgid "mark label must be a markup object" +msgstr "mærkeetiket skal være et opmærkningsobjekt" -#: parse-scm.cc:80 -msgid "GUILE signaled an error for the expression begining here" -msgstr "GUILE signalerede en fejl for udtrykket, der begynder her" +#: mensural-ligature-engraver.cc:100 +msgid "ligature with less than 2 heads -> skipping" +msgstr "fraseringsbue med mindre end 2 hoveder -> udelader" -#. -#. We could change the current translator's id, but that would make -#. errors hard to catch -#. -#. last->translator_id_string_ = get_change ()->change_to_id_string_; -#. -#: part-combine-music-iterator.cc:116 -#, c-format -msgid "I'm one myself: `%s'" -msgstr "Jeg er selv én: \"%s\"" +#: mensural-ligature-engraver.cc:127 +msgid "cannot determine pitch of ligature primitive -> skipping" +msgstr "kan ikke bestemme tonehøjde for oprindelig fraseringsbue -> udelader" -#: part-combine-music-iterator.cc:119 -#, c-format -msgid "none of these in my family: `%s'" -msgstr "ingen af disse i min familie: \"%s\"" +#: mensural-ligature-engraver.cc:141 +msgid "single note ligature - skipping" +msgstr "enkel node fraseringsbue - udelader" + +#: mensural-ligature-engraver.cc:152 +msgid "prime interval within ligature -> skipping" +msgstr "prime interval inden for fraseringsbue -> udelader" -#: percent-repeat-engraver.cc:116 -msgid "Don't know how to handle a percent repeat of this length." -msgstr "Véd ikke hvordan en procenttegnsgentagelse (percent) af denne længde skal håndteres." +#: mensural-ligature-engraver.cc:163 +msgid "mensural ligature: duration none of Mx, L, B, S -> skipping" +msgstr "mensural fraseringsbue: varighed ingen af Mx, L, B, S -> udelader" -#: percent-repeat-iterator.cc:53 -msgid "no one to print a percent" -msgstr "der er ingen som kan skrive et procent-tegn" +#: mensural-ligature-engraver.cc:206 +msgid "semibrevis must be followed by another one -> skipping" +msgstr "semibrevis skal følges af endnu en -> udelader" -#: performance.cc:51 -msgid "Track ... " -msgstr "Spor... " +#: mensural-ligature-engraver.cc:216 +msgid "" +"semibreves can only appear at the beginning of a ligature,\n" +"and there may be only zero or two of them" +msgstr "" +"semibreve kan kun fremgÃ¥ i begyndelsen af en fraseringsbue,\n" +"og der mÃ¥ kun være nul eller to af dem" -#: performance.cc:83 -msgid "Creator: " -msgstr "Skaber: " +#: mensural-ligature-engraver.cc:236 +msgid "" +"invalid ligatura ending:\n" +"when the last note is a descending brevis,\n" +"the penultimate note must be another one,\n" +"or the ligatura must be LB or SSB" +msgstr "" +"ugyldig fraseringsbueslutning:\n" +"nÃ¥r den sidste node er en faldende brevis,\n" +"skal den næstsidste node være endnu en,\n" +"eller fraseringsbuen skal være LB eller SSB" -#: performance.cc:103 -msgid "at " -msgstr "ved " +#: mensural-ligature-engraver.cc:396 +msgid "unexpected case fall-through" +msgstr "uventet tilfælde fald-igennem" -#: performance.cc:114 +#: midi-control-function-performer.cc:107 staff-performer.cc:153 #, c-format -msgid "from musical definition: %s" -msgstr "fra musikdefinition: %s" +msgid "ignoring out-of-range value change for MIDI property `%s'" +msgstr "ignorerer uden for interval-værdiændring for MIDE-egenskab »%s«" -#: performance.cc:169 +#: midi-item.cc:93 #, c-format -msgid "MIDI output to `%s'..." -msgstr "MIDI-uddata til \"%s\"..." +msgid "no such MIDI instrument: `%s'" +msgstr "dette MIDI-instrument findes ikke: »%s«" -#: phrasing-slur-engraver.cc:117 -msgid "unterminated phrasing slur" -msgstr "uafsluttet fraseringsbue" +#: midi-item.cc:179 +msgid "Time signature with more than 255 beats. Truncating" +msgstr "Tidssignatur med mere end 255 slag. Afkorter" -#: phrasing-slur-engraver.cc:132 -msgid "can't find start of phrasing slur" -msgstr "kan ikke finde start på fraseringsbue" +#: midi-stream.cc:38 +#, c-format +msgid "cannot open for write: %s: %s" +msgstr "kan ikke til skrivning: %s: %s" -#: piano-pedal-engraver.cc:230 piano-pedal-engraver.cc:245 -#: piano-pedal-engraver.cc:300 piano-pedal-performer.cc:82 +#: midi-stream.cc:54 #, c-format -msgid "can't find start of piano pedal: `%s'" -msgstr "kan ikke finde start på pianopedal: \"%s\"" +msgid "cannot write to file: `%s'" +msgstr "kan ikke skrive til filen: »%s«" -#: piano-pedal-engraver.cc:405 -msgid "unterminated pedal bracket" -msgstr "" +#: minimal-page-breaking.cc:40 paper-score.cc:116 +msgid "Calculating line breaks..." +msgstr "Beregner linjeskift ..." -#: pitch.cc:25 -msgid "Pitch arguments out of range" -msgstr "Toneargument udenfor intervallet" +#: minimal-page-breaking.cc:44 +msgid "Calculating page breaks..." +msgstr "Beregner sideskift ..." -#: porrectus.cc:35 -msgid "(left_head == 0)" -msgstr "" +#: multi-measure-rest.cc:152 +msgid "usable-duration-logs must be a non-empty list. Falling back to whole rests." +msgstr "usable-duration-logs skal være en udfyldt liste. Falder tilbage pÃ¥ hele pauser." -#: porrectus.cc:46 -msgid "undefined left_head" -msgstr "" +#: music.cc:150 +#, c-format +msgid "octave check failed; expected \"%s\", found: \"%s\"" +msgstr "oktavkontrol mislykkedes; forventede »%s«, fandt: »%s«" -#: porrectus.cc:65 -msgid "(right_head == 0)" -msgstr "" +#: new-fingering-engraver.cc:113 +msgid "cannot add text scripts to individual note heads" +msgstr "kan ikke tilføje tekstskripter til individuelle nodehoveder" -#: porrectus.cc:76 -msgid "undefined right_head" -msgstr "" +#: new-fingering-engraver.cc:269 +msgid "no placement found for fingerings" +msgstr "ingen placering fundet for fingersætninger" -#: porrectus.cc:96 -msgid "junking lonely porrectus" -msgstr "" +#: new-fingering-engraver.cc:270 +msgid "placing below" +msgstr "placerer nedenfor" -#: porrectus.cc:106 -msgid "porrectus style undefined; using mensural" -msgstr "" +#: note-collision.cc:510 +msgid "this Voice needs a \\voiceXx or \\shiftXx setting" +msgstr "denne Voice (stemme) kræver en \\voiceXx- eller \\shiftXx-indstilling" -#: porrectus.cc:251 -msgid "ascending vaticana style porrectus" -msgstr "" +#: note-column.cc:150 +msgid "cannot have note heads and rests together on a stem" +msgstr "kan ikke have nodehoveder og pauser sammen pÃ¥ en nodehals" -#: property-iterator.cc:64 +#: note-head.cc:95 #, c-format -msgid "Not a grob name, `%s'." -msgstr "" +msgid "none of note heads `%s' or `%s' found" +msgstr "ingen af nodehovederne »%s« eller »%s« blev fundet" -#: rest-collision.cc:186 -msgid "too many colliding rests" -msgstr "for mange kolliderende pauser" +#: note-heads-engraver.cc:76 +msgid "NoteEvent without pitch" +msgstr "NoteEvent uden tonehøjde" -#: scm-option.cc:44 -msgid "lilypond -e EXPR means:" -msgstr "" +#: open-type-font.cc:45 +#, c-format +msgid "cannot allocate %lu bytes" +msgstr "kan ikke allokere %lu byte" -#: scm-option.cc:46 -msgid " Evalute the Scheme EXPR before parsing any .ly files." -msgstr "" +#: open-type-font.cc:49 +#, c-format +msgid "cannot load font table: %s" +msgstr "kan ikke indlæse skrifttypetabel: %s" -#: scm-option.cc:48 -msgid " Multiple -e options may be given, they will be evaluated sequentially." -msgstr "" +#: open-type-font.cc:54 +#, c-format +msgid "FreeType error: %s" +msgstr "FreeType-fejl: %s" -#: scm-option.cc:50 -msgid " The function ly-set-option allows for access to some internal variables." -msgstr "" +#: open-type-font.cc:115 +#, c-format +msgid "unsupported font format: %s" +msgstr "skrifttypeformatet er ikke understøttet: %s" -#: scm-option.cc:52 -msgid "Usage: lilypond -e \"(ly-set-option SYMBOL VAL)\"" -msgstr "" +#: open-type-font.cc:117 +#, c-format +msgid "error reading font file %s: %s" +msgstr "fejl under læsning af skrifttypefilen %s: %s" -#: scm-option.cc:54 -msgid "Where SYMBOL VAL pair is any of:" -msgstr "" +#: open-type-font.cc:192 +#, c-format +msgid "FT_Get_Glyph_Name () Freetype error: %s" +msgstr "FT_Get_Glyph_Name () Freetype-fejl: %s" -#: scm-option.cc:122 -msgid "Unknown internal option!" -msgstr "" +#: open-type-font.cc:340 pango-font.cc:258 +#, c-format +msgid "FT_Get_Glyph_Name () error: %s" +msgstr "FT_Get_Glyph_Name ()-fejl: %s" + +#. find out the ideal number of pages +#: optimal-page-breaking.cc:62 +msgid "Finding the ideal number of pages..." +msgstr "Finder det ideelle antal sider ..." -#: score-engraver.cc:102 +#: optimal-page-breaking.cc:94 +msgid "could not satisfy systems-per-page and page-count at the same time, ignoring systems-per-page" +msgstr "kunne ikke opfylde systemer per side og sideantal pÃ¥ samme tid, ignorerer systemer per side" + +#: optimal-page-breaking.cc:114 +msgid "Fitting music on 1 page..." +msgstr "Tilpasser musik pÃ¥ 1 side ..." + +#: optimal-page-breaking.cc:116 #, c-format -msgid "can't find `%s'" -msgstr "kan ikke finde: '%s'" +msgid "Fitting music on %d pages..." +msgstr "Tilpasser musik pÃ¥ %d sider ..." -#: score-engraver.cc:103 -msgid "Fonts have not been installed properly. Aborting" -msgstr "" +#: optimal-page-breaking.cc:118 +#, c-format +msgid "Fitting music on %d or %d pages..." +msgstr "Tilpasser musik pÃ¥ %d eller %d sider ..." -#: score-engraver.cc:207 +#: optimal-page-breaking.cc:128 optimal-page-breaking.cc:181 #, c-format -msgid "unbound spanner `%s'" -msgstr "ubunden bro \"%s\"" +msgid "trying %d systems" +msgstr "prøver med %d systemer" -#: score.cc:92 +#: optimal-page-breaking.cc:147 optimal-page-breaking.cc:209 #, c-format -msgid "stack size cur %d, max %d\n" -msgstr "" +msgid "best score for this sys-count: %f" +msgstr "bedste bedømmelse for denne sys-count: %f" -#: score.cc:109 -msgid "Interpreting music..." -msgstr "Tolker musik..." +#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249 +#: paper-score.cc:156 +msgid "Drawing systems..." +msgstr "Tegner systemer ..." + +#: output-def.cc:229 +msgid "margins do not fit with line-width, setting default values" +msgstr "margener passer ikke med linjebredde, angiver standardværdier" + +#: output-def.cc:236 +msgid "systems run off the page due to improper paper settings, setting default values" +msgstr "systemer gÃ¥r ud over siden pÃ¥ grund af ukorrekt sideindstillinger, vælger standardværdier" -#: score.cc:122 -msgid "Need music in a score" -msgstr "Behøver musik i partitur" +#: page-breaking.cc:276 +msgid "ignoring min-systems-per-page and max-systems-per-page because systems-per-page was set" +msgstr "ignorerer minimum antal systemer per side og maksimal antal systemer per side da systemer per side var angivet" -#. should we? hampers debugging. -#: score.cc:135 -msgid "Errors found/*, not processing score*/" -msgstr "Fejl fundne/*, behandler ikke partitur*/" +#: page-breaking.cc:281 +msgid "min-systems-per-page is larger than max-systems-per-page, ignoring both values" +msgstr "minimum systemer per side er større end maksimal antal systemer per side, ignorerer begge værdier" -#: score.cc:142 +#: page-breaking.cc:636 #, c-format -msgid "elapsed time: %.2f seconds" -msgstr "tidsforbrug: %.2f sekunder" +msgid "page %d has been compressed" +msgstr "side %d er blevet komprimeret" + +#: page-layout-problem.cc:400 +msgid "A page layout problem has been initiated that cannot accommodate footnotes." +msgstr "Et sidelayoutproblem er opstÃ¥et som ikke kan tilpasse sidefødder." + +#: page-layout-problem.cc:729 +msgid "ragged-bottom was specified, but page must be compressed" +msgstr "ragged-bottom blev specificeret, men siden mÃ¥ være komprimeret" -#: script-engraver.cc:66 +#: page-layout-problem.cc:732 #, c-format -msgid "Don't know how to interpret articulation `%s'" -msgstr "Kan ikke tolke artikulering \"%s\"" +msgid "compressing over-full page by %.1f staff-spaces" +msgstr "komprimerer overfuld side med %.1f nodemellemrum" -#. this shouldn't happen, but let's continue anyway. -#: separation-item.cc:53 separation-item.cc:101 -msgid "Separation_item: I've been drinking too much" -msgstr "Separation_item: Jeg har drukket for meget" +#: page-layout-problem.cc:1197 +msgid "staff-affinities should only decrease" +msgstr "staff-affinities bør kun falde" -#: simple-spacer.cc:254 +#: page-turn-page-breaking.cc:169 #, c-format -msgid "No spring between column %d and next one" -msgstr "" +msgid "page-turn-page-breaking: breaking from %d to %d" +msgstr "page-turn-page-breaking: bryder fra %d til %d" + +#: page-turn-page-breaking.cc:218 +msgid "cannot fit the first page turn onto a single page. Consider setting first-page-number to an even number." +msgstr "kan ikke tilpasse den første sidevending pÃ¥ en enkel side. Overveje at sætte first-page-number til et lige nummer." -#: slur-engraver.cc:140 -msgid "unterminated slur" -msgstr "uafsluttet legatobue" +#: page-turn-page-breaking.cc:231 +#, c-format +msgid "Calculating page and line breaks (%d possible page breaks)..." +msgstr "Beregner side- og linjeombrydninger (%d mulige sideombrydninger) ..." -#. How to shut up this warning, when Voice_devnull_engraver has -#. eaten start request? -#: slur-engraver.cc:157 -msgid "can't find start of slur" -msgstr "kan ikke finde start på legatobue" +#: page-turn-page-breaking.cc:301 +#, c-format +msgid "break starting at page %d" +msgstr "ombrydning starter pÃ¥ side %d" -#: slur.cc:53 -msgid "Putting slur over rest." -msgstr "Sætter legatobue over pause." +#: page-turn-page-breaking.cc:302 +#, c-format +msgid "\tdemerits: %f" +msgstr "\tulemper: %f" -#: slur.cc:424 -msgid "Slur over rest?" -msgstr "Legatobue over pause?" +#: page-turn-page-breaking.cc:303 +#, c-format +msgid "\tsystem count: %d" +msgstr "\tsystemantal %d" -#: source-file.cc:65 +#: page-turn-page-breaking.cc:304 #, c-format -msgid "Huh? Got %d, expected %d characters" -msgstr "Øh? Fik %d, forventede %d tegn" +msgid "\tpage count: %d" +msgstr "\tsideantal %d" -#: spacing-spanner.cc:379 +#: page-turn-page-breaking.cc:305 #, c-format -msgid "Global shortest duration is %s\n" -msgstr "" +msgid "\tprevious break: %d" +msgstr "\tforrige ombrydning: %d" -#: spring-smob.cc:32 +#: pango-font.cc:247 #, c-format -msgid "#" -msgstr "" +msgid "no glyph for character U+%0X in font `%s'" +msgstr "intet skrifttegn for tegn U+%0X i skrifttypen »%s«" -#: staff-symbol.cc:62 -msgid "staff symbol: indentation yields beyond end of line" +#: pango-font.cc:274 +#, c-format +msgid "" +"Glyph has no name, but font supports glyph naming.\n" +"Skipping glyph U+%0X, file %s" msgstr "" +"Skrifttegn har intet navn, men skrifttypen understøtter skrifttegnnavngivning.\n" +"Udelader skrifttegn U+%0X, fil %s" -#: stem-engraver.cc:117 +#: pango-font.cc:324 #, c-format -msgid "Adding note head to incompatible stem (type = %d)" -msgstr "Tilføjer nodehoved til inkompatibel nodehals (type = %d)" +msgid "no PostScript font name for font `%s'" +msgstr "intet PostScript-skriftnavn for skrifttypen »%s«" -#: stem.cc:118 -msgid "Weird stem size; check for narrow beams" -msgstr "Mærkelig nodehalsstørrelse; tjek for smalle bjælker" +#: pango-font.cc:374 +msgid "FreeType face has no PostScript font name" +msgstr "FreeType-ansigt har intet PostScript-skrifttypenavn" + +#: paper-book.cc:200 +#, c-format +msgid "program option -dprint-pages not supported by backend `%s'" +msgstr "programtilvalg -dprint-pages er ikke understøttet af motoren »%s«" -#: streams.cc:34 +#: paper-book.cc:219 #, c-format -msgid "can't create directory: `%s'" -msgstr "kan ikke oprette katalog: \"%s\"" +msgid "program option -dpreview not supported by backend `%s'" +msgstr "programtilvalg -dpreview er ikke understøttet af motoren »%s«" -#: streams.cc:48 -msgid "Error syncing file (disk full?)" -msgstr "Fejl ved synkning af fil (disken fuld?)" +#: paper-column-engraver.cc:263 +msgid "forced break was overridden by some other event, should you be using bar checks?" +msgstr "tvungen afbrydelse blev overskrevet af anden hændelse, bruger du bjælkekontroller?" -#: system.cc:125 +#: paper-outputter-scheme.cc:41 #, c-format -msgid "Element count %d." -msgstr "Elementantal %d." +msgid "Layout output to `%s'..." +msgstr "Layoutuddata til »%s« ..." -#: system.cc:377 -#, fuzzy, c-format -msgid "Grob count %d " -msgstr "Elementantal %d " +#: paper-score.cc:128 +#, c-format +msgid "Element count %d (spanners %d) " +msgstr "Elementantal %d (er bro over %d) " -#: system.cc:391 -msgid "Calculating column positions..." -msgstr "Beregner kolonnepositioner..." +#: paper-score.cc:132 +msgid "Preprocessing graphical objects..." +msgstr "Forbehandler grafiske objekter ..." -#: text-spanner-engraver.cc:92 -msgid "can't find start of text spanner" -msgstr "kan ikke finde start på tekstbro" +#: parse-scm.cc:124 +msgid "GUILE signaled an error for the expression beginning here" +msgstr "GUILE signalerede en fejl for udtrykket, der begynder her" -#: text-spanner-engraver.cc:112 -msgid "already have a text spanner" -msgstr "har allerede en tekstbro" +#: pdf-scheme.cc:65 +#, c-format +msgid "Conversion of string `%s' to UTF-16be failed: %s" +msgstr "Konvertering af streng »%s« til UTF-16be mislykkedes: %s" -#: text-spanner-engraver.cc:167 -msgid "unterminated text spanner" -msgstr "uafsluttet tekstbro" +#: percent-repeat-engraver.cc:148 +msgid "unterminated percent repeat" +msgstr "uafsluttet procentgentagelse" -#: text-spanner.cc:130 -msgid "Text_spanner too small" -msgstr "Tekst_bro for lille" +#: performance.cc:76 +msgid "Track..." +msgstr "Spor ... " -#. Not using ngettext's plural feature here, as this message is -#. more of a programming error. -#: tfm-reader.cc:108 +#: performance.cc:126 #, c-format -msgid "TFM header of `%s' has only %u word (s)" -msgstr "TFM-rubrik i \"%s\" har kun %u ord" +msgid "MIDI output to `%s'..." +msgstr "MIDI-uddata til »%s« ..." -#: tfm-reader.cc:142 +#: piano-pedal-engraver.cc:279 #, c-format -msgid "%s: TFM file has %u parameters, which is more than the %u I can handle" -msgstr "%s: TFM-fil har %u parametre, hvilket er mere end de %u jeg kan håndtere" +msgid "expect 3 strings for piano pedals, found: %ld" +msgstr "forvent 3 strenge for pianopedaler, fandt: %ld" -#: tfm.cc:83 +#: piano-pedal-engraver.cc:294 piano-pedal-engraver.cc:305 +#: piano-pedal-performer.cc:104 #, c-format -msgid "can't find ascii character: %d" -msgstr "kan ikke finde ASCII-tegn: %d" +msgid "cannot find start of piano pedal: `%s'" +msgstr "kan ikke finde start pÃ¥ pianopedal: »%s«" -#: tie-engraver.cc:216 -msgid "lonely tie" -msgstr "ensom bindebue" +#: piano-pedal-engraver.cc:340 +#, c-format +msgid "cannot find start of piano pedal bracket: `%s'" +msgstr "kan ikke finde start pÃ¥ pianopedalparentes: »%s«" -#: tie-performer.cc:161 -msgid "No ties were created!" -msgstr "Ingen bindebuer blev lavet!" +#: program-option-scheme.cc:223 +#, c-format +msgid "no such internal option: %s" +msgstr "ingen sÃ¥dan intern indstilling: %s" + +#: property-iterator.cc:115 +#, c-format +msgid "not a grob name, `%s'" +msgstr "ikke et grobnavn, »%s«" -#: time-scaled-music-iterator.cc:25 -msgid "no one to print a tuplet start bracket" -msgstr "der findes ingen som kan skrive en startklamme for tuppel" +#: relative-octave-check.cc:49 +msgid "Failed octave check, got: " +msgstr "Mislykket oktavkontrol, fik: " -#: translator-ctors.cc:53 +#: relocate.cc:56 #, c-format -msgid "unknown translator: `%s'" -msgstr "ukendt oversætter: \"%s\"" +msgid "Setting %s to %s" +msgstr "Sætter %s til %s" -#: translator-def.cc:87 -msgid "Program has no such type" -msgstr "Programmet har ingen sådan type" +#. this warning should only be printed in debug mode! +#: relocate.cc:77 +#, c-format +msgid "no such file: %s for %s" +msgstr "ingen sÃ¥dan fil: %s for %s" -#: translator-def.cc:93 +#. this warning should only be printed in debug mode! +#. this warning should only be printed in debug mode +#: relocate.cc:88 relocate.cc:106 #, c-format -msgid "Already contains: `%s'" -msgstr "Indholder allerede: \"%s\"" +msgid "no such directory: %s for %s" +msgstr "denne mappe findes ikke: %s for %s" -#: translator-def.cc:94 +#: relocate.cc:97 #, c-format -msgid "Not adding translator: `%s'" -msgstr "Tilføjer ikke oversætter: \"%s\"" +msgid "%s=%s (prepend)\n" +msgstr "%s=%s (foranstil)\n" -#: translator-def.cc:209 +#: relocate.cc:124 #, c-format -msgid "can't find: `%s'" -msgstr "kan ikke finde: \"%s\"" +msgid "not relocating, no %s/ or current/ found under %s" +msgstr "flytter ikke, ingen %s/ eller current/ fundet under %s" -#: translator-group.cc:159 +#: relocate.cc:134 #, c-format -msgid "can't find or create `%s' called `%s'" -msgstr "kan ikke finde eller oprette \"%s\" kaldet \"%s\"" +msgid "Relocation: compile datadir=%s, new datadir=%s" +msgstr "Flytning: kompiler datadir=%s, ny datadir=%s" -#: translator-group.cc:244 +#: relocate.cc:146 #, c-format -msgid "can't find or create: `%s'" -msgstr "kan ikke finde eller oprette: \"%s\"" +msgid "Relocation: framework_prefix=%s" +msgstr "Flytning: framework_prefix=%s" -#: volta-engraver.cc:111 -msgid "No volta spanner to end" -msgstr "Ingen volte-bro at afslutte" +#: relocate.cc:172 +#, c-format +msgid "Relocation: is absolute: argv0=%s\n" +msgstr "Flytning: er absolut: argv0=%s\n" -#: volta-engraver.cc:121 -msgid "Already have a volta spanner. Stopping that one prematurely." -msgstr "Har allerede en volte-bro. Stopper denne for tidligt." +#: relocate.cc:178 +#, c-format +msgid "Relocation : from cwd: argv0=%s\n" +msgstr "Flytning: fra cwd: argv0=%s\n" -#: volta-engraver.cc:125 -msgid "Also have a stopped spanner. Giving up." -msgstr "Har også en stoppet bro. Giver op." +#: relocate.cc:196 +#, c-format +msgid "" +"Relocation: from PATH=%s\n" +"argv0=%s\n" +msgstr "" +"Flytning: fra PATH=%s\n" +"argv0=%s\n" -#: parser.yy:434 -#, fuzzy -msgid "Identifier should have alphabetic characters only" -msgstr "Identificerer må kun indeholde alfabetiske tegn" +#: relocate.cc:222 +msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR" +msgstr "LILYPONDPREFIX er forældet, brug LILYPOND_DATADIR" -#: parser.yy:729 -msgid "More alternatives than repeats. Junking excess alternatives." -msgstr "Flere alternativer end gentagelser. Stryger tiloversblevne alternativer." +#: relocate.cc:347 +#, c-format +msgid "Relocation file: %s" +msgstr "Flytningsfil: %s" -#: parser.yy:798 -msgid "Second argument must be a symbol" -msgstr "Andet argument skal være et symbol" +#: relocate.cc:351 source-file.cc:65 +#, c-format +msgid "cannot open file: `%s'" +msgstr "kan ikke Ã¥bne fil: »%s«" -#: parser.yy:803 -#, fuzzy -msgid "First argument must be a procedure taking one argument" -msgstr "Første argument skal være en procedure som tager 1 argument" +#: relocate.cc:381 +#, c-format +msgid "Unknown relocation command %s" +msgstr "Ukendt flytningskommando %s" -#: parser.yy:1380 -msgid "Expecting string as script definition" -msgstr "Forventer streng som skriptdefinition" +#: rest-collision.cc:154 +msgid "cannot resolve rest collision: rest direction not set" +msgstr "kan ikke løse pausekollision: pauseretning ikke angivet" -#: parser.yy:1390 -msgid "Can't specify direction for this request" -msgstr "Kan ikke angive retning for denne forespørgsel" +#: rest-collision.cc:165 rest-collision.cc:274 +msgid "too many colliding rests" +msgstr "for mange kolliderende pauser" -#: parser.yy:1516 -msgid "Expecting musical-pitch value" -msgstr "Forventer nodeværdi" +#: rest.cc:239 +#, c-format +msgid "rest `%s' not found" +msgstr "pausen »%s« blev ikke fundet" -#: parser.yy:1527 -msgid "Must have duration object" -msgstr "Skal have tidslængdeobjekt" +#: score-engraver.cc:77 +#, c-format +msgid "cannot find `%s'" +msgstr "kan ikke finde: »%s«" -#: parser.yy:1536 parser.yy:1544 -msgid "Have to be in Lyric mode for lyrics" -msgstr "Skal være i teksttilstand (Lyric mode) for tekst" +#: score-engraver.cc:79 +msgid "Music font has not been installed properly." +msgstr "Musikskrifttype er ikke blevet korrekt installeret." -#: parser.yy:1715 parser.yy:1768 +#: score-engraver.cc:81 #, c-format -msgid "not a duration: %d" -msgstr "ikke en tidslængde: %d" +msgid "Search path `%s'" +msgstr "Søgesti »%s«" -#: parser.yy:1855 -msgid "Have to be in Note mode for notes" -msgstr "Skal være i nodetilstand (Note mode) for noder" +#: score-engraver.cc:83 +msgid "Aborting" +msgstr "Afbryder" -#: parser.yy:1954 -msgid "Have to be in Chord mode for chords" -msgstr "Skal være i akkordtilstand (Chord mode) for akkord" +#: score.cc:161 +msgid "already have music in score" +msgstr "har allerede musik i partitur" -#: parser.yy:2134 -msgid "need integer number arg" -msgstr "behøver heltalsargument" +#: score.cc:163 +msgid "this is the previous music" +msgstr "dette er den forrige musik" -#: parser.yy:2206 -msgid "Suspect duration found following this beam" -msgstr "" +#: score.cc:169 +msgid "errors found, ignoring music expression" +msgstr "der blev fundet fejl, ignorerer musikudtryk" -#: lexer.ll:178 -msgid "EOF found inside a comment" -msgstr "filslutning fundet inden i en kommentar" +#. FIXME: +#: script-engraver.cc:115 +msgid "do not know how to interpret articulation:" +msgstr "ved ikke hvordan artikulation skal fortolkes:" -#: lexer.ll:192 -msgid "\\maininput disallowed outside init files" -msgstr "\\maininput forbudt udenfor init-filer" +#: script-engraver.cc:116 +msgid " scheme encoding: " +msgstr " scheme-kodning: " -#: lexer.ll:216 +#: skyline-pair.cc:135 +msgid "direction must not be CENTER in ly:skyline-pair::skyline" +msgstr "retning mÃ¥ ikke være CENTER i ly:skyline-pair::skyline" + +#: slur-proto-engraver.cc:51 #, c-format -msgid "wrong or undefined identifier: `%s'" -msgstr "fejlagtig eller udefineret identificerer: \"%s\"" +msgid "direction of %s invalid: %d" +msgstr "retning for %s er ugyldig: %d" -#. backup rule -#: lexer.ll:225 -msgid "Missing end quote" -msgstr "Mangler slutcitationstegn" +#. We already have an old slur, so give a warning +#. and completely ignore the new slur. +#: slur-proto-engraver.cc:166 +#, c-format +msgid "already have %s" +msgstr "har allerede %s" -#. backup rule -#: lexer.ll:247 lexer.ll:251 -msgid "white expected" -msgstr "forventede mellemrum" +#: slur-proto-engraver.cc:183 +#, c-format +msgid "%s without a cause" +msgstr "%s uden en Ã¥rsag" -#: lexer.ll:260 -msgid "Can't evaluate Scheme in safe mode" -msgstr "Kan ikke evaluere Scheme i sikker tilstand" +#: slur-proto-engraver.cc:244 +#, c-format +msgid "cannot end %s" +msgstr "kan ikke afslutte %s" -#: lexer.ll:364 -#, fuzzy -msgid "Brace found at end of lyric. Did you forget a space?" -msgstr "Krølleparentes fundet i slutning af tekst. Glemte du et mellemrum?" +#: slur.cc:436 +#, c-format +msgid "Ignoring grob for slur: %s. avoid-slur not set?" +msgstr "Ignorerer grob for legatobue: %s. Er avoid-slur ikke angivet?" -#: lexer.ll:480 +#: source-file.cc:85 #, c-format -msgid "invalid character: `%c'" -msgstr "ugyldigt tegn: \"%c\"" +msgid "expected to read %d characters, got %d" +msgstr "forventede at læse %d tegn, fik %d" + +#: staff-performer.cc:301 +msgid "MIDI channel wrapped around" +msgstr "MIDI-kanal sluttet omkring" + +#: staff-performer.cc:302 +msgid "remapping modulo 16" +msgstr "ændrer kortlægning af modulo 16" -#: lexer.ll:566 +#: stem-engraver.cc:100 +msgid "tremolo duration is too long" +msgstr "tremololængde er for lang" + +#: stem-engraver.cc:152 #, c-format -msgid "unknown escaped string: `\\%s'" -msgstr "ukendt \"escaped\" streng: \"\\%s\"" +msgid "adding note head to incompatible stem (type = %d/%d)" +msgstr "tilføjer nodehoved til inkompatibel nodehals (type = %d/%d)" + +#: stem-engraver.cc:155 +msgid "maybe input should specify polyphonic voices" +msgstr "mÃ¥ske skal inddata specificere polyfoniske stemmer" + +#: stem.cc:128 +msgid "weird stem size, check for narrow beams" +msgstr "mærkelig nodehalsstørrelse; kontroller for smalle bjælker" -#: lexer.ll:657 -#, fuzzy, c-format -msgid "Incorrect lilypond version: %s (%s, %s)" -msgstr "fejlagtig lilypond-version: %s (%s, %s)" +#: system.cc:202 +#, c-format +msgid "Element count %d" +msgstr "Elementantal %d" -#: lexer.ll:658 -#, fuzzy -msgid "Consider updating the input with the convert-ly script" -msgstr "Overvej at konvertere inddata med skriptet \"convert-ly\"" +#: system.cc:513 +#, c-format +msgid "Grob count %d" +msgstr "Grobantal %d" -#~ msgid "Generate .dvi with LaTeX for LilyPond" -#~ msgstr "Generér .dvi med LaTeX for LilyPond" +#. TODO: Also print the arguments of the markup! +#: text-interface.cc:139 +#, c-format +msgid "Markup depth exceeds maximal value of %d; Markup: %s" +msgstr "Opmærkningsdybde er større end maksimalværdi for %d; Opmærkning: %s" -# %s er progravnavnet (mup2ly) -#~ msgid "%s is far from completed. Not all constructs are recognised." -#~ msgstr "%s er langt fra færdig, og kan ikke genkende alle konstruktioner." +#: text-spanner-engraver.cc:72 +msgid "cannot find start of text spanner" +msgstr "kan ikke finde start pÃ¥ tekstbro" -#~ msgid "Cleaning `%s'..." -#~ msgstr "Renser \"%s\"..." +#: text-spanner-engraver.cc:85 +msgid "already have a text spanner" +msgstr "har allerede en tekstbro" -#~ msgid "EOF in a string" -#~ msgstr "EOF i en streng" +#: text-spanner-engraver.cc:130 +msgid "unterminated text spanner" +msgstr "uafsluttet tekstbro" -# det handlar om mmap hær -#~ msgid "can't map file" -#~ msgstr "kan ikke lave \"mmap\" på filen" +#: tie-engraver.cc:121 +msgid "unterminated tie" +msgstr "uafsluttet bindebue" -#~ msgid "" -#~ msgstr "" +#: tie-engraver.cc:377 +msgid "lonely tie" +msgstr "ensom bindebue" -#~ msgid "programming error: " -#~ msgstr "programmeringsfejl: " +#. +#. Todo: should make typecheck? +#. +#. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. +#. +#: time-signature-engraver.cc:95 +#, c-format +msgid "strange time signature found: %d/%d" +msgstr "mærkelig tidssignatur fundet: %d/%d" -#~ msgid "can't find start of beam" -#~ msgstr "kan ikke finde start på bjælke" +#: translator-ctors.cc:68 +#, c-format +msgid "unknown translator: `%s'" +msgstr "ukendt oversætter: »%s«" -#~ msgid "weird beam vertical offset" -#~ msgstr "underlig lodret afstand for bjælke" +#: translator-group-ctors.cc:40 +#, c-format +msgid "fatal error. Couldn't find type: %s" +msgstr "fatal fejl. Kunne ikke finde type: %s" -#~ msgid "unknown spacing pair `%s', `%s'" -#~ msgstr "ukendt afstandspar \"%s\", \"%s\"" +#: translator-group.cc:187 +#, c-format +msgid "cannot find: `%s'" +msgstr "kan ikke finde: »%s«" -#~ msgid "no Grace context available" -#~ msgstr "ingen forslagsnodeomgivelse (Grace) tilgængelig" +#: translator.cc:310 +#, c-format +msgid "Two simultaneous %s events, junking this one" +msgstr "To samtidige %s hændelser, forkaster denne" -#~ msgid "Unattached grace notes. Attaching to last musical column." -#~ msgstr "Ikke-fæstede forslagsnoder. Fæster ved sidste musikkolonne." +#: translator.cc:311 +#, c-format +msgid "Previous %s event here" +msgstr "Forrige %s hændelse her" -#~ msgid "evalute EXPR as Scheme after .scm init is read" -#~ msgstr "evaluér UDTR som Scheme efter .scm-init er læst" +#: ttf.cc:480 ttf.cc:528 +#, c-format +msgid "font index %d too large for font `%s', using index 0" +msgstr "skriftindeks %d er for stor for skrifttypen »%s«, bruger indeks 0" -#~ msgid "This binary was compiled with the following options:" -#~ msgstr "Dette program blev oversat med følgende flag:" +#: ttf.cc:512 ttf.cc:562 +msgid "font index must be non-negative, using index 0" +msgstr "skriftindeks skal være ikke-negativ, bruger indeks 0" -#~ msgid "ly_get_mus_property (): Not a Music" -#~ msgstr "ly_get_mus_property (): Ikke en \"Music\"" +#: tuplet-engraver.cc:110 +msgid "No tuplet to end" +msgstr "Ingen irregulær nodeværdi at afslutte" -#~ msgid "ly_set_mus_property (): Not a symbol" -#~ msgstr "ly_set_mus_property (): ikke et symbol" +#: vaticana-ligature-engraver.cc:400 +#, c-format +msgid "ignored prefix(es) `%s' of this head according to restrictions of the selected ligature style" +msgstr "ignorerede præfiks »%s« for dette hoved jævnfør begrænsningerne for den valgte fraseringsbuestil" -#~ msgid "ly_set_mus_property (): not of type Music" -#~ msgstr "ly_set_mus_property (): ikke af typen \"Music\"" +#: vaticana-ligature-engraver.cc:466 +msgid "Ambiguous use of dots in ligature: there are multiple dotted notes with the same pitch. The ligature should be split." +msgstr "Tvetydig brug af prikker i fraseringsbue: Der er flere punkterede noder med samme tonehøjde. Fraseringsbuen bør opdeles." -#~ msgid "ly_make_music (): Not a string" -#~ msgstr "ly_make_music (): Ikke en streng" +#: vaticana-ligature-engraver.cc:524 +msgid "This ligature has a dotted head followed by a non-dotted head. The ligature should be split after the last dotted head before this head." +msgstr "Denne fraseringsbue har et punkteret hoved efterfulgt af et hoved uden punktering. Fraseringsbuen bør opdeles efter det sidste punkterede hoved før dette hoved." -#~ msgid "ly_music_name (): Not a music expression" -#~ msgstr "ly_music_name (): Ikke et musikudtryk" +#: vaticana-ligature-engraver.cc:736 +#, c-format +msgid "Vaticana_ligature_engraver: setting `spacing-increment = %f': ptr =%ul" +msgstr "Vaticana_ligature_engraver: sætter »spacing-increment = %f«: ptr =%ul" -#~ msgid "writing header field `%s' to `%s'..." -#~ msgstr "skriver rubrikfelt \"%s\" til \"%s\"..." +#: vaticana-ligature.cc:94 +msgid "flexa-height undefined; assuming 0" +msgstr "flexa-height er ikke defineret; bruger 0" -#~ msgid "" -#~ "`%s' is deprecated. Use\n" -#~ " \\property %s.%s \\override #'%s = #%s" -#~ msgstr "" -#~ "\"%s\" er forældet. Brug\n" -#~ " \\property %s.%s \\override #'%s = #%s" +#: vaticana-ligature.cc:99 +msgid "ascending vaticana style flexa" +msgstr "stigende vaticanastil flexa" -#~ msgid "Wrong type for property: %s, type: %s, value found: %s, type: %s" -#~ msgstr "Forkert type for egenskab: %s, type: %s, værdi fundet: %s, type: %s" +#: vertical-align-engraver.cc:95 +msgid "Ignoring Vertical_align_engraver in VerticalAxisGroup" +msgstr "Ignorerer Vertical_align_engraver i VerticalAxisGroup" -#~ msgid "too many notes for rest collision" -#~ msgstr "for mange noder for pausesammenstød" +#. fixme: be more verbose. +#: volta-engraver.cc:110 +msgid "cannot end volta spanner" +msgstr "kan ikke afslutte volta-bro" -#~ msgid "Scheme options:" -#~ msgstr "Scheme-flag:" +#: volta-engraver.cc:120 +msgid "already have a volta spanner, ending that one prematurely" +msgstr "har allerede en volta-bro, stopper denne for tidligt" -#~ msgid "Can't find property type-check for `%s'. Perhaps you made a typing error? Doing assignment anyway." -#~ msgstr "Kan ikke finde egenskabstypekontrol for \"%s\". Måske har du lavet en tastefejl? Laver tildeling alligevel." +#: volta-engraver.cc:124 +msgid "also already have an ended spanner" +msgstr "har ogsÃ¥ allerede en afsluttet bro" -#~ msgid "ly-get-trans-property: expecting a Translator_group argument" -#~ msgstr "ly-get-trans-property: forventede et Translator_group-argument" +#: volta-engraver.cc:125 +msgid "giving up" +msgstr "giver op" -#~ msgid "Expecting %d arguments" -#~ msgstr "Forventer %d argumenter" +#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248 +msgid "bad expression type" +msgstr "ugyldigt udtrykstype" -#~ msgid "Oldest supported input version: %s" -#~ msgstr "Ældste inddataversion som understøttes: %s" +#: parser.yy:859 parser.yy:1458 parser.yy:1503 +msgid "not a context mod" +msgstr "ikke en kontekst-mod" -#~ msgid "#32 in quarter: %d" -#~ msgstr "#32 i fjerdedel: %d" +#: parser.yy:1054 +msgid "Missing music in \\score" +msgstr "Mangler musik i \\score" -#~ msgid "LY output to `%s'..." -#~ msgstr "LY-uddata til \"%s\"..." +#: parser.yy:1091 +msgid "\\paper cannot be used in \\score, use \\layout instead" +msgstr "\\paper kan ikke bruges i \\score, brug \\layout i stedet for" -#~ msgid "track %d:" -#~ msgstr "spor %d:" +#: parser.yy:1126 +msgid "Spurious expression in \\score" +msgstr "Falsk udtryk i \\score" -#~ msgid "Processing..." -#~ msgstr "Behandler..." +#: parser.yy:1156 +msgid "need \\paper for paper block" +msgstr "kræver \\paper for papirblok" -#~ msgid "Creating voices..." -#~ msgstr "Laver stemmer..." +#: parser.yy:1331 +msgid "music expected" +msgstr "forventede musik" -#~ msgid "track " -#~ msgstr "spor " +#: parser.yy:1341 parser.yy:1375 +msgid "unexpected post-event" +msgstr "uventet post-hændelse" -#~ msgid "NOT Filtering tempo..." -#~ msgstr "Filtrerer IKKE tempo..." +#: parser.yy:1383 +msgid "Ignoring non-music expression" +msgstr "Ignorerer ikke-musik udtryk" -#~ msgid "NOT Quantifying columns..." -#~ msgstr "Kvantificerer IKKE kolonner..." +#: parser.yy:1691 +msgid "not a symbol" +msgstr "ikke et symbol" -#~ msgid "Quantifying columns..." -#~ msgstr "Kvantificerer kolonner..." +#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627 +msgid "bad grob property path" +msgstr "ugyldig grob-egenskabssti" -#~ msgid "Settling columns..." -#~ msgstr "Bestemmer kolonner..." +#: parser.yy:2585 +msgid "only \\consists and \\remove take non-string argument." +msgstr "kun \\consists og \\remove bruger ikke-streng argument." -#~ msgid "% MIDI copyright:" -#~ msgstr "% MIDI-copyright:" +#: parser.yy:2646 +msgid "bad context property path" +msgstr "ugyldig kontekst-egenskabssti" -#~ msgid "% MIDI instrument:" -#~ msgstr "% MIDI-instrument:" +#: parser.yy:2733 +msgid "simple string expected" +msgstr "forventede simpel streng" -#~ msgid "lily indent level: %d" -#~ msgstr "indenteringsniveau for lily: %d" +#: parser.yy:2750 +msgid "symbol expected" +msgstr "forventede symbol" -# Kanske man ikke skal oversætta, men når får de tage bort _() i stællet for -# at skrive en fånig kommentar -#~ msgid "% Creator: " -#~ msgstr "% Kreatør: " +#: parser.yy:2886 +msgid "not a rhythmic event" +msgstr "ikke en rytmisk hændelse" -#~ msgid "% Automatically generated" -#~ msgstr "% Automatgenereret" +#: parser.yy:2936 +msgid "post-event expected" +msgstr "forventede post-hændelse" -#~ msgid "% from input file: " -#~ msgstr "% fra inddatafil: " +#: parser.yy:2945 parser.yy:2950 +msgid "have to be in Lyric mode for lyrics" +msgstr "skal være i teksttilstand (Lyric mode) for tekst" -#~ msgid "write exact durations, e.g.: a4*385/384" -#~ msgstr "skriv eksakte tidslængder, fx: a4*385/384" +#: parser.yy:3026 +msgid "expecting string or post-event as script definition" +msgstr "forventer streng eller post-hændelse som skriptdefinition" -#~ msgid "enable debugging output" -#~ msgstr "aktivér fejlsøgningsuddata" +#: parser.yy:3130 +msgid "not an articulation" +msgstr "ikke en artikulation" -#~ msgid "don't output tuplets, double dots or rests, smallest is 32" -#~ msgstr "udskriv ikke tupler, dobbeltpunktninger eller pauser, mindste er 32" +#: parser.yy:3202 parser.yy:3245 +msgid "not a duration" +msgstr "ikke en længde" -#~ msgid "set FILE as default output" -#~ msgstr "sæt FIL som standarduddata" +#: parser.yy:3266 +msgid "bass number expected" +msgstr "forventede bass-nummer" -#~ msgid "don't output tuplets" -#~ msgstr "udskriv ikke tupler" +#: parser.yy:3358 +msgid "have to be in Note mode for notes" +msgstr "skal være i nodetilstand (Note mode) for noder" -#~ msgid "be quiet" -#~ msgstr "vær stille" +#: parser.yy:3397 +msgid "have to be in Chord mode for chords" +msgstr "skal være i akkordtilstand (Chord mode) for akkord" -#~ msgid "don't output rests or skips" -#~ msgstr "udskriv ikke pauser eller hop" +#: parser.yy:3440 +msgid "markup outside of text script or \\lyricmode" +msgstr "opmærkning uden for tekstskript eller \\lyricmode" -#~ msgid "set smallest duration" -#~ msgstr "indstil mindste længde" +#: parser.yy:3445 +msgid "unrecognized string, not in text script or \\lyricmode" +msgstr "streng blev ikke genkendt, ikke i tekstskript eller \\lyricmode" -#~ msgid "don't timestamp the output" -#~ msgstr "tidsstempl ikke uddata" +#: parser.yy:3597 parser.yy:3606 +msgid "not an unsigned integer" +msgstr "ikke et ej underskrevet heltal" -#~ msgid "be verbose" -#~ msgstr "vær udførlig" +#: parser.yy:3693 +msgid "not a markup" +msgstr "ikke en opmærkning" -#~ msgid "assume no double dotted notes" -#~ msgstr "antag ingen dobbeltpunktede noder" +#: lexer.ll:193 +msgid "stray UTF-8 BOM encountered" +msgstr "mødte malplaceret UTF-8 BOM" -#~ msgid "Usage: %s [OPTION]... [FILE]" -#~ msgstr "Brug: %s [FLAG]... [FIL]" +#: lexer.ll:196 +msgid "Skipping UTF-8 BOM" +msgstr "Udelader UTF-8 BOM" -#~ msgid "Translate MIDI-file to lilypond" -#~ msgstr "Oversæt MIDI-fil til lilypond" +#: lexer.ll:248 +#, c-format +msgid "Renaming input to: `%s'" +msgstr "Omdøber inddata til: »%s«" -#~ msgid "no_double_dots: %d\n" -#~ msgstr "no_double_dots: %d\n" +#: lexer.ll:265 +msgid "quoted string expected after \\version" +msgstr "citatstreng forventet efter \\version" -#~ msgid "no_rests: %d\n" -#~ msgstr "no_rests: %d\n" +#: lexer.ll:269 +msgid "quoted string expected after \\sourcefilename" +msgstr "citatstreng forventet efter \\sourcefilename" -#~ msgid "no_quantify_b_s: %d\n" -#~ msgstr "no_quantify_b_s: %d\n" +#: lexer.ll:273 +msgid "integer expected after \\sourcefileline" +msgstr "heltal ventet efter \\sourcefileline" -#~ msgid "no_smaller_than: %d (1/%d)\n" -#~ msgstr "no_smaller_than: %d (1/%d)\n" +#: lexer.ll:300 +msgid "\\maininput not allowed outside init files" +msgstr "\\maininput er ikke tilladt uden for init-filer" -#~ msgid "no_tuplets: %d\n" -#~ msgstr "no_tuplets: %d\n" +#: lexer.ll:324 +#, c-format +msgid "wrong or undefined identifier: `%s'" +msgstr "fejlagtig eller ikke defineret identifikator: »%s«" -#~ msgid "zero length string encountered" -#~ msgstr "streng med længde nul mødtes" +#: lexer.ll:349 +msgid "string expected after \\include" +msgstr "streng ventet efter \\include" -#~ msgid "MIDI header expected" -#~ msgstr "forventede MIDI-rubrik" +#: lexer.ll:359 +msgid "end quote missing" +msgstr "slutcitationstegn mangler" -#~ msgid "invalid header length" -#~ msgstr "ugyldig rubriklængde" +#: lexer.ll:714 +msgid "EOF found inside a comment" +msgstr "filslutning (EOF) fundet inden i en kommentar" -#~ msgid "invalid MIDI format" -#~ msgstr "ugyldigt MIDI-format" +#: lexer.ll:719 +msgid "EOF found inside string" +msgstr "filslutning (EOF) fundet inden i streng" -#~ msgid "invalid number of tracks" -#~ msgstr "ugyldigt antal spor" +#: lexer.ll:734 +msgid "Unfinished main input" +msgstr "Ufærdige hovedinddata" -#~ msgid "can't handle non-metrical time" -#~ msgstr "kan ikke håndtere ikke-metrisk tid" +#: lexer.ll:805 +#, c-format +msgid "invalid character: `%s'" +msgstr "ugyldigt tegn: »%s«" -#~ msgid "Junking note-end event: channel = %d, pitch = %d" -#~ msgstr "Stryger nodeslutshændelse: kanal = %d, tone = %d" +#: lexer.ll:925 +#, c-format +msgid "unknown escaped string: `\\%s'" +msgstr "ukendt undvigestreng: »\\%s«" -#~ msgid "invalid running status" -#~ msgstr "ugyldig kørselstatus" +#: lexer.ll:945 +#, c-format +msgid "undefined character or shorthand: %s" +msgstr "ikke defineret tegn eller stenografi: %s" -#~ msgid "unimplemented MIDI meta-event" -#~ msgstr "uimplementeret MIDI-metahændelse" +#: lexer.ll:1236 +msgid "non-UTF-8 input" +msgstr "ikke-UTF-8-inddata" + +#: lexer.ll:1280 +#, c-format +msgid "Invalid version string \"%s\"" +msgstr "Ugyldig versionstreng »%s«" + +#: lexer.ll:1285 +#, c-format +msgid "file too old: %s (oldest supported: %s)" +msgstr "filen er for gammel: %s (ældest understøttet: %s)" + +#: lexer.ll:1286 +msgid "consider updating the input with the convert-ly script" +msgstr "overvej at opdatere inddata med skriptet convert-ly" + +#: lexer.ll:1292 +#, c-format +msgid "program too old: %s (file requires: %s)" +msgstr "program for gammelt: %s (fil kræver: %s)" + +#: auto-beam.scm:147 +msgid "Beam end fits no pattern" +msgstr "Bjælkeslutning passer ikke til et mønster" + +#: backend-library.scm:27 +#, scheme-format +msgid "Invoking `~a'..." +msgstr "Starter »~a« ..." + +#: backend-library.scm:31 +#, scheme-format +msgid "`~a' failed (~a)\n" +msgstr "»~a« mislykkedes (~a)\n" + +#: backend-library.scm:108 +#, scheme-format +msgid "Converting to `~a'...\n" +msgstr "Konverterer til »~a« ...\n" + +#. Do not try to guess the name of the png file, +#. GS produces PNG files like BASE-page%d.png. +#: backend-library.scm:118 +#, scheme-format +msgid "Converting to ~a..." +msgstr "Konverterer til ~a ..." + +#: backend-library.scm:134 +#, scheme-format +msgid "Copying to `~a'...\n" +msgstr "Kopierer til »~a« ...\n" + +#: backend-library.scm:200 +#, scheme-format +msgid "Deleting `~a'...\n" +msgstr "Sletter »~a« ...\n" + +#: backend-library.scm:219 +#, scheme-format +msgid "Writing header field `~a' to `~a'..." +msgstr "Skriver teksthovedfelt »~a« til »~a« ..." + +#: backend-library.scm:268 +#, scheme-format +msgid "missing stencil expression `~S'" +msgstr "manglende stenciludtryk »~S«" + +#: bar-line.scm:133 +#, scheme-format +msgid "Bar glyph ~a not known. Ignoring." +msgstr "Bjælkeskrifttegn ~a er ikke kendt. Ignorerer." + +#: bar-line.scm:161 +#, scheme-format +msgid "Annotation '~a' is allowed in the first argument of a bar line definition only." +msgstr "Annotation »~a« er kun tilladt i det første argument for en bjælkelinjedefinition." + +#: bar-line.scm:169 +#, scheme-format +msgid "Replacement '~a' is allowed in the last argument of a bar line definition only." +msgstr "Erstatning »~a« er kun tilladt i det sidste argument for en bjælkelinjedefinition." + +#: bar-line.scm:230 +#, scheme-format +msgid "add-bar-glyph-print-procedure: glyph '~a' has to be a single ASCII character." +msgstr "add-bar-glyph-print-procedure: skrifttegnet »~a« skal være et enkelt ASCII-tegn." + +#: bar-line.scm:795 +#, scheme-format +msgid "No span bar glyph defined for bar glyph '~a'; ignoring." +msgstr "Intet skrifttegn for omfangsbjælke defineret for bjælkeskrifttegn »~a«; ignorerer." + +#: chord-entry.scm:52 +#, scheme-format +msgid "Spurious garbage following chord: ~A" +msgstr "Falsk affald efter akkord: ~A" + +#: define-context-properties.scm:31 define-grob-properties.scm:21 +#: define-music-properties.scm:21 +#, scheme-format +msgid "symbol ~S redefined" +msgstr "symbol ~S omdefineret" + +#: define-event-classes.scm:74 +#, scheme-format +msgid "unknown parent class `~a'" +msgstr "ukendt overklasse »~a«" + +#: define-event-classes.scm:108 +#, scheme-format +msgid "Cannot redefine event class `~S'" +msgstr "Kan ikke omdefinere hændelsesklasse »~S«" + +#: define-event-classes.scm:110 +#, scheme-format +msgid "Undefined parent event class `~S'" +msgstr "Overhændelsesklassen »~S« er ikke defineret" + +#: define-markup-commands.scm:1098 +msgid "no systems found in \\score markup, does it have a \\layout block?" +msgstr "ingen systemer fundet i \\score-opmærkning, har den en \\layout-blok?" + +#: define-markup-commands.scm:2922 +#, scheme-format +msgid "Cannot find glyph ~a" +msgstr "Kan ikke finde teksttegn ~a" + +#: define-markup-commands.scm:3398 +#, scheme-format +msgid "no brace found for point size ~S " +msgstr "ingen akkolade fundet for punktstørrelse ~S " + +#: define-markup-commands.scm:3399 +#, scheme-format +msgid "defaulting to ~S pt" +msgstr "bruger standarden ~S pt" + +#: define-markup-commands.scm:3643 +#, scheme-format +msgid "not a valid duration string: ~a" +msgstr "ikke en gyldig længdestreng: ~a" + +#: define-markup-commands.scm:3854 +#, scheme-format +msgid "not a valid duration string: ~a - ignoring" +msgstr "ikke en gyldig længdestreng: ~a - ignorerer" + +#: define-music-types.scm:803 +#, scheme-format +msgid "symbol expected: ~S" +msgstr "forventede symbol: ~S" + +#: define-music-types.scm:806 +#, scheme-format +msgid "cannot find music object: ~S" +msgstr "kan ikke finde musikobjekt: ~S" + +#: define-music-types.scm:826 +#, scheme-format +msgid "bad make-music argument: ~S" +msgstr "ugyldigt make-music-argument: ~S" + +#: define-note-names.scm:1000 +msgid "Select note names language." +msgstr "Vælg sprog for nodenavne." + +#: define-note-names.scm:1006 +#, scheme-format +msgid "Using `~a' note names..." +msgstr "Bruger »~a« nodenavne ..." + +#: define-note-names.scm:1009 +#, scheme-format +msgid "Could not find language `~a'. Ignoring." +msgstr "Kunne ikke finde sprog »~a«. Ignorerer." + +#: document-backend.scm:135 +#, scheme-format +msgid "pair expected in doc ~s" +msgstr "par forventet i dokument ~s" + +#: document-backend.scm:202 +#, scheme-format +msgid "cannot find interface for property: ~S" +msgstr "kan ikke finde grænseflade for egenskab: ~S" + +#: document-backend.scm:212 +#, scheme-format +msgid "unknown Grob interface: ~S" +msgstr "ukendt Grob-grænseflade: ~S" + +#: documentation-lib.scm:62 +#, scheme-format +msgid "Processing ~S..." +msgstr "Behandler ~S..." + +#: documentation-lib.scm:178 +#, scheme-format +msgid "Writing ~S..." +msgstr "Skriver ~S ..." + +#: documentation-lib.scm:190 +#, scheme-format +msgid "cannot find description for property `~S' (~S)" +msgstr "kan ikke finde beskrivelse for egenskab »~S« (~S)" + +#: documentation-lib.scm:211 +#, scheme-format +msgid "cannot find description for property ~S (~S)" +msgstr "kan ikke finde beskrivelse for egenskab ~S (~S)" + +#: flag-styles.scm:155 +#, scheme-format +msgid "flag stroke `~a' or `~a' not found" +msgstr "flagslag »~a« eller »~a« blev ikke fundet" + +#: framework-eps.scm:112 +#, scheme-format +msgid "Writing ~a..." +msgstr "Skriver ~a ..." + +#: framework-ps.scm:281 +#, scheme-format +msgid "cannot embed ~S=~S" +msgstr "kan ikke indlejre ~S=~S" + +#: framework-ps.scm:324 +#, scheme-format +msgid "cannot extract file matching ~a from ~a" +msgstr "kan ikke udtrække fil der matcher ~a fra ~a" + +#: framework-ps.scm:342 +#, scheme-format +msgid "do not know how to embed ~S=~S" +msgstr "ved ikke hvordan der skal indlejres ~S=~S" + +#: framework-ps.scm:367 +#, scheme-format +msgid "do not know how to embed font ~s ~s ~s" +msgstr "ved ikke hvordan skrifttype skal indlejres ~s ~s ~s" + +#: framework-ps.scm:723 +msgid "" +"\n" +"The PostScript backend does not support the\n" +"system-by-system output. For that, use the EPS backend instead,\n" +"\n" +" lilypond -dbackend=eps FILE\n" +"\n" +"If have cut & pasted a lilypond fragment from a webpage, be sure\n" +"to only remove anything before\n" +"\n" +" %% ****************************************************************\n" +" %% Start cut-&-pastable-section\n" +" %% ****************************************************************\n" +msgstr "" +"\n" +"PostScript-motoreren understøtter ikke\n" +"system efter system-uddata. Her bruges EPS-motoren i stedet,\n" +"\n" +" lilypond -dbackend=eps FIL\n" +"\n" +"Hvis du har klippet og indsat et lilypondfragment fra en internetside, sÃ¥\n" +"vær sikker pÃ¥ kun at fjerne foran\n" +"\n" +" %% ****************************************************************\n" +" %% Start cut-&-pastable-section\n" +" %% ****************************************************************\n" + +#: framework-svg.scm:84 +#, scheme-format +msgid "Updating font into: ~a" +msgstr "Opdaterer skrifttype til: ~a" + +#: graphviz.scm:64 +#, scheme-format +msgid "Writing graph `~a'..." +msgstr "Skriver graf »~a« ..." + +#: layout-beam.scm:40 +#, scheme-format +msgid "Error in beam quanting. Expected (~S,~S) found ~S." +msgstr "Fejl i bjælkequanting. Forventede (~S,~S) fandt ~S." + +#: layout-beam.scm:54 +#, scheme-format +msgid "Error in beam quanting. Expected ~S 0, found ~S." +msgstr "Fejl i bjælkequanting. Forventede ~S 0, fandt ~S." + +#: lily-library.scm:333 +msgid "Music unsuitable for context-mod" +msgstr "Musik uegnet for context-mod" + +#: lily-library.scm:388 +#, scheme-format +msgid "Cannot find context-def \\~a" +msgstr "Kan ikke finde context-def \\~a" + +#: lily-library.scm:404 +msgid "Music unsuitable for output-def" +msgstr "Musik uegnet for output-def" + +#: lily-library.scm:904 +msgid "" +"Find the index between @var{start} and @var{end} (an integer)\n" +"which produces the closest match to @var{target-val} if\n" +"applied to function @var{getter}." +msgstr "" +"Find indekset mellem @var{start} og @var{end} (et heltal)\n" +"som laver det bedste match til @var{target-val} hvis\n" +"anvendt pÃ¥ funktionen @var{getter}." + +#: lily-library.scm:998 +#, scheme-format +msgid "unknown unit: ~S" +msgstr "ukendt enhed: ~S" + +#: lily-library.scm:1023 +#, scheme-format +msgid "no \\version statement found, please add~afor future compatibility" +msgstr "ingen \\version-udtryk fundet, tilføj venligst~afor fremtidig kompatibilitet" + +#: lily.scm:93 +msgid "call-after-session used after session start" +msgstr "call-after-session brugt efter sessionstart" + +#: lily.scm:111 +msgid "define-session used after session start" +msgstr "define-session brugt efter sessionstart" + +#: lily.scm:417 +msgid "Using (ice-9 curried-definitions) module\n" +msgstr "Bruger (ice-9 curried-definitions) modul\n" + +#: lily.scm:420 +msgid "Guile 1.8\n" +msgstr "Guile 1.8\n" + +#: lily.scm:477 +#, scheme-format +msgid "cannot find: ~A" +msgstr "kan ikke finde: ~A" + +#: lily.scm:903 +msgid "Success: compilation successfully completed" +msgstr "Succes: Kompilation blev færdig" + +#: lily.scm:904 +msgid "Compilation completed with warnings or errors" +msgstr "Kompilation færdig med advarsler eller fejl" + +#: lily.scm:965 +#, scheme-format +msgid "job ~a terminated with signal: ~a" +msgstr "job ~a afsluttedes med signal: ~a" + +#: lily.scm:968 +#, scheme-format +msgid "" +"logfile ~a (exit ~a):\n" +"~a" +msgstr "" +"logfil ~a (afslut ~a):\n" +"~a" + +#: lily.scm:990 lily.scm:1079 +#, scheme-format +msgid "failed files: ~S" +msgstr "mislykkede filer: ~S" + +#: lily.scm:1070 +#, scheme-format +msgid "Redirecting output to ~a..." +msgstr "Sender uddata videre til ~a ..." + +#: lily.scm:1089 +#, scheme-format +msgid "Invoking `~a'...\n" +msgstr "Starter »~a« ...\n" + +#: ly-syntax-constructors.scm:27 +#, scheme-format +msgid "~a function cannot return ~a" +msgstr "~a-funktion kan ikke returnere ~a" + +#: ly-syntax-constructors.scm:60 +#, scheme-format +msgid "wrong type for argument ~a. Expecting ~a, found ~s" +msgstr "forkert type for argument ~a. Forventede ~a, fandt ~s" + +#: markup-macros.scm:331 +#, scheme-format +msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" +msgstr "Forkert antal argumenter. Forventede: ~A, fandt ~A: ~S" + +#: markup-macros.scm:337 +#, scheme-format +msgid "Invalid argument in position ~A. Expect: ~A, found: ~S." +msgstr "Ugyldigt argument i postion ~A. Forventede: ~A, fandt: ~S." + +#: markup-macros.scm:373 +#, scheme-format +msgid "Not a markup command: ~A" +msgstr "Ikke en opmærkningskommando: ~A" + +#: modal-transforms.scm:38 +msgid "'from' pitch not in scale; ignoring" +msgstr "»fra« tonehøjde ikke i skala; ignorerer" + +#: modal-transforms.scm:42 modal-transforms.scm:75 +msgid "'to' pitch not in scale; ignoring" +msgstr "»til« tonehøjde ikke i skala; ignorerer" + +#: modal-transforms.scm:46 +msgid "pitch to be transposed not in scale; ignoring" +msgstr "tonehøjde der skal transponeres er ikke i skala; ignorerer" + +#: modal-transforms.scm:71 +msgid "'around' pitch not in scale; ignoring" +msgstr "»omkring« tonehøjde er ikke i skala; ignorerer" + +#: modal-transforms.scm:79 +msgid "pitch to be inverted not in scale; ignoring" +msgstr "tonehøjde der skal vendes om er ikke i skala; ignorerer" + +#: modal-transforms.scm:95 +msgid "negative replication count; ignoring" +msgstr "negativ replikationsantal; ignorerer" + +#: music-functions.scm:319 +#, scheme-format +msgid "invalid tremolo repeat count: ~a" +msgstr "ugyldig gentagantal for tremole: ~a" + +#: music-functions.scm:348 +#, scheme-format +msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo" +msgstr "ukendt gentagtype »~S«: skal være volta, unfold, procent eller tremolo" + +#: music-functions.scm:352 +msgid "More alternatives than repeats. Junking excess alternatives" +msgstr "Flere alternativer end gentagelser. Stryger tiloversblevne alternativer" + +#: music-functions.scm:487 +#, scheme-format +msgid "bad grob property path ~a" +msgstr "ugyldig grob-egenskabssti ~a" + +#: music-functions.scm:511 +#, scheme-format +msgid "bad context property ~a" +msgstr "ugyldig kontekstegenskab ~a" + +#: music-functions.scm:534 +#, scheme-format +msgid "bad music property ~a" +msgstr "ugyldig musikegenskab ~a" + +#: music-functions.scm:840 +msgid "Bad chord repetition" +msgstr "Ugyldig akkordgentagelse" + +#: music-functions.scm:945 +#, scheme-format +msgid "music expected: ~S" +msgstr "forventede musik: ~S" + +#: music-functions.scm:1295 +#, scheme-format +msgid "cannot find quoted music: `~S'" +msgstr "kan ikke finde citeret musik: »~S«" + +#: music-functions.scm:1432 +msgid "Add @var{octave-shift} to the octave of @var{pitch}." +msgstr "Tilføj @var{octave-shift} til oktaven for @var{pitch}." + +#: music-functions.scm:1495 +#, scheme-format +msgid "Unknown octaveness type: ~S " +msgstr "Ukendt octaveness-type: ~S " + +#: music-functions.scm:1496 +msgid "Defaulting to 'any-octave." +msgstr "Bruger standarden »any-octave«." + +#: music-functions.scm:1888 +#, scheme-format +msgid "unknown accidental style: ~S" +msgstr "ukendt utilsigte stil: ~S" + +#: music-functions.scm:2098 +msgid "Missing duration" +msgstr "Manglende længde" + +#: music-functions.scm:2626 +#, scheme-format +msgid "not a symbol list: ~a" +msgstr "ikke en symbolliste: ~a" + +#: music-functions.scm:2629 +#, scheme-format +msgid "conflicting tag group ~a" +msgstr "mærkegruppe er i konflikt ~a" + +#: output-ps.scm:290 output-svg.scm:539 +#, scheme-format +msgid "unknown line-cap-style: ~S" +msgstr "ukendt line-cap-style: ~S" + +#: output-ps.scm:295 output-svg.scm:545 +#, scheme-format +msgid "unknown line-join-style: ~S" +msgstr "ukendt line-join-style: ~S" + +#: output-svg.scm:148 +#, scheme-format +msgid "cannot decypher Pango description: ~a" +msgstr "kan ikke tyde Pangobeskrivelse: ~a" + +#: output-svg.scm:228 +msgid "Glyph must have a unicode value" +msgstr "Skrifttegn skal have en unicodeværdi" + +#: output-svg.scm:280 output-svg.scm:290 +#, scheme-format +msgid "cannot find SVG font ~S" +msgstr "kan ikke finde SVGskriften ~S" + +#: paper.scm:121 +msgid "set-global-staff-size: not in toplevel scope" +msgstr "set-global-staff-size: ikke i topniveauanvendelsesomrÃ¥de" + +#: paper.scm:321 +#, scheme-format +msgid "This is not a \\layout {} object, ~S" +msgstr "Dette er ikke et \\layout {}-objekt, ~S" + +#: paper.scm:329 +#, scheme-format +msgid "Unknown paper size: ~a" +msgstr "Ukendt papirstørrelse: ~a" + +#. TODO: should raise (generic) exception with throw, and catch +#. that in parse-scm.cc +#: paper.scm:348 +msgid "Must use #(set-paper-size .. ) within \\paper { ... }" +msgstr "Skal bruge #(set-paper-size .. ) inden i \\paper { ... }" + +#: parser-clef.scm:154 +#, scheme-format +msgid "unknown clef type `~a'" +msgstr "ukendt nøgletype »~a«" + +#: parser-clef.scm:155 +#, scheme-format +msgid "supported clefs: ~a" +msgstr "understøttede nøgler: ~a" + +#: parser-ly-from-scheme.scm:73 +msgid "error in #{ ... #}" +msgstr "fejl i #{ ... #}" + +#: part-combiner.scm:894 +#, scheme-format +msgid "quoted music `~a' is empty" +msgstr "citeret musik »~a« er tom" + +#: ps-to-png.scm:72 ps-to-png.scm:75 +#, scheme-format +msgid "Copying `~a' to `~a'..." +msgstr "Kopierer »~a« til »~a« ..." + +#: ps-to-png.scm:77 ps-to-png.scm:79 +#, scheme-format +msgid "Deleting `~a'..." +msgstr "Sletter »~a« ..." + +#: to-xml.scm:190 +#, scheme-format +msgid "assertion failed: ~S" +msgstr "pÃ¥stand mislykkedes: ~S" + +#: translation-functions.scm:389 +#, scheme-format +msgid "Negative fret for pitch ~a on string ~a" +msgstr "Ugyldig bÃ¥nd for tonehøjde ~a pÃ¥ streng ~a" + +#: translation-functions.scm:392 +#, scheme-format +msgid "Missing fret for pitch ~a on string ~a" +msgstr "Mangler bÃ¥nd for tonehøjde ~a pÃ¥ streng ~a" + +#: translation-functions.scm:435 +#, scheme-format +msgid "No open string for pitch ~a" +msgstr "Ingen Ã¥ben streng for tonehøjde ~a" + +#: translation-functions.scm:450 translation-functions.scm:462 +#, scheme-format +msgid "Requested string for pitch requires negative fret: string ~a pitch ~a" +msgstr "Anmodet streng for tonehøjde kræver negativ bÃ¥nd: streng ~a tonehøjde ~a" + +#: translation-functions.scm:453 +msgid "Ignoring string request and recalculating." +msgstr "Ignorerer strengforespørgsel og genberegning." + +#: translation-functions.scm:465 +msgid "Ignoring note in tablature." +msgstr "Ignorerer node i tabulatur." + +#: translation-functions.scm:490 +#, scheme-format +msgid "No string for pitch ~a (given frets ~a)" +msgstr "Ingen streng for tonehøjde ~a (givne bÃ¥nd ~a)" + +#: translation-functions.scm:595 +#, scheme-format +msgid "" +"No label for fret ~a (on string ~a);\n" +"only ~a fret labels provided" +msgstr "" +"Ingen etiket for bÃ¥nd ~a (pÃ¥ streng ~a);\n" +"kun ~a bÃ¥ndetiketter tilbudt" -#~ msgid "invalid MIDI event" -#~ msgstr "ugyldig MIDI-hændelse" +#~ msgid "cannot change, already in translator: %s" +#~ msgstr "kan ikke ændre, allerede i oversætter: %s" -#~ msgid "MIDI track expected" -#~ msgstr "forventede MIDI-spor" +#~ msgid "Invalid property operation ~a" +#~ msgstr "Ugyldig egenskabsoperation ~a" -#~ msgid "invalid track length" -#~ msgstr "ugyldig sporlængde" +#~ msgid "~a exited with status: ~S" +#~ msgstr "~a afsluttede med status: ~S" diff --git a/po/de.po b/po/de.po index 21b0d49c15..8cbba452b4 100644 --- a/po/de.po +++ b/po/de.po @@ -3,13 +3,13 @@ # This file is distributed under the same license as the lilypond package. # Erwin Dieterich , 1999 # Roland Stigge , 2003, 2004, 2005, 2006, 2007 -# Till Paala , 2007, 2008, 2009, 2010, 2011, 2012, 2013. +# Till Paala , 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2015. msgid "" msgstr "" -"Project-Id-Version: lilypond 2.17.29\n" +"Project-Id-Version: lilypond 2.19.26\n" "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n" -"POT-Creation-Date: 2013-10-20 10:42+0100\n" -"PO-Revision-Date: 2013-11-26 22:18+0200\n" +"POT-Creation-Date: 2015-08-27 10:48+0100\n" +"PO-Revision-Date: 2015-09-22 23:26+0300\n" "Last-Translator: Till Paala \n" "Language-Team: German \n" "Language: de\n" @@ -17,6 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Virtaal 0.7.1\n" #: book_base.py:26 #, python-format @@ -36,11 +37,11 @@ msgstr "\\begin{document} im LaTeX-Dokument kann nicht gefunden werden" msgid "Running `%s' on file `%s' to detect default page settings.\n" msgstr "»%s« für Datei »%s« aufrufen, um Standardseiteneinstellungen zu ermitteln.\n" -#: book_latex.py:212 book_texinfo.py:228 +#: book_latex.py:219 book_texinfo.py:228 msgid "Unable to auto-detect default settings:\n" msgstr "Kann Standardeinstellungen nicht automatisch bestimmen:\n" -#: book_latex.py:224 book_texinfo.py:240 +#: book_latex.py:231 book_texinfo.py:240 #, python-format msgid "" "Unable to auto-detect default settings:\n" @@ -49,7 +50,7 @@ msgstr "" "Kann Standardeinstellungen nicht automatisch bestimmen:\n" "%s" -#: book_latex.py:247 +#: book_latex.py:254 msgid "cannot detect textwidth from LaTeX" msgstr "kann die Breite des Textes nicht von LaTeX erkennen" @@ -83,31 +84,31 @@ msgstr "unbekannte Option ignoriert: %s" msgid "Missing files: %s" msgstr "Fehlende Dateien: %s" -#: book_snippets.py:651 +#: book_snippets.py:661 #, python-format msgid "Could not overwrite file %s" msgstr "Die Datei kann nicht überschrieben werden: »%s«" -#: book_snippets.py:738 +#: book_snippets.py:748 #, python-format msgid "Running through filter `%s'" msgstr "Durch Filter »%s« schicken" -#: book_snippets.py:759 +#: book_snippets.py:769 #, python-format msgid "`%s' failed (%d)" msgstr "»%s« gescheitert (%d)" -#: book_snippets.py:760 +#: book_snippets.py:770 msgid "The error log is as follows:" msgstr "Das Fehlerprotokoll lautet wie folgt:" -#: book_snippets.py:880 +#: book_snippets.py:890 #, python-format msgid "Converting MusicXML file `%s'...\n" msgstr "MusicXML-Datei »%s« konvertieren...\n" -#: book_snippets.py:907 +#: book_snippets.py:917 #, python-format msgid "" "%s: duplicate filename but different contents of original file,\n" @@ -116,7 +117,7 @@ msgstr "" "%s: Doppelte Dateibezeichnung, aber unterschiedlicher Inhalt der Originaldatei,\n" "gebe Diff zur existierenden Datei aus." -#: book_snippets.py:920 +#: book_snippets.py:930 #, python-format msgid "" "%s: duplicate filename but different contents of converted lilypond file,\n" @@ -167,7 +168,7 @@ msgstr "verworfener \\textstyle, neue \\key Syntax" #: convertrules.py:82 convertrules.py:1856 convertrules.py:2032 #: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801 -#: convertrules.py:3151 convertrules.py:3385 +#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700 msgid "bump version for release" msgstr "aktuelle Version ausgeben" @@ -590,7 +591,7 @@ msgstr "oldaddlyrics entfernen" #: convertrules.py:2820 msgid "" "oldaddlyrics is no longer supported. \n" -" Use addlyrics or lyrsicsto instead.\n" +" Use addlyrics or lyricsto instead.\n" msgstr "" "oldaddlyrics wird nicht mehr unterstützt.\n" " Benutzen Sie anstatt dessen addlyrics oder lyricsto.\n" @@ -622,8 +623,8 @@ msgid "\\bar \".\" now produces a thick barline.\n" msgstr "\\bar \".\" erstellt jetzt einen dicken Taktstrich.\n" #: convertrules.py:2849 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" -msgstr "Strichelunsparameter für Binde- und Legatobögen sind jetzt in 'dash-details.\n" +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" +msgstr "Strichelunsparameter für Binde- und Legatobögen sind jetzt in 'dash-definition.\n" #: convertrules.py:2854 msgid "" @@ -833,15 +834,15 @@ msgstr "consistent-broken-slope wird jetzt durch einen Positions-Callback gehand msgid "input/regression/beam-broken-classic.ly shows how broken beams are now handled.\n" msgstr "input/regression/beam-broken-classic.ly zeigt, wie gebrochene Balken jetzt behandelt werden.\n" -#: convertrules.py:3369 +#: convertrules.py:3372 msgid "beamExceptions controls whole-measure beaming." msgstr "beamExceptions kontrolliert Bebalkung von ganzen Takten." -#: convertrules.py:3606 +#: convertrules.py:3609 msgid "Flag.transparent and Flag.color inherit from Stem" msgstr "Flag.transparent (Durchsichtigkeit) und Farbe der Fähnchen werden vom Hals geerbt" -#: convertrules.py:3672 +#: convertrules.py:3675 msgid "Staff-padding now controls the distance to the baseline, not the nearest point." msgstr "Staff-padding kontrolliert jetzt den Abstand zur Grundlinie, nicht zum nächsten Punkt." @@ -947,12 +948,12 @@ msgstr "Tonartalterationsoktave für eine nicht existente Alteration Nr. %s ange msgid "Unable to find instrument for ID=%s\n" msgstr "Kann kein Instrument für ID=%s finden\n" -#: abc2ly.py:1386 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 +#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 #, python-format msgid "%s [OPTION]... FILE" msgstr "%s [OPTIONEN]... DATEI" -#: abc2ly.py:1387 +#: abc2ly.py:1390 #, python-format msgid "" "abc2ly converts ABC music files (see\n" @@ -961,29 +962,29 @@ msgstr "" "abc2ly wandelt ABC-Musikdateien in LilyPond-Eingabe um\n" "(siehe auch %s).\n" -#: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 -#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:181 +#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 +#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184 msgid "show version number and exit" msgstr "Versionsnummer ausgeben und beenden" -#: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 -#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:160 +#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 +#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163 msgid "show this help and exit" msgstr "diese Hilfe anzeigen und beenden" -#: abc2ly.py:1401 etf2ly.py:1209 midi2ly.py:1071 +#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071 msgid "write output to FILE" msgstr "Ausgabe in DATEI schreiben" -#: abc2ly.py:1404 +#: abc2ly.py:1407 msgid "be strict about success" msgstr "bzgl. Erfolg streng sein" -#: abc2ly.py:1407 +#: abc2ly.py:1410 msgid "preserve ABC's notion of beams" msgstr "ABCs Prinzip der Balken beibehalten" -#: abc2ly.py:1410 +#: abc2ly.py:1413 msgid "suppress progress messages" msgstr "Fortschrittbenachrichtigung unterdrücken" @@ -991,8 +992,8 @@ msgstr "Fortschrittbenachrichtigung unterdrücken" #. "Report bugs in English via %s", #. or if there is a LilyPond users list or forum in your language #. "Report bugs in English via %s or in YOUR_LANG via URI" -#: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 -#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:315 +#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 +#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318 #, c-format, python-format msgid "Report bugs via %s" msgstr "Melden Sie Fehler an %s" @@ -1043,7 +1044,7 @@ msgid "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS msgstr "Logmeldungen ensprechend LOGLEVEL ((NONE, ERROR, WARNING, PROGRESS (Standard), DEBUG) ausgeben" #: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181 -#: musicxml2ly.py:2629 main.cc:174 +#: musicxml2ly.py:2629 main.cc:177 msgid "LOGLEVEL" msgstr "LOGLEVEL" @@ -1075,7 +1076,7 @@ msgid "make a numbered backup [default: filename.ext~]" msgstr "erstelle eine nummerierte Sicherung [Standard: Dateibezeichnung.end~]" #: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096 -#: main.cc:183 +#: main.cc:186 msgid "show warranty and copyright" msgstr "Informationen zu Gewährleistung und Copyright anzeigen" @@ -1096,17 +1097,17 @@ msgstr "Abbruch bei letzter erfolgreicher Regel" msgid "Processing `%s'... " msgstr "»%s« wird verarbeitet..." -#: convert-ly.py:367 +#: convert-ly.py:366 #, python-format msgid "%s: Unable to open file" msgstr "%s: Konnte Datei nicht öffnen" -#: convert-ly.py:373 +#: convert-ly.py:372 #, python-format msgid "%s: Unable to determine version. Skipping" msgstr "Version für »%s« kann nicht erkannt werden. Wird übersprungen" -#: convert-ly.py:379 +#: convert-ly.py:378 #, python-format msgid "" "%s: Invalid version string `%s' \n" @@ -1115,7 +1116,7 @@ msgstr "" "%s: Ungültige Versionsangabe `%s' \n" "Gültige Versionsangaben bestehen aus drei Zahlen, durch Punkte getrennt; etwa `2.8.12'" -#: convert-ly.py:385 +#: convert-ly.py:384 #, python-format msgid "There was %d error." msgid_plural "There were %d errors." @@ -1137,7 +1138,7 @@ msgstr "" "eine von Lilypond verwendbare Datei um.\n" #: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659 -#: main.cc:166 main.cc:178 +#: main.cc:169 main.cc:181 msgid "FILE" msgstr "DATEI" @@ -1175,7 +1176,7 @@ msgid "add DIR to include path" msgstr "VERZ zum Einfügepfad hinzufügen" #: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169 -#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:165 +#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168 msgid "DIR" msgstr "VERZ" @@ -1188,7 +1189,7 @@ msgid "PAD" msgstr "FÜLLUNG" #: lilypond-book.py:157 -msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)" +msgid "pad left side of music to align music in spite of uneven bar numbers (in mm)" msgstr "verschiebe linken Rand der Noten um an den Noten auszurichten, obwohl Taktnummer ungerade ist (in mm)" #: lilypond-book.py:162 @@ -1263,76 +1264,76 @@ msgstr "benutze ausführbare Datei PROG anstelle von texi2pdf" msgid "create PDF files for use with PDFTeX" msgstr "PDF-Dateien für Verwendung mit PDFTeX erzeugen" -#: lilypond-book.py:460 +#: lilypond-book.py:463 msgid "Writing snippets..." msgstr "Auszüge werden geschrieben..." -#: lilypond-book.py:465 +#: lilypond-book.py:468 msgid "Processing..." msgstr "Verarbeiten..." -#: lilypond-book.py:470 +#: lilypond-book.py:473 msgid "All snippets are up to date..." msgstr "Alle Auszüge sind auf dem neuesten Stand..." -#: lilypond-book.py:472 +#: lilypond-book.py:475 msgid "Linking files..." msgstr "Dateien verbinden..." -#: lilypond-book.py:492 +#: lilypond-book.py:495 #, python-format msgid "cannot determine format for: %s" msgstr "Format für %s kann nicht ermittelt werden" -#: lilypond-book.py:501 +#: lilypond-book.py:504 #, python-format msgid "%s is up to date." msgstr "%s ist aktuell." -#: lilypond-book.py:514 +#: lilypond-book.py:517 #, python-format msgid "Writing `%s'..." msgstr "»%s« wird geschrieben..." -#: lilypond-book.py:577 +#: lilypond-book.py:580 msgid "Output would overwrite input file; use --output." msgstr "Ausgabe würde Eingabedatei überschreiben; verwenden Sie --output." -#: lilypond-book.py:581 +#: lilypond-book.py:584 #, python-format msgid "Reading %s..." msgstr "%s lesen..." -#: lilypond-book.py:588 +#: lilypond-book.py:591 msgid "Dissecting..." msgstr "Zerlegen..." -#: lilypond-book.py:599 +#: lilypond-book.py:602 #, python-format msgid "Compiling %s..." msgstr "%s kompilieren..." -#: lilypond-book.py:607 +#: lilypond-book.py:610 #, python-format msgid "Processing include: %s" msgstr "Einfügung wird verarbeitet: %s" -#: lilypond-book.py:618 +#: lilypond-book.py:621 #, python-format msgid "Removing `%s'" msgstr "»%s« wird gelöscht" -#: lilypond-book.py:711 +#: lilypond-book.py:727 #, python-format msgid "Setting LilyPond's loglevel to %s" msgstr "Logstufe von LilyPond wird auf %s gesetzt" -#: lilypond-book.py:715 +#: lilypond-book.py:731 #, python-format msgid "Setting LilyPond's loglevel to %s (from environment variable LILYPOND_LOGLEVEL)" msgstr "Logstufe von LilyPond wird auf %s gesetzt (aus Umgebungsvariable LILYPOND_LOGLEVEL)" -#: lilypond-book.py:718 +#: lilypond-book.py:734 msgid "Setting LilyPond's output to --verbose, implied by lilypond-book's setting" msgstr "LilyPond-Ausgabe auf --verbose setzen, entsprechend der Einstellungen von lilypond-book" @@ -1552,12 +1553,12 @@ msgstr "" #: musicxml2ly.py:2576 msgid "" -"Copyright (c) 2005--2012 by\n" +"Copyright (c) 2005--2015 by\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen and\n" " Reinhold Kainhofer \n" msgstr "" -"Copyright (c) 2005--2012\n" +"Copyright (c) 2005--2015\n" "····Han-Wen·Nienhuys·,\n" "····Jan·Nieuwenhuizen··and\n" "····Reinhold·Kainhofer·\n" @@ -1643,15 +1644,15 @@ msgstr "Ausgabe nach »%s«" msgid "Unable to find input file %s" msgstr "Eingabedatei kann nicht gefunden werden %s" -#: website_post.py:125 +#: website_post.py:129 msgid "English" msgstr "Englisch" -#: website_post.py:128 +#: website_post.py:132 msgid "Other languages" msgstr "Andere Sprachen" -#: website_post.py:129 +#: website_post.py:133 #, python-format msgid "About automatic language selection." msgstr "Über die automatische Sprachauswahl." @@ -1726,21 +1727,21 @@ msgstr "unterdrückte Warnung: %s" msgid "accidental typesetting list must begin with context-name: %s" msgstr "Versetzungszeichensatzliste muss mit Kontextnamen beginnen: %s" -#: accidental-engraver.cc:210 +#: accidental-engraver.cc:207 #, c-format msgid "procedure or context-name expected for accidental rule, found %s" msgstr "Prozedur oder Kontextname für Versetzungszeichenregel erwartet, %s gefunden" -#: accidental.cc:169 +#: accidental.cc:141 #, c-format msgid "Could not find glyph-name for alteration %s" msgstr "Glyph-Name für Versetzungszeichen %s konnte nicht gefunden werden" -#: accidental.cc:184 +#: accidental.cc:157 msgid "natural alteration glyph not found" msgstr "Auflösungszeichen konnte nicht gefunden werden" -#: all-font-metrics.cc:149 +#: all-font-metrics.cc:159 #, c-format msgid "cannot find font: `%s'" msgstr "Schriftart kann nicht gefunden werden: »%s«" @@ -1753,29 +1754,24 @@ msgstr "Argument für \\applycontext ist keine Prozedur" msgid "no heads for arpeggio found?" msgstr "keine Notenköpfe für Arpeggio gefunden?" -#: auto-change-iterator.cc:74 change-iterator.cc:72 -#, c-format -msgid "cannot change, already in translator: %s" -msgstr "kann nicht geändert werden, bereits im Übersetzer: %s" - -#: axis-group-engraver.cc:147 +#: axis-group-engraver.cc:149 msgid "Axis_group_engraver: vertical group already has a parent" msgstr "Axis_group_engraver: vertikale Gruppe hat bereits einen Vater" -#: axis-group-engraver.cc:148 +#: axis-group-engraver.cc:150 msgid "are there two Axis_group_engravers?" msgstr "gibt es zwei Axis_group_engravers?" -#: axis-group-engraver.cc:149 +#: axis-group-engraver.cc:151 msgid "removing this vertical group" msgstr "Entfernen dieser vertikalen Gruppe" -#: axis-group-interface.cc:704 +#: axis-group-interface.cc:716 #, c-format msgid "\"%s\" is not a valid outside-staff-placement-directive" msgstr "»%s« ist keine gültige outside-staff-placement-directive" -#: axis-group-interface.cc:776 +#: axis-group-interface.cc:788 msgid "an outside-staff object should have a direction, defaulting to up" msgstr "Ein Objekt außerhalb der Notenzeile sollte eine Richtung haben, Vorgabe ist »nach oben«" @@ -1805,11 +1801,11 @@ msgid "beam was started here" msgstr "Balken wurde hier begonnen" #. We are completely screwed. -#: beam-quanting.cc:839 +#: beam-quanting.cc:850 msgid "no viable initial configuration found: may not find good beam slope" msgstr "Keine funktionsfähige Anfangskonfiguration gefunden: Es kann evtl. keine optimale Balkenneigung gefunden werden" -#: beam.cc:181 +#: beam.cc:183 msgid "removing beam with no stems" msgstr "Balken ohne Notenhälse wird entfernt" @@ -1819,22 +1815,24 @@ msgid "cannot change `%s' to `%s'" msgstr "»%s« kann nicht in »%s« geändert werden" #. FIXME: constant error message. -#: change-iterator.cc:93 +#: change-iterator.cc:67 msgid "cannot find context to switch to" msgstr "es kann kein Kontext zum Umschalten gefunden werden" +#. No enclosing context was found because the iterator's immediate +#. context is the kind that was sought. #. We could change the current translator's id, but that would make #. errors hard to catch. #. #. last->translator_id_string () = get_change #. ()->change_to_id_string (); -#: change-iterator.cc:102 +#: change-iterator.cc:78 #, c-format msgid "not changing to same context type: %s" msgstr "kein Umschalten zum gleichen Kontexttypen: %s" -#. FIXME: uncomprehensable message -#: change-iterator.cc:106 +#. FIXME: incomprehensible message +#: change-iterator.cc:82 msgid "none of these in my family" msgstr "keiner davon befindet sich in meiner Familie" @@ -1869,26 +1867,26 @@ msgstr "Coherent_ligature_engraver: setze »spacing-increment=0.01«: ptr=%ul" msgid "cannot find line breaking that satisfies constraints" msgstr "es kann kein Zeilenumbruch gefunden werden, der die Bedingungen erfüllen" -#: context-property.cc:43 +#: context-property.cc:46 msgid "need symbol arguments for \\override and \\revert" msgstr "Symbol-Argumente für \\override und \\revert benötigt" -#: context.cc:149 +#: context.cc:144 #, c-format msgid "cannot find or create new `%s'" msgstr "ein neues »%s« kann weder gefunden noch erzeugt werden" -#: context.cc:228 +#: context.cc:223 #, c-format msgid "cannot find or create `%s' called `%s'" msgstr "»%s« (»%s« genannt) kann weder gefunden noch erzeugt werden" -#: context.cc:425 +#: context.cc:416 #, c-format msgid "cannot find or create: `%s'" msgstr "»%s« kann weder gefunden noch erzeugt werden" -#: context.cc:439 +#: context.cc:430 #, c-format msgid "cannot find or create new Bottom = \"%s\"" msgstr "ein neues Bottom = \"%s\" kann weder gefunden noch erzeugt werden" @@ -1898,20 +1896,20 @@ msgstr "ein neues Bottom = \"%s\" kann weder gefunden noch erzeugt werden" msgid "custos `%s' not found" msgstr "Custos »%s« nicht gefunden" -#: dispatcher.cc:89 +#: dispatcher.cc:82 msgid "Event class should be a list" msgstr "Ereignisklasse sollte eine Liste sein" -#: dispatcher.cc:172 +#: dispatcher.cc:165 #, c-format msgid "Junking event: %s" msgstr "Ereignis wird verworfen: »%s«" -#: dispatcher.cc:277 +#: dispatcher.cc:279 msgid "Attempting to remove nonexisting listener." msgstr "Versuche, nicht existierende listener zu entfernen." -#: dispatcher.cc:303 +#: dispatcher.cc:305 msgid "Already listening to dispatcher, ignoring request" msgstr "Höre schon dem Rechenzeitverteiler zu, Anforderung wird irgnoriert" @@ -1920,7 +1918,7 @@ msgstr "Höre schon dem Rechenzeitverteiler zu, Anforderung wird irgnoriert" msgid "dot `%s' not found" msgstr "Punkt »%s« nicht gefunden" -#: dynamic-engraver.cc:168 +#: dynamic-engraver.cc:169 #, c-format msgid "" "unknown crescendo style: %s\n" @@ -1929,7 +1927,7 @@ msgstr "" "unbekannter crescendo-Stil: %s\n" "wird als spitze Klammer gesetzt." -#: dynamic-engraver.cc:233 slur-proto-engraver.cc:119 +#: dynamic-engraver.cc:234 slur-proto-engraver.cc:119 #, c-format msgid "unterminated %s" msgstr "unbegrenzt: »%s«" @@ -1957,22 +1955,22 @@ msgstr "unbegrenztes Episema" msgid "unterminated extender" msgstr "unbegrenzter Textunterstrich" -#: flag.cc:134 +#: flag.cc:133 #, c-format msgid "flag `%s' not found" msgstr "Fähnchen »%s« nicht gefunden" -#: flag.cc:154 +#: flag.cc:153 #, c-format msgid "flag stroke `%s' not found" msgstr "Fähnchenstrich »%s« nicht gefunden" -#: font-config-scheme.cc:151 font-config.cc:53 +#: font-config-scheme.cc:151 font-config.cc:82 #, c-format msgid "failed adding font directory: %s" msgstr "Schriftartverzeichnis konnte nicht hinzugefügt werden: %s" -#: font-config-scheme.cc:153 font-config.cc:55 +#: font-config-scheme.cc:153 font-config.cc:84 #, c-format msgid "Adding font directory: %s" msgstr "Schriftartverzeichnis wird hinzugefügt: %s" @@ -1991,7 +1989,17 @@ msgstr "Schriftartdatei wird hinzugefügt: %s" msgid "Initializing FontConfig..." msgstr "FontConfig wird initialisiert..." -#: font-config.cc:58 +#: font-config.cc:70 +#, c-format +msgid "failed to add fontconfig configuration file `%s'" +msgstr "Schriftkonfigurationsdatei »%s« für fontconfig konnte nicht hinzugefügt werden" + +#: font-config.cc:73 +#, c-format +msgid "Adding fontconfig configuration file: %s" +msgstr "Schriftkonfigurationsdatei für fontconfig wird hinzugefügt: %s" + +#: font-config.cc:86 msgid "Building font database..." msgstr "Schriftartendatenbank erstellen..." @@ -1999,12 +2007,12 @@ msgstr "Schriftartendatenbank erstellen..." msgid "Must be footnote-event." msgstr "Muss ein Fußnoten-Ereignis sein." -#: general-scheme.cc:390 +#: general-scheme.cc:403 #, c-format msgid "failed redirecting stderr to `%s'" msgstr "Konnte stderr nicht nach %s umleiten" -#: general-scheme.cc:469 output-ps.scm:48 +#: general-scheme.cc:482 output-ps.scm:48 msgid "Found infinity or nan in output. Substituting 0.0" msgstr "Unendlich oder nan in Ausgabe gefunden. Wird durch 0.0 ersetzt" @@ -2055,21 +2063,21 @@ msgstr "Unbekannte Schnittstelle »%s«" msgid "Grob `%s' has no interface for property `%s'" msgstr "Grob »%s« hat keine Schnittstelle für Eigenschaft »%s«" -#: grob-property.cc:35 +#: grob-property.cc:33 #, c-format msgid "%d: %s" msgstr "%d: %s" -#: grob.cc:488 +#: grob.cc:492 #, c-format msgid "ignored infinite %s-offset" msgstr "unendliche %s-Verschiebung ignoriert" #: hairpin.cc:60 msgid "Asking for broken bound padding at a non-broken bound." -msgstr "" +msgstr "Verschiebung von gebrochenem Verbund gefordert, aber nicht-gebrochene Verbindung gefunden." -#: hairpin.cc:256 +#: hairpin.cc:257 msgid "decrescendo too small" msgstr "Decrescendo zu kurz" @@ -2089,7 +2097,7 @@ msgstr "unbegrenzter Bindestrich wird entfernt" msgid "unterminated hyphen; removing" msgstr "unbegrenzter Bindestrich; entfernt" -#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108 +#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108 #, c-format msgid "cannot find file: `%s'" msgstr "Datei »%s« kann nicht gefunden werden" @@ -2099,11 +2107,11 @@ msgstr "Datei »%s« kann nicht gefunden werden" msgid "(search path: `%s')" msgstr "(Suchpfad: »%s«)" -#: input.cc:138 source-file.cc:178 source-file.cc:193 +#: input.cc:138 source-file.cc:180 source-file.cc:195 msgid "position unknown" msgstr "Position unbekannt" -#: key-engraver.cc:198 +#: key-engraver.cc:197 msgid "Incomplete keyAlterationOrder for key signature" msgstr "keyAlterationOrder für die Vorzeichen ist nicht vollständig" @@ -2144,21 +2152,21 @@ msgstr "Pause wird ignoriert: Ligatur darf keine Pause enthalten" msgid "ligature was started here" msgstr "Ligatur wurde hier begonnen" -#: lily-guile.cc:93 +#: lily-guile.cc:94 #, c-format msgid "(load path: `%s')" msgstr "(Lade-Pfad: `%s')" -#: lily-guile.cc:412 +#: lily-guile.cc:413 #, c-format msgid "cannot find property type-check for `%s' (%s)." msgstr "Eigenschafts-Typprüfung für »%s« (%s) kann nicht gefunden werden." -#: lily-guile.cc:415 +#: lily-guile.cc:416 msgid "perhaps a typing error?" msgstr "vielleicht ein Tippfehler?" -#: lily-guile.cc:422 +#: lily-guile.cc:423 msgid "skipping assignment" msgstr "Zuweisung wird übersprungen" @@ -2167,20 +2175,33 @@ msgstr "Zuweisung wird übersprungen" msgid "type check for `%s' failed; value `%s' must be of type `%s'" msgstr "Typprüfung für »%s« gescheitert; Wert »%s« muss vom Typ »%s« sein" -#: lily-lexer.cc:249 +#. Uh oh. unsmob delivered 0, yet +#. unsmob delivers true. This means that unsmob is a +#. matching check from a base class of T, but var is of an +#. incompatible derived type. +#: lily-guile.cc:462 +msgid "Wrong kind of " +msgstr "Falsche Art " + +#: lily-lexer.cc:251 msgid "include files are not allowed in safe mode" msgstr "eingefügte Dateien sind im abgesicherten Modus nicht erlaubt" -#: lily-lexer.cc:276 +#: lily-lexer.cc:278 #, c-format msgid "identifier name is a keyword: `%s'" msgstr "Bezeichnername ist ein Schlüsselwort: »%s«" -#: lily-lexer.cc:297 lily-lexer.cc:310 +#: lily-lexer.cc:299 lily-lexer.cc:312 #, c-format msgid "%s:EOF" msgstr "%s:EOF" +#: lily-modules.cc:81 +#, c-format +msgid "Uninitialized variable `%s' in module (%s)" +msgstr "Nicht initialisierte Variable »%s« im Modul (%s)" + #: lily-parser-scheme.cc:80 #, c-format msgid "Changing working directory to: `%s'" @@ -2201,37 +2222,33 @@ msgstr "Init-Datei kann nicht gefunden werden: »%s«" msgid "Processing `%s'" msgstr "»%s« wird verarbeitet" -#: lily-parser-scheme.cc:209 +#: lily-parser-scheme.cc:210 msgid "ly:parser-parse-string is only valid with a new parser. Use ly:parser-include-string instead." msgstr "ly:parser-parse-string ist nur mit einem neuen Parser gültig. Anstelle dessen ly:parser-include-string benutzen." -#: lily-parser-scheme.cc:240 +#: lily-parser-scheme.cc:241 msgid "ly:parse-string-expression is only valid with a new parser. Use ly:parser-include-string instead." msgstr "ly:parse-string-expression ist nur mit einem neuen Parser gültig. Anstelle dessen ly:parser-include-string benutzen." -#: lily-parser.cc:107 +#: lily-parser.cc:106 msgid "Parsing..." msgstr "Analysieren..." -#: lookup.cc:181 +#: lookup.cc:178 #, c-format msgid "Not drawing a box with negative dimension, %.2f by %.2f." msgstr "Kasten mit negativen Ausmaßen wird nicht gezeichnet, %.2f mal %.2f." -#: lyric-combine-music-iterator.cc:199 +#: lyric-combine-music-iterator.cc:204 msgid "argument of \\lyricsto should contain Lyrics context" msgstr "das Argument von \\lyricsto muss einen Lyrics-Kontext enthalten" -#: lyric-combine-music-iterator.cc:337 +#: lyric-combine-music-iterator.cc:344 #, c-format -msgid "cannot find Voice `%s'" -msgstr "Stimme kann nicht gefunden werden: »%s«" +msgid "cannot find %s `%s'" +msgstr "%s »%s« kann nicht gefunden werden" -#: lyric-engraver.cc:186 -msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." -msgstr "Textsilbe hat keine Note. \\lyricsto oder associatedVoice verwenden." - -#: main.cc:104 +#: main.cc:106 #, c-format msgid "" "This program is free software. It is covered by the GNU General Public\n" @@ -2244,7 +2261,7 @@ msgstr "" "Bedingungen weitergeben. Rufen Sie »%s --warranty« für weitere\n" "Informationen auf.\n" -#: main.cc:110 +#: main.cc:112 msgid "" " This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License as \n" @@ -2276,11 +2293,11 @@ msgstr "" "Sie bitte an die Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n" "Boston, MA 02111-1307, USA.\n" -#: main.cc:148 +#: main.cc:150 msgid "SYM[=VAL]" msgstr "SYM[=WERT]" -#: main.cc:149 +#: main.cc:151 msgid "" "set Scheme option SYM to VAL (default: #t).\n" "Use -dhelp for help." @@ -2288,59 +2305,63 @@ msgstr "" "Scheme-Option SYM auf WERT setzen (Vorgabe: #t).\n" "-dhelp für Hilfe verwenden." -#: main.cc:153 +#: main.cc:155 msgid "EXPR" msgstr "AUSD" -#: main.cc:153 +#: main.cc:155 msgid "evaluate scheme code" msgstr "Scheme-Code auswerten" #. Bug in option parser: --output =foe is taken as an abbreviation #. for --output-format. -#: main.cc:156 +#: main.cc:158 msgid "FORMATs" msgstr "FORMATe" -#: main.cc:156 +#: main.cc:158 msgid "dump FORMAT,... Also as separate options:" msgstr "dump FORMAT,... Auch als separate Optionen:" -#: main.cc:157 +#: main.cc:159 msgid "generate PDF (default)" msgstr "PDF erzeugen (Standard)" -#: main.cc:158 +#: main.cc:160 msgid "generate PNG" msgstr "PNG erzeugen" -#: main.cc:159 +#: main.cc:161 msgid "generate PostScript" msgstr "PostScript erzeugen" #: main.cc:162 +msgid "generate big PDF files" +msgstr "große PDFs erzeugen" + +#: main.cc:165 msgid "FIELD" msgstr "FELD" -#: main.cc:162 +#: main.cc:165 msgid "" "dump header field FIELD to file\n" "named BASENAME.FIELD" msgstr "Header-Feld FELD in Datei BASISNAME.FELD schreiben" -#: main.cc:165 +#: main.cc:168 msgid "add DIR to search path" msgstr "VERZ zum Suchpfad hinzufügen" -#: main.cc:166 +#: main.cc:169 msgid "use FILE as init file" msgstr "DATEI als Anfangsdatei verwenden" -#: main.cc:169 +#: main.cc:172 msgid "USER, GROUP, JAIL, DIR" msgstr "BENUTZER,GRUPPE,KERKER,VERZ" -#: main.cc:169 +#: main.cc:172 msgid "" "chroot to JAIL, become USER:GROUP\n" "and cd into DIR" @@ -2348,7 +2369,7 @@ msgstr "" "chroot in KERKER, wird BENUTZER:GRUPPE\n" "und cd in VERZ" -#: main.cc:174 +#: main.cc:177 msgid "" "print log messages according to LOGLEVEL. Possible values are:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG." @@ -2356,24 +2377,24 @@ msgstr "" "Logmeldungen nach LOGLEVEL-Einstellung ausgeben. Mögliche Werte:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (Standard) und DEBUG." -#: main.cc:178 +#: main.cc:181 msgid "write output to FILE (suffix will be added)" msgstr "Ausgabe in DATEI schreiben (Endung wird hinzugefügt)" -#: main.cc:179 +#: main.cc:182 msgid "relocate using directory of lilypond program" msgstr "wiederfinden mit Hilfe des Lilypond-Programmverzeichnisses" -#: main.cc:180 +#: main.cc:183 msgid "no progress, only error messages (equivalent to loglevel=ERROR)" msgstr "kein Forschritt, nur Fehlermeldungen (entspricht LOGLEVEL=ERROR)" -#: main.cc:182 +#: main.cc:185 msgid "be verbose (equivalent to loglevel=DEBUG)" msgstr "ausführlich sein (entspricht LOGLEVEL=DEBUG)" #. Do not update the copyright years here, run `make grand-replace' -#: main.cc:261 +#: main.cc:264 #, c-format msgid "" "Copyright (c) %s by\n" @@ -2383,84 +2404,84 @@ msgstr "" "%s und anderen." #. No version number or newline here. It confuses help2man. -#: main.cc:299 +#: main.cc:302 #, c-format msgid "Usage: %s [OPTION]... FILE..." msgstr "Aufruf: %s [OPTION]... DATEI..." -#: main.cc:301 +#: main.cc:304 msgid "Typeset music and/or produce MIDI from FILE." msgstr "Musiksatz und/oder MIDI aus DATEI erzeugen." -#: main.cc:303 +#: main.cc:306 msgid "LilyPond produces beautiful music notation." msgstr "LilyPond erzeugt ansprechenden Notensatz." -#: main.cc:305 +#: main.cc:308 #, c-format msgid "For more information, see %s" msgstr "Für weitere Informationen siehe %s" -#: main.cc:307 +#: main.cc:310 msgid "Options:" msgstr "Optionen:" -#: main.cc:374 +#: main.cc:377 #, c-format msgid "expected %d arguments with jail, found: %u" msgstr "%d Argumente mit Kerker erwartet, %u gefunden" -#: main.cc:388 +#: main.cc:391 #, c-format msgid "no such user: %s" msgstr "kein solcher Benutzer: %s" -#: main.cc:390 +#: main.cc:393 #, c-format msgid "cannot get user id from user name: %s: %s" msgstr "Benutzer-ID von Benutzername kann nicht gefunden werden: %s: %s" -#: main.cc:405 +#: main.cc:408 #, c-format msgid "no such group: %s" msgstr "keine solche Gruppe: %s" -#: main.cc:407 +#: main.cc:410 #, c-format msgid "cannot get group id from group name: %s: %s" msgstr "Gruppen-ID kann nicht von Gruppenname ermittelt werden: %s: %s" -#: main.cc:415 +#: main.cc:418 #, c-format msgid "cannot chroot to: %s: %s" msgstr "kein chroot möglich nach: %s: %s" -#: main.cc:422 +#: main.cc:425 #, c-format msgid "cannot change group id to: %d: %s" msgstr "Gruppen-ID kann nicht geändert werden in: %d: %s" -#: main.cc:428 +#: main.cc:431 #, c-format msgid "cannot change user id to: %d: %s" msgstr "Benutzer-ID kann nicht geändert werden in: %d: %s" -#: main.cc:434 +#: main.cc:437 #, c-format msgid "cannot change working directory to: %s: %s" msgstr "aktuelles Verzeichnis kann nicht geändert werden in: %s: %s" -#: main.cc:805 +#: main.cc:826 #, c-format msgid "exception caught: %s" msgstr "Ausnahme gefangen: %s" #. FIXME: constant error message. -#: mark-engraver.cc:156 +#: mark-engraver.cc:150 msgid "rehearsalMark must have integer value" msgstr "rehearsalMark muss Ganzzahlwert haben" -#: mark-engraver.cc:162 +#: mark-engraver.cc:156 msgid "mark label must be a markup object" msgstr "Marke muss ein Textbeschriftungsobjekt sein" @@ -2512,17 +2533,17 @@ msgstr "" msgid "unexpected case fall-through" msgstr "unerwarteter case-Ausgang" -#: midi-control-function-performer.cc:109 staff-performer.cc:152 +#: midi-control-function-performer.cc:107 staff-performer.cc:153 #, c-format msgid "ignoring out-of-range value change for MIDI property `%s'" msgstr "Wertänderung außerhalb der Reichweite für MIDI-Eigenschaft »%s« ignoriert" -#: midi-item.cc:92 +#: midi-item.cc:93 #, c-format msgid "no such MIDI instrument: `%s'" msgstr "kein MIDI-Instrument: `%s'" -#: midi-item.cc:178 +#: midi-item.cc:179 msgid "Time signature with more than 255 beats. Truncating" msgstr "Taktart mit mehr als 255 Schlägen. " @@ -2536,7 +2557,7 @@ msgstr "Es kann nicht zum Schreiben geöffnet werden: %s: %s" msgid "cannot write to file: `%s'" msgstr "Es kann nicht in Datei geschrieben werden: »%s«" -#: minimal-page-breaking.cc:40 paper-score.cc:122 +#: minimal-page-breaking.cc:40 paper-score.cc:116 msgid "Calculating line breaks..." msgstr "Zeilenumbrüche werden berechnet..." @@ -2544,28 +2565,15 @@ msgstr "Zeilenumbrüche werden berechnet..." msgid "Calculating page breaks..." msgstr "Zeilenumbrüche werden berechnet..." -#: multi-measure-rest.cc:154 +#: multi-measure-rest.cc:152 msgid "usable-duration-logs must be a non-empty list. Falling back to whole rests." msgstr "usable-duration-logs muss eine nicht-leere Liste sein. Falle auf ganze Pausen zurück." -#: multi-measure-rest.cc:364 -msgid "Using naive multi measure rest spacing." -msgstr "Benutze simple Platzierung von Mehrtaktpausen." - #: music.cc:150 #, c-format msgid "octave check failed; expected \"%s\", found: \"%s\"" msgstr "Oktavenüberprüfung gescheitert; »%s« erwartet, »%s« gefunden" -#: music.cc:219 -msgid "(normalized pitch)" -msgstr "(normalisierte Tonhöhe)" - -#: music.cc:223 -#, c-format -msgid "Transposing %s by %s makes alteration larger than double" -msgstr "Transponieren von %s um %s erzeugt mehr als ein Doppel-Vorzeichen" - #: new-fingering-engraver.cc:113 msgid "cannot add text scripts to individual note heads" msgstr "es kann kein Text zu einzelnen Notenköpfen hinzugefügt werden" @@ -2578,11 +2586,11 @@ msgstr "Keine Platzierung für Fingersatz gefunden" msgid "placing below" msgstr "Platzierung darunter" -#: note-collision.cc:497 -msgid "ignoring too many clashing note columns" -msgstr "zu viele kollidierende Notenspalten werden ignoriert" +#: note-collision.cc:510 +msgid "this Voice needs a \\voiceXx or \\shiftXx setting" +msgstr "dieser Stimmen-Kontext braucht \\voiceXx oder \\shiftXx Einstellungen" -#: note-column.cc:147 +#: note-column.cc:150 msgid "cannot have note heads and rests together on a stem" msgstr "Notenköpfe und Pausen können nicht zusammen an einem Hals auftreten" @@ -2610,22 +2618,22 @@ msgstr "Schriftarttabelle kann nicht geladen werden: %s" msgid "FreeType error: %s" msgstr "FreeType-Fehler: %s" -#: open-type-font.cc:111 +#: open-type-font.cc:115 #, c-format msgid "unsupported font format: %s" msgstr "nicht unterstütztes Schriftartformat: %s" -#: open-type-font.cc:113 +#: open-type-font.cc:117 #, c-format msgid "error reading font file %s: %s" msgstr "Fehler beim Lesen der Schriftartdatei: %s: %s" -#: open-type-font.cc:188 +#: open-type-font.cc:192 #, c-format msgid "FT_Get_Glyph_Name () Freetype error: %s" msgstr "FT_Get_Glyph_Name() Freetype-Fehler: %s" -#: open-type-font.cc:336 pango-font.cc:256 +#: open-type-font.cc:340 pango-font.cc:258 #, c-format msgid "FT_Get_Glyph_Name () error: %s" msgstr "FT_Get_Glyph_Name() Fehler: %s" @@ -2635,121 +2643,122 @@ msgstr "FT_Get_Glyph_Name() Fehler: %s" msgid "Finding the ideal number of pages..." msgstr "Ideale Seitenanzahl wird gefunden..." -#: optimal-page-breaking.cc:92 +#: optimal-page-breaking.cc:94 msgid "could not satisfy systems-per-page and page-count at the same time, ignoring systems-per-page" msgstr "konnte nicht systems-per-page und page-count gleichzeitig anwenden, ignoriere systems-per-page" -#: optimal-page-breaking.cc:112 +#: optimal-page-breaking.cc:114 msgid "Fitting music on 1 page..." msgstr "Musik wird auf eine Seite angepasst..." -#: optimal-page-breaking.cc:114 +#: optimal-page-breaking.cc:116 #, c-format msgid "Fitting music on %d pages..." msgstr "Musik wird auf %d Seiten angepasst..." -#: optimal-page-breaking.cc:116 +#: optimal-page-breaking.cc:118 #, c-format msgid "Fitting music on %d or %d pages..." msgstr "Musik wird auf %d oder %d Seiten angepasst..." -#: optimal-page-breaking.cc:126 optimal-page-breaking.cc:179 +#: optimal-page-breaking.cc:128 optimal-page-breaking.cc:181 #, c-format msgid "trying %d systems" msgstr "versuche %d Systeme" -#: optimal-page-breaking.cc:145 optimal-page-breaking.cc:207 +#: optimal-page-breaking.cc:147 optimal-page-breaking.cc:209 #, c-format msgid "best score for this sys-count: %f" msgstr "bester Score für dieses sys-count: %f" -#: optimal-page-breaking.cc:214 page-turn-page-breaking.cc:248 -#: paper-score.cc:162 +#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249 +#: paper-score.cc:156 msgid "Drawing systems..." msgstr "Systeme erstellen..." -#: output-def.cc:235 +#: output-def.cc:229 msgid "margins do not fit with line-width, setting default values" msgstr "Ränder passen nicht zur Zeilenbreite, setze Standardwerte" -#: output-def.cc:242 +#: output-def.cc:236 msgid "systems run off the page due to improper paper settings, setting default values" msgstr "Systeme befinden sich außerhalb der Seite wegen falschen paper-Einstellungen, setze Standardwerte ein" -#: page-breaking.cc:277 +#: page-breaking.cc:276 msgid "ignoring min-systems-per-page and max-systems-per-page because systems-per-page was set" msgstr "ignoriere min-systems-per-page und max-systems-per-page weil systems-per-page definiert wurde" -#: page-breaking.cc:282 +#: page-breaking.cc:281 msgid "min-systems-per-page is larger than max-systems-per-page, ignoring both values" msgstr "min-systems-per-page ist größer als max-systems-per-page, beide Werte werden ignoriert" -#: page-layout-problem.cc:402 +#: page-breaking.cc:636 +#, c-format +msgid "page %d has been compressed" +msgstr "Seite %d wurde komprimiert" + +#: page-layout-problem.cc:400 msgid "A page layout problem has been initiated that cannot accommodate footnotes." msgstr "Ein Seitenlayoutproblem wurde initiiert, das Fußnoten nicht aufnehmen kann." -#: page-layout-problem.cc:731 -msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" -msgstr "Noten passen nicht auf die Seite: ragged-spacing wurde verlangt, aber die Seite wurde komprimiert" +#: page-layout-problem.cc:729 +msgid "ragged-bottom was specified, but page must be compressed" +msgstr "ragged-bottom angefordert, aber Seite muss komprimiert sein" -#: page-layout-problem.cc:734 +#: page-layout-problem.cc:732 #, c-format -msgid "cannot fit music on page: overflow is %f" -msgstr "Noten passen nicht auf die Seite: Überhang ist %f" - -#: page-layout-problem.cc:736 -msgid "compressing music to fit" -msgstr "Noten werden komprimiert um zu passen" +msgid "compressing over-full page by %.1f staff-spaces" +msgstr "Komprimierung über gesamte Seite bei %.1f Notensystemabständen" -#: page-layout-problem.cc:1199 +#: page-layout-problem.cc:1197 msgid "staff-affinities should only decrease" msgstr "staff-affinities sollten nur abnehmen" -#: page-turn-page-breaking.cc:168 +#: page-turn-page-breaking.cc:169 #, c-format msgid "page-turn-page-breaking: breaking from %d to %d" msgstr "Seitenwechsel-Seitenumbruch: Umbruch von %d zu %d" -#: page-turn-page-breaking.cc:217 +#: page-turn-page-breaking.cc:218 msgid "cannot fit the first page turn onto a single page. Consider setting first-page-number to an even number." msgstr "Erster Seitenwechsel kann nicht auf einzelne Seite gelegt werden. In Betracht zu ziehen wäre das Setzen von first-page-number auf gerade Zahl." -#: page-turn-page-breaking.cc:230 +#: page-turn-page-breaking.cc:231 #, c-format msgid "Calculating page and line breaks (%d possible page breaks)..." msgstr "Seiten- und Zeilenumbrüche werden berechnet (%d mögliche Seitenumbrüche)..." -#: page-turn-page-breaking.cc:300 +#: page-turn-page-breaking.cc:301 #, c-format msgid "break starting at page %d" msgstr "Umbruch beginnt auf Seite %d" -#: page-turn-page-breaking.cc:301 +#: page-turn-page-breaking.cc:302 #, c-format msgid "\tdemerits: %f" msgstr "Optimale Bewertung: %f" -#: page-turn-page-breaking.cc:302 +#: page-turn-page-breaking.cc:303 #, c-format msgid "\tsystem count: %d" msgstr "\tSystemanzahl: %d" -#: page-turn-page-breaking.cc:303 +#: page-turn-page-breaking.cc:304 #, c-format msgid "\tpage count: %d" msgstr "\tSeitenanzahl: %d" -#: page-turn-page-breaking.cc:304 +#: page-turn-page-breaking.cc:305 #, c-format msgid "\tprevious break: %d" msgstr "\tvorheriger Umbruch: %d" -#: pango-font.cc:245 +#: pango-font.cc:247 #, c-format msgid "no glyph for character U+%0X in font `%s'" msgstr "Kein Glyph für Zeichen U+%0X in Schriftart »%s«" -#: pango-font.cc:272 +#: pango-font.cc:274 #, c-format msgid "" "Glyph has no name, but font supports glyph naming.\n" @@ -2758,21 +2767,21 @@ msgstr "" "Glyph hat keinen Namen, aber Zeichensatz unterstützt Glyphnamen.\n" "Glyph U+%0X wird übersprungen, Datei %s" -#: pango-font.cc:322 +#: pango-font.cc:324 #, c-format msgid "no PostScript font name for font `%s'" msgstr "Kein PostScript-Schriftartname für Schriftart: »%s«" -#: pango-font.cc:372 +#: pango-font.cc:374 msgid "FreeType face has no PostScript font name" msgstr "FreeType-Schriftart hat keinen PostScript-Schriftartnamen" -#: paper-book.cc:214 +#: paper-book.cc:200 #, c-format msgid "program option -dprint-pages not supported by backend `%s'" msgstr "Programmoption -dprint-pages nicht von Backend »%s« unterstützt" -#: paper-book.cc:233 +#: paper-book.cc:219 #, c-format msgid "program option -dpreview not supported by backend `%s'" msgstr "Programmoption -dpreview nicht von »%s« unterstützt" @@ -2786,37 +2795,33 @@ msgstr "erzwungener Umbruch war durch anderes Ereignis aufgehoben, sollten Takt msgid "Layout output to `%s'..." msgstr "Layout nach »%s« ausgeben..." -#: paper-score.cc:134 +#: paper-score.cc:128 #, c-format msgid "Element count %d (spanners %d) " msgstr "Elementanzahl: %d (Klammern: %d)" -#: paper-score.cc:138 +#: paper-score.cc:132 msgid "Preprocessing graphical objects..." msgstr "Vorverarbeitung der grafischen Elemente..." -#: parse-scm.cc:121 +#: parse-scm.cc:124 msgid "GUILE signaled an error for the expression beginning here" msgstr "GUILE signalisierte einen Fehler für den hier beginnenden Ausdruck" -#: partial-iterator.cc:45 -msgid "trying to use \\partial after the start of a piece" -msgstr "versuche, \\partial nach dem Beginn eines Stückes einzusetzen" - #: pdf-scheme.cc:65 #, c-format msgid "Conversion of string `%s' to UTF-16be failed: %s" msgstr "Konversion der Zeichenkette »%s« nach UTF16be fehlgeschlagen: %s" -#: percent-repeat-engraver.cc:147 +#: percent-repeat-engraver.cc:148 msgid "unterminated percent repeat" msgstr "unbegrenzte Prozentwiederholung" -#: performance.cc:54 +#: performance.cc:76 msgid "Track..." msgstr "Spur..." -#: performance.cc:82 +#: performance.cc:126 #, c-format msgid "MIDI output to `%s'..." msgstr "MIDI-Ausgabe nach »%s«..." @@ -2842,7 +2847,7 @@ msgstr "es kann kein Anfang für Piano-Pedal-Klammer gefunden werden: »%s«" msgid "no such internal option: %s" msgstr "keine solche interne Option: %s" -#: property-iterator.cc:100 +#: property-iterator.cc:115 #, c-format msgid "not a grob name, `%s'" msgstr "Kein Name für grafische Objekte (grob): »%s«" @@ -2851,25 +2856,25 @@ msgstr "Kein Name für grafische Objekte (grob): »%s«" msgid "Failed octave check, got: " msgstr "Oktavprüfung gescheitert, Rückgabe: " -#: relocate.cc:52 +#: relocate.cc:56 #, c-format msgid "Setting %s to %s" msgstr "%s wird auf %s gesetzt" #. this warning should only be printed in debug mode! -#: relocate.cc:73 +#: relocate.cc:77 #, c-format msgid "no such file: %s for %s" msgstr "keine solche Datei: %s für %s" #. this warning should only be printed in debug mode! #. this warning should only be printed in debug mode -#: relocate.cc:84 relocate.cc:102 +#: relocate.cc:88 relocate.cc:106 #, c-format msgid "no such directory: %s for %s" msgstr "kein solches Verzeichnis: %s für %s" -#: relocate.cc:93 +#: relocate.cc:97 #, c-format msgid "%s=%s (prepend)\n" msgstr "%s=%s (voranstellen)\n" @@ -2899,7 +2904,7 @@ msgstr "Verlagerung: ist absolut: argv0=%s\n" msgid "Relocation : from cwd: argv0=%s\n" msgstr "Verlagerung: von cwd: argv0=%s\n" -#: relocate.cc:194 +#: relocate.cc:196 #, c-format msgid "" "Relocation: from PATH=%s\n" @@ -2908,69 +2913,65 @@ msgstr "" "Verlagerung: von PATH=%s\n" "argv0=%s\n" -#: relocate.cc:220 +#: relocate.cc:222 msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR" msgstr "LILYPONDPREFIX is veraltet, stattdessen LILYPOND_DATADIR verwenden" -#: relocate.cc:345 +#: relocate.cc:347 #, c-format msgid "Relocation file: %s" msgstr "Verlagerungsdatei: %s" -#: relocate.cc:349 source-file.cc:65 +#: relocate.cc:351 source-file.cc:65 #, c-format msgid "cannot open file: `%s'" msgstr "Datei kann nicht geöffnet werden: »%s«" -#: relocate.cc:379 +#: relocate.cc:381 #, c-format msgid "Unknown relocation command %s" msgstr "Unbekannter Verlagerungsbefehl %s" -#: rest-collision-engraver.cc:70 -msgid "rhythmic head is not part of a rhythmic column" -msgstr "der rhythmische Kopf gehört nicht zu einer rhythmischen Kolumne" - -#: rest-collision.cc:150 +#: rest-collision.cc:154 msgid "cannot resolve rest collision: rest direction not set" msgstr "Zusammenstoß von Pausen kann nicht aufgelöst werden: Richtung von Pausen nicht gesetzt" -#: rest-collision.cc:161 rest-collision.cc:270 +#: rest-collision.cc:165 rest-collision.cc:274 msgid "too many colliding rests" msgstr "zu viele kollidierende Pausen" -#: rest.cc:240 +#: rest.cc:239 #, c-format msgid "rest `%s' not found" msgstr "Pause »%s« nicht gefunden" -#: score-engraver.cc:78 +#: score-engraver.cc:77 #, c-format msgid "cannot find `%s'" msgstr "»%s« kann nicht gefunden werden" -#: score-engraver.cc:80 +#: score-engraver.cc:79 msgid "Music font has not been installed properly." msgstr "Musik-Schriftart wurde nicht ordnungsgemäß installiert." -#: score-engraver.cc:82 +#: score-engraver.cc:81 #, c-format msgid "Search path `%s'" msgstr "Suchpfad »%s«" -#: score-engraver.cc:84 +#: score-engraver.cc:83 msgid "Aborting" msgstr "Abbruch" -#: score.cc:172 +#: score.cc:161 msgid "already have music in score" msgstr "es sind bereits Noten in der Partitur" -#: score.cc:173 +#: score.cc:163 msgid "this is the previous music" msgstr "Dies sind die vorhergehenden Noten" -#: score.cc:178 +#: score.cc:169 msgid "errors found, ignoring music expression" msgstr "Fehler gefunden, musikalischer Ausdruck wird ignoriert" @@ -2983,7 +2984,7 @@ msgstr "Interpretation für Artikulation unbekannt:" msgid " scheme encoding: " msgstr " Scheme-Kodierung: " -#: skyline-pair.cc:160 +#: skyline-pair.cc:135 msgid "direction must not be CENTER in ly:skyline-pair::skyline" msgstr "Richtung darf nicht CENTER sein in ly:skyline-pair::skyline" @@ -3009,7 +3010,7 @@ msgstr "%s ohne Grund" msgid "cannot end %s" msgstr "%s kann nicht beendet werden" -#: slur.cc:434 +#: slur.cc:436 #, c-format msgid "Ignoring grob for slur: %s. avoid-slur not set?" msgstr "Grob für Legatobogen wird ignoriert: %s. avoid-slur nicht gesetzt?" @@ -3027,16 +3028,16 @@ msgstr "MIDI-Kanal zurückgesprungen" msgid "remapping modulo 16" msgstr "modulo 16 neu zuordnen" -#: stem-engraver.cc:110 +#: stem-engraver.cc:100 msgid "tremolo duration is too long" msgstr "Tremolodauer ist zu lang" -#: stem-engraver.cc:162 +#: stem-engraver.cc:152 #, c-format msgid "adding note head to incompatible stem (type = %d/%d)" msgstr "Notenkopf wird zu inkompatiblem Hals (Typ = %d/%d) hinzugefügt" -#: stem-engraver.cc:165 +#: stem-engraver.cc:155 msgid "maybe input should specify polyphonic voices" msgstr "vielleicht sollte die Eingabe mehrere Stimmen erstellen" @@ -3044,24 +3045,18 @@ msgstr "vielleicht sollte die Eingabe mehrere Stimmen erstellen" msgid "weird stem size, check for narrow beams" msgstr "Eigenartige Notenhalslänge; auf enge Balken überprüfen" -#: system.cc:201 +#: system.cc:202 #, c-format msgid "Element count %d" msgstr "Elementanzahl %d." -#: system.cc:512 +#: system.cc:513 #, c-format msgid "Grob count %d" msgstr "Anzahl der grafischen Objekte (grob): %d" #. TODO: Also print the arguments of the markup! -#: text-interface.cc:129 -#, c-format -msgid "Cyclic markup detected: %s" -msgstr "Zyklische Beschriftung gefunden: %s" - -#. TODO: Also print the arguments of the markup! -#: text-interface.cc:142 +#: text-interface.cc:139 #, c-format msgid "Markup depth exceeds maximal value of %d; Markup: %s" msgstr "Tiefe der Beschriftung geht über maximalen Wert %d, Beschriftung: %s" @@ -3078,11 +3073,11 @@ msgstr "Textklammer bereits vorhanden" msgid "unterminated text spanner" msgstr "unbegrenzte Textklammer" -#: tie-engraver.cc:119 +#: tie-engraver.cc:121 msgid "unterminated tie" msgstr "unbegrenzter Bindebogen" -#: tie-engraver.cc:353 +#: tie-engraver.cc:377 msgid "lonely tie" msgstr "einsamer Bindebogen" @@ -3091,19 +3086,12 @@ msgstr "einsamer Bindebogen" #. #. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. #. -#: time-signature-engraver.cc:75 +#: time-signature-engraver.cc:95 #, c-format msgid "strange time signature found: %d/%d" msgstr "seltsame Taktart gefunden: %d/%d" -#. If there is no such symbol, we default to the numbered style. -#. (Here really with a warning!) -#: time-signature.cc:89 -#, c-format -msgid "time signature symbol `%s' not found; reverting to numbered style" -msgstr "Taktart-Symbol »%s« nicht gefunden; wird in nummerierten Stil umgewandelt" - -#: translator-ctors.cc:65 +#: translator-ctors.cc:68 #, c-format msgid "unknown translator: `%s'" msgstr "unbekannter Übersetzer: »%s«" @@ -3113,17 +3101,17 @@ msgstr "unbekannter Übersetzer: »%s«" msgid "fatal error. Couldn't find type: %s" msgstr "schwerwiegender Fehler. Typ konnte nicht gefunden werden: %s" -#: translator-group.cc:188 +#: translator-group.cc:187 #, c-format msgid "cannot find: `%s'" msgstr "»%s« kann nicht gefunden werden" -#: translator.cc:326 +#: translator.cc:310 #, c-format msgid "Two simultaneous %s events, junking this one" msgstr "Zwei gleichzeitige %s-Ereignisse, dieses wird verworfen" -#: translator.cc:327 +#: translator.cc:311 #, c-format msgid "Previous %s event here" msgstr "Vorheriges %s-Ereignis hier" @@ -3167,6 +3155,10 @@ msgstr "flexa-Höhe nicht definiert: 0 angenommen" msgid "ascending vaticana style flexa" msgstr "aufsteigender Vaticana-Stil flexa" +#: vertical-align-engraver.cc:95 +msgid "Ignoring Vertical_align_engraver in VerticalAxisGroup" +msgstr "Ignoriere Vertical_align_engraver in VerticalAxisGroup" + #. fixme: be more verbose. #: volta-engraver.cc:110 msgid "cannot end volta spanner" @@ -3184,201 +3176,214 @@ msgstr "endende Textklammer auch bereits vorhanden" msgid "giving up" msgstr "aufgeben" -#: parser.yy:154 parser.yy:168 -msgid "Too much lookahead" -msgstr "Zu viel Vorgriff" - -#: parser.yy:434 parser.yy:744 parser.yy:810 +#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248 msgid "bad expression type" msgstr "falsche Ausdrucksart" -#: parser.yy:642 parser.yy:1138 +#: parser.yy:859 parser.yy:1458 parser.yy:1503 msgid "not a context mod" msgstr "kein solcher Kontextmodus" -#: parser.yy:845 -msgid "score expected" -msgstr "Partitur (score) erwartet" +#: parser.yy:1054 +msgid "Missing music in \\score" +msgstr "keine Noten in der Partitur (\\score) gefunden" -#: parser.yy:861 +#: parser.yy:1091 msgid "\\paper cannot be used in \\score, use \\layout instead" msgstr "\\paper kann nicht in \\source verwendet werden; stattdessen \\layout verwenden" -#: parser.yy:885 +#: parser.yy:1126 +msgid "Spurious expression in \\score" +msgstr "Falscher Ausdruck in \\score" + +#: parser.yy:1156 msgid "need \\paper for paper block" msgstr "Für Papier-Block wird \\paper benötigt" -#: parser.yy:1025 parser.yy:1047 +#: parser.yy:1331 +msgid "music expected" +msgstr "Noten erwartet" + +#: parser.yy:1341 parser.yy:1375 msgid "unexpected post-event" msgstr "unerwarteter post-event" -#: parser.yy:1055 +#: parser.yy:1383 msgid "Ignoring non-music expression" msgstr "Nicht-musikalischer Ausdruck wird ignoriert" -#: parser.yy:1066 parser.yy:2475 -msgid "music expected" -msgstr "Noten erwartet" - -#: parser.yy:1353 +#: parser.yy:1691 msgid "not a symbol" msgstr "kein Symbol" -#: parser.yy:2146 parser.yy:2260 parser.yy:2273 parser.yy:2282 +#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627 msgid "bad grob property path" msgstr "falscher Pfad für Grob-Eigenschaft" -#: parser.yy:2240 +#: parser.yy:2585 msgid "only \\consists and \\remove take non-string argument." msgstr "nur \\consists und \\remove verstehen ein Nicht-Zeichenketten-Argument." -#: parser.yy:2301 +#: parser.yy:2646 msgid "bad context property path" msgstr "falscher Pfad für Kontexteigenschaft" -#: parser.yy:2402 +#: parser.yy:2733 msgid "simple string expected" msgstr "Einzelne Zeichenkette erwartet" -#: parser.yy:2420 +#: parser.yy:2750 msgid "symbol expected" msgstr "Symbol erwartet" -#: parser.yy:2584 +#: parser.yy:2886 msgid "not a rhythmic event" msgstr "kein rhytmisches Ereignis" -#: parser.yy:2658 +#: parser.yy:2936 msgid "post-event expected" msgstr "post-event erwartet" -#: parser.yy:2667 parser.yy:2672 +#: parser.yy:2945 parser.yy:2950 msgid "have to be in Lyric mode for lyrics" msgstr "muss in Liedtextmodus sein um Liedtext setzen zu können" -#: parser.yy:2740 -msgid "expecting string as script definition" -msgstr "Zeichenkette als Skriptdefinition erwartet" +#: parser.yy:3026 +msgid "expecting string or post-event as script definition" +msgstr "Zeichenkette oder post-event als Skriptdefinition erwartet" -#: parser.yy:2835 +#: parser.yy:3130 msgid "not an articulation" msgstr "keine Artikulation" -#: parser.yy:2907 parser.yy:2950 +#: parser.yy:3202 parser.yy:3245 msgid "not a duration" msgstr "keine Dauer" -#: parser.yy:2967 +#: parser.yy:3266 msgid "bass number expected" msgstr "Bass-Ziffer erwartet" -#: parser.yy:3066 +#: parser.yy:3358 msgid "have to be in Note mode for notes" msgstr "Muss im Notenmodus sein für Noten" -#: parser.yy:3125 +#: parser.yy:3397 msgid "have to be in Chord mode for chords" msgstr "Muss im Akkordmodus sein für Akkorde" -#: parser.yy:3140 +#: parser.yy:3440 msgid "markup outside of text script or \\lyricmode" msgstr "Beschriftung außerhalb von Textbeschriftung oder \\lyricmode" -#: parser.yy:3145 +#: parser.yy:3445 msgid "unrecognized string, not in text script or \\lyricmode" msgstr "Zeichenkette nicht erkannt, weder Textbeschriftung noch \\lyricmode" -#: parser.yy:3362 +#: parser.yy:3597 parser.yy:3606 +msgid "not an unsigned integer" +msgstr "keine unsignierte Ganzzahl" + +#: parser.yy:3693 msgid "not a markup" msgstr "Keine Textbeschriftung" -#: lexer.ll:224 +#: lexer.ll:193 msgid "stray UTF-8 BOM encountered" msgstr "verirrtes UTF-8 BOM gefunden" -#: lexer.ll:227 +#: lexer.ll:196 msgid "Skipping UTF-8 BOM" msgstr "UTF-8 BOM wird übersprungen" -#: lexer.ll:279 +#: lexer.ll:248 #, c-format msgid "Renaming input to: `%s'" msgstr "Eingabe in »%s« umbenannt" -#: lexer.ll:296 +#: lexer.ll:265 msgid "quoted string expected after \\version" msgstr "zitierte Zeichenkette hinter \\version erwartet" -#: lexer.ll:300 +#: lexer.ll:269 msgid "quoted string expected after \\sourcefilename" msgstr "zitierte Zeichenkette hinter \\sourcefilename erwartet" -#: lexer.ll:304 +#: lexer.ll:273 msgid "integer expected after \\sourcefileline" msgstr "Ganzzahl hinter \\sourcefilename erwartet" -#: lexer.ll:331 +#: lexer.ll:300 msgid "\\maininput not allowed outside init files" msgstr "\\maininput ist außerhalb von Init-Dateien nicht erlaubt" -#: lexer.ll:355 +#: lexer.ll:324 #, c-format msgid "wrong or undefined identifier: `%s'" msgstr "falscher oder ungültiger Bezeichner: »%s«" -#: lexer.ll:381 +#: lexer.ll:349 msgid "string expected after \\include" msgstr "Zeichenkette hinter \\include erwartet" -#: lexer.ll:391 +#: lexer.ll:359 msgid "end quote missing" msgstr "schließendes Anführungszeichen fehlt" -#: lexer.ll:743 +#: lexer.ll:714 msgid "EOF found inside a comment" msgstr "EOF innerhalb eines Kommentares gefunden" -#: lexer.ll:748 +#: lexer.ll:719 msgid "EOF found inside string" msgstr "EOF innerhalb einer Zeichenkette gefunden" -#: lexer.ll:763 +#: lexer.ll:734 msgid "Unfinished main input" msgstr "Haupt-Eingabe nicht beendet" -#: lexer.ll:834 +#: lexer.ll:805 #, c-format msgid "invalid character: `%s'" msgstr "Ungültiges Zeichen: »%s«" -#: lexer.ll:963 +#: lexer.ll:925 #, c-format msgid "unknown escaped string: `\\%s'" msgstr "Ungültige Fluchtsequenz: »\\%s«" -#: lexer.ll:983 +#: lexer.ll:945 #, c-format msgid "undefined character or shorthand: %s" msgstr "Zeichen oder Verweis nicht definiert: `%s'" -#: lexer.ll:1275 +#: lexer.ll:1236 msgid "non-UTF-8 input" msgstr "nicht-UTF8-Eingabe" -#: lexer.ll:1319 +#: lexer.ll:1280 +#, c-format +msgid "Invalid version string \"%s\"" +msgstr "Ungültige Version: »%s«" + +#: lexer.ll:1285 #, c-format msgid "file too old: %s (oldest supported: %s)" msgstr "Datei zu alt: %s (älteste unterstützte: %s)" -#: lexer.ll:1320 +#: lexer.ll:1286 msgid "consider updating the input with the convert-ly script" msgstr "Erwägen Sie die Aktualisierung der Eingabe mit dem Skript convert-ly" -#: lexer.ll:1326 +#: lexer.ll:1292 #, c-format msgid "program too old: %s (file requires: %s)" msgstr "Programm zu alt: %s (Datei erfordert: %s)" +#: auto-beam.scm:147 +msgid "Beam end fits no pattern" +msgstr "Das Balkenende entspricht keinem Muster" + #: backend-library.scm:27 #, scheme-format msgid "Invoking `~a'..." @@ -3389,24 +3394,34 @@ msgstr "»~s« wird aufgerufen..." msgid "`~a' failed (~a)\n" msgstr "»~a« gescheitert (~a)\n" -#: backend-library.scm:93 +#: backend-library.scm:108 #, scheme-format msgid "Converting to `~a'...\n" msgstr "Konvertierung nach »~a«...\n" #. Do not try to guess the name of the png file, #. GS produces PNG files like BASE-page%d.png. -#: backend-library.scm:102 +#: backend-library.scm:118 #, scheme-format msgid "Converting to ~a..." msgstr "Konvertierung nach ~a..." -#: backend-library.scm:140 +#: backend-library.scm:134 +#, scheme-format +msgid "Copying to `~a'...\n" +msgstr "Kopieren nach »~a«...\n" + +#: backend-library.scm:200 +#, scheme-format +msgid "Deleting `~a'...\n" +msgstr "Löschen von »~a«...\n" + +#: backend-library.scm:219 #, scheme-format msgid "Writing header field `~a' to `~a'..." msgstr "Kopfzeile »~a« wird nach »~a« geschrieben" -#: backend-library.scm:189 +#: backend-library.scm:268 #, scheme-format msgid "missing stencil expression `~S'" msgstr "fehlender Stencil-Ausdruck »~S«" @@ -3447,154 +3462,145 @@ msgstr "Anscheinend sinnloser Text nach Akkord: ~A" msgid "symbol ~S redefined" msgstr "Symbol ~S redefiniert" -#: define-event-classes.scm:73 +#: define-event-classes.scm:74 #, scheme-format msgid "unknown parent class `~a'" msgstr "Unbekannte Elternklasse »~a«" -#: define-event-classes.scm:107 +#: define-event-classes.scm:108 #, scheme-format msgid "Cannot redefine event class `~S'" msgstr "Kann Ereignisklasse »~S« nicht umdefinieren" -#: define-event-classes.scm:109 +#: define-event-classes.scm:110 #, scheme-format msgid "Undefined parent event class `~S'" msgstr "Undefinierte Elternereignisklasse »~S«" -#: define-markup-commands.scm:1037 +#: define-markup-commands.scm:1098 msgid "no systems found in \\score markup, does it have a \\layout block?" msgstr "keine Systeme in \\score-Markup gefunden, hat es einen \\layout-Block?" -#: define-markup-commands.scm:2856 +#: define-markup-commands.scm:2922 #, scheme-format msgid "Cannot find glyph ~a" msgstr "Kann kein Zeichen ~a finden" -#: define-markup-commands.scm:3282 +#: define-markup-commands.scm:3398 #, scheme-format msgid "no brace found for point size ~S " msgstr "Keine Klammer in Größe ~S pt gefunden" -#: define-markup-commands.scm:3283 +#: define-markup-commands.scm:3399 #, scheme-format msgid "defaulting to ~S pt" msgstr "Setze Standard ~S pt" -#: define-markup-commands.scm:3535 +#: define-markup-commands.scm:3643 #, scheme-format msgid "not a valid duration string: ~a" msgstr "keine gültige Dauer: ~a" -#: define-markup-commands.scm:3746 +#: define-markup-commands.scm:3854 #, scheme-format msgid "not a valid duration string: ~a - ignoring" msgstr "keine gültige Dauer: ~a, wird ignoriert" -#: define-music-types.scm:792 +#: define-music-types.scm:803 #, scheme-format msgid "symbol expected: ~S" msgstr "Symbol erwartet: ~S" -#: define-music-types.scm:795 +#: define-music-types.scm:806 #, scheme-format msgid "cannot find music object: ~S" msgstr "Musikobjekt kann nicht gefunden werden: ~S" -#: define-music-types.scm:815 +#: define-music-types.scm:826 #, scheme-format msgid "bad make-music argument: ~S" msgstr "falsches make-music argument: ~S" -#: define-music-types.scm:827 -#, scheme-format -msgid "unknown repeat type `~S'" -msgstr "unbekannter Wiederholungstyp »~S«" - -#: define-music-types.scm:828 -msgid "See define-music-types.scm for supported repeats" -msgstr "Siehe define-music-types.scm für unterstützte Wiederholungen" - -#: define-note-names.scm:972 +#: define-note-names.scm:1000 msgid "Select note names language." msgstr "Wählen Sie die Sprache der Notenbezeichnungen." -#: define-note-names.scm:978 +#: define-note-names.scm:1006 #, scheme-format msgid "Using `~a' note names..." msgstr "Benutze Notenbezeichnung »~a«..." -#: define-note-names.scm:981 +#: define-note-names.scm:1009 #, scheme-format msgid "Could not find language `~a'. Ignoring." msgstr "Konnte Sprache »~a« nicht finden. Wird ignoriert." -#: document-backend.scm:132 +#: document-backend.scm:135 #, scheme-format msgid "pair expected in doc ~s" msgstr "Paar erwartet in doc ~s" -#: document-backend.scm:189 +#: document-backend.scm:202 #, scheme-format msgid "cannot find interface for property: ~S" msgstr "Schnittstelle für Eigenschaft ~S kann nicht gefunden werden" -#: document-backend.scm:199 +#: document-backend.scm:212 #, scheme-format msgid "unknown Grob interface: ~S" msgstr "Unbekannte Grob-Schnittstelle: ~S" -#: documentation-lib.scm:59 +#: documentation-lib.scm:62 #, scheme-format msgid "Processing ~S..." msgstr "~S wird verarbeitet..." -#: documentation-lib.scm:176 +#: documentation-lib.scm:178 #, scheme-format msgid "Writing ~S..." msgstr "~S wird geschrieben..." -#: documentation-lib.scm:188 +#: documentation-lib.scm:190 #, scheme-format msgid "cannot find description for property `~S' (~S)" msgstr "Beschreibung für Eigenschaft ~S' (~S) kann nicht gefunden werden" -#: documentation-lib.scm:209 +#: documentation-lib.scm:211 #, scheme-format msgid "cannot find description for property ~S (~S)" msgstr "Beschreibung für Eigenschaft ~S (~S) kann nicht gefunden werden" -#: flag-styles.scm:162 +#: flag-styles.scm:155 #, scheme-format msgid "flag stroke `~a' or `~a' not found" msgstr "Fähnchenstrich »~a«·or·»~a« nicht gefunden" -#: framework-eps.scm:108 +#: framework-eps.scm:112 #, scheme-format msgid "Writing ~a..." msgstr "~a wird geschrieben..." -#: framework-ps.scm:250 +#: framework-ps.scm:281 #, scheme-format msgid "cannot embed ~S=~S" msgstr "~S=~S kann nicht eingebettet werden" -#: framework-ps.scm:293 +#: framework-ps.scm:324 #, scheme-format msgid "cannot extract file matching ~a from ~a" msgstr "Eine zu ~a passende Datei kann nicht aus ~a gewonnen werden" -#: framework-ps.scm:311 +#: framework-ps.scm:342 #, scheme-format msgid "do not know how to embed ~S=~S" msgstr "Unbekannte Einbettung ~S=~S" -#: framework-ps.scm:336 +#: framework-ps.scm:367 #, scheme-format msgid "do not know how to embed font ~s ~s ~s" msgstr "Unbekannte Schriftsatzeinbettung ~s ~s ~s" -#: framework-ps.scm:687 +#: framework-ps.scm:723 msgid "" "\n" "The PostScript backend does not support the\n" @@ -3656,7 +3662,7 @@ msgstr "Kann contex-def \\~a nicht finden" msgid "Music unsuitable for output-def" msgstr "Musik unpassend für output-def" -#: lily-library.scm:884 +#: lily-library.scm:904 msgid "" "Find the index between @var{start} and @var{end} (an integer)\n" "which produces the closest match to @var{target-val} if\n" @@ -3666,51 +3672,51 @@ msgstr "" "die den nächstmöglichen Treffer für @var{target-val} findet,\n" "wenn auf die Funktion @var{getter} angewandt." -#: lily-library.scm:955 +#: lily-library.scm:998 #, scheme-format msgid "unknown unit: ~S" msgstr "unbekannte Einheit: ~S" -#: lily-library.scm:980 +#: lily-library.scm:1023 #, scheme-format msgid "no \\version statement found, please add~afor future compatibility" msgstr "keine \\version-Anweisung gefunden, ~a für zukünftige Kompatibilität hinzufügen" -#: lily.scm:75 +#: lily.scm:93 msgid "call-after-session used after session start" msgstr "call-after-session nach Beginn des Abschnitts benutzt" -#: lily.scm:93 +#: lily.scm:111 msgid "define-session used after session start" msgstr "define-session nach Beginn des Abschnitts benutzt" -#: lily.scm:393 +#: lily.scm:417 msgid "Using (ice-9 curried-definitions) module\n" msgstr "Benutze Modul (ice-9 curried-definitions)\n" -#: lily.scm:396 +#: lily.scm:420 msgid "Guile 1.8\n" msgstr "Guile 1.8\n" -#: lily.scm:455 +#: lily.scm:477 #, scheme-format msgid "cannot find: ~A" msgstr "~A kann nicht gefunden werden" -#: lily.scm:878 +#: lily.scm:903 msgid "Success: compilation successfully completed" msgstr "Kompilation erfolgreich beendet" -#: lily.scm:879 +#: lily.scm:904 msgid "Compilation completed with warnings or errors" msgstr "Kompilation mit Warnungen bzw. Fehlermeldungen beendet" -#: lily.scm:940 +#: lily.scm:965 #, scheme-format msgid "job ~a terminated with signal: ~a" msgstr "Auftrag ~a mit Signal ~a beendet" -#: lily.scm:943 +#: lily.scm:968 #, scheme-format msgid "" "logfile ~a (exit ~a):\n" @@ -3719,36 +3725,31 @@ msgstr "" "Logdatei ~a (Ende ~a):\n" "~a" -#: lily.scm:965 lily.scm:1054 +#: lily.scm:990 lily.scm:1079 #, scheme-format msgid "failed files: ~S" msgstr "gescheiterte Dateien: ~S" -#: lily.scm:1045 +#: lily.scm:1070 #, scheme-format msgid "Redirecting output to ~a..." msgstr "Ausgabeumleitung nach ~a..." -#: lily.scm:1064 ps-to-png.scm:66 +#: lily.scm:1089 #, scheme-format msgid "Invoking `~a'...\n" msgstr "»~a« wird aufgerufen...\n" -#: ly-syntax-constructors.scm:66 +#: ly-syntax-constructors.scm:27 #, scheme-format msgid "~a function cannot return ~a" msgstr "~a-Funktion kann nicht ~a ausgeben" -#: ly-syntax-constructors.scm:75 +#: ly-syntax-constructors.scm:60 #, scheme-format msgid "wrong type for argument ~a. Expecting ~a, found ~s" msgstr "falscher Typ für Argument ~a; ~a erwartet, ~s gefunden" -#: ly-syntax-constructors.scm:199 -#, scheme-format -msgid "Invalid property operation ~a" -msgstr "Ungültige Eigenschaftsoperation ~a" - #: markup-macros.scm:331 #, scheme-format msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" @@ -3788,58 +3789,87 @@ msgstr "Tonhöhe, die umgekehrt wird, nicht in Skala, wird ignoriert" msgid "negative replication count; ignoring" msgstr "negativer Replikationszähler, wird ignoriert" -#: music-functions.scm:272 -msgid "More alternatives than repeats. Junking excess alternatives" -msgstr "mehr Alternativen als Wiederholungen. Überschüssige Alternativen werden verworfen" - -#: music-functions.scm:303 +#: music-functions.scm:319 #, scheme-format msgid "invalid tremolo repeat count: ~a" msgstr "ungültige Tremolo-Wiederholung: ~a" -#: music-functions.scm:459 +#: music-functions.scm:348 +#, scheme-format +msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo" +msgstr "unbekannter Wiederholungstzp `~S': gültig sind volta, unfold, percent, oder tremolo" + +#: music-functions.scm:352 +msgid "More alternatives than repeats. Junking excess alternatives" +msgstr "mehr Alternativen als Wiederholungen. Überschüssige Alternativen werden verworfen" + +#: music-functions.scm:487 #, scheme-format msgid "bad grob property path ~a" msgstr "Ungültiger Grob-Eigenschaftspfad ~a" -#: music-functions.scm:753 +#: music-functions.scm:511 +#, scheme-format +msgid "bad context property ~a" +msgstr "falsche Kontexteigenschaft ~a" + +#: music-functions.scm:534 +#, scheme-format +msgid "bad music property ~a" +msgstr "falsche Noten-Eigenschaft ~a" + +#: music-functions.scm:840 msgid "Bad chord repetition" msgstr "Falsche Akkordwiederholung" -#: music-functions.scm:788 +#: music-functions.scm:945 #, scheme-format msgid "music expected: ~S" msgstr "Musik erwartet: ~S" -#: music-functions.scm:1144 +#: music-functions.scm:1295 #, scheme-format msgid "cannot find quoted music: `~S'" msgstr "zitierte Musik »~S« kann nicht gefunden werden" -#: music-functions.scm:1282 +#: music-functions.scm:1432 msgid "Add @var{octave-shift} to the octave of @var{pitch}." msgstr "Füge @var{octave-shift} zur Oktave von @var{pitch} hinzu." -#: music-functions.scm:1342 +#: music-functions.scm:1495 #, scheme-format msgid "Unknown octaveness type: ~S " msgstr "Unbekannter Oktaven-Typ: »~S«" -#: music-functions.scm:1343 +#: music-functions.scm:1496 msgid "Defaulting to 'any-octave." msgstr "Setze Standard 'any-octave" -#: music-functions.scm:1688 +#: music-functions.scm:1888 #, scheme-format msgid "unknown accidental style: ~S" msgstr "unbekannter Versetzungszeichenstil: ~S" -#: output-ps.scm:278 output-svg.scm:539 +#: music-functions.scm:2098 +msgid "Missing duration" +msgstr "Dauer fehlt" + +#: music-functions.scm:2626 +#, scheme-format +msgid "not a symbol list: ~a" +msgstr "keine Symbolliste: ~a" + +#: music-functions.scm:2629 +#, scheme-format +msgid "conflicting tag group ~a" +msgstr "in Konflikt stehende tag-Margengruppe ~a" + +#: output-ps.scm:290 output-svg.scm:539 #, scheme-format msgid "unknown line-cap-style: ~S" msgstr "unbekannter line-cap-style: ~S" -#: output-ps.scm:283 output-svg.scm:545 +#: output-ps.scm:295 output-svg.scm:545 #, scheme-format msgid "unknown line-join-style: ~S" msgstr "unbekannter line-join-style: ~S" @@ -3858,89 +3888,94 @@ msgstr "Das Zeichen muss einen Unicode-Wert haben" msgid "cannot find SVG font ~S" msgstr "SVG-Schriftart ~S kann nicht gefunden werden" -#: paper.scm:120 +#: paper.scm:121 msgid "set-global-staff-size: not in toplevel scope" msgstr "set-global-staff-size: Nicht auf höchster Ebene im Gültigkeitsbereich" -#: paper.scm:320 +#: paper.scm:321 #, scheme-format msgid "This is not a \\layout {} object, ~S" msgstr "Dies ist kein \\layout {} Objekt, ~S" -#: paper.scm:328 +#: paper.scm:329 #, scheme-format msgid "Unknown paper size: ~a" msgstr "Unbekannte Papiergröße: ~a" #. TODO: should raise (generic) exception with throw, and catch #. that in parse-scm.cc -#: paper.scm:347 +#: paper.scm:348 msgid "Must use #(set-paper-size .. ) within \\paper { ... }" msgstr "#(set-paper-size ..) muss innerhalb von \\paper { ... } verwendet werden" -#: parser-clef.scm:164 +#: parser-clef.scm:154 #, scheme-format msgid "unknown clef type `~a'" msgstr "unbekannter Notenschlüsseltyp »~a«" -#: parser-clef.scm:165 +#: parser-clef.scm:155 #, scheme-format msgid "supported clefs: ~a" msgstr "unterstützte Notenschlüssel: ~a" -#: parser-ly-from-scheme.scm:74 +#: parser-ly-from-scheme.scm:73 msgid "error in #{ ... #}" msgstr "Fehler in #{ ... #}" -#: part-combiner.scm:598 +#: part-combiner.scm:894 #, scheme-format msgid "quoted music `~a' is empty" msgstr "Zitierte Noten »~a« sind leer" -#: ps-to-png.scm:70 +#: ps-to-png.scm:72 ps-to-png.scm:75 +#, scheme-format +msgid "Copying `~a' to `~a'..." +msgstr "Kopieren von »~a« nach »~a«..." + +#: ps-to-png.scm:77 ps-to-png.scm:79 #, scheme-format -msgid "~a exited with status: ~S" -msgstr "~a mit Rückgabewert ~S beendet" +msgid "Deleting `~a'..." +msgstr "~a wird gelöscht..." #: to-xml.scm:190 #, scheme-format msgid "assertion failed: ~S" msgstr "Behauptung gescheitert: ~S" -#: translation-functions.scm:368 +#: translation-functions.scm:389 #, scheme-format msgid "Negative fret for pitch ~a on string ~a" msgstr "Negativer Bund für Tonhöhe ~a auf Saite ~a" -#: translation-functions.scm:371 +#: translation-functions.scm:392 #, scheme-format msgid "Missing fret for pitch ~a on string ~a" msgstr "Fehlender Bund für Tonhöhe ~a auf Saite ~a" -#: translation-functions.scm:414 +#: translation-functions.scm:435 #, scheme-format msgid "No open string for pitch ~a" msgstr "Keine leere Saite für Tonhöhe ~a" -#: translation-functions.scm:429 translation-functions.scm:441 +#: translation-functions.scm:450 translation-functions.scm:462 #, scheme-format msgid "Requested string for pitch requires negative fret: string ~a pitch ~a" msgstr "Geforderte Saite für Tonhöhe erfordert negativen Bund: Saite ~a Tonhöhe ~a" -#: translation-functions.scm:432 +#: translation-functions.scm:453 msgid "Ignoring string request and recalculating." msgstr "Saiten-Anforderung wird ignoriert und neu berechnet" -#: translation-functions.scm:444 +#: translation-functions.scm:465 msgid "Ignoring note in tablature." msgstr "Note in der Tabulatur wird ignoriert." -#: translation-functions.scm:469 +#: translation-functions.scm:490 #, scheme-format msgid "No string for pitch ~a (given frets ~a)" msgstr "Keine Saite für Tonhöhe ~a (Bund ~a angegeben)" -#: translation-functions.scm:574 +#: translation-functions.scm:595 #, scheme-format msgid "" "No label for fret ~a (on string ~a);\n" @@ -3949,6 +3984,66 @@ msgstr "" "Keine Beschriftung für Bund ~a (auf Saite ~a);\n" "nur ~a Bundbeschriftung zur Verfügung" +#~ msgid "cannot change, already in translator: %s" +#~ msgstr "kann nicht geändert werden, bereits im Übersetzer: %s" + +#~ msgid "Invalid property operation ~a" +#~ msgstr "Ungültige Eigenschaftsoperation ~a" + +#~ msgid "~a exited with status: ~S" +#~ msgstr "~a mit Rückgabewert ~S beendet" + +#~ msgid "cannot find Voice `%s'" +#~ msgstr "Stimme kann nicht gefunden werden: »%s«" + +#~ msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." +#~ msgstr "Textsilbe hat keine Note. \\lyricsto oder associatedVoice verwenden." + +#~ msgid "Using naive multi measure rest spacing." +#~ msgstr "Benutze simple Platzierung von Mehrtaktpausen." + +#~ msgid "(normalized pitch)" +#~ msgstr "(normalisierte Tonhöhe)" + +#~ msgid "Transposing %s by %s makes alteration larger than double" +#~ msgstr "Transponieren von %s um %s erzeugt mehr als ein Doppel-Vorzeichen" + +#~ msgid "ignoring too many clashing note columns" +#~ msgstr "zu viele kollidierende Notenspalten werden ignoriert" + +#~ msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" +#~ msgstr "Noten passen nicht auf die Seite: ragged-spacing wurde verlangt, aber die Seite wurde komprimiert" + +#~ msgid "cannot fit music on page: overflow is %f" +#~ msgstr "Noten passen nicht auf die Seite: Überhang ist %f" + +#~ msgid "compressing music to fit" +#~ msgstr "Noten werden komprimiert um zu passen" + +#~ msgid "trying to use \\partial after the start of a piece" +#~ msgstr "versuche, \\partial nach dem Beginn eines Stückes einzusetzen" + +#~ msgid "rhythmic head is not part of a rhythmic column" +#~ msgstr "der rhythmische Kopf gehört nicht zu einer rhythmischen Kolumne" + +#~ msgid "Cyclic markup detected: %s" +#~ msgstr "Zyklische Beschriftung gefunden: %s" + +#~ msgid "time signature symbol `%s' not found; reverting to numbered style" +#~ msgstr "Taktart-Symbol »%s« nicht gefunden; wird in nummerierten Stil umgewandelt" + +#~ msgid "Too much lookahead" +#~ msgstr "Zu viel Vorgriff" + +#~ msgid "score expected" +#~ msgstr "Partitur (score) erwartet" + +#~ msgid "unknown repeat type `~S'" +#~ msgstr "unbekannter Wiederholungstyp »~S«" + +#~ msgid "See define-music-types.scm for supported repeats" +#~ msgstr "Siehe define-music-types.scm für unterstützte Wiederholungen" + #~ msgid "cannot find start of (de)crescendo" #~ msgstr "Anfang des (De-) Crescendos kann nicht gefunden werden" @@ -4962,9 +5057,6 @@ msgstr "" #~ msgid "Mensural_ligature:flexa-width undefined on flexa %d; assuming 2.0" #~ msgstr "Mensural_ligature: flexa-width undefiniert bei flexa %d; nehme 2.0 an" -#~ msgid "silly duration" -#~ msgstr "sinnlose Dauer" - #~ msgid "Outputting Score, defined at: " #~ msgstr "Notenausgabe, definiert bei: " diff --git a/po/el.po b/po/el.po index 62b018a995..ddf95e279a 100644 --- a/po/el.po +++ b/po/el.po @@ -547,8 +547,8 @@ msgid "\\bar \".\" now produces a thick barline.\n" msgstr "Το \\bar \".\" τώρα παράγει χοντρή γραμμή μέτρου.\n" #: convertrules.py:2912 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" -msgstr "Οι παράμετροι παύλας για ενωτικά και δεσμούς βρίσκονται τώρα στο 'dash-details.\n" +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" +msgstr "Οι παράμετροι παύλας για ενωτικά και δεσμούς βρίσκονται τώρα στο 'dash-definition.\n" #: convertrules.py:2917 msgid "" @@ -1308,12 +1308,12 @@ msgstr "" #: musicxml2ly.py:2669 msgid "" -"Copyright (c) 2005--2011 by\n" +"Copyright (c) 2005--2015 by\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen and\n" " Reinhold Kainhofer \n" msgstr "" -"Copyright (c) 2005--2011 από\n" +"Copyright (c) 2005--2015 από\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen και\n" " Reinhold Kainhofer \n" diff --git a/po/eo.po b/po/eo.po index f52ed60720..bb416b100e 100644 --- a/po/eo.po +++ b/po/eo.po @@ -1,14 +1,14 @@ # Esperanto translation of LilyPond. -# Copyright (C) 2012, 2013 Free Software Foundation, Inc. +# Copyright (C) 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the lilypond package. -# Felipe Castro , 2012, 2013 +# Felipe Castro , 2012, 2013, 2015 # msgid "" msgstr "" -"Project-Id-Version: lilypond 2.17.96\n" +"Project-Id-Version: lilypond 2.19.16\n" "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n" -"POT-Creation-Date: 2013-11-24 12:14+0000\n" -"PO-Revision-Date: 2013-11-26 13:22-0300\n" +"POT-Creation-Date: 2015-02-28 14:31+0000\n" +"PO-Revision-Date: 2015-03-03 10:33-0300\n" "Last-Translator: Felipe Castro \n" "Language-Team: Esperanto \n" "Language: eo\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 1.5.4\n" +"X-Generator: Poedit 1.6.10\n" #: book_base.py:26 #, python-format @@ -36,11 +36,11 @@ msgstr "ne eblas trovi \\begin{document} en dokumento LaTeX" msgid "Running `%s' on file `%s' to detect default page settings.\n" msgstr "Aplikado de '%s' al la dosiero '%s' por detekti apriorajn paĝ-agordojn.\n" -#: book_latex.py:212 book_texinfo.py:228 +#: book_latex.py:219 book_texinfo.py:228 msgid "Unable to auto-detect default settings:\n" msgstr "Ne eblas aÅ­tomate detekti apriorajn agordojn:\n" -#: book_latex.py:224 book_texinfo.py:240 +#: book_latex.py:231 book_texinfo.py:240 #, python-format msgid "" "Unable to auto-detect default settings:\n" @@ -49,7 +49,7 @@ msgstr "" "Ne eblas aÅ­tomate detekti apriorajn agordojn:\n" "%s" -#: book_latex.py:247 +#: book_latex.py:254 msgid "cannot detect textwidth from LaTeX" msgstr "ne eblas detekti 'textwidth' el LaTex" @@ -83,31 +83,31 @@ msgstr "preterpaso de nekonata ly-modifilo: %s" msgid "Missing files: %s" msgstr "Mankantaj dosieroj: %s" -#: book_snippets.py:651 +#: book_snippets.py:661 #, python-format msgid "Could not overwrite file %s" msgstr "Ne eblis anstataÅ­igi la dosieron %s" -#: book_snippets.py:738 +#: book_snippets.py:748 #, python-format msgid "Running through filter `%s'" msgstr "Rulado tra filtro '%s'" -#: book_snippets.py:759 +#: book_snippets.py:769 #, python-format msgid "`%s' failed (%d)" msgstr "'%s' fiaskis (%d)" -#: book_snippets.py:760 +#: book_snippets.py:770 msgid "The error log is as follows:" msgstr "La erar-protokolo estas jene:" -#: book_snippets.py:880 +#: book_snippets.py:890 #, python-format msgid "Converting MusicXML file `%s'...\n" msgstr "Konvertado de dosiero MusicXML '%s'...\n" -#: book_snippets.py:907 +#: book_snippets.py:917 #, python-format msgid "" "%s: duplicate filename but different contents of original file,\n" @@ -116,7 +116,7 @@ msgstr "" "%s: duobligita dosiernomo tamen kun malsama enhavo ol la originala\n" "dosiero, do ni printas 'diff' kontraÅ­ la ekzistanta dosiero." -#: book_snippets.py:920 +#: book_snippets.py:930 #, python-format msgid "" "%s: duplicate filename but different contents of converted lilypond file,\n" @@ -167,7 +167,7 @@ msgstr "evitinda \\textstyle, nova sintakso \\key" #: convertrules.py:82 convertrules.py:1856 convertrules.py:2032 #: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801 -#: convertrules.py:3151 convertrules.py:3385 +#: convertrules.py:3151 convertrules.py:3385 convertrules.py:3697 msgid "bump version for release" msgstr "aktualigi la version por eldono" @@ -619,8 +619,8 @@ msgid "\\bar \".\" now produces a thick barline.\n" msgstr "\\bar \".\" nun produktas dikan taktostrekon.\n" #: convertrules.py:2849 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" -msgstr "Strekaj parametroj por ligarkoj kaj ligaturoj estas nun en 'dash-details.\n" +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" +msgstr "Strekaj parametroj por ligarkoj kaj ligaturoj estas nun en 'dash-definition'.\n" #: convertrules.py:2854 msgid "" @@ -959,12 +959,12 @@ msgstr "" "%s) al LilyPond-kodumaro.\n" #: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 -#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:181 +#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:183 msgid "show version number and exit" msgstr "montri versi-numeron kaj eliri" #: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 -#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:160 +#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:162 msgid "show this help and exit" msgstr "montri tiun ĉi helpon kaj eliri" @@ -989,7 +989,7 @@ msgstr "formeti mesaĝojn pri progreso" #. or if there is a LilyPond users list or forum in your language #. "Report bugs in English via %s or in YOUR_LANG via URI" #: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 -#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:315 +#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:317 #, c-format, python-format msgid "Report bugs via %s" msgstr "Raportu program-misojn per %s (angle)" @@ -1040,7 +1040,7 @@ msgid "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS msgstr "Montri protokolajn mesaĝojn laŭ PROTOKOLNIVELO (NONE, ERROR, WARNING, PROGRESS (apriore), DEBUG)" #: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181 -#: musicxml2ly.py:2629 main.cc:174 +#: musicxml2ly.py:2629 main.cc:176 msgid "LOGLEVEL" msgstr "PROTOKOLNIVELO" @@ -1072,7 +1072,7 @@ msgid "make a numbered backup [default: filename.ext~]" msgstr "fari numeritan savkopion [aprioras: dosiernomo.suf~]" #: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096 -#: main.cc:183 +#: main.cc:185 msgid "show warranty and copyright" msgstr "montri garantion kaj kopirajton" @@ -1093,17 +1093,17 @@ msgstr "Ĉeso ĉe lasta sukcesa regulo" msgid "Processing `%s'... " msgstr "Procezado de '%s'... " -#: convert-ly.py:367 +#: convert-ly.py:368 #, python-format msgid "%s: Unable to open file" msgstr "%s: Ne eblas malfermi dosieron" -#: convert-ly.py:373 +#: convert-ly.py:374 #, python-format msgid "%s: Unable to determine version. Skipping" msgstr "%s: ne eblas determini version. Preterpase" -#: convert-ly.py:379 +#: convert-ly.py:380 #, python-format msgid "" "%s: Invalid version string `%s' \n" @@ -1112,7 +1112,7 @@ msgstr "" "%s: Malvalida versi-ĉeno '%s' \n" "Validaj versi-ĉenoj konsistas el tri numeroj, apartitaj per punktoj, t.e. '2.8.12'" -#: convert-ly.py:385 +#: convert-ly.py:386 #, python-format msgid "There was %d error." msgid_plural "There were %d errors." @@ -1133,7 +1133,7 @@ msgstr "" "Coda Music Technology. etf2ly konvertas subaron de ETF al tujuzebla dosiero LilyPond.\n" #: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659 -#: main.cc:166 main.cc:178 +#: main.cc:168 main.cc:180 msgid "FILE" msgstr "DOSIERO" @@ -1171,7 +1171,7 @@ msgid "add DIR to include path" msgstr "aldoni UJOn al la inkluziva vojo" #: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169 -#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:165 +#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:167 msgid "DIR" msgstr "UJO" @@ -1318,17 +1318,17 @@ msgstr "Procezado de inkluzivigo: %s" msgid "Removing `%s'" msgstr "Forigado de '%s'" -#: lilypond-book.py:714 +#: lilypond-book.py:727 #, python-format msgid "Setting LilyPond's loglevel to %s" msgstr "Difinado de protokolnivelo de LilyPond al %s" -#: lilypond-book.py:718 +#: lilypond-book.py:731 #, python-format msgid "Setting LilyPond's loglevel to %s (from environment variable LILYPOND_LOGLEVEL)" msgstr "Difinado de protokolnivelo de LilyPond al %s (el medi-variablo LILYPOND_LOGLEVEL)" -#: lilypond-book.py:721 +#: lilypond-book.py:734 msgid "Setting LilyPond's output to --verbose, implied by lilypond-book's setting" msgstr "Difinado de eligo de LilyPond al --verbose, implicite de la agordoj de lilypond-book" @@ -1547,12 +1547,12 @@ msgstr "" #: musicxml2ly.py:2576 msgid "" -"Copyright (c) 2005--2012 by\n" +"Copyright (c) 2005--2015 by\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen and\n" " Reinhold Kainhofer \n" msgstr "" -"Kopirajto (c) 2005--2012 de\n" +"Kopirajto (c) 2005--2015 de\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen kaj\n" " Reinhold Kainhofer \n" @@ -1638,15 +1638,15 @@ msgstr "Eligo al '%s'" msgid "Unable to find input file %s" msgstr "Ne eblas trovi la enig-dosieron %s" -#: website_post.py:125 +#: website_post.py:129 msgid "English" msgstr "Angla" -#: website_post.py:128 +#: website_post.py:132 msgid "Other languages" msgstr "Aliaj lingvoj" -#: website_post.py:129 +#: website_post.py:133 #, python-format msgid "About automatic language selection." msgstr "Pri aÅ­tomata elekto de lingvo." @@ -1726,12 +1726,12 @@ msgstr "kromsigna kompostada listo devas komenci per kuntekst-nomo': %s" msgid "procedure or context-name expected for accidental rule, found %s" msgstr "proceduro aŭ kuntekst-nomo estis atendata por kromsigna regulo, trovite %s" -#: accidental.cc:169 +#: accidental.cc:141 #, c-format msgid "Could not find glyph-name for alteration %s" msgstr "Ne eblis trovi 'glyph-name' por aliigo %s" -#: accidental.cc:184 +#: accidental.cc:157 msgid "natural alteration glyph not found" msgstr "signobildo de natura aliigo ne estis trovata" @@ -1864,26 +1864,26 @@ msgstr "Coherent_ligature_engraver: difinado de 'spacing-increment=0.01': ptr=%u msgid "cannot find line breaking that satisfies constraints" msgstr "ne eblas trovi lini-salton kiu kontentigas limigojn" -#: context-property.cc:43 +#: context-property.cc:46 msgid "need symbol arguments for \\override and \\revert" msgstr "necesas simbol-argumentoj por \\override kaj \\revert" -#: context.cc:149 +#: context.cc:143 #, c-format msgid "cannot find or create new `%s'" msgstr "ne eblas trovi aÅ­ krei novan '%s'" -#: context.cc:228 +#: context.cc:222 #, c-format msgid "cannot find or create `%s' called `%s'" msgstr "ne eblas trovi aÅ­ krei '%s' nomata '%s'" -#: context.cc:425 +#: context.cc:419 #, c-format msgid "cannot find or create: `%s'" msgstr "ne eblas trovi aÅ­ krei: '%s'" -#: context.cc:439 +#: context.cc:433 #, c-format msgid "cannot find or create new Bottom = \"%s\"" msgstr "ne eblas trovi aÅ­ krei novan Bottom = \"%s\"" @@ -1893,20 +1893,20 @@ msgstr "ne eblas trovi aÅ­ krei novan Bottom = \"%s\"" msgid "custos `%s' not found" msgstr "custos '%s' ne estis trovata" -#: dispatcher.cc:89 +#: dispatcher.cc:83 msgid "Event class should be a list" msgstr "Event-klaso devas esti listo" -#: dispatcher.cc:172 +#: dispatcher.cc:166 #, c-format msgid "Junking event: %s" msgstr "Rubaĵa evento: %s" -#: dispatcher.cc:277 +#: dispatcher.cc:271 msgid "Attempting to remove nonexisting listener." msgstr "Provo forigi neekzistantan aÅ­danton." -#: dispatcher.cc:303 +#: dispatcher.cc:297 msgid "Already listening to dispatcher, ignoring request" msgstr "Jam aÅ­dadas la disdonilon, ni preteratentas la peton" @@ -1994,12 +1994,12 @@ msgstr "Konstruado de tipara datumbazo..." msgid "Must be footnote-event." msgstr "Devas esti piednota-evento." -#: general-scheme.cc:390 +#: general-scheme.cc:403 #, c-format msgid "failed redirecting stderr to `%s'" msgstr "malsukceso dum redirektigo de stderr al '%s'" -#: general-scheme.cc:469 output-ps.scm:48 +#: general-scheme.cc:482 output-ps.scm:48 msgid "Found infinity or nan in output. Substituting 0.0" msgstr "Infinito aŭ NaN estis trovata en eligo. AnstataÅ­igo per 0.0" @@ -2055,7 +2055,7 @@ msgstr "La grob '%s' havas neniun interfacon por la atributo '%s'" msgid "%d: %s" msgstr "%d: %s" -#: grob.cc:488 +#: grob.cc:481 #, c-format msgid "ignored infinite %s-offset" msgstr "preteratentis senliman %s-deŝovon" @@ -2064,7 +2064,7 @@ msgstr "preteratentis senliman %s-deŝovon" msgid "Asking for broken bound padding at a non-broken bound." msgstr "Peto de rompita limig-ŝtopado ĉe ne-rompita limigo." -#: hairpin.cc:256 +#: hairpin.cc:257 msgid "decrescendo too small" msgstr "tro malgranda 'decrescendo'" @@ -2094,7 +2094,7 @@ msgstr "ne eblas trovi la dosieron: '%s'" msgid "(search path: `%s')" msgstr "(serĉvojo: '%s')" -#: input.cc:138 source-file.cc:178 source-file.cc:193 +#: input.cc:138 source-file.cc:177 source-file.cc:192 msgid "position unknown" msgstr "nekonata pozicio" @@ -2213,20 +2213,16 @@ msgstr "Analizado..." msgid "Not drawing a box with negative dimension, %.2f by %.2f." msgstr "Ni ne desegnas skatolon kun negativan dimension, %.2f oble %.2f." -#: lyric-combine-music-iterator.cc:199 +#: lyric-combine-music-iterator.cc:204 msgid "argument of \\lyricsto should contain Lyrics context" msgstr "argumento de \\lyricsto devas enhavi kuntekston Lyrics" -#: lyric-combine-music-iterator.cc:337 +#: lyric-combine-music-iterator.cc:349 #, c-format -msgid "cannot find Voice `%s'" -msgstr "ne eblas trovi Voĉon '%s'" - -#: lyric-engraver.cc:186 -msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." -msgstr "Teksta silabo ne havas noton. Uzu \\lyricsto aŭ 'associatedVoice'." +msgid "cannot find %s `%s'" +msgstr "ne eblas trovi %s '%s'" -#: main.cc:104 +#: main.cc:105 #, c-format msgid "" "This program is free software. It is covered by the GNU General Public\n" @@ -2238,7 +2234,7 @@ msgstr "" "Publika Permeso kaj vi estas bonvena ŝanĝi ĝin kaj/aŭ re-disdoni kopiojn de ĝi\n" "laÅ­ iaj kondiĉoj. Lanĉu kiel '%s --warranty' por pli da informo.\n" -#: main.cc:110 +#: main.cc:111 msgid "" " This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License as \n" @@ -2270,11 +2266,11 @@ msgstr "" "Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n" "Boston, MA 02111-1307, USA.\n" -#: main.cc:148 +#: main.cc:149 msgid "SYM[=VAL]" msgstr "SIM[=VAL]" -#: main.cc:149 +#: main.cc:150 msgid "" "set Scheme option SYM to VAL (default: #t).\n" "Use -dhelp for help." @@ -2282,41 +2278,45 @@ msgstr "" "difini modifilon Scheme SIM al VAL (apriore: *t).\n" "Uzu -dhelp por ricevi helpon." -#: main.cc:153 +#: main.cc:154 msgid "EXPR" msgstr "ESPR" -#: main.cc:153 +#: main.cc:154 msgid "evaluate scheme code" msgstr "analizi kodumaron de scheme" #. Bug in option parser: --output =foe is taken as an abbreviation #. for --output-format. -#: main.cc:156 +#: main.cc:157 msgid "FORMATs" msgstr "FORMOj" -#: main.cc:156 +#: main.cc:157 msgid "dump FORMAT,... Also as separate options:" msgstr "ŝuti FORMOn,... AnkaÅ­ kiel apartaj modifiloj:" -#: main.cc:157 +#: main.cc:158 msgid "generate PDF (default)" msgstr "generi PDF (apriore)" -#: main.cc:158 +#: main.cc:159 msgid "generate PNG" msgstr "generi PNG" -#: main.cc:159 +#: main.cc:160 msgid "generate PostScript" msgstr "generi PostScript" -#: main.cc:162 +#: main.cc:161 +msgid "generate big PDF files" +msgstr "generi grandajn PDF-dosierojn" + +#: main.cc:164 msgid "FIELD" msgstr "KAMPO" -#: main.cc:162 +#: main.cc:164 msgid "" "dump header field FIELD to file\n" "named BASENAME.FIELD" @@ -2324,19 +2324,19 @@ msgstr "" "ŝuti kap-kampo KAMPO al dosiero\n" "nomata BAZNOMO.KAMPO" -#: main.cc:165 +#: main.cc:167 msgid "add DIR to search path" msgstr "aldoni UJOn al la serĉvojo" -#: main.cc:166 +#: main.cc:168 msgid "use FILE as init file" msgstr "uzi DOSIEROn kiel ekig-dosieron" -#: main.cc:169 +#: main.cc:171 msgid "USER, GROUP, JAIL, DIR" msgstr "UZANTO, GRUPO, KAĜO, UJO" -#: main.cc:169 +#: main.cc:171 msgid "" "chroot to JAIL, become USER:GROUP\n" "and cd into DIR" @@ -2344,7 +2344,7 @@ msgstr "" "chroot al KAĜO, fariĝi UZANTO:GRUPO\n" "kaj cd en UJOn" -#: main.cc:174 +#: main.cc:176 msgid "" "print log messages according to LOGLEVEL. Possible values are:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG." @@ -2352,24 +2352,24 @@ msgstr "" "printi protokol-mesaĝojn laÅ­ PROTOKOLNIVELO. Eblaj valoroj estas:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (apriore) kaj DEBUG." -#: main.cc:178 +#: main.cc:180 msgid "write output to FILE (suffix will be added)" msgstr "skribi eligon al DOSIERO (sufikso estos aldonata)" -#: main.cc:179 +#: main.cc:181 msgid "relocate using directory of lilypond program" msgstr "relokigi uzante dosierujon de la programo lilypond" -#: main.cc:180 +#: main.cc:182 msgid "no progress, only error messages (equivalent to loglevel=ERROR)" msgstr "sen progreso, nur eraraj mesaĝoj (egale al loglevel=ERROR)" -#: main.cc:182 +#: main.cc:184 msgid "be verbose (equivalent to loglevel=DEBUG)" msgstr "esti detalema (egale al loglevel=DEBUG)" #. Do not update the copyright years here, run `make grand-replace' -#: main.cc:261 +#: main.cc:263 #, c-format msgid "" "Copyright (c) %s by\n" @@ -2379,74 +2379,74 @@ msgstr "" "%s kaj aliaj." #. No version number or newline here. It confuses help2man. -#: main.cc:299 +#: main.cc:301 #, c-format msgid "Usage: %s [OPTION]... FILE..." msgstr "Uzado: %s [MODIFILO]... DOSIERO..." -#: main.cc:301 +#: main.cc:303 msgid "Typeset music and/or produce MIDI from FILE." msgstr "Kompostado de muziko kaj/aÅ­ produktado de MIDI el DOSIERO." -#: main.cc:303 +#: main.cc:305 msgid "LilyPond produces beautiful music notation." msgstr "LilyPond produktas belan muzikan notadon." -#: main.cc:305 +#: main.cc:307 #, c-format msgid "For more information, see %s" msgstr "Por pli da informo, vidu %s" -#: main.cc:307 +#: main.cc:309 msgid "Options:" msgstr "Modifiloj:" -#: main.cc:374 +#: main.cc:376 #, c-format msgid "expected %d arguments with jail, found: %u" msgstr "estis atendataj %d argumentoj kun kaĝo, estis trovataj: %u" -#: main.cc:388 +#: main.cc:390 #, c-format msgid "no such user: %s" msgstr "neniu tia uzanto: %s" -#: main.cc:390 +#: main.cc:392 #, c-format msgid "cannot get user id from user name: %s: %s" msgstr "ne eblas preni uzanto-id el uzant-nomo: %s: %s" -#: main.cc:405 +#: main.cc:407 #, c-format msgid "no such group: %s" msgstr "neniu tia grupo: %s" -#: main.cc:407 +#: main.cc:409 #, c-format msgid "cannot get group id from group name: %s: %s" msgstr "ne eblas preni grupo-id el grup-nomo: %s: %s" -#: main.cc:415 +#: main.cc:417 #, c-format msgid "cannot chroot to: %s: %s" msgstr "ne eblas apliki 'chroot' al: %s: %s" -#: main.cc:422 +#: main.cc:424 #, c-format msgid "cannot change group id to: %d: %s" msgstr "ne eblas ŝanĝi grupo-id al: %d: %s" -#: main.cc:428 +#: main.cc:430 #, c-format msgid "cannot change user id to: %d: %s" msgstr "ne eblas ŝanĝi uzant-id al: %d: %s" -#: main.cc:434 +#: main.cc:436 #, c-format msgid "cannot change working directory to: %s: %s" msgstr "ne eblas ŝanĝi aktualan dosierujon al: %s: %s" -#: main.cc:805 +#: main.cc:825 #, c-format msgid "exception caught: %s" msgstr "kaptita krom-okazo: %s" @@ -2490,7 +2490,7 @@ msgid "" "and there may be only zero or two of them" msgstr "" "plenoj nur povas aperi ĉe komenco de kantligaturo,\n" -"kaj devas esti nur \"neniu\" aÅ­ du el ili" +"kaj devas esti nur du el ili aÅ­ neniu" #: mensural-ligature-engraver.cc:236 msgid "" @@ -2532,7 +2532,7 @@ msgstr "ne eblas malfermi por skribi: %s: %s" msgid "cannot write to file: `%s'" msgstr "ne eblas skribi en dosiero: '%s'" -#: minimal-page-breaking.cc:40 paper-score.cc:122 +#: minimal-page-breaking.cc:40 paper-score.cc:116 msgid "Calculating line breaks..." msgstr "Kalkulado de lini-saltoj..." @@ -2540,28 +2540,15 @@ msgstr "Kalkulado de lini-saltoj..." msgid "Calculating page breaks..." msgstr "Kalkulado de paĝsaltoj..." -#: multi-measure-rest.cc:154 +#: multi-measure-rest.cc:152 msgid "usable-duration-logs must be a non-empty list. Falling back to whole rests." msgstr "'usable-duration-logs' devas esti ne-malplena listo. Ni revenas al plenaj paÅ­zoj." -#: multi-measure-rest.cc:364 -msgid "Using naive multi measure rest spacing." -msgstr "Uzanta naivan plur-mezuran paÅ­zo-spacadon." - -#: music.cc:150 +#: music.cc:149 #, c-format msgid "octave check failed; expected \"%s\", found: \"%s\"" msgstr "kontrolo de okto fiaskis; atendite \"%s\", trovite: \"%s\"" -#: music.cc:219 -msgid "(normalized pitch)" -msgstr "(normigita tonalto)" - -#: music.cc:223 -#, c-format -msgid "Transposing %s by %s makes alteration larger than double" -msgstr "Transpono de %s per %s igas aliigon pli granda ol duobla" - #: new-fingering-engraver.cc:113 msgid "cannot add text scripts to individual note heads" msgstr "ne eblas aldoni tekstajn skriptojn al individuaj noto-kapoj" @@ -2574,11 +2561,11 @@ msgstr "neniu loko estis trovata por fingradoj" msgid "placing below" msgstr "ni metas sube" -#: note-collision.cc:497 -msgid "ignoring too many clashing note columns" -msgstr "ni preterpasas tro multajn kolumnojn kun koliziantaj notoj" +#: note-collision.cc:510 +msgid "this Voice needs a \\voiceXx or \\shiftXx setting" +msgstr "tiu ĉi 'Voice' bezonas agordo de \\voiceXx aÅ­ \\shiftXx" -#: note-column.cc:147 +#: note-column.cc:150 msgid "cannot have note heads and rests together on a stem" msgstr "ne eblas ekzisti kune notkapoj kaj paÅ­zoj en stango" @@ -2591,37 +2578,37 @@ msgstr "neniu el notkapoj '%s' aÅ­ '%s' estis trovataj" msgid "NoteEvent without pitch" msgstr "NoteEvent sen tonalto" -#: open-type-font.cc:45 +#: open-type-font.cc:46 #, c-format msgid "cannot allocate %lu bytes" msgstr "ne eblas rezervi %lu bajtojn" -#: open-type-font.cc:49 +#: open-type-font.cc:50 #, c-format msgid "cannot load font table: %s" msgstr "ne eblas ŝargi je tipara tabelo: %s" -#: open-type-font.cc:54 +#: open-type-font.cc:55 #, c-format msgid "FreeType error: %s" msgstr "Eraro de FreeType: %s" -#: open-type-font.cc:111 +#: open-type-font.cc:112 #, c-format msgid "unsupported font format: %s" msgstr "ne subtenata formo de tiparo: %s" -#: open-type-font.cc:113 +#: open-type-font.cc:114 #, c-format msgid "error reading font file %s: %s" msgstr "eraro dum legado de tipara dosiero %s: %s" -#: open-type-font.cc:188 +#: open-type-font.cc:189 #, c-format msgid "FT_Get_Glyph_Name () Freetype error: %s" msgstr "Eraro de FT_Get_Glyph_Name () en Freetype: %s" -#: open-type-font.cc:336 pango-font.cc:256 +#: open-type-font.cc:337 pango-font.cc:257 #, c-format msgid "FT_Get_Glyph_Name () error: %s" msgstr "Eraro de FT_Get_Glyph_Name (): %s" @@ -2660,46 +2647,47 @@ msgid "best score for this sys-count: %f" msgstr "plej bona poento por tiu ĉi 'sys-count': %f" #: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:248 -#: paper-score.cc:162 +#: paper-score.cc:156 msgid "Drawing systems..." msgstr "Desegnado de sistemoj..." -#: output-def.cc:235 +#: output-def.cc:230 msgid "margins do not fit with line-width, setting default values" msgstr "marĝenoj ne akordas kun lini-larĝo, ni uzas apriorajn valorojn" -#: output-def.cc:242 +#: output-def.cc:237 msgid "systems run off the page due to improper paper settings, setting default values" msgstr "sistemoj iras preter la paĝo pro malĝustaj paperaj agordoj, ni uzas apriorajn valorojn" -#: page-breaking.cc:277 +#: page-breaking.cc:276 msgid "ignoring min-systems-per-page and max-systems-per-page because systems-per-page was set" msgstr "ni preteratentas 'min-systems-per-page' kaj 'max-systems-per-page' ĉar 'systems-per-page' ne estis difinata" -#: page-breaking.cc:282 +#: page-breaking.cc:281 msgid "min-systems-per-page is larger than max-systems-per-page, ignoring both values" msgstr "'min-systems-per-page' estas pli granda ol 'max-systems-per-page', ni preteratentas ambaÅ­" +#: page-breaking.cc:636 +#, c-format +msgid "page %d has been compressed" +msgstr "la paĝo %d estas densigita" + #: page-layout-problem.cc:402 msgid "A page layout problem has been initiated that cannot accommodate footnotes." msgstr "Paĝ-aranĝa problemo estis ekigata, kaj ĝi ne povas enteni piednotojn." #: page-layout-problem.cc:731 -msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" -msgstr "ne eblas akomodi muzikon sur paĝo: 'ragged-spacing' estis petata, sed la paĝo estis densigata" +msgid "ragged-bottom was specified, but page must be compressed" +msgstr "'ragged-bottom' estis indikata, sed paĝo devas esti densigita" #: page-layout-problem.cc:734 #, c-format -msgid "cannot fit music on page: overflow is %f" -msgstr "ne eblas akomodi muzikon sur paĝo: troo estas %f" - -#: page-layout-problem.cc:736 -msgid "compressing music to fit" -msgstr "densigado de muziko por akomodi" +msgid "compressing over-full page by %.1f staff-spaces" +msgstr "ni densigas tra tuta paĝo per %.1f liniar-spacoj" #: page-layout-problem.cc:1199 msgid "staff-affinities should only decrease" -msgstr "'staff-affinities' devus nur malpliigi" +msgstr "'staff-affinities' devus nur malpliiĝi" #: page-turn-page-breaking.cc:168 #, c-format @@ -2740,12 +2728,12 @@ msgstr "\tnombro da paĝoj: %d" msgid "\tprevious break: %d" msgstr "\tantaÅ­a salto: %d" -#: pango-font.cc:245 +#: pango-font.cc:246 #, c-format msgid "no glyph for character U+%0X in font `%s'" msgstr "ne estas signobildo por la signo U+%0X en la tiparo '%s'" -#: pango-font.cc:272 +#: pango-font.cc:273 #, c-format msgid "" "Glyph has no name, but font supports glyph naming.\n" @@ -2754,21 +2742,21 @@ msgstr "" "Signobildo ne havas nomon, sed la tiparo subtenas nomigon de signobildoj.\n" "Ni preterpasas signobildon U+%0X, dosiero %s" -#: pango-font.cc:322 +#: pango-font.cc:323 #, c-format msgid "no PostScript font name for font `%s'" msgstr "neniu tiparnomo PostScript por la tiparo '%s'" -#: pango-font.cc:372 +#: pango-font.cc:373 msgid "FreeType face has no PostScript font name" msgstr "Tiparo FreeType ne havas tiparnomon PostScript" -#: paper-book.cc:214 +#: paper-book.cc:201 #, c-format msgid "program option -dprint-pages not supported by backend `%s'" msgstr "programa modifilo -dprint-pages ne estas subtenata de la intern-interfaco '%s'" -#: paper-book.cc:233 +#: paper-book.cc:220 #, c-format msgid "program option -dpreview not supported by backend `%s'" msgstr "programa modifilo -dpreview ne estas subtenata de la intern-interfaco '%s'" @@ -2782,37 +2770,33 @@ msgstr "perfortita salto estis preterpasata de iu evento, ĉu vi ne devus uzi ko msgid "Layout output to `%s'..." msgstr "Aranĝa eligo al '%s'..." -#: paper-score.cc:134 +#: paper-score.cc:128 #, c-format msgid "Element count %d (spanners %d) " msgstr "Nombro da elementoj: %d (etendigiloj %d) " -#: paper-score.cc:138 +#: paper-score.cc:132 msgid "Preprocessing graphical objects..." msgstr "AntaÅ­procezado de grafikaj objektoj..." -#: parse-scm.cc:121 +#: parse-scm.cc:128 msgid "GUILE signaled an error for the expression beginning here" msgstr "GUILE signalis eraron por la esprimo komenciĝanta ĉi tie" -#: partial-iterator.cc:45 -msgid "trying to use \\partial after the start of a piece" -msgstr "ni provas uzi \\partial post la komenco de muziko" - #: pdf-scheme.cc:65 #, c-format msgid "Conversion of string `%s' to UTF-16be failed: %s" msgstr "Konvertado de ĉeno '%s' al UTF-16be fiaskis: %s" -#: percent-repeat-engraver.cc:147 +#: percent-repeat-engraver.cc:148 msgid "unterminated percent repeat" msgstr "nefinigita elcenta ripeto" -#: performance.cc:54 +#: performance.cc:55 msgid "Track..." msgstr "Sekvado..." -#: performance.cc:82 +#: performance.cc:90 #, c-format msgid "MIDI output to `%s'..." msgstr "MIDI-eligo al '%s'..." @@ -2838,7 +2822,7 @@ msgstr "ne eblas trovi la komencon de piano-pedala krampo: '%s'" msgid "no such internal option: %s" msgstr "neniu tia interna modifilo: %s" -#: property-iterator.cc:100 +#: property-iterator.cc:115 #, c-format msgid "not a grob name, `%s'" msgstr "ne estas 'grob'-nomo, '%s'" @@ -2923,50 +2907,46 @@ msgstr "ne eblas malfermi dosieron: '%s'" msgid "Unknown relocation command %s" msgstr "Nekonata relokiga komando %s" -#: rest-collision-engraver.cc:70 -msgid "rhythmic head is not part of a rhythmic column" -msgstr "ritma kapo ne estas parto de ritma kolumno" - -#: rest-collision.cc:150 +#: rest-collision.cc:153 msgid "cannot resolve rest collision: rest direction not set" msgstr "ne eblas solvi paÅ­zan kolizion: la paÅ­z-direkto ne estis difinata" -#: rest-collision.cc:161 rest-collision.cc:270 +#: rest-collision.cc:164 rest-collision.cc:273 msgid "too many colliding rests" msgstr "tro multe da koliziantaj paÅ­zoj" -#: rest.cc:240 +#: rest.cc:239 #, c-format msgid "rest `%s' not found" msgstr "paÅ­zo '%s' ne estis trovata" -#: score-engraver.cc:78 +#: score-engraver.cc:79 #, c-format msgid "cannot find `%s'" msgstr "ne eblas trovi '%s'" -#: score-engraver.cc:80 +#: score-engraver.cc:81 msgid "Music font has not been installed properly." msgstr "Muzika tiparo ne estas instalita ĝuste." -#: score-engraver.cc:82 +#: score-engraver.cc:83 #, c-format msgid "Search path `%s'" msgstr "Serĉvojo '%s'" -#: score-engraver.cc:84 +#: score-engraver.cc:85 msgid "Aborting" msgstr "Ni ĉesas" -#: score.cc:172 +#: score.cc:160 msgid "already have music in score" msgstr "jam estas muziko en la partituro" -#: score.cc:173 +#: score.cc:161 msgid "this is the previous music" msgstr "tio ĉi estas la antaÅ­a muziko" -#: score.cc:178 +#: score.cc:166 msgid "errors found, ignoring music expression" msgstr "eraroj trovitaj, ni preterpasas la muzikan esprimon" @@ -2979,7 +2959,7 @@ msgstr "ni ne scias kiel interpreti artikulacion:" msgid " scheme encoding: " msgstr " enkodado de 'scheme': " -#: skyline-pair.cc:160 +#: skyline-pair.cc:135 msgid "direction must not be CENTER in ly:skyline-pair::skyline" msgstr "direkto ne povas esti CENTER en ly:skyline-pair::skyline" @@ -3023,16 +3003,16 @@ msgstr "MIDI-kanalo estis ĉirkaÅ­fluigata" msgid "remapping modulo 16" msgstr "remapado de modulo 16" -#: stem-engraver.cc:110 +#: stem-engraver.cc:100 msgid "tremolo duration is too long" msgstr "daÅ­ro de tremsono estas tro longa" -#: stem-engraver.cc:162 +#: stem-engraver.cc:152 #, c-format msgid "adding note head to incompatible stem (type = %d/%d)" msgstr "aldonado de notkapo al malakorda stango (tipo = %d/%d)" -#: stem-engraver.cc:165 +#: stem-engraver.cc:155 msgid "maybe input should specify polyphonic voices" msgstr "eble la enigo devus indiki polifoniajn voĉojn" @@ -3051,13 +3031,7 @@ msgid "Grob count %d" msgstr "Nombro da 'grob': %d" #. TODO: Also print the arguments of the markup! -#: text-interface.cc:129 -#, c-format -msgid "Cyclic markup detected: %s" -msgstr "Cikla markado estis detektata: %s" - -#. TODO: Also print the arguments of the markup! -#: text-interface.cc:142 +#: text-interface.cc:138 #, c-format msgid "Markup depth exceeds maximal value of %d; Markup: %s" msgstr "Markada profundo superas maksimuman valoron %d; Markado: %s" @@ -3074,11 +3048,11 @@ msgstr "jam ekzistas tekst-etendigilo" msgid "unterminated text spanner" msgstr "nefinigita tekst-etendigilo" -#: tie-engraver.cc:119 +#: tie-engraver.cc:121 msgid "unterminated tie" msgstr "nefinigita ligaturo" -#: tie-engraver.cc:353 +#: tie-engraver.cc:373 msgid "lonely tie" msgstr "sola ligaturo" @@ -3087,18 +3061,11 @@ msgstr "sola ligaturo" #. #. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. #. -#: time-signature-engraver.cc:75 +#: time-signature-engraver.cc:95 #, c-format msgid "strange time signature found: %d/%d" msgstr "stranga takt-indiko estis trovata: %d/%d" -#. If there is no such symbol, we default to the numbered style. -#. (Here really with a warning!) -#: time-signature.cc:89 -#, c-format -msgid "time signature symbol `%s' not found; reverting to numbered style" -msgstr "tempindika simbolo '%s' ne estis trovata; ni revenas al numera stilo" - #: translator-ctors.cc:65 #, c-format msgid "unknown translator: `%s'" @@ -3114,12 +3081,12 @@ msgstr "fatala eraro. Ne eblis trovi tipon: %s" msgid "cannot find: `%s'" msgstr "ne eblas trovi: '%s'" -#: translator.cc:326 +#: translator.cc:320 #, c-format msgid "Two simultaneous %s events, junking this one" msgstr "Du samtempaj eventoj %s, ni forĵetas tiun ĉi" -#: translator.cc:327 +#: translator.cc:321 #, c-format msgid "Previous %s event here" msgstr "AntaÅ­a evento %s ĉi tie" @@ -3184,205 +3151,214 @@ msgstr "ankaÅ­ jam ekzistas finigita etendigilo" msgid "giving up" msgstr "ni rezignas" -#: parser.yy:158 parser.yy:172 -msgid "Too much lookahead" -msgstr "Tro da antaÅ­rigardo" - -#: parser.yy:441 parser.yy:752 parser.yy:818 +#: parser.yy:463 parser.yy:847 parser.yy:928 parser.yy:1150 msgid "bad expression type" msgstr "malĝusta esprim-tipo" -#: parser.yy:650 parser.yy:1159 +#: parser.yy:759 parser.yy:1361 parser.yy:1406 msgid "not a context mod" msgstr "ne estas kunteksta 'mod'" -#: parser.yy:853 -msgid "score expected" -msgstr "estis atendata muzik-skribaĵo" +#: parser.yy:954 +msgid "Missing music in \\score" +msgstr "Mankas muziko en \\score" -#: parser.yy:869 +#: parser.yy:991 msgid "\\paper cannot be used in \\score, use \\layout instead" msgstr "\\paper ne povas esti uzata en \\score, uzu \\layout anstataÅ­e" -#: parser.yy:893 +#: parser.yy:1027 +msgid "Spurious expression in \\score" +msgstr "Hazarda esprimo en \\score" + +#: parser.yy:1057 msgid "need \\paper for paper block" msgstr "necesas \\paper por papera bloko" -#: parser.yy:1033 parser.yy:1055 +#: parser.yy:1234 +msgid "music expected" +msgstr "estis atendata muziko" + +#: parser.yy:1244 parser.yy:1278 msgid "unexpected post-event" msgstr "malatendita post-evento" -#: parser.yy:1063 +#: parser.yy:1286 msgid "Ignoring non-music expression" msgstr "Ni preterpasas ne-muzikan esprimon" -#: parser.yy:1075 parser.yy:2493 -msgid "music expected" -msgstr "estis atendata muziko" - -#: parser.yy:1370 +#: parser.yy:1587 msgid "not a symbol" msgstr "ne estas simbolo" -#: parser.yy:2182 parser.yy:2296 parser.yy:2309 parser.yy:2318 +#: parser.yy:2337 parser.yy:2451 parser.yy:2464 parser.yy:2473 msgid "bad grob property path" msgstr "malĝusta vojo de eco de 'grob'" -#: parser.yy:2276 +#: parser.yy:2431 msgid "only \\consists and \\remove take non-string argument." msgstr "nur \\consists kaj \\remove prenas ne-ĉenan argumenton." -#: parser.yy:2337 +#: parser.yy:2492 msgid "bad context property path" msgstr "malĝusta vojo de eco de kunteksto" -#: parser.yy:2438 +#: parser.yy:2593 msgid "simple string expected" msgstr "estis atendata simpla ĉeno" -#: parser.yy:2456 +#: parser.yy:2611 msgid "symbol expected" msgstr "simbolo estis atendata" -#: parser.yy:2611 +#: parser.yy:2747 msgid "not a rhythmic event" msgstr "ne estas ritma evento" -#: parser.yy:2685 +#: parser.yy:2797 msgid "post-event expected" msgstr "post-evento estis atendata" -#: parser.yy:2694 parser.yy:2699 +#: parser.yy:2806 parser.yy:2811 msgid "have to be in Lyric mode for lyrics" msgstr "devas esti en reĝimo Lyric por tekstoj" -#: parser.yy:2767 -msgid "expecting string as script definition" -msgstr "ni atendas ĉeno kiel difino de skripto" +#: parser.yy:2887 +msgid "expecting string or post-event as script definition" +msgstr "ni atendas ĉenon aŭ post-eventon kiel difinon de skripto" -#: parser.yy:2875 +#: parser.yy:2991 msgid "not an articulation" msgstr "ne estas artikulacio" -#: parser.yy:2947 parser.yy:2990 +#: parser.yy:3063 parser.yy:3106 msgid "not a duration" msgstr "ne estas daÅ­ro" -#: parser.yy:3007 +#: parser.yy:3127 msgid "bass number expected" msgstr "estis atendata bas-simbolo" -#: parser.yy:3106 +#: parser.yy:3219 msgid "have to be in Note mode for notes" msgstr "devas esti en reĝimo Note por notoj" -#: parser.yy:3166 +#: parser.yy:3258 msgid "have to be in Chord mode for chords" msgstr "devas esti en reĝimo Chord por akordoj" -#: parser.yy:3181 +#: parser.yy:3301 msgid "markup outside of text script or \\lyricmode" msgstr "markado for de teksta skripto aÅ­ \\lyricmode" -#: parser.yy:3186 +#: parser.yy:3306 msgid "unrecognized string, not in text script or \\lyricmode" msgstr "nerekonita ĉeno, ne estas en teksta skripto aÅ­ \\lyricmode" -#: parser.yy:3347 parser.yy:3356 +#: parser.yy:3458 parser.yy:3467 msgid "not an unsigned integer" msgstr "ne estas sensigna entjero" -#: parser.yy:3424 +#: parser.yy:3541 msgid "not a markup" msgstr "ne estas markado" -#: lexer.ll:224 +#: lexer.ll:192 msgid "stray UTF-8 BOM encountered" msgstr "perdita UTF-8 BOM aperis" -#: lexer.ll:227 +#: lexer.ll:195 msgid "Skipping UTF-8 BOM" msgstr "Preterpasado de UTF-8 BOM" -#: lexer.ll:279 +#: lexer.ll:247 #, c-format msgid "Renaming input to: `%s'" msgstr "Renomigo de la enigo al: '%s'" -#: lexer.ll:296 +#: lexer.ll:264 msgid "quoted string expected after \\version" msgstr "citita ĉeno estas atendata post \\version" -#: lexer.ll:300 +#: lexer.ll:268 msgid "quoted string expected after \\sourcefilename" msgstr "citita ĉeno estas atendata post \\sourcefilename" -#: lexer.ll:304 +#: lexer.ll:272 msgid "integer expected after \\sourcefileline" msgstr "entjero estas atendata post \\sourcefileline" -#: lexer.ll:331 +#: lexer.ll:299 msgid "\\maininput not allowed outside init files" msgstr "\\maininput ne estas permesata ekstere de dosieroj 'init'" -#: lexer.ll:355 +#: lexer.ll:323 #, c-format msgid "wrong or undefined identifier: `%s'" msgstr "malĝusta aÅ­ nedifinita identigilo: '%s'" -#: lexer.ll:381 +#: lexer.ll:348 msgid "string expected after \\include" msgstr "ĉeno estas atendata post \\include" -#: lexer.ll:391 +#: lexer.ll:358 msgid "end quote missing" msgstr "fina citilo mankas" -#: lexer.ll:743 +#: lexer.ll:713 msgid "EOF found inside a comment" msgstr "EOF estis trovata interne de komento" -#: lexer.ll:748 +#: lexer.ll:718 msgid "EOF found inside string" msgstr "EOF estis trovata ene de ĉeno" -#: lexer.ll:763 +#: lexer.ll:733 msgid "Unfinished main input" msgstr "Nefinigita ĉefenigo" -#: lexer.ll:834 +#: lexer.ll:804 #, c-format msgid "invalid character: `%s'" msgstr "malvalida signo: '%s'" -#: lexer.ll:963 +#: lexer.ll:924 #, c-format msgid "unknown escaped string: `\\%s'" msgstr "nekonata eskapita ĉeno: '\\%s'" -#: lexer.ll:983 +#: lexer.ll:944 #, c-format msgid "undefined character or shorthand: %s" msgstr "nedifinita signo aÅ­ mallongigo: %s" -#: lexer.ll:1275 +#: lexer.ll:1235 msgid "non-UTF-8 input" msgstr "ne-unikoda enigo" -#: lexer.ll:1319 +#: lexer.ll:1279 +#, c-format +msgid "Invalid version string \"%s\"" +msgstr "Malvalida versio-ĉeno \"%s\"" + +#: lexer.ll:1284 #, c-format msgid "file too old: %s (oldest supported: %s)" msgstr "dosiero tro malnova: %s (pli malnova subtenata: %s)" -#: lexer.ll:1320 +#: lexer.ll:1285 msgid "consider updating the input with the convert-ly script" msgstr "konsideru ĝisdatigi la enigon per la skripto 'convert-ly'" -#: lexer.ll:1326 +#: lexer.ll:1291 #, c-format msgid "program too old: %s (file requires: %s)" msgstr "programo tro malnova: %s (la dosiero postulas: %s)" +#: auto-beam.scm:147 +msgid "Beam end fits no pattern" +msgstr "Vostliga fino kongruas kun neniu ŝablono" + #: backend-library.scm:27 #, scheme-format msgid "Invoking `~a'..." @@ -3393,24 +3369,24 @@ msgstr "Alvokado de '~a'..." msgid "`~a' failed (~a)\n" msgstr "'~a' fiaskis (~a)\n" -#: backend-library.scm:93 +#: backend-library.scm:94 #, scheme-format msgid "Converting to `~a'...\n" msgstr "Konvertado al '~a'...\n" #. Do not try to guess the name of the png file, #. GS produces PNG files like BASE-page%d.png. -#: backend-library.scm:102 +#: backend-library.scm:103 #, scheme-format msgid "Converting to ~a..." msgstr "Konvertado al ~a..." -#: backend-library.scm:140 +#: backend-library.scm:141 #, scheme-format msgid "Writing header field `~a' to `~a'..." msgstr "Skribado de kapa kampo '~a' al '~a'..." -#: backend-library.scm:189 +#: backend-library.scm:190 #, scheme-format msgid "missing stencil expression `~S'" msgstr "mankas esprimo de 'stencil' '~S'" @@ -3451,74 +3427,65 @@ msgstr "Eventuala rubaĵo sekvanta akordon: ~A" msgid "symbol ~S redefined" msgstr "simbolo ~S estis redifinata" -#: define-event-classes.scm:73 +#: define-event-classes.scm:74 #, scheme-format msgid "unknown parent class `~a'" msgstr "nekonata event-klaso '~a'" -#: define-event-classes.scm:107 +#: define-event-classes.scm:108 #, scheme-format msgid "Cannot redefine event class `~S'" msgstr "ne eblas redifini event-klason '~S'" -#: define-event-classes.scm:109 +#: define-event-classes.scm:110 #, scheme-format msgid "Undefined parent event class `~S'" msgstr "nekonata patra event-klaso '~S'" -#: define-markup-commands.scm:1083 +#: define-markup-commands.scm:1062 msgid "no systems found in \\score markup, does it have a \\layout block?" msgstr "neniu sistemo estis trovata en markado \\score, ĉu ĝi havas blokon \\layout?" -#: define-markup-commands.scm:2847 +#: define-markup-commands.scm:2886 #, scheme-format msgid "Cannot find glyph ~a" msgstr "Ne eblas trovi signobildon ~a" -#: define-markup-commands.scm:3273 +#: define-markup-commands.scm:3362 #, scheme-format msgid "no brace found for point size ~S " msgstr "neniu kurbkrampo estis trovata por la punkta grando ~S " -#: define-markup-commands.scm:3274 +#: define-markup-commands.scm:3363 #, scheme-format msgid "defaulting to ~S pt" msgstr "apriore al ~S pt" -#: define-markup-commands.scm:3526 +#: define-markup-commands.scm:3615 #, scheme-format msgid "not a valid duration string: ~a" msgstr "ne estas valida daÅ­ro-ĉeno: ~a" -#: define-markup-commands.scm:3737 +#: define-markup-commands.scm:3826 #, scheme-format msgid "not a valid duration string: ~a - ignoring" msgstr "ne estas valida daÅ­ro-ĉeno: ~a - ni preteratentas" -#: define-music-types.scm:792 +#: define-music-types.scm:797 #, scheme-format msgid "symbol expected: ~S" msgstr "atendata simbolo: ~S" -#: define-music-types.scm:795 +#: define-music-types.scm:800 #, scheme-format msgid "cannot find music object: ~S" msgstr "ne eblas trovi muzik-objekton: ~S" -#: define-music-types.scm:815 +#: define-music-types.scm:820 #, scheme-format msgid "bad make-music argument: ~S" msgstr "malĝusta argumento make-music: ~S" -#: define-music-types.scm:827 -#, scheme-format -msgid "unknown repeat type `~S'" -msgstr "nekonata ripeto-tipo '~S'" - -#: define-music-types.scm:828 -msgid "See define-music-types.scm for supported repeats" -msgstr "Vidu 'define-music-types.scm' por subtenataj ripetoj" - #: define-note-names.scm:972 msgid "Select note names language." msgstr "Elekti lingvon de not-nomoj." @@ -3533,37 +3500,37 @@ msgstr "Aplikado de not-nomoj '~a'..." msgid "Could not find language `~a'. Ignoring." msgstr "Ne eblis trovi la lingvon '~a'. Preterpaso." -#: document-backend.scm:132 +#: document-backend.scm:135 #, scheme-format msgid "pair expected in doc ~s" msgstr "paro estas atendata en dok ~s" -#: document-backend.scm:189 +#: document-backend.scm:202 #, scheme-format msgid "cannot find interface for property: ~S" msgstr "ne eblas trovi interfacon por la atributo: ~S" -#: document-backend.scm:199 +#: document-backend.scm:212 #, scheme-format msgid "unknown Grob interface: ~S" msgstr "nekonata interfaco Grob: ~S" -#: documentation-lib.scm:59 +#: documentation-lib.scm:62 #, scheme-format msgid "Processing ~S..." msgstr "Procezado de ~S..." -#: documentation-lib.scm:176 +#: documentation-lib.scm:178 #, scheme-format msgid "Writing ~S..." msgstr "Skribado de ~S..." -#: documentation-lib.scm:188 +#: documentation-lib.scm:190 #, scheme-format msgid "cannot find description for property `~S' (~S)" msgstr "ne eblas trovi priskribon por la atributo '~S' (~S)" -#: documentation-lib.scm:209 +#: documentation-lib.scm:211 #, scheme-format msgid "cannot find description for property ~S (~S)" msgstr "ne eblas trovi priskribon por la atributo ~S (~S)" @@ -3578,27 +3545,27 @@ msgstr "flag-streko '~a' aÅ­ '~a' ne estis trovata" msgid "Writing ~a..." msgstr "Skribado de ~a..." -#: framework-ps.scm:250 +#: framework-ps.scm:281 #, scheme-format msgid "cannot embed ~S=~S" msgstr "ne eblas enkorpigi ~S=~S" -#: framework-ps.scm:293 +#: framework-ps.scm:324 #, scheme-format msgid "cannot extract file matching ~a from ~a" msgstr "ne eblas eltiri dosieron kongruanta al ~a, el ~a" -#: framework-ps.scm:311 +#: framework-ps.scm:342 #, scheme-format msgid "do not know how to embed ~S=~S" msgstr "ni ne scias kiel enkorpigi ~S=~S" -#: framework-ps.scm:336 +#: framework-ps.scm:367 #, scheme-format msgid "do not know how to embed font ~s ~s ~s" msgstr "ni ne scias kiel enkorpigi la tiparon ~s ~s ~s" -#: framework-ps.scm:687 +#: framework-ps.scm:729 msgid "" "\n" "The PostScript backend does not support the\n" @@ -3646,20 +3613,20 @@ msgstr "Eraro en kalkulado de vostligo. Atendante (~S,~S), trovis ~S." msgid "Error in beam quanting. Expected ~S 0, found ~S." msgstr "Eraro en kalkulado de vostligo. Atendante ~S 0, trovis ~S." -#: lily-library.scm:333 +#: lily-library.scm:350 msgid "Music unsuitable for context-mod" msgstr "La muziko ne taÅ­gas por 'context-mod'" -#: lily-library.scm:388 +#: lily-library.scm:405 #, scheme-format msgid "Cannot find context-def \\~a" msgstr "Ne eblas trovi context-def \\~a" -#: lily-library.scm:404 +#: lily-library.scm:421 msgid "Music unsuitable for output-def" msgstr "La muziko ne taÅ­gas por output-def" -#: lily-library.scm:884 +#: lily-library.scm:921 msgid "" "Find the index between @var{start} and @var{end} (an integer)\n" "which produces the closest match to @var{target-val} if\n" @@ -3669,12 +3636,12 @@ msgstr "" "kiu produktas plej bonan kongruon al @var{target-val} se\n" "aplikata al la funkcio @var{getter}." -#: lily-library.scm:955 +#: lily-library.scm:1015 #, scheme-format msgid "unknown unit: ~S" msgstr "nekonata unuo: ~S" -#: lily-library.scm:980 +#: lily-library.scm:1040 #, scheme-format msgid "no \\version statement found, please add~afor future compatibility" msgstr "neniu komando \\version estis trovata, bonvolu aldoni ~a por estonta kongrueco" @@ -3687,33 +3654,33 @@ msgstr "call-after-session estis uzata post komenco de seanco" msgid "define-session used after session start" msgstr "define-session estis uzata post komenco de seanco" -#: lily.scm:393 +#: lily.scm:399 msgid "Using (ice-9 curried-definitions) module\n" msgstr "Ni uzas la modulon (ice-9 curried-definitions)\n" -#: lily.scm:396 +#: lily.scm:402 msgid "Guile 1.8\n" msgstr "Guile 1.8\n" -#: lily.scm:455 +#: lily.scm:459 #, scheme-format msgid "cannot find: ~A" msgstr "ne eblas trovi: ~A" -#: lily.scm:878 +#: lily.scm:886 msgid "Success: compilation successfully completed" msgstr "Sukceso: la kompilado sukcese plenumiĝis" -#: lily.scm:879 +#: lily.scm:887 msgid "Compilation completed with warnings or errors" msgstr "La kompilado plenumiĝis kun avertoj aÅ­ eraroj" -#: lily.scm:940 +#: lily.scm:948 #, scheme-format msgid "job ~a terminated with signal: ~a" msgstr "la laboro ~a finis kun signalo: ~a" -#: lily.scm:943 +#: lily.scm:951 #, scheme-format msgid "" "logfile ~a (exit ~a):\n" @@ -3722,17 +3689,17 @@ msgstr "" "protokol-dosiero ~a (eliro ~a):\n" "~a" -#: lily.scm:965 lily.scm:1054 +#: lily.scm:973 lily.scm:1062 #, scheme-format msgid "failed files: ~S" msgstr "fiaskintajn dosieroj: ~S" -#: lily.scm:1045 +#: lily.scm:1053 #, scheme-format msgid "Redirecting output to ~a..." msgstr "Redirektigo de eligo al ~a..." -#: lily.scm:1064 ps-to-png.scm:66 +#: lily.scm:1072 ps-to-png.scm:66 #, scheme-format msgid "Invoking `~a'...\n" msgstr "Alvokado de '~a'...\n" @@ -3742,12 +3709,12 @@ msgstr "Alvokado de '~a'...\n" msgid "~a function cannot return ~a" msgstr "funkcio ~a ne povas liveri ~a" -#: ly-syntax-constructors.scm:75 +#: ly-syntax-constructors.scm:76 #, scheme-format msgid "wrong type for argument ~a. Expecting ~a, found ~s" msgstr "malĝusta tipo por argumento ~a. Atendate ~a, trovite ~s" -#: ly-syntax-constructors.scm:199 +#: ly-syntax-constructors.scm:200 #, scheme-format msgid "Invalid property operation ~a" msgstr "Malvalida atribut-operacio ~a" @@ -3791,58 +3758,77 @@ msgstr "la inversigota tonalto ne estas en skalo; preterpaso" msgid "negative replication count; ignoring" msgstr "negativa nombro da rekopiado; preterpaso" -#: music-functions.scm:272 -msgid "More alternatives than repeats. Junking excess alternatives" -msgstr "Pli da alternativoj ol ripetoj. Forĵeto de kromaj alternativoj" - -#: music-functions.scm:303 +#: music-functions.scm:311 #, scheme-format msgid "invalid tremolo repeat count: ~a" msgstr "malvalida tremson-ripeta nombro: ~a" -#: music-functions.scm:459 +#: music-functions.scm:340 +#, scheme-format +msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo" +msgstr "nekonata ripeto-tipo '~S': devas esti volta, unfold, percent, aŭ tremolo" + +#: music-functions.scm:344 +msgid "More alternatives than repeats. Junking excess alternatives" +msgstr "Pli da alternativoj ol ripetoj. Forĵeto de kromaj alternativoj" + +#: music-functions.scm:480 #, scheme-format msgid "bad grob property path ~a" -msgstr "Malĝusta vojo de eco de 'grob' ~a" +msgstr "malĝusta vojo de eco de 'grob' ~a" -#: music-functions.scm:753 +#: music-functions.scm:779 msgid "Bad chord repetition" msgstr "Malĝusta ripeto de akordo" -#: music-functions.scm:788 +#: music-functions.scm:884 #, scheme-format msgid "music expected: ~S" msgstr "atendita muziko: ~S" -#: music-functions.scm:1144 +#: music-functions.scm:1226 #, scheme-format msgid "cannot find quoted music: `~S'" msgstr "ne eblas trovi la cititan muzikon: '~S'" -#: music-functions.scm:1282 +#: music-functions.scm:1366 msgid "Add @var{octave-shift} to the octave of @var{pitch}." msgstr "Aldoni @var{octave-shift} al la okto de @var{pitch}." -#: music-functions.scm:1342 +#: music-functions.scm:1429 #, scheme-format msgid "Unknown octaveness type: ~S " msgstr "Nekonata okteca tipo: ~S " -#: music-functions.scm:1343 +#: music-functions.scm:1430 msgid "Defaulting to 'any-octave." msgstr "Apriore al 'any-octave." -#: music-functions.scm:1688 +#: music-functions.scm:1822 #, scheme-format msgid "unknown accidental style: ~S" msgstr "nekonata stilo de aliigo: ~S" -#: output-ps.scm:278 output-svg.scm:539 +#: music-functions.scm:2040 +msgid "Missing duration" +msgstr "Mankas daÅ­ro" + +#: music-functions.scm:2549 +#, scheme-format +msgid "not a symbol list: ~a" +msgstr "ne estas simbolo-listo: ~a" + +#: music-functions.scm:2552 +#, scheme-format +msgid "conflicting tag group ~a" +msgstr "konfliktanta mark-grupo ~a" + +#: output-ps.scm:290 output-svg.scm:539 #, scheme-format msgid "unknown line-cap-style: ~S" msgstr "nekonata 'line-cap-style': ~S" -#: output-ps.scm:283 output-svg.scm:545 +#: output-ps.scm:295 output-svg.scm:545 #, scheme-format msgid "unknown line-join-style: ~S" msgstr "nekonata 'line-join-style': ~S" @@ -3861,32 +3847,32 @@ msgstr "Signobildo devas havi unikodan valoron" msgid "cannot find SVG font ~S" msgstr "ne eblas trovi SVG-tiparon ~S" -#: paper.scm:120 +#: paper.scm:122 msgid "set-global-staff-size: not in toplevel scope" msgstr "set-global-staff-size: ne en supernivela rango" -#: paper.scm:320 +#: paper.scm:322 #, scheme-format msgid "This is not a \\layout {} object, ~S" msgstr "Tio ĉi ne estas objekto \\layout {}, ~S" -#: paper.scm:328 +#: paper.scm:330 #, scheme-format msgid "Unknown paper size: ~a" msgstr "Nekonata paper-grando: ~a" #. TODO: should raise (generic) exception with throw, and catch #. that in parse-scm.cc -#: paper.scm:347 +#: paper.scm:349 msgid "Must use #(set-paper-size .. ) within \\paper { ... }" msgstr "Uzendas #(set-paper-size .. ) interne de \\paper { ... }" -#: parser-clef.scm:164 +#: parser-clef.scm:154 #, scheme-format msgid "unknown clef type `~a'" msgstr "nekonata kleftipo '~a'" -#: parser-clef.scm:165 +#: parser-clef.scm:155 #, scheme-format msgid "supported clefs: ~a" msgstr "subtenataj klefoj: ~a" @@ -3895,7 +3881,7 @@ msgstr "subtenataj klefoj: ~a" msgid "error in #{ ... #}" msgstr "eraro en #{ ... #}" -#: part-combiner.scm:598 +#: part-combiner.scm:748 #, scheme-format msgid "quoted music `~a' is empty" msgstr "la citita muziko '~a' estas malplena" @@ -3910,40 +3896,40 @@ msgstr "~a finis kun stato: ~S" msgid "assertion failed: ~S" msgstr "aserto fiaskis: ~S" -#: translation-functions.scm:368 +#: translation-functions.scm:389 #, scheme-format msgid "Negative fret for pitch ~a on string ~a" msgstr "Negativa freto por tonalto ~a sur kordo ~a" -#: translation-functions.scm:371 +#: translation-functions.scm:392 #, scheme-format msgid "Missing fret for pitch ~a on string ~a" msgstr "Mankas freto por tonalto ~a sur kordo ~a" -#: translation-functions.scm:414 +#: translation-functions.scm:435 #, scheme-format msgid "No open string for pitch ~a" msgstr "Neniu libera kordo por tonalto ~a" -#: translation-functions.scm:429 translation-functions.scm:441 +#: translation-functions.scm:450 translation-functions.scm:462 #, scheme-format msgid "Requested string for pitch requires negative fret: string ~a pitch ~a" msgstr "La petita kordo por tonalto postulas negativan freton: kordo ~a tonalto ~a" -#: translation-functions.scm:432 +#: translation-functions.scm:453 msgid "Ignoring string request and recalculating." msgstr "Preterpaso de peto de kordo kaj rekalkulado." -#: translation-functions.scm:444 +#: translation-functions.scm:465 msgid "Ignoring note in tablature." msgstr "Preterpaso de noto en tabulaturo." -#: translation-functions.scm:469 +#: translation-functions.scm:490 #, scheme-format msgid "No string for pitch ~a (given frets ~a)" msgstr "Neniu kordo por tonalto ~a (je fretoj ~a)" -#: translation-functions.scm:574 +#: translation-functions.scm:595 #, scheme-format msgid "" "No label for fret ~a (on string ~a);\n" @@ -3952,6 +3938,57 @@ msgstr "" "Neniu etikedo por freto ~a (sur kordo ~a);\n" "nur ~a fret-etikedoj estis provizataj" +#~ msgid "cannot find Voice `%s'" +#~ msgstr "ne eblas trovi Voĉon '%s'" + +#~ msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." +#~ msgstr "Teksta silabo ne havas noton. Uzu \\lyricsto aŭ 'associatedVoice'." + +#~ msgid "Using naive multi measure rest spacing." +#~ msgstr "Uzanta naivan plur-mezuran paÅ­zo-spacadon." + +#~ msgid "(normalized pitch)" +#~ msgstr "(normigita tonalto)" + +#~ msgid "Transposing %s by %s makes alteration larger than double" +#~ msgstr "Transpono de %s per %s igas aliigon pli granda ol duobla" + +#~ msgid "ignoring too many clashing note columns" +#~ msgstr "ni preterpasas tro multajn kolumnojn kun koliziantaj notoj" + +#~ msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" +#~ msgstr "ne eblas akomodi muzikon sur paĝo: 'ragged-spacing' estis petata, sed la paĝo estis densigata" + +#~ msgid "cannot fit music on page: overflow is %f" +#~ msgstr "ne eblas akomodi muzikon sur paĝo: troo estas %f" + +#~ msgid "compressing music to fit" +#~ msgstr "densigado de muziko por akomodi" + +#~ msgid "trying to use \\partial after the start of a piece" +#~ msgstr "ni provas uzi \\partial post la komenco de muziko" + +#~ msgid "rhythmic head is not part of a rhythmic column" +#~ msgstr "ritma kapo ne estas parto de ritma kolumno" + +#~ msgid "Cyclic markup detected: %s" +#~ msgstr "Cikla markado estis detektata: %s" + +#~ msgid "time signature symbol `%s' not found; reverting to numbered style" +#~ msgstr "tempindika simbolo '%s' ne estis trovata; ni revenas al numera stilo" + +#~ msgid "Too much lookahead" +#~ msgstr "Tro da antaÅ­rigardo" + +#~ msgid "score expected" +#~ msgstr "estis atendata muzik-skribaĵo" + +#~ msgid "unknown repeat type `~S'" +#~ msgstr "nekonata ripeto-tipo '~S'" + +#~ msgid "See define-music-types.scm for supported repeats" +#~ msgstr "Vidu 'define-music-types.scm' por subtenataj ripetoj" + #~ msgid "cannot find start of (de)crescendo" #~ msgstr "ne eblas trovi komencon de '(de)crescendo'" diff --git a/po/es.po b/po/es.po index 368931372d..bc34b5f5be 100644 --- a/po/es.po +++ b/po/es.po @@ -1,4 +1,4 @@ -# translation of lilypond-2.17.96.po to Español +# translation of lilypond-2.19.26.po to Español # Spanish translation of GNU Lilypond - http://lilypond.org # Copyright (C) 2002, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # @@ -7,16 +7,16 @@ # Quique , 2002, 2004. # Daniel Tonda , 2006. # This file is distributed under the same license as the lilypond package. -# Francisco Vila , 2007, 2008, 2009, 2010, 2011, 2012, 2013. +# Francisco Vila , 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2016. # msgid "" msgstr "" -"Project-Id-Version: lilypond-2.17.96\n" +"Project-Id-Version: lilypond-2.19.26\n" "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n" -"POT-Creation-Date: 2013-11-24 12:14+0000\n" -"PO-Revision-Date: 2013-11-29 10:11+0100\n" +"POT-Creation-Date: 2015-08-27 10:48+0100\n" +"PO-Revision-Date: 2016-04-30 16:09+0200\n" "Last-Translator: Francisco Vila \n" -"Language-Team: Spanish \n" +"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -42,11 +42,11 @@ msgstr "no se encuentra \\begin{document} en el documento de LaTeX" msgid "Running `%s' on file `%s' to detect default page settings.\n" msgstr "Ejecutando «%s» sobre el archivo «%s» para detectar los ajustes de página predeterminados.\n" -#: book_latex.py:212 book_texinfo.py:228 +#: book_latex.py:219 book_texinfo.py:228 msgid "Unable to auto-detect default settings:\n" msgstr "No se pudieron detectar automáticamente los ajustes predeterminados:\n" -#: book_latex.py:224 book_texinfo.py:240 +#: book_latex.py:231 book_texinfo.py:240 #, python-format msgid "" "Unable to auto-detect default settings:\n" @@ -55,7 +55,7 @@ msgstr "" "No se pudieron detectar automáticamente los ajustes predeterminados:\n" "%s" -#: book_latex.py:247 +#: book_latex.py:254 msgid "cannot detect textwidth from LaTeX" msgstr "no se puede detectar el valor de textwidth a partir de LaTeX" @@ -89,31 +89,31 @@ msgstr "opción ly desconocida e ignorada: %s" msgid "Missing files: %s" msgstr "Archivos que faltan: %s" -#: book_snippets.py:651 +#: book_snippets.py:661 #, python-format msgid "Could not overwrite file %s" msgstr "No se puede sobreescribir el archivo %s" -#: book_snippets.py:738 +#: book_snippets.py:748 #, python-format msgid "Running through filter `%s'" msgstr "Ejecutando a través del filtro «%s»" -#: book_snippets.py:759 +#: book_snippets.py:769 #, python-format msgid "`%s' failed (%d)" msgstr "«%s» ha fallado (%d)" -#: book_snippets.py:760 +#: book_snippets.py:770 msgid "The error log is as follows:" msgstr "El registro de errores es como sigue:" -#: book_snippets.py:880 +#: book_snippets.py:890 #, python-format msgid "Converting MusicXML file `%s'...\n" msgstr "Conviertiendo archivo MusicXML «%s»...\n" -#: book_snippets.py:907 +#: book_snippets.py:917 #, python-format msgid "" "%s: duplicate filename but different contents of original file,\n" @@ -122,7 +122,7 @@ msgstr "" "%s: nombre duplicado pero contenido diferente del archivo original,\n" "se imprime la diferencia respecto al archivo existente." -#: book_snippets.py:920 +#: book_snippets.py:930 #, python-format msgid "" "%s: duplicate filename but different contents of converted lilypond file,\n" @@ -173,7 +173,7 @@ msgstr "\\textstyle en desuso, sintaxis nueva para \\key" #: convertrules.py:82 convertrules.py:1856 convertrules.py:2032 #: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801 -#: convertrules.py:3151 convertrules.py:3385 +#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700 msgid "bump version for release" msgstr "actualizar la versión para el lanzamiento" @@ -594,10 +594,10 @@ msgstr "Eliminar oldaddlyrics" #: convertrules.py:2820 msgid "" "oldaddlyrics is no longer supported. \n" -" Use addlyrics or lyrsicsto instead.\n" +" Use addlyrics or lyricsto instead.\n" msgstr "" "oldaddlyrics ya no está contemplado. \n" -" Utilice en su lugar addlyrics o lyrsicsto.\n" +" Utilice en su lugar addlyrics o lyricsto.\n" #: convertrules.py:2826 msgid "" @@ -627,10 +627,8 @@ msgid "\\bar \".\" now produces a thick barline.\n" msgstr "\\bar \".\" ahora produce una línea divisoria gruesa.\n" #: convertrules.py:2849 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" -msgstr "" -"Los parámetros de discontinuidad para las ligaduras\n" -"de expresión y de unión ahora están en 'dash-details.\n" +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" +msgstr "Los parámetros de discontinuidad para las ligaduras de expresión y de unión ahora están en 'dash-definition.\n" #: convertrules.py:2854 msgid "" @@ -845,15 +843,15 @@ msgstr "consistent-broken-slope se maneja ahora a través del callback «positio msgid "input/regression/beam-broken-classic.ly shows how broken beams are now handled.\n" msgstr "input/regression/beam-broken-classic.ly muestra cómo se manejan ahora las barras divididas.\n" -#: convertrules.py:3369 +#: convertrules.py:3372 msgid "beamExceptions controls whole-measure beaming." msgstr "beamExceptions controla el barrado de compases completos." -#: convertrules.py:3606 +#: convertrules.py:3609 msgid "Flag.transparent and Flag.color inherit from Stem" msgstr "Flag.transparent y Flag.color se heredan de Stem" -#: convertrules.py:3672 +#: convertrules.py:3675 msgid "Staff-padding now controls the distance to the baseline, not the nearest point." msgstr "Staff-padding ahora controla la distancia a la línea de base, no al punto más próximo." @@ -959,12 +957,12 @@ msgstr "¡Se ha proporcionado una octava de alteración de tonalidad para un nú msgid "Unable to find instrument for ID=%s\n" msgstr "No se ha podido encontrar el instrumento con el ID=%s\n" -#: abc2ly.py:1386 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 +#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 #, python-format msgid "%s [OPTION]... FILE" msgstr "%s [OPCIÓN]... ARCHIVO" -#: abc2ly.py:1387 +#: abc2ly.py:1390 #, python-format msgid "" "abc2ly converts ABC music files (see\n" @@ -973,29 +971,29 @@ msgstr "" "abc2ly convierte archivos de música de ABC\n" "(véase %s) en código de entrada de LilyPond.\n" -#: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 -#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:181 +#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 +#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184 msgid "show version number and exit" msgstr "mostrar el número de versión y salir" -#: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 -#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:160 +#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 +#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163 msgid "show this help and exit" msgstr "mostrar esta ayuda y salir" -#: abc2ly.py:1401 etf2ly.py:1209 midi2ly.py:1071 +#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071 msgid "write output to FILE" msgstr "escribir la salida en el ARCHIVO" -#: abc2ly.py:1404 +#: abc2ly.py:1407 msgid "be strict about success" msgstr "ser estricto respecto al éxito" -#: abc2ly.py:1407 +#: abc2ly.py:1410 msgid "preserve ABC's notion of beams" msgstr "preservar la noción de las barras de ABC" -#: abc2ly.py:1410 +#: abc2ly.py:1413 msgid "suppress progress messages" msgstr "suprimir mensajes de avance" @@ -1003,8 +1001,8 @@ msgstr "suprimir mensajes de avance" #. "Report bugs in English via %s", #. or if there is a LilyPond users list or forum in your language #. "Report bugs in English via %s or in YOUR_LANG via URI" -#: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 -#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:315 +#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 +#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318 #, c-format, python-format msgid "Report bugs via %s" msgstr "" @@ -1058,7 +1056,7 @@ msgid "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS msgstr "Imprimir los mensajes de registro según NIVEL_DE_REGISTRO (NONE (ninguno), ERROR (error), WARNING (advertencias), PROGRESS (avance; predeterminado), DEBUG (depuración))" #: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181 -#: musicxml2ly.py:2629 main.cc:174 +#: musicxml2ly.py:2629 main.cc:177 msgid "LOGLEVEL" msgstr "NIVEL_DE_REGISTRO" @@ -1090,7 +1088,7 @@ msgid "make a numbered backup [default: filename.ext~]" msgstr "hacer una copia de respaldo numerada [predeterminado: nombre.ext~]" #: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096 -#: main.cc:183 +#: main.cc:186 msgid "show warranty and copyright" msgstr "mostrar los avisos de garantía y de copyright" @@ -1111,17 +1109,17 @@ msgstr "Detención en la última regla satisfactoria" msgid "Processing `%s'... " msgstr "Procesando «%s»... " -#: convert-ly.py:367 +#: convert-ly.py:366 #, python-format msgid "%s: Unable to open file" msgstr "%s: No se pudo abrir el archivo" -#: convert-ly.py:373 +#: convert-ly.py:372 #, python-format msgid "%s: Unable to determine version. Skipping" msgstr "%s: no se puede determinar la versión. Se salta" -#: convert-ly.py:379 +#: convert-ly.py:378 #, python-format msgid "" "%s: Invalid version string `%s' \n" @@ -1130,7 +1128,7 @@ msgstr "" "%s: Cadena de versión no válida `%s' \n" "Las cadenas de versión válidas se componen de tres números separados por puntos, p.ej. `2.8.12'" -#: convert-ly.py:385 +#: convert-ly.py:384 #, python-format msgid "There was %d error." msgid_plural "There were %d errors." @@ -1152,7 +1150,7 @@ msgstr "" "archivo de LilyPond listo para usar.\n" #: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659 -#: main.cc:166 main.cc:178 +#: main.cc:169 main.cc:181 msgid "FILE" msgstr "ARCHIVO" @@ -1190,7 +1188,7 @@ msgid "add DIR to include path" msgstr "añadir DIRECTORIO a la ruta de inclusión" #: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169 -#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:165 +#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168 msgid "DIR" msgstr "DIRECTORIO" @@ -1203,7 +1201,7 @@ msgid "PAD" msgstr "RELLENAR" #: lilypond-book.py:157 -msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)" +msgid "pad left side of music to align music in spite of uneven bar numbers (in mm)" msgstr "rellenar el lado izquierdo de la música para alinear la música aunque haya un número desigual de compases (en mm)" #: lilypond-book.py:162 @@ -1337,17 +1335,17 @@ msgstr "Procesando el archivo de inclusión: %s" msgid "Removing `%s'" msgstr "Suprimiendo «%s»" -#: lilypond-book.py:714 +#: lilypond-book.py:727 #, python-format msgid "Setting LilyPond's loglevel to %s" msgstr "Se establece el nivel de registro de LilyPond a %s" -#: lilypond-book.py:718 +#: lilypond-book.py:731 #, python-format msgid "Setting LilyPond's loglevel to %s (from environment variable LILYPOND_LOGLEVEL)" msgstr "Se establece el nivel de registro de LilyPond a %s (a partir de la variable de entorno LILYPOND_LOGLEVEL)" -#: lilypond-book.py:721 +#: lilypond-book.py:734 msgid "Setting LilyPond's output to --verbose, implied by lilypond-book's setting" msgstr "Se establece la salida de LilyPond a --verbose (prolija), implícita por el ajuste de lilypond-book" @@ -1566,12 +1564,12 @@ msgstr "" #: musicxml2ly.py:2576 msgid "" -"Copyright (c) 2005--2012 by\n" +"Copyright (c) 2005--2015 by\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen and\n" " Reinhold Kainhofer \n" msgstr "" -"Copyright (c) 2005--2012 por\n" +"Copyright (c) 2005--2015 por\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen y\n" " Reinhold Kainhofer \n" @@ -1650,22 +1648,22 @@ msgstr "Leyendo MusicXML desde %s ..." #: musicxml2ly.py:2894 #, python-format msgid "Output to `%s'" -msgstr "La salida se dirige hacia `%s'" +msgstr "La salida se dirige hacia «%s»" #: musicxml2ly.py:2964 #, python-format msgid "Unable to find input file %s" msgstr "No se encuentra el archivo de entrada %s" -#: website_post.py:125 +#: website_post.py:129 msgid "English" msgstr "Inglés" -#: website_post.py:128 +#: website_post.py:132 msgid "Other languages" msgstr "Otros idiomas" -#: website_post.py:129 +#: website_post.py:133 #, python-format msgid "About automatic language selection." msgstr "Acerca de la selección automática del idioma." @@ -1740,21 +1738,21 @@ msgstr "advertencia suprimida: %s" msgid "accidental typesetting list must begin with context-name: %s" msgstr "la lista de tippografiado de alteraciones accidentales debe comenzar con context-name: %s" -#: accidental-engraver.cc:210 +#: accidental-engraver.cc:207 #, c-format msgid "procedure or context-name expected for accidental rule, found %s" msgstr "se esperaba un procedimiento o un nombre de contexto para la regla de alteración accidental, se ha encontrado %s" -#: accidental.cc:169 +#: accidental.cc:141 #, c-format msgid "Could not find glyph-name for alteration %s" msgstr "No se ha encontrado el nombre de glifo para la alteración %s" -#: accidental.cc:184 +#: accidental.cc:157 msgid "natural alteration glyph not found" msgstr "no se encuentra el glifo del símbolo de becuadro" -#: all-font-metrics.cc:149 +#: all-font-metrics.cc:159 #, c-format msgid "cannot find font: `%s'" msgstr "no se encuentra la tipografía «%s»" @@ -1767,11 +1765,6 @@ msgstr "el argumento de \\applycontext no es un procedimiento" msgid "no heads for arpeggio found?" msgstr "¿No se han encontrado notas para el arpegio?" -#: auto-change-iterator.cc:74 change-iterator.cc:72 -#, c-format -msgid "cannot change, already in translator: %s" -msgstr "no se puede cambiar, ya está dentro del traductor: %s" - #: axis-group-engraver.cc:149 msgid "Axis_group_engraver: vertical group already has a parent" msgstr "Axis_group_engraver: el grupo vertical ya tiene un ancestro" @@ -1784,12 +1777,12 @@ msgstr "¿hay dos Axis_group_engravers?" msgid "removing this vertical group" msgstr "se suprime este grupo vertical" -#: axis-group-interface.cc:714 +#: axis-group-interface.cc:716 #, c-format msgid "\"%s\" is not a valid outside-staff-placement-directive" msgstr "«%s» no es una directiva válida de colocación fuera del pentagrama" -#: axis-group-interface.cc:786 +#: axis-group-interface.cc:788 msgid "an outside-staff object should have a direction, defaulting to up" msgstr "un objeto externo a la pauta debe tener una dirección, por omisión se establece hacia arriba" @@ -1819,11 +1812,11 @@ msgid "beam was started here" msgstr "la barra comenzó aquí" #. We are completely screwed. -#: beam-quanting.cc:839 +#: beam-quanting.cc:850 msgid "no viable initial configuration found: may not find good beam slope" msgstr "no se ha encontrado ninguna configuración inicial viable; puede que no se encuentre una buena inclinación de las barras" -#: beam.cc:181 +#: beam.cc:183 msgid "removing beam with no stems" msgstr "se suprime la barra sin plicas" @@ -1833,22 +1826,24 @@ msgid "cannot change `%s' to `%s'" msgstr "no se puede cambiar de «%s» a «%s»" #. FIXME: constant error message. -#: change-iterator.cc:93 +#: change-iterator.cc:67 msgid "cannot find context to switch to" msgstr "no se encuentra el contexto al que cambiar" +#. No enclosing context was found because the iterator's immediate +#. context is the kind that was sought. #. We could change the current translator's id, but that would make #. errors hard to catch. #. #. last->translator_id_string () = get_change #. ()->change_to_id_string (); -#: change-iterator.cc:102 +#: change-iterator.cc:78 #, c-format msgid "not changing to same context type: %s" msgstr "no se cambia al mismo tipo de contexto: %s" -#. FIXME: uncomprehensable message -#: change-iterator.cc:106 +#. FIXME: incomprehensible message +#: change-iterator.cc:82 msgid "none of these in my family" msgstr "no hay ninguno de estos en mi familia" @@ -1883,26 +1878,26 @@ msgstr "Coherent_ligature_engraver: se establece `spacing-increment=0.01': ptr=% msgid "cannot find line breaking that satisfies constraints" msgstr "no se ecnuentra un salto de línea que cumpla las restricciones" -#: context-property.cc:43 +#: context-property.cc:46 msgid "need symbol arguments for \\override and \\revert" msgstr "se necesitan argumentos de símbolo para \\override y \\revert" -#: context.cc:149 +#: context.cc:144 #, c-format msgid "cannot find or create new `%s'" msgstr "no se encuentra o no se puede crear un «%s» nuevo" -#: context.cc:228 +#: context.cc:223 #, c-format msgid "cannot find or create `%s' called `%s'" msgstr "no se encuentra o no se puede crear «%s» llamado «%s»" -#: context.cc:425 +#: context.cc:416 #, c-format msgid "cannot find or create: `%s'" msgstr "no se encuentra o no se puede crear «%s»" -#: context.cc:439 +#: context.cc:430 #, c-format msgid "cannot find or create new Bottom = \"%s\"" msgstr "no se encuentra o no se puede crear un Bottom = «%s» nuevo" @@ -1912,20 +1907,20 @@ msgstr "no se encuentra o no se puede crear un Bottom = «%s» nuevo" msgid "custos `%s' not found" msgstr "no se encuentran los custos «%s»" -#: dispatcher.cc:89 +#: dispatcher.cc:82 msgid "Event class should be a list" msgstr "La clase del evento debe ser una lista" -#: dispatcher.cc:172 +#: dispatcher.cc:165 #, c-format msgid "Junking event: %s" msgstr "se elimina el evento: %s" -#: dispatcher.cc:277 +#: dispatcher.cc:279 msgid "Attempting to remove nonexisting listener." msgstr "Tratando de eliminar un \"listener\" que no existe." -#: dispatcher.cc:303 +#: dispatcher.cc:305 msgid "Already listening to dispatcher, ignoring request" msgstr "Ya se está escuchando al despachador, se ignora la solicitud" @@ -1934,7 +1929,7 @@ msgstr "Ya se está escuchando al despachador, se ignora la solicitud" msgid "dot `%s' not found" msgstr "no se encuentra el puntillo «%s»" -#: dynamic-engraver.cc:168 +#: dynamic-engraver.cc:169 #, c-format msgid "" "unknown crescendo style: %s\n" @@ -1943,7 +1938,7 @@ msgstr "" "estilo de crescendo desconocido: %s\n" "se toma regulador como predeterminado." -#: dynamic-engraver.cc:233 slur-proto-engraver.cc:119 +#: dynamic-engraver.cc:234 slur-proto-engraver.cc:119 #, c-format msgid "unterminated %s" msgstr "%s sin terminar" @@ -1971,22 +1966,22 @@ msgstr "episema sin terminar" msgid "unterminated extender" msgstr "prolongación sin terminar" -#: flag.cc:134 +#: flag.cc:133 #, c-format msgid "flag `%s' not found" msgstr "no se encuentra el indicador «%s»" -#: flag.cc:154 +#: flag.cc:153 #, c-format msgid "flag stroke `%s' not found" msgstr "no se encuentra la forma del glifo del corchete «%s»" -#: font-config-scheme.cc:151 font-config.cc:53 +#: font-config-scheme.cc:151 font-config.cc:82 #, c-format msgid "failed adding font directory: %s" msgstr "fallo al añadir la carpeta de tipografías: %s" -#: font-config-scheme.cc:153 font-config.cc:55 +#: font-config-scheme.cc:153 font-config.cc:84 #, c-format msgid "Adding font directory: %s" msgstr "Añadiendo carpeta de tipografías: %s" @@ -2005,7 +2000,17 @@ msgstr "Añadiendo archivo de fuente tipográfica: %s" msgid "Initializing FontConfig..." msgstr "Inicializando FontConfig..." -#: font-config.cc:58 +#: font-config.cc:70 +#, c-format +msgid "failed to add fontconfig configuration file `%s'" +msgstr "fallo al añadir el archivo de configuración de fontconfig: «%s»" + +#: font-config.cc:73 +#, c-format +msgid "Adding fontconfig configuration file: %s" +msgstr "Añadiendo archivo de configuración de fontconfig: %s" + +#: font-config.cc:86 msgid "Building font database..." msgstr "Construyendo la base de datos de fuentes tipográficas..." @@ -2013,12 +2018,12 @@ msgstr "Construyendo la base de datos de fuentes tipográficas..." msgid "Must be footnote-event." msgstr "Debe ser un evento de nota al pie." -#: general-scheme.cc:390 +#: general-scheme.cc:403 #, c-format msgid "failed redirecting stderr to `%s'" msgstr "fallo al redirigir la salida stderr a «%s»" -#: general-scheme.cc:469 output-ps.scm:48 +#: general-scheme.cc:482 output-ps.scm:48 msgid "Found infinity or nan in output. Substituting 0.0" msgstr "Se ha encontrado Infinito o NaN en la salida. Se sustituye por 0.0" @@ -2069,12 +2074,12 @@ msgstr "interfaz desconocido «%s»" msgid "Grob `%s' has no interface for property `%s'" msgstr "El grob «%s» no tiene interfaz para la propiedad «%s»" -#: grob-property.cc:35 +#: grob-property.cc:33 #, c-format msgid "%d: %s" msgstr "%d: %s" -#: grob.cc:488 +#: grob.cc:492 #, c-format msgid "ignored infinite %s-offset" msgstr "se ignora el desplazamiento infinito de %s" @@ -2083,7 +2088,7 @@ msgstr "se ignora el desplazamiento infinito de %s" msgid "Asking for broken bound padding at a non-broken bound." msgstr "Se está solicitando un relleno de límite cortado en un límite que no está cortado." -#: hairpin.cc:256 +#: hairpin.cc:257 msgid "decrescendo too small" msgstr "decrescendo demasiado pequeño" @@ -2103,7 +2108,7 @@ msgstr "se suprime el guión separador sin terminación" msgid "unterminated hyphen; removing" msgstr "guión separador sin terminar; se suprime" -#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108 +#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108 #, c-format msgid "cannot find file: `%s'" msgstr "no se encuentra el archivo: «%s»" @@ -2113,11 +2118,11 @@ msgstr "no se encuentra el archivo: «%s»" msgid "(search path: `%s')" msgstr "(ruta de búsqueda: «%s»)" -#: input.cc:138 source-file.cc:178 source-file.cc:193 +#: input.cc:138 source-file.cc:180 source-file.cc:195 msgid "position unknown" msgstr "posición desconocida" -#: key-engraver.cc:198 +#: key-engraver.cc:197 msgid "Incomplete keyAlterationOrder for key signature" msgstr "keyAlterationOrder incompleto para la armadura" @@ -2159,21 +2164,21 @@ msgstr "se ignora el silencio: la ligadura no puede contener silencios" msgid "ligature was started here" msgstr "la ligadura comenzó aquí" -#: lily-guile.cc:93 +#: lily-guile.cc:94 #, c-format msgid "(load path: `%s')" msgstr "(ruta de carga: «%s»)" -#: lily-guile.cc:412 +#: lily-guile.cc:413 #, c-format msgid "cannot find property type-check for `%s' (%s)." msgstr "no se encuentra la comprobación de tipo de propiedad para «%s» (%s)." -#: lily-guile.cc:415 +#: lily-guile.cc:416 msgid "perhaps a typing error?" msgstr "¿quizá es un error de tecleo?" -#: lily-guile.cc:422 +#: lily-guile.cc:423 msgid "skipping assignment" msgstr "se salta la asignación" @@ -2182,20 +2187,33 @@ msgstr "se salta la asignación" msgid "type check for `%s' failed; value `%s' must be of type `%s'" msgstr "ha fallado la comprobación de tipo para «%s»; el valor «%s» debe ser del tipo «%s»" -#: lily-lexer.cc:249 +#. Uh oh. unsmob delivered 0, yet +#. unsmob delivers true. This means that unsmob is a +#. matching check from a base class of T, but var is of an +#. incompatible derived type. +#: lily-guile.cc:462 +msgid "Wrong kind of " +msgstr "Clase errónea de " + +#: lily-lexer.cc:251 msgid "include files are not allowed in safe mode" msgstr "no se permiten los archivos de inclusión en el modo seguro" -#: lily-lexer.cc:276 +#: lily-lexer.cc:278 #, c-format msgid "identifier name is a keyword: `%s'" msgstr "el nombre del identificativo es una palabra clave: «%s»" -#: lily-lexer.cc:297 lily-lexer.cc:310 +#: lily-lexer.cc:299 lily-lexer.cc:312 #, c-format msgid "%s:EOF" msgstr "%s:EOF" +#: lily-modules.cc:81 +#, c-format +msgid "Uninitialized variable `%s' in module (%s)" +msgstr "Variable «%s» no inicializada en el módulo (%s)" + #: lily-parser-scheme.cc:80 #, c-format msgid "Changing working directory to: `%s'" @@ -2216,37 +2234,33 @@ msgstr "no se encuentra el archivo de inicio: «%s»" msgid "Processing `%s'" msgstr "Procesando «%s»" -#: lily-parser-scheme.cc:209 +#: lily-parser-scheme.cc:210 msgid "ly:parser-parse-string is only valid with a new parser. Use ly:parser-include-string instead." msgstr "ly:parser-parse-string sólo es válido con un analizador nuevo. Use en su lugar ly:parser-include-string." -#: lily-parser-scheme.cc:240 +#: lily-parser-scheme.cc:241 msgid "ly:parse-string-expression is only valid with a new parser. Use ly:parser-include-string instead." msgstr "ly:parse-string-expression sólo es válido con un analizador nuevo. Use en su lugar ly:parser-include-string." -#: lily-parser.cc:107 +#: lily-parser.cc:106 msgid "Parsing..." msgstr "Analizando..." -#: lookup.cc:181 +#: lookup.cc:178 #, c-format msgid "Not drawing a box with negative dimension, %.2f by %.2f." msgstr "No se dibuja el rectángulo con dimensiones negativas, %.2f por %.2f." -#: lyric-combine-music-iterator.cc:199 +#: lyric-combine-music-iterator.cc:204 msgid "argument of \\lyricsto should contain Lyrics context" msgstr "El argumento de \\lyricsto debe contener un contexto Lyrics" -#: lyric-combine-music-iterator.cc:337 +#: lyric-combine-music-iterator.cc:344 #, c-format -msgid "cannot find Voice `%s'" -msgstr "no se encuentra la Voz «%s»" +msgid "cannot find %s `%s'" +msgstr "No se encuentra %s «%s»" -#: lyric-engraver.cc:186 -msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." -msgstr "La sílaba de la letra no tiene nota. Utilice \\lyricsto o associatedVoice." - -#: main.cc:104 +#: main.cc:106 #, c-format msgid "" "This program is free software. It is covered by the GNU General Public\n" @@ -2259,7 +2273,7 @@ msgstr "" "él bajo ciertas condiciones. Invóquelo como `%s --warranty' para obtener\n" "más información.\n" -#: main.cc:110 +#: main.cc:112 msgid "" " This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License as \n" @@ -2307,11 +2321,11 @@ msgstr "" "escriba a la Free Software Foundation, Inc.,\n" "59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n" -#: main.cc:148 +#: main.cc:150 msgid "SYM[=VAL]" msgstr "SÍMBOLO[=VALOR]" -#: main.cc:149 +#: main.cc:151 msgid "" "set Scheme option SYM to VAL (default: #t).\n" "Use -dhelp for help." @@ -2319,41 +2333,45 @@ msgstr "" "establecer la opción de Scheme SÍMBOLO a VALOR (por omisión: #t).\n" "Use -dhelp para obtener ayuda." -#: main.cc:153 +#: main.cc:155 msgid "EXPR" msgstr "EXPRESIÓN" -#: main.cc:153 +#: main.cc:155 msgid "evaluate scheme code" msgstr "evaluar código de Scheme" #. Bug in option parser: --output =foe is taken as an abbreviation #. for --output-format. -#: main.cc:156 +#: main.cc:158 msgid "FORMATs" msgstr "FORMATOs" -#: main.cc:156 +#: main.cc:158 msgid "dump FORMAT,... Also as separate options:" msgstr "volcar FORMATO,... También como opciones separadas:" -#: main.cc:157 +#: main.cc:159 msgid "generate PDF (default)" msgstr "generar un PDF (predeterminado)" -#: main.cc:158 +#: main.cc:160 msgid "generate PNG" msgstr "generar un PNG" -#: main.cc:159 +#: main.cc:161 msgid "generate PostScript" msgstr "generar un PostScript" #: main.cc:162 +msgid "generate big PDF files" +msgstr "generar archivos PDF grandes" + +#: main.cc:165 msgid "FIELD" msgstr "CAMPO" -#: main.cc:162 +#: main.cc:165 msgid "" "dump header field FIELD to file\n" "named BASENAME.FIELD" @@ -2361,19 +2379,19 @@ msgstr "" "volcar el campo de cabecera CAMPO a un archivo\n" "llamado NOMBRE_BASE.CAMPO" -#: main.cc:165 +#: main.cc:168 msgid "add DIR to search path" msgstr "añadir DIRECTORIO a la ruta de búsqueda" -#: main.cc:166 +#: main.cc:169 msgid "use FILE as init file" msgstr "usar ARCHIVO como archivo de inicialización" -#: main.cc:169 +#: main.cc:172 msgid "USER, GROUP, JAIL, DIR" msgstr "USUARIO, GRUPO, JAULA, DIRECTORIO" -#: main.cc:169 +#: main.cc:172 msgid "" "chroot to JAIL, become USER:GROUP\n" "and cd into DIR" @@ -2381,7 +2399,7 @@ msgstr "" "chroot a JAULA, convertirse en USUARIO:GRUPO\n" "y cd al DIRECTORIO" -#: main.cc:174 +#: main.cc:177 msgid "" "print log messages according to LOGLEVEL. Possible values are:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG." @@ -2391,24 +2409,24 @@ msgstr "" "PROGRESS (mostrar avance), INFO (información; predeterminado)\n" "y DEBUG (depuración)." -#: main.cc:178 +#: main.cc:181 msgid "write output to FILE (suffix will be added)" msgstr "escribir la salida en el ARCHIVO (se añadirá el sufijo)" -#: main.cc:179 +#: main.cc:182 msgid "relocate using directory of lilypond program" msgstr "relocalizar utilizando el directorio del programa lilypond" -#: main.cc:180 +#: main.cc:183 msgid "no progress, only error messages (equivalent to loglevel=ERROR)" msgstr "sin información del avance; sólo mensajes de error (equivale a loglevel=ERROR)" -#: main.cc:182 +#: main.cc:185 msgid "be verbose (equivalent to loglevel=DEBUG)" msgstr "ser prolijo (equivale a loglevel=DEBUG)" #. Do not update the copyright years here, run `make grand-replace' -#: main.cc:261 +#: main.cc:264 #, c-format msgid "" "Copyright (c) %s by\n" @@ -2418,84 +2436,84 @@ msgstr "" "%s y otros." #. No version number or newline here. It confuses help2man. -#: main.cc:299 +#: main.cc:302 #, c-format msgid "Usage: %s [OPTION]... FILE..." msgstr "Uso: %s [OPCIÓN]... ARCHIVO..." -#: main.cc:301 +#: main.cc:304 msgid "Typeset music and/or produce MIDI from FILE." msgstr "Componer tipográficamente la música y/o producir MIDI a partir de ARCHIVO." -#: main.cc:303 +#: main.cc:306 msgid "LilyPond produces beautiful music notation." msgstr "LilyPond produce una notación musical bella y hermosa." -#: main.cc:305 +#: main.cc:308 #, c-format msgid "For more information, see %s" msgstr "Para ver más información, consulte %s" -#: main.cc:307 +#: main.cc:310 msgid "Options:" msgstr "Opciones:" -#: main.cc:374 +#: main.cc:377 #, c-format msgid "expected %d arguments with jail, found: %u" msgstr "se esperaban %d argumentos con la jaula, se han encontrado: %u" -#: main.cc:388 +#: main.cc:391 #, c-format msgid "no such user: %s" msgstr "no existe el usuario %s" -#: main.cc:390 +#: main.cc:393 #, c-format msgid "cannot get user id from user name: %s: %s" msgstr "no se puede obtener el identificador de usuario a partir del nombre: %s: %s" -#: main.cc:405 +#: main.cc:408 #, c-format msgid "no such group: %s" msgstr "no existe este grupo: %s" -#: main.cc:407 +#: main.cc:410 #, c-format msgid "cannot get group id from group name: %s: %s" msgstr "no se puede obtener el id de grupo a partir del nombre: %s: %s" -#: main.cc:415 +#: main.cc:418 #, c-format msgid "cannot chroot to: %s: %s" msgstr "no se puede hacer chroot a: %s: %s" -#: main.cc:422 +#: main.cc:425 #, c-format msgid "cannot change group id to: %d: %s" msgstr "no se puede cambiar el grupo del usuario a %d: %s" -#: main.cc:428 +#: main.cc:431 #, c-format msgid "cannot change user id to: %d: %s" msgstr "no se puede cambiar el identificador de usuario a %d: %s" -#: main.cc:434 +#: main.cc:437 #, c-format msgid "cannot change working directory to: %s: %s" msgstr "no se puede cambiar el directorio de trabajo a: %s: %s" -#: main.cc:805 +#: main.cc:826 #, c-format msgid "exception caught: %s" msgstr "se ha capturado una excepción: %s" #. FIXME: constant error message. -#: mark-engraver.cc:156 +#: mark-engraver.cc:150 msgid "rehearsalMark must have integer value" msgstr "rehearsalMark debe tener un valor entero" -#: mark-engraver.cc:162 +#: mark-engraver.cc:156 msgid "mark label must be a markup object" msgstr "la etiqueta de marcado debe ser un objeto de marcado" @@ -2547,7 +2565,7 @@ msgstr "" msgid "unexpected case fall-through" msgstr "opción de caso por defecto inesperada" -#: midi-control-function-performer.cc:109 staff-performer.cc:152 +#: midi-control-function-performer.cc:107 staff-performer.cc:153 #, c-format msgid "ignoring out-of-range value change for MIDI property `%s'" msgstr "se ignora el cambio de valor fuera de rango para la propiedad MIDI «%s»" @@ -2571,7 +2589,7 @@ msgstr "no se puede abrir el archivo en modo de escritura: %s: %s" msgid "cannot write to file: `%s'" msgstr "no se puede escribir el archivo: «%s»" -#: minimal-page-breaking.cc:40 paper-score.cc:122 +#: minimal-page-breaking.cc:40 paper-score.cc:116 msgid "Calculating line breaks..." msgstr "Calculando los saltos de línea..." @@ -2579,28 +2597,15 @@ msgstr "Calculando los saltos de línea..." msgid "Calculating page breaks..." msgstr "Calculando saltos de página..." -#: multi-measure-rest.cc:154 +#: multi-measure-rest.cc:152 msgid "usable-duration-logs must be a non-empty list. Falling back to whole rests." msgstr "usable-duration-logs debe ser una lista no vacía. Se usan por defecto silencios de redonda." -#: multi-measure-rest.cc:364 -msgid "Using naive multi measure rest spacing." -msgstr "Utilizando espaciado ingenuo de silencios multicompás." - #: music.cc:150 #, c-format msgid "octave check failed; expected \"%s\", found: \"%s\"" msgstr "fallo en la comprobación de octava; se esperaba \"%s\", se ha encontrado: \"%s\"" -#: music.cc:219 -msgid "(normalized pitch)" -msgstr "(altura normalizada)" - -#: music.cc:223 -#, c-format -msgid "Transposing %s by %s makes alteration larger than double" -msgstr "La transposición de %s en %s produce una alteración más que doble" - #: new-fingering-engraver.cc:113 msgid "cannot add text scripts to individual note heads" msgstr "no se pueden añadir guiones de texto a cabezas de nota individuales" @@ -2613,11 +2618,11 @@ msgstr "no se ha encontrado ninguna ubicación válida para las digitaciones" msgid "placing below" msgstr "se coloca debajo" -#: note-collision.cc:497 -msgid "ignoring too many clashing note columns" -msgstr "demasiadas columnas de notas que chocan entre sí; se ignoran" +#: note-collision.cc:510 +msgid "this Voice needs a \\voiceXx or \\shiftXx setting" +msgstr "esta voz necesita un ajuste de \\voiceXx o de \\shiftXx" -#: note-column.cc:147 +#: note-column.cc:150 msgid "cannot have note heads and rests together on a stem" msgstr "no se pueden tener cabezas de nota y silencios en la misma plica" @@ -2645,22 +2650,22 @@ msgstr "no se puede cargar la tabla de tipografías: %s" msgid "FreeType error: %s" msgstr "error de FreeType: %s" -#: open-type-font.cc:111 +#: open-type-font.cc:115 #, c-format msgid "unsupported font format: %s" msgstr "formato de tipografía %s no soportado" -#: open-type-font.cc:113 +#: open-type-font.cc:117 #, c-format msgid "error reading font file %s: %s" msgstr "error al leer la tipografía %s: %s" -#: open-type-font.cc:188 +#: open-type-font.cc:192 #, c-format msgid "FT_Get_Glyph_Name () Freetype error: %s" msgstr "error de Freetype en FT_Get_Glyph_Name (): %s" -#: open-type-font.cc:336 pango-font.cc:256 +#: open-type-font.cc:340 pango-font.cc:258 #, c-format msgid "FT_Get_Glyph_Name () error: %s" msgstr "error en FT_Get_Glyph_Name (): %s" @@ -2698,93 +2703,94 @@ msgstr "probando %d sistemas" msgid "best score for this sys-count: %f" msgstr "mejor puntuación para este número de sistemas: %f" -#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:248 -#: paper-score.cc:162 +#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249 +#: paper-score.cc:156 msgid "Drawing systems..." msgstr "Dibujando los sistemas..." -#: output-def.cc:235 +#: output-def.cc:229 msgid "margins do not fit with line-width, setting default values" msgstr "los márgenes no caben en este ancho de línea, fijando valores predeterminados" -#: output-def.cc:242 +#: output-def.cc:236 msgid "systems run off the page due to improper paper settings, setting default values" msgstr "los sistemas se salen de la página a causa de unos ajustes del papel inadecuados, fijando valores predeterminados" -#: page-breaking.cc:277 +#: page-breaking.cc:276 msgid "ignoring min-systems-per-page and max-systems-per-page because systems-per-page was set" msgstr "se ignoran min-systems-per-page y max-systems-per-page debido a que se fijó systems-per-page" -#: page-breaking.cc:282 +#: page-breaking.cc:281 msgid "min-systems-per-page is larger than max-systems-per-page, ignoring both values" msgstr "min-systems-per-page es mayor que max-systems-per-page, se ignoran los dos valores" -#: page-layout-problem.cc:402 +#: page-breaking.cc:636 +#, c-format +msgid "page %d has been compressed" +msgstr "la página %d ha resultado comprimida" + +#: page-layout-problem.cc:400 msgid "A page layout problem has been initiated that cannot accommodate footnotes." msgstr "Ha tenido lugar problema de disposición de página que no puede acomodar notas al pie." -#: page-layout-problem.cc:731 -msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" -msgstr "la música no cabe en la página: se ha solicitado la no justificación del espaciado, pero la página ha resultado comprimida" +#: page-layout-problem.cc:729 +msgid "ragged-bottom was specified, but page must be compressed" +msgstr "se ha especificado ragged-bottom, pero la página debe comprimirse" -#: page-layout-problem.cc:734 +#: page-layout-problem.cc:732 #, c-format -msgid "cannot fit music on page: overflow is %f" -msgstr "la música no cabe en la página: el exceso es %f" +msgid "compressing over-full page by %.1f staff-spaces" +msgstr "se comprime la página desbordada en %.1f espacios de pentagrama" -#: page-layout-problem.cc:736 -msgid "compressing music to fit" -msgstr "comprimiendo la música para que quepa" - -#: page-layout-problem.cc:1199 +#: page-layout-problem.cc:1197 msgid "staff-affinities should only decrease" msgstr "staff-affinities solo debe disminuir" -#: page-turn-page-breaking.cc:168 +#: page-turn-page-breaking.cc:169 #, c-format msgid "page-turn-page-breaking: breaking from %d to %d" msgstr "page-turn-page-breaking: saltando desde %d hasta %d" -#: page-turn-page-breaking.cc:217 +#: page-turn-page-breaking.cc:218 msgid "cannot fit the first page turn onto a single page. Consider setting first-page-number to an even number." msgstr "no se puede ajustar la primera vuelta de página en una página única. Considere la posibilidad de establecer first-page-number a un número par." -#: page-turn-page-breaking.cc:230 +#: page-turn-page-breaking.cc:231 #, c-format msgid "Calculating page and line breaks (%d possible page breaks)..." msgstr "Calculando los saltos de página y de línea (%d saltos de página posibles)..." -#: page-turn-page-breaking.cc:300 +#: page-turn-page-breaking.cc:301 #, c-format msgid "break starting at page %d" msgstr "el salto comienza en la página %d" -#: page-turn-page-breaking.cc:301 +#: page-turn-page-breaking.cc:302 #, c-format msgid "\tdemerits: %f" msgstr "\tpuntuación: %f" -#: page-turn-page-breaking.cc:302 +#: page-turn-page-breaking.cc:303 #, c-format msgid "\tsystem count: %d" msgstr "número total de \tsistemas: %d" -#: page-turn-page-breaking.cc:303 +#: page-turn-page-breaking.cc:304 #, c-format msgid "\tpage count: %d" msgstr "número total de \tpáginas: %d" -#: page-turn-page-breaking.cc:304 +#: page-turn-page-breaking.cc:305 #, c-format msgid "\tprevious break: %d" msgstr "\tsalto anterior: %d" -#: pango-font.cc:245 +#: pango-font.cc:247 #, c-format msgid "no glyph for character U+%0X in font `%s'" -msgstr "no hay ningún glifo para el carácter U+%0X dentro de la tipografía `%s'" +msgstr "no hay ningún glifo para el carácter U+%0X dentro de la tipografía «%s»" -#: pango-font.cc:272 +#: pango-font.cc:274 #, c-format msgid "" "Glyph has no name, but font supports glyph naming.\n" @@ -2793,24 +2799,24 @@ msgstr "" "El glifo no tiene nombre, pero la tipografía soporta nombres de glifo.\n" "Se salta el glifo U+%0X, archivo %s" -#: pango-font.cc:322 +#: pango-font.cc:324 #, c-format msgid "no PostScript font name for font `%s'" msgstr "no hay un nombre de tipografía PostScript para «%s»" -#: pango-font.cc:372 +#: pango-font.cc:374 msgid "FreeType face has no PostScript font name" msgstr "El tipo FreeType no tiene un nombre de tipografía PostScript" -#: paper-book.cc:214 +#: paper-book.cc:200 #, c-format msgid "program option -dprint-pages not supported by backend `%s'" -msgstr "la opción de programa -dprint-pages no está contemplada por el backend `%s'" +msgstr "la opción de programa -dprint-pages no está contemplada por el backend «%s»" -#: paper-book.cc:233 +#: paper-book.cc:219 #, c-format msgid "program option -dpreview not supported by backend `%s'" -msgstr "la opción de programa -dpreview no está contemplada por el backend `%s'" +msgstr "la opción de programa -dpreview no está contemplada por el backend «%s»" #: paper-column-engraver.cc:263 msgid "forced break was overridden by some other event, should you be using bar checks?" @@ -2821,37 +2827,33 @@ msgstr "el salto forzado ha sido sobreestablecido por algún otro evento, ¿quiz msgid "Layout output to `%s'..." msgstr "Salida de la página hacia «%s»..." -#: paper-score.cc:134 +#: paper-score.cc:128 #, c-format msgid "Element count %d (spanners %d) " msgstr "Cantidad de elementos: %d (trazadores: %d)" -#: paper-score.cc:138 +#: paper-score.cc:132 msgid "Preprocessing graphical objects..." msgstr "Preprocesando los objetos gráficos..." -#: parse-scm.cc:121 +#: parse-scm.cc:124 msgid "GUILE signaled an error for the expression beginning here" msgstr "GUILE ha señalado un error para la expresión que comienza aquí" -#: partial-iterator.cc:45 -msgid "trying to use \\partial after the start of a piece" -msgstr "intento de utilizar \\partial después del inicio de la pieza" - #: pdf-scheme.cc:65 #, c-format msgid "Conversion of string `%s' to UTF-16be failed: %s" -msgstr "La conversión de la cadena `%s' a UTF-16be ha fallado: %s" +msgstr "La conversión de la cadena «%s» a UTF-16be ha fallado: %s" -#: percent-repeat-engraver.cc:147 +#: percent-repeat-engraver.cc:148 msgid "unterminated percent repeat" msgstr "repetición de porcentaje sin terminar" -#: performance.cc:54 +#: performance.cc:76 msgid "Track..." msgstr "Pista..." -#: performance.cc:82 +#: performance.cc:126 #, c-format msgid "MIDI output to `%s'..." msgstr "Salida MIDI hacia «%s»..." @@ -2877,7 +2879,7 @@ msgstr "no se encuentra el comienzo del corchete de pedal de piano «%s»" msgid "no such internal option: %s" msgstr "no existe la opción interna %s" -#: property-iterator.cc:100 +#: property-iterator.cc:115 #, c-format msgid "not a grob name, `%s'" msgstr "no es un nombre de objeto gráfico: «%s»" @@ -2886,25 +2888,25 @@ msgstr "no es un nombre de objeto gráfico: «%s»" msgid "Failed octave check, got: " msgstr "La comprobación de octaba ha fallado, se ha obtenido: " -#: relocate.cc:52 +#: relocate.cc:56 #, c-format msgid "Setting %s to %s" msgstr "Se establece %s a %s" #. this warning should only be printed in debug mode! -#: relocate.cc:73 +#: relocate.cc:77 #, c-format msgid "no such file: %s for %s" msgstr "no existe el archivo: %s para %s" #. this warning should only be printed in debug mode! #. this warning should only be printed in debug mode -#: relocate.cc:84 relocate.cc:102 +#: relocate.cc:88 relocate.cc:106 #, c-format msgid "no such directory: %s for %s" msgstr "no existe este directorio: %s para %s" -#: relocate.cc:93 +#: relocate.cc:97 #, c-format msgid "%s=%s (prepend)\n" msgstr "%s=%s (prefijar)\n" @@ -2934,7 +2936,7 @@ msgstr "Relocalización: es absoluto: argv0=%s\n" msgid "Relocation : from cwd: argv0=%s\n" msgstr "Relocalización: desde cwd: argv0=%s\n" -#: relocate.cc:194 +#: relocate.cc:196 #, c-format msgid "" "Relocation: from PATH=%s\n" @@ -2943,69 +2945,65 @@ msgstr "" "Relocalización: desde PATH=%s\n" "argv0=%s\n" -#: relocate.cc:220 +#: relocate.cc:222 msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR" msgstr "LILYPONDPREFIX está obsoleto, utilice LILYPOND_DATADIR" -#: relocate.cc:345 +#: relocate.cc:347 #, c-format msgid "Relocation file: %s" msgstr "Archivo de relocalización: %s" -#: relocate.cc:349 source-file.cc:65 +#: relocate.cc:351 source-file.cc:65 #, c-format msgid "cannot open file: `%s'" msgstr "no se puede abrir el archivo: «%s»" -#: relocate.cc:379 +#: relocate.cc:381 #, c-format msgid "Unknown relocation command %s" msgstr "instrucción de relocalización %s desconocida" -#: rest-collision-engraver.cc:70 -msgid "rhythmic head is not part of a rhythmic column" -msgstr "la cabeza rítmica no es parte de una columna rítmica" - -#: rest-collision.cc:150 +#: rest-collision.cc:154 msgid "cannot resolve rest collision: rest direction not set" msgstr "no se puede resolver la colisión de los silencios: la dirección de los silencios no se ha establecido" -#: rest-collision.cc:161 rest-collision.cc:270 +#: rest-collision.cc:165 rest-collision.cc:274 msgid "too many colliding rests" msgstr "demasiados silencios en colisión" -#: rest.cc:240 +#: rest.cc:239 #, c-format msgid "rest `%s' not found" msgstr "no se ha encontrado el silencio «%s»" -#: score-engraver.cc:78 +#: score-engraver.cc:77 #, c-format msgid "cannot find `%s'" msgstr "No se encuentra «%s»" -#: score-engraver.cc:80 +#: score-engraver.cc:79 msgid "Music font has not been installed properly." msgstr "La tipografía de música no se ha instalado correctamente." -#: score-engraver.cc:82 +#: score-engraver.cc:81 #, c-format msgid "Search path `%s'" msgstr "Ruta de búsqueda «%s»" -#: score-engraver.cc:84 +#: score-engraver.cc:83 msgid "Aborting" msgstr "Se detiene la ejecución" -#: score.cc:172 +#: score.cc:161 msgid "already have music in score" msgstr "ya tiene música en la partitura" -#: score.cc:173 +#: score.cc:163 msgid "this is the previous music" msgstr "esta es la música precedente" -#: score.cc:178 +#: score.cc:169 msgid "errors found, ignoring music expression" msgstr "se han encontrado errores, se ignora la expresión musical" @@ -3018,7 +3016,7 @@ msgstr "no sabemos cómo interpretar la articulación:" msgid " scheme encoding: " msgstr " codificación de Scheme: " -#: skyline-pair.cc:160 +#: skyline-pair.cc:135 msgid "direction must not be CENTER in ly:skyline-pair::skyline" msgstr "la dirección no puede ser CENTER en ly:skyline-pair::skyline" @@ -3044,7 +3042,7 @@ msgstr "%s sin causa" msgid "cannot end %s" msgstr "no se puede terminar %s" -#: slur.cc:434 +#: slur.cc:436 #, c-format msgid "Ignoring grob for slur: %s. avoid-slur not set?" msgstr "Se ignora el objeto gráfico para la ligadura: %s. ¿No está establecido avoid-slur?" @@ -3062,16 +3060,16 @@ msgstr "ha dado la vuelta el número de canal MIDI" msgid "remapping modulo 16" msgstr "se reasigna módulo 16" -#: stem-engraver.cc:110 +#: stem-engraver.cc:100 msgid "tremolo duration is too long" msgstr "la duración del trémolo es demasiado larga" -#: stem-engraver.cc:162 +#: stem-engraver.cc:152 #, c-format msgid "adding note head to incompatible stem (type = %d/%d)" msgstr "añadiendo cabeza de nota a una plica incompatible (tipo = %d/%d)" -#: stem-engraver.cc:165 +#: stem-engraver.cc:155 msgid "maybe input should specify polyphonic voices" msgstr "quizá la entrada debiera especificar voces polifónicas" @@ -3079,24 +3077,18 @@ msgstr "quizá la entrada debiera especificar voces polifónicas" msgid "weird stem size, check for narrow beams" msgstr "tamaño de plica extraño, compruebe que no haya barras estrechas" -#: system.cc:201 +#: system.cc:202 #, c-format msgid "Element count %d" msgstr "Número total de elementos %d" -#: system.cc:512 +#: system.cc:513 #, c-format msgid "Grob count %d" msgstr "Número de objetos gráficos: %d" #. TODO: Also print the arguments of the markup! -#: text-interface.cc:129 -#, c-format -msgid "Cyclic markup detected: %s" -msgstr "Se ha detectado un elemento de marcado cílcico: %s" - -#. TODO: Also print the arguments of the markup! -#: text-interface.cc:142 +#: text-interface.cc:139 #, c-format msgid "Markup depth exceeds maximal value of %d; Markup: %s" msgstr "La profundidad del marcado supera el valor máximo de %d; Elemento de marcado: %s" @@ -3113,11 +3105,11 @@ msgstr "ya hay un trazador de texto" msgid "unterminated text spanner" msgstr "trazador de texto sin terminar" -#: tie-engraver.cc:119 +#: tie-engraver.cc:121 msgid "unterminated tie" msgstr "ligadura de unión sin terminar" -#: tie-engraver.cc:353 +#: tie-engraver.cc:377 msgid "lonely tie" msgstr "ligadura de unión solitaria" @@ -3126,19 +3118,12 @@ msgstr "ligadura de unión solitaria" #. #. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. #. -#: time-signature-engraver.cc:75 +#: time-signature-engraver.cc:95 #, c-format msgid "strange time signature found: %d/%d" msgstr "se ha encontrado una indicación extraña de compás: %d/%d" -#. If there is no such symbol, we default to the numbered style. -#. (Here really with a warning!) -#: time-signature.cc:89 -#, c-format -msgid "time signature symbol `%s' not found; reverting to numbered style" -msgstr "no se encuentra el símbolo de compás «%s»; se vuelve al estilo numerado" - -#: translator-ctors.cc:65 +#: translator-ctors.cc:68 #, c-format msgid "unknown translator: `%s'" msgstr "traductor desconocido: «%s»" @@ -3148,17 +3133,17 @@ msgstr "traductor desconocido: «%s»" msgid "fatal error. Couldn't find type: %s" msgstr "error fatal. No se ha encontrado el tipo: %s" -#: translator-group.cc:188 +#: translator-group.cc:187 #, c-format msgid "cannot find: `%s'" msgstr "no se encuentra «%s»" -#: translator.cc:326 +#: translator.cc:310 #, c-format msgid "Two simultaneous %s events, junking this one" msgstr "Dos eventos %s simultáneos, se recorta éste" -#: translator.cc:327 +#: translator.cc:311 #, c-format msgid "Previous %s event here" msgstr "El evento %s previo está aquí" @@ -3166,7 +3151,7 @@ msgstr "El evento %s previo está aquí" #: ttf.cc:480 ttf.cc:528 #, c-format msgid "font index %d too large for font `%s', using index 0" -msgstr "índice de fuente tipográfica %d demasiado grande para la tipografía `%s', se usa el índice 0" +msgstr "índice de fuente tipográfica %d demasiado grande para la tipografía «%s», se usa el índice 0" #: ttf.cc:512 ttf.cc:562 msgid "font index must be non-negative, using index 0" @@ -3179,7 +3164,7 @@ msgstr "no hay ningún grupo especial que terminar" #: vaticana-ligature-engraver.cc:400 #, c-format msgid "ignored prefix(es) `%s' of this head according to restrictions of the selected ligature style" -msgstr "prefijo(s) `%s' de esta cabeza ignorado(s) de acuerdo a las restricciones del estilo de ligadura seleccionado" +msgstr "prefijo(s) «%s» de esta cabeza ignorado(s) de acuerdo a las restricciones del estilo de ligadura seleccionado" #: vaticana-ligature-engraver.cc:466 msgid "Ambiguous use of dots in ligature: there are multiple dotted notes with the same pitch. The ligature should be split." @@ -3224,206 +3209,215 @@ msgstr "ya hay un trazador finalizado" msgid "giving up" msgstr "abandonando" -#: parser.yy:158 parser.yy:172 -msgid "Too much lookahead" -msgstr "Lectura previa por delante excesiva" - -#: parser.yy:441 parser.yy:752 parser.yy:818 +#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248 msgid "bad expression type" msgstr "tipo de expresión incorrecto" -#: parser.yy:650 parser.yy:1159 +#: parser.yy:859 parser.yy:1458 parser.yy:1503 msgid "not a context mod" msgstr "no es un modificador de contexto" -#: parser.yy:853 -msgid "score expected" -msgstr "se esperaba «score»" +#: parser.yy:1054 +msgid "Missing music in \\score" +msgstr "No hay música dentro de \\score" -#: parser.yy:869 +#: parser.yy:1091 msgid "\\paper cannot be used in \\score, use \\layout instead" msgstr "no se puede usar \\paper dentro de \\score, utilice \\layout en su lugar" -#: parser.yy:893 +#: parser.yy:1126 +msgid "Spurious expression in \\score" +msgstr "Expresión espúrea en \\score" + +#: parser.yy:1156 msgid "need \\paper for paper block" msgstr "es necesario \\paper para el bloque 'paper'" -#: parser.yy:1033 parser.yy:1055 +#: parser.yy:1331 +msgid "music expected" +msgstr "se esperaba algo de música" + +#: parser.yy:1341 parser.yy:1375 msgid "unexpected post-event" msgstr "post-evento inseperado" -#: parser.yy:1063 +#: parser.yy:1383 msgid "Ignoring non-music expression" msgstr "Se ignora la expresión no musical" -#: parser.yy:1075 parser.yy:2493 -msgid "music expected" -msgstr "se esperaba algo de música" - -#: parser.yy:1370 +#: parser.yy:1691 msgid "not a symbol" msgstr "no es un símbolo" -#: parser.yy:2182 parser.yy:2296 parser.yy:2309 parser.yy:2318 +#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627 msgid "bad grob property path" msgstr "la ruta de la propiedad del grob no es válida" -#: parser.yy:2276 +#: parser.yy:2585 msgid "only \\consists and \\remove take non-string argument." msgstr "solo \\consists y \\remove admiten un argumento no de cadena." -#: parser.yy:2337 +#: parser.yy:2646 msgid "bad context property path" msgstr "la ruta de la propiedad de contexto no es válida" -#: parser.yy:2438 +#: parser.yy:2733 msgid "simple string expected" msgstr "se esperaba una cadena sencilla de caracteres" -#: parser.yy:2456 +#: parser.yy:2750 msgid "symbol expected" msgstr "se esperaba un símbolo" -#: parser.yy:2611 +#: parser.yy:2886 msgid "not a rhythmic event" msgstr "no es un evento rítmico" -#: parser.yy:2685 +#: parser.yy:2936 msgid "post-event expected" msgstr "se esperaba un post-evento" -#: parser.yy:2694 parser.yy:2699 +#: parser.yy:2945 parser.yy:2950 msgid "have to be in Lyric mode for lyrics" msgstr "para la letra se debe estar en el modo Lyric" -#: parser.yy:2767 -msgid "expecting string as script definition" -msgstr "se espera una cadena como definición del guión" +#: parser.yy:3026 +msgid "expecting string or post-event as script definition" +msgstr "se espera una cadena o un post-evento como definición del guión" -#: parser.yy:2875 +#: parser.yy:3130 msgid "not an articulation" msgstr "no es una articulación" -#: parser.yy:2947 parser.yy:2990 +#: parser.yy:3202 parser.yy:3245 msgid "not a duration" msgstr "no es una duración" -#: parser.yy:3007 +#: parser.yy:3266 msgid "bass number expected" msgstr "se esperaba un número de bajo" -#: parser.yy:3106 +#: parser.yy:3358 msgid "have to be in Note mode for notes" msgstr "para las notas se debe estar en el modo Note" -#: parser.yy:3166 +#: parser.yy:3397 msgid "have to be in Chord mode for chords" msgstr "para los acordes se debe estar en el modo Chord" -#: parser.yy:3181 +#: parser.yy:3440 msgid "markup outside of text script or \\lyricmode" msgstr "elemento de marcado fuera de elemento de texto o \\lyricmode" -#: parser.yy:3186 +#: parser.yy:3445 msgid "unrecognized string, not in text script or \\lyricmode" msgstr "cadena no reconocida, no está dentro de un elemento de texto o \\lyricmode" -#: parser.yy:3347 parser.yy:3356 +#: parser.yy:3597 parser.yy:3606 msgid "not an unsigned integer" msgstr "no es un entero sin signo" -#: parser.yy:3424 +#: parser.yy:3693 msgid "not a markup" msgstr "no es una instrucción de marcado" # stray? -#: lexer.ll:224 +#: lexer.ll:193 msgid "stray UTF-8 BOM encountered" msgstr "se ha encontrado una marca BOM de UTF-8 extraña" -#: lexer.ll:227 +#: lexer.ll:196 msgid "Skipping UTF-8 BOM" msgstr "Se salta el BOM de UTF-8" -#: lexer.ll:279 +#: lexer.ll:248 #, c-format msgid "Renaming input to: `%s'" msgstr "Renombrando la entrada a: «%s»" -#: lexer.ll:296 +#: lexer.ll:265 msgid "quoted string expected after \\version" msgstr "se esperaba una cadena entre comillas después de \\version" -#: lexer.ll:300 +#: lexer.ll:269 msgid "quoted string expected after \\sourcefilename" msgstr "se esperaba una cadena entre comillas después de \\sourcefilename" -#: lexer.ll:304 +#: lexer.ll:273 msgid "integer expected after \\sourcefileline" msgstr "se esperaba un entero después de \\sourcefileline" -#: lexer.ll:331 +#: lexer.ll:300 msgid "\\maininput not allowed outside init files" msgstr "no se permite \\maininput fuera de los archivos de inicio" -#: lexer.ll:355 +#: lexer.ll:324 #, c-format msgid "wrong or undefined identifier: `%s'" msgstr "identificativo equivocado o no definido: «%s»" -#: lexer.ll:381 +#: lexer.ll:349 msgid "string expected after \\include" msgstr "se esperaba una cadena después de \\include" -#: lexer.ll:391 +#: lexer.ll:359 msgid "end quote missing" msgstr "faltan las comillas de cierre" -#: lexer.ll:743 +#: lexer.ll:714 msgid "EOF found inside a comment" msgstr "se ha encontrado EOF (fin de archivo) dentro de un comentario" -#: lexer.ll:748 +#: lexer.ll:719 msgid "EOF found inside string" msgstr "se ha encontrado EOF (fin de archivo) dentro de una cadena de caracteres" -#: lexer.ll:763 +#: lexer.ll:734 msgid "Unfinished main input" msgstr "el código principal de entrada no ha finalizado" -#: lexer.ll:834 +#: lexer.ll:805 #, c-format msgid "invalid character: `%s'" msgstr "carácter no válido: «%s»" -#: lexer.ll:963 +#: lexer.ll:925 #, c-format msgid "unknown escaped string: `\\%s'" msgstr "cadena de escape desconocida: `\\%s'" -#: lexer.ll:983 +#: lexer.ll:945 #, c-format msgid "undefined character or shorthand: %s" msgstr "carácter o combinación abreviada no definida: %s" -#: lexer.ll:1275 +#: lexer.ll:1236 msgid "non-UTF-8 input" msgstr "la entrada no es UTF-8" -#: lexer.ll:1319 +#: lexer.ll:1280 +#, c-format +msgid "Invalid version string \"%s\"" +msgstr "Cadena de versión «%s» no válida" + +#: lexer.ll:1285 #, c-format msgid "file too old: %s (oldest supported: %s)" msgstr "archivo demasiado antiguo: %s (el más antiguo que se puede tratar es: %s)" -#: lexer.ll:1320 +#: lexer.ll:1286 msgid "consider updating the input with the convert-ly script" msgstr "considere la actualización de la entrada mediante el guión (script) convert-ly" -#: lexer.ll:1326 +#: lexer.ll:1292 #, c-format msgid "program too old: %s (file requires: %s)" msgstr "el programa es demasiado antiguo: %s (el archivo necesita: %s)" +#: auto-beam.scm:147 +msgid "Beam end fits no pattern" +msgstr "El final de barra no coincide con ningún patrón" + #: backend-library.scm:27 #, scheme-format msgid "Invoking `~a'..." @@ -3434,27 +3428,37 @@ msgstr "Invocando «~a»..." msgid "`~a' failed (~a)\n" msgstr "«~a» ha fallado (~a)\n" -#: backend-library.scm:93 +#: backend-library.scm:108 #, scheme-format msgid "Converting to `~a'...\n" msgstr "Convirtiendo en «~a»...\n" #. Do not try to guess the name of the png file, #. GS produces PNG files like BASE-page%d.png. -#: backend-library.scm:102 +#: backend-library.scm:118 #, scheme-format msgid "Converting to ~a..." msgstr "Convirtiendo en ~a..." -#: backend-library.scm:140 +#: backend-library.scm:134 +#, scheme-format +msgid "Copying to `~a'...\n" +msgstr "Copiando en «~a»...\n" + +#: backend-library.scm:200 +#, scheme-format +msgid "Deleting `~a'...\n" +msgstr "Suprimiendo «~a»...\n" + +#: backend-library.scm:219 #, scheme-format msgid "Writing header field `~a' to `~a'..." msgstr "Escribiendo el campo de encabezamiento «~a» en «~a»..." -#: backend-library.scm:189 +#: backend-library.scm:268 #, scheme-format msgid "missing stencil expression `~S'" -msgstr "falta la expresión del sello `~S'" +msgstr "falta la expresión del sello «~S»" #: bar-line.scm:133 #, scheme-format @@ -3492,154 +3496,145 @@ msgstr "Basurilla espúrea después del acorde: ~A" msgid "symbol ~S redefined" msgstr "redefinido el símbolo ~S" -#: define-event-classes.scm:73 +#: define-event-classes.scm:74 #, scheme-format msgid "unknown parent class `~a'" msgstr "Clase del padre «~a» desconocida" -#: define-event-classes.scm:107 +#: define-event-classes.scm:108 #, scheme-format msgid "Cannot redefine event class `~S'" msgstr "No se puede redefinir la clase de evento «~S»" -#: define-event-classes.scm:109 +#: define-event-classes.scm:110 #, scheme-format msgid "Undefined parent event class `~S'" msgstr "Clase de evento del padre «~S» no definida" -#: define-markup-commands.scm:1083 +#: define-markup-commands.scm:1098 msgid "no systems found in \\score markup, does it have a \\layout block?" msgstr "no se ha encontrado ningún sistema en el marcado \\score, ¿tiene un bloque \\layout?" -#: define-markup-commands.scm:2847 +#: define-markup-commands.scm:2922 #, scheme-format msgid "Cannot find glyph ~a" msgstr "No se encuentra el glifo ~a" -#: define-markup-commands.scm:3273 +#: define-markup-commands.scm:3398 #, scheme-format msgid "no brace found for point size ~S " msgstr "no se ha encontrado ninguna llave para el tamaño en puntos ~S " -#: define-markup-commands.scm:3274 +#: define-markup-commands.scm:3399 #, scheme-format msgid "defaulting to ~S pt" msgstr "fijando al valor predeterminado ~S pt" -#: define-markup-commands.scm:3526 +#: define-markup-commands.scm:3643 #, scheme-format msgid "not a valid duration string: ~a" msgstr "no es una cadena válida de duración: ~a" -#: define-markup-commands.scm:3737 +#: define-markup-commands.scm:3854 #, scheme-format msgid "not a valid duration string: ~a - ignoring" msgstr "no es una cadena válida de duración: ~a. Se ignora." -#: define-music-types.scm:792 +#: define-music-types.scm:803 #, scheme-format msgid "symbol expected: ~S" msgstr "se esperaba un símbolo: ~S" -#: define-music-types.scm:795 +#: define-music-types.scm:806 #, scheme-format msgid "cannot find music object: ~S" msgstr "no se encuentra el objeto musical ~S" -#: define-music-types.scm:815 +#: define-music-types.scm:826 #, scheme-format msgid "bad make-music argument: ~S" msgstr "argumento de make-music erróneo: ~S" -#: define-music-types.scm:827 -#, scheme-format -msgid "unknown repeat type `~S'" -msgstr "tipo de repetición «~S» desconocido" - -#: define-music-types.scm:828 -msgid "See define-music-types.scm for supported repeats" -msgstr "Consulte el archivo define-music-types.scm para ver los tipos de repetición soportados" - -#: define-note-names.scm:972 +#: define-note-names.scm:1000 msgid "Select note names language." msgstr "Seleccione el idioma para los nombres de las notas." -#: define-note-names.scm:978 +#: define-note-names.scm:1006 #, scheme-format msgid "Using `~a' note names..." -msgstr "Usando los nombres de notas de `~a' ..." +msgstr "Usando los nombres de notas de «~a»..." -#: define-note-names.scm:981 +#: define-note-names.scm:1009 #, scheme-format msgid "Could not find language `~a'. Ignoring." -msgstr "No se encuentra el idioma `~a'. Se ignora." +msgstr "No se encuentra el idioma «~a». Se ignora." -#: document-backend.scm:132 +#: document-backend.scm:135 #, scheme-format msgid "pair expected in doc ~s" msgstr "se esperaba una pareja en el documento ~s" -#: document-backend.scm:189 +#: document-backend.scm:202 #, scheme-format msgid "cannot find interface for property: ~S" msgstr "no se encuentra un interface para la propiedad ~S" -#: document-backend.scm:199 +#: document-backend.scm:212 #, scheme-format msgid "unknown Grob interface: ~S" msgstr "interfaz de Objeto gráfico desconocido: ~S" -#: documentation-lib.scm:59 +#: documentation-lib.scm:62 #, scheme-format msgid "Processing ~S..." msgstr "Procesando ~S..." -#: documentation-lib.scm:176 +#: documentation-lib.scm:178 #, scheme-format msgid "Writing ~S..." msgstr "Escribiendo ~S..." -#: documentation-lib.scm:188 +#: documentation-lib.scm:190 #, scheme-format msgid "cannot find description for property `~S' (~S)" -msgstr "no se encuentra la descripción de la propiedad `~S' (~S)" +msgstr "no se encuentra la descripción de la propiedad «~S» (~S)" -#: documentation-lib.scm:209 +#: documentation-lib.scm:211 #, scheme-format msgid "cannot find description for property ~S (~S)" msgstr "no se encuentra la descripción de la propiedad ~S (~S)" -#: flag-styles.scm:162 +#: flag-styles.scm:155 #, scheme-format msgid "flag stroke `~a' or `~a' not found" -msgstr "no se encuentra el impacto `~a' o `~a' de indicador" +msgstr "no se encuentra el trazo «~a» o «~a» del corchete" -#: framework-eps.scm:108 +#: framework-eps.scm:112 #, scheme-format msgid "Writing ~a..." msgstr "Escribiendo «~a»..." -#: framework-ps.scm:250 +#: framework-ps.scm:281 #, scheme-format msgid "cannot embed ~S=~S" msgstr "no se puede empotrar ~S=~S" -#: framework-ps.scm:293 +#: framework-ps.scm:324 #, scheme-format msgid "cannot extract file matching ~a from ~a" msgstr "no se puede extraer la coincidencia de archivos ~a a partir de ~a" -#: framework-ps.scm:311 +#: framework-ps.scm:342 #, scheme-format msgid "do not know how to embed ~S=~S" msgstr "no sabemos cómo empotrar ~S=~S" -#: framework-ps.scm:336 +#: framework-ps.scm:367 #, scheme-format msgid "do not know how to embed font ~s ~s ~s" msgstr "no sabemos cómo empotrar la tipografía ~s ~s ~s" -#: framework-ps.scm:687 +#: framework-ps.scm:723 msgid "" "\n" "The PostScript backend does not support the\n" @@ -3700,7 +3695,7 @@ msgstr "No se encuentra la definición de contexto \\~a" msgid "Music unsuitable for output-def" msgstr "Música no apta para output-def" -#: lily-library.scm:884 +#: lily-library.scm:904 msgid "" "Find the index between @var{start} and @var{end} (an integer)\n" "which produces the closest match to @var{target-val} if\n" @@ -3710,51 +3705,51 @@ msgstr "" "que produce la correspondencia más cercana a @var{target-val} cuando\n" "se aplica a la función @var{getter}." -#: lily-library.scm:955 +#: lily-library.scm:998 #, scheme-format msgid "unknown unit: ~S" msgstr "unidad desconocida: ~S " -#: lily-library.scm:980 +#: lily-library.scm:1023 #, scheme-format msgid "no \\version statement found, please add~afor future compatibility" msgstr "no se ha encontrado ninguna instrucción \\version, escriba~apara disponer de compatibilidad en el futuro" -#: lily.scm:75 +#: lily.scm:93 msgid "call-after-session used after session start" msgstr "call-after-session utilizado después del comienzo de la sesión" -#: lily.scm:93 +#: lily.scm:111 msgid "define-session used after session start" msgstr "define-session utilizado después del comienzo de la sesión" -#: lily.scm:393 +#: lily.scm:417 msgid "Using (ice-9 curried-definitions) module\n" msgstr "Utilizando el módulo (ice-9 curried-definitions)\n" -#: lily.scm:396 +#: lily.scm:420 msgid "Guile 1.8\n" msgstr "Guile 1.8\n" -#: lily.scm:455 +#: lily.scm:477 #, scheme-format msgid "cannot find: ~A" msgstr "no se encuentra: ~A" -#: lily.scm:878 +#: lily.scm:903 msgid "Success: compilation successfully completed" msgstr "Enhorabuena. La compilación se ha completado satisfactoriamente." -#: lily.scm:879 +#: lily.scm:904 msgid "Compilation completed with warnings or errors" msgstr "Compilación completada con advertencias o errores" -#: lily.scm:940 +#: lily.scm:965 #, scheme-format msgid "job ~a terminated with signal: ~a" msgstr "la tarea ~a ha terminado con la señal: ~a" -#: lily.scm:943 +#: lily.scm:968 #, scheme-format msgid "" "logfile ~a (exit ~a):\n" @@ -3763,36 +3758,31 @@ msgstr "" "archivo de registro ~a (salida ~a):\n" "~a" -#: lily.scm:965 lily.scm:1054 +#: lily.scm:990 lily.scm:1079 #, scheme-format msgid "failed files: ~S" msgstr "archivos que han fallado: ~S" -#: lily.scm:1045 +#: lily.scm:1070 #, scheme-format msgid "Redirecting output to ~a..." msgstr "Redirigiendo la salida hacia ~a..." -#: lily.scm:1064 ps-to-png.scm:66 +#: lily.scm:1089 #, scheme-format msgid "Invoking `~a'...\n" msgstr "Invocando «~a»...\n" -#: ly-syntax-constructors.scm:66 +#: ly-syntax-constructors.scm:27 #, scheme-format msgid "~a function cannot return ~a" msgstr "la función ~a no puede devolver ~a" -#: ly-syntax-constructors.scm:75 +#: ly-syntax-constructors.scm:60 #, scheme-format msgid "wrong type for argument ~a. Expecting ~a, found ~s" msgstr "tipo equivocado para el argumento ~a. Se esperaba ~a, se encontró ~s" -#: ly-syntax-constructors.scm:199 -#, scheme-format -msgid "Invalid property operation ~a" -msgstr "Operación de propiedad ~a inválida" - #: markup-macros.scm:331 #, scheme-format msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" @@ -3832,58 +3822,87 @@ msgstr "la nota a invertir no está en la escala; se ignora" msgid "negative replication count; ignoring" msgstr "número de replicaciones negativo; se ignora" -#: music-functions.scm:272 -msgid "More alternatives than repeats. Junking excess alternatives" -msgstr "Hay más alternativas que repeticiones. Se recortan las alternativas excedentes" - -#: music-functions.scm:303 +#: music-functions.scm:319 #, scheme-format msgid "invalid tremolo repeat count: ~a" msgstr "número de repeticiones no válido para el trémolo: ~a" -#: music-functions.scm:459 +#: music-functions.scm:348 +#, scheme-format +msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo" +msgstr "tipo de repetión «~S» desconocido: debería ser volta, unfold, percent, o tremolo" + +#: music-functions.scm:352 +msgid "More alternatives than repeats. Junking excess alternatives" +msgstr "Hay más alternativas que repeticiones. Se recortan las alternativas excedentes" + +#: music-functions.scm:487 #, scheme-format msgid "bad grob property path ~a" msgstr "la ruta de propiedad ~a del grob no es válida" -#: music-functions.scm:753 +#: music-functions.scm:511 +#, scheme-format +msgid "bad context property ~a" +msgstr "la propiedad de contexto ~a no es válida" + +#: music-functions.scm:534 +#, scheme-format +msgid "bad music property ~a" +msgstr "la propiedad musical ~a no es válida" + +#: music-functions.scm:840 msgid "Bad chord repetition" msgstr "repetición de acorde errónea" -#: music-functions.scm:788 +#: music-functions.scm:945 #, scheme-format msgid "music expected: ~S" msgstr "se esperaba algo de música: ~S" -#: music-functions.scm:1144 +#: music-functions.scm:1295 #, scheme-format msgid "cannot find quoted music: `~S'" msgstr "no se encuentra la música citada: «~S»" -#: music-functions.scm:1282 +#: music-functions.scm:1432 msgid "Add @var{octave-shift} to the octave of @var{pitch}." msgstr "Añadir @var{octave-shift} a la octava de @var{pitch}." -#: music-functions.scm:1342 +#: music-functions.scm:1495 #, scheme-format msgid "Unknown octaveness type: ~S " msgstr "Tipo de octavación desconocido: ~S " -#: music-functions.scm:1343 +#: music-functions.scm:1496 msgid "Defaulting to 'any-octave." msgstr "Fijando al valor predeterminado 'any-octave." -#: music-functions.scm:1688 +#: music-functions.scm:1888 #, scheme-format msgid "unknown accidental style: ~S" msgstr "estilo de alteración ~S desconocido" -#: output-ps.scm:278 output-svg.scm:539 +#: music-functions.scm:2098 +msgid "Missing duration" +msgstr "Falta la duración" + +#: music-functions.scm:2626 +#, scheme-format +msgid "not a symbol list: ~a" +msgstr "no es una lista de símbolos: ~a" + +#: music-functions.scm:2629 +#, scheme-format +msgid "conflicting tag group ~a" +msgstr "grupo de etiquetas ~a en conflicto" + +#: output-ps.scm:290 output-svg.scm:539 #, scheme-format msgid "unknown line-cap-style: ~S" msgstr "estilo de extremo de línea line-cap-style desconocido: ~S" -#: output-ps.scm:283 output-svg.scm:545 +#: output-ps.scm:295 output-svg.scm:545 #, scheme-format msgid "unknown line-join-style: ~S" msgstr "estilo de unión de líneas line-join-style desconocido: ~S" @@ -3902,89 +3921,94 @@ msgstr "El glifo debe tener un valor de Unicode" msgid "cannot find SVG font ~S" msgstr "no se encuentra la fuente tipográfica de SVG ~S" -#: paper.scm:120 +#: paper.scm:121 msgid "set-global-staff-size: not in toplevel scope" msgstr "set-global-staff-size: no está en el ámbito de nivel más alto" -#: paper.scm:320 +#: paper.scm:321 #, scheme-format msgid "This is not a \\layout {} object, ~S" msgstr "Esto no es un objeto de \\layout {} , ~S" -#: paper.scm:328 +#: paper.scm:329 #, scheme-format msgid "Unknown paper size: ~a" msgstr "Tamaño de papel desconocido: ~a" #. TODO: should raise (generic) exception with throw, and catch #. that in parse-scm.cc -#: paper.scm:347 +#: paper.scm:348 msgid "Must use #(set-paper-size .. ) within \\paper { ... }" msgstr "Debe usar #(set-paper-size .. ) dentro de \\paper { ... }" -#: parser-clef.scm:164 +#: parser-clef.scm:154 #, scheme-format msgid "unknown clef type `~a'" msgstr "tipo de clave desconocido: «~a» " -#: parser-clef.scm:165 +#: parser-clef.scm:155 #, scheme-format msgid "supported clefs: ~a" msgstr "claves soportadas: ~a" -#: parser-ly-from-scheme.scm:74 +#: parser-ly-from-scheme.scm:73 msgid "error in #{ ... #}" msgstr "error en #{ ... #}" -#: part-combiner.scm:598 +#: part-combiner.scm:894 #, scheme-format msgid "quoted music `~a' is empty" msgstr "la cita musical «~a» está vacía" -#: ps-to-png.scm:70 +#: ps-to-png.scm:72 ps-to-png.scm:75 #, scheme-format -msgid "~a exited with status: ~S" -msgstr "~a salió con el estado: ~S" +msgid "Copying `~a' to `~a'..." +msgstr "Copiando «~a» en «~a»..." + +#: ps-to-png.scm:77 ps-to-png.scm:79 +#, scheme-format +msgid "Deleting `~a'..." +msgstr "Suprimiendo «~a»..." #: to-xml.scm:190 #, scheme-format msgid "assertion failed: ~S" msgstr "el aserto no se cumple: ~S" -#: translation-functions.scm:368 +#: translation-functions.scm:389 #, scheme-format msgid "Negative fret for pitch ~a on string ~a" msgstr "Traste negativo para la nota ~a de la cuerda ~a" -#: translation-functions.scm:371 +#: translation-functions.scm:392 #, scheme-format msgid "Missing fret for pitch ~a on string ~a" msgstr "Falta el traste para la nota ~a de la cuerda ~a" -#: translation-functions.scm:414 +#: translation-functions.scm:435 #, scheme-format msgid "No open string for pitch ~a" msgstr "No hay cuerda al aire para la nota ~a" -#: translation-functions.scm:429 translation-functions.scm:441 +#: translation-functions.scm:450 translation-functions.scm:462 #, scheme-format msgid "Requested string for pitch requires negative fret: string ~a pitch ~a" msgstr "La cuerda solicitada para la nota requiere un traste negativo: cuerda ~a nota ~a" -#: translation-functions.scm:432 +#: translation-functions.scm:453 msgid "Ignoring string request and recalculating." msgstr "Se ignora la solicitud de cuerda; volviendo a calcular." -#: translation-functions.scm:444 +#: translation-functions.scm:465 msgid "Ignoring note in tablature." msgstr "Se ignora la nota en la tablatura." -#: translation-functions.scm:469 +#: translation-functions.scm:490 #, scheme-format msgid "No string for pitch ~a (given frets ~a)" msgstr "No hay ninguna cuerda para la nota ~a (dados los trastes ~a)" -#: translation-functions.scm:574 +#: translation-functions.scm:595 #, scheme-format msgid "" "No label for fret ~a (on string ~a);\n" @@ -3993,6 +4017,66 @@ msgstr "" "No hay ninguna etiqueta para el traste ~a (sobre la cuerda ~a);\n" "sólo se proporcionan etiquetas para los trastes ~a" +#~ msgid "cannot change, already in translator: %s" +#~ msgstr "no se puede cambiar, ya está dentro del traductor: %s" + +#~ msgid "cannot find Voice `%s'" +#~ msgstr "no se encuentra la Voz «%s»" + +#~ msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." +#~ msgstr "La sílaba de la letra no tiene nota. Utilice \\lyricsto o associatedVoice." + +#~ msgid "Using naive multi measure rest spacing." +#~ msgstr "Utilizando espaciado ingenuo de silencios multicompás." + +#~ msgid "(normalized pitch)" +#~ msgstr "(altura normalizada)" + +#~ msgid "Transposing %s by %s makes alteration larger than double" +#~ msgstr "La transposición de %s en %s produce una alteración más que doble" + +#~ msgid "ignoring too many clashing note columns" +#~ msgstr "demasiadas columnas de notas que chocan entre sí; se ignoran" + +#~ msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" +#~ msgstr "la música no cabe en la página: se ha solicitado la no justificación del espaciado, pero la página ha resultado comprimida" + +#~ msgid "cannot fit music on page: overflow is %f" +#~ msgstr "la música no cabe en la página: el exceso es %f" + +#~ msgid "compressing music to fit" +#~ msgstr "comprimiendo la música para que quepa" + +#~ msgid "trying to use \\partial after the start of a piece" +#~ msgstr "intento de utilizar \\partial después del inicio de la pieza" + +#~ msgid "rhythmic head is not part of a rhythmic column" +#~ msgstr "la cabeza rítmica no es parte de una columna rítmica" + +#~ msgid "Cyclic markup detected: %s" +#~ msgstr "Se ha detectado un elemento de marcado cílcico: %s" + +#~ msgid "time signature symbol `%s' not found; reverting to numbered style" +#~ msgstr "no se encuentra el símbolo de compás «%s»; se vuelve al estilo numerado" + +#~ msgid "Too much lookahead" +#~ msgstr "Lectura previa por delante excesiva" + +#~ msgid "score expected" +#~ msgstr "se esperaba «score»" + +#~ msgid "unknown repeat type `~S'" +#~ msgstr "tipo de repetición «~S» desconocido" + +#~ msgid "See define-music-types.scm for supported repeats" +#~ msgstr "Consulte el archivo define-music-types.scm para ver los tipos de repetición soportados" + +#~ msgid "Invalid property operation ~a" +#~ msgstr "Operación de propiedad ~a inválida" + +#~ msgid "~a exited with status: ~S" +#~ msgstr "~a salió con el estado: ~S" + #~ msgid "cannot find start of (de)crescendo" #~ msgstr "no se encuentra el comienzo del (de)crescendo" diff --git a/po/fr.po b/po/fr.po index a57aa8f398..fa700548d1 100644 --- a/po/fr.po +++ b/po/fr.po @@ -3,14 +3,14 @@ # French translation of GNU/lilypond - http//lilypond.org # Copyright © 2004 Free Software Foundation, Inc. # Michel Robitaille , 1996-2007. -# Jean-Charles Malahieude , 2007-2013 +# Jean-Charles Malahieude , 2007-2015 # msgid "" msgstr "" -"Project-Id-Version: lilypond 2.17.96\n" +"Project-Id-Version: lilypond 2.19.26\n" "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n" -"POT-Creation-Date: 2013-11-24 12:14+0000\n" -"PO-Revision-Date: 2013-11-27 19:16+0100\n" +"POT-Creation-Date: 2015-08-27 10:48+0100\n" +"PO-Revision-Date: 2015-08-31 18:53+0200\n" "Last-Translator: Jean-Charles Malahieude \n" "Language-Team: French \n" "Language: fr\n" @@ -39,11 +39,11 @@ msgstr "" "Traitement par « %s » du fichier « %s »\n" " pour déterminer la mise en page par défaut.\n" -#: book_latex.py:212 book_texinfo.py:228 +#: book_latex.py:219 book_texinfo.py:228 msgid "Unable to auto-detect default settings:\n" msgstr "Impossible de détecter automatiquement les réglages par défaut :\n" -#: book_latex.py:224 book_texinfo.py:240 +#: book_latex.py:231 book_texinfo.py:240 #, python-format msgid "" "Unable to auto-detect default settings:\n" @@ -52,7 +52,7 @@ msgstr "" "Impossible de détecter automatiquement les réglages par défaut :\n" "%s" -#: book_latex.py:247 +#: book_latex.py:254 msgid "cannot detect textwidth from LaTeX" msgstr "impossible d'extraire la largeur du texte à partir de LaTeX" @@ -86,31 +86,31 @@ msgstr "option ly inconnue et ignorée : %s" msgid "Missing files: %s" msgstr "Fichier absent : %s" -#: book_snippets.py:651 +#: book_snippets.py:661 #, python-format msgid "Could not overwrite file %s" msgstr "Impossible d'écraser le fichier « %s »" -#: book_snippets.py:738 +#: book_snippets.py:748 #, python-format msgid "Running through filter `%s'" msgstr "Passage par le filtre « %s »" -#: book_snippets.py:759 +#: book_snippets.py:769 #, python-format msgid "`%s' failed (%d)" msgstr "« %s » a échoué (%d)" -#: book_snippets.py:760 +#: book_snippets.py:770 msgid "The error log is as follows:" msgstr "Voici le journal d'erreurs :" -#: book_snippets.py:880 +#: book_snippets.py:890 #, python-format msgid "Converting MusicXML file `%s'...\n" msgstr "Lecture du fichier MusicXML « %s »...\n" -#: book_snippets.py:907 +#: book_snippets.py:917 #, python-format msgid "" "%s: duplicate filename but different contents of original file,\n" @@ -119,7 +119,7 @@ msgstr "" "%s : fichier en doublon mais contenu différent de l'original,\n" " impression d'un différentiel entre les deux fichiers." -#: book_snippets.py:920 +#: book_snippets.py:930 #, python-format msgid "" "%s: duplicate filename but different contents of converted lilypond file,\n" @@ -172,7 +172,7 @@ msgstr "\\textstyle est obsolète ; utiliser désormais la syntaxe \\key" #: convertrules.py:82 convertrules.py:1856 convertrules.py:2032 #: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801 -#: convertrules.py:3151 convertrules.py:3385 +#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700 msgid "bump version for release" msgstr "sauter de version pour mise à jour" @@ -597,7 +597,7 @@ msgstr "Suppression de oldaddlyrics" #: convertrules.py:2820 msgid "" "oldaddlyrics is no longer supported. \n" -" Use addlyrics or lyrsicsto instead.\n" +" Use addlyrics or lyricsto instead.\n" msgstr "" "oldaddlyrics n'est désormais plus pris en charge.\n" " Utilisez maintenant addlyrics ou lyricsto.\n" @@ -629,8 +629,8 @@ msgid "\\bar \".\" now produces a thick barline.\n" msgstr "\\bar \".\" produit désormais une barre épaisse.\n" #: convertrules.py:2849 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" -msgstr "Les paramètres du pointillé des liaisons sont gérés par `dash-details.\n" +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" +msgstr "Les paramètres du pointillé des liaisons sont gérés par 'dash-details.\n" #: convertrules.py:2854 msgid "" @@ -859,15 +859,15 @@ msgstr "" "input/regression/beam-broken-classic.ly indique comment sont désormais\n" "gérées les ligatures tronquées.\n" -#: convertrules.py:3369 +#: convertrules.py:3372 msgid "beamExceptions controls whole-measure beaming." msgstr "Une ligature sur la mesure est gérée par beamExceptions" -#: convertrules.py:3606 +#: convertrules.py:3609 msgid "Flag.transparent and Flag.color inherit from Stem" msgstr "Flag.transparent et Flag.color héritent de Stem" -#: convertrules.py:3672 +#: convertrules.py:3675 msgid "Staff-padding now controls the distance to the baseline, not the nearest point." msgstr "" "Staff-padding contrôle désormais la distance par rapport à la ligne de\n" @@ -977,12 +977,12 @@ msgstr "" msgid "Unable to find instrument for ID=%s\n" msgstr "Aucun instrument ne correspond à l'ID %s\n" -#: abc2ly.py:1386 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 +#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 #, python-format msgid "%s [OPTION]... FILE" msgstr "%s [OPTIONS]... FICHIER" -#: abc2ly.py:1387 +#: abc2ly.py:1390 #, python-format msgid "" "abc2ly converts ABC music files (see\n" @@ -991,29 +991,29 @@ msgstr "" "abc2ly convertit les fichiers musicaux ABC (voir\n" "%s) au format LilyPond.\n" -#: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 -#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:181 +#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 +#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184 msgid "show version number and exit" msgstr "affiche le numéro de version et quitte" -#: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 -#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:160 +#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 +#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163 msgid "show this help and exit" msgstr "visualiser cette aide et quitter" -#: abc2ly.py:1401 etf2ly.py:1209 midi2ly.py:1071 +#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071 msgid "write output to FILE" msgstr "produit la sortie dans le FICHIER" -#: abc2ly.py:1404 +#: abc2ly.py:1407 msgid "be strict about success" msgstr "être strict sur la réussite" -#: abc2ly.py:1407 +#: abc2ly.py:1410 msgid "preserve ABC's notion of beams" msgstr "préserver la notion de ligature propre à ABC" -#: abc2ly.py:1410 +#: abc2ly.py:1413 msgid "suppress progress messages" msgstr "n'affiche pas les messages de progression" @@ -1021,8 +1021,8 @@ msgstr "n'affiche pas les messages de progression" #. "Report bugs in English via %s", #. or if there is a LilyPond users list or forum in your language #. "Report bugs in English via %s or in YOUR_LANG via URI" -#: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 -#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:315 +#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 +#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318 #, c-format, python-format msgid "Report bugs via %s" msgstr "" @@ -1080,7 +1080,7 @@ msgstr "" "(NONE, ERROR, WARNING, PROGRESS (par défaut), DEBUG)" #: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181 -#: musicxml2ly.py:2629 main.cc:174 +#: musicxml2ly.py:2629 main.cc:177 msgid "LOGLEVEL" msgstr "LOGLEVEL" @@ -1112,7 +1112,7 @@ msgid "make a numbered backup [default: filename.ext~]" msgstr "effectue un archivage numéroté [par défaut : nomfichier.etx~]" #: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096 -#: main.cc:183 +#: main.cc:186 msgid "show warranty and copyright" msgstr "affiche les notices de garantie et du droit d'auteur" @@ -1133,19 +1133,19 @@ msgstr "Arrêt à la dernière règle appliquée avec succès" msgid "Processing `%s'... " msgstr "Traitement de « %s »..." -#: convert-ly.py:367 +#: convert-ly.py:366 #, python-format msgid "%s: Unable to open file" msgstr "impossible d'ouvrir le fichier « %s »" -#: convert-ly.py:373 +#: convert-ly.py:372 #, python-format msgid "%s: Unable to determine version. Skipping" msgstr "" "impossible de déterminer la version de « %s ».\n" " Au suivant !" -#: convert-ly.py:379 +#: convert-ly.py:378 #, python-format msgid "" "%s: Invalid version string `%s' \n" @@ -1155,7 +1155,7 @@ msgstr "" "Un numéro de version valide est formé de trois nombres séparés par un point,\n" "comme par exemple « 2.8.12 »" -#: convert-ly.py:385 +#: convert-ly.py:384 #, python-format msgid "There was %d error." msgid_plural "There were %d errors." @@ -1177,7 +1177,7 @@ msgstr "" "exploitable.\n" #: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659 -#: main.cc:166 main.cc:178 +#: main.cc:169 main.cc:181 msgid "FILE" msgstr "FICHIER" @@ -1219,7 +1219,7 @@ msgid "add DIR to include path" msgstr "ajoute le RÉP au chemin de recherche des inclusions" #: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169 -#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:165 +#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168 msgid "DIR" msgstr "RÉP" @@ -1232,7 +1232,7 @@ msgid "PAD" msgstr "PAD" #: lilypond-book.py:157 -msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)" +msgid "pad left side of music to align music in spite of uneven bar numbers (in mm)" msgstr "" "tasse la musique par la gauche pour la répartir en dépit du nombre irrégulier\n" "de mesures (en mm)" @@ -1376,19 +1376,19 @@ msgstr "Traitement d'inclusion : %s" msgid "Removing `%s'" msgstr "Suppression de « %s »" -#: lilypond-book.py:714 +#: lilypond-book.py:727 #, python-format msgid "Setting LilyPond's loglevel to %s" msgstr "Niveau de journalisation de LilyPond fixé à %s" -#: lilypond-book.py:718 +#: lilypond-book.py:731 #, python-format msgid "Setting LilyPond's loglevel to %s (from environment variable LILYPOND_LOGLEVEL)" msgstr "" "Détermination du niveau de journalisation de LilyPond à %s\n" "(à partir de la variable d'environnement LILYPOND_LOGLEVEL)" -#: lilypond-book.py:721 +#: lilypond-book.py:734 msgid "Setting LilyPond's output to --verbose, implied by lilypond-book's setting" msgstr "Utilisation de l'option LilyPond --verbose (réglage implicite de lilypond-book)" @@ -1620,12 +1620,12 @@ msgstr "" #: musicxml2ly.py:2576 msgid "" -"Copyright (c) 2005--2012 by\n" +"Copyright (c) 2005--2015 by\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen and\n" " Reinhold Kainhofer \n" msgstr "" -"Copyright (c) 2005--2012 par\n" +"Copyright (c) 2005--2015 par\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen et\n" " Reinhold Kainhofer \n" @@ -1723,15 +1723,15 @@ msgstr "Fichier de sortie : « %s »" msgid "Unable to find input file %s" msgstr "Impossible de trouver le fichier d'entrée « %s »" -#: website_post.py:125 +#: website_post.py:129 msgid "English" msgstr "Anglais" -#: website_post.py:128 +#: website_post.py:132 msgid "Other languages" msgstr "Autres langues" -#: website_post.py:129 +#: website_post.py:133 #, python-format msgid "About automatic language selection." msgstr "À propos de la sélection automatique de la langue." @@ -1808,23 +1808,23 @@ msgstr "" "La saisie d'une liste d'altérations accidentelles doit débuter\n" "par un nom de contexte : %s" -#: accidental-engraver.cc:210 +#: accidental-engraver.cc:207 #, c-format msgid "procedure or context-name expected for accidental rule, found %s" msgstr "" "procédure ou nom de contexte requis pour la règle d'altération accidentelle,\n" "%s trouvé" -#: accidental.cc:169 +#: accidental.cc:141 #, c-format msgid "Could not find glyph-name for alteration %s" msgstr "Aucun nom de glyphe ne correspond à l'altération %s" -#: accidental.cc:184 +#: accidental.cc:157 msgid "natural alteration glyph not found" msgstr "pas de glyphe correspondant au bécarre" -#: all-font-metrics.cc:149 +#: all-font-metrics.cc:159 #, c-format msgid "cannot find font: `%s'" msgstr "fonte « %s » introuvable" @@ -1837,11 +1837,6 @@ msgstr "l'argument \\applycontext n'est pas une procédure" msgid "no heads for arpeggio found?" msgstr "arpeggio sans tête de note ?" -#: auto-change-iterator.cc:74 change-iterator.cc:72 -#, c-format -msgid "cannot change, already in translator: %s" -msgstr "modification impossible, c'est déjà dans le translateur : %s" - #: axis-group-engraver.cc:149 msgid "Axis_group_engraver: vertical group already has a parent" msgstr "Axis_group_engraver : le groupe vertical a déjà un parent" @@ -1854,14 +1849,14 @@ msgstr "Axis_group_engraver redondant" msgid "removing this vertical group" msgstr "retrait de ce groupe vertical" -#: axis-group-interface.cc:714 +#: axis-group-interface.cc:716 #, c-format msgid "\"%s\" is not a valid outside-staff-placement-directive" msgstr "" "on ne peut positionner un objet externe à la portée avec \"%s\"\n" " (outside-staff-position-directive)" -#: axis-group-interface.cc:786 +#: axis-group-interface.cc:788 msgid "an outside-staff object should have a direction, defaulting to up" msgstr "" "un objet externe à la portée devrait avoir un positionnement.\n" @@ -1893,13 +1888,13 @@ msgid "beam was started here" msgstr "la ligature a débuté ici" #. We are completely screwed. -#: beam-quanting.cc:839 +#: beam-quanting.cc:850 msgid "no viable initial configuration found: may not find good beam slope" msgstr "" "pas de configuration initiale viable repérée :\n" "la pente de la ligature pourrait être inesthétique." -#: beam.cc:181 +#: beam.cc:183 msgid "removing beam with no stems" msgstr "suppression d'une ligature ayant moins de deux hampes" @@ -1909,22 +1904,24 @@ msgid "cannot change `%s' to `%s'" msgstr "impossible de changer « %s » en « %s »" #. FIXME: constant error message. -#: change-iterator.cc:93 +#: change-iterator.cc:67 msgid "cannot find context to switch to" msgstr "impossible de repérer le contexte vers lequel commuter" +#. No enclosing context was found because the iterator's immediate +#. context is the kind that was sought. #. We could change the current translator's id, but that would make #. errors hard to catch. #. #. last->translator_id_string () = get_change #. ()->change_to_id_string (); -#: change-iterator.cc:102 +#: change-iterator.cc:78 #, c-format msgid "not changing to same context type: %s" msgstr "pas de changement vers le même type de contexte : %s" -#. FIXME: uncomprehensable message -#: change-iterator.cc:106 +#. FIXME: incomprehensible message +#: change-iterator.cc:82 msgid "none of these in my family" msgstr "aucun de ceux-ci dans ma famille" @@ -1959,26 +1956,26 @@ msgstr "Coherent_ligature_engraver : initialise « spacing-increment=0.01 » msgid "cannot find line breaking that satisfies constraints" msgstr "impossible de trouver un saut de ligne qui satisfasse aux contraintes" -#: context-property.cc:43 +#: context-property.cc:46 msgid "need symbol arguments for \\override and \\revert" msgstr "\\override et \\revert requièrent des arguments symboliques" -#: context.cc:149 +#: context.cc:144 #, c-format msgid "cannot find or create new `%s'" msgstr "impossible de trouver ou créer un nouveau « %s »" -#: context.cc:228 +#: context.cc:223 #, c-format msgid "cannot find or create `%s' called `%s'" msgstr "impossible de trouver ou créer « %s » dénommé(e) « %s »" -#: context.cc:425 +#: context.cc:416 #, c-format msgid "cannot find or create: `%s'" msgstr "impossible de trouver ou créer « %s »" -#: context.cc:439 +#: context.cc:430 #, c-format msgid "cannot find or create new Bottom = \"%s\"" msgstr "impossible de trouver ou créer un nouveau « %s »" @@ -1988,20 +1985,20 @@ msgstr "impossible de trouver ou créer un nouveau « %s »" msgid "custos `%s' not found" msgstr "custode « %s » introuvable" -#: dispatcher.cc:89 +#: dispatcher.cc:82 msgid "Event class should be a list" msgstr "La classe d'événement devrait être une liste" -#: dispatcher.cc:172 +#: dispatcher.cc:165 #, c-format msgid "Junking event: %s" msgstr "Événement escamoté : « %s »" -#: dispatcher.cc:277 +#: dispatcher.cc:279 msgid "Attempting to remove nonexisting listener." msgstr "Tentative de suppression d'un écouteur inexistant." -#: dispatcher.cc:303 +#: dispatcher.cc:305 msgid "Already listening to dispatcher, ignoring request" msgstr "Déjà à l'écoute du dispatcheur ; requête ignorée." @@ -2010,7 +2007,7 @@ msgstr "Déjà à l'écoute du dispatcheur ; requête ignorée." msgid "dot `%s' not found" msgstr "point « %s » introuvable" -#: dynamic-engraver.cc:168 +#: dynamic-engraver.cc:169 #, c-format msgid "" "unknown crescendo style: %s\n" @@ -2019,7 +2016,7 @@ msgstr "" "style de crescendo inconnu : %s\n" "retour à la valeur par défaut (soufflet)." -#: dynamic-engraver.cc:233 slur-proto-engraver.cc:119 +#: dynamic-engraver.cc:234 slur-proto-engraver.cc:119 #, c-format msgid "unterminated %s" msgstr "%s non terminé(e)" @@ -2047,22 +2044,22 @@ msgstr "épisème non terminé" msgid "unterminated extender" msgstr "prolongation ou extenseur non terminé" -#: flag.cc:134 +#: flag.cc:133 #, c-format msgid "flag `%s' not found" msgstr "crochet inconnu : « %s »" -#: flag.cc:154 +#: flag.cc:153 #, c-format msgid "flag stroke `%s' not found" msgstr "type de crochet inconnu : « %s »" -#: font-config-scheme.cc:151 font-config.cc:53 +#: font-config-scheme.cc:151 font-config.cc:82 #, c-format msgid "failed adding font directory: %s" msgstr "échec lors de l'ajout d'un répertoire de fontes : « %s »" -#: font-config-scheme.cc:153 font-config.cc:55 +#: font-config-scheme.cc:153 font-config.cc:84 #, c-format msgid "Adding font directory: %s" msgstr "Ajout d'un répertoire de fontes : « %s »" @@ -2081,7 +2078,17 @@ msgstr "Ajout d'un fichier de fontes : « %s »" msgid "Initializing FontConfig..." msgstr "Initialisation de FontConfig..." -#: font-config.cc:58 +#: font-config.cc:70 +#, c-format +msgid "failed to add fontconfig configuration file `%s'" +msgstr "échec lors de l'ajout du fichier de configuration de fontconfig « %s »" + +#: font-config.cc:73 +#, c-format +msgid "Adding fontconfig configuration file: %s" +msgstr "Ajout du fichier de configuration de fontconfig : « %s »" + +#: font-config.cc:86 msgid "Building font database..." msgstr "Construction de la base de donnée des fontes..." @@ -2089,12 +2096,12 @@ msgstr "Construction de la base de donnée des fontes..." msgid "Must be footnote-event." msgstr "Doit être un événement note de bas de page (footnote-event)." -#: general-scheme.cc:390 +#: general-scheme.cc:403 #, c-format msgid "failed redirecting stderr to `%s'" msgstr "échec lors de la redirection de stderr vers « %s »" -#: general-scheme.cc:469 output-ps.scm:48 +#: general-scheme.cc:482 output-ps.scm:48 msgid "Found infinity or nan in output. Substituting 0.0" msgstr "Détection d'une valeur infini ou non numérique. Substitution par 0.0" @@ -2147,12 +2154,12 @@ msgstr "" "L'objet graphique (Grob) « %s »\n" " n'a pas d'interface pour la propriété « %s »" -#: grob-property.cc:35 +#: grob-property.cc:33 #, c-format msgid "%d: %s" msgstr "%d : %s" -#: grob.cc:488 +#: grob.cc:492 #, c-format msgid "ignored infinite %s-offset" msgstr "%s-offset infini ignoré" @@ -2161,7 +2168,7 @@ msgstr "%s-offset infini ignoré" msgid "Asking for broken bound padding at a non-broken bound." msgstr "Tentative de décalage d'un fragment de souflet alors qu'il n'est pas rompu." -#: hairpin.cc:256 +#: hairpin.cc:257 msgid "decrescendo too small" msgstr "decrescendo trop petit" @@ -2181,7 +2188,7 @@ msgstr "retrait du trait d'union sans suite" msgid "unterminated hyphen; removing" msgstr "trait d'union sans suite ; escamoté" -#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108 +#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108 #, c-format msgid "cannot find file: `%s'" msgstr "fichier non trouvé : « %s »" @@ -2191,11 +2198,11 @@ msgstr "fichier non trouvé : « %s »" msgid "(search path: `%s')" msgstr "(chemin de recherche : « %s »)" -#: input.cc:138 source-file.cc:178 source-file.cc:193 +#: input.cc:138 source-file.cc:180 source-file.cc:195 msgid "position unknown" msgstr "position inconnue" -#: key-engraver.cc:198 +#: key-engraver.cc:197 msgid "Incomplete keyAlterationOrder for key signature" msgstr "Propriété keyAlterationOrder incomplète pour cette armure." @@ -2236,21 +2243,21 @@ msgstr "le silence est ignoré : une ligature ne peut contenir de silence" msgid "ligature was started here" msgstr "la ligature a débuté ici" -#: lily-guile.cc:93 +#: lily-guile.cc:94 #, c-format msgid "(load path: `%s')" msgstr "(chemin de chargement : « %s »)" -#: lily-guile.cc:412 +#: lily-guile.cc:413 #, c-format msgid "cannot find property type-check for `%s' (%s)." msgstr "vérification du type de propriété pour « %s » (%s) non trouvée" -#: lily-guile.cc:415 +#: lily-guile.cc:416 msgid "perhaps a typing error?" msgstr "Probable faute de frappe" -#: lily-guile.cc:422 +#: lily-guile.cc:423 msgid "skipping assignment" msgstr "affectation ignorée" @@ -2261,20 +2268,33 @@ msgstr "" "la vérification du type de « %s » a échoué ; \n" " la valeur « %s » doit être du type « %s »" -#: lily-lexer.cc:249 +#. Uh oh. unsmob delivered 0, yet +#. unsmob delivers true. This means that unsmob is a +#. matching check from a base class of T, but var is of an +#. incompatible derived type. +#: lily-guile.cc:462 +msgid "Wrong kind of " +msgstr "Mauvais genre de " + +#: lily-lexer.cc:251 msgid "include files are not allowed in safe mode" msgstr "l'inclusion de fichiers n'est pas permise en mode sans échec" -#: lily-lexer.cc:276 +#: lily-lexer.cc:278 #, c-format msgid "identifier name is a keyword: `%s'" msgstr "Le nom de l'identificateur est un mot clé : « %s »" -#: lily-lexer.cc:297 lily-lexer.cc:310 +#: lily-lexer.cc:299 lily-lexer.cc:312 #, c-format msgid "%s:EOF" msgstr "%s:EOF" +#: lily-modules.cc:81 +#, c-format +msgid "Uninitialized variable `%s' in module (%s)" +msgstr "Variable « %s » dans le module « %s » non initialisée" + #: lily-parser-scheme.cc:80 #, c-format msgid "Changing working directory to: `%s'" @@ -2301,43 +2321,37 @@ msgstr "" msgid "Processing `%s'" msgstr "Traitement de « %s »" -#: lily-parser-scheme.cc:209 +#: lily-parser-scheme.cc:210 msgid "ly:parser-parse-string is only valid with a new parser. Use ly:parser-include-string instead." msgstr "" "ly:parser-parse-string ne peut foncionner qu'avec un nouvel analyseur.\n" "Utilisez plutôt ly:parser-include-string" -#: lily-parser-scheme.cc:240 +#: lily-parser-scheme.cc:241 msgid "ly:parse-string-expression is only valid with a new parser. Use ly:parser-include-string instead." msgstr "" "ly:parse-string-expression ne peut foncionner qu'avec un nouvel analyseur.\n" "Utilisez plutôt ly:parser-include-string" -#: lily-parser.cc:107 +#: lily-parser.cc:106 msgid "Parsing..." msgstr "Analyse..." -#: lookup.cc:181 +#: lookup.cc:178 #, c-format msgid "Not drawing a box with negative dimension, %.2f by %.2f." msgstr "La boîte aux dimensions négatives, %.2f par %.2f, ne sera pas dessinée." -#: lyric-combine-music-iterator.cc:199 +#: lyric-combine-music-iterator.cc:204 msgid "argument of \\lyricsto should contain Lyrics context" msgstr "les arguments de \\lyricsto doivent comporter un contexte Lyrics." -#: lyric-combine-music-iterator.cc:337 +#: lyric-combine-music-iterator.cc:344 #, c-format -msgid "cannot find Voice `%s'" -msgstr "impossible de repérer la voix (Voice) « %s »" - -#: lyric-engraver.cc:186 -msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." -msgstr "" -"Syllabe sans note de rattachement.\n" -" Utiliser \\lyricsto ou associatedVoice." +msgid "cannot find %s `%s'" +msgstr "le contexte %s « %s » n'existe pas" -#: main.cc:104 +#: main.cc:106 #, c-format msgid "" "This program is free software. It is covered by the GNU General Public\n" @@ -2350,7 +2364,7 @@ msgstr "" "sous certaines conditions.\n" "Invoquez « %s --warranty » pour plus d'informations.\n" -#: main.cc:110 +#: main.cc:112 msgid "" " This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License as \n" @@ -2381,11 +2395,11 @@ msgstr "" "écrire à la Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n" "Boston, MA 02111-1307, USA.\n" -#: main.cc:148 +#: main.cc:150 msgid "SYM[=VAL]" msgstr "SYM[=VAL]" -#: main.cc:149 +#: main.cc:151 msgid "" "set Scheme option SYM to VAL (default: #t).\n" "Use -dhelp for help." @@ -2393,43 +2407,47 @@ msgstr "" "affecte VAL (par défaut #t) à l'option Scheme SYM.\n" "Utiliser -dhelp pour avoir de l'aide." -#: main.cc:153 +#: main.cc:155 msgid "EXPR" msgstr "EXPR" -#: main.cc:153 +#: main.cc:155 msgid "evaluate scheme code" msgstr "évaluation du code Scheme" #. Bug in option parser: --output =foe is taken as an abbreviation #. for --output-format. -#: main.cc:156 +#: main.cc:158 msgid "FORMATs" msgstr "FORMATs" -#: main.cc:156 +#: main.cc:158 msgid "dump FORMAT,... Also as separate options:" msgstr "" "produire FORMAT...\n" "Aussi comme options séparées :" -#: main.cc:157 +#: main.cc:159 msgid "generate PDF (default)" msgstr "générer le PDF (par défaut)" -#: main.cc:158 +#: main.cc:160 msgid "generate PNG" msgstr "générer le PNG" -#: main.cc:159 +#: main.cc:161 msgid "generate PostScript" msgstr "générer le PostScript" #: main.cc:162 +msgid "generate big PDF files" +msgstr "générer de gros fichiers PDF" + +#: main.cc:165 msgid "FIELD" msgstr "CHAMP" -#: main.cc:162 +#: main.cc:165 msgid "" "dump header field FIELD to file\n" "named BASENAME.FIELD" @@ -2437,21 +2455,21 @@ msgstr "" "écrire le champ d'entête CHAMP dans le\n" "fichier nommé RACINE.CHAMP" -#: main.cc:165 +#: main.cc:168 msgid "add DIR to search path" msgstr "ajouter RÉPERTOIRE au chemin de recherche" -#: main.cc:166 +#: main.cc:169 msgid "use FILE as init file" msgstr "" "utiliser FICHIER comme\n" "fichier d'initialisation" -#: main.cc:169 +#: main.cc:172 msgid "USER, GROUP, JAIL, DIR" msgstr "USER, GROUP, CAGE, RÉP" -#: main.cc:169 +#: main.cc:172 msgid "" "chroot to JAIL, become USER:GROUP\n" "and cd into DIR" @@ -2459,7 +2477,7 @@ msgstr "" "chroot dans CAGE, devenir UTILISATEUR:GROUPE\n" "et cd dans RÉPERTOIRE" -#: main.cc:174 +#: main.cc:177 msgid "" "print log messages according to LOGLEVEL. Possible values are:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG." @@ -2467,30 +2485,30 @@ msgstr "" "affiche les informations selon le niveau de LOGLEVEL :\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (défaut) ou DEBUG." -#: main.cc:178 +#: main.cc:181 msgid "write output to FILE (suffix will be added)" msgstr "" "produire la sortie dans FICHIER \n" "(adjonction automatique du suffixe)" -#: main.cc:179 +#: main.cc:182 msgid "relocate using directory of lilypond program" msgstr "" "redétermine le chemin d'exécution\n" "des composants de LilyPond" -#: main.cc:180 +#: main.cc:183 msgid "no progress, only error messages (equivalent to loglevel=ERROR)" msgstr "" "pas de progression, seulement les messages d'erreur\n" "(équivalent à loglevel=ERROR)" -#: main.cc:182 +#: main.cc:185 msgid "be verbose (equivalent to loglevel=DEBUG)" msgstr "état verbeux (équivalent à loglevel=DEBUG)" #. Do not update the copyright years here, run `make grand-replace' -#: main.cc:261 +#: main.cc:264 #, c-format msgid "" "Copyright (c) %s by\n" @@ -2500,88 +2518,88 @@ msgstr "" "%s et autres." #. No version number or newline here. It confuses help2man. -#: main.cc:299 +#: main.cc:302 #, c-format msgid "Usage: %s [OPTION]... FILE..." msgstr "Utilisation : %s [OPTIONS]... FICHIER..." -#: main.cc:301 +#: main.cc:304 msgid "Typeset music and/or produce MIDI from FILE." msgstr "Composer la musique ou jouer en format MIDI à partir du FICHIER" -#: main.cc:303 +#: main.cc:306 msgid "LilyPond produces beautiful music notation." msgstr "LilyPond produit une jolie notation musicale" -#: main.cc:305 +#: main.cc:308 #, c-format msgid "For more information, see %s" msgstr "Pour plus d'informations, voir %s" -#: main.cc:307 +#: main.cc:310 msgid "Options:" msgstr "Options :" -#: main.cc:374 +#: main.cc:377 #, c-format msgid "expected %d arguments with jail, found: %u" msgstr "une cage requiert %d arguments, il y en a %u" -#: main.cc:388 +#: main.cc:391 #, c-format msgid "no such user: %s" msgstr "utilisateur inconnu : « %s »" -#: main.cc:390 +#: main.cc:393 #, c-format msgid "cannot get user id from user name: %s: %s" msgstr "" "impossible de repérer l'identifiant utilisateur à partir du nom d'utilisateur :\n" "%s : %s" -#: main.cc:405 +#: main.cc:408 #, c-format msgid "no such group: %s" msgstr "groupe inconnu : %s" -#: main.cc:407 +#: main.cc:410 #, c-format msgid "cannot get group id from group name: %s: %s" msgstr "" "impossible de repérer l'identifiant groupe à partir du nom de groupe :\n" "%s : %s " -#: main.cc:415 +#: main.cc:418 #, c-format msgid "cannot chroot to: %s: %s" msgstr "impossible de chrooter vers : %s : %s" -#: main.cc:422 +#: main.cc:425 #, c-format msgid "cannot change group id to: %d: %s" msgstr "impossible de changer l'identifiant de groupe en %d : %s" -#: main.cc:428 +#: main.cc:431 #, c-format msgid "cannot change user id to: %d: %s" msgstr "impossible de changer l'identifiant utilisateur en %d : %s" -#: main.cc:434 +#: main.cc:437 #, c-format msgid "cannot change working directory to: %s: %s" msgstr "impossible de changer le répertoire de travail en %s : %s" -#: main.cc:805 +#: main.cc:826 #, c-format msgid "exception caught: %s" msgstr "exception capturée : %s" #. FIXME: constant error message. -#: mark-engraver.cc:156 +#: mark-engraver.cc:150 msgid "rehearsalMark must have integer value" msgstr "rehearsalMark doit être un entier" -#: mark-engraver.cc:162 +#: mark-engraver.cc:156 msgid "mark label must be a markup object" msgstr "les étiquettes de marque doivent être des objets de type « markup »." @@ -2633,7 +2651,7 @@ msgstr "" msgid "unexpected case fall-through" msgstr "cas inattendu et non interprétable" -#: midi-control-function-performer.cc:109 staff-performer.cc:152 +#: midi-control-function-performer.cc:107 staff-performer.cc:153 #, c-format msgid "ignoring out-of-range value change for MIDI property `%s'" msgstr "propriété MIDI « %s » : modification de valeur hors limite donc ignorée" @@ -2659,7 +2677,7 @@ msgstr "" msgid "cannot write to file: `%s'" msgstr "impossible d'écrire dans le fichier « %s »" -#: minimal-page-breaking.cc:40 paper-score.cc:122 +#: minimal-page-breaking.cc:40 paper-score.cc:116 msgid "Calculating line breaks..." msgstr "Calcul des sauts de ligne..." @@ -2667,16 +2685,12 @@ msgstr "Calcul des sauts de ligne..." msgid "Calculating page breaks..." msgstr "Calcul des sauts de page..." -#: multi-measure-rest.cc:154 +#: multi-measure-rest.cc:152 msgid "usable-duration-logs must be a non-empty list. Falling back to whole rests." msgstr "" "usable-duration-logs ne peut être constitué d'une liste vide.\n" "Retour à des pauses." -#: multi-measure-rest.cc:364 -msgid "Using naive multi measure rest spacing." -msgstr "Utilisation d'un espacement de type silence multimesure." - #: music.cc:150 #, c-format msgid "octave check failed; expected \"%s\", found: \"%s\"" @@ -2684,15 +2698,6 @@ msgstr "" "Échec de vérification d'octave.\n" "Aurait dû être \"%s\", \"%s\" obtenu" -#: music.cc:219 -msgid "(normalized pitch)" -msgstr "(hauteur normalisée)" - -#: music.cc:223 -#, c-format -msgid "Transposing %s by %s makes alteration larger than double" -msgstr "La transposition de %s à %s crée des altérations supérieures aux doubles" - #: new-fingering-engraver.cc:113 msgid "cannot add text scripts to individual note heads" msgstr "impossible d'ajouter du texte à des têtes de note individuelles" @@ -2705,11 +2710,11 @@ msgstr "nulle part où positionner des doigtés" msgid "placing below" msgstr "on les place en dessous" -#: note-collision.cc:497 -msgid "ignoring too many clashing note columns" -msgstr "trop d'empilements de notes se chevauchent. On fera au mieux." +#: note-collision.cc:510 +msgid "this Voice needs a \\voiceXx or \\shiftXx setting" +msgstr "ce contexte de voix rrequiert un réglage \\voiceXx ou \\shiftXx" -#: note-column.cc:147 +#: note-column.cc:150 msgid "cannot have note heads and rests together on a stem" msgstr "impossible de superposer une note et un silence sur une même hampe" @@ -2737,22 +2742,22 @@ msgstr "impossible de charger la table des fontes : %s" msgid "FreeType error: %s" msgstr "Erreur FreeType : %s" -#: open-type-font.cc:111 +#: open-type-font.cc:115 #, c-format msgid "unsupported font format: %s" msgstr "format de police non supporté : %s" -#: open-type-font.cc:113 +#: open-type-font.cc:117 #, c-format msgid "error reading font file %s: %s" msgstr "erreur de lecture du fichier de fontes %s : %s" -#: open-type-font.cc:188 +#: open-type-font.cc:192 #, c-format msgid "FT_Get_Glyph_Name () Freetype error: %s" msgstr "erreur Freetype FT_Get_Glyph_Name () : %s" -#: open-type-font.cc:336 pango-font.cc:256 +#: open-type-font.cc:340 pango-font.cc:258 #, c-format msgid "FT_Get_Glyph_Name () error: %s" msgstr "Erreur FT_Get_Glyph_Name () : %s" @@ -2790,107 +2795,106 @@ msgstr "tentative pour %d systèmes" msgid "best score for this sys-count: %f" msgstr "meilleur résultat pour cette configuration « sys-count » : %f" -#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:248 -#: paper-score.cc:162 +#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249 +#: paper-score.cc:156 msgid "Drawing systems..." msgstr "Dessin des systèmes..." -#: output-def.cc:235 +#: output-def.cc:229 msgid "margins do not fit with line-width, setting default values" msgstr "" "les marges ne sont pas en cohérence avec la longueur de ligne ;\n" "retour aux valeurs par défaut" -#: output-def.cc:242 +#: output-def.cc:236 msgid "systems run off the page due to improper paper settings, setting default values" msgstr "" "les systèmes débordent de la page en raison de réglages de papier erronés ;\n" "retour aux valeurs par défaut" -#: page-breaking.cc:277 +#: page-breaking.cc:276 msgid "ignoring min-systems-per-page and max-systems-per-page because systems-per-page was set" msgstr "" "systems-per-page non défini :\n" " min-systems-per-page et max-systems-per-page ignorés" -#: page-breaking.cc:282 +#: page-breaking.cc:281 msgid "min-systems-per-page is larger than max-systems-per-page, ignoring both values" msgstr "" "min-systems-per-page supérieur à max-systems-per-page :\n" " tous deux seront ignorés" -#: page-layout-problem.cc:402 +#: page-breaking.cc:636 +#, c-format +msgid "page %d has been compressed" +msgstr "la page %d a été comprimée" + +#: page-layout-problem.cc:400 msgid "A page layout problem has been initiated that cannot accommodate footnotes." msgstr "Un défaut de mise en page perturbe la gestion des notes de bas de page." -#: page-layout-problem.cc:731 -msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" -msgstr "" -"impossible de faire tenir la musique sur la page :\n" -" justification demandée, mais page déjà compressée" +#: page-layout-problem.cc:729 +msgid "ragged-bottom was specified, but page must be compressed" +msgstr "ragged-bottom spécifié, mais la page doit être comprimée" -#: page-layout-problem.cc:734 +#: page-layout-problem.cc:732 #, c-format -msgid "cannot fit music on page: overflow is %f" -msgstr "impossible de faire tenir la musique sur la page. Débordement de %f" - -#: page-layout-problem.cc:736 -msgid "compressing music to fit" -msgstr "compression de la musique pour que cela tienne" +msgid "compressing over-full page by %.1f staff-spaces" +msgstr "compression du débordement de page de %.1f espace de portée" -#: page-layout-problem.cc:1199 +#: page-layout-problem.cc:1197 msgid "staff-affinities should only decrease" msgstr "staff-affinities devraient aller en ordre décroissant" -#: page-turn-page-breaking.cc:168 +#: page-turn-page-breaking.cc:169 #, c-format msgid "page-turn-page-breaking: breaking from %d to %d" msgstr "" "Saut de page et tourne (page-turn-page-breaking) :\n" "coupure entre %d et %d" -#: page-turn-page-breaking.cc:217 +#: page-turn-page-breaking.cc:218 msgid "cannot fit the first page turn onto a single page. Consider setting first-page-number to an even number." msgstr "" "Impossible de cadrer sur une seule page ce qui précède la première tourne.\n" "Envisagez de définir un numéro pair pour first-page-number." -#: page-turn-page-breaking.cc:230 +#: page-turn-page-breaking.cc:231 #, c-format msgid "Calculating page and line breaks (%d possible page breaks)..." msgstr "Calcul des sauts de page et de ligne (%d sauts de pages possibles)..." -#: page-turn-page-breaking.cc:300 +#: page-turn-page-breaking.cc:301 #, c-format msgid "break starting at page %d" msgstr "saut intervenant à la page %d" -#: page-turn-page-breaking.cc:301 +#: page-turn-page-breaking.cc:302 #, c-format msgid "\tdemerits: %f" msgstr " démérites : %f" -#: page-turn-page-breaking.cc:302 +#: page-turn-page-breaking.cc:303 #, c-format msgid "\tsystem count: %d" msgstr " nombre de systèmes : %d" -#: page-turn-page-breaking.cc:303 +#: page-turn-page-breaking.cc:304 #, c-format msgid "\tpage count: %d" msgstr " nombre de pages : %d" -#: page-turn-page-breaking.cc:304 +#: page-turn-page-breaking.cc:305 #, c-format msgid "\tprevious break: %d" msgstr " coupure précédente : %d" -#: pango-font.cc:245 +#: pango-font.cc:247 #, c-format msgid "no glyph for character U+%0X in font `%s'" msgstr "aucun glyphe ne correspond au caractère U+%0X dans la fonte « %s »" -#: pango-font.cc:272 +#: pango-font.cc:274 #, c-format msgid "" "Glyph has no name, but font supports glyph naming.\n" @@ -2899,21 +2903,21 @@ msgstr "" "Le glyphe n'a pas de nom alors que la fonte prend en charge leur nommage.\n" "Glyphe U+%0X ignoré dans le fichier « %s »" -#: pango-font.cc:322 +#: pango-font.cc:324 #, c-format msgid "no PostScript font name for font `%s'" msgstr "« %s » n'est pas un fichier de fonte PostScript" -#: pango-font.cc:372 +#: pango-font.cc:374 msgid "FreeType face has no PostScript font name" msgstr "Caractère FreeType sans nom de police PostScript" -#: paper-book.cc:214 +#: paper-book.cc:200 #, c-format msgid "program option -dprint-pages not supported by backend `%s'" msgstr "l'option -dprint-pages n'est pas opérationnelle avec le moteur %s" -#: paper-book.cc:233 +#: paper-book.cc:219 #, c-format msgid "program option -dpreview not supported by backend `%s'" msgstr "l'option -dpreview n'est pas opérationnelle avec le moteur %s" @@ -2929,23 +2933,19 @@ msgstr "" msgid "Layout output to `%s'..." msgstr "Sortie mise en page vers « %s »..." -#: paper-score.cc:134 +#: paper-score.cc:128 #, c-format msgid "Element count %d (spanners %d) " msgstr "%d éléments dénombrés (%d extensions)" -#: paper-score.cc:138 +#: paper-score.cc:132 msgid "Preprocessing graphical objects..." msgstr "Pré-traitement des éléments graphiques..." -#: parse-scm.cc:121 +#: parse-scm.cc:124 msgid "GUILE signaled an error for the expression beginning here" msgstr "GUILE a signalé une erreur pour l'expression débutant ici" -#: partial-iterator.cc:45 -msgid "trying to use \\partial after the start of a piece" -msgstr "\\partial ne devrait intervenir qu'en début de morceau" - #: pdf-scheme.cc:65 #, c-format msgid "Conversion of string `%s' to UTF-16be failed: %s" @@ -2953,15 +2953,15 @@ msgstr "" "La conversion de la chaîne « %s » en UTF-16be a échoué :\n" " %s" -#: percent-repeat-engraver.cc:147 +#: percent-repeat-engraver.cc:148 msgid "unterminated percent repeat" msgstr "répétition en pourcent non terminée" -#: performance.cc:54 +#: performance.cc:76 msgid "Track..." msgstr "Piste..." -#: performance.cc:82 +#: performance.cc:126 #, c-format msgid "MIDI output to `%s'..." msgstr "Sortie MIDI vers « %s »..." @@ -2987,7 +2987,7 @@ msgstr "début du crochet de la pédale de piano indéterminé : « %s »" msgid "no such internal option: %s" msgstr "option interne inconnue : %s" -#: property-iterator.cc:100 +#: property-iterator.cc:115 #, c-format msgid "not a grob name, `%s'" msgstr "« %s » n'est pas un nom d'objet graphique (grob)" @@ -2996,25 +2996,25 @@ msgstr "« %s » n'est pas un nom d'objet graphique (grob)" msgid "Failed octave check, got: " msgstr "échec de la vérification d'octave, a obtenu : " -#: relocate.cc:52 +#: relocate.cc:56 #, c-format msgid "Setting %s to %s" msgstr "%s fixé à %s" #. this warning should only be printed in debug mode! -#: relocate.cc:73 +#: relocate.cc:77 #, c-format msgid "no such file: %s for %s" msgstr "fichier inexistant : %s pour %s" #. this warning should only be printed in debug mode! #. this warning should only be printed in debug mode -#: relocate.cc:84 relocate.cc:102 +#: relocate.cc:88 relocate.cc:106 #, c-format msgid "no such directory: %s for %s" msgstr "répertoire inexistant : %s pour %s" -#: relocate.cc:93 +#: relocate.cc:97 #, c-format msgid "%s=%s (prepend)\n" msgstr "%s=%s (ajout)\n" @@ -3044,7 +3044,7 @@ msgstr "Relocalisation absolue : argv0=%s\n" msgid "Relocation : from cwd: argv0=%s\n" msgstr "Relocalisation à partir du répertoire courant : argv0=%s\n" -#: relocate.cc:194 +#: relocate.cc:196 #, c-format msgid "" "Relocation: from PATH=%s\n" @@ -3053,69 +3053,65 @@ msgstr "" "Relocalisation : à partir de PATH=%s\n" "argv0=%s\n" -#: relocate.cc:220 +#: relocate.cc:222 msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR" msgstr "LILYPONDPREFIX est obsolète, utiliser LILYPOND_DATADIR" -#: relocate.cc:345 +#: relocate.cc:347 #, c-format msgid "Relocation file: %s" msgstr "Fichier de relocalisation : %s" -#: relocate.cc:349 source-file.cc:65 +#: relocate.cc:351 source-file.cc:65 #, c-format msgid "cannot open file: `%s'" msgstr "Impossible d'ouvrir le fichier « %s »" -#: relocate.cc:379 +#: relocate.cc:381 #, c-format msgid "Unknown relocation command %s" msgstr "Commande de relocalisation inconnue : %s" -#: rest-collision-engraver.cc:70 -msgid "rhythmic head is not part of a rhythmic column" -msgstr "tête rythmique non rattachée à un empilement rythmique" - -#: rest-collision.cc:150 +#: rest-collision.cc:154 msgid "cannot resolve rest collision: rest direction not set" msgstr "collision de silences insoluble : positionnement du silence indéterminée" -#: rest-collision.cc:161 rest-collision.cc:270 +#: rest-collision.cc:165 rest-collision.cc:274 msgid "too many colliding rests" msgstr "trop de silences se chevauchent" -#: rest.cc:240 +#: rest.cc:239 #, c-format msgid "rest `%s' not found" msgstr "silence « %s » inconnu" -#: score-engraver.cc:78 +#: score-engraver.cc:77 #, c-format msgid "cannot find `%s'" msgstr "impossible de trouver « %s »" -#: score-engraver.cc:80 +#: score-engraver.cc:79 msgid "Music font has not been installed properly." msgstr "Les fontes musicales n'ont pas été installées correctement." -#: score-engraver.cc:82 +#: score-engraver.cc:81 #, c-format msgid "Search path `%s'" msgstr "Chemin de recherche : « %s »" -#: score-engraver.cc:84 +#: score-engraver.cc:83 msgid "Aborting" msgstr "Abandon" -#: score.cc:172 +#: score.cc:161 msgid "already have music in score" msgstr "il y a déjà de la musique dans la partition" -#: score.cc:173 +#: score.cc:163 msgid "this is the previous music" msgstr "voici la musique précédente" -#: score.cc:178 +#: score.cc:169 msgid "errors found, ignoring music expression" msgstr "suite à des erreurs répétées, l'expression musicale sera ignorée" @@ -3128,7 +3124,7 @@ msgstr "ne sait comment interpréter l'articulation" msgid " scheme encoding: " msgstr "encodage Scheme : " -#: skyline-pair.cc:160 +#: skyline-pair.cc:135 msgid "direction must not be CENTER in ly:skyline-pair::skyline" msgstr "direction ne saurait être CENTER pour ly:skyline-pair::skyline" @@ -3154,7 +3150,7 @@ msgstr "%s san origine" msgid "cannot end %s" msgstr "impossible de terminer %s" -#: slur.cc:434 +#: slur.cc:436 #, c-format msgid "Ignoring grob for slur: %s. avoid-slur not set?" msgstr "" @@ -3174,16 +3170,16 @@ msgstr "Bouclage du canal MIDI" msgid "remapping modulo 16" msgstr "réaffectation modulo 16" -#: stem-engraver.cc:110 +#: stem-engraver.cc:100 msgid "tremolo duration is too long" msgstr "durée du tremolo trop longue" -#: stem-engraver.cc:162 +#: stem-engraver.cc:152 #, c-format msgid "adding note head to incompatible stem (type = %d/%d)" msgstr "Ajout d'une tête de note à une hampe incompatible (type = %d/%d)" -#: stem-engraver.cc:165 +#: stem-engraver.cc:155 msgid "maybe input should specify polyphonic voices" msgstr "la source devrait spécifier des voix polyphoniques" @@ -3191,24 +3187,18 @@ msgstr "la source devrait spécifier des voix polyphoniques" msgid "weird stem size, check for narrow beams" msgstr "taille de hampe bizarre ; vérifier la présence de liens étroits" -#: system.cc:201 +#: system.cc:202 #, c-format msgid "Element count %d" msgstr "%d éléments dénombrés." -#: system.cc:512 +#: system.cc:513 #, c-format msgid "Grob count %d" msgstr "%d objet graphiques (grob) dénombrés." #. TODO: Also print the arguments of the markup! -#: text-interface.cc:129 -#, c-format -msgid "Cyclic markup detected: %s" -msgstr "« markup » avec référence circulaire : %s" - -#. TODO: Also print the arguments of the markup! -#: text-interface.cc:142 +#: text-interface.cc:139 #, c-format msgid "Markup depth exceeds maximal value of %d; Markup: %s" msgstr "" @@ -3227,11 +3217,11 @@ msgstr "extension de texte déjà présente" msgid "unterminated text spanner" msgstr "extension de texte non terminée" -#: tie-engraver.cc:119 +#: tie-engraver.cc:121 msgid "unterminated tie" msgstr "liaison de prolongation non terminée" -#: tie-engraver.cc:353 +#: tie-engraver.cc:377 msgid "lonely tie" msgstr "liaison de prolongation orpheline" @@ -3240,21 +3230,12 @@ msgstr "liaison de prolongation orpheline" #. #. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. #. -#: time-signature-engraver.cc:75 +#: time-signature-engraver.cc:95 #, c-format msgid "strange time signature found: %d/%d" msgstr "Chiffrage de mesure inhabituel : %d/%d" -#. If there is no such symbol, we default to the numbered style. -#. (Here really with a warning!) -#: time-signature.cc:89 -#, c-format -msgid "time signature symbol `%s' not found; reverting to numbered style" -msgstr "" -"symbole de chiffrage de mesure « %s » inconnu ;\n" -" retour à un style numérique." - -#: translator-ctors.cc:65 +#: translator-ctors.cc:68 #, c-format msgid "unknown translator: `%s'" msgstr "translateur inconnu : « %s »" @@ -3264,17 +3245,17 @@ msgstr "translateur inconnu : « %s »" msgid "fatal error. Couldn't find type: %s" msgstr "Erreur fatale. Type inconnu : %s" -#: translator-group.cc:188 +#: translator-group.cc:187 #, c-format msgid "cannot find: `%s'" msgstr "« %s » inconnu(e)" -#: translator.cc:326 +#: translator.cc:310 #, c-format msgid "Two simultaneous %s events, junking this one" msgstr "Deux événements %s simultanés, rejet de celui-ci" -#: translator.cc:327 +#: translator.cc:311 #, c-format msgid "Previous %s event here" msgstr "Événement %s précédent ici" @@ -3347,207 +3328,216 @@ msgstr "a déjà une extension terminée" msgid "giving up" msgstr "abandon" -#: parser.yy:158 parser.yy:172 -msgid "Too much lookahead" -msgstr "Trop d'anticipation" - -#: parser.yy:441 parser.yy:752 parser.yy:818 +#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248 msgid "bad expression type" msgstr "type d'expression erroné" -#: parser.yy:650 parser.yy:1159 +#: parser.yy:859 parser.yy:1458 parser.yy:1503 msgid "not a context mod" msgstr "ceci n'est pas un module de contexte" -#: parser.yy:853 -msgid "score expected" -msgstr "On attendait une partition" +#: parser.yy:1054 +msgid "Missing music in \\score" +msgstr "Il n'y a pas de musique dans ce \\score" -#: parser.yy:869 +#: parser.yy:1091 msgid "\\paper cannot be used in \\score, use \\layout instead" msgstr "dans la section \\score, utiliser \\layout au lieu de \\paper" -#: parser.yy:893 +#: parser.yy:1126 +msgid "Spurious expression in \\score" +msgstr "Expression invalide dans \\score" + +#: parser.yy:1156 msgid "need \\paper for paper block" msgstr "\\paper est nécessaire pour définir les paramètres de la page" -#: parser.yy:1033 parser.yy:1055 +#: parser.yy:1331 +msgid "music expected" +msgstr "On attendait de la musique" + +#: parser.yy:1341 parser.yy:1375 msgid "unexpected post-event" msgstr "« post-event » inattendu" -#: parser.yy:1063 +#: parser.yy:1383 msgid "Ignoring non-music expression" msgstr "Expression non musicale ignorée" -#: parser.yy:1075 parser.yy:2493 -msgid "music expected" -msgstr "On attendait de la musique" - -#: parser.yy:1370 +#: parser.yy:1691 msgid "not a symbol" msgstr "n'est pas un symbole" -#: parser.yy:2182 parser.yy:2296 parser.yy:2309 parser.yy:2318 +#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627 msgid "bad grob property path" msgstr "chemin erroné d'accès à la propriété de « grob »" -#: parser.yy:2276 +#: parser.yy:2585 msgid "only \\consists and \\remove take non-string argument." msgstr "seuls \\consists et \\remove peuvent prendre un argument autre qu'une chaîne." -#: parser.yy:2337 +#: parser.yy:2646 msgid "bad context property path" msgstr "chemin erroné d'accès à la propriété de contexte" -#: parser.yy:2438 +#: parser.yy:2733 msgid "simple string expected" msgstr "On attendait une chaîne simple" -#: parser.yy:2456 +#: parser.yy:2750 msgid "symbol expected" msgstr "symbole requis" -#: parser.yy:2611 +#: parser.yy:2886 msgid "not a rhythmic event" msgstr "événement non rythmique" -#: parser.yy:2685 +#: parser.yy:2936 msgid "post-event expected" msgstr "On attendait un « post-event »" -#: parser.yy:2694 parser.yy:2699 +#: parser.yy:2945 parser.yy:2950 msgid "have to be in Lyric mode for lyrics" msgstr "Des paroles requièrent d'utiliser le mode Lyric." -#: parser.yy:2767 -msgid "expecting string as script definition" -msgstr "chaîne requise pour définir un script" +#: parser.yy:3026 +msgid "expecting string or post-event as script definition" +msgstr "chaîne ou « post-event » requis pour définir un script" -#: parser.yy:2875 +#: parser.yy:3130 msgid "not an articulation" msgstr "n'est pas une articulation" -#: parser.yy:2947 parser.yy:2990 +#: parser.yy:3202 parser.yy:3245 msgid "not a duration" msgstr "ceci n'est pas une durée" -#: parser.yy:3007 +#: parser.yy:3266 msgid "bass number expected" msgstr "On attendait un numéro de basse" -#: parser.yy:3106 +#: parser.yy:3358 msgid "have to be in Note mode for notes" msgstr "Des notes requièrent d'utiliser le mode Note." -#: parser.yy:3166 +#: parser.yy:3397 msgid "have to be in Chord mode for chords" msgstr "Des accords requièrent d'utiliser le mode Chord." -#: parser.yy:3181 +#: parser.yy:3440 msgid "markup outside of text script or \\lyricmode" msgstr "« markup » en dehors d'un script textuel ou de \\lyricmode" -#: parser.yy:3186 +#: parser.yy:3445 msgid "unrecognized string, not in text script or \\lyricmode" msgstr "chaîne non reconnue ; en dehors d'un script textuel ou de \\lyricmode" -#: parser.yy:3347 parser.yy:3356 +#: parser.yy:3597 parser.yy:3606 msgid "not an unsigned integer" msgstr "n'est pas un entier sans signe" -#: parser.yy:3424 +#: parser.yy:3693 msgid "not a markup" msgstr "n'est pas un « markup »" -#: lexer.ll:224 +#: lexer.ll:193 msgid "stray UTF-8 BOM encountered" msgstr "parasitage par UTF-8 BOM" -#: lexer.ll:227 +#: lexer.ll:196 msgid "Skipping UTF-8 BOM" msgstr "Escamotage d'UTF-8 BOM" -#: lexer.ll:279 +#: lexer.ll:248 #, c-format msgid "Renaming input to: `%s'" msgstr "L'entrée a été renommée en « %s »" -#: lexer.ll:296 +#: lexer.ll:265 msgid "quoted string expected after \\version" msgstr "\\version doit être suivi d'une chaîne entre guillemets" -#: lexer.ll:300 +#: lexer.ll:269 msgid "quoted string expected after \\sourcefilename" msgstr "\\sourcefilename doit être suivi d'une chaîne entre guillemets" -#: lexer.ll:304 +#: lexer.ll:273 msgid "integer expected after \\sourcefileline" msgstr "\\sourcefilename doit être suivi d'un nombre entier" -#: lexer.ll:331 +#: lexer.ll:300 msgid "\\maininput not allowed outside init files" msgstr "\\maininput n'est pas permis en dehors des fichiers d'initialisation" -#: lexer.ll:355 +#: lexer.ll:324 #, c-format msgid "wrong or undefined identifier: `%s'" msgstr "identificateur erroné ou non défini : « %s »" -#: lexer.ll:381 +#: lexer.ll:349 msgid "string expected after \\include" msgstr "\\include doit être suivi d'une chaîne entre guillemets" -#: lexer.ll:391 +#: lexer.ll:359 msgid "end quote missing" msgstr "absence de guillemet fermant" -#: lexer.ll:743 +#: lexer.ll:714 msgid "EOF found inside a comment" msgstr "Fin de fichier (EOF) à l'intérieur du commentaire" -#: lexer.ll:748 +#: lexer.ll:719 msgid "EOF found inside string" msgstr "Fin de fichier (EOF) à l'intérieur d'une chaîne" -#: lexer.ll:763 +#: lexer.ll:734 msgid "Unfinished main input" msgstr "Fichier principal non fini" -#: lexer.ll:834 +#: lexer.ll:805 #, c-format msgid "invalid character: `%s'" msgstr "caractère invalide : « %s »" -#: lexer.ll:963 +#: lexer.ll:925 #, c-format msgid "unknown escaped string: `\\%s'" msgstr "chaîne d'échappement inconnue : « \\%s »" -#: lexer.ll:983 +#: lexer.ll:945 #, c-format msgid "undefined character or shorthand: %s" msgstr "caractère ou raccourci non défini : %s" -#: lexer.ll:1275 +#: lexer.ll:1236 msgid "non-UTF-8 input" msgstr "la source n'est pas en UTF-8" -#: lexer.ll:1319 +#: lexer.ll:1280 +#, c-format +msgid "Invalid version string \"%s\"" +msgstr "Numérotation de version \"%s\" invalide" + +#: lexer.ll:1285 #, c-format msgid "file too old: %s (oldest supported: %s)" msgstr "" "%s est plus qu'obsolète ;\n" "le plus ancien pouvant être supporté est %s" -#: lexer.ll:1320 +#: lexer.ll:1286 msgid "consider updating the input with the convert-ly script" msgstr "Envisagez la mise à jour de la source à l'aide du script convert-ly" -#: lexer.ll:1326 +#: lexer.ll:1292 #, c-format msgid "program too old: %s (file requires: %s)" msgstr "Programme plus qu'obsolète : %s (le fichier requiert %s)" +#: auto-beam.scm:147 +msgid "Beam end fits no pattern" +msgstr "La terminaison de ligature ne correspond à aucun modèle" + #: backend-library.scm:27 #, scheme-format msgid "Invoking `~a'..." @@ -3558,24 +3548,34 @@ msgstr "Appel de « ~a »..." msgid "`~a' failed (~a)\n" msgstr "échec de « ~a » (~a)\n" -#: backend-library.scm:93 +#: backend-library.scm:108 #, scheme-format msgid "Converting to `~a'...\n" msgstr "Conversion à « ~a »...\n" #. Do not try to guess the name of the png file, #. GS produces PNG files like BASE-page%d.png. -#: backend-library.scm:102 +#: backend-library.scm:118 #, scheme-format msgid "Converting to ~a..." msgstr "Conversion à « ~a »..." -#: backend-library.scm:140 +#: backend-library.scm:134 +#, scheme-format +msgid "Copying to `~a'...\n" +msgstr "Copie vers « ~a »...\n" + +#: backend-library.scm:200 +#, scheme-format +msgid "Deleting `~a'...\n" +msgstr "Suppression de « ~a »...\n" + +#: backend-library.scm:219 #, scheme-format msgid "Writing header field `~a' to `~a'..." msgstr "écriture du champ d'entête « ~a » dans « ~a »..." -#: backend-library.scm:189 +#: backend-library.scm:268 #, scheme-format msgid "missing stencil expression `~S'" msgstr "absence d'expression stencil « ~S »" @@ -3624,164 +3624,153 @@ msgstr "Information incompréhensible à la suite de l'accord « ~A »" msgid "symbol ~S redefined" msgstr "symbole « ~S » redéfini" -#: define-event-classes.scm:73 +#: define-event-classes.scm:74 #, scheme-format msgid "unknown parent class `~a'" msgstr "Classe parente inconnue : « ~a »" -#: define-event-classes.scm:107 +#: define-event-classes.scm:108 #, scheme-format msgid "Cannot redefine event class `~S'" msgstr "Impossible de redéfinir la classe d'événement « ~S »" -#: define-event-classes.scm:109 +#: define-event-classes.scm:110 #, scheme-format msgid "Undefined parent event class `~S'" msgstr "Classe d'événement parente « ~a » non définie" -#: define-markup-commands.scm:1083 +#: define-markup-commands.scm:1098 msgid "no systems found in \\score markup, does it have a \\layout block?" msgstr "" "pas de système trouvé dans le bloc \\score du « markup » ;\n" " contient-il un bloc \\layout ?" -#: define-markup-commands.scm:2847 +#: define-markup-commands.scm:2922 #, scheme-format msgid "Cannot find glyph ~a" msgstr "impossible de trouver le glyphe « ~a »" -#: define-markup-commands.scm:3273 +#: define-markup-commands.scm:3398 #, scheme-format msgid "no brace found for point size ~S " msgstr "il n'y a pas d'accolade qui fasse ~S points" -#: define-markup-commands.scm:3274 +#: define-markup-commands.scm:3399 #, scheme-format msgid "defaulting to ~S pt" msgstr "application de la taille par défaut (~S pt)" -#: define-markup-commands.scm:3526 +#: define-markup-commands.scm:3643 #, scheme-format msgid "not a valid duration string: ~a" msgstr "chaîne de durée invalide : ~a" -#: define-markup-commands.scm:3737 +#: define-markup-commands.scm:3854 #, scheme-format msgid "not a valid duration string: ~a - ignoring" msgstr "chaîne de durée invalide : ~a -- ignorée" -#: define-music-types.scm:792 +#: define-music-types.scm:803 #, scheme-format msgid "symbol expected: ~S" msgstr "symbole requis : ~S" -#: define-music-types.scm:795 +#: define-music-types.scm:806 #, scheme-format msgid "cannot find music object: ~S" msgstr "impossible de trouver l'objet de type musique : ~S" -#: define-music-types.scm:815 +#: define-music-types.scm:826 #, scheme-format msgid "bad make-music argument: ~S" msgstr "argument de make-music erronné : ~S" -#: define-music-types.scm:827 -#, scheme-format -msgid "unknown repeat type `~S'" -msgstr "type de répétition inconnu : « ~S »" - -#: define-music-types.scm:828 -msgid "See define-music-types.scm for supported repeats" -msgstr "" -"Consulter define-music-types.scm pour connaître les répétitions\n" -" prises en charge" - -#: define-note-names.scm:972 +#: define-note-names.scm:1000 msgid "Select note names language." msgstr "Sélection de la langue des noms de note." -#: define-note-names.scm:978 +#: define-note-names.scm:1006 #, scheme-format msgid "Using `~a' note names..." msgstr "Utilisation de « ~a » pour le nom des notes..." -#: define-note-names.scm:981 +#: define-note-names.scm:1009 #, scheme-format msgid "Could not find language `~a'. Ignoring." msgstr "" "« ~a » n'est pas une langue reconnue pour les noms de note.\n" " Abandon." -#: document-backend.scm:132 +#: document-backend.scm:135 #, scheme-format msgid "pair expected in doc ~s" msgstr "le document ~s devrait contenir une paire" -#: document-backend.scm:189 +#: document-backend.scm:202 #, scheme-format msgid "cannot find interface for property: ~S" msgstr "impossible de trouver l'interface pour la propriété « ~S »" -#: document-backend.scm:199 +#: document-backend.scm:212 #, scheme-format msgid "unknown Grob interface: ~S" msgstr "interface d'objet graphique (Grob) inconnue : ~S" -#: documentation-lib.scm:59 +#: documentation-lib.scm:62 #, scheme-format msgid "Processing ~S..." msgstr "Traitement de « ~S »..." -#: documentation-lib.scm:176 +#: documentation-lib.scm:178 #, scheme-format msgid "Writing ~S..." msgstr "Écriture de « ~S »..." -#: documentation-lib.scm:188 +#: documentation-lib.scm:190 #, scheme-format msgid "cannot find description for property `~S' (~S)" msgstr "" "impossible de trouver une description de la propriété « ~S »\n" " (~S)" -#: documentation-lib.scm:209 +#: documentation-lib.scm:211 #, scheme-format msgid "cannot find description for property ~S (~S)" msgstr "" "impossible de trouver une description de la propriété « ~S »\n" " (~S)" -#: flag-styles.scm:162 +#: flag-styles.scm:155 #, scheme-format msgid "flag stroke `~a' or `~a' not found" msgstr "type de crochet inconnu : « ~a » ou « ~a »" -#: framework-eps.scm:108 +#: framework-eps.scm:112 #, scheme-format msgid "Writing ~a..." msgstr "Écriture de « ~a »..." -#: framework-ps.scm:250 +#: framework-ps.scm:281 #, scheme-format msgid "cannot embed ~S=~S" msgstr "intégration impossible : ~S=~S" -#: framework-ps.scm:293 +#: framework-ps.scm:324 #, scheme-format msgid "cannot extract file matching ~a from ~a" msgstr "impossible d'extraire le fichier « ~a » à partir de « ~a »" -#: framework-ps.scm:311 +#: framework-ps.scm:342 #, scheme-format msgid "do not know how to embed ~S=~S" msgstr "imposible de réaliser l'intégration ~S=~S" -#: framework-ps.scm:336 +#: framework-ps.scm:367 #, scheme-format msgid "do not know how to embed font ~s ~s ~s" msgstr "impossible d'intégrer les fontes ~s ~s ~s" -#: framework-ps.scm:687 +#: framework-ps.scm:723 msgid "" "\n" "The PostScript backend does not support the\n" @@ -3842,7 +3831,7 @@ msgstr "Impossible de repérer un context-def (définition de contexte) \\~a" msgid "Music unsuitable for output-def" msgstr "Inadéquation entre la musique et le output-def" -#: lily-library.scm:884 +#: lily-library.scm:904 msgid "" "Find the index between @var{start} and @var{end} (an integer)\n" "which produces the closest match to @var{target-val} if\n" @@ -3852,53 +3841,53 @@ msgstr "" "(nombre entier) qui soit le plus proche de @var{valeur-cible}\n" "lorsqu'appliqué à la fonction @var{appelant}." -#: lily-library.scm:955 +#: lily-library.scm:998 #, scheme-format msgid "unknown unit: ~S" msgstr "unité inconnue : ~S" -#: lily-library.scm:980 +#: lily-library.scm:1023 #, scheme-format msgid "no \\version statement found, please add~afor future compatibility" msgstr "" "déclaration de \\version absente ;\n" " ajoutez ~a pour une compatibilité future" -#: lily.scm:75 +#: lily.scm:93 msgid "call-after-session used after session start" msgstr "call-after-session utilisé après le début de la session" -#: lily.scm:93 +#: lily.scm:111 msgid "define-session used after session start" msgstr "define-session utilisé après le début de la session" -#: lily.scm:393 +#: lily.scm:417 msgid "Using (ice-9 curried-definitions) module\n" msgstr "Utilisation du module (ice-9 curried-definitions)\n" -#: lily.scm:396 +#: lily.scm:420 msgid "Guile 1.8\n" msgstr "Guile 1.8\n" -#: lily.scm:455 +#: lily.scm:477 #, scheme-format msgid "cannot find: ~A" msgstr "impossible de trouver « ~A »" -#: lily.scm:878 +#: lily.scm:903 msgid "Success: compilation successfully completed" msgstr "Compilation menée à son terme, avec succès." -#: lily.scm:879 +#: lily.scm:904 msgid "Compilation completed with warnings or errors" msgstr "Compilation menée à son terme, avec des avertissements ou erreurs." -#: lily.scm:940 +#: lily.scm:965 #, scheme-format msgid "job ~a terminated with signal: ~a" msgstr "le travail « ~a » s'est terminé avec le signal ~a" -#: lily.scm:943 +#: lily.scm:968 #, scheme-format msgid "" "logfile ~a (exit ~a):\n" @@ -3907,38 +3896,33 @@ msgstr "" "fichier journal « ~a » (sortie ~a) :\n" "~a" -#: lily.scm:965 lily.scm:1054 +#: lily.scm:990 lily.scm:1079 #, scheme-format msgid "failed files: ~S" msgstr "erreur sur les fichiers ~S" -#: lily.scm:1045 +#: lily.scm:1070 #, scheme-format msgid "Redirecting output to ~a..." msgstr "Redirection de la sortie vers « ~a »..." -#: lily.scm:1064 ps-to-png.scm:66 +#: lily.scm:1089 #, scheme-format msgid "Invoking `~a'...\n" msgstr "Appel de « ~a »...\n" -#: ly-syntax-constructors.scm:66 +#: ly-syntax-constructors.scm:27 #, scheme-format msgid "~a function cannot return ~a" msgstr "La fonction ~a ne peut retourner ~a." -#: ly-syntax-constructors.scm:75 +#: ly-syntax-constructors.scm:60 #, scheme-format msgid "wrong type for argument ~a. Expecting ~a, found ~s" msgstr "" "type d'argument erroné pour ~a.\n" " Attendait ~a, ~s trouvé" -#: ly-syntax-constructors.scm:199 -#, scheme-format -msgid "Invalid property operation ~a" -msgstr "Opération de propriété invalide : ~a" - #: markup-macros.scm:331 #, scheme-format msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" @@ -3982,60 +3966,89 @@ msgstr "hauteur d'inversion absente de la gamme : rien à transposer" msgid "negative replication count; ignoring" msgstr "compteur de réplication négatif : rien à transposer" -#: music-functions.scm:272 +#: music-functions.scm:319 +#, scheme-format +msgid "invalid tremolo repeat count: ~a" +msgstr "nombre de répétition en trémolo invalide : ~a" + +#: music-functions.scm:348 +#, scheme-format +msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo" +msgstr "type de répétition « ~S » inconnu : doit être volta, unfold, percent ou tremolo" + +#: music-functions.scm:352 msgid "More alternatives than repeats. Junking excess alternatives" msgstr "" "Plus d'alternatives que de répétitions.\n" " Escamotage des alternatives surnuméraires." -#: music-functions.scm:303 -#, scheme-format -msgid "invalid tremolo repeat count: ~a" -msgstr "nombre de répétition en trémolo invalide : ~a" - -#: music-functions.scm:459 +#: music-functions.scm:487 #, scheme-format msgid "bad grob property path ~a" msgstr "chemin d'accès au « grob » erroné : ~a" -#: music-functions.scm:753 +#: music-functions.scm:511 +#, scheme-format +msgid "bad context property ~a" +msgstr "propriété de contexte ~a erronée" + +#: music-functions.scm:534 +#, scheme-format +msgid "bad music property ~a" +msgstr "propriété musicale ~a erronée" + +#: music-functions.scm:840 msgid "Bad chord repetition" msgstr "Mauvaise répétition d'accord" -#: music-functions.scm:788 +#: music-functions.scm:945 #, scheme-format msgid "music expected: ~S" msgstr "~S requiert de la musique" -#: music-functions.scm:1144 +#: music-functions.scm:1295 #, scheme-format msgid "cannot find quoted music: `~S'" msgstr "impossible de trouver la citation de musique « ~S »" -#: music-functions.scm:1282 +#: music-functions.scm:1432 msgid "Add @var{octave-shift} to the octave of @var{pitch}." msgstr "Ajoute @var{octave-shift} à l'octave de @var{hauteur}." -#: music-functions.scm:1342 +#: music-functions.scm:1495 #, scheme-format msgid "Unknown octaveness type: ~S " msgstr "Octave inconnue : « ~S »" -#: music-functions.scm:1343 +#: music-functions.scm:1496 msgid "Defaulting to 'any-octave." msgstr "Application de la valeur par défaut 'any-octave." -#: music-functions.scm:1688 +#: music-functions.scm:1888 #, scheme-format msgid "unknown accidental style: ~S" msgstr "style d'altération inconnu : ~S" -#: output-ps.scm:278 output-svg.scm:539 +#: music-functions.scm:2098 +msgid "Missing duration" +msgstr "Durée absente" + +#: music-functions.scm:2626 +#, scheme-format +msgid "not a symbol list: ~a" +msgstr "n'est pas une liste de symboles : ~a" + +#: music-functions.scm:2629 +#, scheme-format +msgid "conflicting tag group ~a" +msgstr "groupe de balises (tag) ~a conflictuel" + +#: output-ps.scm:290 output-svg.scm:539 #, scheme-format msgid "unknown line-cap-style: ~S" msgstr "line-cap-style inconnu : ~S" -#: output-ps.scm:283 output-svg.scm:545 +#: output-ps.scm:295 output-svg.scm:545 #, scheme-format msgid "unknown line-join-style: ~S" msgstr "line-join-style inconnu : ~S" @@ -4054,91 +4067,96 @@ msgstr "Un glyphe doit avoir une valeur unicode" msgid "cannot find SVG font ~S" msgstr "fonte SVG « ~S » introuvable." -#: paper.scm:120 +#: paper.scm:121 msgid "set-global-staff-size: not in toplevel scope" msgstr "set-global-staff-size n'est pas à un niveau de portée globale" -#: paper.scm:320 +#: paper.scm:321 #, scheme-format msgid "This is not a \\layout {} object, ~S" msgstr "~S n'est pas un objet de \\layout {}" -#: paper.scm:328 +#: paper.scm:329 #, scheme-format msgid "Unknown paper size: ~a" msgstr "Format de papier inconnu : ~a" #. TODO: should raise (generic) exception with throw, and catch #. that in parse-scm.cc -#: paper.scm:347 +#: paper.scm:348 msgid "Must use #(set-paper-size .. ) within \\paper { ... }" msgstr "#(set-paper-size ..) doit être dans la section \\paper { ... }" -#: parser-clef.scm:164 +#: parser-clef.scm:154 #, scheme-format msgid "unknown clef type `~a'" msgstr "type de clef inconnu : « ~a »" -#: parser-clef.scm:165 +#: parser-clef.scm:155 #, scheme-format msgid "supported clefs: ~a" msgstr "clefs reconnues : ~a" -#: parser-ly-from-scheme.scm:74 +#: parser-ly-from-scheme.scm:73 msgid "error in #{ ... #}" msgstr "erreur dans #{ ... #}" -#: part-combiner.scm:598 +#: part-combiner.scm:894 #, scheme-format msgid "quoted music `~a' is empty" msgstr "il n'y a rien à reproduire dans « ~a »" -#: ps-to-png.scm:70 +#: ps-to-png.scm:72 ps-to-png.scm:75 +#, scheme-format +msgid "Copying `~a' to `~a'..." +msgstr "Copie de « ~a » en « ~a »..." + +#: ps-to-png.scm:77 ps-to-png.scm:79 #, scheme-format -msgid "~a exited with status: ~S" -msgstr "~a s'est terminé avec le statut ~S" +msgid "Deleting `~a'..." +msgstr "Suppression de « ~a »..." #: to-xml.scm:190 #, scheme-format msgid "assertion failed: ~S" msgstr "erreur d'assertion : ~S" -#: translation-functions.scm:368 +#: translation-functions.scm:389 #, scheme-format msgid "Negative fret for pitch ~a on string ~a" msgstr "La hauteur « ~a » sur la corde « ~a » donne un fret négatif" -#: translation-functions.scm:371 +#: translation-functions.scm:392 #, scheme-format msgid "Missing fret for pitch ~a on string ~a" msgstr "Aucun fret pour « ~a » sur la corde « ~a »" -#: translation-functions.scm:414 +#: translation-functions.scm:435 #, scheme-format msgid "No open string for pitch ~a" msgstr "Pas de corde à vide pour la hauteur « ~a »" -#: translation-functions.scm:429 translation-functions.scm:441 +#: translation-functions.scm:450 translation-functions.scm:462 #, scheme-format msgid "Requested string for pitch requires negative fret: string ~a pitch ~a" msgstr "" "Hauteur et corde requises demandent un fret négatif :\n" " corde « ~a » hauteur « ~a »" -#: translation-functions.scm:432 +#: translation-functions.scm:453 msgid "Ignoring string request and recalculating." msgstr "Cette corde sera ignorée et redéfinie." -#: translation-functions.scm:444 +#: translation-functions.scm:465 msgid "Ignoring note in tablature." msgstr "Cette note sera ignorée dans la tablature." -#: translation-functions.scm:469 +#: translation-functions.scm:490 #, scheme-format msgid "No string for pitch ~a (given frets ~a)" msgstr "Aucune corde ne contient la hauteur « ~a » avec un fret « ~a »" -#: translation-functions.scm:574 +#: translation-functions.scm:595 #, scheme-format msgid "" "No label for fret ~a (on string ~a);\n" diff --git a/po/it.po b/po/it.po index f427b73c21..01ed7f9a84 100644 --- a/po/it.po +++ b/po/it.po @@ -4,22 +4,22 @@ # # Tineke de Munnik , 1998. # Maurizio Umberto Puxeddu , 1999 -# Federico Bruni , 2009-2012, 2012, 2013. +# Federico Bruni , 2009-2012, 2012, 2013, 2015. # msgid "" msgstr "" -"Project-Id-Version: lilypond 2.17.96\n" +"Project-Id-Version: lilypond 2.19.26\n" "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n" -"POT-Creation-Date: 2013-11-24 12:14+0000\n" -"PO-Revision-Date: 2013-11-29 00:27+0100\n" -"Last-Translator: Federico Bruni \n" +"POT-Creation-Date: 2015-08-27 10:48+0100\n" +"PO-Revision-Date: 2015-09-02 05:46+0200\n" +"Last-Translator: Federico Bruni \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n!=1);\n" -"X-Generator: Gtranslator 2.91.6\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Gtranslator 2.91.7\n" #: book_base.py:26 #, python-format @@ -39,11 +39,11 @@ msgstr "impossibile trovare \\begin{document} nel documento LaTeX" msgid "Running `%s' on file `%s' to detect default page settings.\n" msgstr "Esecuzione di \"%s\" sul file \"%s\" per individuare le impostazioni predefinite della pagina.\n" -#: book_latex.py:212 book_texinfo.py:228 +#: book_latex.py:219 book_texinfo.py:228 msgid "Unable to auto-detect default settings:\n" msgstr "Impossibile individuare automaticamente le impostazioni predefinite:\n" -#: book_latex.py:224 book_texinfo.py:240 +#: book_latex.py:231 book_texinfo.py:240 #, python-format msgid "" "Unable to auto-detect default settings:\n" @@ -52,7 +52,7 @@ msgstr "" "Impossibile individuare le impostazioni predefinite:\n" "%s" -#: book_latex.py:247 +#: book_latex.py:254 msgid "cannot detect textwidth from LaTeX" msgstr "impossibile rilevare la larghezza del testo da LaTeX" @@ -86,31 +86,31 @@ msgstr "l'opzione ly sconosciuta viene ignorata: %s" msgid "Missing files: %s" msgstr "File mancanti: %s" -#: book_snippets.py:651 +#: book_snippets.py:661 #, python-format msgid "Could not overwrite file %s" msgstr "Impossibile scrivere sul file «%s»" -#: book_snippets.py:738 +#: book_snippets.py:748 #, python-format msgid "Running through filter `%s'" msgstr "Esecuzione attraverso il filtro «%s»" -#: book_snippets.py:759 +#: book_snippets.py:769 #, python-format msgid "`%s' failed (%d)" msgstr "«%s» fallito (%d)" -#: book_snippets.py:760 +#: book_snippets.py:770 msgid "The error log is as follows:" msgstr "Il registro dell'errore è il seguente:" -#: book_snippets.py:880 +#: book_snippets.py:890 #, python-format msgid "Converting MusicXML file `%s'...\n" msgstr "Conversione del file MusicXML «%s»...\n" -#: book_snippets.py:907 +#: book_snippets.py:917 #, python-format msgid "" "%s: duplicate filename but different contents of original file,\n" @@ -119,7 +119,7 @@ msgstr "" "%s: il nome del file è duplicato ma i suoi contenuti sono diversi dal\n" "file originale, si mostrano le differenze rispetto al file esistente." -#: book_snippets.py:920 +#: book_snippets.py:930 #, python-format msgid "" "%s: duplicate filename but different contents of converted lilypond file,\n" @@ -170,7 +170,7 @@ msgstr "\\textstyle deprecato, nuova sintassi per \\key" #: convertrules.py:82 convertrules.py:1856 convertrules.py:2032 #: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801 -#: convertrules.py:3151 convertrules.py:3385 +#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700 msgid "bump version for release" msgstr "aumentare il numero di versione per il rilascio" @@ -590,10 +590,10 @@ msgstr "Elimina oldaddlyrics" #: convertrules.py:2820 msgid "" "oldaddlyrics is no longer supported. \n" -" Use addlyrics or lyrsicsto instead.\n" +" Use addlyrics or lyricsto instead.\n" msgstr "" "oldaddlyrics non è più supportato.\n" -" Usa addlyrics o lyrsicsto al suo posto.\n" +" Usare addlyrics o lyrsicsto al suo posto.\n" #: convertrules.py:2826 msgid "" @@ -622,8 +622,8 @@ msgid "\\bar \".\" now produces a thick barline.\n" msgstr "\\bar \".\" ora crea una stanghetta spessa.\n" #: convertrules.py:2849 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" -msgstr "I parametri del tratteggiato per le legature di portamento e di valore si trovano ora in 'dash-details.\n" +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" +msgstr "I parametri del tratteggiato per le legature di portamento e di valore si trovano ora in 'dash-definition.\n" #: convertrules.py:2854 msgid "" @@ -833,15 +833,15 @@ msgstr "consistent-broken-slope viene ora gestito attraverso la callback delle p msgid "input/regression/beam-broken-classic.ly shows how broken beams are now handled.\n" msgstr "input/regression/beam-broken-classic.ly mostra come vengono gestite ora le travature spezzate.\n" -#: convertrules.py:3369 +#: convertrules.py:3372 msgid "beamExceptions controls whole-measure beaming." msgstr "beamExceptions controlla la disposizione delle travature sull'intera misura." -#: convertrules.py:3606 +#: convertrules.py:3609 msgid "Flag.transparent and Flag.color inherit from Stem" msgstr "Flag.transparent e Flag.color ereditano da Stem" -#: convertrules.py:3672 +#: convertrules.py:3675 msgid "Staff-padding now controls the distance to the baseline, not the nearest point." msgstr "La spaziatura del rigo (padding) ora controlla la distanza rispetto alla linea di base, non più rispetto al punto più vicino." @@ -947,12 +947,12 @@ msgstr "Si è inserita un'ottava di alterazione di tonalità per un numero di al msgid "Unable to find instrument for ID=%s\n" msgstr "Impossibile trovare lo strumento con ID=%s\n" -#: abc2ly.py:1386 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 +#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 #, python-format msgid "%s [OPTION]... FILE" msgstr "%s [OPZIONE]... FILE" -#: abc2ly.py:1387 +#: abc2ly.py:1390 #, python-format msgid "" "abc2ly converts ABC music files (see\n" @@ -961,29 +961,29 @@ msgstr "" "abc2ly converte file musicali ABC (si veda\n" "%s) in input LilyPond.\n" -#: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 -#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:181 +#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 +#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184 msgid "show version number and exit" msgstr "mostra il numero di versione ed esce" -#: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 -#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:160 +#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 +#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163 msgid "show this help and exit" msgstr "mostra questo messaggio di aiuto ed esce" -#: abc2ly.py:1401 etf2ly.py:1209 midi2ly.py:1071 +#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071 msgid "write output to FILE" msgstr "scrive l'output in FILE" -#: abc2ly.py:1404 +#: abc2ly.py:1407 msgid "be strict about success" msgstr "è severo rispetto all'esito" -#: abc2ly.py:1407 +#: abc2ly.py:1410 msgid "preserve ABC's notion of beams" msgstr "preserva la nozione di travatura di ABC" -#: abc2ly.py:1410 +#: abc2ly.py:1413 msgid "suppress progress messages" msgstr "sopprime i messaggi di avanzamento" @@ -991,8 +991,8 @@ msgstr "sopprime i messaggi di avanzamento" #. "Report bugs in English via %s", #. or if there is a LilyPond users list or forum in your language #. "Report bugs in English via %s or in YOUR_LANG via URI" -#: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 -#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:315 +#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 +#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318 #, c-format, python-format msgid "Report bugs via %s" msgstr "Segnalare i bug in inglese attraverso %s" @@ -1043,7 +1043,7 @@ msgid "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS msgstr "Mostra i messaggi di log in base a LOGLEVEL (NONE, ERROR, WARNING, PROGRESS (default), DEBUG)" #: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181 -#: musicxml2ly.py:2629 main.cc:174 +#: musicxml2ly.py:2629 main.cc:177 msgid "LOGLEVEL" msgstr "LOGLEVEL" @@ -1075,7 +1075,7 @@ msgid "make a numbered backup [default: filename.ext~]" msgstr "crea un file di backup numerato (predefinito: nomefile.est~)" #: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096 -#: main.cc:183 +#: main.cc:186 msgid "show warranty and copyright" msgstr "mostra la garanzia e il copyright" @@ -1096,17 +1096,17 @@ msgstr "Fermarsi all'ultima regola riuscita" msgid "Processing `%s'... " msgstr "Elaborazione di «%s»... " -#: convert-ly.py:367 +#: convert-ly.py:366 #, python-format msgid "%s: Unable to open file" msgstr "%s: Impossibile aprire il file" -#: convert-ly.py:373 +#: convert-ly.py:372 #, python-format msgid "%s: Unable to determine version. Skipping" msgstr "%s: Impossibile determinare la versione. Tralasciato" -#: convert-ly.py:379 +#: convert-ly.py:378 #, python-format msgid "" "%s: Invalid version string `%s' \n" @@ -1115,7 +1115,7 @@ msgstr "" "%s: Stringa di versione non valida `%s' \n" "Le stringhe di versione valide sono composte da tre numeri separati da punti, ad esempio «2.8.12»" -#: convert-ly.py:385 +#: convert-ly.py:384 #, python-format msgid "There was %d error." msgid_plural "There were %d errors." @@ -1136,7 +1136,7 @@ msgstr "" "etf2ly converte un sottoinsieme di ETF in un file LilyPond pronto da usare.\n" #: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659 -#: main.cc:166 main.cc:178 +#: main.cc:169 main.cc:181 msgid "FILE" msgstr "FILE" @@ -1174,7 +1174,7 @@ msgid "add DIR to include path" msgstr "aggiunge DIR al percorso di inclusione" #: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169 -#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:165 +#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168 msgid "DIR" msgstr "DIR" @@ -1184,10 +1184,10 @@ msgstr "formatta l'output di Texinfo in modo che Info cerchi le immagini in DIR" #: lilypond-book.py:155 msgid "PAD" -msgstr "PAD" +msgstr "SPAZIATURA" #: lilypond-book.py:157 -msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)" +msgid "pad left side of music to align music in spite of uneven bar numbers (in mm)" msgstr "aumenta il lato sinistro della musica (in mm) per allinearla nonostante il numero irregolare di battute" #: lilypond-book.py:162 @@ -1323,17 +1323,17 @@ msgstr "Elaborazione di include: %s" msgid "Removing `%s'" msgstr "Eliminazione di «%s»" -#: lilypond-book.py:714 +#: lilypond-book.py:727 #, python-format msgid "Setting LilyPond's loglevel to %s" msgstr "Si imposta il loglevel di LilyPond su %s" -#: lilypond-book.py:718 +#: lilypond-book.py:731 #, python-format msgid "Setting LilyPond's loglevel to %s (from environment variable LILYPOND_LOGLEVEL)" msgstr "Si imposta il loglevel di LilyPond su %s (dalla variabile d'ambiente LILYPOND_LOGLEVEL)" -#: lilypond-book.py:721 +#: lilypond-book.py:734 msgid "Setting LilyPond's output to --verbose, implied by lilypond-book's setting" msgstr "Si imposta l'output di LilyPond su --verbose, come implicato dall'impostazione di lilypond-book" @@ -1552,12 +1552,12 @@ msgstr "" #: musicxml2ly.py:2576 msgid "" -"Copyright (c) 2005--2012 by\n" +"Copyright (c) 2005--2015 by\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen and\n" " Reinhold Kainhofer \n" msgstr "" -"Copyright (c) 2005--2012 di\n" +"Copyright (c) 2005--2015 di\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen e\n" " Reinhold Kainhofer \n" @@ -1643,15 +1643,15 @@ msgstr "Output inviato a «%s»" msgid "Unable to find input file %s" msgstr "Impossibile trovare il file di input %s" -#: website_post.py:125 +#: website_post.py:129 msgid "English" msgstr "Inglese" -#: website_post.py:128 +#: website_post.py:132 msgid "Other languages" msgstr "Altre lingue" -#: website_post.py:129 +#: website_post.py:133 #, python-format msgid "About automatic language selection." msgstr "Informazioni sulla selezione automatica della lingua." @@ -1726,21 +1726,21 @@ msgstr "avvertimento soppresso: %s" msgid "accidental typesetting list must begin with context-name: %s" msgstr "la lista tipografica delle alterazioni deve iniziare con context-name: %s" -#: accidental-engraver.cc:210 +#: accidental-engraver.cc:207 #, c-format msgid "procedure or context-name expected for accidental rule, found %s" msgstr "si aspettava una procedura o context-name per la regola di alterazione accidentale, si è trovato %s" -#: accidental.cc:169 +#: accidental.cc:141 #, c-format msgid "Could not find glyph-name for alteration %s" msgstr "Non si è trovato il nome del glifo per l'alterazione %s" -#: accidental.cc:184 +#: accidental.cc:157 msgid "natural alteration glyph not found" msgstr "alterazione naturale del glifo non trovata" -#: all-font-metrics.cc:149 +#: all-font-metrics.cc:159 #, c-format msgid "cannot find font: `%s'" msgstr "impossibile trovare il tipo di carattere: «%s»" @@ -1753,11 +1753,6 @@ msgstr "l'argomento di \\applycontext non è una procedura" msgid "no heads for arpeggio found?" msgstr "non sono state trovate teste per l'arpeggio?" -#: auto-change-iterator.cc:74 change-iterator.cc:72 -#, c-format -msgid "cannot change, already in translator: %s" -msgstr "impossibile cambiare, già nel traduttore: %s" - #: axis-group-engraver.cc:149 msgid "Axis_group_engraver: vertical group already has a parent" msgstr "Axis_group_engraver: il gruppo verticale ha già un genitore" @@ -1770,12 +1765,12 @@ msgstr "ci sono due Axis_group_engravers?" msgid "removing this vertical group" msgstr "eliminazione di questo gruppo verticale" -#: axis-group-interface.cc:714 +#: axis-group-interface.cc:716 #, c-format msgid "\"%s\" is not a valid outside-staff-placement-directive" msgstr "non si può posizionare un oggetto fuori dal rigo con \"%s\" (outside-staff-placement-directive)" -#: axis-group-interface.cc:786 +#: axis-group-interface.cc:788 msgid "an outside-staff object should have a direction, defaulting to up" msgstr "un oggetto esterno al rigo dovrebbe avere una direzione, si imposta in su come da impostazione predefinita" @@ -1805,11 +1800,11 @@ msgid "beam was started here" msgstr "la travatura è iniziata qui" #. We are completely screwed. -#: beam-quanting.cc:839 +#: beam-quanting.cc:850 msgid "no viable initial configuration found: may not find good beam slope" msgstr "nessuna configurazione iniziale fattibile trovata: si potrebbe non trovare una buona inclinazione delle travature" -#: beam.cc:181 +#: beam.cc:183 msgid "removing beam with no stems" msgstr "rimozione delle travature senza gambi" @@ -1819,22 +1814,24 @@ msgid "cannot change `%s' to `%s'" msgstr "impossibile cambiare «%s» in «%s»" #. FIXME: constant error message. -#: change-iterator.cc:93 +#: change-iterator.cc:67 msgid "cannot find context to switch to" msgstr "impossibile trovare il contesto su cui spostarsi" +#. No enclosing context was found because the iterator's immediate +#. context is the kind that was sought. #. We could change the current translator's id, but that would make #. errors hard to catch. #. #. last->translator_id_string () = get_change #. ()->change_to_id_string (); -#: change-iterator.cc:102 +#: change-iterator.cc:78 #, c-format msgid "not changing to same context type: %s" msgstr "non passare allo stesso tipo di contesto: %s" -#. FIXME: uncomprehensable message -#: change-iterator.cc:106 +#. FIXME: incomprehensible message +#: change-iterator.cc:82 msgid "none of these in my family" msgstr "nessuno di questi nella mia famiglia" @@ -1869,26 +1866,26 @@ msgstr "Coherent_ligature_engraver: impostare `spacing-increment=0.01': ptr=%ul" msgid "cannot find line breaking that satisfies constraints" msgstr "impossibile trovare interruzioni di linea che soddisfino i vincoli" -#: context-property.cc:43 +#: context-property.cc:46 msgid "need symbol arguments for \\override and \\revert" msgstr "sono necessari argomenti simbolici per \\override e \\revert" -#: context.cc:149 +#: context.cc:144 #, c-format msgid "cannot find or create new `%s'" msgstr "impossibile trovare o creare un nuovo «%s»" -#: context.cc:228 +#: context.cc:223 #, c-format msgid "cannot find or create `%s' called `%s'" msgstr "impossibile trovare o creare «%s» chiamato «%s»" -#: context.cc:425 +#: context.cc:416 #, c-format msgid "cannot find or create: `%s'" msgstr "impossibile trovare o creare: «%s»" -#: context.cc:439 +#: context.cc:430 #, c-format msgid "cannot find or create new Bottom = \"%s\"" msgstr "impossibile trovare o creare un nuovo Bottom = «%s»" @@ -1898,20 +1895,20 @@ msgstr "impossibile trovare o creare un nuovo Bottom = «%s»" msgid "custos `%s' not found" msgstr "custos «%s» non trovato" -#: dispatcher.cc:89 +#: dispatcher.cc:82 msgid "Event class should be a list" msgstr "La classe evento dovrebbe essere una lista" -#: dispatcher.cc:172 +#: dispatcher.cc:165 #, c-format msgid "Junking event: %s" msgstr "Eliminazione dell'evento: %s" -#: dispatcher.cc:277 +#: dispatcher.cc:279 msgid "Attempting to remove nonexisting listener." msgstr "Tentativo di togliere un ascoltatore non esistente." -#: dispatcher.cc:303 +#: dispatcher.cc:305 msgid "Already listening to dispatcher, ignoring request" msgstr "Già in ascolto del controllore, si ignora la richiesta" @@ -1920,7 +1917,7 @@ msgstr "Già in ascolto del controllore, si ignora la richiesta" msgid "dot `%s' not found" msgstr "punto «%s» non trovato" -#: dynamic-engraver.cc:168 +#: dynamic-engraver.cc:169 #, c-format msgid "" "unknown crescendo style: %s\n" @@ -1929,7 +1926,7 @@ msgstr "" "stile di crescendo sconosciuto: %s\n" "si usa la forcella predefinita." -#: dynamic-engraver.cc:233 slur-proto-engraver.cc:119 +#: dynamic-engraver.cc:234 slur-proto-engraver.cc:119 #, c-format msgid "unterminated %s" msgstr "%s non terminato" @@ -1957,22 +1954,22 @@ msgstr "episema non terminato" msgid "unterminated extender" msgstr "estensore non terminato" -#: flag.cc:134 +#: flag.cc:133 #, c-format msgid "flag `%s' not found" msgstr "non si trova la coda uncinata «%s»" -#: flag.cc:154 +#: flag.cc:153 #, c-format msgid "flag stroke `%s' not found" msgstr "non si trova il tratto «%s» della coda uncinata" -#: font-config-scheme.cc:151 font-config.cc:53 +#: font-config-scheme.cc:151 font-config.cc:82 #, c-format msgid "failed adding font directory: %s" msgstr "errore nell'aggiungere la directory dei tipi di carattere: %s" -#: font-config-scheme.cc:153 font-config.cc:55 +#: font-config-scheme.cc:153 font-config.cc:84 #, c-format msgid "Adding font directory: %s" msgstr "Si aggiunge la directory dei tipi di carattere: %s" @@ -1991,7 +1988,17 @@ msgstr "Si aggiunge il file dei tipi di carattere: %s" msgid "Initializing FontConfig..." msgstr "Inizializzazione di FontConfig..." -#: font-config.cc:58 +#: font-config.cc:70 +#, c-format +msgid "failed to add fontconfig configuration file `%s'" +msgstr "errore nell'aggiungere il file di configurazione di fontconfig: «%s»" + +#: font-config.cc:73 +#, c-format +msgid "Adding fontconfig configuration file: %s" +msgstr "Si aggiunge il file di configurazione di fontconfig: %s" + +#: font-config.cc:86 msgid "Building font database..." msgstr "Creazione del database dei tipi di carattere..." @@ -1999,12 +2006,12 @@ msgstr "Creazione del database dei tipi di carattere..." msgid "Must be footnote-event." msgstr "Deve essere un evento nota a pié di pagina (footnote-event)." -#: general-scheme.cc:390 +#: general-scheme.cc:403 #, c-format msgid "failed redirecting stderr to `%s'" msgstr "fallita la redirezione di stderr su «%s»" -#: general-scheme.cc:469 output-ps.scm:48 +#: general-scheme.cc:482 output-ps.scm:48 msgid "Found infinity or nan in output. Substituting 0.0" msgstr "Trovato infinito o un valore non numerico nell'output. Sostituito con 0.0" @@ -2055,12 +2062,12 @@ msgstr "Interfaccia «%s» sconosciuta" msgid "Grob `%s' has no interface for property `%s'" msgstr "Il grob «%s» non ha un'interfaccia per la proprietà «%s»" -#: grob-property.cc:35 +#: grob-property.cc:33 #, c-format msgid "%d: %s" msgstr "%d: %s" -#: grob.cc:488 +#: grob.cc:492 #, c-format msgid "ignored infinite %s-offset" msgstr "%s-offset infinito ignorato" @@ -2069,7 +2076,7 @@ msgstr "%s-offset infinito ignorato" msgid "Asking for broken bound padding at a non-broken bound." msgstr "Si chiede la spaziatura per un'estremità spezzata in un'estremità non spezzata." -#: hairpin.cc:256 +#: hairpin.cc:257 msgid "decrescendo too small" msgstr "decrescendo troppo piccolo" @@ -2089,7 +2096,7 @@ msgstr "eliminazione di un trattino non terminato" msgid "unterminated hyphen; removing" msgstr "trattino non terminato; eliminazione" -#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108 +#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108 #, c-format msgid "cannot find file: `%s'" msgstr "impossibile trovare il file: «%s»" @@ -2099,11 +2106,11 @@ msgstr "impossibile trovare il file: «%s»" msgid "(search path: `%s')" msgstr "(percorso di ricerca: «%s»)" -#: input.cc:138 source-file.cc:178 source-file.cc:193 +#: input.cc:138 source-file.cc:180 source-file.cc:195 msgid "position unknown" msgstr "posizione sconosciuta" -#: key-engraver.cc:198 +#: key-engraver.cc:197 msgid "Incomplete keyAlterationOrder for key signature" msgstr "keyAlterationOrder incompleto per l'armatura di chiave" @@ -2144,21 +2151,21 @@ msgstr "pausa ignorata: la legatura non può contenere una pausa" msgid "ligature was started here" msgstr "la legatura è iniziata qui" -#: lily-guile.cc:93 +#: lily-guile.cc:94 #, c-format msgid "(load path: `%s')" msgstr "(percorso di caricamento: «%s»)" -#: lily-guile.cc:412 +#: lily-guile.cc:413 #, c-format msgid "cannot find property type-check for `%s' (%s)." msgstr "impossibile trovare la proprietà type-check per «%s» (%s)." -#: lily-guile.cc:415 +#: lily-guile.cc:416 msgid "perhaps a typing error?" msgstr "forse un errore di digitazione?" -#: lily-guile.cc:422 +#: lily-guile.cc:423 msgid "skipping assignment" msgstr "assegnazione saltata" @@ -2167,20 +2174,33 @@ msgstr "assegnazione saltata" msgid "type check for `%s' failed; value `%s' must be of type `%s'" msgstr "controllo del tipo per «%s» fallito; il valore «%s» deve essere del tipo «%s»" -#: lily-lexer.cc:249 +#. Uh oh. unsmob delivered 0, yet +#. unsmob delivers true. This means that unsmob is a +#. matching check from a base class of T, but var is of an +#. incompatible derived type. +#: lily-guile.cc:462 +msgid "Wrong kind of " +msgstr "Tipo errato di" + +#: lily-lexer.cc:251 msgid "include files are not allowed in safe mode" msgstr "l'inclusione di file non è permessa in modalità sicura" -#: lily-lexer.cc:276 +#: lily-lexer.cc:278 #, c-format msgid "identifier name is a keyword: `%s'" msgstr "Il nome dell'identificatore è una parola chiave: «%s»" -#: lily-lexer.cc:297 lily-lexer.cc:310 +#: lily-lexer.cc:299 lily-lexer.cc:312 #, c-format msgid "%s:EOF" msgstr "%s:EOF" +#: lily-modules.cc:81 +#, c-format +msgid "Uninitialized variable `%s' in module (%s)" +msgstr "Variabile «%s» non inizializzata nel modulo (%s)" + #: lily-parser-scheme.cc:80 #, c-format msgid "Changing working directory to: `%s'" @@ -2201,37 +2221,33 @@ msgstr "impossibile trovare il file di init: «%s»" msgid "Processing `%s'" msgstr "Elaborazione di «%s»" -#: lily-parser-scheme.cc:209 +#: lily-parser-scheme.cc:210 msgid "ly:parser-parse-string is only valid with a new parser. Use ly:parser-include-string instead." msgstr "ly:parser-parse-string è valido solo con un nuovo parser. Usare ly:parser-include-string al suo posto." -#: lily-parser-scheme.cc:240 +#: lily-parser-scheme.cc:241 msgid "ly:parse-string-expression is only valid with a new parser. Use ly:parser-include-string instead." msgstr "ly:parse-string-expression è valido solo con un nuovo parser. Usare ly:parser-include-string al suo posto." -#: lily-parser.cc:107 +#: lily-parser.cc:106 msgid "Parsing..." msgstr "Analisi..." -#: lookup.cc:181 +#: lookup.cc:178 #, c-format msgid "Not drawing a box with negative dimension, %.2f by %.2f." msgstr "Il riquadro con dimensioni negative, %.2f per %.2f, non verrà disegnato." -#: lyric-combine-music-iterator.cc:199 +#: lyric-combine-music-iterator.cc:204 msgid "argument of \\lyricsto should contain Lyrics context" msgstr "l'argomento di \\lyricsto deve contenere il contesto Lyrics" -#: lyric-combine-music-iterator.cc:337 +#: lyric-combine-music-iterator.cc:344 #, c-format -msgid "cannot find Voice `%s'" -msgstr "impossibile trovare la voce (Voice) «%s»" +msgid "cannot find %s `%s'" +msgstr "impossibile trovare %s «%s»" -#: lyric-engraver.cc:186 -msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." -msgstr "Le sillabe del testo non hanno note. Usare \\lyricsto o associatedVoice." - -#: main.cc:104 +#: main.cc:106 #, c-format msgid "" "This program is free software. It is covered by the GNU General Public\n" @@ -2243,7 +2259,7 @@ msgstr "" "License che permette di modificarlo o distribuirne copie rispettando certe\n" "condizioni. Per maggiori informazioni, invocare «%s --warranty».\n" -#: main.cc:110 +#: main.cc:112 msgid "" " This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License as \n" @@ -2275,11 +2291,11 @@ msgstr "" "Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n" "Boston, MA 02111-1307, USA.\n" -#: main.cc:148 +#: main.cc:150 msgid "SYM[=VAL]" msgstr "SIMBOLO[=VALORE]" -#: main.cc:149 +#: main.cc:151 msgid "" "set Scheme option SYM to VAL (default: #t).\n" "Use -dhelp for help." @@ -2287,41 +2303,45 @@ msgstr "" "imposta l'opzione di Scheme SIMBOLO a VALORE (predefinito: #t).\n" "Usare -dhelp per ottenere aiuto." -#: main.cc:153 +#: main.cc:155 msgid "EXPR" msgstr "ESPRESSIONE" -#: main.cc:153 +#: main.cc:155 msgid "evaluate scheme code" msgstr "valuta il codice scheme" #. Bug in option parser: --output =foe is taken as an abbreviation #. for --output-format. -#: main.cc:156 +#: main.cc:158 msgid "FORMATs" msgstr "FORMATO" -#: main.cc:156 +#: main.cc:158 msgid "dump FORMAT,... Also as separate options:" msgstr "scarica FORMATO,... Anche come opzioni separate:" -#: main.cc:157 +#: main.cc:159 msgid "generate PDF (default)" msgstr "genera PDF (predefinito)" -#: main.cc:158 +#: main.cc:160 msgid "generate PNG" msgstr "genera PNG" -#: main.cc:159 +#: main.cc:161 msgid "generate PostScript" msgstr "genera PostScript" #: main.cc:162 +msgid "generate big PDF files" +msgstr "genera grandi file PDF" + +#: main.cc:165 msgid "FIELD" msgstr "CAMPO" -#: main.cc:162 +#: main.cc:165 msgid "" "dump header field FIELD to file\n" "named BASENAME.FIELD" @@ -2329,19 +2349,19 @@ msgstr "" "scrive il campo di intestazione CAMPO sul\n" "file chiamato BASENAME.CAMPO" -#: main.cc:165 +#: main.cc:168 msgid "add DIR to search path" msgstr "aggiunge DIRECTORY ai percorsi di ricerca" -#: main.cc:166 +#: main.cc:169 msgid "use FILE as init file" msgstr "usa FILE come file di inizializzazione" -#: main.cc:169 +#: main.cc:172 msgid "USER, GROUP, JAIL, DIR" msgstr "UTENTE, GRUPPO, GABBIA, DIRECTORY" -#: main.cc:169 +#: main.cc:172 msgid "" "chroot to JAIL, become USER:GROUP\n" "and cd into DIR" @@ -2349,7 +2369,7 @@ msgstr "" "chroot a GABBIA, diventa UTENTE:GRUPPO\n" "ed entra in DIRECTORY" -#: main.cc:174 +#: main.cc:177 msgid "" "print log messages according to LOGLEVEL. Possible values are:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG." @@ -2357,24 +2377,24 @@ msgstr "" "mostra i messaggi di log in base a LOGLEVEL. I valori possibili sono:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) e DEBUG." -#: main.cc:178 +#: main.cc:181 msgid "write output to FILE (suffix will be added)" msgstr "scrive l'output su FILE (verrà aggiunto un suffisso)" -#: main.cc:179 +#: main.cc:182 msgid "relocate using directory of lilypond program" msgstr "trasferisce alla directory del programma lilypond" -#: main.cc:180 +#: main.cc:183 msgid "no progress, only error messages (equivalent to loglevel=ERROR)" msgstr "nessun progresso, solo messaggi di errore (equivalente al loglevel=ERROR)" -#: main.cc:182 +#: main.cc:185 msgid "be verbose (equivalent to loglevel=DEBUG)" msgstr "output dettagliato (equivalente al loglevel=DEBUG)" #. Do not update the copyright years here, run `make grand-replace' -#: main.cc:261 +#: main.cc:264 #, c-format msgid "" "Copyright (c) %s by\n" @@ -2384,84 +2404,84 @@ msgstr "" "%s e altri." #. No version number or newline here. It confuses help2man. -#: main.cc:299 +#: main.cc:302 #, c-format msgid "Usage: %s [OPTION]... FILE..." msgstr "Uso: %s [OPZIONE]... [FILE]..." -#: main.cc:301 +#: main.cc:304 msgid "Typeset music and/or produce MIDI from FILE." msgstr "Stampa partitura oppure crea MIDI da FILE." -#: main.cc:303 +#: main.cc:306 msgid "LilyPond produces beautiful music notation." msgstr "LilyPond produce bella notazione musicale." -#: main.cc:305 +#: main.cc:308 #, c-format msgid "For more information, see %s" msgstr "Per maggiori informazioni si veda %s" -#: main.cc:307 +#: main.cc:310 msgid "Options:" msgstr "Opzioni:" -#: main.cc:374 +#: main.cc:377 #, c-format msgid "expected %d arguments with jail, found: %u" msgstr "previsti gli argomenti %d per la gabbia, trovati: %u" -#: main.cc:388 +#: main.cc:391 #, c-format msgid "no such user: %s" msgstr "non esiste questo utente: %s" -#: main.cc:390 +#: main.cc:393 #, c-format msgid "cannot get user id from user name: %s: %s" msgstr "impossibile acquisire l'id dell'utente dal nome utente: %s: %s" -#: main.cc:405 +#: main.cc:408 #, c-format msgid "no such group: %s" msgstr "non esiste questo gruppo: %s" -#: main.cc:407 +#: main.cc:410 #, c-format msgid "cannot get group id from group name: %s: %s" msgstr "impossibile acquisire l'id del gruppo dal nome del gruppo: %s:%s" -#: main.cc:415 +#: main.cc:418 #, c-format msgid "cannot chroot to: %s: %s" msgstr "non si può fare il chroot a: %s: %s" -#: main.cc:422 +#: main.cc:425 #, c-format msgid "cannot change group id to: %d: %s" msgstr "non si può cambiare l'id del gruppo in: %d: %s" -#: main.cc:428 +#: main.cc:431 #, c-format msgid "cannot change user id to: %d: %s" msgstr "non si può cambiare l'id dell'utente in: %d: %s" -#: main.cc:434 +#: main.cc:437 #, c-format msgid "cannot change working directory to: %s: %s" msgstr "non si può passare alla directory di lavoro: %s: %s" -#: main.cc:805 +#: main.cc:826 #, c-format msgid "exception caught: %s" msgstr "ricevuta un'eccezione: %s" #. FIXME: constant error message. -#: mark-engraver.cc:156 +#: mark-engraver.cc:150 msgid "rehearsalMark must have integer value" msgstr "rehearsalMark deve avere un valore intero" -#: mark-engraver.cc:162 +#: mark-engraver.cc:156 msgid "mark label must be a markup object" msgstr "l'etichetta del segno deve essere un oggetto di markup" @@ -2513,7 +2533,7 @@ msgstr "" msgid "unexpected case fall-through" msgstr "caso inatteso e non interpretabile" -#: midi-control-function-performer.cc:109 staff-performer.cc:152 +#: midi-control-function-performer.cc:107 staff-performer.cc:153 #, c-format msgid "ignoring out-of-range value change for MIDI property `%s'" msgstr "si ignora il cambio in un valore fuori dai limiti per la proprietà MIDI «%s»" @@ -2537,7 +2557,7 @@ msgstr "impossibile aprire il file con permesso di scrittura: %s: %s" msgid "cannot write to file: `%s'" msgstr "impossibile scrivere su file: «%s»" -#: minimal-page-breaking.cc:40 paper-score.cc:122 +#: minimal-page-breaking.cc:40 paper-score.cc:116 msgid "Calculating line breaks..." msgstr "Calcolo delle interruzioni di linea..." @@ -2545,28 +2565,15 @@ msgstr "Calcolo delle interruzioni di linea..." msgid "Calculating page breaks..." msgstr "Calcolo delle interruzioni di pagina..." -#: multi-measure-rest.cc:154 +#: multi-measure-rest.cc:152 msgid "usable-duration-logs must be a non-empty list. Falling back to whole rests." msgstr "usable-duration-logs deve essere una lista non vuota. Si ricorre alle pause di semibreve." -#: multi-measure-rest.cc:364 -msgid "Using naive multi measure rest spacing." -msgstr "Si usa una spaziatura semplificata per la pausa multipla" - #: music.cc:150 #, c-format msgid "octave check failed; expected \"%s\", found: \"%s\"" msgstr "controllo dell'ottava fallito: previsto \"%s\", trovato: \"%s\"" -#: music.cc:219 -msgid "(normalized pitch)" -msgstr "(altezza normalizzata)" - -#: music.cc:223 -#, c-format -msgid "Transposing %s by %s makes alteration larger than double" -msgstr "La trasposizione di %s da %s ingrandisce le alterazioni più del doppio" - #: new-fingering-engraver.cc:113 msgid "cannot add text scripts to individual note heads" msgstr "impossibile aggiungere delle scritte testuali alle teste delle note individuali" @@ -2579,11 +2586,11 @@ msgstr "nessuna posizione trovata per le diteggiature" msgid "placing below" msgstr "si colloca in basso" -#: note-collision.cc:497 -msgid "ignoring too many clashing note columns" -msgstr "troppe collisioni tra colonne di note, ignorate" +#: note-collision.cc:510 +msgid "this Voice needs a \\voiceXx or \\shiftXx setting" +msgstr "questa voce ha bisogno di un'impostazione \\voiceXx o \\shiftXx" -#: note-column.cc:147 +#: note-column.cc:150 msgid "cannot have note heads and rests together on a stem" msgstr "impossibile avere teste e pause insieme su un gambo" @@ -2611,22 +2618,22 @@ msgstr "impossibile caricare la tabella dei tipi di carattere: %s" msgid "FreeType error: %s" msgstr "Errore FreeType: %s" -#: open-type-font.cc:111 +#: open-type-font.cc:115 #, c-format msgid "unsupported font format: %s" msgstr "formato di tipo di carattere non supportato: %s" -#: open-type-font.cc:113 +#: open-type-font.cc:117 #, c-format msgid "error reading font file %s: %s" msgstr "errore nella lettura del file del tipo di carattere %s: %s" -#: open-type-font.cc:188 +#: open-type-font.cc:192 #, c-format msgid "FT_Get_Glyph_Name () Freetype error: %s" msgstr "errore di Freetype in FT_Get_Glyph_Name (): %s" -#: open-type-font.cc:336 pango-font.cc:256 +#: open-type-font.cc:340 pango-font.cc:258 #, c-format msgid "FT_Get_Glyph_Name () error: %s" msgstr "errore in FT_Get_Glyph_Name (): %s" @@ -2664,93 +2671,94 @@ msgstr "tentando %d sistemi" msgid "best score for this sys-count: %f" msgstr "miglior punteggio per questo numero di sistemi: %f" -#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:248 -#: paper-score.cc:162 +#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249 +#: paper-score.cc:156 msgid "Drawing systems..." msgstr "Disegno dei sistemi..." -#: output-def.cc:235 +#: output-def.cc:229 msgid "margins do not fit with line-width, setting default values" msgstr "i margini non corrispondono con la larghezza del rigo, si impostano i valori predefiniti" -#: output-def.cc:242 +#: output-def.cc:236 msgid "systems run off the page due to improper paper settings, setting default values" msgstr "i sistemi escono fuori dalla pagina a causa di errate impostazioni del foglio, si impostano i valori predefiniti" -#: page-breaking.cc:277 +#: page-breaking.cc:276 msgid "ignoring min-systems-per-page and max-systems-per-page because systems-per-page was set" msgstr "si ignorano min-systems-per-page e max-systems-per-page perché è stato impostato systems-per-page" -#: page-breaking.cc:282 +#: page-breaking.cc:281 msgid "min-systems-per-page is larger than max-systems-per-page, ignoring both values" msgstr "min-systems-per-page è maggiore di max-systems-per-page, si ignorano entrambi i valori" -#: page-layout-problem.cc:402 +#: page-breaking.cc:636 +#, c-format +msgid "page %d has been compressed" +msgstr "la pagina %d è stata compressa" + +#: page-layout-problem.cc:400 msgid "A page layout problem has been initiated that cannot accommodate footnotes." msgstr "Si è creato un problema di formattazione della pagina che impedisce di ospitare le note a pié di pagina." -#: page-layout-problem.cc:731 -msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" -msgstr "impossibile far entrare la musica nella pagina: richiesta la spaziatura ridotta, ma la pagina è già stata compressa" +#: page-layout-problem.cc:729 +msgid "ragged-bottom was specified, but page must be compressed" +msgstr "è stato specificato ragged-bottom, ma la pagina deve essere compressa" -#: page-layout-problem.cc:734 +#: page-layout-problem.cc:732 #, c-format -msgid "cannot fit music on page: overflow is %f" -msgstr "impossibile far entrare la musica nella pagina: l'eccesso è %f" - -#: page-layout-problem.cc:736 -msgid "compressing music to fit" -msgstr "si comprime la musica per farla entrare" +msgid "compressing over-full page by %.1f staff-spaces" +msgstr "compressione di una pagina strapiena di %.1f spazi rigo" -#: page-layout-problem.cc:1199 +#: page-layout-problem.cc:1197 msgid "staff-affinities should only decrease" msgstr "staff-affinities deve solo diminuire" -#: page-turn-page-breaking.cc:168 +#: page-turn-page-breaking.cc:169 #, c-format msgid "page-turn-page-breaking: breaking from %d to %d" msgstr "page-turn-page-breaking: interruzione da %d a %d" -#: page-turn-page-breaking.cc:217 +#: page-turn-page-breaking.cc:218 msgid "cannot fit the first page turn onto a single page. Consider setting first-page-number to an even number." msgstr "impossibile far entrare il primo cambio di pagina in una pagina singola. Si consideri la possibilità di impostare first-page-number su un numero pari." -#: page-turn-page-breaking.cc:230 +#: page-turn-page-breaking.cc:231 #, c-format msgid "Calculating page and line breaks (%d possible page breaks)..." msgstr "Calcolo delle interruzioni di pagina e di linea (%d possibili interruzioni di pagina)..." -#: page-turn-page-breaking.cc:300 +#: page-turn-page-breaking.cc:301 #, c-format msgid "break starting at page %d" msgstr "l'interruzione comincia alla pagina %d" -#: page-turn-page-breaking.cc:301 +#: page-turn-page-breaking.cc:302 #, c-format msgid "\tdemerits: %f" msgstr "\tdemeriti: %f" -#: page-turn-page-breaking.cc:302 +#: page-turn-page-breaking.cc:303 #, c-format msgid "\tsystem count: %d" msgstr "\tnumero dei sistemi: %d" -#: page-turn-page-breaking.cc:303 +#: page-turn-page-breaking.cc:304 #, c-format msgid "\tpage count: %d" msgstr "\tnumero delle pagine: %d" -#: page-turn-page-breaking.cc:304 +#: page-turn-page-breaking.cc:305 #, c-format msgid "\tprevious break: %d" msgstr "\tinterruzione precedente: %d" -#: pango-font.cc:245 +#: pango-font.cc:247 #, c-format msgid "no glyph for character U+%0X in font `%s'" msgstr "manca il glifo per il carattere U+%0X del tipo \"%s\"" -#: pango-font.cc:272 +#: pango-font.cc:274 #, c-format msgid "" "Glyph has no name, but font supports glyph naming.\n" @@ -2759,21 +2767,21 @@ msgstr "" "Il glifo non ha un nome, ma il tipo di carattere permette di dare un nome al glifo.\n" "Si salta il glifo U+%0X, file %s" -#: pango-font.cc:322 +#: pango-font.cc:324 #, c-format msgid "no PostScript font name for font `%s'" msgstr "nessun nome di tipo di carattere PostScript per «%s»" -#: pango-font.cc:372 +#: pango-font.cc:374 msgid "FreeType face has no PostScript font name" msgstr "Il tipo FreeType non ha un nome per il tipo di carattere PostScript" -#: paper-book.cc:214 +#: paper-book.cc:200 #, c-format msgid "program option -dprint-pages not supported by backend `%s'" msgstr "l'opzione -dprint-pages del programma non è supportata dal backend «%s»" -#: paper-book.cc:233 +#: paper-book.cc:219 #, c-format msgid "program option -dpreview not supported by backend `%s'" msgstr "l'opzione -dpreview del programma non è supportata dal backend «%s»" @@ -2787,37 +2795,33 @@ msgstr "l'interruzione forzata è stata sovrascritta da qualche altro evento, co msgid "Layout output to `%s'..." msgstr "Output della formattazione inviato a «%s»..." -#: paper-score.cc:134 +#: paper-score.cc:128 #, c-format msgid "Element count %d (spanners %d) " msgstr "Conto degli elementi %d (spanner %d)." -#: paper-score.cc:138 +#: paper-score.cc:132 msgid "Preprocessing graphical objects..." msgstr "Pre-elaborazione degli oggetti grafici..." -#: parse-scm.cc:121 +#: parse-scm.cc:124 msgid "GUILE signaled an error for the expression beginning here" msgstr "GUILE ha segnalato un errore per l'espressione che inizia qui" -#: partial-iterator.cc:45 -msgid "trying to use \\partial after the start of a piece" -msgstr "tentativo di usare \\partial all'inizio di un brano" - #: pdf-scheme.cc:65 #, c-format msgid "Conversion of string `%s' to UTF-16be failed: %s" msgstr "Fallita la conversione della stringa \"%s\" in UTF-16be: %s" -#: percent-repeat-engraver.cc:147 +#: percent-repeat-engraver.cc:148 msgid "unterminated percent repeat" msgstr "ripetizione percentuale non terminata" -#: performance.cc:54 +#: performance.cc:76 msgid "Track..." msgstr "Traccia..." -#: performance.cc:82 +#: performance.cc:126 #, c-format msgid "MIDI output to `%s'..." msgstr "L'output MIDI è inviato a «%s»..." @@ -2843,7 +2847,7 @@ msgstr "impossibile trovare la parentesi di apertura del pedale del pianoforte: msgid "no such internal option: %s" msgstr "opzione interna sconosciuta: %s" -#: property-iterator.cc:100 +#: property-iterator.cc:115 #, c-format msgid "not a grob name, `%s'" msgstr "non è il nome di un grob, «%s»" @@ -2852,25 +2856,25 @@ msgstr "non è il nome di un grob, «%s»" msgid "Failed octave check, got: " msgstr "Il controllo dell'ottava è fallito, si è ottenuto:" -#: relocate.cc:52 +#: relocate.cc:56 #, c-format msgid "Setting %s to %s" msgstr "Si imposta %s su %s" #. this warning should only be printed in debug mode! -#: relocate.cc:73 +#: relocate.cc:77 #, c-format msgid "no such file: %s for %s" msgstr "file inesistente: %s per %s" #. this warning should only be printed in debug mode! #. this warning should only be printed in debug mode -#: relocate.cc:84 relocate.cc:102 +#: relocate.cc:88 relocate.cc:106 #, c-format msgid "no such directory: %s for %s" msgstr "directory inesistente: %s per %s" -#: relocate.cc:93 +#: relocate.cc:97 #, c-format msgid "%s=%s (prepend)\n" msgstr "%s=%s (prefisso)\n" @@ -2900,7 +2904,7 @@ msgstr "Rilocazione: è assoluta: argv0=%s\n" msgid "Relocation : from cwd: argv0=%s\n" msgstr "Rilocazione: da cwd: argv0=%s\n" -#: relocate.cc:194 +#: relocate.cc:196 #, c-format msgid "" "Relocation: from PATH=%s\n" @@ -2909,69 +2913,65 @@ msgstr "" "Rilocazione: da PATH=%s\n" "argv0=%s\n" -#: relocate.cc:220 +#: relocate.cc:222 msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR" msgstr "LILYPONDPREFIX è obsoleto, usare LILYPOND_DATADIR" -#: relocate.cc:345 +#: relocate.cc:347 #, c-format msgid "Relocation file: %s" msgstr "File di rilocazione: %s" -#: relocate.cc:349 source-file.cc:65 +#: relocate.cc:351 source-file.cc:65 #, c-format msgid "cannot open file: `%s'" msgstr "impossibile aprire il file: «%s»" -#: relocate.cc:379 +#: relocate.cc:381 #, c-format msgid "Unknown relocation command %s" msgstr "Comando di rilocazione sconosciuto %s" -#: rest-collision-engraver.cc:70 -msgid "rhythmic head is not part of a rhythmic column" -msgstr "la testa ritmica non fa parte di una colonna ritmica" - -#: rest-collision.cc:150 +#: rest-collision.cc:154 msgid "cannot resolve rest collision: rest direction not set" msgstr "impossibile risolvere la collisione di pause: direzione delle pause non impostata" -#: rest-collision.cc:161 rest-collision.cc:270 +#: rest-collision.cc:165 rest-collision.cc:274 msgid "too many colliding rests" msgstr "troppe collisioni tra pause" -#: rest.cc:240 +#: rest.cc:239 #, c-format msgid "rest `%s' not found" msgstr "pausa «%s» non trovata" -#: score-engraver.cc:78 +#: score-engraver.cc:77 #, c-format msgid "cannot find `%s'" msgstr "impossibile trovare «%s»" -#: score-engraver.cc:80 +#: score-engraver.cc:79 msgid "Music font has not been installed properly." msgstr "Il tipo di carattere musicale non è stato installato correttamente." -#: score-engraver.cc:82 +#: score-engraver.cc:81 #, c-format msgid "Search path `%s'" msgstr "Percorso di ricerca «%s»" -#: score-engraver.cc:84 +#: score-engraver.cc:83 msgid "Aborting" msgstr "Si sospende l'esecuzione" -#: score.cc:172 +#: score.cc:161 msgid "already have music in score" msgstr "musica già presente nello spartito" -#: score.cc:173 +#: score.cc:163 msgid "this is the previous music" msgstr "questa è la musica precedente" -#: score.cc:178 +#: score.cc:169 msgid "errors found, ignoring music expression" msgstr "trovati degli errori, si ignora l'espressione musicale" @@ -2984,7 +2984,7 @@ msgstr "non so come interpretare l'articolazione:" msgid " scheme encoding: " msgstr " codifica di Scheme: " -#: skyline-pair.cc:160 +#: skyline-pair.cc:135 msgid "direction must not be CENTER in ly:skyline-pair::skyline" msgstr "in ly:skyline-pair::skyline la direzione non deve essere CENTER" @@ -3010,7 +3010,7 @@ msgstr "%s senza una causa" msgid "cannot end %s" msgstr "impossibile terminare %s" -#: slur.cc:434 +#: slur.cc:436 #, c-format msgid "Ignoring grob for slur: %s. avoid-slur not set?" msgstr "Si ignora il grob per la legatura di portamento: %s. Non si è impostato avoid-slur?" @@ -3028,16 +3028,16 @@ msgstr "Numerazione canale MIDI ricominciata" msgid "remapping modulo 16" msgstr "riassegnata con modulo 16" -#: stem-engraver.cc:110 +#: stem-engraver.cc:100 msgid "tremolo duration is too long" msgstr "la durata del tremolo è troppo lunga" -#: stem-engraver.cc:162 +#: stem-engraver.cc:152 #, c-format msgid "adding note head to incompatible stem (type = %d/%d)" msgstr "si aggiunge la testa della nota a un gambo incompatibile (tipo = %d/%d)" -#: stem-engraver.cc:165 +#: stem-engraver.cc:155 msgid "maybe input should specify polyphonic voices" msgstr "forse l'input dovrebbe specificare le voci polifoniche" @@ -3045,24 +3045,18 @@ msgstr "forse l'input dovrebbe specificare le voci polifoniche" msgid "weird stem size, check for narrow beams" msgstr "strana dimensione del gambo, controllare di non avere travature strette" -#: system.cc:201 +#: system.cc:202 #, c-format msgid "Element count %d" msgstr "Numero degli elementi %d" -#: system.cc:512 +#: system.cc:513 #, c-format msgid "Grob count %d" msgstr "Numero degli oggetti grafici %d" #. TODO: Also print the arguments of the markup! -#: text-interface.cc:129 -#, c-format -msgid "Cyclic markup detected: %s" -msgstr "Individuato un markup ciclico: %s" - -#. TODO: Also print the arguments of the markup! -#: text-interface.cc:142 +#: text-interface.cc:139 #, c-format msgid "Markup depth exceeds maximal value of %d; Markup: %s" msgstr "La profondità di markup eccede il valore massimo di %d; Markup: %s" @@ -3079,11 +3073,11 @@ msgstr "spanner testuale già presente" msgid "unterminated text spanner" msgstr "spanner testuale non terminato" -#: tie-engraver.cc:119 +#: tie-engraver.cc:121 msgid "unterminated tie" msgstr "legatura di valore non terminata" -#: tie-engraver.cc:353 +#: tie-engraver.cc:377 msgid "lonely tie" msgstr "legatura di valore solitaria" @@ -3092,19 +3086,12 @@ msgstr "legatura di valore solitaria" #. #. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. #. -#: time-signature-engraver.cc:75 +#: time-signature-engraver.cc:95 #, c-format msgid "strange time signature found: %d/%d" msgstr "si è incontrato uno strano segno di tempo: %d/%d" -#. If there is no such symbol, we default to the numbered style. -#. (Here really with a warning!) -#: time-signature.cc:89 -#, c-format -msgid "time signature symbol `%s' not found; reverting to numbered style" -msgstr "non si è trovato il simbolo di tempo «%s»: si ritorna allo stile numerato" - -#: translator-ctors.cc:65 +#: translator-ctors.cc:68 #, c-format msgid "unknown translator: `%s'" msgstr "traduttore sconosciuto: «%s»" @@ -3114,17 +3101,17 @@ msgstr "traduttore sconosciuto: «%s»" msgid "fatal error. Couldn't find type: %s" msgstr "errore fatale. Impossibile trovare il tipo: %s" -#: translator-group.cc:188 +#: translator-group.cc:187 #, c-format msgid "cannot find: `%s'" msgstr "impossibile trovare: «%s»" -#: translator.cc:326 +#: translator.cc:310 #, c-format msgid "Two simultaneous %s events, junking this one" msgstr "Due eventi %s simultanei, si butta via questo" -#: translator.cc:327 +#: translator.cc:311 #, c-format msgid "Previous %s event here" msgstr "L'evento %s precedente sta qui" @@ -3189,205 +3176,214 @@ msgstr "è già presente uno spanner terminato" msgid "giving up" msgstr "rinuncia" -#: parser.yy:158 parser.yy:172 -msgid "Too much lookahead" -msgstr "Troppa ricerca in avanti (lookahead)" - -#: parser.yy:441 parser.yy:752 parser.yy:818 +#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248 msgid "bad expression type" msgstr "tipo d'espressione non corretto" -#: parser.yy:650 parser.yy:1159 +#: parser.yy:859 parser.yy:1458 parser.yy:1503 msgid "not a context mod" msgstr "non è una modalità di contesto" -#: parser.yy:853 -msgid "score expected" -msgstr "attesa una partitura" +#: parser.yy:1054 +msgid "Missing music in \\score" +msgstr "Nessuna musica trovata in \\score" -#: parser.yy:869 +#: parser.yy:1091 msgid "\\paper cannot be used in \\score, use \\layout instead" msgstr "non si può usare \\paper dentro \\score, usare \\layout al suo posto" -#: parser.yy:893 +#: parser.yy:1126 +msgid "Spurious expression in \\score" +msgstr "Espressione spuria in \\score" + +#: parser.yy:1156 msgid "need \\paper for paper block" msgstr "è necessario \\paper per il blocco \"paper\"" -#: parser.yy:1033 parser.yy:1055 +#: parser.yy:1331 +msgid "music expected" +msgstr "attesa la musica" + +#: parser.yy:1341 parser.yy:1375 msgid "unexpected post-event" msgstr "«post-event» inatteso" -#: parser.yy:1063 +#: parser.yy:1383 msgid "Ignoring non-music expression" msgstr "Si ignora l'espressione non musicale" -#: parser.yy:1075 parser.yy:2493 -msgid "music expected" -msgstr "attesa la musica" - -#: parser.yy:1370 +#: parser.yy:1691 msgid "not a symbol" msgstr "non è un simbolo" -#: parser.yy:2182 parser.yy:2296 parser.yy:2309 parser.yy:2318 +#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627 msgid "bad grob property path" msgstr "percorso sbagliato alla proprietà del «grob»" -#: parser.yy:2276 +#: parser.yy:2585 msgid "only \\consists and \\remove take non-string argument." msgstr "solo \\consists e \\remove prendono un argomento diverso da una stringa" -#: parser.yy:2337 +#: parser.yy:2646 msgid "bad context property path" msgstr "percorso sbagliato alla proprietà di contesto" -#: parser.yy:2438 +#: parser.yy:2733 msgid "simple string expected" msgstr "attesa una stringa semplice" -#: parser.yy:2456 +#: parser.yy:2750 msgid "symbol expected" msgstr "simbolo atteso" -#: parser.yy:2611 +#: parser.yy:2886 msgid "not a rhythmic event" msgstr "non è un evento ritmico" -#: parser.yy:2685 +#: parser.yy:2936 msgid "post-event expected" msgstr "atteso un post-event" -#: parser.yy:2694 parser.yy:2699 +#: parser.yy:2945 parser.yy:2950 msgid "have to be in Lyric mode for lyrics" msgstr "bisogna essere in modo \"Lyric\" per i testi" -#: parser.yy:2767 -msgid "expecting string as script definition" -msgstr "ci si aspetta una stringa come definizione dello script" +#: parser.yy:3026 +msgid "expecting string or post-event as script definition" +msgstr "ci si aspetta una stringa o un post-event come definizione dello script" -#: parser.yy:2875 +#: parser.yy:3130 msgid "not an articulation" msgstr "non è un'articolazione" -#: parser.yy:2947 parser.yy:2990 +#: parser.yy:3202 parser.yy:3245 msgid "not a duration" msgstr "non è una durata" -#: parser.yy:3007 +#: parser.yy:3266 msgid "bass number expected" msgstr "atteso un numero di basso" -#: parser.yy:3106 +#: parser.yy:3358 msgid "have to be in Note mode for notes" msgstr "bisogna essere in modo \"Note\" per le note" -#: parser.yy:3166 +#: parser.yy:3397 msgid "have to be in Chord mode for chords" msgstr "bisogna essere in modo \"Chord\" per gli accordi" -#: parser.yy:3181 +#: parser.yy:3440 msgid "markup outside of text script or \\lyricmode" msgstr "testo fuori da una scritta testuale o da \\lyricmode" -#: parser.yy:3186 +#: parser.yy:3445 msgid "unrecognized string, not in text script or \\lyricmode" msgstr "stringa non riconosciuta, non si trova in una scritta testuale o in \\lyricmode" -#: parser.yy:3347 parser.yy:3356 +#: parser.yy:3597 parser.yy:3606 msgid "not an unsigned integer" msgstr "non è un intero non negativo" -#: parser.yy:3424 +#: parser.yy:3693 msgid "not a markup" msgstr "non è un markup" -#: lexer.ll:224 +#: lexer.ll:193 msgid "stray UTF-8 BOM encountered" msgstr "si è incontrato un segno BOM UTF-8 isolato" -#: lexer.ll:227 +#: lexer.ll:196 msgid "Skipping UTF-8 BOM" msgstr "Si ignora il BOM UTF-8" -#: lexer.ll:279 +#: lexer.ll:248 #, c-format msgid "Renaming input to: `%s'" msgstr "Si rinomina l'input in: «%s»" -#: lexer.ll:296 +#: lexer.ll:265 msgid "quoted string expected after \\version" msgstr "\\version deve essere seguito da una stringa compresa tra virgolette" -#: lexer.ll:300 +#: lexer.ll:269 msgid "quoted string expected after \\sourcefilename" msgstr "\\sourcefilename deve essere seguito da una stringa compresa tra virgolette" -#: lexer.ll:304 +#: lexer.ll:273 msgid "integer expected after \\sourcefileline" msgstr "\\sourcefileline deve essere seguito da un intero" -#: lexer.ll:331 +#: lexer.ll:300 msgid "\\maininput not allowed outside init files" msgstr "\\maininput non permesso fuori dai file di inizializzazione" -#: lexer.ll:355 +#: lexer.ll:324 #, c-format msgid "wrong or undefined identifier: `%s'" msgstr "indentificatore errato o non definito: «%s»" -#: lexer.ll:381 +#: lexer.ll:349 msgid "string expected after \\include" msgstr "stringa prevista dopo \\include" -#: lexer.ll:391 +#: lexer.ll:359 msgid "end quote missing" msgstr "mancano le virgolette di chiusura" -#: lexer.ll:743 +#: lexer.ll:714 msgid "EOF found inside a comment" msgstr "fine del file (EOF) trovata in un commento" -#: lexer.ll:748 +#: lexer.ll:719 msgid "EOF found inside string" msgstr "fine del file (EOF) trovata in una stringa" -#: lexer.ll:763 +#: lexer.ll:734 msgid "Unfinished main input" msgstr "Input principale non finito" -#: lexer.ll:834 +#: lexer.ll:805 #, c-format msgid "invalid character: `%s'" msgstr "carattere non valido: «%s»" -#: lexer.ll:963 +#: lexer.ll:925 #, c-format msgid "unknown escaped string: `\\%s'" msgstr "stringa di escape sconosciuta: «\\%s»" -#: lexer.ll:983 +#: lexer.ll:945 #, c-format msgid "undefined character or shorthand: %s" msgstr "carattere o abbreviazione non riconosciuti: %s" -#: lexer.ll:1275 +#: lexer.ll:1236 msgid "non-UTF-8 input" msgstr "input non UTF-8" -#: lexer.ll:1319 +#: lexer.ll:1280 +#, c-format +msgid "Invalid version string \"%s\"" +msgstr "Stringa di versione \"%s\" non valida" + +#: lexer.ll:1285 #, c-format msgid "file too old: %s (oldest supported: %s)" msgstr "file troppo vecchio: %s (il più vecchio che si può gestire è: %s)" -#: lexer.ll:1320 +#: lexer.ll:1286 msgid "consider updating the input with the convert-ly script" msgstr "si consideri di aggiornare l'input con lo script convert-ly" -#: lexer.ll:1326 +#: lexer.ll:1292 #, c-format msgid "program too old: %s (file requires: %s)" msgstr "programma troppo vecchio: %s (il file richiede: %s)" +#: auto-beam.scm:147 +msgid "Beam end fits no pattern" +msgstr "Il termine della travatura non soddisfa nessuno schema" + #: backend-library.scm:27 #, scheme-format msgid "Invoking `~a'..." @@ -3398,24 +3394,34 @@ msgstr "Invocazione di «~a»..." msgid "`~a' failed (~a)\n" msgstr "«~a» fallito (~a)\n" -#: backend-library.scm:93 +#: backend-library.scm:108 #, scheme-format msgid "Converting to `~a'...\n" msgstr "Conversione a «~a»...\n" #. Do not try to guess the name of the png file, #. GS produces PNG files like BASE-page%d.png. -#: backend-library.scm:102 +#: backend-library.scm:118 #, scheme-format msgid "Converting to ~a..." msgstr "Conversione a ~a..." -#: backend-library.scm:140 +#: backend-library.scm:134 +#, scheme-format +msgid "Copying to `~a'...\n" +msgstr "Copia su «~a»...\n" + +#: backend-library.scm:200 +#, scheme-format +msgid "Deleting `~a'...\n" +msgstr "Eliminazione di «~a»...\n" + +#: backend-library.scm:219 #, scheme-format msgid "Writing header field `~a' to `~a'..." msgstr "Scrittura del campo di intestazione «~a» in «~a»..." -#: backend-library.scm:189 +#: backend-library.scm:268 #, scheme-format msgid "missing stencil expression `~S'" msgstr "manca l'espressione di stencil «~S»" @@ -3456,154 +3462,145 @@ msgstr "Informazione incomprensibile dopo l'accordo: ~A" msgid "symbol ~S redefined" msgstr "simbolo ~S ridefinito" -#: define-event-classes.scm:73 +#: define-event-classes.scm:74 #, scheme-format msgid "unknown parent class `~a'" msgstr "Classe di evento «~a» sconosciuta" -#: define-event-classes.scm:107 +#: define-event-classes.scm:108 #, scheme-format msgid "Cannot redefine event class `~S'" msgstr "Impossibile ridefinire la classe di evento «~S»" -#: define-event-classes.scm:109 +#: define-event-classes.scm:110 #, scheme-format msgid "Undefined parent event class `~S'" msgstr "Classe di evento genitore «~S» sconosciuta" -#: define-markup-commands.scm:1083 +#: define-markup-commands.scm:1098 msgid "no systems found in \\score markup, does it have a \\layout block?" msgstr "non si è trovato alcun sistema nell'oggetto markup in cui è inserito \\score: contiene un blocco \\layout?" -#: define-markup-commands.scm:2847 +#: define-markup-commands.scm:2922 #, scheme-format msgid "Cannot find glyph ~a" msgstr "Impossibile trovare il glifo ~a" -#: define-markup-commands.scm:3273 +#: define-markup-commands.scm:3398 #, scheme-format msgid "no brace found for point size ~S " msgstr "non c'è una graffa che abbia una dimensione di ~S punti" -#: define-markup-commands.scm:3274 +#: define-markup-commands.scm:3399 #, scheme-format msgid "defaulting to ~S pt" msgstr "si applica la dimensione predefinita ~S pt" -#: define-markup-commands.scm:3526 +#: define-markup-commands.scm:3643 #, scheme-format msgid "not a valid duration string: ~a" msgstr "non è una durata valida per la stringa: ~a" -#: define-markup-commands.scm:3737 +#: define-markup-commands.scm:3854 #, scheme-format msgid "not a valid duration string: ~a - ignoring" msgstr "non è una durata valida per la stringa: ~a -- si ignora" -#: define-music-types.scm:792 +#: define-music-types.scm:803 #, scheme-format msgid "symbol expected: ~S" msgstr "simbolo atteso: ~S" -#: define-music-types.scm:795 +#: define-music-types.scm:806 #, scheme-format msgid "cannot find music object: ~S" msgstr "impossibile trovare l'oggetto musicale: ~S" -#: define-music-types.scm:815 +#: define-music-types.scm:826 #, scheme-format msgid "bad make-music argument: ~S" msgstr "argomento di make-music non valido: ~S" -#: define-music-types.scm:827 -#, scheme-format -msgid "unknown repeat type `~S'" -msgstr "tipo di ripetizione sconosciuto «~S»" - -#: define-music-types.scm:828 -msgid "See define-music-types.scm for supported repeats" -msgstr "Si veda define-music-types.scm per le ripetizioni supportate" - -#: define-note-names.scm:972 +#: define-note-names.scm:1000 msgid "Select note names language." msgstr "Selezione della lingua dei nomi delle note." -#: define-note-names.scm:978 +#: define-note-names.scm:1006 #, scheme-format msgid "Using `~a' note names..." msgstr "Utilizzo di \"~a\" per i nomi delle note..." -#: define-note-names.scm:981 +#: define-note-names.scm:1009 #, scheme-format msgid "Could not find language `~a'. Ignoring." msgstr "Impossibile trovare il linguaggio \"~a\". Si ignora." -#: document-backend.scm:132 +#: document-backend.scm:135 #, scheme-format msgid "pair expected in doc ~s" msgstr "si aspettava una coppia nel documento ~s" -#: document-backend.scm:189 +#: document-backend.scm:202 #, scheme-format msgid "cannot find interface for property: ~S" msgstr "impossibile trovare un'interfaccia per le proprietà: ~S" -#: document-backend.scm:199 +#: document-backend.scm:212 #, scheme-format msgid "unknown Grob interface: ~S" msgstr "interfaccia del Grob sconosciuta: ~S" -#: documentation-lib.scm:59 +#: documentation-lib.scm:62 #, scheme-format msgid "Processing ~S..." msgstr "Elaborazione di ~S..." -#: documentation-lib.scm:176 +#: documentation-lib.scm:178 #, scheme-format msgid "Writing ~S..." msgstr "Scrittura di ~S..." -#: documentation-lib.scm:188 +#: documentation-lib.scm:190 #, scheme-format msgid "cannot find description for property `~S' (~S)" msgstr "impossibile trovare la descrizione per la proprietà \"~S\" (~S)" -#: documentation-lib.scm:209 +#: documentation-lib.scm:211 #, scheme-format msgid "cannot find description for property ~S (~S)" msgstr "impossibile trovare la descrizione per la proprietà ~S (~S)" -#: flag-styles.scm:162 +#: flag-styles.scm:155 #, scheme-format msgid "flag stroke `~a' or `~a' not found" msgstr "tipo di coda uncinata sconosciuto: «~a» o «~a»" -#: framework-eps.scm:108 +#: framework-eps.scm:112 #, scheme-format msgid "Writing ~a..." msgstr "Scrittura di ~a..." -#: framework-ps.scm:250 +#: framework-ps.scm:281 #, scheme-format msgid "cannot embed ~S=~S" msgstr "impossibile inserire ~S=~S" -#: framework-ps.scm:293 +#: framework-ps.scm:324 #, scheme-format msgid "cannot extract file matching ~a from ~a" msgstr "impossibile estrarre il file corrispondente a ~a a partire da ~a" -#: framework-ps.scm:311 +#: framework-ps.scm:342 #, scheme-format msgid "do not know how to embed ~S=~S" msgstr "impossibile realizzare l'integrazione ~S=~S" -#: framework-ps.scm:336 +#: framework-ps.scm:367 #, scheme-format msgid "do not know how to embed font ~s ~s ~s" msgstr "non so come inserire il tipo di carattere ~s ~s ~s" -#: framework-ps.scm:687 +#: framework-ps.scm:723 msgid "" "\n" "The PostScript backend does not support the\n" @@ -3664,7 +3661,7 @@ msgstr "Impossibile trovare context-def \\~a" msgid "Music unsuitable for output-def" msgstr "Musica non adatta per output-def" -#: lily-library.scm:884 +#: lily-library.scm:904 msgid "" "Find the index between @var{start} and @var{end} (an integer)\n" "which produces the closest match to @var{target-val} if\n" @@ -3674,51 +3671,51 @@ msgstr "" "che produca l'abbinamento più vicino al @var{target-val} quando\n" "applicato alla funzione @var{getter}." -#: lily-library.scm:955 +#: lily-library.scm:998 #, scheme-format msgid "unknown unit: ~S" msgstr "unità sconosciuta: ~S" -#: lily-library.scm:980 +#: lily-library.scm:1023 #, scheme-format msgid "no \\version statement found, please add~afor future compatibility" msgstr "dichiarazione di \\version assente; si aggiunga ~a per compatibilità futura" -#: lily.scm:75 +#: lily.scm:93 msgid "call-after-session used after session start" msgstr "call-after-session usato dopo l'inizio di una sessione" -#: lily.scm:93 +#: lily.scm:111 msgid "define-session used after session start" msgstr "define-session usato dopo l'inizio di una sessione" -#: lily.scm:393 +#: lily.scm:417 msgid "Using (ice-9 curried-definitions) module\n" msgstr "Utilizzazione del modulo (ice-9 curried-definitions)\n" -#: lily.scm:396 +#: lily.scm:420 msgid "Guile 1.8\n" msgstr "Guile 1.8\n" -#: lily.scm:455 +#: lily.scm:477 #, scheme-format msgid "cannot find: ~A" msgstr "impossibile trovare ~A" -#: lily.scm:878 +#: lily.scm:903 msgid "Success: compilation successfully completed" msgstr "Successo: compilazione completata con successo" -#: lily.scm:879 +#: lily.scm:904 msgid "Compilation completed with warnings or errors" msgstr "Compilazione completata con avvertimenti o errori" -#: lily.scm:940 +#: lily.scm:965 #, scheme-format msgid "job ~a terminated with signal: ~a" msgstr "il lavoro ~a è terminato col segnale ~a" -#: lily.scm:943 +#: lily.scm:968 #, scheme-format msgid "" "logfile ~a (exit ~a):\n" @@ -3727,36 +3724,31 @@ msgstr "" "file di registro ~a (uscita ~a):\n" "~a" -#: lily.scm:965 lily.scm:1054 +#: lily.scm:990 lily.scm:1079 #, scheme-format msgid "failed files: ~S" msgstr "errore nei file: ~S" -#: lily.scm:1045 +#: lily.scm:1070 #, scheme-format msgid "Redirecting output to ~a..." msgstr "Redirezione dell'output verso ~a..." -#: lily.scm:1064 ps-to-png.scm:66 +#: lily.scm:1089 #, scheme-format msgid "Invoking `~a'...\n" msgstr "Chiamata di «~a»...\n" -#: ly-syntax-constructors.scm:66 +#: ly-syntax-constructors.scm:27 #, scheme-format msgid "~a function cannot return ~a" msgstr "la funzione ~a non può restituire ~a" -#: ly-syntax-constructors.scm:75 +#: ly-syntax-constructors.scm:60 #, scheme-format msgid "wrong type for argument ~a. Expecting ~a, found ~s" msgstr "tipo di argomento errato per ~a. Previsto ~a, trovato ~s" -#: ly-syntax-constructors.scm:199 -#, scheme-format -msgid "Invalid property operation ~a" -msgstr "Operazione di proprietà non valida: ~a" - #: markup-macros.scm:331 #, scheme-format msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" @@ -3796,58 +3788,87 @@ msgstr "altezza da invertire non presente nella scala; si ignora" msgid "negative replication count; ignoring" msgstr "conto di riproduzione negativo; si ignora" -#: music-functions.scm:272 -msgid "More alternatives than repeats. Junking excess alternatives" -msgstr "Più alternative che ripetizioni. Vengono tralasciate le alternative in eccesso" - -#: music-functions.scm:303 +#: music-functions.scm:319 #, scheme-format msgid "invalid tremolo repeat count: ~a" msgstr "numero di ripetizioni di tremolo non valido: ~a" -#: music-functions.scm:459 +#: music-functions.scm:348 +#, scheme-format +msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo" +msgstr "tipo di ripetizione «~S» sconosciuto: deve essere volta, unfold, percent o tremolo" + +#: music-functions.scm:352 +msgid "More alternatives than repeats. Junking excess alternatives" +msgstr "Più alternative che ripetizioni. Vengono tralasciate le alternative in eccesso" + +#: music-functions.scm:487 #, scheme-format msgid "bad grob property path ~a" msgstr "percorso sbagliato alla proprietà del «grob»: ~a" -#: music-functions.scm:753 +#: music-functions.scm:511 +#, scheme-format +msgid "bad context property ~a" +msgstr "proprietà di contesto ~a sbagliata" + +#: music-functions.scm:534 +#, scheme-format +msgid "bad music property ~a" +msgstr "proprietà ~a della musica sbagliata" + +#: music-functions.scm:840 msgid "Bad chord repetition" msgstr "Ripetizione di accordi sbagliata" -#: music-functions.scm:788 +#: music-functions.scm:945 #, scheme-format msgid "music expected: ~S" msgstr "musica attesa: ~S" -#: music-functions.scm:1144 +#: music-functions.scm:1295 #, scheme-format msgid "cannot find quoted music: `~S'" msgstr "impossibile trovare la musica citata: «~S»" -#: music-functions.scm:1282 +#: music-functions.scm:1432 msgid "Add @var{octave-shift} to the octave of @var{pitch}." msgstr "Aggiungere @var{octave-shift} all'ottava di @var{altezza}." -#: music-functions.scm:1342 +#: music-functions.scm:1495 #, scheme-format msgid "Unknown octaveness type: ~S " msgstr "Tipo di ottava sconosciuto: ~S " -#: music-functions.scm:1343 +#: music-functions.scm:1496 msgid "Defaulting to 'any-octave." msgstr "Applicazione del valore predefinito 'any-octave." -#: music-functions.scm:1688 +#: music-functions.scm:1888 #, scheme-format msgid "unknown accidental style: ~S" msgstr "stile di alterazione sconosciuto: ~S" -#: output-ps.scm:278 output-svg.scm:539 +#: music-functions.scm:2098 +msgid "Missing duration" +msgstr "Durata mancante" + +#: music-functions.scm:2626 +#, scheme-format +msgid "not a symbol list: ~a" +msgstr "non è una lista di simboli: ~a" + +#: music-functions.scm:2629 +#, scheme-format +msgid "conflicting tag group ~a" +msgstr "gruppo di etichette (tag) ~a in conflitto" + +#: output-ps.scm:290 output-svg.scm:539 #, scheme-format msgid "unknown line-cap-style: ~S" msgstr "line-cap-style sconosciuto: ~S" -#: output-ps.scm:283 output-svg.scm:545 +#: output-ps.scm:295 output-svg.scm:545 #, scheme-format msgid "unknown line-join-style: ~S" msgstr "line-join-style sconosciuto: ~S" @@ -3866,89 +3887,94 @@ msgstr "Un glifo deve avere un valore unicode" msgid "cannot find SVG font ~S" msgstr "impossibile trovare il tipo di carattere SVG ~S" -#: paper.scm:120 +#: paper.scm:121 msgid "set-global-staff-size: not in toplevel scope" msgstr "set-global-staff-size: non è nell'ambito di livello più alto" -#: paper.scm:320 +#: paper.scm:321 #, scheme-format msgid "This is not a \\layout {} object, ~S" msgstr "Questo non è un oggetto \\layout {}, ~S" -#: paper.scm:328 +#: paper.scm:329 #, scheme-format msgid "Unknown paper size: ~a" msgstr "Dimensione del foglio sconosciuta: ~a" #. TODO: should raise (generic) exception with throw, and catch #. that in parse-scm.cc -#: paper.scm:347 +#: paper.scm:348 msgid "Must use #(set-paper-size .. ) within \\paper { ... }" msgstr "Si deve usare #(set-paper-size .. ) all'interno di \\paper { ... }" -#: parser-clef.scm:164 +#: parser-clef.scm:154 #, scheme-format msgid "unknown clef type `~a'" msgstr "tipo di chiave sconosciuto «~a»" -#: parser-clef.scm:165 +#: parser-clef.scm:155 #, scheme-format msgid "supported clefs: ~a" msgstr "chiavi supportate: ~a" -#: parser-ly-from-scheme.scm:74 +#: parser-ly-from-scheme.scm:73 msgid "error in #{ ... #}" msgstr "errore in #{ ... #}" -#: part-combiner.scm:598 +#: part-combiner.scm:894 #, scheme-format msgid "quoted music `~a' is empty" msgstr "la musica quotata «~a» è vuota" -#: ps-to-png.scm:70 +#: ps-to-png.scm:72 ps-to-png.scm:75 +#, scheme-format +msgid "Copying `~a' to `~a'..." +msgstr "Copia di «~a» su «~a»..." + +#: ps-to-png.scm:77 ps-to-png.scm:79 #, scheme-format -msgid "~a exited with status: ~S" -msgstr "~a è terminato con stato ~S" +msgid "Deleting `~a'..." +msgstr "Eliminazione di di ~a..." #: to-xml.scm:190 #, scheme-format msgid "assertion failed: ~S" msgstr "errore di asserzione: ~S" -#: translation-functions.scm:368 +#: translation-functions.scm:389 #, scheme-format msgid "Negative fret for pitch ~a on string ~a" msgstr "Tasto negativo per l'altezza ~a sulla corda ~a" -#: translation-functions.scm:371 +#: translation-functions.scm:392 #, scheme-format msgid "Missing fret for pitch ~a on string ~a" msgstr "Manca il tasto per l'altezza ~a sulla corda ~a" -#: translation-functions.scm:414 +#: translation-functions.scm:435 #, scheme-format msgid "No open string for pitch ~a" msgstr "Nessuna corda a vuoto per l'altezza ~a" -#: translation-functions.scm:429 translation-functions.scm:441 +#: translation-functions.scm:450 translation-functions.scm:462 #, scheme-format msgid "Requested string for pitch requires negative fret: string ~a pitch ~a" msgstr "La corda richiesta per questa altezza necessita un tasto negativo: corda ~a altezza ~a" -#: translation-functions.scm:432 +#: translation-functions.scm:453 msgid "Ignoring string request and recalculating." msgstr "Ignorata la richiesta di questa corda, viene ricalcolata." -#: translation-functions.scm:444 +#: translation-functions.scm:465 msgid "Ignoring note in tablature." msgstr "Ignorata la nota nell'intavolatura." -#: translation-functions.scm:469 +#: translation-functions.scm:490 #, scheme-format msgid "No string for pitch ~a (given frets ~a)" msgstr "Nessuna corda per l'altezza ~a (se i tasti sono ~a)" -#: translation-functions.scm:574 +#: translation-functions.scm:595 #, scheme-format msgid "" "No label for fret ~a (on string ~a);\n" @@ -3956,845 +3982,3 @@ msgid "" msgstr "" "Nessuna etichetta per il tasto ~a (sulla corda ~a);\n" "disponibili solo le etichette del tasto ~a" - -#~ msgid "cannot find start of (de)crescendo" -#~ msgstr "impossibile trovare l'inizio del (de)crescendo" - -#~ msgid "already have a decrescendo" -#~ msgstr "decrescendo già presente" - -#~ msgid "already have a crescendo" -#~ msgstr "crescendo già presente" - -#~ msgid "cresc starts here" -#~ msgstr "cresc inizia qui" - -#~ msgid "unterminated (de)crescendo" -#~ msgstr "(de)crescendo non terminato" - -#~ msgid "unterminated phrasing slur" -#~ msgstr "legatura di frase non terminata" - -#~ msgid "cannot end phrasing slur" -#~ msgstr "impossibile chiudere la legatura di frase" - -#~ msgid "already have phrasing slur" -#~ msgstr "legatura di frase già presente" - -#~ msgid "unterminated slur" -#~ msgstr "legatura di portamento non terminata" - -#~ msgid "old relative compatibility not used" -#~ msgstr "compatibilità col vecchio modo relativo non utilizzata" - -#~ msgid "undefined: ~S" -#~ msgstr "~S indefinito" - -#~ msgid "Line spanner's left point is to the right of its right point." -#~ msgstr "Il punto sinistro dello spanner della linea si trova alla destra del suo punto destro." - -#~ msgid "Grob name should be alphanumeric" -#~ msgstr "Il nome del grob deve essere alfanumerico" - -#~ msgid "Brace found at end of lyric. Did you forget a space?" -#~ msgstr "Trovata una parentesi alla fine del testo. È stato dimenticato uno spazio?" - -#~ msgid "Brace found at end of markup. Did you forget a space?" -#~ msgstr "Trovata una parentesi alla fine della marcatura. È stato dimenticato uno spazio?" - -#~ msgid "add midi-block to .ly file" -#~ msgstr "aggiunge il blocco midi al file .ly" - -#~ msgid "Found infinity or nan in output. Substituting 0.0" -#~ msgstr "Trovato infinito o un valore non numerico nell'output. Sostituito con 0.0" - -#~ msgid "All classes must be the last in their matrilineal line." -#~ msgstr "Tutte le classi devono essere le ultime della propria linea di discendenza." - -#~ msgid "All classes must have a well-defined pedigree in the existing class hierarchy." -#~ msgstr "Tutte le classi devono avere un'ascendenza ben definita nella gerarchia di classe esistente." - -#~ msgid "event class ~A seems to be unused" -#~ msgstr "la classe di evento ~A sembra essere non utilizzata" - -#~ msgid "translator listens to nonexisting event class ~A" -#~ msgstr "il traduttore è in ascolto della classe di evento ~A inesistente" - -#~ msgid "setbeatGrouping. Use baseMoment and beatStructure.\n" -#~ msgstr "setbeatGrouping. Usa baseMoment e beatStructure.\n" - -#~ msgid "success: %s" -#~ msgstr "riuscito: %s" - -#~ msgid "Infinity or NaN encountered" -#~ msgstr "incontrato infinito o un valore non numerico" - -#~ msgid "Vaticana_ligature: zero join (delta_pitch == 0)" -#~ msgstr "Vaticana_ligature: unione nulla (delta_pitch == 0)" - -#~ msgid "No spring between column %d and next one" -#~ msgstr "Nessuna separazione tra la colonna %d e la successiva" - -#~ msgid "Sending non-event to context" -#~ msgstr "Invio di un non-evento al contesto" - -#~ msgid "Invalid CreateContext event: Cannot create %s context" -#~ msgstr "Evento CreateContext non valido: impossibile creare il contesto %s" - -#~ msgid "infinity or NaN encountered while converting Real number" -#~ msgstr "si è incontrato infinito o un valore non numerico durante la conversione di un numero reale" - -#~ msgid "setting to zero" -#~ msgstr "impostato a zero" - -#~ msgid "No spacing entry from %s to `%s'" -#~ msgstr "Nessuno spazio da %s a «%s»" - -#~ msgid "error at EOF: %s" -#~ msgstr "errore alla fine del file (EOF): %s" - -#~ msgid "cyclic dependency: calculation-in-progress encountered for #'%s (%s)" -#~ msgstr "dipendenza ciclica: calculation-in-progress incontrato per #'%s (%s)" - -#~ msgid "Mensural_ligature: unexpected case fall-through" -#~ msgstr "Mensural_ligature: caso inatteso e non interpretabile" - -#~ msgid "Mensural_ligature: (join_right == 0)" -#~ msgstr "Mensural_ligature: (join_right == 0)" - -#~ msgid "braces do not match" -#~ msgstr "le graffe non corrispondono" - -#~ msgid "second argument must be pitch list" -#~ msgstr "il secondo argomento deve essere una lista di altezze" - -#~ msgid "warning:" -#~ msgstr "attenzione:" - -#~ msgid "Bar check failed. Expect to be at ~a, instead at ~a" -#~ msgstr "Controllo di battuta fallito. Avrebbe dovuto trovarsi a ~a invece che a ~a" - -#~ msgid "Music head function must return Music object" -#~ msgstr "Una funzione musicale principale deve restituire un Oggetto musicale" - -#~ msgid "vertical spacing has been changed; minimum-Y-extent is obsolete.\n" -#~ msgstr "la spaziatura verticale è cambiata; minimum-Y-extent è obsoleto.\n" - -#~ msgid "no feasible beam position" -#~ msgstr "nessuna posizione fattibile per la travatura" - -#~ msgid "Invalid index for character" -#~ msgstr "Indice non valido per il carattere" - -#, fuzzy -#~ msgid "deprecated function called: %s" -#~ msgstr "non riesco a trovare il carattere `%s'" - -#, fuzzy -#~ msgid "generate DVI (tex backend only)" -#~ msgstr "vincoli degenerati" - -#, fuzzy -#~ msgid "do not generate printed output" -#~ msgstr "vincoli degenerati" - -#, fuzzy -#~ msgid "cannot find start of trill spanner" -#~ msgstr "non trovo le estremità di %s" - -#, fuzzy -#~ msgid "already have a trill spanner" -#~ msgstr "crescendo non terminato" - -#~ msgid "silly pitch" -#~ msgstr "indicazione altezza priva di senso" - -#, fuzzy -#~ msgid "show warranty" -#~ msgstr " -w, --warranty mostra la garanzia e il copyright\n" - -#, fuzzy -#~ msgid "loading default font" -#~ msgstr "non trovo il file: `%s'" - -#, fuzzy -#~ msgid "cannot find default font: `%s'" -#~ msgstr "non trovo il file: `%s'" - -#, fuzzy -#~ msgid "couldnnot find line breaking that satisfies constraints" -#~ msgstr "la soluzione non soddisfa i vincoli" - -#, fuzzy -#~ msgid "crescendo too small" -#~ msgstr "troppo piccolo" - -#, fuzzy -#~ msgid "cannot open file %s" -#~ msgstr "non posso aprire il file: `%s'" - -#, fuzzy -#~ msgid "Incorrect lilypond version: %s (%s, %s)" -#~ msgstr "versione di mudela errata: %s (%s, %s)" - -#~ msgid "Creator: " -#~ msgstr "Autore: " - -#, fuzzy -#~ msgid "at " -#~ msgstr ", a " - -#, fuzzy -#~ msgid "in quotation: junking event %s" -#~ msgstr "Cosa? Non è una richiesta: `%s'" - -#, fuzzy -#~ msgid "cannot find ascii character: %d" -#~ msgstr "non riesco a trovare il carattere `%s'" - -#, fuzzy -#~ msgid "unterminated trill spanner" -#~ msgstr "extender non terminato" - -#, fuzzy -#~ msgid "cannot find signature for music function" -#~ msgstr "Non trovo il contesto dello Score" - -#, fuzzy -#~ msgid "Opening pipe `%s'" -#~ msgstr "Genero le voci..." - -#, fuzzy -#~ msgid "Cleaning %s..." -#~ msgstr "Genero le voci..." - -#, fuzzy -#~ msgid "Usage: %s [OPTION]... [FILE]..." -#~ msgstr "Uso: %s [OPZIONE]... [FILE]..." - -#, fuzzy -#~ msgid "%s: skipping: `%s'" -#~ msgstr "% strumento:" - -#, fuzzy -#~ msgid "Processing `%s'..." -#~ msgstr "Elaboro..." - -#, fuzzy -#~ msgid "Wrote `%s'" -#~ msgstr "Genero le voci..." - -#, fuzzy -#~ msgid "cannot dlopen: %s: %s" -#~ msgstr "non posso aprire il file: `%s'" - -#, fuzzy -#~ msgid "install package: %s or %s" -#~ msgstr "non posso cambiare `%s' in `%s'" - -#, fuzzy -#~ msgid "parsing AFM file: `%s'" -#~ msgstr "Genero le voci..." - -#, fuzzy -#~ msgid "beam has less than two visible stems" -#~ msgstr "beam con meno di due gambi" - -#, fuzzy -#~ msgid "adding lilypond directory: %s" -#~ msgstr "non trovo e non posso creare `%s'" - -#, fuzzy -#~ msgid "cannot handle a percent repeat of length: %s" -#~ msgstr "non so manipolare tasti vuoti" - -#, fuzzy -#~ msgid "suspect duration in beam: %s" -#~ msgstr "non è una durata: %d" - -#, fuzzy -#~ msgid "syntax error: cannot back up" -#~ msgstr "Errore non fatale: " - -#, fuzzy -#~ msgid "Stack now" -#~ msgstr "traccia " - -#, fuzzy -#~ msgid "Reading a token: " -#~ msgstr "Genero le voci..." - -#, fuzzy -#~ msgid "syntax error, unexpected %s" -#~ msgstr "Errore non fatale: " - -#, fuzzy -#~ msgid "syntax error, unexpected %s, expecting %s" -#~ msgstr "Errore non fatale: " - -#, fuzzy -#~ msgid "syntax error, unexpected %s, expecting %s or %s" -#~ msgstr "Errore non fatale: " - -#, fuzzy -#~ msgid "syntax error; also memory exhausted" -#~ msgstr "Errore non fatale: " - -#, fuzzy -#~ msgid "syntax error" -#~ msgstr "Errore non fatale: " - -#, fuzzy -#~ msgid "cannot find CFF/PFA/PFB font ~S=~S" -#~ msgstr "non trovo il file: `%s'" - -#, fuzzy -#~ msgid "unknown bar glyph: `~S'" -#~ msgstr "tipo di chiave sconosciuto" - -#, fuzzy -#~ msgid "Extracting fonts to %s..." -#~ msgstr "non trovo e non posso creare `%s'" - -#, fuzzy -#~ msgid "Writing %s..." -#~ msgstr "Genero le voci..." - -#, fuzzy -#~ msgid "Writing output file." -#~ msgstr " -D, --debug abilita l'output di debugging\n" - -#, fuzzy -#~ msgid "Have to be in Lyric mode for lyrics" -#~ msgstr "bisogna essere in Lyric mode per i testi" - -#, fuzzy -#~ msgid "Have to be in Note mode for notes" -#~ msgstr "bisogna essere in Note mode per le note" - -#, fuzzy -#~ msgid "Have to be in Chord mode for chords" -#~ msgstr "bisogna essere in Chord mode per gli accordi" - -#, fuzzy -#~ msgid "Huh? Got %d, expected %d characters" -#~ msgstr "Come? Ho trovato %d caratteri al posto di %d" - -#, fuzzy -#~ msgid "Missing end quote" -#~ msgstr "apice finale mancante" - -#, fuzzy -#~ msgid "kpathsea cannot find %s file: `%s'" -#~ msgstr "Non trovo il file `%s'" - -#, fuzzy -#~ msgid "kpathsea cannot find file: `%s'" -#~ msgstr "Non trovo il file `%s'" - -#, fuzzy -#~ msgid "generate DVI" -#~ msgstr "vincoli degenerati" - -#, fuzzy -#~ msgid "generate TeX" -#~ msgstr "vincoli degenerati" - -#, fuzzy -#~ msgid "kpathsea can not find %s file: `%s'" -#~ msgstr "Non trovo il file `%s'" - -#, fuzzy -#~ msgid "kpathsea can not find AFM file `%s'" -#~ msgstr "non trovo il file: `%s'" - -#, fuzzy -#~ msgid "kpathsea can not find TFM file: `%s'" -#~ msgstr "non trovo il file: `%s'" - -#, fuzzy -#~ msgid "add DIR to LilyPond's search path" -#~ msgstr " -I, --include=DIR aggiunge DIR ai path di ricerca\n" - -#, fuzzy -#~ msgid "produce MIDI output only" -#~ msgstr " -M, --no-paper produce solo output midi\n" - -#, fuzzy -#~ msgid "generate PDF output" -#~ msgstr "vincoli degenerati" - -#, fuzzy -#~ msgid "generate PS.GZ" -#~ msgstr "vincoli degenerati" - -#, fuzzy -#~ msgid "Continuing..." -#~ msgstr "Genero le voci..." - -#, fuzzy -#~ msgid "Analyzing %s..." -#~ msgstr "Genero le voci..." - -#, fuzzy -#~ msgid "no LilyPond output found for `%s'" -#~ msgstr "Output di Lily in %s..." - -#, fuzzy -#~ msgid "%s output to ..." -#~ msgstr "L'output MIDI è inviato a %s..." - -#, fuzzy -#~ msgid "%s output to %s..." -#~ msgstr "L'output MIDI è inviato a %s..." - -#, fuzzy -#~ msgid "cannot find file: `%s.%s'" -#~ msgstr "non trovo il file: `%s'" - -#, fuzzy -#~ msgid "write dependencies" -#~ msgstr "aspettavo uno spazio bianco" - -#, fuzzy -#~ msgid "write Makefile dependencies for every input file" -#~ msgstr " -d, --dependencies scrive le dependenze del Makefile per ogni file di input\n" - -#, fuzzy -#~ msgid "invalid value: `%s'" -#~ msgstr "carattere illegale: `%c'" - -#, fuzzy -#~ msgid "Writing HTML menu `%s'" -#~ msgstr "Genero le voci..." - -#, fuzzy -#~ msgid "Beam has less than two stems. Removing beam." -#~ msgstr "beam con meno di due gambi" - -#, fuzzy -#~ msgid "Score contains errors; will not process it" -#~ msgstr "lo spartito contiene errori; non lo elaborerò" - -#, fuzzy -#~ msgid "Now processing: `%s'" -#~ msgstr "stringa di escape sconosciuta: `\\%s'" - -#, fuzzy -#~ msgid "inhibit file output naming and exporting" -#~ msgstr " -s, --safe inibisce la rinomina dei file di output e l'esportazione di macro di TeX\n" - -#, fuzzy -#~ msgid "GNU LilyPond -- The music typesetter" -#~ msgstr "GNU LilyPond -- Il tipografo musicale del progetto GNU" - -#~ msgid "silly duration" -#~ msgstr "indicazione durata priva di senso" - -#, fuzzy -#~ msgid "paper output to `%s'..." -#~ msgstr "L'output stampato è inviato a %s..." - -#, fuzzy -#~ msgid "Outputting Score, defined at: " -#~ msgstr "emetto lo Score, definito a: " - -#~ msgid "from musical definition: %s" -#~ msgstr "della definizione musicale: %s" - -#, fuzzy -#~ msgid "unterminated pedal bracket" -#~ msgstr "beam non terminato" - -#, fuzzy -#~ msgid "unbound spanner `%s'" -#~ msgstr "Spanner non legato `%s'" - -#, fuzzy -#~ msgid "Error syncing file (disk full?)" -#~ msgstr "errore nel sincronizzare il file (disco pieno?)" - -#, fuzzy -#~ msgid "Not adding translator: `%s'" -#~ msgstr "traduttore sconosciuto `%s'" - -#, fuzzy -#~ msgid "Must have duration object" -#~ msgstr "indicazione durata priva di senso" - -#, fuzzy -#~ msgid "%r: release directory" -#~ msgstr "non trovo e non posso creare `%s'" - -#, fuzzy -#~ msgid "Building `%s'..." -#~ msgstr "Genero le voci..." - -#~ msgid ", at " -#~ msgstr ", a " - -#, fuzzy -#~ msgid "Putting slur over rest." -#~ msgstr "Metto uno slur sulla pausa." - -#, fuzzy -#~ msgid "Slur over rest?" -#~ msgstr "Metto uno slur sulla pausa." - -#~ msgid "cannot map file" -#~ msgstr "non posso mappare il documento" - -#, fuzzy -#~ msgid "This binary was compiled with the following options:" -#~ msgstr "GNU LilyPond è stata compilata con le seguenti impostazioni:" - -#~ msgid "EOF in a string" -#~ msgstr "EOF in una corda" - -#, fuzzy -#~ msgid "Wrong type for property: %s, type: %s, value found: %s, type: %s" -#~ msgstr "Tipo sbagliato per il valore di una proprietà" - -#~ msgid "#32 in quarter: %d" -#~ msgstr "#32 in un quarto: %d" - -#, fuzzy -#~ msgid "track %d:" -#~ msgstr "traccia " - -#~ msgid "NOT Filtering tempo..." -#~ msgstr "NON filtro il tempo..." - -#~ msgid "NOT Quantifying columns..." -#~ msgstr "NON quantifico le colonne..." - -#~ msgid "Quantifying columns..." -#~ msgstr "Quantifico le colonne..." - -#~ msgid "Settling columns..." -#~ msgstr "Sistemo le colonne..." - -#, fuzzy -#~ msgid "% MIDI instrument:" -#~ msgstr "% strumento:" - -#~ msgid "lily indent level: %d" -#~ msgstr "livello di indentazione di lili: %d" - -#~ msgid "% Creator: " -#~ msgstr "% Autore: " - -#~ msgid "% Automatically generated" -#~ msgstr "% Generato automaticamente" - -#~ msgid "% from input file: " -#~ msgstr "% dal file di input: " - -#, fuzzy -#~ msgid "write exact durations, e.g.: a4*385/384" -#~ msgstr " -b, --no-quantify scrive durate esatte, p.es.: a4*385/384\n" - -#, fuzzy -#~ msgid "enable debugging output" -#~ msgstr " -D, --debug abilita l'output di debugging\n" - -#, fuzzy -#~ msgid "do not output tuplets, double dots or rests, smallest is 32" -#~ msgstr " -n, --no-silly assume che non ci siano gruppetti o doppi punti, la figura più piccola è 32\n" - -#, fuzzy -#~ msgid "set smallest duration" -#~ msgstr "indicazione durata priva di senso" - -#, fuzzy -#~ msgid "do not timestamp the output" -#~ msgstr " -T, --no-timestamps non inserisce marcatori temporali nell'output\n" - -#, fuzzy -#~ msgid "assume no double dotted notes" -#~ msgstr " -x, --no-double-dots assume che non ci siano note con doppio punto\n" - -#~ msgid "Usage: %s [OPTIONS]... [FILE]" -#~ msgstr "Uso: %s [OPZIONE]... [FILE]" - -#, fuzzy -#~ msgid "Translate MIDI-file to lilypond" -#~ msgstr "Traduce un file midi in mudela" - -#~ msgid "zero length string encountered" -#~ msgstr "ho incostrato una striga di lunghezza nulla" - -#~ msgid "MIDI header expected" -#~ msgstr "mi aspettavo un header MIDI" - -#, fuzzy -#~ msgid "invalid header length" -#~ msgstr "Lunghezza dell'header non valida" - -#, fuzzy -#~ msgid "invalid MIDI format" -#~ msgstr "evento MIDI non valido" - -#, fuzzy -#~ msgid "invalid number of tracks" -#~ msgstr "Numero di tracce non valido" - -#, fuzzy -#~ msgid "cannot handle non-metrical time" -#~ msgstr "tempo non metrico" - -#~ msgid "invalid running status" -#~ msgstr "stato di eseguzione non valido" - -#~ msgid "invalid MIDI event" -#~ msgstr "evento MIDI non valido" - -#~ msgid "MIDI track expected" -#~ msgstr "mi spettavo una traccia MIDI" - -#~ msgid "invalid track length" -#~ msgstr "lunghezza della traccia non valida" - -#, fuzzy -#~ msgid "no Grace context available" -#~ msgstr "non è una vera variabile" - -#, fuzzy -#~ msgid "Fetching `%'s..." -#~ msgstr "Genero le voci..." - -#~ msgid "Wrong type for property value" -#~ msgstr "Tipo sbagliato per il valore di una proprietà" - -#, fuzzy -#~ msgid "not enough fields in Dstream init" -#~ msgstr "Non ci sono sufficienti campi in Dstream init." - -#, fuzzy -#~ msgid "floating point exception" -#~ msgstr "Eccezione di virgola mobile" - -#, fuzzy -#~ msgid "cannot set mem-checking!" -#~ msgstr "non posso settare mem-checking" - -#, fuzzy -#~ msgid "Dependency file left in `%s'" -#~ msgstr "scrivo il file delle dipendenze: `%s'..." - -#, fuzzy -#~ msgid "Usage: lilypond [OPTIONS]... FILE\n" -#~ msgstr "Uso: %s [OPZIONE]... [FILE]" - -#~ msgid "unconventional key: flats: %d, sharps: %d" -#~ msgstr "armatura non convenzionale: %d bemolli e %d diesis" - -#, fuzzy -#~ msgid "wrong identifier type, expected: `%s'" -#~ msgstr "Tipo di identificatore sbagliato: " - -#, fuzzy -#~ msgid "show all changes in relative syntax" -#~ msgstr " -Q, --find-old-relative mostra tutti i cambiamenti nella sintassi relativa\n" - -#, fuzzy -#~ msgid "switch on experimental features" -#~ msgstr " -t, --test usa le caratteristiche sperimentali\n" - -#~ msgid "Automatically generated" -#~ msgstr "Generato automaticamente" - -#, fuzzy -#~ msgid "Wrong type for property" -#~ msgstr "Tipo sbagliato per il valore di una proprietà" - -#, fuzzy -#~ msgid "Huh? Not a Request: `%s'" -#~ msgstr "Cosa? Non è una richiesta: `%s'" - -#~ msgid "cannot find both ends of %s" -#~ msgstr "non trovo le estremità di %s" - -#, fuzzy -#~ msgid "lost in time:" -#~ msgstr "mi sono persa nel tempo" - -#~ msgid "Need a translator group for a context" -#~ msgstr "Ho bisogno di un gruppo di traduzione per un contesto" - -#, fuzzy -#~ msgid "No key name, assuming `C'" -#~ msgstr "Nessuna armatura di chiave: assumo Do'" - -#, fuzzy -#~ msgid "out of tune:" -#~ msgstr "stonato" - -#, fuzzy -#~ msgid "ignore mudela version" -#~ msgstr "versione di mudela errata: %s (%s, %s)" - -#~ msgid "not a real variable" -#~ msgstr "non è una vera variabile" - -#, fuzzy -#~ msgid "Spanner `%s' has equal left and right spanpoints" -#~ msgstr "I punti di span sinistro e destro dello spanner `%s' coincidono" - -#~ msgid "Debug output disabled. Compiled with NPRINT." -#~ msgstr "L'output di debug è disabilitato. Compilato con NPRINT." - -#~ msgid "0 lines" -#~ msgstr "0 linee" - -#~ msgid "1 line (of %.0f columns)" -#~ msgstr "1 linea (da %.0f colonne)" - -#~ msgid "%d lines (with an average of %.1f columns)" -#~ msgstr "%d linee (con una media di %.f colonne)" - -#~ msgid "score does not have any columns" -#~ msgstr "lo spartito non contiene nessuna colonna" - -#, fuzzy -#~ msgid "calculated %s exactly" -#~ msgstr "calcolato esattamente: %s" - -#~ msgid "Got a dynamic already. Continuing dazed and confused" -#~ msgstr "E' già presente una dinamica. Continuo, ma sono confusa" - -#~ msgid "Too many crescendi here" -#~ msgstr "Troppi crescendi" - -#~ msgid "redeclaration of `\\%s'" -#~ msgstr "doppia dichiarazione di `\\%s'" - -#~ msgid "Cannot solve this casting problem exactly; revert to Word_wrap" -#~ msgstr "Non posso risolvere esattamente questo problema di conversione; ritorno al Word_wrap" - -#~ msgid "time: %.2f seconds" -#~ msgstr "durata: %.2f secondi" - -#~ msgid "no minimum in measure at %s" -#~ msgstr "non c'è minimo nella misura a %s" - -#~ msgid "I'm too fat; call Oprah" -#~ msgstr "Son troppo grassa; chiama Oprah" - -#~ msgid "partial measure must be non-negative" -#~ msgstr "la misura parziale deve essere non-negativa" - -#~ msgid "partial measure too large" -#~ msgstr "misura parziale troppo grande" - -#~ msgid "Will ignore \\relative for transposed music" -#~ msgstr "Ignorerò \\relative per la musica trasposta " - -#~ msgid "ugh, this measure is too long" -#~ msgstr "ops, questa misura è troppo lunga" - -#~ msgid "I do not fit; put me on Montignac" -#~ msgstr "Non ci sto; mettimi su Montignac" - -#~ msgid "More than one music block" -#~ msgstr "Più di un blocco di musica" - -#~ msgid "cannot abbreviate" -#~ msgstr "non posso abbreviare" - -#, fuzzy -#~ msgid "cannot abbreviate tuplet" -#~ msgstr "non posso abbreviare" - -#~ msgid "Parsing...\n" -#~ msgstr "Interpreto...\n" - -#, fuzzy -#~ msgid "do not timestamp the output " -#~ msgstr " -T, --no-timestamps non inserisce marcatori temporali nell'output\n" - -#~ msgid " -a, --about about LilyPond\n" -#~ msgstr " -a, --about cos'è LilyPond\n" - -#~ msgid " -h, --help this help\n" -#~ msgstr " -h, --help questo help\n" - -#~ msgid " -f, --output-format=X use output format X\n" -#~ msgstr " -f, --output-format=X usa il formato dell'ouput X\n" - -#~ msgid " -o, --output=FILE set FILE as default output base\n" -#~ msgstr " -o, --output=FILE indica FILE come base di default per l'output\n" - -#~ msgid " -V, --ignore-version ignore mudela version\n" -#~ msgstr " -V, --ignore-version ignora la versione di mudela\n" - -#~ msgid "GNU LilyPond is Free software, see --warranty" -#~ msgstr "GNU LilyPond è Free software, vedi --warranty" - -#~ msgid " -D, --debug enable debugging output\n" -#~ msgstr " -D, --debug abilita l'output di debugging\n" - -#, fuzzy -#~ msgid " -p, --no-tuplets assume no tuplets\n" -#~ msgstr " -p, --no-plets assume che non ci siano gruppetti\n" - -#~ msgid " -q, --quiet be quiet\n" -#~ msgstr " -q, --quiet sii silenzioso\n" - -#~ msgid " -s, --smallest=N assume no shorter (reciprocal) durations than N\n" -#~ msgstr " -s, --smallest=N assume che non ci siano durate (reciproche) inferiori a N\n" - -#~ msgid " -v, --verbose be verbose\n" -#~ msgstr " -v, --verbose sii loquace\n" - -#, fuzzy -#~ msgid "Midi2ly, translate midi to mudela" -#~ msgstr "Mi2mu, tradice midi in mudela" - -#~ msgid "of" -#~ msgstr "di" - -#~ msgid "please fix me" -#~ msgstr "correggimi, per favore" - -#~ msgid "stem at %s doesnnot fit in beam" -#~ msgstr "il gambo a $s non rientra nel beam" - -#~ msgid "No stem direction set. Ignoring column in clash." -#~ msgstr "Nessuna direzione del gambo è selezionata. Ignoro la colonna." - -#~ msgid "\\relative mode changed here, old value: " -#~ msgstr "\\il modo relativo è cambiato in questo punto, valore vecchio: " - -#~ msgid "ignoring zero duration added to column at %s" -#~ msgstr "ingnoro le durate nulle aggiunte alla colonna a %s" - -#~ msgid "script needs stem direction" -#~ msgstr "lo script ha bisogno di una direzione per il gambo" - -#~ msgid "unconnected column: %d" -#~ msgstr "colonna sconnessa: %d" - -#~ msgid "Staff_side::get_position_f(): somebody forgot to set my direction, returning -20" -#~ msgstr "taff_side::get_position_f(): qualcuno ha dimenticato di impostare lamia direzione, quindi restituisco -20" - -#~ msgid "have to be in Note mode for @chords" -#~ msgstr "bisogna essere in Note mode per i @chords" - -#~ msgid "" -#~ "LilyPond is the GNU Project music typesetter. This program can print\n" -#~ "beautiful sheet music from a music definition file. It can also play\n" -#~ "mechanical performances to a MIDI file. Features include multiple\n" -#~ "staffs, meters, clefs, keys, lyrics, versatile input language, cadenzas,\n" -#~ "beams, slurs, triplets, named chords, transposing, formatting scores, \n" -#~ "part extraction. It includes a nice font of musical symbols.\n" -#~ msgstr "" -#~ "LilyPond è il programma di notazione musicale del progetto\n" -#~ "GNU. Questo programma può generare delle ottime partiture musicali\n" -#~ "a partire da un file contenente la descrizione della musica. Può\n" -#~ "anche generare esecuzioni meccaniche della partitura in formato\n" -#~ "MIDI. Le caratteristiche del programma includono un versatile\n" -#~ "linguaggio di descrizione musicale, pentagrammi multipli, segni di\n" -#~ "divisione, chiavi, tasti, parole, cadenze, legature, acciaccature,\n" -#~ "terzine, segni di formattazione ed estrazione automatica delle parti. Nella\n" -#~ "distribuzione è compreso anche un font di simboli musicali.\n" diff --git a/po/ja.po b/po/ja.po index a3bd2b95de..f456eef66a 100644 --- a/po/ja.po +++ b/po/ja.po @@ -1,259 +1,302 @@ # Japanese message for lilypond -# Copyright (C) 2000, 2012 Free Software Foundation, Inc. +# Copyright (C) 2000, 2012, 2015 Free Software Foundation, Inc. # This file is distributed under the same license as the lilypond package. # Daisuke Yamashita , 2000. # Takeshi Hamasaki , 2012. +# Masamichi Hosoda , 2016. msgid "" msgstr "" -"Project-Id-Version: lilypond 2.15.29\n" +"Project-Id-Version: lilypond 2.19.26\n" "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n" -"POT-Creation-Date: 2012-02-04 15:42+0100\n" -"PO-Revision-Date: 2012-03-25 00:31+0900\n" -"Last-Translator: Takeshi Hamasaki \n" +"POT-Creation-Date: 2015-08-27 10:48+0100\n" +"PO-Revision-Date: 2016-01-03 18:35+0900\n" +"Last-Translator: Masamichi Hosoda \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: fontextract.py:25 -#, python-format -msgid "Scanning %s" -msgstr "%s をスキャン中" +#: book_base.py:26 +#, fuzzy, python-format +msgid "file not found: %s" +msgstr "ファイルがありません" -#: fontextract.py:70 +#: book_base.py:164 +#, fuzzy +msgid "Output function not implemented" +msgstr "PASSMECH は完全には実装されていません" + +#: book_latex.py:174 +msgid "cannot find \\begin{document} in LaTeX document" +msgstr "LaTeX 文書の中に \\begin{document} がありません" + +#: book_latex.py:190 #, python-format -msgid "Extracted %s" +msgid "Running `%s' on file `%s' to detect default page settings.\n" msgstr "" -#: fontextract.py:85 +#: book_latex.py:219 book_texinfo.py:228 +msgid "Unable to auto-detect default settings:\n" +msgstr "既定の設定を自動検出できません:\n" + +#: book_latex.py:231 book_texinfo.py:240 #, python-format -msgid "Writing fonts to %s" -msgstr "%s にフォントを書き込みます" +msgid "" +"Unable to auto-detect default settings:\n" +"%s" +msgstr "" +"既定の設定を自動検出できません:\n" +"%s" + +#: book_latex.py:254 +#, fuzzy +msgid "cannot detect textwidth from LaTeX" +msgstr "RPM ファイルからカタログを抽出できません。" -#: book_snippets.py:409 +#: book_snippets.py:406 #, fuzzy, python-format msgid "deprecated ly-option used: %s=%s" msgstr "警告:“%s”は、問題視されているオプションです\n" -#: book_snippets.py:411 +#: book_snippets.py:408 #, fuzzy, python-format msgid "compatibility mode translation: %s=%s" msgstr " -a|pipe \"ispell -a\" 互換モード" -#: book_snippets.py:414 +#: book_snippets.py:411 #, fuzzy, python-format msgid "deprecated ly-option used: %s" msgstr "警告:“%s”は、問題視されているオプションです\n" -#: book_snippets.py:416 +#: book_snippets.py:413 #, fuzzy, python-format msgid "compatibility mode translation: %s" msgstr " -a|pipe \"ispell -a\" 互換モード" -#: book_snippets.py:533 +#: book_snippets.py:530 #, fuzzy, python-format msgid "ignoring unknown ly option: %s" msgstr "不明な強制・拒否 (force/refuse) オプション `%.*s'" -#: book_snippets.py:741 +#: book_snippets.py:621 +#, fuzzy, python-format +msgid "Missing files: %s" +msgstr "ウィンドウ飾りも含める" + +#: book_snippets.py:661 +#, fuzzy, python-format +msgid "Could not overwrite file %s" +msgstr "" +"ファイル %s に書き込めません:\n" +"%s\n" + +#: book_snippets.py:748 #, python-format msgid "Running through filter `%s'" msgstr "フィルタ `%s' で処理中です " -#: book_snippets.py:761 +#: book_snippets.py:769 #, python-format msgid "`%s' failed (%d)" msgstr "`%s' 失敗しました(%d)" -#: book_snippets.py:762 +#: book_snippets.py:770 msgid "The error log is as follows:" msgstr "エラーログは以下の通りです:" -#: book_snippets.py:882 +#: book_snippets.py:890 #, fuzzy, python-format msgid "Converting MusicXML file `%s'...\n" msgstr "MusicXML ファイル (*.mxml)" -#: book_snippets.py:909 +#: book_snippets.py:917 #, python-format msgid "" "%s: duplicate filename but different contents of original file,\n" "printing diff against existing file." msgstr "" -#: book_snippets.py:922 +#: book_snippets.py:930 #, python-format msgid "" "%s: duplicate filename but different contents of converted lilypond file,\n" "printing diff against existing file." msgstr "" -#: convertrules.py:12 +#. Work around a texi2pdf bug: if LANG=C is not given, a broken regexp is +#. used to detect relative/absolute paths, so the absolute path is not +#. detected as such and this command fails: +#: book_texinfo.py:206 +#, python-format +msgid "Running texi2pdf on file %s to detect default page settings.\n" +msgstr "" + +#: convertrules.py:13 #, fuzzy, python-format msgid "Not smart enough to convert %s." msgstr "アンカーポイントが不足しているので描画できません" -#: convertrules.py:13 +#: convertrules.py:14 msgid "Please refer to the manual for details, and update manually." msgstr "詳細についてはマニュアルを参照して、手動で更新してください。" -#: convertrules.py:14 +#: convertrules.py:15 #, fuzzy, python-format msgid "%s has been replaced by %s" msgstr "あなたは %s さんによって追加されました" -#: convertrules.py:24 lilylib.py:131 warn.cc:223 +#: convertrules.py:25 lilylib.py:136 warn.cc:223 #, c-format, python-format msgid "warning: %s" msgstr "警告: %s" -#: convertrules.py:49 convertrules.py:94 +#: convertrules.py:50 convertrules.py:95 msgid "\\header { key = concat + with + operator }" msgstr "" -#: convertrules.py:56 +#: convertrules.py:57 #, python-format msgid "deprecated %s" msgstr "非推奨です %s" -#: convertrules.py:65 +#: convertrules.py:66 msgid "deprecated \\textstyle, new \\key syntax" msgstr "" -#: convertrules.py:81 convertrules.py:1855 convertrules.py:2031 -#: convertrules.py:2174 convertrules.py:2505 convertrules.py:2800 -#: convertrules.py:3150 +#: convertrules.py:82 convertrules.py:1856 convertrules.py:2032 +#: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801 +#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700 #, fuzzy msgid "bump version for release" msgstr "'%2$s' のリリース '%1$s' が見つかりませんでした" -#: convertrules.py:97 +#: convertrules.py:98 msgid "new \\header format" msgstr "新しい \\header の書式" -#: convertrules.py:124 +#: convertrules.py:125 #, fuzzy msgid "\\translator syntax" msgstr "%s: 文法エラー" -#: convertrules.py:175 +#: convertrules.py:176 msgid "\\repeat NUM Music Alternative -> \\repeat FOLDSTR Music Alternative" msgstr "" -#: convertrules.py:205 convertrules.py:678 convertrules.py:1350 -#: convertrules.py:2317 +#: convertrules.py:206 convertrules.py:679 convertrules.py:1351 +#: convertrules.py:2318 #, python-format msgid "deprecate %s" msgstr "" -#: convertrules.py:279 +#: convertrules.py:280 #, python-format msgid "deprecate %s " msgstr "" -#: convertrules.py:305 +#: convertrules.py:306 msgid "new \\notenames format" msgstr "新しい \\notenames の書式" -#: convertrules.py:321 +#: convertrules.py:322 #, fuzzy msgid "new tremolo format" msgstr "新しい \\header の書式" -#: convertrules.py:325 +#: convertrules.py:326 msgid "Staff_margin_engraver deprecated, use Instrument_name_engraver" msgstr "" -#: convertrules.py:376 +#: convertrules.py:377 msgid "change property definition case (eg. onevoice -> oneVoice)" msgstr "" -#: convertrules.py:437 +#: convertrules.py:438 #, fuzzy msgid "new \\textscript markup text" msgstr "新しい置換の追加" -#: convertrules.py:509 +#: convertrules.py:510 #, fuzzy, python-format msgid "identifier names: %s" msgstr " -a, --alias エイリアス名\n" -#: convertrules.py:548 +#: convertrules.py:549 msgid "point-and-click argument changed to procedure." msgstr "" -#: convertrules.py:590 +#: convertrules.py:591 #, fuzzy msgid "semicolons removed" msgstr "パッチ %s を削除しました\\n" #. 40 ? -#: convertrules.py:633 +#: convertrules.py:634 #, fuzzy, python-format msgid "%s property names" msgstr " -a, --alias エイリアス名\n" -#: convertrules.py:703 +#: convertrules.py:704 #, fuzzy msgid "automaticMelismata turned on by default" msgstr "%2$s から %1$s へのログインは、初期状態では拒否されました。\n" -#: convertrules.py:708 +#: convertrules.py:709 msgid "automaticMelismata is turned on by default since 1.5.67." msgstr "" -#: convertrules.py:942 convertrules.py:1635 convertrules.py:1889 -#: convertrules.py:2134 +#: convertrules.py:943 convertrules.py:1636 convertrules.py:1890 +#: convertrules.py:2135 #, python-format msgid "remove %s" msgstr "%s を削除" -#: convertrules.py:977 convertrules.py:980 +#: convertrules.py:978 convertrules.py:981 msgid "cluster syntax" msgstr "クラスタの文法" -#: convertrules.py:987 +#: convertrules.py:988 #, fuzzy msgid "new Pedal style syntax" msgstr "新しいスタイルのグループ・オブジェクト (テスト用)" -#: convertrules.py:1246 +#: convertrules.py:1247 msgid "" "New relative mode,\n" "Postfix articulations, new text markup syntax, new chord syntax." msgstr "" -#: convertrules.py:1259 +#: convertrules.py:1260 #, fuzzy msgid "Remove - before articulation" msgstr "保存前に確認(&M)" -#: convertrules.py:1294 +#: convertrules.py:1295 #, python-format msgid "%s misspelling" msgstr "%s スペルミスです" -#: convertrules.py:1313 +#: convertrules.py:1314 #, fuzzy msgid "Swap < > and << >>" msgstr "黒と白を反転する" -#: convertrules.py:1316 +#: convertrules.py:1317 msgid "attempting automatic \\figures conversion. Check results!" msgstr "" -#: convertrules.py:1362 +#: convertrules.py:1363 msgid "Use Scheme code to construct arbitrary note events." msgstr "" -#: convertrules.py:1369 +#: convertrules.py:1370 msgid "" "use symbolic constants for alterations,\n" "remove \\outputproperty, move ly:verbose into ly:get-option" msgstr "" -#: convertrules.py:1394 +#: convertrules.py:1395 #, python-format msgid "" "\\outputproperty found,\n" @@ -264,7 +307,7 @@ msgid "" "as a substitution text." msgstr "" -#: convertrules.py:1406 +#: convertrules.py:1407 msgid "" "The alteration field of Scheme pitches was multiplied by 2\n" "to support quarter tone accidentals. You must update the following constructs manually:\n" @@ -273,25 +316,25 @@ msgid "" "* keySignature settings made with \\property\n" msgstr "" -#: convertrules.py:1449 +#: convertrules.py:1450 msgid "removal of automaticMelismata; use melismaBusyProperties instead." msgstr "" -#: convertrules.py:1556 +#: convertrules.py:1557 msgid "\\partcombine syntax change to \\newpartcombine" msgstr "" -#: convertrules.py:1581 +#: convertrules.py:1582 msgid "" "Drum notation changes, Removing \\chordmodifiers, \\notenames.\n" "Harmonic notes. Thread context removed. Lyrics context removed." msgstr "" -#: convertrules.py:1585 +#: convertrules.py:1586 msgid "Drums found. Enclose drum notes in \\drummode" msgstr "" -#: convertrules.py:1596 convertrules.py:1603 convertrules.py:1614 +#: convertrules.py:1597 convertrules.py:1604 convertrules.py:1615 #, python-format msgid "" "\n" @@ -300,47 +343,47 @@ msgstr "" "\n" "%s が見つかりました\n" -#: convertrules.py:1596 +#: convertrules.py:1597 #, fuzzy msgid "Drum notation" msgstr "HTML 表記: " -#: convertrules.py:1655 +#: convertrules.py:1656 #, fuzzy msgid "new syntax for property settings:" msgstr "属性 '%s' の新しい値を '%s' に設定しました\n" -#: convertrules.py:1681 +#: convertrules.py:1682 msgid "Property setting syntax in \\translator{ }" msgstr "" -#: convertrules.py:1720 +#: convertrules.py:1721 msgid "Scheme grob function renaming" msgstr "" -#: convertrules.py:1731 convertrules.py:2138 convertrules.py:2142 -#: convertrules.py:2708 +#: convertrules.py:1732 convertrules.py:2139 convertrules.py:2143 +#: convertrules.py:2709 #, fuzzy, python-format msgid "Use %s\n" msgstr "ON" -#: convertrules.py:1747 +#: convertrules.py:1748 msgid "More Scheme function renaming" msgstr "" -#: convertrules.py:1871 +#: convertrules.py:1872 msgid "" "Page layout has been changed, using paper size and margins.\n" "textheight is no longer used.\n" msgstr "" -#: convertrules.py:1957 +#: convertrules.py:1958 msgid "" "\\foo -> \\foomode (for chords, notes, etc.)\n" "fold \\new FooContext \\foomode into \\foo." msgstr "" -#: convertrules.py:1995 +#: convertrules.py:1996 msgid "" "staff size should be changed at top-level\n" "with\n" @@ -349,83 +392,83 @@ msgid "" "\n" msgstr "" -#: convertrules.py:2015 +#: convertrules.py:2016 #, fuzzy msgid "regularize other identifiers" msgstr "他のタブを閉じる" -#: convertrules.py:2083 +#: convertrules.py:2084 msgid "\\encoding: smart recode latin1..utf-8. Remove ly:point-and-click" msgstr "" -#: convertrules.py:2094 +#: convertrules.py:2095 msgid "LilyPond source must be UTF-8" msgstr "LilyPond のソースファイルは UTF-8 で記述してください" -#: convertrules.py:2097 +#: convertrules.py:2098 #, fuzzy msgid "Try the texstrings backend" msgstr "バックエンドによる較正" -#: convertrules.py:2100 +#: convertrules.py:2101 #, fuzzy, python-format msgid "Do something like: %s" msgstr "lynx 風動作(&Y)" -#: convertrules.py:2103 +#: convertrules.py:2104 msgid "Or save as UTF-8 in your editor" msgstr "エディタで保存する際の文字コードには UTF-8 を指定してください" -#: convertrules.py:2153 +#: convertrules.py:2154 msgid "warn about auto beam settings" msgstr "" -#: convertrules.py:2157 +#: convertrules.py:2158 #, fuzzy msgid "auto beam settings" msgstr "Cisco VPN 設定" -#: convertrules.py:2158 +#: convertrules.py:2159 msgid "" "\n" "Auto beam settings must now specify each interesting moment in a measure\n" "explicitly; 1/4 is no longer multiplied to cover moments 1/2 and 3/4 too.\n" msgstr "" -#: convertrules.py:2271 +#: convertrules.py:2272 #, fuzzy msgid "verticalAlignmentChildCallback has been deprecated" msgstr "鍵がパクられました" -#: convertrules.py:2276 +#: convertrules.py:2277 msgid "Remove callbacks property, deprecate XY-extent-callback." msgstr "" -#: convertrules.py:2297 +#: convertrules.py:2298 msgid "Use grob closures iso. XY-offset-callbacks." msgstr "" -#: convertrules.py:2359 +#: convertrules.py:2360 msgid "foobar -> foo-bar for \\paper, \\layout" msgstr "" -#: convertrules.py:2469 +#: convertrules.py:2470 msgid "deprecate \\tempo in \\midi" msgstr "" -#: convertrules.py:2522 +#: convertrules.py:2523 msgid "deprecate cautionary-style. Use AccidentalCautionary properties" msgstr "" -#: convertrules.py:2535 +#: convertrules.py:2536 msgid "Rename accidental glyphs, use glyph-name-alist." msgstr "" -#: convertrules.py:2590 +#: convertrules.py:2591 msgid "edge-text settings for TextSpanner" msgstr "" -#: convertrules.py:2591 +#: convertrules.py:2592 #, fuzzy, python-format msgid "" "Use\n" @@ -433,127 +476,127 @@ msgid "" "%s" msgstr "ON" -#: convertrules.py:2624 +#: convertrules.py:2625 msgid "Use the `alignment-offsets' sub-property of\n" msgstr "" -#: convertrules.py:2625 +#: convertrules.py:2626 msgid "NonMusicalPaperColumn #'line-break-system-details\n" msgstr "" -#: convertrules.py:2626 +#: convertrules.py:2627 msgid "to set fixed distances between staves.\n" msgstr "" -#: convertrules.py:2638 +#: convertrules.py:2639 msgid "Use #'style not #'dash-fraction to select solid/dashed lines." msgstr "" -#: convertrules.py:2644 +#: convertrules.py:2645 msgid "all settings related to dashed lines" msgstr "" -#: convertrules.py:2645 +#: convertrules.py:2646 msgid "Use \\override ... #'style = #'line for solid lines and\n" msgstr "" -#: convertrules.py:2646 +#: convertrules.py:2647 msgid "\t\\override ... #'style = #'dashed-line for dashed lines." msgstr "" -#: convertrules.py:2682 +#: convertrules.py:2683 msgid "" "metronomeMarkFormatter uses text markup as second argument,\n" "fret diagram properties moved to fret-diagram-details." msgstr "" -#: convertrules.py:2688 +#: convertrules.py:2689 msgid "metronomeMarkFormatter got an additional text argument.\n" msgstr "" -#: convertrules.py:2689 +#: convertrules.py:2690 #, python-format msgid "" "The function assigned to Score.metronomeMarkFunction now uses the signature\n" "%s" msgstr "" -#: convertrules.py:2707 +#: convertrules.py:2708 #, python-format msgid "%s in fret-diagram properties" msgstr "" -#: convertrules.py:2751 +#: convertrules.py:2752 msgid "\\put-adjacent argument order" msgstr "" -#: convertrules.py:2752 +#: convertrules.py:2753 msgid "Axis and direction now come before markups:\n" msgstr "" -#: convertrules.py:2753 +#: convertrules.py:2754 msgid "\\put-adjacent axis dir markup markup." msgstr "" -#: convertrules.py:2784 +#: convertrules.py:2785 #, fuzzy msgid "re-definition of InnerStaffGroup" msgstr "%s:%d: 不正な文字列定義" -#: convertrules.py:2789 +#: convertrules.py:2790 #, fuzzy msgid "re-definition of InnerChoirStaff" msgstr "%s:%d: 不正な文字列定義" -#: convertrules.py:2799 +#: convertrules.py:2800 msgid "Syntax changes for \\addChordShape and \\chord-shape" msgstr "" -#: convertrules.py:2804 +#: convertrules.py:2805 msgid "stringTuning must be added to addChordShape call.\n" msgstr "" -#: convertrules.py:2809 +#: convertrules.py:2810 msgid "stringTuning must be added to chord-shape call.\n" msgstr "" -#: convertrules.py:2815 +#: convertrules.py:2816 #, fuzzy msgid "Remove oldaddlyrics" msgstr "%s を削除できません" -#: convertrules.py:2819 +#: convertrules.py:2820 msgid "" "oldaddlyrics is no longer supported. \n" -" Use addlyrics or lyrsicsto instead.\n" +" Use addlyrics or lyricsto instead.\n" msgstr "" -#: convertrules.py:2825 +#: convertrules.py:2826 msgid "" "keySignature property not reversed any more\n" "MIDI 47: orchestral strings -> orchestral harp" msgstr "" -#: convertrules.py:2830 +#: convertrules.py:2831 msgid "The alist for Staff.keySignature is no longer in reversed order.\n" msgstr "" -#: convertrules.py:2836 +#: convertrules.py:2837 msgid "" "\\bar \".\" now produces a thick barline\n" "ly:hairpin::after-line-breaking -> ly:spanner::kill-zero-spanned-time\n" "Dash parameters for slurs and ties are now in dash-definition" msgstr "" -#: convertrules.py:2842 +#: convertrules.py:2843 msgid "\\bar \".\" now produces a thick barline.\n" msgstr "" -#: convertrules.py:2848 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" +#: convertrules.py:2849 +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" msgstr "" -#: convertrules.py:2853 +#: convertrules.py:2854 msgid "" "Autobeaming rules have changed. override-auto-beam-setting and\n" "revert-auto-beam-setting have been eliminated.\n" @@ -568,25 +611,25 @@ msgid "" "template replaced by new `Dynamics' context." msgstr "" -#: convertrules.py:2867 +#: convertrules.py:2868 msgid " Autobeam settings are now overriden with \\overrideBeamSettings.\n" msgstr "" -#: convertrules.py:2872 +#: convertrules.py:2873 msgid " Autobeam settings are now reverted with \\revertBeamSettings.\n" msgstr "" -#: convertrules.py:2878 +#: convertrules.py:2879 msgid "" " beatGrouping with a specified context must now be accomplished with\n" " \\overrideBeamSettings.\n" msgstr "" -#: convertrules.py:2884 +#: convertrules.py:2885 msgid "alignment-offsets has been changed to alignment-distances: you must now specify the distances between staves rather than the offset of staves.\n" msgstr "" -#: convertrules.py:2895 +#: convertrules.py:2896 msgid "" "Remove obsolete engravers/translators: Note_swallow_translator,\n" "Rest_swallow_translator, Skip_event_swallow_translator, Swallow_engraver,\n" @@ -594,188 +637,205 @@ msgid "" "New vertical spacing variables." msgstr "" -#: convertrules.py:2926 +#: convertrules.py:2927 msgid "Vertical spacing no longer depends on the Y-extent of a VerticalAxisGroup.\n" msgstr "" -#: convertrules.py:2932 +#: convertrules.py:2933 msgid "Unify fetaNumber and fetaDynamic encodings" msgstr "" -#: convertrules.py:2937 +#: convertrules.py:2938 msgid "\\RemoveEmpty*StaffContext -> \\*Staff \\RemoveEmptyStaves" msgstr "" -#: convertrules.py:2948 +#: convertrules.py:2949 msgid "\\cresc etc. are now postfix operators" msgstr "" -#: convertrules.py:2960 +#: convertrules.py:2961 msgid "" "Eliminate beamSettings, beatLength, \\setBeatGrouping, \\overrideBeamSettings and \\revertBeamSettings.\n" "\"accordion.accEtcbase\" -> \"accordion.etcbass\"" msgstr "" -#: convertrules.py:2978 +#: convertrules.py:2979 msgid "Use \\set beamExceptions or \\overrideTimeSignatureSettings.\n" msgstr "" -#: convertrules.py:2982 +#: convertrules.py:2983 msgid "Use \\set beamExceptions or \\revertTimeSignatureSettings.\n" msgstr "" -#: convertrules.py:2986 +#: convertrules.py:2987 msgid "Use baseMoment, beatStructure, and beamExceptions.\n" msgstr "" -#: convertrules.py:2990 convertrules.py:2994 +#: convertrules.py:2991 convertrules.py:2995 #, fuzzy msgid "Use baseMoment and beatStructure.\n" msgstr "選択範囲の作成と使用(_S)" -#: convertrules.py:2999 +#: convertrules.py:3000 msgid "" "Woodwind diagrams: Move size, thickness, and graphic from argument list to properties.\n" "Deprecate negative dash-period for hidden lines: use #'style = #'none instead." msgstr "" -#: convertrules.py:3004 +#: convertrules.py:3005 msgid "Move size, thickness, and graphic to properties. Argument should be just the key list.\n" msgstr "" -#: convertrules.py:3012 +#: convertrules.py:3013 msgid "" "Rename vertical spacing variables.\n" "Add fretboard-table argument to savePredefinedFretboard." msgstr "" -#: convertrules.py:3030 +#: convertrules.py:3031 msgid "Rename vertical spacing grob properties." msgstr "" -#: convertrules.py:3046 +#: convertrules.py:3047 msgid "Remove \\paper variables head-separation and foot-separation." msgstr "" -#: convertrules.py:3050 +#: convertrules.py:3051 msgid "Adjust settings for top-system-spacing instead.\n" msgstr "" -#: convertrules.py:3054 +#: convertrules.py:3055 msgid "Adjust settings for last-bottom-spacing instead.\n" msgstr "" -#: convertrules.py:3060 +#: convertrules.py:3061 msgid "" "Rename space to basic-distance in various spacing alists.\n" "Remove HarmonicParenthesesItem grob." msgstr "" -#: convertrules.py:3067 +#: convertrules.py:3068 #, fuzzy msgid "HarmonicParenthesesItem has been eliminated.\n" msgstr "鍵がパクられました" -#: convertrules.py:3068 +#: convertrules.py:3069 msgid "Harmonic parentheses are part of the TabNoteHead grob.\n" msgstr "" -#: convertrules.py:3073 +#: convertrules.py:3074 msgid "Remove context from overrideTimeSignatureSettings and revertTimeSignatureSettings.\n" msgstr "" -#: convertrules.py:3080 +#: convertrules.py:3081 msgid "" "Change stringTunings from a list of semitones to a list of pitches.\n" "Change tenor and baritone ukulele names in string tunings.\n" "Generate messages for manual conversion of vertical spacing if required." msgstr "" -#: convertrules.py:3123 +#: convertrules.py:3124 msgid "Vertical spacing changes might affect user-defined contexts." msgstr "" -#: convertrules.py:3129 +#: convertrules.py:3130 msgid "Replace bar-size with bar-extent." msgstr "" -#: convertrules.py:3141 +#: convertrules.py:3142 msgid "Woodwind diagrams: Changes to the clarinet diagram." msgstr "" -#: convertrules.py:3145 +#: convertrules.py:3146 msgid "Clarinet fingering changed to reflect actual anatomy of instrument.\n" msgstr "" -#: convertrules.py:3155 +#: convertrules.py:3156 msgid "Handling of non-automatic footnotes." msgstr "" -#: convertrules.py:3159 +#: convertrules.py:3160 msgid "If you are using non-automatic footnotes, make sure to set footnote-auto-numbering = ##f in the paper block.\n" msgstr "" -#: convertrules.py:3164 +#: convertrules.py:3165 msgid "Change in internal property for MultiMeasureRest" msgstr "" -#: convertrules.py:3168 +#: convertrules.py:3169 msgid "This internal property has been replaced by round-up-to-longer-rest, round-up-exceptions and usable-duration-logs.\n" msgstr "" -#: convertrules.py:3173 +#: convertrules.py:3174 msgid "Creation of a Flag grob and moving of certain Stem properties to this grob" msgstr "" -#: convertrules.py:3209 +#: convertrules.py:3210 msgid "consistent-broken-slope is now handled through the positions callback.\n" msgstr "" -#: convertrules.py:3210 +#: convertrules.py:3211 msgid "input/regression/beam-broken-classic.ly shows how broken beams are now handled.\n" msgstr "" -#: book_base.py:26 -#, fuzzy, python-format -msgid "file not found: %s" -msgstr "ファイルがありません" +#: convertrules.py:3372 +msgid "beamExceptions controls whole-measure beaming." +msgstr "" -#: book_base.py:164 -#, fuzzy -msgid "Output function not implemented" -msgstr "PASSMECH は完全には実装されていません" +#: convertrules.py:3609 +msgid "Flag.transparent and Flag.color inherit from Stem" +msgstr "" + +#: convertrules.py:3675 +msgid "Staff-padding now controls the distance to the baseline, not the nearest point." +msgstr "" + +#: fontextract.py:25 +#, python-format +msgid "Scanning %s" +msgstr "%s をスキャン中" + +#: fontextract.py:70 +#, python-format +msgid "Extracted %s" +msgstr "" + +#: fontextract.py:85 +#, python-format +msgid "Writing fonts to %s" +msgstr "%s にフォントを書き込みます" -#: lilylib.py:96 +#: lilylib.py:101 #, fuzzy, python-format msgid "Setting loglevel to %s" msgstr "ドメインを`%s'へ設定しました\n" -#: lilylib.py:99 +#: lilylib.py:104 #, fuzzy, python-format msgid "Unknown or invalid loglevel '%s'" msgstr "非対応または不正なビット深度です" -#: lilylib.py:128 warn.cc:211 -#, fuzzy, c-format, python-format +#: lilylib.py:133 warn.cc:211 +#, c-format, python-format msgid "error: %s" -msgstr " エラー: " +msgstr " エラー: %s" -#: lilylib.py:185 +#: lilylib.py:190 #, python-format msgid "Processing %s.ly" msgstr "%s.ly を処理中です" -#: lilylib.py:189 lilylib.py:250 +#: lilylib.py:194 lilylib.py:255 #, fuzzy, python-format msgid "Invoking `%s'" msgstr "PGP 起動中..." -#: lilylib.py:191 lilylib.py:252 +#: lilylib.py:196 lilylib.py:257 #, fuzzy, python-format msgid "Running %s..." msgstr "実行中 " -#: lilylib.py:328 +#: lilylib.py:333 #, python-format msgid "Usage: %s" msgstr "利用法: %s" @@ -832,441 +892,201 @@ msgstr "" msgid "Unable to find instrument for ID=%s\n" msgstr "%s: ARM グルー '%s' (`%s' 用) を見つけられません" -#. Work around a texi2pdf bug: if LANG=C is not given, a broken regexp is -#. used to detect relative/absolute paths, so the absolute path is not -#. detected as such and this command fails: -#: book_texinfo.py:206 -#, python-format -msgid "Running texi2pdf on file %s to detect default page settings.\n" -msgstr "" - -#: book_texinfo.py:228 book_latex.py:209 -msgid "Unable to auto-detect default settings:\n" -msgstr "既定の設定を自動検出できません:\n" +#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 +#, fuzzy, python-format +msgid "%s [OPTION]... FILE" +msgstr "オプション・ファイル「%s」: %s\n" -#: book_texinfo.py:240 book_latex.py:221 +#: abc2ly.py:1390 #, python-format msgid "" -"Unable to auto-detect default settings:\n" -"%s" +"abc2ly converts ABC music files (see\n" +"%s) to LilyPond input.\n" msgstr "" -"既定の設定を自動検出できません:\n" -"%s" - -#: book_latex.py:170 -msgid "cannot find \\begin{document} in LaTeX document" -msgstr "LaTeX 文書の中に \\begin{document} がありません" -#: book_latex.py:188 -#, python-format -msgid "Running `%s' on file `%s' to detect default page settings.\n" -msgstr "" +#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 +#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184 +msgid "show version number and exit" +msgstr "バージョン情報を表示して終了します" -#: musicxml2ly.py:228 -#, python-format -msgid "Encountered file created by %s, containing wrong beaming information. All beaming information in the MusicXML file will be ignored" -msgstr "" +#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 +#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163 +msgid "show this help and exit" +msgstr "このヘルプを表示して終了します" -#: musicxml2ly.py:247 musicxml2ly.py:249 -#, fuzzy, python-format -msgid "Unprocessed PartGroupInfo %s encountered" -msgstr "ループしているリンクに遭遇しました" +#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071 +#, fuzzy +msgid "write output to FILE" +msgstr " -o, --output-file=FILE 指定したファイルに出力\n" -#: musicxml2ly.py:502 -#, python-format -msgid "Encountered note at %s without type and duration (=%s)" +#: abc2ly.py:1407 +msgid "be strict about success" msgstr "" -#: musicxml2ly.py:522 -#, python-format -msgid "Encountered rational duration with denominator %s, unable to convert to lilypond duration" +#: abc2ly.py:1410 +msgid "preserve ABC's notion of beams" msgstr "" -#: musicxml2ly.py:769 +#: abc2ly.py:1413 #, fuzzy -msgid "Unable to extract key signature!" -msgstr "メタデータの値を設定できませんでした" +msgid "suppress progress messages" +msgstr "未知のシステムエラー" -#: musicxml2ly.py:796 -#, python-format -msgid "unknown mode %s, expecting 'major' or 'minor' or a church mode!" -msgstr "" +#. Translators, please translate this string as +#. "Report bugs in English via %s", +#. or if there is a LilyPond users list or forum in your language +#. "Report bugs in English via %s or in YOUR_LANG via URI" +#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 +#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318 +#, c-format, python-format +msgid "Report bugs via %s" +msgstr "バグレポートは英語で %s まで" -#: musicxml2ly.py:934 -#, fuzzy, python-format -msgid "Encountered unprocessed marker %s\n" -msgstr "ループしているリンクに遭遇しました" +#: convert-ly.py:47 +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 "" -#: musicxml2ly.py:1028 -#, fuzzy, python-format -msgid "unknown span event %s" -msgstr "MIDI イベントコントローラ" +#: convert-ly.py:50 +msgid "If FILE is `-', read from standard input." +msgstr "" -#: musicxml2ly.py:1038 -#, fuzzy, python-format -msgid "unknown span type %s for %s" -msgstr "%s: 再配置タイプ %d (シンボル %s) が不明です" +#: convert-ly.py:52 lilypond-book.py:82 +msgid "Examples:" +msgstr "例:" -#: musicxml2ly.py:1458 -#, fuzzy -msgid "Unknown metronome mark, ignoring" -msgstr "未知の拡張ヘッダキーワード `%s' を無視" +#: convert-ly.py:79 etf2ly.py:1191 lilypond-book.py:115 midi2ly.py:81 +#, python-format +msgid "Copyright (c) %s by" +msgstr "Copyright (c) %s by" -#. TODO: Implement the other (more complex) way for tempo marks! -#: musicxml2ly.py:1463 -msgid "Metronome marks with complex relations ( in MusicXML) are not yet implemented." +#: convert-ly.py:81 etf2ly.py:1193 lilypond-book.py:117 midi2ly.py:83 +msgid "Distributed under terms of the GNU General Public License." msgstr "" -#: musicxml2ly.py:1665 -#, python-format -msgid "Unable to convert chord type %s to lilypond." +#: convert-ly.py:82 etf2ly.py:1194 lilypond-book.py:118 midi2ly.py:84 +msgid "It comes with NO WARRANTY." msgstr "" -#: musicxml2ly.py:1814 -#, python-format -msgid "drum %s type unknown, please add to instrument_drumtype_dict" +#: convert-ly.py:100 convert-ly.py:141 +#, fuzzy +msgid "VERSION" +msgstr "%s ver.%s" + +#: convert-ly.py:102 +msgid "start from VERSION [default: \\version found in file]" msgstr "" -#: musicxml2ly.py:1818 +#: convert-ly.py:105 #, fuzzy -msgid "cannot find suitable event" -msgstr "'%s' の URL が見つかりません" +msgid "edit in place" +msgstr "ファイルをテキストエディタで編集する" -#: musicxml2ly.py:1966 -#, python-format -msgid "Negative skip %s (from position %s to %s)" +#: convert-ly.py:109 lilypond-book.py:179 musicxml2ly.py:2627 +msgid "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS (default), DEBUG)" msgstr "" -#: musicxml2ly.py:2107 -#, python-format -msgid "Negative skip found: from %s to %s, difference is %s" +#: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181 +#: musicxml2ly.py:2629 main.cc:177 +msgid "LOGLEVEL" +msgstr "LOGLEVEL" + +#: convert-ly.py:117 +msgid "do not add \\version command if missing" msgstr "" -#: musicxml2ly.py:2188 +#: convert-ly.py:123 #, fuzzy, python-format -msgid "unexpected %s; expected %s or %s or %s" -msgstr "\\が「a」「c」「i」の後に予期されます" +msgid "force updating \\version number to %s" +msgstr "バージョン番号を表示" -#: musicxml2ly.py:2294 -msgid "Encountered closing slur, but no slur is open" +#: convert-ly.py:129 +msgid "only update \\version number if file is modified" msgstr "" -#: musicxml2ly.py:2297 -msgid "Cannot have two simultaneous (closing) slurs" -msgstr "" +#: convert-ly.py:135 +#, fuzzy, python-format +msgid "show rules [default: -f 0, -t %s]" +msgstr "自動" -#: musicxml2ly.py:2306 -msgid "Cannot have a slur inside another slur" -msgstr "スラーの中に別のスラーを含むことはできません" +#: convert-ly.py:140 +#, fuzzy, python-format +msgid "convert to VERSION [default: %s]" +msgstr "既定の RGB カラープロファイルに変換" -#: musicxml2ly.py:2309 -msgid "Cannot have two simultaneous slurs" -msgstr "スラーを二つ同時に指定することはできません" +#: convert-ly.py:147 +msgid "make a numbered backup [default: filename.ext~]" +msgstr "" -#: musicxml2ly.py:2443 -#, fuzzy, python-format -msgid "cannot simultaneously have more than one mode: %s" -msgstr "-anrw を2つ以上一緒に使用することはできません" +#: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096 +#: main.cc:186 +msgid "show warranty and copyright" +msgstr "保証と著作権について表示します" -#: musicxml2ly.py:2551 +#: convert-ly.py:196 #, fuzzy -msgid "Converting to LilyPond expressions..." -msgstr "和音にLilyPond 言語を追加" +msgid "Applying conversion: " +msgstr "変換対象:\n" -#: musicxml2ly.py:2562 +#: convert-ly.py:215 #, fuzzy -msgid "musicxml2ly [OPTION]... FILE.xml" -msgstr "Visio XFIG ファイル形式" +msgid "Error while converting" +msgstr "\"%s\" を読み込み中にエラーが発生しました" -#: musicxml2ly.py:2564 -msgid "" -"Convert MusicXML from FILE.xml to LilyPond input.\n" -"If the given filename is -, musicxml2ly reads from the command line.\n" +#: convert-ly.py:217 +msgid "Stopping at last successful rule" msgstr "" -#: musicxml2ly.py:2570 midi2ly.py:1060 abc2ly.py:1387 lilypond-book.py:141 -#: convert-ly.py:92 etf2ly.py:1204 main.cc:153 -#, fuzzy -msgid "show this help and exit" -msgstr " -h, --help このヘルプを表示して終了\n" +#: convert-ly.py:256 +#, python-format +msgid "Processing `%s'... " +msgstr "`%s' を処理しています..." -#: musicxml2ly.py:2574 -msgid "" -"Copyright (c) 2005--2012 by\n" -" Han-Wen Nienhuys ,\n" -" Jan Nieuwenhuizen and\n" -" Reinhold Kainhofer \n" -msgstr "" - -#: musicxml2ly.py:2588 midi2ly.py:1091 abc2ly.py:1383 lilypond-book.py:232 -#: convert-ly.py:88 etf2ly.py:1208 main.cc:174 -#, fuzzy -msgid "show version number and exit" -msgstr "バージョン情報を表示して終了する" - -#: musicxml2ly.py:2594 midi2ly.py:1085 lilypond-book.py:224 -msgid "be verbose" -msgstr "詳細な情報を表示します" - -#: musicxml2ly.py:2600 -msgid "use lxml.etree; uses less memory and cpu time" -msgstr "" - -#: musicxml2ly.py:2606 -msgid "input file is a zip-compressed MusicXML file" -msgstr "" - -#: musicxml2ly.py:2612 -msgid "convert pitches in relative mode (default)" -msgstr "" - -#: musicxml2ly.py:2617 -msgid "convert pitches in absolute mode" -msgstr "" - -#: musicxml2ly.py:2620 -#, fuzzy -msgid "LANG" -msgstr "HREF_LANG:" - -#: musicxml2ly.py:2622 -msgid "use LANG for pitch names, e.g. 'deutsch' for note names in German" -msgstr "" - -#: musicxml2ly.py:2625 lilypond-book.py:180 convert-ly.py:105 -msgid "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS (default), DEBUG)" -msgstr "" - -#: musicxml2ly.py:2627 lilypond-book.py:164 lilypond-book.py:182 -#: convert-ly.py:107 main.cc:167 -msgid "LOGLEVEL" -msgstr "" - -#: musicxml2ly.py:2636 -msgid "do not convert directions (^, _ or -) for articulations, dynamics, etc." -msgstr "" - -#: musicxml2ly.py:2642 -msgid "do not convert exact vertical positions of rests" -msgstr "" - -#: musicxml2ly.py:2648 -msgid "do not convert the exact page layout and breaks" -msgstr "" - -#: musicxml2ly.py:2654 -msgid "do not convert beaming information, use lilypond's automatic beaming instead" -msgstr "" - -#: musicxml2ly.py:2657 midi2ly.py:1065 midi2ly.py:1070 etf2ly.py:1210 -#: main.cc:159 main.cc:171 -msgid "FILE" -msgstr "FILE" - -#: musicxml2ly.py:2662 -msgid "set output filename to FILE, stdout if -" -msgstr "" - -#: musicxml2ly.py:2668 -msgid "add midi-block to .ly file" -msgstr "" - -#. Translators, please translate this string as -#. "Report bugs in English via %s", -#. or if there is a LilyPond users list or forum in your language -#. "Report bugs in English via %s or in YOUR_LANG via URI" -#: musicxml2ly.py:2672 midi2ly.py:1104 abc2ly.py:1396 lilypond-book.py:259 -#: convert-ly.py:146 etf2ly.py:1218 main.cc:285 -#, fuzzy, c-format, python-format -msgid "Report bugs via %s" -msgstr "バグレポートは %s まで\n" - -#: musicxml2ly.py:2752 -#, fuzzy, python-format -msgid "unknown part in part-list: %s" -msgstr "キーワード一覧の各項目:" - -#: musicxml2ly.py:2814 -msgid "Input is compressed, extracting raw MusicXML data from stdin" -msgstr "" - -#: musicxml2ly.py:2827 +#: convert-ly.py:366 #, python-format -msgid "Input file %s is compressed, extracting raw MusicXML data" -msgstr "" - -#: musicxml2ly.py:2857 -#, fuzzy -msgid "Reading MusicXML from Standard input ..." -msgstr "標準入力からパスワードを読み込む\n" - -#: musicxml2ly.py:2859 -#, fuzzy, python-format -msgid "Reading MusicXML from %s ..." -msgstr "「%s」からオプションを読み出します\n" - -#: musicxml2ly.py:2892 -#, fuzzy, python-format -msgid "Output to `%s'" -msgstr "%s へ出力リダイレクトされました\n" +msgid "%s: Unable to open file" +msgstr "'%s: ファイルをオープンできません" -#: musicxml2ly.py:2962 +#: convert-ly.py:372 #, fuzzy, python-format -msgid "Unable to find input file %s" -msgstr "インクルードファイルが見つかりません: \"%s\"" +msgid "%s: Unable to determine version. Skipping" +msgstr "ローカルネームを決定することができません" -#: midi2ly.py:81 lilypond-book.py:116 convert-ly.py:75 etf2ly.py:1191 +#: convert-ly.py:378 #, python-format -msgid "Copyright (c) %s by" -msgstr "Copyright (c) %s by" - -#: midi2ly.py:83 lilypond-book.py:118 convert-ly.py:77 etf2ly.py:1193 -msgid "Distributed under terms of the GNU General Public License." -msgstr "" - -#: midi2ly.py:84 lilypond-book.py:119 convert-ly.py:78 etf2ly.py:1194 -msgid "It comes with NO WARRANTY." -msgstr "" - -#: midi2ly.py:90 -msgid "warning: " -msgstr "警告: " - -#: midi2ly.py:93 midi2ly.py:1121 -msgid "error: " -msgstr "エラー: " - -#: midi2ly.py:94 -msgid "Exiting... " -msgstr "終了します..." - -#: midi2ly.py:834 -msgid "found more than 5 voices on a staff, expect bad output" +msgid "" +"%s: Invalid version string `%s' \n" +"Valid version strings consist of three numbers, separated by dots, e.g. `2.8.12'" msgstr "" -#: midi2ly.py:1030 -#, fuzzy, python-format -msgid "%s output to `%s'..." -msgstr "%s へ出力リダイレクトされました\n" - -#: midi2ly.py:1042 abc2ly.py:1374 lilypond-book.py:123 convert-ly.py:81 -#, fuzzy, python-format -msgid "%s [OPTION]... FILE" -msgstr "オプション・ファイル「%s」: %s\n" +#: convert-ly.py:384 +#, python-format +msgid "There was %d error." +msgid_plural "There were %d errors." +msgstr[0] "" +msgstr[1] "" -#: midi2ly.py:1043 +#: etf2ly.py:1197 #, fuzzy, python-format -msgid "Convert %s to LilyPond input.\n" -msgstr " " - -#: midi2ly.py:1048 -#, fuzzy -msgid "print absolute pitches" -msgstr "音程待ち" - -#: midi2ly.py:1050 midi2ly.py:1075 -msgid "DUR" -msgstr "DUR" - -#: midi2ly.py:1051 -msgid "quantise note durations on DUR" -msgstr "" - -#: midi2ly.py:1054 -#, fuzzy -msgid "debug printing" -msgstr "印刷機能を利用不可にする" - -#: midi2ly.py:1057 -#, fuzzy -msgid "print explicit durations" -msgstr " 非明示的メンバ\n" - -#: midi2ly.py:1062 -#, fuzzy -msgid "prepend FILE to output" -msgstr " -o, --output-file=FILE 指定したファイルに出力\n" - -#: midi2ly.py:1066 -#, fuzzy -msgid "set key: ALT=+sharps|-flats; MINOR=1" -msgstr "調を設定: ACC +シャープ/-フラット :1 短調" - -#: midi2ly.py:1067 -#, fuzzy -msgid "ALT[:MINOR]" -msgstr "Major/Minor \t\t\t%d/%d\n" - -#: midi2ly.py:1069 abc2ly.py:1389 etf2ly.py:1209 -#, fuzzy -msgid "write output to FILE" -msgstr " -o, --output-file=FILE 指定したファイルに出力\n" - -#: midi2ly.py:1072 -#, fuzzy -msgid "preview of first 4 bars" -msgstr "スクロールバーを表示(_B)" - -#: midi2ly.py:1074 -msgid "quantise note starts on DUR" -msgstr "" - -#: midi2ly.py:1078 -#, fuzzy -msgid "use s instead of r for rests" -msgstr "グラデーションの代わりにパターンを輪郭に使う" - -#: midi2ly.py:1080 -#, fuzzy -msgid "DUR*NUM/DEN" -msgstr "書式: %s [p num] [-n] [パッチ]\n" - -#: midi2ly.py:1083 -msgid "allow tuplet durations DUR*NUM/DEN" -msgstr "" - -#: midi2ly.py:1092 lilypond-book.py:235 convert-ly.py:141 etf2ly.py:1212 -#: main.cc:176 -msgid "show warranty and copyright" -msgstr "保証と著作権について表示する" - -#: midi2ly.py:1095 -#, fuzzy -msgid "treat every text as a lyric" -msgstr "-a --text すべてテキストとして処理。" - -#: midi2ly.py:1098 -#, fuzzy -msgid "Examples" -msgstr "例:" - -#: midi2ly.py:1122 -msgid "no files specified on command line." -msgstr "" +msgid "%s [OPTION]... ETF-FILE" +msgstr "使用法: %s [オプション] [ファイル]...\n" -#: abc2ly.py:1375 -#, python-format +#: etf2ly.py:1198 msgid "" -"abc2ly converts ABC music files (see\n" -"%s) to LilyPond input.\n" -msgstr "" - -#: abc2ly.py:1391 -msgid "be strict about success" +"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.\n" msgstr "" -#: abc2ly.py:1393 -msgid "preserve ABC's notion of beams" -msgstr "" +#: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659 +#: main.cc:169 main.cc:181 +msgid "FILE" +msgstr "FILE" #: lilypond-book.py:80 msgid "Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document." msgstr "" -#: lilypond-book.py:82 convert-ly.py:48 -msgid "Examples:" -msgstr "例:" - #: lilypond-book.py:87 #, fuzzy msgid "BOOK" @@ -1277,750 +1097,817 @@ msgstr "LDIF アドレス帳" msgid "Exiting (%d)..." msgstr "終了します (%d)..." -#: lilypond-book.py:128 +#: lilypond-book.py:127 #, fuzzy msgid "FILTER" msgstr " フィルタ " -#: lilypond-book.py:131 +#: lilypond-book.py:130 msgid "pipe snippets through FILTER [default: `convert-ly -n -']" msgstr "" -#: lilypond-book.py:135 +#: lilypond-book.py:134 msgid "use output format FORMAT (texi [default], texi-html, latex, html, docbook)" msgstr "" -#: lilypond-book.py:136 +#: lilypond-book.py:135 #, fuzzy msgid "FORMAT" msgstr "FORMAT" -#: lilypond-book.py:143 +#: lilypond-book.py:142 #, fuzzy msgid "add DIR to include path" msgstr "DIR を検索パスに追加" -#: lilypond-book.py:144 lilypond-book.py:151 lilypond-book.py:170 -#: lilypond-book.py:188 lilypond-book.py:209 lilypond-book.py:215 main.cc:158 +#: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169 +#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168 msgid "DIR" msgstr "DIR" -#: lilypond-book.py:149 +#: lilypond-book.py:148 msgid "format Texinfo output so that Info will look for images of music in DIR" msgstr "" -#: lilypond-book.py:156 +#: lilypond-book.py:155 #, fuzzy msgid "PAD" msgstr "PAD" -#: lilypond-book.py:158 -msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)" +#: lilypond-book.py:157 +msgid "pad left side of music to align music in spite of uneven bar numbers (in mm)" msgstr "" -#: lilypond-book.py:163 +#: lilypond-book.py:162 msgid "Print lilypond log messages according to LOGLEVEL" msgstr "" -#: lilypond-book.py:169 +#: lilypond-book.py:168 msgid "write lily-XXX files to DIR, link into --output dir" msgstr "" -#: lilypond-book.py:174 +#: lilypond-book.py:173 msgid "Load the additional python PACKAGE (containing e.g. a custom output format)" msgstr "" -#: lilypond-book.py:175 +#: lilypond-book.py:174 #, fuzzy msgid "PACKAGE" msgstr "パッケージ" -#: lilypond-book.py:187 +#: lilypond-book.py:186 #, fuzzy msgid "write output to DIR" msgstr " -o, --output-file=FILE 指定したファイルに出力\n" -#: lilypond-book.py:192 +#: lilypond-book.py:191 #, fuzzy msgid "COMMAND" msgstr "COMMAND" -#: lilypond-book.py:193 +#: lilypond-book.py:192 msgid "process ly_files using COMMAND FILE..." msgstr "" -#: lilypond-book.py:198 +#: lilypond-book.py:197 #, fuzzy msgid "Redirect the lilypond output" msgstr "%s: 制限されています: 出力をリダイレクト出来ません" -#: lilypond-book.py:202 +#: lilypond-book.py:201 msgid "Compile snippets in safe mode" msgstr "" -#: lilypond-book.py:208 +#: lilypond-book.py:207 msgid "do not fail if no lilypond output is found" msgstr "" -#: lilypond-book.py:214 +#: lilypond-book.py:213 msgid "do not fail if no PNG images are found for EPS files" msgstr "" -#: lilypond-book.py:220 +#: lilypond-book.py:219 msgid "write snippet output files with the same base name as their source file" msgstr "" -#: lilypond-book.py:240 +#: lilypond-book.py:223 midi2ly.py:1090 musicxml2ly.py:2596 +msgid "be verbose" +msgstr "詳細な情報を表示します" + +#: lilypond-book.py:239 msgid "" "run executable PROG instead of latex, or in\n" "case --pdf option is set instead of pdflatex" msgstr "" -#: lilypond-book.py:242 lilypond-book.py:247 +#: lilypond-book.py:241 lilypond-book.py:246 #, fuzzy msgid "PROG" msgstr "PROG" -#: lilypond-book.py:246 +#: lilypond-book.py:245 msgid "run executable PROG instead of texi2pdf" msgstr "" -#: lilypond-book.py:253 +#: lilypond-book.py:252 msgid "create PDF files for use with PDFTeX" msgstr "" -#: lilypond-book.py:456 +#: lilypond-book.py:463 #, fuzzy msgid "Writing snippets..." msgstr "音楽スニペット" -#: lilypond-book.py:461 +#: lilypond-book.py:468 msgid "Processing..." msgstr "処理中..." -#: lilypond-book.py:466 +#: lilypond-book.py:473 msgid "All snippets are up to date..." msgstr "" -#: lilypond-book.py:485 +#: lilypond-book.py:475 +#, fuzzy +msgid "Linking files..." +msgstr "音楽スニペット" + +#: lilypond-book.py:495 #, fuzzy, python-format msgid "cannot determine format for: %s" msgstr "未サポートのWAVフォーマット %d: %s\n" -#: lilypond-book.py:494 +#: lilypond-book.py:504 #, python-format msgid "%s is up to date." msgstr "%s は更新済みです" -#: lilypond-book.py:507 +#: lilypond-book.py:517 #, python-format msgid "Writing `%s'..." msgstr "`%s' 書き込み中..." -#: lilypond-book.py:568 +#: lilypond-book.py:580 msgid "Output would overwrite input file; use --output." msgstr "" -#: lilypond-book.py:572 +#: lilypond-book.py:584 #, python-format msgid "Reading %s..." msgstr "%s 読み出し中..." -#: lilypond-book.py:579 +#: lilypond-book.py:591 #, fuzzy msgid "Dissecting..." msgstr "処理中..." -#: lilypond-book.py:590 +#: lilypond-book.py:602 #, python-format msgid "Compiling %s..." msgstr "%s をコンパイル中..." -#: lilypond-book.py:598 +#: lilypond-book.py:610 #, fuzzy, python-format msgid "Processing include: %s" msgstr "ウィンドウ飾りも含める" -#: lilypond-book.py:609 +#: lilypond-book.py:621 #, python-format msgid "Removing `%s'" msgstr "'%s' を削除しています" -#: lilypond-book.py:676 +#: lilypond-book.py:727 #, fuzzy, python-format msgid "Setting LilyPond's loglevel to %s" msgstr "和音にLilyPond 言語を追加" -#: lilypond-book.py:680 +#: lilypond-book.py:731 #, python-format msgid "Setting LilyPond's loglevel to %s (from environment variable LILYPOND_LOGLEVEL)" msgstr "" -#: lilypond-book.py:683 +#: lilypond-book.py:734 msgid "Setting LilyPond's output to --verbose, implied by lilypond-book's setting" msgstr "" -#: convert-ly.py:46 -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 "" - -#: convert-ly.py:96 convert-ly.py:137 -#, fuzzy -msgid "VERSION" -msgstr "%s ver.%s" +#: midi2ly.py:90 +msgid "warning: " +msgstr "警告: " -#: convert-ly.py:98 -msgid "start from VERSION [default: \\version found in file]" -msgstr "" +#: midi2ly.py:93 midi2ly.py:1124 +msgid "error: " +msgstr "エラー: " -#: convert-ly.py:101 -#, fuzzy -msgid "edit in place" -msgstr "ファイルをテキストエディタで編集する" +#: midi2ly.py:94 +msgid "Exiting... " +msgstr "終了します..." -#: convert-ly.py:113 -msgid "do not add \\version command if missing" +#: midi2ly.py:835 +msgid "found more than 5 voices on a staff, expect bad output" msgstr "" -#: convert-ly.py:119 +#: midi2ly.py:1032 #, fuzzy, python-format -msgid "force updating \\version number to %s" -msgstr "バージョン番号を表示" - -#: convert-ly.py:125 -msgid "only update \\version number if file is modified" -msgstr "" +msgid "%s output to `%s'..." +msgstr "%s へ出力リダイレクトされました\n" -#: convert-ly.py:131 +#: midi2ly.py:1045 #, fuzzy, python-format -msgid "show rules [default: -f 0, -t %s]" -msgstr "自動" +msgid "Convert %s to LilyPond input.\n" +msgstr " " -#: convert-ly.py:136 -#, fuzzy, python-format -msgid "convert to VERSION [default: %s]" -msgstr "既定の RGB カラープロファイルに変換" +#: midi2ly.py:1050 +#, fuzzy +msgid "print absolute pitches" +msgstr "音程待ち" -#: convert-ly.py:186 +#: midi2ly.py:1052 midi2ly.py:1080 +msgid "DUR" +msgstr "DUR" + +#: midi2ly.py:1053 +msgid "quantise note durations on DUR" +msgstr "" + +#: midi2ly.py:1056 #, fuzzy -msgid "Applying conversion: " -msgstr "変換対象:\n" +msgid "debug printing" +msgstr "印刷機能を利用不可にする" -#: convert-ly.py:202 +#: midi2ly.py:1059 #, fuzzy -msgid "Error while converting" -msgstr "\"%s\" を読み込み中にエラーが発生しました" +msgid "print explicit durations" +msgstr " 非明示的メンバ\n" -#: convert-ly.py:204 -msgid "Stopping at last successful rule" -msgstr "" +#: midi2ly.py:1064 +#, fuzzy +msgid "prepend FILE to output" +msgstr " -o, --output-file=FILE 指定したファイルに出力\n" -#: convert-ly.py:231 -#, python-format -msgid "Processing `%s'... " -msgstr "`%s' を処理しています..." +#: midi2ly.py:1068 +#, fuzzy +msgid "set key: ALT=+sharps|-flats; MINOR=1" +msgstr "調を設定: ACC +シャープ/-フラット :1 短調" -#: convert-ly.py:338 -#, python-format -msgid "%s: Unable to open file" -msgstr "'%s: ファイルをオープンできません" +#: midi2ly.py:1069 +#, fuzzy +msgid "ALT[:MINOR]" +msgstr "Major/Minor \t\t\t%d/%d\n" -#: convert-ly.py:345 -#, fuzzy, python-format -msgid "%s: Unable to determine version. Skipping" -msgstr "ローカルネームを決定することができません" +#: midi2ly.py:1074 +#, fuzzy +msgid "preview of first 4 bars" +msgstr "スクロールバーを表示(_B)" -#: convert-ly.py:350 -#, python-format -msgid "" -"%s: Invalid version string `%s' \n" -"Valid version strings consist of three numbers, separated by dots, e.g. `2.8.12'" +#: midi2ly.py:1078 +msgid "suppress progress messages and warnings about excess voices" msgstr "" -#: etf2ly.py:1197 -#, fuzzy, python-format -msgid "%s [OPTION]... ETF-FILE" -msgstr "使用法: %s [オプション] [ファイル]...\n" - -#: 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.\n" +#: midi2ly.py:1079 +msgid "quantise note starts on DUR" msgstr "" -#: website_post.py:123 +#: midi2ly.py:1083 #, fuzzy -msgid "English" -msgstr "英語" +msgid "use s instead of r for rests" +msgstr "グラデーションの代わりにパターンを輪郭に使う" -#: website_post.py:126 +#: midi2ly.py:1085 #, fuzzy -msgid "Other languages" -msgstr "多言語" - -#: warn.cc:56 -#, fuzzy, c-format -msgid "Log level set to %d\n" -msgstr "デバッグレベルを <レベル> に設定します。" +msgid "DUR*NUM/DEN" +msgstr "書式: %s [p num] [-n] [パッチ]\n" -#: warn.cc:89 -#, c-format -msgid "unknown log level `%s', using default (INFO)" +#: midi2ly.py:1088 +msgid "allow tuplet durations DUR*NUM/DEN" msgstr "" -#. Some expected warning was not triggered, so print out a warning. -#: warn.cc:112 -#, fuzzy, c-format -msgid "%d expected warning(s) not encountered: " -msgstr "警告: $PATH が設定されていません" +#: midi2ly.py:1098 +#, fuzzy +msgid "treat every text as a lyric" +msgstr "-a --text すべてテキストとして処理。" -#: warn.cc:183 -#, c-format -msgid "fatal error: %s" -msgstr "致命的なエラー: %s" +#: midi2ly.py:1101 +#, fuzzy +msgid "Examples" +msgstr "例:" -#: warn.cc:192 -#, fuzzy, c-format -msgid "suppressed programming error: %s" -msgstr "未知のシステムエラー" +#: midi2ly.py:1125 +msgid "no files specified on command line." +msgstr "" -#: warn.cc:197 -#, fuzzy, c-format -msgid "programming error: %s" -msgstr "プログラミングエラー" +#: musicxml2ly.py:228 +#, python-format +msgid "Encountered file created by %s, containing wrong beaming information. All beaming information in the MusicXML file will be ignored" +msgstr "" -#: warn.cc:198 -#, fuzzy -msgid "continuing, cross fingers" -msgstr "クロスデバイスリンク" +#: musicxml2ly.py:247 musicxml2ly.py:249 +#, fuzzy, python-format +msgid "Unprocessed PartGroupInfo %s encountered" +msgstr "ループしているリンクに遭遇しました" -#: warn.cc:207 -#, fuzzy, c-format -msgid "suppressed error: %s" -msgstr "%s サブプロセス入出力エラー" +#: musicxml2ly.py:500 +#, python-format +msgid "Encountered note at %s without type and duration (=%s)" +msgstr "" -#: warn.cc:219 -#, fuzzy, c-format -msgid "suppressed warning: %s" -msgstr "警告: %sは%sより優先\n" +#: musicxml2ly.py:520 +#, python-format +msgid "Encountered rational duration with denominator %s, unable to convert to lilypond duration" +msgstr "" -#: getopt-long.cc:153 -#, c-format -msgid "option `%s' requires an argument" -msgstr "オプション `%s' には引数が必要です" +#: musicxml2ly.py:767 +#, fuzzy +msgid "Unable to extract key signature!" +msgstr "メタデータの値を設定できませんでした" -#: getopt-long.cc:157 -#, fuzzy, c-format -msgid "option `%s' does not allow an argument" -msgstr "オプション %s には '%s' ではなく整数の引数が必要です" +#: musicxml2ly.py:794 +#, python-format +msgid "unknown mode %s, expecting 'major' or 'minor' or a church mode!" +msgstr "" -#: getopt-long.cc:161 -#, c-format -msgid "unrecognized option: `%s'" -msgstr "認識できないオプション: `%s'" +#: musicxml2ly.py:932 +#, fuzzy, python-format +msgid "Encountered unprocessed marker %s\n" +msgstr "ループしているリンクに遭遇しました" -#: getopt-long.cc:167 -#, c-format -msgid "invalid argument `%s' to option `%s'" -msgstr "オプション `%2$s' に対する無効な引数 `%1$s'" +#: musicxml2ly.py:1026 +#, fuzzy, python-format +msgid "unknown span event %s" +msgstr "MIDI イベントコントローラ" -#: flag.cc:110 -#, fuzzy, c-format -msgid "flag `%s' not found" -msgstr "ブラシ '%s' が見つかりません。" +#: musicxml2ly.py:1036 +#, fuzzy, python-format +msgid "unknown span type %s for %s" +msgstr "%s: 再配置タイプ %d (シンボル %s) が不明です" -#: flag.cc:130 -#, fuzzy, c-format -msgid "flag stroke `%s' not found" -msgstr " 検索文字列が見付かりません " +#: musicxml2ly.py:1456 +#, fuzzy +msgid "Unknown metronome mark, ignoring" +msgstr "未知の拡張ヘッダキーワード `%s' を無視" -#: parse-scm.cc:112 -msgid "GUILE signaled an error for the expression beginning here" +#. TODO: Implement the other (more complex) way for tempo marks! +#: musicxml2ly.py:1461 +msgid "Metronome marks with complex relations ( in MusicXML) are not yet implemented." msgstr "" -#: lily-lexer.cc:255 -msgid "include files are not allowed in safe mode" +#: musicxml2ly.py:1663 +#, python-format +msgid "Unable to convert chord type %s to lilypond." msgstr "" -#: lily-lexer.cc:282 -#, fuzzy, c-format -msgid "identifier name is a keyword: `%s'" -msgstr "`%s' という名前は既に使用されています!" - -#: lily-lexer.cc:303 lily-lexer.cc:316 -#, c-format -msgid "%s:EOF" -msgstr "%s:EOF" +#: musicxml2ly.py:1816 +#, python-format +msgid "drum %s type unknown, please add to instrument_drumtype_dict" +msgstr "" -#. if we get to here, just put everything on one line -#: constrained-breaking.cc:187 constrained-breaking.cc:205 +#: musicxml2ly.py:1820 #, fuzzy -msgid "cannot find line breaking that satisfies constraints" -msgstr "その解決は制限を満たしません" +msgid "cannot find suitable event" +msgstr "'%s' の URL が見つかりません" -#: context-property.cc:43 -msgid "need symbol arguments for \\override and \\revert" +#: musicxml2ly.py:1968 +#, python-format +msgid "Negative skip %s (from position %s to %s)" msgstr "" -#: horizontal-bracket-engraver.cc:62 -#, fuzzy -msgid "do not have that many brackets" -msgstr "マッチしないパラグラフのみ表示します。" +#: musicxml2ly.py:2109 +#, python-format +msgid "Negative skip found: from %s to %s, difference is %s" +msgstr "" -#: horizontal-bracket-engraver.cc:71 -#, fuzzy -msgid "conflicting note group events" -msgstr "拍子の要求が競合します" +#: musicxml2ly.py:2190 +#, fuzzy, python-format +msgid "unexpected %s; expected %s or %s or %s" +msgstr "\\が「a」「c」「i」の後に予期されます" -#: new-fingering-engraver.cc:113 -msgid "cannot add text scripts to individual note heads" +#: musicxml2ly.py:2296 +msgid "Encountered closing slur, but no slur is open" msgstr "" -#: new-fingering-engraver.cc:265 -#, fuzzy -msgid "no placement found for fingerings" -msgstr "“%s”用の失効鍵が見つかりません\n" +#: musicxml2ly.py:2299 +msgid "Cannot have two simultaneous (closing) slurs" +msgstr "" -#: new-fingering-engraver.cc:266 -#, fuzzy -msgid "placing below" -msgstr "ラインより下のピクセル数" +#: musicxml2ly.py:2308 +msgid "Cannot have a slur inside another slur" +msgstr "スラーの中に別のスラーを含むことはできません" -#: translator-group.cc:188 -#, c-format -msgid "cannot find: `%s'" -msgstr "見つかりません: `%s'" +#: musicxml2ly.py:2311 +msgid "Cannot have two simultaneous slurs" +msgstr "スラーを二つ同時に指定することはできません" -#: glissando-engraver.cc:158 -#, fuzzy -msgid "unterminated glissando" -msgstr "「s」コマンドが終了していません" +#: musicxml2ly.py:2445 +#, fuzzy, python-format +msgid "cannot simultaneously have more than one mode: %s" +msgstr "-anrw を2つ以上一緒に使用することはできません" -#: midi-item.cc:89 -#, fuzzy, c-format -msgid "no such MIDI instrument: `%s'" -msgstr "そのユーザーIDはありません。\n" +#: musicxml2ly.py:2553 +#, fuzzy +msgid "Converting to LilyPond expressions..." +msgstr "和音にLilyPond 言語を追加" -#: open-type-font.cc:44 -#, c-format -msgid "cannot allocate %lu bytes" -msgstr "%lu バイトを割当できません" +#: musicxml2ly.py:2564 +#, fuzzy +msgid "musicxml2ly [OPTION]... FILE.xml" +msgstr "Visio XFIG ファイル形式" -#: open-type-font.cc:48 -#, fuzzy, c-format -msgid "cannot load font table: %s" -msgstr "実行ファイルを動的にロードできません" +#: musicxml2ly.py:2566 +msgid "" +"Convert MusicXML from FILE.xml to LilyPond input.\n" +"If the given filename is -, musicxml2ly reads from the command line.\n" +msgstr "" -#: open-type-font.cc:53 -#, c-format -msgid "FreeType error: %s" -msgstr "FreeType エラー: %s" +#: musicxml2ly.py:2576 +msgid "" +"Copyright (c) 2005--2015 by\n" +" Han-Wen Nienhuys ,\n" +" Jan Nieuwenhuizen and\n" +" Reinhold Kainhofer \n" +msgstr "" -#: open-type-font.cc:110 -#, c-format -msgid "unsupported font format: %s" -msgstr "非対応のフォント形式: %s" +#: musicxml2ly.py:2602 +msgid "use lxml.etree; uses less memory and cpu time" +msgstr "" -#: open-type-font.cc:112 -#, fuzzy, c-format -msgid "error reading font file %s: %s" -msgstr "ファイルデスクリプタ %1 (%2)を読み込み中にエラー" +#: musicxml2ly.py:2608 +msgid "input file is a zip-compressed MusicXML file" +msgstr "" -#: open-type-font.cc:187 -#, c-format -msgid "FT_Get_Glyph_Name () Freetype error: %s" +#: musicxml2ly.py:2614 +msgid "convert pitches in relative mode (default)" msgstr "" -#: open-type-font.cc:318 pango-font.cc:189 -#, c-format -msgid "FT_Get_Glyph_Name () error: %s" +#: musicxml2ly.py:2619 +msgid "convert pitches in absolute mode" msgstr "" -#: note-heads-engraver.cc:76 +#: musicxml2ly.py:2622 #, fuzzy -msgid "NoteEvent without pitch" -msgstr "'~%c' が '~%c' に一致していません." +msgid "LANG" +msgstr "HREF_LANG:" -#: skyline-pair.cc:131 -msgid "direction must not be CENTER in ly:skyline-pair::skyline" +#: musicxml2ly.py:2624 +msgid "use LANG for pitch names, e.g. 'deutsch' for note names in German" msgstr "" -#: hyphen-engraver.cc:104 -#, fuzzy -msgid "removing unterminated hyphen" -msgstr "%s:%d: 警告: 文字列に終端がありません" +#: musicxml2ly.py:2638 +msgid "do not convert directions (^, _ or -) for articulations, dynamics, etc." +msgstr "" -#: hyphen-engraver.cc:118 -#, fuzzy -msgid "unterminated hyphen; removing" -msgstr "リモートファイル %s を削除中に %s " +#: musicxml2ly.py:2644 +msgid "do not convert exact vertical positions of rests" +msgstr "" -#: output-def.cc:235 -msgid "margins do not fit with line-width, setting default values" +#: musicxml2ly.py:2650 +msgid "do not convert the exact page layout and breaks" msgstr "" -#: output-def.cc:242 -msgid "systems run off the page due to improper paper settings, setting default values" +#: musicxml2ly.py:2656 +msgid "do not convert beaming information, use lilypond's automatic beaming instead" msgstr "" -#: accidental.cc:200 -#, c-format -msgid "Could not find glyph-name for alteration %s" +#: musicxml2ly.py:2664 +msgid "set output filename to FILE, stdout if -" msgstr "" -#: accidental.cc:215 -msgid "natural alteration glyph not found" +#: musicxml2ly.py:2670 +msgid "activate midi-block" msgstr "" -#: lyric-combine-music-iterator.cc:337 -#, fuzzy, c-format -msgid "cannot find Voice `%s'" -msgstr "ディレクトリ %s が見つかりません\n" +#: musicxml2ly.py:2754 +#, fuzzy, python-format +msgid "unknown part in part-list: %s" +msgstr "キーワード一覧の各項目:" -#: context.cc:148 -#, fuzzy, c-format -msgid "cannot find or create new `%s'" -msgstr "%s: 新しいデフォルトファイルを作れません\n" +#: musicxml2ly.py:2816 +msgid "Input is compressed, extracting raw MusicXML data from stdin" +msgstr "" -#: context.cc:206 -#, fuzzy, c-format -msgid "cannot find or create `%s' called `%s'" -msgstr "`%2$s' に呼ばれた `%1$s' が見つからないか作れません" +#: musicxml2ly.py:2829 +#, python-format +msgid "Input file %s is compressed, extracting raw MusicXML data" +msgstr "" -#: context.cc:399 -#, fuzzy, c-format -msgid "cannot find or create: `%s'" -msgstr "警告: cat ディレクトリ %s を作成できません" +#: musicxml2ly.py:2859 +#, fuzzy +msgid "Reading MusicXML from Standard input ..." +msgstr "標準入力からパスワードを読み込む\n" -#: dispatcher.cc:82 -msgid "Event class should be a symbol" -msgstr "" +#: musicxml2ly.py:2861 +#, fuzzy, python-format +msgid "Reading MusicXML from %s ..." +msgstr "「%s」からオプションを読み出します\n" -#: dispatcher.cc:89 -#, fuzzy, c-format -msgid "Unknown event class %s" -msgstr "未知の署名クラスです" +#: musicxml2ly.py:2894 +#, fuzzy, python-format +msgid "Output to `%s'" +msgstr "%s へ出力リダイレクトされました\n" -#: dispatcher.cc:171 -#, fuzzy, c-format -msgid "Junking event: %s" -msgstr "イベントを横取り(_G)" +#: musicxml2ly.py:2964 +#, fuzzy, python-format +msgid "Unable to find input file %s" +msgstr "インクルードファイルが見つかりません: \"%s\"" -#: auto-change-iterator.cc:74 change-iterator.cc:72 -#, c-format -msgid "cannot change, already in translator: %s" -msgstr "" +#: website_post.py:129 +#, fuzzy +msgid "English" +msgstr "英語" -#: tie-engraver.cc:117 +#: website_post.py:132 #, fuzzy -msgid "unterminated tie" -msgstr "タイの切替え" +msgid "Other languages" +msgstr "多言語" -#: tie-engraver.cc:348 -msgid "lonely tie" -msgstr "一つだけのタイ" +#: website_post.py:133 +#, python-format +msgid "About automatic language selection." +msgstr "" -#: dynamic-engraver.cc:193 -#, fuzzy -msgid "cannot find start of (de)crescendo" -msgstr "(デ)クレッシェンドの始点が見つかりません" +#: getopt-long.cc:153 +#, c-format +msgid "option `%s' requires an argument" +msgstr "オプション `%s' には引数が必要です" -#: dynamic-engraver.cc:200 -msgid "already have a decrescendo" -msgstr "デクレッシェンドが既にあります" +#: getopt-long.cc:157 +#, c-format +msgid "option `%s' does not allow an argument" +msgstr "オプション `%s' には引数が不要です" -#: dynamic-engraver.cc:202 -msgid "already have a crescendo" -msgstr "クレッシェンドが既にあります" +#: getopt-long.cc:161 +#, c-format +msgid "unrecognized option: `%s'" +msgstr "認識できないオプション: `%s'" -#: dynamic-engraver.cc:205 -#, fuzzy -msgid "cresc starts here" -msgstr "ここにリクエストをどうぞ" +#: getopt-long.cc:167 +#, c-format +msgid "invalid argument `%s' to option `%s'" +msgstr "オプション `%2$s' に対する無効な引数 `%1$s'" -#: dynamic-engraver.cc:333 -msgid "unterminated (de)crescendo" -msgstr "終端のない(デ)クレッシェンド" +#: warn.cc:56 +#, c-format +msgid "Log level set to %d\n" +msgstr "ログレベルを %d にセットします\n" -#: paper-score.cc:122 minimal-page-breaking.cc:40 -#, fuzzy -msgid "Calculating line breaks..." -msgstr "自発的休憩" +#: warn.cc:89 +#, c-format +msgid "unknown log level `%s', using default (INFO)" +msgstr "ログレベル `%s' は不明です, デフォルト (INFO) を使います" -#: paper-score.cc:134 -#, fuzzy, c-format -msgid "Element count %d (spanners %d) " -msgstr "ストリップのデータ量" +#. Some expected warning was not triggered, so print out a warning. +#: warn.cc:112 +#, c-format +msgid "%d expected warning(s) not encountered: " +msgstr "%d 個の予想された警告が発生していません:" -#: paper-score.cc:138 +#: warn.cc:183 +#, c-format +msgid "fatal error: %s" +msgstr "致命的なエラー: %s" + +#: warn.cc:192 +#, c-format +msgid "suppressed programming error: %s" +msgstr "抑制されたプログラミングエラー: %s" + +#: warn.cc:197 +#, c-format +msgid "programming error: %s" +msgstr "プログラミングエラー: %s" + +#: warn.cc:198 #, fuzzy -msgid "Preprocessing graphical objects..." -msgstr "オブジェクトが多すぎます" +msgid "continuing, cross fingers" +msgstr "クロスデバイスリンク" + +#: warn.cc:207 +#, c-format +msgid "suppressed error: %s" +msgstr "抑制されたエラー: %s" -#: paper-score.cc:162 optimal-page-breaking.cc:208 -#: page-turn-page-breaking.cc:248 -#, fuzzy -msgid "Drawing systems..." -msgstr "KIllustrator 絵画" +#: warn.cc:219 +#, c-format +msgid "suppressed warning: %s" +msgstr "抑制された警告: %s" -#: mensural-ligature-engraver.cc:96 -msgid "ligature with less than 2 heads -> skipping" +#: accidental-engraver.cc:180 +#, c-format +msgid "accidental typesetting list must begin with context-name: %s" msgstr "" -#: mensural-ligature-engraver.cc:123 -msgid "cannot determine pitch of ligature primitive -> skipping" +#: accidental-engraver.cc:207 +#, c-format +msgid "procedure or context-name expected for accidental rule, found %s" msgstr "" -#: mensural-ligature-engraver.cc:137 -msgid "single note ligature - skipping" +#: accidental.cc:141 +#, c-format +msgid "Could not find glyph-name for alteration %s" msgstr "" -#: mensural-ligature-engraver.cc:148 -msgid "prime interval within ligature -> skipping" +#: accidental.cc:157 +msgid "natural alteration glyph not found" msgstr "" -#: mensural-ligature-engraver.cc:159 -msgid "mensural ligature: duration none of Mx, L, B, S -> skipping" +#: all-font-metrics.cc:159 +#, c-format +msgid "cannot find font: `%s'" +msgstr "フォントが見つかりません: `%s'" + +#: apply-context-iterator.cc:42 +#, fuzzy +msgid "\\applycontext argument is not a procedure" +msgstr "エラー: %s() の 第%d引数が文字列ではありません\n" + +#: arpeggio.cc:138 +msgid "no heads for arpeggio found?" msgstr "" -#: mensural-ligature-engraver.cc:202 -msgid "semibrevis must be followed by another one -> skipping" +#: axis-group-engraver.cc:149 +msgid "Axis_group_engraver: vertical group already has a parent" msgstr "" -#: mensural-ligature-engraver.cc:212 -msgid "" -"semibreves can only appear at the beginning of a ligature,\n" -"and there may be only zero or two of them" +#: axis-group-engraver.cc:150 +msgid "are there two Axis_group_engravers?" msgstr "" -#: mensural-ligature-engraver.cc:232 -msgid "" -"invalid ligatura ending:\n" -"when the last note is a descending brevis,\n" -"the penultimate note must be another one,\n" -"or the ligatura must be LB or SSB" +#: axis-group-engraver.cc:151 +#, fuzzy +msgid "removing this vertical group" +msgstr "このグループには %d 個のパッケージが含まれています。" + +#: axis-group-interface.cc:716 +#, c-format +msgid "\"%s\" is not a valid outside-staff-placement-directive" msgstr "" -#: mensural-ligature-engraver.cc:387 -msgid "unexpected case fall-through" +#: axis-group-interface.cc:788 +msgid "an outside-staff object should have a direction, defaulting to up" msgstr "" -#: piano-pedal-engraver.cc:279 -#, fuzzy, c-format -msgid "expect 3 strings for piano pedals, found: %ld" -msgstr "ピアノペダルの始点が見つかりません: `%s'" +#: bar-check-iterator.cc:84 +#, c-format +msgid "barcheck failed at: %s" +msgstr "小節チェックが失敗: %s" -#: piano-pedal-engraver.cc:294 piano-pedal-engraver.cc:305 -#: piano-pedal-performer.cc:104 -#, fuzzy, c-format -msgid "cannot find start of piano pedal: `%s'" -msgstr "ピアノペダルの始点が見つかりません: `%s'" +#: beam-engraver.cc:148 +msgid "already have a beam" +msgstr "既に連桁があります" -#: piano-pedal-engraver.cc:340 -#, fuzzy, c-format -msgid "cannot find start of piano pedal bracket: `%s'" -msgstr "ピアノペダルの始点が見つかりません: `%s'" +#: beam-engraver.cc:235 +msgid "unterminated beam" +msgstr "終端のない連桁" -#: input.cc:138 source-file.cc:178 source-file.cc:193 -msgid "position unknown" -msgstr "位置が判りません" +#: beam-engraver.cc:282 chord-tremolo-engraver.cc:149 +msgid "stem must have Rhythmic structure" +msgstr "符尾はリズム構造を持たねばなりません" -#: stem.cc:128 +#: beam-engraver.cc:293 #, fuzzy -msgid "weird stem size, check for narrow beams" -msgstr "変な符尾のサイズ -- 細い鈎のチェックをして下さい" +msgid "stem does not fit in beam" +msgstr "符尾が連桁の中におさまりません" -#: relative-octave-check.cc:49 -#, fuzzy -msgid "Failed octave check, got: " -msgstr "シンボリックリンク %s のチェックに失敗しました: %s" +#: beam-engraver.cc:294 +msgid "beam was started here" +msgstr "連桁はここから開始されました" -#: translator-ctors.cc:65 -#, c-format -msgid "unknown translator: `%s'" -msgstr "判らないトランスレータ: `%s'" +#. We are completely screwed. +#: beam-quanting.cc:850 +msgid "no viable initial configuration found: may not find good beam slope" +msgstr "" -#: ligature-engraver.cc:104 ligature-bracket-engraver.cc:72 -#, fuzzy -msgid "cannot find start of ligature" -msgstr "'%s' の URL が見つかりません" +#: beam.cc:183 +msgid "removing beam with no stems" +msgstr "" -#: ligature-engraver.cc:109 -#, fuzzy -msgid "no right bound" -msgstr "境界 Import ディレクトリ" +#: change-iterator.cc:34 +#, fuzzy, c-format +msgid "cannot change `%s' to `%s'" +msgstr "警告: %s に変更できません.\n" -#: ligature-engraver.cc:131 ligature-bracket-engraver.cc:85 +#. FIXME: constant error message. +#: change-iterator.cc:67 #, fuzzy -msgid "already have a ligature" -msgstr "AE 合字 Æ" +msgid "cannot find context to switch to" +msgstr "実効ユーザID を %ld に変更できません: %s\n" -#: ligature-engraver.cc:140 -#, fuzzy -msgid "no left bound" -msgstr "リソースに空きがありません" +#. No enclosing context was found because the iterator's immediate +#. context is the kind that was sought. +#. We could change the current translator's id, but that would make +#. errors hard to catch. +#. +#. last->translator_id_string () = get_change +#. ()->change_to_id_string (); +#: change-iterator.cc:78 +#, c-format +msgid "not changing to same context type: %s" +msgstr "" -#: ligature-engraver.cc:184 +#. FIXME: incomprehensible message +#: change-iterator.cc:82 +msgid "none of these in my family" +msgstr "ファミリの中にありません" + +#: chord-tremolo-engraver.cc:88 #, fuzzy -msgid "unterminated ligature" -msgstr "AE 合字 Æ" +msgid "No tremolo to end" +msgstr "ファイルの末尾に追加" -#: ligature-engraver.cc:211 -msgid "ignoring rest: ligature may not contain rest" -msgstr "" +#: chord-tremolo-engraver.cc:109 +msgid "unterminated chord tremolo" +msgstr "終端のないコードトレモロ" -#: ligature-engraver.cc:212 -#, fuzzy -msgid "ligature was started here" -msgstr "鈎はここから開始されました" +#: clef.cc:65 +#, fuzzy, c-format +msgid "clef `%s' not found" +msgstr "ブラシ '%s' が見つかりません。" -#: tuplet-engraver.cc:110 +#: cluster.cc:120 +#, fuzzy, c-format +msgid "unknown cluster style `%s'" +msgstr "名前復元 (demangle) の方式 `%s' が不明です" + +#: cluster.cc:157 #, fuzzy -msgid "No tuplet to end" -msgstr "ファイルの末尾に追加" +msgid "junking empty cluster" +msgstr "警告: $PATH が定義されていません" -#: ttf.cc:480 ttf.cc:528 +#: coherent-ligature-engraver.cc:110 #, c-format -msgid "font index %d too large for font `%s', using index 0" +msgid "Coherent_ligature_engraver: setting `spacing-increment=0.01': ptr=%ul" msgstr "" -#: ttf.cc:512 ttf.cc:562 -msgid "font index must be non-negative, using index 0" -msgstr "" +#: constrained-breaking.cc:187 constrained-breaking.cc:206 +#, fuzzy +msgid "cannot find line breaking that satisfies constraints" +msgstr "その解決は制限を満たしません" -#: multi-measure-rest.cc:140 -msgid "usable-duration-logs must be a non-empty list. Falling back to whole rests." +#: context-property.cc:46 +msgid "need symbol arguments for \\override and \\revert" msgstr "" -#: partial-iterator.cc:45 -msgid "trying to use \\partial after the start of a piece" +#: context.cc:144 +#, fuzzy, c-format +msgid "cannot find or create new `%s'" +msgstr "%s: 新しいデフォルトファイルを作れません\n" + +#: context.cc:223 +#, fuzzy, c-format +msgid "cannot find or create `%s' called `%s'" +msgstr "`%2$s' に呼ばれた `%1$s' が見つからないか作れません" + +#: context.cc:416 +#, fuzzy, c-format +msgid "cannot find or create: `%s'" +msgstr "警告: cat ディレクトリ %s を作成できません" + +#: context.cc:430 +#, fuzzy, c-format +msgid "cannot find or create new Bottom = \"%s\"" +msgstr "%s: 新しいデフォルトファイルを作れません\n" + +#: custos.cc:87 +#, fuzzy, c-format +msgid "custos `%s' not found" +msgstr "ブラシ '%s' が見つかりません。" + +#: dispatcher.cc:82 +msgid "Event class should be a list" msgstr "" -#: minimal-page-breaking.cc:44 -#, fuzzy -msgid "Calculating page breaks..." -msgstr "自発的休憩" +#: dispatcher.cc:165 +#, fuzzy, c-format +msgid "Junking event: %s" +msgstr "イベントを横取り(_G)" -#: vaticana-ligature-engraver.cc:400 -#, c-format -msgid "ignored prefix(es) `%s' of this head according to restrictions of the selected ligature style" +#: dispatcher.cc:279 +msgid "Attempting to remove nonexisting listener." msgstr "" -#: vaticana-ligature-engraver.cc:736 -#, c-format -msgid "Vaticana_ligature_engraver: setting `spacing-increment = %f': ptr =%ul" +#: dispatcher.cc:305 +msgid "Already listening to dispatcher, ignoring request" msgstr "" -#: paper-book.cc:214 +#: dots.cc:48 +#, fuzzy, c-format +msgid "dot `%s' not found" +msgstr "ブラシ '%s' が見つかりません。" + +#: dynamic-engraver.cc:169 #, c-format -msgid "program option -dprint-pages not supported by backend `%s'" +msgid "" +"unknown crescendo style: %s\n" +"defaulting to hairpin." msgstr "" -#: paper-book.cc:233 -#, c-format -msgid "program option -dpreview not supported by backend `%s'" +#: dynamic-engraver.cc:234 slur-proto-engraver.cc:119 +#, fuzzy, c-format +msgid "unterminated %s" +msgstr "「s」コマンドが終了していません" + +#. No explicit dynamic script events have occurred yet, but there is +#. nevertheless a dynamic spanner. Initialize last_volume_ to a +#. value within the available range. +#: dynamic-performer.cc:129 +msgid "(De)crescendo with unspecified starting volume in MIDI." msgstr "" #: episema-engraver.cc:75 @@ -2038,109 +1925,162 @@ msgstr "'%s' の URL が見つかりません" msgid "unterminated episema" msgstr "「s」コマンドが終了していません" -#: score-engraver.cc:78 +#: extender-engraver.cc:169 extender-engraver.cc:178 +msgid "unterminated extender" +msgstr "終端のないエクステンダ" + +#: flag.cc:133 #, fuzzy, c-format -msgid "cannot find `%s'" -msgstr "見つかりません: `%s'" +msgid "flag `%s' not found" +msgstr "ブラシ '%s' が見つかりません。" + +#: flag.cc:153 +#, fuzzy, c-format +msgid "flag stroke `%s' not found" +msgstr " 検索文字列が見付かりません " + +#: font-config-scheme.cc:151 font-config.cc:82 +#, c-format +msgid "failed adding font directory: %s" +msgstr "フォントディレクトリの追加に失敗しました: %s" + +#: font-config-scheme.cc:153 font-config.cc:84 +#, c-format +msgid "Adding font directory: %s" +msgstr "フォントディレクトリを追加しています: %s" + +#: font-config-scheme.cc:167 +#, c-format +msgid "failed adding font file: %s" +msgstr "フォントファイルの追加に失敗しました: %s" + +#: font-config-scheme.cc:169 +#, c-format +msgid "Adding font file: %s" +msgstr "フォントファイルを追加しています: %s" + +#: font-config.cc:38 +msgid "Initializing FontConfig..." +msgstr "FontConfig 初期化中..." + +#: font-config.cc:70 +#, c-format +msgid "failed to add fontconfig configuration file `%s'" +msgstr "fontconfig 設定ファイルの追加に失敗しました: %s" + +#: font-config.cc:73 +#, c-format +msgid "Adding fontconfig configuration file: %s" +msgstr "fontconfig 設定ファイルを追加しています: %s" + +#: font-config.cc:86 +msgid "Building font database..." +msgstr "フォントデータベースを構築しています" + +#: footnote-engraver.cc:87 +msgid "Must be footnote-event." +msgstr "" + +#: general-scheme.cc:403 +#, fuzzy, c-format +msgid "failed redirecting stderr to `%s'" +msgstr "" +"\n" +"%s を受信しました、%s に出力をリダイレクトします。\n" + +#: general-scheme.cc:482 output-ps.scm:48 +msgid "Found infinity or nan in output. Substituting 0.0" +msgstr "" + +#: glissando-engraver.cc:158 +#, fuzzy +msgid "unterminated glissando" +msgstr "「s」コマンドが終了していません" -#: score-engraver.cc:80 -msgid "Music font has not been installed properly." -msgstr "" +#: global-context-scheme.cc:95 global-context-scheme.cc:113 +#, fuzzy +msgid "no music found in score" +msgstr " %s に特定のエントリーは見つかりませんでした " -#: score-engraver.cc:82 -#, fuzzy, c-format -msgid "Search path `%s'" -msgstr "検索パス : %s\n" +#: global-context-scheme.cc:103 +msgid "Interpreting music..." +msgstr "楽曲を解釈中..." -#: score-engraver.cc:84 -msgid "Aborting" -msgstr "終了します" +#: global-context-scheme.cc:125 +#, c-format +msgid "elapsed time: %.2f seconds" +msgstr "経過時間: %.2f 秒" -#: performance.cc:54 -#, fuzzy -msgid "Track..." -msgstr "トラックのピーク" +#: gregorian-ligature-engraver.cc:70 +#, c-format +msgid "\\%s ignored" +msgstr "\\%s を無視しました" -#: performance.cc:82 +#: gregorian-ligature-engraver.cc:75 #, fuzzy, c-format -msgid "MIDI output to `%s'..." -msgstr "%s へ出力リダイレクトされました\n" - -#: note-collision.cc:504 -#, fuzzy -msgid "ignoring too many clashing note columns" -msgstr "釣り合わない音符が多すぎます。それらを無視します。" +msgid "implied \\%s added" +msgstr "「追加済」を表示" -#. fixme: be more verbose. -#: volta-engraver.cc:111 -#, fuzzy -msgid "cannot end volta spanner" -msgstr "%s: 省略記号の範囲の終わりに`%s'がありません" +#. ligature may not start with 2nd head of pes or flexa +#: gregorian-ligature-engraver.cc:224 +msgid "cannot apply `\\~' on first head of ligature" +msgstr "" -#: volta-engraver.cc:121 -msgid "already have a volta spanner, ending that one prematurely" +#. (pitch == prev_pitch) +#: gregorian-ligature-engraver.cc:236 +msgid "cannot apply `\\~' on heads with identical pitch" msgstr "" -#: volta-engraver.cc:125 -#, fuzzy -msgid "also already have an ended spanner" -msgstr "既に鈎があります" +#: grob-interface.cc:68 +#, c-format +msgid "Unknown interface `%s'" +msgstr "`%s' は未知のインタフェースです" -#: volta-engraver.cc:126 -#, fuzzy -msgid "giving up" +#: grob-interface.cc:79 +#, c-format +msgid "Grob `%s' has no interface for property `%s'" msgstr "" -"中止しました。\n" -"\n" -#: page-layout-problem.cc:709 -msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" +#: grob-property.cc:33 +#, c-format +msgid "%d: %s" msgstr "" -#: page-layout-problem.cc:712 +#: grob.cc:492 #, c-format -msgid "cannot fit music on page: overflow is %f" +msgid "ignored infinite %s-offset" msgstr "" -#: page-layout-problem.cc:714 -#, fuzzy -msgid "compressing music to fit" -msgstr "画像に高さを合わせる(_F)" - -#: page-layout-problem.cc:1176 -msgid "staff-affinities should only decrease" +#: hairpin.cc:60 +msgid "Asking for broken bound padding at a non-broken bound." msgstr "" -#: apply-context-iterator.cc:42 +#: hairpin.cc:257 #, fuzzy -msgid "\\applycontext argument is not a procedure" -msgstr "エラー: %s() の 第%d引数が文字列ではありません\n" +msgid "decrescendo too small" +msgstr "時刻が小さすぎます" -#. FIXME: constant error message. -#: mark-engraver.cc:157 +#: horizontal-bracket-engraver.cc:62 #, fuzzy -msgid "rehearsalMark must have integer value" -msgstr "%sの値は整数でなければなりません" - -#: mark-engraver.cc:163 -msgid "mark label must be a markup object" -msgstr "" +msgid "do not have that many brackets" +msgstr "マッチしないパラグラフのみ表示します。" -#: stem-engraver.cc:105 +#: horizontal-bracket-engraver.cc:71 #, fuzzy -msgid "tremolo duration is too long" -msgstr "diversion パスが長すぎます" +msgid "conflicting note group events" +msgstr "拍子の要求が競合します" -#: stem-engraver.cc:157 -#, fuzzy, c-format -msgid "adding note head to incompatible stem (type = %d/%d)" -msgstr "矛盾した符尾へ符頭を追加します (タイプ = %d)" +#: hyphen-engraver.cc:104 +#, fuzzy +msgid "removing unterminated hyphen" +msgstr "%s:%d: 警告: 文字列に終端がありません" -#: stem-engraver.cc:160 -msgid "maybe input should specify polyphonic voices" -msgstr "" +#: hyphen-engraver.cc:118 +#, fuzzy +msgid "unterminated hyphen; removing" +msgstr "リモートファイル %s を削除中に %s " -#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108 +#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108 #, fuzzy, c-format msgid "cannot find file: `%s'" msgstr "ファイルが見つかりません" @@ -2150,217 +2090,158 @@ msgstr "ファイルが見つかりません" msgid "(search path: `%s')" msgstr "(検索パス: `%s')" -#: relocate.cc:52 -#, fuzzy, c-format -msgid "Setting %s to %s" -msgstr "ドメインを`%s'へ設定しました\n" +#: input.cc:138 source-file.cc:180 source-file.cc:195 +msgid "position unknown" +msgstr "位置が判りません" -#. this warning should only be printed in debug mode! -#: relocate.cc:73 -#, fuzzy, c-format -msgid "no such file: %s for %s" -msgstr "出力ファイル用の名前がありません" +#: key-engraver.cc:197 +#, fuzzy +msgid "Incomplete keyAlterationOrder for key signature" +msgstr "メタデータの値を設定できませんでした" -#. this warning should only be printed in debug mode! -#. this warning should only be printed in debug mode -#: relocate.cc:84 relocate.cc:102 +#: key-signature-interface.cc:77 #, fuzzy, c-format -msgid "no such directory: %s for %s" -msgstr "そのようなファイルやディレクトリはありません" - -#: relocate.cc:93 -#, c-format -msgid "%s=%s (prepend)\n" -msgstr "" +msgid "No glyph found for alteration: %s" +msgstr "“%s”用の失効鍵が見つかりません\n" -#: relocate.cc:124 -#, c-format -msgid "not relocating, no %s/ or current/ found under %s" -msgstr "" +#: key-signature-interface.cc:87 +#, fuzzy +msgid "alteration not found" +msgstr "ブラシ '%s' が見つかりません。" -#: relocate.cc:134 -#, c-format -msgid "Relocation: compile datadir=%s, new datadir=%s" -msgstr "" +#: ligature-bracket-engraver.cc:72 ligature-engraver.cc:109 +#, fuzzy +msgid "cannot find start of ligature" +msgstr "'%s' の URL が見つかりません" -#: relocate.cc:146 -#, fuzzy, c-format -msgid "Relocation: framework_prefix=%s" -msgstr "おかしな名前空間の接頭子" +#: ligature-bracket-engraver.cc:85 ligature-engraver.cc:136 +#, fuzzy +msgid "already have a ligature" +msgstr "AE 合字 Æ" -#: relocate.cc:186 -#, fuzzy, c-format -msgid "Relocation: is absolute: argv0=%s\n" -msgstr "ファイル名 \"%s\" は絶対パスではありません" +#: ligature-engraver.cc:114 +#, fuzzy +msgid "no right bound" +msgstr "境界 Import ディレクトリ" -#: relocate.cc:192 -#, c-format -msgid "Relocation: from cwd: argv0=%s\n" -msgstr "" +#: ligature-engraver.cc:145 +#, fuzzy +msgid "no left bound" +msgstr "リソースに空きがありません" -#: relocate.cc:208 -#, fuzzy, c-format -msgid "" -"Relocation: from PATH=%s\n" -"argv0=%s" -msgstr "このテキストレイヤーからパスを作成します" +#: ligature-engraver.cc:189 +#, fuzzy +msgid "unterminated ligature" +msgstr "AE 合字 Æ" -#: relocate.cc:235 -msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR" +#: ligature-engraver.cc:216 +msgid "ignoring rest: ligature may not contain rest" msgstr "" -#: relocate.cc:360 -#, fuzzy, c-format -msgid "Relocation file: %s" -msgstr "HTML ファイル (*.html)|*.html" - -#: relocate.cc:364 source-file.cc:65 -#, fuzzy, c-format -msgid "cannot open file: `%s'" -msgstr " ファイル '%s' を開けません " - -#: relocate.cc:394 -#, fuzzy, c-format -msgid "Unknown relocation command %s" -msgstr "不明なビルトインコマンド '%s'\n" - -#: note-column.cc:135 -msgid "cannot have note heads and rests together on a stem" -msgstr "" +#: ligature-engraver.cc:217 +#, fuzzy +msgid "ligature was started here" +msgstr "鈎はここから開始されました" -#: beam.cc:180 -msgid "removing beam with no stems" -msgstr "" +#: lily-guile.cc:94 +#, c-format +msgid "(load path: `%s')" +msgstr "(読込パス: `%s')" -#: staff-performer.cc:257 -msgid "MIDI channel wrapped around" +#: lily-guile.cc:413 +#, c-format +msgid "cannot find property type-check for `%s' (%s)." msgstr "" -#: staff-performer.cc:258 +#: lily-guile.cc:416 #, fuzzy -msgid "remapping modulo 16" -msgstr "Functionキー 16" - -#: dots.cc:48 -#, fuzzy, c-format -msgid "dot `%s' not found" -msgstr "ブラシ '%s' が見つかりません。" +msgid "perhaps a typing error?" +msgstr "未知のシステムエラー" -#: font-config.cc:38 +#: lily-guile.cc:423 #, fuzzy -msgid "Initializing FontConfig..." -msgstr "ストリームの初期化中" +msgid "skipping assignment" +msgstr "とにかくログイン" -#: font-config.cc:53 font-config-scheme.cc:151 -#, fuzzy, c-format -msgid "failed adding font directory: %s" -msgstr "ディレクトリの追加が失敗しました: %s (対象: %s) (%d)" +#: lily-guile.cc:442 +#, c-format +msgid "type check for `%s' failed; value `%s' must be of type `%s'" +msgstr "" -#: font-config.cc:55 font-config-scheme.cc:153 -#, fuzzy, c-format -msgid "Adding font directory: %s" -msgstr "フォントファイルを追加しています: %s" +#. Uh oh. unsmob delivered 0, yet +#. unsmob delivers true. This means that unsmob is a +#. matching check from a base class of T, but var is of an +#. incompatible derived type. +#: lily-guile.cc:462 +msgid "Wrong kind of " +msgstr "" -#: font-config.cc:58 -#, fuzzy -msgid "Building font database..." -msgstr "タグのデータベースを構築しています" +#: lily-lexer.cc:251 +msgid "include files are not allowed in safe mode" +msgstr "" -#: change-iterator.cc:34 +#: lily-lexer.cc:278 #, fuzzy, c-format -msgid "cannot change `%s' to `%s'" -msgstr "警告: %s に変更できません.\n" - -#. FIXME: constant error message. -#: change-iterator.cc:93 -#, fuzzy -msgid "cannot find context to switch to" -msgstr "実効ユーザID を %ld に変更できません: %s\n" +msgid "identifier name is a keyword: `%s'" +msgstr "`%s' という名前は既に使用されています!" -#. We could change the current translator's id, but that would make -#. errors hard to catch. -#. -#. last->translator_id_string () = get_change -#. ()->change_to_id_string (); -#: change-iterator.cc:102 +#: lily-lexer.cc:299 lily-lexer.cc:312 #, c-format -msgid "not changing to same context type: %s" -msgstr "" - -#. FIXME: uncomprehensable message -#: change-iterator.cc:106 -msgid "none of these in my family" -msgstr "ファミリの中にありません" +msgid "%s:EOF" +msgstr "%s:EOF" -#: slur.cc:438 +#: lily-modules.cc:81 #, c-format -msgid "Ignoring grob for slur: %s. avoid-slur not set?" +msgid "Uninitialized variable `%s' in module (%s)" msgstr "" -#: source-file.cc:85 +#: lily-parser-scheme.cc:80 #, fuzzy, c-format -msgid "expected to read %d characters, got %d" -msgstr "" -"読み込むファイルまたは\n" -"使用する文字列" +msgid "Changing working directory to: `%s'" +msgstr "作業ディレクトリを '%s' に変更できません" -#. find out the ideal number of pages -#: optimal-page-breaking.cc:62 -#, fuzzy -msgid "Finding the ideal number of pages..." -msgstr "印刷するページ数" +#: lily-parser-scheme.cc:84 +#, fuzzy, c-format +msgid "unable to change directory to: `%s'" +msgstr "ディレクトリーを %s に変更できません" -#: optimal-page-breaking.cc:85 -msgid "could not satisfy systems-per-page and page-count at the same time, ignoring systems-per-page" -msgstr "" +#: lily-parser-scheme.cc:99 +#, fuzzy, c-format +msgid "cannot find init file: `%s'" +msgstr " ヘルプファイルでノード %s を見付けることができません " -#: optimal-page-breaking.cc:105 -#, fuzzy -msgid "Fitting music on 1 page..." -msgstr "このページで %d 個見つかりました" +#: lily-parser-scheme.cc:117 +#, c-format +msgid "Processing `%s'" +msgstr "`%s' を処理しています" -#: optimal-page-breaking.cc:107 -#, fuzzy, c-format -msgid "Fitting music on %d pages..." -msgstr "MoH サーバ (Music on Hold)" +#: lily-parser-scheme.cc:210 +msgid "ly:parser-parse-string is only valid with a new parser. Use ly:parser-include-string instead." +msgstr "" -#: optimal-page-breaking.cc:109 -#, c-format -msgid "Fitting music on %d or %d pages..." +#: lily-parser-scheme.cc:241 +msgid "ly:parse-string-expression is only valid with a new parser. Use ly:parser-include-string instead." msgstr "" -#: optimal-page-breaking.cc:119 optimal-page-breaking.cc:173 -#, fuzzy, c-format -msgid "trying %d systems" -msgstr "ディレクトリ %s の試行中" +#: lily-parser.cc:106 +msgid "Parsing..." +msgstr "構文解析中..." -#: optimal-page-breaking.cc:138 optimal-page-breaking.cc:201 +#: lookup.cc:178 #, c-format -msgid "best score for this sys-count: %f" +msgid "Not drawing a box with negative dimension, %.2f by %.2f." msgstr "" -#: new-dynamic-engraver.cc:168 -#, c-format -msgid "" -"unknown crescendo style: %s\n" -"defaulting to hairpin." +#: lyric-combine-music-iterator.cc:204 +msgid "argument of \\lyricsto should contain Lyrics context" msgstr "" -#: new-dynamic-engraver.cc:233 +#: lyric-combine-music-iterator.cc:344 #, fuzzy, c-format -msgid "unterminated %s" -msgstr "「s」コマンドが終了していません" - -#: hairpin.cc:263 -#, fuzzy -msgid "decrescendo too small" -msgstr "時刻が小さすぎます" - -#: extender-engraver.cc:169 extender-engraver.cc:178 -msgid "unterminated extender" -msgstr "終端のないエクステンダ" +msgid "cannot find %s `%s'" +msgstr "見つかりません: `%s'" -#: main.cc:101 +#: main.cc:106 #, fuzzy, c-format msgid "" "This program is free software. It is covered by the GNU General Public\n" @@ -2377,7 +2258,7 @@ msgstr "" "これを改変したり、複製を配布したりする事は歓迎されます。\n" "`--warranty' オプション付きで起動すると、より詳細な情報が得られます。\n" -#: main.cc:107 +#: main.cc:112 #, fuzzy msgid "" " This program is free software; you can redistribute it and/or\n" @@ -2422,107 +2303,121 @@ msgstr "" "です(COPYING ファイルを参照)。そうでない場合は、Free Software Foundation,\n" "Inc., 675 Mass Ave, Cambridge, MA 02139, USA に手紙を書いてください。\n" -#: main.cc:141 -#, fuzzy +#: main.cc:150 msgid "SYM[=VAL]" -msgstr "円錐形 (対称)" +msgstr "SYM[=VAL]" -#: main.cc:142 +#: main.cc:151 msgid "" "set Scheme option SYM to VAL (default: #t).\n" "Use -dhelp for help." msgstr "" +"Scheme オプション SYM を VAL に\n" +"セットします(デフォルト: #t).\n" +"-dhelp でヘルプを表示します." -#: main.cc:146 -#, fuzzy +#: main.cc:155 msgid "EXPR" -msgstr "test [表現]" +msgstr "EXPR" -#: main.cc:146 -#, fuzzy +#: main.cc:155 msgid "evaluate scheme code" -msgstr "Scheme ソースコード" +msgstr "Scheme コードを評価します" #. Bug in option parser: --output =foe is taken as an abbreviation #. for --output-format. -#: main.cc:149 -#, fuzzy +#: main.cc:158 msgid "FORMATs" -msgstr "%s: 形式を照合します:" +msgstr "FORMATs" -#: main.cc:149 +#: main.cc:158 msgid "dump FORMAT,... Also as separate options:" msgstr "" +"FORMAT,... を吐き出します.\n" +"また個別のオプションとして:" -#: main.cc:150 -#, fuzzy +#: main.cc:159 msgid "generate PDF (default)" -msgstr "自動" +msgstr "PDF を生成します(デフォルト)" -#: main.cc:151 -#, fuzzy +#: main.cc:160 msgid "generate PNG" -msgstr "PNG 画像" +msgstr "PNG を生成します" -#: main.cc:152 -#, fuzzy +#: main.cc:161 msgid "generate PostScript" -msgstr "PostScript ドキュメント" +msgstr "PostScript を生成します" -#: main.cc:155 -#, fuzzy +#: main.cc:162 +msgid "generate big PDF files" +msgstr "大きい PDF ファイルを生成します" + +#: main.cc:165 msgid "FIELD" -msgstr "<フィールド>,<フィールド>,..." +msgstr "FIELD" -#: main.cc:155 +#: main.cc:165 msgid "" "dump header field FIELD to file\n" "named BASENAME.FIELD" msgstr "" +"ヘッダ フィールドをファイル\n" +"BASENAME.FIELD に吐き出します" -#: main.cc:158 +#: main.cc:168 msgid "add DIR to search path" -msgstr "DIR を検索パスに追加" +msgstr "DIR を検索パスに追加します" -#: main.cc:159 +#: main.cc:169 msgid "use FILE as init file" -msgstr "FILE を初期化ファイルとして使用" +msgstr "FILE を初期化ファイルとして使用します" -#: main.cc:162 -#, fuzzy +#: main.cc:172 msgid "USER, GROUP, JAIL, DIR" -msgstr "ユーザがグループにありません" +msgstr "USER, GROUP, JAIL, DIR" -#: main.cc:162 +#: main.cc:172 msgid "" "chroot to JAIL, become USER:GROUP\n" "and cd into DIR" msgstr "" +"JAIL に chroot, USER:GROUP になり\n" +"DIR に cd します" -#: main.cc:167 +#: main.cc:177 msgid "" "print log messages according to LOGLEVEL. Possible values are:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG." msgstr "" +"LOGLEVEL に応じたログメッセージを\n" +"出力します. 取り得る値は:\n" +"NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (デフォルト) および DEBUG." -#: main.cc:171 +#: main.cc:181 msgid "write output to FILE (suffix will be added)" -msgstr "" +msgstr "FILE に出力します(拡張子が追加されます)" -#: main.cc:172 +#: main.cc:182 msgid "relocate using directory of lilypond program" msgstr "" +"lilypond プログラムのディレクトリで\n" +"再配置します" -#: main.cc:173 +#: main.cc:183 msgid "no progress, only error messages (equivalent to loglevel=ERROR)" msgstr "" +"進捗メッセージを表示せず\n" +"エラーメッセージのみ表示します\n" +"(loglevel=ERROR と同じ)" -#: main.cc:175 +#: main.cc:185 msgid "be verbose (equivalent to loglevel=DEBUG)" msgstr "" +"メッセージを冗長にします\n" +"(loglevel=DEBUG と同じ)" #. Do not update the copyright years here, run `make grand-replace' -#: main.cc:242 +#: main.cc:264 #, fuzzy, c-format msgid "" "Copyright (c) %s by\n" @@ -2533,1259 +2428,1707 @@ msgstr "" "%s, %s 他.\n" #. No version number or newline here. It confuses help2man. -#: main.cc:269 -#, fuzzy, c-format +#: main.cc:302 +#, c-format msgid "Usage: %s [OPTION]... FILE..." -msgstr "使用法: %s [オプション] [ファイル]...\n" +msgstr "使用法: %s [オプション]... FILE..." -#: main.cc:271 -#, fuzzy +#: main.cc:304 msgid "Typeset music and/or produce MIDI from FILE." -msgstr "ファイルの楽曲を組版したり、MIDI 演奏したりする" +msgstr "FILE から楽譜を組版したり MIDI を生成したりします." -#: main.cc:273 +#: main.cc:306 msgid "LilyPond produces beautiful music notation." -msgstr "" +msgstr "LilyPond は美しい楽譜を生成します." -#: main.cc:275 -#, fuzzy, c-format +#: main.cc:308 +#, c-format msgid "For more information, see %s" -msgstr "より詳しい情報は %1 を参照してください" +msgstr "より詳しい情報は, %s を参照してください" -#: main.cc:277 +#: main.cc:310 msgid "Options:" msgstr "オプション:" -#: main.cc:331 +#: main.cc:377 #, c-format msgid "expected %d arguments with jail, found: %u" msgstr "" -#: main.cc:345 +#: main.cc:391 #, fuzzy, c-format msgid "no such user: %s" msgstr "%s: そのようなユーザは存在しません" -#: main.cc:347 +#: main.cc:393 #, c-format msgid "cannot get user id from user name: %s: %s" msgstr "" -#: main.cc:362 +#: main.cc:408 #, fuzzy, c-format msgid "no such group: %s" msgstr "-group: グループ名がない" -#: main.cc:364 +#: main.cc:410 #, c-format msgid "cannot get group id from group name: %s: %s" msgstr "" -#: main.cc:372 +#: main.cc:418 #, fuzzy, c-format msgid "cannot chroot to: %s: %s" msgstr "" -"\"%s\" へ chdir できません \n" -" %s " +"\"%s\" へ chdir できません \n" +" %s " + +#: main.cc:425 +#, fuzzy, c-format +msgid "cannot change group id to: %d: %s" +msgstr "ID を root へ変更できません。\n" + +#: main.cc:431 +#, fuzzy, c-format +msgid "cannot change user id to: %d: %s" +msgstr "ID を root へ変更できません。\n" + +#: main.cc:437 +#, fuzzy, c-format +msgid "cannot change working directory to: %s: %s" +msgstr "作業ディレクトリを '%s' に変更できません" + +#: main.cc:826 +#, fuzzy, c-format +msgid "exception caught: %s" +msgstr "シグナルを受け取りました" + +#. FIXME: constant error message. +#: mark-engraver.cc:150 +#, fuzzy +msgid "rehearsalMark must have integer value" +msgstr "%sの値は整数でなければなりません" + +#: mark-engraver.cc:156 +msgid "mark label must be a markup object" +msgstr "" + +#: mensural-ligature-engraver.cc:100 +msgid "ligature with less than 2 heads -> skipping" +msgstr "" + +#: mensural-ligature-engraver.cc:127 +msgid "cannot determine pitch of ligature primitive -> skipping" +msgstr "" + +#: mensural-ligature-engraver.cc:141 +msgid "single note ligature - skipping" +msgstr "" + +#: mensural-ligature-engraver.cc:152 +msgid "prime interval within ligature -> skipping" +msgstr "" + +#: mensural-ligature-engraver.cc:163 +msgid "mensural ligature: duration none of Mx, L, B, S -> skipping" +msgstr "" + +#: mensural-ligature-engraver.cc:206 +msgid "semibrevis must be followed by another one -> skipping" +msgstr "" + +#: mensural-ligature-engraver.cc:216 +msgid "" +"semibreves can only appear at the beginning of a ligature,\n" +"and there may be only zero or two of them" +msgstr "" + +#: mensural-ligature-engraver.cc:236 +msgid "" +"invalid ligatura ending:\n" +"when the last note is a descending brevis,\n" +"the penultimate note must be another one,\n" +"or the ligatura must be LB or SSB" +msgstr "" + +#: mensural-ligature-engraver.cc:396 +msgid "unexpected case fall-through" +msgstr "" + +#: midi-control-function-performer.cc:107 staff-performer.cc:153 +#, c-format +msgid "ignoring out-of-range value change for MIDI property `%s'" +msgstr "" + +#: midi-item.cc:93 +#, fuzzy, c-format +msgid "no such MIDI instrument: `%s'" +msgstr "そのユーザーIDはありません。\n" + +#: midi-item.cc:179 +msgid "Time signature with more than 255 beats. Truncating" +msgstr "" + +#: midi-stream.cc:38 +#, fuzzy, c-format +msgid "cannot open for write: %s: %s" +msgstr "%s を読み書きモードで開けません\n" + +#: midi-stream.cc:54 +#, fuzzy, c-format +msgid "cannot write to file: `%s'" +msgstr "" +"ファイル %s に書き込めません:\n" +"%s\n" + +#: minimal-page-breaking.cc:40 paper-score.cc:116 +#, fuzzy +msgid "Calculating line breaks..." +msgstr "自発的休憩" + +#: minimal-page-breaking.cc:44 +#, fuzzy +msgid "Calculating page breaks..." +msgstr "自発的休憩" + +#: multi-measure-rest.cc:152 +msgid "usable-duration-logs must be a non-empty list. Falling back to whole rests." +msgstr "" + +#: music.cc:150 +#, c-format +msgid "octave check failed; expected \"%s\", found: \"%s\"" +msgstr "" + +#: new-fingering-engraver.cc:113 +msgid "cannot add text scripts to individual note heads" +msgstr "" + +#: new-fingering-engraver.cc:269 +#, fuzzy +msgid "no placement found for fingerings" +msgstr "“%s”用の失効鍵が見つかりません\n" + +#: new-fingering-engraver.cc:270 +#, fuzzy +msgid "placing below" +msgstr "ラインより下のピクセル数" + +#: note-collision.cc:510 +msgid "this Voice needs a \\voiceXx or \\shiftXx setting" +msgstr "" + +#: note-column.cc:150 +msgid "cannot have note heads and rests together on a stem" +msgstr "" + +#: note-head.cc:95 +#, c-format +msgid "none of note heads `%s' or `%s' found" +msgstr "" + +#: note-heads-engraver.cc:76 +#, fuzzy +msgid "NoteEvent without pitch" +msgstr "'~%c' が '~%c' に一致していません." + +#: open-type-font.cc:45 +#, c-format +msgid "cannot allocate %lu bytes" +msgstr "%lu バイトを割当できません" + +#: open-type-font.cc:49 +#, fuzzy, c-format +msgid "cannot load font table: %s" +msgstr "実行ファイルを動的にロードできません" + +#: open-type-font.cc:54 +#, c-format +msgid "FreeType error: %s" +msgstr "FreeType エラー: %s" + +#: open-type-font.cc:115 +#, c-format +msgid "unsupported font format: %s" +msgstr "非対応のフォント形式: %s" + +#: open-type-font.cc:117 +#, fuzzy, c-format +msgid "error reading font file %s: %s" +msgstr "ファイルデスクリプタ %1 (%2)を読み込み中にエラー" + +#: open-type-font.cc:192 +#, c-format +msgid "FT_Get_Glyph_Name () Freetype error: %s" +msgstr "" + +#: open-type-font.cc:340 pango-font.cc:258 +#, c-format +msgid "FT_Get_Glyph_Name () error: %s" +msgstr "" + +#. find out the ideal number of pages +#: optimal-page-breaking.cc:62 +msgid "Finding the ideal number of pages..." +msgstr "理想的なページ数を見つけています..." + +#: optimal-page-breaking.cc:94 +msgid "could not satisfy systems-per-page and page-count at the same time, ignoring systems-per-page" +msgstr "" + +#: optimal-page-breaking.cc:114 +msgid "Fitting music on 1 page..." +msgstr "楽譜を 1 ページにしています..." + +#: optimal-page-breaking.cc:116 +#, fuzzy, c-format +msgid "Fitting music on %d pages..." +msgstr "楽譜を %d ページにしています..." + +#: optimal-page-breaking.cc:118 +#, c-format +msgid "Fitting music on %d or %d pages..." +msgstr "楽譜を %d または %d ページにしています..." + +#: optimal-page-breaking.cc:128 optimal-page-breaking.cc:181 +#, fuzzy, c-format +msgid "trying %d systems" +msgstr "ディレクトリ %s の試行中" + +#: optimal-page-breaking.cc:147 optimal-page-breaking.cc:209 +#, c-format +msgid "best score for this sys-count: %f" +msgstr "" + +#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249 +#: paper-score.cc:156 +msgid "Drawing systems..." +msgstr "描画しています..." + +#: output-def.cc:229 +msgid "margins do not fit with line-width, setting default values" +msgstr "" + +#: output-def.cc:236 +msgid "systems run off the page due to improper paper settings, setting default values" +msgstr "" + +#: page-breaking.cc:276 +msgid "ignoring min-systems-per-page and max-systems-per-page because systems-per-page was set" +msgstr "" + +#: page-breaking.cc:281 +msgid "min-systems-per-page is larger than max-systems-per-page, ignoring both values" +msgstr "" + +#: page-breaking.cc:636 +#, c-format +msgid "page %d has been compressed" +msgstr "" -#: main.cc:379 -#, fuzzy, c-format -msgid "cannot change group id to: %d: %s" -msgstr "ID を root へ変更できません。\n" +#: page-layout-problem.cc:400 +msgid "A page layout problem has been initiated that cannot accommodate footnotes." +msgstr "" -#: main.cc:385 -#, fuzzy, c-format -msgid "cannot change user id to: %d: %s" -msgstr "ID を root へ変更できません。\n" +#: page-layout-problem.cc:729 +msgid "ragged-bottom was specified, but page must be compressed" +msgstr "" -#: main.cc:391 -#, fuzzy, c-format -msgid "cannot change working directory to: %s: %s" -msgstr "作業ディレクトリを '%s' に変更できません" +#: page-layout-problem.cc:732 +#, c-format +msgid "compressing over-full page by %.1f staff-spaces" +msgstr "" -#: main.cc:639 -#, fuzzy, c-format -msgid "exception caught: %s" -msgstr "シグナルを受け取りました" +#: page-layout-problem.cc:1197 +msgid "staff-affinities should only decrease" +msgstr "" -#: page-turn-page-breaking.cc:168 +#: page-turn-page-breaking.cc:169 #, fuzzy, c-format msgid "page-turn-page-breaking: breaking from %d to %d" msgstr "左から右に回転" -#: page-turn-page-breaking.cc:217 +#: page-turn-page-breaking.cc:218 msgid "cannot fit the first page turn onto a single page. Consider setting first-page-number to an even number." msgstr "" -#: page-turn-page-breaking.cc:230 +#: page-turn-page-breaking.cc:231 #, c-format msgid "Calculating page and line breaks (%d possible page breaks)..." msgstr "" -#: page-turn-page-breaking.cc:300 +#: page-turn-page-breaking.cc:301 #, c-format msgid "break starting at page %d" msgstr "" -#: page-turn-page-breaking.cc:301 +#: page-turn-page-breaking.cc:302 #, c-format msgid "\tdemerits: %f" msgstr "" -#: page-turn-page-breaking.cc:302 +#: page-turn-page-breaking.cc:303 #, fuzzy, c-format msgid "\tsystem count: %d" msgstr "合計数: " -#: page-turn-page-breaking.cc:303 +#: page-turn-page-breaking.cc:304 #, fuzzy, c-format msgid "\tpage count: %d" msgstr "合計数: " -#: page-turn-page-breaking.cc:304 +#: page-turn-page-breaking.cc:305 #, fuzzy, c-format msgid "\tprevious break: %d" msgstr "休憩時間:" -#: key-signature-interface.cc:77 -#, fuzzy, c-format -msgid "No glyph found for alteration: %s" -msgstr "“%s”用の失効鍵が見つかりません\n" - -#: key-signature-interface.cc:87 -#, fuzzy -msgid "alteration not found" -msgstr "ブラシ '%s' が見つかりません。" - -#: music.cc:150 +#: pango-font.cc:247 #, c-format -msgid "octave check failed; expected \"%s\", found: \"%s\"" +msgid "no glyph for character U+%0X in font `%s'" msgstr "" -#: music.cc:219 -#, fuzzy -msgid "(normalized pitch)" -msgstr "音の高さを変更" +#: pango-font.cc:274 +#, c-format +msgid "" +"Glyph has no name, but font supports glyph naming.\n" +"Skipping glyph U+%0X, file %s" +msgstr "" -#: music.cc:223 +#: pango-font.cc:324 #, fuzzy, c-format -msgid "Transposing %s by %s makes alteration larger than double" -msgstr "%s の変調によって、二つを超える派生音が作られました" +msgid "no PostScript font name for font `%s'" +msgstr "出力ファイル用の名前がありません" -#: vaticana-ligature.cc:95 -msgid "flexa-height undefined; assuming 0" +#: pango-font.cc:374 +msgid "FreeType face has no PostScript font name" msgstr "" -#: vaticana-ligature.cc:100 -msgid "ascending vaticana style flexa" +#: paper-book.cc:200 +#, c-format +msgid "program option -dprint-pages not supported by backend `%s'" msgstr "" -#: translator.cc:356 +#: paper-book.cc:219 #, c-format -msgid "Two simultaneous %s events, junking this one" +msgid "program option -dpreview not supported by backend `%s'" msgstr "" -#: translator.cc:357 -#, fuzzy, c-format -msgid "Previous %s event here" -msgstr "前の定義がここにありました" +#: paper-column-engraver.cc:263 +msgid "forced break was overridden by some other event, should you be using bar checks?" +msgstr "" -#: lily-guile.cc:93 +#: paper-outputter-scheme.cc:41 #, c-format -msgid "(load path: `%s')" -msgstr "(読込パス: `%s')" +msgid "Layout output to `%s'..." +msgstr "レイアウトを `%s' へ出力しています..." -#: lily-guile.cc:416 -#, c-format -msgid "cannot find property type-check for `%s' (%s)." -msgstr "" +#: paper-score.cc:128 +#, fuzzy, c-format +msgid "Element count %d (spanners %d) " +msgstr "ストリップのデータ量" -#: lily-guile.cc:419 -#, fuzzy -msgid "perhaps a typing error?" -msgstr "未知のシステムエラー" +#: paper-score.cc:132 +msgid "Preprocessing graphical objects..." +msgstr "グラフィカルオブジェクトの前処理中..." -#: lily-guile.cc:426 -#, fuzzy -msgid "doing assignment anyway" -msgstr "とにかくログイン" +#: parse-scm.cc:124 +msgid "GUILE signaled an error for the expression beginning here" +msgstr "" -#: lily-guile.cc:438 +#: pdf-scheme.cc:65 #, c-format -msgid "type check for `%s' failed; value `%s' must be of type `%s'" +msgid "Conversion of string `%s' to UTF-16be failed: %s" msgstr "" -#: text-spanner-engraver.cc:72 -#, fuzzy -msgid "cannot find start of text spanner" -msgstr "鈎の始点が見つかりません" - -#: text-spanner-engraver.cc:85 +#: percent-repeat-engraver.cc:148 #, fuzzy -msgid "already have a text spanner" -msgstr "リッチテキストドキュメント" +msgid "unterminated percent repeat" +msgstr "PINを再入力: " -#: text-spanner-engraver.cc:130 +#: performance.cc:76 #, fuzzy -msgid "unterminated text spanner" -msgstr "リッチテキストドキュメント" +msgid "Track..." +msgstr "トラックのピーク" -#: clef.cc:65 +#: performance.cc:126 #, fuzzy, c-format -msgid "clef `%s' not found" -msgstr "ブラシ '%s' が見つかりません。" - -#: beam-engraver.cc:147 -msgid "already have a beam" -msgstr "既に鈎があります" - -#: beam-engraver.cc:230 -msgid "unterminated beam" -msgstr "終端のない鈎" - -#: beam-engraver.cc:266 chord-tremolo-engraver.cc:149 -msgid "stem must have Rhythmic structure" -msgstr "符尾はリズム構造を持たねばなりません" - -#: beam-engraver.cc:277 -#, fuzzy -msgid "stem does not fit in beam" -msgstr "符尾が鈎の中におさまりません" - -#: beam-engraver.cc:278 -msgid "beam was started here" -msgstr "鈎はここから開始されました" +msgid "MIDI output to `%s'..." +msgstr "%s へ出力リダイレクトされました\n" -#. -#. Todo: should make typecheck? -#. -#. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. -#. -#: time-signature-engraver.cc:75 +#: piano-pedal-engraver.cc:279 #, fuzzy, c-format -msgid "strange time signature found: %d/%d" -msgstr "最初の拍子記号を変更する" - -#: paper-column-engraver.cc:261 -msgid "forced break was overridden by some other event, should you be using bar checks?" -msgstr "" +msgid "expect 3 strings for piano pedals, found: %ld" +msgstr "ピアノペダルの始点が見つかりません: `%s'" -#: lily-parser-scheme.cc:80 +#: piano-pedal-engraver.cc:294 piano-pedal-engraver.cc:305 +#: piano-pedal-performer.cc:104 #, fuzzy, c-format -msgid "Changing working directory to: `%s'" -msgstr "作業ディレクトリを '%s' に変更できません" +msgid "cannot find start of piano pedal: `%s'" +msgstr "ピアノペダルの始点が見つかりません: `%s'" -#: lily-parser-scheme.cc:84 +#: piano-pedal-engraver.cc:340 #, fuzzy, c-format -msgid "unable to change directory to: `%s'" -msgstr "ディレクトリーを %s に変更できません" +msgid "cannot find start of piano pedal bracket: `%s'" +msgstr "ピアノペダルの始点が見つかりません: `%s'" -#: lily-parser-scheme.cc:99 +#: program-option-scheme.cc:223 #, fuzzy, c-format -msgid "cannot find init file: `%s'" -msgstr " ヘルプファイルでノード %s を見付けることができません " - -#: lily-parser-scheme.cc:117 -#, c-format -msgid "Processing `%s'" -msgstr "`%s' を処理しています" +msgid "no such internal option: %s" +msgstr "そのユーザーIDはありません。\n" -#: lily-parser-scheme.cc:208 -msgid "ly:parser-parse-string is only valid with a new parser. Use ly:parser-include-string instead." -msgstr "" +#: property-iterator.cc:115 +#, fuzzy, c-format +msgid "not a grob name, `%s'" +msgstr "名前ファイルではありません" -#: lily-parser-scheme.cc:239 -msgid "ly:parse-string-expression is only valid with a new parser. Use ly:parser-include-string instead." -msgstr "" +#: relative-octave-check.cc:49 +#, fuzzy +msgid "Failed octave check, got: " +msgstr "シンボリックリンク %s のチェックに失敗しました: %s" -#: font-config-scheme.cc:167 -#, c-format -msgid "failed adding font file: %s" -msgstr "フォントファイルの追加に失敗しました: %s" +#: relocate.cc:56 +#, fuzzy, c-format +msgid "Setting %s to %s" +msgstr "ドメインを`%s'へ設定しました\n" -#: font-config-scheme.cc:169 -#, c-format -msgid "Adding font file: %s" -msgstr "フォントファイルを追加しています: %s" +#. this warning should only be printed in debug mode! +#: relocate.cc:77 +#, fuzzy, c-format +msgid "no such file: %s for %s" +msgstr "出力ファイル用の名前がありません" -#: custos.cc:88 +#. this warning should only be printed in debug mode! +#. this warning should only be printed in debug mode +#: relocate.cc:88 relocate.cc:106 #, fuzzy, c-format -msgid "custos `%s' not found" -msgstr "ブラシ '%s' が見つかりません。" +msgid "no such directory: %s for %s" +msgstr "そのようなファイルやディレクトリはありません" -#: accidental-engraver.cc:179 +#: relocate.cc:97 #, c-format -msgid "accidental typesetting list must begin with context-name: %s" +msgid "%s=%s (prepend)\n" msgstr "" -#: accidental-engraver.cc:209 +#: relocate.cc:124 #, c-format -msgid "procedure or context-name expected for accidental rule, found %s" -msgstr "" - -#: rest-collision.cc:146 -msgid "cannot resolve rest collision: rest direction not set" +msgid "not relocating, no %s/ or current/ found under %s" msgstr "" -#: rest-collision.cc:160 rest-collision.cc:276 -msgid "too many colliding rests" -msgstr "休符の衝突が多すぎます" - -#: pango-font.cc:205 +#: relocate.cc:134 #, c-format -msgid "" -"Glyph has no name, but font supports glyph naming.\n" -"Skipping glyph U+%0X, file %s" +msgid "Relocation: compile datadir=%s, new datadir=%s" msgstr "" -#: pango-font.cc:242 +#: relocate.cc:146 #, fuzzy, c-format -msgid "no PostScript font name for font `%s'" -msgstr "出力ファイル用の名前がありません" - -#: pango-font.cc:291 -msgid "FreeType face has no PostScript font name" -msgstr "" - -#: lyric-engraver.cc:186 -msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." -msgstr "" - -#: page-breaking.cc:277 -msgid "ignoring min-systems-per-page and max-systems-per-page because systems-per-page was set" -msgstr "" - -#: page-breaking.cc:282 -msgid "min-systems-per-page is larger than max-systems-per-page, ignoring both values" -msgstr "" +msgid "Relocation: framework_prefix=%s" +msgstr "おかしな名前空間の接頭子" -#: paper-outputter-scheme.cc:41 +#: relocate.cc:172 #, fuzzy, c-format -msgid "Layout output to `%s'..." -msgstr "%s へ出力リダイレクトされました\n" - -#: gregorian-ligature-engraver.cc:70 -#, c-format -msgid "\\%s ignored" -msgstr "\\%s を無視しました" +msgid "Relocation: is absolute: argv0=%s\n" +msgstr "ファイル名 \"%s\" は絶対パスではありません" -#: gregorian-ligature-engraver.cc:75 +#: relocate.cc:178 #, fuzzy, c-format -msgid "implied \\%s added" -msgstr "「追加済」を表示" - -#. ligature may not start with 2nd head of pes or flexa -#: gregorian-ligature-engraver.cc:224 -msgid "cannot apply `\\~' on first head of ligature" -msgstr "" - -#. (pitch == prev_pitch) -#: gregorian-ligature-engraver.cc:236 -msgid "cannot apply `\\~' on heads with identical pitch" -msgstr "" - -#: chord-tremolo-engraver.cc:88 -#, fuzzy -msgid "No tremolo to end" -msgstr "ファイルの末尾に追加" - -#: chord-tremolo-engraver.cc:109 -msgid "unterminated chord tremolo" -msgstr "終端のないコードトレモロ" +msgid "Relocation : from cwd: argv0=%s\n" +msgstr "このテキストレイヤーからパスを作成します" -#: general-scheme.cc:390 +#: relocate.cc:196 #, fuzzy, c-format -msgid "failed redirecting stderr to `%s'" -msgstr "" -"\n" -"%s を受信しました、%s に出力をリダイレクトします。\n" +msgid "" +"Relocation: from PATH=%s\n" +"argv0=%s\n" +msgstr "このテキストレイヤーからパスを作成します" -#: general-scheme.cc:469 -msgid "Found infinity or nan in output. Substituting 0.0" +#: relocate.cc:222 +msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR" msgstr "" -#: system.cc:200 +#: relocate.cc:347 #, fuzzy, c-format -msgid "Element count %d" -msgstr "合計数: " +msgid "Relocation file: %s" +msgstr "HTML ファイル (*.html)|*.html" -#: system.cc:466 +#: relocate.cc:351 source-file.cc:65 #, fuzzy, c-format -msgid "Grob count %d" -msgstr "合計数: " +msgid "cannot open file: `%s'" +msgstr " ファイル '%s' を開けません " -#: axis-group-engraver.cc:94 -msgid "Axis_group_engraver: vertical group already has a parent" -msgstr "" +#: relocate.cc:381 +#, fuzzy, c-format +msgid "Unknown relocation command %s" +msgstr "不明なビルトインコマンド '%s'\n" -#: axis-group-engraver.cc:95 -msgid "are there two Axis_group_engravers?" +#: rest-collision.cc:154 +msgid "cannot resolve rest collision: rest direction not set" msgstr "" -#: axis-group-engraver.cc:96 -#, fuzzy -msgid "removing this vertical group" -msgstr "このグループには %d 個のパッケージが含まれています。" +#: rest-collision.cc:165 rest-collision.cc:274 +msgid "too many colliding rests" +msgstr "休符の衝突が多すぎます" -#: cluster.cc:120 +#: rest.cc:239 #, fuzzy, c-format -msgid "unknown cluster style `%s'" -msgstr "名前復元 (demangle) の方式 `%s' が不明です" - -#: cluster.cc:157 -#, fuzzy -msgid "junking empty cluster" -msgstr "警告: $PATH が定義されていません" +msgid "rest `%s' not found" +msgstr "ブラシ '%s' が見つかりません。" -#: grob-property.cc:35 -#, c-format -msgid "%d: %s" -msgstr "" +#: score-engraver.cc:77 +#, fuzzy, c-format +msgid "cannot find `%s'" +msgstr "見つかりません: `%s'" -#: rest-collision-engraver.cc:70 -msgid "rhythmic head is not part of a rhythmic column" +#: score-engraver.cc:79 +msgid "Music font has not been installed properly." msgstr "" -#: axis-group-interface.cc:670 -msgid "an outside-staff object should have a direction, defaulting to up" -msgstr "" +#: score-engraver.cc:81 +#, fuzzy, c-format +msgid "Search path `%s'" +msgstr "検索パス : %s\n" -#: coherent-ligature-engraver.cc:110 -#, c-format -msgid "Coherent_ligature_engraver: setting `spacing-increment=0.01': ptr=%ul" -msgstr "" +#: score-engraver.cc:83 +msgid "Aborting" +msgstr "終了します" -#. We are completely screwed. -#: beam-quanting.cc:853 -msgid "no viable initial configuration found: may not find good beam slope" -msgstr "" +#: score.cc:161 +#, fuzzy +msgid "already have music in score" +msgstr "%s は設定ファイルの中に既に存在しています\n" -#: percent-repeat-engraver.cc:147 +#: score.cc:163 #, fuzzy -msgid "unterminated percent repeat" -msgstr "PINを再入力: " +msgid "this is the previous music" +msgstr "このメッセージは未翻訳です" -#: note-head.cc:85 -#, c-format -msgid "none of note heads `%s' or `%s' found" -msgstr "" +#: score.cc:169 +#, fuzzy +msgid "errors found, ignoring music expression" +msgstr "エラーを発見/*, 楽譜を処理しません*/" #. FIXME: -#: script-engraver.cc:113 +#: script-engraver.cc:115 #, fuzzy msgid "do not know how to interpret articulation:" msgstr "音節 `%s' の解釈方法が判りません" -#: script-engraver.cc:114 +#: script-engraver.cc:116 #, fuzzy msgid " scheme encoding: " msgstr "不明なエンコーディング。" -#: program-option-scheme.cc:235 -#, fuzzy, c-format -msgid "no such internal option: %s" -msgstr "そのユーザーIDはありません。\n" +#: skyline-pair.cc:135 +msgid "direction must not be CENTER in ly:skyline-pair::skyline" +msgstr "" -#: property-iterator.cc:93 +#: slur-proto-engraver.cc:51 #, fuzzy, c-format -msgid "not a grob name, `%s'" -msgstr "名前ファイルではありません" +msgid "direction of %s invalid: %d" +msgstr "無効な方向 -- %s\n" -#: all-font-metrics.cc:149 +#. We already have an old slur, so give a warning +#. and completely ignore the new slur. +#: slur-proto-engraver.cc:166 #, fuzzy, c-format -msgid "cannot find font: `%s'" -msgstr "ディレクトリ %s が見つかりません\n" +#| msgid "already have slur" +msgid "already have %s" +msgstr "スラーを既に開始しています" -#: pdf-scheme.cc:50 +#: slur-proto-engraver.cc:183 #, c-format -msgid "Conversion of string `%s' to UTF-16be failed: %s" +msgid "%s without a cause" msgstr "" -#: rest.cc:171 +#: slur-proto-engraver.cc:244 #, fuzzy, c-format -msgid "rest `%s' not found" -msgstr "ブラシ '%s' が見つかりません。" +#| msgid "cannot end slur" +msgid "cannot end %s" +msgstr "スラーを終了できません" -#: bar-check-iterator.cc:84 +#: slur.cc:436 #, c-format -msgid "barcheck failed at: %s" -msgstr "小節チェックが失敗: %s" +msgid "Ignoring grob for slur: %s. avoid-slur not set?" +msgstr "" -#: slur-engraver.cc:92 phrasing-slur-engraver.cc:91 +#: source-file.cc:85 #, fuzzy, c-format -msgid "direction of %s invalid: %d" -msgstr "無効な方向 -- %s\n" - -#: slur-engraver.cc:166 -msgid "unterminated slur" -msgstr "終端されていないスラー" +msgid "expected to read %d characters, got %d" +msgstr "" +"読み込むファイルまたは\n" +"使用する文字列" -#: slur-engraver.cc:191 -msgid "cannot end slur" -msgstr "スラーを終了できません" +#: staff-performer.cc:301 +msgid "MIDI channel wrapped around" +msgstr "" -#. We already have a slur, so give a warning and completely ignore -#. the new slur. -#: slur-engraver.cc:208 -msgid "already have slur" -msgstr "スラーを既に開始しています" +#: staff-performer.cc:302 +#, fuzzy +msgid "remapping modulo 16" +msgstr "Functionキー 16" -#: global-context-scheme.cc:96 global-context-scheme.cc:114 +#: stem-engraver.cc:100 #, fuzzy -msgid "no music found in score" -msgstr " %s に特定のエントリーは見つかりませんでした " +msgid "tremolo duration is too long" +msgstr "diversion パスが長すぎます" + +#: stem-engraver.cc:152 +#, fuzzy, c-format +msgid "adding note head to incompatible stem (type = %d/%d)" +msgstr "矛盾した符尾へ符頭を追加します (タイプ = %d)" + +#: stem-engraver.cc:155 +msgid "maybe input should specify polyphonic voices" +msgstr "" -#: global-context-scheme.cc:104 +#: stem.cc:128 #, fuzzy -msgid "Interpreting music... " -msgstr "%s %s 楽曲プレイヤ" +msgid "weird stem size, check for narrow beams" +msgstr "変な符尾のサイズ -- 細い鈎のチェックをして下さい" -#: global-context-scheme.cc:126 -#, c-format -msgid "elapsed time: %.2f seconds" -msgstr "経過時間: %.2f 秒" +#: system.cc:202 +#, fuzzy, c-format +msgid "Element count %d" +msgstr "合計数: " -#: translator-group-ctors.cc:40 +#: system.cc:513 +#, fuzzy, c-format +msgid "Grob count %d" +msgstr "合計数: " + +#. TODO: Also print the arguments of the markup! +#: text-interface.cc:139 #, c-format -msgid "fatal error. Couldn't find type: %s" +msgid "Markup depth exceeds maximal value of %d; Markup: %s" msgstr "" -#: phrasing-slur-engraver.cc:165 +#: text-spanner-engraver.cc:72 #, fuzzy -msgid "unterminated phrasing slur" -msgstr "スラーを終了できません" +msgid "cannot find start of text spanner" +msgstr "鈎の始点が見つかりません" -#: phrasing-slur-engraver.cc:190 +#: text-spanner-engraver.cc:85 #, fuzzy -msgid "cannot end phrasing slur" -msgstr "スラーの中に別のスラーを含むことはできません" +msgid "already have a text spanner" +msgstr "リッチテキストドキュメント" -#: phrasing-slur-engraver.cc:204 +#: text-spanner-engraver.cc:130 #, fuzzy -msgid "already have phrasing slur" -msgstr "スラーを終了できません" - -#: lily-parser.cc:109 -msgid "Parsing..." -msgstr "構文解析中..." +msgid "unterminated text spanner" +msgstr "リッチテキストドキュメント" -#: score.cc:176 +#: tie-engraver.cc:121 #, fuzzy -msgid "already have music in score" -msgstr "%s は設定ファイルの中に既に存在しています\n" +msgid "unterminated tie" +msgstr "タイの切替え" -#: score.cc:177 -#, fuzzy -msgid "this is the previous music" -msgstr "このメッセージは未翻訳です" +#: tie-engraver.cc:377 +msgid "lonely tie" +msgstr "一つだけのタイ" -#: score.cc:182 -#, fuzzy -msgid "errors found, ignoring music expression" -msgstr "エラーを発見/*, 楽譜を処理しません*/" +#. +#. Todo: should make typecheck? +#. +#. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. +#. +#: time-signature-engraver.cc:95 +#, fuzzy, c-format +msgid "strange time signature found: %d/%d" +msgstr "最初の拍子記号を変更する" + +#: translator-ctors.cc:68 +#, c-format +msgid "unknown translator: `%s'" +msgstr "判らないトランスレータ: `%s'" -#. If there is no such symbol, we default to the numbered style. -#. (Here really with a warning!) -#: time-signature.cc:94 +#: translator-group-ctors.cc:40 #, c-format -msgid "time signature symbol `%s' not found; reverting to numbered style" +msgid "fatal error. Couldn't find type: %s" msgstr "" -#: grob-interface.cc:68 +#: translator-group.cc:187 #, c-format -msgid "Unknown interface `%s'" -msgstr "`%s' は未知のインタフェースです" +msgid "cannot find: `%s'" +msgstr "見つかりません: `%s'" -#: grob-interface.cc:79 +#: translator.cc:310 #, c-format -msgid "Grob `%s' has no interface for property `%s'" +msgid "Two simultaneous %s events, junking this one" msgstr "" -#: midi-stream.cc:39 +#: translator.cc:311 #, fuzzy, c-format -msgid "cannot open for write: %s: %s" -msgstr "%s を読み書きモードで開けません\n" +msgid "Previous %s event here" +msgstr "前の定義がここにありました" -#: midi-stream.cc:55 -#, fuzzy, c-format -msgid "cannot write to file: `%s'" +#: ttf.cc:480 ttf.cc:528 +#, c-format +msgid "font index %d too large for font `%s', using index 0" msgstr "" -"ファイル %s に書き込めません:\n" -"%s\n" -#. TODO: Also print the arguments of the markup! -#: text-interface.cc:129 -#, fuzzy, c-format -msgid "Cyclic markup detected: %s" -msgstr "自動検出ボリューム" +#: ttf.cc:512 ttf.cc:562 +msgid "font index must be non-negative, using index 0" +msgstr "" -#. TODO: Also print the arguments of the markup! -#: text-interface.cc:142 +#: tuplet-engraver.cc:110 +#, fuzzy +msgid "No tuplet to end" +msgstr "ファイルの末尾に追加" + +#: vaticana-ligature-engraver.cc:400 #, c-format -msgid "Markup depth exceeds maximal value of %d; Markup: %s" +msgid "ignored prefix(es) `%s' of this head according to restrictions of the selected ligature style" +msgstr "" + +#: vaticana-ligature-engraver.cc:466 +msgid "Ambiguous use of dots in ligature: there are multiple dotted notes with the same pitch. The ligature should be split." +msgstr "" + +#: vaticana-ligature-engraver.cc:524 +msgid "This ligature has a dotted head followed by a non-dotted head. The ligature should be split after the last dotted head before this head." +msgstr "" + +#: vaticana-ligature-engraver.cc:736 +#, c-format +msgid "Vaticana_ligature_engraver: setting `spacing-increment = %f': ptr =%ul" +msgstr "" + +#: vaticana-ligature.cc:94 +msgid "flexa-height undefined; assuming 0" +msgstr "" + +#: vaticana-ligature.cc:99 +msgid "ascending vaticana style flexa" +msgstr "" + +#: vertical-align-engraver.cc:95 +msgid "Ignoring Vertical_align_engraver in VerticalAxisGroup" +msgstr "" + +#. fixme: be more verbose. +#: volta-engraver.cc:110 +#, fuzzy +msgid "cannot end volta spanner" +msgstr "%s: 省略記号の範囲の終わりに`%s'がありません" + +#: volta-engraver.cc:120 +msgid "already have a volta spanner, ending that one prematurely" msgstr "" -#: parser.yy:162 parser.yy:176 +#: volta-engraver.cc:124 +#, fuzzy +msgid "also already have an ended spanner" +msgstr "既に鈎があります" + +#: volta-engraver.cc:125 #, fuzzy -msgid "Too much lookahead" -msgstr "アドレスファミリの引数が多すぎます.\n" +msgid "giving up" +msgstr "" +"中止しました。\n" +"\n" + +#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248 +msgid "bad expression type" +msgstr "" -#: parser.yy:827 parser.yy:1193 parser.yy:1226 +#: parser.yy:859 parser.yy:1458 parser.yy:1503 #, fuzzy msgid "not a context mod" msgstr "有効なセキュリティコンテキストでありません" -#: parser.yy:995 -msgid "\\paper cannot be used in \\score, use \\layout instead" +#: parser.yy:1054 +#, fuzzy +msgid "Missing music in \\score" +msgstr " %s に特定のエントリーは見つかりませんでした " + +#: parser.yy:1091 +msgid "\\paper cannot be used in \\score, use \\layout instead" +msgstr "" + +#: parser.yy:1126 +msgid "Spurious expression in \\score" +msgstr "" + +#: parser.yy:1156 +#, fuzzy +msgid "need \\paper for paper block" +msgstr "まばらな (sparse) ファイルのブロックサイズ" + +#: parser.yy:1331 +#, fuzzy +msgid "music expected" +msgstr "コロンを期待しました" + +#: parser.yy:1341 parser.yy:1375 +#, fuzzy +#| msgid "unimplemented MIDI meta-event" +msgid "unexpected post-event" +msgstr "未実装の MIDI メタイベント" + +#: parser.yy:1383 +#, fuzzy +msgid "Ignoring non-music expression" +msgstr "エラーを発見/*, 楽譜を処理しません*/" + +#: parser.yy:1691 +msgid "not a symbol" msgstr "" -#: parser.yy:1019 -#, fuzzy -msgid "need \\paper for paper block" -msgstr "まばらな (sparse) ファイルのブロックサイズ" +#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627 +msgid "bad grob property path" +msgstr "" -#: parser.yy:1943 -msgid "only \\consists takes non-string argument." +#: parser.yy:2585 +msgid "only \\consists and \\remove take non-string argument." msgstr "" -#: parser.yy:1956 -msgid "Grob name should be alphanumeric" +#: parser.yy:2646 +msgid "bad context property path" msgstr "" -#: parser.yy:2150 +#: parser.yy:2733 +#, fuzzy +msgid "simple string expected" +msgstr "コロンを期待しました" + +#: parser.yy:2750 +#, fuzzy +msgid "symbol expected" +msgstr "コロンを期待しました" + +#: parser.yy:2886 #, fuzzy msgid "not a rhythmic event" msgstr "MIDI イベントコントローラ" -#: parser.yy:2246 parser.yy:2251 +#: parser.yy:2936 +msgid "post-event expected" +msgstr "" + +#: parser.yy:2945 parser.yy:2950 #, fuzzy msgid "have to be in Lyric mode for lyrics" msgstr "歌詞は Lyric モード内に書いてください" -#: parser.yy:2366 -msgid "expecting string as script definition" +#: parser.yy:3026 +msgid "expecting string or post-event as script definition" msgstr "" -#: parser.yy:2518 parser.yy:2569 -#, c-format -msgid "not a duration: %d" +#: parser.yy:3130 +#, fuzzy +#| msgid "not a duration: %d" +msgid "not an articulation" msgstr "音長ではありません: %d" -#: parser.yy:2688 +#: parser.yy:3202 parser.yy:3245 +#, fuzzy +#| msgid "not a duration: %d" +msgid "not a duration" +msgstr "音長ではありません: %d" + +#: parser.yy:3266 +#, fuzzy +msgid "bass number expected" +msgstr "コロンを期待しました" + +#: parser.yy:3358 #, fuzzy msgid "have to be in Note mode for notes" msgstr "音符は Note モード内に書いてください" -#: parser.yy:2737 +#: parser.yy:3397 #, fuzzy msgid "have to be in Chord mode for chords" msgstr "コードは Chord モード内に書いてください" -#: parser.yy:2997 +#: parser.yy:3440 +msgid "markup outside of text script or \\lyricmode" +msgstr "" + +#: parser.yy:3445 +msgid "unrecognized string, not in text script or \\lyricmode" +msgstr "" + +#: parser.yy:3597 parser.yy:3606 +msgid "not an unsigned integer" +msgstr "" + +#: parser.yy:3693 msgid "not a markup" msgstr "マークアップではありません" -#: lexer.ll:225 +#: lexer.ll:193 msgid "stray UTF-8 BOM encountered" msgstr "" -#: lexer.ll:228 +#: lexer.ll:196 msgid "Skipping UTF-8 BOM" msgstr "UTF-8 の BOM をスキップします" -#: lexer.ll:286 +#: lexer.ll:248 #, c-format msgid "Renaming input to: `%s'" msgstr "入力の名前を `%s' に変更します" -#: lexer.ll:303 +#: lexer.ll:265 #, fuzzy msgid "quoted string expected after \\version" msgstr "警告: 文法エラー, 文字列の後には ';'" -#: lexer.ll:307 +#: lexer.ll:269 #, fuzzy msgid "quoted string expected after \\sourcefilename" msgstr "警告: 文法エラー, 文字列の後には ';'" -#: lexer.ll:311 +#: lexer.ll:273 #, fuzzy msgid "integer expected after \\sourcefileline" msgstr "-q= の後に番号が期待されますが、%s が与えられました\n" -#: lexer.ll:334 +#: lexer.ll:300 #, fuzzy msgid "\\maininput not allowed outside init files" msgstr "初期化ファイルの外では \\maininput を記述できません" -#: lexer.ll:358 +#: lexer.ll:324 #, fuzzy, c-format msgid "wrong or undefined identifier: `%s'" msgstr "定数または識別子が適当です" -#: lexer.ll:384 +#: lexer.ll:349 msgid "string expected after \\include" msgstr "\\include の後には文字列が必要です" -#. backup rule -#: lexer.ll:394 +#: lexer.ll:359 msgid "end quote missing" msgstr "終端の引用符がありません" -#: lexer.ll:556 -msgid "Brace found at end of lyric. Did you forget a space?" -msgstr "" - -#: lexer.ll:671 -msgid "Brace found at end of markup. Did you forget a space?" -msgstr "" - -#: lexer.ll:683 +#: lexer.ll:714 msgid "EOF found inside a comment" msgstr "コメント内に EOF が見つかりました" -#: lexer.ll:775 +#: lexer.ll:719 +#, fuzzy +#| msgid "EOF found inside a comment" +msgid "EOF found inside string" +msgstr "コメント内に EOF が見つかりました" + +#: lexer.ll:734 +#, fuzzy +#| msgid "unfinished beam" +msgid "Unfinished main input" +msgstr "終了されていない鈎" + +#: lexer.ll:805 #, c-format msgid "invalid character: `%s'" msgstr "無効な文字: `%s'" -#: lexer.ll:868 lexer.ll:869 +#: lexer.ll:925 #, c-format msgid "unknown escaped string: `\\%s'" msgstr "未知のエスケープ文字列: `\\%s'" -#: lexer.ll:1117 lexer.ll:1118 +#: lexer.ll:945 +#, fuzzy, c-format +#| msgid "can't find character called: `%s'" +msgid "undefined character or shorthand: %s" +msgstr "呼び出された文字が見つかりません: `%s'" + +#: lexer.ll:1236 #, fuzzy msgid "non-UTF-8 input" msgstr " INPUTFILE ... 入力ファイル\n" -#: lexer.ll:1161 lexer.ll:1162 +#: lexer.ll:1280 +#, fuzzy, c-format +msgid "Invalid version string \"%s\"" +msgstr "文字列 '%s' は有効な長さではありません。\n" + +#: lexer.ll:1285 #, c-format msgid "file too old: %s (oldest supported: %s)" msgstr "" -#: lexer.ll:1162 lexer.ll:1163 +#: lexer.ll:1286 msgid "consider updating the input with the convert-ly script" msgstr "" -#: lexer.ll:1168 lexer.ll:1169 +#: lexer.ll:1292 #, c-format msgid "program too old: %s (file requires: %s)" msgstr "" -#: parser-clef.scm:141 parser-clef.scm:181 +#: auto-beam.scm:147 +msgid "Beam end fits no pattern" +msgstr "" + +#: backend-library.scm:27 #, fuzzy, scheme-format -msgid "unknown clef type `~a'" -msgstr "ファイルタイプが不明です" +msgid "Invoking `~a'..." +msgstr "PGP 起動中..." -#: parser-clef.scm:142 parser-clef.scm:182 +#: backend-library.scm:31 #, fuzzy, scheme-format -msgid "supported clefs: ~a" -msgstr "サポートしていません" +msgid "`~a' failed (~a)\n" +msgstr "失敗" + +#: backend-library.scm:108 +#, scheme-format +msgid "Converting to `~a'...\n" +msgstr "`~a' へ変換しています...\n" + +#. Do not try to guess the name of the png file, +#. GS produces PNG files like BASE-page%d.png. +#: backend-library.scm:118 +#, scheme-format +msgid "Converting to ~a..." +msgstr "~a へ変換しています..." + +#: backend-library.scm:134 +#, scheme-format +msgid "Copying to `~a'...\n" +msgstr "`~a' へコピーしています...\n" -#: document-backend.scm:132 +#: backend-library.scm:200 +#, scheme-format +msgid "Deleting `~a'...\n" +msgstr "`~a' を削除しています...\n" + +#: backend-library.scm:219 #, fuzzy, scheme-format -msgid "pair expected in doc ~s" -msgstr "種類 (%s と %s) のペアを期待しましたが、得られたのは種類 (%s と %s) です" +msgid "Writing header field `~a' to `~a'..." +msgstr "Contents ファイルへのヘッダの書き込み中にエラーが発生しました" -#: document-backend.scm:189 +#: backend-library.scm:268 #, fuzzy, scheme-format -msgid "cannot find interface for property: ~S" -msgstr "'%s' の属性のハッシュを書き込めません" +msgid "missing stencil expression `~S'" +msgstr "マジック(識別鍵)モード式が欠けています" + +#: bar-line.scm:133 +#, scheme-format +msgid "Bar glyph ~a not known. Ignoring." +msgstr "" + +#: bar-line.scm:161 +#, scheme-format +msgid "Annotation '~a' is allowed in the first argument of a bar line definition only." +msgstr "" -#: document-backend.scm:199 +#: bar-line.scm:169 +#, scheme-format +msgid "Replacement '~a' is allowed in the last argument of a bar line definition only." +msgstr "" + +#: bar-line.scm:230 +#, scheme-format +msgid "add-bar-glyph-print-procedure: glyph '~a' has to be a single ASCII character." +msgstr "" + +#: bar-line.scm:795 +#, scheme-format +msgid "No span bar glyph defined for bar glyph '~a'; ignoring." +msgstr "" + +#: chord-entry.scm:52 +#, scheme-format +msgid "Spurious garbage following chord: ~A" +msgstr "" + +#: define-context-properties.scm:31 define-grob-properties.scm:21 +#: define-music-properties.scm:21 #, fuzzy, scheme-format -msgid "unknown Grob interface: ~S" -msgstr "XUL インターフェイスドキュメント" +msgid "symbol ~S redefined" +msgstr "シンボル %s が再定義されました" -#: graphviz.scm:64 +#: define-event-classes.scm:74 #, fuzzy, scheme-format -msgid "Writing graph `~a'..." -msgstr "\"%s\" を書き込み中にエラーが発生しました" +msgid "unknown parent class `~a'" +msgstr "未知の署名クラスです" -#: parser-ly-from-scheme.scm:71 -#, fuzzy -msgid "error in #{ ... #}" -msgstr "「%s」でエラー: %s\n" +#: define-event-classes.scm:108 +#, fuzzy, scheme-format +msgid "Cannot redefine event class `~S'" +msgstr "未知の署名クラスです" -#: framework-eps.scm:108 +#: define-event-classes.scm:110 #, fuzzy, scheme-format -msgid "Writing ~a..." -msgstr "%s 書き込み中..." +msgid "Undefined parent event class `~S'" +msgstr "未知の署名クラスです" -#: output-ps.scm:48 -msgid "Found infinity or nan in output. Substituting 0.0" +#: define-markup-commands.scm:1098 +msgid "no systems found in \\score markup, does it have a \\layout block?" msgstr "" -#: output-ps.scm:313 output-svg.scm:556 +#: define-markup-commands.scm:2922 #, fuzzy, scheme-format -msgid "unknown line-cap-style: ~S" -msgstr "改行文字形式が一貫していません" +msgid "Cannot find glyph ~a" +msgstr "ディレクトリ %s が見つかりません\n" + +#: define-markup-commands.scm:3398 +#, scheme-format +msgid "no brace found for point size ~S " +msgstr "" -#: output-ps.scm:318 output-svg.scm:562 +#: define-markup-commands.scm:3399 #, fuzzy, scheme-format -msgid "unknown line-join-style: ~S" -msgstr "改行文字形式が一貫していません" +msgid "defaulting to ~S pt" +msgstr "%{エラーです。デフォルトを使います%}C" -#: paper.scm:120 -msgid "set-global-staff-size: not in toplevel scope" -msgstr "" +#: define-markup-commands.scm:3643 +#, fuzzy, scheme-format +msgid "not a valid duration string: ~a" +msgstr "文字列 '%s' は有効な長さではありません。\n" -#: paper.scm:304 +#: define-markup-commands.scm:3854 #, fuzzy, scheme-format -msgid "This is not a \\layout {} object, ~S" -msgstr "エラー: %s() の 第%d引数がオブジェクトではありません\n" +msgid "not a valid duration string: ~a - ignoring" +msgstr "文字列 '%s' は有効な長さではありません。\n" -#: paper.scm:316 +#: define-music-types.scm:803 #, fuzzy, scheme-format -msgid "Unknown paper size: ~a" -msgstr "用紙のサイズ '%s' を認識できません (デフォルトを使用します)\n" +msgid "symbol expected: ~S" +msgstr "コロンを期待しました" -#. TODO: should raise (generic) exception with throw, and catch -#. that in parse-scm.cc -#: paper.scm:331 -msgid "Must use #(set-paper-size .. ) within \\paper { ... }" +#: define-music-types.scm:806 +#, fuzzy, scheme-format +msgid "cannot find music object: ~S" +msgstr "%s が共有オブジェクト %s に存在しません: %s" + +#: define-music-types.scm:826 +#, scheme-format +msgid "bad make-music argument: ~S" msgstr "" -#: backend-library.scm:27 -#, fuzzy, scheme-format -msgid "Invoking `~a'..." -msgstr "PGP 起動中..." +#: define-note-names.scm:1000 +#, fuzzy +msgid "Select note names language." +msgstr "言語のコードを選択してください:" -#: backend-library.scm:31 +#: define-note-names.scm:1006 #, fuzzy, scheme-format -msgid "`~a' failed (~a)\n" -msgstr "失敗" +msgid "Using `~a' note names..." +msgstr "パッケージ名総数: " -#: backend-library.scm:90 +#: define-note-names.scm:1009 #, fuzzy, scheme-format -msgid "Converting to `~a'...\n" -msgstr "%s から %s へ変換しています..." +msgid "Could not find language `~a'. Ignoring." +msgstr "マスター・ブラウザが見つかりませんでした" -#. Do not try to guess the name of the png file, -#. GS produces PNG files like BASE-page%d.png. -#: backend-library.scm:99 +#: document-backend.scm:135 #, fuzzy, scheme-format -msgid "Converting to ~a..." -msgstr "%s から %s へ変換しています..." +msgid "pair expected in doc ~s" +msgstr "種類 (%s と %s) のペアを期待しましたが、得られたのは種類 (%s と %s) です" -#: backend-library.scm:137 +#: document-backend.scm:202 #, fuzzy, scheme-format -msgid "Writing header field `~a' to `~a'..." -msgstr "Contents ファイルへのヘッダの書き込み中にエラーが発生しました" +msgid "cannot find interface for property: ~S" +msgstr "'%s' の属性のハッシュを書き込めません" -#: backend-library.scm:187 +#: document-backend.scm:212 #, fuzzy, scheme-format -msgid "missing stencil expression `~S'" -msgstr "マジック(識別鍵)モード式が欠けています" +msgid "unknown Grob interface: ~S" +msgstr "XUL インターフェイスドキュメント" -#: output-svg.scm:47 +#: documentation-lib.scm:62 #, fuzzy, scheme-format -msgid "undefined: ~S" -msgstr "名前なし" +msgid "Processing ~S..." +msgstr "処理中..." -#: output-svg.scm:157 -#, scheme-format -msgid "cannot decypher Pango description: ~a" -msgstr "" +#: documentation-lib.scm:178 +#, fuzzy, scheme-format +msgid "Writing ~S..." +msgstr "%s 書き込み中..." -#: output-svg.scm:237 -#, fuzzy -msgid "Glyph must have a unicode value" -msgstr "" -"\n" -"%s.%s: 値は boolean でなければなりません\n" +#: documentation-lib.scm:190 +#, fuzzy, scheme-format +msgid "cannot find description for property `~S' (~S)" +msgstr "'%s' の属性のハッシュを書き込めません" -#: output-svg.scm:289 output-svg.scm:299 +#: documentation-lib.scm:211 #, fuzzy, scheme-format -msgid "cannot find SVG font ~S" -msgstr "'%s' の URL が見つかりません" +msgid "cannot find description for property ~S (~S)" +msgstr "'%s' の属性のハッシュを書き込めません" -#: flag-styles.scm:151 +#: flag-styles.scm:155 #, fuzzy, scheme-format msgid "flag stroke `~a' or `~a' not found" msgstr "'%s' が PATH 上に見つからないか実行可能になっていません。" -#: modal-transforms.scm:38 -msgid "'from' pitch not in scale; ignoring" +#: framework-eps.scm:112 +#, fuzzy, scheme-format +msgid "Writing ~a..." +msgstr "%s 書き込み中..." + +#: framework-ps.scm:281 +#, fuzzy, scheme-format +msgid "cannot embed ~S=~S" +msgstr "%s: %s: stat できません: %s\n" + +#: framework-ps.scm:324 +#, fuzzy, scheme-format +msgid "cannot extract file matching ~a from ~a" +msgstr "RPM ファイルからカタログを抽出できません。" + +#: framework-ps.scm:342 +#, scheme-format +msgid "do not know how to embed ~S=~S" msgstr "" -#: modal-transforms.scm:42 modal-transforms.scm:75 -msgid "'to' pitch not in scale; ignoring" +#: framework-ps.scm:367 +#, scheme-format +msgid "do not know how to embed font ~s ~s ~s" msgstr "" -#: modal-transforms.scm:46 -msgid "pitch to be transposed not in scale; ignoring" +#: framework-ps.scm:723 +msgid "" +"\n" +"The PostScript backend does not support the\n" +"system-by-system output. For that, use the EPS backend instead,\n" +"\n" +" lilypond -dbackend=eps FILE\n" +"\n" +"If have cut & pasted a lilypond fragment from a webpage, be sure\n" +"to only remove anything before\n" +"\n" +" %% ****************************************************************\n" +" %% Start cut-&-pastable-section\n" +" %% ****************************************************************\n" msgstr "" -#: modal-transforms.scm:71 -msgid "'around' pitch not in scale; ignoring" +#: framework-svg.scm:84 +#, fuzzy, scheme-format +msgid "Updating font into: ~a" +msgstr "選択範囲内に貼り付け(_I)" + +#: graphviz.scm:64 +#, fuzzy, scheme-format +msgid "Writing graph `~a'..." +msgstr "\"%s\" を書き込み中にエラーが発生しました" + +#: layout-beam.scm:40 +#, scheme-format +msgid "Error in beam quanting. Expected (~S,~S) found ~S." msgstr "" -#: modal-transforms.scm:79 -msgid "pitch to be inverted not in scale; ignoring" +#: layout-beam.scm:54 +#, scheme-format +msgid "Error in beam quanting. Expected ~S 0, found ~S." msgstr "" -#: modal-transforms.scm:95 -msgid "negative replication count; ignoring" +#: lily-library.scm:333 +msgid "Music unsuitable for context-mod" +msgstr "" + +#: lily-library.scm:388 +#, fuzzy, scheme-format +msgid "Cannot find context-def \\~a" +msgstr "実効ユーザID を %ld に変更できません: %s\n" + +#: lily-library.scm:404 +msgid "Music unsuitable for output-def" msgstr "" -#: to-xml.scm:191 -#, fuzzy, scheme-format -msgid "assertion failed: ~S" -msgstr "malloc: 失敗したアサーション: %s\n" +#: lily-library.scm:904 +msgid "" +"Find the index between @var{start} and @var{end} (an integer)\n" +"which produces the closest match to @var{target-val} if\n" +"applied to function @var{getter}." +msgstr "" -#: define-grob-properties.scm:21 define-context-properties.scm:31 -#: define-music-properties.scm:21 +#: lily-library.scm:998 #, fuzzy, scheme-format -msgid "symbol ~S redefined" -msgstr "シンボル %s が再定義されました" +msgid "unknown unit: ~S" +msgstr "単位の編集" -#: chord-entry.scm:52 +#: lily-library.scm:1023 #, scheme-format -msgid "Spurious garbage following chord: ~A" +msgid "no \\version statement found, please add~afor future compatibility" +msgstr "\\version 宣言がみつかりません, 将来の互換性のために~aを追加してください" + +#: lily.scm:93 +msgid "call-after-session used after session start" +msgstr "" + +#: lily.scm:111 +msgid "define-session used after session start" msgstr "" -#: lily.scm:234 +#: lily.scm:417 msgid "Using (ice-9 curried-definitions) module\n" msgstr "" -#: lily.scm:237 +#: lily.scm:420 msgid "Guile 1.8\n" msgstr "" -#: lily.scm:297 +#: lily.scm:477 #, fuzzy, scheme-format msgid "cannot find: ~A" msgstr "見つかりません: `%s'" -#: lily.scm:701 -#, fuzzy +#: lily.scm:903 msgid "Success: compilation successfully completed" -msgstr "全ての操作が無事完了しました" +msgstr "成功: コンパイルが正常に完了しました" -#: lily.scm:702 +#: lily.scm:904 msgid "Compilation completed with warnings or errors" -msgstr "" +msgstr "コンパイルが警告またはエラーで終了しました" -#: lily.scm:764 +#: lily.scm:965 #, fuzzy, scheme-format msgid "job ~a terminated with signal: ~a" msgstr "サーバへの接続開始前に実行したコマンドがシグナル %d で終了しました\n" -#: lily.scm:767 +#: lily.scm:968 #, fuzzy, scheme-format msgid "" "logfile ~a (exit ~a):\n" "~a" msgstr " 終了を確認(&E) " -#: lily.scm:789 lily.scm:869 +#: lily.scm:990 lily.scm:1079 #, fuzzy, scheme-format msgid "failed files: ~S" msgstr "ファイルの追加" -#: lily.scm:860 +#: lily.scm:1070 #, fuzzy, scheme-format msgid "Redirecting output to ~a..." msgstr "" "\n" "%s を受信しました、%s に出力をリダイレクトします。\n" -#: lily.scm:879 ps-to-png.scm:66 +#: lily.scm:1089 #, fuzzy, scheme-format msgid "Invoking `~a'...\n" msgstr "PGP 起動中..." -#: lily-library.scm:761 -msgid "" -"Find the index between @var{start} and @var{end} (an integer)\n" -"which produces the closest match to @var{target-val} if\n" -"applied to function @var{getter}." -msgstr "" - -#: lily-library.scm:835 +#: ly-syntax-constructors.scm:27 #, fuzzy, scheme-format -msgid "unknown unit: ~S" -msgstr "単位の編集" +msgid "~a function cannot return ~a" +msgstr "リターンで自動的にインデント(&R)" -#: lily-library.scm:860 +#: ly-syntax-constructors.scm:60 #, scheme-format -msgid "no \\version statement found, please add~afor future compatibility" +msgid "wrong type for argument ~a. Expecting ~a, found ~s" msgstr "" -#: lily-library.scm:866 -#, fuzzy -msgid "old relative compatibility not used" -msgstr "GP が未定義の時に GP 関連再配置が使われました" +#: markup-macros.scm:331 +#, scheme-format +msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" +msgstr "" -#: framework-svg.scm:84 +#: markup-macros.scm:337 +#, scheme-format +msgid "Invalid argument in position ~A. Expect: ~A, found: ~S." +msgstr "" + +#: markup-macros.scm:373 #, fuzzy, scheme-format -msgid "Updating font into: ~a" -msgstr "選択範囲内に貼り付け(_I)" +msgid "Not a markup command: ~A" +msgstr "「e」コマンドは、サポートされていません" + +#: modal-transforms.scm:38 +msgid "'from' pitch not in scale; ignoring" +msgstr "" + +#: modal-transforms.scm:42 modal-transforms.scm:75 +msgid "'to' pitch not in scale; ignoring" +msgstr "" + +#: modal-transforms.scm:46 +msgid "pitch to be transposed not in scale; ignoring" +msgstr "" + +#: modal-transforms.scm:71 +msgid "'around' pitch not in scale; ignoring" +msgstr "" + +#: modal-transforms.scm:79 +msgid "pitch to be inverted not in scale; ignoring" +msgstr "" + +#: modal-transforms.scm:95 +msgid "negative replication count; ignoring" +msgstr "" -#: part-combiner.scm:598 +#: music-functions.scm:319 #, fuzzy, scheme-format -msgid "quoted music `~a' is empty" -msgstr "警告: 「%s」は空のファイルです\n" +msgid "invalid tremolo repeat count: ~a" +msgstr "%s: 繰り返しカウントには `}' が必要です" + +#: music-functions.scm:348 +#, scheme-format +msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo" +msgstr "" -#: music-functions.scm:273 +#: music-functions.scm:352 #, fuzzy msgid "More alternatives than repeats. Junking excess alternatives" msgstr "繰り返しよりも選択肢が多い。超過分を捨てます。" -#: music-functions.scm:302 +#: music-functions.scm:487 #, fuzzy, scheme-format -msgid "invalid tremolo repeat count: ~a" -msgstr "%s: 繰り返しカウントには `}' が必要です" +msgid "bad grob property path ~a" +msgstr "無効な操作コード" + +#: music-functions.scm:511 +#, scheme-format +msgid "bad context property ~a" +msgstr "" + +#: music-functions.scm:534 +#, fuzzy, scheme-format +msgid "bad music property ~a" +msgstr " -a, --alias エイリアス名\n" -#: music-functions.scm:634 +#: music-functions.scm:840 #, fuzzy msgid "Bad chord repetition" msgstr "和音にAを追加" -#: music-functions.scm:669 +#: music-functions.scm:945 #, fuzzy, scheme-format msgid "music expected: ~S" msgstr "コロンを期待しました" -#: music-functions.scm:985 +#: music-functions.scm:1295 #, fuzzy, scheme-format msgid "cannot find quoted music: `~S'" msgstr "'%s' の URL が見つかりません" -#: music-functions.scm:1123 +#: music-functions.scm:1432 msgid "Add @var{octave-shift} to the octave of @var{pitch}." msgstr "" -#: music-functions.scm:1183 +#: music-functions.scm:1495 #, fuzzy, scheme-format msgid "Unknown octaveness type: ~S " msgstr "ファイルタイプが不明です" -#: music-functions.scm:1184 +#: music-functions.scm:1496 #, fuzzy msgid "Defaulting to 'any-octave." msgstr "%{エラーです。デフォルトを使います%}ト音記号" -#: music-functions.scm:1521 +#: music-functions.scm:1888 #, fuzzy, scheme-format msgid "unknown accidental style: ~S" msgstr "名前復元 (demangle) の方式 `%s' が不明です" -#: define-event-classes.scm:80 -msgid "All classes must be the last in their matrilineal line." -msgstr "" - -#: define-event-classes.scm:84 -msgid "All classes must have a well-defined pedigree in the existing class hierarchy." -msgstr "" +#: music-functions.scm:2098 +#, fuzzy +#| msgid "silly duration" +msgid "Missing duration" +msgstr "馬鹿げた音長" -#: define-event-classes.scm:151 +#: music-functions.scm:2626 #, scheme-format -msgid "event class ~A seems to be unused" +msgid "not a symbol list: ~a" msgstr "" -#. should be programming-error -#: define-event-classes.scm:157 -#, scheme-format -msgid "translator listens to nonexisting event class ~A" -msgstr "" +#: music-functions.scm:2629 +#, fuzzy, scheme-format +msgid "conflicting tag group ~a" +msgstr "拍子の要求が競合します" -#: markup-macros.scm:331 -#, scheme-format -msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" -msgstr "" +#: output-ps.scm:290 output-svg.scm:539 +#, fuzzy, scheme-format +msgid "unknown line-cap-style: ~S" +msgstr "改行文字形式が一貫していません" -#: markup-macros.scm:337 +#: output-ps.scm:295 output-svg.scm:545 +#, fuzzy, scheme-format +msgid "unknown line-join-style: ~S" +msgstr "改行文字形式が一貫していません" + +#: output-svg.scm:148 #, scheme-format -msgid "Invalid argument in position ~A. Expect: ~A, found: ~S." +msgid "cannot decypher Pango description: ~a" msgstr "" -#: markup-macros.scm:373 -#, fuzzy, scheme-format -msgid "Not a markup command: ~A" -msgstr "「e」コマンドは、サポートされていません" - -#: define-note-names.scm:962 +#: output-svg.scm:228 #, fuzzy -msgid "Select note names language." -msgstr "言語のコードを選択してください:" +msgid "Glyph must have a unicode value" +msgstr "" +"\n" +"%s.%s: 値は boolean でなければなりません\n" -#: define-note-names.scm:968 +#: output-svg.scm:280 output-svg.scm:290 #, fuzzy, scheme-format -msgid "Using `~a' note names..." -msgstr "パッケージ名総数: " +msgid "cannot find SVG font ~S" +msgstr "'%s' の URL が見つかりません" -#: define-note-names.scm:971 -#, fuzzy, scheme-format -msgid "Could not find language `~a'. Ignoring." -msgstr "マスター・ブラウザが見つかりませんでした" +#: paper.scm:121 +msgid "set-global-staff-size: not in toplevel scope" +msgstr "" -#: framework-ps.scm:250 +#: paper.scm:321 #, fuzzy, scheme-format -msgid "cannot embed ~S=~S" -msgstr "%s: %s: stat できません: %s\n" +msgid "This is not a \\layout {} object, ~S" +msgstr "エラー: %s() の 第%d引数がオブジェクトではありません\n" -#: framework-ps.scm:293 +#: paper.scm:329 #, fuzzy, scheme-format -msgid "cannot extract file matching ~a from ~a" -msgstr "RPM ファイルからカタログを抽出できません。" +msgid "Unknown paper size: ~a" +msgstr "用紙のサイズ '%s' を認識できません (デフォルトを使用します)\n" -#: framework-ps.scm:311 -#, scheme-format -msgid "do not know how to embed ~S=~S" +#. TODO: should raise (generic) exception with throw, and catch +#. that in parse-scm.cc +#: paper.scm:348 +msgid "Must use #(set-paper-size .. ) within \\paper { ... }" msgstr "" -#: framework-ps.scm:336 -#, scheme-format -msgid "do not know how to embed font ~s ~s ~s" -msgstr "" +#: parser-clef.scm:154 +#, fuzzy, scheme-format +msgid "unknown clef type `~a'" +msgstr "ファイルタイプが不明です" -#: framework-ps.scm:686 -msgid "" -"\n" -"The PostScript backend does not support the\n" -"system-by-system output. For that, use the EPS backend instead,\n" -"\n" -" lilypond -dbackend=eps FILE\n" -"\n" -"If have cut & pasted a lilypond fragment from a webpage, be sure\n" -"to only remove anything before\n" -"\n" -" %% ****************************************************************\n" -" %% Start cut-&-pastable-section\n" -" %% ****************************************************************\n" -msgstr "" +#: parser-clef.scm:155 +#, fuzzy, scheme-format +msgid "supported clefs: ~a" +msgstr "サポートしていません" -#: layout-beam.scm:40 -#, scheme-format -msgid "Error in beam quanting. Expected (~S,~S) found ~S." -msgstr "" +#: parser-ly-from-scheme.scm:73 +#, fuzzy +msgid "error in #{ ... #}" +msgstr "「%s」でエラー: %s\n" -#: layout-beam.scm:54 -#, scheme-format -msgid "Error in beam quanting. Expected ~S 0, found ~S." -msgstr "" +#: part-combiner.scm:894 +#, fuzzy, scheme-format +msgid "quoted music `~a' is empty" +msgstr "警告: 「%s」は空のファイルです\n" -#: define-music-types.scm:752 +#: ps-to-png.scm:72 ps-to-png.scm:75 #, fuzzy, scheme-format -msgid "symbol expected: ~S" -msgstr "コロンを期待しました" +msgid "Copying `~a' to `~a'..." +msgstr "%s から %s へ変換しています..." -#: define-music-types.scm:755 +#: ps-to-png.scm:77 ps-to-png.scm:79 #, fuzzy, scheme-format -msgid "cannot find music object: ~S" -msgstr "%s が共有オブジェクト %s に存在しません: %s" +msgid "Deleting `~a'..." +msgstr "%s 書き込み中..." -#: define-music-types.scm:774 +#: to-xml.scm:190 #, fuzzy, scheme-format -msgid "unknown repeat type `~S'" -msgstr "ファイルタイプが不明です" +msgid "assertion failed: ~S" +msgstr "malloc: 失敗したアサーション: %s\n" -#: define-music-types.scm:775 -msgid "See define-music-types.scm for supported repeats" +#: translation-functions.scm:389 +#, scheme-format +msgid "Negative fret for pitch ~a on string ~a" msgstr "" -#: translation-functions.scm:351 +#: translation-functions.scm:392 #, scheme-format -msgid "Negative fret for pitch ~a on string ~a" +msgid "Missing fret for pitch ~a on string ~a" msgstr "" -#: translation-functions.scm:402 +#: translation-functions.scm:435 #, scheme-format msgid "No open string for pitch ~a" msgstr "" -#: translation-functions.scm:417 translation-functions.scm:429 +#: translation-functions.scm:450 translation-functions.scm:462 #, scheme-format msgid "Requested string for pitch requires negative fret: string ~a pitch ~a" msgstr "" -#: translation-functions.scm:420 +#: translation-functions.scm:453 msgid "Ignoring string request and recalculating." msgstr "" -#: translation-functions.scm:432 +#: translation-functions.scm:465 #, fuzzy msgid "Ignoring note in tablature." msgstr "'%s' が '%s' の中で重複しているので無視します" -#: translation-functions.scm:455 +#: translation-functions.scm:490 #, scheme-format msgid "No string for pitch ~a (given frets ~a)" msgstr "" -#: translation-functions.scm:560 +#: translation-functions.scm:595 #, scheme-format msgid "" "No label for fret ~a (on string ~a);\n" "only ~a fret labels provided" msgstr "" -#: ps-to-png.scm:70 -#, fuzzy, scheme-format -msgid "~a exited with status: ~S" -msgstr "%s はステータス %d で終了しました" +#, fuzzy +#~ msgid "cannot find Voice `%s'" +#~ msgstr "ディレクトリ %s が見つかりません\n" -#: define-markup-commands.scm:887 -msgid "no systems found in \\score markup, does it have a \\layout block?" -msgstr "" +#, fuzzy +#~ msgid "cannot find start of (de)crescendo" +#~ msgstr "(デ)クレッシェンドの始点が見つかりません" -#: define-markup-commands.scm:2614 -#, fuzzy, scheme-format -msgid "Cannot find glyph ~a" -msgstr "ディレクトリ %s が見つかりません\n" +#~ msgid "already have a decrescendo" +#~ msgstr "デクレッシェンドが既にあります" -#: define-markup-commands.scm:3040 -#, scheme-format -msgid "no brace found for point size ~S " -msgstr "" +#~ msgid "already have a crescendo" +#~ msgstr "クレッシェンドが既にあります" -#: define-markup-commands.scm:3041 -#, fuzzy, scheme-format -msgid "defaulting to ~S pt" -msgstr "%{エラーです。デフォルトを使います%}C" +#, fuzzy +#~ msgid "cresc starts here" +#~ msgstr "ここにリクエストをどうぞ" -#: define-markup-commands.scm:3194 -#, fuzzy, scheme-format -msgid "not a valid duration string: ~a" -msgstr "文字列 '%s' は有効な長さではありません。\n" +#~ msgid "unterminated (de)crescendo" +#~ msgstr "終端のない(デ)クレッシェンド" -#: documentation-lib.scm:59 -#, fuzzy, scheme-format -msgid "Processing ~S..." -msgstr "処理中..." +#, fuzzy +#~ msgid "ignoring too many clashing note columns" +#~ msgstr "釣り合わない音符が多すぎます。それらを無視します。" -#: documentation-lib.scm:176 -#, fuzzy, scheme-format -msgid "Writing ~S..." -msgstr "%s 書き込み中..." +#, fuzzy +#~ msgid "compressing music to fit" +#~ msgstr "画像に高さを合わせる(_F)" -#: documentation-lib.scm:188 -#, fuzzy, scheme-format -msgid "cannot find description for property `~S' (~S)" -msgstr "'%s' の属性のハッシュを書き込めません" +#, fuzzy +#~ msgid "(normalized pitch)" +#~ msgstr "音の高さを変更" -#: documentation-lib.scm:209 -#, fuzzy, scheme-format -msgid "cannot find description for property ~S (~S)" -msgstr "'%s' の属性のハッシュを書き込めません" +#, fuzzy +#~ msgid "Transposing %s by %s makes alteration larger than double" +#~ msgstr "%s の変調によって、二つを超える派生音が作られました" -#: ly-syntax-constructors.scm:65 -#, fuzzy, scheme-format -msgid "~a function cannot return ~a" -msgstr "リターンで自動的にインデント(&R)" +#~ msgid "unterminated slur" +#~ msgstr "終端されていないスラー" -#: ly-syntax-constructors.scm:74 -#, scheme-format -msgid "wrong type for argument ~a. Expecting ~a, found ~s" -msgstr "" +#, fuzzy +#~ msgid "unterminated phrasing slur" +#~ msgstr "スラーを終了できません" -#: ly-syntax-constructors.scm:187 -#, fuzzy, scheme-format -msgid "Invalid property operation ~a" -msgstr "無効な操作コード" +#, fuzzy +#~ msgid "cannot end phrasing slur" +#~ msgstr "スラーの中に別のスラーを含むことはできません" + +#, fuzzy +#~ msgid "already have phrasing slur" +#~ msgstr "スラーを終了できません" + +#, fuzzy +#~ msgid "Cyclic markup detected: %s" +#~ msgstr "自動検出ボリューム" + +#, fuzzy +#~ msgid "Too much lookahead" +#~ msgstr "アドレスファミリの引数が多すぎます.\n" + +#, fuzzy +#~ msgid "undefined: ~S" +#~ msgstr "名前なし" + +#, fuzzy +#~ msgid "old relative compatibility not used" +#~ msgstr "GP が未定義の時に GP 関連再配置が使われました" + +#, fuzzy +#~ msgid "unknown repeat type `~S'" +#~ msgstr "ファイルタイプが不明です" + +#, fuzzy +#~ msgid "~a exited with status: ~S" +#~ msgstr "%s はステータス %d で終了しました" #~ msgid "EOF in a string" #~ msgstr "文字列中に EOF があります" @@ -3805,9 +4148,6 @@ msgstr "無効な操作コード" #~ msgid "can't find character number: %d" #~ msgstr "文字番号が見つかりません: %d" -#~ msgid "can't find character called: `%s'" -#~ msgstr "呼び出された文字が見つかりません: `%s'" - #~ msgid "Error parsing AFM file" #~ msgstr "AFM ファイルを解析中にエラー" @@ -3943,9 +4283,6 @@ msgstr "無効な操作コード" #~ msgid "unconventional key: flats: %d, sharps: %d" #~ msgstr "慣習に合わないキーです: フラット: %d 個, シャープ %d 個" -#~ msgid "silly duration" -#~ msgstr "馬鹿げた音長" - #~ msgid "silly pitch" #~ msgstr "馬鹿げたピッチ" @@ -4123,9 +4460,6 @@ msgstr "無効な操作コード" #~ msgid "invalid running status" #~ msgstr "無効な動作状態" -#~ msgid "unimplemented MIDI meta-event" -#~ msgstr "未実装の MIDI メタイベント" - #~ msgid "invalid MIDI event" #~ msgstr "無効な MIDI イベント" @@ -4183,9 +4517,6 @@ msgstr "無効な操作コード" #~ msgid "(search path: `%s)'" #~ msgstr "(検索パス: `%s')" -#~ msgid "unfinished beam" -#~ msgstr "終了されていない鈎" - #~ msgid "0 lines" #~ msgstr "0 行" diff --git a/po/lilypond.pot b/po/lilypond.pot index fe374c91d3..ae5cfd4108 100644 --- a/po/lilypond.pot +++ b/po/lilypond.pot @@ -1,18 +1,19 @@ # Translation of LilyPond -# Copyright (C) 1998--2012 Han-Wen Nienhuys, Jan Nieuwenhuizen. +# Copyright (C) 1998--2015 Han-Wen Nienhuys, Jan Nieuwenhuizen. # This file is distributed under the same license as the LilyPond package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: lilypond 2.18.2\n" +"Project-Id-Version: lilypond 2.19.45\n" "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu." "lilypond.bugs\n" -"POT-Creation-Date: 2014-03-17 15:20+0000\n" +"POT-Creation-Date: 2016-07-08 13:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" +"Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -28,6 +29,7 @@ msgid "Output function not implemented" msgstr "" #: book_latex.py:174 +#, python-brace-format msgid "cannot find \\begin{document} in LaTeX document" msgstr "" @@ -36,18 +38,18 @@ msgstr "" msgid "Running `%s' on file `%s' to detect default page settings.\n" msgstr "" -#: book_latex.py:214 book_texinfo.py:228 +#: book_latex.py:219 book_texinfo.py:230 msgid "Unable to auto-detect default settings:\n" msgstr "" -#: book_latex.py:226 book_texinfo.py:240 +#: book_latex.py:231 book_texinfo.py:242 #, python-format msgid "" "Unable to auto-detect default settings:\n" "%s" msgstr "" -#: book_latex.py:249 +#: book_latex.py:254 msgid "cannot detect textwidth from LaTeX" msgstr "" @@ -81,38 +83,38 @@ msgstr "" msgid "Missing files: %s" msgstr "" -#: book_snippets.py:651 +#: book_snippets.py:661 #, python-format msgid "Could not overwrite file %s" msgstr "" -#: book_snippets.py:738 +#: book_snippets.py:748 #, python-format msgid "Running through filter `%s'" msgstr "" -#: book_snippets.py:759 +#: book_snippets.py:769 #, python-format msgid "`%s' failed (%d)" msgstr "" -#: book_snippets.py:760 +#: book_snippets.py:770 msgid "The error log is as follows:" msgstr "" -#: book_snippets.py:880 +#: book_snippets.py:890 #, python-format msgid "Converting MusicXML file `%s'...\n" msgstr "" -#: book_snippets.py:907 +#: book_snippets.py:917 #, python-format msgid "" "%s: duplicate filename but different contents of original file,\n" "printing diff against existing file." msgstr "" -#: book_snippets.py:920 +#: book_snippets.py:930 #, python-format msgid "" "%s: duplicate filename but different contents of converted lilypond file,\n" @@ -122,7 +124,7 @@ msgstr "" #. Work around a texi2pdf bug: if LANG=C is not given, a broken regexp is #. used to detect relative/absolute paths, so the absolute path is not #. detected as such and this command fails: -#: book_texinfo.py:206 +#: book_texinfo.py:208 #, python-format msgid "Running texi2pdf on file %s to detect default page settings.\n" msgstr "" @@ -161,7 +163,7 @@ msgstr "" #: convertrules.py:82 convertrules.py:1856 convertrules.py:2032 #: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801 -#: convertrules.py:3151 convertrules.py:3385 convertrules.py:3697 +#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700 msgid "bump version for release" msgstr "" @@ -545,7 +547,7 @@ msgstr "" #: convertrules.py:2820 msgid "" "oldaddlyrics is no longer supported. \n" -" Use addlyrics or lyrsicsto instead.\n" +" Use addlyrics or lyricsto instead.\n" msgstr "" #: convertrules.py:2826 @@ -570,7 +572,7 @@ msgid "\\bar \".\" now produces a thick barline.\n" msgstr "" #: convertrules.py:2849 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" msgstr "" #: convertrules.py:2854 @@ -771,15 +773,15 @@ msgid "" "handled.\n" msgstr "" -#: convertrules.py:3369 +#: convertrules.py:3372 msgid "beamExceptions controls whole-measure beaming." msgstr "" -#: convertrules.py:3606 +#: convertrules.py:3609 msgid "Flag.transparent and Flag.color inherit from Stem" msgstr "" -#: convertrules.py:3672 +#: convertrules.py:3675 msgid "" "Staff-padding now controls the distance to the baseline, not the nearest " "point." @@ -835,95 +837,121 @@ msgstr "" msgid "Usage: %s" msgstr "" -#: musicexp.py:224 musicexp.py:229 +#: musicexp.py:307 musicexp.py:312 msgid "Language does not support microtones contained in the piece" msgstr "" -#: musicexp.py:491 +#: musicexp.py:601 msgid "Tuplet brackets of curved shape are not correctly implemented" msgstr "" -#: musicexp.py:677 +#: musicexp.py:787 #, python-format msgid "unable to set the music %(music)s for the repeat %(repeat)s" msgstr "" -#: musicexp.py:686 +#: musicexp.py:796 msgid "encountered repeat without body" msgstr "" #. no self.elements! -#: musicexp.py:856 +#: musicexp.py:1009 #, python-format msgid "Grace note with no following music: %s" msgstr "" -#: musicexp.py:1018 +#: musicexp.py:1204 #, python-format msgid "Invalid octave shift size found: %s. Using no shift." msgstr "" -#: musicexp.py:1476 +#: musicexp.py:1803 #, python-format msgid "Unable to convert alteration %s to a lilypond expression" msgstr "" #. TODO: Handle pieces without a time signature! -#: musicxml.py:361 +#: musicxml.py:515 msgid "Senza-misura time signatures are not yet supported!" msgstr "" -#: musicxml.py:379 +#: musicxml.py:533 msgid "Unable to interpret time signature! Falling back to 4/4." msgstr "" -#: musicxml.py:435 +#: musicxml.py:589 #, python-format msgid "" "Key alteration octave given for a non-existing alteration nr. %s, available " "numbers: %s!" msgstr "" -#: musicxml.py:523 +#: musicxml.py:825 +#, python-format +msgid "Encountered note at %s without type and duration(=%s)" +msgstr "" + +#: musicxml.py:867 +#, python-format +msgid "drum %s type unknown, please add to instrument_drumtype_dict" +msgstr "" + +#: musicxml.py:888 +msgid "cannot find suitable event" +msgstr "" + +#: musicxml.py:927 #, python-format msgid "Unable to find instrument for ID=%s\n" msgstr "" -#: abc2ly.py:1386 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 +#: musicxml2ly_conversion.py:23 +#, python-format +msgid "" +"Encountered rational duration with denominator %s, unable to convert to " +"lilypond duration" +msgstr "" + +#: musicxml2ly_conversion.py:42 +#, python-format +msgid "Encountered unprocessed marker %s\n" +msgstr "" + +#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1046 #, python-format msgid "%s [OPTION]... FILE" msgstr "" -#: abc2ly.py:1387 +#: abc2ly.py:1390 #, python-format msgid "" "abc2ly converts ABC music files (see\n" "%s) to LilyPond input.\n" msgstr "" -#: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 -#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:181 +#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 +#: midi2ly.py:1097 musicxml2ly.py:2766 main.cc:184 msgid "show version number and exit" msgstr "" -#: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 -#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:160 +#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 +#: midi2ly.py:1064 musicxml2ly.py:2747 main.cc:163 msgid "show this help and exit" msgstr "" -#: abc2ly.py:1401 etf2ly.py:1209 midi2ly.py:1071 +#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1073 msgid "write output to FILE" msgstr "" -#: abc2ly.py:1404 +#: abc2ly.py:1407 msgid "be strict about success" msgstr "" -#: abc2ly.py:1407 +#: abc2ly.py:1410 msgid "preserve ABC's notion of beams" msgstr "" -#: abc2ly.py:1410 +#: abc2ly.py:1413 msgid "suppress progress messages" msgstr "" @@ -931,8 +959,8 @@ msgstr "" #. "Report bugs in English via %s", #. or if there is a LilyPond users list or forum in your language #. "Report bugs in English via %s or in YOUR_LANG via URI" -#: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 -#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:315 +#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 +#: midi2ly.py:1109 musicxml2ly.py:2909 main.cc:318 #, c-format, python-format msgid "Report bugs via %s" msgstr "" @@ -951,16 +979,16 @@ msgstr "" msgid "Examples:" msgstr "" -#: convert-ly.py:79 etf2ly.py:1191 lilypond-book.py:115 midi2ly.py:81 +#: convert-ly.py:79 etf2ly.py:1191 lilypond-book.py:115 midi2ly.py:80 #, python-format msgid "Copyright (c) %s by" msgstr "" -#: convert-ly.py:81 etf2ly.py:1193 lilypond-book.py:117 midi2ly.py:83 +#: convert-ly.py:81 etf2ly.py:1193 lilypond-book.py:117 midi2ly.py:82 msgid "Distributed under terms of the GNU General Public License." msgstr "" -#: convert-ly.py:82 etf2ly.py:1194 lilypond-book.py:118 midi2ly.py:84 +#: convert-ly.py:82 etf2ly.py:1194 lilypond-book.py:118 midi2ly.py:83 msgid "It comes with NO WARRANTY." msgstr "" @@ -976,14 +1004,14 @@ msgstr "" msgid "edit in place" msgstr "" -#: convert-ly.py:109 lilypond-book.py:179 musicxml2ly.py:2627 +#: convert-ly.py:109 lilypond-book.py:179 musicxml2ly.py:2803 msgid "" "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS " "(default), DEBUG)" msgstr "" #: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181 -#: musicxml2ly.py:2629 main.cc:174 +#: musicxml2ly.py:2805 main.cc:177 msgid "LOGLEVEL" msgstr "" @@ -1014,8 +1042,8 @@ msgstr "" msgid "make a numbered backup [default: filename.ext~]" msgstr "" -#: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096 -#: main.cc:183 +#: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1098 +#: main.cc:186 msgid "show warranty and copyright" msgstr "" @@ -1036,17 +1064,17 @@ msgstr "" msgid "Processing `%s'... " msgstr "" -#: convert-ly.py:368 +#: convert-ly.py:366 #, python-format msgid "%s: Unable to open file" msgstr "" -#: convert-ly.py:374 +#: convert-ly.py:372 #, python-format msgid "%s: Unable to determine version. Skipping" msgstr "" -#: convert-ly.py:380 +#: convert-ly.py:378 #, python-format msgid "" "%s: Invalid version string `%s' \n" @@ -1054,7 +1082,7 @@ msgid "" "`2.8.12'" msgstr "" -#: convert-ly.py:386 +#: convert-ly.py:384 #, python-format msgid "There was %d error." msgid_plural "There were %d errors." @@ -1073,8 +1101,8 @@ msgid "" "file.\n" msgstr "" -#: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659 -#: main.cc:166 main.cc:178 +#: etf2ly.py:1210 midi2ly.py:1069 midi2ly.py:1074 musicxml2ly.py:2859 +#: main.cc:169 main.cc:181 msgid "FILE" msgstr "" @@ -1114,7 +1142,7 @@ msgid "add DIR to include path" msgstr "" #: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169 -#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:165 +#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168 msgid "DIR" msgstr "" @@ -1128,7 +1156,7 @@ msgstr "" #: lilypond-book.py:157 msgid "" -"pad left side of music to align music inspite of uneven bar numbers (in mm)" +"pad left side of music to align music in spite of uneven bar numbers (in mm)" msgstr "" #: lilypond-book.py:162 @@ -1180,7 +1208,7 @@ msgstr "" msgid "write snippet output files with the same base name as their source file" msgstr "" -#: lilypond-book.py:223 midi2ly.py:1090 musicxml2ly.py:2596 +#: lilypond-book.py:223 midi2ly.py:1092 musicxml2ly.py:2772 msgid "be verbose" msgstr "" @@ -1261,339 +1289,386 @@ msgstr "" msgid "Removing `%s'" msgstr "" -#: lilypond-book.py:714 +#: lilypond-book.py:727 #, python-format msgid "Setting LilyPond's loglevel to %s" msgstr "" -#: lilypond-book.py:718 +#: lilypond-book.py:731 #, python-format msgid "" "Setting LilyPond's loglevel to %s (from environment variable " "LILYPOND_LOGLEVEL)" msgstr "" -#: lilypond-book.py:721 +#: lilypond-book.py:734 msgid "" "Setting LilyPond's output to --verbose, implied by lilypond-book's setting" msgstr "" -#: midi2ly.py:90 +#: midi2ly.py:89 msgid "warning: " msgstr "" -#: midi2ly.py:93 midi2ly.py:1124 +#: midi2ly.py:92 midi2ly.py:1126 msgid "error: " msgstr "" -#: midi2ly.py:94 +#: midi2ly.py:93 msgid "Exiting... " msgstr "" -#: midi2ly.py:835 +#: midi2ly.py:834 msgid "found more than 5 voices on a staff, expect bad output" msgstr "" -#: midi2ly.py:1032 +#: midi2ly.py:1034 #, python-format msgid "%s output to `%s'..." msgstr "" -#: midi2ly.py:1045 +#: midi2ly.py:1047 #, python-format msgid "Convert %s to LilyPond input.\n" msgstr "" -#: midi2ly.py:1050 +#: midi2ly.py:1052 msgid "print absolute pitches" msgstr "" -#: midi2ly.py:1052 midi2ly.py:1080 +#: midi2ly.py:1054 midi2ly.py:1082 msgid "DUR" msgstr "" -#: midi2ly.py:1053 +#: midi2ly.py:1055 msgid "quantise note durations on DUR" msgstr "" -#: midi2ly.py:1056 +#: midi2ly.py:1058 msgid "debug printing" msgstr "" -#: midi2ly.py:1059 +#: midi2ly.py:1061 msgid "print explicit durations" msgstr "" -#: midi2ly.py:1064 +#: midi2ly.py:1066 msgid "prepend FILE to output" msgstr "" -#: midi2ly.py:1068 +#: midi2ly.py:1070 msgid "set key: ALT=+sharps|-flats; MINOR=1" msgstr "" -#: midi2ly.py:1069 +#: midi2ly.py:1071 msgid "ALT[:MINOR]" msgstr "" -#: midi2ly.py:1074 +#: midi2ly.py:1076 msgid "preview of first 4 bars" msgstr "" -#: midi2ly.py:1078 +#: midi2ly.py:1080 msgid "suppress progress messages and warnings about excess voices" msgstr "" -#: midi2ly.py:1079 +#: midi2ly.py:1081 msgid "quantise note starts on DUR" msgstr "" -#: midi2ly.py:1083 +#: midi2ly.py:1085 msgid "use s instead of r for rests" msgstr "" -#: midi2ly.py:1085 +#: midi2ly.py:1087 msgid "DUR*NUM/DEN" msgstr "" -#: midi2ly.py:1088 +#: midi2ly.py:1090 msgid "allow tuplet durations DUR*NUM/DEN" msgstr "" -#: midi2ly.py:1098 +#: midi2ly.py:1100 msgid "treat every text as a lyric" msgstr "" -#: midi2ly.py:1101 +#: midi2ly.py:1103 msgid "Examples" msgstr "" -#: midi2ly.py:1125 +#: midi2ly.py:1127 msgid "no files specified on command line." msgstr "" -#: musicxml2ly.py:228 +#: musicxml2ly.py:260 #, python-format msgid "" "Encountered file created by %s, containing wrong beaming information. All " "beaming information in the MusicXML file will be ignored" msgstr "" -#: musicxml2ly.py:247 musicxml2ly.py:249 +#: musicxml2ly.py:302 musicxml2ly.py:304 #, python-format msgid "Unprocessed PartGroupInfo %s encountered" msgstr "" -#: musicxml2ly.py:500 -#, python-format -msgid "Encountered note at %s without type and duration (=%s)" -msgstr "" - -#: musicxml2ly.py:520 -#, python-format -msgid "" -"Encountered rational duration with denominator %s, unable to convert to " -"lilypond duration" -msgstr "" - -#: musicxml2ly.py:767 +#: musicxml2ly.py:792 msgid "Unable to extract key signature!" msgstr "" -#: musicxml2ly.py:794 +#: musicxml2ly.py:819 #, python-format msgid "unknown mode %s, expecting 'major' or 'minor' or a church mode!" msgstr "" -#: musicxml2ly.py:932 -#, python-format -msgid "Encountered unprocessed marker %s\n" -msgstr "" - -#: musicxml2ly.py:1026 +#: musicxml2ly.py:988 #, python-format msgid "unknown span event %s" msgstr "" -#: musicxml2ly.py:1036 +#: musicxml2ly.py:1000 #, python-format msgid "unknown span type %s for %s" msgstr "" -#: musicxml2ly.py:1456 +#: musicxml2ly.py:1497 msgid "Unknown metronome mark, ignoring" msgstr "" #. TODO: Implement the other (more complex) way for tempo marks! -#: musicxml2ly.py:1461 +#: musicxml2ly.py:1502 msgid "" "Metronome marks with complex relations ( in MusicXML) are " "not yet implemented." msgstr "" -#: musicxml2ly.py:1663 +#: musicxml2ly.py:1653 #, python-format msgid "Unable to convert chord type %s to lilypond." msgstr "" -#: musicxml2ly.py:1816 -#, python-format -msgid "drum %s type unknown, please add to instrument_drumtype_dict" -msgstr "" - -#: musicxml2ly.py:1820 -msgid "cannot find suitable event" -msgstr "" - -#: musicxml2ly.py:1968 +#: musicxml2ly.py:2007 #, python-format msgid "Negative skip %s (from position %s to %s)" msgstr "" -#: musicxml2ly.py:2109 +#: musicxml2ly.py:2237 #, python-format msgid "Negative skip found: from %s to %s, difference is %s" msgstr "" -#: musicxml2ly.py:2190 +#: musicxml2ly.py:2338 #, python-format msgid "unexpected %s; expected %s or %s or %s" msgstr "" -#: musicxml2ly.py:2296 +#: musicxml2ly.py:2467 msgid "Encountered closing slur, but no slur is open" msgstr "" -#: musicxml2ly.py:2299 +#: musicxml2ly.py:2470 msgid "Cannot have two simultaneous (closing) slurs" msgstr "" -#: musicxml2ly.py:2308 +#: musicxml2ly.py:2479 msgid "Cannot have a slur inside another slur" msgstr "" -#: musicxml2ly.py:2311 +#: musicxml2ly.py:2482 msgid "Cannot have two simultaneous slurs" msgstr "" -#: musicxml2ly.py:2445 +#: musicxml2ly.py:2608 #, python-format msgid "cannot simultaneously have more than one mode: %s" msgstr "" -#: musicxml2ly.py:2553 +#: musicxml2ly.py:2727 msgid "Converting to LilyPond expressions..." msgstr "" -#: musicxml2ly.py:2564 +#: musicxml2ly.py:2739 msgid "musicxml2ly [OPTION]... FILE.xml" msgstr "" -#: musicxml2ly.py:2566 +#: musicxml2ly.py:2741 msgid "" "Convert MusicXML from FILE.xml to LilyPond input.\n" "If the given filename is -, musicxml2ly reads from the command line.\n" msgstr "" -#: musicxml2ly.py:2576 +#: musicxml2ly.py:2751 +#, python-format msgid "" -"Copyright (c) 2005--2012 by\n" +"Copyright (c) 2005--2016 by\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen and\n" " Reinhold Kainhofer \n" +" Patrick L. Schmidt \n" +"\n" +"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 "" -#: musicxml2ly.py:2602 +#: musicxml2ly.py:2778 msgid "use lxml.etree; uses less memory and cpu time" msgstr "" -#: musicxml2ly.py:2608 +#: musicxml2ly.py:2784 msgid "input file is a zip-compressed MusicXML file" msgstr "" -#: musicxml2ly.py:2614 +#: musicxml2ly.py:2790 msgid "convert pitches in relative mode (default)" msgstr "" -#: musicxml2ly.py:2619 +#: musicxml2ly.py:2795 msgid "convert pitches in absolute mode" msgstr "" -#: musicxml2ly.py:2622 +#: musicxml2ly.py:2798 msgid "LANG" msgstr "" -#: musicxml2ly.py:2624 +#: musicxml2ly.py:2800 msgid "use LANG for pitch names, e.g. 'deutsch' for note names in German" msgstr "" -#: musicxml2ly.py:2638 +#: musicxml2ly.py:2814 msgid "do not convert directions (^, _ or -) for articulations, dynamics, etc." msgstr "" -#: musicxml2ly.py:2644 +#: musicxml2ly.py:2820 msgid "do not convert exact vertical positions of rests" msgstr "" -#: musicxml2ly.py:2650 -msgid "do not convert the exact page layout and breaks" +#: musicxml2ly.py:2826 +msgid "ignore system breaks" +msgstr "" + +#: musicxml2ly.py:2832 +msgid "ignore page breaks" +msgstr "" + +#: musicxml2ly.py:2838 +msgid "ignore page margins" msgstr "" -#: musicxml2ly.py:2656 +#: musicxml2ly.py:2844 +msgid "" +"do not convert the exact page layout and breaks (shortcut for \"--nsb --npb " +"--npm\" options)" +msgstr "" + +#: musicxml2ly.py:2850 +msgid "" +"ignore stem directions from MusicXML, use lilypond's automatic stemming " +"instead" +msgstr "" + +#: musicxml2ly.py:2856 msgid "" "do not convert beaming information, use lilypond's automatic beaming instead" msgstr "" -#: musicxml2ly.py:2664 +#: musicxml2ly.py:2864 msgid "set output filename to FILE, stdout if -" msgstr "" -#: musicxml2ly.py:2670 -msgid "activate midi-block" +#: musicxml2ly.py:2870 +msgid "activate midi-block in .ly file" +msgstr "" + +#: musicxml2ly.py:2874 +msgid "TOPITCH" +msgstr "" + +#: musicxml2ly.py:2877 +msgid "set pitch to transpose by the interval between pitch 'c' and TOPITCH" +msgstr "" + +#: musicxml2ly.py:2881 +msgid "BEATS/BEATTYPE" msgstr "" -#: musicxml2ly.py:2754 +#: musicxml2ly.py:2884 +msgid "" +"change the length|duration of notes as a function of a given time signature " +"to make the score look faster or slower, (eg. '4/4' or '2/2')" +msgstr "" + +#: musicxml2ly.py:2888 +msgid "TABCLEFNAME" +msgstr "" + +#: musicxml2ly.py:2891 +msgid "switch between two versions of tab clefs (\"tab\" and \"moderntab\")" +msgstr "" + +#: musicxml2ly.py:2895 +msgid "t[rue]/f[alse]" +msgstr "" + +#: musicxml2ly.py:2898 +msgid "" +"deactivate string number stencil with --string-numbers f[alse]. Default is " +"t[rue]" +msgstr "" + +#: musicxml2ly.py:2905 +msgid "" +"converts '' events to a separate FretBoards voice instead of markups" +msgstr "" + +#: musicxml2ly.py:2979 #, python-format msgid "unknown part in part-list: %s" msgstr "" -#: musicxml2ly.py:2816 +#: musicxml2ly.py:3069 msgid "Input is compressed, extracting raw MusicXML data from stdin" msgstr "" -#: musicxml2ly.py:2829 +#: musicxml2ly.py:3082 #, python-format msgid "Input file %s is compressed, extracting raw MusicXML data" msgstr "" -#: musicxml2ly.py:2859 +#: musicxml2ly.py:3112 msgid "Reading MusicXML from Standard input ..." msgstr "" -#: musicxml2ly.py:2861 +#: musicxml2ly.py:3114 #, python-format msgid "Reading MusicXML from %s ..." msgstr "" -#: musicxml2ly.py:2894 +#: musicxml2ly.py:3146 #, python-format msgid "Output to `%s'" msgstr "" -#: musicxml2ly.py:2964 +#: musicxml2ly.py:3172 +#, python-format +msgid "Converting to current version (%s) notations ..." +msgstr "" + +#: musicxml2ly.py:3246 #, python-format msgid "Unable to find input file %s" msgstr "" -#: website_post.py:125 +#: website_post.py:129 msgid "English" msgstr "" -#: website_post.py:128 +#: website_post.py:132 msgid "Other languages" msgstr "" -#: website_post.py:129 +#: website_post.py:133 #, python-format msgid "About automatic language selection." msgstr "" @@ -1668,21 +1743,21 @@ msgstr "" msgid "accidental typesetting list must begin with context-name: %s" msgstr "" -#: accidental-engraver.cc:210 +#: accidental-engraver.cc:207 #, c-format msgid "procedure or context-name expected for accidental rule, found %s" msgstr "" -#: accidental.cc:169 +#: accidental.cc:141 #, c-format msgid "Could not find glyph-name for alteration %s" msgstr "" -#: accidental.cc:184 +#: accidental.cc:157 msgid "natural alteration glyph not found" msgstr "" -#: all-font-metrics.cc:149 +#: all-font-metrics.cc:159 #, c-format msgid "cannot find font: `%s'" msgstr "" @@ -1695,29 +1770,24 @@ msgstr "" msgid "no heads for arpeggio found?" msgstr "" -#: auto-change-iterator.cc:74 change-iterator.cc:72 -#, c-format -msgid "cannot change, already in translator: %s" -msgstr "" - -#: axis-group-engraver.cc:149 +#: axis-group-engraver.cc:154 msgid "Axis_group_engraver: vertical group already has a parent" msgstr "" -#: axis-group-engraver.cc:150 +#: axis-group-engraver.cc:155 msgid "are there two Axis_group_engravers?" msgstr "" -#: axis-group-engraver.cc:151 +#: axis-group-engraver.cc:156 msgid "removing this vertical group" msgstr "" -#: axis-group-interface.cc:714 +#: axis-group-interface.cc:716 #, c-format msgid "\"%s\" is not a valid outside-staff-placement-directive" msgstr "" -#: axis-group-interface.cc:786 +#: axis-group-interface.cc:788 msgid "an outside-staff object should have a direction, defaulting to up" msgstr "" @@ -1726,32 +1796,32 @@ msgstr "" msgid "barcheck failed at: %s" msgstr "" -#: beam-engraver.cc:148 +#: beam-engraver.cc:147 msgid "already have a beam" msgstr "" -#: beam-engraver.cc:235 +#: beam-engraver.cc:234 msgid "unterminated beam" msgstr "" -#: beam-engraver.cc:282 chord-tremolo-engraver.cc:149 +#: beam-engraver.cc:281 chord-tremolo-engraver.cc:148 msgid "stem must have Rhythmic structure" msgstr "" -#: beam-engraver.cc:293 +#: beam-engraver.cc:292 msgid "stem does not fit in beam" msgstr "" -#: beam-engraver.cc:294 +#: beam-engraver.cc:293 msgid "beam was started here" msgstr "" #. We are completely screwed. -#: beam-quanting.cc:839 +#: beam-quanting.cc:850 msgid "no viable initial configuration found: may not find good beam slope" msgstr "" -#: beam.cc:181 +#: beam.cc:183 msgid "removing beam with no stems" msgstr "" @@ -1761,30 +1831,32 @@ msgid "cannot change `%s' to `%s'" msgstr "" #. FIXME: constant error message. -#: change-iterator.cc:93 +#: change-iterator.cc:67 msgid "cannot find context to switch to" msgstr "" +#. No enclosing context was found because the iterator's immediate +#. context is the kind that was sought. #. We could change the current translator's id, but that would make #. errors hard to catch. #. #. last->translator_id_string () = get_change #. ()->change_to_id_string (); -#: change-iterator.cc:102 +#: change-iterator.cc:78 #, c-format msgid "not changing to same context type: %s" msgstr "" -#. FIXME: uncomprehensable message -#: change-iterator.cc:106 +#. FIXME: incomprehensible message +#: change-iterator.cc:82 msgid "none of these in my family" msgstr "" -#: chord-tremolo-engraver.cc:88 +#: chord-tremolo-engraver.cc:87 msgid "No tremolo to end" msgstr "" -#: chord-tremolo-engraver.cc:109 +#: chord-tremolo-engraver.cc:108 msgid "unterminated chord tremolo" msgstr "" @@ -1811,26 +1883,26 @@ msgstr "" msgid "cannot find line breaking that satisfies constraints" msgstr "" -#: context-property.cc:43 -msgid "need symbol arguments for \\override and \\revert" +#: context-property.cc:46 +msgid "need symbol argument for \\override and \\revert" msgstr "" -#: context.cc:149 +#: context.cc:147 #, c-format msgid "cannot find or create new `%s'" msgstr "" -#: context.cc:228 +#: context.cc:226 #, c-format msgid "cannot find or create `%s' called `%s'" msgstr "" -#: context.cc:425 +#: context.cc:457 #, c-format msgid "cannot find or create: `%s'" msgstr "" -#: context.cc:439 +#: context.cc:471 #, c-format msgid "cannot find or create new Bottom = \"%s\"" msgstr "" @@ -1840,20 +1912,20 @@ msgstr "" msgid "custos `%s' not found" msgstr "" -#: dispatcher.cc:89 +#: dispatcher.cc:82 msgid "Event class should be a list" msgstr "" -#: dispatcher.cc:172 +#: dispatcher.cc:165 #, c-format msgid "Junking event: %s" msgstr "" -#: dispatcher.cc:277 +#: dispatcher.cc:279 msgid "Attempting to remove nonexisting listener." msgstr "" -#: dispatcher.cc:303 +#: dispatcher.cc:305 msgid "Already listening to dispatcher, ignoring request" msgstr "" @@ -1862,57 +1934,50 @@ msgstr "" msgid "dot `%s' not found" msgstr "" -#: dynamic-engraver.cc:168 +#: dynamic-engraver.cc:166 #, c-format msgid "" "unknown crescendo style: %s\n" "defaulting to hairpin." msgstr "" -#: dynamic-engraver.cc:233 slur-proto-engraver.cc:119 +#: dynamic-engraver.cc:231 slur-engraver.cc:185 #, c-format msgid "unterminated %s" msgstr "" -#. No explicit dynamic script events have occurred yet, but there is -#. nevertheless a dynamic spanner. Initialize last_volume_ to a -#. value within the available range. -#: dynamic-performer.cc:129 -msgid "(De)crescendo with unspecified starting volume in MIDI." -msgstr "" - -#: episema-engraver.cc:75 +#: episema-engraver.cc:74 msgid "already have an episema" msgstr "" -#: episema-engraver.cc:88 +#: episema-engraver.cc:87 msgid "cannot find start of episema" msgstr "" -#: episema-engraver.cc:137 +#: episema-engraver.cc:136 msgid "unterminated episema" msgstr "" -#: extender-engraver.cc:169 extender-engraver.cc:178 +#: extender-engraver.cc:167 extender-engraver.cc:176 msgid "unterminated extender" msgstr "" -#: flag.cc:134 +#: flag.cc:133 #, c-format msgid "flag `%s' not found" msgstr "" -#: flag.cc:154 +#: flag.cc:153 #, c-format msgid "flag stroke `%s' not found" msgstr "" -#: font-config-scheme.cc:151 font-config.cc:53 +#: font-config-scheme.cc:151 font-config.cc:82 #, c-format msgid "failed adding font directory: %s" msgstr "" -#: font-config-scheme.cc:153 font-config.cc:55 +#: font-config-scheme.cc:153 font-config.cc:84 #, c-format msgid "Adding font directory: %s" msgstr "" @@ -1931,7 +1996,17 @@ msgstr "" msgid "Initializing FontConfig..." msgstr "" -#: font-config.cc:58 +#: font-config.cc:70 +#, c-format +msgid "failed to add fontconfig configuration file `%s'" +msgstr "" + +#: font-config.cc:73 +#, c-format +msgid "Adding fontconfig configuration file: %s" +msgstr "" + +#: font-config.cc:86 msgid "Building font database..." msgstr "" @@ -1939,16 +2014,21 @@ msgstr "" msgid "Must be footnote-event." msgstr "" -#: general-scheme.cc:390 +#: general-scheme.cc:403 #, c-format msgid "failed redirecting stderr to `%s'" msgstr "" -#: general-scheme.cc:469 output-ps.scm:48 +#: general-scheme.cc:482 output-ps.scm:48 msgid "Found infinity or nan in output. Substituting 0.0" msgstr "" -#: glissando-engraver.cc:158 +#: general-scheme.cc:623 +#, c-format +msgid "g_spawn_sync failed (%d): %s: %s" +msgstr "" + +#: glissando-engraver.cc:157 msgid "unterminated glissando" msgstr "" @@ -1995,12 +2075,12 @@ msgstr "" msgid "Grob `%s' has no interface for property `%s'" msgstr "" -#: grob-property.cc:35 +#: grob-property.cc:32 #, c-format msgid "%d: %s" msgstr "" -#: grob.cc:488 +#: grob.cc:486 #, c-format msgid "ignored infinite %s-offset" msgstr "" @@ -2013,23 +2093,23 @@ msgstr "" msgid "decrescendo too small" msgstr "" -#: horizontal-bracket-engraver.cc:62 +#: horizontal-bracket-engraver.cc:61 msgid "do not have that many brackets" msgstr "" -#: horizontal-bracket-engraver.cc:71 +#: horizontal-bracket-engraver.cc:70 msgid "conflicting note group events" msgstr "" -#: hyphen-engraver.cc:104 +#: hyphen-engraver.cc:103 msgid "removing unterminated hyphen" msgstr "" -#: hyphen-engraver.cc:118 +#: hyphen-engraver.cc:117 msgid "unterminated hyphen; removing" msgstr "" -#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108 +#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108 #, c-format msgid "cannot find file: `%s'" msgstr "" @@ -2039,11 +2119,11 @@ msgstr "" msgid "(search path: `%s')" msgstr "" -#: input.cc:138 source-file.cc:178 source-file.cc:193 +#: input.cc:138 source-file.cc:180 source-file.cc:195 msgid "position unknown" msgstr "" -#: key-engraver.cc:198 +#: key-engraver.cc:197 msgid "Incomplete keyAlterationOrder for key signature" msgstr "" @@ -2056,11 +2136,11 @@ msgstr "" msgid "alteration not found" msgstr "" -#: ligature-bracket-engraver.cc:72 ligature-engraver.cc:109 +#: ligature-bracket-engraver.cc:71 ligature-engraver.cc:109 msgid "cannot find start of ligature" msgstr "" -#: ligature-bracket-engraver.cc:85 ligature-engraver.cc:136 +#: ligature-bracket-engraver.cc:84 ligature-engraver.cc:136 msgid "already have a ligature" msgstr "" @@ -2084,21 +2164,21 @@ msgstr "" msgid "ligature was started here" msgstr "" -#: lily-guile.cc:93 +#: lily-guile.cc:94 #, c-format msgid "(load path: `%s')" msgstr "" -#: lily-guile.cc:412 +#: lily-guile.cc:413 #, c-format msgid "cannot find property type-check for `%s' (%s)." msgstr "" -#: lily-guile.cc:415 +#: lily-guile.cc:416 msgid "perhaps a typing error?" msgstr "" -#: lily-guile.cc:422 +#: lily-guile.cc:423 msgid "skipping assignment" msgstr "" @@ -2107,20 +2187,33 @@ msgstr "" msgid "type check for `%s' failed; value `%s' must be of type `%s'" msgstr "" -#: lily-lexer.cc:249 +#. Uh oh. unsmob delivered 0, yet +#. unsmob delivers true. This means that unsmob is a +#. matching check from a base class of T, but var is of an +#. incompatible derived type. +#: lily-guile.cc:462 +msgid "Wrong kind of " +msgstr "" + +#: lily-lexer.cc:251 msgid "include files are not allowed in safe mode" msgstr "" -#: lily-lexer.cc:276 +#: lily-lexer.cc:278 #, c-format msgid "identifier name is a keyword: `%s'" msgstr "" -#: lily-lexer.cc:297 lily-lexer.cc:310 +#: lily-lexer.cc:301 lily-lexer.cc:314 #, c-format msgid "%s:EOF" msgstr "" +#: lily-modules.cc:81 +#, c-format +msgid "Uninitialized variable `%s' in module (%s)" +msgstr "" + #: lily-parser-scheme.cc:80 #, c-format msgid "Changing working directory to: `%s'" @@ -2141,41 +2234,37 @@ msgstr "" msgid "Processing `%s'" msgstr "" -#: lily-parser-scheme.cc:209 +#: lily-parser-scheme.cc:210 msgid "" "ly:parser-parse-string is only valid with a new parser. Use ly:parser-" "include-string instead." msgstr "" -#: lily-parser-scheme.cc:240 +#: lily-parser-scheme.cc:241 msgid "" "ly:parse-string-expression is only valid with a new parser. Use ly:parser-" "include-string instead." msgstr "" -#: lily-parser.cc:107 +#: lily-parser.cc:106 msgid "Parsing..." msgstr "" -#: lookup.cc:181 +#: lookup.cc:177 #, c-format msgid "Not drawing a box with negative dimension, %.2f by %.2f." msgstr "" -#: lyric-combine-music-iterator.cc:199 +#: lyric-combine-music-iterator.cc:204 msgid "argument of \\lyricsto should contain Lyrics context" msgstr "" -#: lyric-combine-music-iterator.cc:337 +#: lyric-combine-music-iterator.cc:344 #, c-format -msgid "cannot find Voice `%s'" -msgstr "" - -#: lyric-engraver.cc:186 -msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." +msgid "cannot find %s `%s'" msgstr "" -#: main.cc:104 +#: main.cc:106 #, c-format msgid "" "This program is free software. It is covered by the GNU General Public\n" @@ -2184,7 +2273,7 @@ msgid "" "information.\n" msgstr "" -#: main.cc:110 +#: main.cc:112 msgid "" " This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License as \n" @@ -2202,98 +2291,102 @@ msgid "" "Boston, MA 02111-1307, USA.\n" msgstr "" -#: main.cc:148 +#: main.cc:150 msgid "SYM[=VAL]" msgstr "" -#: main.cc:149 +#: main.cc:151 msgid "" "set Scheme option SYM to VAL (default: #t).\n" "Use -dhelp for help." msgstr "" -#: main.cc:153 +#: main.cc:155 msgid "EXPR" msgstr "" -#: main.cc:153 +#: main.cc:155 msgid "evaluate scheme code" msgstr "" #. Bug in option parser: --output =foe is taken as an abbreviation #. for --output-format. -#: main.cc:156 +#: main.cc:158 msgid "FORMATs" msgstr "" -#: main.cc:156 +#: main.cc:158 msgid "dump FORMAT,... Also as separate options:" msgstr "" -#: main.cc:157 +#: main.cc:159 msgid "generate PDF (default)" msgstr "" -#: main.cc:158 +#: main.cc:160 msgid "generate PNG" msgstr "" -#: main.cc:159 +#: main.cc:161 msgid "generate PostScript" msgstr "" #: main.cc:162 +msgid "generate big PDF files" +msgstr "" + +#: main.cc:165 msgid "FIELD" msgstr "" -#: main.cc:162 +#: main.cc:165 msgid "" "dump header field FIELD to file\n" "named BASENAME.FIELD" msgstr "" -#: main.cc:165 +#: main.cc:168 msgid "add DIR to search path" msgstr "" -#: main.cc:166 +#: main.cc:169 msgid "use FILE as init file" msgstr "" -#: main.cc:169 +#: main.cc:172 msgid "USER, GROUP, JAIL, DIR" msgstr "" -#: main.cc:169 +#: main.cc:172 msgid "" "chroot to JAIL, become USER:GROUP\n" "and cd into DIR" msgstr "" -#: main.cc:174 +#: main.cc:177 msgid "" "print log messages according to LOGLEVEL. Possible values are:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG." msgstr "" -#: main.cc:178 +#: main.cc:181 msgid "write output to FILE (suffix will be added)" msgstr "" -#: main.cc:179 +#: main.cc:182 msgid "relocate using directory of lilypond program" msgstr "" -#: main.cc:180 +#: main.cc:183 msgid "no progress, only error messages (equivalent to loglevel=ERROR)" msgstr "" -#: main.cc:182 +#: main.cc:185 msgid "be verbose (equivalent to loglevel=DEBUG)" msgstr "" #. Do not update the copyright years here, run `make grand-replace' -#: main.cc:261 +#: main.cc:264 #, c-format msgid "" "Copyright (c) %s by\n" @@ -2301,118 +2394,118 @@ msgid "" msgstr "" #. No version number or newline here. It confuses help2man. -#: main.cc:299 +#: main.cc:302 #, c-format msgid "Usage: %s [OPTION]... FILE..." msgstr "" -#: main.cc:301 +#: main.cc:304 msgid "Typeset music and/or produce MIDI from FILE." msgstr "" -#: main.cc:303 +#: main.cc:306 msgid "LilyPond produces beautiful music notation." msgstr "" -#: main.cc:305 +#: main.cc:308 #, c-format msgid "For more information, see %s" msgstr "" -#: main.cc:307 +#: main.cc:310 msgid "Options:" msgstr "" -#: main.cc:374 +#: main.cc:377 #, c-format msgid "expected %d arguments with jail, found: %u" msgstr "" -#: main.cc:388 +#: main.cc:391 #, c-format msgid "no such user: %s" msgstr "" -#: main.cc:390 +#: main.cc:393 #, c-format msgid "cannot get user id from user name: %s: %s" msgstr "" -#: main.cc:405 +#: main.cc:408 #, c-format msgid "no such group: %s" msgstr "" -#: main.cc:407 +#: main.cc:410 #, c-format msgid "cannot get group id from group name: %s: %s" msgstr "" -#: main.cc:415 +#: main.cc:418 #, c-format msgid "cannot chroot to: %s: %s" msgstr "" -#: main.cc:422 +#: main.cc:425 #, c-format msgid "cannot change group id to: %d: %s" msgstr "" -#: main.cc:428 +#: main.cc:431 #, c-format msgid "cannot change user id to: %d: %s" msgstr "" -#: main.cc:434 +#: main.cc:437 #, c-format msgid "cannot change working directory to: %s: %s" msgstr "" -#: main.cc:805 +#: main.cc:826 #, c-format msgid "exception caught: %s" msgstr "" #. FIXME: constant error message. -#: mark-engraver.cc:156 +#: mark-engraver.cc:149 msgid "rehearsalMark must have integer value" msgstr "" -#: mark-engraver.cc:162 +#: mark-engraver.cc:155 msgid "mark label must be a markup object" msgstr "" -#: mensural-ligature-engraver.cc:100 +#: mensural-ligature-engraver.cc:93 msgid "ligature with less than 2 heads -> skipping" msgstr "" -#: mensural-ligature-engraver.cc:127 +#: mensural-ligature-engraver.cc:120 msgid "cannot determine pitch of ligature primitive -> skipping" msgstr "" -#: mensural-ligature-engraver.cc:141 +#: mensural-ligature-engraver.cc:134 msgid "single note ligature - skipping" msgstr "" -#: mensural-ligature-engraver.cc:152 +#: mensural-ligature-engraver.cc:145 msgid "prime interval within ligature -> skipping" msgstr "" -#: mensural-ligature-engraver.cc:163 +#: mensural-ligature-engraver.cc:156 msgid "mensural ligature: duration none of Mx, L, B, S -> skipping" msgstr "" -#: mensural-ligature-engraver.cc:206 +#: mensural-ligature-engraver.cc:199 msgid "semibrevis must be followed by another one -> skipping" msgstr "" -#: mensural-ligature-engraver.cc:216 +#: 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 "" -#: mensural-ligature-engraver.cc:236 +#: mensural-ligature-engraver.cc:229 msgid "" "invalid ligatura ending:\n" "when the last note is a descending brevis,\n" @@ -2420,11 +2513,11 @@ msgid "" "or the ligatura must be LB or SSB" msgstr "" -#: mensural-ligature-engraver.cc:396 +#: mensural-ligature-engraver.cc:389 msgid "unexpected case fall-through" msgstr "" -#: midi-control-function-performer.cc:109 staff-performer.cc:152 +#: midi-control-function-performer.cc:107 staff-performer.cc:159 #, c-format msgid "ignoring out-of-range value change for MIDI property `%s'" msgstr "" @@ -2448,7 +2541,7 @@ msgstr "" msgid "cannot write to file: `%s'" msgstr "" -#: minimal-page-breaking.cc:40 paper-score.cc:122 +#: minimal-page-breaking.cc:40 paper-score.cc:116 msgid "Calculating line breaks..." msgstr "" @@ -2456,46 +2549,33 @@ msgstr "" msgid "Calculating page breaks..." msgstr "" -#: multi-measure-rest.cc:154 +#: multi-measure-rest.cc:152 msgid "" "usable-duration-logs must be a non-empty list. Falling back to whole rests." msgstr "" -#: multi-measure-rest.cc:364 -msgid "Using naive multi measure rest spacing." -msgstr "" - #: music.cc:150 #, c-format msgid "octave check failed; expected \"%s\", found: \"%s\"" msgstr "" -#: music.cc:219 -msgid "(normalized pitch)" -msgstr "" - -#: music.cc:223 -#, c-format -msgid "Transposing %s by %s makes alteration larger than double" -msgstr "" - #: new-fingering-engraver.cc:113 msgid "cannot add text scripts to individual note heads" msgstr "" -#: new-fingering-engraver.cc:269 +#: new-fingering-engraver.cc:267 msgid "no placement found for fingerings" msgstr "" -#: new-fingering-engraver.cc:270 +#: new-fingering-engraver.cc:268 msgid "placing below" msgstr "" -#: note-collision.cc:497 -msgid "ignoring too many clashing note columns" +#: note-collision.cc:512 +msgid "this Voice needs a \\voiceXx or \\shiftXx setting" msgstr "" -#: note-column.cc:147 +#: note-column.cc:150 msgid "cannot have note heads and rests together on a stem" msgstr "" @@ -2504,41 +2584,102 @@ msgstr "" msgid "none of note heads `%s' or `%s' found" msgstr "" -#: note-heads-engraver.cc:76 +#: note-heads-engraver.cc:75 msgid "NoteEvent without pitch" msgstr "" -#: open-type-font.cc:46 +#: open-type-font-scheme.cc:149 open-type-font-scheme.cc:195 +#: open-type-font-scheme.cc:241 pfb-scheme.cc:62 ttf.cc:512 ttf.cc:561 +msgid "font index must be non-negative, using index 0" +msgstr "" + +#: open-type-font-scheme.cc:163 open-type-font-scheme.cc:209 +#: open-type-font-scheme.cc:289 pfb-scheme.cc:77 ttf.cc:480 ttf.cc:528 +#, c-format +msgid "font index %d too large for font `%s', using index 0" +msgstr "" + +#: open-type-font-scheme.cc:251 +#, c-format +msgid "cannot open font filename `%s'" +msgstr "" + +#: open-type-font-scheme.cc:261 open-type-font-scheme.cc:277 +#: open-type-font-scheme.cc:300 open-type-font-scheme.cc:320 +#: open-type-font-scheme.cc:338 open-type-font-scheme.cc:354 +#, c-format +msgid "cannot read %s of `%s'" +msgstr "" + +#: open-type-font-scheme.cc:376 +#, c-format +msgid "font `%s' index %d does not have `CFF' table" +msgstr "" + +#: open-type-font.cc:54 #, c-format msgid "cannot allocate %lu bytes" msgstr "" -#: open-type-font.cc:50 +#: open-type-font.cc:58 #, c-format msgid "cannot load font table: %s" msgstr "" -#: open-type-font.cc:55 +#: open-type-font.cc:63 #, c-format msgid "FreeType error: %s" msgstr "" -#: open-type-font.cc:112 +#: open-type-font.cc:124 #, c-format msgid "unsupported font format: %s" msgstr "" -#: open-type-font.cc:114 +#: open-type-font.cc:126 #, c-format msgid "error reading font file %s: %s" msgstr "" -#: open-type-font.cc:189 +#: open-type-font.cc:141 +msgid "cannot get postscript name" +msgstr "" + +#: open-type-font.cc:153 +#, c-format +msgid "cannot get font %s format" +msgstr "" + +#: open-type-font.cc:176 +#, c-format +msgid "cannot read CFF %s: %s" +msgstr "" + +#. FreeType 2.6 and 2.6.1 cannot get PS name from pure-CFF. +#. (FreeType 2.5.5 and earlier does not have this issue. +#. FreeType 2.6.2+ has this bug fixed.) +#. So we need direct parsing of the 'CFF' table, in this case. +#: open-type-font.cc:193 +#, c-format +msgid "Directly parsing 'CFF' table of font %s." +msgstr "" + +#: open-type-font.cc:232 +#, c-format +msgid "cannot get font %s CFF name" +msgstr "" + +#: open-type-font.cc:237 +#, c-format +msgid "Replace font name from %s to %s." +msgstr "" + +#: open-type-font.cc:316 #, c-format msgid "FT_Get_Glyph_Name () Freetype error: %s" msgstr "" -#: open-type-font.cc:337 pango-font.cc:257 +#: open-type-font.cc:464 pango-font.cc:259 #, c-format msgid "FT_Get_Glyph_Name () error: %s" msgstr "" @@ -2578,16 +2719,16 @@ msgstr "" msgid "best score for this sys-count: %f" msgstr "" -#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:248 -#: paper-score.cc:162 +#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249 +#: paper-score.cc:156 msgid "Drawing systems..." msgstr "" -#: output-def.cc:235 +#: output-def.cc:229 msgid "margins do not fit with line-width, setting default values" msgstr "" -#: output-def.cc:242 +#: output-def.cc:236 msgid "" "systems run off the page due to improper paper settings, setting default " "values" @@ -2610,97 +2751,97 @@ msgstr "" msgid "page %d has been compressed" msgstr "" -#: page-layout-problem.cc:402 +#: page-layout-problem.cc:400 msgid "" "A page layout problem has been initiated that cannot accommodate footnotes." msgstr "" -#: page-layout-problem.cc:731 +#: page-layout-problem.cc:729 msgid "ragged-bottom was specified, but page must be compressed" msgstr "" -#: page-layout-problem.cc:734 +#: page-layout-problem.cc:732 #, c-format msgid "compressing over-full page by %.1f staff-spaces" msgstr "" -#: page-layout-problem.cc:1199 +#: page-layout-problem.cc:1197 msgid "staff-affinities should only decrease" msgstr "" -#: page-turn-page-breaking.cc:168 +#: page-turn-page-breaking.cc:169 #, c-format msgid "page-turn-page-breaking: breaking from %d to %d" msgstr "" -#: page-turn-page-breaking.cc:217 +#: page-turn-page-breaking.cc:218 msgid "" "cannot fit the first page turn onto a single page. Consider setting first-" "page-number to an even number." msgstr "" -#: page-turn-page-breaking.cc:230 +#: page-turn-page-breaking.cc:231 #, c-format msgid "Calculating page and line breaks (%d possible page breaks)..." msgstr "" -#: page-turn-page-breaking.cc:300 +#: page-turn-page-breaking.cc:301 #, c-format msgid "break starting at page %d" msgstr "" -#: page-turn-page-breaking.cc:301 +#: page-turn-page-breaking.cc:302 #, c-format msgid "\tdemerits: %f" msgstr "" -#: page-turn-page-breaking.cc:302 +#: page-turn-page-breaking.cc:303 #, c-format msgid "\tsystem count: %d" msgstr "" -#: page-turn-page-breaking.cc:303 +#: page-turn-page-breaking.cc:304 #, c-format msgid "\tpage count: %d" msgstr "" -#: page-turn-page-breaking.cc:304 +#: page-turn-page-breaking.cc:305 #, c-format msgid "\tprevious break: %d" msgstr "" -#: pango-font.cc:246 +#: pango-font.cc:248 #, c-format msgid "no glyph for character U+%0X in font `%s'" msgstr "" -#: pango-font.cc:273 +#: pango-font.cc:275 #, c-format msgid "" "Glyph has no name, but font supports glyph naming.\n" "Skipping glyph U+%0X, file %s" msgstr "" -#: pango-font.cc:323 +#: pango-font.cc:325 #, c-format msgid "no PostScript font name for font `%s'" msgstr "" -#: pango-font.cc:373 +#: pango-font.cc:375 msgid "FreeType face has no PostScript font name" msgstr "" -#: paper-book.cc:214 +#: paper-book.cc:200 #, c-format msgid "program option -dprint-pages not supported by backend `%s'" msgstr "" -#: paper-book.cc:233 +#: paper-book.cc:219 #, c-format msgid "program option -dpreview not supported by backend `%s'" msgstr "" -#: paper-column-engraver.cc:263 +#: paper-column-engraver.cc:273 msgid "" "forced break was overridden by some other event, should you be using bar " "checks?" @@ -2711,23 +2852,19 @@ msgstr "" msgid "Layout output to `%s'..." msgstr "" -#: paper-score.cc:134 +#: paper-score.cc:128 #, c-format msgid "Element count %d (spanners %d) " msgstr "" -#: paper-score.cc:138 +#: paper-score.cc:132 msgid "Preprocessing graphical objects..." msgstr "" -#: parse-scm.cc:128 +#: parse-scm.cc:124 msgid "GUILE signaled an error for the expression beginning here" msgstr "" -#: partial-iterator.cc:45 -msgid "trying to use \\partial after the start of a piece" -msgstr "" - #: pdf-scheme.cc:65 #, c-format msgid "Conversion of string `%s' to UTF-16be failed: %s" @@ -2737,27 +2874,27 @@ msgstr "" msgid "unterminated percent repeat" msgstr "" -#: performance.cc:54 +#: performance.cc:76 msgid "Track..." msgstr "" -#: performance.cc:82 +#: performance.cc:126 #, c-format msgid "MIDI output to `%s'..." msgstr "" -#: piano-pedal-engraver.cc:279 +#: piano-pedal-engraver.cc:276 #, c-format msgid "expect 3 strings for piano pedals, found: %ld" msgstr "" -#: piano-pedal-engraver.cc:294 piano-pedal-engraver.cc:305 +#: piano-pedal-engraver.cc:291 piano-pedal-engraver.cc:302 #: piano-pedal-performer.cc:104 #, c-format msgid "cannot find start of piano pedal: `%s'" msgstr "" -#: piano-pedal-engraver.cc:340 +#: piano-pedal-engraver.cc:337 #, c-format msgid "cannot find start of piano pedal bracket: `%s'" msgstr "" @@ -2767,7 +2904,7 @@ msgstr "" msgid "no such internal option: %s" msgstr "" -#: property-iterator.cc:100 +#: property-iterator.cc:66 #, c-format msgid "not a grob name, `%s'" msgstr "" @@ -2776,25 +2913,25 @@ msgstr "" msgid "Failed octave check, got: " msgstr "" -#: relocate.cc:52 +#: relocate.cc:56 #, c-format msgid "Setting %s to %s" msgstr "" #. this warning should only be printed in debug mode! -#: relocate.cc:73 +#: relocate.cc:77 #, c-format msgid "no such file: %s for %s" msgstr "" #. this warning should only be printed in debug mode! #. this warning should only be printed in debug mode -#: relocate.cc:84 relocate.cc:102 +#: relocate.cc:88 relocate.cc:106 #, c-format msgid "no such directory: %s for %s" msgstr "" -#: relocate.cc:93 +#: relocate.cc:97 #, c-format msgid "%s=%s (prepend)\n" msgstr "" @@ -2824,115 +2961,111 @@ msgstr "" msgid "Relocation : from cwd: argv0=%s\n" msgstr "" -#: relocate.cc:194 +#: relocate.cc:196 #, c-format msgid "" "Relocation: from PATH=%s\n" "argv0=%s\n" msgstr "" -#: relocate.cc:220 +#: relocate.cc:222 msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR" msgstr "" -#: relocate.cc:345 +#: relocate.cc:347 #, c-format msgid "Relocation file: %s" msgstr "" -#: relocate.cc:349 source-file.cc:65 +#: relocate.cc:351 source-file.cc:65 #, c-format msgid "cannot open file: `%s'" msgstr "" -#: relocate.cc:379 +#: relocate.cc:381 #, c-format msgid "Unknown relocation command %s" msgstr "" -#: rest-collision-engraver.cc:70 -msgid "rhythmic head is not part of a rhythmic column" -msgstr "" - -#: rest-collision.cc:150 +#: rest-collision.cc:154 msgid "cannot resolve rest collision: rest direction not set" msgstr "" -#: rest-collision.cc:161 rest-collision.cc:270 +#: rest-collision.cc:165 rest-collision.cc:274 msgid "too many colliding rests" msgstr "" -#: rest.cc:240 +#: rest.cc:239 #, c-format msgid "rest `%s' not found" msgstr "" -#: score-engraver.cc:78 +#: score-engraver.cc:79 #, c-format msgid "cannot find `%s'" msgstr "" -#: score-engraver.cc:80 +#: score-engraver.cc:81 msgid "Music font has not been installed properly." msgstr "" -#: score-engraver.cc:82 +#: score-engraver.cc:83 #, c-format msgid "Search path `%s'" msgstr "" -#: score-engraver.cc:84 +#: score-engraver.cc:85 msgid "Aborting" msgstr "" -#: score.cc:172 +#: score.cc:161 msgid "already have music in score" msgstr "" -#: score.cc:173 +#: score.cc:163 msgid "this is the previous music" msgstr "" -#: score.cc:178 +#: score.cc:169 msgid "errors found, ignoring music expression" msgstr "" #. FIXME: -#: script-engraver.cc:115 +#: script-engraver.cc:114 msgid "do not know how to interpret articulation:" msgstr "" -#: script-engraver.cc:116 +#: script-engraver.cc:115 msgid " scheme encoding: " msgstr "" -#: skyline-pair.cc:160 +#: skyline-pair.cc:135 msgid "direction must not be CENTER in ly:skyline-pair::skyline" msgstr "" -#: slur-proto-engraver.cc:51 +#: slur-engraver.cc:121 #, c-format msgid "direction of %s invalid: %d" msgstr "" #. We already have an old slur, so give a warning #. and completely ignore the new slur. -#: slur-proto-engraver.cc:166 +#: slur-engraver.cc:238 #, c-format msgid "already have %s" msgstr "" -#: slur-proto-engraver.cc:183 +#: slur-engraver.cc:255 #, c-format msgid "%s without a cause" msgstr "" -#: slur-proto-engraver.cc:244 +#: slur-engraver.cc:322 #, c-format msgid "cannot end %s" msgstr "" -#: slur.cc:434 +#: slur.cc:431 #, c-format msgid "Ignoring grob for slur: %s. avoid-slur not set?" msgstr "" @@ -2942,24 +3075,24 @@ msgstr "" msgid "expected to read %d characters, got %d" msgstr "" -#: staff-performer.cc:301 +#: staff-performer.cc:307 msgid "MIDI channel wrapped around" msgstr "" -#: staff-performer.cc:302 +#: staff-performer.cc:308 msgid "remapping modulo 16" msgstr "" -#: stem-engraver.cc:110 +#: stem-engraver.cc:100 msgid "tremolo duration is too long" msgstr "" -#: stem-engraver.cc:162 +#: stem-engraver.cc:152 #, c-format msgid "adding note head to incompatible stem (type = %d/%d)" msgstr "" -#: stem-engraver.cc:165 +#: stem-engraver.cc:155 msgid "maybe input should specify polyphonic voices" msgstr "" @@ -2967,45 +3100,39 @@ msgstr "" msgid "weird stem size, check for narrow beams" msgstr "" -#: system.cc:201 +#: system.cc:195 #, c-format msgid "Element count %d" msgstr "" -#: system.cc:512 +#: system.cc:506 #, c-format msgid "Grob count %d" msgstr "" #. TODO: Also print the arguments of the markup! -#: text-interface.cc:129 -#, c-format -msgid "Cyclic markup detected: %s" -msgstr "" - -#. TODO: Also print the arguments of the markup! -#: text-interface.cc:142 +#: text-interface.cc:139 #, c-format msgid "Markup depth exceeds maximal value of %d; Markup: %s" msgstr "" -#: text-spanner-engraver.cc:72 +#: text-spanner-engraver.cc:71 msgid "cannot find start of text spanner" msgstr "" -#: text-spanner-engraver.cc:85 +#: text-spanner-engraver.cc:84 msgid "already have a text spanner" msgstr "" -#: text-spanner-engraver.cc:130 +#: text-spanner-engraver.cc:131 msgid "unterminated text spanner" msgstr "" -#: tie-engraver.cc:119 +#: tie-engraver.cc:120 msgid "unterminated tie" msgstr "" -#: tie-engraver.cc:353 +#: tie-engraver.cc:376 msgid "lonely tie" msgstr "" @@ -3014,19 +3141,12 @@ msgstr "" #. #. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. #. -#: time-signature-engraver.cc:75 +#: time-signature-engraver.cc:94 #, c-format msgid "strange time signature found: %d/%d" msgstr "" -#. If there is no such symbol, we default to the numbered style. -#. (Here really with a warning!) -#: time-signature.cc:89 -#, c-format -msgid "time signature symbol `%s' not found; reverting to numbered style" -msgstr "" - -#: translator-ctors.cc:65 +#: translator-ctors.cc:70 #, c-format msgid "unknown translator: `%s'" msgstr "" @@ -3036,54 +3156,45 @@ msgstr "" msgid "fatal error. Couldn't find type: %s" msgstr "" -#: translator-group.cc:188 +#: translator-group.cc:185 #, c-format msgid "cannot find: `%s'" msgstr "" -#: translator.cc:326 +#: translator.cc:305 #, c-format msgid "Two simultaneous %s events, junking this one" msgstr "" -#: translator.cc:327 +#: translator.cc:306 #, c-format msgid "Previous %s event here" msgstr "" -#: ttf.cc:480 ttf.cc:528 -#, c-format -msgid "font index %d too large for font `%s', using index 0" -msgstr "" - -#: ttf.cc:512 ttf.cc:562 -msgid "font index must be non-negative, using index 0" -msgstr "" - -#: tuplet-engraver.cc:110 +#: tuplet-engraver.cc:109 msgid "No tuplet to end" msgstr "" -#: vaticana-ligature-engraver.cc:400 +#: vaticana-ligature-engraver.cc:384 #, c-format msgid "" "ignored prefix(es) `%s' of this head according to restrictions of the " "selected ligature style" msgstr "" -#: vaticana-ligature-engraver.cc:466 +#: vaticana-ligature-engraver.cc:450 msgid "" "Ambiguous use of dots in ligature: there are multiple dotted notes with the " "same pitch. The ligature should be split." msgstr "" -#: vaticana-ligature-engraver.cc:524 +#: vaticana-ligature-engraver.cc:508 msgid "" "This ligature has a dotted head followed by a non-dotted head. The ligature " "should be split after the last dotted head before this head." msgstr "" -#: vaticana-ligature-engraver.cc:736 +#: vaticana-ligature-engraver.cc:720 #, c-format msgid "Vaticana_ligature_engraver: setting `spacing-increment = %f': ptr =%ul" msgstr "" @@ -3096,7 +3207,7 @@ msgstr "" msgid "ascending vaticana style flexa" msgstr "" -#: vertical-align-engraver.cc:95 +#: vertical-align-engraver.cc:100 msgid "Ignoring Vertical_align_engraver in VerticalAxisGroup" msgstr "" @@ -3117,205 +3228,218 @@ msgstr "" msgid "giving up" msgstr "" -#: parser.yy:158 parser.yy:172 -msgid "Too much lookahead" -msgstr "" - -#: parser.yy:452 parser.yy:772 parser.yy:842 +#: parser.yy:483 parser.yy:650 parser.yy:989 parser.yy:1070 parser.yy:1306 msgid "bad expression type" msgstr "" -#: parser.yy:666 parser.yy:1225 +#: parser.yy:902 parser.yy:1514 parser.yy:1583 msgid "not a context mod" msgstr "" -#: parser.yy:885 parser.yy:935 +#: parser.yy:983 parser.yy:1062 parser.yy:1214 +msgid "need \\paper for paper block" +msgstr "" + +#: parser.yy:1096 +msgid "Missing music in \\score" +msgstr "" + +#: parser.yy:1133 msgid "\\paper cannot be used in \\score, use \\layout instead" msgstr "" -#: parser.yy:921 -msgid "score expected" +#: parser.yy:1184 +msgid "Spurious expression in \\score" msgstr "" -#: parser.yy:959 -msgid "need \\paper for paper block" +#: parser.yy:1388 +msgid "music expected" msgstr "" -#: parser.yy:1099 parser.yy:1121 +#: parser.yy:1398 parser.yy:1432 msgid "unexpected post-event" msgstr "" -#: parser.yy:1129 +#: parser.yy:1440 msgid "Ignoring non-music expression" msgstr "" -#: parser.yy:1141 parser.yy:2559 -msgid "music expected" -msgstr "" - -#: parser.yy:1436 -msgid "not a symbol" +#: parser.yy:1763 parser.yy:1782 +msgid "not a key" msgstr "" -#: parser.yy:2248 parser.yy:2362 parser.yy:2375 parser.yy:2384 +#: parser.yy:2642 parser.yy:2760 parser.yy:2773 parser.yy:2782 msgid "bad grob property path" msgstr "" -#: parser.yy:2342 +#: parser.yy:2740 msgid "only \\consists and \\remove take non-string argument." msgstr "" -#: parser.yy:2403 +#: parser.yy:2801 msgid "bad context property path" msgstr "" -#: parser.yy:2504 +#: parser.yy:2886 +msgid "markup expected" +msgstr "" + +#: parser.yy:2898 msgid "simple string expected" msgstr "" -#: parser.yy:2522 +#: parser.yy:2915 msgid "symbol expected" msgstr "" -#: parser.yy:2677 +#: parser.yy:3059 msgid "not a rhythmic event" msgstr "" -#: parser.yy:2752 +#: parser.yy:3109 msgid "post-event expected" msgstr "" -#: parser.yy:2761 parser.yy:2766 +#: parser.yy:3118 parser.yy:3123 msgid "have to be in Lyric mode for lyrics" msgstr "" -#: parser.yy:2834 -msgid "expecting string as script definition" +#: parser.yy:3199 +msgid "expecting string or post-event as script definition" msgstr "" -#: parser.yy:2942 +#: parser.yy:3303 msgid "not an articulation" msgstr "" -#: parser.yy:3014 parser.yy:3057 +#: parser.yy:3369 parser.yy:3421 msgid "not a duration" msgstr "" -#: parser.yy:3074 +#: parser.yy:3442 msgid "bass number expected" msgstr "" -#: parser.yy:3173 +#: parser.yy:3534 msgid "have to be in Note mode for notes" msgstr "" -#: parser.yy:3233 +#: parser.yy:3573 msgid "have to be in Chord mode for chords" msgstr "" -#: parser.yy:3248 +#: parser.yy:3616 msgid "markup outside of text script or \\lyricmode" msgstr "" -#: parser.yy:3253 +#: parser.yy:3621 msgid "unrecognized string, not in text script or \\lyricmode" msgstr "" -#: parser.yy:3414 parser.yy:3423 +#: parser.yy:3773 parser.yy:3782 msgid "not an unsigned integer" msgstr "" -#: parser.yy:3491 +#: parser.yy:3869 msgid "not a markup" msgstr "" -#: lexer.ll:224 +#: lexer.ll:193 msgid "stray UTF-8 BOM encountered" msgstr "" -#: lexer.ll:227 +#: lexer.ll:196 msgid "Skipping UTF-8 BOM" msgstr "" -#: lexer.ll:279 +#: lexer.ll:248 #, c-format msgid "Renaming input to: `%s'" msgstr "" -#: lexer.ll:296 +#: lexer.ll:265 msgid "quoted string expected after \\version" msgstr "" -#: lexer.ll:300 +#: lexer.ll:269 msgid "quoted string expected after \\sourcefilename" msgstr "" -#: lexer.ll:304 +#: lexer.ll:273 msgid "integer expected after \\sourcefileline" msgstr "" -#: lexer.ll:331 +#: lexer.ll:300 msgid "\\maininput not allowed outside init files" msgstr "" -#: lexer.ll:355 +#: lexer.ll:324 #, c-format msgid "wrong or undefined identifier: `%s'" msgstr "" -#: lexer.ll:380 +#: lexer.ll:349 msgid "string expected after \\include" msgstr "" -#: lexer.ll:390 +#: lexer.ll:359 msgid "end quote missing" msgstr "" -#: lexer.ll:741 +#: lexer.ll:714 msgid "EOF found inside a comment" msgstr "" -#: lexer.ll:746 +#: lexer.ll:719 msgid "EOF found inside string" msgstr "" -#: lexer.ll:761 +#: lexer.ll:734 msgid "Unfinished main input" msgstr "" -#: lexer.ll:832 +#: lexer.ll:805 #, c-format msgid "invalid character: `%s'" msgstr "" -#: lexer.ll:961 +#: lexer.ll:925 #, c-format msgid "unknown escaped string: `\\%s'" msgstr "" -#: lexer.ll:981 +#: lexer.ll:945 #, c-format msgid "undefined character or shorthand: %s" msgstr "" -#: lexer.ll:1273 +#: lexer.ll:1236 msgid "non-UTF-8 input" msgstr "" -#: lexer.ll:1317 +#: lexer.ll:1280 +#, c-format +msgid "Invalid version string \"%s\"" +msgstr "" + +#: lexer.ll:1285 #, c-format msgid "file too old: %s (oldest supported: %s)" msgstr "" -#: lexer.ll:1318 +#: lexer.ll:1286 msgid "consider updating the input with the convert-ly script" msgstr "" -#: lexer.ll:1324 +#: lexer.ll:1292 #, c-format msgid "program too old: %s (file requires: %s)" msgstr "" +#: auto-beam.scm:147 +msgid "Beam end fits no pattern" +msgstr "" + #: backend-library.scm:27 #, scheme-format msgid "Invoking `~a'..." @@ -3326,217 +3450,256 @@ msgstr "" msgid "`~a' failed (~a)\n" msgstr "" -#: backend-library.scm:93 +#: backend-library.scm:108 #, scheme-format msgid "Converting to `~a'...\n" msgstr "" #. Do not try to guess the name of the png file, #. GS produces PNG files like BASE-page%d.png. -#: backend-library.scm:102 +#: backend-library.scm:118 #, scheme-format msgid "Converting to ~a..." msgstr "" -#: backend-library.scm:140 +#: backend-library.scm:134 +#, scheme-format +msgid "Copying to `~a'...\n" +msgstr "" + +#: backend-library.scm:200 +#, scheme-format +msgid "Deleting `~a'...\n" +msgstr "" + +#: backend-library.scm:219 #, scheme-format msgid "Writing header field `~a' to `~a'..." msgstr "" -#: backend-library.scm:189 +#: backend-library.scm:268 #, scheme-format msgid "missing stencil expression `~S'" msgstr "" -#: bar-line.scm:133 +#: bar-line.scm:142 #, scheme-format msgid "Bar glyph ~a not known. Ignoring." msgstr "" -#: bar-line.scm:161 +#: bar-line.scm:170 #, scheme-format msgid "" "Annotation '~a' is allowed in the first argument of a bar line definition " "only." msgstr "" -#: bar-line.scm:169 +#: bar-line.scm:178 #, scheme-format msgid "" "Replacement '~a' is allowed in the last argument of a bar line definition " "only." msgstr "" -#: bar-line.scm:230 +#: bar-line.scm:239 #, scheme-format msgid "" "add-bar-glyph-print-procedure: glyph '~a' has to be a single ASCII character." msgstr "" -#: bar-line.scm:795 +#: bar-line.scm:807 #, scheme-format msgid "No span bar glyph defined for bar glyph '~a'; ignoring." msgstr "" -#: chord-entry.scm:52 +#: chord-entry.scm:57 #, scheme-format msgid "Spurious garbage following chord: ~A" msgstr "" #: define-context-properties.scm:31 define-grob-properties.scm:21 -#: define-music-properties.scm:21 +#: define-music-properties.scm:21 lily.scm:102 #, scheme-format msgid "symbol ~S redefined" msgstr "" -#: define-event-classes.scm:73 +#: define-event-classes.scm:74 #, scheme-format msgid "unknown parent class `~a'" msgstr "" -#: define-event-classes.scm:107 +#: define-event-classes.scm:108 #, scheme-format msgid "Cannot redefine event class `~S'" msgstr "" -#: define-event-classes.scm:109 +#: define-event-classes.scm:110 #, scheme-format msgid "Undefined parent event class `~S'" msgstr "" -#: define-markup-commands.scm:1087 +#: define-markup-commands.scm:1272 msgid "no systems found in \\score markup, does it have a \\layout block?" msgstr "" -#: define-markup-commands.scm:2851 +#: define-markup-commands.scm:3122 #, scheme-format msgid "Cannot find glyph ~a" msgstr "" -#: define-markup-commands.scm:3277 +#: define-markup-commands.scm:3598 #, scheme-format msgid "no brace found for point size ~S " msgstr "" -#: define-markup-commands.scm:3278 +#: define-markup-commands.scm:3599 #, scheme-format msgid "defaulting to ~S pt" msgstr "" -#: define-markup-commands.scm:3530 +#: define-markup-commands.scm:3857 #, scheme-format msgid "not a valid duration string: ~a" msgstr "" -#: define-markup-commands.scm:3741 +#: define-markup-commands.scm:4070 #, scheme-format msgid "not a valid duration string: ~a - ignoring" msgstr "" -#: define-music-types.scm:792 +#: define-music-types.scm:798 #, scheme-format msgid "symbol expected: ~S" msgstr "" -#: define-music-types.scm:795 +#: define-music-types.scm:801 #, scheme-format msgid "cannot find music object: ~S" msgstr "" -#: define-music-types.scm:815 +#: define-music-types.scm:821 #, scheme-format msgid "bad make-music argument: ~S" msgstr "" -#: define-music-types.scm:827 -#, scheme-format -msgid "unknown repeat type `~S'" -msgstr "" - -#: define-music-types.scm:828 -msgid "See define-music-types.scm for supported repeats" -msgstr "" - -#: define-note-names.scm:972 +#: define-note-names.scm:1112 msgid "Select note names language." msgstr "" -#: define-note-names.scm:978 +#: define-note-names.scm:1118 #, scheme-format msgid "Using `~a' note names..." msgstr "" -#: define-note-names.scm:981 +#: define-note-names.scm:1121 #, scheme-format msgid "Could not find language `~a'. Ignoring." msgstr "" -#: document-backend.scm:132 +#: document-backend.scm:135 #, scheme-format msgid "pair expected in doc ~s" msgstr "" -#: document-backend.scm:189 +#: document-backend.scm:202 #, scheme-format msgid "cannot find interface for property: ~S" msgstr "" -#: document-backend.scm:199 +#: document-backend.scm:212 #, scheme-format msgid "unknown Grob interface: ~S" msgstr "" -#: documentation-lib.scm:59 +#: documentation-lib.scm:62 #, scheme-format msgid "Processing ~S..." msgstr "" -#: documentation-lib.scm:176 +#: documentation-lib.scm:178 #, scheme-format msgid "Writing ~S..." msgstr "" -#: documentation-lib.scm:188 +#: documentation-lib.scm:190 #, scheme-format msgid "cannot find description for property `~S' (~S)" msgstr "" -#: documentation-lib.scm:209 +#: documentation-lib.scm:211 #, scheme-format msgid "cannot find description for property ~S (~S)" msgstr "" -#: flag-styles.scm:162 +#: flag-styles.scm:155 #, scheme-format msgid "flag stroke `~a' or `~a' not found" msgstr "" -#: framework-eps.scm:108 +#: framework-eps.scm:112 #, scheme-format msgid "Writing ~a..." msgstr "" -#: framework-ps.scm:251 +#: framework-ps.scm:259 +#, scheme-format +msgid "CFF font `~a' already embedded, skipping." +msgstr "" + +#: framework-ps.scm:262 +#, scheme-format +msgid "" +"Different CFF fonts which have the same name `~a' has been detected. The " +"font cannot be embedded." +msgstr "" + +#: framework-ps.scm:267 +#, scheme-format +msgid "Embedding CFF font `~a'" +msgstr "" + +#: framework-ps.scm:317 +#, scheme-format +msgid "" +"Font ~a cannot be loaded via Ghostscript because its font-index (~a) is not " +"zero." +msgstr "" + +#: framework-ps.scm:323 +#, scheme-format +msgid "" +"Font ~a cannot be loaded via Ghostscript because it is an OpenType/CFF (OTC) " +"font." +msgstr "" + +#: framework-ps.scm:329 +#, scheme-format +msgid "" +"Font ~a cannot be used via Ghostscript because it is a TrueType font that " +"does not have glyph names." +msgstr "" + +#: framework-ps.scm:343 #, scheme-format msgid "cannot embed ~S=~S" msgstr "" -#: framework-ps.scm:294 +#: framework-ps.scm:386 #, scheme-format msgid "cannot extract file matching ~a from ~a" msgstr "" -#: framework-ps.scm:312 +#: framework-ps.scm:403 #, scheme-format msgid "do not know how to embed ~S=~S" msgstr "" -#: framework-ps.scm:337 +#: framework-ps.scm:428 #, scheme-format msgid "do not know how to embed font ~s ~s ~s" msgstr "" -#: framework-ps.scm:688 +#: framework-ps.scm:810 msgid "" "\n" "The PostScript backend does not support the\n" @@ -3544,7 +3707,7 @@ msgid "" "\n" " lilypond -dbackend=eps FILE\n" "\n" -"If have cut & pasted a lilypond fragment from a webpage, be sure\n" +"If you have cut & pasted a lilypond fragment from a webpage, be sure\n" "to only remove anything before\n" "\n" " %% ****************************************************************\n" @@ -3585,94 +3748,89 @@ msgstr "" msgid "Music unsuitable for output-def" msgstr "" -#: lily-library.scm:884 +#: lily-library.scm:920 msgid "" "Find the index between @var{start} and @var{end} (an integer)\n" "which produces the closest match to @var{target-val} if\n" "applied to function @var{getter}." msgstr "" -#: lily-library.scm:955 +#: lily-library.scm:1014 #, scheme-format msgid "unknown unit: ~S" msgstr "" -#: lily-library.scm:980 +#: lily-library.scm:1039 #, scheme-format msgid "no \\version statement found, please add~afor future compatibility" msgstr "" -#: lily.scm:75 +#: lily.scm:94 msgid "call-after-session used after session start" msgstr "" -#: lily.scm:93 +#: lily.scm:99 msgid "define-session used after session start" msgstr "" -#: lily.scm:399 +#: lily.scm:444 msgid "Using (ice-9 curried-definitions) module\n" msgstr "" -#: lily.scm:402 +#: lily.scm:447 msgid "Guile 1.8\n" msgstr "" -#: lily.scm:461 +#: lily.scm:504 #, scheme-format msgid "cannot find: ~A" msgstr "" -#: lily.scm:884 +#: lily.scm:934 msgid "Success: compilation successfully completed" msgstr "" -#: lily.scm:885 +#: lily.scm:935 msgid "Compilation completed with warnings or errors" msgstr "" -#: lily.scm:946 +#: lily.scm:996 #, scheme-format msgid "job ~a terminated with signal: ~a" msgstr "" -#: lily.scm:949 +#: lily.scm:999 #, scheme-format msgid "" "logfile ~a (exit ~a):\n" "~a" msgstr "" -#: lily.scm:971 lily.scm:1060 +#: lily.scm:1021 lily.scm:1110 #, scheme-format msgid "failed files: ~S" msgstr "" -#: lily.scm:1051 +#: lily.scm:1101 #, scheme-format msgid "Redirecting output to ~a..." msgstr "" -#: lily.scm:1070 ps-to-png.scm:66 +#: lily.scm:1120 #, scheme-format msgid "Invoking `~a'...\n" msgstr "" -#: ly-syntax-constructors.scm:66 +#: ly-syntax-constructors.scm:27 #, scheme-format msgid "~a function cannot return ~a" msgstr "" -#: ly-syntax-constructors.scm:75 +#: ly-syntax-constructors.scm:60 #, scheme-format msgid "wrong type for argument ~a. Expecting ~a, found ~s" msgstr "" -#: ly-syntax-constructors.scm:199 -#, scheme-format -msgid "Invalid property operation ~a" -msgstr "" - #: markup-macros.scm:331 #, scheme-format msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" @@ -3712,62 +3870,87 @@ msgstr "" msgid "negative replication count; ignoring" msgstr "" -#: music-functions.scm:273 -msgid "More alternatives than repeats. Junking excess alternatives" +#: music-functions.scm:319 +#, scheme-format +msgid "invalid tremolo repeat count: ~a" msgstr "" -#: music-functions.scm:304 +#: music-functions.scm:348 #, scheme-format -msgid "invalid tremolo repeat count: ~a" +msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo" +msgstr "" + +#: music-functions.scm:352 +msgid "More alternatives than repeats. Junking excess alternatives" msgstr "" -#: music-functions.scm:480 +#: music-functions.scm:487 #, scheme-format msgid "bad grob property path ~a" msgstr "" -#: music-functions.scm:774 +#: music-functions.scm:511 +#, scheme-format +msgid "bad context property ~a" +msgstr "" + +#: music-functions.scm:534 +#, scheme-format +msgid "bad music property ~a" +msgstr "" + +#: music-functions.scm:842 msgid "Bad chord repetition" msgstr "" -#: music-functions.scm:809 +#: music-functions.scm:947 #, scheme-format msgid "music expected: ~S" msgstr "" -#: music-functions.scm:1165 +#: music-functions.scm:1297 #, scheme-format msgid "cannot find quoted music: `~S'" msgstr "" -#: music-functions.scm:1303 +#: music-functions.scm:1434 msgid "Add @var{octave-shift} to the octave of @var{pitch}." msgstr "" -#: music-functions.scm:1363 +#: music-functions.scm:1497 #, scheme-format msgid "Unknown octaveness type: ~S " msgstr "" -#: music-functions.scm:1364 +#: music-functions.scm:1498 msgid "Defaulting to 'any-octave." msgstr "" -#: music-functions.scm:1709 +#: music-functions.scm:1872 #, scheme-format msgid "unknown accidental style: ~S" msgstr "" -#: music-functions.scm:1927 +#: music-functions.scm:2097 msgid "Missing duration" msgstr "" -#: output-ps.scm:278 output-svg.scm:539 +#: music-functions.scm:2633 +#, scheme-format +msgid "not a symbol list: ~a" +msgstr "" + +#: music-functions.scm:2636 +#, scheme-format +msgid "conflicting tag group ~a" +msgstr "" + +#: output-ps.scm:290 output-svg.scm:539 #, scheme-format msgid "unknown line-cap-style: ~S" msgstr "" -#: output-ps.scm:283 output-svg.scm:545 +#: output-ps.scm:295 output-svg.scm:545 #, scheme-format msgid "unknown line-join-style: ~S" msgstr "" @@ -3786,48 +3969,53 @@ msgstr "" msgid "cannot find SVG font ~S" msgstr "" -#: paper.scm:120 +#: paper.scm:121 msgid "set-global-staff-size: not in toplevel scope" msgstr "" -#: paper.scm:320 +#: paper.scm:321 #, scheme-format msgid "This is not a \\layout {} object, ~S" msgstr "" -#: paper.scm:328 +#: paper.scm:329 #, scheme-format msgid "Unknown paper size: ~a" msgstr "" #. TODO: should raise (generic) exception with throw, and catch #. that in parse-scm.cc -#: paper.scm:347 +#: paper.scm:348 msgid "Must use #(set-paper-size .. ) within \\paper { ... }" msgstr "" -#: parser-clef.scm:164 +#: parser-clef.scm:154 #, scheme-format msgid "unknown clef type `~a'" msgstr "" -#: parser-clef.scm:165 +#: parser-clef.scm:155 #, scheme-format msgid "supported clefs: ~a" msgstr "" -#: parser-ly-from-scheme.scm:74 +#: parser-ly-from-scheme.scm:73 msgid "error in #{ ... #}" msgstr "" -#: part-combiner.scm:607 +#: part-combiner.scm:931 #, scheme-format msgid "quoted music `~a' is empty" msgstr "" -#: ps-to-png.scm:70 +#: ps-to-png.scm:72 ps-to-png.scm:75 +#, scheme-format +msgid "Copying `~a' to `~a'..." +msgstr "" + +#: ps-to-png.scm:77 ps-to-png.scm:79 #, scheme-format -msgid "~a exited with status: ~S" +msgid "Deleting `~a'..." msgstr "" #: to-xml.scm:190 @@ -3835,40 +4023,40 @@ msgstr "" msgid "assertion failed: ~S" msgstr "" -#: translation-functions.scm:368 +#: translation-functions.scm:379 #, scheme-format msgid "Negative fret for pitch ~a on string ~a" msgstr "" -#: translation-functions.scm:371 +#: translation-functions.scm:384 #, scheme-format msgid "Missing fret for pitch ~a on string ~a" msgstr "" -#: translation-functions.scm:414 +#: translation-functions.scm:427 #, scheme-format msgid "No open string for pitch ~a" msgstr "" -#: translation-functions.scm:429 translation-functions.scm:441 +#: translation-functions.scm:442 translation-functions.scm:454 #, scheme-format msgid "Requested string for pitch requires negative fret: string ~a pitch ~a" msgstr "" -#: translation-functions.scm:432 +#: translation-functions.scm:445 msgid "Ignoring string request and recalculating." msgstr "" -#: translation-functions.scm:444 +#: translation-functions.scm:457 msgid "Ignoring note in tablature." msgstr "" -#: translation-functions.scm:469 +#: translation-functions.scm:482 #, scheme-format msgid "No string for pitch ~a (given frets ~a)" msgstr "" -#: translation-functions.scm:574 +#: translation-functions.scm:598 #, scheme-format msgid "" "No label for fret ~a (on string ~a);\n" diff --git a/po/nl.po b/po/nl.po index 0f1f35fa7c..7ded65cbf3 100644 --- a/po/nl.po +++ b/po/nl.po @@ -1,26 +1,26 @@ # Dutch translations for GNU Lilypond. -# Copyright (C) 2013 Free Software Foundation, Inc. +# Copyright (C) 2016 Free Software Foundation, Inc. # This file is distributed under the same license as the lilypond package. # -# "Occasionally it troubles me just how far one strays -# from the normal measures of civility." +# "Dear future, gone fishing." # # Han-Wen Nienhuys , 1998. # Jan Nieuwenhuizen , 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007. -# Benno Schulenberg , 2013. +# Benno Schulenberg , 2013, 2015, 2016. +# Frans Spiesschaert , 2015, 2016 msgid "" msgstr "" -"Project-Id-Version: lilypond 2.17.96\n" +"Project-Id-Version: lilypond 2.19.26\n" "Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs\n" -"POT-Creation-Date: 2013-11-24 12:14+0000\n" -"PO-Revision-Date: 2013-11-27 22:28+0100\n" +"POT-Creation-Date: 2015-08-27 10:48+0100\n" +"PO-Revision-Date: 2016-01-17 16:37+0100\n" "Last-Translator: Benno Schulenberg \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Lokalize 1.0\n" +"X-Generator: Lokalize 1.5\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: book_base.py:26 @@ -40,21 +40,25 @@ msgstr "kan \\begin{document} niet vinden in LaTeX-document" #, python-format msgid "Running `%s' on file `%s' to detect default page settings.\n" msgstr "" +"'%s' wordt op bestand '%s' uitgevoerd\n" +"om de standaard paginaopmaak te achterhalen.\n" -#: book_latex.py:212 book_texinfo.py:228 +#: book_latex.py:219 book_texinfo.py:228 msgid "Unable to auto-detect default settings:\n" -msgstr "" +msgstr "Kan de standaardinstellingen niet automatisch achterhalen:\n" -#: book_latex.py:224 book_texinfo.py:240 +#: book_latex.py:231 book_texinfo.py:240 #, python-format msgid "" "Unable to auto-detect default settings:\n" "%s" msgstr "" +"Kan de standaardinstellingen niet automatisch achterhalen:\n" +"%s" -#: book_latex.py:247 +#: book_latex.py:254 msgid "cannot detect textwidth from LaTeX" -msgstr "" +msgstr "kan de tekstbreedte in LaTeX niet achterhalen" #: book_snippets.py:406 #, python-format @@ -64,7 +68,7 @@ msgstr "verouderde ly-optie gebruikt: %s=%s" #: book_snippets.py:408 #, python-format msgid "compatibility mode translation: %s=%s" -msgstr "compatibiliteitsmodus-vertaling: %s=%s" +msgstr "vertaling vanwege compatibiliteitsmodus: %s=%s" #: book_snippets.py:411 #, python-format @@ -74,7 +78,7 @@ msgstr "verouderde ly-optie gebruikt: %s" #: book_snippets.py:413 #, python-format msgid "compatibility mode translation: %s" -msgstr "compatibiliteitsmodus-vertaling: %s" +msgstr "vertaling vanwege compatibiliteitsmodus: %s" #: book_snippets.py:530 #, python-format @@ -86,44 +90,48 @@ msgstr "negeren van onbekende ly-optie: %s" msgid "Missing files: %s" msgstr "Ontbrekende bestanden: %s" -#: book_snippets.py:651 +#: book_snippets.py:661 #, python-format msgid "Could not overwrite file %s" -msgstr "Kan bestand %s niet overschrijven" +msgstr "Kan bestand %s niet overschrijven" -#: book_snippets.py:738 +#: book_snippets.py:748 #, python-format msgid "Running through filter `%s'" -msgstr "" +msgstr "Toepassen van filter '%s'" -#: book_snippets.py:759 +#: book_snippets.py:769 #, python-format msgid "`%s' failed (%d)" msgstr "'%s' is mislukt (%d)" -#: book_snippets.py:760 +#: book_snippets.py:770 msgid "The error log is as follows:" -msgstr "De foutlog is als volgt:" +msgstr "Het foutenlogbestand zegt het volgende:" # lisp-format -#: book_snippets.py:880 +#: book_snippets.py:890 #, python-format msgid "Converting MusicXML file `%s'...\n" msgstr "Converteren van MusicXML-bestand '%s'...\n" -#: book_snippets.py:907 +#: book_snippets.py:917 #, python-format msgid "" "%s: duplicate filename but different contents of original file,\n" "printing diff against existing file." msgstr "" +"%s: zelfde bestandsnaam maar andere inhoud dan het originele bestand;\n" +"verschil met bestaand bestand wordt weergegeven." -#: book_snippets.py:920 +#: book_snippets.py:930 #, python-format msgid "" "%s: duplicate filename but different contents of converted lilypond file,\n" "printing diff against existing file." msgstr "" +"%s: zelfde bestandsnaam maar andere inhoud dan het geconverteerde\n" +"lilypond-bestand; verschil met bestaand bestand wordt weergegeven." #. Work around a texi2pdf bug: if LANG=C is not given, a broken regexp is #. used to detect relative/absolute paths, so the absolute path is not @@ -131,7 +139,7 @@ msgstr "" #: book_texinfo.py:206 #, python-format msgid "Running texi2pdf on file %s to detect default page settings.\n" -msgstr "" +msgstr "Op bestand %s wordt texi2pdf uitgevoerd om de standaardinstellingen te achterhalen.\n" #: convertrules.py:13 #, python-format @@ -140,7 +148,7 @@ msgstr "Niet slim genoeg om %s te converteren." #: convertrules.py:14 msgid "Please refer to the manual for details, and update manually." -msgstr "Zie de handleiding voor de details, en actualiseer handmatig." +msgstr "Raadpleeg de handleiding voor de details, en actualiseer handmatig." #: convertrules.py:15 #, python-format @@ -154,7 +162,7 @@ msgstr "waarschuwing: %s" #: convertrules.py:50 convertrules.py:95 msgid "\\header { key = concat + with + operator }" -msgstr "" +msgstr "\\header { sleutel = aaneenschakeling + met + operator }" #: convertrules.py:57 #, python-format @@ -163,17 +171,17 @@ msgstr "verouderde %s" #: convertrules.py:66 msgid "deprecated \\textstyle, new \\key syntax" -msgstr "" +msgstr "de syntax \\textstyle is verouderd; \\key is de nieuwe syntax" #: convertrules.py:82 convertrules.py:1856 convertrules.py:2032 #: convertrules.py:2175 convertrules.py:2506 convertrules.py:2801 -#: convertrules.py:3151 convertrules.py:3385 +#: convertrules.py:3151 convertrules.py:3388 convertrules.py:3700 msgid "bump version for release" -msgstr "" +msgstr "voor uitgave de versie verhogen" #: convertrules.py:98 msgid "new \\header format" -msgstr "" +msgstr "nieuwe indeling van \\header" #: convertrules.py:125 msgid "\\translator syntax" @@ -181,47 +189,47 @@ msgstr "syntax van \\translator" #: convertrules.py:176 msgid "\\repeat NUM Music Alternative -> \\repeat FOLDSTR Music Alternative" -msgstr "" +msgstr "\\repeat NUM Muziek Alternatief -> \\repeat FOLDSTR Muziek Alternatief" #: convertrules.py:206 convertrules.py:679 convertrules.py:1351 #: convertrules.py:2318 #, python-format msgid "deprecate %s" -msgstr "" +msgstr "%s als verouderd aanmerken" #: convertrules.py:280 #, python-format msgid "deprecate %s " -msgstr "" +msgstr "%s als verouderd aanmerken " #: convertrules.py:306 msgid "new \\notenames format" -msgstr "" +msgstr "nieuwe indeling voor \\notenames" #: convertrules.py:322 msgid "new tremolo format" -msgstr "" +msgstr "nieuwe indeling voor tremolo" #: convertrules.py:326 msgid "Staff_margin_engraver deprecated, use Instrument_name_engraver" -msgstr "" +msgstr "Staff_margin_engraver is verouderd; gebruik Instrument_name_engraver" #: convertrules.py:377 msgid "change property definition case (eg. onevoice -> oneVoice)" -msgstr "" +msgstr "schrijfwijze van eigenschap wijzigen (bijv. onevoice -> oneVoice)" #: convertrules.py:438 msgid "new \\textscript markup text" -msgstr "" +msgstr "nieuwe markeringstekst in \\textscript" #: convertrules.py:510 #, python-format msgid "identifier names: %s" -msgstr "identifier-namen: %s" +msgstr "namen van variabelen: %s" #: convertrules.py:549 msgid "point-and-click argument changed to procedure." -msgstr "" +msgstr "argument van point-and-click() is veranderd naar een procedure" #: convertrules.py:591 msgid "semicolons removed" @@ -231,21 +239,21 @@ msgstr "puntkomma's verwijderd" #: convertrules.py:634 #, python-format msgid "%s property names" -msgstr "" +msgstr "%s-eigenschapsnamen" #: convertrules.py:704 msgid "automaticMelismata turned on by default" -msgstr "" +msgstr "automaticMelismata is standaard geactiveerd" #: convertrules.py:709 msgid "automaticMelismata is turned on by default since 1.5.67." -msgstr "" +msgstr "automaticMelismata is sinds 1.5.67 standaard geactiveerd" #: convertrules.py:943 convertrules.py:1636 convertrules.py:1890 #: convertrules.py:2135 #, python-format msgid "remove %s" -msgstr "verwijder %s" +msgstr "%s verwijderen" #: convertrules.py:978 convertrules.py:981 msgid "cluster syntax" @@ -253,40 +261,44 @@ msgstr "cluster-syntax" #: convertrules.py:988 msgid "new Pedal style syntax" -msgstr "" +msgstr "nieuwe syntax van de Pedal-stijl" #: convertrules.py:1247 msgid "" "New relative mode,\n" "Postfix articulations, new text markup syntax, new chord syntax." msgstr "" +"Nieuwe relatieve modus, achtergevoegde articulatietekens,\n" +"nieuwe syntax voor tekstopmaak, nieuwe syntax voor akkoorden." #: convertrules.py:1260 msgid "Remove - before articulation" -msgstr "" +msgstr "een - voor het articulatieteken verwijderen" #: convertrules.py:1295 #, python-format msgid "%s misspelling" -msgstr "" +msgstr "spelfout in %s" #: convertrules.py:1314 msgid "Swap < > and << >>" -msgstr "" +msgstr "< > en << >> omwisselen" #: convertrules.py:1317 msgid "attempting automatic \\figures conversion. Check results!" -msgstr "" +msgstr "Er wordt geprobeerd de conversie van \\figures automatisch uit te voeren. Controleer het resultaat!" #: convertrules.py:1363 msgid "Use Scheme code to construct arbitrary note events." -msgstr "" +msgstr "Gebruik Scheme-code om arbitraire nootgebeurtenissen te construeren." #: convertrules.py:1370 msgid "" "use symbolic constants for alterations,\n" "remove \\outputproperty, move ly:verbose into ly:get-option" msgstr "" +"symbolische constanten gebruiken voor alteraties;\n" +"\\outputproperty verwijderen; ly:verbose omzetten naar ly:get-option" #: convertrules.py:1395 #, python-format @@ -298,6 +310,12 @@ msgid "" "\n" "as a substitution text." msgstr "" +"\\outputproperty gevonden,\n" +"Gelieve handmatig te bewerken en gebruik\n" +"\n" +" \\applyoutput #(outputproperty-compatibility %s '%s )\n" +"\n" +"als vervangende tekst." #: convertrules.py:1407 msgid "" @@ -307,24 +325,31 @@ msgid "" "* calls of ly:make-pitch and ly:pitch-alteration\n" "* keySignature settings made with \\property\n" msgstr "" +"Het alteraties-veld van de Scheme-toonhoogtes werd met 2 vermenigvuldigd\n" +"om accidenten van een kwarttoon te ondersteunen. U dient de volgende constructies handmatig bij te werken:\n" +"\n" +"* aanroepen van ly:make-pitch en ly:pitch-alteration\n" +"* met \\property aangemaakte instellingen voor keySignature\n" #: convertrules.py:1450 msgid "removal of automaticMelismata; use melismaBusyProperties instead." -msgstr "" +msgstr "verwijderen van automaticMelismata; gebruik melismaBusyProperties ervoor in de plaats." #: convertrules.py:1557 msgid "\\partcombine syntax change to \\newpartcombine" -msgstr "" +msgstr "syntax \\partcombine is veranderd naar \\newpartcombine" #: convertrules.py:1582 msgid "" "Drum notation changes, Removing \\chordmodifiers, \\notenames.\n" "Harmonic notes. Thread context removed. Lyrics context removed." msgstr "" +"Wijzigingen aan slagwerknotatie: verwijderen van \\chordmodifiers, \\notenames.\n" +"Harmonische noten. De contexten Thread en Lyrics werden verwijderd." #: convertrules.py:1586 msgid "Drums found. Enclose drum notes in \\drummode" -msgstr "" +msgstr "Slagwerk gevonden. Slagwerknoten tussen \\drummode-markeringen plaatsen." #: convertrules.py:1597 convertrules.py:1604 convertrules.py:1615 #, python-format @@ -332,22 +357,24 @@ msgid "" "\n" "%s found. Check file manually!\n" msgstr "" +"\n" +"%s gevonden. Controleer het bestand handmatig!\n" #: convertrules.py:1597 msgid "Drum notation" -msgstr "" +msgstr "Slagwerknotatie" #: convertrules.py:1656 msgid "new syntax for property settings:" -msgstr "" +msgstr "nieuwe syntax voor eigenschapsinstellingen:" #: convertrules.py:1682 msgid "Property setting syntax in \\translator{ }" -msgstr "" +msgstr "Syntax voor een eigenschapsinstelling in \\translator{ }" #: convertrules.py:1721 msgid "Scheme grob function renaming" -msgstr "" +msgstr "Hernoemen van de grob-functie voor Scheme" #: convertrules.py:1732 convertrules.py:2139 convertrules.py:2143 #: convertrules.py:2709 @@ -357,19 +384,23 @@ msgstr "Gebruik %s\n" #: convertrules.py:1748 msgid "More Scheme function renaming" -msgstr "" +msgstr "Hernoemen van andere Scheme-functies" #: convertrules.py:1872 msgid "" "Page layout has been changed, using paper size and margins.\n" "textheight is no longer used.\n" msgstr "" +"Paginaopmaak werd gewijzigd en maakt gebruik van paper size (papierformaat)\n" +"en margins (marges); textheight (teksthoogte) wordt niet meer gebruikt.\n" #: convertrules.py:1958 msgid "" "\\foo -> \\foomode (for chords, notes, etc.)\n" "fold \\new FooContext \\foomode into \\foo." msgstr "" +"\\foo -> \\foomode (voor akkoorden, noten, enz.)\n" +"\\new FooContext \\foomode reduceren naar \\foo." #: convertrules.py:1996 msgid "" @@ -379,22 +410,27 @@ msgid "" " #(set-global-staff-size )\n" "\n" msgstr "" +"grootte van de notenbalk moet op het hoogste niveau gewijzigd worden\n" +"met\n" +"\n" +" #(set-global-staff-size )\n" +"\n" #: convertrules.py:2016 msgid "regularize other identifiers" -msgstr "" +msgstr "andere variabelen normaliseren" #: convertrules.py:2084 msgid "\\encoding: smart recode latin1..utf-8. Remove ly:point-and-click" -msgstr "" +msgstr "\\encoding: latin1 slim omzetten naar utf-8; ly:point-and-click verwijderen" #: convertrules.py:2095 msgid "LilyPond source must be UTF-8" -msgstr "LilyPond-brontekst moet UTF-8 zijn" +msgstr "LilyPond-brontekst moet UTF-8 zijn." #: convertrules.py:2098 msgid "Try the texstrings backend" -msgstr "Probeer de textstrings-backend." +msgstr "Probeer de texstring-backend." #: convertrules.py:2101 #, python-format @@ -407,11 +443,11 @@ msgstr "Of sla het op als UTF-8 in uw editor." #: convertrules.py:2154 msgid "warn about auto beam settings" -msgstr "" +msgstr "waarschuwen bij instellingen voor automatische waardestrepen" #: convertrules.py:2158 msgid "auto beam settings" -msgstr "" +msgstr "instellingen voor automatische waardestrepen" #: convertrules.py:2159 msgid "" @@ -419,38 +455,42 @@ msgid "" "Auto beam settings must now specify each interesting moment in a measure\n" "explicitly; 1/4 is no longer multiplied to cover moments 1/2 and 3/4 too.\n" msgstr "" +"\n" +"Instellingen voor automatische waardestrepen moeten nu iedere relevante\n" +"nootwaarde in een maat expliciet specificeren; 1/4 wordt niet langer\n" +"vermenigvuldigd om ook de nootwaarden 1/2 en 3/4 te bestrijken.\n" #: convertrules.py:2272 msgid "verticalAlignmentChildCallback has been deprecated" -msgstr "" +msgstr "verticalAlignmentChildCallback is verouderd" #: convertrules.py:2277 msgid "Remove callbacks property, deprecate XY-extent-callback." -msgstr "" +msgstr "De callbacks-eigenschap verwijderen; de XY-extent-callback als verouderd aanmerken." #: convertrules.py:2298 msgid "Use grob closures iso. XY-offset-callbacks." -msgstr "" +msgstr "Grob-afsluitingen gebruiken in plaats van XY-offset-callbacks." #: convertrules.py:2360 msgid "foobar -> foo-bar for \\paper, \\layout" -msgstr "" +msgstr "foobar -> foo-bar voor \\paper, \\layout" #: convertrules.py:2470 msgid "deprecate \\tempo in \\midi" -msgstr "" +msgstr "\\tempo in \\midi als verouderd aanmerken" #: convertrules.py:2523 msgid "deprecate cautionary-style. Use AccidentalCautionary properties" -msgstr "" +msgstr "cautionary-style als verouderd aanmerken; eigenschappen van AccidentalCautionary gebruiken" #: convertrules.py:2536 msgid "Rename accidental glyphs, use glyph-name-alist." -msgstr "" +msgstr "Hernoem accidentsymbolen; gebruik glyph-name-alist." #: convertrules.py:2591 msgid "edge-text settings for TextSpanner" -msgstr "" +msgstr "Randtekstinstellingen voor TextSpanner" #: convertrules.py:2592 #, python-format @@ -459,46 +499,51 @@ msgid "" "\n" "%s" msgstr "" +"Gebruik\n" +"\n" +"%s" -# XXX this and next two should be one +# FIXME: this and next two should be one #: convertrules.py:2625 msgid "Use the `alignment-offsets' sub-property of\n" -msgstr "" +msgstr "Gebruik de sub-eigenschap 'alignment-offsets' van\n" #: convertrules.py:2626 msgid "NonMusicalPaperColumn #'line-break-system-details\n" -msgstr "" +msgstr "NonMusicalPaperColumn #'line-break-system-details\n" #: convertrules.py:2627 msgid "to set fixed distances between staves.\n" -msgstr "" +msgstr "om vaste afstanden tussen notenbalken in te stellen.\n" #: convertrules.py:2639 msgid "Use #'style not #'dash-fraction to select solid/dashed lines." -msgstr "" +msgstr "Gebruik #'style en niet #'dash-fraction om volle/streeplijnen te selecteren." #: convertrules.py:2645 msgid "all settings related to dashed lines" -msgstr "" +msgstr "alle instellingen met betrekking tot streeplijnen" -# XXX this and next should be one +# FIXME: this and next should be one #: convertrules.py:2646 msgid "Use \\override ... #'style = #'line for solid lines and\n" -msgstr "" +msgstr "Gebruik \\override ... #'style = #'line voor volle lijnen en\n" #: convertrules.py:2647 msgid "\t\\override ... #'style = #'dashed-line for dashed lines." -msgstr "" +msgstr "\t\\override ... #'style = #'dashed-line voor streeplijnen." #: convertrules.py:2683 msgid "" "metronomeMarkFormatter uses text markup as second argument,\n" "fret diagram properties moved to fret-diagram-details." msgstr "" +"metronomeMarkFormatter heeft tekstmarkering als tweede argument;\n" +"de eigenschappen van fretdiagram zijn verplaatst naar fret-diagram-details." #: convertrules.py:2689 msgid "metronomeMarkFormatter got an additional text argument.\n" -msgstr "" +msgstr "metronomeMarkFormatter kreeg een bijkomend tekstargument.\n" #: convertrules.py:2690 #, python-format @@ -506,63 +551,69 @@ msgid "" "The function assigned to Score.metronomeMarkFunction now uses the signature\n" "%s" msgstr "" +"De aan Score.metronomeMarkFunction toegewezen functie gebruikt nu de signatuur\n" +"%s" #: convertrules.py:2708 #, python-format msgid "%s in fret-diagram properties" -msgstr "" +msgstr "%s in de eigenschappen van fretdiagram" #: convertrules.py:2752 msgid "\\put-adjacent argument order" -msgstr "" +msgstr "volgorde van de argumenten van \\put-adjacent" #: convertrules.py:2753 msgid "Axis and direction now come before markups:\n" -msgstr "" +msgstr "As en richting komen nu voor de mark-ups:\n" #: convertrules.py:2754 msgid "\\put-adjacent axis dir markup markup." -msgstr "" +msgstr "\\put-adjacent as richting mark-up mark-up." #: convertrules.py:2785 msgid "re-definition of InnerStaffGroup" -msgstr "" +msgstr "herdefinitie van InnerStaffGroup" #: convertrules.py:2790 msgid "re-definition of InnerChoirStaff" -msgstr "" +msgstr "herdefinitie van InnerChoirStaff" #: convertrules.py:2800 msgid "Syntax changes for \\addChordShape and \\chord-shape" -msgstr "" +msgstr "Syntaxwijzigingen voor \\addChordShape en \\chord-shape" #: convertrules.py:2805 msgid "stringTuning must be added to addChordShape call.\n" -msgstr "" +msgstr "Bij een aanroep van addChordShape moet stringTuning toegevoegd worden.\n" #: convertrules.py:2810 msgid "stringTuning must be added to chord-shape call.\n" -msgstr "" +msgstr "Bij een aanroep van chord-shape moet stringTuning toegevoegd worden.\n" #: convertrules.py:2816 msgid "Remove oldaddlyrics" -msgstr "" +msgstr "oldaddlyrics verwijderen" #: convertrules.py:2820 msgid "" "oldaddlyrics is no longer supported. \n" -" Use addlyrics or lyrsicsto instead.\n" +" Use addlyrics or lyricsto instead.\n" msgstr "" +"oldaddlyrics wordt niet langer ondersteund. \n" +" Gebruik in plaats daarvan addlyrics of lyricsto.\n" #: convertrules.py:2826 msgid "" "keySignature property not reversed any more\n" "MIDI 47: orchestral strings -> orchestral harp" msgstr "" +"een eigenschap van keySignature wordt niet langer omgekeerd\n" +"MIDI 47: orchestral strings -> orchestral harp" #: convertrules.py:2831 msgid "The alist for Staff.keySignature is no longer in reversed order.\n" -msgstr "" +msgstr "De associatielijst voor Staff.keySignature staat niet langer in omgekeerde volgorde.\n" #: convertrules.py:2837 msgid "" @@ -570,14 +621,17 @@ msgid "" "ly:hairpin::after-line-breaking -> ly:spanner::kill-zero-spanned-time\n" "Dash parameters for slurs and ties are now in dash-definition" msgstr "" +"\\bar \".\" produceert nu een dikke verticale streep\n" +"ly:hairpin::after-line-breaking -> ly:spanner::kill-zero-spanned-time\n" +"Streepparameters voor legatobogen en overbindingen zitten nu bij dash-definition" #: convertrules.py:2843 msgid "\\bar \".\" now produces a thick barline.\n" -msgstr "" +msgstr "\\bar \".\" heeft nu een dikke verticale streep als resultaat.\n" #: convertrules.py:2849 -msgid "Dash parameters for slurs and ties are now in 'dash-details.\n" -msgstr "" +msgid "Dash parameters for slurs and ties are now in 'dash-definition.\n" +msgstr "Streepparameters voor legatobogen en overbindingen zitten nu bij 'dash-definition.\n" #: convertrules.py:2854 msgid "" @@ -593,24 +647,37 @@ msgid "" "Explicit dynamics context definition from `Piano centered dynamics'\n" "template replaced by new `Dynamics' context." msgstr "" +"De regels in verband met automatische waardestrepen zijn veranderd.\n" +"override-auto-beam-setting en revert-auto-beam-setting werden verwijderd.\n" +"\\overrideBeamSettings werd toegevoegd.\n" +"beatGrouping werd verwijderd.\n" +"Andere instellingen voor verticale lay-out.\n" +"ly:system-start-text::print -> system-start-text::print\n" +"Beam #'thickness -> Beam #'beam-thickness\n" +"ly:note-head::brew-ez-stencil -> note-head::brew-ez-stencil\n" +"ly:ambitus::print -> ambitus::print\n" +"De expliciete definitie van de dynamische context uit het sjabloon\n" +"'Gecentreerde pianodynamiek' werd vervangen door de nieuwe context 'Dynamics'." #: convertrules.py:2868 msgid " Autobeam settings are now overriden with \\overrideBeamSettings.\n" -msgstr "" +msgstr " De instellingen voor automatische waardestrepen worden nu overschreven met behulp van \\overrideBeamSettings.\n" #: convertrules.py:2873 msgid " Autobeam settings are now reverted with \\revertBeamSettings.\n" -msgstr "" +msgstr " De instellingen voor automatische waardestrepen worden nu ongedaan gemaakt met behulp van \\revertBeamSettings.\n" #: convertrules.py:2879 msgid "" " beatGrouping with a specified context must now be accomplished with\n" " \\overrideBeamSettings.\n" msgstr "" +" beatGrouping met een opgegeven context moet nu met\n" +" \\overrideBeamSettings gerealiseerd worden.\n" #: convertrules.py:2885 msgid "alignment-offsets has been changed to alignment-distances: you must now specify the distances between staves rather than the offset of staves.\n" -msgstr "" +msgstr "alignment-offsets werd door alignment-distances vervangen: u moet nu de afstand tussen notenbalken opgeven en niet meer hun plaatsing.\n" #: convertrules.py:2896 msgid "" @@ -619,94 +686,106 @@ msgid "" "Swallow_performer and String_number_engraver.\n" "New vertical spacing variables." msgstr "" +"Verouderde engravers/translators verwijderen: Note_swallow_translator,\n" +"Rest_swallow_translator, Skip_event_swallow_translator, Swallow_engraver,\n" +"Swallow_performer and String_number_engraver.\n" +"Nieuwe parameters voor verticale spatiëring." #: convertrules.py:2927 msgid "Vertical spacing no longer depends on the Y-extent of a VerticalAxisGroup.\n" -msgstr "" +msgstr "Verticale spatiëring is niet langer afhankelijk van de Y-extent van een VerticalAxisGroup.\n" #: convertrules.py:2933 msgid "Unify fetaNumber and fetaDynamic encodings" -msgstr "" +msgstr "Coderingen fetaNumber en fetaDynamic gelijkschakelen" #: convertrules.py:2938 msgid "\\RemoveEmpty*StaffContext -> \\*Staff \\RemoveEmptyStaves" -msgstr "" +msgstr "\\RemoveEmpty*StaffContext -> \\*Staff \\RemoveEmptyStaves" #: convertrules.py:2949 msgid "\\cresc etc. are now postfix operators" -msgstr "" +msgstr "\\cresc e.a. zijn nu achtergevoegde operatoren" #: convertrules.py:2961 msgid "" "Eliminate beamSettings, beatLength, \\setBeatGrouping, \\overrideBeamSettings and \\revertBeamSettings.\n" "\"accordion.accEtcbase\" -> \"accordion.etcbass\"" msgstr "" +"beamSettings, beatLength, \\setBeatGrouping, \\overrideBeamSettings en \\revertBeamSettings wegwerken.\n" +"\"accordion.accEtcbase\" -> \"accordion.etcbass\"" #: convertrules.py:2979 msgid "Use \\set beamExceptions or \\overrideTimeSignatureSettings.\n" -msgstr "" +msgstr "\\set beamExceptions of \\overrideTimeSignatureSettings gebruiken.\n" #: convertrules.py:2983 msgid "Use \\set beamExceptions or \\revertTimeSignatureSettings.\n" -msgstr "" +msgstr "\\set beamExceptions of \\revertTimeSignatureSettings gebruiken.\n" #: convertrules.py:2987 msgid "Use baseMoment, beatStructure, and beamExceptions.\n" -msgstr "" +msgstr "baseMoment, beatStructure en beamExceptions gebruiken.\n" #: convertrules.py:2991 convertrules.py:2995 msgid "Use baseMoment and beatStructure.\n" -msgstr "" +msgstr "baseMoment en beatStructure gebruiken.\n" #: convertrules.py:3000 msgid "" "Woodwind diagrams: Move size, thickness, and graphic from argument list to properties.\n" "Deprecate negative dash-period for hidden lines: use #'style = #'none instead." msgstr "" +"Houtblazersdiagrammen: grootte, dikte en schriftteken van de argumentenlijst naar de eigenschappen verplaatsen.\n" +"Een negatieve streep-punt voor verborgen lijnen als verouderd aanmerken: gebruik in plaats ervan #'style = #'none." #: convertrules.py:3005 msgid "Move size, thickness, and graphic to properties. Argument should be just the key list.\n" -msgstr "" +msgstr "Grootte, dikte en schriftteken naar de eigenschappen verplaatsen. Enkel de lijst van sleutels mag een argument zijn.\n" #: convertrules.py:3013 msgid "" "Rename vertical spacing variables.\n" "Add fretboard-table argument to savePredefinedFretboard." msgstr "" +"Parameters voor verticale spatiëring hernoemen.\n" +"Argument fretboard-table toevoegen aan savePredefinedFretboard." #: convertrules.py:3031 msgid "Rename vertical spacing grob properties." -msgstr "" +msgstr "Grob-eigenschappen voor verticale spatiëring hernoemen." #: convertrules.py:3047 msgid "Remove \\paper variables head-separation and foot-separation." -msgstr "" +msgstr "De parameters head-separation en foot-separation van \\paper verwijderen." #: convertrules.py:3051 msgid "Adjust settings for top-system-spacing instead.\n" -msgstr "" +msgstr "In plaats ervan de instellingen voor top-system-spacing aanpassen.\n" #: convertrules.py:3055 msgid "Adjust settings for last-bottom-spacing instead.\n" -msgstr "" +msgstr "In plaats ervan de instellingen voor last-bottom-spacing aanpassen.\n" #: convertrules.py:3061 msgid "" "Rename space to basic-distance in various spacing alists.\n" "Remove HarmonicParenthesesItem grob." msgstr "" +"In de verschillende associatielijsten space (spatie) naar basic-distance hernoemen.\n" +"De grob HarmonicParenthesesItem verwijderen." #: convertrules.py:3068 msgid "HarmonicParenthesesItem has been eliminated.\n" -msgstr "" +msgstr "HarmonicParenthesesItem werd weggewerkt.\n" #: convertrules.py:3069 msgid "Harmonic parentheses are part of the TabNoteHead grob.\n" -msgstr "" +msgstr "Harmonische intermezzo's maken deel uit van de grob TabNoteHead.\n" #: convertrules.py:3074 msgid "Remove context from overrideTimeSignatureSettings and revertTimeSignatureSettings.\n" -msgstr "" +msgstr "Context van overrideTimeSignatureSettings en revertTimeSignatureSettings verwijderen.\n" #: convertrules.py:3081 msgid "" @@ -714,77 +793,80 @@ msgid "" "Change tenor and baritone ukulele names in string tunings.\n" "Generate messages for manual conversion of vertical spacing if required." msgstr "" +"Van stringTunings een lijst van toonhoogtes maken in plaats van een lijst van halve toonafstanden.\n" +"In snaarstemmingen de namen voor tenor en bariton ukulele wijzigen.\n" +"Indien nodig mededelingen genereren over manuele conversie van verticale spatiëring." #: convertrules.py:3124 msgid "Vertical spacing changes might affect user-defined contexts." -msgstr "" +msgstr "Wijzigingen inzake verticale spatiëring kunnen door de gebruiker aangepaste contexten beïnvloeden." #: convertrules.py:3130 msgid "Replace bar-size with bar-extent." -msgstr "" +msgstr "bar-size door bar-extent vervangen." #: convertrules.py:3142 msgid "Woodwind diagrams: Changes to the clarinet diagram." -msgstr "" +msgstr "Houtblazersdiagrammen: wijzigingen aan het diagram voor klarinet." #: convertrules.py:3146 msgid "Clarinet fingering changed to reflect actual anatomy of instrument.\n" -msgstr "" +msgstr "Vingerzetting voor klarinet werd gewijzigd om de werkelijke anatomie van het instrument te reflecteren.\n" #: convertrules.py:3156 msgid "Handling of non-automatic footnotes." -msgstr "" +msgstr "Omgaan met niet-automatische voetnoten." #: convertrules.py:3160 msgid "If you are using non-automatic footnotes, make sure to set footnote-auto-numbering = ##f in the paper block.\n" -msgstr "" +msgstr "Indien u gebruik maakt van niet-automatische voetnoten, moet u ervoor zorgen om in het blok paper de instelling footnote-auto-numbering = ##f op te nemen.\n" #: convertrules.py:3165 msgid "Change in internal property for MultiMeasureRest" -msgstr "" +msgstr "Wijziging in interne eigenschap van MultiMeasureRest" #: convertrules.py:3169 msgid "This internal property has been replaced by round-up-to-longer-rest, round-up-exceptions and usable-duration-logs.\n" -msgstr "" +msgstr "Deze interne eigenschap werd vervangen door round-up-to-longer-rest, round-up-exceptions en usable-duration-logs.\n" #: convertrules.py:3174 msgid "Creation of a Flag grob and moving of certain Stem properties to this grob" -msgstr "" +msgstr "Aanmaken van een Flag-grob en ernaartoe overplaatsen van sommige eigenschappen van Stem" #: convertrules.py:3210 msgid "consistent-broken-slope is now handled through the positions callback.\n" -msgstr "" +msgstr "consistent-broken-slope wordt nu behandeld door de terugaanroep-functie positions.\n" #: convertrules.py:3211 msgid "input/regression/beam-broken-classic.ly shows how broken beams are now handled.\n" -msgstr "" +msgstr "input/regression/beam-broken-classic.ly laat zien hoe defecte waardestrepen nu behandeld worden.\n" -#: convertrules.py:3369 +#: convertrules.py:3372 msgid "beamExceptions controls whole-measure beaming." -msgstr "" +msgstr "beamExceptions regelt het plaatsen van waardestrepen over de hele maat." -#: convertrules.py:3606 +#: convertrules.py:3609 msgid "Flag.transparent and Flag.color inherit from Stem" -msgstr "" +msgstr "Flag.transparent en Flag.color erven over van Stem" -#: convertrules.py:3672 +#: convertrules.py:3675 msgid "Staff-padding now controls the distance to the baseline, not the nearest point." -msgstr "" +msgstr "Staff-padding regelt nu de afstand tot de basislijn, niet tot het dichtstbijzijnde punt." #: fontextract.py:25 #, python-format msgid "Scanning %s" -msgstr "Scannen %s" +msgstr "Scannen van %s" #: fontextract.py:70 #, python-format msgid "Extracted %s" -msgstr "Geëxtraheerd %s" +msgstr " %s is geëxtraheerd" #: fontextract.py:85 #, python-format msgid "Writing fonts to %s" -msgstr "Schrijven van fonts naar %s" +msgstr "Schrijven van lettertypes naar %s" #: lilylib.py:101 #, python-format @@ -814,7 +896,7 @@ msgstr "Aanroepen van '%s'" #: lilylib.py:196 lilylib.py:257 #, python-format msgid "Running %s..." -msgstr "Draaien van %s..." +msgstr "Uitvoeren van %s..." #: lilylib.py:333 #, python-format @@ -823,36 +905,36 @@ msgstr "Gebruik: %s" #: musicexp.py:224 musicexp.py:229 msgid "Language does not support microtones contained in the piece" -msgstr "" +msgstr "De taal ondersteunt de microtonen uit dit stuk niet." #: musicexp.py:491 msgid "Tuplet brackets of curved shape are not correctly implemented" -msgstr "" +msgstr "Antimetrische-figuurboogjes zijn niet correct geïmplementeerd" #: musicexp.py:677 #, python-format msgid "unable to set the music %(music)s for the repeat %(repeat)s" -msgstr "" +msgstr "kan de muziek %(music)s niet instellen op de herhaling %(repeat)s" #: musicexp.py:686 msgid "encountered repeat without body" -msgstr "herhaling gevonden zonder inhoud" +msgstr "herhaling zonder inhoud gevonden" #. no self.elements! #: musicexp.py:856 #, python-format msgid "Grace note with no following music: %s" -msgstr "" +msgstr "Voorslag zonder dat er muziek op volgt: %s" #: musicexp.py:1018 #, python-format msgid "Invalid octave shift size found: %s. Using no shift." -msgstr "" +msgstr "Ongeldige grootte van octaafverschuiving gevonden: %s. Geen verschuiving toegepast." #: musicexp.py:1476 #, python-format msgid "Unable to convert alteration %s to a lilypond expression" -msgstr "Kan verandering %s niet naar een Lilypond-expressie converteren" +msgstr "Kan alteratie %s niet naar een Lilypond-expressie converteren" #. TODO: Handle pieces without a time signature! #: musicxml.py:361 @@ -866,50 +948,51 @@ msgstr "Kan maatsoort niet begrijpen. Teruggevallen op 4/4." #: musicxml.py:435 #, python-format msgid "Key alteration octave given for a non-existing alteration nr. %s, available numbers: %s!" -msgstr "" +msgstr "Er werd een toonsoort-alteratie-octaaf opgegeven voor een niet-bestaand alteratienummer %s; beschikbare nummers: %s." #: musicxml.py:523 #, python-format msgid "Unable to find instrument for ID=%s\n" msgstr "Kan instrument voor ID=%s niet vinden\n" -#: abc2ly.py:1386 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 +#: abc2ly.py:1389 convert-ly.py:85 lilypond-book.py:122 midi2ly.py:1044 #, python-format msgid "%s [OPTION]... FILE" msgstr "%s [OPTIE...] BESTAND" -#: abc2ly.py:1387 +# Dit is een docstring: derde persoon. +#: abc2ly.py:1390 #, python-format msgid "" "abc2ly converts ABC music files (see\n" "%s) to LilyPond input.\n" msgstr "" -"'abc2ly' converteert ABC-muziekbestanden\n" +"Converteert ABC-muziekbestanden\n" "(zie %s) naar LilyPond-invoer.\n" -#: abc2ly.py:1395 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 -#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:181 +#: abc2ly.py:1398 convert-ly.py:92 etf2ly.py:1208 lilypond-book.py:231 +#: midi2ly.py:1095 musicxml2ly.py:2590 main.cc:184 msgid "show version number and exit" msgstr "programmaversie tonen en stoppen" -#: abc2ly.py:1398 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 -#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:160 +#: abc2ly.py:1401 convert-ly.py:96 etf2ly.py:1204 lilypond-book.py:140 +#: midi2ly.py:1062 musicxml2ly.py:2572 main.cc:163 msgid "show this help and exit" msgstr "deze hulptekst tonen en stoppen" -#: abc2ly.py:1401 etf2ly.py:1209 midi2ly.py:1071 +#: abc2ly.py:1404 etf2ly.py:1209 midi2ly.py:1071 msgid "write output to FILE" msgstr "uitvoer naar BESTAND schrijven" -#: abc2ly.py:1404 +#: abc2ly.py:1407 msgid "be strict about success" msgstr "strikt zijn wat betreft succes" -#: abc2ly.py:1407 +#: abc2ly.py:1410 msgid "preserve ABC's notion of beams" msgstr "ABC's notie van waardestrepen behouden" -#: abc2ly.py:1410 +#: abc2ly.py:1413 msgid "suppress progress messages" msgstr "voortgangsberichten onderdrukken" @@ -917,12 +1000,13 @@ msgstr "voortgangsberichten onderdrukken" #. "Report bugs in English via %s", #. or if there is a LilyPond users list or forum in your language #. "Report bugs in English via %s or in YOUR_LANG via URI" -#: abc2ly.py:1413 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 -#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:315 +#: abc2ly.py:1416 convert-ly.py:157 etf2ly.py:1218 lilypond-book.py:258 +#: midi2ly.py:1107 musicxml2ly.py:2674 main.cc:318 #, c-format, python-format msgid "Report bugs via %s" msgstr "" -"Rapporteer gebreken in het programma aan <%s>;\n" +"Rapporteer (in het Engels) gebreken in het programma via\n" +"<%s>;\n" "meld vertaalfouten aan ." #: convert-ly.py:47 @@ -930,8 +1014,8 @@ 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 "" -"Actualiseert LilyPond-invoer naar nieuwere versie. Standaard actualiseert het\n" -"vanaf de versie uit de \\version opdracht, naar de huidige LilyPond-versie." +"Waardeert LilyPond-invoer op naar een nieuwere versie. Standaard wordt van de\n" +"versie uit de opdracht \\version naar de huidige LilyPond-versie opgewaardeerd." #: convert-ly.py:50 msgid "If FILE is `-', read from standard input." @@ -964,29 +1048,29 @@ msgstr "beginnen bij VERSIE (standaard: de \\version gevonden in bestand)" #: convert-ly.py:105 msgid "edit in place" -msgstr "bestand ter plekke bewerken" +msgstr "ter plekke bewerken" #: convert-ly.py:109 lilypond-book.py:179 musicxml2ly.py:2627 msgid "Print log messages according to LOGLEVEL (NONE, ERROR, WARNING, PROGRESS (default), DEBUG)" -msgstr "Print log-berichten volgens LOG-NIVEAU (NONE, ERROR, WARNING, PROGRESS (standaard), DEBUG)." +msgstr "Log-berichten weergeven volgens LOG-NIVEAU (NONE, ERROR, WARNING, PROGRESS (standaard), DEBUG)." #: convert-ly.py:111 lilypond-book.py:163 lilypond-book.py:181 -#: musicxml2ly.py:2629 main.cc:174 +#: musicxml2ly.py:2629 main.cc:177 msgid "LOGLEVEL" msgstr "LOG-NIVEAU" #: convert-ly.py:117 msgid "do not add \\version command if missing" -msgstr "geen commando \\version toevoegen als deze ontbreekt" +msgstr "commando \\version niet toevoegen als deze ontbreekt" #: convert-ly.py:123 #, python-format msgid "force updating \\version number to %s" -msgstr "bijwerken van \\version number naar %s afdwingen" +msgstr "bijwerken van \\version naar versienummer %s afdwingen" #: convert-ly.py:129 msgid "only update \\version number if file is modified" -msgstr "\\version number alleen bijwerken wanneer bestand gewijzigd is" +msgstr "\\version alleen naar nieuw versienummer bijwerken wanneer bestand gewijzigd is" #: convert-ly.py:135 #, python-format @@ -1003,7 +1087,7 @@ msgid "make a numbered backup [default: filename.ext~]" msgstr "een genummerde reservekopie maken (standaard: bestandsnaam.ext~)" #: convert-ly.py:152 etf2ly.py:1212 lilypond-book.py:234 midi2ly.py:1096 -#: main.cc:183 +#: main.cc:186 msgid "show warranty and copyright" msgstr "garantie en auteursrechten tonen" @@ -1019,40 +1103,42 @@ msgstr "Fout tijdens converteren" msgid "Stopping at last successful rule" msgstr "Gestopt bij laatste succesvolle regel" -# XXX trailing space? +# FIXME: trailing space? #: convert-ly.py:256 #, python-format msgid "Processing `%s'... " msgstr "Verwerken van '%s'... " -#: convert-ly.py:367 +#: convert-ly.py:366 #, python-format msgid "%s: Unable to open file" msgstr "%s: Kan bestand niet openen" -#: convert-ly.py:373 +#: convert-ly.py:372 #, python-format msgid "%s: Unable to determine version. Skipping" msgstr "%s: Kan versie niet bepalen. Overgeslagen." -#: convert-ly.py:379 +#: convert-ly.py:378 #, python-format msgid "" "%s: Invalid version string `%s' \n" "Valid version strings consist of three numbers, separated by dots, e.g. `2.8.12'" msgstr "" +"%s: Ongeldig versienummer '%s';\n" +"een geldig versienummer bestaat uit drie getallen, gescheiden door punten, bijv. '2.8.12'" -#: convert-ly.py:385 +#: convert-ly.py:384 #, python-format msgid "There was %d error." msgid_plural "There were %d errors." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Er was %d fout." +msgstr[1] "Er waren %d fouten." #: etf2ly.py:1197 #, python-format msgid "%s [OPTION]... ETF-FILE" -msgstr "%s [OPTIE]... ETF-BESTAND" +msgstr "%s [OPTIE...] ETF-BESTAND" #: etf2ly.py:1198 msgid "" @@ -1064,13 +1150,13 @@ msgstr "" "van 'ETF' naar een gebruiksklaar Lilypond-bestand.\n" #: etf2ly.py:1210 midi2ly.py:1067 midi2ly.py:1072 musicxml2ly.py:2659 -#: main.cc:166 main.cc:178 +#: main.cc:169 main.cc:181 msgid "FILE" msgstr "BESTAND" #: lilypond-book.py:80 msgid "Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document." -msgstr "Verwerk LilyPond snippers in hybride HTML, LaTeX, texinfo of DocBook dokument." +msgstr "Verwerkt LilyPond-fragmenten uit een hybride HTML-, LaTeX-, texinfo- of DocBook-document." #: lilypond-book.py:87 msgid "BOOK" @@ -1087,7 +1173,7 @@ msgstr "FILTER" #: lilypond-book.py:130 msgid "pipe snippets through FILTER [default: `convert-ly -n -']" -msgstr "snippers door FILTER sluizen (standaard: 'convert-ly -n -')" +msgstr "fragmenten door FILTER sluizen (standaard: 'convert-ly -n -')" #: lilypond-book.py:134 msgid "use output format FORMAT (texi [default], texi-html, latex, html, docbook)" @@ -1102,37 +1188,37 @@ msgid "add DIR to include path" msgstr "deze MAP toevoegen aan zoekpad" #: lilypond-book.py:143 lilypond-book.py:150 lilypond-book.py:169 -#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:165 +#: lilypond-book.py:187 lilypond-book.py:208 lilypond-book.py:214 main.cc:168 msgid "DIR" msgstr "MAP" #: lilypond-book.py:148 msgid "format Texinfo output so that Info will look for images of music in DIR" -msgstr "" +msgstr "Texinfo-uitvoer zo opmaken dat Info in MAP kijkt voor afbeeldingen van muziek" #: lilypond-book.py:155 msgid "PAD" -msgstr "" +msgstr "OPVUL" #: lilypond-book.py:157 -msgid "pad left side of music to align music inspite of uneven bar numbers (in mm)" -msgstr "" +msgid "pad left side of music to align music in spite of uneven bar numbers (in mm)" +msgstr "linkerkant van muziek opvullen (in mm) om muziek uit te lijnen ondanks ongelijk aantal maten" #: lilypond-book.py:162 msgid "Print lilypond log messages according to LOGLEVEL" -msgstr "Print Lilypond-log-berichten volgens LOG-NIVEAU." +msgstr "Lilypond-logberichten volgens LOGNIVEAU printen" #: lilypond-book.py:168 msgid "write lily-XXX files to DIR, link into --output dir" -msgstr "" +msgstr "lily-XXX-bestanden naar MAP schrijven, linken naar de --output map" #: lilypond-book.py:173 msgid "Load the additional python PACKAGE (containing e.g. a custom output format)" -msgstr "" +msgstr "Het extra pythonpakket PAKKET laden (met bijv. een aangepaste uitvoeropmaak)" #: lilypond-book.py:174 msgid "PACKAGE" -msgstr "" +msgstr "PAKKET" #: lilypond-book.py:186 msgid "write output to DIR" @@ -1149,23 +1235,23 @@ msgstr "ly-bestanden verwerken met 'OPDRACHT BESTAND...'" # lisp-format #: lilypond-book.py:197 msgid "Redirect the lilypond output" -msgstr "Omleiden van Lilypond-uitvoer" +msgstr "Lilypond-uitvoer omleiden" #: lilypond-book.py:201 msgid "Compile snippets in safe mode" -msgstr "Snippers compileren in veilige modus" +msgstr "Fragmenten compileren in veilige modus" #: lilypond-book.py:207 msgid "do not fail if no lilypond output is found" -msgstr "" +msgstr "niet afbreken als er geen lilypond-uitvoer gevonden wordt" #: lilypond-book.py:213 msgid "do not fail if no PNG images are found for EPS files" -msgstr "" +msgstr "niet afbreken als er geen PNG-afbeeldingen gevonden worden voor EPS-bestanden" #: lilypond-book.py:219 msgid "write snippet output files with the same base name as their source file" -msgstr "" +msgstr "aan uitvoerbestanden met fragmenten eenzelfde basisbestandsnaam geven als het oorspronkelijke bestand" #: lilypond-book.py:223 midi2ly.py:1090 musicxml2ly.py:2596 msgid "be verbose" @@ -1176,22 +1262,24 @@ msgid "" "run executable PROG instead of latex, or in\n" "case --pdf option is set instead of pdflatex" msgstr "" +"het programma PROG uitvoeren in plaats van latex, of in\n" +"plaats van pdflatex als de optie --pdf gebruikt werd" #: lilypond-book.py:241 lilypond-book.py:246 msgid "PROG" -msgstr "" +msgstr "PROG" #: lilypond-book.py:245 msgid "run executable PROG instead of texi2pdf" -msgstr "" +msgstr "het programma PROG uitvoeren in plaats van texi2pdf" #: lilypond-book.py:252 msgid "create PDF files for use with PDFTeX" -msgstr "PDF-bestanden maken voor gebruik met PDFTeX" +msgstr "PDF-bestanden maken om met PDFTeX te gebruiken" #: lilypond-book.py:463 msgid "Writing snippets..." -msgstr "Schrijven van snippers..." +msgstr "Schrijven van fragmenten..." #: lilypond-book.py:468 msgid "Processing..." @@ -1199,7 +1287,7 @@ msgstr "Verwerken..." #: lilypond-book.py:473 msgid "All snippets are up to date..." -msgstr "Alle snippers zijn up-to-date..." +msgstr "Alle fragmenten zijn up-to-date..." #: lilypond-book.py:475 msgid "Linking files..." @@ -1208,7 +1296,7 @@ msgstr "Linken van bestanden..." #: lilypond-book.py:495 #, python-format msgid "cannot determine format for: %s" -msgstr "kan formaat niet bepalen voor: %s" +msgstr "kan opmaak niet bepalen voor: %s" #: lilypond-book.py:504 #, python-format @@ -1248,19 +1336,19 @@ msgstr "Verwerken van invoegsel: %s" msgid "Removing `%s'" msgstr "Verwijderen van '%s'" -#: lilypond-book.py:714 +#: lilypond-book.py:727 #, python-format msgid "Setting LilyPond's loglevel to %s" -msgstr "Instellen van Lilypond-log-niveau op %s" +msgstr "Instellen van logniveau van Lilypond op %s" -#: lilypond-book.py:718 +#: lilypond-book.py:731 #, python-format msgid "Setting LilyPond's loglevel to %s (from environment variable LILYPOND_LOGLEVEL)" -msgstr "Instellen van Lilypond-log-niveau op %s (uit omgevingsvariabele LILYPOND_LOGLEVEL)" +msgstr "Instellen van logniveau van Lilypond op %s (uit omgevingsvariabele LILYPOND_LOGLEVEL)" -#: lilypond-book.py:721 +#: lilypond-book.py:734 msgid "Setting LilyPond's output to --verbose, implied by lilypond-book's setting" -msgstr "Instellen van Lilyponds uitvoer op '--verbose', geïmpliceerd door Lilypond-books instelling" +msgstr "Instellen van uitvoer van Lilypond op '--verbose', als gevolg van de instellingen van Lilypond-book" #: midi2ly.py:90 msgid "warning: " @@ -1290,7 +1378,7 @@ msgstr "Converteren van %s naar LilyPond-invoer.\n" #: midi2ly.py:1050 msgid "print absolute pitches" -msgstr "absolute toonhoogten printen" +msgstr "absolute toonhoogten afdrukken" #: midi2ly.py:1052 midi2ly.py:1080 msgid "DUR" @@ -1298,31 +1386,31 @@ msgstr "DUUR" #: midi2ly.py:1053 msgid "quantise note durations on DUR" -msgstr "nootlengtes op DUUR kwantiseren" +msgstr "nootlengtes op DUUR quantizen" #: midi2ly.py:1056 msgid "debug printing" -msgstr "" +msgstr "afdrukken op fouten onderzoeken" #: midi2ly.py:1059 msgid "print explicit durations" -msgstr "expliciete nootlengtes printen" +msgstr "expliciete nootlengtes afdrukken" #: midi2ly.py:1064 msgid "prepend FILE to output" -msgstr "BESTAND voorvoegen aan uitvoer" +msgstr "uitvoer laten voorafgaan door BESTAND" #: midi2ly.py:1068 msgid "set key: ALT=+sharps|-flats; MINOR=1" -msgstr "toonsoort zetten: VER=+kruizen|-mollen; MINEUR=1" +msgstr "toonsoort zetten: ALT=+kruisen|-mollen; MINEUR=1" #: midi2ly.py:1069 msgid "ALT[:MINOR]" -msgstr "VER[:MINEUR]" +msgstr "ALT[:MINEUR]" #: midi2ly.py:1074 msgid "preview of first 4 bars" -msgstr "voorproefje van eerste vier maten" +msgstr "voorbeeldweergave van eerste vier maten" #: midi2ly.py:1078 msgid "suppress progress messages and warnings about excess voices" @@ -1330,7 +1418,7 @@ msgstr "voortgangsberichten en waarschuwingen over te veel stemmen onderdrukken" #: midi2ly.py:1079 msgid "quantise note starts on DUR" -msgstr "het begin van noten op DUUR kwantiseren" +msgstr "het begin van noten op DUUR quantizen" #: midi2ly.py:1083 msgid "use s instead of r for rests" @@ -1338,11 +1426,11 @@ msgstr "voor rusten s in plaats van r gebruiken" #: midi2ly.py:1085 msgid "DUR*NUM/DEN" -msgstr "DUUR*NOEM/TEL" +msgstr "DUUR*NOEMER/TELLER" #: midi2ly.py:1088 msgid "allow tuplet durations DUR*NUM/DEN" -msgstr "tuplet-lengtes van DUUR*NOEM/TEL toestaan" +msgstr "een lengte van DUUR*NOEMER/TELLER toestaan voor een antimetrische figuur" #: midi2ly.py:1098 msgid "treat every text as a lyric" @@ -1354,70 +1442,70 @@ msgstr "Voorbeelden" #: midi2ly.py:1125 msgid "no files specified on command line." -msgstr "geen bestanden gegeven op de opdrachtregel" +msgstr "geen bestanden vermeld op de opdrachtregel" #: musicxml2ly.py:228 #, python-format msgid "Encountered file created by %s, containing wrong beaming information. All beaming information in the MusicXML file will be ignored" -msgstr "" +msgstr "Een door %s gemaakt bestand gevonden met foutieve informatie over waardestrepen. Alle informatie in verband met waardestrepen uit het MusicXML-bestand zal overgeslagen worden." #: musicxml2ly.py:247 musicxml2ly.py:249 #, python-format msgid "Unprocessed PartGroupInfo %s encountered" -msgstr "" +msgstr "Niet-verwerkte PartGroupInfo %s gevonden" #: musicxml2ly.py:500 #, python-format msgid "Encountered note at %s without type and duration (=%s)" -msgstr "" +msgstr "Op %s is een noot zonder type en lengte gevonden (=%s)" #: musicxml2ly.py:520 #, python-format msgid "Encountered rational duration with denominator %s, unable to convert to lilypond duration" -msgstr "" +msgstr "Rationele duur met noemer %s gevonden; kan niet naar lilypond-duur omgezet worden" #: musicxml2ly.py:767 msgid "Unable to extract key signature!" -msgstr "" +msgstr "Kan de voortekening niet afleiden." #: musicxml2ly.py:794 #, python-format msgid "unknown mode %s, expecting 'major' or 'minor' or a church mode!" -msgstr "" +msgstr "onbekende toonladder %s; verwachtte 'major' of 'minor' of een kerktoonladder" #: musicxml2ly.py:932 #, python-format msgid "Encountered unprocessed marker %s\n" -msgstr "" +msgstr "Een niet-verwerkt merkteken %s gevonden\n" #: musicxml2ly.py:1026 #, python-format msgid "unknown span event %s" -msgstr "onbekende span-gebeurtenis %s" +msgstr "onbekende overspanningsgebeurtenis %s" #: musicxml2ly.py:1036 #, python-format msgid "unknown span type %s for %s" -msgstr "onbekend span-type %s voor %s" +msgstr "onbekend overspanningstype %s voor %s" #: musicxml2ly.py:1456 msgid "Unknown metronome mark, ignoring" -msgstr "Onbekende metronoommarkering; genegeerd" +msgstr "Onbekende metronoomaanduiding; genegeerd" #. TODO: Implement the other (more complex) way for tempo marks! #: musicxml2ly.py:1461 msgid "Metronome marks with complex relations ( in MusicXML) are not yet implemented." -msgstr "" +msgstr "Metronoomaanduidingen met complexe relaties ( in MusicXML) zijn nog niet geïmplementeerd." #: musicxml2ly.py:1663 #, python-format msgid "Unable to convert chord type %s to lilypond." -msgstr "" +msgstr "Kan akkoordtype %s niet naar lilypond converteren." #: musicxml2ly.py:1816 #, python-format msgid "drum %s type unknown, please add to instrument_drumtype_dict" -msgstr "" +msgstr "slagwerktype %s is onbekend; voeg het toe aan instrument_drumtype_dict" #: musicxml2ly.py:1820 msgid "cannot find suitable event" @@ -1426,12 +1514,12 @@ msgstr "kan geen geschikte gebeurtenis vinden" #: musicxml2ly.py:1968 #, python-format msgid "Negative skip %s (from position %s to %s)" -msgstr "" +msgstr "Terugsprong %s (van positie %s naar %s)" #: musicxml2ly.py:2109 #, python-format msgid "Negative skip found: from %s to %s, difference is %s" -msgstr "" +msgstr "Terugsprong gevonden: van %s naar %s, verschil is %s" #: musicxml2ly.py:2190 #, python-format @@ -1440,24 +1528,24 @@ msgstr "onverwachte %s; verwachtte %s of %s of %s" #: musicxml2ly.py:2296 msgid "Encountered closing slur, but no slur is open" -msgstr "" +msgstr "Einde van een legatoboog gevonden, maar geen begin" #: musicxml2ly.py:2299 msgid "Cannot have two simultaneous (closing) slurs" -msgstr "" +msgstr "Twee gelijktijdige (eindes van) legatobogen is onmogelijk" #: musicxml2ly.py:2308 msgid "Cannot have a slur inside another slur" -msgstr "" +msgstr "Een legatoboog binnenin een andere is onmogelijk" #: musicxml2ly.py:2311 msgid "Cannot have two simultaneous slurs" -msgstr "" +msgstr "Twee gelijktijdige legatobogen is onmogelijk" #: musicxml2ly.py:2445 #, python-format msgid "cannot simultaneously have more than one mode: %s" -msgstr "" +msgstr "Meer dan één toonladder tegelijkertijd is onmogelijk: %s" #: musicxml2ly.py:2553 msgid "Converting to LilyPond expressions..." @@ -1467,8 +1555,9 @@ msgstr "Converteren naar LilyPond-expressies..." msgid "musicxml2ly [OPTION]... FILE.xml" msgstr "musicxml2ly [OPTIE...] BESTAND.xml" -# XXX command line >> standard input -# XXX use the existing standard phrase instead +# FIXME: command line ==> standard input +# that is: use the existing standard phrase instead +# Dit is een docstring: derde persoon. #: musicxml2ly.py:2566 msgid "" "Convert MusicXML from FILE.xml to LilyPond input.\n" @@ -1479,11 +1568,15 @@ msgstr "" #: musicxml2ly.py:2576 msgid "" -"Copyright (c) 2005--2012 by\n" +"Copyright (c) 2005--2015 by\n" " Han-Wen Nienhuys ,\n" " Jan Nieuwenhuizen and\n" " Reinhold Kainhofer \n" msgstr "" +"Copyright (c) 2005--2015\n" +" Han-Wen Nienhuys ,\n" +" Jan Nieuwenhuizen en\n" +" Reinhold Kainhofer \n" #: musicxml2ly.py:2602 msgid "use lxml.etree; uses less memory and cpu time" @@ -1511,19 +1604,19 @@ msgstr "deze TAAL gebruiken voor toonhoogtenamen; b.v. 'deutsch' voor nootnamen #: musicxml2ly.py:2638 msgid "do not convert directions (^, _ or -) for articulations, dynamics, etc." -msgstr "" +msgstr "de aanwijzingen (^, _ of -) voor articulatie, dynamiek en dergelijke niet converteren" #: musicxml2ly.py:2644 msgid "do not convert exact vertical positions of rests" -msgstr "" +msgstr "de exacte verticale plaatsing van rusten niet converteren" #: musicxml2ly.py:2650 msgid "do not convert the exact page layout and breaks" -msgstr "" +msgstr "de exacte paginaopmaak en pagina-eindes niet converteren" #: musicxml2ly.py:2656 msgid "do not convert beaming information, use lilypond's automatic beaming instead" -msgstr "" +msgstr "geen informatie i.v.m. waardestrepen converteren; lilypond in de plaats daarvan automatisch waardestrepen laten plaatsen" #: musicxml2ly.py:2664 msgid "set output filename to FILE, stdout if -" @@ -1531,23 +1624,23 @@ msgstr "uitvoer opslaan in BESTAND (standaarduitvoer indien '-')" #: musicxml2ly.py:2670 msgid "activate midi-block" -msgstr "" +msgstr "midi-blok activeren" #: musicxml2ly.py:2754 #, python-format msgid "unknown part in part-list: %s" -msgstr "" +msgstr "onbekende stem in part-list (stemmenlijst): %s" #: musicxml2ly.py:2816 msgid "Input is compressed, extracting raw MusicXML data from stdin" -msgstr "" +msgstr "de invoer is gecomprimeerd; van standaardinvoer worden ruwe MusicXML data uitgepakt" #: musicxml2ly.py:2829 #, python-format msgid "Input file %s is compressed, extracting raw MusicXML data" -msgstr "" +msgstr "invoerbestand %s is gecomprimeerd; ruwe MusicXML data worden uitgepakt" -# XXX uncapitalize Standard +# FIXME: uncapitalize Standard #: musicxml2ly.py:2859 msgid "Reading MusicXML from Standard input ..." msgstr "Lezen van MusicXML van standaardinvoer..." @@ -1567,15 +1660,15 @@ msgstr "Uitvoer naar '%s'" msgid "Unable to find input file %s" msgstr "Kan invoerbestand %s niet vinden" -#: website_post.py:125 +#: website_post.py:129 msgid "English" msgstr "Engels" -#: website_post.py:128 +#: website_post.py:132 msgid "Other languages" msgstr "Andere talen" -#: website_post.py:129 +#: website_post.py:133 #, python-format msgid "About automatic language selection." msgstr "Gebruik van automatische taalkeuze." @@ -1614,7 +1707,7 @@ msgstr "onbekend log-niveau '%s'; standaard wordt gebruikt (INFO)" #: warn.cc:112 #, c-format msgid "%d expected warning(s) not encountered: " -msgstr "" +msgstr "%d verwachte waarschuwing(en) niet aangetroffen: " #: warn.cc:183 #, c-format @@ -1648,27 +1741,26 @@ msgstr "waarschuwing wordt onderdrukt: %s" #: accidental-engraver.cc:180 #, c-format msgid "accidental typesetting list must begin with context-name: %s" -msgstr "voorteken zetlijst moet beginnen met context-naam: %s" +msgstr "zetlijst van accidenten moet beginnen met context-naam: %s" -#: accidental-engraver.cc:210 +#: accidental-engraver.cc:207 #, c-format msgid "procedure or context-name expected for accidental rule, found %s" -msgstr "procedure of context-naam werd verwacht voor toevallige regel, gevonden: %s" +msgstr "procedure of context-naam werd verwacht voor accidentregel; gevonden: %s" -#: accidental.cc:169 +#: accidental.cc:141 #, c-format msgid "Could not find glyph-name for alteration %s" -msgstr "Kan gliefnaam niet vinden voor verandering %s" +msgstr "Kan symboolnaam niet vinden voor alteratie %s" -#: accidental.cc:184 -#, fuzzy +#: accidental.cc:157 msgid "natural alteration glyph not found" -msgstr "glief voor herstelteken niet gevonden" +msgstr "stamtoonalteratiesymbool niet gevonden" -#: all-font-metrics.cc:149 +#: all-font-metrics.cc:159 #, c-format msgid "cannot find font: `%s'" -msgstr "kan font niet vinden: '%s'" +msgstr "kan lettertype niet vinden: '%s'" #: apply-context-iterator.cc:42 msgid "\\applycontext argument is not a procedure" @@ -1676,12 +1768,7 @@ msgstr "argument van \\applycontext is geen procedure" #: arpeggio.cc:138 msgid "no heads for arpeggio found?" -msgstr "" - -#: auto-change-iterator.cc:74 change-iterator.cc:72 -#, c-format -msgid "cannot change, already in translator: %s" -msgstr "kan niet wisselen, al in vertaler: %s" +msgstr "geen nootkoppen voor arpeggio gevonden?" #: axis-group-engraver.cc:149 msgid "Axis_group_engraver: vertical group already has a parent" @@ -1695,14 +1782,16 @@ msgstr "zijn er twee Axis_group_engravers?" msgid "removing this vertical group" msgstr "verwijderen van deze verticale groep" -#: axis-group-interface.cc:714 +#: axis-group-interface.cc:716 #, c-format msgid "\"%s\" is not a valid outside-staff-placement-directive" msgstr "" +"\"%s\" is geen juist outside-staff-placement-directive\n" +"(aanwijzing voor plaatsing buiten de notenbalk)" -#: axis-group-interface.cc:786 +#: axis-group-interface.cc:788 msgid "an outside-staff object should have a direction, defaulting to up" -msgstr "een buiten-notenbalk object moet een richting hebben, gebruik standaardwaarde omhoog" +msgstr "een object buiten de notenbalk moet een richting hebben; de standaardwaarde is erboven" #: bar-check-iterator.cc:84 #, c-format @@ -1719,24 +1808,24 @@ msgstr "onbeëindigde waardestreep" #: beam-engraver.cc:282 chord-tremolo-engraver.cc:149 msgid "stem must have Rhythmic structure" -msgstr "stok moet Ritmische structuur hebben" +msgstr "nootstok moet ritmische structuur hebben" #: beam-engraver.cc:293 msgid "stem does not fit in beam" -msgstr "stok past niet in waardestreep" +msgstr "nootstok past niet in waardestreep" #: beam-engraver.cc:294 msgid "beam was started here" msgstr "waardestreep werd hier gestart" #. We are completely screwed. -#: beam-quanting.cc:839 +#: beam-quanting.cc:850 msgid "no viable initial configuration found: may not find good beam slope" msgstr "geen werkbare initiële configuratie gevonden: kan wellicht geen goede waardestreephelling vinden" -#: beam.cc:181 +#: beam.cc:183 msgid "removing beam with no stems" -msgstr "verwijderen van waardestreep zonder stokken" +msgstr "verwijderen van waardestreep zonder nootstokken" #: change-iterator.cc:34 #, c-format @@ -1744,22 +1833,24 @@ msgid "cannot change `%s' to `%s'" msgstr "kan '%s' niet in '%s' veranderen" #. FIXME: constant error message. -#: change-iterator.cc:93 +#: change-iterator.cc:67 msgid "cannot find context to switch to" msgstr "kan context om naar over te schakelen niet vinden" +#. No enclosing context was found because the iterator's immediate +#. context is the kind that was sought. #. We could change the current translator's id, but that would make #. errors hard to catch. #. #. last->translator_id_string () = get_change #. ()->change_to_id_string (); -#: change-iterator.cc:102 +#: change-iterator.cc:78 #, c-format msgid "not changing to same context type: %s" -msgstr "niet wisselen naar zelfde type context: %s" +msgstr "er wordt niet gewisseld naar eenzelfde type context: %s" -#. FIXME: uncomprehensable message -#: change-iterator.cc:106 +#. FIXME: incomprehensible message +#: change-iterator.cc:82 msgid "none of these in my family" msgstr "geen van deze in mijn gezin" @@ -1774,7 +1865,7 @@ msgstr "onbeëindigd akkoordtremolo" #: clef.cc:65 #, c-format msgid "clef `%s' not found" -msgstr "sleutel '%s' is niet gevonden" +msgstr "sleutel '%s' niet gevonden" #: cluster.cc:120 #, c-format @@ -1788,153 +1879,160 @@ msgstr "lege cluster wordt weggegooid" #: coherent-ligature-engraver.cc:110 #, c-format msgid "Coherent_ligature_engraver: setting `spacing-increment=0.01': ptr=%ul" -msgstr "Coherent_ligature_engraver: zet `spacing-increment=0.01': ptr=%ul" +msgstr "Coherent_ligature_engraver: instellen van 'spacing-increment=0.01': ptr=%ul" #: constrained-breaking.cc:187 constrained-breaking.cc:206 msgid "cannot find line breaking that satisfies constraints" -msgstr "kan geen regelbreuk vinden die aan voorwaarden voldoet" +msgstr "kan geen regelafbreking vinden die beantwoordt aan de beperkingen" -#: context-property.cc:43 +#: context-property.cc:46 msgid "need symbol arguments for \\override and \\revert" msgstr "heb symbool-argumenten nodig voor \\override en \\revert" -#: context.cc:149 +#: context.cc:144 #, c-format msgid "cannot find or create new `%s'" -msgstr "kan '%s' niet vinden of nieuw maken" +msgstr "kan '%s' niet vinden of aanmaken" -#: context.cc:228 +#: context.cc:223 #, c-format msgid "cannot find or create `%s' called `%s'" -msgstr "kan '%s' genaamd '%s' niet vinden of aanmaken" +msgstr "kan '%s', genaamd '%s', niet vinden of aanmaken" -#: context.cc:425 +#: context.cc:416 #, c-format msgid "cannot find or create: `%s'" msgstr "kan '%s' niet vinden of aanmaken" -#: context.cc:439 -#, fuzzy, c-format +#: context.cc:430 +#, c-format msgid "cannot find or create new Bottom = \"%s\"" -msgstr "kan niet vinden of nieuw maken `%s'" +msgstr "kan geen nieuwe Bottom = \"%s\" vinden of aanmaken" #: custos.cc:87 #, c-format msgid "custos `%s' not found" -msgstr "custode `%s' niet gevonden" +msgstr "custos '%s' niet gevonden" -#: dispatcher.cc:89 -#, fuzzy +#: dispatcher.cc:82 msgid "Event class should be a list" -msgstr "Gebeurtenis klasse zou hoort een symbool te zijn" +msgstr "Gebeurtenisklasse hoort een lijst te zijn" -#: dispatcher.cc:172 +#: dispatcher.cc:165 #, c-format msgid "Junking event: %s" -msgstr "Gebeurtenis %s wordt weggegooid" +msgstr "Gebeurtenis wordt weggegooid: %s" -#: dispatcher.cc:277 +#: dispatcher.cc:279 msgid "Attempting to remove nonexisting listener." -msgstr "" +msgstr "Poging om onbestaande luisteraar te verwijderen." -#: dispatcher.cc:303 +#: dispatcher.cc:305 msgid "Already listening to dispatcher, ignoring request" -msgstr "" +msgstr "Er wordt reeds op de dispatcher geluisterd; verzoek wordt genegeerd" #: dots.cc:48 #, c-format msgid "dot `%s' not found" -msgstr "punt '%s' is niet gevonden" +msgstr "punt '%s' niet gevonden" -#: dynamic-engraver.cc:168 +#: dynamic-engraver.cc:169 #, c-format msgid "" "unknown crescendo style: %s\n" "defaulting to hairpin." msgstr "" +"onbekende crescendostijl: %s\n" +"het standaardsymbool vogelbek wordt gebruikt." -#: dynamic-engraver.cc:233 slur-proto-engraver.cc:119 -#, fuzzy, c-format +#: dynamic-engraver.cc:234 slur-proto-engraver.cc:119 +#, c-format msgid "unterminated %s" -msgstr "onbeëindigde bindingsboog" +msgstr "onbeëindigde %s" #. No explicit dynamic script events have occurred yet, but there is #. nevertheless a dynamic spanner. Initialize last_volume_ to a #. value within the available range. #: dynamic-performer.cc:129 msgid "(De)crescendo with unspecified starting volume in MIDI." -msgstr "" +msgstr "(De)crescendo met een niet-gespecificeerd beginvolume in MIDI." #: episema-engraver.cc:75 -#, fuzzy msgid "already have an episema" -msgstr "heb al een waardestreep" +msgstr "heb al een episema" #: episema-engraver.cc:88 -#, fuzzy msgid "cannot find start of episema" -msgstr "kan begin van ligatuur niet vinden" +msgstr "kan begin van episema niet vinden" #: episema-engraver.cc:137 -#, fuzzy msgid "unterminated episema" -msgstr "onbeëindigde waardestreep" +msgstr "onbeëindigd episema" #: extender-engraver.cc:169 extender-engraver.cc:178 msgid "unterminated extender" msgstr "onbeëindigde extender" -#: flag.cc:134 +#: flag.cc:133 #, c-format msgid "flag `%s' not found" -msgstr "vlag '%s' is niet gevonden" +msgstr "vlag '%s' niet gevonden" -#: flag.cc:154 +#: flag.cc:153 #, c-format msgid "flag stroke `%s' not found" -msgstr "vlagstreep '%s' is niet gevonden" +msgstr "vlagstreep '%s' niet gevonden" -#: font-config-scheme.cc:151 font-config.cc:53 +#: font-config-scheme.cc:151 font-config.cc:82 #, c-format msgid "failed adding font directory: %s" -msgstr "toevoegen van font-map is mislukt: %s" +msgstr "toevoegen van lettertypemap is mislukt: %s" -#: font-config-scheme.cc:153 font-config.cc:55 +#: font-config-scheme.cc:153 font-config.cc:84 #, c-format msgid "Adding font directory: %s" -msgstr "Toevoegen van font-map: %s" +msgstr "Toevoegen van lettertypemap: %s" #: font-config-scheme.cc:167 #, c-format msgid "failed adding font file: %s" -msgstr "toevoegen van font-bestand is mislukt: %s" +msgstr "toevoegen van lettertypebestand is mislukt: %s" #: font-config-scheme.cc:169 #, c-format msgid "Adding font file: %s" -msgstr "Toevoegen van font-bestand: %s" +msgstr "Toevoegen van lettertypebestand: %s" #: font-config.cc:38 msgid "Initializing FontConfig..." msgstr "Initialiseren van FontConfig..." -#: font-config.cc:58 +#: font-config.cc:70 +#, c-format +msgid "failed to add fontconfig configuration file `%s'" +msgstr "toevoegen van configuratiebestand '%s' voor fontconfig is mislukt" + +#: font-config.cc:73 +#, c-format +msgid "Adding fontconfig configuration file: %s" +msgstr "Toevoegen van configuratiebestand voor fontconfig: %s" + +#: font-config.cc:86 msgid "Building font database..." -msgstr "Opbouwen van font-gegevensbank..." +msgstr "Opbouwen van lettertypegegevensbank..." #: footnote-engraver.cc:87 msgid "Must be footnote-event." -msgstr "" +msgstr "Moet een voetnootgebeurtenis zijn." -#: general-scheme.cc:390 +#: general-scheme.cc:403 #, c-format msgid "failed redirecting stderr to `%s'" msgstr "omleiden van standaardfoutuitvoer naar '%s' is mislukt" -#: general-scheme.cc:469 output-ps.scm:48 -#, fuzzy +#: general-scheme.cc:482 output-ps.scm:48 msgid "Found infinity or nan in output. Substituting 0.0" -msgstr "Oneindig of nan gevonden in uitvoer. Vervangen door 0.0" +msgstr "Oneindige of niet-numerieke waarde gevonden in uitvoer. Vervangen door 0.0" #: glissando-engraver.cc:158 msgid "unterminated glissando" @@ -1945,14 +2043,13 @@ msgid "no music found in score" msgstr "geen muziek gevonden in partituur" #: global-context-scheme.cc:103 -#, fuzzy msgid "Interpreting music..." msgstr "Vertolken van muziek..." #: global-context-scheme.cc:125 #, c-format msgid "elapsed time: %.2f seconds" -msgstr "duur: %.2f seconden" +msgstr "verstreken tijd: %.2f seconden" #: gregorian-ligature-engraver.cc:70 #, c-format @@ -1962,43 +2059,43 @@ msgstr "\\%s genegeerd" #: gregorian-ligature-engraver.cc:75 #, c-format msgid "implied \\%s added" -msgstr "impliciede \\%s toegevoeg" +msgstr "impliciete \\%s is toegevoegd" #. ligature may not start with 2nd head of pes or flexa #: gregorian-ligature-engraver.cc:224 msgid "cannot apply `\\~' on first head of ligature" -msgstr "Kan `\\~' niet op eerste noot van ligatuur toepassen" +msgstr "kan '\\~' niet op eerste nootkop van ligatuur toepassen" #. (pitch == prev_pitch) #: gregorian-ligature-engraver.cc:236 msgid "cannot apply `\\~' on heads with identical pitch" -msgstr "kan `\\~' niet toepassen op noten met identieke toonhoogte" +msgstr "kan '\\~' niet toepassen op nootkoppen met identieke toonhoogte" #: grob-interface.cc:68 #, c-format msgid "Unknown interface `%s'" -msgstr "onbekende interface '%s'" +msgstr "Onbekende interface '%s'" #: grob-interface.cc:79 #, c-format msgid "Grob `%s' has no interface for property `%s'" msgstr "Grob '%s' heeft geen interface voor eigenschap '%s'" -#: grob-property.cc:35 +#: grob-property.cc:33 #, c-format msgid "%d: %s" msgstr "%d: %s" -#: grob.cc:488 +#: grob.cc:492 #, c-format msgid "ignored infinite %s-offset" -msgstr "" +msgstr "oneindige %s-offset is genegeerd" #: hairpin.cc:60 msgid "Asking for broken bound padding at a non-broken bound." -msgstr "" +msgstr "Verzoek om een doorbroken kant aan te vullen waar die niet doorbroken is." -#: hairpin.cc:256 +#: hairpin.cc:257 msgid "decrescendo too small" msgstr "decrescendo te klein" @@ -2016,9 +2113,9 @@ msgstr "verwijderen van onafgesloten streepje" #: hyphen-engraver.cc:118 msgid "unterminated hyphen; removing" -msgstr "verwijderen van onafgesloten streepje" +msgstr "niet-afgesloten streepje; wordt verwijderd" -#: includable-lexer.cc:71 lily-guile.cc:91 lily-parser-scheme.cc:108 +#: includable-lexer.cc:71 lily-guile.cc:92 lily-parser-scheme.cc:108 #, c-format msgid "cannot find file: `%s'" msgstr "kan bestand '%s' niet vinden" @@ -2028,22 +2125,22 @@ msgstr "kan bestand '%s' niet vinden" msgid "(search path: `%s')" msgstr "(zoekpad: '%s')" -#: input.cc:138 source-file.cc:178 source-file.cc:193 +#: input.cc:138 source-file.cc:180 source-file.cc:195 msgid "position unknown" msgstr "positie onbekend" -#: key-engraver.cc:198 +#: key-engraver.cc:197 msgid "Incomplete keyAlterationOrder for key signature" -msgstr "" +msgstr "Onvolledige keyAlterationOrder voor de voortekening" #: key-signature-interface.cc:77 #, c-format msgid "No glyph found for alteration: %s" -msgstr "Geen glief gevonden voor verandering: %s" +msgstr "Geen symbool gevonden voor alteratie: %s" #: key-signature-interface.cc:87 msgid "alteration not found" -msgstr "verandering niet gevonden" +msgstr "alteratie is niet gevonden" #: ligature-bracket-engraver.cc:72 ligature-engraver.cc:109 msgid "cannot find start of ligature" @@ -2067,101 +2164,109 @@ msgstr "onbeëindigde ligatuur" #: ligature-engraver.cc:216 msgid "ignoring rest: ligature may not contain rest" -msgstr "negeer rust: ligatuur mag geen rust bevatten" +msgstr "rust is genegeerd: ligatuur mag geen rust bevatten" #: ligature-engraver.cc:217 msgid "ligature was started here" msgstr "ligatuur werd hier gestart" -#: lily-guile.cc:93 +#: lily-guile.cc:94 #, c-format msgid "(load path: `%s')" msgstr "(laadpad: '%s')" -#: lily-guile.cc:412 +#: lily-guile.cc:413 #, c-format msgid "cannot find property type-check for `%s' (%s)." msgstr "kan geen typecontrole vinden voor eigenschap '%s' (%s)" -#: lily-guile.cc:415 +#: lily-guile.cc:416 msgid "perhaps a typing error?" msgstr "misschien een typefout?" -#: lily-guile.cc:422 -#, fuzzy +#: lily-guile.cc:423 msgid "skipping assignment" -msgstr "voer toewijzing toch door" +msgstr "toewijzing wordt overgeslagen" #: lily-guile.cc:442 #, c-format msgid "type check for `%s' failed; value `%s' must be of type `%s'" msgstr "typecontrole is mislukt voor '%s'; waarde '%s' moet van type '%s' zijn" -#: lily-lexer.cc:249 +#. Uh oh. unsmob delivered 0, yet +#. unsmob delivers true. This means that unsmob is a +#. matching check from a base class of T, but var is of an +#. incompatible derived type. +#: lily-guile.cc:462 +msgid "Wrong kind of " +msgstr "Foutief soort " + +#: lily-lexer.cc:251 msgid "include files are not allowed in safe mode" msgstr "invoegbestanden zijn niet toegestaan in veilige modus" -#: lily-lexer.cc:276 +#: lily-lexer.cc:278 #, c-format msgid "identifier name is a keyword: `%s'" -msgstr "identifier-naam is een sleutelwoord: '%s'" +msgstr "variabelenaam is een sleutelwoord: '%s'" -#: lily-lexer.cc:297 lily-lexer.cc:310 +#: lily-lexer.cc:299 lily-lexer.cc:312 #, c-format msgid "%s:EOF" -msgstr "" +msgstr "%s:EOF (bestandseinde)" + +#: lily-modules.cc:81 +#, c-format +msgid "Uninitialized variable `%s' in module (%s)" +msgstr "Ongeïnitialiseerde variabele '%s' in module (%s)" #: lily-parser-scheme.cc:80 #, c-format msgid "Changing working directory to: `%s'" -msgstr "Veranderen van werkmap naar '%s'" +msgstr "Veranderen van werkmap naar: '%s'" #: lily-parser-scheme.cc:84 #, c-format msgid "unable to change directory to: `%s'" -msgstr "kan huidige map niet wijzigen naar '%s'" +msgstr "kan niet van werkmap veranderen naar '%s'" #: lily-parser-scheme.cc:99 #, c-format msgid "cannot find init file: `%s'" -msgstr "kan init-bestand '%s' niet vinden" +msgstr "kan initialisatiebestand '%s' niet vinden" #: lily-parser-scheme.cc:117 #, c-format msgid "Processing `%s'" msgstr "Verwerken van '%s'" -#: lily-parser-scheme.cc:209 +#: lily-parser-scheme.cc:210 msgid "ly:parser-parse-string is only valid with a new parser. Use ly:parser-include-string instead." -msgstr "" +msgstr "ly:parser-parse-string mag enkel bij een nieuwe ontleder gebruikt worden. Gebruik ly:parser-include-string ervoor in de plaats." -#: lily-parser-scheme.cc:240 +#: lily-parser-scheme.cc:241 msgid "ly:parse-string-expression is only valid with a new parser. Use ly:parser-include-string instead." -msgstr "" +msgstr "ly:parse-string-expression mag enkel bij een nieuwe ontleder gebruikt worden. Gebruik ly:parser-include-string ervoor in de plaats." -#: lily-parser.cc:107 +#: lily-parser.cc:106 msgid "Parsing..." msgstr "Ontleden..." -#: lookup.cc:181 +#: lookup.cc:178 #, c-format msgid "Not drawing a box with negative dimension, %.2f by %.2f." -msgstr "" +msgstr "Er wordt geen vakje getekend met de negatieve afmetingen %.2f bij %.2f." -#: lyric-combine-music-iterator.cc:199 +#: lyric-combine-music-iterator.cc:204 msgid "argument of \\lyricsto should contain Lyrics context" -msgstr "" +msgstr "argument van \\lyricsto moet een context van het type Lyrics bevatten" -#: lyric-combine-music-iterator.cc:337 +#: lyric-combine-music-iterator.cc:344 #, c-format -msgid "cannot find Voice `%s'" -msgstr "kan Voice '%s' niet vinden" - -#: lyric-engraver.cc:186 -msgid "Lyric syllable does not have note. Use \\lyricsto or associatedVoice." -msgstr "Liedtekst-lettergreep heeft geen noot. Gebruik \\lyricsto of associatedVoice." +msgid "cannot find %s `%s'" +msgstr "kan %s '%s' niet vinden" -#: main.cc:104 +#: main.cc:106 #, c-format msgid "" "This program is free software. It is covered by the GNU General Public\n" @@ -2169,12 +2274,12 @@ msgid "" "under certain conditions. Invoke as `%s --warranty' for more\n" "information.\n" msgstr "" -"Dit is vrije programmatuur. Het valt onder de GNU General Public License;\n" -"u mag het onder zeer vrije voorwaarden wijzigen en verder verspreiden.\n" -"Typ '%s --warranty' voor meer informatie.\n" +"Dit is vrije programmatuur. Ze valt onder de GNU Algemene Openbare\n" +"Licentie (General Public Licence), en u wordt uitgenodigd ze te\n" +"veranderen en/of te verspreiden onder bepaalde voorwaarden.\n" +"Zie '%s --warranty' voor meer informatie.\n" -#: main.cc:110 -#, fuzzy +#: main.cc:112 msgid "" " This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License as \n" @@ -2193,121 +2298,133 @@ msgid "" msgstr "" " Dit programma is vrije programmatuur; u kunt het verspreiden en/of\n" "veranderen onder de voorwaarden van de GNU Algemene Openbare Licentie\n" -"(General Public Licence) versie 2, zoals gepubliceerd door de Free\n" -"Software Foundation.\n" +"(General Public License) versie 3 of (naar uw keuze) een latere versie,\n" +"zoals gepubliceerd door de Free Software Foundation.\n" "\n" " Dit programma wordt verspreid in de hoop dat het nuttig zal zijn,\n" -"maar ZONDER ENIGE GARANTIE; zelfs zonder impliciete garantie voor\n" -"UITBATING of als zijnde GESCHIKT VOOR EEN BEPAALD DOEL. Zie de GNU\n" -"Algemene Openbare Licentie voor details.\n" +"maar ZONDER ENIGE GARANTIE; zelfs zonder de impliciete garantie dat het\n" +"VERHANDELBAAR of GESCHIKT VOOR EEN BEPAALD DOEL zou zijn.\n" +"Zie de GNU Algemene Openbare Licentie voor details.\n" "\n" -" Als het goed is, heeft u bij dit programma een exemplaar (zie het\n" +" Normaal heeft u bij dit programma een exemplaar (zie het\n" "bestand COPYING) ontvangen van de GNU Algemene Openbare Licentie;\n" -"zoniet, schrijf dan naar de Free Software Foundation, Inc.,\n" +"indien niet, schrijf dan naar de Free Software Foundation, Inc.,\n" "59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n" -#: main.cc:148 +#: main.cc:150 msgid "SYM[=VAL]" msgstr "SYM[=WAARDE]" -#: main.cc:149 +#: main.cc:151 msgid "" "set Scheme option SYM to VAL (default: #t).\n" "Use -dhelp for help." msgstr "" -"zet Scheme optie SYM to WAARDE (standaard: #t)\n" -"Gebruik -dhelp voor hulp." +"Scheme-optie SYM instellen op WAARDE\n" +"(standaard: #t); '-dhelp' voor hulp" -#: main.cc:153 +#: main.cc:155 msgid "EXPR" -msgstr "EXPR" +msgstr "EXPRESSIE" -#: main.cc:153 +#: main.cc:155 msgid "evaluate scheme code" -msgstr "evalueer scheme code" +msgstr "Scheme-code evalueren" #. Bug in option parser: --output =foe is taken as an abbreviation #. for --output-format. -#: main.cc:156 +#: main.cc:158 msgid "FORMATs" -msgstr "FORMAATen" +msgstr "FORMAAT[,...]" -#: main.cc:156 +#: main.cc:158 msgid "dump FORMAT,... Also as separate options:" -msgstr "dump FORMAAT,... Ook als separate opties:" +msgstr "" +"de aangegeven soort bestanden produceren;\n" +"kan ook via aparte opties:" -#: main.cc:157 +#: main.cc:159 msgid "generate PDF (default)" -msgstr "genereer PDF (standaard)" +msgstr "PDF genereren (standaard)" -#: main.cc:158 +#: main.cc:160 msgid "generate PNG" -msgstr "genereer PNG" +msgstr "PNG genereren" -#: main.cc:159 +#: main.cc:161 msgid "generate PostScript" -msgstr "genereer PostScipt" +msgstr "PostScript genereren" #: main.cc:162 +msgid "generate big PDF files" +msgstr "grote PDF-bestanden genereren" + +#: main.cc:165 msgid "FIELD" msgstr "VELD" -#: main.cc:162 +#: main.cc:165 msgid "" "dump header field FIELD to file\n" "named BASENAME.FIELD" msgstr "" -"schrijf kopveld VELD naar bestand\n" +"kopveld VELD schrijven naar bestand\n" "genaamd BASISNAAM.VELD" -#: main.cc:165 +#: main.cc:168 msgid "add DIR to search path" -msgstr "voeg DIR toe aan zoekpad" +msgstr "deze MAP toevoegen aan zoekpad" -#: main.cc:166 +#: main.cc:169 msgid "use FILE as init file" -msgstr "gebruik BESTAND als initialisatiebestand" +msgstr "te gebruiken initialisatiebestand" -#: main.cc:169 +#: main.cc:172 msgid "USER, GROUP, JAIL, DIR" -msgstr "GEBR, GROEP, GEVANG, DIR" +msgstr "GEBRKR, GROEP, BOX, MAP" -#: main.cc:169 +#: main.cc:172 msgid "" "chroot to JAIL, become USER:GROUP\n" "and cd into DIR" msgstr "" -"chroot naar GEVANG, word GEBR:GROEP\n" -"en cd naar MAP" +"chrooten naar BOX, overschakelen naar\n" +"GEBRKR:GROEP, en cd'en naar MAP" -#: main.cc:174 +#: main.cc:177 msgid "" "print log messages according to LOGLEVEL. Possible values are:\n" "NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (default) and DEBUG." msgstr "" +"logberichten weergeven volgens LOGNIVEAU; waarden kunnen zijn:\n" +"NONE, ERROR, WARNING, BASIC, PROGRESS, INFO (standaard) en DEBUG" -#: main.cc:178 +#: main.cc:181 msgid "write output to FILE (suffix will be added)" msgstr "" -"schrijf uitvoer naar BESTAND\n" +"uitvoer naar dit BESTAND schrijven\n" "(extensie wordt toegevoegd)" -#: main.cc:179 +#: main.cc:182 msgid "relocate using directory of lilypond program" msgstr "" -"verhuis aan de hand van de map van het\n" -"lilypond programma" +"de map van het lilypond-programma\n" +"als de nieuwe werkmap gebruiken" -#: main.cc:180 +#: main.cc:183 msgid "no progress, only error messages (equivalent to loglevel=ERROR)" msgstr "" +"geen voortgang tonen, alleen foutmeldingen\n" +"(het equivalent van loglevel=ERROR)" -#: main.cc:182 +#: main.cc:185 msgid "be verbose (equivalent to loglevel=DEBUG)" msgstr "" +"gedetailleerde informatie produceren\n" +"(het equivalent van loglevel=DEBUG)" #. Do not update the copyright years here, run `make grand-replace' -#: main.cc:261 +#: main.cc:264 #, c-format msgid "" "Copyright (c) %s by\n" @@ -2317,118 +2434,118 @@ msgstr "" "%s en anderen." #. No version number or newline here. It confuses help2man. -#: main.cc:299 +#: main.cc:302 #, c-format msgid "Usage: %s [OPTION]... FILE..." -msgstr "Gebruik: %s [OPTIE]... BESTAND..." +msgstr "Gebruik: %s [OPTIE...] BESTAND..." -#: main.cc:301 +#: main.cc:304 msgid "Typeset music and/or produce MIDI from FILE." -msgstr "Zet muziek en of produceer MIDI van BESTAND." +msgstr "Muziek zetten en/of een MIDI maken aan de hand van BESTAND." -#: main.cc:303 +#: main.cc:306 msgid "LilyPond produces beautiful music notation." msgstr "LilyPond produceert prachtige muzieknotatie." -#: main.cc:305 +#: main.cc:308 #, c-format msgid "For more information, see %s" msgstr "Voor meer informatie, zie %s" -#: main.cc:307 +#: main.cc:310 msgid "Options:" msgstr "Opties:" -#: main.cc:374 +#: main.cc:377 #, c-format msgid "expected %d arguments with jail, found: %u" msgstr "verwachtte %d argumenten voor gevang, gevonden: %u" -#: main.cc:388 +#: main.cc:391 #, c-format msgid "no such user: %s" msgstr "onbekende gebruiker: %s" -#: main.cc:390 +#: main.cc:393 #, c-format msgid "cannot get user id from user name: %s: %s" -msgstr "kan gebruikers id niet krijgen van gebruikersnaam: %s: %s" +msgstr "kan geen gebruikers-ID achterhalen voor gebruikersnaam: %s: %s" -#: main.cc:405 +#: main.cc:408 #, c-format msgid "no such group: %s" msgstr "onbekende groep: %s" -#: main.cc:407 +#: main.cc:410 #, c-format msgid "cannot get group id from group name: %s: %s" -msgstr "kan groep id niet krijgen van groepnaam: %s: %s" +msgstr "kan geen groeps-ID achterhalen voor groepsnaam: %s: %s" -#: main.cc:415 +#: main.cc:418 #, c-format msgid "cannot chroot to: %s: %s" msgstr "kan niet chrooten naar: %s: %s" -#: main.cc:422 +#: main.cc:425 #, c-format msgid "cannot change group id to: %d: %s" -msgstr "kan groep id niet veranderen in: %d: %s" +msgstr "kan groeps-ID niet veranderen naar %d: %s" -#: main.cc:428 +#: main.cc:431 #, c-format msgid "cannot change user id to: %d: %s" -msgstr "kan kan gebruiker id niet veranderen in: %d: %s" +msgstr "kan gebruikers-ID niet veranderen naar %d: %s" -#: main.cc:434 +#: main.cc:437 #, c-format msgid "cannot change working directory to: %s: %s" -msgstr "kan werkmap niet veranderen in: %s: %s" +msgstr "kan werkmap niet veranderen naar: %s: %s" -#: main.cc:805 +#: main.cc:826 #, c-format msgid "exception caught: %s" -msgstr "exceptie gevangen: %s" +msgstr "uitzondering opgevangen: %s" #. FIXME: constant error message. -#: mark-engraver.cc:156 +#: mark-engraver.cc:150 msgid "rehearsalMark must have integer value" msgstr "rehearsalMark moet een natuurlijk getal zijn" -#: mark-engraver.cc:162 +#: mark-engraver.cc:156 msgid "mark label must be a markup object" -msgstr "mark etiket moet een markup zijn" +msgstr "markeringslabel moet van het type markup zijn" #: mensural-ligature-engraver.cc:100 msgid "ligature with less than 2 heads -> skipping" -msgstr "ligatuur met minder dan 2 bolletjes -> overslaan" +msgstr "ligatuur met minder dan twee koppen -> overgeslagen" #: mensural-ligature-engraver.cc:127 msgid "cannot determine pitch of ligature primitive -> skipping" -msgstr "kan toonhoogte van primitieve ligatuur niet bepalen -> overslaan" +msgstr "kan toonhoogte van ligatuur-primitief niet bepalen -> overgeslagen" #: mensural-ligature-engraver.cc:141 msgid "single note ligature - skipping" -msgstr "enkelnootse ligatuur - overslaan" +msgstr "eentonige ligatuur -> overgeslagen" #: mensural-ligature-engraver.cc:152 msgid "prime interval within ligature -> skipping" -msgstr "prieminterval binnen ligatuur -> overslaan" +msgstr "prime-interval binnen ligatuur -> overgeslagen" #: mensural-ligature-engraver.cc:163 msgid "mensural ligature: duration none of Mx, L, B, S -> skipping" -msgstr "mensural ligature: lengte geen van Mx, L, S -> overslaan" +msgstr "mensurale ligatuur: lengte is geen van Mx, L, B, S -> overgeslagen" #: mensural-ligature-engraver.cc:206 msgid "semibrevis must be followed by another one -> skipping" -msgstr "semibrevis moet worden gevolgd door een andere -> overslaan" +msgstr "semibrevis moet gevolgd worden door een andere -> overgeslagen" #: mensural-ligature-engraver.cc:216 msgid "" "semibreves can only appear at the beginning of a ligature,\n" "and there may be only zero or two of them" msgstr "" -"semibrevi kunnen alleen aan het begin van een ligatuur voorkomen,\n" -"en het mogen er uitsluitend een of twee zijn" +"semibrevissen kunnen alleen aan het begin van een ligatuur voorkomen,\n" +"en het mogen er uitsluitend nul of twee zijn" #: mensural-ligature-engraver.cc:236 msgid "" @@ -2437,97 +2554,84 @@ msgid "" "the penultimate note must be another one,\n" "or the ligatura must be LB or SSB" msgstr "" -"ongeldig ligatuur einde:\n" -"als de laatste noot een dalende brevis is,\n" -"moet de penultimate note een andere zijn,\n" +"ongeldig ligatuureinde:\n" +"als de laatste noot een neergaande brevis is,\n" +"moet de voorlaatste noot er ook een zijn,\n" "of de ligatuur moet LB of SSB zijn" #: mensural-ligature-engraver.cc:396 msgid "unexpected case fall-through" -msgstr "onverwachte zaakdoorval" +msgstr "onverwachte 'case'-doorval in switch statement" -#: midi-control-function-performer.cc:109 staff-performer.cc:152 +#: midi-control-function-performer.cc:107 staff-performer.cc:153 #, c-format msgid "ignoring out-of-range value change for MIDI property `%s'" -msgstr "" +msgstr "het veranderen van MIDI-eigenschap '%s' naar een buiten-bereik-vallende waarde wordt genegeerd" #: midi-item.cc:93 #, c-format msgid "no such MIDI instrument: `%s'" -msgstr "onbekend MIDI instrument: `%s'" +msgstr "onbekend MIDI-instrument: '%s'" #: midi-item.cc:179 msgid "Time signature with more than 255 beats. Truncating" -msgstr "" +msgstr "Maatsoort met meer dan 255 tellen. Wordt afgekapt" #: midi-stream.cc:38 #, c-format msgid "cannot open for write: %s: %s" -msgstr "kan bestand niet openen om te schrijven: %s: %s" +msgstr "kan %s niet openen om te schrijven: %s" #: midi-stream.cc:54 #, c-format msgid "cannot write to file: `%s'" -msgstr "kon niet naar bestand schrijven: `%s'" +msgstr "kan niet naar bestand '%s' schrijven" -#: minimal-page-breaking.cc:40 paper-score.cc:122 +#: minimal-page-breaking.cc:40 paper-score.cc:116 msgid "Calculating line breaks..." -msgstr "Berekenen van regelbreuken..." +msgstr "Berekenen van regeleinden..." #: minimal-page-breaking.cc:44 msgid "Calculating page breaks..." -msgstr "Berekenen van paginabreuken..." +msgstr "Berekenen van pagina-einden..." -#: multi-measure-rest.cc:154 +#: multi-measure-rest.cc:152 msgid "usable-duration-logs must be a non-empty list. Falling back to whole rests." -msgstr "" - -#: multi-measure-rest.cc:364 -msgid "Using naive multi measure rest spacing." -msgstr "" +msgstr "usable-duration-logs mag geen lege lijst zijn. Teruggevallen op hele rusten." #: music.cc:150 #, c-format msgid "octave check failed; expected \"%s\", found: \"%s\"" -msgstr "octaafcontrole is mislukt; verwachtte \"%s\", vond \"%s\"" - -#: music.cc:219 -msgid "(normalized pitch)" -msgstr "(genormaliseerde toonhoogte)" - -#: music.cc:223 -#, c-format -msgid "Transposing %s by %s makes alteration larger than double" -msgstr "Transponeren van %s met %s maakt verandering groter dan dubbel" +msgstr "octaafcontrole is mislukt; verwachtte \"%s\", gevonden werd \"%s\"" #: new-fingering-engraver.cc:113 msgid "cannot add text scripts to individual note heads" -msgstr "can tekstscripts niet toevoegen aan individuele notenbolletjes" +msgstr "kan tekstscripts niet toevoegen aan individuele notenkoppen" #: new-fingering-engraver.cc:269 msgid "no placement found for fingerings" -msgstr "geen plaatsing gevonden voor vingers" +msgstr "geen plaatsing gevonden voor vingerzetting" #: new-fingering-engraver.cc:270 msgid "placing below" -msgstr "onderplaatsing" +msgstr "ze wordt eronder geplaatst" -#: note-collision.cc:497 -msgid "ignoring too many clashing note columns" -msgstr "negeren van te veel botsende nootkolommen" +#: note-collision.cc:510 +msgid "this Voice needs a \\voiceXx or \\shiftXx setting" +msgstr "deze stem heeft een instelling van het type \\voiceXx of \\shiftXx nodig" -#: note-column.cc:147 +#: note-column.cc:150 msgid "cannot have note heads and rests together on a stem" -msgstr "kan notenbolletjes en rusten niet samen op een stok zetten" +msgstr "kan notenkoppen en rusten niet samen op een stok zetten" #: note-head.cc:95 #, c-format msgid "none of note heads `%s' or `%s' found" -msgstr "geen van de notenbolletjes '%s' of '%s' is gevonden" +msgstr "geen van de notenkoppen '%s' of '%s' is gevonden" #: note-heads-engraver.cc:76 msgid "NoteEvent without pitch" -msgstr "NootGebeurtenis zonder toonhoogte" +msgstr "NoteEvent zonder toonhoogte" #: open-type-font.cc:45 #, c-format @@ -2537,32 +2641,32 @@ msgstr "kan geen %lu bytes reserveren" #: open-type-font.cc:49 #, c-format msgid "cannot load font table: %s" -msgstr "kan font-tabel niet laden: %s" +msgstr "kan lettertypetabel %s niet laden" #: open-type-font.cc:54 #, c-format msgid "FreeType error: %s" -msgstr "FreeType-fout: %s" +msgstr "FreeType-fout %s" -#: open-type-font.cc:111 +#: open-type-font.cc:115 #, c-format msgid "unsupported font format: %s" -msgstr "niet-ondersteund font-formaat: %s" +msgstr "niet-ondersteunde lettertypeopmaak %s" -#: open-type-font.cc:113 +#: open-type-font.cc:117 #, c-format msgid "error reading font file %s: %s" -msgstr "fout bij lezen van font-bestand %s: %s" +msgstr "fout bij lezen van lettertypebestand %s: %s" -#: open-type-font.cc:188 +#: open-type-font.cc:192 #, c-format msgid "FT_Get_Glyph_Name () Freetype error: %s" -msgstr "FT_Get_Glyph_Name () Freetype fout: %s" +msgstr "FT_Get_Glyph_Name () Freetype-fout %s" -#: open-type-font.cc:336 pango-font.cc:256 +#: open-type-font.cc:340 pango-font.cc:258 #, c-format msgid "FT_Get_Glyph_Name () error: %s" -msgstr "FT_Get_Glyph_Name () fout: %s" +msgstr "FT_Get_Glyph_Name () fout %s" #. find out the ideal number of pages #: optimal-page-breaking.cc:62 @@ -2571,21 +2675,21 @@ msgstr "Zoeken naar het ideale aantal pagina's..." #: optimal-page-breaking.cc:94 msgid "could not satisfy systems-per-page and page-count at the same time, ignoring systems-per-page" -msgstr "" +msgstr "kan niet tegelijkertijd tegemoetkomen aan systems-per-page en page-count; systems-per-page is genegeerd" #: optimal-page-breaking.cc:114 msgid "Fitting music on 1 page..." -msgstr "Muziek passend maken op 1 pagina..." +msgstr "Muziek passend maken voor 1 pagina..." #: optimal-page-breaking.cc:116 #, c-format msgid "Fitting music on %d pages..." -msgstr "Muziek passend maken op %d pagina's..." +msgstr "Muziek passend maken voor %d pagina's..." #: optimal-page-breaking.cc:118 #, c-format msgid "Fitting music on %d or %d pages..." -msgstr "Muziek passend maken op %d of %d pagina's..." +msgstr "Muziek passend maken voor %d of %d pagina's..." #: optimal-page-breaking.cc:128 optimal-page-breaking.cc:181 #, c-format @@ -2595,217 +2699,214 @@ msgstr "proberen van %d systemen" #: optimal-page-breaking.cc:147 optimal-page-breaking.cc:209 #, c-format msgid "best score for this sys-count: %f" -msgstr "" +msgstr "beste score voor dit aantal systemen: %f" -#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:248 -#: paper-score.cc:162 +#: optimal-page-breaking.cc:216 page-turn-page-breaking.cc:249 +#: paper-score.cc:156 msgid "Drawing systems..." msgstr "Tekenen van systemen..." -#: output-def.cc:235 +#: output-def.cc:229 msgid "margins do not fit with line-width, setting default values" -msgstr "" +msgstr "marges passen niet bij regellengte; worden op de standaardwaarden ingesteld" -#: output-def.cc:242 +#: output-def.cc:236 msgid "systems run off the page due to improper paper settings, setting default values" -msgstr "" +msgstr "er komen systemen buiten de paginarand door slechte pagina-instellingen; ze worden op de standaardwaarden ingesteld" -#: page-breaking.cc:277 +#: page-breaking.cc:276 msgid "ignoring min-systems-per-page and max-systems-per-page because systems-per-page was set" -msgstr "" +msgstr "min-systems-per-page en max-systems-per-page worden genegeerd omdat systems-per-page ingesteld werd" -#: page-breaking.cc:282 +#: page-breaking.cc:281 msgid "min-systems-per-page is larger than max-systems-per-page, ignoring both values" -msgstr "" +msgstr "min-systems-per-page is groter dan max-systems-per-page; beide waarden worden genegeerd" -#: page-layout-problem.cc:402 +#: page-breaking.cc:636 +#, c-format +msgid "page %d has been compressed" +msgstr "pagina %d werd gecomprimeerd" + +#: page-layout-problem.cc:400 msgid "A page layout problem has been initiated that cannot accommodate footnotes." -msgstr "" +msgstr "Er is een probleem met de paginaopmaak opgetreden waardoor geen voetnoten opgenomen kunnen worden." -#: page-layout-problem.cc:731 -msgid "cannot fit music on page: ragged-spacing was requested, but page was compressed" -msgstr "" +#: page-layout-problem.cc:729 +msgid "ragged-bottom was specified, but page must be compressed" +msgstr "ragged-bottom werd opgegeven, maar de pagina moet gecomprimeerd worden" -#: page-layout-problem.cc:734 +#: page-layout-problem.cc:732 #, c-format -msgid "cannot fit music on page: overflow is %f" -msgstr "" - -#: page-layout-problem.cc:736 -msgid "compressing music to fit" -msgstr "" +msgid "compressing over-full page by %.1f staff-spaces" +msgstr "comprimeren van een overvolle pagina met %.1f maal de tussenruimte tussen notenbalklijnen" -#: page-layout-problem.cc:1199 +#: page-layout-problem.cc:1197 msgid "staff-affinities should only decrease" -msgstr "" +msgstr "staff-affinities mogen enkel afnemen" -#: page-turn-page-breaking.cc:168 +#: page-turn-page-breaking.cc:169 #, c-format msgid "page-turn-page-breaking: breaking from %d to %d" msgstr "page-turn-page-breaking: afbreken van %d naar %d" -#: page-turn-page-breaking.cc:217 +#: page-turn-page-breaking.cc:218 msgid "cannot fit the first page turn onto a single page. Consider setting first-page-number to an even number." msgstr "" -"Kan de eerste paginaomslag niet op eerste pagina gepast krijgen.\n" +"Kan de eerste paginaomslag niet op een enkele pagina ingepast krijgen.\n" "Overweeg om 'first-page-number' een even getal te maken." -#: page-turn-page-breaking.cc:230 +#: page-turn-page-breaking.cc:231 #, c-format msgid "Calculating page and line breaks (%d possible page breaks)..." -msgstr "Berekenen van pagina- en regelbreuken (%d mogelijke paginabreuken)..." +msgstr "Berekenen van pagina- en regeleinden (%d mogelijke pagina-einden)..." -#: page-turn-page-breaking.cc:300 +#: page-turn-page-breaking.cc:301 #, c-format msgid "break starting at page %d" -msgstr "breuk gestart op pagina %d" +msgstr "afbreken begint op pagina %d" -#: page-turn-page-breaking.cc:301 +#: page-turn-page-breaking.cc:302 #, c-format msgid "\tdemerits: %f" -msgstr "\tstrafpunten: %f" +msgstr "\tminpunten: %f" -#: page-turn-page-breaking.cc:302 +#: page-turn-page-breaking.cc:303 #, c-format msgid "\tsystem count: %d" msgstr "\taantal systemen: %d" -#: page-turn-page-breaking.cc:303 +#: page-turn-page-breaking.cc:304 #, c-format msgid "\tpage count: %d" msgstr "\taantal bladzijden: %d" -#: page-turn-page-breaking.cc:304 +#: page-turn-page-breaking.cc:305 #, c-format msgid "\tprevious break: %d" -msgstr "\tvorige breuk: %d" +msgstr "\tvorige afbreking: %d" -#: pango-font.cc:245 +#: pango-font.cc:247 #, c-format msgid "no glyph for character U+%0X in font `%s'" -msgstr "geen glief voor teken U+%0X in font '%s'" +msgstr "geen symbool voor teken U+%0X in lettertype '%s'" -#: pango-font.cc:272 +#: pango-font.cc:274 #, c-format msgid "" "Glyph has no name, but font supports glyph naming.\n" "Skipping glyph U+%0X, file %s" msgstr "" -"Glief heeft geen naam, terwijl het font gliefnamen ondersteunt.\n" -"Glief U+%0X, bestand %s, wordt overgeslagen." +"Symbool heeft geen naam, terwijl het lettertype symboolnamen ondersteunt.\n" +"Symbool U+%0X, bestand %s, wordt overgeslagen." -#: pango-font.cc:322 +#: pango-font.cc:324 #, c-format msgid "no PostScript font name for font `%s'" -msgstr "geen PostScript-font-naam voor font '%s'" +msgstr "geen PostScript-lettertypenaam voor lettertype '%s'" -#: pango-font.cc:372 +#: pango-font.cc:374 msgid "FreeType face has no PostScript font name" -msgstr "FreeType-lettertype heeft geen PostScript-font-naam" +msgstr "FreeType-lettertype heeft geen PostScript-lettertypenaam" -#: paper-book.cc:214 +#: paper-book.cc:200 #, c-format msgid "program option -dprint-pages not supported by backend `%s'" -msgstr "" +msgstr "de programmaoptie -dprint-pages wordt door backend '%s' niet ondersteund" -#: paper-book.cc:233 +#: paper-book.cc:219 #, c-format msgid "program option -dpreview not supported by backend `%s'" -msgstr "" +msgstr "de programmaoptie -dpreview wordt door backend '%s' niet ondersteund" #: paper-column-engraver.cc:263 msgid "forced break was overridden by some other event, should you be using bar checks?" -msgstr "geforceerde breuk werd opgeheven door andere gebeurtenis; dient u maatcontroles te gebruiken?" +msgstr "gedwongen afbreking werd opgeheven door andere gebeurtenis; zou u maatcontroles moeten gebruiken?" #: paper-outputter-scheme.cc:41 #, c-format msgid "Layout output to `%s'..." -msgstr "Opmaakuitvoer naar `%s'..." +msgstr "Opmaakuitvoer naar '%s'..." -#: paper-score.cc:134 +#: paper-score.cc:128 #, c-format msgid "Element count %d (spanners %d) " -msgstr "Aantal elementen %d (spanners %d)" +msgstr "Aantal elementen %d (overspanningen %d)" -#: paper-score.cc:138 +#: paper-score.cc:132 msgid "Preprocessing graphical objects..." msgstr "Voorbewerken van grafische objecten..." -#: parse-scm.cc:121 +#: parse-scm.cc:124 msgid "GUILE signaled an error for the expression beginning here" -msgstr "GUILE signaleerde een fout voor de expressie beginnend alhier" - -#: partial-iterator.cc:45 -msgid "trying to use \\partial after the start of a piece" -msgstr "" +msgstr "GUILE signaleerde een fout voor de hier beginnende expressie" #: pdf-scheme.cc:65 #, c-format msgid "Conversion of string `%s' to UTF-16be failed: %s" -msgstr "" +msgstr "Conversie van tekenreeks '%s' naar UTF-16BE is mislukt: %s" -#: percent-repeat-engraver.cc:147 +#: percent-repeat-engraver.cc:148 msgid "unterminated percent repeat" msgstr "onbeëindigde procentherhaling" -#: performance.cc:54 +#: performance.cc:76 msgid "Track..." msgstr "Spoor... " -#: performance.cc:82 +#: performance.cc:126 #, c-format msgid "MIDI output to `%s'..." -msgstr "MIDI uitvoer naar %s..." +msgstr "MIDI-uitvoer naar '%s'..." #: piano-pedal-engraver.cc:279 #, c-format msgid "expect 3 strings for piano pedals, found: %ld" -msgstr "verwacht 3 teksten voor pianopedalen, gevonden: %ld" +msgstr "verwacht 3 tekenreeksen voor pianopedalen, gevonden: %ld" #: piano-pedal-engraver.cc:294 piano-pedal-engraver.cc:305 #: piano-pedal-performer.cc:104 #, c-format msgid "cannot find start of piano pedal: `%s'" -msgstr "kan start van piano pedaal niet vinden: `%s'" +msgstr "kan begin van pianopedaal niet vinden: '%s'" #: piano-pedal-engraver.cc:340 #, c-format msgid "cannot find start of piano pedal bracket: `%s'" -msgstr "kan start van piano pedaal haak niet vinden: `%s'" +msgstr "kan begin van pianopedaalhaakje niet vinden: '%s'" #: program-option-scheme.cc:223 #, c-format msgid "no such internal option: %s" msgstr "onbekende interne optie: %s" -#: property-iterator.cc:100 +#: property-iterator.cc:115 #, c-format msgid "not a grob name, `%s'" -msgstr "geen grobnaam, `%s'" +msgstr "geen grob-naam: '%s'" #: relative-octave-check.cc:49 msgid "Failed octave check, got: " -msgstr "Octaafcontrole is mislukt; kreeg:" +msgstr "Octaafcontrole is mislukt; kreeg: " -#: relocate.cc:52 +#: relocate.cc:56 #, c-format msgid "Setting %s to %s" -msgstr "Zetten van %s op %s" +msgstr "Instellen van %s op %s" #. this warning should only be printed in debug mode! -#: relocate.cc:73 +#: relocate.cc:77 #, c-format msgid "no such file: %s for %s" msgstr "onbekend bestand: %s voor %s" #. this warning should only be printed in debug mode! #. this warning should only be printed in debug mode -#: relocate.cc:84 relocate.cc:102 +#: relocate.cc:88 relocate.cc:106 #, c-format msgid "no such directory: %s for %s" msgstr "onbekende map: %s voor %s" -#: relocate.cc:93 +#: relocate.cc:97 #, c-format msgid "%s=%s (prepend)\n" msgstr "%s=%s (voorvoegen)\n" @@ -2813,117 +2914,111 @@ msgstr "%s=%s (voorvoegen)\n" #: relocate.cc:124 #, c-format msgid "not relocating, no %s/ or current/ found under %s" -msgstr "niet verhuizen, geen %s/ of current/ gevonden onder %s" +msgstr "er wordt niets verplaatst; er is geen %s/ of current/ gevonden onder %s" #: relocate.cc:134 #, c-format msgid "Relocation: compile datadir=%s, new datadir=%s" -msgstr "Verhuizing: samenstel datamap=%s, nieuwe datamap=%s" +msgstr "Verplaatsing: compilatiedatamap=%s, nieuwe datamap=%s" #: relocate.cc:146 #, c-format msgid "Relocation: framework_prefix=%s" -msgstr "Verhuizing: draadwerk_voorvoegel=%s" +msgstr "Verplaatsing: framework_prefix=%s" #: relocate.cc:172 #, c-format msgid "Relocation: is absolute: argv0=%s\n" -msgstr "Verhuizing: is absoluut: argv0=%s\n" +msgstr "Verplaatsing: pad is absoluut: argv0=%s\n" #: relocate.cc:178 #, c-format msgid "Relocation : from cwd: argv0=%s\n" -msgstr "Verhuizing: van cwd: argv0=%s\n" +msgstr "Verplaatsing: vanuit huidige werkmap: argv0=%s\n" -#: relocate.cc:194 +#: relocate.cc:196 #, c-format msgid "" "Relocation: from PATH=%s\n" "argv0=%s\n" msgstr "" -"Verhuizing: van PATH=%s\n" +"Verplaatsing: vanuit PATH=%s\n" "argv0=%s\n" -#: relocate.cc:220 +#: relocate.cc:222 msgid "LILYPONDPREFIX is obsolete, use LILYPOND_DATADIR" msgstr "LILYPONDPREFIX is verouderd, gebruik LILYPOND_DATADIR" -#: relocate.cc:345 +#: relocate.cc:347 #, c-format msgid "Relocation file: %s" -msgstr "Verhuisbestand: %s" +msgstr "Verplaatsingsbestand: %s" -#: relocate.cc:349 source-file.cc:65 +#: relocate.cc:351 source-file.cc:65 #, c-format msgid "cannot open file: `%s'" msgstr "kan bestand niet openen: '%s'" -#: relocate.cc:379 +#: relocate.cc:381 #, c-format msgid "Unknown relocation command %s" -msgstr "Onbekend verhuizingscommando %s" +msgstr "Onbekend verplaatsingscommando %s" -#: rest-collision-engraver.cc:70 -msgid "rhythmic head is not part of a rhythmic column" -msgstr "" - -#: rest-collision.cc:150 +#: rest-collision.cc:154 msgid "cannot resolve rest collision: rest direction not set" -msgstr "kan rusten-botsing niet oplossen: richting van de rust is niet ingesteld" +msgstr "kan rustbotsing niet oplossen: richting van de rust is niet ingesteld" -#: rest-collision.cc:161 rest-collision.cc:270 +#: rest-collision.cc:165 rest-collision.cc:274 msgid "too many colliding rests" msgstr "te veel botsende rusten" -#: rest.cc:240 +#: rest.cc:239 #, c-format msgid "rest `%s' not found" msgstr "rust '%s' is niet gevonden" -#: score-engraver.cc:78 +#: score-engraver.cc:77 #, c-format msgid "cannot find `%s'" msgstr "kan '%s' niet vinden" -#: score-engraver.cc:80 +#: score-engraver.cc:79 msgid "Music font has not been installed properly." -msgstr "Muziek-font is niet correct geïnstalleerd." +msgstr "Muzieklettertype is niet correct geïnstalleerd." -#: score-engraver.cc:82 +#: score-engraver.cc:81 #, c-format msgid "Search path `%s'" msgstr "Zoekpad: '%s'" -#: score-engraver.cc:84 +#: score-engraver.cc:83 msgid "Aborting" msgstr "Afbreken" -#: score.cc:172 +#: score.cc:161 msgid "already have music in score" msgstr "heb al muziek in partituur" -#: score.cc:173 +#: score.cc:163 msgid "this is the previous music" msgstr "dit is de vorige muziek" -#: score.cc:178 +#: score.cc:169 msgid "errors found, ignoring music expression" -msgstr "fouten gevonden, negeer muziekexpressie" +msgstr "fouten gevonden; muziekexpressie wordt genegeerd" #. FIXME: #: script-engraver.cc:115 -#, fuzzy msgid "do not know how to interpret articulation:" -msgstr "weet niet hoe articulatie te vertolken: " +msgstr "weet niet hoe articulatieteken te interpreteren:" #: script-engraver.cc:116 -#, fuzzy msgid " scheme encoding: " -msgstr "scheme codering: " +msgstr " Scheme-codering: " -#: skyline-pair.cc:160 +#: skyline-pair.cc:135 msgid "direction must not be CENTER in ly:skyline-pair::skyline" -msgstr "" +msgstr "richting mag niet CENTER zijn in ly:skyline-pair::skyline" #: slur-proto-engraver.cc:51 #, c-format @@ -2940,109 +3035,95 @@ msgstr "heb al een %s" #: slur-proto-engraver.cc:183 #, c-format msgid "%s without a cause" -msgstr "" +msgstr "%s zonder reden" #: slur-proto-engraver.cc:244 #, c-format msgid "cannot end %s" msgstr "kan %s niet beëindigen" -#: slur.cc:434 -#, fuzzy, c-format +#: slur.cc:436 +#, c-format msgid "Ignoring grob for slur: %s. avoid-slur not set?" -msgstr "Negeren van grob voor boogje: %s. avoid-slur niet gezet?" +msgstr "Negeren van grob voor legatoboog: %s. Is avoid-slur niet gezet?" #: source-file.cc:85 #, c-format msgid "expected to read %d characters, got %d" -msgstr "verwachtte %d tekens te lezen, kreeg %d" +msgstr "verwachtte %d tekens te lezen, kreeg er %d" #: staff-performer.cc:301 msgid "MIDI channel wrapped around" -msgstr "MIDI-kanaal is klokje rond" +msgstr "MIDI-kanaal groter dan 15" #: staff-performer.cc:302 msgid "remapping modulo 16" -msgstr "herafbeelden modulo 16" +msgstr "toegewezen aan kanaal modulo 16" -#: stem-engraver.cc:110 +#: stem-engraver.cc:100 msgid "tremolo duration is too long" -msgstr "tremololengte is te lang" +msgstr "tremolo duurt te lang" -#: stem-engraver.cc:162 +#: stem-engraver.cc:152 #, c-format msgid "adding note head to incompatible stem (type = %d/%d)" -msgstr "toevoegen van nootbolletje aan incompatibele stok (type = %d/%d)" +msgstr "toevoegen van nootkop aan incompatibele stok (type = %d/%d)" -#: stem-engraver.cc:165 +#: stem-engraver.cc:155 msgid "maybe input should specify polyphonic voices" -msgstr "misschien moet invoer polyfonische stemmen specificeren" +msgstr "misschien moet invoer polyfone stemmen specificeren" #: stem.cc:128 msgid "weird stem size, check for narrow beams" -msgstr "vreemde stoklengte; controleer op krappe waardestrepen" +msgstr "vreemde stoklengte; controleer op smalle waardestrepen" -#: system.cc:201 +#: system.cc:202 #, c-format msgid "Element count %d" msgstr "Aantal elementen: %d" -#: system.cc:512 +#: system.cc:513 #, c-format msgid "Grob count %d" msgstr "Aantal grobs: %d" #. TODO: Also print the arguments of the markup! -#: text-interface.cc:129 -#, c-format -msgid "Cyclic markup detected: %s" -msgstr "" - -#. TODO: Also print the arguments of the markup! -#: text-interface.cc:142 +#: text-interface.cc:139 #, c-format msgid "Markup depth exceeds maximal value of %d; Markup: %s" -msgstr "" +msgstr "Mark-up overschrijdt maximale diepte %d; mark-up: %s" #: text-spanner-engraver.cc:72 msgid "cannot find start of text spanner" -msgstr "kan start van tekst-spanner niet vinden" +msgstr "kan begin van tekstoverspanning niet vinden" #: text-spanner-engraver.cc:85 msgid "already have a text spanner" -msgstr "heb al een tekst-spanner" +msgstr "heb al een tekstoverspanning" #: text-spanner-engraver.cc:130 msgid "unterminated text spanner" -msgstr "onbeëindigde tekst spanner" +msgstr "onbeëindigde tekstoverspanning" -#: tie-engraver.cc:119 -#, fuzzy +#: tie-engraver.cc:121 msgid "unterminated tie" -msgstr "onbeëindigde waardestreep" +msgstr "onbeëindigde overbinding" -#: tie-engraver.cc:353 +#: tie-engraver.cc:377 msgid "lonely tie" -msgstr "eenzame overbinding" +msgstr "verweesde overbinding" #. #. Todo: should make typecheck? #. #. OTOH, Tristan Keuris writes 8/20 in his Intermezzi. #. -#: time-signature-engraver.cc:75 +#: time-signature-engraver.cc:95 #, c-format msgid "strange time signature found: %d/%d" msgstr "vreemde maatsoort gevonden: %d/%d" -#. If there is no such symbol, we default to the numbered style. -#. (Here really with a warning!) -#: time-signature.cc:89 -#, c-format -msgid "time signature symbol `%s' not found; reverting to numbered style" -msgstr "maatsoort-symbool '%s' niet gevonden; teruggevallen op numerieke stijl" - -#: translator-ctors.cc:65 +#: translator-ctors.cc:68 #, c-format msgid "unknown translator: `%s'" msgstr "onbekende vertaler: '%s'" @@ -3052,17 +3133,17 @@ msgstr "onbekende vertaler: '%s'" msgid "fatal error. Couldn't find type: %s" msgstr "Fatale fout. Kan type niet vinden: %s" -#: translator-group.cc:188 +#: translator-group.cc:187 #, c-format msgid "cannot find: `%s'" -msgstr "kan niet vinden: '%s'" +msgstr "kan '%s' niet vinden" -#: translator.cc:326 +#: translator.cc:310 #, c-format msgid "Two simultaneous %s events, junking this one" -msgstr "Twee gelijktijdige %s-gebeurtenissen; deze ene wordt weggegooid" +msgstr "Twee gelijktijdige %s-gebeurtenissen; deze ene wordt weggegooid" -#: translator.cc:327 +#: translator.cc:311 #, c-format msgid "Previous %s event here" msgstr "Vorige %s-gebeurtenis hier" @@ -3070,266 +3151,270 @@ msgstr "Vorige %s-gebeurtenis hier" #: ttf.cc:480 ttf.cc:528 #, c-format msgid "font index %d too large for font `%s', using index 0" -msgstr "font-index %d is te groot voor font '%s'; index 0 wordt gebruikt" +msgstr "lettertype-index %d is te groot voor lettertype '%s'; index 0 wordt gebruikt" #: ttf.cc:512 ttf.cc:562 msgid "font index must be non-negative, using index 0" -msgstr "font-index mag niet negatief zijn; index 0 wordt gebruikt" +msgstr "lettertype-index mag niet negatief zijn; index 0 wordt gebruikt" #: tuplet-engraver.cc:110 msgid "No tuplet to end" -msgstr "Geen tuplet om te beëindigen" +msgstr "Geen antimetrische figuur om te eindigen" #: vaticana-ligature-engraver.cc:400 #, c-format msgid "ignored prefix(es) `%s' of this head according to restrictions of the selected ligature style" -msgstr "voorvoegsel(s) '%s' van dit bolletje worden genegeerd volgens restricties van degeselecteerde ligatuurstijl" +msgstr "voorvoegsel(s) '%s' van deze nootkop worden genegeerd volgens restricties van de geselecteerde ligatuurstijl" #: vaticana-ligature-engraver.cc:466 msgid "Ambiguous use of dots in ligature: there are multiple dotted notes with the same pitch. The ligature should be split." -msgstr "" +msgstr "Ambigue puntering gebruikt in ligatuur: er zijn meerdere gepunteerde noten met dezelfde toonhoogte. De ligatuur zou gesplitst moeten worden. " #: vaticana-ligature-engraver.cc:524 msgid "This ligature has a dotted head followed by a non-dotted head. The ligature should be split after the last dotted head before this head." -msgstr "" +msgstr "Deze ligatuur bevat een gepunteerde nootkop gevolgd door een niet-gepunteerde nootkop. De ligatuur zou gesplitst moeten worden na de laatste gepunteerde nootkop en voor die nootkop." #: vaticana-ligature-engraver.cc:736 #, c-format msgid "Vaticana_ligature_engraver: setting `spacing-increment = %f': ptr =%ul" -msgstr "Vaticana_ligature_engraver: instelling `spacing-increment = %f': ptr=%ul" +msgstr "Vaticana_ligature_engraver: instelling 'spacing-increment = %f': ptr=%ul" #: vaticana-ligature.cc:94 msgid "flexa-height undefined; assuming 0" -msgstr "flexa-hoogte is ongedefinieerd; uitgegaan van 0" +msgstr "toonhoogte van clivis (flexa) is niet gedefinieerd; 0 wordt verondersteld" #: vaticana-ligature.cc:99 msgid "ascending vaticana style flexa" -msgstr "stijgende vaticana-stijl flexa" +msgstr "stijgende clivis (flexa) in Vaticaanse stijl" #: vertical-align-engraver.cc:95 msgid "Ignoring Vertical_align_engraver in VerticalAxisGroup" -msgstr "" +msgstr "Vertical_align_engraver in VerticalAxisGroup wordt genegeerd" #. fixme: be more verbose. #: volta-engraver.cc:110 msgid "cannot end volta spanner" -msgstr "kan volta spanner niet beëindigen" +msgstr "kan volta-overspanning niet beëindigen" #: volta-engraver.cc:120 msgid "already have a volta spanner, ending that one prematurely" -msgstr "heb al een volta spanner, beëindig die voortijdig" +msgstr "heb al een volta-overspanning; die wordt voortijdig beëindigd" #: volta-engraver.cc:124 msgid "also already have an ended spanner" -msgstr "heb ook al een beëindigde spanner" +msgstr "heb ook al een beëindigde overspanning" #: volta-engraver.cc:125 msgid "giving up" msgstr "opgegeven" -#: parser.yy:158 parser.yy:172 -#, fuzzy -msgid "Too much lookahead" -msgstr "Te veel vooruitkijk" - -#: parser.yy:441 parser.yy:752 parser.yy:818 +#: parser.yy:476 parser.yy:947 parser.yy:1028 parser.yy:1248 msgid "bad expression type" msgstr "ongeldig expressietype" -#: parser.yy:650 parser.yy:1159 +#: parser.yy:859 parser.yy:1458 parser.yy:1503 msgid "not a context mod" -msgstr "" +msgstr "geen contextwijziging" -#: parser.yy:853 -msgid "score expected" -msgstr "partituur werd verwacht" +#: parser.yy:1054 +msgid "Missing music in \\score" +msgstr "Er ontbreekt muziek in \\score" -#: parser.yy:869 +#: parser.yy:1091 msgid "\\paper cannot be used in \\score, use \\layout instead" msgstr "\\paper kan niet gebruikt worden in \\score; gebruik \\layout" -#: parser.yy:893 +#: parser.yy:1126 +msgid "Spurious expression in \\score" +msgstr "Schijnbare expressie in \\score" + +#: parser.yy:1156 msgid "need \\paper for paper block" -msgstr "heb \\paper nodig voor paper blok" +msgstr "heb \\paper nodig voor een blok van het type paper" + +#: parser.yy:1331 +msgid "music expected" +msgstr "muziek werd verwacht" -#: parser.yy:1033 parser.yy:1055 +#: parser.yy:1341 parser.yy:1375 msgid "unexpected post-event" msgstr "onverwachte na-gebeurtenis" -#: parser.yy:1063 +#: parser.yy:1383 msgid "Ignoring non-music expression" -msgstr "Negeren van non-muziekexpressie" +msgstr "Niet-muzikale expressie wordt genegeerd" -#: parser.yy:1075 parser.yy:2493 -msgid "music expected" -msgstr "muziek verwacht" - -#: parser.yy:1370 +#: parser.yy:1691 msgid "not a symbol" msgstr "is geen symbool" -#: parser.yy:2182 parser.yy:2296 parser.yy:2309 parser.yy:2318 +#: parser.yy:2491 parser.yy:2605 parser.yy:2618 parser.yy:2627 msgid "bad grob property path" -msgstr "" +msgstr "ongeldig pad voor grob-eigenschap" -#: parser.yy:2276 +#: parser.yy:2585 msgid "only \\consists and \\remove take non-string argument." -msgstr "" +msgstr "alleen \\consists en \\remove nemen een argument dat geen tekenreeks is." -#: parser.yy:2337 +#: parser.yy:2646 msgid "bad context property path" -msgstr "" +msgstr "ongeldig pad voor contexteigenschap" -#: parser.yy:2438 +#: parser.yy:2733 msgid "simple string expected" -msgstr "eenvoudige tekenreeks verwacht" +msgstr "eenvoudige tekenreeks werd verwacht" -#: parser.yy:2456 +#: parser.yy:2750 msgid "symbol expected" -msgstr "symbool verwacht" +msgstr "symbool werd verwacht" -#: parser.yy:2611 +#: parser.yy:2886 msgid "not a rhythmic event" msgstr "is geen ritmische gebeurtenis" -#: parser.yy:2685 +#: parser.yy:2936 msgid "post-event expected" -msgstr "" +msgstr "na-gebeurtenis werd verwacht" -#: parser.yy:2694 parser.yy:2699 +#: parser.yy:2945 parser.yy:2950 msgid "have to be in Lyric mode for lyrics" msgstr "moet in Lyric-modus zijn voor liedteksten" -#: parser.yy:2767 -msgid "expecting string as script definition" -msgstr "verwacht tekenreeks voor scriptdefinitie" +#: parser.yy:3026 +msgid "expecting string or post-event as script definition" +msgstr "verwachtte tekenreeks of na-gebeurtenis voor scriptdefinitie" -#: parser.yy:2875 +#: parser.yy:3130 msgid "not an articulation" -msgstr "is geen articulatie" +msgstr "is geen articulatieteken" -#: parser.yy:2947 parser.yy:2990 -#, fuzzy +#: parser.yy:3202 parser.yy:3245 msgid "not a duration" -msgstr "geen duur: %d" +msgstr "is geen tijdsduur" -#: parser.yy:3007 -#, fuzzy +#: parser.yy:3266 msgid "bass number expected" -msgstr "symbool verwacht: ~S" +msgstr "verwachtte een cijfer voor de bas" -#: parser.yy:3106 +#: parser.yy:3358 msgid "have to be in Note mode for notes" -msgstr "moet in Note modus zijn voor noten" +msgstr "moet in Note-modus zijn voor noten" -#: parser.yy:3166 +#: parser.yy:3397 msgid "have to be in Chord mode for chords" -msgstr "moet in Chord modus zijn voor accoorden" +msgstr "moet in Chord-modus zijn voor akkoorden" -#: parser.yy:3181 +#: parser.yy:3440 msgid "markup outside of text script or \\lyricmode" -msgstr "" +msgstr "mark-up buiten tekstscript of \\lyricmode" -#: parser.yy:3186 +#: parser.yy:3445 msgid "unrecognized string, not in text script or \\lyricmode" -msgstr "" +msgstr "niet-herkende tekenreeks, niet in tekstscript of \\lyricmode" -#: parser.yy:3347 parser.yy:3356 +#: parser.yy:3597 parser.yy:3606 msgid "not an unsigned integer" -msgstr "" +msgstr "is geen tekenloos geheel getal" -#: parser.yy:3424 +#: parser.yy:3693 msgid "not a markup" -msgstr "" +msgstr "is geen mark-up" -#: lexer.ll:224 +#: lexer.ll:193 msgid "stray UTF-8 BOM encountered" msgstr "losse UTF-8 BOM tegengekomen" -#: lexer.ll:227 +#: lexer.ll:196 msgid "Skipping UTF-8 BOM" msgstr "Overslaan van UTF-8 BOM" -#: lexer.ll:279 +#: lexer.ll:248 #, c-format msgid "Renaming input to: `%s'" -msgstr "Hernoem invoer naar: `%s'" +msgstr "Hernoemen van invoer naar: '%s'" -#: lexer.ll:296 +#: lexer.ll:265 msgid "quoted string expected after \\version" msgstr "tekst tussen aanhalingstekens verwacht na \\version" -#: lexer.ll:300 +#: lexer.ll:269 msgid "quoted string expected after \\sourcefilename" msgstr "tekst tussen aanhalingstekens verwacht na \\sourcefilename" -#: lexer.ll:304 +#: lexer.ll:273 msgid "integer expected after \\sourcefileline" msgstr "geheel getal verwacht na \\sourcefileline" -#: lexer.ll:331 +#: lexer.ll:300 msgid "\\maininput not allowed outside init files" -msgstr "\\maininput niet toegestaan buiten init bestanden" +msgstr "\\maininput niet toegestaan buiten init-bestanden" -#: lexer.ll:355 +#: lexer.ll:324 #, c-format msgid "wrong or undefined identifier: `%s'" -msgstr "verkeerde of ongedefiniëerde identifier: `%s'" +msgstr "verkeerde of ongedefinieerde variabelenaam: '%s'" -#: lexer.ll:381 -#, fuzzy +#: lexer.ll:349 msgid "string expected after \\include" -msgstr "tekst tussen aanhalingstekens verwacht na \\version" +msgstr "tekenreeks werd verwacht na \\include" -#: lexer.ll:391 +#: lexer.ll:359 msgid "end quote missing" -msgstr "aanhalingstekens sluite mist" +msgstr "afsluitend aanhalingsteken ontbreekt" -#: lexer.ll:743 +#: lexer.ll:714 msgid "EOF found inside a comment" -msgstr "EOF gevonden in een kommentaar" +msgstr "EOF gevonden in een commentaar" -#: lexer.ll:748 -#, fuzzy +#: lexer.ll:719 msgid "EOF found inside string" -msgstr "EOF gevonden in een kommentaar" +msgstr "EOF gevonden in een tekenreeks" -#: lexer.ll:763 +#: lexer.ll:734 msgid "Unfinished main input" -msgstr "" +msgstr "Onafgesloten hoofdinvoer" -#: lexer.ll:834 -#, fuzzy, c-format +#: lexer.ll:805 +#, c-format msgid "invalid character: `%s'" -msgstr "ongeldig teken: `%c'" +msgstr "ongeldig teken: '%s'" -#: lexer.ll:963 +#: lexer.ll:925 #, c-format msgid "unknown escaped string: `\\%s'" -msgstr "onbekende ontsnapte string: `\\%s'" +msgstr "onbekende escape-tekenreeks: '\\%s'" -#: lexer.ll:983 +#: lexer.ll:945 #, c-format msgid "undefined character or shorthand: %s" -msgstr "" +msgstr "teken of afkorting is ongedefinieerd: %s" -#: lexer.ll:1275 +#: lexer.ll:1236 msgid "non-UTF-8 input" -msgstr "" +msgstr "invoer is geen UTF-8" + +#: lexer.ll:1280 +#, c-format +msgid "Invalid version string \"%s\"" +msgstr "Ongeldige versietekenreeks \"%s\"" -#: lexer.ll:1319 +#: lexer.ll:1285 #, c-format msgid "file too old: %s (oldest supported: %s)" msgstr "bestand te oud: %s (oudste ondersteund: %s)" -#: lexer.ll:1320 +#: lexer.ll:1286 msgid "consider updating the input with the convert-ly script" -msgstr "overweeg het actualiseren van de invoer met het convert-ly script" +msgstr "overweeg het actualiseren van de invoer met het script convert-ly" -#: lexer.ll:1326 +#: lexer.ll:1292 #, c-format msgid "program too old: %s (file requires: %s)" -msgstr "programma te oud: %s (bestand vereist: %s)" +msgstr "programma is te oud: %s (bestand vereist %s)" + +#: auto-beam.scm:147 +msgid "Beam end fits no pattern" +msgstr "Waardestreepeinde stemt niet met een patroon overeen" #: backend-library.scm:27 #, scheme-format @@ -3342,215 +3427,217 @@ msgid "`~a' failed (~a)\n" msgstr "'~a' is mislukt (~a)\n" # lisp-format -#: backend-library.scm:93 -#, fuzzy, scheme-format +#: backend-library.scm:108 +#, scheme-format msgid "Converting to `~a'...\n" -msgstr "Converteren naar `~a'..." +msgstr "Converteren naar '~a'...\n" # lisp-format #. Do not try to guess the name of the png file, #. GS produces PNG files like BASE-page%d.png. -#: backend-library.scm:102 +#: backend-library.scm:118 #, scheme-format msgid "Converting to ~a..." msgstr "Converteren naar ~a..." -#: backend-library.scm:140 +# lisp-format +#: backend-library.scm:134 +#, scheme-format +msgid "Copying to `~a'...\n" +msgstr "Kopiëren naar '~a'...\n" + +# lisp-format +#: backend-library.scm:200 +#, scheme-format +msgid "Deleting `~a'...\n" +msgstr "Verwijderen van '~a'...\n" + +#: backend-library.scm:219 #, scheme-format msgid "Writing header field `~a' to `~a'..." -msgstr "Schrijven van header veld `~a' naar `~a'..." +msgstr "Schrijven van koptekstveld '~a' naar '~a'..." -#: backend-library.scm:189 +#: backend-library.scm:268 #, scheme-format msgid "missing stencil expression `~S'" -msgstr "" +msgstr "ontbrekende stencil-expressie '~S'" #: bar-line.scm:133 #, scheme-format msgid "Bar glyph ~a not known. Ignoring." -msgstr "Maatglief ~a is onbekend. Genegeerd." +msgstr "Maatstreepsymbool ~a is onbekend. Genegeerd." #: bar-line.scm:161 #, scheme-format msgid "Annotation '~a' is allowed in the first argument of a bar line definition only." -msgstr "" +msgstr "Aantekening '~a' wordt enkel toegestaan in het eerste argument van de definitie van een maatstreep." #: bar-line.scm:169 #, scheme-format msgid "Replacement '~a' is allowed in the last argument of a bar line definition only." -msgstr "" +msgstr "Vervanging '~a' wordt enkel toegestaan in het laatste argument van de definitie van een maatstreep." #: bar-line.scm:230 #, scheme-format msgid "add-bar-glyph-print-procedure: glyph '~a' has to be a single ASCII character." -msgstr "" +msgstr "add-bar-glyph-print-procedure: symbool '~a' moet een enkelvoudig ASCII-teken zijn." #: bar-line.scm:795 #, scheme-format msgid "No span bar glyph defined for bar glyph '~a'; ignoring." -msgstr "" +msgstr "Geen overspanningsstreepsymbool gedefinieerd voor streepsymbool '~a'; genegeerd." #: chord-entry.scm:52 #, scheme-format msgid "Spurious garbage following chord: ~A" -msgstr "" +msgstr "Schijnbaar staat er rommel na akkoord: ~A" #: define-context-properties.scm:31 define-grob-properties.scm:21 #: define-music-properties.scm:21 #, scheme-format msgid "symbol ~S redefined" -msgstr "symbool ~S hergedefiniëerd" +msgstr "symbool ~S is geherdefinieerd" -#: define-event-classes.scm:73 -#, fuzzy, scheme-format +#: define-event-classes.scm:74 +#, scheme-format msgid "unknown parent class `~a'" -msgstr "Onbekende gebeurtenis klasse `%s'" +msgstr "onbekende moederklasse '~a'" -#: define-event-classes.scm:107 -#, fuzzy, scheme-format +#: define-event-classes.scm:108 +#, scheme-format msgid "Cannot redefine event class `~S'" -msgstr "Onbekende gebeurtenis klasse `%s'" +msgstr "Kan gebeurtenisklasse '~S' niet herdefiniëren" -#: define-event-classes.scm:109 -#, fuzzy, scheme-format +#: define-event-classes.scm:110 +#, scheme-format msgid "Undefined parent event class `~S'" -msgstr "Onbekende gebeurtenis klasse `%s'" +msgstr "Ongedefinieerde moedergebeurtenisklasse '~S'" -#: define-markup-commands.scm:1083 +#: define-markup-commands.scm:1098 msgid "no systems found in \\score markup, does it have a \\layout block?" -msgstr "geen systemen gevonden in \\score markup; heeft het een \\layout blok?" +msgstr "geen systemen gevonden in de mark-up van \\score; heeft het een blok van het type \\layout?" -#: define-markup-commands.scm:2847 +#: define-markup-commands.scm:2922 #, scheme-format msgid "Cannot find glyph ~a" -msgstr "Kan glief ~a niet vinden" +msgstr "Kan symbool ~a niet vinden" -#: define-markup-commands.scm:3273 -#, fuzzy, scheme-format +# FIXME: trailing space? +#: define-markup-commands.scm:3398 +#, scheme-format msgid "no brace found for point size ~S " -msgstr "geen plaatsing gevonden voor vingers" +msgstr "geen accolade gevonden voor puntgrootte ~S " -#: define-markup-commands.scm:3274 +#: define-markup-commands.scm:3399 #, scheme-format msgid "defaulting to ~S pt" -msgstr "" +msgstr "de standaard van ~S pt wordt gebruikt" -#: define-markup-commands.scm:3526 +#: define-markup-commands.scm:3643 #, scheme-format msgid "not a valid duration string: ~a" -msgstr "geen geldige duurtekst: ~a" +msgstr "geen geldige aanduiding van een tijdsduur: ~a" -#: define-markup-commands.scm:3737 -#, fuzzy, scheme-format +#: define-markup-commands.scm:3854 +#, scheme-format msgid "not a valid duration string: ~a - ignoring" -msgstr "geen geldige duurtekst: ~a" +msgstr "geen geldige aanduiding van een tijdsduur: ~a -> genegeerd" -#: define-music-types.scm:792 +#: define-music-types.scm:803 #, scheme-format msgid "symbol expected: ~S" -msgstr "symbool verwacht: ~S" +msgstr "symbool werd verwacht: ~S" -#: define-music-types.scm:795 +#: define-music-types.scm:806 #, scheme-format msgid "cannot find music object: ~S" msgstr "kan muziekobject niet vinden: ~S" -#: define-music-types.scm:815 +#: define-music-types.scm:826 #, scheme-format msgid "bad make-music argument: ~S" -msgstr "" - -#: define-music-types.scm:827 -#, scheme-format -msgid "unknown repeat type `~S'" -msgstr "onbekend herhaaltype `~S'" - -#: define-music-types.scm:828 -#, fuzzy -msgid "See define-music-types.scm for supported repeats" -msgstr "Zie music-types.scm voor ondersteunde herhalingen" +msgstr "foutief argument voor make-music: ~S" -#: define-note-names.scm:972 +#: define-note-names.scm:1000 msgid "Select note names language." -msgstr "" +msgstr "Selecteer een taal voor de nootnamen." -#: define-note-names.scm:978 +#: define-note-names.scm:1006 #, scheme-format msgid "Using `~a' note names..." -msgstr "" +msgstr "Nootnamen in het '~a' worden gebruikt..." -#: define-note-names.scm:981 +#: define-note-names.scm:1009 #, scheme-format msgid "Could not find language `~a'. Ignoring." -msgstr "" +msgstr "Kan taal '~a' niet vinden. Genegeerd." -#: document-backend.scm:132 +#: document-backend.scm:135 #, scheme-format msgid "pair expected in doc ~s" -msgstr "paar verwacht in doc ~s" +msgstr "een paar werd verwacht in doc ~s" -#: document-backend.scm:189 +#: document-backend.scm:202 #, scheme-format msgid "cannot find interface for property: ~S" -msgstr "kan grob bediening voor eigenschap niet vinden: ~S" +msgstr "kan geen interface vinden voor eigenschap: ~S" -#: document-backend.scm:199 +#: document-backend.scm:212 #, scheme-format msgid "unknown Grob interface: ~S" -msgstr "onbekende Grob bediening: ~S" +msgstr "onbekende Grob-interface: ~S" -#: documentation-lib.scm:59 +#: documentation-lib.scm:62 #, scheme-format msgid "Processing ~S..." msgstr "Verwerken van ~S..." -#: documentation-lib.scm:176 +#: documentation-lib.scm:178 #, scheme-format msgid "Writing ~S..." msgstr "Schrijven van ~S..." -#: documentation-lib.scm:188 -#, fuzzy, scheme-format +#: documentation-lib.scm:190 +#, scheme-format msgid "cannot find description for property `~S' (~S)" -msgstr "kan beschrijving voor eigenschap niet vinden ~S (~S)" +msgstr "kan omschrijving voor eigenschap '~S' niet vinden (~S)" -#: documentation-lib.scm:209 +#: documentation-lib.scm:211 #, scheme-format msgid "cannot find description for property ~S (~S)" -msgstr "kan beschrijving voor eigenschap niet vinden ~S (~S)" +msgstr "kan omschrijving voor eigenschap ~S niet vinden (~S)" -#: flag-styles.scm:162 -#, fuzzy, scheme-format +#: flag-styles.scm:155 +#, scheme-format msgid "flag stroke `~a' or `~a' not found" -msgstr "vlag streep `%s' niet gevonden" +msgstr "vlagstreep '~a' of '~a' is niet gevonden" -#: framework-eps.scm:108 +#: framework-eps.scm:112 #, scheme-format msgid "Writing ~a..." msgstr "Schrijven van ~a..." -#: framework-ps.scm:250 +#: framework-ps.scm:281 #, scheme-format msgid "cannot embed ~S=~S" -msgstr "kan niet inbedden ~S=~S" +msgstr "insluiten kan niet: ~S=~S" -#: framework-ps.scm:293 +#: framework-ps.scm:324 #, scheme-format msgid "cannot extract file matching ~a from ~a" -msgstr "kan bestand dat past op ~a niet uit ~a extraheren" +msgstr "kan bestand dat met ~a overeenkomt niet uit ~a extraheren" -#: framework-ps.scm:311 +#: framework-ps.scm:342 #, scheme-format msgid "do not know how to embed ~S=~S" -msgstr "weet niet hoe ~S=~S in te bedden" +msgstr "weet niet hoe in te sluiten: ~S=~S" -#: framework-ps.scm:336 +#: framework-ps.scm:367 #, scheme-format msgid "do not know how to embed font ~s ~s ~s" -msgstr "weet niet hoe font in te bedden: ~s ~s ~s" +msgstr "weet niet hoe lettertype in te sluiten: ~s ~s ~s" -#: framework-ps.scm:687 -#, fuzzy +#: framework-ps.scm:723 msgid "" "\n" "The PostScript backend does not support the\n" @@ -3566,347 +3653,405 @@ msgid "" " %% ****************************************************************\n" msgstr "" "\n" -"Het PostScript backend ondersteund geen system-by-system uitvoer.\n" -"Gebruik daarvoor het EPS backend\n" +"Het PostScript-backend ondersteunt geen uitvoer van systeem per systeem.\n" +"Gebruik daarvoor het EPS-backend:\n" "\n" -" lilypond -b eps BESTAND\n" +" lilypond -dbackend=eps BESTAND\n" "\n" -"Als LilyPond fragment van een webpagina is gecopiëerd, weet zeker\n" -"dat alleen alles voorafgaand aan\n" +"Als u een LilyPond-fragment van een webpagina hebt gekopieerd,\n" +"verwijder dan alleen alles voorafgaand aan:\n" "\n" " %% ****************************************************************\n" " %% Start cut-&-pastable-section\n" " %% ****************************************************************\n" -"\n" -"is verwijderd\n" #: framework-svg.scm:84 #, scheme-format msgid "Updating font into: ~a" -msgstr "" +msgstr "Bijwerken van lettertype in: ~a" #: graphviz.scm:64 #, scheme-format msgid "Writing graph `~a'..." -msgstr "Schrijven van graph `~a'..." +msgstr "Schrijven van graaf '~a'..." #: layout-beam.scm:40 #, scheme-format msgid "Error in beam quanting. Expected (~S,~S) found ~S." -msgstr "Fout in waardestreep kwantisering. Verwacht (~S,~S) gevonden ~S." +msgstr "Fout in waardestreepdefiniëring. Verwachtte (~S,~S), gevonden werd ~S." #: layout-beam.scm:54 #, scheme-format msgid "Error in beam quanting. Expected ~S 0, found ~S." -msgstr "Fout in waardestreep kwantisering. Verwacht ~S 0, gevonden ~S." +msgstr "Fout in waardestreepdefiniëring. Verwachtte ~S 0, gevonden werd ~S." #: lily-library.scm:333 msgid "Music unsuitable for context-mod" -msgstr "" +msgstr "Muziek is niet geschikt voor context-mod" #: lily-library.scm:388 -#, fuzzy, scheme-format +#, scheme-format msgid "Cannot find context-def \\~a" -msgstr "kan `%s' niet wisselen in `%s'" +msgstr "Kan contextdefinitie \\~a niet vinden" #: lily-library.scm:404 msgid "Music unsuitable for output-def" -msgstr "" +msgstr "Muziek is niet geschikt voor output-def" -#: lily-library.scm:884 +#: lily-library.scm:904 msgid "" "Find the index between @var{start} and @var{end} (an integer)\n" "which produces the closest match to @var{target-val} if\n" "applied to function @var{getter}." msgstr "" +"Vind de index die ligt tussen @var{start} en @var{end} (een geheel getal)\n" +"en die @var{target-val} het dichtst benadert als hij op de functie\n" +"@var{getter} toegepast wordt." -#: lily-library.scm:955 +#: lily-library.scm:998 #, scheme-format msgid "unknown unit: ~S" msgstr "onbekende eenheid: ~S" -#: lily-library.scm:980 +#: lily-library.scm:1023 #, scheme-format msgid "no \\version statement found, please add~afor future compatibility" -msgstr "geen \\version uitdrukking gevonden, voeg~atoe voor toekomstige compatibiliteit" +msgstr "geen statement \\version gevonden; voeg ~a toe voor toekomstige compatibiliteit" -#: lily.scm:75 +#: lily.scm:93 msgid "call-after-session used after session start" -msgstr "" +msgstr "call-after-session werd gebruikt nadat de sessie gestart was" -#: lily.scm:93 +#: lily.scm:111 msgid "define-session used after session start" -msgstr "" +msgstr "define-session werd gebruikt nadat de sessie gestart was" -#: lily.scm:393 +#: lily.scm:417 msgid "Using (ice-9 curried-definitions) module\n" -msgstr "" +msgstr "Module (ice-9 curried-definitions) wordt gebruikt\n" -#: lily.scm:396 +#: lily.scm:420 msgid "Guile 1.8\n" -msgstr "" +msgstr "Guile 1.8\n" -#: lily.scm:455 +#: lily.scm:477 #, scheme-format msgid "cannot find: ~A" -msgstr "kan niet vinden: ~A" +msgstr "kan ~A niet vinden" -#: lily.scm:878 +#: lily.scm:903 msgid "Success: compilation successfully completed" -msgstr "" +msgstr "Gelukt: compilatie is met succes voltooid" -#: lily.scm:879 +#: lily.scm:904 msgid "Compilation completed with warnings or errors" -msgstr "" +msgstr "Compilatie werd voltooid met waarschuwingen of fouten" -#: lily.scm:940 +#: lily.scm:965 #, scheme-format msgid "job ~a terminated with signal: ~a" -msgstr "taak ~a beëindigd met met signaal: ~a" +msgstr "taak ~a is beëindigd met signaal: ~a" -#: lily.scm:943 +#: lily.scm:968 #, scheme-format msgid "" "logfile ~a (exit ~a):\n" "~a" msgstr "" -"logfile ~a (exit ~a):\n" +"logbestand ~a (afsluitcode ~a):\n" "~a" -#: lily.scm:965 lily.scm:1054 +#: lily.scm:990 lily.scm:1079 #, scheme-format msgid "failed files: ~S" -msgstr "gefaalde bestanden: ~S" +msgstr "mislukte bestanden: ~S" # lisp-format -#: lily.scm:1045 +#: lily.scm:1070 #, scheme-format msgid "Redirecting output to ~a..." msgstr "Omleiden van uitvoer naar ~a..." -#: lily.scm:1064 ps-to-png.scm:66 +#: lily.scm:1089 #, scheme-format msgid "Invoking `~a'...\n" -msgstr "Aanroepen van '~a'...\n" +msgstr "Uitvoeren van '~a'...\n" -#: ly-syntax-constructors.scm:66 +#: ly-syntax-constructors.scm:27 #, scheme-format msgid "~a function cannot return ~a" -msgstr "" +msgstr "een ~a-functie kan geen terugkeerwaarde ~a hebben" -#: ly-syntax-constructors.scm:75 +#: ly-syntax-constructors.scm:60 #, scheme-format msgid "wrong type for argument ~a. Expecting ~a, found ~s" -msgstr "verkeert type voor argument ~a. Verwacht ~a, gevonden ~s" - -#: ly-syntax-constructors.scm:199 -#, scheme-format -msgid "Invalid property operation ~a" -msgstr "Ongeldige eigenschap operatie ~a" +msgstr "Verkeerd type voor argument ~a. Verwachtte ~a, gevonden werd ~s" #: markup-macros.scm:331 #, scheme-format msgid "Wrong number of arguments. Expect: ~A, found ~A: ~S" -msgstr "verkeerd aantal argumenten. Verwacht: ~A, gevonden ~A: ~S" +msgstr "Verkeerd aantal argumenten. Verwachtte ~A, gevonden werd ~A: ~S" #: markup-macros.scm:337 #, scheme-format msgid "Invalid argument in position ~A. Expect: ~A, found: ~S." -msgstr "Ongeldig argument in positie ~A. Verwach: ~A, gevonden: ~S." +msgstr "Ongeldig argument op positie ~A. Verwachtte: ~A, gevonden werd: ~S." #: markup-macros.scm:373 #, scheme-format msgid "Not a markup command: ~A" -msgstr "" +msgstr "Geen mark-upcommando: ~A" #: modal-transforms.scm:38 msgid "'from' pitch not in scale; ignoring" -msgstr "" +msgstr "'bron'-toonhoogte niet in toonladder; genegeerd" #: modal-transforms.scm:42 modal-transforms.scm:75 msgid "'to' pitch not in scale; ignoring" -msgstr "" +msgstr "'doel'-toonhoogte niet in toonladder; genegeerd" #: modal-transforms.scm:46 msgid "pitch to be transposed not in scale; ignoring" -msgstr "" +msgstr "om te zetten toonhoogte niet in toonladder; genegeerd" #: modal-transforms.scm:71 msgid "'around' pitch not in scale; ignoring" -msgstr "" +msgstr "'spil'-toonhoogte niet in toonladder; genegeerd" #: modal-transforms.scm:79 msgid "pitch to be inverted not in scale; ignoring" -msgstr "" +msgstr "om te keren toonhoogte niet in toonladder; genegeerd" #: modal-transforms.scm:95 msgid "negative replication count; ignoring" -msgstr "" +msgstr "kopieaantal is negatief; genegeerd" -#: music-functions.scm:272 -msgid "More alternatives than repeats. Junking excess alternatives" -msgstr "Meer alternatieven dan herhalingen. Overtollige alternatieven worden weggegooid." - -#: music-functions.scm:303 +#: music-functions.scm:319 #, scheme-format msgid "invalid tremolo repeat count: ~a" -msgstr "ongeldig tremolo-herhalingsaantal: ~a" +msgstr "ongeldig aantal tremoloherhalingen: ~a" -#: music-functions.scm:459 +#: music-functions.scm:348 +#, scheme-format +msgid "unknown repeat type `~S': must be volta, unfold, percent, or tremolo" +msgstr "onbekend herhalingstype '~S': moet 'volta', 'unfold', 'percent', of 'tremolo' zijn" + +#: music-functions.scm:352 +msgid "More alternatives than repeats. Junking excess alternatives" +msgstr "Meer alternatieven dan herhalingen. Overtollige alternatieven zijn weggegooid." + +#: music-functions.scm:487 #, scheme-format msgid "bad grob property path ~a" -msgstr "ongeldig grob-eigenschappad ~a" +msgstr "foutief pad voor grob-eigenschap: ~a" -#: music-functions.scm:753 +#: music-functions.scm:511 +#, scheme-format +msgid "bad context property ~a" +msgstr "foutieve contexteigenschap ~a" + +#: music-functions.scm:534 +#, scheme-format +msgid "bad music property ~a" +msgstr "foutieve muziekeigenschap ~a" + +#: music-functions.scm:840 msgid "Bad chord repetition" -msgstr "Ongeldige akkoordherhaling" +msgstr "Foutieve akkoordherhaling" -#: music-functions.scm:788 +#: music-functions.scm:945 #, scheme-format msgid "music expected: ~S" -msgstr "muziek verwacht: ~S" +msgstr "muziek werd verwacht: ~S" -#: music-functions.scm:1144 +#: music-functions.scm:1295 #, scheme-format msgid "cannot find quoted music: `~S'" msgstr "kan aangehaalde muziek niet vinden: '~S'" -#: music-functions.scm:1282 +#: music-functions.scm:1432 msgid "Add @var{octave-shift} to the octave of @var{pitch}." -msgstr "" +msgstr "Toevoegen van @var{octave-shift} aan het octaaf van @var{pitch}." -# XXX trailing space -#: music-functions.scm:1342 +# FIXME: trailing space? +#: music-functions.scm:1495 #, scheme-format msgid "Unknown octaveness type: ~S " -msgstr "onbekend octaafheidstype: ~S " +msgstr "Onbekend type octaaf: ~S " -# XXX stray apostrophe -#: music-functions.scm:1343 +# FIXME: stray apostrophe? +#: music-functions.scm:1496 msgid "Defaulting to 'any-octave." -msgstr "" +msgstr "De standaard 'any-octave wordt nu gebruikt." -# XXX what does accidental mean? -#: music-functions.scm:1688 -#, fuzzy, scheme-format +# FIXME: what does accidental mean? +#: music-functions.scm:1888 +#, scheme-format msgid "unknown accidental style: ~S" -msgstr "onbekende toevallige stijl: ~S" +msgstr "onbekende stijl voor accident: ~S" -#: output-ps.scm:278 output-svg.scm:539 +#: music-functions.scm:2098 +msgid "Missing duration" +msgstr "Ontbrekende duur" + +#: music-functions.scm:2626 +#, scheme-format +msgid "not a symbol list: ~a" +msgstr "is geen symbolenlijst: ~a" + +#: music-functions.scm:2629 +#, scheme-format +msgid "conflicting tag group ~a" +msgstr "tegenstrijdige kentekengroep ~a" + +#: output-ps.scm:290 output-svg.scm:539 #, scheme-format msgid "unknown line-cap-style: ~S" -msgstr "onbekende lijnkopstijl: ~S" +msgstr "onbekende line-cap-style: ~S" -#: output-ps.scm:283 output-svg.scm:545 +#: output-ps.scm:295 output-svg.scm:545 #, scheme-format msgid "unknown line-join-style: ~S" -msgstr "onbekende lijnverbindingsstijl: ~S" +msgstr "onbekende line-join-style: ~S" #: output-svg.scm:148 #, scheme-format msgid "cannot decypher Pango description: ~a" -msgstr "kan Pango-font-omschrijving niet ontcijferen: ~a" +msgstr "kan Pango-omschrijving niet ontcijferen: ~a" -# XXX capitalize Unicode +# FIXME: capitalize Unicode #: output-svg.scm:228 msgid "Glyph must have a unicode value" -msgstr "Glief moet een Unicode-waarde hebben" +msgstr "Symbool moet een Unicode-waarde hebben" #: output-svg.scm:280 output-svg.scm:290 #, scheme-format msgid "cannot find SVG font ~S" -msgstr "kan SVG-font ~S niet vinden" +msgstr "kan SVG-lettertype ~S niet vinden" -#: paper.scm:120 +#: paper.scm:121 msgid "set-global-staff-size: not in toplevel scope" -msgstr "set-global-staff-size: niet op topniveau" +msgstr "set-global-staff-size: niet in het hoogste geldigheidsbereik" -#: paper.scm:320 +#: paper.scm:321 #, scheme-format msgid "This is not a \\layout {} object, ~S" -msgstr "Dit is geen \\layout {} object, ~S" +msgstr "Dit is geen object van het type \\layout {}, ~S" -#: paper.scm:328 +#: paper.scm:329 #, scheme-format msgid "Unknown paper size: ~a" msgstr "Onbekende papiergrootte: ~a" #. TODO: should raise (generic) exception with throw, and catch #. that in parse-scm.cc -#: paper.scm:347 +#: paper.scm:348 msgid "Must use #(set-paper-size .. ) within \\paper { ... }" msgstr "Moet #(set-paper-size .. ) gebruiken in \\paper { ... }" -#: parser-clef.scm:164 +#: parser-clef.scm:154 #, scheme-format msgid "unknown clef type `~a'" msgstr "onbekend sleuteltype '~a'" -#: parser-clef.scm:165 +#: parser-clef.scm:155 #, scheme-format msgid "supported clefs: ~a" msgstr "ondersteunde sleutels: ~a" -#: parser-ly-from-scheme.scm:74 +#: parser-ly-from-scheme.scm:73 msgid "error in #{ ... #}" msgstr "fout in #{ ... #}" -#: part-combiner.scm:598 +#: part-combiner.scm:894 #, scheme-format msgid "quoted music `~a' is empty" msgstr "aangehaalde muziek '~a' is leeg" -#: ps-to-png.scm:70 +# lisp-format +#: ps-to-png.scm:72 ps-to-png.scm:75 +#, scheme-format +msgid "Copying `~a' to `~a'..." +msgstr "Kopiëren van '~a' naar '~a'..." + +#: ps-to-png.scm:77 ps-to-png.scm:79 #, scheme-format -msgid "~a exited with status: ~S" -msgstr "~a sloot af met status ~S" +msgid "Deleting `~a'..." +msgstr "Verwijderen van '~a'..." #: to-xml.scm:190 #, scheme-format msgid "assertion failed: ~S" msgstr "controletest is mislukt: ~S" -#: translation-functions.scm:368 +#: translation-functions.scm:389 #, scheme-format msgid "Negative fret for pitch ~a on string ~a" msgstr "Negatieve fret voor toonhoogte ~a op snaar ~a" -#: translation-functions.scm:371 +#: translation-functions.scm:392 #, scheme-format msgid "Missing fret for pitch ~a on string ~a" msgstr "Ontbrekende fret voor toonhoogte ~a op snaar ~a" -#: translation-functions.scm:414 +#: translation-functions.scm:435 #, scheme-format msgid "No open string for pitch ~a" -msgstr "Geen vrije snaar voor toonhoogte ~a" +msgstr "Geen mogelijke snaar voor toonhoogte ~a" -#: translation-functions.scm:429 translation-functions.scm:441 +#: translation-functions.scm:450 translation-functions.scm:462 #, scheme-format msgid "Requested string for pitch requires negative fret: string ~a pitch ~a" -msgstr "Gevraagde snaar voor toonhoogte vereist negatieve fret: snaar ~a, toonhoogte ~a" +msgstr "De voor de toonhoogte gevraagde snaar vereist een negatieve fret: snaar ~a toonhoogte ~a" -#: translation-functions.scm:432 +#: translation-functions.scm:453 msgid "Ignoring string request and recalculating." -msgstr "Snaarverzoek wordt genegeerd; er wordt herberekend." +msgstr "De gevraagde snaar wordt genegeerd en de berekening wordt opnieuw uitgevoerd." -#: translation-functions.scm:444 +#: translation-functions.scm:465 msgid "Ignoring note in tablature." -msgstr "" +msgstr "Noot in tabulatuur wordt genegeerd." -#: translation-functions.scm:469 +#: translation-functions.scm:490 #, scheme-format msgid "No string for pitch ~a (given frets ~a)" -msgstr "Geen snaar voor toonhoogte ~a (gegeven de frets ~a)" +msgstr "Geen snaar voor toonhoogte ~a (gezien de frets ~a)" -#: translation-functions.scm:574 +#: translation-functions.scm:595 #, scheme-format msgid "" "No label for fret ~a (on string ~a);\n" "only ~a fret labels provided" msgstr "" "Geen label voor fret ~a (op snaar ~a);\n" -"slechts ~a fret-labels gegeven" +"er zijn slechts ~a fretlabels voorzien." + +#~ msgid "cannot change, already in translator: %s" +#~ msgstr "kan niet wisselen, al in vertaler: %s" + +#~ msgid "cannot find Voice `%s'" +#~ msgstr "kan Voice niet vinden: `%s'" + +#~ msgid "(normalized pitch)" +#~ msgstr "(genormaliseerde toonhoogte)" + +#~ msgid "Transposing %s by %s makes alteration larger than double" +#~ msgstr "Transponeren van %s met %s maakt verandering groter dan dubbel" + +#~ msgid "ignoring too many clashing note columns" +#~ msgstr "negeren van te veel botsende nootkolommen" + +#~ msgid "time signature symbol `%s' not found; reverting to numbered style" +#~ msgstr "maatsoort-symbool '%s' niet gevonden; teruggevallen op numerieke stijl" + +#~ msgid "score expected" +#~ msgstr "partituur verwacht" + +#~ msgid "Invalid property operation ~a" +#~ msgstr "Ongeldige eigenschap operatie ~a" + +#~ msgid "~a exited with status: ~S" +#~ msgstr "~a sloot af met status: ~S" #~ msgid "Report bugs via" #~ msgstr "" @@ -4087,18 +4232,9 @@ msgstr "" #~ msgid "undefined: ~S" #~ msgstr "ongedefiniëerd: ~S" -#~ msgid "lilylib module" -#~ msgstr "lilylib module" - -#~ msgid "print this help" -#~ msgstr "toon deze hulp" - #~ msgid "Binary %s has version %s, looking for version %s" #~ msgstr "Binair programma %s heeft versie %s, zocht naar versie %s" -#~ msgid "`%s' failed (%s)" -#~ msgstr "`%s' gefaald (%s)" - #~ msgid "(ignored)" #~ msgstr "(genegeerd)" @@ -4126,9 +4262,6 @@ msgstr "" #~ msgid "print version information" #~ msgstr "toon versie informatie" -#~ msgid "getopt says: `%s'" -#~ msgstr "getopt zegt: `%s'" - #~ msgid "Run LilyPond, add titles, generate printable document." #~ msgstr "Draai LilyPond, voeg titels toe, genereer af te drukken dokument." @@ -4150,9 +4283,6 @@ msgstr "" #~ msgid "don't run LilyPond" #~ msgstr "draai LilyPond niet" -#~ msgid "produce MIDI output only" -#~ msgstr "produceer alleen MIDI uitvoer" - #~ msgid "set the resolution of the preview to RES" #~ msgstr "zet de resolutie voor het testbeeld op RES" @@ -4289,9 +4419,6 @@ msgstr "" #~ msgid "beam has less than two visible stems" #~ msgstr "waardestreep heeft minder dan twee zichtbare stokken" -#~ msgid "I'm one myself" -#~ msgstr "Ben er zelf een" - #~ msgid "Chord tremolo with %d elements. Must have two elements." #~ msgstr "Akkoordtremool met %d elementen. Moet twee elementen hebben." @@ -4304,18 +4431,12 @@ msgstr "" #~ msgid "distance=%f" #~ msgstr "afstand=%f" -#~ msgid "NaN" -#~ msgstr "NaN" - #~ msgid "no one to print a repeat brace" #~ msgstr "niemand om een herhalings haak af te drukken" #~ msgid "Now processing `%s'" #~ msgstr "Verwerken van `%s'" -#~ msgid "FIXME: key change merge" -#~ msgstr "MAAKME: toonsoort sleutel samenvoeging" - #~ msgid "kpathsea can not find TFM file: `%s'" #~ msgstr "kpathsea kan TFM bestand niet vinden: `%s'" @@ -4412,15 +4533,9 @@ msgstr "" #~ msgid "Global shortest duration is %s" #~ msgstr "Globaal kortste lengte is %s" -#~ msgid "#" -#~ msgstr "#" - #~ msgid "Don't you want polyphonic voices instead?" #~ msgstr "Wil je anders echt geen polyfone stemmen?" -#~ msgid "can't find ascii character: %d" -#~ msgstr "kan ascii teken niet vinden: %d" - #~ msgid "TFM header of `%s' has only %u word (s)" #~ msgstr "TFM kop van `%s' heeft slechts %u woord(en)" @@ -4469,21 +4584,6 @@ msgstr "" #~ msgid "Report errors to %(mail_address)s." #~ msgstr "Meld fouten naar %(mail_address)s." -#~ msgid "stable-branch" -#~ msgstr "stabiele tak" - -#~ msgid "development-branch" -#~ msgstr "ontwikkel tak" - -#~ msgid "French" -#~ msgstr "Frans" - -#~ msgid "Spanish" -#~ msgstr "Spaans" - -#~ msgid "German" -#~ msgstr "Duits" - #~ msgid "" #~ "vertical alignment called before line-breaking.\n" #~ "Only do cross-staff spanners with PianoStaff." @@ -4494,22 +4594,12 @@ msgstr "" #~ msgid "outside-staff object %s has an empty extent" #~ msgstr "buiten-notenbalk object %s heeft lege afmetingen" -#~ msgid "BACK" -#~ msgstr "ACHTER" - -#~ msgid "" -#~ "use backend BACK (eps, gnome, ps [default],\n" -#~ "scm, svg, tex, texstr)" -#~ msgstr "" -#~ "gebruik achterkant ACHTER (eps, gnome,\n" -#~ "ps [standaard], scm, svg, tex, texstr)" - #~ msgid "" #~ "disallow unsafe Scheme and PostScript\n" #~ "operations" #~ msgstr "" -#~ "sta geen onveilige Scheme of PostScript\n" -#~ "operaties toe" +#~ "onveilige Scheme of PostScript-operaties\n" +#~ "niet toestaan" #~ msgid "Evaluating %s" #~ msgstr "Evalueren van %s" diff --git a/po/sv.po b/po/sv.po index 98e061332c..d95ef486ce 100644 --- a/po/sv.po +++ b/po/sv.po @@ -19,7 +19,7 @@ msgstr "" #. #. source file of the GNU LilyPond music typesetter #. -#. (c) 1998--2003 Han-Wen Nienhuys +#. (c) 1998--2015 Han-Wen Nienhuys #. Jan Nieuwenhuizen #. ## subst:\(^\|[^._a-z]\)\(abspath\|identify\|warranty\|progress\|warning\|error\|exit\|getopt_args\|option_help_str\|options_help_str\|help\|setup_temp\|read_pipe\|system\|cleanup_temp\|strip_extension\|cp_to_dir\|mkdir_p\|init\) *( #. ## replace:\1ly.\2 ( @@ -59,7 +59,7 @@ msgid "Copyright (c) %s by" msgstr "Copyright © %s av" #: lilylib.py:114 -msgid " 1998--2003" +msgid " 1998--2015" msgstr " 1998-2003" #: lilylib.py:118 @@ -308,7 +308,7 @@ msgstr "Tar bort utdatafilen" #. #. source file of the GNU LilyPond music typesetter #. -#. (c) 1998--2003 Han-Wen Nienhuys +#. (c) 1998--2015 Han-Wen Nienhuys #. Jan Nieuwenhuizen #. TODO #. use -f and -t for -s output @@ -649,7 +649,7 @@ msgstr "inga filer angivna p #. #. source file of the GNU LilyPond music typesetter #. -#. (c) 1998--2003 Han-Wen Nienhuys +#. (c) 1998--2015 Han-Wen Nienhuys #. Jan Nieuwenhuizen #. This is the third incarnation of ly2dvi. #. @@ -935,7 +935,7 @@ msgstr "%s skrivet till \"%s\"..." #. #. source file of the GNU LilyPond music typesetter #. -#. (c) 1998--2003 Han-Wen Nienhuys +#. (c) 1998--2015 Han-Wen Nienhuys #. Jan Nieuwenhuizen #. ############################################################### #. Users of python modules should include this snippet. diff --git a/ps/encodingdefs.ps b/ps/encodingdefs.ps new file mode 100644 index 0000000000..fe4db92b1d --- /dev/null +++ b/ps/encodingdefs.ps @@ -0,0 +1,1848 @@ +%!PS-Adobe-2.0: encodingdefs.ps + +% +% Custom encodings and definitions for emmentaler-[[:digit:]]* +% ad the emmentaler-brace fonts, used with --bigpdf +% + +/LilyNoteHeadEncoding [ + % 0x00 + /.notdef /noteheads.d0doFunk /noteheads.d0fa + /noteheads.d0faFunk /noteheads.d0faThin /noteheads.d0miFunk + /noteheads.d0reFunk /noteheads.d0tiFunk /noteheads.d1do + /noteheads.d1doFunk /noteheads.d1doThin /noteheads.d1doWalker + /noteheads.d1fa /noteheads.d1faFunk /noteheads.d1faThin + % 0xf + /noteheads.d1faWalker /noteheads.d1miFunk /noteheads.d1re + /noteheads.d1reFunk /noteheads.d1reThin /noteheads.d1reWalker + /noteheads.d1ti /noteheads.d1tiFunk /noteheads.d1tiThin + /noteheads.d1tiWalker /noteheads.d1triangle /noteheads.d2do + % 0x1e + /noteheads.d2doFunk /noteheads.d2doThin /noteheads.d2doWalker + /noteheads.d2fa /noteheads.d2faFunk /noteheads.d2faThin + /noteheads.d2faWalker /noteheads.d2kievan /noteheads.d2re + /noteheads.d2reFunk /noteheads.d2reThin /noteheads.d2reWalker + /noteheads.d2ti /noteheads.d2tiFunk /noteheads.d2tiThin + % 0x2d + /noteheads.d2tiWalker /noteheads.d2triangle /noteheads.d3kievan + /noteheads.dM2 /noteheads.dM2blackmensural /noteheads.dM2mensural + /noteheads.dM2neomensural /noteheads.dM2semimensural + /noteheads.dM3blackmensural /noteheads.dM3mensural + /noteheads.dM3neomensural /noteheads.dM3semimensural + % 0x39 + /noteheads.drM2mensural /noteheads.drM2neomensural + /noteheads.drM2semimensural /noteheads.drM3mensural + /noteheads.drM3neomensural /noteheads.drM3semimensural /noteheads.s0 + /noteheads.s0blackmensural /noteheads.s0blackpetrucci + /noteheads.s0cross /noteheads.s0diamond /noteheads.s0do + % 0x45 + /noteheads.s0doThin /noteheads.s0doWalker /noteheads.s0faWalker + /noteheads.s0harmonic /noteheads.s0kievan /noteheads.s0la + /noteheads.s0laFunk /noteheads.s0laThin /noteheads.s0laWalker + /noteheads.s0mensural /noteheads.s0mi /noteheads.s0miMirror + /noteheads.s0miThin /noteheads.s0miWalker /noteheads.s0neomensural + % 0x54 + /noteheads.s0petrucci /noteheads.s0re /noteheads.s0reThin + /noteheads.s0reWalker /noteheads.s0slash /noteheads.s0sol + /noteheads.s0solFunk /noteheads.s0ti /noteheads.s0tiThin + /noteheads.s0tiWalker /noteheads.s0triangle /noteheads.s1 + /noteheads.s1blackpetrucci /noteheads.s1cross /noteheads.s1diamond + % 0x63 + /noteheads.s1kievan /noteheads.s1la /noteheads.s1laFunk + /noteheads.s1laThin /noteheads.s1laWalker /noteheads.s1mensural + /noteheads.s1mi /noteheads.s1miMirror /noteheads.s1miThin + /noteheads.s1miWalker /noteheads.s1neomensural /noteheads.s1petrucci + /noteheads.s1slash /noteheads.s1sol /noteheads.s1solFunk + % 0x72 + /noteheads.s2 /noteheads.s2blackpetrucci /noteheads.s2cross + /noteheads.s2diamond /noteheads.s2harmonic /noteheads.s2la + /noteheads.s2laFunk /noteheads.s2laThin /noteheads.s2laWalker + /noteheads.s2mensural /noteheads.s2mi /noteheads.s2miFunk + /noteheads.s2miMirror /noteheads.s2miThin /noteheads.s2miWalker + % 0x81 + /noteheads.s2neomensural /noteheads.s2petrucci /noteheads.s2slash + /noteheads.s2sol /noteheads.s2solFunk /noteheads.s2xcircle + /noteheads.shufnagel.lpes /noteheads.shufnagel.punctum + /noteheads.shufnagel.virga /noteheads.sM1 /noteheads.sM1blackmensural + /noteheads.sM1double /noteheads.sM1kievan /noteheads.sM1mensural + % 0x8f + /noteheads.sM1neomensural /noteheads.sM1semimensural + /noteheads.sM2blackligmensural /noteheads.sM2kievan + /noteheads.sM2ligmensural /noteheads.sM2semiligmensural + /noteheads.sM3blackligmensural /noteheads.sM3ligmensural + /noteheads.sM3semiligmensural /noteheads.smedicaea.inclinatum + % 0x99 + /noteheads.smedicaea.punctum /noteheads.smedicaea.rvirga + /noteheads.smedicaea.virga /noteheads.sr1kievan + /noteheads.srM1mensural /noteheads.srM1neomensural + /noteheads.srM1semimensural /noteheads.srM2ligmensural + /noteheads.srM2semiligmensural /noteheads.srM3ligmensural + % 0xa3 + /noteheads.srM3semiligmensural /noteheads.ssolesmes.auct.asc + /noteheads.ssolesmes.auct.desc /noteheads.ssolesmes.incl.auctum + /noteheads.ssolesmes.incl.parvum /noteheads.ssolesmes.oriscus + /noteheads.ssolesmes.stropha /noteheads.ssolesmes.stropha.aucta + /noteheads.svaticana.cephalicus /noteheads.svaticana.epiphonus + % 0xad + /noteheads.svaticana.inclinatum /noteheads.svaticana.inner.cephalicus + /noteheads.svaticana.linea.punctum + /noteheads.svaticana.linea.punctum.cavum + /noteheads.svaticana.lpes /noteheads.svaticana.plica + /noteheads.svaticana.punctum /noteheads.svaticana.punctum.cavum + % 0xb5 + /noteheads.svaticana.quilisma /noteheads.svaticana.reverse.plica + /noteheads.svaticana.reverse.vplica /noteheads.svaticana.upes + /noteheads.svaticana.vepiphonus /noteheads.svaticana.vlpes + /noteheads.svaticana.vplica /noteheads.svaticana.vupes + /noteheads.u0doFunk /noteheads.u0fa /noteheads.u0faFunk + % 0xc0 + /noteheads.u0faThin /noteheads.u0miFunk /noteheads.u0reFunk + /noteheads.u0tiFunk /noteheads.u1do /noteheads.u1doFunk + /noteheads.u1doThin /noteheads.u1doWalker /noteheads.u1fa + /noteheads.u1faFunk /noteheads.u1faThin /noteheads.u1faWalker + /noteheads.u1miFunk /noteheads.u1re /noteheads.u1reFunk + % 0xcf + /noteheads.u1reThin /noteheads.u1reWalker /noteheads.u1ti + /noteheads.u1tiFunk /noteheads.u1tiThin /noteheads.u1tiWalker + /noteheads.u1triangle /noteheads.u2do /noteheads.u2doFunk + /noteheads.u2doThin /noteheads.u2doWalker /noteheads.u2fa + /noteheads.u2faFunk /noteheads.u2faThin /noteheads.u2faWalker + % 0xde + /noteheads.u2kievan /noteheads.u2re /noteheads.u2reFunk + /noteheads.u2reThin /noteheads.u2reWalker /noteheads.u2ti + /noteheads.u2tiFunk /noteheads.u2tiThin /noteheads.u2tiWalker + /noteheads.u2triangle /noteheads.u3kievan /noteheads.uM2 + /noteheads.uM2blackmensural /noteheads.uM2mensural + % 0xec + /noteheads.uM2neomensural /noteheads.uM2semimensural + /noteheads.uM3blackmensural /noteheads.uM3mensural + /noteheads.uM3neomensural /noteheads.uM3semimensural + /noteheads.urM2mensural /noteheads.urM2neomensural + % 0xf4 + /noteheads.urM2semimensural /noteheads.urM3mensural + /noteheads.urM3neomensural /noteheads.urM3semimensural + % 0xf8 + /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + % 0x103 +] def + +% 0x00 +/noteheads.d0doFunk {<01> show} def +/noteheads.d0fa {<02> show} def +/noteheads.d0faFunk {<03> show} def +/noteheads.d0faThin {<04> show} def +/noteheads.d0miFunk {<05> show} def +/noteheads.d0reFunk {<06> show} def +/noteheads.d0tiFunk {<07> show} def +/noteheads.d1do {<08> show} def +/noteheads.d1doFunk {<09> show} def +/noteheads.d1doThin {<0a> show} def +% 0xa +/noteheads.d1doWalker {<0b> show} def +/noteheads.d1fa {<0c> show} def +/noteheads.d1faFunk {<0d> show} def +/noteheads.d1faThin {<0e> show} def +/noteheads.d1faWalker {<0f> show} def +/noteheads.d1miFunk {<10> show} def +/noteheads.d1re {<11> show} def +/noteheads.d1reFunk {<12> show} def +/noteheads.d1reThin {<13> show} def +/noteheads.d1reWalker {<14> show} def +% 0x14 +/noteheads.d1ti {<15> show} def +/noteheads.d1tiFunk {<16> show} def +/noteheads.d1tiThin {<17> show} def +/noteheads.d1tiWalker {<18> show} def +/noteheads.d1triangle {<19> show} def +/noteheads.d2do {<1a> show} def +/noteheads.d2doFunk {<1b> show} def +/noteheads.d2doThin {<1c> show} def +/noteheads.d2doWalker {<1d> show} def +/noteheads.d2fa {<1e> show} def +% 0x1e +/noteheads.d2faFunk {<1f> show} def +/noteheads.d2faThin {<20> show} def +/noteheads.d2faWalker {<21> show} def +/noteheads.d2kievan {<22> show} def +/noteheads.d2re {<23> show} def +/noteheads.d2reFunk {<24> show} def +/noteheads.d2reThin {<25> show} def +/noteheads.d2reWalker {<26> show} def +/noteheads.d2ti {<27> show} def +/noteheads.d2tiFunk {<28> show} def +% 0x28 +/noteheads.d2tiThin {<29> show} def +/noteheads.d2tiWalker {<2a> show} def +/noteheads.d2triangle {<2b> show} def +/noteheads.d3kievan {<2c> show} def +/noteheads.dM2 {<2d> show} def +/noteheads.dM2blackmensural {<2e> show} def +/noteheads.dM2mensural {<2f> show} def +/noteheads.dM2neomensural {<30> show} def +/noteheads.dM2semimensural {<31> show} def +/noteheads.dM3blackmensural {<32> show} def +% 0x32 +/noteheads.dM3mensural {<33> show} def +/noteheads.dM3neomensural {<34> show} def +/noteheads.dM3semimensural {<35> show} def +/noteheads.drM2mensural {<36> show} def +/noteheads.drM2neomensural {<37> show} def +/noteheads.drM2semimensural {<38> show} def +/noteheads.drM3mensural {<39> show} def +/noteheads.drM3neomensural {<3a> show} def +/noteheads.drM3semimensural {<3b> show} def +/noteheads.s0 {<3c> show} def +% 0x3c +/noteheads.s0blackmensural {<3d> show} def +/noteheads.s0blackpetrucci {<3e> show} def +/noteheads.s0cross {<3f> show} def +/noteheads.s0diamond {<40> show} def +/noteheads.s0do {<41> show} def +/noteheads.s0doThin {<42> show} def +/noteheads.s0doWalker {<43> show} def +/noteheads.s0faWalker {<44> show} def +/noteheads.s0harmonic {<45> show} def +/noteheads.s0kievan {<46> show} def +% 0x46 +/noteheads.s0la {<47> show} def +/noteheads.s0laFunk {<48> show} def +/noteheads.s0laThin {<49> show} def +/noteheads.s0laWalker {<4a> show} def +/noteheads.s0mensural {<4b> show} def +/noteheads.s0mi {<4c> show} def +/noteheads.s0miMirror {<4d> show} def +/noteheads.s0miThin {<4e> show} def +/noteheads.s0miWalker {<4f> show} def +/noteheads.s0neomensural {<50> show} def +% 0x50 +/noteheads.s0petrucci {<51> show} def +/noteheads.s0re {<52> show} def +/noteheads.s0reThin {<53> show} def +/noteheads.s0reWalker {<54> show} def +/noteheads.s0slash {<55> show} def +/noteheads.s0sol {<56> show} def +/noteheads.s0solFunk {<57> show} def +/noteheads.s0ti {<58> show} def +/noteheads.s0tiThin {<59> show} def +/noteheads.s0tiWalker {<5a> show} def +% 0x5a +/noteheads.s0triangle {<5b> show} def +/noteheads.s1 {<5c> show} def +/noteheads.s1blackpetrucci {<5d> show} def +/noteheads.s1cross {<5e> show} def +/noteheads.s1diamond {<5f> show} def +/noteheads.s1kievan {<60> show} def +/noteheads.s1la {<61> show} def +/noteheads.s1laFunk {<62> show} def +/noteheads.s1laThin {<63> show} def +/noteheads.s1laWalker {<64> show} def +% 0x64 +/noteheads.s1mensural {<65> show} def +/noteheads.s1mi {<66> show} def +/noteheads.s1miMirror {<67> show} def +/noteheads.s1miThin {<68> show} def +/noteheads.s1miWalker {<69> show} def +/noteheads.s1neomensural {<6a> show} def +/noteheads.s1petrucci {<6b> show} def +/noteheads.s1slash {<6c> show} def +/noteheads.s1sol {<6d> show} def +/noteheads.s1solFunk {<6e> show} def +% 0x6e +/noteheads.s2 {<6f> show} def +/noteheads.s2blackpetrucci {<70> show} def +/noteheads.s2cross {<71> show} def +/noteheads.s2diamond {<72> show} def +/noteheads.s2harmonic {<73> show} def +/noteheads.s2la {<74> show} def +/noteheads.s2laFunk {<75> show} def +/noteheads.s2laThin {<76> show} def +/noteheads.s2laWalker {<77> show} def +/noteheads.s2mensural {<78> show} def +% 0x78 +/noteheads.s2mi {<79> show} def +/noteheads.s2miFunk {<7a> show} def +/noteheads.s2miMirror {<7b> show} def +/noteheads.s2miThin {<7c> show} def +/noteheads.s2miWalker {<7d> show} def +/noteheads.s2neomensural {<7e> show} def +/noteheads.s2petrucci {<7f> show} def +/noteheads.s2slash {<80> show} def +/noteheads.s2sol {<81> show} def +/noteheads.s2solFunk {<82> show} def +% 0x82 +/noteheads.s2xcircle {<83> show} def +/noteheads.shufnagel.lpes {<84> show} def +/noteheads.shufnagel.punctum {<85> show} def +/noteheads.shufnagel.virga {<86> show} def +/noteheads.sM1 {<87> show} def +/noteheads.sM1blackmensural {<88> show} def +/noteheads.sM1double {<89> show} def +/noteheads.sM1kievan {<8a> show} def +/noteheads.sM1mensural {<8b> show} def +/noteheads.sM1neomensural {<8c> show} def +% 0x8c +/noteheads.sM1semimensural {<8d> show} def +/noteheads.sM2blackligmensural {<8e> show} def +/noteheads.sM2kievan {<8f> show} def +/noteheads.sM2ligmensural {<90> show} def +/noteheads.sM2semiligmensural {<91> show} def +/noteheads.sM3blackligmensural {<92> show} def +/noteheads.sM3ligmensural {<93> show} def +/noteheads.sM3semiligmensural {<94> show} def +/noteheads.smedicaea.inclinatum {<95> show} def +/noteheads.smedicaea.punctum {<96> show} def +% 0x96 +/noteheads.smedicaea.rvirga {<97> show} def +/noteheads.smedicaea.virga {<98> show} def +/noteheads.sr1kievan {<99> show} def +/noteheads.srM1mensural {<9a> show} def +/noteheads.srM1neomensural {<9b> show} def +/noteheads.srM1semimensural {<9c> show} def +/noteheads.srM2ligmensural {<9d> show} def +/noteheads.srM2semiligmensural {<9e> show} def +/noteheads.srM3ligmensural {<9f> show} def +/noteheads.srM3semiligmensural { show} def +% 0xa0 +/noteheads.ssolesmes.auct.asc { show} def +/noteheads.ssolesmes.auct.desc { show} def +/noteheads.ssolesmes.incl.auctum { show} def +/noteheads.ssolesmes.incl.parvum { show} def +/noteheads.ssolesmes.oriscus { show} def +/noteheads.ssolesmes.stropha { show} def +/noteheads.ssolesmes.stropha.aucta { show} def +/noteheads.svaticana.cephalicus { show} def +/noteheads.svaticana.epiphonus { show} def +/noteheads.svaticana.inclinatum { show} def +% 0xaa +/noteheads.svaticana.inner.cephalicus { show} def +/noteheads.svaticana.linea.punctum { show} def +/noteheads.svaticana.linea.punctum.cavum { show} def +/noteheads.svaticana.lpes { show} def +/noteheads.svaticana.plica { show} def +/noteheads.svaticana.punctum { show} def +/noteheads.svaticana.punctum.cavum { show} def +/noteheads.svaticana.quilisma { show} def +/noteheads.svaticana.reverse.plica { show} def +/noteheads.svaticana.reverse.vplica { show} def +% 0xb4 +/noteheads.svaticana.upes { show} def +/noteheads.svaticana.vepiphonus { show} def +/noteheads.svaticana.vlpes { show} def +/noteheads.svaticana.vplica { show} def +/noteheads.svaticana.vupes { show} def +/noteheads.u0doFunk { show} def +/noteheads.u0fa { show} def +/noteheads.u0faFunk { show} def +/noteheads.u0faThin { show} def +/noteheads.u0miFunk { show} def +% 0xbe +/noteheads.u0reFunk { show} def +/noteheads.u0tiFunk { show} def +/noteheads.u1do { show} def +/noteheads.u1doFunk { show} def +/noteheads.u1doThin { show} def +/noteheads.u1doWalker { show} def +/noteheads.u1fa { show} def +/noteheads.u1faFunk { show} def +/noteheads.u1faThin { show} def +/noteheads.u1faWalker { show} def +% 0xc8 +/noteheads.u1miFunk { show} def +/noteheads.u1re { show} def +/noteheads.u1reFunk { show} def +/noteheads.u1reThin { show} def +/noteheads.u1reWalker { show} def +/noteheads.u1ti { show} def +/noteheads.u1tiFunk { show} def +/noteheads.u1tiThin { show} def +/noteheads.u1tiWalker { show} def +/noteheads.u1triangle { show} def +% 0xd2 +/noteheads.u2do { show} def +/noteheads.u2doFunk { show} def +/noteheads.u2doThin { show} def +/noteheads.u2doWalker { show} def +/noteheads.u2fa { show} def +/noteheads.u2faFunk { show} def +/noteheads.u2faThin { show} def +/noteheads.u2faWalker { show} def +/noteheads.u2kievan { show} def +/noteheads.u2re { show} def +% 0xdc +/noteheads.u2reFunk {
    show} def +/noteheads.u2reThin { show} def +/noteheads.u2reWalker { show} def +/noteheads.u2ti { show} def +/noteheads.u2tiFunk { show} def +/noteheads.u2tiThin { show} def +/noteheads.u2tiWalker { show} def +/noteheads.u2triangle { show} def +/noteheads.u3kievan { show} def +/noteheads.uM2 { show} def +% 0xe6 +/noteheads.uM2blackmensural { show} def +/noteheads.uM2mensural { show} def +/noteheads.uM2neomensural { show} def +/noteheads.uM2semimensural { show} def +/noteheads.uM3blackmensural { show} def +/noteheads.uM3mensural { show} def +/noteheads.uM3neomensural { show} def +/noteheads.uM3semimensural { show} def +/noteheads.urM2mensural { show} def +/noteheads.urM2neomensural { show} def +% 0xf0 +/noteheads.urM2semimensural { show} def +/noteheads.urM3mensural { show} def +/noteheads.urM3neomensural { show} def +/noteheads.urM3semimensural { show} def +% 0xf4 + +/LilyScriptEncoding [ + % 0x00 + /.notdef /clefs.blackmensural.c /clefs.blackmensural.c_change + /clefs.C /clefs.C_change /clefs.F + /clefs.F_change /clefs.G /clefs.G_change + /clefs.GG /clefs.GG_change /clefs.hufnagel.do + /clefs.hufnagel.do_change /clefs.hufnagel.do.fa + % 0xe + /clefs.hufnagel.do.fa_change /clefs.hufnagel.fa + /clefs.hufnagel.fa_change /clefs.kievan.do /clefs.kievan.do_change + /clefs.medicaea.do /clefs.medicaea.do_change /clefs.medicaea.fa + /clefs.medicaea.fa_change /clefs.mensural.c /clefs.mensural.c_change + /clefs.mensural.f /clefs.mensural.f_change /clefs.mensural.g + % 01c + /clefs.mensural.g_change /clefs.neomensural.c + /clefs.neomensural.c_change /clefs.percussion + /clefs.percussion_change /clefs.petrucci.c1 /clefs.petrucci.c1_change + /clefs.petrucci.c2 /clefs.petrucci.c2_change /clefs.petrucci.c3 + /clefs.petrucci.c3_change /clefs.petrucci.c4 /clefs.petrucci.c4_change + % 0x29 + /clefs.petrucci.c5 /clefs.petrucci.c5_change /clefs.petrucci.f + /clefs.petrucci.f_change /clefs.petrucci.g /clefs.petrucci.g_change + /clefs.tab /clefs.tab_change /clefs.tenorG + /clefs.tenorG_change /clefs.varC /clefs.varC_change + /clefs.varpercussion /clefs.varpercussion_change /clefs.vaticana.do + % 0x38 + /clefs.vaticana.do_change /clefs.vaticana.fa /clefs.vaticana.fa_change + /scripts.arpeggio /scripts.arpeggio.arrow.1 /scripts.arpeggio.arrow.M1 + /scripts.augmentum /scripts.barline.kievan /scripts.caesura.curved + /scripts.caesura.straight /scripts.circulus /scripts.coda + /scripts.daccentus /scripts.dfermata /scripts.dlongfermata + % 0x47 + /scripts.dmarcato /scripts.downbow /scripts.downmordent + /scripts.downprall /scripts.dpedalheel /scripts.dpedaltoe + /scripts.dportato /scripts.dsemicirculus /scripts.dshortfermata + /scripts.dsignumcongruentiae /scripts.dstaccatissimo + /scripts.dverylongfermata /scripts.espr /scripts.flageolet + % 0x55 + /scripts.halfopen /scripts.halfopenvertical /scripts.ictus + /scripts.lcomma /scripts.lineprall /scripts.lvarcomma + /scripts.mordent /scripts.open /scripts.prall + /scripts.pralldown /scripts.prallmordent /scripts.prallprall + /scripts.prallup /scripts.rcomma /scripts.reverseturn + % 0x64 + /scripts.rvarcomma /scripts.segno /scripts.sforzato + /scripts.snappizzicato /scripts.staccato /scripts.stopped + /scripts.tenuto /scripts.thumb /scripts.tickmark + /scripts.trilelement /scripts.trill /scripts.trill_element + /scripts.turn /scripts.uaccentus /scripts.ufermata + % 0x73 + /scripts.ulongfermata /scripts.umarcato /scripts.upbow + /scripts.upedalheel /scripts.upedaltoe /scripts.upmordent + /scripts.uportato /scripts.upprall /scripts.usemicirculus + /scripts.ushortfermata /scripts.usignumcongruentiae + /scripts.ustaccatissimo /scripts.uverylongfermata /scripts.varcoda + % 0x81 + /scripts.varsegno + % 0x82 + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + % 0x9e + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + % 0xc1 + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + % 0xe4 + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + % 0x100 +] def + +% 0x00 +/clefs.blackmensural.c {<01> show} def +/clefs.blackmensural.c_change {<02> show} def +/clefs.C {<03> show} def /clefs.C_change {<04> show} def +/clefs.F {<05> show} def /clefs.F_change {<06> show} def +/clefs.G {<07> show} def /clefs.G_change {<08> show} def +/clefs.GG {<09> show} def /clefs.GG_change {<0a> show} def +/clefs.hufnagel.do {<0b> show} def +/clefs.hufnagel.do_change {<0c> show} def +/clefs.hufnagel.do.fa {<0d> show} def +/clefs.hufnagel.do.fa_change {<0e> show} def +% 0xa +/clefs.hufnagel.fa {<0f> show} def +/clefs.hufnagel.fa_change {<10> show} def +/clefs.kievan.do {<11> show} def +/clefs.kievan.do_change {<12> show} def +/clefs.medicaea.do {<13> show} def +/clefs.medicaea.do_change {<14> show} def +/clefs.medicaea.fa {<15> show} def +/clefs.medicaea.fa_change {<16> show} def +/clefs.mensural.c {<17> show} def +/clefs.mensural.c_change {<18> show} def +% 0x14 +/clefs.mensural.f {<19> show} def +/clefs.mensural.f_change {<1a> show} def +/clefs.mensural.g {<1b> show} def +/clefs.mensural.g_change {<1c> show} def +/clefs.neomensural.c {<1d> show} def +/clefs.neomensural.c_change {<1e> show} def +/clefs.percussion {<1f> show} def +/clefs.percussion_change {<20> show} def +/clefs.petrucci.c1 {<21> show} def +/clefs.petrucci.c1_change {<22> show} def +% 0x1e +/clefs.petrucci.c2 {<23> show} def +/clefs.petrucci.c2_change {<24> show} def +/clefs.petrucci.c3 {<25> show} def +/clefs.petrucci.c3_change {<26> show} def +/clefs.petrucci.c4 {<27> show} def +/clefs.petrucci.c4_change {<28> show} def +/clefs.petrucci.c5 {<29> show} def +/clefs.petrucci.c5_change {<2a> show} def +/clefs.petrucci.f {<2b> show} def +/clefs.petrucci.f_change {<2c> show} def +% 0x28 +/clefs.petrucci.g {<2d> show} def +/clefs.petrucci.g_change {<2e> show} def +/clefs.tab {<2f> show} def +/clefs.tab_change {<30> show} def +/clefs.tenorG {<31> show} def +/clefs.tenorG_change {<32> show} def +/clefs.varC {<33> show} def +/clefs.varC_change {<34> show} def +/clefs.varpercussion {<35> show} def +/clefs.varpercussion_change {<36> show} def +% 0x32 +/clefs.vaticana.do {<37> show} def +/clefs.vaticana.do_change {<38> show} def +/clefs.vaticana.fa {<39> show} def +/clefs.vaticana.fa_change {<3a> show} def +/scripts.arpeggio {<3b> show} def +/scripts.arpeggio.arrow.1 {<3c> show} def +/scripts.arpeggio.arrow.M1 {<3d> show} def +/scripts.augmentum {<3e> show} def +/scripts.barline.kievan {<3f> show} def +/scripts.caesura.curved {<40> show} def +% 0x3c +/scripts.caesura.straight {<41> show} def +/scripts.circulus {<42> show} def +/scripts.coda {<43> show} def +/scripts.daccentus {<44> show} def +/scripts.dfermata {<45> show} def +/scripts.dlongfermata {<46> show} def +/scripts.dmarcato {<47> show} def +/scripts.downbow {<48> show} def +/scripts.downmordent {<49> show} def +/scripts.downprall {<4a> show} def +% 0x46 +/scripts.dpedalheel {<4b> show} def +/scripts.dpedaltoe {<4c> show} def +/scripts.dportato {<4d> show} def +/scripts.dsemicirculus {<4e> show} def +/scripts.dshortfermata {<4f> show} def +/scripts.dsignumcongruentiae {<50> show} def +/scripts.dstaccatissimo {<51> show} def +/scripts.dverylongfermata {<52> show} def +/scripts.espr {<53> show} def +/scripts.flageolet {<54> show} def +% 0x50 +/scripts.halfopen {<55> show} def +/scripts.halfopenvertical {<56> show} def +/scripts.ictus {<57> show} def +/scripts.lcomma {<58> show} def +/scripts.lineprall {<59> show} def +/scripts.lvarcomma {<5a> show} def +/scripts.mordent {<5b> show} def +/scripts.open {<5c> show} def +/scripts.prall {<5d> show} def +/scripts.pralldown {<5e> show} def +% 0x5a +/scripts.prallmordent {<5f> show} def +/scripts.prallprall {<60> show} def +/scripts.prallup {<61> show} def +/scripts.rcomma {<62> show} def +/scripts.reverseturn {<63> show} def +/scripts.rvarcomma {<64> show} def +/scripts.segno {<65> show} def +/scripts.sforzato {<66> show} def +/scripts.snappizzicato {<67> show} def +/scripts.staccato {<68> show} def +/scripts.stopped {<69> show} def +% 0x64 +/scripts.tenuto {<6a> show} def +/scripts.thumb {<6b> show} def +/scripts.tickmark {<6c> show} def +/scripts.trilelement {<6d> show} def +/scripts.trill {<6e> show} def +/scripts.trill_element {<6f> show} def +/scripts.turn {<70> show} def +/scripts.uaccentus {<71> show} def +/scripts.ufermata {<72> show} def +/scripts.ulongfermata {<73> show} def +% 0x6e +/scripts.umarcato {<74> show} def +/scripts.upbow {<75> show} def +/scripts.upedalheel {<76> show} def +/scripts.upedaltoe {<77> show} def +/scripts.upmordent {<78> show} def +/scripts.uportato {<79> show} def +/scripts.upprall {<7a> show} def +/scripts.usemicirculus {<7b> show} def +/scripts.ushortfermata {<7c> show} def +/scripts.usignumcongruentiae {<7d> show} def +% 0x78 +/scripts.ustaccatissimo {<7e> show} def +/scripts.uverylongfermata {<7f> show} def +/scripts.varcoda {<80> show} def +/scripts.varsegno {<81> show} def +% 0x7c + +/LilyOtherEncoding [ + % 0x00 + /.notdef /accidentals.doublesharp /accidentals.flat + /accidentals.flat.arrowboth /accidentals.flat.arrowdown + /accidentals.flat.arrowup /accidentals.flatflat + /accidentals.flatflat.slash /accidentals.flat.slash + /accidentals.flat.slashslash /accidentals.hufnagelM1 + % 0xb + /accidentals.kievan1 /accidentals.kievanM1 /accidentals.leftparen + /accidentals.medicaeaM1 /accidentals.mensural1 /accidentals.mensuralM1 + /accidentals.mirroredflat /accidentals.mirroredflat.backslash + /accidentals.mirroredflat.flat /accidentals.natural + /accidentals.natural.arrowboth /accidentals.natural.arrowdown + % 0x17 + /accidentals.natural.arrowup /accidentals.rightparen + /accidentals.sharp /accidentals.sharp.arrowboth + /accidentals.sharp.arrowdown /accidentals.sharp.arrowup + /accidentals.sharp.slashslashslash.stem + /accidentals.sharp.slashslashslash.stemstem + % 0x1f + /accidentals.sharp.slashslash.stem + /accidentals.sharp.slashslash.stemstemstem /accidentals.vaticana0 + /accidentals.vaticanaM1 /accordion.bayanbass /accordion.discant + /accordion.dot /accordion.freebass /accordion.oldEE + /accordion.pull /accordion.push /accordion.stdbass + % 0x2b + /arrowheads.close.01 /arrowheads.close.0M1 /arrowheads.close.11 + /arrowheads.close.1M1 /arrowheads.open.01 /arrowheads.open.0M1 + /arrowheads.open.11 /arrowheads.open.1M1 + /brackettips.down /brackettips.up /comma /custodes.hufnagel.d0 + /custodes.hufnagel.d1 /custodes.hufnagel.d2 /custodes.hufnagel.u0 + % 0x39 + /custodes.hufnagel.u1 /custodes.hufnagel.u2 /custodes.medicaea.d0 + /custodes.medicaea.d1 /custodes.medicaea.d2 /custodes.medicaea.u0 + /custodes.medicaea.u1 /custodes.medicaea.u2 /custodes.mensural.d0 + /custodes.mensural.d1 /custodes.mensural.d2 /custodes.mensural.u0 + /custodes.mensural.u1 /custodes.mensural.u2 /custodes.vaticana.d0 + % 0x48 + /custodes.vaticana.d1 /custodes.vaticana.d2 /custodes.vaticana.u0 + /custodes.vaticana.u1 /custodes.vaticana.u2 /dots.dot + /dots.dotkievan /dots.dotvaticana /eight + /f /five /flags.d3 + /flags.d4 /flags.d5 /flags.d6 + % 0x57 + /flags.d7 /flags.dgrace /flags.mensurald03 + /flags.mensurald04 /flags.mensurald05 /flags.mensurald06 + /flags.mensurald13 /flags.mensurald14 /flags.mensurald15 + /flags.mensurald16 /flags.mensurald23 /flags.mensurald24 + /flags.mensurald25 /flags.mensurald26 /flags.mensuralu03 + % 0x66 + /flags.mensuralu04 /flags.mensuralu05 /flags.mensuralu06 + /flags.mensuralu13 /flags.mensuralu14 /flags.mensuralu15 + /flags.mensuralu16 /flags.mensuralu23 /flags.mensuralu24 + /flags.mensuralu25 /flags.mensuralu26 /flags.u3 + /flags.u4 /flags.u5 /flags.u6 + % 0x75 + /flags.u7 /flags.ugrace /four + /hyphen /m /nine + /one /p /pedal.. /pedal.* + /pedal.d /pedal.e /pedal.M + /pedal.P /pedal.Ped /period + % 0x84 + /plus /r /rests.0 + /rests.0mensural /rests.0neomensural /rests.0o + /rests.1 /rests.1mensural /rests.1neomensural + /rests.1o /rests.2 /rests.2classical + /rests.2mensural /rests.2neomensural /rests.2z + % 0x93 + /rests.3 /rests.3mensural /rests.3neomensural + /rests.4 /rests.4mensural /rests.4neomensural + /rests.5 /rests.6 /rests.7 + /rests.M1 /rests.M1mensural /rests.M1neomensural + /rests.M1o /rests.M2 /rests.M2mensural + % 0xa2 + /rests.M2neomensural /rests.M3 /rests.M3mensural + /rests.M3neomensural /s /seven + /six /space /three + /ties.lyric.default + /ties.lyric.short /timesig.C22 /timesig.C44 + % 0xb1 + /timesig.mensural22 /timesig.mensural24 /timesig.mensural32 + /timesig.mensural34 /timesig.mensural44 /timesig.mensural48 + /timesig.mensural64 /timesig.mensural68 /timesig.mensural68alt + /timesig.mensural94 /timesig.mensural98 /timesig.neomensural22 + /timesig.neomensural24 /timesig.neomensural32 /timesig.neomensural34 + % 0xc0 + /timesig.neomensural44 /timesig.neomensural48 /timesig.neomensural64 + /timesig.neomensural68 /timesig.neomensural68alt + /timesig.neomensural94 /timesig.neomensural98 + /two /z /zero + % 0xca + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + % 0xed + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef + % 0xf6 +] def + +% 0x00 +/accidentals.doublesharp {<01> show} def +/accidentals.flat {<02> show} def +/accidentals.flat.arrowboth {<03> show} def +/accidentals.flat.arrowdown {<04> show} def +/accidentals.flat.arrowup {<05> show} def +/accidentals.flatflat {<06> show} def +/accidentals.flatflat.slash {<07> show} def +/accidentals.flat.slash {<08> show} def +/accidentals.flat.slashslash {<09> show} def +/accidentals.hufnagelM1 {<0a> show} def +/accidentals.kievan1 {<0b> show} def +% 0xa +/accidentals.kievanM1 {<0c> show} def +/accidentals.leftparen {<0d> show} def +/accidentals.medicaeaM1 {<0e> show} def +/accidentals.mensural1 {<0f> show} def +/accidentals.mensuralM1 {<10> show} def +/accidentals.mirroredflat {<11> show} def +/accidentals.mirroredflat.backslash {<12> show} def +/accidentals.mirroredflat.flat {<13> show} def +/accidentals.natural {<14> show} def +/accidentals.natural.arrowboth {<15> show} def +/accidentals.natural.arrowdown {<16> show} def +% 0x14 +/accidentals.natural.arrowup {<17> show} def +/accidentals.rightparen {<18> show} def +/accidentals.sharp {<19> show} def +/accidentals.sharp.arrowboth {<1a> show} def +/accidentals.sharp.arrowdown {<1b> show} def +/accidentals.sharp.arrowup {<1c> show} def +/accidentals.sharp.slashslashslash.stem {<1d> show} def +/accidentals.sharp.slashslashslash.stemstem {<1e> show} def +/accidentals.sharp.slashslash.stem {<1f> show} def +/accidentals.sharp.slashslash.stemstemstem {<20> show} def +% 0x1e +/accidentals.vaticana0 {<21> show} def +/accidentals.vaticanaM1 {<22> show} def +/accordion.bayanbass {<23> show} def +/accordion.discant {<24> show} def +/accordion.dot {<25> show} def +/accordion.freebass {<26> show} def +/accordion.oldEE {<27> show} def +/accordion.pull {<28> show} def +/accordion.push {<29> show} def +/accordion.stdbass {<2a> show} def +/arrowheads.close.01 {<2b> show} def +% 0x28 +/arrowheads.close.0M1 {<2c> show} def +/arrowheads.close.11 {<2d> show} def +/arrowheads.close.1M1 {<2e> show} def +/arrowheads.open.01 {<2f> show} def +/arrowheads.open.0M1 {<30> show} def +/arrowheads.open.11 {<31> show} def +/arrowheads.open.1M1 {<32> show} def +/brackettips.down {<33> show} def +/brackettips.up {<34> show} def +/comma {<35> show} def +/custodes.hufnagel.d0 {<36> show} def +% 0x32 +/custodes.hufnagel.d1 {<37> show} def +/custodes.hufnagel.d2 {<38> show} def +/custodes.hufnagel.u0 {<39> show} def +/custodes.hufnagel.u1 {<3a> show} def +/custodes.hufnagel.u2 {<3b> show} def +/custodes.medicaea.d0 {<3c> show} def +/custodes.medicaea.d1 {<3d> show} def +/custodes.medicaea.d2 {<3e> show} def +/custodes.medicaea.u0 {<3f> show} def +/custodes.medicaea.u1 {<40> show} def +/custodes.medicaea.u2 {<41> show} def +% 0x3c +/custodes.mensural.d0 {<42> show} def +/custodes.mensural.d1 {<43> show} def +/custodes.mensural.d2 {<44> show} def +/custodes.mensural.u0 {<45> show} def +/custodes.mensural.u1 {<46> show} def +/custodes.mensural.u2 {<47> show} def +/custodes.vaticana.d0 {<48> show} def +/custodes.vaticana.d1 {<49> show} def +/custodes.vaticana.d2 {<4a> show} def +/custodes.vaticana.u0 {<4b> show} def +% 0x46 +/custodes.vaticana.u1 {<4c> show} def +/custodes.vaticana.u2 {<4d> show} def +/dots.dot {<4e> show} def +/dots.dotkievan {<4f> show} def +/dots.dotvaticana {<50> show} def +/eight {<51> show} def +/f {<52> show} def +/five {<53> show} def +/flags.d3 {<54> show} def +/flags.d4 {<55> show} def +% 0x50 +/flags.d5 {<56> show} def +/flags.d6 {<57> show} def +/flags.d7 {<58> show} def +/flags.dgrace {<59> show} def +/flags.mensurald03 {<5a> show} def +/flags.mensurald04 {<5b> show} def +/flags.mensurald05 {<5c> show} def +/flags.mensurald06 {<5d> show} def +/flags.mensurald13 {<5e> show} def +/flags.mensurald14 {<5f> show} def +% 0x5a +/flags.mensurald15 {<60> show} def +/flags.mensurald16 {<61> show} def +/flags.mensurald23 {<62> show} def +/flags.mensurald24 {<63> show} def +/flags.mensurald25 {<64> show} def +/flags.mensurald26 {<65> show} def +/flags.mensuralu03 {<66> show} def +/flags.mensuralu04 {<67> show} def +/flags.mensuralu05 {<68> show} def +/flags.mensuralu06 {<69> show} def +% 0x64 +/flags.mensuralu13 {<6a> show} def +/flags.mensuralu14 {<6b> show} def +/flags.mensuralu15 {<6c> show} def +/flags.mensuralu16 {<6d> show} def +/flags.mensuralu23 {<6e> show} def +/flags.mensuralu24 {<6f> show} def +/flags.mensuralu25 {<70> show} def +/flags.mensuralu26 {<71> show} def +/flags.u3 {<72> show} def +/flags.u4 {<73> show} def +% 0x6e +/flags.u5 {<74> show} def +/flags.u6 {<75> show} def +/flags.u7 {<76> show} def +/flags.ugrace {<77> show} def +/four {<78> show} def +/hyphen {<79> show} def +/m {<7a> show} def +/nine {<7b> show} def +/one {<7c> show} def +/p {<7d> show} def +% 0x78 +/pedal.. {<7e> show} def +/pedal.* {<7f> show} def +/pedal.d {<80> show} def +/pedal.e {<81> show} def +/pedal.M {<82> show} def +/pedal.P {<83> show} def +/pedal.Ped {<84> show} def +/period {<85> show} def +/plus {<86> show} def +/r {<87> show} def +% 0x82 +/rests.0 {<88> show} def +/rests.0mensural {<89> show} def +/rests.0neomensural {<8a> show} def +/rests.0o {<8b> show} def +/rests.1 {<8c> show} def +/rests.1mensural {<8d> show} def +/rests.1neomensural {<8e> show} def +/rests.1o {<8f> show} def +/rests.2 {<90> show} def +/rests.2classical {<91> show} def +% 0x8c +/rests.2mensural {<92> show} def +/rests.2neomensural {<93> show} def +/rests.2z {<94> show} def +/rests.3 {<95> show} def +/rests.3mensural {<96> show} def +/rests.3neomensural {<97> show} def +/rests.4 {<98> show} def +/rests.4mensural {<99> show} def +/rests.4neomensural {<9a> show} def +/rests.5 {<9b> show} def +% 0x96 +/rests.6 {<9c> show} def +/rests.7 {<9d> show} def +/rests.M1 {<9e> show} def +/rests.M1mensural {<9f> show} def +/rests.M1neomensural { show} def +/rests.M1o { show} def +/rests.M2 { show} def +/rests.M2mensural { show} def +/rests.M2neomensural { show} def +/rests.M3 { show} def +% 0xa0 +/rests.M3mensural { show} def +/rests.M3neomensural { show} def +/s { show} def +/seven { show} def +/six { show} def +/space { show} def +/three { show} def +/ties.lyric.default { show} def +/ties.lyric.short { show} def +/timesig.C22 { show} def +% 0xaa +/timesig.C44 { show} def +/timesig.mensural22 { show} def +/timesig.mensural24 { show} def +/timesig.mensural32 { show} def +/timesig.mensural34 { show} def +/timesig.mensural44 { show} def +/timesig.mensural48 { show} def +/timesig.mensural64 { show} def +/timesig.mensural68 { show} def +/timesig.mensural68alt { show} def +% 0xb4 +/timesig.mensural94 { show} def +/timesig.mensural98 { show} def +/timesig.neomensural22 { show} def +/timesig.neomensural24 { show} def +/timesig.neomensural32 { show} def +/timesig.neomensural34 { show} def +/timesig.neomensural44 { show} def +/timesig.neomensural48 { show} def +/timesig.neomensural64 { show} def +/timesig.neomensural68 { show} def +% 0xbe +/timesig.neomensural68alt { show} def +/timesig.neomensural94 { show} def +/timesig.neomensural98 { show} def +/two { show} def +/z { show} def +/zero { show} def +% 0xc4 + +% +% Custom encodings and definitions for the emmentaler-brace font +% +/BracesNEncoding [ + % 0x00 + /.notdef /brace1 /brace2 /brace10 /brace11 /brace12 /brace13 /brace14 + /brace15 /brace16 /brace17 /brace18 /brace19 /brace20 /brace21 + /brace22 /brace23 /brace24 /brace25 /brace26 /brace27 /brace28 + /brace29 /brace100 /brace101 /brace102 /brace103 /brace104 /brace105 + /brace106 /brace107 /brace108 /brace109 /brace110 /brace111 /brace112 + % 0x24 + /brace113 /brace114 /brace115 /brace116 /brace117 /brace118 /brace119 + /brace120 /brace121 /brace122 /brace123 /brace124 /brace125 /brace126 + /brace127 /brace128 /brace129 /brace130 /brace131 /brace132 /brace133 + /brace134 /brace135 /brace136 /brace137 /brace138 /brace139 /brace140 + /brace141 /brace142 /brace143 /brace144 /brace145 /brace146 /brace147 + % 0x47 + /brace148 /brace149 /brace150 /brace151 /brace152 /brace153 /brace154 + /brace155 /brace156 /brace157 /brace158 /brace159 /brace160 /brace161 + /brace162 /brace163 /brace164 /brace165 /brace166 /brace167 /brace168 + /brace169 /brace170 /brace171 /brace172 /brace173 /brace174 /brace175 + /brace176 /brace177 /brace178 /brace179 /brace180 /brace181 /brace182 + % 0x6a + /brace183 /brace184 /brace185 /brace186 /brace187 /brace188 /brace189 + /brace190 /brace191 /brace192 /brace193 /brace194 /brace195 /brace196 + /brace197 /brace198 /brace199 /brace200 /brace201 /brace202 /brace203 + /brace204 /brace205 /brace206 /brace207 /brace208 /brace209 /brace210 + /brace211 /brace212 /brace213 /brace214 /brace215 /brace216 /brace217 + % 0x8d + /brace218 /brace219 /brace220 /brace221 /brace222 /brace223 /brace224 + /brace225 /brace226 /brace227 /brace228 /brace229 /brace230 /brace231 + /brace232 /brace233 /brace234 /brace235 /brace236 /brace237 /brace238 + /brace239 /brace240 /brace241 /brace242 /brace243 /brace244 /brace245 + /brace246 /brace247 /brace248 /brace249 /brace250 /brace251 /brace252 + % 0xb0 + /brace253 /brace254 /brace255 /brace256 /brace257 /brace258 /brace259 + /brace260 /brace261 /brace262 /brace263 /brace264 /brace265 /brace266 + /brace267 /brace268 /brace269 /brace270 /brace271 /brace272 /brace273 + /brace274 /brace275 /brace276 /brace277 /brace278 /brace279 /brace280 + /brace281 /brace282 /brace283 /brace284 /brace285 /brace286 /brace287 + % 0xd3 + /brace288 /brace289 /brace290 /brace291 /brace292 /brace293 /brace294 + /brace295 /brace296 /brace297 /brace298 /brace299 + % 0xdf + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef + % 0xff +] def + +% 0x00 +/brace1 {<01> show} def +/brace2 {<02> show} def +/brace10 {<03> show} def +/brace11 {<04> show} def +/brace12 {<05> show} def +/brace13 {<06> show} def +/brace14 {<07> show} def +/brace15 {<08> show} def +/brace16 {<09> show} def +/brace17 {<0a> show} def +% 0xa +/brace18 {<0b> show} def +/brace19 {<0c> show} def +/brace20 {<0d> show} def +/brace21 {<0e> show} def +/brace22 {<0f> show} def +/brace23 {<10> show} def +/brace24 {<11> show} def +/brace25 {<12> show} def +/brace26 {<13> show} def +/brace27 {<14> show} def +% 0x14 +/brace28 {<15> show} def +/brace29 {<16> show} def +/brace100 {<17> show} def +/brace101 {<18> show} def +/brace102 {<19> show} def +/brace103 {<1a> show} def +/brace104 {<1b> show} def +/brace105 {<1c> show} def +/brace106 {<1d> show} def +/brace107 {<1e> show} def +% 0x1e +/brace108 {<1f> show} def +/brace109 {<20> show} def +/brace110 {<21> show} def +/brace111 {<22> show} def +/brace112 {<23> show} def +/brace113 {<24> show} def +/brace114 {<25> show} def +/brace115 {<26> show} def +/brace116 {<27> show} def +/brace117 {<28> show} def +% 0x28 +/brace118 {<29> show} def +/brace119 {<2a> show} def +/brace120 {<2b> show} def +/brace121 {<2c> show} def +/brace122 {<2d> show} def +/brace123 {<2e> show} def +/brace124 {<2f> show} def +/brace125 {<30> show} def +/brace126 {<31> show} def +/brace127 {<32> show} def +% 0x32 +/brace128 {<33> show} def +/brace129 {<34> show} def +/brace130 {<35> show} def +/brace131 {<36> show} def +/brace132 {<37> show} def +/brace133 {<38> show} def +/brace134 {<39> show} def +/brace135 {<3a> show} def +/brace136 {<3b> show} def +/brace137 {<3c> show} def +% 0x3c +/brace138 {<3d> show} def +/brace139 {<3e> show} def +/brace140 {<3f> show} def +/brace141 {<40> show} def +/brace142 {<41> show} def +/brace143 {<42> show} def +/brace144 {<43> show} def +/brace145 {<44> show} def +/brace146 {<45> show} def +/brace147 {<46> show} def +% 0x46 +/brace148 {<47> show} def +/brace149 {<48> show} def +/brace150 {<49> show} def +/brace151 {<4a> show} def +/brace152 {<4b> show} def +/brace153 {<4c> show} def +/brace154 {<4d> show} def +/brace155 {<4e> show} def +/brace156 {<4f> show} def +/brace157 {<50> show} def +% 0x50 +/brace158 {<51> show} def +/brace159 {<52> show} def +/brace160 {<53> show} def +/brace161 {<54> show} def +/brace162 {<55> show} def +/brace163 {<56> show} def +/brace164 {<57> show} def +/brace165 {<58> show} def +/brace166 {<59> show} def +/brace167 {<5a> show} def +% 0x5a +/brace168 {<5b> show} def +/brace169 {<5c> show} def +/brace170 {<5d> show} def +/brace171 {<5e> show} def +/brace172 {<5f> show} def +/brace173 {<60> show} def +/brace174 {<61> show} def +/brace175 {<62> show} def +/brace176 {<63> show} def +/brace177 {<64> show} def +% 0x64 +/brace178 {<65> show} def +/brace179 {<66> show} def +/brace180 {<67> show} def +/brace181 {<68> show} def +/brace182 {<69> show} def +/brace183 {<6a> show} def +/brace184 {<6b> show} def +/brace185 {<6c> show} def +/brace186 {<6d> show} def +/brace187 {<6e> show} def +% 0x6e +/brace188 {<6f> show} def +/brace189 {<70> show} def +/brace190 {<71> show} def +/brace191 {<72> show} def +/brace192 {<73> show} def +/brace193 {<74> show} def +/brace194 {<75> show} def +/brace195 {<76> show} def +/brace196 {<77> show} def +/brace197 {<78> show} def +% 0x78 +/brace198 {<79> show} def +/brace199 {<7a> show} def +/brace200 {<7b> show} def +/brace201 {<7c> show} def +/brace202 {<7d> show} def +/brace203 {<7e> show} def +/brace204 {<7f> show} def +/brace205 {<80> show} def +/brace206 {<81> show} def +/brace207 {<82> show} def +% 0x82 +/brace208 {<83> show} def +/brace209 {<84> show} def +/brace210 {<85> show} def +/brace211 {<86> show} def +/brace212 {<87> show} def +/brace213 {<88> show} def +/brace214 {<89> show} def +/brace215 {<8a> show} def +/brace216 {<8b> show} def +/brace217 {<8c> show} def +% 0x8c +/brace218 {<8d> show} def +/brace219 {<8e> show} def +/brace220 {<8f> show} def +/brace221 {<90> show} def +/brace222 {<91> show} def +/brace223 {<92> show} def +/brace224 {<93> show} def +/brace225 {<94> show} def +/brace226 {<95> show} def +/brace227 {<96> show} def +% 0x96 +/brace228 {<97> show} def +/brace229 {<98> show} def +/brace230 {<99> show} def +/brace231 {<9a> show} def +/brace232 {<9b> show} def +/brace233 {<9c> show} def +/brace234 {<9d> show} def +/brace235 {<9e> show} def +/brace236 {<9f> show} def +/brace237 { show} def +% 0xa0 +/brace238 { show} def +/brace239 { show} def +/brace240 { show} def +/brace241 { show} def +/brace242 { show} def +/brace243 { show} def +/brace244 { show} def +/brace245 { show} def +/brace246 { show} def +/brace247 { show} def +% 0xaa +/brace248 { show} def +/brace249 { show} def +/brace250 { show} def +/brace251 { show} def +/brace252 { show} def +/brace253 { show} def +/brace254 { show} def +/brace255 { show} def +/brace256 { show} def +/brace257 { show} def +% 0xb4 +/brace258 { show} def +/brace259 { show} def +/brace260 { show} def +/brace261 { show} def +/brace262 { show} def +/brace263 { show} def +/brace264 { show} def +/brace265 { show} def +/brace266 { show} def +/brace267 { show} def +% 0xbe +/brace268 { show} def +/brace269 { show} def +/brace270 { show} def +/brace271 { show} def +/brace272 { show} def +/brace273 { show} def +/brace274 { show} def +/brace275 { show} def +/brace276 { show} def +/brace277 { show} def +% 0xc8 +/brace278 { show} def +/brace279 { show} def +/brace280 { show} def +/brace281 { show} def +/brace282 { show} def +/brace283 { show} def +/brace284 { show} def +/brace285 { show} def +/brace286 { show} def +/brace287 { show} def +% 0xd2 +/brace288 { show} def +/brace289 { show} def +/brace290 { show} def +/brace291 { show} def +/brace292 { show} def +/brace293 { show} def +/brace294 { show} def +/brace295 { show} def +/brace296 { show} def +/brace297 { show} def +% 0xdc +/brace298 {
    show} def +/brace299 { show} def +% 0xde + +/BracesSEncoding [ + % 0x00 + /.notdef /brace3 /brace4 /brace30 /brace31 /brace32 /brace33 /brace34 + /brace35 /brace36 /brace37 /brace38 /brace39 /brace40 /brace41 + /brace42 /brace43 /brace44 /brace45 /brace46 /brace47 /brace48 + /brace49 /brace300 /brace301 /brace302 /brace303 /brace304 /brace305 + /brace306 /brace307 /brace308 /brace309 /brace310 /brace311 /brace312 + % 0x24 + /brace313 /brace314 /brace315 /brace316 /brace317 /brace318 /brace319 + /brace320 /brace321 /brace322 /brace323 /brace324 /brace325 /brace326 + /brace327 /brace328 /brace329 /brace330 /brace331 /brace332 /brace333 + /brace334 /brace335 /brace336 /brace337 /brace338 /brace339 /brace340 + /brace341 /brace342 /brace343 /brace344 /brace345 /brace346 /brace347 + % 0x47 + /brace348 /brace349 /brace350 /brace351 /brace352 /brace353 /brace354 + /brace355 /brace356 /brace357 /brace358 /brace359 /brace360 /brace361 + /brace362 /brace363 /brace364 /brace365 /brace366 /brace367 /brace368 + /brace369 /brace370 /brace371 /brace372 /brace373 /brace374 /brace375 + /brace376 /brace377 /brace378 /brace379 /brace380 /brace381 /brace382 + % 0x6a + /brace383 /brace384 /brace385 /brace386 /brace387 /brace388 /brace389 + /brace390 /brace391 /brace392 /brace393 /brace394 /brace395 /brace396 + /brace397 /brace398 /brace399 /brace400 /brace401 /brace402 /brace403 + /brace404 /brace405 /brace406 /brace407 /brace408 /brace409 /brace410 + /brace411 /brace412 /brace413 /brace414 /brace415 /brace416 /brace417 + % 0x8d + /brace418 /brace419 /brace420 /brace421 /brace422 /brace423 /brace424 + /brace425 /brace426 /brace427 /brace428 /brace429 /brace430 /brace431 + /brace432 /brace433 /brace434 /brace435 /brace436 /brace437 /brace438 + /brace439 /brace440 /brace441 /brace442 /brace443 /brace444 /brace445 + /brace446 /brace447 /brace448 /brace449 /brace450 /brace451 /brace452 + % 0xb0 + /brace453 /brace454 /brace455 /brace456 /brace457 /brace458 /brace459 + /brace460 /brace461 /brace462 /brace463 /brace464 /brace465 /brace466 + /brace467 /brace468 /brace469 /brace470 /brace471 /brace472 /brace473 + /brace474 /brace475 /brace476 /brace477 /brace478 /brace479 /brace480 + /brace481 /brace482 /brace483 /brace484 /brace485 /brace486 /brace487 + % 0xd3 + /brace488 /brace489 /brace490 /brace491 /brace492 /brace493 /brace494 + /brace495 /brace496 /brace497 /brace498 /brace499 + % 0xdf + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef + % 0xff +] def + +% 0x00 +/brace3 {<01> show} def +/brace4 {<02> show} def +/brace30 {<03> show} def +/brace31 {<04> show} def +/brace32 {<05> show} def +/brace33 {<06> show} def +/brace34 {<07> show} def +/brace35 {<08> show} def +/brace36 {<09> show} def +/brace37 {<0a> show} def +% 0xa +/brace38 {<0b> show} def +/brace39 {<0c> show} def +/brace40 {<0d> show} def +/brace41 {<0e> show} def +/brace42 {<0f> show} def +/brace43 {<10> show} def +/brace44 {<11> show} def +/brace45 {<12> show} def +/brace46 {<13> show} def +/brace47 {<14> show} def +% 0x14 +/brace48 {<15> show} def +/brace49 {<16> show} def +/brace300 {<17> show} def +/brace301 {<18> show} def +/brace302 {<19> show} def +/brace303 {<1a> show} def +/brace304 {<1b> show} def +/brace305 {<1c> show} def +/brace306 {<1d> show} def +/brace307 {<1e> show} def +% 0x1e +/brace308 {<1f> show} def +/brace309 {<20> show} def +/brace310 {<21> show} def +/brace311 {<22> show} def +/brace312 {<23> show} def +/brace313 {<24> show} def +/brace314 {<25> show} def +/brace315 {<26> show} def +/brace316 {<27> show} def +/brace317 {<28> show} def +% 0x28 +/brace318 {<29> show} def +/brace319 {<2a> show} def +/brace320 {<2b> show} def +/brace321 {<2c> show} def +/brace322 {<2d> show} def +/brace323 {<2e> show} def +/brace324 {<2f> show} def +/brace325 {<30> show} def +/brace326 {<31> show} def +/brace327 {<32> show} def +% 0x32 +/brace328 {<33> show} def +/brace329 {<34> show} def +/brace330 {<35> show} def +/brace331 {<36> show} def +/brace332 {<37> show} def +/brace333 {<38> show} def +/brace334 {<39> show} def +/brace335 {<3a> show} def +/brace336 {<3b> show} def +/brace337 {<3c> show} def +% 0x3c +/brace338 {<3d> show} def +/brace339 {<3e> show} def +/brace340 {<3f> show} def +/brace341 {<40> show} def +/brace342 {<41> show} def +/brace343 {<42> show} def +/brace344 {<43> show} def +/brace345 {<44> show} def +/brace346 {<45> show} def +/brace347 {<46> show} def +% 0x46 +/brace348 {<47> show} def +/brace349 {<48> show} def +/brace350 {<49> show} def +/brace351 {<4a> show} def +/brace352 {<4b> show} def +/brace353 {<4c> show} def +/brace354 {<4d> show} def +/brace355 {<4e> show} def +/brace356 {<4f> show} def +/brace357 {<50> show} def +% 0x50 +/brace358 {<51> show} def +/brace359 {<52> show} def +/brace360 {<53> show} def +/brace361 {<54> show} def +/brace362 {<55> show} def +/brace363 {<56> show} def +/brace364 {<57> show} def +/brace365 {<58> show} def +/brace366 {<59> show} def +/brace367 {<5a> show} def +% 0x5a +/brace368 {<5b> show} def +/brace369 {<5c> show} def +/brace370 {<5d> show} def +/brace371 {<5e> show} def +/brace372 {<5f> show} def +/brace373 {<60> show} def +/brace374 {<61> show} def +/brace375 {<62> show} def +/brace376 {<63> show} def +/brace377 {<64> show} def +% 0x64 +/brace378 {<65> show} def +/brace379 {<66> show} def +/brace380 {<67> show} def +/brace381 {<68> show} def +/brace382 {<69> show} def +/brace383 {<6a> show} def +/brace384 {<6b> show} def +/brace385 {<6c> show} def +/brace386 {<6d> show} def +/brace387 {<6e> show} def +% 0x6e +/brace388 {<6f> show} def +/brace389 {<70> show} def +/brace390 {<71> show} def +/brace391 {<72> show} def +/brace392 {<73> show} def +/brace393 {<74> show} def +/brace394 {<75> show} def +/brace395 {<76> show} def +/brace396 {<77> show} def +/brace397 {<78> show} def +% 0x78 +/brace398 {<79> show} def +/brace399 {<7a> show} def +/brace400 {<7b> show} def +/brace401 {<7c> show} def +/brace402 {<7d> show} def +/brace403 {<7e> show} def +/brace404 {<7f> show} def +/brace405 {<80> show} def +/brace406 {<81> show} def +/brace407 {<82> show} def +% 0x82 +/brace408 {<83> show} def +/brace409 {<84> show} def +/brace410 {<85> show} def +/brace411 {<86> show} def +/brace412 {<87> show} def +/brace413 {<88> show} def +/brace414 {<89> show} def +/brace415 {<8a> show} def +/brace416 {<8b> show} def +/brace417 {<8c> show} def +% 0x8c +/brace418 {<8d> show} def +/brace419 {<8e> show} def +/brace420 {<8f> show} def +/brace421 {<90> show} def +/brace422 {<91> show} def +/brace423 {<92> show} def +/brace424 {<93> show} def +/brace425 {<94> show} def +/brace426 {<95> show} def +/brace427 {<96> show} def +% 0x96 +/brace428 {<97> show} def +/brace429 {<98> show} def +/brace430 {<99> show} def +/brace431 {<9a> show} def +/brace432 {<9b> show} def +/brace433 {<9c> show} def +/brace434 {<9d> show} def +/brace435 {<9e> show} def +/brace436 {<9f> show} def +/brace437 { show} def +% 0xa0 +/brace438 { show} def +/brace439 { show} def +/brace440 { show} def +/brace441 { show} def +/brace442 { show} def +/brace443 { show} def +/brace444 { show} def +/brace445 { show} def +/brace446 { show} def +/brace447 { show} def +% 0xaa +/brace448 { show} def +/brace449 { show} def +/brace450 { show} def +/brace451 { show} def +/brace452 { show} def +/brace453 { show} def +/brace454 { show} def +/brace455 { show} def +/brace456 { show} def +/brace457 { show} def +% 0xb4 +/brace458 { show} def +/brace459 { show} def +/brace460 { show} def +/brace461 { show} def +/brace462 { show} def +/brace463 { show} def +/brace464 { show} def +/brace465 { show} def +/brace466 { show} def +/brace467 { show} def +% 0xbe +/brace468 { show} def +/brace469 { show} def +/brace470 { show} def +/brace471 { show} def +/brace472 { show} def +/brace473 { show} def +/brace474 { show} def +/brace475 { show} def +/brace476 { show} def +/brace477 { show} def +% 0xc8 +/brace478 { show} def +/brace479 { show} def +/brace480 { show} def +/brace481 { show} def +/brace482 { show} def +/brace483 { show} def +/brace484 { show} def +/brace485 { show} def +/brace486 { show} def +/brace487 { show} def +% 0xd2 +/brace488 { show} def +/brace489 { show} def +/brace490 { show} def +/brace491 { show} def +/brace492 { show} def +/brace493 { show} def +/brace494 { show} def +/brace495 { show} def +/brace496 { show} def +/brace497 { show} def +% 0xdc +/brace498 {
    show} def +/brace499 { show} def +% 0xde + +/BracesOEncoding [ + % 0x00 + /.notdef /brace0 /brace5 /brace6 /brace7 /brace8 /brace9 /brace50 + /brace51 /brace52 /brace53 /brace54 /brace55 /brace56 /brace57 + /brace58 /brace59 /brace60 /brace61 /brace62 /brace63 /brace64 + /brace65 /brace66 /brace67 /brace68 /brace69 /brace70 /brace71 + /brace72 /brace73 /brace74 /brace75 /brace76 /brace77 /brace78 + % 0x24 + /brace79 /brace80 /brace81 /brace82 /brace83 /brace84 /brace85 + /brace86 /brace87 /brace88 /brace89 /brace90 /brace91 /brace92 + /brace93 /brace94 /brace95 /brace96 /brace97 /brace98 /brace99 + /brace500 /brace501 /brace502 /brace503 /brace504 /brace505 /brace506 + /brace507 /brace508 /brace509 /brace510 /brace511 /brace512 /brace513 + % 0x47 + /brace514 /brace515 /brace516 /brace517 /brace518 /brace519 /brace520 + /brace521 /brace522 /brace523 /brace524 /brace525 /brace526 /brace527 + /brace528 /brace529 /brace530 /brace531 /brace532 /brace533 /brace534 + /brace535 /brace536 /brace537 /brace538 /brace539 /brace540 /brace541 + /brace542 /brace543 /brace544 /brace545 /brace546 /brace547 /brace548 + % 0x6a + /brace549 /brace550 /brace551 /brace552 /brace553 /brace554 /brace555 + /brace556 /brace557 /brace558 /brace559 /brace560 /brace561 /brace562 + /brace563 /brace564 /brace565 /brace566 /brace567 /brace568 /brace569 + /brace570 /brace571 /brace572 /brace573 /brace574 /brace575 + % 0x85 + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + % 0xa8 + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + % 0xcb + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + % 0xee + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef + % 0xff +] def + +% 0x00 +/brace0 {<01> show} def +/brace5 {<02> show} def +/brace6 {<03> show} def +/brace7 {<04> show} def +/brace8 {<05> show} def +/brace9 {<06> show} def +/brace50 {<07> show} def +/brace51 {<08> show} def +/brace52 {<09> show} def +/brace53 {<0a> show} def +% 0xa +/brace54 {<0b> show} def +/brace55 {<0c> show} def +/brace56 {<0d> show} def +/brace57 {<0e> show} def +/brace58 {<0f> show} def +/brace59 {<10> show} def +/brace60 {<11> show} def +/brace61 {<12> show} def +/brace62 {<13> show} def +/brace63 {<14> show} def +% 0x14 +/brace64 {<15> show} def +/brace65 {<16> show} def +/brace66 {<17> show} def +/brace67 {<18> show} def +/brace68 {<19> show} def +/brace69 {<1a> show} def +/brace70 {<1b> show} def +/brace71 {<1c> show} def +/brace72 {<1d> show} def +/brace73 {<1e> show} def +% 0x1e +/brace74 {<1f> show} def +/brace75 {<20> show} def +/brace76 {<21> show} def +/brace77 {<22> show} def +/brace78 {<23> show} def +/brace79 {<24> show} def +/brace80 {<25> show} def +/brace81 {<26> show} def +/brace82 {<27> show} def +/brace83 {<28> show} def +% 0x28 +/brace84 {<29> show} def +/brace85 {<2a> show} def +/brace86 {<2b> show} def +/brace87 {<2c> show} def +/brace88 {<2d> show} def +/brace89 {<2e> show} def +/brace90 {<2f> show} def +/brace91 {<30> show} def +/brace92 {<31> show} def +/brace93 {<32> show} def +% 0x32 +/brace94 {<33> show} def +/brace95 {<34> show} def +/brace96 {<35> show} def +/brace97 {<36> show} def +/brace98 {<37> show} def +/brace99 {<38> show} def +/brace500 {<39> show} def +/brace501 {<3a> show} def +/brace502 {<3b> show} def +/brace503 {<3c> show} def +% 0x3c +/brace504 {<3d> show} def +/brace505 {<3e> show} def +/brace506 {<3f> show} def +/brace507 {<40> show} def +/brace508 {<41> show} def +/brace509 {<42> show} def +/brace510 {<43> show} def +/brace511 {<44> show} def +/brace512 {<45> show} def +/brace513 {<46> show} def +% 0x46 +/brace514 {<47> show} def +/brace515 {<48> show} def +/brace516 {<49> show} def +/brace517 {<4a> show} def +/brace518 {<4b> show} def +/brace519 {<4c> show} def +/brace520 {<4d> show} def +/brace521 {<4e> show} def +/brace522 {<4f> show} def +/brace523 {<50> show} def +% 0x50 +/brace524 {<51> show} def +/brace525 {<52> show} def +/brace526 {<53> show} def +/brace527 {<54> show} def +/brace528 {<55> show} def +/brace529 {<56> show} def +/brace530 {<57> show} def +/brace531 {<58> show} def +/brace532 {<59> show} def +/brace533 {<5a> show} def +% 0x5a +/brace534 {<5b> show} def +/brace535 {<5c> show} def +/brace536 {<5d> show} def +/brace537 {<5e> show} def +/brace538 {<5f> show} def +/brace539 {<60> show} def +/brace540 {<61> show} def +/brace541 {<62> show} def +/brace542 {<63> show} def +/brace543 {<64> show} def +% 0x64 +/brace544 {<65> show} def +/brace545 {<66> show} def +/brace546 {<67> show} def +/brace547 {<68> show} def +/brace548 {<69> show} def +/brace549 {<6a> show} def +/brace550 {<6b> show} def +/brace551 {<6c> show} def +/brace552 {<6d> show} def +/brace553 {<6e> show} def +% 0x6e +/brace554 {<6f> show} def +/brace555 {<70> show} def +/brace556 {<71> show} def +/brace557 {<72> show} def +/brace558 {<73> show} def +/brace559 {<74> show} def +/brace560 {<75> show} def +/brace561 {<76> show} def +/brace562 {<77> show} def +/brace563 {<78> show} def +% 0x78 +/brace564 {<79> show} def +/brace565 {<7a> show} def +/brace566 {<7b> show} def +/brace567 {<7c> show} def +/brace568 {<7d> show} def +/brace569 {<7e> show} def +/brace570 {<7f> show} def +/brace571 {<80> show} def +/brace572 {<81> show} def +/brace573 {<82> show} def +% 0x82 +/brace574 {<83> show} def +/brace575 {<84> show} def +% 0x84 + +FontDirectory /Emmentaler-Brace known { + /Emmentaler-Brace findfont dup length dict copy begin + /Encoding BracesNEncoding def + /Emmentaler-Brace-N currentdict definefont pop end + /Emmentaler-Brace findfont dup length dict copy begin + /Encoding BracesSEncoding def + /Emmentaler-Brace-S currentdict definefont pop end + /Emmentaler-Brace findfont dup length dict copy begin + /Encoding BracesOEncoding def + /Emmentaler-Brace-O currentdict definefont pop end +} if + +FontDirectory /Emmentaler-11 known { + /Emmentaler-11 findfont dup length dict copy begin + /Encoding LilyNoteHeadEncoding def + /Emmentaler-11-N currentdict definefont pop end + /Emmentaler-11 findfont dup length dict copy begin + /Encoding LilyScriptEncoding def + /Emmentaler-11-S currentdict definefont pop end + /Emmentaler-11 findfont dup length dict copy begin + /Encoding LilyOtherEncoding def + /Emmentaler-11-O currentdict definefont pop end +} if + +FontDirectory /Emmentaler-13 known { + /Emmentaler-13 findfont dup length dict copy begin + /Encoding LilyNoteHeadEncoding def + /Emmentaler-13-N currentdict definefont pop end + /Emmentaler-13 findfont dup length dict copy begin + /Encoding LilyScriptEncoding def + /Emmentaler-13-S currentdict definefont pop end + /Emmentaler-13 findfont dup length dict copy begin + /Encoding LilyOtherEncoding def + /Emmentaler-13-O currentdict definefont pop end +} if + +FontDirectory /Emmentaler-14 known { + /Emmentaler-14 findfont dup length dict copy begin + /Encoding LilyNoteHeadEncoding def + /Emmentaler-14-N currentdict definefont pop end + /Emmentaler-14 findfont dup length dict copy begin + /Encoding LilyScriptEncoding def + /Emmentaler-14-S currentdict definefont pop end + /Emmentaler-14 findfont dup length dict copy begin + /Encoding LilyOtherEncoding def + /Emmentaler-14-O currentdict definefont pop end +} if + +FontDirectory /Emmentaler-16 known { + /Emmentaler-16 findfont dup length dict copy begin + /Encoding LilyNoteHeadEncoding def + /Emmentaler-16-N currentdict definefont pop end + /Emmentaler-16 findfont dup length dict copy begin + /Encoding LilyScriptEncoding def + /Emmentaler-16-S currentdict definefont pop end + /Emmentaler-16 findfont dup length dict copy begin + /Encoding LilyOtherEncoding def + /Emmentaler-16-O currentdict definefont pop end +} if + +FontDirectory /Emmentaler-18 known { + /Emmentaler-18 findfont dup length dict copy begin + /Encoding LilyNoteHeadEncoding def + /Emmentaler-18-N currentdict definefont pop end + /Emmentaler-18 findfont dup length dict copy begin + /Encoding LilyScriptEncoding def + /Emmentaler-18-S currentdict definefont pop end + /Emmentaler-18 findfont dup length dict copy begin + /Encoding LilyOtherEncoding def + /Emmentaler-18-O currentdict definefont pop end +} if + +FontDirectory /Emmentaler-20 known { + /Emmentaler-20 findfont dup length dict copy begin + /Encoding LilyNoteHeadEncoding def + /Emmentaler-20-N currentdict definefont pop end + /Emmentaler-20 findfont dup length dict copy begin + /Encoding LilyScriptEncoding def + /Emmentaler-20-S currentdict definefont pop end + /Emmentaler-20 findfont dup length dict copy begin + /Encoding LilyOtherEncoding def + /Emmentaler-20-O currentdict definefont pop end +} if + +FontDirectory /Emmentaler-23 known { + /Emmentaler-23 findfont dup length dict copy begin + /Encoding LilyNoteHeadEncoding def + /Emmentaler-23-N currentdict definefont pop end + /Emmentaler-23 findfont dup length dict copy begin + /Encoding LilyScriptEncoding def + /Emmentaler-23-S currentdict definefont pop end + /Emmentaler-23 findfont dup length dict copy begin + /Encoding LilyOtherEncoding def + /Emmentaler-23-O currentdict definefont pop end +} if + +FontDirectory /Emmentaler-26 known { + /Emmentaler-26 findfont dup length dict copy begin + /Encoding LilyNoteHeadEncoding def + /Emmentaler-26-N currentdict definefont pop end + /Emmentaler-26 findfont dup length dict copy begin + /Encoding LilyScriptEncoding def + /Emmentaler-26-S currentdict definefont pop end + /Emmentaler-26 findfont dup length dict copy begin + /Encoding LilyOtherEncoding def + /Emmentaler-26-O currentdict definefont pop end +} if + +% end encodingdefs.ps diff --git a/python/GNUmakefile b/python/GNUmakefile index 87fa766089..19af006386 100644 --- a/python/GNUmakefile +++ b/python/GNUmakefile @@ -6,7 +6,8 @@ STEPMAKE_TEMPLATES=c python-module install-out po include $(depth)/make/stepmake.make -CFLAGS += -DPy_BUILD_CORE -Wall +CFLAGS += -DPy_BUILD_CORE -Wall $(PYTHON_CFLAGS) +LDFLAGS += $(PYTHON_LIBS) # unset al guile stuff from configure CONFIG_LDFLAGS= diff --git a/python/book_latex.py b/python/book_latex.py index a3b2b18b78..ec5412b1d8 100644 --- a/python/book_latex.py +++ b/python/book_latex.py @@ -200,7 +200,6 @@ def get_latex_textwidth (source, global_options): universal_newlines = True if sys.platform == 'mingw32': universal_newlines = False - if (sys.platform == 'mingw32') and (sys.version_info < (2, 6)): ### use os.system to avoid weird sleep() problems on ### GUB's python 2.4.2 on mingw # make file to write to @@ -208,7 +207,13 @@ def get_latex_textwidth (source, global_options): output_filename = os.path.join(output_dir, 'output.txt') # call command cmd += " > %s" % output_filename + oldtexinputs = os.environ.get ('TEXINPUTS') + os.environ['TEXINPUTS'] = run_env['TEXINPUTS'] returncode = os.system(cmd) + if oldtexinputs: + os.environ['TEXINPUTS'] = oldtexinputs + else: + del os.environ['TEXINPUTS'] parameter_string = open(output_filename).read() if returncode != 0: warning (_ ("Unable to auto-detect default settings:\n")) diff --git a/python/book_snippets.py b/python/book_snippets.py index 69fdc4fa68..4bc4252e79 100644 --- a/python/book_snippets.py +++ b/python/book_snippets.py @@ -644,10 +644,20 @@ printing diff against existing file." % filename) if not os.path.isdir (dst_path): os.makedirs (dst_path) try: - os.link (src, dst) - except AttributeError: - shutil.copyfile (src, dst) - except OSError: + if (self.global_options.use_source_file_names + and isinstance (self, LilypondFileSnippet)): + fout = open (dst, 'w') + fin = open (src, 'r') + for line in fin.readlines (): + fout.write (line.replace (self.basename (), self.final_basename ())) + fout.close () + fin.close () + else: + try: + os.link (src, dst) + except AttributeError: + shutil.copyfile (src, dst) + except (IOError, OSError): error (_ ('Could not overwrite file %s') % dst) raise CompileError(self.basename()) diff --git a/python/book_texinfo.py b/python/book_texinfo.py index 226ec8eb6f..1055615d67 100644 --- a/python/book_texinfo.py +++ b/python/book_texinfo.py @@ -170,6 +170,8 @@ TEXINFO_INSPECTION_DOCUMENT = r''' @message{Global: textwidth=@the@hsize,exampleindent=@the@lispnarrowing} +dummy + @bye ''' diff --git a/python/convertrules.py b/python/convertrules.py index ec8bd266ef..3e43a28133 100644 --- a/python/convertrules.py +++ b/python/convertrules.py @@ -2818,7 +2818,7 @@ def conv(str): if re.search(r'\\oldaddlyrics', str): stderr_write (NOT_SMART % "oldaddlyrics") stderr_write (_ ("oldaddlyrics is no longer supported. \n \ - Use addlyrics or lyrsicsto instead.\n")) + Use addlyrics or lyricsto instead.\n")) stderr_write (UPDATE_MANUALLY) raise FatalConversionError () return str @@ -2846,7 +2846,7 @@ def conv(str): if re.search("(Slur|Tie)\w+#\'dash-fraction", str) \ or re.search("(Slur|Tie)\w+#\'dash-period", str): stderr_write (NOT_SMART % "dash-fraction, dash-period") - stderr_write (_ ("Dash parameters for slurs and ties are now in \'dash-details.\n")) + stderr_write (_ ("Dash parameters for slurs and ties are now in \'dash-definition.\n")) stderr_write (UPDATE_MANUALLY) return str @@ -3298,12 +3298,15 @@ def brace_matcher (n): return r"[^{}]*?(?:{"*n+r"[^{}]*?"+r"}[^{}]*?)*?"*n matchstring = r'"(?:[^"\\]|\\.)*"' -matcharg = (r"\s+(?:[$#]['`]?\s*(?:[a-zA-Z]\S*|" + matchstring + r"|\(" - + paren_matcher(20) + r"\))|" + matchstring + r"|\\[a-z_A-Z]+)") -matchmarkup = (r'(?:\\markup\s*(?:{' + brace_matcher (20) +r'}|' + +matcharg = (r"\s+(?:[$#]['`]?\s*(?:[a-zA-Z][^ \t\n()\\]*|" + matchstring + + r"|#?\(" + paren_matcher(20) + r"\)|" + + r"-?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)|" + + r"#(?:[tf]|\\.|@?\{" + brace_matcher (10) + r"#@?\}))|" + + matchstring + r"|\\[a-z_A-Z]+|[0-9]+(?:/[0-9]+)?|-[0-9]+)") +matchmarkup = (r'(?:\\markup\s*(?:@?\{' + brace_matcher (20) +r'\}|' + matchstring + r'|(?:\\[a-z_A-Z][a-z_A-Z-]*(?:' + matcharg + - r')*?\s*)*(?:' + matchstring + "|{" + brace_matcher (20) + - "}))|" + matchstring + ")") + r')*?\s*)*(?:' + matchstring + r"|@?\{" + brace_matcher (20) + + r"\}))|" + matchstring + ")") @rule((2, 15, 25), r"\(auto)?Footnote(Grob)? -> \footnote") def conv (str): @@ -3450,7 +3453,7 @@ def conv (str): if m.group (1): return m.group (0) x = m.group (2) + m.group (4) - + if m.group (3): x = x + re.sub (r"(\s*)(" + symbol_list + ")", fn_path_replace, m.group (3)) @@ -3465,9 +3468,9 @@ def conv (str): r"\1\2.\3", str) str = re.sub (r'''(\\(?:alterBroken|overrideProperty)\s+)#?"([A-Za-z]+)\s*\.\s*([A-Za-z]+)"''', r"\1\2.\3", str) - str = re.sub (r'''(\\tweak\s+)#?"?([A-Za-z]+)"?\s+?#'([-A-Za-z]+)''', + str = re.sub (r'''(\\tweak\s+)#?"?([A-W][A-Za-z]*)"?\s+?#'([a-zX-Z][-A-Za-z]*)''', r"\1\2.\3", str) - str = re.sub (r'''(\\tweak\s+)#'([-A-Za-z]+)''', + str = re.sub (r'''(\\tweak\s+)#'([a-zX-Z][-A-Za-z]*)''', r"\1\2", str) str = re.sub ("(" + matchmarkup + ")|" + r"(\\footnote(?:\s*" @@ -3665,7 +3668,7 @@ def conv(str): @rule((2, 17, 27), r'''\stringTuning \notemode -> \stringTuning''') def conv(str): - str = re.sub (r"\\stringTuning\s*\\notemode(\s*)@?\{\s*(.*?)\s*@?}", + str = re.sub (r"\\stringTuning\s*\\notemode(\s*)@?\{\s*(.*?)\s*@?\}", r"\\stringTuning\1\2", str) if re.search (r'[^-\w]staff-padding[^-\w]', str): stderr_write (NOT_SMART % "staff-padding") @@ -3698,6 +3701,193 @@ def conv (str): def conv (str): return str +@rule ((2, 19, 2), r"\lyricsto \new/\context/... -> \new/\context/... \lyricsto") +def conv (str): + word=r'(?:#?"[^"]*"|\b' + wordsyntax + r'\b)' + str = re.sub (r"(\\lyricsto\s*" + word + r"\s*)(\\(?:new|context)\s*" + word + + r"(?:\s*=\s*" + word + r")?\s*)", + r"\2\1", str) + str = re.sub (r"(\\lyricsto\s*" + word + r"\s*)\\lyricmode\b\s*", + r"\1", str) + str = re.sub (r"(\\lyricsto\s*" + word + r"\s*)\\lyrics\b\s*", + r"\\new Lyrics \1", str) + str = re.sub (r'\\lyricmode\s*(\\lyricsto\b)', r"\1", str) + return str + +@rule ((2, 19, 7), "keySignature -> keyAlterations") +def conv(str): + str = re.sub (r'\bkeySignature\b', 'keyAlterations', str) + str = re.sub (r'\blastKeySignature\b', 'lastKeyAlterations', str) + str = re.sub (r'\blocalKeySignature\b', 'localAlterations', str) + return str + +@rule ((2, 19, 11), "thin-kern -> segno-kern") +def conv(str): + str = re.sub (r'\bthin-kern\b', 'segno-kern', str) + return str + +# before_id is written in a manner where it will only substantially +# (rather than as a lookbefore assertion) match material that could +# not be part of a previous id. In that manner, one replacement does +# not inhibit an immediately adjacent replacement. + +before_id = r'(?:^|(? initialTimeSignatureVisibility +csharp -> c-sharp""") +def conv(str): + str = re.sub (r'\bimplicitTimeSignatureVisibility\b', 'initialTimeSignatureVisibility', str) + str = re.sub ('(' + before_id + r'[a-g])((?:sharp){1,2}|(?:flat){1,2})' + + after_id, r'\1-\2', str) + return str + +@rule ((2, 19, 22), """whiteout -> whiteout-box +(define-xxx-function (parser location ...) -> (define-xxx-function (...) +(xxx ... parser ...) -> (xxx ... ...)""") +def conv(str): + # whiteout -> whiteout-box + str = re.sub (r"\\whiteout(?![a-z_-])", r"\\whiteout-box", str) + str = re.sub (r"\b\.whiteout(?![a-z_-])\b", r".whiteout-box", str) + str = re.sub (r"#'whiteout(?![a-z_-])\b", r"#'whiteout-box", str) + str = re.sub (r"\bstencil-whiteout\b", r"stencil-whiteout-box", str) + + # (define-xxx-function (parser location ...) -> (define-xxx-function (...) + def subst(m): + def subsub(m): + str = (m.group (1) + + re.sub ('(?<=\s|["\\()])' + m.group (2) + r'(?=\s|["\\()])', + r'(*location*)', + re.sub (r'(?<=\s|["\\()])parser(?=\s|["\\()])', + r'(*parser*)', m.group (3)))) + return str + return re.sub (r'(\([-a-z]+\s*\(+)parser\s+([-a-z]+)\s*((?:.|\n)*)$', + subsub, m.group (0)) + str = re.sub (r'\(define-(?:music|event|scheme|void)-function(?=\s|["(])' + + paren_matcher (20) + r'\)', subst, str) + + # (xxx ... parser ...) -> (xxx ... ...) + def repl (m): + return m.group (1) + inner (m.group (2)) + def inner (str): + str = re.sub (r"(\((?:" + + r"ly:parser-lexer|" + + r"ly:parser-clone|" + + r"ly:parser-output-name|" + + r"ly:parser-error|" + + r"ly:parser-define!|" + + r"ly:parser-lookup|" + + r"ly:parser-has-error\?|" + + r"ly:parser-clear-error|" + + r"ly:parser-set-note-names|" + + r"ly:parser-include-string|" + + r"note-names-language|" + + r"display-lily-music|" + + r"music->lily-string|" + + r"note-name->lily-string|" + + r"value->lily-string|" + r"check-grob-path|" + + r"event-chord-wrap!|" + + r"collect-bookpart-for-book|" + + r"collect-scores-for-book|" + + r"collect-music-aux|" + + r"collect-book-music-for-book|" + + r"scorify-music|" + + r"collect-music-for-book|" + + r"collect-book-music-for-book|" + + r"toplevel-book-handler|" + + r"default-toplevel-book-handler|" + + r"print-book-with-defaults|" + + r"toplevel-music-handler|" + + r"toplevel-score-handler|" + + r"toplevel-text-handler|" + + r"toplevel-bookpart-handler|" + + r"book-music-handler|" + + r"context-mod-music-handler|" + + r"bookpart-music-handler|" + + r"output-def-music-handler|" + + r"print-book-with-defaults-as-systems|" + + r"add-score|" + + r"add-text|" + + r"add-music|" + + r"make-part-combine-music|" + + r"make-directed-part-combine-music|" + + r"add-quotable|" + + r"paper-variable|" + + r"make-autochange-music|" + + r"context-mod-from-music|" + + r"context-defs-from-music)" + + r'(?=\s|[()]))(' + paren_matcher (20) + ")" + r"(?:\s+parser(?=\s|[()])|\s*\(\*parser\*\))", repl, str) + return str + str = inner (str) + # This is the simplest case, resulting from one music function + # trying to call another one via Scheme. The caller is supposed + # to have its uses of parser/location converted to + # (*parser*)/(*location*) already. Other uses of + # ly:music-function-extract are harder to convert but unlikely. + str = re.sub (r'(\(\s*\(ly:music-function-extract\s+' + wordsyntax + + r'\s*\)\s+)\(\*parser\*\)\s*\(\*location\*\)', r'\1', + str) + return str + +@rule ((2, 19, 24), r"""music-has-type -> music-is-of-type? +\applyOutput #'Context -> \applyOutput Context""") +def conv (str): + str = re.sub (r'(?<=\s|["\\()])' + "music-has-type" + r'(?=\s|["\\()])', + "music-is-of-type?", str) + str = re.sub (r"(\\applyOutput\s+)#'([a-zA-Z])", r"\1\2", str) + return str + +@rule ((2, 19, 28), r"c:5.x, c:5^x, c:sus -> c:3.5.x, c:3.5^x, c:5") +def conv (str): + str = re.sub (r":5([.^][1-9])", r":3.5\1", str) + # row back for self-defeating forms + str = re.sub (r":3\.5((?:\.[0-9]+)*\^(?:[0-9]+\.)*)3\.", r":5\1", str) + str = re.sub (r":3\.5((?:\.[0-9]+)*\^?:[0-9]+(?:\.[0-9]+)*)\.3(?![.0-9])", r":5\1", str) + str = re.sub (r":3\.5((?:\.[0-9]+)*)\^3(?=\s|\})", r":5\1", str) + str = re.sub (r":sus(?=\s|\})", ":5", str) + str = re.sub (r":1\.5(?=\s|[.^}])", r":5", str) + return str + +@rule ((2, 19, 29), r"partcombine*Once -> \once \partcombine*") +def conv(str): + str = re.sub (r"(\\partcombine(?:Apart|Chords|Unisono|SoloII?|Automatic))Once\b", + r"\\once \1", str) + str = re.sub (r"(\\partcombineForce" + matcharg + r")\s*##f(\s)", + r"\1\2", str) + str = re.sub (r"(\\partcombineForce" + matcharg + r")\s*##t(\s)", + r"\\once \1\2", str) + return str + +@rule ((2, 19, 32), r"whiteout-box -> whiteout") +def conv(str): + str = re.sub (r"\\whiteout-box(?![a-z_-])", r"\\whiteout", str) + str = re.sub (r"\b\.whiteout-box(?![a-z_-])\b", r".whiteout", str) + str = re.sub (r"#'whiteout-box(?![a-z_-])\b", r"#'whiteout", str) + return str + +@rule ((2, 19, 40), r"\time #'(2 3) ... -> \time 2,3 ...") +def conv (str): + def repl (m): + return m.group(1) + re.sub (r"\s+", ",", m.group (2)) + + str = re.sub (r"(beatStructure\s*=\s*)#'\(([0-9]+(?:\s+[0-9]+)+)\)", + repl, str) + + str = re.sub (r"(\\time\s*)#'\(([0-9]+(?:\s+[0-9]+)+)\)", repl, str) + def repl (m): + subst = re.sub (r"\s+", ",", m.group (1)) + return subst + (4 + len (m.group (1)) - len (subst)) * " " + m.group (2) + + str = re.sub (r"#'\(([0-9]+(?:\s+[0-9]+)+)\)(\s+%\s*beatStructure)", + repl, str) + return str + # Guidelines to write rules (please keep this at the end of this file) # # - keep at most one rule per version; if several conversions should be done, diff --git a/python/langdefs.py b/python/langdefs.py index d3d6c07813..7511ffb2f1 100644 --- a/python/langdefs.py +++ b/python/langdefs.py @@ -59,6 +59,7 @@ def french_html_filter (page): body = body.replace (r[0], r[1]) return page[:body_begin] + body + page[body_end:] +ca = LanguageDef ('ca', 'català') cs = LanguageDef ('cs', 'česky', enable_ly_identifier_l10n=False) de = LanguageDef ('de', 'deutsch') es = LanguageDef ('es', 'español') @@ -73,8 +74,8 @@ zh = LanguageDef ('zh', '中文', enable_ly_identifier_l10n=False) # (please run 'make doc-clean' before doing that): #fr.enabled = False -LANGUAGES = (site, cs, de, es, fr, hu, it, ja, nl, zh) -WEB_LANGUAGES = (site, cs, de, es, fr, hu, it, ja, nl, zh) +LANGUAGES = (site, ca, cs, de, es, fr, hu, it, ja, nl, zh) +WEB_LANGUAGES = (site, ca, cs, de, es, fr, hu, it, ja, nl, zh) if os.getenv("MAKEWEB") == '1': LANGUAGES=WEB_LANGUAGES diff --git a/python/lilylib.py b/python/lilylib.py index 647061f4c7..a911cac23f 100644 --- a/python/lilylib.py +++ b/python/lilylib.py @@ -1,6 +1,6 @@ # This file is part of LilyPond, the GNU music typesetter. # -# Copyright (C) 1998--2012 Han-Wen Nienhuys +# Copyright (C) 1998--2015 Han-Wen Nienhuys # Jan Nieuwenhuizen # # LilyPond is free software: you can redistribute it and/or modify diff --git a/python/midi.c b/python/midi.c index 4049b49cb0..c7baedaf12 100644 --- a/python/midi.c +++ b/python/midi.c @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys Jan Nieuwenhuizen diff --git a/python/musicexp.py b/python/musicexp.py index ea2525d866..e8cbcb0167 100644 --- a/python/musicexp.py +++ b/python/musicexp.py @@ -3,7 +3,10 @@ import inspect import sys import string import re +import math import lilylib as ly +import warnings +import utilities _ = ly._ @@ -12,7 +15,8 @@ from rational import Rational # Store previously converted pitch for \relative conversion as a global state variable previous_pitch = None relative_pitches = False - +whatOrnament = "" +ly_dur = None # stores lilypond durations def escape_instrument_string (input_string): retstring = string.replace (input_string, "\"", "\\\"") @@ -35,13 +39,11 @@ class Output_stack_element: o.factor = self.factor return o -class Output_printer: - - """A class that takes care of formatting (eg.: indenting) a +class Output_printer(object): + """ + A class that takes care of formatting (eg.: indenting) a Music expression as a .ly file. - """ - def __init__ (self): self._line = '' self._indent = 4 @@ -55,9 +57,8 @@ class Output_printer: def set_file (self, file): self._file = file - def dump_version (self): - self.newline () - self.print_verbatim ('\\version "@TOPLEVEL_VERSION@"') + def dump_version (self, version): + self.print_verbatim ('\\version "' + version + '"') self.newline () def get_indent (self): @@ -69,7 +70,7 @@ class Output_printer: def add_factor (self, factor): self.override() - self._output_state_stack[-1].factor *= factor + self._output_state_stack[-1].factor *= factor def revert (self): del self._output_state_stack[-1] @@ -84,13 +85,13 @@ class Output_printer: def unformatted_output (self, str): # don't indent on \< and indent only once on << - self._nesting += ( str.count ('<') + self._nesting += (str.count ('<') - str.count ('\<') - str.count ('<<') - + str.count ('{') ) - self._nesting -= ( str.count ('>') - str.count ('\>') - str.count ('>>') + + str.count ('{')) + self._nesting -= (str.count ('>') - str.count ('\>') - str.count ('>>') - str.count ('->') - str.count ('_>') - str.count ('^>') - + str.count ('}') ) + + str.count ('}')) self.print_verbatim (str) def print_duration_string (self, str): @@ -99,6 +100,15 @@ class Output_printer: self.unformatted_output (str) +# def print_note_color (self, object, rgb=None): +# if rgb: +# str = ("\\once\\override %s #'color = #(rgb-color %s # %s %s)" % (object, rgb[0], rgb[1], rgb[2])) +# else: +# str = "\\revert %s #'color" % object +# self.newline() +# self.add_word(str) +# self.newline() + def add_word (self, str): if (len (str) + 1 + len (self._line) > self._line_len): self.newline() @@ -125,11 +135,11 @@ class Output_printer: self._skipspace = False self.unformatted_output (str) else: - words = string.split (str) + # Avoid splitting quoted strings (e.g. "1. Wie") when indenting. + words = utilities.split_string_and_preserve_doublequoted_substrings(str) for w in words: self.add_word (w) - def close (self): self.newline () self._file.close () @@ -137,19 +147,19 @@ class Output_printer: class Duration: - def __init__ (self): + def __init__(self): self.duration_log = 0 self.dots = 0 - self.factor = Rational (1) + self.factor = Rational(1) - def lisp_expression (self): + def lisp_expression(self): return '(ly:make-duration %d %d %d %d)' % (self.duration_log, self.dots, - self.factor.numerator (), - self.factor.denominator ()) - + self.factor.numerator(), + self.factor.denominator()) - def ly_expression (self, factor = None, scheme_mode = False): + def ly_expression(self, factor=None, scheme_mode=False): + global ly_dur # stores lilypond durations if not factor: factor = self.factor @@ -158,58 +168,131 @@ class Duration: longer_dict = {-1: "breve", -2: "longa"} else: longer_dict = {-1: "\\breve", -2: "\\longa"} - str = longer_dict.get (self.duration_log, "1") + dur_str = longer_dict.get(self.duration_log, "1") else: - str = '%d' % (1 << self.duration_log) - str += '.'*self.dots + dur_str = '%d' % (1 << self.duration_log) + dur_str += '.' * self.dots - if factor <> Rational (1,1): - if factor.denominator () <> 1: - str += '*%d/%d' % (factor.numerator (), factor.denominator ()) + if factor <> Rational(1, 1): + if factor.denominator() <> 1: + dur_str += '*%d/%d' % (factor.numerator(), factor.denominator()) else: - str += '*%d' % factor.numerator () + dur_str += '*%d' % factor.numerator() - return str + if dur_str.isdigit(): + ly_dur = int(dur_str) + # TODO: We need to deal with dotted notes and scaled durations + # otherwise ly_dur won't work in combination with tremolos. + return dur_str - def print_ly (self, outputter): - str = self.ly_expression (self.factor / outputter.duration_factor ()) - outputter.print_duration_string (str) + def print_ly(self, outputter): + dur_str = self.ly_expression(self.factor / outputter.duration_factor()) + outputter.print_duration_string(dur_str) def __repr__(self): return self.ly_expression() - def copy (self): - d = Duration () + def copy(self): + d = Duration() d.dots = self.dots d.duration_log = self.duration_log d.factor = self.factor return d - def get_length (self): - dot_fact = Rational( (1 << (1 + self.dots))-1, + def get_length(self): + dot_fact = Rational((1 << (1 + self.dots)) - 1, 1 << self.dots) - log = abs (self.duration_log) + log = abs(self.duration_log) dur = 1 << log if self.duration_log < 0: - base = Rational (dur) + base = Rational(dur) else: - base = Rational (1, dur) + base = Rational(1, dur) return base * dot_fact * self.factor -# implement the midi command line option '-m' and '--midi' -# if TRUE add midi-block to .ly file (see below) -def set_create_midi (option): +def set_create_midi(option): + """ + Implement the midi command line option '-m' and '--midi'. + If True, add midi-block to .ly file (see L{musicexp.Score.print_ly}). + + @param option: Indicates whether the midi-block has to be added or not. + @type option: boolean + """ global midi_option midi_option = option def get_create_midi (): + """ + Return, if exists the state of the midi-option. + + @return: The state of the midi-option. + @rtype: boolean + """ try: return midi_option except: return False +# implement the command line option '--transpose' +def set_transpose(option): + global transpose_option + transpose_option = option + +def get_transpose(optType): + try: + if(optType == "string"): + return '\\transpose c %s' % transpose_option + elif(optType == "integer"): + p = generic_tone_to_pitch(transpose_option) + return p.semitones() + except: + if(optType == "string"): + return "" + elif(optType == "integer"): + return 0 + +# implement the command line option '--tab-clef' +def set_tab_clef(option): + global tab_clef_option + tab_clef_option = option + +def get_tab_clef(): + try: + return ("tab", tab_clef_option)[tab_clef_option == "tab" or tab_clef_option == "moderntab"] + except: + return "tab" + +# definitions of the command line option '--string-numbers' +def set_string_numbers(option): + global string_numbers_option + string_numbers_option = option + +def get_string_numbers(): + try: + return ("t", string_numbers_option)[string_numbers_option == "t" or string_numbers_option == "f"] + except: + return "t" + +def generic_tone_to_pitch (tone): + accidentals_dict = { + "" : 0, + "es" : -1, + "s" : -1, + "eses" : -2, + "ses" : -2, + "is" : 1, + "isis" : 2 + } + p = Pitch () + tone_ = tone.strip().lower() + p.octave = tone_.count("'") - tone_.count(",") + tone_ = tone_.replace(",","").replace("'","") + p.step = ((ord (tone_[0]) - ord ('a') + 5) % 7) + p.alteration = accidentals_dict.get(tone_[1:], 0) + return p + # Implement the different note names for the various languages def pitch_generic (pitch, notenames, accidentals): str = notenames[pitch.step] @@ -224,7 +307,7 @@ def pitch_generic (pitch, notenames, accidentals): ly.warning (_ ("Language does not support microtones contained in the piece")) else: try: - str += {-0.5: accidentals[1], 0.5: accidentals[2]}[pitch.alteration-halftones] + str += {-0.5: accidentals[1], 0.5: accidentals[2]}[pitch.alteration - halftones] except KeyError: ly.warning (_ ("Language does not support microtones contained in the piece")) return str @@ -258,6 +341,10 @@ def pitch_italiano (pitch): def pitch_catalan (pitch): return pitch_italiano (pitch) +def pitch_francais (pitch): + str = pitch_generic (pitch, ['do', 'ré', 'mi', 'fa', 'sol', 'la', 'si'], ['b', 'sb', 'sd', 'd']) + return str + def pitch_espanol (pitch): str = pitch_generic (pitch, ['do', 're', 'mi', 'fa', 'sol', 'la', 'si'], ['b', None, None, 's']) return str @@ -275,15 +362,16 @@ def set_pitch_language (language): "norsk": pitch_norsk, "svenska": pitch_svenska, "italiano": pitch_italiano, + "français": pitch_francais, "catalan": pitch_catalan, "espanol": pitch_espanol, + "español": pitch_espanol, "vlaams": pitch_vlaams} pitch_generating_function = function_dict.get (language, pitch_general) # global variable to hold the formatting function. pitch_generating_function = pitch_general - class Pitch: def __init__ (self): self.alteration = 0 @@ -296,12 +384,12 @@ class Pitch: def transposed (self, interval): c = self.copy () - c.alteration += interval.alteration + c.alteration += interval.alteration c.step += interval.step c.octave += interval.octave c.normalize () - target_st = self.semitones() + interval.semitones() + target_st = self.semitones() + interval.semitones() c.alteration += target_st - c.semitones() return c @@ -310,7 +398,7 @@ class Pitch: c.step += 7 c.octave -= 1 c.octave += c.step / 7 - c.step = c.step % 7 + c.step = c.step % 7 def lisp_expression (self): return '(ly:make-pitch %d %d %d)' % (self.octave, @@ -322,13 +410,36 @@ class Pitch: p.alteration = self.alteration p.step = self.step p.octave = self.octave + p._force_absolute_pitch = self._force_absolute_pitch return p def steps (self): - return self.step + self.octave *7 + return self.step + self.octave * 7 def semitones (self): - return self.octave * 12 + [0,2,4,5,7,9,11][self.step] + self.alteration + return self.octave * 12 + [0, 2, 4, 5, 7, 9, 11][self.step] + self.alteration + + def normalize_alteration (c): + if(c.alteration < 0 and [True, False, False, True, False, False, False][c.step]): + c.alteration += 1 + c.step -= 1 + elif(c.alteration > 0 and [False, False, True, False, False, False, True][c.step]): + c.alteration -= 1 + c.step += 1 + c.normalize () + + def add_semitones (self, number): + semi = number + self.alteration + self.alteration = 0 + if(semi == 0): + return + sign = (1,-1)[semi < 0] + prev = self.semitones() + while abs((prev + semi) - self.semitones ()) > 1: + self.step += sign + self.normalize() + self.alteration += (prev + semi) - self.semitones () + self.normalize_alteration () def ly_step_expression (self): return pitch_generating_function (self) @@ -363,7 +474,6 @@ class Pitch: str += self.relative_pitch () else: str += self.absolute_pitch () - return str def print_ly (self, outputter): @@ -398,7 +508,7 @@ class Music: props = self.get_properties () - return "(make-music '%s %s)" % (name, props) + return "(make-music '%s %s)" % (name, props) def set_start (self, start): self.start = start @@ -408,7 +518,7 @@ class Music: return self return None - def print_comment (self, printer, text = None): + def print_comment (self, printer, text=None): if not text: text = self.comment @@ -485,11 +595,11 @@ class TimeScaledMusic (MusicWrapper): def print_ly (self, func): if self.display_bracket == None: - func ("\\once \\override TupletBracket #'stencil = ##f") + func ("\\once \\omit TupletBracket") func.newline () elif self.display_bracket == "curved": ly.warning (_ ("Tuplet brackets of curved shape are not correctly implemented")) - func ("\\once \\override TupletBracket #'stencil = #ly:slur::print") + func ("\\once \\override TupletBracket.stencil = #ly:slur::print") func.newline () base_number_function = {None: "#f", @@ -513,12 +623,12 @@ class TimeScaledMusic (MusicWrapper): if self.display_type == "actual" and self.normal_type: # Obtain the note duration in scheme-mode, i.e. \longa as \\longa base_duration = self.normal_type.ly_expression (None, True) - func ("\\once \\override TupletNumber #'text = #(tuplet-number::append-note-wrapper %s \"%s\")" % + func ("\\once \\override TupletNumber.text = #(tuplet-number::append-note-wrapper %s \"%s\")" % (base_number_function, base_duration)) func.newline () elif self.display_type == "both": # TODO: Implement this using actual_type and normal_type! if self.display_number == None: - func ("\\once \\override TupletNumber #'stencil = ##f") + func ("\\once \\omit TupletNumber") func.newline () elif self.display_number == "both": den_duration = self.normal_type.ly_expression (None, True) @@ -528,20 +638,20 @@ class TimeScaledMusic (MusicWrapper): else: num_duration = den_duration if (self.display_denominator or self.display_numerator): - func ("\\once \\override TupletNumber #'text = #(tuplet-number::non-default-fraction-with-notes %s \"%s\" %s \"%s\")" % + func ("\\once \\override TupletNumber.text = #(tuplet-number::non-default-fraction-with-notes %s \"%s\" %s \"%s\")" % (self.display_denominator, den_duration, self.display_numerator, num_duration)) func.newline () else: - func ("\\once \\override TupletNumber #'text = #(tuplet-number::fraction-with-notes \"%s\" \"%s\")" % + func ("\\once \\override TupletNumber.text = #(tuplet-number::fraction-with-notes \"%s\" \"%s\")" % (den_duration, num_duration)) func.newline () else: if self.display_number == None: - func ("\\once \\override TupletNumber #'stencil = ##f") + func ("\\once \\omit TupletNumber") func.newline () elif self.display_number == "both": - func ("\\once \\override TupletNumber #'text = #%s" % base_number_function) + func ("\\once \\override TupletNumber.text = #%s" % base_number_function) func.newline () func ('\\times %d/%d ' % @@ -589,12 +699,12 @@ class NestedMusic(Music): def get_subset_properties (self, predicate): return ("'elements (list %s)" % string.join (map (lambda x: x.lisp_expression(), - filter ( predicate, self.elements)))) + filter (predicate, self.elements)))) def get_neighbor (self, music, dir): assert music.parent == self idx = self.elements.index (music) idx += dir - idx = min (idx, len (self.elements) -1) + idx = min (idx, len (self.elements) - 1) idx = max (idx, 0) return self.elements[idx] @@ -624,7 +734,7 @@ class NestedMusic(Music): class SequentialMusic (NestedMusic): def get_last_event_chord (self): value = None - at = len( self.elements ) - 1 + at = len(self.elements) - 1 while (at >= 0 and not isinstance (self.elements[at], ChordEvent) and not isinstance (self.elements[at], BarLine)): @@ -634,7 +744,7 @@ class SequentialMusic (NestedMusic): value = self.elements[at] return value - def print_ly (self, printer, newline = True): + def print_ly (self, printer, newline=True): printer ('{') if self.comment: self.print_comment (printer) @@ -654,7 +764,7 @@ class SequentialMusic (NestedMusic): props = self.get_subset_properties (pred) - return "(make-music '%s %s)" % (name, props) + return "(make-music '%s %s)" % (name, props) def set_start (self, start): for e in self.elements: @@ -697,39 +807,60 @@ class Lyrics: self.lyrics_syllables = [] def print_ly (self, printer): - printer.dump ("\lyricmode {") - for l in self.lyrics_syllables: - printer.dump ( "%s " % l ) - printer.dump ("}") + printer.dump (self.ly_expression ()) + printer.newline() + printer.dump ('}') + printer.newline() def ly_expression (self): - lstr = "\lyricmode {\n " + lstr = "\lyricmode {\set ignoreMelismata = ##t" for l in self.lyrics_syllables: - lstr += l + " " - lstr += "\n}" + lstr += l + #lstr += "\n}" return lstr - class Header: + def __init__ (self): self.header_fields = {} + def set_field (self, field, value): self.header_fields[field] = value - def print_ly (self, printer): - printer.dump ("\header {") - printer.newline () - for (k,v) in self.header_fields.items (): + def format_header_strings(self, key, value, printer): + printer.dump(key + ' = ') + + # If a header item contains a line break, it is segmented. The + # substrings are formatted with the help of \markup, using + # \column and \line. An exception, however, are texidoc items, + # which should not contain LilyPond formatting commands. + if (key != 'texidoc') and ('\n' in value): + value = value.replace('"', '') + printer.dump(r'\markup \column {') + substrings = value.split('\n') + for s in substrings: + printer.newline() + printer.dump(r'\line { "' + s + '"}') + printer.dump('}') + printer.newline() + else: + printer.dump(value) + printer.newline() + + def print_ly(self, printer): + printer.dump("\header {") + printer.newline() + for (k, v) in self.header_fields.items(): if v: - printer.dump ('%s = %s' % (k,v)) - printer.newline () - printer.dump ("}") - printer.newline () - printer.newline () + self.format_header_strings(k, v, printer) + #printer.newline() + printer.dump("}") + printer.newline() + printer.newline() class Paper: - def __init__ (self): + def __init__(self): self.global_staff_size = -1 # page size self.page_width = -1 @@ -743,17 +874,31 @@ class Paper: self.system_right_margin = -1 self.system_distance = -1 self.top_system_distance = -1 + self.indent = 0 + self.short_indent = 0 + self.instrument_names = [] def print_length_field (self, printer, field, value): if value >= 0: printer.dump ("%s = %s\\cm" % (field, value)) printer.newline () + + def get_longest_instrument_name(self): + result = '' + for name in self.instrument_names: + lines = name.split('\n') + for line in lines: + if len(line) > len(result): + result = line + return result + def print_ly (self, printer): if self.global_staff_size > 0: printer.dump ('#(set-global-staff-size %s)' % self.global_staff_size) printer.newline () printer.dump ('\\paper {') printer.newline () + printer.newline () self.print_length_field (printer, "paper-width", self.page_width) self.print_length_field (printer, "paper-height", self.page_height) self.print_length_field (printer, "top-margin", self.top_margin) @@ -765,6 +910,14 @@ class Paper: # system_right_margin in LilyPond? self.print_length_field (printer, "between-system-space", self.system_distance) self.print_length_field (printer, "page-top-space", self.top_system_distance) + # TODO: Compute the indentation with the instrument name lengths + + # TODO: font width ? + char_per_cm = (len(self.get_longest_instrument_name()) * 13) / self.page_width + if (self.indent != 0): + self.print_length_field (printer, "indent", self.indent/char_per_cm) + if (self.short_indent != 0): + self.print_length_field (printer, "short-indent", self.short_indent/char_per_cm) printer.dump ('}') printer.newline () @@ -863,6 +1016,7 @@ class ChordEvent (NestedMusic): # Print all overrides and other settings needed by the # articulations/ornaments before the note + for e in other_events: e.print_before_note (printer) @@ -874,10 +1028,17 @@ class ChordEvent (NestedMusic): global previous_pitch pitches = [] basepitch = None + stem = None for x in note_events: + if(x.associated_events): + for aev in x.associated_events: + if (isinstance(aev, StemEvent) and aev.value): + stem = aev pitches.append (x.chord_element_ly ()) if not basepitch: basepitch = previous_pitch + if stem: + printer (stem.ly_expression ()) printer ('<%s>' % string.join (pitches)) previous_pitch = basepitch duration = self.get_duration () @@ -953,7 +1114,7 @@ class SpanEvent (Event): self.span_direction = 0 # start/stop self.line_type = 'solid' self.span_type = 0 # e.g. cres/decrescendo, ottava up/down - self.size = 0 # size of e.g. ocrave shift + self.size = 0 # size of e.g. octave shift def wait_for_note (self): return True def get_properties(self): @@ -987,14 +1148,39 @@ class PedalEvent (SpanEvent): 1:'\\sustainOff'}.get (self.span_direction, '') class TextSpannerEvent (SpanEvent): + def print_before_note (self, printer): + if hasattr(self, 'style') and self.style=="wave": + printer.dump("\once \override TextSpanner #'style = #'trill") + try: + x = {-1:'\\textSpannerDown', 0:'\\textSpannerNeutral', 1: '\\textSpannerUp'}.get(self.force_direction, '') + printer.dump (x) + except: + pass + + def print_after_note (self, printer): + pass + def ly_expression (self): - return {-1: '\\startTextSpan', - 1:'\\stopTextSpan'}.get (self.span_direction, '') + global whatOrnament + if hasattr(self, 'style') and self.style=="ignore": + return "" + # if self.style=="wave": + if whatOrnament == "wave": + return {-1: '\\startTextSpan', + 1:'\\stopTextSpan'}.get (self.span_direction, '') + else: + if hasattr(self, 'style') and self.style=="stop" and whatOrnament != "trill": return "" + return {-1: '\\startTrillSpan', + 1:'\\stopTrillSpan'}.get (self.span_direction, '') class BracketSpannerEvent (SpanEvent): # Ligature brackets use prefix-notation!!! def print_before_note (self, printer): if self.span_direction == -1: + if self.force_direction == 1: + printer.dump("\once \override LigatureBracket #' direction = #UP") + elif self.force_direction == -1: + printer.dump("\once \override LigatureBracket #' direction = #DOWN") printer.dump ('\[') # the bracket after the last note def print_after_note (self, printer): @@ -1009,7 +1195,7 @@ class OctaveShiftEvent (SpanEvent): def wait_for_note (self): return False def set_span_type (self, type): - self.span_type = {'up': 1, 'down': -1}.get (type, 0) + self.span_type = {'up': 1, 'down':-1}.get (type, 0) def ly_octave_shift_indicator (self): # convert 8/15 to lilypond indicators (+-1/+-2) try: @@ -1018,7 +1204,7 @@ class OctaveShiftEvent (SpanEvent): ly.warning (_ ("Invalid octave shift size found: %s. Using no shift.") % self.size) value = 0 # negative values go up! - value *= -1*self.span_type + value *= -1 * self.span_type return value def ly_expression (self): dir = self.ly_octave_shift_indicator () @@ -1026,7 +1212,7 @@ class OctaveShiftEvent (SpanEvent): if dir: value = '\ottava #%s' % dir return { - -1: value, + - 1: value, 1: '\ottava #0'}.get (self.span_direction, '') class TrillSpanEvent (SpanEvent): @@ -1038,13 +1224,13 @@ class TrillSpanEvent (SpanEvent): class GlissandoEvent (SpanEvent): def print_before_note (self, printer): if self.span_direction == -1: - style= { + style = { "dashed" : "dashed-line", "dotted" : "dotted-line", "wavy" : "zigzag" }. get (self.line_type, None) if style: - printer.dump ("\\once \\override Glissando #'style = #'%s" % style) + printer.dump ("\\once \\override Glissando.style = #'%s" % style) def ly_expression (self): return {-1: '\\glissando', 1:''}.get (self.span_direction, '') @@ -1077,20 +1263,24 @@ class TieEvent(Event): class HairpinEvent (SpanEvent): def set_span_type (self, type): - self.span_type = {'crescendo' : 1, 'decrescendo' : -1, 'diminuendo' : -1 }.get (type, 0) + self.span_type = {'crescendo' : 1, 'decrescendo' :-1, 'diminuendo' :-1 }.get (type, 0) def hairpin_to_ly (self): if self.span_direction == 1: return '\!' else: return {1: '\<', -1: '\>'}.get (self.span_type, '') + def direction_mod (self): + return { 1: '^', -1: '_', 0: '-' }.get (self.force_direction, '-') + def ly_expression (self): return self.hairpin_to_ly () def print_ly (self, printer): val = self.hairpin_to_ly () if val: - printer.dump (val) + # printer.dump (val) + printer.dump ('%s%s' % (self.direction_mod (), val)) @@ -1098,6 +1288,7 @@ class DynamicsEvent (Event): def __init__ (self): Event.__init__ (self) self.type = None + self.force_direction = 0 def wait_for_note (self): return True def ly_expression (self): @@ -1106,9 +1297,12 @@ class DynamicsEvent (Event): else: return + def direction_mod (self): + return { 1: '^', -1: '_', 0: '-' }.get (self.force_direction, '-') + def print_ly (self, printer): if self.type: - printer.dump ("\\%s" % self.type) + printer.dump ('%s\\%s' % (self.direction_mod (), self.type)) class MarkEvent (Event): def __init__ (self, text="\\default"): @@ -1139,13 +1333,39 @@ class TextEvent (Event): self.force_direction = None self.markup = '' def wait_for_note (self): + """ This is problematic: the lilypond-markup ^"text" + requires wait_for_note to be true. Otherwise the + compilation will fail. So we are forced to set return to True. + But in some cases this might lead to a wrong placement of the text. + In case of words like Allegro the text should be put in a '\tempo'-command. + In this case we don't want to wait for the next note. + In some other cases the text is supposed to be used in a '\mark\markup' construct. + We would not want to wait for the next note either. + There might be other problematic situations. + In the long run we should differentiate between various contexts in MusicXML, e.g. + the following markup should be interpreted as '\tempo "Allegretto"': + + + Allegretto + + + + In the mean time arising problems have to be corrected manually after the conversion. + """ return True def direction_mod (self): + """ 1: placement="above"; -1: placement="below"; 0: no placement attribute. + see musicxml_direction_to_indicator in musicxml2ly_conversion.py """ return { 1: '^', -1: '_', 0: '-' }.get (self.force_direction, '-') def ly_expression (self): - base_string = '%s\"%s\"' + # self.text will be enclosed by quotes, and the direction + # modifier must be separated from the opening quote by a space. + # This is so that subsequent line breaking for the output file + # using utilities.split_string_and_preserve_doublequoted_strings() + # properly detects the opening quote. + base_string = '%s \"%s\"' if self.markup: base_string = '%s\markup{ ' + self.markup + ' {%s} }' return base_string % (self.direction_mod (), self.text) @@ -1175,9 +1395,21 @@ class ShortArticulationEvent (ArticulationEvent): return '' class NoDirectionArticulationEvent (ArticulationEvent): + + def is_breathing_sign(self): + return self.type == 'breathe' + + def print_after_note(self, printer): + # The breathing sign should, according to current LilyPond + # praxis, be treated as an independent musical + # event. Consequently, it should be printed _after_ the note + # to which it is attached. + if self.is_breathing_sign(): + printer.dump(r'\breathe') + def ly_expression (self): - if self.type: - return '\\%s' % self.type + if self.type and not self.is_breathing_sign(): + return '\\%s' % self.type else: return '' @@ -1206,11 +1438,11 @@ class FretEvent (MarkupEvent): if self.frets <> 4: val += "h:%s;" % self.frets if self.barre and len (self.barre) >= 3: - val += "c:%s-%s-%s;" % (self.barre[0], self.barre[1], self.barre[2]) + val += "c:%s-%s-%s;" % (self.barre[0], self.barre[1], self.barre[2]+get_transpose("integer")) have_fingering = False for i in self.elements: if len (i) > 1: - val += "%s-%s" % (i[0], i[1]) + val += "%s-%s" % (i[0], i[1]+(get_transpose("integer"),'')[isinstance(i[1],str)]) if len (i) > 2: have_fingering = True val += "-%s" % i[2] @@ -1222,9 +1454,35 @@ class FretEvent (MarkupEvent): else: return '' +class FretBoardNote (Music): + def __init__ (self): + Music.__init__ (self) + self.pitch = None + self.string = None + self.fingering = None + def ly_expression (self): + str = self.pitch.ly_expression() + if self.fingering: + str += "-%s" % self.fingering + if self.string: + str += "\%s" % self.string + return str + +class FretBoardEvent (NestedMusic): + def __init__ (self): + NestedMusic.__init__ (self) + self.duration = None + def print_ly (self, printer): + fretboard_notes = [n for n in self.elements if isinstance (n, FretBoardNote)] + if fretboard_notes: + notes = [] + for n in fretboard_notes: + notes.append (n.ly_expression ()) + contents = string.join (notes) + printer ('<%s>%s' % (contents,self.duration)) class FunctionWrapperEvent (Event): - def __init__ (self, function_name = None): + def __init__ (self, function_name=None): Event.__init__ (self) self.function_name = function_name def pre_note_ly (self, is_chord_element): @@ -1244,24 +1502,58 @@ class ParenthesizeEvent (FunctionWrapperEvent): def __init__ (self): FunctionWrapperEvent.__init__ (self, "parenthesize") -class NotestyleEvent (Event): +class StemEvent (Event): + """" + A class to take care of stem values (up, down, double, none) + """ + def __init__ (self): + Event.__init__ (self) + self.value = None + def pre_chord_ly (self): + if self.value: + return "\\%s" % self.value + else: + return '' + def pre_note_ly (self, is_chord_element): + return '' + def ly_expression (self): + return self.pre_chord_ly () + +class NotestyleEvent (Event): #class changed by DaLa: additional attribute color def __init__ (self): Event.__init__ (self) self.style = None self.filled = None + self.color = None def pre_chord_ly (self): + return_string = '' if self.style: - return "\\once \\override NoteHead #'style = #%s" % self.style - else: - return '' + return_string += " \\once \\override NoteHead #'style = #%s" % self.style + if self.color: + return_string += " \\once \\override NoteHead #'color = #(rgb-color %s %s %s)" % (self.color[0], self.color[1], self.color[2]) + return return_string def pre_note_ly (self, is_chord_element): if self.style and is_chord_element: - return "\\tweak #'style #%s" % self.style + return "\\tweak style #%s" % self.style else: return '' def ly_expression (self): return self.pre_chord_ly () +class StemstyleEvent (Event): #class added by DaLa + def __init__ (self): + Event.__init__ (self) + self.color = None + def pre_chord_ly (self): + if self.color: + return "\\once \\override Stem #'color = #(rgb-color %s %s %s)" % (self.color[0], self.color[1], self.color[2]) + else: + return '' + def pre_note_ly (self, is_chord_element): + return '' + def ly_expression (self): + return self.pre_chord_ly () + class ChordPitch: def __init__ (self): @@ -1297,14 +1589,14 @@ class ChordNameEvent (Event): def add_modification (self, mod): self.modifications.append (mod) def ly_expression (self): + if not self.root: return '' value = self.root.ly_expression () if self.duration: value += self.duration.ly_expression () if self.kind: - value += ":" - value += self.kind + value = self.kind.format(value) # First print all additions/changes, and only afterwards all subtractions for m in self.modifications: if m.type == 1: @@ -1317,16 +1609,37 @@ class ChordNameEvent (Event): return value -class TremoloEvent (ArticulationEvent): - def __init__ (self): - Event.__init__ (self) - self.bars = 0 - - def ly_expression (self): - str='' - if self.bars and self.bars > 0: - str += ':%s' % (2 ** (2 + string.atoi (self.bars))) - return str +class TremoloEvent(ArticulationEvent): + def __init__(self): + Event.__init__(self) + self.strokes = 0 + + def ly_expression(self): + ly_str = '' + if self.strokes and int(self.strokes) > 0: + # ly_dur is a global variable defined in class Duration + # ly_dur stores the value of the reciprocal values of notes + # ly_dur is used here to check the current note duration + # if the duration is smaller than 8, e.g. + # quarter, half and whole notes, + # `:(2 ** (2 + number of tremolo strokes))' + # should be appended to the pitch and duration, e.g. + # 1 stroke: `c4:8' or `c2:8' or `c1:8' + # 2 strokes: `c4:16' or `c2:16' or `c1:16' + # ... + # else (if ly_dur is equal to or greater than 8): + # we need to make sure that the tremolo value that is to + # be appended to the pitch and duration is twice the + # duration (if there is only one tremolo stroke. + # Each additional stroke doubles the tremolo value, e.g.: + # 1 stroke: `c8:16', `c16:32', `c32:64', ... + # 2 strokes: `c8:32', `c16:64', `c32:128', ... + # ... + if ly_dur < 8: + ly_str += ':%s' % (2 ** (2 + int(self.strokes))) + else: + ly_str += ':%s' % (2 ** int((math.log(ly_dur, 2)) + int(self.strokes))) + return ly_str class BendEvent (ArticulationEvent): def __init__ (self): @@ -1382,6 +1695,10 @@ class RestEvent (RhythmicEvent): def print_ly (self, printer): for ev in self.associated_events: ev.print_ly (printer) +# if hasattr(self, 'color'): +# printer.print_note_color("NoteHead", self.color) +# printer.print_note_color("Stem", self.color) +# printer.print_note_color("Beam", self.color) if self.pitch: self.pitch.print_ly (printer) self.duration.print_ly (printer) @@ -1397,7 +1714,7 @@ class SkipEvent (RhythmicEvent): class NoteEvent(RhythmicEvent): def __init__ (self): RhythmicEvent.__init__ (self) - self.pitch = None + #self.pitch = None self.drum_type = None self.cautionary = False self.forced_accidental = False @@ -1445,6 +1762,11 @@ class NoteEvent(RhythmicEvent): def print_ly (self, printer): for ev in self.associated_events: ev.print_ly (printer) + if hasattr(self, 'color'): + printer.print_note_color("NoteHead", self.color) + printer.print_note_color("Stem", self.color) + printer.print_note_color("Beam", self.color) + if self.pitch: self.pitch.print_ly (printer) printer (self.pitch_mods ()) @@ -1453,6 +1775,11 @@ class NoteEvent(RhythmicEvent): self.duration.print_ly (printer) +# if hasattr(self, 'color'): +# printer.print_note_color("NoteHead") +# printer.print_note_color("Stem") +# printer.print_note_color("Beam") + class KeySignatureChange (Music): def __init__ (self): Music.__init__ (self) @@ -1462,9 +1789,9 @@ class KeySignatureChange (Music): def format_non_standard_alteration (self, a): alter_dict = { -2: ",DOUBLE-FLAT", - -1.5: ",THREE-Q-FLAT", - -1: ",FLAT", - -0.5: ",SEMI-FLAT", + - 1.5: ",THREE-Q-FLAT", + - 1: ",FLAT", + - 0.5: ",SEMI-FLAT", 0: ",NATURAL", 0.5: ",SEMI-SHARP", 1: ",SHARP", @@ -1489,15 +1816,46 @@ class KeySignatureChange (Music): elif self.non_standard_alterations: alterations = [self.format_non_standard_alteration (a) for a in self.non_standard_alterations] - return "\\set Staff.keySignature = #`(%s)" % string.join (alterations, " ") + return "\\set Staff.keyAlterations = #`(%s)" % string.join (alterations, " ") else: return '' +class ShiftDurations (MusicWrapper): + def __init__ (self): + MusicWrapper.__init__ (self) + self.params = [0,0] + + def set_shift_durations_parameters(self, timeSigChange): + self.params = timeSigChange.get_shift_durations_parameters() + + def print_ly (self, func): + func (' \\shiftDurations #%d #%d ' % tuple(self.params)) + MusicWrapper.print_ly (self, func) + class TimeSignatureChange (Music): def __init__ (self): Music.__init__ (self) - self.fractions = [4,4] + self.fractions = [4, 4] self.style = None + # Used for the --time-signature option of musicxml2ly + self.originalFractions = [4, 4] + + def get_fractions_ratio (self): + """ + Calculate the ratio between the original time fraction and the new one. + Used for the "--time-signature" option. + + @return: The ratio between the two time fractions. + @rtype: float + """ + return (float(self.originalFractions[0])/self.originalFractions[1])*(float(self.fractions[1])/self.fractions[0]) + + def get_shift_durations_parameters (self): + dur = math.ceil(math.log(self.get_fractions_ratio(),2)) + dots = (1/self.get_fractions_ratio())/(math.pow(2,-dur)) + dots = int(math.log(2-dots,0.5)) + return [dur, dots] + def format_fraction (self, frac): if isinstance (frac, list): l = [self.format_fraction (f) for f in frac] @@ -1510,12 +1868,12 @@ class TimeSignatureChange (Music): # Print out the style if we have ome, but the '() should only be # forced for 2/2 or 4/4, since in all other cases we'll get numeric # signatures anyway despite the default 'C signature style! - is_common_signature = self.fractions in ([2,2], [4,4], [4,2]) + is_common_signature = self.fractions in ([2, 2], [4, 4], [4, 2]) if self.style: if self.style == "common": st = "\\defaultTimeSignature" elif (self.style != "'()"): - st = "\\once \\override Staff.TimeSignature #'style = #%s " % self.style + st = "\\once \\override Staff.TimeSignature.style = #%s " % self.style elif (self.style != "'()") or is_common_signature: st = "\\numericTimeSignature" @@ -1536,6 +1894,7 @@ class ClefChange (Music): def octave_modifier (self): return {1: "^8", 2: "^15", -1: "_8", -2: "_15"}.get (self.octave, '') + def clef_name (self): return {('G', 2): "treble", ('G', 1): "french", @@ -1548,9 +1907,10 @@ class ClefChange (Music): ('F', 4): "bass", ('F', 5): "subbass", ("percussion", 2): "percussion", - # Workaround: MuseScore uses PERC instead of percussion + # Workaround: MuseScore uses PERC instead of percussion ("PERC", 2): "percussion", - ("TAB", 5): "tab"}.get ((self.type, self.position), None) + ("TAB", 5): get_tab_clef ()}.get ((self.type, self.position), None) + def ly_expression (self): return '\\clef "%s%s"' % (self.clef_name (), self.octave_modifier ()) @@ -1612,9 +1972,9 @@ class StaffLinesEvent (Music): self.lines = lines def ly_expression (self): if (self.lines > 0): - return "\\stopStaff \\override Staff.StaffSymbol #'line-count = #%s \\startStaff" % self.lines + return "\\stopStaff \\override Staff.StaffSymbol.line-count = #%s \\startStaff" % self.lines else: - return "\\stopStaff \\revert Staff.StaffSymbol #'line-count \\startStaff" + return "\\stopStaff \\revert Staff.StaffSymbol.line-count \\startStaff" class TempoMark (Music): def __init__ (self): @@ -1747,10 +2107,11 @@ class Break (Music): printer.dump ("\\%s" % self.type) class StaffGroup: - def __init__ (self, command = "StaffGroup"): + def __init__ (self, command="StaffGroup"): self.stafftype = command self.id = None self.instrument_name = None + self.sound = None self.short_instrument_name = None self.symbol = None self.spanbar = None @@ -1780,6 +2141,10 @@ class StaffGroup: for c in self.children: if c: c.print_ly (printer) + #Intention: I want to put the content of new StaffGroup in angled brackets (<< >>) + #printer.dump ("test")# test is printed twice at the end of a staffgroup with two staves. + #printer ("test") # test is printed twice at the end of a staffgroup with two staves. + def needs_with (self): needs_with = False needs_with |= self.spanbar == "no" @@ -1787,11 +2152,12 @@ class StaffGroup: needs_with |= self.short_instrument_name != None needs_with |= (self.symbol != None) and (self.symbol != "bracket") return needs_with + def print_ly_context_mods (self, printer): if self.instrument_name or self.short_instrument_name: printer.dump ("\\consists \"Instrument_name_engraver\"") if self.spanbar == "no": - printer.dump ("\\override SpanBar #'transparent = ##t") + printer.dump ("\\hide SpanBar") brack = {"brace": "SystemStartBrace", "none": "SystemStartBar", "line": "SystemStartSquare"}.get (self.symbol, None) @@ -1806,24 +2172,45 @@ class StaffGroup: for m in self.context_modifications: printer.dump (m) printer.dump ("}") - - def print_ly_chords (self,printer): + printer.newline () + #print a single << after StaffGroup only when the with-block is not needed. + #This doesn't work. << is printed before and after StaffGroup! + #else: + # printer.dump (" <<") + #prints loads off << before and after StaffGroup and before \set Staff.instrumentName + #elif not needs_with: + # printer.dump (" <<") + + def print_chords(self, printer): try: for [staff_id, voices] in self.part_information: - for [v, lyrics, figuredbass, chordnames] in voices: + for [v, lyrics, figuredbass, chordnames, fretboards] in voices: if chordnames: - printer ('\context ChordNames = "%s" \\%s' % (chordnames, chordnames)) - printer.newline () + printer ('\context ChordNames = "%s" {%s \\%s}' % (chordnames, get_transpose ("string"), chordnames)) + printer.newline() + except TypeError: + return + + def print_fretboards(self, printer): + try: + for [staff_id, voices] in self.part_information: + for [v, lyrics, figuredbass, chordnames, fretboards] in voices: + if fretboards: + printer ('\context FretBoards = "%s" {%s \\%s}' % (fretboards, get_transpose ("string"), fretboards)) + printer.newline() except TypeError: return def print_ly (self, printer): - self.print_ly_chords (printer) + self.print_chords(printer) + self.print_fretboards(printer) if self.stafftype: printer.dump ("\\new %s" % self.stafftype) self.print_ly_overrides (printer) - printer.dump ("<<") printer.newline () + if self.stafftype: + printer.dump ("<<") + printer.newline () if self.stafftype and self.instrument_name: printer.dump ("\\set %s.instrumentName = %s" % (self.stafftype, escape_instrument_string (self.instrument_name))) @@ -1832,23 +2219,32 @@ class StaffGroup: printer.dump ("\\set %s.shortInstrumentName = %s" % (self.stafftype, escape_instrument_string (self.short_instrument_name))) printer.newline () + if self.sound: + printer.dump( + r'\set {stafftype}.midiInstrument = #"{sound}"'.format( + stafftype=self.stafftype, sound=self.sound)) + printer.newline () self.print_ly_contents (printer) printer.newline () - printer.dump (">>") - printer.newline () + if self.stafftype: + printer.dump (">>") + printer.newline () class Staff (StaffGroup): - def __init__ (self, command = "Staff"): + def __init__ (self, command="Staff"): StaffGroup.__init__ (self, command) self.is_group = False self.part = None self.voice_command = "Voice" self.substafftype = None + self.sound = None def needs_with (self): return False + def print_ly_context_mods (self, printer): + #printer.dump ("test") #does nothing. pass def print_ly_contents (self, printer): @@ -1857,39 +2253,52 @@ class Staff (StaffGroup): sub_staff_type = self.substafftype if not sub_staff_type: sub_staff_type = self.stafftype + #printer.dump ("test") #prints test in each staff after the definitions of the instrument name and before the definition of the contexts. + printer.newline() for [staff_id, voices] in self.part_information: + # now comes the real staff definition: if staff_id: printer ('\\context %s = "%s" << ' % (sub_staff_type, staff_id)) else: printer ('\\context %s << ' % sub_staff_type) printer.newline () + printer.dump("\mergeDifferentlyDottedOn\mergeDifferentlyHeadedOn") + printer.newline() n = 0 nr_voices = len (voices) - for [v, lyrics, figuredbass, chordnames] in voices: + for [v, lyrics, figuredbass, chordnames, fretboards] in voices: n += 1 voice_count_text = '' if nr_voices > 1: - voice_count_text = {1: ' \\voiceOne', 2: ' \\voiceTwo', - 3: ' \\voiceThree'}.get (n, ' \\voiceFour') - printer ('\\context %s = "%s" {%s \\%s }' % (self.voice_command, v, voice_count_text, v)) + """ +The next line contains a bug: The voices might not appear in numerical order! Some voices might be missing e.g. if the xml file contains only voice one, three and four, this would result in: \voiceOne, \voiceTwo and \voiceThree. This causes wrong stem directions and collisions. + """ + voice_count_text = {1: ' \\voiceOne', 2: ' \\voiceTwo', 3: ' \\voiceThree'}.get (n, ' \\voiceFour') + printer ('\\context %s = "%s" {%s %s \\%s }' % (self.voice_command, v, get_transpose ("string"), voice_count_text, v)) printer.newline () - + lyrics_id = 1 for l in lyrics: - printer ('\\new Lyrics \\lyricsto "%s" \\%s' % (v,l)) + printer ('\\new Lyrics \\lyricsto "%s" { \\set stanza = "%s." \\%s }' % (v, lyrics_id, l)) + lyrics_id += 1 printer.newline() if figuredbass: printer ('\context FiguredBass = "%s" \\%s' % (figuredbass, figuredbass)) printer ('>>') + #printer.dump ("test") #prints test after each definition of a context. + #printer.newline () + #printer.dump ("test") #prints test after each definition of a context. def print_ly (self, printer): if self.part_information and len (self.part_information) > 1: self.stafftype = "PianoStaff" self.substafftype = "Staff" + #printer.dump ('test') StaffGroup.print_ly (self, printer) + class TabStaff (Staff): - def __init__ (self, command = "TabStaff"): + def __init__ (self, command="TabStaff"): Staff.__init__ (self, command) self.string_tunings = [] self.tablature_format = None @@ -1908,7 +2317,7 @@ class TabStaff (Staff): class DrumStaff (Staff): - def __init__ (self, command = "DrumStaff"): + def __init__ (self, command="DrumStaff"): Staff.__init__ (self, command) self.drum_style_table = None self.voice_command = "DrumVoice" @@ -1919,11 +2328,18 @@ class DrumStaff (Staff): printer.dump ("}") class RhythmicStaff (Staff): - def __init__ (self, command = "RhythmicStaff"): + def __init__ (self, command="RhythmicStaff"): Staff.__init__ (self, command) +#Test +#def print_staffgroup_closing_brackets (self, printer): #test see class Score / class Staff +# printer.dump ("test") + class Score: def __init__ (self): + """ + Constructs a new Score object. + """ self.contents = None self.create_midi = False @@ -1934,28 +2350,67 @@ class Score: if self.contents: self.contents.set_part_information (part_id, staves_info) + def set_tempo (self, tempo): + """ + Set the tempo attribute of the Score. + This attribute can be used in L{print_ly} for the midi output (see L{musicxml.Sound}). + + @param tempo: The value of the tempo, in beats per minute. + @type tempo: String + """ + self.tempo = tempo + #Test +# def print_staffgroup_closing_brackets (self, printer): #test see class Score / class Staff +# printer.dump ("test") + def print_ly (self, printer): - self.create_midi = get_create_midi () - printer.dump ("\\score {"); + """ + Print the content of the score to the printer, in lilypond format. + + @param printer: A printer given to display correctly the output. + @type printer: L{Output_printer} + """ + self.create_midi = get_create_midi() + printer.dump("\\score {") + printer.newline () + #prints opening <<: + printer.dump ('<<') printer.newline () if self.contents: - self.contents.print_ly (printer); - printer.dump ("\\layout {}"); + self.contents.print_ly(printer) + #printer.dump ("test") prints test once before the >> of the score block, independent of the existence of a staffgroup. + #if StaffGroup == False: # True or False: nothing happens. + # printer.dump ('>>') + printer.dump ('>>') printer.newline () - if not self.create_midi: - printer.dump ("% To create MIDI output, uncomment the following line:"); - printer.newline (); - printer.dump ("% "); - printer.dump ("\\midi {}"); + #StaffGroup.print_staffgroup_closing_brackets(self, printer) #TypeError: unbound method print_staffgroup_closing_brackets() must be called with StaffGroup instance as first argument (got Score instance instead) + #print_staffgroup_closing_brackets(self, printer) #NameError: global name 'print_staffgroup_closing_brackets' is not defined. prints test once before the >> of the score block, independent of the existence of a staffgroup. + printer.dump ("\\layout {}") printer.newline () - printer.dump ("}"); + # If the --midi option was not passed to musicxml2ly, that comments the "midi" line + if self.create_midi: + printer.dump ("}") + printer.newline() + printer.dump("\\score {") + printer.newline () + printer.dump("\\unfoldRepeats \\articulate {") + printer.newline () + self.contents.print_ly(printer) + printer.dump("}") + printer.newline () + else: + printer.dump ("% To create MIDI output, uncomment the following line:") + printer.newline () + printer.dump ("% ") + printer.dump ("\\midi {\\tempo 4 = "+self.tempo+" }") + printer.newline () + printer.dump ("}") printer.newline () - def test_pitch (): bflat = Pitch() bflat.alteration = -1 - bflat.step = 6 + bflat.step = 6 bflat.octave = -1 fifth = Pitch() fifth.step = 4 @@ -1965,7 +2420,7 @@ def test_pitch (): print bflat.semitones() - print bflat.transposed (fifth), bflat.transposed (fifth).transposed (fifth) + print bflat.transposed (fifth), bflat.transposed (fifth).transposed (fifth) print bflat.transposed (fifth).transposed (fifth).transposed (fifth) print bflat.semitones(), 'down' @@ -2037,8 +2492,8 @@ def test_expr (): tonic.step = 2 tonic.alteration = -2 n = KeySignatureChange() - n.tonic=tonic.copy() - n.scale = [0, 0, -2, 0, 0,-2,-2] + n.tonic = tonic.copy() + n.scale = [0, 0, -2, 0, 0, -2, -2] evc.insert_around (None, n, 0) m.insert_around (None, evc, 0) @@ -2054,11 +2509,10 @@ if __name__ == '__main__': expr = test_expr() expr.set_start (Rational (0)) print expr.ly_expression() - start = Rational (0,4) - stop = Rational (4,2) + start = Rational (0, 4) + stop = Rational (4, 2) def sub(x, start=start, stop=stop): - ok = x.start >= start and x.start +x.get_length() <= stop + ok = x.start >= start and x.start + x.get_length() <= stop return ok print expr.lisp_sub_expression(sub) - diff --git a/python/musicxml.py b/python/musicxml.py index 6eb3b45aba..ae5ca80a59 100644 --- a/python/musicxml.py +++ b/python/musicxml.py @@ -6,45 +6,18 @@ import re import sys import copy import lilylib as ly +import warnings _ = ly._ - -def escape_ly_output_string (input_string): - return_string = input_string - needs_quotes = not re.match (u"^[a-zA-ZäöüÜÄÖßñ]*$", return_string); - if needs_quotes: - return_string = "\"" + string.replace (return_string, "\"", "\\\"") + "\"" - return return_string - - -def musicxml_duration_to_log (dur): - return {'256th': 8, - '128th': 7, - '64th': 6, - '32nd': 5, - '16th': 4, - 'eighth': 3, - 'quarter': 2, - 'half': 1, - 'whole': 0, - 'breve': -1, - 'longa': -2, - 'long': -2}.get (dur, 0) - - - -def interpret_alter_element (alter_elm): - alter = 0 - if alter_elm: - val = eval(alter_elm.get_text ()) - if type (val) in (int, float): - alter = val - return alter +import musicexp +import musicxml2ly_conversion +import utilities class Xml_node: - def __init__ (self): + + def __init__(self): self._children = [] self._data = None self._original = None @@ -52,581 +25,1271 @@ class Xml_node: self._parent = None self._attribute_dict = {} - def get_parent (self): + def get_parent(self): return self._parent - def is_first (self): - return self._parent.get_typed_children (self.__class__)[0] == self + def is_first(self): + return self._parent.get_typed_children(self.__class__)[0] == self - def original (self): + def original(self): return self._original - def get_name (self): + def get_name(self): return self._name - def get_text (self): + def get_text(self): if self._data: return self._data if not self._children: return '' - return ''.join ([c.get_text () for c in self._children]) + return ''.join([c.get_text() for c in self._children]) - def message (self, msg): - ly.warning (msg) + def message(self, msg): + ly.warning(msg) p = self while p: - ly.progress (' In: <%s %s>\n' % (p._name, ' '.join (['%s=%s' % item for item in p._attribute_dict.items ()]))) - p = p.get_parent () + ly.progress(' In: <%s %s>\n' %(p._name, ' '.join(['%s=%s' % item for item in p._attribute_dict.items()]))) + p = p.get_parent() - def dump (self, indent = ''): - ly.debug_output ('%s<%s%s>' % (indent, self._name, ''.join ([' %s=%s' % item for item in self._attribute_dict.items ()]))) - non_text_children = [c for c in self._children if not isinstance (c, Hash_text)] + def dump(self, indent=''): + ly.debug_output('%s<%s%s>' %(indent, self._name, ''.join([' %s=%s' % item for item in self._attribute_dict.items()]))) + non_text_children = [c for c in self._children if not isinstance(c, Hash_text)] if non_text_children: - ly.debug_output ('\n') + ly.debug_output('\n') for c in self._children: - c.dump (indent + " ") + c.dump(indent + " ") if non_text_children: - ly.debug_output (indent) - ly.debug_output ('\n' % self._name) + ly.debug_output(indent) + ly.debug_output('\n' % self._name) - def get_typed_children (self, klass): + def get_typed_children(self, klass): if not klass: return [] else: return [c for c in self._children if isinstance(c, klass)] - def get_named_children (self, nm): - return self.get_typed_children (get_class (nm)) + def get_named_children(self, nm): + return self.get_typed_children(get_class(nm)) - def get_named_child (self, nm): - return self.get_maybe_exist_named_child (nm) + def get_named_child(self, nm): + return self.get_maybe_exist_named_child(nm) - def get_children (self, predicate): + def get_children(self, predicate): return [c for c in self._children if predicate(c)] - def get_all_children (self): + def get_all_children(self): return self._children - def get_maybe_exist_named_child (self, name): - return self.get_maybe_exist_typed_child (get_class (name)) + def get_maybe_exist_named_child(self, name): + return self.get_maybe_exist_typed_child(get_class(name)) - def get_maybe_exist_typed_child (self, klass): - cn = self.get_typed_children (klass) - if len (cn)==0: + def get_maybe_exist_typed_child(self, klass): + cn = self.get_typed_children(klass) + if len(cn) == 0: return None - elif len (cn) == 1: - return cn[0] else: - raise "More than 1 child", klass - - def get_unique_typed_child (self, klass): + try: + assert len(cn) == 1 + return cn[0] + except: + msg = ' '.join( + ['more than one child of class ', + klass.__name__, + '...all but the first will be ignored!']) + warnings.warn(msg) + return cn[0] + + def get_unique_typed_child(self, klass): cn = self.get_typed_children(klass) - if len (cn) <> 1: - ly.error (self.__dict__) - raise 'Child is not unique for', (klass, 'found', cn) + if len(cn) <> 1: + ly.error(self.__dict__) + raise 'Child is not unique for',(klass, 'found', cn) return cn[0] - def get_named_child_value_number (self, name, default): - n = self.get_maybe_exist_named_child (name) + def get_named_child_value_number(self, name, default): + n = self.get_maybe_exist_named_child(name) if n: - return string.atoi (n.get_text()) + return int(n.get_text()) else: return default -class Music_xml_node (Xml_node): - def __init__ (self): - Xml_node.__init__ (self) - self.duration = Rational (0) - self.start = Rational (0) +class Music_xml_node(Xml_node): + def __init__(self): + Xml_node.__init__(self) + self.duration = Rational(0) + self.start = Rational(0) + self.converted = False + self.voice_id = None; + + +class Music_xml_spanner(Music_xml_node): -class Work (Xml_node): - def get_work_information (self, tag): - wt = self.get_maybe_exist_named_child (tag) + def get_type(self): + if hasattr(self, 'type'): + return self.type + else: + return 0 + + def get_size(self): + if hasattr(self, 'size'): + return int(self.size) + else: + return 0 + + +class Measure_element(Music_xml_node): + + def get_voice_id(self): + voice = self.get_maybe_exist_named_child('voice') + if voice: + return voice.get_text() + else: + return self.voice_id + + def is_first(self): + # Look at all measure elements(previously we had self.__class__, which + # only looked at objects of the same type! + cn = self._parent.get_typed_children(Measure_element) + # But only look at the correct voice; But include Attributes, too, which + # are not tied to any particular voice + cn = [c for c in cn if(c.get_voice_id() == self.get_voice_id()) or isinstance(c, Attributes)] + return cn[0] == self + + +class Work(Xml_node): + + def get_work_information(self, tag): + wt = self.get_maybe_exist_named_child(tag) if wt: - return wt.get_text () + return wt.get_text() else: return '' - def get_work_title (self): - return self.get_work_information ('work-title') - def get_work_number (self): - return self.get_work_information ('work-number') - def get_opus (self): - return self.get_work_information ('opus') + def get_work_title(self): + return self.get_work_information('work-title') + + def get_work_number(self): + return self.get_work_information('work-number') + + # def get_opus(self): + # return self.get_work_information('opus') -class Identification (Xml_node): - def get_rights (self): - rights = self.get_named_children ('rights') + +class Identification(Xml_node): + + def get_rights(self): + rights = self.get_named_children('rights') ret = [] for r in rights: - ret.append (r.get_text ()) - return string.join (ret, "\n") + text = r.get_text() + # if this Xml_node has an attribute, such as 'type="words"', + # include it in the header. Otherwise, it is assumed that + # the text contents of this node looks something like this: + # 'Copyright: X.Y.' and thus already contains the relevant + # information. + if hasattr(r, 'type'): + rights_type = r.type.title() # capitalize first letter + result = ''.join([rights_type, ': ', text]) + ret.append(result) + else: + ret.append(text) + return string.join(ret, "\n") - # get contents of the source-element (usually used for publishing information). (These contents are saved in a custom variable named "source" in the header of the .ly file.) - def get_source (self): - source = self.get_named_children ('source') + # get contents of the source-element(usually used for publishing information).(These contents are saved in a custom variable named "source" in the header of the .ly file.) + def get_source(self): + source = self.get_named_children('source') ret = [] for r in source: - ret.append (r.get_text ()) - return string.join (ret, "\n") + ret.append(r.get_text()) + return string.join(ret, "\n") - def get_creator (self, type): - creators = self.get_named_children ('creator') + def get_creator(self, type): + creators = self.get_named_children('creator') # return the first creator tag that has the particular type for i in creators: - if hasattr (i, 'type') and i.type == type: - return i.get_text () + if hasattr(i, 'type') and i.type == type: + return i.get_text() return None - def get_composer (self): - c = self.get_creator ('composer') + def get_composer(self): + c = self.get_creator('composer') if c: return c - creators = self.get_named_children ('creator') + creators = self.get_named_children('creator') # return the first creator tag that has no type at all for i in creators: - if not hasattr (i, 'type'): - return i.get_text () + if not hasattr(i, 'type'): + return i.get_text() return None - def get_arranger (self): - return self.get_creator ('arranger') - def get_editor (self): - return self.get_creator ('editor') - def get_poet (self): - v = self.get_creator ('lyricist') + + def get_arranger(self): + return self.get_creator('arranger') + + def get_editor(self): + return self.get_creator('editor') + + def get_poet(self): + v = self.get_creator('lyricist') if v: return v - v = self.get_creator ('poet') + v = self.get_creator('poet') return v - def get_encoding_information (self, type): - enc = self.get_named_children ('encoding') + def get_encoding_information(self, type): + enc = self.get_named_children('encoding') if enc: - children = enc[0].get_named_children (type) + children = enc[0].get_named_children(type) if children: - return children[0].get_text () + return children[0].get_text() else: return None - def get_encoding_software (self): - return self.get_encoding_information ('software') - def get_encoding_date (self): - return self.get_encoding_information ('encoding-date') - def get_encoding_person (self): - return self.get_encoding_information ('encoder') - def get_encoding_description (self): - return self.get_encoding_information ('encoding-description') - - def get_encoding_software_list (self): - enc = self.get_named_children ('encoding') + def get_encoding_software(self): + return self.get_encoding_information('software') + + def get_encoding_date(self): + return self.get_encoding_information('encoding-date') + + def get_encoding_person(self): + return self.get_encoding_information('encoder') + + def get_encoding_description(self): + return self.get_encoding_information('encoding-description') + + def get_encoding_software_list(self): + enc = self.get_named_children('encoding') software = [] for e in enc: - softwares = e.get_named_children ('software') + softwares = e.get_named_children('software') for s in softwares: - software.append (s.get_text ()) + software.append(s.get_text()) return software - def get_file_description (self): - misc = self.get_named_children ('miscellaneous') + def get_file_description(self): + misc = self.get_named_children('miscellaneous') for m in misc: - misc_fields = m.get_named_children ('miscellaneous-field') + misc_fields = m.get_named_children('miscellaneous-field') for mf in misc_fields: - if hasattr (mf, 'name') and mf.name == 'description': - return mf.get_text () + if hasattr(mf, 'name') and mf.name == 'description': + return mf.get_text() return None -class Duration (Music_xml_node): - def get_length (self): - dur = int (self.get_text ()) * Rational (1,4) + +class Credit(Xml_node): + + def get_type(self): + type = self.get_maybe_exist_named_child('credit-type') + if(type != None): + return type.get_text() + else: + return None + + def find_type(self, credits): + sizes = self.get_font_sizes(credits) + sizes.sort(reverse=True) + ys = self.get_default_ys(credits) + ys.sort(reverse=True) + xs = self.get_default_xs(credits) + xs.sort(reverse=True) + + # Words child of the self credit-element + words = self.get_maybe_exist_named_child('credit-words') + size = None + x = None + y = None + halign = None + valign = None + justify = None + if(words != None): + if hasattr(words, 'font-size'): + size = utilities.string_to_integer(getattr(words, 'font-size')) + if hasattr(words, 'default-x'): + x = round(float(getattr(words, 'default-x'))) + if hasattr(words, 'default-y'): + y = round(float(getattr(words, 'default-y'))) + if hasattr(words, 'halign'): + halign = getattr(words, 'halign') + if hasattr(words, 'valign'): + valign = getattr(words, 'valign') + if hasattr(words, 'justify'): + justify = getattr(words, 'justify') + if(size and size == max(sizes) and y and y == max(ys) and(justify or halign) and(justify == 'center' or halign == 'center')): + return 'title' + elif((y and y > min(ys) and y < max(ys)) and((justify or halign) and(justify == 'center' or halign == 'center'))): + return 'subtitle' + elif((justify or halign) and(justify == 'left' or halign == 'left') and(not(x) or x == min(xs))): + return 'lyricist' + elif((justify or halign) and(justify == 'right' or halign == 'right') and(not(x) or x == max(xs))): + return 'composer' + elif(size and size == min(sizes) and y == min(ys)): + return 'rights' + # Special cases for Finale NotePad + elif((valign and(valign == 'top')) and(y and y == ys[1])): + return 'subtitle' + elif((valign and(valign == 'top')) and(x and x == min(xs))): + return 'lyricist' + elif((valign and(valign == 'top')) and(y and y == min(ys))): + return 'rights' + # Other special cases + elif((valign and(valign == 'bottom'))): + return 'rights' + elif(len([item for item in range(len(ys)) if ys[item] == y]) == 2): + # The first one is the composer, the second one is the lyricist + return 'composer' + + return None # no type recognized + + def get_font_sizes(self, credits): + sizes = [] + for cred in credits: + words = cred.get_maybe_exist_named_child('credit-words') + if((words != None) and hasattr(words, 'font-size')): + sizes.append(getattr(words, 'font-size')) + return map(utilities.string_to_integer, sizes) + + def get_default_xs(self, credits): + default_xs = [] + for cred in credits: + words = cred.get_maybe_exist_named_child('credit-words') + if((words != None) and hasattr(words, 'default-x')): + default_xs.append(getattr(words, 'default-x')) + return map(round, map(float, default_xs)) + + def get_default_ys(self, credits): + default_ys = [] + for cred in credits: + words = cred.get_maybe_exist_named_child('credit-words') + if((words != None) and hasattr(words, 'default-y')): + default_ys.append(getattr(words, 'default-y')) + return map(round, map(float, default_ys)) + + def get_text(self): + words = self.get_maybe_exist_named_child('credit-words') + if(words != None): + return words.get_text() + else: + return '' + + +class Duration(Music_xml_node): + + def get_length(self): + dur = int(self.get_text()) * Rational(1, 4) return dur -class Hash_comment (Music_xml_node): - pass -class Hash_text (Music_xml_node): - def dump (self, indent = ''): - ly.debug_output ('%s' % string.strip (self._data)) - -class Pitch (Music_xml_node): - def get_step (self): - ch = self.get_unique_typed_child (get_class (u'step')) - step = ch.get_text ().strip () + +class Hash_text(Music_xml_node): + + def dump(self, indent=''): + ly.debug_output('%s' % string.strip(self._data)) + + +class Pitch(Music_xml_node): + + def get_step(self): + ch = self.get_unique_typed_child(get_class(u'step')) + step = ch.get_text().strip() return step - def get_octave (self): - ch = self.get_unique_typed_child (get_class (u'octave')) - octave = ch.get_text ().strip () - return int (octave) - - def get_alteration (self): - ch = self.get_maybe_exist_typed_child (get_class (u'alter')) - return interpret_alter_element (ch) - -class Unpitched (Music_xml_node): - def get_step (self): - ch = self.get_unique_typed_child (get_class (u'display-step')) - step = ch.get_text ().strip () + + def get_octave(self): + ch = self.get_unique_typed_child(get_class(u'octave')) + octave = ch.get_text().strip() + return int(octave) + + def get_alteration(self): + ch = self.get_maybe_exist_typed_child(get_class(u'alter')) + return utilities.interpret_alter_element(ch) + + def to_lily_object(self): + p = musicexp.Pitch() + p.alteration = self.get_alteration() + p.step = musicxml2ly_conversion.musicxml_step_to_lily(self.get_step()) + p.octave = self.get_octave() - 4 + return p + + +class Unpitched(Music_xml_node): + + def get_step(self): + ch = self.get_unique_typed_child(get_class(u'display-step')) + step = ch.get_text().strip() return step - def get_octave (self): - ch = self.get_unique_typed_child (get_class (u'display-octave')) + def get_octave(self): + ch = self.get_unique_typed_child(get_class(u'display-octave')) if ch: - octave = ch.get_text ().strip () - return int (octave) + octave = ch.get_text().strip() + return int(octave) else: return None + def to_lily_object(self): + p = None + step = self.get_step() + if step: + p = musicexp.Pitch() + p.step = musicxml2ly_conversion.musicxml_step_to_lily(step) + octave = self.get_octave() + if octave and p: + p.octave = octave - 4 + return p + + class Measure_element (Music_xml_node): def get_voice_id (self): - voice_id = self.get_maybe_exist_named_child ('voice') - if voice_id: - return voice_id.get_text () + voice = self.get_maybe_exist_named_child ('voice') + if voice: + return voice.get_text () else: - return None + return self.voice_id; - def is_first (self): - # Look at all measure elements (previously we had self.__class__, which - # only looked at objects of the same type! - cn = self._parent.get_typed_children (Measure_element) - # But only look at the correct voice; But include Attributes, too, which - # are not tied to any particular voice - cn = [c for c in cn if (c.get_voice_id () == self.get_voice_id ()) or isinstance (c, Attributes)] - return cn[0] == self -class Attributes (Measure_element): - def __init__ (self): - Measure_element.__init__ (self) +class Attributes(Measure_element): + + def __init__(self): + Measure_element.__init__(self) self._dict = {} self._original_tag = None self._time_signature_cache = None - def is_first (self): - cn = self._parent.get_typed_children (self.__class__) + def is_first(self): + cn = self._parent.get_typed_children(self.__class__) if self._original_tag: return cn[0] == self._original_tag else: return cn[0] == self - def set_attributes_from_previous (self, dict): - self._dict.update (dict) + def set_attributes_from_previous(self, dict): + self._dict.update(dict) - def read_self (self): - for c in self.get_all_children (): + def read_self(self): + for c in self.get_all_children(): self._dict[c.get_name()] = c - def get_named_attribute (self, name): - return self._dict.get (name) + def get_named_attribute(self, name): + return self._dict.get(name) - def single_time_sig_to_fraction (self, sig): - if len (sig) < 2: + def single_time_sig_to_fraction(self, sig): + if len(sig) < 2: return 0 n = 0 for i in sig[0:-1]: n += i - return Rational (n, sig[-1]) + return Rational(n, sig[-1]) - def get_measure_length (self): - sig = self.get_time_signature () - if not sig or len (sig) == 0: + def get_measure_length(self): + sig = self.get_time_signature() + if not sig or len(sig) == 0: return 1 - if isinstance (sig[0], list): + if isinstance(sig[0], list): # Complex compound time signature l = 0 for i in sig: - l += self.single_time_sig_to_fraction (i) + l += self.single_time_sig_to_fraction(i) return l else: - # Simple (maybe compound) time signature of the form (beat, ..., type) - return self.single_time_sig_to_fraction (sig) + # Simple(maybe compound) time signature of the form(beat, ..., type) + return self.single_time_sig_to_fraction(sig) return 0 - def get_time_signature (self): - "Return time sig as a (beat, beat-type) tuple. For compound signatures," - "return either (beat, beat,..., beat-type) or ((beat,..., type), " + def get_time_signature(self): + "Return time sig as a(beat, beat-type) tuple. For compound signatures," + "return either(beat, beat,..., beat-type) or((beat,..., type), " "(beat,..., type), ...)." if self._time_signature_cache: return self._time_signature_cache try: - mxl = self.get_named_attribute ('time') + mxl = self.get_named_attribute('time') if not mxl: return None - if mxl.get_maybe_exist_named_child ('senza-misura'): + if mxl.get_maybe_exist_named_child('senza-misura'): # TODO: Handle pieces without a time signature! - ly.warning (_ ("Senza-misura time signatures are not yet supported!")) - return (4, 4) + ly.warning(_("Senza-misura time signatures are not yet supported!")) + return(4, 4) else: signature = [] current_sig = [] - for i in mxl.get_all_children (): - if isinstance (i, Beats): - beats = string.split (i.get_text ().strip (), "+") - current_sig = [int (j) for j in beats] - elif isinstance (i, BeatType): - current_sig.append (int (i.get_text ())) - signature.append (current_sig) + for i in mxl.get_all_children(): + if isinstance(i, Beats): + beats = string.split(i.get_text().strip(), "+") + current_sig = [int(j) for j in beats] + elif isinstance(i, BeatType): + current_sig.append(int(i.get_text())) + signature.append(current_sig) current_sig = [] - if isinstance (signature[0], list) and len (signature) == 1: + if isinstance(signature[0], list) and len(signature) == 1: signature = signature[0] self._time_signature_cache = signature return signature - except (KeyError, ValueError): - self.message (_ ("Unable to interpret time signature! Falling back to 4/4.")) - return (4, 4) + except(KeyError, ValueError): + self.message(_("Unable to interpret time signature! Falling back to 4/4.")) + return(4, 4) - # returns clef information in the form ("cleftype", position, octave-shift) - def get_clef_information (self): + # returns clef information in the form("cleftype", position, octave-shift) + def get_clef_information(self): clefinfo = ['G', 2, 0] - mxl = self.get_named_attribute ('clef') + mxl = self.get_named_attribute('clef') if not mxl: return clefinfo - sign = mxl.get_maybe_exist_named_child ('sign') + sign = mxl.get_maybe_exist_named_child('sign') if sign: clefinfo[0] = sign.get_text() - line = mxl.get_maybe_exist_named_child ('line') + line = mxl.get_maybe_exist_named_child('line') if line: - clefinfo[1] = string.atoi (line.get_text ()) - octave = mxl.get_maybe_exist_named_child ('clef-octave-change') + clefinfo[1] = int(line.get_text()) + octave = mxl.get_maybe_exist_named_child('clef-octave-change') if octave: - clefinfo[2] = string.atoi (octave.get_text ()) + clefinfo[2] = int(octave.get_text()) return clefinfo - def get_key_signature (self): - "return (fifths, mode) tuple if the key signatures is given as " + def get_key_signature(self): + "return(fifths, mode) tuple if the key signatures is given as " "major/minor in the Circle of fifths. Otherwise return an alterations" "list of the form [[step,alter<,octave>], [step,alter<,octave>], ...], " "where the octave values are optional." - key = self.get_named_attribute ('key') + key = self.get_named_attribute('key') if not key: return None - fifths_elm = key.get_maybe_exist_named_child ('fifths') + fifths_elm = key.get_maybe_exist_named_child('fifths') if fifths_elm: - mode_node = key.get_maybe_exist_named_child ('mode') + mode_node = key.get_maybe_exist_named_child('mode') mode = None if mode_node: - mode = mode_node.get_text () + mode = mode_node.get_text() if not mode or mode == '': mode = 'major' - fifths = int (fifths_elm.get_text ()) + fifths = int(fifths_elm.get_text()) # TODO: Shall we try to convert the key-octave and the cancel, too? - return (fifths, mode) + return(fifths, mode) else: alterations = [] current_step = 0 - for i in key.get_all_children (): - if isinstance (i, KeyStep): - current_step = i.get_text ().strip () - elif isinstance (i, KeyAlter): - alterations.append ([current_step, interpret_alter_element (i)]) - elif isinstance (i, KeyOctave): + for i in key.get_all_children(): + if isinstance(i, KeyStep): + current_step = i.get_text().strip() + elif isinstance(i, KeyAlter): + alterations.append([current_step, utilities.interpret_alter_element(i)]) + elif isinstance(i, KeyOctave): nr = -1 - if hasattr (i, 'number'): - nr = int (i.number) - if (nr > 0) and (nr <= len (alterations)): + if hasattr(i, 'number'): + nr = int(i.number) + if(nr > 0) and(nr <= len(alterations)): # MusicXML Octave 4 is middle C -> shift to 0 - alterations[nr-1].append (int (i.get_text ())-4) + alterations[nr - 1].append(int(i.get_text()) - 4) else: - i.message (_ ("Key alteration octave given for a " - "non-existing alteration nr. %s, available numbers: %s!") % (nr, len(alterations))) + i.message(_("Key alteration octave given for a " + "non-existing alteration nr. %s, available numbers: %s!") %(nr, len(alterations))) return alterations - def get_transposition (self): - return self.get_named_attribute ('transpose') + def get_transposition(self): + return self.get_named_attribute('transpose') + + +class Barline(Measure_element): + + def to_lily_object(self): + # retval contains all possible markers in the order: + # 0..bw_ending, 1..bw_repeat, 2..barline, 3..fw_repeat, 4..fw_ending + retval = {} + bartype_element = self.get_maybe_exist_named_child("bar-style") + repeat_element = self.get_maybe_exist_named_child("repeat") + ending_element = self.get_maybe_exist_named_child("ending") + + bartype = None + if bartype_element: + bartype = bartype_element.get_text() + + if repeat_element and hasattr(repeat_element, 'direction'): + repeat = musicxml2ly_conversion.RepeatMarker() + repeat.direction = {"forward":-1, "backward": 1}.get( + repeat_element.direction, 0) + + if((repeat_element.direction == "forward" and bartype == "heavy-light") or + (repeat_element.direction == "backward" and bartype == "light-heavy")): + bartype = None + if hasattr(repeat_element, 'times'): + try: + repeat.times = int(repeat_element.times) + except ValueError: + repeat.times = 2 + repeat.event = self + if repeat.direction == -1: + retval[3] = repeat + else: + retval[1] = repeat + + if ending_element and hasattr(ending_element, 'type'): + ending = musicxml2ly_conversion.EndingMarker() + ending.direction = {"start":-1, "stop": 1, "discontinue": 1}.get( + ending_element.type, 0) + ending.event = self + if ending.direction == -1: + retval[4] = ending + else: + retval[0] = ending + # TODO. ending number="" -class KeyAlter (Music_xml_node): - pass -class KeyStep (Music_xml_node): - pass -class KeyOctave (Music_xml_node): - pass + if bartype: + b = musicexp.BarLine() + b.type = bartype + retval[2] = b + return retval.values() -class Barline (Measure_element): - pass -class BarStyle (Music_xml_node): - pass -class Partial (Measure_element): - def __init__ (self, partial): - Measure_element.__init__ (self) + +class Partial(Measure_element): + def __init__(self, partial): + Measure_element.__init__(self) self.partial = partial -class Note (Measure_element): - def __init__ (self): - Measure_element.__init__ (self) + +class Stem(Music_xml_node): + + stem_value_dict = { + 'down': 'stemDown', + 'up': 'stemUp', + 'double': None, # TODO: Implement + 'none': 'stemNeutral' + } + + def to_stem_event(self): + values = [] + value = self.stem_value_dict.get(self.get_text(), None) + stem_value = musicexp.StemEvent() + if value: + stem_value.value = value + values.append(stem_value) + return values + + def to_stem_style_event(self): + styles = [] + style_elm = musicexp.StemstyleEvent() + if hasattr(self, 'color'): + style_elm.color = utilities.hex_to_color(getattr(self, 'color')) + if(style_elm.color != None): + styles.append(style_elm) + return styles + + +class Notehead(Music_xml_node): + + notehead_styles_dict = { + 'slash': '\'slash', + 'triangle': '\'triangle', + 'diamond': '\'diamond', + 'square': '\'la', # TODO: Proper squared note head + 'cross': None, # TODO: + shaped note head + 'x': '\'cross', + 'circle-x': '\'xcircle', + 'inverted triangle': None, # TODO: Implement + 'arrow down': None, # TODO: Implement + 'arrow up': None, # TODO: Implement + 'slashed': None, # TODO: Implement + 'back slashed': None, # TODO: Implement + 'normal': None, + 'cluster': None, # TODO: Implement + 'none': '#f', + 'do': '\'do', + 're': '\'re', + 'mi': '\'mi', + 'fa': '\'fa', + 'so': None, + 'la': '\'la', + 'ti': '\'ti', + } + + def to_lily_object(self): #function changed: additionally processcolor attribute + styles = [] + + # Notehead style + key = self.get_text().strip() + style = self.notehead_styles_dict.get(key, None) + event = musicexp.NotestyleEvent() + if style: + event.style = style + if hasattr(self, 'filled'): + event.filled =(getattr(self, 'filled') == "yes") + if hasattr(self, 'color'): + event.color = utilities.hex_to_color(getattr(self, 'color')) + if event.style or(event.filled != None) or(event.color != None): + styles.append(event) + # parentheses + if hasattr(self, 'parentheses') and(self.parentheses == "yes"): + styles.append(musicexp.ParenthesizeEvent()) + + return styles + + +class Note(Measure_element): + + drumtype_dict = { + 'Acoustic Snare Drum': 'acousticsnare', + 'Side Stick': 'sidestick', + 'Open Triangle': 'opentriangle', + 'Mute Triangle': 'mutetriangle', + 'Tambourine': 'tambourine', + 'Bass Drum': 'bassdrum', + } + + def __init__(self): + Measure_element.__init__(self) self.instrument_name = '' self._after_grace = False - def is_grace (self): - return self.get_maybe_exist_named_child (u'grace') - def is_after_grace (self): + self._duration = 1 + + def is_grace(self): + return self.get_maybe_exist_named_child(u'grace') + + def is_after_grace(self): if not self.is_grace(): return False; - gr = self.get_maybe_exist_typed_child (Grace) - return self._after_grace or hasattr (gr, 'steal-time-previous'); + gr = self.get_maybe_exist_typed_child(Grace) + return self._after_grace or hasattr(gr, 'steal-time-previous'); - def get_duration_log (self): - ch = self.get_maybe_exist_named_child (u'type') + def get_duration_log(self): + ch = self.get_maybe_exist_named_child(u'type') if ch: - log = ch.get_text ().strip() - return musicxml_duration_to_log (log) - elif self.get_maybe_exist_named_child (u'grace'): + log = ch.get_text().strip() + return utilities.musicxml_duration_to_log(log) + elif self.get_maybe_exist_named_child(u'grace'): # FIXME: is it ok to default to eight note for grace notes? return 3 else: return None - def get_duration_info (self): - log = self.get_duration_log () + def get_duration_info(self): + log = self.get_duration_log() if log != None: - dots = len (self.get_typed_children (Dot)) - return (log, dots) + dots = len(self.get_typed_children(Dot)) + return(log, dots) else: return None - def get_factor (self): + def get_factor(self): return 1 - def get_pitches (self): - return self.get_typed_children (get_class (u'pitch')) + def get_pitches(self): + return self.get_typed_children(get_class(u'pitch')) + + def set_notehead_style(self, event): + noteheads = self.get_named_children('notehead') + for nh in noteheads: + styles = nh.to_lily_object() + for style in styles: + event.add_associated_event(style) + + def set_stem_directions(self, event): + stems = self.get_named_children('stem') + for stem in stems: + values = stem.to_stem_event() + for v in values: + event.add_associated_event(v) + + def set_stem_style(self, event): + stems = self.get_named_children('stem') + for stem in stems: + styles = stem.to_stem_style_event() + for style in styles: + event.add_associated_event(style) + + def initialize_duration(self): + from musicxml2ly_conversion import rational_to_lily_duration + from musicexp import Duration + # if the note has no Type child, then that method returns None. In that case, + # use the tag instead. If that doesn't exist, either -> Error + dur = self.get_duration_info() + if dur: + d = Duration() + d.duration_log = dur[0] + d.dots = dur[1] + # Grace notes by specification have duration 0, so no time modification + # factor is possible. It even messes up the output with *0/1 + if not self.get_maybe_exist_typed_child(Grace): + d.factor = self._duration / d.get_length() + return d + else: + if self._duration > 0: + return rational_to_lily_duration(self._duration) + else: + self.message( + _("Encountered note at %s without type and duration(=%s)") \ + %(mxl_note.start, mxl_note._duration)) + return None + + def initialize_pitched_event(self): + mxl_pitch = self.get_maybe_exist_typed_child(Pitch) + pitch = mxl_pitch.to_lily_object() + event = musicexp.NoteEvent() + event.pitch = pitch + acc = self.get_maybe_exist_named_child('accidental') + if acc: + # let's not force accs everywhere. + event.cautionary = acc.cautionary + # TODO: Handle editorial accidentals + # TODO: Handle the level-display setting for displaying brackets/parentheses + return event + + def initialize_unpitched_event(self): + # Unpitched elements have display-step and can also have + # display-octave. + unpitched = self.get_maybe_exist_typed_child(Unpitched) + event = musicexp.NoteEvent() + event.pitch = unpitched.to_lily_object() + return event + + def initialize_rest_event(self, convert_rest_positions=True): + # rests can have display-octave and display-step, which are + # treated like an ordinary note pitch + rest = self.get_maybe_exist_typed_child(Rest) + event = musicexp.RestEvent() + if convert_rest_positions: + pitch = rest.to_lily_object() + event.pitch = pitch + return event + + def initialize_drum_event(self): + event = musicexp.NoteEvent() + drum_type = self.drumtype_dict.get(self.instrument_name) + if drum_type: + event.drum_type = drum_type + else: + self.message( + _("drum %s type unknown, please add to instrument_drumtype_dict") + % n.instrument_name) + event.drum_type = 'acousticsnare' + return event + + def to_lily_object(self, + convert_stem_directions=True, + convert_rest_positions=True): + pitch = None + duration = None + event = None + + if self.get_maybe_exist_typed_child(Pitch): + event = self.initialize_pitched_event() + elif self.get_maybe_exist_typed_child(Unpitched): + event = self.initialize_unpitched_event() + elif self.get_maybe_exist_typed_child(Rest): + event = self.initialize_rest_event(convert_rest_positions) + elif self.instrument_name: + event = self.initialize_drum_event() + else: + self.message(_("cannot find suitable event")) + + if event: + event.duration = self.initialize_duration() + + self.set_notehead_style(event) + self.set_stem_style(event) + if convert_stem_directions: + self.set_stem_directions(event) + + return event -class Part_list (Music_xml_node): - def __init__ (self): - Music_xml_node.__init__ (self) + +class Part_list(Music_xml_node): + + def __init__(self): + Music_xml_node.__init__(self) self._id_instrument_name_dict = {} - def generate_id_instrument_dict (self): + def generate_id_instrument_dict(self): ## not empty to make sure this happens only once. mapping = {1: 1} - for score_part in self.get_named_children ('score-part'): - for instr in score_part.get_named_children ('score-instrument'): + for score_part in self.get_named_children('score-part'): + for instr in score_part.get_named_children('score-instrument'): id = instr.id - name = instr.get_named_child ("instrument-name") - mapping[id] = name.get_text () + name = instr.get_named_child("instrument-name") + mapping[id] = name.get_text() self._id_instrument_name_dict = mapping - def get_instrument (self, id): + def get_instrument(self, id): if not self._id_instrument_name_dict: self.generate_id_instrument_dict() - instrument_name = self._id_instrument_name_dict.get (id) + instrument_name = self._id_instrument_name_dict.get(id) if instrument_name: return instrument_name else: - ly.warning (_ ("Unable to find instrument for ID=%s\n") % id) + ly.warning(_("Unable to find instrument for ID=%s\n") % id) return "Grand Piano" -class Part_group (Music_xml_node): - pass -class Score_part (Music_xml_node): - pass -class Measure (Music_xml_node): - def __init__ (self): - Music_xml_node.__init__ (self) +class Measure(Music_xml_node): + + def __init__(self): + Music_xml_node.__init__(self) self.partial = 0 - def is_implicit (self): - return hasattr (self, 'implicit') and self.implicit == 'yes' - def get_notes (self): - return self.get_typed_children (get_class (u'note')) -class Syllabic (Music_xml_node): - def continued (self): + def is_implicit(self): + return hasattr(self, 'implicit') and self.implicit == 'yes' + + def get_notes(self): + return self.get_typed_children(get_class(u'note')) + + +class Syllabic(Music_xml_node): + + def continued(self): text = self.get_text() - return (text == "begin") or (text == "middle") -class Elision (Music_xml_node): - pass -class Extend (Music_xml_node): - pass -class Text (Music_xml_node): - pass + return(text == "begin") or(text == "middle") + + def begin(self): + return(text == "begin") + + def middle(self): + return(text == "middle") + + def end(self): + return(text == "end") -class Lyric (Music_xml_node): - def get_number (self): - if hasattr (self, 'number'): + +class Lyric(Music_xml_node): + + def number(self): + """ + Return the number attribute(if it exists) of the lyric element. + + @rtype: number + @return: The value of the number attribute + """ + if hasattr(self, 'number'): return self.number else: return -1 + +class Sound(Music_xml_node): + + def get_tempo(self): + """ + Return the tempo attribute(if it exists) of the sound element. + This attribute can be used by musicxml2ly for the midi output(see L{musicexp.Score}). + + @rtype: string + @return: The value of the tempo attribute + """ + if hasattr(self, 'tempo'): + return self.tempo + else: + return None + + +class Notations(Music_xml_node): + + def get_tie(self): + ts = self.get_named_children('tied') + starts = [t for t in ts if t.type == 'start'] + if starts: + return starts[0] + else: + return None + + def get_tuplets(self): + return self.get_typed_children(Tuplet) + + +class Time_modification(Music_xml_node): + + def get_fraction(self): + b = self.get_maybe_exist_named_child('actual-notes') + a = self.get_maybe_exist_named_child('normal-notes') + return(int(a.get_text()), int(b.get_text())) + + def get_normal_type(self): + tuplet_type = self.get_maybe_exist_named_child('normal-type') + if tuplet_type: + dots = self.get_named_children('normal-dot') + log = utilities.musicxml_duration_to_log(tuplet_type.get_text().strip()) + return(log , len(dots)) + else: + return None + + +class Accidental(Music_xml_node): + + def __init__(self): + Music_xml_node.__init__(self) + self.editorial = False + self.cautionary = False + + +class Tuplet(Music_xml_spanner): + + def duration_info_from_tuplet_note(self, tuplet_note): + tuplet_type = tuplet_note.get_maybe_exist_named_child('tuplet-type') + if tuplet_type: + dots = tuplet_note.get_named_children('tuplet-dot') + log = utilities.musicxml_duration_to_log(tuplet_type.get_text().strip()) + return(log, len(dots)) + else: + return None + + # Return tuplet note type as(log, dots) + def get_normal_type(self): + tuplet = self.get_maybe_exist_named_child('tuplet-normal') + if tuplet: + return self.duration_info_from_tuplet_note(tuplet) + else: + return None + + def get_actual_type(self): + tuplet = self.get_maybe_exist_named_child('tuplet-actual') + if tuplet: + return self.duration_info_from_tuplet_note(tuplet) + else: + return None + + def get_tuplet_note_count(self, tuplet_note): + if tuplet_note: + tuplet_nr = tuplet_note.get_maybe_exist_named_child('tuplet-number') + if tuplet_nr: + return int(tuplet_nr.get_text()) + return None + + def get_normal_nr(self): + return self.get_tuplet_note_count(self.get_maybe_exist_named_child('tuplet-normal')) + + def get_actual_nr(self): + return self.get_tuplet_note_count(self.get_maybe_exist_named_child('tuplet-actual')) + + +class Slur(Music_xml_spanner): + + def get_type(self): + return self.type + + +class Tied(Music_xml_spanner): + + def get_type(self): + return self.type + + +class Beam(Music_xml_spanner): + def get_type(self): + return self.get_text() + def is_primary(self): + if hasattr(self, 'number'): + return self.number == "1" + else: + return True + +class Octave_shift(Music_xml_spanner): + # default is 8 for the octave-shift! + def get_size(self): + if hasattr(self, 'size'): + return int(self.size) + else: + return 8 + + +# Rests in MusicXML are blocks with a inside. This class is only +# for the inner element, not the whole rest block. +class Rest(Music_xml_node): + + def __init__(self): + Music_xml_node.__init__(self) + self._is_whole_measure = False + + def is_whole_measure(self): + return self._is_whole_measure + + def get_step(self): + ch = self.get_maybe_exist_typed_child(get_class(u'display-step')) + if ch: + return ch.get_text().strip() + else: + return None + + def get_octave(self): + ch = self.get_maybe_exist_typed_child(get_class(u'display-octave')) + if ch: + oct = ch.get_text().strip() + return int(oct) + else: + return None + + def to_lily_object(self): + p = None + step = self.get_step() + if step: + p = musicexp.Pitch() + p.step = musicxml2ly_conversion.musicxml_step_to_lily(step) + octave = self.get_octave() + if octave and p: + p.octave = octave - 4 + return p + + +class Bend(Music_xml_node): + + def bend_alter(self): + alter = self.get_maybe_exist_named_child('bend-alter') + return utilities.interpret_alter_element(alter) + + +class ChordPitch(Music_xml_node): + + def step_class_name(self): + return u'root-step' + + def alter_class_name(self): + return u'root-alter' + + def get_step(self): + ch = self.get_unique_typed_child(get_class(self.step_class_name())) + return ch.get_text().strip() + + def get_alteration(self): + ch = self.get_maybe_exist_typed_child(get_class(self.alter_class_name())) + return utilities.interpret_alter_element(ch) + + +class Bass(ChordPitch): + + def step_class_name(self): + return u'bass-step' + + def alter_class_name(self): + return u'bass-alter' + + +class ChordModification(Music_xml_node): + + def get_type(self): + ch = self.get_maybe_exist_typed_child(get_class(u'degree-type')) + return {'add': 1, 'alter': 1, 'subtract':-1}.get(ch.get_text().strip(), 0) + + def get_value(self): + ch = self.get_maybe_exist_typed_child(get_class(u'degree-value')) + value = 0 + if ch: + value = int(ch.get_text().strip()) + return value + + def get_alter(self): + ch = self.get_maybe_exist_typed_child(get_class(u'degree-alter')) + return utilities.interpret_alter_element(ch) + + +class Frame(Music_xml_node): + + def get_frets(self): + return self.get_named_child_value_number('frame-frets', 4) + + def get_strings(self): + return self.get_named_child_value_number('frame-strings', 6) + + def get_first_fret(self): + return self.get_named_child_value_number('first-fret', 1) + + +class Frame_Note(Music_xml_node): + + def get_string(self): + return self.get_named_child_value_number('string', 1) + + def get_fret(self): + return self.get_named_child_value_number('fret', 0) + + def get_fingering(self): + return self.get_named_child_value_number('fingering', -1) + + def get_barre(self): + n = self.get_maybe_exist_named_child('barre') + if n: + return getattr(n, 'type', '') + else: + return '' + + class Musicxml_voice: - def __init__ (self): + + def __init__(self): self._elements = [] self._staves = {} self._start_staff = None self._lyrics = [] self._has_lyrics = False - def add_element (self, e): - self._elements.append (e) - if (isinstance (e, Note) - and e.get_maybe_exist_typed_child (Staff)): - name = e.get_maybe_exist_typed_child (Staff).get_text () + def add_element(self, e): + self._elements.append(e) + if(isinstance(e, Note) + and e.get_maybe_exist_typed_child(Staff)): + name = e.get_maybe_exist_typed_child(Staff).get_text() - if not self._start_staff and not e.get_maybe_exist_typed_child (Grace): + if not self._start_staff and not e.get_maybe_exist_typed_child(Grace): self._start_staff = name self._staves[name] = True - lyrics = e.get_typed_children (Lyric) + lyrics = e.get_typed_children(Lyric) if not self._has_lyrics: - self.has_lyrics = len (lyrics) > 0 + self.has_lyrics = len(lyrics) > 0 for l in lyrics: - nr = l.get_number() - if (nr > 0) and not (nr in self._lyrics): - self._lyrics.append (nr) + nr = l.number + if(nr > 0) and not(nr in self._lyrics): + self._lyrics.append(nr) - def insert (self, idx, e): - self._elements.insert (idx, e) + def insert(self, idx, e): + self._elements.insert(idx, e) - def get_lyrics_numbers (self): - if (len (self._lyrics) == 0) and self._has_lyrics: + def get_lyrics_numbers(self): + if(len(self._lyrics) == 0) and self._has_lyrics: #only happens if none of the tags has a number attribute return [1] else: return self._lyrics -def graces_to_aftergraces (pending_graces): - for gr in pending_graces: - gr._when = gr._prev_when - gr._measure_position = gr._prev_measure_position - gr._after_grace = True - +class Part(Music_xml_node): -class Part (Music_xml_node): - def __init__ (self): - Music_xml_node.__init__ (self) + def __init__(self): + Music_xml_node.__init__(self) self._voices = {} self._staff_attributes_dict = {} - def get_part_list (self): + def get_part_list(self): n = self while n and n.get_name() != 'score-partwise': n = n._parent - return n.get_named_child ('part-list') + return n.get_named_child('part-list') + + def graces_to_aftergraces(self, pending_graces): + for gr in pending_graces: + gr._when = gr._prev_when + gr._measure_position = gr._prev_measure_position + gr._after_grace = True - def interpret (self): + def interpret(self): """Set durations and starting points.""" """The starting point of the very first note is 0!""" - part_list = self.get_part_list () + part_list = self.get_part_list() - now = Rational (0) - factor = Rational (1) + now = Rational(0) + factor = Rational(1) attributes_dict = {} attributes_object = None - measures = self.get_typed_children (Measure) - last_moment = Rational (-1) - last_measure_position = Rational (-1) - measure_position = Rational (0) + measures = self.get_typed_children(Measure) + last_moment = Rational(-1) + last_measure_position = Rational(-1) + measure_position = Rational(0) measure_start_moment = now is_first_measure = True previous_measure = None @@ -637,14 +1300,14 @@ class Part (Music_xml_node): # implicit measures are used for artificial measures, e.g. when # a repeat bar line splits a bar into two halves. In this case, # don't reset the measure position to 0. They are also used for - # upbeats (initial value of 0 fits these, too). + # upbeats(initial value of 0 fits these, too). # Also, don't reset the measure position at the end of the loop, - # but rather when starting the next measure (since only then do we + # but rather when starting the next measure(since only then do we # know if the next measure is implicit and continues that measure) - if not m.is_implicit (): + if not m.is_implicit(): # Warn about possibly overfull measures and reset the position if attributes_object and previous_measure and previous_measure.partial == 0: - length = attributes_object.get_measure_length () + length = attributes_object.get_measure_length() new_now = measure_start_moment + length if now <> new_now: problem = 'incomplete' @@ -652,55 +1315,73 @@ class Part (Music_xml_node): problem = 'overfull' ## only for verbose operation. if problem <> 'incomplete' and previous_measure: - previous_measure.message ('%s measure? Expected: %s, Difference: %s' % (problem, now, new_now - now)) + previous_measure.message('%s measure? Expected: %s, Difference: %s' %(problem, now, new_now - now)) now = new_now measure_start_moment = now - measure_position = Rational (0) + measure_position = Rational(0) + voice_id = None; + assign_to_next_voice = [] for n in m.get_all_children (): + # assign a voice to all measure elements + if (n.get_name() == 'backup'): + voice_id = None; + + if isinstance(n, Measure_element): + if n.get_voice_id (): + voice_id = n.get_voice_id () + for i in assign_to_next_voice: + i.voice_id = voice_id + assign_to_next_voice = [] + else: + if voice_id: + n.voice_id = voice_id + else: + assign_to_next_voice.append (n) + # figured bass has a duration, but applies to the next note # and should not change the current measure position! - if isinstance (n, FiguredBass): - n._divisions = factor.denominator () + if isinstance(n, FiguredBass): + n._divisions = factor.denominator() n._when = now n._measure_position = measure_position continue - if isinstance (n, Hash_text): + if isinstance(n, Hash_text): continue - dur = Rational (0) + dur = Rational(0) if n.__class__ == Attributes: - n.set_attributes_from_previous (attributes_dict) - n.read_self () - attributes_dict = n._dict.copy () + n.set_attributes_from_previous(attributes_dict) + n.read_self() + attributes_dict = n._dict.copy() attributes_object = n - factor = Rational (1, - int (attributes_dict.get ('divisions').get_text ())) + factor = Rational(1, + int(attributes_dict.get('divisions').get_text())) - if (n.get_maybe_exist_typed_child (Duration)): - mxl_dur = n.get_maybe_exist_typed_child (Duration) - dur = mxl_dur.get_length () * factor + if(n.get_maybe_exist_typed_child(Duration)): + mxl_dur = n.get_maybe_exist_typed_child(Duration) + dur = mxl_dur.get_length() * factor if n.get_name() == 'backup': - dur = - dur + dur = -dur # reset all graces before the backup to after-graces: - graces_to_aftergraces (pending_graces) + self.graces_to_aftergraces(pending_graces) pending_graces = [] - if n.get_maybe_exist_typed_child (Grace): - dur = Rational (0) + if n.get_maybe_exist_typed_child(Grace): + dur = Rational(0) - rest = n.get_maybe_exist_typed_child (Rest) - if (rest + rest = n.get_maybe_exist_typed_child(Rest) + if(rest and attributes_object - and attributes_object.get_measure_length () == dur): + and attributes_object.get_measure_length() == dur): rest._is_whole_measure = True - if (dur > Rational (0) - and n.get_maybe_exist_typed_child (Chord)): + if(dur > Rational(0) + and n.get_maybe_exist_typed_child(Chord)): now = last_moment measure_position = last_measure_position @@ -709,27 +1390,27 @@ class Part (Music_xml_node): # For all grace notes, store the previous note, in case need # to turn the grace note into an after-grace later on! - if isinstance(n, Note) and n.is_grace (): + if isinstance(n, Note) and n.is_grace(): n._prev_when = last_moment n._prev_measure_position = last_measure_position # After-graces are placed at the same position as the previous note - if isinstance(n, Note) and n.is_after_grace (): + if isinstance(n, Note) and n.is_after_grace(): # TODO: We should do the same for grace notes at the end of # a measure with no following note!!! n._when = last_moment n._measure_position = last_measure_position - elif isinstance(n, Note) and n.is_grace (): - pending_graces.append (n) - elif (dur > Rational (0)): + elif isinstance(n, Note) and n.is_grace(): + pending_graces.append(n) + elif(dur > Rational(0)): pending_graces = []; n._duration = dur - if dur > Rational (0): + if dur > Rational(0): last_moment = now last_measure_position = measure_position now += dur measure_position += dur - elif dur < Rational (0): + elif dur < Rational(0): # backup element, reset measure position now += dur measure_position += dur @@ -740,430 +1421,292 @@ class Part (Music_xml_node): last_moment = now last_measure_position = measure_position if n._name == 'note': - instrument = n.get_maybe_exist_named_child ('instrument') + instrument = n.get_maybe_exist_named_child('instrument') if instrument: - n.instrument_name = part_list.get_instrument (instrument.id) + n.instrument_name = part_list.get_instrument(instrument.id) # reset all graces at the end of the measure to after-graces: - graces_to_aftergraces (pending_graces) + self.graces_to_aftergraces(pending_graces) pending_graces = [] # Incomplete first measures are not padded, but registered as partial if is_first_measure: is_first_measure = False # upbeats are marked as implicit measures - if attributes_object and m.is_implicit (): - length = attributes_object.get_measure_length () + if attributes_object and m.is_implicit(): + length = attributes_object.get_measure_length() measure_end = measure_start_moment + length if measure_end <> now: m.partial = now previous_measure = m # modify attributes so that only those applying to the given staff remain - def extract_attributes_for_staff (part, attr, staff): - attributes = copy.copy (attr) + def extract_attributes_for_staff(part, attr, staff): + attributes = copy.copy(attr) attributes._children = []; - attributes._dict = attr._dict.copy () + attributes._dict = attr._dict.copy() attributes._original_tag = attr # copy only the relevant children over for the given staff if staff == "None": staff = "1" for c in attr._children: - if (not (hasattr (c, 'number') and (c.number != staff)) and - not (isinstance (c, Hash_text))): - attributes._children.append (c) + if(not(hasattr(c, 'number') and(c.number != staff)) and + not(isinstance(c, Hash_text))): + attributes._children.append(c) if not attributes._children: return None else: return attributes - def extract_voices (part): + def extract_voices(part): + # The last indentified voice + last_voice = None + voices = {} - measures = part.get_typed_children (Measure) + measures = part.get_typed_children(Measure) elements = [] for m in measures: if m.partial > 0: - elements.append (Partial (m.partial)) - elements.extend (m.get_all_children ()) + elements.append(Partial(m.partial)) + elements.extend(m.get_all_children()) # make sure we know all voices already so that dynamics, clefs, etc. # can be assigned to the correct voices voice_to_staff_dict = {} for n in elements: - voice_id = n.get_maybe_exist_named_child (u'voice') + voice_id = n.get_maybe_exist_named_child(u'voice') vid = None if voice_id: - vid = voice_id.get_text () - elif isinstance (n, Note): + vid = voice_id.get_text() + elif isinstance(n, Note): # TODO: Check whether we shall really use "None" here, or # rather use "1" as the default? - vid = "None" + if n.get_maybe_exist_named_child(u'chord'): + vid = last_voice + else: + vid = "1" + + if(vid != None): + last_voice = vid - staff_id = n.get_maybe_exist_named_child (u'staff') + staff_id = n.get_maybe_exist_named_child(u'staff') sid = None if staff_id: - sid = staff_id.get_text () + sid = staff_id.get_text() else: # TODO: Check whether we shall really use "None" here, or # rather use "1" as the default? # If this is changed, need to change the corresponding # check in extract_attributes_for_staff, too. sid = "None" - if vid and not voices.has_key (vid): + if vid and not voices.has_key(vid): voices[vid] = Musicxml_voice() - if vid and sid and not n.get_maybe_exist_typed_child (Grace): - if not voice_to_staff_dict.has_key (vid): + if vid and sid and not n.get_maybe_exist_typed_child(Grace): + if not voice_to_staff_dict.has_key(vid): voice_to_staff_dict[vid] = sid - # invert the voice_to_staff_dict into a staff_to_voice_dict (since we + + # invert the voice_to_staff_dict into a staff_to_voice_dict(since we # need to assign staff-assigned objects like clefs, times, etc. to # all the correct voices. This will never work entirely correct due # to staff-switches, but that's the best we can do! staff_to_voice_dict = {} - for (v,s) in voice_to_staff_dict.items (): - if not staff_to_voice_dict.has_key (s): + for(v, s) in voice_to_staff_dict.items(): + if not staff_to_voice_dict.has_key(s): staff_to_voice_dict[s] = [v] else: - staff_to_voice_dict[s].append (v) - + staff_to_voice_dict[s].append(v) start_attr = None assign_to_next_note = [] id = None for n in elements: - voice_id = n.get_maybe_exist_typed_child (get_class ('voice')) + voice_id = n.get_maybe_exist_typed_child(get_class('voice')) if voice_id: - id = voice_id.get_text () + id = voice_id.get_text() else: - id = "None" + if n.get_maybe_exist_typed_child(get_class('chord')): + id = last_voice + else: + id = "1" + + if(id != "None"): + last_voice = id # We don't need backup/forward any more, since we have already # assigned the correct onset times. # TODO: Let Grouping through. Also: link, print, bokmark sound - if not (isinstance (n, Note) or isinstance (n, Attributes) or - isinstance (n, Direction) or isinstance (n, Partial) or - isinstance (n, Barline) or isinstance (n, Harmony) or - isinstance (n, FiguredBass) or isinstance (n, Print)): + if not(isinstance(n, Note) or isinstance(n, Attributes) or + isinstance(n, Direction) or isinstance(n, Partial) or + isinstance(n, Barline) or isinstance(n, Harmony) or + isinstance(n, FiguredBass) or isinstance(n, Print)): continue - if isinstance (n, Attributes) and not start_attr: + if isinstance(n, Attributes) and not start_attr: start_attr = n continue - if isinstance (n, Attributes): + if isinstance(n, Attributes): # assign these only to the voices they really belong to! - for (s, vids) in staff_to_voice_dict.items (): - staff_attributes = part.extract_attributes_for_staff (n, s) + for(s, vids) in staff_to_voice_dict.items(): + staff_attributes = part.extract_attributes_for_staff(n, s) if staff_attributes: for v in vids: - voices[v].add_element (staff_attributes) + voices[v].add_element(staff_attributes) continue - if isinstance (n, Partial) or isinstance (n, Barline) or isinstance (n, Print): - for v in voices.keys (): - voices[v].add_element (n) + if isinstance(n, Partial) or isinstance(n, Barline) or isinstance(n, Print): + for v in voices.keys(): + voices[v].add_element(n) continue - if isinstance (n, Direction): - staff_id = n.get_maybe_exist_named_child (u'staff') - if staff_id: - staff_id = staff_id.get_text () - if staff_id: - dir_voices = staff_to_voice_dict.get (staff_id, voices.keys ()) + if isinstance(n, Direction): + if (n.voice_id): + voices[n.voice_id].add_element (n) else: - dir_voices = voices.keys () - for v in dir_voices: - voices[v].add_element (n) + assign_to_next_note.append (n) continue - if isinstance (n, Harmony) or isinstance (n, FiguredBass): + if isinstance(n, Harmony) or isinstance(n, FiguredBass): # store the harmony or figured bass element until we encounter # the next note and assign it only to that one voice. - assign_to_next_note.append (n) + assign_to_next_note.append(n) continue - if hasattr (n, 'print-object') and getattr (n, 'print-object') == "no": + if hasattr(n, 'print-object') and getattr(n, 'print-object') == "no": #Skip this note. pass else: for i in assign_to_next_note: - voices[id].add_element (i) + voices[id].add_element(i) assign_to_next_note = [] - voices[id].add_element (n) + voices[id].add_element(n) # Assign all remaining elements from assign_to_next_note to the voice # of the previous note: for i in assign_to_next_note: - voices[id].add_element (i) + voices[id].add_element(i) assign_to_next_note = [] if start_attr: - for (s, vids) in staff_to_voice_dict.items (): - staff_attributes = part.extract_attributes_for_staff (start_attr, s) - staff_attributes.read_self () + for(s, vids) in staff_to_voice_dict.items(): + staff_attributes = part.extract_attributes_for_staff(start_attr, s) + staff_attributes.read_self() part._staff_attributes_dict[s] = staff_attributes for v in vids: - voices[v].insert (0, staff_attributes) + voices[v].insert(0, staff_attributes) voices[v]._elements[0].read_self() part._voices = voices - def get_voices (self): + def get_voices(self): return self._voices - def get_staff_attributes (self): - return self._staff_attributes_dict - -class Notations (Music_xml_node): - def get_tie (self): - ts = self.get_named_children ('tied') - starts = [t for t in ts if t.type == 'start'] - if starts: - return starts[0] - else: - return None - - def get_tuplets (self): - return self.get_typed_children (Tuplet) -class Time_modification(Music_xml_node): - def get_fraction (self): - b = self.get_maybe_exist_named_child ('actual-notes') - a = self.get_maybe_exist_named_child ('normal-notes') - return (int(a.get_text ()), int (b.get_text ())) - - def get_normal_type (self): - tuplet_type = self.get_maybe_exist_named_child ('normal-type') - if tuplet_type: - dots = self.get_named_children ('normal-dot') - log = musicxml_duration_to_log (tuplet_type.get_text ().strip ()) - return (log , len (dots)) - else: - return None - - -class Accidental (Music_xml_node): - def __init__ (self): - Music_xml_node.__init__ (self) - self.editorial = False - self.cautionary = False + def get_staff_attributes(self): + return self._staff_attributes_dict -class Music_xml_spanner (Music_xml_node): - def get_type (self): - if hasattr (self, 'type'): - return self.type - else: - return 0 - def get_size (self): - if hasattr (self, 'size'): - return string.atoi (self.size) - else: - return 0 -class Wedge (Music_xml_spanner): +class BarStyle(Music_xml_node): pass -class Tuplet (Music_xml_spanner): - def duration_info_from_tuplet_note (self, tuplet_note): - tuplet_type = tuplet_note.get_maybe_exist_named_child ('tuplet-type') - if tuplet_type: - dots = tuplet_note.get_named_children ('tuplet-dot') - log = musicxml_duration_to_log (tuplet_type.get_text ().strip ()) - return (log, len (dots)) - else: - return None - - # Return tuplet note type as (log, dots) - def get_normal_type (self): - tuplet = self.get_maybe_exist_named_child ('tuplet-normal') - if tuplet: - return self.duration_info_from_tuplet_note (tuplet) - else: - return None +class BeatType(Music_xml_node): + pass - def get_actual_type (self): - tuplet = self.get_maybe_exist_named_child ('tuplet-actual') - if tuplet: - return self.duration_info_from_tuplet_note (tuplet) - else: - return None +class BeatUnit(Music_xml_node): + pass - def get_tuplet_note_count (self, tuplet_note): - if tuplet_note: - tuplet_nr = tuplet_note.get_maybe_exist_named_child ('tuplet-number') - if tuplet_nr: - return int (tuplet_nr.get_text ()) - return None - def get_normal_nr (self): - return self.get_tuplet_note_count (self.get_maybe_exist_named_child ('tuplet-normal')) - def get_actual_nr (self): - return self.get_tuplet_note_count (self.get_maybe_exist_named_child ('tuplet-actual')) +class BeatUnitDot(Music_xml_node): + pass -class Bracket (Music_xml_spanner): +class Beats(Music_xml_node): pass -class Dashes (Music_xml_spanner): +class Bracket(Music_xml_spanner): pass -class Slur (Music_xml_spanner): - def get_type (self): - return self.type +class Chord(Music_xml_node): + pass -class Beam (Music_xml_spanner): - def get_type (self): - return self.get_text () - def is_primary (self): - if hasattr (self, 'number'): - return self.number == "1" - else: - return True +class Dashes(Music_xml_spanner): + pass -class Wavy_line (Music_xml_spanner): +class DirType(Music_xml_node): pass -class Pedal (Music_xml_spanner): +class Direction(Measure_element): pass -class Glissando (Music_xml_spanner): +class Dot(Music_xml_node): pass -class Slide (Music_xml_spanner): +class Elision(Music_xml_node): pass -class Octave_shift (Music_xml_spanner): - # default is 8 for the octave-shift! - def get_size (self): - if hasattr (self, 'size'): - return string.atoi (self.size) - else: - return 8 +class Extend(Music_xml_node): + pass -class Chord (Music_xml_node): +class FiguredBass(Music_xml_node): pass -class Dot (Music_xml_node): +class Glissando(Music_xml_spanner): pass -# Rests in MusicXML are blocks with a inside. This class is only -# for the inner element, not the whole rest block. -class Rest (Music_xml_node): - def __init__ (self): - Music_xml_node.__init__ (self) - self._is_whole_measure = False - def is_whole_measure (self): - return self._is_whole_measure - def get_step (self): - ch = self.get_maybe_exist_typed_child (get_class (u'display-step')) - if ch: - return ch.get_text ().strip () - else: - return None - def get_octave (self): - ch = self.get_maybe_exist_typed_child (get_class (u'display-octave')) - if ch: - oct = ch.get_text ().strip () - return int (oct) - else: - return None +class Grace(Music_xml_node): + pass -class Type (Music_xml_node): +class Harmony(Music_xml_node): pass -class Grace (Music_xml_node): + +class Hash_comment(Music_xml_node): pass -class Staff (Music_xml_node): + +class KeyAlter(Music_xml_node): pass -class Direction (Music_xml_node): +class Direction (Measure_element): pass -class DirType (Music_xml_node): + +class KeyOctave(Music_xml_node): pass -class Bend (Music_xml_node): - def bend_alter (self): - alter = self.get_maybe_exist_named_child ('bend-alter') - return interpret_alter_element (alter) +class KeyStep(Music_xml_node): + pass -class Words (Music_xml_node): +class Part_group(Music_xml_node): pass -class Harmony (Music_xml_node): +class Pedal(Music_xml_spanner): pass -class ChordPitch (Music_xml_node): - def step_class_name (self): - return u'root-step' - def alter_class_name (self): - return u'root-alter' - def get_step (self): - ch = self.get_unique_typed_child (get_class (self.step_class_name ())) - return ch.get_text ().strip () - def get_alteration (self): - ch = self.get_maybe_exist_typed_child (get_class (self.alter_class_name ())) - return interpret_alter_element (ch) - -class Root (ChordPitch): +class PerMinute(Music_xml_node): pass -class Bass (ChordPitch): - def step_class_name (self): - return u'bass-step' - def alter_class_name (self): - return u'bass-alter' +class Print(Music_xml_node): + pass -class ChordModification (Music_xml_node): - def get_type (self): - ch = self.get_maybe_exist_typed_child (get_class (u'degree-type')) - return {'add': 1, 'alter': 1, 'subtract': -1}.get (ch.get_text ().strip (), 0) - def get_value (self): - ch = self.get_maybe_exist_typed_child (get_class (u'degree-value')) - value = 0 - if ch: - value = int (ch.get_text ().strip ()) - return value - def get_alter (self): - ch = self.get_maybe_exist_typed_child (get_class (u'degree-alter')) - return interpret_alter_element (ch) - - -class Frame (Music_xml_node): - def get_frets (self): - return self.get_named_child_value_number ('frame-frets', 4) - def get_strings (self): - return self.get_named_child_value_number ('frame-strings', 6) - def get_first_fret (self): - return self.get_named_child_value_number ('first-fret', 1) - -class Frame_Note (Music_xml_node): - def get_string (self): - return self.get_named_child_value_number ('string', 1) - def get_fret (self): - return self.get_named_child_value_number ('fret', 0) - def get_fingering (self): - return self.get_named_child_value_number ('fingering', -1) - def get_barre (self): - n = self.get_maybe_exist_named_child ('barre') - if n: - return getattr (n, 'type', '') - else: - return '' +class Root(ChordPitch): + pass -class FiguredBass (Music_xml_node): +class Score_part(Music_xml_node): pass -class Beats (Music_xml_node): +class Slide(Music_xml_spanner): pass -class BeatType (Music_xml_node): +class Staff(Music_xml_node): pass -class BeatUnit (Music_xml_node): +class Text(Music_xml_node): pass -class BeatUnitDot (Music_xml_node): +class Type(Music_xml_node): pass -class PerMinute (Music_xml_node): +class Wavy_line(Music_xml_spanner): pass -class Print (Music_xml_node): +class Wedge(Music_xml_spanner): pass +class Words(Music_xml_node): + pass ## need this, not all classes are instantiated @@ -1185,6 +1728,7 @@ class_dict = { 'bend' : Bend, 'bracket' : Bracket, 'chord': Chord, + 'credit': Credit, 'dashes' : Dashes, 'degree' : ChordModification, 'dot': Dot, @@ -1207,9 +1751,10 @@ class_dict = { 'measure': Measure, 'notations': Notations, 'note': Note, + 'notehead': Notehead, 'octave-shift': Octave_shift, 'part': Part, - 'part-group': Part_group, + 'part-group': Part_group, 'part-list': Part_list, 'pedal': Pedal, 'per-minute': PerMinute, @@ -1220,10 +1765,13 @@ class_dict = { 'score-part': Score_part, 'slide': Slide, 'slur': Slur, + 'sound': Sound, 'staff': Staff, + 'stem': Stem, 'syllabic': Syllabic, 'text': Text, 'time-modification': Time_modification, + 'tied': Tied, 'tuplet': Tuplet, 'type': Type, 'unpitched': Unpitched, @@ -1233,59 +1781,59 @@ class_dict = { 'work': Work, } -def name2class_name (name): - name = name.replace ('-', '_') - name = name.replace ('#', 'hash_') +def name2class_name(name): + name = name.replace('-', '_') + name = name.replace('#', 'hash_') name = name[0].upper() + name[1:].lower() - return str (name) + return str(name) -def get_class (name): - classname = class_dict.get (name) +def get_class(name): + classname = class_dict.get(name) if classname: return classname else: - class_name = name2class_name (name) - klass = new.classobj (class_name, (Music_xml_node,) , {}) + class_name = name2class_name(name) + klass = new.classobj(class_name,(Music_xml_node,) , {}) class_dict[name] = klass return klass -def lxml_demarshal_node (node): +def lxml_demarshal_node(node): name = node.tag # Ignore comment nodes, which are also returned by the etree parser! if name is None or node.__class__.__name__ == "_Comment": return None - klass = get_class (name) + klass = get_class(name) py_node = klass() py_node._original = node py_node._name = name py_node._data = node.text - py_node._children = [lxml_demarshal_node (cn) for cn in node.getchildren()] - py_node._children = filter (lambda x: x, py_node._children) + py_node._children = [lxml_demarshal_node(cn) for cn in node.getchildren()] + py_node._children = filter(lambda x: x, py_node._children) for c in py_node._children: c._parent = py_node - for (k, v) in node.items (): + for(k, v) in node.items(): py_node.__dict__[k] = v py_node._attribute_dict[k] = v return py_node -def minidom_demarshal_node (node): +def minidom_demarshal_node(node): name = node.nodeName - klass = get_class (name) - py_node = klass () + klass = get_class(name) + py_node = klass() py_node._name = name - py_node._children = [minidom_demarshal_node (cn) for cn in node.childNodes] + py_node._children = [minidom_demarshal_node(cn) for cn in node.childNodes] for c in py_node._children: c._parent = py_node if node.attributes: - for (nm, value) in node.attributes.items (): + for(nm, value) in node.attributes.items(): py_node.__dict__[nm] = value py_node._attribute_dict[nm] = value @@ -1297,11 +1845,11 @@ def minidom_demarshal_node (node): return py_node -if __name__ == '__main__': +if __name__ == '__main__': import lxml.etree - tree = lxml.etree.parse ('beethoven.xml') - mxl_tree = lxml_demarshal_node (tree.getroot ()) - ks = class_dict.keys () - ks.sort () - print '\n'.join (ks) + tree = lxml.etree.parse('beethoven.xml') + mxl_tree = lxml_demarshal_node(tree.getroot()) + ks = class_dict.keys() + ks.sort() + print '\n'.join(ks) diff --git a/python/musicxml2ly_conversion.py b/python/musicxml2ly_conversion.py new file mode 100644 index 0000000000..67df2add83 --- /dev/null +++ b/python/musicxml2ly_conversion.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from rational import * +import lilylib as ly +import musicexp +_ = ly._ + +def rational_to_lily_duration(rational_len): + d = musicexp.Duration() + + rational_len.normalize_self() + d_log = {1: 0, 2: 1, 4:2, 8:3, 16:4, 32:5, 64:6, 128:7, 256:8, 512:9}.get(rational_len.denominator(), -1) + + # Duration of the form 1/2^n or 3/2^n can be converted to a simple lilypond duration + dots = {1: 0, 3: 1, 7: 2, 15: 3, 31: 4, 63: 5, 127: 6}.get(rational_len.numerator(), -1) + if(d_log >= dots >= 0): + # account for the dots! + d.duration_log = d_log - dots + d.dots = dots + elif(d_log >= 0): + d.duration_log = d_log + d.factor = Rational(rational_len.numerator()) + else: + ly.warning(_("Encountered rational duration with denominator %s, " + "unable to convert to lilypond duration") % + rational_len.denominator()) + # TODO: Test the above error message + return None + + return d + +def musicxml_step_to_lily(step): + if step: + return (ord(step) - ord('A') + 7 - 2) % 7 + else: + return None + +class Marker(musicexp.Music): + def __init__(self): + self.direction = 0 + self.event = None + def print_ly(self, printer): + ly.warning(_("Encountered unprocessed marker %s\n") % self) + pass + def ly_expression(self): + return "" + +class RepeatMarker(Marker): + def __init__(self): + Marker.__init__(self) + self.times = 0 + +class EndingMarker(Marker): + pass diff --git a/python/utilities.py b/python/utilities.py new file mode 100644 index 0000000000..da2386bcde --- /dev/null +++ b/python/utilities.py @@ -0,0 +1,268 @@ +# -*- coding: utf-8 -*- +import re +import string + +def string_to_number(s): + try: + return int(s) + except ValueError: + return float(s) + +def string_to_integer(s): + num = string_to_number(s) + if isinstance(num, int): + return num + else: + return int(num) + +def escape_ly_output_string (input_string): + return_string = input_string + needs_quotes = not re.match (u"^[a-zA-ZäöüÜÄÖßñ]*$", return_string); + if needs_quotes: + return_string = "\"" + string.replace (return_string, "\"", "\\\"") + "\"" + return return_string + +def interpret_alter_element (alter_elm): + alter = 0 + if alter_elm: + val = eval(alter_elm.get_text ()) + if type (val) in (int, float): + alter = val + return alter + +def musicxml_duration_to_log (dur): + return {'256th': 8, + '128th': 7, + '64th': 6, + '32nd': 5, + '16th': 4, + 'eighth': 3, + 'quarter': 2, + 'half': 1, + 'whole': 0, + 'breve':-1, + 'longa':-2, + 'long':-2}.get (dur, 0) + +def hexcolorval_to_nr (hex_val): + try: + v = int (hex_val, 16) + if v == 255: + v = 256 + return v / 256. + except ValueError: + return 0. + +def hex_to_color(hex_val): + res = re.match ( + r'#([0-9a-f][0-9a-f]|)([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$', + hex_val, + re.IGNORECASE) + if res: + return map(lambda x: hexcolorval_to_nr (x), res.group (2, 3, 4)) + else: + return None + +def split_string_and_preserve_doublequoted_substrings(value): + import shlex + lex = shlex.shlex(value) + lex.quotes = '"' + lex.whitespace_split = True + lex.commenters = '' + return list(lex) + +def musicxml_sound_to_lilypond_midi_instrument(sound): + sounds = { + "brass.french-horn": 'french horn', + "brass.group": 'brass section', + "brass.group.synth": 'synthbrass 1', + "brass.trombone": 'trombone', + "brass.trombone.alto": 'trombone', + "brass.trombone.bass": 'trombone', + "brass.trombone.contrabass": 'trombone', + "brass.trombone.tenor": 'trombone', + "brass.trumpet": 'trumpet', + "brass.trumpet.baroque": 'trumpet', + "brass.trumpet.bass": 'trumpet', + "brass.trumpet.bflat": 'trumpet', + "brass.trumpet.c": 'trumpet', + "brass.trumpet.d": 'trumpet', + "brass.trumpet.piccolo": 'trumpet', + "brass.trumpet.pocket": 'trumpet', + "brass.trumpet.slide": 'trumpet', + "brass.trumpet.tenor": 'trumpet', + "brass.tuba": 'tuba', + "brass.tuba.bass": 'tuba', + "brass.tuba.subcontrabass": 'tuba', + "brass.wagner-tuba": 'french horn', + "drum.timpani": 'timpani', + "drum.tom-tom": 'melodic tom', + "drum.tom-tom.synth": 'synth drum', + "effect.applause": 'applause', + "effect.bass-string-slap": 'slap bass 1', + "effect.bird": 'bird tweet', + "effect.bird.tweet": 'bird tweet', + "effect.breath": 'breath noise', + "effect.guitar-fret": 'guitar fret noise', + "effect.gunshot": 'gunshot', + "effect.helicopter": 'helicopter', + "effect.metronome-click": 'woodblock', + "effect.rain": 'fx1 (rain)', + "effect.seashore": 'seashore', + "effect.telephone-ring": 'telephone ring', + "keyboard.accordion": 'accordion', + "keyboard.bandoneon": 'accordion', + "keyboard.celesta": 'celesta', + "keyboard.clavichord": 'clav', + "keyboard.concertina": 'concertina', + "keyboard.harpsichord": 'harpsichord', + "keyboard.ondes-martenot": 'ocarina', + "keyboard.organ": 'church organ', + "keyboard.organ.drawbar": 'drawbar organ', + "keyboard.organ.percussive": 'percussive organ', + "keyboard.organ.pipe": 'church organ', + "keyboard.organ.reed": 'reed organ', + "keyboard.piano": 'acoustic grand', + "keyboard.piano.electric": 'electric piano 1', + "keyboard.piano.grand": 'acoustic grand', + "keyboard.piano.honky-tonk": 'honky-tonk', + "metal.bells.agogo": 'agogo', + "metal.bells.tinklebell": 'tinkle bell', + "metal.cymbal.reverse": 'reverse cymbal', + "pitched-percussion.glockenspiel": 'glockenspiel', + "pitched-percussion.glockenspiel.alto": 'glockenspiel', + "pitched-percussion.glockenspiel.soprano": 'glockenspiel', + "pitched-percussion.hammer-dulcimer": 'dulcimer', + "pitched-percussion.kalimba": 'kalimba', + "pitched-percussion.marimba": 'marimba', + "pitched-percussion.marimba.bass": 'marimba', + "pitched-percussion.music-box": 'music box', + "pitched-percussion.tubular-bells": 'tubular bells', + "pitched-percussion.vibraphone": 'vibraphone', + "pitched-percussion.xylophone": 'xylophone', + "pitched-percussion.xylophone.alto": 'xylophone', + "pitched-percussion.xylophone.bass": 'xylophone', + "pitched-percussion.xylophone.soprano": 'xylophone', + "pitched-percussion.xylorimba": 'xylophone', + "pluck.banjo": 'banjo', + "pluck.banjo.tenor": 'banjo', + "pluck.bass": 'acoustic bass', + "pluck.bass.acoustic": 'acoustic bass', + "pluck.bass.electric": 'electric bass', + "pluck.bass.fretless": 'fretless bass', + "pluck.bass.synth": 'synth bass 1', + "pluck.dulcimer": 'dulcimer', + "pluck.guitar": 'acoustic guitar (nylon)', + "pluck.guitar.acoustic": 'acoustic guitar (nylon)', + "pluck.guitar.electric": 'electric guitar (jazz)', + "pluck.guitar.nylon-string": 'acoustic guitar (nylon)', + "pluck.guitar.steel-string": 'acoustic guitar (steel)', + "pluck.harp": 'orchestral harp', + "pluck.lute": 'acoustic guitar (nylon)', + "pluck.shamisen": 'shamisen', + "pluck.sitar": 'sitar', + "strings.cello": 'cello', + "strings.cello.piccolo": 'cello', + "strings.contrabass": 'contrabass', + "strings.fiddle": 'fiddle', + "strings.group.synth": 'synth strings 1', + "strings.viola": 'viola', + "strings.violin": 'violin', + "synth.effects.atmosphere": 'fx 4 (atmosphere)', + "synth.effects.brightness": 'fx 5 (brightness)', + "synth.effects.crystal": 'fx 3 (crystal)', + "synth.effects.echoes": 'fx 7 echoes', + "synth.effects.goblins": 'fx 6 goblins', + "synth.effects.rain": 'fx 1 rain', + "synth.effects.sci-fi": 'fx 8 sci-fi', + "synth.effects.soundtrack": 'fx 2 (soundtrack)', + "synth.pad.bowed": 'pad 5 bowed', + "synth.pad.choir": 'pad 4 choir', + "synth.pad.halo": 'pad 7 halo', + "synth.pad.metallic": 'pad 6 metallic', + "synth.pad.polysynth": 'pad 3 polysynth', + "synth.pad.sweep": 'pad 8 sweep', + "synth.pad.warm": 'pad 2 warm', + "synth.tone.sawtooth": 'lead 1 (square)', + "synth.tone.square": 'lead 2 (sawtooth)', + "voice.aa": 'choir aahs', + "voice.alto": 'choir aahs', + "voice.aw": 'choir aahs', + "voice.baritone": 'choir aahs', + "voice.bass": 'choir aahs', + "voice.child": 'choir aahs', + "voice.countertenor": 'choir aahs', + "voice.doo": 'choir aahs', + "voice.ee": 'choir aahs', + "voice.female": 'choir aahs', + "voice.kazoo": 'choir aahs', + "voice.male": 'choir aahs', + "voice.mezzo-soprano": 'choir aahs', + "voice.mm": 'choir aahs', + "voice.oo": 'voice oohs', + "voice.soprano": 'choir aahs', + "voice.synth": 'synth voice', + "wind.flutes.blown-bottle": 'blown bottle', + "wind.flutes.calliope": 'lead 3 (calliope)', + "wind.flutes.flute": 'flute', + "wind.flutes.flute.alto": 'flute', + "wind.flutes.flute.bass": 'flute', + "wind.flutes.flute.contra-alto": 'flute', + "wind.flutes.flute.contrabass": 'flute', + "wind.flutes.flute.double-contrabass": 'flute', + "wind.flutes.flute.piccolo": 'flute', + "wind.flutes.flute.subcontrabass": 'flute', + "wind.flutes.ocarina": 'ocarina', + "wind.flutes.recorder": 'recorder', + "wind.flutes.recorder.alto": 'recorder', + "wind.flutes.recorder.bass": 'recorder', + "wind.flutes.recorder.contrabass": 'recorder', + "wind.flutes.recorder.descant": 'recorder', + "wind.flutes.recorder.garklein": 'recorder', + "wind.flutes.recorder.great-bass": 'recorder', + "wind.flutes.recorder.sopranino": 'recorder', + "wind.flutes.recorder.soprano": 'recorder', + "wind.flutes.recorder.tenor": 'recorder', + "wind.flutes.shakuhachi": 'shakuhachi', + "wind.flutes.whistle": 'whistle', + "wind.flutes.whistle.alto": 'whistle', + "wind.pipes.bagpipes": 'bagpipe', + "wind.reed.basset-horn": 'clarinet', + "wind.reed.bassoon": 'bassoon', + "wind.reed.clarinet": 'clarinet', + "wind.reed.clarinet.a": 'clarinet', + "wind.reed.clarinet.alto": 'clarinet', + "wind.reed.clarinet.bass": 'clarinet', + "wind.reed.clarinet.basset": 'clarinet', + "wind.reed.clarinet.bflat": 'clarinet', + "wind.reed.clarinet.contra-alto": 'clarinet', + "wind.reed.clarinet.contrabass": 'clarinet', + "wind.reed.clarinet.eflat": 'clarinet', + "wind.reed.clarinet.piccolo.aflat": 'clarinet', + "wind.reed.contrabass": 'contrabass', + "wind.reed.contrabassoon": 'bassoon', + "wind.reed.english-horn": 'oboe', + "wind.reed.harmonica": 'harmonica', + "wind.reed.harmonica.bass": 'harmonica', + "wind.reed.oboe": 'oboe', + "wind.reed.oboe.bass": 'oboe', + "wind.reed.oboe.piccolo": 'oboe', + "wind.reed.oboe-da-caccia": 'oboe', + "wind.reed.oboe-damore": 'oboe', + "wind.reed.saxophone": 'alto sax', + "wind.reed.saxophone.alto": 'alto sax', + "wind.reed.saxophone.baritone": 'baritone sax', + "wind.reed.saxophone.bass": 'baritone sax', + "wind.reed.saxophone.contrabass": 'baritone sax', + "wind.reed.saxophone.melody": 'soprano sax', + "wind.reed.saxophone.mezzo-soprano": 'soprano sax', + "wind.reed.saxophone.sopranino": 'soprano sax', + "wind.reed.saxophone.sopranissimo": 'soprano sax', + "wind.reed.saxophone.soprano": 'soprano, sax', + "wind.reed.saxophone.subcontrabass": 'baritone sax', + "wind.reed.saxophone.tenor": 'tenor sax', + "wind.reed.shenai": 'shanai', + "wood.temple-block": 'wood block', + "wood.wood-block": 'wood block', + } + return sounds.get(sound, 'acoustic grand') diff --git a/scm/accreg.scm b/scm/accreg.scm index eba1bb4733..6aea74c661 100644 --- a/scm/accreg.scm +++ b/scm/accreg.scm @@ -55,7 +55,7 @@ for examples." (ly:assoc-get 'reedbanks register)))))))) (define-public ,set-symbol - (define-music-function (parser position register) + (define-music-function (register) (string?) ,(format #f "Equivalent to @code{<>^\\markup \\~a@var{REGISTER}}." set-symbol) @@ -66,7 +66,7 @@ for examples." 'direction 1 'text - (markup ,(symbol->keyword set-symbol) register)))))))) + (,(string->symbol (format #f "make-~a-markup" set-symbol)) register)))))))) (define-register-set discant diff --git a/scm/auto-beam.scm b/scm/auto-beam.scm index 14e0209675..9ba08705ef 100644 --- a/scm/auto-beam.scm +++ b/scm/auto-beam.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2000--2015 Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -38,83 +38,126 @@ (let ((value (ly:context-property context name))) (if (not (null? value)) value default))) - (define (beamingmoment (car a)) - (fraction->moment (car b)))) + (define (ending-moments group-list base-length) + (let ((beat 0)) + (map-in-order (lambda (x) + (set! beat (+ beat x)) + (* base-length beat)) + group-list))) - (define (ending-moments group-list start-beat base-moment) - (if (null? group-list) - '() - (let ((new-start (+ start-beat (car group-list)))) - (cons (ly:moment-mul (ly:make-moment new-start 1) base-moment) - (ending-moments (cdr group-list) new-start base-moment))))) + (define (larger-setting type sorted-alist) + (assoc type sorted-alist <=)) - (define (larger-setting test-beam sorted-alist) - (if (null? sorted-alist) - '() - (let* ((first-key (caar sorted-alist)) - (first-moment (fraction->moment first-key))) - (if (moment<=? test-beam first-moment) - (car sorted-alist) - (larger-setting test-beam (cdr sorted-alist)))))) - - (define (beat-end? moment beat-structure) - (pair? (member moment beat-structure))) ;; member returns a list if found, not #t + (define (beat-end? moment beat-endings) + (pair? (memv moment beat-endings))) ;; member returns a list if found, not #t ;; Start of actual auto-beam test routine ;; ;; ;; Don't start auto beams on grace notes - (if (and (!= (ly:moment-grace-numerator (ly:context-now context)) 0) - (= dir START)) - #f - (let* ((base-moment (get 'baseMoment (ly:make-moment 1 4))) - (measure-length (get 'measureLength (ly:make-moment 1 1))) + (and (or (zero? (ly:moment-grace (ly:context-now context))) + (!= dir START)) + (let* ((base-length (cond ((get 'baseMoment #f) => ly:moment-main) + (else 1/4))) + (measure-length (cond ((get 'measureLength #f) => ly:moment-main) + (else 1))) (time-signature-fraction (get 'timeSignatureFraction '(4 . 4))) (beat-structure (get 'beatStructure '(1 1 1 1))) - (beat-endings (ending-moments beat-structure 0 base-moment)) - (exceptions (sort (assoc-get 'end - (get 'beamExceptions '()) - '()) - beamingfraction test-beam)) - (non-grace (ly:make-moment - (ly:moment-main-numerator measure-pos) - (ly:moment-main-denominator measure-pos))) - (pos (if (ly:momentmoment default-beat-length) - test-beam)) - (exception-moments (ending-moments - exception-grouping 0 grouping-moment))) + default-beat-length + type)) + (exception-moments (and exception-grouping + (ending-moments + exception-grouping grouping-moment)))) (if (= dir START) ;; Start rules -- #t if beam is allowed to start (or beam-half-measure ;; Start anywhere, but option for mid-measure - (not (equal? (ly:moment-add pos pos) measure-length)) + (not (= (+ pos pos) measure-length)) (not (= 3 (car time-signature-fraction))) ;; in triple meter - (not (= (cdr type) ;; when the beamed note is 1/6 of a measure + (not (= (denominator type) ;; when the beamed note is 1/6 of a measure (* 2 (cdr time-signature-fraction))))) ;; End rules -- #t if beam is required to end - (or (= (ly:moment-main-numerator pos) 0) ;; end at measure beginning - (if (null? exception-grouping) - (beat-end? pos beat-endings) ;; no exception, so check beat ending - (member pos exception-moments))))))) ;; check exception rule + (or (zero? pos) ;; end at measure beginning + (if exception-grouping + (beat-end? pos exception-moments) ;; check exception rule + (beat-end? pos beat-endings))))))) ;; no exception, so check beat ending + + +(define-public (extract-beam-exceptions music) + "Creates a value useful for setting @code{beamExceptions} from @var{music}." + (define (car> a b) (> (car a) (car b))) + (define (beatify! lst) + ;; takes a collection of end points, sorts them, and returns the + ;; non-zero differences as beaming pattern + (let ((s (sort-list! lst <))) + (remove! zero? + (map - s (cons 0 s))))) + (let ((res '())) + (let analyze ((m (unfold-repeats-fully (event-chord-reduce music))) + (pos 0)) + ;; enter beam ends from m starting at pos into res, return new pos + (cond ((music-is-of-type? m 'bar-check) 0) + ((music-is-of-type? m 'simultaneous-music) + (fold (lambda (m prev) (max (analyze m pos) prev)) + pos + (ly:music-property m 'elements))) + ((not (music-is-of-type? m 'rhythmic-event)) + (let ((elt (ly:music-property m 'element))) + (fold analyze + (if (ly:music? elt) (analyze elt pos) pos) + (ly:music-property m 'elements)))) + ;; Have rhythmic event. + ((any + (lambda (art) + (and (music-is-of-type? art 'beam-event) + (= (ly:music-property art 'span-direction START) STOP))) + (ly:music-property m 'articulations)) + (let* ((len (duration-length (ly:music-property m 'duration))) + (pos (+ pos len)) + (ass (assv len res))) + (cond ((or (zero? len) (not (integer? (/ pos len)))) + (ly:warning m (_ "Beam end fits no pattern"))) + (ass + (set-cdr! ass (cons (/ pos len) (cdr ass)))) + (else + (set! res (cons (list len (/ pos len)) res)))) + pos)) + (else + (+ pos (duration-length (ly:music-property m 'duration)))))) + + ;; takes the output from the loop, generates actual beam exceptions + (list + (cons 'end + (map! + (lambda (l) + (cons (car l) + (beatify! (cdr l)))) + (sort-list! res car>)))))) diff --git a/scm/autochange.scm b/scm/autochange.scm index b358c22b53..5810f3292a 100644 --- a/scm/autochange.scm +++ b/scm/autochange.scm @@ -1,10 +1,26 @@ - +;;;; This file is part of LilyPond, the GNU music typesetter. +;;;; +;;;; Copyright (C) 2000--2015 Han-Wen Nienhuys +;;;; Jan Nieuwenhuizen +;;;; +;;;; LilyPond is free software: you can redistribute it and/or modify +;;;; it under the terms of the GNU General Public License as published by +;;;; the Free Software Foundation, either version 3 of the License, or +;;;; (at your option) any later version. +;;;; +;;;; LilyPond is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;;; GNU General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU General Public License +;;;; along with LilyPond. If not, see . ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; autochange.scm - fairly related to part combining. -(define-public (make-autochange-music parser music) - (define (generate-split-list change-moment event-list acc) +(define-public (make-autochange-music ref-pitch music) + (define (generate-split-list change-moment prev-dir event-list acc) (if (null? event-list) acc (let* ((now-tun (caar event-list)) @@ -15,32 +31,39 @@ evs)) (pitch (if (pair? notes) (ly:event-property (car notes) 'pitch) - #f))) + #f)) + (dir (if pitch + (sign + (- (ly:pitch-steps pitch) (ly:pitch-steps ref-pitch))) + 0))) ;; tail recursive. - (if (and pitch (not (= (ly:pitch-steps pitch) 0))) + (if (and (not (= dir 0)) + (not (= dir prev-dir))) (generate-split-list #f + dir (cdr event-list) (cons (cons - (if change-moment change-moment now) - (sign (ly:pitch-steps pitch))) acc)) + (if (< dir 0) 'down 'up)) acc)) (generate-split-list - (if pitch #f now) + (if pitch #f (if change-moment change-moment now)) + dir (cdr event-list) acc))))) (let* ((m (make-music 'AutoChangeMusic)) - (m1 (make-non-relative-music (context-spec-music music 'Voice "one"))) - (context-list (recording-group-emulate music - (ly:parser-lookup parser 'partCombineListener))) - (evs (car context-list)) + (m1 (context-spec-music (make-non-relative-music music) 'Voice "")) + (context-list + (recording-group-emulate m1 + (ly:parser-lookup 'partCombineListener))) (rev (reverse! (cdar context-list))) (split (reverse! (generate-split-list #f + 0 rev '()) '()))) - (set! (ly:music-property m 'element) music) - (set! (ly:music-property m 'split-list) split) + (set! (ly:music-property m 'element) m1) + (set! (ly:music-property m 'context-change-list) split) m)) diff --git a/scm/backend-library.scm b/scm/backend-library.scm index a167718187..240096cad2 100644 --- a/scm/backend-library.scm +++ b/scm/backend-library.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2005--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2005--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -32,13 +32,29 @@ ;; hmmm. what's the best failure option? (throw 'ly-file-failed))))) -(define-public (sanitize-command-option str) - "Kill dubious shell quoting." - - (string-append - "\"" - (regexp-substitute/global #f "[^-_ 0-9,.a-zA-Z'\"\\]" str 'pre 'post) - "\"")) +;; ly:system can't handle pipe and redirection. +;; This procedure can handle them by using shell. +(define-public (ly:system-with-shell command) + (let ((s (if (eq? PLATFORM 'windows) + ;; MinGW (except Cygwin): Use COMSPEC (cmd.exe) + ;; FIXME: Command window is displayed briefly + (list (or (getenv "COMSPEC") + "cmd.exe") + "/c") + ;; POSIX (also Cygwin): Use /bin/sh + (list "/bin/sh" + "-c"))) + (c (list (if (eq? PLATFORM 'windows) + ;; MinGW hack: Double quotes can not be used here. + ;; So we remove them. + ;; FIXME: The filename that contains space + ;; can't be handled. + (string-join (string-split command #\") "") + ;; Other environments (also Cygwin): + ;; Double quotes can be used. Pass through. + command + )))) + (ly:system (append s c)))) (define-public (search-executable names) (define (helper path lst) @@ -55,11 +71,9 @@ ;; must be sure that we don't catch stuff from old GUBs. (search-executable '("gs"))) -(define-public (postscript->pdf paper-width paper-height name) - (let* ((pdf-name (string-append - (dir-basename name ".ps" ".eps") - ".pdf")) - (is-eps (string-match "\\.eps$" name)) +(define-public (postscript->pdf paper-width paper-height + base-name tmp-name is-eps) + (let* ((pdf-name (string-append base-name ".pdf")) (*unspecified* (if #f #f)) (cmd (remove (lambda (x) (eq? x *unspecified*)) @@ -82,25 +96,27 @@ "-dNOPAUSE" "-dBATCH" "-r1200" + (if (ly:bigpdfs) "-dSubsetFonts=false") "-sDEVICE=pdfwrite" (string-append "-sOutputFile=" (string-join (string-split pdf-name #\%) "%%")) "-c.setpdfwrite" - (string-append "-f" name))))) + (string-append "-f" tmp-name))))) (ly:message (_ "Converting to `~a'...\n") pdf-name) (ly:system cmd))) -(define-public (postscript->png resolution paper-width paper-height name) +(define-public (postscript->png resolution paper-width paper-height + base-name tmp-name is-eps) (let* ((verbose (ly:get-option 'verbose)) (rename-page-1 #f)) ;; Do not try to guess the name of the png file, ;; GS produces PNG files like BASE-page%d.png. (ly:message (_ "Converting to ~a...") "PNG") - (make-ps-images name + (make-ps-images base-name tmp-name is-eps #:resolution resolution #:page-width paper-width #:page-height paper-height @@ -110,23 +126,86 @@ #:pixmap-format (ly:get-option 'pixmap-format)) (ly:progress "\n"))) -(define-public (postprocess-output paper-book module filename formats) - (let* ((completed (completize-formats formats)) - (base (dir-basename filename ".ps" ".eps")) - (intermediate (remove (lambda (x) (member x formats)) completed))) +(define-public (postscript->ps base-name tmp-name is-eps) + (let* ((ps-name (string-append base-name + (if is-eps ".eps" ".ps")))) + (if (not (equal? ps-name tmp-name)) + (begin + (ly:message (_ "Copying to `~a'...\n") ps-name) + (copy-binary-file tmp-name ps-name))))) + +(define-public (copy-binary-file from-name to-name) + (if (eq? PLATFORM 'windows) + ;; MINGW hack: MinGW Guile's copy-file is broken. + ;; It opens files by the text mode instead of the binary mode. + ;; (It is fixed from Guile 2.0.9.) + ;; By the text mode, copied binary files are broken. + ;; So, we open files by the binary mode and copy by ourselves. + (let ((port-from (open-file from-name "rb")) + (port-to (open-file to-name "wb"))) + (let loop((c (read-char port-from))) + (if (eof-object? c) + (begin (close port-from) + (close port-to)) + (begin (write-char c port-to) + (loop (read-char port-from)))))) + ;; Cygwin and other platforms: + ;; Pass through to copy-file + (copy-file from-name to-name))) + +(define-public (make-tmpfile) + (let* ((tmpl + (string-append (cond + ;; MINGW hack: TMP / TEMP may include + ;; unusable characters (Unicode etc.). + ((eq? PLATFORM 'windows) "./tmp-") + ;; Cygwin can handle any characters + ;; including Unicode. + ((eq? PLATFORM 'cygwin) (string-append + (or (getenv "TMP") + (getenv "TEMP")) + "/")) + ;; Other platforms (POSIX platforms) + ;; use TMPDIR or /tmp. + (else (string-append + (or (getenv "TMPDIR") + "/tmp") + "/"))) + "lilypond-XXXXXX")) + (port-tmp (mkstemp! tmpl))) + (if (eq? PLATFORM 'windows) + ;; MINGW hack: MinGW Guile's mkstemp! is broken. + ;; It creates a file by the text mode instead of the binary mode. + ;; (It is fixed from Guile 2.0.9.) + ;; We need the binary mode for embeddings CFFs. + ;; So, we re-open the same file by the binary mode. + (let* ((filename (port-filename port-tmp)) + (port (open-file filename "r+b"))) + (close port-tmp) + port) + ;; Cygwin and other platforms: + ;; Pass through the return value of mkstemp! + port-tmp))) + +(define-public (postprocess-output paper-book module formats + base-name tmp-name is-eps) + (let* ((completed (completize-formats formats is-eps))) (for-each (lambda (f) - ((eval (string->symbol (format #f "convert-to-~a" f)) - module) paper-book filename)) completed) - (if (ly:get-option 'delete-intermediate-files) - (for-each (lambda (f) - (if (file-exists? f) (delete-file f))) - (map (lambda (x) (string-append base "." x)) intermediate))))) - -(define-public (completize-formats formats) + ((eval (string->symbol (format #f "convert-to-~a" f)) module) + paper-book base-name tmp-name is-eps)) completed) + (if (and (ly:get-option 'delete-intermediate-files) + (or (not is-eps) + (not (member "ps" completed))) + (file-exists? tmp-name)) + (begin (ly:message (_ "Deleting `~a'...\n") tmp-name) + (delete-file tmp-name))))) + +(define-public (completize-formats formats is-eps) (define new-fmts '()) - (if (member "png" formats) + (if (and is-eps (member "eps" formats)) (set! formats (cons "ps" formats))) - (if (member "pdf" formats) + (if (not (or (member "pdf" formats) + (member "png" formats))) (set! formats (cons "ps" formats))) (for-each (lambda (x) (if (member x formats) (set! new-fmts (cons x new-fmts)))) @@ -204,9 +283,6 @@ (module-remove! output-module x)) missing-stencil-list)) -(define (filter-out pred? lst) - (filter (lambda (x) (not (pred? x))) lst)) - (define-public (font-name-split font-name) "Return @code{(FONT-NAME . DESIGN-SIZE)} from @var{font-name} string or @code{#f}." @@ -240,12 +316,12 @@ definition." (let* ((font-list (ly:paper-fonts paper)) (pango-fonts (filter ly:pango-font? font-list)) - (other-fonts (filter-out ly:pango-font? font-list)) + (other-fonts (remove ly:pango-font? font-list)) (other-font-names (map ly:font-name other-fonts)) (pango-only-fonts - (filter-out (lambda (x) - (member (pango-font-name x) other-font-names)) - pango-fonts))) + (remove (lambda (x) + (member (pango-font-name x) other-font-names)) + pango-fonts))) (define (font-load-command font) (let* ((font-name (ly:font-name font)) diff --git a/scm/bar-line.scm b/scm/bar-line.scm index 302936e49c..86d12d9b21 100644 --- a/scm/bar-line.scm +++ b/scm/bar-line.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2009--2012 Marc Hohl +;;;; Copyright (C) 2009--2015 Marc Hohl ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; helper functions for staff and layout properties -(define (calc-blot thickness extent grob) +(define (bar-line::calc-blot thickness extent grob) "Calculate the blot diameter by taking @code{'rounded} and the dimensions of the extent into account." (let* ((rounded (ly:grob-property grob 'rounded #f)) @@ -39,9 +39,18 @@ and the dimensions of the extent into account." ((< height blot-diameter) height) (else blot-diameter))) 0))) - blot)) +(define-public (bar-line::draw-filled-box x-ext y-ext thickness extent grob) + "Return a straight bar-line created by @code{ly:round-filled-box} looking at +@var{x-ext}, @var{y-ext}, @var{thickness}. The blot is calculated by +@code{bar-line::calc-blot}, which needs @var{extent} and @var{grob}. +@var{y-ext} is not necessarily of same value as @var{extent}." + (ly:round-filled-box + x-ext + y-ext + (bar-line::calc-blot thickness extent grob))) + (define (get-span-glyph bar-glyph) "Get the corresponding span glyph from the @code{span-glyph-bar-alist}. Pad the string with @code{annotation-char}s to the length of the @@ -250,35 +259,38 @@ is not used within the routine." (let* ((line-thickness (layout-line-thickness grob)) (thickness (* (ly:grob-property grob 'hair-thickness 1) line-thickness)) - (blot (calc-blot thickness extent grob)) (extent (bar-line::widen-bar-extent-on-span grob extent))) - - (ly:round-filled-box (cons 0 thickness) - extent - blot))) + (bar-line::draw-filled-box + (cons 0 thickness) + extent + thickness + extent + grob))) (define (make-thick-bar-line grob extent) "Draw a thick bar line." (let* ((line-thickness (layout-line-thickness grob)) (thickness (* (ly:grob-property grob 'thick-thickness 1) line-thickness)) - (blot (calc-blot thickness extent grob)) (extent (bar-line::widen-bar-extent-on-span grob extent))) - - (ly:round-filled-box (cons 0 thickness) - extent - blot))) + (bar-line::draw-filled-box + (cons 0 thickness) + extent + thickness + extent + grob))) (define (make-tick-bar-line grob extent) "Draw a tick bar line." (let* ((half-staff (* 1/2 (ly:staff-symbol-staff-space grob))) (staff-line-thickness (ly:staff-symbol-line-thickness grob)) - (height (interval-end extent)) - (blot (calc-blot staff-line-thickness extent grob))) - - (ly:round-filled-box (cons 0 staff-line-thickness) - (cons (- height half-staff) (+ height half-staff)) - blot))) + (height (interval-end extent))) + (bar-line::draw-filled-box + (cons 0 staff-line-thickness) + (cons (- height half-staff) (+ height half-staff)) + staff-line-thickness + extent + grob))) (define (make-colon-bar-line grob extent) "Draw repeat dots." @@ -440,14 +452,14 @@ is not used within the routine." the segno sign is drawn over the double bar line; otherwise, it draws the span bar variant, i.e. without the segno sign." (let* ((line-thickness (layout-line-thickness grob)) - (thinkern (* (ly:grob-property grob 'thin-kern 1) line-thickness)) + (segno-kern (* (ly:grob-property grob 'segno-kern 1) line-thickness)) (thin-stil (make-simple-bar-line grob extent)) (double-line-stil (ly:stencil-combine-at-edge thin-stil X LEFT thin-stil - thinkern)) + segno-kern)) (segno (ly:font-get-glyph (ly:grob-default-font grob) "scripts.varsegno")) (stencil (ly:stencil-add @@ -459,7 +471,7 @@ draws the span bar variant, i.e. without the segno sign." (cons 0 0))) (ly:stencil-translate-axis double-line-stil - (* 1/2 thinkern) + (* 1/2 segno-kern) X)))) stencil)) @@ -467,11 +479,11 @@ draws the span bar variant, i.e. without the segno sign." (define (make-kievan-bar-line grob extent) "Draw a kievan bar line." (let* ((font (ly:grob-default-font grob)) - (stencil (stencil-whiteout + (stencil (stencil-whiteout-box (ly:font-get-glyph font "scripts.barline.kievan")))) ;; the kievan bar line has no staff lines underneath, - ;; so we whiteout them and move the grob to a higher layer + ;; so we whiteout-box them and move the grob to a higher layer (ly:grob-set-property! grob 'layer 1) stencil)) @@ -1049,7 +1061,7 @@ of the volta brackets relative to the bar lines." (define-bar-line ":|." ":|." #f " |.") (define-bar-line ".|:" "|" ".|:" ".|") (define-bar-line "[|:" "|" "[|:" " |") -(define-bar-line ":|]" ":|]" #f " |") +(define-bar-line ":|]" ":|]" #f " | ") (define-bar-line ":|][|:" ":|]" "[|:" " | |") (define-bar-line ".|:-||" "||" ".|:" ".|") diff --git a/scm/bezier-tools.scm b/scm/bezier-tools.scm index defefc7bc4..422692598c 100644 --- a/scm/bezier-tools.scm +++ b/scm/bezier-tools.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2010--2012 Carl D. Sorensen +;;;; Copyright (C) 2010--2015 Carl D. Sorensen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/c++.scm b/scm/c++.scm index a131e7f342..a455afdd78 100644 --- a/scm/c++.scm +++ b/scm/c++.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 1998--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -33,6 +33,11 @@ (and (pair? x) (index? (car x)) (index? (cdr x)))) +(define-public (rational-or-procedure? x) + (or + (and (rational? x) (exact? x)) + (procedure? x))) + (define-public (number-or-grob? x) (or (ly:grob? x) (number? x))) @@ -49,9 +54,28 @@ (and (pair? x) (ly:moment? (car x)) (ly:moment? (cdr x)))) +(define-public (boolean-or-number? x) + (or (boolean? x) (number? x))) + (define-public (boolean-or-symbol? x) (or (boolean? x) (symbol? x))) +(define-public (key? x) + (or (symbol? x) (index? x))) + +(define-public (key-list? x) + (and (list? x) (every key? x))) + +(define-public (key-list-or-music? x) + (if (list? x) + (every key? x) + (ly:music? x))) + +(define-public (key-list-or-symbol? x) + (if (list? x) + (every key? x) + (symbol? x))) + (define-public (symbol-list? x) (and (list? x) (every symbol? x))) @@ -88,8 +112,6 @@ (define-public (scheme? x) #t) -(define-public (symbol-or-boolean? x) - (or (symbol? x) (boolean? x))) (define-public (void? x) (unspecified? x)) diff --git a/scm/chord-entry.scm b/scm/chord-entry.scm index 009887bf67..23601a8dea 100644 --- a/scm/chord-entry.scm +++ b/scm/chord-entry.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2004--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -16,7 +16,9 @@ ;;;; along with LilyPond. If not, see . ;; for define-safe-public when byte-compiling using Guile V2 -(use-modules (scm safe-utility-defs)) +(use-modules (scm safe-utility-defs) (ice-9 receive)) + +(define-session-public chordmodifiers '()) (define-public (construct-chord-elements root duration modifications) "Build a chord on root using modifiers in @var{modifications}. @@ -32,6 +34,8 @@ Entry point for the parser." (inversion #f) (lead-mod #f) (explicit-11 #f) + (explicit-2/4 #f) + (omit-3 #f) (start-additions #t)) (define (interpret-inversion chord mods) @@ -49,7 +53,8 @@ Entry point for the parser." (set! bass (cadr mods)) (set! mods (cddr mods)))) (if (pair? mods) - (ly:warning (_ "Spurious garbage following chord: ~A") mods)) + (ly:parser-error + (format #f (_ "Spurious garbage following chord: ~A") mods))) chord) (define (interpret-removals chord mods) @@ -66,8 +71,10 @@ Entry point for the parser." "Interpret additions. TODO: should restrict modifier use?" (cond ((null? mods) chord) ((ly:pitch? (car mods)) - (if (= (pitch-step (car mods)) 11) - (set! explicit-11 #t)) + (case (pitch-step (car mods)) + ((11) (set! explicit-11 #t)) + ((2 4) (set! explicit-2/4 #t)) + ((3) (set! omit-3 #f))) (interpret-additions (cons (car mods) (remove-step (pitch-step (car mods)) chord)) (cdr mods))) ((procedure? (car mods)) @@ -129,8 +136,10 @@ the bass specified. (ly:pitch? (car flat-mods)) (not (eq? lead-mod sus-modifier))) (begin - (if (= (pitch-step (car flat-mods)) 11) - (set! explicit-11 #t)) + (cond ((= (pitch-step (car flat-mods)) 11) + (set! explicit-11 #t)) + ((equal? (ly:make-pitch 0 4 0) (car flat-mods)) + (set! omit-3 #t))) (set! base-chord (stack-thirds (car flat-mods) the-canonical-chord)) (set! flat-mods (cdr flat-mods)))) @@ -141,6 +150,10 @@ the bass specified. (if start-additions (interpret-additions base-chord flat-mods) (interpret-removals base-chord flat-mods))) + ;; if sus has been given neither 2 or 4, we add 4. + (if (and (eq? lead-mod sus-modifier) + (not explicit-2/4)) + (set! complete-chord (cons (ly:make-pitch 0 4 0) complete-chord))) (set! complete-chord (sort complete-chord ly:pitch rather than + ;; or + (values '() high) + (span (lambda (p) + (ly:pitch +;;;; Copyright (C) 2003--2015 Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/chord-ignatzek-names.scm b/scm/chord-ignatzek-names.scm index fc32e6ba75..483b8cac8f 100644 --- a/scm/chord-ignatzek-names.scm +++ b/scm/chord-ignatzek-names.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2000--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -161,10 +161,12 @@ work than classifying the pitches." (let* ((num-markup (make-simple-markup (number->string (pitch-step pitch)))) (args (list num-markup)) - (total (if (= (ly:pitch-alteration pitch) 0) - (if (= (pitch-step pitch) 7) - (list (ly:context-property context 'majorSevenSymbol)) - args) + (major-seven-symbol (ly:context-property context 'majorSevenSymbol)) + (total + (if (and (= (ly:pitch-alteration pitch) 0) + (= (pitch-step pitch) 7) + (markup? major-seven-symbol)) + (list major-seven-symbol) (cons (accidental->markup (step-alteration pitch)) args)))) (make-line-markup total))) diff --git a/scm/chord-name.scm b/scm/chord-name.scm index a80d4e2b6e..52ae72b2cb 100644 --- a/scm/chord-name.scm +++ b/scm/chord-name.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2000--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -106,7 +106,7 @@ (list-ref '( "ses" "s" "" "is" "isis") (+ 2 (cdr n-a))) (list-ref '("eses" "es" "" "is" "isis") (+ 2 (cdr n-a))))))))) -(define-public ((chord-name->italian-markup re-with-eacute) pitch lowercase?) +(define ((chord-name->italian-markup re-with-eacute) pitch lowercase?) "Return pitch markup for @var{pitch}, using Italian/@/French note names. If @var{re-with-eacute} is set to @code{#t}, french `ré' is returned for pitch@tie{}D instead of `re'." @@ -125,6 +125,7 @@ pitch@tie{}D instead of `re'." lowercase?)) (accidental->markup-italian alt) )))) +(export chord-name->italian-markup) ;; fixme we should standardize on omit-root (or the other one.) ;; perhaps the default should also be reversed --hwn diff --git a/scm/clip-region.scm b/scm/clip-region.scm index 5cfc4449e7..277bbe1c79 100644 --- a/scm/clip-region.scm +++ b/scm/clip-region.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2006--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2006--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm index 20d77ea72f..75f1807e61 100644 --- a/scm/define-context-properties.scm +++ b/scm/define-context-properties.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -28,7 +28,7 @@ (if (not (equal? #f (object-property symbol 'translation-doc))) - (ly:error (_ "symbol ~S redefined" symbol))) + (ly:error (_ "symbol ~S redefined") symbol)) (set-object-property! symbol 'translation-type? type?) (set-object-property! symbol 'translation-doc description) @@ -48,6 +48,9 @@ on the same note in different octaves may be horizontally staggered if in different voices.") (aDueText ,markup? "Text to print at a unisono passage.") + (additionalBassStrings ,list? "The additional tablature bass-strings, which +will not get a seprate line in TabStaff. It is a list of the pitches of each +string (starting with the lowest numbered one).") (additionalPitchPrefix ,string? "Text with which to prefix additional pitches within a chord name.") (alignAboveContext ,string? "Where to insert newly created context in @@ -60,7 +63,13 @@ vertical alignment.") numbers. Can be @code{numbers} for going back to the same number or @code{numbers-with-letters} for going back to the same number with letter suffixes. No setting will not go back in measure-number time.") - (associatedVoice ,string? "Name of the @code{Voice} that has the + (alternativeRestores ,symbol-list? "Timing variables that are +restored to their value at the end of the first alternative in +subsequent alternatives.") + (associatedVoice ,string? "Name of the context (see +@code{associatedVoiceType} for its type, usually @code{Voice}) that +has the melody for this @code{Lyrics} line.") + (associatedVoiceType ,symbol? "Type of the context that has the melody for this @code{Lyrics} line.") (autoAccidentals ,list? "List of different ways to typeset an accidental. @@ -170,9 +179,6 @@ own as a subdivided section.") called to produce the formatting for a @code{BassFigure} grob. It takes a list of @code{BassFigureEvent}s, a context, and the grob to format.") - (bassStaffProperties ,list? "An alist of property settings to -apply for the down staff of @code{PianoStaff}. Used by -@code{\\autochange}.") (beamExceptions ,list? "An alist of exceptions to autobeam rules that normally end on beats.") (beamHalfMeasure ,boolean? "Whether to allow a beam to begin @@ -215,6 +221,17 @@ and @samp{bracketed}.") symbol go, measured in half staff spaces from the center of the staff.") (completionBusy ,boolean? "Whether a completion-note head is playing.") + (completionFactor ,rational-or-procedure? +"When @code{Completion_heads_engraver} and +@code{Completion_rest_engraver} need to split a note or rest with a +scaled duration, such as @code{c2*3}, this specifies the scale factor +to use for the newly-split notes and rests created by the engraver. + +If @code{#f}, the completion engraver uses the scale-factor of +each duration being split. + +If set to a callback procedure, that procedure is called with the +context of the completion engraver, and the duration to be split.") (completionUnit ,ly:moment? "Sub-bar unit of completion.") (connectArpeggios ,boolean? "If set, connect arpeggios across piano staff.") @@ -268,8 +285,8 @@ slurred note, one above and one below the chord.") instruments (symbols) to pitches.") (drumStyleTable ,hash-table? "A hash table which maps drums to layout settings. Predefined values: @samp{drums-style}, -@samp{timbales-style}, @samp{congas-style}, @samp{bongos-style}, and -@samp{percussion-style}. +@samp{agostini-drums-style}, @samp{timbales-style}, @samp{congas-style}, +@samp{bongos-style}, and @samp{percussion-style}. The layout style is a hash table, containing the drum-pitches (e.g., the symbol @samp{hihat}) as keys, and a list @@ -353,8 +370,8 @@ string selector for tablature notation.") @rinternals{Lyrics} line.") (implicitBassFigures ,list? "A list of bass figures that are not printed as numbers, but only as extender lines.") - (implicitTimeSignatureVisibility ,vector? "break visibility for -the default time signature.") + (initialTimeSignatureVisibility ,vector? "break visibility for +the initial time signature.") (includeGraceNotes ,boolean? "Do not ignore grace notes for @rinternals{Lyrics}.") (instrumentCueName ,markup? "The name to print if another @@ -382,12 +399,12 @@ alterations should be printed. The format is @code{(@var{step} . @var{alter})}, where @var{step} is a number from 0 to@tie{}6 and @var{alter} from -2 (sharp) to 2 (flat).") - (keySignature ,list? "The current key signature. This is an alist + (keyAlterations ,list? "The current key signature. This is an alist containing @code{(@var{step} . @var{alter})} or @code{((@var{octave} . @var{step}) . @var{alter})}, where @var{step} is a number in the range 0 to@tie{}6 and @var{alter} a fraction, denoting alteration. For alterations, use symbols, e.g. -@code{keySignature = #`((6 . ,FLAT))}.") +@code{keyAlterations = #`((6 . ,FLAT))}.") (lyricMelismaAlignment ,number? "Alignment to use for a melisma syllable.") @@ -444,12 +461,15 @@ associated with the current context. Ranges from@tie{}@w{-1} to@tie{}1, where the values@tie{}@w{-1} (@code{#LEFT}),@tie{}0 (@code{#CENTER}) and@tie{}1 (@code{#RIGHT}) correspond to hard left, center, and hard right, respectively.") - (midiReverbLevel ,number? "Reverb effect level for the MIDI channel -associated with the current context. Ranges from 0 to@tie{}1 -(0=off,@tie{}1=full effect).") - (midiChorusLevel ,number? "Chorus effect level for the MIDI channel -associated with the current context. Ranges from 0 to@tie{}1 -(0=off,@tie{}1=full effect).") + (midiExpression ,number? "Expression control for the MIDI +channel associated with the current context. Ranges from 0 +to@tie{}1 (0=off,@tie{}1=full effect).") + (midiReverbLevel ,number? "Reverb effect level for the MIDI +channel associated with the current context. Ranges from 0 +to@tie{}1 (0=off,@tie{}1=full effect).") + (midiChorusLevel ,number? "Chorus effect level for the MIDI +channel associated with the current context. Ranges from 0 +to@tie{}1 (0=off,@tie{}1=full effect).") (minimumFret ,number? "The tablature auto string-selecting mechanism selects the highest string with a fret at least @code{minimumFret}.") @@ -467,7 +487,10 @@ ChordNames context.") defined strings to full list of strings and fret numbers. Parameters: The context, a list of note events, a list of tabstring events, and the fretboard grob if a fretboard is desired.") - + (nullAccidentals ,boolean? "The @code{Accidental_engraver} +generates no accidentals for notes in contexts were this is set. +In addition to supressing the printed accidental, this option removes +any effect the note would have had on accidentals in other voices.") (ottavation ,markup? "If set, the text for an ottava spanner. Changing this creates a new text spanner.") @@ -475,6 +498,9 @@ Changing this creates a new text spanner.") translator during music interpretation.") + (partCombineForced ,symbol? "Override for the partcombine +decision. Can be @code{apart}, @code{chords}, @code{unisono}, +@code{solo1}, or @code{solo2}.") (partCombineTextsOnNote ,boolean? "Print part-combine texts only on the next note rather than immediately on rests or skips.") (pedalSostenutoStrings ,list? "See @code{pedalSustainStrings}.") @@ -548,6 +574,8 @@ part-combining.") @rinternals{Pitch_squash_engraver}.") (staffLineLayoutFunction ,procedure? "Layout of staff lines, @code{traditional}, or @code{semitone}.") + (magnifyStaffValue ,positive? "The most recent value set with +@code{\\magnifyStaff}.") (stanza ,markup? "Stanza @q{number} to print before the start of a verse. Use in @code{Lyrics} context.") (startRepeatSegnoType ,string? "Set the default bar line for the @@ -573,6 +601,8 @@ one).") subdivided at @code{baseMoment} positions by only drawing one beam over the beat.") (suggestAccidentals ,boolean? "If set, accidentals are typeset as cautionary suggestions over the note.") + (supportNonIntegerFret ,boolean? "If set in @code{Score} the +@code{TabStaff} will print micro-tones as @samp{2½}") (systemStartDelimiter ,symbol? "Which grob to make for the start of the system/@/staff? Set to @code{SystemStartBrace}, @code{SystemStartBracket} or @code{SystemStartBar}.") @@ -605,11 +635,6 @@ position, bar number, etc.? Switch off for cadenzas.") (topLevelAlignment ,boolean? "If true, the @var{Vertical_align_engraver} will create a @var{VerticalAlignment}; otherwise, it will create a @var{StaffGrouper}") - (trebleStaffProperties ,list? "An alist of property settings to -apply for the up staff of @code{PianoStaff}. Used by -@code{\\autochange}.") - (tremoloFlags ,integer? "The number of tremolo flags to add if no -number is specified.") (tupletFullLength ,boolean? "If set, the tuplet is printed up to the start of the next note.") (tupletFullLengthNote ,boolean? "If set, end at the next note, @@ -697,10 +722,11 @@ in an axis group.") @code{CommandColumn} contains items that will affect spacing.") - (lastKeySignature ,list? "Last key signature before a key + (lastChord ,markup? "Last chord, used for detecting chord changes.") + (lastKeyAlterations ,list? "Last key signature before a key signature change.") - (localKeySignature ,list? "The key signature at this point in the -measure. The format is the same as for @code{keySignature}, but can + (localAlterations ,list? "The key signature at this point in the +measure. The format is the same as for @code{keyAlterations}, but can also contain @code{((@var{octave} . @var{name}) . (@var{alter} @var{barnumber} . @var{measureposition}))} pairs.") @@ -710,6 +736,9 @@ This can be used to signal melismas on top of those automatically detected.") + (partialBusy ,boolean? "Signal that \\partial acts at the current timestep.") + + (quotedCueEventTypes ,list? "A list of symbols, representing the event types that should be duplicated for @code{\\cueDuring} commands.") (quotedEventTypes ,list? "A list of symbols, representing the diff --git a/scm/define-event-classes.scm b/scm/define-event-classes.scm index dd6405a73e..8695bc5b78 100644 --- a/scm/define-event-classes.scm +++ b/scm/define-event-classes.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2005--2012 Erik Sandberg +;;;; Copyright (C) 2005--2015 Erik Sandberg ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -25,19 +25,20 @@ (RemoveContext ChangeParent Override Revert UnsetProperty SetProperty music-event OldMusicEvent CreateContext Prepare - OneTimeStep Finish)) + OneTimeStep Finish GraceChange)) (music-event . (annotate-output-event footnote-event arpeggio-event breathing-event extender-event span-event rhythmic-event dynamic-event break-event label-event percent-event key-change-event string-number-event stroke-finger-event tie-event - part-combine-event part-combine-force-event + part-combine-event beam-forbid-event script-event tempo-change-event tremolo-event bend-after-event fingering-event glissando-event harmonic-event hyphen-event laissez-vibrer-event mark-event multi-measure-text-event note-grouping-event pes-or-flexa-event repeat-tie-event spacing-section-event layout-instruction-event + time-signature-event completize-extender-event break-span-event alternative-event)) (layout-instruction-event . (apply-output-event)) @@ -106,7 +107,7 @@ previously defined event class." ((ly:make-event-class class) (ly:error (_ "Cannot redefine event class `~S'") class)) ((not parentclass) - (ly:error (_ "Undefined parent event class `~S'" parentclass))) + (ly:error (_ "Undefined parent event class `~S'") parentclass)) (else (hashq-set! ancestor-lookup class @@ -158,7 +159,7 @@ previously defined event class." ;;(pretty-print (cons (car music-event-tree) (sort-tree (cdr music-event-tree)))) (defmacro-public make-stream-event (expr) - (Stream_event::undump (primitive-eval (list 'quasiquote expr)))) + (ly:stream-event::undump (primitive-eval (list 'quasiquote expr)))) (define* (simplify e) (cond @@ -167,7 +168,7 @@ previously defined event class." ((pair? e) (cons (simplify (car e)) (simplify (cdr e)))) ((ly:stream-event? e) - (list 'unquote (list 'make-stream-event (simplify (Stream_event::dump e))))) + (list 'unquote (list 'make-stream-event (simplify (ly:stream-event::dump e))))) ((ly:music? e) (list 'unquote (music->make-music e))) ((ly:moment? e) @@ -182,7 +183,7 @@ previously defined event class." (list 'unquote `(ly:make-duration ,(ly:duration-log e) ,(ly:duration-dot-count e) - ,(ly:duration-scale)))) + ,(ly:duration-scale e)))) ((ly:pitch? e) (list 'unquote `(ly:make-pitch ,(ly:pitch-octave e) diff --git a/scm/define-grob-interfaces.scm b/scm/define-grob-interfaces.scm index 59a97b6967..d5f2311396 100644 --- a/scm/define-grob-interfaces.scm +++ b/scm/define-grob-interfaces.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -59,7 +59,7 @@ found in @file{scm/bar-line.scm}. has-span-bar kern rounded - thin-kern + segno-kern thick-thickness)) (ly:add-interface @@ -83,7 +83,7 @@ found in @file{scm/bar-line.scm}. "The number describing transposition of the clef, placed below or above clef sign. Usually this is 8 (octave transposition) or 15 (two octaves), but LilyPond allows any integer here." - '()) + '(clef-alignments)) (ly:add-interface 'dynamic-interface @@ -216,11 +216,26 @@ accidentals)." "Note names." '()) +(ly:add-interface + 'number-interface + "Numbers." + '(number-type)) + (ly:add-interface 'only-prebreak-interface "Kill this grob after the line breaking process." '()) +(ly:add-interface + 'outside-staff-axis-group-interface + "A vertical axis group on which outside-staff skyline calculations are done." + '(outside-staff-placement-directive vertical-skyline-elements)) + +(ly:add-interface + 'outside-staff-interface + "A grob that could be placed outside staff." + '(outside-staff-horizontal-padding outside-staff-padding outside-staff-priority)) + (ly:add-interface 'parentheses-interface "Parentheses for other objects." @@ -302,6 +317,24 @@ interesting enough to maintain a hara-kiri staff." "A note head in tablature." '(details display-cautionary span-start)) +(ly:add-interface + 'time-signature-interface + "A time signature, in different styles. The following values for @code{style} are are recognized: + + @table @code + @item C + 4/4 and 2/2 are typeset as C and struck C, respectively. All other time signatures are written with two digits. The value @code{default} is equivalent to @code{C}. + @item neomensural + 2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8, and 9/8 are typeset with neo-mensural style mensuration marks. All other time signatures are written with two digits. + @item mensural + 2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8, and 9/8 are typeset with mensural style mensuration marks. All other time signatures are written with two digits. + @item single-digit + All time signatures are typeset with a single digit, e.g., 3/2 is written as 3. + @item numbered + All time signatures are typeset with two digits. + @end table" + '(fraction style)) + (ly:add-interface 'trill-spanner-interface "A trill spanner." diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 6f3a7704ef..cb9103a6fc 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -125,43 +125,47 @@ visibility of the tuplet bracket. Setting it to false prevents printing of the bracket. Setting the property to @code{if-no-beam} makes it print only if there is no beam associated with this tuplet bracket.") - (break-align-anchor ,number? "Grobs aligned to this break-align -grob will have their X-offsets shifted by this number. In bar lines, + (break-align-anchor ,number? "Grobs aligned to this breakable +item will have their X-offsets shifted by this number. In bar lines, for example, this is used to position grobs relative to the (visual) center of the bar line.") (break-align-anchor-alignment ,number? "Read by @code{ly:break-aligned-interface::calc-extent-aligned-anchor} for aligning an anchor to a grob's extent.") - (break-align-orders ,vector? "Defines the order in which -prefatory matter (clefs, key signatures) appears. The format is a -vector of length@tie{}3, where each element is one order for -end-of-line, middle of line, and start-of-line, respectively. An -order is a list of symbols. + (break-align-orders ,vector? "This is a vector of 3@tie{}lists: +@w{@code{#(@var{end-of-line} @var{unbroken} @var{start-of-line}}}). +Each list contains @w{@emph{break-align symbols}} that specify an +order of breakable items (see @rinternals{break-alignment-interface}). -For example, clefs are put after key signatures by setting +For example, this places time signatures before clefs: @example -\\override Score.BreakAlignment #'break-align-orders = - #(make-vector 3 '(span-bar +\\override Score.BreakAlignment.break-align-orders = + #(make-vector 3 '(left-edge + cue-end-clef + ambitus breathing-sign - staff-bar - key + time-signature clef - time-signature)) + cue-clef + staff-bar + key-cancellation + key-signature + custos)) @end example") - (break-align-symbol ,symbol? "This key is used for aligning and -spacing breakable items.") - (break-align-symbols ,list? "A list of symbols that determine -which break-aligned grobs to align this to. If the grob selected by -the first symbol in the list is invisible due to break-visibility, we -will align to the next grob (and so on). Choices are @code{left-edge}, -@code{ambitus}, @code{breathing-sign}, @code{clef}, @code{staff-bar}, -@code{key-cancellation}, @code{key-signature}, @code{time-signature}, -and @code{custos}.") + (break-align-symbol ,symbol? "This key is used for aligning, +ordering, and spacing breakable items. See +@rinternals{break-alignment-interface}.") + (break-align-symbols ,list? "A list of +@w{@emph{break-align symbols}} that determines which breakable +items to align this to. If the grob selected by the first symbol +in the list is invisible due to @w{@code{break-visibility}}, we +will align to the next grob (and so on). Choices are listed in +@rinternals{break-alignment-interface}.") (break-overshoot ,number-pair? "How much does a broken spanner stick out of its bounds?") (break-visibility ,vector? "A vector of 3@tie{}booleans, -@code{#(@var{end-of-line} @var{unbroken} @var{begin-of-line})}. +@w{@code{#(@var{end-of-line} @var{unbroken} @var{begin-of-line})}}. @code{#t} means visible, @code{#f} means killed.") (breakable ,boolean? "Allow breaks here.") (broken-bound-padding ,number? "The amount of padding to insert @@ -170,19 +174,19 @@ when a spanner is broken at a line break.") ;;; ;;; c ;;; + (chord-dots-limit ,integer? "Limits the column of dots +on each chord to the height of the chord plus +@code{chord-dots-limit} staff-positions.") (circled-tip ,boolean? "Put a circle at start/@/end of hairpins (al/@/del niente).") + (clef-alignments ,list? "An alist of parent-alignments +that should be used for clef modifiers with various clefs") (clip-edges ,boolean? "Allow outward pointing beamlets at the edges of beams?") (collapse-height ,ly:dimension? "Minimum height of system start delimiter. If equal or smaller, the bracket/@/brace/@/line is removed.") - (collision-bias ,number? "Number determining how much to favor the -left (negative) or right (positive). Larger absolute values in either -direction will push a collision in this direction.") (collision-interfaces ,list? "A list of interfaces for which automatic beam-collision resolution is run.") - (collision-padding ,number? "Amount of padding to apply after -a collision is detected via the self-alignment-interface.") (collision-voice-only ,boolean? "Does automatic beam collsion apply only to the voice in which the beam was created?") (color ,color? "The color of this grob.") @@ -195,7 +199,7 @@ measure of the closeness of the inner stems. It is used for damping the slope of the beam.") (connect-to-neighbor ,pair? "Pair of booleans, indicating whether this grob looks as a continued break.") - (control-points ,list? "List of offsets (number pairs) that form + (control-points ,number-pair-list? "List of offsets (number pairs) that form control points for the tie, slur, or bracket shape. For B@'eziers, this should list the control points of a third-order B@'ezier curve.") (count-from ,integer? "The first measure in a measure count @@ -210,8 +214,9 @@ increments from this initial value.") dash structure. Each @code{dash-element} has a starting t value, an ending t-value, a @code{dash-fraction}, and a @code{dash-period}.") (dash-fraction ,number? "Size of the dashes, relative to -@code{dash-period}. Should be between @code{0.0} (no line) and -@code{1.0} (continuous line).") +@code{dash-period}. Should be between @code{0.1} and +@code{1.0} (continuous line). If set to @code{0.0}, a dotted line is +produced") (dash-period ,number? "The length of one dash together with whitespace. If negative, no line is drawn at all.") (default-direction ,ly:dir? "Direction determined by note head @@ -241,6 +246,11 @@ elements closer together.") (dot-placement-list ,list? "List consisting of @code{(@var{description} @var{string-number} @var{fret-number} @var{finger-number})} entries used to define fret diagrams.") + (double-stem-separation ,number? "The distance between the two +stems of a half note in tablature when using @code{\\tabFullNotation}, +not counting the width of the stems themselves, expressed as a multiple +of the default height of a staff-space in the traditional five-line +staff.") (duration-log ,integer? "The 2-log of the note head duration, i.e., @code{0} = whole note, @code{1} = half note, etc.") @@ -283,6 +293,10 @@ set this to @code{(+inf.0 . -inf.0)}.") ;;; f ;;; (flag-count ,number? "The number of tremolo beams.") + (flag-style ,symbol? "The style of the flag to be used with +@code{MetronomeMark}. Available are @code{'modern-straight-flag}, +@code{'old-straight-flag}, @code{flat-flag}, @code{mensural} and +@code{'default}") (flat-positions ,list? "Flats in key signatures are placed within the specified ranges of staff-positions. The general form is a list of pairs, with one pair for each type of clef, in order @@ -310,7 +324,9 @@ include @code{upright}, @code{italic}, @code{caps}.") @q{normal}@tie{}size. @code{0}@tie{}is style-sheet's normal size, @w{@code{-1}} is smaller, @code{+1} is bigger. Each step of@tie{}1 is approximately 12% larger; 6@tie{}steps are exactly a factor@tie{}2 -larger. Fractional values are allowed.") +larger. If the context property @code{fontSize} is set, its value is +added to this before the glyph is printed. Fractional values are +allowed.") (footnote ,boolean? "Should this be a footnote or in-note?") (footnote-music ,ly:music? "Music creating a footnote.") (footnote-text ,markup? "A footnote for the grob.") @@ -367,6 +383,13 @@ label the lowest fret number. Default@tie{}0.5. the center of the fret in direction parallel to strings. Default@tie{}0. @item +@code{fret-label-horizontal-offset} -- The offset of the fret label from +the center of the fret in direction orthogonal to strings. +Default@tie{}0. +@item +@code{paren-padding} -- The padding for the parenthesis. +Default@tie{}0.05. +@item @code{label-dir} -- Side to which the fret label is attached. @w{@code{-1}}, @code{LEFT}, or @code{DOWN} for left or down; @code{1}, @code{RIGHT}, or @code{UP} for right or up. Default @code{RIGHT}. @@ -447,7 +470,9 @@ etc. are already taken.") ;;; h ;;; (hair-thickness ,number? "Thickness of the thin line in a bar -line.") +line, expressed as a multiple of the default staff-line +thickness (i.e. the visual output is @emph{not} influenced by changes +to @code{@var{Staff}.StaffSymbol.thickness}).") (harp-pedal-details ,list? "An alist of detailed grob properties for harp pedal diagrams. Each alist entry consists of a @code{(@var{property} . @var{value})} pair. The properties which can @@ -506,6 +531,8 @@ the string will be assigned to the @code{id} attribute of a group () that encloses the stencils that comprise the grob. In the Postscript backend, as there is no way to group items, the setting of the id property will have no effect.") + (ignore-ambitus ,boolean? "If set, don't consider this notehead +for ambitus calculation.") (ignore-collision ,boolean? "If set, don't do note collision resolution on this @code{NoteColumn}.") (implicit ,boolean? "Is this an implicit bass figure?") @@ -520,12 +547,17 @@ slur quants to this position, and print the respective scores.") ;;; (keep-inside-line ,boolean? "If set, this column cannot have objects sticking into the margin.") - (kern ,ly:dimension? "Amount of extra white space to add. For -bar lines, this is the amount of space after a thick line.") + (kern ,ly:dimension? "The space between individual elements +in any compound bar line, expressed as a multiple of the default +staff-line thickness (i.e. the visual output is @emph{not} +influenced by changes to +@code{@var{Staff}.StaffSymbol.thickness}).") (knee ,boolean? "Is this beam kneed?") (knee-spacing-correction ,number? "Factor for the optical correction amount for kneed beams. Set between @code{0} for no correction and @code{1} for full correction.") + (knee-to-beam ,boolean? "Determines whether a tuplet number +will be positioned next to a kneed beam.") ;;; @@ -543,8 +575,13 @@ lines for.") lines. It is the sum of 2@tie{}numbers: The first is the factor for line thickness, and the second for staff space. Both contributions are added.") - (ledger-positions ,list? "Repeating pattern for the vertical positions -of ledger lines. Bracketed groups are always shown together.") + (ledger-positions ,list? "Vertical positions of ledger lines. +When set on a @code{StaffSymbol} grob it defines a repeating +pattern of ledger lines and any parenthesized groups will always be +shown together.") + (ledger-positions-function ,scheme? "A quoted Scheme procedure that +takes a @code{StaffSymbol} grob and the vertical position of a note head +as arguments and returns a list of ledger line positions.") (left-bound-info ,list? "An alist of properties for determining attachments of spanners to edges.") (left-padding ,ly:dimension? "The amount of space that is put @@ -564,8 +601,12 @@ whether to put a line break at this column. Can be @code{force} or if this column is the start of a system.") (line-count ,integer? "The number of staff lines.") (line-positions ,list? "Vertical positions of staff lines.") - (line-thickness ,number? "The thickness of the tie or slur -contour.") + (line-thickness ,number? "For slurs and ties, this is the +diameter of the virtual @qq{pen} that draws the two arcs of the +curve's outline, which intersect at the endpoints. This property is +expressed as a multiple of the current staff-line thickness (i.e. the +visual output is influenced by changes to +@code{@var{Staff}.StaffSymbol.thickness}).") (long-text ,markup? "Text markup. See @ruser{Formatting text}.") @@ -574,9 +615,6 @@ contour.") ;;; (max-beam-connect ,integer? "Maximum number of beams to connect to beams from this stem. Further beams are typeset as beamlets.") - (max-stretch ,number? "The maximum amount that this -@code{VerticalAxisGroup} can be vertically stretched (for example, in -order to better fill a page).") (maximum-gap ,number? "Maximum value allowed for @code{gap} property.") (measure-count ,integer? "The number of measures for a @@ -604,6 +642,11 @@ this long, normally in the horizontal direction. This requires an appropriate callback for the @code{springs-and-rods} property. If added to a @code{Tie}, this sets the minimum distance between noteheads.") + (minimum-length-after-break ,ly:dimension? "If set, try to make +a broken spanner starting a line this long. This requires an +appropriate callback for the @code{springs-and-rods} property. If +added to a @code{Tie}, this sets the minimum distance to the +notehead.") (minimum-length-fraction ,number? "Minimum length of ledger line as fraction of note head size.") (minimum-space ,ly:dimension? "Minimum distance that the victim @@ -632,7 +675,7 @@ object.") get stems extending to the middle staff line.") (non-break-align-symbols ,list? "A list of symbols that determine which NON-break-aligned interfaces to align this to.") - (non-default ,boolean? "Set for manually specified clefs.") + (non-default ,boolean? "Set for manually specified clefs and keys.") (non-musical ,boolean? "True if the grob belongs to a @code{NonMusicalPaperColumn}.") (nonstaff-nonstaff-spacing ,list? "The spacing alist @@ -665,6 +708,13 @@ over the total spanner, where the width of the spanner is normalized between 0 and 1.") (note-names ,vector? "Vector of strings containing names for easy-notation note heads.") + (note-collision-threshold ,ly:dimension? "Simultaneous notes that +are this close or closer in units of @code{staff-space} will be +identified as vertically colliding. Used by @code{Stem} grobs for notes +in the same voice, and @code{NoteCollision} grobs for notes in +different voices. Default value@tie{}1.") + (number-type ,symbol? "Numbering style. Choices include +@code{roman-lower}, @code{roman-upper} and @code{arabic}.") ;;; @@ -725,6 +775,19 @@ at a column with a negative penalty.") (page-turn-permission ,symbol? "Instructs the page breaker on whether to put a page turn at this column. Can be @code{force} or @code{allow}.") + (parent-alignment-X ,number? "Specify on which point +of the parent the object is aligned. The value @w{@code{-1}} means +aligned on parent's left edge, @code{0}@tie{}on@tie{}center, and +@code{1}@tie{}right edge, in X@tie{}direction. Other numerical +values may also be specified - the unit is half the parent's width. +If unset, the value from @code{self-alignment-X} property will be +used.") + (parent-alignment-Y ,number? "Like @code{parent-alignment-X} +but for the Y@tie{}axis.") + (parenthesis-friends ,list? "A list of Grob types, as symbols. +When parentheses enclose a Grob that has 'parenthesis-friends, the +parentheses widen to include any child Grobs with type among +'parenthesis-friends.") (parenthesized ,boolean? "Parenthesize this grob.") (positions ,number-pair? "Pair of staff coordinates @code{(@var{left} . @var{right})}, where both @var{left} and @@ -746,6 +809,12 @@ number, the quicker the slur attains its @code{height-limit}.") interesting items.") (remove-first ,boolean? "Remove the first staff of an orchestral score?") + (remove-layer ,integer? "The @code{Keep_alive_together_engraver} +removes all @code{VerticalAxisGroup} grobs with a @code{remove-layer} +larger than the smallest retained @code{remove-layer}. Set to +@code{#f} to make a layer invisible to the +@code{Keep_alive_together_engraver}, set to @code{'()} to have it not +participate in the layering decisions.") (replacement-alist ,list? "Alist of strings. The key is a string of the pattern to be replaced. The value is a string of what should be displayed. Useful for ligatures.") @@ -778,12 +847,20 @@ stem distance.") scripts in a stack, by being added to the position of the script in the user input, the sum being the overall priority. Smaller means closer to the head.") + (segno-kern ,number? "The space between the two thin lines +of the segno bar line symbol, expressed as a multiple of the +default staff-line thickness (i.e. the visual output is @emph{not} +influenced by changes to +@code{@var{Staff}.StaffSymbol.thickness}).") (self-alignment-X ,number? "Specify alignment of an object. The value @w{@code{-1}} means left aligned, @code{0}@tie{}centered, and @code{1}@tie{}right-aligned in X@tie{}direction. Other numerical -values may also be specified.") +values may also be specified - the unit is half the object width.") (self-alignment-Y ,number? "Like @code{self-alignment-X} but for the Y@tie{}axis.") + (shape ,symbol? "This setting determines what shape a grob +has. Valid choices depend on the @code{stencil} callback reading +this property.") (sharp-positions ,list? "Sharps in key signatures are placed within the specified ranges of staff-positions. The general form is a list of pairs, with one pair for each type of clef, in order @@ -795,9 +872,8 @@ ending at that staff-position.") (shorten-pair ,number-pair? "The lengths to shorten a text-spanner on both sides, for example a pedal bracket. Positive values shorten the text-spanner, while negative values lengthen it.") - (shortest-duration-space ,ly:dimension? "Start with this much -space for the shortest duration. This is expressed in -@code{spacing-increment} as unit. See also + (shortest-duration-space ,number? "Start with this multiple of +@code{spacing-increment} space for the shortest duration. See also @rinternals{spacing-spanner-interface}.") (shortest-playing-duration ,ly:moment? "The duration of the shortest note playing here.") @@ -812,7 +888,8 @@ placed vertically.") object.") (simple-Y ,boolean? "Should the Y placement of a spanner disregard changes in system heights?") - (size ,number? "Size of object, relative to standard size.") + (size ,number? "The ratio of the size of the object to its default +size.") (skip-quanting ,boolean? "Should beam quanting be skipped?") (skyline-horizontal-padding ,number? "For determining the vertical distance between two staves, it is possible to have a @@ -831,19 +908,78 @@ elements closer together.") (slur-padding ,number? "Extra distance between slur and script.") (snap-radius ,number? "The maximum distance between two objects that will cause them to snap to alignment along an axis.") - (space-alist ,list? "A table that specifies distances between -prefatory items, like clef and time-signature. The format is an alist -of spacing tuples: @code{(@var{break-align-symbol} @var{type} -. @var{distance})}, where @var{type} can be the symbols -@code{minimum-space} or @code{extra-space}.") + (space-alist ,list? "An alist that specifies distances from this +grob to other breakable items, using the format: + +@example +'((@var{break-align-symbol} . (@var{spacing-style} . @var{space})) + (@var{break-align-symbol} . (@var{spacing-style} . @var{space})) + ...) +@end example + +Standard choices for @w{@code{@var{break-align-symbol}}} are listed in +@rinternals{break-alignment-interface}. Additionally, three special +@w{break-align} symbols available to @w{@code{space-alist}} are: + +@quotation +@table @code +@item first-note +used when the grob is just left of the first note on a line + +@item next-note +used when the grob is just left of any other note; +if not set, the value of @code{first-note} gets used + +@item right-edge +used when the grob is the last item on the line (only compatible with +the @w{@code{extra-space}} spacing style) +@end table +@end quotation + +Choices for @code{@var{spacing-style}} are: + +@quotation +@table @code +@item extra-space +Put this much space between the two grobs. The space is stretchable +when paired with @w{@code{first-note}} or @w{@code{next-note}}; +otherwise it is fixed. + +@item minimum-space +Put at least this much space between the left sides of both grobs, +without allowing them to collide. The space is stretchable when paired +with @w{@code{first-note}} or @w{@code{next-note}}; otherwise it +is fixed. Not compatible with @w{@code{right-edge}}. + +@item fixed-space +Only compatible with @w{@code{first-note}} and +@w{@code{next-note}}. Put this much fixed space between the grob +and the note. + +@item minimum-fixed-space +Only compatible with @w{@code{first-note}} and +@w{@code{next-note}}. Put at least this much fixed space between +the left side of the grob and the left side of the note, without +allowing them to collide. + +@item semi-fixed-space +Only compatible with @w{@code{first-note}} and +@w{@code{next-note}}. Put this much space between the grob and +the note, such that half of the space is fixed and half is +stretchable. +@end table +@end quotation + +Rules for this spacing are much more complicated than this. +See [Wanske] page 126--134, [Ross] page 143--147.") (space-to-barline ,boolean? "If set, the distance between a note and the following non-musical column will be measured to the bar line instead of to the beginning of the non-musical column. If there is a clef change followed by a bar line, for example, this means that we will try to space the non-musical column as though the clef is not there.") - (spacing-increment ,number? "Add this much space for a doubled -duration. Typically, the width of a note head. See also + (spacing-increment ,ly:dimension? "The unit of length for +note-spacing. Typically, the width of a note head. See also @rinternals{spacing-spanner-interface}.") (spacing-pair ,pair? "A pair of alignment symbols which set an object's spacing relative to its left and right @code{BreakAlignment}s. @@ -953,11 +1089,17 @@ this property.") (text-direction ,ly:dir? "This controls the ordering of the words. The default @code{RIGHT} is for roman text. Arabic or Hebrew should use @code{LEFT}.") - (thick-thickness ,number? "Bar line thickness, measured in -@code{line-thickness}.") - (thickness ,number? "Line thickness, generally measured in -@code{line-thickness}.") - (thin-kern ,number? "The space after a hair-line in a bar line.") + (thick-thickness ,number? "Thickness of the thick line in a +bar line, expressed as a multiple of the default staff-line +thickness (i.e. the visual output is @emph{not} influenced by +changes to @code{@var{Staff}.StaffSymbol.thickness}).") + (thickness ,number? "For grobs made up of lines, this is the +thickness of the line. For slurs and ties, this is the distance +between the two arcs of the curve's outline at its thickest point, +not counting the diameter of the virtual @qq{pen} that draws the +arcs. This property is expressed as a multiple of the current +staff-line thickness (i.e. the visual output is influenced by +changes to @code{@var{Staff}.StaffSymbol.thickness}).") (tie-configuration ,list? "List of @code{(@var{position} . @var{dir})} pairs, indicating the desired tie configuration, where @var{position} is the offset from the center of the staff in staff @@ -969,9 +1111,15 @@ automatically.") line just before it would otherwise stop.") (toward-stem-shift ,number? "Amount by which scripts are shifted toward the stem if their direction coincides with the stem direction. -@code{0.0} means keep the default position (centered on the note -head), @code{1.0} means centered on the stem. Interpolated values are -possible.") +@code{0.0} means centered on the note head (the default position of +most scripts); @code{1.0} means centered on the stem. Interpolated +values are possible.") + (toward-stem-shift-in-column ,number? "Amount by which a script +is shifted toward the stem if its direction coincides with the stem +direction and it is associated with a @code{ScriptColumn} object. +@code{0.0} means centered on the note head (the default position of +most scripts); @code{1.0} means centered on the stem. Interpolated +values are possible.") (transparent ,boolean? "This makes the grob invisible.") @@ -979,8 +1127,8 @@ possible.") ;;; u ;;; (uniform-stretching ,boolean? "If set, items stretch -proportionally to their durations. This looks better in complex -polyphonic patterns.") +proportionally to their natural separation based on durations. +This looks better in complex polyphonic patterns.") (used ,boolean? "If set, this spacing column is kept in the spacing problem.") (usable-duration-logs ,list? "List of @code{duration-log}s that @@ -993,15 +1141,22 @@ positioning?") ;;; (vertical-skylines ,ly:skyline-pair? "Two skylines, one above and one below this grob.") + (voiced-position ,number? "The staff-position of a voiced +@code{Rest}, negative if the rest has @code{direction} @code{DOWN}.") ;;; ;;; w ;;; - (when ,ly:moment? "Global time step associated with this column -happen?") - (whiteout ,boolean? "If true, the grob is printed over a white -background to white-out underlying material, if the grob is visible. - Usually #f by default.") + (when ,ly:moment? "Global time step associated with this column.") + (whiteout ,boolean-or-number? "If a number or true, the grob is +printed over a white background to white-out underlying material, if +the grob is visible. A number indicates how far the white background +extends beyond the bounding box of the grob as a multiple of the +staff-line thickness. The shape of the background is determined by +@code{whiteout-style}. Usually @code{#f} by default.") + (whiteout-style ,symbol? "Determines the shape of the +@code{whiteout} background. Available are @code{'outline}, +@code{'rounded-box}, and the default @code{'box}.") (width ,ly:dimension? "The width of a grob measured in staff space.") (word-space ,ly:dimension? "Space to insert between words in @@ -1011,6 +1166,8 @@ texts.") ;;; ;;; x ;;; + (X-align-on-main-noteheads ,boolean? "If true, this grob will +ignore suspended noteheads when aligning itself on NoteColumn.") (X-extent ,number-pair? "Extent (size) in the X@tie{}direction, measured in staff-space units, relative to object's reference point.") (X-offset ,number? "The horizontal amount that this object is @@ -1125,10 +1282,13 @@ empty in a particular staff, then that staff is erased.") (keep-alive-with ,ly:grob-array? "An array of other @code{VerticalAxisGroup}s. If any of them are alive, then we will stay alive.") - (left-items ,ly:grob-array? "DOCME") + (left-items ,ly:grob-array? "Grobs organized on the left by a spacing +object.") (left-neighbor ,ly:grob? "The right-most column that has a spacing-wish for this column.") + (make-dead-when ,ly:grob-array? "An array of other +@code{VerticalAxisGroup}s. If any of them are alive, then we will turn dead.") (melody-spanner ,ly:grob? "The @code{MelodyItem} object for a stem.") (minimum-translations-alist ,list? "An list of translations for a given start and end point.") @@ -1142,8 +1302,6 @@ pure-from-neighbor-interface to determine various grob heights.") (note-heads ,ly:grob-array? "An array of note head grobs.") (pedal-text ,ly:grob? "A pointer to the text of a mixed-style piano pedal.") - (potential-X-colliding-grobs ,ly:grob-array? "Grobs that can potentially -collide with a self-aligned grob on the X-axis.") (pure-relevant-grobs ,ly:grob-array? "All the grobs (items and spanners) that are relevant for finding the @code{pure-Y-extent}") (pure-relevant-items ,ly:grob-array? "A subset of elements that are @@ -1156,13 +1314,18 @@ relevant for finding the @code{pure-Y-extent}.") (rest ,ly:grob? "A pointer to a @code{Rest} object.") (rest-collision ,ly:grob? "A rest collision that a rest is in.") (rests ,ly:grob-array? "An array of rest objects.") - (right-items ,ly:grob-array? "DOCME") + (right-items ,ly:grob-array? "Grobs organized on the right by +a spacing object.") (right-neighbor ,ly:grob? "See @code{left-neighbor}.") + (scripts ,ly:grob-array? "An array of @code{Script} objects.") (side-support-elements ,ly:grob-array? "The side support, an array of grobs.") (slur ,ly:grob? "A pointer to a @code{Slur} object.") (spacing ,ly:grob? "The spacing spanner governing this section.") + (space-increment ,ly:dimension? "The amount by which the total duration +of a multimeasure rest affects horizontal spacing. Each doubling of the +duration adds @code{space-increment} to the length of the bar.") (spacing-wishes ,ly:grob-array? "An array of note spacing or staff spacing objects.") (span-start ,boolean? "Is the note head at the start of a spanner?") @@ -1190,10 +1353,6 @@ results, use @code{LEFT} and @code{RIGHT}.") (vertical-skyline-elements ,ly:grob-array? "An array of grobs used to create vertical skylines.") - (X-colliding-grobs ,ly:grob-array? "Grobs that can collide -with a self-aligned grob on the X-axis.") - (Y-colliding-grobs ,ly:grob-array? "Grobs that can collide -with a self-aligned grob on the Y-axis.") (X-common ,ly:grob? "Common reference point for axis group.") (Y-common ,ly:grob? "See @code{X-common}.") @@ -1257,7 +1416,8 @@ to be within staff spaces.") (quantized-positions ,number-pair? "The beam positions after quanting.") - + (script-column ,ly:grob? "A @code{ScriptColumn} associated with a +@code{Script} object.") (script-stencil ,pair? "A pair @code{(@var{type} . @var{arg})} which acts as an index for looking up a @code{Stencil} object.") (shorten ,ly:dimension? "The amount of space that a stem is shortened. diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 1900ef8b57..f525edd69a 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -29,14 +29,16 @@ `( (Accidental . ( + (after-line-breaking . ,ly:accidental-interface::remove-tied) (alteration . ,accidental-interface::calc-alteration) (avoid-slur . inside) + (extra-spacing-width . (-0.2 . 0.0)) (glyph-name . ,accidental-interface::glyph-name) (glyph-name-alist . ,standard-alteration-glyph-name-alist) (stencil . ,ly:accidental-interface::print) (horizontal-skylines . ,(ly:make-unpure-pure-container ly:accidental-interface::horizontal-skylines)) (vertical-skylines . ,grob::unpure-vertical-skylines-from-stencil) - (X-extent . ,ly:accidental-interface::width) + (X-offset . ,ly:grob::x-parent-positioning) (Y-extent . ,accidental-interface::height) (meta . ((class . Item) (interfaces . (accidental-interface @@ -45,11 +47,13 @@ (AccidentalCautionary . ( + (after-line-breaking . ,ly:accidental-interface::remove-tied) (alteration . ,accidental-interface::calc-alteration) (avoid-slur . inside) (glyph-name-alist . ,standard-alteration-glyph-name-alist) (parenthesized . #t) (stencil . ,ly:accidental-interface::print) + (X-offset . ,ly:grob::x-parent-positioning) (Y-extent . ,accidental-interface::height) (meta . ((class . Item) (interfaces . (accidental-interface @@ -74,29 +78,26 @@ (AccidentalSuggestion . ( + (after-line-breaking . ,ly:accidental-interface::remove-tied) (alteration . ,accidental-interface::calc-alteration) (direction . ,UP) (font-size . -2) (glyph-name-alist . ,standard-alteration-glyph-name-alist) (outside-staff-priority . 0) + (parent-alignment-X . ,CENTER) (script-priority . 0) (self-alignment-X . ,CENTER) (side-axis . ,Y) (staff-padding . 0.25) (stencil . ,ly:accidental-interface::print) - (X-extent . ,ly:accidental-interface::width) - (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))))) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-extent . ,accidental-interface::height) (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Item) (interfaces . (accidental-interface accidental-suggestion-interface font-interface + outside-staff-interface script-interface self-alignment-interface side-position-interface)))))) @@ -131,7 +132,7 @@ (padding . 0.5) (side-axis . ,X) (stencil . ,ly:accidental-interface::print) - (X-offset . ,ly:side-position-interface::x-aligned-side) + (X-offset . ,ly:grob::x-parent-positioning) (Y-extent . ,accidental-interface::height) (meta . ((class . Item) (interfaces . (accidental-interface @@ -155,6 +156,7 @@ . ( (duration-log . 2) (glyph-name . ,note-head::calc-glyph-name) + (ignore-ambitus . #t) (stencil . ,ly:note-head::print) (Y-offset . ,staff-symbol-referencer::callback) (Y-extent . ,grob::always-Y-extent-from-stencil) @@ -168,7 +170,7 @@ (Arpeggio . ( - (cross-staff . ,ly:arpeggio::calc-cross-staff) + (cross-staff . ,ly:arpeggio::calc-cross-staff) (direction . ,LEFT) (padding . 0.5) (positions . ,ly:arpeggio::calc-positions) @@ -220,7 +222,7 @@ ;; TODO: ;; kern should scale with line-thickness too. (kern . 3.0) - (thin-kern . 3.0) + (segno-kern . 3.0) (hair-thickness . 1.9) (thick-thickness . 6.0) @@ -230,7 +232,7 @@ (space-alist . ( (time-signature . (extra-space . 0.75)) (custos . (minimum-space . 2.0)) - (clef . (minimum-space . 1.0)) + (clef . (extra-space . 1.0)) (key-signature . (extra-space . 1.0)) (key-cancellation . (extra-space . 1.0)) (first-note . (fixed-space . 1.3)) @@ -266,18 +268,14 @@ (self-alignment-X . ,RIGHT) (side-axis . ,Y) (stencil . ,ly:text-interface::print) - (X-offset . ,(ly:make-simple-closure - `(,+ - ,(ly:make-simple-closure - (list ly:break-alignable-interface::self-align-callback)) - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-aligned-on-self))))) + (X-offset . ,self-alignment-interface::self-aligned-on-breakable) (Y-offset . ,side-position-interface::y-aligned-side) (Y-extent . ,grob::always-Y-extent-from-stencil) (meta . ((class . Item) (interfaces . (break-alignable-interface font-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface)))))) @@ -321,6 +319,7 @@ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common) (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs))) (interfaces . (axis-group-interface + outside-staff-interface side-position-interface)))))) (BassFigureBracket @@ -348,7 +347,8 @@ (meta . ((class . Spanner) (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common) (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs))) - (interfaces . (axis-group-interface)))))) + (interfaces . (axis-group-interface + outside-staff-axis-group-interface)))))) (Beam @@ -523,6 +523,7 @@ (interfaces . (break-aligned-interface breathing-sign-interface font-interface + outside-staff-interface text-interface)))))) (ChordName @@ -538,6 +539,7 @@ (meta . ((class . Item) (interfaces . (chord-name-interface font-interface + outside-staff-interface rhythmic-grob-interface text-interface)))))) @@ -576,27 +578,27 @@ . ( (break-visibility . ,(grob::inherit-parent-property X 'break-visibility)) - (font-shape . italic) - (font-size . -4) - (transparent . ,(grob::inherit-parent-property - X 'transparent)) + (clef-alignments . ((G . (-0.2 . 0.1)) + (F . (-0.3 . -0.2)) + (C . (0 . 0)))) (color . ,(grob::inherit-parent-property X 'color)) + (font-shape . italic) + (font-size . -4) + (parent-alignment-X . ,ly:clef-modifier::calc-parent-alignment) (self-alignment-X . ,CENTER) (staff-padding . 0.7) (stencil . ,ly:text-interface::print) - (X-offset . ,(ly:make-simple-closure - `(,+ - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-aligned-on-self)) - ,(ly:make-simple-closure - (list ly:self-alignment-interface::centered-on-x-parent))))) - (Y-offset . ,side-position-interface::y-aligned-side) + (transparent . ,(grob::inherit-parent-property + X 'transparent)) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-extent . ,grob::always-Y-extent-from-stencil) + (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Item) (interfaces . (clef-modifier-interface font-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface)))))) @@ -628,16 +630,19 @@ (font-series . bold) (outside-staff-priority . 450) (padding . 0.5) + (parent-alignment-X . #f) (script-priority . 200) + (self-alignment-X . #f) (side-axis . ,Y) (staff-padding . 0.5) - ;; todo: add X self alignment? (stencil . ,ly:text-interface::print) - (X-offset . ,ly:self-alignment-interface::x-aligned-on-self) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-offset . ,side-position-interface::y-aligned-side) (Y-extent . ,grob::always-Y-extent-from-stencil) (meta . ((class . Item) (interfaces . (font-interface + outside-staff-interface + self-alignment-interface side-position-interface text-interface text-script-interface)))))) @@ -727,6 +732,7 @@ (DotColumn . ( (axes . (,X)) + (chord-dots-limit . 3) (direction . ,RIGHT) (positioning-done . ,ly:dot-column::calc-positioning-done) (X-extent . ,ly:axis-group-interface::width) @@ -742,6 +748,7 @@ (stencil . ,ly:dots::print) (Y-extent . ,grob::always-Y-extent-from-stencil) (extra-spacing-height . (-0.5 . 0.5)) + (extra-spacing-width . (0.0 . 0.2)) (meta . ((class . Item) (interfaces . (dots-interface font-interface @@ -771,20 +778,17 @@ (font-encoding . fetaText) (font-size . -2) (padding . 0.2) + (parent-alignment-X . ,CENTER) (self-alignment-X . ,CENTER) (side-axis . ,Y) (staff-padding . 0.25) (stencil . ,ly:text-interface::print) - (X-offset . ,(ly:make-simple-closure - `(,+ - ,(ly:make-simple-closure - (list ly:self-alignment-interface::centered-on-y-parent)) - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-aligned-on-self))))) - (Y-offset . ,side-position-interface::y-aligned-side) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-extent . ,grob::always-Y-extent-from-stencil) + (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Item) (interfaces . (font-interface + outside-staff-interface percent-repeat-interface percent-repeat-item-interface self-alignment-interface @@ -802,6 +806,7 @@ (thickness . 0.48) (meta . ((class . Item) (interfaces . (font-interface + outside-staff-interface percent-repeat-interface percent-repeat-item-interface rhythmic-grob-interface)))))) @@ -827,6 +832,7 @@ (interfaces . (axis-group-interface dynamic-interface dynamic-line-spanner-interface + outside-staff-interface side-position-interface)))))) (DynamicText @@ -834,25 +840,26 @@ ;; todo. - (collision-bias . -2.0) - (collision-padding . 0.5) (direction . ,ly:script-interface::calc-direction) (extra-spacing-width . (+inf.0 . -inf.0)) (font-encoding . fetaText) (font-series . bold) (font-shape . italic) + (parent-alignment-X . ,CENTER) (positioning-done . ,ly:script-interface::calc-positioning-done) (right-padding . 0.5) (self-alignment-X . ,CENTER) (stencil . ,ly:text-interface::print) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) (Y-extent . ,grob::always-Y-extent-from-stencil) - (X-offset . ,ly:self-alignment-interface::x-aligned-on-self) + (X-align-on-main-noteheads . #t) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-offset . ,(scale-by-font-size -0.6)) ; center on an 'm' (meta . ((class . Item) (interfaces . (dynamic-interface dynamic-text-interface font-interface + outside-staff-interface script-interface self-alignment-interface text-interface)))))) @@ -904,6 +911,11 @@ font-interface line-interface line-spanner-interface + ;for now, LilyPond never will typeset + ;these without a DynamicLineSpanner + ;as their controlling element + ;so, they do not need the + ;outside-staff-interface spanner-interface text-interface)))))) @@ -946,6 +958,8 @@ (font-encoding . fetaText) (font-size . -5) ; don't overlap when next to heads. (padding . 0.5) + (parent-alignment-X . ,CENTER) + (parent-alignment-Y . ,CENTER) (positioning-done . ,ly:script-interface::calc-positioning-done) (script-priority . 100) (self-alignment-X . ,CENTER) @@ -958,6 +972,7 @@ (meta . ((class . Item) (interfaces . (finger-interface font-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface @@ -1042,6 +1057,7 @@ (interfaces . (chord-name-interface font-interface fret-diagram-interface + outside-staff-interface rhythmic-grob-interface)))))) @@ -1054,6 +1070,7 @@ )) (left . ((attach-dir . ,RIGHT) (padding . 0.5) + (start-at-dot . #t) )) )) (cross-staff . ,ly:line-spanner::calc-cross-staff) @@ -1087,15 +1104,11 @@ (GridLine . ( (layer . 0) + (parent-alignment-X . ,CENTER) (self-alignment-X . ,CENTER) (stencil . ,ly:grid-line-interface::print) - (X-extent . ,ly:grid-line-interface::width) - (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))))) + (X-extent . ,ly:grid-line-interface::width) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (meta . ((class . Item) (interfaces . (grid-line-interface self-alignment-interface)))))) @@ -1129,6 +1142,7 @@ (interfaces . (dynamic-interface hairpin-interface line-interface + outside-staff-interface self-alignment-interface spanner-interface)))))) @@ -1146,6 +1160,7 @@ (meta . ((class . Spanner) (interfaces . (horizontal-bracket-interface line-interface + outside-staff-interface side-position-interface spanner-interface)))))) @@ -1163,7 +1178,8 @@ (interfaces . (font-interface self-alignment-interface side-position-interface - system-start-text-interface)))))) + system-start-text-interface + text-interface)))))) (InstrumentSwitch . ( @@ -1171,15 +1187,17 @@ (extra-spacing-width . (+inf.0 . -inf.0)) (outside-staff-priority . 500) (padding . 0.5) + (parent-alignment-X . #f) (self-alignment-X . ,LEFT) (side-axis . ,Y) (staff-padding . 0.5) (stencil . ,ly:text-interface::print) (Y-extent . ,grob::always-Y-extent-from-stencil) - (X-offset . ,ly:self-alignment-interface::x-aligned-on-self) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Item) (interfaces . (font-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface)))))) @@ -1199,7 +1217,8 @@ (key-signature . (extra-space . 0.5)) (cue-clef . (extra-space . 0.5)) (right-edge . (extra-space . 0.5)) - (first-note . (fixed-space . 2.5)))) + (first-note . (fixed-space . 2.5)) + (custos . (extra-space . 1.0)))) (stencil . ,ly:key-signature-interface::print) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) (Y-extent . ,grob::always-Y-extent-from-stencil) @@ -1299,9 +1318,8 @@ . ( (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor) (break-align-symbol . left-edge) - (break-visibility . ,center-invisible) + (break-visibility . ,begin-of-line-visible) (non-musical . #t) - (extra-spacing-height . (+inf.0 . -inf.0)) (space-alist . ( (ambitus . (extra-space . 2.0)) (breathing-sign . (minimum-space . 0.0)) @@ -1317,6 +1335,7 @@ (right-edge . (extra-space . 0.0)) )) (X-extent . (0 . 0)) + (Y-extent . (0 . 0)) (meta . ((class . Item) (interfaces . (break-aligned-interface)))))) @@ -1389,12 +1408,14 @@ (extra-spacing-height . (0.2 . -0.2)) (font-series . medium) (font-size . 1.0) + (parent-alignment-X . ()) (self-alignment-X . ,CENTER) (stencil . ,lyric-text::print) (text . ,(grob::calc-property-by-copy 'text)) (word-space . 0.6) (skyline-horizontal-padding . 0.1) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) + (X-align-on-main-noteheads . #t) (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-extent . ,grob::always-Y-extent-from-stencil) (meta . ((class . Item) @@ -1419,6 +1440,7 @@ (meta . ((class . Spanner) (interfaces . (font-interface measure-counter-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface)))))) @@ -1435,6 +1457,7 @@ (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Spanner) (interfaces . (measure-grouping-interface + outside-staff-interface side-position-interface)))))) (MelodyItem @@ -1458,6 +1481,7 @@ (break-visibility . ,end-of-line-invisible) (direction . ,UP) (extra-spacing-width . (+inf.0 . -inf.0)) + (flag-style . default) (outside-staff-horizontal-padding . 0.2) (outside-staff-priority . 1000) (padding . 0.8) @@ -1465,12 +1489,7 @@ (stencil . ,ly:text-interface::print) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) (Y-offset . ,side-position-interface::y-aligned-side) - (X-offset . ,(ly:make-simple-closure - `(,+ - ,(ly:make-simple-closure - (list ly:break-alignable-interface::self-align-callback)) - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-aligned-on-self))))) + (X-offset . ,self-alignment-interface::self-aligned-on-breakable) (self-alignment-X . ,LEFT) (break-align-symbols . (time-signature)) (non-break-align-symbols . (paper-column-interface)) @@ -1479,6 +1498,7 @@ (interfaces . (break-alignable-interface font-interface metronome-mark-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface)))))) @@ -1488,45 +1508,45 @@ (expand-limit . 10) (hair-thickness . 2.0) (round-up-exceptions . ()) - (padding . 1) + (bound-padding . 0.5) + (space-increment . 2.0) (spacing-pair . (break-alignment . break-alignment)) (springs-and-rods . ,ly:multi-measure-rest::set-spacing-rods) (stencil . ,ly:multi-measure-rest::print) (thick-thickness . 6.6) ;; See Wanske pp. 125 (usable-duration-logs . ,(iota 4 -3)) + (voiced-position . 4) (Y-extent . ,(ly:make-unpure-pure-container ly:multi-measure-rest::height)) (Y-offset . ,staff-symbol-referencer::callback) (meta . ((class . Spanner) (interfaces . (font-interface multi-measure-interface + outside-staff-interface multi-measure-rest-interface rest-interface staff-symbol-referencer-interface)))))) (MultiMeasureRestNumber . ( - (bound-padding . 2.0) + (bound-padding . 1.0) (direction . ,UP) (font-encoding . fetaText) (padding . 0.4) + (parent-alignment-X . ,CENTER) (self-alignment-X . ,CENTER) (side-axis . ,Y) (springs-and-rods . ,ly:multi-measure-rest::set-text-rods) (staff-padding . 0.4) (stencil . ,ly:text-interface::print) - (X-offset . ,(ly:make-simple-closure - `(,+ - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-aligned-on-self)) - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-centered-on-y-parent))))) - (Y-offset . ,side-position-interface::y-aligned-side) (vertical-skylines . ,grob::unpure-vertical-skylines-from-stencil) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-extent . ,grob::always-Y-extent-from-stencil) + (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Spanner) (interfaces . (font-interface multi-measure-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface)))))) @@ -1536,22 +1556,19 @@ (direction . ,UP) (outside-staff-priority . 450) (padding . 0.2) + (parent-alignment-X . ,CENTER) (self-alignment-X . ,CENTER) (skyline-horizontal-padding . 0.2) (staff-padding . 0.25) (stencil . ,ly:text-interface::print) - (X-offset . ,(ly:make-simple-closure - `(,+ - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-centered-on-y-parent)) - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-aligned-on-self))))) - (Y-offset . ,side-position-interface::y-aligned-side) (vertical-skylines . ,grob::unpure-vertical-skylines-from-stencil) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-extent . ,grob::always-Y-extent-from-stencil) + (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Spanner) (interfaces . (font-interface multi-measure-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface)))))) @@ -1588,6 +1605,7 @@ (NoteCollision . ( (axes . (,X ,Y)) + (note-collision-threshold . 1) (positioning-done . ,ly:note-collision-interface::calc-positioning-done) (prefer-dotted-right . #t) (X-extent . ,ly:axis-group-interface::width) @@ -1620,6 +1638,7 @@ (extra-spacing-height . ,ly:note-head::include-ledger-line-height) (glyph-name . ,note-head::calc-glyph-name) (ligature-flexa . #f) + (parenthesis-friends . (accidental-grob dot)) (stem-attachment . ,ly:note-head::calc-stem-attachment) (stencil . ,ly:note-head::print) (X-offset . ,ly:note-head::stem-x-shift) @@ -1662,12 +1681,12 @@ . ( (dash-fraction . 0.3) (direction . ,UP) - (edge-height . (0 . 1.2)) + (edge-height . (0 . 0.8)) (font-shape . italic) - (minimum-length . 1.0) + (minimum-length . 0.3) (outside-staff-priority . 400) (padding . 0.5) - (shorten-pair . (0.0 . -0.6)) + (shorten-pair . (-0.8 . -0.6)) (staff-padding . 2.0) (stencil . ,ly:ottava-bracket::print) (style . dashed-line) @@ -1677,6 +1696,7 @@ (interfaces . (font-interface horizontal-bracket-interface line-interface + outside-staff-interface ottava-bracket-interface side-position-interface text-interface)))))) @@ -1718,6 +1738,7 @@ ;; horizontal attachment. ParenthesesItem does not reserve ;; space of its own, however. (X-extent . (0 . 0)) + (Y-extent . ,parentheses-item::y-extent) (meta . ((class . Item) (interfaces . (font-interface parentheses-interface)))))) @@ -1742,20 +1763,17 @@ (font-encoding . fetaText) (font-size . -2) (padding . 0.2) + (parent-alignment-X . ,CENTER) (self-alignment-X . ,CENTER) (staff-padding . 0.25) (stencil . ,ly:text-interface::print) - (X-offset . ,(ly:make-simple-closure - `(,+ - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-centered-on-y-parent)) - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-aligned-on-self))))) - (Y-offset . ,side-position-interface::y-aligned-side) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-extent . ,grob::always-Y-extent-from-stencil) + (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Spanner) (interfaces . (font-interface percent-repeat-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface)))))) @@ -1776,7 +1794,8 @@ (vertical-skylines . ,(ly:make-unpure-pure-container ly:slur::vertical-skylines ly:grob::pure-simple-vertical-skylines-from-extents)) (Y-extent . ,slur::height) (meta . ((class . Spanner) - (interfaces . (slur-interface)))))) + (interfaces . (outside-staff-interface + slur-interface)))))) ;; an example of a text spanner (PianoPedalBracket @@ -1812,18 +1831,14 @@ (self-alignment-X . ,CENTER) (stencil . ,ly:text-interface::print) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) - (X-offset . ,(ly:make-simple-closure - `(,+ - ,(ly:make-simple-closure - (list ly:break-alignable-interface::self-align-callback)) - ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-aligned-on-self))))) + (X-offset . ,self-alignment-interface::self-aligned-on-breakable) (Y-offset . ,side-position-interface::y-aligned-side) (Y-extent . ,grob::always-Y-extent-from-stencil) (meta . ((class . Item) (interfaces . (break-alignable-interface font-interface mark-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface)))))) @@ -1858,7 +1873,6 @@ (RepeatTieColumn . ( - (direction . ,ly:tie::calc-direction) (head-direction . ,ly:semi-tie-column::calc-head-direction) (positioning-done . ,ly:semi-tie-column::calc-positioning-done) (X-extent . #f) @@ -1871,7 +1885,9 @@ (cross-staff . ,ly:rest::calc-cross-staff) (duration-log . ,stem::calc-duration-log) (minimum-distance . 0.25) + (parenthesis-friends . (dot)) (stencil . ,ly:rest::print) + (voiced-position . 4) (X-extent . ,ly:rest::width) (Y-extent . ,(ly:make-unpure-pure-container ly:rest::height ly:rest::pure-height)) (Y-offset . ,(ly:make-unpure-pure-container ly:rest::y-offset-callback)) @@ -1899,6 +1915,7 @@ (font-encoding . fetaMusic) (horizon-padding . 0.1) ; to avoid interleaving with accidentals (positioning-done . ,ly:script-interface::calc-positioning-done) + (self-alignment-X . ,CENTER) (side-axis . ,Y) ;; padding set in script definitions. @@ -1912,7 +1929,9 @@ (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Item) (interfaces . (font-interface + outside-staff-interface script-interface + self-alignment-interface side-position-interface)))))) (ScriptColumn @@ -1945,7 +1964,8 @@ (vertical-skylines . ,(ly:make-unpure-pure-container ly:slur::vertical-skylines ly:grob::pure-simple-vertical-skylines-from-extents)) (Y-extent . ,slur::height) (meta . ((class . Spanner) - (interfaces . (slur-interface)))))) + (interfaces . (outside-staff-interface + slur-interface)))))) (SostenutoPedal . ( @@ -1953,10 +1973,11 @@ (extra-spacing-width . (+inf.0 . -inf.0)) (font-shape . italic) (padding . 0.0) ;; padding relative to SostenutoPedalLineSpanner + (parent-alignment-X . #f) (self-alignment-X . ,CENTER) (stencil . ,ly:text-interface::print) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) - (X-offset . ,ly:self-alignment-interface::x-aligned-on-self) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-extent . ,grob::always-Y-extent-from-stencil) (meta . ((class . Item) (interfaces . (font-interface @@ -1981,6 +2002,7 @@ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common) (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs))) (interfaces . (axis-group-interface + outside-staff-interface piano-pedal-interface side-position-interface)))))) @@ -2050,6 +2072,7 @@ (StaffSymbol . ( + (break-align-symbols . (staff-bar break-alignment)) (layer . 0) (ledger-line-thickness . (1.0 . 0.1)) (line-count . 5) @@ -2103,7 +2126,7 @@ ;; Stems in unnatural (forced) direction should be shortened by ;; one staff space, according to [Roush & Gourlay]. ;; Flagged stems we shorten only half a staff space. - (stem-shorten . (1.0 0.5)) + (stem-shorten . (1.0 0.5 0.25)) )) @@ -2111,9 +2134,11 @@ ;; and the extreme minima as abolute minimum length. (direction . ,ly:stem::calc-direction) + (double-stem-separation . 0.5) (duration-log . ,stem::calc-duration-log) (length . ,(ly:make-unpure-pure-container ly:stem::calc-length ly:stem::pure-calc-length)) (neutral-direction . ,DOWN) + (note-collision-threshold . 1) (positioning-done . ,ly:stem::calc-positioning-done) (stem-info . ,ly:stem::calc-stem-info) (stem-begin-position . ,(ly:make-unpure-pure-container ly:stem::calc-stem-begin-position ly:stem::pure-calc-stem-begin-position)) @@ -2139,17 +2164,13 @@ (beam-thickness . 0.48) ; staff-space (beam-width . ,ly:stem-tremolo::calc-width) ; staff-space (direction . ,ly:stem-tremolo::calc-direction) + (parent-alignment-X . ,CENTER) (slope . ,ly:stem-tremolo::calc-slope) (stencil . ,ly:stem-tremolo::print) - (style . ,ly:stem-tremolo::calc-style) + (shape . ,ly:stem-tremolo::calc-shape) (X-extent . ,ly:stem-tremolo::width) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-extent . ,(grob::unpure-Y-extent-from-stencil ly:stem-tremolo::pure-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))))) (Y-offset . ,(ly:make-unpure-pure-container ly:stem-tremolo::calc-y-offset ly:stem-tremolo::pure-calc-y-offset)) (meta . ((class . Item) (interfaces . (self-alignment-interface @@ -2161,7 +2182,9 @@ (cross-staff . ,script-or-side-position-cross-staff) (font-encoding . fetaText) (font-size . -5) ; don't overlap when next to heads. + (number-type . arabic) (padding . 0.5) + (parent-alignment-X . ,CENTER) (script-priority . 100) (self-alignment-X . ,CENTER) (self-alignment-Y . ,CENTER) @@ -2172,7 +2195,9 @@ (meta . ((class . Item) (interfaces . (font-interface self-alignment-interface + outside-staff-interface side-position-interface + number-interface string-number-interface text-interface text-script-interface)))))) @@ -2183,6 +2208,7 @@ (font-shape . italic) (font-size . -4) ; don't overlap when next to heads. (padding . 0.5) + (parent-alignment-X . ,CENTER) (script-priority . 100) (self-alignment-X . ,CENTER) (self-alignment-Y . ,CENTER) @@ -2192,6 +2218,7 @@ (Y-extent . ,grob::always-Y-extent-from-stencil) (meta . ((class . Item) (interfaces . (font-interface + outside-staff-interface self-alignment-interface side-position-interface stroke-finger-interface @@ -2202,10 +2229,11 @@ . ( (extra-spacing-width . (+inf.0 . -inf.0)) (padding . 0.0) ;; padding relative to SustainPedalLineSpanner + (parent-alignment-X . #f) (self-alignment-X . ,CENTER) (stencil . ,ly:sustain-pedal::print) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) - (X-offset . ,ly:self-alignment-interface::x-aligned-on-self) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-extent . ,grob::always-Y-extent-from-stencil) (meta . ((class . Item) (interfaces . (font-interface @@ -2231,6 +2259,7 @@ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common) (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs))) (interfaces . (axis-group-interface + outside-staff-interface piano-pedal-interface side-position-interface)))))) @@ -2251,7 +2280,8 @@ (vertical-skyline-elements . ,ly:system::vertical-skyline-elements) (vertical-alignment . ,ly:system::get-vertical-alignment))) (interfaces . (axis-group-interface - system-interface)))))) + system-interface + outside-staff-axis-group-interface)))))) (SystemStartBar . ( @@ -2298,6 +2328,7 @@ (SystemStartSquare . ( + (collapse-height . 5.0) (direction . ,LEFT) (stencil . ,ly:system-start-delimiter::print) (style . line-bracket) @@ -2331,6 +2362,7 @@ (duration-log . ,note-head::calc-duration-log) (font-series . bold) (font-size . -2) + (parenthesis-friends . (dot)) (stem-attachment . (0.0 . 1.35)) (stencil . ,tab-note-head::print) (whiteout . #t) @@ -2349,7 +2381,7 @@ (TextScript . ( (avoid-slur . around) - (cross-staff . ,script-or-side-position-cross-staff) + (cross-staff . #f) (direction . ,DOWN) (extra-spacing-width . (+inf.0 . -inf.0)) (outside-staff-horizontal-padding . 0.2) @@ -2358,19 +2390,23 @@ ;; sync with Fingering ? (padding . 0.3) + (parent-alignment-X . #f) (script-priority . 200) + ;; self-alignment cannot be LEFT because of fingering diagrams. + (self-alignment-X . #f) (side-axis . ,Y) (slur-padding . 0.5) (staff-padding . 0.5) (stencil . ,ly:text-interface::print) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) - ;; todo: add X self alignment? (Y-extent . ,grob::always-Y-extent-from-stencil) - (X-offset . ,ly:self-alignment-interface::x-aligned-on-self) + (X-align-on-main-noteheads . #t) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (Y-offset . ,side-position-interface::y-aligned-side) (meta . ((class . Item) (interfaces . (font-interface instrument-specific-markup-interface + outside-staff-interface self-alignment-interface side-position-interface text-interface @@ -2404,6 +2440,7 @@ (interfaces . (font-interface line-interface line-spanner-interface + outside-staff-interface side-position-interface)))))) (Tie @@ -2501,9 +2538,9 @@ (axes . (,X)) (direction . ,RIGHT) (font-size . -4) - (horizon-padding . 0.1) ; to avoid interleaving with augmentation dots ;; minimum shift to the right, in case the parent note has no stem (minimum-space . 2.5) + (horizon-padding . 0.1) ; to avoid interleaving with augmentation dots (padding . 0.3) (side-axis . ,X) (stencil . ,parenthesize-elements) @@ -2557,6 +2594,7 @@ (interfaces . (font-interface line-interface line-spanner-interface + outside-staff-interface side-position-interface trill-spanner-interface)))))) @@ -2579,6 +2617,7 @@ (meta . ((class . Spanner) (interfaces . (line-interface + outside-staff-interface tuplet-bracket-interface)))))) (TupletNumber @@ -2588,12 +2627,14 @@ (direction . ,tuplet-number::calc-direction) (font-shape . italic) (font-size . -2) + (knee-to-beam . #t) (stencil . ,ly:tuplet-number::print) (text . ,tuplet-number::calc-denominator-text) (X-offset . ,ly:tuplet-number::calc-x-offset) (Y-offset . ,ly:tuplet-number::calc-y-offset) (meta . ((class . Spanner) (interfaces . (font-interface + outside-staff-interface text-interface tuplet-number-interface)))))) @@ -2604,11 +2645,12 @@ (extra-spacing-width . (+inf.0 . -inf.0)) (font-shape . italic) (padding . 0.0) ;; padding relative to UnaCordaPedalLineSpanner + (parent-alignment-X . #f) (self-alignment-X . ,CENTER) (stencil . ,ly:text-interface::print) (vertical-skylines . ,grob::always-vertical-skylines-from-stencil) (Y-extent . ,grob::always-Y-extent-from-stencil) - (X-offset . ,ly:self-alignment-interface::x-aligned-on-self) + (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent) (meta . ((class . Item) (interfaces . (font-interface piano-pedal-script-interface @@ -2632,6 +2674,7 @@ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common) (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs))) (interfaces . (axis-group-interface + outside-staff-interface piano-pedal-interface side-position-interface)))))) @@ -2683,7 +2726,8 @@ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs))) (interfaces . (axis-group-interface - hara-kiri-group-spanner-interface)))))) + hara-kiri-group-spanner-interface + outside-staff-axis-group-interface)))))) (VoiceFollower . ( @@ -2747,6 +2791,7 @@ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common) (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs))) (interfaces . (axis-group-interface + outside-staff-interface side-position-interface volta-interface)))))) @@ -2796,7 +2841,7 @@ (for-each (lambda (x) ;; (display (car x)) (newline) - (set-object-property! (car x) 'translation-type? list?) + (set-object-property! (car x) 'translation-type? ly:grob-properties?) (set-object-property! (car x) 'is-grob? #t)) all-grob-descriptions) diff --git a/scm/define-markup-commands.scm b/scm/define-markup-commands.scm index bbc9c6987d..a6c84b8f6e 100644 --- a/scm/define-markup-commands.scm +++ b/scm/define-markup-commands.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2000--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -115,6 +115,31 @@ empty-interval empty-interval)) (define-public point-stencil (ly:make-stencil "" '(0 . 0) '(0 . 0))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; line has to come early since it is often used implicitly from the +;; markup macro since \markup { a b c } -> \markup \line { a b c } +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define-markup-command (line layout props args) + (markup-list?) + #:category align + #:properties ((word-space) + (text-direction RIGHT)) + "Put @var{args} in a horizontal line. The property @code{word-space} +determines the space between markups in @var{args}. + +@lilypond[verbatim,quote] +\\markup { + \\line { + one two three + } +} +@end lilypond" + (let ((stencils (interpret-markup-list layout props args))) + (if (= text-direction LEFT) + (set! stencils (reverse stencils))) + (stack-stencil-line word-space stencils))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; geometric shapes ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -281,6 +306,87 @@ line-length. new-props (markup #:draw-dashed-line dest)))) +(define-markup-command (draw-squiggle-line layout props sq-length dest eq-end?) + (number? number-pair? boolean?) + #:category graphic + #:properties ((thickness 0.5) + (angularity 0) + (height 0.5) + (orientation 1)) + " +@cindex drawing squiggled lines within text + +A squiggled line. + +If @code{eq-end?} is set to @code{#t}, it is ensured the squiggled line ends +with a bow in same direction as the starting one. @code{sq-length} is the +length of the first bow. @code{dest} is the end point of the squiggled line. +To match @code{dest} the squiggled line is scaled accordingly. +Its appearance may be customized by overrides for @code{thickness}, +@code{angularity}, @code{height} and @code{orientation}. +@lilypond[verbatim,quote] +\\markup + \\column { + \\draw-squiggle-line #0.5 #'(6 . 0) ##t + \\override #'(orientation . -1) + \\draw-squiggle-line #0.5 #'(6 . 0) ##t + \\draw-squiggle-line #0.5 #'(6 . 0) ##f + \\override #'(height . 1) + \\draw-squiggle-line #0.5 #'(6 . 0) ##t + \\override #'(thickness . 5) + \\draw-squiggle-line #0.5 #'(6 . 0) ##t + \\override #'(angularity . 2) + \\draw-squiggle-line #0.5 #'(6 . 0) ##t + } +@end lilypond" + (let* ((line-thickness (ly:output-def-lookup layout 'line-thickness)) + (thick (* thickness line-thickness)) + (x (car dest)) + (y (cdr dest)) + (length-to-print (magnitude (make-rectangular x y))) + ;; Make a guess how many bows may be needed + (guess (max 1 (truncate (/ length-to-print sq-length)))) + ;; If `eq-end?' is set #t, make sure squiggle-line starts and ends + ;; with a bow in same direction + (amount (if (and (even? guess) eq-end?) (1+ guess) guess)) + ;; The lined-up bows needs to fit `length-to-print' + ;; Thus scale the length of first bow accordingly + ;; Other bows are copies + (guessed-squiggle-line-length (* amount sq-length)) + (line-length-diff (- length-to-print guessed-squiggle-line-length)) + (line-length-diff-for-each-squiggle + (/ line-length-diff amount)) + (first-bow-length (+ sq-length line-length-diff-for-each-squiggle)) + ;; Get first bows + ;; TODO two bows are created via `make-bow-stencil' + ;; cheaper to use `ly:stencil-scale'? + (first-bow-end-coord + (cons + (/ (* first-bow-length x) length-to-print) + (/ (* first-bow-length y) length-to-print))) + (init-bow + (lambda (o) + (make-bow-stencil + '(0 . 0) + first-bow-end-coord + thick angularity height o))) + (init-bow-up (init-bow orientation)) + (init-bow-down (init-bow (- orientation))) + ;; Get a list of starting-points for the bows + (list-of-starts + (map + (lambda (n) + (cons + (* n (car first-bow-end-coord)) + (* n (cdr first-bow-end-coord)))) + (iota amount)))) + ;; The final stencil: lined-up bows + (apply ly:stencil-add + (map + (lambda (stil pt) (ly:stencil-translate stil pt)) + (circular-list init-bow-up init-bow-down) + list-of-starts)))) + (define-markup-command (draw-hline layout props) () #:category graphic @@ -484,6 +590,16 @@ in the PDF backend. (ly:stencil-add (ly:make-stencil link-expr xextent yextent) stil))) +(define-public (book-first-page layout props) + "Return the @code{'first-page-number} of the entire book" + (define (ancestor layout) + "Return the topmost layout ancestor" + (let ((parent (ly:output-def-parent layout))) + (if (not (ly:output-def? parent)) + layout + (ancestor parent)))) + (ly:output-def-lookup (ancestor layout) 'first-page-number)) + (define-markup-command (with-link layout props label arg) (symbol? markup?) #:category other @@ -504,18 +620,23 @@ only works in the PDF backend. (x-ext (ly:stencil-extent arg-stencil X)) (y-ext (ly:stencil-extent arg-stencil Y))) (ly:stencil-add - (ly:make-stencil - `(delay-stencil-evaluation - ,(delay (let* ((table (ly:output-def-lookup layout 'label-page-table)) - (page-number (if (list? table) - (assoc-get label table) - #f))) - (list 'page-link page-number - `(quote ,x-ext) `(quote ,y-ext))))) - x-ext - y-ext) - arg-stencil))) - + (ly:make-stencil + `(delay-stencil-evaluation + ,(delay (let* ((table (ly:output-def-lookup layout 'label-page-table)) + (table-page-number + (if (list? table) + (assoc-get label table) + #f)) + (first-page-number (book-first-page layout props)) + (current-page-number + (if table-page-number + (1+ (- table-page-number first-page-number)) + #f))) + (list 'page-link current-page-number + `(quote ,x-ext) `(quote ,y-ext))))) + x-ext + y-ext) + arg-stencil))) (define-markup-command (beam layout props width slope thickness) (number? number? number?) @@ -568,12 +689,101 @@ thickness, and @code{offset} to determine line y-offset. @end lilypond" (let* ((thick (ly:output-def-lookup layout 'line-thickness)) (underline-thick (* thickness thick)) - (markup (interpret-markup layout props arg)) - (x1 (car (ly:stencil-extent markup X))) - (x2 (cdr (ly:stencil-extent markup X))) + (m (interpret-markup layout props arg)) + (x1 (car (ly:stencil-extent m X))) + (x2 (cdr (ly:stencil-extent m X))) (y (* thick (- offset))) (line (make-line-stencil underline-thick x1 y x2 y))) - (ly:stencil-add markup line))) + (ly:stencil-add m line))) + +(define-markup-command (tie layout props arg) + (markup?) + #:category font + #:properties ((thickness 1) + (offset 2) + (direction UP) + (shorten-pair '(0 . 0))) + " +@cindex tie-ing text + +Adds a horizontal bow created with @code{make-tie-stencil} at bottom or top +of @var{arg}. Looks at @code{thickness} to determine line thickness, and +@code{offset} to determine y-offset. The added bow fits the extent of +@var{arg}, @code{shorten-pair} may be used to modify this. +@var{direction} may be set using an @code{override} or direction-modifiers or +@code{voiceOne}, etc. + +@lilypond[verbatim,quote] +\\markup { + \\override #'(direction . 1) + \\tie \"above\" + \\override #'(direction . -1) + \\tie \"below\" +} +@end lilypond" + (let* ((line-thickness (ly:output-def-lookup layout 'line-thickness)) + (thick (* thickness line-thickness)) + (stil (interpret-markup layout props arg)) + (x1 (car (ly:stencil-extent stil X))) + (x2 (cdr (ly:stencil-extent stil X))) + (y-ext (ly:stencil-extent stil Y)) + (y (+ (* line-thickness offset direction) + ;; we put out zero for positive text-direction, to make it + ;; consistent with `underline-markup' + ;; TODO: this will be problematic for args like "Eng" + ;; fix it here _and_ in `underline-markup' + (if (negative? direction) 0 (cdr y-ext)))) + (tie + (make-tie-stencil + (cons (+ x1 (car shorten-pair) line-thickness) y) + (cons (- x2 (cdr shorten-pair) line-thickness) y) + thick + direction))) + (ly:stencil-add stil tie))) + +(define-markup-command (undertie layout props arg) + (markup?) + #:category font + #:properties (tie-markup) + " +@cindex undertie-ing text + +@lilypond[verbatim,quote] +\\markup \\line { + \\undertie \"undertied\" + \\override #'(offset . 5) + \\override #'(thickness . 1) + \\undertie \"undertied\" + \\override #'(offset . 1) + \\override #'(thickness . 5) + \\undertie \"undertied\" +} +@end lilypond" + (interpret-markup layout (prepend-alist-chain 'direction DOWN props) + (make-tie-markup arg))) + +(define-markup-command (overtie layout props arg) + (markup?) + #:category font + #:properties (tie-markup) + " +@cindex overtie-ing text + +Overtie @var{arg}. + +@lilypond[verbatim,quote] +\\markup \\line { + \\overtie \"overtied\" + \\override #'(offset . 5) + \\override #'(thickness . 1) + \\overtie \"overtied\" + \\override #'(offset . 1) + \\override #'(thickness . 5) + \\overtie \"overtied\" +} +@end lilypond" + (interpret-markup layout (prepend-alist-chain 'direction UP props) + (make-tie-markup arg))) (define-markup-command (box layout props arg) (markup?) @@ -682,19 +892,44 @@ Rotate object with @var{ang} degrees around its center. (define-markup-command (whiteout layout props arg) (markup?) #:category other + #:properties ((style 'box) + (thickness '())) " @cindex adding a white background to text -Provide a white background for @var{arg}. +Provide a white background for @var{arg}. The shape of the white +background is determined by @code{style}. The default +is @code{box} which produces a rectangle. @code{rounded-box} +produces a rounded rectangle. @code{outline} approximates the +outline of the markup. @lilypond[verbatim,quote] \\markup { \\combine - \\filled-box #'(-1 . 10) #'(-3 . 4) #1 - \\whiteout whiteout + \\filled-box #'(-1 . 15) #'(-3 . 4) #1 + \\override #'(thickness . 1.5) + \\whiteout whiteout-box +} +\\markup { + \\combine + \\filled-box #'(-1 . 24) #'(-3 . 4) #1 + \\override #'(style . rounded-box) + \\override #'(thickness . 3) + \\whiteout whiteout-rounded-box +} +\\markup { + \\combine + \\filled-box #'(-1 . 18) #'(-3 . 4) #1 + \\override #'(style . outline) + \\override #'(thickness . 3) + \\whiteout whiteout-outline } @end lilypond" - (stencil-whiteout (interpret-markup layout props arg))) + (stencil-whiteout + (interpret-markup layout props arg) + style + thickness + (ly:output-def-lookup layout 'line-thickness))) (define-markup-command (pad-markup layout props amount arg) (number? markup?) @@ -1016,6 +1251,27 @@ samplePath = X-extent Y-extent))) +(define-markup-list-command (score-lines layout props score) + (ly:score?) + "This is the same as the @code{\\score} markup but delivers its +systems as a list of lines. Its @var{score} argument is entered in +braces like it would be for @code{\\score}." + (let ((output (ly:score-embedded-format score layout))) + + (if (ly:music-output? output) + (map + (lambda (paper-system) + ;; shift such that the refpoint of the bottom staff of + ;; the first system is the baseline of the score + (ly:stencil-translate-axis + (paper-system-stencil paper-system) + (- (car (paper-system-staff-extents paper-system))) + Y)) + (vector->list (ly:paper-score-paper-systems output))) + (begin + (ly:warning (_"no systems found in \\score markup, does it have a \\layout block?")) + '())))) + (define-markup-command (score layout props score) (ly:score?) #:category music @@ -1068,24 +1324,8 @@ baseline. } } @end lilypond" - (let ((output (ly:score-embedded-format score layout))) - - (if (ly:music-output? output) - (let ((paper-systems - (vector->list - (ly:paper-score-paper-systems output)))) - (if (pair? paper-systems) - ;; shift such that the refpoint of the bottom staff of - ;; the first system is the baseline of the score - (ly:stencil-translate-axis - (stack-stencils Y DOWN baseline-skip - (map paper-system-stencil paper-systems)) - (- (car (paper-system-staff-extents (car paper-systems)))) - Y) - empty-stencil)) - (begin - (ly:warning (_"no systems found in \\score markup, does it have a \\layout block?")) - empty-stencil)))) + (stack-stencils Y DOWN baseline-skip + (score-lines-markup-list layout props score))) (define-markup-command (null layout props) () @@ -1127,92 +1367,148 @@ the use of @code{\\simple} is unnecessary. @end lilypond" (interpret-markup layout props str)) -(define-markup-command (tied-lyric layout props str) - (string?) - #:category music - #:properties ((word-space)) - " -@cindex simple text strings with tie characters - -Like simple-markup, but use tie characters for @q{~} tilde symbols. +(define-markup-command (first-visible layout props args) + (markup-list?) + #:category other + "Use the first markup in @var{args} that yields a non-empty stencil +and ignore the rest. @lilypond[verbatim,quote] -\\markup \\column { - \\tied-lyric #\"Siam navi~all'onde~algenti Lasciate~in abbandono\" - \\tied-lyric #\"Impetuosi venti I nostri~affetti sono\" - \\tied-lyric #\"Ogni diletto~e scoglio Tutta la vita~e~un mar.\" +\\markup { + \\first-visible { + \\fromproperty #'header:composer + \\italic Unknown + } } @end lilypond" - (define (replace-ties tie str) - (if (string-contains str "~") - (let* - ((half-space (/ word-space 2)) - (parts (string-split str #\~)) - (tie-str (markup #:hspace half-space - #:musicglyph tie - #:hspace half-space)) - (joined (list-join parts tie-str))) - (make-concat-markup joined)) - str)) - - (define short-tie-regexp (make-regexp "~[^.]~")) - (define (match-short str) (regexp-exec short-tie-regexp str)) - - (define (replace-short str mkp) - (let ((match (match-short str))) - (if (not match) - (make-concat-markup (list - mkp - (replace-ties "ties.lyric.default" str))) - (let ((new-str (match:suffix match)) - (new-mkp (make-concat-markup (list - mkp - (replace-ties "ties.lyric.default" - (match:prefix match)) - (replace-ties "ties.lyric.short" - (match:substring match)))))) - (replace-short new-str new-mkp))))) - - (interpret-markup layout - props - (replace-short str (markup)))) + (define (false-if-empty stencil) + (if (ly:stencil-empty? stencil) #f stencil)) + (or + (any + (lambda (m) + (if (markup? m) + (false-if-empty (interpret-markup layout props m)) + (any false-if-empty (interpret-markup-list layout props (list m))))) + args) + empty-stencil)) (define-public empty-markup (make-simple-markup "")) ;; helper for justifying lines. -(define (get-fill-space word-count line-width word-space text-widths) - "Calculate the necessary paddings between each two adjacent texts. - The lengths of all texts are stored in @var{text-widths}. - The normal formula for the padding between texts a and b is: - padding = line-width/(word-count - 1) - (length(a) + length(b))/2 - The first and last padding have to be calculated specially using the - whole length of the first or last text. - All paddings are checked to be at least word-space, to ensure that - no texts collide. - Return a list of paddings." +(define (get-fill-space + word-count line-width word-space text-widths constant-space?) + "Calculate the necessary paddings between adjacent texts in a +single justified line. The lengths of all texts are stored in +@var{text-widths}. +When @var{constant-space?} is @code{#t}, the formula for the padding +between texts is: +padding = (line-width - total-text-width)/(word-count - 1) +When @var{constant-space?} is @code{#f}, the formula for the +padding between interior texts a and b is: +padding = line-width/(word-count - 1) - (length(a) + length(b))/2 +In this case, the first and last padding have to be calculated +specially using the whole length of the first or last text. +All paddings are checked to be at least word-space, to ensure that +no texts collide. +Return a list of paddings." (cond - ((null? text-widths) '()) - - ;; special case first padding - ((= (length text-widths) word-count) - (cons - (- (- (/ line-width (1- word-count)) (car text-widths)) - (/ (car (cdr text-widths)) 2)) - (get-fill-space word-count line-width word-space (cdr text-widths)))) - ;; special case last padding - ((= (length text-widths) 2) - (list (- (/ line-width (1- word-count)) - (+ (/ (car text-widths) 2) (car (cdr text-widths)))) 0)) - (else - (let ((default-padding - (- (/ line-width (1- word-count)) - (/ (+ (car text-widths) (car (cdr text-widths))) 2)))) - (cons - (if (> word-space default-padding) - word-space - default-padding) - (get-fill-space word-count line-width word-space (cdr text-widths))))))) + ((null? text-widths) '()) + (constant-space? + (make-list + (1- word-count) + ;; Ensure that space between words cannot be + ;; less than word-space. + (max + word-space + (/ (- line-width (apply + text-widths)) + (1- word-count))))) + + ;; special case first padding + ((= (length text-widths) word-count) + (cons + (- (- (/ line-width (1- word-count)) (car text-widths)) + (/ (cadr text-widths) 2)) + (get-fill-space + word-count line-width word-space (cdr text-widths) + constant-space?))) + ;; special case last padding + ((= (length text-widths) 2) + (list (- (/ line-width (1- word-count)) + (+ (/ (car text-widths) 2) (cadr text-widths))) + 0)) + (else + (let ((default-padding + (- (/ line-width (1- word-count)) + (/ (+ (car text-widths) (cadr text-widths)) 2)))) + (cons + (if (> word-space default-padding) + word-space + default-padding) + (get-fill-space + word-count line-width word-space (cdr text-widths) + constant-space?)))))) + +(define (justify-line-helper + layout props args text-direction word-space line-width constant-space?) + "Return a stencil which spreads @var{args} along a line of width +@var{line-width}. If @var{constant-space?} is set to @code{#t}, the +space between words is constant. If @code{#f}, the distance between +words varies according to their relative lengths." + (let* ((orig-stencils (interpret-markup-list layout props args)) + (stencils + (map (lambda (stc) + (if (ly:stencil-empty? stc X) + (ly:make-stencil (ly:stencil-expr stc) + '(0 . 0) (ly:stencil-extent stc Y)) + stc)) + orig-stencils)) + (text-widths + (map (lambda (stc) + (interval-length (ly:stencil-extent stc X))) + stencils)) + (text-width (apply + text-widths)) + (word-count (length stencils)) + (line-width (or line-width (ly:output-def-lookup layout 'line-width))) + (fill-space + (cond + ((= word-count 1) + (list + (/ (- line-width text-width) 2) + (/ (- line-width text-width) 2))) + ((= word-count 2) + (list + (- line-width text-width))) + (else + (get-fill-space + word-count line-width word-space text-widths + constant-space?)))) + (line-contents (if (= word-count 1) + (list + point-stencil + (car stencils) + point-stencil) + stencils))) + + (if (null? (remove ly:stencil-empty? orig-stencils)) + empty-stencil + (begin + (if (= text-direction LEFT) + (set! line-contents (reverse line-contents))) + (set! line-contents + (stack-stencils-padding-list + X RIGHT fill-space line-contents)) + (if (> word-count 1) + ;; shift s.t. stencils align on the left edge, even if + ;; first stencil had negative X-extent (e.g. center-column) + ;; (if word-count = 1, X-extents are already normalized in + ;; the definition of line-contents) + (set! line-contents + (ly:stencil-translate-axis + line-contents + (- (car (ly:stencil-extent (car stencils) X))) + X))) + line-contents)))) (define-markup-command (fill-line layout props args) (markup-list?) @@ -1241,79 +1537,28 @@ If there are no arguments, return an empty stencil. } } @end lilypond" - (let* ((orig-stencils (interpret-markup-list layout props args)) - (stencils - (map (lambda (stc) - (if (ly:stencil-empty? stc) - point-stencil - stc)) orig-stencils)) - (text-widths - (map (lambda (stc) - (if (ly:stencil-empty? stc) - 0.0 - (interval-length (ly:stencil-extent stc X)))) - stencils)) - (text-width (apply + text-widths)) - (word-count (length stencils)) - (line-width (or line-width (ly:output-def-lookup layout 'line-width))) - (fill-space - (cond - ((= word-count 1) - (list - (/ (- line-width text-width) 2) - (/ (- line-width text-width) 2))) - ((= word-count 2) - (list - (- line-width text-width))) - (else - (get-fill-space word-count line-width word-space text-widths)))) - - (line-contents (if (= word-count 1) - (list - point-stencil - (car stencils) - point-stencil) - stencils))) + (justify-line-helper + layout props args text-direction word-space line-width #f)) - (if (null? (remove ly:stencil-empty? orig-stencils)) - empty-stencil - (begin - (if (= text-direction LEFT) - (set! line-contents (reverse line-contents))) - (set! line-contents - (stack-stencils-padding-list - X RIGHT fill-space line-contents)) - (if (> word-count 1) - ;; shift s.t. stencils align on the left edge, even if - ;; first stencil had negative X-extent (e.g. center-column) - ;; (if word-count = 1, X-extents are already normalized in - ;; the definition of line-contents) - (set! line-contents - (ly:stencil-translate-axis - line-contents - (- (car (ly:stencil-extent (car stencils) X))) - X))) - line-contents)))) - -(define-markup-command (line layout props args) +(define-markup-command (justify-line layout props args) (markup-list?) #:category align - #:properties ((word-space) - (text-direction RIGHT)) - "Put @var{args} in a horizontal line. The property @code{word-space} -determines the space between markups in @var{args}. + #:properties ((text-direction RIGHT) + (word-space 0.6) + (line-width #f)) + "Put @var{markups} in a horizontal line of width @var{line-width}. +The markups are spread to fill the entire line and separated by equal +space. If there are no arguments, return an empty stencil. @lilypond[verbatim,quote] \\markup { - \\line { - one two three + \\justify-line { + Space between neighboring words is constant } } @end lilypond" - (let ((stencils (interpret-markup-list layout props args))) - (if (= text-direction LEFT) - (set! stencils (reverse stencils))) - (stack-stencil-line word-space stencils))) + (justify-line-helper + layout props args text-direction word-space line-width #t)) (define-markup-command (concat layout props args) (markup-list?) @@ -1338,11 +1583,13 @@ equivalent to @code{\"fi\"}. @end lilypond" (define (concat-string-args arg-list) (fold-right (lambda (arg result-list) - (let ((result (if (pair? result-list) - (car result-list) - '()))) - (if (and (pair? arg) (eqv? (car arg) simple-markup)) - (set! arg (cadr arg))) + (let ((result (and (pair? result-list) + (car result-list)))) + (cond ((not (pair? arg))) + ((eq? (car arg) simple-markup) + (set! arg (cadr arg))) + ((eq? (car arg) char-markup) + (set! arg (ly:wide-char->utf-8 (cadr arg))))) (if (and (string? result) (string? arg)) (cons (string-append arg result) (cdr result-list)) (cons arg result-list)))) @@ -1364,8 +1611,8 @@ equivalent to @code{\"fi\"}. "Perform simple wordwrap, return stencil of each line." (define space (if justify ;; justify only stretches lines. - (* 0.7 base-space) - base-space)) + (* 0.7 base-space) + base-space)) (define (stencil-len s) (interval-end (ly:stencil-extent s X))) (define (maybe-shift line) @@ -1665,11 +1912,7 @@ the line width, where @var{X} is the number of staff spaces. Print two markups on top of each other. Note: @code{\\combine} cannot take a list of markups enclosed in -curly braces as an argument; the follow example will not compile: - -@example -\\combine @{ a list @} -@end example +curly braces as an argument; for this purpose use @code{\\overlay} instead. @lilypond[verbatim,quote] \\markup { @@ -1684,6 +1927,27 @@ curly braces as an argument; the follow example will not compile: (s2 (interpret-markup layout props arg2))) (ly:stencil-add s1 s2))) +(define-markup-command (overlay layout props args) + (markup-list?) + #:category align + " +@cindex merging text + +Takes a list of markups combining them. + +@lilypond[verbatim,quote] +\\markup { + \\fontsize #5 + \\override #'(thickness . 2) + \\overlay { + \\draw-line #'(0 . 4) + \\arrow-head #Y #DOWN ##f + \\translate #'(0 . 4)\\arrow-head #Y #UP ##f + } +} +@end lilypond" + (apply ly:stencil-add (interpret-markup-list layout props args))) + ;; ;; TODO: should extract baseline-skip from each argument somehow.. ;; @@ -1987,6 +2251,16 @@ Set the dimensions of @var{arg} to @var{x} and@tie{}@var{y}." `(delay-stencil-evaluation ,(delay expr)) x y)))) +(define-markup-command (with-dimensions-from layout props arg1 arg2) + (markup? markup?) + #:category other + " +Print @var{arg2} with the dimensions of @var{arg1}." + (let* ((stil1 (interpret-markup layout props arg1)) + (x (ly:stencil-extent stil1 0)) + (y (ly:stencil-extent stil1 1))) + (interpret-markup layout props (markup #:with-dimensions x y arg2)))) + (define-markup-command (pad-around layout props amount arg) (number? markup?) #:category align @@ -2158,12 +2432,9 @@ returns an empty markup. (procedure? markup?) #:category other "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)))) - (set-object-property! anonymous-with-signature - 'markup-signature - (list markup?)) - (interpret-markup layout props (list anonymous-with-signature arg)))) +@var{procedure} takes the same arguments as @code{interpret-markup} +and returns a stencil." + (procedure layout props arg)) (define-markup-command (footnote layout props mkup note) (markup? markup?) @@ -2367,7 +2638,7 @@ may be any property supported by @rinternals{font-interface}, (define-markup-command (abs-fontsize layout props size arg) (number? markup?) #:category font - "Use @var{size} as the absolute font size to display @var{arg}. + "Use @var{size} as the absolute font size (in points) to display @var{arg}. Adjusts @code{baseline-skip} and @code{word-space} accordingly. @lilypond[verbatim,quote] @@ -2985,6 +3256,56 @@ Draw @var{arg} in color specified by @var{color}. (ly:stencil-extent stil X) (ly:stencil-extent stil Y)))) +(define-markup-command (tied-lyric layout props str) + (string?) + #:category music + #:properties ((word-space)) + " +@cindex simple text strings with tie characters + +Like simple-markup, but use tie characters for @q{~} tilde symbols. + +@lilypond[verbatim,quote] +\\markup \\column { + \\tied-lyric #\"Siam navi~all'onde~algenti Lasciate~in abbandono\" + \\tied-lyric #\"Impetuosi venti I nostri~affetti sono\" + \\tied-lyric #\"Ogni diletto~e scoglio Tutta la vita~e~un mar.\" +} +@end lilypond" + (define (replace-ties tie str) + (if (string-contains str "~") + (let* + ((half-space (/ word-space 2)) + (parts (string-split str #\~)) + (tie-str (markup #:hspace half-space + #:musicglyph tie + #:hspace half-space)) + (joined (list-join parts tie-str))) + (make-concat-markup joined)) + str)) + + (define short-tie-regexp (make-regexp "~[^.]~")) + (define (match-short str) (regexp-exec short-tie-regexp str)) + + (define (replace-short str mkp) + (let ((match (match-short str))) + (if (not match) + (make-concat-markup (list + mkp + (replace-ties "ties.lyric.default" str))) + (let ((new-str (match:suffix match)) + (new-mkp (make-concat-markup (list + mkp + (replace-ties "ties.lyric.default" + (match:prefix match)) + (replace-ties "ties.lyric.short" + (match:substring match)))))) + (replace-short new-str new-mkp))))) + + (interpret-markup layout + props + (replace-short str (markup)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; glyphs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -3313,9 +3634,12 @@ A feta brace in point size @var{size}, rotated 180 degrees. Construct a note symbol, with stem and flag. By using fractional values for @var{dir}, longer or shorter stems can be obtained. -Supports all note-head-styles. +Supports all note-head-styles. Ancient note-head-styles will get +mensural-style-flags. @code{flag-style} may be overridden independently. Supported flag-styles are @code{default}, @code{old-straight-flag}, -@code{modern-straight-flag} and @code{flat-flag}. +@code{modern-straight-flag}, @code{flat-flag}, @code{mensural} and +@code{neomensural}. The latter two flag-styles will both result in +mensural-flags. Both are supplied for convenience. @lilypond[verbatim,quote] \\markup { @@ -3326,7 +3650,8 @@ Supported flag-styles are @code{default}, @code{old-straight-flag}, @end lilypond" (define (get-glyph-name-candidates dir log style) (map (lambda (dir-name) - (format #f "noteheads.~a~a" dir-name + (format #f "noteheads.~a~a" + dir-name (if (and (symbol? style) (not (equal? 'default style))) (select-head-glyph style (min log 2)) @@ -3383,24 +3708,17 @@ Supported flag-styles are @code{default}, @code{old-straight-flag}, (thickness-offset (cons 0 (* -1 thickness dir))) (spacing (* -1 flag-spacing factor dir)) (start (cons (- half-stem-thickness) (* half-stem-thickness dir))) - ;; The points of a round-filled-polygon need to be given in - ;; clockwise order, otherwise the polygon will be enlarged by - ;; blot-size*2! - (points (if stem-up - (list start - flag-end - (offset-add flag-end thickness-offset) - (offset-add start thickness-offset)) - (list start - (offset-add start thickness-offset) - (offset-add flag-end thickness-offset) - flag-end))) + (points (list start + flag-end + (offset-add flag-end thickness-offset) + (offset-add start thickness-offset))) (stencil (ly:round-filled-polygon points half-stem-thickness)) ;; Log for 1/8 is 3, so we need to subtract 3 (flag-stencil (buildflags stencil (- log 3) stencil spacing))) flag-stencil)) - (let* ((font (ly:paper-get-font layout (cons '((font-encoding . fetaMusic)) + (let* ((font (ly:paper-get-font layout (cons '((font-encoding . fetaMusic) + (font-name . #f)) props))) (size-factor (magstep font-size)) (blot (ly:output-def-lookup layout 'blot-diameter)) @@ -3419,7 +3737,9 @@ Supported flag-styles are @code{default}, @code{old-straight-flag}, (sign dir) log 'default)) result))) (head-glyph (ly:font-get-glyph font head-glyph-name)) - (ancient-flags? (or (eq? style 'mensural) (eq? style 'neomensural))) + (ancient-flags? + (member style + '(mensural neomensural petrucci semipetrucci blackpetrucci))) (attach-indices (ly:note-head::stem-attachment font head-glyph-name)) (stem-length (* size-factor (max 3 (- log 1)))) ;; With ancient-flags we want a tighter stem @@ -3435,7 +3755,10 @@ Supported flag-styles are @code{default}, @code{old-straight-flag}, (cdr attach-indices))))) ;; For a tighter stem (with ancient-flags) the stem-width has to be ;; adjusted. - (stem-X-corr (if ancient-flags? (* 0.5 dir stem-thickness) 0)) + (stem-X-corr + (if (or ancient-flags? + (member flag-style '(mensural neomensural))) + (* 0.5 dir stem-thickness) 0)) (stem-glyph (and (> log 0) (ly:round-filled-box (ordered-cons (+ stem-X-corr (car attach-off)) @@ -3473,11 +3796,15 @@ Supported flag-styles are @code{default}, @code{old-straight-flag}, flat-flag) (else (ly:font-get-glyph font - (format #f (if ancient-flags? - "flags.mensural~a2~a" - "flags.~a~a") - (if (> dir 0) "u" "d") - log)))) + (format #f + (if (or (member flag-style + '(mensural neomensural)) + (and ancient-flags? + (null? flag-style))) + "flags.mensural~a2~a" + "flags.~a~a") + (if (> dir 0) "u" "d") + log)))) (cons (+ (car attach-off) ;; For tighter stems (with ancient-flags) the ;; flag has to be adjusted different. @@ -3616,7 +3943,9 @@ A rest or multi-measure-rest symbol. (let* ((font (ly:paper-get-font layout - (cons '((font-encoding . fetaMusic)) props))) + (cons '((font-encoding . fetaMusic) + (font-name . #f)) + props))) (rest-glyph-name (let ((result (get-glyph-name font @@ -3824,7 +4153,7 @@ an inverted glyph. Note that within music, one would usually use the @code{\\fermata} articulation instead of a markup. @lilypond[verbatim,quote] - { c1^\\markup \\fermata d1_\\markup \\fermata } + { c''1^\\markup \\fermata d''1_\\markup \\fermata } \\markup { \\fermata \\override #`(direction . ,DOWN) \\fermata } @end lilypond @@ -3953,7 +4282,7 @@ Make a fraction of two markups. (define-markup-command (normal-size-super layout props arg) (markup?) #:category font - #:properties ((baseline-skip)) + #:properties ((font-size 0)) " @cindex setting superscript in standard font size @@ -3969,13 +4298,12 @@ Set @var{arg} in superscript with a normal font size. @end lilypond" (ly:stencil-translate-axis (interpret-markup layout props arg) - (* 0.5 baseline-skip) Y)) + (* 1.0 (magstep font-size)) Y)) (define-markup-command (super layout props arg) (markup?) #:category font - #:properties ((font-size 0) - (baseline-skip)) + #:properties ((font-size 0)) " @cindex superscript text @@ -3996,7 +4324,7 @@ Set @var{arg} in superscript. layout (cons `((font-size . ,(- font-size 3))) props) arg) - (* 0.5 baseline-skip) + (* 1.0 (magstep font-size)) ; original font-size Y)) (define-markup-command (translate layout props offset arg) @@ -4021,8 +4349,7 @@ is a pair of numbers representing the displacement in the X and Y axis. (define-markup-command (sub layout props arg) (markup?) #:category font - #:properties ((font-size 0) - (baseline-skip)) + #:properties ((font-size 0)) " @cindex subscript text @@ -4044,13 +4371,13 @@ Set @var{arg} in subscript. layout (cons `((font-size . ,(- font-size 3))) props) arg) - (* -0.5 baseline-skip) + (* -0.75 (magstep font-size)) ; original font-size Y)) (define-markup-command (normal-size-sub layout props arg) (markup?) #:category font - #:properties ((baseline-skip)) + #:properties ((font-size 0)) " @cindex setting subscript in standard font size @@ -4066,7 +4393,7 @@ Set @var{arg} in subscript with a normal font size. @end lilypond" (ly:stencil-translate-axis (interpret-markup layout props arg) - (* -0.5 baseline-skip) + (* -0.75 (magstep font-size)) Y)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -4147,7 +4474,7 @@ a column containing several lines of text. } } @end lilypond" - (let* ((markup (interpret-markup layout props arg)) + (let* ((m (interpret-markup layout props arg)) (scaled-width (* size width)) (scaled-thickness (* (chain-assoc-get 'line-thickness props 0.1) @@ -4157,7 +4484,7 @@ a column containing several lines of text. (* (/ 4 3.0) scaled-width))) (padding (chain-assoc-get 'padding props half-thickness))) (parenthesize-stencil - markup half-thickness scaled-width angularity padding))) + m half-thickness scaled-width angularity padding))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -4173,7 +4500,11 @@ a column containing several lines of text. Reference to a page number. @var{label} is the label set on the referenced page (using the @code{\\label} command), @var{gauge} a markup used to estimate the maximum width of the page number, and @var{default} the value to display -when @var{label} is not found." +when @var{label} is not found. + +(If the current book or bookpart is set to use roman numerals for page numbers, +the reference will be formatted accordingly -- in which case the @var{gauge}'s +width may require additional tweaking.)" (let* ((gauge-stencil (interpret-markup layout props gauge)) (x-ext (ly:stencil-extent gauge-stencil X)) (y-ext (ly:stencil-extent gauge-stencil Y))) @@ -4186,7 +4517,10 @@ when @var{label} is not found." (page-number (if (list? table) (assoc-get label table) #f)) - (page-markup (if page-number (format #f "~a" page-number) default)) + (number-type (ly:output-def-lookup layout 'page-number-type)) + (page-markup (if page-number + (number-format number-type page-number) + default)) (page-stencil (interpret-markup layout props page-markup)) (gap (- (interval-length x-ext) (interval-length (ly:stencil-extent page-stencil X))))) @@ -4389,6 +4723,152 @@ where @var{X} is the number of staff spaces." "Like @code{\\override}, for markup lists." (interpret-markup-list layout (cons (list new-prop) props) args)) +(define-markup-list-command (table layout props column-align lst) + (number-list? markup-list?) + #:properties ((padding 0) + (baseline-skip)) + "@cindex creating a table. + +Returns a table. + +@var{column-align} specifies how each column is aligned, possible values are +-1, 0, 1. The number of elements in @var{column-align} determines how many +columns will be printed. +The entries to print are given by @var{lst}, a markup-list. If needed, the last +row is filled up with @code{point-stencil}s. +Overriding @code{padding} may be used to increase columns horizontal distance. +Overriding @code{baseline-skip} to increase rows vertical distance. +@lilypond[verbatim,quote] +\\markuplist { + \\override #'(padding . 2) + \\table + #'(0 1 0 -1) + { + \\underline { center-aligned right-aligned center-aligned left-aligned } + one \number 1 thousandth \number 0.001 + eleven \number 11 hundredth \number 0.01 + twenty \number 20 tenth \number 0.1 + thousand \number 1000 one \number 1.0 + } +} +@end lilypond +" + + (define (split-lst initial-lst lngth result-lst) + ;; split a list into a list of sublists of length lngth + ;; eg. (split-lst '(1 2 3 4 5 6) 2 '()) + ;; -> ((1 2) (3 4) (5 6)) + (cond ((not (integer? (/ (length initial-lst) lngth))) + (ly:warning + "Can't split list of length ~a into ~a parts, returning empty list" + (length initial-lst) lngth) + '()) + ((null? initial-lst) + (reverse result-lst)) + (else + (split-lst + (drop initial-lst lngth) + lngth + (cons (take initial-lst lngth) result-lst))))) + + (define (dists-list init padding lst) + ;; Returns a list, where each element of `lst' is + ;; added to the sum of the previous elements of `lst' plus padding. + ;; `init' will be the first element of the resulting list. The addition + ;; starts with the values of `init', `padding' and `(car lst)'. + ;; eg. (dists-list 0.01 0.1 '(1 2 3 4))) + ;; -> (0.01 1.11 3.21 6.31 10.41) + (if (or (not (number? init)) + (not (number? padding)) + (not (number-list? lst))) + (begin + (ly:warning + "not fitting argument for `dists-list', return empty lst ") + '()) + (reverse + (fold (lambda (elem rl) (cons (+ elem padding (car rl)) rl)) + (list init) + lst)))) + + (let* (;; get the number of columns + (columns (length column-align)) + (init-stils (interpret-markup-list layout props lst)) + ;; If the given markup-list is the result of a markup-list call, their + ;; length may not be easily predictable, thus we add point-stencils + ;; to fill last row of the table. + (rem (remainder (length init-stils) columns)) + (filled-stils + (if (zero? rem) + init-stils + (append init-stils (make-list (- columns rem) point-stencil)))) + ;; get the stencils in sublists of length `columns' + (stils + (split-lst filled-stils columns '())) + ;; procedure to return stencil-length + ;; If it is nan, return 0 + (lengths-proc + (lambda (m) + (let ((lngth (interval-length (ly:stencil-extent m X)))) + (if (nan? lngth) 0 lngth)))) + ;; get the max width of each column in a list + (columns-max-x-lengths + (map + (lambda (x) + (apply max 0 + (map + lengths-proc + (map (lambda (l) (list-ref l x)) stils)))) + (iota columns))) + ;; create a list of (basic) distances, which each column should + ;; moved, using `dists-list'. Some padding may be added. + (dist-sequence + (dists-list 0 padding columns-max-x-lengths)) + ;; Get all stencils of a row, moved accurately to build columns. + ;; If the items of a column are aligned other than left, we need to + ;; move them to avoid collisions: + ;; center aligned: move all items half the width of the widest item + ;; right aligned: move all items the full width of the widest item. + ;; Added to the default-offset calculated in `dist-sequence'. + ;; `stencils-for-row-proc' needs four arguments: + ;; stil - a stencil + ;; dist - a numerical value as basic offset in X direction + ;; column - a numerical value for the column we're in + ;; x-align - a numerical value how current column should be + ;; aligned, where (-1, 0, 1) means (LEFT, CENTER, RIGHT) + (stencils-for-row-proc + (lambda (stil dist column x-align) + (ly:stencil-translate-axis + (ly:stencil-aligned-to stil X x-align) + (cond ((member x-align '(0 1)) + (let* (;; get the stuff for relevant column + (stuff-for-column + (map + (lambda (s) (list-ref s column)) + stils)) + ;; get length of every column-item + (lengths-for-column + (map lengths-proc stuff-for-column)) + (widest + (apply max 0 lengths-for-column))) + (+ dist (/ widest (if (= x-align 0) 2 1))))) + (else dist)) + X))) + ;; get a list of rows using `ly:stencil-add' on a list of stencils + (rows + (map + (lambda (stil-list) + (apply ly:stencil-add + (map + ;; the procedure creating the stencils: + stencils-for-row-proc + ;; the procedure's args: + stil-list + dist-sequence + (iota columns) + column-align))) + stils))) + (space-lines baseline-skip rows))) + (define-markup-list-command (map-markup-commands layout props compose args) (procedure? markup-list?) "This applies the function @var{compose} to every markup in diff --git a/scm/define-music-callbacks.scm b/scm/define-music-callbacks.scm index 42aaf58ace..5cc1db14cd 100644 --- a/scm/define-music-callbacks.scm +++ b/scm/define-music-callbacks.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; Neil Puttock ;;;; Carl Sorensen @@ -23,16 +23,24 @@ (define (mm-rest-child-list music) "Generate events for multimeasure rests, to be used by the sequential-iterator" - (let ((location (ly:music-property music 'origin)) - (duration (ly:music-property music 'duration))) - (list (make-music 'BarCheck - 'origin location) - (make-event-chord (cons (make-music 'MultiMeasureRestEvent - 'origin location - 'duration duration) - (ly:music-property music 'articulations))) - (make-music 'BarCheck - 'origin location)))) + (ly:set-origin! (list (make-music 'BarCheck) + (make-music 'MultiMeasureRestEvent + (ly:music-deep-copy music)) + (make-music 'BarCheck)) + music)) + +(define (make-unfolded-set music) + (let ((n (ly:music-property music 'repeat-count)) + (alts (ly:music-property music 'elements)) + (body (ly:music-property music 'element))) + (cond ((<= n 0) '()) + ((null? alts) (make-list n body)) + (else + (concatenate + (zip (make-list n body) + (append! (make-list (max 0 (- n (length alts))) + (car alts)) + alts))))))) (define (make-volta-set music) (let* ((alts (ly:music-property music 'elements)) @@ -114,4 +122,33 @@ to be used by the sequential-iterator" (ly:context-set-property! context 'measureLength new-measure-length)))) 'Timing) - 'Score)))) + 'Score) + ;; (make-music 'TimeSignatureEvent music) would always + ;; create a Bottom context. So instead, we just send the + ;; event to whatever context may be currently active. If + ;; that is not contained within an existing context with + ;; TimeSignatureEngraver at the time \time is iterated, it + ;; will drop through the floor which mostly means that + ;; point&click and tweaks are not available for any time + ;; signatures engraved due to the Timing property changes + ;; but without a \time of its own. This is more a + ;; "notification" rather than an "event" (which is always + ;; sent to Bottom) but we don't currently have iterators for + ;; that. + (make-apply-context + (lambda (context) + (ly:broadcast (ly:context-event-source context) + (ly:make-stream-event + (ly:make-event-class 'time-signature-event) + (ly:music-mutable-properties music)))))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Some MIDI callbacks -- is this a good place for them? + +(define-public (breathe::midi-length len context) + ;;Shorten by half, or by up to a second, but always by a power of 2 + (let* ((desired (min (ly:moment-main (seconds->moment 1 context)) + (* (ly:moment-main len) 1/2))) + (scale (inexact->exact (ceiling (/ (log desired) (log 1/2))))) + (breath (ly:make-moment (expt 1/2 scale)))) + (ly:moment-sub (ly:make-moment (ly:moment-main len)) breath))) diff --git a/scm/define-music-display-methods.scm b/scm/define-music-display-methods.scm index ed6b844219..42637cd16c 100644 --- a/scm/define-music-display-methods.scm +++ b/scm/define-music-display-methods.scm @@ -1,7 +1,7 @@ ;;; define-music-display-methods.scm -- data for displaying music ;;; expressions using LilyPond notation. ;;; -;;; Copyright (C) 2005--2012 Nicolas Sceaux +;;; Copyright (C) 2005--2015 Nicolas Sceaux ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -83,16 +83,14 @@ expression." (if (and (car alist) (test item (cdar alist))) (set! result (car alist))))) -(define-public (note-name->lily-string ly-pitch parser) +(define-public (note-name->lily-string ly-pitch) ;; here we define a custom pitch= function, since we do not want to ;; test whether octaves are also equal. (otherwise, we would be using equal?) (define (pitch= pitch1 pitch2) (and (= (ly:pitch-notename pitch1) (ly:pitch-notename pitch2)) (= (ly:pitch-alteration pitch1) (ly:pitch-alteration pitch2)))) - (let ((result (rassoc ly-pitch (ly:parser-lookup parser 'pitchnames) pitch=))) - (if result - (car result) - #f))) + (let* ((result (rassoc ly-pitch pitchnames pitch=))) + (and result (car result)))) (define-public (octave->lily-string pitch) (let ((octave (ly:pitch-octave pitch))) @@ -105,15 +103,13 @@ expression." ;;; ;;; durations ;;; -(define*-public (duration->lily-string ly-duration #:key (prev-duration (*previous-duration*)) - (force-duration (*force-duration*)) - (time-scale (*time-scale*)) - remember) - (if remember (*previous-duration* ly-duration)) +(define*-public (duration->lily-string ly-duration #:key + (force-duration #f) + (time-scale (*time-scale*))) (let ((log2 (ly:duration-log ly-duration)) (dots (ly:duration-dot-count ly-duration)) (scale (ly:duration-scale ly-duration))) - (if (or force-duration (not prev-duration) (not (equal? ly-duration prev-duration))) + (if (or force-duration (not (*omit-duration*))) (string-append (case log2 ((-1) "\\breve") ((-2) "\\longa") @@ -129,8 +125,7 @@ expression." ;;; post events ;;; -(define (post-event? m) - (music-is-of-type? m 'post-event)) +(define post-event? (music-type-predicate 'post-event)) (define* (event-direction->lily-string event #:optional (required #t)) (let ((direction (ly:music-property event 'direction))) @@ -154,25 +149,23 @@ expression." ,str-start ,str-stop)))) -(define-display-method HyphenEvent (event parser) +(define-display-method HyphenEvent (event) " --") -(define-display-method ExtenderEvent (event parser) +(define-display-method ExtenderEvent (event) " __") -(define-display-method TieEvent (event parser) +(define-display-method TieEvent (event) " ~") -(define-display-method BeamForbidEvent (event parser) +(define-display-method BeamForbidEvent (event) "\\noBeam") -(define-display-method StringNumberEvent (event parser) +(define-display-method StringNumberEvent (event) (format #f "\\~a" (ly:music-property event 'string-number))) -(define-display-method TremoloEvent (event parser) - (let ((tremolo-type (ly:music-property event 'tremolo-type))) - (format #f ":~a" (if (= 0 tremolo-type) - "" - tremolo-type)))) +(define-display-method TremoloEvent (event) + (let ((tremolo-type (ly:music-property event 'tremolo-type 8))) + (format #f ":~a" tremolo-type))) -(define-display-method ArticulationEvent (event parser) #t +(define-display-method ArticulationEvent (event) #t (let* ((articulation (ly:music-property event 'articulation-type)) (shorthand (case (string->symbol articulation) @@ -189,54 +182,54 @@ expression." shorthand (or shorthand articulation)))) -(define-post-event-display-method FingeringEvent (event parser) #t +(define-post-event-display-method FingeringEvent (event) #t (ly:music-property event 'digit)) -(define-post-event-display-method TextScriptEvent (event parser) #t +(define-post-event-display-method TextScriptEvent (event) #t (markup->lily-string (ly:music-property event 'text))) -(define-post-event-display-method MultiMeasureTextEvent (event parser) #t +(define-post-event-display-method MultiMeasureTextEvent (event) #t (markup->lily-string (ly:music-property event 'text))) -(define-post-event-display-method BendAfterEvent (event parser) #f +(define-post-event-display-method BendAfterEvent (event) #f (format #f "\\bendAfter #~a " (ly:music-property event 'delta-step))) -(define-post-event-display-method HarmonicEvent (event parser) #f "\\harmonic") -(define-post-event-display-method GlissandoEvent (event parser) #f "\\glissando") -(define-post-event-display-method ArpeggioEvent (event parser) #f "\\arpeggio") -(define-post-event-display-method AbsoluteDynamicEvent (event parser) #f +(define-post-event-display-method HarmonicEvent (event) #f "\\harmonic") +(define-post-event-display-method GlissandoEvent (event) #f "\\glissando") +(define-post-event-display-method ArpeggioEvent (event) #f "\\arpeggio") +(define-post-event-display-method AbsoluteDynamicEvent (event) #f (format #f "\\~a" (ly:music-property event 'text))) -(define-post-event-display-method StrokeFingerEvent (event parser) #f +(define-post-event-display-method StrokeFingerEvent (event) #f (format #f "\\rightHandFinger #~a " (ly:music-property event 'digit))) -(define-span-event-display-method BeamEvent (event parser) #f "[" "]") -(define-span-event-display-method SlurEvent (event parser) #f "(" ")") -(define-span-event-display-method CrescendoEvent (event parser) #f "\\<" "\\!") -(define-span-event-display-method DecrescendoEvent (event parser) #f "\\>" "\\!") -(define-span-event-display-method EpisemaEvent (event parser) #f "\\episemInitium" "\\episemFinis") -(define-span-event-display-method PhrasingSlurEvent (event parser) #f "\\(" "\\)") -(define-span-event-display-method SustainEvent (event parser) #f "\\sustainOn" "\\sustainOff") -(define-span-event-display-method SostenutoEvent (event parser) #f "\\sostenutoOn" "\\sostenutoOff") -(define-span-event-display-method TextSpanEvent (event parser) #f "\\startTextSpan" "\\stopTextSpan") -(define-span-event-display-method TrillSpanEvent (event parser) #f "\\startTrillSpan" "\\stopTrillSpan") -(define-span-event-display-method StaffSpanEvent (event parser) #f "\\startStaff" "\\stopStaff") -(define-span-event-display-method NoteGroupingEvent (event parser) #f "\\startGroup" "\\stopGroup") -(define-span-event-display-method UnaCordaEvent (event parser) #f "\\unaCorda" "\\treCorde") +(define-span-event-display-method BeamEvent (event) #f "[" "]") +(define-span-event-display-method SlurEvent (event) #f "(" ")") +(define-span-event-display-method CrescendoEvent (event) #f "\\<" "\\!") +(define-span-event-display-method DecrescendoEvent (event) #f "\\>" "\\!") +(define-span-event-display-method EpisemaEvent (event) #f "\\episemInitium" "\\episemFinis") +(define-span-event-display-method PhrasingSlurEvent (event) #f "\\(" "\\)") +(define-span-event-display-method SustainEvent (event) #f "\\sustainOn" "\\sustainOff") +(define-span-event-display-method SostenutoEvent (event) #f "\\sostenutoOn" "\\sostenutoOff") +(define-span-event-display-method TextSpanEvent (event) #f "\\startTextSpan" "\\stopTextSpan") +(define-span-event-display-method TrillSpanEvent (event) #f "\\startTrillSpan" "\\stopTrillSpan") +(define-span-event-display-method StaffSpanEvent (event) #f "\\startStaff" "\\stopStaff") +(define-span-event-display-method NoteGroupingEvent (event) #f "\\startGroup" "\\stopGroup") +(define-span-event-display-method UnaCordaEvent (event) #f "\\unaCorda" "\\treCorde") ;;; ;;; Graces ;;; -(define-display-method GraceMusic (expr parser) +(define-display-method GraceMusic (expr) (format #f "\\grace ~a" - (music->lily-string (ly:music-property expr 'element) parser))) + (music->lily-string (ly:music-property expr 'element)))) ;; \acciaccatura \appoggiatura \grace ;; TODO: it would be better to compare ?start and ?stop ;; with startAppoggiaturaMusic and stopAppoggiaturaMusic, ;; using a custom music equality predicate. -(define-extra-display-method GraceMusic (expr parser) +(define-extra-display-method GraceMusic (expr) "Display method for appoggiatura." (with-music-match (expr (music 'GraceMusic @@ -264,10 +257,10 @@ expression." ((music 'SlurEvent span-direction STOP)))))) - (format #f "\\appoggiatura ~a" (music->lily-string ?music parser)))))) + (format #f "\\appoggiatura ~a" (music->lily-string ?music)))))) -(define-extra-display-method GraceMusic (expr parser) +(define-extra-display-method GraceMusic (expr) "Display method for acciaccatura." (with-music-match (expr (music 'GraceMusic @@ -309,9 +302,9 @@ expression." ((music 'SlurEvent span-direction STOP)))))) - (format #f "\\acciaccatura ~a" (music->lily-string ?music parser)))))) + (format #f "\\acciaccatura ~a" (music->lily-string ?music)))))) -(define-extra-display-method GraceMusic (expr parser) +(define-extra-display-method GraceMusic (expr) "Display method for grace." (with-music-match (expr (music 'GraceMusic @@ -324,13 +317,13 @@ expression." ;; startGraceMusic stopGraceMusic (and (null? (ly:music-property ?start 'elements)) (null? (ly:music-property ?stop 'elements)) - (format #f "\\grace ~a" (music->lily-string ?music parser))))) + (format #f "\\grace ~a" (music->lily-string ?music))))) ;;; ;;; Music sequences ;;; -(define-display-method SequentialMusic (seq parser) +(define-display-method SequentialMusic (seq) (let ((force-line-break (and (*force-line-break*) ;; hm (> (length (ly:music-property seq 'elements)) @@ -380,19 +373,19 @@ expression." (if force-line-break (+ 2 (*indent*)) 1) (parameterize ((*indent* (+ 2 (*indent*)))) (map-in-order (lambda (music) - (music->lily-string music parser)) + (music->lily-string music)) elements)) (if force-line-break 1 0) (if force-line-break (*indent*) 1)))) -(define-display-method SimultaneousMusic (sim parser) +(define-display-method SimultaneousMusic (sim) (parameterize ((*indent* (+ 3 (*indent*)))) (format #f "<< ~{~a ~}>>" (map-in-order (lambda (music) - (music->lily-string music parser)) + (music->lily-string music)) (ly:music-property sim 'elements))))) -(define-extra-display-method SimultaneousMusic (expr parser) +(define-extra-display-method SimultaneousMusic (expr) "If `sim' is an \afterGrace expression, return \"\\afterGrace ...\". Otherwise, return #f." ;; TODO: do something with afterGraceFraction? @@ -403,14 +396,14 @@ Otherwise, return #f." (music 'GraceMusic element ?grace)))))) (format #f "\\afterGrace ~a ~a" - (music->lily-string ?before-grace parser) - (music->lily-string ?grace parser)))) + (music->lily-string ?before-grace) + (music->lily-string ?grace)))) ;;; ;;; Chords ;;; -(define-display-method EventChord (chord parser) +(define-display-method EventChord (chord) ;; event_chord : command_element ;; | note_chord_element @@ -423,7 +416,7 @@ Otherwise, return #f." (chord-repeat (ly:music-property chord 'duration))) (call-with-values (lambda () - (partition (lambda (m) (music-is-of-type? m 'rhythmic-event)) + (partition (music-type-predicate 'rhythmic-event) elements)) (lambda (chord-elements other-elements) (cond ((pair? chord-elements) @@ -431,63 +424,62 @@ Otherwise, return #f." ;; '<' (notepitch | drumpitch)* '>" duration post_events (let ((duration (duration->lily-string (ly:music-property (car chord-elements) - 'duration) - #:remember #t))) + 'duration)))) ;; Format duration first so that it does not appear on ;; chord elements (format #f "< ~{~a ~}>~a~:{~:[-~;~]~a~^ ~}" - (map-in-order (lambda (music) - (music->lily-string music parser)) - chord-elements) + (parameterize ((*omit-duration* #t)) + (map-in-order + (lambda (music) + (music->lily-string music)) + chord-elements)) duration (map-in-order (lambda (music) (list (post-event? music) - (music->lily-string music parser))) + (music->lily-string music))) other-elements)))) ((ly:duration? chord-repeat) - (let ((duration (duration->lily-string chord-repeat - #:remember #t))) + (let ((duration (duration->lily-string chord-repeat))) (format #f "q~a~:{~:[-~;~]~a~^ ~}" duration (map-in-order (lambda (music) (list (post-event? music) - (music->lily-string music parser))) + (music->lily-string music))) other-elements)))) ((and (= 1 (length other-elements)) (not (post-event? (car other-elements)))) - (format #f (music->lily-string (car other-elements) parser))) + (format #f (music->lily-string (car other-elements)))) (else (format #f "< >~:{~:[-~;~]~a~^ ~}" (map-in-order (lambda (music) (list (post-event? music) - (music->lily-string music parser))) + (music->lily-string music))) other-elements)))))))) -(define-display-method MultiMeasureRestMusic (mmrest parser) +(define-display-method MultiMeasureRestMusic (mmrest) (format #f "R~a~{~a~^ ~}" - (duration->lily-string (ly:music-property mmrest 'duration) - #:remember #t) + (duration->lily-string (ly:music-property mmrest 'duration)) (map-in-order (lambda (music) - (music->lily-string music parser)) + (music->lily-string music)) (ly:music-property mmrest 'articulations)))) -(define-display-method SkipMusic (skip parser) +(define-display-method SkipMusic (skip) (format #f "\\skip ~a" (duration->lily-string (ly:music-property skip 'duration) #:force-duration #t))) -(define-display-method OttavaMusic (ottava parser) +(define-display-method OttavaMusic (ottava) (format #f "\\ottava #~a" (ly:music-property ottava 'ottava-number))) ;;; ;;; Notes, rests, skips... ;;; -(define (simple-note->lily-string event parser) +(define (simple-note->lily-string event) (format #f "~a~a~a~a~a~a~:{~:[-~;~]~a~}" ; pitchname octave !? octave-check duration optional_rest articulations - (note-name->lily-string (ly:music-property event 'pitch) parser) + (note-name->lily-string (ly:music-property event 'pitch)) (octave->lily-string (ly:music-property event 'pitch)) (let ((forced (ly:music-property event 'force-accidental)) (cautionary (ly:music-property event 'cautionary))) @@ -506,64 +498,65 @@ Otherwise, return #f." (make-string (1- (* -1 octave-check)) #\,)) (else ""))) "")) - (duration->lily-string (ly:music-property event 'duration) - #:remember #t) + (duration->lily-string (ly:music-property event 'duration)) (if ((make-music-type-predicate 'RestEvent) event) "\\rest" "") (map-in-order (lambda (event) (list (post-event? event) - (music->lily-string event parser))) + (music->lily-string event))) (ly:music-property event 'articulations)))) -(define-display-method NoteEvent (note parser) +(define-display-method NoteEvent (note) (cond ((not (null? (ly:music-property note 'pitch))) ;; note - (simple-note->lily-string note parser)) + (simple-note->lily-string note)) ((not (null? (ly:music-property note 'drum-type))) ;; drum (format #f "~a~a~{~a~}" (ly:music-property note 'drum-type) - (duration->lily-string (ly:music-property note 'duration) - #:remember #t) + (duration->lily-string (ly:music-property note 'duration)) (map-in-order (lambda (event) - (music->lily-string event parser)) + (music->lily-string event)) (ly:music-property note 'articulations)))) - (else ;; unknown? - ""))) + (else + ;; pure duration + (format #f "~a~{~a~}" + (duration->lily-string (ly:music-property note 'duration) + #:force-duration #t) + (map-in-order (lambda (event) + (music->lily-string event)) + (ly:music-property note 'articulations)))))) -(define-display-method ClusterNoteEvent (note parser) - (simple-note->lily-string note parser)) +(define-display-method ClusterNoteEvent (note) + (simple-note->lily-string note)) -(define-display-method RestEvent (rest parser) +(define-display-method RestEvent (rest) (if (not (null? (ly:music-property rest 'pitch))) - (simple-note->lily-string rest parser) + (simple-note->lily-string rest) (format #f "r~a~{~a~}" - (duration->lily-string (ly:music-property rest 'duration) - #:remember #t) + (duration->lily-string (ly:music-property rest 'duration)) (map-in-order (lambda (event) - (music->lily-string event parser)) + (music->lily-string event)) (ly:music-property rest 'articulations))))) -(define-display-method MultiMeasureRestEvent (rest parser) - (string-append "R" (duration->lily-string (ly:music-property rest 'duration) - #:remember #t))) +(define-display-method MultiMeasureRestEvent (rest) + (string-append "R" (duration->lily-string (ly:music-property rest 'duration)))) -(define-display-method SkipEvent (rest parser) +(define-display-method SkipEvent (rest) (format #f "s~a~{~a~}" - (duration->lily-string (ly:music-property rest 'duration) - #:remember #t) + (duration->lily-string (ly:music-property rest 'duration)) (map-in-order (lambda (event) - (music->lily-string event parser)) + (music->lily-string event)) (ly:music-property rest 'articulations)))) -(define-display-method RepeatedChord (chord parser) - (music->lily-string (ly:music-property chord 'element) parser)) +(define-display-method RepeatedChord (chord) + (music->lily-string (ly:music-property chord 'element))) -(define-display-method MarkEvent (mark parser) +(define-display-method MarkEvent (mark) (let ((label (ly:music-property mark 'label))) (if (null? label) "\\mark \\default" (format #f "\\mark ~a" (markup->lily-string label))))) -(define-display-method KeyChangeEvent (key parser) +(define-display-method KeyChangeEvent (key) (let ((pitch-alist (ly:music-property key 'pitch-alist)) (tonic (ly:music-property key 'tonic))) (if (or (null? pitch-alist) @@ -572,36 +565,34 @@ Otherwise, return #f." (let ((c-pitch-alist (ly:transpose-key-alist pitch-alist (ly:pitch-diff (ly:make-pitch 0 0 0) tonic)))) (format #f "\\key ~a \\~a~a" - (note-name->lily-string (ly:music-property key 'tonic) parser) + (note-name->lily-string (ly:music-property key 'tonic)) (any (lambda (mode) - (if (and parser - (equal? (ly:parser-lookup parser mode) c-pitch-alist)) - (symbol->string mode) - #f)) + (and (equal? (ly:parser-lookup mode) c-pitch-alist) + (symbol->string mode))) '(major minor ionian locrian aeolian mixolydian lydian phrygian dorian)) (new-line->lily-string)))))) -(define-display-method RelativeOctaveCheck (octave parser) +(define-display-method RelativeOctaveCheck (octave) (let ((pitch (ly:music-property octave 'pitch))) (format #f "\\octaveCheck ~a~a" - (note-name->lily-string pitch parser) + (note-name->lily-string pitch) (octave->lily-string pitch)))) -(define-display-method VoiceSeparator (sep parser) +(define-display-method VoiceSeparator (sep) "\\\\") -(define-display-method LigatureEvent (ligature parser) +(define-display-method LigatureEvent (ligature) (if (= START (ly:music-property ligature 'span-direction)) "\\[" "\\]")) -(define-display-method BarCheck (check parser) +(define-display-method BarCheck (check) (format #f "|~a" (new-line->lily-string))) -(define-display-method PesOrFlexaEvent (expr parser) +(define-display-method PesOrFlexaEvent (expr) "\\~") -(define-display-method BassFigureEvent (figure parser) +(define-display-method BassFigureEvent (figure) (let ((alteration (ly:music-property figure 'alteration)) (fig (ly:music-property figure 'figure)) (bracket-start (ly:music-property figure 'bracket-start)) @@ -623,8 +614,8 @@ Otherwise, return #f." (else ""))) (if (null? bracket-stop) "" "]")))) -(define-display-method LyricEvent (lyric parser) - (format "~a~{~a~^ ~}" +(define-display-method LyricEvent (lyric) + (format #f "~a~{~a~^ ~}" (let ((text (ly:music-property lyric 'text))) (if (or (string? text) (eqv? (first text) simple-markup)) @@ -637,28 +628,29 @@ Otherwise, return #f." (format #f "~s" string) string)) (markup->lily-string text))) - (map-in-order (lambda (m) (music->lily-string m parser)) + (map-in-order (lambda (m) (music->lily-string m)) (ly:music-property lyric 'articulations)))) -(define-display-method BreathingEvent (event parser) +(define-display-method BreathingEvent (event) "\\breathe") ;;; ;;; Staff switches ;;; -(define-display-method AutoChangeMusic (m parser) +(define-display-method AutoChangeMusic (m) (format #f "\\autochange ~a" - (music->lily-string (ly:music-property m 'element) parser))) + (music->lily-string + (ly:music-property (ly:music-property m 'element) 'element)))) -(define-display-method ContextChange (m parser) +(define-display-method ContextChange (m) (format #f "\\change ~a = \"~a\"" (ly:music-property m 'change-to-type) (ly:music-property m 'change-to-id))) ;;; -(define-display-method TimeScaledMusic (times parser) +(define-display-method TimeScaledMusic (times) (let* ((num (ly:music-property times 'numerator)) (den (ly:music-property times 'denominator)) (span (ly:music-property times 'duration #f)) @@ -667,7 +659,6 @@ Otherwise, return #f." (and span (duration->lily-string span #:force-duration #t))) (scale (/ num den)) (time-scale (*time-scale*))) - (*previous-duration* #f) (let ((result (parameterize ((*force-line-break* #f) (*time-scale* (* time-scale scale))) @@ -675,24 +666,23 @@ Otherwise, return #f." den num formatted-span - (music->lily-string (ly:music-property times 'element) parser))))) - (*previous-duration* #f) + (music->lily-string (ly:music-property times 'element)))))) result))) -(define-display-method RelativeOctaveMusic (m parser) - (music->lily-string (ly:music-property m 'element) parser)) +(define-display-method RelativeOctaveMusic (m) + (music->lily-string (ly:music-property m 'element))) -(define-display-method TransposedMusic (m parser) - (music->lily-string (ly:music-property m 'element) parser)) +(define-display-method TransposedMusic (m) + (music->lily-string (ly:music-property m 'element))) ;;; ;;; Repeats ;;; -(define-display-method AlternativeEvent (alternative parser) "") +(define-display-method AlternativeEvent (alternative) "") -(define (repeat->lily-string expr repeat-type parser) - (let* ((main (music->lily-string (ly:music-property expr 'element) parser))) +(define (repeat->lily-string expr repeat-type) + (let* ((main (music->lily-string (ly:music-property expr 'element)))) (format #f "\\repeat ~a ~a ~a ~a" repeat-type (ly:music-property expr 'repeat-count) @@ -702,48 +692,26 @@ Otherwise, return #f." "" (format #f "\\alternative { ~{~a ~}}" (map-in-order (lambda (music) - (music->lily-string music parser)) + (music->lily-string music)) alternatives))))))) -(define-display-method VoltaRepeatedMusic (expr parser) - (repeat->lily-string expr "volta" parser)) - -(define-display-method UnfoldedRepeatedMusic (expr parser) - (repeat->lily-string expr "unfold" parser)) - -(define-display-method PercentRepeatedMusic (expr parser) - (repeat->lily-string expr "percent" parser)) - -(define-display-method TremoloRepeatedMusic (expr parser) - (let* ((main (ly:music-property expr 'element)) - (children (if (music-is-of-type? main 'sequential-music) - ;; \repeat tremolo n { ... } - (length (extract-named-music main '(EventChord - NoteEvent))) - ;; \repeat tremolo n c4 - 1)) - (times (ly:music-property expr 'repeat-count)) - - ;; # of dots is equal to the 1 in bitwise representation (minus 1)! - (dots (1- (logcount (* times children)))) - ;; The remaining missing multiplicator to scale the notes by - ;; times * children - (mult (/ (* times children (ash 1 dots)) (1- (ash 2 dots)))) - (shift (- (ly:intlog2 (floor mult))))) - (set! main (ly:music-deep-copy main)) - ;; Adjust the time of the notes - (ly:music-compress main (ly:make-moment children 1)) - ;; Adjust the displayed note durations - (shift-duration-log main (- shift) (- dots)) - (format #f "\\repeat tremolo ~a ~a" - times - (music->lily-string main parser)))) +(define-display-method VoltaRepeatedMusic (expr) + (repeat->lily-string expr "volta")) + +(define-display-method UnfoldedRepeatedMusic (expr) + (repeat->lily-string expr "unfold")) + +(define-display-method PercentRepeatedMusic (expr) + (repeat->lily-string expr "percent")) + +(define-display-method TremoloRepeatedMusic (expr) + (repeat->lily-string expr "tremolo")) ;;; ;;; Contexts ;;; -(define-display-method ContextSpeccedMusic (expr parser) +(define-display-method ContextSpeccedMusic (expr) (let ((id (ly:music-property expr 'context-id)) (create-new (ly:music-property expr 'create-new)) (music (ly:music-property expr 'element)) @@ -769,10 +737,10 @@ Otherwise, return #f." operations)) (*indent*))) (parameterize ((*current-context* ctype)) - (music->lily-string music parser))))) + (music->lily-string music))))) ;; special cases: \figures \lyrics \drums -(define-extra-display-method ContextSpeccedMusic (expr parser) +(define-extra-display-method ContextSpeccedMusic (expr) (with-music-match (expr (music 'ContextSpeccedMusic create-new #t property-operations ?op @@ -782,18 +750,18 @@ Otherwise, return #f." (parameterize ((*explicit-mode* #f)) (case ?context-type ((FiguredBass) - (format #f "\\figures ~a" (music->lily-string ?sequence parser))) + (format #f "\\figures ~a" (music->lily-string ?sequence))) ((Lyrics) - (format #f "\\lyrics ~a" (music->lily-string ?sequence parser))) + (format #f "\\lyrics ~a" (music->lily-string ?sequence))) ((DrumStaff) - (format #f "\\drums ~a" (music->lily-string ?sequence parser))) + (format #f "\\drums ~a" (music->lily-string ?sequence))) (else #f))) #f))) ;;; Context properties -(define-extra-display-method ContextSpeccedMusic (expr parser) +(define-extra-display-method ContextSpeccedMusic (expr) (let ((element (ly:music-property expr 'element)) (property-tuning? (make-music-type-predicate 'PropertySet 'PropertyUnset @@ -805,12 +773,12 @@ Otherwise, return #f." (and (sequence? element) (every property-tuning? (ly:music-property element 'elements))))) (parameterize ((*current-context* (ly:music-property expr 'context-type))) - (music->lily-string element parser)) + (music->lily-string element)) #f))) -(define-public (value->lily-string arg parser) +(define-public (value->lily-string arg) (cond ((ly:music? arg) - (music->lily-string arg parser)) + (music->lily-string arg)) ((string? arg) (format #f "#~s" arg)) ((markup? arg) @@ -819,12 +787,12 @@ Otherwise, return #f." (format #f "##{ ~a #}" (duration->lily-string arg #:force-duration #t))) ((ly:pitch? arg) (format #f "~a~a" - (note-name->lily-string arg parser) + (note-name->lily-string arg) (octave->lily-string arg))) (else (format #f "#~a" (scheme-expr->lily-string arg))))) -(define-display-method PropertySet (expr parser) +(define-display-method PropertySet (expr) (let ((property (ly:music-property expr 'symbol)) (value (ly:music-property expr 'value)) (once (ly:music-property expr 'once))) @@ -836,11 +804,12 @@ Otherwise, return #f." "" (format #f "~a . " (*current-context*))) property - (value->lily-string value parser) + (value->lily-string value) (new-line->lily-string)))) -(define-display-method PropertyUnset (expr parser) - (format #f "\\unset ~a~a~a" +(define-display-method PropertyUnset (expr) + (format #f "~a\\unset ~a~a~a" + (if (ly:music-property expr 'once #f) "\\once " "") (if (eqv? (*current-context*) 'Bottom) "" (format #f "~a . " (*current-context*))) @@ -849,7 +818,7 @@ Otherwise, return #f." ;;; Layout properties -(define-display-method OverrideProperty (expr parser) +(define-display-method OverrideProperty (expr) (let* ((symbol (ly:music-property expr 'symbol)) (properties (ly:music-property expr 'grob-property-path (list (ly:music-property expr 'grob-property)))) @@ -864,20 +833,23 @@ Otherwise, return #f." (if (eqv? (*current-context*) 'Bottom) (cons symbol properties) (cons* (*current-context*) symbol properties)) - (value->lily-string value parser) + (value->lily-string value) (new-line->lily-string)))) -(define-display-method RevertProperty (expr parser) +(define-display-method RevertProperty (expr) (let* ((symbol (ly:music-property expr 'symbol)) (properties (ly:music-property expr 'grob-property-path - (list (ly:music-property expr 'grob-property))))) - (format #f "\\revert ~{~a~^.~}~a" + (list (ly:music-property expr + 'grob-property)))) + (once (ly:music-property expr 'once #f))) + (format #f "~a\\revert ~{~a~^.~}~a" + (if once "\\once " "") (if (eqv? (*current-context*) 'Bottom) (cons symbol properties) (cons* (*current-context*) symbol properties)) (new-line->lily-string)))) -(define-display-method TimeSignatureMusic (expr parser) +(define-display-method TimeSignatureMusic (expr) (let* ((num (ly:music-property expr 'numerator)) (den (ly:music-property expr 'denominator)) (structure (ly:music-property expr 'beat-structure))) @@ -887,12 +859,16 @@ Otherwise, return #f." num den (new-line->lily-string)) (format #f - "\\time #'~a ~a/~a~a" + ;; This is silly but the latter will also work for #f + ;; and other + (if (key-list? structure) + "\\time ~{~a~^,~} ~a/~a~a" + "\\time #'~a ~a/~a~a") structure num den (new-line->lily-string))))) ;;; \melisma and \melismaEnd -(define-extra-display-method ContextSpeccedMusic (expr parser) +(define-extra-display-method ContextSpeccedMusic (expr) "If expr is a melisma, return \"\\melisma\", otherwise, return #f." (with-music-match (expr (music 'ContextSpeccedMusic element (music 'PropertySet @@ -900,7 +876,7 @@ Otherwise, return #f." symbol 'melismaBusy))) "\\melisma")) -(define-extra-display-method ContextSpeccedMusic (expr parser) +(define-extra-display-method ContextSpeccedMusic (expr) "If expr is a melisma end, return \"\\melismaEnd\", otherwise, return #f." (with-music-match (expr (music 'ContextSpeccedMusic element (music 'PropertyUnset @@ -908,7 +884,7 @@ Otherwise, return #f." "\\melismaEnd")) ;;; \tempo -(define-extra-display-method SequentialMusic (expr parser) +(define-extra-display-method SequentialMusic (expr) (with-music-match (expr (music 'SequentialMusic elements ((music 'TempoChangeEvent text ?text @@ -927,7 +903,7 @@ Otherwise, return #f." ?count) (new-line->lily-string)))) -(define-display-method TempoChangeEvent (expr parser) +(define-display-method TempoChangeEvent (expr) (let ((text (ly:music-property expr 'text))) (format #f "\\tempo ~a~a" (markup->lily-string text) @@ -944,7 +920,7 @@ Otherwise, return #f." (car name+vals))) clefs)))) -(define-extra-display-method ContextSpeccedMusic (expr parser) +(define-extra-display-method ContextSpeccedMusic (expr) "If @var{expr} is a clef change, return \"\\clef ...\". Otherwise, return @code{#f}." (with-music-match (expr (music 'ContextSpeccedMusic @@ -961,24 +937,29 @@ Otherwise, return @code{#f}." (music 'PropertySet value ?clef-transposition symbol 'clefTransposition) + (music 'PropertySet + value ?clef-transposition-style + symbol 'clefTranspositionStyle) (music 'ApplyContext procedure ly:set-middle-C!))))) (let ((clef-name (assoc-get (list ?clef-glyph ?clef-position 0) clef-name-alist))) - (if clef-name - (format #f "\\clef \"~a~{~a~a~}\"~a" - clef-name - (cond ((= 0 ?clef-transposition) - (list "" "")) - ((> ?clef-transposition 0) - (list "^" (1+ ?clef-transposition))) - (else - (list "_" (- 1 ?clef-transposition)))) - (new-line->lily-string)) - #f)))) + (and clef-name + (format #f "\\clef \"~a~?\"~a" + clef-name + (case ?clef-transposition-style + ((parenthesized) "~a(~a)") + ((bracketed) "~a[~a]") + (else "~a~a")) + (cond ((zero? ?clef-transposition) + (list "" "")) + ((positive? ?clef-transposition) + (list "^" (1+ ?clef-transposition))) + (else (list "_" (- 1 ?clef-transposition)))) + (new-line->lily-string)))))) ;;; \bar -(define-extra-display-method ContextSpeccedMusic (expr parser) +(define-extra-display-method ContextSpeccedMusic (expr) "If `expr' is a bar, return \"\\bar ...\". Otherwise, return #f." (with-music-match (expr (music 'ContextSpeccedMusic @@ -989,7 +970,7 @@ Otherwise, return #f." (format #f "\\bar \"~a\"~a" ?bar-type (new-line->lily-string)))) ;;; \partial -(define-extra-display-method ContextSpeccedMusic (expr parser) +(define-extra-display-method ContextSpeccedMusic (expr) "If `expr' is a partial measure, return \"\\partial ...\". Otherwise, return #f." (with-music-match (expr (music @@ -1008,17 +989,19 @@ Otherwise, return #f." ;;; ;;; -(define-display-method ApplyOutputEvent (applyoutput parser) +(define-display-method ApplyOutputEvent (applyoutput) (let ((proc (ly:music-property applyoutput 'procedure)) - (ctx (ly:music-property applyoutput 'context-type))) - (format #f "\\applyOutput #'~a #~a" + (ctx (ly:music-property applyoutput 'context-type)) + (grob (ly:music-property applyoutput 'symbol))) + (format #f "\\applyOutput ~a~@[.~a~] #~a" ctx + (and (symbol? grob) grob) (or (procedure-name proc) (with-output-to-string (lambda () (pretty-print (procedure-source proc)))))))) -(define-display-method ApplyContext (applycontext parser) +(define-display-method ApplyContext (applycontext) (let ((proc (ly:music-property applycontext 'procedure))) (format #f "\\applyContext #~a" (or (procedure-name proc) @@ -1027,34 +1010,53 @@ Otherwise, return #f." (pretty-print (procedure-source proc)))))))) ;;; \partcombine -(define-display-method PartCombineMusic (expr parser) - (format #f "\\partcombine ~{~a ~}" - (map-in-order (lambda (music) - (music->lily-string music parser)) - (ly:music-property expr 'elements)))) - -(define-extra-display-method PartCombineMusic (expr parser) - (with-music-match (expr (music 'PartCombineMusic - elements ((music 'UnrelativableMusic - element (music 'ContextSpeccedMusic - context-id "one" - context-type 'Voice - element ?sequence1)) - (music 'UnrelativableMusic - element (music 'ContextSpeccedMusic - context-id "two" - context-type 'Voice - element ?sequence2))))) - (format #f "\\partcombine ~a~a~a" - (music->lily-string ?sequence1 parser) - (new-line->lily-string) - (music->lily-string ?sequence2 parser)))) - -(define-display-method UnrelativableMusic (expr parser) - (music->lily-string (ly:music-property expr 'element) parser)) +(define-display-method PartCombineMusic (expr) + (let ((dir (ly:music-property expr 'direction))) + (format #f "\\partcombine~a ~a~a~a" + (cond ((equal? dir UP) "Up") + ((equal? dir DOWN) "Down") + (else "")) + (music->lily-string (car (ly:music-property expr 'elements))) + (new-line->lily-string) + (music->lily-string (cadr (ly:music-property expr 'elements)))))) + +(define-display-method PartCombinePartMusic (expr) + (with-music-match ((ly:music-property expr 'element) + (music 'ContextSpeccedMusic element ?part)) + (format #f "~a" (music->lily-string ?part)))) + +(define-extra-display-method ContextSpeccedMusic (expr) + "If `expr' is a \\partcombine expression, return \"\\partcombine ...\". +Otherwise, return #f." + (with-music-match + (expr (music 'ContextSpeccedMusic + context-type 'Staff + element (music 'SimultaneousMusic + elements ((music 'ContextSpeccedMusic + context-id "one" + context-type 'Voice) + (music 'ContextSpeccedMusic + context-id "two" + context-type 'Voice) + (music 'ContextSpeccedMusic + context-id "shared" + context-type 'Voice) + (music 'ContextSpeccedMusic + context-id "solo" + context-type 'Voice) + (music 'ContextSpeccedMusic + context-id "null" + context-type 'NullVoice) + ?pc-music)))) + (with-music-match + (?pc-music (music 'PartCombineMusic)) + (format #f "~a" (music->lily-string ?pc-music))))) + +(define-display-method UnrelativableMusic (expr) + (music->lily-string (ly:music-property expr 'element))) ;;; Cue notes -(define-display-method QuoteMusic (expr parser) +(define-display-method QuoteMusic (expr) (or (with-music-match (expr (music 'QuoteMusic quoted-voice-direction ?quoted-voice-direction @@ -1065,30 +1067,30 @@ Otherwise, return #f." (format #f "\\cueDuring #~s #~a ~a" ?quoted-music-name ?quoted-voice-direction - (music->lily-string ?music parser))) + (music->lily-string ?music))) (format #f "\\quoteDuring #~s ~a" (ly:music-property expr 'quoted-music-name) - (music->lily-string (ly:music-property expr 'element) parser)))) + (music->lily-string (ly:music-property expr 'element))))) ;;; ;;; Breaks ;;; -(define-display-method LineBreakEvent (expr parser) +(define-display-method LineBreakEvent (expr) (if (null? (ly:music-property expr 'break-permission)) "\\noBreak" "\\break")) -(define-display-method PageBreakEvent (expr parser) +(define-display-method PageBreakEvent (expr) (if (null? (ly:music-property expr 'break-permission)) "\\noPageBreak" "\\pageBreak")) -(define-display-method PageTurnEvent (expr parser) +(define-display-method PageTurnEvent (expr) (if (null? (ly:music-property expr 'break-permission)) "\\noPageTurn" "\\pageTurn")) -(define-extra-display-method EventChord (expr parser) +(define-extra-display-method EventChord (expr) (with-music-match (expr (music 'EventChord elements ((music 'LineBreakEvent break-permission 'force) @@ -1096,7 +1098,7 @@ Otherwise, return #f." break-permission 'force)))) "\\pageBreak")) -(define-extra-display-method EventChord (expr parser) +(define-extra-display-method EventChord (expr) (with-music-match (expr (music 'EventChord elements ((music 'LineBreakEvent break-permission 'force) @@ -1111,14 +1113,32 @@ Otherwise, return #f." ;;; ;;; \lyricsto -(define-display-method LyricCombineMusic (expr parser) +(define-display-method LyricCombineMusic (expr) (format #f "\\lyricsto ~s ~a" (ly:music-property expr 'associated-context) - (parameterize ((*explicit-mode* #f)) - (music->lily-string (ly:music-property expr 'element) parser)))) + (parameterize ((*explicit-mode* #f) + (*omit-duration* #t)) + (music->lily-string (ly:music-property expr 'element))))) + +;; \autochange +(define-extra-display-method SimultaneousMusic (expr) + (with-music-match (expr (music 'SimultaneousMusic + elements ((music 'ContextSpeccedMusic + context-id "up" + context-type 'Staff + element ?ac-music) + (music 'ContextSpeccedMusic + context-id "up" + context-type 'Staff) + (music 'ContextSpeccedMusic + context-id "down" + context-type 'Staff)))) + (with-music-match (?ac-music (music 'AutoChangeMusic)) + (format #f "~a" + (music->lily-string ?ac-music))))) ;; \addlyrics -(define-extra-display-method SimultaneousMusic (expr parser) +(define-extra-display-method SimultaneousMusic (expr) (with-music-match (expr (music 'SimultaneousMusic elements ((music 'ContextSpeccedMusic context-id ?id @@ -1132,12 +1152,13 @@ Otherwise, return #f." element ?lyric-sequence))))) (if (string=? ?id ?associated-id) (format #f "~a~a \\addlyrics ~a" - (music->lily-string ?note-sequence parser) + (music->lily-string ?note-sequence) (new-line->lily-string) - (parameterize ((*explicit-mode* #f)) - (music->lily-string ?lyric-sequence parser))) + (parameterize ((*explicit-mode* #f) + (*omit-duration* #t)) + (music->lily-string ?lyric-sequence))) #f))) ;; Silence internal event sent at end of each lyrics block -(define-display-method CompletizeExtenderEvent (expr parser) +(define-display-method CompletizeExtenderEvent (expr) "") diff --git a/scm/define-music-properties.scm b/scm/define-music-properties.scm index 5c9c12538e..4df3f93340 100644 --- a/scm/define-music-properties.scm +++ b/scm/define-music-properties.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -39,7 +39,9 @@ lettering should be incremented.") TODO: Consider making type into symbol.") (articulations ,ly:music-list? "Articulation events specifically for this note.") - (associated-context ,string? "Name of the Voice context associated with + (associated-context ,string? "Name of the context associated with +this @code{\\lyricsto} section.") + (associated-context-type ,symbol? "Type of the context associated with this @code{\\lyricsto} section.") (augmented ,boolean? "This figure is for an augmented figured bass (with @code{+} sign).") @@ -65,9 +67,8 @@ cautionary accidental.") (change-to-id ,string? "Name of the context to change to.") (change-to-type ,symbol? "Type of the context to change to.") (class ,symbol? "The class name of an event class.") - (compress-procedure ,procedure? "Compress this music expression. -Arg@tie{}1: the music, arg@tie{}2: factor.") (context ,ly:context? "The context to which an event is sent.") + (context-change-list ,list? "Context changes for @code{\\autochange} or @code{\\partcombine}.") (context-id ,string? "Name of context.") (context-type ,symbol? "Type of context.") (create-new ,boolean? "Create a fresh context.") @@ -90,13 +91,11 @@ simultaneous music, or the alternatives of repeated music.") a sequential iterator. Takes a single music parameter.") (error-found ,boolean? "If true, a parsing error was found in this expression.") - (events ,list? "A list of events contained in this event.") (figure ,integer? "A bass figure.") (footnote-text ,markup? "Text to appear in a footnote.") (force-accidental ,boolean? "If set, a cautionary accidental should always be printed on this note.") - (forced-type ,symbol? "Override for the part-combiner.") (grob-property ,symbol? "The symbol of the grob property to set.") (grob-property-path ,list? "A list of symbols, locating a nested grob @@ -119,6 +118,12 @@ This property can only be defined as initializer in whether to allow, forbid or force a line break.") (metronome-count ,number-or-pair? "How many beats in a minute?") + (midi-extra-velocity ,integer? "How much louder or softer should +this note be in MIDI output? The default is 0.") + (midi-length ,procedure? "Function to determine how long to play +a note in MIDI. It should take a moment (the written length of the +note) and a context, and return a moment (the length to play the +note).") (moment ,ly:moment? "The moment at which an event happens.") (music-cause ,ly:music? "The music object that is the cause of an event.") @@ -150,7 +155,6 @@ Options are @code{solo1}, @code{solo2} and @code{unisono}.") of a key signature.") (pop-first ,boolean? "Do a revert before we try to do an override on some grob property.") - (prob-property ,symbol? "The symbol of the prob property to set.") (procedure ,procedure? "The function to run with @code{\\applycontext}. It must take a single argument, being the context.") (property-operations ,list? "Do these operations for instantiating @@ -180,7 +184,6 @@ Options are @code{'text} and @code{'hairpin}.") (span-text ,markup? "The displayed text for dynamic text spanners (e.g., cresc.)") (spanner-id ,string? "Identifier to distinguish concurrent spanners.") - (split-list ,list? "Splitting moments for part combiner.") (start-callback ,procedure? "Function to compute the negative length of starting grace notes. This property can only be defined as initializer in @file{scm/@/define-music-types.scm}.") diff --git a/scm/define-music-types.scm b/scm/define-music-types.scm index 184b4e5485..e0190eda55 100644 --- a/scm/define-music-types.scm +++ b/scm/define-music-types.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -29,23 +29,23 @@ Syntax: @var{note}@code{\\x}, where @code{\\x} is a dynamic mark like @code{\\ppp} or @code{\\sfz}. A complete list is in file @file{ly/@/dynamic-scripts-init.ly}.") - (types . (general-music post-event event dynamic-event absolute-dynamic-event)) + (types . (post-event event dynamic-event absolute-dynamic-event)) )) (AlternativeEvent . ((description . "Create an alternative event.") - (types . (general-music event alternative-event)) + (types . (event alternative-event)) )) (AnnotateOutputEvent . ((description . "Print an annotation of an output element.") - (types . (general-music event annotate-output-event post-event)) + (types . (event annotate-output-event post-event)) )) (ApplyContext . ((description . "Call the argument with the current context during interpreting phase.") - (types . (general-music apply-context)) + (types . (apply-context)) (iterator-ctor . ,ly:apply-context-iterator::constructor) )) @@ -57,14 +57,14 @@ Syntax: @code{\\applyOutput #'@var{context} @var{func}} Arguments to @var{func} are 1.@tie{}the grob, 2.@tie{}the originating context, and 3.@tie{}the context where @var{func} is called.") - (types . (general-music event apply-output-event)) + (types . (event apply-output-event)) )) (ArpeggioEvent . ((description . "Make an arpeggio on this note. Syntax: @w{@var{note}@code{-\\arpeggio}}") - (types . (general-music post-event arpeggio-event event)) + (types . (post-event arpeggio-event event)) )) ;; todo: use articulation-event for slur as well. @@ -77,7 +77,7 @@ Syntax: @var{note}@code{x}@code{y}, where @code{x} is a direction\ \n(no direction specified), and where @code{y} is an articulation\ \n(such as @w{@code{-.}}, @w{@code{->}}, @code{\\tenuto}, @code{\\downbow}). See the Notation Reference for details.") - (types . (general-music post-event event articulation-event script-event)) + (types . (post-event event articulation-event script-event)) )) (AutoChangeMusic @@ -86,63 +86,62 @@ piano staves automatically.") (iterator-ctor . ,ly:auto-change-iterator::constructor) (start-callback . ,ly:music-wrapper::start-callback) (length-callback . ,ly:music-wrapper::length-callback) - (types . (general-music music-wrapper-music auto-change-instruction)) + (types . (music-wrapper-music auto-change-instruction)) )) (BarCheck . ((description . "Check whether this music coincides with the start of the measure.") - (types . (general-music bar-check)) + (types . (bar-check)) (iterator-ctor . ,ly:bar-check-iterator::constructor) )) (BassFigureEvent . ((description . "Print a bass-figure text.") - (types . (general-music event rhythmic-event bass-figure-event)) + (types . (event rhythmic-event bass-figure-event)) )) (BeamEvent . ((description . "Start or stop a beam. Syntax for manual control: @code{c8-[ c c-] c8}") - (types . (general-music post-event event beam-event span-event)) + (types . (post-event event beam-event span-event)) )) (BeamForbidEvent . ((description . "Specify that a note may not auto-beamed.") - (types . (general-music post-event event beam-forbid-event)) + (types . (post-event event beam-forbid-event)) )) (BreakDynamicSpanEvent . ((description . "End an alignment spanner for dynamics here.") - (types . (general-music post-event break-span-event break-dynamic-span-event event)) + (types . (post-event break-span-event break-dynamic-span-event event)) )) (BendAfterEvent . ((description . "A drop/@/fall/@/doit jazz articulation.") - (types . (general-music post-event bend-after-event event)))) + (types . (post-event bend-after-event event)))) (BreathingEvent . ((description . "Create a @q{breath mark} or @q{comma}. Syntax: @var{note}@code{\\breathe}") - (types . (general-music event breathing-event)) - )) + (types . (event breathing-event)) + (midi-length . ,breathe::midi-length))) (ClusterNoteEvent . ((description . "A note that is part of a cluster.") ;; not a note-event, to ensure that Note_heads_engraver doesn't eat it. (iterator-ctor . ,ly:rhythmic-music-iterator::constructor) - (types . (general-music cluster-note-event melodic-event - rhythmic-event event)) + (types . (cluster-note-event melodic-event rhythmic-event event)) )) (CompletizeExtenderEvent . ((description . "Used internally to signal the end of a lyrics block to ensure extenders are completed correctly when a @code{Lyrics} context ends before its associated @code{Voice} context.") - (types . (general-music completize-extender-event event)) + (types . (completize-extender-event event)) )) (ContextChange @@ -150,7 +149,7 @@ before its associated @code{Voice} context.") Syntax: @code{\\change Staff = @var{new-id}}") (iterator-ctor . ,ly:change-iterator::constructor) - (types . (general-music translator-change-instruction)) + (types . (translator-change-instruction)) )) (ContextSpeccedMusic @@ -159,7 +158,7 @@ specific context.") (iterator-ctor . ,ly:context-specced-music-iterator::constructor) (length-callback . ,ly:music-wrapper::length-callback) (start-callback . ,ly:music-wrapper::start-callback) - (types . (context-specification general-music music-wrapper-music)) + (types . (context-specification music-wrapper-music)) )) (CrescendoEvent @@ -169,8 +168,8 @@ Syntax: @var{note}@code{\\<} @dots{} @var{note}@code{\\!} An alternative syntax is @var{note}@code{\\cr} @dots{} @var{note}@code{\\endcr}.") - (types . (general-music post-event span-event span-dynamic-event crescendo-event - event)) + (types . (post-event span-event span-dynamic-event crescendo-event + event)) )) (DecrescendoEvent @@ -180,23 +179,23 @@ Syntax: @var{note}@code{\\>} @dots{} @var{note}@code{\\!} An alternative syntax is @var{note}@code{\\decr} @dots{} @var{note}@code{\\enddecr}.") - (types . (general-music post-event span-event span-dynamic-event decrescendo-event - event)) + (types . (post-event span-event span-dynamic-event decrescendo-event + event)) )) (DoublePercentEvent . ((description . "Used internally to signal double percent repeats.") - (types . (general-music event double-percent-event rhythmic-event)) + (types . (event double-percent-event rhythmic-event)) )) (EpisemaEvent . ((description . "Begin or end an episema.") - (types . (general-music post-event span-event event episema-event)) + (types . (post-event span-event event episema-event)) )) (Event . ((description . "Atomic music event.") - (types . (general-music event)) + (types . (event)) )) (EventChord @@ -213,27 +212,27 @@ duration stored in @code{duration}.") (length-callback . ,ly:music-sequence::event-chord-length-callback) (to-relative-callback . ,ly:music-sequence::event-chord-relative-callback) - (types . (general-music event-chord simultaneous-music)) + (types . (event-chord simultaneous-music)) )) (ExtenderEvent . ((description . "Extend lyrics.") - (types . (general-music post-event extender-event event)) + (types . (post-event extender-event event)) )) (FingeringEvent . ((description . "Specify what finger to use for this note.") - (types . (general-music post-event fingering-event event)) + (types . (post-event fingering-event event)) )) (FootnoteEvent . ((description . "Footnote a grob.") - (types . (general-music event footnote-event)) + (types . (event footnote-event)) )) (GlissandoEvent . ((description . "Start a glissando on this note.") - (types . (general-music post-event glissando-event event)) + (types . (post-event glissando-event event)) )) (GraceMusic @@ -241,17 +240,17 @@ duration stored in @code{duration}.") (start-callback . ,ly:grace-music::start-callback) (length . ,ZERO-MOMENT) (iterator-ctor . ,ly:grace-iterator::constructor) - (types . (grace-music music-wrapper-music general-music)) + (types . (grace-music music-wrapper-music)) )) (HarmonicEvent . ((description . "Mark a note as harmonic.") - (types . (general-music post-event event harmonic-event)) + (types . (post-event event harmonic-event)) )) (HyphenEvent . ((description . "A hyphen between lyric syllables.") - (types . (general-music post-event hyphen-event event)) + (types . (post-event hyphen-event event)) )) (KeyChangeEvent @@ -259,29 +258,29 @@ duration stored in @code{duration}.") Syntax: @code{\\key} @var{name} @var{scale}") (to-relative-callback . ,(lambda (x p) p)) - (types . (general-music key-change-event event)) + (types . (key-change-event event)) )) (LabelEvent . ((description . "Place a bookmarking label.") - (types . (general-music label-event event)) + (types . (label-event event)) )) (LaissezVibrerEvent . ((description . "Don't damp this chord. Syntax: @var{note}@code{\\laissezVibrer}") - (types . (general-music post-event event laissez-vibrer-event)) + (types . (post-event event laissez-vibrer-event)) )) (LigatureEvent . ((description . "Start or end a ligature.") - (types . (general-music span-event ligature-event event)) + (types . (span-event ligature-event event)) )) (LineBreakEvent . ((description . "Allow, forbid or force a line break.") - (types . (general-music line-break-event break-event event)) + (types . (line-break-event break-event event)) )) (LyricCombineMusic @@ -289,7 +288,7 @@ Syntax: @var{note}@code{\\laissezVibrer}") Syntax: @code{\\lyricsto} @var{voicename} @var{lyrics}") (length . ,ZERO-MOMENT) - (types . (general-music lyric-combine-music)) + (types . (lyric-combine-music)) (iterator-ctor . ,ly:lyric-combine-music-iterator::constructor) )) @@ -297,7 +296,7 @@ Syntax: @code{\\lyricsto} @var{voicename} @var{lyrics}") . ((description . "A lyric syllable. Must be entered in lyrics mode, i.e., @code{\\lyrics @{ twinkle4 twinkle4 @} }.") (iterator-ctor . ,ly:rhythmic-music-iterator::constructor) - (types . (general-music rhythmic-event lyric-event event)) + (types . (rhythmic-event lyric-event event)) )) (MarkEvent @@ -306,19 +305,19 @@ i.e., @code{\\lyrics @{ twinkle4 twinkle4 @} }.") Syntax: @code{\\mark} @var{marker} Example: @code{\\mark \"A\"}") - (types . (general-music mark-event event)) + (types . (mark-event event)) )) (MeasureCounterEvent . ((description . "Used to signal the start and end of a measure count.") - (types . (general-music measure-counter-event span-event event)) + (types . (measure-counter-event span-event event)) )) (MultiMeasureRestEvent . ((description . "Used internally by @code{MultiMeasureRestMusic} to signal rests.") - (types . (general-music event rhythmic-event - multi-measure-rest-event)) + (iterator-ctor . ,ly:rhythmic-music-iterator::constructor) + (types . (event rhythmic-event multi-measure-rest-event)) )) (MultiMeasureRestMusic @@ -327,7 +326,7 @@ to signal rests.") Syntax: @code{R2.*4} for 4 measures in 3/4 time.") (iterator-ctor . ,ly:sequential-iterator::constructor) (elements-callback . ,mm-rest-child-list) - (types . (general-music multi-measure-rest)) + (types . (multi-measure-rest)) )) (MultiMeasureTextEvent @@ -336,12 +335,12 @@ Syntax: @code{R2.*4} for 4 measures in 3/4 time.") Syntax: @code{R-\\markup @{ \\roman \"bla\" @}} Note the explicit font switch.") - (types . (general-music post-event event multi-measure-text-event)) + (types . (post-event event multi-measure-text-event)) )) (Music . ((description . "Generic type for music expressions.") - (types . (general-music)) + (types . ()) )) (NoteEvent @@ -352,20 +351,19 @@ are broadcast like chord articulations, the others are retained. For iteration inside of chords, @xref{EventChord}.") (iterator-ctor . ,ly:rhythmic-music-iterator::constructor) - (types . (general-music event note-event rhythmic-event - melodic-event)) + (types . (event note-event rhythmic-event melodic-event)) )) (NoteGroupingEvent . ((description . "Start or stop grouping brackets.") - (types . (general-music post-event event note-grouping-event)) + (types . (post-event event note-grouping-event)) )) (OttavaMusic . ((description . "Start or stop an ottava bracket.") (iterator-ctor . ,ly:sequential-iterator::constructor) (elements-callback . ,make-ottava-set) - (types . (general-music ottava-music)) + (types . (ottava-music)) )) (OverrideProperty @@ -373,25 +371,19 @@ For iteration inside of chords, @xref{EventChord}.") Syntax: @code{\\override} [ @var{context} @code{.} ] @var{object} @var{property} @code{=} @var{value}") - (types . (general-music layout-instruction-event - override-property-event)) + (types . (layout-instruction-event override-property-event)) (iterator-ctor . ,ly:push-property-iterator::constructor) (untransposable . #t) )) (PageBreakEvent . ((description . "Allow, forbid or force a page break.") - (types . (general-music break-event page-break-event event)) + (types . (break-event page-break-event event)) )) (PageTurnEvent . ((description . "Allow, forbid or force a page turn.") - (types . (general-music break-event page-turn-event event)) - )) - - (PartCombineForceEvent - . ((description . "Override the part-combiner's strategy.") - (types . (general-music part-combine-force-event event)) + (types . (break-event page-turn-event event)) )) (PartialSet @@ -402,7 +394,7 @@ Syntax: @code{\\override} [ @var{context} @code{.} ] ;; for the overall timing in spite of having a non-zero ;; duration field. (length-callback . ,ly:music-sequence::cumulative-length-callback) - (types . (general-music partial-set)) + (types . (partial-set)) )) (PartCombineMusic @@ -410,13 +402,21 @@ Syntax: @code{\\override} [ @var{context} @code{.} ] as separate voices.") (length-callback . ,ly:music-sequence::maximum-length-callback) (start-callback . ,ly:music-sequence::minimum-start-callback) - (types . (general-music part-combine-music)) + (types . (part-combine-music)) (iterator-ctor . ,ly:part-combine-iterator::constructor) )) + (PartCombinePartMusic + . ((description . "A part to be combined with other parts on a staff.") + (length-callback . ,ly:music-wrapper::length-callback) + (start-callback . ,ly:music-wrapper::start-callback) + (iterator-ctor . ,ly:part-combine-part-iterator::constructor) + (types . (part-combine-part-music music-wrapper-music)) + )) + (PercentEvent . ((description . "Used internally to signal percent repeats.") - (types . (general-music event percent-event rhythmic-event)) + (types . (event percent-event rhythmic-event)) )) (PercentRepeatedMusic @@ -424,14 +424,14 @@ as separate voices.") (iterator-ctor . ,ly:percent-repeat-iterator::constructor) (start-callback . ,ly:repeated-music::first-start) (length-callback . ,ly:repeated-music::unfolded-music-length) - (types . (general-music repeated-music percent-repeated-music)) + (types . (repeated-music percent-repeated-music)) )) (PesOrFlexaEvent . ((description . "Within a ligature, mark the previous and the following note to form a pes (if melody goes up) or a flexa (if melody goes down).") - (types . (general-music pes-or-flexa-event event)) + (types . (pes-or-flexa-event event)) )) (PhrasingSlurEvent @@ -439,7 +439,7 @@ goes down).") Syntax: @var{note}@code{\\(} and @var{note}@code{\\)}") (spanner-id . "") - (types . (general-music post-event span-event event phrasing-slur-event)) + (types . (post-event span-event event phrasing-slur-event)) )) (PostEvents @@ -452,7 +452,7 @@ This can be used to package several events into a single one. Should not be see . ((description . "Set a context property. Syntax: @code{\\set @var{context}.@var{prop} = @var{scheme-val}}") - (types . (layout-instruction-event general-music)) + (types . (layout-instruction-event)) (iterator-ctor . ,ly:property-iterator::constructor) (untransposable . #t) )) @@ -462,7 +462,7 @@ Syntax: @code{\\set @var{context}.@var{prop} = @var{scheme-val}}") property. See @ref{PropertySet}. Syntax: @code{\\unset @var{context}.@var{prop}}") - (types . (layout-instruction-event general-music)) + (types . (layout-instruction-event)) (iterator-ctor . ,ly:property-unset-iterator::constructor) )) @@ -471,37 +471,37 @@ Syntax: @code{\\unset @var{context}.@var{prop}}") (iterator-ctor . ,ly:music-wrapper-iterator::constructor) (length-callback . ,ly:music-wrapper::length-callback) (start-callback . ,ly:music-wrapper::start-callback) - (types . (general-music music-wrapper-music)) + (types . (music-wrapper-music)) )) (RelativeOctaveCheck . ((description . "Check if a pitch is in the correct octave.") (to-relative-callback . ,ly:relative-octave-check::relative-callback) - (types . (general-music relative-octave-check)) + (types . (relative-octave-check)) )) (RelativeOctaveMusic - . ((description . "Music that was entered in relative octave notation.") + . ((description . "Music in which the assignment of octaves is complete.") (to-relative-callback . ,ly:relative-octave-music::relative-callback) (iterator-ctor . ,ly:music-wrapper-iterator::constructor) (length-callback . ,ly:music-wrapper::length-callback) (start-callback . ,ly:music-wrapper::start-callback) - (types . (music-wrapper-music general-music relative-octave-music)) + (types . (music-wrapper-music relative-octave-music)) )) (RepeatedMusic . ((description . "Repeat music in different ways.") - (types . (general-music repeated-music)) + (types . (repeated-music)) )) (RepeatSlashEvent . ((description . "Used internally to signal beat repeats.") - (types . (general-music event repeat-slash-event rhythmic-event)) + (types . (event repeat-slash-event rhythmic-event)) )) (RepeatTieEvent . ((description . "Ties for starting a second volta bracket.") - (types . (general-music post-event event repeat-tie-event)) + (types . (post-event event repeat-tie-event)) )) (RestEvent @@ -509,19 +509,19 @@ Syntax: @code{\\unset @var{context}.@var{prop}}") Syntax: @code{r4} for a quarter rest.") (iterator-ctor . ,ly:rhythmic-music-iterator::constructor) - (types . (general-music event rhythmic-event rest-event)) + (types . (event rhythmic-event rest-event)) )) (RevertProperty . ((description . "The opposite of @ref{OverrideProperty}: remove a previously added property from a graphical object definition.") - (types . (general-music layout-instruction-event)) + (types . (layout-instruction-event)) (iterator-ctor . ,ly:pop-property-iterator::constructor) )) (ScriptEvent . ((description . "Add an articulation mark to a note.") - (types . (general-music event)) + (types . (event)) )) (SequentialMusic @@ -532,7 +532,7 @@ Syntax: @code{\\sequential @{ @dots{} @}} or simply @code{@{ @dots{} @}}") (start-callback . ,ly:music-sequence::first-start-callback) (elements-callback . ,(lambda (m) (ly:music-property m 'elements))) (iterator-ctor . ,ly:sequential-iterator::constructor) - (types . (general-music sequential-music)) + (types . (sequential-music)) )) (SimultaneousMusic @@ -544,7 +544,7 @@ Syntax: @code{\\simultaneous @{ @dots{} @}} or @code{<< @dots{} >>}") (length-callback . ,ly:music-sequence::maximum-length-callback) (to-relative-callback . ,ly:music-sequence::simultaneous-relative-callback) - (types . (general-music simultaneous-music)) + (types . (simultaneous-music)) )) (SkipEvent @@ -553,7 +553,7 @@ print anything. Syntax: @code{s4} for a skip equivalent to a quarter rest.") (iterator-ctor . ,ly:rhythmic-music-iterator::constructor) - (types . (general-music event rhythmic-event skip-event)) + (types . (event rhythmic-event skip-event)) )) (SkipMusic @@ -563,7 +563,7 @@ print anything, and also does not create staves or voices implicitly. Syntax: @code{\\skip} @var{duration}") (length-callback . ,ly:music-duration-length) (iterator-ctor . ,ly:simple-music-iterator::constructor) - (types . (general-music event skip-event)) + (types . (event skip-event)) )) (SlurEvent @@ -571,81 +571,81 @@ Syntax: @code{\\skip} @var{duration}") Syntax: @var{note}@code{(} and @var{note}@code{)}") (spanner-id . "") - (types . (general-music post-event span-event event slur-event)) + (types . (post-event span-event event slur-event)) )) (SoloOneEvent . ((description . "Print @q{Solo@tie{}1}.") (part-combine-status . solo1) - (types . (general-music event part-combine-event solo-one-event)) + (types . (event part-combine-event solo-one-event)) )) (SoloTwoEvent . ((description . "Print @q{Solo@tie{}2}.") (part-combine-status . solo2) - (types . (general-music event part-combine-event solo-two-event)) + (types . (event part-combine-event solo-two-event)) )) (SostenutoEvent . ((description . "Depress or release sostenuto pedal.") - (types . (general-music post-event event pedal-event sostenuto-event)) + (types . (post-event event pedal-event sostenuto-event)) )) (SpacingSectionEvent . ((description . "Start a new spacing section.") - (types . (general-music event spacing-section-event)))) + (types . (event spacing-section-event)))) (SpanEvent . ((description . "Event for anything that is started at a different time than stopped.") - (types . (general-music event)) + (types . (event)) )) (StaffSpanEvent . ((description . "Start or stop a staff symbol.") - (types . (general-music event span-event staff-span-event)) + (types . (event span-event staff-span-event)) )) (StringNumberEvent . ((description . "Specify on which string to play this note. Syntax: @code{\\@var{number}}") - (types . (general-music post-event string-number-event event)) + (types . (post-event string-number-event event)) )) (StrokeFingerEvent . ((description . "Specify with which finger to pluck a string. Syntax: @code{\\rightHandFinger @var{text}}") - (types . (general-music post-event stroke-finger-event event)) + (types . (post-event stroke-finger-event event)) )) (SustainEvent . ((description . "Depress or release sustain pedal.") - (types . (general-music post-event event pedal-event sustain-event)) + (types . (post-event event pedal-event sustain-event)) )) (TempoChangeEvent . ((description . "A metronome mark or tempo indication.") - (types . (general-music event tempo-change-event)) + (types . (event tempo-change-event)) )) (TextScriptEvent . ((description . "Print text.") - (types . (general-music post-event script-event text-script-event event)) + (types . (post-event script-event text-script-event event)) )) (TextSpanEvent . ((description . "Start a text spanner, for example, an octavation.") - (types . (general-music post-event span-event event text-span-event)) + (types . (post-event span-event event text-span-event)) )) (TieEvent . ((description . "A tie. Syntax: @w{@var{note}@code{-~}}") - (types . (general-music post-event tie-event event)) + (types . (post-event tie-event event)) )) (TimeScaledMusic @@ -656,14 +656,19 @@ Syntax: @code{\\times @var{fraction} @var{music}}, e.g., (length-callback . ,ly:music-wrapper::length-callback) (start-callback . ,ly:music-wrapper::start-callback) (iterator-ctor . ,ly:tuplet-iterator::constructor) - (types . (time-scaled-music music-wrapper-music general-music)) + (types . (time-scaled-music music-wrapper-music)) )) (TimeSignatureMusic . ((description . "Set a new time signature") (iterator-ctor . ,ly:sequential-iterator::constructor) (elements-callback . ,make-time-signature-set) - (types . (general-music time-signature-music)) + (types . (time-signature-music)) + )) + + (TimeSignatureEvent + . ((description . "An event created when setting a new time signature") + (types . (event time-signature-event)) )) (TransposedMusic @@ -673,57 +678,57 @@ Syntax: @code{\\times @var{fraction} @var{music}}, e.g., (length-callback . ,ly:music-wrapper::length-callback) (to-relative-callback . ,ly:relative-octave-music::no-relative-callback) - (types . (music-wrapper-music general-music transposed-music)) + (types . (music-wrapper-music transposed-music)) )) (TremoloEvent . ((description . "Unmeasured tremolo.") - (types . (general-music post-event event tremolo-event)) + (types . (post-event event tremolo-event)) )) (TremoloRepeatedMusic . ((description . "Repeated notes denoted by tremolo beams.") (iterator-ctor . ,ly:chord-tremolo-iterator::constructor) (start-callback . ,ly:repeated-music::first-start) - ;; the length of the repeat is handled by shifting the note logs - (length-callback . ,ly:repeated-music::folded-music-length) - (types . (general-music repeated-music tremolo-repeated-music)) + (length-callback . ,ly:repeated-music::unfolded-music-length) + (types . (repeated-music tremolo-repeated-music)) )) (TremoloSpanEvent . ((description . "Tremolo over two stems.") - (types . (general-music event span-event tremolo-span-event)) + (types . (event span-event tremolo-span-event)) )) (TrillSpanEvent . ((description . "Start a trill spanner.") - (types . (general-music post-event span-event event trill-span-event)) + (types . (post-event span-event event trill-span-event)) )) (TupletSpanEvent . ((description . "Used internally to signal where tuplet brackets start and stop.") - (types . (tuplet-span-event span-event event general-music post-event)) + (types . (tuplet-span-event span-event event post-event)) )) (UnaCordaEvent . ((description . "Depress or release una-corda pedal.") - (types . (general-music post-event event pedal-event una-corda-event)) + (types . (post-event event pedal-event una-corda-event)) )) (UnfoldedRepeatedMusic . ((description . "Repeated music which is fully written (and played) out.") - (iterator-ctor . ,ly:unfolded-repeat-iterator::constructor) + (iterator-ctor . ,ly:sequential-iterator::constructor) + (elements-callback . ,make-unfolded-set) (start-callback . ,ly:repeated-music::first-start) - (types . (general-music repeated-music unfolded-repeated-music)) + (types . (repeated-music unfolded-repeated-music)) (length-callback . ,ly:repeated-music::unfolded-music-length) )) (UnisonoEvent . ((description . "Print @q{a@tie{}2}.") (part-combine-status . unisono) - (types . (general-music event part-combine-event unisono-event)))) + (types . (event part-combine-event unisono-event)))) (UnrelativableMusic . ((description . "Music that cannot be converted from relative @@ -731,14 +736,15 @@ to absolute notation. For example, transposed music.") (to-relative-callback . ,ly:relative-octave-music::no-relative-callback) (iterator-ctor . ,ly:music-wrapper-iterator::constructor) (length-callback . ,ly:music-wrapper::length-callback) - (types . (music-wrapper-music general-music unrelativable-music)) + (start-callback . ,ly:music-wrapper::start-callback) + (types . (music-wrapper-music unrelativable-music)) )) (VoiceSeparator . ((description . "Separate polyphonic voices in simultaneous music. Syntax: @code{\\\\}") - (types . (separator general-music)) + (types . (separator)) )) (VoltaRepeatedMusic @@ -747,7 +753,7 @@ Syntax: @code{\\\\}") (elements-callback . ,make-volta-set) (start-callback . ,ly:repeated-music::first-start) (length-callback . ,ly:repeated-music::volta-music-length) - (types . (general-music repeated-music volta-repeated-music)) + (types . (repeated-music volta-repeated-music)) )) )) @@ -815,16 +821,3 @@ override earlier ones." (ly:error (_ "bad make-music argument: ~S") e)))))) (set-props music-properties) m))) - -(define-public (make-repeated-music name) - (let* ((repeated-music (assoc-get name '(("volta" . VoltaRepeatedMusic) - ("unfold" . UnfoldedRepeatedMusic) - ("percent" . PercentRepeatedMusic) - ("tremolo" . TremoloRepeatedMusic)))) - (repeated-music-name (if repeated-music - repeated-music - (begin - (ly:warning (_ "unknown repeat type `~S'") name) - (ly:warning (_ "See define-music-types.scm for supported repeats")) - 'VoltaRepeatedMusic)))) - (make-music repeated-music-name))) diff --git a/scm/define-note-names.scm b/scm/define-note-names.scm index 62ef21a72c..e7d208a511 100644 --- a/scm/define-note-names.scm +++ b/scm/define-note-names.scm @@ -1,22 +1,22 @@ ;;;; Common note names in various languages. ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2010--2012 Valentin Villenave et al: +;;;; Copyright (C) 2010--2015 Valentin Villenave et al: ;;;; -;;;; Copyright (C) 1996--2012 Han-Wen Nienhuys (Nederlands) -;;;; Copyright (C) 1998--2012 Jaume Obrador (Catalan) -;;;; Copyright (C) 1997--2012 Roland Meier +;;;; Copyright (C) 1996--2015 Han-Wen Nienhuys (Nederlands) +;;;; Copyright (C) 1998--2015 Jaume Obrador (Catalan) +;;;; Copyright (C) 1997--2015 Roland Meier ;;;; Bjoern Jacke (Deutsch) -;;;; Copyright (C) 1996--2012 Han-Wen Nienhuys (English) -;;;; Copyright (C) 2002--2012 Carlos García Suárez +;;;; Copyright (C) 1996--2015 Han-Wen Nienhuys (English) +;;;; Copyright (C) 2002--2015 Carlos García Suárez ;;;; Maximiliano G. G. (Espanol) -;;;; Copyright (C) 1998--2012 Paolo Zuliani +;;;; Copyright (C) 1998--2015 Paolo Zuliani ;;;; Eric Wurbel (Italiano) -;;;; Copyright (C) 1998--2012 Arvid Grøtting (Norsk) -;;;; Copyright (C) 2004--2012 Pedro Kröger (Portugues) -;;;; Copyright (C) 2001--2012 Heikki Junes (Suomi) -;;;; Copyright (C) 1997--2012 Mats Bengtsson (Svenska) -;;;; Copyright (C) 2004--2012 Hendrik Maryns (Vlaams) +;;;; Copyright (C) 1998--2015 Arvid Grøtting (Norsk) +;;;; Copyright (C) 2004--2015 Pedro Kröger (Portugues) +;;;; Copyright (C) 2001--2015 Heikki Junes (Suomi) +;;;; Copyright (C) 1997--2015 Mats Bengtsson (Svenska) +;;;; Copyright (C) 2004--2015 Hendrik Maryns (Vlaams) ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -33,11 +33,16 @@ ;;; Variable declaration -(define-public pitchnames '()) -(define-public default-language "") -(define-public previous-pitchnames #f) +(define-session-public pitchnames '()) +(define-session-public default-language "") +(define-session-public previous-pitchnames #f) -(define-public language-pitch-names +;;; A bit out of place, but we don't have a good place elsewhere in +;;; scm since it is only filled in ly/drumpitch-init.ly and we need it +;;; in (scm lily) in order to access it in ly/parser.yy. +(define-session-public drumPitchNames '()) + +(define-session-public language-pitch-names `( ;; Language: Nederlands --------------------------------------------; ;; Dutch note names -- LilyPond's default language. @@ -58,76 +63,76 @@ (nederlands . ( (ceses . ,(ly:make-pitch -1 0 DOUBLE-FLAT)) - (ceh . ,(ly:make-pitch -1 0 SEMI-FLAT)) - (ces . ,(ly:make-pitch -1 0 FLAT)) (ceseh . ,(ly:make-pitch -1 0 THREE-Q-FLAT)) + (ces . ,(ly:make-pitch -1 0 FLAT)) + (ceh . ,(ly:make-pitch -1 0 SEMI-FLAT)) (c . ,(ly:make-pitch -1 0 NATURAL)) - (cis . ,(ly:make-pitch -1 0 SHARP)) (cih . ,(ly:make-pitch -1 0 SEMI-SHARP)) + (cis . ,(ly:make-pitch -1 0 SHARP)) (cisih . ,(ly:make-pitch -1 0 THREE-Q-SHARP)) (cisis . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) - (deses . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) - (deh . ,(ly:make-pitch -1 1 SEMI-FLAT)) - (des . ,(ly:make-pitch -1 1 FLAT)) + (deses . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) (deseh . ,(ly:make-pitch -1 1 THREE-Q-FLAT)) + (des . ,(ly:make-pitch -1 1 FLAT)) + (deh . ,(ly:make-pitch -1 1 SEMI-FLAT)) (d . ,(ly:make-pitch -1 1 NATURAL)) - (dis . ,(ly:make-pitch -1 1 SHARP)) (dih . ,(ly:make-pitch -1 1 SEMI-SHARP)) + (dis . ,(ly:make-pitch -1 1 SHARP)) (disih . ,(ly:make-pitch -1 1 THREE-Q-SHARP)) (disis . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) + (eeses . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) (eses . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) - - (eeh . ,(ly:make-pitch -1 2 SEMI-FLAT)) - (ees . ,(ly:make-pitch -1 2 FLAT)) (eeseh . ,(ly:make-pitch -1 2 THREE-Q-FLAT)) + (ees . ,(ly:make-pitch -1 2 FLAT)) (es . ,(ly:make-pitch -1 2 FLAT)) + (eeh . ,(ly:make-pitch -1 2 SEMI-FLAT)) (e . ,(ly:make-pitch -1 2 NATURAL)) - (eis . ,(ly:make-pitch -1 2 SHARP)) (eih . ,(ly:make-pitch -1 2 SEMI-SHARP)) + (eis . ,(ly:make-pitch -1 2 SHARP)) (eisih . ,(ly:make-pitch -1 2 THREE-Q-SHARP)) (eisis . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) - (feses . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) - (feh . ,(ly:make-pitch -1 3 SEMI-FLAT)) - (fes . ,(ly:make-pitch -1 3 FLAT)) + (feses . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) (feseh . ,(ly:make-pitch -1 3 THREE-Q-FLAT)) + (fes . ,(ly:make-pitch -1 3 FLAT)) + (feh . ,(ly:make-pitch -1 3 SEMI-FLAT)) (f . ,(ly:make-pitch -1 3 NATURAL)) - (fis . ,(ly:make-pitch -1 3 SHARP)) (fih . ,(ly:make-pitch -1 3 SEMI-SHARP)) + (fis . ,(ly:make-pitch -1 3 SHARP)) (fisih . ,(ly:make-pitch -1 3 THREE-Q-SHARP)) (fisis . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) - (geses . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) - (geh . ,(ly:make-pitch -1 4 SEMI-FLAT)) - (ges . ,(ly:make-pitch -1 4 FLAT)) + (geses . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) (geseh . ,(ly:make-pitch -1 4 THREE-Q-FLAT)) + (ges . ,(ly:make-pitch -1 4 FLAT)) + (geh . ,(ly:make-pitch -1 4 SEMI-FLAT)) (g . ,(ly:make-pitch -1 4 NATURAL)) - (gis . ,(ly:make-pitch -1 4 SHARP)) (gih . ,(ly:make-pitch -1 4 SEMI-SHARP)) + (gis . ,(ly:make-pitch -1 4 SHARP)) (gisih . ,(ly:make-pitch -1 4 THREE-Q-SHARP)) (gisis . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) + (aeses . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) (ases . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) - - (aeh . ,(ly:make-pitch -1 5 SEMI-FLAT)) - (aes . ,(ly:make-pitch -1 5 FLAT)) (aeseh . ,(ly:make-pitch -1 5 THREE-Q-FLAT)) + (aes . ,(ly:make-pitch -1 5 FLAT)) (as . ,(ly:make-pitch -1 5 FLAT)) + (aeh . ,(ly:make-pitch -1 5 SEMI-FLAT)) (a . ,(ly:make-pitch -1 5 NATURAL)) - (ais . ,(ly:make-pitch -1 5 SHARP)) (aih . ,(ly:make-pitch -1 5 SEMI-SHARP)) + (ais . ,(ly:make-pitch -1 5 SHARP)) (aisih . ,(ly:make-pitch -1 5 THREE-Q-SHARP)) (aisis . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) - (beses . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) - (beh . ,(ly:make-pitch -1 6 SEMI-FLAT)) - (bes . ,(ly:make-pitch -1 6 FLAT)) + (beses . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) (beseh . ,(ly:make-pitch -1 6 THREE-Q-FLAT)) + (bes . ,(ly:make-pitch -1 6 FLAT)) + (beh . ,(ly:make-pitch -1 6 SEMI-FLAT)) (b . ,(ly:make-pitch -1 6 NATURAL)) - (bis . ,(ly:make-pitch -1 6 SHARP)) (bih . ,(ly:make-pitch -1 6 SEMI-SHARP)) + (bis . ,(ly:make-pitch -1 6 SHARP)) (bisih . ,(ly:make-pitch -1 6 THREE-Q-SHARP)) (bisis . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) )) @@ -154,31 +159,37 @@ (do . ,(ly:make-pitch -1 0 NATURAL)) (dod . ,(ly:make-pitch -1 0 SHARP)) (dodd . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) + (rebb . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) (reb . ,(ly:make-pitch -1 1 FLAT)) (re . ,(ly:make-pitch -1 1 NATURAL)) (red . ,(ly:make-pitch -1 1 SHARP)) (redd . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) + (mibb . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) (mib . ,(ly:make-pitch -1 2 FLAT)) (mi . ,(ly:make-pitch -1 2 NATURAL)) (mid . ,(ly:make-pitch -1 2 SHARP)) (midd . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) + (fabb . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) (fab . ,(ly:make-pitch -1 3 FLAT)) (fa . ,(ly:make-pitch -1 3 NATURAL)) (fad . ,(ly:make-pitch -1 3 SHARP)) (fadd . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) + (solbb . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) (solb . ,(ly:make-pitch -1 4 FLAT)) (sol . ,(ly:make-pitch -1 4 NATURAL)) (sold . ,(ly:make-pitch -1 4 SHARP)) (soldd . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) + (labb . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) (lab . ,(ly:make-pitch -1 5 FLAT)) (la . ,(ly:make-pitch -1 5 NATURAL)) (lad . ,(ly:make-pitch -1 5 SHARP)) (ladd . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) + (sibb . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) (sib . ,(ly:make-pitch -1 6 FLAT)) (si . ,(ly:make-pitch -1 6 NATURAL)) @@ -272,9 +283,9 @@ (gisis . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) (asas . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) + (ases . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) ;; non-standard name for asas (asah . ,(ly:make-pitch -1 5 THREE-Q-FLAT)) - (ases . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) ;;non-standard name for asas - (aseh . ,(ly:make-pitch -1 5 THREE-Q-FLAT)) + (aseh . ,(ly:make-pitch -1 5 THREE-Q-FLAT)) ;; non-standard name for asah (as . ,(ly:make-pitch -1 5 FLAT)) (aeh . ,(ly:make-pitch -1 5 SEMI-FLAT)) (a . ,(ly:make-pitch -1 5 NATURAL)) @@ -310,42 +321,6 @@ ;; tqs = three-quarter[-tones] sharp (english . ( - (cflatflat . ,(ly:make-pitch -1 0 DOUBLE-FLAT)) - (cflat . ,(ly:make-pitch -1 0 FLAT)) - (c . ,(ly:make-pitch -1 0 NATURAL)) - (csharp . ,(ly:make-pitch -1 0 SHARP)) - (csharpsharp . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) - (dflatflat . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) - (dflat . ,(ly:make-pitch -1 1 FLAT)) - (d . ,(ly:make-pitch -1 1 NATURAL)) - (dsharp . ,(ly:make-pitch -1 1 SHARP)) - (dsharpsharp . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) - (eflatflat . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) - (eflat . ,(ly:make-pitch -1 2 FLAT)) - (e . ,(ly:make-pitch -1 2 NATURAL)) - (esharp . ,(ly:make-pitch -1 2 SHARP)) - (esharpsharp . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) - (fflatflat . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) - (fflat . ,(ly:make-pitch -1 3 FLAT)) - (f . ,(ly:make-pitch -1 3 NATURAL)) - (fsharp . ,(ly:make-pitch -1 3 SHARP)) - (fsharpsharp . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) - (gflatflat . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) - (gflat . ,(ly:make-pitch -1 4 FLAT)) - (g . ,(ly:make-pitch -1 4 NATURAL)) - (gsharp . ,(ly:make-pitch -1 4 SHARP)) - (gsharpsharp . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) - (aflatflat . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) - (aflat . ,(ly:make-pitch -1 5 FLAT)) - (a . ,(ly:make-pitch -1 5 NATURAL)) - (asharp . ,(ly:make-pitch -1 5 SHARP)) - (asharpsharp . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) - (bflatflat . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) - (bflat . ,(ly:make-pitch -1 6 FLAT)) - (b . ,(ly:make-pitch -1 6 NATURAL)) - (bsharp . ,(ly:make-pitch -1 6 SHARP)) - (bsharpsharp . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) - (cff . ,(ly:make-pitch -1 0 DOUBLE-FLAT)) (ctqf . ,(ly:make-pitch -1 0 THREE-Q-FLAT)) (cf . ,(ly:make-pitch -1 0 FLAT)) @@ -422,6 +397,48 @@ (btqs . ,(ly:make-pitch -1 6 THREE-Q-SHARP)) (bss . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) (bx . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) + + (c-flatflat . ,(ly:make-pitch -1 0 DOUBLE-FLAT)) + (c-flat . ,(ly:make-pitch -1 0 FLAT)) + (c-natural . ,(ly:make-pitch -1 0 NATURAL)) + (c-sharp . ,(ly:make-pitch -1 0 SHARP)) + (c-sharpsharp . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) + + (d-flatflat . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) + (d-flat . ,(ly:make-pitch -1 1 FLAT)) + (d-natural . ,(ly:make-pitch -1 1 NATURAL)) + (d-sharp . ,(ly:make-pitch -1 1 SHARP)) + (d-sharpsharp . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) + + (e-flatflat . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) + (e-flat . ,(ly:make-pitch -1 2 FLAT)) + (e-natural . ,(ly:make-pitch -1 2 NATURAL)) + (e-sharp . ,(ly:make-pitch -1 2 SHARP)) + (e-sharpsharp . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) + + (f-flatflat . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) + (f-flat . ,(ly:make-pitch -1 3 FLAT)) + (f-natural . ,(ly:make-pitch -1 3 NATURAL)) + (f-sharp . ,(ly:make-pitch -1 3 SHARP)) + (f-sharpsharp . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) + + (g-flatflat . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) + (g-flat . ,(ly:make-pitch -1 4 FLAT)) + (g-natural . ,(ly:make-pitch -1 4 NATURAL)) + (g-sharp . ,(ly:make-pitch -1 4 SHARP)) + (g-sharpsharp . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) + + (a-flatflat . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) + (a-flat . ,(ly:make-pitch -1 5 FLAT)) + (a-natural . ,(ly:make-pitch -1 5 NATURAL)) + (a-sharp . ,(ly:make-pitch -1 5 SHARP)) + (a-sharpsharp . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) + + (b-flatflat . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) + (b-flat . ,(ly:make-pitch -1 6 FLAT)) + (b-natural . ,(ly:make-pitch -1 6 NATURAL)) + (b-sharp . ,(ly:make-pitch -1 6 SHARP)) + (b-sharpsharp . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) )) @@ -523,6 +540,114 @@ )) + ;; Language: Français ----------------------------------------------; + ;; Valentin Villenave , + ;; + ;; b = flat (bémol) + ;; bb = double-flat + ;; sb = quarter-tone flat (demi-bémol) + ;; bsb = three-quarter-tones flat + ;; + ;; d = sharp (dièse) + ;; dd = double-sharp + ;; x = double-sharp + ;; sd = quarter-tone sharp (demi-dièse) + ;; dsd = three-quarter-tones sharp + ;; + ;; English: c d e f g a b + ;; French: do ré mi fa sol la si + + (français . ( + (dobb . ,(ly:make-pitch -1 0 DOUBLE-FLAT)) + (dobsb . ,(ly:make-pitch -1 0 THREE-Q-FLAT)) + (dob . ,(ly:make-pitch -1 0 FLAT)) + (dosb . ,(ly:make-pitch -1 0 SEMI-FLAT)) + (do . ,(ly:make-pitch -1 0 NATURAL)) + (dosd . ,(ly:make-pitch -1 0 SEMI-SHARP)) + (dod . ,(ly:make-pitch -1 0 SHARP)) + (dodsd . ,(ly:make-pitch -1 0 THREE-Q-SHARP)) + (dodd . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) + (dox . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) + + (rébb . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) + (rébsb . ,(ly:make-pitch -1 1 THREE-Q-FLAT)) + (réb . ,(ly:make-pitch -1 1 FLAT)) + (résb . ,(ly:make-pitch -1 1 SEMI-FLAT)) + (ré . ,(ly:make-pitch -1 1 NATURAL)) + (résd . ,(ly:make-pitch -1 1 SEMI-SHARP)) + (réd . ,(ly:make-pitch -1 1 SHARP)) + (rédsd . ,(ly:make-pitch -1 1 THREE-Q-SHARP)) + (rédd . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) + (réx . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) + + (rebb . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) + (rebsb . ,(ly:make-pitch -1 1 THREE-Q-FLAT)) + (reb . ,(ly:make-pitch -1 1 FLAT)) + (resb . ,(ly:make-pitch -1 1 SEMI-FLAT)) + (re . ,(ly:make-pitch -1 1 NATURAL)) + (resd . ,(ly:make-pitch -1 1 SEMI-SHARP)) + (red . ,(ly:make-pitch -1 1 SHARP)) + (redsd . ,(ly:make-pitch -1 1 THREE-Q-SHARP)) + (redd . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) + (rex . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) + + (mibb . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) + (mibsb . ,(ly:make-pitch -1 2 THREE-Q-FLAT)) + (mib . ,(ly:make-pitch -1 2 FLAT)) + (misb . ,(ly:make-pitch -1 2 SEMI-FLAT)) + (mi . ,(ly:make-pitch -1 2 NATURAL)) + (misd . ,(ly:make-pitch -1 2 SEMI-SHARP)) + (mid . ,(ly:make-pitch -1 2 SHARP)) + (midsd . ,(ly:make-pitch -1 2 THREE-Q-SHARP)) + (midd . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) + (mix . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) + + (fabb . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) + (fabsb . ,(ly:make-pitch -1 3 THREE-Q-FLAT)) + (fab . ,(ly:make-pitch -1 3 FLAT)) + (fasb . ,(ly:make-pitch -1 3 SEMI-FLAT)) + (fa . ,(ly:make-pitch -1 3 NATURAL)) + (fasd . ,(ly:make-pitch -1 3 SEMI-SHARP)) + (fad . ,(ly:make-pitch -1 3 SHARP)) + (fadsd . ,(ly:make-pitch -1 3 THREE-Q-SHARP)) + (fadd . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) + (fax . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) + + (solbb . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) + (solbsb . ,(ly:make-pitch -1 4 THREE-Q-FLAT)) + (solb . ,(ly:make-pitch -1 4 FLAT)) + (solsb . ,(ly:make-pitch -1 4 SEMI-FLAT)) + (sol . ,(ly:make-pitch -1 4 NATURAL)) + (solsd . ,(ly:make-pitch -1 4 SEMI-SHARP)) + (sold . ,(ly:make-pitch -1 4 SHARP)) + (soldsd . ,(ly:make-pitch -1 4 THREE-Q-SHARP)) + (soldd . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) + (solx . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) + + (labb . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) + (labsb . ,(ly:make-pitch -1 5 THREE-Q-FLAT)) + (lab . ,(ly:make-pitch -1 5 FLAT)) + (lasb . ,(ly:make-pitch -1 5 SEMI-FLAT)) + (la . ,(ly:make-pitch -1 5 NATURAL)) + (lasd . ,(ly:make-pitch -1 5 SEMI-SHARP)) + (lad . ,(ly:make-pitch -1 5 SHARP)) + (ladsd . ,(ly:make-pitch -1 5 THREE-Q-SHARP)) + (ladd . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) + (lax . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) + + (sibb . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) + (sibsb . ,(ly:make-pitch -1 6 THREE-Q-FLAT)) + (sib . ,(ly:make-pitch -1 6 FLAT)) + (sisb . ,(ly:make-pitch -1 6 SEMI-FLAT)) + (si . ,(ly:make-pitch -1 6 NATURAL)) + (sisd . ,(ly:make-pitch -1 6 SEMI-SHARP)) + (sid . ,(ly:make-pitch -1 6 SHARP)) + (sidsd . ,(ly:make-pitch -1 6 THREE-Q-SHARP)) + (sidd . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) + (six . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) + )) + + ;; Language: Italiano ----------------------------------------------; ;; Paolo Zuliani , ;; Eric Wurbel @@ -610,7 +735,6 @@ (sid . ,(ly:make-pitch -1 6 SHARP)) (sidsd . ,(ly:make-pitch -1 6 THREE-Q-SHARP)) (sidd . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) - )) @@ -640,6 +764,7 @@ (ciss . ,(ly:make-pitch -1 0 SHARP)) (cisis . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) (cississ . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) + (deses . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) (dessess . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) (des . ,(ly:make-pitch -1 1 FLAT)) @@ -649,6 +774,7 @@ (diss . ,(ly:make-pitch -1 1 SHARP)) (disis . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) (dississ . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) + (eeses . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) (eessess . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) (eses . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) @@ -662,6 +788,7 @@ (eiss . ,(ly:make-pitch -1 2 SHARP)) (eisis . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) (eississ . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) + (feses . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) (fessess . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) (fes . ,(ly:make-pitch -1 3 FLAT)) @@ -671,6 +798,7 @@ (fiss . ,(ly:make-pitch -1 3 SHARP)) (fisis . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) (fississ . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) + (geses . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) (gessess . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) (ges . ,(ly:make-pitch -1 4 FLAT)) @@ -681,6 +809,7 @@ (giss . ,(ly:make-pitch -1 4 SHARP)) (gisis . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) (gississ . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) + (aeses . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) (aessess . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) (ases . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) @@ -694,6 +823,7 @@ (aiss . ,(ly:make-pitch -1 5 SHARP)) (aisis . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) (aississ . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) + (bes . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) (bess . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) (b . ,(ly:make-pitch -1 6 FLAT)) @@ -792,7 +922,6 @@ (sis . ,(ly:make-pitch -1 6 SHARP)) (sistqt . ,(ly:make-pitch -1 6 THREE-Q-SHARP)) (siss . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) - )) @@ -814,35 +943,41 @@ (c . ,(ly:make-pitch -1 0 NATURAL)) (cis . ,(ly:make-pitch -1 0 SHARP)) (cisis . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) + (deses . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) (des . ,(ly:make-pitch -1 1 FLAT)) (d . ,(ly:make-pitch -1 1 NATURAL)) (dis . ,(ly:make-pitch -1 1 SHARP)) (disis . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) + (eses . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) (es . ,(ly:make-pitch -1 2 FLAT)) (e . ,(ly:make-pitch -1 2 NATURAL)) (eis . ,(ly:make-pitch -1 2 SHARP)) (eisis . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) + (feses . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) (fes . ,(ly:make-pitch -1 3 FLAT)) (f . ,(ly:make-pitch -1 3 NATURAL)) (fis . ,(ly:make-pitch -1 3 SHARP)) (fisis . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) + (geses . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) (ges . ,(ly:make-pitch -1 4 FLAT)) (g . ,(ly:make-pitch -1 4 NATURAL)) (gis . ,(ly:make-pitch -1 4 SHARP)) (gisis . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) + (asas . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) - (ases . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) ;;non-standard name for asas + (ases . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) ;; non-standard name for asas (as . ,(ly:make-pitch -1 5 FLAT)) (a . ,(ly:make-pitch -1 5 NATURAL)) (ais . ,(ly:make-pitch -1 5 SHARP)) (aisis . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) - (bb . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) ;; should be bes. Kept for downwards compatibility + + (bb . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) ;; should be bes; kept for downwards compatibility (bes . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) - (heses . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) ;;non-standard name for bb + (heses . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) ;; non-standard name for bb (b . ,(ly:make-pitch -1 6 FLAT)) (h . ,(ly:make-pitch -1 6 NATURAL)) (his . ,(ly:make-pitch -1 6 SHARP)) @@ -868,31 +1003,37 @@ (c . ,(ly:make-pitch -1 0 NATURAL)) (ciss . ,(ly:make-pitch -1 0 SHARP)) (cississ . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) + (dessess . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) (dess . ,(ly:make-pitch -1 1 FLAT)) (d . ,(ly:make-pitch -1 1 NATURAL)) (diss . ,(ly:make-pitch -1 1 SHARP)) (dississ . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) + (essess . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) (ess . ,(ly:make-pitch -1 2 FLAT)) (e . ,(ly:make-pitch -1 2 NATURAL)) (eiss . ,(ly:make-pitch -1 2 SHARP)) (eississ . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) + (fessess . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) (fess . ,(ly:make-pitch -1 3 FLAT)) (f . ,(ly:make-pitch -1 3 NATURAL)) (fiss . ,(ly:make-pitch -1 3 SHARP)) (fississ . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) + (gessess . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) (gess . ,(ly:make-pitch -1 4 FLAT)) (g . ,(ly:make-pitch -1 4 NATURAL)) (giss . ,(ly:make-pitch -1 4 SHARP)) (gississ . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) + (assess . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) (ass . ,(ly:make-pitch -1 5 FLAT)) (a . ,(ly:make-pitch -1 5 NATURAL)) (aiss . ,(ly:make-pitch -1 5 SHARP)) (aississ . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) + (hessess . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) (b . ,(ly:make-pitch -1 6 FLAT)) (h . ,(ly:make-pitch -1 6 NATURAL)) @@ -965,10 +1106,9 @@ (append language-pitch-names (list (cons (cadr pair) (cdr (assoc (car pair) language-pitch-names))))))) - '((espanol español) - (italiano français))) + '((espanol español))) -(define-public (note-names-language parser str) +(define-public (note-names-language str) (_ "Select note names language.") (let ((alist (assoc-get (string->symbol str) language-pitch-names @@ -977,5 +1117,5 @@ (begin (ly:debug (_ "Using `~a' note names...") str) (set! pitchnames alist) - (ly:parser-set-note-names parser alist)) + (ly:parser-set-note-names alist)) (ly:warning (_ "Could not find language `~a'. Ignoring.") str)))) diff --git a/scm/define-stencil-commands.scm b/scm/define-stencil-commands.scm index 4c834591a3..7eb31a9600 100644 --- a/scm/define-stencil-commands.scm +++ b/scm/define-stencil-commands.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2005--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2005--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/define-woodwind-diagrams.scm b/scm/define-woodwind-diagrams.scm index 0847d4c93f..48aaf68239 100644 --- a/scm/define-woodwind-diagrams.scm +++ b/scm/define-woodwind-diagrams.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2010--2012 Mike Solomon +;;;; Copyright (C) 2010--2015 Mike Solomon ;;;; Clarinet drawings copied from diagrams created by ;;;; Gilles Thibault ;;;; diff --git a/scm/display-lily.scm b/scm/display-lily.scm index f67125337b..6a53f1eded 100644 --- a/scm/display-lily.scm +++ b/scm/display-lily.scm @@ -2,7 +2,7 @@ ;;; ;;; ;;; -;;; Copyright (C) 2005--2012 Nicolas Sceaux +;;; Copyright (C) 2005--2015 Nicolas Sceaux ;;; ;;; - This file defines the procedures used to define display methods for each @@ -11,10 +11,10 @@ ;;; Display methods are stored in the `display-methods' property of each music ;;; type. ;;; -;;; - `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. +;;; - `music->lily-string' return a string describing a music +;;; expression using LilyPond notation. The special variables *indent* +;;; and *omit-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. @@ -41,7 +41,7 @@ `display-methods' property of the music type entry found in the `music-name-to-property-table' hash table. Print methods previously defined for that music type are lost. -Syntax: (define-display-method MusicType (expression parser) +Syntax: (define-display-method MusicType (expression) ...body...))" `(let ((type-props (hashq-ref music-name-to-property-table ',music-type '())) @@ -99,7 +99,7 @@ display method will be called." (scheme-expr->lily-string val)))) (ly:music-property expr 'tweaks)))) -(define-public (music->lily-string expr parser) +(define-public (music->lily-string expr) "Print @var{expr}, a music expression, in LilyPond syntax." (if (ly:music? expr) (let* ((music-type (ly:music-property expr 'name)) @@ -107,7 +107,7 @@ display method will be called." music-type '()) 'display-methods)) (result-string (and procs (any (lambda (proc) - (proc expr parser)) + (proc expr)) procs)))) (if result-string (format #f "~a~a~a" @@ -248,7 +248,7 @@ Generate binding forms by looking for ?var symbol in pattern." (cdr prop-elements)))) elements-list)))) -(define-macro (with-music-match music-expr+pattern . body) +(defmacro-public with-music-match (music-expr+pattern . body) "If `music-expr' matches `pattern', call `body'. `pattern' should look like: '(music property value @@ -282,11 +282,8 @@ inside body." ;;; indentation (define-public *indent* (make-parameter 0)) -;;; set to #t to force duration printing -(define-public *force-duration* (make-parameter #f)) - -;;; last duration found -(define-public *previous-duration* (make-parameter (ly:make-duration 2))) +;;; set to #t to omit duration printing +(define-public *omit-duration* (make-parameter #f)) ;;; 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/display-woodwind-diagrams.scm b/scm/display-woodwind-diagrams.scm index 5b34ac94fc..7a3f72cba6 100644 --- a/scm/display-woodwind-diagrams.scm +++ b/scm/display-woodwind-diagrams.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2010--2012 Mike Solomon +;;;; Copyright (C) 2010--2015 Mike Solomon ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/document-backend.scm b/scm/document-backend.scm index c1288deff5..0ba63b2cfc 100644 --- a/scm/document-backend.scm +++ b/scm/document-backend.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2000--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -16,27 +16,30 @@ ;;;; You should have received a copy of the GNU General Public License ;;;; along with LilyPond. If not, see . -(define (sort-grob-properties x) +(define (sort-grob-properties props) ;; force 'meta to the end of each prop-list - (let ((meta (assoc 'meta x))) - (append (sort (assoc-remove! x 'meta) ly:alist-citexi description) "\n\nThis object supports the following interface(s):\n" (human-listify ifacedoc) @@ -173,6 +176,16 @@ node." (cons (cons key val) prior)) '() (ly:all-grob-interfaces))) +;; sort user-settable and internal props within each grob-interface +(set! interface-description-alist + (map! (lambda (iface-desc) + (let* ((key-name-docstr (list-head iface-desc 3)) + (props (list-tail iface-desc 3)) + (sorted-props (list (sort (car props) ly:symbol-ci +;;;; Copyright (C) 2011--2015 Neil Puttock ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -29,32 +29,31 @@ (let ((value (car args)) (path (cdr args))) (string-append - "@item Sets " - (format "grob property @code{~a} " + (format #f "@item Sets grob property @code{~a} " (grob-property-path path)) - (format "in @code{@rinternals{~a}} to ~a." - name-sym - (scm->texi value)) - "\n"))) + (format #f "in @code{@rinternals{~a}} to" name-sym) + (if (pretty-printable? value) + (format #f ":~a\n" (scm->texi value)) + (format #f " ~a.\n" (scm->texi value)))))) ((pop) (string-append - "@item Reverts " - (format "grob property @code{~a} " + (format #f "@item Reverts grob property @code{~a} " (grob-property-path (car args))) - (format "in @code{@rinternals{~a}}." - name-sym) - "\n")) + (format #f "in @code{@rinternals{~a}}.\n" + name-sym))) ((assign) - (format "@item Sets translator property @code{~a} to ~a.\n" - name-sym - (scm->texi (car args)))) + (string-append + (format #f "@item Sets translator property @code{~a} to" name-sym) + (if (pretty-printable? value) + (format #f ":~a\n" (scm->texi (car args))) + (format #f " ~a.\n" (scm->texi (car args)))))) ((unset) - (format "@item Unsets translator property @code{~a}.\n" + (format #f "@item Unsets translator property @code{~a}.\n" name-sym)) ((consists) - (format "@item Adds @code{@rinternals{~a}}.\n" name-sym)) + (format #f "@item Adds @code{@rinternals{~a}}.\n" name-sym)) ((remove) - (format "@item Removes @code{@rinternals{~a}}.\n" name-sym)) + (format #f "@item Removes @code{@rinternals{~a}}.\n" name-sym)) (else "")))) (define (document-context-mod context-mod-pair) @@ -63,7 +62,7 @@ (docstring (filter (lambda (mod) (eq? (car mod) 'description)) mod-list))) - (format + (format #f "@item @code{~a} @findex ~a ~a @@ -85,7 +84,7 @@ (document-context-mod obj-pair))) (define context-mods-doc-string - (format + (format #f "@table @asis ~a @end table diff --git a/scm/document-functions.scm b/scm/document-functions.scm index 2102f640e0..d1bc74340d 100644 --- a/scm/document-functions.scm +++ b/scm/document-functions.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify diff --git a/scm/document-identifiers.scm b/scm/document-identifiers.scm index 22088605d7..39d4284088 100644 --- a/scm/document-identifiers.scm +++ b/scm/document-identifiers.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2006--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2006--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -22,10 +22,12 @@ ((name-sym (car music-func-pair)) (music-func (cdr music-func-pair)) (func (ly:music-function-extract music-func)) - (arg-names - (map symbol->string - (cddr (cadr (procedure-source func))))) - (doc (procedure-documentation func)) + (full-doc (procedure-documentation func)) + (match-args (and full-doc (string-match "^\\([^)]*\\)\n" full-doc))) + (arg-names (if match-args + (with-input-from-string (match:string match-args) read) + (circular-list "arg"))) + (doc (if match-args (match:suffix match-args) full-doc)) (sign (ly:music-function-signature music-func)) (type-names (map (lambda (pred) (if (pair? pred) @@ -44,7 +46,7 @@ name-sym (car type-names) (if (string-null? signature-str) "" " - ") signature-str name-sym - (if doc + (if (and doc (not (string-null? doc))) doc (begin (ly:warning "music function `~a' not documented." name-sym) diff --git a/scm/document-markup.scm b/scm/document-markup.scm index 54c987b9bb..35347ae150 100644 --- a/scm/document-markup.scm +++ b/scm/document-markup.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -42,20 +42,21 @@ prop-strings)) (define (doc-markup-function func) - (let* ((doc-str (procedure-documentation func)) + (let* ((full-doc (procedure-documentation func)) + (match-args (and full-doc (string-match "^\\([^)]*\\)\n" full-doc))) + (arg-names (if match-args + (with-input-from-string (match:string match-args) read) + (circular-list "arg"))) + (doc-str (if match-args (match:suffix match-args) full-doc)) (f-name (symbol->string (procedure-name func))) (c-name (regexp-substitute/global #f "-markup(-list)?$" f-name 'pre "" 'post)) (sig (object-property func 'markup-signature)) - (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 - (map (lambda (x) (string-append - "@var{" (car x) "} (" (cadr x) ")" )) - (zip arg-names sig-type-names)) + (map (lambda (x y) + (format #f "@var{~a} (~a)" x y)) + arg-names sig-type-names) " " ))) (string-append diff --git a/scm/document-music.scm b/scm/document-music.scm index 0badbf899e..bc9fa88ae1 100644 --- a/scm/document-music.scm +++ b/scm/document-music.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Han-Wen Nienhuys +;;;; Copyright (C) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify diff --git a/scm/document-translation.scm b/scm/document-translation.scm index 5e867bb4c2..8de267f6d9 100644 --- a/scm/document-translation.scm +++ b/scm/document-translation.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2000--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -143,18 +143,18 @@ (path (cdr args))) (string-append - "@item Set " - (format #f "grob-property @code{~a} " - (string-join (map symbol->string path) " ")) - (format #f "in @ref{~a} to ~a." - context-sym (scm->texi value)) - "\n"))) + (format #f "@item Set grob-property @code{~{~a~^.~}} " path) + (format #f "in @ref{~a} to" context-sym) + (if (pretty-printable? value) + (format #f ":~a\n" (scm->texi value)) + (format #f " ~a.\n" (scm->texi value)))))) ((equal? (object-property context-sym 'is-grob?) #t) "") ((equal? tag 'assign) - (format #f "@item Set translator property @code{~a} to ~a.\n" - context-sym - (scm->texi (car args)))) - ))) + (string-append + (format #f "@item Set translator property @code{~a} to" context-sym) + (if (pretty-printable? (car args)) + (format #f ":~a\n" (scm->texi (car args))) + (format #f " ~a.\n" (scm->texi (car args))))))))) (define (context-doc context-desc) @@ -165,6 +165,7 @@ (accepts (assoc-get 'accepts context-desc)) (consists (assoc-get 'consists context-desc)) (props (assoc-get 'property-ops context-desc)) + (defaultchild (assoc-get 'default-child context-desc)) (grobs (context-grobs context-desc)) (grob-refs (map ref-ify (sort grobs ly:string-ci +;;;; Copyright (C) 2010--2015 Mark Polesky ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/documentation-generate.scm b/scm/documentation-generate.scm index d65d0edab7..762d260b07 100644 --- a/scm/documentation-generate.scm +++ b/scm/documentation-generate.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2000--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -125,8 +125,12 @@ @titlefont{Internals Reference} @author The LilyPond development team -@c `Internals Reference' was born 2000-10-21 with git commit 01e371f... -Copyright @copyright{} 2000--2012 by the authors +@c `Internals Reference' was born 2000-10-21 with this commit: +@c patch::: 1.3.96.jcn9 +@c author: Jan Nieuwenhuizen +@c commit: 8ecd09ad7514d57630fb611d38c161f3c3c708db +@c file: scm/generate-documentation.scm +Copyright @copyright{} 2000--2015 by the authors @vskip 20pt diff --git a/scm/documentation-lib.scm b/scm/documentation-lib.scm index a098194586..d5f4517326 100644 --- a/scm/documentation-lib.scm +++ b/scm/documentation-lib.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2000--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -20,6 +20,9 @@ (srfi srfi-13) (srfi srfi-1)) +(if (guile-v2) + (use-modules (ice-9 curried-definitions))) + (define-class () (appendix #:init-value #f #:accessor appendix? #:init-keyword #:appendix) (children #:init-value '() #:accessor node-children #:init-keyword #:children) @@ -58,16 +61,15 @@ (define (processing name) (ly:basic-progress (_ "Processing ~S...") name)) -(define (self-evaluating? x) - (or (number? x) (string? x) (procedure? x) (boolean? x))) - -(define (texify x) - x) - -(define (scm->texi x) - (string-append "@code{" (texify (scm->string x)) "}")) - - +(define (scm->texi val) + (let* (; always start on a new line + (open-texi (if (pretty-printable? val) + "\n@verbatim\n" + "\n@code{")) + (close-texi (if (pretty-printable? val) + "@end verbatim" + "}"))) + (string-append open-texi (scm->string val) close-texi))) (define (texi-section-command level) (assoc-get level '( @@ -91,7 +93,7 @@ "Document one (LABEL . DESC); return empty string if LABEL is empty string." (if (eq? (car label-desc-pair) "") "" - (string-append "\n@item " (car label-desc-pair) "\n" (cdr label-desc-pair)))) + (string-append "\n\n@item " (car label-desc-pair) "\n" (cdr label-desc-pair)))) (define (description-list->texi items-alist quote?) @@ -100,9 +102,9 @@ string-to-use). If QUOTE? is #t, embed table in a @quotation environment." (string-append "\n" (if quote? "@quotation\n" "") - "@table @asis\n" + "@table @asis" (string-concatenate (map one-item->texi items-alist)) - "\n" + "\n\n" "@end table\n" (if quote? "@end quotation\n" ""))) @@ -142,7 +144,7 @@ string-to-use). If QUOTE? is #t, embed table in a @quotation environment." "\n* GNU " name ": (" file-name "). " name "." "\n@end direntry\n" "@documentlanguage en\n" - "@documentencoding utf-8\n")) + "@documentencoding UTF-8\n")) (define (context-name name) name) @@ -209,12 +211,8 @@ with init values from ALIST (1st optional argument) (ly:error (_ "cannot find description for property ~S (~S)") sym where)) (cons - (string-append "@code{" name "} " - "(" typename ")" + (string-append "@code{" name "} (" typename ")" (if init-value - (string-append - ":\n\n" - (scm->texi init-value) - "\n\n") - "")) + (string-append ":" (scm->texi init-value) "\n") + "")) desc))) diff --git a/scm/editor.scm b/scm/editor.scm index e474a557e5..8a34e79028 100644 --- a/scm/editor.scm +++ b/scm/editor.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2005--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2005--2015 Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/encoding.scm b/scm/encoding.scm index aaeed727b1..bebf515b6b 100644 --- a/scm/encoding.scm +++ b/scm/encoding.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2004--2015 Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/file-cache.scm b/scm/file-cache.scm index 21db866eb8..4ca9ee056d 100644 --- a/scm/file-cache.scm +++ b/scm/file-cache.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2005--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2005--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/flag-styles.scm b/scm/flag-styles.scm index 59495ba40b..2b52f44cb2 100644 --- a/scm/flag-styles.scm +++ b/scm/flag-styles.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2008--2012 Reinhold Kainhofer +;;;; Copyright (C) 2008--2015 Reinhold Kainhofer ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -90,17 +90,10 @@ All lengths are scaled according to the font size of the note." (thickness-offset (cons 0 (* -1 thickness dir))) (spacing (* -1 flag-spacing factor dir )) (start (cons (- half-stem-thickness) (* half-stem-thickness dir))) - ;; The points of a round-filled-polygon need to be given in clockwise - ;; order, otherwise the polygon will be enlarged by blot-size*2! - (points (if stem-up - (list start - flag-end - (offset-add flag-end thickness-offset) - (offset-add start thickness-offset)) - (list start - (offset-add start thickness-offset) - (offset-add flag-end thickness-offset) - flag-end))) + (points (list start + flag-end + (offset-add flag-end thickness-offset) + (offset-add start thickness-offset))) (stencil (ly:round-filled-polygon points half-stem-thickness)) ;; Log for 1/8 is 3, so we need to subtract 3 (flag-stencil (buildflag stencil (- log 3) stencil spacing)) @@ -214,11 +207,12 @@ a flag always touches a staff line." -(define-public ((glyph-flag flag-style) grob) +(define ((glyph-flag flag-style) grob) "Simulatesthe default way of generating flags: Look up glyphs @code{flags.style[ud][1234]} from the feta font and use it for the flag stencil." (create-glyph-flag flag-style "" grob)) +(export glyph-flag) diff --git a/scm/font.scm b/scm/font.scm index 45a54b5f8d..859efcd46e 100644 --- a/scm/font.scm +++ b/scm/font.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2004--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -147,7 +147,7 @@ ;; Each size family is a vector of fonts, loaded with a delay. The ;; vector should be sorted according to ascending design size. -(define-public (add-music-fonts node name family design-size-alist factor) +(define-public (add-music-fonts node family name brace design-size-alist factor) "Set up music fonts. Arguments: @@ -155,13 +155,16 @@ Arguments: @item @var{node} is the font tree to modify. +@item +@var{family} is the family name of the music font. + @item @var{name} is the basename for the music font. @file{@var{name}-.otf} should be the music font, -@file{@var{name}-brace.otf} should have piano braces. @item -@var{family} is the family name of the music font. +@var{brace} is the basename for the brace font. +@file{@var{brace}-brace.otf} should have piano braces. @item @var{design-size-alist} is a list of @code{(rounded . designsize)}. @@ -199,7 +202,7 @@ used. This is used to select the proper design size for the text fonts. ))) (fetaBraces ,(ly:pt 20.0) #(,(delay (ly:system-font-load - (format #f "~a-brace" name))))) + (format #f "~a-brace" brace))))) ))) (define-public (add-pango-fonts node lily-family family factor) @@ -229,18 +232,59 @@ used. This is used to select the proper design size for the text fonts. (add-node 'italic 'normal) (add-node 'italic 'bold)) +; This function allows the user to change the specific fonts, leaving others +; to the default values. This way, "make-pango-font-tree"'s syntax doesn't +; have to change from the user's perspective. +; +; Usage: +; \paper { +; #(define fonts +; (set-global-fonts +; #:music "gonville" ; (the main notation font) +; #:roman "FreeSerif" ; (the main/serif text font) +; )) +; } +; +; Leaving out "#:brace", "#:sans", and "#:typewriter" leave them at +; "emmentaler", "sans-serif", and "monospace", respectively. All fonts are +; still accesible through the usual scheme symbols: 'feta, 'roman, 'sans, and +; 'typewriter. +; +; Note that 'LilyPond Serif', 'LilyPond Sans Serif' and 'Lilypond Monospace' +; are aliases that are defined in mf/00-lilypond-fonts.conf.in (source file) +; or fonts/00-lilypond-fonts.conf (installed file). + +(define*-public (set-global-fonts #:key + (music "emmentaler") + (brace "emmentaler") + (roman (if (eq? (ly:get-option 'backend) 'svg) + "serif" "LilyPond Serif")) + (sans (if (eq? (ly:get-option 'backend) 'svg) + "sans-serif" "LilyPond Sans Serif")) + (typewriter (if (eq? (ly:get-option 'backend) 'svg) + "monospace" "LilyPond Monospace")) + (factor 1)) + (let ((n (make-font-tree-node 'font-encoding 'fetaMusic))) + (add-music-fonts n 'feta music brace feta-design-size-mapping factor) + (add-pango-fonts n 'roman roman factor) + (add-pango-fonts n 'sans sans factor) + (add-pango-fonts n 'typewriter typewriter factor) + n)) + (define-public (make-pango-font-tree roman-str sans-str typewrite-str factor) (let ((n (make-font-tree-node 'font-encoding 'fetaMusic))) - (add-music-fonts n "emmentaler" 'feta feta-design-size-mapping factor) + (add-music-fonts n 'feta "emmentaler" "emmentaler" feta-design-size-mapping factor) (add-pango-fonts n 'roman roman-str factor) (add-pango-fonts n 'sans sans-str factor) (add-pango-fonts n 'typewriter typewrite-str factor) n)) -(define-public (make-century-schoolbook-tree factor) +(define-public (make-default-fonts-tree factor) (make-pango-font-tree - "Century Schoolbook L" - "sans-serif" "monospace" factor)) + (if (eq? (ly:get-option 'backend) 'svg) "serif" "LilyPond Serif") + (if (eq? (ly:get-option 'backend) 'svg) "sans-serif" "LilyPond Sans Serif") + (if (eq? (ly:get-option 'backend) 'svg) "monospace" "LilyPond Monospace") + factor)) (define-public all-text-font-encodings '(latin1)) diff --git a/scm/framework-eps.scm b/scm/framework-eps.scm index 4028a42468..60d468a123 100644 --- a/scm/framework-eps.scm +++ b/scm/framework-eps.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2004--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -83,8 +83,10 @@ alignment." ;; First, create the output, then if necessary, individual staves and ;; finally write some auxiliary files if desired (dump-infinite-stack-EPS stencils) - (postprocess-output book framework-eps-module - (format #f "~a.eps" basename) (ly:output-formats)) + (postprocess-output book framework-eps-module (ly:output-formats) + basename + (format #f "~a.eps" basename) + #t) ;; individual staves (*-1.eps etc.); only print if more than one stencil ;; Otherwise the .eps and the -1.eps file will be identical and waste space @@ -95,7 +97,9 @@ alignment." (eps-files (map dump-counted-stencil counted-systems))) (if do-pdf ;; par-for-each: a bit faster ... - (for-each (lambda (y) (postscript->pdf 0 0 y)) + (for-each (lambda (y) (postscript->pdf 0 0 + (dir-basename y ".eps") + y #t)) eps-files)))) ;; Now, write some aux files if requested: .texi, .tex and .count diff --git a/scm/framework-ps.scm b/scm/framework-ps.scm index bb7dc55504..8221e5eab3 100644 --- a/scm/framework-ps.scm +++ b/scm/framework-ps.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2004--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -52,11 +52,32 @@ "") (define (ps-define-font font font-name scaling) - (string-append - "/" (ps-font-command font) - " { /" font-name - " " (ly:number->string scaling) " output-scale div selectfont }" - " bind def\n")) + (if (ly:bigpdfs) + (string-append + "/" (ps-font-command font) "-N" + " { /" font-name "-N" + " " (ly:number->string scaling) " output-scale div selectfont }" + " bind def\n" + "/" (ps-font-command font) "-S" + " { /" font-name "-S" + " " (ly:number->string scaling) " output-scale div selectfont }" + " bind def\n" + "/" (ps-font-command font) "-O" + " { /" font-name "-O" + " " (ly:number->string scaling) " output-scale div selectfont }" + " bind def\n" + "/help" font-name " {\n gsave\n 1 setgray\n /" + font-name "-N" + " 0.001 selectfont 0 0 moveto <01> show\n /" + font-name "-S" + " 0.001 selectfont 0 0 moveto <01> show\n /" + font-name "-O" + " 0.001 selectfont 0 0 moveto <01> show\n grestore\n} def\n") + (string-append + "/" (ps-font-command font) + " { /" font-name + " " (ly:number->string scaling) " output-scale div selectfont }" + " bind def\n"))) ;; FIXME: duplicated in other output backends ;; FIXME: silly interface name @@ -99,7 +120,16 @@ "") "%%EndPageSetup\n" "\n" - "gsave 0 paper-height translate set-ps-scale-to-lily-scale\n")) + "gsave 0 paper-height translate set-ps-scale-to-lily-scale\n" + "/helpEmmentaler-Brace where {pop helpEmmentaler-Brace} if\n" + "/helpEmmentaler-11 where {pop helpEmmentaler-11} if\n" + "/helpEmmentaler-13 where {pop helpEmmentaler-13} if\n" + "/helpEmmentaler-14 where {pop helpEmmentaler-14} if\n" + "/helpEmmentaler-16 where {pop helpEmmentaler-16} if\n" + "/helpEmmentaler-18 where {pop helpEmmentaler-18} if\n" + "/helpEmmentaler-20 where {pop helpEmmentaler-20} if\n" + "/helpEmmentaler-23 where {pop helpEmmentaler-23} if\n" + "/helpEmmentaler-26 where {pop helpEmmentaler-26} if\n")) (ly:outputter-dump-stencil outputter page) (ly:outputter-dump-string outputter "stroke grestore\nshowpage\n")) @@ -215,13 +245,55 @@ binary-data footer))) +(define check-conflict-and-embed-cff + (let ((font-list '())) + (lambda (name file-name font-index) + (let* ((name-symbol (string->symbol name)) + (args-filename-offset + (cons file-name (ly:get-cff-offset file-name font-index))) + (found-filename-offset (assq name-symbol font-list))) + (if found-filename-offset + (begin + (if (equal? args-filename-offset (cdr found-filename-offset)) + (ly:debug + (_ "CFF font `~a' already embedded, skipping.") + name) + (ly:warning + (_ "Different CFF fonts which have the same name `~a' has been detected. The font cannot be embedded.") + name)) + "") + (begin + (ly:debug + (_ "Embedding CFF font `~a'") + name) + (set! font-list + (acons name-symbol args-filename-offset font-list)) + (ps-embed-cff (ly:otf->cff file-name font-index) name 0))))))) + (define (write-preamble paper load-fonts? port) - (define (internal-font? file-name) - (or (string-startswith file-name "Emmentaler") - (string-startswith file-name "emmentaler") - )) + (define (internal-font? font-name-filename) + (let* ((font (car font-name-filename)) + (file-name (caddr font-name-filename)) + (font-file-name (ly:find-file (format #f "~a.otf" file-name)))) + (and font + (cff-font? font) + font-file-name + (string-contains font-file-name + (ly:get-option 'datadir))))) (define (load-font-via-GS font-name-filename) + (define (is-collection-font? file-name) + (let ((port (open-file file-name "rb"))) + (if (eq? (read-char port) #\t) + (if (eq? (read-char port) #\t) + (if (eq? (read-char port) #\c) + (if (eq? (read-char port) #\f) + #t + #f) + #f) + #f) + #f))) + (define (ps-load-file file-name) (if (string? file-name) (if (string-contains file-name (ly:get-option 'datadir)) @@ -237,19 +309,39 @@ (let* ((font (car font-name-filename)) (name (cadr font-name-filename)) (file-name (caddr font-name-filename)) + (font-index (cadddr font-name-filename)) (bare-file-name (ly:find-file file-name))) - (cons name - (if (mac-font? bare-file-name) - (handle-mac-font name bare-file-name) - (cond - ((internal-font? file-name) - (ps-load-file (ly:find-file - (format #f "~a.otf" file-name)))) - ((string? bare-file-name) - (ps-load-file file-name)) - (else - (ly:warning (_ "cannot embed ~S=~S") name file-name) - "")))))) + (cond + ((and (number? font-index) + (!= font-index 0)) + (ly:warning (_ "Font ~a cannot be loaded via Ghostscript because its font-index (~a) is not zero.") + name font-index) + (load-font font-name-filename)) + ((and (string? bare-file-name) + (eq? (ly:get-font-format bare-file-name font-index) 'CFF) + (is-collection-font? bare-file-name)) + (ly:warning (_ "Font ~a cannot be loaded via Ghostscript because it is an OpenType/CFF (OTC) font.") + name) + (load-font font-name-filename)) + ((and (string? bare-file-name) + (eq? (ly:get-font-format bare-file-name font-index) 'TrueType) + (not (ly:has-glyph-names? bare-file-name font-index))) + (ly:warning (_ "Font ~a cannot be used via Ghostscript because it is a TrueType font that does not have glyph names.") + name) + (load-font font-name-filename)) + (else + (cons name + (if (mac-font? bare-file-name) + (handle-mac-font name bare-file-name) + (cond + ((and font (cff-font? font)) + (ps-load-file (ly:find-file + (format #f "~a.otf" file-name)))) + ((string? bare-file-name) + (ps-load-file file-name)) + (else + (ly:warning (_ "cannot embed ~S=~S") name file-name) + "")))))))) (define (dir-join a b) (if (equal? a "") @@ -296,18 +388,17 @@ embed)) (define (font-file-as-ps-string name file-name font-index) - (let* ((downcase-file-name (string-downcase file-name))) + (let ((font-format (ly:get-font-format file-name font-index))) (cond - ((and file-name (string-endswith downcase-file-name ".pfa")) - (embed-document file-name)) - ((and file-name (string-endswith downcase-file-name ".pfb")) - (ly:pfb->pfa file-name)) - ((and file-name (string-endswith downcase-file-name ".ttf")) - (ly:ttf->pfa file-name)) - ((and file-name (string-endswith downcase-file-name ".ttc")) + ((eq? font-format (string->symbol "Type 1")) + ;; Type 1 (PFA and PFB) fonts + (ly:type1->pfa file-name)) + ((eq? font-format 'TrueType) + ;; TrueType fonts (TTF) and TrueType Collection (TTC) (ly:ttf->pfa file-name font-index)) - ((and file-name (string-endswith downcase-file-name ".otf")) - (ps-embed-cff (ly:otf->cff file-name) name 0)) + ((eq? font-format 'CFF) + ;; OpenType/CFF fonts (OTF) and OpenType/CFF Collection (OTC) + (check-conflict-and-embed-cff name file-name font-index)) (else (ly:warning (_ "do not know how to embed ~S=~S") name file-name) "")))) @@ -372,7 +463,7 @@ ((ly:get-option 'gs-load-lily-fonts) (if (or (string-contains (caddr name) (ly:get-option 'datadir)) - (internal-font? (caddr name))) + (internal-font? name)) (load-font-via-GS name) (load-font name))) (else @@ -392,6 +483,8 @@ (display (cdr f) port) (display "%%EndFont\n" port)) (load-fonts paper))) + (if (ly:bigpdfs) + (display (procset "encodingdefs.ps") port)) (display (setup-variables paper) port) ;; adobe note 5002: should initialize variables before loading routines. @@ -426,28 +519,53 @@ (val (if overrideval overrideval fallbackval))) (if val (format port "/~a (~a)\n" field (metadata-encode (markup->string val (list header))))))) - (display "[ " port) - (metadata-lookup-output 'pdfcomposer 'composer "Author") - (format port "/Creator (LilyPond ~a)\n" (lilypond-version)) - (metadata-lookup-output 'pdftitle 'title "Title") - (metadata-lookup-output 'pdfsubject 'subject "Subject") - (metadata-lookup-output 'pdfkeywords 'keywords "Keywords") - (metadata-lookup-output 'pdfmodDate 'modDate "ModDate") - (metadata-lookup-output 'pdfsubtitle 'subtitle "Subtitle") - (metadata-lookup-output 'pdfcomposer 'composer "Composer") - (metadata-lookup-output 'pdfarranger 'arranger "Arranger") - (metadata-lookup-output 'pdfpoet 'poet "Poet") - (metadata-lookup-output 'pdfcopyright 'copyright "Copyright") - (display "/DOCINFO pdfmark\n\n" port)) + (if (module? header) + (begin + (display "mark " port) + (metadata-lookup-output 'pdfauthor 'author "Author") + (format port "/Creator (LilyPond ~a)\n" (lilypond-version)) + (metadata-lookup-output 'pdftitle 'title "Title") + (metadata-lookup-output 'pdfsubject 'subject "Subject") + (metadata-lookup-output 'pdfkeywords 'keywords "Keywords") + (metadata-lookup-output 'pdfmodDate 'modDate "ModDate") + (metadata-lookup-output 'pdfsubtitle 'subtitle "Subtitle") + (metadata-lookup-output 'pdfcomposer 'composer "Composer") + (metadata-lookup-output 'pdfarranger 'arranger "Arranger") + (metadata-lookup-output 'pdfpoet 'poet "Poet") + (metadata-lookup-output 'pdfcopyright 'copyright "Copyright") + (display "/DOCINFO pdfmark\n\n" port))) + + (if (ly:get-option 'embed-source-code) + (let ((source-list (delete-duplicates + (remove (lambda (str) + (or + (string-contains str + (ly:get-option 'datadir)) + (string=? str + ""))) + (ly:source-files))))) + (display "\n/pdfmark where +{pop} {userdict /pdfmark /cleartomark load put} ifelse" port) + (for-each (lambda (fname idx) + (format port "\n +mark /_objdef {ly~a_stream} /type /stream /OBJ pdfmark +mark {ly~a_stream} << /Type /EmbeddedFile>> /PUT pdfmark +mark {ly~a_stream} (~a) /PUT pdfmark +mark /Name (LilyPond source file ~a) +/FS << /Type /Filespec /F (~a) /EF << /F {ly~a_stream} >> >> /EMBED pdfmark +mark {ly~a_stream} /CLOSE pdfmark +\n" + idx idx idx + (ps-quote (ly:gulp-file fname)) + idx fname idx idx)) + source-list (iota (length source-list)))))) (define-public (output-framework basename book scopes fields) - (let* ((filename (format #f "~a.ps" basename)) + (let* ((port-tmp (make-tmpfile)) + (tmp-name (port-filename port-tmp)) (outputter (ly:make-paper-outputter - ;; FIXME: better wrap open/open-file, - ;; content-mangling is always bad. - ;; MINGW hack: need to have "b"inary for embedding CFFs - (open-file filename "wb") + port-tmp 'ps)) (paper (ly:paper-book-paper book)) (header (ly:paper-book-header book)) @@ -466,8 +584,7 @@ ;; don't do BeginDefaults PageMedia: A4 ;; not necessary and wrong (write-preamble paper #t port) - (if (module? header) - (handle-metadata header port)) + (handle-metadata header port) (for-each (lambda (page) (set! page-number (1+ page-number)) @@ -475,8 +592,8 @@ page-stencils) (display "%%Trailer\n%%EOF\n" port) (ly:outputter-close outputter) - (postprocess-output book framework-ps-module filename - (ly:output-formats)))) + (postprocess-output book framework-ps-module (ly:output-formats) + basename tmp-name #f))) (define-public (dump-stencil-as-EPS paper dump-me filename load-fonts) @@ -542,6 +659,15 @@ (write-preamble paper load-fonts port) (display "/mark_page_link { pop pop pop pop pop } bind def\n" port) (display "gsave set-ps-scale-to-lily-scale\n" port) + (display "/helpEmmentaler-Brace where {pop helpEmmentaler-Brace} if\n" port) + (display "/helpEmmentaler-11 where {pop helpEmmentaler-11} if\n" port) + (display "/helpEmmentaler-13 where {pop helpEmmentaler-13} if\n" port) + (display "/helpEmmentaler-14 where {pop helpEmmentaler-14} if\n" port) + (display "/helpEmmentaler-16 where {pop helpEmmentaler-16} if\n" port) + (display "/helpEmmentaler-18 where {pop helpEmmentaler-18} if\n" port) + (display "/helpEmmentaler-20 where {pop helpEmmentaler-20} if\n" port) + (display "/helpEmmentaler-23 where {pop helpEmmentaler-23} if\n" port) + (display "/helpEmmentaler-26 where {pop helpEmmentaler-26} if\n" port) (ly:outputter-dump-stencil outputter dump-me) (display "stroke grestore\n%%Trailer\n%%EOF\n" port) (ly:outputter-close outputter))) @@ -574,10 +700,10 @@ (ly:get-option 'include-eps-fonts) bbox) (if do-pdf - (postscript->pdf 0 0 (format #f "~a.eps" filename))) + (postscript->pdf 0 0 filename (format #f "~a.eps" filename) #t)) (if do-png (postscript->png (ly:get-option 'resolution) 0 0 - (format #f "~a.eps" filename))))) + filename (format #f "~a.eps" filename) #t)))) extents-system-pairs))) (define-public (clip-system-EPSes basename paper-book) @@ -637,8 +763,11 @@ (format #f "~a.preview" basename) #t) (postprocess-output book framework-ps-module + (cons "png" (ly:output-formats)) + (format #f "~a.preview" basename) (format #f "~a.preview.eps" basename) - (cons "png" (ly:output-formats))))) + #t + ))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -659,30 +788,23 @@ defs-resolution (ly:get-option 'resolution)))) -(define (output-filename name) - (if (equal? (basename name ".ps") "-") - (string-append "./" name) - name)) - -(define-public (convert-to-pdf book name) +(define-public (convert-to-pdf book base-name tmp-name is-eps) (let* ((defs (ly:paper-book-paper book)) (width-height (output-width-height defs)) (width (car width-height)) - (height (cdr width-height)) - (filename (output-filename name))) - (postscript->pdf width height filename))) + (height (cdr width-height))) + (postscript->pdf width height base-name tmp-name is-eps))) -(define-public (convert-to-png book name) +(define-public (convert-to-png book base-name tmp-name is-eps) (let* ((defs (ly:paper-book-paper book)) (resolution (output-resolution defs)) (width-height (output-width-height defs)) (width (car width-height)) - (height (cdr width-height)) - (filename (output-filename name))) - (postscript->png resolution width height filename))) + (height (cdr width-height))) + (postscript->png resolution width height base-name tmp-name is-eps))) -(define-public (convert-to-ps book name) - #t) +(define-public (convert-to-ps book base-name tmp-name is-eps) + (postscript->ps base-name tmp-name is-eps)) (define-public (output-classic-framework basename book scopes fields) (ly:error (_ "\nThe PostScript backend does not support the @@ -690,7 +812,7 @@ system-by-system output. For that, use the EPS backend instead, lilypond -dbackend=eps FILE -If have cut & pasted a lilypond fragment from a webpage, be sure +If you have cut & pasted a lilypond fragment from a webpage, be sure to only remove anything before %% **************************************************************** diff --git a/scm/framework-svg.scm b/scm/framework-svg.scm index dad8bfa0f7..a4cf2e9960 100644 --- a/scm/framework-svg.scm +++ b/scm/framework-svg.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2004--2015 Jan Nieuwenhuizen ;;;; Patrick McCarty ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify diff --git a/scm/fret-diagrams.scm b/scm/fret-diagrams.scm index 3359608345..45db612b96 100644 --- a/scm/fret-diagrams.scm +++ b/scm/fret-diagrams.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Carl D. Sorensen +;;;; Copyright (C) 2004--2015 Carl D. Sorensen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -44,7 +44,15 @@ to end-point." (define (get-numeric-from-key keystring) "Get the numeric value from a key of the form k:val" - (string->number (substring keystring 2 (string-length keystring)))) + (let* ((entry (substring keystring 2 (string-length keystring))) + (numeric-entry (string->number entry))) + ;; throw an error, if `entry' can't be transformed into a number + (if numeric-entry + numeric-entry + (ly:error + "Unhandled entry in fret-diagram \"~a\" in \"~a\"" + entry + keystring)))) (define (numerify mylist) "Convert string values to numeric or character" @@ -64,6 +72,41 @@ to end-point." "Calculate the fret count for the diagram given the range of frets in the diagram." (1+ (- (cdr fret-range) (car fret-range)))) +(define (dot-has-color dot-settings) + "Return a color-name as symbol, if found in @var{dot-settings} otherwise @code{#f}" + (cond ((null? dot-settings) + #f) + ;; Don't bother the user with quote/unquote. + ;; We use the name-symbol for the color, looking up in 'x11-color-list' + ((member (car dot-settings) (map car x11-color-list)) + (car dot-settings)) + (else (dot-has-color (cdr dot-settings))))) + +(define (dot-is-inverted dot-settings) + "Return @code{'inverted}, if found in @var{dot-settings} otherwise @code{'()}" + (let ((inverted (member 'inverted dot-settings))) + (if inverted + (car inverted) + '()))) + +(define (dot-is-parenthesized dot-settings) + "Return @code{'parenthesized}, if found in @var{dot-settings} otherwise @code{'()}" + (let ((parenthesized (member 'parenthesized dot-settings))) + (if parenthesized + (car parenthesized) + '()))) + +;; If @code{'default-paren-color} is not set, the parenthesis will take their +;; color from the dot. +;; Setting @code{'default-paren-color} will result in taking the color from +;; `what-color', see below. +(define (default-paren-color dot-settings) + "Return @code{'default-paren-color}, if found in @var{dot-settings} otherwise @code{'()}" + (let ((default-color (member 'default-paren-color dot-settings))) + (if default-color + (car default-color) + '()))) + (define (subtract-base-fret base-fret dot-list) "Subtract @var{base-fret} from every fret in @var{dot-list}" (if (null? dot-list) @@ -71,18 +114,27 @@ to end-point." (let ((this-list (car dot-list))) (cons* (list ;; string - (car this-list) + (car this-list) ;; fret - (- (second this-list) base-fret) - ;; finger - (if (null? (cddr this-list)) - '() - (third this-list)) - ;; color modifier - (if (or (null? (cddr this-list)) - (null? (cdddr this-list))) - '() - (fourth this-list))) + (- (second this-list) base-fret) + ;; finger-number or markup + (if (and (not (null? (cddr this-list))) + (or (markup? (caddr this-list)) + (number? (caddr this-list)))) + (third this-list) + '()) + ;; inverted + (dot-is-inverted this-list) + ;; parenthesis + (dot-is-parenthesized this-list) + ;; color modifiers + ;; parenthesis + (default-paren-color this-list) + ;; dots + (let ((colored (dot-has-color this-list))) + (if colored + colored + '()))) (subtract-base-fret base-fret (cdr dot-list)))))) (define (drop-paren item-list) @@ -201,7 +253,11 @@ with magnification @var{mag} of the string @var{text}." ((or (eq? my-code 'open)(eq? my-code 'mute)) (set! xo-list (cons* my-item xo-list))) ((eq? my-code 'barre) - (set! barre-list (cons* (cdr my-item) barre-list))) + (if (every number? (cdr my-item)) + (set! barre-list (cons* (cdr my-item) barre-list)) + (ly:error + "barre-indications should contain only numbers: ~a" + (cdr my-item)))) ((eq? my-code 'capo) (set! capo-fret (cadr my-item))) ((eq? my-code 'place-fret) @@ -217,12 +273,16 @@ with magnification @var{mag} of the string @var{text}." (if (> fretval maxfret) (set! maxfret fretval)) (if (< fretval minfret) (set! minfret fretval)) (updatemax (cdr fret-list))))) + ;; take frets of 'barre-settings into account + (if (not (null? barre-list)) + (set! minfret (apply min minfret (map last barre-list)))) (if (or (> maxfret my-fret-count) (> capo-fret 1)) (set! fret-range (cons minfret (let ((upfret (- (+ minfret my-fret-count) 1))) (if (> maxfret upfret) maxfret upfret))))) - (set! capo-fret (1+ (- capo-fret minfret))) + (if (not (zero? (apply min capo-fret (map cadr dot-list)))) + (set! capo-fret (1+ (- capo-fret minfret)))) ;; subtract fret from dots (set! dot-list (subtract-base-fret (- (car fret-range) 1) dot-list))) (acons 'fret-range fret-range @@ -271,6 +331,7 @@ with magnification @var{mag} of the string @var{text}." ;; needed for draw-frets and draw-strings (sth (* size th)) (thickness-factor (assoc-get 'string-thickness-factor details 0)) + (paren-padding (assoc-get 'paren-padding details 0.05)) (alignment (chain-assoc-get 'align-dir props -0.4)) ;; needed only here (xo-padding (assoc-get 'xo-padding details 0.2)) ;; needed only here @@ -345,17 +406,17 @@ baseline at fret coordinate @var{base}, a height of bottom-control-point-height cp-right-width))) ;; order of bezier control points is: - ;; left cp low, right cp low, right end low, left end low - ;; right cp high, left cp high, left end high, right end high. + ;; left cp low, left cp low, right cp low, right end low + ;; right cp high, left cp high - (list left-lower-control-point + (list + left-end-point + left-lower-control-point right-lower-control-point right-end-point - left-end-point + right-upper-control-point - left-upper-control-point - left-end-point - right-end-point))) + left-upper-control-point))) (define (draw-strings) "Draw the string lines for a fret diagram with @@ -370,7 +431,7 @@ Line thickness is given by @var{th}, fret & string spacing by (string-stencil (car x)) (helper (cdr x))))) - (let* ( (string-list (map 1+ (iota string-count)))) + (let* ((string-list (map 1+ (iota string-count)))) (helper string-list))) (define (string-stencil string) @@ -504,31 +565,17 @@ fret-diagram overall parameters." (* size end-string-coordinate) (* size fret-coordinate) (* size bezier-height) - (* size bezier-thick))) - (box-lower-left - (stencil-coordinates - (+ (* size fret-coordinate) half-thickness) - (- (* size start-string-coordinate) half-thickness))) - (box-upper-right - (stencil-coordinates - (- (* size fret-coordinate) - (* size bezier-height) - half-thickness) - (+ (* size end-string-coordinate) half-thickness))) - (x-extent (cons (car box-lower-left) (car box-upper-right))) - (y-extent (cons (cdr box-lower-left) (cdr box-upper-right)))) + (* size bezier-thick)))) (make-bezier-sandwich-stencil bezier-list - (* size bezier-thick) - x-extent - y-extent))) + (* size bezier-thick)))) (define (draw-dots dot-list) "Make dots for fret diagram." (let* ( (scale-dot-radius (* size dot-radius)) (scale-dot-thick (* size th)) - (default-dot-color (assoc-get 'dot-color details 'black)) + (default-dot-color (assoc-get 'dot-color details)) (finger-label-padding 0.3) (dot-label-font-mag (* scale-dot-radius @@ -552,39 +599,117 @@ fret-diagram overall parameters." (extent (cons (- scale-dot-radius) scale-dot-radius)) (finger (caddr mypair)) (finger (if (number? finger) (number->string finger) finger)) - (inverted-color (eq? 'inverted (cadddr mypair))) - (dot-color (if (or (and (eq? default-dot-color 'black) inverted-color) - (and (eq? default-dot-color 'white) (not inverted-color))) - 'white - 'black)) - (dot-stencil (if (eq? dot-color 'white) - (ly:stencil-add - (make-circle-stencil - scale-dot-radius scale-dot-thick #t) - (ly:stencil-in-color - (make-circle-stencil - (- scale-dot-radius (* 0.5 scale-dot-thick)) - 0 #t) - 1 1 1)) - (make-circle-stencil - scale-dot-radius scale-dot-thick #t))) + (parenthesized + (if (not (null? (dot-is-parenthesized mypair))) + (dot-is-parenthesized mypair) + #f)) + (parenthesis-color + (if (not (null? (default-paren-color mypair))) + (default-paren-color mypair) + #f)) + (inverted + (if (not (null? (dot-is-inverted mypair))) + (dot-is-inverted mypair) + #f)) + (dot-color-is-white? + (or inverted + (and (eq? default-dot-color 'white) (not inverted)))) + (what-color + (x11-color + (cond ((and inverted + (not (dot-has-color mypair)) + (not (eq? default-dot-color 'white))) + (or default-dot-color 'black)) + (dot-color-is-white? + (or (dot-has-color mypair) 'black)) + (else + (or (dot-has-color mypair) + default-dot-color + 'black))))) + (inverted-stil + (lambda (color) + (ly:stencil-add + (stencil-with-color + (make-circle-stencil + scale-dot-radius scale-dot-thick #t) + color) + (stencil-with-color + (make-circle-stencil + (- scale-dot-radius (* 0.5 scale-dot-thick)) + 0 #t) + (x11-color 'white))))) + (dot-stencil + (if dot-color-is-white? + (inverted-stil what-color) + (stencil-with-color + (make-circle-stencil + scale-dot-radius scale-dot-thick #t) + what-color))) + (par-dot-stencil + (let ((paren-color + (if (and parenthesis-color + (not (eq? default-dot-color 'white))) + (x11-color (or default-dot-color 'black)) + what-color))) + (stencil-with-color + (parenthesize-stencil + dot-stencil ;; stencil + (* size th 0.75) ;; half-thickness + (* 0.15 size) ;;width + 0 ;; angularity + paren-padding ;; padding + ) + paren-color))) + (final-dot-stencil + (if parenthesized + par-dot-stencil + dot-stencil)) (positioned-dot - (ly:stencil-translate dot-stencil dot-coordinates)) + (ly:stencil-translate final-dot-stencil dot-coordinates)) (labeled-dot-stencil (cond ((or (eq? finger '())(eq? finger-code 'none)) positioned-dot) ((eq? finger-code 'in-dot) - (let ((finger-label - (centered-stencil - (sans-serif-stencil - layout props dot-label-font-mag finger)))) + (let* ((finger-stil + (if (not (null? finger)) + (sans-serif-stencil + layout props dot-label-font-mag finger) + empty-stencil)) + (finger-stil-length + (interval-length (ly:stencil-extent finger-stil X))) + (finger-stil-height + (interval-length (ly:stencil-extent finger-stil Y))) + (dot-stencil-radius + (/ (interval-length (ly:stencil-extent dot-stencil Y)) + 2)) + (scale-factor + (/ dot-stencil-radius + ;; Calculate the radius of the circle through the + ;; corners of the box containing the finger-stil. + ;; Give it a little padding. The value, (* 2 th), + ;; is my choice + (+ + (sqrt + (+ (expt (/ finger-stil-length 2) 2) + (expt (/ finger-stil-height 2) 2))) + (* 2 th)))) + (finger-label + (centered-stencil + (ly:stencil-scale + (sans-serif-stencil + layout props + dot-label-font-mag + finger) + scale-factor scale-factor)))) (ly:stencil-translate (ly:stencil-add - dot-stencil - (if (eq? dot-color 'white) - finger-label - (ly:stencil-in-color finger-label 1 1 1))) + final-dot-stencil + (if dot-color-is-white? + (stencil-with-color + finger-label + what-color) + (stencil-with-color finger-label white))) dot-coordinates))) ((eq? finger-code 'below-string) (let* ((label-stencil @@ -701,22 +826,14 @@ at @var{fret}." (label-dir (assoc-get 'label-dir details RIGHT)) (label-vertical-offset (assoc-get 'fret-label-vertical-offset details 0)) + (label-horizontal-offset + (assoc-get 'fret-label-horizontal-offset details 0)) (number-type (assoc-get 'number-type details 'roman-lower)) (label-text - (cond - ((equal? number-type 'roman-lower) - (fancy-format #f "~(~@r~)" base-fret)) - ((equal? number-type 'roman-upper) - (fancy-format #f "~@r" base-fret)) - ((equal? 'arabic number-type) - (fancy-format #f "~d" base-fret)) - ((equal? 'custom number-type) - (fancy-format #f - (assoc-get 'fret-label-custom-format - details "~a") - base-fret)) - (else (fancy-format #f "~(~@r~)" base-fret)))) + (number-format number-type base-fret + (assoc-get 'fret-label-custom-format + details "~a"))) (label-stencil (centered-stencil (sans-serif-stencil @@ -726,7 +843,10 @@ at @var{fret}." label-stencil 'string orientation)) - (label-outside-diagram (+ label-space label-half-width))) + (label-outside-diagram + (+ label-space + (* size label-horizontal-offset) + label-half-width))) (ly:stencil-translate label-stencil (stencil-coordinates @@ -802,7 +922,9 @@ a fret-indication list with the appropriate values" (output-list '()) (new-props '()) (details (merge-details 'fret-diagram-details props '())) - (items (string-split definition-string #\;))) + ;; remove whitespace-characters from definition-string + (cleared-string (remove-whitespace definition-string)) + (items (string-split cleared-string #\;))) (let parse-item ((myitems items)) (if (not (null? (cdr myitems))) (let ((test-string (car myitems))) @@ -838,7 +960,15 @@ a fret-indication list with the appropriate values" (set! details (acons 'dot-position dot-position details)))) (else - (let ((this-list (string-split test-string #\-))) + (let* ((this-list (string-split test-string #\-)) + (fret-number (string->number (car this-list)))) + ;; If none of the above applies, `fret-number' needs to be a + ;; number. Throw an error, if not. + (if (not fret-number) + (ly:error + "Unhandled entry in fret-diagrams \"~a\" in \"~a\"" + (car this-list) + test-string)) (if (string->number (cadr this-list)) (set! output-list (cons-fret @@ -847,11 +977,11 @@ a fret-indication list with the appropriate values" (if (equal? (cadr this-list) "x" ) (set! output-list (cons-fret - (list 'mute (string->number (car this-list))) + (list 'mute fret-number) output-list)) (set! output-list (cons-fret - (list 'open (string->number (car this-list))) + (list 'open fret-number) output-list))))))) (parse-item (cdr myitems))))) ;; add the modified details @@ -972,15 +1102,30 @@ to string @var{end-string} at fret @var{fret-number}. Place a capo indicator (a large solid bar) across the entire fretboard at fret location @var{fret-number}. Also, set fret @var{fret-number} to be the lowest fret on the fret diagram. - -@item (place-fret @var{string-number} @var{fret-number} [@var{finger-value} [@var{color-modifier}]]) +@item +(place-fret @var{string-number} + @var{fret-number} + [@var{finger-value}] + [@var{color-modifier}] + [@var{color}] + [@code{'parenthesized} [@code{'default-paren-color}]]) Place a fret playing indication on string @var{string-number} at fret @var{fret-number} with an optional fingering label @var{finger-value}, -and an optional color modifier @var{color-modifier}. +an optional color modifier @var{color-modifier}, an optional color +@var{color}, an optional parenthesis @code{'parenthesized} and an +optional paranthesis color @code{'default-paren-color}. By default, the fret playing indicator is a solid dot. This can be -globally changed by setting the value of the variable @var{dot-color}. +globally changed by setting the value of the variable @var{dot-color} +or for a single dot by setting the value of @var{color}. The dot can +be parenthesized by adding @code{'parenthesized}. By default the +color for the parenthesis is taken from the dot. Adding +@code{'default-paren-color} will take the parenthesis-color from the +global @var{dot-color}, as a fall-back black will be used. Setting @var{color-modifier} to @code{inverted} inverts the dot color for a specific fingering. +The values for @var{string-number}, @var{fret-number}, and the optional +@var{finger} should be entered first in that order. +The order of the other optional arguments does not matter. If the @var{finger} part of the @code{place-fret} element is present, @var{finger-value} will be displayed according to the setting of the variable @var{finger-code}. There is no limit to the number of fret diff --git a/scm/graphviz.scm b/scm/graphviz.scm index fc2076be24..61fa5b1e1b 100644 --- a/scm/graphviz.scm +++ b/scm/graphviz.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2007--2012 Joe Neeman +;;;; Copyright (C) 2007--2015 Joe Neeman ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/guile-debugger.scm b/scm/guile-debugger.scm index defd663317..cde032fed0 100644 --- a/scm/guile-debugger.scm +++ b/scm/guile-debugger.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2010--2012 Ian Hulin +;;;; Copyright (C) 2010--2015 Ian Hulin ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/harp-pedals.scm b/scm/harp-pedals.scm index ea5db93f18..9365f0a034 100644 --- a/scm/harp-pedals.scm +++ b/scm/harp-pedals.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2008--2012 Reinhold Kainhofer +;;;; Copyright (C) 2008--2015 Reinhold Kainhofer ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -132,6 +132,7 @@ spacing after the divider). stencils))) ;; Parse the harp pedal definition string into list of directions (-1/0/1), #\o and #\| +;; Whitespace is removed from definition string before the procedure applies. (define (harp-pedals-parse-string definition-string) "Parse a harp pedals diagram string and return a list containing 1, 0, -1, #\\o or #\\|" (map (lambda (c) @@ -141,7 +142,7 @@ spacing after the divider). ((#\-) 0) ((#\| #\o) c) (else c))) - (string->list definition-string))) + (string->list (remove-whitespace definition-string)))) ;; Analyze the pedal-list: Return (pedalcount . (divider positions)) diff --git a/scm/layout-beam.scm b/scm/layout-beam.scm index fb39a4e784..59f3b2fcc6 100644 --- a/scm/layout-beam.scm +++ b/scm/layout-beam.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2000--2015 Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/layout-slur.scm b/scm/layout-slur.scm index 7e5ab5858c..18b28797d0 100644 --- a/scm/layout-slur.scm +++ b/scm/layout-slur.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2000--2015 Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -28,6 +28,8 @@ (max-slope-factor . 10) (free-head-distance . 0.3) (free-slur-distance . 0.8) + (gap-to-staffline-inside . 0.2) + (gap-to-staffline-outside . 0.1) (extra-object-collision-penalty . 50) (accidental-collision . 3) (extra-encompass-free-distance . 0.3) diff --git a/scm/lily-library.scm b/scm/lily-library.scm index 43b05e57c2..574b85437e 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 1998--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -22,6 +22,8 @@ ;; for define-safe-public when byte-compiling using Guile V2 (use-modules (scm safe-utility-defs)) +(use-modules (ice-9 pretty-print)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; constants. @@ -35,17 +37,6 @@ (define-public DOWN -1) (define-public CENTER 0) -(define-safe-public DOUBLE-FLAT-QTS -4) -(define-safe-public THREE-Q-FLAT-QTS -3) -(define-safe-public FLAT-QTS -2) -(define-safe-public SEMI-FLAT-QTS -1) -(define-safe-public NATURAL-QTS 0) -(define-safe-public SEMI-SHARP-QTS 1) -(define-safe-public SHARP-QTS 2) -(define-safe-public THREE-Q-SHARP-QTS 3) -(define-safe-public DOUBLE-SHARP-QTS 4) -(define-safe-public SEMI-TONE-QTS 2) - (define-safe-public DOUBLE-FLAT -1) (define-safe-public THREE-Q-FLAT -3/4) (define-safe-public FLAT -1/2) @@ -80,6 +71,11 @@ (cons (ly:moment-main-numerator moment) (ly:moment-main-denominator moment))) +(define-public (seconds->moment s context) + "Return a moment equivalent to s seconds at the current tempo." + (ly:moment-mul (ly:context-property context 'tempoWholesPerMinute) + (ly:make-moment (/ s 60)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; durations @@ -116,6 +112,16 @@ non-visual scale factor 1." duration (base note length and dot count), as a number of whole notes." (duration-length (duration-visual dur))) +(define-public (unity-if-multimeasure context dur) + "Given a context and a duration, return @code{1} if the duration is +longer than the @code{measureLength} in that context, and @code{#f} otherwise. +This supports historic use of @code{Completion_heads_engraver} to split +@code{c1*3} into three whole notes." + (if (ly:moment output hooks. -(define-public (collect-bookpart-for-book parser book-part) +(define-public (collect-bookpart-for-book book-part) "Toplevel book-part handler." (define (add-bookpart book-part) - (ly:parser-define! - parser 'toplevel-bookparts - (cons book-part (ly:parser-lookup parser 'toplevel-bookparts)))) + (ly:parser-define! 'toplevel-bookparts + (cons book-part (ly:parser-lookup 'toplevel-bookparts)))) ;; If toplevel scores have been found before this \bookpart, ;; add them first to a dedicated bookpart - (if (pair? (ly:parser-lookup parser 'toplevel-scores)) + (if (pair? (ly:parser-lookup 'toplevel-scores)) (begin (add-bookpart (ly:make-book-part - (ly:parser-lookup parser 'toplevel-scores))) - (ly:parser-define! parser 'toplevel-scores (list)))) + (ly:parser-lookup 'toplevel-scores))) + (ly:parser-define! 'toplevel-scores (list)))) (add-bookpart book-part)) -(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-scores-for-book score) + (ly:parser-define! 'toplevel-scores + (cons score (ly:parser-lookup 'toplevel-scores)))) -(define-public (collect-music-aux score-handler parser music) +(define-public (collect-music-aux score-handler music) (define (music-property symbol) (ly:music-property music symbol #f)) (cond ((music-property 'page-marker) @@ -165,54 +169,52 @@ duration (base note length and dot count), as a number of whole notes." ((not (music-property 'void)) ;; a regular music expression: make a score with this music ;; void music is discarded - (score-handler (scorify-music music parser))))) + (score-handler (scorify-music music))))) -(define-public (collect-music-for-book parser music) +(define-public (collect-music-for-book music) "Top-level music handler." (collect-music-aux (lambda (score) - (collect-scores-for-book parser score)) - parser + (collect-scores-for-book score)) music)) -(define-public (collect-book-music-for-book parser book music) +(define-public (collect-book-music-for-book book music) "Book music handler." (collect-music-aux (lambda (score) (ly:book-add-score! book score)) - parser music)) -(define-public (scorify-music music parser) +(define-public (scorify-music music) "Preprocess @var{music}." (ly:make-score - (fold (lambda (f m) (f m parser)) + (fold (lambda (f m) (f m)) music toplevel-music-functions))) -(define (get-current-filename parser book) +(define (get-current-filename book) "return any suffix value for output filename allowing for settings by calls to bookOutputName function" - (or (paper-variable parser book 'output-filename) - (ly:parser-output-name parser))) + (or (paper-variable book 'output-filename) + (ly:parser-output-name))) -(define (get-current-suffix parser book) +(define (get-current-suffix book) "return any suffix value for output filename allowing for settings by calls to bookoutput function" - (let ((book-output-suffix (paper-variable parser book 'output-suffix))) + (let ((book-output-suffix (paper-variable book 'output-suffix))) (if (not (string? book-output-suffix)) - (ly:parser-lookup parser 'output-suffix) + (ly:parser-lookup 'output-suffix) book-output-suffix))) (define-public current-outfile-name #f) ; for use by regression tests -(define (get-outfile-name parser book) +(define (get-outfile-name book) "return current filename for generating backend output files" ;; user can now override the base file name, so we have to use ;; the file-name concatenated with any potential output-suffix value ;; as the key to out internal a-list - (let* ((base-name (get-current-filename parser book)) - (output-suffix (get-current-suffix parser book)) + (let* ((base-name (get-current-filename book)) + (output-suffix (get-current-suffix book)) (alist-key (format #f "~a~a" base-name output-suffix)) - (counter-alist (ly:parser-lookup parser 'counter-alist)) + (counter-alist (ly:parser-lookup 'counter-alist)) (output-count (assoc-get alist-key counter-alist 0)) (result base-name)) ;; Allow all ASCII alphanumerics, including accents @@ -229,64 +231,62 @@ bookoutput function" (if (> output-count 0) (set! result (format #f "~a-~a" result output-count))) - (ly:parser-define! - parser 'counter-alist + (ly:parser-define! 'counter-alist (assoc-set! counter-alist alist-key (1+ output-count))) (set! current-outfile-name result) result)) -(define (print-book-with parser book process-procedure) - (let* ((paper (ly:parser-lookup parser '$defaultpaper)) - (layout (ly:parser-lookup parser '$defaultlayout)) - (outfile-name (get-outfile-name parser book))) +(define (print-book-with book process-procedure) + (let* ((paper (ly:parser-lookup '$defaultpaper)) + (layout (ly:parser-lookup '$defaultlayout)) + (outfile-name (get-outfile-name book))) (process-procedure book paper layout outfile-name))) -(define-public (print-book-with-defaults parser book) - (print-book-with parser book ly:book-process)) +(define-public (print-book-with-defaults book) + (print-book-with book ly:book-process)) -(define-public (print-book-with-defaults-as-systems parser book) - (print-book-with parser book ly:book-process-to-systems)) +(define-public (print-book-with-defaults-as-systems book) + (print-book-with book ly:book-process-to-systems)) ;; Add a score to the current bookpart, book or toplevel -(define-public (add-score parser score) +(define-public (add-score score) (cond - ((ly:parser-lookup parser '$current-bookpart) - ((ly:parser-lookup parser 'bookpart-score-handler) - (ly:parser-lookup parser '$current-bookpart) score)) - ((ly:parser-lookup parser '$current-book) - ((ly:parser-lookup parser 'book-score-handler) - (ly:parser-lookup parser '$current-book) score)) + ((ly:parser-lookup '$current-bookpart) + ((ly:parser-lookup 'bookpart-score-handler) + (ly:parser-lookup '$current-bookpart) score)) + ((ly:parser-lookup '$current-book) + ((ly:parser-lookup 'book-score-handler) + (ly:parser-lookup '$current-book) score)) (else - ((ly:parser-lookup parser 'toplevel-score-handler) parser score)))) + ((ly:parser-lookup 'toplevel-score-handler) score)))) (define-public paper-variable (let ((get-papers - (lambda (parser book) + (lambda (book) (append (if (and book (ly:output-def? (ly:book-paper book))) (list (ly:book-paper book)) '()) - (ly:parser-lookup parser '$papers) - (list (ly:parser-lookup parser '$defaultpaper)))))) + (ly:parser-lookup '$papers) + (list (ly:parser-lookup '$defaultpaper)))))) (make-procedure-with-setter - (lambda (parser book symbol) + (lambda (book symbol) (any (lambda (p) (ly:output-def-lookup p symbol #f)) - (get-papers parser book))) - (lambda (parser book symbol value) + (get-papers book))) + (lambda (book symbol value) (ly:output-def-set-variable! - (car (get-papers parser book)) + (car (get-papers book)) symbol value))))) -(define-public (add-text parser text) - (add-score parser (list text))) +(define-public (add-text text) + (add-score (list text))) -(define-public (add-music parser music) +(define-public (add-music music) (collect-music-aux (lambda (score) - (add-score parser score)) - parser + (add-score score)) music)) -(define-public (context-mod-from-music parser music) +(define-public (context-mod-from-music music) (let ((warn #t) (mods (ly:make-context-mod))) (let loop ((m music)) (if (music-is-of-type? m 'layout-instruction-event) @@ -334,7 +334,7 @@ bookoutput function" (set! warn #f))))))))) mods)) -(define-public (context-defs-from-music parser output-def music) +(define-public (context-defs-from-music output-def music) (let ((warn #t)) (let loop ((m music) (mods #f)) ;; The parser turns all sets, overrides etc into something @@ -707,20 +707,30 @@ right (@var{dir}=+1)." (define-public (coord-scale coordinate amount) (coord-operation * amount coordinate)) -(define-public (coord-rotate coordinate degrees-in-radians) - (let* - ((coordinate - (cons - (exact->inexact (coord-x coordinate)) - (exact->inexact (coord-y coordinate)))) - (radius - (sqrt - (+ (* (coord-x coordinate) (coord-x coordinate)) - (* (coord-y coordinate) (coord-y coordinate))))) - (angle (angle-0-2pi (atan (coord-y coordinate) (coord-x coordinate))))) - (cons - (* radius (cos (+ angle degrees-in-radians))) - (* radius (sin (+ angle degrees-in-radians)))))) +(define-public (coord-rotate coordinate angle-in-radians) + ;; getting around (sin PI) not being exactly zero by switching to cos at + ;; appropiate angles and/or taking the negative value (vice versa for cos) + (let* ((quadrant (inexact->exact (round (/ angle-in-radians (/ PI 2))))) + (moved-angle (- angle-in-radians (* quadrant (/ PI 2)))) + (s (sin moved-angle)) + (c (cos moved-angle)) + (x (coord-x coordinate)) + (y (coord-y coordinate))) + (case (modulo quadrant 4) + ((0) ;; -45 .. 45 + (cons (- (* c x) (* s y)) + (+ (* s x) (* c y)))) + ((1) ;; 45 .. 135 + (cons (- (* (- s) x) (* c y)) + (+ (* c x) (* (- s) y)))) + ((2) ;; 135 .. 225 + (cons (- (* (- c) x) (* (- s) y)) + (+ (* (- s) x) (* (- c) y)))) + ((3) ;; 225 .. 315 + (cons (- (* s x) (* (- c) y)) + (+ (* (- c) x) (* s y)))) + ;; for other angles (modulo quadrant 4) returns one of the above cases + ))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; trig @@ -735,11 +745,11 @@ right (@var{dir}=+1)." (define-public (cyclic-base-value value cycle) "Take @var{value} and modulo-maps it between 0 and base @var{cycle}." - (if (< value 0) - (cyclic-base-value (+ value cycle) cycle) - (if (>= value cycle) - (cyclic-base-value (- value cycle) cycle) - value))) + (cond ((< value 0) + (cyclic-base-value (+ value cycle) cycle)) + ((>= value cycle) + (cyclic-base-value (- value cycle) cycle)) + (else value))) (define-public (angle-0-2pi angle) "Take @var{angle} (in radians) and maps it between 0 and 2pi." @@ -786,6 +796,12 @@ as rectangular coordinates @ode{(x-length . y-length)}." (define-public (string-startswith s prefix) (equal? prefix (substring s 0 (min (string-length s) (string-length prefix))))) +(define-public (remove-whitespace strg) +"Remove characters satisfying @code{char-whitespace?} from string @var{strg}" + (string-delete + strg + char-whitespace?)) + (define-public (string-encode-integer i) (cond ((= i 0) "o") @@ -825,12 +841,12 @@ Handy for debugging, possibly turned off." ;; x) (define-public (stderr string . rest) - (apply format (cons (current-error-port) (cons string rest))) + (apply format (current-error-port) string rest) (force-output (current-error-port))) (define-public (debugf string . rest) (if #f - (apply stderr (cons string rest)))) + (apply stderr string rest))) (define (index-cell cell dir) (if (equal? dir 1) @@ -872,6 +888,26 @@ Handy for debugging, possibly turned off." (reverse matches)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; numbering styles + +(define-public (number-format number-type num . custom-format) + "Print NUM accordingly to the requested NUMBER-TYPE. +Choices include @code{roman-lower} (by default), +@code{roman-upper}, @code{arabic} and @code{custom}. +In the latter case, CUSTOM-FORMAT must be supplied +and will be applied to NUM." + (cond + ((equal? number-type 'roman-lower) + (fancy-format #f "~(~@r~)" num)) + ((equal? number-type 'roman-upper) + (fancy-format #f "~@r" num)) + ((equal? number-type 'arabic) + (fancy-format #f "~d" num)) + ((equal? number-type 'custom) + (fancy-format #f (car custom-format) num)) + (else (fancy-format #f "~(~@r~)" num)))) + ;;;;;;;;;;;;;;;; ;; other @@ -927,23 +963,46 @@ print a warning and set an optional @var{default}." (object->string def)) def)))) -;; -;; don't confuse users with # syntax. -;; +(define (self-evaluating? x) + (or (number? x) (string? x) (procedure? x) (boolean? x))) + +(define (ly-type? x) + (any (lambda (p) ((car p) x)) lilypond-exported-predicates)) + +(define-public (pretty-printable? val) + (and (not (self-evaluating? val)) + (not (symbol? val)) + (not (hash-table? val)) + (not (ly-type? val)))) + (define-public (scm->string val) - (if (and (procedure? val) - (symbol? (procedure-name val))) - (symbol->string (procedure-name val)) - (string-append - (if (self-evaluating? val) - (if (string? val) - "\"" - "") - "'") - (call-with-output-string (lambda (port) (display val port))) - (if (string? val) - "\"" - "")))) + (let* ((quote-style (if (string? val) + 'double + (if (or (null? val) ; (ly-type? '()) => #t + (and (not (self-evaluating? val)) + (not (vector? val)) + (not (hash-table? val)) + (not (ly-type? val)))) + 'single + 'none))) + ; don't confuse users with # syntax + (str (if (and (procedure? val) + (symbol? (procedure-name val))) + (symbol->string (procedure-name val)) + (call-with-output-string + (if (pretty-printable? val) + ; property values in PDF hit margin after 64 columns + (lambda (port) + (pretty-print val port #:width (case quote-style + ((single) 63) + (else 64)))) + (lambda (port) (display val port))))))) + (case quote-style + ((single) (string-append + "'" + (string-regexp-substitute "\n " "\n " str))) + ((double) (string-append "\"" str "\"")) + (else str)))) (define-public (!= lst r) (not (= lst r))) @@ -979,3 +1038,10 @@ print a warning and set an optional @var{default}." (ly:format "~a:1" input-file-name) (_ "no \\version statement found, please add~afor future compatibility") (format #f "\n\n\\version ~s\n\n" (lilypond-version)))) + +(define-public (output-module? module) + "Returns @code{#t} if @var{module} belongs to an output module +usually carrying context definitions (@code{\\midi} or +@code{\\layout})." + (or (module-ref module 'is-midi #f) + (module-ref module 'is-layout #f))) diff --git a/scm/lily-sort.scm b/scm/lily-sort.scm index 95d3e33ffb..a3d951df5c 100644 --- a/scm/lily-sort.scm +++ b/scm/lily-sort.scm @@ -2,7 +2,7 @@ ;;;; ;;;; source file of the GNU LilyPond music typesetter ;;;; -;;;; Copyright 2009--2012 Mark Polesky +;;;; Copyright 2009--2015 Mark Polesky ;; This file implements a LilyPond-specific character-sorting algorithm diff --git a/scm/lily.scm b/scm/lily.scm index 9b0a6d2aad..d1248cdd92 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 1998--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -41,7 +41,25 @@ (define-public PLATFORM (string->symbol (string-downcase - (car (string-tokenize (utsname:sysname (uname))))))) + (car (string-tokenize (utsname:sysname (uname)) char-set:letter))))) + +;; We don't use (srfi srfi-39) (parameter objects) here because that +;; does not give us a name/handle to the underlying fluids themselves. + +(define %parser (make-fluid)) +(define %location (make-fluid)) +;; No public setters: should not get overwritten in action +(define-public (*parser*) (fluid-ref %parser)) +(define-public (*location*) (fluid-ref %location)) +;; but properly scoped location should be fine +(defmacro-public with-location (loc . body) + `(with-fluids ((,%location ,loc)) ,@body)) + +;; It would be nice to convert occurences of parser/location to +;; (*parser*)/(*location*) using the syncase module but it is utterly +;; broken in GUILE 1 and would require changing a lot of unrelated +;; innocuous constructs which just happen to fall apart with +;; inscrutable error messages. ;; ;; Session-handling variables and procedures. @@ -68,6 +86,7 @@ ;; (define lilypond-declarations '()) +(define lilypond-exports '()) (define after-session-hook (make-hook)) (define-public (call-after-session thunk) @@ -75,7 +94,16 @@ (ly:error (_ "call-after-session used after session start"))) (add-hook! after-session-hook thunk #t)) -(defmacro-public define-session (name value) +(define (make-session-variable name value) + (if (ly:undead? lilypond-declarations) + (ly:error (_ "define-session used after session start"))) + (let ((var (module-make-local-var! (current-module) name))) + (if (variable-bound? var) + (ly:error (_ "symbol ~S redefined") name)) + (variable-set! var value) + var)) + +(defmacro define-session (name value) "This defines a variable @var{name} with the starting value @var{value} that is reinitialized at the start of each session. A@tie{}session basically corresponds to one LilyPond file on the @@ -89,17 +117,22 @@ to their front or replacing them altogether, not by modifying parts of them. It is an error to call @code{define-session} after the first session has started." (define (add-session-variable name value) - (if (ly:undead? lilypond-declarations) - (ly:error (_ "define-session used after session start"))) - (let ((var (make-variable value))) - (module-add! (current-module) name var) - (set! lilypond-declarations (cons var lilypond-declarations)))) + (set! lilypond-declarations + (cons (make-session-variable name value) lilypond-declarations))) `(,add-session-variable ',name ,value)) -(defmacro-public define-session-public (name value) - "Like @code{define-session}, but also exports @var{name}." +(defmacro define-session-public (name value) + "Like @code{define-session}, but also exports @var{name} into parser modules." + (define (add-session-variable name value) + (set! lilypond-exports + (acons name (make-session-variable name value) lilypond-exports))) `(begin - (define-session ,name ,value) + ;; this is a bit icky: we place the variable right into every + ;; parser module so that both set! and define will affect the + ;; original variable in the (lily) module. However, we _also_ + ;; export it normally from (lily) for the sake of other modules + ;; not sharing the name space of the parser. + (,add-session-variable ',name ,value) (export ,name))) (define (session-terminate) @@ -140,7 +173,16 @@ variables to their value after the initial call of @var{thunk}." (module-add! (current-module) (car p) var)))) (ly:get-undead lilypond-declarations))) (begin + ;; import all public session variables natively into parser + ;; module. That makes them behave identically under define/set! + (for-each (lambda (v) + (module-add! (current-module) (car v) (cdr v))) + lilypond-exports) + ;; Initialize first session (thunk) + ;; lilypond-exports is no longer needed since we will grab its + ;; values from (current-module). + (set! lilypond-exports #f) (set! lilypond-interfaces (filter (lambda (m) (eq? 'interface (module-kind m))) (module-uses (current-module)))) @@ -227,6 +269,9 @@ configurations.") #f "Dump output signatures of each system. Used for regression testing.") + (embed-source-code + #f + "Embed the source files inside the generated PDF document.") (eps-box-padding #f "Pad left edge of the output EPS bounding box by @@ -277,7 +322,7 @@ file to given string.") to a music font.") (point-and-click #t - "Add point & click links to PDF output.") + "Add point & click links to PDF and SVG output.") (paper-size "a4" "Set default paper size.") @@ -411,8 +456,8 @@ messages into errors.") (define-public (ergonomic-simple-format dest . rest) "Like ice-9's @code{format}, but without the memory consumption." (if (string? dest) - (apply simple-format (cons #f (cons dest rest))) - (apply simple-format (cons dest rest)))) + (apply simple-format #f dest rest) + (apply simple-format dest rest))) (define format ergonomic-simple-format) @@ -426,7 +471,7 @@ messages into errors.") v) (define-public (print . args) - (apply format (cons (current-output-port) args))) + (apply format (current-output-port) args)) ;;; General settings. @@ -446,8 +491,6 @@ messages into errors.") (if (ly:get-option 'trace-scheme-coverage) (coverage:enable)) -(define-public parser #f) - (define music-string-to-path-backends '(svg)) @@ -491,7 +534,8 @@ messages into errors.") (and (eq? PLATFORM 'windows) (> file-name-length 2) (eq? (string-ref file-name 1) #\:) - (eq? (string-ref file-name 2) #\/)))))) + (or (eq? (string-ref file-name 2) #\\) + (eq? (string-ref file-name 2) #\/))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; If necessary, emulate Guile V2 module_export_all! for Guile V1.8.n @@ -547,9 +591,9 @@ messages into errors.") "c++.scm" "chord-entry.scm" "skyline.scm" - "stencil.scm" - "define-markup-commands.scm" "markup.scm" + "define-markup-commands.scm" + "stencil.scm" "modal-transforms.scm" "chord-generic-names.scm" "chord-ignatzek-names.scm" @@ -557,11 +601,11 @@ messages into errors.") "part-combiner.scm" "autochange.scm" "define-music-properties.scm" + "time-signature.scm" "time-signature-settings.scm" "auto-beam.scm" "chord-name.scm" "bezier-tools.scm" - "ly-syntax-constructors.scm" "define-context-properties.scm" "translation-functions.scm" @@ -658,6 +702,10 @@ messages into errors.") (,fraction? . "fraction, as pair") (,grob-list? . "list of grobs") (,index? . "non-negative integer") + (,key? . "index or symbol") + (,key-list? . "list of indexes or symbols") + (,key-list-or-music? . "key list or music") + (,key-list-or-symbol? . "key list or symbol") (,markup? . "markup") (,markup-command-list? . "markup command list") (,markup-list? . "markup list") @@ -669,6 +717,7 @@ messages into errors.") (,number-or-string? . "number or string") (,number-pair? . "pair of numbers") (,number-pair-list? . "list of number pairs") + (,rational-or-procedure? . "an exact rational or procedure") (,rhythmic-location? . "rhythmic location") (,scheme? . "any type") (,string-or-pair? . "string or pair") @@ -694,6 +743,7 @@ messages into errors.") (,ly:font-metric? . "font metric") (,ly:grob? . "graphical (layout) object") (,ly:grob-array? . "array of grobs") + (,ly:grob-properties? . "grob properties") (,ly:input-location? . "input location") (,ly:item? . "item") (,ly:iterator? . "iterator") @@ -714,7 +764,6 @@ messages into errors.") (,ly:pitch? . "pitch") (,ly:prob? . "property object") (,ly:score? . "score") - (,ly:simple-closure? . "simple closure") (,ly:skyline? . "skyline") (,ly:skyline-pair? . "pair of skylines") (,ly:source-file? . "source file") @@ -724,6 +773,7 @@ messages into errors.") (,ly:stream-event? . "stream event") (,ly:translator? . "translator") (,ly:translator-group? . "translator group") + (,ly:undead? . "undead container") (,ly:unpure-pure-container? . "unpure/pure container") )) @@ -749,8 +799,8 @@ messages into errors.") (define (dump-profile base last this) (let* ((outname (format #f "~a.profile" (dir-basename base ".ly"))) - (diff (map (lambda (y) (apply - y)) (zip this last)))) - (ly:progress "\nWriting timing to ~a..." outname) + (diff (map - this last))) + (ly:progress "\nWriting timing to ~a...\n" outname) (format (open-file outname "w") "time: ~a\ncells: ~a\n" (if (ly:get-option 'dump-cpu-profile) diff --git a/scm/ly-syntax-constructors.scm b/scm/ly-syntax-constructors.scm index 5fe0bfbbef..0a12672095 100644 --- a/scm/ly-syntax-constructors.scm +++ b/scm/ly-syntax-constructors.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2006--2012 Erik Sandberg +;;;; Copyright (C) 2006--2015 Erik Sandberg ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -15,100 +15,119 @@ ;;;; You should have received a copy of the GNU General Public License ;;;; along with LilyPond. If not, see . -;; TODO: use separate module for syntax -;; constructors. Also create wrapper around the constructor? -(defmacro define-ly-syntax (args . body) - `(define-public ,args ,@body)) - -;; A ly-syntax constructor takes two extra parameters, parser and -;; location. These are mainly used for reporting errors and -;; warnings. This function is a syntactic sugar which uses the -;; location arg to set the origin of the returned music object; this -;; behaviour is usually desired -(defmacro define-ly-syntax-loc (args . body) - `(define-public ,args - (let ((m ,(cons 'begin body))) - (set! (ly:music-property m 'origin) ,(third args)) - m))) -;; Like define-ly-syntax-loc, but adds parser and location -;; parameters. Useful for simple constructors that don't need to -;; report errors. -(defmacro define-ly-syntax-simple (args . body) - `(define-public ,(cons* (car args) - 'parser - 'location - (cdr args)) - (let ((m ,(cons 'begin body))) - (set! (ly:music-property m 'origin) location) - m))) +(define-module (scm ly-syntax-constructors) + #:use-module (lily) + #:use-module (srfi srfi-1) + #:use-module (scm display-lily)) + +(define-public (music-function-call-error fun m) + (let* ((sigcar (car (ly:music-function-signature fun))) + (pred? (if (pair? sigcar) (car sigcar) sigcar))) + (ly:parser-error + (format #f (_ "~a function cannot return ~a") + (type-name pred?) + (value->lily-string m)) + (*location*)) + (and (pair? sigcar) + (if (ly:music? (cdr sigcar)) + (ly:music-deep-copy (cdr sigcar) (*location*)) + (cdr sigcar))))) ;; Music function: Apply function and check return value. -;; args are in reverse order, rest may specify additional ones +;; args are in reverse order. ;; ;; If args is not a proper list, an error has been flagged earlier ;; and no fallback value had been available. In this case, ;; we don't call the function but rather return the general ;; fallback. -(define-ly-syntax (music-function parser loc fun args . rest) - (let* ((sig (ly:music-function-signature fun)) - (pred (if (pair? (car sig)) (caar sig) (car sig))) - (good (proper-list? args)) - (m (and good (apply (ly:music-function-extract fun) - parser loc (reverse! args rest))))) - (if (and good (pred m)) - (begin - (if (ly:music? m) - (set! (ly:music-property m 'origin) loc)) - m) - (begin - (if good - (ly:parser-error parser - (format #f (_ "~a function cannot return ~a") - (type-name pred) m) - loc)) - (and (pair? (car sig)) (cdar sig)))))) - -(define-ly-syntax (argument-error parser location n pred arg) +(define-public (music-function fun args) + (let* ((sigcar (car (ly:music-function-signature fun))) + (pred? (if (pair? sigcar) (car sigcar) sigcar)) + (good (list? args)) + (m (and good (apply (ly:music-function-extract fun) (reverse! args))))) + (if good + (if (pred? m) + (if (ly:music? m) (ly:set-origin! m) m) + (music-function-call-error fun m)) + (and (pair? sigcar) + (if (ly:music? (cdr sigcar)) + (ly:music-deep-copy (cdr sigcar) (*location*)) + (cdr sigcar)))))) + +(define-public (argument-error n pred arg) (ly:parser-error - parser (format #f (_ "wrong type for argument ~a. Expecting ~a, found ~s") n (type-name pred) (music->make-music arg)) - location)) + (*location*))) -(define-ly-syntax-simple (void-music) - (make-music 'Music)) +;; Used for chaining several music functions together. `final' +;; contains the last argument and still needs typechecking. +(define (music-function-chain call final) + (let* ((fun (car call)) + (siglast (last (ly:music-function-signature fun))) + (pred? (if (pair? siglast) (car siglast) siglast))) + (if (pred? final) + (music-function fun (cons final (cdr call))) + (begin + (argument-error (length call) pred? final) + ;; call music function just for the error return value + (music-function fun #f))))) -(define-ly-syntax-simple (sequential-music mlist) - (make-sequential-music mlist)) +(define-public (partial-music-function call-list) + (let* ((good (every list? call-list)) + (sig (ly:music-function-signature (caar call-list)))) + (and good + (ly:make-music-function + (cons (car sig) (list-tail sig (length (car call-list)))) + (lambda rest + ;; Every time we use music-function, it destructively + ;; reverses its list of arguments. Changing the calling + ;; convention would be non-trivial since we do error + ;; propagation to the reversed argument list by making it + ;; a non-proper list. So we just create a fresh copy of + ;; all argument lists for each call. We also want to + ;; avoid reusing any music expressions without copying and + ;; want to let them point to the location of the music + ;; function call rather than its definition. + (let ((call-list (ly:music-deep-copy call-list (*location*)))) + (fold music-function-chain + (music-function (caar call-list) + (reverse! rest (cdar call-list))) + (cdr call-list)))))))) -(define-ly-syntax-simple (simultaneous-music mlist) - (make-simultaneous-music mlist)) +(define-public (void-music) + (ly:set-origin! (make-music 'Music))) -(define-ly-syntax-simple (event-chord mlist) - (make-music 'EventChord - 'elements mlist)) +(define-public (sequential-music mlist) + (ly:set-origin! (make-sequential-music mlist))) -(define-ly-syntax-simple (unrelativable-music mus) - (make-music 'UnrelativableMusic - 'element mus)) +(define-public (simultaneous-music mlist) + (ly:set-origin! (make-simultaneous-music mlist))) -(define-ly-syntax-simple (context-change type id) - (make-music 'ContextChange - 'change-to-type type - 'change-to-id id)) +(define-public (event-chord mlist) + (ly:set-origin! (make-music 'EventChord + 'elements mlist))) -(define-ly-syntax (tempo parser location text . rest) +(define-public (unrelativable-music mus) + (ly:set-origin! (make-music 'UnrelativableMusic + 'element mus))) + +(define-public (context-change type id) + (ly:set-origin! (make-music 'ContextChange + 'change-to-type type + 'change-to-id id))) + +(define-public (tempo text . rest) (let* ((unit (and (pair? rest) (car rest))) (count (and unit (cadr rest))) (range-tempo? (pair? count)) - (tempo-change (make-music 'TempoChangeEvent - 'origin location - 'text text - 'tempo-unit unit - 'metronome-count count)) + (tempo-change (ly:set-origin! (make-music 'TempoChangeEvent + 'text text + 'tempo-unit unit + 'metronome-count count))) (tempo-set (and unit (context-spec-music @@ -127,8 +146,8 @@ (make-sequential-music (list tempo-change tempo-set)) tempo-change))) -(define-ly-syntax-simple (repeat type num body alts) - (make-repeat type num body alts)) +(define-public (repeat type num body alts) + (ly:set-origin! (make-repeat type num body alts))) (define (script-to-mmrest-text music) "Extract @code{'direction} and @code{'text} from @var{music}, and transform @@ -138,25 +157,23 @@ into a @code{MultiMeasureTextEvent}." (make-music 'MultiMeasureTextEvent music) music)) -(define-ly-syntax (multi-measure-rest parser location duration articulations) - (make-music 'MultiMeasureRestMusic - 'articulations (map script-to-mmrest-text articulations) - 'duration duration - 'origin location)) +(define-public (multi-measure-rest duration articulations) + (ly:set-origin! (make-music 'MultiMeasureRestMusic + 'articulations (map script-to-mmrest-text articulations) + 'duration duration))) -(define-ly-syntax (repetition-chord parser location duration articulations) - (make-music 'EventChord - 'duration duration - 'elements articulations - 'origin location)) +(define-public (repetition-chord duration articulations) + (ly:set-origin! (make-music 'EventChord + 'duration duration + 'elements articulations))) -(define-ly-syntax-simple (context-specification type id ops create-new mus) +(define-public (context-specification type id ops create-new mus) (let ((csm (context-spec-music mus type id))) (set! (ly:music-property csm 'property-operations) ops) (if create-new (set! (ly:music-property csm 'create-new) #t)) - csm)) + (ly:set-origin! csm))) -(define-ly-syntax (composed-markup-list parser location commands markups) +(define-public (composed-markup-list commands markups) ;; `markups' being a list of markups, eg (markup1 markup2 markup3), ;; and `commands' a list of commands with their scheme arguments, in reverse order, ;; eg: ((italic) (raise 4) (bold)), maps the commands on each markup argument, eg: @@ -183,81 +200,129 @@ into a @code{MultiMeasureTextEvent}." (make-map-markup-commands-markup-list compose complex) completed)))))))) -(define-ly-syntax (property-operation parser location ctx music-type symbol . args) - (let* ((props (case music-type - ((PropertySet) (list 'value (car args))) - ((PropertyUnset) '()) - ((OverrideProperty) (list 'grob-value (car args) - 'grob-property-path (if (list? (cadr args)) - (cadr args) - (cdr args)) - 'pop-first #t)) - ((RevertProperty) - (if (list? (car args)) - (list 'grob-property-path (car args)) - (list 'grob-property-path args))) - (else (ly:error (_ "Invalid property operation ~a") music-type)))) - (m (apply make-music music-type - 'symbol symbol - 'origin location - props))) - (make-music 'ContextSpeccedMusic - 'element m - 'context-type ctx - 'origin location))) - -;; TODO: It seems that this function rarely returns anything useful. -(define (get-first-context-id type mus) - "Find the name of a ContextSpeccedMusic with given type" +(define-public (partial-markup commands) + ;; Like composed-markup-list, except that the result is a single + ;; markup command that can be applied to one markup + (define (compose rest) + (fold + (lambda (cmd prev) (append cmd (list prev))) + (append (car commands) rest) + (cdr commands))) + (let ((chain (lambda (layout props . rest) + (interpret-markup layout props (compose rest))))) + (set! (markup-command-signature chain) + (list-tail + (markup-command-signature (caar commands)) + (length (cdar commands)))) + chain)) + +(define-public (property-set context property value) + (ly:set-origin! (context-spec-music + (ly:set-origin! + (make-music 'PropertySet + 'symbol property + 'value value)) + context))) + +(define-public (property-unset context property) + (ly:set-origin! (context-spec-music + (ly:set-origin! + (make-music 'PropertyUnset + 'symbol property)) + context))) + +(define-public (property-override context path value) + (ly:set-origin! (context-spec-music + (ly:set-origin! + (make-music 'OverrideProperty + 'symbol (car path) + 'grob-property-path (cdr path) + 'grob-value value + 'pop-first #t)) + context))) + +(define-public (property-revert context path) + (ly:set-origin! (context-spec-music + (ly:set-origin! + (make-music 'RevertProperty + 'symbol (car path) + 'grob-property-path (cdr path))) + context))) + +;; The signature here is slightly fishy since the "fallback return +;; value" is not actually music but #f. This used to be (void-music) +;; but triggered "Parsed object should be dead" warnings for music +;; objects outside of the current parser session/module. The called +;; functions always deliver music and are used from the parser in a +;; manner where only the last argument is provided from outside the +;; parser, and its predicate "scheme?" is always true. So the +;; fallback value will never get used and its improper type is no +;; issue. +(define-public property-override-function + (ly:make-music-function + (list (cons ly:music? #f) symbol? symbol-list? scheme?) + property-override)) + +(define-public property-set-function + (ly:make-music-function + (list (cons ly:music? #f) symbol? symbol? scheme?) + property-set)) + +(define (get-first-context-id! mus) + "Find the name of a ContextSpeccedMusic, possibly naming it" (let ((id (ly:music-property mus 'context-id))) - (if (and (eq? (ly:music-property mus 'type) 'ContextSpeccedMusic) - (eq? (ly:music-property mus 'context-type) type) - (string? id) - (not (string-null? id))) - id + (if (eq? (ly:music-property mus 'name) 'ContextSpeccedMusic) + (if (and (string? id) + (not (string-null? id))) + id + ;; We may reliably give a new context a unique name, but + ;; not an existing one + (if (ly:music-property mus 'create-new #f) + (let ((id (get-next-unique-voice-name))) + (set! (ly:music-property mus 'context-id) id) + id) + '())) '()))) -(define unique-counter -1) -(define (get-next-unique-voice-name) - (set! unique-counter (1+ unique-counter)) - (call-with-output-string (lambda (p) (format p "uniqueContext~s" unique-counter)))) +(define-public (lyric-event text duration) + (ly:set-origin! (make-lyric-event text duration))) -(define-ly-syntax-simple (lyric-event text duration) - (make-lyric-event text duration)) - -(define (lyric-combine-music sync music loc) +(define-public (lyric-combine sync sync-type music) ;; CompletizeExtenderEvent is added following the last lyric in MUSIC ;; to signal to the Extender_engraver that any pending extender should ;; be completed if the lyrics end before the associated voice. (append! (ly:music-property music 'elements) (list (make-music 'CompletizeExtenderEvent))) - (make-music 'LyricCombineMusic - 'element music - 'associated-context sync - 'origin loc)) - -(define-ly-syntax (lyric-combine parser location voice music) - (lyric-combine-music voice music location)) + (ly:set-origin! + (make-music 'LyricCombineMusic + 'element music + 'associated-context sync + 'associated-context-type sync-type))) -(define-ly-syntax (add-lyrics parser location music addlyrics-list) - (let* ((existing-voice-name (get-first-context-id 'Voice music)) +(define-public (add-lyrics music addlyrics-list) + (let* ((existing-voice-name (get-first-context-id! music)) (voice-name (if (string? existing-voice-name) existing-voice-name (get-next-unique-voice-name))) (voice (if (string? existing-voice-name) - (music) + music (make-music 'ContextSpeccedMusic 'element music 'context-type 'Voice 'context-id voice-name 'origin (ly:music-property music 'origin)))) - (lyricstos (map (lambda (mus) - (let* ((loc (ly:music-property mus 'origin)) - (lyr (lyric-combine-music voice-name mus loc))) - (make-music 'ContextSpeccedMusic - 'create-new #t - 'context-type 'Lyrics - 'element lyr - 'origin loc))) - addlyrics-list))) + (voice-type (ly:music-property voice 'context-type)) + (lyricstos (map + (lambda (mus+mods) + (with-location + (ly:music-property (car mus+mods) 'origin) + (ly:set-origin! (make-music 'ContextSpeccedMusic + 'create-new #t + 'context-type 'Lyrics + 'property-operations (cdr mus+mods) + 'element + (lyric-combine + voice-name voice-type + (car mus+mods)))))) + addlyrics-list))) (make-simultaneous-music (cons voice lyricstos)))) diff --git a/scm/markup-macros.scm b/scm/markup-macros.scm index 72b107f846..6c50ec5128 100644 --- a/scm/markup-macros.scm +++ b/scm/markup-macros.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2003--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2003--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -110,14 +110,14 @@ command. There is no protection against circular definitions. (set! body (cddr body))) `(begin ;; define the COMMAND-markup function - ,(let* ((documentation (if (string? (car body)) - (list (car body)) - '())) - (real-body (if (or (null? documentation) + ,(let* ((documentation + (format #f "~a\n~a" (cddr args) + (if (string? (car body)) (car body) ""))) + (real-body (if (or (not (string? (car body))) (null? (cdr body))) body (cdr body)))) `(define-public (,command-name ,@args) - ,@documentation + ,documentation (let ,(map (lambda (prop-spec) (let ((prop (car prop-spec)) (default-value (if (null? (cdr prop-spec)) @@ -168,14 +168,14 @@ interpreted, returns a list of stencils instead of a single one" (set! body (cddr body))) `(begin ;; define the COMMAND-markup-list function - ,(let* ((documentation (if (string? (car body)) - (list (car body)) - '())) - (real-body (if (or (null? documentation) + ,(let* ((documentation + (format #f "~a\n~a" (cddr args) + (if (string? (car body)) (car body) ""))) + (real-body (if (or (not (string? (car body))) (null? (cdr body))) body (cdr body)))) `(define-public (,command-name ,@args) - ,@documentation + ,documentation (let ,(map (lambda (prop-spec) (let ((prop (car prop-spec)) (default-value (if (null? (cdr prop-spec)) @@ -236,11 +236,11 @@ interpreted, returns a list of stencils instead of a single one" ;;;;;;;;;;;;;;;;;;;;;; ;;; markup type predicates -(define (markup-function? x) +(define-public (markup-function? x) (and (markup-command-signature x) (not (object-property x 'markup-list-command)))) -(define (markup-list-function? x) +(define-public (markup-list-function? x) (and (markup-command-signature x) (object-property x 'markup-list-command))) diff --git a/scm/markup.scm b/scm/markup.scm index 64a1139738..14a007a95b 100644 --- a/scm/markup.scm +++ b/scm/markup.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2003--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2003--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -66,70 +66,105 @@ following stencil. Stencils with empty Y extent are not given @var{space} before them and don't avoid overlapping other stencils." (stack-stencils X RIGHT space (filter ly:stencil? stencils))) -;;; convert a full markup object to an approximate pure string representation +;;;; convert a full markup object to an approximate pure string representation + +;; We ignore `page-ref-markup', because we don't want to get the +;; `gauge'- and `default'-string +;; +;; TODO: +;; - we would be interested in the computed result of `replace-markup' and +;; `first-visible-markup', don't know how to get this, though +;; For now all (not computed) arguments are caught. +;; - Other markup-commands to ignore? +(define markup-commands-to-ignore + '(page-ref-markup)) (define-public (markup->string m . argscopes) (let* ((scopes (if (pair? argscopes) (car argscopes) '()))) - ;; markup commands with one markup argument, formatting ignored - (define markups-first-argument '(list - bold-markup box-markup caps-markup dynamic-markup finger-markup - fontCaps-markup huge-markup italic-markup large-markup larger-markup - medium-markup normal-size-sub-markup normal-size-super-markup - normal-text-markup normalsize-markup number-markup roman-markup - sans-markup simple-markup small-markup smallCaps-markup smaller-markup - sub-markup super-markup teeny-markup text-markup tiny-markup - typewriter-markup underline-markup upright-markup bracket-markup - circle-markup hbracket-markup parenthesize-markup rounded-box-markup - - center-align-markup center-column-markup column-markup dir-column-markup - fill-line-markup justify-markup justify-string-markup left-align-markup - left-column-markup line-markup right-align-markup right-column-markup - vcenter-markup wordwrap-markup wordwrap-string-markup )) - - ;; markup commands with markup as second argument, first argument - ;; specifies some formatting and is ignored - (define markups-second-argument '(list - abs-fontsize-markup fontsize-markup magnify-markup lower-markup - pad-around-markup pad-markup-markup pad-x-markup raise-markup - halign-markup hcenter-in-markup rotate-markup translate-markup - translate-scaled-markup with-url-markup scale-markup )) + + (define all-relevant-markup-commands + ;; Returns a list containing the names of all markup-commands and + ;; markup-list-commands with predicate @code{cheap-markup?} or + ;; @code{markup-list?} in their @code{markup-command-signature}. + ;; @code{table-of-contents} is not caught, same for user-defined commands. + ;; markup-commands from @code{markup-commands-to-ignore} are removed. + (lset-difference eq? + (map car + (filter + (lambda (x) + (let* ((predicates (markup-command-signature (cdr x)))) + (and predicates + (not + (null? + (lset-intersection eq? + '(cheap-markup? markup-list?) + (map procedure-name predicates))))))) + (ly:module->alist (resolve-module '(lily))))) + markup-commands-to-ignore)) ;; helper functions to handle string cons like string lists (define (markup-cons->string-cons c scopes) (if (not (pair? c)) (markup->string c scopes) - (cons (markup->string (car c) scopes) (markup-cons->string-cons (cdr c) scopes)))) + (cons + (markup->string (car c) scopes) + (markup-cons->string-cons (cdr c) scopes)))) (define (string-cons-join c) (if (not (pair? c)) c (string-join (list (car c) (string-cons-join (cdr c))) ""))) + ;; We let the following line in for future debugging + ;; (display-scheme-music (sort all-relevant-markup-commands symbolstring-cons (cadr m) scopes)) ) + (string-cons-join (markup-cons->string-cons (cadr m) scopes))) - ;; markup functions with the markup as first arg - ((member (car m) (primitive-eval markups-first-argument)) - (markup->string (cadr m) scopes)) + ;; handle \put-adjacent (string-join without spaces) + ((and (pair? m) (equal? (car m) put-adjacent-markup)) + (string-cons-join (markup-cons->string-cons (take-right m 2) scopes))) - ;; markup functions with markup as second arg - ((member (car m) (primitive-eval markups-second-argument)) - (markup->string (cddr m) scopes)) + ;; handle \fill-with-pattern (ignore the filling markup) + ((and (pair? m) (equal? (car m) fill-with-pattern-markup)) + (markup->string (take-right m 2) scopes)) ;; fromproperty-markup reads property values from the header block: ((equal? (car m) fromproperty-markup) (let* ((varname (symbol->string (cadr m))) ;; cut off the header: prefix from the variable name: - (newvarname (if (string-prefix? "header:" varname) (substring varname 7) varname)) + (newvarname (if (string-prefix? "header:" varname) + (substring varname 7) + varname)) (var (string->symbol newvarname)) (mod (make-module 1))) ;; Prevent loops by temporarily clearing the variable we have just looked up (module-define! mod var "") (markup->string (ly:modules-lookup scopes var) (cons mod scopes)))) + ((member (car m) + (primitive-eval (cons 'list all-relevant-markup-commands))) + (markup->string + (if (> (length (last-pair m)) 1) + (last-pair m) + (car (last-pair m))) + scopes)) + ;; ignore all other markup functions ((markup-function? (car m)) "") diff --git a/scm/midi.scm b/scm/midi.scm index e673555d93..3564a709b3 100644 --- a/scm/midi.scm +++ b/scm/midi.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2000--2015 Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -290,6 +290,17 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; +;;; Adapted from the handle-metadata function in framework-ps.scm +(define (performance-name-from-header header) + (define (metadata-lookup-output overridevar fallbackvar) + (let* ((overrideval (ly:modules-lookup (list header) overridevar)) + (fallbackval (ly:modules-lookup (list header) fallbackvar)) + (val (if overrideval overrideval fallbackval))) + (if val (ly:encode-string-for-pdf (markup->string val)) ""))) + (if (null? header) + "" + (metadata-lookup-output 'midititle 'title))) + (define-public (write-performances-midis performances basename . rest) (let ((midi-ext (ly:get-option 'midi-extension))) (let @@ -297,10 +308,11 @@ ((perfs performances) (count (if (null? rest) 0 (car rest)))) (if (pair? perfs) - (begin + (let ((perf (car perfs))) (ly:performance-write - (car perfs) + perf (if (> count 0) (format #f "~a-~a.~a" basename count midi-ext) - (format #f "~a.~a" basename midi-ext))) + (format #f "~a.~a" basename midi-ext)) + (performance-name-from-header (ly:performance-header perf))) (loop (cdr perfs) (1+ count))))))) diff --git a/scm/modal-transforms.scm b/scm/modal-transforms.scm index 71892bde65..98e9ac3021 100644 --- a/scm/modal-transforms.scm +++ b/scm/modal-transforms.scm @@ -1,6 +1,6 @@ ;;; modal-transforms.scm --- Modal transposition, inversion, and retrograde. -;; Copyright (C) 2011--2012 Ellis & Grant, Inc. +;; Copyright (C) 2011--2015 Ellis & Grant, Inc. ;; Author: Michael Ellis @@ -130,9 +130,8 @@ LilyPond scheme pitches, e.g. @code{(ly:make-pitch 0 2 0)} "Recurse through @var{music}, extracting pitches. Returns a list of pitch objects, e.g @code{'((ly:make-pitch 0 2 0) (ly:make-pitch 0 4 0) ... )} -Typically used to construct a scale for input to transposer-factory -(see). -" +Typically used to construct a scale for input to +@code{transposer-factory}." (let ((elements (ly:music-property music 'elements)) (element (ly:music-property music 'element)) @@ -192,12 +191,15 @@ Typically used to construct a scale for input to transposer-factory ;; inversion and retrograding. (let* ((elements (ly:music-property music 'elements)) + (arts (ly:music-property music 'articulations)) (reversed (reverse elements)) (element (ly:music-property music 'element)) (span-dir (ly:music-property music 'span-direction))) (ly:music-set-property! music 'elements reversed) + (for-each retrograde-music arts) + (if (ly:music? element) (ly:music-set-property! music 'element diff --git a/scm/music-functions.scm b/scm/music-functions.scm index e73ffe2201..9c36ceaf4d 100644 --- a/scm/music-functions.scm +++ b/scm/music-functions.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 1998--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -35,6 +35,14 @@ "Does @code{mus} belong to the music class @code{type}?" (memq type (ly:music-property mus 'types))) +(define-safe-public (music-type-predicate types) + "Returns a predicate function that can be used for checking +music to have one of the types listed in @var{types}." + (if (cheap-list? types) + (lambda (m) + (any (lambda (t) (music-is-of-type? m t)) types)) + (lambda (m) (music-is-of-type? m types)))) + ;; TODO move this (define-public ly:grob-property (make-procedure-with-setter ly:grob-property @@ -158,6 +166,8 @@ For instance, "Generate an expression that, once evaluated, may return an object equivalent to @var{obj}, that is, for a music expression, a @code{(make-music ...)} form." + (define (if-nonzero num) + (if (zero? num) '() (list num))) (cond (;; markup expression (markup? obj) (markup-expression->make-markup obj)) @@ -173,20 +183,28 @@ equivalent to @var{obj}, that is, for a music expression, a (ly:music-mutable-properties obj))))) (;; moment (ly:moment? obj) - `(ly:make-moment ,(ly:moment-main-numerator obj) - ,(ly:moment-main-denominator obj) - ,(ly:moment-grace-numerator obj) - ,(ly:moment-grace-denominator obj))) + `(ly:make-moment + ,@(let ((main (ly:moment-main obj)) + (grace (ly:moment-grace obj))) + (cond ((zero? grace) (list main)) + ((negative? grace) (list main grace)) + (else ;;positive grace requires 4-arg form + (list (numerator main) + (denominator main) + (numerator grace) + (denominator grace))))))) (;; note duration (ly:duration? obj) `(ly:make-duration ,(ly:duration-log obj) - ,(ly:duration-dot-count obj) - ,(ly:duration-scale obj))) + ,@(if (= (ly:duration-scale obj) 1) + (if-nonzero (ly:duration-dot-count obj)) + (list (ly:duration-dot-count obj) + (ly:duration-scale obj))))) (;; note pitch (ly:pitch? obj) `(ly:make-pitch ,(ly:pitch-octave obj) ,(ly:pitch-notename obj) - ,(ly:pitch-alteration obj))) + ,@(if-nonzero (ly:pitch-alteration obj)))) (;; scheme procedure (procedure? obj) (or (procedure-name obj) obj)) @@ -219,14 +237,13 @@ which often can be read back in order to generate an equivalent expression." (use-modules (srfi srfi-39) (scm display-lily)) -(define*-public (display-lily-music expr parser #:optional (port (current-output-port)) +(define*-public (display-lily-music expr #:optional (port (current-output-port)) #: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) port) + (*omit-duration* #f)) + (display (music->lily-string expr) port) (newline port))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -243,18 +260,23 @@ The number of dots in the shifted music may not be less than zero." (max 0 (+ dot (ly:duration-dot-count d))) cp))) (set! (ly:music-property music 'duration) nd))) + ;clear cached length, since it's no longer valid + (set! (ly:music-property music 'length) '()) music)) (define-public (shift-duration-log music shift dot) (music-map (lambda (x) (shift-one-duration-log x shift dot)) music)) -(define-public (make-repeat name times main alts) - "Create a repeat music expression, with all properties initialized -properly." +(define-public (tremolo::get-music-list tremolo) + "Given a tremolo repeat, return a list of music to engrave for it. +This will be a stretched copy of its body, plus a TremoloEvent or +TremoloSpanEvent. + +This is called only by Chord_tremolo_iterator." (define (first-note-duration music) - "Finds the duration of the first NoteEvent by searching depth-first -through MUSIC." + "Finds the duration of the first NoteEvent by searching +depth-first through MUSIC." ;; NoteEvent or a non-expanded chord-repetition ;; We just take anything that actually sports an announced duration. (if (ly:duration? (ly:music-property music 'duration)) @@ -267,46 +289,73 @@ through MUSIC." (if (ly:duration? dur) dur (loop (cdr elts)))))))) - - (let ((talts (if (< times (length alts)) - (begin - (ly:warning (_ "More alternatives than repeats. Junking excess alternatives")) - (take alts times)) - alts)) - (r (make-repeated-music name))) - (set! (ly:music-property r 'element) main) - (set! (ly:music-property r 'repeat-count) (max times 1)) - (set! (ly:music-property r 'elements) talts) - (if (and (equal? name "tremolo") - (pair? (extract-named-music main '(EventChord NoteEvent)))) - ;; This works for single-note and multi-note tremolos! - (let* ((children (if (music-is-of-type? main 'sequential-music) - ;; \repeat tremolo n { ... } - (length (extract-named-music main '(EventChord - NoteEvent))) - ;; \repeat tremolo n c4 - 1)) - ;; # of dots is equal to the 1 in bitwise representation (minus 1)! - (dots (1- (logcount (* times children)))) - ;; The remaining missing multiplicator to scale the notes by + (let* ((times (ly:music-property tremolo 'repeat-count)) + (body (ly:music-property tremolo 'element)) + (children (if (music-is-of-type? body 'sequential-music) + ;; \repeat tremolo n { ... } + (count duration-of-note ; do not count empty <> + (extract-named-music body + '(EventChord NoteEvent))) + ;; \repeat tremolo n c4 + 1)) + (tremolo-type (if (positive? children) + (let* ((note-duration (first-note-duration body)) + (duration-log (if (ly:duration? note-duration) + (ly:duration-log note-duration) + 1))) + (ash 1 duration-log)) + '())) + (stretched (ly:music-deep-copy body))) + (if (positive? children) + ;; # of dots is equal to the 1 in bitwise representation (minus 1)! + (let* ((dots (1- (logcount (* times children)))) + ;; The remaining missing multiplier to scale the notes by ;; times * children (mult (/ (* times children (ash 1 dots)) (1- (ash 2 dots)))) - (shift (- (ly:intlog2 (floor mult)))) - (note-duration (first-note-duration r)) - (duration-log (if (ly:duration? note-duration) - (ly:duration-log note-duration) - 1)) - (tremolo-type (ash 1 duration-log))) - (set! (ly:music-property r 'tremolo-type) tremolo-type) + (shift (- (ly:intlog2 (floor mult))))) (if (not (and (integer? mult) (= (logcount mult) 1))) (ly:music-warning - main + body (ly:format (_ "invalid tremolo repeat count: ~a") times))) - ;; Adjust the time of the notes - (ly:music-compress r (ly:make-moment 1 children)) + ;; Make each note take the full duration + (ly:music-compress stretched (ly:make-moment 1 children)) ;; Adjust the displayed note durations - (shift-duration-log r shift dots)) - r))) + (shift-duration-log stretched shift dots))) + ;; Return the stretched body plus a tremolo event + (if (= children 1) + (list (make-music 'TremoloEvent + 'repeat-count times + 'tremolo-type tremolo-type + 'origin (ly:music-property tremolo 'origin)) + stretched) + (list (make-music 'TremoloSpanEvent + 'span-direction START + 'repeat-count times + 'tremolo-type tremolo-type + 'origin (ly:music-property tremolo 'origin)) + stretched + (make-music 'TremoloSpanEvent + 'span-direction STOP + 'origin (ly:music-property tremolo 'origin)))))) + +(define-public (make-repeat name times main alts) + "Create a repeat music expression, with all properties initialized +properly." + (let ((type (or (assoc-get name '(("volta" . VoltaRepeatedMusic) + ("unfold" . UnfoldedRepeatedMusic) + ("percent" . PercentRepeatedMusic) + ("tremolo" . TremoloRepeatedMusic))) + (begin (ly:warning (_ "unknown repeat type `~S': must be volta, unfold, percent, or tremolo") name) + 'VoltaRepeatedMusic))) + (talts (if (< times (length alts)) + (begin + (ly:warning (_ "More alternatives than repeats. Junking excess alternatives")) + (take alts times)) + alts))) + (make-music type + 'element main + 'repeat-count (max times 1) + 'elements talts))) (define (calc-repeat-slash-count music) "Given the child-list @var{music} in @code{PercentRepeatMusic}, @@ -341,40 +390,10 @@ beats to be distinguished." (define-public (unfold-repeats music) "Replace all repeats with unfolded repeats." - (let ((es (ly:music-property music 'elements)) (e (ly:music-property music 'element))) - (if (music-is-of-type? music 'repeated-music) - (let* ((props (ly:music-mutable-properties music)) - (old-name (ly:music-property music 'name)) - (flattened (flatten-alist props))) - (set! music (apply make-music (cons 'UnfoldedRepeatedMusic - flattened))) - - (if (and (equal? old-name 'TremoloRepeatedMusic) - (pair? (extract-named-music e '(EventChord NoteEvent)))) - ;; This works for single-note and multi-note tremolos! - (let* ((children (if (music-is-of-type? e 'sequential-music) - ;; \repeat tremolo n { ... } - (length (extract-named-music e '(EventChord - NoteEvent))) - ;; \repeat tremolo n c4 - 1)) - (times (ly:music-property music 'repeat-count)) - - ;; # of dots is equal to the 1 in bitwise representation (minus 1)! - (dots (1- (logcount (* times children)))) - ;; The remaining missing multiplicator to scale the notes by - ;; times * children - (mult (/ (* times children (ash 1 dots)) (1- (ash 2 dots)))) - (shift (- (ly:intlog2 (floor mult))))) - - ;; Adjust the time of the notes - (ly:music-compress music (ly:make-moment children 1)) - ;; Adjust the displayed note durations - (shift-duration-log music (- shift) (- dots)))))) - + (set! music (make-music 'UnfoldedRepeatedMusic music))) (if (pair? es) (set! (ly:music-property music 'elements) (map unfold-repeats es))) @@ -389,24 +408,13 @@ beats to be distinguished." (lambda (m) (and (music-is-of-type? m 'unfolded-repeated-music) (make-sequential-music - (ly:music-deep-copy - (let ((n (ly:music-property m 'repeat-count)) - (alts (ly:music-property m 'elements)) - (body (ly:music-property m 'element))) - (cond ((<= n 0) '()) - ((null? alts) (make-list n body)) - (else - (concatenate - (zip (make-list n body) - (append! (make-list (max 0 (- n (length alts))) - (car alts)) - alts)))))))))) + (ly:music-deep-copy (make-unfolded-set m))))) (unfold-repeats music))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; property setting music objs. -(define-safe-public (check-grob-path path #:optional parser location +(define-safe-public (check-grob-path path #:optional location #:key (start 0) default @@ -475,16 +483,63 @@ respectively." (<= min (length res)))) res (begin - (if parser - (ly:parser-error parser - (format #f (_ "bad grob property path ~a") - path) - location)) + (ly:parser-error + (format #f (_ "bad grob property path ~a") + path) + location) #f))))) +(define-safe-public (check-context-path path #:optional location) + "Check a context property path specification @var{path}, a symbol +list (or a single symbol), for validity and possibly complete it. +Returns the completed specification, or @code{#f} when rising an +error (using optionally @code{location})." + (let* ((path (if (symbol? path) (list path) path))) + ;; A Guile 1.x bug specific to optargs precludes moving the + ;; defines out of the let + (define (property? s) + (object-property s 'translation-type?)) + (define (unspecial? s) + (not (property? s))) + (define (check c p) (c p)) + (or (case (length path) + ((1) (and (property? (car path)) (cons 'Bottom path))) + ((2) (and (unspecial? (car path)) (property? (cadr path)) path)) + (else #f)) + (begin + (ly:parser-error + (format #f (_ "bad context property ~a") + path) + location) + #f)))) + +(define-safe-public (check-music-path path #:optional location #:key default) + "Check a music property path specification @var{path}, a symbol +list (or a single symbol), for validity and possibly complete it. +Returns the completed specification, or @code{#f} when rising an +error (using optionally @code{location})." + (let* ((path (if (symbol? path) (list path) path))) + ;; A Guile 1.x bug specific to optargs precludes moving the + ;; defines out of the let + (define (property? s) + (object-property s 'music-type?)) + (define (unspecial? s) + (not (property? s))) + (or (case (length path) + ((1) (and (property? (car path)) (cons default path))) + ((2) (and (unspecial? (car path)) (property? (cadr path)) path)) + (else #f)) + (begin + (ly:parser-error + (format #f (_ "bad music property ~a") + path) + location) + #f)))) + (define-public (make-grob-property-set grob gprop val) - "Make a @code{Music} expression that sets @var{gprop} to @var{val} in -@var{grob}. Does a pop first, i.e., this is not an override." + "Make a @code{Music} expression that overrides a @var{gprop} to +@var{val} in @var{grob}. Does a pop first, i.e. this is not a +@code{\\temporary \\override}." (make-music 'OverrideProperty 'symbol grob 'grob-property gprop @@ -492,8 +547,9 @@ respectively." 'pop-first #t)) (define-public (make-grob-property-override grob gprop val) - "Make a @code{Music} expression that overrides @var{gprop} to @var{val} -in @var{grob}." + "Make a @code{Music} expression that overrides @var{gprop} to +@var{val} in @var{grob}. This is a @code{\\temporary \\override}, +making it possible to @code{\\revert} to any previous value afterwards." (make-music 'OverrideProperty 'symbol grob 'grob-property gprop @@ -546,6 +602,14 @@ in @var{grob}." (Voice Slur direction ,DOWN)) general-grace-settings)) +;; Getting a unique context id name + +(define-session unique-counter -1) +(define-safe-public (get-next-unique-voice-name) + (set! unique-counter (1+ unique-counter)) + (format #f "uniqueContext~s" unique-counter)) + + (define-safe-public (make-voice-props-set n) (make-sequential-music (append @@ -575,18 +639,23 @@ in @var{grob}." (make-grob-property-revert 'NoteColumn 'horizontal-shift))))) -(define-safe-public (context-spec-music m context #:optional id) - "Add \\context CONTEXT = ID to M." +(define-safe-public (context-spec-music m context #:optional id mods) + "Add \\context @var{context} = @var{id} \\with @var{mods} to @var{m}." (let ((cm (make-music 'ContextSpeccedMusic 'element m 'context-type context))) (if (string? id) (set! (ly:music-property cm 'context-id) id)) + (if mods + (set! (ly:music-property cm 'property-operations) + (if (ly:context-mod? mods) + (ly:get-context-mods mods) + mods))) cm)) -(define-public (descend-to-context m context) +(define-safe-public (descend-to-context m context #:optional id mods) "Like @code{context-spec-music}, but only descending." - (let ((cm (context-spec-music m context))) + (let ((cm (context-spec-music m context id mods))) (ly:music-set-property! cm 'descend-only #t) cm)) @@ -635,9 +704,10 @@ in @var{grob}." (make-music 'PropertyUnset 'symbol sym)) -(define-safe-public (make-articulation name) - (make-music 'ArticulationEvent - 'articulation-type name)) +(define-safe-public (make-articulation name . properties) + (apply make-music 'ArticulationEvent + 'articulation-type name + properties)) (define-public (make-lyric-event string duration) (make-music 'LyricEvent @@ -707,14 +777,7 @@ duration is replaced with the specified @var{duration}." ;; articulations on individual events since they can't actually get ;; into a repeat chord given its input syntax. - (define (keep-element? m) - (any (lambda (t) (music-is-of-type? m t)) - event-types)) - (define origin (ly:music-property repeat-chord 'origin #f)) - (define (set-origin! l) - (if origin - (for-each (lambda (m) (set! (ly:music-property m 'origin) origin)) l)) - l) + (define keep-element? (music-type-predicate event-types)) (for-each (lambda (field) @@ -728,18 +791,23 @@ duration is replaced with the specified @var{duration}." ;; now treat the elements (set! (ly:music-property repeat-chord 'elements) (let ((elts - (set-origin! (ly:music-deep-copy - (filter keep-element? - (ly:music-property original-chord - 'elements)))))) + (ly:music-deep-copy (filter keep-element? + (ly:music-property original-chord + 'elements)) + repeat-chord))) (for-each (lambda (m) (let ((arts (ly:music-property m 'articulations))) (if (pair? arts) (set! (ly:music-property m 'articulations) - (set-origin! (filter! keep-element? arts)))) + (ly:set-origin! (filter! keep-element? arts) + repeat-chord))) (if (ly:duration? (ly:music-property m 'duration)) - (set! (ly:music-property m 'duration) duration)))) + (set! (ly:music-property m 'duration) duration)) + (if (ly:music-property m 'cautionary #f) + (set! (ly:music-property m 'cautionary) #f)) + (if (ly:music-property m 'force-accidental #f) + (set! (ly:music-property m 'force-accidental) #f)))) elts) (append! elts (ly:music-property repeat-chord 'elements)))) (let ((arts (filter keep-element? @@ -748,7 +816,7 @@ duration is replaced with the specified @var{duration}." (if (pair? arts) (set! (ly:music-property repeat-chord 'articulations) (append! - (set-origin! (ly:music-deep-copy arts)) + (ly:music-deep-copy arts repeat-chord) (ly:music-property repeat-chord 'articulations))))) repeat-chord) @@ -778,6 +846,76 @@ respective predecessor chord." (ly:music-property music 'elements))))) music) +;;; This does _not_ copy any articulations. Rationale: one main +;;; incentive for pitch-repeating durations is after ties, such that +;;; 4~2~8. can stand in for a 15/16 note in \partial 4 position. In +;;; this use case, any repeated articulations will be a nuisance. +;;; +;;; String assignments in TabStaff might seem like a worthwhile +;;; exception, but they would be better tackled by the respective +;;; engravers themselves (see issue 3662). +;;; +;;; Repeating chords as well seems problematic for things like +;;; \score { +;;; << +;;; \new Staff { c4 c c } +;;; \new RhythmicStaff { 4 4 4 4 } +;;; >> +;;; } +;;; +;;; However, because of MIDI it is not advisable to use RhythmicStaff +;;; without any initial pitch/drum-type. For music functions taking +;;; pure rhythms as an argument, the running of expand-repeat-notes! +;;; at scorification time is irrelevant: at that point of time, the +;;; music function has already run. + +(define-public (expand-repeat-notes! music) + "Walks through @var{music} and gives pitchless notes (not having a +pitch in code{pitch} or a drum type in @code{drum-type}) the pitch(es) +from the predecessor note/chord if available." + (let ((last-pitch #f)) + (map-some-music + (lambda (m) + (define (set-and-ret last) + (set! last-pitch last) + m) + (cond + ((music-is-of-type? m 'event-chord) + (if (any (lambda (m) (music-is-of-type? m 'rhythmic-event)) + (ly:music-property m 'elements)) + (set! last-pitch m)) + m) + ((music-is-of-type? m 'note-event) + (cond + ((or (ly:music-property m 'pitch #f) + (ly:music-property m 'drum-type #f)) + => set-and-ret) + ;; ok, naked rhythm. Go through the various cases of + ;; last-pitch + ;; nothing available: just keep as-is + ((not last-pitch) m) + ((ly:pitch? last-pitch) + (set! (ly:music-property m 'pitch) last-pitch) + m) + ((symbol? last-pitch) + (set! (ly:music-property m 'drum-type) last-pitch) + m) + ;; Ok, this is the big bad one: the reference is a chord. + ;; For now, we use the repeat chord logic. That's not + ;; really efficient as cleaning out all articulations is + ;; quite simpler than what copy-repeat-chord does. + (else + (copy-repeat-chord last-pitch + (make-music 'EventChord + 'elements + (ly:music-property m 'articulations) + 'origin + (ly:music-property m 'origin)) + (ly:music-property m 'duration) + '(rhythmic-event))))) + (else #f))) + music))) + ;;; splitting chords into voices. (define (voicify-list lst number) "Make a list of Musics. @@ -827,17 +965,19 @@ NUMBER is 0-base, i.e., Voice=1 (upstems) has number 0. (lambda (elt) (grob::has-interface elt symbol))) -(define-public ((outputproperty-compatibility func sym val) grob g-context ao-context) +(define ((outputproperty-compatibility func sym val) grob g-context ao-context) (if (func grob) (set! (ly:grob-property grob sym) val))) +(export outputproperty-compatibility) -(define-public ((set-output-property grob-name symbol val) grob grob-c context) +(define ((set-output-property grob-name symbol val) grob grob-c context) "Usage example: @code{\\applyoutput #(set-output-property 'Clef 'extra-offset '(0 . 1))}" (let ((meta (ly:grob-property grob 'meta))) (if (equal? (assoc-get 'name meta) grob-name) (set! (ly:grob-property grob symbol) val)))) +(export set-output-property) (define-public (skip->rest mus) @@ -849,9 +989,6 @@ NUMBER is 0-base, i.e., Voice=1 (upstems) has number 0. mus)) -(define-public (music-has-type music type) - (memq type (ly:music-property music 'types))) - (define-public (music-clone music . music-properties) "Clone @var{music} and set properties according to @var{music-properties}, a list of alternating property symbols and @@ -963,10 +1100,9 @@ actually fully cloned." (defmacro-public def-grace-function (start stop . docstring) "Helper macro for defining grace music" - `(define-music-function (parser location music) (ly:music?) + `(define-music-function (music) (ly:music?) ,@docstring (make-music 'GraceMusic - 'origin location 'element (make-music 'SequentialMusic 'elements (list (ly:music-deep-copy ,start) music @@ -975,7 +1111,7 @@ actually fully cloned." (defmacro-public define-syntax-function (type args signature . body) "Helper macro for `ly:make-music-function'. Syntax: - (define-syntax-function result-type? (parser location arg1 arg2 ...) (arg1-type arg2-type ...) + (define-syntax-function result-type? (arg1 arg2 ...) (arg1-type arg2-type ...) ...function body...) argX-type can take one of the forms @code{predicate?} for mandatory @@ -986,29 +1122,32 @@ value (evaluated at definition time). An optional parameter can be omitted in a call only when it can't get confused with a following parameter of different type. -Predicates with syntactical significance are @code{ly:pitch?}, -@code{ly:duration?}, @code{ly:music?}, @code{markup?}. Other -predicates require the parameter to be entered as Scheme expression. - @code{result-type?} can specify a default in the same manner as predicates, to be used in case of a type error in arguments or result." + (define (has-parser/location? arg where) + (let loop ((arg arg)) + (if (list? arg) + (any loop arg) + (memq arg where)))) (define (currying-lambda args doc-string? body) (if (and (pair? args) (pair? (car args))) (currying-lambda (car args) doc-string? `((lambda ,(cdr args) ,@body))) - (if doc-string? - `(lambda ,args ,doc-string? ,@body) - `(lambda ,args ,@body)))) - - (set! signature (map (lambda (pred) - (if (pair? pred) - `(cons ,(car pred) - ,(and (pair? (cdr pred)) (cadr pred))) - pred)) - (cons type signature))) + (let* ((compatibility? (if (list? args) + (= (length args) (+ 2 (length signature))) + (and (pair? args) (pair? (cdr args)) + (eq? (car args) 'parser)))) + (realargs (if compatibility? (cddr args) args))) + `(lambda ,realargs + ,(format #f "~a\n~a" realargs (or doc-string? "")) + ,@(if (and compatibility? + (has-parser/location? body (take args 2))) + `((let ((,(car args) (*parser*)) (,(cadr args) (*location*))) + ,@body)) + body))))) (let ((docstring (and (pair? body) (pair? (cdr body)) @@ -1023,13 +1162,18 @@ result." ;; When the music function definition contains an i10n doc string, ;; (_i "doc string"), keep the literal string only `(ly:make-music-function - (list ,@signature) + (list ,@(map (lambda (pred) + (if (pair? pred) + `(cons ,(car pred) + ,(and (pair? (cdr pred)) (cadr pred))) + pred)) + (cons type signature))) ,(currying-lambda args docstring (if docstring (cdr body) body))))) (defmacro-public define-music-function rest "Defining macro returning music functions. Syntax: - (define-music-function (parser location arg1 arg2 ...) (arg1-type? arg2-type? ...) + (define-music-function (arg1 arg2 ...) (arg1-type? arg2-type? ...) ...function body...) argX-type can take one of the forms @code{predicate?} for mandatory @@ -1040,10 +1184,6 @@ value (evaluated at definition time). An optional parameter can be omitted in a call only when it can't get confused with a following parameter of different type. -Predicates with syntactical significance are @code{ly:pitch?}, -@code{ly:duration?}, @code{ly:music?}, @code{markup?}. Other -predicates require the parameter to be entered as Scheme expression. - Must return a music expression. The @code{origin} is automatically set to the @code{location} parameter." @@ -1053,7 +1193,7 @@ set to the @code{location} parameter." (defmacro-public define-scheme-function rest "Defining macro returning Scheme functions. Syntax: - (define-scheme-function (parser location arg1 arg2 ...) (arg1-type? arg2-type? ...) + (define-scheme-function (arg1 arg2 ...) (arg1-type? arg2-type? ...) ...function body...) argX-type can take one of the forms @code{predicate?} for mandatory @@ -1064,10 +1204,6 @@ value (evaluated at definition time). An optional parameter can be omitted in a call only when it can't get confused with a following parameter of different type. -Predicates with syntactical significance are @code{ly:pitch?}, -@code{ly:duration?}, @code{ly:music?}, @code{markup?}. Other -predicates require the parameter to be entered as Scheme expression. - Can return arbitrary expressions. If a music expression is returned, its @code{origin} is automatically set to the @code{location} parameter." @@ -1085,7 +1221,7 @@ the return value." (defmacro-public define-event-function rest "Defining macro returning event functions. Syntax: - (define-event-function (parser location arg1 arg2 ...) (arg1-type? arg2-type? ...) + (define-event-function (arg1 arg2 ...) (arg1-type? arg2-type? ...) ...function body...) argX-type can take one of the forms @code{predicate?} for mandatory @@ -1096,10 +1232,6 @@ value (evaluated at definition time). An optional parameter can be omitted in a call only when it can't get confused with a following parameter of different type. -Predicates with syntactical significance are @code{ly:pitch?}, -@code{ly:duration?}, @code{ly:music?}, @code{markup?}. Other -predicates require the parameter to be entered as Scheme expression. - Must return an event expression. The @code{origin} is automatically set to the @code{location} parameter." @@ -1150,7 +1282,7 @@ set to the @code{location} parameter." (and clef (make-cue-clef-unset)))))) quote-music)) -(define-public ((quote-substitute quote-tab) music) +(define ((quote-substitute quote-tab) music) (let* ((quoted-name (ly:music-property music 'quoted-music-name)) (quoted-vector (and (string? quoted-name) (hash-ref quote-tab quoted-name #f)))) @@ -1164,6 +1296,7 @@ set to the @code{location} parameter." ly:quote-iterator::constructor)) (ly:music-warning music (ly:format (_ "cannot find quoted music: `~S'") quoted-name)))) music)) +(export quote-substitute) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1214,7 +1347,7 @@ then revert skipTypesetting." (context-spec-music (make-property-set 'skipTypesetting (not bool)) 'Score)))) -(define (skip-as-needed music parser) +(define (skip-as-needed music) "Replace MUSIC by << { \\set skipTypesetting = ##f LENGTHOF(\\showFirstLength) @@ -1227,8 +1360,8 @@ then revert skipTypesetting." the 'length property of the music is overridden to speed up compiling." (let* - ((show-last (ly:parser-lookup parser 'showLastLength)) - (show-first (ly:parser-lookup parser 'showFirstLength)) + ((show-last (ly:parser-lookup 'showLastLength)) + (show-first (ly:parser-lookup 'showFirstLength)) (show-last-length (and (ly:music? show-last) (ly:music-length show-last))) (show-first-length (and (ly:music? show-first) @@ -1278,23 +1411,21 @@ then revert skipTypesetting." (define-session-public toplevel-music-functions (list - (lambda (music parser) (expand-repeat-chords! - (cons 'rhythmic-event - (ly:parser-lookup parser '$chord-repeat-events)) - music)) - (lambda (music parser) (voicify-music music)) - (lambda (x parser) (music-map music-check-error x)) - (lambda (x parser) (music-map precompute-music-length x)) - (lambda (music parser) - - (music-map (quote-substitute (ly:parser-lookup parser 'musicQuotes)) music)) + (lambda (music) (expand-repeat-chords! + (cons 'rhythmic-event + (ly:parser-lookup '$chord-repeat-events)) + music)) + expand-repeat-notes! + voicify-music + (lambda (x) (music-map music-check-error x)) + (lambda (x) (music-map precompute-music-length x)) + (lambda (music) + (music-map (quote-substitute (ly:parser-lookup 'musicQuotes)) music)) ;; switch-on-debugging - (lambda (x parser) (music-map cue-substitute x)) + (lambda (x) (music-map cue-substitute x)) - (lambda (x parser) - (skip-as-needed x parser) - ))) + skip-as-needed)) ;;;;;;;;;; ;;; general purpose music functions @@ -1349,22 +1480,25 @@ Returns @code{#f} or the reason for the invalidation, a symbol." (car alteration-def)) (else 0))) -(define (check-pitch-against-signature context pitch barnum laziness octaveness) +(define (check-pitch-against-signature context pitch barnum laziness octaveness all-naturals) "Checks the need for an accidental and a @q{restore} accidental against -@code{localKeySignature}. The @var{laziness} is the number of measures +@code{localAlterations} and @code{keyAlterations}. +The @var{laziness} is the number of measures for which reminder accidentals are used (i.e., if @var{laziness} is zero, only cancel accidentals in the same measure; if @var{laziness} is three, we cancel accidentals up to three measures after they first appear. @var{octaveness} is either @code{'same-octave} or @code{'any-octave} and -specifies whether accidentals should be canceled in different octaves." +specifies whether accidentals should be canceled in different octaves. +If @var{all-naturals} is ##t, notes that do not occur in @code{keyAlterations} +also get an accidental." (let* ((ignore-octave (cond ((equal? octaveness 'any-octave) #t) ((equal? octaveness 'same-octave) #f) (else (ly:warning (_ "Unknown octaveness type: ~S ") octaveness) (ly:warning (_ "Defaulting to 'any-octave.")) #t))) - (key-sig (ly:context-property context 'keySignature)) - (local-key-sig (ly:context-property context 'localKeySignature)) + (key (ly:context-property context 'keyAlterations)) + (local (ly:context-property context 'localAlterations)) (notename (ly:pitch-notename pitch)) (octave (ly:pitch-octave pitch)) (pitch-handle (cons octave notename)) @@ -1372,17 +1506,17 @@ specifies whether accidentals should be canceled in different octaves." (need-accidental #f) (previous-alteration #f) (from-other-octaves #f) - (from-same-octave (assoc-get pitch-handle local-key-sig)) - (from-key-sig (or (assoc-get notename local-key-sig) + (from-same-octave (assoc-get pitch-handle local)) + (from-key-sig (or (assoc-get notename local) - ;; If no key signature match is found from localKeySignature, we may have a custom + ;; If no notename match is found from localAlterations, we may have a custom ;; type with octave-specific entries of the form ((octave . pitch) alteration) ;; instead of (pitch . alteration). Since this type cannot coexist with entries in - ;; localKeySignature, try extracting from keySignature instead. - (assoc-get pitch-handle key-sig)))) + ;; localAlterations, try extracting from keyAlterations instead. + (assoc-get pitch-handle key)))) - ;; loop through localKeySignature to search for a notename match from other octaves - (let loop ((l local-key-sig)) + ;; loop through localAlterations to search for a notename match from other octaves + (let loop ((l local)) (if (pair? l) (let ((entry (car l))) (if (and (pair? (car entry)) @@ -1414,7 +1548,7 @@ specifies whether accidentals should be canceled in different octaves." (let* ((prev-alt (extract-alteration previous-alteration)) (this-alt (ly:pitch-alteration pitch))) - (if (not (= this-alt prev-alt)) + (if (or (and all-naturals (eq? #f previous-alteration)) (not (= this-alt prev-alt))) (begin (set! need-accidental #t) (if (and (not (= this-alt 0)) @@ -1424,7 +1558,7 @@ specifies whether accidentals should be canceled in different octaves." (cons need-restore need-accidental))) -(define-public ((make-accidental-rule octaveness laziness) context pitch barnum measurepos) +(define ((make-accidental-rule octaveness laziness) context pitch barnum measurepos) "Create an accidental rule that makes its decision based on the octave of the note and a laziness value. @@ -1441,10 +1575,18 @@ is, to the end of current measure. A positive integer means that the accidental lasts over that many bar lines. @w{@code{-1}} is `forget immediately', that is, only look at key signature. @code{#t} is `forever'." - (check-pitch-against-signature context pitch barnum laziness octaveness)) + (check-pitch-against-signature context pitch barnum laziness octaveness #f)) +(export make-accidental-rule) + +(define ((make-accidental-dodecaphonic-rule octaveness laziness) context pitch barnum measurepos) + "Variation on function make-accidental-rule that creates an dodecaphonic +accidental rule." + + (check-pitch-against-signature context pitch barnum laziness octaveness #t)) +(export make-accidental-dodecaphonic-rule) (define (key-entry-notename entry) - "Return the pitch of an @var{entry} in @code{localKeySignature}. + "Return the pitch of an @var{entry} in @code{localAlterations}. The @samp{car} of the entry is either of the form @code{notename} or of the form @code{(octave . notename)}. The latter form is used for special key signatures or to indicate an explicit accidental. @@ -1458,25 +1600,25 @@ an accidental in music." (car entry))) (define (key-entry-octave entry) - "Return the octave of an entry in @code{localKeySignature} + "Return the octave of an entry in @code{localAlterations} or @code{#f} if the entry does not have an octave. See @code{key-entry-notename} for details." (and (pair? (car entry)) (caar entry))) (define (key-entry-bar-number entry) - "Return the bar number of an entry in @code{localKeySignature} + "Return the bar number of an entry in @code{localAlterations} or @code {#f} if the entry does not have a bar number. See @code{key-entry-notename} for details." (and (pair? (cdr entry)) (caddr entry))) (define (key-entry-measure-position entry) - "Return the measure position of an entry in @code{localKeySignature} + "Return the measure position of an entry in @code{localAlterations} or @code {#f} if the entry does not have a measure position. See @code{key-entry-notename} for details." (and (pair? (cdr entry)) (cdddr entry))) (define (key-entry-alteration entry) - "Return the alteration of an entry in localKeySignature. + "Return the alteration of an entry in localAlterations For convenience, returns @code{0} if entry is @code{#f}." (if entry @@ -1486,7 +1628,8 @@ For convenience, returns @code{0} if entry is @code{#f}." 0)) (define-public (find-pitch-entry keysig pitch accept-global accept-local) - "Return the first entry in @var{keysig} that matches @var{pitch}. + "Return the first entry in @var{keysig} that matches @var{pitch} +by notename and octave. Alteration is not considered. @var{accept-global} states whether key signature entries should be included. @var{accept-local} states whether local accidentals should be included. If no matching entry is found, @var{#f} is returned." @@ -1509,7 +1652,7 @@ If no matching entry is found, @var{#f} is returned." key signature @emph{and} does not directly follow a note on the same staff line. This rule should not be used alone because it does neither look at bar lines nor different accidentals at the same note name." - (let* ((keysig (ly:context-property context 'localKeySignature)) + (let* ((keysig (ly:context-property context 'localAlterations)) (entry (find-pitch-entry keysig pitch #t #t))) (if (not entry) (cons #f #f) @@ -1521,206 +1664,226 @@ look at bar lines nor different accidentals at the same note name." (cons #f (not (or (equal? acc key-acc) (and (equal? entrybn barnum) (equal? entrymp measurepos))))))))) +(define-public (dodecaphonic-no-repeat-rule context pitch barnum measurepos) + "An accidental rule that typesets an accidental before every +note (just as in the dodecaphonic accidental style) @emph{except} if +the note is immediately preceded by a note with the same pitch. This +is a common accidental style in contemporary notation." + (let* ((keysig (ly:context-property context 'localAlterations)) + (entry (find-pitch-entry keysig pitch #f #t))) + (if (not entry) + (cons #f #t) + (let ((entrymp (key-entry-measure-position entry)) + (entrybn (key-entry-bar-number entry)) + (entryalt (key-entry-alteration entry)) + (alt (ly:pitch-alteration pitch))) + (cons #t + (not (and (equal? entrybn barnum) + (or (equal? measurepos entrymp) + (ly:moment= (length siblings) 2) (helper siblings arg) (car arg)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; measure counter - -(define (measure-counter-stencil grob) - "Print a number for a measure count. The number is centered using -the extents of @code{BreakAlignment} grobs associated with -@code{NonMusicalPaperColumn} grobs. In the case of an unbroken measure, these -columns are the left and right bounds of a @code{MeasureCounter} spanner. -Broken measures are numbered in parentheses." - (let* ((orig (ly:grob-original grob)) - (siblings (ly:spanner-broken-into orig)) ; have we been split? - (bounds (ly:grob-array->list (ly:grob-object grob 'columns))) - (refp (ly:grob-system grob)) - ;; we use the first and/or last NonMusicalPaperColumn grob(s) of - ;; a system in the event that a MeasureCounter spanner is broken - (all-cols (ly:grob-array->list (ly:grob-object refp 'columns))) - (all-cols - (filter - (lambda (col) (eq? #t (ly:grob-property col 'non-musical))) - all-cols)) - (left-bound - (if (or (null? siblings) ; spanner is unbroken - (eq? grob (car siblings))) ; or the first piece - (car bounds) - (car all-cols))) - (right-bound - (if (or (null? siblings) - (eq? grob (car (reverse siblings)))) - (car (reverse bounds)) - (car (reverse all-cols)))) - (elts-L (ly:grob-array->list (ly:grob-object left-bound 'elements))) - (elts-R (ly:grob-array->list (ly:grob-object right-bound 'elements))) - (break-alignment-L - (filter - (lambda (elt) (grob::has-interface elt 'break-alignment-interface)) - elts-L)) - (break-alignment-R - (filter - (lambda (elt) (grob::has-interface elt 'break-alignment-interface)) - elts-R)) - (break-alignment-L-ext (ly:grob-extent (car break-alignment-L) refp X)) - (break-alignment-R-ext (ly:grob-extent (car break-alignment-R) refp X)) - (num (markup (number->string (ly:grob-property grob 'count-from)))) - (num - (if (or (null? siblings) - (eq? grob (car siblings))) - num - (make-parenthesize-markup num))) - (num (grob-interpret-markup grob num)) - (num (ly:stencil-aligned-to num X (ly:grob-property grob 'self-alignment-X))) - (num - (ly:stencil-translate-axis - num - (+ (interval-length break-alignment-L-ext) - (* 0.5 - (- (car break-alignment-R-ext) - (cdr break-alignment-L-ext)))) - X))) - num)) +(export value-for-spanner-piece) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; The following are used by the \offset function @@ -2205,33 +2316,62 @@ list or if there is a type-mismatch, @var{arg} will be returned." arg offsets)) (else arg))) +(define-public (grob-transformer property func) + "Create an override value good for applying @var{func} to either +pure or unpure values. @var{func} is called with the respective grob +as first argument and the default value (after resolving all callbacks) +as the second." + (define (worker self container-part grob . rest) + (let* ((immutable (ly:grob-basic-properties grob)) + ;; We need to search the basic-properties alist for our + ;; property to obtain values to offset. Our search is + ;; complicated by the fact that calling the music function + ;; `offset' as an override conses a pair to the head of the + ;; alist. This pair must be discounted. The closure it + ;; contains is named `self' so it can be easily recognized. + ;; If `offset' is called as a tweak, the basic-property + ;; alist is unaffected. + (target (find-value-to-offset property self immutable)) + ;; if target is a procedure, we need to apply it to our + ;; grob to calculate values to offset. + (vals (cond ((procedure? target) (target grob)) + ;; Argument lists for a pure procedure pulled + ;; from an unpure-pure-container may be + ;; different from a normal procedure, so we + ;; need a different code path and calling + ;; convention for procedures pulled from an + ;; container as opposed to from the property + ((ly:unpure-pure-container? target) + (let ((part (container-part target))) + (if (procedure? part) + (apply part grob rest) + part))) + (else target)))) + (func grob vals))) + ;; return the container named `self'. The container self-reference + ;; seems like chasing its own tail but gets dissolved by + ;; define/lambda separating binding and referencing of "self". + (define self (ly:make-unpure-pure-container + (lambda (grob) + (worker self ly:unpure-pure-container-unpure-part grob)) + (lambda (grob . rest) + (apply worker self ly:unpure-pure-container-pure-part + grob rest)))) + self) + (define-public (offsetter property offsets) "Apply @var{offsets} to the default values of @var{property} of @var{grob}. Offsets are restricted to immutable properties and values of type @code{number}, @code{number-pair}, or @code{number-pair-list}." - (define (self grob) - (let* ((immutable (ly:grob-basic-properties grob)) - ; We need to search the basic-properties alist for our property to - ; obtain values to offset. Our search is complicated by the fact that - ; calling the music function `offset' as an override conses a pair to - ; the head of the alist. This pair must be discounted. The closure it - ; contains is named `self' so it can be easily recognized. If `offset' - ; is called as a tweak, the basic-property alist is unaffected. - (target (find-value-to-offset property self immutable)) - ; if target is a procedure, we need to apply it to our grob to calculate - ; values to offset. - (vals - (if (procedure? target) - (target grob) - target)) - (can-type-be-offset? - (or (number? vals) - (number-pair? vals) - (number-pair-list? vals)))) - + (define (offset-fun grob vals) + (let ((can-type-be-offset? + (or (number? vals) + (number-pair? vals) + (number-pair-list? vals)))) (if can-type-be-offset? - ; '(+inf.0 . -inf.0) would offset to itself. This will be confusing to a - ; user unaware of the default value of the property, so issue a warning. + ;; '(+inf.0 . -inf.0) would offset to itself. This will be + ;; confusing to a user unaware of the default value of the + ;; property, so issue a warning. (if (equal? empty-interval vals) (ly:warning "default '~a of ~a is ~a and can't be offset" property grob vals) @@ -2241,8 +2381,8 @@ Offsets are restricted to immutable properties and values of type @code{number}, (ly:spanner-broken-into orig) '())) (total-found (length siblings)) - ; Since there is some flexibility in input syntax, - ; structure of `offsets' is normalized. + ;; Since there is some flexibility in input + ;; syntax, structure of `offsets' is normalized. (offsets (if (or (not (pair? offsets)) (number-pair? offsets) @@ -2252,7 +2392,7 @@ Offsets are restricted to immutable properties and values of type @code{number}, offsets))) (define (helper sibs offs) - ; apply offsets to the siblings of broken spanners + ;; apply offsets to the siblings of broken spanners (if (pair? offs) (if (eq? (car sibs) grob) (offset-multiple-types vals (car offs)) @@ -2263,8 +2403,279 @@ Offsets are restricted to immutable properties and values of type @code{number}, (helper siblings offsets) (offset-multiple-types vals (car offsets))))) - (begin - (ly:warning "the property '~a of ~a cannot be offset" property grob) - vals)))) - ; return the closure named `self' - self) + (begin + (ly:warning "the property '~a of ~a cannot be offset" property grob) + vals)))) + (grob-transformer property offset-fun)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; \magnifyMusic and \magnifyStaff + +;; defined as a function instead of a list because the +;; all-grob-descriptions alist is not available yet +(define-public (find-named-props prop-name grob-descriptions) + "Used by @code{\\magnifyMusic} and @code{\\magnifyStaff}. When +@var{grob-descriptions} is equal to the @code{all-grob-descriptions} +alist (defined in @file{scm/define-grobs.scm}), this will find all grobs +that can have a value for the @var{prop-name} property, and return them +as a list in the following format: +@example +'((grob prop-name) + (grob prop-name) + ...) +@end example" + (define (find-grobs-with-interface interface grob-descriptions) + (define (has-this-interface? grob-desc) + (let* ((meta (ly:assoc-get 'meta (cdr grob-desc))) + (interfaces (ly:assoc-get 'interfaces meta '()))) + (memq interface interfaces))) + (let* ((grob-descriptions-with-this-interface + (filter has-this-interface? grob-descriptions)) + (grob-names-with-this-interface + (map car grob-descriptions-with-this-interface))) + grob-names-with-this-interface)) + (let* ((interface + (case prop-name + ((baseline-skip word-space) 'text-interface) + ((space-alist) 'break-aligned-interface) + (else (ly:programming-error + "find-named-props: no interface associated with ~s" + prop-name)))) + (grobs-with-this-prop + (find-grobs-with-interface interface grob-descriptions))) + (map (lambda (x) (list x prop-name)) + grobs-with-this-prop))) + + +(define (magnifyStaff-is-set? context mag) + (let* ((Staff (ly:context-find context 'Staff)) + (old-mag (ly:context-property Staff 'magnifyStaffValue))) + (not (null? old-mag)))) + +(define (staff-magnification-is-changing? context mag) + (let* ((Staff (ly:context-find context 'Staff)) + (old-mag (ly:context-property Staff 'magnifyStaffValue 1))) + (not (= old-mag mag)))) + +(define-public (scale-fontSize func-name mag) + "Used by @code{\\magnifyMusic} and @code{\\magnifyStaff}. Look up the +current @code{fontSize} in the appropriate context and scale it by the +magnification factor @var{mag}. @var{func-name} is either +@code{'magnifyMusic} or @code{'magnifyStaff}." + (make-apply-context + (lambda (context) + (if (or (eq? func-name 'magnifyMusic) + ;; for \magnifyStaff, only scale the fontSize + ;; if staff magnification is changing + ;; and does not equal 1 + (and (staff-magnification-is-changing? context mag) + (not (= mag 1)))) + (let* ((where (case func-name + ((magnifyMusic) context) + ((magnifyStaff) (ly:context-find context 'Staff)))) + (fontSize (ly:context-property where 'fontSize 0)) + (new-fontSize (+ fontSize (magnification->font-size mag)))) + (ly:context-set-property! where 'fontSize new-fontSize)))))) + +(define-public (revert-fontSize func-name mag) + "Used by @code{\\magnifyMusic} and @code{\\magnifyStaff}. Calculate +the previous @code{fontSize} value (before scaling) by factoring out the +magnification factor @var{mag} (if @var{func-name} is +@code{'magnifyMusic}), or by factoring out the context property +@code{magnifyStaffValue} (if @var{func-name} is @code{'magnifyStaff}). +Revert the @code{fontSize} in the appropriate context accordingly. + +With @code{\\magnifyMusic}, the scaling is reverted after the music +block it operates on. @code{\\magnifyStaff} does not operate on a music +block, so the scaling from a previous call (if there is one) is reverted +before the new scaling takes effect." + (make-apply-context + (lambda (context) + (if (or (eq? func-name 'magnifyMusic) + ;; for \magnifyStaff... + (and + ;; don't revert the user's fontSize choice + ;; the first time \magnifyStaff is called + (magnifyStaff-is-set? context mag) + ;; only revert the previous fontSize + ;; if staff magnification is changing + (staff-magnification-is-changing? context mag))) + (let* ((where + (case func-name + ((magnifyMusic) context) + ((magnifyStaff) (ly:context-find context 'Staff)))) + (old-mag + (case func-name + ((magnifyMusic) mag) + ((magnifyStaff) + (ly:context-property where 'magnifyStaffValue 1)))) + (fontSize (ly:context-property where 'fontSize 0)) + (old-fontSize (- fontSize (magnification->font-size old-mag)))) + (ly:context-set-property! where 'fontSize old-fontSize)))))) + +(define-public (scale-props func-name mag allowed-to-shrink? props) + "Used by @code{\\magnifyMusic} and @code{\\magnifyStaff}. For each +prop in @var{props}, find the current value of the requested prop, scale +it by the magnification factor @var{mag}, and do the equivalent of a +@code{\\temporary@tie{}\\override} with the new value in the appropriate +context. If @var{allowed-to-shrink?} is @code{#f}, don't let the new +value be less than the current value. @var{func-name} is either +@code{'magnifyMusic} or @code{'magnifyStaff}. The @var{props} list is +formatted like: +@example +'((Stem thickness) + (Slur line-thickness) + ...) +@end example" + (make-apply-context + (lambda (context) + (define (scale-prop grob-prop-list) + (let* ((grob (car grob-prop-list)) + (prop (cadr grob-prop-list)) + (where (if (eq? grob 'SpacingSpanner) + (ly:context-find context 'Score) + (case func-name + ((magnifyMusic) context) + ((magnifyStaff) (ly:context-find context 'Staff))))) + (grob-def (ly:context-grob-definition where grob))) + (if (eq? prop 'space-alist) + (let* ((space-alist (ly:assoc-get prop grob-def)) + (scale-spacing-tuple (lambda (x) + (cons (car x) + (cons (cadr x) + (* mag (cddr x)))))) + (scaled-tuples (if space-alist + (map scale-spacing-tuple space-alist) + '())) + (new-alist (append scaled-tuples space-alist))) + (ly:context-pushpop-property where grob prop new-alist)) + (let* ((val (ly:assoc-get prop grob-def (case prop + ((baseline-skip) 3) + ((word-space) 0.6) + (else 1)))) + (proc (lambda (x) + (if allowed-to-shrink? + (* x mag) + (* x (max 1 mag))))) + (new-val (if (number-pair? val) + (cons (proc (car val)) + (proc (cdr val))) + (proc val)))) + (ly:context-pushpop-property where grob prop new-val))))) + (if (or (eq? func-name 'magnifyMusic) + ;; for \magnifyStaff, only scale the properties + ;; if staff magnification is changing + ;; and does not equal 1 + (and (staff-magnification-is-changing? context mag) + (not (= mag 1)))) + (for-each scale-prop props))))) + +(define-public (revert-props func-name mag props) + "Used by @code{\\magnifyMusic} and @code{\\magnifyStaff}. Revert each +prop in @var{props} in the appropriate context. @var{func-name} is +either @code{'magnifyMusic} or @code{'magnifyStaff}. The @var{props} +list is formatted like: +@example +'((Stem thickness) + (Slur line-thickness) + ...) +@end example" + (make-apply-context + (lambda (context) + (define (revert-prop grob-prop-list) + (let* ((grob (car grob-prop-list)) + (prop (cadr grob-prop-list)) + (where (if (eq? grob 'SpacingSpanner) + (ly:context-find context 'Score) + (case func-name + ((magnifyMusic) context) + ((magnifyStaff) (ly:context-find context 'Staff)))))) + (ly:context-pushpop-property where grob prop))) + (if (or (eq? func-name 'magnifyMusic) + ;; for \magnifyStaff... + (and + ;; don't revert the user's property overrides + ;; the first time \magnifyStaff is called + (magnifyStaff-is-set? context mag) + ;; revert the overrides from the previous \magnifyStaff, + ;; but only if staff magnification is changing + (staff-magnification-is-changing? context mag))) + (for-each revert-prop props))))) + +;; \magnifyMusic only +(define-public (scale-beam-thickness mag) + "Used by @code{\\magnifyMusic}. Scaling @code{Beam.beam-thickness} +exactly to the @var{mag} value will not work. This uses two reference +values for @code{beam-thickness} to determine an acceptable value when +scaling, then does the equivalent of a +@code{\\temporary@tie{}\\override} with the new value." + (make-apply-context + (lambda (context) + (let* ((grob-def (ly:context-grob-definition context 'Beam)) + (val (ly:assoc-get 'beam-thickness grob-def 0.48)) + (ratio-to-default (/ val 0.48)) + ;; gives beam-thickness=0.48 when mag=1 (like default), + ;; gives beam-thickness=0.35 when mag=0.63 (like CueVoice) + (scaled-default (+ 119/925 (* mag 13/37))) + (new-val (* scaled-default ratio-to-default))) + (ly:context-pushpop-property context 'Beam 'beam-thickness new-val))))) + +;; tag management +;; + +(define tag-groups (make-hash-table)) +(call-after-session (lambda () (hash-clear! tag-groups))) + +(define-public (define-tag-group tags) + "Define a tag-group consisting of the given @var{tags}, a@tie{}list +of symbols. Returns @code{#f} if successful, and an error message if +there is a conflicting tag group definition." + (cond ((not (symbol-list? tags)) (format #f (_ "not a symbol list: ~a") tags)) + ((any (lambda (tag) (hashq-ref tag-groups tag)) tags) + => (lambda (group) (and (not (lset= eq? group tags)) + (format #f (_ "conflicting tag group ~a") group)))) + (else + (for-each + (lambda (elt) (hashq-set! tag-groups elt tags)) + tags) + #f))) + +(define-public (tag-group-get tag) + "Return the tag group (as a list of symbols) that the given +@var{tag} symbol belongs to, @code{#f} if none." + (hashq-ref tag-groups tag)) + +(define-public (tags-remove-predicate tags) + "Returns a predicate that returns @code{#f} for any music that is to +be removed by @{\\removeWithTag} on the given symbol or list of +symbols @var{tags}." + (if (symbol? tags) + (lambda (m) + (not (memq tags (ly:music-property m 'tags)))) + (lambda (m) + (not (any (lambda (t) (memq t tags)) + (ly:music-property m 'tags)))))) + +(define-public (tags-keep-predicate tags) + "Returns a predicate that returns @code{#f} for any music that is to +be removed by @{\\keepWithTag} on the given symbol or list of symbols +@var{tags}." + (if (symbol? tags) + (let ((group (tag-group-get tags))) + (lambda (m) + (let ((music-tags (ly:music-property m 'tags))) + (or + (null? music-tags) ; redundant but very frequent + ;; We know of only one tag to keep. Either we find it in + ;; the music tags, or all music tags must be from a + ;; different group + (memq tags music-tags) + (not (any (lambda (t) (eq? (tag-group-get t) group)) music-tags)))))) + (let ((groups (delete-duplicates (map tag-group-get tags) eq?))) + (lambda (m) + (let ((music-tags (ly:music-property m 'tags))) + (or + (null? music-tags) ; redundant but very frequent + (any (lambda (t) (memq t tags)) music-tags) + ;; if no tag matches, no tag group should match either + (not (any (lambda (t) (memq (tag-group-get t) groups)) music-tags)))))))) diff --git a/scm/output-lib.scm b/scm/output-lib.scm index 02170918a1..733531c3c7 100644 --- a/scm/output-lib.scm +++ b/scm/output-lib.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 1998--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -26,6 +26,33 @@ (define-public (grob::is-live? grob) (pair? (ly:grob-basic-properties grob))) +(define-public (grob::name grob) + "Return the name of the grob @var{grob} as a symbol." + (assq-ref (ly:grob-property grob 'meta) 'name)) + +(define-public (grob::rhythmic-location grob) + "Return a pair consisting of the measure number and moment within + the measure of grob @var{grob}." + (let* (; all grobs support either spanner- or item-interface + (item (if (grob::has-interface grob 'spanner-interface) + (ly:spanner-bound grob LEFT) + grob)) + (col (ly:item-get-column item))) + (if (ly:grob? col) + (ly:grob-property col 'rhythmic-location) + '()))) + +(define-public (grob::when grob) + "Return the global timestep (a moment) of grob @var{grob}." + (let* (; all grobs support either spanner- or item-interface + (item (if (grob::has-interface grob 'spanner-interface) + (ly:spanner-bound grob LEFT) + grob)) + (col (ly:item-get-column item))) + (if (ly:grob? col) + (ly:grob-property col 'when) + '()))) + (define-public (make-stencil-boxer thickness padding callback) "Return function that adds a box around the grob passed as argument." (lambda (grob) @@ -103,6 +130,44 @@ line-thickness)) +(define (grob::objects-from-interface grob iface) + "For grob @var{grob} return the name and contents of all properties + within interface @var{iface} having type @code{ly:grob?} or + @code{ly:grob-array?}." + (let* ((iface-entry (hashq-ref (ly:all-grob-interfaces) iface)) + (props (if iface-entry (last iface-entry) '())) + (pointer-props + (filter + (lambda (prop) + (let ((type (object-property prop 'backend-type?))) + (or (eq? type ly:grob?) + (eq? type ly:grob-array?)))) + props))) + (if (null? pointer-props) + '() + (list iface + (map + (lambda (prop) (list prop (ly:grob-object grob prop))) + pointer-props))))) + +(define-public (grob::all-objects grob) + "Return a list of the names and contents of all properties having type + @code{ly:grob?} or @code{ly:grob-array?} for all interfaces supported by + grob @var{grob}." + (let loop ((ifaces (ly:grob-interfaces grob)) (result '())) + (if (null? ifaces) + (cons grob (list result)) + (let ((entry (grob::objects-from-interface grob (car ifaces)))) + (if (pair? entry) + (loop (cdr ifaces) (append result (list entry))) + (loop (cdr ifaces) result)))))) + +(use-modules (ice-9 pretty-print)) +(define-public (grob::display-objects grob) + "Display all objects stored in properties of grob @var{grob}." + (pretty-print (grob::all-objects grob)) + (newline)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; beam slope @@ -249,6 +314,14 @@ ly:self-alignment-interface::y-aligned-on-self ly:self-alignment-interface::pure-y-aligned-on-self)) +(define-public (self-alignment-interface::self-aligned-on-breakable grob) + "Return the @code{X-offset} that places @var{grob} according to its + @code{self-alignment-X} over the reference point defined by the + @code{break-align-anchor-alignment} of a @code{break-aligned} item + such as a @code{Clef}." + (+ (ly:break-alignable-interface::self-align-callback grob) + (ly:self-alignment-interface::x-aligned-on-self grob))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; staff symbol @@ -322,56 +395,64 @@ (define-public (select-head-glyph style log) "Select a note head glyph string based on note head style @var{style} and duration-log @var{log}." - (case style - ;; "default" style is directly handled in note-head.cc as a - ;; special case (HW says, mainly for performance reasons). - ;; Therefore, style "default" does not appear in this case - ;; statement. -- jr - ((xcircle) "2xcircle") - ((harmonic) "0harmonic") - ((harmonic-black) "2harmonic") - ((harmonic-mixed) (if (<= log 1) "0harmonic" - "2harmonic")) - ((baroque) - ;; Oops, I actually would not call this "baroque", but, for - ;; backwards compatibility to 1.4, this is supposed to take - ;; brevis, longa and maxima from the neo-mensural font and all - ;; other note heads from the default font. -- jr - (if (< log 0) - (string-append (number->string log) "neomensural") - (number->string log))) - ((altdefault) - ;; Like default, but brevis is drawn with double vertical lines - (if (= log -1) - (string-append (number->string log) "double") - (number->string log))) - ((mensural) - (string-append (number->string log) (symbol->string style))) - ((petrucci) - (if (< log 0) - (string-append (number->string log) "mensural") - (string-append (number->string log) (symbol->string style)))) - ((blackpetrucci) - (if (< log 0) - (string-append (number->string log) "blackmensural") - (string-append (number->string log) (symbol->string style)))) - ((semipetrucci) - (if (< log 0) - (string-append (number->string log) "semimensural") - (string-append (number->string log) "petrucci"))) - ((neomensural) - (string-append (number->string log) (symbol->string style))) - ((kievan) - (string-append (number->string log) "kievan")) - (else - (if (string-match "vaticana*|hufnagel*|medicaea*" (symbol->string style)) - (symbol->string style) - (string-append (number->string (max 0 log)) - (symbol->string style)))))) + (if (symbol? style) + (case style + ;; "default" style is directly handled in note-head.cc as a + ;; special case (HW says, mainly for performance reasons). + ;; Therefore, style "default" does not appear in this case + ;; statement. -- jr + ;; Though we not to care if style is '(), see below. -- harm + ((xcircle) "2xcircle") + ((harmonic) "0harmonic") + ((harmonic-black) "2harmonic") + ((harmonic-mixed) (if (<= log 1) "0harmonic" + "2harmonic")) + ((baroque) + ;; Oops, I actually would not call this "baroque", but, for + ;; backwards compatibility to 1.4, this is supposed to take + ;; brevis, longa and maxima from the neo-mensural font and all + ;; other note heads from the default font. -- jr + (if (< log 0) + (string-append (number->string log) "neomensural") + (number->string log))) + ((altdefault) + ;; Like default, but brevis is drawn with double vertical lines + (if (= log -1) + (string-append (number->string log) "double") + (number->string log))) + ((mensural) + (string-append (number->string log) (symbol->string style))) + ((petrucci) + (if (< log 0) + (string-append (number->string log) "mensural") + (string-append (number->string log) (symbol->string style)))) + ((blackpetrucci) + (if (< log 0) + (string-append (number->string log) "blackmensural") + (string-append (number->string log) (symbol->string style)))) + ((semipetrucci) + (if (< log 0) + (string-append (number->string log) "semimensural") + (string-append (number->string log) "petrucci"))) + ((neomensural) + (string-append (number->string log) (symbol->string style))) + ((kievan) + (string-append (number->string log) "kievan")) + (else + (if (string-match "vaticana*|hufnagel*|medicaea*" + (symbol->string style)) + (symbol->string style) + (string-append (number->string (max 0 log)) + (symbol->string style))))) + ;; 'vaticana-ligature-interface has a 'glyph-name-property for NoteHead. + ;; Probably best to return an empty list here, if called in a context + ;; without setting 'style, i.e. 'style is '(), to avoid a scheme-error. + '())) (define-public (note-head::calc-glyph-name grob) (let* ((style (ly:grob-property grob 'style)) - (log (if (string-match "kievan*" (symbol->string style)) + (log (if (and (symbol? style) + (string-match "kievan*" (symbol->string style))) (min 3 (ly:grob-property grob 'duration-log)) (min 2 (ly:grob-property grob 'duration-log))))) (select-head-glyph style log))) @@ -396,8 +477,8 @@ and duration-log @var{log}." 1.3) line-thickness)) (radius (/ (+ staff-space line-thickness) 2)) - (letter (markup #:center-align #:vcenter pitch-string)) - (filled-circle (markup #:draw-circle radius 0 #t))) + (letter (make-center-align-markup (make-vcenter-markup pitch-string))) + (filled-circle (make-draw-circle-markup radius 0 #t))) (ly:stencil-translate-axis (grob-interpret-markup @@ -562,34 +643,38 @@ and duration-log @var{log}." ;; a formatter function, which is simply a wrapper around an existing ;; tuplet formatter function. It takes the value returned by the given ;; function and appends a note of given length. -(define-public ((tuplet-number::append-note-wrapper function note) grob) - (let ((txt (if function (function grob) #f))) +(define ((tuplet-number::append-note-wrapper function note) grob) + (let ((txt (and function (function grob)))) (if txt - (markup txt #:fontsize -5 #:note note UP) - (markup #:fontsize -5 #:note note UP)))) + (make-line-markup + (list txt (make-fontsize-markup -5 (make-note-markup note UP)))) + (make-fontsize-markup -5 (make-note-markup note UP))))) +(export tuplet-number::append-note-wrapper) ;; Print a tuplet denominator with a different number than the one derived from ;; the actual tuplet fraction -(define-public ((tuplet-number::non-default-tuplet-denominator-text denominator) +(define ((tuplet-number::non-default-tuplet-denominator-text denominator) grob) (number->string (if denominator denominator (ly:event-property (event-cause grob) 'denominator)))) +(export tuplet-number::non-default-tuplet-denominator-text) ;; Print a tuplet fraction with different numbers than the ones derived from ;; the actual tuplet fraction -(define-public ((tuplet-number::non-default-tuplet-fraction-text +(define ((tuplet-number::non-default-tuplet-fraction-text denominator numerator) grob) (let* ((ev (event-cause grob)) (den (if denominator denominator (ly:event-property ev 'denominator))) (num (if numerator numerator (ly:event-property ev 'numerator)))) (format #f "~a:~a" den num))) +(export tuplet-number::non-default-tuplet-fraction-text) ;; Print a tuplet fraction with note durations appended to the numerator and the ;; denominator -(define-public ((tuplet-number::fraction-with-notes +(define ((tuplet-number::fraction-with-notes denominatornote numeratornote) grob) (let* ((ev (event-cause grob)) (denominator (ly:event-property ev 'denominator)) @@ -597,10 +682,11 @@ and duration-log @var{log}." ((tuplet-number::non-default-fraction-with-notes denominator denominatornote numerator numeratornote) grob))) +(export tuplet-number::fraction-with-notes) ;; Print a tuplet fraction with note durations appended to the numerator and the ;; denominator -(define-public ((tuplet-number::non-default-fraction-with-notes +(define ((tuplet-number::non-default-fraction-with-notes denominator denominatornote numerator numeratornote) grob) (let* ((ev (event-cause grob)) (den (if denominator denominator (ly:event-property ev 'denominator))) @@ -608,10 +694,11 @@ and duration-log @var{log}." (make-concat-markup (list (make-simple-markup (format #f "~a" den)) - (markup #:fontsize -5 #:note denominatornote UP) + (make-fontsize-markup -5 (make-note-markup denominatornote UP)) (make-simple-markup " : ") (make-simple-markup (format #f "~a" num)) - (markup #:fontsize -5 #:note numeratornote UP))))) + (make-fontsize-markup -5 (make-note-markup numeratornote UP)))))) +(export tuplet-number::non-default-fraction-with-notes) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -691,7 +778,7 @@ and duration-log @var{log}." ;; annotations (define-public (numbered-footnotes int) - (markup #:tiny (number->string (+ 1 int)))) + (make-tiny-markup (number->string (+ 1 int)))) (define-public (symbol-footnotes int) (define (helper symbols out idx n) @@ -701,10 +788,10 @@ and duration-log @var{log}." (string-append out (list-ref symbols idx)) idx (- n 1)))) - (markup #:tiny (helper '("*" "†" "‡" "§" "¶") - "" - (remainder int 5) - (+ 1 (quotient int 5))))) + (make-tiny-markup (helper '("*" "†" "‡" "§" "¶") + "" + (remainder int 5) + (+ 1 (quotient int 5))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; accidentals @@ -718,8 +805,7 @@ and duration-log @var{log}." (define-public accidental-interface::height (ly:make-unpure-pure-container - ly:accidental-interface::height - ly:accidental-interface::pure-height)) + ly:accidental-interface::height)) (define-public cancellation-glyph-name-alist '((0 . "accidentals.natural"))) @@ -802,8 +888,9 @@ and duration-log @var{log}." (ly:stencil-aligned-to (make-parenthesis-stencil y-extent half-thickness - (- width) - angularity) + width + angularity + -1) Y CENTER) X RIGHT)) (lp-x-extent @@ -813,7 +900,8 @@ and duration-log @var{log}." (make-parenthesis-stencil y-extent half-thickness width - angularity) + angularity + 1) Y CENTER) X LEFT)) (rp-x-extent @@ -824,15 +912,28 @@ and duration-log @var{log}." (set! rp (ly:make-stencil (ly:stencil-expr rp) rp-x-extent (ly:stencil-extent rp Y))) - (list (stencil-whiteout lp) - (stencil-whiteout rp)))) + (list (stencil-whiteout-box lp) + (stencil-whiteout-box rp)))) + +(define-public (parentheses-item::y-extent grob) (ly:grob::stencil-height grob)) (define (parenthesize-elements grob . rest) (let* ((refp (if (null? rest) grob (car rest))) - (elts (ly:grob-object grob 'elements)) - (x-ext (ly:relative-group-extent elts refp X)) + (elts (ly:grob-array->list (ly:grob-object grob 'elements))) + (get-friends + (lambda (g) + (let ((syms (ly:grob-property g 'parenthesis-friends '())) + (get-friend (lambda (s) + (let ((f (ly:grob-object g s))) + (cond + ((ly:grob? f) (list f)) + ((ly:grob-array? f) (ly:grob-array->list f)) + (else '())))))) + (apply append (map get-friend syms))))) + (friends (apply append elts (map get-friends elts))) + (x-ext (ly:relative-group-extent friends refp X)) (stencils (ly:grob-property grob 'stencils)) (lp (car stencils)) (rp (cadr stencils)) @@ -876,14 +977,53 @@ and duration-log @var{log}." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -(define-public (chain-grob-member-functions grob value . funcs) - (for-each - (lambda (func) - (set! value (func grob value))) - funcs) - - value) - +(define-public (grob::compose-function func data) + "This creates a callback entity to be stored in a grob property, +based on the grob property data @var{data} (which can be plain data, a +callback itself, or an unpure-pure-container). + +Function or unpure-pure-container @var{func} accepts a grob and a +value and returns another value. Depending on the type of @var{data}, +@var{func} is used for building a grob callback or an +unpure-pure-container." + (if (or (ly:unpure-pure-container? func) + (ly:unpure-pure-container? data)) + (ly:make-unpure-pure-container + (lambda (grob) (ly:unpure-call func grob (ly:unpure-call data grob))) + (lambda (grob start end) + (ly:pure-call func grob start end + (ly:pure-call data grob start end)))) + (lambda (grob) (ly:unpure-call func grob (ly:unpure-call data grob))))) + +(define*-public (grob::offset-function func data + #:optional (plus +)) + "This creates a callback entity to be stored in a grob property, +based on the grob property data @var{data} (which can be plain data, a +callback itself, or an unpure-pure-container). + +Function @var{func} accepts a grob and returns a value that is added +to the value resulting from @var{data}. Optional argument @var{plus} +defaults to @code{+} but may be changed to allow for using a different +underlying accumulation. + +If @var{data} is @code{#f} or @code{'()}, it is not included in the sum." + (cond ((or (not data) (null? data)) + func) + ((or (ly:unpure-pure-container? func) + (ly:unpure-pure-container? data)) + (ly:make-unpure-pure-container + (lambda rest + (plus (apply ly:unpure-call func rest) + (apply ly:unpure-call data rest))) + (lambda rest + (plus (apply ly:pure-call func rest) + (apply ly:pure-call data rest))))) + ((or (procedure? func) + (procedure? data)) + (lambda rest + (plus (apply ly:unpure-call func rest) + (apply ly:unpure-call data rest)))) + (else (plus func data)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; falls/doits @@ -912,8 +1052,8 @@ and duration-log @var{log}." (left-x (+ padding (max - (interval-end (ly:grob-robust-relative-extent - left-span common X)) + (interval-end (ly:generic-bound-extent + left-span common)) (if (and dots (close @@ -923,7 +1063,7 @@ and duration-log @var{log}." (ly:grob-robust-relative-extent dots common X)) (- INFINITY-INT))))) (right-x (max (- (interval-start - (ly:grob-robust-relative-extent right-span common X)) + (ly:generic-bound-extent right-span common)) padding) (+ left-x minimum-length))) (self-x (ly:grob-relative-coordinate spanner common X)) @@ -982,14 +1122,18 @@ and duration-log @var{log}." (define-public (string-number::calc-text grob) (let ((event (event-cause grob))) (or (ly:event-property event 'text #f) - (number->string (ly:event-property event 'string-number) 10)))) + (number-format + (ly:grob-property grob 'number-type) + (ly:event-property event 'string-number))))) (define-public (stroke-finger::calc-text grob) (let ((event (event-cause grob))) (or (ly:event-property event 'text #f) - (vector-ref (ly:grob-property grob 'digit-names) - (1- (max 1 - (min 5 (ly:event-property event 'digit)))))))) + (let ((digit-names (ly:grob-property grob 'digit-names))) + (vector-ref digit-names + (1- (max 1 + (min (vector-length digit-names) + (ly:event-property event 'digit))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1021,7 +1165,7 @@ between the two text elements." '(bound-details left padding) (+ my-padding script-padding))))))) -(define-public ((elbowed-hairpin coords mirrored?) grob) +(define ((elbowed-hairpin coords mirrored?) grob) "Create hairpin based on a list of @var{coords} in @code{(cons x y)} form. @code{x} is the portion of the width consumed for a given line and @code{y} is the portion of the height. For example, @@ -1080,6 +1224,7 @@ and draws the stencil based on its coordinates. (if mirrored? (my-c-p-s downlist thick decresc?) empty-stencil)) (cons xtrans ytrans))) '()))) +(export elbowed-hairpin) (define-public flared-hairpin (elbowed-hairpin '((0.95 . 0.4) (1.0 . 1.0)) #t)) @@ -1099,13 +1244,14 @@ and draws the stencil based on its coordinates. (make-tied-lyric-markup text) text)))) -(define-public ((grob::calc-property-by-copy prop) grob) +(define ((grob::calc-property-by-copy prop) grob) (ly:event-property (event-cause grob) prop)) +(export grob::calc-property-by-copy) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; general inheritance -(define-public ((grob::inherit-parent-property axis property . default) grob) +(define ((grob::inherit-parent-property axis property . default) grob) "@var{grob} callback generator for inheriting a @var{property} from an @var{axis} parent, defaulting to @var{default} if there is no parent or the parent has no setting." @@ -1115,6 +1261,7 @@ parent or the parent has no setting." (apply ly:grob-property parent property default)) ((pair? default) (car default)) (else '())))) +(export grob::inherit-parent-property) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; fret boards @@ -1139,17 +1286,31 @@ parent or the parent has no setting." (define-public (script-interface::calc-x-offset grob) (ly:grob-property grob 'positioning-done) - (let* ((shift (ly:grob-property grob 'toward-stem-shift 0.0)) + (let* ((shift-when-alone (ly:grob-property grob 'toward-stem-shift 0.0)) + (shift-in-column (ly:grob-property grob 'toward-stem-shift-in-column)) + (script-column (ly:grob-object grob 'script-column)) + (shift + (if (and (ly:grob? script-column) + (number? shift-in-column) + ;; ScriptColumn can contain grobs other than Script. + ;; These should not result in a shift. + (any (lambda (s) + (and (not (eq? s grob)) + (grob::has-interface s 'script-interface) + (not (grob::has-interface s + 'accidental-suggestion-interface)))) + (ly:grob-array->list + (ly:grob-object script-column 'scripts)))) + shift-in-column shift-when-alone)) (note-head-location - (ly:self-alignment-interface::centered-on-x-parent grob)) + (ly:self-alignment-interface::aligned-on-x-parent grob)) (note-head-grob (ly:grob-parent grob X)) (stem-grob (ly:grob-object note-head-grob 'stem))) (+ note-head-location - ;; If the property 'toward-stem-shift is defined and the script - ;; has the same direction as the stem, move the script accordingly. - ;; Since scripts can also be over skips, we need to check whether - ;; the grob has a stem at all. + ;; If the script has the same direction as the stem, move the script + ;; in accordance with the value of 'shift'. Since scripts can also be + ;; over skips, we need to check whether the grob has a stem at all. (if (ly:grob? stem-grob) (let ((dir1 (ly:grob-property grob 'direction)) (dir2 (ly:grob-property stem-grob 'direction))) @@ -1342,3 +1503,82 @@ parent or the parent has no setting." (larger (max (car edge-height) (cdr edge-height)))) (interval-union '(0 . 0) (cons smaller larger))) '(0 . 0)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; measure counter + +(define-public (measure-counter-stencil grob) + "Print a number for a measure count. The number is centered using +the extents of @code{BreakAlignment} grobs associated with the left and +right bounds of a @code{MeasureCounter} spanner. Broken measures are +numbered in parentheses." + (let* ((num (markup (number->string (ly:grob-property grob 'count-from)))) + (orig (ly:grob-original grob)) + (siblings (ly:spanner-broken-into orig)) ; have we been split? + (num + (if (or (null? siblings) + (eq? grob (car siblings))) + num + (make-parenthesize-markup num))) + (num (grob-interpret-markup grob num)) + (num (ly:stencil-aligned-to num X (ly:grob-property grob 'self-alignment-X))) + (left-bound (ly:spanner-bound grob LEFT)) + (right-bound (ly:spanner-bound grob RIGHT)) + (elts-L (ly:grob-array->list (ly:grob-object left-bound 'elements))) + (elts-R (ly:grob-array->list (ly:grob-object right-bound 'elements))) + (break-alignment-L + (filter + (lambda (elt) (grob::has-interface elt 'break-alignment-interface)) + elts-L)) + (break-alignment-R + (filter + (lambda (elt) (grob::has-interface elt 'break-alignment-interface)) + elts-R)) + (refp (ly:grob-system grob)) + (break-alignment-L-ext (ly:grob-extent (car break-alignment-L) refp X)) + (break-alignment-R-ext (ly:grob-extent (car break-alignment-R) refp X)) + (num + (ly:stencil-translate-axis + num + (+ (interval-length break-alignment-L-ext) + (* 0.5 + (- (car break-alignment-R-ext) + (cdr break-alignment-L-ext)))) + X))) + num)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; make-engraver helper macro + +(defmacro-public make-engraver forms + "Helper macro for creating Scheme engravers. + +The usual form for an engraver is an association list (or alist) +mapping symbols to either anonymous functions or to another such +alist. + +@code{make-engraver} accepts forms where the first element is either +an argument list starting with the respective symbol, followed by the +function body (comparable to the way @code{define} is used for +defining functions), or a single symbol followed by subordinate forms +in the same manner. You can also just make an alist pair +literally (the @samp{car} is quoted automatically) as long as the +unevaluated @samp{cdr} is not a pair. This is useful if you already +have defined your engraver functions separately. + +Symbols mapping to a function would be @code{initialize}, +@code{start-translation-timestep}, @code{process-music}, +@code{process-acknowledged}, @code{stop-translation-timestep}, and +@code{finalize}. Symbols mapping to another alist specified in the +same manner are @code{listeners} with the subordinate symbols being +event classes, and @code{acknowledgers} and @code{end-acknowledgers} +with the subordinate symbols being interfaces." + (let loop ((forms forms)) + (if (or (null? forms) (pair? forms)) + `(list + ,@(map (lambda (form) + (if (pair? (car form)) + `(cons ',(caar form) (lambda ,(cdar form) ,@(cdr form))) + `(cons ',(car form) ,(loop (cdr form))))) + forms)) + forms))) diff --git a/scm/output-ps.scm b/scm/output-ps.scm index 813211f060..70b13848e4 100644 --- a/scm/output-ps.scm +++ b/scm/output-ps.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 1998--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -117,28 +117,30 @@ size cid? w-x-y-named-glyphs) - (define (glyph-spec w h x y g) ; h not used (let ((prefix (if (string? g) "/" ""))) - (ly:format "~4f ~4f ~4f ~a~a" - w x y - prefix g))) - - (ly:format - (if cid? - "/~a /CIDFont findresource ~a output-scale div scalefont setfont -~a -~a print_glyphs" - - "/~a ~a output-scale div selectfont -~a -~a print_glyphs") - postscript-font-name - size - (string-join (map (lambda (x) (apply glyph-spec x)) - (reverse w-x-y-named-glyphs)) "\n") - (length w-x-y-named-glyphs))) - + (ly:format "~4f ~4f ~4f ~a~a" w x y prefix g))) + (define (emglyph-spec w h x y g) ; h not used + (if (and (= x 0) (= y 0)) + (ly:format "currentpoint ~a moveto ~4f 0 rmoveto" g w) + (ly:format "currentpoint ~4f ~4f rmoveto ~a moveto ~4f 0 rmoveto" x y g w))) + (if cid? + (ly:format + "/~a /CIDFont findresource ~a output-scale div scalefont setfont\n~a\n~a print_glyphs" + postscript-font-name size + (string-join (map (lambda (x) (apply glyph-spec x)) + (reverse w-x-y-named-glyphs)) "\n") + (length w-x-y-named-glyphs)) + (if (and (ly:bigpdfs) (string-startswith postscript-font-name "Emmentaler")) + (ly:format "/~a-O ~a output-scale div selectfont\n~a" + postscript-font-name size + (string-join (map (lambda (x) (apply emglyph-spec x)) + w-x-y-named-glyphs) "\n")) + (ly:format "/~a ~a output-scale div selectfont\n~a\n~a print_glyphs" + postscript-font-name size + (string-join (map (lambda (x) (apply glyph-spec x)) + (reverse w-x-y-named-glyphs)) "\n") + (length w-x-y-named-glyphs))))) (define (grob-cause offset grob) (if (ly:get-option 'point-and-click) @@ -183,9 +185,19 @@ "")) (define (named-glyph font glyph) - (ly:format "~a /~a glyphshow " ;;Why is there a space at the end? - (ps-font-command font) - glyph)) + (if (and (ly:bigpdfs) (string-startswith (ly:font-file-name font) "emmentaler")) + (if (string-endswith (ly:font-file-name font)"-brace") + (if (or (string-startswith glyph "brace1") (string-startswith glyph "brace2")) + (ly:format "~a ~a" (string-append (ps-font-command font) "-N" ) glyph) + (if (or (string-startswith glyph "brace3") (string-startswith glyph "brace4")) + (ly:format "~a ~a" (string-append (ps-font-command font) "-S" ) glyph) + (ly:format "~a ~a" (string-append (ps-font-command font) "-O" ) glyph))) + (if (string-startswith glyph "noteheads") + (ly:format "~a ~a" (string-append (ps-font-command font) "-N" ) glyph) + (if (or (string-startswith glyph "scripts") (string-startswith glyph "clefs")) + (ly:format "~a ~a" (string-append (ps-font-command font) "-S" ) glyph) + (ly:format "~a ~a" (string-append (ps-font-command font) "-O" ) glyph)))) + (ly:format "~a /~a glyphshow" (ps-font-command font) glyph))) (define (no-origin) "") @@ -283,15 +295,20 @@ (ly:warning (_ "unknown line-join-style: ~S") (symbol->string join)) 1))))) - (ly:format - "gsave currentpoint translate + (ly:format + "gsave currentpoint translate ~a setlinecap ~a setlinejoin ~a setlinewidth -~l gsave stroke grestore ~a grestore" - cap-numeric - join-numeric - thickness - (convert-path-exps exps) - (if fill? "fill" "")))) +~l ~a grestore" + cap-numeric + join-numeric + thickness + (convert-path-exps exps) + ;; print outline contour only if there is no fill or if + ;; contour is explicitly requested with a thickness > 0 + (cond ((not fill?) "stroke") + ((positive? thickness) "gsave stroke grestore fill") + (else "fill"))))) + (define (setscale x y) (ly:format "gsave ~4l scale\n" diff --git a/scm/output-svg.scm b/scm/output-svg.scm index cb9f598d3f..78bda3c35b 100644 --- a/scm/output-svg.scm +++ b/scm/output-svg.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2002--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2002--2015 Jan Nieuwenhuizen ;;;; Patrick McCarty ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -71,10 +71,10 @@ (string-append "\n")) (define-public (entity entity string . attributes-alist) - (if (equal? string "") + (if (string-null? string) (apply eoc entity attributes-alist) (string-append - (apply eo (cons entity attributes-alist)) string (ec entity)))) + (apply eo entity attributes-alist) string (ec entity)))) (define (offset->point o) (ly:format "~4f ~4f" (car o) (- (cdr o)))) @@ -83,7 +83,7 @@ (define (helper lst) (if (null? lst) '() - (cons (format #f "~S ~S" (car lst) (- (cadr lst))) + (cons (ly:format "~4f ~4f" (car lst) (- (cadr lst))) (helper (cddr lst))))) (string-join (helper lst) " ")) @@ -615,7 +615,7 @@ '(fill . "currentColor"))) (define (setcolor r g b) - (format #f "\n" + (ly:format "\n" (* 100 r) (* 100 g) (* 100 b))) ;; rotate around given point diff --git a/scm/page.scm b/scm/page.scm index f6bb29d701..c6e69658ce 100644 --- a/scm/page.scm +++ b/scm/page.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2006--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2006--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -82,16 +82,12 @@ (define (page-translate-systems page) (for-each - (lambda (sys-off) - (let* - ((sys (car sys-off)) - (off (cadr sys-off))) + (lambda (sys off) + (if (not (number? (ly:prob-property sys 'Y-offset))) + (ly:prob-set-property! sys 'Y-offset off))) - (if (not (number? (ly:prob-property sys 'Y-offset))) - (ly:prob-set-property! sys 'Y-offset off)))) - - (zip (page-property page 'lines) - (page-property page 'configuration)))) + (page-property page 'lines) + (page-property page 'configuration))) (define (annotate-top-space first-system layout header-stencil stencil) (let* ((top-margin (ly:output-def-lookup layout 'top-margin)) @@ -106,6 +102,7 @@ (ly:stencil-add stencil (ly:stencil-translate-axis (annotate-spacing-spec layout + (symbol->string sym) spacing-spec (- top-margin) (car header-extent) diff --git a/scm/paper-system.scm b/scm/paper-system.scm index e75440b968..9b8d97f34d 100644 --- a/scm/paper-system.scm +++ b/scm/paper-system.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2006--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2006--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -144,6 +144,11 @@ (after-Y (ly:grob-relative-coordinate after-staff grob Y))) (annotate-spacing-spec layout + ;; FIXME: Improve `ly:get-spacing-spec' to return the + ;; name of the used `XXX-XXX-spacing' property, if + ;; possible. Right now we have to use the empty + ;; string. + "" (ly:get-spacing-spec before-staff after-staff) before-Y after-Y)))) @@ -188,21 +193,22 @@ #f) #f)) - (spacing-spec (cond ((and next-system - (paper-system-title? system) - (paper-system-title? next-system)) - (ly:output-def-lookup layout 'markup-markup-spacing)) - ((paper-system-title? system) - (ly:output-def-lookup layout 'markup-system-spacing)) - ((and next-system - (paper-system-title? next-system)) - (ly:output-def-lookup layout 'score-markup-spacing)) - ((not next-system) - (ly:output-def-lookup layout 'last-bottom-spacing)) - ((ly:prob-property system 'last-in-score #f) - (ly:output-def-lookup layout 'score-system-spacing)) - (else - (ly:output-def-lookup layout 'system-system-spacing)))) + (spacing-spec-sym (cond ((and next-system + (paper-system-title? system) + (paper-system-title? next-system)) + 'markup-markup-spacing) + ((paper-system-title? system) + 'markup-system-spacing) + ((and next-system + (paper-system-title? next-system)) + 'score-markup-spacing) + ((not next-system) + 'last-bottom-spacing) + ((ly:prob-property system 'last-in-score #f) + 'score-system-spacing) + (else + 'system-system-spacing))) + (spacing-spec (ly:output-def-lookup layout spacing-spec-sym)) (last-staff-Y (car (paper-system-staff-extents system))) (system-Y (ly:prob-property system 'Y-offset 0.0)) (system-X (ly:prob-property system 'X-offset 0.0)) @@ -237,7 +243,9 @@ empty-stencil)) (system-annotation (annotate-spacing-spec - layout spacing-spec + layout + (symbol->string spacing-spec-sym) + spacing-spec last-staff-Y first-staff-next-system-Y)) (annotations (ly:stencil-add diff --git a/scm/paper.scm b/scm/paper.scm index 454371fa34..23ec05a70f 100644 --- a/scm/paper.scm +++ b/scm/paper.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2004--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -20,13 +20,15 @@ (define-public (set-paper-dimension-variables mod) (module-define! mod 'dimension-variables - '(blot-diameter + '(binding-offset + blot-diameter bottom-margin cm footnote-footer-padding footnote-padding horizontal-shift in + incipit-width indent inner-margin inner-margin-default-scaled @@ -77,7 +79,7 @@ (setm! 'text-font-size (* 11 factor)) (setm! 'output-scale ss) - (setm! 'fonts (make-century-schoolbook-tree factor)) + (setm! 'fonts (make-default-fonts-tree factor)) (setm! 'staff-height staff-height) (setm! 'staff-space ss) @@ -104,8 +106,7 @@ (define-safe-public (set-global-staff-size sz) "Set the default staff size, where SZ is thought to be in PT." (let* ((current-mod (current-module)) - (parser (eval 'parser current-mod)) - (pap (ly:parser-lookup parser '$defaultpaper)) + (pap (ly:parser-lookup '$defaultpaper)) (in-layout? (or (module-defined? current-mod 'is-paper) (module-defined? current-mod 'is-layout))) diff --git a/scm/parser-clef.scm b/scm/parser-clef.scm index 6ba1261ca7..ea9f67fade 100644 --- a/scm/parser-clef.scm +++ b/scm/parser-clef.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2004--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -25,18 +25,26 @@ ("violin" . ("clefs.G" -2 0)) ("G" . ("clefs.G" -2 0)) ("G2" . ("clefs.G" -2 0)) + ("GG" . ("clefs.GG" -2 0)) + ("tenorG" . ("clefs.tenorG" -2 0)) ("french" . ("clefs.G" -4 0)) ("soprano" . ("clefs.C" -4 0)) ("mezzosoprano" . ("clefs.C" -2 0)) ("alto" . ("clefs.C" 0 0)) ("C" . ("clefs.C" 0 0)) + ("varC" . ("clefs.varC" 0 0)) + ("altovarC" . ("clefs.varC" 0 0)) ("tenor" . ("clefs.C" 2 0)) + ("tenorvarC" . ("clefs.varC" 2 0)) ("baritone" . ("clefs.C" 4 0)) + ("baritonevarC" . ("clefs.varC" 4 0)) ("varbaritone" . ("clefs.F" 0 0)) + ("baritonevarF" . ("clefs.F" 0 0)) ("bass" . ("clefs.F" 2 0)) ("F" . ("clefs.F" 2 0)) ("subbass" . ("clefs.F" 4 0)) ("percussion" . ("clefs.percussion" 0 0)) + ("varpercussion" . ("clefs.varpercussion" 0 0)) ("tab" . ("clefs.tab" 0 0)) ;; should move mensural stuff to separate file? @@ -90,9 +98,13 @@ ;; that symbol" (define c0-pitch-alist '(("clefs.G" . -4) + ("clefs.GG" . 3) + ("clefs.tenorG" . 3) ("clefs.C" . 0) + ("clefs.varC" . 0) ("clefs.F" . 4) ("clefs.percussion" . 0) + ("clefs.varpercussion" . 0) ("clefs.tab" . 0 ) ("clefs.vaticana.do" . 0) ("clefs.vaticana.fa" . 4) @@ -117,49 +129,27 @@ (define-public (make-clef-set clef-name) "Generate the clef setting commands for a clef with name @var{clef-name}." - (define (make-prop-set props) - (let ((m (make-music 'PropertySet))) - (for-each (lambda (x) (set! (ly:music-property m (car x)) (cdr x))) props) - m)) - (let ((e '()) - (c0 0) - (oct 0) - (style 'default) - (match (string-match "^(.*)([_^])([^0-9a-zA-Z]*)([1-9][0-9]*)([^0-9a-zA-Z]*)$" clef-name))) - (if match - (begin - (set! clef-name (match:substring match 1)) - (set! oct - (* (if (equal? (match:substring match 2) "^") -1 1) - (- (string->number (match:substring match 4)) 1))) - (set! style - (cond ((equal? (match:substring match 3) "(") 'parenthesized) + (let* ((match (string-match "^(.*)([_^])([^0-9a-zA-Z]*)([1-9][0-9]*)([^0-9a-zA-Z]*)$" clef-name)) + (e (assoc-get (if match (match:substring match 1) clef-name) supported-clefs)) + (oct (if match + ((if (equal? (match:substring match 2) "^") - +) + (1- (string->number (match:substring match 4)))) + 0)) + (style (cond ((not match) 'default) + ((equal? (match:substring match 3) "(") 'parenthesized) ((equal? (match:substring match 3) "[") 'bracketed) - (else style))))) - (set! e (assoc-get clef-name supported-clefs)) + (else 'default)))) (if e - (let* ((prop-list `(((symbol . clefGlyph) (value . ,(car e))) - ((symbol . middleCClefPosition) - (value . ,(+ oct - (cadr e) - (assoc-get (car e) c0-pitch-alist)))) - ((symbol . clefPosition) (value . ,(cadr e))) - ((symbol . clefTransposition) (value . ,(- oct))))) - ;; the clefTranspositionStyle property is set only when - ;; not 'default to calm display-lily-tests.scm - (prop-list (if (eq? style 'default) - prop-list - (append - prop-list - `(((symbol . clefTranspositionStyle) - (value . ,style)))))) - (musics (map make-prop-set prop-list)) - (recalc-mid-C (make-music 'ApplyContext)) - (seq (make-music 'SequentialMusic - 'elements (append musics (list recalc-mid-C)))) - (csp (make-music 'ContextSpeccedMusic))) - (set! (ly:music-property recalc-mid-C 'procedure) ly:set-middle-C!) - (context-spec-music seq 'Staff)) + (let ((musics (list + (make-property-set 'clefGlyph (car e)) + (make-property-set 'middleCClefPosition + (+ oct (cadr e) + (assoc-get (car e) c0-pitch-alist))) + (make-property-set 'clefPosition (cadr e)) + (make-property-set 'clefTransposition (- oct)) + (make-property-set 'clefTranspositionStyle style) + (make-apply-context ly:set-middle-C!)))) + (context-spec-music (make-sequential-music musics) 'Staff)) (begin (ly:warning (_ "unknown clef type `~a'") clef-name) (ly:warning (_ "supported clefs: ~a") diff --git a/scm/parser-ly-from-scheme.scm b/scm/parser-ly-from-scheme.scm index 7d72a25e87..00368e881f 100644 --- a/scm/parser-ly-from-scheme.scm +++ b/scm/parser-ly-from-scheme.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Nicolas Sceaux +;;;; Copyright (C) 2004--2015 Nicolas Sceaux ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -65,17 +65,15 @@ from @var{port} and return the corresponding Scheme music expression. (set! closures (cons `(cons ,p (lambda () ,expr)) closures))))))))))) - (define (embedded-lilypond parser lily-string filename line - closures location) - (let* ((clone (ly:parser-clone parser closures location)) + (define (embedded-lilypond lily-string filename line closures) + (let* ((clone (ly:parser-clone closures (*location*))) (result (ly:parse-string-expression clone lily-string filename line))) (if (ly:parser-has-error? clone) - (ly:parser-error parser (_ "error in #{ ... #}"))) + (ly:parser-error (_ "error in #{ ... #}") (*location*))) result)) (list embedded-lilypond - 'parser lily-string filename line - (cons 'list (reverse! closures)) - 'location))) + lily-string filename line + (cons 'list (reverse! closures))))) (read-hash-extend #\{ read-lily-expression) diff --git a/scm/part-combiner.scm b/scm/part-combiner.scm index 2c1bd721c0..94860cdf6f 100644 --- a/scm/part-combiner.scm +++ b/scm/part-combiner.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2004--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -39,11 +39,60 @@ (display (span-state x) file) (display "\n" file)) +;; Return the duration of the longest event in the Voice-state. +(define-method (duration (vs )) + (define (duration-max event d1) + (let ((d2 (ly:event-property event 'duration #f))) + (if d2 + (if (ly:duration)) + (ly:moment-add (moment vs) (ly:duration-length (duration vs)))) + (define-method (note-events (vs )) (define (f? x) (ly:in-event-class? x 'note-event)) (filter f? (events vs))) +; Return a list of note events which is sorted and stripped of +; properties that we do not want to prevent combining parts. +(define-method (comparable-note-events (vs )) + (define (note)) + (define (filtered-events event-class) + (filter (lambda(x) (ly:in-event-class? x event-class)) + (events vs))) + (let ((result (filtered-events 'rest-event))) + ;; There may be skips in the same part with rests for various + ;; reasons. Regard the skips only if there are no rests. + (if (and (not (pair? result)) (not (any-mmrest-events vs))) + (set! result (filtered-events 'skip-event))) + result)) + +(define-method (any-mmrest-events (vs )) + (define (f? x) + (ly:in-event-class? x 'multi-measure-rest-event)) + (any f? (events vs))) + (define-method (previous-voice-state (vs )) (let ((i (slot-ref vs 'vector-index)) (v (slot-ref vs 'state-vector))) @@ -73,6 +122,19 @@ (display " synced ")) (display "\n" f)) +(define-method (current-or-previous-voice-states (ss )) + "Return voice states meeting the following conditions. For a voice +in sync, return the current voice state. For a voice out of sync, +return the previous voice state." + (let* ((vss (voice-states ss)) + (vs1 (car vss)) + (vs2 (cdr vss))) + (if (and vs1 (not (equal? (moment vs1) (moment ss)))) + (set! vs1 (previous-voice-state vs1))) + (if (and vs2 (not (equal? (moment vs2) (moment ss)))) + (set! vs2 (previous-voice-state vs2))) + (cons vs1 vs2))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -81,16 +143,32 @@ (if p (span-state p) '()))) (define (make-voice-states evl) - (let ((vec (list->vector (map (lambda (v) - (make - #:moment (caar v) - #:tuning (cdar v) - #:events (map car (cdr v)))) - evl)))) - (do ((i 0 (1+ i))) - ((= i (vector-length vec)) vec) - (slot-set! (vector-ref vec i) 'vector-index i) - (slot-set! (vector-ref vec i) 'state-vector vec)))) + (let* ((states (map (lambda (v) + (make + #:moment (caar v) + #:tuning (cdar v) + #:events (map car (cdr v)))) + (reverse evl)))) + + ;; add an entry with no events at the moment the last event ends + (if (pair? states) + (let ((last-real-event (car states))) + (set! states + (cons (make + #:moment (end-moment last-real-event) + #:tuning (tuning last-real-event) + #:events '()) + states)))) + + ;; TODO: Add an entry at +inf.0 and see if it allows us to remove + ;; the many instances of conditional code handling the case that + ;; there is no voice state at a given moment. + + (let ((vec (list->vector (reverse! states)))) + (do ((i 0 (1+ i))) + ((= i (vector-length vec)) vec) + (slot-set! (vector-ref vec i) 'vector-index i) + (slot-set! (vector-ref vec i) 'state-vector vec))))) (define (make-split-state vs1 vs2) "Merge lists VS1 and VS2, containing Voice-state objects into vector @@ -201,7 +279,8 @@ Voice-state objects (define recording-group-functions ;;Selected parts from @var{toplevel-music-functions} not requiring @code{parser}. (list - (lambda (music) (expand-repeat-chords! '(rhythmic-event) music)))) + (lambda (music) (expand-repeat-chords! '(rhythmic-event) music)) + expand-repeat-notes!)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -213,36 +292,34 @@ LilyPond version 2.8 and earlier." ((context-list '()) (now-mom (ly:make-moment 0 0)) (global (ly:make-global-context odef)) - (mom-listener (ly:make-listener - (lambda (tev) (set! now-mom (ly:event-property tev 'moment))))) + (mom-listener (lambda (tev) (set! now-mom (ly:event-property tev 'moment)))) (new-context-listener - (ly:make-listener - (lambda (sev) - (let* - ((child (ly:event-property sev 'context)) - (this-moment-list (cons (ly:context-id child) '())) - (dummy (set! context-list (cons this-moment-list context-list))) - (acc '()) - (accumulate-event-listener - (ly:make-listener (lambda (ev) - (set! acc (cons (cons ev #t) acc))))) - (save-acc-listener - (ly:make-listener (lambda (tev) - (if (pair? acc) - (let ((this-moment - (cons (cons now-mom - (ly:context-property child 'instrumentTransposition)) - ;; The accumulate-event-listener above creates - ;; the list of events in reverse order, so we - ;; have to revert it to the original order again - (reverse acc)))) - (set-cdr! this-moment-list - (cons this-moment (cdr this-moment-list))) - (set! acc '()))))))) - (ly:add-listener accumulate-event-listener - (ly:context-event-source child) 'StreamEvent) - (ly:add-listener save-acc-listener - (ly:context-event-source global) 'OneTimeStep)))))) + (lambda (sev) + (let* + ((child (ly:event-property sev 'context)) + (this-moment-list (cons (ly:context-id child) '())) + (dummy (set! context-list (cons this-moment-list context-list))) + (acc '()) + (accumulate-event-listener + (lambda (ev) + (set! acc (cons (cons ev #t) acc)))) + (save-acc-listener + (lambda (tev) + (if (pair? acc) + (let ((this-moment + (cons (cons now-mom + (ly:context-property child 'instrumentTransposition)) + ;; The accumulate-event-listener above creates + ;; the list of events in reverse order, so we + ;; have to revert it to the original order again + (reverse acc)))) + (set-cdr! this-moment-list + (cons this-moment (cdr this-moment-list))) + (set! acc '())))))) + (ly:add-listener accumulate-event-listener + (ly:context-event-source child) 'StreamEvent) + (ly:add-listener save-acc-listener + (ly:context-event-source global) 'OneTimeStep))))) (ly:add-listener new-context-listener (ly:context-events-below global) 'AnnounceNewContext) (ly:add-listener mom-listener (ly:context-event-source global) 'Prepare) @@ -252,30 +329,14 @@ LilyPond version 2.8 and earlier." global) context-list)) -(define-public (make-part-combine-music parser music-list direction) - (let* ((m (make-music 'PartCombineMusic)) - (m1 (make-non-relative-music (context-spec-music (first music-list) 'Voice "one"))) - (m2 (make-non-relative-music (context-spec-music (second music-list) 'Voice "two"))) - (listener (ly:parser-lookup parser 'partCombineListener)) - (evs2 (recording-group-emulate m2 listener)) - (evs1 (recording-group-emulate m1 listener))) - - (set! (ly:music-property m 'elements) (list m1 m2)) - (set! (ly:music-property m 'direction) direction) - (set! (ly:music-property m 'split-list) - (if (and (assoc "one" evs1) (assoc "two" evs2)) - (determine-split-list (reverse! (assoc-get "one" evs1) '()) - (reverse! (assoc-get "two" evs2) '())) - '())) - m)) - -(define-public (determine-split-list evl1 evl2) - "@var{evl1} and @var{evl2} should be ascending." +(define-public (determine-split-list evl1 evl2 chord-range) + "@var{evl1} and @var{evl2} should be ascending. @var{chord-range} is a pair of numbers (min . max) defining the distance in steps between notes that may be combined into a chord or unison." (let* ((pc-debug #f) - (chord-threshold 8) (voice-state-vec1 (make-voice-states evl1)) (voice-state-vec2 (make-voice-states evl2)) - (result (make-split-state voice-state-vec1 voice-state-vec2))) + (result (make-split-state voice-state-vec1 voice-state-vec2)) + (chord-min-diff (car chord-range)) + (chord-max-diff (cdr chord-range))) ;; Go through all moments recursively and check if the events of that ;; moment contain a part-combine-force-event override. If so, store its @@ -284,9 +345,16 @@ LilyPond version 2.8 and earlier." (define (analyse-forced-combine result-idx prev-res) (define (get-forced-event x) - (and (ly:in-event-class? x 'part-combine-force-event) - (cons (ly:event-property x 'forced-type) - (ly:event-property x 'once)))) + (cond + ((and (ly:in-event-class? x 'SetProperty) + (eq? (ly:event-property x 'symbol) 'partCombineForced)) + (cons (ly:event-property x 'value #f) + (ly:event-property x 'once #f))) + ((and (ly:in-event-class? x 'UnsetProperty) + (eq? (ly:event-property x 'symbol) 'partCombineForced)) + (cons #f (ly:event-property x 'once #f))) + (else #f))) + (define (part-combine-events vs) (if (not vs) '() @@ -310,9 +378,11 @@ LilyPond version 2.8 and earlier." (if (< result-idx (vector-length result)) (let* ((now-state (vector-ref result result-idx)) ; current result ;; Extract all part-combine force events - (ev1 (part-combine-events (car (voice-states now-state)))) - (ev2 (part-combine-events (cdr (voice-states now-state)))) - (evts (append ev1 ev2)) + (evts (if (synced? now-state) + (append + (part-combine-events (car (voice-states now-state))) + (part-combine-events (cdr (voice-states now-state)))) + '())) ;; result is (once-state permament-state): (state (fold forced-result (cons 'automatic prev-res) evts)) ;; Now let once override permanent changes: @@ -352,51 +422,49 @@ Only set if not set previously. (define (analyse-notes now-state) (let* ((vs1 (car (voice-states now-state))) (vs2 (cdr (voice-states now-state))) - (notes1 (note-events vs1)) - (durs1 (sort (map (lambda (x) (ly:event-property x 'duration)) - notes1) - ly:duration (length notes1) 1) (put 'apart)) - ((> (length notes2) 1) (put 'apart)) - ((= 1 (+ (length notes2) (length notes1))) (put 'apart)) - ((and (= (length durs1) 1) - (= (length durs2) 1) - (not (equal? (car durs1) (car durs2)))) - (put 'apart)) - (else - (if (and (= (length pitches1) (length pitches2))) - (if (and (pair? pitches1) - (pair? pitches2) - (or - (< chord-threshold (ly:pitch-steps - (ly:pitch-diff (car pitches1) - (car pitches2)))) - - ;; voice crossings: - (> 0 (ly:pitch-steps (ly:pitch-diff (car pitches1) - (car pitches2)))) - )) - (put 'apart) - ;; copy previous split state from spanner state - (begin - (if (previous-voice-state vs1) - (copy-state-from voice-state-vec1 - (previous-voice-state vs1))) - (if (previous-voice-state vs2) - (copy-state-from voice-state-vec2 - (previous-voice-state vs2))) - (if (and (null? (span-state vs1)) (null? (span-state vs2))) - (put 'chords))))))))) + (notes1 (comparable-note-events vs1)) + (notes2 (comparable-note-events vs2))) + (cond + ;; if neither part has notes, do nothing + ((and (not (pair? notes1)) (not (pair? notes2)))) + + ;; if one part has notes and the other does not + ((or (not (pair? notes1)) (not (pair? notes2))) (put 'apart)) + + ;; if either part has a chord + ((or (> (length notes1) 1) + (> (length notes2) 1)) + (if (and (<= chord-min-diff 0) ; user requests combined unisons + (equal? notes1 notes2)) ; both parts have the same chord + (put 'chords) + (put 'apart))) + + ;; if the durations are different + ;; TODO articulations too? + ((and (not (equal? (ly:event-property (car notes1) 'duration) + (ly:event-property (car notes2) 'duration)))) + (put 'apart)) + + (else + ;; Is the interval outside of chord-range? + (if (let ((diff (ly:pitch-steps + (ly:pitch-diff + (ly:event-property (car notes1) 'pitch) + (ly:event-property (car notes2) 'pitch))))) + (or (< diff chord-min-diff) + (> diff chord-max-diff) + )) + (put 'apart) + ;; copy previous split state from spanner state + (begin + (if (previous-voice-state vs1) + (copy-state-from voice-state-vec1 + (previous-voice-state vs1))) + (if (previous-voice-state vs2) + (copy-state-from voice-state-vec2 + (previous-voice-state vs2))) + (if (and (null? (span-state vs1)) (null? (span-state vs2))) + (put 'chords)))))))) (if (< result-idx (vector-length result)) (let* ((now-state (vector-ref result result-idx)) @@ -431,18 +499,78 @@ Only set if not set previously. (let* ((now-state (vector-ref result result-idx)) (vs1 (car (voice-states now-state))) (vs2 (cdr (voice-states now-state)))) - (if (and (equal? (configuration now-state) 'chords) - vs1 vs2) - (let ((notes1 (note-events vs1)) - (notes2 (note-events vs2))) - (cond ((and (= 1 (length notes1)) - (= 1 (length notes2)) - (equal? (ly:event-property (car notes1) 'pitch) - (ly:event-property (car notes2) 'pitch))) + + (define (analyse-synced-silence) + (let ((rests1 (if vs1 (rest-or-skip-events vs1) '())) + (rests2 (if vs2 (rest-or-skip-events vs2) '()))) + (cond + + ;; multi-measure rests (probably), which the + ;; part-combine iterator handles well + ((and (= 0 (length rests1)) + (= 0 (length rests2))) + (set! (configuration now-state) 'unisilence)) + + ;; equal rests or equal skips, but not one of each + ((and (= 1 (length rests1)) + (= 1 (length rests2)) + (equal? (ly:event-property (car rests1) 'class) + (ly:event-property (car rests2) 'class)) + (equal? (ly:event-property (car rests1) 'duration) + (ly:event-property (car rests2) 'duration))) + (set! (configuration now-state) 'unisilence)) + + ;; rests of different durations or mixed with + ;; skips or multi-measure rests + (else + ;; TODO For skips, route the rest to the shared + ;; voice and the skip to the voice for its part? + (set! (configuration now-state) 'apart-silence)) + + ))) + + (define (analyse-unsynced-silence vs1 vs2) + (let ((any-mmrests1 (if vs1 (any-mmrest-events vs1) #f)) + (any-mmrests2 (if vs2 (any-mmrest-events vs2) #f))) + (cond + ;; If a multi-measure rest begins now while the other + ;; part has an ongoing multi-measure rest (or has + ;; ended), start displaying the one that begins now. + ((and any-mmrests1 + (equal? (moment vs1) (moment now-state)) + (or (not vs2) any-mmrests2)) + (set! (configuration now-state) 'silence1)) + + ;; as above with parts swapped + ((and any-mmrests2 + (equal? (moment vs2) (moment now-state)) + (or (not vs1) any-mmrests1)) + (set! (configuration now-state) 'silence2)) + ))) + + (if (or vs1 vs2) + (let ((notes1 (if vs1 (comparable-note-events vs1) '())) + (notes2 (if vs2 (comparable-note-events vs2) '()))) + (cond ((and (equal? (configuration now-state) 'chords) + (pair? notes1) + (equal? notes1 notes2)) (set! (configuration now-state) 'unisono)) - ((and (= 0 (length notes1)) - (= 0 (length notes2))) - (set! (configuration now-state) 'unisilence))))) + + ((synced? now-state) + (if (and (= 0 (length notes1)) + (= 0 (length notes2))) + (analyse-synced-silence))) + + (else ;; not synchronized + (let* ((vss + (current-or-previous-voice-states now-state)) + (vs1 (car vss)) + (vs2 (cdr vss))) + (if (and + (or (not vs1) (= 0 (length (note-events vs1)))) + (or (not vs2) (= 0 (length (note-events vs2))))) + (analyse-unsynced-silence vs1 vs2)))) + ))) (analyse-a2 (1+ result-idx))))) (define (analyse-solo12 result-idx) @@ -507,7 +635,50 @@ the mark when there are no spanners active. ;; try-solo start-idx)) - (define (analyse-moment result-idx) + (define (analyse-apart-silence result-idx) + "Analyse 'apart-silence starting at RESULT-IDX. Return next index." + (let* ((now-state (vector-ref result result-idx)) + (vs1 (current-voice-state now-state 1)) + (vs2 (current-voice-state now-state 2)) + (rests1 (if vs1 (rest-or-skip-events vs1) '())) + (rests2 (if vs2 (rest-or-skip-events vs2) '())) + (prev-state (if (> result-idx 0) + (vector-ref result (- result-idx 1)) + #f)) + (prev-config (if prev-state + (configuration prev-state) + 'apart-silence))) + (cond + ;; rest with multi-measure rest: choose the rest + ((and (synced? now-state) + (= 1 (length rests1)) + (ly:in-event-class? (car rests1) 'rest-event) + (= 0 (length rests2))) ; probably mmrest + (put 'silence1)) + + ;; as above with parts swapped + ((and (synced? now-state) + (= 1 (length rests2)) + (ly:in-event-class? (car rests2) 'rest-event) + (= 0 (length rests1))) ; probably mmrest + (put 'silence2)) + + ((synced? now-state) + (put 'apart-silence)) + + ;; remain in the silence1/2 states until resync + ((equal? prev-config 'silence1) + (put 'silence1)) + + ((equal? prev-config 'silence2) + (put 'silence2)) + + (else + (put 'apart-silence))) + + (1+ result-idx))) + + (define (analyse-apart result-idx) "Analyse 'apart starting at RESULT-IDX. Return next index." (let* ((now-state (vector-ref result result-idx)) (vs1 (current-voice-state now-state 1)) @@ -522,8 +693,10 @@ the mark when there are no spanners active. (max ;; we should always increase. (cond ((and (= n1 0) (= n2 0)) - (put 'apart-silence) - (1+ result-idx)) + ;; If we hit this, it means that the previous passes + ;; have designated as 'apart what is really + ;; 'apart-silence. + (analyse-apart-silence result-idx)) ((and (= n2 0) (equal? (moment vs1) (moment now-state)) (null? (previous-span-state vs1))) @@ -538,9 +711,14 @@ the mark when there are no spanners active. (1+ result-idx)))) (if (< result-idx (vector-length result)) - (if (equal? (configuration (vector-ref result result-idx)) 'apart) - (analyse-solo12 (analyse-moment result-idx)) - (analyse-solo12 (1+ result-idx))))) ; analyse-solo12 + (let ((conf (configuration (vector-ref result result-idx)))) + (cond + ((equal? conf 'apart) + (analyse-solo12 (analyse-apart result-idx))) + ((equal? conf 'apart-silence) + (analyse-solo12 (analyse-apart-silence result-idx))) + (else + (analyse-solo12 (1+ result-idx))))))) ; analyse-solo12 (analyse-spanner-states voice-state-vec1) (analyse-spanner-states voice-state-vec2) @@ -576,16 +754,162 @@ the mark when there are no spanners active. (display result)) result)) +(define-public default-part-combine-mark-state-machine + ;; (current-state . ((split-state-event . + ;; (output-voice output-event next-state)) ...)) + '((Initial . ((solo1 . (solo SoloOneEvent Solo1)) + (solo2 . (solo SoloTwoEvent Solo2)) + (unisono . (shared UnisonoEvent Unisono)))) + (Solo1 . ((apart . (#f #f Initial)) + (chords . (#f #f Initial)) + (solo2 . (solo SoloTwoEvent Solo2)) + (unisono . (shared UnisonoEvent Unisono)))) + (Solo2 . ((apart . (#f #f Initial)) + (chords . (#f #f Initial)) + (solo1 . (solo SoloOneEvent Solo1)) + (unisono . (shared UnisonoEvent Unisono)))) + (Unisono . ((apart . (#f #f Initial)) + (chords . (#f #f Initial)) + (solo1 . (solo SoloOneEvent Solo1)) + (solo2 . (solo SoloTwoEvent Solo2)))))) + +(define-public (make-part-combine-marks state-machine split-list) + "Generate a sequence of part combiner events from a split list" + + (define (get-state state-name) + (assq-ref state-machine state-name)) + + (let ((full-seq '()) ; sequence of { \context Voice = "x" {} ... } + (segment '()) ; sequence within \context Voice = "x" {...} + (prev-moment ZERO-MOMENT) + (prev-voice #f) + (state (get-state 'Initial))) + + (define (commit-segment) + "Add the current segment to the full sequence and begin another." + (if (pair? segment) + (set! full-seq + (cons (make-music 'ContextSpeccedMusic + 'context-id (symbol->string prev-voice) + 'context-type 'Voice + 'element (make-sequential-music (reverse! segment))) + full-seq))) + (set! segment '())) + + (define (handle-split split) + (let* ((moment (car split)) + (action (assq-ref state (cdr split)))) + (if action + (let ((voice (car action)) + (part-combine-event (cadr action)) + (next-state-name (caddr action))) + (if part-combine-event + (let ((dur (ly:moment-sub moment prev-moment))) + ;; start a new segment when the voice changes + (if (not (eq? voice prev-voice)) + (begin + (commit-segment) + (set! prev-voice voice))) + (if (not (equal? dur ZERO-MOMENT)) + (set! segment (cons (make-music 'SkipEvent + 'duration (make-duration-of-length dur)) segment))) + (set! segment (cons (make-music part-combine-event) segment)) + + (set! prev-moment moment))) + (set! state (get-state next-state-name)))))) + + (for-each handle-split split-list) + (commit-segment) + (make-sequential-music (reverse! full-seq)))) + +(define-public default-part-combine-context-change-state-machine-one + ;; (current-state . ((split-state-event . (output-voice next-state)) ...)) + '((Initial . ((apart . (one . Initial)) + (apart-silence . (one . Initial)) + (apart-spanner . (one . Initial)) + (chords . (shared . Initial)) + (silence1 . (shared . Initial)) + (silence2 . (null . Demoted)) + (solo1 . (solo . Initial)) + (solo2 . (null . Demoted)) + (unisono . (shared . Initial)) + (unisilence . (shared . Initial)))) + + ;; After a part has been used as the exclusive input for a + ;; passage, we want to use it by default for unisono/unisilence + ;; passages because Part_combine_iterator might have killed + ;; multi-measure rests in the other part. Here we call such a + ;; part "promoted". Part one begins promoted. + (Demoted . ((apart . (one . Demoted)) + (apart-silence . (one . Demoted)) + (apart-spanner . (one . Demoted)) + (chords . (shared . Demoted)) + (silence1 . (shared . Initial)) + (silence2 . (null . Demoted)) + (solo1 . (solo . Initial)) + (solo2 . (null . Demoted)) + (unisono . (null . Demoted)) + (unisilence . (null . Demoted)))))) + +(define-public default-part-combine-context-change-state-machine-two + ;; (current-state . ((split-state-event . (output-voice next-state)) ...)) + '((Initial . ((apart . (two . Initial)) + (apart-silence . (two . Initial)) + (apart-spanner . (two . Initial)) + (chords . (shared . Initial)) + (silence1 . (null . Initial)) + (silence2 . (shared . Promoted)) + (solo1 . (null . Initial)) + (solo2 . (solo . Promoted)) + (unisono . (null . Initial)) + (unisilence . (null . Initial)))) + + ;; See the part-one state machine for the meaning of "promoted". + (Promoted . ((apart . (two . Promoted)) + (apart-silence . (two . Promoted)) + (apart-spanner . (two . Promoted)) + (chords . (shared . Promoted)) + (silence1 . (null . Initial)) + (silence2 . (shared . Promoted)) + (solo1 . (null . Initial)) + (solo2 . (solo . Promoted)) + (unisono . (shared . Promoted)) + (unisilence . (shared . Promoted)))))) + +(define-public (make-part-combine-context-changes state-machine split-list) + "Generate a sequence of part combiner context changes from a split list" + + (define (get-state state-name) + (assq-ref state-machine state-name)) + + (let ((change-list '()) + (prev-voice #f) + (state (get-state 'Initial))) + + (define (handle-split split) + (let* ((moment (car split)) + (action (assq-ref state (cdr split)))) + (if action + (let ((voice (car action)) + (next-state-name (cdr action))) + (if (not (eq? voice prev-voice)) + (begin + (set! change-list (cons (cons moment voice) change-list)) + (set! prev-voice voice))) + (set! state (get-state next-state-name)))))) + + (for-each handle-split split-list) + (reverse! change-list))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define-public (add-quotable parser name mus) +(define-public (add-quotable name mus) (let* ((tab (eval 'musicQuotes (current-module))) (voicename (get-next-unique-voice-name)) ;; recording-group-emulate returns an assoc list (reversed!), so ;; hand it a proper unique context name and extract that key: (ctx-spec (context-spec-music mus 'Voice voicename)) - (listener (ly:parser-lookup parser 'partCombineListener)) + (listener (ly:parser-lookup 'partCombineListener)) (context-list (reverse (recording-group-emulate ctx-spec listener))) (raw-voice (assoc voicename context-list)) (quote-contents (if (pair? raw-voice) (cdr raw-voice) '()))) diff --git a/scm/predefined-fretboards.scm b/scm/predefined-fretboards.scm index 5140ae6e91..5f4d7005cd 100644 --- a/scm/predefined-fretboards.scm +++ b/scm/predefined-fretboards.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2008--2012 Carl D. Sorensen +;;;; Copyright (C) 2008--2015 Carl D. Sorensen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -38,20 +38,17 @@ and return a marking list, which can be used with a fretboard grob." (if (string? diagram-definition) (parse-terse-string diagram-definition) diagram-definition))) - (map (lambda(item) - (let ((code (car item))) - (cond - ((eq? code 'barre) - (list-set! item 3 - (+ fret-offset (list-ref item 3))) - item) - ((eq? code 'capo) - (list-set! item 1 - (+ fret-offset (list-ref item 1))) - item) - ((eq? code 'place-fret) - (list-set! item 2 - (+ fret-offset (list-ref item 2))) - item) - (else item)))) + (map (lambda (item) + (let* ((code (car item)) + (nth (assq-ref '((barre . 3) (capo . 1) (place-fret . 2)) + code))) + (if nth + ;; offset nth element of item by offset-fret + ;; without modifying the original list but + ;; sharing its tail + (let ((tail (list-tail item nth))) + (append! (list-head item nth) + (cons (+ (car tail) fret-offset) + (cdr tail)))) + item))) verbose-definition))) diff --git a/scm/ps-to-png.scm b/scm/ps-to-png.scm index 948e56e145..f5d40d0c5c 100644 --- a/scm/ps-to-png.scm +++ b/scm/ps-to-png.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2005--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2005--2015 Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -27,64 +27,57 @@ (lily) ) -;; FIXME: use backend-library for duplicates and stubs; lilypond-ps2png.scm is no more - -(define-public _ gettext) - -(define PLATFORM - (string->symbol - (string-downcase - (car (string-tokenize (vector-ref (uname) 0) char-set:letter))))) - (define (re-sub re sub string) (regexp-substitute/global #f re string 'pre sub 'post)) -(define (search-executable names) - (define (helper path lst) - (if (null? (cdr lst)) - (car lst) - (if (search-path path (car lst)) (car lst) - (helper path (cdr lst))))) - - (let ((path (parse-path (getenv "PATH")))) - (helper path names))) - -(define (search-gs) - (search-executable '("gs-nox" "gs-8.15" "gs"))) - -(define (gulp-port port max-length) - (let ((str (make-string max-length))) - (read-string!/partial str port 0 max-length) - str)) - (define-public (gulp-file file-name . max-size) (ly:gulp-file file-name (if (pair? max-size) (car max-size)))) -;; copy of ly:system. ly:* not available via lilypond-ps2png.scm -(define (my-system be-verbose exit-on-error cmd) - (define status 0) - (ly:debug (_ "Invoking `~a'...\n") cmd) - (set! status (system cmd)) - (if (not (= status 0)) - (begin - (ly:error (_ "~a exited with status: ~S") "GS" status) - (if exit-on-error (exit 1)))) - status) - -(define (scale-down-image be-verbose factor file) - (define (with-pbm) - (let* ((status 0) - (old (string-append file ".old"))) - - (rename-file file old) - (my-system - be-verbose #t - (format #f - "pngtopnm \"~a\" | pnmscale -reduce ~a 2>/dev/null | pnmtopng -compression 9 2>/dev/null > \"~a\"" - old factor file)) - (delete-file old))) - - (with-pbm)) +(define (search-pngtopam) + (search-executable + (if (eq? PLATFORM 'windows) + '("pngtopam.exe" "pngtopnm.exe") + '("pngtopam" "pngtopnm")))) + +(define (search-pamscale) + (search-executable + (if (eq? PLATFORM 'windows) + '("pamscale.exe" "pnmscale.exe") + '("pamscale" "pnmscale")))) + +(define (search-pnmtopng) + (search-executable + (if (eq? PLATFORM 'windows) + '("pnmtopng.exe") + '("pnmtopng")))) + +(define (scale-down-image factor file) + (let* ((port-tmp1 (make-tmpfile)) + (tmp1-name (port-filename port-tmp1)) + (port-tmp2 (make-tmpfile)) + (tmp2-name (port-filename port-tmp2)) + ;; Netpbm commands (pngtopnm, pnmscale, pnmtopng) + ;; outputs only standard output instead of a file. + ;; So we need pipe and redirection. + ;; However, ly:system can't handle them. + ;; Therefore, we use ly:system-with-shell. + (cmd + (ly:format + "~a \"~a\" | ~a -reduce ~a | ~a -compression 9 > \"~a\"" + (search-pngtopam) tmp1-name + (search-pamscale) factor + (search-pnmtopng) + tmp2-name))) + + (ly:debug (_ "Copying `~a' to `~a'...") file tmp1-name) + (copy-binary-file file tmp1-name) + (ly:system-with-shell cmd) + (ly:debug (_ "Copying `~a' to `~a'...") tmp2-name file) + (copy-binary-file tmp2-name file) + (ly:debug (_ "Deleting `~a'...") tmp1-name) + (delete-file tmp1-name) + (ly:debug (_ "Deleting `~a'...") tmp2-name) + (delete-file tmp2-name))) (define-public (ps-page-count ps-name) (let* ((byte-count 10240) @@ -96,7 +89,7 @@ header)))) (if match (string->number (match:substring match 1)) 0))) -(define-public (make-ps-images ps-name . rest) +(define-public (make-ps-images base-name tmp-name is-eps . rest) (let-keywords* rest #f ((resolution 90) @@ -114,61 +107,56 @@ ((string-contains format-str "jpeg") "jpeg") (else (ly:error "Unknown pixmap format ~a" pixmap-format)))) - (base (string-join - (string-split (dir-basename ps-name ".ps" ".eps") #\%) - "%%")) - (png1 (format #f "~a.~a" base extension)) - (pngn (format #f "~a-page%d.~a" base extension)) - (page-count (ps-page-count ps-name)) + (png1 (format #f "~a.~a" base-name extension)) + (pngn (format #f "~a-page%d.~a" base-name extension)) + (page-count (ps-page-count tmp-name)) (multi-page? (> page-count 1)) - (output-file (if multi-page? pngn png1)) - - (gs-variable-options - (if (string-suffix-ci? ".eps" ps-name) - "-dEPSCrop" - (format #f "-dDEVICEWIDTHPOINTS=~,2f -dDEVICEHEIGHTPOINTS=~,2f" - page-width page-height))) - (cmd (ly:format "~a\ - ~a\ - ~a\ - -dGraphicsAlphaBits=4\ - -dTextAlphaBits=4\ - -dNOPAUSE\ - -sDEVICE=~a\ - -sOutputFile=~S\ - -r~a\ - ~S\ - -c quit" - (search-gs) - (if be-verbose "" "-q") - gs-variable-options - pixmap-format - output-file - (* anti-alias-factor resolution) ps-name)) - (status 0) - (files '())) - ;; The wrapper on windows cannot handle `=' signs, - ;; gs has a workaround with #. - (if (eq? PLATFORM 'windows) - (begin - (set! cmd (re-sub "=" "#" cmd)) - (set! cmd (re-sub "-dSAFER " "" cmd)))) + ;; Escape `%' (except `page%d') for ghostscript + (base-name-gs (string-join + (string-split base-name #\%) + "%%")) + (png1-gs (format #f "~a.~a" base-name-gs extension)) + (pngn-gs (format #f "~a-page%d.~a" base-name-gs extension)) + (output-file (if multi-page? pngn-gs png1-gs)) + + (*unspecified* (if #f #f)) + (cmd + (remove (lambda (x) (eq? x *unspecified*)) + (list + (search-gs) + (if (ly:get-option 'verbose) *unspecified* "-q") + (if (or (ly:get-option 'gs-load-fonts) + (ly:get-option 'gs-load-lily-fonts) + (eq? PLATFORM 'windows)) + "-dNOSAFER" + "-dSAFER") + + (if is-eps + "-dEPSCrop" + (ly:format "-dDEVICEWIDTHPOINTS=~$" page-width)) + (if is-eps + *unspecified* + (ly:format "-dDEVICEHEIGHTPOINTS=~$" page-height)) + "-dGraphicsAlphaBits=4" + "-dTextAlphaBits=4" + "-dNOPAUSE" + "-dBATCH" + (ly:format "-sDEVICE=~a" pixmap-format) + (string-append "-sOutputFile=" output-file) + (ly:format "-r~a" (* anti-alias-factor resolution)) + (string-append "-f" tmp-name)))) + (files '())) - (set! status (my-system be-verbose #f cmd)) + (ly:system cmd) (set! files (if multi-page? (map (lambda (n) - (format #f "~a-page~a.png" base (1+ n))) + (format #f "~a-page~a.png" base-name (1+ n))) (iota page-count)) - (list (format #f "~a.png" base)))) - - (if (not (= 0 status)) - (begin - (for-each delete-file files) - (exit 1))) + (list (format #f "~a.png" base-name)))) (if (and rename-page-1 multi-page?) (begin @@ -180,5 +168,5 @@ (if (not (= 1 anti-alias-factor)) (for-each - (lambda (f) (scale-down-image be-verbose anti-alias-factor f)) files)) + (lambda (f) (scale-down-image anti-alias-factor f)) files)) files))) diff --git a/scm/safe-lily.scm b/scm/safe-lily.scm index 25209e5a0b..f3e0b98280 100644 --- a/scm/safe-lily.scm +++ b/scm/safe-lily.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2004--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/safe-utility-defs.scm b/scm/safe-utility-defs.scm index 057639d7fa..9591edb4f5 100644 --- a/scm/safe-utility-defs.scm +++ b/scm/safe-utility-defs.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 1998--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -26,6 +26,10 @@ #:export-syntax (define-safe-public) #:re-export-syntax (define*-public)) +(if (string>? (version) "1.9.10") + (use-modules (ice-9 curried-definitions))) + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Safe definitions utility @@ -44,8 +48,9 @@ LilyPond safe mode. The syntax is the same as `define*-public'." (let ((safe-symbol (get-symbol arglist))) `(begin - (define*-public ,arglist + (define* ,arglist ,@body) (set! safe-objects (cons (cons ',safe-symbol ,safe-symbol) safe-objects)) + (export ,safe-symbol) ,safe-symbol))) diff --git a/scm/scheme-engravers.scm b/scm/scheme-engravers.scm index 0766cbc19c..3311ebb7a3 100644 --- a/scm/scheme-engravers.scm +++ b/scm/scheme-engravers.scm @@ -15,84 +15,77 @@ ;;;; You should have received a copy of the GNU General Public License ;;;; along with LilyPond. If not, see . +(define-public (ly:make-listener callback) + "This is a compatibility wrapper for creating a \"listener\" for use +with @code{ly:add-listener} from a @var{callback} taking a single +argument. Since listeners are equivalent to callbacks, this is no +longer needed." + callback) (define-public (Measure_counter_engraver context) "This engraver numbers ranges of measures, which is useful in parts as an aid for counting repeated measures. There is no requirement that the affected measures be repeated, however. The user delimits the area to receive a count with @code{\\startMeasureCount} and -@code{\\stopMeasureCount}. - -Each element of a count is a spanner, and a count is thus a series of -spanners. Each spanner is bounded by the first @code{CommandColumn} of -successive measures, and boundaries are shared by adjoining spanners." +@code{\\stopMeasureCount}." (let ((count-spanner '()) ; a single element of the count (go? #f) ; is the count in progress? (stop? #f) ; do we end the count? (last-measure-seen 0) - (new-measure? #f) (elapsed 0)) (make-engraver - (listeners ((measure-counter-event engraver event) - (set! last-measure-seen (ly:context-property context 'currentBarNumber)) - (set! new-measure? #t) - (cond - ((and (= START (ly:event-property event 'span-direction)) - go?) - (begin - (set! stop? #t) - (ly:input-warning - (ly:event-property event 'origin) - "count not ended before another begun"))) - ((= START (ly:event-property event 'span-direction)) - (set! go? #t)) - ((= STOP (ly:event-property event 'span-direction)) - (begin - (set! stop? #t) - (set! go? #f)))))) + (listeners + ((measure-counter-event engraver event) + (cond + ((and (= START (ly:event-property event 'span-direction)) + go?) + (set! stop? #t) + (ly:input-warning + (ly:event-property event 'origin) + "count not ended before another begun")) + ((= START (ly:event-property event 'span-direction)) + (set! go? #t) + ;; initialize one less so first measure receives a count spanner + (set! last-measure-seen + (1- (ly:context-property context 'currentBarNumber)))) + ((= STOP (ly:event-property event 'span-direction)) + (set! stop? #t) + (set! go? #f))))) ((process-music trans) (let ((col (ly:context-property context 'currentCommandColumn)) (now (ly:context-property context 'measurePosition)) (current-bar (ly:context-property context 'currentBarNumber))) - ;; If the counter has been started, make sure we're in a new bar - ;; before finishing a count-spanner and starting a new one. - ;; Since we consider all CommandColumns encountered, we need this - ;; check so that a count-spanner is not created for each pair. - (if (and (ly:grob? count-spanner) - (> current-bar last-measure-seen)) - (set! new-measure? #t)) - (if new-measure? + ;; Each measure of a count receives a new spanner, which is bounded + ;; by the first "command column" of that measure and the following one. + ;; The possibility of initial grace notes (negative measure position) + ;; is considered. + (if (and (> current-bar last-measure-seen) + (moment<=? now ZERO-MOMENT)) (begin - ;; Check if we have the first column of the measure. - ;; The possibility of initial grace notes is considered. - (if (moment<=? now ZERO-MOMENT) + ;; Finish the previous count-spanner if there is one. + (if (ly:grob? count-spanner) + (begin + (ly:spanner-set-bound! count-spanner RIGHT col) + (ly:pointer-group-interface::add-grob count-spanner 'columns col) + (ly:engraver-announce-end-grob trans count-spanner col) + (set! count-spanner '()))) + ;; If count is over, reset variables. + (if stop? (begin - ;; If we have the first column, finish the previous - ;; counter-spanner (if there is one). - (if (ly:grob? count-spanner) - (begin - (ly:spanner-set-bound! count-spanner RIGHT col) - (ly:pointer-group-interface::add-grob count-spanner 'columns col) - (ly:engraver-announce-end-grob trans count-spanner col) - (set! count-spanner '()))) - ;; if count is over, reset variables - (if stop? - (begin - (set! elapsed 0) - (set! stop? #f))) - ;; if count is in progress, begin a counter object - (if go? - (let* ((c (ly:engraver-make-grob trans 'MeasureCounter col)) - (counter (ly:grob-property c 'count-from))) - (ly:spanner-set-bound! c LEFT col) - (ly:pointer-group-interface::add-grob c 'columns col) - (set! (ly:grob-property c 'count-from) (+ counter elapsed)) - (set! count-spanner c) - (set! elapsed (1+ elapsed)))) - (set! new-measure? #f))))) - (set! last-measure-seen current-bar))) + (set! elapsed 0) + (set! stop? #f))) + ;; If count is in progress, begin a count-spanner. + (if go? + (let* ((c (ly:engraver-make-grob trans 'MeasureCounter col)) + (counter (ly:grob-property c 'count-from))) + (ly:spanner-set-bound! c LEFT col) + (ly:pointer-group-interface::add-grob c 'columns col) + (set! (ly:grob-property c 'count-from) (+ counter elapsed)) + (set! count-spanner c) + (set! elapsed (1+ elapsed)))))) + (set! last-measure-seen current-bar))) ((finalize trans) (if go? diff --git a/scm/script.scm b/scm/script.scm index 6564d5f2d4..c8eb8b39b9 100644 --- a/scm/script.scm +++ b/scm/script.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2000--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2000--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -110,6 +110,13 @@ (script-stencil . (feta . ("halfopen" . "halfopen"))) (direction . ,UP))) + ("halfopenvertical" + . ( + (avoid-slur . outside) + (padding . 0.20) + (script-stencil . (feta . ("halfopenvertical" . "halfopenvertical"))) + (direction . ,UP))) + ("ictus" . ( @@ -270,14 +277,17 @@ (script-stencil . (feta . ("dstaccatissimo" . "ustaccatissimo"))) (padding . 0.20) (skyline-horizontal-padding . 0.10) - (side-relative-direction . ,DOWN))) + (side-relative-direction . ,DOWN) + (toward-stem-shift . 1.0) + (toward-stem-shift-in-column . 0.0))) ("staccato" . ( (script-stencil . (feta . ("staccato" . "staccato"))) (side-relative-direction . ,DOWN) (quantize-position . #t) (avoid-slur . inside) - (toward-stem-shift . 0.5) + (toward-stem-shift . 1.0) + (toward-stem-shift-in-column . 0.0) (padding . 0.20) (skyline-horizontal-padding . 0.10) (script-priority . -100))) diff --git a/scm/skyline.scm b/scm/skyline.scm index 0889414cbc..96b5f67409 100644 --- a/scm/skyline.scm +++ b/scm/skyline.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2013 Mike Solomon +;;;; Copyright (C) 2013--2015 Mike Solomon ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/standalone.scm b/scm/standalone.scm index ee44d43878..f8fd352bc0 100644 --- a/scm/standalone.scm +++ b/scm/standalone.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 1998--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 1998--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify diff --git a/scm/stencil.scm b/scm/stencil.scm index a457087b15..bda7e29a8f 100644 --- a/scm/stencil.scm +++ b/scm/stencil.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2003--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2003--2015 Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -15,29 +15,123 @@ ;;;; You should have received a copy of the GNU General Public License ;;;; along with LilyPond. If not, see . -(define (make-bezier-sandwich-stencil coords thick xext yext) - (let* ((command-list `(moveto - ,(car (list-ref coords 3)) - ,(cdr (list-ref coords 3)) - curveto - ,(car (list-ref coords 0)) - ,(cdr (list-ref coords 0)) - ,(car (list-ref coords 1)) - ,(cdr (list-ref coords 1)) - ,(car (list-ref coords 2)) - ,(cdr (list-ref coords 2)) - curveto - ,(car (list-ref coords 4)) - ,(cdr (list-ref coords 4)) - ,(car (list-ref coords 5)) - ,(cdr (list-ref coords 5)) - ,(car (list-ref coords 6)) - ,(cdr (list-ref coords 6)) - closepath))) - (ly:make-stencil - `(path ,thick `(,@' ,command-list) 'round 'round #t) - xext - yext))) +(define (make-bezier-sandwich-stencil coords thick) + (make-path-stencil + `(moveto + ,(car (list-ref coords 0)) + ,(cdr (list-ref coords 0)) + curveto + ,(car (list-ref coords 1)) + ,(cdr (list-ref coords 1)) + ,(car (list-ref coords 2)) + ,(cdr (list-ref coords 2)) + ,(car (list-ref coords 3)) + ,(cdr (list-ref coords 3)) + curveto + ,(car (list-ref coords 4)) + ,(cdr (list-ref coords 4)) + ,(car (list-ref coords 5)) + ,(cdr (list-ref coords 5)) + ,(car (list-ref coords 0)) + ,(cdr (list-ref coords 0)) + closepath) + thick + 1 + 1 + #t)) + +(define-public (make-bow-stencil + start stop thickness angularity bow-height orientation) + "Create a bow stencil. +It starts at point @var{start}, ends at point @var{stop}. +@var{thickness} is the thickness of the bow. +The higher the value of number @var{angularity}, the more angular the shape of +the bow. +@var{bow-height} determines the height of the bow. +@var{orientation} determines, whether the bow is concave or convex. +Both variables are supplied to support independent usage. + +Done by calculating a horizontal unit-bow first, then moving all control-points +to the correct positions. +Limitation: s-curves are currently not supported. +" + +;;;; Coding steps: +;;;; (1) calculate control-points for a "unit"-bow from '(0 . 0) to '(1 . 0) +;;;; user settable `bow-height' and `thickness' are scaled down. +;;;; (2) move control-points to match `start' and `stop' + + (let* (;; we use a fixed line-width as border for different behaviour + ;; for larger and (very) small lengths + (line-width 0.1) + ;; `start'-`stop' distances + (dx (- (car stop) (car start))) + (dy (- (cdr stop) (cdr start))) + (length-to-print (magnitude (make-rectangular dx dy)))) + + (if (= 0 length-to-print) + empty-stencil + (let* ( + ;;;; (1) calculate control-points for the horizontal unit-bow, + ;; y-values for 2nd/3rd control-points + (outer-control + (* 4/3 (sign orientation) (/ bow-height length-to-print))) + (inner-control + (* (sign orientation) + (- (abs outer-control) (/ thickness length-to-print)))) + ;; x-values for 2nd/3rd control-points depending on `angularity' + (offset-index + (- (* 0.6 angularity) 0.8)) + (left-control + (+ 0.1 (* 0.3 angularity))) + (right-control + (- 1 left-control)) + ;; defining 2nd and 3rd outer control-points + (left-outer-control-point + (cons left-control outer-control)) + (right-outer-control-point + (cons right-control outer-control)) + ;; defining 2nd and 3rd inner control-points + (left-inner-control-point + (cons left-control inner-control)) + (right-inner-control-point + (cons right-control inner-control)) + (coord-list + (list + '(0 . 0) + left-outer-control-point + right-outer-control-point + '(1 . 0) + right-inner-control-point + left-inner-control-point)) + ;;;; (2) move control-points to match `start' and `stop' + (moved-coord-list + (map + (lambda (p) + (cons + (+ (car start) (- (* (car p) dx) (* (cdr p) dy))) + (+ (cdr start) (+ (* (car p) dy) (* (cdr p) dx))))) + coord-list))) + + ;; final stencil + (make-bezier-sandwich-stencil + moved-coord-list + (min (* 2 thickness) line-width)))))) + +(define-public (make-tie-stencil start stop thickness orientation) + (let* (;; For usage in text we choose a little less `height-limit' + ;; than the default for `Tie' + (height-limit 0.7) + (ratio 0.33) + ;; taken from bezier-bow.cc + (F0_1 + (lambda (x) (* (/ 2 PI) (atan (* PI x 0.5))))) + (slur-height + (lambda (w h_inf r_0) (F0_1 (* (/ (* w r_0) h_inf) h_inf)))) + (width (abs (- (car start) (car stop)))) + (angularity 0.5) + (height (slur-height width height-limit ratio))) + (make-bow-stencil start stop thickness angularity height orientation))) (define-public (stack-stencils axis dir padding stils) "Stack stencils @var{stils} in direction @var{axis}, @var{dir}, using @@ -99,78 +193,34 @@ a list of @var{paddings}." stil)) (define (make-parenthesis-stencil - y-extent half-thickness width angularity) + y-extent thickness width angularity orientation) "Create a parenthesis stencil. @var{y-extent} is the Y extent of the markup inside the parenthesis. @var{half-thickness} is the half thickness of the parenthesis. @var{width} is the width of a parenthesis. +@var{orientation} is the orientation of a parenthesis. The higher the value of number @var{angularity}, the more angular the shape of the parenthesis." - (let* ((line-width 0.1) - ;; Horizontal position of baseline that end points run through. - (base-x - (if (< width 0) - (- width) - 0)) - ;; X value farthest from baseline on outside of curve - (outer-x (+ base-x width)) - ;; X extent of bezier sandwich centerline curves - (x-extent (ordered-cons base-x outer-x)) - (bottom-y (interval-start y-extent)) - (top-y (interval-end y-extent)) - - (lower-end-point (cons base-x bottom-y)) - (upper-end-point (cons base-x top-y)) - - (outer-control-x (+ base-x (* 4/3 width))) - (inner-control-x (+ outer-control-x - (if (< width 0) - half-thickness - (- half-thickness)))) - - ;; Vertical distance between a control point - ;; and the end point it connects to. - (offset-index (- (* 0.6 angularity) 0.8)) - (lower-control-y (interval-index y-extent offset-index)) - (upper-control-y (interval-index y-extent (- offset-index))) - - (lower-outer-control-point - (cons outer-control-x lower-control-y)) - (upper-outer-control-point - (cons outer-control-x upper-control-y)) - (upper-inner-control-point - (cons inner-control-x upper-control-y)) - (lower-inner-control-point - (cons inner-control-x lower-control-y))) - - (make-bezier-sandwich-stencil - (list - ;; Step 4: curve through inner control points - ;; to lower end point. - upper-inner-control-point - lower-inner-control-point - lower-end-point - ;; Step 3: move to upper end point. - upper-end-point - ;; Step 2: curve through outer control points - ;; to upper end point. - lower-outer-control-point - upper-outer-control-point - upper-end-point - ;; Step 1: move to lower end point. - lower-end-point) - line-width - (interval-widen x-extent (/ line-width 2)) - (interval-widen y-extent (/ line-width 2))))) + (let* ((start (cons 0 (car y-extent))) + (stop (cons 0 (cdr y-extent))) + (line-width 0.1) + (bow-stil + (make-bow-stencil + start stop thickness angularity width orientation)) + (x-extent (ly:stencil-extent bow-stil X))) + (ly:make-stencil + (ly:stencil-expr bow-stil) + (interval-widen x-extent (/ line-width 2)) + (interval-widen y-extent (/ line-width 2))))) (define-public (parenthesize-stencil stencil half-thickness width angularity padding) "Add parentheses around @var{stencil}, returning a new stencil." (let* ((y-extent (ly:stencil-extent stencil Y)) (lp (make-parenthesis-stencil - y-extent half-thickness (- width) angularity)) + y-extent half-thickness width angularity 1)) (rp (make-parenthesis-stencil - y-extent half-thickness width angularity))) + y-extent half-thickness width angularity -1))) (set! stencil (ly:stencil-combine-at-edge stencil X LEFT lp padding)) (set! stencil (ly:stencil-combine-at-edge stencil X RIGHT rp padding)) stencil)) @@ -434,59 +484,120 @@ then reduce using @var{min-max}: (append (list origin) (reverse (cdr (reverse pointlist)))) pointlist)))) -(define-public (make-connected-path-stencil pointlist thickness - x-scale y-scale connect fill) - "Make a connected path described by the list @var{pointlist}, with -thickness @var{thickness}, and scaled by @var{x-scale} in the X direction -and @var{y-scale} in the Y direction. @var{connect} and @var{fill} are -boolean arguments that specify if the path should be connected or filled, -respectively." - - ;; paths using this routine are designed to begin at point '(0 . 0) - (let* ((origin (list 0 0)) - (boundlist (path-min-max origin pointlist)) - ;; modify pointlist to scale the coordinates - (path (map (lambda (x) - (apply - (if (= 6 (length x)) - (lambda (x1 x2 x3 x4 x5 x6) - (list 'curveto - (* x1 x-scale) - (* x2 y-scale) - (* x3 x-scale) - (* x4 y-scale) - (* x5 x-scale) - (* x6 y-scale))) - (lambda (x1 x2) - (list 'lineto - (* x1 x-scale) - (* x2 y-scale)))) - x)) - pointlist)) - ;; a path must begin with a `moveto' - (prepend-origin (cons (cons 'moveto origin) path)) - ;; if this path is connected, add closepath to the end - (final-path (if connect - (append prepend-origin (list '(closepath))) - prepend-origin)) - (command-list (concatenate final-path))) +(define-public (make-path-stencil path thickness x-scale y-scale fill) + "Make a stencil based on the path described by the list @var{path}, +with thickness @var{thickness}, and scaled by @var{x-scale} in the X +direction and @var{y-scale} in the Y direction. @var{fill} is a boolean +argument that specifies if the path should be filled. Valid path +commands are: moveto rmoveto lineto rlineto curveto rcurveto closepath, +and their standard SVG single letter equivalents: M m L l C c Z z." + + (define (convert-path path origin previous-point) + "Recursive function to standardize command names and +convert any relative path expressions (in @var{path}) to absolute +values. Returns a list of lists. @var{origin} is a pair of x and y +coordinates for the origin point of the path (used for closepath and +reset by moveto commands). @var{previous-point} is a pair of x and y +coordinates for the previous point in the path." + (if (pair? path) + (let* + ((head-raw (car path)) + (rest (cdr path)) + (head (cond + ((memq head-raw '(rmoveto M m)) 'moveto) + ((memq head-raw '(rlineto L l)) 'lineto) + ((memq head-raw '(rcurveto C c)) 'curveto) + ((memq head-raw '(Z z)) 'closepath) + (else head-raw))) + (arity (cond + ((memq head '(lineto moveto)) 2) + ((eq? head 'curveto) 6) + (else 0))) + (coordinates-raw (take rest arity)) + (is-absolute (if (memq head-raw + '(rmoveto m rlineto l rcurveto c)) #f #t)) + (coordinates (if is-absolute + coordinates-raw + ;; convert relative coordinates to absolute by + ;; adding them to previous point values + (map (lambda (c n) + (if (even? n) + (+ c (car previous-point)) + (+ c (cdr previous-point)))) + coordinates-raw + (iota arity)))) + (new-point (if (eq? head 'closepath) + origin + (cons + (list-ref coordinates (- arity 2)) + (list-ref coordinates (- arity 1))))) + (new-origin (if (eq? head 'moveto) + new-point + origin))) + (cons (cons head coordinates) + (convert-path (drop rest arity) new-origin new-point))) + '())) + + (let* ((path-absolute (convert-path path (cons 0 0) (cons 0 0))) + ;; scale coordinates + (path-scaled (if (and (= 1 x-scale) (= 1 y-scale)) + path-absolute + (map (lambda (path-unit) + (map (lambda (c n) + (cond + ((= 0 n) c) + ((odd? n) (* c x-scale)) + (else (* c y-scale)))) + path-unit + (iota (length path-unit)))) + path-absolute))) + ;; a path must begin with a 'moveto' + (path-final (if (eq? 'moveto (car (car path-scaled))) + path-scaled + (append (list (list 'moveto 0 0)) path-scaled))) + ;; remove all commands in order to calculate bounds + (path-headless (map cdr (delete (list 'closepath) path-final))) + (bound-list (path-min-max + (car path-headless) + (cdr path-headless)))) (ly:make-stencil `(path ,thickness - `(,@',command-list) - 'round - 'round - ,(if fill #t #f)) + `(,@',(concatenate path-final)) + 'round + 'round + ,(if fill #t #f)) (coord-translate ((if (< x-scale 0) reverse-interval identity) - (cons (* x-scale (list-ref boundlist 0)) - (* x-scale (list-ref boundlist 1)))) + (cons + (list-ref bound-list 0) + (list-ref bound-list 1))) `(,(/ thickness -2) . ,(/ thickness 2))) (coord-translate ((if (< y-scale 0) reverse-interval identity) - (cons (* y-scale (list-ref boundlist 2)) - (* y-scale (list-ref boundlist 3)))) + (cons + (list-ref bound-list 2) + (list-ref bound-list 3))) `(,(/ thickness -2) . ,(/ thickness 2)))))) +(define-public (make-connected-path-stencil pointlist thickness + x-scale y-scale connect fill) + "Make a connected path described by the list @var{pointlist}, beginning +at point '(0 . 0), with thickness @var{thickness}, and scaled by +@var{x-scale} in the X direction and @var{y-scale} in the Y direction. +@var{connect} and @var{fill} are boolean arguments that specify if the +path should be connected or filled, respectively." + (make-path-stencil + (concatenate + (append + (map (lambda (path-unit) + (case (length path-unit) + ((2) (append (list 'lineto) path-unit)) + ((6) (append (list 'curveto) path-unit)))) + pointlist) + ;; if this path is connected, add closepath to the end + (if connect (list '(closepath)) '()))) + thickness x-scale y-scale fill)) + (define-public (make-ellipse-stencil x-radius y-radius thickness fill) "Make an ellipse of x@tie{}radius @var{x-radius}, y@tie{}radius @code{y-radius}, and thickness @var{thickness} with fill defined by @@ -601,24 +712,117 @@ producing a new stencil." (set! stencil (ly:stencil-add outer inner)) stencil)) +(define-public (flip-stencil axis stil) + "Flip stencil @var{stil} in the direction of @var{axis}. +Value @code{X} (or @code{0}) for @var{axis} flips it horizontally. +Value @code{Y} (or @code{1}) flips it vertically. @var{stil} is +flipped in place; its position, the coordinates of its bounding +box, remains the same." + (let* ( + ;; scale stencil using -1 to flip it and + ;; then restore it to its original position + (xy (if (= axis X) '(-1 . 1) '(1 . -1))) + (flipped-stil (ly:stencil-scale stil (car xy) (cdr xy))) + (flipped-ext (ly:stencil-extent flipped-stil axis)) + (original-ext (ly:stencil-extent stil axis)) + (offset (- (car original-ext) (car flipped-ext))) + (replaced-stil (ly:stencil-translate-axis flipped-stil offset axis))) + replaced-stil)) + (define-public (stencil-with-color stencil color) (ly:make-stencil (list 'color color (ly:stencil-expr stencil)) (ly:stencil-extent stencil X) (ly:stencil-extent stencil Y))) -(define-public (stencil-whiteout stencil) +(define*-public (stencil-whiteout-outline + stil #:optional (thickness 0.3) (color white) + (angle-increments 16) (radial-increments 1)) + "This function works by creating a series of white or @var{color} +stencils radially offset from the original stencil with angles from +0 to 2*pi, at an increment of @code{angle-inc}, and with radii +from @code{radial-inc} to @var{thickness}. @var{thickness} is how big +the white outline is, as a multiple of line-thickness. +@var{radial-increments} is how many copies of the white stencil we make +on our way out to thickness. @var{angle-increments} is how many copies +of the white stencil we make between 0 and 2*pi." + (if (or (not (positive? angle-increments)) + (not (positive? radial-increments))) + (begin + (ly:warning "Both angle-increments and radial-increments must be positive numbers.") + stil) + (let* ((2pi 6.283185307) + (angle-inc (/ 2pi angle-increments)) + (radial-inc (/ thickness radial-increments))) + + (define (circle-plot ang dec radius original-stil new-stil) + ;; ang (angle) and dec (decrement) are in radians, not degrees + (if (<= ang 0) + new-stil + (circle-plot (- ang dec) dec radius original-stil + (ly:stencil-add + new-stil + (ly:stencil-translate original-stil + (cons + (* radius (cos ang)) + (* radius (sin ang)))))))) + + (define (radial-plot radius original-stil new-stil) + (if (<= radius 0) + new-stil + (ly:stencil-add new-stil + (radial-plot + (- radius radial-inc) + original-stil + (circle-plot 2pi angle-inc + radius original-stil empty-stencil))))) + + (let ((whiteout-expr + (ly:stencil-expr + (stencil-with-color + (radial-plot thickness stil empty-stencil) + color)))) + (ly:stencil-add + (ly:make-stencil + `(delay-stencil-evaluation ,(delay whiteout-expr))) + stil))))) + +(define*-public (stencil-whiteout-box stil + #:optional (thickness 0) (blot 0) (color white)) + "@var{thickness} is how far, as a multiple of line-thickness, +the white outline extends past the extents of stencil @var{stil}." (let* - ((x-ext (ly:stencil-extent stencil X)) - (y-ext (ly:stencil-extent stencil Y)) - - ) - - (ly:stencil-add - (stencil-with-color (ly:round-filled-box x-ext y-ext 0.0) - white) - stencil) - )) + ((x-ext (interval-widen (ly:stencil-extent stil X) thickness)) + (y-ext (interval-widen (ly:stencil-extent stil Y) thickness))) + + (ly:stencil-add + (stencil-with-color (ly:round-filled-box x-ext y-ext blot) color) + stil))) + +(define*-public (stencil-whiteout stil + #:optional style thickness (line-thickness 0.1)) + "@var{style}, @var{thickness} and @var{line-thickness} are optional +arguments. If set, @var{style} determines the shape of the white +background. Given @code{'outline} the white background is produced +by @code{stencil-whiteout-outline}, given @code{'rounded-box} it is +produced by @code{stencil-whiteout-box} with rounded corners, given +other arguments (e.g. @code{'box}) or when unspecified it defaults to +@code{stencil-whiteout-box} with square corners. If @var{thickness} is +specified it determines how far, as a multiple of @var{line-thickness}, +the white background extends past the extents of stencil @var{stil}. If +@var{thickness} has not been specified, an appropriate default is chosen +based on @var{style}." + (let ((thick (* line-thickness + (if (number? thickness) + thickness + (cond + ((eq? style 'outline) 3) + ((eq? style 'rounded-box) 3) + (else 0)))))) + (cond + ((eq? style 'outline) (stencil-whiteout-outline stil thick)) + ((eq? style 'rounded-box) (stencil-whiteout-box stil thick (* 2 thick))) + (else (stencil-whiteout-box stil thick))))) (define-public (arrow-stencil-maker start? end?) "Return a function drawing a line from current point to @code{destination}, @@ -739,7 +943,8 @@ with optional arrows of @code{max-size} on start and end controlled by ;; TODO: figure out how to annotate padding nicely ;; TODO: emphasize either padding or min-dist depending on which constraint was active -(define*-public (annotate-spacing-spec layout spacing-spec start-Y-offset next-staff-Y +(define*-public (annotate-spacing-spec layout name spacing-spec + start-Y-offset next-staff-Y #:key (base-color blue)) (let* ((get-spacing-var (lambda (sym) (assoc-get sym spacing-spec 0.0))) (space (get-spacing-var 'basic-distance)) @@ -748,21 +953,27 @@ with optional arrows of @code{max-size} on start and end controlled by (contrast-color (append (cdr base-color) (list (car base-color)))) (min-dist-blocks (<= (- start-Y-offset min-dist) next-staff-Y)) (min-dist-color (if min-dist-blocks contrast-color base-color)) - (basic-annotation (annotate-y-interval layout - "basic-dist" - (cons (- start-Y-offset space) start-Y-offset) - #t - #:color (map (lambda (x) (* x 0.25)) base-color))) - (min-annotation (annotate-y-interval layout - "min-dist" - (cons (- start-Y-offset min-dist) start-Y-offset) - #t - #:color min-dist-color)) - (extra-annotation (annotate-y-interval layout - "extra dist" - (cons next-staff-Y (- start-Y-offset min-dist)) - #t - #:color (map (lambda (x) (* x 0.5)) min-dist-color)))) + (name-string (if (string-null? name) + "" + (simple-format #f " (~a)" name))) + (basic-annotation + (annotate-y-interval layout + (simple-format #f "basic-dist~a" name-string) + (cons (- start-Y-offset space) start-Y-offset) + #t + #:color (map (lambda (x) (* x 0.25)) base-color))) + (min-annotation + (annotate-y-interval layout + (simple-format #f "min-dist~a" name-string) + (cons (- start-Y-offset min-dist) start-Y-offset) + #t + #:color min-dist-color)) + (extra-annotation + (annotate-y-interval layout + (simple-format #f "extra dist~a" name-string) + (cons next-staff-Y (- start-Y-offset min-dist)) + #t + #:color (map (lambda (x) (* x 0.5)) min-dist-color)))) (stack-stencils X RIGHT 0.0 (list diff --git a/scm/tablature.scm b/scm/tablature.scm index e32d712e19..97f688c1d1 100644 --- a/scm/tablature.scm +++ b/scm/tablature.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2009--2012 Marc Hohl +;;;; Copyright (C) 2009--2015 Marc Hohl ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -23,17 +23,18 @@ (let ((style (ly:grob-property grob 'style))) (case style - ((cross) "2cross")))) + ((cross) "2cross") + ((slash) "2slash") + (else #f)))) ;; ensure we only call note head callback when -;; 'style = 'cross +;; style is set to a known value (define-public (tab-note-head::whiteout-if-style-set grob) (let ((style (ly:grob-property grob 'style))) - (if (and (symbol? style) - (eq? style 'cross)) - (stencil-whiteout (ly:note-head::print grob)) - (tab-note-head::print grob)))) + (case style + ((cross slash) (stencil-whiteout-box (ly:note-head::print grob))) + (else (tab-note-head::print grob))))) ;; definitions for the "moderntab" clef: ;; the "moderntab" clef will be added to the list of known clefs, @@ -80,23 +81,33 @@ ;; (dotted) half notes to distinguish them from quarter notes: (define-public (tabvoice::make-double-stem-width-for-half-notes grob) (let ((X-extent (ly:stem::width grob))) - - ;; is the note a (dotted) half note? - (if (= 1 (ly:grob-property grob 'duration-log)) - ;; yes -> return double stem width - (cons (car X-extent) (+ 0.5 (* 2 (cdr X-extent)))) - ;; no -> return simple stem width - X-extent))) + ;; does the stem exist and is it on a (dotted) half note? + (if (and (not (equal? X-extent empty-interval)) + (= 1 (ly:grob-property grob 'duration-log))) + + ;; yes -> return double stem X-extent + (let* ((single-stem-width (- (cdr X-extent) (car X-extent))) + (separation (ly:grob-property grob 'double-stem-separation 0.5)) + (total-width (+ single-stem-width separation)) + (half-width (/ total-width 2))) + (cons (- half-width) half-width)) + ;; no -> return simple stem X-extent + X-extent))) (define-public (tabvoice::draw-double-stem-for-half-notes grob) - (let ((stem (ly:stem::print grob))) - - ;; is the note a (dotted) half note? - (if (= 1 (ly:grob-property grob 'duration-log)) - ;; yes -> draw double stem - (ly:stencil-combine-at-edge stem X RIGHT stem 0.5) - ;; no -> draw simple stem - stem))) + (let ((stem-stencil (ly:stem::print grob))) + ;; does the stem exist and is it on a (dotted) half note? + (if (and (ly:stencil? stem-stencil) + (= 1 (ly:grob-property grob 'duration-log))) + + ;; yes -> draw double stem + (let* ((separation (ly:grob-property grob 'double-stem-separation 0.5)) + (half-separation (/ separation 2))) + (ly:stencil-add + (ly:stencil-translate-axis stem-stencil (- half-separation) X) + (ly:stencil-translate-axis stem-stencil half-separation X))) + ;; no -> draw simple stem (or none at all) + stem-stencil))) ;; as default, the glissando line between fret numbers goes ;; upwards, here we have a function to correct this behavior: @@ -223,9 +234,10 @@ ;; a callback for custom fret labels -(define-public ((tab-note-head::print-custom-fret-label fret) grob) - (ly:grob-set-property! grob 'text fret) +(define ((tab-note-head::print-custom-fret-label fret) grob) + (ly:grob-set-property! grob 'text (make-vcenter-markup fret)) (tab-note-head::print grob)) +(export tab-note-head::print-custom-fret-label) (define-public (tab-note-head::print grob) (define (is-harmonic? grob) @@ -254,9 +266,7 @@ (offset-factor (assoc-get 'head-offset details 3/5)) (column-offset (* offset-factor (interval-length - (ly:stencil-extent - (grob-interpret-markup grob "8") - X))))) + (ly:stencil-extent ref-grob X))))) (if (is-harmonic? grob) (set! output-grob (harmonic-proc output-grob @@ -270,9 +280,10 @@ cautionary-width cautionary-angularity cautionary-padding))) - (ly:stencil-translate-axis (centered-stencil output-grob) - column-offset - X))) + (ly:stencil-translate-axis + (ly:stencil-aligned-to output-grob X CENTER) + column-offset + X))) ;; Harmonic definitions diff --git a/scm/text.scm b/scm/text.scm index 1454105912..d41f7f1b6c 100644 --- a/scm/text.scm +++ b/scm/text.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2011--2012 Bertrand Bordage +;;;; Copyright (C) 2011--2015 Bertrand Bordage ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scm/time-signature-settings.scm b/scm/time-signature-settings.scm index 82e22fe591..2649092593 100644 --- a/scm/time-signature-settings.scm +++ b/scm/time-signature-settings.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2009--2012 Carl Sorensen +;;;; Copyright (C) 2009--2015 Carl Sorensen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -26,7 +26,7 @@ ;;; time signature. Each default-properties set can contain the ;;; following entries: ;;; -;;; (baseMoment . (numerator . denominator)) +;;; (baseMoment . (/ numerator denominator)) ;;; (beatStructure . structure-list) ;;; (beamExceptions . (alist of beam exceptions that don't follow beats)) ;;; @@ -37,7 +37,7 @@ ;;; ;;; grouping-rules is an alist containing (beam-type . grouping-list) entries ;;; -;;; beam-type is (numerator . denominator) +;;; beam-type is the length as a rational number ;;; grouping-list is a list that specifies the ;;; number of stems of the given duration that are grouped in a beamed unit. ;;; For an exception, the duration used is beam-type. For measureBeats, @@ -45,33 +45,32 @@ ;;; ;;; If an exception is specified for a given beam-type, it will apply to all ;;; beams of shorter durations that don't have an individual exception, so -;;; ((1 . 8) . (3 3 2)) +;;; (1/8 . (3 3 2)) ;;; will cause all primary beams to be broken at 3/8, 6/8, and 8/8. ;;; -;;; ((1 . 32) . (16 8 4 4)) +;;; (1/32 . (16 8 4 4)) ;;; will cause all 1/32, 1/64, and 1/128 beams to be broken at 1/2, 3/4, ;;; 7/8, and 8/8. ;;; +;;; Tuplets are referenced using their actual (scaled) length, so +;;; a 3/2 tuplet of the 1/8 kind would get exceptions looked up +;;; under 1/12. +;;; ;;; If no values are given for baseMoment and measureBeats, default values ;;; will be assigned: -;;; baseMoment gets the value (ly:make-moment 1 time-signature-denominator) +;;; baseMoment gets the value (/ time-signature-denominator) ;;; beatStructure gets a list of (3 3 3 ...), where the number of entries is the ;;; number of beats, each containing 3 base-moments, if the time ;;; signature numerator is greater than 3 and divisible by 3, and ;;; a list of (1 1 1 ...), where the number of entries is the ;;; number of base moments in a measure otherwise. -;;; -;;; NOTE: numerator is kept in beam-type because of -;;; tuplets, e.g. (2 . 24) = (2 . 3) * (1 . 8) -;;; for eighth-note triplets. -;;; (define-public default-time-signature-settings '( ;; in 2/2 time: ;; use defaults, but end beams with 32nd notes each 1 4 beat ((2 . 2) . - ((beamExceptions . ((end . (((1 . 32) . (8 8 8 8)))))))) + ((beamExceptions . ((end . ((1/32 . (8 8 8 8)))))))) ;; in 2/4, 2/8 and 2/16 time: ;; use defaults, so no entries are necessary @@ -80,7 +79,7 @@ ;; use defaults, but end beams with 32nd notes and higher each 1 4 beat ((3 . 2) . - ((beamExceptions . ((end . (((1 . 32) . (8 8 8 8 8 8)))))))) + ((beamExceptions . ((end . ((1/32 . (8 8 8 8 8 8)))))))) ;; in 3 4 time: ;; use defaults, but combine all beats into a unit if possible @@ -89,12 +88,12 @@ ;; in order to avoid beaming every beam type for the entire measure, we set ;; triplets back to every beat. ((3 . 4) . - ((beamExceptions . ((end . (((1 . 8) . (6)) ;1/8 note whole measure - ((1 . 12) . (3 3 3)))))))) ;Anything shorter by beat + ((beamExceptions . ((end . ((1/8 . (6)) ;1/8 note whole measure + (1/12 . (3 3 3)))))))) ;Anything shorter by beat ;; in 3 8 time: ;; beam entire measure together - ((3 . 8) . ((beamExceptions . ((end . (((1 . 8) . (3)))))))) + ((3 . 8) . ((beamExceptions . ((end . ((1/8 . (3)))))))) ;; in 3 16 time: ;; use defaults -- no entries necessary @@ -102,7 +101,7 @@ ;; in 4 2 time: ;; use defaults, but end beams with 16th notes or finer each 1 4 beat ((4 . 2) . - ((beamExceptions . ((end . (((1 . 16) . (4 4 4 4 4 4 4 4)))))))) + ((beamExceptions . ((end . ((1/16 . (4 4 4 4 4 4 4 4)))))))) ;; in 4 4 (common) time: ;; use defaults, but combine beats 1,2 and 3,4 if only 8th notes @@ -110,8 +109,8 @@ ;; ly/engraver-init.ly where the default time signature is set ;; are set ((4 . 4) . - ((beamExceptions . ((end . (((1 . 8) . (4 4)) ; 1/8 notes half measure - ((1 . 12) . (3 3 3 3)))))))) ;Anything shorter by beat + ((beamExceptions . ((end . ((1/8 . (4 4)) ; 1/8 notes half measure + (1/12 . (3 3 3 3)))))))) ;Anything shorter by beat ;; in 4/8 time: ;; combine beats 1 and 2, so beam in 2 @@ -123,7 +122,7 @@ ;; in 6 4 time: ;; use defaults, but end beams with 32nd or finer each 1/4 beat ((6 . 4) . - ((beamExceptions . ((end . (((1 . 16) . (4 4 4 4 4 4)))))))) + ((beamExceptions . ((end . ((1/16 . (4 4 4 4 4 4)))))))) ;; in 6 8 time: ;; use defaults, so no entries necessary @@ -134,7 +133,7 @@ ;; in 9 4 time: ;; use defaults, but end beams with 32nd or finer each 1 4 beat ((9 . 4) . - ((beamExceptions . ((end . (((1 . 32) . (8 8 8 8 8 8 8 8)))))))) + ((beamExceptions . ((end . ((1/32 . (8 8 8 8 8 8 8 8)))))))) ;; in 9 8 time ;; use defaults, so no entries necessary @@ -145,7 +144,7 @@ ;; in 12 4 time: ;; use defaults, but end beams with 32nd or finer notes each 1 4 beat ((12 . 4) . - ((beamExceptions . ((end . (((1 . 32) . (8 8 8 8 8 8 8 8 8 8 8 8)))))))) + ((beamExceptions . ((end . ((1/32 . (8 8 8 8 8 8 8 8 8 8 8 8)))))))) ;; in 12 8 time: ;; use defaults, so no entries necessary @@ -297,6 +296,7 @@ a fresh copy of the list-head is made." ;;;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;;; Formatting of complex/compound time signatures +; There ought to be a \join-line sep {...} command (define (insert-markups l m) (let ((ll (reverse l))) (let join-markups ((markups (list (car ll))) @@ -312,25 +312,87 @@ a fresh copy of the list-head is made." (den (car revargs)) (nums (reverse (cdr revargs)))) (make-override-markup '(baseline-skip . 0) - (make-number-markup (make-left-column-markup (list (make-center-column-markup (list (make-line-markup (insert-markups nums "+")) - den)))))))) + den))))))) -(define (format-complex-compound-time time-sig) - (make-override-markup '(baseline-skip . 0) - (make-number-markup - (make-line-markup - (insert-markups (map format-time-fraction time-sig) - (make-vcenter-markup "+")))))) +(define (format-time-numerator time-sig) + (make-vcenter-markup (number->string (car time-sig)))) -(define-public (format-compound-time time-sig) - (cond - ((not (pair? time-sig)) (null-markup)) - ((pair? (car time-sig)) (format-complex-compound-time time-sig)) - (else (format-time-fraction time-sig)))) +(define (format-time-element time-sig) + (cond ((number-pair? time-sig) + (format-time-fraction (list (car time-sig) (cdr time-sig)))) + ((pair? (cdr time-sig)) + (format-time-fraction time-sig)) + (else + (format-time-numerator time-sig)))) + +(define (format-time-list time-sig) + (make-override-markup '(baseline-skip . 0) + (make-line-markup + (insert-markups (map format-time-element time-sig) + (make-vcenter-markup "+"))))) + +(define (format-compound-time time-sig) + (make-number-markup + (cond + ((number? time-sig) (format-time-element (list time-sig))) + ((number-pair? time-sig) + (format-time-element (list (car time-sig) (cdr time-sig)))) + ((pair? (car time-sig)) (format-time-list time-sig)) + (else (format-time-element time-sig))))) + +(define-markup-command (compound-meter layout props time-sig) + (number-or-pair?) + #:category music + "Draw a numeric time signature. + +@lilypond[verbatim,quote] +\\markup { + \\column { + \\line { Single number: \\compound-meter #3 } + \\line { Conventional: \\compound-meter #'(4 . 4) + or \\compound-meter #'(4 4) } + \\line { Compound: \\compound-meter #'(2 3 8) } + \\line { Single-number compound: \\compound-meter #'((2) (3)) } + \\line { Complex compound: \\compound-meter #'((2 3 8) (3 4)) } + } +} +@end lilypond +" + (interpret-markup layout props (format-compound-time time-sig))) + +(add-simple-time-signature-style 'numbered make-compound-meter-markup) + +(add-simple-time-signature-style 'single-digit + (lambda (fraction) (make-compound-meter-markup (car fraction)))) +;;;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +;;; Formatting of symbolic time signatures + +(define-public (make-glyph-time-signature-markup style fraction) + "Make markup for a symbolic time signature. If the music font does not have a glyph for the requested style and fraction, issue a warning and make a numbered time signature instead." + (make-first-visible-markup + (list (make-musicglyph-markup (string-append + "timesig." + (symbol->string style) + (number->string (car fraction)) + (number->string (cdr fraction)))) + (make-compound-meter-markup fraction)))) + +(define-public (make-c-time-signature-markup fraction) + "Make markup for the `C' time signature style." + (let ((n (car fraction)) + (d (cdr fraction))) + ; check specific fractions to avoid warnings when no glyph exists + (if (or (and (= n 2) (= d 2)) + (and (= n 4) (= d 4))) + (make-glyph-time-signature-markup 'C fraction) + (make-compound-meter-markup fraction)))) + +(add-simple-time-signature-style 'C make-c-time-signature-markup) +(add-simple-time-signature-style 'default make-c-time-signature-markup) ;;;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;;; Measure length calculation of (possibly complex) compound time signatures diff --git a/scm/time-signature.scm b/scm/time-signature.scm new file mode 100644 index 0000000000..22bd85df39 --- /dev/null +++ b/scm/time-signature.scm @@ -0,0 +1,35 @@ +;;;; This file is part of LilyPond, the GNU music typesetter. +;;;; +;;;; Copyright (C) 2014--2015 Daniel Eble +;;;; +;;;; LilyPond is free software: you can redistribute it and/or modify +;;;; it under the terms of the GNU General Public License as published by +;;;; the Free Software Foundation, either version 3 of the License, or +;;;; (at your option) any later version. +;;;; +;;;; LilyPond is distributed in the hope that it will be useful, +;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;;; GNU General Public License for more details. +;;;; +;;;; You should have received a copy of the GNU General Public License +;;;; along with LilyPond. If not, see . + +(define-public (ly:time-signature::print grob) + "Print routine for time signatures." + (let* ((fraction (ly:grob-property grob 'fraction '(4 . 4))) + (style (ly:grob-property grob 'style 'default)) + (proc (assoc-get style time-signature-style-markup-procedures)) + (markup (if (procedure? proc) + (proc fraction) + (make-glyph-time-signature-markup style fraction)))) + (grob-interpret-markup grob markup))) + +(define-public (add-simple-time-signature-style style proc) + "Specify the procedure @{proc} returning markup for a time signature +style @var{style}. The procedure is called with one argument, the +pair @code{(@var{numerator} . @var{denominator})}." + (set! time-signature-style-markup-procedures + (acons style proc time-signature-style-markup-procedures))) + +(define-session time-signature-style-markup-procedures `()) diff --git a/scm/titling.scm b/scm/titling.scm index b5f8b1bb8a..4bb464ae68 100644 --- a/scm/titling.scm +++ b/scm/titling.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2004--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2004--2015 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -23,7 +23,7 @@ ;;;;;;;;;;;;;;;;;; -(define-public ((marked-up-headfoot what-odd what-even) +(define ((marked-up-headfoot what-odd what-even) layout scopes page-number is-last-bookpart is-bookpart-last-page) "Read variables @var{what-odd}, @var{what-even} from @var{layout}, and interpret them as markup. The @var{props} argument will include @@ -48,6 +48,7 @@ variables set in @var{scopes} and @code{page:is-bookpart-last-page}, (cdr entry))) alist)) alists)) + (number-type (get 'page-number-type)) (pgnum-alist (list (cons 'header:tagline @@ -56,7 +57,7 @@ variables set in @var{scopes} and @code{page:is-bookpart-last-page}, (cons 'page:is-last-bookpart is-last-bookpart) (cons 'page:is-bookpart-last-page is-bookpart-last-page) (cons 'page:page-number-string - (number->string page-number)) + (number-format number-type page-number)) (cons 'page:page-number page-number))) (props (append (list pgnum-alist) @@ -71,8 +72,9 @@ variables set in @var{scopes} and @code{page:is-bookpart-last-page}, (markup? (get what-even))) (get what-even) (get what-odd)))) +(export marked-up-headfoot) -(define-public ((marked-up-title what) layout scopes) +(define ((marked-up-title what) layout scopes) "Read variables @var{what} from @var{scopes}, and interpret it as markup. The @var{props} argument will include variables set in @var{scopes} (prefixed with `header:'." @@ -101,3 +103,4 @@ with `header:'." (if (markup? markup) (interpret-markup layout props markup) empty-stencil))) +(export marked-up-title) diff --git a/scm/to-xml.scm b/scm/to-xml.scm index 2407fe3766..112c530565 100644 --- a/scm/to-xml.scm +++ b/scm/to-xml.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2003--2012 Han-Wen Nienhuys +;;;; Copyright (C) 2003--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify diff --git a/scm/translation-functions.scm b/scm/translation-functions.scm index 9bc12cc53c..22f8648c31 100644 --- a/scm/translation-functions.scm +++ b/scm/translation-functions.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; (c) 1998--2012 Han-Wen Nienhuys +;;;; (c) 1998--2015 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify @@ -39,32 +39,37 @@ way the transposition number is displayed." ;; metronome marks (define-public (format-metronome-markup event context) - (let ((hide-note (ly:context-property context 'tempoHideNote #f)) - (text (ly:event-property event 'text)) - (dur (ly:event-property event 'tempo-unit)) - (count (ly:event-property event 'metronome-count))) - - (metronome-markup text dur count hide-note))) - -(define-public (metronome-markup text dur count hide-note) - (let* ((note-mark (if (and (not hide-note) (ly:duration? dur)) - (make-smaller-markup - (make-note-by-number-markup (ly:duration-log dur) - (ly:duration-dot-count dur) - 1)) - #f)) + (let ((hide-note (ly:context-property context 'tempoHideNote #f)) + (text (ly:event-property event 'text)) + (dur (ly:event-property event 'tempo-unit)) + (count (ly:event-property event 'metronome-count))) + (metronome-markup text dur count hide-note))) +(export format-metronome-markup) + +(define (metronome-markup text dur count hide-note) + (let* ((note-mark + (if (and (not hide-note) (ly:duration? dur)) + (make-smaller-markup + (make-note-by-number-markup + (ly:duration-log dur) + (ly:duration-dot-count dur) + UP)) + #f)) (count-markup (cond ((number? count) (if (> count 0) - (make-simple-markup (number->string count)) + (make-simple-markup + (number->string count)) #f)) ((pair? count) (make-concat-markup (list - (make-simple-markup (number->string (car count))) + (make-simple-markup + (number->string (car count))) (make-simple-markup " ") (make-simple-markup "–") (make-simple-markup " ") - (make-simple-markup (number->string (cdr count)))))) + (make-simple-markup + (number->string (cdr count)))))) (else #f))) (note-markup (if (and (not hide-note) count-markup) (make-concat-markup @@ -242,7 +247,9 @@ Will look for predefined fretboards if @code{predefinedFretboardTable} is not @code {#f}. If @var{rest} is present, it contains the @code{FretBoard} grob, and a fretboard will be created. Otherwise, a list of @code{(string fret finger)} lists will -be returned." +be returned. +If the context-property @code{supportNonIntegerFret} is set @code{#t}, +micro-tones are supported for TabStaff, but not not for FretBoards." ;; helper functions @@ -351,7 +358,11 @@ notes?" (and (or (and (not restrain-open-strings) (zero? fret)) (>= fret minimum-fret)) - (integer? fret) + (if (and + (ly:context-property context 'supportNonIntegerFret #f) + (null? rest)) + (integer? (truncate fret)) + (integer? fret)) (close-enough fret)))) (define (open-string string pitch) @@ -367,7 +378,9 @@ the current tuning?" (if (< this-fret 0) (ly:warning (_ "Negative fret for pitch ~a on string ~a") (car pitch-entry) string) - (if (not (integer? this-fret)) + (if (and + (not (integer? this-fret)) + (not (ly:context-property context 'supportNonIntegerFret #f))) (ly:warning (_ "Missing fret for pitch ~a on string ~a") (car pitch-entry) string))) (delete-free-string string) @@ -502,10 +515,18 @@ chords. Returns a placement-list." (cons tuning (map (lambda (x) (shift-octave x -1)) pitches)))))))) + ;; TODO: Does it make sense to have additional bass strings in a fret-diagram? + (if (and (not (null? rest)) + (not (null? (ly:context-property context 'additionalBassStrings)))) + (ly:warning "additional bass strings are not supported by FretBoards")) + ;; body of determine-frets (let* ((predefined-fret-table (ly:context-property context 'predefinedDiagramTable)) - (tunings (ly:context-property context 'stringTunings)) + (tunings + (append + (ly:context-property context 'stringTunings) + (ly:context-property context 'additionalBassStrings '()))) (string-count (length tunings)) (grob (if (null? rest) '() (car rest))) (pitches (map (lambda (x) (ly:event-property x 'pitch)) notes)) @@ -563,24 +584,56 @@ chords. Returns a placement-list." ;; The fret letter is taken from 'fretLabels if present (define-public (fret-letter-tablature-format context string-number fret-number) - (let ((labels (ly:context-property context 'fretLabels))) - (make-vcenter-markup - (cond - ((= 0 (length labels)) - (string (integer->char (+ fret-number (char->integer #\a))))) - ((and (<= 0 fret-number) (< fret-number (length labels))) - (list-ref labels fret-number)) - (else - (ly:warning (_ "No label for fret ~a (on string ~a); + (let* ((labels (ly:context-property context 'fretLabels)) + (string-tunings (ly:context-property context 'stringTunings)) + (string-count (length string-tunings)) + (letter + (cond + ((= 0 (length labels)) + (string (integer->char (+ fret-number (char->integer #\a))))) + ((and (<= 0 fret-number) (< fret-number (length labels))) + (list-ref labels fret-number)) + (else + (ly:warning + (_ "No label for fret ~a (on string ~a); only ~a fret labels provided") - fret-number string-number (length labels)) - "."))))) + fret-number string-number (length labels)) + "."))) + (add-bass-string-nr ;; starting at zero + (- string-number string-count 1))) + (make-translate-scaled-markup '(0 . -0.5) + ;; For additional bass strings, we add zero up to three "/"-signs before + ;; the letter, even more bass strings will get numbers, starting with "4". + ;; In the rare case such a string isn't played open, we put out, eg."4b" + (make-concat-markup + (if (> string-number (+ string-count 4)) + (list (number->string add-bass-string-nr) + (if (zero? fret-number) "" letter)) + (list (make-string (max 0 add-bass-string-nr) #\/) + letter)))))) ;; Display the fret number as a number (define-public (fret-number-tablature-format context string-number fret-number) - (make-vcenter-markup - (format #f "~a" fret-number))) + (if (integer? fret-number) + (make-vcenter-markup + (format #f "~a" fret-number)) + ;; for non-integer fret-number print p.e. "2½" + (let* ((whole-part (truncate fret-number)) + (remaining (- fret-number whole-part)) + (fret + (if (and (zero? whole-part) (not (zero? remaining))) + "" + (format #f "~a" whole-part))) + (frac + (if (zero? remaining) + "" + (format #f "~a" remaining)))) + (make-concat-markup + (list (make-vcenter-markup fret) + (make-vcenter-markup + ;; the value `-2.5' is my choice + (make-fontsize-markup -2.5 frac))))))) ;; The 5-string banjo has got an extra string, the fifth (duh), which ;; starts at the fifth fret on the neck. Frets on the fifth string @@ -605,8 +658,12 @@ only ~a fret labels provided") (define-public (tablature-position-on-lines context string-number) (let* ((string-tunings (ly:context-property context 'stringTunings)) (string-count (length string-tunings)) + (string-nr + (if (> string-number (length string-tunings)) + (1+ (length string-tunings)) + string-number)) (string-one-topmost (ly:context-property context 'stringOneTopmost)) - (staff-line (- (* 2 string-number) string-count 1))) + (staff-line (- (* 2 string-nr) string-count 1))) (if string-one-topmost (- staff-line) staff-line))) @@ -614,16 +671,19 @@ only ~a fret labels provided") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; bar numbers -(define-public ((every-nth-bar-number-visible n) barnum mp) +(define ((every-nth-bar-number-visible n) barnum mp) (= 0 (modulo barnum n))) +(export every-nth-bar-number-visible) -(define-public ((modulo-bar-number-visible n m) barnum mp) +(define ((modulo-bar-number-visible n m) barnum mp) (and (> barnum 1) (= m (modulo barnum n)))) +(export modulo-bar-number-visible) -(define-public ((set-bar-number-visibility n) tr) +(define ((set-bar-number-visibility n) tr) (let ((bn (ly:context-property tr 'currentBarNumber))) (ly:context-set-property! tr 'barNumberVisibility (modulo-bar-number-visible n (modulo bn n))))) +(export set-bar-number-visibility) (define-public (first-bar-number-invisible barnum mp) (> barnum 1)) @@ -668,43 +728,71 @@ only ~a fret labels provided") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; percent repeat counters -(define-public ((every-nth-repeat-count-visible n) count context) +(define ((every-nth-repeat-count-visible n) count context) (= 0 (modulo count n))) +(export every-nth-repeat-count-visible) (define-public (all-repeat-counts-visible count context) #t) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; make-engraver helper macro - -(defmacro-public make-engraver forms - "Helper macro for creating Scheme engravers. - -The usual form for an engraver is an association list (or alist) -mapping symbols to either anonymous functions or to another such -alist. - -@code{make-engraver} accepts forms where the first element is either -an argument list starting with the respective symbol, followed by the -function body (comparable to the way @code{define} is used for -defining functions), or a single symbol followed by subordinate forms -in the same manner. You can also just make an alist pair -literally (the @samp{car} is quoted automatically) as long as the -unevaluated @samp{cdr} is not a pair. This is useful if you already -have defined your engraver functions separately. - -Symbols mapping to a function would be @code{initialize}, -@code{start-translation-timestep}, @code{process-music}, -@code{process-acknowledged}, @code{stop-translation-timestep}, and -@code{finalize}. Symbols mapping to another alist specified in the -same manner are @code{listeners} with the subordinate symbols being -event classes, and @code{acknowledgers} and @code{end-acknowledgers} -with the subordinate symbols being interfaces." - (let loop ((forms forms)) - (if (cheap-list? forms) - `(list - ,@(map (lambda (form) - (if (pair? (car form)) - `(cons ',(caar form) (lambda ,(cdar form) ,@(cdr form))) - `(cons ',(car form) ,(loop (cdr form))))) - forms)) - forms))) +;; pitch recognition + +(define-public (make-semitone->pitch pitches) + "Convert @var{pitches}, an unordered list of note values +covering (after disregarding octaves) all absolute pitches in need of +conversion, into a function converting semitone numbers (absolute +pitch missing enharmonic information) back into note values. + +For a key signature without accidentals +@example +c cis d es e f fis g gis a bes b +@end example +might be a good choice, covering Bb major to A major and their +parallel keys, and melodic/harmonic C minor to A minor." + ;; TODO: short-circuit lcm calculation once we know it will be large + (let* ((size (apply lcm (map (lambda (pitch) + (denominator (/ (ly:pitch-tones pitch) 6))) + pitches))) + ;; Normal tunings need 12 steps per octave, quartertone + ;; tunings 24, Makam needs 108. But microtunings might cause + ;; trouble. + (lookup (if (> size 400) + (make-hash-table) + (make-vector size #f)))) + (for-each + (lambda (pitch) + (let* ((rawoct (/ (ly:pitch-tones pitch) 6)) + (oct (floor rawoct)) + (ref (- rawoct oct)) + (val (ly:pitch-transpose pitch + (ly:make-pitch (- oct) 0)))) + (if (hash-table? lookup) + (hashv-set! lookup ref val) + (vector-set! lookup (* size ref) val)))) + pitches) + (lambda (semitone) + "Convert @var{semitone} numbers into note values. If the +originally specified list of pitches does not contain a note +corresponding to @var{semitone} (disregarding octaves), @code{#f} is +returned." + (let* ((rawoct (/ semitone 12)) + (oct (floor rawoct)) + (ref (- rawoct oct)) + (val (if (hash-table? lookup) + (hashv-ref lookup ref) + (let ((ref (* (vector-length lookup) ref))) + (and (integer? ref) + (vector-ref lookup ref)))))) + (and val + (ly:pitch-transpose val (ly:make-pitch oct 0))))))) + +(define ((shift-semitone->pitch key semitone->pitch) semitone) + "Given a function @var{semitone->pitch} converting a semitone number +into a note value for a lookup table created in relation to@tie{}C, +returns a corresponding function in relation to @var{key}. The note +values returned by this function differ only enharmonically from the +original @var{semitone->pitch} function." + (ly:pitch-transpose (semitone->pitch (- semitone (* 2 (ly:pitch-tones key)))) + key)) + +(export shift-semitone->pitch) diff --git a/scm/x11-color.scm b/scm/x11-color.scm index f3d65b90c2..b9cb8abfb8 100644 --- a/scm/x11-color.scm +++ b/scm/x11-color.scm @@ -1,6 +1,6 @@ ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; -;;;; Copyright (C) 2005--2012 Bernard Hurley +;;;; Copyright (C) 2005--2015 Bernard Hurley ;;;; ;;;; LilyPond is free software: you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by diff --git a/scripts/abc2ly.py b/scripts/abc2ly.py index 77d47d7dcd..752f97f3be 100644 --- a/scripts/abc2ly.py +++ b/scripts/abc2ly.py @@ -1203,6 +1203,9 @@ def try_parse_bar (str,state): clear_bar_acc(state) close_beam_state(state) + if str[:1] == '}': + close_beam_state(state) + if bs <> None or state.next_bar != '': if state.parsing_tuplet: state.parsing_tuplet =0 diff --git a/scripts/auxiliar/fixcc.py b/scripts/auxiliar/fixcc.py index 6987ee1f2f..7ed9271acc 100755 --- a/scripts/auxiliar/fixcc.py +++ b/scripts/auxiliar/fixcc.py @@ -39,7 +39,7 @@ GLOBAL_CXX = 'GC++' CXX = 'C++' verbose_p = 0 indent_p = 1 -REQUIRED_ASTYLE_VERSION = "Artistic Style Version 2.02" +PREFERRED_ASTYLE_VERSION = "Artistic Style Version 2.04" rules = { @@ -50,7 +50,7 @@ rules = { ], CXX: [ - # space before parenthesis open + # space before parenthesis open; astyle -xd does this except for foo(). ('([\w\)\]])\(', '\\1 ('), # delete inline double spaces ('(\S) +', '\\1 '), @@ -338,6 +338,10 @@ def nitpick_file (outdir, file): indent_file (fixt) def indent_file (file): + # Astyle aborts on unrecognized options, + # so wait until everyone has 2.04 before considering: + # --attach-namespaces --indent-namespaces \ + # --max-code-length=80 --pad-first-paren-out \ astyle = '''astyle\ --options=none --quiet -n \ --style=gnu --indent=spaces=2 \ @@ -361,6 +365,7 @@ fixcc [OPTION]... FILE... Options: --help --lazy skip astyle, if no changes + --sloppy accept any astyle version --verbose --test @@ -383,6 +388,8 @@ def do_options (): indent_p = 0 elif o == '--outdir': outdir = a + elif o == '--sloppy': + PREFERRED_ASTYLE_VERSION = "Artistic Style" elif o == '--verbose': verbose_p = 1 elif o == '--test': @@ -399,7 +406,7 @@ def check_astyle_version(): cmd = "astyle --version" process = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE) stdout, stderr = process.communicate() - if REQUIRED_ASTYLE_VERSION in stderr: + if PREFERRED_ASTYLE_VERSION in stderr: return True return False @@ -410,11 +417,13 @@ socketdir = '/tmp/fixcc' socketname = 'fixcc%d' % os.getpid () def main (): - if not check_astyle_version(): - print "Error: we require %s" % REQUIRED_ASTYLE_VERSION - print "Sorry, no higher (or lower) versions allowed" - sys.exit(1) files = do_options () + if not check_astyle_version(): + print "Warning: try to use %s." % PREFERRED_ASTYLE_VERSION + print "Please limit use of this version to files with changed code." + if len(files) > 4: + print "Too many files with this version. See `astyle --help`" + sys.exit(1) if outdir and not os.path.isdir (outdir): os.makedirs (outdir) for i in files: @@ -450,7 +459,7 @@ typedef struct _t_ligature typedef std::map < AFM_Ligature const *, int > Bar; /** - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys */ /* || @@ -489,7 +498,7 @@ i while (foe); squiggle. extent; - 1 && * unsmob_moment (lf); + 1 && * Moment::unsmob (lf); line_spanner_ = make_spanner ("DynamicLineSpanner", rq ? rq->*self_scm (): SCM_EOL); case foo: k; diff --git a/scripts/auxiliar/lily-git.tcl b/scripts/auxiliar/lily-git.tcl index a734269ed8..8a90c48ba6 100755 --- a/scripts/auxiliar/lily-git.tcl +++ b/scripts/auxiliar/lily-git.tcl @@ -1,7 +1,7 @@ #!/usr/bin/wish # GUI interface for common LilyPond git repository commands -# Copyright 2009--2012 by Johannes Schindelin and Carl Sorensen +# Copyright 2009--2015 by Johannes Schindelin and Carl Sorensen # package require Tk diff --git a/scripts/auxiliar/make-countdown-announcement.sh b/scripts/auxiliar/make-countdown-announcement.sh new file mode 100755 index 0000000000..4639987665 --- /dev/null +++ b/scripts/auxiliar/make-countdown-announcement.sh @@ -0,0 +1,280 @@ +#!/bin/bash + +# convert a Google code CSV file into a countdown announcement +# +# USAGE: +# make-countdown-announcement.sh NEXT_DEADLINE_DATE [PATCH-MEISTER] +# OR +# make-countdown-announcement.sh NEXT_DEADLINE_DATE [PATCH-MEISTER] > OUTPUT-FILE +# +# EXAMPLES: +# make-countdown-announcement.sh "Jan 1, 2001" "John Doe" +# make-countdown-announcement.sh "Jan 1, 2001" John +# make-countdown-announcement.sh "Jan 1, 2001" > countdown.txt + + +CSV_FILE=lilypond-issues.csv # comma-separated values +TSV_FILE=lilypond-issues.tsv # tab-separated values +URL_BASE="https://code.google.com/p/lilypond/issues" +QUERY_STR="q=Patch%3Apush%2Ccountdown%2Creview%2Cnew%2Cwaiting&colspec=Patch%20Owner%20ID%20Summary&sort=patch" +DEADLINE=$1 +PATCH_MEISTER=${2:-"The Patch Meister"} +MAILMAP=' +"adam.spiers","Adam Spiers" +"aleksandr.andreev","Aleksandr Andreev" +"benko.pal","Benkő Pál" +"bordage.bertrand","Bertrand Bordage" +"brownian.box","Dmytro O. Redchuk" +"Carl.D.Sorensen","Carl Sorensen" +"carlopeterson","Carl Peterson" +"colinghall","Colin Hall" +"ColinPKCampbell","Colin Campbell" +"d8valily","Mark Mathias" +"dak@gnu.org","David Kastrup" +"david.nalesnik","David Nalesnik" +"dschudy","Devon Schudy" +"Eluzew","Eluze W" +"erlenda","Erlend Aasland" +"fedelogy","Federico Bruni" +"frederic.bron.1995@polytechnique.org","Frédéric Bron" +"graham@percival-music.ca","Graham Percival" +"hanwenn","Han-Wen Nienhuys" +"hjunes","Heikki Junes" +"ht.lilypond.development","Heikki Tauriainen" +"ianhulin44","Ian Hulin" +"idragosani","Brett McCoy" +"jameselihubailey","James E. Bailey" +"janek.lilypond","Janek Warchoł" +"jan.nieuwenhuizen","Jan Nieuwenhuizen" +"joeneeman","Joe Neeman" +"john.mandereau","John Mandereau" +"joseph.wakeling","Joseph Wakeling" +"julien.rioux","Julien Rioux" +"kieren@alumni.rice.edu","Kieren MacMillan" +"k-ohara5a5a@oco.net","Keith OHara" +"lemzwerg","Werner Lemberg" +"lilyliska","Urs Liska" +"lilypond.patchy.graham","Graham Percival" +"mandolaerik","Erik Sandberg" +"marc@hohlart.de","Marc Hohl" +"marek@gregoriana.sk","Marek Klein" +"markpolesky","Mark Polesky" +"milimetr88","Łukasz Czerwiński" +"mtsolo","Mike Solomon" +"neziap","Janek Warchoł" +"nicolas.sceaux","Nicolas Sceaux" +"n.puttock","Neil Puttock" +"paconet.org","Francisco Vila" +"PhilEHolmes","Phil Holmes" +"pkx166h","James Lowe" +"plroskin","Pavel Roskin" +"pnorcks","Patrick McCarty" +"RalphBugList","Ralph Palmer" +"reinhold.kainhofer","Reinhold Kainhofer" +"rzedeler","Rune Zedeler" +"schilke.60","Derek Klinge" +"shingarov","Boris Shingarov" +"tdanielsmusic","Trevor Daniels" +"thomasmorley65","Thomas Morley" +"v.villenave","Valentin Villenave" +' + + +usage() { + cat << EOF >&2 +USAGE: + `basename $0` NEXT_DEADLINE_DATE [PATCH-MEISTER] + OR + `basename $0` NEXT_DEADLINE_DATE [PATCH-MEISTER] > OUTPUT-FILE + +EXAMPLES: + `basename $0` "Jan 1, 2001" "John Doe" + `basename $0` "Jan 1, 2001" John + `basename $0` "Jan 1, 2001" > countdown.txt +EOF + exit 1 +} + + +# display USAGE +case $# in + 1|2) case $1 in + -h|--help) usage ;; + *) ;; + esac ;; + *) usage ;; +esac + + +# clean up in case of a previous interrupt +remove-if-exists() { + if [ -e $1 ]; then rm $1; fi +} +remove-if-exists push.tmp +remove-if-exists countdown.tmp +remove-if-exists review.tmp +remove-if-exists new.tmp +remove-if-exists waiting.tmp +remove-if-exists $TSV_FILE + + +# show initial instructions +read -p "First, in your web browser, make sure you're logged in to: + + $URL_BASE/list + +Then save the following link as a file called \"$CSV_FILE\" +(save it to this directory -- $PWD/): + + $URL_BASE/csv?$QUERY_STR + +Then press enter" + + +if [ ! -e $CSV_FILE ]; then + echo -e "\nError: can't find \`$CSV_FILE': No such file or directory" >&2 + exit 1 +fi + + +# If the user wasn't logged in when downloading $CSV_FILE, the emails will +# appear truncated, e.g. "abc...@gmail.com", and won't be properly replaced by +# the author names later on. This code block complains if the string "...@" is +# found anywhere in the email field. +if [ "`cut -d, -f2 $CSV_FILE | grep -o '\.\.\.@'`" ]; then + read -p " +It looks like you were not logged in to Google code when you downloaded +$CSV_FILE. Continue anyway (y/n)? " + while : + do + case "$REPLY" in + y) break ;; + n) exit 1 ;; + *) read -p "Enter \`y' to continue; \`n' to quit and try again: " + esac + done +fi + + +# change the quoted, comma-separated file +# into an unquoted, tab-separated file +# and keep only the first 4 fields: Patch,Owner,ID,Summary +sed '{ +1d +/^$/d +s/\t/ /g +s/^"// +s/","/\t/g +s/",*$// +s/""/"/g +}' $CSV_FILE | cut -sf1-4 > $TSV_FILE + + +ISSUES_WITH_MISSING_FIELDS=`sed -n '/\t\t\|\t$/p' $TSV_FILE | + awk -F"\t" '{ print $3 }'` + +if [ "$ISSUES_WITH_MISSING_FIELDS" ]; then + COUNT=`wc --lines <(echo "$ISSUES_WITH_MISSING_FIELDS") | sed 's/ .*//'` + LINKS_WITH_MISSING_FIELDS=`echo "$ISSUES_WITH_MISSING_FIELDS" | + sed "s!^! $URL_BASE/detail?id=!"` + if [ $COUNT -eq 1 ]; then + echo -e "\nError: The following issue is missing an OWNER or SUMMARY:" >&2 + else + echo -e "\nError: Each of the following issues is missing an OWNER or SUMMARY:" >&2 + fi + echo "$LINKS_WITH_MISSING_FIELDS" >&2 + echo "Please add the missing information in the tracker and start over." >&2 + remove-if-exists $TSV_FILE + exit 1 +fi + + +EMAILS_USED=`awk -F"\t" '{ print $2 }' $TSV_FILE | sort --unique` +KNOWN_EMAILS=` +IFS=$'\n' +for i in $MAILMAP; do + echo "$i" | sed 's/^"\(.*\)",".*/\1/' +done | sort --unique` +UNKNOWN_EMAILS=`comm -23 <(echo "$EMAILS_USED") <(echo "$KNOWN_EMAILS")` + + +# Unknown emails/usernames usually mean new contributors. +# If any are found, the user is prompted to add the new +# authors' names to the MAILMAP list above. +if [ "$UNKNOWN_EMAILS" ]; then + COUNT=`wc --lines <(echo "$UNKNOWN_EMAILS") | sed 's/ .*//'` + if [ $COUNT -eq 1 ]; then + echo -e "\nError: The following email/username needs to be associated with a name:" >&2 + echo "$UNKNOWN_EMAILS" | sed 's/^/ /' >&2 + echo -e "Please add it to the MAILMAP list in\n $0" >&2 + else + echo -e "\nError: The following emails/usernames need to be associated with names:" >&2 + echo "$UNKNOWN_EMAILS" | sed 's/^/ /' >&2 + echo -e "Please add them to the MAILMAP list in\n $0" >&2 + fi + echo "using the following form:" >&2 + echo "$UNKNOWN_EMAILS" | sed 's/.*/ "&","author name"/' >&2 + echo "and commit your changes to the main git repository." >&2 + remove-if-exists $TSV_FILE + exit 1 +fi + + +EMAIL_REPLACEMENTS=` +IFS=$'\n' +for i in $MAILMAP; do + echo "$i" | sed 's/^"\(.*\)","\(.*\)"$/s\/\1\/\2\/g/' +done` + + +# replace emails/usernames with author names +# and separate the issues by patch type +sed -n "{ +$EMAIL_REPLACEMENTS +/^push/w push.tmp +/^countdown/w countdown.tmp +/^review/w review.tmp +/^new/w new.tmp +/^waiting/w waiting.tmp +}" $TSV_FILE + + +# clean up; $TSV_FILE is no longer needed +remove-if-exists $TSV_FILE + + +format-entry() { + TYPE=$1 + FILE="$1.tmp" + if [ -s $FILE ]; then + echo -e "$TYPE:\n" | tr 'a-z' 'A-Z' + awk -v UB=$URL_BASE -F"\t" \ + '{ printf("%s: %s\n%s/detail?id=%d\n\n"), $2, $4, UB, $3 }' $FILE + echo -e "____________________\n\n" + fi + remove-if-exists $FILE +} + +echo >&2 + + +# display the countdown announcement +echo "Hello, + +Here is the current patch countdown list. +The next countdown will be on $DEADLINE. + +You can always view the most current countdown list here: +$URL_BASE/list?$QUERY_STR + +____________________ + +" + +format-entry push +format-entry countdown +format-entry review +format-entry new +format-entry waiting + +echo -e "Thank you,\n$PATCH_MEISTER" diff --git a/scripts/auxiliar/makelsr.py b/scripts/auxiliar/makelsr.py index 8d06023b01..71c8179f36 100755 --- a/scripts/auxiliar/makelsr.py +++ b/scripts/auxiliar/makelsr.py @@ -28,7 +28,7 @@ lilypond_bin = os.path.join (conv_path, 'lilypond') LY_HEADER_LSR = '''%% DO NOT EDIT this file manually; it is automatically -%% generated from LSR http://lsr.dsi.unimi.it +%% generated from LSR http://lsr.di.unimi.it %% Make any changes in LSR itself, or in Documentation/snippets/new/ , %% and then run scripts/auxiliar/makelsr.py %% @@ -251,6 +251,7 @@ def copy_ly (srcdir, name, tags): s = strip_white_spaces_re.sub ('', s) s = final_empty_lines_re.sub ('\n', s) s = escape_backslashes_in_header (s) + s = s.replace ("\r\n", "\n") sys.stderr.write ("makelsr.py: writing %s\n" % dest) open (dest, 'w').write (s) diff --git a/scripts/auxiliar/pfx2ttf.fontforge b/scripts/auxiliar/pfx2ttf.fontforge deleted file mode 100644 index 7d87fae17a..0000000000 --- a/scripts/auxiliar/pfx2ttf.fontforge +++ /dev/null @@ -1,29 +0,0 @@ -Open($1); -MergeKern($2) - - -# The AFM files of `New Century Schoolbook' family as distributed within the -# urw-fonts-1.0.7pre41.tar.bz2 archive contain a bunch of ligatures which -# shouldn't be active by default: -# -# T + M -> trademark -# N + o -> afii61352 -# i + j -> ij -# I + J -> IJ -# -# This font bundle is shipped by Fedora Core 6 and other GNU/Linux -# distributions; we simply remove those ligatures. - -SelectIf("trademark", "trademark", \ - "afii61352", "afii61352", \ - "ij", "ij", \ - "IJ", "IJ"); -if (Strtol($version) < 20070501) - RemoveATT("Ligature", "*", "*"); -else - RemovePosSub("*"); -endif - -Generate($3 + $fontname + ".otf"); - -# EOF diff --git a/scripts/auxiliar/update-with-convert-ly.sh b/scripts/auxiliar/update-with-convert-ly.sh index b5afdfd639..6092d83350 100755 --- a/scripts/auxiliar/update-with-convert-ly.sh +++ b/scripts/auxiliar/update-with-convert-ly.sh @@ -8,24 +8,22 @@ fi ### get the directories TOP_SRC_DIR=`pwd` -if [ -z $BUILD_DIR ]; then - BUILD_DIR=. +if [ -z $LILYPOND_BUILD_DIR ]; then + LILYPOND_BUILD_DIR=. fi ### make sure convert-ly is up-to-date -touch python/convertrules.py -touch scripts/convert-ly.py -cd $BUILD_DIR -make +cd $LILYPOND_BUILD_DIR +make python-modules cd $TOP_SRC_DIR ### update manuals find Documentation/ -path 'Documentation/snippets' -prune -o -name out -prune \ -o -name 'out-*' -prune -o -name '*.itely' -print \ - | xargs $BUILD_DIR/out/bin/convert-ly -e -d + | xargs $LILYPOND_BUILD_DIR/out/bin/convert-ly -e -d "$@" ### update .ly files # don't look in . otherwise it'll find stuff in build/ ! find Documentation/ input/ ly/ -name out -prune -o -name 'out-*' -prune \ -o \( -name '*.ly' -o -name '*.ily' \) -print \ - | xargs $BUILD_DIR/out/bin/convert-ly -e -d + | xargs $LILYPOND_BUILD_DIR/out/bin/convert-ly -e -d "$@" diff --git a/scripts/build/create-weblinks-itexi.py b/scripts/build/create-weblinks-itexi.py index e7caa31161..e631c27fd8 100644 --- a/scripts/build/create-weblinks-itexi.py +++ b/scripts/build/create-weblinks-itexi.py @@ -28,7 +28,7 @@ depth = "../" # Get/update node translations ''' -for i in cs de es fr hu it ja nl zh; do +for i in ca cs de es fr hu it ja nl zh; do echo "'"$i"': {" (echo '--' ; grep -nH -B1 translationof Documentation/$i/web/* ) \ | pytt '^--\n.*@(?:unnum|sub)[^ ]* (.*)\n.*@translationof (.*)\n' "'\2': '\1',\n" \ @@ -38,6 +38,35 @@ done ''' translations = { + 'ca': { + 'Source': 'Font', + 'Learning': 'Aprenentatge', + 'Music glossary': 'Glossari musical', + 'Essay': 'Monografia', + 'Notation': 'Notació', + 'Usage': 'Ús', + 'Snippets': 'Fragments', + 'Web': 'Web', + 'Changes': 'Canvis', + + 'Extending': 'Extensions', + 'Internals': 'Funcionament intern', + 'Contributor': 'Guia del col·laborador', + + ' (split HTML)': ' (HTML seccionat)', + ' (big HTML)': ' (HTML monolític)', + + 'Regression tests for ': 'Proves de regressió per a ', + 'PDF of regtests for ': 'Proves de regressió en PDF per a ', + 'abc2ly Regression tests for ': 'Proves de regressió d\'abc2ly per a ', + 'PDF of abc2ly regtests for ': 'Proves de regressió d\'abc2ly en PDF per a ', + 'lilypond-book Regression tests for ': 'Proves de regressió de lilypond-book per a ', + 'PDF of lilypond-book regtests for ': 'Proves de regressió de lilypond-book en PDF per a ', + 'MusicXML Regression tests for ': 'Proves de regressió de MusicXML per a ', + 'PDF of MusicXML regtests for ': 'Proves de regressió de MusicXML en PDF per a ', + + 'Doc tarball for ': 'Tarball de la documentació per a ', + }, 'cs': { 'Source': 'Source', 'Learning': 'Učení', @@ -525,7 +554,7 @@ def make_regtest_links(name, version, lang): getTrans("PDF of lilypond-book regtests for ", lang)+version) def make_doctarball_links(name, version, lang): - url = depth + "download/binaries/documentation/lilypond-" + url = depth + "downloads/binaries/documentation/lilypond-" # ugly FIXME, but proper build number support isn't Critical. url += version + "-1" url += ".documentation.tar.bz2" diff --git a/scripts/build/gen-emmentaler-scripts.py b/scripts/build/gen-emmentaler-scripts.py index 9f645b5929..0bd4168230 100644 --- a/scripts/build/gen-emmentaler-scripts.py +++ b/scripts/build/gen-emmentaler-scripts.py @@ -6,25 +6,26 @@ import os (options, files) = \ getopt.getopt (sys.argv[1:], - '', - ['dir=']) - + '', + ['dir=', 'design-size=']) +design_size = 0 outdir = '' for opt in options: o = opt[0] a = opt[1] if o == '--dir': outdir = a + elif o == '--design-size': + design_size = int(a) else: print o raise getopt.error -# Ugh -for design_size in [11,13,14,16,18,20,23,26]: - name = 'Emmentaler' - filename = name.lower () - script = '''#!@FONTFORGE@ + +name = 'Emmentaler' +filename = name.lower () +script = '''#!@FONTFORGE@ New(); @@ -80,32 +81,23 @@ Generate("%(filename)s-%(design_size)d.svg"); Generate("%(filename)s-%(design_size)d.woff"); ''' % vars() - basename = '%s-%d' % (filename, design_size) - path = os.path.join (outdir, basename + '.pe') - open (path, 'w').write (script) - - subfonts = ['feta%(design_size)d', - 'feta-noteheads%(design_size)d', - 'feta-flags%(design_size)d', - 'parmesan%(design_size)d', - 'parmesan-noteheads%(design_size)d', - 'feta-alphabet%(design_size)d'] +basename = '%s-%d' % (filename, design_size) +path = os.path.join (outdir, basename + '.genpe') +open (path, 'w').write (script) - ns = [] - for s in subfonts: - ns.append ('%s' % (s % vars())) +subfonts = ['feta%(design_size)d', + 'feta-noteheads%(design_size)d', + 'feta-flags%(design_size)d', + 'parmesan%(design_size)d', + 'parmesan-noteheads%(design_size)d', + 'feta-alphabet%(design_size)d'] - subfonts_str = ' '.join (ns) +ns = [] +for s in subfonts: + ns.append ('%s' % (s % vars())) - open (os.path.join (outdir, '%(filename)s-%(design_size)d.subfonts' % vars()), 'w').write (subfonts_str) +subfonts_str = ' '.join (ns) - path = os.path.join (outdir, '%s-%d.dep' % (filename, design_size)) - - deps = r'''%(filename)s-%(design_size)d.otf: $(outdir)/feta%(design_size)d.pfb \ - $(outdir)/parmesan%(design_size)d.pfb \ - $(outdir)/feta-alphabet%(design_size)d.pfb feta%(design_size)d.otf-table \ - feta%(design_size)d.otf-gtable -''' % vars() - open (path, 'w').write (deps) +open (os.path.join (outdir, '%(filename)s-%(design_size)d.subfonts' % vars()), 'w').write (subfonts_str) - open (os.path.join (outdir, basename + '.fontname'), 'w').write ("%s-%d" % (name, design_size)) +open (os.path.join (outdir, basename + '.fontname'), 'w').write ("%s-%d" % (name, design_size)) diff --git a/scripts/build/grand-replace.py b/scripts/build/grand-replace.py index 764c113f76..bb038fbf1d 100644 --- a/scripts/build/grand-replace.py +++ b/scripts/build/grand-replace.py @@ -2,7 +2,7 @@ # This file is part of LilyPond, the GNU music typesetter. # -# Copyright (C) 2009--2012 Jan Nieuwenhuizen +# Copyright (C) 2009--2015 Jan Nieuwenhuizen # # LilyPond is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -42,11 +42,14 @@ copied_files = [ 'mf2pt1.mp', 'mf2pt1.pl', 'texinfo.tex', + 'txi-ca.tex', 'txi-de.tex', 'txi-en.tex', - 'txi-fr.tex', 'txi-es.tex', + 'txi-fr.tex', + 'txi-hu.tex', 'txi-it.tex', + 'txi-nl.tex', ] def main (): diff --git a/scripts/build/lys-to-tely.py b/scripts/build/lys-to-tely.py index ad0f7a6aa9..cab59d9148 100644 --- a/scripts/build/lys-to-tely.py +++ b/scripts/build/lys-to-tely.py @@ -61,21 +61,13 @@ template = '''\input texinfo @setfilename %%(name)s.info @settitle %%(title)s -@documentencoding utf-8 +@documentencoding UTF-8 @iftex @afourpaper @end iftex @finalout @c we do not want black boxes. -@c Trick to use with proper font mappings the same NCSB fonts as -@c LilyPond instead of those provided by TeX distribution -@tex -\\ifpdf - \\pdfmapfile{=lilypond.map} -\\fi -@end tex - @c fool ls-latex @ignore @author %%(author)s diff --git a/scripts/build/mf-to-table.py b/scripts/build/mf-to-table.py index 7c193987ec..03284dc8b1 100644 --- a/scripts/build/mf-to-table.py +++ b/scripts/build/mf-to-table.py @@ -4,7 +4,7 @@ # This file is part of LilyPond, the GNU music typesetter. # -# Copyright (C) 1997--2012 Han-Wen Nienhuys +# Copyright (C) 1997--2015 Han-Wen Nienhuys # # LilyPond is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by diff --git a/scripts/build/output-distance.py b/scripts/build/output-distance.py index 569c892a8f..49a659b73f 100755 --- a/scripts/build/output-distance.py +++ b/scripts/build/output-distance.py @@ -89,7 +89,7 @@ def compare_png_images (old, new, dest_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 -dissimilarity-threshold 1 %(dir)s/crop1.png %(dir)s/crop2.png %(dir)s/diff.png' % locals ()) + system1 ('compare -depth 8 -dissimilarity-threshold 1 %(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 ()) @@ -1089,6 +1089,12 @@ def system (x): stat = os.system (x) assert stat == 0 +def system1 (x): +# Allow exit status 0 and 1 + print 'invoking', x + stat = os.system (x) + assert (stat == 0) or (stat == 256) # This return value convention is sick. + def test_paired_files (): print paired_files (os.environ["HOME"] + "/src/lilypond/scripts/", diff --git a/scripts/build/pytt.py b/scripts/build/pytt.py index 72e5825f04..cabccf0aa2 100755 --- a/scripts/build/pytt.py +++ b/scripts/build/pytt.py @@ -1,7 +1,7 @@ #! /usr/bin/python ''' - Copyright (C) 2008--2012 Jan Nieuwenhuizen + Copyright (C) 2008--2015 Jan Nieuwenhuizen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as diff --git a/scripts/build/website_post.py b/scripts/build/website_post.py index 317cf5ac9c..9fba75445f 100644 --- a/scripts/build/website_post.py +++ b/scripts/build/website_post.py @@ -11,6 +11,10 @@ import re ###### Translation data, move out, see create-weblinks-itexi.py translations = { + 'ca': { + 'English': 'Català', + 'Other languages': 'Altres idiomes', + }, 'cs': { 'English': 'Česky', 'Other languages': 'Jiné jazyky', @@ -194,12 +198,15 @@ for file in html_files: ### add google tracker header if (line.find("") >= 0): outfile.write(""" - - """); #### add google tracker goals @@ -217,4 +224,3 @@ urchinTracker(); outfile.write("
    \n") outfile.write(line) outfile.close() - diff --git a/scripts/build/xetex-with-options.sh b/scripts/build/xetex-with-options.sh new file mode 100755 index 0000000000..f53ba0d0b8 --- /dev/null +++ b/scripts/build/xetex-with-options.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# By the default settings, +# XeTeX (xdvipdfmx) replaces link destination names with integers. +# In this case, the replaced destination names of +# remote PDF cannot be known. In order to avoid replacement, +# we can use commandline option `-C 0x0010' for xdvipdfmx. + +exec xetex --output-driver='xdvipdfmx -C 0x0010' "$@" diff --git a/scripts/convert-ly.py b/scripts/convert-ly.py index ede9d4a98b..d473ec26f5 100644 --- a/scripts/convert-ly.py +++ b/scripts/convert-ly.py @@ -5,7 +5,7 @@ # This file is part of LilyPond, the GNU music typesetter. # -# Copyright (C) 1998--2012 Han-Wen Nienhuys +# Copyright (C) 1998--2015 Han-Wen Nienhuys # Jan Nieuwenhuizen # # LilyPond is free software: you can redistribute it and/or modify @@ -76,7 +76,7 @@ def warranty (): %s %s -''' % ( _ ('Copyright (c) %s by') % '2001--2012', +''' % ( _ ('Copyright (c) %s by') % '2001--2015', ' '.join (authors), _ ('Distributed under terms of the GNU General Public License.'), _ ('It comes with NO WARRANTY.'))) @@ -262,15 +262,13 @@ def do_one_file (infile_name): else: input = sys.stdin.read () - from_version = None to_version = None - if global_options.from_version: - from_version = global_options.from_version - else: - guess = guess_lilypond_version (input) - if not guess: - raise UnknownVersion () - from_version = str_to_tuple (guess) + org_version = None + guess = guess_lilypond_version (input) + org_version = guess and str_to_tuple (guess) + from_version = global_options.from_version or org_version + if not from_version: + raise UnknownVersion () if global_options.to_version: to_version = global_options.to_version @@ -293,7 +291,7 @@ def do_one_file (infile_name): # the same if two conversion rules cancelled out if result == input: # make no (actual) change to the version number - last = from_version + last = org_version or from_version else: last = last_change # If the last update was to an unstable version diff --git a/scripts/etf2ly.py b/scripts/etf2ly.py index bb61108383..24dc562871 100644 --- a/scripts/etf2ly.py +++ b/scripts/etf2ly.py @@ -1131,12 +1131,12 @@ class Etf_file: while c and c.number <> endno: - d = c # hack to avoid problem with build/scripts/grand-replace.py + d = c # hack to avoid problem with scripts/build/grand-replace.py thread.append (d) c = c.next if c: - d = c # hack to avoid problem with build/scripts/grand-replace.py + d = c # hack to avoid problem with scripts/build/grand-replace.py thread.append (d) return thread @@ -1188,7 +1188,7 @@ def warranty (): %s %s -''' % ( _ ('Copyright (c) %s by') % '2001--2012', +''' % ( _ ('Copyright (c) %s by') % '2001--2015', '\n '.join (authors), _ ('Distributed under terms of the GNU General Public License.'), _ ('It comes with NO WARRANTY.'))) diff --git a/scripts/lilymidi.py b/scripts/lilymidi.py index 498682ef26..34308f0702 100644 --- a/scripts/lilymidi.py +++ b/scripts/lilymidi.py @@ -1,6 +1,6 @@ #!@TARGET_PYTHON@ -# Copyright (C) 2006--2012 Brailcom, o.p.s. +# Copyright (C) 2006--2015 Brailcom, o.p.s. # # Author: Milan Zamazal # diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index 8dea1fc1a7..16f1241af0 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -112,7 +112,7 @@ def warranty (): %s %s -''' % ( _ ('Copyright (c) %s by') % '2001--2012', +''' % ( _ ('Copyright (c) %s by') % '2001--2015', '\n '.join (authors), _ ("Distributed under terms of the GNU General Public License."), _ ("It comes with NO WARRANTY."))) @@ -154,7 +154,7 @@ def get_option_parser (): 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)"), + help=_ ("pad left side of music to align music in spite of uneven bar numbers (in mm)"), type="float", default=3.0) @@ -417,7 +417,7 @@ def process_snippets (cmd, snippets, logfile = name.replace('.ly', '') file (name, 'wb').write (contents) - system_in_directory (' '.join ([cmd, ly.mkarg (name)]), + system_in_directory (' '.join ([cmd, ly.mkarg (name.replace (os.path.sep, '/'))]), lily_output_dir, logfile) @@ -621,12 +621,25 @@ def do_file (input_filename, included=False): progress (_ ("Removing `%s'") % output_filename) raise BookSnippet.CompileError +def adjust_include_path (path, outpath): + """Rewrite an include path relative to the dir where lilypond is launched. + Always use forward slashes since this is what lilypond expects.""" + path = os.path.expanduser (path) + path = os.path.expandvars (path) + path = os.path.normpath (path) + if os.path.isabs (outpath): + return os.path.abspath (path).replace (os.path.sep, '/') + if os.path.isabs (path): + return path.replace (os.path.sep, '/') + return os.path.join (inverse_relpath (original_dir, outpath), path).replace (os.path.sep, '/') + def inverse_relpath (path, relpath): """Given two paths, the second relative to the first, - return the first path relative to the second.""" + return the first path relative to the second. + Always use forward slashes since this is what lilypond expects.""" if os.path.isabs (relpath): - return os.path.abspath (path) - relparts = [] + return os.path.abspath (path).replace (os.path.sep, '/') + relparts = [''] parts = os.path.normpath (path).split (os.path.sep) for part in os.path.normpath (relpath).split (os.path.sep): if part == '..': @@ -635,7 +648,7 @@ def inverse_relpath (path, relpath): else: relparts.append ('..') parts.append (part) - return os.path.sep.join (relparts[::-1]) + return '/'.join (relparts[::-1]) def do_options (): global global_options @@ -648,13 +661,17 @@ def do_options (): if global_options.lily_output_dir: global_options.lily_output_dir = os.path.expanduser (global_options.lily_output_dir) + for i, path in enumerate(global_options.include_path): + global_options.include_path[i] = adjust_include_path (path, global_options.lily_output_dir) global_options.include_path.insert (0, inverse_relpath (original_dir, global_options.lily_output_dir)) - if global_options.output_dir: + elif global_options.output_dir: global_options.output_dir = os.path.expanduser (global_options.output_dir) + for i, path in enumerate(global_options.include_path): + global_options.include_path[i] = adjust_include_path (path, global_options.output_dir) global_options.include_path.insert (0, inverse_relpath (original_dir, global_options.output_dir)) - global_options.include_path.insert (0, ".") + global_options.include_path.insert (0, "./") # Load the python packages (containing e.g. custom formatter classes) # passed on the command line @@ -701,10 +718,6 @@ def main (): if global_options.process_cmd: includes = global_options.include_path - if global_options.lily_output_dir: - # This must be first, so lilypond prefers to read .ly - # files in the other lybookdb dir. - includes = [global_options.lily_output_dir] + includes global_options.process_cmd += ' '.join ([' -I %s' % ly.mkarg (p) for p in includes]) diff --git a/scripts/lilypond-invoke-editor.scm b/scripts/lilypond-invoke-editor.scm index 49800c067f..6658f50166 100644 --- a/scripts/lilypond-invoke-editor.scm +++ b/scripts/lilypond-invoke-editor.scm @@ -2,7 +2,7 @@ !# ;;;; lilypond-invoke-editor.scm -- Invoke an editor in file:line:column mode -;;;; Copyright (C) 2005--2012 Jan Nieuwenhuizen +;;;; Copyright (C) 2005--2015 Jan Nieuwenhuizen ;;;; This file is part of LilyPond, the GNU music typesetter. ;;;; @@ -151,9 +151,12 @@ Options: (if (running-from-gui?) (redirect-port (current-error-port) (open-file (string-append - (or (getenv "TMP") - (getenv "TEMP") - "/tmp") + (if (string-match "^(Windows|CYGWIN)" + (utsname:sysname (uname))) + (or (getenv "TMP") + (getenv "TEMP")) + (or (getenv "TMPDIR") + "/tmp")) "/lilypond-invoke-editor.log") "a"))) (if (not (= (length files) 1)) (begin diff --git a/scripts/lilysong.py b/scripts/lilysong.py index 70e2df2a9b..f31fbbae25 100644 --- a/scripts/lilysong.py +++ b/scripts/lilysong.py @@ -1,6 +1,6 @@ #!@TARGET_PYTHON@ -# Copyright (c) 2006--2012 Brailcom, o.p.s. +# Copyright (c) 2006--2015 Brailcom, o.p.s. # # Author: Milan Zamazal # diff --git a/scripts/midi2ly.py b/scripts/midi2ly.py index bf9f09f26e..5358fc4698 100644 --- a/scripts/midi2ly.py +++ b/scripts/midi2ly.py @@ -4,7 +4,7 @@ # This file is part of LilyPond, the GNU music typesetter. # -# Copyright (C) 1998--2012 Han-Wen Nienhuys +# Copyright (C) 1998--2015 Han-Wen Nienhuys # Jan Nieuwenhuizen # # LilyPond is free software: you can redistribute it and/or modify @@ -32,7 +32,6 @@ import sys @relocate-preamble@ """ -import midi import lilylib as ly global _;_=ly._ @@ -78,7 +77,7 @@ def warranty (): %s %s -''' % ( _ ('Copyright (c) %s by') % '1998--2012', +''' % ( _ ('Copyright (c) %s by') % '1998--2015', '\n '.join (authors), _ ('Distributed under terms of the GNU General Public License.'), _ ('It comes with NO WARRANTY.'))) @@ -923,6 +922,9 @@ class Staff: return dump_track (self.voices, i) def convert_midi (in_file, out_file): + global midi + import midi + global clocks_per_1, clocks_per_4, key global start_quant_clocks global duration_quant_clocks diff --git a/scripts/musicxml2ly.py b/scripts/musicxml2ly.py index ec827b5d39..766214bd76 100644 --- a/scripts/musicxml2ly.py +++ b/scripts/musicxml2ly.py @@ -9,6 +9,7 @@ import codecs import zipfile import tempfile import StringIO +import warnings """ @relocate-preamble@ @@ -17,27 +18,34 @@ import StringIO import lilylib as ly _ = ly._ +import utilities +import musicxml2ly_conversion import musicxml import musicexp from rational import Rational +lilypond_version = "@TOPLEVEL_VERSION@" + # Store command-line options in a global variable, so we can access them everywhere options = None class Conversion_Settings: def __init__(self): self.ignore_beaming = False + self.convert_stem_directions = False + self.convert_rest_positions = True -conversion_settings = Conversion_Settings () +conversion_settings = Conversion_Settings() # Use a global variable to store the setting needed inside a \layout block. # whenever we need to change a setting or add/remove an engraver, we can access # this layout and add the corresponding settings -layout_information = musicexp.Layout () +layout_information = musicexp.Layout() +# Use a global variable to store the setting needed inside a \paper block. +paper = musicexp.Paper() needed_additional_definitions = [] additional_definitions = { - "tuplet-note-wrapper": """ % a formatter function, which is simply a wrapper around an existing % tuplet formatter function. It takes the value returned by the given % function and appends a note of given length. @@ -64,91 +72,105 @@ additional_definitions = { """, } -def round_to_two_digits (val): - return round (val * 100) / 100 +def round_to_two_digits(val): + return round(val * 100) / 100 -def extract_paper_information (tree): - paper = musicexp.Paper () - defaults = tree.get_maybe_exist_named_child ('defaults') +def extract_paper_information(score_partwise): + defaults = score_partwise.get_maybe_exist_named_child('defaults') if not defaults: return None tenths = -1 - scaling = defaults.get_maybe_exist_named_child ('scaling') + scaling = defaults.get_maybe_exist_named_child('scaling') + default_tenths_to_millimeters_ratio = 0.175 + default_staff_size = 20 if scaling: - mm = scaling.get_named_child ('millimeters') - mm = string.atof (mm.get_text ()) - tn = scaling.get_maybe_exist_named_child ('tenths') - tn = string.atof (tn.get_text ()) + mm = scaling.get_named_child('millimeters') + mm = float(mm.get_text()) + tn = scaling.get_maybe_exist_named_child('tenths') + tn = float(tn.get_text()) + # The variable 'tenths' is actually a ratio, NOT the value of . + # TODO: rename and replace. tenths = mm / tn - paper.global_staff_size = mm * 72.27 / 25.4 - # We need the scaling (i.e. the size of staff tenths for everything! + ratio = tenths / default_tenths_to_millimeters_ratio + staff_size = default_staff_size * ratio + + if 1 < staff_size < 100: + paper.global_staff_size = staff_size + else: + msg = "paper.global_staff_size {} is too large, using defaults=20".format( + staff_size) + warnings.warn(msg) + paper.global_staff_size = 20 + + # We need the scaling(i.e. the size of staff tenths for everything! if tenths < 0: return None - def from_tenths (txt): - return round_to_two_digits (string.atof (txt) * tenths / 10) - def set_paper_variable (varname, parent, element_name): - el = parent.get_maybe_exist_named_child (element_name) + def from_tenths(txt): + return round_to_two_digits(float(txt) * tenths / 10) + def set_paper_variable(varname, parent, element_name): + el = parent.get_maybe_exist_named_child(element_name) if el: # Convert to cm from tenths - setattr (paper, varname, from_tenths (el.get_text ())) + setattr(paper, varname, from_tenths(el.get_text())) - pagelayout = defaults.get_maybe_exist_named_child ('page-layout') + pagelayout = defaults.get_maybe_exist_named_child('page-layout') if pagelayout: # TODO: How can one have different margins for even and odd pages??? - set_paper_variable ("page_height", pagelayout, 'page-height') - set_paper_variable ("page_width", pagelayout, 'page-width') - - pmargins = pagelayout.get_named_children ('page-margins') - for pm in pmargins: - set_paper_variable ("left_margin", pm, 'left-margin') - set_paper_variable ("right_margin", pm, 'right-margin') - set_paper_variable ("bottom_margin", pm, 'bottom-margin') - set_paper_variable ("top_margin", pm, 'top-margin') - - systemlayout = defaults.get_maybe_exist_named_child ('system-layout') + set_paper_variable("page_height", pagelayout, 'page-height') + set_paper_variable("page_width", pagelayout, 'page-width') + + if conversion_settings.convert_page_margins: + pmargins = pagelayout.get_named_children('page-margins') + for pm in pmargins: + set_paper_variable("left_margin", pm, 'left-margin') + set_paper_variable("right_margin", pm, 'right-margin') + set_paper_variable("bottom_margin", pm, 'bottom-margin') + set_paper_variable("top_margin", pm, 'top-margin') + + systemlayout = defaults.get_maybe_exist_named_child('system-layout') if systemlayout: - sl = systemlayout.get_maybe_exist_named_child ('system-margins') + sl = systemlayout.get_maybe_exist_named_child('system-margins') if sl: - set_paper_variable ("system_left_margin", sl, 'left-margin') - set_paper_variable ("system_right_margin", sl, 'right-margin') - set_paper_variable ("system_distance", systemlayout, 'system-distance') - set_paper_variable ("top_system_distance", systemlayout, 'top-system-distance') + set_paper_variable("system_left_margin", sl, 'left-margin') + set_paper_variable("system_right_margin", sl, 'right-margin') + set_paper_variable("system_distance", systemlayout, 'system-distance') + set_paper_variable("top_system_distance", systemlayout, 'top-system-distance') - stafflayout = defaults.get_named_children ('staff-layout') + stafflayout = defaults.get_named_children('staff-layout') for sl in stafflayout: - nr = getattr (sl, 'number', 1) - dist = sl.get_named_child ('staff-distance') + nr = getattr(sl, 'number', 1) + dist = sl.get_named_child('staff-distance') #TODO: the staff distance needs to be set in the Staff context!!! # TODO: Finish appearance?, music-font?, word-font?, lyric-font*, lyric-language* - appearance = defaults.get_named_child ('appearance') + appearance = defaults.get_named_child('appearance') if appearance: - lws = appearance.get_named_children ('line-width') + lws = appearance.get_named_children('line-width') for lw in lws: # Possible types are: beam, bracket, dashes, # enclosure, ending, extend, heavy barline, leger, # light barline, octave shift, pedal, slur middle, slur tip, # staff, stem, tie middle, tie tip, tuplet bracket, and wedge tp = lw.type - w = from_tenths (lw.get_text ()) + w = from_tenths(lw.get_text()) # TODO: Do something with these values! - nss = appearance.get_named_children ('note-size') + nss = appearance.get_named_children('note-size') for ns in nss: # Possible types are: cue, grace and large tp = ns.type - sz = from_tenths (ns.get_text ()) + sz = from_tenths(ns.get_text()) # TODO: Do something with these values! # elements have no specified meaning - rawmusicfont = defaults.get_named_child ('music-font') + rawmusicfont = defaults.get_named_child('music-font') if rawmusicfont: # TODO: Convert the font pass - rawwordfont = defaults.get_named_child ('word-font') + rawwordfont = defaults.get_named_child('word-font') if rawwordfont: # TODO: Convert the font pass - rawlyricsfonts = defaults.get_named_children ('lyric-font') + rawlyricsfonts = defaults.get_named_children('lyric-font') for lyricsfont in rawlyricsfonts: # TODO: Convert the font pass @@ -156,58 +178,68 @@ def extract_paper_information (tree): return paper - +credit_dict = { + None:None, + '':None, + 'page number':None, #TODO: what is it used for ? + 'title':'title', + 'subtitle':'subtitle', + 'composer':'composer', + 'arranger':'arranger', + 'lyricist':'poet', + 'rights':'copyright' +} # score information is contained in the , or tags # extract those into a hash, indexed by proper lilypond header attributes -def extract_score_information (tree): - header = musicexp.Header () - def set_if_exists (field, value): +def extract_score_information(tree): + header = musicexp.Header() + def set_if_exists(field, value): if value: - header.set_field (field, musicxml.escape_ly_output_string (value)) + header.set_field(field, utilities.escape_ly_output_string(value)) - work = tree.get_maybe_exist_named_child ('work') - if work: - set_if_exists ('worknumber', work.get_work_number ()) - set_if_exists ('opus', work.get_opus ()) - - movement_title = tree.get_maybe_exist_named_child ('movement-title') + movement_title = tree.get_maybe_exist_named_child('movement-title') + movement_number = tree.get_maybe_exist_named_child('movement-number') + if movement_title: + set_if_exists('title', movement_title.get_text()) + if movement_number: + set_if_exists('movementnumber', movement_number.get_text()) + # set_if_exists('piece', movement_number.get_text()) # the movement number should be visible in the score. - # use either work-title or movement-title as title. - # if both exist use movement-title as subtitle. - # if there is only a movement-title (or work-title is empty or missing) the movement-title should be typeset as a title + work = tree.get_maybe_exist_named_child('work') if work: - work_title = work.get_work_title () - set_if_exists ('title', work_title) - if work_title == '': - set_if_exists ('title', movement_title.get_text ()) - elif movement_title: - set_if_exists ('subtitle', movement_title.get_text ()) - elif movement_title: - set_if_exists ('title', movement_title.get_text ()) - - identifications = tree.get_named_children ('identification') + work_number = work.get_work_number() + work_title = work.get_work_title() + # Overwrite the title from movement-title with work->title + set_if_exists('title', work.get_work_title()) + set_if_exists('opus', work.get_work_number()) + # Use movement-title as subtitle + if movement_title: + set_if_exists('subtitle', movement_title.get_text()) + +# TODO: Translation of opus element. Not to be confused with opus in LilyPond. MusicXML opus is a document element for opus DTD + identifications = tree.get_named_children('identification') for ids in identifications: - set_if_exists ('copyright', ids.get_rights ()) - set_if_exists ('composer', ids.get_composer ()) - set_if_exists ('arranger', ids.get_arranger ()) - set_if_exists ('editor', ids.get_editor ()) - set_if_exists ('poet', ids.get_poet ()) - - set_if_exists ('encodingsoftware', ids.get_encoding_software ()) - set_if_exists ('encodingdate', ids.get_encoding_date ()) - set_if_exists ('encoder', ids.get_encoding_person ()) - set_if_exists ('encodingdescription', ids.get_encoding_description ()) - - set_if_exists ('source', ids.get_source ()) - - # miscellaneous --> texidoc - set_if_exists ('texidoc', ids.get_file_description ()); + set_if_exists('copyright', ids.get_rights()) + set_if_exists('composer', ids.get_composer()) + set_if_exists('arranger', ids.get_arranger()) + set_if_exists('editor', ids.get_editor()) + set_if_exists('poet', ids.get_poet()) + + set_if_exists('encodingsoftware', ids.get_encoding_software()) + set_if_exists('encodingdate', ids.get_encoding_date()) + set_if_exists('encoder', ids.get_encoding_person()) + set_if_exists('encodingdescription', ids.get_encoding_description()) + set_if_exists('source', ids.get_source()) + + # ... becomes + # \header { texidoc = ... + set_if_exists('texidoc', ids.get_file_description()); # Finally, apply the required compatibility modes # Some applications created wrong MusicXML files, so we need to # apply some compatibility mode, e.g. ignoring some features/tags # in those files - software = ids.get_encoding_software_list () + software = ids.get_encoding_software_list() # Case 1: "Sibelius 5.1" with the "Dolet 3.4 for Sibelius" plugin # is missing all beam ends => ignore all beaming information @@ -222,179 +254,204 @@ def extract_score_information (tree): "Noteworthy Composer": "Noteworthy Composer's nwc2xm[", } for s in software: - app_description = ignore_beaming_software.get (s, False); + app_description = ignore_beaming_software.get(s, False); if app_description: conversion_settings.ignore_beaming = True - ly.warning (_ ("Encountered file created by %s, containing " + ly.warning(_("Encountered file created by %s, containing " "wrong beaming information. All beaming " "information in the MusicXML file will be " "ignored") % app_description) + credits = tree.get_named_children('credit') + has_composer = False + for cred in credits: + type = credit_dict.get(cred.get_type()) + if(type == None): + type = credit_dict.get(cred.find_type(credits)) + if(type == 'composer'): + if(has_composer): + type = 'poet' + else: + has_composer = True + set_if_exists(type, cred.get_text()) + elif(type == 'title'): + if(not(work) and not(movement_title)): + set_if_exists('title', cred.get_text()) + #elif(not(movement_title)): #bullshit! + # set_if_exists('subtitle', cred.get_text()) #bullshit! otherwise both title and subtitle show the work-title. + elif(type == None): + pass + else: + set_if_exists(type, cred.get_text()) + + # TODO: Check for other unsupported features return header class PartGroupInfo: - def __init__ (self): + def __init__(self): self.start = {} self.end = {} - def is_empty (self): - return len (self.start) + len (self.end) == 0 - def add_start (self, g): - self.start[getattr (g, 'number', "1")] = g - def add_end (self, g): - self.end[getattr (g, 'number', "1")] = g - def print_ly (self, printer): - ly.warning (_ ("Unprocessed PartGroupInfo %s encountered") % self) - def ly_expression (self): - ly.warning (_ ("Unprocessed PartGroupInfo %s encountered") % self) + def is_empty(self): + return len(self.start) + len(self.end) == 0 + def add_start(self, g): + self.start[getattr(g, 'number', "1")] = g + def add_end(self, g): + self.end[getattr(g, 'number', "1")] = g + def print_ly(self, printer): + ly.warning(_("Unprocessed PartGroupInfo %s encountered") % self) + def ly_expression(self): + ly.warning(_("Unprocessed PartGroupInfo %s encountered") % self) return '' -def musicxml_step_to_lily (step): - if step: - return (ord (step) - ord ('A') + 7 - 2) % 7 - else: - return None - - -def staff_attributes_to_string_tunings (mxl_attr): - details = mxl_attr.get_maybe_exist_named_child ('staff-details') +def staff_attributes_to_string_tunings(mxl_attr): + details = mxl_attr.get_maybe_exist_named_child('staff-details') if not details: return [] lines = 6 - staff_lines = details.get_maybe_exist_named_child ('staff-lines') + staff_lines = details.get_maybe_exist_named_child('staff-lines') if staff_lines: - lines = string.atoi (staff_lines.get_text ()) - + lines = string.atoi(staff_lines.get_text()) tunings = [musicexp.Pitch()] * lines - staff_tunings = details.get_named_children ('staff-tuning') + staff_tunings = details.get_named_children('staff-tuning') for i in staff_tunings: p = musicexp.Pitch() line = 0 try: - line = string.atoi (i.line) - 1 + line = string.atoi(i.line) - 1 except ValueError: pass tunings[line] = p - step = i.get_named_child (u'tuning-step') - step = step.get_text ().strip () - p.step = musicxml_step_to_lily (step) + step = i.get_named_child(u'tuning-step') + step = step.get_text().strip() + p.step = musicxml2ly_conversion.musicxml_step_to_lily(step) - octave = i.get_named_child (u'tuning-octave') - octave = octave.get_text ().strip () - p.octave = int (octave) - 4 + octave = i.get_named_child(u'tuning-octave') + octave = octave.get_text().strip() + p.octave = int(octave) - 4 - alter = i.get_named_child (u'tuning-alter') + alter = i.get_named_child(u'tuning-alter') if alter: - p.alteration = int (alter.get_text ().strip ()) + p.alteration = int(alter.get_text().strip()) # lilypond seems to use the opposite ordering than MusicXML... - tunings.reverse () - + tunings.reverse() return tunings - -def staff_attributes_to_lily_staff (mxl_attr): +def staff_attributes_to_lily_staff(mxl_attr): if not mxl_attr: - return musicexp.Staff () + return musicexp.Staff() - (staff_id, attributes) = mxl_attr.items ()[0] + (staff_id, attributes) = mxl_attr.items()[0] # distinguish by clef: - # percussion (percussion and rhythmic), tab, and everything else + # percussion(percussion and rhythmic), tab, and everything else clef_sign = None - clef = attributes.get_maybe_exist_named_child ('clef') + clef = attributes.get_maybe_exist_named_child('clef') if clef: - sign = clef.get_maybe_exist_named_child ('sign') + sign = clef.get_maybe_exist_named_child('sign') if sign: - clef_sign = {"percussion": "percussion", "TAB": "tab"}.get (sign.get_text (), None) + clef_sign = {"percussion": "percussion", "TAB": "tab"}.get(sign.get_text(), None) lines = 5 - details = attributes.get_named_children ('staff-details') + details = attributes.get_named_children('staff-details') for d in details: - staff_lines = d.get_maybe_exist_named_child ('staff-lines') + staff_lines = d.get_maybe_exist_named_child('staff-lines') if staff_lines: - lines = string.atoi (staff_lines.get_text ()) + lines = string.atoi(staff_lines.get_text()) # TODO: Handle other staff attributes like staff-space, etc. staff = None if clef_sign == "percussion" and lines == 1: - staff = musicexp.RhythmicStaff () + staff = musicexp.RhythmicStaff() elif clef_sign == "percussion": - staff = musicexp.DrumStaff () + staff = musicexp.DrumStaff() # staff.drum_style_table = ??? elif clef_sign == "tab": - staff = musicexp.TabStaff () - staff.string_tunings = staff_attributes_to_string_tunings (attributes) + staff = musicexp.TabStaff() + staff.string_tunings = staff_attributes_to_string_tunings(attributes) # staff.tablature_format = ??? else: - staff = musicexp.Staff () + staff = musicexp.Staff() # TODO: Handle case with lines <> 5! - if (lines != 5): - staff.add_context_modification ("\\override StaffSymbol #'line-count = #%s" % lines) - + if(lines != 5): + staff.add_context_modification("\\override StaffSymbol #'line-count = #%s" % lines) return staff +def extract_instrument_sound(score_part): + score_instrument = score_part.get_maybe_exist_named_child('score-instrument') + if not score_instrument: + return None + sound = score_instrument.get_maybe_exist_named_child('instrument-sound') + if sound: + return utilities.musicxml_sound_to_lilypond_midi_instrument(sound.get_text()) -def extract_score_structure (part_list, staffinfo): - score = musicexp.Score () - structure = musicexp.StaffGroup (None) - score.set_contents (structure) +def extract_score_structure(part_list, staffinfo): + score = musicexp.Score() + structure = musicexp.StaffGroup(None) + score.set_contents(structure) if not part_list: return structure - def read_score_part (el): - if not isinstance (el, musicxml.Score_part): + def read_score_part(el): + if not isinstance(el, musicxml.Score_part): return # Depending on the attributes of the first measure, we create different - # types of staves (Staff, RhythmicStaff, DrumStaff, TabStaff, etc.) - staff = staff_attributes_to_lily_staff (staffinfo.get (el.id, None)) + # types of staves(Staff, RhythmicStaff, DrumStaff, TabStaff, etc.) + staff = staff_attributes_to_lily_staff(staffinfo.get(el.id, None)) if not staff: return None staff.id = el.id - partname = el.get_maybe_exist_named_child ('part-name') + partname = el.get_maybe_exist_named_child('part-name') # Finale gives unnamed parts the name "MusicXML Part" automatically! if partname and partname.get_text() != "MusicXML Part": - staff.instrument_name = partname.get_text () + staff.instrument_name = partname.get_text() # part-name-display overrides part-name! - partname = el.get_maybe_exist_named_child ("part-name-display") + partname = el.get_maybe_exist_named_child("part-name-display") if partname: - staff.instrument_name = extract_display_text (partname) - - partdisplay = el.get_maybe_exist_named_child ('part-abbreviation') + staff.instrument_name = extract_display_text(partname) + if hasattr(options, 'midi') and options.midi: + staff.sound = extract_instrument_sound(el) + if staff.instrument_name: + paper.indent = max(paper.indent, len(staff.instrument_name)) + paper.instrument_names.append(staff.instrument_name) + partdisplay = el.get_maybe_exist_named_child('part-abbreviation') if partdisplay: - staff.short_instrument_name = partdisplay.get_text () + staff.short_instrument_name = partdisplay.get_text() # part-abbreviation-display overrides part-abbreviation! - partdisplay = el.get_maybe_exist_named_child ("part-abbreviation-display") + partdisplay = el.get_maybe_exist_named_child("part-abbreviation-display") if partdisplay: - staff.short_instrument_name = extract_display_text (partdisplay) + staff.short_instrument_name = extract_display_text(partdisplay) # TODO: Read in the MIDI device / instrument + if staff.short_instrument_name: + paper.short_indent = max(paper.short_indent, len(staff.short_instrument_name)) return staff - def read_score_group (el): - if not isinstance (el, musicxml.Part_group): + def read_score_group(el): + if not isinstance(el, musicxml.Part_group): return - group = musicexp.StaffGroup () - if hasattr (el, 'number'): + group = musicexp.StaffGroup() + if hasattr(el, 'number'): id = el.number group.id = id #currentgroups_dict[id] = group - #currentgroups.append (id) - if el.get_maybe_exist_named_child ('group-name'): - group.instrument_name = el.get_maybe_exist_named_child ('group-name').get_text () - if el.get_maybe_exist_named_child ('group-abbreviation'): - group.short_instrument_name = el.get_maybe_exist_named_child ('group-abbreviation').get_text () - if el.get_maybe_exist_named_child ('group-symbol'): - group.symbol = el.get_maybe_exist_named_child ('group-symbol').get_text () - if el.get_maybe_exist_named_child ('group-barline'): - group.spanbar = el.get_maybe_exist_named_child ('group-barline').get_text () + #currentgroups.append(id) + if el.get_maybe_exist_named_child('group-name'): + group.instrument_name = el.get_maybe_exist_named_child('group-name').get_text() + if el.get_maybe_exist_named_child('group-abbreviation'): + group.short_instrument_name = el.get_maybe_exist_named_child('group-abbreviation').get_text() + if el.get_maybe_exist_named_child('group-symbol'): + group.symbol = el.get_maybe_exist_named_child('group-symbol').get_text() + if el.get_maybe_exist_named_child('group-barline'): + group.spanbar = el.get_maybe_exist_named_child('group-barline').get_text() return group - parts_groups = part_list.get_all_children () + parts_groups = part_list.get_all_children() # the start/end group tags are not necessarily ordered correctly and groups # might even overlap, so we can't go through the children sequentially! @@ -402,146 +459,102 @@ def extract_score_structure (part_list, staffinfo): # 1) Replace all Score_part objects by their corresponding Staff objects, # also collect all group start/stop points into one PartGroupInfo object staves = [] - group_info = PartGroupInfo () + group_info = PartGroupInfo() for el in parts_groups: - if isinstance (el, musicxml.Score_part): - if not group_info.is_empty (): - staves.append (group_info) - group_info = PartGroupInfo () - staff = read_score_part (el) + if isinstance(el, musicxml.Score_part): + if not group_info.is_empty(): + staves.append(group_info) + group_info = PartGroupInfo() + staff = read_score_part(el) if staff: - staves.append (staff) - elif isinstance (el, musicxml.Part_group): + staves.append(staff) + elif isinstance(el, musicxml.Part_group): if el.type == "start": - group_info.add_start (el) + group_info.add_start(el) elif el.type == "stop": - group_info.add_end (el) - if not group_info.is_empty (): - staves.append (group_info) + group_info.add_end(el) + if not group_info.is_empty(): + staves.append(group_info) # 2) Now, detect the groups: group_starts = [] pos = 0 - while pos < len (staves): + while pos < len(staves): el = staves[pos] - if isinstance (el, PartGroupInfo): + if isinstance(el, PartGroupInfo): prev_start = 0 - if len (group_starts) > 0: + if len(group_starts) > 0: prev_start = group_starts[-1] - elif len (el.end) > 0: # no group to end here + elif len(el.end) > 0: # no group to end here el.end = {} - if len (el.end) > 0: # closes an existing group - ends = el.end.keys () - prev_started = staves[prev_start].start.keys () + if len(el.end) > 0: # closes an existing group + ends = el.end.keys() + prev_started = staves[prev_start].start.keys() grpid = None intersection = filter(lambda x:x in ends, prev_started) - if len (intersection) > 0: + if len(intersection) > 0: grpid = intersection[0] else: # Close the last started group - grpid = staves[prev_start].start.keys () [0] + grpid = staves[prev_start].start.keys() [0] # Find the corresponding closing tag and remove it! j = pos + 1 foundclosing = False - while j < len (staves) and not foundclosing: - if isinstance (staves[j], PartGroupInfo) and staves[j].end.has_key (grpid): + while j < len(staves) and not foundclosing: + if isinstance(staves[j], PartGroupInfo) and staves[j].end.has_key(grpid): foundclosing = True del staves[j].end[grpid] - if staves[j].is_empty (): + if staves[j].is_empty(): del staves[j] j += 1 grpobj = staves[prev_start].start[grpid] - group = read_score_group (grpobj) + group = read_score_group(grpobj) # remove the id from both the start and end - if el.end.has_key (grpid): + if el.end.has_key(grpid): del el.end[grpid] del staves[prev_start].start[grpid] - if el.is_empty (): + if el.is_empty(): del staves[pos] # replace the staves with the whole group for j in staves[(prev_start + 1):pos]: - group.append_staff (j) + group.append_staff(j) del staves[(prev_start + 1):pos] - staves.insert (prev_start + 1, group) + staves.insert(prev_start + 1, group) # reset pos so that we continue at the correct position pos = prev_start # remove an empty start group - if staves[prev_start].is_empty (): + if staves[prev_start].is_empty(): del staves[prev_start] - group_starts.remove (prev_start) + group_starts.remove(prev_start) pos -= 1 - elif len (el.start) > 0: # starts new part groups - group_starts.append (pos) + elif len(el.start) > 0: # starts new part groups + group_starts.append(pos) pos += 1 for i in staves: - structure.append_staff (i) + structure.append_staff(i) return score -def musicxml_duration_to_lily (mxl_note): - # if the note has no Type child, then that method returns None. In that case, - # use the tag instead. If that doesn't exist, either -> Error - dur = mxl_note.get_duration_info () - if dur: - d = musicexp.Duration () - d.duration_log = dur[0] - d.dots = dur[1] - # Grace notes by specification have duration 0, so no time modification - # factor is possible. It even messes up the output with *0/1 - if not mxl_note.get_maybe_exist_typed_child (musicxml.Grace): - d.factor = mxl_note._duration / d.get_length () - return d - - else: - if mxl_note._duration > 0: - return rational_to_lily_duration (mxl_note._duration) - else: - mxl_note.message (_ ("Encountered note at %s without type and duration (=%s)") % (mxl_note.start, mxl_note._duration) ) - return None - - -def rational_to_lily_duration (rational_len): - d = musicexp.Duration () - rational_len.normalize_self () - d_log = {1: 0, 2: 1, 4:2, 8:3, 16:4, 32:5, 64:6, 128:7, 256:8, 512:9}.get (rational_len.denominator (), -1) - - # Duration of the form 1/2^n or 3/2^n can be converted to a simple lilypond duration - dots = {1: 0, 3: 1, 7: 2, 15: 3, 31: 4, 63: 5, 127: 6}.get (rational_len.numerator(), -1) - if ( d_log >= dots >= 0 ): - # account for the dots! - d.duration_log = d_log - dots - d.dots = dots - elif (d_log >= 0): - d.duration_log = d_log - d.factor = Rational (rational_len.numerator ()) - else: - ly.warning (_ ("Encountered rational duration with denominator %s, " - "unable to convert to lilypond duration") % - rational_len.denominator ()) - # TODO: Test the above error message - return None - return d - -def musicxml_partial_to_lily (partial_len): +def musicxml_partial_to_lily(partial_len): if partial_len > 0: - p = musicexp.Partial () - p.partial = rational_to_lily_duration (partial_len) + p = musicexp.Partial() + p.partial = musicxml2ly_conversion.rational_to_lily_duration(partial_len) return p else: return None -# Detect repeats and alternative endings in the chord event list (music_list) +# Detect repeats and alternative endings in the chord event list(music_list) # and convert them to the corresponding musicexp objects, containing nested # music -def group_repeats (music_list): +def group_repeats(music_list): repeat_replaced = True music_start = 0 i = 0 # Walk through the list of expressions, looking for repeat structure - # (repeat start/end, corresponding endings). If we find one, try to find the + #(repeat start/end, corresponding endings). If we find one, try to find the # last event of the repeat, replace the whole structure and start over again. # For nested repeats, as soon as we encounter another starting repeat bar, # treat that one first, and start over for the outer repeat. @@ -553,13 +566,13 @@ def group_repeats (music_list): ending_start = -1 # position of current ending start endings = [] # list of already finished endings pos = 0 - last = len (music_list) - 1 + last = len(music_list) - 1 repeat_replaced = False final_marker = 0 - while pos < len (music_list) and not repeat_replaced: + while pos < len(music_list) and not repeat_replaced: e = music_list[pos] repeat_finished = False - if isinstance (e, RepeatMarker): + if isinstance(e, musicxml2ly_conversion.RepeatMarker): if not repeat_times and e.times: repeat_times = e.times if e.direction == -1: @@ -576,7 +589,7 @@ def group_repeats (music_list): if repeat_end < 0: repeat_end = pos final_marker = pos - elif isinstance (e, EndingMarker): + elif isinstance(e, musicxml2ly_conversion.EndingMarker): if e.direction == -1: if repeat_start < 0: repeat_start = 0 @@ -586,17 +599,17 @@ def group_repeats (music_list): elif e.direction == 1: if ending_start < 0: ending_start = 0 - endings.append ([ending_start, pos]) + endings.append([ending_start, pos]) ending_start = -1 final_marker = pos - elif not isinstance (e, musicexp.BarLine): + elif not isinstance(e, musicexp.BarLine): # As soon as we encounter an element when repeat start and end # is set and we are not inside an alternative ending, # this whole repeat structure is finished => replace it if repeat_start >= 0 and repeat_end > 0 and ending_start < 0: repeat_finished = True - # Finish off all repeats without explicit ending bar (e.g. when + # Finish off all repeats without explicit ending bar(e.g. when # we convert only one page of a multi-page score with repeats) if pos == last and repeat_start >= 0: repeat_finished = True @@ -604,27 +617,27 @@ def group_repeats (music_list): if repeat_end < 0: repeat_end = pos if ending_start >= 0: - endings.append ([ending_start, pos]) + endings.append([ending_start, pos]) ending_start = -1 if repeat_finished: # We found the whole structure replace it! - r = musicexp.RepeatedMusic () + r = musicexp.RepeatedMusic() if repeat_times <= 0: repeat_times = 2 r.repeat_count = repeat_times - # don't erase the first element for "implicit" repeats (i.e. no + # don't erase the first element for "implicit" repeats(i.e. no # starting repeat bars at the very beginning) start = repeat_start + 1 if repeat_start == music_start: start = music_start - r.set_music (music_list[start:repeat_end]) - for (start, end) in endings: - s = musicexp.SequentialMusic () + r.set_music(music_list[start:repeat_end]) + for(start, end) in endings: + s = musicexp.SequentialMusic() s.elements = music_list[start + 1:end] - r.add_ending (s) + r.add_ending(s) del music_list[repeat_start:final_marker + 1] - music_list.insert (repeat_start, r) + music_list.insert(repeat_start, r) repeat_replaced = True pos += 1 # TODO: Implement repeats until the end without explicit ending bar @@ -633,148 +646,160 @@ def group_repeats (music_list): # Extract the settings for tuplets from the and the # elements of the note: -def musicxml_tuplet_to_lily (tuplet_elt, time_modification): - tsm = musicexp.TimeScaledMusic () - fraction = (1, 1) +def musicxml_tuplet_to_lily(tuplet_elt, time_modification): + tsm = musicexp.TimeScaledMusic() + fraction =(1, 1) if time_modification: - fraction = time_modification.get_fraction () + fraction = time_modification.get_fraction() tsm.numerator = fraction[0] tsm.denominator = fraction[1] - normal_type = tuplet_elt.get_normal_type () + normal_type = tuplet_elt.get_normal_type() if not normal_type and time_modification: - normal_type = time_modification.get_normal_type () + normal_type = time_modification.get_normal_type() if not normal_type and time_modification: - note = time_modification.get_parent () + note = time_modification.get_parent() if note: - normal_type = note.get_duration_info () + normal_type = note.get_duration_info() if normal_type: - normal_note = musicexp.Duration () + normal_note = musicexp.Duration() (normal_note.duration_log, normal_note.dots) = normal_type tsm.normal_type = normal_note - actual_type = tuplet_elt.get_actual_type () + actual_type = tuplet_elt.get_actual_type() if actual_type: - actual_note = musicexp.Duration () + actual_note = musicexp.Duration() (actual_note.duration_log, actual_note.dots) = actual_type tsm.actual_type = actual_note # Obtain non-default nrs of notes from the tuplet object! - tsm.display_numerator = tuplet_elt.get_normal_nr () - tsm.display_denominator = tuplet_elt.get_actual_nr () + tsm.display_numerator = tuplet_elt.get_normal_nr() + tsm.display_denominator = tuplet_elt.get_actual_nr() - if hasattr (tuplet_elt, 'bracket') and tuplet_elt.bracket == "no": + if hasattr(tuplet_elt, 'bracket') and tuplet_elt.bracket == "no": tsm.display_bracket = None - elif hasattr (tuplet_elt, 'line-shape') and getattr (tuplet_elt, 'line-shape') == "curved": + elif hasattr(tuplet_elt, 'line-shape') and getattr(tuplet_elt, 'line-shape') == "curved": tsm.display_bracket = "curved" else: tsm.display_bracket = "bracket" display_values = {"none": None, "actual": "actual", "both": "both"} - if hasattr (tuplet_elt, "show-number"): - tsm.display_number = display_values.get (getattr (tuplet_elt, "show-number"), "actual") + if hasattr(tuplet_elt, "show-number"): + tsm.display_number = display_values.get(getattr(tuplet_elt, "show-number"), "actual") - if hasattr (tuplet_elt, "show-type"): - tsm.display_type = display_values.get (getattr (tuplet_elt, "show-type"), None) + if hasattr(tuplet_elt, "show-type"): + tsm.display_type = display_values.get(getattr(tuplet_elt, "show-type"), None) return tsm -def group_tuplets (music_list, events): +def group_tuplets(music_list, events): """Collect Musics from MUSIC_LIST demarcated by EVENTS_LIST in TimeScaledMusic objects. """ - indices = [] brackets = {} j = 0 - for (ev_chord, tuplet_elt, time_modification) in events: - while (j < len (music_list)): + for(ev_chord, tuplet_elt, time_modification) in events: + while(j < len(music_list)): if music_list[j] == ev_chord: break j += 1 nr = 0 - if hasattr (tuplet_elt, 'number'): - nr = getattr (tuplet_elt, 'number') + if hasattr(tuplet_elt, 'number'): + nr = getattr(tuplet_elt, 'number') if tuplet_elt.type == 'start': - tuplet_object = musicxml_tuplet_to_lily (tuplet_elt, time_modification) + tuplet_object = musicxml_tuplet_to_lily(tuplet_elt, time_modification) tuplet_info = [j, None, tuplet_object] - indices.append (tuplet_info) + indices.append(tuplet_info) brackets[nr] = tuplet_info elif tuplet_elt.type == 'stop': - bracket_info = brackets.get (nr, None) + bracket_info = brackets.get(nr, None) if bracket_info: bracket_info[1] = j # Set the ending position to j del brackets[nr] new_list = [] last = 0 - for (i1, i2, tsm) in indices: + for(i1, i2, tsm) in indices: if i1 > i2: continue - new_list.extend (music_list[last:i1]) - seq = musicexp.SequentialMusic () + new_list.extend(music_list[last:i1]) + seq = musicexp.SequentialMusic() last = i2 + 1 + + # At this point music_list[i1:last] encompasses all the notes of the + # tuplet. There might be dynamics following this range, however, which + # apply to the last note of the tuplet. Advance last to include them + # in the range. + while last < len(music_list) and isinstance(music_list[last], musicexp.DynamicsEvent): + last += 1 + seq.elements = music_list[i1:last] tsm.element = seq - new_list.append (tsm) + new_list.append(tsm) #TODO: Handle nested tuplets!!!! - new_list.extend (music_list[last:]) + new_list.extend(music_list[last:]) return new_list -def musicxml_clef_to_lily (attributes): - change = musicexp.ClefChange () - (change.type, change.position, change.octave) = attributes.get_clef_information () +def musicxml_clef_to_lily(attributes): + change = musicexp.ClefChange() + (change.type, change.position, change.octave) = attributes.get_clef_information() return change -def musicxml_time_to_lily (attributes): - sig = attributes.get_time_signature () +def musicxml_time_to_lily(attributes): + change = musicexp.TimeSignatureChange() + # time signature function + if hasattr(options, 'shift_meter') and options.shift_meter: + tmp_meter = options.shift_meter.split("/",1) + sig = [int(tmp_meter[0]), int(tmp_meter[1])] + change.originalFractions = attributes.get_time_signature() + else: + sig = attributes.get_time_signature() if not sig: return None - change = musicexp.TimeSignatureChange() change.fractions = sig - time_elm = attributes.get_maybe_exist_named_child ('time') - if time_elm and hasattr (time_elm, 'symbol'): + time_elm = attributes.get_maybe_exist_named_child('time') + if time_elm and hasattr(time_elm, 'symbol'): change.style = { 'single-number': "'single-digit", 'cut': None, 'common': None, - 'normal': "'()"}.get (time_elm.symbol, "'()") + 'normal': "'()"}.get(time_elm.symbol, "'()") else: change.style = "'()" # TODO: Handle senza-misura measures - # TODO: Handle hidden time signatures (print-object="no") + # TODO: Handle hidden time signatures(print-object="no") # TODO: What shall we do if the symbol clashes with the sig? e.g. "cut" - # with 3/8 or "single-number" with (2+3)/8 or 3/8+2/4? - + # with 3/8 or "single-number" with(2+3)/8 or 3/8+2/4? return change -def musicxml_key_to_lily (attributes): - key_sig = attributes.get_key_signature () - if not key_sig or not (isinstance (key_sig, list) or isinstance (key_sig, tuple)): - ly.warning (_ ("Unable to extract key signature!")) +def musicxml_key_to_lily(attributes): + key_sig = attributes.get_key_signature() + if not key_sig or not(isinstance(key_sig, list) or isinstance(key_sig, tuple)): + ly.warning(_("Unable to extract key signature!")) return None change = musicexp.KeySignatureChange() - if len (key_sig) == 2 and not isinstance (key_sig[0], list): - # standard key signature, (fifths, mode) + if len(key_sig) == 2 and not isinstance(key_sig[0], list): + # standard key signature,(fifths, mode) (fifths, mode) = key_sig change.mode = mode - start_pitch = musicexp.Pitch () + start_pitch = musicexp.Pitch() start_pitch.octave = 0 try: (n, a) = { @@ -791,7 +816,7 @@ def musicxml_key_to_lily (attributes): start_pitch.step = n start_pitch.alteration = a except KeyError: - ly.warning (_ ("unknown mode %s, expecting 'major' or 'minor' " + ly.warning(_("unknown mode %s, expecting 'major' or 'minor' " "or a church mode!") % mode) fifth = musicexp.Pitch() @@ -799,9 +824,9 @@ def musicxml_key_to_lily (attributes): if fifths < 0: fifths *= -1 fifth.step *= -1 - fifth.normalize () - for x in range (fifths): - start_pitch = start_pitch.transposed (fifth) + fifth.normalize() + for x in range(fifths): + start_pitch = start_pitch.transposed(fifth) change.tonic = start_pitch else: @@ -809,21 +834,21 @@ def musicxml_key_to_lily (attributes): # MusicXML contains C,D,E,F,G,A,B as steps, lily uses 0-7, so convert alterations = [] for k in key_sig: - k[0] = musicxml_step_to_lily (k[0]) - alterations.append (k) + k[0] = musicxml2ly_conversion.musicxml_step_to_lily(k[0]) + alterations.append(k) change.non_standard_alterations = alterations return change -def musicxml_transpose_to_lily (attributes): - transpose = attributes.get_transposition () +def musicxml_transpose_to_lily(attributes): + transpose = attributes.get_transposition() if not transpose: return None - shift = musicexp.Pitch () - octave_change = transpose.get_maybe_exist_named_child ('octave-change') + shift = musicexp.Pitch() + octave_change = transpose.get_maybe_exist_named_child('octave-change') if octave_change: - shift.octave = string.atoi (octave_change.get_text ()) - chromatic_shift = string.atoi (transpose.get_named_child ('chromatic').get_text ()) + shift.octave = string.atoi(octave_change.get_text()) + chromatic_shift = string.atoi(transpose.get_named_child('chromatic').get_text()) chromatic_shift_normalized = chromatic_shift % 12; (shift.step, shift.alteration) = [ (0, 0), (0, 1), (1, 0), (2, -1), (2, 0), @@ -832,38 +857,38 @@ def musicxml_transpose_to_lily (attributes): shift.octave += (chromatic_shift - chromatic_shift_normalized) / 12 - diatonic = transpose.get_maybe_exist_named_child ('diatonic') + diatonic = transpose.get_maybe_exist_named_child('diatonic') if diatonic: - diatonic_step = string.atoi (diatonic.get_text ()) % 7 + diatonic_step = string.atoi(diatonic.get_text()) % 7 if diatonic_step != shift.step: # We got the alter incorrect! - old_semitones = shift.semitones () + old_semitones = shift.semitones() shift.step = diatonic_step - new_semitones = shift.semitones () + new_semitones = shift.semitones() shift.alteration += old_semitones - new_semitones - transposition = musicexp.Transposition () - transposition.pitch = musicexp.Pitch ().transposed (shift) + transposition = musicexp.Transposition() + transposition.pitch = musicexp.Pitch().transposed(shift) return transposition -def musicxml_staff_details_to_lily (attributes): - details = attributes.get_maybe_exist_named_child ('staff-details') +def musicxml_staff_details_to_lily(attributes): + details = attributes.get_maybe_exist_named_child('staff-details') if not details: return None ## TODO: Handle staff-type, staff-lines, staff-tuning, capo, staff-size ret = [] - stafflines = details.get_maybe_exist_named_child ('staff-lines') + stafflines = details.get_maybe_exist_named_child('staff-lines') if stafflines: - lines = string.atoi (stafflines.get_text ()); - lines_event = musicexp.StaffLinesEvent (lines); - ret.append (lines_event); + lines = string.atoi(stafflines.get_text()); + lines_event = musicexp.StaffLinesEvent(lines); + ret.append(lines_event); return ret; -def musicxml_attributes_to_lily (attrs): +def musicxml_attributes_to_lily(attrs): elts = [] attr_dispatch = { 'clef': musicxml_clef_to_lily, @@ -872,27 +897,27 @@ def musicxml_attributes_to_lily (attrs): 'transpose': musicxml_transpose_to_lily, 'staff-details': musicxml_staff_details_to_lily, } - for (k, func) in attr_dispatch.items (): - children = attrs.get_named_children (k) + for (k, func) in attr_dispatch.items(): + children = attrs.get_named_children(k) if children: - ev = func (attrs) - if isinstance (ev, list): + ev = func(attrs) + if isinstance(ev, list): for e in ev: - elts.append (e) + elts.append(e) elif ev: - elts.append (ev) + elts.append(ev) return elts -def extract_display_text (el): - child = el.get_maybe_exist_named_child ("display-text") +def extract_display_text(el): + child = el.get_maybe_exist_named_child("display-text") if child: - return child.get_text () + return child.get_text() else: return False -def musicxml_print_to_lily (el): +def musicxml_print_to_lily(el): # TODO: Implement other print attributes # elts = [] - if (hasattr (el, "new-system") and conversion_settings.convert_page_layout): - val = getattr (el, "new-system") + if (hasattr(el, "new-system") and conversion_settings.convert_system_breaks): + val = getattr(el, "new-system") if (val == "yes"): - elts.append (musicexp.Break ("break")) - if (hasattr (el, "new-page") and conversion_settings.convert_page_layout): - val = getattr (el, "new-page") + elts.append(musicexp.Break("break")) + if (hasattr(el, "new-page") and conversion_settings.convert_page_breaks): + val = getattr(el, "new-page") if (val == "yes"): - elts.append (musicexp.Break ("pageBreak")) - child = el.get_maybe_exist_named_child ("part-name-display") + elts.append(musicexp.Break("pageBreak")) + child = el.get_maybe_exist_named_child("part-name-display") if child: - elts.append (musicexp.SetEvent ("Staff.instrumentName", - "\"%s\"" % extract_display_text (child))) - child = el.get_maybe_exist_named_child ("part-abbreviation-display") + elts.append(musicexp.SetEvent("Staff.instrumentName", + "\"%s\"" % extract_display_text(child))) + child = el.get_maybe_exist_named_child("part-abbreviation-display") if child: - elts.append (musicexp.SetEvent ("Staff.shortInstrumentName", - "\"%s\"" % extract_display_text (child))) + elts.append(musicexp.SetEvent("Staff.shortInstrumentName", + "\"%s\"" % extract_display_text(child))) return elts -class Marker (musicexp.Music): - def __init__ (self): - self.direction = 0 - self.event = None - def print_ly (self, printer): - ly.warning (_ ("Encountered unprocessed marker %s\n") % self) - pass - def ly_expression (self): - return "" -class RepeatMarker (Marker): - def __init__ (self): - Marker.__init__ (self) - self.times = 0 -class EndingMarker (Marker): - pass - -# Convert the element to musicxml.BarLine (for non-standard barlines) -# and to RepeatMarker and EndingMarker objects for repeat and -# alternatives start/stops -def musicxml_barline_to_lily (barline): - # retval contains all possible markers in the order: - # 0..bw_ending, 1..bw_repeat, 2..barline, 3..fw_repeat, 4..fw_ending - retval = {} - bartype_element = barline.get_maybe_exist_named_child ("bar-style") - repeat_element = barline.get_maybe_exist_named_child ("repeat") - ending_element = barline.get_maybe_exist_named_child ("ending") - - bartype = None - if bartype_element: - bartype = bartype_element.get_text () - - if repeat_element and hasattr (repeat_element, 'direction'): - repeat = RepeatMarker () - repeat.direction = {"forward": -1, "backward": 1}.get (repeat_element.direction, 0) - - if ( (repeat_element.direction == "forward" and bartype == "heavy-light") or - (repeat_element.direction == "backward" and bartype == "light-heavy") ): - bartype = None - if hasattr (repeat_element, 'times'): - try: - repeat.times = int (repeat_element.times) - except ValueError: - repeat.times = 2 - repeat.event = barline - if repeat.direction == -1: - retval[3] = repeat - else: - retval[1] = repeat - - if ending_element and hasattr (ending_element, 'type'): - ending = EndingMarker () - ending.direction = {"start": -1, "stop": 1, "discontinue": 1}.get (ending_element.type, 0) - ending.event = barline - if ending.direction == -1: - retval[4] = ending - else: - retval[0] = ending - - if bartype: - b = musicexp.BarLine () - b.type = bartype - retval[2] = b - return retval.values () spanner_event_dict = { 'beam' : musicexp.BeamEvent, @@ -998,119 +960,140 @@ spanner_event_dict = { 'pedal' : musicexp.PedalEvent, 'slide' : musicexp.GlissandoEvent, 'slur' : musicexp.SlurEvent, - 'wavy-line' : musicexp.TrillSpanEvent, + 'wavy-line' : musicexp.TextSpannerEvent, 'wedge' : musicexp.HairpinEvent } spanner_type_dict = { - 'start': -1, - 'begin': -1, - 'crescendo': -1, - 'decreschendo': -1, - 'diminuendo': -1, + 'start':-1, + 'begin':-1, + 'crescendo':-1, + 'decreschendo':-1, + 'diminuendo':-1, 'continue': 0, 'change': 0, - 'up': -1, - 'down': -1, + 'up':-1, + 'down':-1, 'stop': 1, 'end' : 1 } -def musicxml_spanner_to_lily_event (mxl_event): +def musicxml_spanner_to_lily_event(mxl_event): ev = None name = mxl_event.get_name() - func = spanner_event_dict.get (name) + func = spanner_event_dict.get(name) if func: ev = func() else: - ly.warning (_ ('unknown span event %s') % mxl_event) + ly.warning(_('unknown span event %s') % mxl_event) + if name == "wavy-line": + ev.style=OrnamenthasWhat(mxl_event) - type = mxl_event.get_type () - span_direction = spanner_type_dict.get (type) + type = mxl_event.get_type() + span_direction = spanner_type_dict.get(type) # really check for None, because some types will be translated to 0, which # would otherwise also lead to the unknown span warning if span_direction != None: ev.span_direction = span_direction else: - ly.warning (_ ('unknown span type %s for %s') % (type, name)) + ly.warning(_('unknown span type %s for %s') %(type, name)) - ev.set_span_type (type) - ev.line_type = getattr (mxl_event, 'line-type', 'solid') + ev.set_span_type(type) + ev.line_type = getattr(mxl_event, 'line-type', 'solid') # assign the size, which is used for octave-shift, etc. - ev.size = mxl_event.get_size () + ev.size = mxl_event.get_size() return ev -def musicxml_direction_to_indicator (direction): - return { "above": 1, "upright": 1, "up": 1, "below": -1, "downright": -1, "down": -1, "inverted": -1 }.get (direction, 0) +def musicxml_direction_to_indicator(direction): + return { "above": 1, "upright": 1, "up": 1, "below":-1, "downright":-1, "down":-1, "inverted":-1 }.get(direction, 0) + +def musicxml_fermata_to_lily_event(mxl_event): + + ev = musicexp.ArticulationEvent() + txt = mxl_event.get_text() -def musicxml_fermata_to_lily_event (mxl_event): - ev = musicexp.ArticulationEvent () - txt = mxl_event.get_text () # The contents of the element defined the shape, possible are normal, angled and square - ev.type = { "angled": "shortfermata", "square": "longfermata" }.get (txt, "fermata") - if hasattr (mxl_event, 'type'): - dir = musicxml_direction_to_indicator (mxl_event.type) - if dir and options.convert_directions: - ev.force_direction = dir + ev.type = { "angled": "shortfermata", "square": "longfermata" }.get(txt, "fermata") + fermata_types= { "angled": "shortfermata", + "square": "longfermata" } + + # MusicXML fermata types can be specified in two different ways: + # 1. angled and + # 2. -- both need to be handled. + if hasattr(mxl_event, 'type'): + fermata_type = fermata_types.get(mxl_event.type, 'fermata') + else: + fermata_type = fermata_types.get(mxl_event.get_text(), 'fermata') + + ev.type = fermata_type + + if hasattr(mxl_event, 'type'): + dir = musicxml_direction_to_indicator(mxl_event.type) + if dir and options.convert_directions: + ev.force_direction = dir return ev -def musicxml_arpeggiate_to_lily_event (mxl_event): - ev = musicexp.ArpeggioEvent () - ev.direction = musicxml_direction_to_indicator (getattr (mxl_event, 'direction', None)) +def musicxml_arpeggiate_to_lily_event(mxl_event): + ev = musicexp.ArpeggioEvent() + ev.direction = musicxml_direction_to_indicator(getattr(mxl_event, 'direction', None)) return ev -def musicxml_nonarpeggiate_to_lily_event (mxl_event): - ev = musicexp.ArpeggioEvent () +def musicxml_nonarpeggiate_to_lily_event(mxl_event): + ev = musicexp.ArpeggioEvent() ev.non_arpeggiate = True - ev.direction = musicxml_direction_to_indicator (getattr (mxl_event, 'direction', None)) + ev.direction = musicxml_direction_to_indicator(getattr(mxl_event, 'direction', None)) return ev -def musicxml_tremolo_to_lily_event (mxl_event): - ev = musicexp.TremoloEvent () - txt = mxl_event.get_text () +def musicxml_tremolo_to_lily_event(mxl_event): + ev = musicexp.TremoloEvent() + txt = mxl_event.get_text() if txt: - ev.bars = txt + ev.strokes = txt else: - ev.bars = "3" + # This is supposed to be a default for empty tremolo elements + # TODO: Add empty tremolo element to test cases in tremolo.xml + # TODO: Test empty tremolo element + # TODO: Consideration: Is 3 really a reasonable default? + ev.strokes = "3" return ev -def musicxml_falloff_to_lily_event (mxl_event): - ev = musicexp.BendEvent () +def musicxml_falloff_to_lily_event(mxl_event): + ev = musicexp.BendEvent() ev.alter = -4 return ev -def musicxml_doit_to_lily_event (mxl_event): - ev = musicexp.BendEvent () +def musicxml_doit_to_lily_event(mxl_event): + ev = musicexp.BendEvent() ev.alter = 4 return ev -def musicxml_bend_to_lily_event (mxl_event): - ev = musicexp.BendEvent () - ev.alter = mxl_event.bend_alter () +def musicxml_bend_to_lily_event(mxl_event): + ev = musicexp.BendEvent() + ev.alter = mxl_event.bend_alter() return ev -def musicxml_caesura_to_lily_event (mxl_event): - ev = musicexp.MarkupEvent () +def musicxml_caesura_to_lily_event(mxl_event): + ev = musicexp.MarkupEvent() # FIXME: default to straight or curved caesura? ev.contents = "\\musicglyph #\"scripts.caesura.straight\"" ev.force_direction = 1 return ev -def musicxml_fingering_event (mxl_event): - ev = musicexp.ShortArticulationEvent () - ev.type = mxl_event.get_text () +def musicxml_fingering_event(mxl_event): + ev = musicexp.ShortArticulationEvent() + ev.type = mxl_event.get_text() return ev -def musicxml_string_event (mxl_event): - ev = musicexp.NoDirectionArticulationEvent () - ev.type = mxl_event.get_text () +def musicxml_string_event(mxl_event): + ev = musicexp.NoDirectionArticulationEvent() + ev.type = mxl_event.get_text() return ev -def musicxml_accidental_mark (mxl_event): - ev = musicexp.MarkupEvent () +def musicxml_accidental_mark(mxl_event): + ev = musicexp.MarkupEvent() contents = { "sharp": "\\sharp", "natural": "\\natural", "flat": "\\flat", @@ -1124,7 +1107,7 @@ def musicxml_accidental_mark (mxl_event): "quarter-sharp": "\\semisharp", "three-quarters-flat": "\\sesquiflat", "three-quarters-sharp": "\\sesquisharp", - }.get (mxl_event.get_text ()) + }.get(mxl_event.get_text()) if contents: ev.contents = contents return ev @@ -1187,85 +1170,148 @@ articulations_dict = { } articulation_spanners = [ "wavy-line" ] -def musicxml_articulation_to_lily_event (mxl_event): +def OrnamenthasWhat(mxl_event): + wavy = trilly = ignore = start = stop = False + for i in mxl_event._parent._children: + if i._name == "wavy-line": wavy = True + elif i._name == "trill-mark": trilly = True + try: + if i.type == "continue": ignore = True + elif i.type == "start": start = True + elif i.type == "stop": stop = True + except: + pass + if start == True: + if wavy == True and trilly == False: musicexp.whatOrnament = "wave" + else: musicexp.whatOrnament = "trill" + if ignore == True: return "ignore" + elif stop == True: return "stop" + elif wavy == True and trilly == True: return "trill and wave" + elif wavy == True: return "wave" + elif trilly == True: return "trill" + +def OrnamenthasWavyline(mxl_event): + for i in mxl_event._parent._children: + if i._name == "wavy-line": return True + return False + + +def musicxml_articulation_to_lily_event(mxl_event): # wavy-line elements are treated as trill spanners, not as articulation ornaments - if mxl_event.get_name () in articulation_spanners: - return musicxml_spanner_to_lily_event (mxl_event) + if mxl_event.get_name() in articulation_spanners: + return musicxml_spanner_to_lily_event(mxl_event) - tmp_tp = articulations_dict.get (mxl_event.get_name ()) + tmp_tp = articulations_dict.get(mxl_event.get_name()) + if OrnamenthasWavyline(mxl_event): + return if not tmp_tp: return - if isinstance (tmp_tp, str): - ev = musicexp.ArticulationEvent () + if isinstance(tmp_tp, str): + ev = musicexp.ArticulationEvent() ev.type = tmp_tp - elif isinstance (tmp_tp, tuple): - ev = tmp_tp[0] () + elif isinstance(tmp_tp, tuple): + ev = tmp_tp[0]() ev.type = tmp_tp[1] else: - ev = tmp_tp (mxl_event) + ev = tmp_tp(mxl_event) # Some articulations use the type attribute, other the placement... dir = None - if hasattr (mxl_event, 'type') and options.convert_directions: - dir = musicxml_direction_to_indicator (mxl_event.type) - if hasattr (mxl_event, 'placement') and options.convert_directions: - dir = musicxml_direction_to_indicator (mxl_event.placement) + if hasattr(mxl_event, 'type') and hasattr(options, 'convert_directions') and options.convert_directions: + dir = musicxml_direction_to_indicator(mxl_event.type) + if hasattr(mxl_event, 'placement') and hasattr(options, 'convert_directions') and options.convert_directions: + dir = musicxml_direction_to_indicator(mxl_event.placement) if dir: ev.force_direction = dir return ev -def musicxml_dynamics_to_lily_event (dynentry): +def musicxml_dynamics_to_lily_event(dynentry): dynamics_available = ( "ppppp", "pppp", "ppp", "pp", "p", "mp", "mf", - "f", "ff", "fff", "ffff", "fp", "sf", "sff", "sp", "spp", "sfz", "rfz" ) - dynamicsname = dynentry.get_name () + "f", "ff", "fff", "ffff", "fp", "sf", "sff", "sp", "spp", "sfz", "rfz") + dynamicsname = dynentry.get_name() if dynamicsname == "other-dynamics": - dynamicsname = dynentry.get_text () + dynamicsname = dynentry.get_text() if not dynamicsname or dynamicsname == "#text": - return + return None if not dynamicsname in dynamics_available: # Get rid of - in tag names (illegal in ly tags!) dynamicstext = dynamicsname - dynamicsname = string.replace (dynamicsname, "-", "") + dynamicsname = string.replace(dynamicsname, "-", "") additional_definitions[dynamicsname] = dynamicsname + \ " = #(make-dynamic-script \"" + dynamicstext + "\")" - needed_additional_definitions.append (dynamicsname) - event = musicexp.DynamicsEvent () + needed_additional_definitions.append(dynamicsname) + event = musicexp.DynamicsEvent() event.type = dynamicsname return event # Convert single-color two-byte strings to numbers 0.0 - 1.0 -def hexcolorval_to_nr (hex_val): +def hexcolorval_to_nr(hex_val): try: - v = int (hex_val, 16) + v = int(hex_val, 16) if v == 255: v = 256 return v / 256. except ValueError: return 0. -def hex_to_color (hex_val): - res = re.match (r'#([0-9a-f][0-9a-f]|)([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$', hex_val, re.IGNORECASE) +def hex_to_color(hex_val): + res = re.match(r'#([0-9a-f][0-9a-f]|)([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$', hex_val, re.IGNORECASE) if res: - return map (lambda x: hexcolorval_to_nr (x), res.group (2, 3, 4)) + return map(lambda x: hexcolorval_to_nr(x), res.group(2, 3, 4)) else: return None -def musicxml_words_to_lily_event (words): - event = musicexp.TextEvent () - text = words.get_text () - text = re.sub ('^ *\n? *', '', text) - text = re.sub (' *\n? *$', '', text) +def font_size_number_to_lily_command(size): + d = { + (0, 8): r'\teeny', + (8, 10): r'\tiny', + (10, 12): r'\small', + (12, 16): r'', + (16, 24): r'\large', + (24, float('inf')): r'\huge', + } + result = None + for r in d.keys(): + if r[0] <= size < r[1]: + result = d[r] + break + return result + +def font_size_word_to_lily_command(size): + font_size_dict = { + "xx-small": '\\teeny', + "x-small": '\\tiny', + "small": '\\small', + "medium": '', + "large": '\\large', + "x-large": '\\huge', + "xx-large": '\\larger\\huge' + } + return font_size_dict.get(size, '') + +def get_font_size(size): + try: + size = float(size) + return font_size_number_to_lily_command(size) + except ValueError: + return font_size_word_to_lily_command(size) + +def musicxml_words_to_lily_event(words): + event = musicexp.TextEvent() + text = words.get_text() + text = re.sub('^ *\n? *', '', text) #remove white spaces and line breaks before text + text = re.sub(' *\n? *$', '', text) #remove white spaces and line breaks before text event.text = text - if hasattr (words, 'default-y') and options.convert_directions: - offset = getattr (words, 'default-y') + if hasattr(words, 'default-y') and hasattr(options, 'convert_directions') and options.convert_directions: + offset = getattr(words, 'default-y') try: - off = string.atoi (offset) + off = string.atoi(offset) if off > 0: event.force_direction = 1 else: @@ -1273,33 +1319,26 @@ def musicxml_words_to_lily_event (words): except ValueError: event.force_direction = 0 - if hasattr (words, 'font-weight'): - font_weight = { "normal": '', "bold": '\\bold' }.get (getattr (words, 'font-weight'), '') + if hasattr(words, 'font-weight'): + font_weight = { "normal": '', "bold": '\\bold' }.get(getattr(words, 'font-weight'), '') if font_weight: event.markup += font_weight - if hasattr (words, 'font-size'): - size = getattr (words, 'font-size') - font_size = { - "xx-small": '\\teeny', - "x-small": '\\tiny', - "small": '\\small', - "medium": '', - "large": '\\large', - "x-large": '\\huge', - "xx-large": '\\larger\\huge' - }.get (size, '') + if hasattr(words, 'font-size'): + size = getattr(words, 'font-size') + # font_size = font_size_dict.get(size, '') + font_size = get_font_size(size) if font_size: event.markup += font_size - if hasattr (words, 'color'): - color = getattr (words, 'color') - rgb = hex_to_color (color) + if hasattr(words, 'color'): + color = getattr(words, 'color') + rgb = hex_to_color(color) if rgb: event.markup += "\\with-color #(rgb-color %s %s %s)" % (rgb[0], rgb[1], rgb[2]) - if hasattr (words, 'font-style'): - font_style = { "italic": '\\italic' }.get (getattr (words, 'font-style'), '') + if hasattr(words, 'font-style'): + font_style = { "italic": '\\italic' }.get(getattr(words, 'font-style'), '') if font_style: event.markup += font_style @@ -1316,23 +1355,23 @@ def musicxml_words_to_lily_event (words): # Since lilypond does not have any built-in commands, we need to create # the markup commands manually and define our own variables. # Idea was taken from: http://lsr.dsi.unimi.it/LSR/Item?id=194 -def musicxml_accordion_to_markup (mxl_event): +def musicxml_accordion_to_markup(mxl_event): commandname = "accReg" command = "" - high = mxl_event.get_maybe_exist_named_child ('accordion-high') + high = mxl_event.get_maybe_exist_named_child('accordion-high') if high: commandname += "H" command += """\\combine \\raise #2.5 \\musicglyph #\"accordion.dot\" """ - middle = mxl_event.get_maybe_exist_named_child ('accordion-middle') + middle = mxl_event.get_maybe_exist_named_child('accordion-middle') if middle: # By default, use one dot (when no or invalid content is given). The # MusicXML spec is quiet about this case... txt = 1 try: - txt = string.atoi (middle.get_text ()) + txt = string.atoi(middle.get_text()) except ValueError: pass if txt == 3: @@ -1356,7 +1395,7 @@ def musicxml_accordion_to_markup (mxl_event): command += """\\combine \\raise #1.5 \\musicglyph #\"accordion.dot\" """ - low = mxl_event.get_maybe_exist_named_child ('accordion-low') + low = mxl_event.get_maybe_exist_named_child('accordion-low') if low: commandname += "L" command += """\\combine @@ -1367,98 +1406,100 @@ def musicxml_accordion_to_markup (mxl_event): command = "\\markup { \\normalsize %s }" % command # Define the newly built command \accReg[H][MMM][L] additional_definitions[commandname] = "%s = %s" % (commandname, command) - needed_additional_definitions.append (commandname) + needed_additional_definitions.append(commandname) return "\\%s" % commandname -def musicxml_accordion_to_ly (mxl_event): - txt = musicxml_accordion_to_markup (mxl_event) +def musicxml_accordion_to_ly(mxl_event): + txt = musicxml_accordion_to_markup(mxl_event) if txt: - ev = musicexp.MarkEvent (txt) + ev = musicexp.MarkEvent(txt) return ev return -def musicxml_rehearsal_to_ly_mark (mxl_event): - text = mxl_event.get_text () +def musicxml_rehearsal_to_ly_mark(mxl_event): + text = mxl_event.get_text() if not text: return # default is boxed rehearsal marks! encl = "box" - if hasattr (mxl_event, 'enclosure'): - encl = {"none": None, "square": "box", "circle": "circle" }.get (mxl_event.enclosure, None) + if hasattr(mxl_event, 'enclosure'): + encl = {"none": None, "square": "box", "circle": "circle" }.get(mxl_event.enclosure, None) if encl: text = "\\%s { %s }" % (encl, text) - ev = musicexp.MarkEvent ("\\markup { %s }" % text) + ev = musicexp.MarkEvent("\\markup { %s }" % text) return ev -def musicxml_harp_pedals_to_ly (mxl_event): +def musicxml_harp_pedals_to_ly(mxl_event): count = 0 result = "\\harp-pedal #\"" - for t in mxl_event.get_named_children ('pedal-tuning'): - alter = t.get_named_child ('pedal-alter') + for t in mxl_event.get_named_children('pedal-tuning'): + alter = t.get_named_child('pedal-alter') if alter: - val = int (alter.get_text ().strip ()) - result += {1: "v", 0: "-", -1: "^"}.get (val, "") + val = int(alter.get_text().strip()) + result += {1: "v", 0: "-", -1: "^"}.get(val, "") count += 1 if count == 3: result += "|" - ev = musicexp.MarkupEvent () + ev = musicexp.MarkupEvent() ev.contents = result + "\"" return ev -def musicxml_eyeglasses_to_ly (mxl_event): - needed_additional_definitions.append ("eyeglasses") - return musicexp.MarkEvent ("\\markup { \\eyeglasses }") +def musicxml_eyeglasses_to_ly(mxl_event): + needed_additional_definitions.append("eyeglasses") + return musicexp.MarkEvent("\\markup { \\eyeglasses }") -def next_non_hash_index (lst, pos): +def next_non_hash_index(lst, pos): pos += 1 - while pos < len (lst) and isinstance (lst[pos], musicxml.Hash_text): + while pos < len(lst) and isinstance(lst[pos], musicxml.Hash_text): pos += 1 return pos -def musicxml_metronome_to_ly (mxl_event): - children = mxl_event.get_all_children () +def musicxml_metronome_to_ly(mxl_event): + children = mxl_event.get_all_children() if not children: return index = -1 - index = next_non_hash_index (children, index) - if isinstance (children[index], musicxml.BeatUnit): + index = next_non_hash_index(children, index) + if isinstance(children[index], musicxml.BeatUnit): # first form of metronome-mark, using unit and beats/min or other unit - ev = musicexp.TempoMark () - if hasattr (mxl_event, 'parentheses'): - ev.set_parentheses (mxl_event.parentheses == "yes") - - d = musicexp.Duration () - d.duration_log = musicxml.musicxml_duration_to_log (children[index].get_text ()) - index = next_non_hash_index (children, index) - if isinstance (children[index], musicxml.BeatUnitDot): + ev = musicexp.TempoMark() + if hasattr(mxl_event, 'parentheses'): + ev.set_parentheses(mxl_event.parentheses == "yes") + + d = musicexp.Duration() + d.duration_log = utilities.musicxml_duration_to_log( + children[index].get_text()) + index = next_non_hash_index(children, index) + if isinstance(children[index], musicxml.BeatUnitDot): d.dots = 1 - index = next_non_hash_index (children, index) - ev.set_base_duration (d) - if isinstance (children[index], musicxml.BeatUnit): + index = next_non_hash_index(children, index) + ev.set_base_duration(d) + if isinstance(children[index], musicxml.BeatUnit): # Form "note = newnote" - newd = musicexp.Duration () - newd.duration_log = musicxml.musicxml_duration_to_log (children[index].get_text ()) - index = next_non_hash_index (children, index) - if isinstance (children[index], musicxml.BeatUnitDot): + newd = musicexp.Duration() + newd.duration_log = utilities.musicxml_duration_to_log( + children[index].get_text()) + index = next_non_hash_index(children, index) + if isinstance(children[index], musicxml.BeatUnitDot): newd.dots = 1 - index = next_non_hash_index (children, index) - ev.set_new_duration (newd) - elif isinstance (children[index], musicxml.PerMinute): + index = next_non_hash_index(children, index) + ev.set_new_duration(newd) + elif isinstance(children[index], musicxml.PerMinute): # Form "note = bpm" try: - beats = int (children[index].get_text ()) - ev.set_beats_per_minute (beats) + beats = int(children[index].get_text()) + ev.set_beats_per_minute(beats) except ValueError: pass else: - ly.warning (_ ("Unknown metronome mark, ignoring")) + ly.warning(_("Unknown metronome mark, ignoring")) return return ev else: #TODO: Implement the other (more complex) way for tempo marks! - ly.warning (_ ("Metronome marks with complex relations ( in MusicXML) are not yet implemented.")) + ly.warning(_("Metronome marks with complex relations ( in MusicXML) are not yet implemented.")) return # translate directions into Events, possible values: @@ -1481,85 +1522,53 @@ directions_dict = { } directions_spanners = [ 'octave-shift', 'pedal', 'wedge', 'dashes', 'bracket' ] -def musicxml_direction_to_lily (n): +def musicxml_direction_to_lily(n): # TODO: Handle the element! res = [] # placement applies to all children! dir = None - if hasattr (n, 'placement') and options.convert_directions: - dir = musicxml_direction_to_indicator (n.placement) + if hasattr(n, 'placement') and hasattr(options, 'convert_directions') and options.convert_directions: + dir = musicxml_direction_to_indicator(n.placement) dirtype_children = [] # TODO: The direction-type is used for grouping (e.g. dynamics with text), # so we can't simply flatten them out! - for dt in n.get_typed_children (musicxml.DirType): - dirtype_children += dt.get_all_children () + for dt in n.get_typed_children(musicxml.DirType): + dirtype_children += dt.get_all_children() for entry in dirtype_children: - # backets, dashes, octave shifts. pedal marks, hairpins etc. are spanners: + # brackets, dashes, octave shifts. pedal marks, hairpins etc. are spanners: if entry.get_name() in directions_spanners: - event = musicxml_spanner_to_lily_event (entry) + event = musicxml_spanner_to_lily_event(entry) if event: - res.append (event) + event.force_direction=dir + res.append(event) continue # now treat all the "simple" ones, that can be translated using the dict ev = None - tmp_tp = directions_dict.get (entry.get_name (), None) - if isinstance (tmp_tp, str): # string means MarkEvent - ev = musicexp.MarkEvent (tmp_tp) - elif isinstance (tmp_tp, tuple): # tuple means (EventClass, "text") - ev = tmp_tp[0] (tmp_tp[1]) + tmp_tp = directions_dict.get(entry.get_name(), None) + if isinstance(tmp_tp, str): # string means MarkEvent + ev = musicexp.MarkEvent(tmp_tp) + elif isinstance(tmp_tp, tuple): # tuple means (EventClass, "text") + ev = tmp_tp[0](tmp_tp[1]) elif tmp_tp: - ev = tmp_tp (entry) + ev = tmp_tp(entry) if ev: # TODO: set the correct direction! Unfortunately, \mark in ly does # not seem to support directions! ev.force_direction = dir - res.append (ev) + res.append(ev) continue - if entry.get_name () == "dynamics": - for dynentry in entry.get_all_children (): - ev = musicxml_dynamics_to_lily_event (dynentry) + if entry.get_name() == "dynamics": + for dynentry in entry.get_all_children(): + ev = musicxml_dynamics_to_lily_event(dynentry) if ev: - res.append (ev) - - return res - -def musicxml_frame_to_lily_event (frame): - ev = musicexp.FretEvent () - ev.strings = frame.get_strings () - ev.frets = frame.get_frets () - #offset = frame.get_first_fret () - 1 - barre = [] - for fn in frame.get_named_children ('frame-note'): - fret = fn.get_fret () - if fret <= 0: - fret = "o" - el = [ fn.get_string (), fret ] - fingering = fn.get_fingering () - if fingering >= 0: - el.append (fingering) - ev.elements.append (el) - b = fn.get_barre () - if b == 'start': - barre[0] = el[0] # start string - barre[2] = el[1] # fret - elif b == 'stop': - barre[1] = el[0] # end string - if barre: - ev.barre = barre - return ev + ev.force_direction = dir + res.append(ev) -def musicxml_harmony_to_lily (n): - res = [] - for f in n.get_named_children ('frame'): - ev = musicxml_frame_to_lily_event (f) - if ev: - res.append (ev) return res - notehead_styles_dict = { 'slash': '\'slash', 'triangle': '\'triangle', @@ -1585,63 +1594,44 @@ notehead_styles_dict = { 'ti': '\'ti', } -def musicxml_notehead_to_lily (nh): - styles = [] - - # Notehead style - style = notehead_styles_dict.get (nh.get_text ().strip (), None) - style_elm = musicexp.NotestyleEvent () - if style: - style_elm.style = style - if hasattr (nh, 'filled'): - style_elm.filled = (getattr (nh, 'filled') == "yes") - if style_elm.style or (style_elm.filled != None): - styles.append (style_elm) - - # parentheses - if hasattr (nh, 'parentheses') and (nh.parentheses == "yes"): - styles.append (musicexp.ParenthesizeEvent ()) - - return styles - -def musicxml_chordpitch_to_lily (mxl_cpitch): - r = musicexp.ChordPitch () - r.alteration = mxl_cpitch.get_alteration () - r.step = musicxml_step_to_lily (mxl_cpitch.get_step ()) +def musicxml_chordpitch_to_lily(mxl_cpitch): + r = musicexp.ChordPitch() + r.alteration = mxl_cpitch.get_alteration() + r.step = musicxml2ly_conversion.musicxml_step_to_lily(mxl_cpitch.get_step()) return r chordkind_dict = { - 'major': '5', - 'minor': 'm5', - 'augmented': 'aug5', - 'diminished': 'dim5', + 'major': r'{}:5', + 'minor': r'{}:m5', + 'augmented': r'{}:aug5', + 'diminished': r'{}:dim5', # Sevenths: - 'dominant': '7', - 'dominant-seventh': '7', - 'major-seventh': 'maj7', - 'minor-seventh': 'm7', - 'diminished-seventh': 'dim7', - 'augmented-seventh': 'aug7', - 'half-diminished': 'dim5m7', - 'major-minor': 'maj7m5', + 'dominant': r'{}:7', + 'dominant-seventh': r'{}:7', + 'major-seventh': r'{}:maj7', + 'minor-seventh': r'{}:m7', + 'diminished-seventh': r'{}:dim7', + 'augmented-seventh': r'{}:aug7', + 'half-diminished': r'{}:dim5m7', + 'major-minor': r'{}:maj7m5', # Sixths: - 'major-sixth': '6', - 'minor-sixth': 'm6', + 'major-sixth': r'{}:6', + 'minor-sixth': r'{}:m6', # Ninths: - 'dominant-ninth': '9', - 'major-ninth': 'maj9', - 'minor-ninth': 'm9', + 'dominant-ninth': r'{}:9', + 'major-ninth': r'{}:maj9', + 'minor-ninth': r'{}:m9', # 11ths (usually as the basis for alteration): - 'dominant-11th': '11', - 'major-11th': 'maj11', - 'minor-11th': 'm11', + 'dominant-11th': r'{}:11', + 'major-11th': r'{}:maj11', + 'minor-11th': r'{}:m11', # 13ths (usually as the basis for alteration): - 'dominant-13th': '13.11', - 'major-13th': 'maj13.11', - 'minor-13th': 'm13', + 'dominant-13th': r'{}:13.11', + 'major-13th': r'{}:maj13.11', + 'minor-13th': r'{}:m13', # Suspended: - 'suspended-second': 'sus2', - 'suspended-fourth': 'sus4', + 'suspended-second': r'{}:sus2', + 'suspended-fourth': r'{}:sus4', # Functional sixths: # TODO #'Neapolitan': '???', @@ -1650,34 +1640,118 @@ chordkind_dict = { #'German': '???', # Other: #'pedal': '???',(pedal-point bass) - 'power': '5^3', + 'power': r'\powerChords {}:1.5', #'Tristan': '???', - 'other': '1', + 'other': r'{}:1', 'none': None, } -def musicxml_chordkind_to_lily (kind): - res = chordkind_dict.get (kind, None) +def musicxml_chordkind_to_lily(kind): + res = chordkind_dict.get(kind, None) # Check for None, since a major chord is converted to '' if res == None: - ly.warning (_ ("Unable to convert chord type %s to lilypond.") % kind) + ly.warning(_("Unable to convert chord type %s to lilypond.") % kind) + return res + + +# Global variable for guitar string tunings +string_tunings = None + +def musicxml_get_string_tunings(lines): + global string_tunings + if (string_tunings == None): + if not lines: + lines = 6 + string_tunings = [musicexp.Pitch()] * lines + for i in range(0, lines): + p = musicexp.Pitch() + p.step = musicxml2ly_conversion.musicxml_step_to_lily(((("E","A","D","G","B")*(lines/5+1))[0:lines])[i]) + p.octave = (([-2+int(x%5>1)+2*(x/5) for x in range(0,lines)][0:lines])[i]) + p.alteration = 0 + p._force_absolute_pitch = True + string_tunings[i] = p + string_tunings = string_tunings[::-1] + return string_tunings[0:lines] + +def musicxml_frame_to_lily_event(frame): + ev = musicexp.FretEvent() + ev.strings = frame.get_strings() + ev.frets = frame.get_frets() + #offset = frame.get_first_fret() - 1 + #offset = frame.get_first_fret() + barre = [] + open_strings = range(1,ev.strings+1) + for fn in frame.get_named_children('frame-note'): + fret = fn.get_fret() + if fret <= 0: + fret = "o" + el = [ fn.get_string(), fret ] + fingering = fn.get_fingering() + if fingering >= 0: + el.append(fingering) + ev.elements.append(el) + open_strings.remove(fn.get_string()) + b = fn.get_barre() + if b == 'start': + barre.append(el[0]) # start string + barre.append(el[1]) # fret + elif b == 'stop': + barre.insert(1, el[0]) # end string + for string in open_strings: + ev.elements.append([string, 'x']) + ev.elements.sort() + ev.elements.reverse() + if barre: + ev.barre = barre + return ev + +def musicxml_harmony_to_lily(n): + res = [] + for f in n.get_named_children('frame'): + ev = musicxml_frame_to_lily_event(f) + if ev: + res.append(ev) + return res + +def musicxml_harmony_to_lily_fretboards(n): + res = [] + frame = n.get_maybe_exist_named_child('frame') + if frame: + strings = frame.get_strings() + if not strings: + strings = 6 + tunings = musicxml_get_string_tunings(strings) + ev = musicexp.FretBoardEvent() + #barre = [] + for fn in frame.get_named_children('frame-note'): + fbn = musicexp.FretBoardNote() + string = fn.get_string() + fbn.string = string + fingering = fn.get_fingering() + if fingering >= 0: + fbn.fingering = fingering + p = tunings[string-1].copy() + p.add_semitones(fn.get_fret()) + fbn.pitch = p + ev.append(fbn) + res.append(ev) return res -def musicxml_harmony_to_lily_chordname (n): +def musicxml_harmony_to_lily_chordname(n): res = [] - root = n.get_maybe_exist_named_child ('root') + root = n.get_maybe_exist_named_child('root') if root: - ev = musicexp.ChordNameEvent () - ev.root = musicxml_chordpitch_to_lily (root) - kind = n.get_maybe_exist_named_child ('kind') + ev = musicexp.ChordNameEvent() + ev.root = musicxml_chordpitch_to_lily(root) + kind = n.get_maybe_exist_named_child('kind') if kind: - ev.kind = musicxml_chordkind_to_lily (kind.get_text ()) + ev.kind = musicxml_chordkind_to_lily(kind.get_text()) if not ev.kind: return res - bass = n.get_maybe_exist_named_child ('bass') + bass = n.get_maybe_exist_named_child('bass') if bass: - ev.bass = musicxml_chordpitch_to_lily (bass) - inversion = n.get_maybe_exist_named_child ('inversion') + ev.bass = musicxml_chordpitch_to_lily(bass) + inversion = n.get_maybe_exist_named_child('inversion') if inversion: # TODO: LilyPond does not support inversions, does it? @@ -1689,17 +1763,17 @@ def musicxml_harmony_to_lily_chordname (n): # require you to know the chord and calculate either the fifth # pitch (for the first inversion) or the third pitch (for the # second inversion) so they may not be helpful for musicxml2ly. - inversion_count = string.atoi (inversion.get_text ()) + inversion_count = string.atoi(inversion.get_text()) if inversion_count == 1: # TODO: Calculate the bass note for the inversion... pass pass - for deg in n.get_named_children ('degree'): - d = musicexp.ChordModification () - d.type = deg.get_type () - d.step = deg.get_value () - d.alteration = deg.get_alter () - ev.add_modification (d) + for deg in n.get_named_children('degree'): + d = musicexp.ChordModification() + d.type = deg.get_type() + d.step = deg.get_value() + d.alteration = deg.get_alter() + ev.add_modification(d) #TODO: convert the user-symbols attribute: #major: a triangle, like Unicode 25B3 #minor: -, like Unicode 002D @@ -1707,12 +1781,11 @@ def musicxml_harmony_to_lily_chordname (n): #diminished: (degree), like Unicode 00B0 #half-diminished: (o with slash), like Unicode 00F8 if ev and ev.root: - res.append (ev) - + res.append(ev) return res -def musicxml_figured_bass_note_to_lily (n): - res = musicexp.FiguredBassNote () +def musicxml_figured_bass_note_to_lily(n): + res = musicexp.FiguredBassNote() suffix_dict = { 'sharp' : "+", 'flat' : "-", 'natural' : "!", @@ -1720,16 +1793,16 @@ def musicxml_figured_bass_note_to_lily (n): 'flat-flat' : "--", 'sharp-sharp' : "++", 'slash' : "/" } - prefix = n.get_maybe_exist_named_child ('prefix') + prefix = n.get_maybe_exist_named_child('prefix') if prefix: - res.set_prefix (suffix_dict.get (prefix.get_text (), "")) - fnumber = n.get_maybe_exist_named_child ('figure-number') + res.set_prefix(suffix_dict.get(prefix.get_text(), "")) + fnumber = n.get_maybe_exist_named_child('figure-number') if fnumber: - res.set_number (fnumber.get_text ()) - suffix = n.get_maybe_exist_named_child ('suffix') + res.set_number(fnumber.get_text()) + suffix = n.get_maybe_exist_named_child('suffix') if suffix: - res.set_suffix (suffix_dict.get (suffix.get_text (), "")) - if n.get_maybe_exist_named_child ('extend'): + res.set_suffix(suffix_dict.get(suffix.get_text(), "")) + if n.get_maybe_exist_named_child('extend'): # TODO: Implement extender lines (unfortunately, in lilypond you have # to use \set useBassFigureExtenders = ##t, which turns them on # globally, while MusicXML has a property for each note... @@ -1740,24 +1813,24 @@ def musicxml_figured_bass_note_to_lily (n): -def musicxml_figured_bass_to_lily (n): - if not isinstance (n, musicxml.FiguredBass): +def musicxml_figured_bass_to_lily(n): + if not isinstance(n, musicxml.FiguredBass): return - res = musicexp.FiguredBassEvent () - for i in n.get_named_children ('figure'): - note = musicxml_figured_bass_note_to_lily (i) + res = musicexp.FiguredBassEvent() + for i in n.get_named_children('figure'): + note = musicxml_figured_bass_note_to_lily(i) if note: - res.append (note) - dur = n.get_maybe_exist_named_child ('duration') + res.append(note) + dur = n.get_maybe_exist_named_child('duration') if dur: # apply the duration to res length = Rational(int(dur.get_text()), n._divisions) * Rational(1, 4) - res.set_real_duration (length) - duration = rational_to_lily_duration (length) + res.set_real_duration(length) + duration = musicxml2ly_conversion.rational_to_lily_duration(length) if duration: - res.set_duration (duration) - if hasattr (n, 'parentheses') and n.parentheses == "yes": - res.set_parentheses (True) + res.set_duration(duration) + if hasattr(n, 'parentheses') and n.parentheses == "yes": + res.set_parentheses(True) return res instrument_drumtype_dict = { @@ -1769,85 +1842,26 @@ instrument_drumtype_dict = { 'Bass Drum': 'bassdrum', } -def musicxml_note_to_lily_main_event (n): - pitch = None - duration = None - event = None - - mxl_pitch = n.get_maybe_exist_typed_child (musicxml.Pitch) - if mxl_pitch: - pitch = musicxml_pitch_to_lily (mxl_pitch) - event = musicexp.NoteEvent () - event.pitch = pitch - - acc = n.get_maybe_exist_named_child ('accidental') - if acc: - # AccidentalCautionary in lily has parentheses - # so treat accidental explicitly in parentheses as cautionary - if hasattr(acc, 'parentheses') and acc.parentheses == "yes": - event.cautionary = True - else: - event.cautionary = acc.cautionary - # TODO: Handle editorial accidentals - # TODO: Handle the level-display setting for displaying brackets/parentheses - - elif n.get_maybe_exist_typed_child (musicxml.Unpitched): - # Unpitched elements have display-step and can also have - # display-octave. - unpitched = n.get_maybe_exist_typed_child (musicxml.Unpitched) - event = musicexp.NoteEvent () - event.pitch = musicxml_unpitched_to_lily (unpitched) - - elif n.get_maybe_exist_typed_child (musicxml.Rest): - # rests can have display-octave and display-step, which are - # treated like an ordinary note pitch - rest = n.get_maybe_exist_typed_child (musicxml.Rest) - event = musicexp.RestEvent () - if options.convert_rest_positions: - pitch = musicxml_restdisplay_to_lily (rest) - event.pitch = pitch - - elif n.instrument_name: - event = musicexp.NoteEvent () - drum_type = instrument_drumtype_dict.get (n.instrument_name) - if drum_type: - event.drum_type = drum_type - else: - n.message (_ ("drum %s type unknown, please add to instrument_drumtype_dict") % n.instrument_name) - event.drum_type = 'acousticsnare' - - else: - n.message (_ ("cannot find suitable event")) - if event: - event.duration = musicxml_duration_to_lily (n) - noteheads = n.get_named_children ('notehead') - for nh in noteheads: - styles = musicxml_notehead_to_lily (nh) - for s in styles: - event.add_associated_event (s) - - return event - -def musicxml_lyrics_to_text (lyrics): +def musicxml_lyrics_to_text(lyrics, ignoremelismata): # TODO: Implement text styles for lyrics syllables continued = False extended = False text = '' - for e in lyrics.get_all_children (): - if isinstance (e, musicxml.Syllabic): - continued = e.continued () - elif isinstance (e, musicxml.Text): + for e in lyrics.get_all_children(): + if isinstance(e, musicxml.Syllabic): + continued = e.continued() + elif isinstance(e, musicxml.Text): # We need to convert soft hyphens to -, otherwise the ascii codec as well # as lilypond will barf on that character - text += string.replace( e.get_text(), u'\xad', '-' ) - elif isinstance (e, musicxml.Elision): + text += string.replace(e.get_text(), u'\xad', '-') + elif isinstance(e, musicxml.Elision): if text: text += " " continued = False extended = False - elif isinstance (e, musicxml.Extend): + elif isinstance(e, musicxml.Extend): if text: text += " " extended = True @@ -1857,195 +1871,298 @@ def musicxml_lyrics_to_text (lyrics): elif text == "_" and extended: return "__" elif continued and text: - return musicxml.escape_ly_output_string (text) + " --" + if hasattr(options, 'convert_beaming') and options.convert_beaming: + if (ignoremelismata == "on"): + return " \set ignoreMelismata = ##t " + utilities.escape_ly_output_string (text) + elif (ignoremelismata == "off"): + return " " + utilities.escape_ly_output_string(text) + " -- \unset ignoreMelismata" + else: + return " " + utilities.escape_ly_output_string(text) + " --" + else: + return " " + utilities.escape_ly_output_string(text) + " -- " elif continued: return "--" elif extended and text: - return musicxml.escape_ly_output_string (text) + " __" + return " " + utilities.escape_ly_output_string(text) + " __" elif extended: return "__" elif text: - return musicxml.escape_ly_output_string (text) + return " " + utilities.escape_ly_output_string(text) else: return "" ## TODO class NegativeSkip: - def __init__ (self, here, dest): + def __init__(self, here, dest): self.here = here self.dest = dest class LilyPondVoiceBuilder: - def __init__ (self): + def __init__(self): self.elements = [] self.pending_dynamics = [] - self.end_moment = Rational (0) - self.begin_moment = Rational (0) - self.pending_multibar = Rational (0) + self.end_moment = Rational(0) + self.begin_moment = Rational(0) + self.pending_multibar = Rational(0) self.ignore_skips = False self.has_relevant_elements = False - self.measure_length = Rational (4, 4) + self.measure_length = Rational(4, 4) + self.stay_here = False - def _insert_multibar (self): - layout_information.set_context_item ('Score', 'skipBars = ##t') - r = musicexp.MultiMeasureRest () + def _insert_multibar(self): + layout_information.set_context_item('Score', 'skipBars = ##t') + r = musicexp.MultiMeasureRest() lenfrac = self.measure_length - r.duration = rational_to_lily_duration (lenfrac) + r.duration = musicxml2ly_conversion.rational_to_lily_duration(lenfrac) r.duration.factor *= self.pending_multibar / lenfrac - self.elements.append (r) + self.elements.append(r) self.begin_moment = self.end_moment self.end_moment = self.begin_moment + self.pending_multibar - self.pending_multibar = Rational (0) + self.pending_multibar = Rational(0) - def set_measure_length (self, mlen): + def set_measure_length(self, mlen): if (mlen != self.measure_length) and self.pending_multibar: - self._insert_multibar () + self._insert_multibar() self.measure_length = mlen - def add_multibar_rest (self, duration): + def add_multibar_rest(self, duration): self.pending_multibar += duration - def set_duration (self, duration): + def set_duration(self, duration): self.end_moment = self.begin_moment + duration - def current_duration (self): + def current_duration(self): return self.end_moment - self.begin_moment - def add_music (self, music, duration, relevant=True): - assert isinstance (music, musicexp.Music) - if self.pending_multibar > Rational (0): - self._insert_multibar () + def add_pending_dynamics(self): + for d in self.pending_dynamics: + self.elements.append(d) + self.pending_dynamics = [] + + def add_music(self, music, duration, relevant=True): + assert isinstance(music, musicexp.Music) + if self.pending_multibar > Rational(0): + self._insert_multibar() self.has_relevant_elements = self.has_relevant_elements or relevant - self.elements.append (music) + + if isinstance(music, musicexp.BarLine): + if self.pending_dynamics: + for d in self.pending_dynamics: + if not isinstance(d, (musicexp.SpanEvent, musicexp.DynamicsEvent)): + index = self.pending_dynamics.index(d) + dyn = self.pending_dynamics.pop(index) + self.elements.append(dyn) + + self.elements.append(music) self.begin_moment = self.end_moment - self.set_duration (duration) + self.set_duration(duration) # Insert all pending dynamics right after the note/rest: - if isinstance (music, musicexp.ChordEvent) and self.pending_dynamics: - for d in self.pending_dynamics: - music.append (d) - self.pending_dynamics = [] + if isinstance(music, musicexp.ChordEvent) and self.pending_dynamics: + self.add_pending_dynamics() # Insert some music command that does not affect the position in the measure - def add_command (self, command, relevant=True): - assert isinstance (command, musicexp.Music) - if self.pending_multibar > Rational (0): - self._insert_multibar () + def add_command(self, command, relevant=True): + assert isinstance(command, musicexp.Music) + if self.pending_multibar > Rational(0): + self._insert_multibar() self.has_relevant_elements = self.has_relevant_elements or relevant - self.elements.append (command) - def add_barline (self, barline, relevant=False): + self.elements.append(command) + def add_barline(self, barline, relevant=False): # Insert only if we don't have a barline already # TODO: Implement proper merging of default barline and custom bar line has_relevant = self.has_relevant_elements if (not (self.elements) or not (isinstance (self.elements[-1], musicexp.BarLine)) or - (self.pending_multibar > Rational (0))): - self.add_music (barline, Rational (0)) + (self.pending_multibar > Rational(0))): + + self.add_music(barline, Rational(0)) + self.has_relevant_elements = has_relevant or relevant - def add_partial (self, command): + + def add_partial(self, command): self.ignore_skips = True # insert the partial, but restore relevant_elements (partial is not relevant) relevant = self.has_relevant_elements - self.add_command (command) + self.add_command(command) self.has_relevant_elements = relevant - def add_dynamics (self, dynamic): + def add_dynamics(self, dynamic): # store the dynamic item(s) until we encounter the next note/rest: - self.pending_dynamics.append (dynamic) + self.pending_dynamics.append(dynamic) - def add_bar_check (self, number): + def add_bar_check(self, number): # re/store has_relevant_elements, so that a barline alone does not # trigger output for figured bass, chord names - b = musicexp.BarLine () + b = musicexp.BarLine() b.bar_number = number - self.add_barline (b) - - def jumpto (self, moment): - current_end = self.end_moment + self.pending_multibar - diff = moment - current_end - - if diff < Rational (0): - ly.warning (_ ('Negative skip %s (from position %s to %s)') - % (diff, current_end, moment)) - diff = Rational (0) - - if diff > Rational (0) and not (self.ignore_skips and moment == 0): - skip = musicexp.SkipEvent() - duration_factor = 1 - duration_log = {1: 0, 2: 1, 4:2, 8:3, 16:4, 32:5, 64:6, 128:7, 256:8, 512:9}.get (diff.denominator (), -1) - duration_dots = 0 - # TODO: Use the time signature for skips, too. Problem: The skip - # might not start at a measure boundary! - if duration_log > 0: # denominator is a power of 2... - if diff.numerator () == 3: - duration_log -= 1 - duration_dots = 1 + self.add_barline(b) + + def jumpto(self, moment): + if (not self.stay_here): + current_end = self.end_moment + self.pending_multibar + diff = moment - current_end + + if diff < Rational(0): + ly.warning(_('Negative skip %s (from position %s to %s)') % + (diff, current_end, moment)) + diff = Rational(0) + + if diff > Rational(0) and not(self.ignore_skips and moment == 0): + skip = musicexp.SkipEvent() + duration_factor = 1 + duration_log = {1: 0, 2: 1, 4:2, 8:3, 16:4, 32:5, 64:6, 128:7, 256:8, 512:9}.get(diff.denominator(), -1) + duration_dots = 0 + # TODO: Use the time signature for skips, too. Problem: The skip + # might not start at a measure boundary! + if duration_log > 0: # denominator is a power of 2... + if diff.numerator() == 3: + duration_log -= 1 + duration_dots = 1 + else: + duration_factor = Rational(diff.numerator()) else: - duration_factor = Rational (diff.numerator ()) - else: - # for skips of a whole or more, simply use s1*factor - duration_log = 0 - duration_factor = diff - skip.duration.duration_log = duration_log - skip.duration.factor = duration_factor - skip.duration.dots = duration_dots - - evc = musicexp.ChordEvent () - evc.elements.append (skip) - self.add_music (evc, diff, False) + # for skips of a whole or more, simply use s1*factor + duration_log = 0 + duration_factor = diff + skip.duration.duration_log = duration_log + skip.duration.factor = duration_factor + skip.duration.dots = duration_dots - if diff > Rational (0) and moment == 0: - self.ignore_skips = False + evc = musicexp.ChordEvent() + evc.elements.append(skip) + self.add_music(evc, diff, False) - def last_event_chord (self, starting_at): + if diff > Rational(0) and moment == 0: + self.ignore_skips = False + def last_event_chord(self, starting_at): value = None # if the position matches, find the last ChordEvent, do not cross a bar line! at = len(self.elements) - 1 while (at >= 0 and - not isinstance (self.elements[at], musicexp.ChordEvent) and - not isinstance (self.elements[at], musicexp.BarLine)): + not isinstance(self.elements[at], musicexp.ChordEvent) and + not isinstance(self.elements[at], musicexp.BarLine)): at -= 1 if (self.elements and at >= 0 - and isinstance (self.elements[at], musicexp.ChordEvent) + and isinstance(self.elements[at], musicexp.ChordEvent) and self.begin_moment == starting_at): value = self.elements[at] else: - self.jumpto (starting_at) + self.jumpto(starting_at) value = None return value - def correct_negative_skip (self, goto): + def correct_negative_skip(self, goto): self.end_moment = goto self.begin_moment = goto - evc = musicexp.ChordEvent () - self.elements.append (evc) - + evc = musicexp.ChordEvent() + self.elements.append(evc) class VoiceData: - def __init__ (self): + def __init__(self): self.voicename = None self.voicedata = None self.ly_voice = None self.figured_bass = None self.chordnames = None + self.fretboards = None self.lyrics_dict = {} self.lyrics_order = [] -def measure_length_from_attributes (attr, current_measure_length): - len = attr.get_measure_length () +def measure_length_from_attributes(attr, current_measure_length): + len = attr.get_measure_length() if not len: len = current_measure_length return len -def musicxml_voice_to_lily_voice (voice): +def music_xml_voice_name_to_lily_name(part_id, name): + str = "Part%sVoice%s" % (part_id, name) + return musicxml_id_to_lily(str) + +def music_xml_lyrics_name_to_lily_name(part_id, name, lyricsnr): + str = music_xml_voice_name_to_lily_name(part_id, name)+("Lyrics%s" % lyricsnr) + return musicxml_id_to_lily(str) + +def music_xml_figuredbass_name_to_lily_name(part_id, voicename): + str = music_xml_voice_name_to_lily_name(part_id, voicename)+"FiguredBass" + return musicxml_id_to_lily(str) + +def music_xml_chordnames_name_to_lily_name(part_id, voicename): + str = music_xml_voice_name_to_lily_name(part_id, voicename)+"Chords" + return musicxml_id_to_lily(str) + +def music_xml_fretboards_name_to_lily_name(part_id, voicename): + str = music_xml_voice_name_to_lily_name(part_id, voicename)+"FretBoards" + return musicxml_id_to_lily(str) + +def get_all_lyric_parts_in_voice(voice): + ''' + Collect the indexes of all lyric parts in this voice. + In case not all of the current lyric parts are active (a typical case would be + a refrain/chorus), the current implementation inserts \skip-commands in the + inactive parts to keep them in sync. + ''' + all_lyric_parts = [] + for elem in voice._elements: + lyrics = elem.get_typed_children(musicxml.Lyric) + if lyrics: + for lyric in lyrics: + index = lyric.number + if not index in all_lyric_parts: + all_lyric_parts.append(index) + return all_lyric_parts + + +def extract_lyrics(voice, lyric_key, lyrics_dict): + curr_number = None + result = [] + + def is_note(elem): + return isinstance(elem, musicxml.Note) + + def is_rest(elem): + return elem.get_typed_children(musicxml.Rest) + + def is_note_and_not_rest(elem): + return is_note(elem) and not is_rest(elem) + + def get_lyric_elements(note): + return note.get_typed_children(musicxml.Lyric) + + def has_lyric_belonging_to_lyric_part(note, lyric_part_id): + lyric_elements = get_lyric_elements(note) + lyric_numbers = [lyric.number for lyric in lyric_elements] + return any([lyric_number == lyric_part_id for lyric_number in lyric_numbers]) + + for idx, elem in enumerate(voice._elements): + lyrics = get_lyric_elements(elem) + lyric_keys = [lyric.number for lyric in lyrics] + note_has_lyric_belonging_to_lyric_part = lyric_key in lyric_keys + # Current note has lyric with 'number' matching 'lyric_key'. + if note_has_lyric_belonging_to_lyric_part: + for lyric in lyrics: + if lyric.number == lyric_key: + text = musicxml_lyrics_to_text(lyric, None) + result.append(text) + # Note has any lyric. + elif get_lyric_elements(elem) and \ + not note_has_lyric_belonging_to_lyric_part: + result.append('\skip1 ') + # Note does not have any lyric attached to it. + elif is_note_and_not_rest(elem): + result.append('\skip1 ') + + lyrics_dict[lyric_key].extend(result) + +def musicxml_voice_to_lily_voice(voice): tuplet_events = [] modes_found = {} lyrics = {} - return_value = VoiceData () + return_value = VoiceData() return_value.voicedata = voice # First pitch needed for relative mode (if selected in command-line options) @@ -2062,153 +2179,190 @@ def musicxml_voice_to_lily_voice (voice): pending_figured_bass = [] pending_chordnames = [] + pending_fretboards = [] # Make sure that the keys in the dict don't get reordered, since # we need the correct ordering of the lyrics stanzas! By default, # a dict will reorder its keys - return_value.lyrics_order = voice.get_lyrics_numbers () + return_value.lyrics_order = voice.get_lyrics_numbers() for k in return_value.lyrics_order: lyrics[k] = [] - voice_builder = LilyPondVoiceBuilder () - figured_bass_builder = LilyPondVoiceBuilder () - chordnames_builder = LilyPondVoiceBuilder () - current_measure_length = Rational (4, 4) - voice_builder.set_measure_length (current_measure_length) + voice_builder = LilyPondVoiceBuilder() + figured_bass_builder = LilyPondVoiceBuilder() + chordnames_builder = LilyPondVoiceBuilder() + fretboards_builder = LilyPondVoiceBuilder() + current_measure_length = Rational(4, 4) + voice_builder.set_measure_length(current_measure_length) + in_slur = False - for n in voice._elements: + all_lyric_parts = set(get_all_lyric_parts_in_voice(voice)) + if lyrics.keys(): + for number in lyrics.keys(): + extracted_lyrics = extract_lyrics(voice, number, lyrics) + + for idx, n in enumerate(voice._elements): tie_started = False - if n.get_name () == 'forward': + if n.get_name() == 'forward': continue - staff = n.get_maybe_exist_named_child ('staff') + staff = n.get_maybe_exist_named_child('staff') if staff: - staff = staff.get_text () - if current_staff and staff <> current_staff and not n.get_maybe_exist_named_child ('chord'): - voice_builder.add_command (musicexp.StaffChange (staff)) + staff = staff.get_text() + if current_staff and staff <> current_staff and not n.get_maybe_exist_named_child('chord'): + voice_builder.add_command(musicexp.StaffChange(staff)) current_staff = staff - if isinstance (n, musicxml.Partial) and n.partial > 0: - a = musicxml_partial_to_lily (n.partial) + if isinstance(n, musicxml.Partial) and n.partial > 0: + a = musicxml_partial_to_lily(n.partial) if a: - voice_builder.add_partial (a) - figured_bass_builder.add_partial (a) - chordnames_builder.add_partial (a) + voice_builder.add_partial(a) + figured_bass_builder.add_partial(a) + chordnames_builder.add_partial(a) + fretboards_builder.add_partial(a) continue - is_chord = n.get_maybe_exist_named_child ('chord') - is_after_grace = (isinstance (n, musicxml.Note) and n.is_after_grace ()); + is_chord = n.get_maybe_exist_named_child('chord') + is_after_grace =(isinstance(n, musicxml.Note) and n.is_after_grace()); if not is_chord and not is_after_grace: try: - voice_builder.jumpto (n._when) - figured_bass_builder.jumpto (n._when) - chordnames_builder.jumpto (n._when) + voice_builder.jumpto(n._when) + figured_bass_builder.jumpto(n._when) + chordnames_builder.jumpto(n._when) + fretboards_builder.jumpto(n._when) except NegativeSkip, neg: - voice_builder.correct_negative_skip (n._when) - figured_bass_builder.correct_negative_skip (n._when) - chordnames_builder.correct_negative_skip (n._when) - n.message (_ ("Negative skip found: from %s to %s, difference is %s") % (neg.here, neg.dest, neg.dest - neg.here)) - - if isinstance (n, musicxml.Barline): - barlines = musicxml_barline_to_lily (n) + voice_builder.correct_negative_skip(n._when) + figured_bass_builder.correct_negative_skip(n._when) + chordnames_builder.correct_negative_skip(n._when) + fretboards_builder.correct_negative_skip(n._when) + n.message(_("Negative skip found: from %s to %s, difference is %s") % (neg.here, neg.dest, neg.dest - neg.here)) + + if isinstance(n, musicxml.Barline): + barlines = n.to_lily_object() for a in barlines: - if isinstance (a, musicexp.BarLine): - voice_builder.add_barline (a) - figured_bass_builder.add_barline (a, False) - chordnames_builder.add_barline (a, False) - elif isinstance (a, RepeatMarker) or isinstance (a, EndingMarker): - voice_builder.add_command (a) - figured_bass_builder.add_barline (a, False) - chordnames_builder.add_barline (a, False) + if isinstance(a, musicexp.BarLine): + voice_builder.add_barline(a) + figured_bass_builder.add_barline(a, False) + chordnames_builder.add_barline(a, False) + fretboards_builder.add_barline(a, False) + elif isinstance(a, musicxml2ly_conversion.RepeatMarker) or isinstance(a, musicxml2ly_conversion.EndingMarker): + voice_builder.add_command(a) + figured_bass_builder.add_barline(a, False) + chordnames_builder.add_barline(a, False) + fretboards_builder.add_barline(a, False) continue - - if isinstance (n, musicxml.Print): - for a in musicxml_print_to_lily (n): - voice_builder.add_command (a, False) + if isinstance(n, musicxml.Print): + for a in musicxml_print_to_lily(n): + voice_builder.add_command(a, False) continue # Continue any multimeasure-rests before trying to add bar checks! # Don't handle new MM rests yet, because for them we want bar checks! - rest = n.get_maybe_exist_typed_child (musicxml.Rest) - if (rest and rest.is_whole_measure () - and voice_builder.pending_multibar > Rational (0)): - voice_builder.add_multibar_rest (n._duration) + rest = n.get_maybe_exist_typed_child(musicxml.Rest) + if (rest and rest.is_whole_measure() + and voice_builder.pending_multibar > Rational(0)): + voice_builder.add_multibar_rest(n._duration) continue - # print a bar check at the beginning of each measure! - if n.is_first () and n._measure_position == Rational (0) and n != voice._elements[0]: + if n.is_first() and n._measure_position == Rational(0) and n != voice._elements[0]: try: - num = int (n.get_parent ().number) + num = int(n.get_parent().number) except ValueError: num = 0 if num > 0: - voice_builder.add_bar_check (num) - figured_bass_builder.add_bar_check (num) - chordnames_builder.add_bar_check (num) + voice_builder.add_bar_check(num) + figured_bass_builder.add_bar_check(num) + chordnames_builder.add_bar_check(num) + fretboards_builder.add_bar_check(num) + + if isinstance(n, musicxml.Direction): + # check if Direction already has been converted in another voice. + if n.converted: + continue + else: + n.converted = True + for direction in musicxml_direction_to_lily(n): + if direction.wait_for_note(): + voice_builder.add_dynamics(direction) + else: + voice_builder.add_command(direction) + continue # Start any new multimeasure rests - if (rest and rest.is_whole_measure ()): - voice_builder.add_multibar_rest (n._duration) - continue - - - if isinstance (n, musicxml.Direction): - for a in musicxml_direction_to_lily (n): - if a.wait_for_note (): - voice_builder.add_dynamics (a) - else: - voice_builder.add_command (a) + if (rest and rest.is_whole_measure()): + if pending_chordnames: + chordnames_builder.jumpto(n._when) + chordnames_builder.stay_here = True + if pending_figured_bass: + figured_bass_builder.jumpto(n._when) + figured_bass_builder.stay_here = True + if pending_fretboards: + fretboards_builder.jumpto(n._when) + fretboards_builder.stay_here = True + voice_builder.add_multibar_rest(n._duration) continue - if isinstance (n, musicxml.Harmony): - for a in musicxml_harmony_to_lily (n): - if a.wait_for_note (): - voice_builder.add_dynamics (a) - else: - voice_builder.add_command (a) - for a in musicxml_harmony_to_lily_chordname (n): - pending_chordnames.append (a) + if isinstance(n, musicxml.Harmony): + if (options.fretboards): + # Makes fretboard diagrams in a separate FretBoards voice + for a in musicxml_harmony_to_lily_fretboards(n): + pending_fretboards.append(a) + else: + # Makes markup fretboard-diagrams inside the voice + for a in musicxml_harmony_to_lily(n): + if a.wait_for_note(): + voice_builder.add_dynamics(a) + else: + voice_builder.add_command(a) + for a in musicxml_harmony_to_lily_chordname(n): + pending_chordnames.append(a) continue - if isinstance (n, musicxml.FiguredBass): - a = musicxml_figured_bass_to_lily (n) + if isinstance(n, musicxml.FiguredBass): + a = musicxml_figured_bass_to_lily(n) if a: - pending_figured_bass.append (a) + pending_figured_bass.append(a) continue - if isinstance (n, musicxml.Attributes): - for a in musicxml_attributes_to_lily (n): - voice_builder.add_command (a) - measure_length = measure_length_from_attributes (n, current_measure_length) + if isinstance(n, musicxml.Attributes): + for a in musicxml_attributes_to_lily(n): + voice_builder.add_command(a) + measure_length = measure_length_from_attributes(n, current_measure_length) if current_measure_length != measure_length: current_measure_length = measure_length - voice_builder.set_measure_length (current_measure_length) + voice_builder.set_measure_length(current_measure_length) continue if not n.__class__.__name__ == 'Note': - n.message (_ ('unexpected %s; expected %s or %s or %s') % (n, 'Note', 'Attributes', 'Barline')) + n.message(_('unexpected %s; expected %s or %s or %s') % (n, 'Note', 'Attributes', 'Barline')) continue - main_event = musicxml_note_to_lily_main_event (n) +# if not hasattr(conversion_settings, 'convert_rest_positions'): +# conversion_settings.convert_rest_positions = True + + main_event = n.to_lily_object( + convert_stem_directions=conversion_settings.convert_stem_directions, + convert_rest_positions=conversion_settings.convert_rest_positions) + if main_event and not first_pitch: first_pitch = main_event.pitch # ignore lyrics for notes inside a slur, tie, chord or beam - ignore_lyrics = inside_slur or is_tied or is_chord or is_beamed + ignore_lyrics = is_tied or is_chord #or is_beamed or inside_slur - if main_event and hasattr (main_event, 'drum_type') and main_event.drum_type: + if main_event and hasattr(main_event, 'drum_type') and main_event.drum_type: modes_found['drummode'] = True - ev_chord = voice_builder.last_event_chord (n._when) + ev_chord = voice_builder.last_event_chord(n._when) if not ev_chord: ev_chord = musicexp.ChordEvent() - voice_builder.add_music (ev_chord, n._duration) + voice_builder.add_music(ev_chord, n._duration) # For grace notes: - grace = n.get_maybe_exist_typed_child (musicxml.Grace) - if n.is_grace (): - is_after_grace = ev_chord.has_elements () or n.is_after_grace (); - is_chord = n.get_maybe_exist_typed_child (musicxml.Chord) + grace = n.get_maybe_exist_typed_child(musicxml.Grace) + if n.is_grace(): + is_after_grace = ev_chord.has_elements() or n.is_after_grace(); + is_chord = n.get_maybe_exist_typed_child(musicxml.Chord) grace_chord = None @@ -2216,64 +2370,81 @@ def musicxml_voice_to_lily_voice (voice): # whether we have a chord or not, obtain either a new ChordEvent or # the previous one to create a chord if is_after_grace: - if ev_chord.after_grace_elements and n.get_maybe_exist_typed_child (musicxml.Chord): - grace_chord = ev_chord.after_grace_elements.get_last_event_chord () + if ev_chord.after_grace_elements and n.get_maybe_exist_typed_child(musicxml.Chord): + grace_chord = ev_chord.after_grace_elements.get_last_event_chord() if not grace_chord: - grace_chord = musicexp.ChordEvent () - ev_chord.append_after_grace (grace_chord) - elif n.is_grace (): - if ev_chord.grace_elements and n.get_maybe_exist_typed_child (musicxml.Chord): - grace_chord = ev_chord.grace_elements.get_last_event_chord () + grace_chord = musicexp.ChordEvent() + ev_chord.append_after_grace(grace_chord) + elif n.is_grace(): + if ev_chord.grace_elements and n.get_maybe_exist_typed_child(musicxml.Chord): + grace_chord = ev_chord.grace_elements.get_last_event_chord() if not grace_chord: - grace_chord = musicexp.ChordEvent () - ev_chord.append_grace (grace_chord) + grace_chord = musicexp.ChordEvent() + ev_chord.append_grace(grace_chord) - if hasattr (grace, 'slash') and not is_after_grace: + if hasattr(grace, 'slash') and not is_after_grace: # TODO: use grace_type = "appoggiatura" for slurred grace notes if grace.slash == "yes": ev_chord.grace_type = "acciaccatura" # now that we have inserted the chord into the grace music, insert # everything into that chord instead of the ev_chord ev_chord = grace_chord - ev_chord.append (main_event) + ev_chord.append(main_event) ignore_lyrics = True else: - ev_chord.append (main_event) + ev_chord.append(main_event) # When a note/chord has grace notes (duration==0), the duration of the # event chord is not yet known, but the event chord was already added # with duration 0. The following correct this when we hit the real note! - if voice_builder.current_duration () == 0 and n._duration > 0: - voice_builder.set_duration (n._duration) + if voice_builder.current_duration() == 0 and n._duration > 0: + voice_builder.set_duration(n._duration) # if we have a figured bass, set its voice builder to the correct position # and insert the pending figures if pending_figured_bass: try: - figured_bass_builder.jumpto (n._when) + figured_bass_builder.jumpto(n._when) + if (figured_bass_builder.stay_here): + figured_bass_builder.stay_here = False except NegativeSkip, neg: pass for fb in pending_figured_bass: # if a duration is given, use that, otherwise the one of the note dur = fb.real_duration if not dur: - dur = ev_chord.get_length () + dur = ev_chord.get_length() if not fb.duration: - fb.duration = ev_chord.get_duration () - figured_bass_builder.add_music (fb, dur) + fb.duration = ev_chord.get_duration() + figured_bass_builder.add_music(fb, dur) pending_figured_bass = [] if pending_chordnames: try: - chordnames_builder.jumpto (n._when) + chordnames_builder.jumpto(n._when) + if (chordnames_builder.stay_here): + chordnames_builder.stay_here = False except NegativeSkip, neg: pass for cn in pending_chordnames: # Assign the duration of the EventChord - cn.duration = ev_chord.get_duration () - chordnames_builder.add_music (cn, ev_chord.get_length ()) + cn.duration = ev_chord.get_duration() + chordnames_builder.add_music(cn, ev_chord.get_length()) pending_chordnames = [] - notations_children = n.get_typed_children (musicxml.Notations) + if pending_fretboards: + try: + fretboards_builder.jumpto(n._when) + if (fretboards_builder.stay_here): + fretboards_builder.stay_here = False + except NegativeSkip, neg: + pass + for fb in pending_fretboards: + # Assign the duration of the EventChord + fb.duration = ev_chord.get_duration() + fretboards_builder.add_music(fb, ev_chord.get_length()) + pending_fretboards = [] + + notations_children = n.get_typed_children(musicxml.Notations) tuplet_event = None span_events = [] @@ -2284,76 +2455,76 @@ def musicxml_voice_to_lily_voice (voice): # accidental-mark | other-notation for notations in notations_children: for tuplet_event in notations.get_tuplets(): - time_mod = n.get_maybe_exist_typed_child (musicxml.Time_modification) - tuplet_events.append ((ev_chord, tuplet_event, time_mod)) + time_mod = n.get_maybe_exist_typed_child(musicxml.Time_modification) + tuplet_events.append((ev_chord, tuplet_event, time_mod)) # First, close all open slurs, only then start any new slur # TODO: Record the number of the open slur to dtermine the correct # closing slur! - endslurs = [s for s in notations.get_named_children ('slur') - if s.get_type () in ('stop')] + endslurs = [s for s in notations.get_named_children('slur') + if s.get_type() in ('stop')] if endslurs and not inside_slur: - endslurs[0].message (_ ('Encountered closing slur, but no slur is open')) + endslurs[0].message(_('Encountered closing slur, but no slur is open')) elif endslurs: - if len (endslurs) > 1: - endslurs[0].message (_ ('Cannot have two simultaneous (closing) slurs')) + if len(endslurs) > 1: + endslurs[0].message(_('Cannot have two simultaneous (closing) slurs')) # record the slur status for the next note in the loop inside_slur = False - lily_ev = musicxml_spanner_to_lily_event (endslurs[0]) - ev_chord.append (lily_ev) + lily_ev = musicxml_spanner_to_lily_event(endslurs[0]) + ev_chord.append(lily_ev) - startslurs = [s for s in notations.get_named_children ('slur') - if s.get_type () in ('start')] + startslurs = [s for s in notations.get_named_children('slur') + if s.get_type() in('start')] if startslurs and inside_slur: - startslurs[0].message (_ ('Cannot have a slur inside another slur')) + startslurs[0].message(_('Cannot have a slur inside another slur')) elif startslurs: - if len (startslurs) > 1: - startslurs[0].message (_ ('Cannot have two simultaneous slurs')) + if len(startslurs) > 1: + startslurs[0].message(_('Cannot have two simultaneous slurs')) # record the slur status for the next note in the loop inside_slur = True - lily_ev = musicxml_spanner_to_lily_event (startslurs[0]) - ev_chord.append (lily_ev) + lily_ev = musicxml_spanner_to_lily_event(startslurs[0]) + ev_chord.append(lily_ev) if not grace: - mxl_tie = notations.get_tie () + mxl_tie = notations.get_tie() if mxl_tie and mxl_tie.type == 'start': - ev_chord.append (musicexp.TieEvent ()) + ev_chord.append(musicexp.TieEvent()) is_tied = True tie_started = True else: is_tied = False - fermatas = notations.get_named_children ('fermata') + fermatas = notations.get_named_children('fermata') for a in fermatas: - ev = musicxml_fermata_to_lily_event (a) + ev = musicxml_fermata_to_lily_event(a) if ev: - ev_chord.append (ev) + ev_chord.append(ev) - arpeggiate = notations.get_named_children ('arpeggiate') + arpeggiate = notations.get_named_children('arpeggiate') for a in arpeggiate: - ev = musicxml_arpeggiate_to_lily_event (a) + ev = musicxml_arpeggiate_to_lily_event(a) if ev: - ev_chord.append (ev) + ev_chord.append(ev) - arpeggiate = notations.get_named_children ('non-arpeggiate') + arpeggiate = notations.get_named_children('non-arpeggiate') for a in arpeggiate: - ev = musicxml_nonarpeggiate_to_lily_event (a) + ev = musicxml_nonarpeggiate_to_lily_event(a) if ev: - ev_chord.append (ev) + ev_chord.append(ev) - glissandos = notations.get_named_children ('glissando') - glissandos += notations.get_named_children ('slide') + glissandos = notations.get_named_children('glissando') + glissandos += notations.get_named_children('slide') for a in glissandos: - ev = musicxml_spanner_to_lily_event (a) + ev = musicxml_spanner_to_lily_event(a) if ev: - ev_chord.append (ev) + ev_chord.append(ev) # accidental-marks are direct children of ! - for a in notations.get_named_children ('accidental-mark'): - ev = musicxml_articulation_to_lily_event (a) + for a in notations.get_named_children('accidental-mark'): + ev = musicxml_articulation_to_lily_event(a) if ev: - ev_chord.append (ev) + ev_chord.append(ev) # Articulations can contain the following child elements: # accent | strong-accent | staccato | tenuto | @@ -2370,88 +2541,85 @@ def musicxml_voice_to_lily_voice (voice): # trill-mark | turn | delayed-turn | inverted-turn | # shake | wavy-line | mordent | inverted-mordent | # schleifer | tremolo | other-ornament, accidental-mark - ornaments = notations.get_named_children ('ornaments') - ornaments += notations.get_named_children ('articulations') - ornaments += notations.get_named_children ('technical') + ornaments = notations.get_named_children('ornaments') + ornaments += notations.get_named_children('articulations') + ornaments += notations.get_named_children('technical') for a in ornaments: - for ch in a.get_all_children (): - ev = musicxml_articulation_to_lily_event (ch) + for ch in a.get_all_children(): + ev = musicxml_articulation_to_lily_event(ch) if ev: - ev_chord.append (ev) + ev_chord.append(ev) - dynamics = notations.get_named_children ('dynamics') + dynamics = notations.get_named_children('dynamics') for a in dynamics: - for ch in a.get_all_children (): - ev = musicxml_dynamics_to_lily_event (ch) + for ch in a.get_all_children(): + ev = musicxml_dynamics_to_lily_event(ch) if ev: - ev_chord.append (ev) + ev_chord.append(ev) - mxl_beams = [b for b in n.get_named_children ('beam') - if (b.get_type () in ('begin', 'end') - and b.is_primary ())] + mxl_beams = [b for b in n.get_named_children('beam') + if (b.get_type() in('begin', 'end') + and b.is_primary())] if mxl_beams and not conversion_settings.ignore_beaming: - beam_ev = musicxml_spanner_to_lily_event (mxl_beams[0]) + beam_ev = musicxml_spanner_to_lily_event(mxl_beams[0]) if beam_ev: - ev_chord.append (beam_ev) + ev_chord.append(beam_ev) if beam_ev.span_direction == -1: # beam and thus melisma starts here is_beamed = True elif beam_ev.span_direction == 1: # beam and thus melisma ends here is_beamed = False - # Extract the lyrics - if not rest and not ignore_lyrics: - note_lyrics_processed = [] - note_lyrics_elements = n.get_typed_children (musicxml.Lyric) - for l in note_lyrics_elements: - if l.get_number () < 0: - for k in lyrics.keys (): - lyrics[k].append (musicxml_lyrics_to_text (l)) - note_lyrics_processed.append (k) - else: - lyrics[l.number].append(musicxml_lyrics_to_text (l)) - note_lyrics_processed.append (l.number) - for lnr in lyrics.keys (): - if not lnr in note_lyrics_processed: - lyrics[lnr].append ("\skip4") - # Assume that a element only lasts for one note. # This might not be correct MusicXML interpretation, but works for # most cases and fixes broken files, which have the end tag missing if is_tied and not tie_started: is_tied = False - ## force trailing mm rests to be written out. - voice_builder.add_music (musicexp.ChordEvent (), Rational (0)) + # force trailing mm rests to be written out. + # voice_builder.add_music (musicexp.ChordEvent(), Rational(0)) + if hasattr(options, 'shift_meter') and options.shift_meter: + for event in voice_builder.elements: + if isinstance(event, musicexp.TimeSignatureChange): + sd = [] + for i in range(0,5): + sd.append(musicexp.ShiftDurations()) + sd[i].set_shift_durations_parameters(event) + break; - ly_voice = group_tuplets (voice_builder.elements, tuplet_events) - ly_voice = group_repeats (ly_voice) + ly_voice = group_tuplets(voice_builder.elements, tuplet_events) + ly_voice = group_repeats(ly_voice) - seq_music = musicexp.SequentialMusic () + seq_music = musicexp.SequentialMusic() - if 'drummode' in modes_found.keys (): + if 'drummode' in modes_found.keys(): ## \key barfs in drummode. ly_voice = [e for e in ly_voice if not isinstance(e, musicexp.KeySignatureChange)] seq_music.elements = ly_voice - for k in lyrics.keys (): - return_value.lyrics_dict[k] = musicexp.Lyrics () + for k in lyrics.keys(): + return_value.lyrics_dict[k] = musicexp.Lyrics() return_value.lyrics_dict[k].lyrics_syllables = lyrics[k] - if len (modes_found) > 1: - ly.warning (_ ('cannot simultaneously have more than one mode: %s') % modes_found.keys ()) + if len(modes_found) > 1: + ly.warning(_('cannot simultaneously have more than one mode: %s') % modes_found.keys()) + + if hasattr(options, 'shift_meter') and options.shift_meter: + sd[-1].element = seq_music + seq_music = sd[-1] + sd.pop() - if options.relative: - v = musicexp.RelativeMusic () + if hasattr(options, 'relative') and options.relative: + v = musicexp.RelativeMusic() v.element = seq_music v.basepitch = first_pitch seq_music = v return_value.ly_voice = seq_music - for mode in modes_found.keys (): + for mode in modes_found.keys(): v = musicexp.ModeChangingMusicWrapper() v.element = seq_music v.mode = mode @@ -2459,81 +2627,87 @@ def musicxml_voice_to_lily_voice (voice): # create \figuremode { figured bass elements } if figured_bass_builder.has_relevant_elements: - fbass_music = musicexp.SequentialMusic () - fbass_music.elements = group_repeats (figured_bass_builder.elements) + fbass_music = musicexp.SequentialMusic() + fbass_music.elements = group_repeats(figured_bass_builder.elements) v = musicexp.ModeChangingMusicWrapper() v.mode = 'figuremode' v.element = fbass_music + if hasattr(options, 'shift_meter') and options.shift_meter: + sd[-1].element = v + v = sd[-1] + sd.pop() return_value.figured_bass = v # create \chordmode { chords } if chordnames_builder.has_relevant_elements: - cname_music = musicexp.SequentialMusic () - cname_music.elements = group_repeats (chordnames_builder.elements) + cname_music = musicexp.SequentialMusic() + cname_music.elements = group_repeats(chordnames_builder.elements) v = musicexp.ModeChangingMusicWrapper() v.mode = 'chordmode' v.element = cname_music + if hasattr(options, 'shift_meter') and options.shift_meter: + sd[-1].element = v + v = sd[-1] + sd.pop() return_value.chordnames = v + # create diagrams for FretBoards engraver + if fretboards_builder.has_relevant_elements: + fboard_music = musicexp.SequentialMusic() + fboard_music.elements = group_repeats(fretboards_builder.elements) + v = musicexp.MusicWrapper() + v.element = fboard_music + if hasattr(options, 'shift_meter') and options.shift_meter: + sd[-1].element = v + v = sd[-1] + sd.pop() + return_value.fretboards = v + + # coll = [] + # pending = [] + + # for elt in return_value.ly_voice.element.elements: + # if isinstance(elt, musicexp.TimeScaledMusic): + # print elt.element.elements + # pending.append(elt) + # else: + # coll.append(elt) + + # if pending: + # coll.extend(pending) + + # return_value.ly_voice.element.elements = coll + return return_value -def musicxml_id_to_lily (id): +def musicxml_id_to_lily(id): digits = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten'] for digit in digits: - d = digits.index (digit) - id = re.sub ('%d' % d, digit, id) + d = digits.index(digit) + id = re.sub('%d' % d, digit, id) - id = re.sub ('[^a-zA-Z]', 'X', id) + id = re.sub('[^a-zA-Z]', 'X', id) return id -def musicxml_pitch_to_lily (mxl_pitch): - p = musicexp.Pitch () - p.alteration = mxl_pitch.get_alteration () - p.step = musicxml_step_to_lily (mxl_pitch.get_step ()) - p.octave = mxl_pitch.get_octave () - 4 - return p - -def musicxml_unpitched_to_lily (mxl_unpitched): - p = None - step = mxl_unpitched.get_step () - if step: - p = musicexp.Pitch () - p.step = musicxml_step_to_lily (step) - octave = mxl_unpitched.get_octave () - if octave and p: - p.octave = octave - 4 - return p - -def musicxml_restdisplay_to_lily (mxl_rest): - p = None - step = mxl_rest.get_step () - if step: - p = musicexp.Pitch () - p.step = musicxml_step_to_lily (step) - octave = mxl_rest.get_octave () - if octave and p: - p.octave = octave - 4 - return p - -def voices_in_part (part): +def voices_in_part(part): """Return a Name -> Voice dictionary for PART""" - part.interpret () - part.extract_voices () - voices = part.get_voices () - part_info = part.get_staff_attributes () + part.interpret() + part.extract_voices() + voices = part.get_voices() + part_info = part.get_staff_attributes() return (voices, part_info) -def voices_in_part_in_parts (parts): +def voices_in_part_in_parts(parts): """return a Part -> Name -> Voice dictionary""" - # don't crash if p doesn't have an id (that's invalid MusicXML, - # but such files are out in the wild! + # don't crash if Part doesn't have an id (that's invalid MusicXML, + # but such files are out in the wild!) dictionary = {} for p in parts: - voices = voices_in_part (p) - if (hasattr (p, "id")): + voices = voices_in_part(p) + if (hasattr(p, "id")): dictionary[p.id] = voices else: # TODO: extract correct part id from other sources @@ -2541,18 +2715,19 @@ def voices_in_part_in_parts (parts): return dictionary; -def get_all_voices (parts): - all_voices = voices_in_part_in_parts (parts) +def get_all_voices(parts): + all_voices = voices_in_part_in_parts(parts) all_ly_voices = {} all_ly_staffinfo = {} - for p, (name_voice, staff_info) in all_voices.items (): + for p, (name_voice, staff_info) in all_voices.items(): part_ly_voices = {} - for n, v in name_voice.items (): - ly.progress (_ ("Converting to LilyPond expressions..."), True) + for n, v in name_voice.items(): + ly.progress(_("Converting to LilyPond expressions..."), True) # musicxml_voice_to_lily_voice returns (lily_voice, {nr->lyrics, nr->lyrics}) - part_ly_voices[n] = musicxml_voice_to_lily_voice (v) + voice = musicxml_voice_to_lily_voice(v) + part_ly_voices[n] = voice all_ly_voices[p] = part_ly_voices all_ly_staffinfo[p] = staff_info @@ -2560,23 +2735,24 @@ def get_all_voices (parts): return (all_ly_voices, all_ly_staffinfo) -def option_parser (): - p = ly.get_option_parser (usage = _ ("musicxml2ly [OPTION]... FILE.xml"), - description = -_ ("""Convert MusicXML from FILE.xml to LilyPond input. +def option_parser(): + p = ly.get_option_parser(usage=_("musicxml2ly [OPTION]... FILE.xml"), + description= +_("""Convert MusicXML from FILE.xml to LilyPond input. If the given filename is -, musicxml2ly reads from the command line. """), add_help_option=False) p.add_option("-h", "--help", action="help", - help=_ ("show this help and exit")) + help=_("show this help and exit")) - p.version = ('''%prog (LilyPond) @TOPLEVEL_VERSION@\n\n''' + p.version = ('%prog (LilyPond) ' + lilypond_version + '\n\n' + -_ ("""Copyright (c) 2005--2012 by +_ ("""Copyright (c) 2005--2016 by Han-Wen Nienhuys , Jan Nieuwenhuizen and Reinhold Kainhofer + Patrick L. Schmidt """ + """ @@ -2589,41 +2765,41 @@ information.""") % 'lilypond') action="version", help=_ ("show version number and exit")) - p.add_option ('-v', '--verbose', + p.add_option('-v', '--verbose', action="callback", callback=ly.handle_loglevel_option, callback_args=("DEBUG",), - help = _ ("be verbose")) - - p.add_option ('', '--lxml', - action = "store_true", - default = False, - dest = "use_lxml", - help = _ ("use lxml.etree; uses less memory and cpu time")) - - p.add_option ('-z', '--compressed', - action = "store_true", - dest = 'compressed', - default = False, - help = _ ("input file is a zip-compressed MusicXML file")) - - p.add_option ('-r', '--relative', - action = "store_true", - default = True, - dest = "relative", - help = _ ("convert pitches in relative mode (default)")) - - p.add_option ('-a', '--absolute', - action = "store_false", - dest = "relative", - help = _ ("convert pitches in absolute mode")) - - p.add_option ('-l', '--language', - metavar = _ ("LANG"), - action = "store", - help = _ ("use LANG for pitch names, e.g. 'deutsch' for note names in German")) - - p.add_option ("--loglevel", + help=_ ("be verbose")) + + p.add_option('', '--lxml', + action="store_true", + default=False, + dest="use_lxml", + help=_ ("use lxml.etree; uses less memory and cpu time")) + + p.add_option('-z', '--compressed', + action="store_true", + dest='compressed', + default=False, + help=_ ("input file is a zip-compressed MusicXML file")) + + p.add_option('-r', '--relative', + action="store_true", + default=True, + dest="relative", + help=_ ("convert pitches in relative mode (default)")) + + p.add_option('-a', '--absolute', + action="store_false", + dest="relative", + help=_ ("convert pitches in absolute mode")) + + p.add_option('-l', '--language', + metavar=_ ("LANG"), + action="store", + help=_ ("use LANG for pitch names, e.g. 'deutsch' for note names in German")) + + p.add_option("--loglevel", help=_ ("Print log messages according to LOGLEVEL " "(NONE, ERROR, WARNING, PROGRESS (default), DEBUG)"), metavar=_ ("LOGLEVEL"), @@ -2631,67 +2807,110 @@ information.""") % 'lilypond') callback=ly.handle_loglevel_option, type='string') - p.add_option ('--nd', '--no-articulation-directions', - action = "store_false", - default = True, - dest = "convert_directions", - help = _ ("do not convert directions (^, _ or -) for articulations, dynamics, etc.")) - - p.add_option ('--nrp', '--no-rest-positions', - action = "store_false", - default = True, - dest = "convert_rest_positions", - help = _ ("do not convert exact vertical positions of rests")) - - p.add_option ('--npl', '--no-page-layout', - action = "store_false", - default = True, - dest = "convert_page_layout", - help = _ ("do not convert the exact page layout and breaks")) - - p.add_option ('--no-beaming', - action = "store_false", - default = True, - dest = "convert_beaming", - help = _ ("do not convert beaming information, use lilypond's automatic beaming instead")) - - p.add_option ('-o', '--output', - metavar = _ ("FILE"), - action = "store", - default = None, - type = 'string', - dest = 'output_name', - help = _ ("set output filename to FILE, stdout if -")) - - p.add_option ('-m', '--midi', - action = "store_true", - default = False, - dest = "midi", - help = _("activate midi-block")) - - p.add_option_group ('', - description = ( + p.add_option('--nd', '--no-articulation-directions', + action="store_false", + default=True, + dest="convert_directions", + help=_ ("do not convert directions (^, _ or -) for articulations, dynamics, etc.")) + + p.add_option('--nrp', '--no-rest-positions', + action="store_false", + default=True, + dest="convert_rest_positions", + help=_ ("do not convert exact vertical positions of rests")) + + p.add_option('--nsb', '--no-system-breaks', + action="store_false", + default=True, + dest="convert_system_breaks", + help=_ ("ignore system breaks")) + + p.add_option('--npb', '--no-page-breaks', + action="store_false", + default=True, + dest="convert_page_breaks", + help=_ ("ignore page breaks")) + + p.add_option('--npm', '--no-page-margins', + action="store_false", + default=True, + dest="convert_page_margins", + help=_ ("ignore page margins")) + + p.add_option('--npl', '--no-page-layout', + action="store_false", + default=True, + dest="convert_page_layout", + help=_ ("do not convert the exact page layout and breaks (shortcut for \"--nsb --npb --npm\" options)")) + + p.add_option('--nsd', '--no-stem-directions', + action="store_false", + default=True, + dest="convert_stem_directions", + help=_ ("ignore stem directions from MusicXML, use lilypond's automatic stemming instead")) + + p.add_option('--nb', '--no-beaming', + action="store_false", + default=True, + dest="convert_beaming", + help=_ ("do not convert beaming information, use lilypond's automatic beaming instead")) + + p.add_option('-o', '--output', + metavar=_ ("FILE"), + action="store", + default=None, + type='string', + dest='output_name', + help=_ ("set output filename to FILE, stdout if -")) + + p.add_option('-m', '--midi', + action="store_true", + default=False, + dest="midi", + help=_("activate midi-block in .ly file")) + + # transpose function + p.add_option('--transpose', + metavar=_ ("TOPITCH"), + action="store", + dest="transpose", + help=_ ("set pitch to transpose by the interval between pitch 'c' and TOPITCH")) + + # time signature changing function + p.add_option('--sm', '--shift-meter', + metavar=_ ("BEATS/BEATTYPE"), + action="store", + dest="shift_meter", + help=_ ("change the length|duration of notes as a function of a given time signature to make the score look faster or slower, (eg. '4/4' or '2/2')")) + + # switch tabstaff clef + p.add_option('--tc', '--tab-clef', + metavar=_ ("TABCLEFNAME"), + action="store", + dest="tab_clef", + help=_ ("switch between two versions of tab clefs (\"tab\" and \"moderntab\")")) + + # StringNumber stencil on/off + p.add_option('--sn', '--string-numbers', + metavar=_ ("t[rue]/f[alse]"), + action="store", + dest="string_numbers", + help=_ ("deactivate string number stencil with --string-numbers f[alse]. Default is t[rue]")) + + # StringNumber stencil on/off + p.add_option('--fb', '--fretboards', + action="store_true", + default=False, + dest="fretboards", + help=_("converts '' events to a separate FretBoards voice instead of markups")) + + p.add_option_group('', + description=( _ ("Report bugs via %s") % 'http://post.gmane.org/post.php' '?group=gmane.comp.gnu.lilypond.bugs') + '\n') return p -def music_xml_voice_name_to_lily_name (part_id, name): - str = "Part%sVoice%s" % (part_id, name) - return musicxml_id_to_lily (str) - -def music_xml_lyrics_name_to_lily_name (part_id, name, lyricsnr): - str = "Part%sVoice%sLyrics%s" % (part_id, name, lyricsnr) - return musicxml_id_to_lily (str) - -def music_xml_figuredbass_name_to_lily_name (part_id, voicename): - str = "Part%sVoice%sFiguredBass" % (part_id, voicename) - return musicxml_id_to_lily (str) - -def music_xml_chordnames_name_to_lily_name (part_id, voicename): - str = "Part%sVoice%sChords" % (part_id, voicename) - return musicxml_id_to_lily (str) - def print_voice_definitions (printer, part_list, voices): for part in part_list: part_id = part.id @@ -2703,23 +2922,27 @@ def print_voice_definitions (printer, part_list, voices): printer.newline() if voice.chordnames: cnname = music_xml_chordnames_name_to_lily_name (part_id, name) - printer.dump ('%s = ' % cnname ) + printer.dump ('%s = ' % cnname) voice.chordnames.print_ly (printer) printer.newline() for l in voice.lyrics_order: lname = music_xml_lyrics_name_to_lily_name (part_id, name, l) - printer.dump ('%s = ' % lname ) + printer.dump ('%s = ' % lname) voice.lyrics_dict[l].print_ly (printer) printer.newline() if voice.figured_bass: fbname = music_xml_figuredbass_name_to_lily_name (part_id, name) - printer.dump ('%s = ' % fbname ) + printer.dump ('%s = ' % fbname) voice.figured_bass.print_ly (printer) printer.newline() + if voice.fretboards: + fbdname = music_xml_fretboards_name_to_lily_name (part_id, name) + printer.dump ('%s = ' % fbdname) + voice.fretboards.print_ly (printer) + printer.newline() - -def uniq_list (l): - return dict ([(elt, 1) for elt in l]).keys () +def uniq_list(l): + return dict([(elt, 1) for elt in l]).keys() # format the information about the staff in the form # [staffid, @@ -2730,159 +2953,189 @@ def uniq_list (l): # ] # ] # raw_voices is of the form [(voicename, lyricsids, havefiguredbass)*] -def format_staff_info (part_id, staff_id, raw_voices): +def format_staff_info(part_id, staff_id, raw_voices): voices = [] - for (v, lyricsids, figured_bass, chordnames) in raw_voices: - voice_name = music_xml_voice_name_to_lily_name (part_id, v) - voice_lyrics = [music_xml_lyrics_name_to_lily_name (part_id, v, l) + for (v, lyricsids, figured_bass, chordnames, fretboards) in raw_voices: + voice_name = music_xml_voice_name_to_lily_name(part_id, v) + voice_lyrics = [music_xml_lyrics_name_to_lily_name(part_id, v, l) for l in lyricsids] figured_bass_name = '' if figured_bass: - figured_bass_name = music_xml_figuredbass_name_to_lily_name (part_id, v) + figured_bass_name = music_xml_figuredbass_name_to_lily_name(part_id, v) chordnames_name = '' if chordnames: - chordnames_name = music_xml_chordnames_name_to_lily_name (part_id, v) - voices.append ([voice_name, voice_lyrics, figured_bass_name, chordnames_name]) + chordnames_name = music_xml_chordnames_name_to_lily_name(part_id, v) + fretboards_name = '' + if fretboards: + fretboards_name = music_xml_fretboards_name_to_lily_name(part_id, v) + voices.append([voice_name, voice_lyrics, figured_bass_name, chordnames_name, fretboards_name]) return [staff_id, voices] -def update_score_setup (score_structure, part_list, voices): - +def update_score_setup(score_structure, part_list, voices, parts): for part_definition in part_list: part_id = part_definition.id - nv_dict = voices.get (part_id) + nv_dict = voices.get(part_id) if not nv_dict: - ly.warning (_ ('unknown part in part-list: %s') % part_id) + ly.warning(_('unknown part in part-list: %s') % part_id) continue - staves = reduce (lambda x,y: x+ y, - [voice.voicedata._staves.keys () - for voice in nv_dict.values ()], + staves = reduce(lambda x, y: x + y, + [voice.voicedata._staves.keys() + for voice in nv_dict.values()], []) staves_info = [] - if len (staves) > 1: + if len(staves) > 1: staves_info = [] - staves = uniq_list (staves) - staves.sort () + staves = uniq_list(staves) + staves.sort() for s in staves: - thisstaff_raw_voices = [(voice_name, voice.lyrics_order, voice.figured_bass, voice.chordnames) - for (voice_name, voice) in nv_dict.items () + thisstaff_raw_voices = [(voice_name, voice.lyrics_order, voice.figured_bass, voice.chordnames, voice.fretboards) + for (voice_name, voice) in nv_dict.items() if voice.voicedata._start_staff == s] - staves_info.append (format_staff_info (part_id, s, thisstaff_raw_voices)) + staves_info.append(format_staff_info(part_id, s, thisstaff_raw_voices)) else: - thisstaff_raw_voices = [(voice_name, voice.lyrics_order, voice.figured_bass, voice.chordnames) - for (voice_name, voice) in nv_dict.items ()] - staves_info.append (format_staff_info (part_id, None, thisstaff_raw_voices)) - score_structure.set_part_information (part_id, staves_info) + thisstaff_raw_voices = [(voice_name, voice.lyrics_order, voice.figured_bass, voice.chordnames, voice.fretboards) + for (voice_name, voice) in nv_dict.items()] + staves_info.append(format_staff_info(part_id, None, thisstaff_raw_voices)) + score_structure.set_part_information(part_id, staves_info) + + sounds = [] + for part in parts: + for measure in part.get_typed_children(musicxml.Measure): + for sound in measure.get_typed_children(musicxml.Sound): + sounds.append(sound) + for direction in measure.get_typed_children(musicxml.Direction): + for sound in direction.get_typed_children(musicxml.Sound): + sounds.append(sound) + + score_structure.set_tempo('100') + if len(sounds) != 0: + for sound in sounds: + if (sound.get_tempo() != None and sound.get_tempo() != ""): + score_structure.set_tempo(sound.get_tempo()) + break + # Set global values in the \layout block, like auto-beaming etc. -def update_layout_information (): +def update_layout_information(): if not conversion_settings.ignore_beaming and layout_information: - layout_information.set_context_item ('Score', 'autoBeaming = ##f') - -def print_ly_preamble (printer, filename): - printer.dump_version () - printer.print_verbatim ('%% automatically converted by musicxml2ly from %s\n' % filename) + layout_information.set_context_item('Score', 'autoBeaming = ##f') + if musicexp.get_string_numbers() == "f": + layout_information.set_context_item('Score', '\\override StringNumber #\'stencil = ##f') + +# \n\t\t\t\t\\override StringNumber #\'stencil = ##f + +def print_ly_preamble(printer, filename): + printer.dump_version(lilypond_version) + printer.print_verbatim('% automatically converted by musicxml2ly from ' + filename) + printer.newline() + printer.dump(r'\pointAndClickOff') + printer.newline() + if options.midi: + printer.newline() + printer.dump(r'\include "articulate.ly"') + printer.newline() -def print_ly_additional_definitions (printer, filename): +def print_ly_additional_definitions(printer, filename=None): if needed_additional_definitions: - printer.newline () - printer.print_verbatim ('%% additional definitions required by the score:') - printer.newline () + printer.newline() + printer.print_verbatim('%% additional definitions required by the score:') + printer.newline() for a in set(needed_additional_definitions): - printer.print_verbatim (additional_definitions.get (a, '')) - printer.newline () - printer.newline () + printer.print_verbatim(additional_definitions.get(a, '')) + printer.newline() + printer.newline() # Read in the tree from the given I/O object (either file or string) and # demarshall it using the classes from the musicxml.py file -def read_xml (io_object, use_lxml): +def read_xml(io_object, use_lxml): if use_lxml: import lxml.etree - tree = lxml.etree.parse (io_object) - mxl_tree = musicxml.lxml_demarshal_node (tree.getroot ()) + tree = lxml.etree.parse(io_object) + mxl_tree = musicxml.lxml_demarshal_node(tree.getroot()) return mxl_tree else: from xml.dom import minidom, Node doc = minidom.parse(io_object) node = doc.documentElement - return musicxml.minidom_demarshal_node (node) + return musicxml.minidom_demarshal_node(node) return None -def read_musicxml (filename, compressed, use_lxml): +def read_musicxml(filename, compressed, use_lxml): raw_string = None if compressed: if filename == "-": - ly.progress (_ ("Input is compressed, extracting raw MusicXML data from stdin"), True) + ly.progress(_("Input is compressed, extracting raw MusicXML data from stdin"), True) # unfortunately, zipfile.ZipFile can't read directly from # stdin, so copy everything from stdin to a temp file and read # that. TemporaryFile() will remove the file when it is closed. tmp = tempfile.TemporaryFile() sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0) # Make sys.stdin binary - bytes_read = sys.stdin.read (8192) + bytes_read = sys.stdin.read(8192) while bytes_read: for b in bytes_read: tmp.write(b) - bytes_read = sys.stdin.read (8192) - z = zipfile.ZipFile (tmp, "r") + bytes_read = sys.stdin.read(8192) + z = zipfile.ZipFile(tmp, "r") else: - ly.progress (_ ("Input file %s is compressed, extracting raw MusicXML data") % filename, True) - z = zipfile.ZipFile (filename, "r") - container_xml = z.read ("META-INF/container.xml") + ly.progress(_("Input file %s is compressed, extracting raw MusicXML data") % filename, True) + z = zipfile.ZipFile(filename, "r") + container_xml = z.read("META-INF/container.xml") if not container_xml: return None - container = read_xml (StringIO.StringIO (container_xml), use_lxml) + container = read_xml(StringIO.StringIO(container_xml), use_lxml) if not container: return None - rootfiles = container.get_maybe_exist_named_child ('rootfiles') + rootfiles = container.get_maybe_exist_named_child('rootfiles') if not rootfiles: return None - rootfile_list = rootfiles.get_named_children ('rootfile') + rootfile_list = rootfiles.get_named_children('rootfile') mxml_file = None - if len (rootfile_list) > 0: - mxml_file = getattr (rootfile_list[0], 'full-path', None) + if len(rootfile_list) > 0: + mxml_file = getattr(rootfile_list[0], 'full-path', None) if mxml_file: - raw_string = z.read (mxml_file) + raw_string = z.read(mxml_file) if raw_string: - io_object = StringIO.StringIO (raw_string) + io_object = StringIO.StringIO(raw_string) elif filename == "-": io_object = sys.stdin else: io_object = filename - return read_xml (io_object, use_lxml) + return read_xml(io_object, use_lxml) -def convert (filename, options): +def convert(filename, options): if filename == "-": - ly.progress (_ ("Reading MusicXML from Standard input ..."), True) + ly.progress(_("Reading MusicXML from Standard input ..."), True) else: - ly.progress (_ ("Reading MusicXML from %s ...") % filename, True) + ly.progress(_("Reading MusicXML from %s ...") % filename, True) - tree = read_musicxml (filename, options.compressed, options.use_lxml) - score_information = extract_score_information (tree) - paper_information = extract_paper_information (tree) + tree = read_musicxml(filename, options.compressed, options.use_lxml) + score_information = extract_score_information(tree) + paper_information = extract_paper_information(tree) - parts = tree.get_typed_children (musicxml.Part) - (voices, staff_info) = get_all_voices (parts) + parts = tree.get_typed_children(musicxml.Part) + (voices, staff_info) = get_all_voices(parts) score = None - mxl_pl = tree.get_maybe_exist_typed_child (musicxml.Part_list) + mxl_pl = tree.get_maybe_exist_typed_child(musicxml.Part_list) if mxl_pl: - score = extract_score_structure (mxl_pl, staff_info) - part_list = mxl_pl.get_named_children ("score-part") + score = extract_score_structure(mxl_pl, staff_info) + part_list = mxl_pl.get_named_children("score-part") # score information is contained in the , or tags - update_score_setup (score, part_list, voices) + update_score_setup(score, part_list, voices, parts) # After the conversion, update the list of settings for the \layout block - update_layout_information () + update_layout_information() if not options.output_name: - options.output_name = os.path.basename (filename) - options.output_name = os.path.splitext (options.output_name)[0] - elif re.match (".*\.ly", options.output_name): - options.output_name = os.path.splitext (options.output_name)[0] + options.output_name = os.path.basename(filename) + options.output_name = os.path.splitext(options.output_name)[0] + elif re.match(".*\.ly", options.output_name): + options.output_name = os.path.splitext(options.output_name)[0] #defs_ly_name = options.output_name + '-defs.ly' @@ -2890,78 +3143,108 @@ def convert (filename, options): output_ly_name = 'Standard output' else: output_ly_name = options.output_name + '.ly' - - ly.progress (_ ("Output to `%s'") % output_ly_name, True) + ly.progress(_("Output to `%s'") % output_ly_name, True) printer = musicexp.Output_printer() - #ly.progress (_ ("Output to `%s'") % defs_ly_name, True) + #ly.progress(_("Output to `%s'") % defs_ly_name, True) if (options.output_name == "-"): - printer.set_file (codecs.getwriter ("utf-8")(sys.stdout)) + printer.set_file(codecs.getwriter("utf-8")(sys.stdout)) else: - printer.set_file (codecs.open (output_ly_name, 'wb', encoding='utf-8')) - print_ly_preamble (printer, filename) - print_ly_additional_definitions (printer, filename) + printer.set_file(codecs.open(output_ly_name, 'wb', encoding='utf-8')) + print_ly_preamble(printer, filename) + print_ly_additional_definitions(printer, filename) if score_information: - score_information.print_ly (printer) + score_information.print_ly(printer) if paper_information and conversion_settings.convert_page_layout: - paper_information.print_ly (printer) + paper_information.print_ly(printer) if layout_information: - layout_information.print_ly (printer) - print_voice_definitions (printer, part_list, voices) + layout_information.print_ly(printer) + print_voice_definitions(printer, part_list, voices) + + printer.newline() + printer.dump("% The score definition") + printer.newline() + score.print_ly(printer) + printer.newline() - printer.newline () - printer.dump ("% The score definition") - printer.newline () - score.print_ly (printer) - printer.newline () + # Syntax update to current version + if (options.output_name != "-"): + version = os.popen("lilypond --version | head -1 | cut -d' ' -f3").read().strip() + ly.progress(_("Converting to current version (%s) notations ..." % version), True) + os.system("convert-ly -e %s 2> /dev/null" % utilities.escape_ly_output_string(output_ly_name)) return voices -def get_existing_filename_with_extension (filename, ext): - if os.path.exists (filename): +def get_existing_filename_with_extension(filename, ext): + if os.path.exists(filename): return filename newfilename = filename + "." + ext - if os.path.exists (newfilename): + if os.path.exists(newfilename): return newfilename; newfilename = filename + ext - if os.path.exists (newfilename): + if os.path.exists(newfilename): return newfilename; return '' -def main (): + +def main(): opt_parser = option_parser() global options - (options, args) = opt_parser.parse_args () + (options, args) = opt_parser.parse_args() if not args: opt_parser.print_usage() - sys.exit (2) + sys.exit(2) + # midi-block option if options.midi: - musicexp.set_create_midi (options.midi) + musicexp.set_create_midi(options.midi) + + # transpose function + if options.transpose: + musicexp.set_transpose(options.transpose) + + # tab clef option + if options.tab_clef: + musicexp.set_tab_clef(options.tab_clef) + + # string numbers option + if options.string_numbers: + musicexp.set_string_numbers(options.string_numbers) if options.language: - musicexp.set_pitch_language (options.language) - needed_additional_definitions.append (options.language) + musicexp.set_pitch_language(options.language) + needed_additional_definitions.append(options.language) additional_definitions[options.language] = "\\language \"%s\"\n" % options.language + conversion_settings.ignore_beaming = not options.convert_beaming conversion_settings.convert_page_layout = options.convert_page_layout + if conversion_settings.convert_page_layout: + conversion_settings.convert_system_breaks = options.convert_system_breaks + conversion_settings.convert_page_breaks = options.convert_page_breaks + conversion_settings.convert_page_margins = options.convert_page_margins + else: + conversion_settings.convert_system_breaks = False + conversion_settings.convert_page_breaks = False + conversion_settings.convert_page_margins = False + conversion_settings.convert_stem_directions = options.convert_stem_directions # Allow the user to leave out the .xml or xml on the filename basefilename = args[0].decode('utf-8') if basefilename == "-": # Read from stdin filename = "-" else: - filename = get_existing_filename_with_extension (basefilename, "xml") + filename = get_existing_filename_with_extension(basefilename, "xml") if not filename: - filename = get_existing_filename_with_extension (basefilename, "mxl") + filename = get_existing_filename_with_extension(basefilename, "mxl") options.compressed = True - if filename and filename.endswith ("mxl"): + if filename and filename.endswith("mxl"): options.compressed = True - if filename and (filename == "-" or os.path.exists (filename)): - voices = convert (filename, options) + if filename and (filename == "-" or os.path.exists(filename)): + voices = convert(filename, options) else: - ly.error (_ ("Unable to find input file %s") % basefilename) + ly.error(_("Unable to find input file %s") % basefilename) + sys.exit(1) if __name__ == '__main__': main() diff --git a/stepmake/stepmake/executable-rules.make b/stepmake/stepmake/executable-rules.make index d2950ed0cd..daf2d8659d 100644 --- a/stepmake/stepmake/executable-rules.make +++ b/stepmake/stepmake/executable-rules.make @@ -6,6 +6,8 @@ endef $(foreach a, $(MODULE_LIBS), $(eval $(call MODULE_LIB_template,$(a)))) -$(EXECUTABLE): $(outdir)/config.hh $(O_FILES) $(outdir)/version.hh $(MODULE_LIBS:%=%/$(outdir)/library.a) +$(O_FILES): $(outdir)/config.hh + +$(EXECUTABLE): $(O_FILES) $(outdir)/version.hh $(MODULE_LIBS:%=%/$(outdir)/library.a) $(foreach a, $(MODULE_LIBS), $(MAKE) -C $(a) && ) true - $(LD) -o $@ $(O_FILES) $(LOADLIBES) $(ALL_LDFLAGS) + $(CXX) -o $@ $(O_FILES) $(LOADLIBES) $(ALL_LDFLAGS) diff --git a/stepmake/stepmake/generic-vars.make b/stepmake/stepmake/generic-vars.make index b0fc521e93..fb75166e1b 100644 --- a/stepmake/stepmake/generic-vars.make +++ b/stepmake/stepmake/generic-vars.make @@ -1,9 +1,7 @@ -top-build-dir = $(shell cd $(depth) && pwd) -build-dir = $(shell cd . && pwd) -tree-dir = $(subst $(top-build-dir),,$(build-dir)) - -absdir = $(shell cd $(1) ; pwd) +top-build-dir := $(realpath $(depth) ) +build-dir := $(realpath . ) +tree-dir = $(subst $(top-build-dir),,$(build-dir)) ifneq ($(configure-srcdir),.) srcdir-build = 1 @@ -15,7 +13,7 @@ else src-depth = $(configure-srcdir) endif -top-src-dir := $(shell cd $(src-depth); pwd) +top-src-dir := $(realpath $(src-depth)) ifndef srcdir-build src-dir = . @@ -46,10 +44,6 @@ DEPTH = $(depth)/$(package-depth) INSTALLPY=$(buildscript-dir)/install -c INSTALL=$(INSTALLPY) -group-dir = $(shell cd $(DEPTH);pwd)/.. -patch-dir = $(group-dir)/patches -rpm-sources = $(release-dir) -rpm-build = $(group-dir)/RedHat/BUILD package-icon = $(outdir)/$(package)-icon.xpm ifneq ($(strip $(MY_PATCH_LEVEL)),) diff --git a/stepmake/stepmake/help2man-rules.make b/stepmake/stepmake/help2man-rules.make index 6c176bac5e..9e2f042128 100644 --- a/stepmake/stepmake/help2man-rules.make +++ b/stepmake/stepmake/help2man-rules.make @@ -23,6 +23,7 @@ endif ifeq ($(strip $(CROSS)),no) $(outdir)/%.1: $(outdir)/% $(buildscript-dir)/help2man + echo $(buildscript-dir)/help2man $(HELP2MAN_COMMAND) else # When cross building, some manpages will not build because the diff --git a/stepmake/stepmake/library-rules.make b/stepmake/stepmake/library-rules.make index 942c4f01df..18b1066e2b 100644 --- a/stepmake/stepmake/library-rules.make +++ b/stepmake/stepmake/library-rules.make @@ -1,5 +1,7 @@ -$(LIBRARY): $(outdir)/config.hh $(O_FILES) +$(O_FILES): $(outdir)/config.hh + +$(LIBRARY): $(O_FILES) $(AR) $(ARFLAGS) $@ $(O_FILES) # thanks to Nelson Beebe for this trick. $(RANLIB) $@ || $(AR) ts $@ || true diff --git a/stepmake/stepmake/metafont-rules.make b/stepmake/stepmake/metafont-rules.make index 5be005a198..45ff320f46 100644 --- a/stepmake/stepmake/metafont-rules.make +++ b/stepmake/stepmake/metafont-rules.make @@ -19,13 +19,15 @@ $(outdir)/%.tfm $(outdir)/%.log: %.mf # the soft link for mf2pt1.mp is for recent mpost versions # which no longer dump a .mem file $(outdir)/%.pfb: %.mf $(outdir)/mf2pt1.mem $(outdir)/%.log - $(DO_MF_DEP) TMP=`mktemp -d $(outdir)/pfbtemp.$*.XXXXXXXXX` \ - && ( cd $$TMP \ + $(DO_MF_DEP) TMP_DIR=`mktemp -d $(outdir)/pfbtemp.$*.XXXXXXXXX` \ + && ( cd $$TMP_DIR \ && ln -s ../mf2pt1.mem . \ && ln -s ../../mf2pt1.mp . \ - && MFINPUTS=$(abs-src-dir):..:: $(buildscript-dir)/mf2pt1 $(MF2PT1_OPTIONS) $< $(METAFONT_QUIET)) \ - && mv $$TMP/*pfb $(outdir); \ - rm -rf $$TMP + && MFINPUTS=$(abs-src-dir):..:: \ + FONTFORGE=$(FONTFORGE) \ + $(buildscript-dir)/mf2pt1 $(MF2PT1_OPTIONS) $< $(METAFONT_QUIET)) \ + && mv $$TMP_DIR/*pfb $(outdir); \ + rm -rf $$TMP_DIR # since recent mpost versions no longer create a mem file, we create a dummy # file to satisfy the dependency (which gets overwritten in case an older diff --git a/stepmake/stepmake/metafont-vars.make b/stepmake/stepmake/metafont-vars.make index 73f35a53ed..1e50a183f5 100644 --- a/stepmake/stepmake/metafont-vars.make +++ b/stepmake/stepmake/metafont-vars.make @@ -34,5 +34,6 @@ $(foreach f, $(shell test -f $(1) && sed -ne "/^[[:space:]]*input[[:space:]]/s/^ ) # Find dependencies for the target $@, based on the metafont source file $<, -# and write the dependencies to a .dep file. -DO_MF_DEP = ( echo ./$@: $(call scan-mf,$<) > $(basename $@).dep ) && +# and write the dependencies to a .dep file. We cannot strip the extension of $@, +# because we have multiple rules generating .dep files. +DO_MF_DEP = ( echo ./$@: $(call scan-mf,$<) > $@.dep ) && diff --git a/stepmake/stepmake/po-targets.make b/stepmake/stepmake/po-targets.make index 8a0dd76053..ef8b1c5cae 100644 --- a/stepmake/stepmake/po-targets.make +++ b/stepmake/stepmake/po-targets.make @@ -9,7 +9,7 @@ XGETTEXT_OPTIONS = \ --package-name=$(package) \ --package-version=$(VERSION) -sed-header = \# Translation of LilyPond\n\# Copyright \(C\) 1998--2012 Han-Wen Nienhuys, Jan Nieuwenhuizen.\n\# This file is distributed under the same license as the LilyPond package. +sed-header = \# Translation of LilyPond\n\# Copyright \(C\) 1998--2015 Han-Wen Nienhuys, Jan Nieuwenhuizen.\n\# This file is distributed under the same license as the LilyPond package. sed-content = "Content-Type: text\/plain; charset=UTF-8\\n" #### diff --git a/stepmake/stepmake/shared-library-rules.make b/stepmake/stepmake/shared-library-rules.make index 62b2db26d2..3c80a08de4 100644 --- a/stepmake/stepmake/shared-library-rules.make +++ b/stepmake/stepmake/shared-library-rules.make @@ -1,4 +1,5 @@ +$(O_FILES): $(outdir)/config.hh -$(SHARED_LIBRARY): $(outdir)/config.hh $(LO_FILES) +$(SHARED_LIBRARY): $(LO_FILES) $(LD) $(SHARED_FLAGS) -o $@ $(LO_FILES) $(ALL_LDFLAGS) diff --git a/stepmake/stepmake/test-rules.make b/stepmake/stepmake/test-rules.make index d733dbbe69..7fbb413c78 100644 --- a/stepmake/stepmake/test-rules.make +++ b/stepmake/stepmake/test-rules.make @@ -6,6 +6,6 @@ endef $(foreach a, $(MODULE_LIBS), $(eval $(call MODULE_LIB_template,$(a)))) -$(TEST_EXECUTABLE): $(outdir)/config.hh $(TEST_O_FILES) $(TEST_MODULE_LIBS:%=%/$(outdir)/library.a) +$(TEST_EXECUTABLE): $(TEST_O_FILES) $(TEST_MODULE_LIBS:%=%/$(outdir)/library.a) $(foreach a, $(TEST_MODULE_LIBS), $(MAKE) -C $(a) && ) true - $(LD) -o $@ $(TEST_O_FILES) $(TEST_LOADLIBES) $(ALL_LDFLAGS) + $(CXX) -o $@ $(TEST_O_FILES) $(TEST_LOADLIBES) $(ALL_LDFLAGS) diff --git a/stepmake/stepmake/texinfo-rules.make b/stepmake/stepmake/texinfo-rules.make index 063a346091..4747347a90 100644 --- a/stepmake/stepmake/texinfo-rules.make +++ b/stepmake/stepmake/texinfo-rules.make @@ -68,9 +68,9 @@ endif $(outdir)/%.pdf: $(outdir)/%.texi $(outdir)/version.itexi $(outdir)/%.pdf.omf $(outdir)/weblinks.itexi | $(OUT_TEXINFO_MANUALS) ifeq ($(WEB_VERSION),yes) - $(buildscript-dir)/run-and-check "cd $(outdir); texi2pdf $(TEXI2PDF_FLAGS) -D web_version -I $(abs-src-dir) $(TEXINFO_PAPERSIZE_OPTION) $(\^^M' is replaced by a single space. % @@ -478,14 +523,13 @@ % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} + +% \parseargdef - define a command taking an argument on the line +% % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} -% -% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my -% favourite TeX trick. --kasal, 16nov03 - \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } @@ -596,7 +640,7 @@ \def\:{\spacefactor=1000 } % @* forces a line break. -\def\*{\hfil\break\hbox{}\ignorespaces} +\def\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak @@ -675,21 +719,26 @@ \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. + \addgroupbox + \prevdepth = \dimen1 + \checkinserts +} + +\def\addgroupbox{ % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). - \dimen2 = \pageheight \advance\dimen2 by -\pagetotal + \dimen2 = \txipageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 - \ifdim \pagetotal < \vfilllimit\pageheight + \ifdim \pagetotal < \vfilllimit\txipageheight \page \fi \fi \box\groupbox - \prevdepth = \dimen1 - \checkinserts } + % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. @@ -932,12 +981,20 @@ where each line of input produces a line of output.} % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment % -\def\comment{\begingroup \catcode`\^^M=\other% +\def\comment{\begingroup \catcode`\^^M=\active% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other\commentxxx}% + +{\catcode`\^^M=\active% +\gdef\commentxxx#1^^M{\endgroup% +\futurelet\nexttoken\commentxxxx}% +\gdef\commentxxxx{\ifx\nexttoken\aftermacro\expandafter\comment\fi}% +} + +\def\c{\begingroup \catcode`\^^M=\active% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% -\commentxxx} -{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} -% -\let\c=\comment +\cxxx} +{\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}} +% See comment in \scanmacro about why the definitions of @c and @comment differ % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. @@ -1008,69 +1065,23 @@ where each line of input produces a line of output.} % paragraph. % \gdef\dosuppressfirstparagraphindent{% - \gdef\indent{% - \restorefirstparagraphindent - \indent - }% - \gdef\noindent{% - \restorefirstparagraphindent - \noindent - }% - \global\everypar = {% - \kern -\parindent - \restorefirstparagraphindent - }% + \gdef\indent {\restorefirstparagraphindent \indent}% + \gdef\noindent{\restorefirstparagraphindent \noindent}% + \global\everypar = {\kern -\parindent \restorefirstparagraphindent}% } - +% \gdef\restorefirstparagraphindent{% - \global \let \indent = \ptexindent - \global \let \noindent = \ptexnoindent - \global \everypar = {}% + \global\let\indent = \ptexindent + \global\let\noindent = \ptexnoindent + \global\everypar = {}% } % @refill is a no-op. \let\refill=\relax -% If working on a large document in chapters, it is convenient to -% be able to disable indexing, cross-referencing, and contents, for test runs. -% This is done with @novalidate (before @setfilename). -% -\newif\iflinks \linkstrue % by default we want the aux files. -\let\novalidate = \linksfalse - -% @setfilename is done at the beginning of every texinfo file. -% So open here the files we need to have open while reading the input. -% This makes it possible to make a .fmt file for texinfo. -\def\setfilename{% - \fixbackslash % Turn off hack to swallow `\input texinfo'. - \iflinks - \tryauxfile - % Open the new aux file. TeX will close it automatically at exit. - \immediate\openout\auxfile=\jobname.aux - \fi % \openindices needs to do some work in any case. - \openindices - \let\setfilename=\comment % Ignore extra @setfilename cmds. - % - % If texinfo.cnf is present on the system, read it. - % Useful for site-wide @afourpaper, etc. - \openin 1 texinfo.cnf - \ifeof 1 \else \input texinfo.cnf \fi - \closein 1 - % - \comment % Ignore the actual filename. -} - -% Called from \setfilename. -% -\def\openindices{% - \newindex{cp}% - \newcodeindex{fn}% - \newcodeindex{vr}% - \newcodeindex{tp}% - \newcodeindex{ky}% - \newcodeindex{pg}% -} +% @setfilename INFO-FILENAME - ignored +\let\setfilename=\comment % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} @@ -1088,10 +1099,69 @@ where each line of input produces a line of output.} \newtoks\toksC \newtoks\toksD \newbox\boxA +\newbox\boxB \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest +% +% For LuaTeX +% + +\ifx\luatexversion\thisisundefined +\else + % Escape PDF strings UTF-8 to UTF-16 + \begingroup + \catcode`\%=12 + \directlua{ + function UTF16oct(str) + tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377') + for c in string.utfvalues(str) do + if c < 0x10000 then + tex.sprint( + string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. + string.char(0x5c) .. string.char(0x25) .. '03o', + (c / 256), (c % 256))) + else + c = c - 0x10000 + local c_hi = c / 1024 + 0xd800 + local c_lo = c % 1024 + 0xdc00 + tex.sprint( + string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. + string.char(0x5c) .. string.char(0x25) .. '03o' .. + string.char(0x5c) .. string.char(0x25) .. '03o' .. + string.char(0x5c) .. string.char(0x25) .. '03o', + (c_hi / 256), (c_hi % 256), + (c_lo / 256), (c_lo % 256))) + end + end + end + } + \endgroup + \def\pdfescapestring#1{\directlua{UTF16oct('\luaescapestring{#1}')}} + \ifnum\luatexversion>84 + % For LuaTeX >= 0.85 + \def\pdfdest{\pdfextension dest} + \let\pdfoutput\outputmode + \def\pdfliteral{\pdfextension literal} + \def\pdfcatalog{\pdfextension catalog} + \def\pdftexversion{\numexpr\pdffeedback version\relax} + \let\pdfximage\saveimageresource + \let\pdfrefximage\useimageresource + \let\pdflastximage\lastsavedimageresourceindex + \def\pdfendlink{\pdfextension endlink\relax} + \def\pdfoutline{\pdfextension outline} + \def\pdfstartlink{\pdfextension startlink} + \def\pdffontattr{\pdfextension fontattr} + \def\pdfobj{\pdfextension obj} + \def\pdflastobj{\numexpr\pdffeedback lastobj\relax} + \let\pdfpagewidth\pagewidth + \let\pdfpageheight\pageheight + \edef\pdfhorigin{\pdfvariable horigin} + \edef\pdfvorigin{\pdfvariable vorigin} + \fi +\fi + % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined @@ -1136,15 +1206,17 @@ output) for that.)} \ifpdf % - % Color manipulation macros based on pdfcolor.tex, + % Color manipulation macros using ideas from pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead - % of actual black. + % of actual black. The dark red here is dark enough to print on paper as + % nearly black, but still distinguishable for online viewing. We use + % black by default, though. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % - % k sets the color for filling (usual text, etc.); - % K sets the color for stroking (thin rules, e.g., normal _'s). + % rg sets the color for filling (usual text, etc.); + % RG sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, @@ -1249,10 +1321,9 @@ output) for that.)} % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % - % by default, use a color that is dark enough to print on paper as - % nearly black, but still distinguishable for online viewing. - \def\urlcolor{\rgbDarkRed} - \def\linkcolor{\rgbDarkRed} + % by default, use black for everything. + \def\urlcolor{\rgbBlack} + \def\linkcolor{\rgbBlack} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines @@ -1274,18 +1345,23 @@ output) for that.)} % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. - \edef\pdfoutlinedest{#3}% - \ifx\pdfoutlinedest\empty - \def\pdfoutlinedest{#4}% - \else - \txiescapepdf\pdfoutlinedest - \fi - % - % Also escape PDF chars in the display string. - \edef\pdfoutlinetext{#1}% - \txiescapepdf\pdfoutlinetext - % - \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% + { + \ifx\luatexversion\thisisundefined \else + \turnoffactive % LuaTeX can use Unicode strings for PDF + \fi + \edef\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty + \def\pdfoutlinedest{#4}% + \else + \txiescapepdf\pdfoutlinedest + \fi + % + % Also escape PDF chars in the display string. + \edef\pdfoutlinetext{#1}% + \txiescapepdf\pdfoutlinetext + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% + } } % \def\pdfmakeoutlines{% @@ -1440,6 +1516,232 @@ output) for that.)} \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput +% +% For XeTeX +% +\newif\iftxiuseunicodedestname +\ifx\XeTeXrevision\thisisundefined +\else + % + % XeTeX version check + % + \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99995}>-1 + % XeTeX 0.99995+ contains xdvipdfmx 20160307+. + % It can handle Unicode destination name for PDF. + \txiuseunicodedestnametrue + \else + % XeTeX < 0.99995 can not handle Unicode destination name for PDF + % because xdvipdfmx 20150315 has UTF-16 convert issue. + % It fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). + \txiuseunicodedestnamefalse + \fi + % + % PDF outline support + % + % Emulate the primitive of pdfTeX + \def\pdfdest name#1 xyz{% + \special{pdf:dest (name#1) [@thispage /XYZ @xpos @ypos]}% + } + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code, and characters + % such as \, aren't expanded when present in a section title. + \indexnofonts + \iftxiuseunicodedestname + \def\pdfdestname{#1}% Pass through Unicode characters. + \else + \edef\pdfdestname{#1}% Replace Unicode characters to ASCII. + \fi + \turnoffactive + \makevalueexpandable + \txiescapepdf\pdfdestname + \safewhatsit{\pdfdest name{\pdfdestname} xyz}% + }} + % + \def\dopdfoutline#1#2#3#4{% + \iftxiuseunicodedestname + \def\pdfoutlinedest{#3}% Pass through Unicode characters. + \else + \edef\pdfoutlinedest{#3}% Replace Unicode characters to ASCII. + \fi + \ifx\pdfoutlinedest\empty + \def\pdfoutlinedest{#4}% + \fi + { + \turnoffactive + \txiescapepdf\pdfoutlinedest + \edef\pdfoutlinetext{#1}% + \txiescapepdf\pdfoutlinetext + % + \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A + << /S /GoTo /D (name\pdfoutlinedest) >> >> }% + } + } + % + \def\pdfmakeoutlines{% + \begingroup + % + % In the case of XeTeX, counts of subentries is not necesary. + % Therefore, read toc only once. + % + % We use the node names as the destinations. + \def\partentry##1##2##3##4{}% ignore parts in the outlines + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{1}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{2}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{3}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{4}{##3}{##4}}% + % + \let\appentry\numchapentry% + \let\appsecentry\numsecentry% + \let\appsubsecentry\numsubsecentry% + \let\appsubsubsecentry\numsubsubsecentry% + \let\unnchapentry\numchapentry% + \let\unnsecentry\numsecentry% + \let\unnsubsecentry\numsubsecentry% + \let\unnsubsubsecentry\numsubsubsecentry% + % + % In the case of XeTeX, xdvipdfmx converts strings to UTF-16. + % Therefore, the encoding and the language may not be considered. + % + \indexnofonts + \setupdatafile + % We can have normal brace characters in the PDF outlines, unlike + % Texinfo index files. So set that up. + \def\{{\lbracecharliteral}% + \def\}{\rbracecharliteral}% + \catcode`\\=\active \otherbackslash + \input \tocreadfilename + \endgroup + } + {\catcode`[=1 \catcode`]=2 + \catcode`{=\other \catcode`}=\other + \gdef\lbracecharliteral[{]% + \gdef\rbracecharliteral[}]% + ] + + \special{pdf:docview << /PageMode /UseOutlines >> } + % ``\special{pdf:tounicode ...}'' is not necessary + % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it. + % However, due to UTF-16 convert issue of xdvipdfmx 20150315, + % ``\special{pdf:dest ...}'' can not handle non-ASCII strings. + % It fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). +% + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \nextsp} + \def\getfilename#1{% + \filenamelength=0 + % If we don't expand the argument now, \skipspaces will get + % snagged on things like "@value{foo}". + \edef\temp{#1}% + \expandafter\skipspaces\temp|\relax + } + % make a live url in pdf output. + \def\pdfurl#1{% + \begingroup + % it seems we really need yet another set of dummies; have not + % tried to figure out what each command should do in the context + % of @url. for now, just make @/ a no-op, that's the only one + % people have actually reported a problem with. + % + \normalturnoffactive + \def\@{@}% + \let\/=\empty + \makevalueexpandable + % do we want to go so far as to use \indexnofonts instead of just + % special-casing \var here? + \def\var##1{##1}% + % + \leavevmode\setcolor{\urlcolor}% + \special{pdf:bann << /Border [0 0 0] + /Subtype /Link /A << /S /URI /URI (#1) >> >>}% + \endgroup} + \def\endlink{\setcolor{\maincolor}\special{pdf:eann}} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \special{pdf:bann << /Border [0 0 0] + /Type /Annot /Subtype /Link /A << /S /GoTo /D (name#1) >> >>}% + \setcolor{\linkcolor}#1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +% + % + % @image support + % + % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). + \def\doxeteximage#1#2#3{% + \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% + \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% + % + % XeTeX (and the PDF format) support .pdf, .png, .jpg (among + % others). Let's try in that order, PDF first since if + % someone has a scalable image, presumably better to use that than a + % bitmap. + \let\xeteximgext=\empty + \begingroup + \openin 1 #1.pdf \ifeof 1 + \openin 1 #1.PDF \ifeof 1 + \openin 1 #1.png \ifeof 1 + \openin 1 #1.jpg \ifeof 1 + \openin 1 #1.jpeg \ifeof 1 + \openin 1 #1.JPG \ifeof 1 + \errmessage{Could not find image file #1 for XeTeX}% + \else \gdef\xeteximgext{JPG}% + \fi + \else \gdef\xeteximgext{jpeg}% + \fi + \else \gdef\xeteximgext{jpg}% + \fi + \else \gdef\xeteximgext{png}% + \fi + \else \gdef\xeteximgext{PDF}% + \fi + \else \gdef\xeteximgext{pdf}% + \fi + \closein 1 + \endgroup + % + \def\xetexpdfext{pdf}% + \ifx\xeteximgext\xetexpdfext + \XeTeXpdffile "#1".\xeteximgext "" + \else + \def\xetexpdfext{PDF}% + \ifx\xeteximgext\xetexpdfext + \XeTeXpdffile "#1".\xeteximgext "" + \else + \XeTeXpicfile "#1".\xeteximgext "" + \fi + \fi + \ifdim \wd0 >0pt width \xeteximagewidth \fi + \ifdim \wd2 >0pt height \xeteximageheight \fi \relax + } +\fi \message{fonts,} @@ -1823,8 +2125,10 @@ end % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} +\setfont\defsl\slshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf +\let\tenttsl=\defttsl \let\tensl=\defsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} @@ -1885,6 +2189,7 @@ end % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} +\setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} @@ -1954,8 +2259,10 @@ end % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} +\setfont\defsl\slshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf +\let\tensl=\defsl \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} @@ -2087,12 +2394,9 @@ end \endgroup } - % In order for the font changes to affect most math symbols and letters, -% we have to define the \textfont of the standard families. Since -% texinfo doesn't allow for producing subscripts and superscripts except -% in the main text, we don't bother to reset \scriptfont and -% \scriptscriptfont (which would also require loading a lot more fonts). +% we have to define the \textfont of the standard families. We don't +% bother to reset \scriptfont and \scriptscriptfont; awaiting user need. % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy @@ -2106,8 +2410,8 @@ end % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) -% and \lllsize (three sizes lower). These relative commands are used in -% the LaTeX logo and acronyms. +% and \lllsize (three sizes lower). These relative commands are used +% in, e.g., the LaTeX logo and acronyms. % % This all needs generalizing, badly. % @@ -2143,7 +2447,7 @@ end \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% - \resetmathfonts \setleading{16pt}} + \resetmathfonts \setleading{17pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc @@ -2274,8 +2578,6 @@ end \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} - -\gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft} } \let\markupsetuplqcode \markupsetcodequoteleft @@ -2284,6 +2586,9 @@ end \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % +\let\markupsetuplqkbd \markupsetcodequoteleft +\let\markupsetuprqkbd \markupsetcodequoteright +% \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % @@ -2293,8 +2598,6 @@ end \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright -\let\markupsetuplqkbd \markupsetnoligaturesquoteleft - % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it @@ -2379,13 +2682,14 @@ end \ifx\next,% \else\ifx\next-% \else\ifx\next.% + \else\ifx\next\.% + \else\ifx\next\comma% \else\ptexslash - \fi\fi\fi + \fi\fi\fi\fi\fi \aftersmartic } -% like \smartslanted except unconditionally uses \ttsl, and no ic. -% @var is set to this for defun arguments. +% Unconditional use \ttsl, and no ic. @var is set to this for defuns. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want @@ -2429,8 +2733,8 @@ end % \catcode`@=11 \def\plainfrenchspacing{% - \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m - \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m + \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% @@ -2450,34 +2754,12 @@ end % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} -% definition of @key that produces a lozenge. Doesn't adjust to text size. -%\setfont\keyrm\rmshape{8}{1000}{OT1} -%\font\keysy=cmsy9 -%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% -% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% -% \vbox{\hrule\kern-0.4pt -% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% -% \kern-0.4pt\hrule}% -% \kern-.06em\raise0.4pt\hbox{\angleright}}}} - -% definition of @key with no lozenge. If the current font is already -% monospace, don't change it; that way, we respect @kbdinputstyle. But -% if it isn't monospace, then use \tt. -% -\def\key#1{{\setupmarkupstyle{key}% - \nohyphenation - \ifmonospace\else\tt\fi - #1}\null} - -% ctrl is no longer a Texinfo command. -\def\ctrl #1{{\tt \rawbackslash \hat}#1} - -% @file, @option are the same as @samp. -\let\file=\samp -\let\option=\samp +% @indicateurl is \samp, that is, with quotes. +\let\indicateurl=\samp -% @code is a modification of @t, -% which makes spaces the same size as normal in the surrounding text. +% @code (and similar) prints in typewriter, but with spaces the same +% size as normal in the surrounding text, without hyphenation, etc. +% This is a subroutine for that. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. @@ -2500,14 +2782,14 @@ end } % We *must* turn on hyphenation at `-' and `_' in @code. +% (But see \codedashfinish below.) % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. - +% % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) -% and arrange explicitly to hyphenate at a dash. -% -- rms. +% and arrange explicitly to hyphenate at a dash. -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active @@ -2521,17 +2803,38 @@ end \let-\codedash \let_\codeunder \else - \let-\realdash + \let-\normaldash \let_\realunder \fi + % Given -foo (with a single dash), we do not want to allow a break + % after the hyphen. + \global\let\codedashprev=\codedash + % \codex } + % + \gdef\codedash{\futurelet\next\codedashfinish} + \gdef\codedashfinish{% + \normaldash % always output the dash character itself. + % + % Now, output a discretionary to allow a line break, unless + % (a) the next character is a -, or + % (b) the preceding character is a -. + % E.g., given --posix, we do not want to allow a break after either -. + % Given --foo-bar, we do want to allow a break between the - and the b. + \ifx\next\codedash \else + \ifx\codedashprev\codedash + \else \discretionary{}{}{}\fi + \fi + % we need the space after the = for the case when \next itself is a + % space token; it would get swallowed otherwise. As in @code{- a}. + \global\let\codedashprev= \next + } } - +\def\normaldash{-} +% \def\codex #1{\tclose{#1}\endgroup} -\def\realdash{-} -\def\codedash{-\discretionary{}{}{}} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) @@ -2545,9 +2848,9 @@ end } % An additional complication: the above will allow breaks after, e.g., -% each of the four underscores in __typeof__. This is undesirable in -% some manuals, especially if they don't have long identifiers in -% general. @allowcodebreaks provides a way to control this. +% each of the four underscores in __typeof__. This is bad. +% @allowcodebreaks provides a document-level way to turn breaking at - +% and _ on and off. % \newif\ifallowcodebreaks \allowcodebreakstrue @@ -2566,37 +2869,28 @@ end \fi\fi } -% @uref (abbreviation for `urlref') takes an optional (comma-separated) -% second argument specifying the text to display and an optional third -% arg as text to display instead of (rather than in addition to) the url -% itself. First (mandatory) arg is the url. -% (This \urefnobreak definition isn't used now, leaving it for a while -% for comparison.) -\def\urefnobreak#1{\dourefnobreak #1,,,\finish} -\def\dourefnobreak#1,#2,#3,#4\finish{\begingroup - \unsepspaces - \pdfurl{#1}% - \setbox0 = \hbox{\ignorespaces #3}% - \ifdim\wd0 > 0pt - \unhbox0 % third arg given, show only that - \else - \setbox0 = \hbox{\ignorespaces #2}% - \ifdim\wd0 > 0pt - \ifpdf - \unhbox0 % PDF: 2nd arg given, show only it - \else - \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url - \fi - \else - \code{#1}% only url given, so show it - \fi - \fi - \endlink -\endgroup} +% For @command, @env, @file, @option quotes seem unnecessary, +% so use \code rather than \samp. +\let\command=\code +\let\env=\code +\let\file=\code +\let\option=\code + +% @uref (abbreviation for `urlref') aka @url takes an optional +% (comma-separated) second argument specifying the text to display and +% an optional third arg as text to display instead of (rather than in +% addition to) the url itself. First (mandatory) arg is the url. + +% TeX-only option to allow changing PDF output to show only the second +% arg (if given), and not the url (which is then just the link target). +\newif\ifurefurlonlylink -% This \urefbreak definition is the active one. +% The main macro is \urefbreak, which allows breaking at expected +% places within the url. (There used to be another version, which +% didn't support automatic breaking.) \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak +% \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces @@ -2605,12 +2899,32 @@ end \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else - \setbox0 = \hbox{\ignorespaces #2}% + \setbox0 = \hbox{\ignorespaces #2}% look for second arg \ifdim\wd0 > 0pt \ifpdf - \unhbox0 % PDF: 2nd arg given, show only it + % For pdfTeX and LuaTeX + \ifurefurlonlylink + % PDF plus option to not display url, show just arg + \unhbox0 + \else + % PDF, normally display both arg and url for consistency, + % visibility, if the pdf is eventually used to print, etc. + \unhbox0\ (\urefcode{#1})% + \fi \else - \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url + \ifx\XeTeXrevision\thisisundefined + \unhbox0\ (\urefcode{#1})% DVI, always show arg and url + \else + % For XeTeX + \ifurefurlonlylink + % PDF plus option to not display url, show just arg + \unhbox0 + \else + % PDF, normally display both arg and url for consistency, + % visibility, if the pdf is eventually used to print, etc. + \unhbox0\ (\urefcode{#1})% + \fi + \fi \fi \else \urefcode{#1}% only url given, so show it @@ -2621,9 +2935,9 @@ end % Allow line breaks around only a few characters (only). \def\urefcatcodes{% - \catcode\ampChar=\active \catcode\dotChar=\active - \catcode\hashChar=\active \catcode\questChar=\active - \catcode\slashChar=\active + \catcode`\&=\active \catcode`\.=\active + \catcode`\#=\active \catcode`\?=\active + \catcode`\/=\active } { \urefcatcodes @@ -2650,8 +2964,10 @@ end % we put a little stretch before and after the breakable chars, to help % line breaking of long url's. The unequal skips make look better in % cmtt at least, especially for dots. -\def\urefprestretch{\urefprebreak \hskip0pt plus.13em } -\def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } +\def\urefprestretchamount{.13em} +\def\urefpoststretchamount{.1em} +\def\urefprestretch{\urefprebreak \hskip0pt plus\urefprestretchamount\relax} +\def\urefpoststretch{\urefpostbreak \hskip0pt plus\urefprestretchamount\relax} % \def\urefcodeamp{\urefprestretch \&\urefpoststretch} \def\urefcodedot{\urefprestretch .\urefpoststretch} @@ -2709,13 +3025,20 @@ end \endlink \endgroup} \else - \let\email=\uref + \ifx\XeTeXrevision\thisisundefined + \let\email=\uref + \else + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} + \fi \fi -% @kbd is like @code, except that if the argument is just one @key command, -% then @kbd has no effect. -\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} - % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). @@ -2739,16 +3062,36 @@ end % Default is `distinct'. \kbdinputstyle distinct +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. +\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} + \def\xkey{\key} -\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% -\ifx\one\xkey\ifx\threex\three \key{#2}% -\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi -\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} +\def\kbdsub#1#2#3\par{% + \def\one{#1}\def\three{#3}\def\threex{??}% + \ifx\one\xkey\ifx\threex\three \key{#2}% + \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi + \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi +} -% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. -\let\indicateurl=\code -\let\env=\code -\let\command=\code +% definition of @key that produces a lozenge. Doesn't adjust to text size. +%\setfont\keyrm\rmshape{8}{1000}{OT1} +%\font\keysy=cmsy9 +%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% +% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% +% \vbox{\hrule\kern-0.4pt +% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% +% \kern-0.4pt\hrule}% +% \kern-.06em\raise0.4pt\hbox{\angleright}}}} + +% definition of @key with no lozenge. If the current font is already +% monospace, don't change it; that way, we respect @kbdinputstyle. But +% if it isn't monospace, then use \tt. +% +\def\key#1{{\setupmarkupstyle{key}% + \nohyphenation + \ifmonospace\else\tt\fi + #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} @@ -2762,11 +3105,6 @@ end % \def\dmn#1{\thinspace #1} -% @l was never documented to mean ``switch to the Lisp font'', -% and it is not used as such in any manual I can find. We need it for -% Polish suppressed-l. --karl, 22sep96. -%\def\l#1{{\li #1}\null} - % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. @@ -2819,21 +3157,24 @@ end \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% - \tex - \mathunderscore - \let\\ = \mathbackslash - \mathactive - % make the texinfo accent commands work in math mode - \let\"=\ddot - \let\'=\acute - \let\==\bar - \let\^=\hat - \let\`=\grave - \let\u=\breve - \let\v=\check - \let\~=\tilde - \let\dotaccent=\dot - $\finishmath + \ifmmode\else % only go into math if not in math mode already + \tex + \mathunderscore + \let\\ = \mathbackslash + \mathactive + % make the texinfo accent commands work in math mode + \let\"=\ddot + \let\'=\acute + \let\==\bar + \let\^=\hat + \let\`=\grave + \let\u=\breve + \let\v=\check + \let\~=\tilde + \let\dotaccent=\dot + % have to provide another name for sup operator + \let\mathopsup=\sup + $\expandafter\finishmath\fi } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. @@ -2856,6 +3197,18 @@ end } } +% for @sub and @sup, if in math mode, just do a normal sub/superscript. +% If in text, use math to place as sub/superscript, but switch +% into text mode, with smaller fonts. This is a different font than the +% one used for real math sub/superscripts (8pt vs. 7pt), but let's not +% fix it (significant additions to font machinery) until someone notices. +% +\def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi} +\def\finishsub#1{$\sb{\hbox{\selectfonts\lllsize #1}}$}% +% +\def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi} +\def\finishsup#1{$\ptexsp{\hbox{\selectfonts\lllsize #1}}$}% + % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. @@ -2867,6 +3220,15 @@ end \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } +% +% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if +% FMTNAME is tex, else ELSE-TEXT. +\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} +\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% + \def\inlinefmtname{#1}% + \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi +} +% % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being @@ -2883,6 +3245,23 @@ end \endgroup % close group opened by \tex. } +% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. +% +\long\def\inlineifset#1{\doinlineifset #1,\finish} +\long\def\doinlineifset#1,#2,\finish{% + \def\inlinevarname{#1}% + \expandafter\ifx\csname SET\inlinevarname\endcsname\relax + \else\ignorespaces#2\fi +} + +% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. +% +\long\def\inlineifclear#1{\doinlineifclear #1,\finish} +\long\def\doinlineifclear#1,#2,\finish{% + \def\inlinevarname{#1}% + \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi +} + \message{glyphs,} % and logos. @@ -2894,8 +3273,8 @@ end % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. % Unless we're in typewriter, use \ecfont because the CM text fonts do % not have braces, and we don't want to switch into math. -\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} -\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} +\def\mylbrace{{\ifmonospace\char123\else\ensuremath\lbrace\fi}} +\def\myrbrace{{\ifmonospace\char125\else\ensuremath\rbrace\fi}} \let\{=\mylbrace \let\lbracechar=\{ \let\}=\myrbrace \let\rbracechar=\} \begingroup @@ -2970,11 +3349,16 @@ end \TeX } -% Some math mode symbols. -\def\bullet{$\ptexbullet$} -\def\geq{\ifmmode \ge\else $\ge$\fi} -\def\leq{\ifmmode \le\else $\le$\fi} -\def\minus{\ifmmode -\else $-$\fi} +% Some math mode symbols. Define \ensuremath to switch into math mode +% unless we are already there. Expansion tricks may not be needed here, +% but safer, and can't hurt. +\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi} +\def\ensuredmath#1{$\relax#1$} +% +\def\bullet{\ensuremath\ptexbullet} +\def\geq{\ensuremath\ge} +\def\leq{\ensuremath\le} +\def\minus{\ensuremath-} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm @@ -3138,20 +3522,32 @@ end \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % -% Use the ec* fonts (cm-super in outline format) for non-CM glyphs. -\def\ecfont{% +% Use the European Computer Modern fonts (cm-super in outline format) +% for non-CM glyphs. That is ec* for regular text and tc* for the text +% companion symbols (LaTeX TS1 encoding). Both are part of the ec +% package and follow the same conventions. +% +\def\ecfont{\etcfont{e}} +\def\tcfont{\etcfont{t}} +% +\def\etcfont#1{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% - \ifx\curfontstyle\bfstylename - % bold: - \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize + \ifmonospace + % typewriter: + \font\thisecfont = #1ctt\ecsize \space at \nominalsize \else - % regular: - \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \ifx\curfontstyle\bfstylename + % bold: + \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize + \else + % regular: + \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \fi \fi \thisecfont } @@ -3194,13 +3590,16 @@ end \newif\ifseenauthor \newif\iffinishedtitlepage -% Do an implicit @contents or @shortcontents after @end titlepage if the -% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. -% -\newif\ifsetcontentsaftertitlepage - \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue -\newif\ifsetshortcontentsaftertitlepage - \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue +% @setcontentsaftertitlepage used to do an implicit @contents or +% @shortcontents after @end titlepage, but it is now obsolete. +\def\setcontentsaftertitlepage{% + \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo + command; move your @contents command if you want the contents + after the title page.}}% +\def\setshortcontentsaftertitlepage{% + \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo + command; move your @shortcontents and @contents commands if you + want the contents after the title page.}}% \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% @@ -3242,20 +3641,6 @@ end % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon - % - % If they want short, they certainly want long too. - \ifsetshortcontentsaftertitlepage - \shortcontents - \contents - \global\let\shortcontents = \relax - \global\let\contents = \relax - \fi - % - \ifsetcontentsaftertitlepage - \contents - \global\let\contents = \relax - \global\let\shortcontents = \relax - \fi } \def\finishtitlepage{% @@ -3264,6 +3649,20 @@ end \finishedtitlepagetrue } +% Settings used for typesetting titles: no hyphenation, no indentation, +% don't worry much about spacing, ragged right. This should be used +% inside a \vbox, and fonts need to be set appropriately first. Because +% it is always used for titles, nothing else, we call \rmisbold. \par +% should be specified before the end of the \vbox, since a vbox is a group. +% +\def\raggedtitlesettings{% + \rmisbold + \hyphenpenalty=10000 + \parindent=0pt + \tolerance=5000 + \ptexraggedright +} + % Macros to be used within @titlepage: \let\subtitlerm=\tenrm @@ -3271,7 +3670,7 @@ end \parseargdef\title{% \checkenv\titlepage - \leftline{\titlefonts\rmisbold #1} + \vbox{\titlefonts \raggedtitlesettings #1\par}% % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt @@ -3306,7 +3705,7 @@ end \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages -% Now make TeX use those variables +% Now make \makeheadline and \makefootline in Plain TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline @@ -3345,7 +3744,7 @@ end % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. - \global\advance\pageheight by -12pt + \global\advance\txipageheight by -12pt \global\advance\vsize by -12pt } @@ -3362,13 +3761,17 @@ end % @everyheadingmarks % @everyfootingmarks +% These define \getoddheadingmarks, \getevenheadingmarks, +% \getoddfootingmarks, and \getevenfootingmarks, each to one of +% \gettopheadingmarks, \getbottomheadingmarks. +% \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} -\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} +\parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } -\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} +\parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% @@ -3389,7 +3792,7 @@ end % By default, they are off at the start of a document, % and turned `on' after @end titlepage. -\def\headings #1 {\csname HEADINGS#1\endcsname} +\parseargdef\headings{\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% @@ -3409,7 +3812,7 @@ end \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager @@ -3420,8 +3823,8 @@ end \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\evenheadline={\line{\thischapterheading\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} @@ -3432,7 +3835,7 @@ end \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } @@ -3440,8 +3843,8 @@ end \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\evenheadline={\line{\thischapterheading\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chappager } @@ -3619,7 +4022,7 @@ end \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % - % Try typesetting the item mark that if the document erroneously says + % Try typesetting the item mark so that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if @@ -3651,7 +4054,12 @@ end \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % - \vadjust{\penalty 1200}}% not good to break after first line of item. + \ifinner\else + \vadjust{\penalty 1200}% not good to break after first line of item. + \fi + % We can be in inner vertical mode in a footnote, although an + % @itemize looks awful there. + }% \flushcr } @@ -3869,19 +4277,23 @@ end } % multitable-only commands. -% -% @headitem starts a heading row, which we typeset in bold. -% Assignments have to be global since we are inside the implicit group -% of an alignment entry. \everycr resets \everytab so we don't have to +% +% @headitem starts a heading row, which we typeset in bold. Assignments +% have to be global since we are inside the implicit group of an +% alignment entry. \everycr below resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr + \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % +% default for tables with no headings. +\let\headitemcrhook=\relax +% % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. @@ -3912,15 +4324,15 @@ end % \everycr = {% \noalign{% - \global\everytab={}% + \global\everytab={}% Reset from possible headitem. \global\colcount=0 % Reset the column counter. - % Check for saved footnotes, etc. + % + % Check for saved footnotes, etc.: \checkinserts - % Keeps underfull box messages off when table breaks over pages. - %\filbreak - % Maybe so, but it also creates really weird page breaks when the - % table breaks over pages. Wouldn't \vfil be better? Wait until the - % problem manifests itself, so it can be fixed for real --karl. + % + % Perhaps a \nobreak, then reset: + \headitemcrhook + \global\let\headitemcrhook=\relax }% }% % @@ -4159,7 +4571,7 @@ end \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { - \catcode`\- = \active \catcode`\_ = \active + \catcode`\-=\active \catcode`\_=\active % \gdef\makevalueexpandable{% \let\value = \expandablevalue @@ -4168,7 +4580,7 @@ end % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. - \let-\realdash \let_\normalunderscore + \let-\normaldash \let_\normalunderscore } } @@ -4179,7 +4591,12 @@ end % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). -% +% +% Unfortunately, this has the consequence that when _ is in the *value* +% of an @set, it does not print properly in the roman fonts (get the cmr +% dot accent at position 126 instead). No fix comes to mind, and it's +% been this way since 2003 or earlier, so just ignore it. +% \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% @@ -4189,10 +4606,24 @@ end \fi } +% Like \expandablevalue, but completely expandable (the \message in the +% definition above operates at the execution level of TeX). Used when +% writing to auxiliary files, due to the expansion that \write does. +% +% NB flag names containing - or _ may not work here. +\def\dummyvalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + [No value for ``#1'']% + \else + \csname SET#1\endcsname + \fi +} + % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. -% -% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +% To get the special treatment we need for `@end ifset,' we call +% \makecond and then redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} @@ -4238,7 +4669,7 @@ end } \def\ifcmddefinedfail{\doignore{ifcommanddefined}} -% @ifcommandnotdefined CMD ... handlded similar to @ifclear above. +% @ifcommandnotdefined CMD ... handled similar to @ifclear above. \makecond{ifcommandnotdefined} \def\ifcommandnotdefined{% \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} @@ -4263,19 +4694,16 @@ end % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} -% \newindex {foo} defines an index named foo. -% It automatically defines \fooindex such that -% \fooindex ...rest of line... puts an entry in the index foo. -% It also defines \fooindfile to be the number of the output channel for -% the file that accumulates this index. The file's extension is foo. +% \newindex {foo} defines an index named IX. +% It automatically defines \IXindex such that +% \IXindex ...rest of line... puts an entry in the index IX. +% It also defines \IXindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is IX. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% - \iflinks - \expandafter\newwrite \csname#1indfile\endcsname - \openout \csname#1indfile\endcsname \jobname.#1 % Open the file - \fi + \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } @@ -4289,14 +4717,19 @@ end \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% - \iflinks - \expandafter\newwrite \csname#1indfile\endcsname - \openout \csname#1indfile\endcsname \jobname.#1 - \fi + \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } +% The default indices: +\newindex{cp}% concepts, +\newcodeindex{fn}% functions, +\newcodeindex{vr}% variables, +\newcodeindex{tp}% types, +\newcodeindex{ky}% keys +\newcodeindex{pg}% and programs. + % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. @@ -4325,26 +4758,19 @@ end \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } -% Define \doindex, the driver for all \fooindex macros. +% Define \doindex, the driver for all index macros. % Argument #1 is generated by the calling \fooindex macro, -% and it is "foo", the name of the index. - -% \doindex just uses \parsearg; it calls \doind for the actual work. -% This is because \doind is more useful to call from other macros. +% and it the two-letter name of the index. -% There is also \dosubind {index}{topic}{subtopic} -% which makes an entry in a two-level index such as the operation index. - -\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} -\def\singleindexer #1{\doind{\indexname}{#1}} +\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx} +\def\doindexxxx #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. -\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} -\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} +\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx} +\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}} -% Take care of Texinfo commands that can appear in an index entry. -% Since there are some commands we want to expand, and others we don't, -% we have to laboriously prevent expansion for those that we don't. +% Used when writing an index entry out to an index file to prevent +% expansion of Texinfo commands that can appear in an index entry. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. @@ -4356,36 +4782,10 @@ end % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we - % should define @lbrace and @rbrace commands a la @comma. + % should use @lbracechar and @rbracechar? \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % - % I don't entirely understand this, but when an index entry is - % generated from a macro call, the \endinput which \scanmacro inserts - % causes processing to be prematurely terminated. This is, - % apparently, because \indexsorttmp is fully expanded, and \endinput - % is an expandable command. The redefinition below makes \endinput - % disappear altogether for that purpose -- although logging shows that - % processing continues to some further point. On the other hand, it - % seems \endinput does not hurt in the printed index arg, since that - % is still getting written without apparent harm. - % - % Sample source (mac-idx3.tex, reported by Graham Percival to - % help-texinfo, 22may06): - % @macro funindex {WORD} - % @findex xyz - % @end macro - % ... - % @funindex commtest - % - % The above is not enough to reproduce the bug, but it gives the flavor. - % - % Sample whatsit resulting: - % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} - % - % So: - \let\endinput = \empty - % % Do the redefinitions. \commondummies } @@ -4409,7 +4809,6 @@ end % Called from \indexdummies and \atdummies. % \def\commondummies{% - % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for @@ -4486,6 +4885,7 @@ end \definedummyword\guilsinglright \definedummyword\lbracechar \definedummyword\leq + \definedummyword\mathopsup \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds @@ -4499,19 +4899,20 @@ end \definedummyword\quotesinglbase \definedummyword\rbracechar \definedummyword\result + \definedummyword\sub + \definedummyword\sup \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist + \let\value\dummyvalue % \normalturnoffactive - % - % Handle some cases of @value -- where it does not contain any - % (non-fully-expandable) commands. - \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. +% Define \definedumyletter, \definedummyaccent and \definedummyword before +% using. % \def\commondummiesnofonts{% % Control letters and accents. @@ -4573,6 +4974,7 @@ end \definedummyword\samp \definedummyword\strong \definedummyword\tie + \definedummyword\U \definedummyword\uref \definedummyword\url \definedummyword\var @@ -4581,6 +4983,52 @@ end \definedummyword\xref } +% For testing: output @{ and @} in index sort strings as \{ and \}. +\newif\ifusebracesinindexes + +\let\indexlbrace\relax +\let\indexrbrace\relax + +{\catcode`\@=0 +\catcode`\\=13 + @gdef@backslashdisappear{@def\{}} +} + +{ +\catcode`\<=13 +\catcode`\-=13 +\catcode`\`=13 + \gdef\indexnonalnumdisappear{% + \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else + % @set txiindexlquoteignore makes us ignore left quotes in the sort term. + % (Introduced for FSFS 2nd ed.) + \let`=\empty + \fi + % + \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else + \backslashdisappear + \fi + % + \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else + \def-{}% + \fi + \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else + \def<{}% + \fi + \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else + \def\@{}% + \fi + } + + \gdef\indexnonalnumreappear{% + \useindexbackslash + \let-\normaldash + \let<\normalless + \def\@{@}% + } +} + + % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string @@ -4593,7 +5041,6 @@ end \def\definedummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \let\definedummyword\definedummyaccent - % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command @@ -4606,14 +5053,10 @@ end \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % - % Unfortunately, texindex is not prepared to handle braces in the - % content at all. So for index sorting, we map @{ and @} to strings - % starting with |, since that ASCII character is between ASCII { and }. - \def\{{|a}% - \def\lbracechar{|a}% - % - \def\}{|b}% - \def\rbracechar{|b}% + \uccode`\1=`\{ \uppercase{\def\{{1}}% + \uccode`\1=`\} \uppercase{\def\}{1}}% + \let\lbracechar\{% + \let\rbracechar\}% % % Non-English letters. \def\AA{AA}% @@ -4622,7 +5065,7 @@ end \def\L{L}% \def\OE{OE}% \def\O{O}% - \def\TH{ZZZ}% + \def\TH{TH}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% @@ -4634,7 +5077,7 @@ end \def\o{o}% \def\questiondown{?}% \def\ss{ss}% - \def\th{zzz}% + \def\th{th}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% @@ -4671,9 +5114,6 @@ end \def\result{=>}% \def\textdegree{o}% % - \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax - \else \indexlquoteignore \fi - % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up @@ -4687,19 +5127,18 @@ end \macrolist } -% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us -% ignore left quotes in the sort term. -{\catcode`\`=\active - \gdef\indexlquoteignore{\let`=\empty}} -\let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} -% Workhorse for all \fooindexes. +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. +% TODO: Two-level index? Operation index? + +% Workhorse for all indexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). @@ -4707,6 +5146,7 @@ end \def\dosubind#1#2#3{% \iflinks {% + \requireopenindexfile{#1}% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. @@ -4722,7 +5162,50 @@ end \fi } -% Write the entry in \toks0 to the index file: +% Check if an index file has been opened, and if not, open it. +\def\requireopenindexfile#1{% +\ifnum\csname #1indfile\endcsname=0 + \expandafter\newwrite \csname#1indfile\endcsname + \edef\suffix{#1}% + % A .fls suffix would conflict with the file extension for the output + % of -recorder, so use .f1s instead. + \ifx\suffix\indexisfl\def\suffix{f1}\fi + % Open the file + \immediate\openout\csname#1indfile\endcsname \jobname.\suffix + % Using \immediate above here prevents an object entering into the current + % box, which could confound checks such as those in \safewhatsit for + % preceding skips. + \typeout{Writing index file \jobname.\suffix}% +\fi} +\def\indexisfl{fl} + +% Output \ as {\indexbackslash}, because \ is an escape character in +% the index files. +\let\indexbackslash=\relax +{\catcode`\@=0 \catcode`\\=\active + @gdef@useindexbackslash{@def\{{@indexbackslash}}} +} + +% Definition for writing index entry text. +\def\sortas#1{\ignorespaces}% + +% Definition for writing index entry sort key. Should occur at the at +% the beginning of the index entry, like +% @cindex @sortas{september} \september +% The \ignorespaces takes care of following space, but there's no way +% to remove space before it. +{ +\catcode`\-=13 +\gdef\indexwritesortas{% + \begingroup + \indexnonalnumreappear + \indexwritesortasxxx} +\gdef\indexwritesortasxxx#1{% + \xdef\indexsortkey{#1}\endgroup} +} + + +% Write the entry in \toks0 to the index file. % \def\dosubindwrite{% % Put the index entry in the margin if desired. @@ -4732,14 +5215,26 @@ end % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage - \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now - % so it will be output as is; and it will print as backslash. + \useindexbackslash % \indexbackslash isn't defined now so it will be output + % as is; and it will print as backslash. + % The braces around \indexbrace are recognized by texindex. % - % Process the index entry with all font commands turned off, to - % get the string to sort by. + % Get the string to sort by, by processing the index entry with all + % font commands turned off. {\indexnofonts - \edef\temp{\the\toks0}% need full expansion - \xdef\indexsorttmp{\temp}% + \def\lbracechar{{\indexlbrace}}% + \def\rbracechar{{\indexrbrace}}% + \let\{=\lbracechar + \let\}=\rbracechar + \indexnonalnumdisappear + \xdef\indexsortkey{}% + \let\sortas=\indexwritesortas + \edef\temp{\the\toks0}% + \setbox\dummybox = \hbox{\temp}% Make sure to execute any \sortas + \ifx\indexsortkey\empty + \xdef\indexsortkey{\temp}% + \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi + \fi }% % % Set up the complete index entry, with both the sort key and @@ -4749,10 +5244,11 @@ end % sorted result. \edef\temp{% \write\writeto{% - \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% + \string\entry{\indexsortkey}{\noexpand\folio}{\the\toks0}}% }% \temp } +\newbox\dummybox % used above % Take care of unwanted page breaks/skips around a whatsit: % @@ -4878,51 +5374,106 @@ end % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 - \openin 1 \jobname.#1s + % See comment in \requireopenindexfile. + \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi + \openin 1 \jobname.\indexname s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent + \typeout{No file \jobname.\indexname s.}% \else + \catcode`\\ = 0 % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. - \read 1 to \temp + \read 1 to \thisline \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. - \def\indexbackslash{\backslashcurfont}% - \catcode`\\ = 0 - \escapechar = `\\ + \def\indexbackslash{\ttbackslash}% + \let\indexlbrace\{ % Likewise, set these sequences for braces + \let\indexrbrace\} % used in the sort key. \begindoublecolumns - \input \jobname.#1s + \let\entryorphanpenalty=\indexorphanpenalty + % + % Read input from the index file line by line. + \loopdo + \ifeof1 + \let\firsttoken\relax + \else + \read 1 to \nextline + \edef\act{\gdef\noexpand\firsttoken{\getfirsttoken\nextline}}% + \act + \fi + \thisline + % + \ifeof1\else + \let\thisline\nextline + \repeat + %% \enddoublecolumns \fi \fi \closein 1 \endgroup} +\def\getfirsttoken#1{\expandafter\getfirsttokenx#1\endfirsttoken} +\long\def\getfirsttokenx#1#2\endfirsttoken{\noexpand#1} + +\def\loopdo#1\repeat{\def\body{#1}\loopdoxxx} +\def\loopdoxxx{\let\next=\relax\body\let\next=\loopdoxxx\fi\next} + % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. -\def\initial#1{{% - % Some minor font changes for the special characters. - \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt - % +{\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13 +\catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13 +\catcode`\$=3 +\gdef\initialglyphs{% + % Some changes for non-alphabetic characters. Using the glyphs from the + % math fonts looks more consistent than the typewriter font used elsewhere + % for these characters. + \def\indexbackslash{\math{\backslash}}% + \let\\=\indexbackslash + % + % Can't get bold backslash so don't use bold forward slash + \catcode`\/=13 + \def/{{\secrmnotbold \normalslash}}% + \def-{{\normaldash\normaldash}}% en dash `--' + \def^{{\chapbf \normalcaret}}% + \def~{{\chapbf \normaltilde}}% + \def\_{% + \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }% + \def|{$\vert$}% + \def<{$\less$}% + \def>{$\gtr$}% + \def+{$\normalplus$}% +}} + +\def\initial{% + \bgroup + \initialglyphs + \initialx +} + +\def\initialx#1{% % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. + % The glue before the bonus allows a little bit of space at the + % bottom of a column to reduce an increase in inter-line spacing. \nobreak - \vskip 0pt plus 3\baselineskip - \penalty 0 - \vskip 0pt plus -3\baselineskip + \vskip 0pt plus 5\baselineskip + \penalty -300 + \vskip 0pt plus -5\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column @@ -4930,24 +5481,24 @@ end % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. - \vskip 1.67\baselineskip plus .5\baselineskip - \leftline{\secbf #1}% + \vskip 1.67\baselineskip plus 1\baselineskip + \leftline{\secfonts \kern-0.05em \secbf #1}% + % \secfonts is inside the argument of \leftline so that the change of + % \baselineskip will not affect any glue inserted before the vbox that + % \leftline creates. % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip -}} + \egroup % \initialglyphs +} + +\newdimen\entryrightmargin +\entryrightmargin=0pt % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % -% A straightforward implementation would start like this: -% \def\entry#1#2{... -% But this freezes the catcodes in the argument, and can cause problems to -% @code, which sets - active. This problem was fixed by a kludge--- -% ``-'' was active throughout whole index, but this isn't really right. -% The right solution is to prevent \entry from swallowing the whole text. -% --kasal, 21nov03 \def\entry{% \begingroup % @@ -4955,38 +5506,18 @@ end % affect previous text. \par % - % Do not fill out the last line with white space. - \parfillskip = 0in - % % No extra space above this paragraph. \parskip = 0in % - % Do not prefer a separate line ending with a hyphen to fewer lines. - \finalhyphendemerits = 0 - % - % \hangindent is only relevant when the entry text and page number - % don't both fit on one line. In that case, bob suggests starting the - % dots pretty far over on the line. Unfortunately, a large - % indentation looks wrong when the entry text itself is broken across - % lines. So we use a small indentation and put up with long leaders. - % - % \hangafter is reset to 1 (which is the value we want) at the start - % of each paragraph, so we need not do anything with that. - \hangindent = 2em - % - % When the entry text needs to be broken, just fill out the first line - % with blank space. - \rightskip = 0pt plus1fil - % - % A bit of stretch before each entry for the benefit of balancing - % columns. - \vskip 0pt plus1pt - % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% - \def\entrybreak{\hfil\break}% + \def\entrybreak{\hfil\break}% An undocumented command + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus0.5pt % % Swallow the left brace of the text (first parameter): \afterassignment\doentry @@ -4994,45 +5525,169 @@ end } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% + % Save the text of the entry + \global\setbox\boxA=\hbox\bgroup \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. + % Not absorbing as a macro argument reduces the chance of problems + % with catcodes occurring. } -\def\finishentry#1{% +{\catcode`\@=11 +\gdef\finishentry#1{% + \egroup % end box A + \dimen@ = \wd\boxA % Length of text of entry + \global\setbox\boxA=\hbox\bgroup\unhbox\boxA % #1 is the page number. % - % The following is kludged to not output a line of dots in the index if - % there are no page numbers. The next person who breaks this will be - % cursed by a Unix daemon. - \setbox\boxA = \hbox{#1}% - \ifdim\wd\boxA = 0pt - \ % + % Get the width of the page numbers, and only use + % leaders if they are present. + \global\setbox\boxB = \hbox{#1}% + \ifdim\wd\boxB = 0pt + \null\nobreak\hfill\ % \else % - % If we must, put the page number on a line of its own, and fill out - % this line with blank space. (The \hfil is overwhelmed with the - % fill leaders glue in \indexdotfill if the page number does fit.) - \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % - % The `\ ' here is removed by the implicit \unskip that TeX does as - % part of (the primitive) \par. Without it, a spurious underfull - % \hbox ensues. \ifpdf - \pdfgettoks#1.% - \ \the\toksA + \pdfgettoks#1.% + \bgroup\let\domark\relax + \hskip\skip\thinshrinkable\the\toksA + \egroup + % The redefinion of \domark stops marks being added in \pdflink to + % preserve coloured links across page boundaries. Otherwise the marks + % would get in the way of \lastbox in \insertindexentrybox. \else - \ #1% + \ifx\XeTeXrevision\thisisundefined + \hskip\skip\thinshrinkable #1% + \else + \pdfgettoks#1.% + \bgroup\let\domark\relax + \hskip\skip\thinshrinkable\the\toksA + \egroup + \fi \fi \fi - \par + \egroup % end \boxA + \ifdim\wd\boxB = 0pt + \global\setbox\entryindexbox=\vbox{\unhbox\boxA}% + \else + \global\setbox\entryindexbox=\vbox\bgroup + \prevdepth=\entrylinedepth + \noindent + % We want the text of the entries to be aligned to the left, and the + % page numbers to be aligned to the right. + % + \advance\leftskip by 0pt plus 1fil + \advance\leftskip by 0pt plus -1fill + \rightskip = 0pt plus -1fil + \advance\rightskip by 0pt plus 1fill + % Cause last line, which could consist of page numbers on their own + % if the list of page numbers is long, to be aligned to the right. + \parfillskip=0pt plus -1fill + % + \hangindent=1em + % + \advance\rightskip by \entryrightmargin + % Determine how far we can stretch into the margin. + % This allows, e.g., "Appendix H GNU Free Documentation License" to + % fit on one line in @letterpaper format. + \ifdim\entryrightmargin>2.1em + \dimen@i=2.1em + \else + \dimen@i=0em + \fi + \advance \parfillskip by 0pt minus 1\dimen@i + % + \dimen@ii = \hsize + \advance\dimen@ii by -1\leftskip + \advance\dimen@ii by -1\entryrightmargin + \advance\dimen@ii by 1\dimen@i + \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line + \ifdim\dimen@ > 0.8\dimen@ii % due to long index text + \dimen@ = 0.7\dimen@ % Try to split the text roughly evenly + \dimen@ii = \hsize + \advance \dimen@ii by -1em + \ifnum\dimen@>\dimen@ii + % If the entry is too long, use the whole line + \dimen@ = \dimen@ii + \fi + \advance\leftskip by 0pt plus 1fill % ragged right + \advance \dimen@ by 1\rightskip + \parshape = 2 0pt \dimen@ 1em \dimen@ii + % Ideally we'd add a finite glue at the end of the first line only, but + % TeX doesn't seem to provide a way to do such a thing. + \fi\fi + \unhbox\boxA + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % Word spacing - no stretch + \spaceskip=\fontdimen2\font minus \fontdimen4\font + % + \linepenalty=1000 % Discourage line breaks. + \hyphenpenalty=5000 % Discourage hyphenation. + % + \par % format the paragraph + \egroup % The \vbox + \fi \endgroup + % delay text of entry until after penalty + \bgroup\aftergroup\insertindexentrybox + \entryorphanpenalty +}} + +\newskip\thinshrinkable +\skip\thinshrinkable=.15em minus .15em + +\newbox\entryindexbox +\def\insertindexentrybox{% + \copy\entryindexbox + % The following gets the depth of the last box. This is for even + % line spacing when entries span several lines. + \setbox\dummybox\vbox{% + \unvbox\entryindexbox + \nointerlineskip + \lastbox + \global\entrylinedepth=\prevdepth + }% + % Note that we couldn't simply \unvbox\entryindexbox followed by + % \nointerlineskip\lastbox to remove the last box and then reinstate it, + % because this resets how far the box has been \moveleft'ed to 0. \unvbox + % doesn't affect \prevdepth either. +} +\newdimen\entrylinedepth + +% Default is no penalty +\let\entryorphanpenalty\egroup + +% Used from \printindex. \firsttoken should be the first token +% after the \entry. If it's not another \entry, we are at the last +% line of a group of index entries, so insert a penalty to discourage +% orphaned index entries. +\long\def\indexorphanpenalty{% + \def\isentry{\entry}% + \ifx\firsttoken\isentry + \else + \unskip\penalty 9000 + % The \unskip here stops breaking before the glue. It relies on the + % \vskip above being there, otherwise there is an error + % "You can't use `\unskip' in vertical mode". There has to be glue + % in the current vertical list that hasn't been added to the + % "current page". See Chapter 24 of the TeXbook. This contradicts + % Section 8.3.7 in "TeX by Topic," though. + \fi + \egroup % now comes the box added with \aftergroup } % Like plain.tex's \dotfill, except uses up at least 1 em. +% The filll stretch here overpowers both the fil and fill stretch to push +% the page number to the right. \def\indexdotfill{\cleaders - \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} + \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll} + \def\primary #1{\line{#1\hfil}} @@ -5046,7 +5701,11 @@ end \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else - #2 + \ifx\XeTeXrevision\thisisundefined + #2 + \else + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \fi \fi \par }} @@ -5054,12 +5713,39 @@ end % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. -\catcode`\@=11 +\catcode`\@=11 % private names \newbox\partialpage \newdimen\doublecolumnhsize +\newdimen\doublecolumntopgap +\doublecolumntopgap = 0pt + +% Use inside an output routine to save \topmark and \firstmark +\def\savemarks{% + \global\savedtopmark=\expandafter{\topmark }% + \global\savedfirstmark=\expandafter{\firstmark }% +} +\newtoks\savedtopmark +\newtoks\savedfirstmark + +% Set \topmark and \firstmark for next time \output runs. +% Can't be run from withinside \output (because any material +% added while an output routine is active, including +% penalties, is saved for after it finishes). The page so far +% should be empty, otherwise what's on it will be thrown away. +\def\restoremarks{% + \mark{\the\savedtopmark}% + \bgroup\output = {% + \setbox\dummybox=\box\PAGE + }abc\eject\egroup + % "abc" because output routine doesn't fire for a completely empty page. + \mark{\the\savedfirstmark}% +} \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % If not much space left on page, start a new page. + \ifdim\pagetotal>0.8\vsize\vfill\eject\fi + % % Grab any single-column material above us. \output = {% % @@ -5079,8 +5765,15 @@ end \unvbox\PAGE \kern-\topskip \kern\baselineskip }% + \savemarks }% \eject % run that output routine to set \partialpage + \restoremarks + % + % We recover the two marks that the last output routine saved in order + % to propagate the information in marks added around a chapter heading, + % which could be otherwise be lost by the time the final page is output. + % % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% @@ -5108,13 +5801,19 @@ end % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) + \global\doublecolumntopgap = \topskip + \global\advance\doublecolumntopgap by -1\baselineskip + \advance\vsize by -1\doublecolumntopgap \vsize = 2\vsize + \topskip=0pt + \global\entrylinedepth=0pt\relax } % The double-column output routine for all double-column pages except -% the last. +% the last, which is done by \balancecolumns. % \def\doublecolumnout{% + % \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the @@ -5137,10 +5836,13 @@ end % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize - \hbox to\pagewidth{\box0\hfil\box2}% + \vbox{% + \vskip\doublecolumntopgap + \hbox to\txipagewidth{\box0\hfil\box2}}% } -% -% All done with double columns. + + +% Finished with with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the @@ -5163,7 +5865,7 @@ end % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns - % and the final section into the vbox of \pageheight (see + % and the final section into the vbox of \txipageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the @@ -5171,21 +5873,21 @@ end \penalty0 % \output = {% - % Split the last of the double-column material. Leave it on the - % current page, no automatic page break. + % Split the last of the double-column material. + \savemarks \balancecolumns % - % If we end up splitting too much material for the current page, - % though, there will be another page break right after this \output - % invocation ends. Having called \balancecolumns once, we do not + % Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal - % definition right away. (We hope \balancecolumns will never be - % called on to balance too much material, but if it is, this makes - % the output somewhat more palatable.) + % definition right away. \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns + \restoremarks + % Leave the double-column material on the current page, no automatic + % page break. + \box\balancedcolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column @@ -5193,31 +5895,52 @@ end % \endgroup where \vsize got restored). \pagegoal = \vsize } +\newbox\balancedcolumns +\setbox\balancedcolumns=\vbox{shouldnt see this}% % -% Called at the end of the double column material. +% Only called for the last of the double column material. \doublecolumnout +% does the others. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip - \divide\dimen@ by 2 % target to split to - %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% - \splittopskip = \topskip - % Loop until we get a decent breakpoint. - {% - \vbadness = 10000 - \loop - \global\setbox3 = \copy0 - \global\setbox1 = \vsplit3 to \dimen@ - \ifdim\ht3>\dimen@ - \global\advance\dimen@ by 1pt - \repeat - }% - %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% - \setbox0=\vbox to\dimen@{\unvbox1}% - \setbox2=\vbox to\dimen@{\unvbox3}% + \ifdim\dimen@<14\baselineskip + % Don't split a short final column in two. + \setbox2=\vbox{}% + \else + \divide\dimen@ by 2 % target to split to + \dimen@ii = \dimen@ + \splittopskip = \topskip + % Loop until the second column is no higher than the first + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + % Remove glue from bottom of first column to + % make sure it is higher than the second. + \global\setbox1 = \vbox{\unvbox1\unpenalty\unskip}% + \ifdim\ht3>\ht1 + \global\advance\dimen@ by 1pt + \repeat + }% + \multiply\dimen@ii by 4 + \divide\dimen@ii by 5 + \ifdim\ht3<\dimen@ii + % Column heights are too different, so don't make their bottoms + % flush with each other. The glue at the end of the second column + % allows a second column to stretch, reducing the difference in + % height between the two. + \setbox0=\vbox to\dimen@{\unvbox1\vfill}% + \setbox2=\vbox to\dimen@{\unvbox3\vskip 0pt plus 0.3\ht0}% + \else + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + \fi + \fi % - \pagesofar + \global\setbox\balancedcolumns=\vbox{\pagesofar}% } \catcode`\@ = \other @@ -5236,6 +5959,10 @@ end \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page + % This outputs a mark at the end of the page that clears \thischapter + % and \thissection, as is done in \startcontents. + \let\pchapsepmacro\relax + \chapmacro{}{Yomitfromtoc}{}% \chapoddpage \endgroup } @@ -5480,9 +6207,6 @@ end % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% - % Well, we could do the following in a group, but that would break - % an assumption that \chapmacro is called at the outermost level. - % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax @@ -5574,14 +6298,6 @@ end % Define @majorheading, @heading and @subheading -% NOTE on use of \vbox for chapter headings, section headings, and such: -% 1) We use \vbox rather than the earlier \line to permit -% overlong headings to fold. -% 2) \hyphenpenalty is set to 10000 because hyphenation in a -% heading is obnoxious; this forbids it. -% 3) Likewise, headings look best if no \parindent is used, and -% if justification is not attempted. Hence \raggedright. - \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz @@ -5589,10 +6305,8 @@ end \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% - {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\ptexraggedright - \rmisbold #1\hfill}}% - \bigskip \par\penalty 200\relax + \vbox{\chapfonts \raggedtitlesettings #1\par}% + \nobreak\bigskip \nobreak \suppressfirstparagraphindent } @@ -5616,7 +6330,11 @@ end % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} + +% Start a new page \def\chappager{\par\vfill\supereject} + +% \chapoddpage - start on an odd page for a new chapter % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. @@ -5631,7 +6349,7 @@ end \fi } -\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} +\parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager @@ -5652,17 +6370,26 @@ end \CHAPPAGon -% Chapter opening. +% \chapmacro - Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. +% Not used for @heading series. % % To test against our argument. \def\Ynothingkeyword{Ynothing} -\def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} +\def\Yomitfromtockeyword{Yomitfromtoc} % \def\chapmacro#1#2#3{% + \expandafter\ifx\thisenv\titlepage\else + \checkenv{}% chapters, etc., should not start inside an environment. + \fi + % FIXME: \chapmacro is currently called from inside \titlepage when + % \setcontentsaftertitlepage to print the "Table of Contents" heading, but + % this should probably be done by \sectionheading with an option to print + % in chapter size. + % % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs @@ -5715,6 +6442,7 @@ end % {% \chapfonts \rmisbold + \let\footnote=\errfootnoteheading % give better error message % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called @@ -5751,8 +6479,7 @@ end % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. - \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright - \hangindent=\wd0 \centerparametersmaybe + \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title @@ -5768,30 +6495,6 @@ end } -% I don't think this chapter style is supported any more, so I'm not -% updating it with the new noderef stuff. We'll see. --karl, 11aug03. -% -\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} -% -\def\unnchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt\ptexraggedright - \rmisbold #1\hfill}}\bigskip \par\nobreak -} -\def\chfopen #1#2{\chapoddpage {\chapfonts -\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% -\par\penalty 5000 % -} -\def\centerchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 - \parindent=0pt - \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak -} -\def\CHAPFopen{% - \global\let\chapmacro=\chfopen - \global\let\centerchapmacro=\centerchfopen} - - % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % @@ -5809,22 +6512,29 @@ end % Print any size, any type, section title. % -% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is -% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the -% section number. +% #1 is the text of the title, +% #2 is the section level (sec/subsec/subsubsec), +% #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc), +% #4 is the section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% - \checkenv{}% should not be in an environment. + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + % It is ok for the @heading series commands to appear inside an + % environment (it's been historically allowed, though the logic is + % dubious), but not the others. + \ifx\temptype\Yomitfromtockeyword\else + \checkenv{}% non-@*heading should not be in an environment. + \fi + \let\footnote=\errfootnoteheading % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % - \def\sectionlevel{#2}% - \def\temptype{#3}% - % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword @@ -5876,7 +6586,7 @@ end % % Now the second mark, after the heading break. No break points % between here and the heading. - \let\prevsectiondefs=\lastsectiondefs + \global\let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. @@ -5987,7 +6697,14 @@ end % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. - \ifpdf \global\pdfmakepagedesttrue \fi + \ifpdf + \global\pdfmakepagedesttrue + \else + \ifx\XeTeXrevision\thisisundefined + \else + \global\pdfmakepagedesttrue + \fi + \fi } @@ -6036,7 +6753,7 @@ end \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. - \advance\hsize by -\contentsrightmargin % Don't use the full line length. + \entryrightmargin=\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi @@ -6141,7 +6858,7 @@ end % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} -% + % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% @@ -6156,7 +6873,7 @@ end \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % -\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} @@ -6189,6 +6906,8 @@ end \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup + % Move the page numbers slightly to the right + \advance\entryrightmargin by -0.05em \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup @@ -6243,14 +6962,14 @@ end \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other - \catcode`\`=\other - \catcode`\'=\other - \escapechar=`\\ + \catcode `\`=\other + \catcode `\'=\other % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % + % Inverse of the list at the beginning of the file. \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc @@ -6266,9 +6985,11 @@ end \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash + \let\sp=\ptexsp \let\*=\ptexstar + %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode \let\t=\ptext - \expandafter \let\csname top\endcsname=\ptextop % outer + \expandafter \let\csname top\endcsname=\ptextop % we've made it outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% @@ -6298,6 +7019,24 @@ end % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz and + % \sectionheading, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + \ifnum\lastpenalty<10000 + % Penalize breaking before the environment, because preceding text + % often leads into it. + \penalty100 + \fi + \vskip\envskipamount + \fi + \fi +}} + +\def\afterenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else @@ -6313,8 +7052,6 @@ end \fi }} -\let\afterenvbreak = \aboveenvbreak - % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax @@ -6352,15 +7089,13 @@ end % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip - % Flag to tell @lisp, etc., not to narrow margin. - \let\nonarrowing = t% % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % - \vbox\bgroup + \setbox\groupbox=\vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup @@ -6384,6 +7119,7 @@ end \egroup \cartbot \egroup + \addgroupbox \checkinserts } @@ -6393,7 +7129,7 @@ end \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak - \hfuzz = 12pt % Don't be fussy + \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output @@ -6520,9 +7256,13 @@ end % @raggedright does more-or-less normal line breaking but no right -% justification. From plain.tex. +% justification. From plain.tex. Don't stretch around special +% characters in urls in this environment, since the stretch at the right +% should be enough. \envdef\raggedright{% - \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax + \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax + \def\urefprestretchamount{0pt}% + \def\urefpoststretchamount{0pt}% } \let\Eraggedright\par @@ -6551,16 +7291,9 @@ end \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% - {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip - \parindent=0pt - % - % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax - \advance\leftskip by \lispnarrowing \advance\rightskip by \lispnarrowing - \exdentamount = \lispnarrowing - \else - \let\nonarrowing = \relax \fi \parsearg\quotationlabel } @@ -6586,6 +7319,32 @@ end \fi } +% @indentedblock is like @quotation, but indents only on the left and +% has no optional argument. +% +\makedispenvdef{indentedblock}{\indentedblockstart} +% +\def\indentedblockstart{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \exdentamount = \lispnarrowing + \else + \let\nonarrowing = \relax + \fi +} + +% Keep a nonzero parskip for the environment, since we're doing normal filling. +% +\def\Eindentedblock{% + \par + {\parskip=0pt \afterenvbreak}% +} +\def\Esmallindentedblock{\Eindentedblock} + % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, @@ -6743,7 +7502,7 @@ end % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as -% possible is very desirable. +% possible is desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} @@ -6838,7 +7597,7 @@ end \temp } -% \domakedefun \deffn \deffnx \deffnheader +% \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) } % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. @@ -7064,7 +7823,10 @@ end \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we - % want a way to get ttsl. Let's try @var for that. + % want a way to get ttsl. We used to recommend @var for that, so + % leave the code in, but it's strange for @var to lead to typewriter. + % Nowadays we recommend @code, since the difference between a ttsl hyphen + % and a tt hyphen is pretty tiny. @code also disables ?` !`. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 @@ -7173,34 +7935,49 @@ end } \fi -\def\scanmacro#1{\begingroup +\let\aftermacroxxx\relax +\def\aftermacro{\aftermacroxxx} + +% alias because \c means cedilla in @tex or @math +\let\texinfoc=\c + +\newcount\savedcatcodeone +\newcount\savedcatcodetwo + +% Used at the time of macro expansion. +% Argument is macro body with arguments substituted +\def\scanmacro#1{% \newlinechar`\^^M - \let\xeatspaces\eatspaces + \def\xeatspaces{\eatspaces}% % - % Undo catcode changes of \startcontents and \doprintindex - % When called from @insertcopying or (short)caption, we need active - % backslash to get it printed correctly. Previously, we had - % \catcode`\\=\other instead. We'll see whether a problem appears - % with macro expansion. --kasal, 19aug04 - \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ + % Temporarily undo catcode changes of \printindex. Set catcode of @ to + % 0 so that @-commands in macro expansions aren't printed literally when + % formatting an index file, where \ is used as the escape character. + \savedcatcodeone=\catcode`\@ + \savedcatcodetwo=\catcode`\\ + \catcode`\@=0 + \catcode`\\=\active % - % ... and for \example: - \spaceisspace + % Process the macro body under the current catcode regime. + \scantokens{#1@texinfoc}\aftermacro% % - % The \empty here causes a following catcode 5 newline to be eaten as - % part of reading whitespace after a control sequence. It does not - % eat a catcode 13 newline. There's no good way to handle the two - % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX - % would then have different behavior). See the Macro Details node in - % the manual for the workaround we recommend for macros and - % line-oriented commands. - % - \scantokens{#1\empty}% -\endgroup} + \catcode`\@=\savedcatcodeone + \catcode`\\=\savedcatcodetwo + % + % The \texinfoc is to remove the \newlinechar added by \scantokens, and + % can be noticed by \parsearg. + % The \aftermacro allows a \comment at the end of the macro definition + % to duplicate itself past the final \newlinechar added by \scantokens: + % this is used in the definition of \group to comment out a newline. We + % don't do the same for \c to support Texinfo files with macros that ended + % with a @c, which should no longer be necessary. + % We avoid surrounding the call to \scantokens with \bgroup and \egroup + % to allow macros to open or close groups themselves. +} +% Used for copying and captions \def\scanexp#1{% - \edef\temp{\noexpand\scanmacro{#1}}% - \temp + \expandafter\scanmacro\expandafter{#1}% } \newcount\paramno % Count of parameters @@ -7266,53 +8043,45 @@ end \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other - \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other - \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi + \passthroughcharstrue } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt + \catcode`\@=\other \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt + \catcode`\ =\other + \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } -% LilyPond CHANGE: The following definition has been reverted to the -% original definition since it was problematic in the context of -% indexing. - -\def\macroargctxt{% used when scanning invocations +% Used when scanning braced macro arguments. Note, however, that catcode +% changes here are ineffectual if the macro invocation was nested inside +% an argument to another Texinfo command. +\def\macroargctxt{% \scanctxt -% \catcode`\\=0 - \catcode`\\=\other + \catcode`\ =\active + \catcode`\^^M=\other + \catcode`\\=\active } -% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" -% for the single characters \ { }. Thus, we end up with the "commands" -% that would be written @\ @{ @} in a Texinfo document. -% -% We already have @{ and @}. For @\, we define it here, and only for -% this purpose, to produce a typewriter backslash (so, the @\ that we -% define for @math can't be used with @macro calls): -% -\def\\{\normalbackslash}% -% -% We would like to do this for \, too, since that is what makeinfo does. -% But it is not possible, because Texinfo already has a command @, for a -% cedilla accent. Documents must use @comma{} instead. -% -% \anythingelse will almost certainly be an error of some kind. +\def\macrolineargctxt{% used for whole-line arguments without braces + \scanctxt + \catcode`\{=\other + \catcode`\}=\other +} % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N @@ -7384,57 +8153,36 @@ end \fi } -% This makes use of the obscure feature that if the last token of a -% is #, then the preceding argument is delimited by -% an opening brace, and that opening brace is not consumed. +% \getargs -- Parse the arguments to a @macro line. Set \macname to +% the name of the macro, and \argl to the braced argument list. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} +% This made use of the feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. -% For macro processing make @ a letter so that we can make Texinfo private macro names. -\edef\texiatcatcode{\the\catcode`\@} -\catcode `@=11\relax - -% Parse the optional {params} list. Set up \paramno and \paramlist -% so \defmacro knows what to do. Define \macarg.BLAH for each BLAH -% in the params list to some hook where the argument si to be expanded. If -% there are less than 10 arguments that hook is to be replaced by ##N where N +% Parse the optional {params} list to @macro or @rmacro. +% Set \paramno to the number of arguments, +% and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a +% three-param macro.) Define \macarg.BLAH for each BLAH in the params +% list to some hook where the argument is to be expanded. If there are +% less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % -% We need to get `macro parameter char #' into several definitions. -% The technique used is stolen from LaTeX: let \hash be something -% unexpandable, insert that wherever you need a #, and then redefine -% it to # just before using the token list produced. -% -% The same technique is used to protect \eatspaces till just before -% the macro is used. +% If there are 10 or more arguments, a different technique is used: see +% \parsemmanyargdef. % -% If there are 10 or more arguments, a different technique is used, where the -% hook remains in the body, and when macro is to be expanded the body is -% processed again to replace the arguments. -% -% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the -% argument N value and then \edef the body (nothing else will expand because of -% the catcode regime underwhich the body was input). -% -% If you compile with TeX (not eTeX), and you have macros with 10 or more -% arguments, you need that no macro has more than 256 arguments, otherwise an -% error is produced. \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax + % \hash is redefined to `#' later to get it into definitions \let\xeatspaces\relax \parsemargdefxxx#1,;,% - % In case that there are 10 or more arguments we parse again the arguments - % list to set new definitions for the \macarg.BLAH macros corresponding to - % each BLAH argument. It was anyhow needed to parse already once this list - % in order to count the arguments, and as macros with at most 9 arguments - % are by far more frequent than macro with 10 or more arguments, defining - % twice the \macarg.BLAH macros does not cost too much processing power. \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments @@ -7449,6 +8197,43 @@ end \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} +% \parsemacbody, \parsermacbody +% +% Read recursive and nonrecursive macro bodies. (They're different since +% rec and nonrec macros end differently.) +% +% We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro +% body to be transformed. +% Set \macrobody to the body of the macro, and call \defmacro. +% +{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% +\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% +{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% +\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% + +% Make @ a letter, so that we can make private-to-Texinfo macro names. +\edef\texiatcatcode{\the\catcode`\@} +\catcode `@=11\relax + +%%%%%%%%%%%%%% Code for > 10 arguments only %%%%%%%%%%%%%%%%%% + +% If there are 10 or more arguments, a different technique is used, where the +% hook remains in the body, and when macro is to be expanded the body is +% processed again to replace the arguments. +% +% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the +% argument N value and then \edef the body (nothing else will expand because of +% the catcode regime under which the body was input). +% +% If you compile with TeX (not eTeX), and you have macros with 10 or more +% arguments, no macro can have more than 256 arguments (else error). +% +% In case that there are 10 or more arguments we parse again the arguments +% list to set new definitions for the \macarg.BLAH macros corresponding to +% each BLAH argument. It was anyhow needed to parse already once this list +% in order to count the arguments, and as macros with at most 9 arguments +% are by far more frequent than macro with 10 or more arguments, defining +% twice the \macarg.BLAH macros does not cost too much processing power. \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else @@ -7464,16 +8249,6 @@ end \advance\paramno by 1\relax \fi\next} -% These two commands read recursive and nonrecursive macro bodies. -% (They're different since rec and nonrec macros end differently.) -% - -\catcode `\@\texiatcatcode -\long\def\parsemacbody#1@end macro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% -\long\def\parsermacbody#1@end rmacro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% -\catcode `\@=11\relax \let\endargs@\relax \let\nil@\relax @@ -7481,7 +8256,7 @@ end \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its -% definition. It gets all the arguments values and assigns them to macros +% definition. It gets all the arguments' values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name @@ -7502,8 +8277,6 @@ end \getargvals@@ \fi } - -% \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. @@ -7547,7 +8320,8 @@ end } % Replace arguments by their values in the macro body, and place the result -% in macro \@tempa +% in macro \@tempa. +% \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument @@ -7571,8 +8345,9 @@ end \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } +% Define the named-macro outside of this group and then close this group. +% \def\macargexpandinbody@{% - %% Define the named-macro outside of this group and then close this group. \expandafter \endgroup \macargdeflist@ @@ -7609,14 +8384,8 @@ end \next } -% Save the token stack pointer into macro #1 -\def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} -% Restore the token stack pointer from number in macro #1 -\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} -% newtoks that can be used non \outer . -\def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} - -% Tailing missing arguments are set to empty +% Trailing missing arguments are set to empty. +% \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ @@ -7646,99 +8415,228 @@ end \long\def#2{#4}% } -% This defines a Texinfo @macro. There are eight cases: recursive and -% nonrecursive macros of zero, one, up to nine, and many arguments. -% Much magic with \expandafter here. + +%%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%% + + +% This defines a Texinfo @macro or @rmacro, called by \parsemacbody. +% \macrobody has the body of the macro in it, with placeholders for +% its parameters, looking like "\xeatspaces{\hash 1}". +% \paramno is the number of parameters +% \paramlist is a TeX parameter text, e.g. "#1,#2,#3," +% There are eight cases: recursive and nonrecursive macros of zero, one, +% up to nine, and many arguments. % \xdef is used so that macro definitions will survive the file -% they're defined in; @include reads the file inside a group. +% they're defined in: @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars - \ifrecursive + \ifnum\paramno=1 + \def\xeatspaces##1{##1}% + % This removes the pair of braces around the argument. We don't + % use \eatspaces, because this can cause ends of lines to be lost + % when the argument to \eatspaces is read, leading to line-based + % commands like "@itemize" not being read correctly. + \else + \let\xeatspaces\relax % suppress expansion + \fi + \ifrecursive %%%%%%%%%%%%%% Recursive %%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\scanmacro{\temp}}% + \noexpand\scanmacro{\macrobody}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt + \bgroup \noexpand\braceorline - \expandafter\noexpand\csname\the\macname xxx\endcsname}% - \expandafter\xdef\csname\the\macname xxx\endcsname##1{% - \egroup\noexpand\scanmacro{\temp}}% + \expandafter\noexpand\csname\the\macname @@@\endcsname}% + \expandafter\xdef\csname\the\macname @@@\endcsname##1{% + \egroup + \noexpand\scanmacro{\macrobody}% + }% \else \ifnum\paramno<10\relax % at most 9 + % See non-recursive section below for comments \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \noexpand\csname\the\macname xx\endcsname}% - \expandafter\xdef\csname\the\macname xx\endcsname##1{% - \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \bgroup + \noexpand\expandafter + \noexpand\macroargctxt + \noexpand\expandafter + \expandafter\noexpand\csname\the\macname @@\endcsname}% + \expandafter\xdef\csname\the\macname @@\endcsname##1{% + \noexpand\passargtomacro + \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% + \expandafter\xdef\csname\the\macname @@@\endcsname##1{% + \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter - \csname\the\macname xxx\endcsname - \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \csname\the\macname @@@@\endcsname\paramlist{% + \egroup\noexpand\scanmacro{\macrobody}}% \else % 10 or more \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% - \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp + \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi - \else + \else %%%%%%%%%%%%%%%%%%%%%% Non-recursive %%%%%%%%%%%%%%%%%%%%%%%%%% \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% + \noexpand\scanmacro{\macrobody}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt + \bgroup \noexpand\braceorline - \expandafter\noexpand\csname\the\macname xxx\endcsname}% - \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \expandafter\noexpand\csname\the\macname @@@\endcsname}% + \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \egroup - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% + \noexpand\scanmacro{\macrobody}% + }% \else % at most 9 \ifnum\paramno<10\relax + % @MACNAME sets the context for reading the macro argument + % @MACNAME@@ gets the argument, processes backslashes and appends a + % comma. + % @MACNAME@@@ removes braces surrounding the argument list. + % @MACNAME@@@@ scans the macro body with arguments substituted. \expandafter\xdef\csname\the\macname\endcsname{% - \bgroup\noexpand\macroargctxt - \expandafter\noexpand\csname\the\macname xx\endcsname}% - \expandafter\xdef\csname\the\macname xx\endcsname##1{% - \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \bgroup + \noexpand\expandafter % This \expandafter skip any spaces after the + \noexpand\macroargctxt % macro before we change the catcode of space. + \noexpand\expandafter + \expandafter\noexpand\csname\the\macname @@\endcsname}% + \expandafter\xdef\csname\the\macname @@\endcsname##1{% + \noexpand\passargtomacro + \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% + \expandafter\xdef\csname\the\macname @@@\endcsname##1{% + \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter - \csname\the\macname xxx\endcsname - \paramlist{% - \egroup - \noexpand\norecurse{\the\macname}% - \noexpand\scanmacro{\temp}\egroup}% + \csname\the\macname @@@@\endcsname\paramlist{% + \egroup\noexpand\scanmacro{\macrobody}}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% - \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp + \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse \fi \fi \fi} -\catcode `\@\texiatcatcode\relax +\catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} -% \braceorline decides whether the next nonwhitespace character is a -% {. If so it reads up to the closing }, if not, it reads the whole -% line. Whatever was read is then fed to the next control sequence -% as an argument (by \parsebrace or \parsearg). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +{\catcode`\@=0 \catcode`\\=13 % We need to manipulate \ so use @ as escape +@catcode`@_=11 % private names +@catcode`@!=11 % used as argument separator + +% \passargtomacro#1#2 - +% Call #1 with a list of tokens #2, with any doubled backslashes in #2 +% compressed to one. +% +% This implementation works by expansion, and not execution (so we cannot use +% \def or similar). This reduces the risk of this failing in contexts where +% complete expansion is done with no execution (for example, in writing out to +% an auxiliary file for an index entry). +% +% State is kept in the input stream: the argument passed to +% @look_ahead, @gobble_and_check_finish and @add_segment is +% +% THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN (... rest of input) +% +% where: +% THE_MACRO - name of the macro we want to call +% ARG_RESULT - argument list we build to pass to that macro +% PENDING_BS - either a backslash or nothing +% NEXT_TOKEN - used to look ahead in the input stream to see what's coming next + +@gdef@passargtomacro#1#2{% + @add_segment #1!{}@relax#2\@_finish\% +} +@gdef@_finish{@_finishx} @global@let@_finishx@relax + +% #1 - THE_MACRO ARG_RESULT +% #2 - PENDING_BS +% #3 - NEXT_TOKEN +% #4 used to look ahead +% +% If the next token is not a backslash, process the rest of the argument; +% otherwise, remove the next token. +@gdef@look_ahead#1!#2#3#4{% + @ifx#4\% + @expandafter@gobble_and_check_finish + @else + @expandafter@add_segment + @fi#1!{#2}#4#4% +} + +% #1 - THE_MACRO ARG_RESULT +% #2 - PENDING_BS +% #3 - NEXT_TOKEN +% #4 should be a backslash, which is gobbled. +% #5 looks ahead +% +% Double backslash found. Add a single backslash, and look ahead. +@gdef@gobble_and_check_finish#1!#2#3#4#5{% + @add_segment#1\!{}#5#5% +} + +@gdef@is_fi{@fi} + +% #1 - THE_MACRO ARG_RESULT +% #2 - PENDING_BS +% #3 - NEXT_TOKEN +% #4 is input stream until next backslash +% +% Input stream is either at the start of the argument, or just after a +% backslash sequence, either a lone backslash, or a doubled backslash. +% NEXT_TOKEN contains the first token in the input stream: if it is \finish, +% finish; otherwise, append to ARG_RESULT the segment of the argument up until +% the next backslash. PENDING_BACKSLASH contains a backslash to represent +% a backslash just before the start of the input stream that has not been +% added to ARG_RESULT. +@gdef@add_segment#1!#2#3#4\{% +@ifx#3@_finish + @call_the_macro#1!% +@else + % append the pending backslash to the result, followed by the next segment + @expandafter@is_fi@look_ahead#1#2#4!{\}@fi + % this @fi is discarded by @look_ahead. + % we can't get rid of it with \expandafter because we don't know how + % long #4 is. +} + +% #1 - THE_MACRO +% #2 - ARG_RESULT +% #3 discards the res of the conditional in @add_segment, and @is_fi ends the +% conditional. +@gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}} + +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% \braceorline MAC is used for a one-argument macro MAC. It checks +% whether the next non-whitespace character is a {. It sets the context +% for reading the argument (slightly different in the two cases). Then, +% to read the argument, in the whole-line case, it then calls the regular +% \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC. % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% - \ifx\nchar\bgroup\else - \expandafter\parsearg + \ifx\nchar\bgroup + \macroargctxt + \expandafter\passargtomacro + \else + \macrolineargctxt\expandafter\parsearg \fi \macnamexxx} @@ -7820,7 +8718,10 @@ end \pdfmkdest{#1}% \iflinks {% + \requireauxfile \atdummies % preserve commands, but don't expand them + % match definition in \xrdef, \refx, \xrefX. + \def\value##1{##1}% \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef @@ -7859,9 +8760,12 @@ end % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % -\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} -\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} -\def\ref#1{\xrefX[#1,,,,,,,]} +\def\pxref{\putwordsee{} \xrefXX} +\def\xref{\putwordSee{} \xrefXX} +\def\ref{\xrefXX} + +\def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX} +\def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox @@ -7908,6 +8812,7 @@ end % % Make link in pdf output. \ifpdf + % For pdfTeX and LuaTeX {\indexnofonts \turnoffactive \makevalueexpandable @@ -7934,19 +8839,61 @@ end \fi }% \setcolor{\linkcolor}% + \else + \ifx\XeTeXrevision\thisisundefined + \else + % For XeTeX + {\indexnofonts + \turnoffactive + \makevalueexpandable + % This expands tokens, so do it after making catcode changes, so _ + % etc. don't get their TeX definitions. This ignores all spaces in + % #4, including (wrongly) those in the middle of the filename. + \getfilename{#4}% + % + % This (wrongly) does not take account of leading or trailing + % spaces in #1, which should be ignored. + \iftxiuseunicodedestname + \def\pdfxrefdest{#1}% Pass through Unicode characters. + \else + \edef\pdfxrefdest{#1}% Replace Unicode characters to ASCII. + \fi + \ifx\pdfxrefdest\empty + \def\pdfxrefdest{Top}% no empty targets + \else + \txiescapepdf\pdfxrefdest % escape PDF special chars + \fi + % + \leavevmode + \ifnum\filenamelength>0 + % By the default settings, + % XeTeX (xdvipdfmx) replaces link destination names with integers. + % In this case, the replaced destination names of + % remote PDF cannot be known. In order to avoid replacement, + % you can use commandline option `-C 0x0010' for xdvipdfmx. + \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A + << /S /GoToR /F (\the\filename.pdf) /D (name\pdfxrefdest) >> >>}% + \else + \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A + << /S /GoTo /D (name\pdfxrefdest) >> >>}% + \fi + }% + \setcolor{\linkcolor}% + \fi \fi - % - % Float references are printed completely differently: "Figure 1.2" - % instead of "[somenode], p.3". We distinguish them by the - % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive + \def\value##1{##1}% \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". \iffloat distinguishes them by + % \Xthisreftitle being set to a magic string. \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". @@ -8005,6 +8952,15 @@ end % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + % Add a , if xref followed by a space + \if\space\noexpand\tokenafterxref ,% + \else\ifx\ \tokenafterxref ,% @TAB + \else\ifx\*\tokenafterxref ,% @* + \else\ifx\ \tokenafterxref ,% @SPACE + \else\ifx\ + \tokenafterxref ,% @NL + \else\ifx\tie\tokenafterxref ,% @tie + \fi\fi\fi\fi\fi\fi \fi\fi \fi \endlink @@ -8071,13 +9027,14 @@ end \fi\fi\fi } -% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. -% If its value is nonempty, SUFFIX is output afterward. -% +% \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME. SUFFIX +% is output afterwards if non-empty. \def\refx#1#2{% + \requireauxfile {% \indexnofonts \otherbackslash + \def\value##1{##1}% \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% @@ -8102,16 +9059,18 @@ end #2% Output the suffix in any case. } -% This is the macro invoked by entries in the aux file. Usually it's -% just a \def (we prepend XR to the control sequence name to avoid -% collisions). But if this is a float type, we have more work to do. +% This is the macro invoked by entries in the aux file. Define a control +% sequence for a cross-reference target (we prepend XR to the control sequence +% name to avoid collisions). The value is the page number. If this is a float +% type, we have more work to do. % \def\xrdef#1#2{% - {% The node name might contain 8-bit characters, which in our current - % implementation are changed to commands like @'e. Don't let these - % mess up the control sequence name. + {% Expand the node or anchor name to remove control sequences. + % \turnoffactive stops 8-bit characters being changed to commands + % like @'e. \refx does the same to retrieve the value in the definition. \indexnofonts \turnoffactive + \def\value##1{##1}% \xdef\safexrefname{#1}% }% % @@ -8138,6 +9097,23 @@ end \fi } +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate at the beginning of the file. +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% Used when writing to the aux file, or when using data from it. +\def\requireauxfile{% + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=\jobname.aux + \fi + \global\let\requireauxfile=\relax % Only do this once. +} + % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% @@ -8216,16 +9192,6 @@ end % now. --karl, 15jan04. \catcode`\\=\other % - % Make the characters 128-255 be printing characters. - {% - \count1=128 - \def\loop{% - \catcode\count1=\other - \advance\count1 by 1 - \ifnum \count1<256 \loop \fi - }% - }% - % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 @@ -8258,8 +9224,6 @@ end % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% - \let\indent=\ptexindent - \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % @@ -8283,10 +9247,15 @@ end % \gdef\dofootnote{% \insert\footins\bgroup + % + % Nested footnotes are not supported in TeX, that would take a lot + % more work. (\startsavinginserts does not suffice.) + \let\footnote=\errfootnotenest + % % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. - \hsize=\pagewidth + \hsize=\txipagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox @@ -8320,13 +9289,24 @@ end } }%end \catcode `\@=11 +\def\errfootnotenest{% + \errhelp=\EMsimple + \errmessage{Nested footnotes not supported in texinfo.tex, + even though they work in makeinfo; sorry} +} + +\def\errfootnoteheading{% + \errhelp=\EMsimple + \errmessage{Footnotes in chapters, sections, etc., are not supported} +} + % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. - +% % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. @@ -8424,6 +9404,7 @@ end \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names + \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro % If the image is by itself, center it. \ifvmode \imagevmodetrue @@ -8453,12 +9434,21 @@ end % % Output the image. \ifpdf + % For pdfTeX and LuaTeX <= 0.80 \dopdfimage{#1}{#2}{#3}% \else - % \epsfbox itself resets \epsf?size at each figure. - \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi - \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi - \epsfbox{#1.eps}% + \ifx\XeTeXrevision\thisisundefined + % For epsf.tex + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \else + % For XeTeX + \doxeteximage{#1}{#2}{#3}% + \fi \fi % \ifimagevmode @@ -8580,7 +9570,7 @@ end % \ifx\thiscaption\empty \else \ifx\floatident\empty \else - \appendtomacro\captionline{: }% had ident, so need a colon between + \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. @@ -8604,32 +9594,20 @@ end % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% + \requireauxfile \atdummies % - % since we read the caption text in the macro world, where ^^M - % is turned into a normal character, we have to scan it back, so - % we don't write the literal three characters "^^M" into the aux file. - \scanexp{% - \xdef\noexpand\gtemp{% - \ifx\thisshortcaption\empty - \thiscaption - \else - \thisshortcaption - \fi - }% - }% + \ifx\thisshortcaption\empty + \def\gtemp{\thiscaption}% + \else + \def\gtemp{\thisshortcaption}% + \fi \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident - \ifx\gtemp\empty \else : \gtemp \fi}}% + \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % - % place the captured inserts - % - % BEWARE: when the floats start floating, we have to issue warning - % whenever an insert appears inside a float which could possibly - % float. --kasal, 26may04 - % \checkinserts } @@ -8743,20 +9721,20 @@ end { \catcode`\_ = \active \globaldefs=1 -\parseargdef\documentlanguage{\begingroup - \let_=\normalunderscore % normal _ character for filenames +\parseargdef\documentlanguage{% \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. + \let_ = \normalunderscore % normal _ character for filename test \openin 1 txi-#1.tex \ifeof 1 - \documentlanguagetrywithoutunderscore{#1_\finish}% + \documentlanguagetrywithoutunderscore #1_\finish \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX -\endgroup} +} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. @@ -8804,6 +9782,70 @@ directory should work if nowhere else does.} \global\righthyphenmin = #3\relax } +% XeTeX and LuaTeX can handle native Unicode. +% Their default I/O is UTF-8 sequence instead of byte-wise. +% Other TeX engine (pdfTeX etc.) I/O is byte-wise. +% +\newif\iftxinativeunicodecapable +\newif\iftxiusebytewiseio + +\ifx\XeTeXrevision\thisisundefined + \ifx\luatexversion\thisisundefined + \txinativeunicodecapablefalse + \txiusebytewiseiotrue + \else + \txinativeunicodecapabletrue + \txiusebytewiseiofalse + \fi +\else + \txinativeunicodecapabletrue + \txiusebytewiseiofalse +\fi + +% Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex +% for non-UTF-8 (byte-wise) encodings. +% +\def\setbytewiseio{% + \ifx\XeTeXrevision\thisisundefined + \else + \XeTeXdefaultencoding "bytes" % For subsequent files to be read + \XeTeXinputencoding "bytes" % For document root file + % Unfortunately, there seems to be no corresponding XeTeX command for + % output encoding. This is a problem for auxiliary index and TOC files. + % The only solution would be perhaps to write out @U{...} sequences in + % place of non-ASCII characters. + \fi + + \ifx\luatexversion\thisisundefined + \else + \directlua{ + local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub + local function convert_char (char) + return utf8_char(byte(char)) + end + + local function convert_line (line) + return gsub(line, ".", convert_char) + end + + callback.register("process_input_buffer", convert_line) + + local function convert_line_out (line) + local line_out = "" + for c in string.utfvalues(line) do + line_out = line_out .. string.char(c) + end + return line_out + end + + callback.register("process_output_buffer", convert_line_out) + } + \fi + + \txiusebytewiseiotrue +} + + % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % @@ -8826,7 +9868,9 @@ directory should work if nowhere else does.} % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % -\parseargdef\documentencoding{% +\def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz} +\def\documentencodingzzz#1{% + % % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % @@ -8842,23 +9886,40 @@ directory should work if nowhere else does.} \asciichardefs % \else \ifx \declaredencoding \lattwo + \iftxinativeunicodecapable + \setbytewiseio + \fi \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone + \iftxinativeunicodecapable + \setbytewiseio + \fi \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine + \iftxinativeunicodecapable + \setbytewiseio + \fi \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight - \setnonasciicharscatcode\active - \utfeightchardefs + \iftxinativeunicodecapable + % For native Unicode (XeTeX and LuaTeX) + \nativeunicodechardefs + \else + % For UTF-8 byte sequence (TeX, eTeX and pdfTeX) + \setnonasciicharscatcode\active + % since we already invoked \utfeightchardefs at the top level + % (below), do not re-invoke it, then our check for duplicated + % definitions triggers. Making non-ascii chars active is enough. + \fi % \else - \message{Unknown document encoding #1, ignoring.}% + \message{Ignoring unknown document encoding: #1.}% % \fi % utfeight \fi % latnine @@ -8867,10 +9928,11 @@ directory should work if nowhere else does.} \fi % ascii } +% emacs-page % A message to be logged when using a character that isn't available % the default font encoding (OT1). % -\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} +\def\missingcharmsg#1{\message{Character missing, sorry: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} @@ -8880,111 +9942,119 @@ directory should work if nowhere else does.} % macros containing the character definitions. \setnonasciicharscatcode\active % + +\def\gdefchar#1#2{% +\gdef#1{% + \ifpassthroughchars + \string#1% + \else + #2% + \fi +}} + % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% - \gdef^^a0{\tie} - \gdef^^a1{\exclamdown} - \gdef^^a2{\missingcharmsg{CENT SIGN}} - \gdef^^a3{{\pounds}} - \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} - \gdef^^a5{\missingcharmsg{YEN SIGN}} - \gdef^^a6{\missingcharmsg{BROKEN BAR}} - \gdef^^a7{\S} - \gdef^^a8{\"{}} - \gdef^^a9{\copyright} - \gdef^^aa{\ordf} - \gdef^^ab{\guillemetleft} - \gdef^^ac{$\lnot$} - \gdef^^ad{\-} - \gdef^^ae{\registeredsymbol} - \gdef^^af{\={}} - % - \gdef^^b0{\textdegree} - \gdef^^b1{$\pm$} - \gdef^^b2{$^2$} - \gdef^^b3{$^3$} - \gdef^^b4{\'{}} - \gdef^^b5{$\mu$} - \gdef^^b6{\P} - % - \gdef^^b7{$^.$} - \gdef^^b8{\cedilla\ } - \gdef^^b9{$^1$} - \gdef^^ba{\ordm} - % - \gdef^^bb{\guillemetright} - \gdef^^bc{$1\over4$} - \gdef^^bd{$1\over2$} - \gdef^^be{$3\over4$} - \gdef^^bf{\questiondown} - % - \gdef^^c0{\`A} - \gdef^^c1{\'A} - \gdef^^c2{\^A} - \gdef^^c3{\~A} - \gdef^^c4{\"A} - \gdef^^c5{\ringaccent A} - \gdef^^c6{\AE} - \gdef^^c7{\cedilla C} - \gdef^^c8{\`E} - \gdef^^c9{\'E} - \gdef^^ca{\^E} - \gdef^^cb{\"E} - \gdef^^cc{\`I} - \gdef^^cd{\'I} - \gdef^^ce{\^I} - \gdef^^cf{\"I} - % - \gdef^^d0{\DH} - \gdef^^d1{\~N} - \gdef^^d2{\`O} - \gdef^^d3{\'O} - \gdef^^d4{\^O} - \gdef^^d5{\~O} - \gdef^^d6{\"O} - \gdef^^d7{$\times$} - \gdef^^d8{\O} - \gdef^^d9{\`U} - \gdef^^da{\'U} - \gdef^^db{\^U} - \gdef^^dc{\"U} - \gdef^^dd{\'Y} - \gdef^^de{\TH} - \gdef^^df{\ss} - % - \gdef^^e0{\`a} - \gdef^^e1{\'a} - \gdef^^e2{\^a} - \gdef^^e3{\~a} - \gdef^^e4{\"a} - \gdef^^e5{\ringaccent a} - \gdef^^e6{\ae} - \gdef^^e7{\cedilla c} - \gdef^^e8{\`e} - \gdef^^e9{\'e} - \gdef^^ea{\^e} - \gdef^^eb{\"e} - \gdef^^ec{\`{\dotless i}} - \gdef^^ed{\'{\dotless i}} - \gdef^^ee{\^{\dotless i}} - \gdef^^ef{\"{\dotless i}} - % - \gdef^^f0{\dh} - \gdef^^f1{\~n} - \gdef^^f2{\`o} - \gdef^^f3{\'o} - \gdef^^f4{\^o} - \gdef^^f5{\~o} - \gdef^^f6{\"o} - \gdef^^f7{$\div$} - \gdef^^f8{\o} - \gdef^^f9{\`u} - \gdef^^fa{\'u} - \gdef^^fb{\^u} - \gdef^^fc{\"u} - \gdef^^fd{\'y} - \gdef^^fe{\th} - \gdef^^ff{\"y} + \gdefchar^^a0{\tie} + \gdefchar^^a1{\exclamdown} + \gdefchar^^a2{{\tcfont \char162}} % cent + \gdefchar^^a3{\pounds} + \gdefchar^^a4{{\tcfont \char164}} % currency + \gdefchar^^a5{{\tcfont \char165}} % yen + \gdefchar^^a6{{\tcfont \char166}} % broken bar + \gdefchar^^a7{\S} + \gdefchar^^a8{\"{}} + \gdefchar^^a9{\copyright} + \gdefchar^^aa{\ordf} + \gdefchar^^ab{\guillemetleft} + \gdefchar^^ac{\ensuremath\lnot} + \gdefchar^^ad{\-} + \gdefchar^^ae{\registeredsymbol} + \gdefchar^^af{\={}} + % + \gdefchar^^b0{\textdegree} + \gdefchar^^b1{$\pm$} + \gdefchar^^b2{$^2$} + \gdefchar^^b3{$^3$} + \gdefchar^^b4{\'{}} + \gdefchar^^b5{$\mu$} + \gdefchar^^b6{\P} + \gdefchar^^b7{\ensuremath\cdot} + \gdefchar^^b8{\cedilla\ } + \gdefchar^^b9{$^1$} + \gdefchar^^ba{\ordm} + \gdefchar^^bb{\guillemetright} + \gdefchar^^bc{$1\over4$} + \gdefchar^^bd{$1\over2$} + \gdefchar^^be{$3\over4$} + \gdefchar^^bf{\questiondown} + % + \gdefchar^^c0{\`A} + \gdefchar^^c1{\'A} + \gdefchar^^c2{\^A} + \gdefchar^^c3{\~A} + \gdefchar^^c4{\"A} + \gdefchar^^c5{\ringaccent A} + \gdefchar^^c6{\AE} + \gdefchar^^c7{\cedilla C} + \gdefchar^^c8{\`E} + \gdefchar^^c9{\'E} + \gdefchar^^ca{\^E} + \gdefchar^^cb{\"E} + \gdefchar^^cc{\`I} + \gdefchar^^cd{\'I} + \gdefchar^^ce{\^I} + \gdefchar^^cf{\"I} + % + \gdefchar^^d0{\DH} + \gdefchar^^d1{\~N} + \gdefchar^^d2{\`O} + \gdefchar^^d3{\'O} + \gdefchar^^d4{\^O} + \gdefchar^^d5{\~O} + \gdefchar^^d6{\"O} + \gdefchar^^d7{$\times$} + \gdefchar^^d8{\O} + \gdefchar^^d9{\`U} + \gdefchar^^da{\'U} + \gdefchar^^db{\^U} + \gdefchar^^dc{\"U} + \gdefchar^^dd{\'Y} + \gdefchar^^de{\TH} + \gdefchar^^df{\ss} + % + \gdefchar^^e0{\`a} + \gdefchar^^e1{\'a} + \gdefchar^^e2{\^a} + \gdefchar^^e3{\~a} + \gdefchar^^e4{\"a} + \gdefchar^^e5{\ringaccent a} + \gdefchar^^e6{\ae} + \gdefchar^^e7{\cedilla c} + \gdefchar^^e8{\`e} + \gdefchar^^e9{\'e} + \gdefchar^^ea{\^e} + \gdefchar^^eb{\"e} + \gdefchar^^ec{\`{\dotless i}} + \gdefchar^^ed{\'{\dotless i}} + \gdefchar^^ee{\^{\dotless i}} + \gdefchar^^ef{\"{\dotless i}} + % + \gdefchar^^f0{\dh} + \gdefchar^^f1{\~n} + \gdefchar^^f2{\`o} + \gdefchar^^f3{\'o} + \gdefchar^^f4{\^o} + \gdefchar^^f5{\~o} + \gdefchar^^f6{\"o} + \gdefchar^^f7{$\div$} + \gdefchar^^f8{\o} + \gdefchar^^f9{\`u} + \gdefchar^^fa{\'u} + \gdefchar^^fb{\^u} + \gdefchar^^fc{\"u} + \gdefchar^^fd{\'y} + \gdefchar^^fe{\th} + \gdefchar^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. @@ -8992,119 +10062,119 @@ directory should work if nowhere else does.} % Encoding is almost identical to Latin1. \latonechardefs % - \gdef^^a4{\euro} - \gdef^^a6{\v S} - \gdef^^a8{\v s} - \gdef^^b4{\v Z} - \gdef^^b8{\v z} - \gdef^^bc{\OE} - \gdef^^bd{\oe} - \gdef^^be{\"Y} + \gdefchar^^a4{\euro} + \gdefchar^^a6{\v S} + \gdefchar^^a8{\v s} + \gdefchar^^b4{\v Z} + \gdefchar^^b8{\v z} + \gdefchar^^bc{\OE} + \gdefchar^^bd{\oe} + \gdefchar^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% - \gdef^^a0{\tie} - \gdef^^a1{\ogonek{A}} - \gdef^^a2{\u{}} - \gdef^^a3{\L} - \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} - \gdef^^a5{\v L} - \gdef^^a6{\'S} - \gdef^^a7{\S} - \gdef^^a8{\"{}} - \gdef^^a9{\v S} - \gdef^^aa{\cedilla S} - \gdef^^ab{\v T} - \gdef^^ac{\'Z} - \gdef^^ad{\-} - \gdef^^ae{\v Z} - \gdef^^af{\dotaccent Z} - % - \gdef^^b0{\textdegree} - \gdef^^b1{\ogonek{a}} - \gdef^^b2{\ogonek{ }} - \gdef^^b3{\l} - \gdef^^b4{\'{}} - \gdef^^b5{\v l} - \gdef^^b6{\'s} - \gdef^^b7{\v{}} - \gdef^^b8{\cedilla\ } - \gdef^^b9{\v s} - \gdef^^ba{\cedilla s} - \gdef^^bb{\v t} - \gdef^^bc{\'z} - \gdef^^bd{\H{}} - \gdef^^be{\v z} - \gdef^^bf{\dotaccent z} - % - \gdef^^c0{\'R} - \gdef^^c1{\'A} - \gdef^^c2{\^A} - \gdef^^c3{\u A} - \gdef^^c4{\"A} - \gdef^^c5{\'L} - \gdef^^c6{\'C} - \gdef^^c7{\cedilla C} - \gdef^^c8{\v C} - \gdef^^c9{\'E} - \gdef^^ca{\ogonek{E}} - \gdef^^cb{\"E} - \gdef^^cc{\v E} - \gdef^^cd{\'I} - \gdef^^ce{\^I} - \gdef^^cf{\v D} - % - \gdef^^d0{\DH} - \gdef^^d1{\'N} - \gdef^^d2{\v N} - \gdef^^d3{\'O} - \gdef^^d4{\^O} - \gdef^^d5{\H O} - \gdef^^d6{\"O} - \gdef^^d7{$\times$} - \gdef^^d8{\v R} - \gdef^^d9{\ringaccent U} - \gdef^^da{\'U} - \gdef^^db{\H U} - \gdef^^dc{\"U} - \gdef^^dd{\'Y} - \gdef^^de{\cedilla T} - \gdef^^df{\ss} - % - \gdef^^e0{\'r} - \gdef^^e1{\'a} - \gdef^^e2{\^a} - \gdef^^e3{\u a} - \gdef^^e4{\"a} - \gdef^^e5{\'l} - \gdef^^e6{\'c} - \gdef^^e7{\cedilla c} - \gdef^^e8{\v c} - \gdef^^e9{\'e} - \gdef^^ea{\ogonek{e}} - \gdef^^eb{\"e} - \gdef^^ec{\v e} - \gdef^^ed{\'{\dotless{i}}} - \gdef^^ee{\^{\dotless{i}}} - \gdef^^ef{\v d} - % - \gdef^^f0{\dh} - \gdef^^f1{\'n} - \gdef^^f2{\v n} - \gdef^^f3{\'o} - \gdef^^f4{\^o} - \gdef^^f5{\H o} - \gdef^^f6{\"o} - \gdef^^f7{$\div$} - \gdef^^f8{\v r} - \gdef^^f9{\ringaccent u} - \gdef^^fa{\'u} - \gdef^^fb{\H u} - \gdef^^fc{\"u} - \gdef^^fd{\'y} - \gdef^^fe{\cedilla t} - \gdef^^ff{\dotaccent{}} + \gdefchar^^a0{\tie} + \gdefchar^^a1{\ogonek{A}} + \gdefchar^^a2{\u{}} + \gdefchar^^a3{\L} + \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}} + \gdefchar^^a5{\v L} + \gdefchar^^a6{\'S} + \gdefchar^^a7{\S} + \gdefchar^^a8{\"{}} + \gdefchar^^a9{\v S} + \gdefchar^^aa{\cedilla S} + \gdefchar^^ab{\v T} + \gdefchar^^ac{\'Z} + \gdefchar^^ad{\-} + \gdefchar^^ae{\v Z} + \gdefchar^^af{\dotaccent Z} + % + \gdefchar^^b0{\textdegree} + \gdefchar^^b1{\ogonek{a}} + \gdefchar^^b2{\ogonek{ }} + \gdefchar^^b3{\l} + \gdefchar^^b4{\'{}} + \gdefchar^^b5{\v l} + \gdefchar^^b6{\'s} + \gdefchar^^b7{\v{}} + \gdefchar^^b8{\cedilla\ } + \gdefchar^^b9{\v s} + \gdefchar^^ba{\cedilla s} + \gdefchar^^bb{\v t} + \gdefchar^^bc{\'z} + \gdefchar^^bd{\H{}} + \gdefchar^^be{\v z} + \gdefchar^^bf{\dotaccent z} + % + \gdefchar^^c0{\'R} + \gdefchar^^c1{\'A} + \gdefchar^^c2{\^A} + \gdefchar^^c3{\u A} + \gdefchar^^c4{\"A} + \gdefchar^^c5{\'L} + \gdefchar^^c6{\'C} + \gdefchar^^c7{\cedilla C} + \gdefchar^^c8{\v C} + \gdefchar^^c9{\'E} + \gdefchar^^ca{\ogonek{E}} + \gdefchar^^cb{\"E} + \gdefchar^^cc{\v E} + \gdefchar^^cd{\'I} + \gdefchar^^ce{\^I} + \gdefchar^^cf{\v D} + % + \gdefchar^^d0{\DH} + \gdefchar^^d1{\'N} + \gdefchar^^d2{\v N} + \gdefchar^^d3{\'O} + \gdefchar^^d4{\^O} + \gdefchar^^d5{\H O} + \gdefchar^^d6{\"O} + \gdefchar^^d7{$\times$} + \gdefchar^^d8{\v R} + \gdefchar^^d9{\ringaccent U} + \gdefchar^^da{\'U} + \gdefchar^^db{\H U} + \gdefchar^^dc{\"U} + \gdefchar^^dd{\'Y} + \gdefchar^^de{\cedilla T} + \gdefchar^^df{\ss} + % + \gdefchar^^e0{\'r} + \gdefchar^^e1{\'a} + \gdefchar^^e2{\^a} + \gdefchar^^e3{\u a} + \gdefchar^^e4{\"a} + \gdefchar^^e5{\'l} + \gdefchar^^e6{\'c} + \gdefchar^^e7{\cedilla c} + \gdefchar^^e8{\v c} + \gdefchar^^e9{\'e} + \gdefchar^^ea{\ogonek{e}} + \gdefchar^^eb{\"e} + \gdefchar^^ec{\v e} + \gdefchar^^ed{\'{\dotless{i}}} + \gdefchar^^ee{\^{\dotless{i}}} + \gdefchar^^ef{\v d} + % + \gdefchar^^f0{\dh} + \gdefchar^^f1{\'n} + \gdefchar^^f2{\v n} + \gdefchar^^f3{\'o} + \gdefchar^^f4{\^o} + \gdefchar^^f5{\H o} + \gdefchar^^f6{\"o} + \gdefchar^^f7{$\div$} + \gdefchar^^f8{\v r} + \gdefchar^^f9{\ringaccent u} + \gdefchar^^fa{\'u} + \gdefchar^^fb{\H u} + \gdefchar^^fc{\"u} + \gdefchar^^fd{\'y} + \gdefchar^^fe{\cedilla t} + \gdefchar^^ff{\dotaccent{}} } % UTF-8 character definitions. @@ -9134,38 +10204,84 @@ directory should work if nowhere else does.} \fi } +% Give non-ASCII bytes the active definitions for processing UTF-8 sequences \begingroup \catcode`\~13 + \catcode`\$12 \catcode`\"12 + % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp + % substituting ~ and $ with a character token of that value. \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx + \uccode`\$\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} + % For bytes other than the first in a UTF-8 sequence. Not expected to + % be expanded except when writing to auxiliary files. + \countUTFx = "80 + \countUTFy = "C2 + \def\UTFviiiTmp{% + \gdef~{ + \ifpassthroughchars $\fi}}% + \UTFviiiLoop + \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% - \xdef~{\noexpand\UTFviiiTwoOctets\string~}} + \gdef~{% + \ifpassthroughchars $% + \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}% \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% - \xdef~{\noexpand\UTFviiiThreeOctets\string~}} + \gdef~{% + \ifpassthroughchars $% + \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}% \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% - \xdef~{\noexpand\UTFviiiFourOctets\string~}} + \gdef~{% + \ifpassthroughchars $% + \else\expandafter\UTFviiiFourOctets\expandafter$\fi + }}% \UTFviiiLoop \endgroup +\def\globallet{\global\let} % save some \expandafter's below + +% @U{xxxx} to produce U+xxxx, if we support it. +\def\U#1{% + \expandafter\ifx\csname uni:#1\endcsname \relax + \iftxinativeunicodecapable + % Any Unicode characters can be used by native Unicode. + % However, if the font does not have the glyph, the letter will miss. + \begingroup + \uccode`\.="#1\relax + \uppercase{.} + \endgroup + \else + \errhelp = \EMsimple + \errmessage{Unicode character U+#1 not supported, sorry}% + \fi + \else + \csname uni:#1\endcsname + \fi +} + +% For UTF-8 byte sequence (TeX, e-TeX and pdfTeX) +% Definition macro to replace the Unicode character +% Definition macro that is used by @U command +% \begingroup \catcode`\"=12 \catcode`\<=12 @@ -9174,12 +10290,12 @@ directory should work if nowhere else does.} \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 - - \gdef\DeclareUnicodeCharacter#1#2{% + \gdef\DeclareUnicodeCharacterUTFviii#1#2{% \countUTFz = "#1\relax - %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref + % + % Access definitions of characters given UTF-8 sequences \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% @@ -9189,8 +10305,16 @@ directory should work if nowhere else does.} \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% + % + \expandafter\ifx\csname uni:#1\endcsname \relax \else + \message{Internal error, already defined: #1}% + \fi + % + % define an additional control sequence for this code point. + \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp \endgroup} - + % + % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp. \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple @@ -9220,413 +10344,777 @@ directory should work if nowhere else does.} \uccode `#1\countUTFx \countUTFz = \countUTFy} + % Used to set \UTFviiiTmp to a UTF-8 byte sequence \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup +% For native Unicode (XeTeX and LuaTeX) +% Definition macro that is set catcode other non global +% +\def\DeclareUnicodeCharacterNativeOther#1#2{% + \catcode"#1=\other +} + +% https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M +% U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block) +% U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block) +% U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A +% U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B +% +% Many of our renditions are less than wonderful, and all the missing +% characters are available somewhere. Loading the necessary fonts +% awaits user request. We can't truly support Unicode without +% reimplementing everything that's been done in LaTeX for many years, +% plus probably using luatex or xetex, and who knows what else. +% We won't be doing that here in this simple file. But we can try to at +% least make most of the characters not bomb out. +% +\def\unicodechardefs{% + \DeclareUnicodeCharacter{00A0}{\tie}% + \DeclareUnicodeCharacter{00A1}{\exclamdown}% + \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent + \DeclareUnicodeCharacter{00A3}{\pounds}% + \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency + \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen + \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar + \DeclareUnicodeCharacter{00A7}{\S}% + \DeclareUnicodeCharacter{00A8}{\"{ }}% + \DeclareUnicodeCharacter{00A9}{\copyright}% + \DeclareUnicodeCharacter{00AA}{\ordf}% + \DeclareUnicodeCharacter{00AB}{\guillemetleft}% + \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}% + \DeclareUnicodeCharacter{00AD}{\-}% + \DeclareUnicodeCharacter{00AE}{\registeredsymbol}% + \DeclareUnicodeCharacter{00AF}{\={ }}% + % + \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}% + \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}% + \DeclareUnicodeCharacter{00B2}{$^2$}% + \DeclareUnicodeCharacter{00B3}{$^3$}% + \DeclareUnicodeCharacter{00B4}{\'{ }}% + \DeclareUnicodeCharacter{00B5}{$\mu$}% + \DeclareUnicodeCharacter{00B6}{\P}% + \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}% + \DeclareUnicodeCharacter{00B8}{\cedilla{ }}% + \DeclareUnicodeCharacter{00B9}{$^1$}% + \DeclareUnicodeCharacter{00BA}{\ordm}% + \DeclareUnicodeCharacter{00BB}{\guillemetright}% + \DeclareUnicodeCharacter{00BC}{$1\over4$}% + \DeclareUnicodeCharacter{00BD}{$1\over2$}% + \DeclareUnicodeCharacter{00BE}{$3\over4$}% + \DeclareUnicodeCharacter{00BF}{\questiondown}% + % + \DeclareUnicodeCharacter{00C0}{\`A}% + \DeclareUnicodeCharacter{00C1}{\'A}% + \DeclareUnicodeCharacter{00C2}{\^A}% + \DeclareUnicodeCharacter{00C3}{\~A}% + \DeclareUnicodeCharacter{00C4}{\"A}% + \DeclareUnicodeCharacter{00C5}{\AA}% + \DeclareUnicodeCharacter{00C6}{\AE}% + \DeclareUnicodeCharacter{00C7}{\cedilla{C}}% + \DeclareUnicodeCharacter{00C8}{\`E}% + \DeclareUnicodeCharacter{00C9}{\'E}% + \DeclareUnicodeCharacter{00CA}{\^E}% + \DeclareUnicodeCharacter{00CB}{\"E}% + \DeclareUnicodeCharacter{00CC}{\`I}% + \DeclareUnicodeCharacter{00CD}{\'I}% + \DeclareUnicodeCharacter{00CE}{\^I}% + \DeclareUnicodeCharacter{00CF}{\"I}% + % + \DeclareUnicodeCharacter{00D0}{\DH}% + \DeclareUnicodeCharacter{00D1}{\~N}% + \DeclareUnicodeCharacter{00D2}{\`O}% + \DeclareUnicodeCharacter{00D3}{\'O}% + \DeclareUnicodeCharacter{00D4}{\^O}% + \DeclareUnicodeCharacter{00D5}{\~O}% + \DeclareUnicodeCharacter{00D6}{\"O}% + \DeclareUnicodeCharacter{00D7}{\ensuremath\times}% + \DeclareUnicodeCharacter{00D8}{\O}% + \DeclareUnicodeCharacter{00D9}{\`U}% + \DeclareUnicodeCharacter{00DA}{\'U}% + \DeclareUnicodeCharacter{00DB}{\^U}% + \DeclareUnicodeCharacter{00DC}{\"U}% + \DeclareUnicodeCharacter{00DD}{\'Y}% + \DeclareUnicodeCharacter{00DE}{\TH}% + \DeclareUnicodeCharacter{00DF}{\ss}% + % + \DeclareUnicodeCharacter{00E0}{\`a}% + \DeclareUnicodeCharacter{00E1}{\'a}% + \DeclareUnicodeCharacter{00E2}{\^a}% + \DeclareUnicodeCharacter{00E3}{\~a}% + \DeclareUnicodeCharacter{00E4}{\"a}% + \DeclareUnicodeCharacter{00E5}{\aa}% + \DeclareUnicodeCharacter{00E6}{\ae}% + \DeclareUnicodeCharacter{00E7}{\cedilla{c}}% + \DeclareUnicodeCharacter{00E8}{\`e}% + \DeclareUnicodeCharacter{00E9}{\'e}% + \DeclareUnicodeCharacter{00EA}{\^e}% + \DeclareUnicodeCharacter{00EB}{\"e}% + \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}% + \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}% + \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}% + \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}% + % + \DeclareUnicodeCharacter{00F0}{\dh}% + \DeclareUnicodeCharacter{00F1}{\~n}% + \DeclareUnicodeCharacter{00F2}{\`o}% + \DeclareUnicodeCharacter{00F3}{\'o}% + \DeclareUnicodeCharacter{00F4}{\^o}% + \DeclareUnicodeCharacter{00F5}{\~o}% + \DeclareUnicodeCharacter{00F6}{\"o}% + \DeclareUnicodeCharacter{00F7}{\ensuremath\div}% + \DeclareUnicodeCharacter{00F8}{\o}% + \DeclareUnicodeCharacter{00F9}{\`u}% + \DeclareUnicodeCharacter{00FA}{\'u}% + \DeclareUnicodeCharacter{00FB}{\^u}% + \DeclareUnicodeCharacter{00FC}{\"u}% + \DeclareUnicodeCharacter{00FD}{\'y}% + \DeclareUnicodeCharacter{00FE}{\th}% + \DeclareUnicodeCharacter{00FF}{\"y}% + % + \DeclareUnicodeCharacter{0100}{\=A}% + \DeclareUnicodeCharacter{0101}{\=a}% + \DeclareUnicodeCharacter{0102}{\u{A}}% + \DeclareUnicodeCharacter{0103}{\u{a}}% + \DeclareUnicodeCharacter{0104}{\ogonek{A}}% + \DeclareUnicodeCharacter{0105}{\ogonek{a}}% + \DeclareUnicodeCharacter{0106}{\'C}% + \DeclareUnicodeCharacter{0107}{\'c}% + \DeclareUnicodeCharacter{0108}{\^C}% + \DeclareUnicodeCharacter{0109}{\^c}% + \DeclareUnicodeCharacter{010A}{\dotaccent{C}}% + \DeclareUnicodeCharacter{010B}{\dotaccent{c}}% + \DeclareUnicodeCharacter{010C}{\v{C}}% + \DeclareUnicodeCharacter{010D}{\v{c}}% + \DeclareUnicodeCharacter{010E}{\v{D}}% + \DeclareUnicodeCharacter{010F}{d'}% + % + \DeclareUnicodeCharacter{0110}{\DH}% + \DeclareUnicodeCharacter{0111}{\dh}% + \DeclareUnicodeCharacter{0112}{\=E}% + \DeclareUnicodeCharacter{0113}{\=e}% + \DeclareUnicodeCharacter{0114}{\u{E}}% + \DeclareUnicodeCharacter{0115}{\u{e}}% + \DeclareUnicodeCharacter{0116}{\dotaccent{E}}% + \DeclareUnicodeCharacter{0117}{\dotaccent{e}}% + \DeclareUnicodeCharacter{0118}{\ogonek{E}}% + \DeclareUnicodeCharacter{0119}{\ogonek{e}}% + \DeclareUnicodeCharacter{011A}{\v{E}}% + \DeclareUnicodeCharacter{011B}{\v{e}}% + \DeclareUnicodeCharacter{011C}{\^G}% + \DeclareUnicodeCharacter{011D}{\^g}% + \DeclareUnicodeCharacter{011E}{\u{G}}% + \DeclareUnicodeCharacter{011F}{\u{g}}% + % + \DeclareUnicodeCharacter{0120}{\dotaccent{G}}% + \DeclareUnicodeCharacter{0121}{\dotaccent{g}}% + \DeclareUnicodeCharacter{0122}{\cedilla{G}}% + \DeclareUnicodeCharacter{0123}{\cedilla{g}}% + \DeclareUnicodeCharacter{0124}{\^H}% + \DeclareUnicodeCharacter{0125}{\^h}% + \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}% + \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}% + \DeclareUnicodeCharacter{0128}{\~I}% + \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}% + \DeclareUnicodeCharacter{012A}{\=I}% + \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}% + \DeclareUnicodeCharacter{012C}{\u{I}}% + \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}% + \DeclareUnicodeCharacter{012E}{\ogonek{I}}% + \DeclareUnicodeCharacter{012F}{\ogonek{i}}% + % + \DeclareUnicodeCharacter{0130}{\dotaccent{I}}% + \DeclareUnicodeCharacter{0131}{\dotless{i}}% + \DeclareUnicodeCharacter{0132}{IJ}% + \DeclareUnicodeCharacter{0133}{ij}% + \DeclareUnicodeCharacter{0134}{\^J}% + \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}% + \DeclareUnicodeCharacter{0136}{\cedilla{K}}% + \DeclareUnicodeCharacter{0137}{\cedilla{k}}% + \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}% + \DeclareUnicodeCharacter{0139}{\'L}% + \DeclareUnicodeCharacter{013A}{\'l}% + \DeclareUnicodeCharacter{013B}{\cedilla{L}}% + \DeclareUnicodeCharacter{013C}{\cedilla{l}}% + \DeclareUnicodeCharacter{013D}{L'}% should kern + \DeclareUnicodeCharacter{013E}{l'}% should kern + \DeclareUnicodeCharacter{013F}{L\U{00B7}}% + % + \DeclareUnicodeCharacter{0140}{l\U{00B7}}% + \DeclareUnicodeCharacter{0141}{\L}% + \DeclareUnicodeCharacter{0142}{\l}% + \DeclareUnicodeCharacter{0143}{\'N}% + \DeclareUnicodeCharacter{0144}{\'n}% + \DeclareUnicodeCharacter{0145}{\cedilla{N}}% + \DeclareUnicodeCharacter{0146}{\cedilla{n}}% + \DeclareUnicodeCharacter{0147}{\v{N}}% + \DeclareUnicodeCharacter{0148}{\v{n}}% + \DeclareUnicodeCharacter{0149}{'n}% + \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}% + \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}% + \DeclareUnicodeCharacter{014C}{\=O}% + \DeclareUnicodeCharacter{014D}{\=o}% + \DeclareUnicodeCharacter{014E}{\u{O}}% + \DeclareUnicodeCharacter{014F}{\u{o}}% + % + \DeclareUnicodeCharacter{0150}{\H{O}}% + \DeclareUnicodeCharacter{0151}{\H{o}}% + \DeclareUnicodeCharacter{0152}{\OE}% + \DeclareUnicodeCharacter{0153}{\oe}% + \DeclareUnicodeCharacter{0154}{\'R}% + \DeclareUnicodeCharacter{0155}{\'r}% + \DeclareUnicodeCharacter{0156}{\cedilla{R}}% + \DeclareUnicodeCharacter{0157}{\cedilla{r}}% + \DeclareUnicodeCharacter{0158}{\v{R}}% + \DeclareUnicodeCharacter{0159}{\v{r}}% + \DeclareUnicodeCharacter{015A}{\'S}% + \DeclareUnicodeCharacter{015B}{\'s}% + \DeclareUnicodeCharacter{015C}{\^S}% + \DeclareUnicodeCharacter{015D}{\^s}% + \DeclareUnicodeCharacter{015E}{\cedilla{S}}% + \DeclareUnicodeCharacter{015F}{\cedilla{s}}% + % + \DeclareUnicodeCharacter{0160}{\v{S}}% + \DeclareUnicodeCharacter{0161}{\v{s}}% + \DeclareUnicodeCharacter{0162}{\cedilla{T}}% + \DeclareUnicodeCharacter{0163}{\cedilla{t}}% + \DeclareUnicodeCharacter{0164}{\v{T}}% + \DeclareUnicodeCharacter{0165}{\v{t}}% + \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}% + \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}% + \DeclareUnicodeCharacter{0168}{\~U}% + \DeclareUnicodeCharacter{0169}{\~u}% + \DeclareUnicodeCharacter{016A}{\=U}% + \DeclareUnicodeCharacter{016B}{\=u}% + \DeclareUnicodeCharacter{016C}{\u{U}}% + \DeclareUnicodeCharacter{016D}{\u{u}}% + \DeclareUnicodeCharacter{016E}{\ringaccent{U}}% + \DeclareUnicodeCharacter{016F}{\ringaccent{u}}% + % + \DeclareUnicodeCharacter{0170}{\H{U}}% + \DeclareUnicodeCharacter{0171}{\H{u}}% + \DeclareUnicodeCharacter{0172}{\ogonek{U}}% + \DeclareUnicodeCharacter{0173}{\ogonek{u}}% + \DeclareUnicodeCharacter{0174}{\^W}% + \DeclareUnicodeCharacter{0175}{\^w}% + \DeclareUnicodeCharacter{0176}{\^Y}% + \DeclareUnicodeCharacter{0177}{\^y}% + \DeclareUnicodeCharacter{0178}{\"Y}% + \DeclareUnicodeCharacter{0179}{\'Z}% + \DeclareUnicodeCharacter{017A}{\'z}% + \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}% + \DeclareUnicodeCharacter{017C}{\dotaccent{z}}% + \DeclareUnicodeCharacter{017D}{\v{Z}}% + \DeclareUnicodeCharacter{017E}{\v{z}}% + \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}% + % + \DeclareUnicodeCharacter{01C4}{D\v{Z}}% + \DeclareUnicodeCharacter{01C5}{D\v{z}}% + \DeclareUnicodeCharacter{01C6}{d\v{z}}% + \DeclareUnicodeCharacter{01C7}{LJ}% + \DeclareUnicodeCharacter{01C8}{Lj}% + \DeclareUnicodeCharacter{01C9}{lj}% + \DeclareUnicodeCharacter{01CA}{NJ}% + \DeclareUnicodeCharacter{01CB}{Nj}% + \DeclareUnicodeCharacter{01CC}{nj}% + \DeclareUnicodeCharacter{01CD}{\v{A}}% + \DeclareUnicodeCharacter{01CE}{\v{a}}% + \DeclareUnicodeCharacter{01CF}{\v{I}}% + % + \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}% + \DeclareUnicodeCharacter{01D1}{\v{O}}% + \DeclareUnicodeCharacter{01D2}{\v{o}}% + \DeclareUnicodeCharacter{01D3}{\v{U}}% + \DeclareUnicodeCharacter{01D4}{\v{u}}% + % + \DeclareUnicodeCharacter{01E2}{\={\AE}}% + \DeclareUnicodeCharacter{01E3}{\={\ae}}% + \DeclareUnicodeCharacter{01E6}{\v{G}}% + \DeclareUnicodeCharacter{01E7}{\v{g}}% + \DeclareUnicodeCharacter{01E8}{\v{K}}% + \DeclareUnicodeCharacter{01E9}{\v{k}}% + % + \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}% + \DeclareUnicodeCharacter{01F1}{DZ}% + \DeclareUnicodeCharacter{01F2}{Dz}% + \DeclareUnicodeCharacter{01F3}{dz}% + \DeclareUnicodeCharacter{01F4}{\'G}% + \DeclareUnicodeCharacter{01F5}{\'g}% + \DeclareUnicodeCharacter{01F8}{\`N}% + \DeclareUnicodeCharacter{01F9}{\`n}% + \DeclareUnicodeCharacter{01FC}{\'{\AE}}% + \DeclareUnicodeCharacter{01FD}{\'{\ae}}% + \DeclareUnicodeCharacter{01FE}{\'{\O}}% + \DeclareUnicodeCharacter{01FF}{\'{\o}}% + % + \DeclareUnicodeCharacter{021E}{\v{H}}% + \DeclareUnicodeCharacter{021F}{\v{h}}% + % + \DeclareUnicodeCharacter{0226}{\dotaccent{A}}% + \DeclareUnicodeCharacter{0227}{\dotaccent{a}}% + \DeclareUnicodeCharacter{0228}{\cedilla{E}}% + \DeclareUnicodeCharacter{0229}{\cedilla{e}}% + \DeclareUnicodeCharacter{022E}{\dotaccent{O}}% + \DeclareUnicodeCharacter{022F}{\dotaccent{o}}% + % + \DeclareUnicodeCharacter{0232}{\=Y}% + \DeclareUnicodeCharacter{0233}{\=y}% + \DeclareUnicodeCharacter{0237}{\dotless{j}}% + % + \DeclareUnicodeCharacter{02DB}{\ogonek{ }}% + % + % Greek letters upper case + \DeclareUnicodeCharacter{0391}{{\it A}}% + \DeclareUnicodeCharacter{0392}{{\it B}}% + \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}% + \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}% + \DeclareUnicodeCharacter{0395}{{\it E}}% + \DeclareUnicodeCharacter{0396}{{\it Z}}% + \DeclareUnicodeCharacter{0397}{{\it H}}% + \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}% + \DeclareUnicodeCharacter{0399}{{\it I}}% + \DeclareUnicodeCharacter{039A}{{\it K}}% + \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}% + \DeclareUnicodeCharacter{039C}{{\it M}}% + \DeclareUnicodeCharacter{039D}{{\it N}}% + \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}% + \DeclareUnicodeCharacter{039F}{{\it O}}% + \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}% + \DeclareUnicodeCharacter{03A1}{{\it P}}% + %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma + \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}% + \DeclareUnicodeCharacter{03A4}{{\it T}}% + \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}% + \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}% + \DeclareUnicodeCharacter{03A7}{{\it X}}% + \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}% + \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}% + % + % Vowels with accents + \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}% + \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}% + \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}% + \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}% + \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}% + \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}% + % + % Standalone accent + \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}% + % + % Greek letters lower case + \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}% + \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}% + \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}% + \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}% + \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}% + \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}% + \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}% + \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}% + \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}% + \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}% + \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}% + \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}% + \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}% + \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}% + \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron + \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}% + \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}% + \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}% + \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}% + \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}% + \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}% + \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}% + \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}% + \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}% + \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}% + % + % More Greek vowels with accents + \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}% + \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}% + \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}% + \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}% + \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}% + % + % Variant Greek letters + \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}% + \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}% + \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}% + % + \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}% + \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}% + \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}% + \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}% + \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}% + \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}% + \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}% + \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}% + \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}% + \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}% + \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}% + \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}% + % + \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}% + \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}% + % + \DeclareUnicodeCharacter{1E20}{\=G}% + \DeclareUnicodeCharacter{1E21}{\=g}% + \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}% + \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}% + \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}% + \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}% + \DeclareUnicodeCharacter{1E26}{\"H}% + \DeclareUnicodeCharacter{1E27}{\"h}% + % + \DeclareUnicodeCharacter{1E30}{\'K}% + \DeclareUnicodeCharacter{1E31}{\'k}% + \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}% + \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}% + \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}% + \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}% + \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}% + \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}% + \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}% + \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}% + \DeclareUnicodeCharacter{1E3E}{\'M}% + \DeclareUnicodeCharacter{1E3F}{\'m}% + % + \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}% + \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}% + \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}% + \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}% + \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}% + \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}% + \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}% + \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}% + \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}% + \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}% + % + \DeclareUnicodeCharacter{1E54}{\'P}% + \DeclareUnicodeCharacter{1E55}{\'p}% + \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}% + \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}% + \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}% + \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}% + \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}% + \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}% + \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}% + \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}% + % + \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}% + \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}% + \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}% + \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}% + \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}% + \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}% + \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}% + \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}% + \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}% + \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}% + % + \DeclareUnicodeCharacter{1E7C}{\~V}% + \DeclareUnicodeCharacter{1E7D}{\~v}% + \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}% + \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}% + % + \DeclareUnicodeCharacter{1E80}{\`W}% + \DeclareUnicodeCharacter{1E81}{\`w}% + \DeclareUnicodeCharacter{1E82}{\'W}% + \DeclareUnicodeCharacter{1E83}{\'w}% + \DeclareUnicodeCharacter{1E84}{\"W}% + \DeclareUnicodeCharacter{1E85}{\"w}% + \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}% + \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}% + \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}% + \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}% + \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}% + \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}% + \DeclareUnicodeCharacter{1E8C}{\"X}% + \DeclareUnicodeCharacter{1E8D}{\"x}% + \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}% + \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}% + % + \DeclareUnicodeCharacter{1E90}{\^Z}% + \DeclareUnicodeCharacter{1E91}{\^z}% + \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}% + \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}% + \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}% + \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}% + \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}% + \DeclareUnicodeCharacter{1E97}{\"t}% + \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}% + \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}% + % + \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}% + \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}% + % + \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}% + \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}% + \DeclareUnicodeCharacter{1EBC}{\~E}% + \DeclareUnicodeCharacter{1EBD}{\~e}% + % + \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}% + \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}% + \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}% + \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}% + % + \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}% + \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}% + % + \DeclareUnicodeCharacter{1EF2}{\`Y}% + \DeclareUnicodeCharacter{1EF3}{\`y}% + \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}% + % + \DeclareUnicodeCharacter{1EF8}{\~Y}% + \DeclareUnicodeCharacter{1EF9}{\~y}% + % + % Punctuation + \DeclareUnicodeCharacter{2013}{--}% + \DeclareUnicodeCharacter{2014}{---}% + \DeclareUnicodeCharacter{2018}{\quoteleft}% + \DeclareUnicodeCharacter{2019}{\quoteright}% + \DeclareUnicodeCharacter{201A}{\quotesinglbase}% + \DeclareUnicodeCharacter{201C}{\quotedblleft}% + \DeclareUnicodeCharacter{201D}{\quotedblright}% + \DeclareUnicodeCharacter{201E}{\quotedblbase}% + \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}% + \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}% + \DeclareUnicodeCharacter{2022}{\bullet}% + \DeclareUnicodeCharacter{202F}{\thinspace}% + \DeclareUnicodeCharacter{2026}{\dots}% + \DeclareUnicodeCharacter{2039}{\guilsinglleft}% + \DeclareUnicodeCharacter{203A}{\guilsinglright}% + % + \DeclareUnicodeCharacter{20AC}{\euro}% + % + \DeclareUnicodeCharacter{2192}{\expansion}% + \DeclareUnicodeCharacter{21D2}{\result}% + % + % Mathematical symbols + \DeclareUnicodeCharacter{2200}{\ensuremath\forall}% + \DeclareUnicodeCharacter{2203}{\ensuremath\exists}% + \DeclareUnicodeCharacter{2208}{\ensuremath\in}% + \DeclareUnicodeCharacter{2212}{\minus}% + \DeclareUnicodeCharacter{2217}{\ast}% + \DeclareUnicodeCharacter{221E}{\ensuremath\infty}% + \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}% + \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}% + \DeclareUnicodeCharacter{2229}{\ensuremath\cap}% + \DeclareUnicodeCharacter{2261}{\equiv}% + \DeclareUnicodeCharacter{2264}{\ensuremath\leq}% + \DeclareUnicodeCharacter{2265}{\ensuremath\geq}% + \DeclareUnicodeCharacter{2282}{\ensuremath\subset}% + \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}% + % + \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}% + \DeclareUnicodeCharacter{2032}{\ensuremath\prime}% + \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}% + \DeclareUnicodeCharacter{2111}{\ensuremath\Im}% + \DeclareUnicodeCharacter{2113}{\ensuremath\ell}% + \DeclareUnicodeCharacter{2118}{\ensuremath\wp}% + \DeclareUnicodeCharacter{211C}{\ensuremath\Re}% + \DeclareUnicodeCharacter{2127}{\ensuremath\mho}% + \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}% + \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}% + \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}% + \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}% + \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}% + \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}% + \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}% + \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}% + \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}% + \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}% + \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}% + \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}% + \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}% + \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}% + \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}% + \DeclareUnicodeCharacter{21BE}{\ensuremath\upharpoonright}% + \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}% + \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}% + \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}% + \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}% + \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}% + \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}% + \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}% + \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}% + \DeclareUnicodeCharacter{21DD}{\ensuremath\leadsto}% + \DeclareUnicodeCharacter{2201}{\ensuremath\complement}% + \DeclareUnicodeCharacter{2202}{\ensuremath\partial}% + \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}% + \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}% + \DeclareUnicodeCharacter{2209}{\ensuremath\notin}% + \DeclareUnicodeCharacter{220B}{\ensuremath\owns}% + \DeclareUnicodeCharacter{220F}{\ensuremath\prod}% + \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}% + \DeclareUnicodeCharacter{2211}{\ensuremath\sum}% + \DeclareUnicodeCharacter{2213}{\ensuremath\mp}% + \DeclareUnicodeCharacter{2218}{\ensuremath\circ}% + \DeclareUnicodeCharacter{221A}{\ensuremath\surd}% + \DeclareUnicodeCharacter{221D}{\ensuremath\propto}% + \DeclareUnicodeCharacter{2220}{\ensuremath\angle}% + \DeclareUnicodeCharacter{2223}{\ensuremath\mid}% + \DeclareUnicodeCharacter{2228}{\ensuremath\vee}% + \DeclareUnicodeCharacter{222A}{\ensuremath\cup}% + \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}% + \DeclareUnicodeCharacter{222E}{\ensuremath\oint}% + \DeclareUnicodeCharacter{223C}{\ensuremath\sim}% + \DeclareUnicodeCharacter{2240}{\ensuremath\wr}% + \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}% + \DeclareUnicodeCharacter{2245}{\ensuremath\cong}% + \DeclareUnicodeCharacter{2248}{\ensuremath\approx}% + \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}% + \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}% + \DeclareUnicodeCharacter{2260}{\ensuremath\neq}% + \DeclareUnicodeCharacter{226A}{\ensuremath\ll}% + \DeclareUnicodeCharacter{226B}{\ensuremath\gg}% + \DeclareUnicodeCharacter{227A}{\ensuremath\prec}% + \DeclareUnicodeCharacter{227B}{\ensuremath\succ}% + \DeclareUnicodeCharacter{2283}{\ensuremath\supset}% + \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}% + \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}% + \DeclareUnicodeCharacter{228F}{\ensuremath\sqsubset}% + \DeclareUnicodeCharacter{2290}{\ensuremath\sqsupset}% + \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}% + \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}% + \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}% + \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}% + \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}% + \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}% + \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}% + \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}% + \DeclareUnicodeCharacter{2299}{\ensuremath\odot}% + \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}% + \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}% + \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}% + \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}% + \DeclareUnicodeCharacter{22A8}{\ensuremath\models}% + \DeclareUnicodeCharacter{22B4}{\ensuremath\unlhd}% + \DeclareUnicodeCharacter{22B5}{\ensuremath\unrhd}% + \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}% + \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}% + \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}% + \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}% + \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}% + \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}% + \DeclareUnicodeCharacter{22C6}{\ensuremath\star}% + \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}% + \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}% + \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}% + \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}% + \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}% + \DeclareUnicodeCharacter{2322}{\ensuremath\frown}% + \DeclareUnicodeCharacter{2323}{\ensuremath\smile}% + % + \DeclareUnicodeCharacter{25A1}{\ensuremath\Box}% + \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}% + \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}% + \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}% + \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}% + \DeclareUnicodeCharacter{25C7}{\ensuremath\Diamond}% + \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}% + \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}% + \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}% + \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}% + \DeclareUnicodeCharacter{266D}{\ensuremath\flat}% + \DeclareUnicodeCharacter{266E}{\ensuremath\natural}% + \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}% + \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}% + \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}% + \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}% + \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}% + \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}% + \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}% + \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}% + \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}% + \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}% + \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}% + \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}% + \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}% + \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}% + \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}% + \DeclareUnicodeCharacter{2A1D}{\ensuremath\Join}% + \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}% + \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}% + \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}% + % + \global\mathchardef\checkmark="1370% actually the square root sign + \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}% +}% end of \unicodechardefs + +% UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command) +% It makes the setting that replace UTF-8 byte sequence. \def\utfeightchardefs{% - \DeclareUnicodeCharacter{00A0}{\tie} - \DeclareUnicodeCharacter{00A1}{\exclamdown} - \DeclareUnicodeCharacter{00A3}{\pounds} - \DeclareUnicodeCharacter{00A8}{\"{ }} - \DeclareUnicodeCharacter{00A9}{\copyright} - \DeclareUnicodeCharacter{00AA}{\ordf} - \DeclareUnicodeCharacter{00AB}{\guillemetleft} - \DeclareUnicodeCharacter{00AD}{\-} - \DeclareUnicodeCharacter{00AE}{\registeredsymbol} - \DeclareUnicodeCharacter{00AF}{\={ }} - - \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} - \DeclareUnicodeCharacter{00B4}{\'{ }} - \DeclareUnicodeCharacter{00B8}{\cedilla{ }} - \DeclareUnicodeCharacter{00BA}{\ordm} - \DeclareUnicodeCharacter{00BB}{\guillemetright} - \DeclareUnicodeCharacter{00BF}{\questiondown} - - \DeclareUnicodeCharacter{00C0}{\`A} - \DeclareUnicodeCharacter{00C1}{\'A} - \DeclareUnicodeCharacter{00C2}{\^A} - \DeclareUnicodeCharacter{00C3}{\~A} - \DeclareUnicodeCharacter{00C4}{\"A} - \DeclareUnicodeCharacter{00C5}{\AA} - \DeclareUnicodeCharacter{00C6}{\AE} - \DeclareUnicodeCharacter{00C7}{\cedilla{C}} - \DeclareUnicodeCharacter{00C8}{\`E} - \DeclareUnicodeCharacter{00C9}{\'E} - \DeclareUnicodeCharacter{00CA}{\^E} - \DeclareUnicodeCharacter{00CB}{\"E} - \DeclareUnicodeCharacter{00CC}{\`I} - \DeclareUnicodeCharacter{00CD}{\'I} - \DeclareUnicodeCharacter{00CE}{\^I} - \DeclareUnicodeCharacter{00CF}{\"I} - - \DeclareUnicodeCharacter{00D0}{\DH} - \DeclareUnicodeCharacter{00D1}{\~N} - \DeclareUnicodeCharacter{00D2}{\`O} - \DeclareUnicodeCharacter{00D3}{\'O} - \DeclareUnicodeCharacter{00D4}{\^O} - \DeclareUnicodeCharacter{00D5}{\~O} - \DeclareUnicodeCharacter{00D6}{\"O} - \DeclareUnicodeCharacter{00D8}{\O} - \DeclareUnicodeCharacter{00D9}{\`U} - \DeclareUnicodeCharacter{00DA}{\'U} - \DeclareUnicodeCharacter{00DB}{\^U} - \DeclareUnicodeCharacter{00DC}{\"U} - \DeclareUnicodeCharacter{00DD}{\'Y} - \DeclareUnicodeCharacter{00DE}{\TH} - \DeclareUnicodeCharacter{00DF}{\ss} - - \DeclareUnicodeCharacter{00E0}{\`a} - \DeclareUnicodeCharacter{00E1}{\'a} - \DeclareUnicodeCharacter{00E2}{\^a} - \DeclareUnicodeCharacter{00E3}{\~a} - \DeclareUnicodeCharacter{00E4}{\"a} - \DeclareUnicodeCharacter{00E5}{\aa} - \DeclareUnicodeCharacter{00E6}{\ae} - \DeclareUnicodeCharacter{00E7}{\cedilla{c}} - \DeclareUnicodeCharacter{00E8}{\`e} - \DeclareUnicodeCharacter{00E9}{\'e} - \DeclareUnicodeCharacter{00EA}{\^e} - \DeclareUnicodeCharacter{00EB}{\"e} - \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} - \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} - \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} - \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} - - \DeclareUnicodeCharacter{00F0}{\dh} - \DeclareUnicodeCharacter{00F1}{\~n} - \DeclareUnicodeCharacter{00F2}{\`o} - \DeclareUnicodeCharacter{00F3}{\'o} - \DeclareUnicodeCharacter{00F4}{\^o} - \DeclareUnicodeCharacter{00F5}{\~o} - \DeclareUnicodeCharacter{00F6}{\"o} - \DeclareUnicodeCharacter{00F8}{\o} - \DeclareUnicodeCharacter{00F9}{\`u} - \DeclareUnicodeCharacter{00FA}{\'u} - \DeclareUnicodeCharacter{00FB}{\^u} - \DeclareUnicodeCharacter{00FC}{\"u} - \DeclareUnicodeCharacter{00FD}{\'y} - \DeclareUnicodeCharacter{00FE}{\th} - \DeclareUnicodeCharacter{00FF}{\"y} - - \DeclareUnicodeCharacter{0100}{\=A} - \DeclareUnicodeCharacter{0101}{\=a} - \DeclareUnicodeCharacter{0102}{\u{A}} - \DeclareUnicodeCharacter{0103}{\u{a}} - \DeclareUnicodeCharacter{0104}{\ogonek{A}} - \DeclareUnicodeCharacter{0105}{\ogonek{a}} - \DeclareUnicodeCharacter{0106}{\'C} - \DeclareUnicodeCharacter{0107}{\'c} - \DeclareUnicodeCharacter{0108}{\^C} - \DeclareUnicodeCharacter{0109}{\^c} - \DeclareUnicodeCharacter{0118}{\ogonek{E}} - \DeclareUnicodeCharacter{0119}{\ogonek{e}} - \DeclareUnicodeCharacter{010A}{\dotaccent{C}} - \DeclareUnicodeCharacter{010B}{\dotaccent{c}} - \DeclareUnicodeCharacter{010C}{\v{C}} - \DeclareUnicodeCharacter{010D}{\v{c}} - \DeclareUnicodeCharacter{010E}{\v{D}} - - \DeclareUnicodeCharacter{0112}{\=E} - \DeclareUnicodeCharacter{0113}{\=e} - \DeclareUnicodeCharacter{0114}{\u{E}} - \DeclareUnicodeCharacter{0115}{\u{e}} - \DeclareUnicodeCharacter{0116}{\dotaccent{E}} - \DeclareUnicodeCharacter{0117}{\dotaccent{e}} - \DeclareUnicodeCharacter{011A}{\v{E}} - \DeclareUnicodeCharacter{011B}{\v{e}} - \DeclareUnicodeCharacter{011C}{\^G} - \DeclareUnicodeCharacter{011D}{\^g} - \DeclareUnicodeCharacter{011E}{\u{G}} - \DeclareUnicodeCharacter{011F}{\u{g}} - - \DeclareUnicodeCharacter{0120}{\dotaccent{G}} - \DeclareUnicodeCharacter{0121}{\dotaccent{g}} - \DeclareUnicodeCharacter{0124}{\^H} - \DeclareUnicodeCharacter{0125}{\^h} - \DeclareUnicodeCharacter{0128}{\~I} - \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} - \DeclareUnicodeCharacter{012A}{\=I} - \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} - \DeclareUnicodeCharacter{012C}{\u{I}} - \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} - - \DeclareUnicodeCharacter{0130}{\dotaccent{I}} - \DeclareUnicodeCharacter{0131}{\dotless{i}} - \DeclareUnicodeCharacter{0132}{IJ} - \DeclareUnicodeCharacter{0133}{ij} - \DeclareUnicodeCharacter{0134}{\^J} - \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} - \DeclareUnicodeCharacter{0139}{\'L} - \DeclareUnicodeCharacter{013A}{\'l} - - \DeclareUnicodeCharacter{0141}{\L} - \DeclareUnicodeCharacter{0142}{\l} - \DeclareUnicodeCharacter{0143}{\'N} - \DeclareUnicodeCharacter{0144}{\'n} - \DeclareUnicodeCharacter{0147}{\v{N}} - \DeclareUnicodeCharacter{0148}{\v{n}} - \DeclareUnicodeCharacter{014C}{\=O} - \DeclareUnicodeCharacter{014D}{\=o} - \DeclareUnicodeCharacter{014E}{\u{O}} - \DeclareUnicodeCharacter{014F}{\u{o}} - - \DeclareUnicodeCharacter{0150}{\H{O}} - \DeclareUnicodeCharacter{0151}{\H{o}} - \DeclareUnicodeCharacter{0152}{\OE} - \DeclareUnicodeCharacter{0153}{\oe} - \DeclareUnicodeCharacter{0154}{\'R} - \DeclareUnicodeCharacter{0155}{\'r} - \DeclareUnicodeCharacter{0158}{\v{R}} - \DeclareUnicodeCharacter{0159}{\v{r}} - \DeclareUnicodeCharacter{015A}{\'S} - \DeclareUnicodeCharacter{015B}{\'s} - \DeclareUnicodeCharacter{015C}{\^S} - \DeclareUnicodeCharacter{015D}{\^s} - \DeclareUnicodeCharacter{015E}{\cedilla{S}} - \DeclareUnicodeCharacter{015F}{\cedilla{s}} - - \DeclareUnicodeCharacter{0160}{\v{S}} - \DeclareUnicodeCharacter{0161}{\v{s}} - \DeclareUnicodeCharacter{0162}{\cedilla{t}} - \DeclareUnicodeCharacter{0163}{\cedilla{T}} - \DeclareUnicodeCharacter{0164}{\v{T}} - - \DeclareUnicodeCharacter{0168}{\~U} - \DeclareUnicodeCharacter{0169}{\~u} - \DeclareUnicodeCharacter{016A}{\=U} - \DeclareUnicodeCharacter{016B}{\=u} - \DeclareUnicodeCharacter{016C}{\u{U}} - \DeclareUnicodeCharacter{016D}{\u{u}} - \DeclareUnicodeCharacter{016E}{\ringaccent{U}} - \DeclareUnicodeCharacter{016F}{\ringaccent{u}} - - \DeclareUnicodeCharacter{0170}{\H{U}} - \DeclareUnicodeCharacter{0171}{\H{u}} - \DeclareUnicodeCharacter{0174}{\^W} - \DeclareUnicodeCharacter{0175}{\^w} - \DeclareUnicodeCharacter{0176}{\^Y} - \DeclareUnicodeCharacter{0177}{\^y} - \DeclareUnicodeCharacter{0178}{\"Y} - \DeclareUnicodeCharacter{0179}{\'Z} - \DeclareUnicodeCharacter{017A}{\'z} - \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} - \DeclareUnicodeCharacter{017C}{\dotaccent{z}} - \DeclareUnicodeCharacter{017D}{\v{Z}} - \DeclareUnicodeCharacter{017E}{\v{z}} - - \DeclareUnicodeCharacter{01C4}{D\v{Z}} - \DeclareUnicodeCharacter{01C5}{D\v{z}} - \DeclareUnicodeCharacter{01C6}{d\v{z}} - \DeclareUnicodeCharacter{01C7}{LJ} - \DeclareUnicodeCharacter{01C8}{Lj} - \DeclareUnicodeCharacter{01C9}{lj} - \DeclareUnicodeCharacter{01CA}{NJ} - \DeclareUnicodeCharacter{01CB}{Nj} - \DeclareUnicodeCharacter{01CC}{nj} - \DeclareUnicodeCharacter{01CD}{\v{A}} - \DeclareUnicodeCharacter{01CE}{\v{a}} - \DeclareUnicodeCharacter{01CF}{\v{I}} - - \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} - \DeclareUnicodeCharacter{01D1}{\v{O}} - \DeclareUnicodeCharacter{01D2}{\v{o}} - \DeclareUnicodeCharacter{01D3}{\v{U}} - \DeclareUnicodeCharacter{01D4}{\v{u}} - - \DeclareUnicodeCharacter{01E2}{\={\AE}} - \DeclareUnicodeCharacter{01E3}{\={\ae}} - \DeclareUnicodeCharacter{01E6}{\v{G}} - \DeclareUnicodeCharacter{01E7}{\v{g}} - \DeclareUnicodeCharacter{01E8}{\v{K}} - \DeclareUnicodeCharacter{01E9}{\v{k}} - - \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} - \DeclareUnicodeCharacter{01F1}{DZ} - \DeclareUnicodeCharacter{01F2}{Dz} - \DeclareUnicodeCharacter{01F3}{dz} - \DeclareUnicodeCharacter{01F4}{\'G} - \DeclareUnicodeCharacter{01F5}{\'g} - \DeclareUnicodeCharacter{01F8}{\`N} - \DeclareUnicodeCharacter{01F9}{\`n} - \DeclareUnicodeCharacter{01FC}{\'{\AE}} - \DeclareUnicodeCharacter{01FD}{\'{\ae}} - \DeclareUnicodeCharacter{01FE}{\'{\O}} - \DeclareUnicodeCharacter{01FF}{\'{\o}} - - \DeclareUnicodeCharacter{021E}{\v{H}} - \DeclareUnicodeCharacter{021F}{\v{h}} - - \DeclareUnicodeCharacter{0226}{\dotaccent{A}} - \DeclareUnicodeCharacter{0227}{\dotaccent{a}} - \DeclareUnicodeCharacter{0228}{\cedilla{E}} - \DeclareUnicodeCharacter{0229}{\cedilla{e}} - \DeclareUnicodeCharacter{022E}{\dotaccent{O}} - \DeclareUnicodeCharacter{022F}{\dotaccent{o}} - - \DeclareUnicodeCharacter{0232}{\=Y} - \DeclareUnicodeCharacter{0233}{\=y} - \DeclareUnicodeCharacter{0237}{\dotless{j}} - - \DeclareUnicodeCharacter{02DB}{\ogonek{ }} - - \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} - \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} - \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} - \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} - \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} - \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} - \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} - \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} - \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} - \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} - \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} - \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} - - \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} - \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} - - \DeclareUnicodeCharacter{1E20}{\=G} - \DeclareUnicodeCharacter{1E21}{\=g} - \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} - \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} - \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} - \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} - \DeclareUnicodeCharacter{1E26}{\"H} - \DeclareUnicodeCharacter{1E27}{\"h} - - \DeclareUnicodeCharacter{1E30}{\'K} - \DeclareUnicodeCharacter{1E31}{\'k} - \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} - \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} - \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} - \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} - \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} - \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} - \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} - \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} - \DeclareUnicodeCharacter{1E3E}{\'M} - \DeclareUnicodeCharacter{1E3F}{\'m} - - \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} - \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} - \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} - \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} - \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} - \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} - \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} - \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} - \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} - \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} - - \DeclareUnicodeCharacter{1E54}{\'P} - \DeclareUnicodeCharacter{1E55}{\'p} - \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} - \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} - \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} - \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} - \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} - \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} - \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} - \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} - - \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} - \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} - \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} - \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} - \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} - \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} - \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} - \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} - \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} - \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} - - \DeclareUnicodeCharacter{1E7C}{\~V} - \DeclareUnicodeCharacter{1E7D}{\~v} - \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} - \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} - - \DeclareUnicodeCharacter{1E80}{\`W} - \DeclareUnicodeCharacter{1E81}{\`w} - \DeclareUnicodeCharacter{1E82}{\'W} - \DeclareUnicodeCharacter{1E83}{\'w} - \DeclareUnicodeCharacter{1E84}{\"W} - \DeclareUnicodeCharacter{1E85}{\"w} - \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} - \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} - \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} - \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} - \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} - \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} - \DeclareUnicodeCharacter{1E8C}{\"X} - \DeclareUnicodeCharacter{1E8D}{\"x} - \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} - \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} - - \DeclareUnicodeCharacter{1E90}{\^Z} - \DeclareUnicodeCharacter{1E91}{\^z} - \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} - \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} - \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} - \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} - \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} - \DeclareUnicodeCharacter{1E97}{\"t} - \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} - \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} - - \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} - \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} - - \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} - \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} - \DeclareUnicodeCharacter{1EBC}{\~E} - \DeclareUnicodeCharacter{1EBD}{\~e} - - \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} - \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} - \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} - \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} - - \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} - \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} - - \DeclareUnicodeCharacter{1EF2}{\`Y} - \DeclareUnicodeCharacter{1EF3}{\`y} - \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} - - \DeclareUnicodeCharacter{1EF8}{\~Y} - \DeclareUnicodeCharacter{1EF9}{\~y} - - \DeclareUnicodeCharacter{2013}{--} - \DeclareUnicodeCharacter{2014}{---} - \DeclareUnicodeCharacter{2018}{\quoteleft} - \DeclareUnicodeCharacter{2019}{\quoteright} - \DeclareUnicodeCharacter{201A}{\quotesinglbase} - \DeclareUnicodeCharacter{201C}{\quotedblleft} - \DeclareUnicodeCharacter{201D}{\quotedblright} - \DeclareUnicodeCharacter{201E}{\quotedblbase} - \DeclareUnicodeCharacter{2022}{\bullet} - \DeclareUnicodeCharacter{2026}{\dots} - \DeclareUnicodeCharacter{2039}{\guilsinglleft} - \DeclareUnicodeCharacter{203A}{\guilsinglright} - \DeclareUnicodeCharacter{20AC}{\euro} - - \DeclareUnicodeCharacter{2192}{\expansion} - \DeclareUnicodeCharacter{21D2}{\result} - - \DeclareUnicodeCharacter{2212}{\minus} - \DeclareUnicodeCharacter{2217}{\point} - \DeclareUnicodeCharacter{2261}{\equiv} -}% end of \utfeightchardefs + \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii + \unicodechardefs +} + +% Whether the active definitions of non-ASCII characters expand to +% non-active tokens with the same character code. This is used to +% write characters literally, instead of using active definitions for +% printing the correct glyphs. +\newif\ifpassthroughchars +\passthroughcharsfalse + +% For native Unicode (XeTeX and LuaTeX) +% Definition macro to replace / pass-through the Unicode character +% +\def\DeclareUnicodeCharacterNative#1#2{% + \catcode"#1=\active + \def\dodeclareunicodecharacternative##1##2##3{% + \begingroup + \uccode`\~="##2\relax + \uppercase{\gdef~}{% + \ifpassthroughchars + ##1% + \else + ##3% + \fi + } + \endgroup + } + \begingroup + \uccode`\.="#1\relax + \uppercase{\def\UTFNativeTmp{.}}% + \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}% + \endgroup +} + +% Native Unicode (XeTeX and LuaTeX) character replacing definitions +% It makes the setting that replace the Unicode characters. +\def\nativeunicodechardefs{% + \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative + \unicodechardefs +} + +% For native Unicode (XeTeX and LuaTeX). Make the character token expand +% to the sequences given in \unicodechardefs for printing. +\def\DeclareUnicodeCharacterNativeAtU#1#2{% + \def\UTFAtUTmp{#2} + \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp +} +% Native Unicode (XeTeX and LuaTeX) @U command definitions +\def\nativeunicodechardefsatu{% + \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU + \unicodechardefs +} % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } +% define all the unicode characters we know about, for the sake of @U. +\iftxinativeunicodecapable + \nativeunicodechardefsatu +\else + \utfeightchardefs +\fi + + % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. @@ -9682,12 +11170,12 @@ directory should work if nowhere else does.} \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin - \pageheight = \vsize + \txipageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in - \pagewidth = \hsize + \txipagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax @@ -9699,6 +11187,13 @@ directory should work if nowhere else does.} % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in + \else + \ifx\XeTeXrevision\thisisundefined + \else + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + % XeTeX does not have \pdfhorigin and \pdfvorigin. + \fi \fi % \setleading{\textleading} @@ -9886,44 +11381,47 @@ directory should work if nowhere else does.} % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} -% Turn off all special characters except @ -% (and those which the user can use as if they were ordinary). +% Set catcodes for Texinfo file + +% Active characters for printing the wanted glyph. % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. - +% \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote -\catcode`\~=\active -\def~{{\tt\char126}} -\chardef\hat=`\^ -\catcode`\^=\active -\def^{{\tt \hat}} +\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde +\chardef\hatchar=`\^ +\catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} -\let\realunder=_ -% Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } +\let\realunder=_ + +\catcode`\|=\active \def|{{\tt\char124}} -\catcode`\|=\active -\def|{{\tt\char124}} \chardef \less=`\< -\catcode`\<=\active -\def<{{\tt \less}} +\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless \chardef \gtr=`\> -\catcode`\>=\active -\def>{{\tt \gtr}} -\catcode`\+=\active -\def+{{\tt \char 43}} -\catcode`\$=\active -\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix +\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr +\catcode`\+=\active \def+{{\tt \char 43}} +\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix +\catcode`\-=\active \let-=\normaldash -% If a .fmt file is being used, characters that might appear in a file -% name cannot be active until we have parsed the command line. -% So turn them off again, and have \everyjob (or @setfilename) turn them on. -% \otherifyactive is called near the end of this file. -\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +% used for headline/footline in the output routine, in case the page +% breaks in the middle of an @tex block. +\def\texinfochars{% + \let< = \activeless + \let> = \activegtr + \let~ = \activetilde + \let^ = \activehat + \markupsetuplqdefault \markupsetuprqdefault + \let\b = \strong + \let\i = \smartitalic + % in principle, all other definitions in \tex have to be undone too. +} % Used sometimes to turn off (effectively) the active characters even after % parsing them. @@ -9943,23 +11441,22 @@ directory should work if nowhere else does.} % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} -% In texinfo, backslash is an active character; it prints the backslash +% In Texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. -% The story here is that in math mode, the \char of \backslashcurfont -% ends up printing the roman \ from the math symbol font (because \char -% in math mode uses the \mathcode, and plain.tex sets -% \mathcode`\\="026E). It seems better for @backslashchar{} to always -% print a typewriter backslash, hence we use an explicit \mathchar, +% Print a typewriter backslash. For math mode, we can't simply use +% \backslashcurfont: the story here is that in math mode, the \char +% of \backslashcurfont ends up printing the roman \ from the math symbol +% font (because \char in math mode uses the \mathcode, and plain.tex +% sets \mathcode`\\="026E). Hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. -@def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} -@let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. -% On startup, @fixbackslash assigns: -% @let \ = @normalbackslash +@def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} +@let@backslashchar = @ttbackslash % @backslashchar{} is for user documents. + % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. We switch back and forth between these. @@ -9969,45 +11466,87 @@ directory should work if nowhere else does.} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % -@def@normalturnoffactive{% - @let"=@normaldoublequote - @let$=@normaldollar %$ font-lock fix - @let+=@normalplus - @let<=@normalless - @let>=@normalgreater - @let\=@normalbackslash - @let^=@normalcaret - @let_=@normalunderscore - @let|=@normalverticalbar - @let~=@normaltilde - @markupsetuplqdefault - @markupsetuprqdefault - @unsepspaces -} - -% Make _ and + \other characters, temporarily. -% This is canceled by @fixbackslash. -@otherifyactive +{@catcode`- = @active + @gdef@normalturnoffactive{% + @passthroughcharstrue + @let-=@normaldash + @let"=@normaldoublequote + @let$=@normaldollar %$ font-lock fix + @let+=@normalplus + @let<=@normalless + @let>=@normalgreater + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let~=@normaltilde + @let\=@ttbackslash + @markupsetuplqdefault + @markupsetuprqdefault + @unsepspaces + } +} + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have @fixbackslash turn them back on. +@catcode`+=@other @catcode`@_=@other +% \enablebackslashhack - allow file to begin `\input texinfo' +% % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. -% -@gdef@eatinput input texinfo{@fixbackslash} -@global@let\ = @eatinput +% If the file did not have a `\input texinfo', then it is turned off after +% the first line; otherwise the first `\' in the file would cause an error. +% This is used on the very last line of this file, texinfo.tex. +% We also use @c to call @fixbackslash, in case ends of lines are hidden. +{ +@catcode`@^=7 +@catcode`@^^M=13@gdef@enablebackslashhack{% + @global@let\ = @eatinput% + @catcode`@^^M=13% + @def@c{@fixbackslash@c}% + % Definition for the newline at the end of this file. + @def ^^M{@let^^M@secondlinenl}% + % Definition for a newline in the main Texinfo file. + @gdef @secondlinenl{@fixbackslash}% +}} + +{@catcode`@^=7 @catcode`@^^M=13% +@gdef@eatinput input texinfo#1^^M{@fixbackslash}} + +% Emergency active definition of newline, in case an active newline token +% appears by mistake. +{@catcode`@^=7 @catcode13=13% +@gdef@enableemergencynewline{% + @gdef^^M{% + @par% + %@par% +}}} + -% On the other hand, perhaps the file did not have a `\input texinfo'. Then -% the first `\' in the file would cause an error. This macro tries to fix -% that, assuming it is called before the first `\' could plausibly occur. -% Also turn back on active characters that might appear in the input -% file name, in case not using a pre-dumped format. -% @gdef@fixbackslash{% - @ifx\@eatinput @let\ = @normalbackslash @fi + @ifx\@eatinput @let\ = @ttbackslash @fi + @catcode13=5 % regular end of line + @enableemergencynewline + @let@c=@texinfoc + % Also turn back on active characters that might appear in the input + % file name, in case not using a pre-dumped format. @catcode`+=@active @catcode`@_=@active + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. This macro, @fixbackslash, gets + % called at the beginning of every Texinfo file. Not opening texinfo.cnf + % directly in this file, texinfo.tex, makes it possible to make a format + % file for Texinfo. + % + @openin 1 texinfo.cnf + @ifeof 1 @else @input texinfo.cnf @fi + @closein 1 } + % Say @foo, not \foo, in error messages. @escapechar = `@@ @@ -10035,7 +11574,16 @@ directory should work if nowhere else does.} @markupsetuprqdefault @c Local variables: -@c page-delimiter: "^\\\\message" +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message\\|emacs-page" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" @c End: @c vim:sw=2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore +@enablebackslashhack diff --git a/tex/txi-ca.tex b/tex/txi-ca.tex new file mode 100644 index 0000000000..675475da36 --- /dev/null +++ b/tex/txi-ca.tex @@ -0,0 +1,62 @@ +% txi-ca.tex -- Catalan translations for texinfo.tex. +% +% Copyright (C) 2015 Walter Garcia-Fontes +% +% This txi-ca.tex file is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 3 of the +% License, or (at your option) any later version. +% +% This txi-ca.tex file is distributed in the hope that it will be +% useful, but WITHOUT ANY WARRANTY; without even the implied warranty +% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see . +% +% Set up fixed words for Spanish. + +\txisetlanguage{catalan}{2}{2} + +\plainfrenchspacing + +\gdef\putwordAppendix{Annex} +\gdef\putwordChapter{Cap\'{\dotless{i}}tol} +\gdef\putwordfile{fitxer} +\gdef\putwordIndexIsEmpty{(L'\'Index \'es buit)} +\gdef\putwordIndexNonexistent{(No existeix l'\'Index)} +\gdef\putwordInfo{Info} +\gdef\putwordMethodon{M\`etode de} +\gdef\putwordNoTitle{Sense T\'{\dotless{i}}tol} +\gdef\putwordof{de} +\gdef\putwordon{de} +\gdef\putwordpage{p\`agina} +\gdef\putwordsection{secci\'o} +\gdef\putwordSection{Secci\'o} +\gdef\putwordsee{vegeu} +\gdef\putwordSee{Vegeu} +\gdef\putwordShortTOC{Resum del Contingut} +\gdef\putwordTOC{\'Index General} +% +\gdef\putwordMJan{gener} +\gdef\putwordMFeb{febrer} +\gdef\putwordMMar{març} +\gdef\putwordMApr{abril} +\gdef\putwordMMay{maig} +\gdef\putwordMJun{juny} +\gdef\putwordMJul{juliol} +\gdef\putwordMAug{agost} +\gdef\putwordMSep{setembre} +\gdef\putwordMOct{octubre} +\gdef\putwordMNov{novembre} +\gdef\putwordMDec{desembre} +% +\gdef\putwordDefmac{Macro} +\gdef\putwordDefspec{Forma Especial} +\gdef\putwordDefivar{Variable d'Inst\`ancia} +\gdef\putwordDefvar{Variable} +\gdef\putwordDefopt{Opci\'o d'Usuari} +\gdef\putwordDeffunc{Funci\'o} + +\endinput diff --git a/tex/txi-de.tex b/tex/txi-de.tex index 3745ebbe5b..bde98db4c5 100644 --- a/tex/txi-de.tex +++ b/tex/txi-de.tex @@ -1,4 +1,4 @@ -% $Id: txi-de.tex,v 1.9 2008/10/16 17:13:10 karl Exp $ +% $Id$ % txi-de.tex -- German translations for texinfo.tex. % % Copyright 1999, 2007, 2008 Free Software Foundation, Inc. diff --git a/tex/txi-en.tex b/tex/txi-en.tex index 6d556b1758..00dde4f8d9 100644 --- a/tex/txi-en.tex +++ b/tex/txi-en.tex @@ -1,4 +1,4 @@ -% $Id: txi-en.tex,v 1.7 2008/10/16 17:13:10 karl Exp $ +% $Id$ % txi.en.tex -- English non-translations for texinfo.tex. This is read % when a source document says @documentlanguage en (which might happen % after another @documentlanguage). The actual values are the same as @@ -25,6 +25,7 @@ \gdef\putwordAppendix{Appendix} \gdef\putwordChapter{Chapter} +\gdef\putworderror{error} \gdef\putwordfile{file} \gdef\putwordin{in} \gdef\putwordIndexIsEmpty{(Index is empty)} diff --git a/tex/txi-es.tex b/tex/txi-es.tex index ace59e345d..44bda35980 100644 --- a/tex/txi-es.tex +++ b/tex/txi-es.tex @@ -1,7 +1,7 @@ -% $Id: txi-es.tex,v 1.6 2008/10/16 17:13:10 karl Exp $ +% $Id$ % txi-es.tex -- Spanish translations for texinfo.tex. % -% Copyright (C) 1999, 2007, 2008 by Adrian Perez Jorge. +% Copyright 1999, 2007, 2008, 2015 by Adrian Perez Jorge. % % This txi-es.tex file is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License as @@ -28,6 +28,7 @@ \gdef\putwordIndexIsEmpty{(El \'Indice est\'a vac\'{\char16{}}o)} \gdef\putwordIndexNonexistent{(No existe el \'Indice)} \gdef\putwordInfo{Info} +\gdef\putwordin{en} \gdef\putwordMethodon{M\'etodo de} \gdef\putwordNoTitle{Sin T\'{\char{16}}tulo} \gdef\putwordof{de} diff --git a/tex/txi-fr.tex b/tex/txi-fr.tex index 4badeddcb8..6e8a6bacb3 100644 --- a/tex/txi-fr.tex +++ b/tex/txi-fr.tex @@ -1,4 +1,4 @@ -% $Id: txi-fr.tex,v 1.8 2008/10/21 23:51:37 karl Exp $ +% $Id$ % txi-fr.tex -- French translations for texinfo.tex. % % Copyright (C) 1999, 2007, 2008 Free Software Foundation. diff --git a/tex/txi-hu.tex b/tex/txi-hu.tex index bf5f05929a..0722595b78 100644 --- a/tex/txi-hu.tex +++ b/tex/txi-hu.tex @@ -1,3 +1,6 @@ +% $Id$ +% txi-hu.tex -- Hungarian translations for texinfo.tex. +% % Copyright 1999, 2007, 2008 Free Software Foundation, Inc. % % This program is free software; you can redistribute it and/or modify diff --git a/tex/txi-it.tex b/tex/txi-it.tex index 06f4f1d6b4..ae2fed409e 100644 --- a/tex/txi-it.tex +++ b/tex/txi-it.tex @@ -1,4 +1,4 @@ -% $Id: txi-it.tex,v 1.7 2008/10/16 17:13:10 karl Exp $ +% $Id$ % txi-it.tex -- Italian translations for texinfo.tex % % Copyright 1999, 2007, 2008 Free Software Foundation. diff --git a/tex/txi-nl.tex b/tex/txi-nl.tex index e5263e18f1..a60edf4b55 100644 --- a/tex/txi-nl.tex +++ b/tex/txi-nl.tex @@ -1,4 +1,4 @@ -% $Id: txi-nl.tex,v 1.7 2008/10/16 17:13:10 karl Exp $ +% $Id$ % txi-nl.tex -- Dutch translations for texinfo.tex. % % Copyright 1999, 2007, 2008 Free Software Foundation. diff --git a/vim/lilypond-ftplugin.vim b/vim/lilypond-ftplugin.vim index 015028fc9b..0c3a8dc7e2 100644 --- a/vim/lilypond-ftplugin.vim +++ b/vim/lilypond-ftplugin.vim @@ -1,7 +1,5 @@ " LilyPond filetype plugin " Language: LilyPond (ft=ly) -" Maintainer: Heikki Junes -" Last Change: 2010 Jul 26 " " Installed As: vim/ftplugin/lilypond.vim " Uses Generated File: vim/syntax/lilypond-words.vim @@ -20,13 +18,13 @@ setlocal shiftwidth=2 " some handy key mappings " " save & make and play midi with timidity -map :w:se makeprg=lilypond\ \"%<\":make:!timidity "%<.midi" +map :w:setl makeprg=lilypond\ \"%<\":make:!timidity "%<.midi" " " save & make -map :w:se makeprg=lilypond\ \"%<\":make +map :w:setl makeprg=lilypond\ \"%<\":make " -" view ps with ghostview -map :!gv --watch "%<.ps" & +" view pdf with ghostview +map :!gv --watch "%<.pdf" & " " prev error map :cp @@ -35,7 +33,7 @@ map :cp map :cn " " make -map :w:se makeprg=make\ -k:make +map :w:setl makeprg=make\ -k:make " " menu source $VIMRUNTIME/menu.vim -- 2.39.5
  • Main
  • + + \IMAGE-FILE\ + +

    + (cliqueu per veure una imatge més gran) +

    +